From 927fe558960207a8e5fae47ea556497c914e4e8f Mon Sep 17 00:00:00 2001 From: Brice Goglin Date: Wed, 24 May 2023 11:11:58 +0200 Subject: [PATCH] netloc: remove Doxy files still need some updates since main.doxy only includes hwloc.doxy now. The hwloc/ source directory isn't renamed to src/ (as in 1.x), not strictly required. tests/hwloc/ doesn't go back to tests either, could be nice since there's nothing else in tests/. utils/ still contains hwloc/ and lstopo/, we're fine there. Signed-off-by: Brice Goglin --- .gitignore | 13 - Makefile.am | 16 - NEWS | 1 + README | 4 +- VERSION | 1 - config/hwloc.m4 | 5 - config/hwloc_internal.m4 | 17 +- config/netloc.m4 | 102 -- configure.ac | 27 - .../android/include/private/autogen/config.h | 3 - contrib/ci.inria.fr/job-3-sonarscanner.sh | 6 +- contrib/update-my-copyright.pl | 2 +- doc/Makefile.am | 8 +- doc/README-netloc.infiniband | 85 -- doc/doxygen-config.cfg.in | 8 +- doc/hwloc.doxy | 2 +- doc/images/netloc_design.png | Bin 67547 -> 0 bytes doc/images/netloc_design.svg | 1124 ----------------- doc/images/netloc_draw.png | Bin 174669 -> 0 bytes doc/main.doxy | 1 - doc/netloc.doxy | 342 ----- include/Makefile.am | 9 +- include/netloc.h | 56 - include/netloc/utarray.h | 237 ---- include/netloc/uthash.h | 966 -------------- include/netlocscotch.h | 122 -- include/private/netloc.h | 578 --------- netloc.pc.in | 11 - netloc/Makefile.am | 87 -- netloc/architecture.c | 853 ------------- netloc/edge.c | 87 -- netloc/hwloc.c | 288 ----- netloc/mpicomm.c | 101 -- netloc/node.c | 129 -- netloc/path.c | 31 - netloc/physical_link.c | 88 -- netloc/scotch.c | 469 ------- netloc/support.c | 61 - netloc/topology.c | 598 --------- netlocscotch.pc.in | 11 - tests/Makefile.am | 3 - tests/netloc/Makefile.am | 40 - tests/netloc/data/avakas.txz | Bin 231384 -> 0 bytes tests/netloc/data/plafrim.txz | Bin 78292 -> 0 bytes tests/netloc/data/plafrim2.txz | Bin 53776 -> 0 bytes tests/netloc/data/scotch.txz | Bin 1324 -> 0 bytes tests/netloc/data/tests_draw.txt | 8 - tests/netloc/data/tests_extract.txt | 7 - tests/netloc/data/tests_mpiscotch.txt | 6 - tests/netloc/data/tests_scotch.txt | 7 - tests/netloc/tests.sh.in | 221 ---- utils/Makefile.am | 8 - utils/netloc/draw/Makefile.am | 29 - utils/netloc/draw/netloc_draw.html | 72 -- utils/netloc/draw/netloc_draw.js | 1049 --------------- utils/netloc/draw/netloc_draw_to_json.c | 628 --------- utils/netloc/draw/visdist/vis.min.css | 1 - utils/netloc/draw/visdist/vis.min.js | 47 - utils/netloc/infiniband/Makefile.am | 33 - utils/netloc/infiniband/README | 10 - .../infiniband/netloc_ib_extract_dats.c | 1120 ---------------- .../netloc/infiniband/netloc_ib_gather_raw.in | 477 ------- utils/netloc/mpi/Makefile.am | 38 - utils/netloc/mpi/netloc_mpi_find_hosts.c | 224 ---- utils/netloc/mpi/netloc_mpi_rank_file.c | 60 - utils/netloc/mpi/netloc_rank_order.c | 61 - utils/netloc/scotch/Makefile.am | 24 - utils/netloc/scotch/netlocscotch_get_arch.c | 62 - 68 files changed, 15 insertions(+), 10769 deletions(-) delete mode 100644 config/netloc.m4 delete mode 100644 doc/README-netloc.infiniband delete mode 100644 doc/images/netloc_design.png delete mode 100644 doc/images/netloc_design.svg delete mode 100644 doc/images/netloc_draw.png delete mode 100644 doc/netloc.doxy delete mode 100644 include/netloc.h delete mode 100644 include/netloc/utarray.h delete mode 100644 include/netloc/uthash.h delete mode 100644 include/netlocscotch.h delete mode 100644 include/private/netloc.h delete mode 100644 netloc.pc.in delete mode 100644 netloc/Makefile.am delete mode 100644 netloc/architecture.c delete mode 100644 netloc/edge.c delete mode 100644 netloc/hwloc.c delete mode 100644 netloc/mpicomm.c delete mode 100644 netloc/node.c delete mode 100644 netloc/path.c delete mode 100644 netloc/physical_link.c delete mode 100644 netloc/scotch.c delete mode 100644 netloc/support.c delete mode 100644 netloc/topology.c delete mode 100644 netlocscotch.pc.in delete mode 100644 tests/netloc/Makefile.am delete mode 100644 tests/netloc/data/avakas.txz delete mode 100644 tests/netloc/data/plafrim.txz delete mode 100644 tests/netloc/data/plafrim2.txz delete mode 100644 tests/netloc/data/scotch.txz delete mode 100644 tests/netloc/data/tests_draw.txt delete mode 100644 tests/netloc/data/tests_extract.txt delete mode 100644 tests/netloc/data/tests_mpiscotch.txt delete mode 100644 tests/netloc/data/tests_scotch.txt delete mode 100644 tests/netloc/tests.sh.in delete mode 100644 utils/netloc/draw/Makefile.am delete mode 100644 utils/netloc/draw/netloc_draw.html delete mode 100644 utils/netloc/draw/netloc_draw.js delete mode 100644 utils/netloc/draw/netloc_draw_to_json.c delete mode 100644 utils/netloc/draw/visdist/vis.min.css delete mode 100644 utils/netloc/draw/visdist/vis.min.js delete mode 100644 utils/netloc/infiniband/Makefile.am delete mode 100644 utils/netloc/infiniband/README delete mode 100644 utils/netloc/infiniband/netloc_ib_extract_dats.c delete mode 100644 utils/netloc/infiniband/netloc_ib_gather_raw.in delete mode 100644 utils/netloc/mpi/Makefile.am delete mode 100644 utils/netloc/mpi/netloc_mpi_find_hosts.c delete mode 100644 utils/netloc/mpi/netloc_mpi_rank_file.c delete mode 100644 utils/netloc/mpi/netloc_rank_order.c delete mode 100644 utils/netloc/scotch/Makefile.am delete mode 100644 utils/netloc/scotch/netlocscotch_get_arch.c diff --git a/.gitignore b/.gitignore index e2056dafcc..6b5ebe7f7e 100644 --- a/.gitignore +++ b/.gitignore @@ -205,19 +205,6 @@ test-suite.log /utils/lstopo/test-*.sh.log /utils/lstopo/test-*.sh.trs -/netloc.pc -/netlocscotch.pc - -/utils/netloc/infiniband/netloc_ib_gather_raw -/utils/netloc/infiniband/netloc_ib_extract_dats -/utils/netloc/draw/netloc_draw_to_json -/utils/netloc/mpi/netloc_mpi_find_hosts -/utils/netloc/mpi/netloc_mpi_rank_file -/utils/netloc/mpi/netloc_rank_order - -/tests/netloc/tests.sh -/tests/netloc/data/scotch/scotch_get_arch - /contrib/systemd/hwloc-dump-hwdata.service /contrib/misc/hwloc-tweak-osindex diff --git a/Makefile.am b/Makefile.am index 1996b4becd..05ae547add 100644 --- a/Makefile.am +++ b/Makefile.am @@ -20,9 +20,6 @@ EXTRA_DIST = \ SUBDIRS = include hwloc if HWLOC_BUILD_STANDALONE -if BUILD_NETLOC -SUBDIRS += netloc -endif SUBDIRS += utils tests contrib/systemd contrib/completion contrib/misc contrib/hwloc-ps.www # We need doc/ if HWLOC_BUILD_DOXYGEN, or during make install if HWLOC_INSTALL_DOXYGEN. # There's no INSTALL_SUBDIRS, so always enter doc/ and check HWLOC_BUILD/INSTALL_DOXYGEN there @@ -35,24 +32,12 @@ DIST_SUBDIRS = $(SUBDIRS) if HWLOC_BUILD_STANDALONE DIST_SUBDIRS += contrib/windows EXTRA_DIST += contrib/windows-cmake -if !BUILD_NETLOC -DIST_SUBDIRS += netloc -endif endif # Only install the pkg file if we're building in standalone mode (and not on Windows) if HWLOC_BUILD_STANDALONE hwlocpkgconfigdir = $(libdir)/pkgconfig hwlocpkgconfig_DATA = hwloc.pc -if BUILD_NETLOC -# JMS Need to compare hwloc.pc and netloc.pc -- I think netloc.pc is -# missing some things. -# pkgconfig_DATA += netloc.pc Disabled until the netloc API is public -EXTRA_DIST += netloc.pc -if BUILD_NETLOCSCOTCH -hwlocpkgconfig_DATA += netlocscotch.pc -endif BUILD_NETLOCSCOTCH -endif BUILD_NETLOC endif HWLOC_BUILD_STANDALONE # Only install the valgrind suppressions file if we're building in @@ -69,7 +54,6 @@ else !HWLOC_BUILD_STANDALONE dist-hook: @MKDIR_P@ \ $(distdir)/doc \ - $(distdir)/netloc \ $(distdir)/utils \ $(distdir)/tests \ $(distdir)/contrib/completion \ diff --git a/NEWS b/NEWS index 3c0e484e91..7c6fc863b7 100644 --- a/NEWS +++ b/NEWS @@ -36,6 +36,7 @@ Version 3.0.0 + lstopo has a new --osf option to tune the displaying of object attributes and units. * Removed features + + Netloc. + Importing and exporting from/to hwloc 1.x XML. + BlueGene/Q support. + Functions that were deprecated since 2.0: diff --git a/README b/README index cb632a37b0..3f88325f11 100644 --- a/README +++ b/README @@ -14,7 +14,7 @@ hwloc is actually made of two subprojects distributed together: It is described in details starting at section Hardware Locality (hwloc) Introduction. * The network-oriented companion called netloc (Network Locality), described - in details starting with section Network Locality (netloc). + in details starting with section netloc_intro. See also the Related pages tab above for links to other sections. @@ -38,7 +38,7 @@ shell$ make shell$ make install hwloc- and netloc-specific configure options and requirements are documented in -sections hwloc Installation and Netloc Installation respectively. +sections hwloc Installation and netloc_installation respectively. Also note that if you install supplemental libraries in non-standard locations, hwloc's configure script may not be able to find them without some help. You diff --git a/VERSION b/VERSION index 45750a78f6..c0aa2613d3 100644 --- a/VERSION +++ b/VERSION @@ -42,6 +42,5 @@ snapshot_version=${major}.${minor}.${release}${greek}-git # format. libhwloc_so_version=0:0:0 -libnetloc_so_version=0:0:0 # Please also update the lines in contrib/windows/libhwloc.vcxproj diff --git a/config/hwloc.m4 b/config/hwloc.m4 index 16c70b2c9a..7b2fdb8a38 100644 --- a/config/hwloc.m4 +++ b/config/hwloc.m4 @@ -1849,11 +1849,6 @@ AC_DEFUN([HWLOC_DO_AM_CONDITIONALS],[ AM_CONDITIONAL([HWLOC_HAVE_CXX], [test "x$hwloc_have_cxx" = "xyes"]) ]) hwloc_did_am_conditionals=yes - - # For backwards compatibility (i.e., packages that only call - # HWLOC_DO_AM_CONDITIONS, not NETLOC DO_AM_CONDITIONALS), we also have to - # do the netloc AM conditionals here - NETLOC_DO_AM_CONDITIONALS ])dnl #----------------------------------------------------------------------- diff --git a/config/hwloc_internal.m4 b/config/hwloc_internal.m4 index bbcbf2e6cf..9ecc7a0f05 100644 --- a/config/hwloc_internal.m4 +++ b/config/hwloc_internal.m4 @@ -410,21 +410,11 @@ EOF ]) # Only generate this if we're building the utilities - # Even the netloc library Makefile is here because - # we don't embed libnetloc yet, it's useless without tools AC_CONFIG_FILES( hwloc_config_prefix[utils/Makefile] hwloc_config_prefix[utils/hwloc/Makefile] hwloc_config_prefix[utils/lstopo/Makefile] hwloc_config_prefix[hwloc.pc] - - hwloc_config_prefix[netloc/Makefile] - hwloc_config_prefix[utils/netloc/infiniband/Makefile] - hwloc_config_prefix[utils/netloc/draw/Makefile] - hwloc_config_prefix[utils/netloc/scotch/Makefile] - hwloc_config_prefix[utils/netloc/mpi/Makefile] - hwloc_config_prefix[netloc.pc] - hwloc_config_prefix[netlocscotch.pc] ) ])dnl @@ -521,14 +511,11 @@ int foo(void) { hwloc_config_prefix[utils/hwloc/test-hwloc-dump-hwdata/test-hwloc-dump-hwdata.sh] hwloc_config_prefix[utils/lstopo/test-lstopo.sh] hwloc_config_prefix[utils/lstopo/test-lstopo-shmem.sh] - hwloc_config_prefix[utils/netloc/infiniband/netloc_ib_gather_raw] hwloc_config_prefix[contrib/hwloc-ps.www/Makefile] hwloc_config_prefix[contrib/systemd/Makefile] hwloc_config_prefix[contrib/completion/Makefile] hwloc_config_prefix[contrib/misc/Makefile] hwloc_config_prefix[contrib/windows/Makefile] - hwloc_config_prefix[tests/netloc/Makefile] - hwloc_config_prefix[tests/netloc/tests.sh] ) AC_CONFIG_COMMANDS([chmoding-scripts], [chmod +x] \ @@ -552,9 +539,7 @@ int foo(void) { hwloc_config_prefix[utils/hwloc/test-parsing-flags.sh] \ hwloc_config_prefix[utils/hwloc/test-hwloc-dump-hwdata/test-hwloc-dump-hwdata.sh] \ hwloc_config_prefix[utils/lstopo/test-lstopo.sh] \ - hwloc_config_prefix[utils/lstopo/test-lstopo-shmem.sh] \ - hwloc_config_prefix[utils/netloc/infiniband/netloc_ib_gather_raw] \ - hwloc_config_prefix[tests/netloc/tests.sh]) + hwloc_config_prefix[utils/lstopo/test-lstopo-shmem.sh]) # These links are only needed in standalone mode. It would # be nice to m4 foreach this somehow, but whenever I tried diff --git a/config/netloc.m4 b/config/netloc.m4 deleted file mode 100644 index 7c4b0025d8..0000000000 --- a/config/netloc.m4 +++ /dev/null @@ -1,102 +0,0 @@ -dnl -*- Autoconf -*- -dnl -dnl Copyright © 2014 Cisco Systems, Inc. All rights reserved. -dnl -dnl Copyright © 2014-2018 Inria. All rights reserved. -dnl See COPYING in top-level directory. - -# Main hwloc m4 macro, to be invoked by the user -# -# Expects: -# 1. Configuration prefix -# 2. What to do upon success -# 3. What to do upon failure -# 4. If non-empty, print the announcement banner -# -AC_DEFUN([NETLOC_SETUP_CORE],[ - AC_REQUIRE([HWLOC_SETUP_CORE]) - AC_REQUIRE([AC_PROG_CC]) - - AS_IF([test "x$4" != "x"], - [cat </dev/null` - MPI_LDADD=`mpicc -showme:link 2>/dev/null` - AC_SUBST(MPI_CPPFLAGS) - AC_SUBST(MPI_LDADD) - break;]) - - AC_CHECK_PROG([xz],[xz],[yes],[no]) -])dnl - -AC_DEFUN([NETLOC_DO_AM_CONDITIONALS], [ - AM_CONDITIONAL([BUILD_NETLOC], [test "$netloc_happy" = "yes"]) - AM_CONDITIONAL([BUILD_NETLOCSCOTCH], [test "x$scotch_found_headers" = "xyes"]) - AM_CONDITIONAL([BUILD_MPITOOLS], [test "x$mpi_found_headers" = "xyes"]) - AM_CONDITIONAL([FOUND_XZ], [test "x$xz" = xyes]) -])dnl diff --git a/configure.ac b/configure.ac index f1165aa0cb..d28b781866 100644 --- a/configure.ac +++ b/configure.ac @@ -133,25 +133,6 @@ AC_SUBST([libhwloc_so_name]) # Setup the hwloc core HWLOC_SETUP_CORE([], [], [AC_MSG_ERROR([Cannot build hwloc core])], [1]) -#################################################################### -# Setup the netloc API -#################################################################### - -AC_SUBST([libnetloc_so_version]) - -AC_ARG_ENABLE([netloc], - [AS_HELP_STRING([--enable-netloc], - [The Netloc functionality is enabled by default, but will be silently skipped it if cannot be built (e.g., not supported on your platform). Using --enable-netloc will cause configure to abort if Netloc cannot be build. Using --disable-netloc will cause configure to skip attempting to build netloc at all.]) - ]) - -AS_IF([test "$enable_netloc" != "no" -a "$hwloc_mode" = "standalone"], - [NETLOC_SETUP_CORE([], [], - [AS_IF([test "$enable_netloc" = "yes"], - [AC_MSG_ERROR([Cannot build netloc core])]) - ], - [1]) - ]) - #################################################################### # Version information #################################################################### @@ -198,7 +179,6 @@ EOF # Run the AM_CONDITIONALs HWLOC_DO_AM_CONDITIONALS -NETLOC_DO_AM_CONDITIONALS #################################################################### # Final output @@ -226,12 +206,6 @@ fi # Show which optional support we'll be building hwloc_xml_status=basic AS_IF([test "$hwloc_libxml2_happy" = "yes"], [hwloc_xml_status=full]) -netloc_status=no -AS_IF([test "$netloc_happy" = "yes"], [ - netlocscotch_status=without - AS_IF([test "$scotch_found_headers" = "yes"], [netlocscotch_status=with]) - netloc_status="yes ($netlocscotch_status scotch)" -]) AS_IF([test "$enable_embedded_mode" = "yes"], [hwloc_graphical_lstopo_status="no (disabled in embedded mode)"], @@ -340,7 +314,6 @@ fi cat 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 IMfLpuAIid` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - netloc_gather - - - netloc_draw - - - netloc_draw.html - - - netlocscotch_build_archnetlocscotch_build_subarch - - - topology.json - - - SCOTCH_Arch * - - - - ibraw.txt - - - - interactive topology - - - - - - Tool API Object File - UI Programs Inputs/Outputs - - - - - - topology.txt - - - netloc_extract_dats - USER ADMIN - - - - need to be root - - netloc_map - - - rank file - - - - netloc_get_resources - - - diff --git a/doc/images/netloc_draw.png b/doc/images/netloc_draw.png deleted file mode 100644 index 7d1c9f762f2f5d98fd1528f837b22ef74059a1f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174669 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 z 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 diff --git a/doc/main.doxy b/doc/main.doxy index 62d3798b1e..5c789bfac0 100644 --- a/doc/main.doxy +++ b/doc/main.doxy @@ -120,4 +120,3 @@ There is also a \#hwloc IRC channel on Libera Chat (irc.libera.chat */ \input hwloc.doxy -\input netloc.doxy diff --git a/doc/netloc.doxy b/doc/netloc.doxy deleted file mode 100644 index 9470658d8d..0000000000 --- a/doc/netloc.doxy +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Copyright © 2013-2014 University of Wisconsin-La Crosse. - * All rights reserved. - * Copyright © 2014 Cisco Systems, Inc. All rights reserved. - * - * Copyright © 2014-2018 Inria. All rights reserved. - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -/*! \page netloc_intro Network Locality (netloc) - -\htmlonly -

-\endhtmlonly - -Portable abstraction of network topologies for high-performance computing. - -The netloc documentation spans of these sections: -
    -
  • - \ref netloc_intro, this section below -
  • -
  • - \ref netloc_scotch -
  • -
- - - - -\htmlonly -
-\endhtmlonly -\section netloc_summary Netloc Summary - -The Portable Network Locality (netloc) software package provides network -topology discovery tools, and an abstract representation of those networks -topologies for a range of network types and configurations. It is provided as a -companion to the Portable Hardware Locality (hwloc) package. These two software -packages work together to provide a comprehensive view of the HPC system -topology, spanning from the processor cores in one server to the cores in -another - including the complex network(s) in between. - -Towards this end, netloc is divided into two sets of components. The first -tools are for the admin to extract the information about the topology of the -machines with topology discovery tools for each network type and discovery -technique (called readers). The second set of tools is for the user to exploit -the collected information: to display the topology or create a -topology-aware mapping of the processes of an application. - -\image html netloc_design.png -\image latex netloc_design.png "" width=9cm - - - - -\htmlonly -
-\endhtmlonly -\subsection supportednetworks Supported Networks - -For now, only InfiniBand (See \ref netloc_setup) is supported, but it is -planned to be extended very soon. - - - - -\htmlonly -
-\endhtmlonly -\section netloc_installation Netloc Installation - -The generic installation procedure for both hwloc and netloc -is described in \ref common_installation. - -Note that netloc is currently not supported on as many platforms as -the original hwloc project. -netloc is enabled by default when supported, or can be disabled -by passing \--disable-netloc to the configure command-line. - - - - -\htmlonly -
-\endhtmlonly -\section netloc_setup Setup - -To use Netloc tools, we need two steps. The first step consists in getting -information about network directly from tools distributed by manufacturers. For -Infiniband, for instance, this operation needs privileges to access to the -network device. For this step we have wrappers in Netloc that will call the -right tools with the right options. - -The second step will transform the raw files generated by manufacturer tools, -into files in a format readable by Netloc tools, and that will not depend on -network technologies. - -To be clear, let's take an example with Infiniband. This first step is handled by -\c netloc_ib_gather_raw that will call \c ibnetdiscover and \c ibroutes tools -to generate the necessary raw data files. The step has to be run by an -administrator, since the Infiniband tools need to access to the network device. - -\verbatim -shell$ netloc_ib_gather_raw --help -Usage: netloc_ib_gather_raw [options] - Dumps topology information to /ib-raw/ - Subnets are guessed from the /hwloc/ directory where - the hwloc XML exports of some nodes are stored. -Options: - --sudo - Pass sudo to internal ibnetdiscover and ibroute invocations. - Useful when the entire script cannot run as root. - --hwloc-dir - Use instead of /hwloc/ for hwloc XML exports. - --force-subnet [:]: to force the discovery - Do not guess subnets from hwloc XML exports. - Force discovery on local board port - and optionally force the subnet id - instead of reading it from the first GID. - Examples: --force-subnet mlx4_0:1 - --force-subnet fe80:0000:0000:0000:mlx4_0:1 - --ibnetdiscover /path/to/ibnetdiscover - --ibroute /path/to/ibroute - Specify exact location of programs. Default is /usr/bin/ - --sleep - Sleep for seconds between invocations of programs probing the network - --ignore-errors - Ignore errors from ibnetdiscover and ibroute, assume their outputs are ok - --force -f - Always rediscover to overwrite existing files without asking - --verbose -v - Add verbose messages - --dry-run - Do not actually run programs or modify anything - --help -h - Show this help - -shell$ ./netloc_ib_gather_raw /home/netloc/data -WARNING: Not running as root. -Using /home/netloc/data/hwloc as hwloc lstopo XML directory. - -Exporting local node hwloc XML... - Running lstopo-no-graphics... - -Found 1 subnets in hwloc directory: - Subnet fe80:0000:0000:0000 is locally accessible from board qib0 port 1. - -Looking at fe80:0000:0000:0000 (through local board qib0 port 1)... - Running ibnetdiscover... - Getting routes... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L112' LID 18... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L108' LID 20... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L102' LID 23... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L104' LID 25... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L106' LID 24... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L114' LID 22... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L116' LID 21... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L109' LID 12... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L111' LID 11... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L107' LID 13... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L103' LID 17... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L105' LID 16... - Running ibroute for switch 'QLogic 12800-180 GUID=0x00066a00e8001310 L113' LID 15... -\endverbatim - -The second step, that can be done by a regular user, is done by the tool \c -netloc_ib_extract_dats. - -\verbatim -shell$ netloc_ib_extract_dats --help -Usage: netloc_ib_extract_dats [--hwloc-dir -] - hwloc-dir can be an absolute path or a relative path from output path - -shell$ netloc_ib_extract_dats /home/netloc/data/ib-raw /home/netloc/data/netloc \ - --hwloc-dir ../hwloc -Read subnet: fe80:0000:0000:0000 -2 partitions found - 'node' - 'admin' -\endverbatim - - - - -\htmlonly -
-\endhtmlonly -\section netloc_draw Topology display - -Netloc provides a tool, \c netloc_draw.html, that displays a topology in a web -browser, by using a JSON file. - -\subsection netloc_draw_setup Generate the JSON file - -In order to display a topology, Netloc needs to generate a JSON file -corresponding to a topology. For this operation, the user must run \c -netloc_draw_to_json. - -\verbatim -shell$ netloc_draw_to_json --help -Usage: netloc_draw_to_json - -shell$ netloc_draw_to_json /home/netloc/data/netloc -\endverbatim - -The \c netloc_draw_to_json command will write a JSON file for each topology -file found in the input directory. The output files, written also in the input -directory, can be open by \c netloc_draw.html in a web browser. - -\subsection netloc_draw_tool Using netloc_draw - -Once the JSON file is opened, the rendering is generated by the Javascript vis -library for computing the position of the nodes. From the interface, it is -possible to search for a specific node, to color the nodes, to expand merged -switches, to show statistics, to export as an image... The user can interact -with the nodes by moving them. For now, there are bugs and other nodes might -move too. - -The placement of the nodes is done statically if the topology is detected as a -tree. If not, vis.js will use physics to find good positions, and it can be very -time consuming. - -\image html netloc_draw.png -\image latex netloc_draw.png "" width=15cm - - - - - - - -\page netloc_scotch Netloc with Scotch - - - -\htmlonly -
-\endhtmlonly - -Scotch is a toolbox for graph partitioning [XXX], that can do mapping between a -communication graph and an architecture. Netloc interfaces with Scotch, by -getting the topology of the machine and building the Scotch architecture. It is -also possible to directly build a mapping file that can be given to \c mpirun. - - -\htmlonly -
-\endhtmlonly -\section scotch_intro Introduction - -Scotch is able to deal architectures to represent the topology of a complete -machine. Scotch handles several types of topologies: complete graphs, -hypercubes, fat trees, meshes, torus, and random graphs. Moreover, Scotch is -able to manage parts of architectures that are called sub-architectures. Thus, -from a complete architecture, we can create a sub-architecture that will -represent the available resources of the complete machine. - - -\htmlonly -
-\endhtmlonly -\section scotch_setup Setup - -The first step in order to use Netloc tools is to discover the network. For -this task, we provide tools called netloc_gather that are wrappers to the -dedicated tools provided by the manufacturer of the network, that generate the -raw data given by the devices. This task needs privileges to access to the -network devices. Once, this task is completed, the raw data is converted in a -generic format independent to the fabric by extract_dats. Figure 1 shows how -the different modules of Netloc are linked, and what are the tools provided by -Netloc. - - -\htmlonly -
-\endhtmlonly -\section scotch_tools_api Tools and API - -When the machine is discovered and all the needed files are generated as seen -previously, a user can call the netlocscotch functions from the API and -interact with Scotch. - -\subsection netlocscotch_arch Build Scotch architectures - -Netloc provides a function to export the built topology into the Scotch format. -That will give the possibility to the user to play with the topology in Scotch. -Since Netloc matches the discovered topology with known topologies, the Scotch -architecture won’t be random graphs but known topologies also in Scotch that -will lead to optimized graph algorithms. This function is called -netlocscotch_build_arch. - -When the network topology is a tree, the topology converted by netlocscotch is -the complete topology of the machine containing intranode topologies from -hwloc. In this case, merging the two levels results in a bigger tree. For other -network topologies, the global graph created for Scotch is a generic graph -since it is not (at this moment) possible to create nested known -architectures. - -\subsection netlocscotch_subarch Build Scotch sub-architectures - -Most of the time, the user does not have access to the complete machine. He -uses a resource manager to run his application and he will gain access only to -a set of nodes. In this case getting the Scotch architecture of the complete -machine is not relevant. Fortunately, Netloc is also able to build a Scotch -sub-architecture that will contain only the available nodes. For this operation -the user needs to run a specific program, netloc_get_resources, that will -record in a file, the lists of available nodes and available cores by using MPI -and hwloc. From this file, the function netlocscotch_build_subarch will build -the Scotch sub-architecture. - -\subsection netlocscotch_mapping Mapping of processes - -A main goal in having all these data about the network topology, especially in -Scotch structures, is to help the process placement. For that, we use the -mapping of a process graph to the architecture provided by Scotch. As we have -seen previously, Netloc is able to detect the structure of the topology and -will build the adapted Scotch architecture that will be more efficient than a -random structure. - -In case, the network topology is not a tree, netlocscotch converts the complete -topology into a generic graph. The drawback in that is the Scotch graph -algorithms are less efficient. To overcome that, netlocscotch does two steps of -mapping: first it maps the processes to the nodes, and then for each node maps -the processes to the cores. We have to conduct tests to check if the method -gives better results than using a generic graph directly. - -The other input needed in Scotch is the process graph. Since we want to -optimize the placement to decrease the communication time, a good metric for -building the application graph is the amount of communications between all -pairs of processes. Studies still have to be done to choose, in the most -efficient way, what we take into account to define the amount of communications -between the number of messages, the size of messages... This information will -be transformed into a process graph. - -Once we have a good mapping computed by Scotch, we can give it to the user, or -Netloc can even generate the corresponding rank file useful to MPI. - -*/ diff --git a/include/Makefile.am b/include/Makefile.am index c9c05542d2..bc57022a15 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -10,10 +10,6 @@ if HWLOC_BUILD_STANDALONE include_HEADERS = hwloc.h -if BUILD_NETLOCSCOTCH -include_HEADERS += netloc.h netlocscotch.h -endif - include_hwlocdir = $(includedir)/hwloc include_hwloc_HEADERS = \ hwloc/bitmap.h \ @@ -47,10 +43,7 @@ noinst_HEADERS = \ private/components.h \ private/internal-components.h \ private/cpuid-x86.h \ - private/windows.h \ - private/netloc.h \ - netloc/utarray.h \ - netloc/uthash.h + private/windows.h if HWLOC_HAVE_LINUX include_hwloc_HEADERS += \ diff --git a/include/netloc.h b/include/netloc.h deleted file mode 100644 index 1eacbca18b..0000000000 --- a/include/netloc.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright © 2013-2014 Cisco Systems, Inc. All rights reserved. - * Copyright © 2013-2014 University of Wisconsin-La Crosse. - * All rights reserved. - * Copyright © 2015-2016 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#ifndef _NETLOC_H_ -#define _NETLOC_H_ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE // for asprintf -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup netloc_api Netloc API - * @{ - */ -/** - * Return codes - */ -enum { - NETLOC_SUCCESS = 0, /**< Success */ - NETLOC_ERROR = -1, /**< Error: General condition */ - NETLOC_ERROR_NOTDIR = -2, /**< Error: URI is not a directory */ - NETLOC_ERROR_NOENT = -3, /**< Error: URI is invalid, no such entry */ - NETLOC_ERROR_EMPTY = -4, /**< Error: No networks found */ - NETLOC_ERROR_MULTIPLE = -5, /**< Error: Multiple matching networks found */ - NETLOC_ERROR_NOT_IMPL = -6, /**< Error: Interface not implemented */ - NETLOC_ERROR_EXISTS = -7, /**< Error: If the entry already exists when trying to add to a lookup table */ - NETLOC_ERROR_NOT_FOUND = -8, /**< Error: No path found */ - NETLOC_ERROR_MAX = -9 /**< Error: Enum upper bound marker. No errors less than this number Will not be returned externally. */ -}; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -/** @} */ - -#endif // _NETLOC_H_ diff --git a/include/netloc/utarray.h b/include/netloc/utarray.h deleted file mode 100644 index f950973303..0000000000 --- a/include/netloc/utarray.h +++ /dev/null @@ -1,237 +0,0 @@ -/* -Copyright (c) 2008-2014, Troy D. Hanson http://troydhanson.github.com/uthash/ -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* a dynamic array implementation using macros - */ -#ifndef UTARRAY_H -#define UTARRAY_H - -#define UTARRAY_VERSION 1.9.9 - -#ifdef __GNUC__ -#define _UNUSED_ __attribute__ ((__unused__)) -#else -#define _UNUSED_ -#endif - -#include /* size_t */ -#include /* memset, etc */ -#include /* exit */ - -#ifndef oom -#define oom() exit(-1) -#endif - -typedef void (ctor_f)(void *dst, const void *src); -typedef void (dtor_f)(void *elt); -typedef void (init_f)(void *elt); -typedef struct { - size_t sz; - init_f *init; - ctor_f *copy; - dtor_f *dtor; -} UT_icd; - -typedef struct { - unsigned i,n;/* i: index of next available slot, n: num slots */ - UT_icd icd; /* initializer, copy and destructor functions */ - char *d; /* n slots of size icd->sz*/ -} UT_array; - -#define utarray_init(a,_icd) do { \ - memset(a,0,sizeof(UT_array)); \ - (a)->icd=*_icd; \ -} while(0) - -#define utarray_done(a) do { \ - if ((a)->n) { \ - if ((a)->icd.dtor) { \ - size_t _ut_i; \ - for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \ - (a)->icd.dtor(utarray_eltptr(a,_ut_i)); \ - } \ - } \ - free((a)->d); \ - } \ - (a)->n=0; \ -} while(0) - -#define utarray_new(a,_icd) do { \ - a=(UT_array*)malloc(sizeof(UT_array)); \ - utarray_init(a,_icd); \ -} while(0) - -#define utarray_free(a) do { \ - utarray_done(a); \ - free(a); \ -} while(0) - -#define utarray_reserve(a,by) do { \ - if (((a)->i+(by)) > ((a)->n)) { \ - char *utarray_tmp; \ - while(((a)->i+(by)) > ((a)->n)) { (a)->n = ((a)->n ? (2*(a)->n) : 8); } \ - utarray_tmp=(char*)realloc((a)->d, (a)->n*(a)->icd.sz); \ - if (utarray_tmp == NULL) oom(); \ - (a)->d=utarray_tmp; \ - } \ -} while(0) - -#define utarray_push_back(a,p) do { \ - utarray_reserve(a,1); \ - if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,(a)->i++), p); } \ - else { memcpy(_utarray_eltptr(a,(a)->i++), p, (a)->icd.sz); }; \ -} while(0) - -#define utarray_pop_back(a) do { \ - if ((a)->icd.dtor) { (a)->icd.dtor( _utarray_eltptr(a,--((a)->i))); } \ - else { (a)->i--; } \ -} while(0) - -#define utarray_extend_back(a) do { \ - utarray_reserve(a,1); \ - if ((a)->icd.init) { (a)->icd.init(_utarray_eltptr(a,(a)->i)); } \ - else { memset(_utarray_eltptr(a,(a)->i),0,(a)->icd.sz); } \ - (a)->i++; \ -} while(0) - -#define utarray_len(a) ((a)->i) - -#define utarray_eltptr(a,j) (((j) < (a)->i) ? _utarray_eltptr(a,j) : NULL) -#define _utarray_eltptr(a,j) ((char*)((a)->d + ((a)->icd.sz*(j) ))) - -#define utarray_insert(a,p,j) do { \ - if (j > (a)->i) utarray_resize(a,j); \ - utarray_reserve(a,1); \ - if ((j) < (a)->i) { \ - memmove( _utarray_eltptr(a,(j)+1), _utarray_eltptr(a,j), \ - ((a)->i - (j))*((a)->icd.sz)); \ - } \ - if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,j), p); } \ - else { memcpy(_utarray_eltptr(a,j), p, (a)->icd.sz); }; \ - (a)->i++; \ -} while(0) - -#define utarray_inserta(a,w,j) do { \ - if (utarray_len(w) == 0) break; \ - if (j > (a)->i) utarray_resize(a,j); \ - utarray_reserve(a,utarray_len(w)); \ - if ((j) < (a)->i) { \ - memmove(_utarray_eltptr(a,(j)+utarray_len(w)), \ - _utarray_eltptr(a,j), \ - ((a)->i - (j))*((a)->icd.sz)); \ - } \ - if ((a)->icd.copy) { \ - size_t _ut_i; \ - for(_ut_i=0;_ut_i<(w)->i;_ut_i++) { \ - (a)->icd.copy(_utarray_eltptr(a,j+_ut_i), _utarray_eltptr(w,_ut_i)); \ - } \ - } else { \ - memcpy(_utarray_eltptr(a,j), _utarray_eltptr(w,0), \ - utarray_len(w)*((a)->icd.sz)); \ - } \ - (a)->i += utarray_len(w); \ -} while(0) - -#define utarray_resize(dst,num) do { \ - size_t _ut_i; \ - if (dst->i > (size_t)(num)) { \ - if ((dst)->icd.dtor) { \ - for(_ut_i=num; _ut_i < dst->i; _ut_i++) { \ - (dst)->icd.dtor(utarray_eltptr(dst,_ut_i)); \ - } \ - } \ - } else if (dst->i < (size_t)(num)) { \ - utarray_reserve(dst,num-dst->i); \ - if ((dst)->icd.init) { \ - for(_ut_i=dst->i; _ut_i < num; _ut_i++) { \ - (dst)->icd.init(utarray_eltptr(dst,_ut_i)); \ - } \ - } else { \ - memset(_utarray_eltptr(dst,dst->i),0,(dst)->icd.sz*(num-dst->i)); \ - } \ - } \ - dst->i = num; \ -} while(0) - -#define utarray_concat(dst,src) do { \ - utarray_inserta((dst),(src),utarray_len(dst)); \ -} while(0) - -#define utarray_erase(a,pos,len) do { \ - if ((a)->icd.dtor) { \ - size_t _ut_i; \ - for(_ut_i=0; _ut_i < len; _ut_i++) { \ - (a)->icd.dtor(utarray_eltptr((a),pos+_ut_i)); \ - } \ - } \ - if ((a)->i > (pos+len)) { \ - memmove( _utarray_eltptr((a),pos), _utarray_eltptr((a),pos+len), \ - (((a)->i)-(pos+len))*((a)->icd.sz)); \ - } \ - (a)->i -= (len); \ -} while(0) - -#define utarray_renew(a,u) do { \ - if (a) utarray_clear(a); \ - else utarray_new((a),(u)); \ -} while(0) - -#define utarray_clear(a) do { \ - if ((a)->i > 0) { \ - if ((a)->icd.dtor) { \ - size_t _ut_i; \ - for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \ - (a)->icd.dtor(utarray_eltptr(a,_ut_i)); \ - } \ - } \ - (a)->i = 0; \ - } \ -} while(0) - -#define utarray_sort(a,cmp) do { \ - qsort((a)->d, (a)->i, (a)->icd.sz, cmp); \ -} while(0) - -#define utarray_find(a,v,cmp) bsearch((v),(a)->d,(a)->i,(a)->icd.sz,cmp) - -#define utarray_front(a) (((a)->i) ? (_utarray_eltptr(a,0)) : NULL) -#define utarray_next(a,e) (((e)==NULL) ? utarray_front(a) : ((((a)->i) > (utarray_eltidx(a,e)+1)) ? _utarray_eltptr(a,utarray_eltidx(a,e)+1) : NULL)) -#define utarray_prev(a,e) (((e)==NULL) ? utarray_back(a) : ((utarray_eltidx(a,e) > 0) ? _utarray_eltptr(a,utarray_eltidx(a,e)-1) : NULL)) -#define utarray_back(a) (((a)->i) ? (_utarray_eltptr(a,(a)->i-1)) : NULL) -#define utarray_eltidx(a,e) (((char*)(e) >= (char*)((a)->d)) ? (((char*)(e) - (char*)((a)->d))/(size_t)(a)->icd.sz) : (unsigned int)-1) - -/* last we pre-define a few icd for common utarrays of ints and strings */ -static void utarray_str_cpy(void *dst, const void *src) { - char **_src = (char**)src, **_dst = (char**)dst; - *_dst = (*_src == NULL) ? NULL : strdup(*_src); -} -static void utarray_str_dtor(void *elt) { - char **eltc = (char**)elt; - if (*eltc) free(*eltc); -} -static const UT_icd ut_str_icd _UNUSED_ = {sizeof(char*),NULL,utarray_str_cpy,utarray_str_dtor}; -static const UT_icd ut_int_icd _UNUSED_ = {sizeof(int),NULL,NULL,NULL}; -static const UT_icd ut_ptr_icd _UNUSED_ = {sizeof(void*),NULL,NULL,NULL}; - - -#endif /* UTARRAY_H */ diff --git a/include/netloc/uthash.h b/include/netloc/uthash.h deleted file mode 100644 index ed69c0c52e..0000000000 --- a/include/netloc/uthash.h +++ /dev/null @@ -1,966 +0,0 @@ -/* -Copyright (c) 2003-2014, Troy D. Hanson http://troydhanson.github.com/uthash/ -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef UTHASH_H -#define UTHASH_H - -#include /* memcmp,strlen */ -#include /* ptrdiff_t */ -#include /* exit() */ - -/* These macros use decltype or the earlier __typeof GNU extension. - As decltype is only available in newer compilers (VS2010 or gcc 4.3+ - when compiling c++ source) this code uses whatever method is needed - or, for VS2008 where neither is available, uses casting workarounds. */ -#if defined(_MSC_VER) /* MS compiler */ -#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ -#define DECLTYPE(x) (decltype(x)) -#else /* VS2008 or older (or VS2010 in C mode) */ -#define NO_DECLTYPE -#define DECLTYPE(x) -#endif -#elif defined(__BORLANDC__) || defined(__LCC__) || defined(__WATCOMC__) -#define NO_DECLTYPE -#define DECLTYPE(x) -#else /* GNU, Sun and other compilers */ -#define DECLTYPE(x) (__typeof(x)) -#endif - -#ifdef NO_DECLTYPE -#define DECLTYPE_ASSIGN(dst,src) \ -do { \ - char **_da_dst = (char**)(&(dst)); \ - *_da_dst = (char*)(src); \ -} while(0) -#else -#define DECLTYPE_ASSIGN(dst,src) \ -do { \ - (dst) = DECLTYPE(dst)(src); \ -} while(0) -#endif - -/* a number of the hash function use uint32_t which isn't defined on Pre VS2010 */ -#if defined(_WIN32) -#if defined(_MSC_VER) && _MSC_VER >= 1600 -#include -#elif defined(__WATCOMC__) || defined(__MINGW32__) || defined(__CYGWIN__) -#include -#else -typedef unsigned int uint32_t; -typedef unsigned char uint8_t; -#endif -#elif defined(__GNUC__) && !defined(__VXWORKS__) -#include -#else -typedef unsigned int uint32_t; -typedef unsigned char uint8_t; -#endif - -#define UTHASH_VERSION 1.9.9 - -#ifndef uthash_fatal -#define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */ -#endif -#ifndef uthash_malloc -#define uthash_malloc(sz) malloc(sz) /* malloc fcn */ -#endif -#ifndef uthash_free -#define uthash_free(ptr,sz) free(ptr) /* free fcn */ -#endif - -#ifndef uthash_noexpand_fyi -#define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ -#endif -#ifndef uthash_expand_fyi -#define uthash_expand_fyi(tbl) /* can be defined to log expands */ -#endif - -/* initial number of buckets */ -#define HASH_INITIAL_NUM_BUCKETS 32U /* initial number of buckets */ -#define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */ -#define HASH_BKT_CAPACITY_THRESH 10U /* expand when bucket count reaches */ - -/* calculate the element whose hash handle address is hhe */ -#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) - -#define HASH_FIND(hh,head,keyptr,keylen,out) \ -do { \ - out=NULL; \ - if (head != NULL) { \ - unsigned _hf_bkt,_hf_hashv; \ - HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ - if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv) != 0) { \ - HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ - keyptr,keylen,out); \ - } \ - } \ -} while (0) - -#ifdef HASH_BLOOM -#define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM) -#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL) -#define HASH_BLOOM_MAKE(tbl) \ -do { \ - (tbl)->bloom_nbits = HASH_BLOOM; \ - (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ - if (!((tbl)->bloom_bv)) { uthash_fatal( "out of memory"); } \ - memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN); \ - (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ -} while (0) - -#define HASH_BLOOM_FREE(tbl) \ -do { \ - uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ -} while (0) - -#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8U] |= (1U << ((idx)%8U))) -#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8U] & (1U << ((idx)%8U))) - -#define HASH_BLOOM_ADD(tbl,hashv) \ - HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U))) - -#define HASH_BLOOM_TEST(tbl,hashv) \ - HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U))) - -#else -#define HASH_BLOOM_MAKE(tbl) -#define HASH_BLOOM_FREE(tbl) -#define HASH_BLOOM_ADD(tbl,hashv) -#define HASH_BLOOM_TEST(tbl,hashv) (1) -#define HASH_BLOOM_BYTELEN 0U -#endif - -#define HASH_MAKE_TABLE(hh,head) \ -do { \ - (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \ - sizeof(UT_hash_table)); \ - if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \ - memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \ - (head)->hh.tbl->tail = &((head)->hh); \ - (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ - (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ - (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ - (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ - HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ - if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \ - memset((head)->hh.tbl->buckets, 0, \ - HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ - HASH_BLOOM_MAKE((head)->hh.tbl); \ - (head)->hh.tbl->signature = HASH_SIGNATURE; \ -} while(0) - -#define HASH_ADD(hh,head,fieldname,keylen_in,add) \ - HASH_ADD_KEYPTR(hh,head,&((add)->fieldname),keylen_in,add) - -#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced) \ -do { \ - replaced=NULL; \ - HASH_FIND(hh,head,&((add)->fieldname),keylen_in,replaced); \ - if (replaced!=NULL) { \ - HASH_DELETE(hh,head,replaced); \ - } \ - HASH_ADD(hh,head,fieldname,keylen_in,add); \ -} while(0) - -#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ -do { \ - unsigned _ha_bkt; \ - (add)->hh.next = NULL; \ - (add)->hh.key = (char*)(keyptr); \ - (add)->hh.keylen = (unsigned)(keylen_in); \ - if (!(head)) { \ - head = (add); \ - (head)->hh.prev = NULL; \ - HASH_MAKE_TABLE(hh,head); \ - } else { \ - (head)->hh.tbl->tail->next = (add); \ - (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \ - (head)->hh.tbl->tail = &((add)->hh); \ - } \ - (head)->hh.tbl->num_items++; \ - (add)->hh.tbl = (head)->hh.tbl; \ - HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \ - (add)->hh.hashv, _ha_bkt); \ - HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ - HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \ - HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \ - HASH_FSCK(hh,head); \ -} while(0) - -#define HASH_TO_BKT( hashv, num_bkts, bkt ) \ -do { \ - bkt = ((hashv) & ((num_bkts) - 1U)); \ -} while(0) - -/* delete "delptr" from the hash table. - * "the usual" patch-up process for the app-order doubly-linked-list. - * The use of _hd_hh_del below deserves special explanation. - * These used to be expressed using (delptr) but that led to a bug - * if someone used the same symbol for the head and deletee, like - * HASH_DELETE(hh,users,users); - * We want that to work, but by changing the head (users) below - * we were forfeiting our ability to further refer to the deletee (users) - * in the patch-up process. Solution: use scratch space to - * copy the deletee pointer, then the latter references are via that - * scratch pointer rather than through the repointed (users) symbol. - */ -#define HASH_DELETE(hh,head,delptr) \ -do { \ - struct UT_hash_handle *_hd_hh_del; \ - if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) ) { \ - uthash_free((head)->hh.tbl->buckets, \ - (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ - HASH_BLOOM_FREE((head)->hh.tbl); \ - uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ - head = NULL; \ - } else { \ - unsigned _hd_bkt; \ - _hd_hh_del = &((delptr)->hh); \ - if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) { \ - (head)->hh.tbl->tail = \ - (UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) + \ - (head)->hh.tbl->hho); \ - } \ - if ((delptr)->hh.prev != NULL) { \ - ((UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) + \ - (head)->hh.tbl->hho))->next = (delptr)->hh.next; \ - } else { \ - DECLTYPE_ASSIGN(head,(delptr)->hh.next); \ - } \ - if (_hd_hh_del->next != NULL) { \ - ((UT_hash_handle*)((ptrdiff_t)_hd_hh_del->next + \ - (head)->hh.tbl->hho))->prev = \ - _hd_hh_del->prev; \ - } \ - HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ - HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ - (head)->hh.tbl->num_items--; \ - } \ - HASH_FSCK(hh,head); \ -} while (0) - - -/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */ -#define HASH_FIND_STR(head,findstr,out) \ - HASH_FIND(hh,head,findstr,(unsigned)strlen(findstr),out) -#define HASH_ADD_STR(head,strfield,add) \ - HASH_ADD(hh,head,strfield[0],(unsigned int)strlen(add->strfield),add) -#define HASH_REPLACE_STR(head,strfield,add,replaced) \ - HASH_REPLACE(hh,head,strfield[0],(unsigned)strlen(add->strfield),add,replaced) -#define HASH_FIND_INT(head,findint,out) \ - HASH_FIND(hh,head,findint,sizeof(int),out) -#define HASH_ADD_INT(head,intfield,add) \ - HASH_ADD(hh,head,intfield,sizeof(int),add) -#define HASH_REPLACE_INT(head,intfield,add,replaced) \ - HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced) -#define HASH_FIND_PTR(head,findptr,out) \ - HASH_FIND(hh,head,findptr,sizeof(void *),out) -#define HASH_ADD_PTR(head,ptrfield,add) \ - HASH_ADD(hh,head,ptrfield,sizeof(void *),add) -#define HASH_REPLACE_PTR(head,ptrfield,add,replaced) \ - HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced) -#define HASH_DEL(head,delptr) \ - HASH_DELETE(hh,head,delptr) - -/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. - * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. - */ -#ifdef HASH_DEBUG -#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0) -#define HASH_FSCK(hh,head) \ -do { \ - struct UT_hash_handle *_thh; \ - if (head) { \ - unsigned _bkt_i; \ - unsigned _count; \ - char *_prev; \ - _count = 0; \ - for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \ - unsigned _bkt_count = 0; \ - _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ - _prev = NULL; \ - while (_thh) { \ - if (_prev != (char*)(_thh->hh_prev)) { \ - HASH_OOPS("invalid hh_prev %p, actual %p\n", \ - _thh->hh_prev, _prev ); \ - } \ - _bkt_count++; \ - _prev = (char*)(_thh); \ - _thh = _thh->hh_next; \ - } \ - _count += _bkt_count; \ - if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ - HASH_OOPS("invalid bucket count %u, actual %u\n", \ - (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ - } \ - } \ - if (_count != (head)->hh.tbl->num_items) { \ - HASH_OOPS("invalid hh item count %u, actual %u\n", \ - (head)->hh.tbl->num_items, _count ); \ - } \ - /* traverse hh in app order; check next/prev integrity, count */ \ - _count = 0; \ - _prev = NULL; \ - _thh = &(head)->hh; \ - while (_thh) { \ - _count++; \ - if (_prev !=(char*)(_thh->prev)) { \ - HASH_OOPS("invalid prev %p, actual %p\n", \ - _thh->prev, _prev ); \ - } \ - _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \ - _thh = ( _thh->next ? (UT_hash_handle*)((char*)(_thh->next) + \ - (head)->hh.tbl->hho) : NULL ); \ - } \ - if (_count != (head)->hh.tbl->num_items) { \ - HASH_OOPS("invalid app item count %u, actual %u\n", \ - (head)->hh.tbl->num_items, _count ); \ - } \ - } \ -} while (0) -#else -#define HASH_FSCK(hh,head) -#endif - -/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to - * the descriptor to which this macro is defined for tuning the hash function. - * The app can #include to get the prototype for write(2). */ -#ifdef HASH_EMIT_KEYS -#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \ -do { \ - unsigned _klen = fieldlen; \ - write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \ - write(HASH_EMIT_KEYS, keyptr, (unsigned long)fieldlen); \ -} while (0) -#else -#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) -#endif - -/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */ -#ifdef HASH_FUNCTION -#define HASH_FCN HASH_FUNCTION -#else -#define HASH_FCN HASH_JEN -#endif - -/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */ -#define HASH_BER(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _hb_keylen=(unsigned)keylen; \ - const unsigned char *_hb_key=(const unsigned char*)(key); \ - (hashv) = 0; \ - while (_hb_keylen-- != 0U) { \ - (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++; \ - } \ - bkt = (hashv) & (num_bkts-1U); \ -} while (0) - - -/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at - * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */ -#define HASH_SAX(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _sx_i; \ - const unsigned char *_hs_key=(const unsigned char*)(key); \ - hashv = 0; \ - for(_sx_i=0; _sx_i < keylen; _sx_i++) { \ - hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \ - } \ - bkt = hashv & (num_bkts-1U); \ -} while (0) -/* FNV-1a variation */ -#define HASH_FNV(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _fn_i; \ - const unsigned char *_hf_key=(const unsigned char*)(key); \ - hashv = 2166136261U; \ - for(_fn_i=0; _fn_i < keylen; _fn_i++) { \ - hashv = hashv ^ _hf_key[_fn_i]; \ - hashv = hashv * 16777619U; \ - } \ - bkt = hashv & (num_bkts-1U); \ -} while(0) - -#define HASH_OAT(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _ho_i; \ - const unsigned char *_ho_key=(const unsigned char*)(key); \ - hashv = 0; \ - for(_ho_i=0; _ho_i < keylen; _ho_i++) { \ - hashv += _ho_key[_ho_i]; \ - hashv += (hashv << 10); \ - hashv ^= (hashv >> 6); \ - } \ - hashv += (hashv << 3); \ - hashv ^= (hashv >> 11); \ - hashv += (hashv << 15); \ - bkt = hashv & (num_bkts-1U); \ -} while(0) - -#define HASH_JEN_MIX(a,b,c) \ -do { \ - a -= b; a -= c; a ^= ( c >> 13 ); \ - b -= c; b -= a; b ^= ( a << 8 ); \ - c -= a; c -= b; c ^= ( b >> 13 ); \ - a -= b; a -= c; a ^= ( c >> 12 ); \ - b -= c; b -= a; b ^= ( a << 16 ); \ - c -= a; c -= b; c ^= ( b >> 5 ); \ - a -= b; a -= c; a ^= ( c >> 3 ); \ - b -= c; b -= a; b ^= ( a << 10 ); \ - c -= a; c -= b; c ^= ( b >> 15 ); \ -} while (0) - -#define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _hj_i,_hj_j,_hj_k; \ - unsigned const char *_hj_key=(unsigned const char*)(key); \ - hashv = 0xfeedbeefu; \ - _hj_i = _hj_j = 0x9e3779b9u; \ - _hj_k = (unsigned)(keylen); \ - while (_hj_k >= 12U) { \ - _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ - + ( (unsigned)_hj_key[2] << 16 ) \ - + ( (unsigned)_hj_key[3] << 24 ) ); \ - _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ - + ( (unsigned)_hj_key[6] << 16 ) \ - + ( (unsigned)_hj_key[7] << 24 ) ); \ - hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ - + ( (unsigned)_hj_key[10] << 16 ) \ - + ( (unsigned)_hj_key[11] << 24 ) ); \ - \ - HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ - \ - _hj_key += 12; \ - _hj_k -= 12U; \ - } \ - hashv += (unsigned)(keylen); \ - switch ( _hj_k ) { \ - case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); /* FALLTHROUGH */ \ - case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); /* FALLTHROUGH */ \ - case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); /* FALLTHROUGH */ \ - case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); /* FALLTHROUGH */ \ - case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); /* FALLTHROUGH */ \ - case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); /* FALLTHROUGH */ \ - case 5: _hj_j += _hj_key[4]; /* FALLTHROUGH */ \ - case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); /* FALLTHROUGH */ \ - case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); /* FALLTHROUGH */ \ - case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); /* FALLTHROUGH */ \ - case 1: _hj_i += _hj_key[0]; \ - } \ - HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ - bkt = hashv & (num_bkts-1U); \ -} while(0) - -/* The Paul Hsieh hash function */ -#undef get16bits -#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ - || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) -#define get16bits(d) (*((const uint16_t *) (d))) -#endif - -#if !defined (get16bits) -#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ - +(uint32_t)(((const uint8_t *)(d))[0]) ) -#endif -#define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned const char *_sfh_key=(unsigned const char*)(key); \ - uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen; \ - \ - unsigned _sfh_rem = _sfh_len & 3U; \ - _sfh_len >>= 2; \ - hashv = 0xcafebabeu; \ - \ - /* Main loop */ \ - for (;_sfh_len > 0U; _sfh_len--) { \ - hashv += get16bits (_sfh_key); \ - _sfh_tmp = ((uint32_t)(get16bits (_sfh_key+2)) << 11) ^ hashv; \ - hashv = (hashv << 16) ^ _sfh_tmp; \ - _sfh_key += 2U*sizeof (uint16_t); \ - hashv += hashv >> 11; \ - } \ - \ - /* Handle end cases */ \ - switch (_sfh_rem) { \ - case 3: hashv += get16bits (_sfh_key); \ - hashv ^= hashv << 16; \ - hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)]) << 18; \ - hashv += hashv >> 11; \ - break; \ - case 2: hashv += get16bits (_sfh_key); \ - hashv ^= hashv << 11; \ - hashv += hashv >> 17; \ - break; \ - case 1: hashv += *_sfh_key; \ - hashv ^= hashv << 10; \ - hashv += hashv >> 1; \ - } \ - \ - /* Force "avalanching" of final 127 bits */ \ - hashv ^= hashv << 3; \ - hashv += hashv >> 5; \ - hashv ^= hashv << 4; \ - hashv += hashv >> 17; \ - hashv ^= hashv << 25; \ - hashv += hashv >> 6; \ - bkt = hashv & (num_bkts-1U); \ -} while(0) - -#ifdef HASH_USING_NO_STRICT_ALIASING -/* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads. - * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error. - * MurmurHash uses the faster approach only on CPU's where we know it's safe. - * - * Note the preprocessor built-in defines can be emitted using: - * - * gcc -m64 -dM -E - < /dev/null (on gcc) - * cc -## a.c (where a.c is a simple test file) (Sun Studio) - */ -#if (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86)) -#define MUR_GETBLOCK(p,i) p[i] -#else /* non intel */ -#define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 3UL) == 0UL) -#define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 3UL) == 1UL) -#define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 3UL) == 2UL) -#define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 3UL) == 3UL) -#define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL)) -#if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__)) -#define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24)) -#define MUR_TWO_TWO(p) ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16)) -#define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >> 8)) -#else /* assume little endian non-intel */ -#define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24)) -#define MUR_TWO_TWO(p) ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16)) -#define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) << 8)) -#endif -#define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) : \ - (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \ - (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) : \ - MUR_ONE_THREE(p)))) -#endif -#define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) -#define MUR_FMIX(_h) \ -do { \ - _h ^= _h >> 16; \ - _h *= 0x85ebca6bu; \ - _h ^= _h >> 13; \ - _h *= 0xc2b2ae35u; \ - _h ^= _h >> 16; \ -} while(0) - -#define HASH_MUR(key,keylen,num_bkts,hashv,bkt) \ -do { \ - const uint8_t *_mur_data = (const uint8_t*)(key); \ - const int _mur_nblocks = (int)(keylen) / 4; \ - uint32_t _mur_h1 = 0xf88D5353u; \ - uint32_t _mur_c1 = 0xcc9e2d51u; \ - uint32_t _mur_c2 = 0x1b873593u; \ - uint32_t _mur_k1 = 0; \ - const uint8_t *_mur_tail; \ - const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+(_mur_nblocks*4)); \ - int _mur_i; \ - for(_mur_i = -_mur_nblocks; _mur_i!=0; _mur_i++) { \ - _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i); \ - _mur_k1 *= _mur_c1; \ - _mur_k1 = MUR_ROTL32(_mur_k1,15); \ - _mur_k1 *= _mur_c2; \ - \ - _mur_h1 ^= _mur_k1; \ - _mur_h1 = MUR_ROTL32(_mur_h1,13); \ - _mur_h1 = (_mur_h1*5U) + 0xe6546b64u; \ - } \ - _mur_tail = (const uint8_t*)(_mur_data + (_mur_nblocks*4)); \ - _mur_k1=0; \ - switch((keylen) & 3U) { \ - case 3: _mur_k1 ^= (uint32_t)_mur_tail[2] << 16; /* FALLTHROUGH */ \ - case 2: _mur_k1 ^= (uint32_t)_mur_tail[1] << 8; /* FALLTHROUGH */ \ - case 1: _mur_k1 ^= (uint32_t)_mur_tail[0]; \ - _mur_k1 *= _mur_c1; \ - _mur_k1 = MUR_ROTL32(_mur_k1,15); \ - _mur_k1 *= _mur_c2; \ - _mur_h1 ^= _mur_k1; \ - } \ - _mur_h1 ^= (uint32_t)(keylen); \ - MUR_FMIX(_mur_h1); \ - hashv = _mur_h1; \ - bkt = hashv & (num_bkts-1U); \ -} while(0) -#endif /* HASH_USING_NO_STRICT_ALIASING */ - -/* key comparison function; return 0 if keys equal */ -#define HASH_KEYCMP(a,b,len) memcmp(a,b,(unsigned long)(len)) - -/* iterate over items in a known bucket to find desired item */ -#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \ -do { \ - if (head.hh_head != NULL) { DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); } \ - else { out=NULL; } \ - while (out != NULL) { \ - if ((out)->hh.keylen == (keylen_in)) { \ - if ((HASH_KEYCMP((out)->hh.key,keyptr,keylen_in)) == 0) { break; } \ - } \ - if ((out)->hh.hh_next != NULL) { DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,(out)->hh.hh_next)); } \ - else { out = NULL; } \ - } \ -} while(0) - -/* add an item to a bucket */ -#define HASH_ADD_TO_BKT(head,addhh) \ -do { \ - head.count++; \ - (addhh)->hh_next = head.hh_head; \ - (addhh)->hh_prev = NULL; \ - if (head.hh_head != NULL) { (head).hh_head->hh_prev = (addhh); } \ - (head).hh_head=addhh; \ - if ((head.count >= ((head.expand_mult+1U) * HASH_BKT_CAPACITY_THRESH)) \ - && ((addhh)->tbl->noexpand != 1U)) { \ - HASH_EXPAND_BUCKETS((addhh)->tbl); \ - } \ -} while(0) - -/* remove an item from a given bucket */ -#define HASH_DEL_IN_BKT(hh,head,hh_del) \ - (head).count--; \ - if ((head).hh_head == hh_del) { \ - (head).hh_head = hh_del->hh_next; \ - } \ - if (hh_del->hh_prev) { \ - hh_del->hh_prev->hh_next = hh_del->hh_next; \ - } \ - if (hh_del->hh_next) { \ - hh_del->hh_next->hh_prev = hh_del->hh_prev; \ - } - -/* Bucket expansion has the effect of doubling the number of buckets - * and redistributing the items into the new buckets. Ideally the - * items will distribute more or less evenly into the new buckets - * (the extent to which this is true is a measure of the quality of - * the hash function as it applies to the key domain). - * - * With the items distributed into more buckets, the chain length - * (item count) in each bucket is reduced. Thus by expanding buckets - * the hash keeps a bound on the chain length. This bounded chain - * length is the essence of how a hash provides constant time lookup. - * - * The calculation of tbl->ideal_chain_maxlen below deserves some - * explanation. First, keep in mind that we're calculating the ideal - * maximum chain length based on the *new* (doubled) bucket count. - * In fractions this is just n/b (n=number of items,b=new num buckets). - * Since the ideal chain length is an integer, we want to calculate - * ceil(n/b). We don't depend on floating point arithmetic in this - * hash, so to calculate ceil(n/b) with integers we could write - * - * ceil(n/b) = (n/b) + ((n%b)?1:0) - * - * and in fact a previous version of this hash did just that. - * But now we have improved things a bit by recognizing that b is - * always a power of two. We keep its base 2 log handy (call it lb), - * so now we can write this with a bit shift and logical AND: - * - * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) - * - */ -#define HASH_EXPAND_BUCKETS(tbl) \ -do { \ - unsigned _he_bkt; \ - unsigned _he_bkt_i; \ - struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ - UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ - _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ - 2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ - if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \ - memset(_he_new_buckets, 0, \ - 2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ - tbl->ideal_chain_maxlen = \ - (tbl->num_items >> (tbl->log2_num_buckets+1U)) + \ - (((tbl->num_items & ((tbl->num_buckets*2U)-1U)) != 0U) ? 1U : 0U); \ - tbl->nonideal_items = 0; \ - for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \ - { \ - _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \ - while (_he_thh != NULL) { \ - _he_hh_nxt = _he_thh->hh_next; \ - HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2U, _he_bkt); \ - _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \ - if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \ - tbl->nonideal_items++; \ - _he_newbkt->expand_mult = _he_newbkt->count / \ - tbl->ideal_chain_maxlen; \ - } \ - _he_thh->hh_prev = NULL; \ - _he_thh->hh_next = _he_newbkt->hh_head; \ - if (_he_newbkt->hh_head != NULL) { _he_newbkt->hh_head->hh_prev = \ - _he_thh; } \ - _he_newbkt->hh_head = _he_thh; \ - _he_thh = _he_hh_nxt; \ - } \ - } \ - uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ - tbl->num_buckets *= 2U; \ - tbl->log2_num_buckets++; \ - tbl->buckets = _he_new_buckets; \ - tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \ - (tbl->ineff_expands+1U) : 0U; \ - if (tbl->ineff_expands > 1U) { \ - tbl->noexpand=1; \ - uthash_noexpand_fyi(tbl); \ - } \ - uthash_expand_fyi(tbl); \ -} while(0) - - -/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ -/* Note that HASH_SORT assumes the hash handle name to be hh. - * HASH_SRT was added to allow the hash handle name to be passed in. */ -#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) -#define HASH_SRT(hh,head,cmpfcn) \ -do { \ - unsigned _hs_i; \ - unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ - struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ - if (head != NULL) { \ - _hs_insize = 1; \ - _hs_looping = 1; \ - _hs_list = &((head)->hh); \ - while (_hs_looping != 0U) { \ - _hs_p = _hs_list; \ - _hs_list = NULL; \ - _hs_tail = NULL; \ - _hs_nmerges = 0; \ - while (_hs_p != NULL) { \ - _hs_nmerges++; \ - _hs_q = _hs_p; \ - _hs_psize = 0; \ - for ( _hs_i = 0; _hs_i < _hs_insize; _hs_i++ ) { \ - _hs_psize++; \ - _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ? \ - ((void*)((char*)(_hs_q->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - if (! (_hs_q) ) { break; } \ - } \ - _hs_qsize = _hs_insize; \ - while ((_hs_psize > 0U) || ((_hs_qsize > 0U) && (_hs_q != NULL))) {\ - if (_hs_psize == 0U) { \ - _hs_e = _hs_q; \ - _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ? \ - ((void*)((char*)(_hs_q->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_qsize--; \ - } else if ( (_hs_qsize == 0U) || (_hs_q == NULL) ) { \ - _hs_e = _hs_p; \ - if (_hs_p != NULL){ \ - _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ? \ - ((void*)((char*)(_hs_p->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - } \ - _hs_psize--; \ - } else if (( \ - cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \ - DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \ - ) <= 0) { \ - _hs_e = _hs_p; \ - if (_hs_p != NULL){ \ - _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ? \ - ((void*)((char*)(_hs_p->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - } \ - _hs_psize--; \ - } else { \ - _hs_e = _hs_q; \ - _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ? \ - ((void*)((char*)(_hs_q->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_qsize--; \ - } \ - if ( _hs_tail != NULL ) { \ - _hs_tail->next = ((_hs_e != NULL) ? \ - ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \ - } else { \ - _hs_list = _hs_e; \ - } \ - if (_hs_e != NULL) { \ - _hs_e->prev = ((_hs_tail != NULL) ? \ - ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \ - } \ - _hs_tail = _hs_e; \ - } \ - _hs_p = _hs_q; \ - } \ - if (_hs_tail != NULL){ \ - _hs_tail->next = NULL; \ - } \ - if ( _hs_nmerges <= 1U ) { \ - _hs_looping=0; \ - (head)->hh.tbl->tail = _hs_tail; \ - DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ - } \ - _hs_insize *= 2U; \ - } \ - HASH_FSCK(hh,head); \ - } \ -} while (0) - -/* This function selects items from one hash into another hash. - * The end result is that the selected items have dual presence - * in both hashes. There is no copy of the items made; rather - * they are added into the new hash through a secondary hash - * hash handle that must be present in the structure. */ -#define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ -do { \ - unsigned _src_bkt, _dst_bkt; \ - void *_last_elt=NULL, *_elt; \ - UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ - ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ - if (src != NULL) { \ - for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ - for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ - _src_hh != NULL; \ - _src_hh = _src_hh->hh_next) { \ - _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ - if (cond(_elt)) { \ - _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \ - _dst_hh->key = _src_hh->key; \ - _dst_hh->keylen = _src_hh->keylen; \ - _dst_hh->hashv = _src_hh->hashv; \ - _dst_hh->prev = _last_elt; \ - _dst_hh->next = NULL; \ - if (_last_elt_hh != NULL) { _last_elt_hh->next = _elt; } \ - if (dst == NULL) { \ - DECLTYPE_ASSIGN(dst,_elt); \ - HASH_MAKE_TABLE(hh_dst,dst); \ - } else { \ - _dst_hh->tbl = (dst)->hh_dst.tbl; \ - } \ - HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ - HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh); \ - (dst)->hh_dst.tbl->num_items++; \ - _last_elt = _elt; \ - _last_elt_hh = _dst_hh; \ - } \ - } \ - } \ - } \ - HASH_FSCK(hh_dst,dst); \ -} while (0) - -#define HASH_CLEAR(hh,head) \ -do { \ - if (head != NULL) { \ - uthash_free((head)->hh.tbl->buckets, \ - (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ - HASH_BLOOM_FREE((head)->hh.tbl); \ - uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ - (head)=NULL; \ - } \ -} while(0) - -#define HASH_OVERHEAD(hh,head) \ - ((head != NULL) ? ( \ - (size_t)(((head)->hh.tbl->num_items * sizeof(UT_hash_handle)) + \ - ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket)) + \ - sizeof(UT_hash_table) + \ - (HASH_BLOOM_BYTELEN))) : 0U) - -#ifdef NO_DECLTYPE -#define HASH_ITER(hh,head,el,tmp) \ -for(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \ - (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL))) -#else -#define HASH_ITER(hh,head,el,tmp) \ -for(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL)); \ - (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL))) -#endif - -/* obtain a count of items in the hash */ -#define HASH_COUNT(head) HASH_CNT(hh,head) -#define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U) - -typedef struct UT_hash_bucket { - struct UT_hash_handle *hh_head; - unsigned count; - - /* expand_mult is normally set to 0. In this situation, the max chain length - * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If - * the bucket's chain exceeds this length, bucket expansion is triggered). - * However, setting expand_mult to a non-zero value delays bucket expansion - * (that would be triggered by additions to this particular bucket) - * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. - * (The multiplier is simply expand_mult+1). The whole idea of this - * multiplier is to reduce bucket expansions, since they are expensive, in - * situations where we know that a particular bucket tends to be overused. - * It is better to let its chain length grow to a longer yet-still-bounded - * value, than to do an O(n) bucket expansion too often. - */ - unsigned expand_mult; - -} UT_hash_bucket; - -/* random signature used only to find hash tables in external analysis */ -#define HASH_SIGNATURE 0xa0111fe1u -#define HASH_BLOOM_SIGNATURE 0xb12220f2u - -typedef struct UT_hash_table { - UT_hash_bucket *buckets; - unsigned num_buckets, log2_num_buckets; - unsigned num_items; - struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ - ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ - - /* in an ideal situation (all buckets used equally), no bucket would have - * more than ceil(#items/#buckets) items. that's the ideal chain length. */ - unsigned ideal_chain_maxlen; - - /* nonideal_items is the number of items in the hash whose chain position - * exceeds the ideal chain maxlen. these items pay the penalty for an uneven - * hash distribution; reaching them in a chain traversal takes >ideal steps */ - unsigned nonideal_items; - - /* ineffective expands occur when a bucket doubling was performed, but - * afterward, more than half the items in the hash had nonideal chain - * positions. If this happens on two consecutive expansions we inhibit any - * further expansion, as it's not helping; this happens when the hash - * function isn't a good fit for the key domain. When expansion is inhibited - * the hash will still work, albeit no longer in constant time. */ - unsigned ineff_expands, noexpand; - - uint32_t signature; /* used only to find hash tables in external analysis */ -#ifdef HASH_BLOOM - uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ - uint8_t *bloom_bv; - uint8_t bloom_nbits; -#endif - -} UT_hash_table; - -typedef struct UT_hash_handle { - struct UT_hash_table *tbl; - void *prev; /* prev element in app order */ - void *next; /* next element in app order */ - struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ - struct UT_hash_handle *hh_next; /* next hh in bucket order */ - void *key; /* ptr to enclosing struct's key */ - unsigned keylen; /* enclosing struct's key len */ - unsigned hashv; /* result of hash-fcn(key) */ -} UT_hash_handle; - -#endif /* UTHASH_H */ diff --git a/include/netlocscotch.h b/include/netlocscotch.h deleted file mode 100644 index 1381a223cc..0000000000 --- a/include/netlocscotch.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright © 2016 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#ifndef _NETLOCSCOTCH_H_ -#define _NETLOCSCOTCH_H_ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE // for asprintf -#endif - -#include -#include - -/* Includes for Scotch */ -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * A structure to represent process mapping - */ -typedef struct { - int rank; /**< Rank of the process */ - char *nodename; /**< Name of the node */ - int core; /**< Physical slot number of the core */ -} netlocscotch_core_t; - -/** - * \brief Build the Scotch architecture representing the all machine - * - * \param arch Pointer to the Scotch arch that will be built. - * - * \returns 0 on success - * \returns NETLOC_ERROR on error - */ -int netlocscotch_build_global_arch(SCOTCH_Arch *arch); - -/** - * \brief Build the Scotch architecture representing the available resources - * - * This function reads the file about available resources, found by reading the - * environment variable NETLOC_CURRENTSLOTS. The file must be generated before - * calling the program running this functions with: mpirun -np - * netloc_mpi_find_hosts - * The complete architecture is needed since the sub architecture use data from it. - * - * \param arch Pointer to the Scotch arch that will be built. - * \param subarch Pointer to the Scotch sub arch that will be built. - * - * \returns 0 on success - * \returns NETLOC_ERROR on error - */ -int netlocscotch_build_current_arch(SCOTCH_Arch *arch, SCOTCH_Arch *subarch); - -/** - * \brief Give a good mapping with Scotch from a file containing a - * communication matrix - * - * This function reads the file about available resources, found by reading the - * environment variable NETLOC_CURRENTSLOTS. The file must be generated before - * calling the program running this functions with: mpirun -np - * netloc_mpi_find_hosts - * - * An application graph is built from the communication matrix and is mapped to - * the architecture graph built from the resource file. - * - * \param[in] filename Filename of the matrix file, where the matrix is stored line - * by line with spaces between values. - * - * \param[out] pnum_processes Pointer to the integer where th number of processes - * will be written. - * - * \param[out] pcores Array of pnum_processes elements. - * - * \returns 0 on succes - * \returns NETLOC_ERROR on error - */ -int netlocscotch_get_mapping_from_comm_file(char *filename, int *pnum_processes, - netlocscotch_core_t **pcores); - -/** - * \brief Give a good mapping with Scotch from a communication matrix - * - * This function reads the file about available resources, found by reading the - * environment variable NETLOC_CURRENTSLOTS. The file must be generated before - * calling the program running this functions with: mpirun -np - * netloc_mpi_find_hosts - * - * An application graph is built from the communication matrix and is mapped to - * the architecture graph built from the resource file. - * - * \param[in] comm pointer to the lines of the matrix of communications. - * - * \param[in] num_vertices number of processes, that corresponds to the size of - * the matrix. - * - * \param[out] pcores Array of num_vertices elements. - * - * \returns 0 on success - * \returns NETLOC_ERROR on error - */ -int netlocscotch_get_mapping_from_comm_matrix(double **comm, int num_vertices, - netlocscotch_core_t **pcores); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -/** @} */ - -#endif // _NETLOC_H_ diff --git a/include/private/netloc.h b/include/private/netloc.h deleted file mode 100644 index c070c54cce..0000000000 --- a/include/private/netloc.h +++ /dev/null @@ -1,578 +0,0 @@ -/* - * Copyright © 2014 Cisco Systems, Inc. All rights reserved. - * Copyright © 2013-2014 University of Wisconsin-La Crosse. - * All rights reserved. - * Copyright © 2015-2017 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#ifndef _NETLOC_PRIVATE_H_ -#define _NETLOC_PRIVATE_H_ - -#include -#include -#include -#include -#include - -#define NETLOCFILE_VERSION 1 - -#ifdef NETLOC_SCOTCH -#include -#include -#define NETLOC_int SCOTCH_Num -#else -#define NETLOC_int int -#endif - -/* - * "Import" a few things from hwloc - */ -#define __netloc_attribute_unused __hwloc_attribute_unused -#define __netloc_attribute_malloc __hwloc_attribute_malloc -#define __netloc_attribute_const __hwloc_attribute_const -#define __netloc_attribute_pure __hwloc_attribute_pure -#define __netloc_attribute_deprecated __hwloc_attribute_deprecated -#define __netloc_attribute_may_alias __hwloc_attribute_may_alias -#define NETLOC_DECLSPEC HWLOC_DECLSPEC - - -/********************************************************************** - * Types - **********************************************************************/ - -/** - * Definitions for Comparators - * \sa These are the return values from the following functions: - * netloc_network_compare, netloc_dt_edge_t_compare, netloc_dt_node_t_compare - */ -typedef enum { - NETLOC_CMP_SAME = 0, /**< Compared as the Same */ - NETLOC_CMP_SIMILAR = -1, /**< Compared as Similar, but not the Same */ - NETLOC_CMP_DIFF = -2 /**< Compared as Different */ -} netloc_compare_type_t; - -/** - * Enumerated type for the various types of supported networks - */ -typedef enum { - NETLOC_NETWORK_TYPE_ETHERNET = 1, /**< Ethernet network */ - NETLOC_NETWORK_TYPE_INFINIBAND = 2, /**< InfiniBand network */ - NETLOC_NETWORK_TYPE_INVALID = 3 /**< Invalid network */ -} netloc_network_type_t; - -/** - * Enumerated type for the various types of supported topologies - */ -typedef enum { - NETLOC_TOPOLOGY_TYPE_INVALID = -1, /**< Invalid */ - NETLOC_TOPOLOGY_TYPE_TREE = 1, /**< Tree */ -} netloc_topology_type_t; - -/** - * Enumerated type for the various types of nodes - */ -typedef enum { - NETLOC_NODE_TYPE_HOST = 0, /**< Host (a.k.a., network addressable endpoint - e.g., MAC Address) node */ - NETLOC_NODE_TYPE_SWITCH = 1, /**< Switch node */ - NETLOC_NODE_TYPE_INVALID = 2 /**< Invalid node */ -} netloc_node_type_t; - -typedef enum { - NETLOC_ARCH_TREE = 0, /* Fat tree */ -} netloc_arch_type_t; - - -/* Pre declarations to avoid inter dependency problems */ -/** \cond IGNORE */ -struct netloc_topology_t; -typedef struct netloc_topology_t netloc_topology_t; -struct netloc_node_t; -typedef struct netloc_node_t netloc_node_t; -struct netloc_edge_t; -typedef struct netloc_edge_t netloc_edge_t; -struct netloc_physical_link_t; -typedef struct netloc_physical_link_t netloc_physical_link_t; -struct netloc_path_t; -typedef struct netloc_path_t netloc_path_t; - -struct netloc_arch_tree_t; -typedef struct netloc_arch_tree_t netloc_arch_tree_t; -struct netloc_arch_node_t; -typedef struct netloc_arch_node_t netloc_arch_node_t; -struct netloc_arch_node_slot_t; -typedef struct netloc_arch_node_slot_t netloc_arch_node_slot_t; -struct netloc_arch_t; -typedef struct netloc_arch_t netloc_arch_t; -/** \endcond */ - -/** - * \struct netloc_topology_t - * \brief Netloc Topology Context - * - * An opaque data structure used to reference a network topology. - * - * \note Must be initialized with \ref netloc_topology_construct() - */ -struct netloc_topology_t { - /** Topology path */ - char *topopath; - /** Subnet ID */ - char *subnet_id; - - /** Node List */ - netloc_node_t *nodes; /* Hash table of nodes by physical_id */ - netloc_node_t *nodesByHostname; /* Hash table of nodes by hostname */ - - netloc_physical_link_t *physical_links; /* Hash table with physcial links */ - - /** Partition List */ - UT_array *partitions; - - /** Hwloc topology List */ - char *hwlocpath; - UT_array *topos; - hwloc_topology_t *hwloc_topos; - - /** Type of the graph */ - netloc_topology_type_t type; -}; - -/** - * \brief Netloc Node Type - * - * Represents the concept of a node (a.k.a., vertex, endpoint) within a network - * graph. This could be a server or a network switch. The \ref node_type parameter - * will distinguish the exact type of node this represents in the graph. - */ -struct netloc_node_t { - UT_hash_handle hh; /* makes this structure hashable with physical_id */ - UT_hash_handle hh2; /* makes this structure hashable with hostname */ - - /** Physical ID of the node */ - char physical_id[20]; - - /** Logical ID of the node (if any) */ - int logical_id; - - /** Type of the node */ - netloc_node_type_t type; - - /* Pointer to physical_links */ - UT_array *physical_links; - - /** Description information from discovery (if any) */ - char *description; - - /** - * Application-given private data pointer. - * Initialized to NULL, and not used by the netloc library. - */ - void * userdata; - - /** Outgoing edges from this node */ - netloc_edge_t *edges; - - UT_array *subnodes; /* the group of nodes for the virtual nodes */ - - netloc_path_t *paths; - - char *hostname; - - UT_array *partitions; /* index in the list from the topology */ - - hwloc_topology_t hwlocTopo; - int hwlocTopoIdx; -}; - -/** - * \brief Netloc Edge Type - * - * Represents the concept of a directed edge within a network graph. - * - * \note We do not point to the netloc_node_t structure directly to - * simplify the representation, and allow the information to more easily - * be entered into the data store without circular references. - * \todo JJH Is the note above still true? - */ -struct netloc_edge_t { - UT_hash_handle hh; /* makes this structure hashable */ - - netloc_node_t *dest; - - int id; - - /** Pointers to the parent node */ - netloc_node_t *node; - - /* Pointer to physical_links */ - UT_array *physical_links; - - /** total gbits of the links */ - float total_gbits; - - UT_array *partitions; /* index in the list from the topology */ - - UT_array *subnode_edges; /* for edges going to virtual nodes */ - - struct netloc_edge_t *other_way; - - /** - * Application-given private data pointer. - * Initialized to NULL, and not used by the netloc library. - */ - void * userdata; -}; - - -struct netloc_physical_link_t { - UT_hash_handle hh; /* makes this structure hashable */ - - int id; // TODO long long - netloc_node_t *src; - netloc_node_t *dest; - int ports[2]; - char *width; - char *speed; - - netloc_edge_t *edge; - - int other_way_id; - struct netloc_physical_link_t *other_way; - - UT_array *partitions; /* index in the list from the topology */ - - /** gbits of the link from speed and width */ - float gbits; - - /** Description information from discovery (if any) */ - char *description; -}; - -struct netloc_path_t { - UT_hash_handle hh; /* makes this structure hashable */ - char dest_id[20]; - UT_array *links; -}; - - -/********************************************************************** - * Architecture structures - **********************************************************************/ -struct netloc_arch_tree_t { - NETLOC_int num_levels; - NETLOC_int *degrees; - NETLOC_int *cost; -}; - -struct netloc_arch_node_t { - UT_hash_handle hh; /* makes this structure hashable */ - char *name; /* Hash key */ - netloc_node_t *node; /* Corresponding node */ - int idx_in_topo; /* idx with ghost hosts to have complete topo */ - int num_slots; /* it is not the real number of slots but the maximum slot idx */ - int *slot_idx; /* corresponding idx in slot_tree */ - int *slot_os_idx; /* corresponding os index for each leaf in tree */ - netloc_arch_tree_t *slot_tree; /* Tree built from hwloc */ - int num_current_slots; /* Number of PUs */ - NETLOC_int *current_slots; /* indices in the complete tree */ - int *slot_ranks; /* corresponding MPI rank for each leaf in tree */ -}; - -struct netloc_arch_node_slot_t { - netloc_arch_node_t *node; - int slot; -}; - -struct netloc_arch_t { - netloc_topology_t *topology; - int has_slots; /* if slots are included in the architecture */ - netloc_arch_type_t type; - union { - netloc_arch_tree_t *node_tree; - netloc_arch_tree_t *global_tree; - } arch; - netloc_arch_node_t *nodes_by_name; - netloc_arch_node_slot_t *node_slot_by_idx; /* node_slot by index in complete topo */ - NETLOC_int num_current_hosts; /* if has_slots, host is a slot, else host is a node */ - NETLOC_int *current_hosts; /* indices in the complete topology */ -}; - -/********************************************************************** - * Topology Functions - **********************************************************************/ -/** - * Allocate a topology handle. - * - * User is responsible for calling \ref netloc_detach on the topology handle. - * The network parameter information is deep copied into the topology handle, so the - * user may destruct the network handle after calling this function and/or reuse - * the network handle. - * - * \returns NETLOC_SUCCESS on success - * \returns NETLOC_ERROR upon an error. - */ -netloc_topology_t *netloc_topology_construct(char *path); - -/** - * Destruct a topology handle - * - * \param topology A valid pointer to a \ref netloc_topology_t handle created - * from a prior call to \ref netloc_topology_construct. - * - * \returns NETLOC_SUCCESS on success - * \returns NETLOC_ERROR upon an error. - */ -int netloc_topology_destruct(netloc_topology_t *topology); - -int netloc_topology_find_partition_idx(netloc_topology_t *topology, char *partition_name); - -int netloc_topology_read_hwloc(netloc_topology_t *topology, int num_nodes, - netloc_node_t **node_list); - -#define netloc_topology_iter_partitions(topology,partition) \ - for ((partition) = (char **)utarray_front(topology->partitions); \ - (partition) != NULL; \ - (partition) = (char **)utarray_next(topology->partitions, partition)) - -#define netloc_topology_iter_hwloctopos(topology,hwloctopo) \ - for ((hwloctopo) = (char **)utarray_front(topology->topos); \ - (hwloctopo) != NULL; \ - (hwloctopo) = (char **)utarray_next(topology->topos, hwloctopo)) - -#define netloc_topology_find_node(topology,node_id,node) \ - HASH_FIND_STR(topology->nodes, node_id, node) - -#define netloc_topology_iter_nodes(topology,node,_tmp) \ - HASH_ITER(hh, topology->nodes, node, _tmp) - -#define netloc_topology_num_nodes(topology) \ - HASH_COUNT(topology->nodes) - -/*************************************************/ - - -/** - * Constructor for netloc_node_t - * - * User is responsible for calling the destructor on the handle. - * - * Returns - * A newly allocated pointer to the network information. - */ -netloc_node_t *netloc_node_construct(void); - -/** - * Destructor for netloc_node_t - * - * \param node A valid node handle - * - * Returns - * NETLOC_SUCCESS on success - * NETLOC_ERROR on error - */ -int netloc_node_destruct(netloc_node_t *node); - -char *netloc_node_pretty_print(netloc_node_t* node); - -#define netloc_node_get_num_subnodes(node) \ - utarray_len((node)->subnodes) - -#define netloc_node_get_subnode(node,i) \ - (*(netloc_node_t **)utarray_eltptr((node)->subnodes, (i))) - -#define netloc_node_get_num_edges(node) \ - utarray_len((node)->edges) - -#define netloc_node_get_edge(node,i) \ - (*(netloc_edge_t **)utarray_eltptr((node)->edges, (i))) - -#define netloc_node_iter_edges(node,edge,_tmp) \ - HASH_ITER(hh, node->edges, edge, _tmp) - -#define netloc_node_iter_paths(node,path,_tmp) \ - HASH_ITER(hh, node->paths, path, _tmp) - -#define netloc_node_is_host(node) \ - (node->type == NETLOC_NODE_TYPE_HOST) - -#define netloc_node_is_switch(node) \ - (node->type == NETLOC_NODE_TYPE_SWITCH) - -#define netloc_node_iter_paths(node, path,_tmp) \ - HASH_ITER(hh, node->paths, path, _tmp) - -int netloc_node_is_in_partition(netloc_node_t *node, int partition); - -/*************************************************/ - - -/** - * Constructor for netloc_edge_t - * - * User is responsible for calling the destructor on the handle. - * - * Returns - * A newly allocated pointer to the edge information. - */ -netloc_edge_t *netloc_edge_construct(void); - -/** - * Destructor for netloc_edge_t - * - * \param edge A valid edge handle - * - * Returns - * NETLOC_SUCCESS on success - * NETLOC_ERROR on error - */ -int netloc_edge_destruct(netloc_edge_t *edge); - -char * netloc_edge_pretty_print(netloc_edge_t* edge); - -void netloc_edge_reset_uid(void); - -int netloc_edge_is_in_partition(netloc_edge_t *edge, int partition); - -#define netloc_edge_get_num_links(edge) \ - utarray_len((edge)->physical_links) - -#define netloc_edge_get_link(edge,i) \ - (*(netloc_physical_link_t **)utarray_eltptr((edge)->physical_links, (i))) - -#define netloc_edge_get_num_subedges(edge) \ - utarray_len((edge)->subnode_edges) - -#define netloc_edge_get_subedge(edge,i) \ - (*(netloc_edge_t **)utarray_eltptr((edge)->subnode_edges, (i))) - -/*************************************************/ - - -/** - * Constructor for netloc_physical_link_t - * - * User is responsible for calling the destructor on the handle. - * - * Returns - * A newly allocated pointer to the physical link information. - */ -netloc_physical_link_t * netloc_physical_link_construct(void); - -/** - * Destructor for netloc_physical_link_t - * - * Returns - * NETLOC_SUCCESS on success - * NETLOC_ERROR on error - */ -int netloc_physical_link_destruct(netloc_physical_link_t *link); - -char * netloc_link_pretty_print(netloc_physical_link_t* link); - -/*************************************************/ - - -netloc_path_t *netloc_path_construct(void); -int netloc_path_destruct(netloc_path_t *path); - - -/********************************************************************** - * Architecture functions - **********************************************************************/ - -netloc_arch_t * netloc_arch_construct(void); - -int netloc_arch_destruct(netloc_arch_t *arch); - -int netloc_arch_build(netloc_arch_t *arch, int add_slots); - -int netloc_arch_set_current_resources(netloc_arch_t *arch); - -int netloc_arch_set_global_resources(netloc_arch_t *arch); - -int netloc_arch_node_get_hwloc_info(netloc_arch_node_t *arch); - -void netloc_arch_tree_complete(netloc_arch_tree_t *tree, UT_array **down_degrees_by_level, - int num_hosts, int **parch_idx); - -NETLOC_int netloc_arch_tree_num_leaves(netloc_arch_tree_t *tree); - - -/********************************************************************** - * Access functions of various elements of the topology - **********************************************************************/ - -#define netloc_get_num_partitions(object) \ - utarray_len((object)->partitions) - -#define netloc_get_partition(object,i) \ - (*(int *)utarray_eltptr((object)->partitions, (i))) - - -#define netloc_path_iter_links(path,link) \ - for ((link) = (netloc_physical_link_t **)utarray_front(path->links); \ - (link) != NULL; \ - (link) = (netloc_physical_link_t **)utarray_next(path->links, link)) - -/********************************************************************** - * Misc functions - **********************************************************************/ - -/** - * Decode the network type - * - * \param net_type A valid member of the \ref netloc_network_type_t type - * - * \returns NULL if the type is invalid - * \returns A string for that \ref netloc_network_type_t type - */ -static inline const char * netloc_network_type_decode(netloc_network_type_t net_type) { - if( NETLOC_NETWORK_TYPE_ETHERNET == net_type ) { - return "ETH"; - } - else if( NETLOC_NETWORK_TYPE_INFINIBAND == net_type ) { - return "IB"; - } - else { - return NULL; - } -} - -/** - * Decode the node type - * - * \param node_type A valid member of the \ref netloc_node_type_t type - * - * \returns NULL if the type is invalid - * \returns A string for that \ref netloc_node_type_t type - */ -static inline const char * netloc_node_type_decode(netloc_node_type_t node_type) { - if( NETLOC_NODE_TYPE_SWITCH == node_type ) { - return "SW"; - } - else if( NETLOC_NODE_TYPE_HOST == node_type ) { - return "CA"; - } - else { - return NULL; - } -} - -ssize_t netloc_line_get(char **lineptr, size_t *n, FILE *stream); - -char *netloc_line_get_next_token(char **string, char c); - -int netloc_build_comm_mat(char *filename, int *pn, double ***pmat); - -#define STRDUP_IF_NOT_NULL(str) (NULL == str ? NULL : strdup(str)) -#define STR_EMPTY_IF_NULL(str) (NULL == str ? "" : str) - - -#endif // _NETLOC_PRIVATE_H_ diff --git a/netloc.pc.in b/netloc.pc.in deleted file mode 100644 index ce9c43ef70..0000000000 --- a/netloc.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: netloc -Description: Network locality detection and management library -Version: @HWLOC_VERSION@ -Cflags: -I${includedir} -Libs: -L${libdir} -lnetloc -lhwloc -Libs.private: @LIBS@ diff --git a/netloc/Makefile.am b/netloc/Makefile.am deleted file mode 100644 index ac94d7aaab..0000000000 --- a/netloc/Makefile.am +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright © 2014 Cisco Systems, Inc. All rights reserved. -# Copyright © 2014 University of Wisconsin-La Crosse. -# All rights reserved. -# -# Copyright © 2016-2018 Inria. All rights reserved. -# See COPYING in top-level directory. -# -# $HEADER$ -# - -AM_CPPFLAGS = \ - $(NETLOC_CPPFLAGS) \ - $(HWLOC_CPPFLAGS) - -# If we're in standalone mode, build the installable library. -# Otherwise, build the embedded library. - -if HWLOC_BUILD_STANDALONE -lib_LTLIBRARIES = libnetloc.la -else -noinst_LTLIBRARIES = libnetloc_embedded.la -endif - -sources = \ - support.c \ - topology.c \ - edge.c \ - node.c \ - physical_link.c \ - path.c \ - architecture.c \ - hwloc.c \ - mpicomm.c - - -# Installable library - -libnetloc_la_SOURCES = $(sources) -libnetloc_la_LDFLAGS = $(ldflags) -version-info $(libnetloc_so_version) -libnetloc_la_LIBADD = \ - $(top_builddir)/hwloc/libhwloc.la - -# Embedded library (note the lack of a .so version number -- that -# intentionally only appears in the installable library). Also note -# the lack of _LDFLAGS -- all libs are added by the upper layer (via -# HWLOC_EMBEDDED_LIBS). - -libnetloc_embedded_la_SOURCES = $(sources) -libnetloc_embedded_la_LDFLAGS = $(ldflags) -libnetloc_embedded_la_LIBADD = \ - $(HWLOC_top_builddir)/hwloc/libhwloc_embedded.la - -scotchsources = \ - scotch.c - -if BUILD_NETLOCSCOTCH -# If we're in standalone mode, build the installable library. -# Otherwise, build the embedded library. - -if HWLOC_BUILD_STANDALONE -lib_LTLIBRARIES += libnetlocscotch.la -else -noinst_LTLIBRARIES += libnetlocscotch_embedded.la -endif - -# Installable library - -libnetlocscotch_la_SOURCES = $(scotchsources) -libnetlocscotch_la_LDFLAGS = -version-info $(libnetloc_so_version) -libnetlocscotch_la_LIBADD = \ - $(top_builddir)/hwloc/libhwloc.la \ - libnetloc.la - -# Embedded library (note the lack of a .so version number -- that -# intentionally only appears in the installable library). Also note -# the lack of _LDFLAGS -- all libs are added by the upper layer (via -# HWLOC_EMBEDDED_LIBS). - -libnetlocscotch_embedded_la_SOURCES = $(scotchsources) -libnetlocscotch_embedded_la_LDFLAGS = -libnetlocscotch_embedded_la_LIBADD = \ - $(HWLOC_top_builddir)/hwloc/libhwloc_embedded.la \ - $(HWLOC_top_builddir)/hwloc/libnetloc_embedded.la - -else !BUILD_NETLOCSCOTCH -EXTRA_DIST = $(scotchsources) -endif !BUILD_NETLOCSCOTCH diff --git a/netloc/architecture.c b/netloc/architecture.c deleted file mode 100644 index 4b1e0e16dc..0000000000 --- a/netloc/architecture.c +++ /dev/null @@ -1,853 +0,0 @@ -/* - * Copyright © 2016-2017 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include -#include - -typedef struct netloc_analysis_data_t { - int level; - void *userdata; -} netloc_analysis_data; - - -static int partition_topology_to_tleaf(netloc_topology_t *topology, - int partition, int num_cores, netloc_arch_t *arch); -static netloc_arch_tree_t *tree_merge(netloc_arch_tree_t *main, - netloc_arch_tree_t *sub); -static int netloc_arch_tree_destruct(netloc_arch_tree_t *tree); -static int netloc_arch_node_destruct(netloc_arch_node_t *arch_node); -static netloc_arch_node_t *netloc_arch_node_construct(void); - -#define checked_fscanf(f, w, str, failed) \ - if (fscanf(f, " %1023s", w) != 1) { \ - fprintf(stderr, "Cannot read %s\n", str); \ - perror("fscanf"); \ - goto ERROR; \ - } - - -/* Complete the topology to have a complete balanced tree */ -void netloc_arch_tree_complete(netloc_arch_tree_t *tree, UT_array **down_degrees_by_level, - int num_hosts, int **parch_idx) -{ - int num_levels = tree->num_levels; - NETLOC_int *max_degrees = tree->degrees; - - /* Complete the tree by inserting nodes */ - for (int l = 0; l < num_levels-1; l++) { // from the root to the leaves - int num_degrees = utarray_len(down_degrees_by_level[l]); - int *degrees = (int *)down_degrees_by_level[l]->d; - NETLOC_int max_degree = max_degrees[l]; - - unsigned int down_level_idx = 0; - UT_array *down_level_degrees = down_degrees_by_level[l+1]; - NETLOC_int down_level_max_degree = max_degrees[l+1]; - for (int d = 0; d < num_degrees; d++) { - int degree = degrees[d]; - if (degree > 0) { - down_level_idx += degree; - if (degree < max_degree) { - int missing_degree = (degree-max_degree)*down_level_max_degree; - utarray_insert(down_level_degrees, &missing_degree, down_level_idx); - down_level_idx++; - } - } else { - int missing_degree = degree*down_level_max_degree; - utarray_insert(down_level_degrees, &missing_degree, down_level_idx); - down_level_idx++; - } - } - } - - /* Indices for the list of hosts, in the complete architecture */ - int num_degrees = utarray_len(down_degrees_by_level[num_levels-1]); - int *degrees = (int *)down_degrees_by_level[num_levels-1]->d; - NETLOC_int max_degree = max_degrees[num_levels-1]; - int ghost_idx = 0; - int idx = 0; - int *arch_idx = (int *)malloc(sizeof(int[num_hosts])); - for (int d = 0; d < num_degrees; d++) { - int degree = degrees[d]; - int diff; - - if (degree > 0) { - diff = max_degree-degree; - } else { - diff = -degree; - } - - for (int i = 0; i < degree; i++) { - arch_idx[idx++] = ghost_idx++; - } - ghost_idx += diff; - } - *parch_idx = arch_idx; -} - -NETLOC_int netloc_arch_tree_num_leaves(netloc_arch_tree_t *tree) -{ - NETLOC_int num_leaves = 1; - for (int l = 0; l < tree->num_levels; l++) { - num_leaves *= tree->degrees[l]; - } - return num_leaves; -} - -static int get_current_resources(int *pnum_nodes, char ***pnodes, int **pslot_idx, - int **pslot_list, int **prank_list) -{ - char *filename = getenv("NETLOC_CURRENTSLOTS"); - char word[1024]; - char *end_word; - int *slot_list = NULL; - int *rank_list = NULL; - int *slot_idx = NULL; - char **nodes = NULL; - - if (!filename) { - fprintf(stderr, "You need to set NETLOC_CURRENTSLOTS\n"); - return NETLOC_ERROR; - } - - FILE *file = fopen(filename, "r"); - if (!file) { - perror("fopen"); - return NETLOC_ERROR; - } - - checked_fscanf(file, word, "num_nodes", failed); - - int num_nodes; - num_nodes = strtol(word, &end_word, 10); - if (*word == '\0' || *end_word != '\0' || num_nodes <= 0) { - fprintf(stderr, "Oups: incorrect number of nodes (%d) in \"%s\"\n", - num_nodes, word); - goto ERROR; - } - - nodes = (char **)malloc(sizeof(char *[num_nodes])); - for (int n = 0; n < num_nodes; n++) { - checked_fscanf(file, word, "node", failed); - nodes[n] = strdup(word); - } - - slot_idx = (int *)malloc(sizeof(int[num_nodes+1])); - slot_idx[0] = 0; - for (int n = 0; n < num_nodes; n++) { - checked_fscanf(file, word, "slot index", failed); - - int slot_index = strtol(word, &end_word, 10); - if (*word == '\0' || *end_word != '\0' || num_nodes <= 0) { - fprintf(stderr, "Oups: incorrect slot index (%d) in \"%s\"\n", - slot_index, word); - goto ERROR; - } - slot_idx[n+1] = slot_idx[n]+slot_index; - } - - slot_list = (int *)malloc(sizeof(int[slot_idx[num_nodes]])); - rank_list = (int *)malloc(sizeof(int[slot_idx[num_nodes]])); - for (int s = 0; s < slot_idx[num_nodes]; s++) { - checked_fscanf(file, word, "slot number", failed); - slot_list[s] = strtol(word, &end_word, 10); - if (*word == '\0' || *end_word != '\0' || num_nodes <= 0) { - fprintf(stderr, "Oups: incorrect slot number (%d) in \"%s\"\n", - slot_list[s], word); - goto ERROR; - } - - checked_fscanf(file, word, "rank number", failed); - rank_list[s] = strtol(word, &end_word, 10); - if (*word == '\0' || *end_word != '\0' || num_nodes <= 0) { - fprintf(stderr, "Oups: incorrect rank number (%d) in \"%s\"\n", - rank_list[s], word); - goto ERROR; - } - } - - *pnum_nodes = num_nodes; - *pnodes = nodes; - *pslot_idx = slot_idx; - *pslot_list = slot_list; - *prank_list = rank_list; - - fclose(file); - - return NETLOC_SUCCESS; - -ERROR: - fclose(file); - free(nodes); - free(slot_idx); - free(slot_list); - free(rank_list); - return NETLOC_ERROR; -} - -int netloc_arch_set_current_resources(netloc_arch_t *arch) -{ - int ret; - int num_nodes; - char **nodenames; - int *slot_idx; - int *slot_list; - int *rank_list; - - ret = get_current_resources(&num_nodes, &nodenames, &slot_idx, &slot_list, - &rank_list); - - if (ret != NETLOC_SUCCESS || num_nodes <= 0) - assert(0); // XXX - - NETLOC_int *current_nodes = NULL; - - if (!arch->has_slots) { - current_nodes = (NETLOC_int *) malloc(sizeof(NETLOC_int[num_nodes])); - } - - netloc_arch_node_t **arch_node_list = (netloc_arch_node_t **) - malloc(sizeof(netloc_arch_node_t *[num_nodes])); - netloc_node_t **node_list = (netloc_node_t **) - malloc(sizeof(netloc_node_t *[num_nodes])); - for (int n = 0; n < num_nodes; n++) { - netloc_arch_node_t *arch_node; - HASH_FIND_STR(arch->nodes_by_name, nodenames[n], arch_node); - if (!arch_node) { - ret = NETLOC_ERROR; - goto ERROR; - } - arch_node_list[n] = arch_node; - node_list[n] = arch_node->node; - } - - ret = netloc_topology_read_hwloc(arch->topology, num_nodes, node_list); - if( NETLOC_SUCCESS != ret ) { - goto ERROR; - } - - int constant_num_slots = 0; - for (int n = 0; n < num_nodes; n++) { - netloc_arch_node_t *node = arch_node_list[n]; - - ret = netloc_arch_node_get_hwloc_info(node); - if (ret != NETLOC_SUCCESS) - goto ERROR; - - - if (!arch->has_slots) { - current_nodes[n] = node->idx_in_topo; - } - - int num_slots = slot_idx[n+1]-slot_idx[n]; - node->num_current_slots = num_slots; - - /* Nodes with different number of slots are not handled yet, because we - * build the scotch architecture without taking account of the - * available cores inside nodes, and Scotch is not able to weight the - * nodes */ - if (!arch->has_slots) { - if (constant_num_slots) { - if (constant_num_slots != num_slots) { - fprintf(stderr, "Oups: the same number of cores by node is needed!\n"); - assert(constant_num_slots == num_slots); - } - } else { - constant_num_slots = num_slots; - } - } - - node->current_slots = (NETLOC_int *) - malloc(sizeof(NETLOC_int[num_slots])); - NETLOC_int num_leaves = netloc_arch_tree_num_leaves(node->slot_tree); - node->slot_ranks = (int *) - malloc(sizeof(int[num_leaves])); - - for (int s = slot_idx[n]; s < slot_idx[n+1]; s++) { - int slot = slot_list[s]; - node->current_slots[s-slot_idx[n]] = node->slot_idx[slot]; - node->slot_ranks[node->slot_idx[slot]] = rank_list[s]; - } - } - - if (!arch->has_slots) { - arch->num_current_hosts = num_nodes; - arch->current_hosts = current_nodes; - arch->arch.global_tree = arch->arch.node_tree; - - /* Build nodes_by_idx */ - NETLOC_int tree_size = netloc_arch_tree_num_leaves(arch->arch.node_tree); - netloc_arch_node_slot_t *nodes_by_idx = (netloc_arch_node_slot_t *) - malloc(sizeof(netloc_arch_node_slot_t[tree_size])); - for (int n = 0; n < num_nodes; n++) { - netloc_arch_node_t *node = arch_node_list[n]; - nodes_by_idx[node->idx_in_topo].node = node; - nodes_by_idx[node->idx_in_topo].slot = -1; - } - arch->node_slot_by_idx = nodes_by_idx; - - - } else { - int num_hosts = slot_idx[num_nodes]; - NETLOC_int *current_hosts = (NETLOC_int *) - malloc(sizeof(NETLOC_int[num_hosts])); - /* Add the slot trees to the node tree */ - - /* Check that each slot tree has the same size */ - int slot_tree_size = 0; - for (int n = 0; n < num_nodes; n++) { - netloc_arch_node_t *node = arch_node_list[n]; - int current_size = netloc_arch_tree_num_leaves(node->slot_tree); - if (!slot_tree_size) { - slot_tree_size = current_size; - } else { - if (slot_tree_size != current_size) { - assert(0); - } - } - } - - int current_host_idx = 0; - int node_tree_size = netloc_arch_tree_num_leaves(arch->arch.node_tree); - int global_tree_size = node_tree_size*slot_tree_size; - netloc_arch_node_slot_t *nodes_by_idx = (netloc_arch_node_slot_t *) - malloc(sizeof(netloc_arch_node_slot_t[global_tree_size])); - for (int n = 0; n < num_nodes; n++) { - netloc_arch_node_t *node = arch_node_list[n]; - for (int s = slot_idx[n]; s < slot_idx[n+1]; s++) { - int slot_rank = s-slot_idx[n]; - int topo_idx = node->idx_in_topo*slot_tree_size + - node->slot_idx[slot_rank]; - nodes_by_idx[topo_idx].node = node; - nodes_by_idx[topo_idx].slot = slot_rank; - current_hosts[current_host_idx++] = topo_idx; - } - } - arch->num_current_hosts = current_host_idx; - arch->current_hosts = current_hosts; - arch->node_slot_by_idx = nodes_by_idx; - - netloc_arch_tree_t *new_tree = - tree_merge(arch->arch.node_tree, arch_node_list[0]->slot_tree); - netloc_arch_tree_destruct(arch->arch.node_tree); - arch->arch.global_tree = new_tree; - } - -ERROR: - for (int n = 0; n < num_nodes; n++) { - free(nodenames[n]); - } - free(nodenames); - free(slot_idx); - free(slot_list); - free(rank_list); - free(arch_node_list); - free(node_list); - - if (ret == NETLOC_SUCCESS) - return ret; - - free(current_nodes); - return ret; -} - -int netloc_arch_set_global_resources(netloc_arch_t *arch) -{ - int ret; - NETLOC_int *current_nodes = NULL; - int *slot_idx = NULL; - - int num_nodes = HASH_COUNT(arch->nodes_by_name); - if (!arch->has_slots) { - current_nodes = (NETLOC_int *) malloc(sizeof(NETLOC_int[num_nodes])); - } - - ret = netloc_topology_read_hwloc(arch->topology, 0, NULL); - if( NETLOC_SUCCESS != ret ) { - goto ERROR; - } - - int constant_num_slots = 0; - slot_idx = (int *)malloc(sizeof(int[num_nodes+1])); - slot_idx[0] = 0; - int current_idx = 0; - netloc_arch_node_t *node, *node_tmp; - HASH_ITER(hh, arch->nodes_by_name, node, node_tmp) { - ret = netloc_arch_node_get_hwloc_info(node); - if (ret != NETLOC_SUCCESS) - goto ERROR; - - if (!arch->has_slots) { - current_nodes[current_idx] = node->idx_in_topo; - } - current_idx++; - - int num_slots = node->num_slots; - node->num_current_slots = num_slots; - - slot_idx[current_idx] = slot_idx[current_idx-1]+num_slots; - - /* Nodes with different number of slots are not handled yet, because we - * build the scotch architecture without taking account of the - * available cores inside nodes, and Scotch is not able to weight the - * nodes */ - if (!arch->has_slots) { - if (constant_num_slots) { - if (constant_num_slots != num_slots) { - fprintf(stderr, "Oups: the same number of cores by node is needed!\n"); - assert(constant_num_slots == num_slots); - } - } else { - constant_num_slots = num_slots; - } - } - } - - if (!arch->has_slots) { - arch->num_current_hosts = num_nodes; - arch->current_hosts = current_nodes; - arch->arch.global_tree = arch->arch.node_tree; - - /* Build nodes_by_idx */ - int tree_size = netloc_arch_tree_num_leaves(arch->arch.node_tree); - netloc_arch_node_slot_t *nodes_by_idx = (netloc_arch_node_slot_t *) - malloc(sizeof(netloc_arch_node_slot_t[tree_size])); - netloc_arch_node_t *node, *node_tmp; - HASH_ITER(hh, arch->nodes_by_name, node, node_tmp) { - nodes_by_idx[node->idx_in_topo].node = node; - nodes_by_idx[node->idx_in_topo].slot = -1; - } - arch->node_slot_by_idx = nodes_by_idx; - - - } else { - int num_hosts = slot_idx[num_nodes]; - NETLOC_int *current_hosts = (NETLOC_int *) - malloc(sizeof(NETLOC_int[num_hosts])); - netloc_arch_node_t *node, *node_tmp; - /* Add the slot trees to the node tree */ - - /* Check that each slot tree has the same size */ - int slot_tree_size = 0; - HASH_ITER(hh, arch->nodes_by_name, node, node_tmp) { - int current_size = netloc_arch_tree_num_leaves(node->slot_tree); - if (!slot_tree_size) { - slot_tree_size = current_size; - } else { - if (slot_tree_size != current_size) { - assert(0); - } - } - } - - int current_host_idx = 0; - int node_tree_size = netloc_arch_tree_num_leaves(arch->arch.node_tree); - int global_tree_size = node_tree_size*slot_tree_size; - netloc_arch_node_slot_t *nodes_by_idx = (netloc_arch_node_slot_t *) - malloc(sizeof(netloc_arch_node_slot_t[global_tree_size])); - int n = 0; - HASH_ITER(hh, arch->nodes_by_name, node, node_tmp) { - for (int s = slot_idx[n]; s < slot_idx[n+1]; s++) { - int slot_rank = s-slot_idx[n]; - int topo_idx = node->idx_in_topo*slot_tree_size + - node->slot_idx[slot_rank]; - nodes_by_idx[topo_idx].node = node; - nodes_by_idx[topo_idx].slot = slot_rank; - current_hosts[current_host_idx++] = topo_idx; - } - n++; - } - arch->num_current_hosts = current_host_idx; - arch->current_hosts = current_hosts; - arch->node_slot_by_idx = nodes_by_idx; - - netloc_arch_tree_t *new_tree = - tree_merge(arch->arch.node_tree, arch->nodes_by_name->slot_tree); - netloc_arch_tree_destruct(arch->arch.node_tree); - arch->arch.global_tree = new_tree; - } - -ERROR: - free(slot_idx); - - if (ret == NETLOC_SUCCESS) - return ret; - - free(current_nodes); - return ret; -} - -netloc_arch_tree_t *tree_merge(netloc_arch_tree_t *main, netloc_arch_tree_t *sub) -{ - netloc_arch_tree_t *new_tree = (netloc_arch_tree_t *) - malloc(sizeof(netloc_arch_tree_t)); - - int num_levels = main->num_levels+sub->num_levels; - new_tree->num_levels = num_levels; - new_tree->degrees = (NETLOC_int *)malloc(sizeof(NETLOC_int[num_levels])); - new_tree->cost = (NETLOC_int *)malloc(sizeof(NETLOC_int[num_levels])); - - memcpy(new_tree->degrees, main->degrees, - main->num_levels*sizeof(*new_tree->degrees)); - memcpy(new_tree->degrees+main->num_levels, sub->degrees, - sub->num_levels*sizeof(*new_tree->degrees)); - - int out_coeff = 10; - for (int l = 0; l < main->num_levels; l++) { - new_tree->cost[l] = main->cost[l]*sub->cost[0]*out_coeff; - } - memcpy(new_tree->cost+main->num_levels, sub->cost, - sub->num_levels*sizeof(*new_tree->cost)); - - return new_tree; -} - -static int netloc_arch_tree_destruct(netloc_arch_tree_t *tree) -{ - free(tree->cost); - free(tree->degrees); - free(tree); - - return NETLOC_SUCCESS; -} - - -int partition_topology_to_tleaf(netloc_topology_t *topology, - int partition, int num_cores, netloc_arch_t *arch) -{ - int ret = 0; - UT_array *nodes; - utarray_new(nodes, &ut_ptr_icd); - - netloc_arch_tree_t *tree = (netloc_arch_tree_t *) - malloc(sizeof(netloc_arch_tree_t)); - arch->arch.node_tree = tree; - arch->type = NETLOC_ARCH_TREE; - - /* we build nodes from host list in the given partition - * and we init all the analysis data */ - netloc_node_t *node, *node_tmp; - netloc_topology_iter_nodes(topology, node, node_tmp) { - if (!netloc_node_is_in_partition(node, partition)) - continue; - void *userdata = node->userdata; - node->userdata = (void *)malloc(sizeof(netloc_analysis_data)); - netloc_analysis_data *analysis_data = (netloc_analysis_data *)node->userdata; - analysis_data->level = -1; - analysis_data->userdata = userdata; - - netloc_edge_t *edge, *edge_tmp; - netloc_node_iter_edges(node, edge, edge_tmp) { - void *userdata = edge->userdata; - edge->userdata = (void *)malloc(sizeof(netloc_analysis_data)); - netloc_analysis_data *analysis_data = (netloc_analysis_data *)edge->userdata; - analysis_data->level = -1; - analysis_data->userdata = userdata; - } - - if (netloc_node_is_host(node)) { - utarray_push_back(nodes, &node); - } - } - - /* We set the levels in the analysis data */ - /* Upward edges will have the level of the source node and downward edges - * will have -1 as level */ - int num_levels = 0; - netloc_node_t *current_node = /* pointer to one host node */ - *(void **)utarray_eltptr(nodes, 0); - while (utarray_len(nodes)) { - UT_array *new_nodes; - utarray_new(new_nodes, &ut_ptr_icd); - - for (unsigned int n = 0; n < utarray_len(nodes); n++) { - netloc_node_t *node = *(void **)utarray_eltptr(nodes, n); - netloc_analysis_data *node_data = (netloc_analysis_data *)node->userdata; - /* There is a problem, this is not a tree */ - if (node_data->level != -1 && node_data->level != num_levels) { - utarray_free(new_nodes); - ret = -1; - goto end; - } - else { - node_data->level = num_levels; - netloc_edge_t *edge, *edge_tmp; - netloc_node_iter_edges(node, edge, edge_tmp) { - if (!netloc_edge_is_in_partition(edge, partition)) - continue; - netloc_analysis_data *edge_data = (netloc_analysis_data *)edge->userdata; - - netloc_node_t *dest = edge->dest; - netloc_analysis_data *dest_data = (netloc_analysis_data *)dest->userdata; - /* If we are going back */ - if (dest_data->level != -1 && dest_data->level < num_levels) { - continue; - } - else { - if (dest_data->level != num_levels) { - edge_data->level = num_levels; - utarray_push_back(new_nodes, &dest); - } - } - } - } - } - num_levels++; - utarray_free(nodes); - nodes = new_nodes; - } - - /* We go though the tree to order the leaves and find the tree - * structure */ - UT_array *ordered_name_array = NULL; - UT_array **down_degrees_by_level = NULL; - NETLOC_int *max_down_degrees_by_level; - - utarray_new(ordered_name_array, &ut_ptr_icd); - - down_degrees_by_level = (UT_array **)malloc(num_levels*sizeof(UT_array *)); - for (int l = 0; l < num_levels; l++) { - utarray_new(down_degrees_by_level[l], &ut_int_icd); - } - max_down_degrees_by_level = (NETLOC_int *) - calloc(num_levels-1, sizeof(NETLOC_int)); - - UT_array *down_edges = NULL; - utarray_new(down_edges, &ut_ptr_icd); - netloc_edge_t *up_edge = current_node->edges; - utarray_push_back(ordered_name_array, ¤t_node); - while (1) { - if (utarray_len(down_edges)) { - netloc_edge_t *down_edge = *(void **)utarray_back(down_edges); - utarray_pop_back(down_edges); - netloc_node_t *dest_node = down_edge->dest; - if (netloc_node_is_host(dest_node)) { - utarray_push_back(ordered_name_array, &dest_node); - } - else { - netloc_edge_t *edge, *edge_tmp; - int num_edges = 0; - netloc_node_iter_edges(dest_node, edge, edge_tmp) { - if (!netloc_edge_is_in_partition(edge, partition)) - continue; - netloc_analysis_data *edge_data = (netloc_analysis_data *)edge->userdata; - int edge_level = edge_data->level; - if (edge_level == -1) { - utarray_push_back(down_edges, &edge); - num_edges++; - } - } - int level = ((netloc_analysis_data *)dest_node->userdata)->level; - utarray_push_back(down_degrees_by_level[num_levels-1-level], &num_edges); - max_down_degrees_by_level[num_levels-1-level] = - max_down_degrees_by_level[num_levels-1-level] > num_edges ? - max_down_degrees_by_level[num_levels-1-level]: num_edges; - } - } - else { - netloc_edge_t *new_up_edge = NULL; - if (!up_edge) - break; - - netloc_node_t *up_node = up_edge->dest; - netloc_edge_t *edge, *edge_tmp; - int num_edges = 0; - netloc_node_iter_edges(up_node, edge, edge_tmp) { - if (!netloc_edge_is_in_partition(edge, partition)) - continue; - netloc_analysis_data *edge_data = (netloc_analysis_data *)edge->userdata; - int edge_level = edge_data->level; - - netloc_node_t *dest_node = edge->dest; - - /* If the is the node where we are from */ - if (dest_node == up_edge->node) { - num_edges++; - continue; - } - - /* Downward edge */ - if (edge_level == -1) { - utarray_push_back(down_edges, &edge); - num_edges++; - } - /* Upward edge */ - else { - new_up_edge = edge; - } - - } - int level = ((netloc_analysis_data *)up_node->userdata)->level; - utarray_push_back(down_degrees_by_level[num_levels-1-level], &num_edges); - max_down_degrees_by_level[num_levels-1-level] = - max_down_degrees_by_level[num_levels-1-level] > num_edges ? - max_down_degrees_by_level[num_levels-1-level]: num_edges; - up_edge = new_up_edge; - } - } - - tree->num_levels = num_levels-1; - tree->degrees = max_down_degrees_by_level; - - int network_coeff = 2; - tree->cost = (NETLOC_int *)malloc(sizeof(NETLOC_int[tree->num_levels])); - tree->cost[tree->num_levels-1] = 1; - for (int i = tree->num_levels-2; i >= 0 ; i--) { - tree->cost[i] = tree->cost[i+1]*network_coeff; - } - - /* Now we have the degree of each node, so we can complete the topology to - * have a complete balanced tree as requested by the tleaf structure */ - int *arch_idx; - int num_nodes = utarray_len(ordered_name_array); - netloc_arch_tree_complete(tree, down_degrees_by_level, num_nodes, &arch_idx); - - netloc_node_t **ordered_nodes = (netloc_node_t **)ordered_name_array->d; - netloc_arch_node_t *named_nodes = NULL; - for (int i = 0; i < num_nodes; i++) { - netloc_arch_node_t *node = netloc_arch_node_construct(); - node->node = ordered_nodes[i]; - node->name = ordered_nodes[i]->hostname; - node->idx_in_topo = arch_idx[i]; - HASH_ADD_KEYPTR(hh, named_nodes, node->name, strlen(node->name), node); - } - free(arch_idx); - - arch->nodes_by_name = named_nodes; - -end: - if (nodes) - utarray_free(nodes); - - if (ordered_name_array) - utarray_free(ordered_name_array); - - if (down_degrees_by_level) { - for (int l = 0; l < num_levels; l++) { - utarray_free(down_degrees_by_level[l]); - } - free(down_degrees_by_level); - } - - if (down_edges) - utarray_free(down_edges); - - /* We copy back all userdata */ - netloc_topology_iter_nodes(topology, node, node_tmp) { - if (!netloc_node_is_in_partition(node, partition)) - continue; - netloc_analysis_data *analysis_data = (netloc_analysis_data *)node->userdata; - if (analysis_data->level == -1 && ret != -1) { - ret = -1; - printf("The node %s was not browsed\n", node->description); - } - free(analysis_data); - - netloc_edge_t *edge, *edge_tmp; - netloc_node_iter_edges(node, edge, edge_tmp) { - netloc_analysis_data *analysis_data = (netloc_analysis_data *)edge->userdata; - node->userdata = analysis_data->userdata; - free(analysis_data); - } - } - - return ret; -} - -int netloc_arch_build(netloc_arch_t *arch, int add_slots) -{ - char *partition_name = getenv("NETLOC_PARTITION"); - char *topopath = getenv("NETLOC_TOPOFILE"); - - if (!topopath) { - fprintf(stderr, "Error: you need to set NETLOC_TOPOFILE in your environment.\n"); - return NETLOC_ERROR; - } - topopath = strdup(topopath); - - netloc_topology_t *topology = netloc_topology_construct(topopath); - if (topology == NULL) { - fprintf(stderr, "Error: netloc_topology_construct failed\n"); - free(topopath); - return NETLOC_ERROR; - } - - arch->topology = topology; - arch->has_slots = add_slots; - - if (!partition_name) { - fprintf(stderr, "Error: you need to set NETLOC_PARTITION in your environment.\n"); - fprintf(stderr, "\tIt can be: "); - unsigned int num_partitions = utarray_len(topology->partitions); - for (unsigned int p = 0; p < num_partitions; p++) { - char *partition = *(char **)utarray_eltptr(topology->partitions, p); - fprintf(stderr, "%s%s", partition, p != num_partitions-1 ? ", ": "\n"); - } - return NETLOC_ERROR; - } - - int partition = - netloc_topology_find_partition_idx(topology, partition_name); - - partition_topology_to_tleaf(topology, partition, 1, arch); - - return NETLOC_SUCCESS; -} - -netloc_arch_t * netloc_arch_construct(void) -{ - netloc_arch_t *arch = (netloc_arch_t *)calloc(1, sizeof(netloc_arch_t)); - - return arch; -} - -int netloc_arch_destruct(netloc_arch_t *arch) -{ - netloc_topology_destruct(arch->topology); - - netloc_arch_node_t *node, *node_tmp; - HASH_ITER(hh, arch->nodes_by_name, node, node_tmp) { - HASH_DEL(arch->nodes_by_name, node); - netloc_arch_node_destruct(node); - } - - free(arch->arch.node_tree->degrees); - free(arch->arch.node_tree->cost); - free(arch->arch.node_tree); - free(arch->current_hosts); - free(arch->node_slot_by_idx); - - free(arch); - - return NETLOC_SUCCESS; -} - -static netloc_arch_node_t *netloc_arch_node_construct(void) -{ - netloc_arch_node_t *arch_node = (netloc_arch_node_t *) - calloc(1, sizeof(netloc_arch_node_t)); - arch_node->num_slots = -1; - - return arch_node; -} - -static int netloc_arch_node_destruct(netloc_arch_node_t *arch_node) -{ - free(arch_node->slot_idx); - free(arch_node->slot_os_idx); - if (arch_node->slot_tree) - netloc_arch_tree_destruct(arch_node->slot_tree); - free(arch_node->current_slots); - free(arch_node->slot_ranks); - free(arch_node); - - return NETLOC_SUCCESS; -} diff --git a/netloc/edge.c b/netloc/edge.c deleted file mode 100644 index 56e07a5073..0000000000 --- a/netloc/edge.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright © 2013-2014 University of Wisconsin-La Crosse. - * All rights reserved. - * Copyright © 2013 Cisco Systems, Inc. All rights reserved. - * Copyright © 2015-2016 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include - -#include -#include - -static int cur_uid = 0; - -netloc_edge_t * netloc_edge_construct(void) -{ - - netloc_edge_t *edge = NULL; - - edge = (netloc_edge_t*)malloc(sizeof(netloc_edge_t)); - if( NULL == edge ) { - return NULL; - } - - edge->id = cur_uid; - cur_uid++; - - edge->dest = NULL; - edge->node = NULL; - - utarray_new(edge->physical_links, &ut_ptr_icd); - - edge->total_gbits = 0; - - utarray_new(edge->partitions, &ut_int_icd); - - utarray_new(edge->subnode_edges, &ut_ptr_icd); - - edge->userdata = NULL; - - return edge; -} - -char * netloc_edge_pretty_print(netloc_edge_t* edge) -{ - // TODO - return "TODO"; -} - -int netloc_edge_destruct(netloc_edge_t * edge) -{ - utarray_free(edge->physical_links); - utarray_free(edge->partitions); - - for (unsigned int e = 0; e < netloc_edge_get_num_subedges(edge); e++) { - netloc_edge_t *subedge; - subedge = netloc_edge_get_subedge(edge, e); - netloc_edge_destruct(subedge); - } - utarray_free(edge->subnode_edges); - free(edge); - return NETLOC_SUCCESS; -} - -void netloc_edge_reset_uid(void) -{ - cur_uid = 0; -} - -int netloc_edge_is_in_partition(netloc_edge_t *edge, int partition) -{ - for (unsigned int i = 0; i < netloc_get_num_partitions(edge); i++) { - if (netloc_get_partition(edge, i) == partition) - return 1; - } - return NETLOC_SUCCESS; -} - - diff --git a/netloc/hwloc.c b/netloc/hwloc.c deleted file mode 100644 index 3c5b4537ee..0000000000 --- a/netloc/hwloc.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright © 2016-2018 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ - -#include -#include -#include - -#include -#include -#include - -static UT_icd topos_icd = {sizeof(hwloc_topology_t), NULL, NULL, NULL}; - -int netloc_topology_read_hwloc(netloc_topology_t *topology, int num_nodes, - netloc_node_t **node_list) -{ - int ret = 0; - int all = 0; - - char *hwloc_path; - - if (!topology->hwlocpath) { - printf("No hwloc directory recorded in the topology\n"); - return NETLOC_ERROR; - } - - if (topology->hwlocpath[0] != '/') { - char *path_tmp = strdup(topology->topopath); - asprintf(&hwloc_path, "%s/%s", dirname(path_tmp), topology->hwlocpath); - free(path_tmp); - } else { - hwloc_path = strdup(topology->hwlocpath); - } - - DIR* dir = opendir(hwloc_path); - /* Directory does not exist */ - if (!dir) { - printf("Directory (%s) to hwloc does not exist\n", hwloc_path); - free(hwloc_path); - return NETLOC_ERROR; - } - else { - closedir(dir); - } - - UT_array *hwloc_topo_names = topology->topos; - UT_array *hwloc_topos; - utarray_new(hwloc_topos, &topos_icd); - - int num_diffs = 0; - - if (!num_nodes) { - netloc_node_t *node, *node_tmp; - num_nodes = HASH_COUNT(topology->nodes); - node_list = (netloc_node_t **)malloc(sizeof(netloc_node_t *[num_nodes])); - int n = 0; - netloc_topology_iter_nodes(topology, node, node_tmp) { - node_list[n++] = node; - } - all = 1; - } - - for (int n = 0; n < num_nodes; n++) { - netloc_node_t *node = node_list[n]; - char *hwloc_file; - char *refname; - - if (netloc_node_is_switch(node)) - continue; - - /* We try to find a diff file */ - asprintf(&hwloc_file, "%s/%s.diff.xml", hwloc_path, node->hostname); - hwloc_topology_diff_t diff; - int err; - if ((err = hwloc_topology_diff_load_xml(hwloc_file, &diff, &refname)) >= 0) { - refname[strlen(refname)-4] = '\0'; - hwloc_topology_diff_destroy(diff); - num_diffs++; - } - else { - free(hwloc_file); - /* We try to find a regular file */ - asprintf(&hwloc_file, "%s/%s.xml", hwloc_path, node->hostname); - FILE *fxml; - if (!(fxml = fopen(hwloc_file, "r"))) { - printf("Missing hwloc file: %s\n", hwloc_file); - } - else - fclose(fxml); - asprintf(&refname, "%s", node->hostname); - } - - /* Add the hwloc topology */ - unsigned int t = 0; - while (t < utarray_len(hwloc_topo_names) && - strcmp(*(char **)utarray_eltptr(hwloc_topo_names, t), refname)) { - t++; - } - /* Topology not found */ - if (t == utarray_len(hwloc_topo_names)) { - utarray_push_back(hwloc_topo_names, &refname); - - /* Read the hwloc topology */ - hwloc_topology_t topology; - hwloc_topology_init(&topology); - hwloc_topology_set_flags(topology, HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED); - - char *hwloc_ref_path; - asprintf(&hwloc_ref_path, "%s/%s.xml", hwloc_path, refname); - ret = hwloc_topology_set_xml(topology, hwloc_ref_path); - free(hwloc_ref_path); - if (ret == -1) { - void *null = NULL; - utarray_push_back(hwloc_topos, &null); - fprintf(stdout, "Warning: no topology for %s\n", refname); - hwloc_topology_destroy(topology); - free(refname); free(hwloc_file); - continue; - } - - ret = hwloc_topology_set_all_types_filter(topology, HWLOC_TYPE_FILTER_KEEP_STRUCTURE); - if (ret == -1) { - fprintf(stderr, "hwloc_topology_set_all_types_filter failed\n"); - free(refname); free(hwloc_file); - goto ERROR; - } - - ret = hwloc_topology_set_io_types_filter(topology, HWLOC_TYPE_FILTER_KEEP_NONE); - if (ret == -1) { - fprintf(stderr, "hwloc_topology_set_all_types_filter failed\n"); - free(refname); free(hwloc_file); - goto ERROR; - } - - ret = hwloc_topology_load(topology); - if (ret == -1) { - fprintf(stderr, "hwloc_topology_load failed\n"); - free(refname); free(hwloc_file); - goto ERROR; - } - utarray_push_back(hwloc_topos, &topology); - } - free(refname); - free(hwloc_file); - node->hwlocTopo = *(hwloc_topology_t *)utarray_eltptr(hwloc_topos, t); - node->hwlocTopoIdx = t; - } - - if (!num_diffs) { - printf("Warning: no hwloc diff file found!\n"); - } - - topology->topos = hwloc_topo_names; - topology->hwloc_topos = (hwloc_topology_t *)hwloc_topos->d; - - printf("%d hwloc topologies found:\n", utarray_len(topology->topos)); - for (unsigned int p = 0; p < utarray_len(topology->topos); p++) { - printf("\t'%s'\n", *(char **)utarray_eltptr(topology->topos, p)); - } - - ret = NETLOC_SUCCESS; - -ERROR: - if (all) { - free(node_list); - } - free(hwloc_path); - if (ret == NETLOC_SUCCESS) - free(hwloc_topos); - else - utarray_free(hwloc_topos); - return ret; -} - -/* Set the info from hwloc of the node in the correspondig arch */ -int netloc_arch_node_get_hwloc_info(netloc_arch_node_t *arch_node) -{ - hwloc_topology_t topology = arch_node->node->hwlocTopo; - - hwloc_obj_t root = hwloc_get_root_obj(topology); - - int depth = hwloc_topology_get_depth(topology); - hwloc_obj_t first_object = root->first_child; - - UT_array **down_degrees_by_level; - NETLOC_int *max_down_degrees_by_level; - - down_degrees_by_level = (UT_array **)malloc(depth*sizeof(UT_array *)); - for (int l = 0; l < depth; l++) { - utarray_new(down_degrees_by_level[l], &ut_int_icd); - } - max_down_degrees_by_level = (NETLOC_int *) - calloc(depth-1, sizeof(NETLOC_int)); - - int level = depth-1; - hwloc_obj_t current_object = first_object; - while (level >= 1) { - int degree = 1; - /* we go through the siblings */ - while (current_object->next_sibling) { - current_object = current_object->next_sibling; - degree++; - } - /* Add the degree to the list of degrees */ - utarray_push_back(down_degrees_by_level[depth-1-level], °ree); - max_down_degrees_by_level[depth-1-level] = - max_down_degrees_by_level[depth-1-level] > degree ? - max_down_degrees_by_level[depth-1-level] : degree; - - current_object = current_object->next_cousin; - - if (!current_object) { - level--; - if (!first_object->first_child) - break; - first_object = first_object->first_child; - current_object = first_object; - } - } - - /* List of PUs */ - unsigned int max_os_index = 0; - UT_array *ordered_host_array; - int *ordered_hosts; - utarray_new(ordered_host_array, &ut_int_icd); - current_object = first_object; - while (current_object) { - max_os_index = (max_os_index >= current_object->os_index)? - max_os_index: current_object->os_index; - utarray_push_back(ordered_host_array, ¤t_object->os_index); - current_object = current_object->next_cousin; - } - ordered_hosts = (int *)ordered_host_array->d;; - - /* Weight for the edges in the tree */ - NETLOC_int *cost = (NETLOC_int *)malloc((depth-1)*sizeof(NETLOC_int)); - int level_coeff = 3; - cost[depth-2] = 1; - for (int l = depth-3; l >= 0; l--) { - cost[l] = cost[l+1]*level_coeff; - } - - netloc_arch_tree_t *tree = (netloc_arch_tree_t *) - malloc(sizeof(netloc_arch_tree_t)); - tree->num_levels = depth-1; - tree->degrees = max_down_degrees_by_level; - tree->cost = cost; - - int *arch_idx; - int num_cores = utarray_len(ordered_host_array); - netloc_arch_tree_complete(tree, down_degrees_by_level, num_cores, &arch_idx); - - int *slot_idx = (int *)malloc(sizeof(int[max_os_index+1])); - for (int i = 0; i < num_cores; i++) { - slot_idx[ordered_hosts[i]] = arch_idx[i]; - } - - int num_leaves = netloc_arch_tree_num_leaves(tree); - int *slot_os_idx = (int *)malloc(sizeof(int[num_leaves])); - for (int i = 0; i < num_cores; i++) { - slot_os_idx[arch_idx[i]] = ordered_hosts[i]; - } - free(arch_idx); - - arch_node->slot_tree = tree; - arch_node->slot_idx = slot_idx; - arch_node->slot_os_idx = slot_os_idx; - arch_node->num_slots = max_os_index+1; - - for (int l = 0; l < depth; l++) { - utarray_free(down_degrees_by_level[l]); - } - free(down_degrees_by_level); - - utarray_free(ordered_host_array); - - return NETLOC_SUCCESS; -} diff --git a/netloc/mpicomm.c b/netloc/mpicomm.c deleted file mode 100644 index dff8d7548f..0000000000 --- a/netloc/mpicomm.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright © 2016-2017 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include -#include - -#include -#include - -int netloc_build_comm_mat(char *filename, int *pn, double ***pmat) -{ - FILE *input = fopen(filename, "r"); - - if (!input ) { - perror("fopen"); - return NETLOC_ERROR; - } - char *line = NULL; - size_t linesize = 0; - - char *ptr= NULL; - int i,j; - - j = -1; - i = 0; - - /* Get the number of elements in a line to find the size of the matrix */ - netloc_line_get(&line, &linesize, input); - int n = 0; - char *remain_line = line; - while ((ptr = netloc_line_get_next_token(&remain_line, ' '))) { - if (!strlen(ptr)) - break; - n++; - } - rewind(input); - - if (!n) { - goto error; - } - - double *mat_values = (double *)malloc(sizeof(double[n*n])); - double **mat = (double **)malloc(sizeof(double *[n])); - for (int i = 0; i < n; i++) { - mat[i] = &mat_values[i*n]; - } - - while (netloc_line_get(&line, &linesize, input) != -1) { - char *remain_line = line; - j = 0; - while ((ptr = netloc_line_get_next_token(&remain_line, ' '))){ - if (!strlen(ptr)) - break; - mat[i][j] = atof(ptr); - if (mat[i][j] < 0) { - fprintf(stderr, "Warning: negative value in comm matrix " - "(mat[%d][%d] = %f)\n", i, j, mat[i][j]); - } - j++; - } - if (j != n) { - fprintf(stderr, "Error at %d %d (%d!=%d). " - "Too many columns for %s\n", i, j, j, n, filename); - goto error; - } - i++; - } - - if (i != n) { - fprintf(stderr,"Error at %d %d. Too many rows for %s\n", - i, j, filename); - goto error; - } - - fclose (input); - - *pn = n; - *pmat = mat; - - free(line); - return NETLOC_SUCCESS; - -error: - free(line); - free(mat_values); - free(mat); - *pmat = NULL; - *pn = 0; - fclose (input); - return NETLOC_ERROR; -} diff --git a/netloc/node.c b/netloc/node.c deleted file mode 100644 index e1adb3a63d..0000000000 --- a/netloc/node.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright © 2013-2014 University of Wisconsin-La Crosse. - * All rights reserved. - * Copyright © 2013 Cisco Systems, Inc. All rights reserved. - * Copyright © 2015-2017 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include - -#include -#include -#include - -static UT_icd node_physical_links_icd = { - sizeof(netloc_physical_link_t *), NULL, NULL, NULL -}; - -static UT_icd node_physical_nodes_icd = { - sizeof(netloc_node_t *), NULL, NULL, NULL -}; - -static UT_icd node_partitions_icd = { sizeof(int), NULL, NULL, NULL }; - -static int node_or_subnode_destruct(netloc_node_t * node, int is_node); - -netloc_node_t * netloc_node_construct(void) -{ - netloc_node_t *node = NULL; - - node = (netloc_node_t*)malloc(sizeof(netloc_node_t)); - if (NULL == node) { - return NULL; - } - - node->physical_id[0] = '\0'; - node->logical_id = -1; - node->type = NETLOC_NODE_TYPE_INVALID; - utarray_new(node->physical_links, &node_physical_links_icd); - node->description = NULL; - node->userdata = NULL; - node->edges = NULL; - utarray_new(node->subnodes, &node_physical_nodes_icd); - node->paths = NULL; - node->hostname = NULL; - utarray_new(node->partitions, &node_partitions_icd); - node->hwlocTopo = NULL; - node->hwlocTopoIdx = -1; - - return node; -} - -int netloc_node_destruct(netloc_node_t * node) -{ - return node_or_subnode_destruct(node, 1); -} - -static int node_or_subnode_destruct(netloc_node_t * node, int is_node) -{ - utarray_free(node->physical_links); - - /* Description */ - free(node->description); - - /* Edges */ - netloc_edge_t *edge, *edge_tmp; - HASH_ITER(hh, node->edges, edge, edge_tmp) { - HASH_DEL(node->edges, edge); /* delete; edge advances to next */ - netloc_edge_destruct(edge); - } - - /* Subnodes */ - for (unsigned int n = 0; n < utarray_len(node->subnodes); n++) { - netloc_node_t *subnode = *(netloc_node_t **) - utarray_eltptr(node->subnodes, n); - node_or_subnode_destruct(subnode, 0); - } - utarray_free(node->subnodes); - - /* Paths */ - netloc_path_t *path, *path_tmp; - HASH_ITER(hh, node->paths, path, path_tmp) { - HASH_DEL(node->paths, path); /* delete; path advances to next */ - netloc_path_destruct(path); - } - - /* Hostname */ - free(node->hostname); - - /* Partitions */ - utarray_free(node->partitions); - - /* hwlocTopo: nothing to do beacause the pointer is stored also in the topology */ - - free(node); - - return NETLOC_SUCCESS; -} - -char *netloc_node_pretty_print(netloc_node_t* node) -{ - char * str = NULL; - - asprintf(&str, " [%23s]/[%d] -- %s (%d links)", - node->physical_id, - node->logical_id, - node->description, - utarray_len(node->physical_links)); - - return str; -} - -int netloc_node_is_in_partition(netloc_node_t *node, int partition) -{ - for (unsigned int i = 0; i < netloc_get_num_partitions(node); i++) { - if (netloc_get_partition(node, i) == partition) - return 1; - } - return NETLOC_SUCCESS; -} - - diff --git a/netloc/path.c b/netloc/path.c deleted file mode 100644 index 80d3f17253..0000000000 --- a/netloc/path.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright © 2016 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include - -#include - -netloc_path_t *netloc_path_construct(void) -{ - netloc_path_t *path = (netloc_path_t *) - malloc(sizeof(netloc_path_t )); - utarray_new(path->links, &ut_ptr_icd); - - return path; -} - -int netloc_path_destruct(netloc_path_t *path) -{ - utarray_free(path->links); - free(path); - return NETLOC_SUCCESS; -} diff --git a/netloc/physical_link.c b/netloc/physical_link.c deleted file mode 100644 index 7047abfc52..0000000000 --- a/netloc/physical_link.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright © 2016 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include - -#include -#include - -netloc_physical_link_t * netloc_physical_link_construct(void) -{ - static int cur_uid = 0; - - netloc_physical_link_t *physical_link = NULL; - - physical_link = (netloc_physical_link_t*) - malloc(sizeof(netloc_physical_link_t)); - if( NULL == physical_link ) { - return NULL; - } - - physical_link->id = cur_uid; - cur_uid++; - - physical_link->src = NULL; - physical_link->dest = NULL; - - physical_link->ports[0] = -1; - physical_link->ports[1] = -1; - - physical_link->width = NULL; - physical_link->speed = NULL; - - physical_link->edge = NULL; - physical_link->other_way = NULL; - - utarray_new(physical_link->partitions, &ut_int_icd); - - physical_link->gbits = -1; - - physical_link->description = NULL; - - return physical_link; -} - -int netloc_physical_link_destruct(netloc_physical_link_t *link) -{ - free(link->width); - free(link->description); - free(link->speed); - utarray_free(link->partitions); - free(link); - return NETLOC_SUCCESS; -} - -char * netloc_link_pretty_print(netloc_physical_link_t* link) -{ - char * str = NULL; - const char * tmp_src_str = NULL; - const char * tmp_dest_str = NULL; - - tmp_src_str = netloc_node_type_decode(link->src->type); - tmp_dest_str = netloc_node_type_decode(link->dest->type); - - asprintf(&str, "%3d (%s) [%23s] %d [<- %s / %s (%f) ->] (%s) [%23s] %d", - link->id, - tmp_src_str, - link->src->physical_id, - link->ports[0], - link->speed, - link->width, - link->gbits, - tmp_dest_str, - link->dest->physical_id, - link->ports[1]); - - return str; -} - - diff --git a/netloc/scotch.c b/netloc/scotch.c deleted file mode 100644 index 24926f512b..0000000000 --- a/netloc/scotch.c +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Copyright © 2016-2017 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -static int arch_tree_to_scotch_arch(netloc_arch_tree_t *tree, SCOTCH_Arch *scotch); -static int comm_matrix_to_scotch_graph(double **matrix, int n, SCOTCH_Graph *graph); -static int netlocscotch_get_mapping_from_graph(SCOTCH_Graph *graph, - netlocscotch_core_t **pcores); - -static int compareint(void const *a, void const *b) -{ - const int *int_a = (const int *)a; - const int *int_b = (const int *)b; - return *int_a-*int_b; -} - -static int build_subarch(SCOTCH_Arch *scotch, NETLOC_int num_nodes, NETLOC_int *node_list, - SCOTCH_Arch *subarch) -{ - int ret; - - /* Hack to avoid problem with unsorted node list in the subarch and scotch - * FIXME TODO */ - qsort(node_list, num_nodes, sizeof(*node_list), compareint); - - ret = SCOTCH_archSub(subarch, scotch, num_nodes, node_list); - if (ret != 0) { - fprintf(stderr, "Error: SCOTCH_archSub failed\n"); - } - - return ret; -} - -/* Convert a netloc tree to a scotch tleaf architecture */ -int arch_tree_to_scotch_arch(netloc_arch_tree_t *tree, SCOTCH_Arch *scotch) -{ - int ret; - - ret = SCOTCH_archTleaf(scotch, tree->num_levels, tree->degrees, tree->cost); - if (ret != 0) { - fprintf(stderr, "Error: SCOTCH_archTleaf failed\n"); - return NETLOC_ERROR; - } - - return NETLOC_SUCCESS; -} - -static int build_subgraph(SCOTCH_Graph *graph, int *vertices, int num_vertices, - SCOTCH_Graph *nodegraph) -{ - int ret; - - SCOTCH_Num base; /* Base value */ - SCOTCH_Num vert; /* Number of vertices */ - SCOTCH_Num *verttab; /* Vertex array [vertnbr+1] */ - SCOTCH_Num *vendtab; /* Vertex array [vertnbr] */ - SCOTCH_Num *velotab; /* Vertex load array */ - SCOTCH_Num *vlbltab; /* Vertex label array */ - SCOTCH_Num edge; /* Number of edges (arcs) */ - SCOTCH_Num *edgetab; /* Edge array [edgenbr] */ - SCOTCH_Num *edlotab; /* Edge load array */ - - SCOTCH_graphData(graph, &base, &vert, &verttab, &vendtab, &velotab, - &vlbltab, &edge, &edgetab, &edlotab); - - int *vertex_is_present = (int *)malloc(vert*sizeof(int)); - for (int v = 0; v < vert; v++) { - vertex_is_present[v] = -1; - } - for (int v = 0; v < num_vertices; v++) { - vertex_is_present[vertices[v]] = v; - } - - // TODO handle other cases - if (vendtab) { - for (int i = 0; i < vert; i++) { - assert(vendtab[i] == verttab[i+1]); - } - } - - SCOTCH_Num *new_verttab; /* Vertex array [vertnbr+1] */ - SCOTCH_Num *new_vendtab; /* Vertex array [vertnbr] */ - SCOTCH_Num *new_velotab; /* Vertex load array */ - SCOTCH_Num *new_vlbltab; /* Vertex label array */ - SCOTCH_Num new_edge; /* Number of edges (arcs) */ - SCOTCH_Num *new_edgetab; /* Edge array [edgenbr] */ - SCOTCH_Num *new_edlotab; /* Edge load array */ - - new_verttab = (SCOTCH_Num *)malloc((num_vertices+1)*sizeof(SCOTCH_Num)); - new_vendtab = NULL; - if (velotab) - new_velotab = (SCOTCH_Num *)malloc(num_vertices*sizeof(SCOTCH_Num)); - else - new_velotab = NULL; - if (vlbltab) - new_vlbltab = (SCOTCH_Num *)malloc(num_vertices*sizeof(SCOTCH_Num)); - else - new_vlbltab = NULL; - - new_edgetab = (SCOTCH_Num *)malloc(edge*sizeof(SCOTCH_Num)); - new_edlotab = (SCOTCH_Num *)malloc(edge*sizeof(SCOTCH_Num)); - - int edge_idx = 0; - new_verttab[0] = 0; - for (int v = 0; v < num_vertices; v++) { - if (velotab) - new_velotab[v] = velotab[vertices[v]]; - if (vlbltab) - new_vlbltab[v] = vlbltab[vertices[v]]; - - for (int e = verttab[vertices[v]]; e < verttab[vertices[v]+1]; e++) { - int dest_vertex = edgetab[e]; - int new_dest = vertex_is_present[dest_vertex]; - if (new_dest != -1) { - new_edgetab[edge_idx] = new_dest; - new_edlotab[edge_idx] = edlotab[e]; - edge_idx++; - } - } - new_verttab[v+1] = edge_idx; - } - - new_edge = edge_idx; - - SCOTCH_Num *old_edgetab = new_edgetab; - new_edgetab = (SCOTCH_Num *) - realloc(new_edgetab, new_edge*sizeof(SCOTCH_Num)); - if (!new_edgetab) { - new_edgetab = old_edgetab; - } - - SCOTCH_Num *old_edlotab = new_edlotab; - new_edlotab = (SCOTCH_Num *) - realloc(new_edlotab, new_edge*sizeof(SCOTCH_Num)); - if (!new_edlotab) { - new_edlotab = old_edlotab; - } - - ret = SCOTCH_graphBuild (nodegraph, base, num_vertices, - new_verttab, new_vendtab, new_velotab, new_vlbltab, - new_edge, new_edgetab, new_edlotab); - - free(vertex_is_present); - - return ret; -} - -static int build_current_arch(SCOTCH_Arch *scotch_arch, - SCOTCH_Arch *scotch_subarch, netloc_arch_t *arch) -{ - int ret; - /* First we need to get the topology of the whole machine */ - ret = netloc_arch_build(arch, 1); - if( NETLOC_SUCCESS != ret ) { - return ret; - } - - if (scotch_subarch) { - /* Set the current nodes and slots in the arch */ - ret = netloc_arch_set_current_resources(arch); - } else { - ret = netloc_arch_set_global_resources(arch); - } - - if( NETLOC_SUCCESS != ret ) { - return ret; - } - - SCOTCH_archInit(scotch_arch); - ret = arch_tree_to_scotch_arch(arch->arch.global_tree, scotch_arch); - if (NETLOC_SUCCESS != ret) { - return ret; - } - - if (scotch_subarch) { - /* Now we can build the sub architecture */ - SCOTCH_archInit(scotch_subarch); - ret = build_subarch(scotch_arch, arch->num_current_hosts, - arch->current_hosts, scotch_subarch); - } - - return ret; -} - -int netlocscotch_build_global_arch(SCOTCH_Arch *arch) -{ - int ret; - netloc_arch_t *netloc_arch = netloc_arch_construct(); - ret = build_current_arch(arch, NULL, netloc_arch); - - netloc_arch_destruct(netloc_arch); - return ret; -} - -int netlocscotch_build_current_arch(SCOTCH_Arch *arch, SCOTCH_Arch *subarch) -{ - int ret; - netloc_arch_t *netloc_arch = netloc_arch_construct(); - ret = build_current_arch(arch, subarch, netloc_arch); - - if (ret == NETLOC_SUCCESS) - netloc_arch_destruct(netloc_arch); - - return ret; -} - -int netlocscotch_get_mapping_from_graph(SCOTCH_Graph *graph, - netlocscotch_core_t **pcores) -{ - int ret; - - SCOTCH_Arch scotch_arch; - SCOTCH_Arch scotch_subarch; - netlocscotch_core_t *cores = NULL; - netloc_arch_t *arch = netloc_arch_construct(); - ret = build_current_arch(&scotch_arch, &scotch_subarch, arch); - if (NETLOC_SUCCESS != ret) { - netloc_arch_destruct(arch); - return ret; - } - - NETLOC_int graph_size; - SCOTCH_graphSize(graph, &graph_size, NULL); - - int num_hosts = arch->num_current_hosts; - - SCOTCH_Strat strategy; - SCOTCH_stratInit(&strategy); - /* We force Scotch to use all the processes - * barat is 0.01 as in SCOTCH_STRATDEFAULT */ - SCOTCH_stratGraphMapBuild(&strategy, SCOTCH_STRATQUALITY, graph_size, 0.01); - - /* The ranks are the indices of the nodes in the complete graph */ - NETLOC_int *ranks = (NETLOC_int *)malloc(graph_size*sizeof(NETLOC_int)); - ret = SCOTCH_graphMap(graph, &scotch_subarch, &strategy, ranks); - - SCOTCH_stratExit(&strategy); - - SCOTCH_archExit(&scotch_subarch); - SCOTCH_archExit(&scotch_arch); - - if (ret != 0) { - fprintf(stderr, "Error: SCOTCH_graphMap failed\n"); - goto ERROR; - } - - cores = (netlocscotch_core_t *) - malloc(graph_size*sizeof(netlocscotch_core_t)); - if (!arch->has_slots) { - /* We have the mapping but only for the nodes, not inside the nodes */ - - UT_array *process_by_node[num_hosts]; - for (int n = 0; n < num_hosts; n++) { - utarray_new(process_by_node[n], &ut_int_icd); - } - - /* Find the processes mapped to the nodes */ - for (int p = 0; p < graph_size; p++) { - int rank = ranks[p]; - if (rank >= num_hosts || rank < 0) { - ret = NETLOC_ERROR; - goto ERROR; - } - utarray_push_back(process_by_node[rank], &p); - } - - /* Use the intranode topology */ - for (int n = 0; n < num_hosts; n++) { - int *process_list = (int *)process_by_node[n]->d; - int num_processes = utarray_len(process_by_node[n]); - netloc_arch_node_t *node = - arch->node_slot_by_idx[arch->current_hosts[n]].node; - NETLOC_int node_ranks[num_processes]; - - /* We need to extract the subgraph with only the vertices mapped to the - * current node */ - SCOTCH_Graph nodegraph; /* graph with only elements for node n */ - build_subgraph(graph, process_list, num_processes, &nodegraph); - - /* Build the scotch arch of the all node */ - SCOTCH_Arch scotch_nodearch; - ret = arch_tree_to_scotch_arch(node->slot_tree, &scotch_nodearch); - if (NETLOC_SUCCESS != ret) { - goto ERROR; - } - - /* Restrict the scotch arch to the available cores */ - SCOTCH_Arch scotch_nodesubarch; - ret = build_subarch(&scotch_nodearch, node->num_current_slots, - node->current_slots, &scotch_nodesubarch); - if (NETLOC_SUCCESS != ret) { - goto ERROR; - } - - /* Find the mapping to the cores */ - ret = SCOTCH_graphMap(&nodegraph, &scotch_nodesubarch, &strategy, node_ranks); - if (ret != 0) { - fprintf(stderr, "Error: SCOTCH_graphMap failed\n"); - goto ERROR; - } - - /* Report the node ranks in the global rank array */ - for (int p = 0; p < num_processes; p++) { - int process = process_list[p]; - int arch_idx = node->current_slots[node_ranks[p]]; - cores[process].core = node->slot_os_idx[arch_idx]; - cores[process].nodename = strdup(node->node->hostname); - cores[process].rank = node->slot_ranks[node_ranks[p]]; - } - } - for (int n = 0; n < num_hosts; n++) { - utarray_free(process_by_node[n]); - } - } else { - for (int p = 0; p < graph_size; p++) { - int host_idx = arch->current_hosts[ranks[p]]; - netloc_arch_node_t *node = arch->node_slot_by_idx[host_idx].node; - int slot_rank = arch->node_slot_by_idx[host_idx].slot; - cores[p].nodename = strdup(node->node->hostname); - cores[p].core = node->slot_os_idx[node->slot_idx[slot_rank]]; - cores[p].rank = node->slot_ranks[node->slot_idx[slot_rank]]; - } - } - - *pcores = cores; - -ERROR: - free(ranks); - netloc_arch_destruct(arch); - if (ret == NETLOC_SUCCESS) - return ret; - free(cores); - return ret; -} - -int netlocscotch_get_mapping_from_comm_matrix(double **comm, int num_vertices, - netlocscotch_core_t **pcores) -{ - int ret; - - SCOTCH_Graph graph; - ret = comm_matrix_to_scotch_graph(comm, num_vertices, &graph); - if (NETLOC_SUCCESS != ret) { - return ret; - } - - ret = netlocscotch_get_mapping_from_graph(&graph, pcores); - - /* Free arrays */ - { - SCOTCH_Num base; /* Base value */ - SCOTCH_Num vert; /* Number of vertices */ - SCOTCH_Num *verttab; /* Vertex array [vertnbr+1] */ - SCOTCH_Num *vendtab; /* Vertex array [vertnbr] */ - SCOTCH_Num *velotab; /* Vertex load array */ - SCOTCH_Num *vlbltab; /* Vertex label array */ - SCOTCH_Num edge; /* Number of edges (arcs) */ - SCOTCH_Num *edgetab; /* Edge array [edgenbr] */ - SCOTCH_Num *edlotab; /* Edge load array */ - - SCOTCH_graphData(&graph, &base, &vert, &verttab, &vendtab, &velotab, - &vlbltab, &edge, &edgetab, &edlotab); - free(edlotab); - free(edgetab); - free(verttab); - SCOTCH_graphExit(&graph); - } - - return ret; -} - -int netlocscotch_get_mapping_from_comm_file(char *filename, int *pnum_processes, - netlocscotch_core_t **pcores) -{ - int ret; - int n; - double **mat; - - ret = netloc_build_comm_mat(filename, &n, &mat); - - if (ret != NETLOC_SUCCESS) { - return ret; - } - - *pnum_processes = n; - - ret = netlocscotch_get_mapping_from_comm_matrix(mat, n, pcores); - - free(mat[0]); - free(mat); - - return ret; -} - -static int comm_matrix_to_scotch_graph(double **matrix, int n, SCOTCH_Graph *graph) -{ - int ret; - - SCOTCH_Num base; /* Base value */ - SCOTCH_Num vert; /* Number of vertices */ - SCOTCH_Num *verttab; /* Vertex array [vertnbr+1] */ - SCOTCH_Num *vendtab; /* Vertex array [vertnbr] */ - SCOTCH_Num *velotab; /* Vertex load array */ - SCOTCH_Num *vlbltab; /* Vertex label array */ - SCOTCH_Num edge; /* Number of edges (arcs) */ - SCOTCH_Num *edgetab; /* Edge array [edgenbr] */ - SCOTCH_Num *edlotab; /* Edge load array */ - - base = 0; - vert = n; - - verttab = (SCOTCH_Num *)malloc((vert+1)*sizeof(SCOTCH_Num)); - for (int v = 0; v < vert+1; v++) { - verttab[v] = v*(n-1); - } - - vendtab = NULL; - velotab = NULL; - vlbltab = NULL; - - edge = n*(n-1); - - /* Compute the lowest load to reduce of the values of the load to avoid overflow */ - double min_load = -1; - for (int v1 = 0; v1 < vert; v1++) { - for (int v2 = 0; v2 < vert; v2++) { - double load = matrix[v1][v2]; - if (load >= 0.01 && (load < min_load || min_load < 0)) /* TODO set an epsilon */ - min_load = load; - } - } - - edgetab = (SCOTCH_Num *)malloc(n*(n-1)*sizeof(SCOTCH_Num)); - edlotab = (SCOTCH_Num *)malloc(n*(n-1)*sizeof(SCOTCH_Num)); - for (int v1 = 0; v1 < vert; v1++) { - for (int v2 = 0; v2 < vert; v2++) { - if (v2 == v1) - continue; - int idx = v1*(n-1)+((v2 < v1) ? v2: v2-1); - edgetab[idx] = v2; - edlotab[idx] = (int)(matrix[v1][v2]/min_load); - } - } - - ret = SCOTCH_graphBuild(graph, base, vert, - verttab, vendtab, velotab, vlbltab, edge, edgetab, edlotab); - - return ret; -} - diff --git a/netloc/support.c b/netloc/support.c deleted file mode 100644 index e17c937ad4..0000000000 --- a/netloc/support.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright © 2013-2014 University of Wisconsin-La Crosse. - * All rights reserved. - * Copyright © 2016-2018 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#include -#include - -#include -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -char *netloc_line_get_next_token(char **string, char c) -{ - char *field; - char *string_end; - - if (!*string) - return NULL; - - string_end = strchr(*string, c); - - if (string_end) { - string_end[0] = '\0'; - field = *string; - *string = string_end+1; - } else { - field = *string; - *string = NULL; - } - - return field; -} - -ssize_t netloc_line_get(char **lineptr, size_t *n, FILE *stream) -{ - ssize_t read = getline(lineptr, n, stream); - if (read == -1) - return -1; - - /* Remove last \n character */ - char *line = *lineptr; - size_t lastpos = strlen(line)-1; - if (line[lastpos] == '\n') { - line[lastpos] = '\0'; - read--; - } - return read; -} - diff --git a/netloc/topology.c b/netloc/topology.c deleted file mode 100644 index 0efd04b93c..0000000000 --- a/netloc/topology.c +++ /dev/null @@ -1,598 +0,0 @@ -/* - * Copyright © 2013-2014 University of Wisconsin-La Crosse. - * All rights reserved. - * Copyright © 2016-2017 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include -#include -#include -#include - -#include - -static char *line_get_next_field(char **string); -static void read_partition_list(char *list, UT_array *array); -static int edges_sort_by_dest(netloc_edge_t *a, netloc_edge_t *b); -static int find_reverse_edges(netloc_topology_t *topology); -static int find_similar_nodes(netloc_topology_t *topology); -static int netloc_node_get_virtual_id(char *id); -static int edge_merge_into(netloc_edge_t *dest, netloc_edge_t *src, int keep); - -netloc_topology_t *netloc_topology_construct(char *path) -{ - int ret; - char *line = NULL; - size_t linesize = 0; - - netloc_topology_t *topology = NULL; - - FILE *input = fopen(path, "r"); - - if (!input ) { - fprintf(stderr, "Cannot open topology file %s\n", path); - perror("fopen"); - exit(-1); - } - - int version; - if (fscanf(input , "%d\n,", &version) != 1) { - fprintf(stderr, "Cannot read the version number in %s\n", path); - perror("fscanf"); - fclose(input); - return NULL; - } else if (version != NETLOCFILE_VERSION) { - fprintf(stderr, "Incorrect version number, " - "please generate your input file again\n"); - fclose(input); - return NULL; - } - - char *subnet; - if (netloc_line_get(&line, &linesize, input) == -1) { - fprintf(stderr, "Cannot read the subnet in %s\n", path); - perror("fscanf"); - free(line); - fclose(input); - return NULL; - } else { - subnet = strdup(line); - } - - char *hwlocpath; - if (netloc_line_get(&line, &linesize, input) == -1) { - fprintf(stderr, "Cannot read hwloc path in %s\n", path); - perror("fscanf"); - free(subnet); - fclose(input); - return NULL; - } else if (!strlen(line)) { - hwlocpath = NULL; - } else { - hwlocpath = strdup(line); - } - - if (hwlocpath) { - DIR *hwlocdir; - char *realhwlocpath; - if (hwlocpath[0] != '/') { - char *path_tmp = strdup(path); - asprintf(&realhwlocpath, "%s/%s", dirname(path_tmp), hwlocpath); - free(path_tmp); - } else { - realhwlocpath = strdup(hwlocpath); - } - if (!(hwlocdir = opendir(realhwlocpath))) { - fprintf(stderr, "Couldn't open hwloc directory: \"%s\"\n", realhwlocpath); - perror("opendir"); - free(subnet); - free(realhwlocpath); - fclose(input); - return NULL; - } else { - closedir(hwlocdir); - free(realhwlocpath); - } - } - - int num_nodes; - if (fscanf(input , "%d\n", &num_nodes) != 1) { - fprintf(stderr, "Cannot read the number of nodes in %s\n", path); - perror("fscanf"); - free(subnet); - fclose(input); - return NULL; - } - - if (num_nodes <= 0) { - fprintf(stderr, "Oups: incorrect number of nodes (%d) in %s\n", - num_nodes, path); - free(subnet); - fclose(input); - return NULL; - } - - /* - * Allocate Memory - */ - topology = (netloc_topology_t *)malloc(sizeof(netloc_topology_t) * 1); - if( NULL == topology ) { - free(subnet); - fclose(input); - return NULL; - } - - /* - * Initialize the structure - */ - topology->topopath = path; - topology->hwlocpath = hwlocpath; - topology->subnet_id = subnet; - topology->nodes = NULL; - topology->physical_links = NULL; - topology->type = NETLOC_TOPOLOGY_TYPE_INVALID ; - topology->nodesByHostname = NULL; - topology->hwloc_topos = NULL; - utarray_new(topology->partitions, &ut_str_icd); - utarray_new(topology->topos, &ut_str_icd); - - /* Read nodes from file */ - for (int n = 0; n < num_nodes; n++) { - netloc_node_t *node = netloc_node_construct(); - netloc_line_get(&line, &linesize, input); - char *remain_line = line; - - strncpy(node->physical_id, line_get_next_field(&remain_line), 20); - /* Should be shorter than 20 */ - node->physical_id[19] = '\0'; /* If a problem occurs */ - node->logical_id = atoi(line_get_next_field(&remain_line)); - node->type = atoi(line_get_next_field(&remain_line)); - read_partition_list(line_get_next_field(&remain_line), node->partitions); - node->description = strdup(line_get_next_field(&remain_line)); - node->hostname = strdup(line_get_next_field(&remain_line)); - - HASH_ADD_STR(topology->nodes, physical_id, node); - if (strlen(node->hostname) > 0) { - HASH_ADD_KEYPTR(hh2, topology->nodesByHostname, node->hostname, - strlen(node->hostname), node); - } - } - - /* Read edges from file */ - for (int n = 0; n < num_nodes; n++) { - char *field; - netloc_node_t *node; - - netloc_line_get(&line, &linesize, input); - char *remain_line = line; - - field = line_get_next_field(&remain_line); - if (strlen(field) > 19) - field[19] = '\0'; - HASH_FIND_STR(topology->nodes, field, node); - - if (!node) { - fprintf(stderr, "Node not found: %s\n", field); - utarray_free(topology->partitions); - utarray_free(topology->topos); - return NULL; - } - - while ((field = line_get_next_field(&remain_line))) { - /* There is an edge */ - netloc_edge_t *edge = netloc_edge_construct(); - - HASH_FIND_STR(topology->nodes, field, edge->dest); - edge->total_gbits = strtof(line_get_next_field(&remain_line), NULL); - read_partition_list(line_get_next_field(&remain_line), edge->partitions); - - edge->node = node; - HASH_ADD_PTR(node->edges, dest, edge); - - /* Read links */ - int num_links = atoi(line_get_next_field(&remain_line)); - assert(num_links >= 0); - utarray_reserve(edge->physical_links, (unsigned int)num_links); - utarray_reserve(node->physical_links, (unsigned int)num_links); - for (int i = 0; i < num_links; i++) { - netloc_physical_link_t *link; - link = netloc_physical_link_construct(); - - link->id = atoi(line_get_next_field(&remain_line)); - - link->src = node; - link->dest = edge->dest; - - link->ports[0] = atoi(line_get_next_field(&remain_line)); - link->ports[1] = atoi(line_get_next_field(&remain_line)); - - link->width = strdup(line_get_next_field(&remain_line)); - link->speed = strdup(line_get_next_field(&remain_line)); - link->gbits = strtof(line_get_next_field(&remain_line), NULL); - link->description = strdup(line_get_next_field(&remain_line)); - link->other_way_id = atoi(line_get_next_field(&remain_line)); - - read_partition_list(line_get_next_field(&remain_line), - link->partitions); - - HASH_ADD_INT(topology->physical_links, id, link); - - utarray_push_back(node->physical_links, &link); - utarray_push_back(edge->physical_links, &link); - } - - } - HASH_SRT(hh, node->edges, edges_sort_by_dest); - } - - /* Read partitions from file */ - { - netloc_line_get(&line, &linesize, input); - char *remain_line = line; - char *field; - - while ((field = line_get_next_field(&remain_line))) { - utarray_push_back(topology->partitions, &field); - } - } - - /* Read paths */ - while (netloc_line_get(&line, &linesize, input) != -1) { - netloc_node_t *node; - netloc_path_t *path; - char *field; - - char *remain_line = line; - char *src_id = line_get_next_field(&remain_line); - char *dest_id = line_get_next_field(&remain_line); - - HASH_FIND_STR(topology->nodes, src_id, node); - - path = netloc_path_construct(); - strncpy(path->dest_id, dest_id, 20); /* Should be shorter than 20 */ - path->dest_id[19] = '\0'; /* If a problem occurs */ - - while ((field = line_get_next_field(&remain_line))) { - int link_id = atoi(field); - netloc_physical_link_t *link; - - HASH_FIND_INT(topology->physical_links, &link_id, link); - utarray_push_back(path->links, &link); - } - - HASH_ADD_STR(node->paths, dest_id, path); - } - - fclose(input); - free(line); - - if (find_reverse_edges(topology) != NETLOC_SUCCESS) { - netloc_topology_destruct(topology); - return NULL; - } - - ret = find_similar_nodes(topology); - if (ret != NETLOC_SUCCESS) { - netloc_topology_destruct(topology); - return NULL; - } - - return topology; -} - -int netloc_topology_destruct(netloc_topology_t *topology) -{ - /* - * Sanity Check - */ - if( NULL == topology ) { - fprintf(stderr, "Error: Detaching from a NULL pointer\n"); - return NETLOC_ERROR; - } - - free(topology->topopath); - free(topology->hwlocpath); - free(topology->subnet_id); - - /* Nodes */ - netloc_node_t *node, *node_tmp; - HASH_ITER(hh, topology->nodes, node, node_tmp) { - HASH_DELETE(hh, topology->nodes, node); - } - - netloc_topology_iter_nodes(topology, node, node_tmp) { - HASH_DELETE(hh, topology->nodes, node); - netloc_node_destruct(node); - } - - /** Partition List */ - utarray_free(topology->partitions); - - /** Physical links */ - netloc_physical_link_t *link, *link_tmp; - HASH_ITER(hh, topology->physical_links, link, link_tmp) { - HASH_DEL(topology->physical_links, link); - netloc_physical_link_destruct(link); - } - - /** Hwloc topology List */ - for (unsigned int t = 0; t < utarray_len(topology->topos); t++) { - if (topology->hwloc_topos[t]) - hwloc_topology_destroy(topology->hwloc_topos[t]); - } - free(topology->hwloc_topos); - - /** Hwloc topology name List */ - utarray_free(topology->topos); - - free(topology); - - return NETLOC_SUCCESS; -} - -int netloc_topology_find_partition_idx(netloc_topology_t *topology, char *partition_name) -{ - if (!partition_name) - return -1; - - /* Find the selected partition in the topology */ - unsigned int p = 0; - int found = 0; - while (p < utarray_len(topology->partitions)) { - char *current_name = *(char **)utarray_eltptr(topology->partitions, p); - - if (!strcmp(current_name, partition_name)) { - found = 1; - break; - } - p++; - } - - if (!found) - return -2; - - assert(p <= INT_MAX); - - return (int)p; -} - -static char *line_get_next_field(char **string) -{ - return netloc_line_get_next_token(string, ','); -} - -static void read_partition_list(char *list, UT_array *array) -{ - char *partition; - if (!strlen(list)) - return; - while ((partition = netloc_line_get_next_token(&list, ':'))) { - int partition_num = atoi(partition); - utarray_push_back(array, &partition_num); - } -} - -static int edges_sort_by_dest(netloc_edge_t *a, netloc_edge_t *b) -{ - return strcmp(a->dest->physical_id, b->dest->physical_id); -} - -static int find_reverse_edges(netloc_topology_t *topology) -{ - netloc_node_t *node, *node_tmp; - HASH_ITER(hh, topology->nodes, node, node_tmp) { - netloc_edge_t *edge, *edge_tmp; - netloc_node_iter_edges(node, edge, edge_tmp) { - netloc_node_t *dest = edge->dest; - if (dest > node) { - netloc_edge_t *reverse_edge; - HASH_FIND_PTR(dest->edges, &node, reverse_edge); - if (reverse_edge == NULL) { - return NETLOC_ERROR; - } - edge->other_way = reverse_edge; - reverse_edge->other_way = edge; - } - } - } - return NETLOC_SUCCESS; -} - -static int find_similar_nodes(netloc_topology_t * topology) -{ - int ret; - - /* Build edge lists by node */ - int num_nodes = HASH_COUNT(topology->nodes); - netloc_node_t **nodes = (netloc_node_t **)malloc(num_nodes*sizeof(netloc_node_t *)); - netloc_node_t ***edgedest_by_node = (netloc_node_t ***)malloc(num_nodes*sizeof(netloc_node_t **)); - int *num_edges_by_node = (int *)malloc(num_nodes*sizeof(int)); - netloc_node_t *node, *node_tmp; - int idx = -1; - netloc_topology_iter_nodes(topology, node, node_tmp) { - idx++; - if (netloc_node_is_host(node)) { - nodes[idx] = NULL; - edgedest_by_node[idx] = NULL; - continue; - } - int num_edges = HASH_COUNT(node->edges); - nodes[idx] = node; - num_edges_by_node[idx] = num_edges; - edgedest_by_node[idx] = (netloc_node_t **)malloc(num_edges*sizeof(netloc_node_t *)); - - netloc_edge_t *edge, *edge_tmp; - int edge_idx = 0; - netloc_node_iter_edges(node, edge, edge_tmp) { - edgedest_by_node[idx][edge_idx] = edge->dest; - edge_idx++; - } - } - - /* We compare the edge lists to find similar nodes */ - UT_array *similar_nodes; - utarray_new(similar_nodes, &ut_ptr_icd); - for (int idx1 = 0; idx1 < num_nodes; idx1++) { - netloc_node_t *node1 = nodes[idx1]; - netloc_node_t *virtual_node = NULL; - netloc_edge_t *first_virtual_edge = NULL; - if (!node1) - continue; - for (int idx2 = idx1+1; idx2 < num_nodes; idx2++) { - netloc_node_t *node2 = nodes[idx2]; - if (!node2) - continue; - if (num_edges_by_node[idx2] != num_edges_by_node[idx1]) - continue; - if (idx2 == idx1) - continue; - - int equal = 1; - for (int i = 0; i < num_edges_by_node[idx1]; i++) { - if (edgedest_by_node[idx2][i] != edgedest_by_node[idx1][i]) { - equal = 0; - break; - } - } - - /* If we have similar nodes */ - if (equal) { - /* We create a new virtual node to contain all of them */ - if (!virtual_node) { - virtual_node = netloc_node_construct(); - netloc_node_get_virtual_id(virtual_node->physical_id); - - virtual_node->type = node1->type; - utarray_concat(virtual_node->physical_links, node1->physical_links); - virtual_node->description = strdup(virtual_node->physical_id); - - utarray_push_back(virtual_node->subnodes, &node1); - utarray_concat(virtual_node->partitions, node1->partitions); - - // TODO paths - - /* Set edges */ - netloc_edge_t *edge1, *edge_tmp1; - netloc_node_iter_edges(node1, edge1, edge_tmp1) { - netloc_edge_t *virtual_edge = netloc_edge_construct(); - if (!first_virtual_edge) - first_virtual_edge = virtual_edge; - virtual_edge->node = virtual_node; - virtual_edge->dest = edge1->dest; - ret = edge_merge_into(virtual_edge, edge1, 0); - if (ret != NETLOC_SUCCESS) { - netloc_edge_destruct(virtual_edge); - goto ERROR; - } - HASH_ADD_PTR(virtual_node->edges, dest, virtual_edge); - - /* Change the reverse edge of the neighbours (reverse nodes) */ - netloc_node_t *reverse_node = edge1->dest; - netloc_edge_t *reverse_edge = edge1->other_way; - - netloc_edge_t *reverse_virtual_edge = - netloc_edge_construct(); - reverse_virtual_edge->dest = virtual_node; - reverse_virtual_edge->node = reverse_node; - reverse_virtual_edge->other_way = virtual_edge; - virtual_edge->other_way = reverse_virtual_edge; - HASH_ADD_PTR(reverse_node->edges, dest, reverse_virtual_edge); - ret = edge_merge_into(reverse_virtual_edge, reverse_edge, 1); - if (ret != NETLOC_SUCCESS) { - goto ERROR; - } - HASH_DEL(reverse_node->edges, reverse_edge); - } - - /* We remove the node from the list of nodes */ - HASH_DEL(topology->nodes, node1); - HASH_ADD_STR(topology->nodes, physical_id, virtual_node); - printf("First node found: %s (%s)\n", node1->description, node1->physical_id); - } - - utarray_concat(virtual_node->physical_links, node2->physical_links); - utarray_push_back(virtual_node->subnodes, &node2); - utarray_concat(virtual_node->partitions, node2->partitions); - - /* Set edges */ - netloc_edge_t *edge2, *edge_tmp2; - netloc_edge_t *virtual_edge = first_virtual_edge; - netloc_node_iter_edges(node2, edge2, edge_tmp2) { - /* Merge the edges from the physical node into the virtual node */ - ret = edge_merge_into(virtual_edge, edge2, 0); - if (ret != NETLOC_SUCCESS) { - goto ERROR; - } - - /* Change the reverse edge of the neighbours (reverse nodes) */ - netloc_node_t *reverse_node = edge2->dest; - netloc_edge_t *reverse_edge = edge2->other_way; - - netloc_edge_t *reverse_virtual_edge; - HASH_FIND_PTR(reverse_node->edges, &virtual_node, - reverse_virtual_edge); - ret = edge_merge_into(reverse_virtual_edge, reverse_edge, 1); - if (ret != NETLOC_SUCCESS) { - goto ERROR; - } - HASH_DEL(reverse_node->edges, reverse_edge); - - /* Get the next edge */ - virtual_edge = virtual_edge->hh.next; - } - - /* We remove the node from the list of nodes */ - HASH_DEL(topology->nodes, node2); - printf("\t node found: %s (%s)\n", node2->description, node2->physical_id); - - nodes[idx2] = NULL; - } - } - utarray_clear(similar_nodes); - } - - ret = NETLOC_SUCCESS; -ERROR: - free(nodes); - - for (int idx = 0; idx < num_nodes; idx++) { - if (edgedest_by_node[idx]) - free(edgedest_by_node[idx]); - } - free(edgedest_by_node); - free(num_edges_by_node); - free(similar_nodes); - return ret; -} - -static int netloc_node_get_virtual_id(char *id) -{ - static int virtual_id = 0; - sprintf(id, "virtual%d", virtual_id++); - return 0; -} - -static int edge_merge_into(netloc_edge_t *dest, netloc_edge_t *src, int keep) -{ - if (!dest || !src) { - return NETLOC_ERROR; - } - - utarray_concat(dest->physical_links, src->physical_links); - dest->total_gbits += src->total_gbits; - utarray_concat(dest->partitions, src->partitions); - /* it will keep the duplicated edges */ - if (keep) - utarray_push_back(dest->subnode_edges, &src); - - return NETLOC_SUCCESS; -} - diff --git a/netlocscotch.pc.in b/netlocscotch.pc.in deleted file mode 100644 index f8f4a425ce..0000000000 --- a/netlocscotch.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: netlocscotch -Description: Network locality to scotch architecture -Version: @HWLOC_VERSION@ -Cflags: -I${includedir} -Libs: -L${libdir} -lnetlocscotch -lnetloc -lhwloc -Libs.private: @LIBS@ diff --git a/tests/Makefile.am b/tests/Makefile.am index 96fa698610..65805af4dc 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -4,6 +4,3 @@ # See COPYING in top-level directory. SUBDIRS = hwloc -if BUILD_NETLOC -SUBDIRS += netloc -endif diff --git a/tests/netloc/Makefile.am b/tests/netloc/Makefile.am deleted file mode 100644 index 80376cf960..0000000000 --- a/tests/netloc/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright © 2016-2017 Inria. All rights reserved. -# -# See COPYING in top-level directory. -# -# $HEADER$ -# - -AM_CFLAGS = $(NETLOC_CFLAGS) -AM_CPPFLAGS = $(NETLOC_CPPFLAGS) -AM_LDFLAGS = $(NETLOC_LDFLAGS) -lpthread - -LDADD = $(top_builddir)/netloc/libnetloc.la \ - $(top_builddir)/netloc/libnetlocscotch.la \ - -lscotch -lscotcherr -lm -lpthread - -EXTRA_DIST = \ - data/tests_extract.txt \ - data/tests_draw.txt \ - data/avakas.txz \ - data/plafrim.txz \ - data/plafrim2.txz \ - data/scotch.txz \ - data/tests_scotch.txt \ - data/tests_mpiscotch.txt - -if FOUND_XZ -TESTS = \ - data/tests_extract.txt \ - data/tests_draw.txt - -if BUILD_NETLOCSCOTCH -TESTS += data/tests_scotch.txt -if BUILD_MPITOOLS -TESTS += data/tests_mpiscotch.txt -endif -endif -endif - -TEST_EXTENSIONS = .txt -TXT_LOG_COMPILER = ./tests.sh diff --git a/tests/netloc/data/avakas.txz b/tests/netloc/data/avakas.txz deleted file mode 100644 index 83e879670231986c2d7729aacd71d12dec8ddc3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231384 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%0A6`nya*yFt|#xb*F}c0HfsC$Eay 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

Ih~jfGEJjZLRL^$fPaexM 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%0A+|R)j-gwysKx!@f=pD*fZN8b)y}tCd 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 K000001X)^u$Nj(n diff --git a/tests/netloc/data/plafrim2.txz b/tests/netloc/data/plafrim2.txz deleted file mode 100644 index 270076e6f255cb52728e6567d9996df25353a67b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53776 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"aUOA@5{cNb)DXRxz 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 diff --git a/tests/netloc/data/scotch.txz b/tests/netloc/data/scotch.txz deleted file mode 100644 index 989f188869124a4642bf19509d382193f22cc6f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1324 zcmV+{1=ITdH+ooF000E$*0e?f03iVu0001VFXf})PyYn$T>v?l%0*rkS0)$V$I?9m z!%&#sdWDWATLIGf6Ds}!z>_Ubt3Bf9DtUSlbnv}mMat4IpsB!X_gl3^HEd+lI`o<3kd9U%-y2vcUIdXh!JDr3+yxqOP0o{sg3abZraqM}M6*a} zu*oo(+e`qHzY50U53$c9kcq!#c^%IDDDgPP>=i~BNraxbF_Ub#@%8H3bj>__JoQ=L zNg0PZ8hDF3qYlWmGm5O#vnD9AaV+Nbe6v>pG(mUun7Ue;BUK7SOfBCL#aEWr55~px zKB2>J-IYGHS+HhwS-{5eO6uKg5^H&UBO$Ib?C4M7JvQ3dUQ?39KN={fT3Q67!mvFp z0fqVMF-0k0Cxn67>_~Q|AXr4-KJ3m9VIuC@jMxoBpAyt^$D+pFu5gC(Kwag92fU_hA5W z^Ov$^i|a11sil-qFcvAm-#s*%K@JyxG|ts%u=wn>GJl7<2r0Aq(_COTS62iaO=a0h zmfXrhq<|42v)CgbO(ENf10t$;eI9_yPRh7zyeu=vju?kh-m_QO@+%r3)$b8JO=ORE zJ`I9oMQ`#4Q{40rG$*;Q7+WyQH+h$fkcF-WfCX0$b6KVQy8We2pr`|CD z$hWr1H%O>KLTk>th9bq0_G0&}%P(N!<-nh%BkVZ|;hp!#2>-06MLN#gMF==YCe+{N zg+xS(TrMuWAtqDr9YgngoS^DUxPGtEjlHQH0uLc}55)v*t30#k@R zqCrEhb0!Y$w(Sr;@*1eVu79Zu>UkV9Kl#yjT;F<#+L9%JEDF-fmG$q0T!m50{HX}i zp7E>_s{?paT5R;hfg|o;myg1Qca zpLcQlg!H?(@)XuM1c@+(;^X`Pm(ByZgl z>SmYNR0HPICX`u0!qv1g@er$u^*FsF-V^VP}eWC(Hgc3r%B}B>WKR7`gt6UD>Oj+*x`LC+5R6y zXDv8-LvU@|jTIq@k7Mvz~19GVqcKN0ixbfeB{Pl@GvddnuALt@$M@Rzsz102DRe`it^sY*LA_#l7L-q5uGt ivI4xy3}E8`0f-8KpaB5WfIL>Q#Ao{g000001X)_LymjjU diff --git a/tests/netloc/data/tests_draw.txt b/tests/netloc/data/tests_draw.txt deleted file mode 100644 index 9bd082dbe6..0000000000 --- a/tests/netloc/data/tests_draw.txt +++ /dev/null @@ -1,8 +0,0 @@ -draw: - testset: avakas plafrim plafrim2 - copy: %=txz - needed: %/netloc %/hwloc - excluded: $NETLOC_TEST/netloc/*json - command: $NETLOC_UTIL_PATH/draw/netloc_draw_to_json %/netloc - checkfiles: $NETLOC_TEST/netloc/*json - diff --git a/tests/netloc/data/tests_extract.txt b/tests/netloc/data/tests_extract.txt deleted file mode 100644 index 1936861582..0000000000 --- a/tests/netloc/data/tests_extract.txt +++ /dev/null @@ -1,7 +0,0 @@ -extract: - testset: avakas plafrim plafrim2 - copy: %=txz - needed: %/ib-raw - command: mkdir %/netloc; mkdir %/hwloc; $NETLOC_UTIL_PATH/infiniband/netloc_ib_extract_dats %/ib-raw %/netloc --hwloc-dir ../hwloc - checkfiles: %/netloc/*txt - diff --git a/tests/netloc/data/tests_mpiscotch.txt b/tests/netloc/data/tests_mpiscotch.txt deleted file mode 100644 index 338a4f8336..0000000000 --- a/tests/netloc/data/tests_mpiscotch.txt +++ /dev/null @@ -1,6 +0,0 @@ -rank_file: - testset: scotch - copy: scotch=txz plafrim2=txz - needed: % plafrim2/netloc/*txt plafrim2/hwloc - command: ./%/test_mpi_rank_file.sh - checkcommand: test -f test.rank && ! grep -vlP "^rank \d+=[^\s]+ slot=\d+$" test.rank diff --git a/tests/netloc/data/tests_scotch.txt b/tests/netloc/data/tests_scotch.txt deleted file mode 100644 index 7aaccea7d3..0000000000 --- a/tests/netloc/data/tests_scotch.txt +++ /dev/null @@ -1,7 +0,0 @@ -scotch_arch: - testset: scotch - copy: scotch=txz plafrim2=txz - needed: % plafrim2/netloc/*txt plafrim2/hwloc - command: ./%/test_scotch_get_arch.sh - checkfiles: ./%/subarch.scotch ./%/arch.scotch - diff --git a/tests/netloc/tests.sh.in b/tests/netloc/tests.sh.in deleted file mode 100644 index f1fb373197..0000000000 --- a/tests/netloc/tests.sh.in +++ /dev/null @@ -1,221 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright © 2016-2017 Inria. All rights reserved. -# See COPYING in top-level directory. -# - -# This script needs a test file as argument -# The syntax of this file is the following -# test1: -# testset: machine1 machine2 # subfolders where tests be run -# command: ./test1 param1 # command to test -# needed: dir1/file*txt dir2 # files needed -# excluded: dir1/file0.txt dir2/file1 # file to exclude -# checkfiles: dir2/file1 # files used to check validity -# checkscript: ./check.sh # script to check validity -# test2: -# ... - -export NETLOC_TESTS_PATH="@HWLOC_top_srcdir@/tests/netloc" -export NETLOC_BUILD_PATH="@HWLOC_top_builddir@/tests/netloc" -export NETLOC_UTIL_PATH="@HWLOC_top_builddir@/utils/netloc" - -origpwd="$(pwd)" - -red="\e[31m" -green="\e[32m" -default="\e[0m" - -function write_output -{ - color=$1 - shift - echo -e $color$@$default -} - -function quit -{ - write_output $red "Test failed" - rm -fr $TEMPDIR -} - -function getvalues -{ - for i in $@; do - echo "$params" | $SED -n "s/^[[:space:]]*$i:[[:space:]]*\(.*\)\$/\1/p" - done | tr '\n' ' ' -} - -function getCopies -{ - local t=$1 - local copies=$(getvalues copy copy_${t}) - for f in $copies; do - local name=$(echo $f | $SED 's/\([^=]*\)\(=.*\)\{0,1\}/\1/') - local ext=$(echo $f | $SED 's/\([^=]*\)\(=.*\)\{0,1\}/\2/') - if [ -z "$ext" ]; then - cp -r "$NETLOC_TESTS_PATH/data/$name" "$REFDIR" - chmod -R u+w $REFDIR - cp -r "$NETLOC_BUILD_PATH/data/$name" "$REFDIR" - chmod -R u+w $REFDIR - elif [ "$ext" = "=txz" ]; then - # TODO prevent from extracting it again - $COMPRESS -d --stdout "$NETLOC_TESTS_PATH/data/$name.txz" > "$REFDIR/$name.tar" - tar -xf "$REFDIR/$name.tar" -C "$REFDIR" - rm "$REFDIR/$name.tar" - fi - done -} - - -trap 'quit' 0 -set -e - -compress=xz -hash $compress 2>/dev/null || \ - { echo >&2 "It requires $compress but it's not installed."; exit 1; } -COMPRESS=$(which $compress) -GREP=$(which grep) -SED=$(which sed) -AWK=$(which awk) - -# Folder structure like that -# TEMPDIR -# ├── ref <- copy of the data directory -# │   ├── machine1 -# │   │   └── file1 -# │   └── machine2 -# │   └── file1 -# └── test -# └── file1 -TEMPDIR=$(mktemp -d -t netloc_tests_XXXXX) -TESTDIR=$TEMPDIR/tests -REFDIR=$TEMPDIR/ref && mkdir $REFDIR -TESTFILE=$REFDIR/$(basename $1); cp $NETLOC_TESTS_PATH/data/$(basename $1) $REFDIR - -# Remove comments from the test file -$SED 's/#.*$//g; /^[[:space:]]*$/d' $TESTFILE > $TESTFILE.new -mv -f $TESTFILE.new $TESTFILE - -# Get tests -tests=$($SED -n 's/^\([^[:space:]]*\):[[:space:]]*$/\1/p' $TESTFILE) - -S=0 -F=0 - -for t in $tests; do - params_sv=$($AWK '/^'$t':\s*$/{flag=1;next}; /^\S*:\s*$/{flag=0}; {if (flag) print}' $TESTFILE) - params="$params_sv" - sets=$(getvalues testset) - - # For each set to test - for s in $sets; do - NETLOC_TEST=$s - params="$(echo "$params_sv" | $SED 's/%/'$NETLOC_TEST'/g')" - mkdir $TESTDIR - cd $TESTDIR - - # Copy or extract files if needed - getCopies $s - - # Copy needed files - cd "$REFDIR" - needed=$(getvalues needed) - if [ -z "needed" ]; then - cp -r $s $TESTDIR - else - files=$(eval "echo \"$needed\"") - for f in $files; do - mkdir -p "$TESTDIR/$(dirname "$f")" - cp -r "$f" "$TESTDIR/$(dirname "$f")" - done - fi - - # Remove excluded files - cd "$TESTDIR" - excluded=$(getvalues excluded) - if [ -n "$excluded" ]; then - files=$(eval "echo \"$excluded\"") - for f in $files; do - rm -f "$f" - done - fi - - while true; do - # Remove output files - cd $TESTDIR - for cf in $checkfiles; do - files=$(eval "echo \"$cf\"") - for f in $files; do - rm -f "$f" - done - done - - # Execute the command - cd $TESTDIR - cmd=$(getvalues command) - eval " $cmd" > /dev/null || \ - { - eval "echo \"Command $cmd failed\"" - write_output $red "Test $t on $NETLOC_TEST failed!" - failed=1 - break - } - - # Check files - cd "$REFDIR" - checkfiles=$(getvalues checkfiles) - for cf in $checkfiles; do - files=$(eval "echo \"$cf\"") - for f in $files; do - cmp "$f" "$TESTDIR/$f" || \ - { - echo "$f: wrong file" - eval "echo \"Command was: $cmd\"" - write_output $red "Test $t on $NETLOC_TEST failed!" - failed=1 - break - } - done - done - if [ "$failed" = 1 ]; then break; fi - - # Check program - cd $TESTDIR - checkcmd=$(getvalues checkcommand) - eval " $checkcmd" > /dev/null || \ - { - echo "Check command failed: $checkcmd" - eval "echo \"Command was: $cmd\"" - write_output $red "Test $t on $NETLOC_TEST failed!" - failed=1 - break - } - - break - done - - cd "$origpwd" - rm -fr $TESTDIR - if [ -n "$failed" ]; then - ((F+=1)) - else - ((S+=1)) - fi - failed= - done -done - -if [[ $F -ne O ]]; then - color=$red - returncode=1 -else - color=$green - returncode=0 -fi -echo "### Summary ###" -write_output $color "$F tests failed" -write_output $green "$S tests succeeded" -trap 0 -rm -fr $TEMPDIR -exit $returncode diff --git a/utils/Makefile.am b/utils/Makefile.am index 5502b0d6af..f61703e736 100644 --- a/utils/Makefile.am +++ b/utils/Makefile.am @@ -4,11 +4,3 @@ # See COPYING in top-level directory. SUBDIRS = hwloc lstopo - -if BUILD_NETLOC -SUBDIRS += \ - netloc/infiniband \ - netloc/draw \ - netloc/mpi \ - netloc/scotch -endif diff --git a/utils/netloc/draw/Makefile.am b/utils/netloc/draw/Makefile.am deleted file mode 100644 index b60790172f..0000000000 --- a/utils/netloc/draw/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright © 2013-2014 Cisco Systems, Inc. All rights reserved. -# Copyright © 2013-2014 University of Wisconsin-La Crosse. -# All rights reserved. -# Copyright © 2016-2018 Inria. All rights reserved. -# -# See COPYING in top-level directory. -# -# $HEADER$ -# - -AM_CPPFLAGS = \ - -I$(top_builddir)/include \ - -I$(top_srcdir)/include - -bin_PROGRAMS = \ - netloc_draw_to_json - -netloc_draw_to_json_SOURCES = \ - netloc_draw_to_json.c - -netloc_draw_to_json_LDADD = \ - $(top_builddir)/netloc/libnetloc.la \ - $(top_builddir)/hwloc/libhwloc.la - -dist_pkgdata_DATA = \ - netloc_draw.html \ - netloc_draw.js \ - visdist/vis.min.js \ - visdist/vis.min.css diff --git a/utils/netloc/draw/netloc_draw.html b/utils/netloc/draw/netloc_draw.html deleted file mode 100644 index 9beb32f40f..0000000000 --- a/utils/netloc/draw/netloc_draw.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - Network topology - - - - - - - - - - - - - - - -

- -

-
-    
-    
-  
-
diff --git a/utils/netloc/draw/netloc_draw.js b/utils/netloc/draw/netloc_draw.js
deleted file mode 100644
index a649b55481..0000000000
--- a/utils/netloc/draw/netloc_draw.js
+++ /dev/null
@@ -1,1049 +0,0 @@
-var edges;
-var nodes;
-var links;
-var shownNodes;
-var shownEdges;
-var partitions;
-var mydata;
-var topos;
-const normalSwitchColor = {background: "grey"};
-const normalHostColor = {background: "red"};
-const normalEdgeColor = {color: "grey", highlight: "blue"};
-const paletteNone = ["red"];
-const palette9 = ["blue", "orange", "green", "pink", "brown", "purple", "yellow", "red", "gray"];
-const palette11 = ["#a6cee3", "#1f78b4", "#b2df8a", "#33a02c", "#fb9a99", "#e31a1c", "#fdbf6f",
-                   "#ff7f00", "#cab2d6", "#6a3d9a", "#ffff99"];
-var nodesWithPhysics;
-var edgesWithPhysics;
-var nodeBandwidthList;
-var edgeBandwidthList;
-var network;
-var description = "";
-const lastColorMode = "bandwidth";
-
-function filterEdge(e) {
-    return (shownNodes.get(e.to) && shownNodes.get(e.from));
-}
-
-function updateDescription() {
-    /* update the desciption of the graph */
-    var num_hosts = shownNodes.get({filter: function(n) {
-        return n.type == "host";
-    }}).length;
-    var num_switches = shownNodes.length-num_hosts;
-    var enabledTopos = shownNodes.distinct("topo");
-    var shownTopos = enabledTopos.reduce(function(a, e) {
-        if (e != -1)
-            a.push(topos[e]);
-        return a;
-    }, []);
-
-    description =
-        '

Stats

' + - shownNodes.length + ' nodes\n' + - shownEdges.length + ' edges\n' + - num_hosts + ' hosts\n' + - num_switches + ' switches\n' + - '

Partitions

' + - '
  • ' + partitions.join('
  • ') + '
' + - '

Hwloc topologies

' + - '
  • ' + shownTopos.sort().join('
  • ') + '
' + - '
'; - document.getElementById('description').innerHTML = description; -} - -function printWithTime(msg) { - if (typeof printWithTime.lastTime == 'undefined' ) { - printWithTime.lastTime = Math.floor(new Date().getTime()/1000); - } - - var time = Math.floor(new Date().getTime()/1000); - var duration = time-printWithTime.lastTime; - printWithTime.lastTime = time; - console.log(msg); - console.log(duration + "s elapsed"); -} - -function handleFileSelect(evt) { - var files = evt.target.files; - var fr = new FileReader(); - fr.onload = function(e) { - printWithTime("Starting..."); - data = e.target.result; - loadFile(data); - }; - fr.readAsText(files[0]); -} - -function renameKey(obj, newkey, oldkey) -{ - return obj.map(function(d) { d[newkey] = d[oldkey]; delete d[oldkey]; return d; }); -} - -function getNeighbours(node) -{ - return node.edges.map(function(e) { - return edges.get(e).to; - }).filter(function(n) { - return shownNodes.get(n); - }); -} - -function palette(size) { - var palette = []; - - if (!size) - return paletteNone; - - if (size <= 9) - return palette9.slice(0, size+1); - - if (size <= 11) - return palette11.slice(0, size+1); - - var v = Math.ceil(Math.pow(size+1, 1/3)); - var value = 255/v; - for( var rStep = 0, r = 0; rStep < v; rStep++) { - for( var gStep = 0, g = 0; gStep < v; gStep++ ) { - for( var bStep = 0, b = 0; bStep < v; bStep++ ) { - if (!r && !g && !b) - continue; - palette.push('rgb(' + Math.round(r) + ', ' + Math.round(g) + ', ' - + Math.round(b) + ')'); - b += value; - } - g += value; - } - r += value; - } - return palette; -} - -function loadFile(data) -{ - printWithTime("File loaded"); - mydata = JSON.parse(data); - printWithTime("JSON parsed"); - partitions = mydata.partitions; - topos = mydata.hwloctopos; - - /* Prepare UI */ - /***********************************************************************/ - /* Add elements to selectColors */ - var selectColors = document.getElementById("selectColors"); - while (selectColors.length > 1) { - selectColors.removeChild(selectColors.lastChild); - } - { - var el = document.createElement("option"); - el.textContent = "normal"; - el.value = "normal"; - selectColors.appendChild(el); - } - if (partitions.length) { - var el = document.createElement("option"); - el.textContent = "partition"; - el.value = "partition"; - selectColors.appendChild(el); - } - if (topos.length) { - var el = document.createElement("option"); - el.textContent = "hwloc"; - el.value = "hwloc"; - selectColors.appendChild(el); - } - { - var el = document.createElement("option"); - el.textContent = "bandwidth"; - el.value = "bandwidth"; - selectColors.appendChild(el); - } - { - var el = document.createElement("option"); - el.textContent = "bandwidth_check"; - el.value = "bandwidth_check"; - selectColors.appendChild(el); - } - - /* Add elements to selectPartition */ - var selectPartition = document.getElementById("selectPartition"); - while (selectPartition.length > 1) { - selectPartition.removeChild(selectPartition.lastChild); - } - var partitionOptions = partitions.slice(); - partitionOptions.unshift("All"); - partitionOptions.forEach(function(partition, i) { - var el = document.createElement("option"); - el.textContent = partition; - el.value = i-1; // because of "All" - selectPartition.appendChild(el); - }); - /***********************************************************************/ - - /* Set edges */ - /***********************************************************************/ - mydata.edges.map( - function(e) {e["label"] = Math.round(parseFloat(e["gbits"]));}); - var gbits_min = Math.min.apply(null, mydata.edges.map(function(e) { return e["gbits"];})); - mydata.edges.map( - function(e) {e["width"] = e["gbits"]/gbits_min; e["physics"] = false;}); - edges = new vis.DataSet({}); - edges.add(mydata.edges); - printWithTime("Dataset edges created"); - /***********************************************************************/ - - /* Set nodes */ - /***********************************************************************/ - mydata.nodes = renameKey(mydata.nodes, "title", "desc"); - mydata.nodes.forEach( function(n) { - n["color"] = n["type"] == "host" ? normalHostColor : normalSwitchColor; - n["bandwidth"] = - edges.get(n["edges"]).map(function(e) { if (!e) return 8; else return e.gbits; }) - .reduce(function(a, b) { return a + b; }, 0); - n["size"] = 10*Math.log(n["bandwidth"]); - n["x"] = n["y"] = 0; - if (mydata.type === "tree") { - n["fixed"] = true; - n["physics"] = true; - } - }); - nodes = new vis.DataSet({}); - nodes.add(mydata.nodes); - printWithTime("Dataset nodes created"); - /***********************************************************************/ - - /* Set links */ - /***********************************************************************/ - links = new vis.DataSet({}); - links.add(mydata.links); - printWithTime("Dataset links created"); - /***********************************************************************/ - - /* Build list of width for nodes */ - nodeBandwidthList = []; - nodes.forEach(function(n) { - if (nodeBandwidthList.indexOf(n.size) == -1) { - nodeBandwidthList.push(n.size); - } - }); - /* Build list of width for edges */ - edgeBandwidthList = []; - edges.forEach(function(e) { - if (edgeBandwidthList.indexOf(e.gbits) == -1) { - edgeBandwidthList.push(e.gbits); - } - }); -} - -function nodeColors() -{ - var e = document.getElementById("selectColors"); - var colorMode = e.options[e.selectedIndex].value; - - if (colorMode == "normal") { - shownNodes.forEach(function(n) { - if (n.type == "host") - shownNodes.update({id: n.id, color: normalHostColor}); - else - shownNodes.update({id: n.id, color: normalSwitchColor}); - }); - - if (lastColorMode == "bandwidth" || lastColorMode == "bandwidth_check") { - shownEdges.forEach(function(n) { - shownEdges.update({id: n.id, color: normalEdgeColor}); - }); - } - - } else if (colorMode == "partition") { - var nodeColors = palette(partitions.length); - shownNodes.forEach(function(n) { - if (n.type == "host") { - var colorIdx = n.part[0]; - shownNodes.update({id: n.id, color: {background: nodeColors[colorIdx]}}); - - } else - shownNodes.update({id: n.id, color: normalSwitchColor}); - }); - - if (lastColorMode == "bandwidth" || lastColorMode == "bandwidth_check") { - shownEdges.forEach(function(n) { - shownEdges.update({id: n.id, color: normalEdgeColor}); - }); - } - - } else if (colorMode == "hwloc") { - var nodeColors = palette(topos.length); - shownNodes.forEach(function(n) { - if (n.type == "host") { - var colorIdx = n.topo; - if (colorIdx != -1) { - shownNodes.update({id: n.id, color: {background: nodeColors[colorIdx]}}); - } - - } else - shownNodes.update({id: n.id, color: normalSwitchColor}); - }); - - if (lastColorMode == "bandwidth" || lastColorMode == "bandwidth_check") { - shownEdges.forEach(function(n) { - shownEdges.update({id: n.id, color: normalEdgeColor}); - }); - } - - } else if (colorMode == "bandwidth") { - var nodeColors = palette(nodeBandwidthList.length); - shownNodes.forEach(function(n) { - var colorIdx = nodeBandwidthList.indexOf(n.size); - if (colorIdx != -1) { - shownNodes.update({id: n.id, color: {background: nodeColors[colorIdx]}}); - } - }); - var edgeColors = palette(edgeBandwidthList.length); - shownEdges.forEach(function(n) { - var colorIdx = edgeBandwidthList.indexOf(n.gbits); - if (colorIdx != -1) { - shownEdges.update({id: n.id, color: {color: edgeColors[colorIdx]}}); - } - }); - - } else if (colorMode == "bandwidth_check") { - var edgeColors = palette(edgeBandwidthList.length); - shownEdges.forEach(function(n) { - var colorIdx = edgeBandwidthList.indexOf(n.gbits); - if (colorIdx != -1) { - shownEdges.update({id: n.id, color: {color: edgeColors[colorIdx]}}); - } - }); - shownNodes.forEach(function(n) { - /* Quick check about in bw = out bd */ - if (n.edges.length == 1) { - var colorIdx = edgeBandwidthList.indexOf(n.bandwidth); - shownNodes.update({id: n.id, color: {background: edgeColors[colorIdx]}}); - - } else { - var colorIdx = edgeBandwidthList.indexOf(n.bandwidth/2); - if (colorIdx != -1) { - shownNodes.update({id: n.id, color: {background: edgeColors[colorIdx]}}); - } else { - shownNodes.update({id: n.id, color: {background: "black"}}); - } - } - }); - } - lastcolorMode = colorMode; -} - -function selectNodesAndEdges(field, value) -{ - var regexp = new RegExp(value, "g"); - var nodeIds; - var nodeSet; - var edgeIds; - var edgeSet; - - switch (field) { - case "part": - var strings = partitions; - matchingStrings = strings.reduce(function(a, e, i) { - if (e.match(regexp)) - a.push(i); - return a; - }, []); - nodeSet = shownNodes.get({filter: function(n) { - for (var e = 0; e < n[field].length; e++) { - var elem = n[field][e]; - for (var f = 0; f < matchingStrings.length; f++) { - if (elem == matchingStrings[f]) - return true; - } - } - return false; - }}); - edgeSet = shownEdges.get({filter: function(n) { - for (var e = 0; e < n[field].length; e++) { - var elem = n[field][e]; - for (var f = 0; f < matchingStrings.length; f++) { - if (elem == matchingStrings[f]) - return true; - } - } - return false; - }}); - break; - case "topo": - var strings = topos; - matchingStrings = strings.reduce(function(a, e, i) { - if (e.match(regexp)) - a.push(i); - return a; - }, []); - nodeSet = shownNodes.get({filter: function(n) { - var elem = n[field]; - for (var f = 0; f < matchingStrings.length; f++) { - if (elem == matchingStrings[f]) - return true; - } - return false; - }}); - edgeSet = []; - break; - default: - nodeSet = shownNodes.get({filter: function(n) { - return n[field] ? n[field].toString().match(regexp): false; - }}); - edgeSet = shownEdges.get({filter: function(e) { - return e[field] ? e[field].toString().match(regexp): false; - }}); - } - nodeIds = nodeSet.map(function(n) { return n.id; }); - edgeIds = edgeSet.map(function(e) { return e.id; }); - - network.setSelection({edges: edgeIds, nodes: nodeIds}, {highlightEdges: false}); - showSelectedNodes(); -} - -function showSelectedEdges() -{ - var infos = ""; - - var edgeIds = network.getSelectedEdges(); - var nodeIds = network.getSelectedNodes(); - - infos += '

' + edgeIds.length + ' edges selected

'; - if (!nodeIds.length) { - var neighbours = []; - edgeIds.forEach(function(edgeId, id) { - var edge = edges.get(edgeId); - var dest = nodes.get(edge.to); - var src = nodes.get(edge.from); - - infos += '

edge #' + (id+1) + '

' + - 'ID: ' + edge.id + '\n' + - 'Partitions: ' + edge.part.map(function(p){return partitions[p]}) - .join(', ') + '\n' + - '\t' + src.title + '(' + src.id + ') - ' + - dest.title + '(' + dest.id + '): ' + - edge.label + 'Gb\n'; - - var edgeLinks = edge.links; - edgeLinks.forEach(function(linkId) { - var link = links.get(linkId); - infos += '\t\tlink ' + linkId + ' (' - + link.src_port + '->' + link.dst_port + '):' - + link.gbits + 'Gb\n'; - }); - }); - } - document.getElementById('desc_selected').innerHTML += infos; -} - -function showSelectedNodes() -{ - document.getElementById('desc_selected').innerHTML = ''; - var infos = ""; - - var edgeIds = network.getSelectedEdges(); - var nodeIds = network.getSelectedNodes(); - - var neighbourLists = []; - var similarNeighbours = null; - if (nodeIds.length) { - infos += '

' + nodeIds.length + ' nodes selected

'; - - var inputNodes = shownNodes.get(nodeIds); - inputNodes.forEach(function(node) { - var nodeEdges = node.edges; - var neighbourText = []; - var neighbours = []; - - nodeEdges.forEach(function(edgeId) { - var edge = edges.get(edgeId); - var dest = nodes.get(edge.to); - - var s = '\t' + dest.title + ' (' + dest.id + ') - edgeId ' - + edgeId + ': ' + edge.label + 'Gb\n'; - - var edgeLinks = edge.links; - edgeLinks.forEach(function(linkId) { - var link = links.get(linkId); - s += '\t\tlink ' + linkId + ' (' - + link.src_port + '->' + link.dst_port + '):' - + link.gbits + 'Gb\n'; - }); - neighbourText.push(s); - neighbours.push(dest.id); - }); - - sub = node.sub.map(function(s) { - return nodes.get(s).title; - }); - - infos += - '

' + node.title + '

' + - 'ID: ' + node.id + ' Hostname: ' + node.hostname + '\n' + - 'Partitions: ' + node.part.map(function(p){return partitions[p]}) - .join(', ') + '\n' + - 'Subnodes: ' + sub.join(', ') + '\n' + - neighbourText.length + ' neighbours:\n' + neighbourText.sort().join('') + - 'Total bandwidth: ' + node.bandwidth + '\n' + - ((node.topo != -1) ? ('Hwloc topology: ' + topos[node.topo]): ''); - - if (!similarNeighbours) { - similarNeighbours = neighbours; - } else { - similarNeighbours = similarNeighbours.filter(function(n) { - return neighbours.indexOf(n) != -1; - }); - } - neighbourLists.push(neighbours); - }); - } - - if (nodeIds.length > 1) { - var s = []; - similarNeighbours.forEach(function(n) { - s.push('\t' + nodes.get(n).title + '\n'); - }); - infos += - '

Similar neighbours

' + - similarNeighbours.length + ' similar neighbours:\n' + s.sort().join(''); - infos += - '

Specific neighbours

'; - nodeIds.forEach(function(n, idx) { - infos += '\t' + shownNodes.get(n).title + ": " + - neighbourLists[idx] - .filter(function(n) - {return similarNeighbours.indexOf(n) < 0;}) - .map(function(n) - {return shownNodes.get(n).title;}) - .sort().join(', ') + - '\n'; - }); - } - - document.getElementById('desc_selected').innerHTML += infos; -} - -function search() -{ - var selectSearch = document.getElementById("selectSearch"); - var field = selectSearch.options[selectSearch.selectedIndex].value; - - if (field == "") { - - } else { - var searchValue = document.getElementById("searchValue"); - var value = searchValue.value; - selectNodesAndEdges(field, value); - } -} - -function draw() -{ - printWithTime("Draw"); - var selectPartition = document.getElementById("selectPartition"); - var partition = parseInt( - selectPartition.options[selectPartition.selectedIndex].value); - - var subNodes = new vis.DataSet(nodes.get({filter: function (n) { return n.merged == 0 }})); - printWithTime("Nodes filtered"); - - var subEdges; - if (partition == -1) { // for "All" - shownNodes = subNodes; - subEdges = new vis.DataSet(edges.get({filter: filterEdge})); - } else { - shownNodes = new vis.DataSet(subNodes.get({filter: function (n) { - return n.part.indexOf(partition) > -1; - }})); - subEdges = new vis.DataSet(edges.get({filter: function (e) { - return shownNodes.get(e.to) && shownNodes.get(e.from) - && e.part.indexOf(partition) > -1; - }})); - } - printWithTime("subdatasets created"); - - /* Keep edges in only one way */ - shownEdges = new vis.DataSet(subEdges.get({filter: function (e) { - //return (subNodes.get(e.from) && subNodes.get(e.from).type != "host"); // DEBUG XXX - /* We'd rather keep the edge where e.from > e.to, so we would keep the - ones from virtual nodes which would ease the expansion. - */ - if (e.from > e.to) { - if (!subEdges.get(e.reverse)) { - e.arrows = {to: true}; - } - return true; - - } else if (!subEdges.get(e.reverse)) { - e.arrows = {to: true}; - return true; - - } else - return false; - }})); - printWithTime("Edges filtered (keep one way)"); - - var physicsEnabled = true; - var selectColor = document.getElementById("selectColors"); - var colorMode = - selectColor.options[selectColor.selectedIndex].value; - if (colorMode != "") - nodeColors(); - else - selectColor.selectedIndex = 1; - - updateDescription(); - printWithTime("Description updated"); - - /* Set nodes positions */ - if (mydata.type === "tree"){ - physicsEnabled = false; - var stack = []; - var current_ring; - var node_pool = new vis.DataSet(shownNodes.get().map( function (n) { - n.crt_nedges = getNeighbours(n).length; - n.subtreeSize = n.size * Math.PI * 2; - n.initAngle = 0; - return n; - })); - while (0 < node_pool.length) { - current_ring = node_pool.get({filter: function (n) { return 1 >= n.crt_nedges }}); - if (current_ring.length > 0) { - node_pool.remove(current_ring); - current_ring.forEach( function (node) { - node_pool.get( - getNeighbours(node), - {returnType: 'Array', filter: function (nbg) { return null !== nbg }} - ).forEach( function (nbg) { - nbg.subtreeSize += node.subtreeSize / 2 / Math.PI * 2.3; - nbg.crt_nedges--; - node_pool.update(nbg); - }); - }); - } else { - /* tree "root" is made of multiple nodes */ - /* Step 1: Extract any node not connected to the last - * saved stack level. - */ - var substack = []; - current_ring = node_pool.get({filter: function (n) { - return 0 === stack[stack.length-1].get( - getNeighbours(n), - {returnType: 'Array', - filter: function (nbg) { return null !== nbg } - }).length}}); - node_pool.remove(current_ring); - substack.push(new vis.DataSet(current_ring)); - current_ring.forEach( function (n) { - node_pool.get(getNeighbours(n),{ - returnType:'Array', - filter: function (nbg) { return null !== nbg } - }).forEach( function (nbg) { - nbg.crt_nedges--; - node_pool.update(nbg); - }); - }); - while (current_ring.length > 0) { - current_ring = substack[substack.length-1].get({ - filter: function (n) { - return 0 === substack[substack.length-1].get( - getNeighbours(n), - {returnType: 'Array', - filter: function (nbg) { return null !== nbg } - }).length}}); - if (current_ring.length > 0) { - substack[substack.length-1].remove(current_ring); - substack.push(new vis.DataSet(current_ring)); - } - } - /* Step 2: Consider nodes with highest neighbors in - * remaining pool to be closer to the root. - */ - var max_nedges = node_pool.get() - .reduce(function (r, n) { - return Math.max(r, n.crt_nedges) - }, -Infinity); - while(max_nedges > 0) { - current_ring = node_pool.get({ - filter: function(n){ return max_nedges <= n.crt_nedges } - }); - node_pool.remove(current_ring); - substack.push(new vis.DataSet(current_ring)); - current_ring.forEach( function (n) { - node_pool.get(getNeighbours(n),{ - returnType:'Array', - filter: function (nbg) { return null !== nbg } - }).forEach( function (nbg) { - nbg.crt_nedges--; - node_pool.update(nbg); - }); - }); - max_nedges = node_pool.get() - .reduce( function (r,n) { - return Math.max(r,n.crt_nedges) - }, -Infinity); - } - - if (node_pool.length > 0) { /* Add remaining nodes */ - current_ring = node_pool.get({returnType: 'Array'}); - node_pool.remove(current_ring); - substack.push(new vis.DataSet(current_ring)); - } - /* Propagate subtree sizes */ - while(substack.length > 1) { - var sons = substack.pop(); - sons.get({returnType: 'Array'}).forEach( function (n) { - substack[substack.length-1].get(getNeighbours(n), { - returnType:'Array', - filter: function (nbg) { return null !== nbg } - }).forEach( function (nbg) { - nbg.subtreeSize += n.subtreeSize / 2 / Math.PI * 2.3; - substack[substack.length-1].update(nbg); - }); - }); - stack.push(sons); - } - current_ring = substack.pop().get({returnType: 'Array'}); - } - stack.push(new vis.DataSet(current_ring)); - } - printWithTime("Tree built"); - /* If root is made of multiple nodes, separate them around 0 */ - if (stack[stack.length-1].length > 1) { - /* Step 3: Display multiple root around 0, and - * corresponding subtrees around as a single circle. - */ - var ds = stack.pop(); - var subtreeSize = ds.get().reduce( function (r, n) { - return r + n.size * 2 - }, 0) / 2 / Math.PI; - var subsubtreeSize = Math.max(ds.get().reduce( function (r, n) { - return r + n.subtreeSize / 2 / Math.PI - }, 0) / 3 / Math.PI,stack[stack.length-1].get().reduce( function (r, n) { - return r + n.size - }, 0) / Math.PI, subtreeSize * 2 * Math.PI); - if (stack.length == 1) { - var arrBig = ds.get().map(function (n) { - return {id: n.id, nb_neighbours: stack[stack.length-1].get(getNeighbours(n), { - returnType: 'Array', - filter: function(nbg) { return null !== nbg && nbg.x === 0 && nbg.y === 0} - }).length} - }).sort(function (a,b) { - return a.nb_neighbours < b.nb_neighbours ? -1 - : a.nb_neighbours > b.nb_neighbours ? 1 : 0; - }); - var arrSmall = arrBig.splice(ds.length/2,ds.length/2).reverse(); - var arrOrdered = []; - for (var i=0, l=arrSmall.length; i= node.edges.length) { - nodesWithPhysics.push(edge.to); - shownNodes.update({id: edge.to, physics: true, fixed: false}); - } - var node = shownNodes.get(edge.from); - if (1 >= node.edges.length) { - nodesWithPhysics.push(edge.from); - shownNodes.update({id: edge.from, physics: true, fixed: false}); - } - }); - }); - network.on("dragEnd", function (params) { - edgesWithPhysics.forEach(function(edgeWithPhysic) { - shownEdges.update({id: edgeWithPhysic, physics: false, fixed: true}); - }); - nodesWithPhysics.forEach(function(nodeWithPhysic) { - shownNodes.update({id: nodeWithPhysic, physics: false, fixed: true}); - }); - }); - } - - network.on("stabilizationIterationsDone", function () { - //network.setOptions({ - // nodes: {physics: false}, - // edges: {physics: false}, - // layout: {improvedLayout: false}, - //}); - shownEdges.getIds().forEach(function(e) { - shownEdges.update({id: e, physics: false}); - }); - shownNodes.getIds().forEach(function(n) { - shownNodes.update({id: n, physics: false}); - }); - }); -} - -function expandSelected() -{ - nodeIds = network.getSelectedNodes(); - nodeIds.forEach(function(n) { - // TODO - node = shownNodes.get(n); - neighbours = getNeighbours(node); - - /* Physics enabled for neighbours */ - neighbours.forEach(function(nbg) { - printWithTime(nbg + " -> physics"); - shownNodes.update({id: nbg, physics: true, fixed: true}); - }); - - /* The selected nodes are removed (then replaced) */ - shownEdges.remove(node.edges); - printWithTime(shownNodes.remove(node) + " -> removed"); - var selectedNodes = []; - node.sub.forEach(function(s) { - subnode = nodes.get(s); - subnode.physics = false; - shownNodes.add(subnode); - shownEdges.add(edges.get(subnode.edges), {filter: filterEdge}); - selectedNodes.push(subnode.id); - }); - network.selectNodes(selectedNodes); - showSelectedNodes(); - }); - updateDescription(); -} - -function mergeNode(node) -{ - // TODO -} - -function prepareImage() -{ - function export_SVG() { - - function Node (x, y, r, c) { - var cx, cy, radius, fill; - this.node = document.createElementNS('http://www.w3.org/2000/svg','circle'); - this.attribute = function (key,val) { - if (val === undefined) return this.node.getAttribute(key); - this.node.setAttribute(key,val); - return val; - } - this.getCoord = function () {return {cx: cx, cy: cy}} - this.setCoord = function (obj) { - if (undefined === obj) return; - cx = this.attribute('cx', obj.cx); - cy = this.attribute('cy', obj.cy); - } - this.getSize = function () {return r} - this.setSize = function (r) {radius = this.attribute('r', r)} - this.getColor = function () {return fill} - this.setColor = function (c) {fill = this.attribute('fill', c)} - // Init - cx = this.attribute.apply(this, ['cx', x]); - cy = this.attribute.apply(this, ['cy', y]); - radius = this.attribute.apply(this, ['r', r]); - fill = this.attribute.apply(this, ['fill', c]); - } - - function Edge (x1, y1, x2, y2, w, c, l) { - var from, to, width, label, color; - this.edge = document.createElementNS('http://www.w3.org/2000/svg','line'); - this.attribute = function (key,val) { - if (val === undefined) return this.edge.getAttribute(key); - this.edge.setAttribute(key,val); - return val; - } - this.style = function (key,val) { - if (undefined === val) return this.edge.style[key]; - this.edge.style[key] = val; - return val; - } - this.getCoords = function () {return {from: from, to: to}} - this.setCoords = function (obj) { - if (undefined === obj) return; - from.x = this.attribute('x1', obj.from === undefined ? undefined : obj.from.x); - from.y = this.attribute('y1', obj.from === undefined ? undefined : obj.from.y); - to.x = this.attribute('x2', obj.to === undefined ? undefined : obj.to.x); - to.y = this.attribute('y2', obj.to === undefined ? undefined : obj.to.y); - } - this.getWidth = function () {return width} - this.setWidth = function (w) {width = this.style('stroke-width', w)} - this.getColor = function () {return color} - this.setColor = function (color) {fill = this.style('stroke', color)} - // TO BE ADDED: label - // Init - from = {x: this.attribute.apply(this, ['x1', x1]), - y: this.attribute.apply(this, ['y1', y1])}; - to = {x: this.attribute.apply(this, ['x2', x2]), - y: this.attribute.apply(this, ['y2', y2])}; - width = this.style.apply(this, ['stroke-width', w]); - color = this.style.apply(this, ['stroke', c]); - label = l - } - - var nodeArr = shownNodes.get(); - var bounds = nodeArr.reduce( function (bounds, node) { - return {minx: Math.min(bounds.minx, node.x), maxx: Math.max(bounds.maxx, node.x), - miny: Math.min(bounds.miny, node.y), maxy: Math.max(bounds.maxy, node.y), - maxr: Math.max(bounds.maxr, node.size)}; - }, {minx: Infinity, miny: Infinity, maxx: -Infinity, maxy: -Infinity, maxr: -Infinity}); - var SVGCanvas = document.createElementNS('http://www.w3.org/2000/svg','svg'); - SVGCanvas.setAttribute('version', '1.1'); - SVGCanvas.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); - SVGCanvas.setAttribute('width', bounds.maxx - bounds.minx + 2 * bounds.maxr); - SVGCanvas.setAttribute('height', bounds.maxy - bounds.miny + 2 * bounds.maxr); - shownEdges.get().map( function (edge) { - return {from: shownNodes.get(edge.from), to: shownNodes.get(edge.to), - width: edge.width, color: edge.color.color, label: edge.label}; - }).forEach( function (obj) { - SVGCanvas.appendChild(new Edge(obj.from.x - bounds.minx + bounds.maxr, - obj.from.y - bounds.miny + bounds.maxr, - obj.to.x - bounds.minx + bounds.maxr, - obj.to.y - bounds.miny + bounds.maxr, - obj.width, obj.color, obj.label ).edge); - }); - nodeArr.forEach( function (node) { - SVGCanvas.appendChild(new Node(node.x - bounds.minx + bounds.maxr, - node.y - bounds.miny + bounds.maxr, - node.size, node.color.background).node); - }); - // Return text version of complete SVG image - return document.createElement('div').appendChild(SVGCanvas).parentNode.innerHTML; - } - - var img = btoa(export_SVG()); - var link = document.createElement('a'); - link.setAttribute('href-lang', 'image/svg+xml'); - link.setAttribute('href', 'data:image/svg+xml;base64,\n'+img); - link.setAttribute('title', 'netloc_draw.svg'); - link.appendChild(document.createTextNode("image")); - document.getElementById('imageLink').appendChild(link); -} diff --git a/utils/netloc/draw/netloc_draw_to_json.c b/utils/netloc/draw/netloc_draw_to_json.c deleted file mode 100644 index 060a567dc6..0000000000 --- a/utils/netloc/draw/netloc_draw_to_json.c +++ /dev/null @@ -1,628 +0,0 @@ -/* - * Copyright © 2016-2017 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include -#include -#include -#include -#include -#include - -#include "private/netloc.h" -#include "netloc.h" - -#define JSON_DRAW_FILE_LINK_ID "id" -#define JSON_DRAW_FILE_LINK_SRC "from" -#define JSON_DRAW_FILE_LINK_SRC_PORT "src_port" -#define JSON_DRAW_FILE_LINK_DST "to" -#define JSON_DRAW_FILE_LINK_DST_PORT "dst_port" -#define JSON_DRAW_FILE_LINK_WIDTH "width" -#define JSON_DRAW_FILE_LINK_SPEED "speed" -#define JSON_DRAW_FILE_LINK_GBITS "gbits" -#define JSON_DRAW_FILE_LINK_OTHER_WAY "reverse" -#define JSON_DRAW_FILE_LINK_PARTITIONS "part" -#define JSON_DRAW_FILE_EDGE_ID "id" -#define JSON_DRAW_FILE_EDGE_SRC "from" -#define JSON_DRAW_FILE_EDGE_DST "to" -#define JSON_DRAW_FILE_EDGE_GBITS "gbits" -#define JSON_DRAW_FILE_EDGE_LINKS "links" -#define JSON_DRAW_FILE_EDGE_PARTITIONS "part" -#define JSON_DRAW_FILE_EDGE_SUBEDGES "subedges" -#define JSON_DRAW_FILE_EDGE_OTHER_WAY "reverse" -#define JSON_DRAW_FILE_NODE_ID "id" -#define JSON_DRAW_FILE_NODE_EDGES "edges" -#define JSON_DRAW_FILE_NODE_MERGED "merged" -#define JSON_DRAW_FILE_NODE_SUBNODES "sub" -#define JSON_DRAW_FILE_NODE_PARTITIONS "part" -#define JSON_DRAW_FILE_NODE_DESC "desc" -#define JSON_DRAW_FILE_NODE_HOSTNAME "hostname" -#define JSON_DRAW_FILE_NODE_HWLOCTOPO "topo" -#define JSON_DRAW_FILE_NODE_EDGES "edges" -#define JSON_DRAW_FILE_NODE_TYPE "type" -#define JSON_DRAW_FILE_EDGES_LIST "list" -#define JSON_DRAW_FILE_PATH_ID "id" -#define JSON_DRAW_FILE_PATH_LINKS "links" -#define JSON_DRAW_FILE_PATHS "paths" - -#define JSON_DRAW_FILE_GRAPH_TYPE "type" -#define JSON_DRAW_FILE_NODES "nodes" -#define JSON_DRAW_FILE_EDGES "edges" -#define JSON_DRAW_FILE_LINKS "links" -#define JSON_DRAW_FILE_PARTITIONS "partitions" -#define JSON_DRAW_FILE_HWLOCTOPOS "hwloctopos" - -/******************************************************************************/ -/* Functions to handle JSON */ -/******************************************************************************/ -typedef enum { - JSON_STRING, - JSON_INT, - JSON_FLOAT, - JSON_ARRAY, - JSON_DICT -} json_type; - -typedef struct { - int num; - int allocated; - char **strings; -} contents_t; - -typedef struct { - json_type type; - contents_t *contents; -} json_t; - -static contents_t *contents_new(int allocated) -{ - contents_t *contents = (contents_t *)malloc(sizeof(contents_t)); - contents->strings = (char **)malloc(sizeof(char *[allocated])); - contents->allocated = allocated; - contents->num = 0; - return contents; -} - -static void contents_add(contents_t *contents, char *string) -{ - if (contents->num == contents->allocated) { - if (contents->allocated) - { - char **new_strings = (char **) - realloc(contents->strings, sizeof(char *[2*contents->allocated])); - if (!new_strings) - return; - contents->strings = new_strings; - contents->allocated *= 2; - } else { - contents->strings = (char **) malloc(sizeof(char *[1])); - if (!contents->strings) - return; - contents->allocated = 1; - } - } - contents->strings[contents->num] = string; - contents->num++; -} - -static void contents_destruct(contents_t *contents) -{ - free(contents->strings); - free(contents); -} - -static void contents_cat(contents_t *dest, contents_t *src) -{ - int size = src->num; - if (dest->num+size > dest->allocated) { - if (dest->allocated) - { - dest->strings = (char **) - realloc(dest->strings, sizeof(char *[dest->allocated+size])); - dest->allocated += size; - } else { - dest->strings = (char **) - realloc(dest->strings, sizeof(char *[size])); - dest->allocated = size; - } - } - memcpy(&dest->strings[dest->num], src->strings, sizeof(char *[src->num])); - dest->num += src->num; -} - -static void json_close_object(json_t *object) -{ - switch (object->type) { - case JSON_ARRAY: - contents_add(object->contents, strdup("]")); - break; - case JSON_DICT: - contents_add(object->contents, strdup("}")); - break; - default: - ; - } -} -static contents_t *get_content_and_destroy(json_t *object) -{ - contents_t *contents = object->contents; - json_close_object(object); - free(object); - return contents; -} - -json_t *json_dict_new() -{ - json_t *dict = (json_t *)malloc(sizeof(json_t)); - dict->type = JSON_DICT; - dict->contents = contents_new(3); - contents_add(dict->contents, strdup("{")); - return dict; -} - -void json_dict_add(json_t *dict, char *field, json_t *child) -{ - assert(dict->type == JSON_DICT); - - if (dict->contents->num > 1) { - contents_add(dict->contents, strdup(",")); - } - char *field_string; - asprintf(&field_string, "\"%s\":", field); - contents_add(dict->contents, field_string); - contents_t *child_contents = get_content_and_destroy(child); - contents_cat(dict->contents, child_contents); - contents_destruct(child_contents); -} - -json_t *json_array_new() -{ - json_t *array = (json_t *)malloc(sizeof(json_t)); - array->type = JSON_ARRAY; - array->contents = contents_new(3); - contents_add(array->contents, strdup("[")); - return array; -} - -void json_array_add(json_t *array, json_t *child) -{ - assert(array->type == JSON_ARRAY); - - if (array->contents->num > 1) { - contents_add(array->contents, strdup(",")); - } - contents_t *child_contents = get_content_and_destroy(child); - contents_cat(array->contents, child_contents); - contents_destruct(child_contents); -} - -json_t *json_string_new(char *value) -{ - json_t *string = (json_t *)malloc(sizeof(json_t)); - string->type = JSON_STRING; - string->contents = contents_new(1); - - char *new_value; - asprintf(&new_value, "\"%s\"", value); - contents_add(string->contents, new_value); - return string; -} - -json_t *json_int_new(int value) -{ - json_t *integer = (json_t *)malloc(sizeof(json_t)); - integer->type = JSON_INT; - integer->contents = contents_new(1); - - char *new_value; - asprintf(&new_value, "%d", value); - contents_add(integer->contents, new_value); - return integer; -} - -json_t *json_float_new(float value) -{ - json_t *real = (json_t *)malloc(sizeof(json_t)); - real->type = JSON_FLOAT; - real->contents = contents_new(1); - - char *new_value; - asprintf(&new_value, "%f", value); - contents_add(real->contents, new_value); - return real; -} - -void json_write(FILE *file, json_t *object) -{ - json_close_object(object);; - for (int i = 0; i < object->contents->num; i++) { - fprintf(file, "%s", object->contents->strings[i]); - } -} - -void json_free(json_t *object) -{ - for (int i = 0; i < object->contents->num; i++) { - free(object->contents->strings[i]); - } - free(object->contents->strings); - free(object->contents); - free(object); -} - -/* End of JSON functions */ -/******************************************************************************/ - -static char *remove_quote(char *string) -{ - if (string[0] == '\'') - return strndup(string+1, strlen(string)-2); - else - return strndup(string, strlen(string)); -} - -static int handle_link(netloc_physical_link_t *link, json_t *json_links) -{ - //netloc_node_t *src, *dest; - char *src = link->src->physical_id; - char *dest = link->dest->physical_id; - - json_t *json_link = json_dict_new(); - json_dict_add(json_link, - JSON_DRAW_FILE_LINK_ID, json_int_new(link->id)); - json_dict_add(json_link, - JSON_DRAW_FILE_LINK_SRC, json_string_new(src)); - json_dict_add(json_link, - JSON_DRAW_FILE_LINK_SRC_PORT, json_int_new(link->ports[0])); - json_dict_add(json_link, - JSON_DRAW_FILE_LINK_DST, json_string_new(dest)); - json_dict_add(json_link, - JSON_DRAW_FILE_LINK_DST_PORT, json_int_new(link->ports[1])); - json_dict_add(json_link, - JSON_DRAW_FILE_LINK_WIDTH, json_string_new(link->width)); - json_dict_add(json_link, - JSON_DRAW_FILE_LINK_SPEED, json_string_new(link->speed)); - json_dict_add(json_link, - JSON_DRAW_FILE_LINK_GBITS, json_float_new(link->gbits)); - json_dict_add(json_link, - JSON_DRAW_FILE_LINK_OTHER_WAY, json_int_new(link->other_way_id)); - - json_t *json_partitions = json_array_new(); - - for (unsigned int p = 0; p < netloc_get_num_partitions(link); p++) - { - int partition = netloc_get_partition(link, p); - json_array_add(json_partitions, json_int_new(partition)); - } - json_dict_add(json_link, JSON_DRAW_FILE_LINK_PARTITIONS, json_partitions); - - json_array_add(json_links, json_link); - - return 0; -} - -static int handle_edge(netloc_edge_t *edge, json_t *json_edges) -{ - //netloc_node_t *src, *dest; - char *src = edge->node->physical_id; - char *dest = edge->dest->physical_id; - - json_t *json_edge = json_dict_new(); - - json_dict_add(json_edge, JSON_DRAW_FILE_EDGE_ID, json_int_new(edge->id)); - json_dict_add(json_edge, JSON_DRAW_FILE_EDGE_SRC, json_string_new(src)); - json_dict_add(json_edge, JSON_DRAW_FILE_EDGE_DST, json_string_new(dest)); - json_dict_add(json_edge, JSON_DRAW_FILE_EDGE_GBITS, json_float_new(edge->total_gbits)); - json_dict_add(json_edge, JSON_DRAW_FILE_EDGE_OTHER_WAY, json_int_new(edge->other_way->id)); - - /* Links */ - json_t *json_links = json_array_new(); - for (unsigned int l = 0; l < netloc_edge_get_num_links(edge); l++) - { - netloc_physical_link_t *link = netloc_edge_get_link(edge, l); - json_array_add(json_links, json_int_new(link->id)); - } - json_dict_add(json_edge, JSON_DRAW_FILE_EDGE_LINKS, json_links); - - /* Partition list */ - json_t *json_partitions = json_array_new(); - for (unsigned int p = 0; p < netloc_get_num_partitions(edge); p++) - { - int partition = netloc_get_partition(edge, p); - json_array_add(json_partitions, json_int_new(partition)); - } - json_dict_add(json_edge, JSON_DRAW_FILE_EDGE_PARTITIONS, json_partitions); - - /* Subnode edges */ - json_t *json_subedges = json_array_new(); - for (unsigned int s = 0; s < netloc_edge_get_num_subedges(edge); s++) - { - netloc_edge_t *subedge = netloc_edge_get_subedge(edge, s); - json_array_add(json_subedges, json_int_new(subedge->id)); - handle_edge(subedge, json_edges); - } - json_dict_add(json_edge, JSON_DRAW_FILE_EDGE_SUBEDGES, json_subedges); - - json_array_add(json_edges, json_edge); - - return 0; -} - -static int handle_node(netloc_node_t *node, json_t *json_nodes, - json_t *json_edges, int merged) -{ - char *id = node->physical_id; - char *desc = remove_quote(node->description); - char *hostname = node->hostname; - int topoIdx = node->hwlocTopoIdx; - - json_t *json_node = json_dict_new(); - json_dict_add(json_node, JSON_DRAW_FILE_NODE_ID, json_string_new(id)); - json_dict_add(json_node, JSON_DRAW_FILE_NODE_DESC, json_string_new(desc)); - json_dict_add(json_node, JSON_DRAW_FILE_NODE_HOSTNAME, json_string_new(hostname)); - json_dict_add(json_node, JSON_DRAW_FILE_NODE_HWLOCTOPO, json_int_new(topoIdx)); - json_dict_add(json_node, JSON_DRAW_FILE_NODE_MERGED, json_int_new(merged)); - - /* Subnodes */ - json_t *json_subnodes = json_array_new(); - for (unsigned int s = 0; s < netloc_node_get_num_subnodes(node); s++) - { - netloc_node_t *subnode = netloc_node_get_subnode(node, s); - handle_node(subnode, json_nodes, json_edges, 1); - json_array_add(json_subnodes, json_string_new(subnode->physical_id)); - } - json_dict_add(json_node, JSON_DRAW_FILE_NODE_SUBNODES, json_subnodes); - - /* Edges */ - json_t *json_edge_ids = json_array_new(); - netloc_edge_t *edge, *edge_tmp; - netloc_node_iter_edges(node, edge, edge_tmp) { - json_array_add(json_edge_ids, json_int_new(edge->id)); - handle_edge(edge, json_edges); - } - json_dict_add(json_node, JSON_DRAW_FILE_NODE_EDGES, json_edge_ids); - - /* Partitions */ - json_t *json_partitions = json_array_new(); - for (unsigned int p = 0; p < netloc_get_num_partitions(node); p++) - { - int partition = netloc_get_partition(node, p); - json_array_add(json_partitions, json_int_new(partition)); - } - json_dict_add(json_node, JSON_DRAW_FILE_NODE_PARTITIONS, json_partitions); - - if (netloc_node_is_host(node)) { - json_dict_add(json_node, JSON_DRAW_FILE_NODE_TYPE, json_string_new("host")); - } - else if (netloc_node_is_switch(node)) { - json_dict_add(json_node, JSON_DRAW_FILE_NODE_TYPE, json_string_new("switch")); - } - else { - json_dict_add(json_node, JSON_DRAW_FILE_NODE_TYPE, json_string_new("unknown")); - } - - json_array_add(json_nodes, json_node); - - free(desc); - return 0; -} - -static int handle_path(netloc_node_t *node, json_t *json_paths) -{ - char *id = node->physical_id; - - json_t *json_node_paths = json_dict_new(); - json_dict_add(json_node_paths, JSON_DRAW_FILE_PATH_ID, json_string_new(id)); - - /* Paths */ - json_t *json_path_list = json_array_new(); - netloc_path_t *path, *path_tmp; - netloc_node_iter_paths(node, path, path_tmp) { - json_t *json_node_path = json_dict_new(); - json_dict_add(json_node_path, JSON_DRAW_FILE_PATH_ID, - json_string_new(path->dest_id)); - - json_t *json_links = json_array_new(); - netloc_physical_link_t **plink; - netloc_path_iter_links(path,plink) { - json_array_add(json_links, json_int_new((*plink)->id)); - } - json_dict_add(json_node_path, JSON_DRAW_FILE_PATH_LINKS, - json_links); - json_array_add(json_path_list, json_node_path); - } - json_dict_add(json_node_paths, JSON_DRAW_FILE_PATHS, json_path_list); - - json_array_add(json_paths, json_node_paths); - - return 0; -} - -static int handle_partitions(netloc_topology_t *topology, json_t *json_partitions) -{ - char **ppartition; - netloc_topology_iter_partitions(topology, ppartition) { - json_array_add(json_partitions, json_string_new(*ppartition)); - } - return 0; -} - -static int handle_topos(netloc_topology_t *topology, json_t *json_topos) -{ - char **ptopo; - netloc_topology_iter_hwloctopos(topology, ptopo) { - json_array_add(json_topos, json_string_new(*ptopo)); - } - return 0; -} - -static int write_json(netloc_topology_t *topology, FILE *output) -{ - json_t *json_root = json_dict_new(); - - /* Graph type */ - json_dict_add(json_root, JSON_DRAW_FILE_GRAPH_TYPE, json_string_new("tree")); - - /* Nodes */ - json_t *json_nodes = json_array_new(); - json_t *json_edges = json_array_new(); - netloc_node_t *node, *node_tmp; - HASH_ITER(hh, topology->nodes, node, node_tmp) { - handle_node(node, json_nodes, json_edges, 0); - } - json_dict_add(json_root, JSON_DRAW_FILE_NODES, json_nodes); - json_dict_add(json_root, JSON_DRAW_FILE_EDGES, json_edges); - - /* Physical links */ - json_t *json_links = json_array_new(); - netloc_physical_link_t *link, *link_tmp; - HASH_ITER(hh, topology->physical_links, link, link_tmp) { - handle_link(link, json_links); - } - json_dict_add(json_root, JSON_DRAW_FILE_LINKS, json_links); - - /* Paths */ - json_t *json_paths = json_array_new(); - HASH_ITER(hh, topology->nodes, node, node_tmp) { - handle_path(node, json_paths); - } - json_dict_add(json_root, JSON_DRAW_FILE_PATHS, json_paths); - - /* Partitions */ - json_t *json_partitions = json_array_new(); - handle_partitions(topology, json_partitions); - json_dict_add(json_root, JSON_DRAW_FILE_PARTITIONS, json_partitions); - - /* Hwloc topologies */ - json_t *json_topos = json_array_new(); - handle_topos(topology, json_topos); - json_dict_add(json_root, JSON_DRAW_FILE_HWLOCTOPOS, json_topos); - - json_write(output, json_root); - json_free(json_root); - - return 0; -} - -static int netloc_to_json_draw(netloc_topology_t *topology) -{ - int ret; - static FILE *output; - char *node_uri = topology->topopath; - int basename_len = strlen(node_uri)-10; - char *basename = (char *)malloc((basename_len+1)*sizeof(char)); - char *draw; - - netloc_topology_read_hwloc(topology, 0, NULL); - - strncpy(basename, node_uri, basename_len); - basename[basename_len] = '\0'; - - asprintf(&draw, "%s-%s.json", basename, "draw"); - output = fopen(draw, "w"); - free(draw); - if (output == NULL) { - perror("fopen: "); - ret = NETLOC_ERROR; - goto ERROR; - } - - write_json(topology, output); - - ret = NETLOC_SUCCESS; - fclose(output); -ERROR: - free(basename); - - return ret; -} - -static char *read_param(int *argc, char ***argv) -{ - if (!*argc) - return NULL; - - char *ret = **argv; - (*argv)++; - (*argc)--; - - return ret; -} - -void help(char *name, FILE *f) -{ - fprintf(f, "Usage: %s \n", name); -} - -int main(int argc, char **argv) -{ - char *prog_name = basename(argv[0]); - - if (argc != 2) { - help(prog_name, stderr); - return -1; - } - read_param(&argc, &argv); - - char *param; - param = read_param(&argc, &argv); - - char *netlocpath; - if (!strcmp(param, "--help")) { - help(prog_name, stdout); - return 0; - } else { - netlocpath = param; - } - - DIR *netlocdir = opendir(netlocpath); - if (!netlocdir) { - fprintf(stderr, "Error: Cannot open the directory <%s>.\n", netlocpath); - return NETLOC_ERROR; - } - - struct dirent *dir_entry = NULL; - while ((dir_entry = readdir(netlocdir)) != NULL) { - char *topopath; -#ifdef _DIRENT_HAVE_D_TYPE - /* Skip directories if the filesystem returns a useful d_type. - * Otherwise, continue and let the actual opening will fail later. - */ - if( DT_DIR == dir_entry->d_type ) { - continue; - } -#endif - - /* Skip if does not end in .txt extension */ - if( NULL == strstr(dir_entry->d_name, "-nodes.txt") ) { - continue; - } - - asprintf(&topopath, "%s/%s", netlocpath, dir_entry->d_name); - - netloc_topology_t *topology; - topology = netloc_topology_construct(topopath); - if (topology == NULL) { - fprintf(stderr, "Error: netloc_topology_construct failed\n"); - return NETLOC_ERROR; - } - - netloc_edge_reset_uid(); - - netloc_to_json_draw(topology); - - netloc_topology_destruct(topology); - } - closedir(netlocdir); - - return 0; -} - diff --git a/utils/netloc/draw/visdist/vis.min.css b/utils/netloc/draw/visdist/vis.min.css deleted file mode 100644 index f345ff5325..0000000000 --- a/utils/netloc/draw/visdist/vis.min.css +++ /dev/null @@ -1 +0,0 @@ -.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis [class*=span]{min-height:0;width:auto}div.vis-configuration{position:relative;display:block;float:left;font-size:12px}div.vis-configuration-wrapper{display:block;width:700px}div.vis-configuration-wrapper::after{clear:both;content:"";display:block}div.vis-configuration.vis-config-option-container{display:block;width:495px;background-color:#fff;border:2px solid #f7f8fa;border-radius:4px;margin-top:20px;left:10px;padding-left:5px}div.vis-configuration.vis-config-button{display:block;width:495px;height:25px;vertical-align:middle;line-height:25px;background-color:#f7f8fa;border:2px solid #ceced0;border-radius:4px;margin-top:20px;left:10px;padding-left:5px;cursor:pointer;margin-bottom:30px}div.vis-configuration.vis-config-button.hover{background-color:#4588e6;border:2px solid #214373;color:#fff}div.vis-configuration.vis-config-item{display:block;float:left;width:495px;height:25px;vertical-align:middle;line-height:25px}div.vis-configuration.vis-config-item.vis-config-s2{left:10px;background-color:#f7f8fa;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s3{left:20px;background-color:#e4e9f0;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s4{left:30px;background-color:#cfd8e6;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-header{font-size:18px;font-weight:700}div.vis-configuration.vis-config-label{width:120px;height:25px;line-height:25px}div.vis-configuration.vis-config-label.vis-config-s3{width:110px}div.vis-configuration.vis-config-label.vis-config-s4{width:100px}div.vis-configuration.vis-config-colorBlock{top:1px;width:30px;height:19px;border:1px solid #444;border-radius:2px;padding:0;margin:0;cursor:pointer}input.vis-configuration.vis-config-checkbox{left:-5px}input.vis-configuration.vis-config-rangeinput{position:relative;top:-5px;width:60px;padding:1px;margin:0;pointer-events:none}input.vis-configuration.vis-config-range{-webkit-appearance:none;border:0 solid #fff;background-color:rgba(0,0,0,0);width:300px;height:20px}input.vis-configuration.vis-config-range::-webkit-slider-runnable-track{width:300px;height:5px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-webkit-slider-thumb{-webkit-appearance:none;border:1px solid #14334b;height:17px;width:17px;border-radius:50%;background:#3876c2;background:-moz-linear-gradient(top,#3876c2 0,#385380 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#3876c2),color-stop(100%,#385380));background:-webkit-linear-gradient(top,#3876c2 0,#385380 100%);background:-o-linear-gradient(top,#3876c2 0,#385380 100%);background:-ms-linear-gradient(top,#3876c2 0,#385380 100%);background:linear-gradient(to bottom,#3876c2 0,#385380 100%);box-shadow:#111927 0 0 1px 0;margin-top:-7px}input.vis-configuration.vis-config-range:focus{outline:0}input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track{background:#9d9d9d;background:-moz-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#9d9d9d),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-o-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:linear-gradient(to bottom,#9d9d9d 0,#c8c8c8 99%)}input.vis-configuration.vis-config-range::-moz-range-track{width:300px;height:10px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}input.vis-configuration.vis-config-range::-ms-track{width:300px;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}input.vis-configuration.vis-config-range::-ms-fill-lower{background:#777;border-radius:10px}input.vis-configuration.vis-config-range::-ms-fill-upper{background:#ddd;border-radius:10px}input.vis-configuration.vis-config-range::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:focus::-ms-fill-lower{background:#888}input.vis-configuration.vis-config-range:focus::-ms-fill-upper{background:#ccc}.vis-configuration-popup{position:absolute;background:rgba(57,76,89,.85);border:2px solid #f2faff;line-height:30px;height:30px;width:150px;text-align:center;color:#fff;font-size:14px;border-radius:4px;-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.vis-configuration-popup:after,.vis-configuration-popup:before{left:100%;top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.vis-configuration-popup:after{border-color:rgba(136,183,213,0);border-left-color:rgba(57,76,89,.85);border-width:8px;margin-top:-8px}.vis-configuration-popup:before{border-color:rgba(194,225,245,0);border-left-color:#f2faff;border-width:12px;margin-top:-12px}div.vis-tooltip{position:absolute;visibility:hidden;padding:5px;white-space:nowrap;font-family:verdana;font-size:14px;color:#000;background-color:#f5f4ed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid #808074;box-shadow:3px 3px 10px rgba(0,0,0,.2);pointer-events:none;z-index:5}div.vis-color-picker{position:absolute;top:0;left:30px;margin-top:-140px;margin-left:30px;width:310px;height:444px;z-index:1;padding:10px;border-radius:15px;background-color:#fff;display:none;box-shadow:rgba(0,0,0,.5) 0 0 10px 0}div.vis-color-picker div.vis-arrow{position:absolute;top:147px;left:5px}div.vis-color-picker div.vis-arrow::after,div.vis-color-picker div.vis-arrow::before{right:100%;top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}div.vis-color-picker div.vis-arrow:after{border-color:rgba(255,255,255,0);border-right-color:#fff;border-width:30px;margin-top:-30px}div.vis-color-picker div.vis-color{position:absolute;width:289px;height:289px;cursor:pointer}div.vis-color-picker div.vis-brightness{position:absolute;top:313px}div.vis-color-picker div.vis-opacity{position:absolute;top:350px}div.vis-color-picker div.vis-selector{position:absolute;top:137px;left:137px;width:15px;height:15px;border-radius:15px;border:1px solid #fff;background:#4c4c4c;background:-moz-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4c4c4c),color-stop(12%,#595959),color-stop(25%,#666),color-stop(39%,#474747),color-stop(50%,#2c2c2c),color-stop(51%,#000),color-stop(60%,#111),color-stop(76%,#2b2b2b),color-stop(91%,#1c1c1c),color-stop(100%,#131313));background:-webkit-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-o-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-ms-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:linear-gradient(to bottom,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%)}div.vis-color-picker div.vis-new-color{position:absolute;width:140px;height:20px;border:1px solid rgba(0,0,0,.1);border-radius:5px;top:380px;left:159px;text-align:right;padding-right:2px;font-size:10px;color:rgba(0,0,0,.4);vertical-align:middle;line-height:20px}div.vis-color-picker div.vis-initial-color{position:absolute;width:140px;height:20px;border:1px solid rgba(0,0,0,.1);border-radius:5px;top:380px;left:10px;text-align:left;padding-left:2px;font-size:10px;color:rgba(0,0,0,.4);vertical-align:middle;line-height:20px}div.vis-color-picker div.vis-label{position:absolute;width:300px;left:10px}div.vis-color-picker div.vis-label.vis-brightness{top:300px}div.vis-color-picker div.vis-label.vis-opacity{top:338px}div.vis-color-picker div.vis-button{position:absolute;width:68px;height:25px;border-radius:10px;vertical-align:middle;text-align:center;line-height:25px;top:410px;border:2px solid #d9d9d9;background-color:#f7f7f7;cursor:pointer}div.vis-color-picker div.vis-button.vis-cancel{left:5px}div.vis-color-picker div.vis-button.vis-load{left:82px}div.vis-color-picker div.vis-button.vis-apply{left:159px}div.vis-color-picker div.vis-button.vis-save{left:236px}div.vis-color-picker input.vis-range{width:290px;height:20px}div.vis-network div.vis-manipulation{box-sizing:content-box;border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);padding-top:4px;position:absolute;left:0;top:0;width:100%;height:28px}div.vis-network div.vis-edit-mode{position:absolute;left:0;top:5px;height:30px}div.vis-network div.vis-close{position:absolute;right:0;top:0;width:30px;height:30px;background-position:20px 3px;background-repeat:no-repeat;background-image:url(img/network/cross.png);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-close:hover{opacity:.6}div.vis-network div.vis-edit-mode div.vis-button,div.vis-network div.vis-manipulation div.vis-button{float:left;font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin-left:10px;cursor:pointer;padding:0 8px 0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-manipulation div.vis-button:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}div.vis-network div.vis-manipulation div.vis-button:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}div.vis-network div.vis-manipulation div.vis-button.vis-back{background-image:url(img/network/backIcon.png)}div.vis-network div.vis-manipulation div.vis-button.vis-none:hover{box-shadow:1px 1px 8px transparent;cursor:default}div.vis-network div.vis-manipulation div.vis-button.vis-none:active{box-shadow:1px 1px 8px transparent}div.vis-network div.vis-manipulation div.vis-button.vis-none{padding:0}div.vis-network div.vis-manipulation div.notification{margin:2px;font-weight:700}div.vis-network div.vis-manipulation div.vis-button.vis-add{background-image:url(img/network/addNodeIcon.png)}div.vis-network div.vis-edit-mode div.vis-button.vis-edit,div.vis-network div.vis-manipulation div.vis-button.vis-edit{background-image:url(img/network/editIcon.png)}div.vis-network div.vis-edit-mode div.vis-button.vis-edit.vis-edit-mode{background-color:#fcfcfc;border:1px solid #ccc}div.vis-network div.vis-manipulation div.vis-button.vis-connect{background-image:url(img/network/connectIcon.png)}div.vis-network div.vis-manipulation div.vis-button.vis-delete{background-image:url(img/network/deleteIcon.png)}div.vis-network div.vis-edit-mode div.vis-label,div.vis-network div.vis-manipulation div.vis-label{margin:0 0 0 23px;line-height:25px}div.vis-network div.vis-manipulation div.vis-separator-line{float:left;display:inline-block;width:1px;height:21px;background-color:#bdbdbd;margin:0 7px 0 15px}div.vis-network div.vis-navigation div.vis-button{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-navigation div.vis-button:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.vis-network div.vis-navigation div.vis-button:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.vis-network div.vis-navigation div.vis-button.vis-up{background-image:url(img/network/upArrow.png);bottom:50px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-down{background-image:url(img/network/downArrow.png);bottom:10px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-left{background-image:url(img/network/leftArrow.png);bottom:10px;left:15px}div.vis-network div.vis-navigation div.vis-button.vis-right{background-image:url(img/network/rightArrow.png);bottom:10px;left:95px}div.vis-network div.vis-navigation div.vis-button.vis-zoomIn{background-image:url(img/network/plus.png);bottom:10px;right:15px}div.vis-network div.vis-navigation div.vis-button.vis-zoomOut{background-image:url(img/network/minus.png);bottom:10px;right:55px}div.vis-network div.vis-navigation div.vis-button.vis-zoomExtends{background-image:url(img/network/zoomExtends.png);bottom:50px;right:15px}.vis-current-time{background-color:#ff7f6e;width:2px;z-index:1;pointer-events:none}.vis-rolling-mode-btn{height:40px;width:40px;position:absolute;top:7px;right:20px;border-radius:50%;font-size:28px;cursor:pointer;opacity:.8;color:#fff;font-weight:700;text-align:center;background:#3876c2}.vis-rolling-mode-btn:before{content:"\26F6"}.vis-rolling-mode-btn:hover{opacity:1}.vis-custom-time{background-color:#6e94ff;width:2px;cursor:move;z-index:1}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-minor{border-color:#e5e5e5}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-major{border-color:#bfbfbf}.vis-data-axis .vis-y-axis.vis-major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-major.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-minor.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title{position:absolute;color:#4d4d4d;white-space:nowrap;bottom:20px;text-align:center}.vis-data-axis .vis-y-axis.vis-title.vis-measure{padding:0;margin:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title.vis-left{bottom:0;-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left bottom;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.vis-data-axis .vis-y-axis.vis-title.vis-right{bottom:0;-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-ms-transform-origin:right bottom;-o-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.vis-legend{background-color:rgba(247,252,255,.65);padding:5px;border:1px solid #b3b3b3;box-shadow:2px 2px 10px rgba(154,154,154,.55)}.vis-legend-text{white-space:nowrap;display:inline-block}.vis-item{position:absolute;color:#1a1a1a;border-color:#97b0f8;border-width:1px;background-color:#d5ddf6;display:inline-block;z-index:1}.vis-item.vis-selected{border-color:#ffc200;background-color:#fff785;z-index:2}.vis-editable.vis-selected{cursor:move}.vis-item.vis-point.vis-selected{background-color:#fff785}.vis-item.vis-box{text-align:center;border-style:solid;border-radius:2px}.vis-item.vis-point{background:0 0}.vis-item.vis-dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis-item.vis-range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis-item.vis-background{border:none;background-color:rgba(213,221,246,.4);box-sizing:border-box;padding:0;margin:0}.vis-item .vis-item-overflow{position:relative;width:100%;height:100%;padding:0;margin:0;overflow:hidden}.vis-item-visible-frame{white-space:nowrap}.vis-item.vis-range .vis-item-content{position:relative;display:inline-block}.vis-item.vis-background .vis-item-content{position:absolute;display:inline-block}.vis-item.vis-line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis-item .vis-item-content{white-space:nowrap;box-sizing:border-box;padding:5px}.vis-item .vis-onUpdateTime-tooltip{position:absolute;background:#4f81bd;color:#fff;width:200px;text-align:center;white-space:nowrap;padding:5px;border-radius:1px;transition:.4s;-o-transition:.4s;-moz-transition:.4s;-webkit-transition:.4s}.vis-item .vis-delete,.vis-item .vis-delete-rtl{position:absolute;top:0;width:24px;height:24px;box-sizing:border-box;padding:0 5px;cursor:pointer;-webkit-transition:background .2s linear;-moz-transition:background .2s linear;-ms-transition:background .2s linear;-o-transition:background .2s linear;transition:background .2s linear}.vis-item .vis-delete{right:-24px}.vis-item .vis-delete-rtl{left:-24px}.vis-item .vis-delete-rtl:after,.vis-item .vis-delete:after{content:"\00D7";color:red;font-family:arial,sans-serif;font-size:22px;font-weight:700;-webkit-transition:color .2s linear;-moz-transition:color .2s linear;-ms-transition:color .2s linear;-o-transition:color .2s linear;transition:color .2s linear}.vis-item .vis-delete-rtl:hover,.vis-item .vis-delete:hover{background:red}.vis-item .vis-delete-rtl:hover:after,.vis-item .vis-delete:hover:after{color:#fff}.vis-item .vis-drag-center{position:absolute;width:100%;height:100%;top:0;left:0;cursor:move}.vis-item.vis-range .vis-drag-left{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;left:-4px;cursor:w-resize}.vis-item.vis-range .vis-drag-right{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;right:-4px;cursor:e-resize}.vis-range.vis-item.vis-readonly .vis-drag-left,.vis-range.vis-item.vis-readonly .vis-drag-right{cursor:auto}.vis-itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis-itemset .vis-background,.vis-itemset .vis-foreground{position:absolute;width:100%;height:100%;overflow:visible}.vis-axis{position:absolute;width:100%;height:0;left:0;z-index:1}.vis-foreground .vis-group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis-foreground .vis-group:last-child{border-bottom:none}.vis-nesting-group{cursor:pointer}.vis-nested-group{background:#f5f5f5}.vis-label.vis-nesting-group.expanded:before{content:"\25BC"}.vis-label.vis-nesting-group.collapsed-rtl:before{content:"\25C0"}.vis-label.vis-nesting-group.collapsed:before{content:"\25B6"}.vis-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-labelset{position:relative;overflow:hidden;box-sizing:border-box}.vis-labelset .vis-label{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box}.vis-labelset .vis-label{border-bottom:1px solid #bfbfbf}.vis-labelset .vis-label.draggable{cursor:pointer}.vis-labelset .vis-label:last-child{border-bottom:none}.vis-labelset .vis-label .vis-inner{display:inline-block;padding:5px}.vis-labelset .vis-label .vis-inner.vis-hidden{padding:0}.vis-panel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis-panel.vis-bottom,.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right,.vis-panel.vis-top{border:1px #bfbfbf}.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis-left.vis-panel.vis-vertical-scroll,.vis-right.vis-panel.vis-vertical-scroll{height:100%;overflow-x:hidden;overflow-y:scroll}.vis-left.vis-panel.vis-vertical-scroll{direction:rtl}.vis-left.vis-panel.vis-vertical-scroll .vis-content{direction:ltr}.vis-right.vis-panel.vis-vertical-scroll{direction:ltr}.vis-right.vis-panel.vis-vertical-scroll .vis-content{direction:rtl}.vis-panel.vis-bottom,.vis-panel.vis-center,.vis-panel.vis-top{border-left-style:solid;border-right-style:solid}.vis-background{overflow:hidden}.vis-panel>.vis-content{position:relative}.vis-panel .vis-shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,.8)}.vis-panel .vis-shadow.vis-top{top:-1px;left:0}.vis-panel .vis-shadow.vis-bottom{bottom:-1px;left:0}.vis-graph-group0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis-graph-group1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis-graph-group2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis-graph-group3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis-graph-group4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis-graph-group5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis-graph-group6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis-graph-group7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis-graph-group8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis-graph-group9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis-timeline .vis-fill{fill-opacity:.1;stroke:none}.vis-timeline .vis-bar{fill-opacity:.5;stroke-width:1px}.vis-timeline .vis-point{stroke-width:2px;fill-opacity:1}.vis-timeline .vis-legend-background{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis-timeline .vis-outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis-timeline .vis-icon-fill{fill-opacity:.3;stroke:none}.vis-time-axis{position:relative;overflow:hidden}.vis-time-axis.vis-foreground{top:0;left:0;width:100%}.vis-time-axis.vis-background{position:absolute;top:0;left:0;width:100%;height:100%}.vis-time-axis .vis-text{position:absolute;color:#4d4d4d;padding:3px;overflow:hidden;box-sizing:border-box;white-space:nowrap}.vis-time-axis .vis-text.vis-measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis-time-axis .vis-grid.vis-vertical{position:absolute;border-left:1px solid}.vis-time-axis .vis-grid.vis-vertical-rtl{position:absolute;border-right:1px solid}.vis-time-axis .vis-grid.vis-minor{border-color:#e5e5e5}.vis-time-axis .vis-grid.vis-major{border-color:#bfbfbf}.vis-timeline{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box} \ No newline at end of file diff --git a/utils/netloc/draw/visdist/vis.min.js b/utils/netloc/draw/visdist/vis.min.js deleted file mode 100644 index 1136c8a151..0000000000 --- a/utils/netloc/draw/visdist/vis.min.js +++ /dev/null @@ -1,47 +0,0 @@ -/** - * vis.js - * https://github.com/almende/vis - * - * A dynamic, browser-based visualization library. - * - * @version 4.21.0 - * @date 2017-10-12 - * - * @license - * Copyright (C) 2011-2017 Almende B.V, http://almende.com - * - * Vis.js is dual licensed under both - * - * * The Apache 2.0 License - * http://www.apache.org/licenses/LICENSE-2.0 - * - * and - * - * * The MIT License - * http://opensource.org/licenses/MIT - * - * Vis.js may be distributed under either license. - */ -"use strict";!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(o){if(i[o])return i[o].exports;var n=i[o]={i:o,l:!1,exports:{}};return t[o].call(n.exports,n,n.exports,e),n.l=!0,n.exports}var i={};return e.m=t,e.c=i,e.d=function(t,i,o){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=123)}([function(t,e,i){e.__esModule=!0,e.default=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},function(t,e,i){e.__esModule=!0;var o=i(169),n=function(t){return t&&t.__esModule?t:{default:t}}(o);e.default=function(){function t(t,e){for(var i=0;i2&&void 0!==arguments[2]&&arguments[2];for(var s in t)void 0!==i[s]&&(null===i[s]||"object"!==(0,c.default)(i[s])?n(t,i,s,o):"object"===(0,c.default)(t[s])&&e.fillIfDefined(t[s],i[s],o))},e.extend=function(t,e){for(var i=1;i3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r=0;r3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r in o)if(o.hasOwnProperty(r)&&-1===t.indexOf(r))if(o[r]&&o[r].constructor===Object)void 0===i[r]&&(i[r]={}),i[r].constructor===Object?e.deepExtend(i[r],o[r]):n(i,o,r,s);else if(Array.isArray(o[r])){i[r]=[];for(var a=0;a2&&void 0!==arguments[2]&&arguments[2],s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];for(var r in i)if(i.hasOwnProperty(r)||!0===o)if(i[r]&&i[r].constructor===Object)void 0===t[r]&&(t[r]={}),t[r].constructor===Object?e.deepExtend(t[r],i[r],o):n(t,i,r,s);else if(Array.isArray(i[r])){t[r]=[];for(var a=0;a=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,o)):t.attachEvent("on"+e,i)},e.removeEventListener=function(t,e,i,o){t.removeEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,o)):t.detachEvent("on"+e,i)},e.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},e.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},e.hasParent=function(t,e){for(var i=t;i;){if(i===e)return!0;i=i.parentNode}return!1},e.option={},e.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},e.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},e.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},e.option.asSize=function(t,i){return"function"==typeof t&&(t=t()),e.isString(t)?t:e.isNumber(t)?t+"px":i||null},e.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},e.hexToRGB=function(t){var e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;t=t.replace(e,function(t,e,i,o){return e+e+i+i+o+o});var i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null},e.overrideOpacity=function(t,i){var o;return-1!=t.indexOf("rgba")?t:-1!=t.indexOf("rgb")?(o=t.substr(t.indexOf("(")+1).replace(")","").split(","),"rgba("+o[0]+","+o[1]+","+o[2]+","+i+")"):(o=e.hexToRGB(t),null==o?t:"rgba("+o.r+","+o.g+","+o.b+","+i+")")},e.RGBToHex=function(t,e,i){return"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1)},e.parseColor=function(t){var i;if(!0===e.isString(t)){if(!0===e.isValidRGB(t)){var o=t.substr(4).substr(0,t.length-5).split(",").map(function(t){return parseInt(t)});t=e.RGBToHex(o[0],o[1],o[2])}if(!0===e.isValidHex(t)){var n=e.hexToHSV(t),s={h:n.h,s:.8*n.s,v:Math.min(1,1.02*n.v)},r={h:n.h,s:Math.min(1,1.25*n.s),v:.8*n.v},a=e.HSVToHex(r.h,r.s,r.v),h=e.HSVToHex(s.h,s.s,s.v);i={background:t,border:a,highlight:{background:h,border:a},hover:{background:h,border:a}}}else i={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else i={},i.background=t.background||void 0,i.border=t.border||void 0,e.isString(t.highlight)?i.highlight={border:t.highlight,background:t.highlight}:(i.highlight={},i.highlight.background=t.highlight&&t.highlight.background||void 0,i.highlight.border=t.highlight&&t.highlight.border||void 0),e.isString(t.hover)?i.hover={border:t.hover,background:t.hover}:(i.hover={},i.hover.background=t.hover&&t.hover.background||void 0,i.hover.border=t.hover&&t.hover.border||void 0);return i},e.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var o=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(o==n)return{h:0,s:0,v:o};var s=t==o?e-i:i==o?t-e:i-t;return{h:60*((t==o?3:i==o?1:5)-s/(n-o))/360,s:(n-o)/n,v:n}};var v={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),o=i[0].trim(),n=i[1].trim();e[o]=n}}),e},join:function(t){return(0,l.default)(t).map(function(e){return e+": "+t[e]}).join("; ")}};e.addCssText=function(t,i){var o=v.split(t.style.cssText),n=v.split(i),s=e.extend(o,n);t.style.cssText=v.join(s)},e.removeCssText=function(t,e){var i=v.split(t.style.cssText),o=v.split(e);for(var n in o)o.hasOwnProperty(n)&&delete i[n];t.style.cssText=v.join(i)},e.HSVToRGB=function(t,e,i){var o,n,s,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:o=i,n=l,s=h;break;case 1:o=d,n=i,s=h;break;case 2:o=h,n=i,s=l;break;case 3:o=h,n=d,s=i;break;case 4:o=l,n=h,s=i;break;case 5:o=i,n=h,s=d}return{r:Math.floor(255*o),g:Math.floor(255*n),b:Math.floor(255*s)}},e.HSVToHex=function(t,i,o){var n=e.HSVToRGB(t,i,o);return e.RGBToHex(n.r,n.g,n.b)},e.hexToHSV=function(t){var i=e.hexToRGB(t);return e.RGBToHSV(i.r,i.g,i.b)},e.isValidHex=function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},e.isValidRGB=function(t){return t=t.replace(" ",""),/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t)},e.isValidRGBA=function(t){return t=t.replace(" ",""),/rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(.{1,3})\)/i.test(t)},e.selectiveBridgeObject=function(t,i){if(null!==i&&"object"===(void 0===i?"undefined":(0,c.default)(i))){for(var o=(0,h.default)(i),n=0;n0&&e(o,t[n-1])<0;n--)t[n]=t[n-1];t[n]=o}return t},e.mergeOptions=function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=function(t){return null!==t&&void 0!==t},s=function(t){return null!==t&&"object"===(void 0===t?"undefined":(0,c.default)(t))};if(!s(t))throw new Error("Parameter mergeTarget must be an object");if(!s(e))throw new Error("Parameter options must be an object");if(!n(i))throw new Error("Parameter option must have a value");if(!s(o))throw new Error("Parameter globalOptions must be an object");var r=e[i],a=s(o)&&!function(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}(o),d=a?o[i]:void 0,l=d?d.enabled:void 0;if(void 0!==r){if("boolean"==typeof r)return s(t[i])||(t[i]={}),void(t[i].enabled=r);if(null===r&&!s(t[i])){if(!n(d))return;t[i]=(0,h.default)(d)}if(s(r)){var u=!0;void 0!==r.enabled?u=r.enabled:void 0!==l&&(u=d.enabled),function(t,e,i){s(t[i])||(t[i]={});var o=e[i],n=t[i];for(var r in o)o.hasOwnProperty(r)&&(n[r]=o[r])}(t,e,i),t[i].enabled=u}}},e.binarySearchCustom=function(t,e,i,o){for(var n=0,s=0,r=t.length-1;s<=r&&n<1e4;){var a=Math.floor((s+r)/2),h=t[a],d=void 0===o?h[i]:h[i][o],l=e(d);if(0==l)return a;-1==l?s=a+1:r=a-1,n++}return-1},e.binarySearchValue=function(t,e,i,o,n){var s,r,a,h,d=0,l=0,u=t.length-1;for(n=void 0!=n?n:function(t,e){return t==e?0:t0)return"before"==o?Math.max(0,h-1):h;if(n(r,e)<0&&n(a,e)>0)return"before"==o?h:Math.min(t.length-1,h+1);n(r,e)<0?l=h+1:u=h-1,d++}return-1},e.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return t<.5?2*t*t:(4-2*t)*t-1},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return t<.5?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t}},e.getScrollBarWidth=function(){var t=document.createElement("p");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.visibility="hidden",e.style.width="200px",e.style.height="150px",e.style.overflow="hidden",e.appendChild(t),document.body.appendChild(e);var i=t.offsetWidth;e.style.overflow="scroll";var o=t.offsetWidth;return i==o&&(o=e.clientWidth),document.body.removeChild(e),i-o},e.topMost=function(t,e){var i=void 0;Array.isArray(e)||(e=[e]);var o=!0,n=!1,s=void 0;try{for(var a,h=(0,r.default)(t);!(o=(a=h.next()).done);o=!0){var d=a.value;if(d){i=d[e[0]];for(var l=1;ln?1:or)&&(s=h,r=d)}return s},n.prototype.min=function(t){var e,i,o=this._data,n=(0,l.default)(o),s=null,r=null;for(e=0,i=n.length;e0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(o)):(o=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(o)),e[t].used.push(o),o},e.getDOMElement=function(t,e,i,o){var n;return e.hasOwnProperty(t)?e[t].redundant.length>0?(n=e[t].redundant[0],e[t].redundant.shift()):(n=document.createElement(t),void 0!==o?i.insertBefore(n,o):i.appendChild(n)):(n=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==o?i.insertBefore(n,o):i.appendChild(n)),e[t].used.push(n),n},e.drawPoint=function(t,i,o,n,s,r){var a;if("circle"==o.style?(a=e.getSVGElement("circle",n,s),a.setAttributeNS(null,"cx",t),a.setAttributeNS(null,"cy",i),a.setAttributeNS(null,"r",.5*o.size)):(a=e.getSVGElement("rect",n,s),a.setAttributeNS(null,"x",t-.5*o.size),a.setAttributeNS(null,"y",i-.5*o.size),a.setAttributeNS(null,"width",o.size),a.setAttributeNS(null,"height",o.size)),void 0!==o.styles&&a.setAttributeNS(null,"style",o.styles),a.setAttributeNS(null,"class",o.className+" vis-point"),r){var h=e.getSVGElement("text",n,s);r.xOffset&&(t+=r.xOffset),r.yOffset&&(i+=r.yOffset),r.content&&(h.textContent=r.content),r.className&&h.setAttributeNS(null,"class",r.className+" vis-label"),h.setAttributeNS(null,"x",t),h.setAttributeNS(null,"y",i)}return a},e.drawBar=function(t,i,o,n,s,r,a,h){if(0!=n){n<0&&(n*=-1,i-=n);var d=e.getSVGElement("rect",r,a);d.setAttributeNS(null,"x",t-.5*o),d.setAttributeNS(null,"y",i),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",n),d.setAttributeNS(null,"class",s),h&&d.setAttributeNS(null,"style",h)}}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.printStyle=void 0;var n=i(19),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=!1,v=void 0,g="background: #FFeeee; color: #dd0000",y=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"validate",value:function(e,i,o){m=!1,v=i;var n=i;return void 0!==o&&(n=i[o]),t.parse(e,n,[]),m}},{key:"parse",value:function(e,i,o){for(var n in e)e.hasOwnProperty(n)&&t.check(n,e,i,o)}},{key:"check",value:function(e,i,o,n){if(void 0===o[e]&&void 0===o.__any__)return void t.getSuggestion(e,o,n);var s=e,r=!0;void 0===o[e]&&void 0!==o.__any__&&(s="__any__",r="object"===t.getType(i[e]));var a=o[s];r&&void 0!==a.__type__&&(a=a.__type__),t.checkFields(e,i,o,s,a,n)}},{key:"checkFields",value:function(e,i,o,n,s,r){var a=function(i){console.log("%c"+i+t.printLocation(r,e),g)},h=t.getType(i[e]),l=s[h];void 0!==l?"array"===t.getType(l)&&-1===l.indexOf(i[e])?(a('Invalid option detected in "'+e+'". Allowed values are:'+t.print(l)+' not "'+i[e]+'". '),m=!0):"object"===h&&"__any__"!==n&&(r=f.copyAndExtendArray(r,e),t.parse(i[e],o[n],r)):void 0===s.any&&(a('Invalid type received for "'+e+'". Expected: '+t.print((0,d.default)(s))+". Received ["+h+'] "'+i[e]+'"'),m=!0)}},{key:"getType",value:function(t){var e=void 0===t?"undefined":(0,a.default)(t);return"object"===e?null===t?"null":t instanceof Boolean?"boolean":t instanceof Number?"number":t instanceof String?"string":Array.isArray(t)?"array":t instanceof Date?"date":void 0!==t.nodeType?"dom":!0===t._isAMomentObject?"moment":"object":"number"===e?"number":"boolean"===e?"boolean":"string"===e?"string":void 0===e?"undefined":e}},{key:"getSuggestion",value:function(e,i,o){var n=t.findInOptions(e,i,o,!1),s=t.findInOptions(e,v,[],!0),r=void 0 -;r=void 0!==n.indexMatch?" in "+t.printLocation(n.path,e,"")+'Perhaps it was incomplete? Did you mean: "'+n.indexMatch+'"?\n\n':s.distance<=4&&n.distance>s.distance?" in "+t.printLocation(n.path,e,"")+"Perhaps it was misplaced? Matching option found at: "+t.printLocation(s.path,s.closestMatch,""):n.distance<=8?'. Did you mean "'+n.closestMatch+'"?'+t.printLocation(n.path,e):". Did you mean one of these: "+t.print((0,d.default)(i))+t.printLocation(o,e),console.log('%cUnknown option detected: "'+e+'"'+r,g),m=!0}},{key:"findInOptions",value:function(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=1e9,r="",a=[],h=e.toLowerCase(),d=void 0;for(var l in i){var u=void 0;if(void 0!==i[l].__type__&&!0===n){var c=t.findInOptions(e,i[l],f.copyAndExtendArray(o,l));s>c.distance&&(r=c.closestMatch,a=c.path,s=c.distance,d=c.indexMatch)}else-1!==l.toLowerCase().indexOf(h)&&(d=l),u=t.levenshteinDistance(e,l),s>u&&(r=l,a=f.copyArray(o),s=u)}return{closestMatch:r,path:a,distance:s,indexMatch:d}}},{key:"printLocation",value:function(t,e){for(var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Problem value found at: \n",o="\n\n"+i+"options = {\n",n=0;n0&&(this.enableBorderDashes(t,e),t.stroke(),this.disableBorderDashes(t,e)),t.restore()}},{key:"performFill",value:function(t,e){this.enableShadow(t,e),t.fill(),this.disableShadow(t,e),this.performStroke(t,e)}},{key:"_addBoundingBoxMargin",value:function(t){this.boundingBox.left-=t,this.boundingBox.top-=t,this.boundingBox.bottom+=t,this.boundingBox.right+=t}},{key:"_updateBoundingBox",value:function(t,e,i,o,n){void 0!==i&&this.resize(i,o,n),this.left=t-this.width/2,this.top=e-this.height/2,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n)}},{key:"getDimensionsFromLabel",value:function(t,e,i){this.textSize=this.labelModule.getTextSize(t,e,i);var o=this.textSize.width,n=this.textSize.height;return 0===o&&(o=14,n=14),{width:o,height:n}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{size:this.options.size};if(this.needsRefresh(e,i)){this.labelModule.getTextSize(t,e,i);var n=2*o.size;this.width=n,this.height=n,this.radius=.5*this.width}}},{key:"_drawShape",value:function(t,e,i,o,n,s,r,a){if(this.resize(t,s,r,a),this.left=o-this.width/2,this.top=n-this.height/2,this.initContextForDraw(t,a),t[e](o,n,a.size),this.performFill(t,a),void 0!==this.options.label){this.labelModule.calculateLabelSize(t,s,r,o,n,"hanging");var h=n+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(t,o,h,s,r,"hanging")}this.updateBoundingBox(o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height))}}]),e}(m.default);e.default=v},function(t,e,i){var o=i(78),n=i(51);t.exports=function(t){return o(n(t))}},function(t,e,i){var o=i(20),n=i(39);t.exports=i(21)?function(t,e,i){return o.f(t,e,n(1,i))}:function(t,e,i){return t[e]=i,t}},function(t,e,i){var o=i(32);t.exports=function(t){if(!o(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,i){t.exports={default:i(138),__esModule:!0}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(188),s=o(n),r=i(77),a=o(r);e.default=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,h=(0,a.default)(t);!(o=(r=h.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(t){n=!0,s=t}finally{try{!o&&h.return&&h.return()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if((0,s.default)(Object(e)))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(t,e){t.exports={}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,i){var o=i(84),n=i(58);t.exports=Object.keys||function(t){return o(t,n)}},function(t,e,i){function o(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}o.subtract=function(t,e){var i=new o;return i.x=t.x-e.x,i.y=t.y-e.y,i.z=t.z-e.z,i},o.add=function(t,e){var i=new o;return i.x=t.x+e.x,i.y=t.y+e.y,i.z=t.z+e.z,i},o.avg=function(t,e){return new o((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},o.crossProduct=function(t,e){var i=new o;return i.x=t.y*e.z-t.z*e.y,i.y=t.z*e.x-t.x*e.z,i.z=t.x*e.y-t.y*e.x,i},o.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=o},function(t,e,i){var o,n,s;!function(i,r){n=[],o=r,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(0,function(){function t(t){var e,i=t&&t.preventDefault||!1,o=t&&t.container||window,n={},s={keydown:{},keyup:{}},r={};for(e=97;e<=122;e++)r[String.fromCharCode(e)]={code:e-97+65,shift:!1};for(e=65;e<=90;e++)r[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;e<=9;e++)r[""+e]={code:48+e,shift:!1};for(e=1;e<=12;e++)r["F"+e]={code:111+e,shift:!1};for(e=0;e<=9;e++)r["num"+e]={code:96+e,shift:!1};r["num*"]={code:106,shift:!1},r["num+"]={code:107,shift:!1},r["num-"]={code:109,shift:!1},r["num/"]={code:111,shift:!1},r["num."]={code:110,shift:!1},r.left={code:37,shift:!1},r.up={code:38,shift:!1},r.right={code:39,shift:!1},r.down={code:40,shift:!1},r.space={code:32,shift:!1},r.enter={code:13,shift:!1},r.shift={code:16,shift:void 0},r.esc={code:27,shift:!1},r.backspace={code:8,shift:!1},r.tab={code:9,shift:!1},r.ctrl={code:17,shift:!1},r.alt={code:18,shift:!1},r.delete={code:46,shift:!1},r.pageup={code:33,shift:!1},r.pagedown={code:34,shift:!1},r["="]={code:187,shift:!1},r["-"]={code:189,shift:!1},r["]"]={code:221,shift:!1},r["["]={code:219,shift:!1};var a=function(t){d(t,"keydown")},h=function(t){d(t,"keyup")},d=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n=4*a){var c=0,p=s.clone();switch(o[h].repeat){case"daily":d.day()!=l.day()&&(c=1),d.dayOfYear(n.dayOfYear()),d.year(n.year()),d.subtract(7,"days"),l.dayOfYear(n.dayOfYear()),l.year(n.year()),l.subtract(7-c,"days"),p.add(1,"weeks");break;case"weekly":var f=l.diff(d,"days"),m=d.day();d.date(n.date()),d.month(n.month()),d.year(n.year()),l=d.clone(),d.day(m),l.day(m),l.add(f,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),p.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(c=1),d.month(n.month()),d.year(n.year()),d.subtract(1,"months"),l.month(n.month()),l.year(n.year()),l.subtract(1,"months"),l.add(c,"months"),p.add(1,"months");break;case"yearly":d.year()!=l.year()&&(c=1),d.year(n.year()),d.subtract(1,"years"),l.year(n.year()),l.subtract(1,"years"),l.add(c,"years"),p.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}for(;d=e[o].start&&e[n].end<=e[o].end?e[n].remove=!0:e[n].start>=e[o].start&&e[n].start<=e[o].end?(e[o].end=e[n].end,e[n].remove=!0):e[n].end>=e[o].start&&e[n].end<=e[o].end&&(e[o].start=e[n].start,e[n].remove=!0));for(o=0;o=r&&nt.range.end){var h={start:t.range.start,end:i};return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,h,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale}return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,t.range,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale},e.toTime=function(t,i,o){if(0==t.body.hiddenDates.length){var n=t.range.conversion(o);return new Date(i/n.scale+n.offset)}var s=e.getHiddenDurationBetween(t.body.hiddenDates,t.range.start,t.range.end),r=t.range.end-t.range.start-s,a=r*i/o,h=e.getAccumulatedHiddenDuration(t.body.hiddenDates,t.range,a);return new Date(h+a+t.range.start)},e.getHiddenDurationBetween=function(t,e,i){for(var o=0,n=0;n=e&&r=e&&r<=i&&(o+=r-s)}return o},e.correctTimeForHidden=function(t,i,o,n){return n=t(n).toDate().valueOf(),n-=e.getHiddenDurationBefore(t,i,o,n)},e.getHiddenDurationBefore=function(t,e,i,o){var n=0;o=t(o).toDate().valueOf();for(var s=0;s=i.start&&a=a&&(n+=a-r)}return n},e.getAccumulatedHiddenDuration=function(t,e,i){for(var o=0,n=0,s=e.start,r=0;r=e.start&&h=i)break;o+=h-a}}return o},e.snapAwayFromHidden=function(t,i,o,n){var s=e.isHidden(i,t);return 1==s.hidden?o<0?1==n?s.startDate-(s.endDate-i)-1:s.startDate-1:1==n?s.endDate+(i-s.startDate)+1:s.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i=o&&t0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=(0,h.default)(this.data)}for(var i=0;ithis.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},o.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=o},function(t,e){function i(t){if(t)return o(t)}function o(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}t.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.prototype.once=function(t,e){function i(){o.off(t,i),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,n=0;n=.4*v}if(this.options.showMinorLabels&&m){var k=this._repaintMinorText(c,y,t,b);k.style.width=_+"px"}f&&this.options.showMajorLabels?(c>0&&(void 0==w&&(w=c),k=this._repaintMajorText(c,s.getLabelMajor(),t,b)),g=this._repaintMajorLine(c,_,t,b)):m?g=this._repaintMinorLine(c,_,t,b):g&&(g.style.width=parseInt(g.style.width)+_+"px")}if(1e3!==x||u||(console.warn("Something is wrong with the Timeline scale. Limited drawing of grid lines to 1000 lines."),u=!0),this.options.showMajorLabels){var S=this.body.util.toTime(0),D=s.getLabelMajor(S),M=D.length*(this.props.majorCharWidth||10)+10;(void 0==w||Mt.left&&this.shape.topt.top}},{key:"isBoundingBoxOverlappingWith",value:function(t){return this.shape.boundingBox.leftt.left&&this.shape.boundingBox.topt.top}}],[{key:"updateGroupOptions",value:function(t,e,i){if(void 0!==i){var o=t.group;if(void 0!==e&&void 0!==e.group&&o!==e.group)throw new Error("updateGroupOptions: group values in options don't match.");if("number"==typeof o||"string"==typeof o&&""!=o){var n=i.get(o);h.selectiveNotDeepExtend(["font"],t,n),t.color=h.parseColor(t.color)}}}},{key:"parseOptions",value:function(e,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=arguments[4],r=["color","fixed","shadow"];if(h.selectiveNotDeepExtend(r,e,i,o),t.checkMass(i),h.mergeOptions(e,i,"shadow",n),void 0!==i.color&&null!==i.color){var a=h.parseColor(i.color);h.fillIfDefined(e.color,a)}else!0===o&&null===i.color&&(e.color=h.bridgeObject(n.color));void 0!==i.fixed&&null!==i.fixed&&("boolean"==typeof i.fixed?(e.fixed.x=i.fixed,e.fixed.y=i.fixed):(void 0!==i.fixed.x&&"boolean"==typeof i.fixed.x&&(e.fixed.x=i.fixed.x),void 0!==i.fixed.y&&"boolean"==typeof i.fixed.y&&(e.fixed.y=i.fixed.y))),!0===o&&null===i.font&&(e.font=h.bridgeObject(n.font)),t.updateGroupOptions(e,i,s),void 0!==i.scaling&&h.mergeOptions(e.scaling,i.scaling,"label",n.scaling)}},{key:"checkMass",value:function(t,e){if(void 0!==t.mass&&t.mass<=0){var i="";void 0!==e&&(i=" in node id: "+e),console.log("%cNegative or zero mass disallowed"+i+", setting mass to 1.",C),t.mass=1}}}]),t}();e.default=O},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(6),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(2),u=function(){function t(){(0,a.default)(this,t)}return(0,d.default)(t,null,[{key:"choosify",value:function(t,e){var i=["node","edge","label"],o=!0,n=l.topMost(e,"chosen");if("boolean"==typeof n)o=n;else if("object"===(void 0===n?"undefined":(0,s.default)(n))){if(-1===i.indexOf(t))throw new Error("choosify: subOption '"+t+"' should be one of '"+i.join("', '")+"'");var r=l.topMost(e,["chosen",t]);"boolean"!=typeof r&&"function"!=typeof r||(o=r)}return o}},{key:"pointInRect",value:function(t,e,i){if(t.width<=0||t.height<=0)return!1;if(void 0!==i){var o={x:e.x-i.x,y:e.y-i.y};if(0!==i.angle){var n=-i.angle;e={x:Math.cos(n)*o.x-Math.sin(n)*o.y,y:Math.sin(n)*o.x+Math.cos(n)*o.y}}else e=o}var s=t.x+t.width,r=t.y+t.width;return t.lefte.x&&t.tope.y}},{key:"isValidLabel",value:function(t){return"string"==typeof t&&""!==t}}]),t}();e.default=u},function(t,e,i){i(125);for(var o=i(18),n=i(26),s=i(31),r=i(13)("toStringTag"),a="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),h=0;hdocument.F=Object<\/script>"),t.close(),h=t.F;o--;)delete h.prototype[s[o]];return h()};t.exports=Object.create||function(t,e){var i;return null!==t?(a.prototype=o(t),i=new a,a.prototype=null,i[r]=t):i=h(),void 0===e?i:n(i,e)}},function(t,e){var i=Math.ceil,o=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?o:i)(t)}},function(t,e,i){var o=i(57)("keys"),n=i(40);t.exports=function(t){return o[t]||(o[t]=n(t))}},function(t,e,i){var o=i(18),n=o["__core-js_shared__"]||(o["__core-js_shared__"]={});t.exports=function(t){return n[t]||(n[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,i){var o=i(20).f,n=i(22),s=i(13)("toStringTag");t.exports=function(t,e,i){t&&!n(t=i?t:t.prototype,s)&&o(t,s,{configurable:!0,value:e})}},function(t,e,i){var o=i(135)(!0);i(79)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,i=this._i;return i>=e.length?{value:void 0,done:!0}:(t=o(e,i),this._i+=t.length,{value:t,done:!1})})},function(t,e,i){e.f=i(13)},function(t,e,i){var o=i(18),n=i(7),s=i(52),r=i(61),a=i(20).f;t.exports=function(t){var e=n.Symbol||(n.Symbol=s?{}:o.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:r.f(t)})}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){var i=p().hours(0).minutes(0).seconds(0).milliseconds(0),o=i.clone().add(-3,"days").valueOf(),n=i.clone().add(3,"days").valueOf();this.millisecondsPerPixelCache=void 0,void 0===e?(this.start=o,this.end=n):(this.start=e.start||o,this.end=e.end||n),this.rolling=!1,this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={rtl:!1,start:null,end:null,moment:p,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10,rollingMode:{follow:!1,offset:.5}},this.options=c.extend({},this.defaultOptions),this.props={touch:{}},this.animationTimer=null,this.body.emitter.on("panstart",this._onDragStart.bind(this)),this.body.emitter.on("panmove",this._onDrag.bind(this)),this.body.emitter.on("panend",this._onDragEnd.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.body.dom.rollingModeBtn.addEventListener("click",this.startRolling.bind(this)),this.setOptions(e)}function s(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}var r=i(8),a=o(r),h=i(19),d=o(h),l=i(6),u=o(l),c=i(2),p=i(9),f=i(16),m=i(36);n.prototype=new f,n.prototype.setOptions=function(t){if(t){var e=["animation","direction","min","max","zoomMin","zoomMax","moveable","zoomable","moment","activate","hiddenDates","zoomKey","rtl","showCurrentTime","rollingMode","horizontalScroll"];c.selectiveExtend(e,this.options,t),t.rollingMode&&t.rollingMode.follow&&this.startRolling(),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},n.prototype.startRolling=function(){function t(){e.stopRolling(),e.rolling=!0;var i=e.end-e.start,o=c.convert(new Date,"Date").valueOf(),n=o-i*e.options.rollingMode.offset,s=o+i*(1-e.options.rollingMode.offset),r={animation:!1};e.setRange(n,s,r),i=1/e.conversion(e.body.domProps.center.width).scale/10,i<30&&(i=30),i>1e3&&(i=1e3),e.body.dom.rollingModeBtn.style.visibility="hidden",e.currentTimeTimer=setTimeout(t,i)}var e=this;t()},n.prototype.stopRolling=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),this.rolling=!1,this.body.dom.rollingModeBtn.style.visibility="visible")},n.prototype.setRange=function(t,e,i,o,n){i||(i={}),!0!==i.byUser&&(i.byUser=!1);var s=this,r=void 0!=t?c.convert(t,"Date").valueOf():null,h=void 0!=e?c.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),this.millisecondsPerPixelCache=void 0,i.animation){var l=this.start,p=this.end,f="object"===(0,u.default)(i.animation)&&"duration"in i.animation?i.animation.duration:500,v="object"===(0,u.default)(i.animation)&&"easingFunction"in i.animation?i.animation.easingFunction:"easeInOutQuad",g=c.easingFunctions[v];if(!g)throw new Error("Unknown easing function "+(0,d.default)(v)+". Choose from: "+(0,a.default)(c.easingFunctions).join(", "));var y=(new Date).valueOf(),b=!1;return function t(){if(!s.props.touch.dragging){var e=(new Date).valueOf(),a=e-y,d=g(a/f),u=a>f,c=u||null===r?r:l+(r-l)*d,v=u||null===h?h:p+(h-p)*d;_=s._applyRange(c,v),m.updateHiddenDates(s.options.moment,s.body,s.options.hiddenDates),b=b||_;var w={start:new Date(s.start),end:new Date(s.end),byUser:i.byUser,event:i.event};if(n&&n(d,_,u),_&&s.body.emitter.emit("rangechange",w),u){if(b&&(s.body.emitter.emit("rangechanged",w),o))return o()}else s.animationTimer=setTimeout(t,20)}}()}var _=this._applyRange(r,h);if(m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),_){var w={start:new Date(this.start),end:new Date(this.end),byUser:i.byUser,event:i.event};if(this.body.emitter.emit("rangechange",w),clearTimeout(s.timeoutID),s.timeoutID=setTimeout(function(){s.body.emitter.emit("rangechanged",w)},200),o)return o()}},n.prototype.getMillisecondsPerPixel=function(){return void 0===this.millisecondsPerPixelCache&&(this.millisecondsPerPixelCache=(this.end-this.start)/this.body.dom.center.clientWidth),this.millisecondsPerPixelCache},n.prototype._cancelAnimation=function(){this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},n.prototype._applyRange=function(t,e){var i,o=null!=t?c.convert(t,"Date").valueOf():this.start,n=null!=e?c.convert(e,"Date").valueOf():this.end,s=null!=this.options.max?c.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?c.convert(this.options.min,"Date").valueOf():null;if(isNaN(o)||null===o)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(ns&&(n=s)),null!==s&&n>s&&(i=n-s,o-=i,n-=i,null!=r&&o=this.start-.5&&n<=this.end?(o=this.start,n=this.end):(i=a-(n-o),o-=i/2,n+=i/2)}}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);h<0&&(h=0),n-o>h&&(this.end-this.start===h&&othis.end?(o=this.start,n=this.end):(i=n-o-h,o+=i/2,n-=i/2))}var d=this.start!=o||this.end!=n;return o>=this.start&&o<=this.end||n>=this.start&&n<=this.end||this.start>=o&&this.start<=n||this.end>=o&&this.end<=n||this.body.emitter.emit("checkRangedItems"),this.start=o,this.end=n,d},n.prototype.getRange=function(){return{start:this.start,end:this.end}},n.prototype.conversion=function(t,e){return n.conversion(this.start,this.end,t,e)},n.conversion=function(t,e,i,o){return void 0===o&&(o=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-o)}:{offset:0,scale:1}},n.prototype._onDragStart=function(t){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this._isInsideRange(t)&&this.props.touch.allowDragging&&(this.stopRolling(),this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},n.prototype._onDrag=function(t){if(t&&this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;s(e);var i="horizontal"==e?t.deltaX:t.deltaY;i-=this.deltaDifference;var o=this.props.touch.end-this.props.touch.start;o-=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var n,r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height;n=this.options.rtl?i/r*o:-i/r*o;var a=this.props.touch.start+n,h=this.props.touch.end+n,d=m.snapAwayFromHidden(this.body.hiddenDates,a,this.previousDelta-i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0);if(d!=a||l!=h)return this.deltaDifference+=i,this.props.touch.start=d,this.props.touch.end=l,void this._onDrag(t);this.previousDelta=i,this._applyRange(a,h);var u=new Date(this.start),c=new Date(this.end);this.body.emitter.emit("rangechange",{start:u,end:c,byUser:!0,event:t}),this.body.emitter.emit("panmove")}},n.prototype._onDragEnd=function(t){this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end),byUser:!0,event:t}))},n.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),!(this.options.zoomKey&&!t[this.options.zoomKey]&&this.options.zoomable||!this.options.zoomable&&this.options.moveable)&&this.options.zoomable&&this.options.moveable&&this._isInsideRange(t)&&e){var i;i=e<0?1-e/5:1/(1+e/5);var o;if(this.rolling)o=this.start+(this.end-this.start)*this.options.rollingMode.offset;else{var n=this.getPointer({x:t.clientX,y:t.clientY},this.body.dom.center);o=this._pointerToDate(n)}this.zoom(i,o,e,t),t.preventDefault()}},n.prototype._onTouch=function(t){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0,c.preventDefault(t)},n.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable){c.preventDefault(t),this.props.touch.allowDragging=!1,this.props.touch.center||(this.props.touch.center=this.getPointer(t.center,this.body.dom.center)),this.stopRolling();var e=1/(t.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),o=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,i),s=o-n,r=i-n+(this.props.touch.start-(i-n))*e,a=i+s+(this.props.touch.end-(i+s))*e;this.startToFront=1-e<=0,this.endToFront=e-1<=0;var h=m.snapAwayFromHidden(this.body.hiddenDates,r,1-e,!0),d=m.snapAwayFromHidden(this.body.hiddenDates,a,e-1,!0);h==r&&d==a||(this.props.touch.start=h,this.props.touch.end=d,this.scaleOffset=1-t.scale,r=h,a=d);var l={animation:!1,byUser:!0,event:t};this.setRange(r,a,l),this.startToFront=!1,this.endToFront=!0}},n.prototype._isInsideRange=function(t){var e,i=t.center?t.center.x:t.clientX;e=this.options.rtl?i-c.getAbsoluteLeft(this.body.dom.centerContainer):c.getAbsoluteRight(this.body.dom.centerContainer)-i;var o=this.body.util.toTime(e);return o>=this.start&&o<=this.end},n.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(s(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},n.prototype.getPointer=function(t,e){return this.options.rtl?{x:c.getAbsoluteRight(e)-t.x,y:t.y-c.getAbsoluteTop(e)}:{x:t.x-c.getAbsoluteLeft(e),y:t.y-c.getAbsoluteTop(e)}},n.prototype.zoom=function(t,e,i,o){null==e&&(e=(this.start+this.end)/2);var n=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),s=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,e),r=n-s,a=e-s+(this.start-(e-s))*t,h=e+r+(this.end-(e+r))*t;this.startToFront=!(i>0),this.endToFront=!(-i>0) -;var d=m.snapAwayFromHidden(this.body.hiddenDates,a,i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,-i,!0);d==a&&l==h||(a=d,h=l);var u={animation:!1,byUser:!0,event:o};this.setRange(a,h,u),this.startToFront=!1,this.endToFront=!0},n.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,o=this.end+e*t;this.start=i,this.end=o},n.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,o=this.start-i,n=this.end-i,s={animation:!1,byUser:!0,event:null};this.setRange(o,n,s)},t.exports=n},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){}var s=i(19),r=o(s),a=i(6),h=o(a),d=i(44),l=i(10),u=i(37),c=i(2),p=i(45),f=i(97),m=i(36),v=i(46);d(n.prototype),n.prototype._create=function(t){function e(t){this.isActive()&&this.emit("mousewheel",t);var e=0,i=0;if("detail"in t&&(i=-1*t.detail),"wheelDelta"in t&&(i=t.wheelDelta),"wheelDeltaY"in t&&(i=t.wheelDeltaY),"wheelDeltaX"in t&&(e=-1*t.wheelDeltaX),"axis"in t&&t.axis===t.HORIZONTAL_AXIS&&(e=-1*i,i=0),"deltaY"in t&&(i=-1*t.deltaY),"deltaX"in t&&(e=t.deltaX),this.options.zoomKey&&!t[this.options.zoomKey])if(t.preventDefault(),this.options.verticalScroll&&Math.abs(i)>=Math.abs(e)){var o=this.props.scrollTop,n=o+i;this.isActive()&&(this._setScrollTop(n),this._redraw(),this.emit("scroll",t))}else if(this.options.horizontalScroll){var s=Math.abs(e)>=Math.abs(i)?e:i,r=s/120*(this.range.end-this.range.start)/20,a=this.range.start+r,h=this.range.end+r,d={animation:!1,byUser:!0,event:t};this.range.setRange(a,h,d)}}function i(t){if(s.options.verticalScroll&&(t.preventDefault(),s.isActive())){var e=-t.target.scrollTop;s._setScrollTop(e),s._redraw(),s.emit("scrollSide",t)}}function o(t){if(t.preventDefault&&t.preventDefault(),!(!t.target.className.indexOf("vis")>-1||a))return t.dataTransfer.dropEffect="move",a=!0,!1}function n(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation();try{var e=JSON.parse(t.dataTransfer.getData("text"));if(!e||!e.content)return}catch(t){return!1}return a=!1,t.center={x:t.clientX,y:t.clientY},"item"!==e.target?s.itemSet._onAddItem(t):s.itemSet._onDropObjectOnItem(t),s.emit("drop",s.getEventProperties(t)),!1}this.dom={},this.dom.container=t,this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.rollingModeBtn=document.createElement("div"),this.dom.root.className="vis-timeline",this.dom.background.className="vis-panel vis-background",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical",this.dom.backgroundHorizontal.className="vis-panel vis-background vis-horizontal",this.dom.centerContainer.className="vis-panel vis-center",this.dom.leftContainer.className="vis-panel vis-left",this.dom.rightContainer.className="vis-panel vis-right",this.dom.top.className="vis-panel vis-top",this.dom.bottom.className="vis-panel vis-bottom",this.dom.left.className="vis-content",this.dom.center.className="vis-content",this.dom.right.className="vis-content",this.dom.shadowTop.className="vis-shadow vis-top",this.dom.shadowBottom.className="vis-shadow vis-bottom",this.dom.shadowTopLeft.className="vis-shadow vis-top",this.dom.shadowBottomLeft.className="vis-shadow vis-bottom",this.dom.shadowTopRight.className="vis-shadow vis-top",this.dom.shadowBottomRight.className="vis-shadow vis-bottom",this.dom.rollingModeBtn.className="vis-rolling-mode-btn",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.rollingModeBtn),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.on("rangechange",function(){!0===this.initialDrawDone&&this._redraw()}.bind(this)),this.on("rangechanged",function(){this.initialRangeChangeDone||(this.initialRangeChangeDone=!0)}.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("panmove",this._onDrag.bind(this));var s=this;this._origRedraw=this._redraw.bind(this),this._redraw=c.throttle(this._origRedraw),this.on("_change",function(t){s.itemSet&&s.itemSet.initialItemSetDrawn&&t&&1==t.queue?s._redraw():s._origRedraw()}),this.hammer=new l(this.dom.root);var r=this.hammer.get("pinch").set({enable:!0});u.disablePreventDefaultVertically(r),this.hammer.get("pan").set({threshold:5,direction:l.DIRECTION_HORIZONTAL}),this.listeners={},["tap","doubletap","press","pinch","pan","panstart","panmove","panend"].forEach(function(t){var e=function(e){s.isActive()&&s.emit(t,e)};s.hammer.on(t,e),s.listeners[t]=e}),u.onTouch(this.hammer,function(t){s.emit("touch",t)}.bind(this)),u.onRelease(this.hammer,function(t){s.emit("release",t)}.bind(this)),this.dom.centerContainer.addEventListener?(this.dom.centerContainer.addEventListener("mousewheel",e.bind(this),!1),this.dom.centerContainer.addEventListener("DOMMouseScroll",e.bind(this),!1)):this.dom.centerContainer.attachEvent("onmousewheel",e.bind(this)),this.dom.left.parentNode.addEventListener("scroll",i.bind(this)),this.dom.right.parentNode.addEventListener("scroll",i.bind(this));var a=!1;if(this.dom.center.addEventListener("dragover",o.bind(this),!1),this.dom.center.addEventListener("drop",n.bind(this),!1),this.customTimes=[],this.touch={},this.redrawCount=0,this.initialDrawDone=!1,this.initialRangeChangeDone=!1,!t)throw new Error("No container provided");t.appendChild(this.dom.root)},n.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","clickToUse","dataAttributes","hiddenDates","locale","locales","moment","rtl","zoomKey","horizontalScroll","verticalScroll"];if(c.selectiveExtend(e,this.options,t),this.dom.rollingModeBtn.style.visibility="hidden",this.options.rtl&&(this.dom.container.style.direction="rtl",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical-rtl"),this.options.verticalScroll&&(this.options.rtl?this.dom.rightContainer.className="vis-panel vis-right vis-vertical-scroll":this.dom.leftContainer.className="vis-panel vis-left vis-vertical-scroll"),"object"!==(0,h.default)(this.options.orientation)&&(this.options.orientation={item:void 0,axis:void 0}),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation={item:t.orientation,axis:t.orientation}:"object"===(0,h.default)(t.orientation)&&("item"in t.orientation&&(this.options.orientation.item=t.orientation.item),"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis))),"both"===this.options.orientation.axis){if(!this.timeAxis2){var i=this.timeAxis2=new p(this.body);i.setOptions=function(t){var e=t?c.extend({},t):{};e.orientation="top",p.prototype.setOptions.call(i,e)},this.components.push(i)}}else if(this.timeAxis2){var o=this.components.indexOf(this.timeAxis2);-1!==o&&this.components.splice(o,1),this.timeAxis2.destroy(),this.timeAxis2=null}if("function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),"hiddenDates"in this.options&&m.convertHiddenOptions(this.options.moment,this.body,this.options.hiddenDates),"clickToUse"in t&&(t.clickToUse?this.activator||(this.activator=new f(this.dom.root)):this.activator&&(this.activator.destroy(),delete this.activator)),"showCustomTime"in t)throw new Error("Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])");this._initAutoResize()}if(this.components.forEach(function(e){return e.setOptions(t)}),"configure"in t){this.configurator||(this.configurator=this._createConfigurator()),this.configurator.setOptions(t.configure);var n=c.deepExtend({},this.options);this.components.forEach(function(t){c.deepExtend(n,t.options)}),this.configurator.setModuleOptions({global:n})}this._redraw()},n.prototype.isActive=function(){return!this.activator||this.activator.active},n.prototype.destroy=function(){this.setItems(null),this.setGroups(null),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){return t.destroy()}),this.body=null},n.prototype.setCustomTime=function(t,e){var i=this.customTimes.filter(function(t){return e===t.options.id});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));i.length>0&&i[0].setCustomTime(t)},n.prototype.getCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));return e[0].getCustomTime()},n.prototype.setCustomTimeTitle=function(t,e){var i=this.customTimes.filter(function(t){return t.options.id===e});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));if(i.length>0)return i[0].setCustomTitle(t)},n.prototype.getEventProperties=function(t){return{event:t}},n.prototype.addCustomTime=function(t,e){var i=void 0!==t?c.convert(t,"Date").valueOf():new Date;if(this.customTimes.some(function(t){return t.options.id===e}))throw new Error("A custom time with id "+(0,r.default)(e)+" already exists");var o=new v(this.body,c.extend({},this.options,{time:i,id:e}));return this.customTimes.push(o),this.components.push(o),this._redraw(),e},n.prototype.removeCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));e.forEach(function(t){this.customTimes.splice(this.customTimes.indexOf(t),1),this.components.splice(this.components.indexOf(t),1),t.destroy()}.bind(this))},n.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},n.prototype.fit=function(t,e){var i=this.getDataRange();if(null!==i.min||null!==i.max){var o=i.max-i.min,n=new Date(i.min.valueOf()-.01*o),s=new Date(i.max.valueOf()+.01*o),r=!t||void 0===t.animation||t.animation;this.range.setRange(n,s,{animation:r},e)}},n.prototype.getDataRange=function(){throw new Error("Cannot invoke abstract method getDataRange")},n.prototype.setWindow=function(t,e,i,o){"function"==typeof arguments[2]&&(o=arguments[2],i={});var n,s;1==arguments.length?(s=arguments[0],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n})):2==arguments.length&&"function"==typeof arguments[1]?(s=arguments[0],o=arguments[1],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n},o)):(n=!i||void 0===i.animation||i.animation,this.range.setRange(t,e,{animation:n},o))},n.prototype.moveTo=function(t,e,i){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.range.end-this.range.start,n=c.convert(t,"Date").valueOf(),s=n-o/2,r=n+o/2,a=!e||void 0===e.animation||e.animation;this.range.setRange(s,r,{animation:a},i)},n.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},n.prototype.zoomIn=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=r/(1+t),h=(r-a)/2,d=n+h,l=s-h;this.setWindow(d,l,e,i)}},n.prototype.zoomOut=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=n-r*t/2,h=s+r*t/2;this.setWindow(a,h,e,i)}},n.prototype.redraw=function(){this._redraw()},n.prototype._redraw=function(){this.redrawCount++;var t=!1,e=this.options,i=this.props,o=this.dom;if(o&&o.container&&0!=o.root.offsetWidth){m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),"top"==e.orientation?(c.addClassName(o.root,"vis-top"),c.removeClassName(o.root,"vis-bottom")):(c.removeClassName(o.root,"vis-top"),c.addClassName(o.root,"vis-bottom")),o.root.style.maxHeight=c.option.asSize(e.maxHeight,""),o.root.style.minHeight=c.option.asSize(e.minHeight,""),o.root.style.width=c.option.asSize(e.width,""),i.border.left=(o.centerContainer.offsetWidth-o.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(o.centerContainer.offsetHeight-o.centerContainer.clientHeight)/2,i.border.bottom=i.border.top,i.borderRootHeight=o.root.offsetHeight-o.root.clientHeight,i.borderRootWidth=o.root.offsetWidth-o.root.clientWidth,0===o.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===o.root.clientHeight&&(i.borderRootWidth=i.borderRootHeight),i.center.height=o.center.offsetHeight,i.left.height=o.left.offsetHeight,i.right.height=o.right.offsetHeight,i.top.height=o.top.clientHeight||-i.border.top,i.bottom.height=o.bottom.clientHeight||-i.border.bottom;var n=Math.max(i.left.height,i.center.height,i.right.height),s=i.top.height+n+i.bottom.height+i.borderRootHeight+i.border.top+i.border.bottom;o.root.style.height=c.option.asSize(e.height,s+"px"),i.root.height=o.root.offsetHeight,i.background.height=i.root.height-i.borderRootHeight;var r=i.root.height-i.top.height-i.bottom.height-i.borderRootHeight;i.centerContainer.height=r,i.leftContainer.height=r,i.rightContainer.height=i.leftContainer.height,i.root.width=o.root.offsetWidth,i.background.width=i.root.width-i.borderRootWidth,this.initialDrawDone||(i.scrollbarWidth=c.getScrollBarWidth()),e.verticalScroll?e.rtl?(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth+i.scrollbarWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth+i.scrollbarWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right),this._setDOM();var a=this._updateScrollTop();"top"!=e.orientation.item&&(a+=Math.max(i.centerContainer.height-i.center.height-i.border.top-i.border.bottom,0)),o.center.style.top=a+"px";var h=0==i.scrollTop?"hidden":"",d=i.scrollTop==i.scrollTopMin?"hidden":"";o.shadowTop.style.visibility=h,o.shadowBottom.style.visibility=d,o.shadowTopLeft.style.visibility=h,o.shadowBottomLeft.style.visibility=d,o.shadowTopRight.style.visibility=h,o.shadowBottomRight.style.visibility=d,e.verticalScroll&&(o.rightContainer.className="vis-panel vis-right vis-vertical-scroll",o.leftContainer.className="vis-panel vis-left vis-vertical-scroll",o.shadowTopRight.style.visibility="hidden",o.shadowBottomRight.style.visibility="hidden",o.shadowTopLeft.style.visibility="hidden",o.shadowBottomLeft.style.visibility="hidden",o.left.style.top="0px",o.right.style.top="0px"),(!e.verticalScroll||i.center.heighti.centerContainer.height;this.hammer.get("pan").set({direction:u?l.DIRECTION_ALL:l.DIRECTION_HORIZONTAL}),this.components.forEach(function(e){t=e.redraw()||t});if(t){if(this.redrawCount<5)return void this.body.emitter.emit("_change");console.log("WARNING: infinite loop in redraw?")}else this.redrawCount=0;this.body.emitter.emit("changed")}},n.prototype._setDOM=function(){var t=this.props,e=this.dom;t.leftContainer.width=t.left.width,t.rightContainer.width=t.right.width;var i=t.root.width-t.left.width-t.right.width-t.borderRootWidth;t.center.width=i,t.centerContainer.width=i,t.top.width=i,t.bottom.width=i,e.background.style.height=t.background.height+"px",e.backgroundVertical.style.height=t.background.height+"px",e.backgroundHorizontal.style.height=t.centerContainer.height+"px",e.centerContainer.style.height=t.centerContainer.height+"px",e.leftContainer.style.height=t.leftContainer.height+"px",e.rightContainer.style.height=t.rightContainer.height+"px",e.background.style.width=t.background.width+"px",e.backgroundVertical.style.width=t.centerContainer.width+"px",e.backgroundHorizontal.style.width=t.background.width+"px",e.centerContainer.style.width=t.center.width+"px",e.top.style.width=t.top.width+"px",e.bottom.style.width=t.bottom.width+"px",e.background.style.left="0",e.background.style.top="0",e.backgroundVertical.style.left=t.left.width+t.border.left+"px",e.backgroundVertical.style.top="0",e.backgroundHorizontal.style.left="0",e.backgroundHorizontal.style.top=t.top.height+"px",e.centerContainer.style.left=t.left.width+"px",e.centerContainer.style.top=t.top.height+"px",e.leftContainer.style.left="0",e.leftContainer.style.top=t.top.height+"px",e.rightContainer.style.left=t.left.width+t.center.width+"px",e.rightContainer.style.top=t.top.height+"px",e.top.style.left=t.left.width+"px",e.top.style.top="0",e.bottom.style.left=t.left.width+"px",e.bottom.style.top=t.top.height+t.centerContainer.height+"px",e.center.style.left="0",e.left.style.left="0",e.right.style.left="0"},n.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},n.prototype.setCurrentTime=function(t){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");this.currentTime.setCurrentTime(t)},n.prototype.getCurrentTime=function(){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");return this.currentTime.getCurrentTime()},n.prototype._toTime=function(t){return m.toTime(this,t,this.props.center.width)},n.prototype._toGlobalTime=function(t){return m.toTime(this,t,this.props.root.width)},n.prototype._toScreen=function(t){return m.toScreen(this,t,this.props.center.width)},n.prototype._toGlobalScreen=function(t){return m.toScreen(this,t,this.props.root.width)},n.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},n.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){if(1!=t.options.autoResize)return void t._stopAutoResize();t.dom.root&&(t.dom.root.offsetWidth==t.props.lastWidth&&t.dom.root.offsetHeight==t.props.lastHeight||(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight,t.props.scrollbarWidth=c.getScrollBarWidth(),t.body.emitter.emit("_change")))},c.addEventListener(window,"resize",this._onResize),t.dom.root&&(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight),this.watchTimer=setInterval(this._onResize,1e3)},n.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),this._onResize&&(c.removeEventListener(window,"resize",this._onResize),this._onResize=null)},n.prototype._onTouch=function(t){this.touch.allowDragging=!0,this.touch.initialScrollTop=this.props.scrollTop},n.prototype._onPinch=function(t){this.touch.allowDragging=!1},n.prototype._onDrag=function(t){if(t&&this.touch.allowDragging){var e=t.deltaY,i=this._getScrollTop(),o=this._setScrollTop(this.touch.initialScrollTop+e);this.options.verticalScroll&&(this.dom.left.parentNode.scrollTop=-this.props.scrollTop,this.dom.right.parentNode.scrollTop=-this.props.scrollTop),o!=i&&this.emit("verticalDrag")}},n.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},n.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("top"!=this.options.orientation.item&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTop0&&this.current.milliseconds()0&&this.current.seconds()0&&this.current.minutes()0&&this.current.hours()0?t.step:1,this.autoScale=!1)},o.prototype.setAutoScale=function(t){this.autoScale=t},o.prototype.setMinimumStep=function(t){if(void 0!=t){31104e9>t&&(this.scale="year",this.step=1e3),15552e9>t&&(this.scale="year",this.step=500),31104e8>t&&(this.scale="year",this.step=100),15552e8>t&&(this.scale="year",this.step=50),31104e7>t&&(this.scale="year",this.step=10),15552e7>t&&(this.scale="year",this.step=5),31104e6>t&&(this.scale="year",this.step=1),7776e6>t&&(this.scale="month",this.step=3),2592e6>t&&(this.scale="month",this.step=1),432e6>t&&(this.scale="day",this.step=5),1728e5>t&&(this.scale="day",this.step=2),864e5>t&&(this.scale="day",this.step=1),432e5>t&&(this.scale="weekday",this.step=1),144e5>t&&(this.scale="hour",this.step=4),36e5>t&&(this.scale="hour",this.step=1),9e5>t&&(this.scale="minute",this.step=15),6e5>t&&(this.scale="minute",this.step=10),3e5>t&&(this.scale="minute",this.step=5),6e4>t&&(this.scale="minute",this.step=1),15e3>t&&(this.scale="second",this.step=15),1e4>t&&(this.scale="second",this.step=10),5e3>t&&(this.scale="second",this.step=5),1e3>t&&(this.scale="second",this.step=1),200>t&&(this.scale="millisecond",this.step=200),100>t&&(this.scale="millisecond",this.step=100),50>t&&(this.scale="millisecond",this.step=50),10>t&&(this.scale="millisecond",this.step=10),5>t&&(this.scale="millisecond",this.step=5),1>t&&(this.scale="millisecond",this.step=1)}},o.snap=function(t,e,i){var o=n(t);if("year"==e){var s=o.year()+Math.round(o.month()/12);o.year(Math.round(s/i)*i),o.month(0),o.date(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("month"==e)o.date()>15?(o.date(1),o.add(1,"month")):o.date(1),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("week"==e)o.weekday()>2?(o.weekday(0),o.add(1,"week")):o.weekday(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("day"==e){switch(i){case 5:case 2:o.hours(24*Math.round(o.hours()/24));break;default:o.hours(12*Math.round(o.hours()/12))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("weekday"==e){switch(i){case 5:case 2:o.hours(12*Math.round(o.hours()/12));break;default:o.hours(6*Math.round(o.hours()/6))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("hour"==e){switch(i){case 4:o.minutes(60*Math.round(o.minutes()/60));break;default:o.minutes(30*Math.round(o.minutes()/30))}o.seconds(0),o.milliseconds(0)}else if("minute"==e){switch(i){case 15:case 10:o.minutes(5*Math.round(o.minutes()/5)),o.seconds(0);break;case 5:o.seconds(60*Math.round(o.seconds()/60));break;default:o.seconds(30*Math.round(o.seconds()/30))}o.milliseconds(0)}else if("second"==e)switch(i){case 15:case 10:o.seconds(5*Math.round(o.seconds()/5)),o.milliseconds(0);break;case 5:o.milliseconds(1e3*Math.round(o.milliseconds()/1e3));break;default:o.milliseconds(500*Math.round(o.milliseconds()/500))}else if("millisecond"==e){var r=i>5?i/2:1;o.milliseconds(Math.round(o.milliseconds()/r)*r)}return o},o.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.scale){case"year":case"month":case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedMonth)switch(this.scale){case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedDay)switch(this.scale){case"millisecond":case"second":case"minute":case"hour":return!0;default:return!1}var t=this.moment(this.current);switch(this.scale){case"millisecond":return 0==t.milliseconds();case"second":return 0==t.seconds();case"minute":return 0==t.hours()&&0==t.minutes();case"hour":return 0==t.hours();case"weekday":case"day":case"week":return 1==t.date();case"month":return 0==t.month();case"year":default:return!1}},o.prototype.getLabelMinor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.minorLabels)return this.format.minorLabels(t,this.scale,this.step);var e=this.format.minorLabels[this.scale];switch(this.scale){case"week":if(this.isMajor()&&0!==t.weekday())return"";default:return e&&e.length>0?this.moment(t).format(e):""}},o.prototype.getLabelMajor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.majorLabels)return this.format.majorLabels(t,this.scale,this.step);var e=this.format.majorLabels[this.scale];return e&&e.length>0?this.moment(t).format(e):""},o.prototype.getClassName=function(){function t(t){return t/a%2==0?" vis-even":" vis-odd"}function e(t){return t.isSame(new Date,"day")?" vis-today":t.isSame(n().add(1,"day"),"day")?" vis-tomorrow":t.isSame(n().add(-1,"day"),"day")?" vis-yesterday":""}function i(t){return t.isSame(new Date,"week")?" vis-current-week":""}function o(t){return t.isSame(new Date,"month")?" vis-current-month":""}var n=this.moment,s=this.moment(this.current),r=s.locale?s.locale("en"):s.lang("en"),a=this.step,h=[];switch(this.scale){case"millisecond":h.push(e(r)),h.push(t(r.milliseconds()));break;case"second":h.push(e(r)),h.push(t(r.seconds()));break;case"minute":h.push(e(r)),h.push(t(r.minutes()));break;case"hour":h.push("vis-h"+r.hours()+(4==this.step?"-h"+(r.hours()+4):"")),h.push(e(r)),h.push(t(r.hours()));break;case"weekday":h.push("vis-"+r.format("dddd").toLowerCase()),h.push(e(r)),h.push(i(r)),h.push(t(r.date()));break;case"day":h.push("vis-day"+r.date()),h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(e(r)),h.push(o(r)),h.push(this.step<=2?e(r):""),h.push(this.step<=2?"vis-"+r.format("dddd").toLowerCase():""), -h.push(t(r.date()-1));break;case"week":h.push("vis-week"+r.format("w")),h.push(i(r)),h.push(t(r.week()));break;case"month":h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(o(r)),h.push(t(r.month()));break;case"year":h.push("vis-year"+r.year()),h.push(function(t){return t.isSame(new Date,"year")?" vis-current-year":""}(r)),h.push(t(r.year()))}return h.filter(String).join(" ")},t.exports=o},function(t,e,i){function o(t,e){this.body=t,this.defaultOptions={rtl:!1,showCurrentTime:!0,moment:r,locales:a,locale:"en"},this.options=n.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var n=i(2),s=i(16),r=i(9),a=i(98);o.prototype=new s,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-current-time",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},o.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},o.prototype.setOptions=function(t){t&&n.selectiveExtend(["rtl","showCurrentTime","moment","locale","locales"],this.options,t)},o.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=this.options.moment((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),o=this.options.locales[this.options.locale];o||(this.warned||(console.log("WARNING: options.locales['"+this.options.locale+"'] not found. See http://visjs.org/docs/timeline/#Localization"),this.warned=!0),o=this.options.locales.en);var n=o.current+" "+o.time+": "+e.format("dddd, MMMM Do YYYY, H:mm:ss");n=n.charAt(0).toUpperCase()+n.substring(1),this.options.rtl?this.bar.style.right=i+"px":this.bar.style.left=i+"px",this.bar.title=n}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},o.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,o=1/i/10;o<30&&(o=30),o>1e3&&(o=1e3),e.redraw(),e.body.emitter.emit("currentTimeTick"),e.currentTimeTimer=setTimeout(t,o)}var e=this;t()},o.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},o.prototype.setCurrentTime=function(t){var e=n.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},o.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.groupId=t,this.subgroups={},this.subgroupStack={},this.subgroupStackAll=!1,this.doInnerStack=!1,this.subgroupIndex=0,this.subgroupOrderer=e&&e.subgroupOrder,this.itemSet=i,this.isVisible=null,this.stackDirty=!0,e&&e.nestedGroups&&(this.nestedGroups=e.nestedGroups,0==e.showNested?this.showNested=!1:this.showNested=!0),e&&e.subgroupStack)if("boolean"==typeof e.subgroupStack)this.doInnerStack=e.subgroupStack,this.subgroupStackAll=e.subgroupStack;else for(var o in e.subgroupStack)this.subgroupStack[o]=e.subgroupStack[o],this.doInnerStack=this.doInnerStack||e.subgroupStack[o];this.nestedInGroup=null,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.itemsInRange=[],this.orderedItems={byStart:[],byEnd:[]},this.checkRangedItems=!1;var n=this;this.itemSet.body.emitter.on("checkRangedItems",function(){n.checkRangedItems=!0}),this._create(),this.setData(e)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(100);o.prototype._create=function(){var t=document.createElement("div");this.itemSet.options.groupEditable.order?t.className="vis-label draggable":t.className="vis-label",this.dom.label=t;var e=document.createElement("div");e.className="vis-inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="vis-group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="vis-group",this.dom.axis=document.createElement("div"),this.dom.axis.className="vis-group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.style.position="absolute",this.dom.marker.innerHTML="",this.dom.background.appendChild(this.dom.marker)},o.prototype.setData=function(t){var e,i;if(this.itemSet.options&&this.itemSet.options.groupTemplate?(i=this.itemSet.options.groupTemplate.bind(this),e=i(t,this.dom.inner)):e=t&&t.content,e instanceof Element){for(this.dom.inner.appendChild(e);this.dom.inner.firstChild;)this.dom.inner.removeChild(this.dom.inner.firstChild);this.dom.inner.appendChild(e)}else e instanceof Object?i(t,this.dom.inner):this.dom.inner.innerHTML=void 0!==e&&null!==e?e:this.groupId||"";if(this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?r.removeClassName(this.dom.inner,"vis-hidden"):r.addClassName(this.dom.inner,"vis-hidden"),t&&t.nestedGroups){this.nestedGroups&&this.nestedGroups==t.nestedGroups||(this.nestedGroups=t.nestedGroups),void 0===t.showNested&&void 0!==this.showNested||(0==t.showNested?this.showNested=!1:this.showNested=!0),r.addClassName(this.dom.label,"vis-nesting-group");var o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed";this.showNested?(r.removeClassName(this.dom.label,o),r.addClassName(this.dom.label,"expanded")):(r.removeClassName(this.dom.label,"expanded"),r.addClassName(this.dom.label,o))}else this.nestedGroups&&(this.nestedGroups=null,o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed",r.removeClassName(this.dom.label,o),r.removeClassName(this.dom.label,"expanded"),r.removeClassName(this.dom.label,"vis-nesting-group"));t&&t.nestedInGroup&&(r.addClassName(this.dom.label,"vis-nested-group"),this.itemSet.options&&this.itemSet.options.rtl?this.dom.inner.style.paddingRight="30px":this.dom.inner.style.paddingLeft="30px");var n=t&&t.className||null;n!=this.className&&(this.className&&(r.removeClassName(this.dom.label,this.className),r.removeClassName(this.dom.foreground,this.className),r.removeClassName(this.dom.background,this.className),r.removeClassName(this.dom.axis,this.className)),r.addClassName(this.dom.label,n),r.addClassName(this.dom.foreground,n),r.addClassName(this.dom.background,n),r.addClassName(this.dom.axis,n),this.className=n),this.style&&(r.removeCssText(this.dom.label,this.style),this.style=null),t&&t.style&&(r.addCssText(this.dom.label,t.style),this.style=t.style)},o.prototype.getLabelWidth=function(){return this.props.label.width},o.prototype._didMarkerHeightChange=function(){var t=this.dom.marker.clientHeight;if(t!=this.lastMarkerHeight){this.lastMarkerHeight=t;var e={},i=0;r.forEach(this.items,function(t,o){if(t.dirty=!0,t.displayed){e[o]=t.redraw(!0),i=e[o].length}});if(i>0)for(var o=0;o0)for(var u=0;u0){var e=this;this.resetSubgroups(),r.forEach(this.visibleItems,function(i){void 0!==i.data.subgroup&&(e.subgroups[i.data.subgroup].height=Math.max(e.subgroups[i.data.subgroup].height,i.height+t.item.vertical),e.subgroups[i.data.subgroup].visible=!0)})}},o.prototype._isGroupVisible=function(t,e){return this.top<=t.body.domProps.centerContainer.height-t.body.domProps.scrollTop+e.axis&&this.top+this.height+e.axis>=-t.body.domProps.scrollTop},o.prototype._calculateHeight=function(t){var e,i=this.visibleItems;if(i.length>0){var o=i[0].top,n=i[0].top+i[0].height;if(r.forEach(i,function(t){o=Math.min(o,t.top),n=Math.max(n,t.top+t.height)}),o>t.axis){var s=o-t.axis;n-=s,r.forEach(i,function(t){t.top-=s})}e=n+t.item.vertical/2}else e=0;return e=Math.max(e,this.props.label.height)},o.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},o.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var o=this.dom.axis;o.parentNode&&o.parentNode.removeChild(o)},o.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),this.stackDirty=!0,void 0!==t.data.subgroup&&(this._addToSubgroup(t),this.orderSubgroups()),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},o.prototype._addToSubgroup=function(t,e){e=e||t.data.subgroup,void 0!=e&&void 0===this.subgroups[e]&&(this.subgroups[e]={height:0,top:0,start:t.data.start,end:t.data.end||t.data.start,visible:!1,index:this.subgroupIndex,items:[],stack:this.subgroupStackAll||this.subgroupStack[e]||!1},this.subgroupIndex++),new Date(t.data.start)new Date(this.subgroups[e].end)&&(this.subgroups[e].end=i),this.subgroups[e].items.push(t)},o.prototype._updateSubgroupsSizes=function(){var t=this;if(t.subgroups)for(var e in t.subgroups){var i=t.subgroups[e].items[0].data.end||t.subgroups[e].items[0].data.start,o=t.subgroups[e].items[0].data.start,n=i-1;t.subgroups[e].items.forEach(function(t){new Date(t.data.start)new Date(n)&&(n=e)}),t.subgroups[e].start=o,t.subgroups[e].end=new Date(n-1)}},o.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t,e=[];if("string"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push({subgroup:t,sortField:this.subgroups[t].items[0].data[this.subgroupOrderer]});e.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push(this.subgroups[t].items[0].data);e.sort(this.subgroupOrderer)}if(e.length>0)for(var i=0;i=0&&(i.items.splice(o,1),i.items.length?this._updateSubgroupsSizes():delete this.subgroups[e])}}},o.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},o.prototype.order=function(){for(var t=r.toArray(this.items),e=[],i=[],o=0;o0)for(var l=0;lh}),1==this.checkRangedItems)for(this.checkRangedItems=!1,l=0;lh})}var p={},f=0;for(l=0;l0)for(var v=0;v=0&&(r=e[s],!n(r));s--)void 0===o[r.id]&&(o[r.id]=!0,i.push(r));for(s=t+1;st.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.visibleFrame=document.createElement("div"),this.dom.visibleFrame.className="vis-item-visible-frame",this.dom.box.appendChild(this.dom.visibleFrame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dom.box["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.box.className=this.baseClassName+e,this.dom.content.style.maxWidth="none"}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.frame).overflow,{content:{width:this.dom.content.offsetWidth},box:{height:this.dom.box.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=t.box.height,this.dom.content.style.maxWidth="",this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box),this._repaintDeleteButton(this.dom.box),this._repaintDragCenter(),this._repaintDragLeft(),this._repaintDragRight()},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.displayed=!1}},o.prototype.repositionX=function(t){var e,i,o=this.parent.width,n=this.conversion.toScreen(this.data.start),s=this.conversion.toScreen(this.data.end),r=void 0===this.data.align?this.options.align:this.data.align;!1===this.data.limitSize||void 0!==t&&!0!==t||(n<-o&&(n=-o),s>2*o&&(s=2*o));var a=Math.max(s-n+.5,1);switch(this.overflow?(this.options.rtl?this.right=n:this.left=n,this.width=a+this.props.content.width,i=this.props.content.width):(this.options.rtl?this.right=n:this.left=n,this.width=a,i=Math.min(s-n,this.props.content.width)),this.options.rtl?this.dom.box.style.right=this.right+"px":this.dom.box.style.left=this.left+"px",this.dom.box.style.width=a+"px",r){case"left":this.options.rtl?this.dom.content.style.right="0":this.dom.content.style.left="0";break;case"right":this.options.rtl?this.dom.content.style.right=Math.max(a-i,0)+"px":this.dom.content.style.left=Math.max(a-i,0)+"px";break;case"center":this.options.rtl?this.dom.content.style.right=Math.max((a-i)/2,0)+"px":this.dom.content.style.left=Math.max((a-i)/2,0)+"px";break;default:e=this.overflow?s>0?Math.max(-n,0):-i:n<0?-n:0,this.options.rtl?this.dom.content.style.right=e+"px":(this.dom.content.style.left=e+"px",this.dom.content.style.width="calc(100% - "+e+"px)")}},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},o.prototype._repaintDragLeft=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="vis-drag-left",t.dragLeftItem=this,this.dom.box.appendChild(t),this.dom.dragLeft=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragLeft||(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},o.prototype._repaintDragRight=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="vis-drag-right",t.dragRightItem=this,this.dom.box.appendChild(t),this.dom.dragRight=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragRight||(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(179).default,f=function(){function t(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;(0,d.default)(this,t),this.parent=e,this.changedOptions=[],this.container=i,this.allowCreation=!1,this.options={},this.initialized=!1,this.popupCounter=0,this.defaultOptions={enabled:!1,filter:!0,container:void 0,showButton:!0},c.extend(this.options,this.defaultOptions),this.configureOptions=o,this.moduleOptions={},this.domElements=[],this.popupDiv={},this.popupLimit=5,this.popupHistory={},this.colorPicker=new p(n),this.wrapper=void 0}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){this.popupHistory={},this._removePopup();var e=!0;"string"==typeof t?this.options.filter=t:t instanceof Array?this.options.filter=t.join():"object"===(void 0===t?"undefined":(0,a.default)(t))?(void 0!==t.container&&(this.options.container=t.container),void 0!==t.filter&&(this.options.filter=t.filter),void 0!==t.showButton&&(this.options.showButton=t.showButton),void 0!==t.enabled&&(e=t.enabled)):"boolean"==typeof t?(this.options.filter=!0,e=t):"function"==typeof t&&(this.options.filter=t,e=!0),!1===this.options.filter&&(e=!1),this.options.enabled=e}this._clean()}},{key:"setModuleOptions",value:function(t){this.moduleOptions=t,!0===this.options.enabled&&(this._clean(),void 0!==this.options.container&&(this.container=this.options.container),this._create())}},{key:"_create",value:function(){var t=this;this._clean(),this.changedOptions=[];var e=this.options.filter,i=0,o=!1;for(var n in this.configureOptions)this.configureOptions.hasOwnProperty(n)&&(this.allowCreation=!1,o=!1,"function"==typeof e?(o=e(n,[]),o=o||this._handleObject(this.configureOptions[n],[n],!0)):!0!==e&&-1===e.indexOf(n)||(o=!0),!1!==o&&(this.allowCreation=!0,i>0&&this._makeItem([]),this._makeHeader(n),this._handleObject(this.configureOptions[n],[n])),i++);if(!0===this.options.showButton){var s=document.createElement("div");s.className="vis-configuration vis-config-button",s.innerHTML="generate options",s.onclick=function(){t._printOptions()},s.onmouseover=function(){s.className="vis-configuration vis-config-button hover"},s.onmouseout=function(){s.className="vis-configuration vis-config-button"},this.optionsContainer=document.createElement("div"),this.optionsContainer.className="vis-configuration vis-config-option-container",this.domElements.push(this.optionsContainer),this.domElements.push(s)}this._push()}},{key:"_push",value:function(){this.wrapper=document.createElement("div"),this.wrapper.className="vis-configuration-wrapper",this.container.appendChild(this.wrapper);for(var t=0;t1?i-1:0),n=1;n2&&void 0!==arguments[2]&&arguments[2],o=document.createElement("div");return o.className="vis-configuration vis-config-label vis-config-s"+e.length,o.innerHTML=!0===i?""+t+":":t+":",o}},{key:"_makeDropdown",value:function(t,e,i){var o=document.createElement("select");o.className="vis-configuration vis-config-select";var n=0;void 0!==e&&-1!==t.indexOf(e)&&(n=t.indexOf(e));for(var s=0;ss&&1!==s&&(a.max=Math.ceil(1.2*e),d=a.max,h="range increased"),a.value=e}else a.value=o;var l=document.createElement("input");l.className="vis-configuration vis-config-rangeinput",l.value=a.value;var u=this;a.onchange=function(){l.value=this.value,u._update(Number(this.value),i)},a.oninput=function(){l.value=this.value};var c=this._makeLabel(i[i.length-1],i),p=this._makeItem(i,c,a,l);""!==h&&this.popupHistory[p]!==d&&(this.popupHistory[p]=d,this._setupPopup(h,p))}},{key:"_setupPopup",value:function(t,e){var i=this;if(!0===this.initialized&&!0===this.allowCreation&&this.popupCounter1&&void 0!==arguments[1]?arguments[1]:[],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=!1,n=this.options.filter,s=!1;for(var r in t)if(t.hasOwnProperty(r)){o=!0;var a=t[r],h=c.copyAndExtendArray(e,r);if("function"==typeof n&&!1===(o=n(r,e))&&!(a instanceof Array)&&"string"!=typeof a&&"boolean"!=typeof a&&a instanceof Object&&(this.allowCreation=!1,o=this._handleObject(a,h,!0),this.allowCreation=!1===i),!1!==o){s=!0;var d=this._getValue(h);if(a instanceof Array)this._handleArray(a,d,h);else if("string"==typeof a)this._makeTextInput(a,d,h);else if("boolean"==typeof a)this._makeCheckbox(a,d,h);else if(a instanceof Object){var l=!0;if(-1!==e.indexOf("physics")&&this.moduleOptions.physics.solver!==r&&(l=!1),!0===l)if(void 0!==a.enabled){var u=c.copyAndExtendArray(h,"enabled"),p=this._getValue(u);if(!0===p){var f=this._makeLabel(r,h,!0);this._makeItem(h,f),s=this._handleObject(a,h)||s}else this._makeCheckbox(a,p,h)}else{var m=this._makeLabel(r,h,!0);this._makeItem(h,m),s=this._handleObject(a,h)||s}}else console.error("dont know how to handle",a,r,h)}}return s}},{key:"_handleArray",value:function(t,e,i){"string"==typeof t[0]&&"color"===t[0]?(this._makeColorField(t,e,i),t[1]!==e&&this.changedOptions.push({path:i,value:e})):"string"==typeof t[0]?(this._makeDropdown(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:e})):"number"==typeof t[0]&&(this._makeRange(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:Number(e)}))}},{key:"_update",value:function(t,e){var i=this._constructOptions(t,e);this.parent.body&&this.parent.body.emitter&&this.parent.body.emitter.emit&&this.parent.body.emitter.emit("configChange",i),this.initialized=!0,this.parent.setOptions(i)}},{key:"_constructOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=i;t="true"===t||t,t="false"!==t&&t;for(var n=0;nvar options = "+(0,s.default)(t,null,2)+""}},{key:"getOptions",value:function(){for(var t={},e=0;ethis.imageObj.height?i=this.imageObj.width/this.imageObj.height:o=this.imageObj.height/this.imageObj.width),t=2*this.options.size*i,e=2*this.options.size*o}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.radius=.5*this.width}},{key:"_drawRawCircle",value:function(t,e,i,o){this.initContextForDraw(t,o),t.circle(e,i,o.size),this.performFill(t,o)}},{key:"_drawImageAtPosition",value:function(t,e){if(0!=this.imageObj.width){t.globalAlpha=1,this.enableShadow(t,e);var i=1;!0===this.options.shapeProperties.interpolation&&(i=this.imageObj.width/this.width/this.body.view.scale),this.imageObj.drawImageAtPosition(t,i,this.left,this.top,this.width,this.height),this.disableShadow(t,e)}}},{key:"_drawImageLabel",value:function(t,e,i,o,n){var s,r=0;if(void 0!==this.height){r=.5*this.height;var a=this.labelModule.getTextSize(t,o,n);a.lineCount>=1&&(r+=a.height/2)}s=i+r,this.options.label&&(this.labelOffset=r),this.labelModule.draw(t,e,s,o,n,"hanging")}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(29),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(117).default,v=i(48).default,g=i(215).default,y=i(217).default,b=i(218).default,_=i(219).default,w=function(){function t(e,i,o,n){if((0,u.default)(this,t),void 0===i)throw new Error("No body provided");this.options=f.bridgeObject(o),this.globalOptions=o,this.defaultOptions=n,this.body=i,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.selected=!1,this.hover=!1,this.labelDirty=!0,this.baseWidth=this.options.width,this.baseFontSize=this.options.font.size,this.from=void 0,this.to=void 0,this.edgeType=void 0,this.connected=!1,this.labelModule=new m(this.body,this.options,!0),this.setOptions(e)}return(0,p.default)(t,[{key:"setOptions",value:function(e){if(e){t.parseOptions(this.options,e,!0,this.globalOptions),void 0!==e.id&&(this.id=e.id),void 0!==e.from&&(this.fromId=e.from),void 0!==e.to&&(this.toId=e.to),void 0!==e.title&&(this.title=e.title),void 0!==e.value&&(e.value=parseFloat(e.value));var i=[e,this.options,this.defaultOptions];this.chooser=v.choosify("edge",i),this.updateLabelModule(e);var o=this.updateEdgeType();return this._setInteractionWidths(),this.connect(),void 0===e.hidden&&void 0===e.physics||(o=!0),o}}},{key:"getFormattingValues",value:function(){var t=!0===this.options.arrows.to||!0===this.options.arrows.to.enabled,e=!0===this.options.arrows.from||!0===this.options.arrows.from.enabled,i=!0===this.options.arrows.middle||!0===this.options.arrows.middle.enabled,o=this.options.color.inherit,n={toArrow:t,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,middleArrow:i,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,fromArrow:e,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,arrowStrikethrough:this.options.arrowStrikethrough,color:o?void 0:this.options.color.color,inheritsColor:o,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width};if(this.selected||this.hover)if(!0===this.chooser){if(this.selected){var s=this.options.selectionWidth;"function"==typeof s?n.width=s(n.width):"number"==typeof s&&(n.width+=s),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.highlight,n.shadow=this.options.shadow.enabled}else if(this.hover){var r=this.options.hoverWidth;"function"==typeof r?n.width=r(n.width):"number"==typeof r&&(n.width+=r),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.hover,n.shadow=this.options.shadow.enabled}}else"function"==typeof this.chooser&&(this.chooser(n,this.options.id,this.selected,this.hover),void 0!==n.color&&(n.inheritsColor=!1),!1===n.shadow&&(n.shadowColor===this.options.shadow.color&&n.shadowSize===this.options.shadow.size&&n.shadowX===this.options.shadow.x&&n.shadowY===this.options.shadow.y||(n.shadow=!0)));else n.shadow=this.options.shadow.enabled,n.width=Math.max(n.width,.3/this.body.view.scale);return n}},{key:"updateLabelModule",value:function(t){var e=[t,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,e),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}},{key:"updateEdgeType",value:function(){var t=this.options.smooth,e=!1,i=!0;return void 0!==this.edgeType&&((this.edgeType instanceof y&&!0===t.enabled&&"dynamic"===t.type||this.edgeType instanceof g&&!0===t.enabled&&"cubicBezier"===t.type||this.edgeType instanceof b&&!0===t.enabled&&"dynamic"!==t.type&&"cubicBezier"!==t.type||this.edgeType instanceof _&&!1===t.type.enabled)&&(i=!1),!0===i&&(e=this.cleanup())),!0===i?!0===t.enabled?"dynamic"===t.type?(e=!0,this.edgeType=new y(this.options,this.body,this.labelModule)):"cubicBezier"===t.type?this.edgeType=new g(this.options,this.body,this.labelModule):this.edgeType=new b(this.options,this.body,this.labelModule):this.edgeType=new _(this.options,this.body,this.labelModule):this.edgeType.setOptions(this.options),e}},{key:"connect",value:function(){this.disconnect(),this.from=this.body.nodes[this.fromId]||void 0,this.to=this.body.nodes[this.toId]||void 0,this.connected=void 0!==this.from&&void 0!==this.to,!0===this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this)),this.edgeType.connect()}},{key:"disconnect",value:function(){this.from&&(this.from.detachEdge(this),this.from=void 0),this.to&&(this.to.detachEdge(this),this.to=void 0),this.connected=!1}},{key:"getTitle",value:function(){return this.title}},{key:"isSelected",value:function(){return this.selected}},{key:"getValue",value:function(){return this.options.value}},{key:"setValueRange",value:function(t,e,i){if(void 0!==this.options.value){var o=this.options.scaling.customScalingFunction(t,e,i,this.options.value),n=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){var s=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+o*s}this.options.width=this.options.scaling.min+o*n}else this.options.width=this.baseWidth,this.options.font.size=this.baseFontSize;this._setInteractionWidths(),this.updateLabelModule()}},{key:"_setInteractionWidths",value:function(){"function"==typeof this.options.hoverWidth?this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width):this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width,"function"==typeof this.options.selectionWidth?this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width):this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}},{key:"draw",value:function(t){var e=this.getFormattingValues();if(!e.hidden){var i=this.edgeType.getViaNode(),o={};this.edgeType.fromPoint=this.edgeType.from,this.edgeType.toPoint=this.edgeType.to,e.fromArrow&&(o.from=this.edgeType.getArrowData(t,"from",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.fromPoint=o.from.core)),e.toArrow&&(o.to=this.edgeType.getArrowData(t,"to",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.toPoint=o.to.core)),e.middleArrow&&(o.middle=this.edgeType.getArrowData(t,"middle",i,this.selected,this.hover,e)),this.edgeType.drawLine(t,e,this.selected,this.hover,i),this.drawArrows(t,o,e),this.drawLabel(t,i)}}},{key:"drawArrows",value:function(t,e,i){i.fromArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.from),i.middleArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.middle),i.toArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.to)}},{key:"drawLabel",value:function(t,e){if(void 0!==this.options.label){var i=this.from,o=this.to;if(this.labelModule.differentState(this.selected,this.hover)&&this.labelModule.getTextSize(t,this.selected,this.hover),i.id!=o.id){this.labelModule.pointToSelf=!1;var n=this.edgeType.getPoint(.5,e);t.save();var s=this._getRotation(t);0!=s.angle&&(t.translate(s.x,s.y),t.rotate(s.angle)),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover),t.restore()}else{this.labelModule.pointToSelf=!0;var r,a,h=this.options.selfReferenceSize;i.shape.width>i.shape.height?(r=i.x+.5*i.shape.width,a=i.y-h):(r=i.x+h,a=i.y-.5*i.shape.height),n=this._pointOnCircle(r,a,h,.125),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover)}}}},{key:"getItemsOnPoint",value:function(t){var e=[];if(this.labelModule.visible()){var i=this._getRotation();v.pointInRect(this.labelModule.getSize(),t,i)&&e.push({edgeId:this.id,labelId:0})}var o={left:t.x,top:t.y};return this.isOverlappingWith(o)&&e.push({edgeId:this.id}),e}},{key:"isOverlappingWith",value:function(t){if(this.connected){var e=this.from.x,i=this.from.y,o=this.to.x,n=this.to.y,s=t.left,r=t.top;return this.edgeType.getDistanceToEdge(e,i,o,n,s,r)<10}return!1}},{key:"_getRotation",value:function(t){var e=this.edgeType.getViaNode(),i=this.edgeType.getPoint(.5,e);void 0!==t&&this.labelModule.calculateLabelSize(t,this.selected,this.hover,i.x,i.y);var o={x:i.x,y:this.labelModule.size.yLine,angle:0};if(!this.labelModule.visible())return o;if("horizontal"===this.options.font.align)return o;var n=this.from.y-this.to.y,s=this.from.x-this.to.x,r=Math.atan2(n,s);return(r<-1&&s<0||r>0&&s<0)&&(r+=Math.PI),o.angle=r,o}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"select",value:function(){this.selected=!0}},{key:"unselect",value:function(){this.selected=!1}},{key:"cleanup",value:function(){return this.edgeType.cleanup()}},{key:"remove",value:function(){this.cleanup(),this.disconnect(),delete this.body.edges[this.id]}},{key:"endPointsValid",value:function(){return void 0!==this.body.nodes[this.fromId]&&void 0!==this.body.nodes[this.toId]}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r=["arrowStrikethrough","id","from","hidden","hoverWidth","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","to","title","value","width","font","chosen","widthConstraint"];if(f.selectiveDeepExtend(r,t,e,i),v.isValidLabel(e.label)?t.label=e.label:t.label=void 0,f.mergeOptions(t,e,"smooth",o),f.mergeOptions(t,e,"shadow",o),void 0!==e.dashes&&null!==e.dashes?t.dashes=e.dashes:!0===i&&null===e.dashes&&(t.dashes=(0,d.default)(o.dashes)),void 0!==e.scaling&&null!==e.scaling?(void 0!==e.scaling.min&&(t.scaling.min=e.scaling.min),void 0!==e.scaling.max&&(t.scaling.max=e.scaling.max),f.mergeOptions(t.scaling,e.scaling,"label",o.scaling)):!0===i&&null===e.scaling&&(t.scaling=(0,d.default)(o.scaling)),void 0!==e.arrows&&null!==e.arrows)if("string"==typeof e.arrows){var h=e.arrows.toLowerCase();t.arrows.to.enabled=-1!=h.indexOf("to"),t.arrows.middle.enabled=-1!=h.indexOf("middle"),t.arrows.from.enabled=-1!=h.indexOf("from")}else{if("object"!==(0,a.default)(e.arrows))throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+(0,s.default)(e.arrows));f.mergeOptions(t.arrows,e.arrows,"to",o.arrows),f.mergeOptions(t.arrows,e.arrows,"middle",o.arrows),f.mergeOptions(t.arrows,e.arrows,"from",o.arrows)}else!0===i&&null===e.arrows&&(t.arrows=(0,d.default)(o.arrows));if(void 0!==e.color&&null!==e.color){var l=e.color,u=t.color;if(n)f.deepExtend(u,o.color,!1,i);else for(var c in u)u.hasOwnProperty(c)&&delete u[c];if(f.isString(u))u.color=u,u.highlight=u,u.hover=u,u.inherit=!1,void 0===l.opacity&&(u.opacity=1);else{var p=!1;void 0!==l.color&&(u.color=l.color,p=!0),void 0!==l.highlight&&(u.highlight=l.highlight,p=!0),void 0!==l.hover&&(u.hover=l.hover,p=!0),void 0!==l.inherit&&(u.inherit=l.inherit),void 0!==l.opacity&&(u.opacity=Math.min(1,Math.max(0,l.opacity))),!0===p?u.inherit=!1:void 0===u.inherit&&(u.inherit="from")}}else!0===i&&null===e.color&&(t.color=f.bridgeObject(o.color));!0===i&&null===e.font&&(t.font=f.bridgeObject(o.font))}}]),t}();e.default=w},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_findBorderPositionBezier",value:function(t,e){var i,o,n,s,r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this._getViaCoordinates(),h=0,d=0,l=1,u=this.to,c=!1;for(t.id===this.from.id&&(u=this.from,c=!0);d<=l&&h<10;){var p=.5*(d+l);if(i=this.getPoint(p,a),o=Math.atan2(u.y-i.y,u.x-i.x),n=u.distanceToBorder(e,o),s=Math.sqrt(Math.pow(i.x-u.x,2)+Math.pow(i.y-u.y,2)),r=n-s,Math.abs(r)<.2)break;r<0?!1===c?d=p:l=p:!1===c?l=p:d=p,h++}return i.t=p,i}},{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r){var a=1e9,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=t,f=e;for(d=1;d<10;d++)l=.1*d,u=Math.pow(1-l,2)*t+2*l*(1-l)*r.x+Math.pow(l,2)*i,c=Math.pow(1-l,2)*e+2*l*(1-l)*r.y+Math.pow(l,2)*o,d>0&&(h=this._getDistanceToLine(p,f,u,c,n,s),a=h1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;ae.shape.boundingBox.left&&(s=e.shape.boundingBox.left),re.shape.boundingBox.top&&(o=e.shape.boundingBox.top),n1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;ae.x&&(s=e.x),re.y&&(o=e.y),nh;)o(a,i=e[h++])&&(~s(d,i)||d.push(i));return d}},function(t,e,i){var o=i(22),n=i(41),s=i(56)("IE_PROTO"),r=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=n(t),o(t,s)?t[s]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?r:null}},function(t,e,i){var o=i(50),n=i(13)("toStringTag"),s="Arguments"==o(function(){return arguments}()),r=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,i,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=r(e=Object(t),n))?i:s?o(e):"Object"==(a=o(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,i){var o=i(17),n=i(7),s=i(28);t.exports=function(t,e){var i=(n.Object||{})[t]||Object[t],r={};r[t]=e(i),o(o.S+o.F*s(function(){i(1)}),"Object",r)}},function(t,e,i){var o=i(84),n=i(58).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return o(t,n)}},function(t,e,i){var o=i(42),n=i(39),s=i(25),r=i(53),a=i(22),h=i(81),d=Object.getOwnPropertyDescriptor;e.f=i(21)?d:function(t,e){if(t=s(t),e=r(e,!0),h)try{return d(t,e)}catch(t){}if(a(t,e))return n(!o.f.call(t,e),t[e])}},function(t,e,i){t.exports={default:i(162),__esModule:!0}},function(t,e,i){function o(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0}t.exports=o},function(t,e,i){function o(t,e){if(void 0===t)throw new Error("No container element defined");if(this.container=t,this.visible=!e||void 0==e.visible||e.visible,this.visible){this.frame=document.createElement("DIV"),this.frame.style.width="100%",this.frame.style.position="relative",this.container.appendChild(this.frame),this.frame.prev=document.createElement("INPUT"),this.frame.prev.type="BUTTON",this.frame.prev.value="Prev",this.frame.appendChild(this.frame.prev),this.frame.play=document.createElement("INPUT"),this.frame.play.type="BUTTON",this.frame.play.value="Play",this.frame.appendChild(this.frame.play),this.frame.next=document.createElement("INPUT"),this.frame.next.type="BUTTON",this.frame.next.value="Next",this.frame.appendChild(this.frame.next),this.frame.bar=document.createElement("INPUT"),this.frame.bar.type="BUTTON",this.frame.bar.style.position="absolute",this.frame.bar.style.border="1px solid red",this.frame.bar.style.width="100px",this.frame.bar.style.height="6px",this.frame.bar.style.borderRadius="2px",this.frame.bar.style.MozBorderRadius="2px",this.frame.bar.style.border="1px solid #7F7F7F",this.frame.bar.style.backgroundColor="#E5E5E5",this.frame.appendChild(this.frame.bar),this.frame.slide=document.createElement("INPUT"),this.frame.slide.type="BUTTON",this.frame.slide.style.margin="0px",this.frame.slide.value=" ",this.frame.slide.style.position="relative",this.frame.slide.style.left="-100px",this.frame.appendChild(this.frame.slide);var i=this;this.frame.slide.onmousedown=function(t){i._onMouseDown(t)},this.frame.prev.onclick=function(t){i.prev(t)},this.frame.play.onclick=function(t){i.togglePlay(t)},this.frame.next.onclick=function(t){i.next(t)}}this.onChangeCallback=void 0,this.values=[],this.index=void 0,this.playTimeout=void 0,this.playInterval=1e3,this.playLoop=!0}var n=i(2);o.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},o.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},o.prototype.setIndex=function(t){if(!(tthis.values.length-1&&(o=this.values.length-1),o},o.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;return t/(this.values.length-1)*e+3},o.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,o=this.leftToIndex(i);this.setIndex(o),n.preventDefault()},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",n.removeEventListener(document,"mousemove",this.onmousemove),n.removeEventListener(document,"mouseup",this.onmouseup),n.preventDefault()},t.exports=o},function(t,e,i){function o(t,e,i,o){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,o)}o.prototype.isNumeric=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.prototype.setRange=function(t,e,i,o){if(!this.isNumeric(t))throw new Error("Parameter 'start' is not numeric; value: "+t);if(!this.isNumeric(e))throw new Error("Parameter 'end' is not numeric; value: "+t);if(!this.isNumeric(i))throw new Error("Parameter 'step' is not numeric; value: "+t);this._start=t||0,this._end=e||0,this.setStep(i,o)},o.prototype.setStep=function(t,e){void 0===t||t<=0||(void 0!==e&&(this.prettyStep=e),!0===this.prettyStep?this._step=o.calculatePrettyStep(t):this._step=t)},o.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),o=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),s=i;return Math.abs(o-t)<=Math.abs(s-t)&&(s=o),Math.abs(n-t)<=Math.abs(s-t)&&(s=n),s<=0&&(s=1),s},o.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},o.prototype.getStep=function(){return this._step},o.prototype.start=function(t){void 0===t&&(t=!1),this._current=this._start-this._start%this._step,t&&this.getCurrent()this._end},t.exports=o},function(t,e,i){function o(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}function n(t){return void 0===t||""===t||"string"!=typeof t?t:t.charAt(0).toUpperCase()+t.slice(1)}function s(t,e){return void 0===t||""===t?e:t+n(e)}function r(t,e,i,o){for(var n,r,a=0;ar&&(t=o(t)*r),i(e)>r&&(e=o(e)*r),this.cameraOffset.x=t,this.cameraOffset.y=e,this.calculateCameraOrientation()},o.prototype.getOffset=function(){return this.cameraOffset},o.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},o.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),void 0===t&&void 0===e||this.calculateCameraOrientation()},o.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},o.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.setOffset(this.cameraOffset.x,this.cameraOffset.y),this.calculateCameraOrientation())}, -o.prototype.getArmLength=function(){return this.armLength},o.prototype.getCameraLocation=function(){return this.cameraLocation},o.prototype.getCameraRotation=function(){return this.cameraRotation},o.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal;var t=this.cameraRotation.x,e=this.cameraRotation.z,i=this.cameraOffset.x,o=this.cameraOffset.y,n=Math.sin,s=Math.cos;this.cameraLocation.x=this.cameraLocation.x+i*s(e)+o*-n(e)*s(t),this.cameraLocation.y=this.cameraLocation.y+i*n(e)+o*s(e)*s(t),this.cameraLocation.z=this.cameraLocation.z+o*n(t)},t.exports=o},function(t,e,i){function o(t,e,i){this.dataGroup=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=t.getDistinctValues(this.column),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var n=i(12);o.prototype.isLoaded=function(){return this.loaded},o.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},o.prototype.getLabel=function(){return this.graph.filterLabel},o.prototype.getColumn=function(){return this.column},o.prototype.getSelectedValue=function(){if(void 0!==this.index)return this.values[this.index]},o.prototype.getValues=function(){return this.values},o.prototype.getValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");return this.values[t]},o.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var o=new n(this.dataGroup.getDataSet(),{filter:function(t){return t[i.column]==i.value}}).get();e=this.dataGroup._getDataPoints(o),this.dataPoints[t]=e}return e},o.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},o.prototype.selectValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");this.index=t,this.value=this.values[t]},o.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t0){var n=i.groupsData.getDataSet();n.get().forEach(function(t){if(t.nestedGroups){0!=t.showNested&&(t.showNested=!0);var e=[];t.nestedGroups.forEach(function(i){var o=n.get(i);o&&(o.nestedInGroup=t.id,0==t.showNested&&(o.visible=!1),e=e.concat(o))}),n.update(e,o)}})}},update:function(t,e,o){i._onUpdateGroups(e.items)},remove:function(t,e,o){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.popup=null,this.touchParams={},this.groupTouchParams={},this._create(),this.setOptions(e)}var s=i(29),r=o(s),a=i(6),h=o(a),d=i(10),l=i(2),u=i(11),c=i(12),p=i(66),f=i(16),m=i(68),v=i(69),g=i(101),y=i(102),b=i(70),_=i(103),w=i(104).default,x="__ungrouped__",k="__background__";n.prototype=new f,n.types={background:_,box:g,range:b,point:y},n.prototype._create=function(){var t=document.createElement("div");t.className="vis-itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="vis-background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="vis-foreground",t.appendChild(i),this.dom.foreground=i;var o=document.createElement("div");o.className="vis-axis",this.dom.axis=o;var n=document.createElement("div");n.className="vis-labelset",this.dom.labelSet=n,this._updateUngrouped();var s=new v(k,null,this);s.show(),this.groups[k]=s,this.hammer=new d(this.body.dom.centerContainer),this.hammer.on("hammer.input",function(t){t.isFirst&&this._onTouch(t)}.bind(this)),this.hammer.on("panstart",this._onDragStart.bind(this)),this.hammer.on("panmove",this._onDrag.bind(this)),this.hammer.on("panend",this._onDragEnd.bind(this)),this.hammer.get("pan").set({threshold:5,direction:d.DIRECTION_HORIZONTAL}),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("press",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.options.rtl?this.groupHammer=new d(this.body.dom.rightContainer):this.groupHammer=new d(this.body.dom.leftContainer),this.groupHammer.on("tap",this._onGroupClick.bind(this)),this.groupHammer.on("panstart",this._onGroupDragStart.bind(this)),this.groupHammer.on("panmove",this._onGroupDrag.bind(this)),this.groupHammer.on("panend",this._onGroupDragEnd.bind(this)),this.groupHammer.get("pan").set({threshold:5,direction:d.DIRECTION_VERTICAL}),this.body.dom.centerContainer.addEventListener("mouseover",this._onMouseOver.bind(this)),this.body.dom.centerContainer.addEventListener("mouseout",this._onMouseOut.bind(this)),this.body.dom.centerContainer.addEventListener("mousemove",this._onMouseMove.bind(this)),this.body.dom.centerContainer.addEventListener("contextmenu",this._onDragEnd.bind(this)),this.body.dom.centerContainer.addEventListener("mousewheel",this._onMouseWheel.bind(this)),this.show()},n.prototype.setOptions=function(t){if(t){var e=["type","rtl","align","order","stack","stackSubgroups","selectable","multiselect","multiselectPerGroup","groupOrder","dataAttributes","template","groupTemplate","visibleFrameTemplate","hide","snap","groupOrderSwap","showTooltips","tooltip","tooltipOnItemUpdateTime"];l.selectiveExtend(e,this.options,t),"itemsAlwaysDraggable"in t&&("boolean"==typeof t.itemsAlwaysDraggable?(this.options.itemsAlwaysDraggable.item=t.itemsAlwaysDraggable,this.options.itemsAlwaysDraggable.range=!1):"object"===(0,h.default)(t.itemsAlwaysDraggable)&&(l.selectiveExtend(["item","range"],this.options.itemsAlwaysDraggable,t.itemsAlwaysDraggable),this.options.itemsAlwaysDraggable.item||(this.options.itemsAlwaysDraggable.range=!1))),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation.item="top"===t.orientation?"top":"bottom":"object"===(0,h.default)(t.orientation)&&"item"in t.orientation&&(this.options.orientation.item=t.orientation.item)),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"===(0,h.default)(t.margin)&&(l.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"===(0,h.default)(t.margin.item)&&l.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable,this.options.editable.overrideItems=!1):"object"===(0,h.default)(t.editable)&&l.selectiveExtend(["updateTime","updateGroup","add","remove","overrideItems"],this.options.editable,t.editable)),"groupEditable"in t&&("boolean"==typeof t.groupEditable?(this.options.groupEditable.order=t.groupEditable,this.options.groupEditable.add=t.groupEditable,this.options.groupEditable.remove=t.groupEditable):"object"===(0,h.default)(t.groupEditable)&&l.selectiveExtend(["order","add","remove"],this.options.groupEditable,t.groupEditable));["onDropObjectOnItem","onAdd","onUpdate","onRemove","onMove","onMoving","onAddGroup","onMoveGroup","onRemoveGroup"].forEach(function(e){var i=t[e];if(i){if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this)),this.markDirty()}},n.prototype.markDirty=function(t){this.groupIds=[],t&&t.refreshItems&&l.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()})},n.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},n.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},n.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||(this.options.rtl?this.body.dom.right.appendChild(this.dom.labelSet):this.body.dom.left.appendChild(this.dom.labelSet))},n.prototype.setSelection=function(t){var e,i,o,n;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;et&&o.push(h.id):h.lefte&&o.push(h.id)}return o},n.prototype._deselect=function(t){for(var e=this.selection,i=0,o=e.length;i0){for(var w={},x=0;x<_;x++)l.forEach(b,function(t,e){w[e]=t[x]()});l.forEach(this.groups,function(t,e){if(e!==k){var i=w[e];s=i||s,g+=t.height}}),g=Math.max(g,y)}return g=Math.max(g,y),r.style.height=i(g),this.props.width=r.offsetWidth,this.props.height=g,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.options.rtl?this.dom.axis.style.right="0":this.dom.axis.style.left="0",this.initialItemSetDrawn=!0,s=this._isResized()||s},n.prototype._firstGroup=function(){var t="top"==this.options.orientation.item?0:this.groupIds.length-1,e=this.groupIds[t];return this.groups[e]||this.groups[x]||null},n.prototype._updateUngrouped=function(){var t,e,i=this.groups[x];if(this.groupsData){if(i){i.hide(),delete this.groups[x];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)||t.hide()}}}else if(!i){i=new m(null,null,this),this.groups[x]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},n.prototype.getLabelSet=function(){return this.dom.labelSet},n.prototype.setItems=function(t){var e,i=this,o=this.itemsData;if(t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(o&&(l.forEach(this.itemListeners,function(t,e){o.off(e,t)}),e=o.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;l.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}this.body.emitter.emit("_change",{queue:!0})},n.prototype.getItems=function(){return this.itemsData},n.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(l.forEach(this.groupListeners,function(t,e){i.groupsData.off(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var o=this.groupsData;this.groupsData instanceof c&&(o=this.groupsData.getDataSet()),o.get().forEach(function(t){t.nestedGroups&&t.nestedGroups.forEach(function(e){var i=o.get(e);i.nestedInGroup=t.id,0==t.showNested&&(i.visible=!1),o.update(i)})});var n=this.id;l.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,n)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype.getGroups=function(){return this.groupsData},n.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},n.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},n.prototype._getGroupId=function(t){return"background"==this._getType(t)&&void 0==t.group?k:this.groupsData?t.group:x},n.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i,o=e.itemsData.get(t,e.itemOptions),s=e.items[t],r=o?e._getType(o):null,a=n.types[r];if(s&&(a&&s instanceof a?e._updateItem(s,o):(i=s.selected,e._removeItem(s),s=null)),!s&&o){if(!a)throw"rangeoverflow"==r?new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: .vis-item.vis-range .vis-item-content {overflow: visible;}'):new TypeError('Unknown item type "'+r+'"');s=new a(o,e.conversion,e.options),s.id=t,e._addItem(s),i&&(this.selection.push(t),s.select())}}.bind(this)),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onAdd=n.prototype._onUpdate,n.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var o=i.items[t];o&&(e++,i._removeItem(o))}),e&&(this._order(),this.body.emitter.emit("_change",{queue:!0}))},n.prototype._order=function(){l.forEach(this.groups,function(t){t.order()})},n.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},n.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),o=e.groups[t];if(o)o.setData(i);else{if(t==x||t==k)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=(0,r.default)(e.options);l.extend(n,{height:null}),o=new m(t,i,e),e.groups[t]=o;for(var s in e.items)if(e.items.hasOwnProperty(s)){var a=e.items[s];a.data.group==t&&o.add(a)}o.order(),o.show()}}),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder});t=this._orderNestedGroups(t);var e=!l.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},n.prototype._orderNestedGroups=function(t){var e=[];return t.forEach(function(t){var i=this.groupsData.get(t);if(i.nestedInGroup||e.push(t),i.nestedGroups){var o=this.groupsData.get({filter:function(e){return e.nestedInGroup==t},order:this.options.groupOrder}),n=o.map(function(t){return t.id});e=e.concat(n)}},this),e},n.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i?i&&i.data&&i.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1,i&&i.add(t)},n.prototype._updateItem=function(t,e){t.setData(e);var i=this._getGroupId(t.data),o=this.groups[i];o?o&&o.data&&o.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1},n.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},n.prototype._constructByEndArray=function(t){for(var e=[],i=0;in)return}}if(i&&i!=this.groupTouchParams.group){var a=e.get(i.groupId),h=e.get(this.groupTouchParams.group.groupId);h&&a&&(this.options.groupOrderSwap(h,a,e),e.update(h),e.update(a));var d=e.getIds({order:this.options.groupOrder});if(!l.equalArray(d,this.groupTouchParams.originalOrder))for(var u=this.groupTouchParams.originalOrder,p=this.groupTouchParams.group.groupId,f=Math.min(u.length,d.length),m=0,v=0,g=0;m=f)break;if(d[m+v]==p)v=1;else if(u[m+g]==p)g=1;else{var y=d.indexOf(u[m+g]),b=e.get(d[m+v]),_=e.get(u[m+g]);this.options.groupOrderSwap(b,_,e),e.update(b),e.update(_);var w=d[m+v];d[m+v]=u[m+g],d[y]=w,m++}}}}},n.prototype._onGroupDragEnd=function(t){if(this.options.groupEditable.order&&this.groupTouchParams.group){t.stopPropagation();var e=this,i=e.groupTouchParams.group.groupId,o=e.groupsData.getDataSet(),n=l.extend({},o.get(i));e.options.onMoveGroup(n,function(t){if(t)t[o._fieldId]=i,o.update(t);else{var n=o.getIds({order:e.options.groupOrder});if(!l.equalArray(n,e.groupTouchParams.originalOrder))for(var s=e.groupTouchParams.originalOrder,r=Math.min(s.length,n.length),a=0;a=r)break;var h=n.indexOf(s[a]),d=o.get(n[a]),u=o.get(s[a]);e.options.groupOrderSwap(d,u,o),o.update(d),o.update(u);var c=n[a];n[a]=s[a],n[h]=c,a++}}}),e.body.emitter.emit("groupDragged",{groupId:i})}},n.prototype._onSelectItem=function(t){if(this.options.selectable){var e=t.srcEvent&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey),i=t.srcEvent&&t.srcEvent.shiftKey;if(e||i)return void this._onMultiSelectItem(t);var o=this.getSelection(),n=this.itemFromTarget(t),s=n?[n.id]:[];this.setSelection(s);var r=this.getSelection();(r.length>0||o.length>0)&&this.body.emitter.emit("select",{items:r,event:t})}},n.prototype._onMouseOver=function(t){var e=this.itemFromTarget(t);if(e){if(e!==this.itemFromRelatedTarget(t)){var i=e.getTitle();if(this.options.showTooltips&&i){null==this.popup&&(this.popup=new w(this.body.dom.root,this.options.tooltip.overflowMethod||"flip")),this.popup.setText(i);var o=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(o)+o.offsetLeft,t.clientY-l.getAbsoluteTop(o)+o.offsetTop),this.popup.show()}else null!=this.popup&&this.popup.hide();this.body.emitter.emit("itemover",{item:e.id,event:t})}}},n.prototype._onMouseOut=function(t){var e=this.itemFromTarget(t);if(e){e!==this.itemFromRelatedTarget(t)&&(null!=this.popup&&this.popup.hide(),this.body.emitter.emit("itemout",{item:e.id,event:t}))}},n.prototype._onMouseMove=function(t){if(this.itemFromTarget(t)&&this.options.showTooltips&&this.options.tooltip.followMouse&&this.popup&&!this.popup.hidden){var e=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(e)+e.offsetLeft,t.clientY-l.getAbsoluteTop(e)+e.offsetTop),this.popup.show()}},n.prototype._onMouseWheel=function(t){this.touchParams.itemIsDragging&&this._onDragEnd(t)},n.prototype._onUpdateItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this;if(t){var i=e.itemsData.get(t.id);this.options.onUpdate(i,function(t){t&&e.itemsData.getDataSet().update(t)})}}},n.prototype._onDropObjectOnItem=function(t){var e=this.itemFromTarget(t),i=JSON.parse(t.dataTransfer.getData("text"));this.options.onDropObjectOnItem(i,e)},n.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e,i,o=this,n=this.options.snap||null;this.options.rtl?(e=l.getAbsoluteRight(this.dom.frame),i=e-t.center.x):(e=l.getAbsoluteLeft(this.dom.frame),i=t.center.x-e);var s,r,a=this.body.util.toTime(i),h=this.body.util.getScale(),d=this.body.util.getStep();"drop"==t.type?(r=JSON.parse(t.dataTransfer.getData("text")),r.content=r.content?r.content:"new item",r.start=r.start?r.start:n?n(a,h,d):a,r.type=r.type||"box",r[this.itemsData._fieldId]=r.id||l.randomUUID(),"range"!=r.type||r.end||(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s)):(r={start:n?n(a,h,d):a,content:"new item"},r[this.itemsData._fieldId]=l.randomUUID(),"range"===this.options.type&&(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s));var u=this.groupFromTarget(t);u&&(r.group=u.groupId),r=this._cloneItemData(r),this.options.onAdd(r,function(e){e&&(o.itemsData.getDataSet().add(e),"drop"==t.type&&o.setSelection([e.id]))})}},n.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e=this.itemFromTarget(t);if(e){ -var i=this.options.multiselect?this.getSelection():[];if((t.srcEvent&&t.srcEvent.shiftKey||!1)&&this.options.multiselect){var o=this.itemsData.get(e.id).group,s=void 0;this.options.multiselectPerGroup&&i.length>0&&(s=this.itemsData.get(i[0]).group),this.options.multiselectPerGroup&&void 0!=s&&s!=o||i.push(e.id);var r=n._getItemRange(this.itemsData.get(i,this.itemOptions));if(!this.options.multiselectPerGroup||s==o){i=[];for(var a in this.items)if(this.items.hasOwnProperty(a)){var h=this.items[a],d=h.data.start,l=void 0!==h.data.end?h.data.end:d;!(d>=r.min&&l<=r.max)||this.options.multiselectPerGroup&&s!=this.itemsData.get(h.id).group||h instanceof _||i.push(h.id)}}}else{var u=i.indexOf(e.id);-1==u?i.push(e.id):i.splice(u,1)}this.setSelection(i),this.body.emitter.emit("select",{items:this.getSelection(),event:t})}}},n._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.starte)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},n.prototype.itemFromElement=function(t){for(var e=t;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},n.prototype.itemFromTarget=function(t){return this.itemFromElement(t.target)},n.prototype.itemFromRelatedTarget=function(t){return this.itemFromElement(t.relatedTarget)},n.prototype.groupFromTarget=function(t){var e=t.center?t.center.y:t.clientY,i=this.groupIds;i.length<=0&&this.groupsData&&(i=this.groupsData.getIds({order:this.options.groupOrder}));for(var o=0;oa&&ea)return s}else if(0===o&&es&&(s=r.top+r.height)}while(a)}}o.height=s-o.top+.5*i.item.vertical},e.nostack=function(t,i,o,n){for(var s=0;so[r].index&&e.collisionByTimes(o[n],o[r])){s=o[r];break}null!=s&&(o[n].top=s.top+s.height)}while(s)}for(var a=0;ao[h].index&&(o[r].top+=o[h].height);for(var d=t[r],l=0;le.right&&t.top-i.vertical+.001e.top:t.left-i.horizontal+.001e.left&&t.top-i.vertical+.001e.top},e.collisionByTimes=function(t,e){return t.start<=e.start&&t.end>=e.start&&t.tope.top||e.start<=t.start&&e.end>=t.start&&e.topt.top}},function(t,e,i){function o(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},this.options=i,t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(38);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=this.options.align,i=this.width*t.getMillisecondsPerPixel();return"right"==e?this.data.start.getTime()>t.start&&this.data.start.getTime()-it.start&&this.data.start.getTime()t.start&&this.data.start.getTime()-i/2t.start&&this.data.startt.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.background;if(!t)throw new Error("Cannot redraw item: parent has no background container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var t=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"");this.dom.box.className=this.baseClassName+t}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.content).overflow,{content:{width:this.dom.content.offsetWidth}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=0,this.dirty=!1},o.prototype._repaintDomAdditionals=function(){},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=r.prototype.show,o.prototype.hide=r.prototype.hide,o.prototype.repositionX=r.prototype.repositionX,o.prototype.repositionY=function(t){var e,i=this.options.orientation.item;if(void 0!==this.data.subgroup){var o=this.data.subgroup;this.dom.box.style.height=this.parent.subgroups[o].height+"px",this.dom.box.style.top="top"==i?this.parent.top+this.parent.subgroups[o].top+"px":this.parent.top+this.parent.height-this.parent.subgroups[o].top-this.parent.subgroups[o].height+"px",this.dom.box.style.bottom=""}else this.parent instanceof s?(e=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.bottom="bottom"==i?"0":"",this.dom.box.style.top="top"==i?"0":""):(e=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=e+"px"},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i){(0,s.default)(this,t),this.container=e,this.overflowMethod=i||"cap",this.x=0,this.y=0,this.padding=5,this.hidden=!1,this.frame=document.createElement("div"),this.frame.className="vis-tooltip",this.container.appendChild(this.frame)}return(0,a.default)(t,[{key:"setPosition",value:function(t,e){this.x=parseInt(t),this.y=parseInt(e)}},{key:"setText",value:function(t){t instanceof Element?(this.frame.innerHTML="",this.frame.appendChild(t)):this.frame.innerHTML=t}},{key:"show",value:function(t){if(void 0===t&&(t=!0),!0===t){var e=this.frame.clientHeight,i=this.frame.clientWidth,o=this.frame.parentNode.clientHeight,n=this.frame.parentNode.clientWidth,s=0,r=0;if("flip"==this.overflowMethod){var a=!1,h=!0;this.y-en-this.padding&&(a=!0),s=a?this.x-i:this.x,r=h?this.y-e:this.y}else r=this.y-e,r+e+this.padding>o&&(r=o-e-this.padding),rn&&(s=n-i-this.padding),s0){var r={};for(this._getRelevantData(s,r,o,n),this._applySampling(s,r),e=0;e0)switch(t.options.style){case"line":d.hasOwnProperty(s[e])||(d[s[e]]=m.calcPath(r[s[e]],t)),m.draw(d[s[e]],t,this.framework);case"point":case"points":"point"!=t.options.style&&"points"!=t.options.style&&1!=t.options.drawPoints.enabled||v.draw(r[s[e]],t,this.framework)}}}return a.cleanupElements(this.svgElements),!1},o.prototype._stack=function(t,e){var i,o,n,s,r;i=0;for(var a=0;at[a].x){r=e[h],s=0==h?r:e[h-1],i=h;break}}void 0===r&&(s=e[e.length-1],r=e[e.length-1]),o=r.x-s.x,n=r.y-s.y,t[a].y=0==o?t[a].orginalY+r.y:t[a].orginalY+n/o*(t[a].x-s.x)+s.y}},o.prototype._getRelevantData=function(t,e,i,o){var n,s,a,h;if(t.length>0)for(s=0;s0)for(var o=0;o0){var s=1,r=n.length,a=this.body.util.toGlobalScreen(n[n.length-1].x)-this.body.util.toGlobalScreen(n[0].x),h=r/a;s=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=new Array(r),l=0;l0){for(s=0;s0&&(n=this.groups[t[s]],!0===r.stack&&"bar"===r.style?"left"===r.yAxisOrientation?a=a.concat(o):h=h.concat(o):i[t[s]]=n.getYRange(o,t[s]));f.getStackedYRange(a,i,t,"__barStackLeft","left"),f.getStackedYRange(h,i,t,"__barStackRight","right")}},o.prototype._updateYAxis=function(t,e){var i,o,n=!1,s=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var u=0;ui?i:a,d=di?i:h,l=l=0&&t._redrawLabel(o-2,e.val,i,"vis-y-axis vis-major",t.props.majorCharHeight),!0===t.master&&(n?t._redrawLine(o,i,"vis-grid vis-horizontal vis-major",t.options.majorLinesOffset,t.props.majorLineWidth):t._redrawLine(o,i,"vis-grid vis-horizontal vis-minor",t.options.minorLinesOffset,t.props.minorLineWidth))});var r=0;void 0!==this.options[i].title&&void 0!==this.options[i].title.text&&(r=this.props.titleCharHeight);var h=!0===this.options.icons?Math.max(this.options.iconWidth,r)+this.options.labelOffsetX+15:r+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-h&&!0===this.options.visible?(this.width=this.maxLabelSize+h,this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+h),this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):(a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),e=!1),e},o.prototype.convertValue=function(t){return this.scale.convertValue(t)},o.prototype.screenToValue=function(t){return this.scale.screenToValue(t)},o.prototype._redrawLabel=function(t,e,i,o,n){var s=a.getDOMElement("div",this.DOMelements.labels,this.dom.frame);s.className=o,s.innerHTML=e,"left"===i?(s.style.left="-"+this.options.labelOffsetX+"px",s.style.textAlign="right"):(s.style.right="-"+this.options.labelOffsetX+"px",s.style.textAlign="left"),s.style.top=t-.5*n+this.options.labelOffsetY+"px",e+="";var r=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSize6&&void 0!==arguments[6]&&arguments[6],a=arguments.length>7&&void 0!==arguments[7]&&arguments[7];if(this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.customLines=null,this.containerHeight=n,this.majorCharHeight=s,this._start=t,this._end=e,this.scale=1,this.minorStepIdx=-1,this.magnitudefactor=1,this.determineScale(),this.zeroAlign=r,this.autoScaleStart=i,this.autoScaleEnd=o,this.formattingFunction=a,i||o){var h=this,d=function(t){var e=t-t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx]);return t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx])>h.magnitudefactor*h.minorSteps[h.minorStepIdx]*.5?e+h.magnitudefactor*h.minorSteps[h.minorStepIdx]:e};i&&(this._start-=2*this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._start=d(this._start)),o&&(this._end+=this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._end=d(this._end)),this.determineScale()}}o.prototype.setCharHeight=function(t){this.majorCharHeight=t},o.prototype.setHeight=function(t){this.containerHeight=t},o.prototype.determineScale=function(){var t=this._end-this._start;this.scale=this.containerHeight/t;var e=this.majorCharHeight/this.scale,i=t>0?Math.round(Math.log(t)/Math.LN10):0;this.minorStepIdx=-1,this.magnitudefactor=Math.pow(10,i);var o=0;i<0&&(o=i);for(var n=!1,s=o;Math.abs(s)<=Math.abs(i);s++){this.magnitudefactor=Math.pow(10,s);for(var r=0;r=e){n=!0,this.minorStepIdx=r;break}}if(!0===n)break}},o.prototype.is_major=function(t){return t%(this.magnitudefactor*this.majorSteps[this.minorStepIdx])==0},o.prototype.getStep=function(){return this.magnitudefactor*this.minorSteps[this.minorStepIdx]},o.prototype.getFirstMajor=function(){var t=this.magnitudefactor*this.majorSteps[this.minorStepIdx];return this.convertValue(this._start+(t-this._start%t)%t)},o.prototype.formatValue=function(t){var e=t.toPrecision(5);return"function"==typeof this.formattingFunction&&(e=this.formattingFunction(t)),"number"==typeof e?""+e:"string"==typeof e?e:t.toPrecision(5)},o.prototype.getLines=function(){for(var t=[],e=this.getStep(),i=(e-this._start%e)%e,o=this._start+i;this._end-o>1e-5;o+=e)o!=this._start&&t.push({major:this.is_major(o),y:this.convertValue(o),val:this.formatValue(o)});return t},o.prototype.followScale=function(t){var e=this.minorStepIdx,i=this._start,o=this._end,n=this,s=function(){n.magnitudefactor*=2},r=function(){n.magnitudefactor/=2};t.minorStepIdx<=1&&this.minorStepIdx<=1||t.minorStepIdx>1&&this.minorStepIdx>1||(t.minorStepIdxo+1e-5)r(),d=!1;else{if(!this.autoScaleStart&&this._start=0)){r(),d=!1;continue}console.warn("Can't adhere to given 'min' range, due to zeroalign")}this.autoScaleStart&&this.autoScaleEnd&&ue.x?1:-1})):this.itemsData=[]},o.prototype.getItems=function(){return this.itemsData},o.prototype.setZeroPosition=function(t){this.zeroPosition=t},o.prototype.setOptions=function(t){if(void 0!==t){var e=["sampling","style","sort","yAxisOrientation","barChart","zIndex","excludeFromStacking","excludeFromLegend"];r.selectiveDeepExtend(e,this.options,t),"function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),r.mergeOptions(this.options,t,"interpolation"),r.mergeOptions(this.options,t,"drawPoints"),r.mergeOptions(this.options,t,"shaded"),t.interpolation&&"object"==(0,s.default)(t.interpolation)&&t.interpolation.parametrization&&("uniform"==t.interpolation.parametrization?this.options.interpolation.alpha=0:"chordal"==t.interpolation.parametrization?this.options.interpolation.alpha=1:(this.options.interpolation.parametrization="centripetal",this.options.interpolation.alpha=.5))}},o.prototype.update=function(t){this.group=t,this.content=t.content||"graph",this.className=t.className||this.className||"vis-graph-group"+this.groupsUsingDefaultStyles[0]%10,this.visible=void 0===t.visible||t.visible,this.style=t.style,this.setOptions(t.options)},o.prototype.getLegend=function(t,e,i,o,n){if(void 0==i||null==i){i={svg:document.createElementNS("http://www.w3.org/2000/svg","svg"),svgElements:{},options:this.options,groups:[this]}}switch(void 0!=o&&null!=o||(o=0),void 0!=n&&null!=n||(n=.5*e),this.options.style){case"line":h.drawIcon(this,o,n,t,e,i);break;case"points":case"point":d.drawIcon(this,o,n,t,e,i);break;case"bar":a.drawIcon(this,o,n,t,e,i)}return{icon:i.svg,label:this.content,orientation:this.options.yAxisOrientation}},o.prototype.getYRange=function(t){for(var e=t[0].y,i=t[0].y,o=0;ot[o].y?t[o].y:e,i=i0&&(i=Math.min(i,Math.abs(e[o-1].screen_x-e[o].screen_x))),0===i&&(void 0===t[e[o].screen_x]&&(t[e[o].screen_x]={amount:0,resolved:0,accumulatedPositive:0,accumulatedNegative:0}),t[e[o].screen_x].amount+=1)},o._getSafeDrawData=function(t,e,i){var o,n;return t0?(o=t0){t.sort(function(t,e){return t.screen_x===e.screen_x?t.groupIde[s].screen_y?e[s].screen_y:o,n=nt[r].accumulatedNegative?t[r].accumulatedNegative:o,o=o>t[r].accumulatedPositive?t[r].accumulatedPositive:o,n=n0){return 1==e.options.interpolation.enabled?o._catmullRom(t,e):o._linear(t)}},o.drawIcon=function(t,e,i,o,s,r){var a,h,d=.5*s,l=n.getSVGElement("rect",r.svgElements,r.svg);if(l.setAttributeNS(null,"x",e),l.setAttributeNS(null,"y",i-d),l.setAttributeNS(null,"width",o),l.setAttributeNS(null,"height",2*d),l.setAttributeNS(null,"class","vis-outline"),a=n.getSVGElement("path",r.svgElements,r.svg),a.setAttributeNS(null,"class",t.className),void 0!==t.style&&a.setAttributeNS(null,"style",t.style),a.setAttributeNS(null,"d","M"+e+","+i+" L"+(e+o)+","+i),1==t.options.shaded.enabled&&(h=n.getSVGElement("path",r.svgElements,r.svg),"top"==t.options.shaded.orientation?h.setAttributeNS(null,"d","M"+e+", "+(i-d)+"L"+e+","+i+" L"+(e+o)+","+i+" L"+(e+o)+","+(i-d)):h.setAttributeNS(null,"d","M"+e+","+i+" L"+e+","+(i+d)+" L"+(e+o)+","+(i+d)+"L"+(e+o)+","+i),h.setAttributeNS(null,"class",t.className+" vis-icon-fill"),void 0!==t.options.shaded.style&&""!==t.options.shaded.style&&h.setAttributeNS(null,"style",t.options.shaded.style)),1==t.options.drawPoints.enabled){var u={style:t.options.drawPoints.style,styles:t.options.drawPoints.styles,size:t.options.drawPoints.size,className:t.className};n.drawPoint(e+.5*o,i,u,r.svgElements,r.svg)}},o.drawShading=function(t,e,i,o){if(1==e.options.shaded.enabled){var s=Number(o.svg.style.height.replace("px","")),r=n.getSVGElement("path",o.svgElements,o.svg),a="L";1==e.options.interpolation.enabled&&(a="C");var h,d=0;d="top"==e.options.shaded.orientation?0:"bottom"==e.options.shaded.orientation?s:Math.min(Math.max(0,e.zeroPosition),s),h="group"==e.options.shaded.orientation&&null!=i&&void 0!=i?"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" L"+i[i.length-1][0]+","+i[i.length-1][1]+" "+this.serializePath(i,a,!0)+i[0][0]+","+i[0][1]+" Z":"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" V"+d+" H"+t[0][0]+" Z",r.setAttributeNS(null,"class",e.className+" vis-fill"),void 0!==e.options.shaded.style&&r.setAttributeNS(null,"style",e.options.shaded.style),r.setAttributeNS(null,"d",h)}},o.draw=function(t,e,i){if(null!=t&&void 0!=t){var o=n.getSVGElement("path",i.svgElements,i.svg);o.setAttributeNS(null,"class",e.className),void 0!==e.style&&o.setAttributeNS(null,"style",e.style);var s="L";1==e.options.interpolation.enabled&&(s="C"),o.setAttributeNS(null,"d","M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,s,!1))}},o.serializePath=function(t,e,i){if(t.length<2)return"";var o,n=e;if(i)for(o=t.length-2;o>0;o--)n+=t[o][0]+","+t[o][1]+" ";else for(o=1;o0&&(f=1/f),m=3*v*(v+g),m>0&&(m=1/m),a={screen_x:(-b*o.screen_x+c*n.screen_x+_*s.screen_x)*f,screen_y:(-b*o.screen_y+c*n.screen_y+_*s.screen_y)*f},h={screen_x:(y*n.screen_x+p*s.screen_x-b*r.screen_x)*m,screen_y:(y*n.screen_y+p*s.screen_y-b*r.screen_y)*m},0==a.screen_x&&0==a.screen_y&&(a=n),0==h.screen_x&&0==h.screen_y&&(h=s),x.push([a.screen_x,a.screen_y]),x.push([h.screen_x,h.screen_y]),x.push([s.screen_x,s.screen_y]);return x},o._linear=function(t){for(var e=[],i=0;i");this.dom.textArea.innerHTML=r,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},o.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){var t=(0,s.default)(this.groups);t.sort(function(t,e){return t=0;i--){var a=s[i];a.nodes||(a.nodes=[]),-1===a.nodes.indexOf(n)&&a.nodes.push(n)}e.attr&&(n.attr=h(n.attr,e.attr))}function u(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=h({},t.edge);e.attr=h(i,e.attr)}}function c(t,e,i,o,n){var s={from:e,to:i,type:o};return t.edge&&(s.attr=h({},t.edge)),s.attr=h(s.attr||{},n),s}function p(){for(F=I.NULL,L="";" "===z||"\t"===z||"\n"===z||"\r"===z;)s();do{var t=!1;if("#"===z){for(var e=A-1;" "===R.charAt(e)||"\t"===R.charAt(e);)e--;if("\n"===R.charAt(e)||""===R.charAt(e)){for(;""!=z&&"\n"!=z;)s();t=!0}}if("/"===z&&"/"===r()){for(;""!=z&&"\n"!=z;)s();t=!0}if("/"===z&&"*"===r()){for(;""!=z;){if("*"===z&&"/"===r()){s(),s();break}s()}t=!0}for(;" "===z||"\t"===z||"\n"===z||"\r"===z;)s()}while(t);if(""===z)return void(F=I.DELIMITER);var i=z+r();if(N[i])return F=I.DELIMITER,L=i,s(),void s();if(N[z])return F=I.DELIMITER,L=z,void s();if(a(z)||"-"===z){for(L+=z,s();a(z);)L+=z,s();return"false"===L?L=!1:"true"===L?L=!0:isNaN(Number(L))||(L=Number(L)),void(F=I.IDENTIFIER)}if('"'===z){for(s();""!=z&&('"'!=z||'"'===z&&'"'===r());)'"'===z?(L+=z,s()):"\\"===z&&"n"===r()?(L+="\n",s()):L+=z,s();if('"'!=z)throw x('End of string " expected');return s(),void(F=I.IDENTIFIER)}for(F=I.UNKNOWN;""!=z;)L+=z,s();throw new SyntaxError('Syntax error in part "'+k(L,30)+'"')}function f(){var t={};if(n(),p(),"strict"===L&&(t.strict=!0,p()),"graph"!==L&&"digraph"!==L||(t.type=L,p()),F===I.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),m(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==L&&"}"!=L;)v(t),";"===L&&p()}function v(t){var e=g(t);if(e)return void _(t,e);if(!y(t)){if(F!=I.IDENTIFIER)throw x("Identifier expected");var i=L;if(p(),"="===L){if(p(),F!=I.IDENTIFIER)throw x("Identifier expected");t[i]=L,p()}else b(t,i)}}function g(t){var e=null;if("subgraph"===L&&(e={},e.type="subgraph",p(),F===I.IDENTIFIER&&(e.id=L,p())),"{"===L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function y(t){return"node"===L?(p(),t.node=w(),"node"):"edge"===L?(p(),t.edge=w(),"edge"):"graph"===L?(p(),t.graph=w(),"graph"):null}function b(t,e){var i={id:e},o=w();o&&(i.attr=o),l(t,i),_(t,e)}function _(t,e){for(;"->"===L||"--"===L;){var i,o=L;p();var n=g(t);if(n)i=n;else{if(F!=I.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,l(t,{id:i}),p()}u(t,c(t,e,i,o,w())),e=i}}function w(){for(var t=null,e={dashed:!0,solid:!1,dotted:[1,5]};"["===L;){for(p(),t={};""!==L&&"]"!=L;){if(F!=I.IDENTIFIER)throw x("Attribute name expected");var i=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),F!=I.IDENTIFIER)throw x("Attribute value expected");var o=L;"style"===i&&(o=e[o]),d(t,i,o),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+k(L,30)+'" (char '+A+")")}function k(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function D(t,e,i){for(var o=e.split("."),n=o.pop(),s=t,r=0;r":!0,"--":!0},R="",A=0,z="",L="",F=I.NULL,B=/[a-zA-Z_0-9.:#]/;e.parseDOT=o,e.DOTToGraph=C},function(t,e,i){function o(t,e){var i=[],o=[],n={edges:{inheritColor:!1},nodes:{fixed:!1,parseColor:!1}};void 0!==e&&(void 0!==e.fixed&&(n.nodes.fixed=e.fixed),void 0!==e.parseColor&&(n.nodes.parseColor=e.parseColor),void 0!==e.inheritColor&&(n.edges.inheritColor=e.inheritColor));for(var s=t.edges,r=t.nodes,a=0;a2&&void 0!==arguments[2]&&arguments[2];(0,d.default)(this,t),this.body=e,this.pointToSelf=!1,this.baseSize=void 0,this.fontOptions={},this.setOptions(i),this.size={top:0,left:0,width:0,height:0,yLine:0},this.isEdgeLabel=o}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(this.elementOptions=t,this.initFontOptions(t.font),p.isValidLabel(t.label)?this.labelDirty=!0:t.label="",void 0!==t.font&&null!==t.font)if("string"==typeof t.font)this.baseSize=this.fontOptions.size;else if("object"===(0,a.default)(t.font)){var e=t.font.size;void 0!==e&&(this.baseSize=e)}}},{key:"initFontOptions",value:function(e){var i=this;if(c.forEach(m,function(t){i.fontOptions[t]={}}),t.parseFontString(this.fontOptions,e))return void(this.fontOptions.vadjust=0);c.forEach(e,function(t,e){void 0!==t&&null!==t&&"object"!==(void 0===t?"undefined":(0,a.default)(t))&&(i.fontOptions[e]=t)})}},{key:"constrain",value:function(t){var e={constrainWidth:!1,maxWdt:-1,minWdt:-1,constrainHeight:!1,minHgt:-1,valign:"middle"},i=c.topMost(t,"widthConstraint");if("number"==typeof i)e.maxWdt=Number(i),e.minWdt=Number(i);else if("object"===(void 0===i?"undefined":(0,a.default)(i))){var o=c.topMost(t,["widthConstraint","maximum"]);"number"==typeof o&&(e.maxWdt=Number(o));var n=c.topMost(t,["widthConstraint","minimum"]);"number"==typeof n&&(e.minWdt=Number(n))}var s=c.topMost(t,"heightConstraint");if("number"==typeof s)e.minHgt=Number(s);else if("object"===(void 0===s?"undefined":(0,a.default)(s))){var r=c.topMost(t,["heightConstraint","minimum"]);"number"==typeof r&&(e.minHgt=Number(r));var h=c.topMost(t,["heightConstraint","valign"]);"string"==typeof h&&("top"!==h&&"bottom"!==h||(e.valign=h))}return e}},{key:"update",value:function(t,e){this.setOptions(t,!0),this.propagateFonts(e),c.deepExtend(this.fontOptions,this.constrain(e)),this.fontOptions.chooser=p.choosify("label",e)}},{key:"adjustSizes",value:function(t){var e=t?t.right+t.left:0;this.fontOptions.constrainWidth&&(this.fontOptions.maxWdt-=e,this.fontOptions.minWdt-=e);var i=t?t.top+t.bottom:0;this.fontOptions.constrainHeight&&(this.fontOptions.minHgt-=i)}},{key:"addFontOptionsToPile",value:function(t,e){for(var i=0;i5&&void 0!==arguments[5]?arguments[5]:"middle";if(void 0!==this.elementOptions.label){var r=this.fontOptions.size*this.body.view.scale;this.elementOptions.label&&r=this.elementOptions.scaling.label.maxVisible&&(r=Number(this.elementOptions.scaling.label.maxVisible)/this.body.view.scale),this.calculateLabelSize(t,o,n,e,i,s),this._drawBackground(t),this._drawText(t,e,this.size.yLine,s,r))}}},{key:"_drawBackground",value:function(t){if(void 0!==this.fontOptions.background&&"none"!==this.fontOptions.background){t.fillStyle=this.fontOptions.background;var e=this.getSize();t.fillRect(e.left,e.top,e.width,e.height)}}},{key:"_drawText",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"middle",n=arguments[4],r=this._setAlignment(t,e,i,o),a=(0,s.default)(r,2);e=a[0],i=a[1],t.textAlign="left",e-=this.size.width/2,this.fontOptions.valign&&this.size.height>this.size.labelHeight&&("top"===this.fontOptions.valign&&(i-=(this.size.height-this.size.labelHeight)/2),"bottom"===this.fontOptions.valign&&(i+=(this.size.height-this.size.labelHeight)/2));for(var h=0;h0&&(t.lineWidth=c.strokeWidth,t.strokeStyle=v,t.lineJoin="round"),t.fillStyle=m,c.strokeWidth>0&&t.strokeText(c.text,e+l,i+c.vadjust),t.fillText(c.text,e+l,i+c.vadjust),l+=c.width}i+=d.height}}}},{key:"_setAlignment",value:function(t,e,i,o){if(this.isEdgeLabel&&"horizontal"!==this.fontOptions.align&&!1===this.pointToSelf){e=0,i=0;"top"===this.fontOptions.align?(t.textBaseline="alphabetic",i-=4):"bottom"===this.fontOptions.align?(t.textBaseline="hanging",i+=4):t.textBaseline="middle"}else t.textBaseline=o;return[e,i]}},{key:"_getColor",value:function(t,e,i){var o=t||"#000000",n=i||"#ffffff";if(e<=this.elementOptions.scaling.label.drawThreshold){var s=Math.max(0,Math.min(1,1-(this.elementOptions.scaling.label.drawThreshold-e)));o=c.overrideOpacity(o,s),n=c.overrideOpacity(n,s)}return[o,n]}},{key:"getTextSize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return this._processLabel(t,e,i),{width:this.size.width,height:this.size.height,lineCount:this.lineCount}}},{key:"getSize",value:function(){var t=this.size.left,e=this.size.top-1;if(this.isEdgeLabel){var i=.5*-this.size.width;switch(this.fontOptions.align){case"middle":t=i,e=.5*-this.size.height;break;case"top":t=i,e=-(this.size.height+2);break;case"bottom":t=i,e=2}}return{left:t,top:e,width:this.size.width,height:this.size.height}}},{key:"calculateLabelSize",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"middle";this._processLabel(t,e,i),this.size.left=o-.5*this.size.width,this.size.top=n-.5*this.size.height,this.size.yLine=n+.5*(1-this.lineCount)*this.fontOptions.size,"hanging"===s&&(this.size.top+=.5*this.fontOptions.size,this.size.top+=4,this.size.yLine+=4)}},{key:"getFormattingValues",value:function(t,e,i,o){var n=function(t,e,i){return"normal"===e?"mod"===i?"":t[i]:void 0!==t[e][i]?t[e][i]:t[i]},s={color:n(this.fontOptions,o,"color"),size:n(this.fontOptions,o,"size"),face:n(this.fontOptions,o,"face"),mod:n(this.fontOptions,o,"mod"),vadjust:n(this.fontOptions,o,"vadjust"),strokeWidth:this.fontOptions.strokeWidth,strokeColor:this.fontOptions.strokeColor};(e||i)&&("normal"===o&&!0===this.fontOptions.chooser&&this.elementOptions.labelHighlightBold?s.mod="bold":"function"==typeof this.fontOptions.chooser&&this.fontOptions.chooser(s,this.elementOptions.id,e,i));var r="";return void 0!==s.mod&&""!==s.mod&&(r+=s.mod+" "),r+=s.size+"px "+s.face,t.font=r.replace(/"/g,""),s.font=t.font,s.height=s.size,s}},{key:"differentState",value:function(t,e){return t!==this.selectedState||e!==this.hoverState}},{key:"_processLabelText",value:function(t,e,i,o){return new f(t,this,e,i).process(o)}},{key:"_processLabel",value:function(t,e,i){if(!1!==this.labelDirty||this.differentState(e,i)){var o=this._processLabelText(t,e,i,this.elementOptions.label);this.fontOptions.minWdt>0&&o.width0&&o.heighto.shape.height?(e=o.x+.5*o.shape.width,i=o.y-n):(e=o.x+n,i=o.y-.5*o.shape.height),[e,i,n]}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"_findBorderPositionCircle",value:function(t,e,i){for(var o=i.x,n=i.y,s=i.low,r=i.high,a=i.direction,h=0,d=this.options.selfReferenceSize,l=void 0,u=void 0,c=void 0,p=void 0,f=void 0,m=.5*(s+r);s<=r&&h<10&&(m=.5*(s+r),l=this._pointOnCircle(o,n,d,m),u=Math.atan2(t.y-l.y,t.x-l.x),c=t.distanceToBorder(e,u),p=Math.sqrt(Math.pow(l.x-t.x,2)+Math.pow(l.y-t.y,2)),f=c-p,!(Math.abs(f)<.05));)f>0?a>0?s=m:r=m:a>0?r=m:s=m,h++;return l.t=m,l}},{key:"getLineWidth",value:function(t,e){return!0===t?Math.max(this.selectionWidth,.3/this.body.view.scale):!0===e?Math.max(this.hoverWidth,.3/this.body.view.scale):Math.max(this.options.width,.3/this.body.view.scale)}},{key:"getColor",value:function(t,e,i,o){if(!1!==e.inheritsColor){if("both"===e.inheritsColor&&this.from.id!==this.to.id){var n=t.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y),s=void 0,r=void 0;return s=this.from.options.color.highlight.border,r=this.to.options.color.highlight.border,!1===this.from.selected&&!1===this.to.selected?(s=l.overrideOpacity(this.from.options.color.border,e.opacity),r=l.overrideOpacity(this.to.options.color.border,e.opacity)):!0===this.from.selected&&!1===this.to.selected?r=this.to.options.color.border:!1===this.from.selected&&!0===this.to.selected&&(s=this.from.options.color.border),n.addColorStop(0,s),n.addColorStop(1,r),n}return"to"===e.inheritsColor?l.overrideOpacity(this.to.options.color.border,e.opacity):l.overrideOpacity(this.from.options.color.border,e.opacity)}return l.overrideOpacity(e.color,e.opacity)}},{key:"_circle", -value:function(t,e,i,o,n){this.enableShadow(t,e),t.beginPath(),t.arc(i,o,n,0,2*Math.PI,!1),t.stroke(),this.disableShadow(t,e)}},{key:"getDistanceToEdge",value:function(t,e,i,o,n,r,a,h){var d=0;if(this.from!=this.to)d=this._getDistanceToEdge(t,e,i,o,n,r,a);else{var l=this._getCircleData(void 0),u=(0,s.default)(l,3),c=u[0],p=u[1],f=u[2],m=c-n,v=p-r;d=Math.abs(Math.sqrt(m*m+v*v)-f)}return d}},{key:"_getDistanceToLine",value:function(t,e,i,o,n,s){var r=i-t,a=o-e,h=r*r+a*a,d=((n-t)*r+(s-e)*a)/h;d>1?d=1:d<0&&(d=0);var l=t+d*r,u=e+d*a,c=l-n,p=u-s;return Math.sqrt(c*c+p*p)}},{key:"getArrowData",value:function(t,e,i,o,n,r){var a=void 0,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=r.width;if("from"===e?(d=this.from,l=this.to,u=.1,c=r.fromArrowScale,p=r.fromArrowType):"to"===e?(d=this.to,l=this.from,u=-.1,c=r.toArrowScale,p=r.toArrowType):(d=this.to,l=this.from,c=r.middleArrowScale,p=r.middleArrowType),d!=l)if("middle"!==e)if(!0===this.options.smooth.enabled){h=this.findBorderPosition(d,t,{via:i});var m=this.getPoint(Math.max(0,Math.min(1,h.t+u)),i);a=Math.atan2(h.y-m.y,h.x-m.x)}else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.findBorderPosition(d,t);else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.getPoint(.5,i);else{var v=this._getCircleData(t),g=(0,s.default)(v,3),y=g[0],b=g[1],_=g[2];"from"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.25,high:.6,direction:-1}),a=-2*h.t*Math.PI+1.5*Math.PI+.1*Math.PI):"to"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.6,high:1,direction:1}),a=-2*h.t*Math.PI+1.5*Math.PI-1.1*Math.PI):(h=this._pointOnCircle(y,b,_,.175),a=3.9269908169872414)}"middle"===e&&c<0&&(f*=-1);var w=15*c+3*f;return{point:h,core:{x:h.x-.9*w*Math.cos(a),y:h.y-.9*w*Math.sin(a)},angle:a,length:w,type:p}}},{key:"drawArrowHead",value:function(t,e,i,o,n){t.strokeStyle=this.getColor(t,e,i,o),t.fillStyle=t.strokeStyle,t.lineWidth=e.width,u.draw(t,n),this.enableShadow(t,e),t.fill(),this.disableShadow(t,e)}},{key:"enableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor=e.shadowColor,t.shadowBlur=e.shadowSize,t.shadowOffsetX=e.shadowX,t.shadowOffsetY=e.shadowY)}},{key:"disableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(4),a=o(r),h=i(5),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"transform",value:function(t,e){t instanceof Array||(t=[t]);for(var i=e.point.x,o=e.point.y,n=e.angle,s=e.length,r=0;r0){var t=void 0,e=this.body.nodes,i=this.physicsBody.physicsNodeIndices,o=i.length,n=this._formBarnesHutTree(e,i);this.barnesHutTree=n;for(var s=0;s0&&this._getForceContributions(n.root,t)}}},{key:"_getForceContributions",value:function(t,e){this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e)}},{key:"_getForceContribution",value:function(t,e){if(t.childrenCount>0){var i=void 0,o=void 0,n=void 0;i=t.centerOfMass.x-e.x,o=t.centerOfMass.y-e.y,n=Math.sqrt(i*i+o*o),n*t.calcSize>this.thetaInversed?this._calculateForces(n,i,o,e,t):4===t.childrenCount?this._getForceContributions(t,e):t.children.data.id!=e.id&&this._calculateForces(n,i,o,e,t)}}},{key:"_calculateForces",value:function(t,e,i,o,n){0===t&&(t=.1,e=t),this.overlapAvoidanceFactor<1&&o.shape.radius&&(t=Math.max(.1+this.overlapAvoidanceFactor*o.shape.radius,t-o.shape.radius));var s=this.options.gravitationalConstant*n.mass*o.options.mass/Math.pow(t,3),r=e*s,a=i*s;this.physicsBody.forces[o.id].x+=r,this.physicsBody.forces[o.id].y+=a}},{key:"_formBarnesHutTree",value:function(t,e){for(var i=void 0,o=e.length,n=t[e[0]].x,s=t[e[0]].y,r=t[e[0]].x,a=t[e[0]].y,h=1;h0&&(lr&&(r=l),ua&&(a=u))}var c=Math.abs(r-n)-Math.abs(a-s);c>0?(s-=.5*c,a+=.5*c):(n+=.5*c,r-=.5*c);var p=Math.max(1e-5,Math.abs(r-n)),f=.5*p,m=.5*(n+r),v=.5*(s+a),g={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:v-f,maxY:v+f},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(g.root);for(var y=0;y0&&this._placeInTree(g.root,i);return g}},{key:"_updateBranchMass",value:function(t,e){var i=t.centerOfMass,o=t.mass+e.options.mass,n=1/o;i.x=i.x*t.mass+e.x*e.options.mass,i.x*=n,i.y=i.y*t.mass+e.y*e.options.mass,i.y*=n,t.mass=o;var s=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?o.maxY>e.y?"NW":"SW":o.maxY>e.y?"NE":"SE",this._placeInRegion(t,e,n)}},{key:"_placeInRegion",value:function(t,e,i){var o=t.children[i];switch(o.childrenCount){case 0:o.children.data=e,o.childrenCount=1,this._updateBranchMass(o,e);break;case 1:o.children.data.x===e.x&&o.children.data.y===e.y?(e.x+=this.seededRandom(),e.y+=this.seededRandom()):(this._splitBranch(o),this._placeInTree(o,e));break;case 4:this._placeInTree(o,e)}}},{key:"_splitBranch",value:function(t){var e=null;1===t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)}},{key:"_insertRegion",value:function(t,e){var i=void 0,o=void 0,n=void 0,s=void 0,r=.5*t.size;switch(e){case"NW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY,s=t.range.minY+r;break;case"NE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY,s=t.range.minY+r;break;case"SW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY+r,s=t.range.maxY;break;case"SE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY+r,s=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:o,minY:n,maxY:s},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}}},{key:"_debug",value:function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))}},{key:"_drawBranch",value:function(t,e,i){void 0===i&&(i="#FF0000"),4===t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t=void 0,e=void 0,i=void 0,o=void 0,n=this.body.nodes,s=this.physicsBody.physicsNodeIndices,r=this.physicsBody.forces,a=0;a=t.length?(this._t=void 0,n(1)):"keys"==e?n(0,i):"values"==e?n(0,t[i]):n(0,[i,t[i]])},"values"),s.Arguments=s.Array,o("keys"),o("values"),o("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,i){var o=i(54),n=i(39),s=i(59),r={};i(26)(r,i(13)("iterator"),function(){return this}),t.exports=function(t,e,i){t.prototype=o(r,{next:n(1,i)}),s(t,e+" Iterator")}},function(t,e,i){var o=i(20),n=i(27),s=i(33);t.exports=i(21)?Object.defineProperties:function(t,e){n(t);for(var i,r=s(e),a=r.length,h=0;a>h;)o.f(t,i=r[h++],e[i]);return t}},function(t,e,i){var o=i(25),n=i(132),s=i(133);t.exports=function(t){return function(e,i,r){var a,h=o(e),d=n(h.length),l=s(r,d);if(t&&i!=i){for(;d>l;)if((a=h[l++])!=a)return!0}else for(;d>l;l++)if((t||l in h)&&h[l]===i)return t||l||0;return!t&&-1}}},function(t,e,i){var o=i(55),n=Math.min;t.exports=function(t){return t>0?n(o(t),9007199254740991):0}},function(t,e,i){var o=i(55),n=Math.max,s=Math.min;t.exports=function(t,e){return t=o(t),t<0?n(t+e,0):s(t,e)}},function(t,e,i){var o=i(18).document;t.exports=o&&o.documentElement},function(t,e,i){var o=i(55),n=i(51);t.exports=function(t){return function(e,i){var s,r,a=String(n(e)),h=o(i),d=a.length;return h<0||h>=d?t?"":void 0:(s=a.charCodeAt(h),s<55296||s>56319||h+1===d||(r=a.charCodeAt(h+1))<56320||r>57343?t?a.charAt(h):s:t?a.slice(h,h+2):r-56320+(s-55296<<10)+65536)}}},function(t,e,i){var o=i(27),n=i(137);t.exports=i(7).getIterator=function(t){var e=n(t);if("function"!=typeof e)throw TypeError(t+" is not iterable!");return o(e.call(t))}},function(t,e,i){var o=i(86),n=i(13)("iterator"),s=i(31);t.exports=i(7).getIteratorMethod=function(t){if(void 0!=t)return t[n]||t["@@iterator"]||s[o(t)]}},function(t,e,i){i(139);var o=i(7).Object;t.exports=function(t,e){return o.create(t,e)}},function(t,e,i){var o=i(17);o(o.S,"Object",{create:i(54)})},function(t,e,i){i(141),t.exports=i(7).Object.keys},function(t,e,i){var o=i(41),n=i(33);i(87)("keys",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(143),__esModule:!0}},function(t,e,i){i(60),i(49),t.exports=i(61).f("iterator")},function(t,e,i){t.exports={default:i(145),__esModule:!0}},function(t,e,i){i(146),i(151),i(152),i(153),t.exports=i(7).Symbol},function(t,e,i){var o=i(18),n=i(22),s=i(21),r=i(17),a=i(83),h=i(147).KEY,d=i(28),l=i(57),u=i(59),c=i(40),p=i(13),f=i(61),m=i(62),v=i(148),g=i(149),y=i(27),b=i(25),_=i(53),w=i(39),x=i(54),k=i(150),S=i(89),D=i(20),M=i(33),C=S.f,O=D.f,E=k.f,T=o.Symbol,P=o.JSON,I=P&&P.stringify,N=p("_hidden"),R=p("toPrimitive"),A={}.propertyIsEnumerable,z=l("symbol-registry"),L=l("symbols"),F=l("op-symbols"),B=Object.prototype,j="function"==typeof T,H=o.QObject,W=!H||!H.prototype||!H.prototype.findChild,Y=s&&d(function(){return 7!=x(O({},"a",{get:function(){return O(this,"a",{value:7}).a}})).a})?function(t,e,i){var o=C(B,e);o&&delete B[e],O(t,e,i),o&&t!==B&&O(B,e,o)}:O,G=function(t){var e=L[t]=x(T.prototype);return e._k=t,e},V=j&&"symbol"==typeof T.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof T},U=function(t,e,i){return t===B&&U(F,e,i),y(t),e=_(e,!0),y(i),n(L,e)?(i.enumerable?(n(t,N)&&t[N][e]&&(t[N][e]=!1),i=x(i,{enumerable:w(0,!1)})):(n(t,N)||O(t,N,w(1,{})),t[N][e]=!0),Y(t,e,i)):O(t,e,i)},q=function(t,e){y(t);for(var i,o=v(e=b(e)),n=0,s=o.length;s>n;)U(t,i=o[n++],e[i]);return t},X=function(t,e){return void 0===e?x(t):q(x(t),e)},Z=function(t){var e=A.call(this,t=_(t,!0));return!(this===B&&n(L,t)&&!n(F,t))&&(!(e||!n(this,t)||!n(L,t)||n(this,N)&&this[N][t])||e)},K=function(t,e){if(t=b(t),e=_(e,!0),t!==B||!n(L,e)||n(F,e)){var i=C(t,e);return!i||!n(L,e)||n(t,N)&&t[N][e]||(i.enumerable=!0),i}},J=function(t){for(var e,i=E(b(t)),o=[],s=0;i.length>s;)n(L,e=i[s++])||e==N||e==h||o.push(e);return o},$=function(t){for(var e,i=t===B,o=E(i?F:b(t)),s=[],r=0;o.length>r;)!n(L,e=o[r++])||i&&!n(B,e)||s.push(L[e]);return s};j||(T=function(){if(this instanceof T)throw TypeError("Symbol is not a constructor!");var t=c(arguments.length>0?arguments[0]:void 0),e=function(i){this===B&&e.call(F,i),n(this,N)&&n(this[N],t)&&(this[N][t]=!1),Y(this,t,w(1,i))};return s&&W&&Y(B,t,{configurable:!0,set:e}),G(t)},a(T.prototype,"toString",function(){return this._k}),S.f=K,D.f=U,i(88).f=k.f=J,i(42).f=Z,i(63).f=$,s&&!i(52)&&a(B,"propertyIsEnumerable",Z,!0),f.f=function(t){return G(p(t))}),r(r.G+r.W+r.F*!j,{Symbol:T});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;Q.length>tt;)p(Q[tt++]);for(var et=M(p.store),it=0;et.length>it;)m(et[it++]);r(r.S+r.F*!j,"Symbol",{for:function(t){return n(z,t+="")?z[t]:z[t]=T(t)},keyFor:function(t){if(!V(t))throw TypeError(t+" is not a symbol!");for(var e in z)if(z[e]===t)return e},useSetter:function(){W=!0},useSimple:function(){W=!1}}),r(r.S+r.F*!j,"Object",{create:X,defineProperty:U,defineProperties:q,getOwnPropertyDescriptor:K,getOwnPropertyNames:J,getOwnPropertySymbols:$}),P&&r(r.S+r.F*(!j||d(function(){var t=T();return"[null]"!=I([t])||"{}"!=I({a:t})||"{}"!=I(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!V(t)){for(var e,i,o=[t],n=1;arguments.length>n;)o.push(arguments[n++]);return e=o[1],"function"==typeof e&&(i=e),!i&&g(e)||(e=function(t,e){if(i&&(e=i.call(this,t,e)),!V(e))return e}),o[1]=e,I.apply(P,o)}}}),T.prototype[R]||i(26)(T.prototype,R,T.prototype.valueOf),u(T,"Symbol"),u(Math,"Math",!0),u(o.JSON,"JSON",!0)},function(t,e,i){var o=i(40)("meta"),n=i(32),s=i(22),r=i(20).f,a=0,h=Object.isExtensible||function(){return!0},d=!i(28)(function(){return h(Object.preventExtensions({}))}),l=function(t){r(t,o,{value:{i:"O"+ ++a,w:{}}})},u=function(t,e){if(!n(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!s(t,o)){if(!h(t))return"F";if(!e)return"E";l(t)}return t[o].i},c=function(t,e){if(!s(t,o)){if(!h(t))return!0;if(!e)return!1;l(t)}return t[o].w},p=function(t){return d&&f.NEED&&h(t)&&!s(t,o)&&l(t),t},f=t.exports={KEY:o,NEED:!1,fastKey:u,getWeak:c,onFreeze:p}},function(t,e,i){var o=i(33),n=i(63),s=i(42);t.exports=function(t){var e=o(t),i=n.f;if(i)for(var r,a=i(t),h=s.f,d=0;a.length>d;)h.call(t,r=a[d++])&&e.push(r);return e}},function(t,e,i){var o=i(50);t.exports=Array.isArray||function(t){return"Array"==o(t)}},function(t,e,i){var o=i(25),n=i(88).f,s={}.toString,r="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return n(t)}catch(t){return r.slice()}};t.exports.f=function(t){return r&&"[object Window]"==s.call(t)?a(t):n(o(t))}},function(t,e){},function(t,e,i){i(62)("asyncIterator")},function(t,e,i){i(62)("observable")},function(t,e,i){(function(t){!function(e,i){t.exports=i()}(0,function(){function e(){return Co.apply(null,arguments)}function i(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function n(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}function s(t){return void 0===t}function r(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function a(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function h(t,e){var i,o=[];for(i=0;i0)for(i=0;i0?"future":"past"];return D(i)?i(e):i.replace(/%s/i,e)}function A(t,e){var i=t.toLowerCase();Lo[i]=Lo[i+"s"]=Lo[e]=t}function z(t){return"string"==typeof t?Lo[t]||Lo[t.toLowerCase()]:void 0}function L(t){var e,i,o={};for(i in t)d(t,i)&&(e=z(i))&&(o[e]=t[i]);return o}function F(t,e){Fo[t]=e}function B(t){var e=[];for(var i in t)e.push({unit:i,priority:Fo[i]});return e.sort(function(t,e){return t.priority-e.priority}),e}function j(t,e,i){var o=""+Math.abs(t),n=e-o.length;return(t>=0?i?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+o}function H(t,e,i,o){var n=o;"string"==typeof o&&(n=function(){return this[o]()}),t&&(Wo[t]=n),e&&(Wo[e[0]]=function(){return j(n.apply(this,arguments),e[1],e[2])}),i&&(Wo[i]=function(){return this.localeData().ordinal(n.apply(this,arguments),t)})}function W(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function Y(t){var e,i,o=t.match(Bo);for(e=0,i=o.length;e=0&&jo.test(t);)t=t.replace(jo,i),jo.lastIndex=0,o-=1;return t}function U(t,e,i){an[t]=D(e)?e:function(t,o){return t&&i?i:e}}function q(t,e){return d(an,t)?an[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return Z(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,o,n){return e||i||o||n}))}function Z(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function K(t,e){var i,o=e;for("string"==typeof t&&(t=[t]),r(e)&&(o=function(t,i){i[e]=_(t)}),i=0;i=0&&isFinite(a.getFullYear())&&a.setFullYear(t),a}function _t(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function wt(t,e,i){var o=7+e-i;return-(7+_t(t,0,o).getUTCDay()-e)%7+o-1}function xt(t,e,i,o,n){var s,r,a=(7+i-o)%7,h=wt(t,o,n),d=1+7*(e-1)+a+h;return d<=0?(s=t-1,r=Q(s)+d):d>Q(t)?(s=t+1,r=d-Q(t)):(s=t,r=d),{year:s,dayOfYear:r}}function kt(t,e,i){var o,n,s=wt(t.year(),e,i),r=Math.floor((t.dayOfYear()-s-1)/7)+1;return r<1?(n=t.year()-1,o=r+St(n,e,i)):r>St(t.year(),e,i)?(o=r-St(t.year(),e,i),n=t.year()+1):(n=t.year(),o=r),{week:o,year:n}}function St(t,e,i){var o=wt(t,e,i),n=wt(t+1,e,i);return(Q(t)-o+n)/7}function Dt(t){return kt(t,this._week.dow,this._week.doy).week}function Mt(){return this._week.dow}function Ct(){return this._week.doy}function Ot(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Et(t){var e=kt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Tt(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function Pt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function It(t,e){return t?i(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone}function Nt(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function Rt(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function At(t,e,i){var o,n,s,r=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],o=0;o<7;++o)s=u([2e3,1]).day(o),this._minWeekdaysParse[o]=this.weekdaysMin(s,"").toLocaleLowerCase(),this._shortWeekdaysParse[o]=this.weekdaysShort(s,"").toLocaleLowerCase(),this._weekdaysParse[o]=this.weekdays(s,"").toLocaleLowerCase();return i?"dddd"===e?(n=yn.call(this._weekdaysParse,r),-1!==n?n:null):"ddd"===e?(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null):(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"dddd"===e?-1!==(n=yn.call(this._weekdaysParse,r))?n:-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"ddd"===e?-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):-1!==(n=yn.call(this._minWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null)}function zt(t,e,i){var o,n,s;if(this._weekdaysParseExact)return At.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),o=0;o<7;o++){if(n=u([2e3,1]).day(o),i&&!this._fullWeekdaysParse[o]&&(this._fullWeekdaysParse[o]=new RegExp("^"+this.weekdays(n,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[o]=new RegExp("^"+this.weekdaysShort(n,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[o]=new RegExp("^"+this.weekdaysMin(n,"").replace(".",".?")+"$","i")),this._weekdaysParse[o]||(s="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[o]=new RegExp(s.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[o].test(t))return o;if(i&&"ddd"===e&&this._shortWeekdaysParse[o].test(t))return o;if(i&&"dd"===e&&this._minWeekdaysParse[o].test(t))return o;if(!i&&this._weekdaysParse[o].test(t))return o}}function Lt(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Tt(t,this.localeData()),this.add(t-e,"d")):e}function Ft(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Bt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=Pt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function jt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=En),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ht(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Tn),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Pn),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Yt(){function t(t,e){return e.length-t.length}var e,i,o,n,s,r=[],a=[],h=[],d=[];for(e=0;e<7;e++)i=u([2e3,1]).day(e),o=this.weekdaysMin(i,""),n=this.weekdaysShort(i,""),s=this.weekdays(i,""),r.push(o),a.push(n),h.push(s),d.push(o),d.push(n),d.push(s);for(r.sort(t),a.sort(t),h.sort(t),d.sort(t),e=0;e<7;e++)a[e]=Z(a[e]),h[e]=Z(h[e]),d[e]=Z(d[e]);this._weekdaysRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function Gt(){return this.hours()%12||12}function Vt(){return this.hours()||24}function Ut(t,e){H(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Zt(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}function Kt(t){return t?t.toLowerCase().replace("_","-"):t}function Jt(t){for(var e,i,o,n,s=0;s0;){if(o=$t(n.slice(0,e).join("-")))return o;if(i&&i.length>=e&&w(n,i,!0)>=e-1)break;e--}s++}return null}function $t(e){var i=null;if(!zn[e]&&void 0!==t&&t&&t.exports)try{i=In._abbr;!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),Qt(i)}catch(t){}return zn[e]}function Qt(t,e){var i;return t&&(i=s(e)?ie(t):te(t,e))&&(In=i),In._abbr}function te(t,e){if(null!==e){var i=An;if(e.abbr=t,null!=zn[t])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=zn[t]._config;else if(null!=e.parentLocale){if(null==zn[e.parentLocale])return Ln[e.parentLocale]||(Ln[e.parentLocale]=[]),Ln[e.parentLocale].push({name:t,config:e}),null;i=zn[e.parentLocale]._config}return zn[t]=new O(C(i,e)),Ln[t]&&Ln[t].forEach(function(t){te(t.name,t.config)}),Qt(t),zn[t]}return delete zn[t],null}function ee(t,e){if(null!=e){var i,o=An;null!=zn[t]&&(o=zn[t]._config),e=C(o,e),i=new O(e),i.parentLocale=zn[t],zn[t]=i,Qt(t)}else null!=zn[t]&&(null!=zn[t].parentLocale?zn[t]=zn[t].parentLocale:null!=zn[t]&&delete zn[t]);return zn[t]}function ie(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return In;if(!i(t)){if(e=$t(t))return e;t=[t]}return Jt(t)}function oe(){return Io(zn)}function ne(t){var e,i=t._a;return i&&-2===p(t).overflow&&(e=i[ln]<0||i[ln]>11?ln:i[un]<1||i[un]>ht(i[dn],i[ln])?un:i[cn]<0||i[cn]>24||24===i[cn]&&(0!==i[pn]||0!==i[fn]||0!==i[mn])?cn:i[pn]<0||i[pn]>59?pn:i[fn]<0||i[fn]>59?fn:i[mn]<0||i[mn]>999?mn:-1,p(t)._overflowDayOfYear&&(eun)&&(e=un),p(t)._overflowWeeks&&-1===e&&(e=vn),p(t)._overflowWeekday&&-1===e&&(e=gn),p(t).overflow=e),t}function se(t,e,i){return null!=t?t:null!=e?e:i}function re(t){var i=new Date(e.now());return t._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()]}function ae(t){var e,i,o,n,s=[];if(!t._d){for(o=re(t),t._w&&null==t._a[un]&&null==t._a[ln]&&he(t),null!=t._dayOfYear&&(n=se(t._a[dn],o[dn]),(t._dayOfYear>Q(n)||0===t._dayOfYear)&&(p(t)._overflowDayOfYear=!0),i=_t(n,0,t._dayOfYear),t._a[ln]=i.getUTCMonth(),t._a[un]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=o[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[cn]&&0===t._a[pn]&&0===t._a[fn]&&0===t._a[mn]&&(t._nextDay=!0,t._a[cn]=0),t._d=(t._useUTC?_t:bt).apply(null,s),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[cn]=24),t._w&&void 0!==t._w.d&&t._w.d!==t._d.getDay()&&(p(t).weekdayMismatch=!0)}}function he(t){var e,i,o,n,s,r,a,h;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)s=1,r=4,i=se(e.GG,t._a[dn],kt(De(),1,4).year),o=se(e.W,1),((n=se(e.E,1))<1||n>7)&&(h=!0);else{s=t._locale._week.dow,r=t._locale._week.doy;var d=kt(De(),s,r);i=se(e.gg,t._a[dn],d.year),o=se(e.w,d.week),null!=e.d?((n=e.d)<0||n>6)&&(h=!0):null!=e.e?(n=e.e+s,(e.e<0||e.e>6)&&(h=!0)):n=s}o<1||o>St(i,s,r)?p(t)._overflowWeeks=!0:null!=h?p(t)._overflowWeekday=!0:(a=xt(i,o,n,s,r),t._a[dn]=a.year,t._dayOfYear=a.dayOfYear)}function de(t){var e,i,o,n,s,r,a=t._i,h=Fn.exec(a)||Bn.exec(a);if(h){for(p(t).iso=!0,e=0,i=Hn.length;e0&&p(t).unusedInput.push(r),a=a.slice(a.indexOf(o)+o.length),d+=o.length),Wo[s]?(o?p(t).empty=!1:p(t).unusedTokens.push(s),$(s,o,t)):t._strict&&!o&&p(t).unusedTokens.push(s);p(t).charsLeftOver=h-d,a.length>0&&p(t).unusedInput.push(a),t._a[cn]<=12&&!0===p(t).bigHour&&t._a[cn]>0&&(p(t).bigHour=void 0),p(t).parsedDateParts=t._a.slice(0),p(t).meridiem=t._meridiem,t._a[cn]=ye(t._locale,t._a[cn],t._meridiem),ae(t),ne(t)}function ye(t,e,i){var o;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?(o=t.isPM(i),o&&e<12&&(e+=12),o||12!==e||(e=0),e):e}function be(t){var e,i,o,n,s;if(0===t._f.length)return p(t).invalidFormat=!0,void(t._d=new Date(NaN));for(n=0;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ue(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),t=xe(t),t._a){var e=t._isUTC?u(t._a):De(t._a);this._isDSTShifted=this.isValid()&&w(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Ze(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ke(t,e){var i,o,n,s=t,a=null;return Ne(t)?s={ms:t._milliseconds,d:t._days,M:t._months}:r(t)?(s={},e?s[e]=t:s.milliseconds=t):(a=Jn.exec(t))?(i="-"===a[1]?-1:1,s={y:0,d:_(a[un])*i,h:_(a[cn])*i,m:_(a[pn])*i,s:_(a[fn])*i,ms:_(Re(1e3*a[mn]))*i}):(a=$n.exec(t))?(i="-"===a[1]?-1:(a[1],1),s={y:Je(a[2],i),M:Je(a[3],i),w:Je(a[4],i),d:Je(a[5],i),h:Je(a[6],i),m:Je(a[7],i),s:Je(a[8],i)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(n=Qe(De(s.from),De(s.to)),s={},s.ms=n.milliseconds,s.M=n.months),o=new Ie(s),Ne(t)&&d(t,"_locale")&&(o._locale=t._locale),o}function Je(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function $e(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function Qe(t,e){var i;return t.isValid()&&e.isValid()?(e=Le(e,t),t.isBefore(e)?i=$e(t,e):(i=$e(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function ti(t,e){return function(i,o){var n,s;return null===o||isNaN(+o)||(S(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),s=i,i=o,o=s),i="string"==typeof i?+i:i,n=Ke(i,o),ei(this,n,t),this}}function ei(t,i,o,n){var s=i._milliseconds,r=Re(i._days),a=Re(i._months);t.isValid()&&(n=null==n||n,a&&pt(t,ot(t,"Month")+a*o),r&&nt(t,"Date",ot(t,"Date")+r*o),s&&t._d.setTime(t._d.valueOf()+s*o),n&&e.updateOffset(t,r||a))}function ii(t,e){var i=t.diff(e,"days",!0);return i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse"}function oi(t,i){var o=t||De(),n=Le(o,this).startOf("day"),s=e.calendarFormat(this,n)||"sameElse",r=i&&(D(i[s])?i[s].call(this,o):i[s]);return this.format(r||this.localeData().calendar(s,this,De(o)))}function ni(){return new g(this)}function si(t,e){var i=y(t)?t:De(t);return!(!this.isValid()||!i.isValid())&&(e=z(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>i.valueOf():i.valueOf()9999?G(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):D(Date.prototype.toISOString)?this.toDate().toISOString():G(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function mi(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var i="["+t+'("]',o=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=e+'[")]';return this.format(i+o+"-MM-DD[T]HH:mm:ss.SSS"+n)}function vi(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var i=G(this,t);return this.localeData().postformat(i)}function gi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function yi(t){return this.from(De(),t)}function bi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function _i(t){return this.to(De(),t)}function wi(t){var e;return void 0===t?this._locale._abbr:(e=ie(t),null!=e&&(this._locale=e),this)}function xi(){return this._locale}function ki(t){switch(t=z(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function Si(t){return void 0===(t=z(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Di(){return this._d.valueOf()-6e4*(this._offset||0)}function Mi(){return Math.floor(this.valueOf()/1e3)}function Ci(){return new Date(this.valueOf())}function Oi(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function Ei(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function Ti(){return this.isValid()?this.toISOString():null}function Pi(){return f(this)}function Ii(){return l({},p(this))}function Ni(){return p(this).overflow}function Ri(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ai(t,e){H(0,[t,t.length],0,e)}function zi(t){return ji.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Li(t){return ji.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Fi(){return St(this.year(),1,4)}function Bi(){var t=this.localeData()._week;return St(this.year(),t.dow,t.doy)}function ji(t,e,i,o,n){var s;return null==t?kt(this,o,n).year:(s=St(t,o,n),e>s&&(e=s),Hi.call(this,t,e,i,o,n))}function Hi(t,e,i,o,n){var s=xt(t,e,i,o,n),r=_t(s.year,0,s.dayOfYear);return this.year(r.getUTCFullYear()),this.month(r.getUTCMonth()),this.date(r.getUTCDate()),this}function Wi(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Yi(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Gi(t,e){e[mn]=_(1e3*("0."+t))}function Vi(){return this._isUTC?"UTC":""}function Ui(){return this._isUTC?"Coordinated Universal Time":""}function qi(t){return De(1e3*t)}function Xi(){return De.apply(null,arguments).parseZone()}function Zi(t){return t}function Ki(t,e,i,o){var n=ie(),s=u().set(o,e);return n[i](s,t)}function Ji(t,e,i){if(r(t)&&(e=t,t=void 0),t=t||"",null!=e)return Ki(t,e,i,"month");var o,n=[];for(o=0;o<12;o++)n[o]=Ki(t,o,i,"month");return n}function $i(t,e,i,o){"boolean"==typeof t?(r(e)&&(i=e,e=void 0),e=e||""):(e=t,i=e,t=!1,r(e)&&(i=e,e=void 0),e=e||"");var n=ie(),s=t?n._week.dow:0;if(null!=i)return Ki(e,(i+s)%7,o,"day");var a,h=[];for(a=0;a<7;a++)h[a]=Ki(e,(a+s)%7,o,"day");return h}function Qi(t,e){return Ji(t,e,"months")}function to(t,e){return Ji(t,e,"monthsShort")}function eo(t,e,i){return $i(t,e,i,"weekdays")}function io(t,e,i){return $i(t,e,i,"weekdaysShort")}function oo(t,e,i){return $i(t,e,i,"weekdaysMin")}function no(){var t=this._data;return this._milliseconds=ds(this._milliseconds),this._days=ds(this._days),this._months=ds(this._months),t.milliseconds=ds(t.milliseconds),t.seconds=ds(t.seconds),t.minutes=ds(t.minutes),t.hours=ds(t.hours),t.months=ds(t.months),t.years=ds(t.years),this}function so(t,e,i,o){var n=Ke(e,i);return t._milliseconds+=o*n._milliseconds,t._days+=o*n._days,t._months+=o*n._months,t._bubble()}function ro(t,e){return so(this,t,e,1)}function ao(t,e){return so(this,t,e,-1)}function ho(t){return t<0?Math.floor(t):Math.ceil(t)}function lo(){var t,e,i,o,n,s=this._milliseconds,r=this._days,a=this._months,h=this._data;return s>=0&&r>=0&&a>=0||s<=0&&r<=0&&a<=0||(s+=864e5*ho(co(a)+r),r=0,a=0),h.milliseconds=s%1e3,t=b(s/1e3),h.seconds=t%60,e=b(t/60),h.minutes=e%60,i=b(e/60),h.hours=i%24,r+=b(i/24),n=b(uo(r)),a+=n, -r-=ho(co(n)),o=b(a/12),a%=12,h.days=r,h.months=a,h.years=o,this}function uo(t){return 4800*t/146097}function co(t){return 146097*t/4800}function po(t){if(!this.isValid())return NaN;var e,i,o=this._milliseconds;if("month"===(t=z(t))||"year"===t)return e=this._days+o/864e5,i=this._months+uo(e),"month"===t?i:i/12;switch(e=this._days+Math.round(co(this._months)),t){case"week":return e/7+o/6048e5;case"day":return e+o/864e5;case"hour":return 24*e+o/36e5;case"minute":return 1440*e+o/6e4;case"second":return 86400*e+o/1e3;case"millisecond":return Math.floor(864e5*e)+o;default:throw new Error("Unknown unit "+t)}}function fo(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12):NaN}function mo(t){return function(){return this.as(t)}}function vo(){return Ke(this)}function go(t){return t=z(t),this.isValid()?this[t+"s"]():NaN}function yo(t){return function(){return this.isValid()?this._data[t]:NaN}}function bo(){return b(this.days()/7)}function _o(t,e,i,o,n){return n.relativeTime(e||1,!!i,t,o)}function wo(t,e,i){var o=Ke(t).abs(),n=Ds(o.as("s")),s=Ds(o.as("m")),r=Ds(o.as("h")),a=Ds(o.as("d")),h=Ds(o.as("M")),d=Ds(o.as("y")),l=n<=Ms.ss&&["s",n]||n0,l[4]=i,_o.apply(null,l)}function xo(t){return void 0===t?Ds:"function"==typeof t&&(Ds=t,!0)}function ko(t,e){return void 0!==Ms[t]&&(void 0===e?Ms[t]:(Ms[t]=e,"s"===t&&(Ms.ss=e-1),!0))}function So(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),i=wo(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}function Do(t){return(t>0)-(t<0)||+t}function Mo(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i,o=Cs(this._milliseconds)/1e3,n=Cs(this._days),s=Cs(this._months);t=b(o/60),e=b(t/60),o%=60,t%=60,i=b(s/12),s%=12;var r=i,a=s,h=n,d=e,l=t,u=o?o.toFixed(3).replace(/\.?0+$/,""):"",c=this.asSeconds();if(!c)return"P0D";var p=c<0?"-":"",f=Do(this._months)!==Do(c)?"-":"",m=Do(this._days)!==Do(c)?"-":"",v=Do(this._milliseconds)!==Do(c)?"-":"";return p+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(h?m+h+"D":"")+(d||l||u?"T":"")+(d?v+d+"H":"")+(l?v+l+"M":"")+(u?v+u+"S":"")}var Co,Oo;Oo=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,o=0;o68?1900:2e3)};var yn,bn=it("FullYear",!0);yn=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:m()}),Xn=function(){return Date.now?Date.now():+new Date},Zn=["year","quarter","month","week","day","hour","minute","second","millisecond"];Ae("Z",":"),Ae("ZZ",""),U("Z",nn),U("ZZ",nn),K(["Z","ZZ"],function(t,e,i){i._useUTC=!0,i._tzm=ze(nn,t)});var Kn=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var Jn=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,$n=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Ke.fn=Ie.prototype,Ke.invalid=Pe;var Qn=ti(1,"add"),ts=ti(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var es=k("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});H(0,["gg",2],0,function(){return this.weekYear()%100}),H(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ai("gggg","weekYear"),Ai("ggggg","weekYear"),Ai("GGGG","isoWeekYear"),Ai("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),F("weekYear",1),F("isoWeekYear",1),U("G",en),U("g",en),U("GG",Xo,Go),U("gg",Xo,Go),U("GGGG",$o,Uo),U("gggg",$o,Uo),U("GGGGG",Qo,qo),U("ggggg",Qo,qo),J(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,o){e[o.substr(0,2)]=_(t)}),J(["gg","GG"],function(t,i,o,n){i[n]=e.parseTwoDigitYear(t)}),H("Q",0,"Qo","quarter"),A("quarter","Q"),F("quarter",7),U("Q",Yo),K("Q",function(t,e){e[ln]=3*(_(t)-1)}),H("D",["DD",2],"Do","date"),A("date","D"),F("date",9),U("D",Xo),U("DD",Xo,Go),U("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),K(["D","DD"],un),K("Do",function(t,e){e[un]=_(t.match(Xo)[0],10)});var is=it("Date",!0);H("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),F("dayOfYear",4),U("DDD",Jo),U("DDDD",Vo),K(["DDD","DDDD"],function(t,e,i){i._dayOfYear=_(t)}),H("m",["mm",2],0,"minute"),A("minute","m"),F("minute",14),U("m",Xo),U("mm",Xo,Go),K(["m","mm"],pn);var os=it("Minutes",!1);H("s",["ss",2],0,"second"),A("second","s"),F("second",15),U("s",Xo),U("ss",Xo,Go),K(["s","ss"],fn);var ns=it("Seconds",!1);H("S",0,0,function(){return~~(this.millisecond()/100)}),H(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),H(0,["SSS",3],0,"millisecond"),H(0,["SSSS",4],0,function(){return 10*this.millisecond()}),H(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),H(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),H(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),H(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),H(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),A("millisecond","ms"),F("millisecond",16),U("S",Jo,Yo),U("SS",Jo,Go),U("SSS",Jo,Vo);var ss;for(ss="SSSS";ss.length<=9;ss+="S")U(ss,tn);for(ss="S";ss.length<=9;ss+="S")K(ss,Gi);var rs=it("Milliseconds",!1);H("z",0,0,"zoneAbbr"),H("zz",0,0,"zoneName");var as=g.prototype;as.add=Qn,as.calendar=oi,as.clone=ni,as.diff=ui,as.endOf=Si,as.format=vi,as.from=gi,as.fromNow=yi,as.to=bi,as.toNow=_i,as.get=st,as.invalidAt=Ni,as.isAfter=si,as.isBefore=ri,as.isBetween=ai,as.isSame=hi,as.isSameOrAfter=di,as.isSameOrBefore=li,as.isValid=Pi,as.lang=es,as.locale=wi,as.localeData=xi,as.max=qn,as.min=Un,as.parsingFlags=Ii,as.set=rt,as.startOf=ki,as.subtract=ts,as.toArray=Oi,as.toObject=Ei,as.toDate=Ci,as.toISOString=fi,as.inspect=mi,as.toJSON=Ti,as.toString=pi,as.unix=Mi,as.valueOf=Di,as.creationData=Ri,as.year=bn,as.isLeapYear=et,as.weekYear=zi,as.isoWeekYear=Li,as.quarter=as.quarters=Wi,as.month=ft,as.daysInMonth=mt,as.week=as.weeks=Ot,as.isoWeek=as.isoWeeks=Et,as.weeksInYear=Bi,as.isoWeeksInYear=Fi,as.date=is,as.day=as.days=Lt,as.weekday=Ft,as.isoWeekday=Bt,as.dayOfYear=Yi,as.hour=as.hours=Rn,as.minute=as.minutes=os,as.second=as.seconds=ns,as.millisecond=as.milliseconds=rs,as.utcOffset=Be,as.utc=He,as.local=We,as.parseZone=Ye,as.hasAlignedHourOffset=Ge,as.isDST=Ve,as.isLocal=qe,as.isUtcOffset=Xe,as.isUtc=Ze,as.isUTC=Ze,as.zoneAbbr=Vi,as.zoneName=Ui,as.dates=k("dates accessor is deprecated. Use date instead.",is),as.months=k("months accessor is deprecated. Use month instead",ft),as.years=k("years accessor is deprecated. Use year instead",bn),as.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",je),as.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ue);var hs=O.prototype;hs.calendar=E,hs.longDateFormat=T,hs.invalidDate=P,hs.ordinal=I,hs.preparse=Zi,hs.postformat=Zi,hs.relativeTime=N,hs.pastFuture=R,hs.set=M,hs.months=dt,hs.monthsShort=lt,hs.monthsParse=ct,hs.monthsRegex=gt,hs.monthsShortRegex=vt,hs.week=Dt,hs.firstDayOfYear=Ct,hs.firstDayOfWeek=Mt,hs.weekdays=It,hs.weekdaysMin=Rt,hs.weekdaysShort=Nt,hs.weekdaysParse=zt,hs.weekdaysRegex=jt,hs.weekdaysShortRegex=Ht,hs.weekdaysMinRegex=Wt,hs.isPM=Xt,hs.meridiem=Zt,Qt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===_(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),e.lang=k("moment.lang is deprecated. Use moment.locale instead.",Qt),e.langData=k("moment.langData is deprecated. Use moment.localeData instead.",ie);var ds=Math.abs,ls=mo("ms"),us=mo("s"),cs=mo("m"),ps=mo("h"),fs=mo("d"),ms=mo("w"),vs=mo("M"),gs=mo("y"),ys=yo("milliseconds"),bs=yo("seconds"),_s=yo("minutes"),ws=yo("hours"),xs=yo("days"),ks=yo("months"),Ss=yo("years"),Ds=Math.round,Ms={ss:44,s:45,m:45,h:22,d:26,M:11},Cs=Math.abs,Os=Ie.prototype;return Os.isValid=Te,Os.abs=no,Os.add=ro,Os.subtract=ao,Os.as=po,Os.asMilliseconds=ls,Os.asSeconds=us,Os.asMinutes=cs,Os.asHours=ps,Os.asDays=fs,Os.asWeeks=ms,Os.asMonths=vs,Os.asYears=gs,Os.valueOf=fo,Os._bubble=lo,Os.clone=vo,Os.get=go,Os.milliseconds=ys,Os.seconds=bs,Os.minutes=_s,Os.hours=ws,Os.days=xs,Os.weeks=bo,Os.months=ks,Os.years=Ss,Os.humanize=So,Os.toISOString=Mo,Os.toString=Mo,Os.toJSON=Mo,Os.locale=wi,Os.localeData=xi,Os.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Mo),Os.lang=es,H("X",0,0,"unix"),H("x",0,0,"valueOf"),U("x",en),U("X",sn),K("X",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),K("x",function(t,e,i){i._d=new Date(_(t))}),e.version="2.19.1",function(t){Co=t}(De),e.fn=as,e.min=Ce,e.max=Oe,e.now=Xn,e.utc=u,e.unix=qi,e.months=Qi,e.isDate=a,e.locale=Qt,e.invalid=m,e.duration=Ke,e.isMoment=y,e.weekdays=eo,e.parseZone=Xi,e.localeData=ie,e.isDuration=Ne,e.monthsShort=to,e.weekdaysMin=oo,e.defineLocale=te,e.updateLocale=ee,e.locales=oe,e.weekdaysShort=io,e.normalizeUnits=z,e.relativeTimeRounding=xo,e.relativeTimeThreshold=ko,e.calendarFormat=ii,e.prototype=as,e})}).call(e,i(155)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){function i(t){throw new Error("Cannot find module '"+t+"'.")}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id=156},function(t,e,i){(function(e){function i(t,e,i){var o=e&&i||0,n=0;for(e=e||[],t.toLowerCase().replace(/[0-9a-f]{2}/g,function(t){n<16&&(e[o+n++]=u[t])});n<16;)e[o+n++]=0;return e}function o(t,e){var i=e||0,o=l;return o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]}function n(t,e,i){var n=e&&i||0,s=e||[];t=t||{};var r=void 0!==t.clockseq?t.clockseq:m,a=void 0!==t.msecs?t.msecs:(new Date).getTime(),h=void 0!==t.nsecs?t.nsecs:g+1,d=a-v+(h-g)/1e4;if(d<0&&void 0===t.clockseq&&(r=r+1&16383),(d<0||a>v)&&void 0===t.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=a,g=h,m=r,a+=122192928e5;var l=(1e4*(268435455&a)+h)%4294967296;s[n++]=l>>>24&255,s[n++]=l>>>16&255,s[n++]=l>>>8&255,s[n++]=255&l;var u=a/4294967296*1e4&268435455;s[n++]=u>>>8&255,s[n++]=255&u,s[n++]=u>>>24&15|16,s[n++]=u>>>16&255,s[n++]=r>>>8|128,s[n++]=255&r;for(var c=t.node||f,p=0;p<6;p++)s[n+p]=c[p];return e||o(s)}function s(t,e,i){var n=e&&i||0;"string"==typeof t&&(e="binary"==t?new Array(16):null,t=null),t=t||{};var s=t.random||(t.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,e)for(var a=0;a<16;a++)e[n+a]=s[a];return e||o(s)}var r,a="undefined"!=typeof window?window:void 0!==e?e:null;if(a&&a.crypto&&crypto.getRandomValues){var h=new Uint8Array(16);r=function(){return crypto.getRandomValues(h),h}}if(!r){var d=new Array(16);r=function(){for(var t,e=0;e<16;e++)0==(3&e)&&(t=4294967296*Math.random()),d[e]=t>>>((3&e)<<3)&255;return d}}for(var l=[],u={},c=0;c<256;c++)l[c]=(c+256).toString(16).substr(1),u[l[c]]=c;var p=r(),f=[1|p[0],p[1],p[2],p[3],p[4],p[5]],m=16383&(p[6]<<8|p[7]),v=0,g=0,y=s;y.v1=n,y.v4=s,y.parse=i,y.unparse=o,t.exports=y}).call(e,i(158))},function(t,e){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Graph3d=i(161),e.graph3d={Camera:i(95),Filter:i(96),Point2d:i(91),Point3d:i(34),Slider:i(92),StepNumber:i(93)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){var o=i(7),n=o.JSON||(o.JSON={stringify:JSON.stringify});t.exports=function(t){return n.stringify.apply(n,arguments)}},function(t,e,i){function o(t,e,i){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.dataGroup=new _,this.dataPoints=null,this.create(),f.setDefaults(o.DEFAULTS,this),this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.setOptions(i),this.setData(e)}function n(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0}function s(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0}var r=i(90),a=function(t){return t&&t.__esModule?t:{default:t}}(r),h=i(44),d=i(2),l=i(34),u=i(91),c=i(92),p=i(93),f=i(94),m=i(15).default,v=i(15),g=v.printStyle,y=i(172),b=y.allOptions,_=i(173);o.STYLE=f.STYLE;o.DEFAULTS={width:"400px",height:"400px",filterLabel:"time",legendLabel:"value",xLabel:"x",yLabel:"y",zLabel:"z",xValueLabel:function(t){return t},yValueLabel:function(t){return t},zValueLabel:function(t){return t},showXAxis:!0,showYAxis:!0,showZAxis:!0,showGrid:!0,showPerspective:!0,showShadow:!1,keepAspectRatio:!0,verticalRatio:.5,dotSizeRatio:.02,dotSizeMinFraction:.5,dotSizeMaxFraction:2.5,showAnimationControls:void 0,animationInterval:1e3,animationPreload:!1,animationAutoStart:void 0,axisColor:"#4D4D4D",gridColor:"#D3D3D3",xCenter:"55%",yCenter:"50%",style:o.STYLE.DOT,tooltip:!1,tooltipStyle:{content:{padding:"10px",border:"1px solid #4d4d4d",color:"#1a1a1a",background:"rgba(255,255,255,0.7)",borderRadius:"2px",boxShadow:"5px 5px 10px rgba(128,128,128,0.5)"},line:{height:"40px",width:"0",borderLeft:"1px solid #4d4d4d"},dot:{height:"0",width:"0",border:"5px solid #4d4d4d",borderRadius:"5px"}},dataColor:{fill:"#7DC1FF",stroke:"#3267D2",strokeWidth:1},cameraPosition:{horizontal:1,vertical:.5,distance:1.7},showLegend:void 0,backgroundColor:void 0,xBarWidth:void 0,yBarWidth:void 0,valueMin:void 0,valueMax:void 0,xMin:void 0,xMax:void 0,xStep:void 0,yMin:void 0,yMax:void 0,yStep:void 0,zMin:void 0,zMax:void 0,zStep:void 0},h(o.prototype),o.prototype._setScale=function(){this.scale=new l(1/this.xRange.range(),1/this.yRange.range(),1/this.zRange.range()),this.keepAspectRatio&&(this.scale.x0&&(r[n-1].pointNext=r[n]);return r},o.prototype.create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);this.frame=document.createElement("div"),this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas);var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t),this.frame.filter=document.createElement("div"),this.frame.filter.style.position="absolute",this.frame.filter.style.bottom="0px",this.frame.filter.style.left="0px",this.frame.filter.style.width="100%",this.frame.appendChild(this.frame.filter);var e=this,i=function(t){e._onMouseDown(t)},o=function(t){e._onTouchStart(t)},n=function(t){e._onWheel(t)},s=function(t){e._onTooltip(t)},r=function(t){e._onClick(t)};d.addEventListener(this.frame.canvas,"mousedown",i),d.addEventListener(this.frame.canvas,"touchstart",o),d.addEventListener(this.frame.canvas,"mousewheel",n),d.addEventListener(this.frame.canvas,"mousemove",s),d.addEventListener(this.frame.canvas,"click",r),this.containerElement.appendChild(this.frame)},o.prototype._setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this._resizeCanvas()},o.prototype._resizeCanvas=function(){this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.frame.filter.style.width=this.frame.canvas.clientWidth-20+"px"},o.prototype.animationStart=function(){if(this.animationAutoStart&&this.dataGroup.dataFilter){if(!this.frame.filter||!this.frame.filter.slider)throw new Error("No animation available");this.frame.filter.slider.play()}},o.prototype.animationStop=function(){this.frame.filter&&this.frame.filter.slider&&this.frame.filter.slider.stop()},o.prototype._resizeCenter=function(){"%"===this.xCenter.charAt(this.xCenter.length-1)?this.currentXCenter=parseFloat(this.xCenter)/100*this.frame.canvas.clientWidth:this.currentXCenter=parseFloat(this.xCenter),"%"===this.yCenter.charAt(this.yCenter.length-1)?this.currentYCenter=parseFloat(this.yCenter)/100*(this.frame.canvas.clientHeight-this.frame.filter.clientHeight):this.currentYCenter=parseFloat(this.yCenter)},o.prototype.getCameraPosition=function(){var t=this.camera.getArmRotation();return t.distance=this.camera.getArmLength(),t},o.prototype._readData=function(t){this.dataPoints=this.dataGroup.initializeData(this,t,this.style),this._initializeRanges(),this._redrawFilter()},o.prototype.setData=function(t){void 0!==t&&null!==t&&(this._readData(t),this.redraw(),this.animationStart())},o.prototype.setOptions=function(t){if(void 0!==t){!0===m.validate(t,b)&&console.log("%cErrors have been found in the supplied options object.",g),this.animationStop(),f.setOptions(t,this),this.setPointDrawingMethod(),this._setSize(this.width,this.height),this.setData(this.dataGroup.getDataTable()),this.animationStart()}},o.prototype.setPointDrawingMethod=function(){var t=void 0;switch(this.style){case o.STYLE.BAR:t=o.prototype._redrawBarGraphPoint;break;case o.STYLE.BARCOLOR:t=o.prototype._redrawBarColorGraphPoint;break;case o.STYLE.BARSIZE:t=o.prototype._redrawBarSizeGraphPoint;break;case o.STYLE.DOT:t=o.prototype._redrawDotGraphPoint;break;case o.STYLE.DOTLINE:t=o.prototype._redrawDotLineGraphPoint;break;case o.STYLE.DOTCOLOR:t=o.prototype._redrawDotColorGraphPoint;break;case o.STYLE.DOTSIZE:t=o.prototype._redrawDotSizeGraphPoint;break;case o.STYLE.SURFACE:t=o.prototype._redrawSurfaceGraphPoint;break;case o.STYLE.GRID:t=o.prototype._redrawGridGraphPoint;break;case o.STYLE.LINE:t=o.prototype._redrawLineGraphPoint;break;default:throw new Error("Can not determine point drawing method for graph style '"+this.style+"'")}this._pointDrawingMethod=t},o.prototype.redraw=function(){if(void 0===this.dataPoints)throw new Error("Graph data not initialized");this._resizeCanvas(),this._resizeCenter(),this._redrawSlider(),this._redrawClear(),this._redrawAxis(),this._redrawDataGraph(),this._redrawInfo(),this._redrawLegend()},o.prototype._getContext=function(){var t=this.frame.canvas,e=t.getContext("2d");return e.lineJoin="round",e.lineCap="round",e},o.prototype._redrawClear=function(){var t=this.frame.canvas;t.getContext("2d").clearRect(0,0,t.width,t.height)},o.prototype._dotSize=function(){return this.frame.clientWidth*this.dotSizeRatio},o.prototype._getLegendWidth=function(){var t;if(this.style===o.STYLE.DOTSIZE){t=this._dotSize()*this.dotSizeMaxFraction}else t=this.style===o.STYLE.BARSIZE?this.xBarWidth:20;return t},o.prototype._redrawLegend=function(){if(!0===this.showLegend&&this.style!==o.STYLE.LINE&&this.style!==o.STYLE.BARSIZE){var t=this.style===o.STYLE.BARSIZE||this.style===o.STYLE.DOTSIZE,e=this.style===o.STYLE.DOTSIZE||this.style===o.STYLE.DOTCOLOR||this.style===o.STYLE.BARCOLOR,i=Math.max(.25*this.frame.clientHeight,100),n=this.margin,s=this._getLegendWidth(),r=this.frame.clientWidth-this.margin,a=r-s,h=n+i,d=this._getContext();if(d.lineWidth=1,d.font="14px arial",!1===t){var l,c=i;for(l=0;l0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)<0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelY=function(t,e,i,o,n){void 0===n&&(n=0);var s=this._convert3Dto2D(e);Math.cos(2*o)<0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)>0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelZ=function(t,e,i,o){void 0===o&&(o=0);var n=this._convert3Dto2D(e);t.textAlign="right",t.textBaseline="middle",t.fillStyle=this.axisColor,t.fillText(i,n.x-o,n.y)},o.prototype._line3d=function(t,e,i,o){var n=this._convert3Dto2D(e),s=this._convert3Dto2D(i);this._line(t,n,s,o)},o.prototype._redrawAxis=function(){var t,e,i,o,n,s,r,a,h,d,c,f=this._getContext();f.font=24/this.camera.getArmLength()+"px arial";var m,v=.025/this.scale.x,g=.025/this.scale.y,y=5/this.camera.getArmLength(),b=this.camera.getArmRotation().horizontal,_=new u(Math.cos(b),Math.sin(b)),w=this.xRange,x=this.yRange,k=this.zRange;for(f.lineWidth=1,o=void 0===this.defaultXStep,i=new p(w.min,w.max,this.xStep,o),i.start(!0);!i.end();){var S=i.getCurrent();if(this.showGrid?(t=new l(S,x.min,k.min),e=new l(S,x.max,k.min),this._line3d(f,t,e,this.gridColor)):this.showXAxis&&(t=new l(S,x.min,k.min),e=new l(S,x.min+v,k.min),this._line3d(f,t,e,this.axisColor),t=new l(S,x.max,k.min),e=new l(S,x.max-v,k.min),this._line3d(f,t,e,this.axisColor)),this.showXAxis){r=_.x>0?x.min:x.max,m=new l(S,r,k.min);var D=" "+this.xValueLabel(S)+" ";this.drawAxisLabelX(f,m,D,b,y)}i.next()}for(f.lineWidth=1,o=void 0===this.defaultYStep,i=new p(x.min,x.max,this.yStep,o),i.start(!0);!i.end();){var M=i.getCurrent();if(this.showGrid?(t=new l(w.min,M,k.min),e=new l(w.max,M,k.min),this._line3d(f,t,e,this.gridColor)):this.showYAxis&&(t=new l(w.min,M,k.min),e=new l(w.min+g,M,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,M,k.min),e=new l(w.max-g,M,k.min),this._line3d(f,t,e,this.axisColor)),this.showYAxis){s=_.y>0?w.min:w.max,m=new l(s,M,k.min);var C=" "+this.yValueLabel(M)+" ";this.drawAxisLabelY(f,m,C,b,y)}i.next()}if(this.showZAxis){for(f.lineWidth=1,o=void 0===this.defaultZStep,i=new p(k.min,k.max,this.zStep,o),i.start(!0),s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max;!i.end();){var O=i.getCurrent(),E=new l(s,r,O),T=this._convert3Dto2D(E);e=new u(T.x-y,T.y),this._line(f,T,e,this.axisColor);var P=this.zValueLabel(O)+" ";this.drawAxisLabelZ(f,E,P,5),i.next()}f.lineWidth=1,t=new l(s,r,k.min),e=new l(s,r,k.max),this._line3d(f,t,e,this.axisColor)}if(this.showXAxis){var I,N;f.lineWidth=1,I=new l(w.min,x.min,k.min),N=new l(w.max,x.min,k.min),this._line3d(f,I,N,this.axisColor),I=new l(w.min,x.max,k.min),N=new l(w.max,x.max,k.min),this._line3d(f,I,N,this.axisColor)}this.showYAxis&&(f.lineWidth=1,t=new l(w.min,x.min,k.min),e=new l(w.min,x.max,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,x.min,k.min),e=new l(w.max,x.max,k.min),this._line3d(f,t,e,this.axisColor));var R=this.xLabel;R.length>0&&this.showXAxis&&(c=.1/this.scale.y,s=(w.max+3*w.min)/4,r=_.x>0?x.min-c:x.max+c,n=new l(s,r,k.min),this.drawAxisLabelX(f,n,R,b));var A=this.yLabel;A.length>0&&this.showYAxis&&(d=.1/this.scale.x,s=_.y>0?w.min-d:w.max+d,r=(x.max+3*x.min)/4,n=new l(s,r,k.min),this.drawAxisLabelY(f,n,A,b));var z=this.zLabel;z.length>0&&this.showZAxis&&(h=30,s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max,a=(k.max+3*k.min)/4,n=new l(s,r,a),this.drawAxisLabelZ(f,n,z,h))},o.prototype._hsv2rgb=function(t,e,i){var o,n,s,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:o=r,n=h,s=0;break;case 1:o=h,n=r,s=0;break;case 2:o=0,n=r,s=h;break;case 3:o=0,n=h,s=r;break;case 4:o=h,n=0,s=r;break;case 5:o=r,n=0,s=h;break;default:o=0,n=0,s=0}return"RGB("+parseInt(255*o)+","+parseInt(255*n)+","+parseInt(255*s)+")"},o.prototype._getStrokeWidth=function(t){return void 0!==t?this.showPerspective?1/-t.trans.z*this.dataColor.strokeWidth:-this.eye.z/this.camera.getArmLength()*this.dataColor.strokeWidth:this.dataColor.strokeWidth},o.prototype._redrawBar=function(t,e,i,o,n,s){var r,a=this,h=e.point,d=this.zRange.min,u=[{point:new l(h.x-i,h.y-o,h.z)},{point:new l(h.x+i,h.y-o,h.z)},{point:new l(h.x+i,h.y+o,h.z)},{point:new l(h.x-i,h.y+o,h.z)}],c=[{point:new l(h.x-i,h.y-o,d)},{point:new l(h.x+i,h.y-o,d)},{point:new l(h.x+i,h.y+o,d)},{point:new l(h.x-i,h.y+o,d)}];u.forEach(function(t){t.screen=a._convert3Dto2D(t.point)}),c.forEach(function(t){t.screen=a._convert3Dto2D(t.point)});var p=[{corners:u,center:l.avg(c[0].point,c[2].point)},{corners:[u[0],u[1],c[1],c[0]],center:l.avg(c[1].point,c[0].point)},{corners:[u[1],u[2],c[2],c[1]],center:l.avg(c[2].point,c[1].point)},{corners:[u[2],u[3],c[3],c[2]],center:l.avg(c[3].point,c[2].point)},{corners:[u[3],u[0],c[0],c[3]],center:l.avg(c[0].point,c[3].point)}];e.surfaces=p;for(var f=0;f0}if(a){var p,f=(e.point.z+i.point.z+o.point.z+n.point.z)/4,m=240*(1-(f-this.zRange.min)*this.scale.z/this.verticalRatio);this.showShadow?(p=Math.min(1+u.x/c/2,1),s=this._hsv2rgb(m,1,p),r=s):(p=1,s=this._hsv2rgb(m,1,p),r=this.axisColor)}else s="gray",r=this.axisColor;t.lineWidth=this._getStrokeWidth(e);var v=[e,i,n,o];this._polygon(t,v,s,r)}},o.prototype._drawGridLine=function(t,e,i){if(void 0!==e&&void 0!==i){var o=(e.point.z+i.point.z)/2,n=240*(1-(o-this.zRange.min)*this.scale.z/this.verticalRatio);t.lineWidth=2*this._getStrokeWidth(e),t.strokeStyle=this._hsv2rgb(n,1,1),this._line(t,e.screen,i.screen)}},o.prototype._redrawGridGraphPoint=function(t,e){this._drawGridLine(t,e,e.pointRight),this._drawGridLine(t,e,e.pointTop)},o.prototype._redrawLineGraphPoint=function(t,e){void 0!==e.pointNext&&(t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=this.dataColor.stroke,this._line(t,e.screen,e.pointNext.screen))},o.prototype._redrawDataGraph=function(){var t,e=this._getContext();if(!(void 0===this.dataPoints||this.dataPoints.length<=0))for(this._calcTranslations(this.dataPoints),t=0;t0?1:t<0?-1:0}var o=e[0],n=e[1],s=e[2],r=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),a=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x)),h=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},o.prototype._dataPointFromXY=function(t,e){var i,n=null,s=null,r=null,a=new u(t,e);if(this.style===o.STYLE.BAR||this.style===o.STYLE.BARCOLOR||this.style===o.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var h=n.surfaces;if(h)for(var d=h.length-1;d>=0;d--){var l=h[d],c=l.corners,p=[c[0].screen,c[1].screen,c[2].screen],f=[c[2].screen,c[3].screen,c[0].screen];if(this._insideTriangle(a,p)||this._insideTriangle(a,f))return n}}else for(i=0;i"+this.xLabel+":"+t.point.x+""+this.yLabel+":"+t.point.y+""+this.zLabel+":"+t.point.z+"",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(o);var n=e.offsetWidth,s=e.offsetHeight,r=i.offsetHeight,h=o.offsetWidth,d=o.offsetHeight,l=t.screen.x-n/2;l=Math.min(Math.max(l,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=l+"px",e.style.top=t.screen.y-r-s+"px",o.style.left=t.screen.x-h/2+"px",o.style.top=t.screen.y-d/2+"px"},o.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},o.prototype.setCameraPosition=function(t){f.setCameraPosition(t,this),this.redraw()},o.prototype.setSize=function(t,e){this._setSize(t,e),this.redraw()},t.exports=o},function(t,e,i){i(163),t.exports=i(7).Object.assign},function(t,e,i){var o=i(17);o(o.S+o.F,"Object",{assign:i(164)})},function(t,e,i){var o=i(33),n=i(63),s=i(42),r=i(41),a=i(78),h=Object.assign;t.exports=!h||i(28)(function(){var t={},e={},i=Symbol(),o="abcdefghijklmnopqrst";return t[i]=7,o.split("").forEach(function(t){e[t]=t}),7!=h({},t)[i]||Object.keys(h({},e)).join("")!=o})?function(t,e){for(var i=r(t),h=arguments.length,d=1,l=n.f,u=s.f;h>d;)for(var c,p=a(arguments[d++]),f=l?o(p).concat(l(p)):o(p),m=f.length,v=0;m>v;)u.call(p,c=f[v++])&&(i[c]=p[c]);return i}:h},function(t,e,i){t.exports={default:i(166),__esModule:!0}},function(t,e,i){i(167),t.exports=i(7).Math.sign},function(t,e,i){var o=i(17);o(o.S,"Math",{sign:i(168)})},function(t,e){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,e,i){t.exports={default:i(170),__esModule:!0}},function(t,e,i){i(171);var o=i(7).Object;t.exports=function(t,e,i){return o.defineProperty(t,e,i)}},function(t,e,i){var o=i(17);o(o.S+o.F*!i(21),"Object",{defineProperty:i(20).f})},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r={fill:{string:o},stroke:{string:o},strokeWidth:{number:s},__type__:{string:o,object:"object",undefined:"undefined"}},a={animationAutoStart:{boolean:n,undefined:"undefined"},animationInterval:{number:s},animationPreload:{boolean:n},axisColor:{string:o},backgroundColor:r,xBarWidth:{number:s,undefined:"undefined"},yBarWidth:{number:s,undefined:"undefined"},cameraPosition:{distance:{number:s},horizontal:{number:s},vertical:{number:s},__type__:{object:"object"}},xCenter:{string:o},yCenter:{string:o},dataColor:r,dotSizeMinFraction:{number:s},dotSizeMaxFraction:{number:s},dotSizeRatio:{number:s},filterLabel:{string:o},gridColor:{string:o},onclick:{function:"function"},keepAspectRatio:{boolean:n},xLabel:{string:o},yLabel:{string:o},zLabel:{string:o},legendLabel:{string:o},xMin:{number:s,undefined:"undefined"},yMin:{number:s,undefined:"undefined"},zMin:{number:s,undefined:"undefined"},xMax:{number:s,undefined:"undefined"},yMax:{number:s,undefined:"undefined"},zMax:{number:s,undefined:"undefined"},showAnimationControls:{boolean:n,undefined:"undefined"},showGrid:{boolean:n},showLegend:{boolean:n,undefined:"undefined"},showPerspective:{boolean:n},showShadow:{boolean:n},showXAxis:{boolean:n},showYAxis:{boolean:n},showZAxis:{boolean:n},xStep:{number:s,undefined:"undefined"},yStep:{number:s,undefined:"undefined"},zStep:{number:s,undefined:"undefined"},style:{number:s,string:["bar","bar-color","bar-size","dot","dot-line","dot-color","dot-size","line","grid","surface"]},tooltip:{boolean:n,function:"function"},tooltipStyle:{content:{color:{string:o},background:{string:o},border:{string:o},borderRadius:{string:o},boxShadow:{string:o},padding:{string:o},__type__:{object:"object"}},line:{borderLeft:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},dot:{border:{string:o},borderRadius:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},__type__:{object:"object"}},xValueLabel:{function:"function"},yValueLabel:{function:"function"},zValueLabel:{function:"function"},valueMax:{number:s,undefined:"undefined"},valueMin:{number:s,undefined:"undefined"},verticalRatio:{number:s},height:{string:o},width:{string:o},__type__:{object:"object"}};e.allOptions=a},function(t,e,i){function o(){this.dataTable=null}var n=i(11),s=i(12),r=i(174),a=i(96),h=i(94),d=i(34);o.prototype.initializeData=function(t,e,i){if(void 0!==e){Array.isArray(e)&&(e=new n(e));var o;if(!(e instanceof n||e instanceof s))throw new Error("Array, DataSet, or DataView expected");if(o=e.get(),0!=o.length){this.style=i,this.dataSet&&this.dataSet.off("*",this._onChange),this.dataSet=e,this.dataTable=o;var r=this;this._onChange=function(){t.setData(r.dataSet)},this.dataSet.on("*",this._onChange),this.colX="x",this.colY="y",this.colZ="z";var h=t.hasBars(i);if(h&&(void 0!==t.defaultXBarWidth?this.xBarWidth=t.defaultXBarWidth:this.xBarWidth=this.getSmallestDifference(o,this.colX)||1,void 0!==t.defaultYBarWidth?this.yBarWidth=t.defaultYBarWidth:this.yBarWidth=this.getSmallestDifference(o,this.colY)||1),this._initializeRange(o,this.colX,t,h),this._initializeRange(o,this.colY,t,h),this._initializeRange(o,this.colZ,t,!1),o[0].hasOwnProperty("style")){this.colValue="style";var d=this.getColumnRange(o,this.colValue);this._setRangeDefaults(d,t.defaultValueMin,t.defaultValueMax),this.valueRange=d}this.getDataTable()[0].hasOwnProperty("filter")&&void 0===this.dataFilter&&(this.dataFilter=new a(this,"filter",t),this.dataFilter.setOnLoadCallback(function(){t.redraw()}));return this.dataFilter?this.dataFilter._getDataPoints():this._getDataPoints(this.getDataTable())}}},o.prototype._collectRangeSettings=function(t,e){if(-1==["x","y","z"].indexOf(t))throw new Error("Column '"+t+"' invalid");var i=t.toUpperCase();return{barWidth:this[t+"BarWidth"],min:e["default"+i+"Min"],max:e["default"+i+"Max"],step:e["default"+i+"Step"],range_label:t+"Range",step_label:t+"Step"}},o.prototype._initializeRange=function(t,e,i,o){var n=this._collectRangeSettings(e,i),s=this.getColumnRange(t,e);o&&"z"!=e&&s.expand(n.barWidth/2),this._setRangeDefaults(s,n.min,n.max),this[n.range_label]=s,this[n.step_label]=void 0!==n.step?n.step:s.range()/5},o.prototype.getDistinctValues=function(t,e){void 0===e&&(e=this.dataTable);for(var i=[],o=0;os)&&(o=s)}return o},o.prototype.getColumnRange=function(t,e){for(var i=new r,o=0;o0&&(e[i-1].pointNext=e[i]);return e},o.prototype._checkValueField=function(t){if(this.style===h.STYLE.BARCOLOR||this.style===h.STYLE.BARSIZE||this.style===h.STYLE.DOTCOLOR||this.style===h.STYLE.DOTSIZE){if(void 0===this.colValue)throw new Error("Expected data to have field 'style' for graph style '"+this.style+"'");if(void 0===t[0][this.colValue])throw new Error("Expected data to have field '"+this.colValue+"' for graph style '"+this.style+"'")}},t.exports=o},function(t,e,i){function o(){this.min=void 0,this.max=void 0}o.prototype.adjust=function(t){void 0!==t&&((void 0===this.min||this.min>t)&&(this.min=t),(void 0===this.max||this.maxi)throw new Error("Passed expansion value makes range invalid");this.min=e,this.max=i}},o.prototype.range=function(){return this.max-this.min},o.prototype.center=function(){return(this.min+this.max)/2},t.exports=o},function(t,e,i){var o,n,s;!function(i){n=[],o=i,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(function(){var t=null;return function e(i,o){function n(t){return t.match(/[^ ]+/g)}function s(e){if("hammer.input"!==e.type){if(e.srcEvent._handled||(e.srcEvent._handled={}),e.srcEvent._handled[e.type])return;e.srcEvent._handled[e.type]=!0}var i=!1;e.stopPropagation=function(){i=!0};var o=e.srcEvent.stopPropagation.bind(e.srcEvent);"function"==typeof o&&(e.srcEvent.stopPropagation=function(){o(),e.stopPropagation()}),e.firstTarget=t;for(var n=t;n&&!i;){var s=n.hammer;if(s)for(var r,a=0;a0?d._handlers[t]=o:(i.off(t,s),delete d._handlers[t]))}),d},d.emit=function(e,o){t=o.target,i.emit(e,o)},d.destroy=function(){var t=i.element.hammer,e=t.indexOf(d);-1!==e&&t.splice(e,1),t.length||delete i.element.hammer,d._handlers={},i.destroy()},d}})},function(t,e,i){var o;!function(n,s,r,a){function h(t,e,i){return setTimeout(p(t,i),e)}function d(t,e,i){return!!Array.isArray(t)&&(l(t,i[e],i),!0)}function l(t,e,i){var o;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==a)for(o=0;o\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",s=n.console&&(n.console.warn||n.console.log);return s&&s.call(n.console,o,i),t.apply(this,arguments)}}function c(t,e,i){var o,n=e.prototype;o=t.prototype=Object.create(n),o.constructor=t,o._super=n,i&&ft(o,i)}function p(t,e){return function(){return t.apply(e,arguments)}}function f(t,e){return typeof t==gt?t.apply(e?e[0]||a:a,e):t}function m(t,e){return t===a?e:t}function v(t,e,i){l(_(e),function(e){t.addEventListener(e,i,!1)})}function g(t,e,i){l(_(e),function(e){t.removeEventListener(e,i,!1)})}function y(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function b(t,e){return t.indexOf(e)>-1}function _(t){return t.trim().split(/\s+/g)}function w(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var o=0;oi[e]}):o.sort()),o}function S(t,e){for(var i,o,n=e[0].toUpperCase()+e.slice(1),s=0;s1&&!i.firstMultiple?i.firstMultiple=N(e):1===n&&(i.firstMultiple=!1);var s=i.firstInput,r=i.firstMultiple,a=r?r.center:s.center,h=e.center=R(o);e.timeStamp=_t(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=F(a,h),e.distance=L(a,h),P(i,e),e.offsetDirection=z(e.deltaX,e.deltaY);var d=A(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=d.x,e.overallVelocityY=d.y,e.overallVelocity=bt(d.x)>bt(d.y)?d.x:d.y,e.scale=r?j(r.pointers,o):1,e.rotation=r?B(r.pointers,o):0,e.maxPointers=i.prevInput?e.pointers.length>i.prevInput.maxPointers?e.pointers.length:i.prevInput.maxPointers:e.pointers.length,I(i,e);var l=t.element;y(e.srcEvent.target,l)&&(l=e.srcEvent.target),e.target=l}function P(t,e){var i=e.center,o=t.offsetDelta||{},n=t.prevDelta||{},s=t.prevInput||{};e.eventType!==Et&&s.eventType!==Pt||(n=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},o=t.offsetDelta={x:i.x,y:i.y}),e.deltaX=n.x+(i.x-o.x),e.deltaY=n.y+(i.y-o.y)}function I(t,e){var i,o,n,s,r=t.lastInterval||e,h=e.timeStamp-r.timeStamp;if(e.eventType!=It&&(h>Ot||r.velocity===a)){var d=e.deltaX-r.deltaX,l=e.deltaY-r.deltaY,u=A(h,d,l);o=u.x,n=u.y,i=bt(u.x)>bt(u.y)?u.x:u.y,s=z(d,l),t.lastInterval=e}else i=r.velocity,o=r.velocityX,n=r.velocityY,s=r.direction;e.velocity=i,e.velocityX=o,e.velocityY=n,e.direction=s}function N(t){for(var e=[],i=0;i=bt(e)?t<0?Rt:At:e<0?zt:Lt}function L(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return Math.sqrt(o*o+n*n)}function F(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return 180*Math.atan2(n,o)/Math.PI}function B(t,e){return F(e[1],e[0],Wt)+F(t[1],t[0],Wt)}function j(t,e){return L(e[0],e[1],Wt)/L(t[0],t[1],Wt)}function H(){this.evEl=Gt,this.evWin=Vt,this.pressed=!1,C.apply(this,arguments)}function W(){this.evEl=Xt,this.evWin=Zt,C.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Y(){this.evTarget=Jt,this.evWin=$t,this.started=!1,C.apply(this,arguments)}function G(t,e){var i=x(t.touches),o=x(t.changedTouches);return e&(Pt|It)&&(i=k(i.concat(o),"identifier",!0)),[i,o]}function V(){this.evTarget=te,this.targetIds={},C.apply(this,arguments)}function U(t,e){var i=x(t.touches),o=this.targetIds;if(e&(Et|Tt)&&1===i.length)return o[i[0].identifier]=!0,[i,i];var n,s,r=x(t.changedTouches),a=[],h=this.target;if(s=i.filter(function(t){return y(t.target,h)}),e===Et)for(n=0;n-1&&o.splice(t,1)};setTimeout(n,ee)}}function K(t){for(var e=t.srcEvent.clientX,i=t.srcEvent.clientY,o=0;o-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(e,t)}var i=this,o=this.state;o=fe&&e(i.options.event+tt(o))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&n&e.direction},attrTest:function(t){return ot.prototype.attrTest.call(this,t)&&(this.state&ce||!(this.state&ce)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=et(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),c(st,ot,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&ce)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),c(rt,Q,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[se]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distancee.time;if(this._input=t,!o||!i||t.eventType&(Pt|It)&&!n)this.reset();else if(t.eventType&Et)this.reset(),this._timer=h(function(){this.state=me,this.tryEmit()},e.time,this);else if(t.eventType&Pt)return me;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===me&&(t&&t.eventType&Pt?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=_t(),this.manager.emit(this.options.event,this._input)))}}),c(at,ot,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&ce)}}),c(ht,ot,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Ft|Bt,pointers:1},getTouchAction:function(){return nt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Ft|Bt)?e=t.overallVelocity:i&Ft?e=t.overallVelocityX:i&Bt&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&i&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&bt(e)>this.options.velocity&&t.eventType&Pt},emit:function(t){var e=et(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),c(dt,Q,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[re]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distanced+i?s+=h()+u-i+t.itemSet.options.margin.item.vertical:r=!1,s=Math.min(s,o-i),{shouldScroll:r,scrollOffset:s,itemTop:l}}var a=i(9),h=i(2),d=i(11),l=i(12),u=i(64),c=i(65),p=i(45),f=i(67),m=i(46),v=i(99),g=i(15).printStyle,y=i(105).allOptions,b=i(105).configureOptions,_=i(71).default,w=i(15).default;o.prototype=new c,o.prototype._createConfigurator=function(){return new _(this,this.dom.container,b)},o.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:!0}),this._redraw()},o.prototype.setOptions=function(t){if(!0===w.validate(t,y)&&console.log("%cErrors have been found in the supplied options object.",g),c.prototype.setOptions.call(this,t),"type"in t&&t.type!==this.options.type){this.options.type=t.type;var e=this.itemsData;if(e){var i=this.getSelection();this.setItems(null),this.setItems(e),this.setSelection(i)}}},o.prototype.setItems=function(t){var e;e=t?t instanceof d||t instanceof l?t:new d(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e)},o.prototype.setGroups=function(t){var e;if(t){var i=function(t){return!1!==t.visible};e=t instanceof d||t instanceof l?new l(t,{filter:i}):new d(t.filter(i))}else e=null;this.groupsData=e,this.itemSet.setGroups(e)},o.prototype.setData=function(t){t&&t.groups&&this.setGroups(t.groups),t&&t.items&&this.setItems(t.items)},o.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},o.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},o.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],o=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),n=null,s=null;if(o.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===n||es)&&(s=i)}),null!==n&&null!==s){var a=this,h=this.itemSet.items[i[0]],d=-1*this._getScrollTop(),l=null,u=function(t,e,i){var o=r(a,h);if(l||(l=o),l.itemTop!=o.itemTop||l.shouldScroll){l.itemTop!=o.itemTop&&o.shouldScroll&&(l=o,d=-1*a._getScrollTop());var n=d,s=l.scrollOffset,u=i?s:n+(s-n)*t;a._setScrollTop(-u),e||a._redraw()}},c=function(){var t=r(a,h);t.shouldScroll&&t.itemTop!=l.itemTop&&(a._setScrollTop(-t.scrollOffset),a._redraw())},p=function(){c(),setTimeout(c,100)},f=(n+s)/2,m=Math.max(this.range.end-this.range.start,1.1*(s-n)),v=!e||void 0===e.animation||e.animation;v||(l={shouldScroll:!1,scrollOffset:-1,itemTop:-1}),this.range.setRange(f-m/2,f+m/2,{animation:v},p,u)}}},o.prototype.fit=function(t,e){var i,o=!t||void 0===t.animation||t.animation,n=this.itemsData&&this.itemsData.getDataSet();1===n.length&&void 0===n.get()[0].end?(i=this.getDataRange(),this.moveTo(i.min.valueOf(),{animation:o},e)):(i=this.getItemRange(),this.range.setRange(i.min,i.max,{animation:o},e))},o.prototype.getItemRange=function(){var t=this.getDataRange(),e=null!==t.min?t.min.valueOf():null,i=null!==t.max?t.max.valueOf():null,o=null,r=null;if(null!=e&&null!=i){var a=i-e;a<=0&&(a=10);var d=a/this.props.center.width,l={},u=0;h.forEach(this.itemSet.items,function(t,e){if(t.groupShowing){l[e]=t.redraw(!0),u=l[e].length}});if(u>0)for(var c=0;ci&&(i=h,r=t)}.bind(this)),o&&r){var p=o.getWidthLeft()+10,f=r.getWidthRight()+10,m=this.props.center.width-p-f;m>0&&(this.options.rtl?(e=n(o)-f*a/m,i=s(r)+p*a/m):(e=n(o)-p*a/m,i=s(r)+f*a/m))}}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},o.prototype.getDataRange=function(){var t=null,e=null,i=this.itemsData&&this.itemsData.getDataSet();return i&&i.forEach(function(i){var o=h.convert(i.start,"Date").valueOf(),n=h.convert(void 0!=i.end?i.end:i.start,"Date").valueOf();(null===t||oe)&&(e=n)}),{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e,i=t.center?t.center.x:t.clientX,o=t.center?t.center.y:t.clientY;e=this.options.rtl?h.getAbsoluteRight(this.dom.centerContainer)-i:i-h.getAbsoluteLeft(this.dom.centerContainer);var n=o-h.getAbsoluteTop(this.dom.centerContainer),s=this.itemSet.itemFromTarget(t),r=this.itemSet.groupFromTarget(t),a=m.customTimeFromTarget(t),d=this.itemSet.options.snap||null,l=this.body.util.getScale(),u=this.body.util.getStep(),c=this._toTime(e),p=d?d(c,l,u):c,f=h.getTarget(t),v=null;return null!=s?v="item":null!=a?v="custom-time":h.hasParent(f,this.timeAxis.dom.foreground)?v="axis":this.timeAxis2&&h.hasParent(f,this.timeAxis2.dom.foreground)?v="axis":h.hasParent(f,this.itemSet.dom.labelSet)?v="group-label":h.hasParent(f,this.currentTime.bar)?v="current-time":h.hasParent(f,this.dom.center)&&(v="background"),{event:t,item:s?s.id:null,group:r?r.groupId:null,what:v,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:e,y:n,time:c,snappedTime:p}},o.prototype.toggleRollingMode=function(){this.range.rolling?this.range.stopRolling():(void 0==this.options.rollingMode&&this.setOptions(this.options),this.range.startRolling())},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(10),u=i(37),c=i(2),p=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;(0,a.default)(this,t),this.pixelRatio=e,this.generated=!1,this.centerCoordinates={x:144.5,y:144.5},this.r=289*.49,this.color={r:255,g:255,b:255,a:1},this.hueCircle=void 0,this.initialColor={r:255,g:255,b:255,a:1},this.previousColor=void 0,this.applied=!1,this.updateCallback=function(){},this.closeCallback=function(){},this._create()}return(0,d.default)(t,[{key:"insertTo",value:function(t){void 0!==this.hammer&&(this.hammer.destroy(),this.hammer=void 0),this.container=t,this.container.appendChild(this.frame),this._bindHammer(),this._setSize()}},{key:"setUpdateCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker update callback is not a function.");this.updateCallback=t}},{key:"setCloseCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker closing callback is not a function.");this.closeCallback=t}},{key:"_isColorString",value:function(t){var e={black:"#000000",navy:"#000080",darkblue:"#00008B",mediumblue:"#0000CD",blue:"#0000FF",darkgreen:"#006400",green:"#008000",teal:"#008080",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",lime:"#00FF00",springgreen:"#00FF7F",aqua:"#00FFFF",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",mediumaquamarine:"#66CDAA",dimgray:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",lightslategray:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",maroon:"#800000",purple:"#800080",olive:"#808000",gray:"#808080",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370D8",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",silver:"#C0C0C0",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgrey:"#D3D3D3",palevioletred:"#D87093",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",red:"#FF0000",fuchsia:"#FF00FF",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",yellow:"#FFFF00",lightyellow:"#FFFFE0",ivory:"#FFFFF0",white:"#FFFFFF"};if("string"==typeof t)return e[t]}},{key:"setColor",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if("none"!==t){var i=void 0,o=this._isColorString(t);if(void 0!==o&&(t=o),!0===c.isString(t)){if(!0===c.isValidRGB(t)){var n=t.substr(4).substr(0,t.length-5).split(",");i={r:n[0],g:n[1],b:n[2],a:1}}else if(!0===c.isValidRGBA(t)){var r=t.substr(5).substr(0,t.length-6).split(",");i={r:r[0],g:r[1],b:r[2],a:r[3]}}else if(!0===c.isValidHex(t)){var a=c.hexToRGB(t);i={r:a.r,g:a.g,b:a.b,a:1}}}else if(t instanceof Object&&void 0!==t.r&&void 0!==t.g&&void 0!==t.b){var h=void 0!==t.a?t.a:"1.0";i={r:t.r,g:t.g,b:t.b,a:h}}if(void 0===i)throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: "+(0,s.default)(t));this._setColor(i,e)}}},{key:"show",value:function(){void 0!==this.closeCallback&&(this.closeCallback(),this.closeCallback=void 0),this.applied=!1,this.frame.style.display="block",this._generateHueCircle()}},{key:"_hide",value:function(){var t=this;!0===(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(this.previousColor=c.extend({},this.color)),!0===this.applied&&this.updateCallback(this.initialColor),this.frame.style.display="none",setTimeout(function(){void 0!==t.closeCallback&&(t.closeCallback(),t.closeCallback=void 0)},0)}},{key:"_save",value:function(){this.updateCallback(this.color),this.applied=!1,this._hide()}},{key:"_apply",value:function(){this.applied=!0,this.updateCallback(this.color),this._updatePicker(this.color)}},{key:"_loadLast",value:function(){void 0!==this.previousColor?this.setColor(this.previousColor,!1):alert("There is no last color to load...")}},{key:"_setColor",value:function(t){!0===(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&(this.initialColor=c.extend({},t)),this.color=t;var e=c.RGBToHSV(t.r,t.g,t.b),i=2*Math.PI,o=this.r*e.s,n=this.centerCoordinates.x+o*Math.sin(i*e.h),s=this.centerCoordinates.y+o*Math.cos(i*e.h);this.colorPickerSelector.style.left=n-.5*this.colorPickerSelector.clientWidth+"px",this.colorPickerSelector.style.top=s-.5*this.colorPickerSelector.clientHeight+"px",this._updatePicker(t)}},{key:"_setOpacity",value:function(t){this.color.a=t/100,this._updatePicker(this.color)}},{key:"_setBrightness",value:function(t){var e=c.RGBToHSV(this.color.r,this.color.g,this.color.b);e.v=t/100;var i=c.HSVToRGB(e.h,e.s,e.v);i.a=this.color.a,this.color=i,this._updatePicker()}},{key:"_updatePicker",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.color,e=c.RGBToHSV(t.r,t.g,t.b),i=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1)),i.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var o=this.colorPickerCanvas.clientWidth,n=this.colorPickerCanvas.clientHeight;i.clearRect(0,0,o,n),i.putImageData(this.hueCircle,0,0),i.fillStyle="rgba(0,0,0,"+(1-e.v)+")",i.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),i.fill(),this.brightnessRange.value=100*e.v,this.opacityRange.value=100*t.a,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}},{key:"_setSize",value:function(){this.colorPickerCanvas.style.width="100%",this.colorPickerCanvas.style.height="100%",this.colorPickerCanvas.width=289*this.pixelRatio,this.colorPickerCanvas.height=289*this.pixelRatio}},{key:"_create",value:function(){if(this.frame=document.createElement("div"),this.frame.className="vis-color-picker",this.colorPickerDiv=document.createElement("div"),this.colorPickerSelector=document.createElement("div"),this.colorPickerSelector.className="vis-selector",this.colorPickerDiv.appendChild(this.colorPickerSelector),this.colorPickerCanvas=document.createElement("canvas"),this.colorPickerDiv.appendChild(this.colorPickerCanvas),this.colorPickerCanvas.getContext){var t=this.colorPickerCanvas.getContext("2d") -;this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.colorPickerCanvas.appendChild(e)}this.colorPickerDiv.className="vis-color",this.opacityDiv=document.createElement("div"),this.opacityDiv.className="vis-opacity",this.brightnessDiv=document.createElement("div"),this.brightnessDiv.className="vis-brightness",this.arrowDiv=document.createElement("div"),this.arrowDiv.className="vis-arrow",this.opacityRange=document.createElement("input");try{this.opacityRange.type="range",this.opacityRange.min="0",this.opacityRange.max="100"}catch(t){}this.opacityRange.value="100",this.opacityRange.className="vis-range",this.brightnessRange=document.createElement("input");try{this.brightnessRange.type="range",this.brightnessRange.min="0",this.brightnessRange.max="100"}catch(t){}this.brightnessRange.value="100",this.brightnessRange.className="vis-range",this.opacityDiv.appendChild(this.opacityRange),this.brightnessDiv.appendChild(this.brightnessRange);var i=this;this.opacityRange.onchange=function(){i._setOpacity(this.value)},this.opacityRange.oninput=function(){i._setOpacity(this.value)},this.brightnessRange.onchange=function(){i._setBrightness(this.value)},this.brightnessRange.oninput=function(){i._setBrightness(this.value)},this.brightnessLabel=document.createElement("div"),this.brightnessLabel.className="vis-label vis-brightness",this.brightnessLabel.innerHTML="brightness:",this.opacityLabel=document.createElement("div"),this.opacityLabel.className="vis-label vis-opacity",this.opacityLabel.innerHTML="opacity:",this.newColorDiv=document.createElement("div"),this.newColorDiv.className="vis-new-color",this.newColorDiv.innerHTML="new",this.initialColorDiv=document.createElement("div"),this.initialColorDiv.className="vis-initial-color",this.initialColorDiv.innerHTML="initial",this.cancelButton=document.createElement("div"),this.cancelButton.className="vis-button vis-cancel",this.cancelButton.innerHTML="cancel",this.cancelButton.onclick=this._hide.bind(this,!1),this.applyButton=document.createElement("div"),this.applyButton.className="vis-button vis-apply",this.applyButton.innerHTML="apply",this.applyButton.onclick=this._apply.bind(this),this.saveButton=document.createElement("div"),this.saveButton.className="vis-button vis-save",this.saveButton.innerHTML="save",this.saveButton.onclick=this._save.bind(this),this.loadButton=document.createElement("div"),this.loadButton.className="vis-button vis-load",this.loadButton.innerHTML="load last",this.loadButton.onclick=this._loadLast.bind(this),this.frame.appendChild(this.colorPickerDiv),this.frame.appendChild(this.arrowDiv),this.frame.appendChild(this.brightnessLabel),this.frame.appendChild(this.brightnessDiv),this.frame.appendChild(this.opacityLabel),this.frame.appendChild(this.opacityDiv),this.frame.appendChild(this.newColorDiv),this.frame.appendChild(this.initialColorDiv),this.frame.appendChild(this.cancelButton),this.frame.appendChild(this.applyButton),this.frame.appendChild(this.saveButton),this.frame.appendChild(this.loadButton)}},{key:"_bindHammer",value:function(){var t=this;this.drag={},this.pinch={},this.hammer=new l(this.colorPickerCanvas),this.hammer.get("pinch").set({enable:!0}),u.onTouch(this.hammer,function(e){t._moveSelector(e)}),this.hammer.on("tap",function(e){t._moveSelector(e)}),this.hammer.on("panstart",function(e){t._moveSelector(e)}),this.hammer.on("panmove",function(e){t._moveSelector(e)}),this.hammer.on("panend",function(e){t._moveSelector(e)})}},{key:"_generateHueCircle",value:function(){if(!1===this.generated){var t=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)),t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.colorPickerCanvas.clientWidth,i=this.colorPickerCanvas.clientHeight;t.clearRect(0,0,e,i);var o=void 0,n=void 0,s=void 0,r=void 0;this.centerCoordinates={x:.5*e,y:.5*i},this.r=.49*e;var a=2*Math.PI/360,h=1/this.r,d=void 0;for(s=0;s<360;s++)for(r=0;rr?r:t,e=null==e?r:e0&&l.push(u.screenToValue(n)),!p.hidden&&this.itemsData.length>0&&l.push(p.screenToValue(n)),{event:t,what:d,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:n,time:r,value:l}},o.prototype._createConfigurator=function(){return new g(this,this.dom.container,v)},t.exports=o},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Network=i(182),e.network={Images:i(116),dotparser:i(114),gephiParser:i(115),allOptions:i(122)},e.network.convertDot=function(t){return e.network.dotparser.DOTToGraph(t)},e.network.convertGephi=function(t,i){return e.network.gephiParser.parseGephi(t,i)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){function o(t,e,i){var n=this;if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.options={},this.defaultOptions={locale:"en",locales:d,clickToUse:!1},s.extend(this.options,this.defaultOptions),this.body={container:t,nodes:{},nodeIndices:[],edges:{},edgeIndices:[],emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this),once:this.once.bind(this)},eventListeners:{onTap:function(){},onTouch:function(){},onDoubleTap:function(){},onHold:function(){},onDragStart:function(){},onDrag:function(){},onDragEnd:function(){},onMouseWheel:function(){},onPinch:function(){},onMouseMove:function(){},onRelease:function(){},onContext:function(){}},data:{nodes:null,edges:null},functions:{createNode:function(){},createEdge:function(){},getPointer:function(){}},modules:{},view:{scale:1,translation:{x:0,y:0}}},this.bindEventListeners(),this.images=new l(function(){return n.body.emitter.emit("_requestRedraw")}),this.groups=new u,this.canvas=new g(this.body),this.selectionHandler=new _(this.body,this.canvas),this.interactionHandler=new b(this.body,this.canvas,this.selectionHandler),this.view=new y(this.body,this.canvas),this.renderer=new v(this.body,this.canvas),this.physics=new f(this.body),this.layoutEngine=new w(this.body),this.clustering=new m(this.body),this.manipulation=new x(this.body,this.canvas,this.selectionHandler),this.nodesHandler=new c(this.body,this.images,this.groups,this.layoutEngine),this.edgesHandler=new p(this.body,this.images,this.groups),this.body.modules.kamadaKawai=new T(this.body,150,.05),this.body.modules.clustering=this.clustering,this.canvas._create(),this.setOptions(i),this.setData(e)}i(183);var n=i(44),s=i(2),r=i(114),a=i(115),h=i(97),d=i(184),l=i(116).default,u=i(186).default,c=i(187).default,p=i(214).default,f=i(220).default,m=i(227).default,v=i(229).default,g=i(230).default,y=i(231).default,b=i(232).default,_=i(234).default,w=i(235).default,x=i(237).default,k=i(71).default,S=i(15).default,D=i(15),M=D.printStyle,C=i(122),O=C.allOptions,E=C.configureOptions,T=i(238).default;n(o.prototype),o.prototype.setOptions=function(t){var e=this;if(void 0!==t){!0===S.validate(t,O)&&console.log("%cErrors have been found in the supplied options object.",M);var i=["locale","locales","clickToUse"];if(s.selectiveDeepExtend(i,this.options,t),t=this.layoutEngine.setOptions(t.layout,t),this.canvas.setOptions(t),this.groups.setOptions(t.groups),this.nodesHandler.setOptions(t.nodes),this.edgesHandler.setOptions(t.edges),this.physics.setOptions(t.physics),this.manipulation.setOptions(t.manipulation,t,this.options),this.interactionHandler.setOptions(t.interaction),this.renderer.setOptions(t.interaction),this.selectionHandler.setOptions(t.interaction),void 0!==t.groups&&this.body.emitter.emit("refreshNodes"),"configure"in t&&(this.configurator||(this.configurator=new k(this,this.body.container,E,this.canvas.pixelRatio)),this.configurator.setOptions(t.configure)),this.configurator&&!0===this.configurator.options.enabled){var o={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};s.deepExtend(o.nodes,this.nodesHandler.options),s.deepExtend(o.edges,this.edgesHandler.options),s.deepExtend(o.layout,this.layoutEngine.options),s.deepExtend(o.interaction,this.selectionHandler.options),s.deepExtend(o.interaction,this.renderer.options),s.deepExtend(o.interaction,this.interactionHandler.options),s.deepExtend(o.manipulation,this.manipulation.options),s.deepExtend(o.physics,this.physics.options),s.deepExtend(o.global,this.canvas.options),s.deepExtend(o.global,this.options),this.configurator.setModuleOptions(o)}void 0!==t.clickToUse?!0===t.clickToUse?void 0===this.activator&&(this.activator=new h(this.canvas.frame),this.activator.on("change",function(){e.body.emitter.emit("activate")})):(void 0!==this.activator&&(this.activator.destroy(),delete this.activator),this.body.emitter.emit("activate")):this.body.emitter.emit("activate"),this.canvas.setSize(),this.body.emitter.emit("startSimulation")}},o.prototype._updateVisibleIndices=function(){var t=this.body.nodes,e=this.body.edges;this.body.nodeIndices=[],this.body.edgeIndices=[];for(var i in t)t.hasOwnProperty(i)&&(this.clustering._isClusteredNode(i)||!1!==t[i].options.hidden||this.body.nodeIndices.push(t[i].id));for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],s=t[n.fromId],r=t[n.toId],a=void 0!==s&&void 0!==r,h=!this.clustering._isClusteredEdge(o)&&!1===n.options.hidden&&a&&!1===s.options.hidden&&!1===r.options.hidden;h&&this.body.edgeIndices.push(n.id)}},o.prototype.bindEventListeners=function(){var t=this;this.body.emitter.on("_dataChanged",function(){t.edgesHandler._updateState(),t.body.emitter.emit("_dataUpdated")}),this.body.emitter.on("_dataUpdated",function(){t.clustering._updateState(),t._updateVisibleIndices(),t._updateValueRange(t.body.nodes),t._updateValueRange(t.body.edges),t.body.emitter.emit("startSimulation"),t.body.emitter.emit("_requestRedraw")})},o.prototype.setData=function(t){if(this.body.emitter.emit("resetPhysics"),this.body.emitter.emit("_resetData"),this.selectionHandler.unselectAll(),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){console.log("The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);");var e=r.DOTToGraph(t.dot);return void this.setData(e)}if(t&&t.gephi){console.log("The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);");var i=a.parseGephi(t.gephi);return void this.setData(i)}this.nodesHandler.setData(t&&t.nodes,!0),this.edgesHandler.setData(t&&t.edges,!0),this.body.emitter.emit("_dataChanged"),this.body.emitter.emit("_dataLoaded"),this.body.emitter.emit("initPhysics")},o.prototype.destroy=function(){this.body.emitter.emit("destroy"),this.body.emitter.off(),this.off(),delete this.groups,delete this.canvas,delete this.selectionHandler,delete this.interactionHandler,delete this.view,delete this.renderer,delete this.physics,delete this.layoutEngine,delete this.clustering,delete this.manipulation,delete this.nodesHandler,delete this.edgesHandler,delete this.configurator,delete this.images;for(var t in this.body.nodes)this.body.nodes.hasOwnProperty(t)&&delete this.body.nodes[t];for(var e in this.body.edges)this.body.edges.hasOwnProperty(e)&&delete this.body.edges[e];s.recursiveDOMDelete(this.body.container)},o.prototype._updateValueRange=function(t){var e,i=void 0,o=void 0,n=0;for(e in t)if(t.hasOwnProperty(e)){var s=t[e].getValue();void 0!==s&&(i=void 0===i?s:Math.min(s,i),o=void 0===o?s:Math.max(s,o),n+=s)}if(void 0!==i&&void 0!==o)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,o,n)},o.prototype.isActive=function(){return!this.activator||this.activator.active},o.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)},o.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)},o.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)},o.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)},o.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)},o.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)},o.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)},o.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)},o.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)},o.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)},o.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)},o.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)},o.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)},o.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)},o.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)},o.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.editNodeMode=function(){return console.log("Deprecated: Please use editNode instead of editNodeMode."),this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)},o.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)},o.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)},o.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)},o.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)},o.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)},o.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)},o.prototype.getConnectedNodes=function(t){return void 0!==this.body.nodes[t]?this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments):this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)},o.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)},o.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)},o.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)},o.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)},o.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)},o.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)},o.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments)},o.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments)},o.prototype.getNodeAt=function(){var t=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.getEdgeAt=function(){var t=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)},o.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)},o.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments),this.redraw()},o.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)},o.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)},o.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)},o.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)},o.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)},o.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)},o.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)},o.prototype.getOptionsFromConfigurator=function(){var t={};return this.configurator&&(t=this.configurator.getOptions.apply(this.configurator)),t},t.exports=o},function(t,e,i){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1),this.closePath()},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i),this.closePath()},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath(),i*=1.15,e+=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e-(r-s)),this.lineTo(t+n,e+s),this.lineTo(t-n,e+s),this.lineTo(t,e-(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath(),i*=1.15,e-=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e+(r-s)),this.lineTo(t+n,e-s),this.lineTo(t-n,e-s),this.lineTo(t,e+(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath(),i*=.82,e+=.1*i;for(var o=0;o<10;o++){var n=o%2==0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*o*Math.PI/10),e-n*Math.cos(2*o*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.diamond=function(t,e,i){this.beginPath(),this.lineTo(t,e+i),this.lineTo(t+i,e),this.lineTo(t,e-i),this.lineTo(t-i,e),this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,o,n){var s=Math.PI/180;i-2*n<0&&(n=i/2),o-2*n<0&&(n=o/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*s,360*s,!1),this.lineTo(t+i,e+o-n),this.arc(t+i-n,e+o-n,n,0,90*s,!1),this.lineTo(t+n,e+o),this.arc(t+n,e+o-n,n,90*s,180*s,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*s,270*s,!1),this.closePath()},CanvasRenderingContext2D.prototype.ellipse_vis=function(t,e,i,o){var n=i/2*.5522848,s=o/2*.5522848,r=t+i,a=e+o,h=t+i/2,d=e+o/2;this.beginPath(),this.moveTo(t,d),this.bezierCurveTo(t,d-s,h-n,e,h,e),this.bezierCurveTo(h+n,e,r,d-s,r,d),this.bezierCurveTo(r,d+s,h+n,a,h,a),this.bezierCurveTo(h-n,a,t,d+s,t,d),this.closePath()},CanvasRenderingContext2D.prototype.database=function(t,e,i,o){var n=i,s=o*(1/3),r=n/2*.5522848,a=s/2*.5522848,h=t+n,d=e+s,l=t+n/2,u=e+s/2,c=e+(o-s/2),p=e+o;this.beginPath(),this.moveTo(h,u),this.bezierCurveTo(h,u+a,l+r,d,l,d),this.bezierCurveTo(l-r,d,t,u+a,t,u),this.bezierCurveTo(t,u-a,l-r,e,l,e),this.bezierCurveTo(l+r,e,h,u-a,h,u),this.lineTo(h,c),this.bezierCurveTo(h,c+a,l+r,p,l,p),this.bezierCurveTo(l-r,p,t,c+a,t,c),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,o,n){this.beginPath(),this.moveTo(t,e);for(var s=n.length,r=i-t,a=o-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,u=!0,c=0,p=n[0];d>=.1;)p=n[l++%s],p>d&&(p=d),c=Math.sqrt(p*p/(1+h*h)),c=r<0?-c:c,t+=c,e+=h*c,!0===u?this.lineTo(t,e):this.moveTo(t,e),d-=p,u=!u},CanvasRenderingContext2D.prototype.hexagon=function(t,e,i){this.beginPath();var o=2*Math.PI/6;this.moveTo(t+i,e);for(var n=1;n<6;n++)this.lineTo(t+i*Math.cos(o*n),e+i*Math.sin(o*n));this.closePath()})},function(t,e,i){e.en={edit:"Edit",del:"Delete selected",back:"Back",addNode:"Add Node",addEdge:"Add Edge",editNode:"Edit Node",editEdge:"Edit Edge",addDescription:"Click in an empty space to place a new node.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",createEdgeError:"Cannot link edges to a cluster.",deleteClusterError:"Clusters cannot be deleted.",editClusterError:"Clusters cannot be edited."},e.en_EN=e.en,e.en_US=e.en,e.de={edit:"Editieren",del:"Lösche Auswahl",back:"Zurück",addNode:"Knoten hinzufügen",addEdge:"Kante hinzufügen",editNode:"Knoten editieren",editEdge:"Kante editieren",addDescription:"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.",edgeDescription:"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.",editEdgeDescription:"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.",createEdgeError:"Es ist nicht möglich, Kanten mit Clustern zu verbinden.",deleteClusterError:"Cluster können nicht gelöscht werden.",editClusterError:"Cluster können nicht editiert werden."},e.de_DE=e.de,e.es={edit:"Editar",del:"Eliminar selección",back:"Átras",addNode:"Añadir nodo",addEdge:"Añadir arista",editNode:"Editar nodo",editEdge:"Editar arista",addDescription:"Haga clic en un lugar vacío para colocar un nuevo nodo.",edgeDescription:"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.",editEdgeDescription:"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.",createEdgeError:"No se puede conectar una arista a un grupo.",deleteClusterError:"No es posible eliminar grupos.",editClusterError:"No es posible editar grupos."},e.es_ES=e.es,e.it={edit:"Modifica",del:"Cancella la selezione",back:"Indietro",addNode:"Aggiungi un nodo",addEdge:"Aggiungi un vertice",editNode:"Modifica il nodo",editEdge:"Modifica il vertice",addDescription:"Clicca per aggiungere un nuovo nodo",edgeDescription:"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.",editEdgeDescription:"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.",createEdgeError:"Non si possono collegare vertici ad un cluster",deleteClusterError:"I cluster non possono essere cancellati",editClusterError:"I clusters non possono essere modificati."},e.it_IT=e.it,e.nl={edit:"Wijzigen",del:"Selectie verwijderen",back:"Terug",addNode:"Node toevoegen",addEdge:"Link toevoegen",editNode:"Node wijzigen",editEdge:"Link wijzigen",addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",createEdgeError:"Kan geen link maken naar een cluster.",deleteClusterError:"Clusters kunnen niet worden verwijderd.",editClusterError:"Clusters kunnen niet worden aangepast."},e.nl_NL=e.nl,e.nl_BE=e.nl,e["pt-br"]={edit:"Editar",del:"Remover selecionado",back:"Voltar",addNode:"Adicionar nó",addEdge:"Adicionar aresta",editNode:"Editar nó",editEdge:"Editar aresta",addDescription:"Clique em um espaço em branco para adicionar um novo nó",edgeDescription:"Clique em um nó e arraste a aresta até outro nó para conectá-los",editEdgeDescription:"Clique nos pontos de controle e os arraste para um nó para conectá-los",createEdgeError:"Não foi possível linkar arestas a um cluster.",deleteClusterError:"Clusters não puderam ser removidos.",editClusterError:"Clusters não puderam ser editados."},e["pt-BR"]=e["pt-br"],e.pt_BR=e["pt-br"],e.pt_br=e["pt-br"],e.ru={edit:"Редактировать",del:"Удалить выбранное",back:"Назад",addNode:"Добавить узел",addEdge:"Добавить ребро",editNode:"Редактировать узел",editEdge:"Редактировать ребро",addDescription:"Кликните в свободное место, чтобы добавить новый узел.",edgeDescription:"Кликните на узел и протяните ребро к другому узлу, чтобы соединить их.",editEdgeDescription:"Кликните на контрольные точки и перетащите их в узел, чтобы подключиться к нему.",createEdgeError:"Невозможно соединить ребра в кластер.",deleteClusterError:"Кластеры не могут быть удалены",editClusterError:"Кластеры недоступны для редактирования."},e.ru_RU=e.ru,e.cn={edit:"编辑",del:"删除选定",back:"返回",addNode:"添加节点",addEdge:"添加连接线",editNode:"编辑节点",editEdge:"编辑连接线",addDescription:"单击空白处放置新节点。",edgeDescription:"单击某个节点并将该连接线拖动到另一个节点以连接它们。",editEdgeDescription:"单击控制节点并将它们拖到节点上连接。",createEdgeError:"无法将连接线连接到群集。",deleteClusterError:"无法删除群集。",editClusterError:"无法编辑群集。"},e.zh_CN=e.cn},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(){(0,s.default)(this,t),this.NUM_ITERATIONS=4,this.image=new Image,this.canvas=document.createElement("canvas")}return(0,a.default)(t,[{key:"init",value:function(){if(!this.initialized()){this.src=this.image.src;var t=this.image.width,e=this.image.height;this.width=t,this.height=e;var i=Math.floor(e/2),o=Math.floor(e/4),n=Math.floor(e/8),s=Math.floor(e/16),r=Math.floor(t/2),a=Math.floor(t/4),h=Math.floor(t/8),d=Math.floor(t/16);this.canvas.width=3*a,this.canvas.height=i,this.coordinates=[[0,0,r,i],[r,0,a,o],[r,o,h,n],[5*h,o,d,s]],this._fillMipMap()}}},{key:"initialized",value:function(){return void 0!==this.coordinates}},{key:"_fillMipMap",value:function(){var t=this.canvas.getContext("2d"),e=this.coordinates[0];t.drawImage(this.image,e[0],e[1],e[2],e[3]);for(var i=1;i2){e*=.5;for(var r=0;e>2&&r=this.NUM_ITERATIONS&&(r=this.NUM_ITERATIONS-1);var a=this.coordinates[r];t.drawImage(this.canvas,a[0],a[1],a[2],a[3],i,o,n,s)}else t.drawImage(this.image,i,o,n,s)}}]),t}();e.default=h},function(t,e,i){ -function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=function(){function t(){(0,s.default)(this,t),this.clear(),this.defaultIndex=0,this.groupsArray=[],this.groupIndex=0,this.defaultGroups=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}},{border:"#990000",background:"#EE0000",highlight:{border:"#BB0000",background:"#FF3333"},hover:{border:"#BB0000",background:"#FF3333"}},{border:"#FF6000",background:"#FF6000",highlight:{border:"#FF6000",background:"#FF6000"},hover:{border:"#FF6000",background:"#FF6000"}},{border:"#97C2FC",background:"#2B7CE9",highlight:{border:"#D2E5FF",background:"#2B7CE9"},hover:{border:"#D2E5FF",background:"#2B7CE9"}},{border:"#399605",background:"#255C03",highlight:{border:"#399605",background:"#255C03"},hover:{border:"#399605",background:"#255C03"}},{border:"#B70054",background:"#FF007E",highlight:{border:"#B70054",background:"#FF007E"},hover:{border:"#B70054",background:"#FF007E"}},{border:"#AD85E4",background:"#7C29F0",highlight:{border:"#D3BDF0",background:"#7C29F0"},hover:{border:"#D3BDF0",background:"#7C29F0"}},{border:"#4557FA",background:"#000EA1",highlight:{border:"#6E6EFD",background:"#000EA1"},hover:{border:"#6E6EFD",background:"#000EA1"}},{border:"#FFC0CB",background:"#FD5A77",highlight:{border:"#FFD1D9",background:"#FD5A77"},hover:{border:"#FFD1D9",background:"#FD5A77"}},{border:"#C2FABC",background:"#74D66A",highlight:{border:"#E6FFE3",background:"#74D66A"},hover:{border:"#E6FFE3",background:"#74D66A"}},{border:"#EE0000",background:"#990000",highlight:{border:"#FF3333",background:"#BB0000"},hover:{border:"#FF3333",background:"#BB0000"}}],this.options={},this.defaultOptions={useDefaultGroups:!0},h.extend(this.options,this.defaultOptions)}return(0,a.default)(t,[{key:"setOptions",value:function(t){var e=["useDefaultGroups"];if(void 0!==t)for(var i in t)if(t.hasOwnProperty(i)&&-1===e.indexOf(i)){var o=t[i];this.add(i,o)}}},{key:"clear",value:function(){this.groups={},this.groupsArray=[]}},{key:"get",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this.groups[t];if(void 0===i&&e)if(!1===this.options.useDefaultGroups&&this.groupsArray.length>0){var o=this.groupIndex%this.groupsArray.length;this.groupIndex++,i={},i.color=this.groups[this.groupsArray[o]],this.groups[t]=i}else{var n=this.defaultIndex%this.defaultGroups.length;this.defaultIndex++,i={},i.color=this.defaultGroups[n],this.groups[t]=i}return i}},{key:"add",value:function(t,e){return this.groups[t]=e,this.groupsArray.push(t),e}}]),t}();e.default=d},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(47).default,c=function(){function t(e,i,o,n){var r=this;if((0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.layoutEngine=n,this.body.functions.createNode=this.create.bind(this),this.nodesListeners={add:function(t,e){r.add(e.items)},update:function(t,e){r.update(e.items,e.data,e.oldData)},remove:function(t,e){r.remove(e.items)}},this.defaultOptions={borderWidth:1,borderWidthSelected:2,brokenImage:void 0,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},fixed:{x:!1,y:!1},font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:0,strokeColor:"#ffffff",align:"center",vadjust:0,multi:!1,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"monospace",vadjust:2}},group:void 0,hidden:!1,icon:{face:"FontAwesome",code:void 0,size:50,color:"#2B7CE9"},image:void 0,label:void 0,labelHighlightBold:!0,level:void 0,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:!0,scaling:{min:10,max:30,label:{enabled:!1,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},shape:"ellipse",shapeProperties:{borderDashes:!1,borderRadius:6,interpolation:!0,useImageSize:!1,useBorderWithImage:!1},size:25,title:void 0,value:void 0,x:void 0,y:void 0},this.defaultOptions.mass<=0)throw"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative";this.options=h.bridgeObject(this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("refreshNodes",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.nodesListeners,function(e,i){t.body.data.nodes&&t.body.data.nodes.off(i,e)}),delete t.body.functions.createNode,delete t.nodesListeners.add,delete t.nodesListeners.update,delete t.nodesListeners.remove,delete t.nodesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){if(u.parseOptions(this.options,t),void 0!==t.shape)for(var e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&this.body.nodes[e].updateShape();if(void 0!==t.font)for(var i in this.body.nodes)this.body.nodes.hasOwnProperty(i)&&(this.body.nodes[i].updateLabelModule(),this.body.nodes[i].needsRefresh());if(void 0!==t.size)for(var o in this.body.nodes)this.body.nodes.hasOwnProperty(o)&&this.body.nodes[o].needsRefresh();void 0===t.hidden&&void 0===t.physics||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.data.nodes;if(t instanceof d||t instanceof l)this.body.data.nodes=t;else if(Array.isArray(t))this.body.data.nodes=new d,this.body.data.nodes.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.nodes=new d}if(i&&h.forEach(this.nodesListeners,function(t,e){i.off(e,t)}),this.body.nodes={},this.body.data.nodes){var o=this;h.forEach(this.nodesListeners,function(t,e){o.body.data.nodes.on(e,t)});var n=this.body.data.nodes.getIds();this.add(n,!0)}!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:u)(t,this.body,this.images,this.groups,this.options,this.defaultOptions)}},{key:"refresh",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];h.forEach(this.body.nodes,function(i,o){var n=t.body.data.nodes.get(o);void 0!==n&&(!0===e&&i.setOptions({x:null,y:null}),i.setOptions({fixed:!1}),i.setOptions(n))})}},{key:"getPositions",value:function(t){var e={};if(void 0!==t){if(!0===Array.isArray(t)){for(var i=0;i0)for(var r=0;r0)for(var p=0;p0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.position/.test(t.substr(i.position,3))?i.mono||i.ital||!//.test(t.substr(i.position,3))?!i.mono&&//.test(t.substr(i.position,6))?(i.emitBlock(),i.mono=!0,i.modStack.unshift("mono"),i.position+=5):!i.mono&&"bold"===i.mod()&&/<\/b>/.test(t.substr(i.position,4))?(i.emitBlock(),i.bold=!1,i.modStack.shift(),i.position+=3):!i.mono&&"ital"===i.mod()&&/<\/i>/.test(t.substr(i.position,4))?(i.emitBlock(),i.ital=!1,i.modStack.shift(),i.position+=3):"mono"===i.mod()&&/<\/code>/.test(t.substr(i.position,7))?(i.emitBlock(),i.mono=!1,i.modStack.shift(),i.position+=6):i.add(o):(i.emitBlock(),i.ital=!0,i.modStack.unshift("ital"),i.position+=2):(i.emitBlock(),i.bold=!0,i.modStack.unshift("bold"),i.position+=2):/&/.test(o)?/</.test(t.substr(i.position,4))?(i.add("<"),i.position+=3):/&/.test(t.substr(i.position,5))?(i.add("&"),i.position+=4):i.add("&"):i.add(o),i.position++}return i.emitBlock(),e}},{key:"splitMarkdownBlocks",value:function(t){var e=[],i={bold:!1,ital:!1,mono:!1,beginable:!0,spacing:!1,position:0,buffer:"",modStack:[]};for(i.mod=function(){return 0===this.modStack.length?"normal":this.modStack[0]},i.modName=function(){return 0===this.modStack.length?"normal":"mono"===this.modStack[0]?"mono":i.bold&&i.ital?"boldital":i.bold?"bold":i.ital?"ital":void 0},i.emitBlock=function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.positionthis.parent.fontOptions.maxWdt}},{key:"getLongestFit",value:function(t){for(var e="",i=0;i1&&void 0!==arguments[1]?arguments[1]:"normal",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];t=t.replace(/^( +)/g,"$1\r"),t=t.replace(/([^\r][^ ]*)( +)/g,"$1\r$2\r");for(var o=t.split("\r");o.length>0;){var n=this.getLongestFit(o);if(0===n){var s=o[0],r=this.getLongestFitWord(s);this.lines.newLine(s.slice(0,r),e),o[0]=s.slice(r)}else{var a=n;" "===o[n-1]?n--:" "===o[a]&&a++;var h=o.slice(0,n).join("");n==o.length&&i?this.lines.append(h,e):this.lines.newLine(h,e),o=o.slice(a)}}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(90),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=function(){function t(e){(0,a.default)(this,t),this.measureText=e,this.current=0,this.width=0,this.height=0,this.lines=[]}return(0,d.default)(t,[{key:"_add",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"normal";void 0===this.lines[t]&&(this.lines[t]={width:0,height:0,blocks:[]});var o=e;void 0!==e&&""!==e||(o=" ");var n=this.measureText(o,i),r=(0,s.default)({},n.values);r.text=e,r.width=n.width,r.mod=i,void 0!==e&&""!==e||(r.width=0),this.lines[t].blocks.push(r),this.lines[t].width+=r.width}},{key:"curWidth",value:function(){var t=this.lines[this.current];return void 0===t?0:t.width}},{key:"append",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e)}},{key:"newLine",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e),this.current++}},{key:"determineLineHeights",value:function(){for(var t=0;tt&&(t=o.width),e+=o.height}this.width=t,this.height=e}},{key:"removeEmptyBlocks",value:function(){for(var t=[],e=0;e1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.width=o.width+this.margin.right+this.margin.left,this.height=o.height+this.margin.top+this.margin.bottom,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.roundRect(this.left,this.top,this.width,this.height,s.borderRadius),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n);var s=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(s)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i}}]),e}(m.default);e.default=v},function(t,e,i){i(195),t.exports=i(7).Object.getPrototypeOf},function(t,e,i){var o=i(41),n=i(85);i(87)("getPrototypeOf",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(197),__esModule:!0}},function(t,e,i){i(198),t.exports=i(7).Object.setPrototypeOf},function(t,e,i){var o=i(17);o(o.S,"Object",{setPrototypeOf:i(199).set})},function(t,e,i){var o=i(32),n=i(27),s=function(t,e){if(n(t),!o(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,o){try{o=i(80)(Function.call,i(89).f(Object.prototype,"__proto__").set,2),o(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,i){return s(t,i),e?t.__proto__=i:o(t,i),t}}({},!1):void 0),check:s}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=Math.max(o.width+this.margin.right+this.margin.left,o.height+this.margin.top+this.margin.bottom);this.options.size=n/2,this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),this.updateBoundingBox(e,i),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,i,o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,this.height=o,void(this.radius=.5*this.width)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),t.save(),t.clip(),this._drawImageAtPosition(t,s),t.restore(),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=o.width+this.margin.right+this.margin.left;this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.database(e-this.width/2,i-this.height/2,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"diamond",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"circle",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),this.options.size}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.height=2*o.height,this.width=o.width+o.height,this.radius=.5*this.width}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-.5*this.width,this.top=i-.5*this.height,this.initContextForDraw(t,s),t.ellipse_vis(this.left,this.top,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,e,i,o,n)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=.5*this.width,o=.5*this.height,n=Math.sin(e)*i,s=Math.cos(e)*o;return i*o/Math.sqrt(n*n+s*s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)},this.width=this.iconSize.width+this.margin.right+this.margin.left,this.height=this.iconSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){if(this.resize(t,o,n),this.options.icon.size=this.options.icon.size||50,this.left=e-this.width/2,this.top=i-this.height/2,this._icon(t,e,i,o,n,s),void 0!==this.options.label){this.labelModule.draw(t,this.left+this.iconSize.width/2+this.margin.left,i+this.height/2+5,o)}this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){if(this.boundingBox.top=e-.5*this.options.icon.size,this.boundingBox.left=t-.5*this.options.icon.size,this.boundingBox.right=t+.5*this.options.icon.size,this.boundingBox.bottom=e+.5*this.options.icon.size,void 0!==this.options.label&&this.labelModule.size.width>0){this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+5)}}},{key:"_icon",value:function(t,e,i,o,n,s){var r=Number(this.options.icon.size);void 0!==this.options.icon.code?(t.font=(o?"bold ":"")+r+"px "+this.options.icon.face,t.fillStyle=this.options.icon.color||"black",t.textAlign="center",t.textBaseline="middle",this.enableShadow(t,s),t.fillText(this.options.icon.code,e,i),this.disableShadow(t,s)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,void(this.height=o)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){if(this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,!0===this.options.shapeProperties.useBorderWithImage){var r=this.options.borderWidth,a=this.options.borderWidthSelected||2*this.options.borderWidth,h=(o?a:r)/this.body.view.scale;t.lineWidth=Math.min(this.width,h),t.beginPath(),t.strokeStyle=o?this.options.color.highlight.border:n?this.options.color.hover.border:this.options.color.border,t.fillStyle=o?this.options.color.highlight.background:n?this.options.color.hover.background:this.options.color.background,t.rect(this.left-.5*t.lineWidth,this.top-.5*t.lineWidth,this.width+t.lineWidth,this.height+t.lineWidth),t.fill(),this.performStroke(t,s),t.closePath()}this._drawImageAtPosition(t,s),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.resize(),this._updateBoundingBox(t,e),void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)} -}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"square",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"hexagon",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"star",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.textSize=this.labelModule.getTextSize(t,e,i),this.width=this.textSize.width+this.margin.right+this.margin.left,this.height=this.textSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.enableShadow(t,s),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n),this.disableShadow(t,s),this.updateBoundingBox(e,i,t,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangle",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangleDown",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(74).default,c=function(){function t(e,i,o){var n=this;(0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.body.functions.createEdge=this.create.bind(this),this.edgesListeners={add:function(t,e){n.add(e.items)},update:function(t,e){n.update(e.items)},remove:function(t,e){n.remove(e.items)}},this.options={},this.defaultOptions={arrows:{to:{enabled:!1,scaleFactor:1,type:"arrow"},middle:{enabled:!1,scaleFactor:1,type:"arrow"},from:{enabled:!1,scaleFactor:1,type:"arrow"}},arrowStrikethrough:!0,color:{color:"#848484",highlight:"#848484",hover:"#848484",inherit:"from",opacity:1},dashes:!1,font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:2,strokeColor:"#ffffff",align:"horizontal",multi:!1,vadjust:0,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"courier new",vadjust:2}},hidden:!1,hoverWidth:1.5,label:void 0,labelHighlightBold:!0,length:void 0,physics:!0,scaling:{min:1,max:15,label:{enabled:!0,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},selectionWidth:1.5,selfReferenceSize:20,shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},smooth:{enabled:!0,type:"dynamic",forceDirection:"none",roundness:.5},title:void 0,width:1,value:void 0},h.deepExtend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("_forceDisableDynamicCurves",function(e){var i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];"dynamic"===e&&(e="continuous");var o=!1;for(var n in t.body.edges)if(t.body.edges.hasOwnProperty(n)){var s=t.body.edges[n],r=t.body.data.edges._data[n];if(void 0!==r){var a=r.smooth;void 0!==a&&!0===a.enabled&&"dynamic"===a.type&&(void 0===e?s.setOptions({smooth:!1}):s.setOptions({smooth:{type:e}}),o=!0)}}!0===i&&!0===o&&t.body.emitter.emit("_dataChanged")}),this.body.emitter.on("_dataUpdated",function(){t.reconnectEdges()}),this.body.emitter.on("refreshEdges",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.edgesListeners,function(e,i){t.body.data.edges&&t.body.data.edges.off(i,e)}),delete t.body.functions.createEdge,delete t.edgesListeners.add,delete t.edgesListeners.update,delete t.edgesListeners.remove,delete t.edgesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){u.parseOptions(this.options,t,!0,this.defaultOptions,!0);var e=!1;if(void 0!==t.smooth)for(var i in this.body.edges)this.body.edges.hasOwnProperty(i)&&(e=this.body.edges[i].updateEdgeType()||e);if(void 0!==t.font)for(var o in this.body.edges)this.body.edges.hasOwnProperty(o)&&this.body.edges[o].updateLabelModule();void 0===t.hidden&&void 0===t.physics&&!0!==e||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=this.body.data.edges;if(t instanceof d||t instanceof l)this.body.data.edges=t;else if(Array.isArray(t))this.body.data.edges=new d,this.body.data.edges.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.edges=new d}if(o&&h.forEach(this.edgesListeners,function(t,e){o.off(e,t)}),this.body.edges={},this.body.data.edges){h.forEach(this.edgesListeners,function(t,i){e.body.data.edges.on(i,t)});var n=this.body.data.edges.getIds();this.add(n,!0)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===i&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.edges,o=this.body.data.edges,n=0;n1&&void 0!==arguments[1])||arguments[1];if(0!==t.length){var i=this.body.edges;h.forEach(t,function(t){var e=i[t];void 0!==e&&e.remove()}),e&&this.body.emitter.emit("_dataChanged")}}},{key:"refresh",value:function(){var t=this;h.forEach(this.body.edges,function(e,i){var o=t.body.data.edges._data[i];void 0!==o&&e.setOptions(o)})}},{key:"create",value:function(t){return new u(t,this.body,this.options,this.defaultOptions)}},{key:"reconnectEdges",value:function(){var t,e=this.body.nodes,i=this.body.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var o=i[t];o.from=null,o.to=null,o.connect()}}},{key:"getConnectedNodes",value:function(t){var e=[];if(void 0!==this.body.edges[t]){var i=this.body.edges[t];void 0!==i.fromId&&e.push(i.fromId),void 0!==i.toId&&e.push(i.toId)}return e}},{key:"_updateState",value:function(){this._addMissingEdges(),this._removeInvalidEdges()}},{key:"_removeInvalidEdges",value:function(){var t=this,e=[];h.forEach(this.body.edges,function(i,o){var n=t.body.nodes[i.toId],s=t.body.nodes[i.fromId];void 0!==n&&!0===n.isCluster||void 0!==s&&!0===s.isCluster||void 0!==n&&void 0!==s||e.push(o)}),this.remove(e,!1)}},{key:"_addMissingEdges",value:function(){var t=this.body.edges,e=this.body.data.edges,i=[];e.forEach(function(e,o){void 0===t[o]&&i.push(o)}),this.add(i,!0)}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(3),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(4),p=o(c),f=i(5),m=o(f),v=i(216),g=o(v),y=function(t){function e(t,i,o){return(0,d.default)(this,e),(0,p.default)(this,(e.__proto__||(0,a.default)(e)).call(this,t,i,o))}return(0,m.default)(e,t),(0,u.default)(e,[{key:"_line",value:function(t,e,i){var o=i[0],n=i[1];this._bezierCurve(t,e,o,n)}},{key:"_getViaCoordinates",value:function(){var t=this.from.x-this.to.x,e=this.from.y-this.to.y,i=void 0,o=void 0,n=void 0,s=void 0,r=this.options.smooth.roundness;return(Math.abs(t)>Math.abs(e)||!0===this.options.smooth.forceDirection||"horizontal"===this.options.smooth.forceDirection)&&"vertical"!==this.options.smooth.forceDirection?(o=this.from.y,s=this.to.y,i=this.from.x-r*t,n=this.to.x+r*t):(o=this.from.y-r*e,s=this.to.y+r*e,i=this.from.x,n=this.to.x),[{x:i,y:o},{x:n,y:s}]}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,r){var a=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates(),h=(0,s.default)(a,2),d=h[0],l=h[1];return this._getDistanceToBezierEdge(t,e,i,o,n,r,d,l)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=(0,s.default)(e,2),o=i[0],n=i[1],r=t,a=[];return a[0]=Math.pow(1-r,3),a[1]=3*r*Math.pow(1-r,2),a[2]=3*Math.pow(r,2)*(1-r),a[3]=Math.pow(r,3),{x:a[0]*this.fromPoint.x+a[1]*o.x+a[2]*n.x+a[3]*this.toPoint.x,y:a[0]*this.fromPoint.y+a[1]*o.y+a[2]*n.y+a[3]*this.toPoint.y}}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r,a){var h=1e9,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=t,m=e,v=[0,0,0,0];for(l=1;l<10;l++)u=.1*l,v[0]=Math.pow(1-u,3),v[1]=3*u*Math.pow(1-u,2),v[2]=3*Math.pow(u,2)*(1-u),v[3]=Math.pow(u,3),c=v[0]*t+v[1]*r.x+v[2]*a.x+v[3]*i,p=v[0]*e+v[1]*r.y+v[2]*a.y+v[3]*o,l>0&&(d=this._getDistanceToLine(f,m,c,p,n,s),h=d1&&void 0!==arguments[1]?arguments[1]:this.via,i=t,o=void 0,n=void 0;if(this.from===this.to){var r=this._getCircleData(this.from),a=(0,s.default)(r,3),h=a[0],d=a[1],l=a[2],u=2*Math.PI*(1-i);o=h+l*Math.sin(u),n=d+l-l*(1-Math.cos(u))}else o=Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,n=Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y;return{x:o,y:n}}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e,this.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToBezierEdge(t,e,i,o,n,s,this.via)}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e,i){this._bezierCurve(t,e,i)}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_getViaCoordinates",value:function(){var t=void 0,e=void 0,i=this.options.smooth.roundness,o=this.options.smooth.type,n=Math.abs(this.from.x-this.to.x),s=Math.abs(this.from.y-this.to.y);if("discrete"===o||"diagonalCross"===o){var r=void 0,a=void 0;r=a=n<=s?i*s:i*n,this.from.x>this.to.x&&(r=-r),this.from.y>=this.to.y&&(a=-a),t=this.from.x+r,e=this.from.y+a,"discrete"===o&&(n<=s?t=nthis.to.x&&(_=-_),this.from.y>=this.to.y&&(w=-w),t=this.from.x+_,e=this.from.y+w,n<=s?t=this.from.x<=this.to.x?this.to.xt?this.to.x:t:e=this.from.y>=this.to.y?this.to.y>e?this.to.y:e:this.to.y2&&void 0!==arguments[2]?arguments[2]:{};return this._findBorderPositionBezier(t,e,i.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates();return this._getDistanceToBezierEdge(t,e,i,o,n,s,r)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=t;return{x:Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,y:Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e){t.beginPath(),t.moveTo(this.fromPoint.x,this.fromPoint.y),t.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}},{key:"getViaNode",value:function(){}},{key:"getPoint",value:function(t){return{x:(1-t)*this.fromPoint.x+t*this.toPoint.x,y:(1-t)*this.fromPoint.y+t*this.toPoint.y}}},{key:"_findBorderPosition",value:function(t,e){var i=this.to,o=this.from;t.id===this.from.id&&(i=this.from,o=this.to);var n=Math.atan2(i.y-o.y,i.x-o.x),s=i.x-o.x,r=i.y-o.y,a=Math.sqrt(s*s+r*r),h=t.distanceToBorder(e,n),d=(a-h)/a,l={};return l.x=(1-d)*o.x+d*i.x,l.y=(1-d)*o.y+d*i.y,l}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToLine(t,e,i,o,n,s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(120).default,u=i(221).default,c=i(222).default,p=i(223).default,f=i(224).default,m=i(121).default,v=i(225).default,g=i(226).default,y=i(2),b=i(119).default,_=function(){function t(e){(0,a.default)(this,t),this.body=e,this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}},this.physicsEnabled=!0,this.simulationInterval=1e3/60,this.requiresTimeout=!0,this.previousStates={},this.referenceState={},this.freezeCache={},this.renderTimer=void 0,this.adaptiveTimestep=!1,this.adaptiveTimestepEnabled=!1,this.adaptiveCounter=0,this.adaptiveInterval=3,this.stabilized=!1,this.startedStabilization=!1,this.stabilizationIterations=0,this.ready=!1,this.options={},this.defaultOptions={enabled:!0,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:"barnesHut",stabilization:{enabled:!0,iterations:1e3,updateInterval:50,onlyDynamicEdges:!1,fit:!0},timestep:.5,adaptiveTimestep:!0},y.extend(this.options,this.defaultOptions),this.timestep=.5,this.layoutFailed=!1,this.bindEventListeners()}return(0,d.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("initPhysics",function(){t.initPhysics()}),this.body.emitter.on("_layoutFailed",function(){t.layoutFailed=!0}),this.body.emitter.on("resetPhysics",function(){t.stopSimulation(),t.ready=!1}),this.body.emitter.on("disablePhysics",function(){t.physicsEnabled=!1,t.stopSimulation()}),this.body.emitter.on("restorePhysics",function(){t.setOptions(t.options),!0===t.ready&&t.startSimulation()}),this.body.emitter.on("startSimulation",function(){!0===t.ready&&t.startSimulation()}),this.body.emitter.on("stopSimulation",function(){t.stopSimulation()}),this.body.emitter.on("destroy",function(){t.stopSimulation(!1),t.body.emitter.off()}),this.body.emitter.on("_dataChanged",function(){t.updatePhysicsData()})}},{key:"setOptions",value:function(t){void 0!==t&&(!1===t?(this.options.enabled=!1,this.physicsEnabled=!1,this.stopSimulation()):!0===t?(this.options.enabled=!0,this.physicsEnabled=!0,this.startSimulation()):(this.physicsEnabled=!0,y.selectiveNotDeepExtend(["stabilization"],this.options,t),y.mergeOptions(this.options,t,"stabilization"),void 0===t.enabled&&(this.options.enabled=!0),!1===this.options.enabled&&(this.physicsEnabled=!1,this.stopSimulation()),this.timestep=this.options.timestep)),this.init()}},{key:"init",value:function(){var t;"forceAtlas2Based"===this.options.solver?(t=this.options.forceAtlas2Based,this.nodesSolver=new v(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new g(this.body,this.physicsBody,t)):"repulsion"===this.options.solver?(t=this.options.repulsion,this.nodesSolver=new u(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):"hierarchicalRepulsion"===this.options.solver?(t=this.options.hierarchicalRepulsion,this.nodesSolver=new c(this.body,this.physicsBody,t),this.edgesSolver=new f(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):(t=this.options.barnesHut,this.nodesSolver=new l(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)),this.modelOptions=t}},{key:"initPhysics",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?!0===this.options.stabilization.enabled?this.stabilize():(this.stabilized=!1,this.ready=!0,this.body.emitter.emit("fit",{},this.layoutFailed),this.startSimulation()):(this.ready=!0,this.body.emitter.emit("fit"))}},{key:"startSimulation",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?(this.stabilized=!1,this.adaptiveTimestep=!1,this.body.emitter.emit("_resizeNodes"),void 0===this.viewFunction&&(this.viewFunction=this.simulationStep.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))):this.body.emitter.emit("_redraw")}},{key:"stopSimulation",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.stabilized=!0,!0===t&&this._emitStabilized(),void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.viewFunction=void 0,!0===t&&this.body.emitter.emit("_stopRendering"))}},{key:"simulationStep",value:function(){var t=Date.now();this.physicsTick(),(Date.now()-t<.4*this.simulationInterval||!0===this.runDoubleSpeed)&&!1===this.stabilized&&(this.physicsTick(),this.runDoubleSpeed=!0),!0===this.stabilized&&this.stopSimulation()}},{key:"_emitStabilized",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.stabilizationIterations;(this.stabilizationIterations>1||!0===this.startedStabilization)&&setTimeout(function(){t.body.emitter.emit("stabilized",{iterations:e}),t.startedStabilization=!1,t.stabilizationIterations=0},0)}},{key:"physicsStep",value:function(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve(),this.moveNodes()}},{key:"adjustTimeStep",value:function(){!0===this._evaluateStepQuality()?this.timestep=1.2*this.timestep:this.timestep/1.2.3))return!1;return!0}},{key:"moveNodes",value:function(){for(var t=this.physicsBody.physicsNodeIndices,e=0,i=0,o=0;oo&&(t=t>0?o:-o),t}},{key:"_performStep",value:function(t){var e=this.body.nodes[t],i=this.physicsBody.forces[t],o=this.physicsBody.velocities[t];return this.previousStates[t]={x:e.x,y:e.y,vx:o.x,vy:o.y},!1===e.options.fixed.x?(o.x=this.calculateComponentVelocity(o.x,i.x,e.options.mass),e.x+=o.x*this.timestep):(i.x=0,o.x=0),!1===e.options.fixed.y?(o.y=this.calculateComponentVelocity(o.y,i.y,e.options.mass),e.y+=o.y*this.timestep):(i.y=0,o.y=0),Math.sqrt(Math.pow(o.x,2)+Math.pow(o.y,2))}},{key:"_freezeNodes",value:function(){var t=this.body.nodes;for(var e in t)if(t.hasOwnProperty(e)&&t[e].x&&t[e].y){var i=t[e].options.fixed;this.freezeCache[e]={x:i.x,y:i.y},i.x=!0,i.y=!0}}},{key:"_restoreFrozenNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&void 0!==this.freezeCache[e]&&(t[e].options.fixed.x=this.freezeCache[e].x,t[e].options.fixed.y=this.freezeCache[e].y);this.freezeCache={}}},{key:"stabilize",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.stabilization.iterations;if("number"!=typeof e&&(e=this.options.stabilization.iterations,console.log("The stabilize method needs a numeric amount of iterations. Switching to default: ",e)),0===this.physicsBody.physicsNodeIndices.length)return void(this.ready=!0);this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,!0===this.options.stabilization.onlyDynamicEdges&&this._freezeNodes(),this.stabilizationIterations=0,setTimeout(function(){return t._stabilizationBatch()},0)}},{key:"_startStabilizing",value:function(){return!0!==this.startedStabilization&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0,!0)}},{key:"_stabilizationBatch",value:function(){var t=this,e=function(){return!1===t.stabilized&&t.stabilizationIterations0){var s=n.edges.length+1,r=this.options.centralGravity*s*n.options.mass;o[n.id].x=e*r,o[n.id].y=i*r}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(76).default,f=i(228).default,m=i(74).default,v=i(47).default,g=function(){function t(e){var i=this;(0,d.default)(this,t),this.body=e,this.clusteredNodes={},this.clusteredEdges={},this.options={},this.defaultOptions={},c.extend(this.options,this.defaultOptions),this.body.emitter.on("_resetData",function(){i.clusteredNodes={},i.clusteredEdges={}})}return(0,u.default)(t,[{key:"clusterByHubsize",value:function(t,e){void 0===t?t=this._getHubSize():"object"===(void 0===t?"undefined":(0,a.default)(t))&&(e=this._checkOptions(t),t=this._getHubSize());for(var i=[],o=0;o=t&&i.push(n.id)}for(var s=0;s0&&void 0!==arguments[0]?arguments[0]:{},i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(void 0===e.joinCondition)throw new Error("Cannot call clusterByNodeData without a joinCondition function in the options.");e=this._checkOptions(e);var o={},n={};c.forEach(this.body.nodes,function(i,s){var r=p.cloneOptions(i);!0===e.joinCondition(r)&&(o[s]=i,c.forEach(i.edges,function(e){void 0===t.clusteredEdges[e.id]&&(n[e.id]=e)}))}),this._cluster(o,n,e,i)}},{key:"clusterByEdgeCount",value:function(t,e){var i=this,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];e=this._checkOptions(e);for(var n=[],r={},a=void 0,h=void 0,d=void 0,l=0;l0&&(0,s.default)(m).length>0&&!0===b)if(c=function(){for(var t=0;t1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(1,t,e)}},{key:"clusterBridges",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(2,t,e)}},{key:"clusterByConnection",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No nodeId supplied to clusterByConnection!");if(void 0===this.body.nodes[t])throw new Error("The nodeId given to clusterByConnection does not exist!");var o=this.body.nodes[t];e=this._checkOptions(e,o),void 0===e.clusterNodeProperties.x&&(e.clusterNodeProperties.x=o.x),void 0===e.clusterNodeProperties.y&&(e.clusterNodeProperties.y=o.y),void 0===e.clusterNodeProperties.fixed&&(e.clusterNodeProperties.fixed={},e.clusterNodeProperties.fixed.x=o.options.fixed.x,e.clusterNodeProperties.fixed.y=o.options.fixed.y);var n={},r={},a=o.id,h=p.cloneOptions(o);n[a]=o;for(var d=0;d-1&&(r[g.id]=g)}this._cluster(n,r,e,i)}},{key:"_createClusterEdges",value:function(t,e,i,o){for(var n=void 0,r=void 0,a=void 0,h=void 0,d=void 0,l=void 0,u=(0,s.default)(t),c=[],p=0;p0&&void 0!==arguments[0]?arguments[0]:{};return void 0===t.clusterEdgeProperties&&(t.clusterEdgeProperties={}),void 0===t.clusterNodeProperties&&(t.clusterNodeProperties={}),t}},{key:"_cluster",value:function(t,e,i){var o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],n=[];for(var r in t)t.hasOwnProperty(r)&&void 0!==this.clusteredNodes[r]&&n.push(r);for(var a=0;ao?a.x:o,n=a.yr?a.y:r;return{x:.5*(i+o),y:.5*(n+r)}}},{key:"openCluster",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No clusterNodeId supplied to openCluster.");var o=this.body.nodes[t];if(void 0===o)throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(!0!==o.isCluster||void 0===o.containedNodes||void 0===o.containedEdges)throw new Error("The node:"+t+" is not a valid cluster.");var n=this.findNode(t),s=n.indexOf(t)-1;if(s>=0){var r=n[s];return this.body.nodes[r]._openChildCluster(t),delete this.body.nodes[t],void(!0===i&&this.body.emitter.emit("_dataChanged"))}var a=o.containedNodes,h=o.containedEdges;if(void 0!==e&&void 0!==e.releaseFunction&&"function"==typeof e.releaseFunction){var d={},l={x:o.x,y:o.y};for(var u in a)if(a.hasOwnProperty(u)){var p=this.body.nodes[u];d[u]={x:p.x,y:p.y}}var f=e.releaseFunction(l,d);for(var m in a)if(a.hasOwnProperty(m)){var v=this.body.nodes[m];void 0!==f[m]&&(v.x=void 0===f[m].x?o.x:f[m].x,v.y=void 0===f[m].y?o.y:f[m].y)}}else c.forEach(a,function(t){!1===t.options.fixed.x&&(t.x=o.x),!1===t.options.fixed.y&&(t.y=o.y)});for(var g in a)if(a.hasOwnProperty(g)){var y=this.body.nodes[g];y.vx=o.vx,y.vy=o.vy,y.setOptions({physics:!0}),delete this.clusteredNodes[g]}for(var b=[],_=0;_0&&n<100;){var s=e.pop();if(void 0!==s){var r=this.body.edges[s];if(void 0!==r){n++;var a=r.clusteringEdgeReplacingIds;if(void 0===a)o.push(s);else for(var h=0;ho&&(o=s.edges.length),t+=s.edges.length,e+=Math.pow(s.edges.length,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r),h=Math.floor(t+2*a);return h>o&&(h=o),h}},{key:"_createClusteredEdge",value:function(t,e,i,o,n){var s=p.cloneOptions(i,"edge");c.deepExtend(s,o),s.from=t,s.to=e,s.id="clusterEdge:"+c.randomUUID(),void 0!==n&&c.deepExtend(s,n);var r=this.body.functions.createEdge(s);return r.clusteringEdgeReplacingIds=[i.id],r.connect(),this.body.edges[r.id]=r,r}},{key:"_clusterEdges",value:function(t,e,i,o){if(e instanceof m){var n=e,s={};s[n.id]=n,e=s}if(t instanceof v){var r=t,a={};a[r.id]=r,t=a}if(void 0===i||null===i)throw new Error("_clusterEdges: parameter clusterNode required");void 0===o&&(o=i.clusterEdgeProperties),this._createClusterEdges(t,e,i,o);for(var h in e)if(e.hasOwnProperty(h)&&void 0!==this.body.edges[h]){var d=this.body.edges[h];this._backupEdgeOptions(d),d.setOptions({physics:!1})}for(var l in t)t.hasOwnProperty(l)&&(this.clusteredNodes[l]={clusterId:i.id,node:this.body.nodes[l]},this.body.nodes[l].setOptions({physics:!1}))}},{key:"_getClusterNodeForNode",value:function(t){if(void 0!==t){var e=this.clusteredNodes[t];if(void 0!==e){var i=e.clusterId;if(void 0!==i)return this.body.nodes[i]}}}},{key:"_filter",value:function(t,e){var i=[];return c.forEach(t,function(t){e(t)&&i.push(t)}),i}},{key:"_updateState",value:function(){var t=this,e=void 0,i=[],o=[],n=function(e){c.forEach(t.body.nodes,function(t){!0===t.isCluster&&e(t)})};for(e in this.clusteredNodes)if(this.clusteredNodes.hasOwnProperty(e)){var r=this.body.nodes[e];void 0===r&&i.push(e)}n(function(t){for(var e=0;e0}e.endPointsValid()&&n||o.push(i)}),n(function(e){c.forEach(o,function(i){delete e.containedEdges[i],c.forEach(e.edges,function(n,s){if(n.id===i)return void(e.edges[s]=null);n.clusteringEdgeReplacingIds=t._filter(n.clusteringEdgeReplacingIds,function(t){return-1===o.indexOf(t)})}),e.edges=t._filter(e.edges,function(t){return null!==t})})}),c.forEach(o,function(e){delete t.clusteredEdges[e]}),c.forEach(o,function(e){delete t.body.edges[e]});var h=(0,s.default)(this.body.edges);c.forEach(h,function(e){var i=t.body.edges[e],o=t._isClusteredNode(i.fromId)||t._isClusteredNode(i.toId);if(o!==t._isClusteredEdge(i.id)){if(!o)throw new Error("remove edge from clustering not implemented!");var n=t._getClusterNodeForNode(i.fromId);void 0!==n&&t._clusterEdges(t.body.nodes[i.fromId],i,n);var s=t._getClusterNodeForNode(i.toId);void 0!==s&&t._clusterEdges(t.body.nodes[i.toId],i,s)}});for(var d=!1,l=!0;l;)!function(){var e=[];n(function(t){var i=(0,s.default)(t.containedNodes).length,o=!0===t.options.allowSingleNodeCluster;(o&&i<1||!o&&i<2)&&e.push(t.id)});for(var i=0;i0,d=d||l}();d&&this._updateState()}},{key:"_isClusteredNode",value:function(t){return void 0!==this.clusteredNodes[t]}},{key:"_isClusteredEdge",value:function(t){return void 0!==this.clusteredEdges[t]}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(2),m=i(47).default,v=function(t){function e(t,i,o,n,r,h){(0,a.default)(this,e);var d=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o,n,r,h));return d.isCluster=!0,d.containedNodes={},d.containedEdges={},d}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_openChildCluster",value:function(t){var e=this,i=this.body.nodes[t];if(void 0===this.containedNodes[t])throw new Error("node with id: "+t+" not in current cluster");if(!i.isCluster)throw new Error("node with id: "+t+" is not a cluster");delete this.containedNodes[t],f.forEach(i.edges,function(t){delete e.containedEdges[t.id]}),f.forEach(i.containedNodes,function(t,i){e.containedNodes[i]=t}),i.containedNodes={},f.forEach(i.containedEdges,function(t,i){e.containedEdges[i]=t}),i.containedEdges={},f.forEach(i.edges,function(t){f.forEach(e.edges,function(i){var o=i.clusteringEdgeReplacingIds.indexOf(t.id);-1!==o&&(f.forEach(t.clusteringEdgeReplacingIds,function(t){i.clusteringEdgeReplacingIds.push(t),e.body.edges[t].edgeReplacedById=i.id}),i.clusteringEdgeReplacingIds.splice(o,1))})}),i.edges=[]}}]),e}(m);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){var t;void 0!==window&&(t=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame),window.requestAnimationFrame=void 0===t?function(t){t()}:t}Object.defineProperty(e,"__esModule",{value:!0});var s=i(0),r=o(s),a=i(1),h=o(a),d=i(2),l=function(){function t(e,i){(0,r.default)(this,t),n(),this.body=e,this.canvas=i,this.redrawRequested=!1,this.renderTimer=void 0,this.requiresTimeout=!0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideNodesOnDrag:!1},d.extend(this.options,this.defaultOptions),this._determineBrowserMethod(),this.bindEventListeners()}return(0,h.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("dragStart",function(){t.dragging=!0}),this.body.emitter.on("dragEnd",function(){t.dragging=!1}),this.body.emitter.on("_resizeNodes",function(){t._resizeNodes()}),this.body.emitter.on("_redraw",function(){!1===t.renderingActive&&t._redraw()}),this.body.emitter.on("_blockRedraw",function(){t.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",function(){t.allowRedraw=!0,t.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",this._requestRedraw.bind(this)),this.body.emitter.on("_startRendering",function(){t.renderRequests+=1,t.renderingActive=!0,t._startRendering()}),this.body.emitter.on("_stopRendering",function(){t.renderRequests-=1,t.renderingActive=t.renderRequests>0,t.renderTimer=void 0}),this.body.emitter.on("destroy",function(){t.renderRequests=0,t.allowRedraw=!1,t.renderingActive=!1,!0===t.requiresTimeout?clearTimeout(t.renderTimer):window.cancelAnimationFrame(t.renderTimer),t.body.emitter.off()})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag"];d.selectiveDeepExtend(e,this.options,t)}}},{key:"_requestNextFrame",value:function(t,e){if("undefined"!=typeof window){var i=void 0,o=window;return!0===this.requiresTimeout?i=o.setTimeout(t,e):o.requestAnimationFrame&&(i=o.requestAnimationFrame(t)),i}}},{key:"_startRendering",value:function(){!0===this.renderingActive&&void 0===this.renderTimer&&(this.renderTimer=this._requestNextFrame(this._renderStep.bind(this),this.simulationInterval))}},{key:"_renderStep",value:function(){!0===this.renderingActive&&(this.renderTimer=void 0,!0===this.requiresTimeout&&this._startRendering(),this._redraw(),!1===this.requiresTimeout&&this._startRendering())}},{key:"redraw",value:function(){this.body.emitter.emit("setSize"),this._redraw()}},{key:"_requestRedraw",value:function(){var t=this;!0!==this.redrawRequested&&!1===this.renderingActive&&!0===this.allowRedraw&&(this.redrawRequested=!0,this._requestNextFrame(function(){t._redraw(!1)},0))}},{key:"_redraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!0===this.allowRedraw){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1,0!==this.canvas.frame.canvas.width&&0!==this.canvas.frame.canvas.height||this.canvas.setSize(),this.canvas.setTransform();var e=this.canvas.getContext(),i=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;if(e.clearRect(0,0,i,o),0===this.canvas.frame.clientWidth)return;e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale),e.beginPath(),this.body.emitter.emit("beforeDrawing",e),e.closePath(),!1===t&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&this._drawEdges(e),(!1===this.dragging||!0===this.dragging&&!1===this.options.hideNodesOnDrag)&&this._drawNodes(e,t),e.beginPath(),this.body.emitter.emit("afterDrawing",e),e.closePath(),e.restore(),!0===t&&e.clearRect(0,0,i,o)}}},{key:"_resizeNodes",value:function(){this.canvas.setTransform();var t=this.canvas.getContext();t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale);var e=this.body.nodes,i=void 0;for(var o in e)e.hasOwnProperty(o)&&(i=e[o],i.resize(t),i.updateBoundingBox(t,i.selected));t.restore()}},{key:"_drawNodes",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.nodes,o=this.body.nodeIndices,n=void 0,s=[],r=this.canvas.DOMtoCanvas({x:-20,y:-20}),a=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+20,y:this.canvas.frame.canvas.clientHeight+20}),h={top:r.y,left:r.x,bottom:a.y,right:a.x},d=0;d0&&void 0!==arguments[0]?arguments[0]:this.pixelRatio;!0===this.initialized&&(this.cameraState.previousWidth=this.frame.canvas.width/t,this.cameraState.previousHeight=this.frame.canvas.height/t,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/t,y:.5*this.frame.canvas.height/t}))}},{key:"_setCameraState",value:function(){if(void 0!==this.cameraState.scale&&0!==this.frame.canvas.clientWidth&&0!==this.frame.canvas.clientHeight&&0!==this.pixelRatio&&this.cameraState.previousWidth>0){var t=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,e=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight,i=this.cameraState.scale;1!=t&&1!=e?i=.5*this.cameraState.scale*(t+e):1!=t?i=this.cameraState.scale*t:1!=e&&(i=this.cameraState.scale*e),this.body.view.scale=i;var o=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),n={x:o.x-this.cameraState.position.x,y:o.y-this.cameraState.position.y};this.body.view.translation.x+=n.x*this.body.view.scale,this.body.view.translation.y+=n.y*this.body.view.scale}}},{key:"_prepareValue",value:function(t){if("number"==typeof t)return t+"px";if("string"==typeof t){if(-1!==t.indexOf("%")||-1!==t.indexOf("px"))return t;if(-1===t.indexOf("%"))return t+"px"}throw new Error("Could not use the value supplied for width or height:"+t)}},{key:"_create",value:function(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=900,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}},{key:"_bindHammer",value:function(){var t=this;void 0!==this.hammer&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new h(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:h.DIRECTION_ALL}),d.onTouch(this.hammer,function(e){t.body.eventListeners.onTouch(e)}),this.hammer.on("tap",function(e){t.body.eventListeners.onTap(e)}),this.hammer.on("doubletap",function(e){t.body.eventListeners.onDoubleTap(e)}),this.hammer.on("press",function(e){t.body.eventListeners.onHold(e)}),this.hammer.on("panstart",function(e){t.body.eventListeners.onDragStart(e)}),this.hammer.on("panmove",function(e){t.body.eventListeners.onDrag(e)}),this.hammer.on("panend",function(e){t.body.eventListeners.onDragEnd(e)}),this.hammer.on("pinch",function(e){t.body.eventListeners.onPinch(e)}),this.frame.canvas.addEventListener("mousewheel",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("DOMMouseScroll",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("mousemove",function(e){t.body.eventListeners.onMouseMove(e)}),this.frame.canvas.addEventListener("contextmenu",function(e){t.body.eventListeners.onContext(e)}),this.hammerFrame=new h(this.frame),d.onRelease(this.hammerFrame,function(e){t.body.eventListeners.onRelease(e)})}},{key:"setSize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.width,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.height;t=this._prepareValue(t),e=this._prepareValue(e);var i=!1,o=this.frame.canvas.width,n=this.frame.canvas.height,s=this.pixelRatio;if(this._setPixelRatio(),t!=this.options.width||e!=this.options.height||this.frame.style.width!=t||this.frame.style.height!=e)this._getCameraState(s),this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=t,this.options.height=e,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},i=!0;else{var r=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),a=Math.round(this.frame.canvas.clientHeight*this.pixelRatio) -;this.frame.canvas.width===r&&this.frame.canvas.height===a||this._getCameraState(s),this.frame.canvas.width!==r&&(this.frame.canvas.width=r,i=!0),this.frame.canvas.height!==a&&(this.frame.canvas.height=a,i=!0)}return!0===i&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(o/this.pixelRatio),oldHeight:Math.round(n/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,i}},{key:"getContext",value:function(){return this.frame.canvas.getContext("2d")}},{key:"_determinePixelRatio",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");var e=1;return"undefined"!=typeof window&&(e=window.devicePixelRatio||1),e/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)}},{key:"_setPixelRatio",value:function(){this.pixelRatio=this._determinePixelRatio()}},{key:"setTransform",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}},{key:"_XconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.x)/this.body.view.scale}},{key:"_XconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.x}},{key:"_YconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.y)/this.body.view.scale}},{key:"_YconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.y}},{key:"canvasToDOM",value:function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}}},{key:"DOMtoCanvas",value:function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(76).default,l=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0,this.touchTime=0,this.viewFunction=void 0,this.body.emitter.on("fit",this.fit.bind(this)),this.body.emitter.on("animationFinished",function(){o.body.emitter.emit("_stopRendering")}),this.body.emitter.on("unlockNode",this.releaseNode.bind(this))}return(0,a.default)(t,[{key:"setOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=t}},{key:"fit",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{nodes:[]},e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=void 0;if(void 0!==t.nodes&&0!==t.nodes.length||(t.nodes=this.body.nodeIndices),!0===e){var n=0;for(var s in this.body.nodes)if(this.body.nodes.hasOwnProperty(s)){var r=this.body.nodes[s];!0===r.predefinedPosition&&(n+=1)}if(n>.5*this.body.nodeIndices.length)return void this.fit(t,!1);i=d.getRange(this.body.nodes,t.nodes);o=12.662/(this.body.nodeIndices.length+7.4147)+.0964822;o*=Math.min(this.canvas.frame.canvas.clientWidth/600,this.canvas.frame.canvas.clientHeight/600)}else{this.body.emitter.emit("_resizeNodes"),i=d.getRange(this.body.nodes,t.nodes);var a=1.1*Math.abs(i.maxX-i.minX),h=1.1*Math.abs(i.maxY-i.minY),l=this.canvas.frame.canvas.clientWidth/a,u=this.canvas.frame.canvas.clientHeight/h;o=l<=u?l:u}o>1?o=1:0===o&&(o=1);var c=d.findCenter(i),p={position:c,scale:o,animation:t.animation};this.moveTo(p)}},{key:"focus",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(void 0!==this.body.nodes[t]){var i={x:this.body.nodes[t].x,y:this.body.nodes[t].y};e.position=i,e.lockedOnNode=t,this.moveTo(e)}else console.log("Node: "+t+" cannot be found.")}},{key:"moveTo",value:function(t){if(void 0===t)return void(t={});void 0===t.offset&&(t.offset={x:0,y:0}),void 0===t.offset.x&&(t.offset.x=0),void 0===t.offset.y&&(t.offset.y=0),void 0===t.scale&&(t.scale=this.body.view.scale),void 0===t.position&&(t.position=this.getViewPosition()),void 0===t.animation&&(t.animation={duration:0}),!1===t.animation&&(t.animation={duration:0}),!0===t.animation&&(t.animation={}),void 0===t.animation.duration&&(t.animation.duration=1e3),void 0===t.animation.easingFunction&&(t.animation.easingFunction="easeInOutQuad"),this.animateView(t)}},{key:"animateView",value:function(t){if(void 0!==t){this.animationEasingFunction=t.animation.easingFunction,this.releaseNode(),!0===t.locked&&(this.lockedOnNodeId=t.lockedOnNode,this.lockedOnNodeOffset=t.offset),0!=this.easingTime&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=t.scale,this.body.view.scale=this.targetScale;var e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.position.x,y:e.y-t.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+t.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+t.offset.y},0===t.animation.duration?void 0!=this.lockedOnNodeId?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*t.animation.duration*.001)||1/60,this.animationEasingFunction=t.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}}},{key:"_lockedRedraw",value:function(){var t={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.x,y:e.y-t.y},o=this.body.view.translation,n={x:o.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:o.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=n}},{key:"releaseNode",value:function(){void 0!==this.lockedOnNodeId&&void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}},{key:"_transitionRedraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.easingTime+=this.animationSpeed,this.easingTime=!0===t?1:this.easingTime;var e=h.easingFunctions[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*e,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*e,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*e},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,void 0!=this.lockedOnNodeId&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}},{key:"getScale",value:function(){return this.body.view.scale}},{key:"getViewPosition",value:function(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(233).default,l=i(104).default,u=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.navigationHandler=new d(e,i),this.body.eventListeners.onTap=this.onTap.bind(this),this.body.eventListeners.onTouch=this.onTouch.bind(this),this.body.eventListeners.onDoubleTap=this.onDoubleTap.bind(this),this.body.eventListeners.onHold=this.onHold.bind(this),this.body.eventListeners.onDragStart=this.onDragStart.bind(this),this.body.eventListeners.onDrag=this.onDrag.bind(this),this.body.eventListeners.onDragEnd=this.onDragEnd.bind(this),this.body.eventListeners.onMouseWheel=this.onMouseWheel.bind(this),this.body.eventListeners.onPinch=this.onPinch.bind(this),this.body.eventListeners.onMouseMove=this.onMouseMove.bind(this),this.body.eventListeners.onRelease=this.onRelease.bind(this),this.body.eventListeners.onContext=this.onContext.bind(this),this.touchTime=0,this.drag={},this.pinch={},this.popup=void 0,this.popupObj=void 0,this.popupTimer=void 0,this.body.functions.getPointer=this.getPointer.bind(this),this.options={},this.defaultOptions={dragNodes:!0,dragView:!0,hover:!1,keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02},bindToWindow:!0},navigationButtons:!1,tooltipDelay:300,zoomView:!0},h.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("destroy",function(){clearTimeout(t.popupTimer),delete t.body.functions.getPointer})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag","keyboard","multiselect","selectable","selectConnectedEdges"];h.selectiveNotDeepExtend(e,this.options,t),h.mergeOptions(this.options,t,"keyboard"),t.tooltip&&(h.extend(this.options.tooltip,t.tooltip),t.tooltip.color&&(this.options.tooltip.color=h.parseColor(t.tooltip.color)))}this.navigationHandler.setOptions(this.options)}},{key:"getPointer",value:function(t){return{x:t.x-h.getAbsoluteLeft(this.canvas.frame.canvas),y:t.y-h.getAbsoluteTop(this.canvas.frame.canvas)}}},{key:"onTouch",value:function(t){(new Date).valueOf()-this.touchTime>50&&(this.drag.pointer=this.getPointer(t.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=(new Date).valueOf())}},{key:"onTap",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect&&(t.changedPointers[0].ctrlKey||t.changedPointers[0].metaKey);this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e)}},{key:"onDoubleTap",value:function(t){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("doubleClick",t,e)}},{key:"onHold",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e),this.selectionHandler._generateClickEvent("hold",t,e)}},{key:"onRelease",value:function(t){if((new Date).valueOf()-this.touchTime>10){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("release",t,e),this.touchTime=(new Date).valueOf()}}},{key:"onContext",value:function(t){var e=this.getPointer({x:t.clientX,y:t.clientY});this.selectionHandler._generateClickEvent("oncontext",t,e)}},{key:"checkSelectionChanges",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.selectionHandler.getSelection(),n=!1;n=!0===i?this.selectionHandler.selectAdditionalOnPoint(t):this.selectionHandler.selectOnPoint(t);var s=this.selectionHandler.getSelection(),r=this._determineDifference(o,s),a=this._determineDifference(s,o);r.edges.length>0&&(this.selectionHandler._generateClickEvent("deselectEdge",e,t,o),n=!0),r.nodes.length>0&&(this.selectionHandler._generateClickEvent("deselectNode",e,t,o),n=!0),a.nodes.length>0&&(this.selectionHandler._generateClickEvent("selectNode",e,t),n=!0),a.edges.length>0&&(this.selectionHandler._generateClickEvent("selectEdge",e,t),n=!0),!0===n&&this.selectionHandler._generateClickEvent("select",e,t)}},{key:"_determineDifference",value:function(t,e){var i=function(t,e){for(var i=[],o=0;o10&&(t=10);var o=void 0;void 0!==this.drag&&!0===this.drag.dragging&&(o=this.canvas.DOMtoCanvas(this.drag.pointer));var n=this.body.view.translation,s=t/i,r=(1-s)*e.x+n.x*s,a=(1-s)*e.y+n.y*s;if(this.body.view.scale=t,this.body.view.translation={x:r,y:a},void 0!=o){var h=this.canvas.canvasToDOM(o);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),i0&&(this.popupObj=h[u[u.length-1]],s=!0)}if(void 0===this.popupObj&&!1===s){for(var p=this.body.edgeIndices,f=this.body.edges,m=void 0,v=[],g=0;g0&&(this.popupObj=f[v[v.length-1]],r="edge")}void 0!==this.popupObj?this.popupObj.id!==n&&(void 0===this.popup&&(this.popup=new l(this.canvas.frame)),this.popup.popupTargetType=r,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(t.x+3,t.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):void 0!==this.popup&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}},{key:"_checkHidePopup",value:function(t){var e=this.selectionHandler._pointerToPositionObject(t),i=!1;if("node"===this.popup.popupTargetType){if(void 0!==this.body.nodes[this.popup.popupTargetId]&&!0===(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(e))){var o=this.selectionHandler.getNodeAt(t);i=void 0!==o&&o.id===this.popup.popupTargetId}}else void 0===this.selectionHandler.getNodeAt(t)&&void 0!==this.body.edges[this.popup.popupTargetId]&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(e));!1===i&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(10),d=i(37),l=i(35),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.iconsCreated=!1,this.navigationHammers=[],this.boundFunctions={},this.touchTime=0,this.activated=!1,this.body.emitter.on("activate",function(){o.activated=!0,o.configureKeyboardBindings()}),this.body.emitter.on("deactivate",function(){o.activated=!1,o.configureKeyboardBindings()}),this.body.emitter.on("destroy",function(){void 0!==o.keycharm&&o.keycharm.destroy()}),this.options={}}return(0,a.default)(t,[{key:"setOptions",value:function(t){void 0!==t&&(this.options=t,this.create())}},{key:"create",value:function(){!0===this.options.navigationButtons?!1===this.iconsCreated&&this.loadNavigationElements():!0===this.iconsCreated&&this.cleanNavigation(),this.configureKeyboardBindings()}},{key:"cleanNavigation",value:function(){if(0!=this.navigationHammers.length){for(var t=0;t700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=(new Date).valueOf())}},{key:"_stopMovement",value:function(){for(var t in this.boundFunctions)this.boundFunctions.hasOwnProperty(t)&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}},{key:"_moveUp",value:function(){this.body.view.translation.y+=this.options.keyboard.speed.y}},{key:"_moveDown",value:function(){this.body.view.translation.y-=this.options.keyboard.speed.y}},{key:"_moveLeft",value:function(){this.body.view.translation.x+=this.options.keyboard.speed.x}},{key:"_moveRight",value:function(){this.body.view.translation.x-=this.options.keyboard.speed.x}},{key:"_zoomIn",value:function(){var t=this.body.view.scale,e=this.body.view.scale*(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:null})}},{key:"_zoomOut",value:function(){var t=this.body.view.scale,e=this.body.view.scale/(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:null})}},{key:"configureKeyboardBindings",value:function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),!0===this.options.keyboard.enabled&&(!0===this.options.keyboard.bindToWindow?this.keycharm=l({container:window,preventDefault:!0}):this.keycharm=l({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),!0===this.activated&&(this.keycharm.bind("up",function(){t.bindToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",function(){t.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",function(){t.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",function(){t.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",function(){t.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",function(){t.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",function(){t.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",function(){t.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",function(){t.unbindFromRedraw("_zoomOut")},"keyup")))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(47).default,d=i(74).default,l=i(2),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionObj={nodes:[],edges:[]},this.hoverObj={nodes:{},edges:{}},this.options={},this.defaultOptions={multiselect:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0},l.extend(this.options,this.defaultOptions),this.body.emitter.on("_dataChanged",function(){o.updateSelection()})}return(0,a.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){var e=["multiselect","hoverConnectedEdges","selectable","selectConnectedEdges"];l.selectiveDeepExtend(e,this.options,t)}}},{key:"selectOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);this.unselectAll(),void 0!==i&&(e=this.selectObject(i)),this.body.emitter.emit("_requestRedraw")}return e}},{key:"selectAdditionalOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);void 0!==i&&(e=!0,!0===i.isSelected()?this.deselectObject(i):this.selectObject(i),this.body.emitter.emit("_requestRedraw"))}return e}},{key:"_initBaseEvent",value:function(t,e){var i={};return i.pointer={DOM:{x:e.x,y:e.y},canvas:this.canvas.DOMtoCanvas(e)},i.event=t,i}},{key:"_generateClickEvent",value:function(t,e,i,o){var n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=this._initBaseEvent(e,i);if(!0===n)s.nodes=[],s.edges=[];else{var r=this.getSelection();s.nodes=r.nodes,s.edges=r.edges}void 0!==o&&(s.previousSelection=o),"click"==t&&(s.items=this.getClickedItems(i)),this.body.emitter.emit(t,s)}},{key:"selectObject",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.selectConnectedEdges;return void 0!==t&&(t instanceof h&&!0===e&&this._selectConnectedEdges(t),t.select(),this._addToSelection(t),!0)}},{key:"deselectObject",value:function(t){!0===t.isSelected()&&(t.selected=!1,this._removeFromSelection(t))}},{key:"_getAllNodesOverlappingWith",value:function(t){for(var e=[],i=this.body.nodes,o=0;o1&&void 0!==arguments[1])||arguments[1],i=this._pointerToPositionObject(t),o=this._getAllNodesOverlappingWith(i);return o.length>0?!0===e?this.body.nodes[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_getEdgesOverlappingWith",value:function(t,e){for(var i=this.body.edges,o=0;o1&&void 0!==arguments[1])||arguments[1],i=this.canvas.DOMtoCanvas(t),o=10,n=null,s=this.body.edges,r=0;r1)return!0;return!1}},{key:"_selectConnectedEdges",value:function(t){for(var e=0;e1&&void 0!==arguments[1]?arguments[1]:{},i=void 0,o=void 0 -;if(!t||!t.nodes&&!t.edges)throw"Selection must be an object with nodes and/or edges properties";if((e.unselectAll||void 0===e.unselectAll)&&this.unselectAll(),t.nodes)for(i=0;i1&&void 0!==arguments[1])||arguments[1];if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({nodes:t},{highlightEdges:e})}},{key:"selectEdges",value:function(t){if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({edges:t})}},{key:"updateSelection",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.body.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.body.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},{key:"getClickedItems",value:function(t){for(var e=this.canvas.DOMtoCanvas(t),i=[],o=this.body.nodeIndices,n=this.body.nodes,s=o.length-1;s>=0;s--){var r=n[o[s]],a=r.getItemsOnPoint(e);i.push.apply(i,a)}for(var h=this.body.edgeIndices,d=this.body.edges,l=h.length-1;l>=0;l--){var u=d[h[l]],c=u.getItemsOnPoint(e);i.push.apply(i,c)}return i}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(76).default,v=i(236),g=v.HorizontalStrategy,y=v.VerticalStrategy,b=function(){function t(){(0,u.default)(this,t),this.childrenReference={},this.parentReference={},this.trees={},this.distributionOrdering={},this.levels={},this.distributionIndex={},this.isTree=!1,this.treeIndex=-1}return(0,p.default)(t,[{key:"addRelation",value:function(t,e){void 0===this.childrenReference[t]&&(this.childrenReference[t]=[]),this.childrenReference[t].push(e),void 0===this.parentReference[e]&&(this.parentReference[e]=[]),this.parentReference[e].push(t)}},{key:"checkIfTree",value:function(){for(var t in this.parentReference)if(this.parentReference[t].length>1)return void(this.isTree=!1);this.isTree=!0}},{key:"numTrees",value:function(){return this.treeIndex+1}},{key:"setTreeIndex",value:function(t,e){void 0!==e&&void 0===this.trees[t.id]&&(this.trees[t.id]=e,this.treeIndex=Math.max(e,this.treeIndex))}},{key:"ensureLevel",value:function(t){void 0===this.levels[t]&&(this.levels[t]=0)}},{key:"getMaxLevel",value:function(t){var e=this,i={};return function t(o){if(void 0!==i[o])return i[o];var n=e.levels[o];if(e.childrenReference[o]){var s=e.childrenReference[o];if(s.length>0)for(var r=0;r0&&(i.levelSeparation*=-1):i.levelSeparation<0&&(i.levelSeparation*=-1),this.setDirectionStrategy(),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(e);if(!0===o)return this.body.emitter.emit("refresh"),f.deepExtend(e,this.optionsBackup)}return e}},{key:"adaptAllOptionsForHierarchicalLayout",value:function(t){if(!0===this.options.hierarchical.enabled){var e=this.optionsBackup.physics;void 0===t.physics||!0===t.physics?(t.physics={enabled:void 0===e.enabled||e.enabled,solver:"hierarchicalRepulsion"},e.enabled=void 0===e.enabled||e.enabled,e.solver=e.solver||"barnesHut"):"object"===(0,a.default)(t.physics)?(e.enabled=void 0===t.physics.enabled||t.physics.enabled,e.solver=t.physics.solver||"barnesHut",t.physics.solver="hierarchicalRepulsion"):!1!==t.physics&&(e.solver="barnesHut",t.physics={solver:"hierarchicalRepulsion"});var i=this.direction.curveType();if(void 0===t.edges)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges={smooth:!1};else if(void 0===t.edges.smooth)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges.smooth=!1;else if("boolean"==typeof t.edges.smooth)this.optionsBackup.edges={smooth:t.edges.smooth},t.edges.smooth={enabled:t.edges.smooth,type:i};else{var o=t.edges.smooth;void 0!==o.type&&"dynamic"!==o.type&&(i=o.type),this.optionsBackup.edges={smooth:void 0===o.enabled||o.enabled,type:void 0===o.type?"dynamic":o.type,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection},t.edges.smooth={enabled:void 0===o.enabled||o.enabled,type:i,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection}}this.body.emitter.emit("_forceDisableDynamicCurves",i)}return t}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"positionInitially",value:function(t){if(!0!==this.options.hierarchical.enabled){this.randomSeed=this.initialRandomSeed;for(var e=t.length+50,i=0;i150){for(var s=t.length;t.length>150&&o<=10;){o+=1;var r=t.length;o%3==0?this.body.modules.clustering.clusterBridges(n):this.body.modules.clustering.clusterOutliers(n);if(r==t.length&&o%3!=0)return this._declusterAll(),this.body.emitter.emit("_layoutFailed"),void console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.")}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*s)})}o>10&&console.info("The clustering didn't succeed within the amount of interations allowed, progressing with partial result."),this.body.modules.kamadaKawai.solve(t,this.body.edgeIndices,!0),this._shiftToCenter();for(var a=0;a0){var t=void 0,e=void 0,i=!1,o=!1;this.lastNodeOnLevel={},this.hierarchical=new b;for(e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&(t=this.body.nodes[e],void 0!==t.options.level?(i=!0,this.hierarchical.levels[e]=t.options.level):o=!0);if(!0===o&&!0===i)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");if(!0===o){var n=this.options.hierarchical.sortMethod;"hubsize"===n?this._determineLevelsByHubsize():"directed"===n?this._determineLevelsDirected():"custom"===n&&this._determineLevelsCustomCallback()}for(var s in this.body.nodes)this.body.nodes.hasOwnProperty(s)&&this.hierarchical.ensureLevel(s);var r=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(r),this._condenseHierarchy(),this._shiftToCenter()}}},{key:"_condenseHierarchy",value:function(){var t=this,e=!1,i={},o=function(e,i){var o=t.hierarchical.trees;for(var n in o)o.hasOwnProperty(n)&&o[n]===e&&t.direction.shift(n,i)},n=function(){for(var e=[],i=0;i0)for(var s=0;s1&&void 0!==arguments[1]?arguments[1]:1e9,o=1e9,n=1e9,r=1e9,a=-1e9;for(var h in e)if(e.hasOwnProperty(h)){var d=t.body.nodes[h],l=t.hierarchical.levels[d.id],u=t.direction.getPosition(d),c=t._getSpaceAroundNode(d,e),p=(0,s.default)(c,2),f=p[0],m=p[1];o=Math.min(f,o),n=Math.min(m,n),l<=i&&(r=Math.min(u,r),a=Math.max(u,a))}return[r,a,o,n]},h=function(e,i){var o=t.hierarchical.getMaxLevel(e.id),n=t.hierarchical.getMaxLevel(i.id);return Math.min(o,n)},d=function(e,i,o){for(var n=t.hierarchical,s=0;s1)for(var h=0;h2&&void 0!==arguments[2]&&arguments[2],s=t.direction.getPosition(i),d=t.direction.getPosition(o),l=Math.abs(d-s),u=t.options.hierarchical.nodeSpacing;if(l>u){var c={},p={};r(i,c),r(o,p);var f=h(i,o),m=a(c,f),v=a(p,f),g=m[1],y=v[0],b=v[2];if(Math.abs(g-y)>u){var _=g-y+u;_<-b+u&&(_=-b+u),_<0&&(t._shiftBlock(o.id,_),e=!0,!0===n&&t._centerParent(o))}}},u=function(o,n){for(var h=n.id,d=n.edges,l=t.hierarchical.levels[n.id],u=t.options.hierarchical.levelSeparation*t.options.hierarchical.levelSeparation,c={},p=[],f=0;f0?p=Math.min(c,u-t.options.hierarchical.nodeSpacing):c<0&&(p=-Math.min(-c,l-t.options.hierarchical.nodeSpacing)),0!=p&&(t._shiftBlock(n.id,p),e=!0)}(_),_=b(o,d),function(i){var o=t.direction.getPosition(n),r=t._getSpaceAroundNode(n),a=(0,s.default)(r,2),h=a[0],d=a[1],l=i-o,u=o;l>0?u=Math.min(o+(d-t.options.hierarchical.nodeSpacing),i):l<0&&(u=Math.max(o-(h-t.options.hierarchical.nodeSpacing),i)),u!==o&&(t.direction.setPosition(n,u),e=!0)}(_)};!0===this.options.hierarchical.blockShifting&&(function(i){var o=t.hierarchical.getLevels();o=o.reverse();for(var n=0;n0&&Math.abs(p)0&&(a=this.direction.getPosition(i[n-1])+r),this.direction.setPosition(s,a,e),this._validatePositionAndContinue(s,e,a),o++}}}}},{key:"_placeBranchNodes",value:function(t,e){var i=this.hierarchical.childrenReference[t];if(void 0!==i){for(var o=[],n=0;ne&&void 0===this.positionedNodes[r.id]))return;var h=this.options.hierarchical.nodeSpacing,d=void 0;d=0===s?this.direction.getPosition(this.body.nodes[t]):this.direction.getPosition(o[s-1])+h,this.direction.setPosition(r,d,a),this._validatePositionAndContinue(r,a,d)}var l=this._getCenterPosition(o);this.direction.setPosition(this.body.nodes[t],l,e)}}},{key:"_validatePositionAndContinue",value:function(t,e,i){if(this.hierarchical.isTree){if(void 0!==this.lastNodeOnLevel[e]){var o=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[e]]);if(i-ot.hierarchical.levels[e.id]&&t.hierarchical.addRelation(e.id,i.id)};this._crawlNetwork(e),this.hierarchical.checkIfTree()}},{key:"_crawlNetwork",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){},i=arguments[1],o={},n=function i(n,s){if(void 0===o[n.id]){t.hierarchical.setTreeIndex(n,s),o[n.id]=!0;for(var r=void 0,a=t._getActiveEdges(n),h=0;h2&&void 0!==arguments[2]?arguments[2]:void 0;this.fake_use(t,e,i),this.abstract()}},{key:"getTreeSize",value:function(t){return this.fake_use(t),this.abstract()}},{key:"sort",value:function(t){this.fake_use(t),this.abstract()}},{key:"fix",value:function(t,e){this.fake_use(t,e),this.abstract()}},{key:"shift",value:function(t,e){this.fake_use(t,e),this.abstract()}}]),t}(),m=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"horizontal"}},{key:"getPosition",value:function(t){return t.x}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.x=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_x,max:e.max_x}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.x||void 0===e.x?0:t.x-e.x})}},{key:"fix",value:function(t,e){t.y=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.y=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].x+=e}}]),e}(f),v=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"vertical"}},{key:"getPosition",value:function(t){return t.y}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.y=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_y,max:e.max_y}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.y||void 0===e.y?0:t.y-e.y})}},{key:"fix",value:function(t,e){t.x=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.x=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].y+=e}}]),e}(f);e.HorizontalStrategy=v,e.VerticalStrategy=m},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(19),a=o(r),h=i(6),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(10),v=i(37),g=function(){function t(e,i,o){var n=this;(0,u.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.editMode=!1,this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this.manipulationHammers=[],this.temporaryUIFunctions={},this.temporaryEventFunctions=[],this.touchTime=0,this.temporaryIds={nodes:[],edges:[]},this.guiEnabled=!1,this.inMode=!1,this.selectedControlNode=void 0,this.options={},this.defaultOptions={enabled:!1,initiallyActive:!1,addNode:!0,addEdge:!0,editNode:void 0,editEdge:!0,deleteNode:!0,deleteEdge:!0,controlNodeStyle:{shape:"dot",size:6,color:{background:"#ff0000",border:"#3c3c3c",highlight:{background:"#07f968",border:"#3c3c3c"}},borderWidth:2,borderWidthSelected:2}},f.extend(this.options,this.defaultOptions),this.body.emitter.on("destroy",function(){n._clean()}),this.body.emitter.on("_dataChanged",this._restore.bind(this)),this.body.emitter.on("_resetData",this._restore.bind(this))}return(0,p.default)(t,[{key:"_restore",value:function(){!1!==this.inMode&&(!0===this.options.initiallyActive?this.enableEditMode():this.disableEditMode())}},{key:"setOptions",value:function(t,e,i){void 0!==e&&(void 0!==e.locale?this.options.locale=e.locale:this.options.locale=i.locale,void 0!==e.locales?this.options.locales=e.locales:this.options.locales=i.locales),void 0!==t&&("boolean"==typeof t?this.options.enabled=t:(this.options.enabled=!0,f.deepExtend(this.options,t)),!0===this.options.initiallyActive&&(this.editMode=!0),this._setup())}},{key:"toggleEditMode",value:function(){!0===this.editMode?this.disableEditMode():this.enableEditMode()}},{key:"enableEditMode",value:function(){this.editMode=!0,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="block",this.closeDiv.style.display="block",this.editModeDiv.style.display="none",this.showManipulatorToolbar())}},{key:"disableEditMode",value:function(){this.editMode=!1,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="none",this.closeDiv.style.display="none",this.editModeDiv.style.display="block",this._createEditButton())}},{key:"showManipulatorToolbar",value:function(){if(this._clean(),this.manipulationDOM={},!0===this.guiEnabled){this.editMode=!0,this.manipulationDiv.style.display="block",this.closeDiv.style.display="block";var t=this.selectionHandler._getSelectedNodeCount(),e=this.selectionHandler._getSelectedEdgeCount(),i=t+e,o=this.options.locales[this.options.locale],n=!1;!1!==this.options.addNode&&(this._createAddNodeButton(o),n=!0),!1!==this.options.addEdge&&(!0===n?this._createSeperator(1):n=!0,this._createAddEdgeButton(o)),1===t&&"function"==typeof this.options.editNode?(!0===n?this._createSeperator(2):n=!0,this._createEditNodeButton(o)):1===e&&0===t&&!1!==this.options.editEdge&&(!0===n?this._createSeperator(3):n=!0,this._createEditEdgeButton(o)),0!==i&&(t>0&&!1!==this.options.deleteNode?(!0===n&&this._createSeperator(4),this._createDeleteButton(o)):0===t&&!1!==this.options.deleteEdge&&(!0===n&&this._createSeperator(4),this._createDeleteButton(o))),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this)),this._temporaryBindEvent("select",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit("_redraw")}},{key:"addNodeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addNode",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.addDescription||this.options.locales.en.addDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent("click",this._performAddNode.bind(this))}},{key:"editNode",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean();var e=this.selectionHandler._getSelectedNode();if(void 0!==e){if(this.inMode="editNode","function"!=typeof this.options.editNode)throw new Error("No function has been configured to handle the editing of nodes.");if(!0!==e.isCluster){var i=f.deepExtend({},e.options,!1);if(i.x=e.x,i.y=e.y,2!==this.options.editNode.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editNode(i,function(e){null!==e&&void 0!==e&&"editNode"===t.inMode&&t.body.data.nodes.getDataSet().update(e),t.showManipulatorToolbar()})}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError)}else this.showManipulatorToolbar()}},{key:"addEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addEdge",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.edgeDescription||this.options.locales.en.edgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI("onTouch",this._handleConnect.bind(this)),this._temporaryBindUI("onDragEnd",this._finishConnect.bind(this)),this._temporaryBindUI("onDrag",this._dragControlNode.bind(this)),this._temporaryBindUI("onRelease",this._finishConnect.bind(this)),this._temporaryBindUI("onDragStart",this._dragStartEdge.bind(this)),this._temporaryBindUI("onHold",function(){})}},{key:"editEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="editEdge","object"===(0,d.default)(this.options.editEdge)&&"function"==typeof this.options.editEdge.editWithoutDrag&&(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId)){var t=this.body.edges[this.edgeBeingEditedId];return void this._performEditEdge(t.from,t.to)}if(!0===this.guiEnabled){var e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}if(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId){var i=this.body.edges[this.edgeBeingEditedId],o=this._getNewTargetNode(i.from.x,i.from.y),n=this._getNewTargetNode(i.to.x,i.to.y);this.temporaryIds.nodes.push(o.id),this.temporaryIds.nodes.push(n.id),this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id),this.body.nodes[n.id]=n,this.body.nodeIndices.push(n.id),this._temporaryBindUI("onTouch",this._controlNodeTouch.bind(this)),this._temporaryBindUI("onTap",function(){}),this._temporaryBindUI("onHold",function(){}),this._temporaryBindUI("onDragStart",this._controlNodeDragStart.bind(this)),this._temporaryBindUI("onDrag",this._controlNodeDrag.bind(this)),this._temporaryBindUI("onDragEnd",this._controlNodeDragEnd.bind(this)),this._temporaryBindUI("onMouseMove",function(){}),this._temporaryBindEvent("beforeDrawing",function(t){var e=i.edgeType.findBorderPositions(t);!1===o.selected&&(o.x=e.from.x,o.y=e.from.y),!1===n.selected&&(n.x=e.to.x,n.y=e.to.y)}),this.body.emitter.emit("_redraw")}else this.showManipulatorToolbar()}},{key:"deleteSelected",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="delete";var e=this.selectionHandler.getSelectedNodes(),i=this.selectionHandler.getSelectedEdges(),o=void 0;if(e.length>0){for(var n=0;n0&&"function"==typeof this.options.deleteEdge&&(o=this.options.deleteEdge);if("function"==typeof o){var s={nodes:e,edges:i};if(2!==o.length)throw new Error("The function for delete does not support two arguments (data, callback)");o(s,function(e){null!==e&&void 0!==e&&"delete"===t.inMode?(t.body.data.edges.getDataSet().remove(e.edges),t.body.data.nodes.getDataSet().remove(e.nodes),t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar()):(t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(i),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}},{key:"_setup",value:function(){!0===this.options.enabled?(this.guiEnabled=!0,this._createWrappers(),!1===this.editMode?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}},{key:"_createWrappers",value:function(){void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",!0===this.editMode?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",!0===this.editMode?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="vis-close",this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}},{key:"_getNewTargetNode",value:function(t,e){var i=f.deepExtend({},this.options.controlNodeStyle);i.id="targetNode"+f.randomUUID(),i.hidden=!1,i.physics=!1,i.x=t,i.y=e;var o=this.body.functions.createNode(i);return o.shape.boundingBox={left:t,right:t,top:e,bottom:e},o}},{key:"_createEditButton",value:function(){this._clean(),this.manipulationDOM={},f.recursiveDOMDelete(this.editModeDiv);var t=this.options.locales[this.options.locale],e=this._createButton("editMode","vis-button vis-edit vis-edit-mode",t.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(e),this._bindHammerToDiv(e,this.toggleEditMode.bind(this))}},{key:"_clean",value:function(){this.inMode=!1,!0===this.guiEnabled&&(f.recursiveDOMDelete(this.editModeDiv),f.recursiveDOMDelete(this.manipulationDiv),this._cleanManipulatorHammers()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}},{key:"_cleanManipulatorHammers",value:function(){if(0!=this.manipulationHammers.length){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:1;this.manipulationDOM["seperatorLineDiv"+t]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+t].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+t])}},{key:"_createAddNodeButton",value:function(t){var e=this._createButton("addNode","vis-button vis-add",t.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addNodeMode.bind(this))}},{key:"_createAddEdgeButton",value:function(t){var e=this._createButton("addEdge","vis-button vis-connect",t.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addEdgeMode.bind(this))}},{key:"_createEditNodeButton",value:function(t){var e=this._createButton("editNode","vis-button vis-edit",t.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editNode.bind(this))}},{key:"_createEditEdgeButton",value:function(t){var e=this._createButton("editEdge","vis-button vis-edit",t.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editEdgeMode.bind(this))}},{key:"_createDeleteButton",value:function(t){var e;e=this.options.rtl?"vis-button vis-delete-rtl":"vis-button vis-delete";var i=this._createButton("delete",e,t.del||this.options.locales.en.del);this.manipulationDiv.appendChild(i),this._bindHammerToDiv(i,this.deleteSelected.bind(this))}},{key:"_createBackButton",value:function(t){var e=this._createButton("back","vis-button vis-back",t.back||this.options.locales.en.back);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.showManipulatorToolbar.bind(this))}},{key:"_createButton",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"vis-label";return this.manipulationDOM[t+"Div"]=document.createElement("div"),this.manipulationDOM[t+"Div"].className=e,this.manipulationDOM[t+"Label"]=document.createElement("div"),this.manipulationDOM[t+"Label"].className=o,this.manipulationDOM[t+"Label"].innerHTML=i,this.manipulationDOM[t+"Div"].appendChild(this.manipulationDOM[t+"Label"]),this.manipulationDOM[t+"Div"]}},{key:"_createDescription",value:function(t){this.manipulationDiv.appendChild(this._createButton("description","vis-button vis-none",t))}},{key:"_temporaryBindEvent",value:function(t,e){this.temporaryEventFunctions.push({event:t,boundFunction:e}),this.body.emitter.on(t,e)}},{key:"_temporaryBindUI",value:function(t,e){if(void 0===this.body.eventListeners[t])throw new Error("This UI function does not exist. Typo? You tried: "+t+" possible are: "+(0,a.default)((0,s.default)(this.body.eventListeners)));this.temporaryUIFunctions[t]=this.body.eventListeners[t],this.body.eventListeners[t]=e}},{key:"_unbindTemporaryUIs",value:function(){for(var t in this.temporaryUIFunctions)this.temporaryUIFunctions.hasOwnProperty(t)&&(this.body.eventListeners[t]=this.temporaryUIFunctions[t],delete this.temporaryUIFunctions[t]);this.temporaryUIFunctions={}}},{key:"_unbindTemporaryEvents",value:function(){for(var t=0;t=0;r--)if(n[r]!==this.selectedControlNode.id){s=this.body.nodes[n[r]];break}if(void 0!==s&&void 0!==this.selectedControlNode)if(!0===s.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(s.id,o.to.id):this._performEditEdge(o.from.id,s.id)}else o.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}}},{key:"_handleConnect",value:function(t){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=f.extend({},this.body.view.translation);var e=this.lastTouch,i=this.selectionHandler.getNodeAt(e);if(void 0!==i)if(!0===i.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var o=this._getNewTargetNode(i.x,i.y);this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id);var n=this.body.functions.createEdge({id:"connectionEdge"+f.randomUUID(),from:i.id,to:o.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[n.id]=n,this.body.edgeIndices.push(n.id),this.temporaryIds.nodes.push(o.id),this.temporaryIds.edges.push(n.id)}this.touchTime=(new Date).valueOf()}}},{key:"_dragControlNode",value:function(t){var e=this.body.functions.getPointer(t.center);if(void 0!==this.temporaryIds.nodes[0]){var i=this.body.nodes[this.temporaryIds.nodes[0]];i.x=this.canvas._XconvertDOMtoCanvas(e.x),i.y=this.canvas._YconvertDOMtoCanvas(e.y),this.body.emitter.emit("_redraw")}else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}}},{key:"_finishConnect",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=void 0;void 0!==this.temporaryIds.edges[0]&&(o=this.body.edges[this.temporaryIds.edges[0]].fromId);for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;r--)if(-1===this.temporaryIds.nodes.indexOf(n[r])){s=this.body.nodes[n[r]];break}this._cleanupTemporaryNodesAndEdges(),void 0!==s&&(!0===s.isCluster?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[o]&&void 0!==this.body.nodes[s.id]&&this._performAddEdge(o,s.id)),this.body.emitter.emit("_redraw")}},{key:"_dragStartEdge",value:function(t){var e=this.lastTouch;this.selectionHandler._generateClickEvent("dragStart",t,e,void 0,!0)}},{key:"_performAddNode",value:function(t){var e=this,i={id:f.randomUUID(),x:t.pointer.canvas.x,y:t.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(i,function(t){null!==t&&void 0!==t&&"addNode"===e.inMode&&(e.body.data.nodes.getDataSet().add(t),e.showManipulatorToolbar())})}else this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()}},{key:"_performAddEdge",value:function(t,e){var i=this,o={from:t,to:e};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(o,function(t){null!==t&&void 0!==t&&"addEdge"===i.inMode&&(i.body.data.edges.getDataSet().add(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},{key:"_performEditEdge",value:function(t,e){var i=this,o={id:this.edgeBeingEditedId,from:t,to:e,label:this.body.data.edges._data[this.edgeBeingEditedId].label},n=this.options.editEdge;if("object"===(void 0===n?"undefined":(0,d.default)(n))&&(n=n.editWithoutDrag),"function"==typeof n){if(2!==n.length)throw new Error("The function for edit does not support two arguments (data, callback)");n(o,function(t){null===t||void 0===t||"editEdge"!==i.inMode?(i.body.edges[o.id].updateEdgeType(),i.body.emitter.emit("_redraw"),i.showManipulatorToolbar()):(i.body.data.edges.getDataSet().update(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(239),u=o(l),c=function(){function t(e,i,o){(0,a.default)(this,t),this.body=e,this.springLength=i,this.springConstant=o,this.distanceSolver=new u.default}return(0,d.default)(t,[{key:"setOptions",value:function(t){t&&(t.springLength&&(this.springLength=t.springLength),t.springConstant&&(this.springConstant=t.springConstant))}},{key:"solve",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.distanceSolver.getDistances(this.body,t,e);this._createL_matrix(o),this._createK_matrix(o),this._createE_matrix();for(var n=0,r=Math.max(1e3,Math.min(10*this.body.nodeIndices.length,6e3)),a=1e9,h=0,d=0,l=0,u=0,c=0;a>.01&&n1&&c<5;){c+=1,this._moveNode(h,d,l);var m=this._getEnergy(h),v=(0,s.default)(m,3);u=v[0],d=v[1],l=v[2]}}}},{key:"_getHighestEnergyNode",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=0,n=e[0],r=0,a=0,h=0;h $(DESTDIR)$(bindir)/$(netloc_ib_gather_raw_name).tmp && mv -f $(DESTDIR)$(bindir)/$(netloc_ib_gather_raw_name).tmp $(DESTDIR)$(bindir)/$(netloc_ib_gather_raw_name) - chmod +x $(DESTDIR)$(bindir)/$(netloc_ib_gather_raw_name) - -AM_CPPFLAGS = \ - -I$(top_builddir)/include \ - -I$(top_srcdir)/include - -bin_PROGRAMS = \ - netloc_ib_extract_dats - -netloc_ib_extract_dats_SOURCES = \ - netloc_ib_extract_dats.c - -netloc_ib_extract_dats_LDADD = \ - $(top_builddir)/netloc/libnetloc.la \ - $(top_builddir)/hwloc/libhwloc.la diff --git a/utils/netloc/infiniband/README b/utils/netloc/infiniband/README deleted file mode 100644 index 54f5c21acd..0000000000 --- a/utils/netloc/infiniband/README +++ /dev/null @@ -1,10 +0,0 @@ -Normal way to use this: -* get some hwloc outputs from some nodes (at least enough nodes to make all subnets available) - and store them as .xml in a single directory -* run netloc-ib-gather-raw.pl --hwloc-dir --raw-dir - - If you cannot run the entire script as root, add --sudo to run ib* programs as root. - - If some subnets are not accessible from the local node, they will be skipped. - Add --verbose to see where you could run the same command to discover other subnets. - - If one subnet doesn't work for some reason, use --force-subnet instead of --hwloc-dir. -* make sure netloc_ib_reader and friends are in PATH -* run netloc-ib-extract-dats.pl --raw-dir --out-dir diff --git a/utils/netloc/infiniband/netloc_ib_extract_dats.c b/utils/netloc/infiniband/netloc_ib_extract_dats.c deleted file mode 100644 index 9efeb3b569..0000000000 --- a/utils/netloc/infiniband/netloc_ib_extract_dats.c +++ /dev/null @@ -1,1120 +0,0 @@ -/* - * Copyright © 2016-2018 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE // for asprintf -#include -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include -#include - -#include // for dirname - -#include -#include -#include -#include -#include -#include -#include - -int global_link_idx = 0; - -typedef struct { - UT_hash_handle hh; /* makes this structure hashable */ - char dest[20]; /* key */ - float total_gbits; - UT_array *physical_link_idx; - int *partitions; -} edge_t; - -typedef struct { - UT_hash_handle hh; /* makes this structure hashable */ - char physical_id[20]; /* key */ - long logical_id; - int type; - char *description; - edge_t *edges; - int main_partition; - char *hostname; - int *partitions; - UT_array *physical_links; -} node_t; -node_t *nodes = NULL; - -typedef struct { - int int_id; // TODO long long - int ports[2]; - node_t *dest; - char *width; - char *speed; - float gbits; - char *description; - int *partitions; - int other_id; - edge_t *parent_edge; - node_t *parent_node; -} physical_link_t; -UT_icd physical_link_icd = {sizeof(physical_link_t), NULL, NULL, NULL }; - -UT_icd partitions_icd = {sizeof(char *), NULL, NULL, NULL }; -UT_array *partitions = NULL; - -const int NODE_TYPE_HOST = 0; -const int NODE_TYPE_SWITH = 1; -const int NODE_TYPE_UNKNOWN = 2; - -/* Route tables */ -typedef struct { - UT_hash_handle hh; /* makes this structure hashable */ - char physical_id[20]; /* key */ - int port; -} route_dest_t; -typedef struct { - UT_hash_handle hh; /* makes this structure hashable */ - char physical_id[20]; /* key */ - route_dest_t *dest; -} route_source_t; -route_source_t *routes = NULL; - -/* Paths tables */ -typedef struct { - UT_hash_handle hh; /* makes this structure hashable */ - char physical_id[20]; /* key */ - node_t *node; - UT_array *links; -} path_dest_t; -typedef struct { - UT_hash_handle hh; /* makes this structure hashable */ - char physical_id[20]; /* key */ - node_t *node; - path_dest_t *dest; -} path_source_t; -path_source_t *paths = NULL; - -int read_routes(char *subnet, char *path, char *route_filename); -int read_discover(char *subnet, char *discover_path, char *filename); -int write_into_file(char *subnet, char *path, char *hwlocpath); - -static void get_match(char *line, int nmatch, regmatch_t pmatch[], char *matches[]) -{ - for (int i = 0; i < nmatch; i++) { - regmatch_t current_match = pmatch[i]; - size_t len = current_match.rm_eo-current_match.rm_so; - matches[i] = (char *)malloc((len+1)*sizeof(char)); - strncpy(matches[i], line+current_match.rm_so, len); - matches[i][len] = '\0'; - } -} - -/* We suppose the description of nodes is like that: ([^ ]*).* - * while \1 is the hostname - */ -static char *node_find_hostname(node_t *node) -{ - char *name = node->description; - int max_size = strlen(name); - char *hostname = (char *)malloc(max_size*sizeof(char)); - - /* Looking for the name of the hostname */ - int i = 0; - if (name[0] == '\'') - name++; - while (i < max_size && - ((name[i] >= 'a' && name[i] <= 'z') || - (name[i] >= '0' && name[i] <= '9') || - (name[i] == '-'))) { - hostname[i] = name[i]; - i++; - } - hostname[i++] = '\0'; - char *old_hostname = hostname; - hostname = realloc(hostname, i*sizeof(char)); - if (!hostname) { - fprintf(stderr, "Oups: cannot reallocate memory\n"); - hostname = old_hostname; - } - return hostname; -} - -node_t *get_node(node_t **nodes, char *type, char *lid, - char *guid, char *subnet, char *desc) -{ - node_t *node; - char *id; - - asprintf(&id, "%.4s:%.4s:%.4s:%.4s", - guid, guid+4, guid+8, guid+12); - - // TODO check guid format - HASH_FIND_STR(*nodes, id, node); /* id already in the hash? */ - if (!node) { - size_t size = sizeof(*node)+sizeof(char)*(strlen(desc)+1); - node = (node_t *) malloc(size); - sprintf(node->physical_id, "%s", id); - - node->logical_id = atol(lid); - if (!strcmp(type, "CA")) - node->type = NODE_TYPE_HOST; - else if (!strcmp(type, "SW")) - node->type = NODE_TYPE_SWITH; - else - node->type = NODE_TYPE_UNKNOWN; - node->edges = NULL; - node->description = strdup(desc); - node->hostname = node_find_hostname(node); - node->main_partition = -1; - node->partitions = NULL; - - utarray_new(node->physical_links, &physical_link_icd); - - HASH_ADD_STR(*nodes, physical_id, node); /* guid: name of key field */ - } - free(id); - - return node; -} - -static int find_other_physical_link(physical_link_t *link) -{ - node_t *dest = link->dest; - unsigned int dest_port = link->ports[1]; - - physical_link_t *other_link = (physical_link_t *) - utarray_eltptr(dest->physical_links, dest_port-1); - - return other_link->int_id; -} - -static float compute_gbits(char *speed, char *width) -{ - float rate; - float encoding; - float gb_per_x; - int x; - - if (strcmp(speed, "SDR")) { - rate = 2.5; - encoding = 8.0/10; - } else if (strcmp(speed, "DDR")) { - rate = 5; - encoding = 8.0/10; - } else if (strcmp(speed, "QDR")) { - rate = 10; - encoding = 8.0/10; - } else if (strcmp(speed, "FDR")) { - rate = 14.0625; - encoding = 64.0/66; - } else if (strcmp(speed, "FDR10")) { - rate = 10; - encoding = 64.0/66; - } else if (strcmp(speed, "EDR")) { - rate = 25; - encoding = 64.0/66; - } else { - return 1; - } - gb_per_x = rate*encoding; - - regex_t width_re; - regcomp(&width_re, "([[:digit:]]*)x", REG_EXTENDED); - if (!regexec(&width_re, width, (size_t)0, NULL, 0)) { - x = atoi(width); - } else { - x = 0.0; - } - - regfree(&width_re); - - return x*gb_per_x; -} - -int build_paths(void) -{ - node_t *node_src, *node_dest, *node_tmp1, *node_tmp2; - HASH_ITER(hh, nodes, node_src, node_tmp1) { - if (node_src->type != NODE_TYPE_HOST) - continue; - char *id_src = node_src->physical_id; - - path_source_t *path = (path_source_t *) - malloc(sizeof(path_source_t)); - sprintf(path->physical_id, "%s", id_src); - path->node = node_src; - path->dest = NULL; - HASH_ADD_STR(paths, physical_id, path); - - HASH_ITER(hh, nodes, node_dest, node_tmp2) { - if (node_dest->type != NODE_TYPE_HOST) - continue; - - if (node_dest == node_src) { - continue; - } - - UT_array *found_links = NULL; - utarray_new(found_links, &ut_ptr_icd); - int completed = 1; - - char *id_dest = node_dest->physical_id; - - physical_link_t *link = (physical_link_t *) - utarray_eltptr(node_src->physical_links, 0); - utarray_push_back(found_links, &link); - - node_t *node_cur = link->dest; - while (node_cur != node_dest) { - route_source_t *route_source; - route_dest_t *route_dest; - char *id_cur = node_cur->physical_id; - HASH_FIND_STR(routes, id_cur, route_source); - if (!route_source) { - completed = 0; - break; - } - HASH_FIND_STR(route_source->dest, id_dest, route_dest); - if (!route_dest) { - completed = 0; - break; - } - - unsigned int port = route_dest->port; - link = (physical_link_t *) - utarray_eltptr(node_cur->physical_links, port-1); - utarray_push_back(found_links, &link); - node_cur = link->dest; - } - - if (completed) { - path_dest_t *path_dest = (path_dest_t *) - malloc(sizeof(path_dest_t)); - sprintf(path_dest->physical_id, "%s", id_dest); - path_dest->node = node_dest; - path_dest->links = found_links; - HASH_ADD_STR(path->dest, physical_id, path_dest); - } else { - utarray_free(found_links); - } - } - } - return 0; -} - -/* We suppose the hostname of nodes is like that: ([a-z]*).* - * while \1 is the name of the partition - */ -static char *node_find_partition_name(node_t *node) -{ - char *name; - int max_size; - char *partition; - - max_size = strlen(node->hostname); - partition = (char *)malloc((max_size+1)*sizeof(char)); - name = node->hostname; - - /* Looking for the name of the partition */ - int i = 0; - while (i < max_size && (name[i] >= 'a' && name[i] <= 'z')) { - partition[i] = name[i]; - i++; - } - partition[i++] = '\0'; - - char *old_partition = partition; - partition = realloc(partition, i*sizeof(char)); - if (!partition) { - fprintf(stderr, "Oups: cannot reallocate memory\n"); - partition = old_partition; - } - return partition; -} - - -int netloc_topology_find_partitions(void) -{ - int ret = 0; - int num_nodes; - char **partition_names; - node_t **hosts; - - num_nodes = HASH_COUNT(nodes); - partition_names = (char **)malloc(num_nodes*sizeof(char *)); - hosts = (node_t **)malloc(num_nodes*sizeof(node_t *)); - - /* Save all the partition names */ - int n = 0; - node_t *node, *node_tmp; - HASH_ITER(hh, nodes, node, node_tmp) { - if (node->type != NODE_TYPE_HOST) - continue; - partition_names[n] = node_find_partition_name(node); - hosts[n] = node; - n++; - } - - /* Associate the field partition in the nodes to the correct partition - * index - */ - int num_hosts = n; - int num_partitions = 0; - for (int n1 = 0; n1 < num_hosts; n1++) { - if (!partition_names[n1]) - continue; - partition_names[num_partitions] = partition_names[n1]; - hosts[n1]->main_partition = num_partitions; - - for (int n2 = n1+1; n2 < num_hosts; n2++) { - if (!partition_names[n2]) - continue; - - if (!strcmp(partition_names[n1], partition_names[n2])) { - free(partition_names[n2]); - partition_names[n2] = NULL; - hosts[n2]->main_partition = num_partitions; - } - } - num_partitions++; - } - - printf("%d partitions found\n", num_partitions); - utarray_new(partitions, &partitions_icd); - utarray_reserve(partitions, num_partitions); - for (int p = 0; p < num_partitions; p++) { - printf("\t'%s'\n", partition_names[p]); - utarray_push_back(partitions, partition_names+p); - } - free(partition_names); - free(hosts); - - return ret; -} - -int netloc_topology_set_partitions(void) -{ - /* Find the main partition for each node */ - netloc_topology_find_partitions(); - - node_t *node, *node_tmp; - HASH_ITER(hh, nodes, node, node_tmp) { - node->partitions = (int *) - calloc(utarray_len(partitions), sizeof(int)); - if (node->main_partition != -1) - node->partitions[node->main_partition] = 1; - - edge_t *edge, *edge_tmp; - HASH_ITER(hh, node->edges, edge, edge_tmp) { - edge->partitions = (int *) - calloc(utarray_len(partitions), sizeof(int)); - } - } - - /* Set the partitions for the physical links considering if there is in a - * path between two nodes of a partition */ - path_source_t *path_src, *path_src_tmp; - HASH_ITER(hh, paths, path_src, path_src_tmp) { - node_t *node_src = path_src->node; - int partition = node_src->main_partition; - path_dest_t *path_dest, *path_dest_tmp; - HASH_ITER(hh, path_src->dest, path_dest, path_dest_tmp) { - node_t *node_dest = path_dest->node; - if (node_dest->main_partition != partition) - continue; - - for (unsigned int l = 0; l < utarray_len(path_dest->links); l++) { - physical_link_t *link = *(physical_link_t **) - utarray_eltptr(path_dest->links, l); - if (!link->partitions) { - link->partitions = (int *) - calloc(utarray_len(partitions), sizeof(int)); - } - link->partitions[partition] = 1; - link->parent_node->partitions[partition] = 1; - link->parent_edge->partitions[partition] = 1; - } - } - } - return 0; -} - -void help(char *name, FILE *f) -{ - fprintf(f, "Usage: %s " - "[--hwloc-dir ]\n" - "\thwloc-dir can be an absolute path " - "or a relative path from out-dir\n", name); -} - -int main(int argc, char **argv) -{ - DIR *indir, *outdir; - char *prog_name = basename(argv[0]); - char *inpath = NULL, *outpath = NULL, *hwlocpath = NULL; - - if (argc != 2 && argc != 3 && argc != 5) { - goto error_param; - } - argc--; argv++; - - if (!strcmp(*argv, "--help")) { - help(prog_name, stdout); - return 0; - } - - inpath = *argv; - argc--; argv++; - - if (!argc) - goto error_param; - outpath = *argv; - argc--; argv++; - - while (argc > 0) { - if (!strcmp(*argv, "--hwloc-dir")) { - argc--; argv++; - if (!argc) - goto error_param; - hwlocpath = *argv; - } else if (!strcmp(*argv, "--help")) { - help(prog_name, stdout); - return 0; - } else { - goto error_param; - } - argc--; - argv++; - } - - if (!outpath || !inpath) { - goto error_param; - } - - indir = opendir(inpath); - if (!indir) { - fprintf(stderr, "Couldn't open input directory: \"%s\"\n", inpath); - perror("opendir"); - return 2; - } - - outdir = opendir(outpath); - if (!outdir) { - fprintf(stderr, "Couldn't open output directory: \"%s\"\n", outpath); - perror("opendir"); - closedir(indir); - return 2; - } - - if (hwlocpath) { - char *realpath; - if (hwlocpath[0] != '/') { - asprintf(&realpath, "%s/%s", outpath, hwlocpath); - } else { - realpath = strdup(hwlocpath); - } - - DIR *hwlocdir = opendir(realpath); - if (!hwlocdir) { - fprintf(stderr, "Couldn't open hwloc directory: \"%s\"\n", realpath); - perror("opendir"); - closedir(indir); - closedir(outdir); - free(realpath); - return 2; - } - free(realpath); - closedir(hwlocdir); - } - - regex_t subnet_regexp; - regcomp(&subnet_regexp, "^ib-subnet-([0-9a-fA-F:]{19}).txt$", REG_EXTENDED); - struct dirent *entry; - while ((entry = readdir(indir))) { - nodes = NULL; - int subnet_found; - char *filename = entry->d_name; - - subnet_found = !(regexec(&subnet_regexp, filename, 0, NULL, 0)); - if (subnet_found) { - global_link_idx = 0; - char *discover_filename; - char *route_filename; - char *subnet; - asprintf(&subnet, "%.19s", filename+10); - - discover_filename = filename; - read_discover(subnet, inpath, discover_filename); - - asprintf(&route_filename, "%s/ibroutes-%s", inpath, subnet); - struct stat s; - int err = stat(route_filename, &s); - if (-1 == err) { - if (errno == ENOENT) { - printf("No route directory found for subnet %s\n", subnet); - } else { - perror("stat"); - exit(1); - } - } else { - if (S_ISDIR(s.st_mode)) { - char *route_filename; - asprintf(&route_filename, "ibroutes-%s", subnet); - read_routes(subnet, inpath, route_filename); - free(route_filename); - } else { - printf("No route directory found for subnet %s\n", subnet); - } - } - free(route_filename); - - build_paths(); - netloc_topology_set_partitions(); - - write_into_file(subnet, outpath, hwlocpath); - - /* Free node hash table */ - node_t *node, *node_tmp; - HASH_ITER(hh, nodes, node, node_tmp) { - HASH_DEL(nodes, node); - - /* Free nodes */ - free(node->description); - - /* Edges */ - edge_t *edge, *edge_tmp; - HASH_ITER(hh, node->edges, edge, edge_tmp) { - HASH_DEL(node->edges, edge); - utarray_free(edge->physical_link_idx); - free(edge->partitions); - free(edge); - } - - free(node->hostname); - free(node->partitions); - - /* Physical links */ - for (unsigned int l = 0; l < utarray_len(node->physical_links); l++) { - physical_link_t *link = (physical_link_t *) - utarray_eltptr(node->physical_links, l); - free(link->width); - free(link->speed); - free(link->description); - free(link->partitions); - } - utarray_free(node->physical_links); - - free(node); - } - - /* Free Partitions */ - for (char **ppartition = (char **)utarray_front(partitions); - ppartition != NULL; - ppartition = (char **)utarray_next(partitions, ppartition)) { - free(*ppartition); - } - utarray_free(partitions); - - /* Free Routes */ - route_source_t *route, *route_tmp; - HASH_ITER(hh, routes, route, route_tmp) { - HASH_DEL(routes, route); - - route_dest_t *routed, *routed_tmp; - HASH_ITER(hh, route->dest, routed, routed_tmp) { - HASH_DEL(route->dest, routed); - free(routed); - } - free(route); - } - - /* Free Paths */ - path_source_t *path, *path_tmp; - HASH_ITER(hh, paths, path, path_tmp) { - HASH_DEL(paths, path); - - path_dest_t *pathd, *pathd_tmp; - HASH_ITER(hh, path->dest, pathd, pathd_tmp) { - HASH_DEL(path->dest, pathd); - utarray_free(pathd->links); - free(pathd); - } - free(path); - } - - free(subnet); - } - } - regfree(&subnet_regexp); - closedir(indir); - closedir(outdir); - - return 0; - -error_param: - fprintf(stderr, "Wrong parameters\n"); - help(prog_name, stderr); - return 1; -} - -int read_discover(char *subnet, char *path, char *filename) -{ - char *line = NULL; - size_t size = 0; - char *discover_path; - FILE *discover_file; - - asprintf(&discover_path, "%s/%s", path, filename); - discover_file = fopen(discover_path, "r"); - free(discover_path); - - if (!discover_file) { - perror("fopen"); - exit(-1); - } - - regex_t dr_re; - regcomp(&dr_re, "^DR", REG_EXTENDED); - - regex_t link_re; - regcomp(&link_re, "^" - "(CA|SW)[[:space:]]+" // Source type - "([[:digit:]]+)[[:space:]]+" // Source lid - "([[:digit:]]+)[[:space:]]+" // Source port id - "0x([0-9a-f]{16})[[:space:]]+" // Source guid - "([[:digit:]]+x)[[:space:]]" // Connection width - "([^[:space:]]*)[[:space:]]+" // Connection speed - "-[[:space:]]+" // Dash seperator - "(CA|SW)[[:space:]]+" // Dest type - "([[:digit:]]+)[[:space:]]+" // Dest lid - "([[:digit:]]+)[[:space:]]+" // Dest port id - "0x([0-9a-f]{16})[[:space:]]+" // Dest guid - "\\([[:space:]]*(.*)[[:space:]]*\\)" // Description - , - REG_EXTENDED); - - regex_t nolink_re; - regcomp(&nolink_re, "^" - "(CA|SW)[[:space:]]+" // Source type - "([[:digit:]]+)[[:space:]]+" // Source lid - "([[:digit:]]+)[[:space:]]+" // Source port id - "0x([0-9a-f]{16})[[:space:]]+" // Source guid - , - REG_EXTENDED); - - int read; - errno = 0; /* getline can return -1 even if no error (EOF) */ - while ((read = getline(&line, &size, discover_file)) > 0) { - const int link_nfields = 12; - const int nolink_nfields = 7; - const int max_nfields = 12; - regmatch_t pmatch[max_nfields]; - char *matches[max_nfields]; - char *src_type; - char *src_lid; - char *src_port_id; - char *src_guid; - char *width; - char *speed; - char *dest_type; - char *dest_lid; - char *dest_port_id; - char *dest_guid; - char *link_desc; - char *src_desc = NULL; - char *dest_desc = NULL; - int have_peer; - - if (!regexec(&dr_re, line, (size_t)0, NULL, 0)) { - /* DR line */ - continue; - } - else if (!regexec(&link_re, line, (size_t)link_nfields, pmatch, 0)) { - /* peer associated: port is active */ - have_peer = 1; - get_match(line, link_nfields, pmatch, matches); - src_type = matches[ 1]; - src_lid = matches[ 2]; - src_port_id = matches[ 3]; - src_guid = matches[ 4]; - width = matches[ 5]; - speed = matches[ 6]; - dest_type = matches[ 7]; - dest_lid = matches[ 8]; - dest_port_id = matches[ 9]; - dest_guid = matches[10]; - link_desc = matches[11]; - free(matches[0]); - - /* Analyse description */ - regex_t desc_re; - regcomp(&desc_re, "(.*)" " - " "(.*)", REG_EXTENDED); - if (!regexec(&desc_re, link_desc, (size_t)3, pmatch, 0)) { - get_match(link_desc, 3, pmatch, matches); - src_desc = matches[1]; - dest_desc = matches[2]; - free(matches[0]); - } - else { - src_desc = (char *)calloc(1, sizeof(char)); - dest_desc = (char *)calloc(1, sizeof(char)); - } - regfree(&desc_re); - - } - else if (!regexec(&nolink_re, line, (size_t)nolink_nfields, pmatch, 0)) { - /* no peer associated: port is not active */ - have_peer = 0; - get_match(line, nolink_nfields, pmatch, matches); - src_type = matches[ 1]; - src_lid = matches[ 2]; - src_port_id = matches[ 3]; - src_guid = matches[ 4]; - width = matches[ 5]; - speed = matches[ 6]; - free(matches[0]); - } - else { - printf("Warning: line not recognized: \n\t%s\n", line); - continue; - } - - /* Compute gbits */ - float gbits = compute_gbits(speed, width); - - /* Add the link to the edge list */ - if (have_peer) { - /* Get the source node */ - node_t *src_node = - get_node(&nodes, src_type, src_lid, src_guid, subnet, src_desc); - - node_t *dest_node = - get_node(&nodes, dest_type, dest_lid, dest_guid, subnet, dest_desc); - - edge_t *edge; - HASH_FIND_STR(src_node->edges, dest_node->physical_id, edge); - /* Creation of the edge */ - if (!edge) { - edge = (edge_t *) malloc(sizeof(edge_t)); - strcpy(edge->dest, dest_node->physical_id); - edge->total_gbits = 0; - edge->partitions = NULL; - utarray_new(edge->physical_link_idx, &ut_int_icd); - HASH_ADD_STR(src_node->edges, dest, edge); - } - - /* Creation of the physical link */ - physical_link_t link[1]; - link->int_id = global_link_idx++; - link->ports[0] = atoi(src_port_id); - link->ports[1] = atoi(dest_port_id); - link->width = strdup(width); - link->speed = strdup(speed); - link->dest = dest_node; - link->gbits = gbits; - edge->total_gbits += gbits; - link->description = strdup(link_desc); - link->partitions = NULL; - link->parent_edge = edge; - link->parent_node = src_node; - link->other_id = -1; - - unsigned int port_idx = link->ports[0]-1; - /* NB: there is no function to set a specific index */ - if (port_idx+1 > utarray_len(src_node->physical_links)) { - utarray_insert(src_node->physical_links, link, port_idx); - } else { - physical_link_t *dest_link = (physical_link_t *) - utarray_eltptr(src_node->physical_links, port_idx); - memcpy(dest_link, link, sizeof(physical_link_t)); - } - - utarray_push_back(edge->physical_link_idx, &port_idx); - - free(src_desc); - free(dest_desc); - free(dest_type); - free(dest_lid); - free(dest_port_id); - free(dest_guid); - free(link_desc); - } - - free(src_type); - free(src_lid); - free(src_port_id); - free(src_guid); - free(width); - free(speed); - } - - int failed = 0; - if (read == -1 && errno) { - perror("getline:"); - failed = 1; - } - - free(line); - regfree(&dr_re); - regfree(&link_re); - regfree(&nolink_re); - fclose(discover_file); - - if (failed) - exit(-1); - - - /* Find the link in the other way */ - node_t *node, *node_tmp; - HASH_ITER(hh, nodes, node, node_tmp) { - unsigned int num_links = utarray_len(node->physical_links); - for (unsigned int i = 0; i < num_links; i++) { - physical_link_t *link = (physical_link_t *) - utarray_eltptr(node->physical_links, i); - if (!link->dest) - continue; - link->other_id = find_other_physical_link(link); - } - } - - return 0; -} - -char *partition_list_to_string(int *partition_list) -{ - if (!partition_list) - return strdup(""); - - int first = 1; - int offset = 0; - int num_partitions = utarray_len(partitions); - char tmp[20]; - int max_length = num_partitions*(sprintf(tmp, "%d", num_partitions)+1)+1; - - char *string = (char *)malloc(max_length*sizeof(char)); - string[0] = '\0'; - for (int p = 0; p < num_partitions; p++) { - if (partition_list[p] != 0) { - if (!first) - offset += sprintf(string+offset, ":"); - offset += sprintf(string+offset, "%d", p); - first = 0; - } - } - return string; -} - -int write_into_file(char *subnet, char *path, char *hwlocpath) -{ - char *output_path; - asprintf(&output_path, "%s/IB-%s-nodes.txt", path, subnet); - FILE *output = fopen(output_path, "w"); - - if (!output) { - perror("fopen"); - printf("Wrong output_path: %s\n", output_path); - exit(-1); - } - free(output_path); - - fprintf(output, "%d\n", NETLOCFILE_VERSION); - fprintf(output, "%s\n", subnet); - fprintf(output, "%s\n", hwlocpath? hwlocpath: ""); - - /* Write nodes into file */ - fprintf(output, "%d\n", HASH_COUNT(nodes)); - node_t *node, *node_tmp; - HASH_ITER(hh, nodes, node, node_tmp) { - fprintf(output, "%s,", node->physical_id); - fprintf(output, "%ld,", node->logical_id); - fprintf(output, "%d,", node->type); - char *partition_str = partition_list_to_string(node->partitions); - fprintf(output, "%s,", partition_str); - free(partition_str); - fprintf(output, "%s,", node->description); - fprintf(output, "%s", node->hostname); - fprintf(output, "\n"); - } - - /* Write edges into file */ - HASH_ITER(hh, nodes, node, node_tmp) { - edge_t *edge, *edge_tmp; - fprintf(output, "%s", node->physical_id); - HASH_ITER(hh, node->edges, edge, edge_tmp) { - unsigned int num_links = utarray_len(edge->physical_link_idx); - fprintf(output, ",%s,", edge->dest); - fprintf(output, "%f,", edge->total_gbits); - char *partition_str = partition_list_to_string(edge->partitions); - fprintf(output, "%s,", partition_str); - free(partition_str); - fprintf(output, "%u,", num_links); - for (unsigned int l = 0; l < num_links; l++) { - unsigned int link_idx = *(unsigned int *) - utarray_eltptr(edge->physical_link_idx, l); - physical_link_t *link = (physical_link_t *) - utarray_eltptr(node->physical_links, link_idx); - fprintf(output, "%d,", link->int_id); - fprintf(output, "%d,", link->ports[0]); - fprintf(output, "%d,", link->ports[1]); - fprintf(output, "%s,", link->width); - fprintf(output, "%s,", link->speed); - fprintf(output, "%f,", link->gbits); - fprintf(output, "%s,", link->description); - fprintf(output, "%d,", link->other_id); - char *partition_str = partition_list_to_string(link->partitions); - fprintf(output, "%s", partition_str); - free(partition_str); - fprintf(output, "%s", l == num_links-1 ? "": ","); - } - } - fprintf(output, "\n"); - } - - /* Write partitions into file */ - for (char **ppartition = (char **)utarray_front(partitions); - ppartition != NULL; - ppartition = (char **)utarray_next(partitions, ppartition)) - fprintf(output, "%s%s", *ppartition, - utarray_next(partitions, ppartition)? ",": ""); - fprintf(output, "\n"); - - /* Write paths into file */ - path_source_t *path_src, *path_src_tmp; - HASH_ITER(hh, paths, path_src, path_src_tmp) { - node_t *node_src = path_src->node; - path_dest_t *path_dest, *path_dest_tmp; - HASH_ITER(hh, path_src->dest, path_dest, path_dest_tmp) { - node_t *node_dest = path_dest->node; - fprintf(output, "%s,%s", - node_src->physical_id, node_dest->physical_id); - for (unsigned int l = 0; l < utarray_len(path_dest->links); l++) { - physical_link_t *link = *(physical_link_t **) - utarray_eltptr(path_dest->links, l); - fprintf(output, ",%d", link->int_id); - } - fprintf(output, "\n"); - } - } - - fclose(output); - - return 0; -} - -int read_routes(char *subnet, char *path, char *route_dirname) -{ - char *route_path; - DIR *dir; - - asprintf(&route_path, "%s/%s", path, route_dirname); - dir = opendir(route_path); - - printf("Read subnet: %s\n", subnet); - - if (dir != NULL) { - char *line = NULL; - size_t size = 0; - regex_t route_filename_regexp; - regcomp(&route_filename_regexp, "^ibroute-[0-9a-fA-F:]{19}-([0-9]*).txt$", REG_EXTENDED); - struct dirent *entry; - while ((entry = readdir(dir))) { - char *filename = entry->d_name; - - if (!(regexec(&route_filename_regexp, filename, 0, NULL, 0))) { - char *route_filename; - asprintf(&route_filename, "%s/%s", route_path, filename); - FILE *route_file = fopen(route_filename, "r"); - - if (!route_file) { - perror("fopen"); - exit(-1); - } - - free(route_filename); - - regex_t header_re; - regcomp(&header_re, "^Unicast lids.*" - "guid[[:space:]]+0x([0-9a-f]{16}).*:", REG_EXTENDED); - - regex_t route_re; - regcomp(&route_re, "^" - "0x([0-9a-f]+)[[:space:]]+" // Dest lid - "([[:digit:]]+)[[:space:]]+" // Port id - ":[[:space:]]+[(]" // Separator - "(Channel Adapter|Switch)[[:space:]]+" // Type - "portguid 0x([0-9a-f]{16}):" // Dest guid - , - REG_EXTENDED); - - int read; - - route_source_t *route = NULL; - while ((read = getline(&line, &size, route_file)) > 0) { - regmatch_t pmatch[5]; - char *matches[5]; - int port; - char dest_guid[20]; - - if (!regexec(&header_re, line, (size_t)2, pmatch, 0)) { - char guid[20]; - get_match(line, 2, pmatch, matches); - sprintf(guid, "%.4s:%.4s:%.4s:%.4s", - matches[1], matches[1]+4, matches[1]+8, matches[1]+12); - for (int m = 0; m < 2; m++) { - free(matches[m]); - } - - HASH_FIND_STR(routes, guid, route); - if (!route) { - route = (route_source_t *) malloc(sizeof(route_source_t)); - sprintf(route->physical_id, "%s", guid); - route->dest = NULL; - HASH_ADD_STR(routes, physical_id, route); - } - } - else if (!regexec(&route_re, line, (size_t)5, pmatch, 0)) { - if (!route) { - fprintf(stderr, "Malformed route file %s\n", filename); - exit(-1); - } - route_dest_t *route_dest; - get_match(line, 5, pmatch, matches); - port = atoi(matches[2]); - sprintf(dest_guid, "%.4s:%.4s:%.4s:%.4s", - matches[4], matches[4]+4, matches[4]+8, matches[4]+12); - for (int m = 0; m < 5; m++) { - free(matches[m]); - } - - route_dest = (route_dest_t *) malloc(sizeof(route_dest_t)); - sprintf(route_dest->physical_id, "%s", dest_guid); - route_dest->port = port; - HASH_ADD_STR(route->dest, physical_id, route_dest); - } - } - fclose(route_file); - regfree(&header_re); - regfree(&route_re); - } - } - free(line); - regfree(&route_filename_regexp); - } - - - free(route_path); - closedir(dir); - - return 0; -} - diff --git a/utils/netloc/infiniband/netloc_ib_gather_raw.in b/utils/netloc/infiniband/netloc_ib_gather_raw.in deleted file mode 100644 index e93c6abd87..0000000000 --- a/utils/netloc/infiniband/netloc_ib_gather_raw.in +++ /dev/null @@ -1,477 +0,0 @@ -#!/usr/bin/env perl - -# -# Copyright © 2013-2017 Inria. All rights reserved. -# -# See COPYING in top-level directory. -# -# $HEADER$ -# - -use strict; - -use Getopt::Long; - -my $HWLOC_top_builddir = "@HWLOC_top_builddir@"; -my $prefix = "@prefix@"; -my $exec_prefix = "@exec_prefix@"; -my $bindir = "@bindir@"; -# this will be changed into $bindir/... during make install -my $locallstopo = "$HWLOC_top_builddir/utils/lstopo/lstopo-no-graphics"; - -my $hwlocdir = undef; -my $outdir = undef; -my @forcesubnets; -my $needsudo = 0; -my $ibnetdiscover = "/usr/sbin/ibnetdiscover"; -my $ibroute = "/usr/sbin/ibroute"; -my $verbose = 0; -my $force = 0; -my $dryrun = 0; -my $ignoreerrors = 0; -my $help = 0; -my $sleep = 0; - -my $sleepcount = 0; -sub sleep_between_probes { - my $indent = shift; - if ($sleep) { - print $indent."... Sleeping $sleep seconds between probes ...\n" unless $sleepcount; - sleep $sleep if $sleepcount; - $sleepcount++; - } -} - -&Getopt::Long::Configure("bundling"); -my $ok = Getopt::Long::GetOptions( - "hwloc-dir=s" => \$hwlocdir, - "force-subnet=s" => \@forcesubnets, - "sudo" => \$needsudo, - "ibnetdiscover=s" => \$ibnetdiscover, - "ibroute=s" => \$ibroute, - "sleep=i" => \$sleep, - "ignore-errors" => \$ignoreerrors, - "verbose|v" => \$verbose, - "force|f" => \$force, - "dry-run" => \$dryrun, - "help|h" => \$help - ); - -if ($help or !$ok or !defined $ARGV[0]) { - print "$0 [options] \n"; - print " Dumps topology information to /ib-raw/\n"; - print " Subnets are guessed from the /hwloc/ directory where\n"; - print " the hwloc XML exports of some nodes are stored.\n"; - print "Options:\n"; - print " --sudo\n"; - print " Pass sudo to internal ibnetdiscover and ibroute invocations.\n"; - print " Useful when the entire script cannot run as root.\n"; - print " --hwloc-dir \n"; - print " Use instead of /hwloc/ for hwloc XML exports.\n"; - print " --force-subnet [:]: to force the discovery\n"; - print " Do not guess subnets from hwloc XML exports.\n"; - print " Force discovery on local board port \n"; - print " and optionally force the subnet id \n"; - print " instead of reading it from the first GID.\n"; - print " Examples: --force-subnet mlx4_0:1\n"; - print " --force-subnet fe80:0000:0000:0000:mlx4_0:1\n"; - print " --ibnetdiscover /path/to/ibnetdiscover\n"; - print " --ibroute /path/to/ibroute\n"; - print " Specify exact location of programs. Default is /usr/bin/\n"; - print " --sleep \n"; - print " Sleep for seconds between invocations of programs probing the network\n"; - print " --ignore-errors\n"; - print " Ignore errors from ibnetdiscover and ibroute, assume their outputs are ok\n"; - print " --force -f\n"; - print " Always rediscover to overwrite existing files without asking\n"; - print " --verbose -v\n"; - print " Add verbose messages\n"; - print " --dry-run\n"; - print " Do not actually run programs or modify anything\n"; - print " --help -h\n"; - print " Show this help\n"; - exit(1); -} - -my $outdir = $ARGV[0]; - -mkdir $outdir unless $dryrun; -die "$outdir isn't a directory\n" unless -d $outdir; -mkdir "$outdir/ib-raw" unless $dryrun; -die "$outdir/ib-raw isn't a directory\n" unless -d "$outdir/ib-raw"; - -my $sudo = $needsudo ? "sudo" : ""; - -if (`id -u` ne 0 and !$sudo and !$dryrun) { - print "WARNING: Not running as root.\n"; -} - -# subnets that will be discovered locally -my %subnets_todiscover; - -######################################### -# Read forced subnets -if (@forcesubnets) { - print "Enforcing list of subnets to discover:\n"; - foreach my $subnetstring (@forcesubnets) { - if ($subnetstring =~ /^([0-9a-fA-F:]{19}):([0-9a-z_-]+):([0-9]+)$/) { - my $subnet = $1; - my $boardname = $2; - my $portnum = $3; - print " Subnet $subnet from local board $boardname port $portnum.\n"; - $subnets_todiscover{$subnet}->{localboardname} = $boardname; - $subnets_todiscover{$subnet}->{localportnum} = $portnum; - - } elsif ($subnetstring =~ /^([0-9a-z_-]+):([0-9]+)$/) { - my $boardname = $1; - my $portnum = $2; - my $subnet; - print " Unknown subnet from local board $boardname port $portnum.\n"; - my $filename = "/sys/class/infiniband/$boardname/ports/$portnum/gids/0"; - if (open FILE, $filename) { - my $line = ; - if ($line =~ /^([0-9a-fA-F:]{19}):([0-9a-fA-F:]{19})$/) { - $subnet = $1 - } - close FILE; - } - if (defined $subnet) { - print " Found subnet $subnet from first GID.\n"; - $subnets_todiscover{$subnet}->{localboardname} = $boardname; - $subnets_todiscover{$subnet}->{localportnum} = $portnum; - } else { - print " Couldn't read subnet from GID $filename, ignoring.\n"; - } - - } else { - print " Cannot parse --force-subnet $subnetstring, ignoring.\n"; - } - } - print "\n"; - -} else { - ######################################### - # Guess subnets from hwloc - if (!defined $hwlocdir) { - $hwlocdir = "${outdir}/hwloc"; - print "Using $hwlocdir as hwloc lstopo XML directory.\n\n"; - } - - mkdir $hwlocdir unless $dryrun; - die "$hwlocdir isn't a directory\n" unless -d $hwlocdir; - - # at least get the local hwloc XML - my $hostname = `hostname`; - chomp $hostname; - my $lstopooutput = "$hwlocdir/${hostname}.xml"; - if (!-f $lstopooutput) { - print "Exporting local node hwloc XML...\n"; - print " Running lstopo-no-graphics...\n"; - my $cmd = "$locallstopo -f $lstopooutput"; - if ($dryrun) { - print " NOT running $cmd\n" if $verbose; - } else { - my $ret = system "$cmd" ; - if ($ret and !$ignoreerrors) { - print " Failed (exit code $ret).\n"; - } - } - print "\n"; - } - - # $servers{$hostname}->{gids}->{$boardname}->{$portnum}->{$gidnum}->{subnet} and ->{guid} = xxxx:xxxx:xxxx:xxxx - # $servers{$hostname}->{gids}->{$boardname}->{$portnum}->{invalid} = 1 - # $servers{$hostname}->{subnets}->{$subnet} = 1 - my %servers; - - # $subnets{$subnet}->{$hostname} = 1; - my %subnets; - - opendir DIR, $hwlocdir - or die "Failed to open hwloc directory ($!).\n"; - # list subnets by ports - while (my $hwlocfile = readdir DIR) { - my $hostname; - if ($hwlocfile =~ /(.+).xml$/) { - $hostname = $1; - } else { - next; - } - - open FILE, "$hwlocdir/$hwlocfile" or next; - my $boardname = undef; - my $portnum = undef; - while (my $line = ) { - if ($line =~ //) { - $boardname = $1; - } elsif (defined $boardname) { - if ($line =~ /<\/object>/) { - $boardname = undef; - } elsif ($line =~ //) { - $servers{$hostname}->{gids}->{$boardname}->{$1}->{$2}->{subnet} = $3; - $servers{$hostname}->{gids}->{$boardname}->{$1}->{$2}->{guid} = $4; - } elsif ($line =~ //) { - # lid must be between 0x1 and 0xbfff - if ((hex $2) < 1 or (hex $2) > 49151) { - $servers{$hostname}->{gids}->{$boardname}->{$1}->{invalid} = 1; - } - } elsif ($line =~ //) { - # state must be active = 4 - if ($2 != 4) { - $servers{$hostname}->{gids}->{$boardname}->{$1}->{invalid} = 1; - } - } - } - } - close FILE; - } - closedir DIR; - - # remove down/inactive ports/servers/... - foreach my $hostname (keys %servers) { - foreach my $boardname (keys %{$servers{$hostname}->{gids}}) { - foreach my $portnum (keys %{$servers{$hostname}->{gids}->{$boardname}}) { - delete $servers{$hostname}->{gids}->{$boardname}->{$portnum} - if exists $servers{$hostname}->{gids}->{$boardname}->{$portnum}->{invalid}; - } - delete $servers{$hostname}->{gids}->{$boardname} - unless keys %{$servers{$hostname}->{gids}->{$boardname}}; - } - delete $servers{$hostname} - unless keys %{$servers{$hostname}->{gids}}; - } - - # fill list of hostnames per subnets and subnets per hostnames - foreach my $hostname (keys %servers) { - foreach my $boardname (keys %{$servers{$hostname}->{gids}}) { - foreach my $portnum (keys %{$servers{$hostname}->{gids}->{$boardname}}) { - foreach my $gidid (keys %{$servers{$hostname}->{gids}->{$boardname}->{$portnum}}) { - my $subnet = $servers{$hostname}->{gids}->{$boardname}->{$portnum}->{$gidid}->{subnet}; - $servers{$hostname}->{subnets}->{$subnet} = 1; - $subnets{$subnet}->{$hostname} = 1; - } - } - } - } - - my $nrsubnets = scalar (keys %subnets); - print "Found $nrsubnets subnets in hwloc directory:\n"; - # find local subnets - my $localhostname = `hostname`; chomp $localhostname; - { - my $hostname = $localhostname; - foreach my $boardname (keys %{$servers{$hostname}->{gids}}) { - foreach my $portnum (keys %{$servers{$hostname}->{gids}->{$boardname}}) { - foreach my $gidid (keys %{$servers{$hostname}->{gids}->{$boardname}->{$portnum}}) { - my $subnet = $servers{$hostname}->{gids}->{$boardname}->{$portnum}->{$gidid}->{subnet}; - if (!exists $subnets_todiscover{$subnet}) { - print " Subnet $subnet is locally accessible from board $boardname port $portnum.\n"; - $subnets_todiscover{$subnet}->{localboardname} = $boardname; - $subnets_todiscover{$subnet}->{localportnum} = $portnum; - } elsif ($verbose) { - print " Subnet $subnet is also locally accessible from board $boardname port $portnum.\n"; - } - } - } - } - } - # find non-locally accessible subnets - foreach my $subnet (keys %subnets) { - next if exists $subnets{$subnet}->{$localhostname}; - print " Subnet $subnet is NOT locally accessible.\n"; - my @hostnames = (keys %{$subnets{$subnet}}); - if ($verbose) { - print " Subnet $subnet is accessible from nodes:\n"; - foreach my $hostname (@hostnames) { - print " $hostname\n"; - } - } else { - print " Subnet $subnet is accessible from node ".$hostnames[0]; - print " (and ".(@hostnames-1)." others)" if (@hostnames > 1); - print "\n"; - } - } - print "\n"; - - # list nodes that are connected to all subnets, if the local isn't - if (scalar keys %{$servers{$localhostname}->{subnets}} != $nrsubnets) { - my @fullyconnectedhostnames; - foreach my $hostname (keys %servers) { - if (scalar keys %{$servers{$hostname}->{subnets}} == $nrsubnets) { - push @fullyconnectedhostnames, $hostname; - } - } - if (@fullyconnectedhostnames) { - if ($verbose) { - print "All subnets are accessible from nodes:\n"; - foreach my $hostname (@fullyconnectedhostnames) { - print " $hostname\n"; - } - } else { - print "All subnets are accessible from node ".$fullyconnectedhostnames[0]; - print " (and ".(@fullyconnectedhostnames-1)." others)" if (@fullyconnectedhostnames > 1); - print "\n"; - } - } else { - print "No node is connected to all subnets.\n"; - } - print "\n"; - } -} - -########################### -# Discovery routines - -# ibnetdiscover has GUIDs in the form of 0xXXXXXXXXXXXXXXXX, but hwloc -# has GUIDs in the form of XXXX:XXXX:XXXX:XXXX. So just arbitrarily -# choose hwloc's form and convert everything to that format. -sub normalize_guid { - my ($guid) = @_; - - return "" - if ($guid eq ""); - - $guid =~ m/0x(.{4})(.{4})(.{4})(.{4})/; - return "$1:$2:$3:$4"; -} - -sub getroutes { - my $subnet = shift; - my $boardname = shift; - my $portnum = shift; - my $ibnetdiscoveroutput = shift; - my $ibrouteoutdir = shift; - my $lids; - - if (!open(FILE, $ibnetdiscoveroutput)) { - print " Couldn't open $ibnetdiscoveroutput\n"; - return; - } - - while () { - # We only need lines that begin with SW - next - if (! /^SW /); - - # Split out the columns. Yay regexps. One form of line has - # both source and destination information. The other form - # only has source information (because it's not hooked up to - # anything -- usually a switch port that doesn't have anything - # plugged in to it). - chomp; - my $line = $_; - - my ($have_peer, $src_name, $src_type, $src_lid, $src_port_id, - $src_guid, $width, $speed, $dest_type, $dest_lid, $dest_port_id, - $dest_guid, $dest_name); - - # First, assume that the line has both a port and a peer. - if ($line !~ m/^SW\s+(\d+)\s+(\d+)\s+(0x[0-9a-f]{16})\s+(\d+x)\s([^\s]*)\s+-\s+(CA|SW)\s+(\d+)\s+(\d+)\s+(0x[0-9a-f]{16})\s+\(\s+'(.+?)'\s+-\s+'(.+?)'\s\)/) { - # If we get here, there was no peer -- just a port. - $have_peer = 0; - - if ($line !~ m/^SW\s+(\d+)\s+(\d+)\s+(0x[0-9a-f]{16})\s+(\d+x)\s([^\s]*)\s+'(.+?)'/) { - print "Line cannot be parsed:\n$line\n"; - next; - } - $src_lid = $1; # This is a decimal number - $src_port_id = $2; # This is a decimal number - $src_guid = $3; - $width = $4; - $speed = $5; - $src_name = $6; - } else { - $have_peer = 1; - - $src_lid = $1; # This is a decimal number - $src_port_id = $2; # This is a decimal number - $src_guid = $3; - $width = $4; - $speed = $5; - $dest_type = $6; - $dest_lid = $7; # This is a decimal number - $dest_port_id = $8; # This is a decimal number - $dest_guid = $9; - $src_name = $10; - $dest_name = $11; - } - - # Convert GUIDs to the form xxxx:xxxx:xxxx:xxxx - $src_guid = normalize_guid($src_guid); - $dest_guid = normalize_guid($dest_guid) - if ($have_peer); - - # If the source switch LID already exists, then just keep - # going. - next - if (exists($lids->{$src_lid})); - - # Run ibroute on this switch LID - my $ibrouteoutput = "$ibrouteoutdir/ibroute-$subnet-$src_lid.txt"; - print " Running ibroute for switch '$src_name' LID $src_lid...\n"; - my $cmd = "$sudo $ibroute -C $boardname -P $portnum $src_lid"; - if ($dryrun) { - print " NOT running $cmd\n" if $verbose; - } else { - sleep_between_probes (" "); - my $ret = system "$cmd > ${ibrouteoutput}.new" ; - if (!$ret or $ignoreerrors) { - unlink ${ibrouteoutput}; - rename "${ibrouteoutput}.new", "${ibrouteoutput}"; - } else { - unlink "${ibrouteoutput}.new"; - print " Failed (exit code $ret).\n"; - next; - } - } - - $lids->{$src_lid} = 1; - } - - close FILE; -} - -##############################" -# Discover subnets for real - -foreach my $subnet (keys %subnets_todiscover) { - my $boardname = $subnets_todiscover{$subnet}->{localboardname}; - my $portnum = $subnets_todiscover{$subnet}->{localportnum}; - - print "Looking at $subnet (through local board $boardname port $portnum)...\n"; - - my $ibnetdiscoveroutput = "$outdir/ib-raw/ib-subnet-$subnet.txt"; - my $ibrouteoutdir = "$outdir/ib-raw/ibroutes-$subnet"; - - if (-f $ibnetdiscoveroutput and !$force) { - print " $ibnetdiscoveroutput already exists, discover again? (y/n) "; - my $answer = ; - next if $answer !~ /^y/; - } - - print " Running ibnetdiscover...\n"; - my $cmd = "$sudo $ibnetdiscover -s -l -g -H -S -R -p -C $boardname -P $portnum"; - if ($dryrun) { - print " NOT running $cmd\n" if $verbose; - } else { - sleep_between_probes (" "); - print " $cmd\n" if $verbose; - my $ret = system "$cmd > ${ibnetdiscoveroutput}.new" ; - if (!$ret or $ignoreerrors) { - unlink ${ibnetdiscoveroutput}; - rename "${ibnetdiscoveroutput}.new", "${ibnetdiscoveroutput}"; - } else { - unlink "${ibnetdiscoveroutput}.new"; - print " Failed (exit code $ret).\n"; - next; - } - } - - print " Getting routes...\n"; - if (!$dryrun) { - system("rm -rf $ibrouteoutdir"); - mkdir $ibrouteoutdir unless $dryrun; - die "$ibrouteoutdir isn't a directory\n" unless -d $ibrouteoutdir; - } - getroutes $subnet, $boardname, $portnum, $ibnetdiscoveroutput, $ibrouteoutdir; -} diff --git a/utils/netloc/mpi/Makefile.am b/utils/netloc/mpi/Makefile.am deleted file mode 100644 index 50b49134f8..0000000000 --- a/utils/netloc/mpi/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright © 2016-2018 Inria. All rights reserved. -# -# See COPYING in top-level directory. -# -# $HEADER$ -# - -AM_CPPFLAGS = $(HWLOC_CPPFLAGS) \ - -I$(top_builddir)/include \ - -I$(top_srcdir)/include -AM_LDFLAGS = $(HWLOC_LDFLAGS) - -LDADD = $(top_builddir)/netloc/libnetloc.la \ - $(top_builddir)/hwloc/libhwloc.la - -if BUILD_MPITOOLS -bin_PROGRAMS = \ - netloc_rank_order \ - netloc_mpi_find_hosts - -if BUILD_NETLOCSCOTCH -bin_PROGRAMS += \ - netloc_mpi_rank_file -endif -endif - -netloc_rank_order_SOURCES = netloc_rank_order.c - -netloc_mpi_find_hosts_SOURCES = netloc_mpi_find_hosts.c -netloc_mpi_find_hosts_CPPFLAGS = $(AM_CPPFLAGS) $(MPI_CPPFLAGS) -netloc_mpi_find_hosts_LDADD = $(LDADD) $(MPI_LDADD) - -if BUILD_NETLOCSCOTCH -netloc_mpi_rank_file_SOURCES = netloc_mpi_rank_file.c -netloc_mpi_rank_file_LDADD = $(LDADD) \ - $(top_builddir)/netloc/libnetlocscotch.la \ - -lscotch -lscotcherr -lm -lpthread -endif diff --git a/utils/netloc/mpi/netloc_mpi_find_hosts.c b/utils/netloc/mpi/netloc_mpi_find_hosts.c deleted file mode 100644 index 1c1be02795..0000000000 --- a/utils/netloc/mpi/netloc_mpi_find_hosts.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright © 2017 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include -#include -#include -#include -#include - -typedef struct { - UT_hash_handle hh; /* Makes this structure hashable */ - char *name; /* Hash key */ - UT_array *slots; - UT_array *ranks; -} node_t; - -int main(int argc, char **argv) -{ - int rank; - int num_ranks; - MPI_Status status; - hwloc_topology_t topology; - hwloc_cpuset_t set; - int pu_rank = -1; - char name[1024]; - int resultlen; - int master; /* To be responsible for a node */ - int one = 1; - int zero = 0; - - MPI_Init(&argc,&argv); - - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &num_ranks); - - if (argc != 2) { - if (rank == 0) - fprintf(stderr, "Usage: %s \n", argv[0]); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - hwloc_topology_init(&topology); - hwloc_topology_load(topology); - set = hwloc_bitmap_alloc(); - hwloc_get_cpubind(topology, set, 0); - pu_rank = hwloc_bitmap_first(set); - - MPI_Get_processor_name(name, &resultlen); - resultlen++; - - if (rank == 0) { - FILE *output; - output = fopen(argv[1], "w"); - if (!output) { - perror("fopen"); - MPI_Abort(MPI_COMM_WORLD, 2); - } - - node_t *nodes = NULL; - node_t *node; - - master = 1; - - /* Rank 0 info */ - /* Find node */ - HASH_FIND_PTR(nodes, &name, node); - /* If node does not exist yet, create it */ - if (!node) { - node = (node_t *)malloc(sizeof(node_t)); - node->name = name; - utarray_new(node->slots, &ut_int_icd); - utarray_new(node->ranks, &ut_int_icd); - HASH_ADD_KEYPTR(hh, nodes, node->name, strlen(node->name), node); - } - /* Add the slot to the list of slots */ - utarray_push_back(node->slots, &pu_rank); - utarray_push_back(node->ranks, &rank); - - /* Info about other ranks */ - for (int p = 1; p < num_ranks; p++) { - /* Receive node name size, and slot index */ - char *nodename; - int buffer[2]; - MPI_Recv (buffer, 2, MPI_INT, p, 0, MPI_COMM_WORLD, &status); - int size = buffer[0]; - int slot = buffer[1]; - - /* Receive node name */ - nodename = (char *)malloc(sizeof(char[size])); - MPI_Recv(nodename, size, MPI_CHAR, p, 0, MPI_COMM_WORLD, &status); - - /* Find node */ - HASH_FIND_STR(nodes, nodename, node); - /* If node does not exist yet, create it */ - if (!node) { - node = (node_t *)malloc(sizeof(node_t)); - node->name = nodename; - utarray_new(node->slots, &ut_int_icd); - utarray_new(node->ranks, &ut_int_icd); - HASH_ADD_KEYPTR(hh, nodes, node->name, strlen(node->name), node); - - /* p will be the master for node */ - MPI_Send(&one, 1, MPI_INT, p, 0, MPI_COMM_WORLD); - - } else { - /* p won't be a master */ - MPI_Send(&zero, 1, MPI_INT, p, 0, MPI_COMM_WORLD); - } - /* Add the slot to the list of slots */ - utarray_push_back(node->slots, &slot); - utarray_push_back(node->ranks, &p); - } - - /* Write the list of nodes and slots by node */ - - /* Number of nodes */ - int num_nodes = HASH_COUNT(nodes); - fprintf(output, "%d", num_nodes); - - /* Names of nodes */ - node_t *node_tmp; - HASH_ITER(hh, nodes, node, node_tmp) { - fprintf(output, " %s", node->name); - } - - /* Number of slots by node */ - HASH_ITER(hh, nodes, node, node_tmp) { - int num_slots = utarray_len(node->slots); - fprintf(output, " %d", num_slots); - } - - /* List of slots */ - HASH_ITER(hh, nodes, node, node_tmp) { - int num_slots = utarray_len(node->slots); - int *slots = (int *)node->slots->d; - int *ranks = (int *)node->ranks->d; - for (int s = 0; s < num_slots; s++) { - fprintf(output, " %d", slots[s]); - fprintf(output, " %d", ranks[s]); - } - } - fclose(output); - } else { - int buffer[2]; - buffer[0] = resultlen; - buffer[1] = pu_rank; - /* Send node name size, and slot index */ - MPI_Send(buffer, 2, MPI_INT, 0, 0, MPI_COMM_WORLD); - /* Send node name */ - MPI_Send(name, resultlen, MPI_CHAR, 0, 0, MPI_COMM_WORLD); - - /* Receive if is a master or not */ - MPI_Recv (&master, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); - } - - /* In charge of writing hwloc file */ - if (master) { - /* Get the Netloc topology to find hwloc path */ - char *topopath = getenv("NETLOC_TOPOFILE"); - if (!topopath) { - fprintf(stderr, "Error: you need to set NETLOC_TOPOFILE in your environment.\n"); - } else { - topopath = strdup(topopath); - netloc_topology_t *netloc_topology = netloc_topology_construct(topopath); - if (netloc_topology == NULL) { - fprintf(stderr, "Error: netloc_topology_construct failed\n"); - free(topopath); - return NETLOC_ERROR; - } - - /* Find hwloc dir path */ - char *hwloc_path; - if (netloc_topology->hwlocpath[0] != '/') { - char *path_tmp = strdup(netloc_topology->topopath); - asprintf(&hwloc_path, "%s/%s", dirname(path_tmp), netloc_topology->hwlocpath); - free(path_tmp); - } else { - hwloc_path = strdup(netloc_topology->hwlocpath); - } - - /* Check if already have an hwloc file */ - /* We try to find a diff file */ - char *hwloc_file; - asprintf(&hwloc_file, "%s/%s.diff.xml", hwloc_path, name); - FILE *fxml; - if ((fxml = fopen(hwloc_file, "r"))) { - fclose(fxml); - free(hwloc_file); - hwloc_file = NULL; - } else { - free(hwloc_file); - /* We try to find a regular file */ - asprintf(&hwloc_file, "%s/%s.xml", hwloc_path, name); - if ((fxml = fopen(hwloc_file, "r"))) { - fclose(fxml); - free(hwloc_file); - hwloc_file = NULL; - } - } - - /* if there is no hwloc file, let's write one */ - if (hwloc_file) { - if (hwloc_topology_export_xml(topology, hwloc_file, 0) == -1) { - fprintf(stderr, "Error: netloc_topology_construct failed\n"); - free(topopath); - return NETLOC_ERROR; - } - free(hwloc_path); - free(hwloc_file); - } - } - } - - MPI_Finalize(); -} diff --git a/utils/netloc/mpi/netloc_mpi_rank_file.c b/utils/netloc/mpi/netloc_mpi_rank_file.c deleted file mode 100644 index 6413cc9e43..0000000000 --- a/utils/netloc/mpi/netloc_mpi_rank_file.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright © 2016 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ - -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - int ret; - netlocscotch_core_t *cores; - int num_processes; - - char *comm_filename; - char *rank_filename; - - assert(argc == 3); - - comm_filename = argv[1]; - rank_filename = argv[2]; - - ret = netlocscotch_get_mapping_from_comm_file(comm_filename, &num_processes, &cores); - - if (ret != NETLOC_SUCCESS) { - fprintf(stderr, "Error: netlocscotch_get_mapping_from_comm_file failed\n"); - return NETLOC_ERROR; - } - - FILE *rank_file = fopen(rank_filename, "w"); - if (!rank_file) { - perror("fopen"); - ret = NETLOC_ERROR; - - } else { - for (int p = 0; p < num_processes; p++) { - fprintf(rank_file, "rank %d=%s slot=%d\n", - p, cores[p].nodename, cores[p].core); - } - fclose(rank_file); - } - - for (int p = 0; p < num_processes; p++) { - free(cores[p].nodename); - } - free(cores); - - return ret; -} - diff --git a/utils/netloc/mpi/netloc_rank_order.c b/utils/netloc/mpi/netloc_rank_order.c deleted file mode 100644 index 70907fe684..0000000000 --- a/utils/netloc/mpi/netloc_rank_order.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright © 2016 Inria. All rights reserved. - * - * $COPYRIGHT$ - * - * Additional copyrights may follow - * See COPYING in top-level directory. - * - * $HEADER$ - */ - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include -#include - -#include -#include - -static int compareint(void const *a, void const *b) -{ - const int *int_a = (const int *)a; - const int *int_b = (const int *)b; - return *int_a-*int_b; -} - - -int main(int argc, char **argv) -{ - int ret; - /* First we need to get the topology of the whole machine */ - netloc_arch_t arch; - ret = netloc_arch_build(&arch, 0); - if( NETLOC_SUCCESS != ret ) { - return ret; - } - - /* Set the current nodes and slots in the arch */ - ret = netloc_arch_set_current_resources(&arch); - if( NETLOC_SUCCESS != ret ) { - return ret; - } - int num_nodes = arch.num_current_hosts; - - /* Order the idx_list to have the nodes sorted */ - qsort(arch.current_hosts, num_nodes, sizeof(*arch.current_hosts), compareint); - - /* Show the list */ - for (int n = 0; n < num_nodes; n++) { - netloc_arch_node_t *arch_node = arch.node_slot_by_idx[arch.current_hosts[n]].node; - qsort(arch_node->current_slots, arch_node->num_current_slots, - sizeof(*arch_node->current_slots), compareint); - - for (int s = 0; s < arch_node->num_current_slots; s++) { - int slot_idx = arch_node->current_slots[s]; - int slot = arch_node->slot_os_idx[slot_idx]; - printf("%s %d", arch_node->name, slot); - } - } - - return NETLOC_SUCCESS; -} diff --git a/utils/netloc/scotch/Makefile.am b/utils/netloc/scotch/Makefile.am deleted file mode 100644 index 6a863adfae..0000000000 --- a/utils/netloc/scotch/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright © 2016-2018 Inria. All rights reserved. -# -# See COPYING in top-level directory. -# -# $HEADER$ -# - -AM_CPPFLAGS = $(HWLOC_CPPFLAGS) \ - -I$(top_builddir)/include \ - -I$(top_srcdir)/include -AM_LDFLAGS = $(HWLOC_LDFLAGS) - -LDADD = $(top_builddir)/netloc/libnetloc.la \ - $(top_builddir)/netloc/libnetlocscotch.la \ - $(top_builddir)/hwloc/libhwloc.la \ - -lscotch -lscotcherr -lm -lpthread - -if BUILD_NETLOCSCOTCH -bin_PROGRAMS = \ - netlocscotch_get_arch -endif - -netlocscotch_get_arch_SOURCES = \ - netlocscotch_get_arch.c diff --git a/utils/netloc/scotch/netlocscotch_get_arch.c b/utils/netloc/scotch/netlocscotch_get_arch.c deleted file mode 100644 index 4c80a0789b..0000000000 --- a/utils/netloc/scotch/netlocscotch_get_arch.c +++ /dev/null @@ -1,62 +0,0 @@ -#include // for scotch -#include -#include -#include -#include - -void help(char *name, FILE *f) -{ - fprintf(f, "Usage: %s [subarchfile]\n" - "\t%s --help\n", name, name); -} - -int main(int argc, char **argv) -{ - int ret; - SCOTCH_Arch arch; - SCOTCH_Arch subarch; - - char *arch_filename = NULL; - char *subarch_filename = NULL; - - if (argc == 1 || argc > 3) { - help(argv[0], stdout); - return 1; - } - - if (argc == 2) { - if (!strcmp(*argv, "--help")) { - help(argv[0], stdout); - return 0; - } else { - arch_filename = argv[1]; - } - } else if (argc == 3) { - arch_filename = argv[1]; - subarch_filename = argv[2]; - } - - ret = netlocscotch_build_global_arch(&arch); - if( NETLOC_SUCCESS != ret ) { - return ret; - } - FILE *arch_file = fopen(arch_filename, "w"); - SCOTCH_archSave(&arch, arch_file); - fclose(arch_file); - - if (subarch_filename) { - ret = netlocscotch_build_current_arch(&arch, &subarch); - if( NETLOC_SUCCESS != ret ) { - return ret; - } - FILE *subarch_file = fopen(subarch_filename, "w"); - SCOTCH_archSave(&subarch, subarch_file); - fclose(subarch_file); - SCOTCH_archExit(&subarch); - } - - SCOTCH_archExit(&arch); - - return 0; -} -