From 5915d0b30c70b7db7fcbfc62378730cb87829021 Mon Sep 17 00:00:00 2001 From: baigner <benedikt.aigner@rwth-aachen.de> Date: Fri, 26 Oct 2018 16:07:59 +0200 Subject: [PATCH] VISTOMS polishing part 1: Changed layout of the main page. Former-commit-id: 62ef062ecdc0dda29a53fde761fefbfe05f775ea --- kadmos/vistoms/VISTOMS_test.html | 175 + .../static/lib/bootstrap/bootstrap.css | 7 + .../vistoms/static/lib/bootstrap/bootstrap.js | 7 + .../vistoms/static/lib/bootstrap/jquery-3.js | 4 + .../static/lib/bootstrap/jumbotron.css | 4 + kadmos/vistoms/static/lib/bootstrap/popper.js | 5 + kadmos/vistoms/static/pictures/AGILE_Logo.png | Bin 14199 -> 121497 bytes .../static/pictures/AGILE_Logo_large.png | Bin 0 -> 72406 bytes .../vistoms/static/pictures/CMDOWS_logo.png | Bin 0 -> 32872 bytes .../vistoms/static/pictures/KADMOS_logo.pdf | Bin 0 -> 64373 bytes .../vistoms/static/pictures/KADMOS_logo.png | Bin 0 -> 5496 bytes kadmos/vistoms/templates/VISTOMS - Kopie.html | 29422 ++++++++++++++++ kadmos/vistoms/templates/VISTOMS.html | 1164 +- kadmos/vistoms/vistoms.py | 4 +- 14 files changed, 30142 insertions(+), 650 deletions(-) create mode 100644 kadmos/vistoms/VISTOMS_test.html create mode 100644 kadmos/vistoms/static/lib/bootstrap/bootstrap.css create mode 100644 kadmos/vistoms/static/lib/bootstrap/bootstrap.js create mode 100644 kadmos/vistoms/static/lib/bootstrap/jquery-3.js create mode 100644 kadmos/vistoms/static/lib/bootstrap/jumbotron.css create mode 100644 kadmos/vistoms/static/lib/bootstrap/popper.js create mode 100644 kadmos/vistoms/static/pictures/AGILE_Logo_large.png create mode 100644 kadmos/vistoms/static/pictures/CMDOWS_logo.png create mode 100644 kadmos/vistoms/static/pictures/KADMOS_logo.pdf create mode 100644 kadmos/vistoms/static/pictures/KADMOS_logo.png create mode 100644 kadmos/vistoms/templates/VISTOMS - Kopie.html diff --git a/kadmos/vistoms/VISTOMS_test.html b/kadmos/vistoms/VISTOMS_test.html new file mode 100644 index 000000000..8e36b1213 --- /dev/null +++ b/kadmos/vistoms/VISTOMS_test.html @@ -0,0 +1,175 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<meta name="apple-mobile-web-app-capable" content="yes"> +<meta name="apple-mobile-web-app-status-bar-style" content="default"> +<head"> + <meta charset="utf-8"> + <title>MDO System Interface</title> + <!--Include this css file in the <head> tag --> + <link rel="stylesheet" href="static/lib/bootstrap/bootstrap.css" rel="stylesheet"> + <link rel="stylesheet" href="static/lib/bootstrap/jumbotron.css" rel="stylesheet"> + <link rel="stylesheet" href="static/lib/jquery/jquery-ui.min.css"/> + <link rel="stylesheet" href="static/lib/bootstrap/bootstrap.min.css"/> + <link rel="stylesheet" href="static/lib/lobipanel/github.css"/> + <link rel="stylesheet" href="static/lib/lobipanel/lobipanel.min.css"/> + <link rel="stylesheet" href="static/lib/vistoms.css"/> +</head> + +<body> + <nav style="position:fixed" class="navbar navbar-expand-md navbar-dark fixed-top bg-dark"> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarsExampleDefault"> + <ul class="navbar-nav mr-auto"> + <li style="margin-left:10pt" class="nav-item"> + <a class="nav-link" href="VISTOMS_test.html"><img title="Main page" src="static/pictures/Home.png" width="25" height="25"></img> </a> + </li> + <li style="margin-left:10pt" class="nav-item"> + <a class="nav-link" target="_blank" href="http://www.agile-project.eu/files/VISTOMS_Tutorial.mp4"><img title="Tutorial" src="static/pictures/Tutorial.png" width="35" height="25"></img></a> + + </li> + <li style="margin-left:10pt" class="nav-item"> + <a class="nav-link" href="mailto:support@agile-project.eu"><img title="Contact support team" src="static/pictures/Contact.png" width="40" height="25"></img> </a> + </li> + <li style="margin-left:10pt" class="nav-item"> + <a class="nav-link" href="#"><img title="Acknowledgements" src="static/pictures/Acknowledgements.png" width="25" height="25"></img> </a> + </li> + </ul> + <div style="float: none;text-align: center;" class="navbar-header"> + <img style="margin-bottom:10pt" src="static/pictures/AGILE_Icon.png" width="40" height="40"></img> + <a style="color: white;font-size:24pt; float:none" class="navbar-brand">MDO System Interface</a> + </div> + </div> + </nav> + + <main style="" id="main" role="main"> + <!-- Main jumbotron for a primary marketing message or call to action --> + <div style="margin-top:10pt; " class="jumbotron"> + <div class="container"> + <h1 class="display-3">Welcome to the MDO System Interface!</h1> + <p></p> + <p>This package was created within the context of the European Horizon 2020 project <a href="http://www.agile-project.eu/" target="_blank"><img src="static/pictures/AGILE_Logo_large.png" width="100" height="20"></img></a> . To find out more about the project, please click on the AGILE logo.</p> + </br></br></br> + <p>To set up, modify, or inspect an already existing MDO system, go to one of the visualization types below (XDSM, Edge Bundles, Sankey Diagram). Then select a graph from the dropdown menu.</p> + <section style="margin:0pt" class="container"> + <div style="margin:5pt; margin-left:0pt; float:left" class="dropdown"> + <button style="font-size:18pt" class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenuButton1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + XDSM + </button> + <div style="font-size:14pt" class="dropdown-menu" aria-labelledby="dropdownMenuButton1"> + <a class="dropdown-item" href="#">fff</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </div> + <div style="margin:5pt; margin-left:0pt; float:left" class="dropdown"> + <button style="font-size:18pt" class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenuButton1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Edge Bundles + </button> + <div style="font-size:14pt" class="dropdown-menu" aria-labelledby="dropdownMenuButton1"> + <a class="dropdown-item" href="#">asdasd</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </div> + <div style="margin:5pt; margin-left:0pt; float:left" class="dropdown"> + <button style="font-size:18pt" class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenuButton1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Sankey Diagram + </button> + <div style="font-size:14pt" class="dropdown-menu" aria-labelledby="dropdownMenuButton1"> + <a class="dropdown-item" href="#">asddddadasdeeeasd</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </div> + </section> + </br></br></br> + <p>If you haven't set up a system yet, use the "Add graph" option to upload an MDO system file, or start a new system from scratch.</p> + <section class="container"> + <div style="margin:5pt; margin-left:0pt; float:left" class="dropdown"> + <button style="font-size:18pt" class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Add graph + </button> + <div style="font-size:14pt" class="dropdown-menu" aria-labelledby="dropdownMenuButton1"> + <a class="dropdown-item" href="#">Create graph from scratch</a> + <a class="dropdown-item" href="#">Upload KDMS file(s)</a> + <a class="dropdown-item" href="#">Upload CMDOWS file</a> + <a class="dropdown-item" href="#">Upload databae (zip-file)</a> + </div> + </div> + <div style="margin:5pt; margin-left:0pt; float:left; visibility:hidden" class="dropdown"> + <button style="font-size:18pt" class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Save all graphs + </button> + <div style="font-size:14pt" class="dropdown-menu" aria-labelledby="dropdownMenuButton1"> + <a class="dropdown-item" href="#">In the MDO System Interface</a> + <a class="dropdown-item" href="#">As KDMS files for download</a> + <a class="dropdown-item" href="#">As CMDOWS files for download</a> + </div> + </div> + </section> + </br></br></br> + </div> + </div> + <div style="" id="technlogies" class="container"> + <h1 style="font-size:24pt">The MDO System Interface is powered by the following technologies</h1> + <!-- Example row of columns --> + <div style="margin-top:20pt" class="row"> + <div class="col-md-4"> + <h2 style="font-size:20pt"><img src="static/pictures/KADMOS_Logo.png" width="150" height="40"></img></h2> + <p style="font-size:12pt"><b>K</b>nowledge- and graph-based <b>A</b>gile <b>D</b>esign with <b>M</b>ultidisciplinary <b>O</b>ptimization <b>S</b>ystem</p> + <p style="font-size:10pt">KADMOS is the python-based engine running under the hood of the MDO System Interface. To get more information on it's capabilities, go to the open-source KADMOS repository.</p> + <p style="margin-bottom:10pt"><button style="font-size:12pt" class="btn btn-secondary" onclick="window.open('https://bitbucket.org/imcovangent/kadmos')">KADMOS repository »</button></p> + </div> + <div class="col-md-4"> + <h2 style="font-size:20pt"><img src="static/pictures/CMDOWS_Logo.png" width="40" height="%0"></img> CMDOWS</h2> + <p style="font-size:12pt"><b>C</b>ommon <b>MDO</b> <b>W</b>orkflow <b>S</b>chema</p> + <p style="font-size:10pt">CMDOWS is the XML-based storage system for MDO systems. It contains all the data of an MDO system including the tools, their interconnections, execution order, optimization strategy, etc. <br> To get more information, please go to the open-source CMDOWS repository.</p> + <p style="margin-bottom:10pt"><button style="font-size:12pt" class="btn btn-secondary" onclick="window.open('https://bitbucket.org/imcovangent/cmdows')">CMDOWS repository »</button></p> + </div> + <div class="col-md-4"> + <h2 style="font-size:20pt"><img src="static/pictures/VISTOMS_Label.png" width="150" height="45"></img></h2> + <p style="font-size:12pt"><b>VIS</b>ualization <b>TO</b>ol for <b>M</b>DO <b>S</b>ystems</p> + <p style="font-size:10pt">VISTOMS is the graphical user interface that allows you to easily set up, inspect and modify your MDO systems. If you need more information about how to use it, simply click on the tutorial button in the navigation bar, or just click on the button below.</p> + <p style="margin-bottom:10pt"><button style="font-size:12pt" class="btn btn-secondary" onclick="window.open('http://www.agile-project.eu/files/VISTOMS_Tutorial.mp4')">Tutorial »</button></p> + </div> + </div> + + + <hr> + + </div> <!-- /container --> + + </main> + + <footer style="" class="container"> + <p>© Benedikt Aigner (RWTH Aachen) & Imco van Gent (TU Delft) 2016-2018</p> + <p> + <a style="padding:5pt" href="https://www.rwth-aachen.de" target="_blank"><img title="RWTH Aachen Homepage" src="static/pictures/RWTH_Logo.png" width="150" height="40"></img></a> + <a style="padding:5pt" href="https://www.tudelft.nl/" target="_blank"><img title="TU Delft Homepage" src="static/pictures/TUDelft_Logo.png" width="100" height="40"></img></a> + </p> + </footer> + + <!-- Bootstrap core JavaScript + ================================================== --> + <!-- Placed at the end of the document so the pages load faster --> + <script src="static/lib/bootstrap/jquery-3.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> + <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery-slim.min.js"><\/script>')</script> + <script src="static/lib/bootstrap/popper.js"></script> + <script src="static/lib/bootstrap/bootstrap.js"></script> + <script src="static/lib/jquery/jquery.3.20.min.js"></script> + <script src="static/lib/jquery/jquery-ui.min.js"></script> + <script src="static/lib/jquery/jquery.ui.touch-punch.min.js"></script> + <script src="static/lib/bootstrap/bootstrap.min.js"></script> + <script src="static/lib/bootstrap/bootbox.min.js"></script> + <script src="static/lib/lobipanel/highlight.pack.js"></script> + <script src="static/lib/lobipanel/lobipanel.js"></script> + <script src="static/lib/vkbeautify/vkbeautify.js"></script> + <script src="static/lib/bowser/bowser.js"></script> + <script> + + </script> +</body> \ No newline at end of file diff --git a/kadmos/vistoms/static/lib/bootstrap/bootstrap.css b/kadmos/vistoms/static/lib/bootstrap/bootstrap.css new file mode 100644 index 000000000..6561b6f4c --- /dev/null +++ b/kadmos/vistoms/static/lib/bootstrap/bootstrap.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#6c757d!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/kadmos/vistoms/static/lib/bootstrap/bootstrap.js b/kadmos/vistoms/static/lib/bootstrap/bootstrap.js new file mode 100644 index 000000000..534d53343 --- /dev/null +++ b/kadmos/vistoms/static/lib/bootstrap/bootstrap.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,n){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function r(){return(r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}e=e&&e.hasOwnProperty("default")?e.default:e,n=n&&n.hasOwnProperty("default")?n.default:n;var o,a,l,h,c,u,f,d,_,g,p,m,v,E,T,y,C,I,A,b,D,S,w,N,O,k,P=function(t){var e=!1;function n(e){var n=this,s=!1;return t(this).one(i.TRANSITION_END,function(){s=!0}),setTimeout(function(){s||i.triggerTransitionEnd(n)},e),this}var i={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},getSelectorFromElement:function(e){var n,i=e.getAttribute("data-target");i&&"#"!==i||(i=e.getAttribute("href")||""),"#"===i.charAt(0)&&(n=i,i=n="function"==typeof t.escapeSelector?t.escapeSelector(n).substr(1):n.replace(/(:|\.|\[|\]|,|=|@)/g,"\\$1"));try{return t(document).find(i).length>0?i:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method named "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s<i.length;s++){var r=i[s],o=P.getSelectorFromElement(r);null!==o&&t(o).filter(e).length>0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s<this._triggerArray.length;s++){var r=this._triggerArray[s],o=P.getSelectorFromElement(r);if(null!==o)t(o).hasClass(c)||t(r).addClass(d).attr("aria-expanded",!1)}this.setTransitioning(!0);var a=function(){e.setTransitioning(!1),t(e._element).removeClass(f).addClass(u).trigger(h.HIDDEN)};this._element.style[i]="",P.supportsTransitionEnd()?t(this._element).one(P.TRANSITION_END,a).emulateTransitionEnd(600):a()}}},o.setTransitioning=function(t){this._isTransitioning=t},o.dispose=function(){t.removeData(this._element,n),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},o._getConfig=function(t){return(t=r({},a,t)).toggle=Boolean(t.toggle),P.typeCheckConfig(e,t,l),t},o._getDimension=function(){return t(this._element).hasClass(_)?_:g},o._getParent=function(){var e=this,n=null;P.isElement(this._config.parent)?(n=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(n=this._config.parent[0])):n=t(this._config.parent)[0];var s='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(s).each(function(t,n){e._addAriaAndCollapsedClass(i._getTargetFromElement(n),[n])}),n},o._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(c);n.length>0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s<n.length;s++){var r=a._getParentFromElement(n[s]),o=t(n[s]).data(i),l={relatedTarget:n[s]};if(o){var h=o._menu;if(t(r).hasClass(f)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&t.contains(r,e.target))){var u=t.Event(c.HIDE,l);t(r).trigger(u),u.isDefaultPrevented()||("ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),n[s].setAttribute("aria-expanded","false"),t(h).removeClass(f),t(r).removeClass(f).trigger(t.Event(c.HIDDEN,l)))}}}},a._getParentFromElement=function(e){var n,i=P.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},a._dataApiKeydownHandler=function(e){if((/input|textarea/i.test(e.target.tagName)?!(32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||t(e.target).closest(y).length)):h.test(e.which))&&(e.preventDefault(),e.stopPropagation(),!this.disabled&&!t(this).hasClass(u))){var n=a._getParentFromElement(this),i=t(n).hasClass(f);if((i||27===e.which&&32===e.which)&&(!i||27!==e.which&&32!==e.which)){var s=t(n).find(I).get();if(0!==s.length){var r=s.indexOf(e.target);38===e.which&&r>0&&r--,40===e.which&&r<s.length-1&&r++,r<0&&(r=0),s[r].focus()}}else{if(27===e.which){var o=t(n).find(E)[0];t(o).trigger("focus")}t(this).trigger("click")}}},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return O}},{key:"DefaultType",get:function(){return k}}]),a}();return t(document).on(c.KEYDOWN_DATA_API,E,L._dataApiKeydownHandler).on(c.KEYDOWN_DATA_API,y,L._dataApiKeydownHandler).on(c.CLICK_DATA_API+" "+c.KEYUP_DATA_API,L._clearMenus).on(c.CLICK_DATA_API,E,function(e){e.preventDefault(),e.stopPropagation(),L._jQueryInterface.call(t(this),"toggle")}).on(c.CLICK_DATA_API,T,function(t){t.stopPropagation()}),t.fn[e]=L._jQueryInterface,t.fn[e].Constructor=L,t.fn[e].noConflict=function(){return t.fn[e]=l,L._jQueryInterface},L}(e),M=function(t){var e="modal",n="bs.modal",i="."+n,o=t.fn.modal,a={backdrop:!0,keyboard:!0,focus:!0,show:!0},l={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},h={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,FOCUSIN:"focusin"+i,RESIZE:"resize"+i,CLICK_DISMISS:"click.dismiss"+i,KEYDOWN_DISMISS:"keydown.dismiss"+i,MOUSEUP_DISMISS:"mouseup.dismiss"+i,MOUSEDOWN_DISMISS:"mousedown.dismiss"+i,CLICK_DATA_API:"click"+i+".data-api"},c="modal-scrollbar-measure",u="modal-backdrop",f="modal-open",d="fade",_="show",g={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",STICKY_CONTENT:".sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},p=function(){function o(e,n){this._config=this._getConfig(n),this._element=e,this._dialog=t(e).find(g.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}var p=o.prototype;return p.toggle=function(t){return this._isShown?this.hide():this.show(t)},p.show=function(e){var n=this;if(!this._isTransitioning&&!this._isShown){P.supportsTransitionEnd()&&t(this._element).hasClass(d)&&(this._isTransitioning=!0);var i=t.Event(h.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),t(document.body).addClass(f),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(h.CLICK_DISMISS,g.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(h.MOUSEDOWN_DISMISS,function(){t(n._element).one(h.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))}},p.hide=function(e){var n=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var i=t.Event(h.HIDE);if(t(this._element).trigger(i),this._isShown&&!i.isDefaultPrevented()){this._isShown=!1;var s=P.supportsTransitionEnd()&&t(this._element).hasClass(d);s&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),t(document).off(h.FOCUSIN),t(this._element).removeClass(_),t(this._element).off(h.CLICK_DISMISS),t(this._dialog).off(h.MOUSEDOWN_DISMISS),s?t(this._element).one(P.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(300):this._hideModal()}}},p.dispose=function(){t.removeData(this._element,n),t(window,document,this._element,this._backdrop).off(i),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},p.handleUpdate=function(){this._adjustDialog()},p._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},p._showElement=function(e){var n=this,i=P.supportsTransitionEnd()&&t(this._element).hasClass(d);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&P.reflow(this._element),t(this._element).addClass(_),this._config.focus&&this._enforceFocus();var s=t.Event(h.SHOWN,{relatedTarget:e}),r=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(s)};i?t(this._dialog).one(P.TRANSITION_END,r).emulateTransitionEnd(300):r()},p._enforceFocus=function(){var e=this;t(document).off(h.FOCUSIN).on(h.FOCUSIN,function(n){document!==n.target&&e._element!==n.target&&0===t(e._element).has(n.target).length&&e._element.focus()})},p._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(h.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||t(this._element).off(h.KEYDOWN_DISMISS)},p._setResizeEvent=function(){var e=this;this._isShown?t(window).on(h.RESIZE,function(t){return e.handleUpdate(t)}):t(window).off(h.RESIZE)},p._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(f),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(h.HIDDEN)})},p._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},p._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(d)?d:"";if(this._isShown&&this._config.backdrop){var s=P.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=u,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(h.CLICK_DISMISS,function(t){n._ignoreBackdropClick?n._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide())}),s&&P.reflow(this._backdrop),t(this._backdrop).addClass(_),!e)return;if(!s)return void e();t(this._backdrop).one(P.TRANSITION_END,e).emulateTransitionEnd(150)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(_);var r=function(){n._removeBackdrop(),e&&e()};P.supportsTransitionEnd()&&t(this._element).hasClass(d)?t(this._backdrop).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r()}else e&&e()},p._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},p._setScrollbar=function(){var e=this;if(this._isBodyOverflowing){t(g.FIXED_CONTENT).each(function(n,i){var s=t(i)[0].style.paddingRight,r=t(i).css("padding-right");t(i).data("padding-right",s).css("padding-right",parseFloat(r)+e._scrollbarWidth+"px")}),t(g.STICKY_CONTENT).each(function(n,i){var s=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",s).css("margin-right",parseFloat(r)-e._scrollbarWidth+"px")}),t(g.NAVBAR_TOGGLER).each(function(n,i){var s=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",s).css("margin-right",parseFloat(r)+e._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=t("body").css("padding-right");t("body").data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},p._resetScrollbar=function(){t(g.FIXED_CONTENT).each(function(e,n){var i=t(n).data("padding-right");"undefined"!=typeof i&&t(n).css("padding-right",i).removeData("padding-right")}),t(g.STICKY_CONTENT+", "+g.NAVBAR_TOGGLER).each(function(e,n){var i=t(n).data("margin-right");"undefined"!=typeof i&&t(n).css("margin-right",i).removeData("margin-right")});var e=t("body").data("padding-right");"undefined"!=typeof e&&t("body").css("padding-right",e).removeData("padding-right")},p._getScrollbarWidth=function(){var t=document.createElement("div");t.className=c,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(e,i){return this.each(function(){var s=t(this).data(n),a=r({},o.Default,t(this).data(),"object"==typeof e&&e);if(s||(s=new o(this,a),t(this).data(n,s)),"string"==typeof e){if("undefined"==typeof s[e])throw new TypeError('No method named "'+e+'"');s[e](i)}else a.show&&s.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(h.CLICK_DATA_API,g.DATA_TOGGLE,function(e){var i,s=this,o=P.getSelectorFromElement(this);o&&(i=t(o)[0]);var a=t(i).data(n)?"toggle":r({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var l=t(i).one(h.SHOW,function(e){e.isDefaultPrevented()||l.one(h.HIDDEN,function(){t(s).is(":visible")&&s.focus()})});p._jQueryInterface.call(t(i),a,this)}),t.fn.modal=p._jQueryInterface,t.fn.modal.Constructor=p,t.fn.modal.noConflict=function(){return t.fn.modal=o,p._jQueryInterface},p}(e),U=function(t){var e="tooltip",i="bs.tooltip",o="."+i,a=t.fn[e],l=new RegExp("(^|\\s)bs-tooltip\\S+","g"),h={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"},c={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},u={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t<this._offsets[s+1])&&this._activate(this._targets[s])}}},g._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var i=t(n.join(","));i.hasClass(c)?(i.closest(f.DROPDOWN).find(f.DROPDOWN_TOGGLE).addClass(u),i.addClass(u)):(i.addClass(u),i.parents(f.NAV_LIST_GROUP).prev(f.NAV_LINKS+", "+f.LIST_ITEMS).addClass(u),i.parents(f.NAV_LIST_GROUP).prev(f.NAV_ITEMS).children(f.NAV_LINKS).addClass(u)),t(this._scrollElement).trigger(h.ACTIVATE,{relatedTarget:e})},g._clear=function(){t(this._selector).filter(f.ACTIVE).removeClass(u)},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n);if(i||(i=new o(this,"object"==typeof e&&e),t(this).data(n,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(window).on(h.LOAD_DATA_API,function(){for(var e=t.makeArray(t(f.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);g._jQueryInterface.call(i,i.data())}}),t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),V=function(t){var e="bs.tab",n="."+e,i=t.fn.tab,r={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,CLICK_DATA_API:"click.bs.tab.data-api"},o="dropdown-menu",a="active",l="disabled",h="fade",c="show",u=".dropdown",f=".nav, .list-group",d=".active",_="> li > .active",g='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',p=".dropdown-toggle",m="> .dropdown-menu .active",v=function(){function n(t){this._element=t}var i=n.prototype;return i.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(a)||t(this._element).hasClass(l))){var n,i,s=t(this._element).closest(f)[0],o=P.getSelectorFromElement(this._element);if(s){var h="UL"===s.nodeName?_:d;i=(i=t.makeArray(t(s).find(h)))[i.length-1]}var c=t.Event(r.HIDE,{relatedTarget:this._element}),u=t.Event(r.SHOW,{relatedTarget:i});if(i&&t(i).trigger(c),t(this._element).trigger(u),!u.isDefaultPrevented()&&!c.isDefaultPrevented()){o&&(n=t(o)[0]),this._activate(this._element,s);var g=function(){var n=t.Event(r.HIDDEN,{relatedTarget:e._element}),s=t.Event(r.SHOWN,{relatedTarget:i});t(i).trigger(n),t(e._element).trigger(s)};n?this._activate(n,n.parentNode,g):g()}}},i.dispose=function(){t.removeData(this._element,e),this._element=null},i._activate=function(e,n,i){var s=this,r=("UL"===n.nodeName?t(n).find(_):t(n).children(d))[0],o=i&&P.supportsTransitionEnd()&&r&&t(r).hasClass(h),a=function(){return s._transitionComplete(e,r,i)};r&&o?t(r).one(P.TRANSITION_END,a).emulateTransitionEnd(150):a()},i._transitionComplete=function(e,n,i){if(n){t(n).removeClass(c+" "+a);var s=t(n.parentNode).find(m)[0];s&&t(s).removeClass(a),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(t(e).addClass(a),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),P.reflow(e),t(e).addClass(c),e.parentNode&&t(e.parentNode).hasClass(o)){var r=t(e).closest(u)[0];r&&t(r).find(p).addClass(a),e.setAttribute("aria-expanded",!0)}i&&i()},n._jQueryInterface=function(i){return this.each(function(){var s=t(this),r=s.data(e);if(r||(r=new n(this),s.data(e,r)),"string"==typeof i){if("undefined"==typeof r[i])throw new TypeError('No method named "'+i+'"');r[i]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),n}();return t(document).on(r.CLICK_DATA_API,g,function(e){e.preventDefault(),v._jQueryInterface.call(t(this),"show")}),t.fn.tab=v._jQueryInterface,t.fn.tab.Constructor=v,t.fn.tab.noConflict=function(){return t.fn.tab=i,v._jQueryInterface},v}(e);!function(t){if("undefined"==typeof t)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/kadmos/vistoms/static/lib/bootstrap/jquery-3.js b/kadmos/vistoms/static/lib/bootstrap/jquery-3.js new file mode 100644 index 000000000..105d00e61 --- /dev/null +++ b/kadmos/vistoms/static/lib/bootstrap/jquery-3.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a); +}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},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":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var _a,ab=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?_a:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),_a={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ab[b]||r.find.attr;ab[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ab[g],ab[g]=e,e=null!=c(a,b,d)?g:null,ab[g]=f),e}});var bb=/^(?:input|select|textarea|button)$/i,cb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function db(a){var b=a.match(L)||[];return b.join(" ")}function eb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,eb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,eb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,eb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=eb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+db(eb(c))+" ").indexOf(b)>-1)return!0;return!1}});var fb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(fb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:db(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var gb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!gb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,gb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var hb=/\[\]$/,ib=/\r?\n/g,jb=/^(?:submit|button|image|reset|file)$/i,kb=/^(?:input|select|textarea|keygen)/i;function lb(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||hb.test(a)?d(a,e):lb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d); +});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)lb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)lb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&kb.test(this.nodeName)&&!jb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ib,"\r\n")}}):{name:b.name,value:c.replace(ib,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var mb=a.jQuery,nb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=nb),b&&a.jQuery===r&&(a.jQuery=mb),r},b||(a.jQuery=a.$=r),r}); diff --git a/kadmos/vistoms/static/lib/bootstrap/jumbotron.css b/kadmos/vistoms/static/lib/bootstrap/jumbotron.css new file mode 100644 index 000000000..d751264ef --- /dev/null +++ b/kadmos/vistoms/static/lib/bootstrap/jumbotron.css @@ -0,0 +1,4 @@ +/* Move down content because we have a fixed navbar that is 3.5rem tall */ +body { + padding-top: 3.5rem; +} diff --git a/kadmos/vistoms/static/lib/bootstrap/popper.js b/kadmos/vistoms/static/lib/bootstrap/popper.js new file mode 100644 index 000000000..0f20d2a89 --- /dev/null +++ b/kadmos/vistoms/static/lib/bootstrap/popper.js @@ -0,0 +1,5 @@ +/* + Copyright (C) Federico Zivolo 2017 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:e?e.ownerDocument.documentElement:document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var l=a.commonAncestorContainer;if(e!==l&&t!==l||i.contains(n))return p(l)?l:r(l);var f=s(e);return f.host?d(f.host,t):d(e,s(t).host)}function a(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:'top',o='top'===t?'scrollTop':'scrollLeft',i=e.nodeName;if('BODY'===i||'HTML'===i){var n=e.ownerDocument.documentElement,r=e.ownerDocument.scrollingElement||n;return r[o]}return e[o]}function l(e,t){var o=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=a(t,'top'),n=a(t,'left'),r=o?-1:1;return e.top+=i*r,e.bottom+=i*r,e.left+=n*r,e.right+=n*r,e}function f(e,t){var o='x'===t?'Left':'Top',i='Left'==o?'Right':'Bottom';return parseFloat(e['border'+o+'Width'],10)+parseFloat(e['border'+i+'Width'],10)}function m(e,t,o,i){return J(t['offset'+e],t['scroll'+e],o['client'+e],o['offset'+e],o['scroll'+e],ie()?o['offset'+e]+i['margin'+('Height'===e?'Top':'Left')]+i['margin'+('Height'===e?'Bottom':'Right')]:0)}function h(){var e=document.body,t=document.documentElement,o=ie()&&getComputedStyle(t);return{height:m('Height',e,t,o),width:m('Width',e,t,o)}}function c(e){return se({},e,{right:e.left+e.width,bottom:e.top+e.height})}function g(e){var o={};if(ie())try{o=e.getBoundingClientRect();var i=a(e,'top'),n=a(e,'left');o.top+=i,o.left+=n,o.bottom+=i,o.right+=n}catch(e){}else o=e.getBoundingClientRect();var r={left:o.left,top:o.top,width:o.right-o.left,height:o.bottom-o.top},p='HTML'===e.nodeName?h():{},s=p.width||e.clientWidth||r.right-r.left,d=p.height||e.clientHeight||r.bottom-r.top,l=e.offsetWidth-s,m=e.offsetHeight-d;if(l||m){var g=t(e);l-=f(g,'x'),m-=f(g,'y'),r.width-=l,r.height-=m}return c(r)}function u(e,o){var i=ie(),r='HTML'===o.nodeName,p=g(e),s=g(o),d=n(e),a=t(o),f=parseFloat(a.borderTopWidth,10),m=parseFloat(a.borderLeftWidth,10),h=c({top:p.top-s.top-f,left:p.left-s.left-m,width:p.width,height:p.height});if(h.marginTop=0,h.marginLeft=0,!i&&r){var u=parseFloat(a.marginTop,10),b=parseFloat(a.marginLeft,10);h.top-=f-u,h.bottom-=f-u,h.left-=m-b,h.right-=m-b,h.marginTop=u,h.marginLeft=b}return(i?o.contains(d):o===d&&'BODY'!==d.nodeName)&&(h=l(h,o)),h}function b(e){var t=e.ownerDocument.documentElement,o=u(e,t),i=J(t.clientWidth,window.innerWidth||0),n=J(t.clientHeight,window.innerHeight||0),r=a(t),p=a(t,'left'),s={top:r-o.top+o.marginTop,left:p-o.left+o.marginLeft,width:i,height:n};return c(s)}function w(e){var i=e.nodeName;return'BODY'===i||'HTML'===i?!1:'fixed'===t(e,'position')||w(o(e))}function y(e,t,i,r){var p={top:0,left:0},s=d(e,t);if('viewport'===r)p=b(s);else{var a;'scrollParent'===r?(a=n(o(t)),'BODY'===a.nodeName&&(a=e.ownerDocument.documentElement)):'window'===r?a=e.ownerDocument.documentElement:a=r;var l=u(a,s);if('HTML'===a.nodeName&&!w(s)){var f=h(),m=f.height,c=f.width;p.top+=l.top-l.marginTop,p.bottom=m+l.top,p.left+=l.left-l.marginLeft,p.right=c+l.left}else p=l}return p.left+=i,p.top+=i,p.right-=i,p.bottom-=i,p}function E(e){var t=e.width,o=e.height;return t*o}function v(e,t,o,i,n){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf('auto'))return e;var p=y(o,i,r,n),s={top:{width:p.width,height:t.top-p.top},right:{width:p.right-t.right,height:p.height},bottom:{width:p.width,height:p.bottom-t.bottom},left:{width:t.left-p.left,height:p.height}},d=Object.keys(s).map(function(e){return se({key:e},s[e],{area:E(s[e])})}).sort(function(e,t){return t.area-e.area}),a=d.filter(function(e){var t=e.width,i=e.height;return t>=o.clientWidth&&i>=o.clientHeight}),l=0<a.length?a[0].key:d[0].key,f=e.split('-')[1];return l+(f?'-'+f:'')}function O(e,t,o){var i=d(t,o);return u(o,i)}function L(e){var t=getComputedStyle(e),o=parseFloat(t.marginTop)+parseFloat(t.marginBottom),i=parseFloat(t.marginLeft)+parseFloat(t.marginRight),n={width:e.offsetWidth+i,height:e.offsetHeight+o};return n}function x(e){var t={left:'right',right:'left',bottom:'top',top:'bottom'};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function S(e,t,o){o=o.split('-')[0];var i=L(e),n={width:i.width,height:i.height},r=-1!==['right','left'].indexOf(o),p=r?'top':'left',s=r?'left':'top',d=r?'height':'width',a=r?'width':'height';return n[p]=t[p]+t[d]/2-i[d]/2,n[s]=o===s?t[s]-i[a]:t[x(s)],n}function T(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function D(e,t,o){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===o});var i=T(e,function(e){return e[t]===o});return e.indexOf(i)}function C(t,o,i){var n=void 0===i?t:t.slice(0,D(t,'name',i));return n.forEach(function(t){t['function']&&console.warn('`modifier.function` is deprecated, use `modifier.fn`!');var i=t['function']||t.fn;t.enabled&&e(i)&&(o.offsets.popper=c(o.offsets.popper),o.offsets.reference=c(o.offsets.reference),o=i(o,t))}),o}function N(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=O(this.state,this.popper,this.reference),e.placement=v(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.offsets.popper=S(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position='absolute',e=C(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function k(e,t){return e.some(function(e){var o=e.name,i=e.enabled;return i&&o===t})}function W(e){for(var t=[!1,'ms','Webkit','Moz','O'],o=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<t.length-1;n++){var i=t[n],r=i?''+i+o:e;if('undefined'!=typeof document.body.style[r])return r}return null}function P(){return this.state.isDestroyed=!0,k(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.left='',this.popper.style.position='',this.popper.style.top='',this.popper.style[W('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function B(e){var t=e.ownerDocument;return t?t.defaultView:window}function H(e,t,o,i){var r='BODY'===e.nodeName,p=r?e.ownerDocument.defaultView:e;p.addEventListener(t,o,{passive:!0}),r||H(n(p.parentNode),t,o,i),i.push(p)}function A(e,t,o,i){o.updateBound=i,B(e).addEventListener('resize',o.updateBound,{passive:!0});var r=n(e);return H(r,'scroll',o.updateBound,o.scrollParents),o.scrollElement=r,o.eventsEnabled=!0,o}function I(){this.state.eventsEnabled||(this.state=A(this.reference,this.options,this.state,this.scheduleUpdate))}function M(e,t){return B(e).removeEventListener('resize',t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener('scroll',t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}function R(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=M(this.reference,this.state))}function U(e){return''!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function Y(e,t){Object.keys(t).forEach(function(o){var i='';-1!==['width','height','top','right','bottom','left'].indexOf(o)&&U(t[o])&&(i='px'),e.style[o]=t[o]+i})}function j(e,t){Object.keys(t).forEach(function(o){var i=t[o];!1===i?e.removeAttribute(o):e.setAttribute(o,t[o])})}function F(e,t,o){var i=T(e,function(e){var o=e.name;return o===t}),n=!!i&&e.some(function(e){return e.name===o&&e.enabled&&e.order<i.order});if(!n){var r='`'+t+'`';console.warn('`'+o+'`'+' modifier is required by '+r+' modifier in order to work, be sure to include it before '+r+'!')}return n}function K(e){return'end'===e?'start':'start'===e?'end':e}function q(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=ae.indexOf(e),i=ae.slice(o+1).concat(ae.slice(0,o));return t?i.reverse():i}function V(e,t,o,i){var n=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+n[1],p=n[2];if(!r)return e;if(0===p.indexOf('%')){var s;switch(p){case'%p':s=o;break;case'%':case'%r':default:s=i;}var d=c(s);return d[t]/100*r}if('vh'===p||'vw'===p){var a;return a='vh'===p?J(document.documentElement.clientHeight,window.innerHeight||0):J(document.documentElement.clientWidth,window.innerWidth||0),a/100*r}return r}function z(e,t,o,i){var n=[0,0],r=-1!==['right','left'].indexOf(i),p=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=p.indexOf(T(p,function(e){return-1!==e.search(/,|\s/)}));p[s]&&-1===p[s].indexOf(',')&&console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');var d=/\s*,\s*|\s+/,a=-1===s?[p]:[p.slice(0,s).concat([p[s].split(d)[0]]),[p[s].split(d)[1]].concat(p.slice(s+1))];return a=a.map(function(e,i){var n=(1===i?!r:r)?'height':'width',p=!1;return e.reduce(function(e,t){return''===e[e.length-1]&&-1!==['+','-'].indexOf(t)?(e[e.length-1]=t,p=!0,e):p?(e[e.length-1]+=t,p=!1,e):e.concat(t)},[]).map(function(e){return V(e,n,t,o)})}),a.forEach(function(e,t){e.forEach(function(o,i){U(o)&&(n[t]+=o*('-'===e[i-1]?-1:1))})}),n}function G(e,t){var o,i=t.offset,n=e.placement,r=e.offsets,p=r.popper,s=r.reference,d=n.split('-')[0];return o=U(+i)?[+i,0]:z(i,p,s,d),'left'===d?(p.top+=o[0],p.left-=o[1]):'right'===d?(p.top+=o[0],p.left+=o[1]):'top'===d?(p.left+=o[0],p.top-=o[1]):'bottom'===d&&(p.left+=o[0],p.top+=o[1]),e.popper=p,e}for(var _=Math.min,X=Math.floor,J=Math.max,Q='undefined'!=typeof window&&'undefined'!=typeof document,Z=['Edge','Trident','Firefox'],$=0,ee=0;ee<Z.length;ee+=1)if(Q&&0<=navigator.userAgent.indexOf(Z[ee])){$=1;break}var i,te=Q&&window.Promise,oe=te?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},$))}},ie=function(){return void 0==i&&(i=-1!==navigator.appVersion.indexOf('MSIE 10')),i},ne=function(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')},re=function(){function e(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,'value'in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}return function(t,o,i){return o&&e(t.prototype,o),i&&e(t,i),t}}(),pe=function(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},se=Object.assign||function(e){for(var t,o=1;o<arguments.length;o++)for(var i in t=arguments[o],t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},de=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'],ae=de.slice(3),le={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'},fe=function(){function t(o,i){var n=this,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};ne(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=oe(this.update.bind(this)),this.options=se({},t.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=o&&o.jquery?o[0]:o,this.popper=i&&i.jquery?i[0]:i,this.options.modifiers={},Object.keys(se({},t.Defaults.modifiers,r.modifiers)).forEach(function(e){n.options.modifiers[e]=se({},t.Defaults.modifiers[e]||{},r.modifiers?r.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return se({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(t){t.enabled&&e(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var p=this.options.eventsEnabled;p&&this.enableEventListeners(),this.state.eventsEnabled=p}return re(t,[{key:'update',value:function(){return N.call(this)}},{key:'destroy',value:function(){return P.call(this)}},{key:'enableEventListeners',value:function(){return I.call(this)}},{key:'disableEventListeners',value:function(){return R.call(this)}}]),t}();return fe.Utils=('undefined'==typeof window?global:window).PopperUtils,fe.placements=de,fe.Defaults={placement:'bottom',eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,o=t.split('-')[0],i=t.split('-')[1];if(i){var n=e.offsets,r=n.reference,p=n.popper,s=-1!==['bottom','top'].indexOf(o),d=s?'left':'top',a=s?'width':'height',l={start:pe({},d,r[d]),end:pe({},d,r[d]+r[a]-p[a])};e.offsets.popper=se({},p,l[i])}return e}},offset:{order:200,enabled:!0,fn:G,offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var o=t.boundariesElement||r(e.instance.popper);e.instance.reference===o&&(o=r(o));var i=y(e.instance.popper,e.instance.reference,t.padding,o);t.boundaries=i;var n=t.priority,p=e.offsets.popper,s={primary:function(e){var o=p[e];return p[e]<i[e]&&!t.escapeWithReference&&(o=J(p[e],i[e])),pe({},e,o)},secondary:function(e){var o='right'===e?'left':'top',n=p[o];return p[e]>i[e]&&!t.escapeWithReference&&(n=_(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=X,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]<r(i[d])&&(e.offsets.popper[d]=r(i[d])-o[a]),o[d]>r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var i;if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var n=o.element;if('string'==typeof n){if(n=e.instance.popper.querySelector(n),!n)return e;}else if(!e.instance.popper.contains(n))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',g=a?'bottom':'right',u=L(n)[l];d[g]-u<s[m]&&(e.offsets.popper[m]-=s[m]-(d[g]-u)),d[m]+u>s[g]&&(e.offsets.popper[m]+=d[m]+u-s[g]),e.offsets.popper=c(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=J(_(s[l]-u,v),0),e.arrowElement=n,e.offsets.arrow=(i={},pe(i,m,Math.round(v)),pe(i,h,''),i),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(k(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=y(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=x(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case le.FLIP:p=[i,n];break;case le.CLOCKWISE:p=q(i);break;case le.COUNTERCLOCKWISE:p=q(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=x(i);var a=e.offsets.popper,l=e.offsets.reference,f=X,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)<f(l.right)||'top'===i&&f(a.bottom)>f(l.top)||'bottom'===i&&f(a.top)<f(l.bottom),h=f(a.left)<f(o.left),c=f(a.right)>f(o.right),g=f(a.top)<f(o.top),u=f(a.bottom)>f(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,w=-1!==['top','bottom'].indexOf(i),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),y&&(r=K(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=C(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=x(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottom<o.top||t.left>o.right||t.top>o.bottom||t.right<o.left){if(!0===e.hide)return e;e.hide=!0,e.attributes['x-out-of-boundaries']=''}else{if(!1===e.hide)return e;e.hide=!1,e.attributes['x-out-of-boundaries']=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var o=t.x,i=t.y,n=e.offsets.popper,p=T(e.instance.modifiers,function(e){return'applyStyle'===e.name}).gpuAcceleration;void 0!==p&&console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');var s,d,a=void 0===p?t.gpuAcceleration:p,l=r(e.instance.popper),f=g(l),m={position:n.position},h={left:X(n.left),top:X(n.top),bottom:X(n.bottom),right:X(n.right)},c='bottom'===o?'top':'bottom',u='right'===i?'left':'right',b=W('transform');if(d='bottom'==c?-f.height+h.bottom:h.top,s='right'==u?-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[u]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==u?-1:1;m[c]=d*w,m[u]=s*y,m.willChange=c+', '+u}var E={"x-placement":e.placement};return e.attributes=se({},E,e.attributes),e.styles=se({},m,e.styles),e.arrowStyles=se({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return Y(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&Y(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,i,n){var r=O(n,t,e),p=v(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),Y(t,{position:'absolute'}),o},gpuAcceleration:void 0}}},fe}); +//# sourceMappingURL=popper.min.js.map diff --git a/kadmos/vistoms/static/pictures/AGILE_Logo.png b/kadmos/vistoms/static/pictures/AGILE_Logo.png index ccdb4d4b1093ba56c9c7c98a3d0b53c8deb62d2e..d89f1b054895671cb14c52786cc0eeb794572f74 100644 GIT binary patch literal 121497 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¿G3A{%*>FjSdK4$wyqu83#kuoy{l*Z3G9TmRZ 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 V4>8t!TZ|fp_4Ym63bs05_&;vP6~6!g literal 14199 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 diff --git a/kadmos/vistoms/static/pictures/AGILE_Logo_large.png b/kadmos/vistoms/static/pictures/AGILE_Logo_large.png new file mode 100644 index 0000000000000000000000000000000000000000..99776d464cc7f1aa65a9b0cf59829dbb4165bef4 GIT binary patch literal 72406 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 literal 0 HcmV?d00001 diff --git a/kadmos/vistoms/static/pictures/CMDOWS_logo.png b/kadmos/vistoms/static/pictures/CMDOWS_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfb479b63ce4680f1ef60cdb1da5ecd3495de63 GIT binary patch literal 32872 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 literal 0 HcmV?d00001 diff --git a/kadmos/vistoms/static/pictures/KADMOS_logo.pdf b/kadmos/vistoms/static/pictures/KADMOS_logo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..28e2eaa6ac91d1cc95b1d92c5af62c863e44dcb3 GIT binary patch literal 64373 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 literal 0 HcmV?d00001 diff --git a/kadmos/vistoms/static/pictures/KADMOS_logo.png b/kadmos/vistoms/static/pictures/KADMOS_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..55749df05ab444298bdc022e419958263fe5d640 GIT binary patch literal 5496 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 literal 0 HcmV?d00001 diff --git a/kadmos/vistoms/templates/VISTOMS - Kopie.html b/kadmos/vistoms/templates/VISTOMS - Kopie.html new file mode 100644 index 000000000..d0d958b5a --- /dev/null +++ b/kadmos/vistoms/templates/VISTOMS - Kopie.html @@ -0,0 +1,29422 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<meta name="apple-mobile-web-app-capable" content="yes"> +<meta name="apple-mobile-web-app-status-bar-style" content="default"> +<head"> + <meta charset="utf-8"> + <title>VISTOMS (Visualization Tool for MDO Systems)</title> + <!--Include this css file in the <head> tag --> + <link rel="stylesheet" href="static/lib/jquery/jquery-ui.min.css"/> + <link rel="stylesheet" href="static/lib/bootstrap/bootstrap.min.css"/> + <link rel="stylesheet" href="static/lib/lobipanel/github.css"/> + <link rel="stylesheet" href="static/lib/lobipanel/lobipanel.min.css"/> + <link rel="stylesheet" href="static/lib/vistoms.css"/> +</head> +<body> + <!--Include these script files in the <head> or <body> tag--> + <script src="static/lib/jquery/jquery.3.20.min.js"></script> + <script src="static/lib/jquery/jquery-ui.min.js"></script> + <script src="static/lib/jquery/jquery.ui.touch-punch.min.js"></script> + <script src="static/lib/bootstrap/bootstrap.min.js"></script> + <script src="static/lib/bootstrap/bootbox.min.js"></script> + <script src="static/lib/lobipanel/highlight.pack.js"></script> + <script src="static/lib/lobipanel/lobipanel.js"></script> + <script src="static/lib/vkbeautify/vkbeautify.js"></script> + <script src="static/lib/bowser/bowser.js"></script> + <script> + var sessionId = {{ sessionId|tojson }}; + var interfaceMode = {{ interfaceMode|tojson }}; + if (bowser.name=="Internet Explorer") + { + alert("OOPS! VISTOMS unfortunately does not work properly on " + bowser.name + ". Please use a different browser to see its awesome visualization features!") + } + /* see docs: https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage */ + if (window && window.localStorage && interfaceMode==='server') + { + var storage = window.localStorage; + var existingSessionId = storage.getItem('sessionId'); + if (existingSessionId) + { + sessionId = existingSessionId; + } + else { + storage.setItem('sessionId', sessionId); + } + } + //aigner: Include function + function include(arr,obj) { + return (arr.indexOf(obj) != -1); + } + + //aigner: Move to front function + d3.selection.prototype.moveToFront = function() { + return this.each(function(){ + this.parentNode.appendChild(this); + }); + }; + //aigner: Move to back function + d3.selection.prototype.moveToBack = function() { + return this.each(function() { + var firstChild = this.parentNode.firstChild; + if (firstChild) { + this.parentNode.insertBefore(this, firstChild); + } + }); + }; + + /** + * Returns a random integer between min (inclusive) and max (inclusive) + * Using Math.round() will give you a non-uniform distribution! + */ + function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; + } + + + //aigner: General functions communicating with the user via bootbox after kadmos requests + //############################################################## + function kadmosErrorMessage(content) + { + var message=""; + if (content.message.responseText){message = content.message.responseText} + else if (content.message == ""){message = "ERROR: Something went wrong in KADMOS!"} + else {message = content.message} + bootbox.hideAll(); + bootbox.dialog({ + title: content.title, + message: message, + buttons : { cancel: + { + label: "OK", + className: 'btn-default', + callback: function(){} + } + } + }); + } + + function kadmosSuccessMessage(content) + { + bootbox.hideAll(); + bootbox.dialog( + { + title: content.title, + message: content.message, + buttons : { cancel: + { + label: "OK", + callback: function(){} + } + } + }); + } + + function kadmosHavePatience(anXhr, content) + { + bootbox.hideAll(); + bootbox.dialog({ + title: content.title, + message: content.message, + buttons : { cancel: + { + label: "Cancel request", + className: 'btn-danger', + callback: function () { + anXhr.abort() + bootbox.hideAll(); + bootbox.dialog( + { + title: content.title, + message: "<b>KADMOS request aborted!</b> <p>CAUTION: Python functions could still be running in the background!</p>", + buttons : { cancel: + { + label: "OK", + className: 'btn-danger', + callback: function(){} + } + } + }); + } + } + } + }); + } + + //Remove obsolete files + function remove_obsolete_files() + { + $.ajax({ + type: 'POST', + url: '/kadmos_remove_obsolete_files', + data: {'sessionId': sessionId}, + success: function(result){}, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + } + //############################################################## + + //aigner: Function to filter a list with a search + //############################################################## + function filterSearch() + { + var input, filter, table, tr, td, i; + input = document.getElementById("myInput"); + filter = input.value.toUpperCase(); + table = document.getElementById("myTable"); + tr = table.getElementsByTagName("tr"); + for (i = 0; i < tr.length; i++) + { + td = tr[i].getElementsByTagName("td")[0]; + if (td) + { + if (td.innerHTML.toUpperCase().indexOf(filter) > -1) + { + tr[i].style.display = ""; + } + else + { + tr[i].style.display = "none"; + } + } + } + } + //############################################################## + + //aigner: General functions for tree layout + //############################################################## + //Function to prune the tree according to list of xPaths that are actually there + function prune_tree(aPipeData,aTreeData,direction="none") + { + //First, clean up pipeData if necessary + var cleanPipeData = aPipeData.split(",") + var index = cleanPipeData.indexOf(""); + if (index > -1) {cleanPipeData.splice(index, 1);} + var firstEl = cleanPipeData[0].split("/")[1] + + for (var i=0; i < aTreeData.length; ++i) + { + var treeElement = aTreeData[i]; + var relevant_xPath = "/"+firstEl+"/"+treeElement.xPath.split("/"+firstEl+"/")[1] + if(cleanPipeData.indexOf(relevant_xPath)<=-1) + { + aTreeData.splice(i,1); + i--; + } + else + { + if (direction=="in") + { + aTreeData[i].pipeLineIn = true; + } + else if (direction=="out") + { + aTreeData[i].pipeLineOut = true; + } + } + } + } + + function childExists(name, children) + { + var exists = false + children.forEach(function(child) + { + if (child.name == name) + { + exists = true; + } + }) + return exists; + } + + //Function to create the tree layout by appending children to the layout + function appendChildren(anElement, aParent, xPath_list) + { + if (xPath_list.length > 0) + { + //If element has no children yet, initialize children array + if (!aParent.children){aParent.children = [];} + //Create a new child element, if it does not exist yet + if (!childExists(xPath_list[0], aParent.children)) + { + //Create a new child object + var newChild = {level: aParent.level+1, name: xPath_list[0], type: "variable", xPath: aParent.xPath+"/"+xPath_list[0]}; + if (anElement.pipeLineIn){newChild.pipeLineIn=true} + if (anElement.pipeLineOut){newChild.pipeLineOut=true} + aParent.children.push(newChild); + } + aParent.children.forEach(function(aChild) + { + if (xPath_list[0] == aChild.name) + { + let newXPath_list = JSON.parse(JSON.stringify(xPath_list)); + newXPath_list.shift(); + appendChildren(anElement, aChild, newXPath_list) + } + }) + } + else + { + aParent.value = anElement.value; + } + } + + //function builds tree layout from xPaths of the elements + function buildTree(root, aTreeData) + { + aTreeData.forEach(function(treeElement) + { + var xPath_split = treeElement.xPath.split("/"); + var index = xPath_split.indexOf(""); + if (index > -1) {xPath_split.splice(index, 1);} + root.level = 0 + root.name = xPath_split[0] + root.xPath = "/"+xPath_split[0] + <!-- console.log("####################") --> + <!-- console.log(treeElement.xPath) --> + let newXPath_split = JSON.parse(JSON.stringify(xPath_split)); + newXPath_split.shift(); + appendChildren(treeElement, root, newXPath_split) + <!-- console.log("DONE!") --> + <!-- console.log("####################") --> + }) + } + //############################################################## + + + //aigner: Function to download data to a file + //############################################################## + function download_from_kadmos(filename, href) { + var element = document.createElement('a'); + element.setAttribute('href', href); + element.setAttribute('download', filename); + + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); + } + //############################################################## + + + function makeKadmosMenu(data, initial=false) + { + //First of all, clear everything if it is already there + var visPackDiv = d3.select(".visPackDiv"); + if(visPackDiv){visPackDiv.remove()}; + var navigationBarDiv = d3.select(".navigationBarDiv"); + if(navigationBarDiv){navigationBarDiv.remove()}; + var lobiPanels = d3.selectAll(".lobipanel"); + if (lobiPanels) + { + lobiPanels.each(function() + { + this.remove(); + }) + } + + var imageWidth = 200; + var imageHeight = 150; + var padding = 10; + var rectHeight = 70; + var imgSize = 40; + visPackDiv = d3.select("body").append("div").attr("class","visPackDiv"); + var visPackSvg = visPackDiv.append("svg") + .attr("class","visPackSvg") + .attr("width",imageWidth*5+40) + .attr("height",imageHeight+40) + .attr("transform", "translate(" + + String(10) + "," + String(10) + ")") + + var visPackFrame = visPackSvg.append("rect") + .attr("width",imageWidth*5+12) + .attr("height",imageHeight) + .attr("fill", "none") + + var imgs = visPackSvg.selectAll("image1").data([0]); + imgs.enter() + .append("svg:image") + .attr("x",5) + .attr("xlink:href", fileReference.AGILE_Logo) + .attr("width", imageWidth) + .attr("height", imageHeight) + .attr("position", "relative") + + visPackSvg.append("text") + .style("fill","black") + .text("Halloo") + + + <!-- var imgs = visPackSvg.selectAll("image2").data([0]); --> + <!-- imgs.enter() --> + <!-- .append("svg:image") --> + <!-- .attr("x",210) --> + <!-- .attr("y",-5) --> + <!-- .attr("xlink:href", fileReference.VISTOMS_Label) --> + <!-- .attr("width", "180pt") --> + <!-- .attr("height", "70pt") --> + + + + //Set general offset for Buttons, acknowledgements and so on + var offset_tmp = 645; + + + //aigner: Make Acknowledgments, Help and Home buttons + //########################################################## + visPackSvg.append("rect") + .attr("transform", "translate("+ String(offset_tmp+17) + "," + String(0) + ")") + .attr("fill", "#555555") + .attr("width", 186) + .attr("height", 40) + + function makeButton(anId, aText,aPicFile, anOffset, aScale, picX, picY) + { + var buttonGroup = visPackSvg.append("a").classed("buttonGroup",true) + buttonGroup + .attr("class",anId) + .append("svg:title").text(aText) + var polygon = buttonGroup.append("polygon").classed("button",true) + .attr("points", "30,15 22.5,28.0 7.5,28 0,15 7.5,2 22.5,2") + .attr("transform", "translate("+ String(anOffset) + "," + String(2) + ") scale(1.2)") + buttonGroup.append("image") + .attr("xlink:href",aPicFile) + .attr("height",50) + .attr("width",50) + .attr("transform", "translate("+ String(anOffset+picX) + "," + String(picY) + ") scale("+aScale+")") + buttonGroup + .on("mouseover", function() + { + polygon.style("fill","#3399FF") + d3.select(this).style("cursor", "pointer") + }) + .on("mouseleave", function() + { + polygon.style("fill","#555555") + }) + } + ///Home button + var distance = 45; + var currentOffset = offset_tmp+25; + makeButton("id_mainPage","Main Page",fileReference.Home, currentOffset, 0.45, 6.9,7.2); + d3.select(".id_mainPage").on("click",function() + { + mainPage(); + }) + //help button + currentOffset+=distance; + makeButton("id_turorial","Tutorial",fileReference.Tutorial, currentOffset, 0.45, 6.8, 7.5); + d3.select(".id_turorial").on("click",function() + { + tutorial(); + }) + //Contact button + currentOffset+=distance; + makeButton("id_contact","Contact the support team",fileReference.Contact, currentOffset, 0.45, 6.9, 9); + d3.select(".id_contact").on("click",function() + { + sendMail("VISTOMS support"); + }) + + //Acknowledgements button + currentOffset+=distance; + makeButton("id_acknowledgements","Acknowledgements",fileReference.Acknowledgements, currentOffset, 0.45, 7, 8); + d3.select(".id_acknowledgements").on("click",function() + { + acknowledgements(); + }) + //########################################################## + + var navigationBarDiv = d3.select("body").append("div").attr("class","navigationBarDiv") + var ul = navigationBarDiv.append("ul") + navigationBarDiv.on("mouseover", function() + { + d3.select(this).style("z-index","1300"); + }) + .on("mouseout", function() + { + d3.select(this).style("z-index",""); + }) + var generalPanel_div = d3.select(".generalPaneDiv") + if (generalPanel_div) + generalPanel_div.remove(); + + + + + var tmpGraphsAvailable = false; + if (initial) + { + var bootboxContent = {title: "VISTOMS start", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_find_temp_graphs', + data: {'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var dataArray = result; + for (var i = 0; i < dataArray.length; i++) + { + if (data=="REP__GRAPH_DATA__REP") + { + data = {"graphs":[], "categories":""}; + } + var data_tmp = JSON.parse(dataArray[i]) + data.graphs.push(data_tmp.graphs[0]); + if (data.categories == []) + { + data.categories = data_tmp.categories; + } + tmpGraphsAvailable = true; + } + + + if (tmpGraphsAvailable) + { + bootboxContent.title = "VISTOMS ready" + bootboxContent.message = "KADMOS found already existing VISTOMS graphs. You can select them from the drop-down menu." + kadmosSuccessMessage(bootboxContent) + } + else {bootbox.hideAll();} + + //aigner: make dropwdown section for the multiple MDO graphs tzhat can be visualized + makeViewButtons(data,"XDSM","xdsm"); + makeViewButtons(data,"Edge Bundles","edgeBundles"); + makeViewButtons(data,"Sankey Diagram","sankeyDiagram"); + //aigner: Add special button to open graphs from kdms or cmdows files + generalPanel(data.graphs); + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + else + { + //aigner: make dropwdown section for the multiple MDO graphs tzhat can be visualized + makeViewButtons(data,"XDSM","xdsm"); + makeViewButtons(data,"Edge Bundles","edgeBundles"); + makeViewButtons(data,"Sankey Diagram","sankeyDiagram"); + //aigner: Add special button to open graphs from kdms or cmdows files + generalPanel(data.graphs); + } + + + + + //aigner: make dropwdown section for the multiple MDO graphs tzhat can be visualized + //########################################################## + function makeViewButtons(data,name, aView) + { + var numberOfGraphs = 0; + var dropdown1 = ul.append("li") + .on("mouseover", function() + { + d3.select(this).style("cursor", "default") + }) + + dropdown1.append("a").text(name) + dropdown1.append("img").attr("src",fileReference.AGILE_Icon) + .attr("align","left") + .style("margin-left","6px") + .style("margin-right","0px") + .style("margin-top","10px") + .style("margin-bottom","6px") + .attr("height","42") + .attr("width","42") + var links = dropdown1.append("ul"); + if (data=="REP__GRAPH_DATA__REP" && !tmpGraphsAvailable) + { + var linkLi = links.append("li"); + var link = linkLi.append("a") + .style("font-style","Italic") + .text("No graphs to inspect ...") + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click", function(){ + + bootbox.hideAll(); + bootbox.dialog({ + message: "No graph to inspect in VISTOMS yet! \nYou can add a graph by uploading a KDMS or CMDOWS file.", + buttons : { cancel: + { + label: "OK", + className: 'btn-danger', + callback: function(){} + } + } + }); + }) + } + else + { + var graphs_tmp = data.graphs; + for (var i=0; i < graphs_tmp.length; i++) + { + makeDropDown(data,graphs_tmp[i],aView,links) + numberOfGraphs ++; + } + } + + + } + + function makeDropDown(theData,theGraph,theView,theLinks) + { + var linkLi = theLinks.append("li"); + var name_tmp=""; + if (theGraph.name){name_tmp=theGraph.name} + else{name_tmp="Graph " + theGraph.id} + var link = linkLi.append("a").text(name_tmp) + .text(name_tmp) + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click", function() + { + clearView(); + if (theView == "xdsm") + { + xdsm_script(theData,theGraph.id) + } + else if (theView == "edgeBundles") + { + edgeBundles_script(theData,theGraph.id) + } + else if (theView == "sankeyDiagram") + { + sankeyDiagram_script(theData,theGraph.id) + } + }) + } + //########################################################## + + + //aigner: Add general panel to open and save graphs and for adding contacts to the organization + //########################################################## + function generalPanel(theGraphs) + { + var generalPanel_div = d3.select("body").append("div").attr("class","generalPaneDiv") + + var newGraphID = '01'; + if (theGraphs) + { + theGraphs.forEach(function(graph) + { + id_int = parseInt(graph.id) + if (theGraphs.length < 100){newGraphID = "0" + String(id_int+1);} + else{newGraphID = String(id_int+1);} + }) + } + + var addButtonPanel = generalPanel_div.append("div") + .attr("class","panel panel-default") + .attr("id","addButton") + .style("display","inline-block") + .style("min-width","200px") + .style("margin-left","10px") + addButtonPanel.append("div").attr("class","panel-heading text-center align-top") + .style("background-color","#555555") + .append("h3") + .attr("class","panel-title") + .style("font-family","Arial") + .style("font-size","14pt") + .style("color","white") + .style("display","inline-block") + .text("Add graph") + var panelBody = addButtonPanel.append("div").attr("class","panel-body") + .style("font-family","Arial") + .style("font-size","8pt") + .style("display","inline-block") + + + var options = ["Choose...", "Create graph from scratch", "Upload KDMS file(s)", "Upload CMDOWS file", "Upload Database"]; + + var select = panelBody.append('select') + .attr('id','addselect') + .attr('class','select') + .on('change',onchange) + + var options = select.selectAll('option') + .data(options).enter() + .append('option') + .text(function (d) { return d; }); + + + var form = panelBody.append("form").attr("id","addForm") + .attr("method","post") + .attr("enctype","multipart/form-data") + var label = form.append("label") + var fileText; + var file; + var submit; + var selectValue; + + function onchange() { + if (include(d3.select('#addselect').property('value'),"Create")) + { + selectValue = "Create" + if (file){ + fileText.remove(); + file.remove(); + } + if (submit){submit.remove();} + submit = label.append("button") + .style("margin-top","10pt") + .attr("type","submit") + .attr("class","btn btn-primary") + .text("Go!") + } + else if (include(d3.select('#addselect').property('value'),"KDMS")) + { + selectValue = "KDMS" + if (file){ + fileText.remove(); + file.remove(); + } + if (submit){submit.remove();} + fileText = label.append("text") + .style("font-family","Arial") + .style("font-size","12pt") + .text("Choose KDMS files (max. 2: 1 data graph & 1 process graph)") + file = label.append("input").attr("type","file").attr("name","file[]").attr("multiple","") + submit = label.append("input").attr("type","submit").attr("value","Submit"); + } + else if (include(d3.select('#addselect').property('value'),"CMDOWS")) + { + selectValue = "CMDOWS" + if (file){ + fileText.remove(); + file.remove(); + } + if (submit){submit.remove();} + fileText = label.append("text") + .style("font-family","Arial") + .style("font-size","12pt") + .text("Choose any CMDOWS file") + file = label.append("input").attr("type","file").attr("name","file[]") + submit = label.append("input").attr("type","submit").attr("value","Submit"); + } + else if (include(d3.select('#addselect').property('value'),"Database")) + { + selectValue = "Database" + if (file){ + fileText.remove(); + file.remove(); + } + if (submit){submit.remove();} + fileText = label.append("text") + .style("font-family","Arial") + .style("font-size","12pt") + .text("Choose any zip file containing a database") + file = label.append("input").attr("type","file").attr("name","file[]") + submit = label.append("input").attr("type","submit").attr("value","Submit"); + } + else{} + }; + + $('#addForm').on('submit',function(event){ + event.preventDefault(); + //aigner: Uploading files for KADMOS + var formData = new FormData($('#addForm')[0]); + formData.append('newGraphID', newGraphID); + formData.append('fileType',selectValue); + formData.append('sessionId',sessionId) + + + if (selectValue == "Create") + { + bootbox.hideAll(); + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; + + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Name") + input = form_group.append("input") + .attr("id","graph_name") + .attr("class","form-control") + .attr("name","graph_name") + .attr("placeholder","Add a graph name here...") + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Description") + input = form_group.append("input") + .attr("id","graph_description") + .attr("class","form-control") + .attr("name","graph_description") + .attr("placeholder","Add a graph description here...") + + bootbox.dialog({ + message: $(".form-content").html(), + title: "Create new graph", + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default pull-left", + callback: function() { + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary pull-left", + callback: function() { + + //get form data + var graph_name = $('form #graph_name').val(); + var graph_description = $('form #graph_description').val(); + + + var bootboxContent = {title: "Create new graph", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_create_new_graph', + data: {'graph_name':graph_name, 'graph_description':graph_description, 'graphID':newGraphID, 'sessionId':sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + + clearView(); + makeKadmosMenu(data); + mainPage(); + } + else + { + var updatedData = {}; + if (data != "REP__GRAPH_DATA__REP") + { + updatedData = data; + var graphData = JSON.parse(result); + updatedData.graphs.push(graphData.graphs[0]); + } + else + { + updatedData = JSON.parse(result); + } + + clearView(); + makeKadmosMenu(updatedData); + mainPage(); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + d3.selectAll(".form-content").remove(); + } + } + ] + }); + } + else + { + //aigner: Upload file to VISTOMS and inspect it + //########################################################## + var bootboxContent = {title: "Upload file to VISTOMS", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_upload_file', + data: formData, + processData: false, + contentType: false, + success: function(result) + { + if (result.includes("ERROR:")) + { + + + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + + clearView(); + makeKadmosMenu(data); + mainPage(); + } + else + { + var updatedData = {}; + if (data != "REP__GRAPH_DATA__REP") + { + updatedData = data; + var graphData = JSON.parse(result); + updatedData.graphs.push(graphData.graphs[0]); + } + else + { + updatedData = JSON.parse(result); + } + + clearView(); + makeKadmosMenu(updatedData); + mainPage(); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + //########################################################## + + } + }); + + if (theGraphs) + { + var saveButtonPanel = generalPanel_div.append("div") + .attr("class","panel panel-default") + .attr("id","saveButton") + .style("display","inline-block") + .style("min-width","200px") + .style("margin-left","10px") + saveButtonPanel.append("div").attr("class","panel-heading text-center align-top") + .style("background-color","#555555") + .append("h3") + .attr("class","panel-title") + .style("font-family","Arial") + .style("font-size","14pt") + .style("color","white") + .style("display","inline-block") + .text("Save all graphs") + var savepanelBody = saveButtonPanel.append("div").attr("class","panel-body") + .style("font-family","Arial") + .style("font-size","8pt") + .style("display","inline-block") + + + var options = ["Choose...","KDMS files", "CMDOWS files"]; + + var saveselect = savepanelBody.append('select') + .attr('id','saveselect') + .attr('class','select') + .on('change',onchange) + + var options = saveselect.selectAll('option') + .data(options).enter() + .append('option') + .text(function (d) { return d; }); + + + var saveform = savepanelBody.append("form").attr("id","saveForm") + .attr("method","post") + .attr("enctype","multipart/form-data") + var savelabel = saveform.append("label") + var saveSubmit; + var selectValue; + + function onchange() { + selectValue = d3.select('#saveselect').property('value') + if (saveSubmit){saveSubmit.remove();} + if (selectValue!="Choose...") + { + saveSubmit = savelabel.append("input").attr("type","submit").attr("value","Save"); + } + }; + + $('#saveForm').on('submit',function(event){ + event.preventDefault(); + //aigner: Uploading files for KADMOS + //########################################################## + bootbox.hideAll(); + var bootboxContent = {title: "Save graph", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax( + { + type: 'POST', + data: {'fileType': selectValue, 'sessionId': sessionId}, + url: '/kadmos_export_all_graphs', + success: function(result) + { + var files = result + files.forEach(function(file) + { + download_from_kadmos(file,"/kadmos_download/"+file+"/"+sessionId) + }) + + + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + bootboxContent.message = "Successfully created the files. Ready for download." + bootbox.hideAll(); + bootbox.confirm( + { + title: bootboxContent.title, + message: bootboxContent.message, + callback: function(){ + remove_obsolete_files() + } + }); + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + //########################################################## + }); + } + d3.select("#mainPage").moveToFront() + } + } + //########################################################## + + + function getTextWidth(text, font) + { + // re-use canvas object for better performance + var canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas")); + var context = canvas.getContext("2d"); + context.font = font; + var metrics = context.measureText(text); + return metrics.width; + } + + + //#####################################################################// + function mainPage() + { + clearView(); + var introDiv = d3.select("body").append("div") + .attr("id","mainPage") + .classed("wordWrap",true) + + var theHeading = "Welcome to the MDO System Interface!\n" + introDiv.append("text") + .style("font-size","16pt") + .html(theHeading) + + var theText = "The interface is a combination of two open-source packages, the <b>K</b>nowledge- and graph-based <b>A</b>gile <b>D</b>esign with <b>M</b>ultidisciplinary <b>O</b>ptimization <b>S</b>ystem (<b>KADMOS</b>) " + +"and the <b>VIS</b>ualization <b>TO</b>ol for <b>M</b>DO <b>S</b>ystems (<b>VISTOMS</b>). " + +"While KADMOS is the python-based engine running under the hood, VISTOMS is the graphical user interface to facilitate the setup of your MDO systems." + +"\n\nTo set up, modify, or inspect an already existing MDO system, go to one of the visualizations in the navigation bar (XDSM, Edge Bundles, or Sankey Diagram). Then select a graph from the dropdown menu." + +"\n\nIf you haven't already set up a system, use the \"Add graph\" option to upload an MDO system file, or start a new system from scratch." + +"\n\nIf you need help with how to use the package, there is a tutorial video available. Just click on the \"Tutorial\" symbol in the top right corner." + +"\n\nIf you want to get more information on the package, here is a link to the open-source <b><a target=\"_blank\" href=\"https://bitbucket.org/imcovangent/kadmos\">KADMOS repository</a></b> "; + introDiv.append("text").html(theText) + introDiv.append("text") + .style("font-size","8pt") + .html("\n\n\nCopyright 2016-2018 by Benedikt Aigner (RWTH Aachen) & Imco van Gent (TU Delft)") + + var introSvg = introDiv.append("svg") + .attr("width",500) + .attr("height",100) + var imgs = introSvg.selectAll("img").data([0]); + imgs.enter() + .append("svg:image") + .attr("xlink:href", fileReference.RWTH_Logo) + .attr("width", "150") + .attr("height", "70") + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click",function(){window.open("https://www.rwth-aachen.de/", '_blank');} ) + var imgs = introSvg.selectAll("img").data([0]); + imgs.enter() + .append("svg:image") + .attr("xlink:href", fileReference.TUDelft_Logo) + .attr("x", 175) + .attr("y", 5) + .attr("width", "105") + .attr("height", "50") + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click",function(){window.open("https://www.tudelft.nl/en/", '_blank');} ) + + } + //#####################################################################// + + //#####################################################################// + function acknowledgements() + { + clearView(); + var acknDiv = d3.select("body").append("div") + .attr("id","acknowledgements") + .classed("acknText", true) + .classed("wordWrap",true) + + var theHeading = "Acknowledgements"; + acknDiv.append("text") + .style("font-size","16pt") + .html(theHeading) + + acknDiv.append("text") + .style("font-size","10pt") + .style("margin", "20px 10px") + .html("<br><br>Created by Benedikt Aigner and Imco van Gent for the " + +"<a href=\"http://www.agile-project.eu/\">AGILE Project</a> in 2016. This project has received funding from the European Union's Horizon 2020 research and innovation framework programme under grant agreement No 636202." + +"<br>" + +"<br>" + +"<b>VISTOMS was created using the following open source packages:</b>" + +"<br>" + +"<a href=\"https://d3js.org/\">D3.js</a> package © 2015 by Mike Bostock released under the <a href=\"https://opensource.org/licenses/BSD-3-Clause\">BSD license</a>" + +"<br>" + +"<a href=\"https://github.com/OneraHub/XDSMjs\">XDSM.js </a> package © 2016 by Rémi Lafage released under the <a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache License, Version 2.0</a>" + +"<br>" + +"<a href=\"https://github.com/Neilos/bihisankey\">BiHiSankey.js</a> package © 2015 by Neil Atkinson released under the <a href=\"https://opensource.org/licenses/MIT\">MIT License</a>" + +"<br>" + +"<br>" + +"<br>" + +"<font size=\"-2\">Rev. 10/24/2018</font>") + } + //#####################################################################// + + //#####################################################################// + function tutorial() + { + var theButtons = + { + cancel: { + label: "OK, got it!", + className: 'btn-danger', + callback: function(){} + }, + Feedback: { + label: "Feedback", + className: 'btn-warning', + callback: function(){sendMail("VISTOMS feedback")} + }, + Tutorial: { + label: "Tutorial", + className: 'btn-info', + callback: function(){showTutorialPage();} + } + } + + + function showTutorialPage() + { + clearView(); + var tutorialDiv = d3.select("body").append("div") + .attr("id","tutorial") + .style("margin-top", "16px") + .style("font-size","16pt") + .style("margin", "20px 10px") + .style("color","#555555") + + var theHeading = "<b>VISTOMS Tutorial</b><br/><br/>"; + tutorialDiv.append("text") + .style("font-size","16pt") + .html(theHeading) + + tutorialDiv.append("div") + .style("-webkit-overflow-scrolling", "touch") + .style("-webkit-text-size-adjust", "none") + .html("<video width=\"1000\" height=\"563\" controls>" + +"<source src=\"http://www.agile-project.eu/files/VISTOMS_Tutorial.mp4 \" type=\"video/mp4\">" + +"Your browser does not support the video tag." + +"</video>" + +"</div>") + } + + + if (!d3.select(".xdsmDiv").empty()) + { + bootbox.hideAll(); + var dialog = bootbox.dialog( + { + title: 'XDSM View', + message: "<p><b>To interactively inspect the MDO system there are several options.</b></p>" + +"<ol><li>With a right-click on an edge (rhomboids on the off-diagonal) you can take a closer look at the data processed between competences.</li>" + +"<li>Click right on a competence (boxes on the diagonal) for more information, such as input/output data or a detailed tool description.</li>" + +"<li>To view the full data model, go to the \"Data model\" box and select a variable categorization. </li></ol><br />" + +"<p>To switch to another visualization (<i>Edge Bundles</i> or <i>Sankey Diagram</i>), go to the navigation bar and select a graph from the drop down menu.</p>" + +"<p>If you need more information on how to use the visualization package, click on the \"Tutorial\" button below.</p>" + +"<p><br/>Any questions or feedback? Contact the support team with the \"Feedback\" button below!</p>" + , + buttons : theButtons + }); + } + else if(!d3.select(".edgeBundlesDiv").empty()) + { + bootbox.hideAll(); + var dialog = bootbox.dialog({ + title: 'Edge Bundles View', + message: "<p><b>To interactively inspect the MDO system there are several options.</b></p>" + +"<ol><li>With a right-click on an edge (connecting lines between the competences) you can take a closer look at the data processed between those competences.</li>" + +"<li>When you hover over one of the competences with the mouse, the respective input and output connections are highlighted. Input connections are highlighted in red, output connections in green.</li>" + +"<li>Click right on a competence for more information, such as input/output data or a detailed tool description.</li>" + +"<li>To view the full data model, go to the \"Data model\" box and select a variable categorization.</li></ol><br />" + +"<p>To switch to another visualization (<i>Edge Bundles</i> or <i>Sankey Diagram</i>), go to the navigation bar and select a graph from the drop down menu.</p>" + +"<p>If you need more information on how to use the visualization package, click on the \"Tutorial\" button below.</p>" + +"<p><br/>Any questions or feedback? Contact the support team with the \"Feedback\" button below!</p>" + , + buttons: theButtons + }) + } + else if(!d3.select(".sankeyDiagramDiv").empty()) + { + bootbox.hideAll(); + var dialog = bootbox.dialog({ + title: 'Sankey Diagram', + message: "<p><b>To interactively inspect the MDO system there are several options.</b></p>" + +"<ol><li>When you hover over one of the competences with the mouse, the respective input and output connections are highlighted. Input connections are highlighted in red, output connections in green.</li>" + +"<li> With a right-click on an edge (connecting arrows between the competences) you can take a closer look at the data processed between those competences.</li>" + +"<li>Click right on a competence for more information, such as input/output data or a detailed tool description. You can also rearrange the layout by dragging the competences with the computer mouse.</li>" + +"<li>To view the full data model, go to the \"Data model\" box and select a variable categorization.</li></ol><br />" + +"<p>To switch to another visualization (<i>XDSM</i> or <i>Edge Bundles</i>), go to the navigation bar and select a graph from the drop down menu.</p>" + +"<p>If you need more information on how to use the visualization package, click on the \"Tutorial\" button below.</p>" + +"<p><br/>Any questions or feedback? Contact the support team with the \"Feedback\" button below!</p>" + , + buttons: theButtons + }) + } + else + { + showTutorialPage(); + } + } + //#####################################################################// + + //aigner: Send mail function + //#####################################################################// + function sendMail(mailText) + { + var link = "mailto:support@agile-project.eu" + window.location.href = link; + } + //#####################################################################// + + //aigner: Load entire MDO data + //###############################################################################################################################################################################################################// + //#####################################################################// + //#####################################################################// + //@Imco: here the references to all files are done + var fileReference = { + Acknowledgements : "static/pictures/Acknowledgements.png", + AGILE_Icon : "static/pictures/AGILE_Icon.png", + AGILE_Logo : "static/pictures/AGILE_Logo.png", + Contact : "static/pictures/Contact.png", + Home: "static/pictures/Home.png", + RWTH_Logo : "static/pictures/RWTH_Logo.png", + TUDelft_Logo : "static/pictures/TUDelft_Logo.png", + Tutorial : "static/pictures/Tutorial.png", + VISTOMS_Label : "static/pictures/VISTOMS_Label.png", + } + + //@Imco: Here is the sellar problem example data + theData = "REP__GRAPH_DATA__REP" + function loadAllData(data) + { + makeKadmosMenu(data,true); + mainPage(); + } + loadAllData(theData); + //#####################################################################// + //#####################################################################// + //###############################################################################################################################################################################################################// + + //aigner: Clear view function + //#####################################################################// + function clearView() + { + var visualizationScript = d3.select(".visualizationScript"); + if (visualizationScript){visualizationScript.remove();} + var mainPage = document.getElementById("mainPage"); + if (mainPage){mainPage.remove();} + var tutorial = document.getElementById("tutorial"); + if (tutorial){tutorial.remove();} + var ackn = document.getElementById("acknowledgements"); + if (ackn){ackn.remove();} + var xdsm = d3.select(".xdsmDiv"); + if (xdsm){xdsm.remove();} + var edgeBundles = d3.select(".edgeBundlesDiv"); + if (edgeBundles){edgeBundles.remove();} + var sankeyDiagram = d3.select(".sankeyDiagramDiv"); + if (sankeyDiagram){sankeyDiagram.remove();} + } + //#####################################################################// + + function xdsm_script(data,graphID) + { + (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ + // https://d3js.org Version 4.3.0. Copyright 2016 Mike Bostock. + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { 'use strict'; + + var version = "4.3.0"; + + var ascending = function(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + }; + + var bisector = function(compare) { + if (compare.length === 1) compare = ascendingComparator(compare); + return { + left: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + }, + right: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + }; + }; + + function ascendingComparator(f) { + return function(d, x) { + return ascending(f(d), x); + }; + } + + var ascendingBisect = bisector(ascending); + var bisectRight = ascendingBisect.right; + var bisectLeft = ascendingBisect.left; + + var descending = function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + }; + + var number = function(x) { + return x === null ? NaN : +x; + }; + + var variance = function(array, f) { + var n = array.length, + m = 0, + a, + d, + s = 0, + i = -1, + j = 0; + + if (f == null) { + while (++i < n) { + if (!isNaN(a = number(array[i]))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } + + else { + while (++i < n) { + if (!isNaN(a = number(f(array[i], i, array)))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } + + if (j > 1) return s / (j - 1); + }; + + var deviation = function(array, f) { + var v = variance(array, f); + return v ? Math.sqrt(v) : v; + }; + + var extent = function(array, f) { + var i = -1, + n = array.length, + a, + b, + c; + + if (f == null) { + while (++i < n) if ((b = array[i]) != null && b >= b) { a = c = b; break; } + while (++i < n) if ((b = array[i]) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } + + else { + while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = c = b; break; } + while (++i < n) if ((b = f(array[i], i, array)) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } + + return [a, c]; + }; + + var array = Array.prototype; + + var slice = array.slice; + var map = array.map; + + var constant$1 = function(x) { + return function() { + return x; + }; + }; + + var identity = function(x) { + return x; + }; + + var range = function(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; + }; + + var e10 = Math.sqrt(50); + var e5 = Math.sqrt(10); + var e2 = Math.sqrt(2); + + var ticks = function(start, stop, count) { + var step = tickStep(start, stop, count); + return range( + Math.ceil(start / step) * step, + Math.floor(stop / step) * step + step / 2, // inclusive + step + ); + }; + + function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; + } + + var sturges = function(values) { + return Math.ceil(Math.log(values.length) / Math.LN2) + 1; + }; + + var histogram = function() { + var value = identity, + domain = extent, + threshold = sturges; + + function histogram(data) { + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) tz = ticks(x0, x1, tz); + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] >= x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(_), histogram) : value; + }; + + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant$1([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$1(slice.call(_)) : constant$1(_), histogram) : threshold; + }; + + return histogram; + }; + + var threshold = function(array, p, f) { + if (f == null) f = number; + if (!(n = array.length)) return; + if ((p = +p) <= 0 || n < 2) return +f(array[0], 0, array); + if (p >= 1) return +f(array[n - 1], n - 1, array); + var n, + h = (n - 1) * p, + i = Math.floor(h), + a = +f(array[i], i, array), + b = +f(array[i + 1], i + 1, array); + return a + (b - a) * (h - i); + }; + + var freedmanDiaconis = function(values, min, max) { + values = map.call(values, number).sort(ascending); + return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3))); + }; + + var scott = function(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); + }; + + var max = function(array, f) { + var i = -1, + n = array.length, + a, + b; + + if (f == null) { + while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; } + while (++i < n) if ((b = array[i]) != null && b > a) a = b; + } + + else { + while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; } + while (++i < n) if ((b = f(array[i], i, array)) != null && b > a) a = b; + } + + return a; + }; + + var mean = function(array, f) { + var s = 0, + n = array.length, + a, + i = -1, + j = n; + + if (f == null) { + while (++i < n) if (!isNaN(a = number(array[i]))) s += a; else --j; + } + + else { + while (++i < n) if (!isNaN(a = number(f(array[i], i, array)))) s += a; else --j; + } + + if (j) return s / j; + }; + + var median = function(array, f) { + var numbers = [], + n = array.length, + a, + i = -1; + + if (f == null) { + while (++i < n) if (!isNaN(a = number(array[i]))) numbers.push(a); + } + + else { + while (++i < n) if (!isNaN(a = number(f(array[i], i, array)))) numbers.push(a); + } + + return threshold(numbers.sort(ascending), 0.5); + }; + + var merge = function(arrays) { + var n = arrays.length, + m, + i = -1, + j = 0, + merged, + array; + + while (++i < n) j += arrays[i].length; + merged = new Array(j); + + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + + return merged; + }; + + var min = function(array, f) { + var i = -1, + n = array.length, + a, + b; + + if (f == null) { + while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; } + while (++i < n) if ((b = array[i]) != null && a > b) a = b; + } + + else { + while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; } + while (++i < n) if ((b = f(array[i], i, array)) != null && a > b) a = b; + } + + return a; + }; + + var pairs = function(array) { + var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = [p, p = array[++i]]; + return pairs; + }; + + var permute = function(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; + }; + + var scan = function(array, compare) { + if (!(n = array.length)) return; + var i = 0, + n, + j = 0, + xi, + xj = array[j]; + + if (!compare) compare = ascending; + + while (++i < n) if (compare(xi = array[i], xj) < 0 || compare(xj, xj) !== 0) xj = xi, j = i; + + if (compare(xj, xj) === 0) return j; + }; + + var shuffle = function(array, i0, i1) { + var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + + return array; + }; + + var sum = function(array, f) { + var s = 0, + n = array.length, + a, + i = -1; + + if (f == null) { + while (++i < n) if (a = +array[i]) s += a; // Note: zero and null are equivalent. + } + + else { + while (++i < n) if (a = +f(array[i], i, array)) s += a; + } + + return s; + }; + + var transpose = function(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; + }; + + function length(d) { + return d.length; + } + + var zip = function() { + return transpose(arguments); + }; + + var prefix = "$"; + + function Map() {} + + Map.prototype = map$1.prototype = { + constructor: Map, + has: function(key) { + return (prefix + key) in this; + }, + get: function(key) { + return this[prefix + key]; + }, + set: function(key, value) { + this[prefix + key] = value; + return this; + }, + remove: function(key) { + var property = prefix + key; + return property in this && delete this[property]; + }, + clear: function() { + for (var property in this) if (property[0] === prefix) delete this[property]; + }, + keys: function() { + var keys = []; + for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); + return keys; + }, + values: function() { + var values = []; + for (var property in this) if (property[0] === prefix) values.push(this[property]); + return values; + }, + entries: function() { + var entries = []; + for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); + return entries; + }, + size: function() { + var size = 0; + for (var property in this) if (property[0] === prefix) ++size; + return size; + }, + empty: function() { + for (var property in this) if (property[0] === prefix) return false; + return true; + }, + each: function(f) { + for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); + } + }; + + function map$1(object, f) { + var map = new Map; + + // Copy constructor. + if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); + + // Index array by numeric index or specified key function. + else if (Array.isArray(object)) { + var i = -1, + n = object.length, + o; + + if (f == null) while (++i < n) map.set(i, object[i]); + else while (++i < n) map.set(f(o = object[i], i, object), o); + } + + // Convert object to map. + else if (object) for (var key in object) map.set(key, object[key]); + + return map; + } + + var nest = function() { + var keys = [], + sortKeys = [], + sortValues, + rollup, + nest; + + function apply(array, depth, createResult, setResult) { + if (depth >= keys.length) return rollup != null + ? rollup(array) : (sortValues != null + ? array.sort(sortValues) + : array); + + var i = -1, + n = array.length, + key = keys[depth++], + keyValue, + value, + valuesByKey = map$1(), + values, + result = createResult(); + + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { + values.push(value); + } else { + valuesByKey.set(keyValue, [value]); + } + } + + valuesByKey.each(function(values, key) { + setResult(result, key, apply(values, depth, createResult, setResult)); + }); + + return result; + } + + function entries(map, depth) { + if (++depth > keys.length) return map; + var array, sortKey = sortKeys[depth - 1]; + if (rollup != null && depth >= keys.length) array = map.entries(); + else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); }); + return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array; + } + + return nest = { + object: function(array) { return apply(array, 0, createObject, setObject); }, + map: function(array) { return apply(array, 0, createMap, setMap); }, + entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); }, + key: function(d) { keys.push(d); return nest; }, + sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; }, + sortValues: function(order) { sortValues = order; return nest; }, + rollup: function(f) { rollup = f; return nest; } + }; + }; + + function createObject() { + return {}; + } + + function setObject(object, key, value) { + object[key] = value; + } + + function createMap() { + return map$1(); + } + + function setMap(map, key, value) { + map.set(key, value); + } + + function Set() {} + + var proto = map$1.prototype; + + Set.prototype = set.prototype = { + constructor: Set, + has: proto.has, + add: function(value) { + value += ""; + this[prefix + value] = value; + return this; + }, + remove: proto.remove, + clear: proto.clear, + values: proto.keys, + size: proto.size, + empty: proto.empty, + each: proto.each + }; + + function set(object, f) { + var set = new Set; + + // Copy constructor. + if (object instanceof Set) object.each(function(value) { set.add(value); }); + + // Otherwise, assume it’s an array. + else if (object) { + var i = -1, n = object.length; + if (f == null) while (++i < n) set.add(object[i]); + else while (++i < n) set.add(f(object[i], i, object)); + } + + return set; + } + + var keys = function(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; + }; + + var values = function(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; + }; + + var entries = function(map) { + var entries = []; + for (var key in map) entries.push({key: key, value: map[key]}); + return entries; + }; + + var uniform = function(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function() { + return Math.random() * max + min; + }; + }; + + var normal = function(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function() { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = Math.random() * 2 - 1; + y = Math.random() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + }; + + var logNormal = function() { + var randomNormal = normal.apply(this, arguments); + return function() { + return Math.exp(randomNormal()); + }; + }; + + var irwinHall = function(n) { + return function() { + for (var sum = 0, i = 0; i < n; ++i) sum += Math.random(); + return sum; + }; + }; + + var bates = function(n) { + var randomIrwinHall = irwinHall(n); + return function() { + return randomIrwinHall() / n; + }; + }; + + var exponential = function(lambda) { + return function() { + return -Math.log(1 - Math.random()) / lambda; + }; + }; + + function linear(t) { + return +t; + } + + function quadIn(t) { + return t * t; + } + + function quadOut(t) { + return t * (2 - t); + } + + function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; + } + + function cubicIn(t) { + return t * t * t; + } + + function cubicOut(t) { + return --t * t * t + 1; + } + + function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; + } + + var exponent = 3; + + var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; + })(exponent); + + var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; + })(exponent); + + var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; + })(exponent); + + var pi = Math.PI; + var halfPi = pi / 2; + + function sinIn(t) { + return 1 - Math.cos(t * halfPi); + } + + function sinOut(t) { + return Math.sin(t * halfPi); + } + + function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; + } + + function expIn(t) { + return Math.pow(2, 10 * t - 10); + } + + function expOut(t) { + return 1 - Math.pow(2, -10 * t); + } + + function expInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; + } + + function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); + } + + function circleOut(t) { + return Math.sqrt(1 - --t * t); + } + + function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; + } + + var b1 = 4 / 11; + var b2 = 6 / 11; + var b3 = 8 / 11; + var b4 = 3 / 4; + var b5 = 9 / 11; + var b6 = 10 / 11; + var b7 = 15 / 16; + var b8 = 21 / 22; + var b9 = 63 / 64; + var b0 = 1 / b1 / b1; + + function bounceIn(t) { + return 1 - bounceOut(1 - t); + } + + function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; + } + + function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; + } + + var overshoot = 1.70158; + + var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return t * t * ((s + 1) * t - s); + } + + backIn.overshoot = custom; + + return backIn; + })(overshoot); + + var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((s + 1) * t + s) + 1; + } + + backOut.overshoot = custom; + + return backOut; + })(overshoot); + + var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; + })(overshoot); + + var tau = 2 * Math.PI; + var amplitude = 1; + var period = 0.3; + + var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function(a) { return custom(a, p * tau); }; + elasticIn.period = function(p) { return custom(a, p); }; + + return elasticIn; + })(amplitude, period); + + var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticOut.period = function(p) { return custom(a, p); }; + + return elasticOut; + })(amplitude, period); + + var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) + : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticInOut.period = function(p) { return custom(a, p); }; + + return elasticInOut; + })(amplitude, period); + + var area = function(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; + }; + + var centroid = function(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; + }; + + // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of + // the 3D cross product in a quadrant I Cartesian coordinate system (+x is + // right, +y is up). Returns a positive value if ABC is counter-clockwise, + // negative if clockwise, and zero if the points are collinear. + var cross = function(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + }; + + function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; + } + + // Computes the upper convex hull per the monotone chain algorithm. + // Assumes points.length >= 3, is sorted by x, unique in y. + // Returns an array of indices into points in left-to-right order. + function computeUpperHullIndexes(points) { + var n = points.length, + indexes = [0, 1], + size = 2; + + for (var i = 2; i < n; ++i) { + while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points + } + + var hull = function(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; + }; + + var contains = function(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; + }; + + var length$1 = function(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.sqrt(xa * xa + ya * ya); + } + + return perimeter; + }; + + var pi$1 = Math.PI; + var tau$1 = 2 * pi$1; + var epsilon = 1e-6; + var tauEpsilon = tau$1 - epsilon; + + function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = []; + } + + function path() { + return new Path; + } + + Path.prototype = path.prototype = { + constructor: Path, + moveTo: function(x, y) { + this._.push("M", this._x0 = this._x1 = +x, ",", this._y0 = this._y1 = +y); + }, + closePath: function() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._.push("Z"); + } + }, + lineTo: function(x, y) { + this._.push("L", this._x1 = +x, ",", this._y1 = +y); + }, + quadraticCurveTo: function(x1, y1, x, y) { + this._.push("Q", +x1, ",", +y1, ",", this._x1 = +x, ",", this._y1 = +y); + }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { + this._.push("C", +x1, ",", +y1, ",", +x2, ",", +y2, ",", this._x1 = +x, ",", this._y1 = +y); + }, + arcTo: function(x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._.push( + "M", this._x1 = x1, ",", this._y1 = y1 + ); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon)) {} + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { + this._.push( + "L", this._x1 = x1, ",", this._y1 = y1 + ); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi$1 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon) { + this._.push( + "L", x1 + t01 * x01, ",", y1 + t01 * y01 + ); + } + + this._.push( + "A", r, ",", r, ",0,0,", +(y01 * x20 > x01 * y20), ",", this._x1 = x1 + t21 * x21, ",", this._y1 = y1 + t21 * y21 + ); + } + }, + arc: function(x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._.push( + "M", x0, ",", y0 + ); + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { + this._.push( + "L", x0, ",", y0 + ); + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._.push( + "A", r, ",", r, ",0,1,", cw, ",", x - dx, ",", y - dy, + "A", r, ",", r, ",0,1,", cw, ",", this._x1 = x0, ",", this._y1 = y0 + ); + } + + // Otherwise, draw an arc! + else { + if (da < 0) da = da % tau$1 + tau$1; + this._.push( + "A", r, ",", r, ",0,", +(da >= pi$1), ",", cw, ",", this._x1 = x + r * Math.cos(a1), ",", this._y1 = y + r * Math.sin(a1) + ); + } + }, + rect: function(x, y, w, h) { + this._.push("M", this._x0 = this._x1 = +x, ",", this._y0 = this._y1 = +y, "h", +w, "v", +h, "h", -w, "Z"); + }, + toString: function() { + return this._.join(""); + } + }; + + var tree_add = function(d) { + var x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); + }; + + function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; + } + + function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, inherit the existing extent. + if (x1 < x0) x0 = this._x0, x1 = this._x1; + if (y1 < y0) y0 = this._y0, y1 = this._y1; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; + } + + var tree_cover = function(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else if (x0 > x || x > x1 || y0 > y || y > y1) { + var z = x1 - x0, + node = this._root, + parent, + i; + + switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) { + case 0: { + do parent = new Array(4), parent[i] = node, node = parent; + while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1); + break; + } + case 1: { + do parent = new Array(4), parent[i] = node, node = parent; + while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1); + break; + } + case 2: { + do parent = new Array(4), parent[i] = node, node = parent; + while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y); + break; + } + case 3: { + do parent = new Array(4), parent[i] = node, node = parent; + while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y); + break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + // If the quadtree covers the point already, just return. + else return this; + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; + }; + + var tree_data = function() { + var data = []; + this.visit(function(node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; + }; + + var tree_extent = function(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; + }; + + var Quad = function(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; + }; + + var tree_find = function(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; + }; + + var tree_remove = function(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; + }; + + function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; + } + + var tree_root = function() { + return this._root; + }; + + var tree_size = function() { + var size = 0; + this.visit(function(node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; + }; + + var tree_visit = function(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; + }; + + var tree_visitAfter = function(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; + }; + + function defaultX(d) { + return d[0]; + } + + var tree_x = function(_) { + return arguments.length ? (this._x = _, this) : this._x; + }; + + function defaultY(d) { + return d[1]; + } + + var tree_y = function(_) { + return arguments.length ? (this._y = _, this) : this._y; + }; + + function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); + } + + function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; + } + + function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; + } + + var treeProto = quadtree.prototype = Quadtree.prototype; + + treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; + }; + + treeProto.add = tree_add; + treeProto.addAll = addAll; + treeProto.cover = tree_cover; + treeProto.data = tree_data; + treeProto.extent = tree_extent; + treeProto.find = tree_find; + treeProto.remove = tree_remove; + treeProto.removeAll = removeAll; + treeProto.root = tree_root; + treeProto.size = tree_size; + treeProto.visit = tree_visit; + treeProto.visitAfter = tree_visitAfter; + treeProto.x = tree_x; + treeProto.y = tree_y; + + var slice$1 = [].slice; + + var noabort = {}; + + function Queue(size) { + if (!(size >= 1)) throw new Error; + this._size = size; + this._call = + this._error = null; + this._tasks = []; + this._data = []; + this._waiting = + this._active = + this._ended = + this._start = 0; // inside a synchronous task callback? + } + + Queue.prototype = queue.prototype = { + constructor: Queue, + defer: function(callback) { + if (typeof callback !== "function" || this._call) throw new Error; + if (this._error != null) return this; + var t = slice$1.call(arguments, 1); + t.push(callback); + ++this._waiting, this._tasks.push(t); + poke(this); + return this; + }, + abort: function() { + if (this._error == null) abort(this, new Error("abort")); + return this; + }, + await: function(callback) { + if (typeof callback !== "function" || this._call) throw new Error; + this._call = function(error, results) { callback.apply(null, [error].concat(results)); }; + maybeNotify(this); + return this; + }, + awaitAll: function(callback) { + if (typeof callback !== "function" || this._call) throw new Error; + this._call = callback; + maybeNotify(this); + return this; + } + }; + + function poke(q) { + if (!q._start) { + try { start(q); } // let the current task complete + catch (e) { + if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously + else if (!q._data) throw e; // await callback errored synchronously + } + } + } + + function start(q) { + while (q._start = q._waiting && q._active < q._size) { + var i = q._ended + q._active, + t = q._tasks[i], + j = t.length - 1, + c = t[j]; + t[j] = end(q, i); + --q._waiting, ++q._active; + t = c.apply(null, t); + if (!q._tasks[i]) continue; // task finished synchronously + q._tasks[i] = t || noabort; + } + } + + function end(q, i) { + return function(e, r) { + if (!q._tasks[i]) return; // ignore multiple callbacks + --q._active, ++q._ended; + q._tasks[i] = null; + if (q._error != null) return; // ignore secondary errors + if (e != null) { + abort(q, e); + } else { + q._data[i] = r; + if (q._waiting) poke(q); + else maybeNotify(q); + } + }; + } + + function abort(q, e) { + var i = q._tasks.length, t; + q._error = e; // ignore active callbacks + q._data = undefined; // allow gc + q._waiting = NaN; // prevent starting + + while (--i >= 0) { + if (t = q._tasks[i]) { + q._tasks[i] = null; + if (t.abort) { + try { t.abort(); } + catch (e) { /* ignore */ } + } + } + } + + q._active = NaN; // allow notification + maybeNotify(q); + } + + function maybeNotify(q) { + if (!q._active && q._call) { + var d = q._data; + q._data = undefined; // allow gc + q._call(q._error, d); + } + } + + function queue(concurrency) { + return new Queue(arguments.length ? +concurrency : Infinity); + } + + var constant$2 = function(x) { + return function constant() { + return x; + }; + }; + + var epsilon$1 = 1e-12; + var pi$2 = Math.PI; + var halfPi$1 = pi$2 / 2; + var tau$2 = 2 * pi$2; + + function arcInnerRadius(d) { + return d.innerRadius; + } + + function arcOuterRadius(d) { + return d.outerRadius; + } + + function arcStartAngle(d) { + return d.startAngle; + } + + function arcEndAngle(d) { + return d.endAngle; + } + + function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! + } + + function asin(x) { + return x >= 1 ? halfPi$1 : x <= -1 ? -halfPi$1 : Math.asin(x); + } + + function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10); + return [x0 + t * x10, y0 + t * y10]; + } + + // Compute perpendicular offset line of length rc. + // http://mathworld.wolfram.com/Circle-LineIntersection.html + function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; + } + + var arc = function() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant$2(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi$1, + a1 = endAngle.apply(this, arguments) - halfPi$1, + da = Math.abs(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon$1)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau$2 - epsilon$1) { + context.moveTo(r1 * Math.cos(a0), r1 * Math.sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon$1) { + context.moveTo(r0 * Math.cos(a1), r0 * Math.sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon$1) && (padRadius ? +padRadius.apply(this, arguments) : Math.sqrt(r0 * r0 + r1 * r1)), + rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon$1) { + var p0 = asin(rp / r0 * Math.sin(ap)), + p1 = asin(rp / r1 * Math.sin(ap)); + if ((da0 -= p0 * 2) > epsilon$1) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon$1) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * Math.cos(a01), + y01 = r1 * Math.sin(a01), + x10 = r0 * Math.cos(a10), + y10 = r0 * Math.sin(a10); + + // Apply rounded corners? + if (rc > epsilon$1) { + var x11 = r1 * Math.cos(a11), + y11 = r1 * Math.sin(a11), + x00 = r0 * Math.cos(a00), + y00 = r0 * Math.sin(a00); + + // Restrict the corner radius according to the sector angle. + if (da < pi$2) { + var oc = da0 > epsilon$1 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10], + ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), + lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = Math.min(rc, (r0 - lc) / (kc - 1)); + rc1 = Math.min(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon$1)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon$1) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, Math.atan2(t0.y01, t0.x01), Math.atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, Math.atan2(t0.y01, t0.x01), Math.atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, Math.atan2(t0.cy + t0.y11, t0.cx + t0.x11), Math.atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, Math.atan2(t1.y11, t1.x11), Math.atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon$1) || !(da0 > epsilon$1)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon$1) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, Math.atan2(t0.y01, t0.x01), Math.atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, Math.atan2(t0.y01, t0.x01), Math.atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, Math.atan2(t0.cy + t0.y11, t0.cx + t0.x11), Math.atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, Math.atan2(t1.y11, t1.x11), Math.atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$2 / 2; + return [Math.cos(a) * r, Math.sin(a) * r]; + }; + + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$2(+_), arc) : innerRadius; + }; + + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$2(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$2(+_), arc) : cornerRadius; + }; + + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$2(+_), arc) : padRadius; + }; + + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$2(+_), arc) : startAngle; + }; + + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$2(+_), arc) : endAngle; + }; + + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$2(+_), arc) : padAngle; + }; + + arc.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; + }; + + function Linear(context) { + this._context = context; + } + + Linear.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: this._context.lineTo(x, y); break; + } + } + }; + + var curveLinear = function(context) { + return new Linear(context); + }; + + function x(p) { + return p[0]; + } + + function y(p) { + return p[1]; + } + + var line = function() { + var x$$1 = x, + y$$1 = y, + defined = constant$2(true), + context = null, + curve = curveLinear, + output = null; + + function line(data) { + var i, + n = data.length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function(_) { + return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$2(+_), line) : x$$1; + }; + + line.y = function(_) { + return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$2(+_), line) : y$$1; + }; + + line.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$2(!!_), line) : defined; + }; + + line.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; + }; + + var area$1 = function() { + var x0 = x, + x1 = null, + y0 = constant$2(0), + y1 = y, + defined = constant$2(true), + context = null, + curve = curveLinear, + output = null; + + function area(data) { + var i, + j, + k, + n = data.length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$2(+_), x1 = null, area) : x0; + }; + + area.x0 = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$2(+_), area) : x0; + }; + + area.x1 = function(_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$2(+_), area) : x1; + }; + + area.y = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$2(+_), y1 = null, area) : y0; + }; + + area.y0 = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$2(+_), area) : y0; + }; + + area.y1 = function(_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$2(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function() { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function() { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function() { + return arealine().x(x1).y(y0); + }; + + area.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$2(!!_), area) : defined; + }; + + area.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; + }; + + var descending$1 = function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + }; + + var identity$1 = function(d) { + return d; + }; + + var pie = function() { + var value = identity$1, + sortValues = descending$1, + sort = null, + startAngle = constant$2(0), + endAngle = constant$2(tau$2), + padAngle = constant$2(0); + + function pie(data) { + var i, + n = data.length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau$2, Math.max(-tau$2, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); + else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$2(+_), pie) : value; + }; + + pie.sortValues = function(_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function(_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$2(+_), pie) : startAngle; + }; + + pie.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$2(+_), pie) : endAngle; + }; + + pie.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$2(+_), pie) : padAngle; + }; + + return pie; + }; + + var curveRadialLinear = curveRadial(curveLinear); + + function Radial(curve) { + this._curve = curve; + } + + Radial.prototype = { + areaStart: function() { + this._curve.areaStart(); + }, + areaEnd: function() { + this._curve.areaEnd(); + }, + lineStart: function() { + this._curve.lineStart(); + }, + lineEnd: function() { + this._curve.lineEnd(); + }, + point: function(a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } + }; + + function curveRadial(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; + } + + function radialLine(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return l; + } + + var radialLine$1 = function() { + return radialLine(line().curve(curveRadialLinear)); + }; + + var radialArea = function() { + var a = area$1().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function() { return radialLine(x0()); }, delete a.lineX0; + a.lineEndAngle = function() { return radialLine(x1()); }, delete a.lineX1; + a.lineInnerRadius = function() { return radialLine(y0()); }, delete a.lineY0; + a.lineOuterRadius = function() { return radialLine(y1()); }, delete a.lineY1; + + a.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return a; + }; + + var circle = { + draw: function(context, size) { + var r = Math.sqrt(size / pi$2); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau$2); + } + }; + + var cross$1 = { + draw: function(context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } + }; + + var tan30 = Math.sqrt(1 / 3); + var tan30_2 = tan30 * 2; + + var diamond = { + draw: function(context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } + }; + + var ka = 0.89081309152928522810; + var kr = Math.sin(pi$2 / 10) / Math.sin(7 * pi$2 / 10); + var kx = Math.sin(tau$2 / 10) * kr; + var ky = -Math.cos(tau$2 / 10) * kr; + + var star = { + draw: function(context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau$2 * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } + }; + + var square = { + draw: function(context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } + }; + + var sqrt3 = Math.sqrt(3); + + var triangle = { + draw: function(context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } + }; + + var c = -0.5; + var s = Math.sqrt(3) / 2; + var k = 1 / Math.sqrt(12); + var a = (k / 2 + 1) * 3; + + var wye = { + draw: function(context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); + } + }; + + var symbols = [ + circle, + cross$1, + diamond, + square, + star, + triangle, + wye + ]; + + var symbol = function() { + var type = constant$2(circle), + size = constant$2(64), + context = null; + + function symbol() { + var buffer; + if (!context) context = buffer = path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function(_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant$2(_), symbol) : type; + }; + + symbol.size = function(_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant$2(+_), symbol) : size; + }; + + symbol.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; + }; + + var noop = function() {}; + + function point(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); + } + + function Basis(context) { + this._context = context; + } + + Basis.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 3: point(this, this._x1, this._y1); // proceed + case 2: this._context.lineTo(this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: point(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + var basis = function(context) { + return new Basis(context); + }; + + function BasisClosed(context) { + this._context = context; + } + + BasisClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x2 = x, this._y2 = y; break; + case 1: this._point = 2; this._x3 = x, this._y3 = y; break; + case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; + default: point(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + var basisClosed = function(context) { + return new BasisClosed(context); + }; + + function BasisOpen(context) { + this._context = context; + } + + BasisOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; + case 3: this._point = 4; // proceed + default: point(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + var basisOpen = function(context) { + return new BasisOpen(context); + }; + + function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; + } + + Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + + var bundle = (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function(beta) { + return custom(+beta); + }; + + return bundle; + })(0.85); + + function point$1(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); + } + + function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + Cardinal.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: point$1(this, this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; this._x1 = x, this._y1 = y; break; + case 2: this._point = 3; // proceed + default: point$1(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinal = (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$1(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalClosed = (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$1(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalOpen = (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function point$2(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon$1) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon$1) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); + } + + function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRom.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: this.point(this._x2, this._y2); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; // proceed + default: point$2(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$2(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$2(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function LinearClosed(context) { + this._context = context; + } + + LinearClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._point) this._context.closePath(); + }, + point: function(x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } + }; + + var linearClosed = function(context) { + return new LinearClosed(context); + }; + + function sign(x) { + return x < 0 ? -1 : 1; + } + + // Calculate the slopes of the tangents (Hermite-type interpolation) based on + // the following paper: Steffen, M. 1990. A Simple Method for Monotonic + // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. + // NOV(II), P. 443, 1990. + function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; + } + + // Calculate a one-sided slope. + function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; + } + + // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations + // "you can express cubic Hermite interpolation in terms of cubic Bézier curves + // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". + function point$3(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); + } + + function MonotoneX(context) { + this._context = context; + } + + MonotoneX.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x1, this._y1); break; + case 3: point$3(this, this._t0, slope2(this, this._t0)); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point$3(this, this._t0, t1 = slope3(this, x, y)); break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } + }; + + function MonotoneY(context) { + this._context = new ReflectContext(context); + } + + (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { + MonotoneX.prototype.point.call(this, y, x); + }; + + function ReflectContext(context) { + this._context = context; + } + + ReflectContext.prototype = { + moveTo: function(x, y) { this._context.moveTo(y, x); }, + closePath: function() { this._context.closePath(); }, + lineTo: function(x, y) { this._context.lineTo(y, x); }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } + }; + + function monotoneX(context) { + return new MonotoneX(context); + } + + function monotoneY(context) { + return new MonotoneY(context); + } + + function Natural(context) { + this._context = context; + } + + Natural.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = []; + this._y = []; + }, + lineEnd: function() { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + + // See https://www.particleincell.com/2012/bezier-splines/ for derivation. + function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; + } + + var natural = function(context) { + return new Natural(context); + }; + + function Step(context, t) { + this._context = context; + this._t = t; + } + + Step.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function() { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } + }; + + var step = function(context) { + return new Step(context, 0.5); + }; + + function stepBefore(context) { + return new Step(context, 0); + } + + function stepAfter(context) { + return new Step(context, 1); + } + + var slice$2 = Array.prototype.slice; + + var none = function(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (var j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } + }; + + var none$1 = function(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; + }; + + function stackValue(d, key) { + return d[key]; + } + + var stack = function() { + var keys = constant$2([]), + order = none$1, + offset = none, + value = stackValue; + + function stack(data) { + var kz = keys.apply(this, arguments), + i, + m = data.length, + n = kz.length, + sz = new Array(n), + oz; + + for (i = 0; i < n; ++i) { + for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { + si[j] = sij = [0, +value(data[j], ki, j, data)]; + sij.data = data[j]; + } + si.key = ki; + } + + for (i = 0, oz = order(sz); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function(_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant$2(slice$2.call(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$2(+_), stack) : value; + }; + + stack.order = function(_) { + return arguments.length ? (order = _ == null ? none$1 : typeof _ === "function" ? _ : constant$2(slice$2.call(_)), stack) : order; + }; + + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? none : _, stack) : offset; + }; + + return stack; + }; + + var expand = function(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none(series, order); + }; + + var silhouette = function(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none(series, order); + }; + + var wiggle = function(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none(series, order); + }; + + var ascending$1 = function(series) { + var sums = series.map(sum$1); + return none$1(series).sort(function(a, b) { return sums[a] - sums[b]; }); + }; + + function sum$1(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; + } + + var descending$2 = function(series) { + return ascending$1(series).reverse(); + }; + + var insideOut = function(series) { + var n = series.length, + i, + j, + sums = series.map(sum$1), + order = none$1(series).sort(function(a, b) { return sums[b] - sums[a]; }), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); + }; + + var reverse = function(series) { + return none$1(series).reverse(); + }; + + var define = function(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; + }; + + function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; + } + + function Color() {} + + var darker = 0.7; + var brighter = 1 / darker; + + var reHex3 = /^#([0-9a-f]{3})$/; + var reHex6 = /^#([0-9a-f]{6})$/; + var reRgbInteger = /^rgb\(\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*\)$/; + var reRgbPercent = /^rgb\(\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*\)$/; + var reRgbaInteger = /^rgba\(\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*,\s*([-+]?\d+(?:\.\d+)?)\s*\)$/; + var reRgbaPercent = /^rgba\(\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)\s*\)$/; + var reHslPercent = /^hsl\(\s*([-+]?\d+(?:\.\d+)?)\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*\)$/; + var reHslaPercent = /^hsla\(\s*([-+]?\d+(?:\.\d+)?)\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)\s*\)$/; + + var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }; + + define(Color, color, { + displayable: function() { + return this.rgb().displayable(); + }, + toString: function() { + return this.rgb() + ""; + } + }); + + function color(format) { + var m; + format = (format + "").trim().toLowerCase(); + return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00 + : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000 + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; + } + + function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); + } + + function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); + } + + function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); + } + + function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); + } + + function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; + } + + define(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return (0 <= this.r && this.r <= 255) + && (0 <= this.g && this.g <= 255) + && (0 <= this.b && this.b <= 255) + && (0 <= this.opacity && this.opacity <= 1); + }, + toString: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); + } + })); + + function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); + } + + function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); + } + + function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); + } + + function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + + define(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + } + })); + + /* From FvD 13.37, CSS Color Module Level 3 */ + function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; + } + + var deg2rad = Math.PI / 180; + var rad2deg = 180 / Math.PI; + + var Kn = 18; + var Xn = 0.950470; + var Yn = 1; + var Zn = 1.088830; + var t0 = 4 / 29; + var t1 = 6 / 29; + var t2 = 3 * t1 * t1; + var t3 = t1 * t1 * t1; + + function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) { + var h = o.h * deg2rad; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); + } + if (!(o instanceof Rgb)) o = rgbConvert(o); + var b = rgb2xyz(o.r), + a = rgb2xyz(o.g), + l = rgb2xyz(o.b), + x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), + y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), + z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn); + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); + } + + function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); + } + + function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; + } + + define(Lab, lab, extend(Color, { + brighter: function(k) { + return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function() { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + y = Yn * lab2xyz(y); + x = Xn * lab2xyz(x); + z = Zn * lab2xyz(z); + return new Rgb( + xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB + xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), + xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z), + this.opacity + ); + } + })); + + function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; + } + + function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); + } + + function xyz2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); + } + + function rgb2xyz(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); + } + + function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + var h = Math.atan2(o.b, o.a) * rad2deg; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); + } + + function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); + } + + function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; + } + + define(Hcl, hcl, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return labConvert(this).rgb(); + } + })); + + var A = -0.14861; + var B = +1.78277; + var C = -0.29227; + var D = -0.90649; + var E = +1.97294; + var ED = E * D; + var EB = E * B; + var BC_DA = B * C - D * A; + + function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); + } + + function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); + } + + function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + + define(Cubehelix, cubehelix, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } + })); + + function basis$1(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; + } + + var basis$2 = function(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis$1((t - i / n) * n, v0, v1, v2, v3); + }; + }; + + var basisClosed$1 = function(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis$1((t - i / n) * n, v0, v1, v2, v3); + }; + }; + + var constant$3 = function(x) { + return function() { + return x; + }; + }; + + function linear$1(a, d) { + return function(t) { + return a + t * d; + }; + } + + function exponential$1(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; + } + + function hue(a, b) { + var d = b - a; + return d ? linear$1(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a); + } + + function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential$1(a, b, y) : constant$3(isNaN(a) ? b : a); + }; + } + + function nogamma(a, b) { + var d = b - a; + return d ? linear$1(a, d) : constant$3(isNaN(a) ? b : a); + } + + var interpolateRgb = (function rgbGamma(y) { + var color$$1 = gamma(y); + + function rgb$$1(start, end) { + var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r), + g = color$$1(start.g, end.g), + b = color$$1(start.b, end.b), + opacity = color$$1(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb$$1.gamma = rgbGamma; + + return rgb$$1; + })(1); + + function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color$$1; + for (i = 0; i < n; ++i) { + color$$1 = rgb(colors[i]); + r[i] = color$$1.r || 0; + g[i] = color$$1.g || 0; + b[i] = color$$1.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color$$1.opacity = 1; + return function(t) { + color$$1.r = r(t); + color$$1.g = g(t); + color$$1.b = b(t); + return color$$1 + ""; + }; + }; + } + + var rgbBasis = rgbSpline(basis$2); + var rgbBasisClosed = rgbSpline(basisClosed$1); + + var array$1 = function(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(nb), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function(t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; + }; + + var date = function(a, b) { + var d = new Date; + return a = +a, b -= a, function(t) { + return d.setTime(a + b * t), d; + }; + }; + + var interpolateNumber = function(a, b) { + return a = +a, b -= a, function(t) { + return a + b * t; + }; + }; + + var object = function(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = interpolate(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; + }; + + var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; + var reB = new RegExp(reA.source, "g"); + + function zero(b) { + return function() { + return b; + }; + } + + function one(b) { + return function(t) { + return b(t) + ""; + }; + } + + var interpolateString = function(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: interpolateNumber(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); + }; + + var interpolate = function(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant$3(b) + : (t === "number" ? interpolateNumber + : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString) + : b instanceof color ? interpolateRgb + : b instanceof Date ? date + : Array.isArray(b) ? array$1 + : isNaN(b) ? object + : interpolateNumber)(a, b); + }; + + var interpolateRound = function(a, b) { + return a = +a, b -= a, function(t) { + return Math.round(a + b * t); + }; + }; + + var degrees = 180 / Math.PI; + + var identity$2 = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 + }; + + var decompose = function(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; + }; + + var cssNode; + var cssRoot; + var cssView; + var svgNode; + + function parseCss(value) { + if (value === "none") return identity$2; + if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; + cssNode.style.transform = value; + value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); + cssRoot.removeChild(cssNode); + value = value.slice(7, -1).split(","); + return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); + } + + function parseSvg(value) { + if (value == null) return identity$2; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); + } + + function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; + } + + var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); + var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + + var rho = Math.SQRT2; + var rho2 = 2; + var rho4 = 4; + var epsilon2 = 1e-12; + + function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; + } + + function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; + } + + function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); + } + + // p0 = [ux0, uy0, w0] + // p1 = [ux1, uy1, w1] + var interpolateZoom = function(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000; + + return i; + }; + + function hsl$1(hue$$1) { + return function(start, end) { + var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hsl$2 = hsl$1(hue); + var hslLong = hsl$1(nogamma); + + function lab$1(start, end) { + var l = nogamma((start = lab(start)).l, (end = lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + function hcl$1(hue$$1) { + return function(start, end) { + var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hcl$2 = hcl$1(hue); + var hclLong = hcl$1(nogamma); + + function cubehelix$1(hue$$1) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix$$1(start, end) { + var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix$$1.gamma = cubehelixGamma; + + return cubehelix$$1; + })(1); + } + + var cubehelix$2 = cubehelix$1(hue); + var cubehelixLong = cubehelix$1(nogamma); + + var quantize = function(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; + }; + + var noop$1 = {value: function() {}}; + + function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); + } + + function Dispatch(_) { + this._ = _; + } + + function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); + } + + Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set$2(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set$2(_[t], typename.name, null); + } + + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } + }; + + function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } + } + + function set$2(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop$1, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; + } + + function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "]"; + }).join(",") + "}"); + } + + function customConverter(columns, f) { + var object = objectConverter(columns); + return function(row, i) { + return f(object(row), i, columns); + }; + } + + // Compute unique columns in order of discovery. + function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function(row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; + } + + var dsv = function(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n]"), + delimiterCode = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function(row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns; + return rows; + } + + function parseRows(text, f) { + var EOL = {}, // sentinel value for end-of-line + EOF = {}, // sentinel value for end-of-file + rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // the current line number + t, // the current token + eol; // is the current token followed by EOL? + + function token() { + if (I >= N) return EOF; // special case: end of file + if (eol) return eol = false, EOL; // special case: end of line + + // special case: quotes + var j = I, c; + if (text.charCodeAt(j) === 34) { + var i = j; + while (i++ < N) { + if (text.charCodeAt(i) === 34) { + if (text.charCodeAt(i + 1) !== 34) break; + ++i; + } + } + I = i + 2; + c = text.charCodeAt(i + 1); + if (c === 13) { + eol = true; + if (text.charCodeAt(i + 2) === 10) ++I; + } else if (c === 10) { + eol = true; + } + return text.slice(j + 1, i).replace(/""/g, "\""); + } + + // common case: find next delimiter or newline + while (I < N) { + var k = 1; + c = text.charCodeAt(I++); + if (c === 10) eol = true; // \n + else if (c === 13) { eol = true; if (text.charCodeAt(I) === 10) ++I, ++k; } // \r|\r\n + else if (c !== delimiterCode) continue; + return text.slice(j, I - k); + } + + // special case: last token before EOF + return text.slice(j); + } + + while ((t = token()) !== EOF) { + var a = []; + while (t !== EOL && t !== EOF) { + a.push(t); + t = token(); + } + if (f && (a = f(a, n++)) == null) continue; + rows.push(a); + } + + return rows; + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + })).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(text) { + return text == null ? "" + : reFormat.test(text += "") ? "\"" + text.replace(/\"/g, "\"\"") + "\"" + : text; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatRows: formatRows + }; + }; + + var csv = dsv(","); + + var csvParse = csv.parse; + var csvParseRows = csv.parseRows; + var csvFormat = csv.format; + var csvFormatRows = csv.formatRows; + + var tsv = dsv("\t"); + + var tsvParse = tsv.parse; + var tsvParseRows = tsv.parseRows; + var tsvFormat = tsv.format; + var tsvFormatRows = tsv.formatRows; + + var request = function(url, callback) { + var request, + event = dispatch("beforesend", "progress", "load", "error"), + mimeType, + headers = map$1(), + xhr = new XMLHttpRequest, + user = null, + password = null, + response, + responseType, + timeout = 0; + + // If IE does not support CORS, use XDomainRequest. + if (typeof XDomainRequest !== "undefined" + && !("withCredentials" in xhr) + && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest; + + "onload" in xhr + ? xhr.onload = xhr.onerror = xhr.ontimeout = respond + : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); }; + + function respond(o) { + var status = xhr.status, result; + if (!status && hasResponse(xhr) + || status >= 200 && status < 300 + || status === 304) { + if (response) { + try { + result = response.call(request, xhr); + } catch (e) { + event.call("error", request, e); + return; + } + } else { + result = xhr; + } + event.call("load", request, result); + } else { + event.call("error", request, o); + } + } + + xhr.onprogress = function(e) { + event.call("progress", request, e); + }; + + request = { + header: function(name, value) { + name = (name + "").toLowerCase(); + if (arguments.length < 2) return headers.get(name); + if (value == null) headers.remove(name); + else headers.set(name, value + ""); + return request; + }, + + // If mimeType is non-null and no Accept header is set, a default is used. + mimeType: function(value) { + if (!arguments.length) return mimeType; + mimeType = value == null ? null : value + ""; + return request; + }, + + // Specifies what type the response value should take; + // for instance, arraybuffer, blob, document, or text. + responseType: function(value) { + if (!arguments.length) return responseType; + responseType = value; + return request; + }, + + timeout: function(value) { + if (!arguments.length) return timeout; + timeout = +value; + return request; + }, + + user: function(value) { + return arguments.length < 1 ? user : (user = value == null ? null : value + "", request); + }, + + password: function(value) { + return arguments.length < 1 ? password : (password = value == null ? null : value + "", request); + }, + + // Specify how to convert the response content to a specific type; + // changes the callback value on "load" events. + response: function(value) { + response = value; + return request; + }, + + // Alias for send("GET", …). + get: function(data, callback) { + return request.send("GET", data, callback); + }, + + // Alias for send("POST", …). + post: function(data, callback) { + return request.send("POST", data, callback); + }, + + // If callback is non-null, it will be used for error and load events. + send: function(method, data, callback) { + xhr.open(method, url, true, user, password); + if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*"); + if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); }); + if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType); + if (responseType != null) xhr.responseType = responseType; + if (timeout > 0) xhr.timeout = timeout; + if (callback == null && typeof data === "function") callback = data, data = null; + if (callback != null && callback.length === 1) callback = fixCallback(callback); + if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); }); + event.call("beforesend", request, xhr); + xhr.send(data == null ? null : data); + return request; + }, + + abort: function() { + xhr.abort(); + return request; + }, + + on: function() { + var value = event.on.apply(event, arguments); + return value === event ? request : value; + } + }; + + if (callback != null) { + if (typeof callback !== "function") throw new Error("invalid callback: " + callback); + return request.get(callback); + } + + return request; + }; + + function fixCallback(callback) { + return function(error, xhr) { + callback(error == null ? xhr : null); + }; + } + + function hasResponse(xhr) { + var type = xhr.responseType; + return type && type !== "text" + ? xhr.response // null on error + : xhr.responseText; // "" on error + } + + var type = function(defaultMimeType, response) { + return function(url, callback) { + var r = request(url).mimeType(defaultMimeType).response(response); + if (callback != null) { + if (typeof callback !== "function") throw new Error("invalid callback: " + callback); + return r.get(callback); + } + return r; + }; + }; + + var html = type("text/html", function(xhr) { + return document.createRange().createContextualFragment(xhr.responseText); + }); + + var json = type("application/json", function(xhr) { + return JSON.parse(xhr.responseText); + }); + + var text = type("text/plain", function(xhr) { + return xhr.responseText; + }); + + var xml = type("application/xml", function(xhr) { + var xml = xhr.responseXML; + if (!xml) throw new Error("parse error"); + return xml; + }); + + var dsv$1 = function(defaultMimeType, parse) { + return function(url, row, callback) { + if (arguments.length < 3) callback = row, row = null; + var r = request(url).mimeType(defaultMimeType); + r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; }; + r.row(row); + return callback ? r.get(callback) : r; + }; + }; + + function responseOf(parse, row) { + return function(request$$1) { + return parse(request$$1.responseText, row); + }; + } + + var csv$1 = dsv$1("text/csv", csvParse); + + var tsv$1 = dsv$1("text/tab-separated-values", tsvParse); + + var frame = 0; + var timeout = 0; + var interval = 0; + var pokeDelay = 1000; + var taskHead; + var taskTail; + var clockLast = 0; + var clockNow = 0; + var clockSkew = 0; + var clock = typeof performance === "object" && performance.now ? performance : Date; + var setFrame = typeof requestAnimationFrame === "function" ? requestAnimationFrame : function(f) { setTimeout(f, 17); }; + + function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); + } + + function clearNow() { + clockNow = 0; + } + + function Timer() { + this._call = + this._time = + this._next = null; + } + + Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } + }; + + function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; + } + + function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; + } + + function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } + } + + function poke$1() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; + } + + function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); + } + + function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, delay); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) interval = setInterval(poke$1, pokeDelay); + frame = 1, setFrame(wake); + } + } + + var timeout$1 = function(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(function(elapsed) { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; + }; + + var interval$1 = function(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + delay = +delay, time = time == null ? now() : +time; + t.restart(function tick(elapsed) { + elapsed += total; + t.restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + return t; + }; + + var t0$1 = new Date; + var t1$1 = new Date; + + function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = new Date(+date)), date; + } + + interval.floor = interval; + + interval.ceil = function(date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function(date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function(date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function(start, stop, step) { + var range = []; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop) + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) while (--step >= 0) while (offseti(date, 1), !test(date)) {} // eslint-disable-line no-empty + }); + }; + + if (count) { + interval.count = function(start, end) { + t0$1.setTime(+start), t1$1.setTime(+end); + floori(t0$1), floori(t1$1); + return Math.floor(count(t0$1, t1$1)); + }; + + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } + + return interval; + } + + var millisecond = newInterval(function() { + // noop + }, function(date, step) { + date.setTime(+date + step); + }, function(start, end) { + return end - start; + }); + + // An optimized implementation for this simple case. + millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); + }; + + var milliseconds = millisecond.range; + + var durationSecond = 1e3; + var durationMinute = 6e4; + var durationHour = 36e5; + var durationDay = 864e5; + var durationWeek = 6048e5; + + var second = newInterval(function(date) { + date.setTime(Math.floor(date / durationSecond) * durationSecond); + }, function(date, step) { + date.setTime(+date + step * durationSecond); + }, function(start, end) { + return (end - start) / durationSecond; + }, function(date) { + return date.getUTCSeconds(); + }); + + var seconds = second.range; + + var minute = newInterval(function(date) { + date.setTime(Math.floor(date / durationMinute) * durationMinute); + }, function(date, step) { + date.setTime(+date + step * durationMinute); + }, function(start, end) { + return (end - start) / durationMinute; + }, function(date) { + return date.getMinutes(); + }); + + var minutes = minute.range; + + var hour = newInterval(function(date) { + var offset = date.getTimezoneOffset() * durationMinute % durationHour; + if (offset < 0) offset += durationHour; + date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset); + }, function(date, step) { + date.setTime(+date + step * durationHour); + }, function(start, end) { + return (end - start) / durationHour; + }, function(date) { + return date.getHours(); + }); + + var hours = hour.range; + + var day = newInterval(function(date) { + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; + }, function(date) { + return date.getDate() - 1; + }); + + var days = day.range; + + function weekday(i) { + return newInterval(function(date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); + } + + var sunday = weekday(0); + var monday = weekday(1); + var tuesday = weekday(2); + var wednesday = weekday(3); + var thursday = weekday(4); + var friday = weekday(5); + var saturday = weekday(6); + + var sundays = sunday.range; + var mondays = monday.range; + var tuesdays = tuesday.range; + var wednesdays = wednesday.range; + var thursdays = thursday.range; + var fridays = friday.range; + var saturdays = saturday.range; + + var month = newInterval(function(date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setMonth(date.getMonth() + step); + }, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; + }, function(date) { + return date.getMonth(); + }); + + var months = month.range; + + var year = newInterval(function(date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step); + }, function(start, end) { + return end.getFullYear() - start.getFullYear(); + }, function(date) { + return date.getFullYear(); + }); + + // An optimized implementation for this simple case. + year.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); + }; + + var years = year.range; + + var utcMinute = newInterval(function(date) { + date.setUTCSeconds(0, 0); + }, function(date, step) { + date.setTime(+date + step * durationMinute); + }, function(start, end) { + return (end - start) / durationMinute; + }, function(date) { + return date.getUTCMinutes(); + }); + + var utcMinutes = utcMinute.range; + + var utcHour = newInterval(function(date) { + date.setUTCMinutes(0, 0, 0); + }, function(date, step) { + date.setTime(+date + step * durationHour); + }, function(start, end) { + return (end - start) / durationHour; + }, function(date) { + return date.getUTCHours(); + }); + + var utcHours = utcHour.range; + + var utcDay = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); + }, function(start, end) { + return (end - start) / durationDay; + }, function(date) { + return date.getUTCDate() - 1; + }); + + var utcDays = utcDay.range; + + function utcWeekday(i) { + return newInterval(function(date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / durationWeek; + }); + } + + var utcSunday = utcWeekday(0); + var utcMonday = utcWeekday(1); + var utcTuesday = utcWeekday(2); + var utcWednesday = utcWeekday(3); + var utcThursday = utcWeekday(4); + var utcFriday = utcWeekday(5); + var utcSaturday = utcWeekday(6); + + var utcSundays = utcSunday.range; + var utcMondays = utcMonday.range; + var utcTuesdays = utcTuesday.range; + var utcWednesdays = utcWednesday.range; + var utcThursdays = utcThursday.range; + var utcFridays = utcFriday.range; + var utcSaturdays = utcSaturday.range; + + var utcMonth = newInterval(function(date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); + }, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; + }, function(date) { + return date.getUTCMonth(); + }); + + var utcMonths = utcMonth.range; + + var utcYear = newInterval(function(date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); + }, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); + }, function(date) { + return date.getUTCFullYear(); + }); + + // An optimized implementation for this simple case. + utcYear.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); + }; + + var utcYears = utcYear.range; + + // Computes the decimal coefficient and exponent of the specified number x with + // significant digits p, where x is positive and p is in [1, 21] or undefined. + // For example, formatDecimal(1.23) returns ["123", 0]. + var formatDecimal = function(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; + }; + + var exponent$1 = function(x) { + return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; + }; + + var formatGroup = function(grouping, thousands) { + return function(value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; + }; + + var formatDefault = function(x, p) { + x = x.toPrecision(p); + + out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (x[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + case "e": break out; + default: if (i0 > 0) i0 = 0; break; + } + } + + return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x; + }; + + var prefixExponent; + + var formatPrefixAuto = function(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! + }; + + var formatRounded = function(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); + }; + + var formatTypes = { + "": formatDefault, + "%": function(x, p) { return (x * 100).toFixed(p); }, + "b": function(x) { return Math.round(x).toString(2); }, + "c": function(x) { return x + ""; }, + "d": function(x) { return Math.round(x).toString(10); }, + "e": function(x, p) { return x.toExponential(p); }, + "f": function(x, p) { return x.toFixed(p); }, + "g": function(x, p) { return x.toPrecision(p); }, + "o": function(x) { return Math.round(x).toString(8); }, + "p": function(x, p) { return formatRounded(x * 100, p); }, + "r": formatRounded, + "s": formatPrefixAuto, + "X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, + "x": function(x) { return Math.round(x).toString(16); } + }; + + // [[fill]align][sign][symbol][0][width][,][.precision][type] + var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i; + + var formatSpecifier = function(specifier) { + return new FormatSpecifier(specifier); + }; + + function FormatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + + var match, + fill = match[1] || " ", + align = match[2] || ">", + sign = match[3] || "-", + symbol = match[4] || "", + zero = !!match[5], + width = match[6] && +match[6], + comma = !!match[7], + precision = match[8] && +match[8].slice(1), + type = match[9] || ""; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // Map invalid types to the default format. + else if (!formatTypes[type]) type = ""; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + this.fill = fill; + this.align = align; + this.sign = sign; + this.symbol = symbol; + this.zero = zero; + this.width = width; + this.comma = comma; + this.precision = precision; + this.type = type; + } + + FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width == null ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0)) + + this.type; + }; + + var prefixes = ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"]; + + function identity$3(x) { + return x; + } + + var formatLocale = function(locale) { + var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3, + currency = locale.currency, + decimal = locale.decimal; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + type = specifier.type; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? "%" : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = !type || /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision == null ? (type ? 6 : 12) + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Convert negative to positive, and compute the prefix. + // Note that -0 is not less than 0, but 1 / -0 is! + var valueNegative = (value < 0 || 1 / value < 0) && (value *= -1, true); + + // Perform the initial formatting. + value = formatType(value, precision); + + // If the original value was negative, it may be rounded to zero during + // formatting; treat this as (positive) zero. + if (valueNegative) { + i = -1, n = value.length; + valueNegative = false; + while (++i < n) { + if (c = value.charCodeAt(i), (48 < c && c < 58) + || (type === "x" && 96 < c && c < 103) + || (type === "X" && 64 < c && c < 71)) { + valueNegative = true; + break; + } + } + } + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value†part that can be + // grouped, and fractional or exponential “suffix†part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": return valuePrefix + value + valueSuffix + padding; + case "=": return valuePrefix + padding + value + valueSuffix; + case "^": return padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); + } + return padding + valuePrefix + value + valueSuffix; + } + + format.toString = function() { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function(value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; + }; + + var locale$1; + + + + defaultLocale({ + decimal: ".", + thousands: ",", + grouping: [3], + currency: ["$", ""] + }); + + function defaultLocale(definition) { + locale$1 = formatLocale(definition); + exports.format = locale$1.format; + exports.formatPrefix = locale$1.formatPrefix; + return locale$1; + } + + var precisionFixed = function(step) { + return Math.max(0, -exponent$1(Math.abs(step))); + }; + + var precisionPrefix = function(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step))); + }; + + var precisionRound = function(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent$1(max) - exponent$1(step)) + 1; + }; + + function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); + } + + function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); + } + + function newYear(y) { + return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0}; + } + + function formatLocale$1(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "S": formatSeconds, + "U": formatWeekNumberSunday, + "w": formatWeekdayNumber, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "S": formatUTCSeconds, + "U": formatUTCWeekNumberSunday, + "w": formatUTCWeekdayNumber, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "S": parseSeconds, + "U": parseWeekNumberSunday, + "w": parseWeekdayNumber, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function(date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, newDate) { + return function(string) { + var d = newYear(1900), + i = parseSpecifier(d, specifier, string += "", 0); + if (i != string.length) return null; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // Convert day-of-week and week-of-year to day-of-year. + if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "W" in d ? 1 : 0; + var day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$$1 + 5) % 7 : d.w + d.U * 7 - (day$$1 + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return newDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", localDate); + p.toString = function() { return specifier; }; + return p; + }, + utcFormat: function(specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function() { return specifier; }; + return f; + }, + utcParse: function(specifier) { + var p = newParse(specifier, utcDate); + p.toString = function() { return specifier; }; + return p; + } + }; + } + + var pads = {"-": "", "_": " ", "0": "0"}; + var numberRe = /^\s*\d+/; + var percentRe = /^%/; + var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; + + function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); + } + + function requote(s) { + return s.replace(requoteRe, "\\$&"); + } + + function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); + } + + function formatLookup(names) { + var map = {}, i = -1, n = names.length; + while (++i < n) map[names[i].toLowerCase()] = i; + return map; + } + + function parseWeekdayNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.U = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.W = +n[0], i + n[0].length) : -1; + } + + function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; + } + + function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; + } + + function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; + } + + function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; + } + + function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; + } + + function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; + } + + function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; + } + + function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; + } + + function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; + } + + function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; + } + + function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; + } + + function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); + } + + function formatHour24(d, p) { + return pad(d.getHours(), p, 2); + } + + function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); + } + + function formatDayOfYear(d, p) { + return pad(1 + day.count(year(d), d), p, 3); + } + + function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); + } + + function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); + } + + function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); + } + + function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); + } + + function formatWeekNumberSunday(d, p) { + return pad(sunday.count(year(d), d), p, 2); + } + + function formatWeekdayNumber(d) { + return d.getDay(); + } + + function formatWeekNumberMonday(d, p) { + return pad(monday.count(year(d), d), p, 2); + } + + function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); + } + + function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); + } + + function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); + } + + function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); + } + + function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); + } + + function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); + } + + function formatUTCDayOfYear(d, p) { + return pad(1 + utcDay.count(utcYear(d), d), p, 3); + } + + function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); + } + + function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); + } + + function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); + } + + function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); + } + + function formatUTCWeekNumberSunday(d, p) { + return pad(utcSunday.count(utcYear(d), d), p, 2); + } + + function formatUTCWeekdayNumber(d) { + return d.getUTCDay(); + } + + function formatUTCWeekNumberMonday(d, p) { + return pad(utcMonday.count(utcYear(d), d), p, 2); + } + + function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); + } + + function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); + } + + function formatUTCZone() { + return "+0000"; + } + + function formatLiteralPercent() { + return "%"; + } + + var locale$2; + + + + + + defaultLocale$1({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + }); + + function defaultLocale$1(definition) { + locale$2 = formatLocale$1(definition); + exports.timeFormat = locale$2.format; + exports.timeParse = locale$2.parse; + exports.utcFormat = locale$2.utcFormat; + exports.utcParse = locale$2.utcParse; + return locale$2; + } + + var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + + function formatIsoNative(date) { + return date.toISOString(); + } + + var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + + function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; + } + + var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + + var array$2 = Array.prototype; + + var map$3 = array$2.map; + var slice$3 = array$2.slice; + + var implicit = {name: "implicit"}; + + function ordinal(range) { + var index = map$1(), + domain = [], + unknown = implicit; + + range = range == null ? [] : slice$3.call(range); + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = [], index = map$1(); + var i = -1, n = _.length, d, key; + while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); + return scale; + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$3.call(_), scale) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return ordinal() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return scale; + } + + function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + range$$1 = [0, 1], + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = range$$1[1] < range$$1[0], + start = range$$1[reverse - 0], + stop = range$$1[1 - reverse]; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = range(n).map(function(i) { return start + step * i; }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function(_) { + return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice(); + }; + + scale.rangeRound = function(_) { + return range$$1 = [+_[0], +_[1]], round = true, rescale(); + }; + + scale.bandwidth = function() { + return bandwidth; + }; + + scale.step = function() { + return step; + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function(_) { + return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner; + }; + + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner; + }; + + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter; + }; + + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function() { + return band() + .domain(domain()) + .range(range$$1) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return rescale(); + } + + function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function() { + return pointish(copy()); + }; + + return scale; + } + + function point$4() { + return pointish(band().paddingInner(1)); + } + + var constant$4 = function(x) { + return function() { + return x; + }; + }; + + var number$1 = function(x) { + return +x; + }; + + var unit = [0, 1]; + + function deinterpolateLinear(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constant$4(b); + } + + function deinterpolateClamp(deinterpolate) { + return function(a, b) { + var d = deinterpolate(a = +a, b = +b); + return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); }; + }; + } + + function reinterpolateClamp(reinterpolate) { + return function(a, b) { + var r = reinterpolate(a = +a, b = +b); + return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); }; + }; + } + + function bimap(domain, range$$1, deinterpolate, reinterpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1]; + if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0); + else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1); + return function(x) { return r0(d0(x)); }; + } + + function polymap(domain, range$$1, deinterpolate, reinterpolate) { + var j = Math.min(domain.length, range$$1.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range$$1 = range$$1.slice().reverse(); + } + + while (++i < j) { + d[i] = deinterpolate(domain[i], domain[i + 1]); + r[i] = reinterpolate(range$$1[i], range$$1[i + 1]); + } + + return function(x) { + var i = bisectRight(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; + } + + function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()); + } + + // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. + // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b]. + function continuous(deinterpolate, reinterpolate) { + var domain = unit, + range$$1 = unit, + interpolate$$1 = interpolate, + clamp = false, + piecewise, + output, + input; + + function rescale() { + piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x); + } + + scale.invert = function(y) { + return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y); + }; + + scale.domain = function(_) { + return arguments.length ? (domain = map$3.call(_, number$1), rescale()) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range$$1 = slice$3.call(_), rescale()) : range$$1.slice(); + }; + + scale.rangeRound = function(_) { + return range$$1 = slice$3.call(_), interpolate$$1 = interpolateRound, rescale(); + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, rescale()) : clamp; + }; + + scale.interpolate = function(_) { + return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1; + }; + + return rescale(); + } + + var tickFormat = function(domain, count, specifier) { + var start = domain[0], + stop = domain[domain.length - 1], + step = tickStep(start, stop, count == null ? 10 : count), + precision; + specifier = formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision; + return exports.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return exports.format(specifier); + }; + + function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function(count) { + var d = domain(); + return ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function(count, specifier) { + return tickFormat(domain(), count, specifier); + }; + + scale.nice = function(count) { + var d = domain(), + i = d.length - 1, + n = count == null ? 10 : count, + start = d[0], + stop = d[i], + step = tickStep(start, stop, n); + + if (step) { + step = tickStep(Math.floor(start / step) * step, Math.ceil(stop / step) * step, n); + d[0] = Math.floor(start / step) * step; + d[i] = Math.ceil(stop / step) * step; + domain(d); + } + + return scale; + }; + + return scale; + } + + function linear$2() { + var scale = continuous(deinterpolateLinear, interpolateNumber); + + scale.copy = function() { + return copy(scale, linear$2()); + }; + + return linearish(scale); + } + + function identity$4() { + var domain = [0, 1]; + + function scale(x) { + return +x; + } + + scale.invert = scale; + + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = map$3.call(_, number$1), scale) : domain.slice(); + }; + + scale.copy = function() { + return identity$4().domain(domain); + }; + + return linearish(scale); + } + + var nice = function(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; + }; + + function deinterpolate(a, b) { + return (b = Math.log(b / a)) + ? function(x) { return Math.log(x / a) / b; } + : constant$4(b); + } + + function reinterpolate(a, b) { + return a < 0 + ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); } + : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); }; + } + + function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; + } + + function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function(x) { return Math.pow(base, x); }; + } + + function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function(x) { return Math.log(x) / base; }); + } + + function reflect(f) { + return function(x) { + return -f(-x); + }; + } + + function log() { + var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]), + domain = scale.domain, + base = 10, + logs = logp(10), + pows = powp(10); + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows); + return scale; + } + + scale.base = function(_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function(count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.round(i) - 1, j = Math.round(j) + 1; + if (u > 0) for (; i < j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i < j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + } else { + z = ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function(count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = exports.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function(d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function() { + return domain(nice(domain(), { + floor: function(x) { return pows(Math.floor(logs(x))); }, + ceil: function(x) { return pows(Math.ceil(logs(x))); } + })); + }; + + scale.copy = function() { + return copy(scale, log().base(base)); + }; + + return scale; + } + + function raise(x, exponent) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + } + + function pow() { + var exponent = 1, + scale = continuous(deinterpolate, reinterpolate), + domain = scale.domain; + + function deinterpolate(a, b) { + return (b = raise(b, exponent) - (a = raise(a, exponent))) + ? function(x) { return (raise(x, exponent) - a) / b; } + : constant$4(b); + } + + function reinterpolate(a, b) { + b = raise(b, exponent) - (a = raise(a, exponent)); + return function(t) { return raise(a + b * t, 1 / exponent); }; + } + + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, domain(domain())) : exponent; + }; + + scale.copy = function() { + return copy(scale, pow().exponent(exponent)); + }; + + return linearish(scale); + } + + function sqrt() { + return pow().exponent(0.5); + } + + function quantile$$1() { + var domain = [], + range$$1 = [], + thresholds = []; + + function rescale() { + var i = 0, n = Math.max(1, range$$1.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = threshold(domain, i / n); + return scale; + } + + function scale(x) { + if (!isNaN(x = +x)) return range$$1[bisectRight(thresholds, x)]; + } + + scale.invertExtent = function(y) { + var i = range$$1.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending); + return rescale(); + }; + + scale.range = function(_) { + return arguments.length ? (range$$1 = slice$3.call(_), rescale()) : range$$1.slice(); + }; + + scale.quantiles = function() { + return thresholds.slice(); + }; + + scale.copy = function() { + return quantile$$1() + .domain(domain) + .range(range$$1); + }; + + return scale; + } + + function quantize$1() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range$$1 = [0, 1]; + + function scale(x) { + if (x <= x) return range$$1[bisectRight(domain, x, 0, n)]; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function(_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + }; + + scale.range = function(_) { + return arguments.length ? (n = (range$$1 = slice$3.call(_)).length - 1, rescale()) : range$$1.slice(); + }; + + scale.invertExtent = function(y) { + var i = range$$1.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.copy = function() { + return quantize$1() + .domain([x0, x1]) + .range(range$$1); + }; + + return linearish(scale); + } + + function threshold$1() { + var domain = [0.5], + range$$1 = [0, 1], + n = 1; + + function scale(x) { + if (x <= x) return range$$1[bisectRight(domain, x, 0, n)]; + } + + scale.domain = function(_) { + return arguments.length ? (domain = slice$3.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range$$1 = slice$3.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice(); + }; + + scale.invertExtent = function(y) { + var i = range$$1.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.copy = function() { + return threshold$1() + .domain(domain) + .range(range$$1); + }; + + return scale; + } + + var durationSecond$1 = 1000; + var durationMinute$1 = durationSecond$1 * 60; + var durationHour$1 = durationMinute$1 * 60; + var durationDay$1 = durationHour$1 * 24; + var durationWeek$1 = durationDay$1 * 7; + var durationMonth = durationDay$1 * 30; + var durationYear = durationDay$1 * 365; + + function date$1(t) { + return new Date(t); + } + + function number$2(t) { + return t instanceof Date ? +t : +new Date(+t); + } + + function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) { + var scale = continuous(deinterpolateLinear, interpolateNumber), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second$$1, 1, durationSecond$1], + [second$$1, 5, 5 * durationSecond$1], + [second$$1, 15, 15 * durationSecond$1], + [second$$1, 30, 30 * durationSecond$1], + [minute$$1, 1, durationMinute$1], + [minute$$1, 5, 5 * durationMinute$1], + [minute$$1, 15, 15 * durationMinute$1], + [minute$$1, 30, 30 * durationMinute$1], + [ hour$$1, 1, durationHour$1 ], + [ hour$$1, 3, 3 * durationHour$1 ], + [ hour$$1, 6, 6 * durationHour$1 ], + [ hour$$1, 12, 12 * durationHour$1 ], + [ day$$1, 1, durationDay$1 ], + [ day$$1, 2, 2 * durationDay$1 ], + [ week, 1, durationWeek$1 ], + [ month$$1, 1, durationMonth ], + [ month$$1, 3, 3 * durationMonth ], + [ year$$1, 1, durationYear ] + ]; + + function tickFormat(date) { + return (second$$1(date) < date ? formatMillisecond + : minute$$1(date) < date ? formatSecond + : hour$$1(date) < date ? formatMinute + : day$$1(date) < date ? formatHour + : month$$1(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year$$1(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop, step) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = bisector(function(i) { return i[2]; }).right(tickIntervals, target); + if (i === tickIntervals.length) { + step = tickStep(start / durationYear, stop / durationYear, interval); + interval = year$$1; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = tickStep(start, stop, interval); + interval = millisecond$$1; + } + } + + return step == null ? interval : interval.every(step); + } + + scale.invert = function(y) { + return new Date(invert(y)); + }; + + scale.domain = function(_) { + return arguments.length ? domain(map$3.call(_, number$2)) : domain().map(date$1); + }; + + scale.ticks = function(interval, step) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1, step); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function(count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function(interval, step) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function() { + return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format)); + }; + + return scale; + } + + var time = function() { + return calendar(year, month, sunday, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]); + }; + + var utcTime = function() { + return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]); + }; + + var colors = function(s) { + return s.match(/.{6}/g).map(function(x) { + return "#" + x; + }); + }; + + var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + + var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6"); + + var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9"); + + var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5"); + + var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0)); + + var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + + var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + + var rainbow = cubehelix(); + + var rainbow$1 = function(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + rainbow.h = 360 * t - 100; + rainbow.s = 1.5 - 1.5 * ts; + rainbow.l = 0.8 - 0.9 * ts; + return rainbow + ""; + }; + + function ramp(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + + var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + + var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + + var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + + function sequential(interpolator) { + var x0 = 0, + x1 = 1, + clamp = false; + + function scale(x) { + var t = (x - x0) / (x1 - x0); + return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t); + } + + scale.domain = function(_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.copy = function() { + return sequential(interpolator).domain([x0, x1]).clamp(clamp); + }; + + return linearish(scale); + } + + var xhtml = "http://www.w3.org/1999/xhtml"; + + var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + + var namespace = function(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; + }; + + function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; + } + + function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; + } + + var creator = function(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); + }; + + var nextId = 0; + + function local() { + return new Local; + } + + function Local() { + this._ = "@" + (++nextId).toString(36); + } + + Local.prototype = local.prototype = { + constructor: Local, + get: function(node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } + }; + + var matcher = function(selector) { + return function() { + return this.matches(selector); + }; + }; + + if (typeof document !== "undefined") { + var element = document.documentElement; + if (!element.matches) { + var vendorMatches = element.webkitMatchesSelector + || element.msMatchesSelector + || element.mozMatchesSelector + || element.oMatchesSelector; + matcher = function(selector) { + return function() { + return vendorMatches.call(this, selector); + }; + }; + } + } + + var matcher$1 = matcher; + + var filterEvents = {}; + + exports.event = null; + + if (typeof document !== "undefined") { + var element$1 = document.documentElement; + if (!("onmouseenter" in element$1)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } + } + + function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function(event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; + } + + function contextListener(listener, index, group) { + return function(event1) { + var event0 = exports.event; // Events can be reentrant (e.g., focus). + exports.event = event1; + try { + listener.call(this, this.__data__, index, group); + } finally { + exports.event = event0; + } + }; + } + + function parseTypenames$1(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); + } + + function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; + } + + function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function(d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) this.__on = [o]; + else on.push(o); + }; + } + + var selection_on = function(typename, value, capture) { + var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) capture = false; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + return this; + }; + + function customEvent(event1, listener, that, args) { + var event0 = exports.event; + event1.sourceEvent = exports.event; + exports.event = event1; + try { + return listener.apply(that, args); + } finally { + exports.event = event0; + } + } + + var sourceEvent = function() { + var current = exports.event, source; + while (source = current.sourceEvent) current = source; + return current; + }; + + var point$5 = function(node, event) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + }; + + var mouse = function(node) { + var event = sourceEvent(); + if (event.changedTouches) event = event.changedTouches[0]; + return point$5(node, event); + }; + + function none$2() {} + + var selector = function(selector) { + return selector == null ? none$2 : function() { + return this.querySelector(selector); + }; + }; + + var selection_select = function(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); + }; + + function empty() { + return []; + } + + var selectorAll = function(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; + }; + + var selection_selectAll = function(select) { + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); + }; + + var selection_filter = function(match) { + if (typeof match !== "function") match = matcher$1(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); + }; + + var sparse = function(update) { + return new Array(update.length); + }; + + var selection_enter = function() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); + }; + + function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; + } + + EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } + }; + + var constant$5 = function(x) { + return function() { + return x; + }; + }; + + var keyPrefix = "$"; // Protect against keys like “__proto__â€. + + function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } + } + + function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } + } + + var selection_data = function(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function(d) { data[++j] = d; }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant$5(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; + }; + + var selection_exit = function() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); + }; + + var selection_merge = function(selection) { + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); + }; + + var selection_order = function() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; + }; + + var selection_sort = function(compare) { + if (!compare) compare = ascending$2; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); + }; + + function ascending$2(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + var selection_call = function() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; + }; + + var selection_nodes = function() { + var nodes = new Array(this.size()), i = -1; + this.each(function() { nodes[++i] = this; }); + return nodes; + }; + + var selection_node = function() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; + }; + + var selection_size = function() { + var size = 0; + this.each(function() { ++size; }); + return size; + }; + + var selection_empty = function() { + return !this.node(); + }; + + var selection_each = function(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; + }; + + function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; + } + + function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; + } + + function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; + } + + function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; + } + + var selection_attr = function(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); + }; + + var window = function(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document + }; + + function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; + } + + function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; + } + + var selection_style = function(name, value, priority) { + var node; + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : window(node = this.node()) + .getComputedStyle(node, null) + .getPropertyValue(name); + }; + + function propertyRemove(name) { + return function() { + delete this[name]; + }; + } + + function propertyConstant(name, value) { + return function() { + this[name] = value; + }; + } + + function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; + } + + var selection_property = function(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; + }; + + function classArray(string) { + return string.trim().split(/^|\s+/); + } + + function classList(node) { + return node.classList || new ClassList(node); + } + + function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); + } + + ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } + }; + + function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); + } + + function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); + } + + function classedTrue(names) { + return function() { + classedAdd(this, names); + }; + } + + function classedFalse(names) { + return function() { + classedRemove(this, names); + }; + } + + function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; + } + + var selection_classed = function(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); + }; + + function textRemove() { + this.textContent = ""; + } + + function textConstant(value) { + return function() { + this.textContent = value; + }; + } + + function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; + } + + var selection_text = function(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; + }; + + function htmlRemove() { + this.innerHTML = ""; + } + + function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; + } + + function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; + } + + var selection_html = function(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; + }; + + function raise$1() { + if (this.nextSibling) this.parentNode.appendChild(this); + } + + var selection_raise = function() { + return this.each(raise$1); + }; + + function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); + } + + var selection_lower = function() { + return this.each(lower); + }; + + var selection_append = function(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); + }; + + function constantNull() { + return null; + } + + var selection_insert = function(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); + }; + + function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + + var selection_remove = function() { + return this.each(remove); + }; + + var selection_datum = function(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; + }; + + function dispatchEvent(node, type, params) { + var window$$1 = window(node), + event = window$$1.CustomEvent; + + if (event) { + event = new event(type, params); + } else { + event = window$$1.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); + } + + function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; + } + + function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; + } + + var selection_dispatch = function(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); + }; + + var root = [null]; + + function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; + } + + function selection() { + return new Selection([[document.documentElement]], root); + } + + Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch + }; + + var select = function(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); + }; + + var selectAll = function(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : selector], root); + }; + + var touch = function(node, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; + + for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return point$5(node, touch); + } + } + + return null; + }; + + var touches = function(node, touches) { + if (touches == null) touches = sourceEvent().touches; + + for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { + points[i] = point$5(node, touches[i]); + } + + return points; + }; + + var emptyOn = dispatch("start", "end", "interrupt"); + var emptyTween = []; + + var CREATED = 0; + var SCHEDULED = 1; + var STARTING = 2; + var STARTED = 3; + var RUNNING = 4; + var ENDING = 5; + var ENDED = 6; + + var schedule = function(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); + }; + + function init(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error("too late"); + return schedule; + } + + function set$3(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error("too late"); + return schedule; + } + + function get$1(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("too late"); + return schedule; + } + + function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return timeout$1(start); + + // Interrupt the active transition, if any. + // Dispatch the interrupt event. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. No interrupt event is dispatched + // because the cancelled transitions never started. Note that this also + // removes this transition from the pending list! + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + timeout$1(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(null, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } + } + + var interrupt = function(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { empty = false; continue; } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + if (active) schedule.on.call("interrupt", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; + }; + + var selection_interrupt = function(name) { + return this.each(function() { + interrupt(this, name); + }); + }; + + function tweenRemove(id, name) { + var tween0, tween1; + return function() { + var schedule = set$3(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; + } + + function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function() { + var schedule = set$3(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; + } + + var transition_tween = function(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get$1(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); + }; + + function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function() { + var schedule = set$3(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function(node) { + return get$1(node, id).value[name]; + }; + } + + var interpolate$1 = function(a, b) { + var c; + return (typeof b === "number" ? interpolateNumber + : b instanceof color ? interpolateRgb + : (c = color(b)) ? (b = c, interpolateRgb) + : interpolateString)(a, b); + }; + + function attrRemove$1(name) { + return function() { + this.removeAttribute(name); + }; + } + + function attrRemoveNS$1(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant$1(name, interpolate$$1, value1) { + var value00, + interpolate0; + return function() { + var value0 = this.getAttribute(name); + return value0 === value1 ? null + : value0 === value00 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value1); + }; + } + + function attrConstantNS$1(fullname, interpolate$$1, value1) { + var value00, + interpolate0; + return function() { + var value0 = this.getAttributeNS(fullname.space, fullname.local); + return value0 === value1 ? null + : value0 === value00 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value1); + }; + } + + function attrFunction$1(name, interpolate$$1, value) { + var value00, + value10, + interpolate0; + return function() { + var value0, value1 = value(this); + if (value1 == null) return void this.removeAttribute(name); + value0 = this.getAttribute(name); + return value0 === value1 ? null + : value0 === value00 && value1 === value10 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value10 = value1); + }; + } + + function attrFunctionNS$1(fullname, interpolate$$1, value) { + var value00, + value10, + interpolate0; + return function() { + var value0, value1 = value(this); + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + value0 = this.getAttributeNS(fullname.space, fullname.local); + return value0 === value1 ? null + : value0 === value00 && value1 === value10 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value10 = value1); + }; + } + + var transition_attr = function(name, value) { + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$1; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname) + : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value)); + }; + + function attrTweenNS(fullname, value) { + function tween() { + var node = this, i = value.apply(node, arguments); + return i && function(t) { + node.setAttributeNS(fullname.space, fullname.local, i(t)); + }; + } + tween._value = value; + return tween; + } + + function attrTween(name, value) { + function tween() { + var node = this, i = value.apply(node, arguments); + return i && function(t) { + node.setAttribute(name, i(t)); + }; + } + tween._value = value; + return tween; + } + + var transition_attrTween = function(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); + }; + + function delayFunction(id, value) { + return function() { + init(this, id).delay = +value.apply(this, arguments); + }; + } + + function delayConstant(id, value) { + return value = +value, function() { + init(this, id).delay = value; + }; + } + + var transition_delay = function(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get$1(this.node(), id).delay; + }; + + function durationFunction(id, value) { + return function() { + set$3(this, id).duration = +value.apply(this, arguments); + }; + } + + function durationConstant(id, value) { + return value = +value, function() { + set$3(this, id).duration = value; + }; + } + + var transition_duration = function(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get$1(this.node(), id).duration; + }; + + function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + set$3(this, id).ease = value; + }; + } + + var transition_ease = function(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get$1(this.node(), id).ease; + }; + + var transition_filter = function(match) { + if (typeof match !== "function") match = matcher$1(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); + }; + + var transition_merge = function(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); + }; + + function start$1(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); + } + + function onFunction(id, name, listener) { + var on0, on1, sit = start$1(name) ? init : set$3; + return function() { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; + } + + var transition_on = function(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get$1(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); + }; + + function removeFunction(id) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; + } + + var transition_remove = function() { + return this.on("end.remove", removeFunction(this._id)); + }; + + var transition_select = function(select$$1) { + var name = this._name, + id = this._id; + + if (typeof select$$1 !== "function") select$$1 = selector(select$$1); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select$$1.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get$1(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); + }; + + var transition_selectAll = function(select$$1) { + var name = this._name, + id = this._id; + + if (typeof select$$1 !== "function") select$$1 = selectorAll(select$$1); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select$$1.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); + }; + + var Selection$1 = selection.prototype.constructor; + + var transition_selection = function() { + return new Selection$1(this._groups, this._parents); + }; + + function styleRemove$1(name, interpolate$$1) { + var value00, + value10, + interpolate0; + return function() { + var style = window(this).getComputedStyle(this, null), + value0 = style.getPropertyValue(name), + value1 = (this.style.removeProperty(name), style.getPropertyValue(name)); + return value0 === value1 ? null + : value0 === value00 && value1 === value10 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value10 = value1); + }; + } + + function styleRemoveEnd(name) { + return function() { + this.style.removeProperty(name); + }; + } + + function styleConstant$1(name, interpolate$$1, value1) { + var value00, + interpolate0; + return function() { + var value0 = window(this).getComputedStyle(this, null).getPropertyValue(name); + return value0 === value1 ? null + : value0 === value00 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value1); + }; + } + + function styleFunction$1(name, interpolate$$1, value) { + var value00, + value10, + interpolate0; + return function() { + var style = window(this).getComputedStyle(this, null), + value0 = style.getPropertyValue(name), + value1 = value(this); + if (value1 == null) value1 = (this.style.removeProperty(name), style.getPropertyValue(name)); + return value0 === value1 ? null + : value0 === value00 && value1 === value10 ? interpolate0 + : interpolate0 = interpolate$$1(value00 = value0, value10 = value1); + }; + } + + var transition_style = function(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1; + return value == null ? this + .styleTween(name, styleRemove$1(name, i)) + .on("end.style." + name, styleRemoveEnd(name)) + : this.styleTween(name, typeof value === "function" + ? styleFunction$1(name, i, tweenValue(this, "style." + name, value)) + : styleConstant$1(name, i, value), priority); + }; + + function styleTween(name, value, priority) { + function tween() { + var node = this, i = value.apply(node, arguments); + return i && function(t) { + node.style.setProperty(name, i(t), priority); + }; + } + tween._value = value; + return tween; + } + + var transition_styleTween = function(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); + }; + + function textConstant$1(value) { + return function() { + this.textContent = value; + }; + } + + function textFunction$1(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; + } + + var transition_text = function(value) { + return this.tween("text", typeof value === "function" + ? textFunction$1(tweenValue(this, "text", value)) + : textConstant$1(value == null ? "" : value + "")); + }; + + var transition_transition = function() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get$1(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); + }; + + var id = 0; + + function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; + } + + function transition(name) { + return selection().transition(name); + } + + function newId() { + return ++id; + } + + var selection_prototype = selection.prototype; + + Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease + }; + + var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut + }; + + function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + return defaultTiming.time = now(), defaultTiming; + } + } + return timing; + } + + var selection_transition = function(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); + }; + + selection.prototype.interrupt = selection_interrupt; + selection.prototype.transition = selection_transition; + + var root$1 = [null]; + + var active = function(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root$1, name, +i); + } + } + } + + return null; + }; + + var slice$4 = Array.prototype.slice; + + var identity$5 = function(x) { + return x; + }; + + var top = 1; + var right = 2; + var bottom = 3; + var left = 4; + var epsilon$2 = 1e-6; + + function translateX(scale0, scale1, d) { + var x = scale0(d); + return "translate(" + (isFinite(x) ? x : scale1(d)) + ",0)"; + } + + function translateY(scale0, scale1, d) { + var y = scale0(d); + return "translate(0," + (isFinite(y) ? y : scale1(d)) + ")"; + } + + function center(scale) { + var offset = scale.bandwidth() / 2; + if (scale.round()) offset = Math.round(offset); + return function(d) { + return scale(d) + offset; + }; + } + + function entering() { + return !this.__axis; + } + + function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$5) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + transform = orient === top || orient === bottom ? translateX : translateY, + range = scale.range(), + range0 = range[0] + 0.5, + range1 = range[range.length - 1] + 0.5, + position = (scale.bandwidth ? center : identity$5)(scale.copy()), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"), + k = orient === top || orient === left ? -1 : 1, + x, y = orient === left || orient === right ? (x = "x", "y") : (x = "y", "x"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "#000")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "#000") + .attr(x + "2", k * tickSizeInner) + .attr(y + "1", 0.5) + .attr(y + "2", 0.5)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "#000") + .attr(x, k * spacing) + .attr(y, 0.5) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon$2) + .attr("transform", function(d) { return transform(position, this.parentNode.__axis || position, d); }); + + tickEnter + .attr("opacity", epsilon$2) + .attr("transform", function(d) { return transform(this.parentNode.__axis || position, position, d); }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient == right + ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter + : "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter); + + tick + .attr("opacity", 1) + .attr("transform", function(d) { return transform(position, position, d); }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function() { this.__axis = position; }); + } + + axis.scale = function(_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function() { + return tickArguments = slice$4.call(arguments), axis; + }; + + axis.tickArguments = function(_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice$4.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function(_) { + return arguments.length ? (tickValues = _ == null ? null : slice$4.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function(_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function(_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function(_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function(_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function(_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + return axis; + } + + function axisTop(scale) { + return axis(top, scale); + } + + function axisRight(scale) { + return axis(right, scale); + } + + function axisBottom(scale) { + return axis(bottom, scale); + } + + function axisLeft(scale) { + return axis(left, scale); + } + + function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; + } + + function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; + } + + function meanXReduce(x, c) { + return x + c.x; + } + + function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); + } + + function maxYReduce(y, c) { + return Math.max(y, c.y); + } + + function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; + } + + function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; + } + + var cluster = function() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function(node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function(node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function(x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; + }; + + var node_each = function(callback) { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + callback(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } while (next.length); + return this; + }; + + var node_eachBefore = function(callback) { + var node = this, nodes = [node], children, i; + while (node = nodes.pop()) { + callback(node), children = node.children; + if (children) for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + return this; + }; + + var node_eachAfter = function(callback) { + var node = this, nodes = [node], next = [], children, i, n; + while (node = nodes.pop()) { + next.push(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + while (node = next.pop()) { + callback(node); + } + return this; + }; + + var node_sum = function(value) { + return this.eachAfter(function(node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); + }; + + var node_sort = function(compare) { + return this.eachBefore(function(node) { + if (node.children) { + node.children.sort(compare); + } + }); + }; + + var node_path = function(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; + }; + + function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; + } + + var node_ancestors = function() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; + }; + + var node_descendants = function() { + var nodes = []; + this.each(function(node) { + nodes.push(node); + }); + return nodes; + }; + + var node_leaves = function() { + var leaves = []; + this.eachBefore(function(node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; + }; + + var node_links = function() { + var root = this, links = []; + root.each(function(node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; + }; + + function hierarchy(data, children) { + var root = new Node(data), + valued = +data.value && (root.value = data.value), + node, + nodes = [root], + child, + childs, + i, + n; + + if (children == null) children = defaultChildren; + + while (node = nodes.pop()) { + if (valued) node.value = +node.data.value; + if ((childs = children(node.data)) && (n = childs.length)) { + node.children = new Array(n); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); + } + + function node_copy() { + return hierarchy(this).eachBefore(copyData); + } + + function defaultChildren(d) { + return d.children; + } + + function copyData(node) { + node.data = node.data.data; + } + + function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); + } + + function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; + } + + Node.prototype = hierarchy.prototype = { + constructor: Node, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy + }; + + function Node$2(value) { + this._ = value; + this.next = null; + } + + var shuffle$1 = function(array) { + var i, + n = (array = array.slice()).length, + head = null, + node = head; + + while (n) { + var next = new Node$2(array[n - 1]); + if (node) node = node.next = next; + else node = head = next; + array[i] = array[--n]; + } + + return { + head: head, + tail: node + }; + }; + + var enclose = function(circles) { + return encloseN(shuffle$1(circles), []); + }; + + function encloses(a, b) { + var dx = b.x - a.x, + dy = b.y - a.y, + dr = a.r - b.r; + return dr * dr + 1e-6 > dx * dx + dy * dy; + } + + // Returns the smallest circle that contains circles L and intersects circles B. + function encloseN(L, B) { + var circle, + l0 = null, + l1 = L.head, + l2, + p1; + + switch (B.length) { + case 1: circle = enclose1(B[0]); break; + case 2: circle = enclose2(B[0], B[1]); break; + case 3: circle = enclose3(B[0], B[1], B[2]); break; + } + + while (l1) { + p1 = l1._, l2 = l1.next; + if (!circle || !encloses(circle, p1)) { + + // Temporarily truncate L before l1. + if (l0) L.tail = l0, l0.next = null; + else L.head = L.tail = null; + + B.push(p1); + circle = encloseN(L, B); // Note: reorders L! + B.pop(); + + // Move l1 to the front of L and reconnect the truncated list L. + if (L.head) l1.next = L.head, L.head = l1; + else l1.next = null, L.head = L.tail = l1; + l0 = L.tail, l0.next = l2; + + } else { + l0 = l1; + } + l1 = l2; + } + + L.tail = l0; + return circle; + } + + function enclose1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; + } + + function enclose2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; + } + + function enclose3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = 2 * (x1 - x2), + b2 = 2 * (y1 - y2), + c2 = 2 * (r2 - r1), + d2 = x1 * x1 + y1 * y1 - r1 * r1 - x2 * x2 - y2 * y2 + r2 * r2, + a3 = 2 * (x1 - x3), + b3 = 2 * (y1 - y3), + c3 = 2 * (r3 - r1), + d3 = x1 * x1 + y1 * y1 - r1 * r1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / ab - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / ab - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (xa * xb + ya * yb + r1), + C = xa * xa + ya * ya - r1 * r1, + r = (-B - Math.sqrt(B * B - 4 * A * C)) / (2 * A); + return { + x: xa + xb * r + x1, + y: ya + yb * r + y1, + r: r + }; + } + + function place(a, b, c) { + var ax = a.x, + ay = a.y, + da = b.r + c.r, + db = a.r + c.r, + dx = b.x - ax, + dy = b.y - ay, + dc = dx * dx + dy * dy; + if (dc) { + var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc), + y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc); + c.x = ax + x * dx + y * dy; + c.y = ay + x * dy - y * dx; + } else { + c.x = ax + db; + c.y = ay; + } + } + + function intersects(a, b) { + var dx = b.x - a.x, + dy = b.y - a.y, + dr = a.r + b.r; + return dr * dr > dx * dx + dy * dy; + } + + function distance2(circle, x, y) { + var dx = circle.x - x, + dy = circle.y - y; + return dx * dx + dy * dy; + } + + function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; + } + + function packEnclose(circles) { + if (!(n = circles.length)) return 0; + + var a, b, c, n; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the weighted centroid. + var aa = a.r * a.r, + ba = b.r * b.r, + ca = c.r * c.r, + oa = aa + ba + ca, + ox = aa * a.x + ba * b.x + ca * c.x, + oy = aa * a.y + ba * b.y + ca * c.y, + cx, cy, i, j, k, sj, sk; + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); + + // If there are only three elements in the front-chain… + if ((k = a.previous) === (j = b.next)) { + // If the new circle intersects the third circle, + // rotate the front chain to try the next position. + if (intersects(j._, c._)) { + a = b, b = j, --i; + continue pack; + } + } + + // Find the closest intersecting circle on the front-chain, if any. + else { + sj = j._.r, sk = k._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + j = j.next, sj += j._.r; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + k = k.previous, sk += k._.r; + } + } while (j !== k.next); + } + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Update the weighted centroid. + oa += ca = c._.r * c._.r; + ox += ca * c._.x; + oy += ca * c._.y; + + // Compute the new closest circle a to centroid. + aa = distance2(a._, cx = ox / oa, cy = oy / oa); + while ((c = c.next) !== b) { + if ((ca = distance2(c._, cx, cy)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; + } + + var siblings = function(circles) { + packEnclose(circles); + return circles; + }; + + function optional(f) { + return f == null ? null : required(f); + } + + function required(f) { + if (typeof f !== "function") throw new Error; + return f; + } + + function constantZero() { + return 0; + } + + var constant$6 = function(x) { + return function() { + return x; + }; + }; + + function defaultRadius(d) { + return Math.sqrt(d.value); + } + + var index = function() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function(x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function(x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant$6(+x), pack) : padding; + }; + + return pack; + }; + + function radiusLeaf(radius) { + return function(node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; + } + + function packChildren(padding, k) { + return function(node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; + } + + function translateChild(k) { + return function(node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; + } + + var roundNode = function(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); + }; + + var treemapDice = function(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } + }; + + var partition = function() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function(node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function(x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function(x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; + }; + + var keyPrefix$1 = "$"; + var preroot = {depth: -1}; + var ambiguous = {}; + + function defaultId(d) { + return d.id; + } + + function defaultParentId(d) { + return d.parentId; + } + + var stratify = function() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var d, + i, + n = data.length, + root, + parent, + node, + nodes = new Array(n), + nodeId, + nodeKey, + nodeByKey = {}; + + for (i = 0; i < n; ++i) { + d = data[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = keyPrefix$1 + (node.id = nodeId); + nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i], nodeId = parentId(data[i], i, data); + if (nodeId == null || !(nodeId += "")) { + if (root) throw new Error("multiple roots"); + root = node; + } else { + parent = nodeByKey[keyPrefix$1 + nodeId]; + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function(x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function(x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; + }; + + function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; + } + + // function radialSeparation(a, b) { + // return (a.parent === b.parent ? 1 : 2) / a.depth; + // } + + // This function is used to traverse the left contour of a subtree (or + // subforest). It returns the successor of v on this contour. This successor is + // either given by the leftmost child of v or by the thread of v. The function + // returns null if and only if v is on the highest level of its subtree. + function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; + } + + // This function works analogously to nextLeft. + function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; + } + + // Shifts the current subtree rooted at w+. This is done by increasing + // prelim(w+) and mod(w+) by shift. + function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; + } + + // All other shifts, applied to the smaller subtrees between w- and w+, are + // performed by this function. To prepare the shifts, we have to adjust + // change(w+), shift(w+), and change(w-). + function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } + } + + // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, + // returns the specified (default) ancestor. + function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; + } + + function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number + } + + TreeNode.prototype = Object.create(Node.prototype); + + function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; + } + + // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm + var tree = function() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // 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. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function(x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; + }; + + var treemapSlice = function(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } + }; + + var phi = (1 + Math.sqrt(5)) / 2; + + function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + minValue = maxValue = sumValue = nodes[i0].value; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (i1 = i0 + 1; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { sumValue -= nodeValue; break; } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; + } + + var squarify = (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; + })(phi); + + var index$1 = function() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function(x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function(x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function(x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function(x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$6(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function(x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function(x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$6(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function(x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$6(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function(x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$6(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function(x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$6(+x), treemap) : paddingLeft; + }; + + return treemap; + }; + + var binary = function(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((y1 - y0) > (x1 - x0)) { + var yk = (y0 * valueRight + y1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } else { + var xk = (x0 * valueRight + x1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } + } + }; + + var sliceDice = function(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); + }; + + var resquarify = (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); + else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; + })(phi); + + var center$1 = function(x, y) { + var nodes; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function(_) { + nodes = _; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; + }; + + var constant$7 = function(x) { + return function() { + return x; + }; + }; + + var jiggle = function() { + return (Math.random() - 0.5) * 1e-6; + }; + + function x$1(d) { + return d.x + d.vx; + } + + function y$1(d) { + return d.y + d.vy; + } + + var collide = function(radius) { + var nodes, + radii, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant$7(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = quadtree(nodes, x$1, y$1).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[i], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > i) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + radii = new Array(n); + for (i = 0; i < n; ++i) radii[i] = +radius(nodes[i], i, nodes); + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius; + }; + + return force; + }; + + function index$2(d, i) { + return i; + } + + function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("missing: " + nodeId); + return node; + } + + var link = function(links) { + var id = index$2, + strength = defaultStrength, + strengths, + distance = constant$7(30), + distances, + nodes, + count, + bias, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(); + y = target.y + target.vy - source.y - source.vy || jiggle(); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = map$1(nodes, id), + link; + + for (i = 0, count = new Array(n); i < n; ++i) { + count[i] = 0; + } + + for (i = 0; i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + ++count[link.source.index], ++count[link.target.index]; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function(_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength; + }; + + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance; + }; + + return force; + }; + + function x$2(d) { + return d.x; + } + + function y$2(d) { + return d.y; + } + + var initialRadius = 10; + var initialAngle = Math.PI * (3 - Math.sqrt(5)); + + var simulation = function(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = map$1(), + stepper = timer(step), + event = dispatch("tick", "end"); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick() { + var i, n = nodes.length, node; + + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.each(function(force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function() { + return stepper.restart(step), simulation; + }, + + stop: function() { + return stepper.stop(), simulation; + }, + + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; + }, + + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + force: function(name, _) { + return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function(x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; + }; + + var manyBody = function() { + var nodes, + node, + alpha, + strength = constant$7(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x$2, y$2).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + for (i = 0; i < n; ++i) strengths[i] = +strength(nodes[i], i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, x$$1, y$$1, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x$$1 = y$$1 = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = q.value)) { + strength += c, x$$1 += c * q.x, y$$1 += c * q.y; + } + } + quad.x = x$$1 / strength; + quad.y = y$$1 / strength; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x$$1 = quad.x - node.x, + y$$1 = quad.y - node.y, + w = x2 - x1, + l = x$$1 * x$$1 + y$$1 * y$$1; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x$$1 === 0) x$$1 = jiggle(), l += x$$1 * x$$1; + if (y$$1 === 0) y$$1 = jiggle(), l += y$$1 * y$$1; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x$$1 * quad.value * alpha / l; + node.vy += y$$1 * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x$$1 === 0) x$$1 = jiggle(), l += x$$1 * x$$1; + if (y$$1 === 0) y$$1 = jiggle(), l += y$$1 * y$$1; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x$$1 * w; + node.vy += y$$1 * w; + } while (quad = quad.next); + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; + }; + + var x$3 = function(x) { + var strength = constant$7(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant$7(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x; + }; + + return force; + }; + + var y$3 = function(y) { + var strength = constant$7(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant$7(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y; + }; + + return force; + }; + + function nopropagation() { + exports.event.stopImmediatePropagation(); + } + + var noevent = function() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); + }; + + var dragDisable = function(view) { + var root = view.document.documentElement, + selection$$1 = select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection$$1.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } + }; + + function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection$$1 = select(view).on("dragstart.drag", null); + if (noclick) { + selection$$1.on("click.drag", noevent, true); + setTimeout(function() { selection$$1.on("click.drag", null); }, 0); + } + if ("onselectstart" in root) { + selection$$1.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } + } + + var constant$8 = function(x) { + return function() { + return x; + }; + }; + + function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { + this.target = target; + this.type = type; + this.subject = subject; + this.identifier = id; + this.active = active; + this.x = x; + this.y = y; + this.dx = dx; + this.dy = dy; + this._ = dispatch; + } + + DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; + }; + + // Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !exports.event.button; + } + + function defaultContainer() { + return this.parentNode; + } + + function defaultSubject(d) { + return d == null ? {x: exports.event.x, y: exports.event.y} : d; + } + + var drag = function() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + gestures = {}, + listeners = dispatch("start", "drag", "end"), + active = 0, + mousemoving, + touchending; + + function drag(selection$$1) { + selection$$1 + .on("mousedown.drag", mousedowned) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments); + if (!gesture) return; + select(exports.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + dragDisable(exports.event.view); + nopropagation(); + mousemoving = false; + gesture("start"); + } + + function mousemoved() { + noevent(); + mousemoving = true; + gestures.mouse("drag"); + } + + function mouseupped() { + select(exports.event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(exports.event.view, mousemoving); + noevent(); + gestures.mouse("end"); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches$$1 = exports.event.changedTouches, + c = container.apply(this, arguments), + n = touches$$1.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(touches$$1[i].identifier, c, touch, this, arguments)) { + nopropagation(); + gesture("start"); + } + } + } + + function touchmoved() { + var touches$$1 = exports.event.changedTouches, + n = touches$$1.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches$$1[i].identifier]) { + noevent(); + gesture("drag"); + } + } + } + + function touchended() { + var touches$$1 = exports.event.changedTouches, + n = touches$$1.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches$$1[i].identifier]) { + nopropagation(); + gesture("end"); + } + } + } + + function beforestart(id, container, point, that, args) { + var p = point(container, id), s, dx, dy, + sublisteners = listeners.copy(); + + if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() { + if ((exports.event.subject = s = subject.apply(that, args)) == null) return false; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return true; + })) return; + + return function gesture(type) { + var p0 = p, n; + switch (type) { + case "start": gestures[id] = gesture, n = active++; break; + case "end": delete gestures[id], --active; // nobreak + case "drag": p = point(container, id), n = active; break; + } + customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); + }; + } + + drag.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$8(!!_), drag) : filter; + }; + + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant$8(_), drag) : container; + }; + + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant$8(_), drag) : subject; + }; + + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + return drag; + }; + + var constant$9 = function(x) { + return function() { + return x; + }; + }; + + function x$4(d) { + return d[0]; + } + + function y$4(d) { + return d[1]; + } + + function RedBlackTree() { + this._ = null; // root node + } + + function RedBlackNode(node) { + node.U = // parent node + node.C = // color - true for red, false for black + node.L = // left node + node.R = // right node + node.P = // previous node + node.N = null; // next node + } + + RedBlackTree.prototype = { + constructor: RedBlackTree, + + insert: function(after, node) { + var parent, grandpa, uncle; + + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = RedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + RedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + RedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + + remove: function(node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + + var parent = node.U, + sibling, + left = node.L, + right = node.R, + next, + red; + + if (!left) next = right; + else if (!right) next = left; + else next = RedBlackFirst(right); + + if (parent) { + if (parent.L === node) parent.L = next; + else parent.R = next; + } else { + this._ = next; + } + + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + + if (node) node.U = parent; + if (red) return; + if (node && node.C) { node.C = false; return; } + + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + RedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + RedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateRight(this, parent); + sibling = parent.L; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + RedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + RedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + + if (node) node.C = false; + } + }; + + function RedBlackRotateLeft(tree, node) { + var p = node, + q = node.R, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; + } + + function RedBlackRotateRight(tree, node) { + var p = node, + q = node.L, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; + } + + function RedBlackFirst(node) { + while (node.L) node = node.L; + return node; + } + + function createEdge(left, right, v0, v1) { + var edge = [null, null], + index = edges.push(edge) - 1; + edge.left = left; + edge.right = right; + if (v0) setEdgeEnd(edge, left, right, v0); + if (v1) setEdgeEnd(edge, right, left, v1); + cells[left.index].halfedges.push(index); + cells[right.index].halfedges.push(index); + return edge; + } + + function createBorderEdge(left, v0, v1) { + var edge = [v0, v1]; + edge.left = left; + return edge; + } + + function setEdgeEnd(edge, left, right, vertex) { + if (!edge[0] && !edge[1]) { + edge[0] = vertex; + edge.left = left; + edge.right = right; + } else if (edge.left === right) { + edge[1] = vertex; + } else { + edge[0] = vertex; + } + } + + // Liang–Barsky line clipping. + function clipEdge(edge, x0, y0, x1, y1) { + var a = edge[0], + b = edge[1], + ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? + + if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy]; + if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy]; + return true; + } + + function connectEdge(edge, x0, y0, x1, y1) { + var v1 = edge[1]; + if (v1) return true; + + var v0 = edge[0], + left = edge.left, + right = edge.right, + lx = left[0], + ly = left[1], + rx = right[0], + ry = right[1], + fx = (lx + rx) / 2, + fy = (ly + ry) / 2, + fm, + fb; + + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!v0) v0 = [fx, y0]; + else if (v0[1] >= y1) return; + v1 = [fx, y1]; + } else { + if (!v0) v0 = [fx, y1]; + else if (v0[1] < y0) return; + v1 = [fx, y0]; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!v0) v0 = [(y0 - fb) / fm, y0]; + else if (v0[1] >= y1) return; + v1 = [(y1 - fb) / fm, y1]; + } else { + if (!v0) v0 = [(y1 - fb) / fm, y1]; + else if (v0[1] < y0) return; + v1 = [(y0 - fb) / fm, y0]; + } + } else { + if (ly < ry) { + if (!v0) v0 = [x0, fm * x0 + fb]; + else if (v0[0] >= x1) return; + v1 = [x1, fm * x1 + fb]; + } else { + if (!v0) v0 = [x1, fm * x1 + fb]; + else if (v0[0] < x0) return; + v1 = [x0, fm * x0 + fb]; + } + } + } + + edge[0] = v0; + edge[1] = v1; + return true; + } + + function clipEdges(x0, y0, x1, y1) { + var i = edges.length, + edge; + + while (i--) { + if (!connectEdge(edge = edges[i], x0, y0, x1, y1) + || !clipEdge(edge, x0, y0, x1, y1) + || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$3 + || Math.abs(edge[0][1] - edge[1][1]) > epsilon$3)) { + delete edges[i]; + } + } + } + + function createCell(site) { + return cells[site.index] = { + site: site, + halfedges: [] + }; + } + + function cellHalfedgeAngle(cell, edge) { + var site = cell.site, + va = edge.left, + vb = edge.right; + if (site === vb) vb = va, va = site; + if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); + if (site === va) va = edge[1], vb = edge[0]; + else va = edge[0], vb = edge[1]; + return Math.atan2(va[0] - vb[0], vb[1] - va[1]); + } + + function cellHalfedgeStart(cell, edge) { + return edge[+(edge.left !== cell.site)]; + } + + function cellHalfedgeEnd(cell, edge) { + return edge[+(edge.left === cell.site)]; + } + + function sortCellHalfedges() { + for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { + if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { + var index = new Array(m), + array = new Array(m); + for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); + index.sort(function(i, j) { return array[j] - array[i]; }); + for (j = 0; j < m; ++j) array[j] = halfedges[index[j]]; + for (j = 0; j < m; ++j) halfedges[j] = array[j]; + } + } + } + + function clipCells(x0, y0, x1, y1) { + var nCells = cells.length, + iCell, + cell, + site, + iHalfedge, + halfedges, + nHalfedges, + start, + startX, + startY, + end, + endX, + endY, + cover = true; + + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + halfedges = cell.halfedges; + iHalfedge = halfedges.length; + + // Remove any dangling clipped edges. + while (iHalfedge--) { + if (!edges[halfedges[iHalfedge]]) { + halfedges.splice(iHalfedge, 1); + } + } + + // Insert any border edges as necessary. + iHalfedge = 0, nHalfedges = halfedges.length; + while (iHalfedge < nHalfedges) { + end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; + start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; + if (Math.abs(endX - startX) > epsilon$3 || Math.abs(endY - startY) > epsilon$3) { + halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, + Math.abs(endX - x0) < epsilon$3 && y1 - endY > epsilon$3 ? [x0, Math.abs(startX - x0) < epsilon$3 ? startY : y1] + : Math.abs(endY - y1) < epsilon$3 && x1 - endX > epsilon$3 ? [Math.abs(startY - y1) < epsilon$3 ? startX : x1, y1] + : Math.abs(endX - x1) < epsilon$3 && endY - y0 > epsilon$3 ? [x1, Math.abs(startX - x1) < epsilon$3 ? startY : y0] + : Math.abs(endY - y0) < epsilon$3 && endX - x0 > epsilon$3 ? [Math.abs(startY - y0) < epsilon$3 ? startX : x0, y0] + : null)) - 1); + ++nHalfedges; + } + } + + if (nHalfedges) cover = false; + } + } + + // If there weren’t any edges, have the closest site cover the extent. + // It doesn’t matter which corner of the extent we measure! + if (cover) { + var dx, dy, d2, dc = Infinity; + + for (iCell = 0, cover = null; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + dx = site[0] - x0; + dy = site[1] - y0; + d2 = dx * dx + dy * dy; + if (d2 < dc) dc = d2, cover = cell; + } + } + + if (cover) { + var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; + cover.halfedges.push( + edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, + edges.push(createBorderEdge(site, v01, v11)) - 1, + edges.push(createBorderEdge(site, v11, v10)) - 1, + edges.push(createBorderEdge(site, v10, v00)) - 1 + ); + } + } + + // Lastly delete any cells with no edges; these were entirely clipped. + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + if (!cell.halfedges.length) { + delete cells[iCell]; + } + } + } + } + + var circlePool = []; + + var firstCircle; + + function Circle() { + RedBlackNode(this); + this.x = + this.y = + this.arc = + this.site = + this.cy = null; + } + + function attachCircle(arc) { + var lArc = arc.P, + rArc = arc.N; + + if (!lArc || !rArc) return; + + var lSite = lArc.site, + cSite = arc.site, + rSite = rArc.site; + + if (lSite === rSite) return; + + var bx = cSite[0], + by = cSite[1], + ax = lSite[0] - bx, + ay = lSite[1] - by, + cx = rSite[0] - bx, + cy = rSite[1] - by; + + var d = 2 * (ax * cy - ay * cx); + if (d >= -epsilon2$1) return; + + var ha = ax * ax + ay * ay, + hc = cx * cx + cy * cy, + x = (cy * ha - ay * hc) / d, + y = (ax * hc - cx * ha) / d; + + var circle = circlePool.pop() || new Circle; + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom + + arc.circle = circle; + + var before = null, + node = circles._; + + while (node) { + if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { + if (node.L) node = node.L; + else { before = node.P; break; } + } else { + if (node.R) node = node.R; + else { before = node; break; } + } + } + + circles.insert(before, circle); + if (!before) firstCircle = circle; + } + + function detachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) firstCircle = circle.N; + circles.remove(circle); + circlePool.push(circle); + RedBlackNode(circle); + arc.circle = null; + } + } + + var beachPool = []; + + function Beach() { + RedBlackNode(this); + this.edge = + this.site = + this.circle = null; + } + + function createBeach(site) { + var beach = beachPool.pop() || new Beach; + beach.site = site; + return beach; + } + + function detachBeach(beach) { + detachCircle(beach); + beaches.remove(beach); + beachPool.push(beach); + RedBlackNode(beach); + } + + function removeBeach(beach) { + var circle = beach.circle, + x = circle.x, + y = circle.cy, + vertex = [x, y], + previous = beach.P, + next = beach.N, + disappearing = [beach]; + + detachBeach(beach); + + var lArc = previous; + while (lArc.circle + && Math.abs(x - lArc.circle.x) < epsilon$3 + && Math.abs(y - lArc.circle.cy) < epsilon$3) { + previous = lArc.P; + disappearing.unshift(lArc); + detachBeach(lArc); + lArc = previous; + } + + disappearing.unshift(lArc); + detachCircle(lArc); + + var rArc = next; + while (rArc.circle + && Math.abs(x - rArc.circle.x) < epsilon$3 + && Math.abs(y - rArc.circle.cy) < epsilon$3) { + next = rArc.N; + disappearing.push(rArc); + detachBeach(rArc); + rArc = next; + } + + disappearing.push(rArc); + detachCircle(rArc); + + var nArcs = disappearing.length, + iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); + + attachCircle(lArc); + attachCircle(rArc); + } + + function addBeach(site) { + var x = site[0], + directrix = site[1], + lArc, + rArc, + dxl, + dxr, + node = beaches._; + + while (node) { + dxl = leftBreakPoint(node, directrix) - x; + if (dxl > epsilon$3) node = node.L; else { + dxr = x - rightBreakPoint(node, directrix); + if (dxr > epsilon$3) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -epsilon$3) { + lArc = node.P; + rArc = node; + } else if (dxr > -epsilon$3) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + + createCell(site); + var newArc = createBeach(site); + beaches.insert(lArc, newArc); + + if (!lArc && !rArc) return; + + if (lArc === rArc) { + detachCircle(lArc); + rArc = createBeach(lArc.site); + beaches.insert(newArc, rArc); + newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); + attachCircle(lArc); + attachCircle(rArc); + return; + } + + if (!rArc) { // && lArc + newArc.edge = createEdge(lArc.site, newArc.site); + return; + } + + // else lArc !== rArc + detachCircle(lArc); + detachCircle(rArc); + + var lSite = lArc.site, + ax = lSite[0], + ay = lSite[1], + bx = site[0] - ax, + by = site[1] - ay, + rSite = rArc.site, + cx = rSite[0] - ax, + cy = rSite[1] - ay, + d = 2 * (bx * cy - by * cx), + hb = bx * bx + by * by, + hc = cx * cx + cy * cy, + vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; + + setEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = createEdge(lSite, site, null, vertex); + rArc.edge = createEdge(site, rSite, null, vertex); + attachCircle(lArc); + attachCircle(rArc); + } + + function leftBreakPoint(arc, directrix) { + var site = arc.site, + rfocx = site[0], + rfocy = site[1], + pby2 = rfocy - directrix; + + if (!pby2) return rfocx; + + var lArc = arc.P; + if (!lArc) return -Infinity; + + site = lArc.site; + var lfocx = site[0], + lfocy = site[1], + plby2 = lfocy - directrix; + + if (!plby2) return lfocx; + + var hl = lfocx - rfocx, + aby2 = 1 / pby2 - 1 / plby2, + b = hl / plby2; + + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + + return (rfocx + lfocx) / 2; + } + + function rightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return leftBreakPoint(rArc, directrix); + var site = arc.site; + return site[1] === directrix ? site[0] : Infinity; + } + + var epsilon$3 = 1e-6; + var epsilon2$1 = 1e-12; + var beaches; + var cells; + var circles; + var edges; + + function triangleArea(a, b, c) { + return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); + } + + function lexicographic(a, b) { + return b[1] - a[1] + || b[0] - a[0]; + } + + function Diagram(sites, extent) { + var site = sites.sort(lexicographic).pop(), + x, + y, + circle; + + edges = []; + cells = new Array(sites.length); + beaches = new RedBlackTree; + circles = new RedBlackTree; + + while (true) { + circle = firstCircle; + if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { + if (site[0] !== x || site[1] !== y) { + addBeach(site); + x = site[0], y = site[1]; + } + site = sites.pop(); + } else if (circle) { + removeBeach(circle.arc); + } else { + break; + } + } + + sortCellHalfedges(); + + if (extent) { + var x0 = +extent[0][0], + y0 = +extent[0][1], + x1 = +extent[1][0], + y1 = +extent[1][1]; + clipEdges(x0, y0, x1, y1); + clipCells(x0, y0, x1, y1); + } + + this.edges = edges; + this.cells = cells; + + beaches = + circles = + edges = + cells = null; + } + + Diagram.prototype = { + constructor: Diagram, + + polygons: function() { + var edges = this.edges; + + return this.cells.map(function(cell) { + var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); }); + polygon.data = cell.site.data; + return polygon; + }); + }, + + triangles: function() { + var triangles = [], + edges = this.edges; + + this.cells.forEach(function(cell, i) { + var site = cell.site, + halfedges = cell.halfedges, + j = -1, + m = halfedges.length, + s0, + e1 = edges[halfedges[m - 1]], + s1 = e1.left === site ? e1.right : e1.left; + + while (++j < m) { + s0 = s1; + e1 = edges[halfedges[j]]; + s1 = e1.left === site ? e1.right : e1.left; + if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { + triangles.push([site.data, s0.data, s1.data]); + } + } + }); + + return triangles; + }, + + links: function() { + return this.edges.filter(function(edge) { + return edge.right; + }).map(function(edge) { + return { + source: edge.left.data, + target: edge.right.data + }; + }); + }, + + find: function(x, y, radius) { + var that = this, + i0, i1 = that._found || 0, + cell = that.cells[i1] || that.cells[i1 = 0], + dx = x - cell.site[0], + dy = y - cell.site[1], + d2 = dx * dx + dy * dy; + + do { + cell = that.cells[i0 = i1], i1 = null; + cell.halfedges.forEach(function(e) { + var edge = that.edges[e], v = edge.left; + if ((v === cell.site || !v) && !(v = edge.right)) return; + var vx = x - v[0], + vy = y - v[1], + v2 = vx * vx + vy * vy; + if (v2 < d2) d2 = v2, i1 = v.index; + }); + } while (i1 !== null); + + that._found = i0; + + return radius == null || d2 <= radius * radius ? cell.site : null; + } + }; + + var voronoi = function() { + var x$$1 = x$4, + y$$1 = y$4, + extent = null; + + function voronoi(data) { + return new Diagram(data.map(function(d, i) { + var s = [Math.round(x$$1(d, i, data) / epsilon$3) * epsilon$3, Math.round(y$$1(d, i, data) / epsilon$3) * epsilon$3]; + s.index = i; + s.data = d; + return s; + }), extent); + } + + voronoi.polygons = function(data) { + return voronoi(data).polygons(); + }; + + voronoi.links = function(data) { + return voronoi(data).links(); + }; + + voronoi.triangles = function(data) { + return voronoi(data).triangles(); + }; + + voronoi.x = function(_) { + return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$9(+_), voronoi) : x$$1; + }; + + voronoi.y = function(_) { + return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$9(+_), voronoi) : y$$1; + }; + + voronoi.extent = function(_) { + return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]]; + }; + + voronoi.size = function(_) { + return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; + }; + + return voronoi; + }; + + var constant$10 = function(x) { + return function() { + return x; + }; + }; + + function ZoomEvent(target, type, transform) { + this.target = target; + this.type = type; + this.transform = transform; + } + + function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; + } + + Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x) { + return x * this.k + this.x; + }, + applyY: function(y) { + return y * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x) { + return (x - this.x) / this.k; + }, + invertY: function(y) { + return (y - this.y) / this.k; + }, + rescaleX: function(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } + }; + + var identity$6 = new Transform(1, 0, 0); + + transform.prototype = Transform.prototype; + + function transform(node) { + return node.__zoom || identity$6; + } + + function nopropagation$1() { + exports.event.stopImmediatePropagation(); + } + + var noevent$1 = function() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); + }; + + // Ignore right-click, since that should open the context menu. + function defaultFilter$1() { + return !exports.event.button; + } + + function defaultExtent() { + var e = this, w, h; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + w = e.width.baseVal.value; + h = e.height.baseVal.value; + } else { + w = e.clientWidth; + h = e.clientHeight; + } + return [[0, 0], [w, h]]; + } + + function defaultTransform() { + return this.__zoom || identity$6; + } + + var zoom = function() { + var filter = defaultFilter$1, + extent = defaultExtent, + k0 = 0, + k1 = Infinity, + x0 = -k1, + x1 = k1, + y0 = x0, + y1 = x1, + duration = 250, + gestures = [], + listeners = dispatch("start", "zoom", "end"), + touchstarting, + touchending, + touchDelay = 500, + wheelDelay = 150; + + function zoom(selection$$1) { + selection$$1 + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)") + .property("__zoom", defaultTransform); + } + + zoom.transform = function(collection, transform) { + var selection$$1 = collection.selection ? collection.selection() : collection; + selection$$1.property("__zoom", defaultTransform); + if (collection !== selection$$1) { + schedule(collection, transform); + } else { + selection$$1.interrupt().each(function() { + gesture(this, arguments) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function(selection$$1, k) { + zoom.scaleTo(selection$$1, function() { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }); + }; + + zoom.scaleTo = function(selection$$1, k) { + zoom.transform(selection$$1, function() { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = centroid(e), + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e); + }); + }; + + zoom.translateBy = function(selection$$1, x, y) { + zoom.transform(selection$$1, function() { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments)); + }); + }; + + function scale(transform, k) { + k = Math.max(k0, Math.min(k1, k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function constrain(transform, extent) { + var dx = Math.min(0, transform.invertX(extent[0][0]) - x0) || Math.max(0, transform.invertX(extent[1][0]) - x1), + dy = Math.min(0, transform.invertY(extent[0][1]) - y0) || Math.max(0, transform.invertY(extent[1][1]) - y1); + return dx || dy ? transform.translate(dx, dy) : transform; + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition$$1, transform, center) { + transition$$1 + .on("start.zoom", function() { gesture(this, arguments).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); }) + .tween("zoom", function() { + var that = this, + args = arguments, + g = gesture(that, args), + e = extent.apply(that, args), + p = center || centroid(e), + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolateZoom(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args) { + for (var i = 0, n = gestures.length, g; i < n; ++i) { + if ((g = gestures[i]).that === that) { + return g; + } + } + return new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.index = -1; + this.active = 0; + this.extent = extent.apply(that, args); + } + + Gesture.prototype = { + start: function() { + if (++this.active === 1) { + this.index = gestures.push(this) - 1; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + gestures.splice(this.index, 1); + this.index = -1; + this.emit("end"); + } + return this; + }, + emit: function(type) { + customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function wheeled() { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + t = this.__zoom, + k = Math.max(k0, Math.min(k1, t.k * Math.pow(2, -exports.event.deltaY * (exports.event.deltaMode ? 120 : 1) / 500))), + p = mouse(this); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + interrupt(this); + g.start(); + } + + noevent$1(); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + v = select(exports.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = mouse(this); + + dragDisable(exports.event.view); + nopropagation$1(); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt(this); + g.start(); + + function mousemoved() { + noevent$1(); + g.moved = true; + g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent)); + } + + function mouseupped() { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(exports.event.view, g.moved); + noevent$1(); + g.end(); + } + } + + function dblclicked() { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = mouse(this), + p1 = t0.invert(p0), + k1 = t0.k * (exports.event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments)); + + noevent$1(); + if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0); + else select(this).call(zoom.transform, t1); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + touches$$1 = exports.event.changedTouches, + n = touches$$1.length, i, t, p; + + nopropagation$1(); + for (i = 0; i < n; ++i) { + t = touches$$1[i], p = touch(this, touches$$1, t.identifier); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p; + else if (!g.touch1) g.touch1 = p; + } + if (touchstarting) { + touchstarting = clearTimeout(touchstarting); + if (!g.touch1) return g.end(), dblclicked.apply(this, arguments); + } + if (exports.event.touches.length === n) { + touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + interrupt(this); + g.start(); + } + } + + function touchmoved() { + var g = gesture(this, arguments), + touches$$1 = exports.event.changedTouches, + n = touches$$1.length, i, t, p, l; + + noevent$1(); + if (touchstarting) touchstarting = clearTimeout(touchstarting); + for (i = 0; i < n; ++i) { + t = touches$$1[i], p = touch(this, touches$$1, t.identifier); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } + else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent)); + } + + function touchended() { + var g = gesture(this, arguments), + touches$$1 = exports.event.changedTouches, + n = touches$$1.length, i, t; + + nopropagation$1(); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches$$1[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (!g.touch0) g.end(); + } + + zoom.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$10(!!_), zoom) : filter; + }; + + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$10([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function(_) { + return arguments.length ? (k0 = +_[0], k1 = +_[1], zoom) : [k0, k1]; + }; + + zoom.translateExtent = function(_) { + return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], zoom) : [[x0, y0], [x1, y1]]; + }; + + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + return zoom; + }; + + var constant$11 = function(x) { + return function() { + return x; + }; + }; + + var BrushEvent = function(target, type, selection) { + this.target = target; + this.type = type; + this.selection = selection; + }; + + function nopropagation$2() { + exports.event.stopImmediatePropagation(); + } + + var noevent$2 = function() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); + }; + + var MODE_DRAG = {name: "drag"}; + var MODE_SPACE = {name: "space"}; + var MODE_HANDLE = {name: "handle"}; + var MODE_CENTER = {name: "center"}; + + var X = { + name: "x", + handles: ["e", "w"].map(type$1), + input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; }, + output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } + }; + + var Y = { + name: "y", + handles: ["n", "s"].map(type$1), + input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; }, + output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } + }; + + var XY = { + name: "xy", + handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type$1), + input: function(xy) { return xy; }, + output: function(xy) { return xy; } + }; + + var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" + }; + + var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" + }; + + var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" + }; + + var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 + }; + + var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 + }; + + function type$1(t) { + return {type: t}; + } + + // Ignore right-click, since that should open the context menu. + function defaultFilter$2() { + return !exports.event.button; + } + + function defaultExtent$1() { + var svg = this.ownerSVGElement || this; + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; + } + + // Like d3.local, but with the name “__brush†rather than auto-generated. + function local$1(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; + } + + function empty$1(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; + } + + function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; + } + + function brushX() { + return brush$1(X); + } + + function brushY() { + return brush$1(Y); + } + + var brush = function() { + return brush$1(XY); + }; + + function brush$1(dim) { + var extent = defaultExtent$1, + filter = defaultFilter$2, + listeners = dispatch(brush, "start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type$1("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function() { + var extent = local$1(this).extent; + select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type$1("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function(d) { return d.type; }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function(d) { return "handle handle--" + d.type; }) + .attr("cursor", function(d) { return cursors[d.type]; }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)") + .on("mousedown.brush touchstart.brush", started); + } + + brush.move = function(group, selection$$1) { + if (group.selection) { + group + .on("start.brush", function() { emitter(this, arguments).beforestart().start(); }) + .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); }) + .tween("brush", function() { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(this, arguments) : selection$$1, state.extent), + i = interpolate(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && empty$1(selection1) ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 && selection1 ? tween : tween(1); + }); + } else { + group + .each(function() { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(that, args) : selection$$1, state.extent), + emit = emitter(that, args).beforestart(); + + interrupt(that); + state.selection = selection1 == null || empty$1(selection1) ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + function redraw() { + var group = select(this), + selection$$1 = local$1(this).selection; + + if (selection$$1) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection$$1[0][0]) + .attr("y", selection$$1[0][1]) + .attr("width", selection$$1[1][0] - selection$$1[0][0]) + .attr("height", selection$$1[1][1] - selection$$1[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection$$1[1][0] - handleSize / 2 : selection$$1[0][0] - handleSize / 2; }) + .attr("y", function(d) { return d.type[0] === "s" ? selection$$1[1][1] - handleSize / 2 : selection$$1[0][1] - handleSize / 2; }) + .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection$$1[1][0] - selection$$1[0][0] + handleSize : handleSize; }) + .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection$$1[1][1] - selection$$1[0][1] + handleSize : handleSize; }); + } + + else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } + + function emitter(that, args) { + return that.__brush.emitter || new Emitter(that, args); + } + + function Emitter(that, args) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + } + + Emitter.prototype = { + beforestart: function() { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function() { + if (this.starting) this.starting = false, this.emit("start"); + return this; + }, + brush: function() { + this.emit("brush"); + return this; + }, + end: function() { + if (--this.active === 0) delete this.state.emitter, this.emit("end"); + return this; + }, + emit: function(type) { + customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function started() { + if (exports.event.touches) { if (exports.event.changedTouches.length < exports.event.touches.length) return noevent$2(); } + else if (touchending) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = exports.event.target.__data__.type, + mode = (exports.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (exports.event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local$1(that), + extent = state.extent, + selection$$1 = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx, + dy, + moving, + shifting = signX && signY && exports.event.shiftKey, + lockX, + lockY, + point0 = mouse(that), + point = point0, + emit = emitter(that, arguments).beforestart(); + + if (type === "overlay") { + state.selection = selection$$1 = [ + [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], + [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] + ]; + } else { + w0 = selection$$1[0][0]; + n0 = selection$$1[0][1]; + e0 = selection$$1[1][0]; + s0 = selection$$1[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + if (exports.event.touches) { + group + .on("touchmove.brush", moved, true) + .on("touchend.brush touchcancel.brush", ended, true); + } else { + var view = select(exports.event.view) + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + + dragDisable(exports.event.view); + } + + nopropagation$2(); + interrupt(that); + redraw.call(that); + emit.start(); + + function moved() { + var point1 = mouse(that); + if (shifting && !lockX && !lockY) { + if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; + else lockX = true; + } + point = point1; + moving = true; + noevent$2(); + move(); + } + + function move() { + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + break; + } + case MODE_CENTER: { + if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); + if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection$$1 = state.selection; // May be set by brush.move! + if (lockX) w1 = selection$$1[0][0], e1 = selection$$1[1][0]; + if (lockY) n1 = selection$$1[0][1], s1 = selection$$1[1][1]; + + if (selection$$1[0][0] !== w1 + || selection$$1[0][1] !== n1 + || selection$$1[1][0] !== e1 + || selection$$1[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(); + } + } + + function ended() { + nopropagation$2(); + if (exports.event.touches) { + if (exports.event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + group.on("touchmove.brush touchend.brush touchcancel.brush", null); + } else { + yesdrag(exports.event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection$$1 = state.selection; // May be set by brush.move (on start)! + if (empty$1(selection$$1)) state.selection = null, redraw.call(that); + emit.end(); + } + + function keydowned() { + switch (exports.event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: return; + } + noevent$2(); + } + + function keyupped() { + switch (exports.event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (exports.event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: return; + } + noevent$2(); + } + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = extent.apply(this, arguments); + state.dim = dim; + return state; + } + + brush.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$11([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent; + }; + + brush.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$11(!!_), brush) : filter; + }; + + brush.handleSize = function(_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; + } + + var cos = Math.cos; + var sin = Math.sin; + var pi$3 = Math.PI; + var halfPi$2 = pi$3 / 2; + var tau$3 = pi$3 * 2; + var max$1 = Math.max; + + function compareValue(compare) { + return function(a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; + } + + var chord = function() { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = [], + groupIndex = range(n), + subgroupIndex = [], + chords = [], + groups = chords.groups = new Array(n), + subgroups = new Array(n * n), + k, + x, + x0, + dx, + i, + j; + + // Compute the sum. + k = 0, i = -1; while (++i < n) { + x = 0, j = -1; while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(range(n)); + k += x; + } + + // Sort groups… + if (sortGroups) groupIndex.sort(function(a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + + // Sort subgroups… + if (sortSubgroups) subgroupIndex.forEach(function(d, i) { + d.sort(function(a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + + // Convert the sum to scaling factor for [0, 2pi]. + // TODO Allow start and end angle to be specified? + // TODO Allow padding to be specified as percentage? + k = max$1(0, tau$3 - padAngle * n) / k; + dx = k ? padAngle : tau$3 / n; + + // Compute the start and end angle for each group and subgroup. + // Note: Opera has a bug reordering object literal properties! + x = 0, i = -1; while (++i < n) { + x0 = x, j = -1; while (++j < n) { + var di = groupIndex[i], + dj = subgroupIndex[di][j], + v = matrix[di][dj], + a0 = x, + a1 = x += v * k; + subgroups[dj * n + di] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += dx; + } + + // Generate chords for each (non-empty) subgroup-subgroup link. + i = -1; while (++i < n) { + j = i - 1; while (++j < n) { + var source = subgroups[j * n + i], + target = subgroups[i * n + j]; + if (source.value || target.value) { + chords.push(source.value < target.value + ? {source: target, target: source} + : {source: source, target: target}); + } + } + } + + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function(_) { + return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle; + }; + + chord.sortGroups = function(_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function(_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function(_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; + }; + + var slice$5 = Array.prototype.slice; + + var constant$12 = function(x) { + return function() { + return x; + }; + }; + + function defaultSource(d) { + return d.source; + } + + function defaultTarget(d) { + return d.target; + } + + function defaultRadius$1(d) { + return d.radius; + } + + function defaultStartAngle(d) { + return d.startAngle; + } + + function defaultEndAngle(d) { + return d.endAngle; + } + + var ribbon = function() { + var source = defaultSource, + target = defaultTarget, + radius = defaultRadius$1, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + context = null; + + function ribbon() { + var buffer, + argv = slice$5.call(arguments), + s = source.apply(this, argv), + t = target.apply(this, argv), + sr = +radius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi$2, + sa1 = endAngle.apply(this, argv) - halfPi$2, + sx0 = sr * cos(sa0), + sy0 = sr * sin(sa0), + tr = +radius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi$2, + ta1 = endAngle.apply(this, argv) - halfPi$2; + + if (!context) context = buffer = path(); + + context.moveTo(sx0, sy0); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + context.quadraticCurveTo(0, 0, sx0, sy0); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + ribbon.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$12(+_), ribbon) : radius; + }; + + ribbon.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$12(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$12(+_), ribbon) : endAngle; + }; + + ribbon.source = function(_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function(_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; + }; + + // Adds floating point numbers with twice the normal precision. + // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and + // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) + // 305–363 (1997). + // Code adapted from GeographicLib by Charles F. F. Karney, + // http://geographiclib.sourceforge.net/ + + var adder = function() { + return new Adder; + }; + + function Adder() { + this.reset(); + } + + Adder.prototype = { + constructor: Adder, + reset: function() { + this.s = // rounded value + this.t = 0; // exact error + }, + add: function(y) { + add$1(temp, y, this.t); + add$1(this, temp.s, this.s); + if (this.s) this.t += temp.t; + else this.s = temp.t; + }, + valueOf: function() { + return this.s; + } + }; + + var temp = new Adder; + + function add$1(adder, a, b) { + var x = adder.s = a + b, + bv = x - a, + av = x - bv; + adder.t = (a - av) + (b - bv); + } + + var epsilon$4 = 1e-6; + var epsilon2$2 = 1e-12; + var pi$4 = Math.PI; + var halfPi$3 = pi$4 / 2; + var quarterPi = pi$4 / 4; + var tau$4 = pi$4 * 2; + + var degrees$1 = 180 / pi$4; + var radians = pi$4 / 180; + + var abs = Math.abs; + var atan = Math.atan; + var atan2 = Math.atan2; + var cos$1 = Math.cos; + var ceil = Math.ceil; + var exp = Math.exp; + + var log$1 = Math.log; + var pow$1 = Math.pow; + var sin$1 = Math.sin; + var sign$1 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; + var sqrt$1 = Math.sqrt; + var tan = Math.tan; + + function acos(x) { + return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x); + } + + function asin$1(x) { + return x > 1 ? halfPi$3 : x < -1 ? -halfPi$3 : Math.asin(x); + } + + function haversin(x) { + return (x = sin$1(x / 2)) * x; + } + + function noop$2() {} + + function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } + } + + var streamObjectType = { + Feature: function(feature, stream) { + streamGeometry(feature.geometry, stream); + }, + FeatureCollection: function(object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } + }; + + var streamGeometryType = { + Sphere: function(object, stream) { + stream.sphere(); + }, + Point: function(object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function(object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function(object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function(object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } + }; + + function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); + } + + function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); + } + + var geoStream = function(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } + }; + + var areaRingSum = adder(); + + var areaSum = adder(); + var lambda00; + var phi00; + var lambda0; + var cosPhi0; + var sinPhi0; + + var areaStream = { + point: noop$2, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: function() { + areaRingSum.reset(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function() { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau$4 + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop$2; + }, + sphere: function() { + areaSum.add(tau$4); + } + }; + + function areaRingStart() { + areaStream.point = areaPointFirst; + } + + function areaRingEnd() { + areaPoint(lambda00, phi00); + } + + function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi); + } + + function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos$1(phi), + sinPhi = sin$1(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos$1(adLambda), + v = k * sdLambda * sin$1(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; + } + + var area$2 = function(object) { + areaSum.reset(); + geoStream(object, areaStream); + return areaSum * 2; + }; + + function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin$1(cartesian[2])]; + } + + function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi); + return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)]; + } + + function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + + function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; + } + + // TODO return a + function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; + } + + function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; + } + + // TODO return d + function cartesianNormalizeInPlace(d) { + var l = sqrt$1(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; + } + + var lambda0$1; + var phi0; + var lambda1; + var phi1; + var lambda2; + var lambda00$1; + var phi00$1; + var p0; + var deltaSum = adder(); + var ranges; + var range$1; + + var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function() { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum.reset(); + areaStream.polygonStart(); + }, + polygonEnd: function() { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon$4) phi1 = 90; + else if (deltaSum < -epsilon$4) phi0 = -90; + range$1[0] = lambda0$1, range$1[1] = lambda1; + } + }; + + function boundsPoint(lambda, phi) { + ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + + function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign$$1 = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees$1 * sign$$1, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) { + phii = inflection[1] * degrees$1; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) { + phii = -inflection[1] * degrees$1; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + boundsPoint(lambda, phi); + } + p0 = p, lambda2 = lambda; + } + + function boundsLineStart() { + boundsStream.point = linePoint; + } + + function boundsLineEnd() { + range$1[0] = lambda0$1, range$1[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; + } + + function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); + } + + function boundsRingStart() { + areaStream.lineStart(); + } + + function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon$4) lambda0$1 = -(lambda1 = 180); + range$1[0] = lambda0$1, range$1[1] = lambda1; + p0 = null; + } + + // Finds the left-right distance between two longitudes. + // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want + // the distance between ±180° to be 360°. + function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; + } + + function rangeCompare(a, b) { + return a[0] - b[0]; + } + + function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; + } + + var bounds = function(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range$1 = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; + }; + + var W0; + var W1; + var X0; + var Y0; + var Z0; + var X1; + var Y1; + var Z1; + var X2; + var Y2; + var Z2; + var lambda00$2; + var phi00$2; + var x0; + var y0; + var z0; // previous point + + var centroidStream = { + sphere: noop$2, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } + }; + + // Arithmetic mean of Cartesian vectors. + function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)); + } + + function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; + } + + function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; + } + + function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); + } + + function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + w = atan2(sqrt$1((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + function centroidLineEnd() { + centroidStream.point = centroidPoint; + } + + // See J. E. Brock, The Inertia Tensor for a Spherical Triangle, + // J. Applied Mechanics 42, 239 (1975). + function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; + } + + function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; + } + + function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidPointCartesian(x0, y0, z0); + } + + function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = sqrt$1(cx * cx + cy * cy + cz * cz), + u = x0 * x + y0 * y + z0 * z, + v = m && -acos(u) / m, // area weight + w = atan2(m, u); // line weight + X2 += v * cx; + Y2 += v * cy; + Z2 += v * cz; + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + var centroid$1 = function(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + geoStream(object, centroidStream); + + var x = X2, + y = Y2, + z = Z2, + m = x * x + y * y + z * z; + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2$2) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon$4) x = X0, y = Y0, z = Z0; + m = x * x + y * y + z * z; + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2$2) return [NaN, NaN]; + } + + return [atan2(y, x) * degrees$1, asin$1(z / sqrt$1(m)) * degrees$1]; + }; + + var constant$13 = function(x) { + return function() { + return x; + }; + }; + + var compose = function(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; + }; + + function rotationIdentity(lambda, phi) { + return [lambda > pi$4 ? lambda - tau$4 : lambda < -pi$4 ? lambda + tau$4 : lambda, phi]; + } + + rotationIdentity.invert = rotationIdentity; + + function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau$4) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); + } + + function forwardRotationLambda(deltaLambda) { + return function(lambda, phi) { + return lambda += deltaLambda, [lambda > pi$4 ? lambda - tau$4 : lambda < -pi$4 ? lambda + tau$4 : lambda, phi]; + }; + } + + function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; + } + + function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos$1(deltaPhi), + sinDeltaPhi = sin$1(deltaPhi), + cosDeltaGamma = cos$1(deltaGamma), + sinDeltaGamma = sin$1(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin$1(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin$1(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; + } + + var rotation = function(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + } + + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + }; + + return forward; + }; + + // Generates a circle centered at [0°, 0°], with a given radius and precision. + function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos$1(radius), + sinRadius = sin$1(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau$4; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$4; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]); + stream.point(point[0], point[1]); + } + } + + // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. + function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau$4 - epsilon$4) % tau$4; + } + + var circle$1 = function() { + var center = constant$13([0, 0]), + radius = constant$13(90), + precision = constant$13(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees$1, x[1] *= degrees$1; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function(_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant$13([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$13(+_), circle) : radius; + }; + + circle.precision = function(_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant$13(+_), circle) : precision; + }; + + return circle; + }; + + var clipBuffer = function() { + var lines = [], + line; + return { + point: function(x, y) { + line.push([x, y]); + }, + lineStart: function() { + lines.push(line = []); + }, + lineEnd: noop$2, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function() { + var result = lines; + lines = []; + line = null; + return result; + } + }; + }; + + var clipLine = function(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; + }; + + var pointEqual = function(a, b) { + return abs(a[0] - b[0]) < epsilon$4 && abs(a[1] - b[1]) < epsilon$4; + }; + + function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous + } + + // A generalized polygon clipping algorithm: given a polygon that has been cut + // into its visible line segments, and rejoins the segments by interpolating + // along the clip edge. + var clipPolygon = function(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + // If the first and last points of a segment are coincident, then treat as a + // closed ring. TODO if all rings are closed, then the winding order of the + // exterior ring should be checked. + if (pointEqual(p0, p1)) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link$1(subject); + link$1(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } + }; + + function link$1(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; + } + + var clipMax = 1e9; + var clipMin = -clipMax; + + // TODO Use d3-polygon’s polygonContains here for the ring check? + // TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + + function clipExtent(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon$4 ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon$4 ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon$4 ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function(stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } + else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipPolygon(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; + } + + var extent$1 = function() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = clipExtent(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function(_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; + }; + + var lengthSum = adder(); + var lambda0$2; + var sinPhi0$1; + var cosPhi0$1; + + var lengthStream = { + sphere: noop$2, + point: noop$2, + lineStart: lengthLineStart, + lineEnd: noop$2, + polygonStart: noop$2, + polygonEnd: noop$2 + }; + + function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; + } + + function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop$2; + } + + function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi); + lengthStream.point = lengthPoint; + } + + function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin$1(phi), + cosPhi = cos$1(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos$1(delta), + sinDelta = sin$1(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt$1(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; + } + + var length$2 = function(object) { + lengthSum.reset(); + geoStream(object, lengthStream); + return +lengthSum; + }; + + var coordinates = [null, null]; + var object$1 = {type: "LineString", coordinates: coordinates}; + + var distance = function(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length$2(object$1); + }; + + function graticuleX(y0, y1, dy) { + var y = range(y0, y1 - epsilon$4, dy).concat(y1); + return function(x) { return y.map(function(y) { return [x, y]; }); }; + } + + function graticuleY(x0, x1, dx) { + var x = range(x0, x1 - epsilon$4, dx).concat(x1); + return function(y) { return x.map(function(x) { return [x, y]; }); }; + } + + function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return range(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$4; }).map(x)) + .concat(range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$4; }).map(y)); + } + + graticule.lines = function() { + return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); + }; + + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function(_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function(_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function(_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function(_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function(_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function(_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon$4], [180, 90 - epsilon$4]]) + .extentMinor([[-180, -80 - epsilon$4], [180, 80 + epsilon$4]]); + } + + function graticule10() { + return graticule()(); + } + + var interpolate$2 = function(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos$1(y0), + sy0 = sin$1(y0), + cy1 = cos$1(y1), + sy1 = sin$1(y1), + kx0 = cy0 * cos$1(x0), + ky0 = cy0 * sin$1(x0), + kx1 = cy1 * cos$1(x1), + ky1 = cy1 * sin$1(x1), + d = 2 * asin$1(sqrt$1(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin$1(d); + + var interpolate = d ? function(t) { + var B = sin$1(t *= d) / k, + A = sin$1(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees$1, + atan2(z, sqrt$1(x * x + y * y)) * degrees$1 + ]; + } : function() { + return [x0 * degrees$1, y0 * degrees$1]; + }; + + interpolate.distance = d; + + return interpolate; + }; + + var identity$7 = function(x) { + return x; + }; + + var areaSum$1 = adder(); + var areaRingSum$1 = adder(); + var x00; + var y00; + var x0$1; + var y0$1; + + var areaStream$1 = { + point: noop$2, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: function() { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function() { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$2; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1.reset(); + }, + result: function() { + var area = areaSum$1 / 2; + areaSum$1.reset(); + return area; + } + }; + + function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; + } + + function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; + } + + function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; + } + + function areaRingEnd$1() { + areaPoint$1(x00, y00); + } + + var x0$2 = Infinity; + var y0$2 = x0$2; + var x1 = -x0$2; + var y1 = x1; + + var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: noop$2, + polygonEnd: noop$2, + result: function() { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } + }; + + function boundsPoint$1(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; + } + + // TODO Enforce positive area for exterior, negative area for interior? + + var X0$1 = 0; + var Y0$1 = 0; + var Z0$1 = 0; + var X1$1 = 0; + var Y1$1 = 0; + var Z1$1 = 0; + var X2$1 = 0; + var Y2$1 = 0; + var Z2$1 = 0; + var x00$1; + var y00$1; + var x0$3; + var y0$3; + + var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function() { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function() { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function() { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; + } + }; + + function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; + } + + function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; + } + + function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt$1(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; + } + + function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; + } + + function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); + } + + function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); + } + + function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt$1(dx * dx + dy * dy); + + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function PathContext(context) { + this._context = context; + } + + PathContext.prototype = { + _radius: 4.5, + pointRadius: function(_) { + return this._radius = _, this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau$4); + break; + } + } + }, + result: noop$2 + }; + + function PathString() { + this._string = []; + } + + PathString.prototype = { + _circle: circle$2(4.5), + pointRadius: function(_) { + return this._circle = circle$2(_), this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function() { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } + } + }; + + function circle$2(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; + } + + var index$3 = function(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function(object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); + }; + + path.bounds = function(object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); + }; + + path.centroid = function(object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); + }; + + path.projection = function(_) { + return arguments.length ? (projectionStream = (projection = _) == null ? identity$7 : _.stream, path) : projection; + }; + + path.context = function(_) { + if (!arguments.length) return context; + contextStream = (context = _) == null ? new PathString : new PathContext(_); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); + }; + + var sum$2 = adder(); + + var polygonContains = function(polygon, point) { + var lambda = point[0], + phi = point[1], + normal = [sin$1(lambda), -cos$1(lambda), 0], + angle = 0, + winding = 0; + + sum$2.reset(); + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = point0[0], + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin$1(phi0), + cosPhi0 = cos$1(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = point1[0], + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin$1(phi1), + cosPhi1 = cos$1(phi1), + delta = lambda1 - lambda0, + sign$$1 = delta >= 0 ? 1 : -1, + absDelta = sign$$1 * delta, + antimeridian = absDelta > pi$4, + k = sinPhi0 * sinPhi1; + + sum$2.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); + angle += antimeridian ? delta + sign$$1 * tau$4 : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin$1(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon$4 || angle < epsilon$4 && sum$2 < -epsilon$4) ^ (winding & 1); + }; + + var clip = function(pointVisible, clipLine, interpolate, start) { + return function(rotate, sink) { + var line = clipLine(sink), + rotatedStart = rotate.invert(start[0], start[1]), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = merge(segments); + var startInside = polygonContains(polygon, rotatedStart); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipPolygon(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + var point = rotate(lambda, phi); + if (pointVisible(lambda = point[0], phi = point[1])) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + var point = rotate(lambda, phi); + line.point(point[0], point[1]); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + var point = rotate(lambda, phi); + ringSink.point(point[0], point[1]); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; + }; + + function validSegment(segment) { + return segment.length > 1; + } + + // Intersections are sorted along the clip edge. For both antimeridian cutting + // and circle clipping, the same comparison is used. + function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi$3 - epsilon$4 : halfPi$3 - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi$3 - epsilon$4 : halfPi$3 - b[1]); + } + + var clipAntimeridian = clip( + function() { return true; }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi$4, -halfPi$3] + ); + + // Takes a line and cuts into visible segments. Return values: 0 - there were + // intersections or the line was empty; 1 - no intersections; 2 - there were + // intersections, and the first and last segments should be rejoined. + function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function() { + stream.lineStart(); + clean = 1; + }, + point: function(lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi$4 : -pi$4, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi$4) < epsilon$4) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$3 : -halfPi$3); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi$4) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon$4) lambda0 -= sign0 * epsilon$4; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon$4) lambda1 -= sign1 * epsilon$4; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function() { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function() { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; + } + + function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin$1(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon$4 + ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1) + - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; + } + + function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi$3; + stream.point(-pi$4, phi); + stream.point(0, phi); + stream.point(pi$4, phi); + stream.point(pi$4, 0); + stream.point(pi$4, -phi); + stream.point(0, -phi); + stream.point(-pi$4, -phi); + stream.point(-pi$4, 0); + stream.point(-pi$4, phi); + } else if (abs(from[0] - to[0]) > epsilon$4) { + var lambda = from[0] < to[0] ? pi$4 : -pi$4; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } + } + + var clipCircle = function(radius, delta) { + var cr = cos$1(radius), + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon$4; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos$1(lambda) * cos$1(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi$4 : -pi$4), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + // Handle degeneracies. + // TODO ignore if not clipping polygons. + if (v !== v0) { + point2 = intersect(point0, point1); + if (pointEqual(point0, point2) || pointEqual(point1, point2)) { + point1[0] += epsilon$4; + point1[1] += epsilon$4; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1]); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function() { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt$1(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi$4) < epsilon$4, + meridian = polar || delta < epsilon$4; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$4 ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi$4 ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi$4 - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$4, radius - pi$4]); + }; + + var transform$1 = function(methods) { + return { + stream: transformer(methods) + }; + }; + + function transformer(methods) { + return function(stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; + } + + function TransformStream() {} + + TransformStream.prototype = { + constructor: TransformStream, + point: function(x, y) { this.stream.point(x, y); }, + sphere: function() { this.stream.sphere(); }, + lineStart: function() { this.stream.lineStart(); }, + lineEnd: function() { this.stream.lineEnd(); }, + polygonStart: function() { this.stream.polygonStart(); }, + polygonEnd: function() { this.stream.polygonEnd(); } + }; + + function fitExtent(projection, extent, object) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + clip = projection.clipExtent && projection.clipExtent(); + + projection + .scale(150) + .translate([0, 0]); + + if (clip != null) projection.clipExtent(null); + + geoStream(object, projection.stream(boundsStream$1)); + + var b = boundsStream$1.result(), + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + + if (clip != null) projection.clipExtent(clip); + + return projection + .scale(k * 150) + .translate([x, y]); + } + + function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); + } + + var maxDepth = 16; + var cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance) + + var resample = function(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); + }; + + function resampleNone(project) { + return transformer({ + point: function(x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); + } + + function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt$1(a * a + b * b + c * c), + phi2 = asin$1(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon$4 || abs(lambda0 - lambda1) < epsilon$4 ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + return function(stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, + polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; + } + + var transformRadians = transformer({ + point: function(x, y) { + this.stream.point(x * radians, y * radians); + } + }); + + function projection(project) { + return projectionMutator(function() { return project; })(); + } + + function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + dx, dy, lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate + theta = null, preclip = clipAntimeridian, // clip angle + x0 = null, y0, x1, y1, postclip = identity$7, // clip extent + delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision + cache, + cacheStream; + + function projection(point) { + point = projectRotate(point[0] * radians, point[1] * radians); + return [point[0] * k + dx, dy - point[1] * k]; + } + + function invert(point) { + point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k); + return point && [point[0] * degrees$1, point[1] * degrees$1]; + } + + function projectTransform(x, y) { + return x = project(x, y), [x[0] * k + dx, dy - x[1] * k]; + } + + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(preclip(rotate, projectResample(postclip(cacheStream = stream)))); + }; + + projection.clipAngle = function(_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians, 6 * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1; + }; + + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$7) : clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function(_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function(_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function(_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1]; + }; + + projection.rotate = function(_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1]; + }; + + projection.precision = function(_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt$1(delta2); + }; + + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + + function recenter() { + projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project); + var center = project(lambda, phi); + dx = x - center[0] * k; + dy = y + center[1] * k; + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; + } + + function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi$4 / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function(_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1]; + }; + + return p; + } + + function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos$1(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin$1(phi) / cosPhi0]; + } + + forward.invert = function(x, y) { + return [x / cosPhi0, asin$1(y * cosPhi0)]; + }; + + return forward; + } + + function conicEqualAreaRaw(y0, y1) { + var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon$4) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt$1(c) / n; + + function project(x, y) { + var r = sqrt$1(c - 2 * n * sin$1(y)) / n; + return [r * sin$1(x *= n), r0 - r * cos$1(x)]; + } + + project.invert = function(x, y) { + var r0y = r0 - y; + return [atan2(x, abs(r0y)) / n * sign$1(r0y), asin$1((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; + } + + var conicEqualArea = function() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); + }; + + var albers = function() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); + }; + + // The projections must have mutually exclusive clip regions on the sphere, + // as this will avoid emitting interleaving lines and polygons. + function multiplex(streams) { + var n = streams.length; + return { + point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, + sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, + lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, + lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, + polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, + polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } + }; + } + + // A composite projection for the United States, configured by default for + // 960×500. The projection also works quite well at 960×600 if you change the + // scale to 1285 and adjust the translate accordingly. The set of standard + // parallels for each region comes from USGS, which is published here: + // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers + var albersUsa = function() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = {point: function(x, y) { point = [x, y]; }}; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon$4, y + 0.120 * k + epsilon$4], [x - 0.214 * k - epsilon$4, y + 0.234 * k - epsilon$4]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon$4, y + 0.166 * k + epsilon$4], [x - 0.115 * k - epsilon$4, y + 0.234 * k - epsilon$4]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function(extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function(size, object) { + return fitSize(albersUsa, size, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); + }; + + function azimuthalRaw(scale) { + return function(x, y) { + var cx = cos$1(x), + cy = cos$1(y), + k = scale(cx * cy); + return [ + k * cy * sin$1(x), + k * sin$1(y) + ]; + } + } + + function azimuthalInvert(angle) { + return function(x, y) { + var z = sqrt$1(x * x + y * y), + c = angle(z), + sc = sin$1(c), + cc = cos$1(c); + return [ + atan2(x * sc, z * cc), + asin$1(z && y * sc / z) + ]; + } + } + + var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { + return sqrt$1(2 / (1 + cxcy)); + }); + + azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { + return 2 * asin$1(z / 2); + }); + + var azimuthalEqualArea = function() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); + }; + + var azimuthalEquidistantRaw = azimuthalRaw(function(c) { + return (c = acos(c)) && c / sin$1(c); + }); + + azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { + return z; + }); + + var azimuthalEquidistant = function() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); + }; + + function mercatorRaw(lambda, phi) { + return [lambda, log$1(tan((halfPi$3 + phi) / 2))]; + } + + mercatorRaw.invert = function(x, y) { + return [x, 2 * atan(exp(y)) - halfPi$3]; + }; + + var mercator = function() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau$4); + }; + + function mercatorProjection(project) { + var m = projection(project), + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + clipAuto; + + m.scale = function(_) { + return arguments.length ? (scale(_), clipAuto && m.clipExtent(null), m) : scale(); + }; + + m.translate = function(_) { + return arguments.length ? (translate(_), clipAuto && m.clipExtent(null), m) : translate(); + }; + + m.clipExtent = function(_) { + if (!arguments.length) return clipAuto ? null : clipExtent(); + if (clipAuto = _ == null) { + var k = pi$4 * scale(), + t = translate(); + _ = [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]]; + } + clipExtent(_); + return m; + }; + + return m.clipExtent(null); + } + + function tany(y) { + return tan((halfPi$3 + y) / 2); + } + + function conicConformalRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : log$1(cy0 / cos$1(y1)) / log$1(tany(y1) / tany(y0)), + f = cy0 * pow$1(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { if (y < -halfPi$3 + epsilon$4) y = -halfPi$3 + epsilon$4; } + else { if (y > halfPi$3 - epsilon$4) y = halfPi$3 - epsilon$4; } + var r = f / pow$1(tany(y), n); + return [r * sin$1(n * x), f - r * cos$1(n * x)]; + } + + project.invert = function(x, y) { + var fy = f - y, r = sign$1(n) * sqrt$1(x * x + fy * fy); + return [atan2(x, abs(fy)) / n * sign$1(fy), 2 * atan(pow$1(f / r, 1 / n)) - halfPi$3]; + }; + + return project; + } + + var conicConformal = function() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); + }; + + function equirectangularRaw(lambda, phi) { + return [lambda, phi]; + } + + equirectangularRaw.invert = equirectangularRaw; + + var equirectangular = function() { + return projection(equirectangularRaw) + .scale(152.63); + }; + + function conicEquidistantRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon$4) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin$1(nx), g - gy * cos$1(nx)]; + } + + project.invert = function(x, y) { + var gy = g - y; + return [atan2(x, abs(gy)) / n * sign$1(gy), g - sign$1(n) * sqrt$1(x * x + gy * gy)]; + }; + + return project; + } + + var conicEquidistant = function() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); + }; + + function gnomonicRaw(x, y) { + var cy = cos$1(y), k = cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; + } + + gnomonicRaw.invert = azimuthalInvert(atan); + + var gnomonic = function() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); + }; + + function scaleTranslate(k, tx, ty) { + return k === 1 && tx === 0 && ty === 0 ? identity$7 : transformer({ + point: function(x, y) { + this.stream.point(x * k + tx, y * k + ty); + } + }); + } + + var identity$8 = function() { + var k = 1, tx = 0, ty = 0, transform = identity$7, // scale and translate + x0 = null, y0, x1, y1, clip = identity$7, // clip extent + cache, + cacheStream, + projection; + + function reset() { + cache = cacheStream = null; + return projection; + } + + return projection = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(clip(cacheStream = stream)); + }, + clipExtent: function(_) { + return arguments.length ? (clip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$7) : clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }, + scale: function(_) { + return arguments.length ? (transform = scaleTranslate(k = +_, tx, ty), reset()) : k; + }, + translate: function(_) { + return arguments.length ? (transform = scaleTranslate(k, tx = +_[0], ty = +_[1]), reset()) : [tx, ty]; + }, + fitExtent: function(extent, object) { + return fitExtent(projection, extent, object); + }, + fitSize: function(size, object) { + return fitSize(projection, size, object); + } + }; + }; + + function orthographicRaw(x, y) { + return [cos$1(y) * sin$1(x), sin$1(y)]; + } + + orthographicRaw.invert = azimuthalInvert(asin$1); + + var orthographic = function() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon$4); + }; + + function stereographicRaw(x, y) { + var cy = cos$1(y), k = 1 + cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; + } + + stereographicRaw.invert = azimuthalInvert(function(z) { + return 2 * atan(z); + }); + + var stereographic = function() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); + }; + + function transverseMercatorRaw(lambda, phi) { + return [log$1(tan((halfPi$3 + phi) / 2)), -lambda]; + } + + transverseMercatorRaw.invert = function(x, y) { + return [-y, 2 * atan(exp(x)) - halfPi$3]; + }; + + var transverseMercator = function() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function(_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function(_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); + }; + + exports.version = version; + exports.bisect = bisectRight; + exports.bisectRight = bisectRight; + exports.bisectLeft = bisectLeft; + exports.ascending = ascending; + exports.bisector = bisector; + exports.descending = descending; + exports.deviation = deviation; + exports.extent = extent; + exports.histogram = histogram; + exports.thresholdFreedmanDiaconis = freedmanDiaconis; + exports.thresholdScott = scott; + exports.thresholdSturges = sturges; + exports.max = max; + exports.mean = mean; + exports.median = median; + exports.merge = merge; + exports.min = min; + exports.pairs = pairs; + exports.permute = permute; + exports.quantile = threshold; + exports.range = range; + exports.scan = scan; + exports.shuffle = shuffle; + exports.sum = sum; + exports.ticks = ticks; + exports.tickStep = tickStep; + exports.transpose = transpose; + exports.variance = variance; + exports.zip = zip; + exports.entries = entries; + exports.keys = keys; + exports.values = values; + exports.map = map$1; + exports.set = set; + exports.nest = nest; + exports.randomUniform = uniform; + exports.randomNormal = normal; + exports.randomLogNormal = logNormal; + exports.randomBates = bates; + exports.randomIrwinHall = irwinHall; + exports.randomExponential = exponential; + exports.easeLinear = linear; + exports.easeQuad = quadInOut; + exports.easeQuadIn = quadIn; + exports.easeQuadOut = quadOut; + exports.easeQuadInOut = quadInOut; + exports.easeCubic = cubicInOut; + exports.easeCubicIn = cubicIn; + exports.easeCubicOut = cubicOut; + exports.easeCubicInOut = cubicInOut; + exports.easePoly = polyInOut; + exports.easePolyIn = polyIn; + exports.easePolyOut = polyOut; + exports.easePolyInOut = polyInOut; + exports.easeSin = sinInOut; + exports.easeSinIn = sinIn; + exports.easeSinOut = sinOut; + exports.easeSinInOut = sinInOut; + exports.easeExp = expInOut; + exports.easeExpIn = expIn; + exports.easeExpOut = expOut; + exports.easeExpInOut = expInOut; + exports.easeCircle = circleInOut; + exports.easeCircleIn = circleIn; + exports.easeCircleOut = circleOut; + exports.easeCircleInOut = circleInOut; + exports.easeBounce = bounceOut; + exports.easeBounceIn = bounceIn; + exports.easeBounceOut = bounceOut; + exports.easeBounceInOut = bounceInOut; + exports.easeBack = backInOut; + exports.easeBackIn = backIn; + exports.easeBackOut = backOut; + exports.easeBackInOut = backInOut; + exports.easeElastic = elasticOut; + exports.easeElasticIn = elasticIn; + exports.easeElasticOut = elasticOut; + exports.easeElasticInOut = elasticInOut; + exports.polygonArea = area; + exports.polygonCentroid = centroid; + exports.polygonHull = hull; + exports.polygonContains = contains; + exports.polygonLength = length$1; + exports.path = path; + exports.quadtree = quadtree; + exports.queue = queue; + exports.arc = arc; + exports.area = area$1; + exports.line = line; + exports.pie = pie; + exports.radialArea = radialArea; + exports.radialLine = radialLine$1; + exports.symbol = symbol; + exports.symbols = symbols; + exports.symbolCircle = circle; + exports.symbolCross = cross$1; + exports.symbolDiamond = diamond; + exports.symbolSquare = square; + exports.symbolStar = star; + exports.symbolTriangle = triangle; + exports.symbolWye = wye; + exports.curveBasisClosed = basisClosed; + exports.curveBasisOpen = basisOpen; + exports.curveBasis = basis; + exports.curveBundle = bundle; + exports.curveCardinalClosed = cardinalClosed; + exports.curveCardinalOpen = cardinalOpen; + exports.curveCardinal = cardinal; + exports.curveCatmullRomClosed = catmullRomClosed; + exports.curveCatmullRomOpen = catmullRomOpen; + exports.curveCatmullRom = catmullRom; + exports.curveLinearClosed = linearClosed; + exports.curveLinear = curveLinear; + exports.curveMonotoneX = monotoneX; + exports.curveMonotoneY = monotoneY; + exports.curveNatural = natural; + exports.curveStep = step; + exports.curveStepAfter = stepAfter; + exports.curveStepBefore = stepBefore; + exports.stack = stack; + exports.stackOffsetExpand = expand; + exports.stackOffsetNone = none; + exports.stackOffsetSilhouette = silhouette; + exports.stackOffsetWiggle = wiggle; + exports.stackOrderAscending = ascending$1; + exports.stackOrderDescending = descending$2; + exports.stackOrderInsideOut = insideOut; + exports.stackOrderNone = none$1; + exports.stackOrderReverse = reverse; + exports.color = color; + exports.rgb = rgb; + exports.hsl = hsl; + exports.lab = lab; + exports.hcl = hcl; + exports.cubehelix = cubehelix; + exports.interpolate = interpolate; + exports.interpolateArray = array$1; + exports.interpolateDate = date; + exports.interpolateNumber = interpolateNumber; + exports.interpolateObject = object; + exports.interpolateRound = interpolateRound; + exports.interpolateString = interpolateString; + exports.interpolateTransformCss = interpolateTransformCss; + exports.interpolateTransformSvg = interpolateTransformSvg; + exports.interpolateZoom = interpolateZoom; + exports.interpolateRgb = interpolateRgb; + exports.interpolateRgbBasis = rgbBasis; + exports.interpolateRgbBasisClosed = rgbBasisClosed; + exports.interpolateHsl = hsl$2; + exports.interpolateHslLong = hslLong; + exports.interpolateLab = lab$1; + exports.interpolateHcl = hcl$2; + exports.interpolateHclLong = hclLong; + exports.interpolateCubehelix = cubehelix$2; + exports.interpolateCubehelixLong = cubehelixLong; + exports.interpolateBasis = basis$2; + exports.interpolateBasisClosed = basisClosed$1; + exports.quantize = quantize; + exports.dispatch = dispatch; + exports.dsvFormat = dsv; + exports.csvParse = csvParse; + exports.csvParseRows = csvParseRows; + exports.csvFormat = csvFormat; + exports.csvFormatRows = csvFormatRows; + exports.tsvParse = tsvParse; + exports.tsvParseRows = tsvParseRows; + exports.tsvFormat = tsvFormat; + exports.tsvFormatRows = tsvFormatRows; + exports.request = request; + exports.html = html; + exports.json = json; + exports.text = text; + exports.xml = xml; + exports.csv = csv$1; + exports.tsv = tsv$1; + exports.now = now; + exports.timer = timer; + exports.timerFlush = timerFlush; + exports.timeout = timeout$1; + exports.interval = interval$1; + exports.timeInterval = newInterval; + exports.timeMillisecond = millisecond; + exports.timeMilliseconds = milliseconds; + exports.timeSecond = second; + exports.timeSeconds = seconds; + exports.timeMinute = minute; + exports.timeMinutes = minutes; + exports.timeHour = hour; + exports.timeHours = hours; + exports.timeDay = day; + exports.timeDays = days; + exports.timeWeek = sunday; + exports.timeWeeks = sundays; + exports.timeSunday = sunday; + exports.timeSundays = sundays; + exports.timeMonday = monday; + exports.timeMondays = mondays; + exports.timeTuesday = tuesday; + exports.timeTuesdays = tuesdays; + exports.timeWednesday = wednesday; + exports.timeWednesdays = wednesdays; + exports.timeThursday = thursday; + exports.timeThursdays = thursdays; + exports.timeFriday = friday; + exports.timeFridays = fridays; + exports.timeSaturday = saturday; + exports.timeSaturdays = saturdays; + exports.timeMonth = month; + exports.timeMonths = months; + exports.timeYear = year; + exports.timeYears = years; + exports.utcMillisecond = millisecond; + exports.utcMilliseconds = milliseconds; + exports.utcSecond = second; + exports.utcSeconds = seconds; + exports.utcMinute = utcMinute; + exports.utcMinutes = utcMinutes; + exports.utcHour = utcHour; + exports.utcHours = utcHours; + exports.utcDay = utcDay; + exports.utcDays = utcDays; + exports.utcWeek = utcSunday; + exports.utcWeeks = utcSundays; + exports.utcSunday = utcSunday; + exports.utcSundays = utcSundays; + exports.utcMonday = utcMonday; + exports.utcMondays = utcMondays; + exports.utcTuesday = utcTuesday; + exports.utcTuesdays = utcTuesdays; + exports.utcWednesday = utcWednesday; + exports.utcWednesdays = utcWednesdays; + exports.utcThursday = utcThursday; + exports.utcThursdays = utcThursdays; + exports.utcFriday = utcFriday; + exports.utcFridays = utcFridays; + exports.utcSaturday = utcSaturday; + exports.utcSaturdays = utcSaturdays; + exports.utcMonth = utcMonth; + exports.utcMonths = utcMonths; + exports.utcYear = utcYear; + exports.utcYears = utcYears; + exports.formatLocale = formatLocale; + exports.formatDefaultLocale = defaultLocale; + exports.formatSpecifier = formatSpecifier; + exports.precisionFixed = precisionFixed; + exports.precisionPrefix = precisionPrefix; + exports.precisionRound = precisionRound; + exports.isoFormat = formatIso; + exports.isoParse = parseIso; + exports.timeFormatLocale = formatLocale$1; + exports.timeFormatDefaultLocale = defaultLocale$1; + exports.scaleBand = band; + exports.scalePoint = point$4; + exports.scaleIdentity = identity$4; + exports.scaleLinear = linear$2; + exports.scaleLog = log; + exports.scaleOrdinal = ordinal; + exports.scaleImplicit = implicit; + exports.scalePow = pow; + exports.scaleSqrt = sqrt; + exports.scaleQuantile = quantile$$1; + exports.scaleQuantize = quantize$1; + exports.scaleThreshold = threshold$1; + exports.scaleTime = time; + exports.scaleUtc = utcTime; + exports.schemeCategory10 = category10; + exports.schemeCategory20b = category20b; + exports.schemeCategory20c = category20c; + exports.schemeCategory20 = category20; + exports.scaleSequential = sequential; + exports.interpolateCubehelixDefault = cubehelix$3; + exports.interpolateRainbow = rainbow$1; + exports.interpolateWarm = warm; + exports.interpolateCool = cool; + exports.interpolateViridis = viridis; + exports.interpolateMagma = magma; + exports.interpolateInferno = inferno; + exports.interpolatePlasma = plasma; + exports.creator = creator; + exports.customEvent = customEvent; + exports.local = local; + exports.matcher = matcher$1; + exports.mouse = mouse; + exports.namespace = namespace; + exports.namespaces = namespaces; + exports.select = select; + exports.selectAll = selectAll; + exports.selection = selection; + exports.selector = selector; + exports.selectorAll = selectorAll; + exports.touch = touch; + exports.touches = touches; + exports.window = window; + exports.active = active; + exports.interrupt = interrupt; + exports.transition = transition; + exports.axisTop = axisTop; + exports.axisRight = axisRight; + exports.axisBottom = axisBottom; + exports.axisLeft = axisLeft; + exports.cluster = cluster; + exports.hierarchy = hierarchy; + exports.pack = index; + exports.packSiblings = siblings; + exports.packEnclose = enclose; + exports.partition = partition; + exports.stratify = stratify; + exports.tree = tree; + exports.treemap = index$1; + exports.treemapBinary = binary; + exports.treemapDice = treemapDice; + exports.treemapSlice = treemapSlice; + exports.treemapSliceDice = sliceDice; + exports.treemapSquarify = squarify; + exports.treemapResquarify = resquarify; + exports.forceCenter = center$1; + exports.forceCollide = collide; + exports.forceLink = link; + exports.forceManyBody = manyBody; + exports.forceSimulation = simulation; + exports.forceX = x$3; + exports.forceY = y$3; + exports.drag = drag; + exports.dragDisable = dragDisable; + exports.dragEnable = yesdrag; + exports.voronoi = voronoi; + exports.zoom = zoom; + exports.zoomIdentity = identity$6; + exports.zoomTransform = transform; + exports.brush = brush; + exports.brushX = brushX; + exports.brushY = brushY; + exports.brushSelection = brushSelection; + exports.chord = chord; + exports.ribbon = ribbon; + exports.geoAlbers = albers; + exports.geoAlbersUsa = albersUsa; + exports.geoArea = area$2; + exports.geoAzimuthalEqualArea = azimuthalEqualArea; + exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; + exports.geoAzimuthalEquidistant = azimuthalEquidistant; + exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; + exports.geoBounds = bounds; + exports.geoCentroid = centroid$1; + exports.geoCircle = circle$1; + exports.geoClipExtent = extent$1; + exports.geoConicConformal = conicConformal; + exports.geoConicConformalRaw = conicConformalRaw; + exports.geoConicEqualArea = conicEqualArea; + exports.geoConicEqualAreaRaw = conicEqualAreaRaw; + exports.geoConicEquidistant = conicEquidistant; + exports.geoConicEquidistantRaw = conicEquidistantRaw; + exports.geoDistance = distance; + exports.geoEquirectangular = equirectangular; + exports.geoEquirectangularRaw = equirectangularRaw; + exports.geoGnomonic = gnomonic; + exports.geoGnomonicRaw = gnomonicRaw; + exports.geoGraticule = graticule; + exports.geoGraticule10 = graticule10; + exports.geoIdentity = identity$8; + exports.geoInterpolate = interpolate$2; + exports.geoLength = length$2; + exports.geoMercator = mercator; + exports.geoMercatorRaw = mercatorRaw; + exports.geoOrthographic = orthographic; + exports.geoOrthographicRaw = orthographicRaw; + exports.geoPath = index$3; + exports.geoProjection = projection; + exports.geoProjectionMutator = projectionMutator; + exports.geoRotation = rotation; + exports.geoStereographic = stereographic; + exports.geoStereographicRaw = stereographicRaw; + exports.geoStream = geoStream; + exports.geoTransform = transform$1; + exports.geoTransverseMercator = transverseMercator; + exports.geoTransverseMercatorRaw = transverseMercatorRaw; + + Object.defineProperty(exports, '__esModule', { value: true }); + + }))); + + + //aigner: HERE IS WHERE IT ALL STARTS!!! + },{}],2:[function(require,module,exports){ + + + + + var d3 = require('d3'); + + var PULSE_DURATION = 700; + var SUB_ANIM_DELAY = 200; + var ACTIVE_COLOR = d3.rgb("seagreen"); + + function Animation(xdsms, rootId, delay) { + this.rootId = rootId; + if (typeof (rootId) === 'undefined') { + this.rootId = 'root'; + } + this.root = xdsms[this.rootId]; + this.xdsms = xdsms; + this.duration = PULSE_DURATION; + this.initialDelay = delay || 0; + } + + Animation.prototype._pulse = function(delay, toBeSelected, option) { + var sel = d3.select("svg." + this.rootId) + .selectAll(toBeSelected) + .transition().delay(delay); + if (option !== "out") { + sel = sel.transition().duration(200) + .style('stroke-width', '8px') + .style('stroke', ACTIVE_COLOR) + .style('fill', function(d) { + if (d.id) { + return ACTIVE_COLOR.brighter(); + }}); + } + if (option !== "in") { + sel.transition().duration(3 * PULSE_DURATION) + .style('stroke-width', null) + .style('stroke', null) + .style('fill', null); + } + }; + + Animation.prototype._animate = function() { + var self = this; + var delay = this.initialDelay; + var animDelay = SUB_ANIM_DELAY; + var graph = self.xdsms[self.rootId].graph; + + var title = d3.select("svg." + self.rootId).select("g.title"); + title.select("text").transition().delay(delay).style("fill", ACTIVE_COLOR); + d3.select("svg." + self.rootId).select("rect.border") + .transition().delay(delay) + .style("stroke-width", '5px').duration(200) + .transition().duration(1000) + .style("stroke", 'black').style("stroke-width", '0px'); + + graph.nodesByStep.forEach(function(nodesAtStep, n, nodesByStep) { + var offsets = []; + nodesAtStep.forEach(function(nodeId) { + var elapsed = delay + n * PULSE_DURATION; + if (n > 0) { + nodesByStep[n-1].forEach(function(prevNodeId) { // eslint-disable-line space-infix-ops + var from = graph.idxOf(prevNodeId); + var to = graph.idxOf(nodeId); + self._pulse(elapsed,"polyline.link_" + from + "_" + to); + }); + } + //aigner: Look for existing xdsms/Sub-xdsms. Only show those, which are expanded + var gnode = "g." + nodeId; + var nodeSel = d3.select("svg." + self.rootId).select(gnode); + var scnId = graph.getNode(nodeId).getScenarioId(); + if (nodeSel.classed("mdo") && self.xdsms[scnId]) + { + self._pulse(elapsed, gnode + " > rect", "in"); + var anim = new Animation(self.xdsms, scnId, elapsed + animDelay); + var offset = anim._animate(); + offsets.push(offset); + self._pulse(offset + elapsed + animDelay, gnode + " > rect", "out"); + } + else + { + self._pulse(elapsed, gnode + " > rect"); + } + }, this); + + if (offsets.length > 0) { + delay += Math.max.apply(null, offsets); + } + delay += animDelay; + }, this); + + title.select("text").transition() + .delay(graph.nodesByStep.length * PULSE_DURATION + delay) + .style("fill", null); + + return graph.nodesByStep.length * PULSE_DURATION; + }; + + Animation.prototype.run = function() { + this._animate(); + }; + + module.exports = Animation; + + },{"d3":1}],3:[function(require,module,exports){ + var _U_ = "_U_"; + var MULTI_TYPE = "_multi"; + + //aigner: Node() constructor additionally gets the "xdsm" + function Node(xdsm, id, uID, name, type, metadata) { + var splitUndef = name.split("undefined: ") + if (splitUndef.length>1) {name=splitUndef[1]} + else {name=splitUndef[0]} + + if (typeof (name) === 'undefined') { + name = id; + } + if (typeof (type) === 'undefined') { + type = 'analysis'; + } + this.xdsm = xdsm; + this.id = id; + this.uID = uID; + this.name = name; + this.metadata = metadata; + this.isMulti = (type.search(/_multi$/) >= 0); + this.type = this.isMulti ? + type.substr(0, type.length - MULTI_TYPE.length) : type; + } + + Node.prototype.isMdo = function() { + return this.type === "mdo"; + }; + + Node.prototype.getScenarioId = function() { + if (this.isMdo()) { + var idxscn = this.name.indexOf("_scn-"); + if (idxscn === -1) { + console.log("Warning: MDO Scenario not found. " + + "Bad type or name for node: " + JSON.stringify(this)); + return null; + } + return this.name.substr(idxscn + 1); + } + return null; + }; + + function Edge(from, to, from_uID, to_uID, name, row, col, isMulti) { + this.id = "link_" + from + "_" + to; + this.name = name; + this.row = row; + this.col = col; + this.iotype = row < col ? "in" : "out"; + this.io = { + fromU: (from === _U_), + toU: (to === _U_) + }; + this.from = from; + this.from_uID = from_uID; + this.to = to; + this.to_uID = to_uID; + this.isMulti = isMulti; + } + + Edge.prototype.isIO = function() { + return this.io.fromU || this.io.toU; + }; + + //aigner: Function creates the xdsm graph + function Graph(mdo, refname) { + this.nodes = [new Node(_U_, _U_, _U_, _U_, "user",[])]; + this.edges = []; + this.chains = []; + this.refname = refname || ""; + + //aigner: New numbering due to new workflow definition in KADMOS (Old stuff commented out) + var numbering = Graph.new_number(mdo.workflow); + //var numbering = Graph.number(mdo.workflow); + var numPrefixes = numbering.toNum; + this.nodesByStep = numbering.toNode; + + mdo.nodes.forEach(function(item) { + name = document.createElement("TEXTAREA"); + name = numPrefixes[item.id] + ": " + item.name; + this.nodes.push(new Node(item.xdsm, item.id, item.uID, name, item.type, item.metadata)); + }, this); + + this.ids = this.nodes.map(function(elt) { + return elt.id; + }); + + mdo.edges.forEach(function(item) { + var idA = this.idxOf(item.from); + var idB = this.idxOf(item.to); + + var isMulti = this.nodes[idA].isMulti || this.nodes[idB].isMulti; + this.edges.push(new Edge(item.from, item.to, item.from_uID, item.to_uID, item.name, idA, idB, isMulti)); + }, this); + + + //aigner: new chains with new workflow definition for KADMOS (Old stuff commented out) + this.chains = Graph.new_expand(mdo.workflow,mdo.nodes); + // var echain = Graph.expand(mdo.workflow); + // echain.forEach(function(leafChain) { + // if (leafChain.length < 2) { + // throw new Error("Bad process chain (" + leafChain.length + "elt)"); + // } else { + // this.chains.push([]); + // var ids = this.nodes.map(function(elt) { + // return elt.id; + // }); + // leafChain.forEach(function(item, j) { + // if (j !== 0) { + // var idA = ids.indexOf(leafChain[j - 1]); + // if (idA < 0) { + // throw new Error("Process chain element (" + + // leafChain[j - 1] + ") not found"); + // } + // var idB = ids.indexOf(leafChain[j]); + // if (idB < 0) { + // throw new Error("Process chain element (" + + // leafChain[j] + ") not found"); + // } + // if (idA !== idB) { + // this.chains[this.chains.length - 1].push([idA, idB]); + // } + // } + // }, this); + // } + // }, this); + + + } + + Graph.prototype.idxOf = function(nodeId) { + return this.ids.indexOf(nodeId); + }; + Graph.prototype.getNode = function(nodeId) { + return this.nodes[this.ids.indexOf(nodeId)]; + }; + + function _expand(workflow) { + var ret = []; + var prev; + workflow.forEach(function(item) { + if (item instanceof Array) { + if (item[0].hasOwnProperty('parallel')) { + if (prev) { + ret = ret.slice(0, ret.length - 1).concat(item[0].parallel.map( + function(elt) { + return [prev].concat(_expand([elt]), prev); + })); + } else { + throw new Error("Bad workflow structure : " + + "cannot parallel loop without previous starting point."); + } + } else if (prev) { + ret = ret.concat(_expand(item), prev); + } else { + ret = ret.concat(_expand(item)); + } + prev = ret[ret.length - 1]; + } else if (item.hasOwnProperty('parallel')) { + if (prev) { + ret = ret.slice(0, ret.length - 1).concat( + item.parallel.map(function(elt) { + return [prev].concat(_expand([elt])); + })); + } else { + ret = ret.concat(item.parallel.map( + function(elt) { + return _expand([elt]); + })); + } + prev = undefined; + } else { + var i = ret.length - 1; + var flagParallel = false; + while (i >= 0 && (ret[i] instanceof Array)) { + ret[i] = ret[i].concat(item); + i -= 1; + flagParallel = true; + } + if (!flagParallel) { + ret.push(item); + } + prev = item; + } + }, this); + return ret; + } + + Graph.expand = function(item) { + var expanded = _expand(item); + var result = []; + var current = []; + expanded.forEach(function(elt) { + if (elt instanceof Array) { + if (current.length > 0) { + current.push(elt[0]); + result.push(current); + current = []; + } + result.push(elt); + } else { + if (result.length > 0 && current.length === 0) { + var lastChain = result[result.length - 1]; + var lastElt = lastChain[lastChain.length - 1]; + current.push(lastElt); + } + current.push(elt); + } + }, this); + if (current.length > 0) { + result.push(current); + } + return result; + }; + + Graph.new_expand = function(workflow,nodes) { + var ids = nodes.map(function(elt) { + return elt.id; + }); + var result_tmp = []; + for (var i=0; i < workflow.length; i++) + { + var stepNumber = workflow[i].step_number + var edges = workflow[i].edges; + for (var j=0; j < edges.length; j++) + { + var fromNode = edges[j][0]; + var toNode = edges[j][1]; + var fromId = ids.indexOf(fromNode)+1; + var toId = ids.indexOf(toNode)+1; + result_tmp.push([fromId,toId]); + } + } + var result = []; + result.push(result_tmp) + return result; + }; + + Graph.number = function(workflow, num) { + num = (typeof num === 'undefined') ? 0 : num; + var toNum = {}; + var toNode = []; + + function setStep(step, nodeId) { + if (step in toNode) { + toNode[step].push(nodeId); + } else { + toNode[step] = [nodeId]; + } + } + + function setNum(nodeId, beg, end) { + if (end === undefined) { + num = String(beg); + setStep(beg, nodeId); + } else { + num = end + "-" + beg; + setStep(end, nodeId); + } + if (nodeId in toNum) { + toNum[nodeId] += "," + num; + } else { + toNum[nodeId] = num; + } + } + + function _number(wks, num) { + var ret = 0; + if (wks instanceof Array) { + if (wks.length === 0) { + ret = num; + } else if (wks.length === 1) { + ret = _number(wks[0], num); + } else { + var head = wks[0]; + var tail = wks.slice(1); + var beg = _number(head, num); + if (tail[0] instanceof Array) { + var end = _number(tail[0], beg); + setNum(head, beg, end); + beg = end + 1; + tail.shift(); + } + ret = _number(tail, beg); + } + } else if ((wks instanceof Object) && 'parallel' in wks) { + var nums = wks.parallel.map(function(branch) { + return _number(branch, num); + }); + ret = Math.max.apply(null, nums); + } else { + setNum(wks, num); + ret = num + 1; + } + return ret; + } + + _number(workflow, num); + // console.log('toNodes=', JSON.stringify(toNode)); + // console.log('toNum=',JSON.stringify(toNum)); + return {toNum: toNum, toNode: toNode}; + }; + + //aigner: New numbering for the workflow nodes + Graph.new_number = function(workflow, num) { + num = (typeof num === 'undefined') ? 0 : num; + var toNum = {}; + var toNode = []; + + for (var i=0; i < workflow.length; i++) + { + //aigner: Number the nodes with respect to the defined process steps + //--> toNum + //########################################## + for (var j=0; j < workflow[i].process_step_blocks.length; j++) + { + var proc_id_to = workflow[i].process_step_blocks[j]; + if (proc_id_to) + { + + if (!toNum[proc_id_to]) + { + toNum[proc_id_to] = workflow[i].step_number; + } + else + { + toNum[proc_id_to] += "," + workflow[i].step_number; + } + } + } + for (var j=0; j < workflow[i].converger_step_blocks.length; j++) + { + var conv_id_to = workflow[i].converger_step_blocks[j]; + if (conv_id_to) + { + toNum[conv_id_to] += "," + workflow[i].step_number; + var stepID = parseInt(toNum[conv_id_to].split(',')[0])+1; + //aigner: CAUTION hard coded exception for coordinator + if (conv_id_to!="Coordinator"){toNum[conv_id_to] += "-" + stepID;} + } + } + //########################################## + //--> toNode + //########################################## + var stepNumber = workflow[i].step_number + var nodeId; + if (stepNumber==0){nodeId = [workflow[i].process_step_blocks[0]];} + else + { + var nodeIds = []; + for (var j=0; j<workflow[i].edges.length ;j++) + { + nodeIds.push(workflow[i].edges[j][1]); + } + nodeId = nodeIds; + } + toNode[stepNumber] = nodeId; + //########################################## + } + return {toNum: toNum, toNode: toNode}; + }; + + module.exports = Graph; + + },{}],4:[function(require,module,exports){ + function Labelizer() {} + + Labelizer.strParse = function(str) { + if (str === "") { + return [{base: '', sub: undefined, sup: undefined}]; + } + + //console.log("STR") + //console.log(str); + //aigner: Space sign added + var lstr = str.split(','); + var underscores = /_/g; + var rg = /([0-9\-]+: )?([A-Za-z0-9\{\}\(\)\[\]\-\.]+)(_[A-Za-z0-9\-\._]+)?(\^.+)?/; + + var res = lstr.map(function(s) { + var base; + var sub; + var sup; + + //aigner: Modification. xpath is split after each "/" + var s_split = s.split("/"); + s = s_split[s_split.length-1]; + + if ((s.match(underscores) || []).length > 1) { + var mu = s.match(/(.+)^(.+)/); + if (mu) { + return {base: mu[1], sub: undefined, sup: mu[2]}; + } + return {base: s, sub: undefined, sup: undefined}; + } + var m = s.match(rg); + if (m) { + base = (m[1] ? m[1] : "") + m[2]; + if (m[3]) { + sub = m[3].substring(1); + } + if (m[4]) { + sup = m[4].substring(1); + } + } else { + throw new Error("Labelizer.strParse: Can not parse '" + s + "'"); + } + return {base: base, sub: sub, sup: sup}; + }, this); + + return res; + }; + + Labelizer.labelize = function() { + var ellipsis = 0; + + //aigner: createLabel modified. Hide variable names if too long. + function createLabel(selection) + { + selection.each(function(d) { + //console.log("Labelize-->"); + //console.log(d); + var tokens = Labelizer.strParse(d.name); + var text = selection.append("text"); + + var className = selection._groups[0][0].getAttribute("class"); + + if (className.includes("node")) + { + tokens.every(function(token, i, ary) + { + var offsetSub = 0; + var offsetSup = 0; + //aigner: If the node is too big, it will not be shown at first, only when hovering + if (ellipsis < 1 || i < 15) + { + text.append("tspan").text(token.base); + if (token.sub) + { + offsetSub = 10; + text.append("tspan") + .attr("class", "sub") + .attr("dy", offsetSub) + .text(token.sub); + } + if (token.sup) { + offsetSup = -10; + text.append("tspan") + .attr("class", "sup") + .attr("dx", -5) + .attr("dy", -offsetSub + offsetSup) + .text(token.sup); + offsetSub = 0; + } + } else + { + text.append("tspan") + .attr("dy", -offsetSub - offsetSup) + .text("..."); + selection.classed("ellipsized", true); + return false; + } + if (i < ary.length - 1) + { + text.append("tspan") + .attr("dy", -offsetSub - offsetSup) + .text(", "); + } + return true; + }, this); + } + else if(className.includes("edge")) + { + var offsetSub = 0; + var offsetSup = 0; + //aigner: If there are more than 5 variables in an edge, they are not shown! + tokens.every(function(token, i, ary) + { + if(d.io.fromU || d.from =="Coordinator"){text_tmp = "inp."} + else if(d.io.toU || d.to=="Coordinator"){text_tmp = "outp."} + else{text_tmp = "conn."} + //if (ary.length>1){text_tmp = text_tmp+"s"}; + text.append("tspan") + .attr("dy", -offsetSub - offsetSup) + .text(ary.length + " " + text_tmp); + + selection.classed("ellipsized", true); + return false; + }, this); + } + }); + } + + createLabel.ellipsis = function(value) { + if (!arguments.length) { + return ellipsis; + } + ellipsis = value; + return createLabel; + }; + + return createLabel; + }; + + Labelizer.tooltipize = function() { + var text = ""; + + function createTooltip(selection) { + var tokens = Labelizer.strParse(text); + var html = []; + tokens.forEach(function(token) { + var item = token.base; + if (token.sub) { + item += "<sub>" + token.sub + "</sub>"; + } + if (token.sup) { + item += "<sup>" + token.sup + "</sup>"; + } + html.push(item); + }, this); + selection.html(html.join(", ")); + } + + createTooltip.text = function(value) { + if (!arguments.length) { + return text; + } + text = value; + return createTooltip; + }; + + return createTooltip; + }; + + module.exports = Labelizer; + + },{}],5:[function(require,module,exports){ + var d3 = require('d3'); + var Labelizer = require('./labelizer.js'); + + var WIDTH = 1000; + var HEIGHT = 500; + var X_ORIG = 70; + var Y_ORIG = 20; + var PADDING = 20; + var CELL_W = 250; + var CELL_H = 75; + var MULTI_OFFSET = 3; + + function Cell(x, y, width, height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + function Xdsm(graph, svgid, tooltip) { + this.graph = graph; + this.tooltip = tooltip; + this.svg = d3.select(".xdsm") + .append("svg") + .attr("width", WIDTH) + .attr("height", HEIGHT) + .attr("class", svgid); + + this.grid = []; + this.nodes = []; + this.edges = []; + } + + Xdsm.prototype.draw = function(graphName) { + var self = this; + + if (self.graph.refname) { + var ref = self.svg.append('g').classed('title', true); + + var text_tmp = self.graph.refname.replace(/\w/g, function(l){ return l.toUpperCase() }) + + //ref.append("text").text(graphName); + var bbox = ref.nodes()[0].getBBox(); + ref.insert("rect", "text") + .attr('x', bbox.x) + .attr('y', bbox.y) + .attr('width', bbox.width) + .attr('height', bbox.height); + + ref.attr('transform', + 'translate(' + X_ORIG + ',' + (Y_ORIG + bbox.height-10) + ')'); + } + + self.nodes = self._createTextGroup("node"); + self.edges = self._createTextGroup("edge"); + + // Workflow + self._createWorkflow(); + + // Layout texts + self._layoutText(self.nodes); + self._layoutText(self.edges); + + // Rectangles for nodes + self.nodes.each(function(d, i) { + var that = d3.select(this); + that.call(self._customRect.bind(self), d, i, 0); + if (d.isMulti) { + that.call(self._customRect.bind(self), d, i, 1 * Number(MULTI_OFFSET)); + that.call(self._customRect.bind(self), d, i, 2 * Number(MULTI_OFFSET)); + } + }); + + // Trapezium for edges + self.edges.each(function(d, i) { + var that = d3.select(this); + that.call(self._customTrapz.bind(self), d, i, 0); + if (d.isMulti) { + that.call(self._customTrapz.bind(self), d, i, 1 * Number(MULTI_OFFSET)); + that.call(self._customTrapz.bind(self), d, i, 2 * Number(MULTI_OFFSET)); + } + }); + + // Dataflow + self._createDataflow(self.edges); + + //aigner: set svg size + var w = CELL_W * (self.graph.nodes.length + 1); + var h = CELL_H * (self.graph.nodes.length + 1); + self.svg.attr("width", w).attr("height", h); + + var bordercolor = 'black'; + self.svg.append("rect") + .classed("border", true) + .attr("x", 4) + .attr("y", 4) + .attr("height", h - 4) + .attr("width", w - 4) + .style("stroke", bordercolor) + .style("fill", "none") + .style("stroke-width", 0); + + //aigner: PlayButton for animation + var playButton = self.svg.append("g").attr("class", "playButton") + .attr("transform", "translate("+ 10 +","+ 10 +")") + + playButton + .append("rect") + .attr("class", "playButton_rect") + .attr("width", 50) + .attr("height", 50) + .attr("rx", 4) + .style("fill", "#555555"); + + playButton + .append("path") + .attr("class", "playButton_triangle") + .attr("d", "M15 10 L15 40 L35 25 Z") + .style("fill", "white"); + + playButton.append("text") + .attr("y",20) + .attr("x",60) + .text("Play Workflow") + + //aigner: Hide playbutton if there is no workflow process + if(self.graph.nodesByStep.length<1) + { + playButton.attr("visibility","hidden") + } + playButton.append("svg:title").text("Click to play workflow"); + }; + + Xdsm.prototype._createTextGroup = function(kind) { + var self = this; + + var group = self.svg.append('g').attr("class", kind + "s"); + + var textGroups = + group.selectAll("." + kind) + .data(this.graph[kind + "s"]) + .enter() + .append("g").attr("class", function(d) { + var klass = kind === "node" ? d.type : "dataInter"; + if (klass === "dataInter" && (d.isIO()||d.from=="Coordinator"||d.to=="Coordinator")) { + klass = "dataIO"; + } + return d.id + " " + kind + " " + klass; + }).each(function() { + var labelize = Labelizer.labelize().ellipsis(5); + d3.select(this).call(labelize); + }); + + d3.selectAll(".ellipsized") + .on("mouseover", function(d) { + d3.select(this).style("cursor", "pointer") + self.tooltip.transition().duration(200).style("opacity", 0.9); + var pipeData = d.name.split(","); + var pipeVariables=[]; + for (var i=0; i<pipeData.length; i++) + { + if (pipeData[i].includes("/")) + { + var splitPipeData = pipeData[i].split("/"); + pipeVariables.push(splitPipeData[splitPipeData.length-1]); + } + } + + + var pruned_pipeVars = {}; + var tooltipText=""; + pipeVariables.forEach(function(x) { pruned_pipeVars[x] = (pruned_pipeVars[x] || 0)+1; }); + for(var keyName in pruned_pipeVars) { + var textTmp; + var value = pruned_pipeVars[keyName] + if (value>1){textTmp = String(keyName+"("+value+")")} + else{textTmp=String(keyName)} + if (tooltipText==""){tooltipText+=textTmp} + else{tooltipText+=","+textTmp} + } + + var tooltipize = Labelizer.tooltipize().text(tooltipText); + self.tooltip.call(tooltipize) + .style("width", "200px") + .style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 28) + "px"); + }) + .on("mouseout", function() { + self.tooltip.transition().duration(500).style("opacity", 0); + }); + + return textGroups; + }; + + Xdsm.prototype._createWorkflow = function() { + // console.log(JSON.stringify(this.graph.chains)); + var workflow = this.svg.insert("g", ":first-child") + .attr("class", "workflow"); + workflow.selectAll("g") + .data(this.graph.chains) + .enter() + .insert('g').attr("class", "workflow-chain") + .selectAll('polyline') + .data(function(d) { return d; }) // eslint-disable-line brace-style + .enter() + .append("polyline") + .attr("class", function(d) { + return "link_" + d[0] + "_" + d[1]; + }) + .attr("points", function(d) { + var w = CELL_W * Math.abs(d[0] - d[1]); + var h = CELL_H * Math.abs(d[0] - d[1]); + var points = []; + if (d[0] < d[1]) { + if (d[0] !== 0) { + points.push((-w) + ",0"); + } + points.push("0,0"); + if (d[1] !== 0) { + points.push("0," + h); + } + } else { + if (d[0] !== 0) { + points.push(w + ",0"); + } + points.push("0,0"); + if (d[1] !== 0) { + points.push("0," + (-h)); + } + } + return points.join(" "); + }) + .attr("transform", function(d) { + var max = Math.max(d[0], d[1]); + var min = Math.min(d[0], d[1]); + var w; + var h; + if (d[0] < d[1]) { + w = CELL_W * max + X_ORIG; + h = CELL_H * min + Y_ORIG; + } else { + w = CELL_W * min + X_ORIG; + h = CELL_H * max + Y_ORIG; + } + return "translate(" + (X_ORIG + w) + "," + (Y_ORIG + h) + ")"; + }); + }; + + Xdsm.prototype._createDataflow = function(edges) { + var dataflow = this.svg.insert("g", ":first-child") + .attr("class", "dataflow"); + + edges.each(function(d, i) { + dataflow.insert("polyline", ":first-child") + .attr("points", function() { + var w = CELL_W * Math.abs(d.col - d.row); + var h = CELL_H * Math.abs(d.col - d.row); + var points = []; + if (d.iotype === "in") { + if (!d.io.fromU) { + points.push((-w) + ",0"); + } + points.push("0,0"); + if (!d.io.toU) { + points.push("0," + h); + } + } else { + if (!d.io.fromU) { + points.push(w + ",0"); + } + points.push("0,0"); + if (!d.io.toU) { + points.push("0," + (-h)); + } + } + return points.join(" "); + }).attr("transform", function() { + var m = (d.col === undefined) ? i : d.col; + var n = (d.row === undefined) ? i : d.row; + var w = CELL_W * m + X_ORIG; + var h = CELL_H * n + Y_ORIG; + return "translate(" + (X_ORIG + w) + "," + (Y_ORIG + h) + ")"; + }); + }); + }; + + Xdsm.prototype._layoutText = function(items) { + var grid = this.grid; + items.each(function(d, i) { + var item = d3.select(this); + if (grid[i] === undefined) { + grid[i] = new Array(items.length); + } + item.select("text").each(function(d, j) { + var that = d3.select(this); + var data = item.data()[0]; + var m = (data.row === undefined) ? i : data.row; + var n = (data.col === undefined) ? i : data.col; + var bbox = that.nodes()[j].getBBox(); + grid[m][n] = new Cell(-bbox.width / 2, 0, bbox.width, bbox.height); + that.attr("x", function() { + return grid[m][n].x; + }).attr("y", function() { + return grid[m][n].y; + }).attr("width", function() { + return grid[m][n].width; + }).attr("height", function() { + return grid[m][n].height; + }); + }); + }); + + items.attr("transform", function(d, i) { + var m = (d.col === undefined) ? i : d.col; + var n = (d.row === undefined) ? i : d.row; + var w = CELL_W * m + X_ORIG; + var h = CELL_H * n + Y_ORIG; + return "translate(" + (X_ORIG + w) + "," + (Y_ORIG + h) + ")"; + }); + }; + + Xdsm.prototype._customRect = function(node, d, i, offset) { + var grid = this.grid; + node.insert("rect", ":first-child").attr("x", function() { + return grid[i][i].x + offset - PADDING; + }).attr("y", function() { + return -grid[i][i].height * 2 / 3 - PADDING - offset; + }).attr("width", function() { + return grid[i][i].width + (PADDING * 2); + }).attr("height", function() { + return grid[i][i].height + (PADDING * 2); + }).attr("rx", function() { + var rounded = d.type === 'optimization' || + d.type === 'mda' || + d.type === 'doe' || + d.type === 'converger'; + return rounded ? (grid[i][i].height + (PADDING * 2)) / 2 : 0; + }).attr("ry", function() { + var rounded = d.type === 'optimization' || + d.type === 'mda' || + d.type === 'doe' || + d.type === 'converger'; + return rounded ? (grid[i][i].height + (PADDING * 2)) / 2 : 0; + }); + }; + + Xdsm.prototype._customTrapz = function(edge, d, i, offset) { + var grid = this.grid; + edge.insert("polygon", ":first-child").attr("points", function(d) { + var pad = 5; + var w = grid[d.row][d.col].width; + var h = grid[d.row][d.col].height; + var topleft = (-pad - w / 2 + offset) + ", " + + (-pad - h * 2 / 3 - offset); + var topright = (w / 2 + pad + offset + 5) + ", " + + (-pad - h * 2 / 3 - offset); + var botright = (w / 2 + pad + offset - 5 + 5) + ", " + + (pad + h / 3 - offset); + var botleft = (-pad - w / 2 + offset - 5) + ", " + + (pad + h / 3 - offset); + var tpz = [topleft, topright, botright, botleft].join(" "); + return tpz; + }); + }; + + module.exports = Xdsm; + + },{"./labelizer.js":4,"d3":1}],6:[function(require,module,exports){ + /* + * XDSMjs + * Copyright 2016 Rémi Lafage + */ + "use strict"; + + + + + var d3 = require('d3'); + var Graph = require('./src/graph'); + var Xdsm = require('./src/xdsm'); + var Animation = require('./src/animation'); + + + //aigner: NEW! + //#####################################################################// + //aigner: functions for drawing expand- and collapse-symbols + function drawExpandSymbol(aCircle, line1, line2) + { + aCircle = aCircle + .attr("r", 10) + .style("stroke", "black") + .style("stroke-width", 2) + .style("fill", "#99CC00") + .style("fill-opacity", .6) + line1 = line1 + .attr("x1", parseFloat(aCircle.attr("cx"))-5) + .attr("y1", parseFloat(aCircle.attr("cy"))) + .attr("x2", parseFloat(aCircle.attr("cx"))+5) + .attr("y2", parseFloat(aCircle.attr("cy"))) + .style("stroke", "black") + .style("stroke-width", 2); + line2 = line2 + .attr("x1", parseFloat(aCircle.attr("cx"))) + .attr("y1", parseFloat(aCircle.attr("cy"))-5) + .attr("x2", parseFloat(aCircle.attr("cx"))) + .attr("y2", parseFloat(aCircle.attr("cy"))+5) + .style("stroke", "black") + .style("stroke-width", 2); + } + function drawRemoveSymbol(anXdsm, aCircle, aMinus) + { + var xOffset=150; + var yOffset=12; + aCircle = aCircle + .attr("cx", anXdsm.svg.attr("width")-xOffset) + .attr("cy", yOffset) + .attr("r", 10) + .classed("remCircle",true) + aMinus = aMinus + .attr("x1", anXdsm.svg.attr("width")-xOffset+5) + .attr("y1", yOffset) + .attr("x2", anXdsm.svg.attr("width")-xOffset-5) + .attr("y2", yOffset) + .classed("remMinus",true) + } + function drawTreeRemoveSymbol(aRemoveSymbol) + { + aRemoveSymbol = aRemoveSymbol + .attr("class", "treeRemoveSymbol") + .attr("transform", "translate(38,12)") + var circle = aRemoveSymbol.append("circle"); + var minus = aRemoveSymbol.append("line"); + var cx = -20; + var cy = 12; + circle = circle + .attr("cx", cx+5) + .attr("cy", cy) + .attr("r", 10) + .classed("remCircle",true) + minus = minus + .attr("x1", cx) + .attr("y1", cy) + .attr("x2", cx+10) + .attr("y2", cy) + .classed("remMinus",true) + aRemoveSymbol + .on("mouseover", function(){ + d3.select(this).style("cursor", "pointer") + circle.style("fill", "red").style("fill-opacity", .8); + }) + .on("mouseout", function(){circle.style("fill", "red").style("fill-opacity", .6)}) + } + + //aigner: Update of the sub workflows + function update_subXdsm(xdsms, refName) + { + var playButton = d3.select(".xdsm").select("."+refName).select(".playButton"); + var rect = playButton.select(".playButton_rect"); + playButton.on("mouseover",function(){ + d3.select(this).style("cursor", "pointer") + rect.style("fill","#3399FF"); + }) + .on("mousedown", function() + { + rect.style("fill","#3399FF"); + var anim = new Animation(xdsms, refName); + anim.run(); + }) + .on("mouseup", function(){rect.style("fill","#4B4B4B");}) + .on("mouseout", function(){rect.style("fill","#555555");}) + } + + //aigner: Move to front function + d3.selection.prototype.moveToFront = function() { + return this.each(function(){ + this.parentNode.appendChild(this); + }); + }; + + //d3-context-menu for right-click-option + d3.contextMenu = function (menu, openCallback) { + + // create the div element that will hold the context menu + d3.selectAll('.d3-context-menu').data([1]) + .enter() + .append('div') + .attr('class', 'd3-context-menu'); + + // close menu + d3.select('body').on('click.d3-context-menu', function() { + d3.select('.d3-context-menu').style('display', 'none'); + }); + + // this gets executed when a contextmenu event occurs + return function(data, index) { + var elm = this; + + d3.selectAll('.d3-context-menu').html(''); + var list = d3.selectAll('.d3-context-menu').append('ul'); + list.selectAll('li').data(menu).enter() + .append('li') + .html(function(d) { + return d.title; + }) + .on('mousedown', function(d, i) { + d.onMouseDown(elm, data, index); + }) + .on('mouseup', function(d, i) { + d.onMouseUp(elm, data, index); + d3.select('.d3-context-menu').style('display', 'none'); + }) + .on('mouseenter',function(d,i){ + d.onMouseOver(elm,data,index); + if(d.childrenItems.length>0 ) + { + var li = this + d3.select(this).selectAll("ul").remove(); + d3.select(this) + .append("ul") + .style("top",String(li.offsetTop-5)+"px") + .selectAll("li") + .data(d.childrenItems) + .enter().append("li") + .text(function(d) { return d.title; }) + .on("mouseenter", function(d,i){ + d.onMouseOver(elm,data,index); + }) + .on('click', function(d, i) { + d.onMouseClick(elm, d, index); + }) + .on('mouseleave',function(d,i){ + + }); + } + else + return false; + }) + .on('mouseleave',function(d,i){ + d3.select(this).selectAll("ul").style('display', 'none') + }); + + + + // the openCallback allows an action to fire before the menu is displayed + // an example usage would be closing a tooltip + if (openCallback) openCallback(data, index); + + // display context menu + d3.select('.d3-context-menu') + .style('left', (d3.event.pageX - 2) + 'px') + .style('top', (d3.event.pageY - 2) + 'px') + .style('display', 'block'); + + //Prevent the default event, which is the left-click. + //This means, the context-menu will only appear on right mouse clicks + d3.event.preventDefault(); + + //Place context-menu always on top of everything esle + d3.select(".d3-context-menu").style("z-index",Number.MAX_SAFE_INTEGER); + }; + }; + + + //aigner: Function creates a table + function tabulate(aTable,data,columns) { + var thead = aTable.append('thead'); + var tbody = aTable.append('tbody'); + + // create a row for each object in the data + var rows = tbody.selectAll('tr') + .data(data) + .enter() + .append('tr'); + + // create a cell in each row for each column + var cells = rows.selectAll('td') + .data(function (row) { + return columns.map(function (column) { + return {column: column, value: row[column]}; + }); + }) + .enter() + .append('td') + .html(function (d) { return d.value; }); + + return aTable; + } + + function loader(config) { + return function() { + var radius = Math.min(config.width, config.height) / 2; + var tau = 2 * Math.PI; + + var arc = d3.svg.arc() + .innerRadius(radius*0.5) + .outerRadius(radius*0.9) + .startAngle(0); + + var svg = d3.select(config.container).append("svg") + .attr("id", config.id) + .attr("width", config.width) + .attr("height", config.height) + .append("g") + .attr("transform", "translate(" + config.width / 2 + "," + config.height / 2 + ")") + + var background = svg.append("path") + .datum({endAngle: 0.33*tau}) + .style("fill", "#4D4D4D") + .attr("d", arc) + .call(spin, 1500) + + function spin(selection, duration) { + selection.transition() + .ease("linear") + .duration(duration) + .attrTween("transform", function() { + return d3.interpolateString("rotate(0)", "rotate(360)"); + }); + + setTimeout(function() { spin(selection, duration); }, duration); + } + + function transitionFunction(path) { + path.transition() + .duration(7500) + .attrTween("stroke-dasharray", tweenDash) + .each("end", function() { d3.select(this).call(transition); }); + } + + }; + } + + var myLoader = loader({width: 960, height: 500, container: "#loader_container", id: "loader"}); + + //aigner: NEW! + //aigner: Here, the data is read and the XDSM is created + //#####################################################################// + function startXDSM(data, graphID) + { + //Highlight function, that shows usage of a node in the XDSM + function highlight(data) + { + var xPath = data.data.xPath; + + scenarioKeys.forEach(function(k) + { + var xdsm_tmp; + xdsm_tmp = xdsms[k]; + if (xdsm_tmp) + { + xdsm_tmp.svg.selectAll(".edge").each(function(p) + { + var firstElement_tmp = p.name.split("/")[1] + var xPath_fromFirst = "/"+firstElement_tmp+xPath.split(firstElement_tmp)[1] + var this_edge = this + var p_name_list = p.name.split(",") + p_name_list.forEach(function(p_name) + { + if (include(p_name+"__",xPath_fromFirst+"__") || include(p_name,xPath_fromFirst+"/")) + { + var highlightEdge = d3.select(this_edge).select("polygon"); + highlightEdge + .style("stroke-width",5.) + .style("stroke","#CC0000") + d3.selectAll(".treeFrame") + .attr("fill-opacity", 0.5) + .attr("stroke-opacity", 0.5); + d3.selectAll(".nodeText").style("fill-opacity",0.5); + } + }) + }) + } + }) + + } + + //Unhighlight function again + function unhighlight(data) + { + var xPath = data.data.xPath; + + scenarioKeys.forEach(function(k) + { + var xdsm_tmp; + xdsm_tmp = xdsms[k]; + if (xdsm_tmp) + { + xdsm_tmp.svg.selectAll(".edge").each(function(p) + { + var firstElement_tmp = p.name.split("/")[1] + var xPath_fromFirst = "/"+firstElement_tmp+xPath.split(firstElement_tmp)[1] + var this_edge = this + var p_name_list = p.name.split(",") + p_name_list.forEach(function(p_name) + { + if (include(p_name+"__",xPath_fromFirst+"__") || include(p_name,xPath_fromFirst+"/")) + { + var highlightEdge = d3.select(this_edge).select("polygon"); + highlightEdge + .style("stroke-width",1.) + .style("stroke","black"); + d3.selectAll(".treeFrame") + .attr("fill-opacity", 0.8) + .attr("stroke-opacity", 0.8); + d3.selectAll(".nodeText").style("fill-opacity",1); + } + }) + }) + } + }) + + } + + + function showVariableTable(aVariable) + { + var headLine = "Node Information (" + aVariable.data.name + ")"; + var data = []; + // render the table(s) + data.push({ "name" : "Name", "value" : "\""+aVariable.data.name+"\"" }) + data.push({ "name" : "xPath", "value" : aVariable.data.xPath }) + if (aVariable.data.type){data.push({ "name" : "Type", "value" : aVariable.data.type })} + if (aVariable.data.level){data.push({ "name" : "Level", "value" : aVariable.data.level })} + if (aVariable.data.children){data.push({ "name" : "Number of children", "value" : aVariable.data.children.length })} + if (aVariable.data.dimension){data.push({ "name" : "Dimension", "value" : aVariable.data.dimension })} + else if(aVariable.data.dimension===null){data.push({ "name" : "Dimension", "value" : "undefined" })} + if (aVariable.data.value){data.push({ "name" : "Value(s)", "value" : aVariable.data.value })} + + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + + var markedVariables = []; + function preMarkVariable(variableData) + { + markedVariables.push(variableData) + bootbox.hideAll(); + var bootboxContent = {title: 'Pre-assign parameter role', message: "<p><b>Successfully pre-assigned parameter.</b></p>" + +"<p>To actually assign the parameter role you have to press the <b>'Assign parameter roles'</b> button from the <b>'FPG Manipulations'</b> menu." + +"<p>Note: You can first premark all parameters and the assign them altogether to save time</p>"}; + kadmosSuccessMessage(bootboxContent) + } + + function markVariable(variableData_arr) + { + d3.select('.d3-context-menu').style('display', 'none'); + + //Stringify variable data before sending it to kadmos + var variableData_str = JSON.stringify(variableData_arr) + + var bootboxContent = {title: 'Assign parameter roles', message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_mark_variable', + data: { + 'graphID':graphID, + 'variableData_str':variableData_str, + 'currentOrder':nodeOrder, 'sessionId': sessionId + }, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + + function unmarkVariable(xPath) + { + d3.select('.d3-context-menu').style('display', 'none'); + + var bootboxContent = {title: 'Unmarking variable<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_unmark_variable', + data: { + 'graphID':graphID, + 'xPath':xPath, + 'currentOrder':nodeOrder, 'sessionId': sessionId + }, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + + //aigner: Marking variables as ... in KADMOS + var markingOptions = [ + { + title: 'design variable', + onMouseClick: function(elm, d, i) { + var theVariableData = {}; + theVariableData.variableType = "designVariable"; + theVariableData.operator = ""; + theVariableData.upperBound = 0.; + theVariableData.lowerBound = 0.; + theVariableData.nominalValue = 0.; + + bootbox.hideAll(); + bootbox.confirm({ + title: 'Marking variable as ' + theVariableData.variableType, + message:"<form id='infos' action=''>" + +"\Nominal Value: <input type='text' id='nominalValue' name='nominalValue' /><br/>" + +"\Upper Bound: <input type='text' id='upperBound' name='upperBound' /><br/>" + +"\Lower Bound: <input type='text' id='lowerBound' name='lowerBound' />\</form>", + callback: function(result){ + if(result){ + theVariableData.nominalValue = parseFloat($('#nominalValue').submit()[0].value.replace(/,/g, '')); + theVariableData.upperBound = parseFloat($('#upperBound').submit()[0].value.replace(/,/g, '')); + theVariableData.lowerBound = parseFloat($('#lowerBound').submit()[0].value.replace(/,/g, '')); + + if (isNaN(parseInt(theVariableData.nominalValue)) + || isNaN(parseInt(theVariableData.lowerBound)) + || isNaN(parseInt(theVariableData.upperBound))) + { + bootbox.hideAll(); + bootbox.dialog({ + title: "Assign parameter role", + message: "<b>ERROR:</b> Invalid variable type! Variables can only be numbers!", + buttons : { cancel: + { + label: "OK", + className: 'btn-danger', + callback: function(){} + } + }}) + } + else if(theVariableData.nominalValue > theVariableData.upperBound) + { + bootbox.hideAll(); + bootbox.dialog({ + title: "Assign parameter role", + message: "<b>ERROR:</b> Nominal value cannot be larger than upper bound!", + buttons : { cancel: + { + label: "OK", + className: 'btn-danger', + callback: function(){} + } + }}) + } + else if (theVariableData.nominalValue < theVariableData.lowerBound) + { + bootbox.hideAll(); + bootbox.dialog({ + title: "Assign parameter role", + message: "<b>ERROR:</b> Nominal value cannot be smaller than lower bound!", + buttons : { cancel: + { + label: "OK", + className: 'btn-danger', + callback: function(){} + } + }}) + } + + else + { + var firstFromSchema = currentGraph.variableSchemes["schema"][0].xPath.split("/")[1] + var xPath = "/"+firstFromSchema+elm.__data__.data.xPath.split(firstFromSchema)[1]; + theVariableData.xPath = xPath; + preMarkVariable(theVariableData); + } + } + } + }); + }, + onMouseOver: function(elm,d,i){} + }, + { + title: 'objective', + onMouseClick: function(elm, d, i) { + var theVariableData = {}; + theVariableData.variableType = "objective"; + theVariableData.operator = ""; + theVariableData.upperBound = 0.; + theVariableData.lowerBound = 0.; + theVariableData.nominalValue = 0.; + var firstFromSchema = currentGraph.variableSchemes["schema"][0].xPath.split("/")[1] + var xPath = "/"+firstFromSchema+elm.__data__.data.xPath.split(firstFromSchema)[1]; + theVariableData.xPath = xPath; + preMarkVariable(theVariableData); + }, + onMouseOver: function(elm,d,i){} + }, + { + title: 'constraint', + onMouseClick: function(elm, d, i) { + var theVariableData = {}; + theVariableData.variableType = "constraint"; + theVariableData.operator = ""; + theVariableData.upperBound = 0.; + theVariableData.lowerBound = 0.; + theVariableData.nominalValue = 0.; + + bootbox.hideAll(); + bootbox.confirm({ + title: 'Marking variable as ' + theVariableData.variableType, + message:"<form id='infos' action=''>" + +"\Nominal Value: <input type='text' id='nominalValue' name='nominalValue' /><br/>" + +"\Mathematical operator (<, <=, = ,>=, >): " + +"<select id='operator' name='operator'>" + +"<option value='<'><</option>" + +"<option value='<='><=</option>" + +"<option value='=='>==</option>" + +"<option value='>='>>=</option>" + +"<option value='>'>></option>" + +"</select>\</form>", + callback: function(result){ + if(result){ + theVariableData.nominalValue = parseFloat($('#nominalValue').submit()[0].value.replace(/,/g, '')); + theVariableData.operator = $('#operator').submit()[0].value; + + if(theVariableData.operator != "<" + && theVariableData.operator != "<=" + && theVariableData.operator != "==" + && theVariableData.operator != ">=" + && theVariableData.operator != ">") + { + bootbox.hideAll(); + bootbox.dialog({ + title: "Assign parameter role", + message: "<b>ERROR:</b> Invalid operator \"" + theVariableData.operator + "\"!", + buttons : { cancel: + { + label: "OK", + className: 'btn-danger', + callback: function(){} + } + }}) + } + else if(isNaN(parseInt(theVariableData.nominalValue))) + { + bootbox.hideAll(); + bootbox.dialog({ + title: "Assign parameter role", + message: "<b>ERROR:</b> Nominal value must be a number!", + buttons : { cancel: + { + label: "OK", + className: 'btn-danger', + callback: function(){} + } + }}) + } + else + { + var firstFromSchema = currentGraph.variableSchemes["schema"][0].xPath.split("/")[1] + var xPath = "/"+firstFromSchema+elm.__data__.data.xPath.split(firstFromSchema)[1]; + theVariableData.xPath = xPath; + preMarkVariable(theVariableData); + } + } + } + }); + }, + onMouseOver: function(elm,d,i){} + }, + { + title: 'quantity of interest', + onMouseClick: function(elm, d, i) { + var theVariableData = {}; + theVariableData.variableType = "quantityOfInterest"; + theVariableData.operator = ""; + theVariableData.upperBound = 0.; + theVariableData.lowerBound = 0.; + theVariableData.nominalValue = 0.; + var firstFromSchema = currentGraph.variableSchemes["schema"][0].xPath.split("/")[1] + var xPath = "/"+firstFromSchema+elm.__data__.data.xPath.split(firstFromSchema)[1]; + theVariableData.xPath = xPath; + preMarkVariable(theVariableData); + }, + onMouseOver: function(elm,d,i){} + }, + ]; + + + //menu --> functions for right click options + var nodeMenu = [ + { + title: 'Show node information', + onMouseDown: function(elm, d, i) { + showVariableTable(d); + }, + onMouseUp: function(elm, d, i) {}, + onMouseOver: function(elm, d, i) {}, + childrenItems: [] + }, + { + title: 'Show usage of node in XDSM', + onMouseDown: function(elm, d, i) { + highlight(d); + }, + onMouseUp: function(elm, d, i) { + unhighlight(d); + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Copy x-path to clipboard', + onMouseDown: function(elm, d, i) { + window.prompt("Copy to clipboard: Ctrl+C, Enter", d.data.xPath); + d3.select('.d3-context-menu').style('display', 'none'); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Pre-assign parameter', + onMouseDown: function(elm, d, i) {}, + onMouseUp: function(elm, d, i) {}, + onMouseOver: function(elm, d, i) {}, + childrenItems: markingOptions + }, + { + title: 'Un-assign parameter role', + onMouseDown: function(elm, d, i) { + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to do this?", function(sure) + { + if (sure) + { + var firstFromSchema = currentGraph.variableSchemes["schema"][0].xPath.split("/")[1] + var xPath = "/"+firstFromSchema+elm.__data__.data.xPath.split(firstFromSchema)[1]; + unmarkVariable(xPath) + } + }) + }, + onMouseUp: function(elm, d, i) {}, + onMouseOver: function(elm, d, i) {}, + childrenItems: [] + } + ] + + + var graphs, currentGraph, varCategories; + + graphs = data.graphs; + for (var i=0;i<graphs.length;i++) + { + if (graphs[i].id==graphID) + { + currentGraph = graphs[i] + } + } + varCategories = data.categories; + + //aigner: Get xdsm data + var mdo = currentGraph.xdsm; + + d3.select("body").append("div").attr("class","xdsmDiv") + //################################################################################################// + var headerDiv = d3.select(".xdsmDiv").append("div").attr("class","panel panel-primary") + headerDiv.append("div").attr("class","panel-heading text-center") + .append("h3") + .attr("class","panel-title") + .style("font-family","Arial") + .style("font-size","20pt") + .text("XDSM View") + var name_tmp=""; + if (currentGraph.name){name_tmp=currentGraph.name} + else{name_tmp="Graph " + currentGraph.id} + headerDiv.append("div").attr("class","panel-body") + .style("font-family","Arial") + .style("font-size","16pt") + .text("Graph name: " + name_tmp) + headerDiv.append("div").attr("class","panel-body") + .style("font-family","Arial") + .style("font-size","16pt") + .text("Graph description: " + currentGraph.description) + //################################################################################################// + + + + + //aigner: Functions for toolMenu + //################################################################################################// + //aigner: Creation of input/output tree + //############################################################ + function showIOTree(aCategory, categoryDescr, aNode, io) + { + var edges = d3.selectAll(".edge"); + var array=""; + var name; + edges.each(function(edge) + { + if (io=="in") + { + name = "Input tree view: " + aNode.id + "; Categorization: " + categoryDescr; + if (edge.to == aNode.id) + { + array = array + "," + edge.name; + } + } + else if (io=="out") + { + name = "Output tree view:" + aNode.id + "; Categorization: " + categoryDescr; + if (edge.from == aNode.id) + { + array = array + "," + edge.name; + } + } + }) + + + var headLine = name; + var d3_body = d3.select("body"); + var lobiID = String(getRandomInt(0,1000)) + var divClassName = "treeDiv" + lobiID; + var treeLayoutdiv = d3_body.append("div").attr("class",divClassName + " panel-default") + .style("left",(d3.event.pageX) + "px") + .style("top",(d3.event.pageY - 28) + "px") + .style("position", "absolute") + treeLayoutdiv.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + $('.'+divClassName).lobiPanel({ + reload: false, + editTitle: false, + unpin: false, + minWidth: 1000, + maxWidth: 100000, + minHeight: 500, + maxHeight: 100000, + }); + $('.'+divClassName).lobiPanel('unpin'); + var treeLayoutSVG = treeLayoutdiv.append("svg").attr("class","treeLayoutSVG") + var treeLayout = treeLayoutSVG.append("g").attr("class","treeLayout"); + maketreeLayout(array, treeLayout, treeLayoutSVG, treeLayoutdiv, divClassName, headLine, aCategory); + } + //############################################################ + + //aigner: Creation of input/output list + //############################################################ + function showIOList(aCategory, categoryDescr, aNode, io) + { + var edges = d3.selectAll(".edge"); + var array=""; + var title; + edges.each(function(edge) + { + if (io=="in") + { + title = "List view of all inputs for " + aNode.id + "; Categorization: " + categoryDescr; + if (edge.to == aNode.id) + { + array = array + "," + edge.name; + } + } + else if (io=="out") + { + title = "List view of all outputs for " + aNode.id + "; Categorization: " + categoryDescr; + if (edge.from == aNode.id) + { + array = array + "," + edge.name; + } + } + }) + + var variables = []; + var pipeData = array; + variables = JSON.parse(JSON.stringify(currentGraph.variableSchemes[aCategory])) + prune_tree(pipeData,variables) + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + + showList(title,variables,nodeMenu); + + } + //############################################################ + + + function showToolTable(aTool) + { + var aToolNameSplit = aTool.name.split(': ') + var headLine; + if (aToolNameSplit.length>1){headLine = "Competence Information: (" + aToolNameSplit[1] + ")";} + else {headLine = "Competence Information: (" + aToolNameSplit[0] + ")";} + + + var data = []; + // render the table(s) + if (aTool.metadata.length==0) + { + data.push({ "name" : "NO TOOL METADATA AVAILABLE", "value" : "..." }) + } + function findSubMetaData(aMetaData) + { + for(var key in aMetaData) + { + if (typeof aMetaData[key] === 'object') + { + data.push({ "name" : key, "value" : ''}) ; + findSubMetaData(aMetaData[key]); + } + else + { + data.push({ "name" : key, "value" : aMetaData[key] }) + } + } + } + for (var j=0; j < aTool.metadata.length;j++) + { + var metaData = aTool.metadata[j]; + findSubMetaData(metaData); + } + + + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + + + function changeNodePosition(aNode) + { + var theOptions = [{text: 'Choose new position...', value: '',}]; + for (var j=1; j<currentGraph.xdsm.nodes.length;j++) + { + //aigner: value: j-1 because in KADMOS the coordinator is not in the node list, therefore all other competences' indices are decreased by 1! + theOptions.push({text: String(j) + " ("+currentGraph.xdsm.nodes[j].name+")", value: j-1}); + } + bootbox.hideAll(); + bootbox.prompt( + { + title: "Please specify a new position for the competence \""+aNode.name+"\"", + inputType: 'select', + inputOptions: theOptions, + callback: function (newPos) { + if (newPos!=null && newPos !='') + { + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to do this?", function(sure){ + if (sure) + { + var bootboxContent = {title: "Change competence position", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_change_node_pos', + data: {'graphID':graphID, 'nodeName':aNode.uID, 'newPos':newPos, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + } + } + }); + } + + function deleteNode(aNode) + { + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to do this?", function(sure) + { + if (sure) + { + var bootboxContent = {title: "Delete competence", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_delete_node', + data: {'graphID':graphID, 'nodeName':aNode.uID, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + } + + + function addMathematicalFunction() + { + bootbox.hideAll(); + + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; + + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Name") + input = form_group.append("input") + .attr("id","function_node") + .attr("class","form-control") + .attr("name","function_node") + .attr("placeholder","Add a tool name here...") + //Tool input nodes + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Tool input nodes") + input = form_group.append("input") + .attr("id","input_nodes_xPath") + .attr("class","form-control") + .attr("name","input_nodes_xPath") + .attr("placeholder","xPaths of the input nodes (please seperate with comma)") + input = form_group.append("input") + .attr("id","input_nodes_name") + .attr("class","form-control") + .attr("name","input_nodes_name") + .attr("placeholder","Variable names of the input nodes (Please separate with comma)") + //Tool output nodes + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Tool output nodes") + input = form_group.append("input") + .attr("id","output_node_xPath") + .attr("class","form-control") + .attr("name","output_node_xPath") + .attr("placeholder","xPath of the output node") + input = form_group.append("input") + .attr("id","equation") + .attr("class","form-control") + .attr("name","equation") + .attr("placeholder","Equation for the output node") + input = form_group.append("input") + .attr("id","language") + .attr("class","form-control") + .attr("name","language") + .attr("placeholder","Programming language (e.g. 'Python')") + + + var modal = bootbox.dialog({ + message: $(".form-content").html(), + title: "Add mathematical function", + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default pull-left", + callback: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary pull-left", + callback: function() { + + //get form data + var form_data = { + function_node: $('form #function_node').val(), + input_nodes_xPath: $('form #input_nodes_xPath').val(), + input_nodes_name: $('form #input_nodes_name').val(), + output_node_xPath: $('form #output_node_xPath').val(), + equation: $('form #equation').val(), + language: $('form #language').val() + } + + + var bootboxContent = {title: "Add mathematical function", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_add_mathematical_function', + data: {'graphID':graphID, 'currentOrder':nodeOrder, 'form_data':JSON.stringify(form_data), 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + kadmosHavePatience(xhr, bootboxContent) + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + } + ], + onEscape: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }); + + + + } + + + //aigner: children items for toolMenu + //############################################################ + var inputChildrenitemsTree = []; + var outputChildrenitemsTree = []; + for (var j=0; j< varCategories.length; j++) + { + inputChildrenitemsTree.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) {showIOTree(data.varCategory,data.description,elm.__data__,"in")}, + onMouseOver: function(elm,data,i){}}); + outputChildrenitemsTree.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) { + showIOTree(data.varCategory,data.description,elm.__data__,"out")}, + onMouseOver: function(elm,data,i){}}); + } + + var inputChildrenitemsList = []; + var outputChildrenitemsList = []; + for (var j=0; j< varCategories.length; j++) + { + inputChildrenitemsList.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) {showIOList(data.varCategory,data.description,elm.__data__,"in")}, + onMouseOver: function(elm,data,i){}}); + outputChildrenitemsList.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) {showIOList(data.varCategory,data.description,elm.__data__,"out")}, + onMouseOver: function(elm,data,i){}}); + } + //############################################################ + + + //menu --> functions for right click options (coordinator) + var toolMenuCoor = [ + { + title: 'Show input variable tree...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: inputChildrenitemsTree + }, + { + title: 'Show output variable tree...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: outputChildrenitemsTree + }, + { + title: 'Show input variable list...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: inputChildrenitemsList + }, + { + title: 'Show output variable list...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: outputChildrenitemsList + } + ] + + + //menu --> functions for right click options for other tools + var toolMenuSpecial = [ + { + title: 'Competence information', + onMouseDown: function(elm, k, i) { + editDCMetadata(data,currentGraph,k) + //sendDCMetadata(dc_metadata); + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Change competence position in the graph', + onMouseDown: function(elm, k, i) { + changeNodePosition(k); + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Delete competence', + onMouseDown: function(elm, k, i) { + deleteNode(k); + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }] + var toolMenu = toolMenuCoor.concat(toolMenuSpecial) + //################################################################################################// + + + + + //################################################################################################// + //aigner: Get node order of current graph nodes + var nodeOrder=""; + for (var j=1; j<currentGraph.xdsm.nodes.length;j++) + { + + if (j!=1) + nodeOrder += ","; + nodeOrder += currentGraph.xdsm.nodes[j].uID; + } + + //aigner: theInputOptions -> array of all nodes in the graph, which can then be selected in the fpg manipulations + var theInputOptions = []; + for (var j=1; j<currentGraph.xdsm.nodes.length;j++) + { + //aigner: value: j-1 because in KADMOS the coordinator is not in the node list, therefore all other competences' indices are decreased by 1! + theInputOptions.push({text: currentGraph.xdsm.nodes[j].name, value: currentGraph.xdsm.nodes[j].uID}); + } + + //aigner MDAO architecture options + var MDAO_architectures = [{text:'-',value:'-'}, + {text:'Unconverged MDA',value:'unconverged-MDA'}, + {text:'Converged MDA',value:'converged-MDA'}, + {text:'Multidisciplinary Feasible (MDF)',value:'MDF'}, + {text:'Individual Discipline Feasible (IDF)',value:'IDF'}, + {text:'Unconverged Optimization',value:'unconverged-OPT'}, + {text:'Unconverged Design Of Experiments (DOE)',value:'unconverged-DOE'}, + {text:'Converged Design Of Experiments (DOE)',value:'converged-DOE'}, + {text:'Collaborative Optimization',value:'CO'}, + {text:'BLISS-2000',value:'BLISS-2000'}] + var coupling_decompositions = ['-','Gauss-Seidel','Jacobi'] + var DOE_methods = ['-','Full factorial design','Latin hypercube design','Monte Carlo Design'] + //################################################################################################// + + + var revertDiv = d3.select(".xdsmDiv").append("div").attr("class","dataModelDiv").style("top","-10px") + //aigner: Revert previous step + //#################################################################################################################### + //aigner: KADMOS function Save graph + //#################################################################################################################### + // Function to download data to a file + function download(filename, text) { + var element = document.createElement('a'); + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); + element.setAttribute('download', filename); + + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); + } + + + //aigner: Export changes --> Download as CMDOWS file + function exportChangesToFile(fileType) + { + bootbox.hideAll(); + var bootboxContent = {title: "Save graph", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax( + { + type: 'POST', + data: {'fileName':currentGraph.name, 'fileType': fileType, 'graphID': graphID, + 'sessionId': sessionId}, + url: '/kadmos_export_graph', + success: function(result) + { + var files = result + files.forEach(function(file) + { + download_from_kadmos(file,"/kadmos_download/"+file+"/"+sessionId) + }) + + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + bootboxContent.message = "Successfully created the files. Ready for download." + bootbox.hideAll(); + bootbox.confirm( + { + title: bootboxContent.title, + message: bootboxContent.message, + callback: function(){ + remove_obsolete_files() + } + }); + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + + + + var saveButton = revertDiv.append("button") + .attr("class","btn btn-primary") + .attr("data-toggle","tooltip") + .attr("data-placement","top") + .attr("title","Save graph") + .style("margin-left","10px") + .style("margin-bottom","10px") + saveButton.append("span") + .attr("class","glyphicon glyphicon-floppy-disk") + .attr("aria-hidden","true") + saveButton.on("mousedown", function() + { + bootbox.hideAll(); + + bootbox.prompt( + { + title: "Save graph. What would you like to save the graph as?", + inputType: 'select', + inputOptions: [ {text:" Save as new VISTOMS graph",value:"VISTOMS"}, + {text:"Save as KDMS file (download)",value:"kdms"}, + {text:"Save as CMDOWS file (download)",value:"cmdows"}], + value: "VISTOMS", + callback: function (fileType) + { + if (fileType) + { + if (fileType.includes("VISTOMS")) + { + bootbox.hideAll(); + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; + + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Name") + input = form_group.append("input") + .attr("id","graph_name") + .attr("class","form-control") + .attr("name","graph_name") + .attr("placeholder","Add a graph name here...") + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Description") + input = form_group.append("input") + .attr("id","graph_description") + .attr("class","form-control") + .attr("name","graph_description") + .attr("placeholder","Add a graph description here...") + + bootbox.dialog({ + message: $(".form-content").html(), + title: "<p>The graph will be saved as new VISTOMS graph" + +"<p>Please type in a new name and description for the graph</p>", + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default pull-left", + callback: function() { + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary pull-left", + callback: function() { + + //get form data + var graph_name = $('form #graph_name').val(); + var graph_description = $('form #graph_description').val(); + + + var bootboxContent = {title: "Save as new VISTOMS graph", message: '<p>Please be patient...</p>'}; + var newGraphID = "" + if (data.graphs.length<100){newGraphID="0"+String(data.graphs.length+1)} + else {newGraphID=String(data.graphs.length+1)} + + var newGraphID = '01'; + data.graphs.forEach(function(graph) + { + id_int = parseInt(graph.id) + if (data.graphs.length < 100){newGraphID = "0" + String(id_int+1);} + else{newGraphID = String(id_int+1);} + }) + + var xhr = $.ajax( + { + type: 'POST', + data: {'graphID': graphID, 'newGraphID': newGraphID, 'newGraphName': graph_name, 'newGraphDesc': graph_description, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + url: '/kadmos_save_vistoms_graph', + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = jQuery.extend(true, {}, data); + var graphData = JSON.parse(result); + + for (var i = 0; i < data.graphs.length; i++) + { + if (graphID == data.graphs[i].id) + { + //Insert copied graph behind the original one + updatedData.graphs.splice(i+1, 0, graphData.graphs[0]) + } + } + + + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,newGraphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + d3.selectAll(".form-content").remove(); + } + } + ] + }); + + } + else + { + exportChangesToFile(fileType) + } + } + } + }) + }) + //#################################################################################################################### + + + + + var deleteButton = revertDiv.append("button") + .attr("class","btn btn-danger") + .attr("data-toggle","tooltip") + .attr("data-placement","top") + .attr("title","Delete graph") + .style("margin-left","10px") + .style("margin-bottom","10px") + deleteButton.append("span") + .attr("class","glyphicon glyphicon-trash") + .attr("aria-hidden","true") + deleteButton.on("mousedown", function() + { + var bootboxContent = {title: "Deleting graph", message: '<p>Please be patient...</p>'}; + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to permanently delete the graph? <b>This cannot be reverted!</b>", function(sure) + { + if (sure) + { + var xhr = $.ajax( + { + type: 'POST', + url: '/kadmos_delete_graph', + data: {'graphID':graphID, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var dataArray = result; + var data = [] + if (dataArray.length == 0){data="REP__GRAPH_DATA__REP"} + else{data = {"graphs":[], "categories":""};} + for (var i = 0; i < dataArray.length; i++) + { + var data_tmp = JSON.parse(dataArray[i]) + data.graphs.push(data_tmp.graphs[0]); + if (data.categories == []) + { + data.categories = data_tmp.categories; + } + } + + clearView(); + makeKadmosMenu(data); + mainPage(); + + bootboxContent.message = "Graph was sucessfully deleted!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + }) + + + var backButton = revertDiv.append("button") + .attr("class","btn btn-warning") + .attr("data-toggle","tooltip") + .attr("data-placement","top") + .attr("title","Revert graph manipulation step") + .style("margin-left","10px") + .style("margin-bottom","10px") + backButton.append("span") + .attr("class","glyphicon glyphicon-arrow-left") + .attr("aria-hidden","true") + backButton.on("mousedown", function() + { + var bootboxContent = {title: "Revert graph manipulation step", message: '<p>Please be patient...</p>'}; + + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to revert the last step?", function(sure) + { + if (sure) + { + + var xhr = $.ajax( + { + type: 'POST', + url: '/kadmos_revert_step', + data: {'graphID':graphID, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + }) + + var fwdButton = revertDiv.append("button") + .attr("class","btn btn-warning") + .attr("data-toggle","tooltip") + .attr("data-placement","top") + .attr("title","Restore graph manipulation step") + .style("margin-left","10px") + .style("margin-bottom","10px") + fwdButton.append("span") + .attr("class","glyphicon glyphicon-arrow-right") + .attr("aria-hidden","true") + fwdButton.on("mousedown", function() + { + var bootboxContent = {title: "Restore graph manipulation step", message: '<p>Please be patient...</p>'}; + + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to restore the last step?", function(sure) + { + if (sure) + { + var xhr = $.ajax( + { + type: 'POST', + url: '/kadmos_revert_step', + data: {'graphID':graphID}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + }) + + + function addDesignCompetence(theData, theCurrentGraph=null) + { + bootbox.hideAll(); + bootbox.dialog({ + title: "Add design competence", + message: "<form id='inp_outp_form' method='post' enctype='multipart/form-data'>" + +"<label>" + +"<text>Competence name</text>" + +"<br>" + +"<input name='function_node' id='function_node' placeholder='Add a tool name here...'></input>" + +"<br>" + +"<br>" + +"<text>Upload input file:</text>" + +"<input type='file' name='input_xml' />" + +"<br>" + +"<text>Upload output file:</text>" + +"<input type='file' name='output_xml' />" + +"<br>" + +"<input type='submit' value='Submit'/>" + +"</label></form>", + buttons : + { + cancel: { + label: "Cancel", + className: 'btn-danger' + } + } + }); + + $('#inp_outp_form').on('submit',function(event){ + event.preventDefault(); + var formData = new FormData($('#inp_outp_form')[0]); + formData.append('graphID', graphID); + formData.append('currentOrder',nodeOrder); + formData.append('function_node', $('form #function_node').val()); + formData.append('sessionId', sessionId); + + var bootboxContent = {title: "Add design competence", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_add_design_competence', + data: formData, + processData: false, + contentType: false, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = theData; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + d3.selectAll(".form-content").remove(); + }); + } + + //aigner: Function adds or edits a competence's metadata + function editDCMetadata(theData, theCurrentGraph, aNode=null) + { + bootbox.hideAll(); + + //aigner: Initialize the metadata element and it's sub components + var metadata; + if (aNode != null) + { + metadata = JSON.parse(JSON.stringify(aNode.metadata)); + } + console.log(aNode.metadata) + + //aigner: Initialize sub component "general_info" + if (typeof metadata.general_info == "undefined" + || metadata.general_info == null) + { + metadata.general_info = {owner:{},creator:{},operator:{}}; + if (typeof metadata.general_info.description == "undefined"){metadata.general_info.description = ""} + if (typeof metadata.general_info.status == "undefined"){metadata.general_info.status = ""} + if (typeof metadata.general_info.owner.contactUID == "undefined"){metadata.general_info.owner.contactUID = ""} + if (typeof metadata.general_info.creator.contactUID == "undefined"){metadata.general_info.creator.contactUID = ""} + if (typeof metadata.general_info.operator.contactUID == "undefined"){metadata.general_info.operator.contactUID = ""} + + } + //aigner: Initialize sub component "performance_info" + if (typeof metadata.performance_info == "undefined" + || metadata.performance_info == null) + { + metadata.performance_info = {}; + if (typeof metadata.performance_info.precision == "undefined"){metadata.performance_info.precision = ""} + if (typeof metadata.performance_info.fidelity_level == "undefined"){metadata.performance_info.fidelity_level = "-"} + if (typeof metadata.performance_info.run_time == "undefined"){metadata.performance_info.run_time = ""} + if (typeof metadata.performance_info.verification == "undefined"){metadata.performance_info.verification = ""} + } + //aigner: Initialize sub component "execution_info" + //This is somewhat more complicated, since it can be either a "local_component" or a "remote_component" + var local_component_info = [[[],[]]] + local_component_info[0][1] = { + command: "", + description: "", + hardware_requirements: "", + software_requirements: "", + integration_platform: ""} + var remote_component_info = { + data_exchange_settings: {folder:"", urlsite:""}, + job_settings: { + job_name:"", + notification_message:"", + remote_engineer:{contact_u_i_d:""}, + single_or_multi_execution:"" + } + } + if (typeof metadata.execution_info == "undefined" + || metadata.execution_info == null) + { + metadata.execution_info = {} + } + //aigner: Set type of component to "none" initially + metadata.execution_info.component_type = "none"; + if (typeof metadata.execution_info.remote_component_info == "undefined") + { + metadata.execution_info.remote_component_info = remote_component_info + } + else + { + metadata.execution_info.component_type = "remote"; + } + if (typeof metadata.execution_info.local_component_info == "undefined") + { + metadata.execution_info.local_component_info = local_component_info + } + else + { + metadata.execution_info.component_type = "local"; + } + //aigner: Initialize sub component "licensing" + if (typeof metadata.general_info.licensing == "undefined" + || metadata.general_info.licensing == null) + { + metadata.general_info.licensing = {}; + if (typeof metadata.general_info.licensing.license_type == "undefined"){metadata.general_info.licensing.license_type = ""} + if (typeof metadata.general_info.licensing.license_specification == "undefined"){metadata.general_info.licensing.license_specification = ""} + if (typeof metadata.general_info.licensing.license_info == "undefined"){metadata.general_info.licensing.license_info = ""} + } + //aigner: Initialize sub component "sources" + if (typeof metadata.general_info.sources == "undefined" + || metadata.general_info.sources == null) + { + metadata.general_info.sources = {}; + if (typeof metadata.general_info.sources.repository_link == "undefined"){metadata.general_info.sources.repository_link = ""} + if (typeof metadata.general_info.sources.download_link == "undefined"){metadata.general_info.sources.download_link = ""} + if (typeof metadata.general_info.sources.references == "undefined"){metadata.general_info.sources.references = ""} + } + + //aigner. Now make the previously initialized infos visible in the html page with the help of a bootbox pop-up + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; + + //aigner: Visualize sub component "general_info" + form_group = form.append("div").attr("class","form-group") + form_group.append("label").text("General information") + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Description") + var description = form_group.append("textarea") + .attr("id","description") + .attr("class","form-control") + .attr("name","description") + .attr("placeholder","Add a description for the DC here") + description.text(metadata.general_info.description) + <!-- form_group = form.append("div").attr("class","form-group") --> + <!-- form_group.append("text").text("Mode") --> + <!-- var mode = form_group.append("input") --> + <!-- .attr("id","mode") --> + <!-- .attr("class","form-control") --> + <!-- .attr("name","mode") --> + <!-- .attr("placeholder","Mode (e.g. main)") --> + <!-- if (typeof metadata.general_info != "undefined" --> + <!-- && metadata.general_info !=null --> + <!-- && typeof metadata.general_info.mode!="undefined") --> + <!-- { --> + <!-- mode.attr("value",metadata.general_info.mode) --> + <!-- } --> + <!-- form_group = form.append("div").attr("class","form-group") --> + <!-- form_group.append("text").text("Version") --> + <!-- var version = form_group.append("input") --> + <!-- .attr("id","version") --> + <!-- .attr("class","form-control") --> + <!-- .attr("name","version") --> + <!-- .attr("placeholder","Version (e.g. 1.0)") --> + <!-- if (typeof metadata.general_info != "undefined" --> + <!-- && metadata.general_info !=null --> + <!-- && typeof metadata.general_info.version!="undefined") --> + <!-- { --> + <!-- version.attr("value",metadata.general_info.version) --> + <!-- } --> + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Status") + var input = form_group.append("select").attr("id","status").style("margin-left","5px") + var status = input.append("option") + status.attr("type","select").attr("value","-").text("Please select...") + status = input.append("option") + status.attr("type","select").attr("value","Available").text("Available") + if(metadata.general_info.status=="Available"){status.attr("selected","true")} + status = input.append("option") + status.attr("type","select").attr("value","N/A").text("N/A") + if(metadata.general_info.status=="N/A"){status.attr("selected","true")} + var contacts = [] + if (theCurrentGraph.organization.contacts){contacts=theCurrentGraph.organization.contacts}; + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Owner") + input = form_group.append("select").attr("id","owner_uid").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...") + contacts.forEach(function(contact){ + var owner = input.append("option") + owner.attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") + if (contact.attrib.uID==metadata.general_info.owner.contactUID){owner.attr("selected","true")} + }) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Creator") + input = form_group.append("select").attr("id","creator_uid").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...") + contacts.forEach(function(contact){ + var creator = input.append("option") + creator.attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") + if (contact.attrib.uID==metadata.general_info.creator.contactUID){creator.attr("selected","true")} + }) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Operator") + input = form_group.append("select").attr("id","operator_uid").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...") + contacts.forEach(function(contact){ + var operator = input.append("option") + operator.attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") + if (contact.attrib.uID==metadata.general_info.operator.contactUID){operator.attr("selected","true")} + }) + + //aigner: Visualize sub component "performance_info" + form_group = form.append("div").attr("class","form-group").style("margin-top","40px") + form_group.append("label").text("Performance information") + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Precision") + input = form_group.append("input") + .attr("id","precision") + .attr("class","form-control") + .attr("name","precision") + .attr("placeholder","Precision (range 0 - 1)") + .attr("value",metadata.performance_info.precision) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Fidelity level") + input = form_group.append("select").attr("id","fidelity_level").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...").attr("selected","true") + for (var count=0; count <= 3; count ++) + { + var fidelity = input.append("option") + fidelity.attr("type","select").attr("value",count).text(String(count)) + if (count==metadata.performance_info.fidelity_level){fidelity.attr("selected","true")} + } + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Run time") + input = form_group.append("input") + .attr("id","run_time") + .attr("class","form-control") + .attr("name","run_time") + .attr("placeholder","Run time in sec") + .attr("value",metadata.performance_info.run_time) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Verification") + input = form_group.append("input") + .attr("id","verification") + .attr("class","form-control") + .attr("name","verification") + .attr("placeholder","Verification (optional)") + .attr("value",metadata.performance_info.verification) + + //Information on tool licensing + form_group = form.append("div").attr("class","form-group").style("margin-top","40px") + form_group.append("label").text("License information (optional)") + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("License type") + input = form_group.append("input") + .attr("id","license_type") + .attr("class","form-control") + .attr("name","license_type") + .attr("placeholder","License type (e.g. open-source, commercial)") + .attr("value",metadata.general_info.licensing.license_type) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("License specification") + input = form_group.append("input") + .attr("id","license_specification") + .attr("class","form-control") + .attr("name","license_specification") + .attr("placeholder","License specification (e.g. Apache License 2.0)") + .attr("value",metadata.general_info.licensing.license_specification) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("License information") + input = form_group.append("input") + .attr("id","license_info") + .attr("class","form-control") + .attr("name","license_info") + .attr("placeholder","License information (e.g. https://www.apache.org/licenses/LICENSE-2.0)") + .attr("value",metadata.general_info.licensing.license_info) + + //Information on tool sources + form_group = form.append("div").attr("class","form-group").style("margin-top","40px") + form_group.append("label").text("Source information (optional)") + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Repository link") + input = form_group.append("input") + .attr("id","repository_link") + .attr("class","form-control") + .attr("name","repository_link") + .attr("placeholder","Repository link") + .attr("value",metadata.general_info.sources.repository_link) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Download link") + input = form_group.append("input") + .attr("id","download_link") + .attr("class","form-control") + .attr("name","download_link") + .attr("placeholder","Download link") + .attr("value",metadata.general_info.sources.download_link) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("References") + input = form_group.append("input") + .attr("id","references") + .attr("class","form-control") + .attr("name","references") + .attr("placeholder","References") + .attr("value",metadata.general_info.sources.references) + + //aigner: Visualize sub component "execution_info" + //Again, this is more complicated... + form_group = form.append("div").attr("class","form-group").style("margin-top","40px") + form_group.append("label").text("Execution information") + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Execution type") + input = form_group.append("select") + .attr("id","execution_type") + .attr("class","execution_type") + .style("margin-left","5px") + var option = input.append("option").attr("value","-").text("Please select...").attr("selected","true") + var option_loc = input.append("option").attr("value","local_component").text("Local component") + var option_rem = input.append("option").attr("value","remote_component").text("Remote component") + if(metadata.execution_info.component_type=="local"){option_loc.attr("selected","true")} + else if(metadata.execution_info.component_type=="remote"){option_rem.attr("selected","true")} + + //Use a jquery function to toggle between local_component, remote_component, and none + //depending on the user's dropdown selection of the "execution_type" element + $(function() { + var form = d3.selectAll(".form"); + + //Information on remote component + var local_component_info = metadata.execution_info.local_component_info[metadata.execution_info.local_component_info.length-1][1]; + form_group = form.append("div").attr("class","form-group_lc") + form_group.append("text").text("Operating System") + input = form_group.append("select").attr("id","operating_system").style("margin-left","5px") + var input_list = [{text:"Windows",value:"windows"}, + {text:"Linux",value:"linux"}, + {text:"Mac OS",value:"mac"}, + {text:"Other",value:"other"}]; + input.append("option").attr("type","select").attr("value","-").text("Please select...") + input_list.forEach(function(theInput){ + var operatingSystem = input.append("option") + operatingSystem.attr("type","select").attr("value",theInput.value).text(theInput.text) + if (theInput.value==local_component_info.operating_system) + { + operatingSystem.attr("selected","true") + } + }) + form_group = form.append("div").attr("class","form-group_lc") + form_group.append("text").text("Integration platform") + input = form_group.append("input") + .attr("id","integration_platform") + .attr("class","form-control") + .attr("name","integration_platform") + .attr("placeholder","Integration platform (e.g. RCE, Optimus)") + .attr("value",local_component_info.integration_platform) + form_group = form.append("div").attr("class","form-group_lc") + form_group.append("text").text("Execution command") + input = form_group.append("textarea") + .attr("id","command") + .attr("class","form-control") + .attr("cols","40") + .attr("rows","5") + .attr("name","command") + .attr("placeholder","Execution command") + .text(local_component_info.command) + form_group = form.append("div").attr("class","form-group_lc") + form_group.append("text").text("Details") + input = form_group.append("textarea") + .attr("id","description_cmd") + .attr("class","form-control") + .attr("cols","40") + .attr("rows","1") + .attr("name","description_cmd") + .attr("placeholder","Details on the exectuion command (optional)") + .text(local_component_info.description) + form_group = form.append("div").attr("class","form-group_lc") + form_group.append("text").text("Software requirements") + input = form_group.append("textarea") + .attr("id","software_requirements") + .attr("class","form-control") + .attr("cols","40") + .attr("rows","1") + .attr("name","software_requirements") + .attr("placeholder","Software requirements") + .text(local_component_info.software_requirements) + form_group = form.append("div").attr("class","form-group_lc") + form_group.append("text").text("Hardware requirements") + input = form_group.append("textarea") + .attr("id","hardware_requirements") + .attr("class","form-control") + .attr("cols","40") + .attr("rows","1") + .attr("name","hardware_requirements") + .attr("placeholder","Hardware requirements") + .text(local_component_info.hardware_requirements) + + //Information on remote component + var remote_component_info = metadata.execution_info.remote_component_info; + form_group = form.append("div").attr("class","form-group_rc").style("margin-top","40px") + form_group.append("label").text("Remote component information") + form_group = form.append("div").attr("class","form-group_rc") + form_group.append("text").text("Remote engineer") + input = form_group.append("select").attr("id","remote_engineer_uid").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...") + contacts.forEach(function(contact){ + var owner = input.append("option") + owner.attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") + if (contact.attrib.uID==remote_component_info.job_settings.remote_engineer.contact_u_i_d){owner.attr("selected","true")} + }) + form_group = form.append("div").attr("class","form-group_rc") + form_group.append("text").text("URL site") + input = form_group.append("input") + .attr("id","urlsite") + .attr("class","form-control") + .attr("name","urlsite") + .attr("placeholder","URL site") + .attr("value",remote_component_info.data_exchange_settings.urlsite) + form_group = form.append("div").attr("class","form-group_rc") + form_group.append("text").text("Folder") + input = form_group.append("input") + .attr("id","folder") + .attr("class","form-control") + .attr("name","folder") + .attr("placeholder","Folder") + .attr("value",remote_component_info.data_exchange_settings.folder) + form_group = form.append("div").attr("class","form-group_rc") + form_group.append("text").text("Job name") + input = form_group.append("input") + .attr("id","job_name") + .attr("class","form-control") + .attr("name","job_name") + .attr("placeholder","Job name") + .attr("value",remote_component_info.job_settings.job_name) + form_group = form.append("div").attr("class","form-group_rc") + form_group.append("text").text("Single or multi execution") + input = form_group.append("select").attr("id","single_or_multi_execution").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...").attr("selected","true") + var single_type = input.append("option").attr("type","select").attr("value","single").text("Single") + var multi_type = input.append("option").attr("type","select").attr("value","multi").text("Multi") + if (metadata.execution_info.remote_component_info.job_settings.single_or_multi_execution=="single") + { + single_type.attr("selected","true") + } + else if (metadata.execution_info.remote_component_info.job_settings.single_or_multi_execution=="multi") + { + multi_type.attr("selected","true") + } + form_group = form.append("div").attr("class","form-group_rc") + form_group.append("text").text("Notification message") + input = form_group.append("textarea") + .attr("id","notification_message") + .attr("class","form-control") + .attr("cols","40") + .attr("rows","1") + .attr("name","notification_message") + .attr("placeholder","Notification message") + .text(remote_component_info.job_settings.notification_message) + + //Which of the above visualized block should actually be shown? + //--> The one that the component actually is, namely either a "local_component" or a "remote" + d3.selectAll(".form-group_rc").attr("style","display:none") + d3.selectAll(".form-group_lc").attr("style","display:none") + if (metadata.execution_info.component_type=="local"){d3.selectAll(".form-group_lc").attr("style","display:block")} + else if (metadata.execution_info.component_type=="remote"){d3.selectAll(".form-group_rc").attr("style","display:block")} + + //aigner: Function switches between remote and local component depending on user input + $('.execution_type').on('change', function(e) + { + var execution_type = $('form #execution_type').val(); + if (execution_type == "local_component") + { + metadata.execution_info.component_type = "local"; + d3.selectAll(".form-group_rc").attr("style","display:none") + d3.selectAll(".form-group_lc").attr("style","display:block") + } + else if (execution_type == "remote_component") + { + metadata.execution_info.component_type = "remote"; + d3.selectAll(".form-group_rc").attr("style","display:block") + d3.selectAll(".form-group_lc").attr("style","display:none") + } + else + { + metadata.execution_info.component_type = "none"; + d3.selectAll(".form-group_rc").attr("style","display:none") + d3.selectAll(".form-group_lc").attr("style","display:none") + } + }); + }); + + + + + var modal = bootbox.dialog({ + message: $(".form-content").html(), + title: "Competence Metadata: " + aNode.name, + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default", + callback: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary", + callback: function() { + + var metadata_to_kadmos = { + general_info: { + description: $('form #description').val(), + mode: $('form #mode').val(), + version: $('form #version').val(), + status: $('form #status').val(), + owner_uid: $('form #owner_uid').val(), + creator_uid: $('form #creator_uid').val(), + operator_uid: $('form #operator_uid').val() + }, + performance_info: { + precision: $('form #precision').val(), + fidelity_level: $('form #fidelity_level').val(), + run_time: $('form #run_time').val(), + verification: $('form #verification').val() + }, + execution_details: { + local_component:false, + operating_system:"", + integration_platform: "", + command: "", + description: "", + software_requirements: "", + hardware_requirements: "" + }, + remote_component_info: { + remote_component: false, + remote_engineer_uid: "", + single_or_multi_execution: "", + job_name: "", + urlsite: "", + folder: "" + }, + licensing: { + license_type: $('form #license_type').val(), + license_specification: $('form #license_specification').val(), + license_info: $('form #license_info').val() + }, + sources: { + repository_link: $('form #repository_link').val(), + download_link: $('form #download_link').val(), + references: $('form #references').val() + } + } + + if (metadata.execution_info.component_type=="local") + { + metadata_to_kadmos.execution_details = { + local_component: true, + operating_system: $('form #operating_system').val(), + integration_platform: $('form #integration_platform').val(), + command: $('form #command').val(), + description: $('form #description_cmd').val(), + software_requirements: $('form #software_requirements').val(), + hardware_requirements: $('form #hardware_requirements').val() + } + } + else if (metadata.execution_info.component_type=="remote") + { + metadata_to_kadmos.remote_component_info = { + remote_component: true, + remote_engineer_uid: $('form #remote_engineer_uid').val(), + single_or_multi_execution: $('form #single_or_multi_execution').val(), + job_name: $('form #job_name').val(), + urlsite: $('form #urlsite').val(), + folder: $('form #folder').val(), + notification_message: $('form #notification_message').val() + } + } + + var metadata_str = JSON.stringify(metadata_to_kadmos) + var bootboxContent = {title: "Get graph elements", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax( + { + type: 'POST', + url: '/kadmos_add_DC_metadata', + data: {'graphID':graphID, 'currentOrder':nodeOrder, 'nodeName':aNode.uID, 'metadata_str':metadata_str, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = theData; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + } + ], + onEscape: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }); + } + + + var addCBButton = revertDiv.append("button") + .attr("class","btn btn-success") + .attr("data-toggle","tooltip") + .attr("data-placement","top") + .attr("title","Add competence block") + .style("margin-left","10px") + .style("margin-bottom","10px") + addCBButton.append("span") + .attr("class","glyphicon glyphicon-plus") + .attr("aria-hidden","true") + addCBButton.on("mousedown", function() + { + var bootboxContent = {title: "Add competence block", message: '<p>Please be patient...</p>'}; + + bootbox.hideAll(); + bootbox.prompt({ + title: "<b>Add competence block</b>" + +"<p>Which type of competence block do you want to add?</p>", + inputType: 'select', + inputOptions: [ + { + text: 'Please choose...', + value: '', + }, + { + text: 'Design competence', + value: 'dc', + }, + { + text: 'Mathematical function', + value: 'mf', + } + ], + callback: function (result) { + if (result == 'mf') + { + addMathematicalFunction(); + } + else if(result == "dc") + { + addDesignCompetence(data, currentGraph); + } + else; + } + }); + }) + + //aigner: View and edit contact information + //##################################################################################################### + function contact_info(contact_uid, theContacts) + { + if (contact_uid=="") + { + var empty_contact = {name:"",function:"",country:"",company:"",telephone:"",address:"",department:"",email:"",attrib:{uID:""}} + theContacts.push(empty_contact) + } + theContacts.forEach(function(contact, index, contacts) + { + if (contact.attrib.uID == contact_uid) + { + if (typeof currentGraph.organization.organigram=="undefined") + { + currentGraph.organization.organigram = {architects: [], integrators: [], toolSpecialists: []}; + } + if (typeof currentGraph.organization.contacts=="undefined") + { + currentGraph.organization.contacts = []; + } + + //Show contact info + //############################################################ + bootbox.hideAll(); + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; + + form_group = form.append("div").attr("class","form-group") + function form_control(text,value) + { + form_group.append("label").text(text) + input = form_group.append("input") + .attr("id","contact_"+text) + .attr("class","form-control") + .attr("name","contact_"+text) + .attr("placeholder","...") + .attr("value",value) + } + form_control("Name",contact.name) + form_control("uID",contact.attrib.uID) + form_control("Function",contact.function) + form_control("Country",contact.country) + form_control("Company",contact.company) + form_control("Telephone",contact.telephone) + form_control("Address",contact.address) + form_control("Department",contact.department) + form_control("E-Mail",contact.email) + + form_group.append("label").text("Roles") + var input = form_group.append("div").attr("id","contact_roles") + var label1 = input.append("div").append("text").style("margin-top","5pt").attr("for","architect").text("Architect ") + label1.append("input").attr("type","checkbox").attr("id","architect") + var label2 = input.append("div").append("text").style("margin-top","5pt").attr("for","integrator").text("Integrator ") + label2.append("input").attr("type","checkbox").attr("id","integrator") + var label3 = input.append("div").append("text").style("margin-top","5pt").attr("for","toolSpecialist").text("Tool Specialist ") + label3.append("input").attr("type","checkbox").attr("id","toolSpecialist") + currentGraph.organization.organigram.architects.forEach(function(architect) + { + if (contact.attrib.uID==architect.contactUID) + { + $('#architect').attr('checked', true); + } + }); + currentGraph.organization.organigram.integrators.forEach(function(integrator) + { + if (contact.attrib.uID==integrator.contactUID) + { + $('#integrator').attr('checked', true); + } + }); + currentGraph.organization.organigram.toolSpecialists.forEach(function(toolSpecialist) + { + if (contact.attrib.uID==toolSpecialist.contactUID) + { + $('#toolSpecialist').attr('checked', true); + } + }); + //############################################################ + + //Function to save contact information in global organization object + //############################################################ + function update_contact_info() + { + //Save contact information in global contacts object + currentGraph.organization.contacts = theContacts + //Send changes to kadmos and update the graph + var bootboxContent = {title: "Update contact information", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + data: {'graphID': graphID, 'currentOrder': nodeOrder, 'organization': JSON.stringify(currentGraph.organization), 'sessionId': sessionId}, + url: '/kadmos_edit_contact_infos', + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + //############################################################ + + + //############################################################ + var modal = bootbox.dialog({ + message: $(".form-content").html(), + title: "Contact information", + size: "large", + buttons: [ + { + label: "Delete contact", + className: "btn btn-danger pull-left", + callback: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to delete the contact?", function(sure) + { + if (sure) + { + //remove contact from roles in organigram + currentGraph.organization.organigram.architects.forEach(function(architect, index, architects) + { + if (contact.attrib.uID==architect.contactUID){architects.splice(index,1)} + }); + currentGraph.organization.organigram.integrators.forEach(function(integrator, index, integrators) + { + if (contact.attrib.uID==integrator.contactUID){integrators.splice(index,1)} + }); + currentGraph.organization.organigram.toolSpecialists.forEach(function(toolSpecialist, index, toolSpecialists) + { + if (contact.attrib.uID==toolSpecialist.contactUID){toolSpecialists.splice(index,1)} + }); + + //Delete contact from organization + contacts.splice(index,1); + + //Call function update_contact_info + update_contact_info(); + } + }) + } + }, + { + label: "Apply", + className: "btn btn-primary pull-right", + callback: function() { + contact.name = $('form #contact_Name').val() + contact.attrib.uID = $('form #contact_uID').val() + contact.function = $('form #contact_Function').val() + contact.country = $('form #contact_Country').val() + contact.company = $('form #contact_Company').val() + contact.telephone = $('form #contact_Telephone').val() + contact.address = $('form #contact_Address').val() + contact.department = $('form #contact_Department').val() + contact.email = $('form #contact_E-Mail').val() + + + //aigner: toggle roles of the contact + //############################################################ + var roles = { + architect: document.getElementById("architect").checked, + integrator: document.getElementById("integrator").checked, + toolSpecialist: document.getElementById("toolSpecialist").checked + } + var contact_is_arc = false; + var contact_is_int = false; + var contact_is_ts = false; + currentGraph.organization.organigram.architects.forEach(function(architect, index, architects) + { + if (contact.attrib.uID==architect.contactUID) + { + contact_is_arc = true; + if (!roles.architect){ + architects.splice(index,1) + } + + } + }); + currentGraph.organization.organigram.integrators.forEach(function(integrator, index, integrators) + { + if (contact.attrib.uID==integrator.contactUID) + { + contact_is_int = true; + if (!roles.integrator){ + integrators.splice(index,1) + } + } + }); + currentGraph.organization.organigram.toolSpecialists.forEach(function(toolSpecialist, index, toolSpecialists) + { + if (contact.attrib.uID==toolSpecialist.contactUID) + { + contact_is_ts = true; + if (!roles.toolSpecialist){ + toolSpecialists.splice(index,1) + } + } + }); + if (!contact_is_arc && roles.architect){currentGraph.organization.organigram.architects.push({contactUID: contact.attrib.uID})} + if (!contact_is_int && roles.integrator){currentGraph.organization.organigram.integrators.push({contactUID: contact.attrib.uID})} + if (!contact_is_ts && roles.toolSpecialist){currentGraph.organization.organigram.toolSpecialists.push({contactUID: contact.attrib.uID})} + //############################################################ + + //Call function update_contact_info + update_contact_info(); + + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }, + { + label: "Cancel", + className: "btn btn-default pull-right", + callback: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + } + ], + onEscape: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }); + //############################################################ + } + }) + } + + var orgaButton = revertDiv.append("button") + .attr("class","btn btn-info") + .attr("data-toggle","tooltip") + .attr("data-placement","top") + .attr("title","Contact options") + .style("margin-left","10px") + .style("margin-bottom","10px") + orgaButton.append("span") + .attr("class","glyphicon glyphicon-user") + .attr("aria-hidden","true") + orgaButton.on("mousedown", function() + { + bootbox.hideAll(); + + var contacts = [] + if (currentGraph.organization.contacts){contacts=JSON.parse(JSON.stringify(currentGraph.organization.contacts))}; + var options = [{text:"Select...",value:"select"},{text:"Add new contact",value:""}]; + contacts.forEach(function(contact){ + options.push({text:contact.name + " (" + contact.company + ")", value:contact.attrib.uID}); + }) + + bootbox.hideAll(); + bootbox.prompt({ + title: "<b>Contact information</b>" + +"<p>Which contact do you want to show or edit?<br>" + +"You can also add a new contact. Just select 'Add new contact'</p>", + inputType: 'select', + value: 'select', + inputOptions: options, + callback: function (result) { + if (result==null || result=="select"){} + else + { + contact_info(result,contacts); + } + } + }); + + + }) + //##################################################################################################### + + + //#################################################################################################################### + + + + + var graph_menu = " <nav>" + +" <ul>" + +" <li><a href='#'>Graph inspection <span>▾</span></a>" + +" <ul>" + +" <li class='search_element'><a href='#'>Find graph elements</a></li>" + +" <li><a href='#'>Inspect data model<span>▸</span></a>" + +" <ul class='data_model_view'>" + +" <li class='tree_view'><a href='#'>Tree view<span>▸</span></a></li>" + +" <li class='list_view'><a href='#'>List view<span>▸</span></a></li>" + +" </ul>" + +" </li>" + +" <li><a href='#'>Check<span>▸</span></a>" + +" <ul class='check_graph'>" + +" <li class='l1_check'><a href='#'>L1 check: graph</a></li>" + +" <li class='l2_check'><a href='#'>L2 check: problem formulation</a></li>" + +" <li class='l3_check'><a href='#'>L3 check: graph & problem formulation</a></li>" + +" </ul>" + +" </li>" + +" </ul>" + +" </li>" + +" <li><a href='#'>Graph manipulation <span>▾</span></a>" + +" <ul>" + +" <li><a href='#'>FPG manipulation <span>▸</span></a>" + +" <ul class='fpg_manipulations'>" + +" <li class='start_MDO_problem'><a href='#'>Copy graph for MDAO problem definition</a></li>" + +" <li class='get_function_order'><a href='#'>Get possible function order</a></li>" + +" <li class='make_variables_valid'><a href='#'>Make all variables valid</a></li>" + +" <li><a href='#'>Remove...<span>▸</span></a>" + +" <ul class='remove'>" + +" <li class='remove_dcs'><a href='#'>design competences</a></li>" + +" <li class='remove_collision_parameters'><a href='#'>collision parameters</a></li>" + +" <li class='remove_unused_outputs'><a href='#'>unused outputs</a></li>" + +" </ul>" + +" </li>" + +" <li><a href='#'>Merge...<span>▸</span></a>" + +" <ul class='merge'>" + +" <li class='merge_seq_competences'><a href='#'>sequential competences</a></li>" + +" <li class='merge_par_competences'><a href='#'>parallel competences</a></li>" + +" <li class='merge_funcMod_competences'><a href='#'>function modes competences</a></li>" + +" </ul>" + +" </li>" + +" <li><a href='#'>Assign...<span>▸</span></a>" + +" <ul class='assign'>" + +" <li class='assign_probFunc_roles'><a href='#'>problem function roles</a></li>" + +" <li class='assign_parameter_roles'><a href='#'>parameter roles</a></li>" + +" </ul>" + +" </li>" + +" </ul>" + +" </li>" + +" <li><a href='#'>MDPG manipulation <span>▸</span></a>" + +" <ul class='mdpg_manipulations'>" + +" <li class='start_MDO_architecture'><a href='#'>Copy graph for MDAO architecture definition</a></li>" + +" <li><a href='#'>Set...<span>▸</span></a>" + +" <ul class='set'>" + +" <li class='set_MDAO_architecture'><a href='#'>MDAO architecture</a></li>" + +" <li class='set_coupling_decomposition'><a href='#'>Coupling decomposition</a></li>" + +" <li class='set_DOE_method'><a href='#'>DOE method</a></li>" + +" </ul>" + +" </li>" + +" <li class='impose_MDAO_architecture'><a href='#'>Impose MDAO architecture</a></li>" + +" </ul>" + +" </li>" + +" <li class='upload_script'><a href='#'>Upload custom script</a></li>" + +" </ul>" + +" </li>" + +" </ul>" + +" </nav>" + + d3.select(".xdsmDiv").append('div').attr("class","graph_menu").style("margin-left","20px").html(graph_menu); + + + + + var inspectionsDiv = d3.select(".xdsmDiv").append("div").attr("class","dataModelDiv").style("top","-10px") + //aigner: Search for graph elements + //#################################################################################################################### + //CATEGORIES + var categories = [ + {text:"all",value:"all"}, + {text:"variable",value:"variable"}, + {text:"function",value:"function"}] + + + var subCategories = [ + {text:"all",value:"all"}, + //VARIABLES: + {text:"hole",value:"hole"}, + {text:"supplied input ",value:"supplied input "}, + {text:"supplied shared input",value:"supplied shared input"}, + {text:"output",value:"output"}, + {text:"collision",value:"collision"}, + {text:"coupling",value:"coupling"}, + {text:"pure circular coupling",value:"pure circular coupling"}, + {text:"shared coupling",value:"shared coupling"}, + {text:"shared circular coupling",value:"shared circular coupling"}, + {text:"collided coupling",value:"collided coupling"}, + {text:"collided circular coupling",value:"collided circular coupling"}, + {text:"collided shared coupling",value:"collided shared coupling"}, + {text:"collided shared circular coupling",value:"collided shared circular coupling"}, + {text:"all inputs",value:"all inputs"}, + {text:"all outputs",value:"all outputs"}, + {text:"all couplings",value:"all couplings"}, + {text:"all circular variables",value:"all circular variables"}, + {text:"all collisions",value:"all collisions"}, + {text:"all splittable variables",value:"all splittable variables"}, + {text:"all problematic variables",value:"all problematic variables"}, + //FUNCTIONS: + {text:"hole",value:"hole"}, + {text:"inputless",value:"inputless"}, + {text:"outputless",value:"outputless"}, + {text:"complete",value:"complete"}, + {text:"all problematic functions",value:"all problematic functions"}] + + var operators = [ + {text:"Operator (please select)",value:"-"}, + {text:"<",value:"<"}, + {text:"<=",value:"<="}, + {text:"==",value:"=="}, + {text:">=",value:">="}, + {text:">",value:">"}] + + var search_element_dom = d3.select(".search_element") + search_element_dom.on("mousedown", function() + { + bootbox.hideAll(); + + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + + var form_group1 = form.append("div").attr("class","form-group") + form_group1.append("label").attr("for","category").text("Category") + var input1 = form_group1.append("select").attr("id","category") + categories.forEach(function(category) + { + input1.append("option").attr("type","select").attr("value",category.value).text(category.text) + } + ) + + var form_group2 = form.append("div").attr("class","form-group") + form_group2.append("label").attr("for","subcategory").text("Sub-category") + var input2 = form_group2.append("select").attr("id","sub-category") + subCategories.forEach(function(subcategory) + { + input2.append("option").attr("type","select").attr("value",subcategory.value).text(subcategory.text) + } + ) + + + var maxNumOfAttributes = 3; + + for (var i=0; i<maxNumOfAttributes; i++) + { + var form_group3 = form.append("div").attr("class","form-group") + var input = form_group3.append("div").attr("class","attribute") + if (i==0){input.append("label").attr("for","attribute"+String(i)).text("Attribute conditions (max. "+String(maxNumOfAttributes)+")")} + input.append("input") + .attr("id","attribute"+String(i)) + .attr("class","form-control") + .attr("name","attribute") + .attr("placeholder","attribute "+String(i+1)) + input = form_group3.append("select").attr("id","operator"+String(i)) + operators.forEach(function(operator) + { + input.append("option").attr("type","select").attr("value",operator.value).text(operator.text) + }) + + input = form_group3.append("div").attr("class","attribute") + input.append("input") + .attr("id","value"+String(i)) + .attr("class","form-control") + .attr("name","value") + .attr("placeholder","value "+String(i+1)) + } + + var form_group4 = form.append("div").attr("class","form-group") + for (var i=0; i<maxNumOfAttributes; i++) + { + var input = form_group4.append("div").attr("class","attribute") + if (i==0){input.append("label").attr("for","attribute"+String(i)).text("Included attributes (max. "+String(maxNumOfAttributes)+")")} + input.append("input") + .attr("id","attr_include"+String(i)) + .attr("class","form-control") + .attr("name","attr_include") + .attr("placeholder","attribute "+String(i+1)) + input.append("input") + .attr("id","attr_include_val"+String(i)) + .attr("class","form-control") + .attr("name","attr_include_val "+String(i+1)) + .attr("placeholder","value "+String(i+1)) + } + + var form_group5 = form.append("div").attr("class","form-group") + for (var i=0; i<maxNumOfAttributes; i++) + { + var input = form_group5.append("div").attr("class","attribute") + if (i==0){input.append("label").attr("for","attribute"+String(i)).text("Excluded attributes (max. "+String(maxNumOfAttributes)+")")} + input.append("input") + .attr("id","attr_exclude"+String(i)) + .attr("class","form-control") + .attr("name","attr_exclude") + .attr("placeholder","attribute "+String(i+1)) + input.append("input") + .attr("id","attr_exclude_val"+String(i)) + .attr("class","form-control") + .attr("name","attr_exclude_val") + .attr("placeholder","value "+String(i+1)) + } + + var form_group8 = form.append("div").attr("class","form-group") + form_group8.append("label").attr("for","xPath_include").text("Included xPaths") + var input8 = form_group8.append("input") + .attr("id","xPath_include") + .attr("class","form-control") + .attr("name","xPath_include") + .attr("placeholder","/schema/parent/child1, /schema/parent/child2, ...") + + var form_group9 = form.append("div").attr("class","form-group") + form_group9.append("label").attr("for","xPath_exclude").text("Excluded xPaths") + var input9 = form_group9.append("input") + .attr("id","xPath_exclude") + .attr("class","form-control") + .attr("name","xPath_exclude") + .attr("placeholder","/schema/parent/child1, /schema/parent/child2, ...") + + + + + var modal = bootbox.dialog({ + message: $(".form-content").html(), + title: "Search for graph elements.", + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default pull-left", + callback: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary pull-left", + callback: function() { + + var category = $('form #category').val() + var sub_category = $('form #sub-category').val() + var attr_cond = [] + var attr_include = [] + var attr_exclude = [] + for (var i=0; i<maxNumOfAttributes; i++) + { + if ($('form #attribute'+String(i)).val()!=""&&$('form #operator'+String(i)).val()!=""&&$('form #value'+String(i)).val()!="") + {attr_cond.push([$('form #attribute'+String(i)).val(),$('form #operator'+String(i)).val(),$('form #value'+String(i)).val()])} + if ($('form #attr_include'+String(i)).val()!=""&&$('form #attr_include_val'+String(i)).val()!="") + {attr_include.push([$('form #attr_include'+String(i)).val(),$('form #attr_include_val'+String(i)).val()])} + if ($('form #attr_exclude'+String(i)).val()!=""&&$('form #attr_exclude_val'+String(i)).val()!="") + {attr_exclude.push([$('form #attr_exclude'+String(i)).val(),$('form #attr_exclude_val'+String(i)).val()])} + } + var xPath_include = $('form #xPath_include').val() + var xPath_exclude = $('form #xPath_exclude').val() + + var bootboxContent = {title: "Get graph elements", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax( + { + type: 'POST', + url: '/kadmos_find_all_nodes', + data: {'graphID':graphID, + 'category':category, + 'sub_category':sub_category, + 'attr_cond':JSON.stringify(attr_cond), + 'attr_include':JSON.stringify(attr_include), + 'attr_exclude':JSON.stringify(attr_exclude), + 'xPath_include':xPath_include, + 'xPath_exclude':xPath_exclude, + 'sessionId': sessionId,}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else if (result == "[]") + { + bootboxContent.title = "<b>Get graph elements</b>" + bootboxContent.message = "<b>No matching graph elements!</b>" + kadmosSuccessMessage(bootboxContent); + } + else + { + bootbox.hideAll(); + var treeData = (JSON.parse(JSON.stringify(currentGraph.variableSchemes[varCategories[0].description]))); + var firstEl = treeData[0].xPath.split("/")[1] + + var graphElements = JSON.parse(result) + + var title = "List view of graph elements." + +" category: \"" + category + "\"" + +", sub-category: \"" + sub_category + "\"" + var message = ""; + + var variables = []; + var functions = []; + + //get all potential functions first. these will be + var functions_all = []; + var alld3Nodes = d3.selectAll(".node") + alld3Nodes.each( + function(){ + functions_all.push(this.__data__) + } + ) + + if (result.includes("/"+firstEl)) + { + //There are variables in the result + + + //push back functions in list + functions_all.forEach(function(aFunction){ + if (graphElements.includes(aFunction.uID)){functions.push(aFunction);} + }) + + //push back variables in list + var pipeData = []; + graphElements.forEach(function(graphElement) + { + if (graphElement.includes("/"+firstEl)) + { + pipeData += ","+graphElement; + } + }) + variables = JSON.parse(JSON.stringify(treeData)) + prune_tree(pipeData,variables) + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + + //message with option: How does the user want to show the variables, as a list or as a tree view? + bootbox.prompt( + { + title: "The graph elements you requested contain variables. How do you want them displayed?", + inputType: 'checkbox', + inputOptions: [{text:" Show variables as tree view",value:"Tree View"},{text:" Show variables as list",value:"List"}], + callback: function (result) + { + if (result) + { + var message1 = "", message2 = ""; + var array + bootbox.hideAll(); + if(result.includes("Tree View")) + { + var headLine = "Tree Layout for category:\" " + category + "\", subcategory:\" " + sub_category + "\""; + var d3_body = d3.select("body"); + var lobiID = String(getRandomInt(0,1000)) + var divClassName = "treeDiv" + lobiID; + var treeLayoutdiv = d3_body.append("div").attr("class",divClassName+ " panel-default") + .style("left","200px") + .style("top","200px") + .style("position", "absolute") + treeLayoutdiv.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + $('.' + divClassName).lobiPanel({ + reload: false, + editTitle: false, + unpin: false, + minWidth: 200, + maxWidth: 100000, + minHeight: 200, + maxHeight: 100000, + }); + $('.'+divClassName).lobiPanel('unpin'); + var treeLayoutSVG = treeLayoutdiv.append("svg").attr("class","treeLayoutSVG") + var treeLayout = treeLayoutSVG.append("g").attr("class","treeLayout"); + maketreeLayout(array, treeLayout, treeLayoutSVG, treeLayoutdiv, divClassName, headLine, varCategories[0].description); + } + if (result.includes("List")) + { + showList(title,variables,nodeMenu); + } + + } + } + }) + } + else + { + //push back functions in list + functions_all.forEach(function(aFunction){ + if (graphElements.includes(aFunction.uID)){functions.push(aFunction);} + }) + } + showList(title,functions,toolMenu); + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + } + ], + onEscape: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }); + + + + }) + //#################################################################################################################### + + + + //aigner: Kadmos functions --> Check graph + //#################################################################################################################### + var l1_check_dom = d3.select(".l1_check") + l1_check_dom.on("mousedown", function() + { + var bootboxContent = {title: "L1 check: graph", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + data: {'graphID': graphID, 'sessionId': sessionId}, + url: '/kadmos_L1_check', + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + bootboxContent.message = result + kadmosSuccessMessage(bootboxContent); + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + }) + + var l2_check_dom = d3.select(".l2_check") + l2_check_dom.on("mousedown", function() + { + var bootboxContent = {title: "L2 check: problem formulation", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + data: {'graphID': graphID, 'sessionId': sessionId}, + url: '/kadmos_L2_check', + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + bootboxContent.message = result + kadmosSuccessMessage(bootboxContent); + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + }) + + var l3_check_dom = d3.select(".l3_check") + l3_check_dom.on("mousedown", function() + { + var bootboxContent = {title: "L3 check: graph & problem formulation", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + data: {'graphID': graphID, 'sessionId': sessionId}, + url: '/kadmos_L3_check', + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + bootboxContent.message = result + kadmosSuccessMessage(bootboxContent); + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + }) + + //#################################################################################################################### + + + //aigner: Kadmos functions --> Graph manipulation + //#################################################################################################################### + var start_MDO_problem_DOM = d3.select(".start_MDO_problem") + start_MDO_problem_DOM.on("mousedown", function() + { + bootbox.hideAll(); + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; + + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Name") + input = form_group.append("input") + .attr("id","graph_name") + .attr("class","form-control") + .attr("name","graph_name") + .attr("placeholder","Add a graph name here...") + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Description") + input = form_group.append("input") + .attr("id","graph_description") + .attr("class","form-control") + .attr("name","graph_description") + .attr("placeholder","Add a graph description here...") + + bootbox.dialog({ + message: $(".form-content").html(), + title: "<p>This will create an initial FPG for your MDO problem. After clicking this button, you can go through the \"<b>FPG manipulation</b>\" steps." + +"<p>Please type in a new name and description for the graph</p>", + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default pull-left", + callback: function() { + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary pull-left", + callback: function() { + + //get form data + var graph_name = $('form #graph_name').val(); + var graph_description = $('form #graph_description').val(); + + + var newGraphID = '01'; + data.graphs.forEach(function(graph) + { + id_int = parseInt(graph.id) + if (data.graphs.length < 100){newGraphID = "0" + String(id_int+1);} + else{newGraphID = String(id_int+1);} + }) + var bootboxContent = {title: "Copy graph for defining MDO problem", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_start_defining_MDO_problem', + data: {'graphID':graphID, 'currentOrder': nodeOrder, 'newGraphName':graph_name, 'newGraphDesc':graph_description, 'newGraphID':newGraphID, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = jQuery.extend(true, {}, data); + var graphData = JSON.parse(result); + + for (var i = 0; i < data.graphs.length; i++) + { + if (graphID == data.graphs[i].id) + { + + //Insert copied graph behind the original one + updatedData.graphs.splice(i+1, 0, graphData.graphs[0]) + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,newGraphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + d3.selectAll(".form-content").remove(); + } + } + ] + }); + }) + + + var remove_dcs_DOM = d3.select(".remove_dcs") + remove_dcs_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.prompt( + { + title: "Please select the design competences you would like to exclude.", + inputType: 'checkbox', + inputOptions: theInputOptions, + callback: function (nodeList) + { + if (nodeList) + { + var nodeStr = ''; + for (var i=0; i< nodeList.length; i++) + { + if (i==0){nodeStr += nodeList[i]} + else{nodeStr += ',' + nodeList[i]} + } + + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to do this?", function(sure) + { + if (sure) + { + var bootboxContent = {title: "Exclude design competences", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_exclude_DCs', + data: {'graphID':graphID, 'nodeList':nodeStr, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + } + } + }); + }) + + var merge_seq_competences_DOM = d3.select(".merge_seq_competences") + merge_seq_competences_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.prompt( + { + title: "Please select the sequential design competences you would like to merge.", + inputType: 'checkbox', + inputOptions: theInputOptions, + callback: function (nodeList) + { + if (nodeList) + { + var nodeStr = ''; + for (var i=0; i< nodeList.length; i++) + { + if (i==0){nodeStr += nodeList[i]} + else{nodeStr += ',' + nodeList[i]} + } + + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to do this", function(sure) + { + if (sure) + { + var bootboxContent = {title: "Merge sequential design competences", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_merge_seq_DCs', + data: {'graphID':graphID, 'nodeList':nodeStr, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + + } + } + }); + }) + + var merge_par_competences_DOM = d3.select(".merge_par_competences") + merge_par_competences_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.prompt( + { + title: "Please select the parallel design competences you would like to merge.", + inputType: 'checkbox', + inputOptions: theInputOptions, + callback: function (nodeList) + { + if (nodeList) + { + var nodeStr = ''; + for (var i=0; i< nodeList.length; i++) + { + if (i==0){nodeStr += nodeList[i]} + else{nodeStr += ',' + nodeList[i]} + } + + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to do this", function(sure) + { + if (sure) + { + var bootboxContent = {title: "Merge parallel design competences", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_merge_parallel_DCs', + data: {'graphID':graphID, 'nodeList':nodeStr, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + + } + } + }); + }) + + var merge_funcMod_competences_DOM = d3.select(".merge_funcMod_competences") + merge_funcMod_competences_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.prompt( + { + title: "Please select the design competences you would like to merge.", + inputType: 'checkbox', + inputOptions: theInputOptions, + callback: function (nodeList) + { + if (nodeList) + { + var nodeStr = ''; + for (var i=0; i< nodeList.length; i++) + { + if (i==0){nodeStr += nodeList[i]} + else{nodeStr += ',' + nodeList[i]} + } + + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to do this", function(sure) + { + if (sure) + { + var bootboxContent = {title: "Merge function mode design competences", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_merge_func_mod_DCs', + data: {'graphID':graphID, 'nodeList':nodeStr, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + + } + } + }); + }) + + var remove_collision_parameters_DOM = d3.select(".remove_collision_parameters") + remove_collision_parameters_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.prompt( + { + title: "Please select the design competences for which you would like to remove collisions.", + inputType: 'checkbox', + inputOptions: theInputOptions, + callback: function (nodeList) + { + if (nodeList) + { + var nodeStr = ''; + for (var i=0; i< nodeList.length; i++) + { + if (i==0){nodeStr += nodeList[i]} + else{nodeStr += ',' + nodeList[i]} + } + + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to do this", function(sure) + { + if (sure) + { + var bootboxContent = {title: "Remove collisions", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_remove_collision', + data: {'graphID':graphID, 'nodeList':nodeStr, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + + } + } + }); + }) + + var make_variables_valid_DOM = d3.select(".make_variables_valid") + make_variables_valid_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.confirm("<p>This will automatically remove all collisions from the graph by creating multiple variable instances.</p>" + +"<p>Are you sure you want to do this?</p>", function(sure) + { + if (sure) + { + var bootboxContent = {title: "Create FPG", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_make_all_variables_valid', + data: {'graphID':graphID, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }); + }) + + var assign_probFunc_roles_DOM = d3.select(".assign_probFunc_roles") + assign_probFunc_roles_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.confirm("Are you sure you want to do this?", function(sure) + { + if (sure) + { + var bootboxContent = {title: "Create FPG", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_add_function_problem_roles', + data: {'graphID':graphID, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }); + }) + + + var assign_parameter_roles_DOM = d3.select(".assign_parameter_roles") + assign_parameter_roles_DOM.on("mousedown", function() + { + if (markedVariables.length<1) + { + bootbox.hideAll(); + bootbox.alert({ + title: "Assign parameter roles", + message: "<p>Please mark all parameters, which are of special interest. The options are:</p>" + +"<ul><li><b>Design Variable</b></li>" + +"<li><b>Objective</b></li>" + +"<li><b>Constraint</b></li>" + +"<li><b>State Variable</b> (also \"quantity of interest\")</li></ul><br/>" + +"<p>To \"pre-mark\" special parameters open the <b>Data Model Tree</b> or <b>Data Model List</b>, select the parameters via right-mouse click and use one of the \"Pre-assign parameter\" options.</p>" + +"<p><b>IMPORTANT: After all parameters are \"pre-assigned\", klick this button again to assign the parameter roles!</b></p>" + }) + } + else + { + markVariable(markedVariables) + } + + }) + + var get_function_order_DOM = d3.select(".get_function_order") + get_function_order_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.prompt( + { + title: "Select a sorting method", + inputType: 'select', + value: 'single-swap', + inputOptions: [ + { + text: 'single-swap', + value: 'single-swap', + }, + { + text: 'two-swap', + value: 'two-swap', + }, + { + text: 'hybrid-swap', + value: 'hybrid-swap', + }, + { + text: 'brute-force', + value: 'brute-force', + }, + { + text: 'branch-and-bound', + value: 'branch-and-bound', + } + ], + callback: function (result) { + if (result) + { + var method = result; + var bootboxContent = {title: "Get Possible Function Order", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_get_possible_function_order', + data: {'graphID':graphID, 'sortingMethod':method, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + } + }); + }) + + var remove_unused_outputs_DOM = d3.select(".remove_unused_outputs") + remove_unused_outputs_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.prompt( + { + title: "<p><b>Remove unused outputs</b></p>" + +"<p>Do you want to clean up the graph afterwards?</p>" + +"<b>CAUTION:</b> This will remove all unused competences automatically as well!", + inputType: 'select', + value: "True", + inputOptions: [{text:'yes', value:'True'}, {text:'no', value:'False'}], + callback: function (selection) + { + if (selection) + { + var bootboxContent = {title: "Enrich FPG", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_remove_unused_outputs', + data: {'graphID':graphID, 'currentOrder':nodeOrder, 'cleanUp':selection, + 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + + } + }) + }) + //#################################################################################################################### + + + //aigner: MDPG manipulations + //#################################################################################################################### + //aigner: Kadmos function Start defining MDO problem + var start_MDO_architecture_DOM = d3.select(".start_MDO_architecture") + start_MDO_architecture_DOM.on("mousedown", function() + { + bootbox.hideAll(); + bootbox.hideAll(); + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; + + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Name") + input = form_group.append("input") + .attr("id","graph_name") + .attr("class","form-control") + .attr("name","graph_name") + .attr("placeholder","Add a graph name here...") + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Description") + input = form_group.append("input") + .attr("id","graph_description") + .attr("class","form-control") + .attr("name","graph_description") + .attr("placeholder","Add a graph description here...") + + bootbox.dialog({ + message: $(".form-content").html(), + title: "<p>This will create an initial MDPG for your MDO problem. After clicking this button, you can go through the \"<b>MDPG manipulation</b>\" steps." + +"<p>Please type in a new name and description for the graph</p>", + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default pull-left", + callback: function() { + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary pull-left", + callback: function() { + + //get form data + var graph_name = $('form #graph_name').val(); + var graph_description = $('form #graph_description').val(); + + + var newGraphID = '01'; + data.graphs.forEach(function(graph) + { + id_int = parseInt(graph.id) + if (data.graphs.length < 100){newGraphID = "0" + String(id_int+1);} + else{newGraphID = String(id_int+1);} + }) + var bootboxContent = {title: "Copy graph for defining MDAO architecture", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_start_defining_MDAO_architecture', + data: {'graphID':graphID, 'currentOrder': nodeOrder, 'newGraphName':graph_name, 'newGraphDesc':graph_description, 'newGraphID':newGraphID, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = jQuery.extend(true, {}, data); + var graphData = JSON.parse(result); + + for (var i = 0; i < data.graphs.length; i++) + { + if (graphID == data.graphs[i].id) + { + + //Insert copied graph behind the original one + updatedData.graphs.splice(i+1, 0, graphData.graphs[0]) + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,newGraphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + d3.selectAll(".form-content").remove(); + } + } + ] + }); + }) + + + var MDAO_architecture = '-'; + var coupling_decomposition = '-'; + var DOE_method = '-'; + var set_MDAO_architecture_DOM = d3.select(".set_MDAO_architecture") + set_MDAO_architecture_DOM.on("mousedown", function() + { + var theOptions = [] + for (var i = 0; i<MDAO_architectures.length; i++){theOptions.push({text:MDAO_architectures[i].text, value:MDAO_architectures[i].value})} + bootbox.hideAll(); + bootbox.prompt( + { + title: "Set MDAO Architecture", + inputType: 'select', + value: MDAO_architecture, + inputOptions: theOptions, + callback: function (result) {if (result){MDAO_architecture = result;}} + }) + }) + + var set_coupling_decomposition_DOM = d3.select(".set_coupling_decomposition") + set_coupling_decomposition_DOM.on("mousedown", function() + { + var theOptions = [] + for (var i = 0; i<coupling_decompositions.length; i++){theOptions.push({text:coupling_decompositions[i], value:coupling_decompositions[i]})} + bootbox.hideAll(); + bootbox.prompt( + { + title: "Select Coupling Decomposition", + value: coupling_decomposition, + inputType: 'select', + inputOptions: theOptions, + callback: function (result) {if (result){coupling_decomposition = result;}} + }) + }) + + var set_DOE_method_DOM = d3.select(".set_DOE_method") + set_DOE_method_DOM.on("mousedown", function() + { + var theOptions = [] + for (var i = 0; i<DOE_methods.length; i++){theOptions.push({text:DOE_methods[i], value:DOE_methods[i]})} + bootbox.hideAll(); + bootbox.prompt( + { + title: "Select DOE Method", + value: DOE_method, + inputType: 'select', + inputOptions: theOptions, + callback: function (result) {if (result){DOE_method = result;}} + }) + }) + + var impose_MDAO_architecture_DOM = d3.select(".impose_MDAO_architecture") + impose_MDAO_architecture_DOM.on("mousedown", function() + { + var theOptions = [{text:"yes",value:"True"},{text:"no",value:"False"}] + bootbox.hideAll(); + bootbox.prompt( + { + title: "Allow Unconverged Couplings?", + value: "True", + inputType: 'select', + inputOptions: theOptions, + callback: function (result) + { + if (result) + { + var allow_unconverged_couplings = result; + var bootboxContent = {title: "Impose MDAO Architecture", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax( + { + type: 'POST', + url: '/kadmos_impose_MDAO_architecture', + data: {'graphID':graphID, + 'currentOrder':nodeOrder, + 'mdao_architecture':MDAO_architecture, + 'doe_method':DOE_method, + 'coupling_decomposition':coupling_decomposition, + 'allow_unconverged_couplings':allow_unconverged_couplings, + 'sessionId':sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + + } + + } + }) + }) + //#################################################################################################################### + + + //aigner: Upload custom KADMOS script + //#################################################################################################################### + var upload_script_DOM = d3.select(".upload_script") + upload_script_DOM.on("mousedown", function(){ + bootbox.dialog({ + title: "Upload custom script", + message: "<button id='downloadBtn' class='btn btn-primary'><i class='glyphicon glyphicon-download-alt '></i> Download template script</button>" + +"<form style='margin-top:20px;' id='scriptForm' method='post' enctype='multipart/form-data'>" + +"<label>" + +"<text>Upload script file:</text>" + +"<input type='file' name='file[]' />" + +"<input type='submit' value='Submit'/>" + +"</label></form>", + buttons : + { + cancel: { + label: "Cancel", + className: 'btn-danger' + } + } + }); + + //aigner: template for custom script that user can download + $('#downloadBtn').on("mousedown", function(){ + var script_template = "import sys\n\n" + +"from kadmos.graph import *\n\n\n" + +"def script(graph, mpg):\n" + +" \"\"\"\n" + +" Script to include manual operations in the KADMOS integration in VISTOMS\n\n" + +" :param graph: Any kadmos graph\n" + +" :param mpg: A corresponding MDO process graph\n" + +" :return: graph, mpg\n" + +" \"\"\"\n" + +" # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n" + +" # ADD YOUR SCRIPT BELOW THIS LINE #\n" + +" # Example script:\n" + +" # graph.remove_node('node_ID')\n" + +" # graph.remove_edge('node_ID1', 'node_ID2')\n" + +" # END SCRIPT ABOVE THIS LINE #\n" + +" # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n" + +" return graph, mpg\n" + + download('script_template.py', script_template); + }) + //upload of custom script + $('#scriptForm').on('submit',function(event){ + event.preventDefault(); + var formData = new FormData($('#scriptForm')[0]); + formData.append('graphID', graphID); + formData.append('sessionId', sessionId); + + if (typeof currentGraph.xdsm.workflow !== 'undefined' && currentGraph.xdsm.workflow.length > 0) + { + // the array is defined and has at least one element + upload_custom_script() + } + else + { + upload_custom_script() + } + + function upload_custom_script() + { + var bootboxContent = {title: "Upload custom KADMOS script", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_run_custom_script', + data: formData, + processData: false, + contentType: false, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }); + }) + //#################################################################################################################### + + + //aigner: Data Model Tree View Button + //#################################################################################################################### + var dropdown1 = d3.select(".tree_view") + var links = dropdown1.append("ul").attr("class","view_options"); + for (var j=0; j< varCategories.length; j++) + { + //console.log(varCategories[j]) + var linkLi = links.append("li"); + var linkA = linkLi.append("a") + .attr("id",j) + .text(varCategories[j].description) + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click", function() + { + showFullTree(varCategories[this.id].name,varCategories[this.id].description) + }) + } + //aigner: Set width of the div, so the VISTOMS dropdown (in the top of the page) still works + //dataModelDiv.style("width", String(dropdown1.node().getBoundingClientRect().width+20)+"px") + //#################################################################################################################### + + //aigner: Data Model List View Button + //#################################################################################################################### + //aigner: Function, that shows a list of elements + function showList(aTitle,aList,aMenu) + { + if (aList.length != 0) + { + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(aTitle) + panel_div.append("input") + .attr("id","myInput") + .attr("placeholder","Filter search...") + .attr("title","Type in a name") + .attr("onkeyup","filterSearch()") + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + var tr = listGroup + .selectAll('tr') + .data(aList).enter() + .append('tr') + var td = tr.append("td").html(function(d) { + if (d.xPath){return d.xPath;} + else {return d.name;} + }) + tr.on('contextmenu', d3.contextMenu(aMenu)); + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + } + + var dropdownList = d3.select(".list_view") + var linksList = dropdownList.append("ul").attr("class","view_options"); + for (var j=0; j< varCategories.length; j++) + { + //console.log(varCategories[j]) + var linkLi = linksList.append("li"); + var linkA = linkLi.append("a") + .attr("id",j) + .text(varCategories[j].description) + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click", function() + { + var variables = JSON.parse(JSON.stringify(currentGraph.variableSchemes[varCategories[this.id].name])); + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + var title = "List view: full variable set categorized according to " + varCategories[this.id].description + showList(title,variables,nodeMenu) + }) + } + //aigner: Set width of the div, so the VISTOMS dropdown (in the top of the page) still works + //#################################################################################################################### + + + //aigner: Tree option menu to select which kind of tree view the user wants to see + //#####################################################################// + var emptyArray; + function showFullTree(aCategory,categoryDescr) + { + var headLine = "Full data model tree view; Categorization: " + categoryDescr; + var d3_body = d3.select("body"); + var lobiID = String(getRandomInt(0,1000)) + var divClassName = 'treeDiv' + lobiID; + var treeLayoutdiv = d3_body.append("div").attr("class",divClassName+" panel-default") + .style("left",(d3.event.pageX) + "px") + .style("top",(d3.event.pageY - 28) + "px") + .style("position", "absolute") + treeLayoutdiv.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + $('.' + divClassName).lobiPanel({ + reload: false, + editTitle: false, + unpin: false, + minWidth: 200, + maxWidth: 100000, + minHeight: 200, + maxHeight: 100000, + }); + $('.'+divClassName).lobiPanel('unpin'); + var treeLayoutSVG = treeLayoutdiv.append("svg").attr("class","treeLayoutSVG") + var treeLayout = treeLayoutSVG.append("g").attr("class","treeLayout"); + maketreeLayout(emptyArray, treeLayout, treeLayoutSVG, treeLayoutdiv, divClassName, headLine, aCategory); + } + + var childrenItems = []; + for (var j=0; j< varCategories.length; j++) + { + childrenItems.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, d, i) {showFullTree(d.varCategory,d.description)}, + onMouseOver: function(elm,d,i){}}) + } + var treeOptionMenu = [ + { + title: 'Show variable tree...', + onMouseDown: function(elm, d, i) { + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: childrenItems + } + ] + //#####################################################################// + + + //create the xdsm div + d3.select(".xdsmDiv").append("div").attr("class","xdsm"); + //create tooltip + var tooltip = d3.select(".xdsmDiv").selectAll(".tooltip").data(['tooltip']) + .enter().append("div") + .attr("class", "tooltip") + .style("opacity", 0); + + var scenarioKeys = Object.keys(mdo).sort(); + var xdsms = {}; + + //If there is only one MDO and it is not named root, then it is created + if (scenarioKeys.indexOf('root') === -1) + { + var scenarioKeys_tmp = []; + scenarioKeys_tmp.push('root'); + scenarioKeys = scenarioKeys_tmp; + var mdo_tmp={}; + mdo_tmp['root']=mdo; + mdo = mdo_tmp; + } + // new format managing several XDSM + var index = scenarioKeys.indexOf('root'); + if (index > -1) + { + scenarioKeys.splice(index, 1); + } + scenarioKeys.unshift('root'); + + var xdsm; + scenarioKeys.forEach(function(k) + { + if (mdo.hasOwnProperty(k) && k =="root") + { + //aigner: Here the graphs are created + var graph = new Graph(mdo[k], k); + //aigner: Here the xdsms are drawn + xdsms[k] = new Xdsm(graph, k, tooltip); + xdsms[k].draw(currentGraph.name); + xdsm = xdsms[k]; + update_subXdsm(xdsms, k); + prepareTreeLayout(xdsms, k); + } + }, this) + + + xdsm.svg.selectAll(".node") + .each(function(node) + { + var gNode = this; + var d3gNode = d3.select(gNode); + + scenarioKeys.forEach(function(k) + { + if (k == node.xdsm) + { + var cx, cy; + for (var j=0; j < gNode.childNodes.length; j++) + { + if(gNode.childNodes[j].nodeName != "text") + { + cx = gNode.childNodes[j].getAttribute("width")/2-13; + cy = -gNode.childNodes[j].getAttribute("height")/2+8; + } + } + //Expand Symbol is created + var expandSymbol = d3.select(gNode).append("g").attr("class", "expandSymbol"); + var circle = expandSymbol.append("circle") + .attr("cx", cx) + .attr("cy", cy); + var line1 = expandSymbol.append("line"); + var line2 = expandSymbol.append("line"); + drawExpandSymbol( circle, line1,line2); + expandSymbol = expandSymbol + .on("mouseover", function(){circle.style("fill-opacity", .8);}) + .on("mouseout", function(){circle.style("fill-opacity", .6)}) + + .on("click", function() + { + //On mousedown, additional sub-workflows will be visualized + var createNew = true; + if(xdsms[k]){createNew=false;} + if (createNew == true) + { + var graph = new Graph(mdo[k], k); + xdsms[k] = new Xdsm(graph, k, tooltip); + xdsms[k].draw(currentGraph.name); + update_subXdsm(xdsms, k); + prepareTreeLayout(xdsms, k); + //Remove Symbol is created + var removeSymbol = xdsms[k].svg.append("g") + .attr("class", "removeSymbol"); + var circle = removeSymbol.append("circle"); + var minus = removeSymbol.append("line"); + drawRemoveSymbol(xdsms[k], circle, minus); + //Clicking on remove symbol will remove sub-workflow + removeSymbol.append("svg:title").text("Click right to inspect"); + removeSymbol = removeSymbol + .on("mouseover", function(){ + circle.style("fill", "red").style("fill-opacity", .8);}) + .on("mouseout", function(){ + circle.style("fill", "red").style("fill-opacity", .6)}) + .on("mousedown", function(){circle.style("fill", "darkred").style("fill-opacity",1);}) + .on("mouseup", function(d) + { + xdsms[k].svg.remove(); + d3.select(".treeDiv"+k).remove(); + delete xdsms[k]; + }) + + xdsms[k].svg.selectAll(".node") + .each(function(d) + { + var gNode = this; + d3.select(gNode).on('contextmenu', d3.contextMenu(toolMenu)); + }) + } + }) + } + }) + d3gNode.append("svg:title").text("Click right to inspect"); + d3gNode = d3gNode.on('mouseover', function(){d3.select(this).style("cursor", "pointer")}); + if (this.__data__.name == "Coordinator") + { + d3gNode = d3gNode.on('contextmenu', d3.contextMenu(toolMenuCoor)) + } + else + { + d3gNode = d3gNode.on('contextmenu', d3.contextMenu(toolMenu)) + } + }) + + function prepareTreeLayout(xdsms, refName) + { + function showEdgeTree(data,aVarCategory,categoryDescr) + { + var headLine = "Tree view: " + data.from + " → " + data.to + "; Categorization: " + categoryDescr; + var d3_body = d3.select("body"); + var lobiID = String(getRandomInt(0,1000)) + var divClassName = "treeDiv" + lobiID; + var treeLayoutdiv = d3_body.append("div").attr("class",divClassName + " panel-default") + .style("left",(d3.event.pageX) + "px") + .style("top",(d3.event.pageY - 28) + "px") + .style("position", "absolute") + treeLayoutdiv.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + $('.'+divClassName).lobiPanel({ + reload: false, + editTitle: false, + unpin: false, + minWidth: 1000, + maxWidth: 100000, + minHeight: 500, + maxHeight: 100000, + }); + $('.'+divClassName).lobiPanel('unpin'); + var treeLayoutSVG = treeLayoutdiv.append("svg").attr("class","treeLayoutSVG") + var treeLayout = treeLayoutSVG.append("g").attr("class","treeLayout"); + maketreeLayout(data.name, treeLayout, treeLayoutSVG, treeLayoutdiv, divClassName, headLine, aVarCategory); + } + + function showEdgeTable(anEdge) + { + var headLine = "Edge Information (" + anEdge.from + " - " + anEdge.to + ")"; + var anEdgeNameSplit = anEdge.name.split(',') + var numberOfconnections = anEdgeNameSplit.length; + var dimension=0; + var nullDim=false; + var undefinedLeafs; + var theLeafNodes = (JSON.parse(JSON.stringify(currentGraph.variableSchemes[varCategories[0].name]))); + var pipeData = anEdge.name; + prune_tree(pipeData,theLeafNodes) + var undefLeafsNumber=0; + var defLeafsNumber=0; + for (var k=0;k<theLeafNodes.length;k++) + { + if (theLeafNodes[k].dimension!=null){dimension = dimension+theLeafNodes[k].dimension} + else{nullDim=true} + if (theLeafNodes[k].value.includes("could not be found")||theLeafNodes[k].value.includes("unknown")) + { + if (undefLeafsNumber==0){undefinedLeafs += theLeafNodes[k].xPath;} + else {undefinedLeafs += "," + theLeafNodes[k].xPath;} + undefLeafsNumber ++; + } + else + { + defLeafsNumber++; + } + } + + //Render data for table + var data = []; + data.push({ "name" : "Total number of connections", "value" : numberOfconnections }) + data.push({ "name" : "Number of referenced connections", "value" : defLeafsNumber }) + data.push({ "name" : "Dimension of referenced connections", "value" : String(dimension) }) + if (undefinedLeafs) + { + data.push({ "name" : "Number of unreferenced connections", "value" : undefLeafsNumber}) + } + + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + + xdsms[refName].svg.selectAll(".edge") + .each(function(edge) + { + //edgeMenu --> functions for right click options + var edgeChildrenItemsTree = []; + for (var j=0; j< varCategories.length; j++) + { + edgeChildrenItemsTree.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) {showEdgeTree(edge,data.varCategory,data.description)}, + onMouseOver: function(elm,data,i){}}); + } + var edgeChildrenItemsList = []; + for (var j=0; j< varCategories.length; j++) + { + edgeChildrenItemsList.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) { + var variables = []; + var pipeData = edge.name; + var title = "List view: " + edge.from + " → " + edge.to + "; Categorization: " + data.description; + variables = JSON.parse(JSON.stringify(currentGraph.variableSchemes[data.varCategory])) + prune_tree(pipeData,variables) + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + + showList(title,variables,nodeMenu); + }, + onMouseOver: function(elm,data,i){}}); + } + var theEdge = this; + var edgeMenu = [ + { + title: 'Show edge info', + onMouseDown: function(elm, k, i) { + showEdgeTable(edge) + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Show variable tree...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: edgeChildrenItemsTree + }, + { + title: 'Show variable list...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: edgeChildrenItemsList + }, + { + title: 'Delete a variable connection here...', + onMouseDown: function(elm, k, i) { + deleteEdge(k) + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: {} + } + ] + + function deleteEdge(anEdge) + { + bootbox.hideAll(); + bootbox.confirm({ + title: "Delete output from competence " + anEdge.from_uID, + message: "<form id='infos' action=''>\Full xPath of the variable: <input type='text' name='edgeName' />\</form>", + callback: function(result) { + if(result) + { + var formData = $('#infos').submit()[0]; + bootbox.confirm("Are you sure you want to do this?", function(sure) + { + if (sure) + { + var bootboxContent = {title: "Delete variable connection", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_delete_edge', + data: {graphID: graphID, nodeName: anEdge.from_uID, edgeName: formData[0].value, 'currentOrder':nodeOrder, 'sessionId': sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = data; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + }) + } + } + }); + + $('form').on('submit',function(event){ + event.preventDefault(); + }); + + + } + + var thisEdge = d3.select(this); + //thisEdge.append("svg:title").text("Click right to inspect"); + thisEdge.on('contextmenu', d3.contextMenu(edgeMenu)) + }) + } + + + function maketreeLayout(pipeData, layout, svg, div, aLobiID, aName, aVarCategory) + { + var treeData = (JSON.parse(JSON.stringify(currentGraph.variableSchemes[aVarCategory]))); + //aigner: Build the tree layout + //###################################################################### + //Function to prune the tree according to list of xPaths that are actually there + //The tree will only be pruned if there is pipeData, such as in an edge or for the input of a tool + if (pipeData) + { + prune_tree(pipeData, treeData); + } + if (pipeData == ""){treeData = {}} + //build tree layout for vistoms + var newTree = {}; + buildTree(newTree, treeData) + treeData = newTree + //###################################################################### + + // Set the dimensions and margins of the diagram + var margin = {top: 20, right: 90, bottom: 20, left: 90}, + width = 960 - margin.left - margin.right, + height = 500 - margin.top - margin.bottom; + + // append the svg object to the body of the page + // appends a 'group' element to 'svg' + // moves the 'group' element to the top left margin + var offset_tmp = 60; + svg = svg.attr("width", width + margin.right + margin.left+offset_tmp) + .attr("height", height + margin.top + margin.bottom+offset_tmp); + div = div.attr("width", width + margin.right + margin.left+offset_tmp) + .attr("height", height + margin.top + margin.bottom+offset_tmp); + layout = layout + .attr("width", width + margin.right + margin.left) + .attr("height", height + margin.top + margin.bottom); + var name; + var rect = layout.append("rect") + .attr("class","treeFrame") + .attr("width", 0) + .attr("height", 70) + .attr("transform", "translate(" + + String(10) + "," + String(10) + ")") + .attr("fill", "white") + .attr("stroke", "darkgrey") + .attr("stroke-width", 0) + .attr("fill-opacity", 0.8) + //aigner: Put remove button on top of the rect + d3.selectAll(".treeRemoveSymbol").moveToFront(); + + //aigner: Exit, if no tree data is available! + if (!treeData.children || treeData.children.length==0) + { + var newText = layout.append('text') + .attr("dx", 40) + .attr("dy", 55) + .style("font-family", "Arial") + .style("font-size", "32pt") + .style("font-weight", "bold") + .html(function (d) { + return 'No tree view available! → Please check data for consistency!'; + }); + + var newWidth; + rect.attr("width", function(d) { + newWidth = this.parentNode.getBBox().width+20; + return newWidth;}) + div = div.attr("width", newWidth+30) + svg = svg.attr("width", newWidth+30) + return; + } + + // Calculate total nodes, max label length + var totalNodes = 0; + var maxLabelLength = 0; + + var i = 0, + duration = 500, + root; + + // declares a tree layout and assigns the size + var treemap = d3.tree().size([height, width]); + + // Assigns parent, children, height, depth + root = d3.hierarchy(treeData, function(d) { return d.children; }); + root.x0 = height / 2; + root.y0 = 0; + + // Append a group which holds all nodes and which the zoom Listener can act upon. + var svgGroup_xOff = root.data.name.length*10 + var svgGroup = layout.append("g") + .attr("transform", "translate("+ svgGroup_xOff + "," + String(margin.top+10) + ")"); + + + // Collapse root initially + collapse(root); + update(root); + + // Collapse the node and all it's children + function collapse(d) { + if(d.children) { + d._children = d.children + d._children.forEach(collapse) + d.children = null + } + } + // Collapse the node and all it's children + function expand(d) { + if(d._children) { + d.children = d._children + d.children.forEach(expand) + d._children = null + } + } + // Toggle children on click. + function click(d) + { + if (d.children) { + d._children = d.children; + d.children = null; + } else + { + d.children = d._children; + d._children = null; + } + update(d); + } + // Collapse/expand entire tree on double-click + function dblclick(d) + { + if(d.children) + { + collapse(d); + } + else if(d._children) + { + expand(d); + } + update(d); + } + + function update(source) + { + var levelWidth = [1]; + var getLevelWidth = function(level, n) + { + if (n.children && n.children.length > 0) { + if (levelWidth.length <= level + 1) levelWidth.push(0); + + //establish maxLabelLength + maxLabelLength = Math.max(n.data.name.length, maxLabelLength); + + levelWidth[level + 1] += n.children.length; + n.children.forEach(function(d) { + getLevelWidth(level + 1, d); + }); + } + }; + getLevelWidth(0, root); + var newHeight = d3.max(levelWidth) * 60; // 20 pixels per line + //BENNI: fill in viewerHeight instead of newHeight for other expanding/collapsing beaviour + + layout = layout.attr("height", newHeight + margin.top + margin.bottom) + svgGroup = svgGroup.attr("height", newHeight + margin.top + margin.bottom) + treemap = treemap.size([newHeight, width]); + + + // Assigns the x and y position for the nodes + var treeData = treemap(root); + + // Compute the new tree layout. + var nodes = treeData.descendants(), + links = treeData.descendants().slice(1); + + //aigner: count all descendants of a node + function countDescendants(node, counter) + { + if (node._children) + { + node._children.forEach(function(n) + { + counter = countDescendants(n, counter); + }); + } + else if (node.children) + { + node.children.forEach(function(n) + { + counter = countDescendants(n, counter); + }); + } + else + { + counter ++; + } + return counter; + } + + + var depth_tmp = 0; + var labelLength = []; + labelLength.push(0); + nodes.forEach(function(d) + { + //aigner: If node is collapsed show number of ancestors + if (d._children) + { + d._childrenNum = countDescendants(d, 0); + d.data.text = d.data.name + " (" + d._childrenNum + ")"; + } + else + { + d.data.text = d.data.name + } + + //aigner: Find maximum labelLength for each level + if (d.depth>depth_tmp) + { + depth_tmp = d.depth; + labelLength.push(d.data.text.length); + } + else + { + if (d.depth!=0){labelLength[labelLength.length-1] = Math.max(d.data.text.length, labelLength[labelLength.length-1]);} + } + }); + // Set widths between levels based on labelLength of each level. + var y_tmp = 100; + var depth_tmp = 0; + nodes.forEach(function(d) + { + if (d.depth>depth_tmp) + { + depth_tmp = d.depth; + d.y = y_tmp+(labelLength[depth_tmp])*12+50; + } + else + { + d.y = y_tmp; + } + newWidth=d.y; + y_tmp = d.y; + }); + + newWidth=Math.max(newWidth,getTextWidth(aName,"Arial 12pt")); + //aigner: Adjust height and width of the frame + $('.' + aLobiID).lobiPanel('setWidth', newWidth + margin.top + margin.bottom +400+maxLabelLength*25+offset_tmp); + $('.' + aLobiID).lobiPanel('setHeight', newHeight + margin.top + 2*margin.bottom+offset_tmp); + div = div.attr("height", newHeight + margin.top + margin.bottom+offset_tmp) + div = div.attr("width", newWidth + margin.top + margin.bottom +400+maxLabelLength*25+offset_tmp) + .on("mousedown", function(d) { + //d3.select(this).moveToFront(); + }) + svg = svg.attr("height", newHeight + margin.top + margin.bottom+offset_tmp) + svg = svg.attr("width", newWidth + margin.top + margin.bottom +400+maxLabelLength*25+offset_tmp) + rect = rect.attr("height", newHeight + margin.top + margin.bottom) + rect = rect.attr("width", newWidth + margin.top + margin.bottom+400+maxLabelLength*15) + + + + // ****************** Nodes section *************************** + // Update the nodes... + var node = svgGroup.selectAll('g.treeNode') + .data(nodes, function(d) {return d.id || (d.id = ++i); }); + + var dblclick_timer = false; + // Enter any new modes at the parent's previous position. + var nodeEnter = node.enter().append('g') + .attr('class', 'treeNode') + .attr("transform", function(d) { + return "translate(" + source.y0 + "," + source.x0 + ")"; + }) + .on("mousedown", function(d) { + //prevent tree from expanding on right click! + if (d3.event.which != 3) + { + // if double click timer is active, this click is the double click + if ( dblclick_timer ) + { + clearTimeout(dblclick_timer) + dblclick_timer = false + // double click code code comes here + //console.log("DOUBLE CLICK") + dblclick(d); + } + // otherwise, what to do after single click (double click has timed out) + else dblclick_timer = setTimeout( function(){ + dblclick_timer = false + // single click code code comes here + //console.log("SINGLE CLICK") + click(d); + }, 250) + } + + }) + + // Add Circle for the nodes + nodeEnter.append('circle') + .attr('class', 'treeNode') + .attr('r', 4.5) + .style("fill", function(d) { + if (d._children) + { + if(aName.includes("Input")){return '#ea9999'} + else if(aName.includes("Output")){return '#d6ea99'} + else {return "lightsteelblue"} + } + else {return "#fff"} + }) + .style("stroke", function(d) { + if(aName.includes("Input")){ + //console.log(d); + return '#CC0000'} + else if(aName.includes("Output")){ + //console.log(d); + return '#99CC00'} + }); + + // Add labels for the nodes + nodeEnter.append('text') + .attr('class', 'nodeText') + .attr("dy", ".35em") + .attr("x", function(d) { + return d.children || d._children ? -13 : 13; + }) + .attr("text-anchor", function(d) { + return d.children || d._children ? "end" : "start"; + }) + //.text(function(d) { return d.data.text; }); + + + //Function writeTreeToXML goes through tree nodes and puts the into an xml document + function writeTreeToXML(aNode,anXMLDoc,anXPath) + { + //Variable "children" + //--> One children variable, no matter whether a node has "_children" (collapsed) or "children" (expanded) + var children; + if (aNode._children){children = aNode._children;} + else if (aNode.children){children = aNode.children;} + + //Get current xml element with its xPath + var element = anXMLDoc.evaluate(anXPath,anXMLDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; + if (element != null) {element.value = '...';} + + //If a node has children (collapsed or expanded), loop through them + if (children) + { + for (var i=0; i < children.length;i++) + { + //Name of the new XML element --> childName + var child = children[i]; + var childName = child.data.name.split(/[\[\]]+/);//Split childName at "[]" which is the uID + var cleanChildName = childName[0].split(/[\+\*\^\-\ \#]+/);//Split childName all special characters + var newNode = anXMLDoc.createElement(String(cleanChildName[0])); + + //The children are appended to the xPath --> newXPath + var newXPath = anXPath+"/"+cleanChildName[0]; + + //If childName contains a uID, make the uID an attribute + if (childName[1]) + { + if (parseInt(childName[1])) + { + var dummyID = childName[1]; + newNode.setAttribute("dummyID", dummyID) + newXPath = newXPath+"[@dummyID='"+dummyID+"']"; + } + else + { + var uID = childName[1]; + newNode.setAttribute("uID", uID) + newXPath = newXPath+"[@uID='"+uID+"']"; + } + } + if (cleanChildName.length>1) {newNode.setAttribute("elementName", childName[0])}; + + //Append the newNode to the xml structure + element.appendChild(newNode); + + + + ////aigner: Sorting of XML elements according to "uID" + // var items = element.children; + // var itemsArr = []; + // for (var j in items) { + // if (items[j].nodeType == 1) { // get rid of the whitespace text nodes + // itemsArr.push(items[j]); + // } + // } + // itemsArr.sort(function(a,b){ + // if (a.getAttribute("uID") < b.getAttribute("uID")) + // return -1; + // if (a.getAttribute("uID") > b.getAttribute("uID")) + // return 1; + // return 0; + // }); + + // for (j = 0; j < itemsArr.length; ++j) { + // element.appendChild(itemsArr[j]); + // } + + //call function writeTreeToXML recursively for all children + writeTreeToXML(child,anXMLDoc,newXPath) + } + } + else + { + if (aNode.data.value){element.innerHTML = String(aNode.data.value);} + else{element.innerHTML = " ";} + } + //return the xml document + return anXMLDoc; + } + + function removeAttributeInAllElements(aDocument,attribute) + { + var matchingElements = []; + var allElements = aDocument.getElementsByTagName('*'); + for (var i = 0, n = allElements.length; i < n; i++) + { + if (allElements[i].getAttribute(attribute) !== null) + { + allElements[i].removeAttribute(attribute); + } + } + return matchingElements; + } + + function putAncestorsInXMLString(strWrapper, aNode) + { + //Name of the new XML element + var nodeName = aNode.data.name.split(/[\[\]]+/);//Split name at "[]" which is the uID + var cleanNodeName = nodeName[0].split(/[\+\*\^\-\ \#]+/);//Split nodeName all special characters + //If nodeName contains a uID, make the uID an attribute + if (nodeName[1]) + { + var uID = nodeName[1]; + strWrapper.val = "<"+cleanNodeName[0]+" uID='"+ uID +"'>"+strWrapper.val+"</"+cleanNodeName[0]+">";; + } + else + { + strWrapper.val = "<"+cleanNodeName[0]+">"+strWrapper.val+"</"+cleanNodeName[0]+">";; + } + var aParent = aNode.parent; + if (aParent) + { + return putAncestorsInXMLString(strWrapper, aParent); + } + else + { + return strWrapper; + } + } + + function putAncestorsInXPath(strWrapper, aNode) + { + //Name of the new XML element + var nodeName = aNode.data.name.split(/[\[\]]+/);//Split name at "[]" which is the uID + var cleanNodeName = nodeName[0].split(/[\+\*\^\-\ \#]+/);//Split nodeName all special characters + //If nodeName contains a uID, make the uID an attribute + if (nodeName[1]) + { + var uID = nodeName[1]; + strWrapper.val = "/"+cleanNodeName[0]+"[@uID='"+uID+"']"+strWrapper.val; + } + else + { + strWrapper.val = "/"+cleanNodeName[0]+strWrapper.val; + } + var aParent = aNode.parent; + if (aParent) + { + return putAncestorsInXPath(strWrapper, aParent); + } + else + { + return strWrapper; + } + } + + var nodeTreeMenu = nodeMenu; + var treeMenu = [ + { + title: 'Download full tree as XML-file', + onMouseDown: function(elm, d, i) { + //Begin xml structure with the first element + var xmlString = "<"+nodes[0].data.name+">"+"</"+nodes[0].data.name+">"; + //Create a new xml document + var parser = new DOMParser(); + var xmlDocument = parser.parseFromString(xmlString, "text/xml"); //important to use "text/xml" + //Get initial xPath of the tree and pass it to the function "writeTreeToXML" + var initialXPath = "/"+nodes[0].data.name; + writeTreeToXML(nodes[0],xmlDocument,initialXPath); + //remove all attributes dummyID + removeAttributeInAllElements(xmlDocument,'dummyID'); + //Make the xml document a string + var serializer = new XMLSerializer(); + var xmlString = serializer.serializeToString(xmlDocument); + xmlString = vkbeautify.xml(xmlString); + //Download a document with the xml-schema + download(aName+'_full.xml', xmlString); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Download tree as XML-file from current node', + onMouseDown: function(elm, d, i) { + var xmlString = putAncestorsInXMLString({ val : '' }, d).val; + var initialXPath = putAncestorsInXPath({ val : '' }, d).val; + //Create a new xml document + var parser = new DOMParser(); + var xmlDocument = parser.parseFromString(xmlString, "text/xml"); //important to use "text/xml" + //Get initial xPath of the tree and pass it to the function "writeCurrentTreeToXML" + writeTreeToXML(d,xmlDocument,initialXPath); + //remove all attributes dummyID + removeAttributeInAllElements(xmlDocument,'dummyID'); + //Make the xml document a string + var serializer = new XMLSerializer(); + xmlString = serializer.serializeToString(xmlDocument); + xmlString = vkbeautify.xml(xmlString); + //Download a document with the xml-schema + download(aName+"_"+d.data.name+'.xml', xmlString); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + } + ] + var nodeTreeMenu = nodeMenu.concat(treeMenu); + + + + nodeEnter = nodeEnter + .on('contextmenu', d3.contextMenu(nodeTreeMenu)); + + + nodeEnter.append("svg:title").text("Click left to expand, click right to inspect") + + + + // UPDATE + var nodeUpdate = nodeEnter.merge(node); + + // Transition to the proper position for the node + nodeUpdate.transition() + .duration(duration) + .attr("transform", function(d) { + return "translate(" + d.y + "," + d.x + ")"; + }); + + // Update the node attributes and style + nodeUpdate.select('circle.treeNode') + .attr('r', 4.5) + .style("fill", function(d) { + if (d._children) + { + if(aName.includes("Input")){return '#ea9999'} + else if(aName.includes("Output")){return '#d6ea99'} + else {return "lightsteelblue"} + } + else {return "#fff"} + }) + .attr('cursor', 'pointer'); + + nodeUpdate.select('text') + .text(function(d) { return d.data.text; }); + + + // Remove any exiting nodes + var nodeExit = node.exit().transition() + .duration(duration) + .attr("transform", function(d) { + return "translate(" + source.y + "," + source.x + ")"; + }) + .remove(); + + // ****************** links section *************************** + + // Update the links... + var link = svgGroup.selectAll('path.treeLink') + .data(links, function(d) { return d.id; }); + + // Enter any new links at the parent's previous position. + var linkEnter = link.enter().insert('path', "g") + .attr("class", "treeLink") + .attr('d', function(d){ + var o = {x: source.x0, y: source.y0} + return diagonal(o, o) + }); + + // UPDATE + var linkUpdate = linkEnter.merge(link); + + // Transition back to the parent element position + linkUpdate.transition() + .duration(duration) + .attr('d', function(d){ return diagonal(d, d.parent) }); + + // Remove any exiting links + var linkExit = link.exit().transition() + .duration(duration) + .attr('d', function(d) { + var o = {x: source.x, y: source.y} + return diagonal(o, o) + }) + .remove(); + + // Store the old positions for transition. + nodes.forEach(function(d){ + d.x0 = d.x; + d.y0 = d.y; + }); + + // Creates a curved (diagonal) path from parent to the child nodes + function diagonal(s, d) { + return "M" + s.y + "," + s.x + + "C" + (s.y + d.y) / 2 + "," + s.x + + " " + (s.y + d.y) / 2 + "," + d.x + + " " + d.y + "," + d.x; + } + } + } + } + startXDSM(data,graphID); + + ////aigner: Unused functions --> Could be helpful at some point + ////aigner: clone function, so that original object is not overwritten but deep copied + // function clone(obj) { + // if (null == obj || "object" != typeof obj) return obj; + // var copy = obj.constructor(); + // for (var attr in obj) { + // if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; + // } + // return copy; + // } + ////aigner: cleanArray Function + // function cleanArray(actual) + // { + // var newArray = new Array(); + // for (var i = 0; i < actual.length; i++) + // { + // if (actual[i]) + // { + // newArray.push(actual[i]); + // } + // } + // return newArray; + // } + //#####################################################################// + + + },{"./src/animation":2,"./src/graph":3,"./src/xdsm":5,"d3":1}]},{},[6]); + } + + function edgeBundles_script(data,graphID) + { + + (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ + !function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++i<u;)(t=r[i].on)&&t.apply(this,arguments);return n}var e=[],r=new c;return t.on=function(t,i){var u,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,u=e.indexOf(o)).concat(e.slice(u+1)),r.remove(t)),i&&e.push(r.set(t,{on:i})),n)},t}function S(){ao.event.preventDefault()}function k(){for(var n,t=ao.event;n=t.sourceEvent;)t=n;return t}function N(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(i){try{var u=i.sourceEvent=ao.event;i.target=n,ao.event=i,t[i.type].apply(e,r)}finally{ao.event=u}}},t}function E(n){return ko(n,Co),n}function A(n){return"function"==typeof n?n:function(){return No(n,this)}}function C(n){return"function"==typeof n?n:function(){return Eo(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function i(){this.setAttribute(n,t)}function u(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ao.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?u:i}function L(n){return n.trim().replace(/\s+/g," ")}function q(n){return new RegExp("(?:^|\\s+)"+ao.requote(n)+"(?:\\s+|$)","g")}function T(n){return(n+"").trim().split(/^|\s+/)}function R(n,t){function e(){for(var e=-1;++e<i;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<i;)n[e](this,r)}n=T(n).map(D);var i=n.length;return"function"==typeof t?r:e}function D(n){var t=q(n);return function(e,r){if(i=e.classList)return r?i.add(n):i.remove(n);var i=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(i)||e.setAttribute("class",L(i+" "+n))):e.setAttribute("class",L(i.replace(t," ")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function i(){this.style.setProperty(n,t,e)}function u(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?u:i}function U(n,t){function e(){delete this[n]}function r(){this[n]=t}function i(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?i:r}function j(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e===zo&&t.documentElement.namespaceURI===zo?t.createElement(n):t.createElementNS(e,n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return"function"==typeof n?n:(n=ao.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return Ao(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t<l;);return o}}function X(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function i(){var i=l(t,co(arguments));r.call(this),this.addEventListener(n,this[o]=i,i.$=e),i._=t}function u(){var t,e=new RegExp("^__on([^.]+)"+ao.requote(n)+"$");for(var r in this)if(t=r.match(e)){var i=this[r];this.removeEventListener(t[1],i,i.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),l=$;a>0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=oa,e=1/0;t;)t.c?(t.t<e&&(e=t.t),t=(n=t).n):t=n?n.n=t.n:oa=t.n;return aa=n,e}function Pn(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Un(n,t){var e=Math.pow(10,3*xo(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(l,a)),null!=(i=ya[e=n.charAt(++a)])&&(e=n.charAt(++a)),(u=A[e])&&(e=u(t,null==i?"e"===e?" ":"0":i)),o.push(e),l=a+1);return o.push(n.slice(l,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},i=e(r,n,t,0);if(i!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var u=null!=r.Z&&va!==Hn,o=new(u?Hn:va);return"j"in r?o.setFullYear(r.y,0,r.j):"W"in r||"U"in r?("w"in r||(r.w="W"in r?1:0),o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),u?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var i,u,o,a=0,l=t.length,c=e.length;l>a;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function $n(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Bn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function Wn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Jn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Gn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.y=Qn(+r[0]),e+r[0].length):-1}function Kn(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Qn(n){return n+(n>68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ft(){}function st(n,t,e){var r=e.s=n+t,i=r-n,u=r-i;e.t=n-u+(t-i)}function ht(n,t){n&&wa.hasOwnProperty(n.type)&&wa[n.type](n,t)}function pt(n,t,e){var r,i=-1,u=n.length-e;for(t.lineStart();++i<u;)r=n[i],t.point(r[0],r[1],r[2]);t.lineEnd()}function gt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)pt(n[e],t,1);t.polygonEnd()}function vt(){function n(n,t){n*=Yo,t=t*Yo/2+Fo/4;var e=n-r,o=e>=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])<Uo&&xo(n[1]-t[1])<Uo}function St(n,t){n*=Yo;var e=Math.cos(t*=Yo);kt(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function kt(n,t,e){++Ea,Ca+=(n-Ca)/Ea,za+=(t-za)/Ea,La+=(e-La)/Ea}function Nt(){function n(n,i){n*=Yo;var u=Math.cos(i*=Yo),o=u*Math.cos(n),a=u*Math.sin(n),l=Math.sin(i),c=Math.atan2(Math.sqrt((c=e*l-r*a)*c+(c=r*o-t*l)*c+(c=t*a-e*o)*c),t*o+e*a+r*l);Aa+=c,qa+=c*(t+(t=o)),Ta+=c*(e+(e=a)),Ra+=c*(r+(r=l)),kt(t,e,r)}var t,e,r;ja.point=function(i,u){i*=Yo;var o=Math.cos(u*=Yo);t=o*Math.cos(i),e=o*Math.sin(i),r=Math.sin(u),ja.point=n,kt(t,e,r)}}function Et(){ja.point=St}function At(){function n(n,t){n*=Yo;var e=Math.cos(t*=Yo),o=e*Math.cos(n),a=e*Math.sin(n),l=Math.sin(t),c=i*l-u*a,f=u*o-r*l,s=r*a-i*o,h=Math.sqrt(c*c+f*f+s*s),p=r*o+i*a+u*l,g=h&&-nn(p)/h,v=Math.atan2(h,p);Da+=g*c,Pa+=g*f,Ua+=g*s,Aa+=v,qa+=v*(r+(r=o)),Ta+=v*(i+(i=a)),Ra+=v*(u+(u=l)),kt(r,i,u)}var t,e,r,i,u;ja.point=function(o,a){t=o,e=a,ja.point=n,o*=Yo;var l=Math.cos(a*=Yo);r=l*Math.cos(o),i=l*Math.sin(o),u=Math.sin(a),kt(r,i,u)},ja.lineEnd=function(){n(t,e),ja.lineEnd=Et,ja.point=St}}function Ct(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function zt(){return!0}function Lt(n,t,e,r,i){var u=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(wt(e,r)){i.lineStart();for(var a=0;t>a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r<t;)i.n=e=n[r],e.p=i,i=e;i.n=e=n[0],e.p=i}}function Tt(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Rt(n,t,e,r){return function(i,u){function o(t,e){var r=i(t,e);n(t=r[0],e=r[1])&&u.point(t,e)}function a(n,t){var e=i(n,t);d.point(e[0],e[1])}function l(){m.point=a,d.lineStart()}function c(){m.point=o,d.lineEnd()}function f(n,t){v.push([n,t]);var e=i(n,t);x.point(e[0],e[1])}function s(){x.lineStart(),v=[]}function h(){f(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),g.push(v),v=null,r)if(1&t){n=e[0];var i,r=n.length-1,o=-1;if(r>0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o<r;)u.point((i=n[o])[0],i[1]);u.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonStart(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)<Uo?(n.point(e,r=(r+o)/2>0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)<Uo&&(e-=i*Uo),xo(u-a)<Uo&&(u-=a*Uo),r=Ft(e,r,u,o),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=u,r=o),i=a},lineEnd:function(){n.lineEnd(),e=r=NaN},clean:function(){return 2-t}}}function Ft(n,t,e,r){var i,u,o=Math.sin(n-e);return xo(o)>Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]<t[0]?Fo:-Fo;i=e*u/2,r.point(-u,i),r.point(0,i),r.point(u,i)}else r.point(t[0],t[1])}function Ot(n,t){var e=n[0],r=n[1],i=[Math.sin(e),-Math.cos(e),0],u=0,o=0;ka.reset();for(var a=0,l=t.length;l>a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s),v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)<Uo,C=A||Uo>E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)<Uo?k:N):k<=b[1]&&b[1]<=N:E>Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&(h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)<Uo?i>0?0:3:xo(r[0]-e)<Uo?i>0?2:1:xo(r[1]-t)<Uo?i>0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,Gt(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){ + r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)<Uo||xo(r-h)<Uo?(r+h)/2:Math.atan2(_,b),E=n(N,k),A=E[0],C=E[1],z=A-t,L=C-e,q=M*z-m*L;(q*q/x>u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)<Uo?ce:(e.invert=function(n,t){var e=u-t;return[Math.atan2(n,e)/i,u-K(i)*Math.sqrt(n*n+e*e)]},e)}function Ne(n,t){return[n,Math.log(Math.tan(Fo/4+t/2))]}function Ee(n){var t,e=oe(n),r=e.scale,i=e.translate,u=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=i.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=u.apply(e,arguments);if(o===e){if(t=null==n){var a=Fo*r(),l=i();u([[l[0]-a,l[1]-a],[l[0]+a,l[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Ae(n,t){return[Math.log(Math.tan(Fo/4+t/2)),-n]}function Ce(n){return n[0]}function ze(n){return n[1]}function Le(n){for(var t=n.length,e=[0,1],r=2,i=2;t>i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)<Uo&&xo(r-l.circle.cy)<Uo;)u=l.P,a.unshift(l),je(l),l=u;a.unshift(l),Be(l);for(var c=o;c.circle&&xo(e-c.circle.x)<Uo&&xo(r-c.circle.cy)<Uo;)o=c.N,a.push(c),je(c),c=o;a.push(c),Be(c);var f,s=a.length;for(f=1;s>f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)<Uo&&g-i>Uo?{x:s,y:xo(t-s)<Uo?e:g}:xo(i-g)<Uo&&h-r>Uo?{x:xo(e-g)<Uo?t:h,y:g}:xo(r-h)<Uo&&i-p>Uo?{x:h,y:xo(t-h)<Uo?e:p}:xo(i-p)<Uo&&r-s>Uo?{x:xo(e-p)<Uo?t:s,y:p}:null),u.site,null)),++l)}function Ve(n,t){return t.angle-n.angle}function Xe(){rr(this),this.x=this.y=this.arc=this.site=this.cy=null}function $e(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,i=n.site,u=e.site;if(r!==u){var o=i.x,a=i.y,l=r.x-o,c=r.y-a,f=u.x-o,s=u.y-a,h=2*(l*s-c*f);if(!(h>=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.y<M.y||y.y===M.y&&y.x<=M.x){if(!M.L){m=M.P;break}M=M.L}else{if(!M.R){m=M;break}M=M.R}ll.insert(m,y),m||(al=y)}}}}function Be(n){var t=n.circle;t&&(t.P||(al=t.N),ll.remove(t),fl.push(t),rr(t),n.circle=null)}function We(n){for(var t,e=il,r=Yt(n[0][0],n[0][1],n[1][0],n[1][1]),i=e.length;i--;)t=e[i],(!Je(t,n)||!r(t)||xo(t.a.x-t.b.x)<Uo&&xo(t.a.y-t.b.y)<Uo)&&(t.a=t.b=null,e.splice(i,1))}function Je(n,t){var e=n.b;if(e)return!0;var r,i,u=n.a,o=t[0][0],a=t[1][0],l=t[0][1],c=t[1][1],f=n.l,s=n.r,h=f.x,p=f.y,g=s.x,v=s.y,d=(h+g)/2,y=(p+v)/2;if(v===p){if(o>d||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.y<l)return}else u={x:d,y:c};e={x:d,y:l}}}else if(r=(h-g)/(v-p),i=y-r*d,-1>r||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.y<l)return}else u={x:(c-i)/r,y:c};e={x:(l-i)/r,y:l}}else if(v>p){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.x<o)return}else u={x:a,y:r*a+i};e={x:o,y:r*o+i}}return n.a=u,n.b=e,!0}function Ge(n,t){this.l=n,this.r=t,this.a=this.b=null}function Ke(n,t,e,r){var i=new Ge(n,t);return il.push(i),e&&nr(i,n,t,e),r&&nr(i,t,n,r),ul[n.i].edges.push(new tr(i,n,t)),ul[t.i].edges.push(new tr(i,t,n)),i}function Qe(n,t,e){var r=new Ge(n,null);return r.a=t,r.b=e,il.push(r),r}function nr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function tr(n,t,e){var r=n.a,i=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(i.x-r.x,r.y-i.y):Math.atan2(r.x-i.x,i.y-r.y)}function er(){this._=null}function rr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function ir(n,t){var e=t,r=t.R,i=e.U;i?i.L===e?i.L=r:i.R=r:n._=r,r.U=i,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ur(n,t){var e=t,r=t.L,i=e.U;i?i.L===e?i.L=r:i.R=r:n._=r,r.U=i,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function or(n){for(;n.L;)n=n.L;return n}function ar(n,t){var e,r,i,u=n.sort(lr).pop();for(il=[],ul=new Array(n.length),ol=new er,ll=new er;;)if(i=al,u&&(!i||u.y<i.y||u.y===i.y&&u.x<i.x))u.x===e&&u.y===r||(ul[u.i]=new Ye(u),He(u),e=u.x,r=u.y),u=n.pop();else{if(!i)break;Fe(i.arc)}t&&(We(t),Ze(t));var o={cells:ul,edges:il};return ol=ll=il=ul=null,o}function lr(n,t){return t.y-n.y||t.x-n.x}function cr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function fr(n){return n.x}function sr(n){return n.y}function hr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function pr(n,t,e,r,i,u){if(!n(t,e,r,i,u)){var o=.5*(e+i),a=.5*(r+u),l=t.nodes;l[0]&&pr(n,l[0],e,r,o,a),l[1]&&pr(n,l[1],o,r,i,a),l[2]&&pr(n,l[2],e,a,o,u),l[3]&&pr(n,l[3],o,a,i,u)}}function gr(n,t,e,r,i,u,o){var a,l=1/0;return function c(n,f,s,h,p){if(!(f>u||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function(n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return u<t.length&&(i=t.slice(u),a[o]?a[o]+=i:a[++o]=i),a.length<2?l[0]?(t=l[0].x,function(n){return t(n)+""}):function(){return t}:(t=l.length,function(n){for(var e,r=0;t>r;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Zo,this.translate=[n.e,n.f],this.scale=[r,u],this.skew=u?Math.atan2(i,u)*Zo:0}function Fr(n,t){return n[0]*t[0]+n[1]*t[1]}function Hr(n){var t=Math.sqrt(Fr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Or(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Ir(n){return n.length?n.pop()+",":""}function Yr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push("translate(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else(t[0]||t[1])&&e.push("translate("+t+")")}function Zr(n,t,e,r){n!==t?(n-t>180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i<u;)e[(t=r[i]).i]=t.x(n);return e.join("")}}function Br(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Wr(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Jr(n){for(var t=n.source,e=n.target,r=Kr(t,e),i=[t];t!==r;)t=t.parent,i.push(t);for(var u=i.length;e!==r;)i.splice(u,0,e),e=e.parent;return i}function Gr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Kr(n,t){if(n===t)return n;for(var e=Gr(n),r=Gr(t),i=e.pop(),u=r.pop(),o=null;i===u;)o=i,i=e.pop(),u=r.pop();return o}function Qr(n){n.fixed|=2}function ni(n){n.fixed&=-7}function ti(n){n.fixed|=4,n.px=n.x,n.py=n.y}function ei(n){n.fixed&=-5}function ri(n,t,e){var r=0,i=0;if(n.charge=0,!n.leaf)for(var u,o=n.nodes,a=o.length,l=-1;++l<a;)u=o[l],null!=u&&(ri(u,t,e),n.charge+=u.charge,r+=u.charge*u.cx,i+=u.charge*u.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var c=t*e[n.point.index];n.charge+=n.pointCharge=c,r+=c*n.point.x,i+=c*n.point.y}n.cx=r/n.charge,n.cy=i/n.charge}function ii(n,t){return ao.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=fi,n}function ui(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(i=n.children)&&(r=i.length))for(var r,i;--r>=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++o<i;)e.push(u[o]);for(;null!=(n=r.pop());)t(n)}function ai(n){return n.children}function li(n){return n.value}function ci(n,t){return t.value-n.value}function fi(n){return ao.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function si(n){return n.x}function hi(n){return n.y}function pi(n,t,e){n.y0=t,n.y=e}function gi(n){return ao.range(n.length)}function vi(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function di(n){for(var t,e=1,r=0,i=n[0][1],u=n.length;u>e;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.r<r.r?Si(r,i=a):Si(r=l,i),o--):(wi(r,u),i=u,t(u))}var y=(f+s)/2,m=(h+p)/2,M=0;for(o=0;c>o;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u<o;)Ci(i[u],t,e,r)}function zi(n,t,e){var r=n.r+e.r,i=t.x-n.x,u=t.y-n.y;if(r&&(i||u)){var o=t.r+e.r,a=i*i+u*u;o*=o,r*=r;var l=.5+(r-o)/(2*a),c=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+l*i+c*u,e.y=n.y+l*u-c*i}else e.x=n.x+r,e.y=n.y}function Li(n,t){return n.parent==t.parent?1:2}function qi(n){var t=n.children;return t.length?t[0]:n.t}function Ti(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ri(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Di(n){for(var t,e=0,r=0,i=n.children,u=i.length;--u>=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)i.push(e(n[o-1],n[o])),u.push(r(t[o-1],t[o]));return function(t){var e=ao.bisect(n,t,1,a)-1;return u[e](i[e](t))}}function Wi(n,t,e,r){function i(){var i=Math.min(n.length,t.length)>2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++<f;)for(var h=s-1;h>0;h--)o.push(u(c)*h);for(c=0;o[c]<a;c++);for(f=o.length;o[f-1]>l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n):""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++o<a;)i.has(u=r[o])||i.set(u,n.push(u));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(u=n,o=0,t={t:"range",a:arguments},e):u},e.rangePoints=function(i,a){arguments.length<2&&(a=0);var l=i[0],c=i[1],f=n.length<2?(l=(l+c)/2,0):(c-l)/(n.length-1+a);return u=r(l+f*a/2,f),o=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(i,a){arguments.length<2&&(a=0);var l=i[0],c=i[1],f=n.length<2?(l=c=Math.round((l+c)/2),0):(c-l)/(n.length-1+a)|0;return u=r(l+Math.round(f*a/2+(c-l-(n.length-1+a)*f)/2),f),o=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(i,a,l){arguments.length<2&&(a=0),arguments.length<3&&(l=a);var c=i[1]<i[0],f=i[c-0],s=i[1-c],h=(s-f)/(n.length-a+2*l);return u=r(f+h*l,h),c&&u.reverse(),o=h*(1-a),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(i,a,l){arguments.length<2&&(a=0),arguments.length<3&&(l=a);var c=i[1]<i[0],f=i[c-0],s=i[1-c],h=Math.floor((s-f)/(n.length-a+2*l));return u=r(f+Math.round((s-f-(n.length-a)*h)/2),h),c&&u.reverse(),o=Math.round(h*(1-a)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Yi(t.a[0])},e.copy=function(){return ou(n,t)},e.domain(n)}function au(n,t){function u(){var e=0,r=t.length;for(a=[];++e<r;)a[e-1]=ao.quantile(n,e/r);return o}function o(n){return isNaN(n=+n)?void 0:t[ao.bisect(a,n)]}var a;return o.domain=function(t){return arguments.length?(n=t.map(r).filter(i).sort(e),u()):n},o.range=function(n){return arguments.length?(t=n,u()):t},o.quantiles=function(){return a},o.invertExtent=function(e){return e=t.indexOf(e),0>e?[NaN,NaN]:[e>0?a[e-1]:n[0],e<a.length?a[e]:n[n.length-1]]},o.copy=function(){return au(n,t)},u()}function lu(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(u*(t-n))))]}function i(){return u=e.length/(t-n),o=e.length-1,r}var u,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],i()):[n,t]},r.range=function(n){return arguments.length?(e=n,i()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math.sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s<h;)i.call(this,l=t[s],s)?f.push([+p.call(this,l,s),+g.call(this,l,s)]):f.length&&(o(),f=[]);return f.length&&o(),c.length?c.join(""):null}var e=Ce,r=ze,i=zt,u=xu,o=u.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(i=n,t):i},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?u=n:(u=Tl.get(n)||xu).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function xu(n){return n.length>1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("V",(r=n[t])[1],"H",r[0]);return i.join("")}function Su(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r=n[t])[0],"V",r[1]);return i.join("")}function ku(n,t){return n.length<4?xu(n):n[1]+Au(n.slice(1,-1),Cu(n,t))}function Nu(n,t){return n.length<3?bu(n):n[0]+Au((n.push(n[0]),n),Cu([n[n.length-2]].concat(n,[n[1]]),t))}function Eu(n,t){return n.length<3?xu(n):n[0]+Au(n,Cu(n,t))}function Au(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return xu(n);var e=n.length!=t.length,r="",i=n[0],u=n[1],o=t[0],a=o,l=1;if(e&&(r+="Q"+(u[0]-2*o[0]/3)+","+(u[1]-2*o[1]/3)+","+u[0]+","+u[1],i=n[1],l=2),t.length>1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c<t.length;c++,l++)u=n[l],a=t[c],r+="S"+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1]}if(e){var f=n[l];r+="Q"+(u[0]+2*a[0]/3)+","+(u[1]+2*a[1]/3)+","+f[0]+","+f[1]}return r}function Cu(n,t){for(var e,r=[],i=(1-t)/2,u=n[0],o=n[1],a=1,l=n.length;++a<l;)e=u,u=o,o=n[a],r.push([i*(o[0]-e[0]),i*(o[1]-e[1])]);return r}function zu(n){if(n.length<3)return xu(n);var t=1,e=n.length,r=n[0],i=r[0],u=r[1],o=[i,i,i,(r=n[1])[0]],a=[u,u,u,r[1]],l=[i,",",u,"L",Ru(Pl,o),",",Ru(Pl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Du(l,o,a);return n.pop(),l.push("L",r),l.join("")}function Lu(n){if(n.length<4)return xu(n);for(var t,e=[],r=-1,i=n.length,u=[0],o=[0];++r<3;)t=n[r],u.push(t[0]),o.push(t[1]);for(e.push(Ru(Pl,u)+","+Ru(Pl,o)),--r;++r<i;)t=n[r],u.shift(),u.push(t[0]),o.shift(),o.push(t[1]),Du(e,u,o);return e.join("")}function qu(n){for(var t,e,r=-1,i=n.length,u=i+4,o=[],a=[];++r<4;)e=n[r%i],o.push(e[0]),a.push(e[1]);for(t=[Ru(Pl,o),",",Ru(Pl,a)],--r;++r<u;)e=n[r%i],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Du(t,o,a);return t.join("")}function Tu(n,t){var e=n.length-1;if(e)for(var r,i,u=n[0][0],o=n[0][1],a=n[e][0]-u,l=n[e][1]-o,c=-1;++c<=e;)r=n[c],i=c/e,r[0]=t*r[0]+(1-t)*(u+i*a),r[1]=t*r[1]+(1-t)*(o+i*l);return zu(n)}function Ru(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Du(n,t,e){n.push("C",Ru(Rl,t),",",Ru(Rl,e),",",Ru(Dl,t),",",Ru(Dl,e),",",Ru(Pl,t),",",Ru(Pl,e))}function Pu(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Uu(n){for(var t=0,e=n.length-1,r=[],i=n[0],u=n[1],o=r[0]=Pu(i,u);++t<e;)r[t]=(o+(o=Pu(i=u,u=n[t+1])))/2;return r[t]=o,r}function ju(n){for(var t,e,r,i,u=[],o=Uu(n),a=-1,l=n.length-1;++a<l;)t=Pu(n[a],n[a+1]),xo(t)<Uo?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,i=e*e+r*r,i>9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i<u;)t=n[i],e=t[0],r=t[1]-Io,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Ou(n){function t(t){function l(){v.push("M",a(n(y),s),f,c(n(d.reverse()),s),"Z")}for(var h,p,g,v=[],d=[],y=[],m=-1,M=t.length,x=En(e),b=En(i),_=e===r?function(){ + return p}:En(r),w=i===u?function(){return g}:En(u);++m<M;)o.call(this,h=t[m],m)?(d.push([p=+x.call(this,h,m),g=+b.call(this,h,m)]),y.push([+_.call(this,h,m),+w.call(this,h,m)])):d.length&&(l(),d=[],y=[]);return d.length&&l(),v.length?v.join(""):null}var e=Ce,r=Ce,i=0,u=ze,o=zt,a=xu,l=a.key,c=a,f="L",s=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(i=u=n,t):u},t.y0=function(n){return arguments.length?(i=n,t):i},t.y1=function(n){return arguments.length?(u=n,t):u},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(l="function"==typeof n?a=n:(a=Tl.get(n)||xu).key,c=a.reverse||a,f=a.closed?"M":"L",t):l},t.tension=function(n){return arguments.length?(s=n,t):s},t}function Iu(n){return n.radius}function Yu(n){return[n.x,n.y]}function Zu(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Io;return[e*Math.cos(r),e*Math.sin(r)]}}function Vu(){return 64}function Xu(){return"circle"}function $u(n){var t=Math.sqrt(n/Fo);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Bu(n){return function(){var t,e,r;(t=this[n])&&(r=t[e=t.active])&&(r.timer.c=null,r.timer.t=NaN,--t.count?delete t[e]:delete this[n],t.active+=.5,r.event&&r.event.interrupt.call(this,this.__data__,r.index))}}function Wu(n,t,e){return ko(n,Yl),n.namespace=t,n.id=e,n}function Ju(n,t,e,r){var i=n.id,u=n.namespace;return Y(n,"function"==typeof e?function(n,o,a){n[u][i].tween.set(t,r(e.call(n,n.__data__,o,a)))}:(e=r(e),function(n){n[u][i].tween.set(t,e)}))}function Gu(n){return null==n&&(n=""),function(){this.textContent=n}}function Ku(n){return null==n?"__transition__":"__transition_"+n+"__"}function Qu(n,t,e,r,i){function u(n){var t=v.delay;return f.t=t+l,n>=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.count,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro(n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]<Kl[u]/i?u-1:u]:[tc,Ki(n,e)[2]]}return r.invert=function(t){return io(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(io)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,io(+e+1),t).length}var u=r.domain(),o=Yi(u),a=null==n?i(o,10):"number"==typeof n&&i(o,n);return a&&(n=a[0],t=a[1]),r.domain(Xi(u,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.responseText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u;)if(null!=(r=n[i])&&r>=r){e=r;break}for(;++i<u;)null!=(r=n[i])&&e>r&&(e=r)}else{for(;++i<u;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=r;break}for(;++i<u;)null!=(r=t.call(n,n[i],i))&&e>r&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u;)if(null!=(r=n[i])&&r>=r){e=r;break}for(;++i<u;)null!=(r=n[i])&&r>e&&(e=r)}else{for(;++i<u;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=r;break}for(;++i<u;)null!=(r=t.call(n,n[i],i))&&r>e&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u<o;)if(null!=(r=n[u])&&r>=r){e=i=r;break}for(;++u<o;)null!=(r=n[u])&&(e>r&&(e=r),r>i&&(i=r))}else{for(;++u<o;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=i=r;break}for(;++u<o;)null!=(r=t.call(n,n[u],u))&&(e>r&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o<u;)i(e=+n[o])&&(r+=e);else for(;++o<u;)i(e=+t.call(n,n[o],o))&&(r+=e);return r},ao.mean=function(n,t){var e,u=0,o=n.length,a=-1,l=o;if(1===arguments.length)for(;++a<o;)i(e=r(n[a]))?u+=e:--l;else for(;++a<o;)i(e=r(t.call(n,n[a],a)))?u+=e:--l;return l?u/l:void 0},ao.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),i=+n[r-1],u=e-r;return u?i+u*(n[r]-i):i},ao.median=function(n,t){var u,o=[],a=n.length,l=-1;if(1===arguments.length)for(;++l<a;)i(u=r(n[l]))&&o.push(u);else for(;++l<a;)i(u=r(t.call(n,n[l],l)))&&o.push(u);return o.length?ao.quantile(o.sort(e),.5):void 0},ao.variance=function(n,t){var e,u,o=n.length,a=0,l=0,c=-1,f=0;if(1===arguments.length)for(;++c<o;)i(e=r(n[c]))&&(u=e-a,a+=u/++f,l+=u*(e-a));else for(;++c<o;)i(e=r(t.call(n,n[c],c)))&&(u=e-a,a+=u/++f,l+=u*(e-a));return f>1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t<e;)for(var i,u=-1,a=r[t]=new Array(i);++u<i;)a[u]=n[u][t];return r},ao.zip=function(){return ao.transpose(arguments)},ao.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ao.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ao.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ao.merge=function(n){for(var t,e,r,i=n.length,u=-1,o=0;++u<i;)o+=n[u].length;for(e=new Array(o);--i>=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)<t;)i.push(r/u);return i},ao.map=function(n,t){var e=new c;if(n instanceof c)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,i=-1,u=n.length;if(1===arguments.length)for(;++i<u;)e.set(i,n[i]);else for(;++i<u;)e.set(t.call(n,r=n[i],i),r)}else for(var o in n)e.set(o,n[o]);return e};var bo="__proto__",_o="\x00";l(c,{has:h,get:function(n){return this._[f(n)]},set:function(n,t){return this._[f(n)]=t},remove:p,keys:g,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:s(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t),this._[t])}}),ao.nest=function(){function n(t,o,a){if(a>=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p<g;)(h=d.get(l=v(f=o[p])))?h.push(f):d.set(l,[f]);return t?(f=t(),s=function(e,r){f.set(e,n(t,r,a))}):(f={},s=function(e,r){f[e]=n(t,r,a)}),d.forEach(s),f}function t(n,e){if(e>=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r<i;)n[e=arguments[r]]=M(n,t,t[e]);return n};var wo=["webkit","ms","moz","Moz","o","O"];ao.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o<a;){u.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var l=-1,c=r.length;++l<c;)(i=r[l])?(t.push(e=n.call(i,i.__data__,l,o)),e&&"__data__"in i&&(e.__data__=i.__data__)):t.push(null)}return E(u)},Co.selectAll=function(n){var t,e,r=[];n=C(n);for(var i=-1,u=this.length;++i<u;)for(var o=this[i],a=-1,l=o.length;++a<l;)(e=o[a])&&(r.push(t=co(n.call(e,e.__data__,a,i))),t.parentNode=e);return E(r)};var zo="http://www.w3.org/1999/xhtml",Lo={svg:"http://www.w3.org/2000/svg",xhtml:zo,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ao.ns={prefix:Lo,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++i<r;)if(!t.contains(n[i]))return!1}else for(t=e.getAttribute("class");++i<r;)if(!q(n[i]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},Co.style=function(n,e,r){var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++r<o;)(i=n[r])&&(y.has(d=t.call(i,i.__data__,r))?v[r]=i:y.set(d,i),m[r]=d);for(r=-1;++r<s;)(i=y.get(d=t.call(e,u=e[r],r)))?i!==!0&&(p[r]=i,i.__data__=u):g[r]=H(u),y.set(d,!0);for(r=-1;++r<o;)r in m&&y.get(m[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],u=e[r],i?(i.__data__=u,p[r]=i):g[r]=H(u);for(;s>r;++r)g[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++u<o;)(i=r[u])&&(n[u]=i.__data__);return n}var a=Z([]),l=E([]),f=E([]);if("function"==typeof n)for(;++u<o;)e(r=this[u],n.call(r,r.parentNode.__data__,u));else for(;++u<o;)e(r=this[u],n);return l.enter=function(){return a},l.exit=function(){return f},l},Co.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},Co.filter=function(n){var t,e,r,i=[];"function"!=typeof n&&(n=O(n));for(var u=0,o=this.length;o>u;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],i=r.length-1,u=r[i];--i>=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Co.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Co.call=function(n){var t=co(arguments);return n.apply(t[0]=this,t),this},Co.empty=function(){return!this.node()},Co.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++a<l;){r=(i=this[a]).update,o.push(t=[]),t.parentNode=i.parentNode;for(var c=-1,f=i.length;++c<f;)(u=i[c])?(t.push(r[c]=e=n.call(i.parentNode,u.__data__,c,a)),e.__data__=u.__data__):t.push(null)}return E(o)},qo.insert=function(n,t){return arguments.length<2&&(t=V(this)),Co.insert.call(this,n,t)},ao.select=function(t){var e;return"string"==typeof t?(e=[No(t,fo)],e.parentNode=fo.documentElement):(e=[t],e.parentNode=n(t)),E([e])},ao.selectAll=function(n){var t;return"string"==typeof n?(t=co(Eo(n,fo)),t.parentNode=fo.documentElement):(t=co(n),t.parentNode=null),E([t])},Co.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return new fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ua.forEach(function(n,t){ua.set(n,Mn(t))}),ao.functor=En,ao.xhr=An(m),ao.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var o=Cn(n,t,null==e?r:i(e),u);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:i(n)):e},o}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function u(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(f>=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}f=e+2;var r=n.charCodeAt(e+1);return 13===r?(i=!0,10===n.charCodeAt(e+2)&&++f):10===r&&(i=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;c>f;){var r=n.charCodeAt(f++),a=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(f)&&(++f,++a);else if(r!==l)continue;return n.slice(t,f-a)}return n.slice(t)}for(var r,i,u={},o={},a=[],c=n.length,f=0,s=0;(r=e())!==o;){for(var h=[];r!==u&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,s++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new y,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(u).join("\n")},e},ao.csv=ao.dsv(",","text/csv"),ao.tsv=ao.dsv(" ","text/tab-separated-values");var oa,aa,la,ca,fa=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ao.timer=function(){qn.apply(this,arguments)},ao.timer.flush=function(){Rn(),Dn()},ao.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var sa=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Un);ao.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=ao.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),sa[8+e/3]};var ha=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pa=ao.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ao.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ga=ao.time={},va=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){da.setUTCDate.apply(this._,arguments)},setDay:function(){da.setUTCDay.apply(this._,arguments)},setFullYear:function(){da.setUTCFullYear.apply(this._,arguments)},setHours:function(){da.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){da.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){da.setUTCMinutes.apply(this._,arguments)},setMonth:function(){da.setUTCMonth.apply(this._,arguments)},setSeconds:function(){da.setUTCSeconds.apply(this._,arguments)},setTime:function(){da.setTime.apply(this._,arguments)}};var da=Date.prototype;ga.year=On(function(n){return n=ga.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ga.years=ga.year.range,ga.years.utc=ga.year.utc.range,ga.day=On(function(n){var t=new va(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ga.days=ga.day.range,ga.days.utc=ga.day.utc.range,ga.dayOfYear=function(n){var t=ga.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ga[n]=On(function(n){return(n=ga.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ga[n+"s"]=e.range,ga[n+"s"].utc=e.utc.range,ga[n+"OfYear"]=function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)}}),ga.week=ga.sunday,ga.weeks=ga.sunday.range,ga.weeks.utc=ga.sunday.utc.range,ga.weekOfYear=ga.sundayOfYear;var ya={"-":"",_:" ",0:"0"},ma=/^\s*\d+/,Ma=/^%/;ao.locale=function(n){return{numberFormat:jn(n),timeFormat:Yn(n)}};var xa=ao.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], + shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ao.format=xa.numberFormat,ao.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,ba),st(ba.s,this.s,this),this.s?this.t+=ba.t:this.s=ba.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ba=new ft;ao.geo.stream=function(n,t){n&&_a.hasOwnProperty(n.type)?_a[n.type](n,t):ht(n,t)};var _a={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++r<i;)ht(e[r].geometry,t)}},wa={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){pt(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)pt(e[r],t,0)},Polygon:function(n,t){gt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)gt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,i=e.length;++r<i;)ht(e[r],t)}};ao.geo.area=function(n){return Sa=0,ao.geo.stream(n,Na),Sa};var Sa,ka=new ft,Na={sphere:function(){Sa+=4*Fo},point:b,lineStart:b,lineEnd:b,polygonStart:function(){ka.reset(),Na.lineStart=vt},polygonEnd:function(){var n=2*ka;Sa+=0>n?4*Fo+n:n,Na.lineStart=Na.lineEnd=Na.point=b}};ao.geo.bounds=function(){function n(n,t){M.push(x=[f=n,h=n]),s>t&&(s=t),t>p&&(p=t)}function t(t,e){var r=dt([t*Yo,e*Yo]);if(y){var i=mt(y,r),u=[i[1],-i[0],0],o=mt(u,i);bt(o),o=_t(o);var l=t-g,c=l>0?1:-1,v=o[0]*Zo*c,d=xo(l)>180;if(d^(v>c*g&&c*t>v)){var m=o[1]*Zo;m>p&&(p=m)}else if(v=(v+360)%360-180,d^(v>c*g&&c*t>v)){var m=-o[1]*Zo;s>m&&(s=m)}else s>e&&(s=e),e>p&&(p=e);d?g>t?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(f>t&&(f=t),t>h&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){b.point=t}function r(){x[0]=f,x[1]=h,b.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=xo(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Na.point(n,e),t(n,e)}function u(){Na.lineStart()}function o(){i(v,d),Na.lineEnd(),xo(m)>Uo&&(f=-(h=180)),x[0]=f,x[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var f,s,h,p,g,v,d,y,m,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=i,b.lineStart=u,b.lineEnd=o,m=0,Na.polygonStart()},polygonEnd:function(){Na.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>ka?(f=-(h=180),s=-(p=90)):m>Uo?p=90:-Uo>m&&(s=-90),x[0]=f,x[1]=h}};return function(n){p=h=-(f=s=1/0),M=[],ao.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],c(e[0],i)||c(e[1],i)?(a(i[0],e[1])>a(i[0],i[1])&&(i[1]=e[1]),a(e[0],i[1])>a(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var o,e,g=-(1/0),t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(o=a(i[1],e[0]))>g&&(g=o,f=e[0],h=i[1])}return M=x=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),ao.geo.centroid=function(n){Ea=Aa=Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,ja);var t=Da,e=Pa,r=Ua,i=t*t+e*e+r*r;return jo>i&&(t=qa,e=Ta,r=Ra,Uo>Aa&&(t=Ca,e=za,r=La),i=t*t+e*e+r*r,jo>i)?[NaN,NaN]:[Math.atan2(e,t)*Zo,tn(r/Math.sqrt(i))*Zo]};var Ea,Aa,Ca,za,La,qa,Ta,Ra,Da,Pa,Ua,ja={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){ja.lineStart=At},polygonEnd:function(){ja.lineStart=Nt}},Fa=Rt(zt,jt,Ht,[-Fo,-Fo/2]),Ha=1e9;ao.geo.clipExtent=function(){var n,t,e,r,i,u,o={stream:function(n){return i&&(i.valid=!1),i=u(n),i.valid=!0,i},extent:function(a){return arguments.length?(u=Zt(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),i&&(i.valid=!1,i=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ao.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,ao.geo.albers=function(){return ao.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ao.geo.albersUsa=function(){function n(n){var u=n[0],o=n[1];return t=null,e(u,o),t||(r(u,o),t)||i(u,o),t}var t,e,r,i,u=ao.geo.albers(),o=ao.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ao.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?o:i>=.166&&.234>i&&r>=-.214&&-.115>r?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Uo,s+.12*c+Uo],[f-.214*c-Uo,s+.234*c-Uo]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Uo,s+.166*c+Uo],[f-.115*c-Uo,s+.234*c-Uo]]).stream(l).point,n},n.scale(1070)};var Oa,Ia,Ya,Za,Va,Xa,$a={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Ia=0,$a.lineStart=$t},polygonEnd:function(){$a.lineStart=$a.lineEnd=$a.point=b,Oa+=xo(Ia/2)}},Ba={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Wa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Wa.lineStart=ne},polygonEnd:function(){Wa.point=Gt,Wa.lineStart=Kt,Wa.lineEnd=Qt}};ao.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),ao.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return Oa=0,ao.geo.stream(n,i($a)),Oa},n.centroid=function(n){return Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,i(Wa)),Ua?[Da/Ua,Pa/Ua]:Ra?[qa/Ra,Ta/Ra]:La?[Ca/La,za/La]:[NaN,NaN]},n.bounds=function(n){return Va=Xa=-(Ya=Za=1/0),ao.geo.stream(n,i(Ba)),[[Ya,Za],[Va,Xa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(ao.geo.albersUsa()).context(null)},ao.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ao.geo.projection=oe,ao.geo.projectionMutator=ae,(ao.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,ao.geo.rotation=function(n){function t(t){return t=n(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t}return n=se(n[0]%360*Yo,n[1]*Yo,n.length>2?n[2]*Yo:0),t.invert=function(t){return t=n.invert(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t},t},fe.invert=ce,ao.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Yo,-n[1]*Yo,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Zo,n[1]*=Zo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Yo,i*Yo),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Yo,(i=+r)*Yo),n):i},n.angle(90)},ao.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Yo,i=n[1]*Yo,u=t[1]*Yo,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},ao.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ao.range(Math.ceil(u/d)*d,i,d).map(h).concat(ao.range(Math.ceil(c/y)*y,l,y).map(p)).concat(ao.range(Math.ceil(r/g)*g,e,g).filter(function(n){return xo(n%d)>Uo}).map(f)).concat(ao.range(Math.ceil(a/v)*v,o,v).filter(function(n){return xo(n%y)>Uo}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,v=g,d=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],y=+t[1],n):[d,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],v=+t[1],n):[g,v]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Uo],[180,90-Uo]]).minorExtent([[-180,-80-Uo],[180,80+Uo]])},ao.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=Me,i=xe;return n.distance=function(){return ao.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ao.geo.interpolate=function(n,t){return be(n[0]*Yo,n[1]*Yo,t[0]*Yo,t[1]*Yo)},ao.geo.length=function(n){return Ja=0,ao.geo.stream(n,Ga),Ja};var Ja,Ga={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Ka=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ao.geo.azimuthalEqualArea=function(){return oe(Ka)}).raw=Ka;var Qa=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(ao.geo.azimuthalEquidistant=function(){return oe(Qa)}).raw=Qa,(ao.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(ao.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var nl=we(function(n){return 1/n},Math.atan);(ao.geo.gnomonic=function(){return oe(nl)}).raw=nl,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Io]},(ao.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var tl=we(function(){return 1},Math.asin);(ao.geo.orthographic=function(){return oe(tl)}).raw=tl;var el=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ao.geo.stereographic=function(){return oe(el)}).raw=el,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Io]},(ao.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,ao.geom={},ao.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;o>t;t++)a.push([+i.call(this,n[t],t),+u.call(this,n[t],t),t]);for(a.sort(qe),t=0;o>t;t++)l.push([a[t][0],-a[t][1]]);var c=Le(a),f=Le(l),s=f[0]===c[0],h=f[f.length-1]===c[c.length-1],p=[];for(t=c.length-1;t>=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t<f.length-h;++t)p.push(n[a[f[t]][2]]);return p}var e=Ce,r=ze;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ao.geom.polygon=function(n){return ko(n,rl),n};var rl=ao.geom.polygon.prototype=[];rl.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],i=0;++t<e;)n=r,r=this[t],i+=n[1]*r[0]-n[0]*r[1];return.5*i},rl.centroid=function(n){var t,e,r=-1,i=this.length,u=0,o=0,a=this[i-1];for(arguments.length||(n=-1/(6*this.area()));++r<i;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],u+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[u*n,o*n]},rl.clip=function(n){for(var t,e,r,i,u,o,a=De(n),l=-1,c=this.length-De(this),f=this[c-1];++l<c;){for(t=n.slice(),n.length=0,i=this[l],u=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],Te(o,f,i)?(Te(u,f,i)||n.push(Re(u,o,f,i)),n.push(o)):Te(u,f,i)&&n.push(Re(u,o,f,i)),u=o;a&&n.push(n[0]),f=i}return n};var il,ul,ol,al,ll,cl=[],fl=[];Ye.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Ve),t.length},tr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},er.prototype={insert:function(n,t){var e,r,i;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=or(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(i=r.R,i&&i.C?(e.C=i.C=!1,r.C=!0,n=r):(n===e.R&&(ir(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ur(this,r))):(i=r.L,i&&i.C?(e.C=i.C=!1,r.C=!0,n=r):(n===e.L&&(ur(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ir(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,i=n.U,u=n.L,o=n.R;if(e=u?o?or(o):u:o,i?i.L===n?i.L=e:i.R=e:this._=e,u&&o?(r=e.C,e.C=n.C,e.L=u,u.U=e,e!==o?(i=e.U,e.U=n.U,n=e.R,i.L=n,e.R=o,o.U=e):(e.U=i,i=e,n=e.R)):(r=n.C,n=e),n&&(n.U=i),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===i.L){if(t=i.R,t.C&&(t.C=!1,i.C=!0,ir(this,i),t=i.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ur(this,t),t=i.R),t.C=i.C,i.C=t.R.C=!1,ir(this,i),n=this._;break}}else if(t=i.L,t.C&&(t.C=!1,i.C=!0,ur(this,i),t=i.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,ir(this,t),t=i.L),t.C=i.C,i.C=t.L.C=!1,ur(this,i),n=this._;break}t.C=!0,n=i,i=i.U}while(!n.C);n&&(n.C=!1)}}},ao.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],i=a[0][1],u=a[1][0],o=a[1][1];return ar(e(n),a).cells.forEach(function(e,a){var l=e.edges,c=e.site,f=t[a]=l.length?l.map(function(n){var t=n.start();return[t.x,t.y]}):c.x>=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[];f.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Uo)*Uo,y:Math.round(o(n,t)/Uo)*Uo,i:t}})}var r=Ce,i=ze,u=r,o=i,a=sl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u,o=e.site,a=e.edges.sort(Ve),l=-1,c=a.length,f=a[c-1].edge,s=f.l===o?f.r:f.l;++l<c;)i=f,u=s,f=a[l].edge,s=f.l===o?f.r:f.l,r<u.i&&r<s.i&&cr(o,u,s)<0&&t.push([n[r],n[u.i],n[s.i]])}),t},t.x=function(n){return arguments.length?(u=En(r=n),t):r},t.y=function(n){return arguments.length?(o=En(i=n),t):i},t.clipExtent=function(n){return arguments.length?(a=null==n?sl:n,t):a===sl?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===sl?null:a&&a[1]},t)};var sl=[[-1e6,-1e6],[1e6,1e6]];ao.geom.delaunay=function(n){return ao.geom.voronoi().triangles(n)},ao.geom.quadtree=function(n,t,e,r,i){function u(n){function u(n,t,e,r,i,u,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var l=n.x,f=n.y;if(null!=l)if(xo(l-e)+xo(f-r)<.01)c(n,t,e,r,i,u,o,a);else{var s=n.point;n.x=n.y=n.point=null,c(n,s,l,f,i,u,o,a),c(n,t,e,r,i,u,o,a)}else n.x=e,n.y=r,n.point=t}else c(n,t,e,r,i,u,o,a)}function c(n,t,e,r,i,o,a,l){var c=.5*(i+a),f=.5*(o+l),s=e>=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]=hr()),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,v,d,y,m,M=En(a),x=En(l);if(null!=t)v=t,d=e,y=r,m=i;else if(y=m=-(v=d=1/0),s=[],h=[],g=n.length,o)for(p=0;g>p;++p)f=n[p],f.x<v&&(v=f.x),f.y<d&&(d=f.y),f.x>y&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;g>p;++p){var b=+M(f=n[p],p),_=+x(f,p);v>b&&(v=b),d>_&&(d=_),b>y&&(y=b),_>m&&(m=_),s.push(b),h.push(_)}var w=y-v,S=m-d;w>S?m=d+w:y=v+S;var k=hr();if(k.add=function(n){u(k,n,+M(n,++p),+x(n,p),v,d,y,m)},k.visit=function(n){pr(n,k,v,d,y,m)},k.find=function(n){return gr(k,n[0],n[1],v,d,y,m)},p=-1,null==t){for(;++p<g;)u(k,n[p],s[p],h[p],v,d,y,m);--p}else n.forEach(k.add);return s=h=n=f=null,k}var o,a=Ce,l=ze;return(o=arguments.length)?(a=fr,l=sr,3===o&&(i=e,r=t,e=t=0),u(n)):(u.x=function(n){return arguments.length?(a=n,u):a},u.y=function(n){return arguments.length?(l=n,u):l},u.extent=function(n){return arguments.length?(null==n?t=e=r=i=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],i=+n[1][1]),u):null==t?null:[[t,e],[r,i]]},u.size=function(n){return arguments.length?(null==n?t=e=r=i=null:(t=e=0,r=+n[0],i=+n[1]),u):null==t?null:[r-t,i-e]},u)},ao.interpolateRgb=vr,ao.interpolateObject=dr,ao.interpolateNumber=yr,ao.interpolateString=mr;var hl=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,pl=new RegExp(hl.source,"g");ao.interpolate=Mr,ao.interpolators=[function(n,t){var e=typeof t;return("string"===e?ua.has(t.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(t)?vr:mr:t instanceof an?vr:Array.isArray(t)?xr:"object"===e&&isNaN(t)?dr:yr)(n,t)}],ao.interpolateArray=xr;var gl=function(){return m},vl=ao.map({linear:gl,poly:Er,quad:function(){return Sr},cubic:function(){return kr},sin:function(){return Ar},exp:function(){return Cr},circle:function(){return zr},elastic:Lr,back:qr,bounce:function(){return Tr}}),dl=ao.map({"in":m,out:_r,"in-out":wr,"out-in":function(n){return wr(_r(n))}});ao.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=vl.get(e)||gl,r=dl.get(r)||m,br(r(e.apply(null,lo.call(arguments,1))))},ao.interpolateHcl=Rr,ao.interpolateHsl=Dr,ao.interpolateLab=Pr,ao.interpolateRound=Ur,ao.transform=function(n){var t=fo.createElementNS(ao.ns.prefix.svg,"g");return(ao.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:yl)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var yl={a:1,b:0,c:0,d:1,e:0,f:0};ao.interpolateTransform=$r,ao.layout={},ao.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Jr(n[e]));return t}},ao.layout.chord=function(){function n(){var n,c,s,h,p,g={},v=[],d=ao.range(u),y=[];for(e=[],r=[],n=0,h=-1;++h<u;){for(c=0,p=-1;++p<u;)c+=i[h][p];v.push(c),y.push(ao.range(u)),n+=c}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&y.forEach(function(n,t){n.sort(function(n,e){return a(i[t][n],i[t][e])})}),n=(Ho-f*u)/n,c=0,h=-1;++h<u;){for(s=c,p=-1;++p<u;){var m=d[h],M=y[m][p],x=i[m][M],b=c,_=c+=x*n;g[m+"-"+M]={index:m,subindex:M,startAngle:b,endAngle:_,value:x}}r[m]={index:m,startAngle:s,endAngle:c,value:v[m]},c+=f}for(h=-1;++h<u;)for(p=h-1;++p<u;){var w=g[h+"-"+p],S=g[p+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}l&&t()}function t(){e.sort(function(n,t){return l((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,i,u,o,a,l,c={},f=0;return c.matrix=function(n){return arguments.length?(u=(i=n)&&i.length,e=r=null,c):i},c.padding=function(n){return arguments.length?(f=n,e=r=null,c):f},c.sortGroups=function(n){return arguments.length?(o=n,e=r=null,c):o},c.sortSubgroups=function(n){return arguments.length?(a=n,e=null,c):a},c.sortChords=function(n){return arguments.length?(l=n,e&&t(),c):l},c.chords=function(){return e||n(),e},c.groups=function(){return r||n(),r},c},ao.layout.force=function(){function n(n){return function(t,e,r,i){if(t.point!==n){var u=t.cx-n.x,o=t.cy-n.y,a=i-e,l=u*u+o*o;if(l>a*a/y){if(v>l){var c=t.charge/l;n.px-=u*c,n.py-=o*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=u*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=ao.event.x,n.py=ao.event.y,l.resume()}var e,r,i,u,o,a,l={},c=ao.dispatch("start","tick","end"),f=[1,1],s=.9,h=ml,p=Ml,g=-30,v=xl,d=.1,y=.64,M=[],x=[];return l.tick=function(){if((i*=.99)<.005)return e=null,c.end({type:"end",alpha:i=0}),!0;var t,r,l,h,p,v,y,m,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,p=l.target,m=p.x-h.x,b=p.y-h.y,(v=m*m+b*b)&&(v=i*o[r]*((v=Math.sqrt(v))-u[r])/v,m*=v,b*=v,p.x-=m*(y=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=b*y,h.x+=m*(y=1-y),h.y+=b*y);if((y=i*d)&&(m=f[0]/2,b=f[1]/2,r=-1,y))for(;++r<_;)l=M[r],l.x+=(m-l.x)*y,l.y+=(b-l.y)*y;if(g)for(ri(t=ao.geom.quadtree(M),i,a),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*s,l.y-=(l.py-(l.py=l.y))*s);c.tick({type:"tick",alpha:i})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(f=n,l):f},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.friction=function(n){return arguments.length?(s=+n,l):s},l.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(y=n*n,l):Math.sqrt(y)},l.alpha=function(n){return arguments.length?(n=+n,i?n>0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;i>l;++l)e[l]=[];for(l=0;c>l;++l){var u=x[l];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var o,a=e[t],l=-1,f=a.length;++l<f;)if(!isNaN(o=a[l][n]))return o;return Math.random()*r}var t,e,r,i=M.length,c=x.length,s=f[0],v=f[1];for(t=0;i>t;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;i>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",s)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof h)for(t=0;c>t;++t)u[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)u[t]=h;if(o=[],"function"==typeof p)for(t=0;c>t;++t)o[t]=+p.call(this,x[t],t);else for(t=0;c>t;++t)o[t]=p;if(a=[],"function"==typeof g)for(t=0;i>t;++t)a[t]=+g.call(this,M[t],t);else for(t=0;i>t;++t)a[t]=g;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=ao.behavior.drag().origin(m).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?void this.on("mouseover.force",ti).on("mouseout.force",ei).call(r):r},ao.rebind(l,c,"on")};var ml=20,Ml=1,xl=1/0;ao.layout.hierarchy=function(){function n(i){var u,o=[i],a=[];for(i.depth=0;null!=(u=o.pop());)if(a.push(u),(c=e.call(n,u,u.depth))&&(l=c.length)){for(var l,c,f;--l>=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return oi(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=ci,e=ai,r=li;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ui(t,function(n){n.children&&(n.value=0)}),oi(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ao.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++c<o;)n(a=u[c],e,l=a.value*r,i),e+=l}}function t(n){var e=n.children,r=0;if(e&&(i=e.length))for(var i,u=-1;++u<i;)r=Math.max(r,t(e[u]));return 1+r}function e(e,u){var o=r.call(this,e,u);return n(o[0],0,i[0],i[1]/t(o[0])),o}var r=ao.layout.hierarchy(),i=[1,1];return e.size=function(n){return arguments.length?(i=n,e):i},ii(e,r)},ao.layout.pie=function(){function n(o){var a,l=o.length,c=o.map(function(e,r){return+t.call(n,e,r)}),f=+("function"==typeof r?r.apply(this,arguments):r),s=("function"==typeof i?i.apply(this,arguments):i)-f,h=Math.min(Math.abs(s)/l,+("function"==typeof u?u.apply(this,arguments):u)),p=h*(0>s?-1:1),g=ao.sum(c),v=g?(s-l*p)/g:0,d=ao.range(l),y=[];return null!=e&&d.sort(e===bl?function(n,t){return c[t]-c[n]}:function(n,t){return e(o[n],o[t])}),d.forEach(function(n){y[n]={data:o[n],value:a=c[n],startAngle:f,endAngle:f+=a*v+p,padAngle:h}}),y}var t=Number,e=bl,r=0,i=Ho,u=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n.padAngle=function(t){return arguments.length?(u=t,n):u},n};var bl={};ao.layout.stack=function(){function n(a,l){if(!(h=a.length))return a;var c=a.map(function(e,r){return t.call(n,e,r)}),f=c.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),o.call(n,t,e)]})}),s=e.call(n,f,l);c=ao.permute(c,s),f=ao.permute(f,s);var h,p,g,v,d=r.call(n,f,l),y=c[0].length;for(g=0;y>g;++g)for(i.call(n,c[0][g],v=d[g],f[0][g][1]),p=1;h>p;++p)i.call(n,c[p][g],v+=f[p-1][g][1],f[p][g][1]);return a}var t=m,e=gi,r=vi,i=pi,u=si,o=hi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:_l.get(t)||gi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:wl.get(t)||vi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(i=t,n):i},n};var _l=ao.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(di),u=n.map(yi),o=ao.range(r).sort(function(n,t){return i[n]-i[t]}),a=0,l=0,c=[],f=[];for(t=0;r>t;++t)e=o[t],l>a?(a+=u[e],c.push(e)):(l+=u[e],f.push(e));return f.reverse().concat(c)},reverse:function(n){return ao.range(n.length).reverse()},"default":gi}),wl=ao.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,o=[],a=0,l=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;u>e;++e)l[e]=(a-o[e])/2;return l},wiggle:function(n){var t,e,r,i,u,o,a,l,c,f=n.length,s=n[0],h=s.length,p=[];for(p[0]=l=c=0,e=1;h>e;++e){for(t=0,i=0;f>t;++t)i+=n[t][e][1];for(t=0,u=0,a=s[e][0]-s[e-1][0];f>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;u+=o*n[t][e][1]}p[e]=l-=i?u/i*a:0,c>l&&(c=l)}for(e=0;h>e;++e)p[e]-=c;return p},expand:function(n){var t,e,r,i=n.length,u=n[0].length,o=1/i,a=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=o}for(e=0;u>e;++e)a[e]=0;return a},zero:vi});ao.layout.histogram=function(){function n(n,u){for(var o,a,l=[],c=n.map(e,this),f=r.call(this,c,u),s=i.call(this,f,c,u),u=-1,h=c.length,p=s.length-1,g=t?1:1/h;++u<p;)o=l[u]=[],o.dx=s[u+1]-(o.x=s[u]),o.y=0;if(p>0)for(u=-1;++u<h;)a=c[u],a>=f[0]&&a<=f[1]&&(o=l[ao.bisect(s,a,1,p)-1],o.y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=bi,i=Mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ao.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,oi(a,function(n){n.r=+f(n.value)}),oi(a,Ni),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;oi(a,function(n){n.r+=s}),oi(a,Ni),oi(a,function(n){n.r-=s})}return Ci(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=ao.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ao.layout.tree=function(){function n(n,i){var f=o.call(this,n,i),s=f[0],h=t(s);if(oi(h,e),h.parent.m=-h.z,ui(h,r),c)ui(s,u);else{var p=s,g=s,v=s;ui(s,function(n){n.x<p.x&&(p=n),n.x>g.x&&(g=n),n.depth>v.depth&&(v=n)});var d=a(p,g)/2-p.x,y=l[0]/(g.x+a(g,p)/2+d),m=l[1]/(v.depth||1);ui(s,function(n){n.x=(n.x+d)*y,n.y=n.depth*m})}return f}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var i,u=t.children,o=0,a=u.length;a>o;++o)r.push((u[o]=i={_:u[o],parent:t,children:(i=u[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Di(n);var u=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-u):n.z=u}else r&&(n.z=r.z+a(n._,r._));n.parent.A=i(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function i(n,t,e){if(t){for(var r,i=n,u=n,o=t,l=i.parent.children[0],c=i.m,f=u.m,s=o.m,h=l.m;o=Ti(o),i=qi(i),o&&i;)l=qi(l),u=Ti(u),u.a=n,r=o.z+s-i.z-c+a(o._,i._),r>0&&(Ri(Pi(o,n,e),n,r),c+=r,f+=r),s+=o.m,c+=i.m,h+=l.m,f+=u.m;o&&!Ti(u)&&(u.t=o,u.m+=s-f),i&&!qi(l)&&(l.t=i,l.m+=c-h,e=n)}return e}function u(n){n.x*=l[0],n.y=n.depth*l[1]}var o=ao.layout.hierarchy().sort(null).value(null),a=Li,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(c=null==(l=t)?u:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:u,n):c?l:null},ii(n,o)},ao.layout.cluster=function(){function n(n,u){var o,a=t.call(this,n,u),l=a[0],c=0;oi(l,function(n){var t=n.children;t&&t.length?(n.x=ji(t),n.y=Ui(t)):(n.x=o?c+=e(n,o):0,n.y=0,o=n)});var f=Fi(l),s=Hi(l),h=f.x-e(f,s)/2,p=s.x+e(s,f)/2;return oi(l,i?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(p-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),a}var t=ao.layout.hierarchy().sort(null).value(null),e=Li,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ao.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++i<u;)r=(e=n[i]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var o,a,l,c=s(e),f=[],h=u.slice(),g=1/0,v="slice"===p?c.dx:"dice"===p?c.dy:"slice-dice"===p?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),f.area=0;(l=h.length)>0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,v))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,v,c,!1),v=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,v,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(u>e&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0; + if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++u<o;)i=n[u],i.x=a,i.y=c,i.dy=f,a+=i.dx=Math.min(e.x+e.dx-a,f?l(i.area/f):0);i.z=!0,i.dx+=e.x+e.dx-a,e.y+=f,e.dy-=f}else{for((r||f>e.dx)&&(f=e.dx);++u<o;)i=n[u],i.x=a,i.y=c,i.dx=f,c+=i.dy=Math.min(e.y+e.dy-c,f?l(i.area/f):0);i.z=!1,i.dy+=e.y+e.dy-c,e.x+=f,e.dx-=f}}function u(r){var i=o||a(r),u=i[0];return u.x=u.y=0,u.value?(u.dx=c[0],u.dy=c[1]):u.dx=u.dy=0,o&&a.revalue(u),n([u],u.dx*u.dy/u.value),(o?e:t)(u),h&&(o=i),i}var o,a=ao.layout.hierarchy(),l=Math.round,c=[1,1],f=null,s=Oi,h=!1,p="squarify",g=.5*(1+Math.sqrt(5));return u.size=function(n){return arguments.length?(c=n,u):c},u.padding=function(n){function t(t){var e=n.call(u,t,t.depth);return null==e?Oi(t):Ii(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Ii(t,n)}if(!arguments.length)return f;var r;return s=null==(f=n)?Oi:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,u},u.round=function(n){return arguments.length?(l=n?Math.round:Number,u):l!=Number},u.sticky=function(n){return arguments.length?(h=n,o=null,u):h},u.ratio=function(n){return arguments.length?(g=n,u):g},u.mode=function(n){return arguments.length?(p=n+"",u):p},ii(u,a)},ao.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ao.random.normal.apply(ao,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ao.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ao.scale={};var Sl={floor:m,ceil:m};ao.scale.linear=function(){return Wi([0,1],[0,1],Mr,!1)};var kl={s:1,g:1,p:1,r:1,e:1};ao.scale.log=function(){return ru(ao.scale.linear().domain([0,1]),10,!0,[1,10])};var Nl=ao.format(".0e"),El={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ao.scale.pow=function(){return iu(ao.scale.linear(),1,[0,1])},ao.scale.sqrt=function(){return ao.scale.pow().exponent(.5)},ao.scale.ordinal=function(){return ou([],{t:"range",a:[[]]})},ao.scale.category10=function(){return ao.scale.ordinal().range(Al)},ao.scale.category20=function(){return ao.scale.ordinal().range(Cl)},ao.scale.category20b=function(){return ao.scale.ordinal().range(zl)},ao.scale.category20c=function(){return ao.scale.ordinal().range(Ll)};var Al=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Cl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),zl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),Ll=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ao.scale.quantile=function(){return au([],[])},ao.scale.quantize=function(){return lu(0,1,[0,1])},ao.scale.threshold=function(){return cu([.5],[0,1])},ao.scale.identity=function(){return fu([0,1])},ao.svg={},ao.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),f=o.apply(this,arguments)-Io,s=a.apply(this,arguments)-Io,h=Math.abs(s-f),p=f>s?0:1;if(n>c&&(g=c,c=n,n=g),h>=Oo)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,v,d,y,m,M,x,b,_,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(d=u===ql?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(d/c*Math.sin(y))),n&&(N=tn(d/n*Math.sin(y)))),c){m=c*Math.cos(f+E),M=c*Math.sin(f+E),x=c*Math.cos(s-E),b=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Fo?0:1;if(E&&yu(m,M,x,b)===p^C){var z=(f+s)/2;m=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else m=M=0;if(n){_=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Fo?0:1;if(N&&yu(_,w,S,k)===1-p^L){var q=(f+s)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Uo&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){v=c>n^p?0:1;var T=g,R=g;if(Fo>h){var D=null==S?[_,w]:null==x?[m,M]:Re([m,M],[S,k],[x,b],[_,w]),P=m-D[0],U=M-D[1],j=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*j+U*F)/(Math.sqrt(P*P+U*U)*Math.sqrt(j*j+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(g,(n-O)/(H-1)),T=Math.min(g,(c-O)/(H+1))}if(null!=x){var I=mu(null==S?[_,w]:[S,k],[m,M],c,T,p),Y=mu([x,b],[_,w],c,T,p);g===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-p^yu(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",p," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",m,",",M);if(null!=S){var Z=mu([m,M],[S,k],n,-R,p),V=mu([_,w],null==x?[m,M]:[x,b],n,-R,p);g===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",p^yu(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-p," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",m,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",p," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-p," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hu,r=pu,i=su,u=ql,o=gu,a=vu,l=du;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(i=En(t),n):i},n.padRadius=function(t){return arguments.length?(u=t==ql?ql:En(t),n):u},n.startAngle=function(t){return arguments.length?(o=En(t),n):o},n.endAngle=function(t){return arguments.length?(a=En(t),n):a},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Io;return[Math.cos(t)*n,Math.sin(t)*n]},n};var ql="auto";ao.svg.line=function(){return Mu(m)};var Tl=ao.map({linear:xu,"linear-closed":bu,step:_u,"step-before":wu,"step-after":Su,basis:zu,"basis-open":Lu,"basis-closed":qu,bundle:Tu,cardinal:Eu,"cardinal-open":ku,"cardinal-closed":Nu,monotone:Fu});Tl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Rl=[0,2/3,1/3,0],Dl=[0,1/3,2/3,0],Pl=[0,1/6,2/3,1/6];ao.svg.line.radial=function(){var n=Mu(Hu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wu.reverse=Su,Su.reverse=wu,ao.svg.area=function(){return Ou(m)},ao.svg.area.radial=function(){var n=Ou(Hu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ao.svg.chord=function(){function n(n,a){var l=t(this,u,n,a),c=t(this,o,n,a);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?i(l.r,l.p1,l.r,l.p0):i(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=a.call(n,i,r),o=l.call(n,i,r)-Io,f=c.call(n,i,r)-Io;return{r:u,a0:o,a1:f,p0:[u*Math.cos(o),u*Math.sin(o)],p1:[u*Math.cos(f),u*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Fo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=Me,o=xe,a=Iu,l=gu,c=vu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},ao.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yu;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ao.svg.diagonal.radial=function(){var n=ao.svg.diagonal(),t=Yu,e=n.projection;return n.projection=function(n){return arguments.length?e(Zu(t=n)):t},n},ao.svg.symbol=function(){function n(n,r){return(Ul.get(t.call(this,n,r))||$u)(e.call(this,n,r))}var t=Xu,e=Vu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Ul=ao.map({circle:$u,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Fl)),e=t*Fl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ao.svg.symbolTypes=Ul.keys();var jl=Math.sqrt(3),Fl=Math.tan(30*Yo);Co.transition=function(n){for(var t,e,r=Hl||++Zl,i=Ku(n),u=[],o=Ol||{time:Date.now(),ease:Nr,delay:0,duration:250},a=-1,l=this.length;++a<l;){u.push(t=[]);for(var c=this[a],f=-1,s=c.length;++f<s;)(e=c[f])&&Qu(e,f,i,r,o),t.push(e)}return Wu(u,i,r)},Co.interrupt=function(n){return this.each(null==n?Il:Bu(Ku(n)))};var Hl,Ol,Il=Bu(Ku()),Yl=[],Zl=0;Yl.call=Co.call,Yl.empty=Co.empty,Yl.node=Co.node,Yl.size=Co.size,ao.transition=function(n,t){return n&&n.transition?Hl?n.transition(t):n:ao.selection().transition(n)},ao.transition.prototype=Yl,Yl.select=function(n){var t,e,r,i=this.id,u=this.namespace,o=[];n=A(n);for(var a=-1,l=this.length;++a<l;){o.push(t=[]);for(var c=this[a],f=-1,s=c.length;++f<s;)(r=c[f])&&(e=n.call(r,r.__data__,f,a))?("__data__"in r&&(e.__data__=r.__data__),Qu(e,f,u,i,r[u][i]),t.push(e)):t.push(null)}return Wu(o,u,i)},Yl.selectAll=function(n){var t,e,r,i,u,o=this.id,a=this.namespace,l=[];n=C(n);for(var c=-1,f=this.length;++c<f;)for(var s=this[c],h=-1,p=s.length;++h<p;)if(r=s[h]){u=r[a][o],e=n.call(r,r.__data__,h,c),l.push(t=[]);for(var g=-1,v=e.length;++g<v;)(i=e[g])&&Qu(i,g,a,o,u),t.push(i)}return Wu(l,a,o)},Yl.filter=function(n){var t,e,r,i=[];"function"!=typeof n&&(n=O(n));for(var u=0,o=this.length;o>u;u++){i.push(t=[]);for(var e=this[u],a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return Wu(i,this.namespace,this.id)},Yl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(i){i[r][e].tween.set(n,t)})},Yl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?$r:Mr,a=ao.ns.qualify(n);return Ju(this,"attr."+n,t,a.local?u:i)},Yl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ao.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yl.style=function(n,e,r){function i(){this.style.removeProperty(n)}function u(e){return null==e?i:(e+="",function(){var i,u=t(this).getComputedStyle(this,null).getPropertyValue(n);return u!==e&&(i=Mr(u,e),function(t){this.style.setProperty(n,i(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ju(this,"style."+n,e,u)},Yl.styleTween=function(n,e,r){function i(i,u){var o=e.call(this,i,u,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,i)},Yl.text=function(n){return Ju(this,"text",n,Gu)},Yl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Yl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ao.ease.apply(ao,arguments)),Y(this,function(r){r[e][t].ease=n}))},Yl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,i,u){r[e][t].delay=+n.call(r,r.__data__,i,u)}:(n=+n,function(r){r[e][t].delay=n}))},Yl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,i,u){r[e][t].duration=Math.max(1,n.call(r,r.__data__,i,u))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Yl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var i=Ol,u=Hl;try{Hl=e,Y(this,function(t,i,u){Ol=t[r][e],n.call(t,t.__data__,i,u)})}finally{Ol=i,Hl=u}}else Y(this,function(i){var u=i[r][e];(u.event||(u.event=ao.dispatch("start","end","interrupt"))).on(n,t)});return this},Yl.transition=function(){for(var n,t,e,r,i=this.id,u=++Zl,o=this.namespace,a=[],l=0,c=this.length;c>l;l++){a.push(n=[]);for(var t=this[l],f=0,s=t.length;s>f;f++)(e=t[f])&&(r=e[o][i],Qu(e,f,o,u,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wu(a,o,u)},ao.svg.axis=function(){function n(n){n.each(function(){var n,c=ao.select(this),f=this.__chart__||e,s=this.__chart__=e.copy(),h=null==l?s.ticks?s.ticks.apply(s,a):s.domain():l,p=null==t?s.tickFormat?s.tickFormat.apply(s,a):m:t,g=c.selectAll(".tick").data(h,s),v=g.enter().insert("g",".domain").attr("class","tick").style("opacity",Uo),d=ao.transition(g.exit()).style("opacity",Uo).remove(),y=ao.transition(g.order()).style("opacity",1),M=Math.max(i,0)+o,x=Zi(s),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ao.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=y.select("line"),C=g.select("text").text(p),z=v.select("text"),L=y.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=no,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*u+"V0H"+x[1]+"V"+q*u)):(n=to,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*u+","+x[0]+"H0V"+x[1]+"H"+q*u)),E.attr(N,q*i),z.attr(k,q*M),A.attr(S,0).attr(N,q*i),L.attr(w,0).attr(k,q*M),s.rangeBand){var T=s,R=T.rangeBand()/2;f=s=function(n){return T(n)+R}}else f.rangeBand?f=s:d.call(n,s,f);v.call(n,f,s),y.call(n,s,s)})}var t,e=ao.scale.linear(),r=Vl,i=6,u=6,o=3,a=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xl?t+"":Vl,n):r},n.ticks=function(){return arguments.length?(a=co(arguments),n):a},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(i=+t,u=+arguments[e-1],n):i},n.innerTickSize=function(t){return arguments.length?(i=+t,n):i},n.outerTickSize=function(t){return arguments.length?(u=+t,n):u},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vl="bottom",Xl={top:1,right:1,bottom:1,left:1};ao.svg.brush=function(){function n(t){t.each(function(){var t=ao.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,m);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $l[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,s=ao.transition(t),h=ao.transition(o);c&&(l=Zi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(s)),f&&(l=Zi(f),h.attr("y",l[0]).attr("height",l[1]-l[0]),i(s)),e(s)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==ao.event.keyCode&&(C||(M=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function v(){32==ao.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function d(){var n=ao.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ao.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]<M[0])],L[1]=h[+(n[1]<M[1])]):M=null),E&&y(n,c,0)&&(r(k),t=!0),A&&y(n,f,1)&&(i(k),t=!0),t&&(e(k),w({type:"brush",mode:C?"move":"resize"}))}function y(n,t,e){var r,i,u=Zi(t),l=u[0],c=u[1],f=L[e],v=e?h:s,d=v[1]-v[0];return C&&(l-=f,c-=d+f),r=(e?g:p)?Math.max(l,Math.min(c,n[e])):n[e],C?i=(r+=f)+d:(M&&(f=Math.max(l,Math.min(c,2*M[e]-r))),r>f?(i=r,r=f):i=f),v[0]!=r||v[1]!=i?(e?a=null:o=null,v[0]=r,v[1]=i,!0):void 0}function m(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ao.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ao.select(ao.event.target),w=l.of(b,arguments),k=ao.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&f,C=_.classed("extent"),z=W(b),L=ao.mouse(b),q=ao.select(t(b)).on("keydown.brush",u).on("keyup.brush",v);if(ao.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",m):q.on("mousemove.brush",d).on("mouseup.brush",m),k.interrupt().selectAll("*").interrupt(),C)L[0]=s[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[s[1-T]-L[0],h[1-R]-L[1]],L[0]=s[T],L[1]=h[R]}else ao.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ao.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,l=N(n,"brushstart","brush","brushend"),c=null,f=null,s=[0,0],h=[0,0],p=!0,g=!0,v=Bl[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:s,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Hl?ao.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(s,t.x),r=xr(h,t.y);return o=a=null,function(i){s=t.x=e(i),h=t.y=r(i),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bl[!c<<1|!f],n):c},n.y=function(t){return arguments.length?(f=t,v=Bl[!c<<1|!f],n):f},n.clamp=function(t){return arguments.length?(c&&f?(p=!!t[0],g=!!t[1]):c?p=!!t:f&&(g=!!t),n):c&&f?[p,g]:c?p:f?g:null},n.extent=function(t){var e,r,i,u,l;return arguments.length?(c&&(e=t[0],r=t[1],f&&(e=e[0],r=r[0]),o=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),e==s[0]&&r==s[1]||(s=[e,r])),f&&(i=t[0],u=t[1],c&&(i=i[1],u=u[1]),a=[i,u],f.invert&&(i=f(i),u=f(u)),i>u&&(l=i,i=u,u=l),i==h[0]&&u==h[1]||(h=[i,u])),n):(c&&(o?(e=o[0],r=o[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),f&&(a?(i=a[0],u=a[1]):(i=h[0],u=h[1],f.invert&&(i=f.invert(i),u=f.invert(u)),i>u&&(l=i,i=u,u=l))),c&&f?[[e,i],[r,u]]:c?[e,r]:f&&[i,u])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!f&&h[0]==h[1]},ao.rebind(n,l,"on")};var $l={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wl=ga.format=xa.timeFormat,Jl=Wl.utc,Gl=Jl("%Y-%m-%dT%H:%M:%S.%LZ");Wl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?eo:Gl,eo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},eo.toString=Gl.toString,ga.second=On(function(n){return new va(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ga.seconds=ga.second.range,ga.seconds.utc=ga.second.utc.range,ga.minute=On(function(n){return new va(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ga.minutes=ga.minute.range,ga.minutes.utc=ga.minute.utc.range,ga.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new va(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ga.hours=ga.hour.range,ga.hours.utc=ga.hour.utc.range,ga.month=On(function(n){return n=ga.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ga.months=ga.month.range,ga.months.utc=ga.month.utc.range;var Kl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ql=[[ga.second,1],[ga.second,5],[ga.second,15],[ga.second,30],[ga.minute,1],[ga.minute,5],[ga.minute,15],[ga.minute,30],[ga.hour,1],[ga.hour,3],[ga.hour,6],[ga.hour,12],[ga.day,1],[ga.day,2],[ga.week,1],[ga.month,1],[ga.month,3],[ga.year,1]],nc=Wl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),tc={range:function(n,t,e){return ao.range(Math.ceil(n/e)*e,+t,e).map(io)},floor:m,ceil:m};Ql.year=ga.year,ga.scale=function(){return ro(ao.scale.linear(),Ql,nc)};var ec=Ql.map(function(n){return[n[0].utc,n[1]]}),rc=Jl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);ec.year=ga.year.utc,ga.scale.utc=function(){return ro(ao.scale.linear(),ec,rc)},ao.text=An(function(n){return n.responseText}),ao.json=function(n,t){return Cn(n,"application/json",uo,t)},ao.html=function(n,t){return Cn(n,"text/html",oo,t)},ao.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=ao,define(ao)):"object"==typeof module&&module.exports?module.exports=ao:this.d3=ao}();},{}], + 2:[function(require,module,exports){ + "use strict"; + + var d3 = require('d3'); + + //aigner: functions for drawing expand- and collapse-symbols + function drawExpandSymbol(aCircle, line1, line2) + { + aCircle = aCircle + .attr("r", 10) + .style("stroke", "black") + .style("stroke-width", 2) + .style("fill", "#99CC00") + .style("fill-opacity", .6) + line1 = line1 + .attr("x1", parseFloat(aCircle.attr("cx"))-5) + .attr("y1", parseFloat(aCircle.attr("cy"))) + .attr("x2", parseFloat(aCircle.attr("cx"))+5) + .attr("y2", parseFloat(aCircle.attr("cy"))) + .style("stroke", "black") + .style("stroke-width", 2); + line2 = line2 + .attr("x1", parseFloat(aCircle.attr("cx"))) + .attr("y1", parseFloat(aCircle.attr("cy"))-5) + .attr("x2", parseFloat(aCircle.attr("cx"))) + .attr("y2", parseFloat(aCircle.attr("cy"))+5) + .style("stroke", "black") + .style("stroke-width", 2); + } + function drawRemoveSymbol(anXdsm, aCircle, aMinus) + { + var xOffset=150; + var yOffset=12; + aCircle = aCircle + .attr("cx", anXdsm.svg.attr("width")-xOffset) + .attr("cy", yOffset) + .attr("r", 10) + .classed("remCircle",true) + aMinus = aMinus + .attr("x1", anXdsm.svg.attr("width")-xOffset+5) + .attr("y1", yOffset) + .attr("x2", anXdsm.svg.attr("width")-xOffset-5) + .attr("y2", yOffset) + .classed("remMinus",true) + } + //d3-context-menu for right-click-option + d3.contextMenu = function (menu, openCallback) { + + // create the div element that will hold the context menu + d3.selectAll('.d3-context-menu').data([1]) + .enter() + .append('div') + .attr('class', 'd3-context-menu'); + + // close menu + d3.select('body').on('click.d3-context-menu', function() { + d3.select('.d3-context-menu').style('display', 'none'); + }); + + // this gets executed when a contextmenu event occurs + return function(data, index) { + var elm = this; + + d3.selectAll('.d3-context-menu').html(''); + var list = d3.selectAll('.d3-context-menu').append('ul'); + list.selectAll('li').data(menu).enter() + .append('li') + .html(function(d) { + return d.title; + }) + .on('mousedown', function(d, i) { + d.onMouseDown(elm, data, index); + }) + .on('mouseup', function(d, i) { + d.onMouseUp(elm, data, index); + d3.select('.d3-context-menu').style('display', 'none'); + }) + .on('mouseenter',function(d,i){ + d.onMouseOver(elm,data,index); + if(d.childrenItems.length>0 ) + { + var li = this + d3.select(this).selectAll("ul").remove(); + d3.select(this) + .append("ul") + .style("top",String(li.offsetTop-5)+"px") + .selectAll("li") + .data(d.childrenItems) + .enter().append("li") + .text(function(d) { return d.title; }) + .on("mouseenter", function(d,i){ + d.onMouseOver(elm,data,index); + }) + .on('click', function(d, i) { + d.onMouseClick(elm, d, index); + }) + .on('mouseleave',function(d,i){ + + }); + } + else + return false; + }) + .on('mouseleave',function(d,i){ + d3.select(this).selectAll("ul").style('display', 'none') + }); + + + + // the openCallback allows an action to fire before the menu is displayed + // an example usage would be closing a tooltip + if (openCallback) openCallback(data, index); + + // display context menu + d3.select('.d3-context-menu') + .style('left', (d3.event.pageX - 2) + 'px') + .style('top', (d3.event.pageY - 2) + 'px') + .style('display', 'block'); + + //Prevent the default event, which is the left-click. + //This means, the context-menu will only appear on right mouse clicks + d3.event.preventDefault(); + + //Place context-menu always on top of everything esle + d3.select(".d3-context-menu").style("z-index",Number.MAX_SAFE_INTEGER); + }; + }; + + function tabulate(aTable,data,columns) { + var thead = aTable.append('thead'); + var tbody = aTable.append('tbody'); + + // create a row for each object in the data + var rows = tbody.selectAll('tr') + .data(data) + .enter() + .append('tr'); + + // create a cell in each row for each column + var cells = rows.selectAll('td') + .data(function (row) { + return columns.map(function (column) { + return {column: column, value: row[column]}; + }); + }) + .enter() + .append('td') + .html(function (d) { return d.value; }); + + return aTable; + } + + //aigner: Move to front function + d3.selection.prototype.moveToFront = function() { + return this.each(function(){ + this.parentNode.appendChild(this); + }); + }; + //aigner: Move to back function + d3.selection.prototype.moveToBack = function() { + return this.each(function() { + var firstChild = this.parentNode.firstChild; + if (firstChild) { + this.parentNode.insertBefore(this, firstChild); + } + }); + }; + + + var diameter = 1500, + radius = diameter / 2, + innerRadius = radius - 250; + + var cluster = d3.layout.cluster() + .size([360, innerRadius]) + .sort(null) + .value(function(d) { return d.size; }); + + var bundle = d3.layout.bundle(); + + var line = d3.svg.line.radial() + .interpolate("bundle") + .tension(0.5) + .radius(function(d) { return d.y; }) + .angle(function(d) { return d.x / 180 * Math.PI; }); + + var svg = d3.select("body").append("div").attr("class","edgeBundlesDiv") + svg = svg.append("svg") + .attr("class","circleSvg") + .attr("width", 10000) + .attr("height", 10000) + .append("g") + .attr("transform", "translate(" + radius*1.2 + "," + radius*1.2+ ")"); + + var width = diameter*1.5; + var imgWidth = width; + + var link = svg.append("g").selectAll(".edgeBundlesLink"), + invisibleLink = svg.append("g").selectAll(".invisibleLink"), + node = svg.append("g").selectAll(".edgeBundlesNode"); + + //aigner: Here the data is read and the edge bundles is created + //################################################################################################// + function startEdgeBundles(data, graphID) + { + var graphs, currentGraph, varCategories; + + graphs = data.graphs; + for (var i=0;i<graphs.length;i++) + { + if (graphs[i].id==graphID) + { + currentGraph = graphs[i] + } + } + + varCategories = data.categories; + var classes = currentGraph.edgeBundles; + + //Highlight function, that shows usage of a node in the XDSM + function highlight(data) + { + var xPath = data.xPath + var allLinks = d3.selectAll(".edgeBundlesLink"); + allLinks[0].forEach(function(aLink) + { + + aLink.__data__.pipeData_in = aLink.__data__.source.pipeline_data[aLink.__data__.target.name]; + aLink.__data__.pipeData_out = aLink.__data__.target.pipeline_data[aLink.__data__.source.name]; + aLink.__data__.pipeDataName_in = ""; + aLink.__data__.pipeDataName_out = ""; + aLink.__data__.name = ""; + if (aLink.__data__.pipeData_in) + { + for (var i=0; i<aLink.__data__.pipeData_in.length; i++) + { + if (i==0){aLink.__data__.pipeDataName_in += aLink.__data__.pipeData_in[i];} + else{aLink.__data__.pipeDataName_in += "," + aLink.__data__.pipeData_in[i];} + + } + aLink.__data__.name += aLink.__data__.pipeDataName_in + } + if (aLink.__data__.pipeData_out) + { + for (var i=0; i<aLink.__data__.pipeData_out.length; i++) + { + if (i==0){aLink.__data__.pipeDataName_out += aLink.__data__.pipeData_out[i];} + else{aLink.__data__.pipeDataName_out += "," + aLink.__data__.pipeData_out[i];} + } + aLink.__data__.name += aLink.__data__.pipeDataName_out + } + }) + + allLinks[0].forEach(function(p) { + var firstElement_tmp = p.__data__.name.split("/")[1] + var xPath_fromFirst = "/"+firstElement_tmp+xPath.split(firstElement_tmp)[1] + var p_name_list = p.__data__.name.split(",") + var highlight_on = false + p_name_list.forEach(function(p_name) + { + if (include(p_name+"__",xPath_fromFirst+"__") || include(p_name,xPath_fromFirst+"/")) + { + highlight_on = true + } + }) + if (highlight_on) + { + d3.select(p).style("stroke-opacity", 1.5) + } + else + { + d3.select(p).style("stroke-opacity", 0); + } + }); + } + + function showVariableTable(aVariable) + { + + var headLine = "Node Information (" + aVariable.name + ")"; + var data = []; + // render the table(s) + data.push({ "name" : "Name", "value" : "\""+aVariable.name+"\"" }) + data.push({ "name" : "xPath", "value" : aVariable.xPath }) + if (aVariable.type){data.push({ "name" : "Type", "value" : aVariable.type })} + if (aVariable.level){data.push({ "name" : "Level", "value" : aVariable.level })} + if (aVariable.children || aVariable._children) + { + var childrenNum=0; + if (aVariable.children){childrenNum=childrenNum+aVariable.children.length} + if (aVariable._children){childrenNum=childrenNum+aVariable._children.length} + data.push({ "name" : "Number of children", "value" : childrenNum }) + } + if (aVariable.dimension){data.push({ "name" : "Dimension", "value" : aVariable.dimension })} + else if(aVariable.dimension===null){data.push({ "name" : "Dimension", "value" : "undefined" })} + if (aVariable.value){data.push({ "name" : "Value(s)", "value" : aVariable.value })} + + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + + //menu --> functions for right click options + var nodeMenu = [ + { + title: 'Show node information', + onMouseDown: function(elm, d, i) { + showVariableTable(d); + }, + onMouseUp: function(elm, d, i) {}, + onMouseOver: function(elm, d, i) {}, + childrenItems: [] + }, + { + title: 'Show usage of node in diagram', + onMouseDown: function(elm, d, i) { + d3.selectAll(".treeFrame").attr("fill-opacity", .5); + d3.selectAll(".nodeText").style("fill-opacity", 0.5); + highlight(d); + }, + onMouseUp: function(elm, d, i) { + d3.selectAll(".edgeBundlesLink") + .style("stroke-opacity",.4) + d3.selectAll(".treeFrame").attr("fill-opacity", .8); + d3.selectAll(".nodeText").style("fill-opacity", 1); + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Copy x-path to clipboard', + onMouseDown: function(elm, d, i) { + window.prompt("Copy to clipboard: Ctrl+C, Enter", d.xPath); + d3.select('.d3-context-menu').style('display', 'none'); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + } + ] + + //################################################################################################// + var headerDiv = d3.select(".edgeBundlesDiv").append("div").attr("class","panel panel-primary") + headerDiv.append("div").attr("class","panel-heading text-center") + .append("h3") + .attr("class","panel-title") + .style("font-family","Arial") + .style("font-size","20pt") + .text("Edge Bundles View") + var name_tmp=""; + if (currentGraph.name){name_tmp=currentGraph.name} + else{name_tmp="Graph " + currentGraph.id} + headerDiv.append("div").attr("class","panel-body") + .style("font-family","Arial") + .style("font-size","16pt") + .text("Graph name: " + name_tmp) + headerDiv.append("div").attr("class","panel-body") + .style("font-family","Arial") + .style("font-size","16pt") + .text("Graph description: " + currentGraph.description) + //################################################################################################// + + //aigner: Tree option menu to select which kind of tree view the user wants to see + //#####################################################################// + function showFullTree(categoryID, categoryDescr) + { + var name_tmp = "Full data model tree view; Categorization: " + categoryDescr; + var emptyArray=""; + var allLinks = d3.selectAll(".edgeBundlesLink"); + var theSchema = currentGraph.variableSchemes[categoryID]; + createTreeLayout(name_tmp,theSchema,emptyArray,allLinks,nodeMenu); + } + + var childrenItems = []; + for (var j=0; j< varCategories.length; j++) + { + childrenItems.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, d, i) {showFullTree(d.varCategory,d.description)}, + onMouseOver: function(elm,d,i){}}) + } + var treeOptionMenu = [ + { + title: 'Show variable tree...', + onMouseDown: function(elm, d, i) { + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: childrenItems + } + ] + + + function showList(aTitle,aList,aMenu) + { + if (aList.length != 0) + { + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(aTitle) + panel_div.append("input") + .attr("id","myInput") + .attr("placeholder","Filter search...") + .attr("title","Type in a name") + .attr("onkeyup","filterSearch()") + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + var tr = listGroup + .selectAll('tr') + .data(aList).enter() + .append('tr') + var td = tr.append("td").html(function(d) { + if (d.xPath){return d.xPath;} + else {return d.name;} + }) + tr.on('contextmenu', d3.contextMenu(aMenu)); + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + $('.myPanel').lobiPanel('height','5000'); + } + } + + //aigner: Data Model Tree View Button + //#################################################################################################################### + var dataModelDiv = d3.select(".edgeBundlesDiv").append("div").attr("class","dataModelDiv").attr("transform","translate(10,0)") + var ul = dataModelDiv.append("ul") + var dropdown1 = ul.append("li").on("mouseover", function(){d3.select(this).style("cursor", "default")}) + dropdown1.append("img").attr("src",fileReference.AGILE_Icon) + .attr("align","left") + .style("margin-left","6px") + .style("margin-right","-10px") + .style("margin-top","10px") + .style("margin-bottom","0px") + .attr("height","20") + .attr("width","20") + dropdown1.append("a").text("Data Model Tree") + var links = dropdown1.append("ul"); + var xOffset_ul = dropdown1[0][0].offsetLeft+dropdown1[0][0].offsetWidth-40; + links.style("left", String(xOffset_ul)+"px") + for (var j=0; j< varCategories.length; j++) + { + //console.log(varCategories[j]) + var linkLi = links.append("li"); + var linkA = linkLi.append("a") + .attr("id",j) + .text(varCategories[j].description) + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click", function() + { + showFullTree(varCategories[this.id].name,varCategories[this.id].description) + }) + } + //aigner: Set width of the div, so the VISTOMS dropdown (in the top of the page) still works + //dataModelDiv.style("width", String(dropdown1.node().getBoundingClientRect().width+20)+"px") + //#################################################################################################################### + + //aigner: Data Model List View Button + //#################################################################################################################### + var ul_list = dataModelDiv.append("ul") + var dropdownList = ul_list.append("li").on("mouseover", function(){d3.select(this).style("cursor", "default")}) + dropdownList.append("img").attr("src",fileReference.AGILE_Icon) + .attr("align","left") + .style("margin-left","6px") + .style("margin-right","-10px") + .style("margin-top","10px") + .style("margin-bottom","0px") + .attr("height","20") + .attr("width","20") + dropdownList.append("a").text("Data Model List") + var linksList = dropdownList.append("ul"); + var xOffset_ul = dropdownList[0][0].offsetLeft+dropdownList[0][0].offsetWidth-40; + linksList.style("left", String(xOffset_ul)+"px") + for (var j=0; j< varCategories.length; j++) + { + //console.log(varCategories[j]) + var linkLi = linksList.append("li"); + var linkA = linkLi.append("a") + .attr("id",j) + .text(varCategories[j].description) + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click", function() + { + var variables = JSON.parse(JSON.stringify(currentGraph.variableSchemes[varCategories[this.id].name])); + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + var title = "List view: full variable set categorized according to " + varCategories[this.id].description + showList(title,variables,nodeMenu) + }) + } + //aigner: Set width of the div, so the VISTOMS dropdown (in the top of the page) still works + //#################################################################################################################### + + + //aigner: legend + //################################################################################################// + // var legendDiv = d3.select("body").append("div").attr("class","legendDiv"); + // var legendSVG = legendDiv.append("svg").attr("width",1000).attr("height",200); + // var legend = legendSVG.append("g") + // .attr("class", "legend") + // .attr("transform", "translate(38,12)"); + // var legendFrame = legend.append("rect") + // .attr("x",-28) + // .attr("height", 150) + // .attr("width", 400) + // .attr("fill", "none") + // .attr("stroke", "#8888") + // .attr("stroke-width", 3) + // legend.append("text") + // .attr("transform", "translate(-20,24)") + // .attr("font-family","Arial") + // .attr("font-size","16pt") + // .attr("font-weight",700) + // .attr("fill","black") + // .text("Legend") + // legend.append("line") + // .attr("x1", -20) + // .attr("y1", 50) + // .attr("x2", 20) + // .attr("y2", 50) + // .style("stroke", "#CC0000") + // .style("stroke-width", 5); + // legend.append("line") + // .attr("x1", -20) + // .attr("y1", 90) + // .attr("x2", 20) + // .attr("y2", 90) + // .style("stroke", "#99CC00") + // .style("stroke-width", 5); + // legend.append("text") + // .attr("transform", "translate(30,56)") + // .attr("font-family","Arial") + // .attr("font-size","12pt") + // .attr("fill","black") + // .text("Input") + // legend.append("text") + // .attr("transform", "translate(30,96)") + // .attr("font-family","Arial") + // .attr("font-size","12pt") + // .attr("fill","black") + // .text("Output") + + //################################################################################################// + + + //d3.select(".legendDiv").moveToBack() + d3.select(".dataModelDiv").moveToBack() + headerDiv.moveToBack() + d3.select(".generalPaneDiv").moveToBack() + d3.select(".navigationBarDiv").moveToBack() + d3.select(".visPackDiv").moveToBack() + + + var nodes = cluster.nodes(packageHierarchy(classes)); + var links = packageImports(nodes); + + links.forEach(function(d) + { + d.pipeData_in = d.source.pipeline_data[d.target.name]; + d.pipeData_out = d.target.pipeline_data[d.source.name]; + d.pipeDataName_in = ""; + d.pipeDataName_out = ""; + if (d.pipeData_in) + { + for (var i=0; i<d.pipeData_in.length; i++) + { + d.pipeDataName_in += "," + d.pipeData_in[i]; + } + } + if (d.pipeData_out) + { + for (var i=0; i<d.pipeData_out.length; i++) + { + d.pipeDataName_out += "," + d.pipeData_out[i]; + } + + } + }) + + link = link + .data(bundle(links)) + .enter().append("path") + .each(function(d) { + d.source = d[0]; + d.target = d[d.length - 1];}) + .attr("class", "edgeBundlesLink") + .attr("d", line) + + + + invisibleLink = invisibleLink + .data(bundle(links)) + .enter().append("path") + .each(function(d) { + d.source = d[0]; + d.target = d[d.length - 1]; + d.createNew = true;}) + .attr("class", "invisibleLink") + .attr("d", line) + + + function showLinkTree(aLink,aVarCategory, aCategoryDescr) + { + var theSchema = currentGraph.variableSchemes[aVarCategory]; + var name_tmp = "Variable flow: " + aLink.__data__.source.name + " → " + aLink.__data__.target.name + "; Categorization: " + aCategoryDescr; + createTreeLayout(name_tmp,theSchema,aLink.__data__,link,nodeMenu); + } + + function showEdgeTable(aLink) + { + aLink.pipeData_in = aLink.source.pipeline_data[aLink.target.name]; + aLink.pipeData_out = aLink.target.pipeline_data[aLink.source.name]; + aLink.pipeDataName_in = ""; + aLink.pipeDataName_out = ""; + aLink.name = ""; + if (aLink.pipeData_in) + { + for (var i=0; i<aLink.pipeData_in.length; i++) + { + if (i==0){aLink.pipeDataName_in += aLink.pipeData_in[i];} + else{aLink.pipeDataName_in += "," + aLink.pipeData_in[i];} + + } + aLink.name += aLink.pipeDataName_in + } + if (aLink.pipeData_out) + { + for (var i=0; i<aLink.pipeData_out.length; i++) + { + if (i==0){aLink.pipeDataName_out += aLink.pipeData_out[i];} + else{aLink.pipeDataName_out += "," + aLink.pipeData_out[i];} + } + aLink.name += aLink.pipeDataName_out + } + + + var headLine = "Edge Information (" + aLink.source.key + " - " + aLink.target.key + ")"; + var pipeData_in = aLink.pipeDataName_in; + var pipeData_out = aLink.pipeDataName_in; + var theLeafNodes_in = JSON.parse(JSON.stringify(currentGraph.variableSchemes[varCategories[0].name])); + var theLeafNodes_out = JSON.parse(JSON.stringify(currentGraph.variableSchemes[varCategories[0].name])); + prune_tree(pipeData_in,theLeafNodes_in) + prune_tree(pipeData_out,theLeafNodes_out) + + var nullDim_in=false; + var dimension_in=0; + var undefLeafsNumber_in=0; + var defLeafsNumber_in=0; + var nullDim_out=false; + var dimension_out=0; + var undefLeafsNumber_out=0; + var defLeafsNumber_out=0; + function getUndefinedLeafNodes(theLeafNodes,defLeafsNumber,undefLeafsNumber,dimenson,nullDim) + { + for (var k=0;k<theLeafNodes.length;k++) + { + if (theLeafNodes[k].dimension!=null){dimension = dimension+theLeafNodes[k].dimension} + else{nullDim=true} + if (theLeafNodes[k].value.includes("could not be found")||theLeafNodes[k].value.includes("unknown")) + { + undefLeafsNumber ++; + } + else + { + defLeafsNumber++; + } + } + } + getUndefinedLeafNodes(theLeafNodes_in,defLeafsNumber_in,undefLeafsNumber_in,dimension_in,nullDim_in) + getUndefinedLeafNodes(theLeafNodes_out,defLeafsNumber_out,undefLeafsNumber_out,dimension_out,nullDim_out) + //Render data for table + var data = []; + data.push({ "name" : "Total number of connections", "value" : aLink.pipeDataName_in.split(",").length+aLink.pipeDataName_out.split(",").length }) + + data.push({ "name" : "Total number of incoming connections", "value" : aLink.pipeDataName_in.split(",").length }) + data.push({ "name" : "Number of referenced incoming connections", "value" : defLeafsNumber_in }) + data.push({ "name" : "Dimension of referenced outgoing connections", "value" : String(dimension_in) }) + if (undefLeafsNumber_in>0) + { + data.push({ "name" : "Number of unreferenced incoming connections", "value" : undefLeafsNumber_in}) + } + + data.push({ "name" : "Total number of outgoing connections", "value" : aLink.pipeDataName_out.split(",").length }) + data.push({ "name" : "Number of referenced outgoing connections", "value" : defLeafsNumber_out }) + data.push({ "name" : "Dimension of referenced outgoing connections", "value" : String(dimension_out) }) + if (undefLeafsNumber_out>0) + { + data.push({ "name" : "Number of unreferenced incoming connections", "value" : undefLeafsNumber_out}) + } + + + var d3_body = d3.select("body"); + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + + //linkMenu --> functions for right click options + var linkChildrenItemsTree = []; + for (var j=0; j< varCategories.length; j++) + { + linkChildrenItemsTree.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) {showLinkTree(elm,data.varCategory,data.description)}, + onMouseOver: function(elm,data,i){}}); + } + var linkChildrenItemsList = []; + for (var j=0; j< varCategories.length; j++) + { + linkChildrenItemsList.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) { + var title = "List view of variable flow: " + elm.__data__.source.id + " → " + elm.__data__.target.id + "; Categorization: " + data.description; + var variables = prepareTreeData(currentGraph.variableSchemes[data.varCategory],elm.__data__) + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + + showList(title,variables,nodeMenu); + }, + onMouseOver: function(elm,data,i){}}); + } + + var linkMenu = [ + { + title: 'Show edge info', + onMouseDown: function(elm, k, i) { + showEdgeTable(k) + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Show variable tree...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: linkChildrenItemsTree + }, + { + title: 'Show variable list...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: linkChildrenItemsList + } + ] + invisibleLink.append("svg:title").text("Click right to inspect") + invisibleLink + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on('contextmenu', d3.contextMenu(linkMenu)); + + //aigner: CAUTION, HACK --> delete the obsolete object that contains duplicate information + nodes.forEach(function(aNode,i) + { + if (aNode.children) + { + var index = nodes.indexOf(aNode); + if (index > -1) + { + nodes.splice(index, 1); + } + } + }); + + //aigner: Create the nodes in a circular view + node = node + .data(nodes) + .enter().append("text") + .attr("class", "edgeBundlesNode") + .attr("dy", ".31em") + .attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + (d.y + 8) + ",0)" + (d.x < 180 ? "" : "rotate(180)"); }) + .style("text-anchor", function(d) { return d.x < 180 ? "start" : "end"; }) + .style("font-family","Arial") + .style("font-size","16pt") + .text(function(d) { return d.name; }) + .on("mouseover", nodeMouseovered) + .on("mouseout", nodeMouseouted); + + //aigner: Right click options for tools + //############################################################################################################################## + //aigner: assign additional node information to nodes coming from xdsm information + var theXDSM = currentGraph.xdsm; + nodes.forEach(function(aNode,i) + { + var xdsmNodes = theXDSM.nodes; + for (var i=0; i< xdsmNodes.length; i++) + { + var xdsmNode = xdsmNodes[i]; + if (xdsmNode.name == aNode.name) + { + aNode.id = xdsmNode.id; + aNode.metadata = xdsmNode.metadata; + aNode.type = xdsmNode.type; + } + } + }); + + //aigner: Table for competence/tool information + //############################################################ + function showToolTable(aTool) + { + var aToolNameSplit = aTool.name.split(': ') + var headLine; + if (aToolNameSplit.length>1){headLine = "Competence Information: (" + aToolNameSplit[1] + ")";} + else {headLine = "Competence Information: (" + aToolNameSplit[0] + ")";} + + + var data = []; + // render the table(s) + if (aTool.metadata.length==0) + { + data.push({ "name" : "NO TOOL METADATA AVAILABLE", "value" : "..." }) + } + function findSubMetaData(aMetaData) + { + for(var key in aMetaData) + { + if (typeof aMetaData[key] === 'object') + { + data.push({ "name" : key, "value" : ''}) ; + findSubMetaData(aMetaData[key]); + } + else + { + data.push({ "name" : key, "value" : aMetaData[key] }) + } + } + } + for (var j=0; j < aTool.metadata.length;j++) + { + var metaData = aTool.metadata[j]; + findSubMetaData(metaData); + } + + + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + //############################################################ + + //aigner: Creation of input/output tree + //############################################################ + function showIOTree(categoryName, categoryDescr, theNode, io) + { + var links = d3.selectAll(".edgeBundlesLink")[0]; + var array={name_in:"",name_out:"",name:""}; + var name_tmp = ""; + + links.forEach(function(d) + { + var theLink = d.__data__; + + + var pipeData_in = theLink.source.pipeline_data[theLink.target.name]; + var pipeData_out = theLink.target.pipeline_data[theLink.source.name]; + if (!pipeData_in){pipeData_in = [];} + if (!pipeData_out){pipeData_out = [];} + theLink.pipeData_in = theLink.source.pipeline_data[theLink.target.name]; + theLink.pipeData_out = theLink.target.pipeline_data[theLink.source.name]; + theLink.name_in = ""; + theLink.name_out = ""; + theLink.name = ""; + if (theLink.pipeData_in) + { + for (var i=0; i<theLink.pipeData_in.length; i++) + { + if (i==0){theLink.name_in += theLink.pipeData_in[i];} + else{theLink.name_in += "," + theLink.pipeData_in[i];} + + } + theLink.name += theLink.name_in + } + if (theLink.pipeData_out) + { + for (var i=0; i<theLink.pipeData_out.length; i++) + { + if (i==0){theLink.name_out += theLink.pipeData_out[i];} + else{theLink.name_out += "," + theLink.pipeData_out[i];} + } + theLink.name += theLink.name_out + } + + if (io=="in") + { + if (theLink.target == theNode) + { + if (array.name_in == ""){array.name_in +=theLink.name_out;} + else{array.name_in += "," + theLink.name_out;} + array.name_out = ""; + array.name = array.name_in; + } + if (theLink.source == theNode) + { + if (array.name_in == ""){array.name_in +=theLink.name_in;} + else{array.name_in += "," + theLink.name_in;} + array.name_out = ""; + array.name = array.name_in; + } + name_tmp = "Input tree view: " + theNode.id + "; Categorization: " + categoryDescr; + } + else if (io=="out") + { + if (theLink.source == theNode) + { + if (array.name_out == ""){array.name_out +=theLink.name_out;} + else{array.name_out += "," + theLink.name_out;} + array.name_in = ""; + array.name = array.name_out; + } + if (theLink.target == theNode) + { + if (array.name_out == ""){array.name_out +=theLink.name_in;} + else{array.name_out += "," + theLink.name_in;} + array.name_in = ""; + array.name = array.name_out; + } + name_tmp = "Output tree view: " + theNode.id + "; Categorization: " + categoryDescr; + } + }) + var theSchema = currentGraph.variableSchemes[categoryName] + createTreeLayout(name_tmp,theSchema,array,link,nodeMenu) + } + //############################################################ + + //aigner: Creation of input/output list + //############################################################ + function prepareIOList(theNode, io) + { + var links = d3.selectAll(".edgeBundlesLink")[0]; + var array={name_in:"",name_out:"",name:""}; + + links.forEach(function(d) + { + var theLink = d.__data__; + + + var pipeData_in = theLink.source.pipeline_data[theLink.target.name]; + var pipeData_out = theLink.target.pipeline_data[theLink.source.name]; + if (!pipeData_in){pipeData_in = [];} + if (!pipeData_out){pipeData_out = [];} + theLink.pipeData_in = theLink.source.pipeline_data[theLink.target.name]; + theLink.pipeData_out = theLink.target.pipeline_data[theLink.source.name]; + theLink.name_in = ""; + theLink.name_out = ""; + theLink.name = ""; + if (theLink.pipeData_in) + { + for (var i=0; i<theLink.pipeData_in.length; i++) + { + if (i==0){theLink.name_in += theLink.pipeData_in[i];} + else{theLink.name_in += "," + theLink.pipeData_in[i];} + + } + theLink.name += theLink.name_in + } + if (theLink.pipeData_out) + { + for (var i=0; i<theLink.pipeData_out.length; i++) + { + if (i==0){theLink.name_out += theLink.pipeData_out[i];} + else{theLink.name_out += "," + theLink.pipeData_out[i];} + } + theLink.name += theLink.name_out + } + + if (io=="in") + { + if (theLink.target == theNode) + { + if (array.name_in == ""){array.name_in +=theLink.name_out;} + else{array.name_in += "," + theLink.name_out;} + array.name_out = ""; + array.name = array.name_in; + } + if (theLink.source == theNode) + { + if (array.name_in == ""){array.name_in +=theLink.name_in;} + else{array.name_in += "," + theLink.name_in;} + array.name_out = ""; + array.name = array.name_in; + } + } + else if (io=="out") + { + if (theLink.source == theNode) + { + if (array.name_out == ""){array.name_out +=theLink.name_out;} + else{array.name_out += "," + theLink.name_out;} + array.name_in = ""; + array.name = array.name_out; + } + if (theLink.target == theNode) + { + if (array.name_out == ""){array.name_out +=theLink.name_in;} + else{array.name_out += "," + theLink.name_in;} + array.name_in = ""; + array.name = array.name_out; + } + } + }) + return array; + } + //############################################################ + + var inputChildrenitemsTree = []; + var outputChildrenitemsTree = []; + for (var j=0; j< varCategories.length; j++) + { + inputChildrenitemsTree.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) {showIOTree(data.varCategory,data.description,elm.__data__,"in")}, + onMouseOver: function(elm,data,i){}}); + outputChildrenitemsTree.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) {showIOTree(data.varCategory,data.description,elm.__data__,"out")}, + onMouseOver: function(elm,data,i){}}); + } + var inputChildrenitemsList = []; + var outputChildrenitemsList = []; + for (var j=0; j< varCategories.length; j++) + { + inputChildrenitemsList.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) { + var array = prepareIOList(elm.__data__,"in") + var variables = prepareTreeData(currentGraph.variableSchemes[data.varCategory],array) + var title = "List view of all inputs for " + elm.__data__.id + "; Categorization: " + data.description; + showList(title,variables,nodeMenu) + }, + onMouseOver: function(elm,data,i){}}); + outputChildrenitemsList.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) { + var array = prepareIOList(elm.__data__,"out") + var variables = prepareTreeData(currentGraph.variableSchemes[data.varCategory],array) + var title = "List view of all outputs from " + elm.__data__.id + "; Categorization: " + data.description; + showList(title,variables,nodeMenu) + }, + onMouseOver: function(elm,data,i){}}); + } + //menu --> functions for right click options + var toolMenu = [ + { + title: 'Show competence info', + onMouseDown: function(elm, k, i) { + showToolTable(k); + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Show input variable tree...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: inputChildrenitemsTree + }, + { + title: 'Show output variable tree...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: outputChildrenitemsTree + }, + { + title: 'Show input variable list...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: inputChildrenitemsList + }, + { + title: 'Show output variable list...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: outputChildrenitemsList + } + ] + + node.on('contextmenu', d3.contextMenu(toolMenu)); + //############################################################################################################################## + }; + startEdgeBundles(data,graphID); + + function nodeMouseovered(d) { + d3.select(this).append("svg:title").text("Click right to inspect"); + d3.select(this).style("cursor", "pointer") + node + .each(function(n) { + n.target = n.source = false; }); + + link + .classed("edgeBundlesLink--target", function(l) { if (l.target === d) return l.source.source = true; }) + .classed("edgeBundlesLink--source", function(l) { if (l.source === d) return l.target.target = true; }) + .filter(function(l) { return l.target === d || l.source === d; }) + .each(function() { this.parentNode.appendChild(this); }); + + node + .classed("edgeBundlesNode--target", function(n) { return n.target; }) + .classed("edgeBundlesNode--source", function(n) { return n.source; }) + } + + function nodeMouseouted(d) { + link + .classed("edgeBundlesLink--target", false) + .classed("edgeBundlesLink--source", false); + + node + .classed("edgeBundlesNode--target", false) + .classed("edgeBundlesNode--source", false); + } + + d3.select(self.frameElement).style("height", diameter + "px"); + + // Lazily construct the package hierarchy from class names. + function packageHierarchy(classes) { + var map = {}; + + function find(name, data) { + var node = map[name], i; + if (!node) { + node = map[name] = data || {name: name, children: []}; + if (name.length) { + node.parent = find(name.substring(0, i = name.lastIndexOf("/"))); + node.parent.children.push(node); + node.key = name.substring(i + 1); + } + } + return node; + } + + classes.forEach(function(d) { + find(d.name, d); + }); + + return map[""]; + } + + // Return a list of imports for the given array of nodes. + function packageImports(nodes) { + var map = {}, + map2 = {}, + input = []; + + // Compute a map from name to node. + nodes.forEach(function(d) { + map[d.name] = d; + map2[d.pipeline_data] = d; + }); + + // For each import, construct a link from the source to target node. + nodes.forEach(function(d) + { + if(d.input) + { + d.input.forEach(function(i) + { + if (map[i]) + { + input.push({source: map[d.name], + target: map[i], + pipeline_data: map2[d.pipeline_data]}); + } + }) + } + + }); + return input; + } + + + function prepareTreeData(aSchema,aLink) + { + var theLink = aLink; + if (aLink.source && aLink.target) + { + var pipeData_in = theLink.source.pipeline_data[theLink.target.name]; + var pipeData_out = theLink.target.pipeline_data[theLink.source.name]; + if (!pipeData_in){pipeData_in = [];} + if (!pipeData_out){pipeData_out = [];} + theLink.pipeData_in = theLink.source.pipeline_data[theLink.target.name]; + theLink.pipeData_out = theLink.target.pipeline_data[theLink.source.name]; + theLink.name_in = ""; + theLink.name_out = ""; + theLink.name = ""; + if (theLink.pipeData_in) + { + for (var i=0; i<theLink.pipeData_in.length; i++) + { + if (i==0){theLink.name_in += theLink.pipeData_in[i];} + else{theLink.name_in += "," + theLink.pipeData_in[i];} + + } + theLink.name += theLink.name_in + } + if (theLink.pipeData_out) + { + for (var i=0; i<theLink.pipeData_out.length; i++) + { + if (i==0){theLink.name_out += theLink.pipeData_out[i];} + else{theLink.name_out += "," + theLink.pipeData_out[i];} + } + theLink.name += theLink.name_out + } + } + + var treeData_in = (JSON.parse(JSON.stringify(aSchema))); + var treeData_out = (JSON.parse(JSON.stringify(aSchema))); + //aigner: Here, the minimalized tree is created! + //The tree will only be pruned if there is pipeData, such as in an edge or for the input of a tool + if (theLink) + { + if (theLink.name_in) + { + prune_tree(theLink.name_in, treeData_in, "in"); + } + else{treeData_in=[]} + if (theLink.name_out) + { + prune_tree(theLink.name_out, treeData_out, "out"); + } + else{treeData_out=[]} + } + + //build tree layout for vistoms + var treeData = treeData_in.concat(treeData_out) + + return treeData; + } + + function createTreeLayout(theName, schema,aLink,theAllLinks,nodeMenu) + { + //aigner: Build the tree layout + //###################################################################### + var treeData = prepareTreeData(schema, aLink) + var newTree = {}; + buildTree(newTree, treeData) + treeData = newTree + //###################################################################### + + var width= 1000; + var height= 500; + var xOffset = 10; + var xOffset2 = 100; + var canvas = d3.select(".circleSvg"); + // Calculate total nodes, max label length + var totalNodes = 0; + var maxLabelLength = 0; + // variables for drag/drop + var selectedNode = null; + var draggingNode = null; + // Misc. variables + var i = 0; + var duration = 500; + var root; + + + // size of the diagram + var viewerWidth = width/3; + var viewerHeight = height-50; + + var tree = d3.layout.tree() + .size([viewerHeight, viewerWidth]) + + // define a d3 diagonal projection for use by the node paths later on. + var diagonal = d3.svg.diagonal() + .projection(function(d) { + return [d.y+xOffset, d.x]; + }); + + // A recursive helper function for performing some setup by walking through all nodes + + function visit(parent, visitFn, childrenFn) { + if (!parent) return; + + visitFn(parent); + + var children = childrenFn(parent); + if (children) { + var count = children.length; + for (var i = 0; i < count; i++) { + visit(children[i], visitFn, childrenFn); + } + } + } + + // Call visit function to establish maxLabelLength + visit(treeData, function(d) { + totalNodes++; + maxLabelLength = Math.max(d.name.length, maxLabelLength); + }, function(d) { + return d.children && d.children.length > 0 ? d.children : null; + }); + + function getMaxLength(data) + { + var maxLen=0;; + for (var i = 0; i < data.length; i++) + { + maxLen = Math.max(data[i].name.length, maxLen); + } + for (var i = 0; i < data.length; i++) + { + data[i].labelLength = maxLen; + if (data[i].children) + {getMaxLength(data[i].children);} + if (data[i]._children) + {getMaxLength(data[i]._children);} + } + + } + if(treeData._children) + {getMaxLength(treeData._children);} + if(treeData.children) + {getMaxLength(treeData.children);} + treeData.labelLength = treeData.name.length; + + // sort the tree according to the node names + function sortTree() { + tree.sort(function(a, b) { + return b.name.toLowerCase() < a.name.toLowerCase() ? 1 : -1; + }); + } + // Sort the tree initially incase the JSON isn't in a sorted order. + //sortTree() + + + // Collapse the node and all it's children + function collapse(d) { + if(d.children) { + d._children = d.children + d._children.forEach(collapse) + d.children = null + } + } + // Collapse the node and all it's children + function expand(d) { + if(d._children) { + d.children = d._children + d.children.forEach(expand) + d._children = null + } + } + // Toggle children on click. + function click(d) + { + if (d.children) { + d._children = d.children; + d.children = null; + } else + { + d.children = d._children; + d._children = null; + } + update(d,theAllLinks); + } + // Collapse/expand entire tree on double-click + function dblclick(d) + { + if(d.children) + { + collapse(d); + } + else if(d._children) + { + expand(d); + } + update(d,theAllLinks); + } + + + + //aigner: Here the tree layout is created + var d3_body = d3.select("body") + var lobiID = String(getRandomInt(0,1000)) + var divClassName = "treeDiv"+lobiID + var treeLayoutdiv = d3_body.append("div").attr("class",divClassName+" panel-default") + .style("left","200px") + .style("top","200px") + .style("position", "absolute") + treeLayoutdiv.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(theName) + $('.'+divClassName).lobiPanel({ + reload: false, + editTitle: false, + unpin: false, + minWidth: 200, + maxWidth: 100000, + minHeight: 200, + maxHeight: 100000, + }); + $('.'+divClassName).lobiPanel('unpin'); + var treeLayoutSVG = treeLayoutdiv.append("svg").attr("class","treeLayoutSVG") + var treeGroup = treeLayoutSVG.append("g").attr("class","treeGroup").style("position","absolute") + .attr("transform", "translate(50,0)"); + var margin = {top: 20, right: 90, bottom: 20, left: 90}, + width = 960 - margin.left - margin.right, + height = 500 - margin.top - margin.bottom; + + // append the svg object to the body of the page + // appends a 'group' element to 'svg' + // moves the 'group' element to the top left margin + var offset_tmp = 60; + treeLayoutSVG = treeLayoutSVG.attr("width", width + 1.2*margin.right + margin.left+offset_tmp) + .attr("height", height + margin.top + margin.bottom+offset_tmp); + treeLayoutdiv.attr("width", width + 1.2*margin.right + margin.left+offset_tmp) + .attr("height", height + margin.top + margin.bottom+offset_tmp) + .on("mouseover",function(){d3.select(this).style("cursor", "grab")}) + treeGroup = treeGroup + .attr("width", width + margin.right + margin.left) + .attr("height", height + margin.top + margin.bottom); + + + + var frame = treeGroup.append("rect") + .attr("class","treeFrame") + .attr("stroke-width", 1) + .attr("stroke", "white") + .attr("fill-opacity", .8); + + + // Define the root + root = treeData; + root.x0 = 0; + root.y0 = 0; + + // Append a group which holds all nodes and which the zoom Listener can act upon. + var svgGroup_xOff = root.name.length*10+50 + var svgGroup = treeGroup.append("g") + .attr("class","tree_"+theName) + .attr("transform", "translate("+ svgGroup_xOff + "," + String(margin.top+10) + ")"); + + collapse(root); + update(root,theAllLinks); + + + function update(source,allLinks) { + // Compute the new height, function counts total children of root node and sets tree height accordingly. + // This prevents the layout looking squashed when new nodes are made visible or looking sparse when nodes are removed + // This makes the layout more consistent. + var levelWidth = [1]; + var levelLength = [1]; + var childCount = function(level, n) { + + if (n.children && n.children.length > 0) { + if (levelWidth.length <= level + 1) levelWidth.push(0); + + levelWidth[level + 1] += n.children.length; + n.children.forEach(function(d) { + childCount(level + 1, d); + }); + } + }; + childCount(0, root); + + var newHeight = d3.max(levelWidth) * 60; // 20 pixels per line + var newWidth = viewerWidth+300; + + //BENNI: fill in viewerHeight instead of newHeight for other expanding/collapsing beaviour + tree = tree.size([newHeight, newWidth]); + + frame = frame.attr("width",newWidth) + .attr("height",newHeight+60) + .attr("fill","white"); + + + + // Compute the new tree layout. + var nodes = tree.nodes(root), + links = tree.links(nodes); + + + //aigner: count all descendants of a node + function countDescendants(node, counter) + { + if (node._children) + { + node._children.forEach(function(n) + { + counter = countDescendants(n, counter); + }); + } + else if (node.children) + { + node.children.forEach(function(n) + { + counter = countDescendants(n, counter); + }); + } + else + { + counter ++; + } + return counter; + } + + + var depths = []; + var labelLength = []; + nodes.forEach(function(d) + { + //aigner: If node is collapsed show number of ancestors + if (d._children) + { + d._childrenNum = countDescendants(d, 0); + d.text = d.name + " (" + d._childrenNum + ")"; + } + else + { + d.text = d.name + } + + //aigner: Find maximum labelLength for each level + if (!depths.includes(d.depth)) + { + depths.push(d.depth); + labelLength.push(d.text.length); + } + else + { + if (d.depth!=0){labelLength[depths.indexOf(d.depth)] = Math.max(d.text.length, labelLength[depths.indexOf(d.depth)]);} + } + }); + // Set widths between levels based on labelLength of each level. + var newWidth=0; + var depth_tmp = 0; + nodes.forEach(function(d) + { + if (d.parent) + { + d.y = d.parent.y+(labelLength[depths.indexOf(d.depth)])*10+50; + } + else{d.y=0} + + + if (newWidth<d.y) + {newWidth=d.y;} + + // console.log("##############") + // console.log(d.name) + // console.log("x = " + d.x) + // console.log("y = " + d.y) + // console.log("depth = " + depths.indexOf(d.depth)) + // console.log("##############") + }); + + + newWidth=Math.max(newWidth,getTextWidth(theName,"Arial 12pt")); + //aigner: Adjust height and width of the frame + $('.'+divClassName).lobiPanel('setWidth', newWidth + margin.top + margin.bottom +400+maxLabelLength*25+offset_tmp); + $('.'+divClassName).lobiPanel('setHeight', newHeight + margin.top + 2*margin.bottom+offset_tmp); + treeLayoutSVG = treeLayoutSVG.attr("height", newHeight + margin.top + margin.bottom+offset_tmp) + treeLayoutSVG = treeLayoutSVG.attr("width", newWidth + margin.top + margin.bottom +300+maxLabelLength*25+offset_tmp) + frame = frame.attr("height", newHeight + margin.top + margin.bottom) + frame = frame.attr("width", newWidth + margin.top + margin.bottom+300+maxLabelLength*15) + + + // Update the nodes… + var treeNode = svgGroup.selectAll("g.treeNode") + .data(nodes, function(d) { + return d.id || (d.id = ++i); + }); + + var dblclick_timer = false; + // Enter any new nodes at the parent's previous position. + var nodeEnter = treeNode.enter().append('g') + .attr('class', 'treeNode') + .attr("transform", function(d) { + return "translate(" + source.y0 + "," + source.x0 + ")"; + }) + .on("mousedown", function(d) { + if (d3.event.which != 3) + { + // if double click timer is active, this click is the double click + if ( dblclick_timer ) + { + clearTimeout(dblclick_timer) + dblclick_timer = false + // double click code code comes here + //console.log("DOUBLE CLICK") + dblclick(d); + } + // otherwise, what to do after single click (double click has timed out) + else dblclick_timer = setTimeout( function(){ + dblclick_timer = false + // single click code code comes here + //console.log("SINGLE CLICK") + click(d); + }, 250) + } + }) + + + nodeEnter.append("circle") + .attr('class', 'nodeCircle') + .attr("r", 0) + .style("fill", function(d) { + if (d._children) + { + if(d.pipeLineIn && !d.pipeLineOut){return '#ea9999'} + else if(!d.pipeLineIn && d.pipeLineOut){return '#d6ea99'} + else {return "lightsteelblue"} + } + else{return "#fff";} + }) + .style("stroke", function(d) { + if(d.pipeLineIn && !d.pipeLineOut){ + //console.log(d); + return '#CC0000'} + else if(!d.pipeLineIn && d.pipeLineOut){ + //console.log(d); + return '#99CC00'} + }) + .attr("cx", function(d) {return xOffset}); + + nodeEnter.append("text") + .attr("x", function(d) + { + return d.children || d._children ? -10+xOffset : 10+xOffset; + }) + .attr("dy", ".35em") + .attr('class', 'nodeText') + .attr("text-anchor", function(d) { + return d.children || d._children ? "end" : "start"; + }) + .text(function(d) { + return d.text; + }) + .style("fill-opacity", 0) + + + // Update the text to reflect whether node has children or not. + treeNode.select('text') + .attr("x", function(d) { + return d.children || d._children ? -10+xOffset : 10+xOffset; + }) + .attr("text-anchor", function(d) { + return d.children || d._children ? "end" : "start"; + }) + .text(function(d) { + return d.text; + }); + + // Change the circle fill depending on whether it has children and is collapsed + treeNode.select("circle.nodeCircle") + .attr("r", 4.5) + .style("fill", function(d) { + if (d._children) + { + if(d.pipeLineIn && !d.pipeLineOut){return '#ea9999'} + else if(!d.pipeLineIn && d.pipeLineOut){return '#d6ea99'} + else {return "lightsteelblue"} + } + else{return "#fff";} + }) + + //Function writeTreeToXML goes through tree nodes and puts the into an xml document + function writeTreeToXML(aNode,anXMLDoc,anXPath) + { + //Variable "children" + //--> One children variable, no matter whether a node has "_children" (collapsed) or "children" (expanded) + var children; + if (aNode._children){children = aNode._children;} + else if (aNode.children){children = aNode.children;} + + //Get current xml element with its xPath + var element = anXMLDoc.evaluate(anXPath,anXMLDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; + if (element != null) {element.value = '...';} + + //If a node has children (collapsed or expanded), loop through them + if (children) + { + for (var i=0; i < children.length;i++) + { + //Name of the new XML element --> childName + var child = children[i]; + var childName = child.name.split(/[\[\]]+/);//Split childName at "[]" which is the uID + var cleanChildName = childName[0].split(/[\+\*\^\-\ \#]+/);//Split childName all special characters + var newNode = anXMLDoc.createElement(String(cleanChildName[0])); + + //The children are appended to the xPath --> newXPath + var newXPath = anXPath+"/"+cleanChildName[0]; + + //If childName contains a uID, make the uID an attribute + if (childName[1]) + { + if (parseInt(childName[1])) + { + var dummyID = childName[1]; + newNode.setAttribute("dummyID", dummyID) + newXPath = newXPath+"[@dummyID='"+dummyID+"']"; + } + else + { + var uID = childName[1]; + newNode.setAttribute("uID", uID) + newXPath = newXPath+"[@uID='"+uID+"']"; + } + } + if (cleanChildName.length>1) {newNode.setAttribute("elementName", childName[0])}; + + //Append the newNode to the xml structure + element.appendChild(newNode); + + + + ////aigner: Sorting of XML elements according to "uID" + // var items = element.children; + // var itemsArr = []; + // for (var j in items) { + // if (items[j].nodeType == 1) { // get rid of the whitespace text nodes + // itemsArr.push(items[j]); + // } + // } + // itemsArr.sort(function(a,b){ + // if (a.getAttribute("uID") < b.getAttribute("uID")) + // return -1; + // if (a.getAttribute("uID") > b.getAttribute("uID")) + // return 1; + // return 0; + // }); + + // for (j = 0; j < itemsArr.length; ++j) { + // element.appendChild(itemsArr[j]); + // } + + //call function writeTreeToXML recursively for all children + writeTreeToXML(child,anXMLDoc,newXPath) + } + } + else + { + if (aNode.value){element.innerHTML = String(aNode.value);} + else{element.innerHTML = " ";} + } + //return the xml document + return anXMLDoc; + } + + function removeAttributeInAllElements(aDocument,attribute) + { + var matchingElements = []; + var allElements = aDocument.getElementsByTagName('*'); + for (var i = 0, n = allElements.length; i < n; i++) + { + if (allElements[i].getAttribute(attribute) !== null) + { + allElements[i].removeAttribute(attribute); + } + } + return matchingElements; + } + + function putAncestorsInXMLString(strWrapper, aNode) + { + //Name of the new XML element + var nodeName = aNode.name.split(/[\[\]]+/);//Split name at "[]" which is the uID + var cleanNodeName = nodeName[0].split(/[\+\*\^\-\ \#]+/);//Split nodeName all special characters + //If nodeName contains a uID, make the uID an attribute + if (nodeName[1]) + { + var uID = nodeName[1]; + strWrapper.val = "<"+cleanNodeName[0]+" uID='"+ uID +"'>"+strWrapper.val+"</"+cleanNodeName[0]+">";; + } + else + { + strWrapper.val = "<"+cleanNodeName[0]+">"+strWrapper.val+"</"+cleanNodeName[0]+">";; + } + var aParent = aNode.parent; + if (aParent) + { + return putAncestorsInXMLString(strWrapper, aParent); + } + else + { + return strWrapper; + } + } + + function putAncestorsInXPath(strWrapper, aNode) + { + //Name of the new XML element + var nodeName = aNode.name.split(/[\[\]]+/);//Split name at "[]" which is the uID + var cleanNodeName = nodeName[0].split(/[\+\*\^\-\ \#]+/);//Split nodeName all special characters + //If nodeName contains a uID, make the uID an attribute + if (nodeName[1]) + { + var uID = nodeName[1]; + strWrapper.val = "/"+cleanNodeName[0]+"[@uID='"+uID+"']"+strWrapper.val; + } + else + { + strWrapper.val = "/"+cleanNodeName[0]+strWrapper.val; + } + var aParent = aNode.parent; + if (aParent) + { + return putAncestorsInXPath(strWrapper, aParent); + } + else + { + return strWrapper; + } + } + + // Function to download data to a file + function download(filename, text) { + var element = document.createElement('a'); + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); + element.setAttribute('download', filename); + + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); + } + + + var nodeTreeMenu = nodeMenu; + var treeMenu = [ + { + title: 'Download full tree as XML-file', + onMouseDown: function(elm, d, i) { + //Begin xml structure with the first element + var xmlString = "<"+nodes[0].name+">"+"</"+nodes[0].name+">"; + //Create a new xml document + var parser = new DOMParser(); + var xmlDocument = parser.parseFromString(xmlString, "text/xml"); //important to use "text/xml" + //Get initial xPath of the tree and pass it to the function "writeTreeToXML" + var initialXPath = "/"+nodes[0].name; + writeTreeToXML(nodes[0],xmlDocument,initialXPath); + //remove all attributes dummyID + removeAttributeInAllElements(xmlDocument,'dummyID'); + //Make the xml document a string + var serializer = new XMLSerializer(); + var xmlString = serializer.serializeToString(xmlDocument); + xmlString = vkbeautify.xml(xmlString); + //Download a document with the xml-schema + download(theName+'_full.xml', xmlString); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Download tree as XML-file from current node', + onMouseDown: function(elm, d, i) { + var xmlString = putAncestorsInXMLString({ val : '' }, d).val; + var initialXPath = putAncestorsInXPath({ val : '' }, d).val; + //Create a new xml document + var parser = new DOMParser(); + var xmlDocument = parser.parseFromString(xmlString, "text/xml"); //important to use "text/xml" + //Get initial xPath of the tree and pass it to the function "writeCurrentTreeToXML" + writeTreeToXML(d,xmlDocument,initialXPath); + //remove all attributes dummyID + removeAttributeInAllElements(xmlDocument,'dummyID'); + //Make the xml document a string + var serializer = new XMLSerializer(); + xmlString = serializer.serializeToString(xmlDocument); + xmlString = vkbeautify.xml(xmlString); + //Download a document with the xml-schema + download(theName+"_"+d.name+'.xml', xmlString); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + } + ] + var nodeTreeMenu = nodeMenu.concat(treeMenu) + + nodeEnter.append("svg:title").text("Click left to expand, click right to inspect") + + nodeEnter = nodeEnter.on('contextmenu', d3.contextMenu(nodeTreeMenu)); + + // UPDATE + // Transition nodes to their new position. + var nodeUpdate = treeNode.transition() + .duration(duration) + .attr("transform", function(d) { + return "translate(" + d.y + "," + d.x + ")"; + }); + + // Fade the text in + nodeUpdate.select("text") + .style("fill-opacity", 1); + + //New object for invisible nodes + var exitNodes = []; + + // Remove any exiting nodes + var nodeExit = treeNode.exit().transition() + .duration(duration) + .attr("transform", function(d) { + return "translate(" + source.y + "," + source.x + ")"; + }) + .remove(); + + function translation(d) + { + + var closestAncestor; + closestAncestor = findClosestAncestor(nodes,d); + exitNodes.push(d); + exitNodes[exitNodes.length-1].x = closestAncestor.x; + exitNodes[exitNodes.length-1].y = closestAncestor.y; + return "translate(" + closestAncestor.y + "," + closestAncestor.x + ")"; + } + + function findClosestAncestor(allNodes, element) + { + var level = 0; + var closestAncestor; + for (var i=0;i<allNodes.length;i++) + { + if (!allNodes[i].level){allNodes[i].level=0}; + if (isDescendant(allNodes[i],element) && allNodes[i].level >= level) + { + level = allNodes[i].level; + closestAncestor = allNodes[i]; + } + } + return closestAncestor; + } + + function isDescendant(parent, child) + { + var node = child.parent; + while (node != null) + { + if (node == parent) + { + return true; + } + node = node.parent; + } + return false; + } + + + // Update the links… + var link = svgGroup.selectAll("path.treeLink") + .data(links, function(d) { + return d.target.id; + }); + + // Enter any new links at the parent's previous position. + link.enter().insert("path", "g") + .attr("class", "treeLink") + .attr("d", function(d) { + var o = { + x: source.x0, + y: source.y0 + }; + return diagonal({ + source: o, + target: o + }); + }); + + // Transition links to their new position. + link.transition() + .duration(duration) + .attr("d", diagonal); + + // Transition exiting nodes to the parent's new position. + link.exit().transition() + .duration(duration) + .attr("d", function(d) { + var o = { + x: source.x, + y: source.y + }; + return diagonal({ + source: o, + target: o + }); + }) + .remove(); + + // Stash the old positions for transition. + nodes.forEach(function(d) { + d.x0 = d.x; + d.y0 = d.y; + }); + } + } + + },{"d3":1}]},{},[2]); + } + + function sankeyDiagram_script(data, graphID) + { + (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ + !function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++i<u;)(t=r[i].on)&&t.apply(this,arguments);return n}var e=[],r=new c;return t.on=function(t,i){var u,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,u=e.indexOf(o)).concat(e.slice(u+1)),r.remove(t)),i&&e.push(r.set(t,{on:i})),n)},t}function S(){ao.event.preventDefault()}function k(){for(var n,t=ao.event;n=t.sourceEvent;)t=n;return t}function N(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(i){try{var u=i.sourceEvent=ao.event;i.target=n,ao.event=i,t[i.type].apply(e,r)}finally{ao.event=u}}},t}function E(n){return ko(n,Co),n}function A(n){return"function"==typeof n?n:function(){return No(n,this)}}function C(n){return"function"==typeof n?n:function(){return Eo(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function i(){this.setAttribute(n,t)}function u(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ao.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?u:i}function L(n){return n.trim().replace(/\s+/g," ")}function q(n){return new RegExp("(?:^|\\s+)"+ao.requote(n)+"(?:\\s+|$)","g")}function T(n){return(n+"").trim().split(/^|\s+/)}function R(n,t){function e(){for(var e=-1;++e<i;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<i;)n[e](this,r)}n=T(n).map(D);var i=n.length;return"function"==typeof t?r:e}function D(n){var t=q(n);return function(e,r){if(i=e.classList)return r?i.add(n):i.remove(n);var i=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(i)||e.setAttribute("class",L(i+" "+n))):e.setAttribute("class",L(i.replace(t," ")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function i(){this.style.setProperty(n,t,e)}function u(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?u:i}function U(n,t){function e(){delete this[n]}function r(){this[n]=t}function i(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?i:r}function j(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e===zo&&t.documentElement.namespaceURI===zo?t.createElement(n):t.createElementNS(e,n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return"function"==typeof n?n:(n=ao.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return Ao(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t<l;);return o}}function X(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function i(){var i=l(t,co(arguments));r.call(this),this.addEventListener(n,this[o]=i,i.$=e),i._=t}function u(){var t,e=new RegExp("^__on([^.]+)"+ao.requote(n)+"$");for(var r in this)if(t=r.match(e)){var i=this[r];this.removeEventListener(t[1],i,i.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),l=$;a>0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=oa,e=1/0;t;)t.c?(t.t<e&&(e=t.t),t=(n=t).n):t=n?n.n=t.n:oa=t.n;return aa=n,e}function Pn(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Un(n,t){var e=Math.pow(10,3*xo(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(l,a)),null!=(i=ya[e=n.charAt(++a)])&&(e=n.charAt(++a)),(u=A[e])&&(e=u(t,null==i?"e"===e?" ":"0":i)),o.push(e),l=a+1);return o.push(n.slice(l,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},i=e(r,n,t,0);if(i!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var u=null!=r.Z&&va!==Hn,o=new(u?Hn:va);return"j"in r?o.setFullYear(r.y,0,r.j):"W"in r||"U"in r?("w"in r||(r.w="W"in r?1:0),o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),u?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var i,u,o,a=0,l=t.length,c=e.length;l>a;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function $n(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Bn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function Wn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Jn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Gn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.y=Qn(+r[0]),e+r[0].length):-1}function Kn(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Qn(n){return n+(n>68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ft(){}function st(n,t,e){var r=e.s=n+t,i=r-n,u=r-i;e.t=n-u+(t-i)}function ht(n,t){n&&wa.hasOwnProperty(n.type)&&wa[n.type](n,t)}function pt(n,t,e){var r,i=-1,u=n.length-e;for(t.lineStart();++i<u;)r=n[i],t.point(r[0],r[1],r[2]);t.lineEnd()}function gt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)pt(n[e],t,1);t.polygonEnd()}function vt(){function n(n,t){n*=Yo,t=t*Yo/2+Fo/4;var e=n-r,o=e>=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])<Uo&&xo(n[1]-t[1])<Uo}function St(n,t){n*=Yo;var e=Math.cos(t*=Yo);kt(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function kt(n,t,e){++Ea,Ca+=(n-Ca)/Ea,za+=(t-za)/Ea,La+=(e-La)/Ea}function Nt(){function n(n,i){n*=Yo;var u=Math.cos(i*=Yo),o=u*Math.cos(n),a=u*Math.sin(n),l=Math.sin(i),c=Math.atan2(Math.sqrt((c=e*l-r*a)*c+(c=r*o-t*l)*c+(c=t*a-e*o)*c),t*o+e*a+r*l);Aa+=c,qa+=c*(t+(t=o)),Ta+=c*(e+(e=a)),Ra+=c*(r+(r=l)),kt(t,e,r)}var t,e,r;ja.point=function(i,u){i*=Yo;var o=Math.cos(u*=Yo);t=o*Math.cos(i),e=o*Math.sin(i),r=Math.sin(u),ja.point=n,kt(t,e,r)}}function Et(){ja.point=St}function At(){function n(n,t){n*=Yo;var e=Math.cos(t*=Yo),o=e*Math.cos(n),a=e*Math.sin(n),l=Math.sin(t),c=i*l-u*a,f=u*o-r*l,s=r*a-i*o,h=Math.sqrt(c*c+f*f+s*s),p=r*o+i*a+u*l,g=h&&-nn(p)/h,v=Math.atan2(h,p);Da+=g*c,Pa+=g*f,Ua+=g*s,Aa+=v,qa+=v*(r+(r=o)),Ta+=v*(i+(i=a)),Ra+=v*(u+(u=l)),kt(r,i,u)}var t,e,r,i,u;ja.point=function(o,a){t=o,e=a,ja.point=n,o*=Yo;var l=Math.cos(a*=Yo);r=l*Math.cos(o),i=l*Math.sin(o),u=Math.sin(a),kt(r,i,u)},ja.lineEnd=function(){n(t,e),ja.lineEnd=Et,ja.point=St}}function Ct(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function zt(){return!0}function Lt(n,t,e,r,i){var u=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(wt(e,r)){i.lineStart();for(var a=0;t>a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r<t;)i.n=e=n[r],e.p=i,i=e;i.n=e=n[0],e.p=i}}function Tt(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Rt(n,t,e,r){return function(i,u){function o(t,e){var r=i(t,e);n(t=r[0],e=r[1])&&u.point(t,e)}function a(n,t){var e=i(n,t);d.point(e[0],e[1])}function l(){m.point=a,d.lineStart()}function c(){m.point=o,d.lineEnd()}function f(n,t){v.push([n,t]);var e=i(n,t);x.point(e[0],e[1])}function s(){x.lineStart(),v=[]}function h(){f(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),g.push(v),v=null,r)if(1&t){n=e[0];var i,r=n.length-1,o=-1;if(r>0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o<r;)u.point((i=n[o])[0],i[1]);u.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonStart(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)<Uo?(n.point(e,r=(r+o)/2>0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)<Uo&&(e-=i*Uo),xo(u-a)<Uo&&(u-=a*Uo),r=Ft(e,r,u,o),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=u,r=o),i=a},lineEnd:function(){n.lineEnd(),e=r=NaN},clean:function(){return 2-t}}}function Ft(n,t,e,r){var i,u,o=Math.sin(n-e);return xo(o)>Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]<t[0]?Fo:-Fo;i=e*u/2,r.point(-u,i),r.point(0,i),r.point(u,i)}else r.point(t[0],t[1])}function Ot(n,t){var e=n[0],r=n[1],i=[Math.sin(e),-Math.cos(e),0],u=0,o=0;ka.reset();for(var a=0,l=t.length;l>a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s),v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)<Uo,C=A||Uo>E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)<Uo?k:N):k<=b[1]&&b[1]<=N:E>Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&(h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)<Uo?i>0?0:3:xo(r[0]-e)<Uo?i>0?2:1:xo(r[1]-t)<Uo?i>0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,Gt(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){ + r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)<Uo||xo(r-h)<Uo?(r+h)/2:Math.atan2(_,b),E=n(N,k),A=E[0],C=E[1],z=A-t,L=C-e,q=M*z-m*L;(q*q/x>u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)<Uo?ce:(e.invert=function(n,t){var e=u-t;return[Math.atan2(n,e)/i,u-K(i)*Math.sqrt(n*n+e*e)]},e)}function Ne(n,t){return[n,Math.log(Math.tan(Fo/4+t/2))]}function Ee(n){var t,e=oe(n),r=e.scale,i=e.translate,u=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=i.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=u.apply(e,arguments);if(o===e){if(t=null==n){var a=Fo*r(),l=i();u([[l[0]-a,l[1]-a],[l[0]+a,l[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Ae(n,t){return[Math.log(Math.tan(Fo/4+t/2)),-n]}function Ce(n){return n[0]}function ze(n){return n[1]}function Le(n){for(var t=n.length,e=[0,1],r=2,i=2;t>i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)<Uo&&xo(r-l.circle.cy)<Uo;)u=l.P,a.unshift(l),je(l),l=u;a.unshift(l),Be(l);for(var c=o;c.circle&&xo(e-c.circle.x)<Uo&&xo(r-c.circle.cy)<Uo;)o=c.N,a.push(c),je(c),c=o;a.push(c),Be(c);var f,s=a.length;for(f=1;s>f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)<Uo&&g-i>Uo?{x:s,y:xo(t-s)<Uo?e:g}:xo(i-g)<Uo&&h-r>Uo?{x:xo(e-g)<Uo?t:h,y:g}:xo(r-h)<Uo&&i-p>Uo?{x:h,y:xo(t-h)<Uo?e:p}:xo(i-p)<Uo&&r-s>Uo?{x:xo(e-p)<Uo?t:s,y:p}:null),u.site,null)),++l)}function Ve(n,t){return t.angle-n.angle}function Xe(){rr(this),this.x=this.y=this.arc=this.site=this.cy=null}function $e(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,i=n.site,u=e.site;if(r!==u){var o=i.x,a=i.y,l=r.x-o,c=r.y-a,f=u.x-o,s=u.y-a,h=2*(l*s-c*f);if(!(h>=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.y<M.y||y.y===M.y&&y.x<=M.x){if(!M.L){m=M.P;break}M=M.L}else{if(!M.R){m=M;break}M=M.R}ll.insert(m,y),m||(al=y)}}}}function Be(n){var t=n.circle;t&&(t.P||(al=t.N),ll.remove(t),fl.push(t),rr(t),n.circle=null)}function We(n){for(var t,e=il,r=Yt(n[0][0],n[0][1],n[1][0],n[1][1]),i=e.length;i--;)t=e[i],(!Je(t,n)||!r(t)||xo(t.a.x-t.b.x)<Uo&&xo(t.a.y-t.b.y)<Uo)&&(t.a=t.b=null,e.splice(i,1))}function Je(n,t){var e=n.b;if(e)return!0;var r,i,u=n.a,o=t[0][0],a=t[1][0],l=t[0][1],c=t[1][1],f=n.l,s=n.r,h=f.x,p=f.y,g=s.x,v=s.y,d=(h+g)/2,y=(p+v)/2;if(v===p){if(o>d||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.y<l)return}else u={x:d,y:c};e={x:d,y:l}}}else if(r=(h-g)/(v-p),i=y-r*d,-1>r||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.y<l)return}else u={x:(c-i)/r,y:c};e={x:(l-i)/r,y:l}}else if(v>p){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.x<o)return}else u={x:a,y:r*a+i};e={x:o,y:r*o+i}}return n.a=u,n.b=e,!0}function Ge(n,t){this.l=n,this.r=t,this.a=this.b=null}function Ke(n,t,e,r){var i=new Ge(n,t);return il.push(i),e&&nr(i,n,t,e),r&&nr(i,t,n,r),ul[n.i].edges.push(new tr(i,n,t)),ul[t.i].edges.push(new tr(i,t,n)),i}function Qe(n,t,e){var r=new Ge(n,null);return r.a=t,r.b=e,il.push(r),r}function nr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function tr(n,t,e){var r=n.a,i=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(i.x-r.x,r.y-i.y):Math.atan2(r.x-i.x,i.y-r.y)}function er(){this._=null}function rr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function ir(n,t){var e=t,r=t.R,i=e.U;i?i.L===e?i.L=r:i.R=r:n._=r,r.U=i,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ur(n,t){var e=t,r=t.L,i=e.U;i?i.L===e?i.L=r:i.R=r:n._=r,r.U=i,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function or(n){for(;n.L;)n=n.L;return n}function ar(n,t){var e,r,i,u=n.sort(lr).pop();for(il=[],ul=new Array(n.length),ol=new er,ll=new er;;)if(i=al,u&&(!i||u.y<i.y||u.y===i.y&&u.x<i.x))u.x===e&&u.y===r||(ul[u.i]=new Ye(u),He(u),e=u.x,r=u.y),u=n.pop();else{if(!i)break;Fe(i.arc)}t&&(We(t),Ze(t));var o={cells:ul,edges:il};return ol=ll=il=ul=null,o}function lr(n,t){return t.y-n.y||t.x-n.x}function cr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function fr(n){return n.x}function sr(n){return n.y}function hr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function pr(n,t,e,r,i,u){if(!n(t,e,r,i,u)){var o=.5*(e+i),a=.5*(r+u),l=t.nodes;l[0]&&pr(n,l[0],e,r,o,a),l[1]&&pr(n,l[1],o,r,i,a),l[2]&&pr(n,l[2],e,a,o,u),l[3]&&pr(n,l[3],o,a,i,u)}}function gr(n,t,e,r,i,u,o){var a,l=1/0;return function c(n,f,s,h,p){if(!(f>u||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function(n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return u<t.length&&(i=t.slice(u),a[o]?a[o]+=i:a[++o]=i),a.length<2?l[0]?(t=l[0].x,function(n){return t(n)+""}):function(){return t}:(t=l.length,function(n){for(var e,r=0;t>r;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Zo,this.translate=[n.e,n.f],this.scale=[r,u],this.skew=u?Math.atan2(i,u)*Zo:0}function Fr(n,t){return n[0]*t[0]+n[1]*t[1]}function Hr(n){var t=Math.sqrt(Fr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Or(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Ir(n){return n.length?n.pop()+",":""}function Yr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push("translate(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else(t[0]||t[1])&&e.push("translate("+t+")")}function Zr(n,t,e,r){n!==t?(n-t>180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i<u;)e[(t=r[i]).i]=t.x(n);return e.join("")}}function Br(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Wr(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Jr(n){for(var t=n.source,e=n.target,r=Kr(t,e),i=[t];t!==r;)t=t.parent,i.push(t);for(var u=i.length;e!==r;)i.splice(u,0,e),e=e.parent;return i}function Gr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Kr(n,t){if(n===t)return n;for(var e=Gr(n),r=Gr(t),i=e.pop(),u=r.pop(),o=null;i===u;)o=i,i=e.pop(),u=r.pop();return o}function Qr(n){n.fixed|=2}function ni(n){n.fixed&=-7}function ti(n){n.fixed|=4,n.px=n.x,n.py=n.y}function ei(n){n.fixed&=-5}function ri(n,t,e){var r=0,i=0;if(n.charge=0,!n.leaf)for(var u,o=n.nodes,a=o.length,l=-1;++l<a;)u=o[l],null!=u&&(ri(u,t,e),n.charge+=u.charge,r+=u.charge*u.cx,i+=u.charge*u.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var c=t*e[n.point.index];n.charge+=n.pointCharge=c,r+=c*n.point.x,i+=c*n.point.y}n.cx=r/n.charge,n.cy=i/n.charge}function ii(n,t){return ao.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=fi,n}function ui(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(i=n.children)&&(r=i.length))for(var r,i;--r>=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++o<i;)e.push(u[o]);for(;null!=(n=r.pop());)t(n)}function ai(n){return n.children}function li(n){return n.value}function ci(n,t){return t.value-n.value}function fi(n){return ao.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function si(n){return n.x}function hi(n){return n.y}function pi(n,t,e){n.y0=t,n.y=e}function gi(n){return ao.range(n.length)}function vi(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function di(n){for(var t,e=1,r=0,i=n[0][1],u=n.length;u>e;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.r<r.r?Si(r,i=a):Si(r=l,i),o--):(wi(r,u),i=u,t(u))}var y=(f+s)/2,m=(h+p)/2,M=0;for(o=0;c>o;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u<o;)Ci(i[u],t,e,r)}function zi(n,t,e){var r=n.r+e.r,i=t.x-n.x,u=t.y-n.y;if(r&&(i||u)){var o=t.r+e.r,a=i*i+u*u;o*=o,r*=r;var l=.5+(r-o)/(2*a),c=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+l*i+c*u,e.y=n.y+l*u-c*i}else e.x=n.x+r,e.y=n.y}function Li(n,t){return n.parent==t.parent?1:2}function qi(n){var t=n.children;return t.length?t[0]:n.t}function Ti(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ri(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Di(n){for(var t,e=0,r=0,i=n.children,u=i.length;--u>=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)i.push(e(n[o-1],n[o])),u.push(r(t[o-1],t[o]));return function(t){var e=ao.bisect(n,t,1,a)-1;return u[e](i[e](t))}}function Wi(n,t,e,r){function i(){var i=Math.min(n.length,t.length)>2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++<f;)for(var h=s-1;h>0;h--)o.push(u(c)*h);for(c=0;o[c]<a;c++);for(f=o.length;o[f-1]>l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n):""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++o<a;)i.has(u=r[o])||i.set(u,n.push(u));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(u=n,o=0,t={t:"range",a:arguments},e):u},e.rangePoints=function(i,a){arguments.length<2&&(a=0);var l=i[0],c=i[1],f=n.length<2?(l=(l+c)/2,0):(c-l)/(n.length-1+a);return u=r(l+f*a/2,f),o=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(i,a){arguments.length<2&&(a=0);var l=i[0],c=i[1],f=n.length<2?(l=c=Math.round((l+c)/2),0):(c-l)/(n.length-1+a)|0;return u=r(l+Math.round(f*a/2+(c-l-(n.length-1+a)*f)/2),f),o=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(i,a,l){arguments.length<2&&(a=0),arguments.length<3&&(l=a);var c=i[1]<i[0],f=i[c-0],s=i[1-c],h=(s-f)/(n.length-a+2*l);return u=r(f+h*l,h),c&&u.reverse(),o=h*(1-a),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(i,a,l){arguments.length<2&&(a=0),arguments.length<3&&(l=a);var c=i[1]<i[0],f=i[c-0],s=i[1-c],h=Math.floor((s-f)/(n.length-a+2*l));return u=r(f+Math.round((s-f-(n.length-a)*h)/2),h),c&&u.reverse(),o=Math.round(h*(1-a)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Yi(t.a[0])},e.copy=function(){return ou(n,t)},e.domain(n)}function au(n,t){function u(){var e=0,r=t.length;for(a=[];++e<r;)a[e-1]=ao.quantile(n,e/r);return o}function o(n){return isNaN(n=+n)?void 0:t[ao.bisect(a,n)]}var a;return o.domain=function(t){return arguments.length?(n=t.map(r).filter(i).sort(e),u()):n},o.range=function(n){return arguments.length?(t=n,u()):t},o.quantiles=function(){return a},o.invertExtent=function(e){return e=t.indexOf(e),0>e?[NaN,NaN]:[e>0?a[e-1]:n[0],e<a.length?a[e]:n[n.length-1]]},o.copy=function(){return au(n,t)},u()}function lu(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(u*(t-n))))]}function i(){return u=e.length/(t-n),o=e.length-1,r}var u,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],i()):[n,t]},r.range=function(n){return arguments.length?(e=n,i()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math.sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s<h;)i.call(this,l=t[s],s)?f.push([+p.call(this,l,s),+g.call(this,l,s)]):f.length&&(o(),f=[]);return f.length&&o(),c.length?c.join(""):null}var e=Ce,r=ze,i=zt,u=xu,o=u.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(i=n,t):i},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?u=n:(u=Tl.get(n)||xu).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function xu(n){return n.length>1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("V",(r=n[t])[1],"H",r[0]);return i.join("")}function Su(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r=n[t])[0],"V",r[1]);return i.join("")}function ku(n,t){return n.length<4?xu(n):n[1]+Au(n.slice(1,-1),Cu(n,t))}function Nu(n,t){return n.length<3?bu(n):n[0]+Au((n.push(n[0]),n),Cu([n[n.length-2]].concat(n,[n[1]]),t))}function Eu(n,t){return n.length<3?xu(n):n[0]+Au(n,Cu(n,t))}function Au(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return xu(n);var e=n.length!=t.length,r="",i=n[0],u=n[1],o=t[0],a=o,l=1;if(e&&(r+="Q"+(u[0]-2*o[0]/3)+","+(u[1]-2*o[1]/3)+","+u[0]+","+u[1],i=n[1],l=2),t.length>1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c<t.length;c++,l++)u=n[l],a=t[c],r+="S"+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1]}if(e){var f=n[l];r+="Q"+(u[0]+2*a[0]/3)+","+(u[1]+2*a[1]/3)+","+f[0]+","+f[1]}return r}function Cu(n,t){for(var e,r=[],i=(1-t)/2,u=n[0],o=n[1],a=1,l=n.length;++a<l;)e=u,u=o,o=n[a],r.push([i*(o[0]-e[0]),i*(o[1]-e[1])]);return r}function zu(n){if(n.length<3)return xu(n);var t=1,e=n.length,r=n[0],i=r[0],u=r[1],o=[i,i,i,(r=n[1])[0]],a=[u,u,u,r[1]],l=[i,",",u,"L",Ru(Pl,o),",",Ru(Pl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Du(l,o,a);return n.pop(),l.push("L",r),l.join("")}function Lu(n){if(n.length<4)return xu(n);for(var t,e=[],r=-1,i=n.length,u=[0],o=[0];++r<3;)t=n[r],u.push(t[0]),o.push(t[1]);for(e.push(Ru(Pl,u)+","+Ru(Pl,o)),--r;++r<i;)t=n[r],u.shift(),u.push(t[0]),o.shift(),o.push(t[1]),Du(e,u,o);return e.join("")}function qu(n){for(var t,e,r=-1,i=n.length,u=i+4,o=[],a=[];++r<4;)e=n[r%i],o.push(e[0]),a.push(e[1]);for(t=[Ru(Pl,o),",",Ru(Pl,a)],--r;++r<u;)e=n[r%i],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Du(t,o,a);return t.join("")}function Tu(n,t){var e=n.length-1;if(e)for(var r,i,u=n[0][0],o=n[0][1],a=n[e][0]-u,l=n[e][1]-o,c=-1;++c<=e;)r=n[c],i=c/e,r[0]=t*r[0]+(1-t)*(u+i*a),r[1]=t*r[1]+(1-t)*(o+i*l);return zu(n)}function Ru(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Du(n,t,e){n.push("C",Ru(Rl,t),",",Ru(Rl,e),",",Ru(Dl,t),",",Ru(Dl,e),",",Ru(Pl,t),",",Ru(Pl,e))}function Pu(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Uu(n){for(var t=0,e=n.length-1,r=[],i=n[0],u=n[1],o=r[0]=Pu(i,u);++t<e;)r[t]=(o+(o=Pu(i=u,u=n[t+1])))/2;return r[t]=o,r}function ju(n){for(var t,e,r,i,u=[],o=Uu(n),a=-1,l=n.length-1;++a<l;)t=Pu(n[a],n[a+1]),xo(t)<Uo?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,i=e*e+r*r,i>9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i<u;)t=n[i],e=t[0],r=t[1]-Io,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Ou(n){function t(t){function l(){v.push("M",a(n(y),s),f,c(n(d.reverse()),s),"Z")}for(var h,p,g,v=[],d=[],y=[],m=-1,M=t.length,x=En(e),b=En(i),_=e===r?function(){ + return p}:En(r),w=i===u?function(){return g}:En(u);++m<M;)o.call(this,h=t[m],m)?(d.push([p=+x.call(this,h,m),g=+b.call(this,h,m)]),y.push([+_.call(this,h,m),+w.call(this,h,m)])):d.length&&(l(),d=[],y=[]);return d.length&&l(),v.length?v.join(""):null}var e=Ce,r=Ce,i=0,u=ze,o=zt,a=xu,l=a.key,c=a,f="L",s=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(i=u=n,t):u},t.y0=function(n){return arguments.length?(i=n,t):i},t.y1=function(n){return arguments.length?(u=n,t):u},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(l="function"==typeof n?a=n:(a=Tl.get(n)||xu).key,c=a.reverse||a,f=a.closed?"M":"L",t):l},t.tension=function(n){return arguments.length?(s=n,t):s},t}function Iu(n){return n.radius}function Yu(n){return[n.x,n.y]}function Zu(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Io;return[e*Math.cos(r),e*Math.sin(r)]}}function Vu(){return 64}function Xu(){return"circle"}function $u(n){var t=Math.sqrt(n/Fo);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Bu(n){return function(){var t,e,r;(t=this[n])&&(r=t[e=t.active])&&(r.timer.c=null,r.timer.t=NaN,--t.count?delete t[e]:delete this[n],t.active+=.5,r.event&&r.event.interrupt.call(this,this.__data__,r.index))}}function Wu(n,t,e){return ko(n,Yl),n.namespace=t,n.id=e,n}function Ju(n,t,e,r){var i=n.id,u=n.namespace;return Y(n,"function"==typeof e?function(n,o,a){n[u][i].tween.set(t,r(e.call(n,n.__data__,o,a)))}:(e=r(e),function(n){n[u][i].tween.set(t,e)}))}function Gu(n){return null==n&&(n=""),function(){this.textContent=n}}function Ku(n){return null==n?"__transition__":"__transition_"+n+"__"}function Qu(n,t,e,r,i){function u(n){var t=v.delay;return f.t=t+l,n>=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.count,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro(n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]<Kl[u]/i?u-1:u]:[tc,Ki(n,e)[2]]}return r.invert=function(t){return io(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(io)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,io(+e+1),t).length}var u=r.domain(),o=Yi(u),a=null==n?i(o,10):"number"==typeof n&&i(o,n);return a&&(n=a[0],t=a[1]),r.domain(Xi(u,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.responseText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u;)if(null!=(r=n[i])&&r>=r){e=r;break}for(;++i<u;)null!=(r=n[i])&&e>r&&(e=r)}else{for(;++i<u;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=r;break}for(;++i<u;)null!=(r=t.call(n,n[i],i))&&e>r&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u;)if(null!=(r=n[i])&&r>=r){e=r;break}for(;++i<u;)null!=(r=n[i])&&r>e&&(e=r)}else{for(;++i<u;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=r;break}for(;++i<u;)null!=(r=t.call(n,n[i],i))&&r>e&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u<o;)if(null!=(r=n[u])&&r>=r){e=i=r;break}for(;++u<o;)null!=(r=n[u])&&(e>r&&(e=r),r>i&&(i=r))}else{for(;++u<o;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=i=r;break}for(;++u<o;)null!=(r=t.call(n,n[u],u))&&(e>r&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o<u;)i(e=+n[o])&&(r+=e);else for(;++o<u;)i(e=+t.call(n,n[o],o))&&(r+=e);return r},ao.mean=function(n,t){var e,u=0,o=n.length,a=-1,l=o;if(1===arguments.length)for(;++a<o;)i(e=r(n[a]))?u+=e:--l;else for(;++a<o;)i(e=r(t.call(n,n[a],a)))?u+=e:--l;return l?u/l:void 0},ao.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),i=+n[r-1],u=e-r;return u?i+u*(n[r]-i):i},ao.median=function(n,t){var u,o=[],a=n.length,l=-1;if(1===arguments.length)for(;++l<a;)i(u=r(n[l]))&&o.push(u);else for(;++l<a;)i(u=r(t.call(n,n[l],l)))&&o.push(u);return o.length?ao.quantile(o.sort(e),.5):void 0},ao.variance=function(n,t){var e,u,o=n.length,a=0,l=0,c=-1,f=0;if(1===arguments.length)for(;++c<o;)i(e=r(n[c]))&&(u=e-a,a+=u/++f,l+=u*(e-a));else for(;++c<o;)i(e=r(t.call(n,n[c],c)))&&(u=e-a,a+=u/++f,l+=u*(e-a));return f>1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t<e;)for(var i,u=-1,a=r[t]=new Array(i);++u<i;)a[u]=n[u][t];return r},ao.zip=function(){return ao.transpose(arguments)},ao.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ao.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ao.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ao.merge=function(n){for(var t,e,r,i=n.length,u=-1,o=0;++u<i;)o+=n[u].length;for(e=new Array(o);--i>=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)<t;)i.push(r/u);return i},ao.map=function(n,t){var e=new c;if(n instanceof c)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,i=-1,u=n.length;if(1===arguments.length)for(;++i<u;)e.set(i,n[i]);else for(;++i<u;)e.set(t.call(n,r=n[i],i),r)}else for(var o in n)e.set(o,n[o]);return e};var bo="__proto__",_o="\x00";l(c,{has:h,get:function(n){return this._[f(n)]},set:function(n,t){return this._[f(n)]=t},remove:p,keys:g,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:s(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t),this._[t])}}),ao.nest=function(){function n(t,o,a){if(a>=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p<g;)(h=d.get(l=v(f=o[p])))?h.push(f):d.set(l,[f]);return t?(f=t(),s=function(e,r){f.set(e,n(t,r,a))}):(f={},s=function(e,r){f[e]=n(t,r,a)}),d.forEach(s),f}function t(n,e){if(e>=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r<i;)n[e=arguments[r]]=M(n,t,t[e]);return n};var wo=["webkit","ms","moz","Moz","o","O"];ao.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o<a;){u.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var l=-1,c=r.length;++l<c;)(i=r[l])?(t.push(e=n.call(i,i.__data__,l,o)),e&&"__data__"in i&&(e.__data__=i.__data__)):t.push(null)}return E(u)},Co.selectAll=function(n){var t,e,r=[];n=C(n);for(var i=-1,u=this.length;++i<u;)for(var o=this[i],a=-1,l=o.length;++a<l;)(e=o[a])&&(r.push(t=co(n.call(e,e.__data__,a,i))),t.parentNode=e);return E(r)};var zo="http://www.w3.org/1999/xhtml",Lo={svg:"http://www.w3.org/2000/svg",xhtml:zo,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ao.ns={prefix:Lo,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++i<r;)if(!t.contains(n[i]))return!1}else for(t=e.getAttribute("class");++i<r;)if(!q(n[i]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},Co.style=function(n,e,r){var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++r<o;)(i=n[r])&&(y.has(d=t.call(i,i.__data__,r))?v[r]=i:y.set(d,i),m[r]=d);for(r=-1;++r<s;)(i=y.get(d=t.call(e,u=e[r],r)))?i!==!0&&(p[r]=i,i.__data__=u):g[r]=H(u),y.set(d,!0);for(r=-1;++r<o;)r in m&&y.get(m[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],u=e[r],i?(i.__data__=u,p[r]=i):g[r]=H(u);for(;s>r;++r)g[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++u<o;)(i=r[u])&&(n[u]=i.__data__);return n}var a=Z([]),l=E([]),f=E([]);if("function"==typeof n)for(;++u<o;)e(r=this[u],n.call(r,r.parentNode.__data__,u));else for(;++u<o;)e(r=this[u],n);return l.enter=function(){return a},l.exit=function(){return f},l},Co.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},Co.filter=function(n){var t,e,r,i=[];"function"!=typeof n&&(n=O(n));for(var u=0,o=this.length;o>u;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],i=r.length-1,u=r[i];--i>=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Co.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Co.call=function(n){var t=co(arguments);return n.apply(t[0]=this,t),this},Co.empty=function(){return!this.node()},Co.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++a<l;){r=(i=this[a]).update,o.push(t=[]),t.parentNode=i.parentNode;for(var c=-1,f=i.length;++c<f;)(u=i[c])?(t.push(r[c]=e=n.call(i.parentNode,u.__data__,c,a)),e.__data__=u.__data__):t.push(null)}return E(o)},qo.insert=function(n,t){return arguments.length<2&&(t=V(this)),Co.insert.call(this,n,t)},ao.select=function(t){var e;return"string"==typeof t?(e=[No(t,fo)],e.parentNode=fo.documentElement):(e=[t],e.parentNode=n(t)),E([e])},ao.selectAll=function(n){var t;return"string"==typeof n?(t=co(Eo(n,fo)),t.parentNode=fo.documentElement):(t=co(n),t.parentNode=null),E([t])},Co.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return new fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ua.forEach(function(n,t){ua.set(n,Mn(t))}),ao.functor=En,ao.xhr=An(m),ao.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var o=Cn(n,t,null==e?r:i(e),u);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:i(n)):e},o}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function u(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(f>=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}f=e+2;var r=n.charCodeAt(e+1);return 13===r?(i=!0,10===n.charCodeAt(e+2)&&++f):10===r&&(i=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;c>f;){var r=n.charCodeAt(f++),a=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(f)&&(++f,++a);else if(r!==l)continue;return n.slice(t,f-a)}return n.slice(t)}for(var r,i,u={},o={},a=[],c=n.length,f=0,s=0;(r=e())!==o;){for(var h=[];r!==u&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,s++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new y,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(u).join("\n")},e},ao.csv=ao.dsv(",","text/csv"),ao.tsv=ao.dsv(" ","text/tab-separated-values");var oa,aa,la,ca,fa=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ao.timer=function(){qn.apply(this,arguments)},ao.timer.flush=function(){Rn(),Dn()},ao.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var sa=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Un);ao.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=ao.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),sa[8+e/3]};var ha=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pa=ao.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ao.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ga=ao.time={},va=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){da.setUTCDate.apply(this._,arguments)},setDay:function(){da.setUTCDay.apply(this._,arguments)},setFullYear:function(){da.setUTCFullYear.apply(this._,arguments)},setHours:function(){da.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){da.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){da.setUTCMinutes.apply(this._,arguments)},setMonth:function(){da.setUTCMonth.apply(this._,arguments)},setSeconds:function(){da.setUTCSeconds.apply(this._,arguments)},setTime:function(){da.setTime.apply(this._,arguments)}};var da=Date.prototype;ga.year=On(function(n){return n=ga.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ga.years=ga.year.range,ga.years.utc=ga.year.utc.range,ga.day=On(function(n){var t=new va(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ga.days=ga.day.range,ga.days.utc=ga.day.utc.range,ga.dayOfYear=function(n){var t=ga.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ga[n]=On(function(n){return(n=ga.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ga[n+"s"]=e.range,ga[n+"s"].utc=e.utc.range,ga[n+"OfYear"]=function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)}}),ga.week=ga.sunday,ga.weeks=ga.sunday.range,ga.weeks.utc=ga.sunday.utc.range,ga.weekOfYear=ga.sundayOfYear;var ya={"-":"",_:" ",0:"0"},ma=/^\s*\d+/,Ma=/^%/;ao.locale=function(n){return{numberFormat:jn(n),timeFormat:Yn(n)}};var xa=ao.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], + shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ao.format=xa.numberFormat,ao.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,ba),st(ba.s,this.s,this),this.s?this.t+=ba.t:this.s=ba.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ba=new ft;ao.geo.stream=function(n,t){n&&_a.hasOwnProperty(n.type)?_a[n.type](n,t):ht(n,t)};var _a={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++r<i;)ht(e[r].geometry,t)}},wa={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){pt(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)pt(e[r],t,0)},Polygon:function(n,t){gt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)gt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,i=e.length;++r<i;)ht(e[r],t)}};ao.geo.area=function(n){return Sa=0,ao.geo.stream(n,Na),Sa};var Sa,ka=new ft,Na={sphere:function(){Sa+=4*Fo},point:b,lineStart:b,lineEnd:b,polygonStart:function(){ka.reset(),Na.lineStart=vt},polygonEnd:function(){var n=2*ka;Sa+=0>n?4*Fo+n:n,Na.lineStart=Na.lineEnd=Na.point=b}};ao.geo.bounds=function(){function n(n,t){M.push(x=[f=n,h=n]),s>t&&(s=t),t>p&&(p=t)}function t(t,e){var r=dt([t*Yo,e*Yo]);if(y){var i=mt(y,r),u=[i[1],-i[0],0],o=mt(u,i);bt(o),o=_t(o);var l=t-g,c=l>0?1:-1,v=o[0]*Zo*c,d=xo(l)>180;if(d^(v>c*g&&c*t>v)){var m=o[1]*Zo;m>p&&(p=m)}else if(v=(v+360)%360-180,d^(v>c*g&&c*t>v)){var m=-o[1]*Zo;s>m&&(s=m)}else s>e&&(s=e),e>p&&(p=e);d?g>t?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(f>t&&(f=t),t>h&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){b.point=t}function r(){x[0]=f,x[1]=h,b.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=xo(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Na.point(n,e),t(n,e)}function u(){Na.lineStart()}function o(){i(v,d),Na.lineEnd(),xo(m)>Uo&&(f=-(h=180)),x[0]=f,x[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var f,s,h,p,g,v,d,y,m,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=i,b.lineStart=u,b.lineEnd=o,m=0,Na.polygonStart()},polygonEnd:function(){Na.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>ka?(f=-(h=180),s=-(p=90)):m>Uo?p=90:-Uo>m&&(s=-90),x[0]=f,x[1]=h}};return function(n){p=h=-(f=s=1/0),M=[],ao.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],c(e[0],i)||c(e[1],i)?(a(i[0],e[1])>a(i[0],i[1])&&(i[1]=e[1]),a(e[0],i[1])>a(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var o,e,g=-(1/0),t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(o=a(i[1],e[0]))>g&&(g=o,f=e[0],h=i[1])}return M=x=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),ao.geo.centroid=function(n){Ea=Aa=Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,ja);var t=Da,e=Pa,r=Ua,i=t*t+e*e+r*r;return jo>i&&(t=qa,e=Ta,r=Ra,Uo>Aa&&(t=Ca,e=za,r=La),i=t*t+e*e+r*r,jo>i)?[NaN,NaN]:[Math.atan2(e,t)*Zo,tn(r/Math.sqrt(i))*Zo]};var Ea,Aa,Ca,za,La,qa,Ta,Ra,Da,Pa,Ua,ja={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){ja.lineStart=At},polygonEnd:function(){ja.lineStart=Nt}},Fa=Rt(zt,jt,Ht,[-Fo,-Fo/2]),Ha=1e9;ao.geo.clipExtent=function(){var n,t,e,r,i,u,o={stream:function(n){return i&&(i.valid=!1),i=u(n),i.valid=!0,i},extent:function(a){return arguments.length?(u=Zt(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),i&&(i.valid=!1,i=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ao.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,ao.geo.albers=function(){return ao.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ao.geo.albersUsa=function(){function n(n){var u=n[0],o=n[1];return t=null,e(u,o),t||(r(u,o),t)||i(u,o),t}var t,e,r,i,u=ao.geo.albers(),o=ao.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ao.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?o:i>=.166&&.234>i&&r>=-.214&&-.115>r?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Uo,s+.12*c+Uo],[f-.214*c-Uo,s+.234*c-Uo]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Uo,s+.166*c+Uo],[f-.115*c-Uo,s+.234*c-Uo]]).stream(l).point,n},n.scale(1070)};var Oa,Ia,Ya,Za,Va,Xa,$a={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Ia=0,$a.lineStart=$t},polygonEnd:function(){$a.lineStart=$a.lineEnd=$a.point=b,Oa+=xo(Ia/2)}},Ba={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Wa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Wa.lineStart=ne},polygonEnd:function(){Wa.point=Gt,Wa.lineStart=Kt,Wa.lineEnd=Qt}};ao.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),ao.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return Oa=0,ao.geo.stream(n,i($a)),Oa},n.centroid=function(n){return Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,i(Wa)),Ua?[Da/Ua,Pa/Ua]:Ra?[qa/Ra,Ta/Ra]:La?[Ca/La,za/La]:[NaN,NaN]},n.bounds=function(n){return Va=Xa=-(Ya=Za=1/0),ao.geo.stream(n,i(Ba)),[[Ya,Za],[Va,Xa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(ao.geo.albersUsa()).context(null)},ao.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ao.geo.projection=oe,ao.geo.projectionMutator=ae,(ao.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,ao.geo.rotation=function(n){function t(t){return t=n(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t}return n=se(n[0]%360*Yo,n[1]*Yo,n.length>2?n[2]*Yo:0),t.invert=function(t){return t=n.invert(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t},t},fe.invert=ce,ao.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Yo,-n[1]*Yo,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Zo,n[1]*=Zo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Yo,i*Yo),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Yo,(i=+r)*Yo),n):i},n.angle(90)},ao.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Yo,i=n[1]*Yo,u=t[1]*Yo,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},ao.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ao.range(Math.ceil(u/d)*d,i,d).map(h).concat(ao.range(Math.ceil(c/y)*y,l,y).map(p)).concat(ao.range(Math.ceil(r/g)*g,e,g).filter(function(n){return xo(n%d)>Uo}).map(f)).concat(ao.range(Math.ceil(a/v)*v,o,v).filter(function(n){return xo(n%y)>Uo}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,v=g,d=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],y=+t[1],n):[d,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],v=+t[1],n):[g,v]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Uo],[180,90-Uo]]).minorExtent([[-180,-80-Uo],[180,80+Uo]])},ao.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=Me,i=xe;return n.distance=function(){return ao.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ao.geo.interpolate=function(n,t){return be(n[0]*Yo,n[1]*Yo,t[0]*Yo,t[1]*Yo)},ao.geo.length=function(n){return Ja=0,ao.geo.stream(n,Ga),Ja};var Ja,Ga={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Ka=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ao.geo.azimuthalEqualArea=function(){return oe(Ka)}).raw=Ka;var Qa=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(ao.geo.azimuthalEquidistant=function(){return oe(Qa)}).raw=Qa,(ao.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(ao.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var nl=we(function(n){return 1/n},Math.atan);(ao.geo.gnomonic=function(){return oe(nl)}).raw=nl,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Io]},(ao.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var tl=we(function(){return 1},Math.asin);(ao.geo.orthographic=function(){return oe(tl)}).raw=tl;var el=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ao.geo.stereographic=function(){return oe(el)}).raw=el,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Io]},(ao.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,ao.geom={},ao.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;o>t;t++)a.push([+i.call(this,n[t],t),+u.call(this,n[t],t),t]);for(a.sort(qe),t=0;o>t;t++)l.push([a[t][0],-a[t][1]]);var c=Le(a),f=Le(l),s=f[0]===c[0],h=f[f.length-1]===c[c.length-1],p=[];for(t=c.length-1;t>=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t<f.length-h;++t)p.push(n[a[f[t]][2]]);return p}var e=Ce,r=ze;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ao.geom.polygon=function(n){return ko(n,rl),n};var rl=ao.geom.polygon.prototype=[];rl.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],i=0;++t<e;)n=r,r=this[t],i+=n[1]*r[0]-n[0]*r[1];return.5*i},rl.centroid=function(n){var t,e,r=-1,i=this.length,u=0,o=0,a=this[i-1];for(arguments.length||(n=-1/(6*this.area()));++r<i;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],u+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[u*n,o*n]},rl.clip=function(n){for(var t,e,r,i,u,o,a=De(n),l=-1,c=this.length-De(this),f=this[c-1];++l<c;){for(t=n.slice(),n.length=0,i=this[l],u=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],Te(o,f,i)?(Te(u,f,i)||n.push(Re(u,o,f,i)),n.push(o)):Te(u,f,i)&&n.push(Re(u,o,f,i)),u=o;a&&n.push(n[0]),f=i}return n};var il,ul,ol,al,ll,cl=[],fl=[];Ye.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Ve),t.length},tr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},er.prototype={insert:function(n,t){var e,r,i;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=or(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(i=r.R,i&&i.C?(e.C=i.C=!1,r.C=!0,n=r):(n===e.R&&(ir(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ur(this,r))):(i=r.L,i&&i.C?(e.C=i.C=!1,r.C=!0,n=r):(n===e.L&&(ur(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ir(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,i=n.U,u=n.L,o=n.R;if(e=u?o?or(o):u:o,i?i.L===n?i.L=e:i.R=e:this._=e,u&&o?(r=e.C,e.C=n.C,e.L=u,u.U=e,e!==o?(i=e.U,e.U=n.U,n=e.R,i.L=n,e.R=o,o.U=e):(e.U=i,i=e,n=e.R)):(r=n.C,n=e),n&&(n.U=i),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===i.L){if(t=i.R,t.C&&(t.C=!1,i.C=!0,ir(this,i),t=i.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ur(this,t),t=i.R),t.C=i.C,i.C=t.R.C=!1,ir(this,i),n=this._;break}}else if(t=i.L,t.C&&(t.C=!1,i.C=!0,ur(this,i),t=i.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,ir(this,t),t=i.L),t.C=i.C,i.C=t.L.C=!1,ur(this,i),n=this._;break}t.C=!0,n=i,i=i.U}while(!n.C);n&&(n.C=!1)}}},ao.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],i=a[0][1],u=a[1][0],o=a[1][1];return ar(e(n),a).cells.forEach(function(e,a){var l=e.edges,c=e.site,f=t[a]=l.length?l.map(function(n){var t=n.start();return[t.x,t.y]}):c.x>=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[];f.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Uo)*Uo,y:Math.round(o(n,t)/Uo)*Uo,i:t}})}var r=Ce,i=ze,u=r,o=i,a=sl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u,o=e.site,a=e.edges.sort(Ve),l=-1,c=a.length,f=a[c-1].edge,s=f.l===o?f.r:f.l;++l<c;)i=f,u=s,f=a[l].edge,s=f.l===o?f.r:f.l,r<u.i&&r<s.i&&cr(o,u,s)<0&&t.push([n[r],n[u.i],n[s.i]])}),t},t.x=function(n){return arguments.length?(u=En(r=n),t):r},t.y=function(n){return arguments.length?(o=En(i=n),t):i},t.clipExtent=function(n){return arguments.length?(a=null==n?sl:n,t):a===sl?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===sl?null:a&&a[1]},t)};var sl=[[-1e6,-1e6],[1e6,1e6]];ao.geom.delaunay=function(n){return ao.geom.voronoi().triangles(n)},ao.geom.quadtree=function(n,t,e,r,i){function u(n){function u(n,t,e,r,i,u,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var l=n.x,f=n.y;if(null!=l)if(xo(l-e)+xo(f-r)<.01)c(n,t,e,r,i,u,o,a);else{var s=n.point;n.x=n.y=n.point=null,c(n,s,l,f,i,u,o,a),c(n,t,e,r,i,u,o,a)}else n.x=e,n.y=r,n.point=t}else c(n,t,e,r,i,u,o,a)}function c(n,t,e,r,i,o,a,l){var c=.5*(i+a),f=.5*(o+l),s=e>=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]=hr()),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,v,d,y,m,M=En(a),x=En(l);if(null!=t)v=t,d=e,y=r,m=i;else if(y=m=-(v=d=1/0),s=[],h=[],g=n.length,o)for(p=0;g>p;++p)f=n[p],f.x<v&&(v=f.x),f.y<d&&(d=f.y),f.x>y&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;g>p;++p){var b=+M(f=n[p],p),_=+x(f,p);v>b&&(v=b),d>_&&(d=_),b>y&&(y=b),_>m&&(m=_),s.push(b),h.push(_)}var w=y-v,S=m-d;w>S?m=d+w:y=v+S;var k=hr();if(k.add=function(n){u(k,n,+M(n,++p),+x(n,p),v,d,y,m)},k.visit=function(n){pr(n,k,v,d,y,m)},k.find=function(n){return gr(k,n[0],n[1],v,d,y,m)},p=-1,null==t){for(;++p<g;)u(k,n[p],s[p],h[p],v,d,y,m);--p}else n.forEach(k.add);return s=h=n=f=null,k}var o,a=Ce,l=ze;return(o=arguments.length)?(a=fr,l=sr,3===o&&(i=e,r=t,e=t=0),u(n)):(u.x=function(n){return arguments.length?(a=n,u):a},u.y=function(n){return arguments.length?(l=n,u):l},u.extent=function(n){return arguments.length?(null==n?t=e=r=i=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],i=+n[1][1]),u):null==t?null:[[t,e],[r,i]]},u.size=function(n){return arguments.length?(null==n?t=e=r=i=null:(t=e=0,r=+n[0],i=+n[1]),u):null==t?null:[r-t,i-e]},u)},ao.interpolateRgb=vr,ao.interpolateObject=dr,ao.interpolateNumber=yr,ao.interpolateString=mr;var hl=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,pl=new RegExp(hl.source,"g");ao.interpolate=Mr,ao.interpolators=[function(n,t){var e=typeof t;return("string"===e?ua.has(t.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(t)?vr:mr:t instanceof an?vr:Array.isArray(t)?xr:"object"===e&&isNaN(t)?dr:yr)(n,t)}],ao.interpolateArray=xr;var gl=function(){return m},vl=ao.map({linear:gl,poly:Er,quad:function(){return Sr},cubic:function(){return kr},sin:function(){return Ar},exp:function(){return Cr},circle:function(){return zr},elastic:Lr,back:qr,bounce:function(){return Tr}}),dl=ao.map({"in":m,out:_r,"in-out":wr,"out-in":function(n){return wr(_r(n))}});ao.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=vl.get(e)||gl,r=dl.get(r)||m,br(r(e.apply(null,lo.call(arguments,1))))},ao.interpolateHcl=Rr,ao.interpolateHsl=Dr,ao.interpolateLab=Pr,ao.interpolateRound=Ur,ao.transform=function(n){var t=fo.createElementNS(ao.ns.prefix.svg,"g");return(ao.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:yl)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var yl={a:1,b:0,c:0,d:1,e:0,f:0};ao.interpolateTransform=$r,ao.layout={},ao.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Jr(n[e]));return t}},ao.layout.chord=function(){function n(){var n,c,s,h,p,g={},v=[],d=ao.range(u),y=[];for(e=[],r=[],n=0,h=-1;++h<u;){for(c=0,p=-1;++p<u;)c+=i[h][p];v.push(c),y.push(ao.range(u)),n+=c}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&y.forEach(function(n,t){n.sort(function(n,e){return a(i[t][n],i[t][e])})}),n=(Ho-f*u)/n,c=0,h=-1;++h<u;){for(s=c,p=-1;++p<u;){var m=d[h],M=y[m][p],x=i[m][M],b=c,_=c+=x*n;g[m+"-"+M]={index:m,subindex:M,startAngle:b,endAngle:_,value:x}}r[m]={index:m,startAngle:s,endAngle:c,value:v[m]},c+=f}for(h=-1;++h<u;)for(p=h-1;++p<u;){var w=g[h+"-"+p],S=g[p+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}l&&t()}function t(){e.sort(function(n,t){return l((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,i,u,o,a,l,c={},f=0;return c.matrix=function(n){return arguments.length?(u=(i=n)&&i.length,e=r=null,c):i},c.padding=function(n){return arguments.length?(f=n,e=r=null,c):f},c.sortGroups=function(n){return arguments.length?(o=n,e=r=null,c):o},c.sortSubgroups=function(n){return arguments.length?(a=n,e=null,c):a},c.sortChords=function(n){return arguments.length?(l=n,e&&t(),c):l},c.chords=function(){return e||n(),e},c.groups=function(){return r||n(),r},c},ao.layout.force=function(){function n(n){return function(t,e,r,i){if(t.point!==n){var u=t.cx-n.x,o=t.cy-n.y,a=i-e,l=u*u+o*o;if(l>a*a/y){if(v>l){var c=t.charge/l;n.px-=u*c,n.py-=o*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=u*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=ao.event.x,n.py=ao.event.y,l.resume()}var e,r,i,u,o,a,l={},c=ao.dispatch("start","tick","end"),f=[1,1],s=.9,h=ml,p=Ml,g=-30,v=xl,d=.1,y=.64,M=[],x=[];return l.tick=function(){if((i*=.99)<.005)return e=null,c.end({type:"end",alpha:i=0}),!0;var t,r,l,h,p,v,y,m,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,p=l.target,m=p.x-h.x,b=p.y-h.y,(v=m*m+b*b)&&(v=i*o[r]*((v=Math.sqrt(v))-u[r])/v,m*=v,b*=v,p.x-=m*(y=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=b*y,h.x+=m*(y=1-y),h.y+=b*y);if((y=i*d)&&(m=f[0]/2,b=f[1]/2,r=-1,y))for(;++r<_;)l=M[r],l.x+=(m-l.x)*y,l.y+=(b-l.y)*y;if(g)for(ri(t=ao.geom.quadtree(M),i,a),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*s,l.y-=(l.py-(l.py=l.y))*s);c.tick({type:"tick",alpha:i})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(f=n,l):f},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.friction=function(n){return arguments.length?(s=+n,l):s},l.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(y=n*n,l):Math.sqrt(y)},l.alpha=function(n){return arguments.length?(n=+n,i?n>0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;i>l;++l)e[l]=[];for(l=0;c>l;++l){var u=x[l];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var o,a=e[t],l=-1,f=a.length;++l<f;)if(!isNaN(o=a[l][n]))return o;return Math.random()*r}var t,e,r,i=M.length,c=x.length,s=f[0],v=f[1];for(t=0;i>t;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;i>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",s)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof h)for(t=0;c>t;++t)u[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)u[t]=h;if(o=[],"function"==typeof p)for(t=0;c>t;++t)o[t]=+p.call(this,x[t],t);else for(t=0;c>t;++t)o[t]=p;if(a=[],"function"==typeof g)for(t=0;i>t;++t)a[t]=+g.call(this,M[t],t);else for(t=0;i>t;++t)a[t]=g;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=ao.behavior.drag().origin(m).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?void this.on("mouseover.force",ti).on("mouseout.force",ei).call(r):r},ao.rebind(l,c,"on")};var ml=20,Ml=1,xl=1/0;ao.layout.hierarchy=function(){function n(i){var u,o=[i],a=[];for(i.depth=0;null!=(u=o.pop());)if(a.push(u),(c=e.call(n,u,u.depth))&&(l=c.length)){for(var l,c,f;--l>=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return oi(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=ci,e=ai,r=li;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ui(t,function(n){n.children&&(n.value=0)}),oi(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ao.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++c<o;)n(a=u[c],e,l=a.value*r,i),e+=l}}function t(n){var e=n.children,r=0;if(e&&(i=e.length))for(var i,u=-1;++u<i;)r=Math.max(r,t(e[u]));return 1+r}function e(e,u){var o=r.call(this,e,u);return n(o[0],0,i[0],i[1]/t(o[0])),o}var r=ao.layout.hierarchy(),i=[1,1];return e.size=function(n){return arguments.length?(i=n,e):i},ii(e,r)},ao.layout.pie=function(){function n(o){var a,l=o.length,c=o.map(function(e,r){return+t.call(n,e,r)}),f=+("function"==typeof r?r.apply(this,arguments):r),s=("function"==typeof i?i.apply(this,arguments):i)-f,h=Math.min(Math.abs(s)/l,+("function"==typeof u?u.apply(this,arguments):u)),p=h*(0>s?-1:1),g=ao.sum(c),v=g?(s-l*p)/g:0,d=ao.range(l),y=[];return null!=e&&d.sort(e===bl?function(n,t){return c[t]-c[n]}:function(n,t){return e(o[n],o[t])}),d.forEach(function(n){y[n]={data:o[n],value:a=c[n],startAngle:f,endAngle:f+=a*v+p,padAngle:h}}),y}var t=Number,e=bl,r=0,i=Ho,u=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n.padAngle=function(t){return arguments.length?(u=t,n):u},n};var bl={};ao.layout.stack=function(){function n(a,l){if(!(h=a.length))return a;var c=a.map(function(e,r){return t.call(n,e,r)}),f=c.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),o.call(n,t,e)]})}),s=e.call(n,f,l);c=ao.permute(c,s),f=ao.permute(f,s);var h,p,g,v,d=r.call(n,f,l),y=c[0].length;for(g=0;y>g;++g)for(i.call(n,c[0][g],v=d[g],f[0][g][1]),p=1;h>p;++p)i.call(n,c[p][g],v+=f[p-1][g][1],f[p][g][1]);return a}var t=m,e=gi,r=vi,i=pi,u=si,o=hi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:_l.get(t)||gi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:wl.get(t)||vi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(i=t,n):i},n};var _l=ao.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(di),u=n.map(yi),o=ao.range(r).sort(function(n,t){return i[n]-i[t]}),a=0,l=0,c=[],f=[];for(t=0;r>t;++t)e=o[t],l>a?(a+=u[e],c.push(e)):(l+=u[e],f.push(e));return f.reverse().concat(c)},reverse:function(n){return ao.range(n.length).reverse()},"default":gi}),wl=ao.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,o=[],a=0,l=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;u>e;++e)l[e]=(a-o[e])/2;return l},wiggle:function(n){var t,e,r,i,u,o,a,l,c,f=n.length,s=n[0],h=s.length,p=[];for(p[0]=l=c=0,e=1;h>e;++e){for(t=0,i=0;f>t;++t)i+=n[t][e][1];for(t=0,u=0,a=s[e][0]-s[e-1][0];f>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;u+=o*n[t][e][1]}p[e]=l-=i?u/i*a:0,c>l&&(c=l)}for(e=0;h>e;++e)p[e]-=c;return p},expand:function(n){var t,e,r,i=n.length,u=n[0].length,o=1/i,a=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=o}for(e=0;u>e;++e)a[e]=0;return a},zero:vi});ao.layout.histogram=function(){function n(n,u){for(var o,a,l=[],c=n.map(e,this),f=r.call(this,c,u),s=i.call(this,f,c,u),u=-1,h=c.length,p=s.length-1,g=t?1:1/h;++u<p;)o=l[u]=[],o.dx=s[u+1]-(o.x=s[u]),o.y=0;if(p>0)for(u=-1;++u<h;)a=c[u],a>=f[0]&&a<=f[1]&&(o=l[ao.bisect(s,a,1,p)-1],o.y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=bi,i=Mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ao.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,oi(a,function(n){n.r=+f(n.value)}),oi(a,Ni),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;oi(a,function(n){n.r+=s}),oi(a,Ni),oi(a,function(n){n.r-=s})}return Ci(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=ao.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ao.layout.tree=function(){function n(n,i){var f=o.call(this,n,i),s=f[0],h=t(s);if(oi(h,e),h.parent.m=-h.z,ui(h,r),c)ui(s,u);else{var p=s,g=s,v=s;ui(s,function(n){n.x<p.x&&(p=n),n.x>g.x&&(g=n),n.depth>v.depth&&(v=n)});var d=a(p,g)/2-p.x,y=l[0]/(g.x+a(g,p)/2+d),m=l[1]/(v.depth||1);ui(s,function(n){n.x=(n.x+d)*y,n.y=n.depth*m})}return f}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var i,u=t.children,o=0,a=u.length;a>o;++o)r.push((u[o]=i={_:u[o],parent:t,children:(i=u[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Di(n);var u=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-u):n.z=u}else r&&(n.z=r.z+a(n._,r._));n.parent.A=i(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function i(n,t,e){if(t){for(var r,i=n,u=n,o=t,l=i.parent.children[0],c=i.m,f=u.m,s=o.m,h=l.m;o=Ti(o),i=qi(i),o&&i;)l=qi(l),u=Ti(u),u.a=n,r=o.z+s-i.z-c+a(o._,i._),r>0&&(Ri(Pi(o,n,e),n,r),c+=r,f+=r),s+=o.m,c+=i.m,h+=l.m,f+=u.m;o&&!Ti(u)&&(u.t=o,u.m+=s-f),i&&!qi(l)&&(l.t=i,l.m+=c-h,e=n)}return e}function u(n){n.x*=l[0],n.y=n.depth*l[1]}var o=ao.layout.hierarchy().sort(null).value(null),a=Li,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(c=null==(l=t)?u:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:u,n):c?l:null},ii(n,o)},ao.layout.cluster=function(){function n(n,u){var o,a=t.call(this,n,u),l=a[0],c=0;oi(l,function(n){var t=n.children;t&&t.length?(n.x=ji(t),n.y=Ui(t)):(n.x=o?c+=e(n,o):0,n.y=0,o=n)});var f=Fi(l),s=Hi(l),h=f.x-e(f,s)/2,p=s.x+e(s,f)/2;return oi(l,i?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(p-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),a}var t=ao.layout.hierarchy().sort(null).value(null),e=Li,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ao.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++i<u;)r=(e=n[i]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var o,a,l,c=s(e),f=[],h=u.slice(),g=1/0,v="slice"===p?c.dx:"dice"===p?c.dy:"slice-dice"===p?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),f.area=0;(l=h.length)>0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,v))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,v,c,!1),v=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,v,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(u>e&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0; + if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++u<o;)i=n[u],i.x=a,i.y=c,i.dy=f,a+=i.dx=Math.min(e.x+e.dx-a,f?l(i.area/f):0);i.z=!0,i.dx+=e.x+e.dx-a,e.y+=f,e.dy-=f}else{for((r||f>e.dx)&&(f=e.dx);++u<o;)i=n[u],i.x=a,i.y=c,i.dx=f,c+=i.dy=Math.min(e.y+e.dy-c,f?l(i.area/f):0);i.z=!1,i.dy+=e.y+e.dy-c,e.x+=f,e.dx-=f}}function u(r){var i=o||a(r),u=i[0];return u.x=u.y=0,u.value?(u.dx=c[0],u.dy=c[1]):u.dx=u.dy=0,o&&a.revalue(u),n([u],u.dx*u.dy/u.value),(o?e:t)(u),h&&(o=i),i}var o,a=ao.layout.hierarchy(),l=Math.round,c=[1,1],f=null,s=Oi,h=!1,p="squarify",g=.5*(1+Math.sqrt(5));return u.size=function(n){return arguments.length?(c=n,u):c},u.padding=function(n){function t(t){var e=n.call(u,t,t.depth);return null==e?Oi(t):Ii(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Ii(t,n)}if(!arguments.length)return f;var r;return s=null==(f=n)?Oi:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,u},u.round=function(n){return arguments.length?(l=n?Math.round:Number,u):l!=Number},u.sticky=function(n){return arguments.length?(h=n,o=null,u):h},u.ratio=function(n){return arguments.length?(g=n,u):g},u.mode=function(n){return arguments.length?(p=n+"",u):p},ii(u,a)},ao.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ao.random.normal.apply(ao,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ao.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ao.scale={};var Sl={floor:m,ceil:m};ao.scale.linear=function(){return Wi([0,1],[0,1],Mr,!1)};var kl={s:1,g:1,p:1,r:1,e:1};ao.scale.log=function(){return ru(ao.scale.linear().domain([0,1]),10,!0,[1,10])};var Nl=ao.format(".0e"),El={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ao.scale.pow=function(){return iu(ao.scale.linear(),1,[0,1])},ao.scale.sqrt=function(){return ao.scale.pow().exponent(.5)},ao.scale.ordinal=function(){return ou([],{t:"range",a:[[]]})},ao.scale.category10=function(){return ao.scale.ordinal().range(Al)},ao.scale.category20=function(){return ao.scale.ordinal().range(Cl)},ao.scale.category20b=function(){return ao.scale.ordinal().range(zl)},ao.scale.category20c=function(){return ao.scale.ordinal().range(Ll)};var Al=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Cl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),zl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),Ll=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ao.scale.quantile=function(){return au([],[])},ao.scale.quantize=function(){return lu(0,1,[0,1])},ao.scale.threshold=function(){return cu([.5],[0,1])},ao.scale.identity=function(){return fu([0,1])},ao.svg={},ao.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),f=o.apply(this,arguments)-Io,s=a.apply(this,arguments)-Io,h=Math.abs(s-f),p=f>s?0:1;if(n>c&&(g=c,c=n,n=g),h>=Oo)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,v,d,y,m,M,x,b,_,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(d=u===ql?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(d/c*Math.sin(y))),n&&(N=tn(d/n*Math.sin(y)))),c){m=c*Math.cos(f+E),M=c*Math.sin(f+E),x=c*Math.cos(s-E),b=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Fo?0:1;if(E&&yu(m,M,x,b)===p^C){var z=(f+s)/2;m=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else m=M=0;if(n){_=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Fo?0:1;if(N&&yu(_,w,S,k)===1-p^L){var q=(f+s)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Uo&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){v=c>n^p?0:1;var T=g,R=g;if(Fo>h){var D=null==S?[_,w]:null==x?[m,M]:Re([m,M],[S,k],[x,b],[_,w]),P=m-D[0],U=M-D[1],j=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*j+U*F)/(Math.sqrt(P*P+U*U)*Math.sqrt(j*j+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(g,(n-O)/(H-1)),T=Math.min(g,(c-O)/(H+1))}if(null!=x){var I=mu(null==S?[_,w]:[S,k],[m,M],c,T,p),Y=mu([x,b],[_,w],c,T,p);g===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-p^yu(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",p," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",m,",",M);if(null!=S){var Z=mu([m,M],[S,k],n,-R,p),V=mu([_,w],null==x?[m,M]:[x,b],n,-R,p);g===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",p^yu(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-p," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",m,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",p," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-p," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hu,r=pu,i=su,u=ql,o=gu,a=vu,l=du;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(i=En(t),n):i},n.padRadius=function(t){return arguments.length?(u=t==ql?ql:En(t),n):u},n.startAngle=function(t){return arguments.length?(o=En(t),n):o},n.endAngle=function(t){return arguments.length?(a=En(t),n):a},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Io;return[Math.cos(t)*n,Math.sin(t)*n]},n};var ql="auto";ao.svg.line=function(){return Mu(m)};var Tl=ao.map({linear:xu,"linear-closed":bu,step:_u,"step-before":wu,"step-after":Su,basis:zu,"basis-open":Lu,"basis-closed":qu,bundle:Tu,cardinal:Eu,"cardinal-open":ku,"cardinal-closed":Nu,monotone:Fu});Tl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Rl=[0,2/3,1/3,0],Dl=[0,1/3,2/3,0],Pl=[0,1/6,2/3,1/6];ao.svg.line.radial=function(){var n=Mu(Hu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wu.reverse=Su,Su.reverse=wu,ao.svg.area=function(){return Ou(m)},ao.svg.area.radial=function(){var n=Ou(Hu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ao.svg.chord=function(){function n(n,a){var l=t(this,u,n,a),c=t(this,o,n,a);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?i(l.r,l.p1,l.r,l.p0):i(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=a.call(n,i,r),o=l.call(n,i,r)-Io,f=c.call(n,i,r)-Io;return{r:u,a0:o,a1:f,p0:[u*Math.cos(o),u*Math.sin(o)],p1:[u*Math.cos(f),u*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Fo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=Me,o=xe,a=Iu,l=gu,c=vu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},ao.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yu;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ao.svg.diagonal.radial=function(){var n=ao.svg.diagonal(),t=Yu,e=n.projection;return n.projection=function(n){return arguments.length?e(Zu(t=n)):t},n},ao.svg.symbol=function(){function n(n,r){return(Ul.get(t.call(this,n,r))||$u)(e.call(this,n,r))}var t=Xu,e=Vu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Ul=ao.map({circle:$u,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Fl)),e=t*Fl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ao.svg.symbolTypes=Ul.keys();var jl=Math.sqrt(3),Fl=Math.tan(30*Yo);Co.transition=function(n){for(var t,e,r=Hl||++Zl,i=Ku(n),u=[],o=Ol||{time:Date.now(),ease:Nr,delay:0,duration:250},a=-1,l=this.length;++a<l;){u.push(t=[]);for(var c=this[a],f=-1,s=c.length;++f<s;)(e=c[f])&&Qu(e,f,i,r,o),t.push(e)}return Wu(u,i,r)},Co.interrupt=function(n){return this.each(null==n?Il:Bu(Ku(n)))};var Hl,Ol,Il=Bu(Ku()),Yl=[],Zl=0;Yl.call=Co.call,Yl.empty=Co.empty,Yl.node=Co.node,Yl.size=Co.size,ao.transition=function(n,t){return n&&n.transition?Hl?n.transition(t):n:ao.selection().transition(n)},ao.transition.prototype=Yl,Yl.select=function(n){var t,e,r,i=this.id,u=this.namespace,o=[];n=A(n);for(var a=-1,l=this.length;++a<l;){o.push(t=[]);for(var c=this[a],f=-1,s=c.length;++f<s;)(r=c[f])&&(e=n.call(r,r.__data__,f,a))?("__data__"in r&&(e.__data__=r.__data__),Qu(e,f,u,i,r[u][i]),t.push(e)):t.push(null)}return Wu(o,u,i)},Yl.selectAll=function(n){var t,e,r,i,u,o=this.id,a=this.namespace,l=[];n=C(n);for(var c=-1,f=this.length;++c<f;)for(var s=this[c],h=-1,p=s.length;++h<p;)if(r=s[h]){u=r[a][o],e=n.call(r,r.__data__,h,c),l.push(t=[]);for(var g=-1,v=e.length;++g<v;)(i=e[g])&&Qu(i,g,a,o,u),t.push(i)}return Wu(l,a,o)},Yl.filter=function(n){var t,e,r,i=[];"function"!=typeof n&&(n=O(n));for(var u=0,o=this.length;o>u;u++){i.push(t=[]);for(var e=this[u],a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return Wu(i,this.namespace,this.id)},Yl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(i){i[r][e].tween.set(n,t)})},Yl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?$r:Mr,a=ao.ns.qualify(n);return Ju(this,"attr."+n,t,a.local?u:i)},Yl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ao.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yl.style=function(n,e,r){function i(){this.style.removeProperty(n)}function u(e){return null==e?i:(e+="",function(){var i,u=t(this).getComputedStyle(this,null).getPropertyValue(n);return u!==e&&(i=Mr(u,e),function(t){this.style.setProperty(n,i(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ju(this,"style."+n,e,u)},Yl.styleTween=function(n,e,r){function i(i,u){var o=e.call(this,i,u,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,i)},Yl.text=function(n){return Ju(this,"text",n,Gu)},Yl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Yl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ao.ease.apply(ao,arguments)),Y(this,function(r){r[e][t].ease=n}))},Yl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,i,u){r[e][t].delay=+n.call(r,r.__data__,i,u)}:(n=+n,function(r){r[e][t].delay=n}))},Yl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,i,u){r[e][t].duration=Math.max(1,n.call(r,r.__data__,i,u))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Yl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var i=Ol,u=Hl;try{Hl=e,Y(this,function(t,i,u){Ol=t[r][e],n.call(t,t.__data__,i,u)})}finally{Ol=i,Hl=u}}else Y(this,function(i){var u=i[r][e];(u.event||(u.event=ao.dispatch("start","end","interrupt"))).on(n,t)});return this},Yl.transition=function(){for(var n,t,e,r,i=this.id,u=++Zl,o=this.namespace,a=[],l=0,c=this.length;c>l;l++){a.push(n=[]);for(var t=this[l],f=0,s=t.length;s>f;f++)(e=t[f])&&(r=e[o][i],Qu(e,f,o,u,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wu(a,o,u)},ao.svg.axis=function(){function n(n){n.each(function(){var n,c=ao.select(this),f=this.__chart__||e,s=this.__chart__=e.copy(),h=null==l?s.ticks?s.ticks.apply(s,a):s.domain():l,p=null==t?s.tickFormat?s.tickFormat.apply(s,a):m:t,g=c.selectAll(".tick").data(h,s),v=g.enter().insert("g",".domain").attr("class","tick").style("opacity",Uo),d=ao.transition(g.exit()).style("opacity",Uo).remove(),y=ao.transition(g.order()).style("opacity",1),M=Math.max(i,0)+o,x=Zi(s),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ao.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=y.select("line"),C=g.select("text").text(p),z=v.select("text"),L=y.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=no,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*u+"V0H"+x[1]+"V"+q*u)):(n=to,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*u+","+x[0]+"H0V"+x[1]+"H"+q*u)),E.attr(N,q*i),z.attr(k,q*M),A.attr(S,0).attr(N,q*i),L.attr(w,0).attr(k,q*M),s.rangeBand){var T=s,R=T.rangeBand()/2;f=s=function(n){return T(n)+R}}else f.rangeBand?f=s:d.call(n,s,f);v.call(n,f,s),y.call(n,s,s)})}var t,e=ao.scale.linear(),r=Vl,i=6,u=6,o=3,a=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xl?t+"":Vl,n):r},n.ticks=function(){return arguments.length?(a=co(arguments),n):a},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(i=+t,u=+arguments[e-1],n):i},n.innerTickSize=function(t){return arguments.length?(i=+t,n):i},n.outerTickSize=function(t){return arguments.length?(u=+t,n):u},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vl="bottom",Xl={top:1,right:1,bottom:1,left:1};ao.svg.brush=function(){function n(t){t.each(function(){var t=ao.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,m);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $l[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,s=ao.transition(t),h=ao.transition(o);c&&(l=Zi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(s)),f&&(l=Zi(f),h.attr("y",l[0]).attr("height",l[1]-l[0]),i(s)),e(s)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==ao.event.keyCode&&(C||(M=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function v(){32==ao.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function d(){var n=ao.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ao.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]<M[0])],L[1]=h[+(n[1]<M[1])]):M=null),E&&y(n,c,0)&&(r(k),t=!0),A&&y(n,f,1)&&(i(k),t=!0),t&&(e(k),w({type:"brush",mode:C?"move":"resize"}))}function y(n,t,e){var r,i,u=Zi(t),l=u[0],c=u[1],f=L[e],v=e?h:s,d=v[1]-v[0];return C&&(l-=f,c-=d+f),r=(e?g:p)?Math.max(l,Math.min(c,n[e])):n[e],C?i=(r+=f)+d:(M&&(f=Math.max(l,Math.min(c,2*M[e]-r))),r>f?(i=r,r=f):i=f),v[0]!=r||v[1]!=i?(e?a=null:o=null,v[0]=r,v[1]=i,!0):void 0}function m(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ao.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ao.select(ao.event.target),w=l.of(b,arguments),k=ao.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&f,C=_.classed("extent"),z=W(b),L=ao.mouse(b),q=ao.select(t(b)).on("keydown.brush",u).on("keyup.brush",v);if(ao.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",m):q.on("mousemove.brush",d).on("mouseup.brush",m),k.interrupt().selectAll("*").interrupt(),C)L[0]=s[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[s[1-T]-L[0],h[1-R]-L[1]],L[0]=s[T],L[1]=h[R]}else ao.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ao.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,l=N(n,"brushstart","brush","brushend"),c=null,f=null,s=[0,0],h=[0,0],p=!0,g=!0,v=Bl[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:s,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Hl?ao.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(s,t.x),r=xr(h,t.y);return o=a=null,function(i){s=t.x=e(i),h=t.y=r(i),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bl[!c<<1|!f],n):c},n.y=function(t){return arguments.length?(f=t,v=Bl[!c<<1|!f],n):f},n.clamp=function(t){return arguments.length?(c&&f?(p=!!t[0],g=!!t[1]):c?p=!!t:f&&(g=!!t),n):c&&f?[p,g]:c?p:f?g:null},n.extent=function(t){var e,r,i,u,l;return arguments.length?(c&&(e=t[0],r=t[1],f&&(e=e[0],r=r[0]),o=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),e==s[0]&&r==s[1]||(s=[e,r])),f&&(i=t[0],u=t[1],c&&(i=i[1],u=u[1]),a=[i,u],f.invert&&(i=f(i),u=f(u)),i>u&&(l=i,i=u,u=l),i==h[0]&&u==h[1]||(h=[i,u])),n):(c&&(o?(e=o[0],r=o[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),f&&(a?(i=a[0],u=a[1]):(i=h[0],u=h[1],f.invert&&(i=f.invert(i),u=f.invert(u)),i>u&&(l=i,i=u,u=l))),c&&f?[[e,i],[r,u]]:c?[e,r]:f&&[i,u])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!f&&h[0]==h[1]},ao.rebind(n,l,"on")};var $l={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wl=ga.format=xa.timeFormat,Jl=Wl.utc,Gl=Jl("%Y-%m-%dT%H:%M:%S.%LZ");Wl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?eo:Gl,eo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},eo.toString=Gl.toString,ga.second=On(function(n){return new va(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ga.seconds=ga.second.range,ga.seconds.utc=ga.second.utc.range,ga.minute=On(function(n){return new va(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ga.minutes=ga.minute.range,ga.minutes.utc=ga.minute.utc.range,ga.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new va(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ga.hours=ga.hour.range,ga.hours.utc=ga.hour.utc.range,ga.month=On(function(n){return n=ga.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ga.months=ga.month.range,ga.months.utc=ga.month.utc.range;var Kl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ql=[[ga.second,1],[ga.second,5],[ga.second,15],[ga.second,30],[ga.minute,1],[ga.minute,5],[ga.minute,15],[ga.minute,30],[ga.hour,1],[ga.hour,3],[ga.hour,6],[ga.hour,12],[ga.day,1],[ga.day,2],[ga.week,1],[ga.month,1],[ga.month,3],[ga.year,1]],nc=Wl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),tc={range:function(n,t,e){return ao.range(Math.ceil(n/e)*e,+t,e).map(io)},floor:m,ceil:m};Ql.year=ga.year,ga.scale=function(){return ro(ao.scale.linear(),Ql,nc)};var ec=Ql.map(function(n){return[n[0].utc,n[1]]}),rc=Jl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);ec.year=ga.year.utc,ga.scale.utc=function(){return ro(ao.scale.linear(),ec,rc)},ao.text=An(function(n){return n.responseText}),ao.json=function(n,t){return Cn(n,"application/json",uo,t)},ao.html=function(n,t){return Cn(n,"text/html",oo,t)},ao.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=ao,define(ao)):"object"==typeof module&&module.exports?module.exports=ao:this.d3=ao}();},{}], + 2:[function(require,module,exports){ + "use strict"; + + var d3 = require('d3'); + + + //aigner: functions for drawing expand- and collapse-symbols + function drawExpandSymbol(aCircle, line1, line2) + { + aCircle = aCircle + .attr("r", 10) + .style("stroke", "black") + .style("stroke-width", 2) + .style("fill", "#99CC00") + .style("fill-opacity", .6) + line1 = line1 + .attr("x1", parseFloat(aCircle.attr("cx"))-5) + .attr("y1", parseFloat(aCircle.attr("cy"))) + .attr("x2", parseFloat(aCircle.attr("cx"))+5) + .attr("y2", parseFloat(aCircle.attr("cy"))) + .style("stroke", "black") + .style("stroke-width", 2); + line2 = line2 + .attr("x1", parseFloat(aCircle.attr("cx"))) + .attr("y1", parseFloat(aCircle.attr("cy"))-5) + .attr("x2", parseFloat(aCircle.attr("cx"))) + .attr("y2", parseFloat(aCircle.attr("cy"))+5) + .style("stroke", "black") + .style("stroke-width", 2); + } + function drawRemoveSymbol(anXdsm, aCircle, aMinus) + { + var xOffset=150; + var yOffset=12; + aCircle = aCircle + .attr("cx", anXdsm.svg.attr("width")-xOffset) + .attr("cy", yOffset) + .attr("r", 10) + .classed("remCircle",true) + aMinus = aMinus + .attr("x1", anXdsm.svg.attr("width")-xOffset+5) + .attr("y1", yOffset) + .attr("x2", anXdsm.svg.attr("width")-xOffset-5) + .attr("y2", yOffset) + .classed("remMinus",true) + } + //d3-context-menu for right-click-option + d3.contextMenu = function (menu, openCallback) { + + // create the div element that will hold the context menu + d3.selectAll('.d3-context-menu').data([1]) + .enter() + .append('div') + .attr('class', 'd3-context-menu'); + + // close menu + d3.select('body').on('click.d3-context-menu', function() { + d3.select('.d3-context-menu').style('display', 'none'); + }); + + // this gets executed when a contextmenu event occurs + return function(data, index) { + var elm = this; + + d3.selectAll('.d3-context-menu').html(''); + var list = d3.selectAll('.d3-context-menu').append('ul'); + list.selectAll('li').data(menu).enter() + .append('li') + .html(function(d) { + return d.title; + }) + .on('mousedown', function(d, i) { + d.onMouseDown(elm, data, index); + }) + .on('mouseup', function(d, i) { + d.onMouseUp(elm, data, index); + d3.select('.d3-context-menu').style('display', 'none'); + }) + .on('mouseenter',function(d,i){ + d.onMouseOver(elm,data,index); + if(d.childrenItems.length>0 ) + { + var li = this + d3.select(this).selectAll("ul").remove(); + d3.select(this) + .append("ul") + .style("top",String(li.offsetTop-5)+"px") + .selectAll("li") + .data(d.childrenItems) + .enter().append("li") + .text(function(d) { return d.title; }) + .on("mouseenter", function(d,i){ + d.onMouseOver(elm,data,index); + }) + .on('click', function(d, i) { + d.onMouseClick(elm, d, index); + }) + .on('mouseleave',function(d,i){ + + }); + } + else + return false; + }) + .on('mouseleave',function(d,i){ + d3.select(this).selectAll("ul").style('display', 'none') + }); + + + + // the openCallback allows an action to fire before the menu is displayed + // an example usage would be closing a tooltip + if (openCallback) openCallback(data, index); + + // display context menu + d3.select('.d3-context-menu') + .style('left', (d3.event.pageX - 2) + 'px') + .style('top', (d3.event.pageY - 2) + 'px') + .style('display', 'block'); + + //Prevent the default event, which is the left-click. + //This means, the context-menu will only appear on right mouse clicks + d3.event.preventDefault(); + + //Place context-menu always on top of everything esle + d3.select(".d3-context-menu").style("z-index",Number.MAX_SAFE_INTEGER); + }; + }; + + + //aigner: Function creates a table + function tabulate(aTable,data,columns) { + var thead = aTable.append('thead'); + var tbody = aTable.append('tbody'); + + // create a row for each object in the data + var rows = tbody.selectAll('tr') + .data(data) + .enter() + .append('tr'); + + // create a cell in each row for each column + var cells = rows.selectAll('td') + .data(function (row) { + return columns.map(function (column) { + return {column: column, value: row[column]}; + }); + }) + .enter() + .append('td') + .html(function (d) { return d.value; }); + + return aTable; + } + + //aigner: Move to front function + d3.selection.prototype.moveToFront = function() { + return this.each(function(){ + this.parentNode.appendChild(this); + }); + }; + //aigner: Move to back function + d3.selection.prototype.moveToBack = function() { + return this.each(function() { + var firstChild = this.parentNode.firstChild; + if (firstChild) { + this.parentNode.insertBefore(this, firstChild); + } + }); + }; + + + //aigner: biHisankey functions (Source: http://bl.ocks.org/Neilos/584b9a5d44d5fe00f779) + d3.biHiSankey = function () { + "use strict"; + + var biHiSankey = {}, + nodeWidth = 24, + nodeSpacing = 8, + linkSpacing = 5, + arrowheadScaleFactor = 0, // Specifies the proportion of a link's stroke width to be allowed for the marker at the end of the link. + size = [1, 1], // default to one pixel by one pixel + nodes = [], + nodeMap = {}, + parentNodes = [], + leafNodes = [], + links = [], + xScaleFactor = 1, + yScaleFactor = 1, + defaultLinkCurvature = 0.5; + + function center(node) { + return node.y + node.height / 2; + } + + function value(link) { + return link.value; + } + + function initializeNodeArrayProperties(node) { + node.sourceLinks = []; + node.rightLinks = []; + node.targetLinks = []; + node.leftLinks = []; + node.connectedNodes = []; + node.children = []; + node.ancestors = []; + } + // generates the nodeMap {"1": <node1>, "2": <node2>} + // and initializes the array properties of each node + function initializeNodeMap() { + nodes.forEach(function (node) { + nodeMap[node.id] = node; + initializeNodeArrayProperties(node); + }); + } + + function computeLeafNodes() { + leafNodes = nodes.filter(function (node) { + return !node.children.length; + }); + } + + function computeParentNodes() { + parentNodes = nodes.filter(function (node) { + return node.children.length; + }); + } + + function addAncestorsToChildren(node) { + node.children.forEach(function (child) { + child.ancestors = child.ancestors.concat(this.ancestors.concat([this])); + addAncestorsToChildren(child); + }, node); + } + + // generate hierarchical connections between parent and child nodes + function computeNodeHierarchy() { + var parent, + rootNodes = []; + + nodes.forEach(function (node) { + parent = null; + if (parent) { + node.parent = parent; + parent.children.push(node); + } else { + node.parent = null; + rootNodes.push(node); + } + }); + + computeLeafNodes(); + computeParentNodes(); + + rootNodes.forEach(function (rNode) { + addAncestorsToChildren(rNode); + }); + } + + // Populate the sourceLinks and targetLinks for each node. + function computeNodeLinks() { + var sourceNode, targetNode; + links.forEach(function (link) { + sourceNode = nodeMap[link.source] || link.source; + targetNode = nodeMap[link.target] || link.target; + link.id = link.source + '-' + link.target; + link.source = sourceNode; + link.target = targetNode; + sourceNode.sourceLinks.push(link); + targetNode.targetLinks.push(link); + }); + } + + function visible(linkCollection) { + return linkCollection.filter(function (link) { + return link.source.state === "collapsed" && link.target.state === "collapsed"; + }); + } + + // When child nodes are collapsed into their parents (or higher ancestors) + // the links between the child nodes should be represented by links + // between the containing ancestors. This function adds those extra links. + function computeAncestorLinks() { + // Leaf nodes are never parents of other nodes + // Duplicate source and target links between a leaf node and another leaf node + // and add to the leaf nodes' parents + leafNodes.forEach(function (leafNode) { + leafNode.sourceLinks.forEach(function (sourceLink) { + var ancestorTargets, + target = sourceLink.target; + if (leafNodes.indexOf(target) >= 0) { + ancestorTargets = target.ancestors.filter(function (tAncestor) { + return leafNode.ancestors.indexOf(tAncestor) < 0; + }); + ancestorTargets.forEach(function (ancestorTarget) { + var ancestorLink = { source: leafNode, + target: ancestorTarget, + value: sourceLink.value, + id: leafNode.id + "-" + ancestorTarget.id }; + + leafNode.sourceLinks.push(ancestorLink); + ancestorTarget.targetLinks.push(ancestorLink); + links.push(ancestorLink); + }); + } + }); + + leafNode.targetLinks.forEach(function (targetLink) { + var ancestorSources, source = targetLink.source; + if (leafNodes.indexOf(source) >= 0) { + ancestorSources = source.ancestors.filter(function (sAncestor) { + return leafNode.ancestors.indexOf(sAncestor) < 0; + }); + ancestorSources.forEach(function (ancestorSource) { + var ancestorLink = { source: ancestorSource, + target: leafNode, + value: targetLink.value, + id: ancestorSource.id + "-" + leafNode.id }; + ancestorSource.sourceLinks.push(ancestorLink); + leafNode.targetLinks.push(ancestorLink); + links.push(ancestorLink); + }); + } + }); + }); + + // Add links between parents (for when both parents are in collapsed state) + parentNodes.forEach(function (parentNode) { + parentNode.sourceLinks.forEach(function (sourceLink) { + var ancestorTargets, target = sourceLink.target; + if (leafNodes.indexOf(target) >= 0) { + ancestorTargets = target.ancestors.filter(function (tAncestor) { + return parentNode.ancestors.indexOf(tAncestor) < 0; + }); + ancestorTargets.forEach(function (ancestorTarget) { + var ancestorLink = { source: parentNode, + target: ancestorTarget, + value: sourceLink.value, + id: parentNode.id + "-" + ancestorTarget.id }; + + parentNode.sourceLinks.push(ancestorLink); + ancestorTarget.targetLinks.push(ancestorLink); + links.push(ancestorLink); + }); + } + }); + }); + } + + // To reduce clutter in the diagram merge links that are from the + // same source to the same target by creating a new link + // with a value equal to the sum of the values of the merged links + function mergeLinks() { + var linkGroups = d3.nest() + .key(function (link) { return link.source.id + "->" + link.target.id; }) + .entries(links) + .map(function (object) { return object.values; }); + + links = linkGroups.map(function (linkGroup) { + return linkGroup.reduce(function (previousLink, currentLink) { + return { + "source": previousLink.source, + "target": previousLink.target, + "id": d3.min([previousLink.id, currentLink.id]), + "value": previousLink.value + currentLink.value + }; + }); + }); + } + + function nodeHeight(sideLinks) { + var spacing = Math.max(sideLinks.length - 1, 0) * linkSpacing, + scaledValueSum = d3.sum(sideLinks, value) * yScaleFactor; + return scaledValueSum + spacing; + } + + // Compute the value of each node by summing the associated links. + // Compute the number of spaces between the links + // Compute the number of source links for later decrementing + function computeNodeValues() { + nodes.forEach(function (node) { + node.value = Math.max( + d3.sum(node.leftLinks, value), + d3.sum(node.rightLinks, value) + ); + node.inputs = d3.sum(visible(node.targetLinks), value); + node.outputs = d3.sum(visible(node.sourceLinks), value); + node.height = Math.max(nodeHeight(visible(node.leftLinks)), nodeHeight(visible(node.rightLinks))); + node.linkSpaceCount = Math.max(Math.max(node.leftLinks.length, node.rightLinks.length) - 1, 0); + }); + } + + function computeConnectedNodes() { + var sourceNode, targetNode; + links.forEach(function (link) { + sourceNode = link.source; + targetNode = link.target; + if (sourceNode.connectedNodes.indexOf(targetNode) < 0) { + sourceNode.connectedNodes.push(targetNode); + } + if (targetNode.connectedNodes.indexOf(sourceNode) < 0) { + targetNode.connectedNodes.push(sourceNode); + } + }); + } + + function sourceAndTargetNodesWithSameX() { + var nodeArray = []; + links.filter(function (link) { + return link.target.x === link.source.x; + }).forEach(function (link) { + if (nodeArray.indexOf(link.target) < 0) { + nodeArray.push(link.target); + } + }); + return nodeArray; + } + + function compressInXDirection() { + var connectedNodesXPositions, + nodesByXPosition = d3.nest() + .key(function (node) { return node.x; }) + .sortKeys(d3.ascending) + .entries(nodes) + .map(function (object) { return object.values; }); + + nodesByXPosition.forEach(function (xnodes) { + xnodes.forEach(function (node) { + connectedNodesXPositions = node.connectedNodes.map(function (connectedNode) { + return connectedNode.x; + }); + // keep decrementing the x value of the node + // unless it would have the same x value as one of its source or target nodes + // or node.x is already 0 + while (node.x > 0 && connectedNodesXPositions.indexOf(node.x - 1) < 0) { + node.x -= 1; + } + }); + }); + } + + function scaleNodeXPositions() { + var minX = d3.min(nodes, function (node) { return node.x; }), + maxX = d3.max(nodes, function (node) { return node.x; }) - minX; + xScaleFactor = (size[0] - nodeWidth) / maxX; + + nodes.forEach(function (node) { + node.x *= xScaleFactor; + }); + } + + function computeNodeXPositions() { + var remainingNodes = nodes, + nextNodes, + x = 0, + addToNextNodes = function (link) { + if (nextNodes.indexOf(link.target) < 0 && link.target.x === this.x) { + nextNodes.push(link.target); + } + }, + setValues = function (node) { + node.x = x; + node.width = nodeWidth; + node.sourceLinks.forEach(addToNextNodes, node); + }; + + while (remainingNodes.length) { + nextNodes = []; + remainingNodes.forEach(setValues); + if (nextNodes.length) { + remainingNodes = nextNodes; + } else { + remainingNodes = sourceAndTargetNodesWithSameX(); + } + x += 1; + } + + compressInXDirection(); + scaleNodeXPositions(); + } + + function computeLeftAndRightLinks() { + var source, target; + nodes.forEach(function (node) { + node.rightLinks = []; + node.leftLinks = []; + }); + links.forEach(function (link) { + source = link.source; + target = link.target; + if (source.x < target.x) { + source.rightLinks.push(link); + target.leftLinks.push(link); + link.direction = 1; + } else { + source.leftLinks.push(link); + target.rightLinks.push(link); + link.direction = -1; + } + }); + } + + function adjustTop(adjustment) { + nodes.forEach(function (node) { + node.y -= adjustment; + }); + } + + function computeNodeYPositions(iterations) { + var minY, + alpha, + nodesByXPosition = d3.nest() + .key(function (node) { return node.x; }) + .sortKeys(d3.ascending) + .entries(nodes) + .map(function (object) { return object.values; }); + + function calculateYScaleFactor() { + var linkSpacesCount, nodeValueSum, discretionaryY; + yScaleFactor = d3.min(nodesByXPosition, function (nodes) { + linkSpacesCount = d3.sum(nodes, function (node) { + return node.linkSpaceCount; + }); + nodeValueSum = d3.sum(nodes, function (node) { + return node.value; + }); + discretionaryY = (size[1] + - (nodes.length - 1) * nodeSpacing + - linkSpacesCount * linkSpacing); + + return discretionaryY / nodeValueSum; + }); + + // Fat links are those with lengths less than about 4 times their heights + // Fat links don't bend well + // Test that yScaleFactor is not so big that it causes "fat" links; adjust yScaleFactor accordingly + links.forEach(function (link) { + var linkLength = Math.abs(link.source.x - link.target.x), + linkHeight = link.value * yScaleFactor; + if (linkLength / linkHeight < 4) { + yScaleFactor = 0.25 * linkLength / link.value; + } + }); + } + + function initializeNodeYPosition() { + nodesByXPosition.forEach(function (nodes) { + nodes.forEach(function (node, i) { + node.y = i; + node.heightAllowance = node.value * yScaleFactor + linkSpacing * node.linkSpaceCount; + }); + }); + } + + function calculateLinkThickness() { + links.forEach(function (link) { + link.thickness = link.value * yScaleFactor; + }); + } + + function relaxLeftToRight(alpha) { + function weightedSource(link) { + return center(link.source) * link.value; + } + + nodesByXPosition.forEach(function (nodes) { + nodes.forEach(function (node) { + if (node.rightLinks.length) { + var y = d3.sum(node.rightLinks, weightedSource) / d3.sum(node.rightLinks, value); + node.y += (y - center(node)) * alpha; + } + }); + }); + } + + function relaxRightToLeft(alpha) { + function weightedTarget(link) { + return center(link.target) * link.value; + } + + nodesByXPosition.slice().reverse().forEach(function (nodes) { + nodes.forEach(function (node) { + if (node.leftLinks.length) { + var y = d3.sum(node.leftLinks, weightedTarget) / d3.sum(node.leftLinks, value); + node.y += (y - center(node)) * alpha; + } + }); + }); + } + + function resolveCollisions() { + function ascendingYPosition(a, b) { + return a.y - b.y; + } + + nodesByXPosition.forEach(function (nodes) { + var node, + dy, + y0 = 0, + n = nodes.length, + i; + + nodes.sort(ascendingYPosition); + + // Push any overlapping nodes down. + for (i = 0; i < n; ++i) { + node = nodes[i]; + dy = y0 - node.y; + if (dy > 0) { + node.y += dy; + } + y0 = node.y + node.heightAllowance + nodeSpacing; + } + + // If the bottommost node goes outside the bounds, push it back up. + dy = y0 - nodeSpacing - size[1]; + if (dy > 0) { + node.y -= dy; + y0 = node.y; + + // Push any overlapping nodes back up. + for (i = n - 2; i >= 0; --i) { + node = nodes[i]; + dy = node.y + node.heightAllowance + nodeSpacing - y0; + if (dy > 0) { + node.y -= dy; + } + y0 = node.y; + } + } + }); + } + + calculateYScaleFactor(); + initializeNodeYPosition(); + calculateLinkThickness(); + resolveCollisions(); + + for (alpha = 1; iterations > 0; --iterations) { + alpha *= 0.99; + relaxRightToLeft(alpha); + resolveCollisions(); + relaxLeftToRight(alpha); + resolveCollisions(); + } + + minY = d3.min(nodes, function (node) { return node.y; }); + adjustTop(minY); + } + + function computeLinkYPositions() { + + function ascendingLeftNodeYPosition(a, b) { + var aLeftNode = (a.direction > 0) ? a.source : a.target, + bLeftNode = (b.direction > 0) ? b.source : b.target; + return aLeftNode.y - bLeftNode.y; + } + + function ascendingRightNodeYPosition(a, b) { + var aRightNode = (a.direction > 0) ? a.target : a.source, + bRightNode = (b.direction > 0) ? b.target : b.source; + return aRightNode.y - bRightNode.y; + } + + nodes.forEach(function (node) { + node.rightLinks.sort(ascendingRightNodeYPosition); + node.leftLinks.sort(ascendingLeftNodeYPosition); + }); + + nodes.forEach(function (node) { + var rightY = 0, leftY = 0; + + node.rightLinks.forEach(function (link) { + if (link.direction > 0) { + link.sourceY = rightY; + if (link.target.state === "collapsed") { + rightY += link.thickness + linkSpacing; + } + } + else { + link.targetY = rightY; + if (link.source.state === "collapsed") { + rightY += link.thickness + linkSpacing; + } + } + }); + + node.leftLinks.forEach(function (link) { + if (link.direction < 0) { + link.sourceY = leftY; + if (link.target.state === "collapsed") { + leftY += link.thickness + linkSpacing; + } + } + else { + link.targetY = leftY; + if (link.source.state === "collapsed") { + leftY += link.thickness + linkSpacing; + } + } + }); + + }); + } + + + biHiSankey.arrowheadScaleFactor = function (_) { + if (!arguments.length) { return arrowheadScaleFactor; } + arrowheadScaleFactor = +_; + return biHiSankey; + }; + + biHiSankey.collapsedNodes = function () { + return nodes.filter(function (node) { return node.state === "collapsed"; }); + }; + + biHiSankey.connected = function (nodeA, nodeB) { + return nodeA.connectedNodes.indexOf(nodeB) >= 0; + }; + + biHiSankey.expandedNodes = function () { + return nodes.filter(function (node) { return node.state === "expanded"; }); + }; + + biHiSankey.layout = function (iterations) { + computeNodeXPositions(); + computeLeftAndRightLinks(); + computeNodeValues(); + computeNodeYPositions(iterations); + computeNodeValues(); + computeLinkYPositions(); + return biHiSankey; + }; + + biHiSankey.link = function () { + var curvature = defaultLinkCurvature; + + function leftToRightLink(link) { + var arrowHeadLength = link.thickness * arrowheadScaleFactor, + straightSectionLength = (3 * link.thickness / 4) - arrowHeadLength, + x0 = link.source.x + link.source.width, + x1 = x0 + arrowHeadLength / 2, + x4 = link.target.x - straightSectionLength - arrowHeadLength, + xi = d3.interpolateNumber(x0, x4), + x2 = xi(curvature), + x3 = xi(1 - curvature), + y0 = link.source.y + link.sourceY + link.thickness / 2, + y1 = link.target.y + link.targetY + link.thickness / 2; + return "M" + x0 + "," + y0 + + "L" + x1 + "," + y0 + + "C" + x2 + "," + y0 + + " " + x3 + "," + y1 + + " " + x4 + "," + y1 + + "L" + (x4 + straightSectionLength) + "," + y1; + } + + function rightToLeftLink(link) { + var arrowHeadLength = link.thickness * arrowheadScaleFactor, + straightSectionLength = link.thickness / 4, + x0 = link.source.x, + x1 = x0 - arrowHeadLength / 2, + x4 = link.target.x + link.target.width + straightSectionLength + arrowHeadLength, + xi = d3.interpolateNumber(x0, x4), + x2 = xi(curvature), + x3 = xi(1 - curvature), + y0 = link.source.y + link.sourceY + link.thickness / 2, + y1 = link.target.y + link.targetY + link.thickness / 2; + return "M" + x0 + "," + y0 + + "L" + x1 + "," + y0 + + "C" + x2 + "," + y0 + + " " + x3 + "," + y1 + + " " + x4 + "," + y1 + + "L" + (x4 - straightSectionLength) + "," + y1; + } + + function link(d) { + if (d.source.x < d.target.x) { + return leftToRightLink(d); + } + return rightToLeftLink(d); + } + + link.curvature = function (_) { + if (!arguments.length) { return curvature; } + curvature = +_; + return link; + }; + + return link; + }; + + biHiSankey.links = function (_) { + if (!arguments.length) { return links; } + links = _.filter(function (link) { + return link.source !== link.target; // filter out links that go nowhere + }); + return biHiSankey; + }; + + biHiSankey.linkSpacing = function (_) { + if (!arguments.length) { return linkSpacing; } + linkSpacing = +_; + return biHiSankey; + }; + + biHiSankey.nodes = function (_) { + if (!arguments.length) { return nodes; } + nodes = _; + return biHiSankey; + }; + + biHiSankey.nodeWidth = function (_) { + if (!arguments.length) { return nodeWidth; } + nodeWidth = +_; + return biHiSankey; + }; + + biHiSankey.nodeSpacing = function (_) { + if (!arguments.length) { return nodeSpacing; } + nodeSpacing = +_; + return biHiSankey; + }; + + biHiSankey.relayout = function () { + computeLeftAndRightLinks(); + computeNodeValues(); + computeLinkYPositions(); + return biHiSankey; + }; + + biHiSankey.size = function (_) { + if (!arguments.length) { return size; } + size = _; + return biHiSankey; + }; + + biHiSankey.visibleLinks = function () { + return visible(links); + }; + + biHiSankey.initializeNodes = function (callback) { + initializeNodeMap(); + computeNodeHierarchy(); + computeNodeLinks(); + computeAncestorLinks(); + mergeLinks(); + computeConnectedNodes(); + nodes.forEach(callback); + return biHiSankey; + }; + + return biHiSankey; + }; + + + 'use strict'; + + var sankeyDiagramDiv, svg, tooltip, biHiSankey, path, defs, colorScale, isTransitioning; + + var OPACITY = { + NODE_DEFAULT: 0.9, + NODE_FADED: 0.1, + NODE_HIGHLIGHT: 0.8, + LINK_DEFAULT: 0.6, + LINK_FADED: 0.05, + LINK_HIGHLIGHT: 0.9 + }, + LINK_COLOR = "#b3b3b3", + INFLOW_COLOR = "#CC0000", + OUTFLOW_COLOR = "#99CC00", + NODE_WIDTH = 36, + COLLAPSER = { + RADIUS: NODE_WIDTH / 2, + SPACING: 2 + }, + OUTER_MARGIN = 10, + MARGIN = { + TOP: 2 * (COLLAPSER.RADIUS + OUTER_MARGIN), + RIGHT: OUTER_MARGIN, + BOTTOM: OUTER_MARGIN, + LEFT: OUTER_MARGIN + }, + TRANSITION_DURATION = 400, + HEIGHT = 2000 - MARGIN.TOP - MARGIN.BOTTOM, + WIDTH = 960 - MARGIN.LEFT - MARGIN.RIGHT, + LAYOUT_INTERATIONS = 32, + REFRESH_INTERVAL = 7000; + + var formatNumber = function (d) { + var numberFormat = d3.format(",.0f"); // zero decimal places + return numberFormat(d) + " connections"; + }, + + formatFlow = function (d) { + var flowFormat = d3.format(",.0f"); // zero decimal places with sign + return flowFormat(Math.abs(d)); + }, + + // Used when temporarily disabling user interractions to allow animations to complete + disableUserInterractions = function (time) { + isTransitioning = true; + setTimeout(function(){ + isTransitioning = false; + }, time); + }, + + hideTooltip = function () { + return tooltip.transition() + .duration(TRANSITION_DURATION) + .style("opacity", 0); + }, + + showTooltip = function () { + return tooltip + .style("left", d3.event.pageX + "px") + .style("top", d3.event.pageY + 15 + "px") + .transition() + .duration(TRANSITION_DURATION) + .style("opacity", 1); + }; + + colorScale = d3.scale.category10(), + + sankeyDiagramDiv = d3.select("body").append("div").attr("class","sankeyDiagramDiv") + svg = sankeyDiagramDiv.append("svg") + .attr("width", WIDTH + MARGIN.LEFT + MARGIN.RIGHT) + .attr("height", HEIGHT + MARGIN.TOP + MARGIN.BOTTOM) + .append("g") + .attr("transform", "translate(" + MARGIN.LEFT + "," + MARGIN.TOP + ")"); + + svg.append("g").attr("id", "links"); + svg.append("g").attr("id", "nodes"); + svg.append("g").attr("id", "collapsers"); + + tooltip = d3.select(".sankeyDiagramDiv").append("div").attr("id", "tooltip"); + + tooltip.style("opacity", 0) + .append("p") + .attr("class", "value"); + + biHiSankey = d3.biHiSankey(); + + // Set the biHiSankey diagram properties + biHiSankey + .nodeWidth(NODE_WIDTH) + .nodeSpacing(10) + .linkSpacing(4) + .arrowheadScaleFactor(0.5) // Specifies that 0.5 of the link's stroke WIDTH should be allowed for the marker at the end of the link. + .size([WIDTH, HEIGHT]); + + path = biHiSankey.link().curvature(0.45); + + defs = svg.append("defs"); + + defs.append("marker") + .style("fill", LINK_COLOR) + .attr("id", "arrowHead") + .attr("viewBox", "0 0 6 10") + .attr("refX", "1") + .attr("refY", "5") + .attr("markerUnits", "strokeWidth") + .attr("markerWidth", "1") + .attr("markerHeight", "1") + .attr("orient", "auto") + .append("path") + .attr("d", "M 0 0 L 1 0 L 6 5 L 1 10 L 0 10 z"); + + defs.append("marker") + .style("fill", OUTFLOW_COLOR) + .attr("id", "arrowHeadInflow") + .attr("viewBox", "0 0 6 10") + .attr("refX", "1") + .attr("refY", "5") + .attr("markerUnits", "strokeWidth") + .attr("markerWidth", "1") + .attr("markerHeight", "1") + .attr("orient", "auto") + .append("path") + .attr("d", "M 0 0 L 1 0 L 6 5 L 1 10 L 0 10 z"); + + defs.append("marker") + .style("fill", INFLOW_COLOR) + .attr("id", "arrowHeadOutlow") + .attr("viewBox", "0 0 6 10") + .attr("refX", "1") + .attr("refY", "5") + .attr("markerUnits", "strokeWidth") + .attr("markerWidth", "1") + .attr("markerHeight", "1") + .attr("orient", "auto") + .append("path") + .attr("d", "M 0 0 L 1 0 L 6 5 L 1 10 L 0 10 z"); + + function update() { + var link, linkEnter, node, nodeEnter, collapser, collapserEnter; + + function dragmove(node) { + node.x = Math.max(0, Math.min(WIDTH - node.width, d3.event.x)); + node.y = Math.max(0, Math.min(HEIGHT - node.height, d3.event.y)); + d3.select(this) + .attr("transform", "translate(" + node.x + "," + node.y + ")") + .style("cursor", "grabbing") + biHiSankey.relayout(); + svg.selectAll(".sankeyNode").selectAll("rect").attr("height", function (d) { return d.height; }); + link.attr("d", path); + } + + function containChildren(node) { + node.children.forEach(function (child) { + child.state = "contained"; + child.parent = this; + child._parent = null; + containChildren(child); + }, node); + } + + function expand(node) { + node.state = "expanded"; + node.children.forEach(function (child) { + child.state = "collapsed"; + child._parent = this; + child.parent = null; + containChildren(child); + }, node); + } + + function collapse(node) { + node.state = "collapsed"; + containChildren(node); + } + + function restoreLinksAndNodes() { + link + .style("stroke", LINK_COLOR) + .style("marker-end", function () { return 'url(#arrowHead)'; }) + .transition() + .duration(TRANSITION_DURATION) + .style("opacity", OPACITY.LINK_DEFAULT); + + + node + .selectAll("rect") + .style("fill", function (d) { + d.color = colorScale(d.name.replace(/ .*/, "")); + return d.color; + }) + .style("stroke", function (d) { + return d3.rgb(colorScale(d.name.replace(/ .*/, ""))).darker(0.1); + }) + .style("fill-opacity", OPACITY.NODE_DEFAULT); + + node.filter(function (n) { return n.state === "collapsed"; }) + .transition() + .duration(TRANSITION_DURATION) + .style("opacity", OPACITY.NODE_DEFAULT); + } + + function showHideChildren(node) { + disableUserInterractions(2 * TRANSITION_DURATION); + hideTooltip(); + if (node.state === "collapsed") { expand(node); } + else { collapse(node); } + + biHiSankey.relayout(); + update(); + link.attr("d", path); + restoreLinksAndNodes(); + } + + function highlightConnected(g) { + link.filter(function (d) { return d.source === g; }) + .style("marker-end", function () { return 'url(#arrowHeadInflow)'; }) + .style("stroke", OUTFLOW_COLOR) + .style("opacity", OPACITY.LINK_DEFAULT); + + link.filter(function (d) { return d.target === g; }) + .style("marker-end", function () { return 'url(#arrowHeadOutlow)'; }) + .style("stroke", INFLOW_COLOR) + .style("opacity", OPACITY.LINK_DEFAULT); + + link.forEach(function (aLink) { + aLink.moveToFront; + }); + } + + function fadeUnconnected(g) { + link.filter(function (d) { return d.source !== g && d.target !== g; }) + .style("marker-end", function () { return 'url(#arrowHead)'; }) + .transition() + .duration(TRANSITION_DURATION) + .style("opacity", OPACITY.LINK_FADED); + + node.filter(function (d) { + return (d.name === g.name) ? false : !biHiSankey.connected(d, g); + }).transition() + .duration(TRANSITION_DURATION) + .style("opacity", OPACITY.NODE_FADED); + } + + link = svg.select("#links").selectAll("path.link") + .data(biHiSankey.visibleLinks(), function (d) { return d.id; }); + + link.transition() + .duration(TRANSITION_DURATION) + .style("stroke-WIDTH", function (d) { return Math.max(1, d.thickness); }) + .attr("d", path) + .style("opacity", OPACITY.LINK_DEFAULT); + + + link.exit().remove(); + + + linkEnter = link.enter().append("path") + .attr("class", "link") + .style("fill", "none"); + + linkEnter.on('mouseenter', function (d) { + if (!isTransitioning) { + showTooltip().select(".value").text(function () { + if (d.direction > 0) { + return d.source.name + " → " + d.target.name + "\n" + formatNumber(d.value); + } + return d.target.name + " ↠" + d.source.name + "\n" + formatNumber(d.value); + }); + + d3.select(this) + .style("stroke", LINK_COLOR) + .transition() + .duration(TRANSITION_DURATION / 2) + .style("opacity", OPACITY.LINK_HIGHLIGHT); + } + }); + + linkEnter.on('mouseleave', function () { + if (!isTransitioning) { + hideTooltip(); + + d3.select(this) + .style("stroke", LINK_COLOR) + .transition() + .duration(TRANSITION_DURATION / 2) + .style("opacity", OPACITY.LINK_DEFAULT); + } + }); + + + <!-- //Highlight function, that shows usage of a node in the XDSM --> + <!-- function highlight(data) --> + <!-- { --> + <!-- xPath = data.xPath; --> + <!-- var allLinks = d3.selectAll(".link"); --> + <!-- var allLinks_tmp = allLinks[0]; --> + <!-- allLinks_tmp.forEach(function(p) { --> + <!-- var firstElement_tmp = p.__data__.name.split("/")[1] --> + <!-- var text_fromFirst = "/"+firstElement_tmp+xPath.split(firstElement_tmp)[1] --> + <!-- if (include(p.__data__.name,text_fromFirst)) --> + <!-- { --> + <!-- d3.select(p).style("opacity", .8); --> + <!-- } --> + <!-- else --> + <!-- { --> + <!-- d3.select(p).style("opacity", 0); --> + <!-- } --> + <!-- }); --> + <!-- } --> + + function showVariableTable(aVariable) + { + var headLine = "Node Information (" + aVariable.name + ")"; + var data = []; + // render the table(s) + data.push({ "name" : "Name", "value" : "\""+aVariable.name+"\"" }) + data.push({ "name" : "xPath", "value" : aVariable.xPath }) + if (aVariable.type){data.push({ "name" : "Type", "value" : aVariable.type })} + if (aVariable.level){data.push({ "name" : "Level", "value" : aVariable.level })} + if (aVariable.children || aVariable._children) + { + var childrenNum=0; + if (aVariable.children){childrenNum=childrenNum+aVariable.children.length} + if (aVariable._children){childrenNum=childrenNum+aVariable._children.length} + data.push({ "name" : "Number of children", "value" : childrenNum }) + } + if (aVariable.dimension){data.push({ "name" : "Dimension", "value" : aVariable.dimension })} + else if(aVariable.dimension===null){data.push({ "name" : "Dimension", "value" : "undefined" })} + if (aVariable.value){data.push({ "name" : "Value(s)", "value" : aVariable.value })} + + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + + //menu --> functions for right click options + var nodeMenu = [ + { + title: 'Show node information', + onMouseDown: function(elm, d, i) { + showVariableTable(d); + }, + onMouseUp: function(elm, d, i) {}, + onMouseOver: function(elm, d, i) {}, + childrenItems: [] + }, + { + title: 'Show usage of node in diagram', + onMouseDown: function(elm, d, i) { + d3.selectAll(".treeFrame").attr("fill-opacity", .5); + d3.selectAll(".nodeText").style("fill-opacity", 0.5); + highlight(d); + }, + onMouseUp: function(elm, d, i) { + d3.selectAll(".link").style("opacity",.6) + d3.selectAll(".treeFrame").attr("fill-opacity", .8); + d3.selectAll(".nodeText").style("fill-opacity", 1); + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Copy x-path to clipboard', + onMouseDown: function(elm, d, i) { + window.prompt("Copy to clipboard: Ctrl+C, Enter", d.xPath); + d3.select('.d3-context-menu').style('display', 'none'); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + } + ] + + function showList(aTitle,aList,aMenu) + { + if (aList.length != 0) + { + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(aTitle) + panel_div.append("input") + .attr("id","myInput") + .attr("placeholder","Filter search...") + .attr("title","Type in a name") + .attr("onkeyup","filterSearch()") + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + var tr = listGroup + .selectAll('tr') + .data(aList).enter() + .append('tr') + var td = tr.append("td").html(function(d) { + if (d.xPath){return d.xPath;} + else {return d.name;} + }) + tr.on('contextmenu', d3.contextMenu(aMenu)); + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + $('.myPanel').lobiPanel('height','5000'); + } + } + + + function showLinkTree(aLink,aVarCategory) + { + var name_tmp = "Variable flow: " + aLink.__data__.source.name + " → " + aLink.__data__.target.name + var theSchema = currentGraph.variableSchemes[aVarCategory]; + createTreeLayout(name_tmp,theSchema,aLink.__data__.name,link,nodeMenu); + } + + function showEdgeTable(aLink) + { + + var headLine = "Edge Information (" + aLink.from + " - " + aLink.to + ")"; + var anEdgeNameSplit = aLink.name.split(',') + var numberOfconnections = anEdgeNameSplit.length; + var dimension=0; + var nullDim=false; + var undefinedLeafs; + var theLeafNodes = JSON.parse(JSON.stringify(currentGraph.variableSchemes[varCategories[0].name])); + var pipeData = aLink.name; + prune_tree(pipeData,theLeafNodes) + var undefLeafsNumber=0; + var defLeafsNumber=0; + for (var k=0;k<theLeafNodes.length;k++) + { + if (theLeafNodes[k].dimension!=null){dimension = dimension+theLeafNodes[k].dimension} + else{nullDim=true} + if (theLeafNodes[k].value.includes("could not be found")||theLeafNodes[k].value.includes("unknown")) + { + if (undefLeafsNumber==0){undefinedLeafs += theLeafNodes[k].xPath;} + else {undefinedLeafs += "," + theLeafNodes[k].xPath;} + undefLeafsNumber ++; + } + else + { + defLeafsNumber++; + } + } + //Render data for table + var data = []; + data.push({ "name" : "Total number of connections", "value" : numberOfconnections }) + data.push({ "name" : "Number of referenced connections", "value" : defLeafsNumber }) + data.push({ "name" : "Dimension of referenced connections", "value" : String(dimension) }) + if (undefinedLeafs) + { + data.push({ "name" : "Number of unreferenced connections", "value" : undefLeafsNumber}) + } + + + + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + + //linkMenu --> functions for right click options + var linkChildrenItemsTree = []; + for (var j=0; j< varCategories.length; j++) + { + linkChildrenItemsTree.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + onMouseClick: function(elm, data, i) {showLinkTree(elm,data.varCategory)}, + onMouseOver: function(elm,data,i){}}); + } + var linkChildrenItemsList = []; + for (var j=0; j< varCategories.length; j++) + { + linkChildrenItemsList.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + onMouseClick: function(elm, data, i) { + var variables = []; + var pipeData = elm.__data__.name; + var title = "List view of variable flow: " + elm.__data__.source.id + " → " + elm.__data__.target.id + variables = JSON.parse(JSON.stringify(currentGraph.variableSchemes[data.varCategory])) + prune_tree(pipeData,variables) + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + + showList(title,variables,nodeMenu); + }, + onMouseOver: function(elm,data,i){}}); + } + var linkMenu = [ + { + title: 'Show edge info', + onMouseDown: function(elm, k, i) { + showEdgeTable(k) + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Show variable tree...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: linkChildrenItemsTree + }, + { + title: 'Show variable list...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: linkChildrenItemsList + } + ] + + var thisLink = d3.select(this); + linkEnter.on('contextmenu', d3.contextMenu(linkMenu)) + + linkEnter.sort(function (a, b) { return b.thickness - a.thickness; }) + .classed("leftToRight", function (d) { + return d.direction > 0; + }) + .classed("rightToLeft", function (d) { + return d.direction < 0; + }) + .style("marker-end", function () { + return 'url(#arrowHead)'; + }) + .style("stroke", LINK_COLOR) + .style("opacity", 0) + .transition() + .delay(TRANSITION_DURATION) + .duration(TRANSITION_DURATION) + .attr("d", path) + .style("stroke-WIDTH", function (d) { return Math.max(1, d.thickness); }) + .style("opacity", OPACITY.LINK_DEFAULT); + + + node = svg.select("#nodes").selectAll(".sankeyNode") + .data(biHiSankey.collapsedNodes(), function (d) { return d.id; }); + + + node.transition() + .duration(TRANSITION_DURATION) + .attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; }) + .style("opacity", OPACITY.NODE_DEFAULT) + .select("rect") + + .style("stroke", function(d) { + return d3.rgb(d.color).darker(2); }) + .style("stroke-WIDTH", "1px") + .attr("height", function (d) { return d.height; }) + .attr("width", biHiSankey.nodeWidth()); + + + node.exit() + .transition() + .duration(TRANSITION_DURATION) + .attr("transform", function (d) { + var collapsedAncestor, endX, endY; + collapsedAncestor = d.ancestors.filter(function (a) { + return a.state === "collapsed"; + })[0]; + endX = collapsedAncestor ? collapsedAncestor.x : d.x; + endY = collapsedAncestor ? collapsedAncestor.y : d.y; + return "translate(" + endX + "," + endY + ")"; + }) + .remove(); + + + nodeEnter = node.enter().append("g").attr("class", "sankeyNode"); + + nodeEnter + .attr("transform", function (d) { + var startX = d._parent ? d._parent.x : d.x, + startY = d._parent ? d._parent.y : d.y; + return "translate(" + startX + "," + startY + ")"; + }) + .style("opacity", 1e-6) + .transition() + .duration(TRANSITION_DURATION) + .style("opacity", OPACITY.NODE_DEFAULT) + .attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; }); + + nodeEnter.append("text"); + nodeEnter.append("rect") + .style("fill", function(d) { + return d.color = colorScale(d.name.replace(/ .*/, "")); }) + .style("stroke", function(d) { + return d3.rgb(d.color).darker(2); }) + .style("stroke-WIDTH", "1px") + .attr("height", function (d) { return d.height; }) + .attr("width", biHiSankey.nodeWidth()); + + node.append("svg:title").text("Click left to drag, click right to inspect") + node.on("mouseenter", function (g) { + if (!isTransitioning) { + restoreLinksAndNodes(); + highlightConnected(g); + fadeUnconnected(g); + + d3.select(this).select("rect") + .style("stroke", function (d) { + return d3.rgb(d.color).darker(0.1); + }) + .style("fill-opacity", OPACITY.LINK_DEFAULT); + + tooltip + .style("left", g.x + MARGIN.LEFT + "px") + .style("top", d3.event.pageY-40 + "px") + .transition() + .duration(TRANSITION_DURATION) + .style("opacity", 1).select(".value") + .text(function () { + var additionalInstructions = g.children.length ? "\n(Double click to expand)" : ""; + return g.name + "\nInputs: " + formatFlow(g.inputs) + "\nOutputs: " + formatFlow(g.outputs); + }); + } + }); + + node.on("mouseleave", function () { + if (!isTransitioning) { + hideTooltip(); + restoreLinksAndNodes(); + } + }); + + node.filter(function (d) { return d.children.length; }) + .on("dblclick", showHideChildren); + + + //aigner: Right click options for tools + //############################################################################################################################## + + //aigner: Table for competence/tool information + //############################################################ + function showToolTable(aTool) + { + var aToolNameSplit = aTool.name.split(': ') + var headLine; + if (aToolNameSplit.length>1){headLine = "Competence Information: (" + aToolNameSplit[1] + ")";} + else {headLine = "Competence Information: (" + aToolNameSplit[0] + ")";} + + + var data = []; + // render the table(s) + if (aTool.metadata.length==0) + { + data.push({ "name" : "NO TOOL METADATA AVAILABLE", "value" : "..." }) + } + function findSubMetaData(aMetaData) + { + for(var key in aMetaData) + { + if (typeof aMetaData[key] === 'object') + { + data.push({ "name" : key, "value" : ''}) ; + findSubMetaData(aMetaData[key]); + } + else + { + data.push({ "name" : key, "value" : aMetaData[key] }) + } + } + } + for (var j=0; j < aTool.metadata.length;j++) + { + var metaData = aTool.metadata[j]; + findSubMetaData(metaData); + } + + + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + //############################################################ + + //aigner: Creation of input/output tree + //############################################################ + function showIOTree(categoryID, categoryDescr, theNode, io) + { + var links = d3.selectAll(".link"); + var array=""; + var name_tmp = ""; + links.each(function(theLink) + { + if (io=="in") + { + if (theLink.to == theNode.id) + { + array = array + "," + theLink.name; + } + name_tmp = "Input tree view:" + theNode.id + "; Categorization: " + categoryDescr; + } + else if (io=="out") + { + if (theLink.from == theNode.id) + { + array = array + "," + theLink.name; + } + name_tmp = "Output tree view:" + theNode.id + "; Categorization: " + categoryDescr; + } + }) + var theSchema = JSON.parse(JSON.stringify(currentGraph.variableSchemes[categoryID])); + createTreeLayout(name_tmp,theSchema,array,link,nodeMenu) + } + //############################################################ + + var inputChildrenitemsTree = []; + var outputChildrenitemsTree = []; + for (var j=0; j< varCategories.length; j++) + { + inputChildrenitemsTree.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) {showIOTree(data.varCategory,data.description,elm.__data__,"in")}, + onMouseOver: function(elm,data,i){}}); + outputChildrenitemsTree.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) {showIOTree(data.varCategory,data.description,elm.__data__,"out")}, + onMouseOver: function(elm,data,i){}}); + } + var inputChildrenitemsList = []; + var outputChildrenitemsList = []; + for (var j=0; j< varCategories.length; j++) + { + inputChildrenitemsList.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) { + var links = d3.selectAll(".link"); + var pipeData=""; + var name_tmp = ""; + links.each(function(theLink) + { + if (theLink.to == elm.__data__.id) + { + pipeData = pipeData + "," + theLink.name; + } + }) + + var title = "List view of all inputs for " + elm.__data__.id + "; Categorization: " + data.description + var variables = JSON.parse(JSON.stringify(currentGraph.variableSchemes[data.varCategory])) + prune_tree(pipeData,variables) + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + + showList(title,variables,nodeMenu); + }, + onMouseOver: function(elm,data,i){}}); + outputChildrenitemsList.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, data, i) { + var links = d3.selectAll(".link"); + var pipeData=""; + var name_tmp = ""; + links.each(function(theLink) + { + if (theLink.from == elm.__data__.id) + { + pipeData = pipeData + "," + theLink.name; + } + }) + + var title = "List view of all outputs from " + elm.__data__.id + "; Categorization: " + data.description + var variables = JSON.parse(JSON.stringify(currentGraph.variableSchemes[data.varCategory])) + prune_tree(pipeData,variables) + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + + showList(title,variables,nodeMenu); + + }, + onMouseOver: function(elm,data,i){}}); + } + //menu --> functions for right click options + var toolMenu = [ + { + title: 'Show competence info', + onMouseDown: function(elm, k, i) { + showToolTable(k); + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Show input variable tree...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: inputChildrenitemsTree + }, + { + title: 'Show output variable tree...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: outputChildrenitemsTree + }, + { + title: 'Show input variable list...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: inputChildrenitemsList + }, + { + title: 'Show output variable list...', + onMouseDown: function(elm, k, i) { + }, + onMouseUp: function(elm, k, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: outputChildrenitemsList + } + ] + //############################################################################################################################## + + node.on('contextmenu', d3.contextMenu(toolMenu)); + + // allow nodes to be dragged to new positions + node.call(d3.behavior.drag() + .origin(function (d) + { + d3.select(this).style("cursor", "grabbing") + return d; + }) + .on("dragstart", function () { + d3.select(this).style("cursor", "grabbing") + this.parentNode.appendChild(this); }) + .on("drag", dragmove)); + + // add in the text for the nodes + node.filter(function (d) { return d.value !== 0; }) + .select("text") + .attr("x", -6) + .attr("y", function (d) { return d.height / 2; }) + .attr("dy", ".35em") + .attr("text-anchor", "end") + .attr("transform", null) + .text(function (d) { return d.name; }) + .filter(function (d) { return d.x < WIDTH / 2; }) + .attr("x", 6 + biHiSankey.nodeWidth()) + .attr("text-anchor", "start"); + + + collapser = svg.select("#collapsers").selectAll(".collapser") + .data(biHiSankey.expandedNodes(), function (d) { return d.id; }); + + + collapserEnter = collapser.enter().append("g").attr("class", "collapser"); + + collapserEnter.append("circle") + .attr("r", COLLAPSER.RADIUS) + .style("fill", function (d) { + d.color = colorScale(d.name.replace(/ .*/, "")); + return d.color; + }); + + collapserEnter + .style("opacity", OPACITY.NODE_DEFAULT) + .attr("transform", function (d) { + return "translate(" + (d.x + d.width / 2) + "," + (d.y + COLLAPSER.RADIUS) + ")"; + }); + + collapserEnter.on("dblclick", showHideChildren); + + collapser.select("circle") + .attr("r", COLLAPSER.RADIUS); + + collapser.transition() + .delay(TRANSITION_DURATION) + .duration(TRANSITION_DURATION) + .attr("transform", function (d, i) { + return "translate(" + + (COLLAPSER.RADIUS + i * 2 * (COLLAPSER.RADIUS + COLLAPSER.SPACING)) + + "," + + (-COLLAPSER.RADIUS - OUTER_MARGIN) + + ")"; + }); + + collapser.on("mouseenter", function (g) { + if (!isTransitioning) { + showTooltip().select(".value") + .text(function () { + return g.name + "\n(Double click to collapse)"; + }); + + d3.select(this) + .style("opacity", OPACITY.NODE_HIGHLIGHT) + .select("circle") + + node.filter(function (d) { + return d.ancestors.indexOf(g) >= 0; + }).style("opacity", OPACITY.NODE_HIGHLIGHT) + .select("rect") + } + }); + + collapser.on("mouseleave", function (g) { + if (!isTransitioning) { + hideTooltip(); + d3.select(this) + .style("opacity", OPACITY.NODE_DEFAULT) + .select("circle") + + node.filter(function (d) { + return d.ancestors.indexOf(g) >= 0; + }).style("opacity", OPACITY.NODE_DEFAULT) + .select("rect") + } + }); + + collapser.exit().remove(); + + } + + + function createTreeLayout(theName,schema,theLinks,theAllLinks,nodeMenu) + { + //aigner: Build the tree layout + //###################################################################### + var treeData = (JSON.parse(JSON.stringify(schema))); + //The tree will only be pruned if there is pipeData, such as in an edge or for the input of a tool + if (theLinks) + { + prune_tree(theLinks, treeData); + } + + //build tree layout for vistoms + var newTree = {}; + buildTree(newTree, treeData) + treeData = newTree + //###################################################################### + + + var width= 1000; + var height= 500; + var xOffset = 10; + var xOffset2 = 100; + + // Calculate total nodes, max label length + var totalNodes = 0; + var maxLabelLength = 0; + // variables for drag/drop + var selectedNode = null; + var draggingNode = null; + // Misc. variables + var i = 0; + var duration = 500; + var root; + + + // size of the diagram + var viewerWidth = width/3; + var viewerHeight = height+50; + + var tree = d3.layout.tree() + .size([viewerHeight, viewerWidth]) + + // define a d3 diagonal projection for use by the node paths later on. + var diagonal = d3.svg.diagonal() + .projection(function(d) { + return [d.y+xOffset, d.x]; + }); + + // A recursive helper function for performing some setup by walking through all nodes + + function visit(parent, visitFn, childrenFn) { + if (!parent) return; + + visitFn(parent); + + var children = childrenFn(parent); + if (children) { + var count = children.length; + for (var i = 0; i < count; i++) { + visit(children[i], visitFn, childrenFn); + } + } + } + + // Call visit function to establish maxLabelLength + visit(treeData, function(d) { + totalNodes++; + maxLabelLength = Math.max(d.name.length, maxLabelLength); + }, function(d) { + return d.children && d.children.length > 0 ? d.children : null; + }); + + function getMaxLength(data) + { + var maxLen=0;; + for (var i = 0; i < data.length; i++) + { + maxLen = Math.max(data[i].name.length, maxLen); + } + for (var i = 0; i < data.length; i++) + { + data[i].labelLength = maxLen; + if (data[i].children) + {getMaxLength(data[i].children);} + if (data[i]._children) + {getMaxLength(data[i]._children);} + } + + } + if(treeData._children) + {getMaxLength(treeData._children);} + if(treeData.children) + {getMaxLength(treeData.children);} + treeData.labelLength = treeData.name.length; + + + // Collapse the node and all it's children + function collapse(d) { + if(d.children) { + d._children = d.children + d._children.forEach(collapse) + d.children = null + } + } + // Collapse the node and all it's children + function expand(d) { + if(d._children) { + d.children = d._children + d.children.forEach(expand) + d._children = null + } + } + // Toggle children on click. + function click(d) + { + if (d.children) { + d._children = d.children; + d.children = null; + } else + { + d.children = d._children; + d._children = null; + } + update(d,theAllLinks); + } + // Collapse/expand entire tree on double-click + function dblclick(d) + { + if(d.children) + { + collapse(d); + } + else if(d._children) + { + expand(d); + } + update(d,theAllLinks); + } + + + //aigner: Here the tree layout is created + var d3_body = d3.select("body") + var lobiID = String(getRandomInt(0,1000)) + var divClassName = "treeDiv"+lobiID + var treeLayoutdiv = d3_body.append("div").attr("class",divClassName+" panel-default") + .style("left","200px") + .style("top","200px") + .style("position", "absolute") + treeLayoutdiv.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(theName) + $('.'+divClassName).lobiPanel({ + reload: false, + editTitle: false, + unpin: false, + minWidth: 200, + maxWidth: 100000, + minHeight: 200, + maxHeight: 100000, + }); + $('.'+divClassName).lobiPanel('unpin'); + + var treeLayoutSVG = treeLayoutdiv.append("svg").attr("class","treeLayoutSVG") + var treeGroup = treeLayoutSVG.append("g").attr("class","treeGroup").style("position","absolute") + .attr("transform", "translate(50,0)"); + var margin = {top: 20, right: 90, bottom: 20, left: 90}, + width = 960 - margin.left - margin.right, + height = 500 - margin.top - margin.bottom; + + // append the svg object to the body of the page + // appends a 'group' element to 'svg' + // moves the 'group' element to the top left margin + var offset_tmp = 60; + treeLayoutSVG = treeLayoutSVG.attr("width", width + 1.2*margin.right + margin.left+offset_tmp) + .attr("height", height + margin.top + margin.bottom+offset_tmp); + treeLayoutdiv = treeLayoutdiv.attr("width", width + 1.2*margin.right + margin.left+offset_tmp) + .attr("height", height + margin.top + margin.bottom+offset_tmp) + .on("mouseover",function(){d3.select(this).style("cursor", "grab")}) + treeGroup = treeGroup + .attr("width", width + margin.right + margin.left) + .attr("height", height + margin.top + margin.bottom); + + + var frame = treeGroup.append("rect") + .attr("class","treeFrame") + .attr("stroke-width", 1) + .attr("stroke", "white") + .attr("fill-opacity", .8); + + // Define the root + root = treeData; + root.x0 = 0; + root.y0 = 0; + + // Append a group which holds all nodes and which the zoom Listener can act upon. + var svgGroup_xOff = root.name.length*10+50 + var svgGroup = treeGroup.append("g") + .attr("class","tree_"+theName) + .attr("transform", "translate("+ svgGroup_xOff + "," + String(margin.top+10) + ")"); + + collapse(root); + update(root,theAllLinks); + + + function update(source,allLinks) + { + // Compute the new height, function counts total children of root node and sets tree height accordingly. + // This prevents the layout looking squashed when new nodes are made visible or looking sparse when nodes are removed + // This makes the layout more consistent. + var levelWidth = [1]; + var levelLength = [1]; + var childCount = function(level, n) { + + if (n.children && n.children.length > 0) { + if (levelWidth.length <= level + 1) levelWidth.push(0); + + levelWidth[level + 1] += n.children.length; + n.children.forEach(function(d) { + childCount(level + 1, d); + }); + } + }; + childCount(0, root); + + var newHeight = d3.max(levelWidth) * 60; // 20 pixels per line + var newWidth = viewerWidth+300; + + //BENNI: fill in viewerHeight instead of newHeight for other expanding/collapsing beaviour + tree = tree.size([newHeight, newWidth]); + + frame = frame.attr("width",newWidth) + .attr("height",newHeight+60) + .attr("fill","white"); + + + + // Compute the new tree layout. + var nodes = tree.nodes(root), + links = tree.links(nodes); + + + //aigner: count all descendants of a node + function countDescendants(node, counter) + { + if (node._children) + { + node._children.forEach(function(n) + { + counter = countDescendants(n, counter); + }); + } + else if (node.children) + { + node.children.forEach(function(n) + { + counter = countDescendants(n, counter); + }); + } + else + { + counter ++; + } + return counter; + } + + + var depths = []; + var labelLength = []; + nodes.forEach(function(d) + { + //aigner: If node is collapsed show number of ancestors + if (d._children) + { + d._childrenNum = countDescendants(d, 0); + d.text = d.name + " (" + d._childrenNum + ")"; + } + else + { + d.text = d.name + } + + //aigner: Find maximum labelLength for each level + if (!depths.includes(d.depth)) + { + depths.push(d.depth); + labelLength.push(d.text.length); + } + else + { + if (d.depth!=0){labelLength[depths.indexOf(d.depth)] = Math.max(d.text.length, labelLength[depths.indexOf(d.depth)]);} + } + }); + // Set widths between levels based on labelLength of each level. + var newWidth=0; + var depth_tmp = 0; + nodes.forEach(function(d) + { + if (d.parent) + { + d.y = d.parent.y+(labelLength[depths.indexOf(d.depth)])*10+50; + } + else{d.y=0} + + + if (newWidth<d.y) + {newWidth=d.y;} + + // console.log("##############") + // console.log(d.name) + // console.log("x = " + d.x) + // console.log("y = " + d.y) + // console.log("depth = " + depths.indexOf(d.depth)) + // console.log("##############") + }); + + + + newWidth=Math.max(newWidth,getTextWidth(theName,"Arial 12pt")); + //aigner: Adjust height and width of the frame + $('.'+divClassName).lobiPanel('setWidth', newWidth + margin.top + margin.bottom +400+maxLabelLength*25+offset_tmp); + $('.'+divClassName).lobiPanel('setHeight', newHeight + margin.top + 2*margin.bottom+offset_tmp); + treeLayoutSVG = treeLayoutSVG.attr("height", newHeight + margin.top + margin.bottom+offset_tmp) + treeLayoutSVG = treeLayoutSVG.attr("width", newWidth + margin.top + margin.bottom +300+maxLabelLength*25+offset_tmp) + frame = frame.attr("height", newHeight + margin.top + margin.bottom) + frame = frame.attr("width", newWidth + margin.top + margin.bottom+300+maxLabelLength*15) + + + //Function writeTreeToXML goes through tree nodes and puts the into an xml document + function writeTreeToXML(aNode,anXMLDoc,anXPath) + { + //Variable "children" + //--> One children variable, no matter whether a node has "_children" (collapsed) or "children" (expanded) + var children; + if (aNode._children){children = aNode._children;} + else if (aNode.children){children = aNode.children;} + + //Get current xml element with its xPath + var element = anXMLDoc.evaluate(anXPath,anXMLDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; + if (element != null) {element.value = '...';} + + //If a node has children (collapsed or expanded), loop through them + if (children) + { + for (var i=0; i < children.length;i++) + { + //Name of the new XML element --> childName + var child = children[i]; + var childName = child.name.split(/[\[\]]+/);//Split childName at "[]" which is the uID + var cleanChildName = childName[0].split(/[\+\*\^\-\ \#]+/);//Split childName all special characters + var newNode = anXMLDoc.createElement(String(cleanChildName[0])); + + //The children are appended to the xPath --> newXPath + var newXPath = anXPath+"/"+cleanChildName[0]; + + //If childName contains a uID, make the uID an attribute + if (childName[1]) + { + if (parseInt(childName[1])) + { + var dummyID = childName[1]; + newNode.setAttribute("dummyID", dummyID) + newXPath = newXPath+"[@dummyID='"+dummyID+"']"; + } + else + { + var uID = childName[1]; + newNode.setAttribute("uID", uID) + newXPath = newXPath+"[@uID='"+uID+"']"; + } + } + if (cleanChildName.length>1) {newNode.setAttribute("elementName", childName[0])}; + + //Append the newNode to the xml structure + element.appendChild(newNode); + + + + ////aigner: Sorting of XML elements according to "uID" + // var items = element.children; + // var itemsArr = []; + // for (var j in items) { + // if (items[j].nodeType == 1) { // get rid of the whitespace text nodes + // itemsArr.push(items[j]); + // } + // } + // itemsArr.sort(function(a,b){ + // if (a.getAttribute("uID") < b.getAttribute("uID")) + // return -1; + // if (a.getAttribute("uID") > b.getAttribute("uID")) + // return 1; + // return 0; + // }); + + // for (j = 0; j < itemsArr.length; ++j) { + // element.appendChild(itemsArr[j]); + // } + + //call function writeTreeToXML recursively for all children + writeTreeToXML(child,anXMLDoc,newXPath) + } + } + else + { + if (aNode.value){element.innerHTML = String(aNode.value);} + else{element.innerHTML = " ";} + } + //return the xml document + return anXMLDoc; + } + + function removeAttributeInAllElements(aDocument,attribute) + { + var matchingElements = []; + var allElements = aDocument.getElementsByTagName('*'); + for (var i = 0, n = allElements.length; i < n; i++) + { + if (allElements[i].getAttribute(attribute) !== null) + { + allElements[i].removeAttribute(attribute); + } + } + return matchingElements; + } + + function putAncestorsInXMLString(strWrapper, aNode) + { + //Name of the new XML element + var nodeName = aNode.name.split(/[\[\]]+/);//Split name at "[]" which is the uID + var cleanNodeName = nodeName[0].split(/[\+\*\^\-\ \#]+/);//Split nodeName all special characters + //If nodeName contains a uID, make the uID an attribute + if (nodeName[1]) + { + var uID = nodeName[1]; + strWrapper.val = "<"+cleanNodeName[0]+" uID='"+ uID +"'>"+strWrapper.val+"</"+cleanNodeName[0]+">";; + } + else + { + strWrapper.val = "<"+cleanNodeName[0]+">"+strWrapper.val+"</"+cleanNodeName[0]+">";; + } + var aParent = aNode.parent; + if (aParent) + { + return putAncestorsInXMLString(strWrapper, aParent); + } + else + { + return strWrapper; + } + } + + function putAncestorsInXPath(strWrapper, aNode) + { + //Name of the new XML element + var nodeName = aNode.name.split(/[\[\]]+/);//Split name at "[]" which is the uID + var cleanNodeName = nodeName[0].split(/[\+\*\^\-\ \#]+/);//Split nodeName all special characters + //If nodeName contains a uID, make the uID an attribute + if (nodeName[1]) + { + var uID = nodeName[1]; + strWrapper.val = "/"+cleanNodeName[0]+"[@uID='"+uID+"']"+strWrapper.val; + } + else + { + strWrapper.val = "/"+cleanNodeName[0]+strWrapper.val; + } + var aParent = aNode.parent; + if (aParent) + { + return putAncestorsInXPath(strWrapper, aParent); + } + else + { + return strWrapper; + } + } + + // Function to download data to a file + function download(filename, text) { + var element = document.createElement('a'); + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); + element.setAttribute('download', filename); + + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); + } + + + var treeNodeMenu = nodeMenu; + var treeMenu = [ + { + title: 'Download full tree as XML-file', + onMouseDown: function(elm, d, i) { + //Begin xml structure with the first element + var xmlString = "<"+nodes[0].name+">"+"</"+nodes[0].name+">"; + //Create a new xml document + var parser = new DOMParser(); + var xmlDocument = parser.parseFromString(xmlString, "text/xml"); //important to use "text/xml" + //Get initial xPath of the tree and pass it to the function "writeTreeToXML" + var initialXPath = "/"+nodes[0].name; + writeTreeToXML(nodes[0],xmlDocument,initialXPath); + //remove all attributes dummyID + removeAttributeInAllElements(xmlDocument,'dummyID'); + //Make the xml document a string + var serializer = new XMLSerializer(); + var xmlString = serializer.serializeToString(xmlDocument); + xmlString = vkbeautify.xml(xmlString); + //Download a document with the xml-schema + download(theName+'_full.xml', xmlString); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Download tree as XML-file from current node', + onMouseDown: function(elm, d, i) { + var xmlString = putAncestorsInXMLString({ val : '' }, d).val; + var initialXPath = putAncestorsInXPath({ val : '' }, d).val; + //Create a new xml document + var parser = new DOMParser(); + var xmlDocument = parser.parseFromString(xmlString, "text/xml"); //important to use "text/xml" + //Get initial xPath of the tree and pass it to the function "writeCurrentTreeToXML" + writeTreeToXML(d,xmlDocument,initialXPath); + //remove all attributes dummyID + removeAttributeInAllElements(xmlDocument,'dummyID'); + //Make the xml document a string + var serializer = new XMLSerializer(); + xmlString = serializer.serializeToString(xmlDocument); + xmlString = vkbeautify.xml(xmlString); + //Download a document with the xml-schema + download(theName+"_"+d.name+'.xml', xmlString); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + } + ] + treeNodeMenu = nodeMenu.concat(treeMenu) + + + // Update the nodes… + var treeNode = svgGroup.selectAll("g.treeNode") + .data(nodes, function(d) { + return d.id || (d.id = ++i); + }); + + var dblclick_timer = false; + // Enter any new nodes at the parent's previous position. + var nodeEnter = treeNode.enter().append('g') + .attr('class', 'treeNode') + .attr("transform", function(d) { + return "translate(" + source.y0 + "," + source.x0 + ")"; + }) + .on('contextmenu', d3.contextMenu(treeNodeMenu)) + .on("mousedown", function(d) { + if (d3.event.which != 3) + { + // if double click timer is active, this click is the double click + if ( dblclick_timer ) + { + clearTimeout(dblclick_timer) + dblclick_timer = false + // double click code code comes here + //console.log("DOUBLE CLICK") + dblclick(d); + } + // otherwise, what to do after single click (double click has timed out) + else dblclick_timer = setTimeout( function(){ + dblclick_timer = false + // single click code code comes here + //console.log("SINGLE CLICK") + click(d); + }, 250) + } + }) + + nodeEnter.append("circle") + .attr('class', 'nodeCircle') + .attr("r", 0) + .style("fill", function(d) { + if (d._children) + { + if(theName.includes("Input")){return '#ea9999'} + else if(theName.includes("Output")){return '#d6ea99'} + else {return "lightsteelblue"} + } + else {return "#fff"} + }) + .style("stroke", function(d) { + if(theName.includes("Input")){ + //console.log(d); + return '#CC0000'} + else if(theName.includes("Output")){ + //console.log(d); + return '#99CC00'} + }) + .attr("cx", function(d) {return xOffset}); + + nodeEnter.append("text") + .attr("x", function(d) + { + return d.children || d._children ? -10+xOffset : 10+xOffset; + }) + .attr("dy", ".35em") + .attr('class', 'nodeText') + .attr("text-anchor", function(d) { + return d.children || d._children ? "end" : "start"; + }) + .text(function(d) { + return d.text; + }) + .style("fill-opacity", 0) + + + // Update the text to reflect whether node has children or not. + treeNode.select('text') + .attr("x", function(d) { + return d.children || d._children ? -10+xOffset : 10+xOffset; + }) + .attr("text-anchor", function(d) { + return d.children || d._children ? "end" : "start"; + }) + .text(function(d) { + return d.text; + }); + + // Change the circle fill depending on whether it has children and is collapsed + treeNode.select("circle.nodeCircle") + .attr("r", 4.5) + .style("fill", function(d) { + if (d._children) + { + if (d._children) + { + if(theName.includes("Input")){return '#ea9999'} + else if(theName.includes("Output")){return '#d6ea99'} + else {return "lightsteelblue"} + } + else {return "#fff"} + } + else{return "#fff";} + }) + + // UPDATE + // Transition nodes to their new position. + var nodeUpdate = treeNode.transition() + .duration(duration) + .attr("transform", function(d) { + return "translate(" + d.y + "," + d.x + ")"; + }); + + // Fade the text in + nodeUpdate.select("text") + .style("fill-opacity", 1); + + nodeEnter.append("svg:title").text("Click left to expand, click right to inspect") + + // Remove any exiting nodes + var nodeExit = treeNode.exit().transition() + .duration(duration) + .attr("transform", function(d) { + return "translate(" + source.y + "," + source.x + ")"; + }) + .remove(); + + // Update the links… + var link = svgGroup.selectAll("path.treeLink") + .data(links, function(d) { + return d.target.id; + }); + + // Enter any new links at the parent's previous position. + link.enter().insert("path", "g") + .attr("class", "treeLink") + .attr("d", function(d) { + var o = { + x: source.x0, + y: source.y0 + }; + return diagonal({ + source: o, + target: o + }); + }); + + // Transition links to their new position. + link.transition() + .duration(duration) + .attr("d", diagonal); + + // Transition exiting nodes to the parent's new position. + link.exit().transition() + .duration(duration) + .attr("d", function(d) { + var o = { + x: source.x, + y: source.y + }; + return diagonal({ + source: o, + target: o + }); + }) + .remove(); + + // Stash the old positions for transition. + nodes.forEach(function(d) { + d.x0 = d.x; + d.y0 = d.y; + }); + } + } + + + + //aigner: Here the data is read and the sankey diagram is created + //#####################################################################// + var graphs, currentGraph, varCategories; + function startSankeyDiagram(data, graphID) + { + graphs = data.graphs; + for (var i=0;i<graphs.length;i++) + { + if (graphs[i].id==graphID) + { + currentGraph = graphs[i] + } + } + varCategories = data.categories; + + //Highlight function, that shows usage of a node in the XDSM + function highlight(data) + { + var xPath = data.xPath; + var allLinks = d3.selectAll(".link"); + var allLinks_tmp = allLinks[0]; + allLinks_tmp.forEach(function(p) { + var firstElement_tmp = p.__data__.name.split("/")[1] + var xPath_fromFirst = "/"+firstElement_tmp+xPath.split(firstElement_tmp)[1] + var p_name_list = p.__data__.name.split(",") + var highlight_on = false + p_name_list.forEach(function(p_name) + { + if (include(p_name+"__",xPath_fromFirst+"__") || include(p_name,xPath_fromFirst+"/")) + { + highlight_on = true; + } + }) + if (highlight_on) + { + d3.select(p).style("opacity", .8); + } + else + { + d3.select(p).style("opacity", 0); + } + }); + } + + function showVariableTable(aVariable) + { + var headLine = "Node Information (" + aVariable.name + ")"; + var data = []; + // render the table(s) + data.push({ "name" : "Name", "value" : "\""+aVariable.name+"\"" }) + data.push({ "name" : "xPath", "value" : aVariable.xPath }) + if (aVariable.type){data.push({ "name" : "Type", "value" : aVariable.type })} + if (aVariable.level){data.push({ "name" : "Level", "value" : aVariable.level })} + if (aVariable.children || aVariable._children) + { + var childrenNum=0; + if (aVariable.children){childrenNum=childrenNum+aVariable.children.length} + if (aVariable._children){childrenNum=childrenNum+aVariable._children.length} + data.push({ "name" : "Number of children", "value" : childrenNum }) + } + if (aVariable.dimension){data.push({ "name" : "Dimension", "value" : aVariable.dimension })} + else if(aVariable.dimension===null){data.push({ "name" : "Dimension", "value" : "undefined" })} + if (aVariable.value){data.push({ "name" : "Value(s)", "value" : aVariable.value })} + + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(headLine) + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + data.forEach(function(listElement) + { + var row = listGroup.append("tr") + row.append("td").text(listElement.name) + row.append("td").text(listElement.value) + + }) + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + } + + //menu --> functions for right click options + var nodeMenu = [ + { + title: 'Show node information', + onMouseDown: function(elm, d, i) { + showVariableTable(d); + }, + onMouseUp: function(elm, d, i) {}, + onMouseOver: function(elm, d, i) {}, + childrenItems: [] + }, + { + title: 'Show usage of node in diagram', + onMouseDown: function(elm, d, i) { + d3.selectAll(".treeFrame").attr("fill-opacity", .5); + d3.selectAll(".nodeText").style("fill-opacity", 0.5); + highlight(d); + }, + onMouseUp: function(elm, d, i) { + d3.selectAll(".link").style("opacity",.6) + d3.selectAll(".treeFrame").attr("fill-opacity", .8); + d3.selectAll(".nodeText").style("fill-opacity", 1); + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + }, + { + title: 'Copy x-path to clipboard', + onMouseDown: function(elm, d, i) { + window.prompt("Copy to clipboard: Ctrl+C, Enter", d.xPath); + d3.select('.d3-context-menu').style('display', 'none'); + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: [] + } + ] + + var graph = currentGraph.xdsm; + var theNodes = graph.nodes + var theLinks = graph.edges + theLinks.forEach(function (link) { + link.source = link.from; + link.target = link.to; + link.value = link.name.split(",").length + }); + + + //################################################################################################// + var headerDiv = sankeyDiagramDiv.append("div").attr("class","panel panel-primary") + headerDiv.append("div").attr("class","panel-heading text-center") + .append("h3") + .attr("class","panel-title") + .style("font-family","Arial") + .style("font-size","20pt") + .text("Sankey Diagram") + var name_tmp=""; + if (currentGraph.name){name_tmp=currentGraph.name} + else{name_tmp="Graph " + currentGraph.id} + headerDiv.append("div").attr("class","panel-body") + .style("font-family","Arial") + .style("font-size","16pt") + .text("Graph name: " + name_tmp) + headerDiv.append("div").attr("class","panel-body") + .style("font-family","Arial") + .style("font-size","16pt") + .text("Graph description: " + currentGraph.description) + //################################################################################################// + + //aigner: Tree option menu to select which kind of tree view the user wants to see + //#####################################################################// + function showFullTree(categoryID, categoryDescr) + { + var name_tmp = "Full data model tree view; Categorization: " + categoryDescr; + var emptyArray=""; + var allLinks = d3.selectAll(".link"); + var theSchema = currentGraph.variableSchemes[categoryID]; + createTreeLayout(name_tmp,theSchema,emptyArray,allLinks,nodeMenu); + } + + var childrenItems = []; + for (var j=0; j< varCategories.length; j++) + { + childrenItems.push({title: 'according to ' + varCategories[j].description, + varCategory: varCategories[j].name, + description: varCategories[j].description, + onMouseClick: function(elm, d, i) {showFullTree(d.varCategory,d.description)}, + onMouseOver: function(elm,d,i){}}) + } + var treeOptionMenu = [ + { + title: 'Show variable tree...', + onMouseDown: function(elm, d, i) { + }, + onMouseUp: function(elm, d, i) { + }, + onMouseOver: function(elm, d, i) { + }, + childrenItems: childrenItems + } + ] + //#####################################################################// + + function showList(aTitle,aList,aMenu) + { + if (aList.length != 0) + { + var d3_body = d3.select("body"); + + var panel_div = d3_body.append("div").attr("class", "myPanel panel-default") + panel_div.append("div").attr("class","panel-heading") + .append("div").attr("class","panel_title").append("h4").text(aTitle) + panel_div.append("input") + .attr("id","myInput") + .attr("placeholder","Filter search...") + .attr("title","Type in a name") + .attr("onkeyup","filterSearch()") + var listGroup = panel_div.append("div").attr("class","panel-body") + .append("table").attr("id","myTable") + .append("tbody") + + var tr = listGroup + .selectAll('tr') + .data(aList).enter() + .append('tr') + var td = tr.append("td").html(function(d) { + if (d.xPath){return d.xPath;} + else {return d.name;} + }) + tr.on('contextmenu', d3.contextMenu(aMenu)); + $('.myPanel').lobiPanel({ + reload: false, + editTitle: false, + expand: false, + unpin: false, + resize: "none", + minWidth: 200, + minHeight: 200, + maxWidth: 1100, + maxHeight: 1200, + }); + $('.myPanel').lobiPanel('unpin'); + $('.myPanel').lobiPanel('height','5000'); + } + } + + //aigner: Data Model Tree View Button + //#################################################################################################################### + var dataModelDiv = d3.select(".sankeyDiagramDiv").append("div").attr("class","dataModelDiv").attr("transform","translate(10,0)") + var ul = dataModelDiv.append("ul") + var dropdown1 = ul.append("li").on("mouseover", function(){d3.select(this).style("cursor", "default")}) + dropdown1.append("img").attr("src",fileReference.AGILE_Icon) + .attr("align","left") + .style("margin-left","6px") + .style("margin-right","-10px") + .style("margin-top","10px") + .style("margin-bottom","0px") + .attr("height","20") + .attr("width","20") + dropdown1.append("a").text("Data Model Tree") + var links = dropdown1.append("ul"); + var xOffset_ul = dropdown1[0][0].offsetLeft+dropdown1[0][0].offsetWidth-40; + links.style("left", String(xOffset_ul)+"px") + for (var j=0; j< varCategories.length; j++) + { + //console.log(varCategories[j]) + var linkLi = links.append("li"); + var linkA = linkLi.append("a") + .attr("id",j) + .text(varCategories[j].description) + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click", function() + { + showFullTree(varCategories[this.id].name,varCategories[this.id].description) + }) + } + //aigner: Set width of the div, so the VISTOMS dropdown (in the top of the page) still works + //dataModelDiv.style("width", String(dropdown1.node().getBoundingClientRect().width+20)+"px") + //#################################################################################################################### + + //aigner: Data Model List View Button + //#################################################################################################################### + var ul_list = dataModelDiv.append("ul") + var dropdownList = ul_list.append("li").on("mouseover", function(){d3.select(this).style("cursor", "default")}) + dropdownList.append("img").attr("src",fileReference.AGILE_Icon) + .attr("align","left") + .style("margin-left","6px") + .style("margin-right","-10px") + .style("margin-top","10px") + .style("margin-bottom","0px") + .attr("height","20") + .attr("width","20") + dropdownList.append("a").text("Data Model List") + var linksList = dropdownList.append("ul"); + var xOffset_ul = dropdownList[0][0].offsetLeft+dropdownList[0][0].offsetWidth-40; + linksList.style("left", String(xOffset_ul)+"px") + for (var j=0; j< varCategories.length; j++) + { + //console.log(varCategories[j]) + var linkLi = linksList.append("li"); + var linkA = linkLi.append("a") + .attr("id",j) + .text(varCategories[j].description) + .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) + .on("click", function() + { + var variables = JSON.parse(JSON.stringify(currentGraph.variableSchemes[varCategories[this.id].name])); + variables.forEach(function(variable) + { + variable.name = variable.xPath + //work around because nodeMenu expexts the data, to have a "data" object inside + variable.data = variable + variable.data.name = variable.xPath.split("/")[variable.xPath.split("/").length-1] + }) + var title = "List view: full variable set categorized according to " + varCategories[this.id].description + showList(title,variables,nodeMenu) + }) + } + //aigner: Set width of the div, so the VISTOMS dropdown (in the top of the page) still works + //#################################################################################################################### + + d3.select(".dataModelDiv").moveToBack() + headerDiv.moveToBack() + d3.select(".generalPaneDiv").moveToBack() + d3.select(".navigationBarDiv").moveToBack() + d3.select(".visPackDiv").moveToBack() + + + biHiSankey + .nodes(theNodes) + .links(theLinks) + .initializeNodes(function (node) { + node.state = node.parent ? "contained" : "collapsed"; + }) + .layout(LAYOUT_INTERATIONS); + + disableUserInterractions(2 * TRANSITION_DURATION); + + update(); + }; + //#####################################################################// + startSankeyDiagram(data,graphID); + + },{"d3":1}]},{},[2]); + } + </script> + </body> +</html> diff --git a/kadmos/vistoms/templates/VISTOMS.html b/kadmos/vistoms/templates/VISTOMS.html index 7c610b732..e9caebd37 100644 --- a/kadmos/vistoms/templates/VISTOMS.html +++ b/kadmos/vistoms/templates/VISTOMS.html @@ -6,16 +6,122 @@ <meta name="apple-mobile-web-app-status-bar-style" content="default"> <head"> <meta charset="utf-8"> - <title>VISTOMS (Visualization Tool for MDO Systems)</title> + <title>MDO System Interface</title> <!--Include this css file in the <head> tag --> + <link rel="stylesheet" href="static/lib/bootstrap/bootstrap.css" rel="stylesheet"> + <link rel="stylesheet" href="static/lib/bootstrap/jumbotron.css" rel="stylesheet"> <link rel="stylesheet" href="static/lib/jquery/jquery-ui.min.css"/> <link rel="stylesheet" href="static/lib/bootstrap/bootstrap.min.css"/> <link rel="stylesheet" href="static/lib/lobipanel/github.css"/> <link rel="stylesheet" href="static/lib/lobipanel/lobipanel.min.css"/> <link rel="stylesheet" href="static/lib/vistoms.css"/> </head> -<body> - <!--Include these script files in the <head> or <body> tag--> + +<body> + <nav style="position:fixed" class="navbar navbar-expand-md navbar-dark fixed-top bg-dark"> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarsExampleDefault"> + <ul class="navbar-nav mr-auto"> + <li style="margin-left:10pt" class="nav-item"> + <a id="mainPage" class="nav-link" style="cursor: pointer"><img title="Main page" src="static/pictures/Home.png" width="25" height="25"></img> </a> + </li> + <li style="margin-left:10pt" class="nav-item"> + <a id="tutorial" class="nav-link" target="_blank" href="http://www.agile-project.eu/files/VISTOMS_Tutorial.mp4"><img title="Tutorial" src="static/pictures/Tutorial.png" width="35" height="25"></img></a> + + </li> + <li style="margin-left:10pt" class="nav-item"> + <a id="email" class="nav-link" href="mailto:support@agile-project.eu"><img title="Contact support team" src="static/pictures/Contact.png" width="40" height="25"></img> </a> + </li> + <li style="margin-left:10pt" class="nav-item"> + <a id="acknowledgements" class="nav-link" href="#"><img title="Acknowledgements" src="static/pictures/Acknowledgements.png" width="25" height="25"></img> </a> + </li> + </ul> + <div style="float: none;text-align: center;" class="navbar-header"> + <img style="margin-bottom:10pt" src="static/pictures/AGILE_Icon.png" width="40" height="40"></img> + <a style="color: white;font-size:24pt; float:none" class="navbar-brand">MDO System Interface</a> + </div> + </div> + </nav> + + <main style="" id="main" role="main"> + <!-- Main jumbotron for a primary marketing message or call to action --> + <div style="margin-top:10pt; " class="jumbotron"> + <div class="container"> + <h1 class="display-3">Welcome to the MDO System Interface!</h1> + <p></p> + <p>This package was created within the context of the European Horizon 2020 project <a href="http://www.agile-project.eu/" target="_blank"><img src="static/pictures/AGILE_Logo_large.png" width="100" height="20"></img></a> . To find out more about the project, please click on the AGILE logo.</p> + </br></br></br> + <p>To set up, modify, or inspect an already existing MDO system, go to one of the visualization types below (XDSM, Edge Bundles, Sankey Diagram). Then select a graph from the dropdown menu.</p> + <section style="margin:0pt" class="container"> + <div style="margin:5pt; margin-left:0pt; float:left" class="dropdown"> + <button style="font-size:18pt" class="btn btn-primary dropdown-toggle" type="button" id="xdsm_button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + XDSM + </button> + <div id="xdsm_dropdown" style="font-size:14pt" class="dropdown-menu" aria-labelledby="xdsm_button"> + </div> + </div> + <div style="margin:5pt; margin-left:0pt; float:left" class="dropdown"> + <button style="font-size:18pt" class="btn btn-primary dropdown-toggle" type="button" id="edgeBundles_button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Edge Bundles + </button> + <div id="edgeBundles_dropdown" style="font-size:14pt" class="dropdown-menu" aria-labelledby="edgeBundles_button"> + </div> + </div> + <div style="margin:5pt; margin-left:0pt; float:left" class="dropdown"> + <button style="font-size:18pt" class="btn btn-primary dropdown-toggle" type="button" id="sankeyDiagram_button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Sankey Diagram + </button> + <div id="sankeyDiagram_dropdown" style="font-size:14pt" class="dropdown-menu" aria-labelledby="sankeyDiagram_button"> + </div> + </div> + </section> + </br></br></br> + <p>If you haven't set up a system yet, use the "Add graph" option to upload an MDO system file, or start a new system from scratch.</p> + <section class="container"> + <div style="margin:5pt; margin-left:0pt; float:left" class="dropdown"> + <button style="font-size:18pt" class="btn btn-secondary dropdown-toggle" type="button" id="addGraph" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Add graph + </button> + <div style="font-size:14pt" class="dropdown-menu" aria-labelledby="addGraph"> + <a id="from_scratch" class="dropdown-item" onmouseover="" style="cursor: pointer;">Create graph from scratch</a> + <a id="kdms_upload" class="dropdown-item" onmouseover="" style="cursor: pointer;">Upload KDMS file(s)</a> + <a id="cmdows_upload" class="dropdown-item" onmouseover="" style="cursor: pointer;">Upload CMDOWS file</a> + <a id="database_upload" class="dropdown-item" onmouseover="" style="cursor: pointer;">Upload database (zip-file)</a> + </div> + </div> + <div id="save_dropdown" style="margin:5pt; margin-left:0pt; float:left; visibility:hidden" class="dropdown"> + <button style="font-size:18pt" class="btn btn-secondary dropdown-toggle" type="button" id="saveGraphs" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Save all graphs + </button> + <div style="font-size:14pt" class="dropdown-menu" aria-labelledby="saveGraphs"> + <a id="kdms_save" class="dropdown-item" onmouseover="" style="cursor: pointer;">As KDMS files for download</a> + <a id="cmdows_save" class="dropdown-item" onmouseover="" style="cursor: pointer;">As CMDOWS files for download</a> + </div> + </div> + </section> + </br></br></br> + </div> + </div> + </main> + + <footer style="" class="container"> + <p>© Benedikt Aigner (RWTH Aachen) & Imco van Gent (TU Delft) 2016-2018</p> + <p> + <a style="padding:5pt" href="https://www.rwth-aachen.de" target="_blank"><img title="RWTH Aachen Homepage" src="static/pictures/RWTH_Logo.png" width="150" height="40"></img></a> + <a style="padding:5pt" href="https://www.tudelft.nl/" target="_blank"><img title="TU Delft Homepage" src="static/pictures/TUDelft_Logo.png" width="100" height="40"></img></a> + </p> + </footer> + </body> + + <!-- Bootstrap core JavaScript + ================================================== --> + <!-- Placed at the end of the document so the pages load faster --> + <script src="static/lib/bootstrap/jquery-3.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> + <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery-slim.min.js"><\/script>')</script> + <script src="static/lib/bootstrap/popper.js"></script> + <script src="static/lib/bootstrap/bootstrap.js"></script> <script src="static/lib/jquery/jquery.3.20.min.js"></script> <script src="static/lib/jquery/jquery-ui.min.js"></script> <script src="static/lib/jquery/jquery.ui.touch-punch.min.js"></script> @@ -310,10 +416,6 @@ function makeKadmosMenu(data, initial=false) { //First of all, clear everything if it is already there - var visPackDiv = d3.select(".visPackDiv"); - if(visPackDiv){visPackDiv.remove()}; - var navigationBarDiv = d3.select(".navigationBarDiv"); - if(navigationBarDiv){navigationBarDiv.remove()}; var lobiPanels = d3.selectAll(".lobipanel"); if (lobiPanels) { @@ -322,130 +424,16 @@ this.remove(); }) } - - var imageWidth = 200; - var imageHeight = 150; - var padding = 10; - var rectHeight = 70; - var imgSize = 40; - visPackDiv = d3.select("body").append("div").attr("class","visPackDiv"); - var visPackSvg = visPackDiv.append("svg") - .attr("class","visPackSvg") - .attr("width",imageWidth*5+40) - .attr("height",imageHeight+40) - .attr("transform", "translate(" - + String(10) + "," + String(10) + ")") - - var visPackFrame = visPackSvg.append("rect") - .attr("width",imageWidth*5+12) - .attr("height",imageHeight) - .attr("fill", "none") - var imgs = visPackSvg.selectAll("image1").data([0]); - imgs.enter() - .append("svg:image") - .attr("x",5) - .attr("xlink:href", fileReference.AGILE_Logo) - .attr("width", imageWidth) - .attr("height", imageHeight) - .attr("position", "relative") - - var imgs = visPackSvg.selectAll("image2").data([0]); - imgs.enter() - .append("svg:image") - .attr("x",210) - .attr("y",-5) - .attr("xlink:href", fileReference.VISTOMS_Label) - .attr("width", "180pt") - .attr("height", "70pt") - - - - //Set general offset for Buttons, acknowledgements and so on - var offset_tmp = 645; - - //aigner: Make Acknowledgments, Help and Home buttons + //@aigner: Make Acknowledgments, Help and Home buttons //########################################################## - visPackSvg.append("rect") - .attr("transform", "translate("+ String(offset_tmp+17) + "," + String(0) + ")") - .attr("fill", "#555555") - .attr("width", 186) - .attr("height", 40) - - function makeButton(anId, aText,aPicFile, anOffset, aScale, picX, picY) - { - var buttonGroup = visPackSvg.append("a").classed("buttonGroup",true) - buttonGroup - .attr("class",anId) - .append("svg:title").text(aText) - var polygon = buttonGroup.append("polygon").classed("button",true) - .attr("points", "30,15 22.5,28.0 7.5,28 0,15 7.5,2 22.5,2") - .attr("transform", "translate("+ String(anOffset) + "," + String(2) + ") scale(1.2)") - buttonGroup.append("image") - .attr("xlink:href",aPicFile) - .attr("height",50) - .attr("width",50) - .attr("transform", "translate("+ String(anOffset+picX) + "," + String(picY) + ") scale("+aScale+")") - buttonGroup - .on("mouseover", function() - { - polygon.style("fill","#3399FF") - d3.select(this).style("cursor", "pointer") - }) - .on("mouseleave", function() - { - polygon.style("fill","#555555") - }) - } ///Home button - var distance = 45; - var currentOffset = offset_tmp+25; - makeButton("id_mainPage","Main Page",fileReference.Home, currentOffset, 0.45, 6.9,7.2); - d3.select(".id_mainPage").on("click",function() + d3.select("#mainPage").on("mousedown",function() { mainPage(); }) - //help button - currentOffset+=distance; - makeButton("id_turorial","Tutorial",fileReference.Tutorial, currentOffset, 0.45, 6.8, 7.5); - d3.select(".id_turorial").on("click",function() - { - tutorial(); - }) - //Contact button - currentOffset+=distance; - makeButton("id_contact","Contact the support team",fileReference.Contact, currentOffset, 0.45, 6.9, 9); - d3.select(".id_contact").on("click",function() - { - sendMail("VISTOMS support"); - }) - - //Acknowledgements button - currentOffset+=distance; - makeButton("id_acknowledgements","Acknowledgements",fileReference.Acknowledgements, currentOffset, 0.45, 7, 8); - d3.select(".id_acknowledgements").on("click",function() - { - acknowledgements(); - }) - //########################################################## - - var navigationBarDiv = d3.select("body").append("div").attr("class","navigationBarDiv") - var ul = navigationBarDiv.append("ul") - navigationBarDiv.on("mouseover", function() - { - d3.select(this).style("z-index","1300"); - }) - .on("mouseout", function() - { - d3.select(this).style("z-index",""); - }) - var generalPanel_div = d3.select(".generalPaneDiv") - if (generalPanel_div) - generalPanel_div.remove(); - - - + //########################################################## var tmpGraphsAvailable = false; if (initial) @@ -494,7 +482,8 @@ makeViewButtons(data,"Edge Bundles","edgeBundles"); makeViewButtons(data,"Sankey Diagram","sankeyDiagram"); //aigner: Add special button to open graphs from kdms or cmdows files - generalPanel(data.graphs); + add_graph_dropdown(data.graphs); + save_graph_dropdown(data.graphs); } }, error: function(result) @@ -512,7 +501,8 @@ makeViewButtons(data,"Edge Bundles","edgeBundles"); makeViewButtons(data,"Sankey Diagram","sankeyDiagram"); //aigner: Add special button to open graphs from kdms or cmdows files - generalPanel(data.graphs); + add_graph_dropdown(data.graphs); + save_graph_dropdown(data.graphs); } @@ -523,26 +513,13 @@ function makeViewButtons(data,name, aView) { var numberOfGraphs = 0; - var dropdown1 = ul.append("li") - .on("mouseover", function() - { - d3.select(this).style("cursor", "default") - }) - - dropdown1.append("a").text(name) - dropdown1.append("img").attr("src",fileReference.AGILE_Icon) - .attr("align","left") - .style("margin-left","6px") - .style("margin-right","0px") - .style("margin-top","10px") - .style("margin-bottom","6px") - .attr("height","42") - .attr("width","42") - var links = dropdown1.append("ul"); + var dropdown = d3.select("#"+aView+"_dropdown") + if (dropdown){dropdown.selectAll("a").remove();} if (data=="REP__GRAPH_DATA__REP" && !tmpGraphsAvailable) { - var linkLi = links.append("li"); - var link = linkLi.append("a") + var dropdown = d3.select("#"+aView+"_dropdown") + dropdown.append("a") + .attr("class","dropdown-item") .style("font-style","Italic") .text("No graphs to inspect ...") .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) @@ -566,24 +543,23 @@ var graphs_tmp = data.graphs; for (var i=0; i < graphs_tmp.length; i++) { - makeDropDown(data,graphs_tmp[i],aView,links) + makeDropDown(data,graphs_tmp[i],aView) numberOfGraphs ++; } } - - } - function makeDropDown(theData,theGraph,theView,theLinks) - { - var linkLi = theLinks.append("li"); - var name_tmp=""; + function makeDropDown(theData,theGraph,theView) + { + var name_tmp=""; if (theGraph.name){name_tmp=theGraph.name} else{name_tmp="Graph " + theGraph.id} - var link = linkLi.append("a").text(name_tmp) + var dropdown = d3.select("#"+theView+"_dropdown") + dropdown.append("a") + .attr("class","dropdown-item") .text(name_tmp) .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) - .on("click", function() + .on("click", function() { clearView(); if (theView == "xdsm") @@ -604,11 +580,9 @@ //aigner: Add general panel to open and save graphs and for adding contacts to the organization - //########################################################## - function generalPanel(theGraphs) - { - var generalPanel_div = d3.select("body").append("div").attr("class","generalPaneDiv") - + //########################################################## + function add_graph_dropdown(theGraphs) + { var newGraphID = '01'; if (theGraphs) { @@ -620,345 +594,233 @@ }) } - var addButtonPanel = generalPanel_div.append("div") - .attr("class","panel panel-default") - .attr("id","addButton") - .style("display","inline-block") - .style("min-width","200px") - .style("margin-left","10px") - addButtonPanel.append("div").attr("class","panel-heading text-center align-top") - .style("background-color","#555555") - .append("h3") - .attr("class","panel-title") - .style("font-family","Arial") - .style("font-size","14pt") - .style("color","white") - .style("display","inline-block") - .text("Add graph") - var panelBody = addButtonPanel.append("div").attr("class","panel-body") - .style("font-family","Arial") - .style("font-size","8pt") - .style("display","inline-block") - - - var options = ["Choose...", "Create graph from scratch", "Upload KDMS file(s)", "Upload CMDOWS file", "Upload Database"]; - - var select = panelBody.append('select') - .attr('id','addselect') - .attr('class','select') - .on('change',onchange) - - var options = select.selectAll('option') - .data(options).enter() - .append('option') - .text(function (d) { return d; }); - - - var form = panelBody.append("form").attr("id","addForm") - .attr("method","post") - .attr("enctype","multipart/form-data") - var label = form.append("label") - var fileText; - var file; - var submit; - var selectValue; - - function onchange() { - if (include(d3.select('#addselect').property('value'),"Create")) - { - selectValue = "Create" - if (file){ - fileText.remove(); - file.remove(); - } - if (submit){submit.remove();} - submit = label.append("button") - .style("margin-top","10pt") - .attr("type","submit") - .attr("class","btn btn-primary") - .text("Go!") - } - else if (include(d3.select('#addselect').property('value'),"KDMS")) - { - selectValue = "KDMS" - if (file){ - fileText.remove(); - file.remove(); - } - if (submit){submit.remove();} - fileText = label.append("text") - .style("font-family","Arial") - .style("font-size","12pt") - .text("Choose KDMS files (max. 2: 1 data graph & 1 process graph)") - file = label.append("input").attr("type","file").attr("name","file[]").attr("multiple","") - submit = label.append("input").attr("type","submit").attr("value","Submit"); - } - else if (include(d3.select('#addselect').property('value'),"CMDOWS")) - { - selectValue = "CMDOWS" - if (file){ - fileText.remove(); - file.remove(); - } - if (submit){submit.remove();} - fileText = label.append("text") - .style("font-family","Arial") - .style("font-size","12pt") - .text("Choose any CMDOWS file") - file = label.append("input").attr("type","file").attr("name","file[]") - submit = label.append("input").attr("type","submit").attr("value","Submit"); - } - else if (include(d3.select('#addselect').property('value'),"Database")) - { - selectValue = "Database" - if (file){ - fileText.remove(); - file.remove(); - } - if (submit){submit.remove();} - fileText = label.append("text") - .style("font-family","Arial") - .style("font-size","12pt") - .text("Choose any zip file containing a database") - file = label.append("input").attr("type","file").attr("name","file[]") - submit = label.append("input").attr("type","submit").attr("value","Submit"); - } - else{} - }; - - $('#addForm').on('submit',function(event){ - event.preventDefault(); - //aigner: Uploading files for KADMOS - var formData = new FormData($('#addForm')[0]); - formData.append('newGraphID', newGraphID); - formData.append('fileType',selectValue); - formData.append('sessionId',sessionId) - - - if (selectValue == "Create") - { - bootbox.hideAll(); - var html = d3.select("html") - var form_content = html.append("div").attr("class","form-content").attr("style","display:none") - var form = form_content.append("form").attr("class","form").attr("role","form") - var form_group, input; - - //Tool information - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Name") - input = form_group.append("input") - .attr("id","graph_name") - .attr("class","form-control") - .attr("name","graph_name") - .attr("placeholder","Add a graph name here...") - //Tool information - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Description") - input = form_group.append("input") - .attr("id","graph_description") - .attr("class","form-control") - .attr("name","graph_description") - .attr("placeholder","Add a graph description here...") + d3.select("#from_scratch").on("mousedown", function() + { + bootbox.hideAll(); + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; - bootbox.dialog({ - message: $(".form-content").html(), - title: "Create new graph", - size: "large", - buttons: [ - { - label: "Cancel", - className: "btn btn-default pull-left", - callback: function() { - d3.selectAll(".form-content").remove(); - } - }, - { - label: "OK", - className: "btn btn-primary pull-left", - callback: function() { - - //get form data - var graph_name = $('form #graph_name').val(); - var graph_description = $('form #graph_description').val(); - - - var bootboxContent = {title: "Create new graph", message: '<p>Please be patient...</p>'}; - var xhr = $.ajax({ - type: 'POST', - url: '/kadmos_create_new_graph', - data: {'graph_name':graph_name, 'graph_description':graph_description, 'graphID':newGraphID, 'sessionId':sessionId}, - success: function(result) + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Name") + input = form_group.append("input") + .attr("id","graph_name") + .attr("class","form-control") + .attr("name","graph_name") + .attr("placeholder","Add a graph name here...") + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Description") + input = form_group.append("input") + .attr("id","graph_description") + .attr("class","form-control") + .attr("name","graph_description") + .attr("placeholder","Add a graph description here...") + + bootbox.dialog({ + message: $(".form-content").html(), + title: "Create new graph", + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default pull-left", + callback: function() { + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary pull-left", + callback: function() { + + //get form data + var graph_name = $('form #graph_name').val(); + var graph_description = $('form #graph_description').val(); + + + var bootboxContent = {title: "Create new graph", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_create_new_graph', + data: {'graph_name':graph_name, 'graph_description':graph_description, 'graphID':newGraphID, 'sessionId':sessionId}, + success: function(result) + { + if (result.includes("ERROR:")) { - if (result.includes("ERROR:")) + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + + clearView(); + makeKadmosMenu(data); + mainPage(); + } + else + { + var updatedData = {}; + if (data != "REP__GRAPH_DATA__REP") { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - - clearView(); - makeKadmosMenu(data); - mainPage(); + updatedData = data; + var graphData = JSON.parse(result); + updatedData.graphs.push(graphData.graphs[0]); } else { - var updatedData = {}; - if (data != "REP__GRAPH_DATA__REP") - { - updatedData = data; - var graphData = JSON.parse(result); - updatedData.graphs.push(graphData.graphs[0]); - } - else - { - updatedData = JSON.parse(result); - } - - clearView(); - makeKadmosMenu(updatedData); - mainPage(); - - bootboxContent.message = "Success!" - kadmosSuccessMessage(bootboxContent) - + updatedData = JSON.parse(result); } - }, - error: function(result) - { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); + + clearView(); + makeKadmosMenu(updatedData); + mainPage(); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } - }); - kadmosHavePatience(xhr, bootboxContent) - d3.selectAll(".form-content").remove(); - } - } - ] - }); - } - else - { - //aigner: Upload file to VISTOMS and inspect it - //########################################################## - var bootboxContent = {title: "Upload file to VISTOMS", message: '<p>Please be patient...</p>'}; - var xhr = $.ajax({ - type: 'POST', - url: '/kadmos_upload_file', - data: formData, - processData: false, - contentType: false, - success: function(result) + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + d3.selectAll(".form-content").remove(); + } + } + ] + }); + }) + + d3.select("#kdms_upload").on("mousedown", function() + { + prepare_graphUpload("Upload KDMS file(s)", "Choose KDMS files (max. 2: 1 data graph & 1 process graph)", "KDMS") + }) + + d3.select("#cmdows_upload").on("mousedown", function() + { + prepare_graphUpload("Upload CMDOWS file", "Choose CMDOWS file", "CMDOWS") + }) + + d3.select("#database_upload").on("mousedown", function() + { + prepare_graphUpload("Upload Database", "Choose Database zip file", "Database") + }) + + function prepare_graphUpload(title, text, fileType) + { + bootbox.dialog({ + title: title, + message: "<form id='addForm' method='post' enctype='multipart/form-data' ><label><text>"+text+"</text><input type='file' name='file[]' multiple=''></input><input type='submit' value='Submit'></input></label></form>", + buttons: [{ + label: "Cancel", + className: "btn btn-danger pull-left", + callback: function() {}}] + }); + $('#addForm').on('submit',function(event){ + event.preventDefault(); + //aigner: Uploading files for KADMOS + var formData = new FormData($('#addForm')[0]); + formData.append('newGraphID', newGraphID); + formData.append('fileType', fileType); + formData.append('sessionId',sessionId) + upload_graph(formData); + }); + } + + function upload_graph(formData) + { + //aigner: Upload file to VISTOMS and inspect it + //########################################################## + var bootboxContent = {title: "Upload file to VISTOMS", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_upload_file', + data: formData, + processData: false, + contentType: false, + success: function(result) + { + if (result.includes("ERROR:")) { - if (result.includes("ERROR:")) + + + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + + clearView(); + makeKadmosMenu(data); + mainPage(); + } + else + { + var updatedData = {}; + if (data != "REP__GRAPH_DATA__REP") { - - - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - - clearView(); - makeKadmosMenu(data); - mainPage(); + updatedData = data; + var graphData = JSON.parse(result); + updatedData.graphs.push(graphData.graphs[0]); } else { - var updatedData = {}; - if (data != "REP__GRAPH_DATA__REP") - { - updatedData = data; - var graphData = JSON.parse(result); - updatedData.graphs.push(graphData.graphs[0]); - } - else - { - updatedData = JSON.parse(result); - } - - clearView(); - makeKadmosMenu(updatedData); - mainPage(); - - bootboxContent.message = "Success!" - kadmosSuccessMessage(bootboxContent) - + updatedData = JSON.parse(result); } - }, - error: function(result) - { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); + + clearView(); + makeKadmosMenu(updatedData); + mainPage(); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } - }); - kadmosHavePatience(xhr, bootboxContent) - //########################################################## - - } - }); + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + //########################################################## + } + } + + function save_graph_dropdown(theGraphs) + { if (theGraphs) { - var saveButtonPanel = generalPanel_div.append("div") - .attr("class","panel panel-default") - .attr("id","saveButton") - .style("display","inline-block") - .style("min-width","200px") - .style("margin-left","10px") - saveButtonPanel.append("div").attr("class","panel-heading text-center align-top") - .style("background-color","#555555") - .append("h3") - .attr("class","panel-title") - .style("font-family","Arial") - .style("font-size","14pt") - .style("color","white") - .style("display","inline-block") - .text("Save all graphs") - var savepanelBody = saveButtonPanel.append("div").attr("class","panel-body") - .style("font-family","Arial") - .style("font-size","8pt") - .style("display","inline-block") - - - var options = ["Choose...","KDMS files", "CMDOWS files"]; - - var saveselect = savepanelBody.append('select') - .attr('id','saveselect') - .attr('class','select') - .on('change',onchange) - - var options = saveselect.selectAll('option') - .data(options).enter() - .append('option') - .text(function (d) { return d; }); - + var save_dropdown = d3.select("#save_dropdown") + save_dropdown.style("visibility","visible") + console.log(save_dropdown) - var saveform = savepanelBody.append("form").attr("id","saveForm") - .attr("method","post") - .attr("enctype","multipart/form-data") - var savelabel = saveform.append("label") - var saveSubmit; - var selectValue; - - function onchange() { - selectValue = d3.select('#saveselect').property('value') - if (saveSubmit){saveSubmit.remove();} - if (selectValue!="Choose...") - { - saveSubmit = savelabel.append("input").attr("type","submit").attr("value","Save"); - } - }; + d3.select("#kdms_save").on("mousedown", function() + { + save_graphs("KDMS") + }) + d3.select("#cmdows_save").on("mousedown", function() + { + save_graphs("CMDOWS") + }) - $('#saveForm').on('submit',function(event){ - event.preventDefault(); - //aigner: Uploading files for KADMOS + function save_graphs(fileType) + { + //aigner: Saving files //########################################################## bootbox.hideAll(); var bootboxContent = {title: "Save graph", message: '<p>Please be patient...</p>'}; var xhr = $.ajax( { type: 'POST', - data: {'fileType': selectValue, 'sessionId': sessionId}, + data: {'fileType': fileType, 'sessionId': sessionId}, url: '/kadmos_export_all_graphs', success: function(result) { var files = result + console.log(files) files.forEach(function(file) { download_from_kadmos(file,"/kadmos_download/"+file+"/"+sessionId) @@ -992,11 +854,10 @@ }); kadmosHavePatience(xhr, bootboxContent) //########################################################## - }); + } } - d3.select("#mainPage").moveToFront() } - } + } //########################################################## @@ -1012,199 +873,206 @@ //#####################################################################// + //@aigner: !!! function mainPage() { clearView(); - var introDiv = d3.select("body").append("div") - .attr("id","mainPage") - .classed("wordWrap",true) + + var technologies = "<div style='' id='technologies' class='container'><h1 style='font-size:24pt'>The MDO System Interface is powered by the following technologies</h1><div style='margin-top:20pt' class='row'><div class='col-md-4'><h2 style='font-size:20pt'><img src='static/pictures/KADMOS_Logo.png' width='150' height='40'/></h2><p style='font-size:12pt'><b>K</b>nowledge- and graph-based <b>A</b>gile <b>D</b>esign with <b>M</b>ultidisciplinary <b>O</b>ptimization <b>S</b>ystem</p><p style='font-size:10pt'>KADMOS is the python-based engine running under the hood of the MDO System Interface. To get more information on it's capabilities, go to the open-source KADMOS repository.</p><p style='margin-bottom:10pt'><button style='font-size:12pt' class='btn btn-secondary' onclick='window.open(\"https://bitbucket.org/imcovangent/kadmos\")'>KADMOS repository »</button></p></div><div class='col-md-4'><h2 style='font-size:20pt'><img src='static/pictures/CMDOWS_Logo.png' width='40' height='%0'/> CMDOWS</h2><p style='font-size:12pt'><b>C</b>ommon <b>MDO</b> <b>W</b>orkflow <b>S</b>chema</p><p style='font-size:10pt'>CMDOWS is the XML-based storage system for MDO systems. It contains all the data of an MDO system including the tools, their interconnections, execution order, optimization strategy, etc. <br> To get more information, please go to the open-source CMDOWS repository.</p><p style='margin-bottom:10pt'><button style='font-size:12pt' class='btn btn-secondary' onclick='window.open(\"https://bitbucket.org/imcovangent/cmdows\")'>CMDOWS repository »</button></p></div><div class='col-md-4'><h2 style='font-size:20pt'><img src='static/pictures/VISTOMS_Label.png' width='150' height='45'/></h2><p style='font-size:12pt'><b>VIS</b>ualization <b>TO</b>ol for <b>M</b>DO <b>S</b>ystems</p><p style='font-size:10pt'>VISTOMS is the graphical user interface that allows you to easily set up, inspect and modify your MDO systems. If you need more information about how to use it, simply click on the tutorial button in the navigation bar, or just click on the button below.</p><p style='margin-bottom:10pt'><button style='font-size:12pt' class='btn btn-secondary' onclick='window.open(\"http://www.agile-project.eu/files/VISTOMS_Tutorial.mp4\")'>Tutorial »</button></p></div></div><hr></div>" + var footer = "<footer style=''' class='container'><p>© Benedikt Aigner (RWTH Aachen) & Imco van Gent (TU Delft) 2016-2018</p><p><a style='padding:5pt' href=\"https://www.rwth-aachen.de\" target='_blank'><img title='RWTH Aachen Homepage' src='static/pictures/RWTH_Logo.png' width='150' height='40'></img></a><a style='padding:5pt' href=\"https://www.tudelft.nl/\" target='_blank'><img title='TU Delft Homepage' src='static/pictures/TUDelft_Logo.png' width='100' height='40'></img></a></p></footer>" + + d3.select("#main").append("div").html(technologies) + d3.select("#main").append("div").html(footer) + <!-- var introDiv = d3.select("body").append("div") --> + <!-- .attr("id","mainPage") --> + <!-- .classed("wordWrap",true) --> - var theHeading = "Welcome to <b>VISTOMS</b>, the <b>VIS</b>ualization <b>TO</b>ol for <b>M</b>DO <b>S</b>ystems!\n"; - introDiv.append("text") - .style("font-size","16pt") - .html(theHeading) + <!-- var theHeading = "Welcome to the MDO System Interface!\n" --> + <!-- introDiv.append("text") --> + <!-- .style("font-size","16pt") --> + <!-- .html(theHeading) --> - var theText = "\nTo inspect an MDO system, go to one of the visualizations in the navigation bar (XDSM, Edge Bundles, or Sankey Diagram). Then select a graph from the dropdown menu.\n\nIf you need help with how to use the visualization package, there is a tutorial video available. Just click on the \"Tutorial\" symbol in the top right corner."; - introDiv.append("text").text(theText) - introDiv.append("text") - .style("font-size","8pt") - .html("\n\n\nCopyright 2016-2018 by Benedikt Aigner (RWTH Aachen) & Imco van Gent (TU Delft)") + <!-- var theText = "The interface is a combination of two open-source packages, the <b>K</b>nowledge- and graph-based <b>A</b>gile <b>D</b>esign with <b>M</b>ultidisciplinary <b>O</b>ptimization <b>S</b>ystem (<b>KADMOS</b>) " --> + <!-- +"and the <b>VIS</b>ualization <b>TO</b>ol for <b>M</b>DO <b>S</b>ystems (<b>VISTOMS</b>). " --> + <!-- +"While KADMOS is the python-based engine running under the hood, VISTOMS is the graphical user interface to facilitate the setup of your MDO systems." --> + <!-- +"\n\nTo set up, modify, or inspect an already existing MDO system, go to one of the visualizations in the navigation bar (XDSM, Edge Bundles, or Sankey Diagram). Then select a graph from the dropdown menu." --> + <!-- +"\n\nIf you haven't already set up a system, use the \"Add graph\" option to upload an MDO system file, or start a new system from scratch." --> + <!-- +"\n\nIf you need help with how to use the package, there is a tutorial video available. Just click on the \"Tutorial\" symbol in the top right corner." --> + <!-- +"\n\nIf you want to get more information on the package, here is a link to the open-source <b><a target=\"_blank\" href=\"https://bitbucket.org/imcovangent/kadmos\">KADMOS repository</a></b> "; --> + <!-- introDiv.append("text").html(theText) --> + <!-- introDiv.append("text") --> + <!-- .style("font-size","8pt") --> + <!-- .html("\n\n\nCopyright 2016-2018 by Benedikt Aigner (RWTH Aachen) & Imco van Gent (TU Delft)") --> - var introSvg = introDiv.append("svg") - .attr("width",500) - .attr("height",100) - var imgs = introSvg.selectAll("img").data([0]); - imgs.enter() - .append("svg:image") - .attr("xlink:href", fileReference.RWTH_Logo) - .attr("width", "150") - .attr("height", "70") - .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) - .on("click",function(){window.open("https://www.rwth-aachen.de/", '_blank');} ) - var imgs = introSvg.selectAll("img").data([0]); - imgs.enter() - .append("svg:image") - .attr("xlink:href", fileReference.TUDelft_Logo) - .attr("x", 175) - .attr("y", 5) - .attr("width", "105") - .attr("height", "50") - .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) - .on("click",function(){window.open("https://www.tudelft.nl/en/", '_blank');} ) + <!-- var introSvg = introDiv.append("svg") --> + <!-- .attr("width",500) --> + <!-- .attr("height",100) --> + <!-- var imgs = introSvg.selectAll("img").data([0]); --> + <!-- imgs.enter() --> + <!-- .append("svg:image") --> + <!-- .attr("xlink:href", fileReference.RWTH_Logo) --> + <!-- .attr("width", "150") --> + <!-- .attr("height", "70") --> + <!-- .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) --> + <!-- .on("click",function(){window.open("https://www.rwth-aachen.de/", '_blank');} ) --> + <!-- var imgs = introSvg.selectAll("img").data([0]); --> + <!-- imgs.enter() --> + <!-- .append("svg:image") --> + <!-- .attr("xlink:href", fileReference.TUDelft_Logo) --> + <!-- .attr("x", 175) --> + <!-- .attr("y", 5) --> + <!-- .attr("width", "105") --> + <!-- .attr("height", "50") --> + <!-- .on("mouseover", function(){d3.select(this).style("cursor", "pointer")}) --> + <!-- .on("click",function(){window.open("https://www.tudelft.nl/en/", '_blank');} ) --> } //#####################################################################// //#####################################################################// + //@aigner: !!! function acknowledgements() { clearView(); - var acknDiv = d3.select("body").append("div") - .attr("id","acknowledgements") - .classed("acknText", true) - .classed("wordWrap",true) + <!-- var acknDiv = d3.select("body").append("div") --> + <!-- .attr("id","acknowledgements") --> + <!-- .classed("acknText", true) --> + <!-- .classed("wordWrap",true) --> - var theHeading = "Acknowledgements"; - acknDiv.append("text") - .style("font-size","16pt") - .html(theHeading) + <!-- var theHeading = "Acknowledgements"; --> + <!-- acknDiv.append("text") --> + <!-- .style("font-size","16pt") --> + <!-- .html(theHeading) --> - acknDiv.append("text") - .style("font-size","10pt") - .style("margin", "20px 10px") - .html("<br><br>Created by Benedikt Aigner and Imco van Gent for the " - +"<a href=\"http://www.agile-project.eu/\">AGILE Project</a> in 2016. This project has received funding from the European Union's Horizon 2020 research and innovation framework programme under grant agreement No 636202." - +"<br>" - +"<br>" - +"<b>VISTOMS was created using the following open source packages:</b>" - +"<br>" - +"<a href=\"https://d3js.org/\">D3.js</a> package © 2015 by Mike Bostock released under the <a href=\"https://opensource.org/licenses/BSD-3-Clause\">BSD license</a>" - +"<br>" - +"<a href=\"https://github.com/OneraHub/XDSMjs\">XDSM.js </a> package © 2016 by Rémi Lafage released under the <a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache License, Version 2.0</a>" - +"<br>" - +"<a href=\"https://github.com/Neilos/bihisankey\">BiHiSankey.js</a> package © 2015 by Neil Atkinson released under the <a href=\"https://opensource.org/licenses/MIT\">MIT License</a>" - +"<br>" - +"<br>" - +"<br>" - +"<font size=\"-2\">Rev. 10/24/2018</font>") + <!-- acknDiv.append("text") --> + <!-- .style("font-size","10pt") --> + <!-- .style("margin", "20px 10px") --> + <!-- .html("<br><br>Created by Benedikt Aigner and Imco van Gent for the " --> + <!-- +"<a href=\"http://www.agile-project.eu/\">AGILE Project</a> in 2016. This project has received funding from the European Union's Horizon 2020 research and innovation framework programme under grant agreement No 636202." --> + <!-- +"<br>" --> + <!-- +"<br>" --> + <!-- +"<b>VISTOMS was created using the following open source packages:</b>" --> + <!-- +"<br>" --> + <!-- +"<a href=\"https://d3js.org/\">D3.js</a> package © 2015 by Mike Bostock released under the <a href=\"https://opensource.org/licenses/BSD-3-Clause\">BSD license</a>" --> + <!-- +"<br>" --> + <!-- +"<a href=\"https://github.com/OneraHub/XDSMjs\">XDSM.js </a> package © 2016 by Rémi Lafage released under the <a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache License, Version 2.0</a>" --> + <!-- +"<br>" --> + <!-- +"<a href=\"https://github.com/Neilos/bihisankey\">BiHiSankey.js</a> package © 2015 by Neil Atkinson released under the <a href=\"https://opensource.org/licenses/MIT\">MIT License</a>" --> + <!-- +"<br>" --> + <!-- +"<br>" --> + <!-- +"<br>" --> + <!-- +"<font size=\"-2\">Rev. 10/24/2018</font>") --> } //#####################################################################// //#####################################################################// + //@aigner: !!! function tutorial() { - var theButtons = - { - cancel: { - label: "OK, got it!", - className: 'btn-danger', - callback: function(){} - }, - Feedback: { - label: "Feedback", - className: 'btn-warning', - callback: function(){sendMail("VISTOMS feedback")} - }, - Tutorial: { - label: "Tutorial", - className: 'btn-info', - callback: function(){showTutorialPage();} - } - } + <!-- var theButtons = --> + <!-- { --> + <!-- cancel: { --> + <!-- label: "OK, got it!", --> + <!-- className: 'btn-danger', --> + <!-- callback: function(){} --> + <!-- }, --> + <!-- Feedback: { --> + <!-- label: "Feedback", --> + <!-- className: 'btn-warning', --> + <!-- callback: function(){sendMail("VISTOMS feedback")} --> + <!-- }, --> + <!-- Tutorial: { --> + <!-- label: "Tutorial", --> + <!-- className: 'btn-info', --> + <!-- callback: function(){showTutorialPage();} --> + <!-- } --> + <!-- } --> - function showTutorialPage() - { - clearView(); - var tutorialDiv = d3.select("body").append("div") - .attr("id","tutorial") - .style("margin-top", "16px") - .style("font-size","16pt") - .style("margin", "20px 10px") - .style("color","#555555") + <!-- function showTutorialPage() --> + <!-- { --> + <!-- clearView(); --> + <!-- var tutorialDiv = d3.select("body").append("div") --> + <!-- .attr("id","tutorial") --> + <!-- .style("margin-top", "16px") --> + <!-- .style("font-size","16pt") --> + <!-- .style("margin", "20px 10px") --> + <!-- .style("color","#555555") --> - var theHeading = "<b>VISTOMS Tutorial</b><br/><br/>"; - tutorialDiv.append("text") - .style("font-size","16pt") - .html(theHeading) + <!-- var theHeading = "<b>VISTOMS Tutorial</b><br/><br/>"; --> + <!-- tutorialDiv.append("text") --> + <!-- .style("font-size","16pt") --> + <!-- .html(theHeading) --> - tutorialDiv.append("div") - .style("-webkit-overflow-scrolling", "touch") - .style("-webkit-text-size-adjust", "none") - .html("<video width=\"1000\" height=\"563\" controls>" - +"<source src=\"http://www.agile-project.eu/files/VISTOMS_Tutorial.mp4 \" type=\"video/mp4\">" - +"Your browser does not support the video tag." - +"</video>" - +"</div>") - } + <!-- tutorialDiv.append("div") --> + <!-- .style("-webkit-overflow-scrolling", "touch") --> + <!-- .style("-webkit-text-size-adjust", "none") --> + <!-- .html("<video width=\"1000\" height=\"563\" controls>" --> + <!-- +"<source src=\"http://www.agile-project.eu/files/VISTOMS_Tutorial.mp4 \" type=\"video/mp4\">" --> + <!-- +"Your browser does not support the video tag." --> + <!-- +"</video>" --> + <!-- +"</div>") --> + <!-- } --> - if (!d3.select(".xdsmDiv").empty()) - { - bootbox.hideAll(); - var dialog = bootbox.dialog( - { - title: 'XDSM View', - message: "<p><b>To interactively inspect the MDO system there are several options.</b></p>" - +"<ol><li>With a right-click on an edge (rhomboids on the off-diagonal) you can take a closer look at the data processed between competences.</li>" - +"<li>Click right on a competence (boxes on the diagonal) for more information, such as input/output data or a detailed tool description.</li>" - +"<li>To view the full data model, go to the \"Data model\" box and select a variable categorization. </li></ol><br />" - +"<p>To switch to another visualization (<i>Edge Bundles</i> or <i>Sankey Diagram</i>), go to the navigation bar and select a graph from the drop down menu.</p>" - +"<p>If you need more information on how to use the visualization package, click on the \"Tutorial\" button below.</p>" - +"<p><br/>Any questions or feedback? Contact the support team with the \"Feedback\" button below!</p>" - , - buttons : theButtons - }); - } - else if(!d3.select(".edgeBundlesDiv").empty()) - { - bootbox.hideAll(); - var dialog = bootbox.dialog({ - title: 'Edge Bundles View', - message: "<p><b>To interactively inspect the MDO system there are several options.</b></p>" - +"<ol><li>With a right-click on an edge (connecting lines between the competences) you can take a closer look at the data processed between those competences.</li>" - +"<li>When you hover over one of the competences with the mouse, the respective input and output connections are highlighted. Input connections are highlighted in red, output connections in green.</li>" - +"<li>Click right on a competence for more information, such as input/output data or a detailed tool description.</li>" - +"<li>To view the full data model, go to the \"Data model\" box and select a variable categorization.</li></ol><br />" - +"<p>To switch to another visualization (<i>Edge Bundles</i> or <i>Sankey Diagram</i>), go to the navigation bar and select a graph from the drop down menu.</p>" - +"<p>If you need more information on how to use the visualization package, click on the \"Tutorial\" button below.</p>" - +"<p><br/>Any questions or feedback? Contact the support team with the \"Feedback\" button below!</p>" - , - buttons: theButtons - }) - } - else if(!d3.select(".sankeyDiagramDiv").empty()) - { - bootbox.hideAll(); - var dialog = bootbox.dialog({ - title: 'Sankey Diagram', - message: "<p><b>To interactively inspect the MDO system there are several options.</b></p>" - +"<ol><li>When you hover over one of the competences with the mouse, the respective input and output connections are highlighted. Input connections are highlighted in red, output connections in green.</li>" - +"<li> With a right-click on an edge (connecting arrows between the competences) you can take a closer look at the data processed between those competences.</li>" - +"<li>Click right on a competence for more information, such as input/output data or a detailed tool description. You can also rearrange the layout by dragging the competences with the computer mouse.</li>" - +"<li>To view the full data model, go to the \"Data model\" box and select a variable categorization.</li></ol><br />" - +"<p>To switch to another visualization (<i>XDSM</i> or <i>Edge Bundles</i>), go to the navigation bar and select a graph from the drop down menu.</p>" - +"<p>If you need more information on how to use the visualization package, click on the \"Tutorial\" button below.</p>" - +"<p><br/>Any questions or feedback? Contact the support team with the \"Feedback\" button below!</p>" - , - buttons: theButtons - }) - } - else - { - showTutorialPage(); - } + <!-- if (!d3.select(".xdsmDiv").empty()) --> + <!-- { --> + <!-- bootbox.hideAll(); --> + <!-- var dialog = bootbox.dialog( --> + <!-- { --> + <!-- title: 'XDSM View', --> + <!-- message: "<p><b>To interactively inspect the MDO system there are several options.</b></p>" --> + <!-- +"<ol><li>With a right-click on an edge (rhomboids on the off-diagonal) you can take a closer look at the data processed between competences.</li>" --> + <!-- +"<li>Click right on a competence (boxes on the diagonal) for more information, such as input/output data or a detailed tool description.</li>" --> + <!-- +"<li>To view the full data model, go to the \"Data model\" box and select a variable categorization. </li></ol><br />" --> + <!-- +"<p>To switch to another visualization (<i>Edge Bundles</i> or <i>Sankey Diagram</i>), go to the navigation bar and select a graph from the drop down menu.</p>" --> + <!-- +"<p>If you need more information on how to use the visualization package, click on the \"Tutorial\" button below.</p>" --> + <!-- +"<p><br/>Any questions or feedback? Contact the support team with the \"Feedback\" button below!</p>" --> + <!-- , --> + <!-- buttons : theButtons --> + <!-- }); --> + <!-- } --> + <!-- else if(!d3.select(".edgeBundlesDiv").empty()) --> + <!-- { --> + <!-- bootbox.hideAll(); --> + <!-- var dialog = bootbox.dialog({ --> + <!-- title: 'Edge Bundles View', --> + <!-- message: "<p><b>To interactively inspect the MDO system there are several options.</b></p>" --> + <!-- +"<ol><li>With a right-click on an edge (connecting lines between the competences) you can take a closer look at the data processed between those competences.</li>" --> + <!-- +"<li>When you hover over one of the competences with the mouse, the respective input and output connections are highlighted. Input connections are highlighted in red, output connections in green.</li>" --> + <!-- +"<li>Click right on a competence for more information, such as input/output data or a detailed tool description.</li>" --> + <!-- +"<li>To view the full data model, go to the \"Data model\" box and select a variable categorization.</li></ol><br />" --> + <!-- +"<p>To switch to another visualization (<i>Edge Bundles</i> or <i>Sankey Diagram</i>), go to the navigation bar and select a graph from the drop down menu.</p>" --> + <!-- +"<p>If you need more information on how to use the visualization package, click on the \"Tutorial\" button below.</p>" --> + <!-- +"<p><br/>Any questions or feedback? Contact the support team with the \"Feedback\" button below!</p>" --> + <!-- , --> + <!-- buttons: theButtons --> + <!-- }) --> + <!-- } --> + <!-- else if(!d3.select(".sankeyDiagramDiv").empty()) --> + <!-- { --> + <!-- bootbox.hideAll(); --> + <!-- var dialog = bootbox.dialog({ --> + <!-- title: 'Sankey Diagram', --> + <!-- message: "<p><b>To interactively inspect the MDO system there are several options.</b></p>" --> + <!-- +"<ol><li>When you hover over one of the competences with the mouse, the respective input and output connections are highlighted. Input connections are highlighted in red, output connections in green.</li>" --> + <!-- +"<li> With a right-click on an edge (connecting arrows between the competences) you can take a closer look at the data processed between those competences.</li>" --> + <!-- +"<li>Click right on a competence for more information, such as input/output data or a detailed tool description. You can also rearrange the layout by dragging the competences with the computer mouse.</li>" --> + <!-- +"<li>To view the full data model, go to the \"Data model\" box and select a variable categorization.</li></ol><br />" --> + <!-- +"<p>To switch to another visualization (<i>XDSM</i> or <i>Edge Bundles</i>), go to the navigation bar and select a graph from the drop down menu.</p>" --> + <!-- +"<p>If you need more information on how to use the visualization package, click on the \"Tutorial\" button below.</p>" --> + <!-- +"<p><br/>Any questions or feedback? Contact the support team with the \"Feedback\" button below!</p>" --> + <!-- , --> + <!-- buttons: theButtons --> + <!-- }) --> + <!-- } --> + <!-- else --> + <!-- { --> + <!-- showTutorialPage(); --> + <!-- } --> } //#####################################################################// - //aigner: Send mail function - //#####################################################################// - function sendMail(mailText) - { - var link = "mailto:support@agile-project.eu" - window.location.href = link; - } - //#####################################################################// //aigner: Load entire MDO data //###############################################################################################################################################################################################################// @@ -1241,18 +1109,17 @@ { var visualizationScript = d3.select(".visualizationScript"); if (visualizationScript){visualizationScript.remove();} - var mainPage = document.getElementById("mainPage"); - if (mainPage){mainPage.remove();} - var tutorial = document.getElementById("tutorial"); - if (tutorial){tutorial.remove();} - var ackn = document.getElementById("acknowledgements"); - if (ackn){ackn.remove();} var xdsm = d3.select(".xdsmDiv"); if (xdsm){xdsm.remove();} var edgeBundles = d3.select(".edgeBundlesDiv"); if (edgeBundles){edgeBundles.remove();} var sankeyDiagram = d3.select(".sankeyDiagramDiv"); if (sankeyDiagram){sankeyDiagram.remove();} + var technologies = d3.select("#technologies"); + if (technologies){technologies.remove();} + var footer = d3.select("footer"); + if (footer){footer.remove();} + } //#####################################################################// @@ -20021,7 +19888,16 @@ } //aigner MDAO architecture options - var MDAO_architectures = ['-','unconverged-MDA','converged-MDA','MDF','IDF','unconverged-OPT','unconverged-DOE','converged-DOE'] + var MDAO_architectures = [{text:'-',value:'-'}, + {text:'Unconverged MDA',value:'unconverged-MDA'}, + {text:'Converged MDA',value:'converged-MDA'}, + {text:'Multidisciplinary Feasible (MDF)',value:'MDF'}, + {text:'Individual Discipline Feasible (IDF)',value:'IDF'}, + {text:'Unconverged Optimization',value:'unconverged-OPT'}, + {text:'Unconverged Design Of Experiments (DOE)',value:'unconverged-DOE'}, + {text:'Converged Design Of Experiments (DOE)',value:'converged-DOE'}, + {text:'Collaborative Optimization',value:'CO'}, + {text:'BLISS-2000',value:'BLISS-2000'}] var coupling_decompositions = ['-','Gauss-Seidel','Jacobi'] var DOE_methods = ['-','Full factorial design','Latin hypercube design','Monte Carlo Design'] //################################################################################################// @@ -20534,7 +20410,6 @@ { metadata = JSON.parse(JSON.stringify(aNode.metadata)); } - console.log(aNode.metadata) //aigner: Initialize sub component "general_info" if (typeof metadata.general_info == "undefined" @@ -22866,7 +22741,7 @@ set_MDAO_architecture_DOM.on("mousedown", function() { var theOptions = [] - for (var i = 0; i<MDAO_architectures.length; i++){theOptions.push({text:MDAO_architectures[i], value:MDAO_architectures[i]})} + for (var i = 0; i<MDAO_architectures.length; i++){theOptions.push({text:MDAO_architectures[i].text, value:MDAO_architectures[i].value})} bootbox.hideAll(); bootbox.prompt( { @@ -24892,9 +24767,6 @@ //d3.select(".legendDiv").moveToBack() d3.select(".dataModelDiv").moveToBack() headerDiv.moveToBack() - d3.select(".generalPaneDiv").moveToBack() - d3.select(".navigationBarDiv").moveToBack() - d3.select(".visPackDiv").moveToBack() var nodes = cluster.nodes(packageHierarchy(classes)); @@ -29375,9 +29247,6 @@ d3.select(".dataModelDiv").moveToBack() headerDiv.moveToBack() - d3.select(".generalPaneDiv").moveToBack() - d3.select(".navigationBarDiv").moveToBack() - d3.select(".visPackDiv").moveToBack() biHiSankey @@ -29398,5 +29267,4 @@ },{"d3":1}]},{},[2]); } </script> - </body> </html> diff --git a/kadmos/vistoms/vistoms.py b/kadmos/vistoms/vistoms.py index dda87a004..3a91ea9c1 100644 --- a/kadmos/vistoms/vistoms.py +++ b/kadmos/vistoms/vistoms.py @@ -333,7 +333,7 @@ def interface(debug=True, tempdir=None): False) graph.add_function_problem_roles() - if fileType == "CMDOWS files": + if fileType == "CMDOWS": file_type = "cmdows" file = graph_name + ".xml" # Save as CMDOWS file @@ -346,7 +346,7 @@ def interface(debug=True, tempdir=None): graph_check_critical=False, mpg=mpg) files.append(file_copy) - elif fileType == "KDMS files": + elif fileType == "KDMS": file_type = "kdms" file = graph_name + ".kdms" mpgfile = graph_name + "_mpg.kdms" -- GitLab