From dc7bb37252ececdb78a8ec4516a216bbf796ec5a Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Tue, 8 Mar 2022 12:00:42 -0800 Subject: [PATCH] install: removed tcl based gui, updated configure.ac, Makefile.am, and tasks.py to account for removal --- Makefile.am | 8 +- configure.ac | 24 +- gui/.gitignore | 2 - gui/Makefile.am | 41 - gui/addons/ipsecservice.tcl | 329 -- gui/annotations.tcl | 837 --- gui/api.tcl | 3296 ------------ gui/canvas.tcl | 406 -- gui/cfgparse.tcl | 1147 ----- gui/configs/sample1-bg.gif | Bin 319126 -> 0 bytes gui/configs/sample1.imn | 462 -- gui/configs/sample1.scen | 28 - gui/configs/sample10-kitchen-sink.imn | 848 ---- gui/configs/sample11-sdn.imn | 291 -- gui/configs/sample2-ssh.imn | 248 - gui/configs/sample3-bgp.imn | 657 --- gui/configs/sample4-bg.jpg | Bin 201030 -> 0 bytes gui/configs/sample4-nrlsmf.imn | 546 -- gui/configs/sample4.scen | 2791 ---------- gui/configs/sample5-mgen.imn | 127 - gui/configs/sample6-emane-rfpipe.imn | 271 - gui/configs/sample7-emane-ieee80211abg.imn | 274 - gui/configs/sample8-ipsec-service.imn | 920 ---- gui/configs/sample9-vpn.imn | 1015 ---- gui/core-gui-legacy.in | 177 - gui/core.tcl | 196 - gui/debug.tcl | 46 - gui/editor.tcl | 5348 -------------------- gui/exceptions.tcl | 214 - gui/exec.tcl | 862 ---- gui/filemgmt.tcl | 623 --- gui/gpgui.tcl | 519 -- gui/graph_partitioning.tcl | 1646 ------ gui/help.tcl | 117 - gui/icons/Makefile.am | 29 - gui/icons/core-gui.desktop | 12 - gui/icons/core-gui.xpm | 294 -- gui/icons/normal/OVS.gif | Bin 744 -> 0 bytes gui/icons/normal/antenna.gif | Bin 230 -> 0 bytes gui/icons/normal/ap.gif | Bin 419 -> 0 bytes gui/icons/normal/core-icon.png | Bin 2931 -> 0 bytes gui/icons/normal/core-icon.xbm | 14 - gui/icons/normal/core-logo-275x75.gif | Bin 6118 -> 0 bytes gui/icons/normal/document-properties.gif | Bin 1162 -> 0 bytes gui/icons/normal/gps-diagram.xbm | 116 - gui/icons/normal/host.gif | Bin 1727 -> 0 bytes gui/icons/normal/hub.gif | Bin 719 -> 0 bytes gui/icons/normal/lanswitch.gif | Bin 744 -> 0 bytes gui/icons/normal/mdr.gif | Bin 1598 -> 0 bytes gui/icons/normal/oval.gif | Bin 174 -> 0 bytes gui/icons/normal/pc.gif | Bin 1854 -> 0 bytes gui/icons/normal/rj45.gif | Bin 755 -> 0 bytes gui/icons/normal/router.gif | Bin 1443 -> 0 bytes gui/icons/normal/router_black.gif | Bin 1406 -> 0 bytes gui/icons/normal/router_green.gif | Bin 1433 -> 0 bytes gui/icons/normal/router_purple.gif | Bin 1443 -> 0 bytes gui/icons/normal/router_red.gif | Bin 1432 -> 0 bytes gui/icons/normal/router_yellow.gif | Bin 1443 -> 0 bytes gui/icons/normal/simple.xbm | 228 - gui/icons/normal/text.gif | Bin 127 -> 0 bytes gui/icons/normal/thumb-unknown.gif | Bin 9517 -> 0 bytes gui/icons/normal/tunnel.gif | Bin 799 -> 0 bytes gui/icons/normal/wlan.gif | Bin 259 -> 0 bytes gui/icons/svg/OVS.svg | 190 - gui/icons/svg/ap.svg | 270 - gui/icons/svg/cel.svg | 109 - gui/icons/svg/hub.svg | 197 - gui/icons/svg/lanswitch.svg | 190 - gui/icons/svg/mdr.svg | 178 - gui/icons/svg/otr.svg | 181 - gui/icons/svg/rj45.svg | 172 - gui/icons/svg/router.svg | 158 - gui/icons/svg/router_black.svg | 158 - gui/icons/svg/router_green.svg | 158 - gui/icons/svg/router_purple.svg | 158 - gui/icons/svg/router_red.svg | 158 - gui/icons/svg/router_yellow.svg | 158 - gui/icons/svg/start.svg | 215 - gui/icons/svg/tunnel.svg | 192 - gui/icons/svg/vlan.svg | 180 - gui/icons/tiny/OVS.gif | Bin 744 -> 0 bytes gui/icons/tiny/ap.gif | Bin 667 -> 0 bytes gui/icons/tiny/arrow.down.gif | Bin 337 -> 0 bytes gui/icons/tiny/arrow.gif | Bin 54 -> 0 bytes gui/icons/tiny/arrow.up.gif | Bin 334 -> 0 bytes gui/icons/tiny/blank.gif | Bin 55 -> 0 bytes gui/icons/tiny/button.play.gif | Bin 915 -> 0 bytes gui/icons/tiny/button.stop.gif | Bin 922 -> 0 bytes gui/icons/tiny/cel.gif | Bin 666 -> 0 bytes gui/icons/tiny/delete.gif | Bin 137 -> 0 bytes gui/icons/tiny/document-new.gif | Bin 1054 -> 0 bytes gui/icons/tiny/document-properties.gif | Bin 635 -> 0 bytes gui/icons/tiny/document-save.gif | Bin 1049 -> 0 bytes gui/icons/tiny/edit-delete.gif | Bin 1006 -> 0 bytes gui/icons/tiny/eraser.gif | Bin 428 -> 0 bytes gui/icons/tiny/fileopen.gif | Bin 1095 -> 0 bytes gui/icons/tiny/folder.gif | Bin 1095 -> 0 bytes gui/icons/tiny/host.gif | Bin 1189 -> 0 bytes gui/icons/tiny/hub.gif | Bin 719 -> 0 bytes gui/icons/tiny/lanswitch.gif | Bin 744 -> 0 bytes gui/icons/tiny/link.gif | Bin 86 -> 0 bytes gui/icons/tiny/marker.gif | Bin 375 -> 0 bytes gui/icons/tiny/mdr.gif | Bin 1276 -> 0 bytes gui/icons/tiny/mobility.gif | Bin 167 -> 0 bytes gui/icons/tiny/moboff.gif | Bin 109 -> 0 bytes gui/icons/tiny/observe.gif | Bin 1149 -> 0 bytes gui/icons/tiny/oval.gif | Bin 174 -> 0 bytes gui/icons/tiny/pc.gif | Bin 1300 -> 0 bytes gui/icons/tiny/ping.gif | Bin 112 -> 0 bytes gui/icons/tiny/plot.gif | Bin 265 -> 0 bytes gui/icons/tiny/rectangle.gif | Bin 160 -> 0 bytes gui/icons/tiny/rj45.gif | Bin 755 -> 0 bytes gui/icons/tiny/router.gif | Bin 1152 -> 0 bytes gui/icons/tiny/router_black.gif | Bin 741 -> 0 bytes gui/icons/tiny/router_green.gif | Bin 753 -> 0 bytes gui/icons/tiny/router_purple.gif | Bin 1171 -> 0 bytes gui/icons/tiny/router_red.gif | Bin 1161 -> 0 bytes gui/icons/tiny/router_yellow.gif | Bin 1171 -> 0 bytes gui/icons/tiny/run.gif | Bin 324 -> 0 bytes gui/icons/tiny/script_pause.gif | Bin 117 -> 0 bytes gui/icons/tiny/script_play.gif | Bin 111 -> 0 bytes gui/icons/tiny/script_stop.gif | Bin 113 -> 0 bytes gui/icons/tiny/select.gif | Bin 925 -> 0 bytes gui/icons/tiny/start.gif | Bin 1131 -> 0 bytes gui/icons/tiny/stock_connect.gif | Bin 331 -> 0 bytes gui/icons/tiny/stock_disconnect.gif | Bin 214 -> 0 bytes gui/icons/tiny/stop.gif | Bin 1204 -> 0 bytes gui/icons/tiny/text.gif | Bin 127 -> 0 bytes gui/icons/tiny/trace.gif | Bin 151 -> 0 bytes gui/icons/tiny/tunnel.gif | Bin 799 -> 0 bytes gui/icons/tiny/twonode.gif | Bin 220 -> 0 bytes gui/icons/tiny/view-refresh.gif | Bin 592 -> 0 bytes gui/icons/tiny/wlan.gif | Bin 146 -> 0 bytes gui/initgui.tcl | 814 --- gui/ipv4.tcl | 381 -- gui/ipv6.tcl | 466 -- gui/linkcfg.tcl | 1015 ---- gui/mobility.tcl | 554 -- gui/nodecfg.tcl | 2018 -------- gui/nodes.tcl | 719 --- gui/ns2imunes.tcl | 394 -- gui/plugins.tcl | 1622 ------ gui/services.tcl | 1156 ----- gui/tooltips.tcl | 385 -- gui/topogen.tcl | 377 -- gui/traffic.tcl | 612 --- gui/util.tcl | 1336 ----- gui/version.tcl.in | 5 - gui/widget.tcl | 2261 --------- gui/wlan.tcl | 683 --- gui/wlanscript.tcl | 204 - tasks.py | 2 +- 152 files changed, 4 insertions(+), 43031 deletions(-) delete mode 100644 gui/.gitignore delete mode 100644 gui/Makefile.am delete mode 100644 gui/addons/ipsecservice.tcl delete mode 100644 gui/annotations.tcl delete mode 100644 gui/api.tcl delete mode 100644 gui/canvas.tcl delete mode 100644 gui/cfgparse.tcl delete mode 100644 gui/configs/sample1-bg.gif delete mode 100644 gui/configs/sample1.imn delete mode 100644 gui/configs/sample1.scen delete mode 100644 gui/configs/sample10-kitchen-sink.imn delete mode 100644 gui/configs/sample11-sdn.imn delete mode 100644 gui/configs/sample2-ssh.imn delete mode 100644 gui/configs/sample3-bgp.imn delete mode 100644 gui/configs/sample4-bg.jpg delete mode 100644 gui/configs/sample4-nrlsmf.imn delete mode 100644 gui/configs/sample4.scen delete mode 100644 gui/configs/sample5-mgen.imn delete mode 100644 gui/configs/sample6-emane-rfpipe.imn delete mode 100644 gui/configs/sample7-emane-ieee80211abg.imn delete mode 100644 gui/configs/sample8-ipsec-service.imn delete mode 100644 gui/configs/sample9-vpn.imn delete mode 100755 gui/core-gui-legacy.in delete mode 100644 gui/core.tcl delete mode 100644 gui/debug.tcl delete mode 100644 gui/editor.tcl delete mode 100644 gui/exceptions.tcl delete mode 100644 gui/exec.tcl delete mode 100644 gui/filemgmt.tcl delete mode 100644 gui/gpgui.tcl delete mode 100644 gui/graph_partitioning.tcl delete mode 100644 gui/help.tcl delete mode 100644 gui/icons/Makefile.am delete mode 100644 gui/icons/core-gui.desktop delete mode 100644 gui/icons/core-gui.xpm delete mode 100755 gui/icons/normal/OVS.gif delete mode 100644 gui/icons/normal/antenna.gif delete mode 100644 gui/icons/normal/ap.gif delete mode 100644 gui/icons/normal/core-icon.png delete mode 100644 gui/icons/normal/core-icon.xbm delete mode 100644 gui/icons/normal/core-logo-275x75.gif delete mode 100644 gui/icons/normal/document-properties.gif delete mode 100644 gui/icons/normal/gps-diagram.xbm delete mode 100644 gui/icons/normal/host.gif delete mode 100644 gui/icons/normal/hub.gif delete mode 100644 gui/icons/normal/lanswitch.gif delete mode 100644 gui/icons/normal/mdr.gif delete mode 100644 gui/icons/normal/oval.gif delete mode 100644 gui/icons/normal/pc.gif delete mode 100644 gui/icons/normal/rj45.gif delete mode 100644 gui/icons/normal/router.gif delete mode 100644 gui/icons/normal/router_black.gif delete mode 100644 gui/icons/normal/router_green.gif delete mode 100644 gui/icons/normal/router_purple.gif delete mode 100644 gui/icons/normal/router_red.gif delete mode 100644 gui/icons/normal/router_yellow.gif delete mode 100644 gui/icons/normal/simple.xbm delete mode 100644 gui/icons/normal/text.gif delete mode 100644 gui/icons/normal/thumb-unknown.gif delete mode 100644 gui/icons/normal/tunnel.gif delete mode 100644 gui/icons/normal/wlan.gif delete mode 100755 gui/icons/svg/OVS.svg delete mode 100644 gui/icons/svg/ap.svg delete mode 100644 gui/icons/svg/cel.svg delete mode 100644 gui/icons/svg/hub.svg delete mode 100644 gui/icons/svg/lanswitch.svg delete mode 100644 gui/icons/svg/mdr.svg delete mode 100644 gui/icons/svg/otr.svg delete mode 100644 gui/icons/svg/rj45.svg delete mode 100644 gui/icons/svg/router.svg delete mode 100644 gui/icons/svg/router_black.svg delete mode 100644 gui/icons/svg/router_green.svg delete mode 100644 gui/icons/svg/router_purple.svg delete mode 100644 gui/icons/svg/router_red.svg delete mode 100644 gui/icons/svg/router_yellow.svg delete mode 100644 gui/icons/svg/start.svg delete mode 100644 gui/icons/svg/tunnel.svg delete mode 100644 gui/icons/svg/vlan.svg delete mode 100755 gui/icons/tiny/OVS.gif delete mode 100644 gui/icons/tiny/ap.gif delete mode 100644 gui/icons/tiny/arrow.down.gif delete mode 100644 gui/icons/tiny/arrow.gif delete mode 100644 gui/icons/tiny/arrow.up.gif delete mode 100644 gui/icons/tiny/blank.gif delete mode 100644 gui/icons/tiny/button.play.gif delete mode 100644 gui/icons/tiny/button.stop.gif delete mode 100644 gui/icons/tiny/cel.gif delete mode 100644 gui/icons/tiny/delete.gif delete mode 100644 gui/icons/tiny/document-new.gif delete mode 100644 gui/icons/tiny/document-properties.gif delete mode 100644 gui/icons/tiny/document-save.gif delete mode 100644 gui/icons/tiny/edit-delete.gif delete mode 100644 gui/icons/tiny/eraser.gif delete mode 100644 gui/icons/tiny/fileopen.gif delete mode 100644 gui/icons/tiny/folder.gif delete mode 100644 gui/icons/tiny/host.gif delete mode 100644 gui/icons/tiny/hub.gif delete mode 100644 gui/icons/tiny/lanswitch.gif delete mode 100644 gui/icons/tiny/link.gif delete mode 100644 gui/icons/tiny/marker.gif delete mode 100644 gui/icons/tiny/mdr.gif delete mode 100644 gui/icons/tiny/mobility.gif delete mode 100644 gui/icons/tiny/moboff.gif delete mode 100644 gui/icons/tiny/observe.gif delete mode 100644 gui/icons/tiny/oval.gif delete mode 100644 gui/icons/tiny/pc.gif delete mode 100644 gui/icons/tiny/ping.gif delete mode 100644 gui/icons/tiny/plot.gif delete mode 100644 gui/icons/tiny/rectangle.gif delete mode 100644 gui/icons/tiny/rj45.gif delete mode 100644 gui/icons/tiny/router.gif delete mode 100644 gui/icons/tiny/router_black.gif delete mode 100644 gui/icons/tiny/router_green.gif delete mode 100644 gui/icons/tiny/router_purple.gif delete mode 100644 gui/icons/tiny/router_red.gif delete mode 100644 gui/icons/tiny/router_yellow.gif delete mode 100644 gui/icons/tiny/run.gif delete mode 100644 gui/icons/tiny/script_pause.gif delete mode 100644 gui/icons/tiny/script_play.gif delete mode 100644 gui/icons/tiny/script_stop.gif delete mode 100644 gui/icons/tiny/select.gif delete mode 100644 gui/icons/tiny/start.gif delete mode 100644 gui/icons/tiny/stock_connect.gif delete mode 100644 gui/icons/tiny/stock_disconnect.gif delete mode 100644 gui/icons/tiny/stop.gif delete mode 100644 gui/icons/tiny/text.gif delete mode 100644 gui/icons/tiny/trace.gif delete mode 100644 gui/icons/tiny/tunnel.gif delete mode 100644 gui/icons/tiny/twonode.gif delete mode 100644 gui/icons/tiny/view-refresh.gif delete mode 100644 gui/icons/tiny/wlan.gif delete mode 100644 gui/initgui.tcl delete mode 100644 gui/ipv4.tcl delete mode 100644 gui/ipv6.tcl delete mode 100644 gui/linkcfg.tcl delete mode 100644 gui/mobility.tcl delete mode 100644 gui/nodecfg.tcl delete mode 100644 gui/nodes.tcl delete mode 100644 gui/ns2imunes.tcl delete mode 100644 gui/plugins.tcl delete mode 100644 gui/services.tcl delete mode 100644 gui/tooltips.tcl delete mode 100644 gui/topogen.tcl delete mode 100644 gui/traffic.tcl delete mode 100644 gui/util.tcl delete mode 100644 gui/version.tcl.in delete mode 100644 gui/widget.tcl delete mode 100644 gui/wlan.tcl delete mode 100644 gui/wlanscript.tcl diff --git a/Makefile.am b/Makefile.am index bd15cf09..83645c1b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,10 +6,6 @@ if WANT_DOCS DOCS = docs man endif -if WANT_GUI - GUI = gui -endif - if WANT_DAEMON DAEMON = daemon endif @@ -19,7 +15,7 @@ if WANT_NETNS endif # keep docs last due to dependencies on binaries -SUBDIRS = $(GUI) $(DAEMON) $(NETNS) $(DOCS) +SUBDIRS = $(DAEMON) $(NETNS) $(DOCS) ACLOCAL_AMFLAGS = -I config @@ -115,7 +111,6 @@ $(info creating file $1 from $1.in) -e 's,[@]CORE_STATE_DIR[@],$(CORE_STATE_DIR),g' \ -e 's,[@]CORE_DATA_DIR[@],$(CORE_DATA_DIR),g' \ -e 's,[@]CORE_CONF_DIR[@],$(CORE_CONF_DIR),g' \ - -e 's,[@]CORE_GUI_CONF_DIR[@],$(CORE_GUI_CONF_DIR),g' \ < $1.in > $1 endef @@ -123,7 +118,6 @@ all: change-files .PHONY: change-files change-files: - $(call change-files,gui/core-gui-legacy) $(call change-files,daemon/core/constants.py) $(call change-files,netns/setup.py) diff --git a/configure.ac b/configure.ac index a3d61abc..e9604a6d 100644 --- a/configure.ac +++ b/configure.ac @@ -30,25 +30,14 @@ AC_SUBST(CORE_CONF_DIR) AC_SUBST(CORE_DATA_DIR) AC_SUBST(CORE_STATE_DIR) -# CORE GUI configuration files and preferences in CORE_GUI_CONF_DIR -# scenario files in ~/.core/configs/ -AC_ARG_WITH([guiconfdir], - [AS_HELP_STRING([--with-guiconfdir=dir], - [specify GUI configuration directory])], - [CORE_GUI_CONF_DIR="$with_guiconfdir"], - [CORE_GUI_CONF_DIR="\$\${HOME}/.core"]) -AC_SUBST(CORE_GUI_CONF_DIR) -AC_ARG_ENABLE([gui], - [AS_HELP_STRING([--enable-gui[=ARG]], - [build and install the GUI (default is yes)])], - [], [enable_gui=yes]) -AC_SUBST(enable_gui) +# documentation option AC_ARG_ENABLE([docs], [AS_HELP_STRING([--enable-docs[=ARG]], [build python documentation (default is no)])], [], [enable_docs=no]) AC_SUBST(enable_docs) +# python option AC_ARG_ENABLE([python], [AS_HELP_STRING([--enable-python[=ARG]], [build and install the python bindings (default is yes)])], @@ -209,7 +198,6 @@ if [test "x$want_python" = "xyes" && test "x$enable_docs" = "xyes"] ; then fi # Variable substitutions -AM_CONDITIONAL(WANT_GUI, test x$enable_gui = xyes) AM_CONDITIONAL(WANT_DAEMON, test x$enable_daemon = xyes) AM_CONDITIONAL(WANT_DOCS, test x$want_docs = xyes) AM_CONDITIONAL(WANT_PYTHON, test x$want_python = xyes) @@ -224,9 +212,6 @@ fi # Output files AC_CONFIG_FILES([Makefile - gui/version.tcl - gui/Makefile - gui/icons/Makefile man/Makefile docs/Makefile daemon/Makefile @@ -248,17 +233,12 @@ Build: Prefix: ${prefix} Exec Prefix: ${exec_prefix} -GUI: - GUI path: ${CORE_LIB_DIR} - GUI config: ${CORE_GUI_CONF_DIR} - Daemon: Daemon path: ${bindir} Daemon config: ${CORE_CONF_DIR} Python: ${PYTHON} Features to build: - Build GUI: ${enable_gui} Build Daemon: ${enable_daemon} Documentation: ${want_docs} diff --git a/gui/.gitignore b/gui/.gitignore deleted file mode 100644 index dea55215..00000000 --- a/gui/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -core-gui-legacy -version.tcl diff --git a/gui/Makefile.am b/gui/Makefile.am deleted file mode 100644 index 938769a2..00000000 --- a/gui/Makefile.am +++ /dev/null @@ -1,41 +0,0 @@ -# CORE -# (c)2010-2013 the Boeing Company. -# See the LICENSE file included in this distribution. -# -# author: Jeff Ahrenholz -# -# Makefile for installing the CORE GUI. Since it is a Tcl/Tk script, we do not -# build anything here. -# - -SUBDIRS = icons - -TCL_FILES := $(wildcard *.tcl) -ADDONS_FILES := $(wildcard addons/*) -CONFIG_FILES := $(wildcard configs/*) - -# CORE GUI script (/usr/local/bin/core-gui-legacy) -dist_bin_SCRIPTS = core-gui-legacy - -# Tcl/Tk scripts (/usr/local/lib/core) -coredir = $(CORE_LIB_DIR) -dist_core_DATA = $(TCL_FILES) -dist_core_SCRIPTS = $(OTHER_FILES) - -# Addon files -coreaddonsdir = $(coredir)/addons -dist_coreaddons_DATA = $(ADDONS_FILES) - -# Sample configs (/usr/local/share/core/examples/configs) -coreconfigsdir = $(datadir)/core/examples/configs -dist_coreconfigs_DATA = $(CONFIG_FILES) - -# remove generated file from dist -dist-hook: - -rm -f $(distdir)/version.tcl - -# extra cruft to remove -DISTCLEANFILES = Makefile.in - -# files to include in source tarball not included elsewhere -EXTRA_DIST = core-gui-legacy.in diff --git a/gui/addons/ipsecservice.tcl b/gui/addons/ipsecservice.tcl deleted file mode 100644 index c859852a..00000000 --- a/gui/addons/ipsecservice.tcl +++ /dev/null @@ -1,329 +0,0 @@ -# -# This is a separate "addons" file because it is closely tied to Python -# service definition for the IPsec service. -# - -# -# Helper dialog for configuring the IPsec service -# -proc popupServiceConfig_IPsec { parent w node service btn } { - global plugin_img_add plugin_img_del plugin_img_edit - - set f $w.note.ipsec - ttk::frame $f - set h "This IPsec service helper will assist with building an ipsec.sh file" - set h "$h (located on the Files tab).\nThe IPsec service builds ESP" - set h "$h tunnels between the specified peers using the racoon IKEv2" - set h "$h\nkeying daemon. You need to provide keys and the addresses of" - set h "$h peers, along with the\nsubnets to tunnel." - ttk::label $f.help -text $h - pack $f.help -side top -anchor w -padx 4 -pady 4 - $w.note add $f -text "IPsec" -underline 0 - - global g_ipsec_key_dir g_ipsec_key_name - set g_ipsec_key_dir "/etc/core/keys" - set g_ipsec_key_name "ipsec1" - ttk::labelframe $f.keys -text "Keys" - - ttk::frame $f.keys.dir - ttk::label $f.keys.dir.lab -text "Key directory:" - ttk::entry $f.keys.dir.ent -width 40 -textvariable g_ipsec_key_dir - ttk::button $f.keys.dir.btn -width 5 -text "..." -command { - set f .popupServicesCustomize.note.ipsec - set d [$f.keys.dir.ent get] - set d [tk_chooseDirectory -initialdir $d -title "Key directory"] - if { $d != "" } { - $f.keys.dir.ent delete 0 end - $f.keys.dir.ent insert 0 $d - } - } - pack $f.keys.dir.lab $f.keys.dir.ent $f.keys.dir.btn \ - -side left -padx 4 -pady 4 - pack $f.keys.dir -side top -anchor w - - ttk::frame $f.keys.name - ttk::label $f.keys.name.lab -text "Key base name:" - ttk::entry $f.keys.name.ent -width 10 -textvariable g_ipsec_key_name - pack $f.keys.name.lab $f.keys.name.ent -side left -padx 4 -pady 4 - pack $f.keys.name -side top -anchor w - - set h "The (name).pem x509 certificate and (name).key RSA private key need" - set h "$h to exist in the\nspecified directory. These can be generated" - set h "$h using the openssl tool. Also, a ca-cert.pem\nfile should exist" - set h "$h in the key directory for the CA that issued the certs." - ttk::label $f.keys.help -text $h - pack $f.keys.help -side top -anchor w -padx 4 -pady 4 - - pack $f.keys -side top -pady 4 -pady 4 -expand true -fill x - - ttk::labelframe $f.t -text "IPsec Tunnel Endpoints" - set h "(1) Define tunnel endpoints (select peer node using the button" - set h "$h, then select address from the list)" - ttk::label $f.t.lab1 -text $h - pack $f.t.lab1 -side top -anchor w -padx 4 -pady 4 - ttk::frame $f.t.ep - ttk::label $f.t.ep.lab1 -text "Local:" - ttk::combobox $f.t.ep.combo1 -width 12 - pack $f.t.ep.lab1 $f.t.ep.combo1 -side left -padx 4 -pady 4 - populateComboWithIPs $f.t.ep.combo1 $node - - global g_twoNodeSelect g_twoNodeSelectCallback - set g_twoNodeSelect "" - set g_twoNodeSelectCallback selectTwoNodeIPsecCallback - - set h "Choose a node by clicking it on the canvas" - set h "$h or\nby selecting it from the list below." - ttk::label $f.t.ep.lab2 -text "Peer node:" - ttk::checkbutton $f.t.ep.node -text " (none) " -variable g_twoNodeSelect \ - -onvalue "$f.t.ep.node" -style Toolbutton \ - -command "popupSelectNodes {$h} {} selectNodesIPsecCallback" - - ttk::label $f.t.ep.lab3 -text "Peer:" - ttk::combobox $f.t.ep.combo2 -width 12 - ttk::button $f.t.ep.add -text "Add Endpoint" -image $plugin_img_add \ - -compound left -command "ipsecTreeHelper $f ep" - pack $f.t.ep.lab2 $f.t.ep.node $f.t.ep.lab3 $f.t.ep.combo2 \ - $f.t.ep.add -side left -padx 4 -pady 4 - pack $f.t.ep -side top -anchor w - - set h "(2) Select endpoints below and add the subnets to be encrypted" - ttk::label $f.t.lab2 -text $h - pack $f.t.lab2 -side top -anchor w -padx 4 -pady 4 - - ttk::frame $f.t.sub - ttk::label $f.t.sub.lab1 -text "Local subnet:" - ttk::combobox $f.t.sub.combo1 -width 12 - ttk::label $f.t.sub.lab2 -text "Remote subnet:" - ttk::combobox $f.t.sub.combo2 -width 12 - ttk::button $f.t.sub.add -text "Add Subnet" -image $plugin_img_add \ - -compound left -command "ipsecTreeHelper $f sub" - pack $f.t.sub.lab1 $f.t.sub.combo1 $f.t.sub.lab2 $f.t.sub.combo2 \ - $f.t.sub.add -side left -padx 5 -pady 4 - pack $f.t.sub -side top -anchor w - - global node_list - set net_list [ipv4SubnetList $node_list] - $f.t.sub.combo1 configure -values $net_list - $f.t.sub.combo2 configure -values $net_list - - ttk::treeview $f.t.tree -height 5 -selectmode browse -show tree - - pack $f.t.tree -side top -padx 4 -pady 4 -fill both - pack $f.t -side top -expand true -fill both - - ttk::frame $f.bottom - ttk::button $f.bottom.del -image $plugin_img_del \ - -command "ipsecTreeHelper $f del" - ttk::button $f.bottom.gen -text "Generate ipsec.sh" \ - -image $plugin_img_edit -compound left -command "generateIPsecScript $w" - pack $f.bottom.del $f.bottom.gen -side left -padx 4 -pady 4 - pack $f.bottom -side top -} - -# -# Callback invoked when receiving configuration values -# from a Configuration Message; this service helper depends on the ipsec.sh -# file, not the other configuration values. -# -#proc popupServiceConfig_IPsec_vals { node values services w } { -#} - -# -# Callback invoked when receiving service file data from a File Message -proc popupServiceConfig_IPsec_file { node name data w } { - if { $name == "ipsec.sh" } { - readIPsecScript $w - } -} - -# helper to insert all of a node's IP addresses into a combo -proc populateComboWithIPs { combo node } { - set ip_list [ipv4List $node 0] - $combo configure -values $ip_list - $combo delete 0 end - $combo insert 0 [lindex $ip_list 0] -} - -# called from editor.tcl:button1 when user clicks on a node -# search for IP address and populate -proc selectTwoNodeIPsecCallback {} { - set w .popupServicesCustomize - set f $w.note.ipsec - - if { ![winfo exists $w] } { return }; # user has closed window - catch {destroy .nodeselect} - - set node [string trim [$f.t.ep.node cget -text]] - if { [set node] == "(none)" } { set node "" } - - # populate peer interface combo with list of IPs - populateComboWithIPs $f.t.ep.combo2 $node -} - -# called from popupSelectNodes dialog when a node selection has been made -proc selectNodesIPsecCallback { nodes } { - global g_twoNodeSelect - set w .popupServicesCustomize - set f $w.note.ipsec - - set g_twoNodeSelect "" - set node [lindex $nodes 0] - if { $node == "" } { - $f.t.ep.node configure -text "(none)" - return - } - $f.t.ep.node configure -text " $node " - - # populate peer interface combo with list of IPs - populateComboWithIPs $f.t.ep.combo2 $node -} - -# helper to manipulate tree; cmd is "del", "ep" or "sub" -proc ipsecTreeHelper { f cmd } { - - if { $cmd == "del" } { - set sel [$f.t.tree selection] - $f.t.tree delete $sel - return - } - - # add endpoint (ep) or subnet (sub) - set l [string trim [$f.t.$cmd.combo1 get]] - set p [string trim [$f.t.$cmd.combo2 get]] - if { $l == "" || $p == "" } { - if { $cmd == "ep" } { - set h "tunnel interface addresses" - } else { - set h "subnet addresses" - } - tk_messageBox -type ok -icon warning -message \ - "You need to select local and peer $h." - return - } - - if { $cmd == "ep" } { - set item [$f.t.tree insert {} end -text "$l <--> $p" -open true] - $f.t.tree selection set $item - } elseif { $cmd == "sub" } { - set parent [$f.t.tree selection] - if { $parent == "" } { - tk_messageBox -type ok -icon warning -message \ - "You need to first select endpoints, then configure their subnets." - return - } - if { [$f.t.tree parent $parent] != {} } { - set parent [$f.t.tree parent $parent] - } - $f.t.tree insert $parent end -text "$l <===> $p" - } -} - -# update an ipsec.sh file that was generated by the IPsec service -proc generateIPsecScript { w } { - #puts "generateIPsecScript $w..." - set cfg [$w.note.files.txt get 0.0 end-1c] - set newcfg "" - - # - # Gather data for a new config - # - set f $w.note.ipsec - set keydir [$f.keys.dir.ent get] - set keyname [$f.keys.name.ent get] - - set tunnelhosts "" - set subnet_list "" - set ti 0 - set th_items [$f.t.tree children {}] - foreach th $th_items { - set ep [$f.t.tree item $th -text] - set i [string first " " $ep] - # replace " <--> " with "AND" - set ep [string replace $ep $i $i+5 "AND"] - # build a list e.g.: - # tunnelhosts="172.16.0.1AND172.16.0.2 172.16.0.1AND172.16.2.1" - lappend tunnelhosts $ep - - set subnets "" - foreach subnet_item [$f.t.tree children $th] { - set sn [$f.t.tree item $subnet_item -text] - set i [string first " " $sn] - # replace " <===> " with "AND" - set sn [string replace $sn $i $i+6 "AND"] - lappend subnets $sn - } - incr ti - set subnetstxt [join $subnets " "] - # build a list e.g.: - # T2="172.16.4.0/24AND172.16.5.0/24 172.16.4.0/24AND172.16.6.0/24" - set subnets "T$ti=\"$subnetstxt\"" - lappend subnet_list $subnets - } - - # - # Perform replacements in existing ipsec.sh file. - # - set have_subnets 0 - foreach line [split $cfg "\n"] { - if { [string range $line 0 6] == "keydir=" } { - set line "keydir=$keydir" - } elseif { [string range $line 0 8] == "certname=" } { - set line "certname=$keyname" - } elseif { [string range $line 0 11] == "tunnelhosts=" } { - set tunnelhosts [join $tunnelhosts " "] - set line "tunnelhosts=\"$tunnelhosts\"" - } elseif { [string range $line 0 0] == "T" && \ - [string is digit [string range $line 1 1]] } { - if { $have_subnets } { - continue ;# skip this line - } else { - set line [join $subnet_list "\n"] - set have_subnets 1 - } - } - lappend newcfg $line - } - $w.note.files.txt delete 0.0 end - $w.note.files.txt insert 0.0 [join $newcfg "\n"] - $w.note select $w.note.files - $w.btn.apply configure -state normal -} - -proc readIPsecScript { w } { - set cfg [$w.note.files.txt get 0.0 end-1c] - - set f $w.note.ipsec - $f.keys.dir.ent delete 0 end - $f.keys.name.ent delete 0 end - $f.t.tree delete [$f.t.tree children {}] - - set ti 1 - foreach line [split $cfg "\n"] { - if { [string range $line 0 6] == "keydir=" } { - $f.keys.dir.ent insert 0 [string range $line 7 end] - } elseif { [string range $line 0 8] == "certname=" } { - $f.keys.name.ent insert 0 [string range $line 9 end] - } elseif { [string range $line 0 11] == "tunnelhosts=" } { - set tunnelhosts [string range $line 13 end-1] - set ti 0 - foreach ep [split $tunnelhosts " "] { - incr ti - set i [string first "AND" $ep] - set ep [string replace $ep $i $i+2 " <--> "] - $f.t.tree insert {} end -id "T$ti" -text "$ep" -open true - } - } elseif { [string range $line 0 0] == "T" && \ - [string is digit [string range $line 1 1]] } { - set i [string first "=" $line] - set ti [string range $line 0 $i-1] - set subnets [split [string range $line $i+2 end-1] " "] - foreach sn $subnets { - set i [string first "AND" $sn] - set sn [string replace $sn $i $i+2 " <===> "] - if { [catch {$f.t.tree insert $ti end -text "$sn"} e] } { - puts "IPsec service ignoring line '$ti='" - } - } - } - } -} diff --git a/gui/annotations.tcl b/gui/annotations.tcl deleted file mode 100644 index 8a2184d3..00000000 --- a/gui/annotations.tcl +++ /dev/null @@ -1,837 +0,0 @@ -# -# Copyright 2007-2008 University of Zagreb, Croatia. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY AUTHOR 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 AUTHOR 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. -# - -#****h* imunes/annotations.tcl -# NAME -# annotations.tcl -- oval, rectangle, text, background, ... -# FUNCTION -# This module is used for configuration/image annotations, such as oval, -# rectangle, text, background or some other. -#**** - -#****f* annotations.tcl/annotationConfig -# NAME -# annotationConfig -- -# SYNOPSIS -# annotationConfig $canvas $target -# FUNCTION -# . . . -# INPUTS -# * canvas -- -# * target -- oval or rectangle object -#**** - -proc annotationConfig { c target } { - switch -exact -- [nodeType $target] { - oval { - popupAnnotationDialog $c $target "true" - } - rectangle { - popupAnnotationDialog $c $target "true" - } - text { - popupAnnotationDialog $c $target "true" - } - default { - puts "Unknown type [nodeType $target] for target $target" - } - } - redrawAll -} - - -#****f* annotations.tcl/popupOvalDialog -# NAME -# popupOvalDialog -- creates a new oval or modifies existing oval -# SYNOPSIS -# popupOvalDialog $canvas $modify $color $label $lcolor -# FUNCTION -# Called from: -# - editor.tcl/button1-release when new oval is drawn -# - annotationConfig which is called from popupConfigDialog bound to -# Double-1 on various objects -# - configureOval called from button3annotation procedure which creates -# a menu for configuration and deletion (bound to 3 on oval, -# rectangle and text) -# INPUTS -# * canvas -- -# * modify -- create new oval "newoval" if modify=false or -# modify an existing oval "newoval" if modify=true -# * color -- oval color -# * label -- label text -# * lcolor -- label (text) color -#**** - - -#****f* annotations.tcl/destroyNewoval -# NAME -# destroyNewoval -- helper for popupOvalDialog and popupOvalApply -# SYNOPSIS -# destroyNewoval $canvas -# FUNCTION -# . . . -# INPUTS -# * canvas -- -#**** - -proc destroyNewoval { c } { - global newoval - $c delete -withtags newoval - set newoval "" -} - - -# oval/rectangle/text right-click menu - -proc button3annotation { type c x y } { - - if { $type == "oval" } { - set procname "Oval" - set item [lindex [$c gettags {oval && current}] 1] - } elseif { $type == "rectangle" } { - set procname "Rectangle" - set item [lindex [$c gettags {rectangle && current}] 1] - } elseif { $type == "label" } { - set procname "Label" - set item [lindex [$c gettags {label && current}] 1] - } elseif { $type == "text" } { - set procname "Text" - set item [lindex [$c gettags {text && current}] 1] - } elseif { $type == "marker" } { - # erase markings - $c delete -withtags {marker && current} - return - } else { - # ??? - return - } - if { $item == "" } { - return - } - set menutext "$type $item" - - .button3menu delete 0 end - - .button3menu add command -label "Configure $menutext" \ - -command "annotationConfig $c $item" - .button3menu add command -label "Delete $menutext" \ - -command "deleteAnnotation $c $type $item" - - set x [winfo pointerx .] - set y [winfo pointery .] - tk_popup .button3menu $x $y -} - - -proc deleteAnnotation { c type target } { - global changed annotation_list - - $c delete -withtags "$type && $target" - $c delete -withtags "new$type" - set i [lsearch -exact $annotation_list $target] - set annotation_list [lreplace $annotation_list $i $i] - set changed 1 - updateUndoLog -} - - -proc drawOval {oval} { - global $oval defOvalColor zoom curcanvas - global defTextFontFamily defTextFontSize - - set coords [getNodeCoords $oval] - if { [llength $coords] < 4 } { - puts "Bad coordinates for oval $oval" - return - } - set x1 [expr {[lindex $coords 0] * $zoom}] - set y1 [expr {[lindex $coords 1] * $zoom}] - set x2 [expr {[lindex $coords 2] * $zoom}] - set y2 [expr {[lindex $coords 3] * $zoom}] - set color [lindex [lsearch -inline [set $oval] "color *"] 1] - set label [lindex [lsearch -inline [set $oval] "label *"] 1] - set lcolor [lindex [lsearch -inline [set $oval] "labelcolor *"] 1] - set bordercolor [lindex [lsearch -inline [set $oval] "border *"] 1] - set width [lindex [lsearch -inline [set $oval] "width *"] 1] - set lx [expr $x1 + (($x2 - $x1) / 2)] - set ly [expr ($y1 + 20)] - - if { $color == "" } { set color $defOvalColor } - if { $lcolor == "" } { set lcolor black } - if { $width == "" } { set width 0 } - if { $bordercolor == "" } { set bordercolor black } - - # -outline red -stipple gray50 - set newoval [.c create oval $x1 $y1 $x2 $y2 \ - -fill $color -width $width -outline $bordercolor \ - -tags "oval $oval annotation"] - .c raise $newoval background - - set fontfamily [lindex [lsearch -inline [set $oval] "fontfamily *"] 1] - set fontsize [lindex [lsearch -inline [set $oval] "fontsize *"] 1] - if { $fontfamily == "" } { - set fontfamily $defTextFontFamily - } - if { $fontsize == "" } { - set fontsize $defTextFontSize - } - set newfontsize $fontsize - set font [list "$fontfamily" $fontsize] - set effects [lindex [lsearch -inline [set $oval] "effects *"] 1] - - .c create text $lx $ly -tags "oval $oval annotation" -text $label \ - -justify center -font "$font $effects" -fill $lcolor - - setNodeCanvas $oval $curcanvas - setType $oval "oval" -} - - -# Color helper for popupOvalDialog and popupLabelDialog -proc popupColor { type l settext } { - # popup color selection dialog with current color - if { $type == "fg" } { - set initcolor [$l cget -fg] - } else { - set initcolor [$l cget -bg] - } - set newcolor [tk_chooseColor -initialcolor $initcolor] - - # set fg or bg of the "l" label control - if { $newcolor == "" } { - return - } - if { $settext == "true" } { - $l configure -text $newcolor -$type $newcolor - } else { - $l configure -$type $newcolor - } -} - - -#****f* annotations.tcl/roundRect -# NAME -# roundRect -- Draw a rounded rectangle in the canvas. -# Called from drawRect procedure -# SYNOPSIS -# roundRect $w $x0 $y0 $x3 $y3 $radius $args -# FUNCTION -# Creates a rounded rectangle as a smooth polygon in the canvas -# and returns the canvas item number of the rounded rectangle. -# INPUTS -# * w -- Path name of the canvas -# * x0, y0 -- Coordinates of the upper left corner, in pixels -# * x3, y3 -- Coordinates of the lower right corner, in pixels -# * radius -- Radius of the bend at the corners, in any form -# acceptable to Tk_GetPixels -# * args -- Other args suitable to a 'polygon' item on the canvas -# Example: -# roundRect .c 100 50 500 250 $rad -fill white -outline black -tags rectangle -#**** - -proc roundRect { w x0 y0 x3 y3 radius args } { - - set r [winfo pixels $w $radius] - set d [expr { 2 * $r }] - - # Make sure that the radius of the curve is less than 3/8 size of the box - - set maxr 0.75 - - if { $d > $maxr * ( $x3 - $x0 ) } { - set d [expr { $maxr * ( $x3 - $x0 ) }] - } - if { $d > $maxr * ( $y3 - $y0 ) } { - set d [expr { $maxr * ( $y3 - $y0 ) }] - } - - set x1 [expr { $x0 + $d }] - set x2 [expr { $x3 - $d }] - set y1 [expr { $y0 + $d }] - set y2 [expr { $y3 - $d }] - - set cmd [list $w create polygon] - lappend cmd $x0 $y0 $x1 $y0 $x2 $y0 $x3 $y0 $x3 $y1 $x3 $y2 - lappend cmd $x3 $y3 $x2 $y3 $x1 $y3 $x0 $y3 $x0 $y2 $x0 $y1 - lappend cmd -smooth 1 - return [eval $cmd $args] - } - -proc drawRect {rectangle} { - global $rectangle defRectColor zoom curcanvas - global defTextFontFamily defTextFontSize - - set coords [getNodeCoords $rectangle] - if {$coords == "" || [llength $coords] != 4 } { - puts "Bad coordinates for rectangle $rectangle" - return - } - - set x1 [expr {[lindex $coords 0] * $zoom}] - set y1 [expr {[lindex $coords 1] * $zoom}] - set x2 [expr {[lindex $coords 2] * $zoom}] - set y2 [expr {[lindex $coords 3] * $zoom}] - set color [lindex [lsearch -inline [set $rectangle] "color *"] 1] - set label [lindex [lsearch -inline [set $rectangle] "label *"] 1] - set lcolor [lindex [lsearch -inline [set $rectangle] "labelcolor *"] 1] - set bordercolor [lindex [lsearch -inline [set $rectangle] "border *"] 1] - set width [lindex [lsearch -inline [set $rectangle] "width *"] 1] - set rad [lindex [lsearch -inline [set $rectangle] "rad *"] 1] - set lx [expr $x1 + (($x2 - $x1) / 2)] - set ly [expr ($y1 + 20)] - - if { $color == "" } { set color $defRectColor } - if { $lcolor == "" } { set lcolor black } - if { $bordercolor == "" } { set bordercolor black } - if { $width == "" } { set width 0 } - # rounded-rectangle radius - if { $rad == "" } { set rad 25 } - - # Boeing: allow borderless rectangles - if { $width == 0 } { - set newrect [roundRect .c $x1 $y1 $x2 $y2 $rad \ - -fill $color -tags "rectangle $rectangle annotation"] - } else { - # end Boeing - set newrect [roundRect .c $x1 $y1 $x2 $y2 $rad \ - -fill $color -outline $bordercolor -width $width \ - -tags "rectangle $rectangle annotation"] - .c raise $newrect background - # Boeing - } - # end Boeing - - set fontfamily [lindex [lsearch -inline [set $rectangle] "fontfamily *"] 1] - set fontsize [lindex [lsearch -inline [set $rectangle] "fontsize *"] 1] - if { $fontfamily == "" } { - set fontfamily $defTextFontFamily - } - if { $fontsize == "" } { - set fontsize $defTextFontSize - } - set newfontsize $fontsize - set font [list "$fontfamily" $fontsize] - set effects [lindex [lsearch -inline [set $rectangle] "effects *"] 1] - - .c create text $lx $ly -tags "rectangle $rectangle annotation" \ - -text $label -justify center -font "$font $effects" -fill $lcolor - - setNodeCanvas $rectangle $curcanvas - setType $rectangle "rectangle" -} - - -proc popupAnnotationDialog { c target modify } { - global $target newrect newoval - global width rad fontfamily fontsize - global defFillColor defTextColor defTextFontFamily defTextFontSize - - # do nothing, return, if coords are empty - if { $target == 0 \ - && [$c coords "$newrect"] == "" \ - && [$c coords "$newoval"] == "" } { - return - } - if { $target == 0 } { - set width 0 - set rad 25 - set coords [$c bbox "$newrect"] - if { [$c coords "$newrect"] == "" } { - set coords [$c bbox "$newoval"] - set annotationType "oval" - } else { - set annotationType "rectangle" - } - set fontfamily "" - set fontsize "" - set effects "" - set color "" - set label "" - set lcolor "" - set bordercolor "" - } else { - set width [lindex [lsearch -inline [set $target] "width *"] 1] - set rad [lindex [lsearch -inline [set $target] "rad *"] 1] - set coords [$c bbox "$target"] - set color [lindex [lsearch -inline [set $target] "color *"] 1] - set fontfamily [lindex [lsearch -inline [set $target] "fontfamily *"] 1] - set fontsize [lindex [lsearch -inline [set $target] "fontsize *"] 1] - set effects [lindex [lsearch -inline [set $target] "effects *"] 1] - - set label [lindex [lsearch -inline [set $target] "label *"] 1] - set lcolor [lindex [lsearch -inline [set $target] "labelcolor *"] 1] - set bordercolor [lindex [lsearch -inline [set $target] "border *"] 1] - set annotationType [nodeType $target] - } - - if { $color == "" } { - # Boeing: use default shape colors - if { $annotationType == "oval" } { - global defOvalColor - set color $defOvalColor - } elseif { $annotationType == "rectangle" } { - global defRectColor - set color $defRectColor - } else { - set color $defFillColor - } - } - if { $lcolor == "" } { set lcolor black } - if { $bordercolor == "" } { set bordercolor black } - if { $width == "" } { set width 0 } - if { $rad == "" } { set rad 25 } - if { $fontfamily == "" } { set fontfamily $defTextFontFamily } - if { $fontsize == "" } { set fontsize $defTextFontSize } - - set textBold 0 - set textItalic 0 - set textUnderline 0 - if { [lsearch $effects bold ] != -1} {set textBold 1} - if { [lsearch $effects italic ] != -1} {set textItalic 1} - if { [lsearch $effects underline ] != -1} {set textUnderline 1} - - set x1 [lindex $coords 0] - set y1 [lindex $coords 1] - set x2 [lindex $coords 2] - set y2 [lindex $coords 3] - set xx [expr {abs($x2 - $x1)}] - set yy [expr {abs($y2 - $y1)}] - if { $xx > $yy } { - set maxrad [expr $yy * 3.0 / 8.0] - } else { - set maxrad [expr $xx * 3.0 / 8.0] - } - - set wi .popup - catch {destroy $wi} - toplevel $wi - - wm transient $wi . - wm resizable $wi 0 0 - - if { $modify == "true" } { - set windowtitle "Configure $annotationType $target" - } else { - set windowtitle "Add a new $annotationType" - } - wm title $wi $windowtitle - - frame $wi.text -relief groove -bd 2 - frame $wi.text.lab - label $wi.text.lab.name_label -text "Text for top of $annotationType:" - entry $wi.text.lab.name -bg white -fg $lcolor -width 32 \ - -validate focus -invcmd "focusAndFlash %W" - $wi.text.lab.name insert 0 $label - pack $wi.text.lab.name_label $wi.text.lab.name -side left -anchor w \ - -padx 2 -pady 2 -fill x - pack $wi.text.lab -side top -fill x - - frame $wi.text.format - - set fontmenu [tk_optionMenu $wi.text.format.fontmenu fontfamily "$fontfamily"] - set sizemenu [tk_optionMenu $wi.text.format.fontsize fontsize "$fontsize"] - - - # color selection - if { $color == "" } { - set color $defTextColor - } - button $wi.text.format.fg -text "Text color" -command \ - "popupColor fg $wi.text.lab.name false" - checkbutton $wi.text.format.bold -text "Bold" -variable textBold \ - -command [list fontupdate $wi.text.lab.name bold] - checkbutton $wi.text.format.italic -text "Italic" -variable textItalic \ - -command [list fontupdate $wi.text.lab.name italic] - checkbutton $wi.text.format.underline -text "Underline" \ - -variable textUnderline \ - -command [list fontupdate $wi.text.lab.name underline] - - if {$textBold == 1} { $wi.text.format.bold select - } else { $wi.text.format.bold deselect } - if {$textItalic == 1} { $wi.text.format.italic select - } else { $wi.text.format.italic deselect } - if {$textUnderline == 1} { $wi.text.format.underline select - } else { $wi.text.format.underline deselect } - - pack $wi.text.format.fontmenu \ - $wi.text.format.fontsize \ - $wi.text.format.fg \ - $wi.text.format.bold \ - $wi.text.format.italic \ - $wi.text.format.underline \ - -side left -pady 2 - - pack $wi.text.format -side top -fill x - - pack $wi.text -side top -fill x - - fontupdate $wi.text.lab.name fontfamily $fontfamily - fontupdate $wi.text.lab.name fontsize $fontsize - - $fontmenu delete 0 - foreach f [lsort -dictionary [font families]] { - $fontmenu add radiobutton -value "$f" -label $f \ - -variable fontfamily \ - -command [list fontupdate $wi.text.lab.name fontfamily $f] - } - - $sizemenu delete 0 - foreach f {8 9 10 11 12 14 16 18 20 22 24 26 28 36 48 72} { - $sizemenu add radiobutton -value "$f" -label $f \ - -variable fontsize \ - -command [list fontupdate $wi.text.lab.name fontsize $f] - } - -if { "$annotationType" == "rectangle" || "$annotationType" == "oval" } { - - # fill color, border color - frame $wi.colors -relief groove -bd 2 - # color selection controls - label $wi.colors.label -text "Fill color:" - - label $wi.colors.color -text $color -width 8 \ - -bg $color -fg $lcolor - button $wi.colors.bg -text "Color" -command \ - "popupColor bg $wi.colors.color true" - pack $wi.colors.label $wi.colors.color $wi.colors.bg \ - -side left -padx 2 -pady 2 -anchor w -fill x - pack $wi.colors -side top -fill x - - # border selection controls - frame $wi.border -relief groove -bd 2 - label $wi.border.label -text "Border color:" - label $wi.border.color -text $bordercolor -width 8 \ - -bg $color -fg $bordercolor - label $wi.border.width_label -text "Border width:" - set widthMenu [tk_optionMenu $wi.border.width width "$width"] - $widthMenu delete 0 - foreach f {0 1 2 3 4 5 6 7 8 9 10} { - $widthMenu add radiobutton -value $f -label $f \ - -variable width - } - button $wi.border.fg -text "Color" -command \ - "popupColor fg $wi.border.color true" - pack $wi.border.label $wi.border.color $wi.border.fg \ - $wi.border.width_label $wi.border.width \ - $wi.border.fg $wi.border.color $wi.border.label \ - -side left -padx 2 -pady 2 -anchor w -fill x - pack $wi.border -side top -fill x - -} - -if { $annotationType == "rectangle" } { - frame $wi.radius -relief groove -bd 2 - scale $wi.radius.rad -from 0 -to [expr int($maxrad)] \ - -length 400 -variable rad \ - -orient horizontal -label "Radius of the bend at the corners: " \ - -tickinterval [expr int($maxrad / 15) + 1] -showvalue true - pack $wi.radius.rad -side left -padx 2 -pady 2 -anchor w -fill x - pack $wi.radius -side top -fill x -} - - # Add new oval or modify old one? - if { $modify == "true" } { - set cancelcmd "destroy $wi" - set applytext "Modify $annotationType" - } else { - set cancelcmd "destroy $wi; destroyNewRect $c" - set applytext "Add $annotationType" - } - - frame $wi.butt -borderwidth 6 - button $wi.butt.apply -text $applytext -command "popupAnnotationApply $c $wi $target $annotationType" - - button $wi.butt.cancel -text "Cancel" -command $cancelcmd - bind $wi "$cancelcmd" - bind $wi "popupAnnotationApply $c $wi $target $annotationType" - pack $wi.butt.cancel $wi.butt.apply -side right - pack $wi.butt -side bottom - - after 100 { - grab .popup - } - return -} - -# helper for popupOvalDialog and popupOvalApply -proc destroyNewRect { c } { - global newrect - $c delete -withtags newrect - set newrect "" -} - - -proc popupAnnotationApply { c wi target type } { - global newrect newoval annotation_list - global $target - global changed - global width rad - global fontfamily fontsize textBold textItalic textUnderline - - # attributes - set caption [string trim [$wi.text.lab.name get]] - set labelcolor [$wi.text.lab.name cget -fg] - set coords [$c coords "$target"] - set iconcoords "iconcoords" - - if {"$type" == "rectangle" || "$type" == "oval" } { - set color [$wi.colors.color cget -text] - set bordercolor [$wi.border.color cget -text] - } - - if { $target == 0 } { - # Create a new annotation object - set target [newObjectId annotation] - global $target - lappend annotation_list $target - if {"$type" == "rectangle" } { - set coords [$c coords $newrect] - } elseif { "$type" == "oval" } { - set coords [$c coords $newoval] - } - } else { - set coords [getNodeCoords $target] - } - set $target {} - lappend $iconcoords $coords - lappend $target $iconcoords "label {$caption}" "labelcolor $labelcolor" \ - "fontfamily {$fontfamily}" "fontsize $fontsize" - if {"$type" == "rectangle" || "$type" == "oval" } { - lappend $target "color $color" "width $width" "border $bordercolor" - } - if {"$type" == "rectangle" } { - lappend $target "rad $rad" - } - - set ef {} - if {"$textBold" == 1} { lappend ef bold} - if {"$textItalic" == 1} { lappend ef italic} - if {"$textUnderline" == 1} { lappend ef underline} - if {"$ef" != ""} { lappend $target "effects {$ef}"} - - # draw it - if { $type == "rectangle" } { - drawRect $target - destroyNewRect $c - } elseif { $type == "oval" } { - drawOval $target - destroyNewoval $c - } elseif { $type == "text" } { - drawText $target - } - - set changed 1 - updateUndoLog - redrawAll - destroy $wi -} - -proc selectmarkEnter {c x y} { - set isThruplot false - - if {$c == ".c"} { - set obj [lindex [$c gettags current] 1] - set type [nodeType $obj] - if {$type != "oval" && $type != "rectangle"} { return } - } else { - set obj $c - set c .c - set isThruplot true - } - set bbox [$c bbox $obj] - - set x1 [lindex $bbox 0] - set y1 [lindex $bbox 1] - set x2 [lindex $bbox 2] - set y2 [lindex $bbox 3] - - if {$isThruplot == true} { - set x [expr $x+$x1] - set y [expr $y+$y1] - - } - set l 0 ;# left - set r 0 ;# right - set u 0 ;# up - set d 0 ;# down - - set x [$c canvasx $x] - set y [$c canvasy $y] - - if { $x < [expr $x1+($x2-$x1)/8.0]} { set l 1 } - if { $x > [expr $x2-($x2-$x1)/8.0]} { set r 1 } - if { $y < [expr $y1+($y2-$y1)/8.0]} { set u 1 } - if { $y > [expr $y2-($y2-$y1)/8.0]} { set d 1 } - - if {$l==1} { - if {$u==1} { - $c config -cursor top_left_corner - } elseif {$d==1} { - $c config -cursor bottom_left_corner - } else { - $c config -cursor left_side - } - } elseif {$r==1} { - if {$u==1} { - $c config -cursor top_right_corner - } elseif {$d==1} { - $c config -cursor bottom_right_corner - } else { - $c config -cursor right_side - } - } elseif {$u==1} { - $c config -cursor top_side - } elseif {$d==1} { - $c config -cursor bottom_side - } else { - $c config -cursor left_ptr - } -} - -proc selectmarkLeave {c x y} { - global thruplotResize - .bottom.textbox config -text {} - - # cursor options for thruplot resize - if {$thruplotResize == true} { - - } else { - # no resize update cursor - $c config -cursor left_ptr - } -} - - -proc textEnter { c x y } { - global annotation_list - global curcanvas - - set object [newObjectId annotation] - set newtext [$c create text $x $y -text "" \ - -anchor w -justify left -tags "text $object annotation"] - - set coords [$c coords "text && $object"] - set iconcoords "iconcoords" - - global $object - set $object {} - setType $object "text" - lappend $iconcoords $coords - lappend $object $iconcoords - lappend $object "label {}" - setNodeCanvas $object $curcanvas - - lappend annotation_list $object - popupAnnotationDialog $c $object "false" -} - - -proc drawText {text} { - global $text defTextColor defTextFont defTextFontFamily defTextFontSize - global zoom curcanvas newfontsize - - set coords [getNodeCoords $text] - if { [llength $coords] < 2 } { - puts "Bad coordinates for text $text" - return - } - set x [expr {[lindex $coords 0] * $zoom}] - set y [expr {[lindex $coords 1] * $zoom}] - set color [lindex [lsearch -inline [set $text] "labelcolor *"] 1] - if { $color == "" } { - set color $defTextColor - } - set label [lindex [lsearch -inline [set $text] "label *"] 1] - set fontfamily [lindex [lsearch -inline [set $text] "fontfamily *"] 1] - set fontsize [lindex [lsearch -inline [set $text] "fontsize *"] 1] - if { $fontfamily == "" } { - set fontfamily $defTextFontFamily - } - if { $fontsize == "" } { - set fontsize $defTextFontSize - } - set newfontsize $fontsize - set font [list "$fontfamily" $fontsize] - set effects [lindex [lsearch -inline [set $text] "effects *"] 1] - set newtext [.c create text $x $y -text $label -anchor w \ - -font "$font $effects" -justify left -fill $color \ - -tags "text $text annotation"] - - .c addtag text withtag $newtext - .c raise $text background - setNodeCanvas $text $curcanvas - setType $text "text" -} - - -proc fontupdate { label type args} { - global fontfamily fontsize - global textBold textItalic textUnderline - - if {"$textBold" == 1} {set bold "bold"} else {set bold {} } - if {"$textItalic"} {set italic "italic"} else {set italic {} } - if {"$textUnderline"} {set underline "underline"} else {set underline {} } - switch $type { - fontsize { - set fontsize $args - } - fontfamily { - set fontfamily "$args" - } - } - set f [list "$fontfamily" $fontsize] - lappend f "$bold $italic $underline" - $label configure -font "$f" -} - - -proc drawAnnotation { obj } { - switch -exact -- [nodeType $obj] { - oval { - drawOval $obj - } - rectangle { - drawRect $obj - } - text { - drawText $obj - } - } -} - -# shift annotation coordinates by dx, dy; does not redraw the annotation -proc moveAnnotation { obj dx dy } { - set coords [getNodeCoords $obj] - lassign $coords x1 y1 x2 y2 - set pt1 "[expr {$x1 + $dx}] [expr {$y1 + $dy}]" - if { [nodeType $obj] == "text" } { - # shift one point - setNodeCoords $obj $pt1 - } else { ;# oval/rectangle - # shift two points - set pt2 "[expr {$x2 + $dx}] [expr {$y2 + $dy}]" - setNodeCoords $obj "$pt1 $pt2" - } -} diff --git a/gui/api.tcl b/gui/api.tcl deleted file mode 100644 index 1801f82c..00000000 --- a/gui/api.tcl +++ /dev/null @@ -1,3296 +0,0 @@ -# version of the API document that is used -set CORE_API_VERSION 1.23 - -set DEFAULT_API_PORT 4038 -set g_api_exec_num 100; # starting execution number - -# set scale for X/Y coordinate translation -set XSCALE 1.0 -set YSCALE 1.0 -set XOFFSET 0 -set YOFFSET 0 - -# current session; 0 is a new session -set g_current_session 0 -set g_session_dialog_hint 1 - -# this is an array of lists, with one array entry for each widget or callback, -# and the entry is a list of execution numbers (for matching replies with -# requests) -array set g_execRequests { shell "" observer "" } - -# for a simulator, uncomment this line or cut/paste into debugger: -# set XSCALE 4.0; set YSCALE 4.0; set XOFFSET 1800; set YOFFSET 300 - -array set nodetypes { 0 def 1 phys 2 tbd 3 tbd 4 lanswitch 5 hub \ - 6 wlan 7 rj45 8 tunnel 9 ktunnel 10 emane } - -array set regtypes { wl 1 mob 2 util 3 exec 4 gui 5 emul 6 } -array set regntypes { 1 wl 2 mob 3 util 4 exec 5 gui 6 emul 7 relay 10 session } -array set regtxttypes { wl "Wireless Module" mob "Mobility Module" \ - util "Utility Module" exec "Execution Server" \ - gui "Graphical User Interface" emul "Emulation Server" \ - relay "Relay" } -set DEFAULT_GUI_REG "gui core_2d_gui" -array set eventtypes { definition_state 1 configuration_state 2 \ - instantiation_state 3 runtime_state 4 \ - datacollect_state 5 shutdown_state 6 \ - event_start 7 event_stop 8 event_pause 9 \ - event_restart 10 file_open 11 file_save 12 \ - event_scheduled 31 } - -set CORE_STATES \ - "NONE DEFINITION CONFIGURATION INSTANTIATION RUNTIME DATACOLLECT SHUTDOWN" - -set EXCEPTION_LEVELS \ - "NONE FATAL ERROR WARNING NOTICE" - -# Event handler invoked for each message received by peer -proc receiveMessage { channel } { - global curcanvas showAPI - set prmsg $showAPI - set type 0 - set flags 0 - set len 0 - set seq 0 - - #puts "API receive data." - # disable the fileevent here, then reinstall the handler at the end - fileevent $channel readable "" - # channel closed - if { [eof $channel] } { - resetChannel channel 1 - return - } - - # - # read first four bytes of message header - set more_data 1 - while { $more_data == 1 } { - if { [catch { set bytes [read $channel 4] } e] } { - # in tcl8.6 this occurs during shutdown - #puts "channel closed: $e" - break; - } - if { [fblocked $channel] == 1} { - # 4 bytes not available yet - break; - } elseif { [eof $channel] } { - resetChannel channel 1 - break; - } elseif { [string bytelength $bytes] == 0 } { - # zero bytes read - parseMessageHeader would fail - break; - } - # parse type/flags/length - if { [parseMessageHeader $bytes type flags len] < 0 } { - # Message header error - break; - } - # read message data of specified length - set bytes [read $channel $len] - #if { $prmsg== 1} { - # puts "read $len bytes (type=$type, flags=$flags, len=$len)..." - #} - # handle each message type - switch -exact -- "$type" { - 1 { parseNodeMessage $bytes $len $flags } - 2 { parseLinkMessage $bytes $len $flags } - 3 { parseExecMessage $bytes $len $flags $channel } - 4 { parseRegMessage $bytes $len $flags $channel } - 5 { parseConfMessage $bytes $len $flags $channel } - 6 { parseFileMessage $bytes $len $flags $channel } - 8 { parseEventMessage $bytes $len $flags $channel } - 9 { parseSessionMessage $bytes $len $flags $channel } - 10 { parseExceptionMessage $bytes $len $flags $channel; - #7 { parseIfaceMessage $bytes $len $flags $channel } - # - } - default { puts "Unknown Message = $type" } - } - # end switch - } - # end while - - # update the canvas - catch { - # this messes up widgets - #raiseAll .c - .c config -cursor left_ptr ;# otherwise we have hourglass/pirate - update - } - - if {$channel != -1 } { - resetChannel channel 0 - } -} - -# -# Open an API socket to the specified server:port, prompt user for retry -# if specified; set the readable file event and parameters; -# returns the channel name or -1 on error. -# -proc openAPIChannel { server port retry } { - # use default values (localhost:4038) when none specified - if { $server == "" || $server == 0 } { - set server "localhost" - } - if { $port == 0 } { - global DEFAULT_API_PORT - set port $DEFAULT_API_PORT - } - - # loop when retry is true - set s -1 - while { $s < 0 } { - # TODO: fix this to remove lengthy timeout periods... - # (need to convert all channel I/O to use async channel) - # vwait doesn't work here, blocks on socket call - #puts "Connecting to $server:$port..."; # verbose - set svcstart [getServiceStartString] - set e "This feature requires a connection to the CORE daemon.\n" - set e "$e\nFailed to connect to $server:$port!\n" - set e "$e\nHave you started the CORE daemon with" - set e "$e '$svcstart'?" - if { [catch {set s [socket $server $port]} ex] } { - puts "\n$e\n (Error: $ex)" - set s -1 - if { ! $retry } { return $s; }; # error, don't retry - } - if { $s > 0 } { puts "connected." }; # verbose - if { $retry } {; # prompt user with retry dialog - if { $s < 0 } { - set choice [tk_dialog .connect "Error" $e \ - error 0 Retry "Start daemon..." Cancel] - if { $choice == 2 } { return $s } ;# cancel - if { $choice == 1 } { - set sudocmd "gksudo" - set cmd "core-daemon -d" - if { [catch {exec $sudocmd $cmd & } e] } { - puts "Error running '$sudocmd $cmd'!" - } - after 300 ;# allow time for daemon to start - } - # fall through for retry... - } - } - }; # end while - - # now we have a valid socket, set up encoding and receive event - fconfigure $s -blocking 0 -encoding binary -translation { binary binary } \ - -buffering full -buffersize 4096 - fileevent $s readable [list receiveMessage $s] - return $s -} - -# -# Reinstall the receiveMessage event handler -# -proc resetChannel { channel_ptr close } { - upvar 1 $channel_ptr channel - if {$close == 1} { - close $channel - pluginChannelClosed $channel - set $channel -1 - } - if { [catch { fileevent $channel readable \ - [list receiveMessage $channel] } ] } { - # may print error here - } -} - -# -# Catch errors when flushing sockets -# -proc flushChannel { channel_ptr msg } { - upvar 1 $channel_ptr channel - if { [catch { flush $channel } err] } { - puts "*** $msg: $err" - set channel -1 - return -1 - } - return 0 -} - - -# -# CORE message header -# -proc parseMessageHeader { bytes type flags len } { - # variables are passed by reference - upvar 1 $type mytype - upvar 1 $flags myflags - upvar 1 $len mylen - - # - # read the four-byte message header - # - if { [binary scan $bytes ccS mytype myflags mylen] != 3 } { - puts "*** warning: message header error" - return -1 - } else { - set mytype [expr {$mytype & 0xFF}]; # convert signed to unsigned - set myflags [expr {$myflags & 0xFF}] - if { $mylen == 0 } { - puts "*** warning: zero length message header!" - # empty the channel - #set bytes [read $channel] - return -1 - } - } - return 0 -} - - -# -# CORE API Node message TLVs -# -proc parseNodeMessage { data len flags } { - global node_list curcanvas c router eid showAPI nodetypes CORE_DATA_DIR - global XSCALE YSCALE XOFFSET YOFFSET deployCfgAPI_lock - #puts "Parsing node message of length=$len, flags=$flags" - set prmsg $showAPI - set current 0 - - array set typenames { 1 num 2 type 3 name 4 ipv4_addr 5 mac_addr \ - 6 ipv6_addr 7 model 8 emulsrv 10 session \ - 32 xpos 33 ypos 34 canv \ - 35 emuid 36 netid 37 services \ - 48 lat 49 long 50 alt \ - 66 icon 80 opaque } - array set typesizes { num 4 type 4 name -1 ipv4_addr 4 ipv6_addr 16 \ - mac_addr 8 model -1 emulsrv -1 session -1 \ - xpos 2 ypos 2 canv 2 emuid 4 \ - netid 4 services -1 lat 4 long 4 alt 4 \ - icon -1 opaque -1 } - array set vals { num 0 type 0 name "" ipv4_addr -1 ipv6_addr -1 \ - mac_addr -1 model "" emulsrv "" session "" \ - xpos 0 ypos 0 canv "" \ - emuid -1 netid -1 services "" \ - lat 0 long 0 alt 0 \ - icon "" opaque "" } - - if { $prmsg==1 } { puts -nonewline "NODE(flags=$flags," } - - # - # TLV parsing - # - while { $current < $len } { - # TLV header - if { [binary scan $data @${current}cc type length] != 2 } { - puts "TLV header error" - break - } - set length [expr {$length & 0xFF}]; # convert signed to unsigned - if { $length == 0 } {; # prevent endless looping - if { $type == 0 } { puts -nonewline "(extra padding)"; break - } else { puts "Found zero-length TLV for type=$type, dropping."; - break } - } - set pad [pad_32bit $length] - # verbose debugging - #puts "tlv type=$type length=$length pad=$pad current=$current" - incr current 2 - - if {![info exists typenames($type)] } { ;# unknown TLV type - if { $prmsg } { puts -nonewline "unknown=$type," } - incr current $length - continue - } - set typename $typenames($type) - set size $typesizes($typename) - # 32-bit and 64-bit vals pre-padded - if { $size == 4 || $size == 8 } { incr current $pad } - # read TLV data depending on size - switch -exact -- "$size" { - 2 { binary scan $data @${current}S vals($typename) } - 4 { binary scan $data @${current}I vals($typename) } - 8 { binary scan $data @${current}W vals($typename) } - 16 { binary scan $data @${current}c16 vals($typename) } - -1 { binary scan $data @${current}a${length} vals($typename) } - } - if { $size == -1 } { incr current $pad } ;# string vals post-padded - if { $type == 6 } { incr current $pad } ;# 128-bit vals post-padded - incr current $length - # special handling of data here - switch -exact -- "$typename" { - ipv4_addr { array set vals [list $typename \ - [ipv4ToString $vals($typename)] ] } - mac_addr { array set vals [list $typename \ - [macToString $vals($typename)] ] } - ipv6_addr { array set vals [list $typename \ - [ipv6ToString $vals($typename)] ] } - xpos { array set vals [list $typename \ - [expr { ($vals($typename) * $XSCALE) - $XOFFSET }] ] } - ypos { array set vals [list $typename \ - [expr { ($vals($typename) * $YSCALE) - $YOFFSET }] ] } - } - if { $prmsg } { puts -nonewline "$typename=$vals($typename)," } - } - - if { $prmsg } { puts ") "} - - # - # Execution - # - # TODO: enforce message parameters here - if { ![info exists nodetypes($vals(type))] } { - puts "NODE: invalid node type ($vals(type)), dropping"; return - } - set node "n$vals(num)" - set node_id "$eid\_$node" - if { [lsearch $node_list $node] == -1 } {; # check for node existance - set exists false - } else { - set exists true - } - - if { $vals(name) == "" } {; # make sure there is a node name - set name $node - if { $exists } { set name [getNodeName $node] } - array set vals [list name $name] - } - if { $exists } { - if { $flags == 1 } { - puts "Node add msg but node ($node) already exists, dropping." - return - } - } elseif { $flags != 1 } { - puts -nonewline "Node modify/delete message but node ($node) does " - puts "not exist dropping." - return - } - if { $vals(icon) != "" } { - set icon $vals(icon) - if { [file pathtype $icon] == "relative" } { - set icon "$CORE_DATA_DIR/icons/normal/$icon" - } - if { ![file exists $icon ] } { - puts "Node icon '$vals(icon)' does not exist." - array set vals [list icon ""] - } else { - array set vals [list icon $icon] - } - } - global $node - - set wlans_needing_update { } - if { $vals(emuid) != -1 } { - # For Linux populate ngnodeidmap for later use with wireless; it is treated as - # a hex value string (without the leading "0x") - global ngnodeidmap - foreach wlan [findWlanNodes $node] { - if { ![info exists ngnodeidmap($eid\_$wlan)] } { - set netid [string range $wlan 1 end] - set emulation_type [lindex [getEmulPlugin $node] 1] - # TODO: verify that this incr 1000 is for OpenVZ - if { $emulation_type == "openvz" } { incr netid 1000 } - set ngnodeidmap($eid\_$wlan) [format "%x" $netid] - } - if { ![info exists ngnodeidmap($eid\_$wlan-$node)] } { - set ngnodeidmap($eid\_$wlan-$node) [format "%x" $vals(emuid)] - lappend wlans_needing_update $wlan - } - } ;# end foreach wlan - } - - # local flags: informational message that node was added or deleted - if {[expr {$flags & 0x8}]} { - if { ![info exists c] } { return } - if {[expr {$flags & 0x1}] } { ;# add flag - nodeHighlights $c $node on green - after 3000 "nodeHighlights .c $node off green" - } elseif {[expr {$flags & 0x2}] } { ;# delete flag - nodeHighlights $c $node on black - after 3000 "nodeHighlights .c $node off black" - } - # note: we may want to save other data passed in this message here - # rather than just returning... - return - } - # now we have all the information about this node - switch -exact -- "$flags" { - 0 { apiNodeModify $node vals } - 1 { apiNodeCreate $node vals } - 2 { apiNodeDelete $node } - default { puts "NODE: unsupported flags ($flags)"; return } - } -} - -# -# modify a node -# -proc apiNodeModify { node vals_ref } { - global c eid zoom curcanvas - upvar $vals_ref vals - if { ![info exists c] } { return } ;# batch mode - set draw 0 - if { $vals(icon) != "" } { - setCustomImage $node $vals(icon) - set draw 1 - } - # move the node and its links - if {$vals(xpos) != 0 && $vals(ypos) != 0} { - moveNodeAbs $c $node [expr {$zoom * $vals(xpos)}] \ - [expr {$zoom * $vals(ypos)}] - } - if { $vals(name) != "" } { - setNodeName $node $vals(name) - set draw 1 - } - if { $vals(services) != "" } { - set services [split $vals(services) |] - setNodeServices $node $services - } - # TODO: handle other optional on-screen data - # lat, long, alt, heading, platform type, platform id - if { $draw && [getNodeCanvas $node] == $curcanvas } { - .c delete withtag "node && $node" - .c delete withtag "nodelabel && $node" - drawNode .c $node - } -} - -# -# add a node -# -proc apiNodeCreate { node vals_ref } { - global $node nodetypes node_list canvas_list curcanvas eid - upvar $vals_ref vals - - # create GUI object - set nodetype $nodetypes($vals(type)) - set nodename $vals(name) - if { $nodetype == "emane" } { set nodetype "wlan" } ;# special case - EMANE - if { $nodetype == "def" } { set nodetype "router" } - newNode [list $nodetype $node] ;# use node number supplied from API message - setNodeName $node $nodename - if { $vals(canv) == "" } { - setNodeCanvas $node $curcanvas - } else { - set canv $vals(canv) - if { ![string is integer $canv] || $canv < 0 || $canv > 100} { - puts "warning: invalid canvas '$canv' in Node message!" - return - } - set canv "c$canv" - if { [lsearch $canvas_list $canv] < 0 && $canv == "c0" } { - # special case -- support old imn files with Canvas0 - global $canv - lappend canvas_list $canv - set $canv {} - setCanvasName $canv "Canvas0" - set curcanvas $canv - switchCanvas none - } else { - while { [lsearch $canvas_list $canv] < 0 } { - set canvnew [newCanvas ""] - switchCanvas none ;# redraw canvas tabs - } - } - setNodeCanvas $node $canv - } - setNodeCoords $node "$vals(xpos) $vals(ypos)" - lassign [getDefaultLabelOffsets [nodeType $node]] dx dy - setNodeLabelCoords $node "[expr $vals(xpos) + $dx] [expr $vals(ypos) + $dy]" - setNodeLocation $node $vals(emulsrv) - if { $vals(icon) != "" } { - setCustomImage $node $vals(icon) - } - drawNode .c $node - - set model $vals(model) - if { $model != "" && $vals(type) < 4} { - # set model only for (0 def 1 phys 2 tbd 3 tbd) 4 lanswitch - setNodeModel $node $model - if { [lsearch -exact [getNodeTypeNames] $model] == -1 } { - puts "warning: unknown node type '$model' in Node message!" - } - } - if { $vals(services) != "" } { - set services [split $vals(services) |] - setNodeServices $node $services - } - - if { $vals(type) == 7 } { ;# RJ45 node - used later to control linking - netconfInsertSection $node [list model $vals(model)] - } elseif { $vals(type) == 10 } { ;# EMANE node - set section [list mobmodel coreapi ""] - netconfInsertSection $node $section - #set sock [lindex [getEmulPlugin $node] 2] - #sendConfRequestMessage $sock $node "all" 0x1 -1 "" - } elseif { $vals(type) == 6 } { ;# WLAN node - if { $vals(opaque) != "" } { - # treat opaque as a list to accomodate other data - set i [lsearch $vals(opaque) "range=*"] - if { $i != -1 } { - set range [lindex $vals(opaque) $i] - setNodeRange $node [lindex [split $range =] 1] - } - } - } -} - -# -# delete a node -# -proc apiNodeDelete { node } { - removeGUINode $node -} - -# -# CORE API Link message TLVs -# -proc parseLinkMessage { data len flags } { - global router def_router_model eid - global link_list node_list ngnodeidmap ngnodeidrmap showAPI execMode - set prmsg $showAPI - set current 0 - set c .c - #puts "Parsing link message of length=$len, flags=$flags" - - array set typenames { 1 node1num 2 node2num 3 delay 4 bw 5 per \ - 6 dup 7 jitter 8 mer 9 burst 10 session \ - 16 mburst 32 ltype 33 guiattr 34 uni \ - 35 emuid1 36 netid 37 key \ - 48 if1num 49 if1ipv4 50 if1ipv4mask 51 if1mac \ - 52 if1ipv6 53 if1ipv6mask \ - 54 if2num 55 if2ipv4 56 if2ipv4mask 57 if2mac \ - 64 if2ipv6 65 if2ipv6mask } - array set typesizes { node1num 4 node2num 4 delay 8 bw 8 per -1 \ - dup -1 jitter 8 mer 2 burst 2 session -1 \ - mburst 2 ltype 4 guiattr -1 uni 2 \ - emuid1 4 netid 4 key 4 \ - if1num 2 if1ipv4 4 if1ipv4mask 2 if1mac 8 \ - if1ipv6 16 if1ipv6mask 2 \ - if2num 2 if2ipv4 4 if2ipv4mask 2 if2mac 8 \ - if2ipv6 16 if2ipv6mask 2 } - array set vals { node1num -1 node2num -1 delay 0 bw 0 per "" \ - dup "" jitter 0 mer 0 burst 0 session "" \ - mburst 0 ltype 0 guiattr "" uni 0 \ - emuid1 -1 netid -1 key -1 \ - if1num -1 if1ipv4 -1 if1ipv4mask 24 if1mac -1 \ - if1ipv6 -1 if1ipv6mask 64 \ - if2num -1 if2ipv4 -1 if2ipv4mask 24 if2mac -1 \ - if2ipv6 -1 if2ipv6mask 64 } - set emuid1 -1 - - if { $prmsg==1 } { puts -nonewline "LINK(flags=$flags," } - - # - # TLV parsing - # - while { $current < $len } { - # TLV header - if { [binary scan $data @${current}cc type length] != 2 } { - puts "TLV header error" - break - } - set length [expr {$length & 0xFF}]; # convert signed to unsigned - if { $length == 0 } {; # prevent endless looping - if { $type == 0 } { puts -nonewline "(extra padding)"; break - } else { puts "Found zero-length TLV for type=$type, dropping."; - break } - } - set pad [pad_32bit $length] - # verbose debugging - #puts "tlv type=$type length=$length pad=$pad current=$current" - incr current 2 - - if {![info exists typenames($type)] } { ;# unknown TLV type - if { $prmsg } { puts -nonewline "unknown=$type," } - incr current $length - continue - } - set typename $typenames($type) - set size $typesizes($typename) - # 32-bit and 64-bit vals pre-padded - if { $size == 4 || $size == 8} { incr current $pad } - # read TLV data depending on size - switch -exact -- "$size" { - 2 { binary scan $data @${current}S vals($typename) } - 4 { binary scan $data @${current}I vals($typename) } - 8 { binary scan $data @${current}W vals($typename) } - 16 { binary scan $data @${current}c16 vals($typename) } - -1 { binary scan $data @${current}a${length} vals($typename) } - } - incr current $length - # special handling of data here - switch -exact -- "$typename" { - delay - - jitter { if { $vals($typename) > 2000000 } { - array set vals [list $typename 2000000] } } - bw { if { $vals($typename) > 1000000000 } { - array set vals [list $typename 0] } } - per { if { $vals($typename) > 100 } { - array set vals [list $typename 100] } } - dup { if { $vals($typename) > 50 } { - array set vals [list $typename 50] } } - emuid1 { if { $emuid1 == -1 } { - set emuid $vals($typename) - } else { ;# this sets emuid2 if we already have emuid1 - array set vals [list emuid2 $vals($typename) ] - array set vals [list emuid1 $emuid1 ] - } - } - if1ipv4 - - if2ipv4 { array set vals [list $typename \ - [ipv4ToString $vals($typename)] ] } - if1mac - - if2mac { array set vals [list $typename \ - [macToString $vals($typename)] ] } - if1ipv6 - - if2ipv6 { array set vals [list $typename \ - [ipv6ToString $vals($typename)] ] } - } - if { $prmsg } { puts -nonewline "$typename=$vals($typename)," } - if { $size == 16 } { incr current $pad } ;# 128-bit vals post-padded - if { $size == -1 } { incr current $pad } ;# string vals post-padded - } - - if { $prmsg == 1 } { puts ") " } - - # perform some sanity checking of the link message - if { $vals(node1num) == $vals(node2num) || \ - $vals(node1num) < 0 || $vals(node2num) < 0 } { - puts -nonewline "link message error - node1=$vals(node1num), " - puts "node2=$vals(node2num)" - return - } - - # convert node number to node and check for node existance - set node1 "n$vals(node1num)" - set node2 "n$vals(node2num)" - if { [lsearch $node_list $node1] == -1 || \ - [lsearch $node_list $node2] == -1 } { - puts "Node ($node1/$node2) in link message not found, dropping" - return - } - - # set IPv4 and IPv6 address if specified, otherwise may be automatic - set prefix1 [chooseIfName $node1 $node2] - set prefix2 [chooseIfName $node2 $node1] - foreach i "1 2" { - # set interface name/number - if { $vals(if${i}num) == -1 } { - set ifname [newIfc [set prefix${i}] [set node${i}]] - set prefixlen [string length [set prefix${i}]] - set if${i}num [string range $ifname $prefixlen end] - array set vals [list if${i}num [set if${i}num]] - } - set ifname [set prefix${i}]$vals(if${i}num) - array set vals [list if${i}name $ifname] - # record IPv4/IPv6 addresses for newGUILink - foreach j "4 6" { - if { $vals(if${i}ipv${j}) != -1 } { - setIfcIPv${j}addr [set node${i}] $ifname \ - $vals(if${i}ipv${j})/$vals(if${i}ipv${j}mask) - } - } - if { $vals(if${i}mac) != -1 } { - setIfcMacaddr [set node${i}] $ifname $vals(if${i}mac) - } - } - # adopt network address for WLAN (WLAN must be node 1) - if { [nodeType $node1] == "wlan" } { - set v4addr $vals(if2ipv4) - if { $v4addr != -1 } { - set v4net [ipv4ToNet $v4addr $vals(if2ipv4mask)] - setIfcIPv4addr $node1 wireless "$v4net/$vals(if2ipv4mask)" - } - set v6addr $vals(if2ipv6) - if { $v6addr != -1 } { - set v6net [ipv6ToNet $v6addr $vals(if2ipv6mask)] - setIfcIPv6addr $node1 wireless "${v6net}::0/$vals(if2ipv6mask)" - } - } - - if { $execMode == "batch" } { - return ;# no GUI to update in batch mode - } - # treat 100% loss as link delete - if { $flags == 0 && $vals(per) == 100 } { - apiLinkDelete $node1 $node2 vals - return - } - - # now we have all the information about this node - switch -exact -- "$flags" { - 0 { apiLinkAddModify $node1 $node2 vals 0 } - 1 { apiLinkAddModify $node1 $node2 vals 1 } - 2 { apiLinkDelete $node1 $node2 vals } - default { puts "LINK: unsupported flags ($flags)"; return } - } -} - -# -# add or modify a link -# if add flag is set, check if two nodes are part of same wlan, and do wlan -# linkage, or add a wired link; otherwise modify wired/wireless link with -# supplied parameters -proc apiLinkAddModify { node1 node2 vals_ref add } { - global eid defLinkWidth - set c .c - upvar $vals_ref vals - - if {$vals(key) > -1} { - if { [nodeType $node1] == "tunnel" } { - netconfInsertSection $node1 [list "tunnel-key" $vals(key)] - } - if { [nodeType $node2] == "tunnel" } { - netconfInsertSection $node2 [list "tunnel-key" $vals(key)] - } - } - - # look for a wired link in the link list - set wired_link [linkByPeers $node1 $node2] - if { $wired_link != "" && $add == 0 } { ;# wired link exists, modify it - #puts "modify wired link" - if { $vals(uni) == 1 } { ;# unidirectional link effects message - set peers [linkPeers $wired_link] - if { $node1 == [lindex $peers 0] } { ;# downstream n1 <-- n2 - set bw [list $vals(bw) [getLinkBandwidth $wired_link up]] - set delay [list $vals(delay) [getLinkDelay $wired_link up]] - set per [list $vals(per) [getLinkBER $wired_link up]] - set dup [list $vals(dup) [getLinkBER $wired_link up]] - set jitter [list $vals(jitter) [getLinkJitter $wired_link up]] - } else { ;# upstream n1 --> n2 - set bw [list [getLinkBandwidth $wired_link] $vals(bw)] - set delay [list [getLinkDelay $wired_link] $vals(delay)] - set per [list [getLinkBER $wired_link] $vals(per)] - set dup [list [getLinkBER $wired_link] $vals(dup)] - set jitter [list $vals(jitter) [getLinkJitter $wired_link]] - } - setLinkBandwidth $wired_link $bw - setLinkDelay $wired_link $delay - setLinkBER $wired_link $per - setLinkDup $wired_link $dup - setLinkJitter $wired_link $jitter - } else { - setLinkBandwidth $wired_link $vals(bw) - setLinkDelay $wired_link $vals(delay) - setLinkBER $wired_link $vals(per) - setLinkDup $wired_link $vals(dup) - setLinkJitter $wired_link $vals(jitter) - } - updateLinkLabel $wired_link - updateLinkGuiAttr $wired_link $vals(guiattr) - return - # if add flag is set and a wired link already exists, assume wlan linkage - # special case: rj45 model=1 means link via wireless - } elseif {[nodeType $node1] == "rj45" || [nodeType $node2] == "rj45"} { - if { [nodeType $node1] == "rj45" } { - set rj45node $node1; set othernode $node2; - } else { set rj45node $node2; set othernode $node1; } - if { [netconfFetchSection $rj45node model] == 1 } { - set wlan [findWlanNodes $othernode] - if {$wlan != ""} {newGUILink $wlan $rj45node};# link rj4node to wlan - } - } - - # no wired link; determine if both nodes belong to the same wlan, and - # link them; otherwise add a wired link if add flag is set - set wlan $vals(netid) - if { $wlan < 0 } { - # WLAN not specified with netid, search for common WLAN - set wlans1 [findWlanNodes $node1] - set wlans2 [findWlanNodes $node2] - foreach w $wlans1 { - if { [lsearch -exact $wlans2 $w] < 0 } { continue } - set wlan $w - break - } - } - - if { $wlan < 0 } { ;# no common wlan - if {$add == 1} { ;# add flag was set - add a wired link - global g_newLink_ifhints - set g_newLink_ifhints [list $vals(if1name) $vals(if2name)] - newGUILink $node1 $node2 - if { [getNodeCanvas $node1] != [getNodeCanvas $node2] } { - set wired_link [linkByPeersMirror $node1 $node2] - } else { - set wired_link [linkByPeers $node1 $node2] - } - setLinkBandwidth $wired_link $vals(bw) - setLinkDelay $wired_link $vals(delay) - setLinkBER $wired_link $vals(per) - setLinkDup $wired_link $vals(dup) - setLinkJitter $wired_link $vals(jitter) - updateLinkLabel $wired_link - updateLinkGuiAttr $wired_link $vals(guiattr) - # adopt link effects for WLAN (WLAN must be node 1) - if { [nodeType $node1] == "wlan" } { - setLinkBandwidth $node1 $vals(bw) - setLinkDelay $node1 $vals(delay) - setLinkBER $node1 $vals(per) - } - return - } else { ;# modify link, but no wired link or common wlan! - puts -nonewline "link modify message received, but no wired link" - puts " or wlan for nodes $node1-$node2, dropping" - return - } - } - - set wlan "n$wlan" - drawWlanLink $node1 $node2 $wlan -} - -# -# delete a link -# -proc apiLinkDelete { node1 node2 vals_ref } { - global eid - upvar $vals_ref vals - set c .c - - # look for a wired link in the link list - set wired_link [linkByPeers $node1 $node2] - if { $wired_link != "" } { - removeGUILink $wired_link non-atomic - return - } - - set wlan $vals(netid) - if { $wlan < 0 } { - # WLAN not specified with netid, search for common WLAN - set wlans1 [findWlanNodes $node1] - set wlans2 [findWlanNodes $node2] - foreach w $wlans1 { - if { [lsearch -exact $wlans2 $w] < 0 } { continue } - set wlan $w - break - } - } - if { $wlan < 0 } { - puts "apiLinkDelete: no common WLAN!" - return - } - set wlan "n$wlan" - - # look for wireless link on the canvas, remove GUI object - $c delete -withtags "wlanlink && $node2 && $node1 && $wlan" - $c delete -withtags "linklabel && $node2 && $node1 && $wlan" -} - -# -# CORE API Execute message TLVs -# -proc parseExecMessage { data len flags channel } { - global node_list curcanvas c router eid showAPI - global XSCALE YSCALE XOFFSET YOFFSET - set prmsg $showAPI - set current 0 - - # set default values - set nodenum 0 - set execnum 0 - set exectime 0 - set execcmd "" - set execres "" - set execstatus 0 - set session "" - - if { $prmsg==1 } { puts -nonewline "EXEC(flags=$flags," } - - # parse each TLV - while { $current < $len } { - # TLV header - set typelength [parseTLVHeader $data current] - set type [lindex $typelength 0] - set length [lindex $typelength 1] - if { $length == 0 || $length == "" } { break } - set pad [pad_32bit $length] - # verbose debugging - #puts "exec tlv type=$type length=$length pad=$pad current=$current" - if { [expr {$current + $length + $pad}] > $len } { - puts "error with EXEC message length (len=$len, TLV length=$length)" - break - } - # TLV data - switch -exact -- "$type" { - 1 { - incr current $pad - binary scan $data @${current}I nodenum - if { $prmsg==1 } { puts -nonewline "node=$nodenum/" } - } - 2 { - incr current $pad - binary scan $data @${current}I execnum - if { $prmsg == 1} { puts -nonewline "exec=$execnum," } - } - 3 { - incr current $pad - binary scan $data @${current}I exectime - if { $prmsg == 1} { puts -nonewline "time=$exectime," } - } - 4 { - binary scan $data @${current}a${length} execcmd - if { $prmsg == 1} { puts -nonewline "cmd=$execcmd," } - incr current $pad - } - 5 { - binary scan $data @${current}a${length} execres - if { $prmsg == 1} { puts -nonewline "res=($length bytes)," } - incr current $pad - } - 6 { - incr current $pad - binary scan $data @${current}I execstatus - if { $prmsg == 1} { puts -nonewline "status=$execstatus," } - } - 10 { - binary scan $data @${current}a${length} session - if { $prmsg == 1} { puts -nonewline "session=$session," } - incr current $pad - } - default { - if { $prmsg == 1} { puts -nonewline "unknown=" } - if { $prmsg == 1} { puts -nonewline "$type," } - } - } - # end switch - - # advance current pointer - incr current $length - } - if { $prmsg == 1 } { puts ") "} - - set node "n$nodenum" - set node_id "$eid\_$node" - # check for node existance - if { [lsearch $node_list $node] == -1 } { - puts "Execute message but node ($node) does not exist, dropping." - return - } - global $node - - # Callback support - match execnum from response with original request, and - # invoke type-specific callback - global g_execRequests - foreach type [array names g_execRequests] { - set idx [lsearch $g_execRequests($type) $execnum] - if { $idx > -1 } { - set g_execRequests($type) \ - [lreplace $g_execRequests($type) $idx $idx] - exec_${type}_callback $node $execnum $execcmd $execres $execstatus - return - } - } -} - -# spawn interactive terminal -proc exec_shell_callback { node execnum execcmd execres execstatus } { - #puts "opening terminal for $node by running '$execres'" - set title "CORE: [getNodeName $node] (console)" - set term [get_term_prog false] - set xi [string first "xterm -e" $execres] - - # shell callback already has xterm command, launch it using user-defined - # term program (e.g. remote nodes 'ssh -X -f a.b.c.d xterm -e ...' - if { $xi > -1 } { - set execres [string replace $execres $xi [expr $xi+7] $term] - if { [catch {exec sh -c "$execres" & } ] } { - puts "Warning: failed to open terminal for $node" - } - return - # no xterm command; execute shell callback in a terminal (e.g. local nodes) - } elseif { \ - [catch {eval exec $term "$execres" & } ] } { - puts "Warning: failed to open terminal for $node: ($term $execres)" - } -} - - -# -# CORE API Register message TLVs -# parse register message into plugin capabilities -# -proc parseRegMessage { data len flags channel } { - global regntypes showAPI - set prmsg $showAPI - set current 0 - set str 0 - set session "" - set fnhint "" - - set plugin_cap_list {} ;# plugin capabilities list - - if { $prmsg==1 } { puts -nonewline "REG(flags=$flags," } - - # parse each TLV - while { $current < $len } { - # TLV header - if { [binary scan $data @${current}cc type length] != 2 } { - puts "TLV header error" - break - } - set length [expr {$length & 0xFF}]; # convert signed to unsigned - if { $length == 0 } { - # prevent endless looping - if { $type == 0 } { - puts -nonewline "(extra padding)" - break - } else { - puts "Found zero-length TLV for type=$type, dropping." - break - } - } - set pad [pad_32bit $length] - # verbose debugging - #puts "tlv type=$type length=$length pad=$pad current=$current" - incr current 2 - # TLV data - if { [info exists regntypes($type)] } { - set plugin_type $regntypes($type) - binary scan $data @${current}a${length} str - if { $prmsg == 1} { puts -nonewline "$plugin_type=$str," } - if { $type == 10 } { ;# session number - set session $str - } else { - lappend plugin_cap_list "$plugin_type=$str" - if { $plugin_type == "exec" } { set fnhint $str } - } - } else { - if { $prmsg == 1} { puts -nonewline "unknown($type)," } - } - incr current $pad - # end switch - - # advance current pointer - incr current $length - } - if { $prmsg == 1 } { puts ") "} - - # reg message with session number indicates the sid of a session that - # was just started from XML or Python script (via reg exec=scriptfile.py) - if { $session != "" } { - # The channel passed to here is soon after discarded for - # sessions that are started from XML or Python scripts. This causes - # an exception in the GUI when responding back to daemon if the - # response is sent after the channel has been destroyed. Setting - # the channel to -1 basically disables the GUI response to the daemon, - # but it turns out the daemon does not need the response anyway. - set channel -1 - # assume session string only contains one session number - connectShutdownSession connect $channel $session $fnhint - return - } - - set plugin [pluginByChannel $channel] - if { [setPluginCapList $plugin $plugin_cap_list] < 0 } { - return - } - - # callback to refresh any open dialogs this message may refresh - pluginsConfigRefreshCallback -} - -proc parseConfMessage { data len flags channel } { - global showAPI node_list MACHINE_TYPES - set prmsg $showAPI - set current 0 - set str 0 - set nodenum -1 - set obj "" - set tflags 0 - set types {} - set values {} - set captions {} - set bitmap {} - set possible_values {} - set groups {} - set opaque {} - set session "" - set netid -1 - - if { $prmsg==1 } { puts -nonewline "CONF(flags=$flags," } - - # parse each TLV - while { $current < $len } { - set typelength [parseTLVHeader $data current] - set type [lindex $typelength 0] - set length [lindex $typelength 1] - set pad [pad_32bit $length] - if { $length == 0 || $length == "" } { - # allow some zero-length string TLVs - if { $type < 5 || $type > 9 } { break } - } - # verbose debugging - #puts "tlv type=$type length=$length pad=$pad current=$current" - # TLV data - switch -exact -- "$type" { - 1 { - incr current $pad - binary scan $data @${current}I nodenum - if { $prmsg == 1} { puts -nonewline "node=$nodenum/" } - } - 2 { - binary scan $data @${current}a${length} obj - if { $prmsg == 1} { puts -nonewline "obj=$obj," } - incr current $pad - } - 3 { - binary scan $data @${current}S tflags - if { $prmsg == 1} { puts -nonewline "cflags=$tflags," } - } - 4 { - set type 0 - set types {} - if { $prmsg == 1} { puts -nonewline "types=" } - # number of 16-bit values - set types_len $length - # get each 16-bit type value, add to list - while {$types_len > 0} { - binary scan $data @${current}S type - if {$type > 0 && $type < 12} { - lappend types $type - if { $prmsg == 1} { puts -nonewline "$type/" } - } - incr current 2 - incr types_len -2 - } - if { $prmsg == 1} { puts -nonewline "," } - incr current -$length; # length incremented below - incr current $pad - } - 5 { - set values {} - binary scan $data @${current}a${length} vals - if { $prmsg == 1} { puts -nonewline "vals=$vals," } - set values [split $vals |] - incr current $pad - } - 6 { - set captions {} - binary scan $data @${current}a${length} capt - if { $prmsg == 1} { puts -nonewline "capt=$capt," } - set captions [split $capt |] - incr current $pad - } - 7 { - set bitmap {} - binary scan $data @${current}a${length} bitmap - if { $prmsg == 1} { puts -nonewline "bitmap," } - incr current $pad - } - 8 { - set possible_values {} - binary scan $data @${current}a${length} pvals - if { $prmsg == 1} { puts -nonewline "pvals=$pvals," } - set possible_values [split $pvals |] - incr current $pad - } - 9 { - set groups {} - binary scan $data @${current}a${length} groupsstr - if { $prmsg == 1} { puts -nonewline "groups=$groupsstr," } - set groups [split $groupsstr |] - incr current $pad - } - 10 { - binary scan $data @${current}a${length} session - if { $prmsg == 1} { puts -nonewline "session=$session," } - incr current $pad - } - 35 { - incr current $pad - binary scan $data @${current}I netid - if { $prmsg == 1} { puts -nonewline "netid=$netid/" } - } - 80 { - set opaque {} - binary scan $data @${current}a${length} opaquestr - if { $prmsg == 1} { puts -nonewline "opaque=$opaquestr," } - set opaque [split $opaquestr |] - incr current $pad - } - default { - if { $prmsg == 1} { puts -nonewline "unknown=" } - if { $prmsg == 1} { puts -nonewline "$type," } - } - } - # end switch - - # advance current pointer - incr current $length - } - - if { $prmsg == 1 } { puts ") "} - - set objs_ok [concat "services session metadata emane" $MACHINE_TYPES] - if { $nodenum > -1 } { - set node "n$nodenum" - } else { - set node "" - } - # check for node existance - if { [lsearch $node_list $node] == -1 } { - if { [lsearch $objs_ok $obj] < 0 } { - set msg "Configure message for $obj but node ($node) does" - set msg "$msg not exist, dropping." - puts $msg - return - } - } else { - global $node - } - - # for handling node services - # this could be improved, instead of checking for the hard-coded object - # "services" and opaque data for service customization - if { $obj == "services" } { - if { $tflags & 0x2 } { ;# update flag - if { $opaque != "" } { - set services [lindex [split $opaque ":"] 1] - set services [split $services ","] - customizeServiceValues n$nodenum $values $services - } - # TODO: save services config with the node - } elseif { $tflags & 0x1 } { ;# request flag - # TODO: something else - } else { - popupServicesConfig $channel n$nodenum $types $values $captions \ - $possible_values $groups $session - } - return - # metadata received upon XML file load - } elseif { $obj == "metadata" } { - parseMetaData $values - return - # session options received upon XML file load - } elseif { $obj == "session" && $tflags & 0x2 } { - setSessionOptions $types $values - return - } - # handle node machine-type profile - if { [lsearch $MACHINE_TYPES $obj] != -1 } { - if { $tflags == 0 } { - popupNodeProfileConfig $channel n$nodenum $obj $types $values \ - $captions $bitmap $possible_values $groups $session \ - $opaque - } else { - puts -nonewline "warning: received Configure message for profile " - puts "with unexpected flags!" - } - return - } - - # update the configuration for a node without displaying dialog box - if { $tflags & 0x2 } { - if { $obj == "emane" && $node == "" } { - set node [lindex [findWlanNodes ""] 0] - } - if { $node == "" } { - puts "ignoring Configure message for $obj with no node" - return - } - # this is similar to popupCapabilityConfigApply - setCustomConfig $node $obj $types $values 0 - if { $obj != "emane" && [nodeType $node] == "wlan"} { - set section [list mobmodel coreapi $obj] - netconfInsertSection $node $section - } - # configuration request - unhandled - } elseif { $tflags & 0x1 } { - # configuration response data from our request (from GUI plugin configure) - } else { - popupCapabilityConfig $channel n$nodenum $obj $types $values \ - $captions $bitmap $possible_values $groups - } -} - -# process metadata received from Conf Message when loading XML -proc parseMetaData { values } { - global canvas_list annotation_list execMode g_comments - - foreach value $values { - # data looks like this: "annotation a1={iconcoords {514.0 132.0...}}" - lassign [splitKeyValue $value] key object_config - lassign $key class object - # metadata with no object name e.g. comments="Comment text" - if { "$class" == "comments" } { - set g_comments $object_config - continue - } elseif { "$class" == "global_options" } { - foreach opt $object_config { - lassign [split $opt =] key value - setGlobalOption $key $value - } - continue - } - # metadata having class and object name - if {"$class" == "" || $object == ""} { - puts "warning: invalid metadata value '$value'" - } - if { "$class" == "canvas" } { - if { [lsearch $canvas_list $object] < 0 } { - lappend canvas_list $object - } - } elseif { "$class" == "annotation" } { - if { [lsearch $annotation_list $object] < 0 } { - lappend annotation_list $object - } - } else { - puts "metadata parsing error: unknown object class $class" - } - global $object - set $object $object_config - } - - if { $execMode == "batch" } { return } - switchCanvas none - redrawAll -} - -proc parseFileMessage { data len flags channel } { - global showAPI node_list - set prmsg $showAPI - - array set tlvnames { 1 num 2 name 3 mode 4 fno 5 type 6 sname \ - 10 session 16 data 17 cdata } - array set tlvsizes { num 4 name -1 mode -3 fno 2 type -1 sname -1 \ - session -1 data -1 cdata -1 } - array set defvals { num -1 name "" mode -1 fno -1 type "" sname "" \ - session "" data "" cdata "" } - - if { $prmsg==1 } { puts -nonewline "FILE(flags=$flags," } - array set vals [parseMessage $data $len $flags [array get tlvnames] \ - [array get tlvsizes] [array get defvals]] - if { $prmsg } { puts ") "} - - # hook scripts received in File Message - if { [string range $vals(type) 0 4] == "hook:" } { - global g_hook_scripts - set state [string range $vals(type) 5 end] - lappend g_hook_scripts [list $vals(name) $state $vals(data)] - return - } - - # required fields - foreach t "num name data" { - if { $vals($t) == $defvals($t) } { - puts "Received File Message without $t, dropping."; return; - } - } - - # check for node existance - set node "n$vals(num)" - if { [lsearch $node_list $node] == -1 } { - puts "File message but node ($node) does not exist, dropping." - return - } else { - global $node - } - - # service customization received in File Message - if { [string range $vals(type) 0 7] == "service:" } { - customizeServiceFile $node $vals(name) $vals(type) $vals(data) true - } -} - -proc parseEventMessage { data len flags channel } { - global showAPI eventtypes g_traffic_start_opt execMode node_list - set prmsg $showAPI - set current 0 - set nodenum -1 - set eventtype -1 - set eventname "" - set eventdata "" - set eventtime "" - set session "" - - if { $prmsg==1 } { puts -nonewline "EVENT(flags=$flags," } - - # parse each TLV - while { $current < $len } { - set typelength [parseTLVHeader $data current] - set type [lindex $typelength 0] - set length [lindex $typelength 1] - if { $length == 0 || $length == "" } { break } - set pad [pad_32bit $length] - # verbose debugging - #puts "tlv type=$type length=$length pad=$pad current=$current" - # TLV data - switch -exact -- "$type" { - 1 { - incr current $pad - binary scan $data @${current}I nodenum - if { $prmsg == 1} { puts -nonewline "node=$nodenum," } - } - 2 { - incr current $pad - binary scan $data @${current}I eventtype - if { $prmsg == 1} { - set typestr "" - foreach t [array names eventtypes] { - if { $eventtypes($t) == $eventtype } { - set typestr "-$t" - break - } - } - puts -nonewline "type=$eventtype$typestr," - } - } - 3 { - binary scan $data @${current}a${length} eventname - if { $prmsg == 1} { puts -nonewline "name=$eventname," } - incr current $pad - } - 4 { - binary scan $data @${current}a${length} eventdata - if { $prmsg == 1} { puts -nonewline "data=$eventdata," } - incr current $pad - } - 5 { - binary scan $data @${current}a${length} eventtime - if { $prmsg == 1} { puts -nonewline "time=$eventtime," } - incr current $pad - } - 10 { - binary scan $data @${current}a${length} session - if { $prmsg == 1} { puts -nonewline "session=$session," } - incr current $pad - } - default { - if { $prmsg == 1} { puts -nonewline "unknown=" } - if { $prmsg == 1} { puts -nonewline "$type," } - } - } - # end switch - - # advance current pointer - incr current $length - } - - if { $prmsg == 1 } { puts ") "} - - # TODO: take other actions here based on Event Message - if { $eventtype == 4 } { ;# entered the runtime state - if { $g_traffic_start_opt == 1 } { startTrafficScripts } - if { $execMode == "batch" } { - global g_current_session g_abort_session - if {$g_abort_session} { - puts "Current session ($g_current_session) aborted. Disconnecting." - shutdownSession - } else { - puts "Session running. Session id is $g_current_session. Disconnecting." - } - exit.real - } - } elseif { $eventtype == 6 } { ;# shutdown state - set name [lindex [getEmulPlugin "*"] 0] - if { [getAssignedRemoteServers] == "" } { - # start a new session if not distributed - # otherwise we need to allow time for node delete messages - # from other servers - pluginConnect $name disconnect 1 - pluginConnect $name connect 1 - } - } elseif { $eventtype >= 7 || $eventtype <= 10 } { - if { [string range $eventname 0 8] == "mobility:" } { - set node "n$nodenum" - if {[lsearch $node_list $node] == -1} { - puts "Event message with unknown node %nodenum." - return - } - handleMobilityScriptEvent $node $eventtype $eventdata $eventtime - } - } -} - -proc parseSessionMessage { data len flags channel } { - global showAPI g_current_session g_session_dialog_hint execMode - set prmsg $showAPI - set current 0 - set sessionids {} - set sessionnames {} - set sessionfiles {} - set nodecounts {} - set sessiondates {} - set thumbs {} - set sessionopaque {} - - if { $prmsg==1 } { puts -nonewline "SESSION(flags=$flags," } - - # parse each TLV - while { $current < $len } { - set typelength [parseTLVHeader $data current] - set type [lindex $typelength 0] - set length [lindex $typelength 1] - if { $length == 0 || $length == "" } { - puts "warning: zero-length TLV, discarding remainder of message!" - break - } - set pad [pad_32bit $length] - # verbose debugging - #puts "tlv type=$type length=$length pad=$pad current=$current" - # TLV data - switch -exact -- "$type" { - 1 { - set sessionids {} - binary scan $data @${current}a${length} sids - if { $prmsg == 1} { puts -nonewline "sids=$sids," } - set sessionids [split $sids |] - incr current $pad - } - 2 { - set sessionnames {} - binary scan $data @${current}a${length} snames - if { $prmsg == 1} { puts -nonewline "names=$snames," } - set sessionnames [split $snames |] - incr current $pad - } - 3 { - set sessionfiles {} - binary scan $data @${current}a${length} sfiles - if { $prmsg == 1} { puts -nonewline "files=$sfiles," } - set sessionfiles [split $sfiles |] - incr current $pad - } - 4 { - set nodecounts {} - binary scan $data @${current}a${length} ncs - if { $prmsg == 1} { puts -nonewline "ncs=$ncs," } - set nodecounts [split $ncs |] - incr current $pad - } - 5 { - set sessiondates {} - binary scan $data @${current}a${length} sdates - if { $prmsg == 1} { puts -nonewline "dates=$sdates," } - set sessiondates [split $sdates |] - incr current $pad - } - 6 { - set thumbs {} - binary scan $data @${current}a${length} th - if { $prmsg == 1} { puts -nonewline "thumbs=$th," } - set thumbs [split $th |] - incr current $pad - } - 10 { - set sessionopaque {} - binary scan $data @${current}a${length} sessionopaque - if { $prmsg == 1} { puts -nonewline "$sessionopaque," } - incr current $pad - } - default { - if { $prmsg == 1} { puts -nonewline "unknown=" } - if { $prmsg == 1} { puts -nonewline "$type," } - } - } - # end switch - - # advance current pointer - incr current $length - } - - if { $prmsg == 1 } { puts ") "} - - if {$g_current_session == 0} { - # set the current session to the channel port number - set current_session [lindex [fconfigure $channel -sockname] 2] - } else { - set current_session $g_current_session - } - - if {[lsearch $sessionids $current_session] == -1} { - puts -nonewline "*** warning: current session ($g_current_session) " - puts "not found in session list: $sessionids" - } - - set orig_session_choice $g_current_session - set g_current_session $current_session - setGuiTitle "" - - if {$execMode == "closebatch"} { - # we're going to close some session, so this is expected - global g_session_choice - - if {[lsearch $sessionids $g_session_choice] == -1} { - puts -nonewline "*** warning: current session ($g_session_choice) " - puts "not found in session list: $sessionids" - } else { - set flags 0x2 ;# delete flag - set sid $g_session_choice - set name "" - set f "" - set nodecount "" - set thumb "" - set user "" - sendSessionMessage $channel $flags $sid $name $f $nodecount $thumb $user - - puts "Session shutdown message sent." - } - exit.real - } - - if {$orig_session_choice == 0 && [llength $sessionids] == 1} { - # we just started up and only the current session exists - set g_session_dialog_hint 0 - return - } - - if {$execMode == "batch"} { - puts "Another session is active." - exit.real - } - - if { $g_session_dialog_hint } { - popupSessionConfig $channel $sessionids $sessionnames $sessionfiles \ - $nodecounts $sessiondates $thumbs $sessionopaque - } - set g_session_dialog_hint 0 -} - -# parse message TLVs given the possible TLV names and sizes -# default values are supplied in defaultvals, parsed values are returned -proc parseMessage { data len flags tlvnamesl tlvsizesl defaultvalsl } { - global showAPI - set prmsg $showAPI - - array set tlvnames $tlvnamesl - array set tlvsizes $tlvsizesl - array set vals $defaultvalsl ;# this array is returned - - set current 0 - - while { $current < $len } { - set typelength [parseTLVHeader $data current] - set type [lindex $typelength 0] - set length [lindex $typelength 1] - if { $length == 0 || $length == "" } { break } - set pad [pad_32bit $length] - - if {![info exists tlvnames($type)] } { ;# unknown TLV type - if { $prmsg } { puts -nonewline "unknown=$type," } - incr current $length - continue - } - set tlvname $tlvnames($type) - set size $tlvsizes($tlvname) - # 32-bit and 64-bit vals pre-padded - if { $size == 4 || $size == 8 } { incr current $pad } - # read TLV data depending on size - switch -exact -- "$size" { - 2 { binary scan $data @${current}S vals($tlvname) } - 4 { binary scan $data @${current}I vals($tlvname) } - 8 { binary scan $data @${current}W vals($tlvname) } - 16 { binary scan $data @${current}c16 vals($tlvname) } - -1 { binary scan $data @${current}a${length} vals($tlvname) } - } - if { $size == -1 } { incr current $pad } ;# string vals post-padded - if { $type == 6 } { incr current $pad } ;# 128-bit vals post-padded - incr current $length - - if { $prmsg } { puts -nonewline "$tlvname=$vals($tlvname)," } - } - return [array get vals] -} - -proc parseExceptionMessage { data len flags channel } { - global showAPI - set prmsg $showAPI - - array set typenames { 1 num 2 sess 3 level 4 src 5 date 6 txt 10 opaque } - array set typesizes { num 4 sess -1 level 2 src -1 date -1 txt -1 \ - opaque -1 } - array set defvals { num -1 sess "" level -1 src "" date "" txt "" opaque ""} - - if { $prmsg==1 } { puts -nonewline "EXCEPTION(flags=$flags," } - array set vals [parseMessage $data $len $flags [array get typenames] \ - [array get typesizes] [array get defvals]] - if { $prmsg == 1 } { puts ") "} - - if { $vals(level) == $defvals(level) } { - puts "Exception Message received without an exception level."; return; - } - - receiveException [array get vals] -} - -proc sendNodePosMessage { channel node nodeid x y wlanid force } { - global showAPI - set prmsg $showAPI - - if { $channel == -1 } { - set channel [lindex [getEmulPlugin $node] 2] - if { $channel == -1 } { return } - } - set node_num [string range $node 1 end] - set x [format "%u" [expr int($x)]] - set y [format "%u" [expr int($y)]] - set len [expr 8+4+4] ;# node number, x, y - if {$nodeid > -1} { incr len 8 } - if {$wlanid > -1} { incr len 8 } - if {$force == 1 } { set crit 0x4 } else { set crit 0x0 } - #puts "sending [expr $len+4] bytes: $nodeid $x $y $wlanid" - if { $prmsg == 1 } { - puts -nonewline ">NODE(flags=$crit,$node,x=$x,y=$y" } - set msg [binary format ccSc2sIc2Sc2S \ - 1 $crit $len \ - {1 4} 0 $node_num \ - {0x20 2} $x \ - {0x21 2} $y - ] - - set msg2 "" - set msg3 "" - if { $nodeid > -1 } { - if { $prmsg == 1 } { puts -nonewline ",emuid=$nodeid" } - set msg2 [binary format c2sI {0x23 4} 0 $nodeid] - } - if { $wlanid > -1 } { - if { $prmsg == 1 } { puts -nonewline ",netid=$wlanid" } - set msg3 [binary format c2sI {0x24 4} 0 $wlanid] - } - - if { $prmsg == 1 } { puts ")" } - puts -nonewline $channel $msg$msg2$msg3 - flushChannel channel "Error sending node position" -} - -# build a new node -proc sendNodeAddMessage { channel node } { - global showAPI CORE_DATA_DIR - set prmsg $showAPI - set len [expr {8+8+4+4}]; # node number, type, x, y - set ipv4 0 - set ipv6 0 - set macstr "" - set wireless 0 - - # type, name - set type [getNodeTypeAPI $node] - set model [getNodeModel $node] - set model_len [string length $model] - set model_pad_len [pad_32bit $model_len] - set model_pad [binary format x$model_pad_len] - set name [getNodeName $node] - set name_len [string length $name] - set name_pad_len [pad_32bit $name_len] - set name_pad [binary format x$name_pad_len] - incr len [expr { 2+$name_len+$name_pad_len}] - if {$model_len > 0} { incr len [expr {2+$model_len+$model_pad_len }] } - set node_num [string range $node 1 end] - - # fixup node type for EMANE-enabled WLAN nodes - set opaque "" - if { [isEmane $node] } { set type 0xA } - - # emulation server (node location) - set emusrv [getNodeLocation $node] - set emusrv_len [string length $emusrv] - set emusrv_pad_len [pad_32bit $emusrv_len] - set emusrv_pad [binary format x$emusrv_pad_len] - if { $emusrv_len > 0 } { incr len [expr {2+$emusrv_len+$emusrv_pad_len } ] } - - # canvas - set canv [getNodeCanvas $node] - if { $canv != "c1" } { - set canv [string range $canv 1 end] ;# convert "c2" to "2" - incr len 4 - } else { - set canv "" - } - - # services - set svc [getNodeServices $node false] - set svc [join $svc "|"] - set svc_len [string length $svc] - set svc_pad_len [pad_32bit $svc_len] - set svc_pad [binary format x$svc_pad_len] - if { $svc_len > 0 } { incr len [expr {2+$svc_len+$svc_pad_len } ] } - - # icon - set icon [getCustomImage $node] - if { [file dirname $icon] == "$CORE_DATA_DIR/icons/normal" } { - set icon [file tail $icon] ;# don't include standard icon path - } - set icon_len [string length $icon] - set icon_pad_len [pad_32bit $icon_len] - set icon_pad [binary format x$icon_pad_len] - if { $icon_len > 0 } { incr len [expr {2+$icon_len+$icon_pad_len} ] } - - # opaque data - set opaque_len [string length $opaque] - set opaque_pad_len [pad_32bit $opaque_len] - set opaque_pad [binary format x$opaque_pad_len] - if { $opaque_len > 0 } { incr len [expr {2+$opaque_len+$opaque_pad_len} ] } - - # length must be calculated before this - if { $prmsg == 1 } { - puts -nonewline ">NODE(flags=add/str,$node,type=$type,$name," - } - set msg [binary format c2Sc2sIc2sIcc \ - {0x1 0x11} $len \ - {0x1 4} 0 $node_num \ - {0x2 4} 0 $type \ - 0x3 $name_len ] - puts -nonewline $channel $msg$name$name_pad - - # IPv4 address - if { $ipv4 > 0 } { - if { $prmsg == 1 } { puts -nonewline "$ipv4str," } - set msg [binary format c2sI {0x4 4} 0 $ipv4] - puts -nonewline $channel $msg - } - - # MAC address - if { $macstr != "" } { - if { $prmsg == 1 } { puts -nonewline "$macstr," } - set mac [join [split $macstr ":"] ""] - puts -nonewline $channel [binary format c2x2W {0x5 8} 0x$mac] - } - - # IPv6 address - if { $ipv6 != 0 } { - if { $prmsg == 1 } { puts -nonewline "$ipv6str," } - set msg [binary format c2 {0x6 16} ] - puts -nonewline $channel $msg - foreach ipv6w [split $ipv6 ":"] { - set msg [binary format S 0x$ipv6w] - puts -nonewline $channel $msg - } - puts -nonewline $channel [binary format x2]; # 2 bytes padding - } - - # model type - if { $model_len > 0 } { - set mh [binary format cc 0x7 $model_len] - puts -nonewline $channel $mh$model$model_pad - if { $prmsg == 1 } { puts -nonewline "m=$model," } - } - - # emulation server - if { $emusrv_len > 0 } { - puts -nonewline $channel [binary format cc 0x8 $emusrv_len] - puts -nonewline $channel $emusrv$emusrv_pad - if { $prmsg == 1 } { puts -nonewline "srv=$emusrv," } - } - - # X,Y coordinates - set coords [getNodeCoords $node] - set x [format "%u" [expr int([lindex $coords 0])]] - set y [format "%u" [expr int([lindex $coords 1])]] - set msg [binary format c2Sc2S {0x20 2} $x {0x21 2} $y] - puts -nonewline $channel $msg - - # canvas - if { $canv != "" } { - if { $prmsg == 1 } { puts -nonewline "canvas=$canv," } - set msg [binary format c2S {0x22 2} $canv] - puts -nonewline $channel $msg - } - - if { $prmsg == 1 } { puts -nonewline "x=$x,y=$y" } - - # services - if { $svc_len > 0 } { - puts -nonewline $channel [binary format cc 0x25 $svc_len] - puts -nonewline $channel $svc$svc_pad - if { $prmsg == 1 } { puts -nonewline ",svc=$svc" } - } - - # icon - if { $icon_len > 0 } { - puts -nonewline $channel [binary format cc 0x42 $icon_len] - puts -nonewline $channel $icon$icon_pad - if { $prmsg == 1 } { puts -nonewline ",icon=$icon" } - } - - # opaque data - if { $opaque_len > 0 } { - puts -nonewline $channel [binary format cc 0x50 $opaque_len] - puts -nonewline $channel $opaque$opaque_pad - if { $prmsg == 1 } { puts -nonewline ",opaque=$opaque" } - } - - if { $prmsg == 1 } { puts ")" } - - flushChannel channel "Error sending node add" -} - -# delete a node -proc sendNodeDelMessage { channel node } { - global showAPI - set prmsg $showAPI - set len 8; # node number - set node_num [string range $node 1 end] - - if { $prmsg == 1 } { puts ">NODE(flags=del/str,$node_num)" } - set msg [binary format c2Sc2sI \ - {0x1 0x12} $len \ - {0x1 4} 0 $node_num ] - puts -nonewline $channel $msg - flushChannel channel "Error sending node delete" -} - -# send a message to build, modify, or delete a link -# type should indicate add/delete/link/unlink -proc sendLinkMessage { channel link type {sendboth true} } { - global showAPI - set prmsg $showAPI - - set node1 [lindex [linkPeers $link] 0] - set node2 [lindex [linkPeers $link] 1] - set if1 [ifcByPeer $node1 $node2]; set if2 [ifcByPeer $node2 $node1] - if { [nodeType $node1] == "pseudo" } { return } ;# never seems to occur - if { [nodeType $node2] == "pseudo" } { - set mirror2 [getLinkMirror $node2] - set node2 [getNodeName $node2] - if { [string range $node1 1 end] > [string range $node2 1 end] } { - return ;# only send one link message (for two pseudo-links) - } - set if2 [ifcByPeer $node2 $mirror2] - } - set node1_num [string range $node1 1 end] - set node2_num [string range $node2 1 end] - - # flag for sending unidirectional link messages - set uni 0 - if { $sendboth && [isLinkUni $link] } { - set uni 1 - } - - # set flags and link message type from supplied type parameter - set flags 0 - set ltype 1 ;# add/delete a link (not wireless link/unlink) - set netid -1 - if { $type == "add" || $type == "link" } { - set flags 1 - } elseif { $type == "delete" || $type == "unlink" } { - set flags 2 - } - if { $type == "link" || $type == "unlink" } { - set ltype 0 ;# a wireless link/unlink event - set tmp [getLinkOpaque $link net] - if { $tmp != "" } { set netid [string range $tmp 1 end] } - } - - set key "" - if { [nodeType $node1] == "tunnel" } { - set key [netconfFetchSection $node1 "tunnel-key"] - if { $key == "" } { set key 1 } - } - if {[nodeType $node2] == "tunnel" } { - set key [netconfFetchSection $node2 "tunnel-key"] - if { $key == "" } { set key 1 } - } - - if { $prmsg == 1 } { - puts -nonewline ">LINK(flags=$flags,$node1_num-$node2_num," - } - - # len = node1num, node2num, type - set len [expr {8+8+8}] - set delay [getLinkDelay $link] - if { $delay == "" } { set delay 0 } - set jitter [getLinkJitter $link] - if { $jitter == "" } { set jitter 0 } - set bw [getLinkBandwidth $link] - if { $bw == "" } { set bw 0 } - set per [getLinkBER $link]; # PER and BER - if { $per == "" } { set per 0 } - set per_len 0 - set per_msg [buildStringTLV 0x5 $per per_len] - set dup [getLinkDup $link] - if { $dup == "" } { set dup 0 } - set dup_len 0 - set dup_msg [buildStringTLV 0x6 $dup dup_len] - if { $type != "delete" } { - incr len [expr {12+12+$per_len+$dup_len+12}] ;# delay,bw,per,dup,jitter - if {$prmsg==1 } { - puts -nonewline "$delay,$bw,$per,$dup,$jitter," - } - } - # TODO: mer, burst, mburst - if { $prmsg == 1 } { puts -nonewline "type=$ltype," } - if { $uni } { - incr len 4 - if { $prmsg == 1 } { puts -nonewline "uni=$uni," } - } - if { $netid > -1 } { - incr len 8 - if { $prmsg == 1 } { puts -nonewline "netid=$netid," } - } - if { $key != "" } { - incr len 8 - if { $prmsg == 1 } { puts -nonewline "key=$key," } - } - - set if1num [ifcNameToNum $if1]; set if2num [ifcNameToNum $if2] - set if1ipv4 0; set if2ipv4 0; set if1ipv6 ""; set if2ipv6 ""; - set if1ipv4mask 0; set if2ipv4mask 0; - set if1ipv6mask ""; set if2ipv6mask ""; set if1mac ""; set if2mac ""; - - if { $if1num >= 0 && ([[typemodel $node1].layer] == "NETWORK" || \ - [nodeType $node1] == "tunnel") } { - incr len 4 - if { $prmsg == 1 } { puts -nonewline "if1n=$if1num," } - if { $type != "delete" } { - getIfcAddrs $node1 $if1 if1ipv4 if1ipv6 if1mac if1ipv4mask \ - if1ipv6mask len - } - } - if { $if2num >= 0 && ([[typemodel $node2].layer] == "NETWORK" || \ - [nodeType $node2] == "tunnel") } { - incr len 4 - if { $prmsg == 1 } { puts -nonewline "if2n=$if2num," } - if { $type != "delete" } { - getIfcAddrs $node2 $if2 if2ipv4 if2ipv6 if2mac if2ipv4mask \ - if2ipv6mask len - } - } - - # start building the binary message on channel - # length must be calculated before this - set msg [binary format ccSc2sIc2sI \ - {0x2} $flags $len \ - {0x1 4} 0 $node1_num \ - {0x2 4} 0 $node2_num ] - puts -nonewline $channel $msg - - if { $type != "delete" } { - puts -nonewline $channel [binary format c2sW {0x3 8} 0 $delay] - puts -nonewline $channel [binary format c2sW {0x4 8} 0 $bw] - puts -nonewline $channel $per_msg - puts -nonewline $channel $dup_msg - puts -nonewline $channel [binary format c2sW {0x7 8} 0 $jitter] - } - # TODO: mer, burst, mburst - - # link type - puts -nonewline $channel [binary format c2sI {0x20 4} 0 $ltype] - - # unidirectional flag - if { $uni } { - puts -nonewline $channel [binary format c2S {0x22 2} $uni] - } - - # network ID - if { $netid > -1 } { - puts -nonewline $channel [binary format c2sI {0x24 4} 0 $netid] - } - - if { $key != "" } { - puts -nonewline $channel [binary format c2sI {0x25 4} 0 $key] - } - - # interface 1 info - if { $if1num >= 0 && ([[typemodel $node1].layer] == "NETWORK" || \ - [nodeType $node1] == "tunnel") } { - puts -nonewline $channel [ binary format c2S {0x30 2} $if1num ] - } - if { $if1ipv4 > 0 } { puts -nonewline $channel [binary format c2sIc2S \ - {0x31 4} 0 $if1ipv4 {0x32 2} $if1ipv4mask ] } - if { $if1mac != "" } { - set if1mac [join [split $if1mac ":"] ""] - puts -nonewline $channel [binary format c2x2W {0x33 8} 0x$if1mac] - } - if {$if1ipv6 != ""} { puts -nonewline $channel [binary format c2 {0x34 16}] - foreach ipv6w [split $if1ipv6 ":"] { puts -nonewline $channel \ - [binary format S 0x$ipv6w] } - puts -nonewline $channel [binary format x2c2S {0x35 2} $if1ipv6mask] } - - # interface 2 info - if { $if2num >= 0 && ([[typemodel $node2].layer] == "NETWORK" || \ - [nodeType $node2] == "tunnel") } { - puts -nonewline $channel [ binary format c2S {0x36 2} $if2num ] - } - if { $if2ipv4 > 0 } { puts -nonewline $channel [binary format c2sIc2S \ - {0x37 4} 0 $if2ipv4 {0x38 2} $if2ipv4mask ] } - if { $if2mac != "" } { - set if2mac [join [split $if2mac ":"] ""] - puts -nonewline $channel [binary format c2x2W {0x39 8} 0x$if2mac] - } - if {$if2ipv6 != ""} { puts -nonewline $channel [binary format c2 {0x40 16}] - foreach ipv6w [split $if2ipv6 ":"] { puts -nonewline $channel \ - [binary format S 0x$ipv6w] } - puts -nonewline $channel [binary format x2c2S {0x41 2} $if2ipv6mask] } - - if { $prmsg==1 } { puts ")" } - flushChannel channel "Error sending link message" - - ########################################################## - # send a second Link Message for unidirectional link effects - if { $uni < 1 } { - return - } - # first calculate length and possibly print the message - set flags 0 - if { $prmsg == 1 } { - puts -nonewline ">LINK(flags=$flags,$node2_num-$node1_num," - } - set len [expr {8+8+8}] ;# len = node2num, node1num (swapped), type - set delay [getLinkDelay $link up] - if { $delay == "" } { set delay 0 } - set jitter [getLinkJitter $link up] - if { $jitter == "" } { set jitter 0 } - set bw [getLinkBandwidth $link up] - if { $bw == "" } { set bw 0 } - set per [getLinkBER $link up]; # PER and BER - if { $per == "" } { set per 0 } - set per_len 0 - set per_msg [buildStringTLV 0x5 $per per_len] - set dup [getLinkDup $link up] - if { $dup == "" } { set dup 0 } - set dup_len 0 - set dup_msg [buildStringTLV 0x6 $dup dup_len] - incr len [expr {12+12+$per_len+$dup_len+12}] ;# delay,bw,per,dup,jitter - if {$prmsg==1 } { - puts -nonewline "$delay,$bw,$per,$dup,$jitter," - } - if { $prmsg == 1 } { puts -nonewline "type=$ltype," } - incr len 4 ;# unidirectional flag - if { $prmsg == 1 } { puts -nonewline "uni=$uni," } - # note that if1num / if2num are reversed here due to reversed node nums - if { $if2num >= 0 && ([[typemodel $node2].layer] == "NETWORK" || \ - [nodeType $node2] == "tunnel") } { - incr len 4 - if { $prmsg == 1 } { puts -nonewline "if1n=$if2num," } - } - if { $if1num >= 0 && ([[typemodel $node1].layer] == "NETWORK" || \ - [nodeType $node1] == "tunnel") } { - incr len 4 - if { $prmsg == 1 } { puts -nonewline "if2n=$if1num," } - } - # build and send the link message - set msg [binary format ccSc2sIc2sI \ - {0x2} $flags $len \ - {0x1 4} 0 $node2_num \ - {0x2 4} 0 $node1_num ] - puts -nonewline $channel $msg - puts -nonewline $channel [binary format c2sW {0x3 8} 0 $delay] - puts -nonewline $channel [binary format c2sW {0x4 8} 0 $bw] - puts -nonewline $channel $per_msg - puts -nonewline $channel $dup_msg - puts -nonewline $channel [binary format c2sW {0x7 8} 0 $jitter] - puts -nonewline $channel [binary format c2sI {0x20 4} 0 $ltype] - puts -nonewline $channel [binary format c2S {0x22 2} $uni] - if { $if2num >= 0 && ([[typemodel $node2].layer] == "NETWORK" || \ - [nodeType $node2] == "tunnel") } { - puts -nonewline $channel [ binary format c2S {0x30 2} $if2num ] - } - if { $if1num >= 0 && ([[typemodel $node1].layer] == "NETWORK" || \ - [nodeType $node1] == "tunnel") } { - puts -nonewline $channel [ binary format c2S {0x36 2} $if1num ] - } - if { $prmsg==1 } { puts ")" } - flushChannel channel "Error sending link message" -} - -# helper to get IPv4, IPv6, MAC address and increment length -# also prints TLV-style addresses if showAPI is true -proc getIfcAddrs { node ifc ipv4p ipv6p macp ipv4maskp ipv6maskp lenp } { - global showAPI - upvar $ipv4p ipv4 - upvar $ipv6p ipv6 - upvar $macp mac - upvar $ipv4maskp ipv4mask - upvar $ipv6maskp ipv6mask - upvar $lenp len - - if { $ifc == "" || $node == "" } { return } - - # IPv4 address - set ipv4str [getIfcIPv4addr $node $ifc] - if {$ipv4str != ""} { - set ipv4 [lindex [split $ipv4str /] 0] - if { [info exists ipv4mask ] } { - set ipv4mask [lindex [split $ipv4str / ] 1] - incr len 12; # 8 addr + 4 mask - if { $showAPI == 1 } { puts -nonewline "$ipv4str," } - } else { - incr len 8; # 8 addr - if { $showAPI == 1 } { puts -nonewline "$ipv4," } - } - set ipv4 [stringToIPv4 $ipv4]; # convert to integer - } - - # IPv6 address - set ipv6str [getIfcIPv6addr $node $ifc] - if {$ipv6str != ""} { - set ipv6 [lindex [split $ipv6str /] 0] - if { [info exists ipv6mask ] } { - set ipv6mask [lindex [split $ipv6str / ] 1] - incr len 24; # 20 addr + 4 mask - if { $showAPI == 1 } { puts -nonewline "$ipv6str," } - } else { - incr len 20; # 20 addr - if { $showAPI == 1 } { puts -nonewline "$ipv6," } - } - set ipv6 [expandIPv6 $ipv6]; # convert to long string - } - - # MAC address (from conf if there, otherwise generated) - if { [info exists mac] } { - set mac [lindex [getIfcMacaddr $node $ifc] 0] - if {$mac == ""} { - set mac [getNextMac] - } - if { $showAPI == 1 } { puts -nonewline "$mac," } - incr len 12; - } -} - -# -# Register Message: (registration types) -# This is a simple Register Message, types is an array of -# tuples. -proc sendRegMessage { channel flags types_list } { - global showAPI regtypes - set prmsg $showAPI - - if { $channel == -1 || $channel == "" } { - set plugin [lindex [getEmulPlugin "*"] 0] - set channel [pluginConnect $plugin connect true] - if { $channel == -1 } { return } - } - set len 0 - array set types $types_list - - # array names output is unreliable, sort it - set type_list [lsort -dict [array names types]] - foreach type $type_list { - if { ![info exists regtypes($type)] } { - puts "sendRegMessage: unknown registration type '$type'" - return -1 - } - set str_$type $types($type) - set str_${type}_len [string length [set str_$type]] - set str_${type}_pad_len [pad_32bit [set str_${type}_len]] - set str_${type}_pad [binary format x[set str_${type}_pad_len]] - incr len [expr { 2 + [set str_${type}_len] + [set str_${type}_pad_len]}] - } - - if { $prmsg == 1 } { puts ">REG($type_list)" } - # message header - set msg1 [binary format ccS 4 $flags $len] - puts -nonewline $channel $msg1 - - foreach type $type_list { - set type_num $regtypes($type) - set tlvh [binary format cc $type_num [set str_${type}_len]] - puts -nonewline $channel $tlvh[set str_${type}][set str_${type}_pad] - } - - flushChannel channel "Error: API channel was closed" -} - -# -# Configuration Message: (object, type flags, node) -# This is a simple Configuration Message containing flags -proc sendConfRequestMessage { channel node model flags netid opaque } { - global showAPI - set prmsg $showAPI - - if { $channel == -1 || $channel == "" } { - set pname [lindex [getEmulPlugin $node] 0] - set channel [pluginConnect $pname connect true] - if { $channel == -1 } { return } - } - - set model_len [string length $model] - set model_pad_len [pad_32bit $model_len] - set model_pad [binary format x$model_pad_len ] - set len [expr {4+2+$model_len+$model_pad_len}] - # optional network ID to provide Netgraph mapping - if { $netid != -1 } { incr len 8 } - # convert from node name to number - if { [string is alpha [string range $node 0 0]] } { - set node [string range $node 1 end] - } - - if { $node > 0 } { incr len 8 } - # add a session number when configuring services - set session "" - set session_len 0 - set session_pad_len 0 - set session_pad "" - if { $node <= 0 && $model == "services" } { - global g_current_session - set session [format "0x%x" $g_current_session] - set session_len [string length $session] - set session_pad_len [pad_32bit $session_len] - set session_pad [binary format x$session_pad_len] - incr len [expr {2 + $session_len + $session_pad_len}] - } - # opaque data - used when custom configuring services - set opaque_len 0 - set msgop [buildStringTLV 0x50 $opaque opaque_len] - if { $opaque_len > 0 } { incr len $opaque_len } - - if { $prmsg == 1 } { - puts -nonewline ">CONF(flags=0," - if { $node > 0 } { puts -nonewline "node=$node," } - puts -nonewline "obj=$model,cflags=$flags" - if { $session != "" } { puts -nonewline ",session=$session" } - if { $netid > -1 } { puts -nonewline ",netid=$netid" } - if { $opaque_len > 0 } { puts -nonewline ",opaque=$opaque" } - puts ") request" - } - # header, node node number, node model header - set msg1 [binary format c2S {5 0} $len ] - set msg1b "" - if { $node > 0 } { set msg1b [binary format c2sI {1 4} 0 $node] } - set msg1c [binary format cc 2 $model_len] - # request flag - set msg2 [binary format c2S {3 2} $flags ] - # session number - set msg3 "" - if { $session != "" } { - set msg3 [binary format cc 0x0A $session_len] - set msg3 $msg3$session$session_pad - } - # network ID - set msg4 "" - if { $netid != -1 } { - set msg4 [binary format c2sI {0x23 4} 0 0x$netid ] - } - - #catch {puts -nonewline $channel $msg1$model$model_pad$msg2$msg3$msg4$msg5} - puts -nonewline $channel $msg1$msg1b$msg1c$model$model_pad$msg2$msg3$msg4 - if { $opaque_len > 0 } { puts -nonewline $channel $msgop } - - flushChannel channel "Error: API channel was closed" -} - -# -# Configuration Message: (object, type flags, node, types, values) -# This message is more complicated to build because of the list of -# data types and values. -proc sendConfReplyMessage { channel node model types values opaque } { - global showAPI - set prmsg $showAPI - # convert from node name to number - if { [string is alpha [string range $node 0 0]] } { - set node [string range $node 1 end] - } - # add a session number when configuring services - set session "" - set session_len 0 - set session_pad_len 0 - set session_pad "" - if { $node <= 0 && $model == "services" && $opaque == "" } { - global g_current_session - set session [format "0x%x" $g_current_session] - set session_len [string length $session] - set session_pad_len [pad_32bit $session_len] - set session_pad [binary format x$session_pad_len] - incr len [expr {$session_len + $session_pad_len}] - } - - if { $prmsg == 1 } { - puts -nonewline ">CONF(flags=0," - if {$node > -1 } { puts -nonewline "node=$node," } - puts -nonewline "obj=$model,cflags=0" - if {$session != "" } { puts -nonewline "session=$session," } - if {$opaque != "" } { puts -nonewline "opaque=$opaque," } - puts "types=<$types>,values=<$values>) reply" - } - - # types (16-bit values) and values - set n 0 - set type_len [expr {[llength $types] * 2} ] - set type_data [binary format cc 4 $type_len] - set value_data "" - foreach type $types { - set t [binary format S $type] - set type_data $type_data$t - set val [lindex $values $n] - if { $val == "" } { - #puts "warning: empty value $n (type=$type)" - if { $type != 10 } { set val 0 } - } - incr n - lappend value_data $val - }; # end foreach - set value_len 0 - set value_data [join $value_data |] - set msgval [buildStringTLV 0x5 $value_data value_len] - set type_pad_len [pad_32bit $type_len] - set type_pad [binary format x$type_pad_len ] - set model_len [string length $model] - set model_pad_len [pad_32bit $model_len] - set model_pad [binary format x$model_pad_len ] - # opaque data - used when custom configuring services - set opaque_len 0 - set msgop [buildStringTLV 0x50 $opaque opaque_len] - - # 4 bytes header, model TLV - set len [expr 4+2+$model_len+$model_pad_len] - if { $node > -1 } { incr len 8 } - # session number - set msg3 "" - if { $session != "" } { - incr len [expr {2 + $session_len + $session_pad_len }] - set msg3 [binary format cc 0x0A $session_len] - set msg3 $msg3$session$session_pad - } - if { $opaque_len > 0 } { incr len $opaque_len } - # types TLV, values TLV - incr len [expr {2 + $type_len + $type_pad_len + $value_len}] - - # header, node node number, node model header - set msgh [binary format c2S {5 0} $len ] - set msgwl "" - if { $node > -1 } { set msgwl [binary format c2sI {1 4} 0 $node] } - set model_hdr [binary format cc 2 $model_len] - # no flags - set type_hdr [binary format c2S {3 2} 0 ] - set msg $msgh$msgwl$model_hdr$model$model_pad$type_hdr$type_data$type_pad - set msg $msg$msgval$msg3 - puts -nonewline $channel $msg - if { $opaque_len > 0 } { puts -nonewline $channel $msgop } - flushChannel channel "Error sending conf reply" -} - -# Event Message -proc sendEventMessage { channel type nodenum name data flags } { - global showAPI eventtypes - set prmsg $showAPI - - set len [expr 8] ;# event type - if {$nodenum > -1} { incr len 8 } - set name_len [string length $name] - set name_pad_len [pad_32bit $name_len] - if { $name_len > 0 } { incr len [expr {2 + $name_len + $name_pad_len}] } - set data_len [string length $data] - set data_pad_len [pad_32bit $data_len] - if { $data_len > 0 } { incr len [expr {2 + $data_len + $data_pad_len}] } - - if { $prmsg == 1 } { - puts -nonewline ">EVENT(flags=$flags," } - set msg [binary format ccS 8 $flags $len ] ;# message header - - set msg2 "" - if { $nodenum > -1 } { - if { $prmsg == 1 } { puts -nonewline "node=$nodenum," } - set msg2 [binary format c2sI {0x01 4} 0 $nodenum] - } - if { $prmsg == 1} { - set typestr "" - foreach t [array names eventtypes] { - if { $eventtypes($t) == $type } { set typestr "-$t"; break } - } - puts -nonewline "type=$type$typestr," - } - set msg3 [binary format c2sI {0x02 4} 0 $type] - set msg4 "" - set msg5 "" - if { $name_len > 0 } { - if { $prmsg == 1 } { puts -nonewline "name=$name," } - set msg4 [binary format cc 0x03 $name_len ] - set name_pad [binary format x$name_pad_len ] - set msg5 $name$name_pad - } - set msg6 "" - set msg7 "" - if { $data_len > 0 } { - if { $prmsg == 1 } { puts -nonewline "data=$data" } - set msg6 [binary format cc 0x04 $data_len ] - set data_pad [binary format x$data_pad_len ] - set msg7 $data$data_pad - } - - if { $prmsg == 1 } { puts ")" } - puts -nonewline $channel $msg$msg2$msg3$msg4$msg5$msg6$msg7 - flushChannel channel "Error sending Event type=$type" -} - - -# deploy working configuration using CORE API -# Deploys a current working configuration. It creates all the -# nodes and link as defined in configuration file. -proc deployCfgAPI { sock } { - global eid - global node_list link_list annotation_list canvas_list - global mac_byte4 mac_byte5 - global execMode - global ngnodemap - global mac_addr_start - global deployCfgAPI_lock - global eventtypes - global g_comments - - if { ![info exists deployCfgAPI_lock] } { set deployCfgAPI_lock 0 } - if { $deployCfgAPI_lock } { - puts "***error: deployCfgAPI called while deploying config" - return - } - - set deployCfgAPI_lock 1 ;# lock - - set mac_byte4 0 - set mac_byte5 0 - if { [info exists mac_addr_start] } { set mac_byte5 $mac_addr_start } - set t_start [clock seconds] - - global systype - set systype [lindex [checkOS] 0] - statgraph on [expr (2*[llength $node_list]) + [llength $link_list]] - - - sendSessionProperties $sock - - # this tells the CORE services that we are starting to send - # configuration data - # clear any existing config - sendEventMessage $sock $eventtypes(definition_state) -1 "" "" 0 - # inform CORE services about emulation servers, hook scripts, canvas info, - # and services - sendEventMessage $sock $eventtypes(configuration_state) -1 "" "" 0 - sendEmulationServerInfo $sock 0 - sendSessionOptions $sock - sendHooks $sock - sendCanvasInfo $sock - sendNodeTypeInfo $sock 0 - # send any custom service info before the node messages - sendNodeCustomServices $sock - - # send Node add messages for all emulation nodes - foreach node $node_list { - set node_id "$eid\_$node" - set type [nodeType $node] - set name [getNodeName $node] - if { $type == "pseudo" } { continue } - - statgraph inc 1 - statline "Creating node $name" - if { [[typemodel $node].layer] == "NETWORK" } { - nodeHighlights .c $node on red - } - # inform the CORE daemon of the node - sendNodeAddMessage $sock $node - pluginCapsInitialize $node "mobmodel" - writeNodeCoords $node [getNodeCoords $node] - } - - # send Link add messages for all network links - for { set pending_links $link_list } { $pending_links != "" } {} { - set link [lindex $pending_links 0] - set i [lsearch -exact $pending_links $link] - set pending_links [lreplace $pending_links $i $i] - statgraph inc 1 - - set lnode1 [lindex [linkPeers $link] 0] - set lnode2 [lindex [linkPeers $link] 1] - if { [nodeType $lnode2] == "router" && \ - [getNodeModel $lnode2] == "remote" } { - continue; # remote routers are ctrl. by GUI; TODO: move to daemon - } - sendLinkMessage $sock $link add - } - - # GUI-specific meta-data send via Configure Messages - if { [llength $annotation_list] > 0 } { - sendMetaData $sock $annotation_list "annotation" - } - sendMetaData $sock $canvas_list "canvas" ;# assume >= 1 canvas - # global GUI options - send as meta-data - set obj "metadata" - set values [getGlobalOptionList] - sendConfReplyMessage $sock -1 $obj "10" "{global_options=$values}" "" - if { [info exists g_comments] && $g_comments != "" } { - sendConfReplyMessage $sock -1 $obj "10" "{comments=$g_comments}" "" - } - - # status bar graph - statgraph off 0 - statline "Network topology instantiated in [expr [clock seconds] - $t_start] seconds ([llength $node_list] nodes and [llength $link_list] links)." - - # TODO: turn on tcpdump if enabled; customPostConfigCommands; - # addons 4 deployCfgHook - - # draw lines between wlan nodes - # initialization does not work earlier than this - - foreach node $node_list { - # WLAN handling: draw lines between wireless nodes - if { [nodeType $node] == "wlan" && $execMode == "interactive" } { - wlanRunMobilityScript $node - } - } - - sendTrafficScripts $sock - - # tell the CORE services that we are ready to instantiate - sendEventMessage $sock $eventtypes(instantiation_state) -1 "" "" 0 - - set deployCfgAPI_lock 0 ;# unlock - - statline "Network topology instantiated in [expr [clock seconds] - $t_start] seconds ([llength $node_list] nodes and [llength $link_list] links)." -} - -# -# emulation shutdown procedure when using the CORE API -proc shutdownSession {} { - global link_list node_list eid eventtypes execMode - - set nodecount [getNodeCount] - if { $nodecount == 0 } { - # This allows switching to edit mode without extra API messages, - # such as when file new is selected while running an existing session. - return - } - - # prepare the channel - set plugin [lindex [getEmulPlugin "*"] 0] - set sock [pluginConnect $plugin connect true] - - sendEventMessage $sock $eventtypes(datacollect_state) -1 "" "" 0 - - # shut down all links - foreach link $link_list { - - set lnode2 [lindex [linkPeers $link] 1] - if { [nodeType $lnode2] == "router" && \ - [getNodeModel $lnode2] == "remote" } { - continue; # remote routers are ctrl. by GUI; TODO: move to daemon - } - - sendLinkMessage $sock $link delete false - } - # shut down all nodes - foreach node $node_list { - set type [nodeType $node] - if { [[typemodel $node].layer] == "NETWORK" && $execMode != "batch" } { - nodeHighlights .c $node on red - } - sendNodeDelMessage $sock $node - pluginCapsDeinitialize $node "mobmodel" - deleteNodeCoords $node - } - - sendNodeTypeInfo $sock 1 - sendEmulationServerInfo $sock 1 -} - -# inform the CORE services about the canvas information to support -# conversion between X,Y and lat/long coordinates -proc sendCanvasInfo { sock } { - global curcanvas - - if { ![info exists curcanvas] } { return } ;# batch mode - set obj "location" - - set scale [getCanvasScale $curcanvas] - set refpt [getCanvasRefPoint $curcanvas] - set refx [lindex $refpt 0] - set refy [lindex $refpt 1] - set latitude [lindex $refpt 2] - set longitude [lindex $refpt 3] - set altitude [lindex $refpt 4] - - set types [list 2 2 10 10 10 10] - set values [list $refx $refy $latitude $longitude $altitude $scale] - - sendConfReplyMessage $sock -1 $obj $types $values "" -} - -# inform the CORE services about the default services for a node type, which -# are used when node-specific services have not been configured for a node -proc sendNodeTypeInfo { sock reset } { - global node_list - - set obj "services" - - if { $reset == 1} { - sendConfRequestMessage $sock -1 "all" 0x3 -1 "" - return - } - # build a list of node types in use - set typesinuse "" - foreach node $node_list { - set type [nodeType $node] - if { $type != "router" } { continue } - set model [getNodeModel $node] - if { [lsearch $typesinuse $model] < 0 } { lappend typesinuse $model } - } - - foreach type $typesinuse { - # build a list of type + enabled services, all strings - set values [getNodeTypeServices $type] - set values [linsert $values 0 $type] - set types [string repeat "10 " [llength $values]] - sendConfReplyMessage $sock -1 $obj $types $values "" - # send any custom profiles for a node type; node type passed in opaque - set machine_type [getNodeTypeMachineType $type] - set values [getNodeTypeProfile $type] - if { $values != "" } { - set types [string repeat "10 " [llength $values]] - sendConfReplyMessage $sock -1 $machine_type $types $values \ - "$machine_type:$type" - } - } - -} - -# inform the CORE services about any services that have been customized for -# a particular node -proc sendNodeCustomServices { sock } { - global node_list - foreach node $node_list { - set cfgs [getCustomConfig $node] - set cfgfiles "" - foreach cfg $cfgs { - set ids [split [getConfig $cfg "custom-config-id"] :] - if { [lindex $ids 0] != "service" } { continue } - if { [llength $ids] == 3 } { - # customized service config file -- build a list - lappend cfgfiles $cfg - continue - } - set s [lindex $ids 1] - set values [getConfig $cfg "config"] - set t [string repeat "10 " [llength $values]] - sendConfReplyMessage $sock $node services $t $values "service:$s" - } - # send customized service config files after the service info - foreach cfg $cfgfiles { - set idstr [getConfig $cfg "custom-config-id"] - set ids [split $idstr :] - if { [lindex $ids 0] != "service" } { continue } - set s [lindex $ids 1] - set filename [lindex $ids 2] - set data [join [getConfig $cfg "config"] "\n"] - sendFileMessage $sock $node "service:$s" $filename "" $data \ - [string length $data] - } - } -} - -# publish hooks to the CORE services -proc sendHooks { sock } { - global g_hook_scripts - if { ![info exists g_hook_scripts] } { return } - foreach hook $g_hook_scripts { - set name [lindex $hook 0] - set state [lindex $hook 1] - set data [lindex $hook 2] - # TODO: modify sendFileMessage to make node number optional - sendFileMessage $sock n0 "hook:$state" $name "" $data \ - [string length $data] - } -} - -# inform the CORE services about the emulation servers that will be used -proc sendEmulationServerInfo { sock reset } { - global exec_servers - set node -1 ;# not used - set obj "broker" - - set servernames [getAssignedRemoteServers] - if { $servernames == "" } { return } ;# not using emulation servers - - if { $reset == 1} { - sendConfRequestMessage $sock $node $obj 0x3 -1 "" - return - } - - set servers "" - foreach servername $servernames { - set host [lindex $exec_servers($servername) 0] - set port [lindex $exec_servers($servername) 1] - lappend servers "$servername:$host:$port" - } - - set serversstring [join $servers ,] - - set types [list 10] - set values [list $serversstring] - - sendConfReplyMessage $sock $node $obj $types $values "" -} - -# returns the length of node_list minus any pseudo-nodes (inter-canvas nodes) -proc getNodeCount {} { - global node_list - set nodecount 0 - foreach node $node_list { - if { [nodeType $node] != "pseudo" } { incr nodecount } - } - return $nodecount -} - -# send basic properties of a session -proc sendSessionProperties { sock } { - global currentFile CORE_DATA_DIR CORE_USER - set sessionname [file tail $currentFile] - set nodecount [getNodeCount] - if { $sessionname == "" } { set sessionname "untitled" } - set tf "/tmp/thumb.jpg" - if { ![writeCanvasThumbnail .c $tf] } { - set src "$CORE_DATA_DIR/icons/normal/thumb-unknown.gif" - set tf "/tmp/thumb.gif" - if [catch { file copy $src $tf } e] { - puts -nonewline "warning: failed to copy $src to $tf\n($e)" - set tf "" - } - } - set user $CORE_USER - sendSessionMessage $sock 0 0 $sessionname $currentFile $nodecount $tf $user -} - -# send session options from global array in Config Message -proc sendSessionOptions { sock } { - if { $sock == -1 } { - set sock [lindex [getEmulPlugin "*"] 2] - } - set values [getSessionOptionsList] - set types [string repeat "10 " [llength $values]] - sendConfReplyMessage $sock -1 "session" $types $values "" -} - -# send annotations as key=value metadata in Config Message -proc sendAnnotations { sock } { - global annotation_list - - if { $sock == -1 } { - set sock [lindex [getEmulPlugin "*"] 2] - } - set values "" - foreach a $annotation_list { - global $a - set val [set $a] - lappend values "annotation $a=$val" - } - set types [string repeat "10 " [llength $values]] - sendConfReplyMessage $sock -1 "metadata" $types $values "" -} - -# send items as key=value metadata in Config Message -proc sendMetaData { sock items itemtype } { - - if { $sock == -1 } { - set sock [lindex [getEmulPlugin "*"] 2] - } - set values "" - foreach i $items { - global $i - set val [set $i] - lappend values "$itemtype $i=$val" - } - set types [string repeat "10 " [llength $values]] - sendConfReplyMessage $sock -1 "metadata" $types $values "" -} - -# send an Event message for the definition state (this clears any existing -# state), then send all node and link definitions to the CORE services -proc sendNodeLinkDefinitions { sock } { - global node_list link_list annotation_list canvas_list eventtypes - global g_comments - #sendEventMessage $sock $eventtypes(definition_state) -1 "" "" 0 - foreach node $node_list { - sendNodeAddMessage $sock $node - pluginCapsInitialize $node "mobmodel" - } - foreach link $link_list { sendLinkMessage $sock $link add } - # GUI-specific meta-data send via Configure Messages - sendMetaData $sock $annotation_list "annotation" - sendMetaData $sock $canvas_list "canvas" - set obj "metadata" - set values [getGlobalOptionList] - sendConfReplyMessage $sock -1 $obj "10" "{global_options=$values}" "" - if { [info exists g_comments] && $g_comments != "" } { - sendConfReplyMessage $sock -1 $obj "10" "{comments=$g_comments}" "" - } -} - -proc getNodeTypeAPI { node } { - set type [nodeType $node] - if { $type == "router" } { - set model [getNodeModel $node] - set type [getNodeTypeMachineType $model] - } - switch -exact -- "$type" { - router { return 0x0 } - netns { return 0x0 } - jail { return 0x0 } - physical { return 0x1 } - tbd { return 0x3 } - lanswitch { return 0x4 } - hub { return 0x5 } - wlan { return 0x6 } - rj45 { return 0x7 } - tunnel { return 0x8 } - ktunnel { return 0x9 } - emane { return 0xA } - default { return 0x0 } - } -} - -# send an Execute message -proc sendExecMessage { channel node cmd exec_num flags } { - global showAPI g_api_exec_num - set prmsg $showAPI - - set node_num [string range $node 1 end] - set cmd_len [string length $cmd] - if { $cmd_len > 255 } { puts "sendExecMessage error: cmd too long!"; return} - set cmd_pad_len [pad_32bit $cmd_len] - set cmd_pad [binary format x$cmd_pad_len] - - if { $exec_num == 0 } { - incr g_api_exec_num - set exec_num $g_api_exec_num - } - - # node num + exec num + command string - set len [expr {8 + 8 + 2 + $cmd_len + $cmd_pad_len}] - - if { $prmsg == 1 } {puts ">EXEC(flags=$flags,$node,n=$exec_num,cmd='$cmd')" } - - set msg [binary format ccSc2sIc2sIcc \ - 3 $flags $len \ - {1 4} 0 $node_num \ - {2 4} 0 $exec_num \ - 4 $cmd_len \ - ] - puts -nonewline $channel $msg$cmd$cmd_pad - flushChannel channel "Error sending file message" -} - -# if source file (sf) is specified, then send a message that the file source -# file should be copied to the given file name (f); otherwise, include the file -# data in this message -proc sendFileMessage { channel node type f sf data data_len } { - global showAPI - set prmsg $showAPI - - set node_num [string range $node 1 end] - - set f_len [string length $f] - set f_pad_len [pad_32bit $f_len] - set f_pad [binary format x$f_pad_len] - set type_len [string length $type] - set type_pad_len [pad_32bit $type_len] - set type_pad [binary format x$type_pad_len] - if { $sf != "" } { - set sf_len [string length $sf] - set sf_pad_len [pad_32bit $sf_len] - set sf_pad [binary format x$sf_pad_len] - set data_len 0 - set data_pad_len 0 - } else { - set sf_len 0 - set sf_pad_len 0 - set data_pad_len [pad_32bit $data_len] - set data_pad [binary format x$data_pad_len] - } - # TODO: gzip compression w/tlv type 0x11 - - # node number TLV + file name TLV + ( file src name / data TLV) - set len [expr {8 + 2 + 2 + $f_len + $f_pad_len + $sf_len + $sf_pad_len \ - + $data_len + $data_pad_len}] - # 16-bit data length - if { $data_len > 255 } { - incr len 2 - if { $data_len > 65536 } { - puts -nonewline "*** error: File Message data length too large " - puts "($data_len > 65536)" - return - } - } - if { $type_len > 0 } { incr len [expr {2 + $type_len + $type_pad_len}] } - set flags 1; # add flag - - if { $prmsg == 1 } { - puts -nonewline ">FILE(flags=$flags,$node,f=$f," - if { $type != "" } { puts -nonewline "type=$type," } - if { $sf != "" } { puts "src=$sf)" - } else { puts "data=($data_len))" } - } - - set msg [binary format ccSc2sIcc \ - 6 $flags $len \ - {1 4} 0 $node_num \ - 2 $f_len \ - ] - set msg2 "" - if { $type_len > 0 } { - set msg2 [binary format cc 0x5 $type_len] - set msg2 $msg2$type$type_pad - } - if { $sf != "" } { ;# source file name TLV - set msg3 [binary format cc 0x6 $sf_len] - puts -nonewline $channel $msg$f$f_pad$msg2$msg3$sf$sf_pad - } else { ;# file data TLV - if { $data_len > 255 } { - set msg3 [binary format ccS 0x10 0 $data_len] - } else { - set msg3 [binary format cc 0x10 $data_len] - } - puts -nonewline $channel $msg$f$f_pad$msg2$msg3$data$data_pad - } - flushChannel channel "Error sending file message" -} - -# Session Message -proc sendSessionMessage { channel flags num name sfile nodecount tf user } { - global showAPI - set prmsg $showAPI - - if { $channel == -1 } { - set pname [lindex [getEmulPlugin "*"] 0] - set channel [pluginConnect $pname connect true] - if { $channel == -1 } { return } - } - - set num_len [string length $num] - set num_pad_len [pad_32bit $num_len] - set len [expr {2 + $num_len + $num_pad_len}] - if { $num_len <= 0 } { - puts "error: sendSessionMessage requires at least one session number" - return - } - set name_len [string length $name] - set name_pad_len [pad_32bit $name_len] - if { $name_len > 0 } { incr len [expr { 2 + $name_len + $name_pad_len }] } - set sfile_len [string length $sfile] - set sfile_pad_len [pad_32bit $sfile_len] - if { $sfile_len > 0 } { - incr len [expr { 2 + $sfile_len + $sfile_pad_len }] - } - set nc_len [string length $nodecount] - set nc_pad_len [pad_32bit $nc_len] - if { $nc_len > 0 } { incr len [expr { 2 + $nc_len + $nc_pad_len }] } - set tf_len [string length $tf] - set tf_pad_len [pad_32bit $tf_len] - if { $tf_len > 0 } { incr len [expr { 2 + $tf_len + $tf_pad_len }] } - set user_len [string length $user] - set user_pad_len [pad_32bit $user_len] - if { $user_len > 0 } { incr len [expr { 2 + $user_len + $user_pad_len }] } - - if { $prmsg == 1 } { - puts -nonewline ">SESSION(flags=$flags" } - set msgh [binary format ccS 0x09 $flags $len ] ;# message header - - if { $prmsg == 1 } { puts -nonewline ",sids=$num" } - set num_hdr [binary format cc 0x01 $num_len] - set num_pad [binary format x$num_pad_len ] - set msg1 "$num_hdr$num$num_pad" - - set msg2 "" - if { $name_len > 0 } { - if { $prmsg == 1 } { puts -nonewline ",name=$name" } - # TODO: name_len > 255 - set name_hdr [binary format cc 0x02 $name_len] - set name_pad [binary format x$name_pad_len] - set msg2 "$name_hdr$name$name_pad" - } - set msg3 "" - if { $sfile_len > 0 } { - if { $prmsg == 1 } { puts -nonewline ",file=$sfile" } - # TODO: sfile_len > 255 - set sfile_hdr [binary format cc 0x03 $sfile_len] - set sfile_pad [binary format x$sfile_pad_len] - set msg3 "$sfile_hdr$sfile$sfile_pad" - } - set msg4 "" - if { $nc_len > 0 } { - if { $prmsg == 1 } { puts -nonewline ",nc=$nodecount" } - set nc_hdr [binary format cc 0x04 $nc_len] - set nc_pad [binary format x$nc_pad_len] - set msg4 "$nc_hdr$nodecount$nc_pad" - } - set msg5 "" - if { $tf_len > 0 } { - if { $prmsg == 1 } { puts -nonewline ",thumb=$tf" } - set tf_hdr [binary format cc 0x06 $tf_len] - set tf_pad [binary format x$tf_pad_len] - set msg5 "$tf_hdr$tf$tf_pad" - } - set msg6 "" - if { $user_len > 0 } { - if { $prmsg == 1 } { puts -nonewline ",user=$user" } - set user_hdr [binary format cc 0x07 $user_len] - set user_pad [binary format x$user_pad_len] - set msg6 "$user_hdr$user$user_pad" - } - - if { $prmsg == 1 } { puts ")" } - puts -nonewline $channel $msgh$msg1$msg2$msg3$msg4$msg5$msg6 - flushChannel channel "Error sending Session num=$num" -} - -# return a new execution number and record it in the execution request list -# for the given callback (e.g. widget) type -proc newExecCallbackRequest { type } { - global g_api_exec_num g_execRequests - incr g_api_exec_num - set exec_num $g_api_exec_num - lappend g_execRequests($type) $exec_num - return $exec_num -} - -# ask daemon to load or save an XML file based on the current session -proc xmlFileLoadSave { cmd name } { - global oper_mode eventtypes - - set plugin [lindex [getEmulPlugin "*"] 0] - set sock [pluginConnect $plugin connect true] - if { $sock == -1 || $sock == "" } { return } - - # inform daemon about nodes and links when saving in edit mode - if { $cmd == "save" && $oper_mode != "exec" } { - sendSessionProperties $sock - # this tells the CORE services that we are starting to send - # configuration data - # clear any existing config - sendEventMessage $sock $eventtypes(definition_state) -1 "" "" 0 - sendEventMessage $sock $eventtypes(configuration_state) -1 "" "" 0 - sendEmulationServerInfo $sock 0 - sendSessionOptions $sock - sendHooks $sock - sendCanvasInfo $sock - sendNodeTypeInfo $sock 0 - # send any custom service info before the node messages - sendNodeCustomServices $sock - sendNodeLinkDefinitions $sock - } elseif { $cmd == "open" } { - # reset config objects - sendNodeTypeInfo $sock 1 - } - sendEventMessage $sock $eventtypes(file_$cmd) -1 $name "" 0 -} - -############################################################################ -# -# Helper functions below here -# - -# helper function to get interface number from name -proc ifcNameToNum { ifc } { - # eth0, eth1, etc. - if {[string range $ifc 0 2] == "eth"} { - set ifnum [string range $ifc 3 end] - # l0, l1, etc. - } else { - set ifnum [string range $ifc 1 end] - } - if { $ifnum == "" } { - return -1 - } - if {![string is integer $ifnum]} { - return -1 - } - return $ifnum -} - -# -# parse the type and length from a TLV header -proc parseTLVHeader { data current_ref } { - global showAPI - set prmsg $showAPI - upvar $current_ref current - - if { [binary scan $data @${current}cc type length] != 2 } { - if { $prmsg == 1 } { puts "TLV header error" } - return "" - } - set length [expr {$length & 0xFF}]; # convert signed to unsigned - if { $length == 0 } { - if { $type == 0 } { - # prevent endless looping - if { $prmsg == 1 } { puts -nonewline "(extra padding)" } - return "" - } else { - # support for length > 255 - incr current 2 - if { [binary scan $data @${current}S length] != 1 } { - puts "error reading TLV length (type=$type)" - return "" - } - set length [expr {$length & 0xFFFF}] - if { $length == 0 } { - # zero-length string, not length > 255 - incr current -2 - } - } - } - incr current 2 - return [list $type $length] -} - -# return the binary string, and length by reference -proc buildStringTLV { type data len_ref } { - upvar $len_ref len - set data_len [string length $data] - if { $data_len > 65536 } { - puts "warning: buildStringTLV data truncated" - set data_len 65536 - set data [string range 0 65535] - } - set data_pad_len [pad_32bit $data_len] - set data_pad [binary format x$data_pad_len] - - if { $data_len == 0 } { - set len 0 - return "" - } - - if { $data_len > 255 } { - set hdr [binary format ccS $type 0 $data_len] - set hdr_len 4 - } else { - set hdr [binary format cc $type $data_len] - set hdr_len 2 - } - - set len [expr {$hdr_len + $data_len + $data_pad_len}] - - return $hdr$data$data_pad -} - -# calculate padding to 32-bit word boundary -# 32-bit and 64-bit values are pre-padded, strings and 128-bit values are -# post-padded to word boundary, depending on type -proc pad_32bit { len } { - # total length = 2 + len + pad - if { $len < 256 } { - set hdrsiz 2 - } else { - set hdrsiz 4 - } - # calculate padding to fill 32-bit boundary - return [expr { -($hdrsiz + $len) % 4 }] -} - -proc macToString { mac_num } { - set mac_bytes "" - # convert 64-bit integer into 12-digit hex string - set mac_num 0x[format "%.12lx" $mac_num] - while { $mac_num > 0 } { - # append 8-bit hex number to list - set uchar [format "%02x" [expr $mac_num & 0xFF]] - lappend mac_bytes $uchar - # shift off 8-bits - set mac_num [expr $mac_num >> 8] - } - - # make sure we have six hex digits - set num_zeroes [expr 6 - [llength $mac_bytes]] - while { $num_zeroes > 0 } { - lappend mac_bytes 00 - incr num_zeroes -1 - } - - # this is lreverse in tcl8.5 and later - set r {} - set i [llength $mac_bytes] - while { $i > 0 } { lappend r [lindex $mac_bytes [incr i -1]] } - - return [join $r :] -} - -proc hexdump { data } { - # read data as hex - binary scan $data H* hex - # split into pairs of hex digits - regsub -all -- {..} $hex {& } hex - return $hex -} diff --git a/gui/canvas.tcl b/gui/canvas.tcl deleted file mode 100644 index 11c8217b..00000000 --- a/gui/canvas.tcl +++ /dev/null @@ -1,406 +0,0 @@ -# -# Copyright 2005-2008 University of Zagreb, Croatia. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY AUTHOR 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 AUTHOR 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. -# -# - -#****h* imunes/canvas.tcl -# NAME -# canvas.tcl -- file used for manipultaion with canvases in IMUNES -# FUNCTION -# This module is used to define all the actions used for configuring -# canvases in IMUNES. On each canvas a part of the simulation is presented -# If there is no additional canvas defined, simulation is presented on the -# defalut canvas. -# -#**** - -#****f* canvas.tcl/removeCanvas -# NAME -# removeCanvas -- remove canvas -# SYNOPSIS -# removeCanvas $canvas_id -# FUNCTION -# Removes the canvas from simulation. This function does not change the -# configuration of the nodes, i.e. nodes attached to the removed canvas -# remain attached to the same non existing canvas. -# INPUTS -# * canvas_id -- canvas id -#**** - -proc removeCanvas { canvas } { - global canvas_list $canvas - - set i [lsearch $canvas_list $canvas] - set canvas_list [lreplace $canvas_list $i $i] - set $canvas {} -} - -#****f* canvas.tcl/newCanvas -# NAME -# newCanvas -- craete new canvas -# SYNOPSIS -# set canvas_id [newCanvas $canvas_name] -# FUNCTION -# Creates new canvas. Returns the canvas_id of the new canvas. -# If the canvas_name parameter is empty, the name of the new canvas -# is set to CanvasN, where N represents the canvas_id of the new canvas. -# INPUTS -# * canvas_name -- canvas name -# RESULT -# * canvas_id -- canvas id -#**** - -proc newCanvas { name } { - global canvas_list - - set canvas [newObjectId canvas] - global $canvas - lappend canvas_list $canvas - set $canvas {} - if { $name != "" } { - setCanvasName $canvas $name - } else { - setCanvasName $canvas Canvas[string range $canvas 1 end] - } - - return $canvas -} - - -proc setCanvasSize { canvas x y } { - global $canvas - - set i [lsearch [set $canvas] "size *"] - if { $i >= 0 } { - set $canvas [lreplace [set $canvas] $i $i "size {$x $y}"] - } else { - set $canvas [linsert [set $canvas] 1 "size {$x $y}"] - } -} - -proc getCanvasSize { canvas } { - global $canvas g_prefs - - set entry [lrange [lsearch -inline [set $canvas] "size *"] 1 end] - set size [string trim $entry \{\}] - if { $size == "" } { - return "$g_prefs(gui_canvas_x) $g_prefs(gui_canvas_y)" - } else { - return $size - } -} - -#****f* canvas.tcl/getCanvasName -# NAME -# getCanvasName -- get canvas name -# SYNOPSIS -# set canvas_name [getCanvasName $canvas_id] -# FUNCTION -# Returns the name of the canvas. -# INPUTS -# * canvas_id -- canvas id -# RESULT -# * canvas_name -- canvas name -#**** - -proc getCanvasName { canvas } { - global $canvas - - set entry [lrange [lsearch -inline [set $canvas] "name *"] 1 end] - return [string trim $entry \{\}] -} - -#****f* canvas.tcl/setCanvasName -# NAME -# setCanvasName -- set canvas name -# SYNOPSIS -# setCanvasName $canvas_id $canvas_name -# FUNCTION -# Sets the name of the canvas. -# INPUTS -# * canvas_id -- canvas id -# * canvas_name -- canvas name -#**** - -proc setCanvasName { canvas name } { - global $canvas - - set i [lsearch [set $canvas] "name *"] - if { $i >= 0 } { - set $canvas [lreplace [set $canvas] $i $i "name {$name}"] - } else { - set $canvas [linsert [set $canvas] 1 "name {$name}"] - } -} - -# Boeing: canvas wallpaper support -proc getCanvasWallpaper { canvas } { - global $canvas - - set entry [lrange [lsearch -inline [set $canvas] "wallpaper *"] 1 end] - set entry2 [lrange [lsearch -inline \ - [set $canvas] "wallpaper-style *"] 1 end] - return [list [string trim $entry \{\}] [string trim $entry2 \{\}]] -} - -proc setCanvasWallpaper { canvas file style} { - global $canvas - - set i [lsearch [set $canvas] "wallpaper *"] - if { $i >= 0 } { - set $canvas [lreplace [set $canvas] $i $i "wallpaper {$file}"] - } else { - set $canvas [linsert [set $canvas] 1 "wallpaper {$file}"] - } - - set i [lsearch [set $canvas] "wallpaper-style *"] - if { $i >= 0 } { - set $canvas [lreplace [set $canvas] $i $i "wallpaper-style {$style}"] - } else { - set $canvas [linsert [set $canvas] 1 "wallpaper-style {$style}"] - } -} - -# Boeing: manage canvases -proc manageCanvasPopup { x y } { - global curcanvas CORE_DATA_DIR - - set w .entry1 - catch {destroy $w} - toplevel $w -takefocus 1 - - if { $x == 0 && $y == 0 } { - set screen [wm maxsize .] - set x [expr {[lindex $screen 0] / 4}] - set y [expr {[lindex $screen 1] / 4}] - } else { - set x [expr {$x + 10}] - set y [expr {$y - 250}] - } - wm geometry $w +$x+$y - wm title $w "Manage Canvases" - wm iconname $w "Manage Canvases" - - - ttk::frame $w.name - ttk::label $w.name.lab -text "Canvas name:" - ttk::entry $w.name.ent - $w.name.ent insert 0 [getCanvasName $curcanvas] - pack $w.name.lab $w.name.ent -side left -fill x - pack $w.name -side top -padx 4 -pady 4 - - global canvas_list - ttk::frame $w.canv - listbox $w.canv.cl -bg white -yscrollcommand "$w.canv.scroll set" - ttk::scrollbar $w.canv.scroll -orient vertical -command "$w.canv.cl yview" - foreach canvas $canvas_list { - $w.canv.cl insert end [getCanvasName $canvas] - if { $canvas == $curcanvas } { - set curindex [expr {[$w.canv.cl size] - 1}] - } - } - pack $w.canv.cl -side left -pady 4 -fill both -expand true - pack $w.canv.scroll -side left -fill y - pack $w.canv -side top -fill both -expand true -padx 4 -pady 4 - $w.canv.cl selection set $curindex - $w.canv.cl see $curindex - bind $w.canv.cl "manageCanvasSwitch $w" - - ttk::frame $w.buttons2 - foreach b {up down} { - set fn "$CORE_DATA_DIR/icons/tiny/arrow.${b}.gif" - set img$b [image create photo -file $fn] - ttk::button $w.buttons2.$b -image [set img${b}] \ - -command "manageCanvasUpDown $w $b" - } - pack $w.buttons2.up $w.buttons2.down -side left -expand 1 - pack $w.buttons2 -side top -fill x -pady 2 - - # hidden list of canvas numbers - ttk::label $w.list -text $canvas_list - - ttk::frame $w.buttons - ttk::button $w.buttons.apply -text "Apply" -command "manageCanvasApply $w" - ttk::button $w.buttons.cancel -text "Cancel" -command "destroy $w" - pack $w.buttons.apply $w.buttons.cancel -side left -expand 1 - pack $w.buttons -side bottom -fill x -pady 2m - - bind $w "destroy $w" - bind $w "manageCanvasApply $w" - -} - -# Boeing: manage canvases helper -# called when a canvas in the list is double-clicked -proc manageCanvasSwitch { w } { - global canvas_list curcanvas - set i [$w.canv.cl curselection] - if {$i == ""} { return} - set i [lindex $i 0] - set item [$w.canv.cl get $i] - - foreach canvas $canvas_list { - if {[getCanvasName $canvas] == $item} { - $w.name.ent delete 0 end - $w.name.ent insert 0 $item - set curcanvas $canvas - switchCanvas none - return - } - } -} - -# manage canvases helper -# handle the move up/down buttons for the canvas selection window -proc manageCanvasUpDown { w dir } { - global canvas_list - # get the currently selected item - set i [$w.canv.cl curselection] - if {$i == ""} { return} - set i [lindex $i 0] - set item [$w.canv.cl get $i] - - if {$dir == "down" } { - set max [expr {[llength $canvas_list] - 1}] - if {$i >= $max } { return } - set newi [expr {$i + 1}] - } else { - if {$i <= 0} { return } - set newi [expr {$i - 1}] - } - - # change the position - $w.canv.cl delete $i - $w.canv.cl insert $newi $item - $w.canv.cl selection set $newi - $w.canv.cl see $newi - - # update hidden list of canvas numbers - set new_canvas_list [$w.list cget -text] - set item [lindex $new_canvas_list $i] - set new_canvas_list [lreplace $new_canvas_list $i $i] - set new_canvas_list [linsert $new_canvas_list $newi $item] - $w.list configure -text $new_canvas_list -} - -# manage canvases helper -# called when apply button is pressed - changes the order of the canvases -proc manageCanvasApply { w } { - global canvas_list curcanvas changed - # we calculated this list earlier, making life easier here - set new_canvas_list [$w.list cget -text] - if {$canvas_list != $new_canvas_list} { - set canvas_list $new_canvas_list - } - set newname [$w.name.ent get] - destroy $w - if { $newname != [getCanvasName $curcanvas] } { - set changed 1 - } - setCanvasName $curcanvas $newname - switchCanvas none - updateUndoLog -} - -proc setCanvasScale { canvas scale } { - global $canvas - - set i [lsearch [set $canvas] "scale *"] - if { $i >= 0 } { - set $canvas [lreplace [set $canvas] $i $i "scale $scale"] - } else { - set $canvas [linsert [set $canvas] 1 "scale $scale"] - } -} - -proc getCanvasScale { canvas } { - global $canvas g_prefs - - set entry [lrange [lsearch -inline [set $canvas] "scale *"] 1 end] - set scale [string trim $entry \{\}] - if { $scale == "" } { - if { ![info exists g_prefs(gui_canvas_scale)] } { return 150.0 } - return "$g_prefs(gui_canvas_scale)" - } else { - return $scale - } -} - -proc setCanvasRefPoint { canvas refpt } { - global $canvas - - set i [lsearch [set $canvas] "refpt *"] - if { $i >= 0 } { - set $canvas [lreplace [set $canvas] $i $i "refpt {$refpt}"] - } else { - set $canvas [linsert [set $canvas] 1 "refpt {$refpt}"] - } -} - -proc getCanvasRefPoint { canvas } { - global $canvas g_prefs DEFAULT_REFPT - - set entry [lrange [lsearch -inline [set $canvas] "refpt *"] 1 end] - set altitude [string trim $entry \{\}] - if { $altitude == "" } { - if { ![info exists g_prefs(gui_canvas_refpt)] } { - return $DEFAULT_REFPT - } - return "$g_prefs(gui_canvas_refpt)" - } else { - return $altitude - } -} - -# from http://wiki.tcl.tk/1415 (MAK) -proc canvasSee { hWnd items } { - set box [eval $hWnd bbox $items] - - if {$box == ""} { return } - - if {[string match {} [$hWnd cget -scrollregion]] } { - # People really should set -scrollregion you know... - foreach {x y x1 y1} $box break - - set x [expr round(2.5 * ($x1+$x) / [winfo width $hWnd])] - set y [expr round(2.5 * ($y1+$y) / [winfo height $hWnd])] - - $hWnd xview moveto 0 - $hWnd yview moveto 0 - $hWnd xview scroll $x units - $hWnd yview scroll $y units - } else { - # If -scrollregion is set properly, use this - foreach { x y x1 y1 } $box break - foreach { top btm } [$hWnd yview] break - foreach { left right } [$hWnd xview] break - foreach { p q xmax ymax } [$hWnd cget -scrollregion] break - - set xpos [expr (($x1+$x) / 2.0) / $xmax - ($right-$left) / 2.0] - set ypos [expr (($y1+$y) / 2.0) / $ymax - ($btm-$top) / 2.0] - - $hWnd xview moveto $xpos - $hWnd yview moveto $ypos - } -} diff --git a/gui/cfgparse.tcl b/gui/cfgparse.tcl deleted file mode 100644 index 41f25594..00000000 --- a/gui/cfgparse.tcl +++ /dev/null @@ -1,1147 +0,0 @@ -# -# Copyright 2005-2008 University of Zagreb, Croatia. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY AUTHOR 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 AUTHOR 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. -# -# This work was supported in part by the Croatian Ministry of Science -# and Technology through the research contract #IP-2003-143. -# - -#****h* imunes/cfgparse.tcl -# NAME -# cfgparse.tcl -- file used for parsing the configuration -# FUNCTION -# This module is used for parsing the configuration, i.e. reading the -# configuration from a file or a string and writing the configuration -# to a file or a string. This module also contains a function for returning -# a new ID for nodes, links and canvases. -#**** - -#****f* nodecfg.tcl/dumpputs -# NAME -# dumpputs -- puts a string to a file or a string configuration -# SYNOPSIS -# dumpputs $method $destination $string -# FUNCTION -# Puts a sting to the file or appends the string configuration (used for -# undo functions), the choice depends on the value of method parameter. -# INPUTS -# * method -- method used. Possiable values are file (if saving the string -# to the file) and string (if appending the string configuration) -# * dest -- destination used. File_id for files, and string name for string -# configuration -# * string -- the string that is inserted to a file or appended to the string -# configuartion -#**** - -proc dumpputs {method dest string} { - switch -exact -- $method { - file { - puts $dest $string - } - string { - global $dest - append $dest "$string -" - } - } -} - -#****f* nodecfg.tcl/dumpCfg -# NAME -# dumpCfg -- puts the current configuraton to a file or a string -# SYNOPSIS -# dumpCfg $method $destination -# FUNCTION -# Writes the working (current) configuration to a file or a string. -# INPUTS -# * method -- used method. Possiable values are file (saving current congif -# to the file) and string (saving current config in a string) -# * dest -- destination used. File_id for files, and string name for string -# configurations -#**** - -proc dumpCfg {method dest} { - global node_list plot_list link_list canvas_list annotation_list - - global g_comments - if { [info exists g_comments] && $g_comments != "" } { - dumpputs $method $dest "comments \{" - foreach line [split $g_comments "\n"] { dumpputs $method $dest "$line" } - dumpputs $method $dest "\}" - dumpputs $method $dest "" - } - - foreach node $node_list { - global $node - upvar 0 $node lnode - dumpputs $method $dest "node $node \{" - foreach element $lnode { - if { "[lindex $element 0]" == "network-config" } { - dumpputs $method $dest " network-config \{" - foreach line [lindex $element 1] { - dumpputs $method $dest " $line" - } - dumpputs $method $dest " \}" - } elseif { "[lindex $element 0]" == "custom-config" } { - dumpputs $method $dest " custom-config \{" - foreach line [lindex $element 1] { - if { $line != {} } { - if { [catch {set str [lindex $line 0]} err] } { - puts "error loading config: $err" - puts "problem section: [lindex $element 0]" - puts "problem line: $line" - set str "" - } - if { $str == "config" } { - dumpputs $method $dest " config \{" - foreach element [lindex $line 1] { - dumpputs $method $dest " $element" - } - dumpputs $method $dest " \}" - } else { - dumpputs $method $dest " $line" - } - } - } - dumpputs $method $dest " \}" - } elseif { "[lindex $element 0]" == "ipsec-config" } { - dumpputs $method $dest " ipsec-config \{" - foreach line [lindex $element 1] { - if { $line != {} } { - dumpputs $method $dest " $line" - } - } - dumpputs $method $dest " \}" - } elseif { "[lindex $element 0]" == "custom-pre-config-commands" } { - #Boeing custom pre config commands - dumpputs $method $dest " custom-pre-config-commands \{" - foreach line [lindex $element 1] { - dumpputs $method $dest " $line" - } - dumpputs $method $dest " \}" - } elseif { "[lindex $element 0]" == "custom-post-config-commands" } { - #Boeing custom post config commands - dumpputs $method $dest " custom-post-config-commands \{" - foreach line [lindex $element 1] { - dumpputs $method $dest " $line" - } - dumpputs $method $dest " \}" - } elseif { "[lindex $element 0]" == "ine-config" } { - # Boeing: INE config support - dumpputs $method $dest " ine-config \{" - foreach line [lindex $element 1] { - dumpputs $method $dest " $line" - } - dumpputs $method $dest " \}" - # end Boeing - } else { - dumpputs $method $dest " $element" - } - } - dumpputs $method $dest "\}" - dumpputs $method $dest "" - } - - foreach obj "link annotation canvas plot" { - upvar 0 ${obj}_list obj_list - foreach elem $obj_list { - global $elem - upvar 0 $elem lelem - dumpputs $method $dest "$obj $elem \{" - foreach element $lelem { - dumpputs $method $dest " $element" - } - dumpputs $method $dest "\}" - dumpputs $method $dest "" - } - } - - global g_traffic_flows - if { [info exists g_traffic_flows] && [llength $g_traffic_flows] > 0 } { - dumpputs $method $dest "traffic \{" - foreach flow $g_traffic_flows { - dumpputs $method $dest " $flow" - } - dumpputs $method $dest "\}" - dumpputs $method $dest "" - } - - global g_hook_scripts - if { [info exists g_hook_scripts] && [llength $g_hook_scripts] > 0 } { - foreach hook $g_hook_scripts { - set name [lindex $hook 0] - set state [lindex $hook 1] - set script [lindex $hook 2] - dumpputs $method $dest "hook $state:$name \{" - # remove the final newline here because dumpputs adds a - # newline automatically - if {[string index $script end] == "\n"} { - set script [string replace $script end end] - } - dumpputs $method $dest $script - dumpputs $method $dest "\}" - dumpputs $method $dest "" - } - } - - dumpGlobalOptions $method $dest - - # session options - dumpputs $method $dest "option session \{" - foreach kv [getSessionOptionsList] { dumpputs $method $dest " $kv" } - dumpputs $method $dest "\}" - dumpputs $method $dest "" -} - -proc dumpGlobalOptions { method dest } { - global showIfNames showNodeLabels showLinkLabels - global showIfIPaddrs showIfIPv6addrs - global showBkgImage showGrid showAnnotations - global showAPI - global g_view_locked - global g_traffic_start_opt - global mac_addr_start - - dumpputs $method $dest "option global \{" - if {$showIfNames == 0} { - dumpputs $method $dest " interface_names no" - } else { - dumpputs $method $dest " interface_names yes" } - if {$showIfIPaddrs == 0} { - dumpputs $method $dest " ip_addresses no" - } else { - dumpputs $method $dest " ip_addresses yes" } - if {$showIfIPv6addrs == 0} { - dumpputs $method $dest " ipv6_addresses no" - } else { - dumpputs $method $dest " ipv6_addresses yes" } - if {$showNodeLabels == 0} { - dumpputs $method $dest " node_labels no" - } else { - dumpputs $method $dest " node_labels yes" } - if {$showLinkLabels == 0} { - dumpputs $method $dest " link_labels no" - } else { - dumpputs $method $dest " link_labels yes" } - if {$showAPI == 0} { - dumpputs $method $dest " show_api no" - } else { - dumpputs $method $dest " show_api yes" } - if {$showBkgImage == 0} { - dumpputs $method $dest " background_images no" - } else { - dumpputs $method $dest " background_images yes" } - if {$showAnnotations == 0} { - dumpputs $method $dest " annotations no" - } else { - dumpputs $method $dest " annotations yes" } - if {$showGrid == 0} { - dumpputs $method $dest " grid no" - } else { - dumpputs $method $dest " grid yes" } - if {$g_view_locked == 1} { - dumpputs $method $dest " locked yes" } - if { [info exists g_traffic_start_opt] } { - dumpputs $method $dest " traffic_start $g_traffic_start_opt" - } - if { [info exists mac_addr_start] && $mac_addr_start > 0 } { - dumpputs $method $dest " mac_address_start $mac_addr_start" - } - dumpputs $method $dest "\}" - dumpputs $method $dest "" -} - -# get the global options into a list of key=value pairs -proc getGlobalOptionList {} { - global tmp - set tmp "" - dumpGlobalOptions string tmp ;# put "options global {items}" into tmp - set items [lindex $tmp 2] - return [listToKeyValues $items] -} - -proc setGlobalOption { field value } { - global showIfNames showNodeLabels showLinkLabels - global showIfIPaddrs showIfIPv6addrs - global showBkgImage showGrid showAnnotations - global showAPI - global mac_addr_start - global g_traffic_start_opt - global g_view_locked - - switch -exact -- $field { - interface_names { - if { $value == "no" } { - set showIfNames 0 - } elseif { $value == "yes" } { - set showIfNames 1 - } - } - ip_addresses { - if { $value == "no" } { - set showIfIPaddrs 0 - } elseif { $value == "yes" } { - set showIfIPaddrs 1 - } - } - ipv6_addresses { - if { $value == "no" } { - set showIfIPv6addrs 0 - } elseif { $value == "yes" } { - set showIfIPv6addrs 1 - } - } - node_labels { - if { $value == "no" } { - set showNodeLabels 0 - } elseif { $value == "yes" } { - set showNodeLabels 1 - } - } - link_labels { - if { $value == "no" } { - set showLinkLabels 0 - } elseif { $value == "yes" } { - set showLinkLabels 1 - } - } - show_api { - if { $value == "no" } { - set showAPI 0 - } elseif { $value == "yes" } { - set showAPI 1 - } - } - background_images { - if { $value == "no" } { - set showBkgImage 0 - } elseif { $value == "yes" } { - set showBkgImage 1 - } - } - annotations { - if { $value == "no" } { - set showAnnotations 0 - } elseif { $value == "yes" } { - set showAnnotations 1 - } - } - grid { - if { $value == "no" } { - set showGrid 0 - } elseif { $value == "yes" } { - set showGrid 1 - } - } - locked { - if { $value == "yes" } { - set g_view_locked 1 - } else { - set g_view_locked 0 - } - } - mac_address_start { - set mac_addr_start $value - } - traffic_start { - set g_traffic_start_opt $value - } - } -} - -# reset global vars when opening a new file -proc cleanupGUIState {} { - global node_list link_list plot_list canvas_list annotation_list - global mac_addr_start g_comments - global g_traffic_flows g_traffic_start_opt g_hook_scripts - global g_view_locked - - set node_list {} - set link_list {} - set annotation_list {} - set plot_list {} - set canvas_list {} - set g_traffic_flows "" - set g_traffic_start_opt 0 - set g_hook_scripts "" - set g_comments "" - set g_view_locked 0 - resetSessionOptions -} - -#****f* nodecfg.tcl/loadCfg -# NAME -# loadCfg -- loads the current configuration. -# SYNOPSIS -# loadCfg $cfg -# FUNCTION -# Loads the configuration written in the cfg string to a current -# configuration. -# INPUTS -# * cfg -- string containing the new working configuration. -#**** - -proc loadCfg { cfg } { - global node_list plot_list link_list canvas_list annotation_list - global g_traffic_flows g_traffic_start_opt g_hook_scripts - global g_view_locked - global g_comments - - # maximum coordinates - set maxX 0 - set maxY 0 - set do_upgrade [upgradeOldConfig cfg] - if { $do_upgrade == "no"} { return } - - # Cleanup first - cleanupGUIState - set class "" - set object "" - foreach entry $cfg { - if {"$class" == ""} { - set class $entry - continue - } elseif {"$object" == ""} { - set object $entry - if {"$class" == "node"} { - lappend node_list $object - } elseif {"$class" == "link"} { - lappend link_list $object - } elseif {"$class" == "canvas"} { - lappend canvas_list $object - } elseif {"$class" == "plot"} { - lappend plot_list $object - } elseif {"$class" == "option"} { - # do nothing - } elseif {"$class" == "traffic"} { ;# save traffic flows - set g_traffic_flows [split [string trim $object] "\n"] - set class ""; set object ""; continue - } elseif {"$class" == "script"} { - # global_script (old config) becomes a runtime hook - set name "runtime_hook.sh" - set script [string trim $object] - lappend g_hook_scripts [list $name 4 $script] ;# 4=RUNTIME_STATE - set class ""; set object ""; continue - } elseif {"$class" == "hook"} { - continue - } elseif {"$class" == "comments"} { - set g_comments [string trim $object] - set class ""; set object ""; continue - } elseif {"$class" == "annotation"} { - lappend annotation_list $object - } else { - puts "configuration parsing error: unknown object class $class" - #exit 1 - } - # create an empty global variable named object for most objects - global $object - set $object {} - continue - } else { - set line [concat $entry] - # uses 'key=value' instead of 'key value' - if { $object == "session" } { - # 'key=value', values with space needs quoting 'key={space val}' - setSessionOptions "" [split $line "\n"] - set class "" - set object "" - continue - } - # extracts "field { value }" elements from line - if { [catch { set tmp [llength $line] } e] } { - puts "*** Error with line ('$e'):\n$line" - puts "*** Line will be skipped. This is a Tcl limitation, " - puts "*** consider using XML or fixing with whitespace." - continue - } - while {[llength $line] >= 2} { - set field [lindex $line 0] - if {"$field" == ""} { - set line [lreplace $line 0 0] - continue - } - - # consume first two list elements from line - set value [lindex $line 1] - set line [lreplace $line 0 1] - - if {"$class" == "node"} { - switch -exact -- $field { - type { - lappend $object "type $value" - } - mirror { - lappend $object "mirror $value" - } - model { - lappend $object "model $value" - } - cpu { - lappend $object "cpu {$value}" - } - interface-peer { - lappend $object "interface-peer {$value}" - } - network-config { - set cfg "" - foreach zline [split $value { -}] { - if { [string index "$zline" 0] == " " } { - set zline [string replace "$zline" 0 0] - } - lappend cfg $zline - } - set cfg [lrange $cfg 1 [expr {[llength $cfg] - 2}]] - lappend $object "network-config {$cfg}" - } - custom-enabled { - lappend $object "custom-enabled $value" - } - custom-command { - lappend $object "custom-command {$value}" - } - custom-config { - set cfg "" - set have_config 0 - set ccfg {} - foreach zline [split $value "\n"] { - if { [string index "$zline" 0] == \ - " " } { - # remove leading tab character - set zline [string replace "$zline" 0 0] - } - - # flag for config lines - if { $zline == "config \{" } { - set have_config 1 - # collect custom config lines into list - } elseif { $have_config == 1 } { - lappend ccfg $zline - # add non-config lines - } else { - lappend cfg $zline - } - } - # chop off last brace in config { } block and add it - if { $have_config } { - set ccfg [lrange $ccfg 0 \ - [expr {[llength $ccfg] - 3}]] - lappend cfg [list config $ccfg] - } - #set cfg [lrange $cfg 1 [expr {[llength $cfg] - 2}]] - lappend $object "custom-config {$cfg}" - } - ipsec-enabled { - lappend $object "ipsec-enabled $value" - } - ipsec-config { - set cfg "" - - foreach zline [split $value { -}] { - if { [string index "$zline" 0] == " " } { - set zline [string replace "$zline" 0 0] - } - lappend cfg $zline - } - set cfg [lrange $cfg 1 [expr {[llength $cfg] - 2}]] - lappend $object "ipsec-config {$cfg}" - } - iconcoords { - checkMaxCoords $value maxX maxY - lappend $object "iconcoords {$value}" - } - labelcoords { - checkMaxCoords $value maxX maxY - lappend $object "labelcoords {$value}" - } - canvas { - lappend $object "canvas $value" - } - hidden { - lappend $object "hidden $value" - } - /* { - set comment "$field $value" - foreach c $line { - lappend comment $c - # consume one element from line - set line [lreplace $line 0 0] - if { $c == "*/" } { break } - } - lappend $object "$comment" - } - - custom-pre-config-commands { - # Boeing - custom pre config commands - set cfg "" - foreach zline [split $value { -}] { - if { [string index "$zline" 0] == " " } { - set zline [string replace "$zline" 0 0] - } - lappend cfg $zline - } - set cfg [lrange $cfg 1 [expr [llength $cfg] - 2]] - lappend $object "custom-pre-config-commands {$cfg}" - } - custom-post-config-commands { - # Boeing - custom post config commands - set cfg "" - foreach zline [split $value { -}] { - if { [string index "$zline" 0] == " " } { - set zline [string replace "$zline" 0 0] - } - lappend cfg $zline - } - set cfg [lrange $cfg 1 [expr [llength $cfg] - 2]] - lappend $object "custom-post-config-commands {$cfg}" - } - custom-image { - # Boeing - custom-image - lappend $object "custom-image $value" - } - ine-config { - # Boeing - INE - set cfg "" - foreach zline [split $value { -}] { - if { [string index "$zline" 0] == " " } { - set zline [string replace "$zline" 0 0] - } - lappend cfg $zline - } - set cfg [lrange $cfg 1 [expr [llength $cfg] - 2]] - lappend $object "ine-config {$cfg}" - } - tunnel-peer { - # Boeing - Span tunnels - lappend $object "tunnel-peer {$value}" - } - range { - # Boeing - WLAN range - lappend $object "range $value" - } - bandwidth { - # Boeing - WLAN bandwidth - lappend $object "bandwidth $value" - } - cli-enabled { - puts "Warning: cli-enabled setting is deprecated" - } - delay { - # Boeing - WLAN delay - lappend $object "delay $value" - } - ber { - # Boeing - WLAN BER - lappend $object "ber $value" - } - location { - # Boeing - node location - lappend $object "location $value" - } - os { - # Boeing - node OS - # just ignore it, set at runtime - } - services { - lappend $object "services {$value}" - } - - default { - # Boeing - added warning - puts -nonewline "config file warning: unknown confi" - puts "guration item '$field' ignored for $object" - } - } - } elseif {"$class" == "plot"} { - switch -exact -- $field { - name { - lappend $object "name $value" - } - height { - lappend $object "height $value" - } - width { - lappend $object "width $value" - } - x { - lappend $object "x $value" - } - y { - lappend $object "y $value" - } - color { - lappend $object "color $value" - } - } - } elseif {"$class" == "link"} { - switch -exact -- $field { - nodes { - lappend $object "nodes {$value}" - } - mirror { - lappend $object "mirror $value" - } - bandwidth - - delay - - ber - - duplicate - - jitter { - if { [llength $value] > 1 } { ;# down/up-stream - lappend $object "$field {$value}" - } else { - lappend $object "$field $value" - } - } - color { - lappend $object "color $value" - } - width { - lappend $object "width $value" - } - default { - # this enables opaque data to be stored along with - # each link (any key is stored) - lappend $object "$field $value" - # Boeing - added warning - #puts -nonewline "config file warning: unknown conf" - #puts "iguration item '$field' ignored for $object" - } - } - } elseif {"$class" == "canvas"} { - switch -exact -- $field { - name { - lappend $object "name {$value}" - } - size { - lappend $object "size {$value}" - } - bkgImage { - lappend $object "wallpaper {$value}" - } - wallpaper { - lappend $object "wallpaper {$value}" - } - wallpaper-style { - lappend $object "wallpaper-style {$value}" - } - scale { - lappend $object "scale {$value}" - } - refpt { - lappend $object "refpt {$value}" - } - } - } elseif {"$class" == "option"} { - setGlobalOption $field $value - } elseif {"$class" == "annotation"} { - switch -exact -- $field { - type { - lappend $object "type $value" - } - iconcoords { - lappend $object "iconcoords {$value}" - } - color { - lappend $object "color $value" - } - border { - lappend $object "border $value" - } - label { - lappend $object "label {$value}" - } - labelcolor { - lappend $object "labelcolor $value" - } - size { - lappend $object "size $value" - } - canvas { - lappend $object "canvas $value" - } - font { - lappend $object "font {$value}" - } - fontfamily { - lappend $object "fontfamily {$value}" - } - fontsize { - lappend $object "fontsize {$value}" - } - effects { - lappend $object "effects {$value}" - } - width { - lappend $object "width $value" - } - rad { - lappend $object "rad $value" - } - } ;# end switch - } elseif {"$class" == "hook"} { - set state_name [split $object :] - if { [llength $state_name] != 2 } { - puts "invalid hook in config file" - continue - } - set state [lindex $state_name 0] - set name [lindex $state_name 1] - set lines [split $entry "\n"] - set lines [lreplace $lines 0 0] ;# chop extra newline - set lines [join $lines "\n"] - set hook [list $name $state $lines] - lappend g_hook_scripts $hook - set line "" ;# exit this while loop - } ;#endif class - } - } - set class "" - set object "" - } - - # - # Hack for comaptibility with old format files (no canvases) - # - if { $canvas_list == "" } { - set curcanvas [newCanvas ""] - foreach node $node_list { - setNodeCanvas $node $curcanvas - } - } - - - # auto resize canvas - set curcanvas [lindex $canvas_list 0] - set newX 0 - set newY 0 - if { $maxX > [lindex [getCanvasSize $curcanvas] 0] } { - set newX [expr {$maxX + 50}] - } - if { $maxY > [lindex [getCanvasSize $curcanvas] 1] } { - set newY [expr {$maxY + 50}] - } - if { $newX > 0 || $newY > 0 } { - if { $newX == 0 } { set newX [lindex [getCanvasSize $curcanvas] 0] } - if { $newY == 0 } { set newY [lindex [getCanvasSize $curcanvas] 1] } - setCanvasSize $curcanvas $newX $newY - } - - # extra upgrade steps - if { $do_upgrade == "yes" } { - upgradeNetworkConfigToServices - } - upgradeConfigRemoveNode0 - upgradeConfigServices - upgradeWlanConfigs -} - -#****f* nodecfg.tcl/newObjectId -# NAME -# newObjectId -- new object Id -# SYNOPSIS -# set obj_id [newObjectId $type] -# FUNCTION -# Returns the Id for a new object of the defined type. Supported types -# are node, link and canvas. The Id is in the form $mark$number. $mark is the -# first letter of the given type and $number is the first available number to -# that can be used for id. -# INPUTS -# * type -- the type of the new object. Can be node, link or canvas. -# RESULT -# * obj_id -- object Id in the form $mark$number. $mark is the -# first letter of the given type and $number is the first available number to -# that can be used for id. -#**** - -proc newObjectId { type } { - global node_list link_list annotation_list canvas_list - - set mark [string range [set type] 0 0] - set id 1 ;# start numbering at 1, not 0 - while {[lsearch [set [set type]_list] "$mark$id"] != -1} { - incr id - } - return $mark$id -} - - - -# Boeing: pick a new link id for temporary newlinks -proc newlinkId { } { - global link_list - set id [newObjectId link] - set mark "l" - set id 0 - - # alllinks contains a list of all existing and new links - set alllinks $link_list - foreach newlink [.c find withtag "newlink"] { - set newlinkname [lindex [.c gettags $newlink] 1] - lappend alllinks $newlinkname - } - - while {[lsearch $alllinks "$mark$id"] != -1 } { - incr id - } - return $mark$id -} - -# Boeing: helper fn to determine canvas size during load -proc checkMaxCoords { str maxXp maxYp } { - upvar 1 $maxXp maxX - upvar 1 $maxYp maxY - set x [lindex $str 0] - set y [lindex $str 1] - if { $x > $maxX } { - set maxX $x - } - if { $y > $maxY } { - set maxY $y - } - if { [llength $str] == 4 } { - set x [lindex $str 2] - set y [lindex $str 3] - if { $x > $maxX } { - set maxX $x - } - if { $y > $maxY } { - set maxY $y - } - } -} - -# Boeing: pick a router for OSPF -proc newRouterId { type node } { - set mark [string range [set type] 0 0] - for { set id 0 } { $node != "$mark$id" } { incr id } { - } - return "0.0.0.${id}" -} -# end Boeing - -# Boeing: load servers.conf file into exec_servers array -proc loadServersConf { } { - global CONFDIR exec_servers DEFAULT_API_PORT - set confname "$CONFDIR/servers.conf" - if { [catch { set f [open "$confname" r] } ] } { - puts "Creating a default $confname" - if { [catch { set f [open "$confname" w+] } ] } { - puts "***Warning: could not create a default $confname file." - return - } - puts $f "core1 192.168.0.2 $DEFAULT_API_PORT" - puts $f "core2 192.168.0.3 $DEFAULT_API_PORT" - close $f - if { [catch { set f [open "$confname" r] } ] } { - return - } - } - - array unset exec_servers - - while { [ gets $f line ] >= 0 } { - if { [string range $line 0 0] == "#" } { continue } ;# skip comments - set l [split $line] ;# parse fields separated by whitespace - set name [lindex $l 0] - set ip [lindex $l 1] - set port [lindex $l 2] - set sock -1 - if { $name == "" } { continue } ;# blank name - # load array of servers - array set exec_servers [list $name [list $ip $port $sock]] - } - close $f -} -# end Boeing - -# Boeing: write servers.conf file from exec_servers array -proc writeServersConf { } { - global CONFDIR exec_servers - set confname "$CONFDIR/servers.conf" - if { [catch { set f [open "$confname" w] } ] } { - puts "***Warning: could not write servers file: $confname" - return - } - - set header "# servers.conf: list of CORE emulation servers for running" - set header "$header remotely." - puts $f $header - foreach server [lsort -dictionary [array names exec_servers]] { - set ip [lindex $exec_servers($server) 0] - set port [lindex $exec_servers($server) 1] - puts $f "$server $ip $port" - } - close $f -} -# end Boeing - -# display the preferences dialog -proc popupPrefs {} { - global EDITORS TERMS - - set wi .core_prefs - catch { destroy $wi } - toplevel $wi - - wm transient $wi . - wm resizable $wi 0 0 - wm title $wi "Preferences" - - global g_prefs g_prefs_old - array set g_prefs_old [array get g_prefs] - - # - # Paths - # - labelframe $wi.dirs -borderwidth 4 -text "Paths" -relief raised - frame $wi.dirs.conf - label $wi.dirs.conf.label -text "Default configuration file path:" - entry $wi.dirs.conf.entry -bg white -width 40 \ - -textvariable g_prefs(default_conf_path) - pack $wi.dirs.conf.label $wi.dirs.conf.entry -side left - pack $wi.dirs.conf -side top -anchor w -padx 4 -pady 4 - - frame $wi.dirs.mru - label $wi.dirs.mru.label -text "Number of recent files to remember:" - entry $wi.dirs.mru.num -bg white -width 3 \ - -textvariable g_prefs(num_recent) - button $wi.dirs.mru.clear -text "Clear recent files" \ - -command "addFileToMrulist \"\"" - pack $wi.dirs.mru.label $wi.dirs.mru.num $wi.dirs.mru.clear -side left - pack $wi.dirs.mru -side top -anchor w -padx 4 -pady 4 - - pack $wi.dirs -side top -fill x - - # - # Window - # - labelframe $wi.win -borderwidth 4 -text "GUI Window" -relief raised - frame $wi.win.win - checkbutton $wi.win.win.savepos -text "remember window position" \ - -variable g_prefs(gui_save_pos) - checkbutton $wi.win.win.savesiz -text "remember window size" \ - -variable g_prefs(gui_save_size) - pack $wi.win.win.savepos $wi.win.win.savesiz -side left -anchor w -padx 4 - pack $wi.win.win -side top -anchor w -padx 4 -pady 4 - - frame $wi.win.a - checkbutton $wi.win.a.snaptogrid -text "snap to grid" \ - -variable g_prefs(gui_snap_grid) - checkbutton $wi.win.a.showtooltips -text "show tooltips" \ - -variable g_prefs(gui_show_tooltips) - pack $wi.win.a.snaptogrid $wi.win.a.showtooltips \ - -side left -anchor w -padx 4 - pack $wi.win.a -side top -anchor w -padx 4 -pady 4 - - frame $wi.win.canv - label $wi.win.canv.label -text "Default canvas size:" - entry $wi.win.canv.x -bg white -width 5 -textvariable g_prefs(gui_canvas_x) - entry $wi.win.canv.y -bg white -width 5 -textvariable g_prefs(gui_canvas_y) - label $wi.win.canv.label2 -text "Default # of canvases:" - entry $wi.win.canv.num -bg white -width 5 \ - -textvariable g_prefs(gui_num_canvases) - pack $wi.win.canv.label $wi.win.canv.x $wi.win.canv.y \ - $wi.win.canv.label2 $wi.win.canv.num \ - -side left -anchor w -padx 4 - pack $wi.win.canv -side top -anchor w -padx 4 -pady 4 - pack $wi.win -side top -fill x - - # - # Programs - # - labelframe $wi.pr -borderwidth 4 -text "Programs" -relief raised - - frame $wi.pr.editor - label $wi.pr.editor.label -text "Text editor:" - set editors [linsert $EDITORS 0 "EDITOR"] - ttk::combobox $wi.pr.editor.combo -width 10 -exportselection 0 \ - -values $editors -textvariable g_prefs(gui_text_editor) - label $wi.pr.editor.label2 -text "Terminal program:" - set terms [linsert $TERMS 0 "TERM"] - ttk::combobox $wi.pr.editor.combo2 -width 20 -exportselection 0 \ - -values $terms -textvariable g_prefs(gui_term_prog) - pack $wi.pr.editor.label $wi.pr.editor.combo -padx 4 -pady 4 -side left - pack $wi.pr.editor.label2 $wi.pr.editor.combo2 -padx 4 -pady 4 -side left - pack $wi.pr.editor -side top -anchor w -padx 4 -pady 4 - - frame $wi.pr.3d - label $wi.pr.3d.label -text "3D GUI command:" - entry $wi.pr.3d.entry -bg white -width 40 -textvariable g_prefs(gui_3d_path) - pack $wi.pr.3d.label $wi.pr.3d.entry -side left -padx 4 -pady 4 - pack $wi.pr.3d -side top -anchor w -padx 4 -pady 4 - - pack $wi.pr -side top -fill x - - # - # Buttons at the bottom - # - frame $wi.bot -borderwidth 0 - button $wi.bot.apply -text "Save" -command "savePrefsFile; destroy $wi" - button $wi.bot.defaults -text "Load defaults" -command initDefaultPrefs - button $wi.bot.cancel -text "Cancel" -command { - global g_prefs g_prefs_old - array set g_prefs [array get g_prefs_old] - destroy .core_prefs - } - pack $wi.bot.cancel $wi.bot.defaults $wi.bot.apply -side right - pack $wi.bot -side bottom -fill x - after 100 { - catch { grab .core_prefs } - } -} - -# initialize preferences array with default values -proc initDefaultPrefs {} { - global g_prefs CONFDIR SBINDIR DEFAULT_REFPT tcl_platform - - # variable expansions must be done here - array set g_prefs [list default_conf_path "$CONFDIR/configs"] - array set g_prefs [list gui_canvas_refpt "$DEFAULT_REFPT"] - set shell "bash" - array set g_prefs [list shell $shell] - array set g_prefs [list gui_text_editor [get_text_editor true]] - array set g_prefs [list gui_term_prog [get_term_prog true]] - setDefaultAddrs ipv4 - setDefaultAddrs ipv6 - # preferences will be reordered alphabetically - array set g_prefs { - num_recent 4 - log_path "/tmp/core_logs" - gui_save_pos 0 - gui_save_size 0 - gui_snap_grid 0 - gui_show_tooltips 1 - gui_canvas_x 1000 - gui_canvas_y 750 - gui_canvas_scale 150.0 - gui_num_canvases 1 - gui_3d_path "/usr/local/bin/sdt3d.sh" - } - # add new preferences above; keep this at the end of the file -} - - diff --git a/gui/configs/sample1-bg.gif b/gui/configs/sample1-bg.gif deleted file mode 100644 index 98344744698658e0fdbc19a8be28f9bf065018c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319126 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

NU9e(u@he7O? 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

uvBR5V{f}J-cJ3y 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�p?wYX4M{|;z0QetGSy4BB6qLhTB>RQV~-Ph#j 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 v&=+@&p7_)!bWV9_&7i6OSe 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 HKmY(cCWiQ$ diff --git a/gui/configs/sample1.imn b/gui/configs/sample1.imn deleted file mode 100644 index da646f1d..00000000 --- a/gui/configs/sample1.imn +++ /dev/null @@ -1,462 +0,0 @@ -node n1 { - type router - model router - network-config { - hostname n1 - ! - interface eth1 - ip address 10.0.5.1/24 - ipv6 address a:5::1/64 - ! - interface eth0 - ip address 10.0.3.2/24 - ipv6 address a:3::2/64 - ! - } - canvas c1 - iconcoords {384.0 456.0} - labelcoords {384.0 484.0} - interface-peer {eth0 n2} - interface-peer {eth1 n15} -} - -node n2 { - type router - model router - network-config { - hostname n2 - ! - interface eth2 - ip address 10.0.4.1/24 - ipv6 address a:4::1/64 - ! - interface eth1 - ip address 10.0.3.1/24 - ipv6 address a:3::1/64 - ! - interface eth0 - ip address 10.0.2.2/24 - ipv6 address a:2::2/64 - ! - } - canvas c1 - iconcoords {264.0 432.0} - labelcoords {264.0 460.0} - interface-peer {eth0 n3} - interface-peer {eth1 n1} - interface-peer {eth2 n15} -} - -node n3 { - type router - model router - network-config { - hostname n3 - ! - interface eth1 - ip address 10.0.2.1/24 - ipv6 address a:2::1/64 - ! - interface eth0 - ip address 10.0.1.1/24 - ipv6 address a:1::1/64 - ! - } - canvas c1 - iconcoords {120.0 360.0} - labelcoords {120.0 388.0} - interface-peer {eth0 n4} - interface-peer {eth1 n2} -} - -node n4 { - type lanswitch - network-config { - hostname n4 - ! - } - canvas c1 - iconcoords {192.0 252.0} - labelcoords {192.0 280.0} - interface-peer {e0 n3} - interface-peer {e1 n11} - interface-peer {e2 n12} - interface-peer {e3 n13} - interface-peer {e4 n14} -} - -node n5 { - type router - model mdr - network-config { - hostname n5 - ! - interface eth0 - ipv6 address a:0::3/128 - ip address 10.0.0.5/32 - ! - interface eth1 - ip address 10.0.6.2/24 - ipv6 address a:6::2/64 - ! - } - canvas c1 - iconcoords {540.0 348.0} - labelcoords {540.0 376.0} - interface-peer {eth0 n10} - interface-peer {eth1 n15} - services {zebra OSPFv2 OSPFv3MDR IPForward} -} - -node n6 { - type router - model mdr - network-config { - hostname n6 - ! - interface eth0 - ip address 10.0.0.6/32 - ipv6 address a:0::6/128 - ! - } - canvas c1 - iconcoords {780.0 228.0} - labelcoords {780.0 252.0} - interface-peer {eth0 n10} -} - -node n7 { - type router - model mdr - network-config { - hostname n7 - ! - interface eth0 - ip address 10.0.0.7/32 - ipv6 address a:0::7/128 - ! - } - canvas c1 - iconcoords {816.0 348.0} - labelcoords {816.0 372.0} - interface-peer {eth0 n10} -} - -node n8 { - type router - model mdr - network-config { - hostname n8 - ! - interface eth0 - ip address 10.0.0.8/32 - ipv6 address a:0::8/128 - ! - } - canvas c1 - iconcoords {672.0 420.0} - labelcoords {672.0 444.0} - interface-peer {eth0 n10} -} - -node n9 { - type router - model mdr - network-config { - hostname n9 - ! - interface eth0 - ip address 10.0.0.9/32 - ipv6 address a:0::9/128 - ! - } - canvas c1 - iconcoords {672.0 96.0} - labelcoords {672.0 120.0} - interface-peer {eth0 n10} -} - -node n10 { - type wlan - network-config { - hostname wlan10 - ! - interface wireless - ip address 10.0.0.0/32 - ipv6 address a:0::0/128 - ! - mobmodel - coreapi - basic_range - ns2script - ! - } - canvas c1 - iconcoords {852.0 564.0} - labelcoords {852.0 596.0} - interface-peer {e0 n8} - interface-peer {e1 n7} - interface-peer {e2 n5} - interface-peer {e3 n6} - interface-peer {e4 n9} - custom-config { - custom-config-id basic_range - custom-command {3 3 9 9 9} - config { - range=240 - bandwidth=54000000 - jitter=0 - delay=50000 - error=0 - } - } - custom-config { - custom-config-id ns2script - custom-command {10 3 11 10 10} - config { - file=sample1.scen - refresh_ms=50 - loop=1 - autostart=5 - map= - } - } -} - -node n11 { - type router - model PC - network-config { - hostname n11 - ! - interface eth0 - ip address 10.0.1.20/24 - ipv6 address a:1::20/64 - ! - } - canvas c1 - iconcoords {192.0 156.0} - labelcoords {192.0 188.0} - interface-peer {eth0 n4} -} - -node n12 { - type router - model PC - network-config { - hostname n12 - ! - interface eth0 - ip address 10.0.1.21/24 - ipv6 address a:1::21/64 - ! - } - canvas c1 - iconcoords {264.0 156.0} - labelcoords {264.0 188.0} - interface-peer {eth0 n4} -} - -node n13 { - type router - model PC - network-config { - hostname n13 - ! - interface eth0 - ip address 10.0.1.22/24 - ipv6 address a:1::22/64 - ! - } - canvas c1 - iconcoords {336.0 156.0} - labelcoords {336.0 188.0} - interface-peer {eth0 n4} -} - -node n14 { - type router - model host - network-config { - hostname n14 - ! - interface eth0 - ip address 10.0.1.10/24 - ipv6 address a:1::10/64 - ! - } - canvas c1 - iconcoords {348.0 228.0} - labelcoords {348.0 260.0} - interface-peer {eth0 n4} -} - -node n15 { - type router - model router - network-config { - hostname n15 - ! - interface eth2 - ip address 10.0.6.1/24 - ipv6 address a:6::1/64 - ! - interface eth1 - ip address 10.0.5.2/24 - ipv6 address a:5::2/64 - ! - interface eth0 - ip address 10.0.4.2/24 - ipv6 address a:4::2/64 - ! - } - canvas c1 - iconcoords {384.0 312.0} - labelcoords {384.0 340.0} - interface-peer {eth0 n2} - interface-peer {eth1 n1} - interface-peer {eth2 n5} -} - -link l1 { - nodes {n10 n8} - bandwidth 11000000 - delay 25000 -} - -link l0 { - nodes {n10 n7} - bandwidth 11000000 - delay 25000 -} - -link l2 { - nodes {n10 n5} - bandwidth 11000000 - delay 25000 -} - -link l3 { - nodes {n10 n6} - bandwidth 11000000 - delay 25000 -} - -link l4 { - nodes {n10 n9} - bandwidth 11000000 - delay 25000 -} - -link l5 { - nodes {n3 n4} - bandwidth 100000000 -} - -link l6 { - delay 25000 - nodes {n3 n2} - bandwidth 100000000 -} - -link l7 { - nodes {n2 n1} - bandwidth 100000000 -} - -link l8 { - delay 50000 - nodes {n2 n15} - bandwidth 100000000 -} - -link l9 { - nodes {n1 n15} - bandwidth 100000000 -} - -link l10 { - nodes {n15 n5} - bandwidth 100000000 -} - -link l11 { - nodes {n4 n11} - bandwidth 100000000 -} - -link l12 { - nodes {n4 n12} - bandwidth 100000000 -} - -link l13 { - nodes {n4 n13} - bandwidth 100000000 -} - -link l14 { - nodes {n4 n14} - bandwidth 100000000 -} - -annotation a0 { - iconcoords {612.0 492.0} - type text - label {wireless network} - labelcolor black - fontfamily {Arial} - fontsize {12} - effects {bold} - canvas c1 -} - -annotation a1 { - iconcoords {142.0 112.0 393.0 291.0} - type rectangle - label {} - labelcolor black - fontfamily {Arial} - fontsize {12} - color #ebebde - width 1 - border #ffffff - rad 25 - canvas c1 -} - -annotation a2 { - iconcoords {492.0 384.0} - type text - label {gateway} - labelcolor black - fontfamily {Arial} - fontsize {12} - effects {bold} - canvas c1 -} - -canvas c1 { - name {Canvas1} - wallpaper-style {upperleft} - wallpaper {sample1-bg.gif} -} - -option global { - interface_names no - ip_addresses yes - ipv6_addresses no - node_labels yes - link_labels yes - ipsec_configs yes - exec_errors no - show_api no - background_images no - annotations yes - grid no - traffic_start 0 -} - -option session { -} - diff --git a/gui/configs/sample1.scen b/gui/configs/sample1.scen deleted file mode 100644 index c2fc5a44..00000000 --- a/gui/configs/sample1.scen +++ /dev/null @@ -1,28 +0,0 @@ -# -# nodes: 4, max time: 27.000000, max x: 600.00, max y: 600.00 -# nominal range: 300.00 link bw: 54000000.00 -# pause: 30.00, min speed 1.50 max speed: 4.50 - -$node_(6) set X_ 780.0 -$node_(6) set Y_ 228.0 -$node_(6) set Z_ 0.00 -$node_(7) set X_ 816.0 -$node_(7) set Y_ 348.0 -$node_(7) set Z_ 0.00 -$node_(8) set X_ 672.0 -$node_(8) set Y_ 420.0 -$node_(8) set Z_ 0.00 -$node_(9) set X_ 672.0 -$node_(9) set Y_ 96.0 -$node_(9) set Z_ 0.00 -$ns_ at 1.00 "$node_(6) setdest 500.0 178.0 25.0" -$ns_ at 2.00 "$node_(7) setdest 400.0 288.0 15.0" -$ns_ at 1.00 "$node_(8) setdest 590.0 520.0 17.0" -$ns_ at 3.00 "$node_(9) setdest 720.0 300.0 20.0" -$ns_ at 8.00 "$node_(7) setdest 600.0 350.0 10.0" -$ns_ at 9.00 "$node_(8) setdest 730.0 300.0 15.0" -$ns_ at 10.00 "$node_(6) setdest 600.0 108.0 10.0" -$ns_ at 16.00 "$node_(9) setdest 672.0 96.0 20.0" -$ns_ at 17.00 "$node_(7) setdest 816.0 348.0 20.0" -$ns_ at 18.00 "$node_(6) setdest 780.0 228.0 25.0" -$ns_ at 22.00 "$node_(8) setdest 672.0 420.0 20.0" diff --git a/gui/configs/sample10-kitchen-sink.imn b/gui/configs/sample10-kitchen-sink.imn deleted file mode 100644 index dacee547..00000000 --- a/gui/configs/sample10-kitchen-sink.imn +++ /dev/null @@ -1,848 +0,0 @@ -comments { -Kitchen Sink -============ - -Contains every type of node available in CORE, except for physical (prouter) -machine types, and nodes distributed on other emulation servers. - -To get the RJ45 node to work, a test0 interface should first be created like this: - sudo ip link add name test0 type veth peer name test0.1 - -wlan15 uses the basic range model, while wlan24 uses EMANE 802.11 - -gateway nodes n11 and n20 are customized to redistribute routing between OSPFv2 and -OSPFv3 MDR (the MANET networks) -} - -node n1 { - type router - model router - network-config { - hostname n1 - ! - interface eth2 - ip address 10.0.11.2/24 - ipv6 address 2001:11::2/64 - ! - interface eth1 - ip address 10.0.3.1/24 - ipv6 address 2001:3::1/64 - ! - interface eth0 - ip address 10.0.2.1/24 - ipv6 address 2001:2::1/64 - ! - } - canvas c1 - iconcoords {288.0 264.0} - labelcoords {288.0 292.0} - interface-peer {eth0 n3} - interface-peer {eth1 n2} - interface-peer {eth2 n20} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif -} - -node n2 { - type router - model router - network-config { - hostname n2 - ! - interface eth2 - ip address 10.0.5.2/24 - ipv6 address 2001:5::2/64 - ! - interface eth1 - ip address 10.0.3.2/24 - ipv6 address 2001:3::2/64 - ! - interface eth0 - ip address 10.0.0.1/24 - ipv6 address 2001:0::1/64 - ! - } - canvas c1 - iconcoords {576.0 264.0} - labelcoords {576.0 292.0} - interface-peer {eth0 n5} - interface-peer {eth1 n1} - interface-peer {eth2 n19} -} - -node n3 { - type router - model router - network-config { - hostname n3 - ! - interface eth3 - ip address 10.0.9.1/24 - ipv6 address 2001:9::1/64 - ! - interface eth2 - ip address 10.0.4.1/24 - ipv6 address 2001:4::1/64 - ! - interface eth1 - ip address 10.0.2.2/24 - ipv6 address 2001:2::2/64 - ! - interface eth0 - ip address 10.0.1.1/24 - ipv6 address 2001:1::1/64 - ! - } - canvas c1 - iconcoords {288.0 408.0} - labelcoords {288.0 436.0} - interface-peer {eth0 n4} - interface-peer {eth1 n1} - interface-peer {eth2 n19} - interface-peer {eth3 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif -} - -node n4 { - type hub - network-config { - hostname n4 - ! - } - canvas c1 - iconcoords {216.0 528.0} - labelcoords {216.0 552.0} - interface-peer {e0 n3} - interface-peer {e1 n16} - interface-peer {e2 n17} - interface-peer {e3 n18} -} - -node n5 { - type lanswitch - network-config { - hostname n5 - ! - } - canvas c1 - iconcoords {672.0 264.0} - labelcoords {672.0 288.0} - interface-peer {e0 n2} - interface-peer {e1 n6} - interface-peer {e2 n7} - interface-peer {e3 n8} - interface-peer {e4 n25} -} - -node n6 { - type router - model host - network-config { - hostname n6 - ! - interface eth0 - ip address 10.0.0.10/24 - ipv6 address 2001:0::10/64 - ! - } - canvas c1 - iconcoords {792.0 216.0} - labelcoords {792.0 248.0} - interface-peer {eth0 n5} -} - -node n7 { - type router - model host - network-config { - hostname n7 - ! - interface eth0 - ip address 10.0.0.11/24 - ipv6 address 2001:0::11/64 - ! - } - canvas c1 - iconcoords {792.0 288.0} - labelcoords {792.0 320.0} - interface-peer {eth0 n5} -} - -node n8 { - type router - model host - network-config { - hostname n8 - ! - interface eth0 - ip address 10.0.0.12/24 - ipv6 address 2001:0::12/64 - ! - } - canvas c1 - iconcoords {792.0 360.0} - labelcoords {792.0 392.0} - interface-peer {eth0 n5} -} - -node n9 { - type rj45 - network-config { - hostname test0 - ! - } - canvas c1 - iconcoords {576.0 528.0} - labelcoords {576.0 556.0} - interface-peer {0 n19} -} - -node n10 { - type tunnel - network-config { - hostname 10.250.0.91 - ! - interface e0 - ip address 10.250.0.91/24 - ! - tunnel-type - UDP - ! - tunnel-tap - off - ! - tunnel-key - 1 - ! - } - canvas c1 - iconcoords {672.0 504.0} - labelcoords {672.0 536.0} - interface-peer {e0 n19} -} - -node n11 { - type router - model mdr - network-config { - hostname n11 - ! - interface eth1 - ip address 10.0.9.2/24 - ipv6 address 2001:9::2/64 - ! - interface eth0 - ip address 10.0.8.1/32 - ipv6 address 2001:8::1/128 - ! - } - canvas c1 - iconcoords {288.0 624.0} - labelcoords {288.0 656.0} - interface-peer {eth0 n15} - interface-peer {eth1 n3} - custom-config { - custom-config-id service:zebra - custom-command zebra - config { - files=('/usr/local/etc/quagga/Quagga.conf', 'quaggaboot.sh', '/usr/local/etc/quagga/vtysh.conf', ) - } - } - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth0 - ip address 10.0.8.1/32 - ipv6 address 2001:8::1/128 - ipv6 ospf6 instance-id 65 - ipv6 ospf6 hello-interval 2 - ipv6 ospf6 dead-interval 6 - ipv6 ospf6 retransmit-interval 5 - ipv6 ospf6 network manet-designated-router - ipv6 ospf6 diffhellos - ipv6 ospf6 adjacencyconnectivity uniconnected - ipv6 ospf6 lsafullness mincostlsa - ! - interface eth1 - ip address 10.0.9.2/24 - ipv6 address 2001:9::2/64 - ! - router ospf - router-id 10.0.8.1 - network 10.0.8.1/32 area 0 - network 10.0.9.0/24 area 0 - redistribute connected metric-type 1 - redistribute ospf6 metric-type 1 - ! - router ospf6 - router-id 10.0.8.1 - interface eth0 area 0.0.0.0 - redistribute connected - redistribute ospf - ! - - } - } - services {zebra OSPFv2 OSPFv3MDR IPForward} -} - -node n12 { - type router - model mdr - network-config { - hostname n12 - ! - interface eth0 - ip address 10.0.8.2/32 - ipv6 address 2001:8::2/128 - ! - } - canvas c1 - iconcoords {504.0 792.0} - labelcoords {504.0 824.0} - interface-peer {eth0 n15} -} - -node n13 { - type router - model mdr - network-config { - hostname n13 - ! - interface eth0 - ip address 10.0.8.3/32 - ipv6 address 2001:8::3/128 - ! - } - canvas c1 - iconcoords {552.0 672.0} - labelcoords {552.0 704.0} - interface-peer {eth0 n15} -} - -node n14 { - type router - model mdr - network-config { - hostname n14 - ! - interface eth0 - ip address 10.0.8.4/32 - ipv6 address 2001:8::4/128 - ! - } - canvas c1 - iconcoords {720.0 792.0} - labelcoords {720.0 824.0} - interface-peer {eth0 n15} -} - -node n15 { - type wlan - network-config { - hostname wlan15 - ! - interface wireless - ip address 10.0.8.0/32 - ipv6 address 2001:8::0/128 - ! - mobmodel - coreapi - basic_range - ! - } - custom-config { - custom-config-id basic_range - custom-command {3 3 9 9 9} - config { - range=275 - bandwidth=54000000 - jitter=0 - delay=20000 - error=0 - } - } - canvas c1 - iconcoords {120.0 768.0} - labelcoords {120.0 800.0} - interface-peer {e0 n11} - interface-peer {e1 n12} - interface-peer {e2 n13} - interface-peer {e3 n14} -} - -node n16 { - type router - model PC - network-config { - hostname n16 - ! - interface eth0 - ip address 10.0.1.20/24 - ipv6 address 2001:1::20/64 - ! - } - canvas c1 - iconcoords {96.0 456.0} - labelcoords {96.0 488.0} - interface-peer {eth0 n4} -} - -node n17 { - type router - model PC - network-config { - hostname n17 - ! - interface eth0 - ip address 10.0.1.21/24 - ipv6 address 2001:1::21/64 - ! - } - canvas c1 - iconcoords {96.0 600.0} - labelcoords {96.0 632.0} - interface-peer {eth0 n4} -} - -node n18 { - type router - model PC - network-config { - hostname n18 - ! - interface eth0 - ip address 10.0.1.22/24 - ipv6 address 2001:1::22/64 - ! - } - canvas c1 - iconcoords {96.0 528.0} - labelcoords {96.0 560.0} - interface-peer {eth0 n4} -} - -node n19 { - type router - model router - network-config { - hostname n19 - ! - interface eth3 - ip address 10.0.7.1/24 - ipv6 address 2001:7::1/64 - ! - interface eth2 - ip address 10.0.6.1/24 - ipv6 address 2001:6::1/64 - ! - interface eth1 - ip address 10.0.5.1/24 - ipv6 address 2001:5::1/64 - ! - interface eth0 - ip address 10.0.4.2/24 - ipv6 address 2001:4::2/64 - ! - } - canvas c1 - iconcoords {576.0 408.0} - labelcoords {576.0 436.0} - interface-peer {eth0 n3} - interface-peer {eth1 n2} - interface-peer {eth2 n9} - interface-peer {eth3 n10} -} - -node n20 { - type router - model mdr - network-config { - hostname n20 - ! - interface eth1 - ip address 10.0.11.1/24 - ipv6 address 2001:11::1/64 - ! - interface eth0 - ip address 10.0.10.1/32 - ipv6 address 2001:10::1/128 - ! - } - canvas c1 - iconcoords {288.0 168.0} - labelcoords {288.0 200.0} - interface-peer {eth0 n24} - interface-peer {eth1 n1} - custom-config { - custom-config-id service:zebra - custom-command zebra - config { - files=('/usr/local/etc/quagga/Quagga.conf', 'quaggaboot.sh', '/usr/local/etc/quagga/vtysh.conf', ) - } - } - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth0 - ip address 10.0.10.1/32 - ipv6 address 2001:10::1/128 - ipv6 ospf6 instance-id 65 - ipv6 ospf6 hello-interval 2 - ipv6 ospf6 dead-interval 6 - ipv6 ospf6 retransmit-interval 5 - ipv6 ospf6 network manet-designated-router - ipv6 ospf6 diffhellos - ipv6 ospf6 adjacencyconnectivity uniconnected - ipv6 ospf6 lsafullness mincostlsa - ! - interface eth1 - ip address 10.0.11.1/24 - ipv6 address 2001:11::1/64 - ! - router ospf - router-id 10.0.10.1 - network 10.0.10.1/32 area 0 - network 10.0.11.0/24 area 0 - redistribute connected metric-type 1 - redistribute ospf6 metric-type 1 - ! - router ospf6 - router-id 10.0.10.1 - interface eth0 area 0.0.0.0 - redistribute connected - redistribute ospf - ! - - } - } - services {zebra OSPFv2 OSPFv3MDR IPForward} -} - -node n21 { - type router - model mdr - network-config { - hostname n21 - ! - interface eth0 - ip address 10.0.10.2/32 - ipv6 address 2001:10::2/128 - ! - } - canvas c1 - iconcoords {240.0 48.0} - labelcoords {240.0 80.0} - interface-peer {eth0 n24} -} - -node n22 { - type router - model mdr - network-config { - hostname n22 - ! - interface eth0 - ip address 10.0.10.3/32 - ipv6 address 2001:10::3/128 - ! - } - canvas c1 - iconcoords {504.0 48.0} - labelcoords {504.0 80.0} - interface-peer {eth0 n24} -} - -node n23 { - type router - model mdr - network-config { - hostname n23 - ! - interface eth0 - ip address 10.0.10.4/32 - ipv6 address 2001:10::4/128 - ! - } - canvas c1 - iconcoords {144.0 168.0} - labelcoords {144.0 200.0} - interface-peer {eth0 n24} -} - -node n24 { - type wlan - network-config { - hostname wlan24 - ! - interface wireless - ip address 10.0.10.0/32 - ipv6 address 2001:10::0/128 - ! - mobmodel - coreapi - emane_ieee80211abg - ! - } - custom-config { - custom-config-id basic_range - custom-command {3 3 9 9 9} - config { - range=275 - bandwidth=54000000 - jitter=0 - delay=20000 - error=0 - } - } - canvas c1 - iconcoords {48.0 72.0} - labelcoords {48.0 104.0} - interface-peer {e0 n20} - interface-peer {e1 n21} - interface-peer {e2 n22} - interface-peer {e3 n23} -} - -node n25 { - type lanswitch - network-config { - hostname n25 - ! - } - canvas c1 - iconcoords {624.0 192.0} - labelcoords {624.0 216.0} - interface-peer {e0 n5} - interface-peer {e1 n26} -} - -node n26 { - type router - model PC - network-config { - hostname n26 - ! - interface eth0 - ip address 10.0.0.20/24 - ipv6 address 2001:0::20/64 - ! - } - canvas c1 - iconcoords {720.0 144.0} - labelcoords {720.0 176.0} - interface-peer {eth0 n25} -} - -link l1 { - nodes {n2 n5} - bandwidth 0 -} - -link l2 { - delay 8000 - nodes {n3 n4} - bandwidth 1024000 -} - -link l3 { - nodes {n1 n3} - bandwidth 0 -} - -link l4 { - nodes {n1 n2} - bandwidth 0 -} - -link l5 { - nodes {n5 n6} - bandwidth 0 -} - -link l6 { - nodes {n5 n7} - bandwidth 0 -} - -link l7 { - nodes {n5 n8} - bandwidth 0 -} - -link l8 { - nodes {n3 n19} - bandwidth 0 -} - -link l9 { - nodes {n19 n2} - bandwidth 0 -} - -link l10 { - nodes {n4 n16} - bandwidth 0 -} - -link l11 { - nodes {n4 n17} - bandwidth 0 -} - -link l12 { - nodes {n4 n18} - bandwidth 0 -} - -link l13 { - nodes {n19 n9} -} - -link l14 { - nodes {n19 n10} -} - -link l15 { - nodes {n15 n11} -} - -link l16 { - nodes {n15 n12} -} - -link l17 { - nodes {n15 n13} -} - -link l18 { - nodes {n15 n14} -} - -link l19 { - nodes {n3 n11} - bandwidth 0 -} - -link l20 { - nodes {n24 n20} -} - -link l21 { - nodes {n24 n21} -} - -link l22 { - nodes {n24 n22} -} - -link l23 { - nodes {n24 n23} -} - -link l24 { - nodes {n20 n1} - bandwidth 0 -} - -link l25 { - delay 5000 - nodes {n25 n5} - bandwidth 0 -} - -link l26 { - nodes {n25 n26} - bandwidth 0 -} - -annotation a1 { - iconcoords {45.0 431.0 220.0 642.0} - type rectangle - label {} - labelcolor black - fontfamily {Arial} - fontsize {12} - color #e6f4f4 - width 0 - border black - rad 0 - canvas c1 -} - -annotation a2 { - iconcoords {642 189 821 404} - type rectangle - label {} - labelcolor black - fontfamily {Arial} - fontsize {12} - color #e6f4f4 - width 0 - border black - rad 0 - canvas c1 -} - -annotation a3 { - iconcoords {200 218 655 463} - type rectangle - label {} - labelcolor black - fontfamily {Arial} - fontsize {12} - color #f4f1f0 - width 0 - border black - rad 0 - canvas c1 -} - -annotation a4 { - iconcoords {600.0 48.0} - type text - label {Kitchen Sink Scenario} - labelcolor black - fontfamily {FreeSans} - fontsize {16} - effects {bold} - canvas c1 -} - -annotation a5 { - iconcoords {648.0 72.0} - type text - label {see scenario comments} - labelcolor black - fontfamily {FreeSans} - fontsize {12} - canvas c1 -} - -canvas c1 { - name {Canvas1} - refpt {0 0 47.5791667 -122.132322 150} - scale {150.0} - size {1000 1000} -} - -option global { - interface_names no - ip_addresses yes - ipv6_addresses yes - node_labels yes - link_labels yes - ipsec_configs yes - exec_errors yes - show_api no - background_images no - annotations yes - grid yes - traffic_start 0 -} - -option session { - enablesdt=1 -} - diff --git a/gui/configs/sample11-sdn.imn b/gui/configs/sample11-sdn.imn deleted file mode 100644 index a41dbc11..00000000 --- a/gui/configs/sample11-sdn.imn +++ /dev/null @@ -1,291 +0,0 @@ -node n1 { - type router - model host - network-config { - hostname ryu1 - ! - interface eth1 - ip address 10.0.5.10/24 - ipv6 address 2001:5::10/64 - ! - interface eth0 - ip address 10.0.4.10/24 - ipv6 address 2001:4::10/64 - ! - } - canvas c1 - iconcoords {203.0 65.0} - labelcoords {203.0 97.0} - interface-peer {eth0 n2} - interface-peer {eth1 n3} -} - -node n2 { - type router - model OVS - network-config { - hostname ovs1 - ! - interface eth2 - ip address 10.0.4.1/24 - ipv6 address 2001:4::1/64 - ! - interface eth1 - ip address 10.0.1.1/24 - ipv6 address 2001:1::1/64 - ! - interface eth0 - ip address 10.0.0.1/24 - ipv6 address 2001:0::1/64 - ! - } - canvas c1 - iconcoords {124.0 213.0} - labelcoords {124.0 245.0} - interface-peer {eth0 n6} - interface-peer {eth1 n4} - interface-peer {eth2 n1} -} - -node n3 { - type router - model OVS - network-config { - hostname ovs2 - ! - interface eth2 - ip address 10.0.5.1/24 - ipv6 address 2001:5::1/64 - ! - interface eth1 - ip address 10.0.3.1/24 - ipv6 address 2001:3::1/64 - ! - interface eth0 - ip address 10.0.2.1/24 - ipv6 address 2001:2::1/64 - ! - } - canvas c1 - iconcoords {299.0 220.0} - labelcoords {299.0 252.0} - interface-peer {eth0 n7} - interface-peer {eth1 n5} - interface-peer {eth2 n1} -} - -node n4 { - type router - model host - network-config { - hostname n4 - ! - interface eth0 - ip address 10.0.1.10/24 - ipv6 address 2001:1::10/64 - ! - } - canvas c1 - iconcoords {39.0 313.0} - labelcoords {39.0 345.0} - interface-peer {eth0 n2} -} - -node n5 { - type router - model host - network-config { - hostname n5 - ! - interface eth0 - ip address 10.0.3.10/24 - ipv6 address 2001:3::10/64 - ! - } - canvas c1 - iconcoords {286.0 327.0} - labelcoords {286.0 359.0} - interface-peer {eth0 n3} -} - -node n6 { - type router - model host - network-config { - hostname n6 - ! - interface eth0 - ip address 10.0.0.10/24 - ipv6 address 2001:0::10/64 - ! - } - canvas c1 - iconcoords {131.0 322.0} - labelcoords {131.0 354.0} - interface-peer {eth0 n2} -} - -node n7 { - type router - model host - network-config { - hostname n7 - ! - interface eth0 - ip address 10.0.2.10/24 - ipv6 address 2001:2::10/64 - ! - } - canvas c1 - iconcoords {373.0 328.0} - labelcoords {373.0 360.0} - interface-peer {eth0 n3} -} - -node n8 { - type router - model mdr - network-config { - hostname n8 - ! - interface eth0 - ip address 10.0.6.1/32 - ipv6 address 2001:6::1/128 - ! - } - canvas c1 - iconcoords {579.0 102.0} - labelcoords {579.0 134.0} - interface-peer {eth0 n11} -} - -node n9 { - type router - model mdr - network-config { - hostname n9 - ! - interface eth0 - ip address 10.0.6.2/32 - ipv6 address 2001:6::2/128 - ! - } - canvas c1 - iconcoords {493.0 212.0} - labelcoords {493.0 244.0} - interface-peer {eth0 n11} -} - -node n10 { - type router - model mdr - network-config { - hostname n10 - ! - interface eth0 - ip address 10.0.6.3/32 - ipv6 address 2001:6::3/128 - ! - } - canvas c1 - iconcoords {674.0 225.0} - labelcoords {674.0 257.0} - interface-peer {eth0 n11} -} - -node n11 { - type wlan - network-config { - hostname mobile-sdn - ! - interface wireless - ip address 10.0.6.0/32 - ipv6 address 2001:6::0/128 - ! - mobmodel - coreapi - basic_range - ! - } - custom-config { - custom-config-id basic_range - custom-command {3 3 9 9 9} - config { - range=275 - bandwidth=54000000 - jitter=0 - delay=20000 - error=0 - } - } - canvas c1 - iconcoords {683.0 127.0} - labelcoords {683.0 159.0} - interface-peer {e0 n8} - interface-peer {e1 n9} - interface-peer {e2 n10} -} - -link l1 { - nodes {n2 n6} - bandwidth 0 -} - -link l2 { - nodes {n2 n4} - bandwidth 0 -} - -link l3 { - nodes {n3 n7} - bandwidth 0 -} - -link l4 { - nodes {n3 n5} - bandwidth 0 -} - -link l5 { - nodes {n1 n2} - bandwidth 0 -} - -link l6 { - nodes {n1 n3} - bandwidth 0 -} - -link l7 { - nodes {n11 n8} -} - -link l8 { - nodes {n11 n9} -} - -link l9 { - nodes {n11 n10} -} - -canvas c1 { - name {Canvas1} -} - -option global { - interface_names no - ip_addresses yes - ipv6_addresses no - node_labels yes - link_labels yes - show_api no - background_images no - annotations yes - grid yes - traffic_start 0 - mac_address_start 80 -} - -option session { -} - diff --git a/gui/configs/sample2-ssh.imn b/gui/configs/sample2-ssh.imn deleted file mode 100644 index d79a5f3b..00000000 --- a/gui/configs/sample2-ssh.imn +++ /dev/null @@ -1,248 +0,0 @@ -node n8 { - type router - model router - network-config { - hostname n8 - ! - interface eth3 - ip address 10.0.6.2/24 - ipv6 address a:6::2/64 - ! - interface eth2 - ip address 10.0.3.1/24 - ipv6 address a:3::1/64 - ! - interface eth1 - ip address 10.0.1.1/24 - ipv6 address a:1::1/64 - ! - interface eth0 - ip address 10.0.0.1/24 - ipv6 address a:0::1/64 - ! - } - canvas c1 - iconcoords {264.0 168.0} - labelcoords {264.0 196.0} - interface-peer {eth0 n1} - interface-peer {eth1 n4} - interface-peer {eth2 n7} - interface-peer {eth3 n6} -} - -node n1 { - type router - model router - network-config { - hostname n1 - ! - interface eth3 - ip address 10.0.5.1/24 - ipv6 address a:5::1/64 - ! - interface eth2 - ip address 10.0.4.2/24 - ipv6 address a:4::2/64 - ! - interface eth1 - ip address 10.0.2.1/24 - ipv6 address a:2::1/64 - ! - interface eth0 - ip address 10.0.0.2/24 - ipv6 address a:0::2/64 - ! - } - canvas c1 - iconcoords {528.0 312.0} - labelcoords {528.0 340.0} - interface-peer {eth0 n8} - interface-peer {eth1 n5} - interface-peer {eth2 n7} - interface-peer {eth3 n6} -} - -node n2 { - type router - model host - cpu {{min 0} {max 100} {weight 1}} - network-config { - hostname sshserver - ! - interface eth0 - ip address 10.0.2.10/24 - ipv6 address a:2::10/64 - ! - } - canvas c1 - iconcoords {732.0 84.0} - labelcoords {671.0 95.0} - interface-peer {eth0 n5} -} - -node n3 { - type router - model PC - cpu {{min 0} {max 100} {weight 1}} - network-config { - hostname sshclient - ! - interface eth0 - ip address 10.0.1.20/24 - ipv6 address a:1::20/64 - ! - } - canvas c1 - iconcoords {72.0 252.0} - labelcoords {86.0 295.0} - interface-peer {eth0 n4} -} - -node n4 { - type lanswitch - network-config { - hostname n4 - ! - } - canvas c1 - iconcoords {120.0 120.0} - labelcoords {120.0 148.0} - interface-peer {e0 n3} - interface-peer {e1 n8} -} - -node n5 { - type lanswitch - network-config { - hostname n5 - ! - } - canvas c1 - iconcoords {708.0 204.0} - labelcoords {708.0 232.0} - interface-peer {e0 n1} - interface-peer {e1 n2} -} - -node n6 { - type router - model router - network-config { - hostname n6 - ! - interface eth1 - ip address 10.0.6.1/24 - ipv6 address a:6::1/64 - ! - interface eth0 - ip address 10.0.5.2/24 - ipv6 address a:5::2/64 - ! - } - canvas c1 - iconcoords {480.0 132.0} - labelcoords {480.0 160.0} - interface-peer {eth0 n1} - interface-peer {eth1 n8} -} - -node n7 { - type router - model router - network-config { - hostname n7 - ! - interface eth1 - ip address 10.0.4.1/24 - ipv6 address a:4::1/64 - ! - interface eth0 - ip address 10.0.3.2/24 - ipv6 address a:3::2/64 - ! - } - canvas c1 - iconcoords {312.0 348.0} - labelcoords {312.0 376.0} - interface-peer {eth0 n8} - interface-peer {eth1 n1} -} - -link l0 { - nodes {n8 n1} - bandwidth 0 -} - -link l1 { - nodes {n4 n3} - bandwidth 0 -} - -link l2 { - nodes {n4 n8} - bandwidth 0 -} - -link l3 { - nodes {n1 n5} - bandwidth 0 -} - -link l4 { - nodes {n5 n2} - bandwidth 0 -} - -link l5 { - nodes {n8 n7} - bandwidth 0 -} - -link l6 { - nodes {n7 n1} - bandwidth 0 -} - -link l7 { - nodes {n1 n6} - bandwidth 0 -} - -link l8 { - nodes {n6 n8} - bandwidth 0 -} - -annotation a0 { - iconcoords {202 75 612 405} - type rectangle - label {provider network} - labelcolor black - fontfamily {Arial} - fontsize 10 - color #f8f8d6 - width 0 - border black - rad 25 - canvas c1 -} - -canvas c1 { - name {Canvas1} -} - -option global { - interface_names no - ip_addresses yes - ipv6_addresses yes - node_labels yes - link_labels yes - ipsec_configs yes - remote_exec no - exec_errors yes - show_api no - background_images no - annotations yes - grid yes -} - diff --git a/gui/configs/sample3-bgp.imn b/gui/configs/sample3-bgp.imn deleted file mode 100644 index b31693ef..00000000 --- a/gui/configs/sample3-bgp.imn +++ /dev/null @@ -1,657 +0,0 @@ -node n1 { - type router - model router - network-config { - hostname router1 - ! - interface eth2 - ip address 10.0.8.2/24 - ! - interface eth1 - ip address 10.0.6.1/24 - ! - interface eth0 - ip address 10.0.5.2/24 - ! - } - iconcoords {168.0 264.0} - labelcoords {168.0 288.0} - interface-peer {eth0 n16} - interface-peer {eth1 n2} - interface-peer {eth2 n3} - canvas c1 - services {zebra BGP IPForward} - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth2 - ip address 10.0.8.2/24 - ! - interface eth1 - ip address 10.0.6.1/24 - ! - interface eth0 - ip address 10.0.5.2/24 - ! - router bgp 105 - bgp router-id 10.0.8.2 - redistribute connected - neighbor 10.0.6.2 remote-as 105 - neighbor 10.0.6.2 next-hop-self - neighbor 10.0.5.1 remote-as 105 - neighbor 10.0.5.1 next-hop-self - neighbor 10.0.8.1 remote-as 2901 - neighbor 10.0.8.1 next-hop-self - ! - } - } -} - -node n2 { - type router - model router - network-config { - hostname router2 - ! - interface eth2 - ip address 10.0.9.1/24 - ! - interface eth1 - ip address 10.0.7.1/24 - ! - interface eth0 - ip address 10.0.6.2/24 - ! - } - iconcoords {312.0 168.0} - labelcoords {312.0 192.0} - interface-peer {eth0 n1} - interface-peer {eth1 n16} - interface-peer {eth2 n6} - canvas c1 - services {zebra BGP IPForward} - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth2 - ip address 10.0.9.1/24 - ! - interface eth1 - ip address 10.0.7.1/24 - ! - interface eth0 - ip address 10.0.6.2/24 - ! - router bgp 105 - bgp router-id 10.0.8.2 - redistribute connected - neighbor 10.0.7.2 remote-as 105 - neighbor 10.0.7.2 next-hop-self - neighbor 10.0.6.1 remote-as 105 - neighbor 10.0.6.1 next-hop-self - neighbor 10.0.9.2 remote-as 2902 - neighbor 10.0.9.2 next-hop-self - ! - } - } -} - -node n3 { - type router - model router - network-config { - hostname router3 - ! - interface eth1 - ip address 10.0.8.1/24 - ! - interface eth0 - ip address 10.0.2.1/24 - ! - } - iconcoords {96.0 408.0} - labelcoords {96.0 432.0} - interface-peer {eth0 n4} - interface-peer {eth1 n1} - canvas c1 - services {zebra BGP IPForward} - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth1 - ip address 10.0.8.1/24 - ! - interface eth0 - ip address 10.0.2.1/24 - ! - router bgp 2901 - bgp router-id 10.0.2.1 - redistribute connected - neighbor 10.0.2.2 remote-as 2901 - neighbor 10.0.2.2 next-hop-self - neighbor 10.0.8.2 remote-as 105 - neighbor 10.0.8.2 next-hop-self - ! - } - } -} - -node n4 { - type router - model router - network-config { - hostname router4 - ! - interface eth0 - ip address 10.0.2.2/24 - ! - interface eth1 - ip address 10.0.10.1/24 - ! - interface eth2 - ip address 10.0.0.1/24 - ! - } - iconcoords {240.0 432.0} - labelcoords {240.0 456.0} - interface-peer {eth2 n9} - interface-peer {eth0 n3} - interface-peer {eth1 n7} - canvas c1 - services {zebra BGP IPForward} - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth0 - ip address 10.0.2.2/24 - ! - interface eth1 - ip address 10.0.10.1/24 - ! - interface eth2 - ip address 10.0.0.1/24 - ! - router bgp 2901 - bgp router-id 10.0.10.1 - redistribute connected - neighbor 10.0.2.1 remote-as 2901 - neighbor 10.0.2.1 next-hop-self - neighbor 10.0.10.2 remote-as 2902 - neighbor 10.0.10.2 next-hop-self - network 10.0.0.0 mask 255.255.255.0 - ! - } - } -} - -node n5 { - type router - model router - network-config { - hostname router5 - ! - interface eth1 - ip address 10.0.4.1/24 - ! - interface eth0 - ip address 10.0.3.2/24 - ! - interface eth2 - ip address 10.0.1.1/24 - ! - } - iconcoords {528.0 336.0} - labelcoords {528.0 360.0} - interface-peer {eth2 n8} - interface-peer {eth0 n7} - interface-peer {eth1 n6} - canvas c1 - services {zebra BGP IPForward} - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth1 - ip address 10.0.4.1/24 - ! - interface eth0 - ip address 10.0.3.2/24 - ! - interface eth2 - ip address 10.0.1.1/24 - ! - router bgp 2902 - bgp router-id 10.0.4.1 - redistribute connected - neighbor 10.0.4.2 remote-as 2902 - neighbor 10.0.4.2 next-hop-self - neighbor 10.0.3.1 remote-as 2902 - neighbor 10.0.3.1 next-hop-self - network 10.0.1.0 mask 255.255.255.0 - ! - } - } -} - -node n6 { - type router - model router - network-config { - hostname router6 - ! - interface eth1 - ip address 10.0.9.2/24 - ! - interface eth0 - ip address 10.0.4.2/24 - ! - router bgp 2902 - bgp router-id 10.0.9.2 - redistribute connected - neighbor 10.0.4.1 remote-as 2902 - neighbor 10.0.4.1 next-hop-self - neighbor 10.0.9.1 remote-as 105 - neighbor 10.0.9.1 next-hop-self - ! - } - iconcoords {624.0 240.0} - labelcoords {624.0 264.0} - interface-peer {eth0 n5} - interface-peer {eth1 n2} - canvas c1 - services {zebra BGP IPForward} - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth1 - ip address 10.0.9.2/24 - ! - interface eth0 - ip address 10.0.4.2/24 - ! - router bgp 2902 - bgp router-id 10.0.9.2 - redistribute connected - neighbor 10.0.4.1 remote-as 2902 - neighbor 10.0.4.1 next-hop-self - neighbor 10.0.9.1 remote-as 105 - neighbor 10.0.9.1 next-hop-self - ! - } - } -} - -node n7 { - type router - model router - network-config { - hostname router7 - ! - interface eth1 - ip address 10.0.10.2/24 - ! - interface eth0 - ip address 10.0.3.1/24 - ! - } - iconcoords {528.0 456.0} - labelcoords {528.0 480.0} - interface-peer {eth0 n5} - interface-peer {eth1 n4} - canvas c1 - services {zebra BGP IPForward} - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth1 - ip address 10.0.10.2/24 - ! - interface eth0 - ip address 10.0.3.1/24 - ! - router bgp 2902 - bgp router-id 10.0.3.1 - redistribute connected - neighbor 10.0.3.2 remote-as 2902 - neighbor 10.0.3.2 next-hop-self - neighbor 10.0.10.1 remote-as 2901 - neighbor 10.0.10.1 next-hop-self - ! - } - } -} - -node n8 { - type lanswitch - network-config { - hostname lanswitch8 - ! - } - iconcoords {672.0 432.0} - labelcoords {672.0 456.0} - interface-peer {e0 n5} - interface-peer {e1 n10} - interface-peer {e2 n11} - canvas c1 -} - -node n9 { - type hub - network-config { - hostname hub9 - ! - } - iconcoords {120.0 504.0} - labelcoords {120.0 528.0} - interface-peer {e0 n4} - interface-peer {e1 n15} - interface-peer {e2 n14} - interface-peer {e3 n13} - interface-peer {e4 n12} - canvas c1 -} - -node n10 { - type router - model host - network-config { - hostname host10 - ! - interface eth0 - ip address 10.0.1.10/24 - ! - } - iconcoords {576.0 552.0} - labelcoords {576.0 584.0} - interface-peer {eth0 n8} - canvas c1 -} - -node n11 { - type router - model host - network-config { - hostname host11 - ! - interface eth0 - ip address 10.0.1.11/24 - ! - } - iconcoords {696.0 552.0} - labelcoords {696.0 584.0} - interface-peer {eth0 n8} - canvas c1 -} - -node n12 { - type router - model PC - network-config { - hostname pc12 - ! - interface eth0 - ip address 10.0.0.23/24 - ! - } - iconcoords {288.0 576.0} - labelcoords {288.0 608.0} - interface-peer {eth0 n9} - canvas c1 -} - -node n13 { - type router - model PC - network-config { - hostname pc13 - ! - interface eth0 - ip address 10.0.0.22/24 - ! - } - iconcoords {216.0 600.0} - labelcoords {216.0 632.0} - interface-peer {eth0 n9} - canvas c1 -} - -node n14 { - type router - model PC - network-config { - hostname pc14 - ! - interface eth0 - ip address 10.0.0.21/24 - ! - } - iconcoords {120.0 624.0} - labelcoords {120.0 656.0} - interface-peer {eth0 n9} - canvas c1 -} - -node n15 { - type router - model PC - network-config { - hostname pc15 - ! - interface eth0 - ip address 10.0.0.20/24 - ! - } - iconcoords {24.0 576.0} - labelcoords {24.0 608.0} - interface-peer {eth0 n9} - canvas c1 -} - -node n16 { - type router - model router - network-config { - hostname router0 - ! - interface eth0 - ip address 10.0.5.1/24 - ! - interface eth1 - ip address 10.0.7.2/24 - ! - } - iconcoords {120.0 120.0} - labelcoords {120.0 144.0} - interface-peer {eth0 n1} - interface-peer {eth1 n2} - canvas c1 - services {zebra BGP IPForward} - custom-config { - custom-config-id service:zebra:/usr/local/etc/quagga/Quagga.conf - custom-command /usr/local/etc/quagga/Quagga.conf - config { - interface eth0 - ip address 10.0.5.1/24 - ! - interface eth1 - ip address 10.0.7.2/24 - ! - router bgp 105 - bgp router-id 10.0.5.1 - redistribute connected - neighbor 10.0.7.1 remote-as 105 - neighbor 10.0.7.1 next-hop-self - neighbor 10.0.5.2 remote-as 105 - neighbor 10.0.5.2 next-hop-self - ! - } - } -} - -link l0 { - nodes {n9 n4} - bandwidth 100000000 -} - -link l1 { - nodes {n8 n5} - bandwidth 100000000 -} - -link l2 { - nodes {n15 n9} - bandwidth 100000000 -} - -link l3 { - nodes {n14 n9} - bandwidth 100000000 -} - -link l4 { - nodes {n13 n9} - bandwidth 100000000 -} - -link l5 { - nodes {n12 n9} - bandwidth 100000000 -} - -link l6 { - nodes {n10 n8} - bandwidth 100000000 -} - -link l7 { - nodes {n11 n8} - bandwidth 100000000 -} - -link l8 { - nodes {n3 n4} - bandwidth 2048000 - delay 2500 -} - -link l9 { - nodes {n7 n5} - bandwidth 2048000 - delay 2500 -} - -link l10 { - nodes {n5 n6} - bandwidth 2048000 - delay 2500 -} - -link l11 { - nodes {n16 n1} - bandwidth 2048000 - delay 2500 -} - -link l12 { - nodes {n1 n2} - bandwidth 2048000 - delay 2500 -} - -link l13 { - nodes {n2 n16} - bandwidth 2048000 - delay 2500 -} - -link l14 { - nodes {n3 n1} - bandwidth 10000000 - delay 650000 -} - -link l15 { - nodes {n2 n6} - bandwidth 10000000 - delay 650000 -} - -link l16 { - nodes {n4 n7} - bandwidth 5000000 - delay 7500 -} - -annotation a0 { - iconcoords { 70 55 345 330 } - type oval - label {AS 105} - labelcolor #CFCFAC - fontfamily {Arial} - fontsize {12} - color #FFFFCC - width 0 - border black - canvas c1 -} - -annotation a1 { - iconcoords { 470 170 740 630 } - type oval - label {AS 2902} - labelcolor #C0C0CF - fontfamily {Arial} - fontsize {12} - color #F0F0FF - width 0 - border black - canvas c1 -} - -annotation a2 { - iconcoords { 0 355 320 660 } - type oval - label {AS 2901} - labelcolor #C0C0CF - fontfamily {Arial} - fontsize {12} - color #F0F0FF - width 0 - border black - canvas c1 -} - -annotation a10 { - type text - canvas c1 - iconcoords { 450 55 } - color #FFCCCC - fontsize {20} - label {Sample Topology 1} -} - -canvas c1 { - name {Canvas1} - size {900 706.0} -} - -option global { - interface_names yes - ip_addresses yes - ipv6_addresses yes - node_labels yes - link_labels yes - ipsec_configs yes - remote_exec no - exec_errors yes - show_api no - background_images no - annotations yes - grid yes -} diff --git a/gui/configs/sample4-bg.jpg b/gui/configs/sample4-bg.jpg deleted file mode 100644 index 2b3d29dc60c3c76c56a31a1dde3c280ce1c23fea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201030 zcmdSAby!@_)-JfaakoHlcXxMpcXxN!gplAC+#$HTI|O%k5*&hCAOs21`JHpV@6OzN zpJ!&C`Dcpm-EUW|lC@Xus`(27Ow7|008v>$)EM{bcJB(Q3!tH z4jCW>Z~nzL|H4;)vH3q32KpZvO?3$XfWZX-cw{p(cN+jep@ig{y(&1^FLrSGxPsy)6C4~zwp0wfz*U_ zENSQA>S*To&zJu%FHVkLko)yd!h~FrogJ0`+6D*m{$Xh*sQ~#TguMT_I{srbhztnd z%2`VTlJ^%gI-4u2{2L2fyGyG>Fr+R>)zwq{FNWMRkhQC)s^-7*-}&20C_^wZBtO~8 zL+U^6e6cr^|7$Z;NPdI6m%0`NQ$lc`hqs0l1Vd&NXy4yfQ|I3@KP{~!|D6v8TiZ#? z{YwUnY3C{Tx34!4o0B`ZDEu7*q%SZxpa3`mR)81a4!Jr5On@RF0Z9J)$^=*gW{?tZ zNSO!V031TF6QqUc*&lm1&y;(yAK{->S|q~8CzMN+^5BJ1^Eeg3OAQb?cwY10m{ zgy8?=n?d^cTlRN!9wv4n|J~<*B>uMd&uCaHS&vzt|1&0NYG`(7E@*LRA!uP}K7bS& z2O1w>g64$gg%*Prffj(2@d47nKBQ%v|BUf(`%Vqk-svuW{MxpV(!aW!|ECnt{zuyG zzrO!ZBLM8C&sxv^GXencwDN^K2LK@9;_ByaXJhM0Dh7FStr$t=oGq9cN!eN1SpOFP z|0exiv;H;MTlIg|A`s5Zf9JWd0RZ3MHRj`g=b2srK&w6EF~$7vJnB{eKw}4hu`~-W zckh3-2mSX020#SRATtyXAO3bFw?gS9B2)+ z13CuXfF8k6U}W$cFcFv<%mU^Gi-8runqVWa4cHCr5B>y>1E+%vz*XQDa6fngyae6` zpMvk804O9V94Im5(On4UxT&)&tRbv}H?VJL z-pIYNe-r(t`pxv4D{M?`PHb&#U+gUGZtQIwC>&}WIUGlvc$@~DWt_*iL~q63TD^^Y zTl04Q?JrycTv1#r+$h{y+$G#cJW@OTEBz7dp zB)udjq}Zflq>iNNq=TeaWQ1h0WL{+XWYc6% zOUFy+K$k-|OAn^!qPL~bqMu;^GjKE5G2}4JF~TtNF*-9AFs?8mGl?;IGgUI}Fyk;Q zGKVm?GGDMzvgorUu#B+$VdY|VWG!OdV8djSXA5ELV7poyCO#0WRA}65ifhJeZfMbJd1-ys zM$Bm-hp%U+*QO7rudQFAe`g?NkYaFP$YmI2xNJmYgl?W33aslc`g?Gp4hH^Pmf{ zi?7R^D}!s8>$V%eTZ-G2yMlX(2gt+7qs{XT#5tVwqV)>(+VK|l&hmcn(e`Qd#qf3Z zo%Eyki}XA4m-a6XfDW(-_!>wS_#tp7NGvG-9q66;yRYvl-hX<35G)g1_5tyO!-uI5 z){w-IpC5HTc6=iG6#Qu~R3@}C3^mL>Y$aSEJTC$|!Y*Puk|Q!B@=ugy)Oa*&bZYc- zj77|NEL&`P>}#BL+;lv5eC}u1&(5Eh6GRfq5-}3}6Zevol3J2UlcSPI>QnKPd&np=}cloy@%_{HwaYQ9W< zO96F3Y9VZ)ci~}?cF{;NZ*h4Eeo1u6OR00|cA0wFU^!2Dc?Drbd?mQjtMa(Yuxhqi zvbwE?sV2V`r#89{sPn2jsW+`(Zcu3W+Q{2j(?r#j-Hg>7)dFhqYq@H*ZQX9uYnyAA zZ~xjM(9zt<+*#U1)|J(b-5uY9*z>99wb#G*uFtjatly@8@2knzjRD<(#X+^f=^=%o z(P8P~ff2Eh-cg~^t}*_x_Ho|v)(P&3mPxM3<|(eJ=4tNfmKmOzwpqT}jyb`(o_Ue^ z{sqZ};YGQ{i6!Nwxn-^8)fK~)?N!UwA8U?l*X!QvPaDCTFq=`|(7&aAC;VQpMYmPE z&Ar{dBe^rVtFgPWXR&v>@3H@U@aYicF!hM!sQd@}kFI0s*&)2FkrbBy!s z3)+jOOVP{8E8VMuYxnEdo0wa?+tQz$Kfm6o-hID!x_|l=^?>(K_M7+j$fM5V(UZ?J z+;jR1-Al(Gg+H6GPOq=7X6|PH_ySOnE7;l^0B%YlF@zo@c9;bK#J+#U6#qy-!W9ri z27=)ro`O8Y1K0!6L-y@HFdoLxlmh5}|J))+Phj^W!XJZO9~f^H&G;uw+#GE4GxN@c1s8W!3(x>E)@#yqBb775l^ zwpk7oPH`>|?rfeu-fg}YfwzJTLVUtfBI=?RVjkk3B+?`+rFx|oWR7KD<*^kQ6(y7m zlpZuoA`?%zH7JPW--y{&!Zd>Q-@{Z9NR1L^|PgFe0U zdG8kN{=q*a>SO+=?$E7pgb2Y%*QmniIM2vnM3m=c2h@A|b@|@P0VV-%K?VAgj=bpb`SXpde z%3KawF=LNNh`=+Da0s0Q1wzj)AG>S)8{ZuFy1g@vv9D= zvKg@3aJX^$aRqVv^Vstm@G0^O39t&13tfUNZ0#)T$PrY>fh z=A0JD7Q2@1R`J%>HiEVowug3|_6ZJFj{Ht&PJ7O+E)lMJZVZrlG41ii)7?wL8{7NH zr`pJYRI!<@szBZ?yjqIRPH#1h8w#cO}| zNcfysl{A)om{DU!%}tSmR_9ER#Z0 ziqrZtwzEESVe=^q1&g&yUCU!D%c}=#KR2K@-+ZI`&by_!ZL?Fjd%RC`pnn*4RPkfv zc<1Ed4E3DqLgdomD)@T#mg8sA-R&>+ho(o|r_kqzKR*B19~!^_=mBLQ80dre_52`D zP%9V=Rsw$kKS3EojYA7Ux4`hie1%no-Gd8&Cx9P8h()wO5=16I{)4iMI)T=VUW}2B z8HW||CKNjiC;Dv?ZXRAGej7nIVK-3^aW6>^X(w4Tc_l>-Wi*u+wIPitEjb-Pw?W^^ z5Y4E~M9Or++{_Zps=$WBw!>b@;l(M!g}}AIox@|x%gOt|*TWwwpdg4TxGq#6Y%jtt z@+>+mmLP5(hE=pcoflT34u|+9ZSy2T?WkCyj#D!zXylMnP;(=vG-f=8J}=p5#I;DI)A$W z(tx$V|-_rg@f2_WPWq+^W2ZFP8;Wg?>e|B{Ze)%9bmbDnC_i)Uee?)O~N@ zZj5f)YT;-NZ`rGh8&vG&VHhFhx0iHajw3zgWIpx7xq{ z?HjPgx>LFzb`*8edVzKwafkcR{H*iW{{P~Z{_Y8|+yGF#2LRgn0H9_70Hq87K$Qid zO(1-SDhdE-@&RD+cmTAP0f1y`{%ik00capmzBLdIi5$m(QxGbM4WtF~2jzgeKpUWE zNPH&(HV21+E5I}0pHKu)Vo8U6gQJDBfh&bOhG&NNg6~B@LeNL3LIfe|A~qnQA~_??Bl9AEL4ikcNBNE_kJ^q# zi43HWUI3j{udM1-?M z;l$!307*Y-D47yD9{CT7PRax-dunMKDq3XPJGx!^d4@s84yH!tI+j}22DUc#K8^{_ z?_AeB(7f1u6#PsAY=W#p^unYfn4)0OOR){{UWo$92q_n7T^Vs%7CB;hGzBPy2gNI; z6XgSyUDX}6ef3j~Tg?}31f93KG+3@knNt` zivy-3nG?M;vkQ|eog2A3jt7Frqvx?VzK@dcC%<0*KY>y~N$*aBl|FQS`**|zzUC9)NxwY-hP?`+#2c9#wqjv|ha&SWksuF-D; z?#>^qACF#K|5-oK0A@f9!bW8Ry}&*Q3Bm>#fIdMY{t3_}B)aDZn}Q?2b>KB9C`in% z2Neoc548o20$EiYptGQ-An`XFj3rDq#O`RYim;Keqi~3DN^psA>+n?Y?(km`a1b03 zh7lRlqG^D`bzwfM4A+tbeXJx+=D`zl9=*=YMHu~<_m2aT>^a^ zLmXowQzml>OEc>z+jsU~oY-9a+!j1>yxn}40#t$~LRrEaqQqjB;S7#zH36rU_;}<`l zHp8|r_M8rOj=4^AE?`%7H&gdGk511Y-e^8NzNUWB{%rwAL2uv5y$=d*_;B)(;*(Km zX4q=P+ep2r-01ySra0gD;RM`7m!!!Q*3_(Y)Qre1Qs zlWO#ufjZv?mc}2=rLA`DOdU5}9X%m^ieKLj>Yt8J<`7aPJPA^BV zYOGUlg1+r;4ewO$#UHpIX&e)rP2ZT@Ufu=&LVL(~B!0?!!T%HgkNw{Q zVt^}zIhp}pA-1;$Wq^i2w_tLxI)uY%1)o8<8ePcqJ_Zd1;Sl|yTcPh@xL~|tx?y2p zRbaDVPv8XLKEwThmxM1ufJbme*hExB>_g&#SXvx;5=9T?1oa&nHd-CJ3i>rhDyA^z zF;>nS4Qv$bah%Aviny4#>v+ZZ?gV0lScIoU!^A}-VWbXZn&e^>?36TAB-8{n__U;S z4D@^q3XEn`@~k1QRd$s&)e-CR82oDKKAY^d}{rLU$ z^_ChER3rkxOTz2xQ^D)&OCcoKfSiH!IsWUs;;%3)gmce^kbesY`UA#5w;{AmNin1ex}zb`Q41xZjakR=QX3Kkj~3I+}qLi|CP zK{$9M1UPs^cvx5j6a+*hBxGb{I0O__6l7EgMEcvv-?~u$)P+HUhlPi5dH)a7Yaf6C z559nwfdY{OUkh>U(LW!&@hk@LB;_QXhw$&9|{T#87vGm zT_3=9OmvJ2#7duaq;k}sA*{F z=sCH#d3gEwB_yS!Wn|^#H8i!fbs!Y9g{76Xjjf%%ho_gfkFTHq$4{YQ;SrHhiAl*R zscGpMnFWPK#U-U>ZS5Uj2L^|RM@GlS=NA^2mRDBS)^~RI_74t^ejJ}% z-`xJZyZ`m@`|+<{Ac$Y_pY$)y{x5oAK=cAbYyb`SS1%CQ=da=z&@g0du$W?MaAs~; z4gmA~oN}XWWj%cbtUD(_sX+FJ zDW6PaD!~GDmY=2SI#4oVS1|hxjB_35$OO1T?X_B0Eyeo@N0ltgb%FvFGB8aJl<5m0F z4hLDn^x#^C>#dQjYKFlEUEiSnKB&@(u`0R?`*^$N1{U_=eQqHJ!yog{l~%!GV~}Q0 zOM@!yV!bL-SrTGe0yOzchk_JTuE`~=2tyT|T#D`ZkS}U%xZ^0gPUovIo%UdfW7YhY zAHS!e3{5y?mr-I1*;}@x>Z%%`jO7-s2z*E{fjgit#^tcR4%@}utOH&AFI&yAs-3<0?*t5aAzX{wQW zCc$W2gT5;}KU>PFw!*jN%seux{AK7wZf2iq)%4t(E=f-RAlT^{5&5;r7Ri`eYJ}kV zo41(|`_gWl)}MH<4hAQR;KzT>Wy%xV!ahqhUK>ObY>3Y!`=&{(EMVRdA*f)s>)`um z`j1sR3A5&Ykc^sV-RhSed7j_PSe6QLvQPM_rz=`*e40u{OlRK%e}sR`}V1 z-=L1eyzS28?Oua`xoBzLh$B7{`5(!@6EGg)dc~|3Eroq>h3J5omcbq$_DFP7`ZI4wwdy-#FXy@V7J+dD zB|GYS>fnUAK&+T#35TA}+X8~mfRMePnMXz9UR1~<@T-uBL({at)1UfNn!aaJBU-vM zd8OP@5Vk=AtN&ClK2708i*nz7NH{LJb6p|a}WJkl)d5@L4@f3OF z^CsHcK4Hg$f=*%*1=zHa<<7;DbJk#{MseJwd;P*-bQYSHGd}nyR8jMYru_EM$8l|< zNqAVETTLX`U_<7Lccb2{J0Egz@ChI9vma?A*3O>d1~H=T=qCxq>v#AYeDB#Uc9-wb7nZw7gK*1uCD9aItHx-XyKHuqAKb#%RjXzf_fnun%fUPFou%**G~>;AF?4$W$6D zP`3~aT(=wLBj<>66}8y5&J(Pv`90oO>ch6e6ldv4IpKbz^Pt|u$kxh8?)tswB-DI`=7TVHZjB?$ zPcC=K?hOtw%76R6oa}b_Z41%J#ab;?_RVgAJ-O-)%VnKkP>=YLCXgSI>PfQuP}BAzXrJ*d+?9!q29EWsqo~`|Y`iDVwJuB9^P!e&9j1_s!y+39 zg5A^%^ovi=S_XJe*VCiCGXt;=<0?E<7Vqe2TH&{UR<_*ycJE^Nwdl?uqGdtwf&6?* zG1xnyX;52ZQ9CsSJi`V{3S`tW<#8r(+heupm3|Rh9 zqgookG5l*I2cW63qmrD8zUqvoS-vlJx47=Bb3n&+G2XYz87n#pBc8T^j zTQI7?Q1QD1ZiYtB=1A;~Hta#0$cJ%et5J*0DLY?hmgPVqu}W5^t-Igfv1Kn%#d4vL zob@Hqqwf>Q%xNH_) zq&c2%OlteB0Gdqj^HSEmS9yq9yh(&_oeH)Ooi}&9=PWp5R-+8}pP%t&egn#mYIbs* z!Eqb18IKx#$x6!gEuADR#CVQm_q$Zb8(N)FbW=_LmWLUI_ilQ};&^fP+jvwXE@eg!h%{%3(el((S7qKB#)<9wLM2$khpienTs}csil4d`$PF~ z;B%jQa}lz&M%#7JR3zI514gzcy1j>z>+QGww?y>bH^mw6R8`*5F71sEGlk;~IaY$ zja??Du~F7H?P=&y^j7`3IGOInz)vS{tF1QIJ2v&FtUI&0EzkAW&7QbMa%HBa07Yx` z;kx*)QtGsUtA;VxfyE^~+~)CyoBdmZ4#xLZtqC=n%ztFMnH_9xXuoAlb)SccJq<@K zHr?cIIRLWe{%R_DleyX!4`DK0^D)b%b|d!vSH=k*LGCs^jQt2)a}KKMoD0~!{yv}1 z_ZNP)BY%UhInhtH^er83N{bC!NK)%NX?Nr!t7Q&`!h3U>gUC9gLrkK59j8Xt!$K#3|(38X%a( z`xzc(rqow?^Il^6x^c-_1lUgcu(A5qf5kcP@*ys0R}fM*LABSx?8}u1dj*u_WUyK- z;DvzuDSxkVJQ5FPHrvyRzaoUcsY)6Ms zL~gnqqMiy9vNn{Qa45M;%8wV9UwJ0($MBav{yF*K?i_C`dxmECq&3zh0~d+8Yh=!5 zS4NE_k+Y$)a;!g>2OW;f~J;h+LypMT5F*wGK-2Z zj^Rsi!CJ+jhZ^Kys=biTn;^4`8ntZFqcJlzfb>3e$ZEjrV2Jr5im&=u2*~tHIozaA z&h#)egoT4zFU~v`3?5s~vo|{bMWrgwEs5kuseyZdr?ppX7_J&dmdA+ov*Kob{50FE ztU&t1D-b9!>miqVDJVugDH;w}gH!9P+-EsS(RPjPT;KCms_{BlW|1l z4*vELusrPWQ>@|My>kr4K+Ecub8w$Ww;{xb{66eRb1;2)@A*_k9m8OZ(3U@2ZTu~T zSJ1XW2!&bFU0Kr;Mx>&}X9n|MR-s*Pdxr@;+R8beW_pdA=Iw{gJaL2TT0gnb8+!zY z++tpAudVAIYbqghfR@e&z0_1DFU|&$&1p9cd;DbcWh%8)rk0|7XSI1a1&gqx%=Ya( zB|qeDD~J^HJLC{5TWJJI9XhMWUsmiD_A8NaXEoPB=TUFO1hKjB~4_Xd+lgbgkoQpy%aq-?3=1 z&aTXnnIXWCsj)0OoVPRey$0tHe4HCZ-y87<4aI+8VzI=!Z)9u8->P{-4lV_L9T<|J zP7jUj{2c$aCRF^ipBQ7O_mj6=^_X3$%7L6S&xgaOl^S1Ro~!52y7rc%4J;a4geypU zuRwS!ze?oZa-a~0pN8--$aloJdG&|Rh<;0J$}6y9P$n^>G2cOb;V~fXDIa!eusN^~ zpypJnjMBNnRI^X_=eOw|?u>^$pUTgZ)X&`B-c=z4#O2P_kg0|rO{>gT>*_PAntRO1 z`wtJRAJ0ZroE@oZ(S$65Doc!G8RZV*5cA$Gp~RreI5Nla^md!HwZ;(%I-g8v{j5bA z3$mZf=Z&#WGN&~fV@lcdkjSa=+Y@q-zqf8pgp>FcQNldNW6;Zl26t8N1P|GkgrK(7 zT=6N~T&?h?ly+8AcI{Zg;XZ6+_F7<0lySl}Q|L3Yj^NE;T9>GZI*1cw?KwZe!TVbm zK2a`=*19AX#q1WZnCnr-Qfx0zXOw0U@%m*@g}RT0pwKcx|J;q$OVy-^@hb6?CJ9_r zmo_P{GTlU19fgp3l!4qBHYl(5*?p>vks+&kK~ZeCGzIcxJFc1N*z zI8~r==)F1&rrol4VN{dDft{y-MqT_}kQ6k|_7s73NKf!d7aBdTsz5&O&xu^(iRB;4 zkpoc-l<$FNSrph7+HD2~>2a_gn$=6sO+G^9tvuyE{?IC(4@YgRQi!ET&$76WMAtsVQrqoCx!O&KHG6_ z+$HIeI6Y0i(~nnecL>sq@F%7PWrh_x!4yvwf)3@mTD~Z45{vDaA?e-xn0Q}y zX>of*(aochb=EpblGCLM^9rDjGu;{Ni4dFDnpEptBbVEl?kZaC!?*{X6u(@@s}k!z zJ!@5V({(AC*5uvvFOmeR!pel7X?4B3^yM{8pP4URWK8xQbL6%bC@?9_A7aOgT^V#~ z?C+0}$s4aeUH`n$B}KG{oMrMYZ*XyJ4awunqGQrm596^?>LrIjns@eSNV=Oc#T(zo zs}GHbE#Ie=AEphrCccy~sPh4`$^jTU%w8Fs-I&Wxd7V*=pgaq;Nd{uS3S&8uNasHq z$r1NIVQYMSKSg();qvb4~%ph`b}8!q>Y!{I~QN3niz8JTM@o^=&}8n%6~AwKg&+SGo@9x zXyDlIj{5E$v7LdscULlo**_U*U1_&&AX^a7+f6emoctoaX9r>^K;5ylm4KQ;_d}Jz zws$}uE&8bGdAiJfQa!ud#LU7?3L6O%V%YD@z2s&ZfdpEvIeU_-D{H#r;UiArL84&S zB=!>ApyMOF)~V%8tkNZ!uk@qjrYljbl3cFPNzj^Viyb5Mu56I>zOm0)V`EmSwj-J> z(rJsp^edC50+!)8@5|@7>0S$Oq|9< ziCrlcD^Dx`4nt+OBV%8PYH6Y4;v_M4lZ!%$lm7WXCzE}ESJuk=`yyHu#Q#7RB0`j#7$31cMo}dw;1GUC5W}R$Kbl#fh+OX z3V6^AjbG@7s!#CZ;2QnKWp5Bds(LFV9UDY>{@&TuS>Mw%Dyrl1KqDp~WE^?VRM7?ekf z`IwE#P_0)KWky&rk|#fLO-W+ANbz<1R)*{A*~HwlV5YZKx9h;f4`shff5LdC1p>2n z&FdkZ<@3@+tMEfD3i7IB9;KZC9QIn?69=Al+x6CKwOeF&D@4>y&2^Iq<5xf(R@yPh z;d5hVko-%@dcTVQ*4+8N*7qpiD$CfN`cr<`X@^hzDV$2A+*_i(4_f0`NmY87}>Iu+wJH`%i* zW3x!zH6=~F{e0U}wIg>d7Y5#lfK0Vwv8&>76_qX{c}q^PB<{D|CNV!3JC5oEcG!ovZ*Kq3&#@b{xKM zV$Yyj^SLwB*n)nP$*PMo5LIM37gA+(XCC{G2gwy7YBSdGFF4Qe50Yk9qp?Yj1PCQ&F2BoPizgX9-Nlxp(_f*TnF&Lu)lS?+r4*Bu-wbH%}nE=#?oBw#g(OJ z4%l{Qg-@P>F}F>R@&32H1ke0`Mk5cCr@q!l#iopnRB=o|TLITxpUi%N(X%YD;x#~L- z4x!ZDVW}q5^u8)x$B*)dCV!gUTS#!4QOMUEs|+8)j^cUCfPwh#+>cQ!vpuAC{0D2T zsTXg${_x5jpcV5j9%_qsPlYZN(D0EcFK$#eH{-_G{Gi`yl5o~v8$f+hc7WZz9BU)@ zNVwFON?x*MCluJS_bV;{dgsmhad-7C{BI-~vTbsMJEaIZq z>lSJyD))X`x7ZxXLu+{kr=fd<5e=^dW3wWOGZB`n(5_6d-&~R;MJ+f1WQrayEpl@gIiD|FW1AGu~b%&)}_lohp!pR8>IzeDoI=^1!t;l?Cs5lFaplEiW1N5z( ztiJ9MC^Oj4gX~JCD4+B~_OYfJa90%^$|SYo4x>eibvvFU>>A3g@$|ncYSUz?Ch7Q| z7aE3uHUk2ztL!s5wJ~ecSKq>!9(8Lpb@9U_;^3t!iwU8wy$w!(d;Tue}yct%-c@c%Na+CTh?zk0(O%nc3Eig!=e*17Lv5TH!reJ&Ang_hr8Jbf|cJwYex2 z3E?Lth(EkFErTcnyfEa<)jHjs+phNswlq-Tf?6qq_*b+oLiY5D1Vc}cb@kte?kos8 z`FNOr8S!G^rO3zb(wknJJDx?*#HNbi9jlITvecZOeOHiSQ7ZGsEFX%AORP~za!`pdg0oS^vwr+7{7if(^a#Tw}TnO&(NZQ7^B17~t% zs9!8H=f>D|o{7F@Fgb-`*UZ*x4_FCOa!imp=C z_;WQENLV3g)w)^xT}Wixo)y|Y^Zjg3v?8G0p6t z?Pnt&e3Rk2Y;!8!H)*NVOHAq4O8DD}m`{ z!+CG;nfJ>Rq%=N+N136S8t(gtEq!nK?aNPxSZR%= zot<`g`DSRk9vdIKYD}~~qi2rUa5)SF$@y3DKA<3q+i#i8vZXwT(lA&{m{525Lgg-c_al!KqBm2o(1=$4D`cN{(~0k2fA| z_!~ocN`3A;O8l^9H;TaWkT1E}s3}rp30z_ndk+3fV|RG*_c3mk2v;1xHC(WQsubRQ zoa{SZ&Zy?i$R(e*#NXEtcmHw(ta#+Z7hEllKcEiy4SA$`pS8+%M1%g^nWW_6(y-Ov zTxk+7hWHbH=@8qcrH=S)lVvTV@iFRMJ?>&N9;1Osm($>qt>=OZch+I9MLV;{aVMA1 z%esN@r_rvD&&J8iB}Pi|*na*-aY=SaT@Br%+V1YM8=FhLk^cL_c=e4fflUphAkon( z6D$)6;yjBW49qdY-+S3^dXF_8(4VPhhE-C9hZ;*6rRh)=!gpE8 z_K8%Bh+Yl)zYX4;X`Sqbnw+_^`0Z7xRLb33v9X0avu4hKv*~t|+iWqyD!AghZYSBK zQ?$==WgZQh@l_FxlpnQB)U@N?i4*;G*!+&lK3usiWWEp1AkY%@dF?1qzk6qb!3b$! z1?hd0{HOD8D_*7s$G`j!3yG#it&s;?g5c!mC@J_)9(_%}pP=r1hO-}SO*K+Jz4$Dg zQV276j(uWWNWyGho-k|P#2Kwy(7^lyG@@@xiOv*S=R^9LEh-YDB=0@%6xY1MveT#J zDczQ@C^@Hi7wU{-Ug=+Jq)eJq zSPC8{z6@F}*;(I`OO(ww_=jC1eNQV9rG zk5b_@WQ;jg5}Eka8584EMpnnMi8F)fG1Kf|&zjB@0*DRMGteT#OMWDHDA=B_$J)HU z+1K{^Zb?&ZXRO;qkzbK3Yq2@&p_g#nqD;9pO?MmiBun@TBcSUT(7GOWi+*okN?$jkzxy9#^q+sjsk{h0Ls%k}& zE^W7IwADRoB9$2+O=9k2soBkoIw3iopQ_<)tIsrDZ*iU85*n5ajU-Ou&uO)h1S~hO zRK-BJ98Egn6zv5=EPGLLVPzP5`=m4}x=R^W_l&eh`x77d6%kT#K4T6|K?ApaatTBV z7R7`qCn+rDV4meN2Y;U|TH)k{b|zix9G8RR4~4NlB=(E*%z~BL2A{;Vs;zFS#Vv}( zd!AF=nFH_9B?4iaooJ8b_=d&QJjZ*Uf`*a!9nE@fkXh5RsrIf6?FO$T*$nnL@;!sV*g{Ytyq!>6dQX+y@< z0Jg0+I+t?Ur70sk^owmuecS`yeH9DXH`T#_Hf?By%tp=!va{pW^jdkkceL2F=qizH z1P)EKK6x#z+YP8~P;`XA%1jyJWb82riL*OBJloqgms4dqRdqVd+%pjj+Z4@|%M|xz zt#S-)lvSN}cBAdN)p8oic=(PUJDr8* z1xYB**yqCsDht2IwY@x|N*WDd%qjz3`i2a6Z?nHC#Q0)Vso&eL8r5?JM@<6t2 zIj3sJymSAY^$*l5P!1MtTq6c3K`{7L_eSp)QLxV6!XHFqe8T(fkl5RVF-)_7wr!;z9!n%(8|q`k_vG{!vh-r9f1(I|aTlymPpv}5V-qiD$G z9Wq$xVOVo`%+mi(SuUiA&8Qn zTsXnbc~EFEk9{I;8#SZ4n_-W_#4spV0k5Pb9CY~+C7j6jbjS&hDK~Fr({yeAv?cog z0C+%$zh`$3kj%ntmdVa3$uE+?64*46YMOSt1aoM&NpKK++j~@zNgT2b!;0t#>`QQA z@<~%6BzC4ly5=H?8yz}VN2KWX(^+}U0c9D*HXSMDxF*>+6b$0cfVI8<07~8mwPxya zvDAFEAG;usPg?0bXMVa&pxq(reXEt!??m^}x(*!)AC)vj$~unLidH$?i;-FP66V^QI9P%q{J9AXA@Og3aDFV1RtpBgVo&t=^?* zg{B?5P;?MlT(!K%1sk}>LjWjY+ass(yeSI6-vl16>J64VU zo)XV&&ckr$nuEXwBqgUKAx%HT_bsSu1#NS*5m-tL5yV?D)1q1w7!Mdkow zjAL=?MQ_5eMQ%>1fcWDznQX5%t^1&SjmPq>;&VvWjTSgR(aG}tPh8U4S<7)YRY6as zNp)y$86dD9FB$sQw#Lx(z^pRuS-r-Kx?YN99Ng>3(fmXjzC|#fB=rffmVTzK~{V0LVQ!sdTFotdl6< zFUo$kX5!dd!L?5YrcS|Yk))40$m9W&yNZ@2lH*SjAVS2E&svh%R9O%>BvZ6K7F(%7 zR|=WnVz88rV-rup`f_<}_luL7m&`@fU+kljG0#ep<|oqP0Z#9wL#IF5t_w=LHVowV ztZ%8ZRwdM~WRevZI8dXERVye&7f*7nmfL_2N}lpDtY55AIL2{S^=%0>_+eFWOA($u zYRW50P(u{X#7QP{GsR=+@JXp}xtBZRl&AxyGgrJqh7GG9@Mkq^L?$lnR%DYvTINFaq{A;vi+4oUbMz+>NbgRv4F=4LF?9;HV&OBSkM$W z7^>EHCG2Hp?53oK^a~_eKjo;+MBR#sIMklj$`B3=t`z$WQySmw_tKRm(>xaB(=`|c z%#p_*@Q~GdTz_XW{{R|*4M#CWZB7woBt`;T%*H|On#tF%n@pB#du$Uo9QMU)-8h!w z6@T`BomIH8j{C$n9)DQA?t9UDfv@3hFZ&pzn$QUZmgkYd$paP5OwDtt+@+D-6lWl} zTIjwa>JR?_2-UPt$L}K_g>%~6KW3lH($5kqf=6yC0jaENAK6W3HK0b6LR5oUUIP~P zBK*s|NhE!JIjOHaKP*~G+{qw)g9Ku;{{Z14gG$pLW{j3`w;7-e>x0f2>V+eX2RT0W+rli*zt;Fqz znF!iDR-Tvsip?^BUDSpLwra*3J0A-*Y&3YC|X1g(!JpjSv3U<9}9?fIXG9LRstF>|}$~v#ICX?X^N+35yIZoX=t0pdKPsWmJm(x%f-YU? zpV?YmEqpTfU`Y7vPaIWS^jM&{OML8!ay?CLwZhz`v+4{QHID>(b5x&C`(C5x$NvBx z(r`rsDd{kcNx>a)h7*8-k`I*iBx5H&0#&p zidJx$?7!21M;!pF^IQ!+P$1+VTDPc8=IV$cA0Y=dPUlTOf45qwkuohtPdEa5`c{41 zdmJLO1tTY#vwp-vc5*fWD)xXR4?u1M=PDcQxPqUaol7vZYYu#S$4skR8|l)S#H9v>2rph?irv9D-nzRK_}}< z_Qd?sl0KCMAQ4{{VUO z(h&QbJ)gW8%~F;HmQy^LG9EB`aa)%xuW!X06Edo#uI*Y#9~L-oj*@uWZsSBRV^x?0mz(qNKUf$ZwF* zOl55*&CZt2RdJ5ysoaqjtA+zD(zUPdQ%=(YM}SGibNcj+{h7Tpla6cCvCDHeO_o?M zngt)dA3wGay>vQ#?)oUr-+6LA4 zjoKTJEqva%;Z7@}@aoNRVwYFEK`9|}dHkxJ`g{^wtg9AV9MxOT7LgPdF%7$0fsa#I zN*>cjbivr_Ena;(>^rh~Ey($~{Hsph7&S}G+(xddGB+-9T$ZC}bg;uF=GsPUOH%P$ zXnK9QiE`4oLUEqd<4r^)xwkyu;{LU$SorPj^!eq6&&(hyJ_a%AUSFu%-#>}Wmv0Dm7@GDTzwTUK%+F5PN{J31^wo_>tIuYE% z@IQ;<(%}oLG~l;Qs9X70tavX^O-6K>w96Zeg20ZoJbp@zyy=O75PpKJ`( zeHTlH!ZZOIBOg0h@+xcHEBjAQxQ!&n{NQJ=73Ni1n?)XH;(v}dnr@MB+C zItsizBE9FiH7ZSet7C=nUxqATy}Ob~plJ#m@B{ z5Ii(>Jz8n3H8=u<1V$KTkEL=;r_X3}aTAZiy?A0YvB5aI-IHrN)KS_Ye$pO6UYQ6`?Frk_*U z{{Uq_jw|qA$Ff>@^8WdB%gDcV8Y@bIM#vv1>CQQ?u5Iou^*;#PUdQ{@lO@J8w!b`~ z)ULG!7cn$#EDiGfqqjBfKLbB%O>)v$^q&y2No{$BRPsP49*6O)H}ax3E^AZV!b!T8oOG<2CLxtQdJ;4vq$qJz;+eo*Nv}Zx|MlJ9*-2(^ISZ3 zVWgD~31z_i>Kl+}R{MGK(Rn2~H4lY+Ne-vs)RH9z=0FL@T+&-=9$u!lx`@Y^dyH2k z5vMyReJTsxJS6dpn^{Ie$hic2gIw2&J`~yOsIh5|_7Q{3Pz{LZxFCAher%1qgjN08 z@IIA1Q9!dMeei2rvV-^WN2X~JaAmW6O5@b3io4*?6^6Kz`%)d6 zWx5m+$hei5a6VJdHS{Rch4qYUZ5WYp^9*EH8RH*@`X;G2{7&u6Yz{`pF^v0xSxGoQ zb^L@<@K=en9am3zt>o5#Nl@2$+&Uuav6 z8q9Bs)(@6KzJ!iXHRsx=#7%QdkImE>tgWIxTvoHLBy}Cec_8$rsyqA3{D!qVzZvUG z;#tFxL~KqnxU7rkh8vhylZfyzJ*y{6_=gUw6Q31sV+oP$#|vCcw725K!>`4+%j3=evkUR#qtcVayv)nd~`(J%^drw5$XxLs`5e7v)C z<29F|$8A4`=6iY7nP%u8>sB<|@i~np?0C&hNLV2G$ws3r_XmFipy#zv*Cv(7OHjfcRUh{6c*{qBD% zx24Xp!~}T+jC85zxHs0K+EcU+Iik|lWrTTH;MC3Y2`d`5aI6rAx&A(#>SaWNa3s!H zWMF2Sb83IG<2mRBThpyR(2DYdk;P}qFqvKP<@Bq%V*dco&rP)HVOYmXeX9f@<2|Ub z#;i*6m4qIBu~u~ZRI`w^-Up^Rt0`(8Eyy{hN2j&am|}1#sXLBQ(1vX@`)cScyby8* zc&$r)6Z<(9CRNJ}0xD}u4=U|R?N;?a^@!Q&TSiRgYQ^si=&|YSP0$(Zlh5l}y7kCy zS8T`kL#8>amzv96X{&2#{F}VK#`l=O% zOS{+9CI0}A3HdzpjAN(NR)&XqlIaijtOjw68mW13$)+u&OVf;F-!+`2Vc2bie__$3 zir0x{pL%nFw~qAPUS+jyvvPmgl(x~7pH zw|wvgByJ2cJJePaz5H^diX+&YvN)-=7ZN;3!#salwSR80SPZcqjD8- z`qimu7DShtd_vYEk>&Lo8^f5^&NkI&sY!q#{IsSrxYa)0456YM*+tCunsGmAKB5FS?6Uor=;;okMy7b_s9PLuA1BmJ|uR% z)UD#w1|TqRA6yJ^RQx%mNvLaE01X*zWS)Yi@%`T0*c#ktY6Rl7d zN5gM2{{Td|)GySOfp=t#4zziPnSaHC(?=FIx_dBV7yu~XaacNyj&*A%fC6r1NR;<2 zoO4k=vigP9#r5buQors=90fdaT9L%qg6d^EEm%&Z^cd!y><42V`e-gEVvb=D z{gCOt8M19p0_B${2X{HEcD9!=XsphkBeq91F1w@)!Dtb(W9$uU-RiK%V{d7+1|$MM z8aazgsga^wc{9Lom9~@DZfjolMW1wTSffZ7V~_@GM^Q^i;COA&d9V!QxT^je(gQ7EIw4~VX=aKg?Qm5VUPLCyzy^DSpczws`!cQfx6reEBR z-B;;d)$flX@r-u54uXo(w5BVEL7$YK=CpiGr41ud(=D{9vm8+sn1Q?I$i_`*qLG@4 zY|gOoQV2F_(JGCDcN>!H$`Z4XVD zn2(tyxzEe$4L`#E9!*ohQ$4!vxnMeQXbwbj6Wu-bhW8h0qGgywz;b)%AC*l#oCe!P zx3oJ%>_oZa9eUQi$Ao;J5?k7ke$VBJB_ z{{Xk|QEGDw=F^@JmP-jtjDNkxD^%`g)sBiS8Y>M_TWd0`xMpJ907YgSA*or*AO|3_ zsUx_p5ed{`ZH@EYuzkSv=aEnGJTmFgTIsra97w})13!D-l%aNK%+5_MOIl9x4bKY& zY*XcLGSdU^R>rBNCx#+uEWvs1zG5@D@yAN%^(1)QE^y3w6x31^cOtZcIX5i$sy9}a zc9$%&u?>ybQQECt>GHvBT}jVhty9x9_PCx&Z;3cU26(DY#HglMz7G|rpJ?R8^}+nA z2DWR^A+sTUc@YM6u8Fo$E`LCKeJ5F zCN`d!HFE1sg(EH)XZ`B007;mJZl3gW2eU;hdxm8`enm-PV;sA{2lS!z@=Ey$C zGCjGiZ6@3;s^on5rl!o=u<24olq}(PW1eb9((Ils$@jjMQu=3(<7<=BqL)$fW5z(u zYPB+QXrZazlKxoxpyxH6e&o0)dQ`K{B$?Dx{M@WxTG=zdSG3%6ZloDIU}ABSMMKc%z`$SAq5g<3tJb5-R1#BMv_;;u@bQs<>olo^S~ zGzi6SIgidW_|}G<0VHo7s>B*-bMuO^_CF(>Vy5FJv`nxH2NkOvVIldz6`!X>%^)Nk z8q&DJMfg#0GH*9VSi|3~WL!u*{(kjoT+N0#&P_uVn#{$IT5C}hSnm7ORg1((4lzYE z2QlIih|_z78R||eH(0ubbm-K}9ta=AE6aaxUl3}RJ`wQ4Xm@bUrH6?%%V=IDxV1^V$qoe7B5X#W6a@o$AZQKMbi<$ld|3~MC+0PXNux}n%{laBS|w|}nf~be{p**8%f)}T z{{Y92hx#Xnd^6&03&J|&lX;qz(Gfx;SR|222>Cf=3;59tHAy=)U~O)8I)1Sgf=JiS zjCbRf718KEB?}Ljtrz|EUmE!L!qRwbYPuwetiAQOi(=5zQdwK70+ZJV@~&E#YLwmDHm6ZGdfVN-&4fVo0<7u{ZFg#dU=Naa z)r}uYfo@Nl;}wbHZ8j?jg!ayHyOEyN&UBqFjp7S5vyI_w6a$Kv;;)Qv^@faewIz6D3}R((h)&ln<`6F98~9aF;kLe1j)b-f^e%R*_; z{?V2)YBAcuZxx9L8Ad!;p?HH(`*VGrP!v6KD}?d)z`JQ|n(s|$yz)W79P?PpSJ1^C zq2P}kTWeON8NB8yK4N(_(3yi?MvyVXj(+eME2;U02c&Pwci26`fN{P@wV0H0=0~pjG~X9Fa96H z70KKiucc+`o)LpfX4x!?ZhLJXEqyTF3$xUsi|yW6+D3TxtUn$2Q^Mp3uANp?;d*th zno@1qn8_r3$v%a3rCx~bC6Sg+c^WMt}WP>DRvwBD>Pe zmR?zjK`Kb=T+fHEHG3UoM)2YozUyP}S5HHpTb`E(?1L%LVZ7FF?&CAMOhTfOCV9!P zS@2(iY`j0=JBvwYc?2+=M8IJ_l~cg~01z(jv>2hjMk){vdF@v(FYTpzBgz)8+DhY!3D3_jWfrqM~V-4UNr@QC+uy zHJgoY*<`x`9B@?D4mLMC%^@SyG^=vM<|s2%_1!&eoI3kfmxdM5Cc$2Ff$3P%L30+Z zBgl6Tew5U?MqjY;WcGIB?5YS~z0XSLJWJwM@deh>0+4%Ewv;r}362Y67^?4Nk!DFY zj8<}YU{#T1j@ZP2O3XM`;5B*Qifwf5YhMS%5sm1+Qm7dK=Zft0FBGJAUuR5^PSQte z!q%;p#uvG?+RSosjGEE{I6o15IFCiXd+Bq2@O;tR%fbWo9M?N}bk-Nid#T*bZFMgY z*r3c`H*EFdy&B&5>Y7ZFUkn^~tlNm;f(^F_tS4M&0Fjzfrk1Nm{d|gvgQDuP%dR!1 zxf;QGimu3~E3}NSKT1tb)JdrpC+_sB+RlOflMEKOK4g#wEvLw*EexdRG9K%n(ywV= zMf_eyvm%?Q_$#^{)tk(>ytc}O>sI^Nkw%x^TZ4`#$MBE?vK&yTS)SJSdB3oR(yNn3vCa> zs>r0B+b}WD6{IiJ3{4luzuGtJYWM?o)6YuuXe|~vV<<)$L9ZR~9i5lNtE=lt8_Akh z`A%>~FnfI~({yMpwB0#vQJv<1?FT(-z|*+5EW)foWFSD&az2#(KEhkZR-H&y^{tDm zXSIoCwc5Z9xWy(lxl>P(W+4=Cc&!!D+9lqUnoYgM$Ub7I&$Vml`b)(lnOS;q`BbgS zmd8H#TUZf{)9xknZTEXpTj|EgvdnoVtxu)nO=e7TD`=e3GN$nqT6UX-0M5jKf0bzX zQ^OPL5Sz_hlOGrcvwS__n6*7aeb_sLS7EB^V#d*JY)3xSr6Wkev|__eI9w5IOi@Yc@Q;pTnDTg5hb}{PcSO7LY zIISB?F&?4j+>es0_);KcG5hmff@#oN+F%UUPNj{hs~9@P#j;4V+5k3sRb#3RX7V`@ zVMzn>t$92>1?XZAC!AGnAH%I}sXTIkut~z2l|Exq2?Bp;MjT{g`qbL}!d+ZL1*Z(n zhWb^T_mjfY7_1Y_6LXwr+M%@5#l66iQask=k4km|VW9nr#${}p%f5y!BT0r=9JKg9 zOp53(E|%B=$G0_^s+HB`jZ+v54KOlwdx3W_8fVHm=}fus>e^a)_s1uS&`$~#)y%<$ z-1Mx!7jBnQM2wOF!5QL!DDM$GbHF%|@%*bw*4>unCOvUhG`%Cukwk!CbRLy!QB$Ok zkYpO3a58Rg!fH~Pz&>aIXSHWZD@S?fbBNBt`0-luTZ`?oNygr5Mh_21b7W;g4hCrF zU}RjyxW=o|F!gi8+E?36!yoSot!Zs0p{+#}eK&x9mA!MN{{Ur~r8xp7!Np5=11H3m z&Mo3qJb9Hy=Gse5j>O}wXzDg*JvudGk|f_&n$kT_MmRq?1FzPQjLV&D`3R>R_cf#} z1lL+?WZ<)ZN;TacEmur|Br6$+gPeL+eaGANyXfuo54mi9a((`k*5FpUyG!j-NaY#X za98jKx?dGUwt7{yrKSU24WCTbr-%L<$pfv$^ToSvPaM}h@fZnwNoxu=FzPd&m7vQ1 z01<8uhoso)=a!x=#Qr#^X!FIR_;TY)MH{D&1o~AS15>f_#;q)RqR7!{(s>No@7An* zWYlBuR-0umiyO7Y{N6-^x~|;jfH}+0E@5w_K)k{Nvkv8Xu8UZ@iZ2RWLZb{IW&JCk z@aD5FnWbG>l@BhU!eDWdFmu=NsXS-mrq#44ukRytT=@(K94{0Bi=%kjOE|RaJ7rUq zA&EUYR^FMROR4HjDd-fQE0gd)hAq5vcYO|)SOV+GJwBMOs_NEHgnk})We+a)+qfTJ ztpH7Vax{ppE-nt`wZX@)Z|hcd%V^`avD5*`k&};C}OtmP{*c_dxTeGN~n-N~rx z?P&;T?eG^Z*jAP9p)`?O2thGfCzrd|CpE7*l78{a*m#=q&iU-;7-G22PZfczcz)&X z@0u27o=HJaN4T!9QJOs$U5aaw^Io@=k52WaVPhTMw9pn%v6F^9@H0m-sn5Y@abu|@ zI=X%Pa6bYKbXN9|cuz)2Pu!EBBd#kpO-X!5<5@hS3R}V>&(k%f%t_|} z8p8O9EqpuSOGML&-!?;SJvpTj3E`btv}iRs?zw@k3aCA}seCJ?9~SB`TUipX3vQbo z)byxyn3G$uhR;p=uAAJS?^eHqZSHhC`5=f4GJsfC@iLLO;V5FUz0~dX9)8U`BxfCg zrdTBRK0K0Zpbe}_tPXtzPbI9nbTa1z%-g-{tk5;6$R{!k92&M@L*pyEd%qc3wwOzu zt+;+Q&TG134M!|-^JcfNZDY}6`%)dwdB=LCX=yiz!EHor2zT?|kcqP z9M{P!d1TPBM-q~x(L6tD)h;AZFp3O3edfhgOXH^6%8WM|n{%J;oKPbElVBlyOU`Rc zP=IOn=0qUkxzn!y0A<>d7F!~-qSmClc5+*;a7{EP6QG7+tOGC@!Q1&(KZsxK=jA!5 zpw$?bBoI1QRn5nleVmd$wY*Fm1#7|-lj<vADiD9A>qye7Pd|NZm_d7C6p8=h}&G zB(0$wr^!GQ(x-}Y7w6)kwz4u@7S9xFSA`BS(vZdbKxw{8a^7sY*xdB0@fWyXlvUe% zOj>2Y-9Uu7h)Ld-5@I90L*?yrlU8GJK*wqTmhA3>p5l{EwG&3<_5{>d&$==c^H5n5 zje<|-MaEc3cABvd`cVM$Rpem&de!|GO=z4uXBh8LBUZ~wSoGv^_poY>+2n&-ETz6+ zPtussdE7QA0~TE~%^9eE&E*n3D_ZYO`z(8q=YLwx8f(0S=Zw`YfX3A#W|KV8TK6$| zA1i@HJ6vZa;~xdv-oh=lNMoKdPs;p?`PR=yT^HeZ#(Qf75Wx-TSmRy-jH$r<>+3t; z3?;SkUlYn?amezU9M{JG03EdN9C%B_{x#9O6Ke$8KZ|ce?t5mEL|>Pq1A)jj^jKfr z$@4SLb5q#n{tn*U{?6annzfVOS;8f~w^;8aiZ{UrArt}u1Yvqt zSK_adw6Vu`ZUMkeI>qNPX@IJ#JkB@BCdsufBn>}CPZ-S=KwGWG4 zF}d*zd?~fH@hiaIG_`^`t{~qkppR>#f+QeE%ASLv!L8rh55YbcxbUaI?;YrR)LuIA z7NxF>dyg1TW+1)PqmD;KS0NMSQ0|}w1LipEURUsk_O|$^@Z-b2Bhc@39}MbxH;Q!= ztIm_@vP!~W{$hdiV{YTnioNkm+!l9AiFXHYjB z=bG8Fuz7FQWMhzhYv(0aF?Kx_sfXbGI&C7^t?v|&ymQTTG3)V8i*Ic%84gN{yW)*H zEjLXvTK@p9E8ORr^J{w>tv^(f?sjpXUX@B*>q2EdT@Oe5V@kjv$@Qyi6wx4Q8KhtC zlT^MQ>sES=yPZ&t!yOwH(`dF-Ot!0 z9&jOtL5$|EX}%Y*)Zmj*olsmNk}{_`u8UF9AdRBAjRUbfgUF{vBoj;tRbB`ocomDS z2E@~6%-<1VzVV-nri$WuZIa&}T9bfrRJ=8-+*{qrV{>rwG7vVCn)OePKMzw^y*HXP za-@-f-@E8Y^{+Is_*-$|N!wf1q;^+3ikAMBtSUi}<0C&+@m#UoyacxyuRQpL8eC2G zo5_k5JGt*(u-cD>b-3PpC@*8VQOS4tPw8HN<39`7_~P`zC!Vn(!7;u8{A;2W74$Kh zan*-|zAD2mlr1KZ2-A#_*1C-Y#o8{tDTQ7Idwz3_Zq0eU{{X_flZ#&qi53vNv*eup zYm?Rd4dM?6-}%<t6CX-md4@z8AWK%3mZaE-}Szrk`hXBD<7R^sf^5 zFY$xRwt@|13uFc1dChxG=8-0+rNeV!4bsOr>$LIs;=KCMe8)v9iaU__S5ucj)@}vK zEUzc-@^kXnN2WBoSBV_1W3+V}Pw?k8%^eozJNO#)9Z?g5w2bpwnvK=wxuv`sVT?7n z-lrUs)0)MzsYx@_G<{L6WL7eM?oL6g+RUid#o}SPhpl2Gakx3)!;w&gi*rE||xlDQqOlQq@RcFy0eCyT9ET5YsHG2r62?DXj&(nPk( zO2{%YGg;!qUSF`BIY6Y3_o@_%9Ii5%9@k|nDgfxnLFo;b)v$Kh1(*k9bnmftePfycE; zsA)b#1VT>d;PX@Xe@c!>{{Ya7d7%8;&VIFR-2_-`c5A6<<_+5Mck3gDsI{~{KFZ=Ve9$?UMaFz#GqX=<~NPN zDm^n<$_?tbE$U|5d_%X^*UhrN0l-rFX#Z0#g+zyT4JU_%Ud^`{5TsMo!rTUU0_ zbe5LH?#MV%+lujz8u(|$J~g;9p?0_a;h6{NUc2IZWw+F&9&igJSw&{x6Pn=sEAZ!3 zUlUyF9yz*@X-Gjufwpnpy(%(Y4tmt(6RP-Er0d!Sof_-*VIc?xe8p}t>}#g+Z`p6O zTj8`|~ z4*+Spg@WB`3v}1nC**U%`d1C(Hg+X#&ilb17h|>1lG9mbl2V`~t;qtjuP^NN9~L%l z6`jK2b6!hja}|!G9jvcBb97%Zurc`8Rb$~P4z~uWr%vrMl{-u2c=oIIT3k(}dj5fU zQr3G_U5vzI6$S5u?L1Su)^LsG{_uh-#*r|6I9y$(ZhPz;epRjEtqrWDmg4ttGNun~ z0&`f-(FE>!Jl_wleja>7w7${NlG0fTVx2HXE4|gHi^94q>JujUSxlV|rfY9oo*hwQ zvIwOj`BjMdy?WLCL&Ndvx)+mtppu0E9C3<{VvbwjKgLz~l(%tCn>>)XBx9|1w$o3U zRx-^HkdJP)%=|z2X=&hjraEf63BV1{rFI%zA7(8S87RkjCzD0f&=+#erR=u&86cXT z^6ugo)z#Q%-m6H$;_GC1+`p|qUbDH6Sh2QW`1hI;?s3j@*waxPl4Wlb&AN0J$0t3$ zm19gVC9=mhc@-VivMk}4D{;hE&K3%Ie)AI0ZDs4R2 zTFEWQ!?4diYePd-x4C0?pDzb)eQQs|I#s@-;r5lu5^cx|*d1#Yu3A?x{vSeSy^-V} zDb6demS|wK+dcyyQCM09lIZ$jnm!+Q8R=JMx&F|HcBO@ruwE;kr8zR^+J*3F`rrXYPPfFc7c(Z9#sUIOL_3clY42Dfa!(?5n zpVO_5uc{Z9<{2brr@W6+xPSxX`78JEy#92)7m47wF)?2;vPOL<=0HuXPHb;BTbvL; z;-$VTEr4sY&O6nMy$sE$%PiU2xFhnc-xJ89#Eg-*(z0o`I}zGOt!m_vjB!uX^@fH9 zfmoivRXs72QPYtXwv;(M<27qe(gYVCW43YXX>zdTCD7;o$h$LLE--gw*1gpK0NXk( z*^8Eyffbj2{{U~ihTZmv-Ga8>xIXov;nip)y0=baiGrp^Nf_@`gO!x;E!yi(S5c9| z{y3ztw;Eg9{jv6|kC+~ zSk20-O_V7;rPwD9bn6!7d)|cTb4fJshAgD0 z&lT!kF`9XFs~9x$v)oEp6pQ97$8b7RTZODo;bzozSY&&tpJ)fG3gNt6q}|^5&KT{> zF=+q?JuAD?EiODcqA}HBxq?Pq0_s#`{b_tL;W;L^gHzNZcYWoz0CtQTu4E#wg+3N( zo(Rw`_ zQjIOc?_7+WV;onSd>Ykf_)YP1#Me54B0+Iu8YWi*A;~|^j$|V?+rnN)j_zUF80oI? zu=L~q0Iym8H@?#?bo-qy>NvsJ&ZBSfFs+{s_?A0A7i;>iw(6r(xoKd@!hmoGTH^jG z=-0Oz{k6@$$>X_^7x!a#8TP6fzwoEQAMlKLF6&p)V#k(L$W(MV;-tCpo}cjt!V|sn zM=X%J>bX2-y-pn}!@(a11)bcG`I^e^DqL<|ymal>ym!LB9JJ9PxwX@Tj?=RoG2PVA z0(g7E+Etfd447I+{q%5q<3x+#}3FrCNQ-hPxY1vrkyi@TDQ1Iu$ z?M_b&EVE5}7TDEz$sF}HulpxxkK%s=e`$D-2~1GtbZ?t%nCNluS{k;Ur`r4>v$d5} z%B8%Yo0d4|KDEgH$R81#;px}3jY&Mgbv&~T>yW&Yf$hyG#fn;;E}dqcJMjj;ZKlL6 z+R_4Jz`@QtW~=z}Q{bI9Ow(CGxxR?X=efbfY1-c2{{U*wt!c4FVbqw!1S!GC9jg<> zcKWA}JY{7i_>Ee^CW7|6xq~s2cOahQ+N97wXhHD{!uAluV{`Va$bpI0 zBd`wVr>1FYS=4+bn8T+}b$u~uq`7p-IX!9m_l)4X)#b8-4{-+o0m#i`X|_;kOEtEY zGsen>=n0?xS`nW8vIiB9;EP>DN%6!QuZsM+zqAfWjC{O$espRFYiWJ|00_pV6f>d4 z;Mz_)7Ofu}{5*ntXjVY3Ao-Yf8Rz=dtwL)(abkIwY^yjZz~BMsYailI#J13NYrPiP zKGCY`%COpOUCSF_a=?2E(j;@D)vton!>t^e792c9+i&oivEbPZz8<)|zsH)ZoSwaF zS4q;_MewXrm*0CNf4vTJ17oo5So&R~+G!BOsfSd$Vy7Hu>089jyP7eJo7)KPW(1*7 zN8?Slw|kUtw5~DIx*G_R4H#PaZm5a^79EGZ7WSg**&1-5I}}~KWYx14wK%5JntS59 zi6S1^JW_a{S68}NG<6CbZ25T2TGxEdPX23U+No}Kv0lHOV1I1eiK1&Cnd5vN$2}*Y zI^FHXjB!J043bFf9lW$B89h!rP&Dk#SlDRSQM@sa^uvZD_%U3ck8h&YHQ>*U(Wzgr zy>&h$)h%>S3<+SCJB#T-;aD(>9;3BzdR45RBfT=~7gn-L%0OFo0F3&Ko@g(b54MLE zNhD)GX3G!us-~}`1(g*40L#)DeulOq(_2QKC@%;$@SLwdGiRPpdd9len)k%QIb&}j zRDeSC{Adnja`1`#win^J>6(3-6$GgHYowP)ZDz`O7AHd*?q8P~sI(sp+)g4{LhN)U zxS-Lr(a+*r$-J92Vo#-7yYSqaJ+GUpF5LRpXW;(;1g4dAFYj>n;qkN{at&mBXw{Cb zJW*MMirWW0oAa$y(lTo26|}R7Vq#F7b*oZF=@=t4-5*P1bL1}L2Hna}UEf;Pn?|{| zUH9R9kTbyN6grCLO<187!L^8!-m|8?YnS7i)xHqkuH7?t$~oL~S?gxUA7;Tm^eHAH z)ttr%!EuV4?d8*h_*7_;7_o7T`wDzEpScXAb@i%RisTZObCsuAvj#i*Vx$0;z$;68 z1KUQ84i4jkPR)hLo_{hzGJ4bV<&p1Ir6w7{_3Kw$BfzcvRC0>wd}+DCZfkDN`C2fF zMsZmd&Z0BtewAxWFqy{U-<@T0jf;6W0qRNQRZ?R-)fc$t4IvQ}81Ig>}M=}cz zv}rEnaXxma<25rzv9BOhkxr2=cp0kqlcos=^`@qVqS=$HkkgPjqM^T=biTAxY?htQ zZs%H(-sz{in9kVXV-;IKvY*A;)7;&{Qr!tXb60#7;UBYWVhv!IE(S7p4CcCBZvO!L z5=)CqXyQna>?J@3z1cgf9$ZzmIG-0?Y`&3nek1b2em(0m!k%`JW@~|;HwLtC7kq{- zHCW}h7GcIsI{L~+fj2ZtM_eAY!#Zw9WjdB9>pCiGdT}yMRSyknCg$92SeX}$pTApCk1T9OS#vv^+FqY5 z){OhfByc@Atgjh7QTSX%tRLQ-<29%+e#R8rmMnS2VEEq2yh(K*ng{@%I#o!hY;hKT z6uLIvWt$%@jz$G^%Kz#j>HxXR5TKP!I?aT=bA*3g@18!{h5 z#de(kTOB&syfGsnVovYf*o~KjLY&oxvCp`BYlIsV1lsV8#YI=9{Zu zE~%`{<=1XOC6BddUwEFz)x5Z+Qp?vB$vATdG17gh;nEdk2*Z_FPy>s`zKDxBIh2vsEur09jU9OYyGRwp|L&d8Z8M_8t)~cO@nDZ-d z2UvKzKe1@`;s!r?!O!VfJ}LM~bK$FxvFT&XF_5hI!9Rs-LvgM6cgF_d5(U!>9F=T7 zGwF{?^`H1i?0iXSYc7hLiU4OaCJFj_)#`-f?KC(G&xVg-@Ze2iF?MoK9@U@lv*85a z5p)}?Ytnq>3%iWeTc&AKQ^mmFfgAOJ6N4;g~wov#W+%>E1mQVwEXO1ga)^X5Y z#Q96WUkonnJ~>=z6J?^dX_y>;b%lKrpAaszd7DWV*@n?aJG$g%vc`>MzAAl2!N|Rk zw&L7%Jo8;Omxo57slzJCZeC^rP0iF)N^U{yZK-3#ddzqB)?mf4oIY#Jm}&w$CJh}kOT`cHdC4j(M)F24!Nvvi3CQ z+DOSHjBC#Z>HZ8*r;hqB?G-B6J4QbDHJ>vpLx}Nn6(M<~E0cVaMDD___LZuUFIl7Y$gnvAioGA1G$P%_gPrCVviTR~o;FUeZfd`J_mj zdy;q7Lj){pwV>y02hV2yI~Tq3&wg?*tA8|kXTLo%V{{yD@(xFnq8)z z+Fy+1hTh=ro+-e@8xP%5{{Y_Okyx6i#6fG~Xe~4+wlKs_>0E%HopjQxrO}m1bC$Ks z3H&u|CZ1w#paDYT91fMm>Rvd$@eSU5H*dZePFoGuwnxLezlvTa`yPvNcPvg!k};9I zvClZ?r#0xe-V@V)0{9kqY>lctdJiqz2TT6AD4ZU_V9=QY3yT1i~(Uy8W zlUT;?!X+EbtMcR9H4uYLe%ksKJZ<6KIxAtT>W~2}Bm)^eN#m_g;ZGLW$r43rZWkv2 zhRt=?9w*W~Po*u@l$NsGI0PdAQ=d^>2ah7w^ox|f)9v*2w2X#3Fb)S?04sT2B9!@$ zYVaP4_t2M=VK~KHpI6(uIrspPSzZM33tspx+DoSL9(Br|m11bV-!KRXAKvX;ZSylo zO2pRMdR$xyZO03)i7OVN-RAHX2JZZ zZ9KOEi&zw|pqh4%A-Fdg z=yQx!w$y*LBr>?>+xLBc8kU{%l1&jkv)){#59sw}Ks`K4-2t{OK~y0|LfWr40(|8i$ws9B=wnJvAtKO-MSn;F-@Ah2uXP$eOC#+C`GUDLcAm zrnuL?vV)mRo!P-0)<=i!X1mrTy1hhbkKOKTU^UcBYh~oj$Nej>;Yp=fh)KVd_>cEk z$NBWB^?Y1FqB4BbpD)^}YO2)ZgMv9SX;i`r^;>)K5yw& z^yik>!`82Ma+h0zbCcBdsevD0k$Z!m(wS(XWoTL`#i79`n&`gD(AfhcWZ-9t%{!a&86`qpLlgKf0k3(S!b zOWS#Qj1Ak!{{SBKOW}8gFT6G2FuIeOSqzRw;>QJv7^Fdje)R5>OZSiE9*1GBaojQbx z0n3IQl2^AB0mOL!0Kqf(iaQ%EHHsu^s$Ut#J*utm+Pnd-*jUM%(8e?U-MKaC`lgcF z#lde1ZCJs{GW@3=)yRB8(ysKKUdrOa6En1kjLtFv&#h{PXL#27X>~~C)#v$FK3rsd z&t7Xo;r{@IZuPxUE;Q)~3Ni*OGsPD1YC3|*(kn?0MZ)JG6Vq*U8WrkU4=YERlL@(q zYz%#91Gv_oT%I`WWo8zPHpqRelK89QpRwFocyD$@s<#B^{j7BSDYiZ=SMdeBa^6nm z*pI$S9u0Gvgz#(LI-25g?<5eER>nZaPg*P%J6%@C`(Do2ESQf^CC?plG5sr=m%>*% zUa2MChzy@auSWP18m{)Qxq6|u08w91?0G9DDKPz?Z0 z;fu{@;rD~|+gpv-1`CIkzlQ;vKh~`4y7ZnOajM-CO~@^`)A6d8-Z8VYlETg9l1trM zZ?hsEe6}Y5xA#ZAa~>(xqQ3Zvr|A~gA8PW@i-lI)sN1*{0h8nJ1Lz(jwMZ`!eEY{c zk6ygh&kcMr{{Vz?O)k^J>O@*}CNMziHk$4}D%)B^YYbLU#4eiw2tY7#>t1iGHP(%F zZEV*wol1Vu$aW80p4?CbmVO(8`sV4il05vfjE>!_D)&Lu?|f;X+3BFH5f{lHg?5%Y zWzC=2r?pt0b1wFf@J@LZ(D>t5w6QvT7b&+XM?jxsKE++Ii{{RfznPi_x z)LRn$pt?(r;G7Ir%Xl`+K=H+_nt=OOvpbEs8%zgp2j7av(0m82S@@6b+VO~5M8-g< zG@X7elNB0 z^k}+rNCuvK!t*B8Z1M7*=DH#V&ZVg?r5&ZTQTb)!8EogZKrPb3*`l5DEXSXmel?#x z^zurm0u21h!?3JRh`Q=q=`uWX6D7=M5)|{(6>N!aRMvH?T{}=|QL=Ax{{WZ&0Is=- zJT!EhRgnJx%Sm!L^~tS23U~@zq_>}2ksdw2BCGB=_Z6?J+rxioR^C|8*}ij@>^S`C z5?Aorq*_j(?f1aoRt1ie;tf+%p8G|1OI1S~;Aer?^r+*O@)W$ihyFZ+0!DsfG6zcO zFD+M8@XDBOrL}+qBkXdFc;|uFr2tp(cZalTbWK80iDxRlZy5EjE%2|xr|{p3ue?cN zd|OQqBy9kX06QKI@4(lhYJM`e(fln3_EG|qX9ZK{Z}+R3)vuQKOa|o2uPY2e58Wj9 zDmeUT8BOl)wabRNV0?(qah{-6oi^R|>wvZ}V4(n=)wQMgLr~K^DAz6_TXLnaTjnD^ zm48a{HKvoN2sC(syp(SxlK_4+0N)t8>AG^kr$>jEt0=2TuCee8d3_D`G+2rZ~JC#O7>fOciR&`-p&^SgF-z@IrLk1n|GOMxRAX$?_4Ig z3wV=Qjqg8k0L}+o*QINN&M{h8t4R^ZBxG(qYa?Iqy2#O{pcPbhi>&~1uV~hKlC84t zgJ%uuYe)M!>iXD=-XSBOr8imeEw+Vi51$mjWHN}9?D@lc`*B-(oy$w7*u!fq4mAb+ z*;dZq_q{q)OLH0SaC*gxY4;&?!;<_QQy{Z_Hhq$gYf61COG}2AD=0}Y+fGjgqt+Hp zTT}Ba#>D>sZ-ZA7Ox;6!$N~%kX%gMUn+e5Q)Z``AB1SGa$Q3kpqwH@b%CgBC?m6%D zt&^~=a=U3_A-ug-lItu}JGRqixod(1VorUkYfTzRERybc-BNe*)Dg~l^ry@mq$16) zc@;8R>`W8)Yj(oLEVRicxLy!*$2Eg@edgY@afak)r4CmPQZq4?fL!9Ww2d*ChGUL9 z)>XWIT;Df(=+(TdKv0f@yN>IBpQA1@W5a{8w}? zZ!eu(5M=9GUM7x2(CwsF%XytM?OYd#wHe~Exo$}=ILEzvi8greb4OCTeLG14+;T}d z#d7-gwImh=rI-gj1xMm7TK3}13r)LrRt|~b4NJuLVQ*cLJA2h~iH7?P1G>znpuk3cb@d8b5r|iZo40PSiMSY>Rl04mZV5|Pu6|r-8x)qF8j7OML zcH>-UjXYOvC5cU1;l7}QS<6#+=!+LVH?qIYu7P(Eo2C@x)lFl<6V0Y1+O&tvoRGxv z$KhUAXMJU-Yo>iR=2P<%^DwVi(7Z?g00{?&qHC87sh)>DD<+y|jp%uoi>%LtbtwM; zvgU8z0!|Kl*InSx8R|&w6w2m5EEUKdYJVQ-I&J2VZb4xzLmc9~_ro4Nx%*KjB{74y zjP|aYaZMaGB-7Cz_u+3Be&9!`NDS zSLP}WdLM)QUk&}VFkBL{qYN6xs^vDNEAD!Jts+@oZv;8^u3J+0i04&Um5Pkkt&HDk zy4!Yl1K+J@Ay?JcMfAJUkkm?q|dF(<;J|JZZ{g! zN7Ey>^59f=0~rMKSoW!LdvErgdPi7K+zHn{;;Y=>eWCol3NmCI0^rv0rny6y)@$Ul zVn&}NiQTi11yz$%hU##1+r+eg?$d01O|59@oIpXcV zpX*#tjI3=++{NVxif|DJ%D+mOQ|5Y?3E7^_;XjBLn%0(XEpMZZi980aX?0fAEECIp z{-kr7`IAC}QMW>DWsxFQ&I!eO@51ki5&e~*)Krrg9I(Y@I(BB9=B}j_me&Q{nMP{P zovX6#G2CI7r!{k4mfu&j&7m1Q@macmg5;XYS)!4S&|88lSW;ZAv2&iG;ENcpG?$X$ zgtNKGC$2GAwsDOQ#20WV*=u^9TIZoT$)n-MxHSDTNpH7);lz7Semd7f;|Q&8{5x$m zqMte`3-Q$PTyiES9jjmyJ$#k$u$uY69_u5XMwRlIM>1)*q?=%hUaYwVN8?z!{<~}8 zTVk4>%+kyOcc*C1>7g?jw7UNjIM8C6l%AL%k z9jbjp<2AL;rDgvB2}8#av_g%%<2?IUk$841<<#Xx)o*-^{oTW*Ht)kx>MwAMb8|5* z%RVwbl>LD|*`Dhs#}5n}ggSlgsQO51_Pg;4J%2!v?C(+Rw&lQVf-Au-{uysw;Q(( zdgF}Zy%+X#_y-S*Ehf|ad#Hguxltr?wi};uTOS1U4+VG|!Oq&+o85A7`;5Ctjfmin zp{zTP5Kp0NuuTJ)wFsD-5U1q4_4B@*V;;4X>3b)Boqx~#%Y(k>x%l7WH-$fDy)XM8 z!f9)1sZ9V>Y?fx@oMygT@dw4ta{mCtx6wHa<@PSZZlT?Blx!O#(p9G*oru= zZY`9>By#6!w|&1tE5yDq{882XBrdgCU{!LtSX4ICjxpX7ck4^y7?+-Z{?3&XbXYA$EKnTq_}n(X?tZh79(^Ar3w@%*0;^w_`QGuP4(paxlA z8&6?hNBk)GouhnC@R75;)~w!H1Eha9EPGR42qe3vRG1!>;itaR< zs|SzF@bV?~hBLl1mB(Y6@Gse~<8_b6?*M8#cf}~}tw;BSZ$=;@_fK@5|5Z0+VND8_nXz03A~*QfD^gGJutnn~s*vU7vS6uC!s z&q21HS>OE{CqGKLbEaNhT7?NDIV0w)dRK4SX%{9dITr97x82QGi$tF8=uY_n9PO@>!$ywoGy1bTPi2US^D^tOCSJsnD9ooLkjAU0y6^L1yTVOT?+mEF|Hl%D|k%Fivy&H*c zQM}dGcl#_LD=Th4g+6Oww%dzyie`_XwbIFW+1zq5^{O}5PPax9c(lU zp}DZagXRy;qr8oxUCZg3wV>W&+{qvr{_Q4Nwcz=nvb8CwZS%3ldeS|_sdqn_ow&|@ zt1>v6^6SqBVy|PyXw@}IB+Ep+k&4Ek8aix$+Azu_UNc#ZWi`wBP=XdCy0vWLlTYyE zljH_&ah`fs9+%=rx3@CRpqWn2D;4np9-V4iC~P11hV zelB@AJH4uJ7HTc_aUH)W7~{2U1gmT>wHtE}%!4%_iEb86L+tRNB%$d~(%9*GU9^&% zvu7FaQCrrU0}E%fV55}>&Cr`#e<9nPo& zFPJhH9Wlj2c!{jq#K4{i9DQk)iyj;Bmd!Z|{JHn*R(wrjZM4xGXkCF*kH)sGtj)_M zy^cVK<|e0Ah3^_0vABd|pP-}%D{B+IrQP8LNSW9!gAkh7GmhP*;P-&w_n(nQ6 zJiAxPIZ^%I1#jw_wY-bu+s3OL5r)PwoM2Tg3rbst^WiM3dCA9W0B)0GZ+?<;3r0vE zg-Ecw+}of8?O%bS6050M73$)%R3I8f0YEBlIa&3orbKh0rR7| z!f-RU6wBWaPdVnRzUd*ZQT@h1NO18O$cYqCoOGcI^6 zNyaWk3^zMX1fW>Cq%=kHVeL#i&L;rQc;6^c1xa54pDcvU0TG`%WYz~Qd#{KgpM z9CxllYn@i_;>FgTU_r2s-CVYMXF2DkXn;=;cv{-d^=@rtU-Z1RqjyYntYbX7PLF#G zQWJF~ZL`-Mv0HvKNNs8%x7se;U6;r3lZWRpP(ITv@(C9ls0t4vr?Byf()>4Z zsNP$!mT7|_J=KqDzwrmdaa~rHDo;G9hI*eowt!IABXj9@Aui{O7v)f->i6b%-g&TSbx#6z} zx5c@pxYVLB=}{-{(-;{Ydi&R3;XNYDMAPmxxYcm(85w$j1pqr;@tk^wyBglexQX}k z*j4Wg_-fZx@nqVLp|zu8%>iS^HukO}>f#R*_~POXKXKb0K3;jwE6_B{2e#5}k}^Zt zAVwX})KCNN@1wHtg^YI?jlZ>cW8HVJ6$#Pgo8lejp>vtwwqfOtp)**Y6|beZeJ@7S zQM}l$W4m@xPs&&m{Hw3gZa=WDF3zMp#MDSD-)231I?yI`UL2idGTwNsD!ib>6S%-C zdM*djxgQ$*KTQJS{{U0?VG_Zw%Dc=7hI^*R00!fwYTo#|Ke0w&i_N=fRuqJTun+Hj zc&l0wI=74D)9(zCURo9NoD6LQWNjzdig7S|o^#;s6UCaYx90p|)Ldz-Hnp>&$FTYm zwdmG&9vkrXn)VL_Fu`Uwpxl3YPZ-ZrReV$7yJ$6EJ{zmal@7vf7LQ)f`1C=H7Mk^yObE-c!Nc{ySufq@TIht@j^~O`M;e{eSHUk@1i&M-fiHI zZcq4htzBzfzqIk)#CMkPMI2;c#gm#{LrZTG>+1KBN8~I;w|^FU3Ithi7Ej_|3)&+o zjx{ID1CliIf@bhOe9y|Ur1L5wIIj(sZ*9}T9Vu0YqmZX#W$ zk9q*FY2Y~gORU^pTg2kgka;*KZtU}l=vPmI3rKA2;3nw+S0k=RTI}N0>}@mzv(sUT zB(eSL6TxAOVz}6ROyApb%N#N9orwVFjL>Rt+O@8UZ5X>nUioiY#?z;Y{{Y4g_YSRZ zo-@*+_?LDZvA*#9_cmIruO!xoY$3X?eLn+T#l_<3{%S;bO0G`f&PHkt4@Ofh-m$6z z7Ehf)7zej{iEd#vsc*xYC9aEWC-%c5O*k@zW6w|iwO|W5^?RJ#qbldHt5=r~b*&5O z*@d!4<$!usQ{twwl&z#{*y=z$Rm73kcEd+-W20ZeYA78-lws) zpI*LMCj_DAir&^9+egtv8Zrql??H=>c9YQYS~sCk+{*Cofop8cb*R*w{JHe}D^gp_ zPZ9W&$%YkOG8GJjecjzU){lmCIP^^;&hcAret-%aPPFjGoJl!WC6wf6o@+asSscH_ zT|(bav%7~&+J0aFU#PBW?PV;o1U#T8>026)m#=-fls6BNk$`y>l{L)Eeql|!1Y^BB ziKSvVqw{%AYVmj+D(d*}Tu04&PjHT^ri1rJ#`pPAM3etuNW(7Uh0*;M27I zHc2JR2F7Y-DLv1c;DX0E#c0I9CL;h)A=eh-7~>1v^H6Gfa;>)TIW=a=*_qtRbF^_) zZ?76x*^U9l2GQ7~Yp40SC38h;>F@fu zh2gQOD3%R3CH4XP(^$~tfM^FFRFMN)yV!U^#yia#)7LPsS9Nn~gP6y5T*O@Dw>tl?t@UwV+&`T}cW!wTr4Qk8ht+Wqk zbr~LDEC4>W=T`d7&aW-P+|4)}zEDZ0SnAjIS24uTGb2a<&rVHt(rL$2l4+@EeI?+X zL_M)A<2+W5wW{p4ZRd|#@}Cc1Ug_sD$l*WU>0P?&Fl*XTjV8>53c^u4l(Z^b>r>37 zC%Q(oA9gHrkF8Vw-}@i@g7mwYk9Q0)RcG+>$+`$;lkF?pwtlsm`uBHsVJ9B?NI&N8?ME`DfEEAdb55#LrS}mPO)h#xjjP;Dy`k6fxF$OUPl6V zM&z33^%1T3N??}umimf5K4y?H=B?$+qy+;&kG;C~vXBUMt+P6P~Mlm2=! z$fxSsa^G5*?BrQ4RC6dCIr>!#y;|-|fX}B|t*@vfKb2V2^*=h+1E9y{vX7X7wv$G* zw=hPbE{AcmTaBD&f;g*JemH{3BU|jOGUsPFr16i4((6u0UffAOFk5Cw{AxcBcmmVM zwjNfcGRG`Ds3+E@$k^P|{94vlCA9f}a7ImV{w)2c^&bW5Ou8v~AXEF$tT`R({-N-T zUDIzq$!8>n(atvsc*km%KiP#WuOXjQmN}u7voL7`ao>thU_B$@7sjZ(ccsNVz@(=G zX&|4{y@m^?VH}Gf2hi8deiHCg_;Ej4&?`ASxG?P0V z0&~q@@W+K_@lE&IwV@kZgPc1IV0%|I;c(_Tq47rd#j?6tY1cN^{TMqBo9T+|JTstc z9v!m#ZG_1Uu^DA$B=gT&>xQ|Z_*+hvSnPDi5Mv;!o!^Ig^Zx)7e$!8^!z31#Ht^c1 zAgX`?$F*w+Xf9%J82HLN-woefTIvw}rU>$4{wF?yyfeo7t>xPZ5RzDP-nV>1t=o8u z&$!Z&U}4KDuH2vNT+Nm9Pk7PaAD5ubUm#ptdo7w@pCc~u+Z9D*5$aJhpT4})@8G(I z{{RfcTl#L|n{iZLSPvier!^bWyKflu9`d551bn5?sVui4KVqIL1nIEPnj<+Ks`lY)-?lV z2vl-2=xZgpy{uBU(pOE?OC#h}y=Y0PTkVI2{uVu}He03`a>lhRHF(zFFUcO&)MY7L z$(^FQ3pIpo_KR{BTVLZUIB7ng<5@o!d=qWr-v|r+B&4aZusF{k{{W42dhN2uZT7u1 z`4?quuxsmf zxwu)eAyNR~*H`fK#`ovKcV_N5rgcK1DI8$?{uSoB*0F7)>8&okEVl0?&UQqlz{%sK zZ59@>pR8$3;a?Ocx8SWoEN5JnMg-*N*y6sR{hU4}Yd1EwGb*}FWnJM1DyFl97LL_$EoVQQqUn1E2YQO!Ke14jA8eQ$)ndYprc`TqDx6D3oVP8f3 zAMwTQo}H*@*E36TG(<+y6Sy}Z{p!j6r@v>V_^siysCa%KB1>oqa~RlJloC(9dD4~H z-$_|&b6Q9I6zpm~JG_d^!g}SVksde6B#~`l&rCIaH}KEJ{u}Y-v=@E^yFnGoiDk7X zbeqp4$BJHSeQ&{r7_1@0QX<@h zb_c%C!nBk<#>S`bq@CY2)B^??70N;zMg?B$lHtP>g;RLf+jjbdNV#`F%58EH+Wz zSxRlx7YKOAwPtGiK-9cGW1kU~A4<~t8JNB(@dD^p(8;A7?;$V`wPA~Sbxm0=ZaNdV zgY>RX#vUV<*ItWGftmI&Y<20yby|J&^Fa{WN6XD)CTxpuG;!S?eq>zYnWVDLmlyLX zR@y#VT?Ot zYw`j=12s!d@W>N}yuojNYfk$1b866Af&^o7dDuqix}T%VCLz#0IztK1cvLxqps-=ET}u>Q-ll?Nr}-TIoB zUfX~DpLK2bW8M8KmEGdWe5)bj8;GC@ukK8izFfR16q**FzFfnCGfmYdT}Iq3pDso? zt?vVAhT06?E>3&%S+F%Ul=~y@xEY9#pV(F=tF0uOl$|v-FSX4! z-A~Gh+lcIPDm^>Hwq6SGExpVthg7+djOQOV!g$I0R#l0ablpPtExtJbjOUOsRS-5c zSpNXDY#!$rD8+vPR^o|m^j$Jd34=*+nVfnaY6XwT)7@YFT+#90<~3Wxs-6_HdGBZ3 z2qdXF^8Ww|pfY|c_=IM-9 znfuUKbU8gKfl|WuS$rDzNC=*3Rq^OCT+fRT_X@&7N2O}XuiNUnmaAzT z9$%E;7V`1CuYUD5k3Eyx+&-cbI7CG^k=~`Nfz13$Q>&QUL2y=LH;%aH{{XE?;``^b z*YulMMrSrkNgkVxVcl!i;_B+(!#6)^Xj>Qur!^sJ`}CPoj$?-N{To+#5in4~Q7umB%wq2iAkS>AkT(e#U`9%$~Y+Ifg!g>VN4@ik}T zSH>+OeG66BG{|F>boj)U6tLlX*9q}r;?&&PTE%RRk)a!cXB_&_qhMAodQY}ck= z_@d8BxVgEzjhgCAvVcIYBJad;_$tQUO%v~4VjL*Oc+FJR{C^d{iu8LuY6Irnqhu7$ zPSZ?hW$?Q0>%{u(x6&>kS1X1YJXcwDrdu-V%VwozyDNfu>6+&L6Kk<)5?)2Zs79M+ zJ7YaR3f=I(itW5|(k7OH9vp5vcJ-pbJK^q^ajxl->N4Uu^!F%343^u+AC*(_w~UUk zP0xk_NskZQoN?RfS|1TL**rbr2mb(sT$rJG1X6@MLow@--n_fPH+O4wt4(|w8*3%= z7_q>|U+Yy9Bh)PQv2hK&(>Mr`VpTm$SDSv)ek{AW@Mf89;8>*lUZrr*-SeHX?8rZz zbYB7OSK>9z_3ib~mt|`?i)m~IAZMp~yKxP){xi6a+SM8N{{R){g78gyrFr=CWqg>q=V~3we%Xy(2F7DTJ zz(>qT;;DF-!WRgZmzrTzcex7Sj&aE~-d@?qpxP|)FqT3xk~jLq9^LCD=FgorttXRg ziRLcjjJMK`VmVBUa0az4m{QV8aLt}Gisd|O;^pu*n9r)j^Ipp_i8hchhX8f@*FoU_ z0E+qr?AqihGD)aJ`(tgKgU3VktS=n+Vm}k>kY4IC#MY{cKzAQ_9Q31@T&FXwTij_e z+g{q`4e=o7sKssgcf+R3#P;i|Tt_5R!e%M~7(5^ATd??jJWnOOUn{`@%3$PkSNuWY zD0HcX!@K#37nY!pS~-Wxa2_YThS%b{e`Srzu9?R{^4CFgcVjf|Eyw~z9XPBn40wJ; z@nz-Sp&sQ2DqEh^#nNWJ)vhI!6@gxkVC6F}FOI2llDe<~y?WM{g*-krpA(~%`BXPJ z_N(?*_IJ_69jYnAe|EYJI{wqcO8He;0=Gr>q-=SA#&x;XHA`I|Phlmraw|%MuF`p_ z^>46f9u#X22wF;yDE;$p91+r{(Y!$#c%JW4dv>{LGad|OfC8xat4`E!FC&*ojUs~V z68Lbq$F%@*ek0Un@cf80NtR8@0RyqFuRy)M*Sr%7c&&kCkNp^99qWPAB3moPx3qVj zNhQNM1cg2MuA5Z5z0mC}BFjzod;|fvXFvYB0O|ETBG>FuMX55iuubF+Fx3W);jC%* z_tsz=CPC($bQ!9*8ePPfHtBTDBzF;qWzKeF`c}V)^~Lbtg~o%V9qXy)H(~rZ_n-`C z)klVWKP%}&bI*;K{^_ZH8%=AZ=rd|7^J)_BB}wNw;;QS~VX^RRQbF^}YSG(c*PK?S zli^6T3oB`^+YK)zKC}v38Tt+7_lb2YmedK1Z~1p~+M8|R`|VFsYkftt1YbHF9!+WM zQ+YRWe`n$?<2-SmYkI|(M)Ky=*cEIHlbQ_9OX4k*dM<|&THwl52LrLLZ^Ql;I-AKo z(c2OsZhb{|d|z_+XEt{d69_zvV~#1>T01>CNVu9(PTspuy#N}1qAv90 zw~2mFTANX0rJ^Jp?jUhm7Fq;44~19l7#9R_>sWxzD-Spm&l#W!_u>Blw9!ERA^fW2 zz{Y6zam8raSgf)_*DAa7%{N~uXK?YN98WAdnbnnz-$kER*evBebR)>BU(cnr~2o`f~2<+{bi)aw~lC0(%CUe(NM zS2sQ!)|N{ULL8RdH+HFh4*Xq*$G#sz@uuO=-X^wuLuT5o$&NG`AmIKL_BgD)(?^4a z$11GzUmN^Zo$sQK-(wky#`sQg(zZN5q`bG5^UfV(OyCn)x-Y{*{xlD&1LdTO_{SY< zu)T_1LtQr7O6`gxgIqMDW_MK8T;+Ui@h1M$HhLOIwcBYvR!%;(#p|{=Hdf6&?2OMa z$xv{AD(F0K;)_2IZ$?CWgplVaA6ntHKZp_P<(@no+XlNCvBh%@F-GI zGjVbxTbN|9HjpR|1_2$hSeAB@X;V3!)HpfIR^^?vb{d4SOU$ZB{A(Y@1tf{LHYN0_ zsV;S4!amL1?YG;oZzHZtetTVY#xn%}L@r74Xi5440^lIhP99 z;Bqlt_9O8Gg`{&A+4$Nyt`FjTS31Pv%E=3ez;J4*NGB7O);=O?$*f!1M{{fC%1-ay zjQ(}pct1~zoF=-NuD+!5M_#A#Us+Z3W7DK&# z>z%|o*%Vi>U)#x)NT!Hx{ovugg0gLeuZV6M-&P{o@G+q)4a0r#k;_=Tjc!4ug$@7a^5 z=~8JD>9Dg|U&v-MWkDmRY8_PAcydsd*2yq$;yhCspL6jQlJFF=xRM^o5R+YBhxOZC zUeOCD*^I;eTky&3YdXurXIhKS(!TdyqM=U)-aY#nS)-I5R1Suvno``_x$w;KNM+Lu zO&fK}hpJI%7M9+1!uiW~0Ki!YAC+wBZ*io;BfMfk^{BPGc-f+RB1vrKk+}?C5Vfu1 z((>E=8_Uk~1`a^u=BYI8CjS6h(d4+d)L~X&#KgpJZh8UhRpB93{88|;PttX(o10O#KQ9sCN8ayPsHV<-V>7@W9=N{L zBz=D9O)a@QnOkTl=~}wa#650Fn@-SYMTG`9OrOrVNo@5m3I@1GW{&IT8T2(Cnc}bP zTaP;A26+#2TB<3BF*W9+e+}NztD-`cyw5}bR}_DKgZB+nyUD?=g-b{*=y&67zk{Nc0IQrm0rUI|v&0B*!~rwJr+ z){kZ`VJ^(Kun6u5+C2sj=S!j82_!amSTK*zk9vlAoij~}18;Vc6Uz+I$ztN}Xxv<` zpL6zGGl(0pIXv~|w4l^h+eVm12K8V8Joc;x2Io}=K9#@W%Q){XZc=m3@sG;0lue>T zWbB(IgCUsU)czo0Jdh0KoP5}*qd&fA(0$siek4~jw;~?Z&&#Q__GF20s@`1WZT)K0 zqjWg3>G{@VF&odHk(##+@Ul2=Yg3U*<^3}J>IY@)Vj0T-)TI?AW@@8ytk&>pj|gIy7LL24aCZxFpY?8kz2BO` z_@nUcwW|@TXsA_TC8PtUF6qb9w{Z~37(9vh(QqJ2(AwK928Zb_pJ$#3aNbElihl_P}cke z*tj!&oN}w*By_CA)nUFRbxBAfy06*8L!33l7H_jMSo>%*NK z-q(?zX#USyevzwqd5?#tjt6yLFij@sWBBu4=cXHdDkXyPBf5#B!vq=Y*1jJ274f4_ zvA7f5xVB41{qhb+C;tGhEA6j?o+8scbK#WLG_*N`^+gh{_kq{JsLl?UBX=>8&Hgd10uM;hyD`M^jNLaM2}^vIl$YFGhL^N zt|E-vu8#XyN6tRA$aNW7g}gdF_xcd(d-F@I+&uPSnMQqE=#)tU)AXEjwk*d!5#Bpxba?pxTPreh(s-I(*!9PwRNnL7A;Mn@k+@j%vhD0Q*QcSJ{nE@SY78^S%4d(Z*wm6DrI&CqA_z z*vWk-+BGb}Y&rqR{b??B<<@|)(P9EMJh(ib)B&GuqRFdY!t&?J!7sOr@lm#*moZ6e zYxlBHoc60)wz7OBV(8drUzF#H#?kMhw4J1w4bq&C#(*^}yq!NyHu{9F;HAa>@*fKh(EX zKjU5GP)aSJ!j%mk=Hjw+jX(Q33oBVhUIzKe>T+{eJYC|`q}@jhQH(SP9Mmu}{6pec zlHK98QpV%tPWUxv!&*d9$!IQOc@Dw6^%<%@6Vuk~LARe!Ov=o54|>1hUl*pGr|Sbz zjZDzHEO|5ld`i4c7W!qg1^(3v#}LjyVmk_Uk)|>5+$%h8BP;%pKici|tRIK>7alLP zH~u1A3whm;b;wi2cRCf+myp~+BtS=U!IbBqs*b={wXzqn+gZC0H6;#t{v1~y@ejgx z-|(5;T50U&#`ZzIhaxZlJ$rPoL6+JrKT&J>8v|#S2W-`e?V;85rCTQ7E$S9$?-?BN z`Bec=!#X5-PKP{G!5nD?tI56B?+~Q$PtveH51Tz(!TOe>u>#jes#pyi1sbLMxZIR}4vY0Dp~acn?_8{0-m;ZZ#4X;~c}#AI5+$_^#&LLbkJ5T0b^L zL**~u0FO^<%<->;^!PM`tzZ42r761$DFQrqBDwop-}p?m)z;yVos)S&AK?m5uU;`- zw~MWo{=-t!W6K+xV1R$mGE{V=2N`06O}(_Z(zv#rH$HxC$31^4>b3h*Kc6jz3{%Io z$>ihM)^3TQvC!7pv%25p&MQLV^xAlQ#-B4c%k-cOhPj8sdVRi>@~OVmls%%OVS)}$ zM}9L_ym{frlf%|3k-I&lqTxdI3_U@RZPeL9_8kisfT%r6a`@WPGGB+BvT0 z!(Jm@Z^ZXzbPZ@C%4GM!u5N#Nz-MXE$KTwjRcmxGdlcUK4TKU;erhgVjxNCdLU zh1=AgYt=RDPwg!(PqL3GSAYjOuQ~DW!#U=+w~?KiHI-es>s@r!!1F(aJ{E_-9vHUP zuEoKF_LmCFKhdIR@+R~`F9{A;|ofL!=xqcXbr8wzh2JZB!f^{ZbNekR^p_~zq5 z(e2Vm6@*|GBR?oL!P#l|`h>Gz_=3hYwMh(0Hxf60lUwqb)OKg6d?@fGx5Tf6QE5Mqg;ra1*k>njDi>#7JUgUn7Z*(`T}^IKox~~Q0|Kn+ z@<(yu8&h!6%{A(Iih8n&qW&2E-n_H5@hbU9Boj<}{Ef){E0^)4bDy;z2VA=?gu)ot z7|NbaOqGg@)bu}wKiMA{wlta;twC`NuVl2saXbA zW^AfqPI5k#Bpx5rz8vZ|`u2$_mgY+pSr~vf;|BzfeAgMTd`Pkybb95boNaq@gvh&& z6`SSjP-=CSek0Qn^(&n&c;~xIH;eajWN!+4eQRssHQnEZz8+iZT8w4x^##j-n8^dM z?bf*u*^lAWwpQ1dUM03&x6(->XQ$25yUVkv=@NlGx(f?GxHomr{{X6hJ4iH3O@783 zd*k-#7_G}g3w-F^a&gWEd9OA2{o<=%4{2T?)9q~KL3;p-*_30?I25<26w-J%8Zef&T#F zg@WTxOPCSBX$IrNI zv?Xn%$WnMYQCgo2e0gi|*xJde+KgV#SOUK=+-sZoU+^bNu$W>$wk_H7mi?3oAHGN& zb6%;act+DliYuFoNbl0r2LeO4r_z;2W+tv)@dw5&G+m3^$>V2>A{ayCk9F@{o&NyE zH29MDOXCa6eLqYwm4e)`f@3FRoaBsEFNjzE9?;-Tb6J5PTodG|%Kml1-TZv;R+nM+ z%gac08{4MxE#Q#t3dfK^>)NyC7b+=yAn>^duUa;djC7zZYuB;$2eaeKoF+n+1|6WKc#nx6|(K$_}fSt9IWIyjAg<6L+Uu z{{Uub(EP?p?Y53O44(DZc%MnoVDP2ft78?cKnvud%;_#F|H&q)iEh{{Yqjf^+q+mb^u- zNv&#LZQhXs&uT=1Lgys@RowVD;}y?=H1t_)VR+^~VFp4m+tQ9{A%@&ez zbc>bT`>=h*Qr7ib8(#_CYF;9qKR(om-w(7FV~z*oSeh5cy$f5jn^J*e-+Z1@4D?~m zbGoqq0ELUFMWwR?IKOA${cg)T9ghPBw9<{v$$w%QSxjk(CJ-wF70QI|xE`%oB+FiYi{fg>B+kRvRXs!9YE@ANb+U+Cx>C}7FzBTaXtE;S5wzlDvD(92NMFN(` z1E|R+siPaUnm;xo6%cU1b?I7n`Tz?-^uBHWtz`(B>LU(DV*m#nR-MO!Ej$Xbwyi5o zJ;2}PGK>sWbhK?=TbrAI+$?eBQF#V~Ga~lVEqBBkWrCwD7HU>j&p87;nz;tDr(J0_ ztkA}S6d+_N9<_t3c!p08r_-6B zUb&mQ;9omH;}x^5!qyrT5V6dtK5EU1+}vA#v}gjIwY+UBJh|X;%~#Yz@60>6Ja?@) z>_Vmw82xHH*j6ZssC$}6V;V(!q5hOf1JjBsEB!;tkcFbH68Ao1_#*_K2Dgo7236n^ zoh#a-@dS4Z9n=nhZTqLMHRNxp#o=!U8PIv8XP-)s;djQZKUug~wIoI(j4`j(GgvuC z+&&ip%Sopr)$V1I;x?2tV4U;QisJl5@d^AcCKhVuX*t|FS3%-kb}QW^O{1d1n8wxh z^{!TZF5gtKFR5+a>ecbwm0>H)`UzqqINAr2O>2MRTc`8oPd-_Tu_WVZB%jBc>EFW| zM}_o+l5}}4w&jX}w>5I>OS991J(D4mIODBz`px^@E8EP+ao}dUo4J$|`$tpYtzOz2 zd7d4;8vp^Gm1D#I01;-=barF7#~{W#@m$Ye%a2Wsc!ac4|l zF~s~()1O+kmi`!2M&luNjlz;!kL*hrB$+~k0*qsxK(4yzM)2GV#b2|hO!Ta;6Zmxa zxzTjoY>pssI&oV2MinBK#~^$`Z-~rJ{(Ohlx3qm`TVkT=UO?Q8b6C1Z!}R{$i7!v@ z5%~wTb$Y#$=(EC>stF1@eQH~|6xTN9<))-;(D{%#Sq2ZwNh}cF^K7dUw_X4ymJM~L zi_5%^fH=)07NX*8hT1(UO=OaK6xzp5)1>AZnr7(00-)8&A%gbXWa^GRhD}^y10aG> zxs&DGe}_HmHt)mFrd(#u=(_uKpphcdEi|<)r$=_Op5)JPGsj79<&kgQya)#tz(f{A+K;J|dgqM~qqvg5gzIh3%2krBm0u4*F(?V?6Pc zxrNI|#!hp^I6iH`&Dg^DS);$hQFn1=BmJgHH$~<#BrY+7n&~0&>3^H_(&Rh9e_2 z%zwg1ZT9V&-O|T5VAZ-@-oyf228jELwFHiCW27-{vw;C_6n?xa|`})%*#mZt)ASw{8GtQ{UROPT|bXp&7K) zo9#YX-_R)LtlLkR_cD+xJ5;@oT8vGlHdu3o?^YIR4xSQR?lqfsG>W+;)S^&KY`;oN z=|0mGMiGLbDbIRti)9R7Hl)BWy*B>rE~2qOGaDVtk4nO%+BLT+V@tGW)Z{|S8YK)# z?lD*NO+{=kBr|R+p4FGAT$nW?@SJ(77moZ^hL(^EcWaWnv)-}ilQfIDe$Ftn$tFe_ zc>L=+;zw4VDOpO$ayjW%VZ4AG1{GfJIOcQZ5xCOTn>Te~mYR}9XPgo96{u0Z*7BXe z2>Rsp`cxOT@>;Bc6tb!p!;{vpLd;!FEWdnAv;m(j}D0IGKNsC*{k1LkTNc{7j+>rSOEQmI#6O~@ll zi+8uw!kc$LboI_Uio(>bWYX<^!K-KA6p>g(m)g$G*Ylw7oDOsYmm$G7`I5!>sVZY{2ca`y;ue-r%LI+O zg)CQ;H30;VtbW z{lmLw1^Nuvg;tE=Ef0E)RVeGZ^fX%IX<|DESZ3UI?uc+RR&_59MGWy>Oj*89xTl)t zbPp3~9z+_Zm8rpX=3#=V&MTqP^{D(;dA`Qrs6m1{d-tjLhUAPt5b8oE+XAuzd($)x z7CW1So_>4gtaygRYZq(wRp@!eXb7Ou^k3fv)MM79)TB*sRoiIW?g;|})3r$2K!e2kdO|aGhWURHP~_R9Vy$xn z!&-UK?QSkD<7B*cWjOHDIMit8UZK&1EPs_GX^ z_KNWh%t_*(GZ6dB3;zHWL>l3vj@5YEk{YjSK2L@8IL(x7a@%)cWO3e|r|SyZS^HV? z$mk7W>b@$MQ-Q3)mS5pM^wZZ-txONKzle2vm@ffiE9G0T1D(O`z!*}isIIaHx4`{cV7L&4I*}fR$ z@-b5xw(JEt^!RiawmubE7I3PPhx?_wupX7v+ugRC6{B3AGWO){mB%VaU_T1MyoT<< zl6c~2959C;UNc>#ri~4*hZMTXfiwWfo4S+NirflTej>Ef^lR_5tBG1{1A*yN_-jVp zXsLS2=Q#v&E1S|pel~{wD{N*vfDh$ewwr907Ec5`%B%R$2R*A>!>sE+VKOU087lE1 z`IwHJRn02NG)bNak%FMyTO1I3Rb4wwveGBX#Gf5?3x9~3#+M7p zcbex1mpCsD{G;pm5*Ay)&`{nqSGWqakOdY~ za=!B0wli$=e+T>; z)OD?VuBmfrJ=UWk^5k5Qo%tu8g0en7d@GYq@iw2KMR1nr@ubpahz#4Yk&mT)1Knv*fRbBV!Jz zOm@z^e86*z{cDr>gu0J{Y@o8xwDTNM#v;3!af2=}N%c9V<|Rq9)Vw(azB|xNw+g;x z-LSU~Iwlt!n$7rg@TW``PJHDO|WyQQX1!x#26@Zv~U!Id>5|Vi_2j4+r$D ze+p@umx+88VWn#p4`)28g5{+^0btqrO?n=aqul5kxSPaNG?_cXJ_zLIw0uY6sP!oB zE^hW)!EM4f7|%h|-jdY0SrtAi_@7Mpf2QdA6zg?ye;|p!(Rw1Wz$cN@n&&)Eccu8Z z#dTUX&3Qh#sd)PL;{Dz3p{CtU3fYB_|8fzK+9Y<2$t7JNzI?}dI0mGw8fmhmMKLmRMm zbI@ZarBL_}V;98ROI<_6RuQ5|#gaFPa}deKMmYQ{#r_-oIq?VW3-LN%5d1`WbuAXy zymr=emGabv`6d|0AP?5QjT2k^HqmDL9oi-%#uKRRz^BTK+}8NRu2^^@K}%a}izsdx zcdwEHfS!i{b6#hs_zLUeP3?#Fe6fuzNtN7A?2(U~9jm4Am&2_$#d_lF9~O#FXy59s zt}@Fi_09+7UFE*5qD6CYY2Xbq-@_Vpnuiiwp$c=yPHNMz{YpMFySe?HVAJh9IW4Ws zl0>LSTx4_9ReOI8>K-|`eQRBjt?VU?ZX1XP9dJ5Qc#})E@qPWR+gz@tZ*PTrmOT$) zk8@p?r{SGT#9kM+vbVVY%+hUsc2#xRFzUelYGk>$6^>I#)}wuP3qK4b4-8wR=~yj^f&Xv<7AU)_UU@_pYzQ`i6_7c*53wD#G6RwD3`(UPPq# zCpFM`^Tiho!ooE%M90nCIwpI5w7F1NZT_vQ#}sE#dm$~NfgF(xMf|-gl>R&Z)4TGa z0}&?a81y7{#d2Eb#4;4<(-LD(-I;%0wTFN4J45j9pEN&ch+GwJaC6d=k74MyG(I)_ zOp{pfJ;=0*L2qm_;YJD1rF@lrIkmdqX&u5vG4nEb>&`mY&@*_mPw^MS`@2{#!p(A^ zbU8nzc=w4k__WJW6!)g$L<13(^zYKAm5Z7seILZ~x<)PmME?Mmg}aYx*h^ILMYOA@ z&aCRBFU`aun2P9^_ zAL4JuxoxhX)9>yLw0es9iVsWynz~YQ(U8o~8hk>NRn?Nw7GZEg^ymTUQ$aWO4eh1X z?X=SE2QC01e-m6(zB{wf^;f#LRMoGhQ5Zln$>?jL(vOKXeI{A1B)F2^Y#*}_K40rw z&qZ`gZES4#n_O7*V)hawliW$Oc>AgkZ>?bXW5m~90*6t!yqY=MA-ir%6Vs-CwNpW1 z6ynQLkIRqD-?a1dX1Z9u4@u&i+2*ta!7dI5LO86WCdQ1<18dsX#6KO!eQN@xx+skK ztM8oGyMJMupt0YWWb*kUAy|F{(rr93q^uSYN9L>TZKIm&^@|12bmY9TU`&Sudg7lm z8Rwoe)-1H$cHc(Qw=Lw(B~ssX1vw(SxuCd`%gu!pUC9tqNaKOUVCjDjY&>(~$n}ej zg67&b;Demvy18|~v084vU7>zlpFv5kC`G4R+pS zTOm9Rst4y?4~li@XB+KgQ-FF`DSP4wwF?QNlL5;7r@m`=$C+H`l&o|wn-(ri9ix#DeN;{H-}-gv+#_uMi6R}DB4Hg&Uvc# z-U@vh%kA2l=5Xcm-EcXq=J|FshNcV}HO0)bCDzsZKMYSppGv3V%|zKn8PoDuFkUOB z);0JpG>K+isM7bYPeQeQX`3L+wYPIq%*0!3SDl0TRI;7)rA*O}EW%g9F2$*hf2 zRYkvRbtBB5G9do|WOGQk>|(`h{iQRie5|LP)Ks=tC~uy4xQ)JCj+q^3tr48BbK`#v zd|uOhL*cfujI6A~gPhl&c>6`y{0bjd@S?`?=Xg@3xIaqpAA-LWq|h#ecL3mkI{Vkw zeiQMXw~BlkBbeaH81I_>j+7MsBlC=BG(Hkv*{9>(-^3Ur(|lR>Xs-mUts4BK4DfJH zYu)vahi`vtjWx*wuG5e|D*1cimxXlS418jJQsDzhFi64a-~RxwUs723wrwL%llwUc zS@1_bmFH$SXj|Pk%InLU-aMOA@SVqpb-5mSOsRq~ob#H^zSEla0a4u;5!SMKGCL;zZvOILM(5hiBy|_<0n14QOu*b;;wm3kAZI5 z-tBL^t^39lj1$Fkek0IsEwu?mkt(5FD}^9u>t40vogRC=L(I|mxWUhUYl+wGH3_^l zBGj1qqC!YDH%zNo14@Byb7hxN8rG zcbcBBXi%S+6P$Y*>GXeum*U-aF$c}#<@ce*G&MUj)x1@1r^8OMTtpgC*Ldcjg3{x{ zqTgeQ7HEJhc>^GKt}nzM0oK|G;*hZs=e2g)B=Sk2#SWyO>O$wAL0l(7_l+xW3q|H7 z+>!$y=#X#Ub02;;waOj^&n6F^(`RM?+S=lm&1%b_TC%x;zrVE zc%tXRdazAuXJ|TLo@?1YCbP}rGVy<@=Rciro-+7%Z{rddM`7n@CydtS2Hu6@t6f}) zZQb1uDgns?wcxw7)n99uRvoj7@~;nlv*C`gZSL&aQ4?%p8*YCJ@22rIGg_qZSd@^D z?}`A@)Gk4B1Vx0O^31v5SC;t8!CoVmToP&*Fw1SbA!9i>{Oi!{{8eM9fd;su86^9X z6P=#CP&C+rOBRnPxo1;}fX3g#t~&wC=z4gG?ct4zG2zRc0b06_j?gAnSl_-Cfi=f# zx(27E>Q@omUU~7#d40GM{{W3^cuwE!cGCESaigFIFeS7p?8 zHZ&b6wZjM70ggid0Cm1r$I#Pm+IKfV9(tJ^)!Q#7PYbDyQ zMl-iH;@=d$72o&@5jTb}gBH(3$4|z)sI+t9NBBR+cODwmr z#jRRRQ76zI7KunZai8U0b!DvUB0no%x%119yNp(chh@|>Jw+t`%xR!z$s#~Fs;gtp zN>@IK_+9ZvPZw#5-XSnYaTAEbr^}JYI5pY$hGl6kHmL-s869iE^h>*$wYyuL7e;kJ zqs)`c95#NH=_}*gOTQFFZ?EcW17u+e=bz57<&BQ0IU}UfYz&aXWpz~wGn0z9;+s>a z!(l#*sibN64=R&Dh5(%%@g`9!fhXLuE{b9WnfeQoak5&EQQxnnVff!qyV9kJE)m2H2qm_h=j&ed_hV4k=8s)WLplEdL!6#2hB|@x zAIh+Nf8kj*=pHSvT;p_=`nYSp3U?1}n&^LdfooTc1a0zB96p zBL4s*gU0NFD!#p~F0+vacDFoNf$I_Ymq@XOGPa&cpt=eCc#TxpkTxdg*hF4DQ`SaZKR}e ziG*|S-Lt+4;;CsmptZQvZdy&vaOyz%X0SRI#JXmeaeH|*x7%J(xShQK&0W6L{{Z5j zmfqZ{eVD@Xdiqr@CtYhTE>?j^l4dA*>}uAFrrT+D-)p;I9#5O4NktzB_&R++JeNV# z7SAIUcH$(HSc1?3VMgTk{OfAxSaGEvu(kxBC?mFOl-DnZg|uc%o6$Al-~hO$gg;;L zHNC3OXUFd4+M~I_td^X`KiU}K8}6a&`Be`L!rGHP#;I;)o06RJYo+l20Ed%Y-Epk1 z+2)7lR3kXYPH6#;Err*Jr2-Am4{^6YN}E}-Ukd5L-AuCs+vYthV&hVck^J@0Gw8@e@w)&W7uI4sNc=w~TJ;$ACXGQ*LsNeIMc-myLh6 zv~3OtS?mfcTy5azIQhDEu44ZHPPMa_&aiJb;xn>Gje~u2irM%>;ak58X;+c!$ZbEi zHjqz0cmDv_Tt9;}8}A0)>S=CGZ5_m>Tb5IaL2sBN^e44; zz6JPNnjP<-;w!6#iFsT}f=9haqkKKpH2HLkUkFe3UkT}Qtfe;OParv$2ew+fUlw>? zeO=?3+sm_HPBEVKsL@s%s6H+DBF*&yaRb|G8&oD!AwdA2YPqcVE%dEk61jU-{vpT% z9<^e|6E~G-p(fQ*32fH?0E_OV(0m%u$pMg*P|uuaky%J(O)F2+tu%G>p_Q4X>PH#k zt?Hg1xV{p7n*~&U><-koTB1v!SlK{4xg>RS&T*0}uCnmtmUocB1;8(Gah<&@ID9~J zdcLD&@cY6)+dd=m%uwxzYmhSMf%?}qp?qA6;(QO}!0`(lvjC+-3fJ+^hHZW)_=-&n z#0& z{o2>id}S4to#pnRR5WqqDf;?WFZ?C8{s!)t7zd%P=L&SPgh0-44$^sR3P zSxw>(0qVB8J>Z7s*@Cyro9 z2gChWP4J_O7PFw_uA~ zt}EeohTb~VZmf4Ok*7BX;D4(T@s-`vJRU2cwD?`8X^~yQYa-mF;BJ5}H|GZ#t($Eg zKLq%0T{}ayHlpELW6pUaAJV3GPeV#h>ryR#C^bu{?7S=&%CI}3e!EHI<~8QtC-GPO zB_1hX316kBnL8OIl?Tj99Go2c)erbw8h^vPSu~riK^Ff2QT^E%#xc+Jtj`bWRyUVY zYr1v9-D)=E!T=aN@PCzDAmkI8iPUQ!0`BxZR_;#^T+VIdfnG5yq(f zFR~yGHi9}o{)8a+ZM3k#8)4*Y#HRTvrj zOPz?;^q&xFwwL}Gwz-~LeVTlqDR`Y!;FE#Zp0&;R-p1nFR@Jo00>%VW<*wZB z$oxfmrL?{p{h9t5!(*)8A=It`Wfi2e%YWRsQ+iE=hR-dRWVtbdFD02j0?4-CO?qFQ~X z;xGrABm-}@D}mCRRq^hpaJozl6WkyHv!3(}v+%|%pC0(W_eii8Q0ekKjlTqAZzBzi zS3~2!4_#@#1%C?IUh1BEZ}TSJcZGA<vz@laD97k%0|Vg)gJAe^;rQaSlIrSA4>n7t-sI!4s{a5JJ|)Me-=>Tth3{lL z_XY)kt*;z-^4CGOjyrgK=@CdcY*&$ZH^4?u9b9X^E&cqAhszkoGT9%c07c_Zi*RTc zuxNL-lKrmW`DWn8aqFGc&3s>meFyCC;jgpat;7OG1NW>6&PD}ne0|g+xxa#U9$abn zM_w_C^REZXd7}7`-WJ89f!nF7j{2F@_;faWF{<6hx_Q2}*c_eX$|D^+RNf)8vDB|+ zo-oYgDYP8m{VQ_oQo7deV0|qKQcg~5j_|&XcP_bnqHVGnT%VV=O=)y<*__qa!wIJG z0^BqH=Wsg#=M~iIa#?8_RB`F?$YfE@MnE;uXokkaRf#o1B$szRtD5nI?QplNqz!?l z#%NYyW?b-X-lt{aGjn_`Jf{F~a zbiO6l$)3V^yrqid=W8!hgI@UhW{u&?3;U}JYpJfJAjW_eiGKhoJOie#k)k5qA-uE; z{Q_vWu@UOCaVZF%7H7k1z}`%{j?lI3P@ znc+D+J7;x!cKeV{Sb}>2n#R{WSpF^5^v2U=NbFih&Q1Z~R?o(d99d|77?wLZ0Sv9c zIL<|RmxZ;9S^OoW-CV=v+iA|yOBQpy5IE0jqEB42xr)x~%F|WDo-zjpsd)bYR9~?h zHOHExB#znUn|Sh-WqdsjBHM|gyzgm`{)lZ@9{ulR3MlS6Ao)bQ=dPb~icjdGf0gckanSn9EF zy8|TWt#s4a<(}oA30ci`t}XkLBSKgy=-hU$vgcJkB8qivDkMd5(>Ml?3utog-1g_l zwL4dy)fdE#a?3)IV$q=7T>)%2LVDIUO=+Aji0zH#y{)#Jxw`HP$sb%*-ve4Mhj}1% zG650D#&K4($)WK5thcDYyqgCZ$4a~4gd!`Oi=@GrHaYdF2f58_nv-hUxJyJQb6^0x z)LO-h#?gmjueUfoe=5;tI(E8lZ8N^rx4-%PYL|(x|!c&y!30PmAnjX89wwbUgRlTe^&vwx{e`r~2gNRtJZ#e$lGkHQIjS-I_7Y29el` zeJym|D`;WNtaoSB`q5OpPkePW7J4LkSlf1U>+MBaA?|)5-7{F~Yvla6J-Dx5_)+mL zTUjmbq?S%b+-A5fu9OiOD3cP66YZ^--+AE#QM-8$r*@Up#)zUlCxv(k;VJ8BZ{--22zH-N-K` zSuI#1itr^F&Dus2aigqF`?=D}`_3GrCfsAaP`kTn!x+EWzz+ye6JxxCVXd_cD(nJp2o|P7-;VXOXN#qvlgmn1;uR-w6 znHPj~p)JfLI}DP3mB(scERy?Pxr*K_$APm8)0*<#WSyElIHfI^z7o@-u)S|N@Tv&L zYKMwuU-(H;v}6*qGJ-&*)--#aH%FH0c}hs^Hs_ADx$sv&Q>V{)t$^~z8Pj*QMQPqQ zM%3Y{%IY_N*!K-A$^^uH(mAesPVmgWCyrU?0|Xol``2f8WpCnd5M4FQCPt00q;ZOm z!`9%`bsJIw{HlMEtMXjWVGw0egp)PV=uH;8c`&^UE;w?snGRBhs{)AcE#6Gc$IF zAZOmJ_=8+s8KSvV7ZJMTDP7p-(z!;F?=_WSDj2dbG3{N1Ru;2q>Q$Ab$8(yFMvbRg zO=x4^YPTBg#B$vfTXNh)t;qiXfYomm_VQqzubcNWEI=-R~6f5+ny_||5L ztlrLrEv+R8x!lEa2=CUq8y^hKtXp}JBPZcYn7b2AdzAgl7Bv;Vs=|G;gOGWv)?OHE zCI0|Pm?0nDsAI6UI+$CD<9)}m>rOLBP4b!+^GhUIjC{49s9POE?i5AOCpD*{Pb4x- zlDKG89itTnfiq34b_PT8?8s$(}VL?#=8V*C9IZYDRKj2 zikn&Sq*^`PmfF_Fa>Oo14MBShPo=|jWmuzfNoG7K&sy4?9j-*BZ47S`YEY^et}sa* zaa`V*Tf>*1YP9+D*mLh)Hmjo9Yqsa?uCp*0-mSo{Mn+u*;G=2~yAzKusjUo!@t2DX zwzAwwYZJ{O-O2)USY8CC${HY$yANb1%?WHQ?`yQt3M6t!lG_B8H$)vb)(M4gXi@Xw93A0OZ17L{US ziOi90#~riQpx69AXQt{R?@5u0bI3TY zza3b~p;||6p~EEi88|9;cCJ5H{?RteCH|c~rSgClR$Ou4fmtofs+(FJ)Y`?JtDQE* zvS2&U9=z1T2yO15cwgs{NjR4BKv&GRE9j9bQrDeC+#T3p9y9vkfKBONo|x_w(xf^=)0G$YB>D-I2C`u2@&b!d}m$I85{EymCaZ@c3s+Eq;)+ukGGAuU8{Q3%uP0%OTugqGEc8;U_#2TTd z-@Vs|lIj=9^NO}T1!6(t8~bk;{{W!FES8}16mj{}rF#mbl=M0V_%owvo*-MR$i#tL zB|-)j=vN*t@akzXSXyaT`BmGz+9>^TT+~|YzLd{%6M4mf861I8c$-*RJS;!6qX~S< zL2miarA2zYsJc|qzo>Y!%fi|N!KT>SGTb)u!XcI873UxDs&p?Bc(40YUXtP_QWynX zioas>3p6^pG82M9t>NVBR+x$-6Ap&6g>4FyRrERO?n~-&*?4B&R=0_cC1l%xD#iZ* zj%=sWZ7k%Fi%KCH_PeFHnK{{V##s@iXO<5?A7 zE>0SPpX&jn3f)&I|$R3C5Qt8&J7$jqr z;AfiiD${a$9n|GyV0llEFLwA^6KI|u#urM@!RG#zpr?%8~s|u>9I=`7XgpW z9^CY)?U8NuFDCEG9%dARqc}Bt#WoR5;fs_T4b`>-FtiGJ}gc6w@~E;jq#p ziJEjF)O?`i3OcDw3sxyq@xJ$+k(N823U4>Ax1!MB@$*W!<@dk+cJ(M~` zi{`l7G(tjKJn`*Ww_?+|yW($&`d^3i0StEp$UO&o<$N`xzm9MJ0JQF&^DMpF3?V#yc&*EC5nNlv zD_gGU2rGcSeQI4qhM-_;z6p}+P=T!9(aJq?&w-<)8)hQV$=Md&RDy9+9M4-f9;LA+wJSlaFfh?})z;9=}SZuIL)&m4YU=me%Vv z(D|X0o=Nl-)_4<1T{B9xNZ4ujH(%@3&)&yQJ5u<+#ad1Fx|)8eJTfdR<^mfSW$1XS zl~q?{M5Lp+&v=(ue}x4XRFUVkzEHcE?>NPH-lyT6W8d# z(l4pwpR`YjZG08*!%Fa1!{=jf6wk6`8&S^8VVHKWL+~Y*k7MxDLeTsX6Gy1rT17ql z;x8?H!~vWMJA!{Y!qt8aT3&d2O|XInxVH0{$lJ>kkkef8i;QPFUZ`wsb%2 z=buXFz9jfBc+;$OSkKs_on6rn-pR{k^{u&O(zJH6O=ftYiXM)<1I5#vha27&Z^OvBMMZP$;RPP{3+EfWfIMN(c8@_3x9pf$tlnggs-MUm+%b_xyS5wenlGjHTSNei) zM7LKPS9eZm(7bym#GesOE{rCEJ8TflzF%KT;q~v2eiE^^vC^mU7L#gWg;r4{!#MBO zn;-3g@SnjjTw2BAzYfIc2On$zy=zMkDM-#(h{Xr(3$I-GDN^f8XBTtKw&hgv+s+C9 z0PEJipQ#TC{40z5X-t=E6G-P9i{#`C_v>Fd{AvFHf`IrZQuvE)aI@KJmR8XaJgJK= z;fx+Dm-wmw00kU}###-nzr)B>%D*Xz7kPhfYo=IvM2O;}Bk3QEekQc|mEbEqGf#}g zBPe6?ZSPTPUK7zQ{5Y~ja~j=ByE@?Xua>+U`%Y_m{6=k3;8@KW^42*b0N{%3W3lls zj zJUMw5vwRw2uOfpc?xTw0JXP@X#+oIx*Zvx^ynR{|^4tUj9R1^hanii|RPc_!@l#cb z%f`C$S!yg*9wz}Am$1OC6$fjXI=4C<2jdQptz3igH&oSa;fMV|vkxM$@3;d}Mf*o- zI#-G&yzshe_XEi=sgl))85lhMD&K;?XWtL$H&SW7D2N3@16)ZV3f1abi3k4+bFnU)P;Xe>JhBctRDoY7tpXWYS zBqJWYaa;$7z8mQ&%yryANUK$mzs}+R%mWyLV`AdUvh@X02#JdtkN$b$oSBkX{ z5#7xM-Wbp|XrqHWSs37F{sqlyk-Tc8eXXnfLDJg%TWK>%HPr9>-P4P8G2}J6vyth|dPF`v)-Ls1Tc3-1 zeb${cgn854e2E|f8NfL7u6GvMvZ#+%_<7-5ui8^zlGnlTEv>WZ{Yg&c6+eVaB`CG8VoKg687#AGBcq0CRpT2Sd7V4roF3WD`qqC&;+pfO#KE*YTf>ESplfvDTsx zK<&YE_rDs=9wO7?SXTZZXICCxN$1mwm!Q<{a(@&2DF=%5JB!Uwi)DZY+J0W+wRs1O z^=o^(cx^Okfbz&v0mgZ+r@U|Qw*LU)w}w$HG<&_5NH@rw0yEdGc)!H2*{UCg{w%i! z!r`O)I?VEJB~;|(9(}4?zKCt1z7_G2)9p0Xw^YuGh_~(qPq`2f`wS8l#`14J?Nulusw$};) z0B{X>w}~xu%WZyE(AGGjnYTU;Mty%OaZczQqhrT>QF(c9@a`vuDdd((Ss9!jnDwu4 z_&cNj0Kz@s9Sc$MF;y*MvPP(P92Krd zO3@J6`LF@{SJ0miJ_y)&S{Jvw*LBOMVm?`>cV0fGvA{!$CS=x!4>1h^E15pMOjn%hUR zg}^0vL0F##ehlAu>Nb;GySlW7+y-bGQoe3`ZSP*>-wQOoH%XHI`rSm$KJ_ld{Ja{M zO^Vx9@e*9wBEqp8g1isQy-W8`c>~2_?9SaV1q_X71|pM zj)R(gkB7#M;R%F)yPhCE@#d^scp2<0)%7(pOCkvYK7?ob)N=^q^=Tzn-E1=^q4MMW z{VP9M(qBOGrcAWB3|Bt&y{Q(1R1-uttPPaN=~%xIwK+b(C$&GmD~$F1D$=;OD%@Bn zh%cnou1+vBgHuOu1;2(bB#{D%+&DXVIWmAz~8pICs$Z~}}Dwbb|%;_ji~ z2Vb#CCd1AZy({G^;dx{gVRd8lzecqXNOwNwD_dS3xc{86UF zFXr;+Dn9ddW8nlven&)&)B5b^nNF!cI&TC`C8oJAK8tbwyQ0BgW6PI$kqtL@+n|2}b zp>1PcwzpDN4Zxgw3hPr#OBv*CEsxn+6(5c{tbwPa_>|n3+G}DM4ZX9{tZSE#q-f?V zJd_!3J?qD>NyS+Au=RP&i(9*WGgX;D1*B}$mNyaTx~nzn29D@?U>?UgsQe?QF0rWj zvvGspy>yzsmuG6yO{g-2i86z}>cS8@Co>CDczimSQ)$3{^Ct(2@!yCZC3_nyn~1Pq z=D^QKB@g>A$sxXsxC{C}ZizZ>4qmJdw>_(l@xR60AHmn+($3IcO`W6_BxmraXnuXojlgM_ zI|e${-wpUNbh~HNE+vJg>H%DyYZ)uEXv)gQXz_KlQIjVJb51%C>s_DK%tF zoy_R0a~y)umLMPHR{kFSni(2>YvlVj3j5ZdgLE^eO*_wt6}J(OrE~hMt215(iON6+ z0R8OOG`=IIpTbe`E~BA%r&yL(lWB?1Om;PvNfe2g*I+Px>hUI~)c#x%FRidE`dX9GOfZ9R-CYRtE{hey{KTu*TsC;eKF zlCr#ErVUE%TH+Ysh@bV5{p#;^=;qQR2zJb*a>^^4*6cjHLvdp?Z7*G&=?{^dMfQ{; ziJCYgnkatjzusZ$ed`8G{XfK$8*Nw2wF+=dL!5p!*|wP_%89NN#L^ASTcN62fr1Mq znhSPpw!%g`P#lLX{hQ&h4_`)?8iu2BYTxS>)lNSlRc!wN;T(A99uc%Jl27kbZboaU z)MK}M3|Xj-XXh+4P~Bc#&1|t4a~3dgy=vCRE}y+~iq$++nk2Sye_`3l7$i#Labefe zulRe!@Xf2n)|SErVg>?{-`=H=-uQOr;^y9HmfW2AOu1}&W}RtysCb&?UO8fcSNqG? z@~q@<2=blQso~kuXs+!MCOPQe{c6M3{3iyhtR%PBHzRP|(SSCo^c4jDCe^$*Iz8RQ za=<$%Ki0MG_4l7l7g|;tSHqvjt!B41o4Ms57PH|G5F_ZYd66#Dmjr(*vEd(x5o%V= zF0>-GF|Z0^Y?JxdsaRNPzZLvE_Fg9o6~PRJ*bIADjr>yh6>IR;VR7LLnE3^qbA~yp zGd(Ke{@26?6x7PvHbGe9KP!E6P;1^1wTkLFEG{LL6dyH78)7)sc4Yblq|pb(={HRwV90jLDx*%AzynG^ZY8 zqE8gH-lr0@NU0=yvCp+-_=i)vUl0|xMKR=HbLmxeEkx?B)7r|mAOgsej&ay=SnIFe z!D%Jz>ST@(SdsiddQ?^O)m(MM z8t42yucp0fBe_P0%o*psTZ7^Cwe-=gqZMfm4=3gN()L`jGF3UGbedM7cYUKgcS{g< z8Tnf#yz|D|z2=AJ!)}|rz(#rRUW24~HV+9;=1nMR6c8Jnb5!+)w7OXgu^Wf&vmDh? zc4g1rN0h^*U3got?+-0{{XaM^QLTUUDcE0NpJi?ZT2f03F3@#mc~Cy zEycZ^pV?rBK`SUybHFv}dqrc7LsPOkoVuGVurb8^=CtfI+uc6xB+?W#*I0%}JyjUs zpU9ev!5V5yp;g2G`trezGP$4rb@4R)rQXH`FRtMKnnx6?H{ z-73}ERnx-!?bWlN!?k)BhL|nK$T=CWI?*g;({JOp)BgZ*7L<2iPX7RQRXs7^vFl#J z;k#I4vq@tc)?gV}bRgHA8C~nT{=Xg0mn{u_Hs9^BjCHNe8I7qcCp^}7hv7E&>aECQ z*V4BE0`wq5$ot)^c@q-+w~M7gwlWTVYF#4nOlDp)*16qHK-caCZnp& z;z$MUoHuNdZrpIV9+l``75L?)YnyHENVA$w4%3W&b<^l6Hl1N~U{pj3 z!fSsRc$Zfi#f8S$kxX+h3JE7Q%{bYc#oYF2wKaQHmrlKFrA#iyU_l>+EV{HXhnnn| zVIrI;|ZStXdBGBd?^U&Vjh;O~W?z486zrYR@#qs9--f`6ra3!?tt z9}u+LGM*oiq!ROxdUmQ_D)`Ou1LBsS6~BwY)T541HDZVysmES^wb}Jp*yDJaUdPxL zpSC}Qd}|wNdPKq2;C~Up80NYU1o*c>eIEBxFj_RKj*7*(Tm#6jfqXCEUl5DC%geh9 zn`LRuRO;yd(@%nZd?w>cd;*DUbSHHCL$&@Vr1&kgu1LMKw2 z?H6i3P3NcOUnx)fWB95+iIX7* zB@!j9QZq!yZZVQG-!-|e{{X>5F0?IDY5X#f$k$3##$;dPAvY_UNZ3D*>83BhyxZz zX%2FJm8}o$tD84h_CESddn%eLx5G-)sGtf z%y*hTs)?t%Ned7IB9I?Fs~Qj4w_1l#c;_h`6LJe7;}l91WM@BX6Mw~jwU3GPc_KC! zzqt{HDkMIFxs&@#>-xf8-bHjo(|pJ0J$hF?7r|L=_0|&GO(Q!L^EoOx>x%1i-`Rj% zT(6NVZ#2i}3a67!DvB~{v()nR)%8Cfc!o)}JznlP3vD}CbkDtYGkiAFtv=3Syqfyr z=#ejg}ywR`iklbzgJg3OX`qkYt{t4sbO-A7Tn^3p53)P+n zA^x24PIIQC?(P)n)pGZ?EBqtI8NHe))usOOjz1dr?+O0MJ{Ry+@>`kUd#3}- zEa}4$USFgB!Z-E-t#yemCX@o@;b%Zd{A*X?ckEZD_=CqDPl;DljcptkFL3_=ILB^l zf^|8L_*1d%QTRW>o&mLce-J?o^T^x7C=Ju;QR`o{7l%A6c`9g7$YVs|Q3?K4=sp$w zoV+FAt0?EOf^Cql!jd-TbLulp&^{k&8ZU_FlGZepf`ZBvXBqddNh`CiIwR#T+AsE- z)I3S0vUm}-OLvID~vD0Ai!rp81 zTr~0w$Q^hePg=d=O;^IYeTSc-`NDRLC?zq@E2@^x-{MDx3a!<;e`kEQgpMW+)Qo*A zo%qqB-26V#^!+=@4TYN)~U0+kbXxh^|9~*nubARy)ABGyfnr##98f*39&iDH95k9~*^qF{)a0Lf?&p0c!rl?N zvAonRpt!V!r1Kv;WX~W9!|->EyfNY}3gxu{$8OcH4~hfcO{8i+z6zVt z>3BoWPg>@@Q>#s3y52OBHHhJ4bCEdpTAysqJ(BEmem3}7rfL2iGHDFr;Xx;X>02KK zbbDVI_+D)~Vpi~N0OOj9)5S1r${|}Th{*X%u^U+XRgEi3ZwvU6)?F@m;d_#IWFM0r zxTD&z_C-$+cyCAecdNx?uX)hVD}b(v&T9kX2Zk@L?%*Z?w&aRLOl5%TMRJ}s)Fk+G;u|;73IZPbK(i;bhk}iEMmb z6k0i&PmyiU1RgSXcdn1(FYKSH_y{f6fbZ_^)^m(L4mi*7)~|^E4JVImX1dYlT{8Kf z&&0rzz;njmrF5SFek|N-mhx$hZ#;JzYKD=eA%lW($K_9$M~?ph!dK%ThgJ_CiK1JG zTx{~CEEJQ#HO<3m;ypK5gI&6WSXr4vmbN670QIk-em-eee-s)xZS7fhvV-#VAob#= z_wcOB~Xw<&;L$v3dRi|`I+&&z5;#g0C zJVO-PoC$Fpjg$lu7d(!X-yeJ=O-_9v#Tv6)M8j$>44jTdWnXy9REQlu{{S1J= zKBM9(L6dgSr#Zo+nTIMke+B$y*01%clUXMLvDDX3;ja~4Ynt;U>_lMlbK0@>NNwQN z6>V+bdl9+DFHu36FSRXa5?nzk3Zlk?& zKLY*}YQ8i0?`f=ST2;NPM$aU$rc8014g(&&E7&cb>P;A1*~*60{q+NqE28iYrZlZO zOM7-j90A85dR1a^E>W>GaOph{s{R@4mYyW=#4V*i`h@aGJ&N#aU7-(eBFWc^`Pbmz z#n?38iN{NYWR5+E#Y+xLbv5tSn!0N`v5M5>o-vy9p*ES`>7+xMum3Ixl%?PgWOdeQ&@PfG?8v_CL}k%TJ4Qi&RUAhrQ@#= zO|N*y4I@tC6pR+z-@a3hJlebTH5`Gou_L_uVANanIY9tq)+)5j^GDa)8(jjeI zT4QaP<6Lmv>v((nkS~VA+Xh?rW7ip|_4k#ac%j6R$S}%#16LnReQQ&1C4@2Ck{Gw~ zVzVT^mR}IwE|n9N^1}M=IPF&`a;u4)XN@iNzX&zFnpr01W!%Ze0nR&Al4){(Z>8xZ zG^!V8W$&8S)jl5DY8r%h8iJT-{`2$|ZfzU;PUbmu;t`bLiReeQK_&-|E`G{lwzC+x zy{mo>@bJ)KX*GPi$&xpF)LQnR=ln&|nXsbVFk*Til-EUPomW(m?$r579?|t3={33-q@8*M|OVayjh}KX^bOycj3bBA+W&*(zEV7G`F4}Ep?th!nU-l0~WJy z4d?v5HsAW^-0&#k`kM86=P)Sc~`q!EG!@}zC zAt>0-75!UUnrQs`gq8O^JH$JH+N+l9RN}TWT7LKMcCP;bT=0S$g3PC-XD@=*bv;Hs z>*uj_64@Q?CXRcX1+`q$v!h{IK~L=WKka!Jnzn)5A3$MfEP_ADV!;@g2niScDM zOX%${uI>KOBWwd87W4wXZ!p74mhnfqgpyiZ^?fo+O)}h=N(c7uTvx$aLIso|&&Bk;ikf$sTJbhUeF}8*7$u z4?i|DTh{Vi_5eIcjR%PbNDzj46Fde$qd zF_enF4wBZ8K*ugeb_iR{>Ml3d@CCK$pwC zu|jkA$jPpYPrHHj6LE8U72VqqT1aIECO*I%RGQjdYeXzBY^jWW(VD_W@gmVK%v0|} z@;6oNDu;|baV@m6Ev$?pk2wRU6+F6Q_-{zLmRSS4CIAOGuQk29*0s228h)F5a;(_h z90jmH3XzP{z9s5DDe)nLPL^$vFv-p_UW4K9AAe)dvsBe?5sCY}kZYXyVc-aKdpVy_ zUn1({GL?|wmp;a~qVR`?ttH2Zh0Vm@-iqLWKPm#}VXOGFO24oVsH)x}$KQ;%YPI1F ze$rpD$E2W&-cAt$6##uJ63*LBvV?zQK{LnMT$eSu;XkupYOoYdlBxdyRyZs56%)}7 zYI-+`SZJOYS#5Bv>z+FFt`|v~SJN-9ulZ63Q=HcC#NAonNrniRC?F51tlb+$lH*NC zE*ppY>(JK>o#b{?*z@>o^bZtk<_TemB-+kTlzNYP>a=K6!*&T3kt~vux%3sYap0X7 zL$Yh9jpDcsvnBDt>&0fZ{+DF3$t~r$j@)kTV3gP@$ zY?eBok)^)rGsqlQbzwZ3{g{_Qy|*x)p;#Kj@h5|Pq%+$wdz|{`^r<&d(BUD}?;+Ki z9}!00KqW!@z>INQ5_l?YQ^H9;jDW@Fu{`6yJXVH>5B9a{Tk7_%&Y*%-F_J5;OCRjt z2#ECdRZ$}rM&*E@e5a7hqNAO%rrA^4qPWtv6--+v$^P)JyTmhF$s}gpG8+di*w!wq zCDo(_;du6r*vYF;L2{#z)pQA7H*G-+9;9`tET*;ck{c*?$PYL|DoK7IU0L3NKAClM z5+9kPfRT#V(!67%TrZli6quZBW5_>BmW1qv>mCa_{)i%h2bzBht>KRbUg*}14AGa` zHsd+Pb=F=cw?!@jqpu|!ujN~MHm?e}dE*QvT=eOh&do9#zQ>bZ=rh>f$ndj5-Ea;m z-X5`n{pPmuj7d3^<})Jiz{Pc+6SS{7>+L#ra4<@adRIFo@Vki^1&(M&&<_Q_4)nxa z@UMhCCE;HRoBNwvF))zhF!SEI9}#$t-^5zzO#;F>BbD-Sm>8#gLTkHy4&DoP1sZIy z#&9uOp9#D}qUqW_2)w<;lPvwZ%TSsOuguhTp@-%eGemhTNQDx5KOMV~cj!)V$CFBK?G_8)31qanqX6 z@K&bt>hhH(l2r>IJq~L&$4}HXJGo;KN|=3zC`Rvk?))q8m9(30I%mMP`N1Z-DkN~y z=6j;nvElc>iB0r|IF)eCp8cznUkuBqYMZU6c_JituA{{F?JcL-rDKW6akqj;UMje_ zwX?HTF-q-@xy^D#*`AVDMy8LT$9n)Q7k8LNO1*Z2k&(w0-|5;y+(IOXWjgL1KRV3uXMhZGHlv^-{iF?!jq^sxe(?+a z??YHl51XDl{(skUQ`W~tXKcUNiFFB9`F92fHLE1)4~M?d{{SsB_}7{EPsPokPX&yD z#*Zs)^5o`QJpJaCk1Dz3XR#IBHQMSMA+m8Lvy6sQkbfGu%}re!#F-hd<=()MIjJt- z4xAigty-|!woJ^pz^X?#jN=~+F^(+gpP83diLn%MC?!fi4qgO@;m3dqr7WxJ9o zdI7i^xfH@kB}<|J2LmS=tR}THzNbOq{{Y`A&%6LbK^c^yB(x#W$ZBXZW}IJ7B{ug`ICS$OPl zE2c|0^gjpPLo^YIu9I&3a&hlmwaxlTphED(+t7dpKU%wa<2TfFh@hCEb`ohQQDKCxz|`Ux%`UY`E<+|5X_qDljlwy=^vEe@o{tHW? zX;9txg2oiJKkH=#F>&ZX>t9R!Irw+spB4CZMVi|!q9Ev)=eHG#`hJ~hq#Y{V&}s1U zWG|fOkG)xzP+a^hxl4-&d34*JQ3uReH$o43=btx0`$+aXYj1_RMUJM8eQRxTZ3~8l zU2++RY<8{W(sUb}dCk9vG@GfAfwEZC0rV!gc)lii4()%y3BSt6&lvvk9+kUeackmB zI8F5aTyu@fvQ34D)}20WZpf32x*Qjdz8Yxye~bLvEhf-R2JvW-e(0R~^sCxOg{(Cl ze@^mr9Wu`HQ<B`)TWQ5|)n*cK7$@T^7@%7sncI&`O6YZ1w(k1A2A#OZ!=-fh0*nsU&AR ztD-g*Gf5t&Z)I&9Qh?IBfCvD3SC@Q5@#psDnH&}{vd;ihhF(VBYQykH#ocb^{cUxX zS+s>aWf8@PWbPHcYgId({JoD%qx1jpgP|z+l?RGow0$#%qjR^8x!yjLmdevQH#o|plBk@EeT!tc73$Z}< z^r|H2Z?$R0p9Qop=0hrjGj1O#te+HkhTeNfbS*`JvecMci3rXa_&?6EuWYWYqqdt( zm^Phqp~mC5f!pS+t#40le&G2sjhb4Ew8L`lyx<=Ej+Ien*3i<|JSnDlVkk6CKT?+9yF+Lwf_qg^w}11g(GUr(iQdX<;bm`$ z6E(VU?S?1Z*G=KQV%G1$);eaPYc|cqG`Jy09<|I(YMMR$=9zY~-dWvm5xhjOLHr<* zL}{Ru&ouGR$1Nw~hOc#F1Q4yuD2Y@rB;x|Ph<+{E{5jMutvp#`y9o;#tVT?XNapLu{%3kfGxo}-oO5=*L`cG>0Tqf zlHX8xUfEy`8zX_`pL6u8`p1H;wA&FP$2_TQyJ4AFnAjdOp8abMR9`zh(*DTJ<4^3p z1SnYTmVB?vmpS9~t<672hQ*_k#V7Z&bp&oJ`Bufh!dr_AOMPMoKWjGtvN6jT!3U?O zTFBS+xFhjh%j>MM+p*x2v`6*yqm>6cH*aq(^qo2)(5tMHs)M&Y8e!7(%biwBo6AU? z!-tP_dBMkOspCyXKLY$V{@T@UEt`xyyI*NLM ze@ghDr}*Mq?H@{oEp@#%UnLYqRL&Iq&AXxEtZEvq%+?cGM}2b!qYP!Fwp{EB*zW1g zbN0R)m&DqH8ux<)dS0}V7xOMgAu31C8BPIWI(yac27FG_{8z6&ldJ@bRe#);`@7FU zf$3XQe(5iBF3-gG9x)*_ZCdsTG{4-2cZ-2+F zUGYx2r+g&v&bJn+XC=+;#LCea2S5f6;5ya4cJ2=!$sOLGh$C1RpSm-F#Y~MNdCO_- zrQY4g_o8ONCYf=M2*fX?!47fjT|}B(D`9i?hEmJXv)A#jI{1^WAM9@?*!k=v#?<+U zsf2l@W;&DQLp~_Or`*`-_x2K}n|96SAmca{#Ohk3O%K`aj>pI#4mhfs-HrP}9QQ8E z92qgAe;3o%s%m#_aPeJQef2=BxaX%lS5L7<3cbwzZ^V=7cP$eF(jEsq=ArN`moe+@ zaj(eB3vvTCMk<}v@AihUuXt5kaO=ivGgsCwHNA2x8x~X`bOQv8)VfI(8m*qWp=y^J zq$Fqz#y2HX%UaH{E2~`{MOyqi6FO^aEQq${vp!5 z%_Qw}(xlq6W>&AQ-}qJGzJfLytg;020r`UGj%%>fzA$*3;oP>G#;dB`u#grp`JnXn zta}Svj}_egres%wA)TQ)7_6@n>BC&rB8ovYs+kKClau&Wsz`Ne=zRyT{@eOjjXXUX zqWKq*D!WJ`A&3K>YL~;mj&Jb~#M(kw&*nu8oaM2{HRIZjg=(4u3yV95OD~oI1zV+J z_&>qA=Y(T7z7?O#E0;xay1Hr7R@CL@zNgw+``hc^5p?-2t!?CyEmaE)5Whs!4u!5xd9RU1m>2HMJ5TNnKjWzwv%s;)<5-b?1{_1N%VyRPkTK8{sd7qn{ixD8OdDhrpVP_}fvr zxz!Y`T5~iIu^0}cfJd)NkH=mOw(-<3Lw6i#S@xE0Ff-Pt+Fx-qgZL5g16}xqq&e~I zb1bvCXv>|)ZaL}iUa{i~h&(mnnJ%>aD1~<%40f+5@$bb{_$8@W+G!eWm!dQ)m?1I_ zxb0oXh&6-bp99PwQy-rfDn<(AQ@JM_;GY!Sd`f%EyCTf?(qJ6m^~HL1o}VmsD7g9E zaCxsj_%-1r_!Imu%M?a1xZ%0$TVE12>%BJaC?PqLd@Hhy?Bl< zE#|iRvn!T|Fp-bF-#GkhXo1N1r&?bEYCBIWa&`g-<6eQF-W_MdcJfM~$K|VYT(89c z00Mt#Swc#@vO>j%(~@|tsP)LSPlj=l$r*)Xjq-lsCm244t?olB!=fJ>Yx6=tb%{nZ zMQD6HyGOWrU)K_& zbbe(AW5{(s3W86VIX=}y_)P?7iuGHc4=u!7u)T3r&xM!EJS}BfhXyGN?Uz*Ts6yi7l+z00Y*GPaNOq@tBrLRZpXlUm=LY z%AAguE2HbrivIw$q*`n<+UVdMHa`7$Y~LHTtB)91YT9MP0|mg7%g?5J*OpDG$$KG| z;zwe~Jh3!Ks}1Op7fEx}@U*?6<+C}|`6YAjzlNXiQj2?QTYGOCX;I58BVduP5Awx( zhM(gLKZ?E^gI3b+Jjm{xAcPJRBRS1}Qs}z0yJwE+qm_$fZ8sEnuK6O3YOcS zzA@6ZZDfbVnmwP0d^<3iB#cY5JoCp&xqqg&h~SQWivy?2^9{MheC1^Dua%wfN_w29 z!oLK;q-wKja9b^fmOj=^!ref$_MWxL5@eQX5?!WXXw8S?ffsGLmY7|4xpWYbR_1YlS;UP zZOBgAv*W#5>dwt%c@^bxl2GJ+6%U5B3!O&GHwsA2VJRENB+_Y%t=pKTkjJ!Vf%mE# zon5{fXj05v#Rwd?u4+#g>ehZ3(Sz!KZrg%WF^rYtJl6~1PX%j!HP;$X1K(RsWXww? z+>F2vr!^_uQdVXE00rxid`i5yzSCs$W4Fsl*ytCnbe39PpELcTfOy-GYevi9o|I;a zJ$`nI@rV+AiMGf800PE1^{zw4Qr!3_#GhfYQ!Rlf_k)qapp&k#vD8@HO>Xp)H zb}-vtCZLOnX8DNpJv!H)Y0^HMI$UW|d9k0oyNUfPx6^!9j~%<*p-|(Ij+K>VbX*;o zudYoVthWAQjwez2irBx8`#)2Evqzs(o|P7vZ62*>1eWWc-;Unmv^-}ywbZ0ba0mB^ z73axWo$z-@JK}!|KZMz8&rCeUDT!Sn9e$*Tf)8%gTt14bfp45y)jGTZ7OTKOzA9E zUt!X$+W5IO8(df`82g-5T7~k#Zd%#%C#Go~2RCoyC-AWYQWq0Y5M&ZhtED z3lE7uXRr`zV8{pqfu7YI)?`XIJeEs2ZR4L$TgQf3a)5>DUVY=QhI*Z)z+Vnt$t}x| zGdpl|n)h!Ku9L3al}M#Yr9Ufe0|)C_8a9~?hO_1X%opU#bIolEwmGLsv&HQ$JW=qE zPyXET^`XCxegeCc>B;81?}c9&Bk_#ME5NX&z}^rxb`MJIz9ZksbEijXdmIx(5hoi% zV~=|CjS?$g32Od*!ieLLlAtI6165M5Ijyjt~w$*f@nLuk*vWLf6=W}^QL=i!1$ zt;cf_-c;@bZ(5hdKM$RCU+oPpKp<8m;f-lQt$%3geol_zuMu!Ee>w+q&i*i8+gSLb z*>9{8U6G*4Z+h+i9cqxzWh3bjECl23ny+W!d#@8|vdyZ+8%U1JoM)wD>$)}Hhb&`j zd7^`Me~6FeQlo80&3%t=@Z5{2X^$F9zA`>>j{WMUkKoH;s{2yM`D3T&N%2A8@YjTm$R2AvfU*IeewE81inANv5=Dyh7zSmIpVqtj{@DT#ueLd9jPC}-(}PP0JU^R5xf{(fbA`lj)J;h z4r&ukr>MF6=RIi_X4&{+OBBxHexkaM4c?{HqCG5p!-GktX!2dkOoU_WU2ns02F2m) zvn-`px8vThs~&3+DOk|b{3&u^S+29wHN^a5)O8CzMhjgrNrZ)C&N{|?&3%lIhf_{GB8z#{irI?z`94bZJoTsC#+ETf1WEuT zjs;B~m@TJSAG%f*cLc7^6XG|97CTFgN-y2QP@C`v`uN9V_*E~5zAk$bmU@I@*xZfw zQRh43>7UNKi{}yvQItGvFjS0#_*ax`8a2+F;xdsCxAHfcZzB`r#SlEHJ&t<{=91-n z%Wl8d^`WusnogLH3@Ds&liVy%z^T_#&OMF*2Tr7@=s)p7?5x{^sadu!(-c`mQ6a=*xa!y(TrxJ zjh5d2Z!v$?04p=YuRg7!*|w^7?N!E2XzO~2T}lzR@0@h5dWz=Jb}s6XS?U*--e?~z zdr#$1{{UdcHStl!y_O{$el?t$h-;=SKIEHgTJrmRH?cvS$p+m0MPq{+rUQc13#TXZSs2JK*RjQF>9AWh)V5dgf1`k9iT01YdVeZ8O*w|yt)>3AJi7V`E(sVWpwl$# z*zPWtXFp?L-!406iY_$^eF{(B{ObI<2QB7GxJhf#7(=ur%xLV5mm-RZ1mwXwXqV5tc#h)-TmYRJ{RI&ZIJ zmdJ-P9pq=FYZqe&x#m9L6jDwGA>O3*v3kj_znoly)c^D9} z{EB$?qCm{M&k{b5tgXGg#%8%+B%$K8tRBxo@iw1pYcG>_#EX?3jtTz&3e)(rY;3$K zZ4x8}qm(x2)NjT;de@ZPS~Rd->N-!_CAxrye3D4y4zz;jsq1>(ww-)h+H!8C9$ESx zKdo}!G|=W#YW7n$*hw-;jCo_VLk_v7Po>4ETp7INUoD0|h*cZU8cBI)Bsyw8+9w!Y zS7>nCOaBVb{;=UPkJ7FqGj;y}6y3B}RyX5`NWsrq&VnTHpNWyztHJd2t3ESXX7c2f3i&{Q zan_~1(?7L!sN|QRw;#w>@iCC=-Co;VxLEE0-6_YdR?)QCwQW?x7DQ-xtnFgaEU!fH zw-6lltsO64YjjyO^(D#Y6y}Vg(mN}k65VL=3lNM)ccw&iwEGIk`z0&RMmep&4(rdRcvkaE)rp?T09YnG5CH^n zSX#yGdPcah?-v%g2mtbq>@nolZPokh$*5T~eV*FT?Oo?<5IL;*OS#qRTKu+N8cjl3 zP8vf3{RjU5uDt8wXN6q2&zEm}_Np4JI^yZC;q6Xn;#uVL;gOv4gYxtE)}$UC*M1*(XH5HjVKirdDvwxV0B#3c%ikF*~&`g_q}IqAF>*S;OpzQ)Jq zn{;cBy1D83SC07K;eFkvuD&4f*6+1hkmrx?d)LvLHl=9SUu%v*w&pfwPwwP&BBl6y z;ahwE0JXW;@W@+sMsPdRB3qtarpc%H!^2jRcz}Uu24SCPP4~R!awx3Ax6e3wx z>B!vJ#CwPb^2K{6jD8Bo6~3fwCRLhu4FZP87_R~FZ;Ney9sbkWtX?~h7MJ>G*=@*B zN1MDJ{WzeOdLP7X0rmYYrtp-dBO@%TI2GoWIx07df3oh_#Vf=dzA|~puS(OdVbOd| zeCB`jV);ZZ*pE(~>V~2$-&2*Z<7ApdJ7fv~+In+U2;GrWV~o`PA6ng9$qbr<%xrl8 zpzr?x>aGLE{{Ro}bXzCA(FJ!rUgumJp2Q7?yAFXC; zekl>_UPa6==Jd+mSkhP-r@} zj-vZQDBau|;uA{^8+B8Vkhb~2VUstxLqOl5E9S))5FZe>V!uDtk za^xOy*10=>8zbHu`yd3i$Jf@kd`Ews2kf^Ild~_JXRUG?4v`JK(wn9VmqaiJ+N+FpQn(&X-dL_Wo}-?Ex+&D=S2?FomDp79@c5zQ%d0Pj z_QD%$c@4e9igT9l$I#bV<9~*?p9cIQZTvp$@wP$8$3g90o8b=$+59B%`f2_jXdd$8 z_tz2tKKbDD)}N?o(|DrVNGB^G1G&#yyP`Qv--N#wEo?p-Bv;6$=!6*E-m$(gd`QbG!y&KFU>sX#D@cMX5TeN|Hid7p&*1d1WUKZ1QN#NwS)Z?9A-T>zd^71oL zJ&S~OK6dc;inR}j9xJt5@@spiPdJUDNBP``|bJHfdy(3V#Wz)a3$tfrVWahf-t985aP)RYeD@BlJpzB(_jAgN% zYv9+jx{~fTCPI2+rDk2|!A!UJu0zM3F_dgVN`l1DYg+<0-d>AXRtlbDU^aB z&2Xef;Aex3)+dBCIW07)uh(n5jwE6^CnuV>xr<~PcZ7F%GT6+&=?d(Gdjo+*Y{lZa zE;Y#}w1k^88lwEXZUYDPqLC-&oVJCrbUx;4&KIe5wSucG{4;f9h{Ax<&r zUSs0V4>B%xo^#s1Qy+v+Q`Dy`qseZqO|oDDF;#rvapnw>T~4#2mEDkQpSja~yw}ZF zpy8=er_RW<>*cVV$!c~v>T2|NhGlDr&gQiJ?gs?cEy{Uq#}yabCW=Ki{HQ;?9;;n+ zWgbg2mT%d}`vdkp{kxOEc6xn>j&9W0+$zSAOxO{O;1ABe?XcEuJXPTUwbq=3#2wIcQfl#!6ImoMr~)ix4%n+&-Lm*w#S%n5Yj!vU z^U|rqdZPK#$Z;lXRu<;j-RGmNcL!RB8&il@t$k3_+O&f zd_2*Gw}+xys^@j?Uziq zFDnwViHF@C%KkOZc!R((>Q~QoZRR8v3=BPq9{&KDq}9-yvF!c|U+nD?IW3pYi5tu( zw;cZfN{7Zb<6WLBy*fd*f7yuV4a*Sz@++@HFfoE~@-=J6fphpz(NIbo4m%9}+-rO!jU(9PSi zy?x=j=e=iZe+%ukds1#9SptEx+OBw4S5Fhew6IqC*GmSR$!x=TAvo((1= zV|{CR{{Rx@kz!Mj2TFdYqH7JPTfr=H$!oOl=m0sdRMYi)YbYf1l}S)*$-XXpQ`8`K zhr(8|%Evp7!o(lKtjO0k5@{A~2BMqoEqN@ zi!(-@k9y;EOHU8@t5EwkzR*VL(%rMgbiWC$CekcLkCP_gNNFTO0nfcd@iXD&zU}t$ z%^ktd?^IxZb)@5CC`#u$;r{@GnpcCaH|W}AP(1Q*>z+aUYt}Ri3!e_HsCj&-Wc$iM z>0HmlyKBvVPfxa>{{TlJLBZ!7S7&t@zMdGai9sJ6aa>g;W_H3Ul>A+%+iJEi454S< zcXjA%lF~dAcDjR0EUkmvirUq6G}G@|7~HmdlbWiRcP}ns=zS^0-5OfPskV|Ea|}SY z86(#fr{Jqs)+2QgoyneRzLh&*d5gKo$4c0^y>AF;k2REFy8?P=nxUIkOqP(C+7M(N z>!$FgpL0Cm&AGVX8soknY7*maY-zIPp{Ev9+aXn`2QT z_T(Ct`oqhA+zcog{A%2C1yPI&t*Ks-F42xfZ75k8)1A(K;_ny3?L;=y#%kuHtVQ-v zRE+Q|CjK^S+~bO^eJ1QKYs{_j9g!989%)aK$CFe%UEs&@29m-V3^T7g$5J|xSF9OU zKzQp`?=>GS2wZY1Jxe^}!P>afZ^NvA+1hQ>c^3BFKylQL{MV%dKFAgMY*(51lEQ5d zQ5QA|=DquQQ6r4U0qeWl>s>#Ayjk|x4W;P~bz%Fd*c_{{>Qwg?oITgc{a6l`-Zx7f z=-XJa$nREd?xTj-l~A%D;;i}aT3fJT{{UCV6{l-#H7Lr)2sETpGNSOiYL|^Pe>{pe zdy3JQM-LnV7K<2Ac2uiLb%d(7>~-Nzm4o<{IDEv8#Y zV2<@fh!AZam0MHQVVYFP22?py+*L2_mGk39Iog#3EH1S$=R0dQuF7u3xTcL*iI5j| z+;iO4j-KWK2toJ0ad)`<<}4<9^sM`oL#W5)^zT|%5v)3tMiYTK3yL{Vxs1J6Op@DI zu$5hd7|!GP){duiURfc5zEGLK^{Tq#yqbyu{{Sq8(fQSgEQp=ulbog~O~x=zH%K# z0ez*U%O*}ZH9eo7HL`iv1jaGJro&{AcyS|lV%YVl%K0`S6^LVsIZ$&O?P#;<@iey~ zqCu5k?$fl}`0XWcv9L#Bw701IYMzA@31J#u%GUBan&igmU)(^%&pT7)A?UkB#I zEuGKV{Ij||9)`T$`(L;4{{V>Q`y>G0qq565Jh|>q*0tMO)NMmasySHHWiiH0VCxp? zCZ!d`19`e3-@Y?jL=o6{H%E(Ewv$tuQ52E_A_ub%PsX-1?Ly;Cxl^u6W>M2W{c6Y4 z;EoG11adkE7tH`3r1Mv2V}GZHAAEMFAT>Ny;#ekrEL*_T3!t_t_|46*Q0`4M~Gk}KJvfqde%d{ zjv+4Fg{j>a`zEwCtukFf3&2PO=ZepYHnfPxCq0g8xkYl0t*VQugI*oZIv+~T)V04o zN7|oo2a2_+=}jrzGm6I4>>5y2Ged}6sSUGf+K<|7i9tEsee+tno}QD!mjmzjIjs8| zX)YZie2*`R)4aEr$q}g}R3l}vlj2*})Kb@@TO1v`c=W3`dO?9# ze>=ZQuM{UwaUx)v-X>BRt@uggv4521$0n)hdRyAJml4BfrFGg((AI6XOMuwLRk85f zTk3A)oM+axwa!^PGk3!FY5-PHWHr!uihs4~=^Ap#0-S#;=Cr%EveiQ$x+|d4FB14p z&(F+Aqm>iPQ?`;l8%#+p&_^U>up_a}Q1K4^Yffpc*a^=hfHKu{#SRXf=0D*ExZA%F z&2MoGP~&M|n>3t985$NEqv*O{&gaiVl_!!7F??E=S_Sm_+XHa_0P@keJe+o{twQWe zI9DSFty9)wit@>=;$o`!$sWeDsU^|g&T}LqCQrLhlsSa)w!GS}h~s@iBP^EDW*E8< z1~7Q5FRR^nufqpWypgBB(~!Nrx%<%(*nSlTw<<5hI5)-`;Mr~2jt>KzRi6%MmpXro z?dAhNZj%oYA1*QJOw^}u<9khV;s}1t<<1vu$DSWO>(K3WwS&Wg)5KcBtX5-vxPCrk z!NJEoS2=g5>AFXZJgYc2dCR&|26n!2k7~>K!D0Qers+1CJ4%w-&eB{m{{Rvdzz6Z5 zXH9qUelG@1Y9BXI+~Bi};|9B%KabWLJ@i(-8ksGi)sbL;u6dP)4m001=Y9yk(_!%* zouzn+*i4gKGpn-a1PqRPR;P=+H(@hDtR!rc=+b?wWJC8`Q<3=MgE?+{IM?7AB zQ*{(%24l>g{+08m?LXkHE5(s%+P03drR9#IC6Z*$=1>k->0YF|mxjD!;p= zF4KEp?I8aEv60fee^&7gyxuCGMMrmwX=X3iZgG+R)dZLH^|kS&DLs_Rj^H%7C-($; z{#AEex(}zXn7?Wf4=W?uxx1#d_;;tyE##AJ#y-ou^NjQ6e!i8xqUyHSHeu{pW{9Te z$p;VKsxsww6tybbf1+E*G>2qya;fQDFN!=ps(6#cOLM1OIJ5+l7*UM&HP=BqYS&X4 z4%kx%X!os68ar0BX)RAG`*2Nk#=Vf^69U6Rx`NpkQY_(y7#`w}5oq>SI!Q}7V_p9M zGXeZYyIYF{y0p(63gdiPX3h#mPeYGtVUgXG=ELU~!T$`Woo8 zojTIi@c#g1N}xy4MtW3tb~EU|Ws>vHxJjki@~Ljw?OQiG#+#+yTccTDshM)b!oYO; zQ9CuEgf5wx;~ibK8*3QtU&&^jQe*w(&mjI4L&iE8p4g2UO8FcsCu-Hy{5Kzo)>hE` z!N%s`1IG_Kav;|Q=9z~S+W*C-Qy#-V^a86!;JnQgG~{Z`%8W7b~Ww3JN=P-HLZL; z->+NTMSZ0~y(ElnJG$pM_o9vBtSYvX9pOI`U2BtG>V6-)I?b)k*(yB`(ToTW)0+9W;B~Z~2(;87(l6Rb66Me=(gH^Uz0=`Og(B3n=^FBBf6~AW zmKC+kxl5if@cdpOzOtAq$#W@Lk-LG`y8i$YLwr0ZGhNKlm4giD9DpmC*SyUi#TIbe zW!41p*F5A7D_2tSB$k)A>Egk&OP<^;Bn%RE^U33_Or6G+kDEMuq1@g0g(cJS)}Qj( zfEXt|{{RZ~--otMbE(`x;Q(W_7T}dbk(`Y6u44N}y}s4%(@c!DgpZYCq_#bcdauC! zDjx~yi9G69+#e{0>+4j7Bd61}*l)ZwZYMx)tPm;n2Q?>)btcfXgw#S4CCdGgPk%xD z>U+QRFBQf1fB5yeCEw6-T=$DSc?P}XD6|MsUMNCNq;vC=>-bi$V+m|SscZU=hx{VT zZ5)x@5%-5$@yKLC}?#bh#@T$ATXTZ zeJePO>3$pA&u^>gQo|u=q?h-gW9A(7uVdHr^K+vH)8EPGoOk@|fcSgiPwY<)KBaKQ zqqk2na(Y*0(@m>r$u+6OX1XFXh4`DOrJ}=WZ4TgEi2(i~isZZ{tX=8)h0UI`Gg?|m z9imsp6+qxuS>p(#)HReA$-U9C+-A9-7U&Y{S4wpt&;SYofT z_u`z$Bwj^fQVp@kbB5M*V=+1OuRigYh6AQT_pfibutv$+58+(TinJ)?L$yccUUnx9 zb+PEts?V4FU*YzLf7ZB7TEU}d=kTwfym{fZ+W0}&(!7twnmLN%O{?2HSIlED)>|Hp z3YKS@>Q>FT;PNXZ-OFz-BP0XE4^in|R;O*Xj^SMHsRtQcXEpP+oS^g_N-&7`3Y>{{To;%f@+Ru);r%dxf?t)o?yrx(;E{hB+TX=D zJ{9pr%#516k^P-q?og@#KTb`3zvC?~OD$Sx^!4H$lyi$3cf}^<3)2-AgQxwAS!uNRTgx4Ade+ax>Bf!WyK|*RN;C38)ISS# zIQ&}-)^@}sz=898y{l-{i!qfnk2upj8-JyE!%)<`O{lH)w9&G~2#l$SmdGTN&m2?y z@|V`g@tde;IM@z2uBXL*47|{9Ws2>??S@dr=^o29{iW(q|j1KjL)b#G3Rrnp`NR z7g_mTxKMM~@U4w9`b|!IkDfBD1~A<#f^u@)>87o*QcGxJP4h2a)y??tRD(*>rFA=g zUcQyR<0vK4EtTd!DPhp&sQ&$+=G!~WB&L#!P~ z%4u}vKQx1&K9%X76!B%BjBN_powpGH&lx!&bgo0kUk&_k@gG|ICxVwuvhe82$_?L= z<+H&E2RwV#Ei>Vae+D(wvcJE+ZBAS)r3*R{*Y9`cyE)a2k4lF@wYj)EaE^Ze0Dfva zZ-)LC@h+la@n(%AslYcLU<;3?J5_BHNV$#XW|4@P?m}CVD#hNZcXOx7rrV55&(EA3 zA9|M97``z00pLjPe2)t%Tg}ch&idr-bO8jHQN4tglE)JyZq1PRI0x~@YZK!4#9L2? z3vX{7%#!M?8v%Y|2=}ivy7<%LUl3m{^sLJaTx}9^e+uoTR?tbFZD=<$qSQP?;$0I_ z`#koN&t(%3(gT2tRxWkBYl|@^rkiCa0y23c*EQ9A82F_n+PvN+vx-PAhsq^DLw*L9 z_P}c1B%1#KL(^cE(`iN$#usaUvIwG5iwMR@$MElnEi}nlMC%IxHmUwP>GVB%>gUW? zbGA&7eJh&q{+%7?h>|I6qcFg8D@z_21O43fu8Ujnr`d$FX;aDNlayTJ1L@kacIays z-s9#iX3i&*&GQC0;;_sScxv&kE@oARQ@M#9Dl0py(R4!(Gim-Kny=#9>2(`XZ+!xJ zdFKN^r6P?j7gvf+Volh&h%R!xW18Ra_l-1dX8PvIMkR&9pO}27isTNYEwyyK(Jj>3 z1q$P4I)AfI(|kJ&n$7;RVxCgoNF@umX*~x|!i(4vzKr(k$%Unryl6hr8{-9d+nSSB z)8)Iij@M9OExYlz9V?vhr^FjOZ7ow(EE+uHDVo)|_=jP8Xjvyv%g|$`Cst2$RYEJF zEv2$}ZPwn{*OF<1a5P{;eV&G>u6)9CuVlHE4zec2$ke@fl9)GT#< zTNdx+h3k>9Q&DR~9LuTMXp=%+URB%0ZCTqLLI#fI3r5+&uMqL~#2LTgAd5!u+>X;b z0v%2U7nAc>u6P#a?L0XG-mx;A=jP388f}?6sU2Q{rY)pqC>$sxcCP;b!d_gns(FAN zy>VP-mlE1pd6zv;wrgYI)~=S?s2Y%9q~npE_0dY7F0ACN)k|FTOV}Z?RX%#TJ%Gh! zUXd=Kp>jb{&3A{xx_+yntIP|NYA|iVT7UXi@OM-*Nts+sIwHt?MY( z(hu*quS(3Z(BDqASsSY!#R_%;;{{ZTcu046Ii-OA$E%))wYIsUe!MwxHYdcwv;%c_>>ekH- z(&Rul59M5!hwP-Z)+I}i^<|FF_D5>#FX!^FT&duU8mDw3lx7SDKG>>Fpyp+mY@@X? znNOVCvcz$b=~u+@q=dk`SJJurd#8oM%ugrQw4k4GJpQ!XyD2;FCH#b3?}&j*9;C44 zgk;EioYQV&$vozvw<^uGjZ|WpE<-L=uNb`2VSNo_UupL8$(F$@(-mi3nc^fua6PLI zdEO+;6Z3o4oT|hrw(KSS^GB43;0`M;;_+FClx3U0rCVYo2XV>z)=sX31}WDSC32$6 z-o}s>BPZ6eocVVf@sN8{72JK|ez~VD%BSBv&@NIrV+n9%L$tZhJu2$BhTk$B#zR??k+0RdEplr+_iGO%1&Ydap7`;b6sGGK& z=jm3Wkv`Fo*_MiZupNbu1oo{Dw#jdR=XpKqtV!muk}=bovy_#2#zkC7dhTj0W9*(` z;w?TlT#R6fHwzpU<)g|sd6)vKz0eRcV6*fU)7@!t{gJsDu1fyZ#LO+e{_Z)& zD*+~xVoNlT}%#RhxI^MTT@* zeZ*_xaj0Fmn&G1`tBy8Qd(>G1n>ue0Sn56o(kHpPf#tZqpUqG>I5-)pwVTC* z!FOM1B0WLVmp$u8{t^q17x-Bx)k>LQaEPU|$6ABM8dMkVtuqbMa2M8&RBaht#Q0&V zrlFve*Cz)0B?2e(QPgAUUWwpDUlQn-i4DT}433h+jF`uEC*Q4c+FysPG}uh9#HxI- zp?c?v?EEJUx5IrtNpF5uzf!Npa;A$SB=t6aGicWqz7z1&-WHu;{?E5`RokCD5;-22 z#bRjx00k^{>$r6mQTB^`O(@&R9sdAY^nFroKKHawOXr`Zht!o*H8JBkNLDPXnkvz=X{h>TB1L?Zm&6Ea6?lI*6f7SFA=Y9i< z^WlBswxGuIO}b6nlx-2Sa8&26E8hH3;dynDrs&=e{{Tt2od}cdXJY3CxhA+>OW{VT z1+&`t>8xTRVij$t5+Gj3fH|p@Q$U^BfnnkcSgvobp`B-f5WZw1f}MJr+VI7#&Y=(5 zt!$*XwUx3Nj&q)dx$Q#Td?Tn_Sy|Yu(GIeCS@XW9y?PC{tp|mCH4)V&Wwx0V?HueR zZ~*O!l&oFsRlmCX1b4Bd!J67V_{KMJoL4&?!s=RzK{UY{c*|suyV|6=mruRcV{1#| z&wkrBvtu=bs(rJ;dg;5ng(ZPb)g$KOqEJkwHj&Wix_q`8MYXC*zGb|H_v5eOT}9@* z74%RIR}JLHw?4dAG@d55)E$4bK_veGvs?B)9RAd{2I)!$8K`o1H04H2T1+{a zz05(wb>lTJQLPR);5Uji-Dh2~wbU2MzPDw>goB)M(!Q_pbjIq&D{V~qmiG}AX6P7g zuZ`Qm(0Fg+)U&&_v=KnkAzm`s99PgD2l0D&gTbkFtK3ZSK@loRB;%z+T8Yiv@E;6# zBHK;)ovK4~0hZoNvnXJ22T$;?pfrtQ2t2!8F$mwnus?RZzf|yS-X&X|M?#;-Sg!dj z{$AiPabBPB%Jk}Y7UoMt7(I4U%0x2RMtrAYi57WQ{`PB|@D`UHkAyUY zgLd-=rF3#=iKi+Eeq1(vGHQ(5xo=t3E%e_HOed6i(yz+c{{U6&eQN{Z$An{!C)BP- zop@i`#PC^xaPG^>ry2Z za{mB@ZKKkye#xf+1jtJq^TDFC-&7BL+N5NJnM8OVtHI)mtveCOkICOKdeP<&TCe60 zdOX4JU)Xj(CLbxw@lBu{(MSNU{W3HRm2L(Y)AXW1Nv+ zJ(y5VIvq5tYJBJ7T^q`j?Nf^5^*c})iuOMhczgzI=bG~$6KQ{Cb}O9Z*TrKf^0T@% zIg!ar5c7{c`c{^m9@H89Dul6O=>2O-)waiz*i>QFjymf1J=69v)-UwWjQSc42cqg% zdGalr7{>!8PxP{fe0zm7;5uD4kDeWz+SJMHtZpFvc0-5qp$5f!NUap_+W>RD)gWjLoTPG-*g?K47V z1fAUbR{WkFj(7~wH_k{P2ISNc=t&KVN`&uYgIgXOD=dK~JXb2J*|li<#-+8DrmNwr zdwoVNIRkcUvehwSpXmKD&1FYz_L=<4kGtzy#%$!2 zOzRCE^HJCQ{bzLX58?xkwX3UY_crF@+R@Q0z`~8A1u%pC(Iz6pGv5!j{K(o0En+!Sg?&Qh#(cu z;aXa5nlAh-_WE>8<HkOC#yUI;-|xHQ^K02k)`PxZOjnD zaLu!*#(LFVBjOeQg*WzIx`?O_^I=rbUJrE!SiuAok&16RV7~7HBxX%zz4wVG0swjCu`3dYO14cbG zSlGq(2aZ@={OATq0SthL`B1REMp*7V*6p|;G zE0Y`WMJKT1x;A`G;W)J|A}O@dusV#8d)FJK{64#rUsb%jFj_IecWfy9YoU_QQt;BO z(n|B%w>u9(`Bwg&HLj~;=Sl}3^3SzqbeztC;w$eA>QdWTvs?hhS7^@Ro}#zY#P=81 zLObZ%7j6h)gHfVELvFPSsOp<$0XOD zd}Hvv%zASF0Kzg}+Vz-#omsf)iuLaYK)0G%k`?{nd{nycgkZhCg5vBSGB(dj-WIl} z9aj07)501Q>jE2=#AlWnIg zCC}Z(Q@M^cXO2U;m=@-^>d5S*a@x}w2``*_)?_4y%7RC&PpjNK`j3$pLrRt=(p|G2 z7*`DBb}fM=CxqnGbD2Z@>cD*|j{_w6iH}#C(gW=09V@z3Yfn~5hco@z~^Zh9JN46$+zL0~f z5cbjbP&)qrI_BDKbbpzwbg|pPW=^nP;~{nuGwW8bAu*J92cA?_l5zf zW{>Sq+HU^DoO`^(v3v9nk~VDaSOW~epC+BV3)IW3G1)n?XaxVE>(KX!#pRkW~pm3+MCerY)9 z9L(u->xWG=22!VQ85K&_-R8Pxxyr9%c&B}$O^A$n#a;UuYhuKnl`)8OF=4VQ`_$*( zHD<-yTcPIt!PL_%WzDAC@_lN1ZZ|CscmkEw*-%B zwD1I7$Gugxm&=`+iBb-BJ5sr68?Ps?wNy!(JeYoF^rzm-nX~IvTI1}QVcxKk? zd8sg%8-wMM&>kw~j;>sCz~-@a89v`G=Icvp#vYZO?#qmhoZl8+c^=hLd(i)wOyG=)#JBNR z+N6>;#uFH=)~L-(Qq0H8WvL!6}xVtjvhy;s)cEWjYo0<^p^7 zB^91X;XqW4-D&BkB)Dg6el--c83+gXYFOVC0b<+tZV`GOGgQsQvEGouf@iKN(%cjz zr(V>OE4*dg)kF(2To|MVBcG*e>GQS3V+5W#tPMW!O)l95X;|NVkg#5qz|)rXq2P7& zs+aeocnOifBeAJ%6|X^KSo+*j{iG~oBNW6}xw!qo1;t{l32}5n$f3#4TD5&}VN$Y= zYaNV>9A^nkJA6N#cml~{3CVA0{&k~Bn*TExCdHEV?y;O+!wx=Le>X%GDQ@;}exP$Xksokv4?e3xk=SNT;}wQ2)4qaBs|NJ^uU>N^Z~s`omWSe`k+ z+<6r~i@JXeIzoDi4WY5K;E;9C88n)VE-ce~0(et_!LEw(QSm3lcDj9}ZeXyHT*$w6 zP&%kJ%Gq1q>6%1MXiGB%7$>poT|}DT@P~(N<x7xhFT-0xT9d!k_iIWj23Q5gi%jRaE_VMuk zvh!SBq;`s-gE9F@`qqw*@taAwndQB@w{3@p-PXB3jW_oC*Mt-M3MKMYH#3jD)1E7o z_(k!D;mxj|`d5i$pZi3RFk<%ipgGywc;m(19Px}VCH3vCtEu^1%eQ&-72kXgytTdX zQozu?#i~b*%Ets}*1Ya-3uqdwV2ELRRc|p*86KQgx5ABA{t^9qQkK$Z{>HauDwyMM zAJ(v`D=<$}y7BMA?N3+uad#(#>~5@lnOc01PVlRo{Wz;%u;;`XzAD%;Auc4e3S|g` zDU;vwuT;DEm#0hcdP%ft7I`H`grgpSt~-5e%|BsV8!v|bCD*O=)f;7wE~6b7)N`|F zGt+#1scEv<-rEwbFq>&bZgZbX;3Lq|D?6)uxa5i}lqwb2^P1^AQ=&A!Hk6=0={E*W z2dS)oi#I>m`qk7@I{|5Kk^%n!0nJopc3ieL{698_;n{TM)^4rst)YmkG?HOd=b<%o zSb+Gl-UH#7+H#WaCO&>z@mnj1{vg98z1*@YgPsO|op;}}kBH`%TDgwGXO<`;`GM#F zY*wTgpAvi}tG2Mx!*6jQw~!WKyh1WE4R^l}HQh5<@q$OGgz^%}P_s4^NCD42y(-nO ziXy!DiFakGU|U{F+mGQ`UM}$Mzk>cKDp|!TDh#-AC zQ|7TRa<7EEEHC^%KG~Fv%;Xcm&U#T@Ux=bl3HV;x*%xze-gEEG6m$8Lx%ji@8a%^Q z{KoY)Djbe$`!AIIjGiNvr&IyR=xRuqw^K(b5-RTNQX+9t5=JrWQ$%u{)Hpld<;GS+ z)i|mefWSGcuEY)rs?w;C9pgV*ww-~><_@V3nGyG{Kg8A>pnMLZyPZ-kpyTir&Fj$v z17${Q&c;!Ew`Eg$o;l*pFXd|S{{S1>d3=$Ku@&$BE45Zr@{aZ5{{RpzKu@|p@vo1} zu+ARyJxWf<^6RKTyC>eR*v1*qKiwyvr9rJHmoeBdeX4C5-LBaYnEdUx>6-E=e(^gQ z)ptJj{{VtcctTBA$8%2zA7!?Y265^u^uqI2x3Rc3_Cydt3~S^s_#@Sqhx|L>y%W^V;-F%+#87D5;Tpq$mbcagW@GOEzh9IX;~84Xm2&LJ+lIbnv&~A zNg>6?G6gNSiXhT$MVt%^$J|wGuNFrpM5qZp&3v3`%2C|+Z_6VWQG?6jakNx=U8~(( ze&eXA?-EI!3;@U^I3v=uye+5sI*?QYanBWsN+(pOa;Bo@$$YDiyu$3l{lbjvHr^~hp&iW2I~GF0P?SCY29eXPyqcyitFddi#;TE=M^Jx!ky_<&jI zZEX4TpMYwQg1j`^k|*|;%746SmW$xK-D6oaOPy((=S?Kr!gKZm?Vx@50BbEM_@ z+BwJPRByDauM_J+>gMhxgdF)tIX{O=;9}DC9Ush^8D7)1cv>q9RFZhpBm>g2 zF09?{NVFKvaf6ETr+S+mHYiQw%|F9>sI=E)WV5~H&Ts}je>&;DHF&6a2jR*z1V<&y zBE-XjRfin?FjG#XUY7cs1MUp|;v$jPR+n zU}KKLrXKF$eGfCg`0=3pIK7AaLqpXyJ$q6o&A5pX(Hoo=EOG_~VQas&`#k173esC? zPZ*FW=kTd~UGO(m(B_r(y+ZK;`}ZMBGJEhp3Oo<+uR-v#wx#iA8+l+2n5LRDBS;4$ zAaX0Jo+1(59Q7&6eN6oe;?3`fFL(IL?+d5!mLJ?*5u6cDFU8tEj%xMH}OV96n3iRxjxY+vDR5M7SSuDf^=ibgPeYJ?OMj#&fH#T>>6(IgU{tyfAEFfz3fuh#&SKYvG`-JU0arcXOUxY11@+x(Wx@CJ1-8~#~_hoAQ+C)O=>N?rZ(Fu zDuGP0(1bwC0t83pvHV7tTY&wP$7sb13>inAB@b;Ui=zc1SGc>}{BLmCN%f(l;(3M5p z^!W6aEE!l-8m=r)n=5o&QE9CSbrOY&#=X0At{cbxI}lw-YLgO3$j55rsa;=0b<@MN zuX4otykk%@rBKv033a_dEMF@6n#l0ONp&eVWt~nqYUv`<@i=Q$3&%lOs%~18<;q#G zuvjg@nTHffBA3KWIH_XNC!2;WMOnA-%BL=%8jXQU=6$A#{jU49Cjpm{n$v?!kw=pW z9$DixX%+(5^3y*`wu|!OBadNF=VL^!RkHAs+!<}b4V2t}8uOhp)x06&8{JRD5(wba z91CsNj$@V&z7u=xThm_Z&#F@i#n zKA5fBUnbL2mMPInxx)fDG|F0%M$IMkYP}gj{cAu&pFAHyRBWUY>TY7-DiFTaX4Y5x z7&5Ue+%Y{(G-pvZNYeRN_UZosO#c9-WO$<7O{gfx-XK(-C%t8O8r8}=;ADDKTC6il zKF}Dl1q2-QAXOxpi&h}hq*$$PGyecA+z-;NL3Y1xWKq#`R5VHAmT3~_7;}~w>sIZO zDK%M5y9PTtW1!6vr|#U8^|4|?^Ia%G-n8V7M1e;<)hkHPoC)h%j_l|IF+5grMOcc_ zHp)k1Npo}L&KEeV5JY|zHeinn8Z zy5DTg+a+GdRy-eA+nGAoFq-g- z{a?%Usej=rlm2=&79E+?Bwj)($7)$)7Z9JNV(GfeT)O?DR$zM`m9#F9L-OEpSo=kL z49AmCDCgdn?B^Y-W;>6mt3X)LyfC6o&PO$V9}W5PJ}^Kgt!YpP;6LkHYN8iagy5dI?^dGO z4pu5?x-XZM;;ju12yX;;U~Z6PaoVR5$sDR;C2q*TE`FnXarQxpv+O_mQX$$iy?d@7u{u;TG+s&Psi0)4!j|(w3AueBg41iBw zl|Idy9R0V0;LvsXrI;y<^x~tn(4P0io@`(kbLm^xwvTnGk#U(9Jr7FX(L6q&{^wikiz?Xe|ocmPpI$oGH{u@= z{ene}q#@LWR_+Bl&S^C{^CPsVfHH&F`id=Jm%Ptu_;;!Ovsk+Ob;N6Gt~#E)R&<)J z&b#7xZ!A=pE#^7*0Fho{pzHUR^4y`gmuBI{YtTFq;~1=T0|5%MM&4tba?4QVVtG$! z@U{GLNqKo|8S^g)W5DF_Kc!)K_VZAST!uR1CcFZ7ZyIgcwwG zLEj&duS@YQ=It^aPTdwlkch|_&f(t`Dty`vD;{g&*rf3No$uS>npv*^5dqK<^{=1o zd^-A_{p@;#vBa+stQ+27EnzsrY&+_04+f;?7hD$aC`G_UTzR zB?iUuufop-_+wN1R*`a-J7Z8$8zUpH6@Yvv;Exh3JT^rxy-KBeKa0K==?2XoOR=vJf>+H z;JHni>419luSC>-2A_tJe`k14Q?S(Z{A{|G5K4j9Jp0zZiQ&KO+v!ETF*U)rB2_K` zE5>>6RP^mkTS;@K_--|gu0Ba2UJ?C?JXAVvr@WbQq~dU|@agn_iVJaR;(anbH|!;( zftmB>bH}E7RKE(oCh6V^yT84=cKOkI5!jm6@fW~JZoJ#QTE^Pklq?w}3{M`$zGwJ_ zqiQ-9p>l37CXUkNZHge@C?l>bFJ$jyRU03o5_q#r)^uwPRv)@;R#VeFu4~Tq-xgSS z>g8`Fibjg{{?EIPcAd56KeN}x;dk)=0PK3po3A3@%N}Pq0Am%K2gDyaX0Y(lF^CzS zC{u-viOxs9Yj{v`*5Nl~dhf&g&k9ei-0AUxv!iV}$E9>12lNd);lk=)+5Z4M_pzAx z>^EkfFywPnjE=8G3Hk~sB~LT5Ut=> z33&vAudYQ{@t1&L@g4nyhII22%SPn%2CzH}cJ}(K4O2dJxiUz4$Z^!w{aaf|H1v2U zWw`rCQP*xoHScOfpDyQ5ta-i@w3ZDVmW#eCow@LgI_yziNK{Ia1I=|2TrR8O(}TK3 zA2W9~=RXu~^)CzGSdA{~duSeH-l%wN`qai?cQbg2E;O6XF@Z+%_7^=5O4jgRr3IK8 zMay}!%MqDQasuFv{{TwmVV>LjP|16>*7;N@BRDu8;ZBZa&=Om@B>w)65ZwJVJQJ-!ouQTx9#3ug1 zjvJZXz-AyHtrWHukI8DCI#ga?y**oKuk9o9A@wXZ2s?#M4FEa2eQJ1qs`u*{6@XY#F}{#whehlj4bjAJ=oXFX3_T#LK4vM-xFJTH!qRU z)S3{+4;jxDq2tRD9mIqj<-IF2LROKLS0|eJ>>PJSRb^x9pV(jH=Aqzk9mQa>{_5$0 zAda}N)&XX94Fb~Q0>P$@9P{b{ugBlmtHP4_qvGw7TtVfnyKOI=?#?UrH^X}D8ux^t zO9+BXYZ}G3InL37e@ghSB&BA1`7L|I&WlNCTg-N5X7{VsnsVw65_O!>%$swH-`6}{;X7LsHKwu^)O7Oy0Q&Xu>qwsJnsX9O6zE<^QRW+_*t};4 zt!yua8^XGK>R0jr`*$jq$6spWG_Q@?P2};tl*0L~&h5FzDzA)uRjPbUyZR4Tlx=kuO9|~HVO)eFXAL2hZ>sWF4S@hLa z1fw_JZ(6=9hmM5;#cKFx_HgLd&Z+ytPEBlTmkD_$ ze7&RVS$-wc;keLeXyn}JI9znC<0~0TCx!e(@zg#Sca%mY+Stb2)^CG+aVL-17~(Om zarbdrk;Q9$s!I;NXe3h123xN+-uN5gESin04-D9OamYUSIot1DajRpVap-dTk`?gu z(Lo=W;kyj>uCMlaX${O#-@?nt>V$W$^Wh)CUnfzP4-uWp(q|-e7_PU(z8lg!3#r6y zSOAUJ9cvoZIf8{N7~d2uQHINWgU0~Zi+ow}b^ic@VIO1L$Oo0pddH7^XQn{!b#rnR zbC5CCyi?+iq@NV;7CjP8fiSro=M|MVbGAyxx5Ez?-FV8;n_F12xY$Z<{&lhAZx`Np z2FuUW($&Bts&3-5ybIxpG)p+`@6KgEb0hCn&mU+rUg_p5@#TU>4_c{5Q$5OF1o-T} zHolG@6xmrk4obLKa7{t0_!7fYzqq@-wwy=LlN)3vJ8_EO^&KMX!m-LU82tN#%zWVH zx(^3@W|-;gW8+2JdFF*wE%#91W~Y=aV%YdTEk9V2`&RQ{bmlliY>1z9?_E}n<4N^` z(LIW)Ejf=}%kg8t@0Hssd{;g1^2rI=#5I4-|;KX$4f>jtiB z-0AOoscw8k2_D$1I^D0?9tMVO!4!jr&N;0KWe;vA@_x`9XBovsEv#484i+!75_62^ zx?wXJM#nSa?G-L9mPRKe`ukQ@sPZjEmd&DJ%K?Hh&sx~jUQJjCSL6{K=dOEIE3yP1 zHw_5JeQS8Tm`WsiPO@y}FoxU*sm)u5#A#`H_Y|D>8LSO9<{_yN*d>lLTDq5nrcy2} zeO= zjss^kgraQ|v(erSX5LRcjlr-g=9i=mF7P}V$LCmDcZTkxCU~SOsCr|qbXr!XCSaEf zvmNtMYZ{)7;p^|WY3UK_z;o$Z4dGcQb!-y3u5-iMj8QTy54rKuy%R{+;A;Wq;4l=x zulvRNDwJAvy!YGWz&Q1(^-XdoJ5jI=V_n~XhIVf)Q2KSG`v;ku@fTDc8S`4z zzGms(xlajrI$s#f*Ls<4#rA>IiackmFN^g>OJ@H7R^0ypwOiUQzxEF^%SG#PB? zCb4v`?rN%ALvVaQi%f(Vk6(Ipc4JH)Y@C7e)q5WrTWaj;ZZ?$YF`U(*Ghf=Ub^X|H zz3W;f%B)16F?!PBZes-p=~cA@By2XERht{7w15SVKaEq>FMiP63|10|L|K50XEa;h z5aS0mLVL2qlTzsu38xC&d)5vn@i%nu-+<5D;-c|~g<|nGi8ZCcaFX@f+fV0LY-}(C z2f*~jE#=9CVFv1rnWr)5UkiLkJ=ct-zqSI`MS&W?MI!BXlpJTCqvb!HdKKM=o2!T9 zZaMuc%{A!ehvExbtUqSbEh0CsE^-;c9Aoh{={_9St^8r5T55Vr?zfq8hx^#$`cy|t z$G7Fsn9HFK*Rj;_x%q}DxSj36LHso~w|Vv%(nA=2oMxiGxJjdF&sP}R=~O;zoc#Ke z-%Q|=b{^i0*E(JbPH8_ZU7lZ;~~w1Jd_ zNo{njo1$`k>eh#IZ*zAe*_PZ>oSgBR<~1!w4O3f7Ik+q`4R#(L)9vHZ%UYmTQOgeE zw0{Yb_>0!$2{LKdH=-v{4+Pd_wz!XS(WuD>A6jk9uW>L0Z5bTqvr#rT;k{BgIjFB? z-ai`1wY}YT(e=UWQyo)#m1X5c0KBq%l)y*DYq4bqHP%&+TN_&G3{La z)~a#MZEH5BNqFs9(rDsX_a3z=ShntEoo@%9$iY9)d2_E){nKVQk3~;h0RTCYA$~9+xSx%v!>mU5Q^A~P;V#= z!m_lDGtFEpecHH?IGbltT-=vn002S%zFC6!!uc5Hhty2hBQ#H^n|Sv#eFZYc-C9lM zx^}Ij5f{=@*AXjY3~F1(FrhIK(yCm_Bm}71$yxI2Wn9MN@v60hV)dtp=eCpY3fi;r zS(0Sjz?$S_iI2_L`_nY*#rshkxdyh5=2F=7E3X!LAx`Dupw+%47#1KINF%WKt|wg8 z+wR7>0ClXp%l`m20347=&(gJf8O7P2w!aagpG0lOGQ?IEhvJ~xp7bLbIIlT}RAQz) z@#|Y&8I7ZvesW3nsW#?4MjcKkB3Ut$S0BZq)*x;1{OgE&mUuwjj1ILE_>|d15=gwy z#}t@z9R{P~nQpEO(m2TCs-~kRp({%7oc9&V-QT?MGO63R?$4*SK^DC=g_}hf-I0vv z7_1)T$8wLvn`C`yGIAO`o_*^M+f+?3ZMP$z#-HM=`R^pmgXRmtu3FCN#E#Mo?Hwr^ zqi0;wjpW5r=&DuFm_#D;|sr{LQl) zY1-z7bW$u&a$_0G3Y$dNPxi5d^qF=ZD?7uUB1@N2JnY3<_}-C!^?{(bAvJP+cv*5xw6aS~i8+p<<3QD66cYs>FEJ@%`HyAqJE z^D^V5Uhw78Y5R;8!sZnuwAscFrYa*HMt7bl@mx{dGHILI{{Y*VKPrdA_wjg&183sf zAZ}Rh4Geo@!1ed6Ee};+9euLjNVoeGmiXHsJGbV$9|!1D=(<^s_Tb%5yF9KcWCoU< zVPW8#Vl=oN45QPgX_j6O6WmLF%_wFBkDJ=GtxM{x1o2=mzgp0oPWIkRDYbFe(y)+^ zBKU!!M|0sdn^WG>i4Hl(YU;iUX*U!2J}1P2B#dK&(zxG@vHgQek8Y%8MUejh20MLg zZ{b(OokBkc#SVjPZh}Um@8fk0(kG$GJ+;Jam)~e+jDM>}ApTW|d_NwsaMD?|?Xss` z%vP>=dsM&It=fCNH|$qWnDgdt!0dWf#)l-@BFHs}zT4)JjGefwByST7Qqr{htsE`O z-$ybx5-g=d5!jq_^sas+n%RnKDI!^pJk$kW9=pA3zQ6GM>XtiVkN09t{$KZf>KmOd zON}w0j^FJl7X)V*ttraTEaf!4LI@T`@YMHr8^I2<$>#lVD~9;p`#9WuLGa$4KZQ5h zHN1?^_JT(Reeqpg?S$SRzi06LJ6V2b0R7)uvuEQA{{R!|mq}?Myh#)Qy*Acd`iS|T zMbx!Vf|FcYc#>Otly+nS5t4KCHR+!PEG#vxJNrV*e0OrQ6BMoU4tV)bHP3uy_^lejXx26UG&%JfVSB;G7Y<&sgT?*E3 z7&B{oQNw(=ZMD_-&sM$Dr$MI18VJro37^)yS4;7VLE>oT@vZ0C7@w38obz8nX;%4zwsfhCVavz z5>e0b^Iac_muG;rOHm)6XaEsTPB1bsab92Wvr@2^$7asrK^@yL0QJZxiq@XS6?Z;_ z@U_AFEQk*S6^-$7$#rX6bB)Co2Sd++k+P0JWhFTn=x5`7VjeP_lAwqpE^a6 ze|OXMtRgb+hWs%esijA8bmTR%?p|?JHN;Eb3th+w^B|m{0QCT7sC+m0lMjq^YbA|- z%^}EzlgW?GunrW;T0o0@v!HUUa{fFZC}W11F=eE8e%-l#9Dlw8`hrE z9mFDo>(+|&9e=^Z>(X4@pEG)>#yU|(`|q+&kwYA^%_{{&jAfXUz!lm2L$zsSkjA9*SAS$p3fo%!r#vkNr)n<;_NAWK z8~$3KIDEg4O8IViVX4Y#YE?Q)y+sLZdl&3gs?G5G#1}W-GSIw78Qi5dTW>hWJsQ5S z_;>qr_+~r%%{7OJBe^Q=u-dpNGt~3It^@X*@#pOU;7^Yl-H*aAhnHXQkHAOSf{QVZ zTR(ll#x~cVf5A1ir}*RhUVKiq_{*iL-Ra&2)Gk`uTmuEt&Vi50aga_prI>_{-s2n{hqWhl^*n zo99!=Dng8}_-^i~uzE zHo_-WjzCV`zG)0G-F?k<{sF)E)vS0{-uvPQ#d~iHYuc^4-)VXU#f(2_zJ!eYgK6Ez zzZtGdxkQ|=N$KWx#}JbDk@j}6r^%=jB9#OV25Xnn0d&=u>dM)P%d(XOC}FoG@l4wksb?;U{vWB^Yin$kHvYwo|VkmHGg_Kd{&MF%8`@z0Gvw4aCm z1>Hw);}^b`YxXFKZ3&oyqbDGAt`AuFd+}$%{w>oJ#{U2vbgeJLdeTI?Zm~V3x<*?Wbf$90y)UuhW ze(~w#Oz{za3GKcG5PVwOt9W6_wJo^s`B-PM9<}r*!`~HLcq>Sb*4`lMMj3$3d}HIU zguXESob>+y8DDr1%RBDWFWIBzVfGXg^w`EYPa=~>S!tIue)Vm+){yFT93 zd{uQMpJ=zr@y-q_2gLf%_WiDIi|-vP;~iV$AIGl?`1?-q3dwt_>K-MH?{r;NAb>6H zq-?1q$hpSVE~MlG&j8m$ao|si-YxKFjI~dKzZ`V07hU)tPa2M^X=QD1BiY8x$fiNG z6$RswN4htmtp5PAYsuQ^))nCnhqnAm(`NA}hRvi16ru$Uj1!M~@JPHNu6Sp}gvBce zw}X)>^{*50U&pVGehc_>;hz$CgT`rdXW}bpCRm1_664LlTpqk+Rqqq{uj6-z{AH%; z52?-KE3Xm357}de(j+jn*$Q*UaD8h^d0kj_K|DlW$JbsK@Vx#d@^62%7&V6sJmb!P z{Z-a#7bW9aH3o2h1EPUZ*K^>x0Co){!z0$ z^=wzI{5bfzJ00AG3c)y4ILw664+C5(1%mywPF77gU&3ZS6d?9^hXK@l;o7+i7 z91LNFHZKb$pNJav@G7FfVG)tnuRpDFSsHUAU%)q7ZjU{c%#%qx1-?{&m>pR8h|9bQWdL(x&~)h$Mpf7#@fXLmlf!s3+Q!3y+nL zLqu*VG-N}oMFycF6geaNzV%t>YkSw4)(R^HJzBZVJ6OZHxsu_x&uJWO?0{BAvEn<(6f6qBdsg0~aeF+!zPSuNln?1y*Nb)s z`X!6qpY}km*)`FescKK9_^NnO2B`#P2pPiWtlr#NYOResbT0kC*^kPww40YtGy8hz zDapi4F}K_BtF~7*Zy^B&@8LN-)-EQ|Hf(fD{U$8i-FdOO+(DF*D_=?RK(-+-BYgUW z&2u)_H+ItIMtEZEr=7#rw7=mjh=8Ko%zy6+#l_sv?kuhoi{OqTHPz8g?~5vN|=U20Dp+P$;G9zaHJhtj3)ib~5;*M{Ux1AO-Yvp*w@*D>)k zQ`R*I!)RNUCTt&=ukx;sSk$d-G*+7V)e<$yE$LjBgZ?eY;=Nu=T_slMPl<}O$}+0s zsL!uT>4H`{Cp}KD;eUayrnibq$Px|t)5 zv9l+G^sdhK=t|8DQV9fnaqU=5JDn8$Nri9;L%Q|c0RC~^nsR6#NV>Bt@G zC1z<7N43i2Q?%3(TmpEg;=40KOh*ehOmhDc)k!LNdZ?(IURL&!qN5|I{v#i`LtOU*f06f9^aaCT?_1y}2wePpHj$X}KC)M$#;nbG(s(W*8a9AUky zSFxR+F$S06d7-`+6Mfb>>s=gnQ8KA~40Wbzx}f_W+YB;+$ra3M-Yzzf$f+(4)1PW_ zMy9RJ{hgkq<~Ic9vm?J3*RCKr>x$$wl)cw)o=ZLQryP#;t)^-EhLdp5Boe4OPmYT#~N#7{NRgM<@=3cVC23Z640~CF= zOt|;-tSB`|&D#W!eBC|kMl|xU*B>tKg!is_BWT>UJkgVu?d?@=Cs|wM18qfjCL|a? zDXlAA6V9~r6mIl2jFGfu+~vGaZmS7p#&byrh9552XT26y4{oAq*04B2a8%Ztirj9|-cCOdJm%CZ~^#dw;ip$sSKjLXTlE<|h zq3u?XwmAc0bMp$3Bl3^RD(0yoLOOv}?f(FKmg+rd*n66u8oCk7^ZVC9Vk4Sd@%dLT zVII=W7EjW(v}=YgLpL=kTnm0Ba1ngIz}6+L;ZSkbwY3xG!6yDltUG_2LaK6oD`=#H zV%OSO#M^l$tDOQ_SWLuYuUfZjXz_C@5nR8CJ|W!0sEbV?8A!k(M^0%@*8`}$CL1B` zS+8{kv?bS;>ToHSULnqo5^@&j`-iPX;Y~I55dQ$$C|7n!-B%MC42NHi{m4~vN2=8= zPt3cR6a_+zdRFzmk!z-1w&h>(rJB`lBtBYTcCB8h#`Zb8OE(ha*F&aU3o@+4e6>>U z(XF~BD!ylwVO6%8n~#{@o5Tf=%6|;h52^XTd-bfy7o1FRed-Q#>O+$iq;yVOPU@Zk*3xeLE|;hVe~K~wk4g+7dWw3!%_^{yks9x1o8d@HQGea&jWiiPy}w6JMd9>%bc?9RKyIuzb4@UPi# zEp+5_$R$AS^sZ~ezYTSt1=tnS1%WOwpf~>jTD1lB{mr^Ir*vS!=s>Rb!*SVNXi>PH zJG+EY@&m~YaVyJA20K+lIv0v zMrD#AZ8D9bHW@e_4Pst+w*DzLtE#X4b6@bRWScjOExxBe*$~F56}~|`xMS^8U0to^ zhW#NzkUngTX0ls%h(Jrru@b4?bHHzE(YLc6QmvB(RUC}{>Mv-NV9&2XaMD}HY<%Vg zSeV8Rci&(zlg;th60@U)s|kL+IH!W^`WG4hj<(z|I*G-p;W#~E>;j}^w3 z7SdVD$=S#xcl57a@F&Drw66~)ovX$}z7`^@l@0ED3h`eEcywQC?*0yQ9lEgGib)@@ zwR`7sie<%crrm;vHG7BhcWqb(!Uid7(~W@0{0> ze0T61nxDrzJzL?-o>juwz>+TG9D9LcagO}gp^pseo(hr)^=PG&NVh^I4akdv22WnK z%XnwRHrkiOg%I2)*@GzvdmQ@Ku+bS+TAk0re-~?>7}xD#@xXZn+4)Ff_{Uzgf8uA0 z7seVL!HPFPE_|Vt$8tZVbbk?TggRxGsci?GwqcI-9W(y`>aJ(vhN-65*x1@>epc_U;3+vp#{}ozz4yUh z8EtP*x3{~Ap#cs z1xvw&tb6G4Pg>o)Ok|46zFgGFU0A4`roR{NkJ7xW$2Q(-bN%Y|{{Rq2h>dw)jniV} ze|o-SGlh+z(DA<<*U)y?5a4OG8aI zRvuD`!Tu)y0B`ADW&Z#K$?%4?@RRn|_^A)YOPe*+Z$2GrQ?!X72<+Dp90R!I=RND? z*gSdSh?6&(yXXC;a(^;wC@ub>u08zM?$;7VVs=(#ET^a>9!DK3%!Xf9viDCz`%;Q$ z)t&|YqwlrP**{$HwfB@QESmDxGq~ih+FS$qSK7Z5J|1|!4;Fk1@xQ`hpkK$Pcouy= zSgz*)2bx&Q@*9iXnJSpWz;C9k{#YpCi#&gISJ?q{70A;Nj>%}*a>6e=HO9C*7 z6@#1u#~jx_VU@~~_m-VX!e%t#d%ma9o-o&-{eb=!Xu7|~3GA=+pA_Fcp0Ntb9t&tz zH=BBeB#u;!la57w731HE-w^dJJHXnP!XJm<3-!ARG-SB6yVNh9D~o%7D{vn!Mo7TN z6~%Z9{t1oXd9;VS@pM1huYRFjzHEB%8#t_af8dfym_L^{{RWUXdj8c7=AW*uTjvvCGh_MQWn}^wZ76XFIZW` zv8mkgo~4LAG1{g0_Wlt4oWE&bf&Mb_+gV#aqho&3>DIELw6$RH;Z$cJbKLf-5`V!X zG;a#bv-oFHTPx)|+D)(f!|nketxw^P_$3F0wOQ{j{wK(Fdxvmhf0zh{IRG&@=hC@n znp38=xzijpr?KDbKNkKlcz?tmEYv(Z@WNVhUtmjzU)7$<2`MtaxE zzqUulE58Cw|iF^M51j5qix>%&Vi0P4VkQmtQA6(ReB-#U zIA8cCo|O84ZD#T*;)o9=b~aF0Dr8mXX2;q z{jL7nKd~RflkhuMw6zI+E#lixDulORwV4JKup@!`*F$Un00jHeE^ng$0EFK6`%cb0 ze&;XC4utL`8o#f9!9BDK%}(O)!1o7Big?u;GF*TF!Qc=EYF=kWJ9HYQBcs$lCHQCI z=k1~J2Fu15%PV+m!MdKAsmQXa32`LW`v5%#cDG+j%Ke4EVE+Ig`~dJL?NQ<%9%|M{ zP4ORxl3O)`wQW08*YwXCczV}N)1|kQY*z9`EY8f!BX<&@`Eq_vdsdV)8dav^ zv?`?uL0r-B$G|OD_RRf{{22cL32$`N{{Vzi(!$>PZe&o~qmfm>8;7Bnbi1qDM4o8K zf0>(;(1G5%Yw!3c4~O+Bu8)c?*8Sv&tS&c(iSTg1lb#QyX0tjewbY+uEzffJ)$#k{ z_rnhwc(Ys6{ug{BZ7$A4`%U`la;?R|JGm$njsW#NdsoFjv4mRBjI_TNYICfX38`!M zx`V|UvZ6H8$telAa-g{Y_ZT(mWBv)k*V;T9ezU9_ojwKH5rl-d)RyP*uW|4P!EGbK zIwEP-Pa3MITmjbu6!BQ7)~9HhIJmt|N8yg8JUYY{FL5*Zjko4Jel_U+G?E=JMEL?d zrB5g6P}%%9x6`#GTPtRkM{Ww&R~LsgTdg?7tXRqCu6nTauL=A{(b)O=)@#+dY2{@J z)Bhk-n|?>VdKCTxwA8h8Yi*~?u%BAEo*GRSOdH#Rfw42DtwK7-_R=TCz)Eg(FjwPX7Resq`7( z5)#2UVVQJW2Wx7VfoXE zfyhN{bsN?fF<=6D!RD=BcyiorWthfCqYAqwsMmIkVT^@5gIKZnUHnCMOtY+ejyVU4 z);j^E3@Hc$&N6}Aka1U1^3o*vRd-i8f8n`2DRQvGD48T1$pDO1yJ_IZ%)@Fg~|F`U*+=!}i83;1OCs`gl< z4dkl~U{d^K@y)lwZ88VeqmtoPK%rw&{k!72e}wwwwXKYhk^9_^{?!kUz7<{gmPn@1 zwHtJ?GUh;IE&XZ~d6-ms9&2UsF4N;>vRm53wwBT9QOx89`#>Qz3 z^2o>cyNUU+?SWpo;$PX$!s0k?JUf4Gm(i|W!W?JmUN7+<;oEB7AvQXN>~rb@J*jjM zgg|%zuU-vr2pkgJ^k0Ra7_>cVdDFuhj-eyO2E~|wIs7Zzd@tfiFQ-VQf8M-Bi5)YF z`2PUH{{RYaei_|CCy4w(X?l^LnGzEj{YkHJ@II>l0A?2uKki85=xXOq(PvF3WO}9D zrrUWKzsrJp)iTPqf4hF9cdSd#7DqmeVh!^$ky&^8ul7!c(#-vN73cDsa~(g4^*FRy z!`j!@=0F!+$4T7_;l zT~v0L>wLSS=ssFVqVq0lB#l$LFB{_{uutySp7^#e>>m;vT@@r3o+*8gAP3~Y&Ozg0OUODgHyd2HV|t{a-b@m-7Qddv>L#>2Kc*2bG*zs6D_`_CF}`t7Y? zG-_GfuAdCWe)={LdsT@og2+$su;c4g_2xF3oCJNyRIB@()H7=tg(K&3w(RG%YSqvV z)-PVl(bg{Yi=^0%PFHKLbDj@+wXJIi;462m4P(SBq(Ip_cPZ!7-l8$o&Qdk4wHNT_ zp@?FLL+w?ypNW>weyb}LUi)j$wNH)OO`;1kc#_QAaKoDCz9M``xA3=xWW6@>OnAoD z1FzP)V-pET^q&xFQ0f=5O{PdpZGyQqLeo&2aaK7MWS*wxlXjOEgJ~P1=DJ&((=b3sKm~YCjqzSRH^r03F6=M> ze8bkggG2EoI+mFntKC7YWfN$~(A93$V_uwAg_nvAzL-=M{A&hDmsO3#eQ-djt#qe~ z#}gXOL~~-MrE7O18^2nkt6ceEhMq>w)mu{2LPSVB*D?P932*jo{Fd@$h|W6kS;-Xx zUUJi9+!})2i*Mi1bf^vFny=4q(x#3kOor-f7Zai^xuWXrZ9W(2SGCq_iwR{v!kMge zhwSVfs@%RNjWpRIkRO>y&U#lxC83Q;7&kE+lpbKI<7Bn9Imb#_H7E)Vn4;t*#i85j zQ&m{1QY6!qw0qR>{Nl7U=kgyf*13VINoZ97J4XVxZMBq&B{I}4i@C7(fU5<~bTi#o?!Siw6yi4|k@Xn!oa2nC}A(PP1BhnMaR<}MHp5Z6U zB4lBOa!F|nmqzXx33fiUf$+P*qUXZz4x@6r&=Cw29aF>2jBITTIc`Nf?~+)fbAiB=URKrMLPy zKsvC^RPjvTxTBOVaFgik9^;JSsp-wQp%U zlzN_m(A!~UjDh)8D?M`3+SQhReBq9?+Xx}Gc3Vapqy@P2tfdo3$kFipuWfR7zX1Bz zec&7Pd$YN@&#igJjcex4+mGj6e}Yykd%`z>N$coqo=a0@Ee}RneC7*zyKl905O|kO z@TQVwklY3f*?;=g!fCd;y55F;N*Nch2zai7{{UW^D`5@j^Rh5;#%MX#-~09 zE{SVxC5Ga@WZ4pAb*tKzwk}}}h=jhG;;^iAsqUl_KsLZn`n+?V^`|z2V8}k#Ya+k* zw@_~ljM+6!YH4=O4XVMO8a$T%bWR$Yw%LA47t=lW+ z(!qJq{kb6C3=y7!76#aS-Veq|$(SQ=id3{jCYI-0fd2Jq|ChO$yh4xMw3Ym`{E zJzD%MR&uJ>G~#U;9g5x!LK7LDK&Q5Ap4Ov}PnJtVZE1FwBWCG&Zfi_vcaXrVBn}$_ zxW9_KJ_7iyZQ^Y^P>)Wto(8(N z@@5X1Ic&Ypg@Gcww02AC@Tiqht#O!gj@y8#nSn)@NH7#=AP|!6<%(g#gc8&4CBpO#j zJ*VLJ#oasNAAvr`%N)xn9OoogJ*nw-TK@o;QHx$$&48I1*rbk?^JnbQ@l5q1{=o$~Sl~6}*qOa+f5GDlTM6?u0BvPTep@G=z`HLN6ca$%By%E#df|VSK0`Q5tSt8J*oQk zzYN;+O1U8;ZvKL$obvdL&l+1rsOT|$p!~tle|js6*L+DfxpgEqSpqioqLE1a=D_r$ z1Ja5s`%wIVFg+?n1B#BMPSgP=2cr+q{|R{(r(2^bD7toXNZy073E$$wsROG`}OS_otTm%kzR4*T^!92 z3Z&tQ;=H_WAKD{mo+siG*hoOC&_BD;XK(RIi<=qqExelwR#e=8~m zd#!cOamFhc){BAqA@H;Q3Mr^*wlP`X-dwuFjE2bqzQz5UKW~2t>aakbB9<4LMCW`v zj%)FX!&kd_jJB=;Vb2xS_zU7Lp`&UMvATH5`|(~@BOz0Fv2-(+hDr^exn3vnu8;8! z+}(I(?SR{nw+qs;W7ODHwyf~@MrCr;*Sc&40>(iyeQc@i*`qT^{?U& z+S|oGDL#A`iko`~@%?M&@ti&6dpLe1QQe<>-s#r&4$oud$&z^-n$CM>k~v`!pl*tL z*UDeB@9oPp8p7H5#(1{v!7Q75`q$Ti;qjM*bj^3dmk~;rkqL-K4Z*LN#$@jdxsP`T zo~&Etxynm!(a6^KQLgfG8@?&NNwvMv$VpHGV0+c3@)XG`;FrdE zuM&T|XS+xDrXaDA-!GhfX{O=ru2nL@Nx>eqEc(MN#bX?OC{y;CRJiX>H58Gvp>0iD z3CNG+I6l=&R`8XFiKWi9V{dlArYNZG9HzMM`xjLVS`N_r_yZ_E&SsiwUc`C%Hf!tpTfAG#8h@P;k<^{ z@JSvN=cpCSc#3Z~P?kXK<(!-v*84Fq?qgY6v=GG^c$hnb$j)(BEsZ2%TuF0#cCp(+ zI)R$sm%%grfiABfU`58={c1lBUVW}iDuCee^47PA;=Pwak>ohoaG)+TRT54nZ5C^3 zNxYGxj!%_-Znc}O*bfZZJ;b(=UbEn)@EbhVhs8VT?rdyhv&ui5GlA_|F(X4BlNI`T zf#UhHIOuD4u%5#_Eq4NGOL28=9!`EunFH{tujI1TmwZ;xxgAlH0Z7{}o)P_67+ zp>BWFK=pQ zQ6i&ZSZzJ4rntLHdpFn%OTQ!@d90g@>5}>jtJD#ywm~b5R;zt8=EGc(%?wR z#u=-T)8QuNqq?_+eGe6>CA_l4msYnwx+CUY-A!fP+(oHPh-6h^)Pqzj*t2`4&ushR z$Cduct?vNFHnPZY4s)8z)8vg{7V}E1Tc^$GS7MY{#(u=ZarEZ0k*s8HSrMe_`>k7U zWqlxVXal(vqSjv2i(YvFc z@l}Yo&?OpZSY~AV$-&Kehll(U6w5ZMi!H&JknhW5>t3m@%f5Dxs^=AxabX%c!ha5W z*0HXRIc{*5+Es(zUj4qx3ygt{@rL!T7sWmzyVG@uqSDN^_No9e$HM+q>bi)xw~{uI zf7c&gwS}wb+IFstV?fepZwIAl>Rnjqhr(X)9p$HpbYv|yW>LsJ&1#i{Q{8KP0gZAw z85QRmhM7NrZUx4kU&_wnI`LgDi{hBPM`OMw3n=^C;MR5*Gb$&C($eg%f%1TRe4@2< z--xN<>$I`en3ivpoMx4EJ18_sCDPeUz<+x+!0E8Qzv5S)T{~4Akbdnu2Rl95$5gi# zYBcA{x6RWSCahX&!UxNopHp0ShprUDpI{`!K3wND(%ahoqXgG1`kj#2+y2xOju?V_ z)r~v?=gj%HWOMYa-?AZz7jOg--n6Z+Eo~%?WR*9Q{p#hOB z-%+xbJ7iMt8CA*0IO4q%#I`Kfqh>RT<8@sr@P5*8ozG4yNW|upjtfNiEu^Q1jNU!A zw6&Q)#IUH5&#xl9hsJ&|w$ybgbS)|kLiWhHUpcLu-~)~_E9h-YKvuF342?Ch>>D_( zNbcN*%XA2#T>Gkh+!(=BXcbkn16mQo0if=M|YdYbl2 z9a0@B_n!+; z$KaCE#Tt@uJirL8d2}&S)aQOI_)7h?8%v)K*+;y}clmyp?_Qtqs%az8V_j*4a;gEa zp7rDZ01m%t`{O+D>hQ!LXbNP2V4U{NbP?#@G4Y0~n!cHP1QtqnmGVFsHH@NkMn|&g zAjx~@Oz#YFoxm>vv0B>4i!LR!3u6_&-(A2O^Z5QDt;LLXnvM0Ko*{<=3R<}xcjJ$T z{5h&DI)v@ax2O`lJGNmDikX z#sRM7ELwGG!lv0i=*}@*HlN|UEhkg7he^mrL}wxLGoEXu)UPjXujP&>A7_j1V1HWY zaX08K?wvXod5$9<_0H=W)q=`kGyeU)P%+fkL3!eDH%N54E1Y%4E6gX*BGo)jmtt@A zQU=EQ>ZKhHO0v}I*+tX=EsxA9OZ`c-y(p^!T=AM_i)LcF-p4DSTF}>)0|xoW%02N> zS|w7E&%t=oc?~HiaLx^GT%sF9X27g3l`c`w5gt?NQ|r2^5TLg?QCz1<*Z6Ys7~>Cs zp?dMwx$hh5k?XpG!bVp;F~vuuU-^-sR=^|XsWlA|468I}Cpqgt31i`uwepR!g&px% z=hK!5@*`aL;-s;kWtcJ^P*s_(R(Jt8&1+3u%5KAS-7Gvsp$e_)IIC0X?P!6+9mlE7 zXI*NoXKsGa&(fZ{oVPG1o83X_T~LY7IR)LpDoH;#t!KwGwc7d4%$|htS8lQ7Gk3*v z`kmyku3-o225VIlH1#yE@`RgVw?3RzSgxgx%3bA*r|zEhw%SCgr$Z#D-#G)PwI;Ek zwWYLDh|U-TQsQY1&T7X(y_)zfw~S(-wbQ1DaV&6pRU6SH7dxGg2cBr< zA;{XmHw(`g;;Y|S{ia+5geNV`^^blTx+1mdrF~4eA@3lStDf z+q&d$Y;`9!2Zn8R9eQS2GOL_@+*etoTBL2ZP%=0*gv&7@)9&u?LPpXA&H&E>y4^m} ztnAj)P~Q1F@q$M+XHSCK8-;Ewq_(`Y7JJW8Ws4xhY&em_!V^i9Y?o0nq9-(=CC0fb{h7r4gUa@XB1}K^k#4lewDDAeez5$ zHCY(Me}q2a`Bx*Xc*SilQVV-4ndIR4k%CsXX7L8AHi$mXJdQu*q<`Z`=#Iy2rE1!B z?23>_$%ubU~bISxA0n9ruC3M{{Vh!EiTPGJ*vpJb42<4=R8%< z5O~4-I?7_UlMF{8YcpQdBJmPh++AWPb{PcV)(vu+w{%qTSBGKOJQZ-3mUhW-;~{_m z^!2Zvzh~=fuMYfA)O7C=Trdw76f@*E&(gk?xt`Jss3KX@VQ_+e){SfC#UQ&=7$Ed5$MvI_XUAW(kAzd< z{{W2ayhq{4qZYS?+ULvv0G62PxDLHdd$)tNEhEI<612OwkuGo6G;~Q9mH9_Z`d63y zL(nddkK4k&Ak5ZCcA+DmLx!rFb?f*G$D-dyG6t*tpTrrbmf1;IcONh+V;BRqL-3p8yTc4JYf>nhZWRdI z&(gZcY;3%3t^WYUa;qJ)50K}|&*CWN8G-QD@vS^VaV4ZmH2G8n81J7-(fErcrjKhj zrv=6wHt2Z=?Es^S=6jO2Rbo@lBqADt9Y zMSp3ZkA+B`sydN7Py^WQ6sa$@BlM(BwQ&N#d{bq8!ir&HdeZ@{+i8*~m~v`DySS&M zIa>M%dWNZ|Ng!+i*0Nhdlg{0=W372uoFpaC-AUN<9ecv1##wP(Cy9JM zn^-nipGx;%5a~`%N^$hA6UEvZO#@(j#MjMc7zEac$}@3#9vQ1?OBKY67bDiNFLZZV zw?^y;?OvU#_)X2kjkd9Gyf(;rU(&vD)2%`KhQA)?H>CKwZ5;mqrp&=l1KztY5BS#4 zQb4TOY;~@4P|za@{*a8rJYaOJp`|^n+pSU873tH&)#UfyryX1kIm+!Gw`s2%Lahv? zqX#5=R)wdGiMZUCEQn9s9V^9dHOs41D9qhGO-FCyX+im!`1h&ys&C#n>tNIux{shG z@ind13``@F`@@r8RQ~|MIe%&UyT6H=H-bDzJ~Vl^L-wuz05m~Rk%j1Ta4Yk>PuC@z zA3J_^)_5!8P2YkwiyNI9Nfza0N8GGIA281&+ckzi1&74Ze(t7ub!wPe>EA>4-&pYc zng+U7;xRRy#td^e1cS%Yv30u$w9P_T!?BG0(~h;D`!D=+hxV2D2c@Jee%)exr!Um( z#(A#3W{h6EH$VqY5Yc zbVo(s6tD#~M&rYV?{mG)xj6fyIW@;CLe?rZrzY;sbZSQ(D&3By~m^&rvk0Q_qQ9$!P!oRYC16UB5wnp+WaU2cCgF7*$A z`Bn@T@<(;%BNgX3t(&PrIs?u{SHG1OKag`>3U1agoKs~>+o>4PEBw1pewE!rrpak- z<~?7~pwjJQX@q#4hDl`|YT}dJ8*JosKL=_p7`wPrZ~R+VkykJENuX7U+{~wwp4Go5 zr9Jbyt0;(c6^V6j8dn(SHKK|{>T>=sm-}K!aTtfnec2r6ir6>tUHEb}l>$ow1rOez zE`jHqwm7I0M|*k3d5m=wOJLQQw;Ilq9#dU~Cq0?FRxS3bmU8d#+mfI2&!DXj5=#lZ zDDX%#9eVeJQ(pYK&s_qQR$m9FEuh&}?b<+1BfYIbSjT|dYZG(ko;D9v)d zG0?BDbM}z-vZ%KmP?MU=nX=;) z(FK*eYHhd3SX20=2bHVV`gNX=zHGOW$ji>sqXweA(XTFK7d9jaRD99@01?lnP>)TL zX~@0=QZ!LW>9kE15NaR&UY=;{ho{wX7bV^2oFvBCQ(QW803&Dm z3g@X5+0jmIBGuKE#-h7y82N*eJ*$ZEXw@`LVH#3OhUuOwy@vPuM{X6O@1B)cUhvyq z$Q?d@bI&!)IGqYtDqLOK_=m!Zb%s0bzj}#`hGpb_pjBUk-Xqj?D~ruj#((ICT2+qT z*d5CmQc1x)_Z86T+9dw~WZUJg2VN_Lv+(m>c<)lY)?|OO=<2fBqA?g^NI4xk0a;4Q z(*Cvo0E1yk_C1jlNu@~vKs{QY;JIOn&}s5~p;?G-{G9Zx?E?Ar8yKZ;`EG%~I=iLW zqXpblx^4qMp%ax&7F{`c+*)2AwEo9Sw9wZ0B)BjWP$& zd^nm`gPS`T(5fPIKu%BVT!)H$Johm*zx;d|y1NV>c&@$li=9(UOQ;C)*d?#(XVZUB%0x4w9-d%ZF2?G2@^x>~{03UkF;ZxCt| z<^oj}ITOZs9kBW6%>KarnFKMy! zSFlea$_N0K?e(Ox)}KryI)Z+bjUst$pR(2Ni-xw>wGSu$co^4cu8+e0AH4AHoir0# zt;#|+qq)H!m3G$}rN!v;8yiJr+}_I5NtaM1=qYYeZ4~V%5ooft#3>xPY!GvfIILmf z3GOUoNhV;&zpXC2eD+LYW(RQ39`%tm$hq>C9D^2fSB-AxX z#8-Ba#xe%&=QYy!n#a%5%yLLjAL1O>o_M5#U*pAnh7K%Mlvb3mT-B(8`4LZcLR=< zSHgEPt$Tn1MKQP5h)YVGbm1KkF%JJ=0uA-60$VjW&g|ouPXX#Ku zBLa6)vLCc)vQg62e8wXR4RiYLskAcnKE3OA#CF#ZS*bl4K^4Vb$0X9Rm)5!6$-5n8 zc`2LsM z8xZHMZV5!uffrm?Jkeb2UTscNMsw(D#4UF_2UjSc-5m{7w6$Y#mgECkV%lk3CAa_@ zRQD5;CyFWO;aHD)*s$=rI)=Qyo2T8{F;%SW9>ocnmnN3p&F8(`Tx|fJrnHhAUZtzO z0yu&4=4Ky3QfZoD!6-L@>qpvD$K?)Nrf7p#Iw?EBA-yY|qoORhn!;Kx%S&_((>bku z4m-Qp_hhI%;8zcGtg_r;6!L3NOxLa%l_GGN^)<;Wo1~9R@V$lHat}5YbPb*4@@uG` z((_tD3{a||;E-$0^zBMZXccbm6lb0o)~=u8sq9bsER5jy3~L!SbVVbmw9xH58FnY0 zcAd}4V_*Ot`4o7kT(Q@o3#Z-5X(0X-0M=X%y2OG=7_`m90&{`hw(NWr8^9%u$L8ZW z@0zGdwWy|*$aIV4x3b$kSjxmBTYiB{#F7$h;^!tP+35iwXj8xh`hK`%4OEt(F56%WF zCe31#IKLnGhFE+_9=WL?X>Cb6N#acUn(5`ybdQL7N82nITV5E%nM@wpBbul27S`9q zx_O5i9#2p!lJH-Lt~3jVG2E`q6v1O!QGCx)SkkqcUk_@wPkiOl-b}uDz~;ScO!1=l z(#i=f)qJaRBP1OA*OYjp!L#^>!@8Vyvmu^%h>U`GJXC)GZm+x*c={%`9p2#iigS_3 z$9n0URflAKNvvxT>K+W9*`Q0P9Wfk?d4&3bUpxF2yp}JD8kM)2-dt14o4b)-w+^jw zqIe;!ZqMQ$DcM*aIr>y$CD=((z^j)LjGcm_SQ)s%!S<}VInBBm*Y+^p z+T{Ra^sW~B!XInCD=K`Xp4I9T+sADI80N9#w~AY?m4#d)sJ0`i<$C`BgYB&^UOkJR zFfrD-&3nL)1b$=NfP`>s);v$6EdC%RRFRR}+NJRihvJt9 z%`8$&d1$W|K2k+vUwBG8hh(v~Qb!m9z0tIopFwm$a)P*RH%V31CETYOVO}mH3gC?* z)$Dkmi98ta-vpjLjKmC92DhLlkl((-*RFg>vPd;lZM*`cn)Ckv8$lKCDs$JpeD!we zvw2dCkvT0^cp6$d||h~nPNp|;iZwbh5C|3ez;BW_e0P$=DzWy z7Uo&U?)<<{PPoN?JYNEQRX>BiB-!bq@^7 z9MXd!pJCmBfsEs&e8&)Fi6=WBLy}|VbxoOrn6 zylQiiv>IOt*m<_%E8UyVT>94a-Gb?B7U3Skd9ThTO}U?Pw2jV3RkOHt%yFKaS2L=^ zcW9-ijexI6@eI(Vp6hTkjMpV08j_WiWP8@=laGS+r+K#3TkeE zebyqMtzG?*l_DH*T`?I(Xk-bx=}P17)mYK52^cH|YhFfXvO>V~Q)s#-_=&;htj0zZ znoROI5XMTLywv)QmCluFtu$Ly;O9B5OyR~1mG(eCzeYmMF{1pBVvyCn84ac0ji7&etqn(eG z!Mn1N7yTVG>x!W?qA1yCTuJC_K_zyPl%8ulQnfaBEpc{|JWHH}87DM3G4hmkMYoFC zr4~_2z-K+{mTwc=-LV(Uwvn%YO4gLk6f?HZ_F}#T1o_8W)Up zc(3z+1Ed2ZVIvLcTWKtssOihrMEH$occ>eCc+kt`jE<+DYU%tcZFL)| z6H_;E9E@|YAJVjOx-(L-iT?lz2aD{rJ@+~j{{Uy?fc|P@Ipd7xyG;wllHAy+)a|~{ zCOPklmVXT0MQi()GTUzBJe>V%1=6RCjmm#2!f-c?%TaiU#N|cfpl&vS*YvJO;)b%G z4)FEd+d%tr?Pmj(1Dfli(b_@tL`n7AT&KoMCAQP-Bh--sf@8JC^OKh-vSlAz5lvUjuR*v_@Qo}5`nlPo4&|;tAQwn%$!4L%t0)Pi@DFgfdm$*DI zz~+~_ZxFWEIqB)eTk#Apc9^-(0~N199L}|BPUsiX>Si9H1~P%Q1X z*lzqYL2)h3;xv}P#bEoJ&~aR6i9Af!6T~ID*(&|@$jX|(e92%>+gr-dzAKiO;5FZg zwdpl@?_@TYE#@Nmy$4DPE~cXTrlA|V86&_2s^+C>_6du}9@ypJA6m0-r9=ESj#&c0qU|W>*NxZYU8@3HU>wM}0S&5G4I;K0~c5 zMKc}Cwaj5h$lVP^uGpZsPauun)qm{LK_qaL%Rk*Dbgo~=o-BvKx)_@M*UdA8!9Q9# z0o1Y9>5+kG5<~N_z!|M87>0I%^H-L5JK{8cBDt8yaU60F^?RHFUB-*!n4n)S=y|de z_oL>as|m}UT-VmtTWG^=IH~+LX4Di7Q8vT}%1@_i&b!v`Sb3K5jlPm0tNs~#nV7Y} z06#bbirNMeEo%B`8UD;XW3^@rC;J?-Kh3bMI9{*uaA~I0ynw_q4O@LJEur5p8TFt!jNcge zx#6`{xKgSB70kt~#i&F|Hz(S!c(UpB71+u0gMr6d&#=)@TawIF z+-C&mf-2XD?&dJ6u_Gq3rZ1+;m>Y2Gp0#GySJl7QcIKBTZdvf(hnrD!GcHu}b6fhK zgyUO4EtO6MV1I2sm_%0O0ywUZM!1&x*clJrsgw$i#vstLg+>V#9i-+b+FOyvE1k&m*~buF$_s*F~r6MXwQ5 zo6S6o zVw{SO=RA-I7_*WXa%(SI*A_35GA&98uED$7 zi|dNK*6Dk8hen%sKf}dm&7}#C0M-2;Ns`sULPcRH+_fX18e7VW*X&AwGTm!uPo1HK zQ%1I1qI&0yes!CrU)@n=@dMD3}_44^@e?hUoiD4Rw{SD@RAC_L%VTF&DK z2eoZ!$#EQ>Wv$yWJnhY3!xR^`2?M;URD->n8T@Nb(@aY^frj9oKfjtuSknC3mNl&t zP}dn+NnJv7)N%(kX6ou_v}E#w9>0x8ZE-k_wlQEo8hpB{&!wuB+t;=!ffcT&bS>1f zkOnJe+ftI^-{fM>N8Qb2%`)3ruF?)b<22bVQSE-!1p8+{!Mt|%sg}ZFs$5HG>Iu3)o7)|6SWLK` zXT*JW9}nm;Y77E}P)p;~;+>&*wLC%L$nNJjhb2o9*j0}ZczO+g!UEFl?;iT?FcU#;(C06`;*8c#+-wL*s zt--5!V%cVB2u3T%@n^kxOj@7|7t_y&?~Zhr~V+Nbsgv2J?Z=aa%%M z;C3D^@r!ES54fDe<<5zoI-2rdg)_yjX!^t7D*d<5EQ&`bn(Xxd029Ri0G;o^F6)9i zVz@sI>lXSI>#RFeT%$iH+PXP3IcM=RLqhSuyw&E@FW3p-8@3+6^rEx_!rQp1w-eNpNPcg< z%?htBe?nzA;xNkt`g?gXz5p_8DbAX+N;eNAmbcYEqSTvX&BhROI5SCls_TH zE115vip0w&)Yof!ZRbXC2NlZd`eQpdJdE_OClgBXWLfiE@{b+M9;GbV?6v1Q-Hbxm z7hzt#;_nWTGZj&SKRWZ@6zHZQ_Y@3Q#AXzI#RH4m@w9{8N-hH2(mzC8p!|fdsK1jealL+-#KjWT_*yevE&?4?w-td{(k% zKpxy+^Vrt;#j0W1!IsO|;t~35<1Y^B7Iy~cM!Zt2`2%lbT;GY2uGRqsz+s-4>sF_h zICZs(W%)Lq2;z&Cw>OQn;{ae+7)otUjfVjqMQ*WJg zKx2<{P-^-o+E@U3p60MD;tK(M(w>fUQ(mNZB^cw3R+Yzw8EzN=2nL@Xf_ z#uN^f4ZH7P=an3s)g5of_Bv#qUF__fbnQ_Zyw27st7=$)#FhmZVAAOK3v0V_@yO0= zA}@$KIp!(Vy^l4c;eB$~UbVRUGb<3s9CWQJw-lJ@zGl%h){yEh%w`BjsLf_xT&=1+ zNg$Uet}%+ZY$a=HS}}kD=DCZ%9$RQvUu3>ayx%Zjna6ImoL@1!(3UMR%!Tt=UM|(= zwbQ1K$+k_=TD9&xQ)}d6DNzf5c;d5fbvsD(`6QluSsRWw0@bpn?Q=OzMO@-E``biG zB=IVJu6&#hpGxIEA^6Kvi%VcpwEaK(#O|*_@t24EH+`Tz#m)1@a8%)AI6221>&SK2 zTRk36G4Af|@xYfXKO$?Yim}e|DfB$cLimt;SF6pY>hPVLn5>)gyaU0%aJrhv6(qNW5g)rn}u4}dM70f#3g>i8kMdk-82jN^NigZcu z_2c&GOevq?d;?i6M5l53KZ%8v>%6yOOtJYfit6kyEw%e1Iy(Y7=Dhn=@Zwp@4Uyis z<+E4(DXSel_Le*vW{KR^8fxgei7wd$=cRgwhgiv{p>9C}yz&PA*ti%_*!8bP@HO(t z;T>~@#xccnVtN`zH#&g;I$9MR;-rcL8>=^^Tgv$(3NenDs`r-)(2%DDS1G3#Ig^X+mgt2AXQoHOa0CXs){bh zJE$PBgAn5c;&;cMurt6}eo>F5bVSZn?s#vH z(%a#0h~&M}m`!-Gf*~I%IO)xH9|t}v>RvswmQN7qlE8>Y9i<1T`c&RLw=?*I$om{K zWmor%fS!A1pQCs>>dNvn6ox33Ua)AMAT=nP?5Pqi*tcX1X0#54CZ9Ix4DLv9;@=Bg$zo6{wD$i1G;N+#`x@q}9$k&;d*#0g_|-jZpywcRYbeU{u~N|-^u8ZBC6DP?I^LWibGN7*S7t`>$<1Wz zc7gY80GwBRPH8iih8bgkG=%%s)`luIVOw*Q3US9?Ymf1cgw}HN>FHh1fIMGqHid2^knSLYr?)i+jcwu82suy) z>(aGEo=YZ^g=6bk^J!_)gv!>bUIF?C6y;h&dNZ~HJfTA5tfLNk4`8qCMC{`YvMg%L9aN7 z6V66!No`^9{IXeT_W|v#{#4@}f0I>pDE!%pU^i#4dWj_8`>bV`f^paJprWnzp11c! zqC3c{&m6{die)GP;;%~0Xns+&pGpxPQ@&1d)7GYH=r3(bcY0H#id6OXtJ-wOPnsbw z3%i<*>i9@DDLaK$8El6nlf`7AV>a$@po;eAa<>Ae*FMhndl2*QRO})0?Rx`9k{Ud) z2kTm?5zDCiTU^;j6Pztomj3|kQ*D=#S~gmOMFzqKdQ?UwxGc=7bLuH`qo zyK~K_WP zZoEeo)uhD38}9O&L$LAb(z@RZ_+M1Am}AM=pSmB9%Cnl*!5Q+Rwv+K&R`CX=Vbty3 z#v#*lZm&hrwfltf);ze|fOFQlUm00lEuJ8P)mxmfz(2~Q@cUn8*g&l0APs}ktu9?m z{jW2z+urLF8B|WE2Oa6&AhJnxp)>rrT9tHi+H%W!cE|>BO>$m3_=y*W-Y9P)xspdh zP$XrP^WLM|tJu?#wR0jZF2}={jj7558?W5sr@eN%7P8k`NBSgXVo*8Gd)JQ5;lCF6 z!%|DTD`2)Uw&0G%K>RDyJUOn#rD)3zwCNP_rq)n+Cbd$zi;G8TW2uM|GWjPt>q+Cy zbIQ?GqvM0mt#A$TBH8auP)oa>D)0OxY~+2XG9m24BB^RaZ5cMd5}#F@$=H5gGrK)2 zU2lV1Zj|GSn6q z^xa{tV~IdKoM$!V8n%@dI+OxP@||h=Q+<*$ zTd6fZp(U&;i#rf~s{P%iq|rufnBbs1@y$hpnGr!dvj!XkT}OxYF?u|gJ#pa^d6L!cL{4M`Pe7a^IDhM znmw@c6b?HKRt)KjIrl3W!u6>wOtOEg%~%Zu$^F^M>&UBClD(fXDiA%Y8@Wn03mqEf z=3ynZ&e?i-duyrDwCSzaI?9udmCes1U6C+j6oZeDI*vdYl60x&lKew3Hq zDbwU2Tm7IfZ<7_2pv@ITcAgPbe2G5j>-4L>Akl60SW$F*1C!I58_ri1Of;PNADaTP*{vy(aj=0y6N;Z{WlOBWCx_NwG zZxyT`+6Gy07e6lQcD-+D;>%=f0~~w)P#A4Ll}-7yDWlJPLibwaAGn0=QHbyazS@`e4@oPF`fh-|+CN`d&@mE(+YR4D<00{l(_AIbW34oysRQws@U+kkd zp1XuBW9yF9(`g#q+V6yJXJo>(WG`%B;<$^lmP;cx2It8hwXPZsvK*{+-V@YcSFqPo z^dBk+6_e^%*PD2!TV&IW_N3C%mZ-k8#C zVg&_6ChJi@N+z88QxUwwgG-@9U#&!Xnwmu!;M8RWF|Ec?PuM-^*gfkR8<0BYLQO+D zaaNf^u{BcaU8Cja70)fkQn}#?u73Fb^@;VZyPM6ZcVn97wQWUXciV$l*0(04Jeqs{+h;1Pb$C7wX1C$X@mFd4gQWRU^;5THrHs1#!1BV^p^} z?thhZ{w0)3PdwKra7${CFJMj&;a)!~a?sYN!p$fzF)_t{nSa3o-7Yo17YT;%-dkha z<*&?WU?Oh3SL$c{8_}eP)ck8B0KiFW%YV9Sn>C%Nv~pl+b5>0K67ificD^J)Hmemq z>mKt@M!)kTJaOK(ej{mVbKN9cXT>-l}tlL@cUh8X&1J;Iosa6U*l)P?L$_PrPCTw^8Wx0dv(?LlHH?Re8Uxmty&A4a;Kcun0sGSR~-+N zm&0Bq)21OB<-ZE{U)j~Q8%1>0yue#I+$*cF@Vduv%wSnR-W9vyFAv3SddwpUxRb!? zUAU;l#aPA{i#jWnHXa+5)iTVDjw{J^eKDqzYrR8Cp6sE*xX9W)E8A}_qkTL>a*7ie zC%sU;w$tu3hD&{+LHUmvtf|2YQfJP3rMc9>Y3wc`MfGAa`qv-gpAB8zTFU+rGySxG zt5C&`d+<$t39i^_31IOvo=N0mHO5b-Xc`rT#KP+A$T|=KBk5g=3ze8kOz`VZhn^^$ z3H(ggUQ#w$NWj4Q8tOHV6zHeH=E^0ATqx(}$*tcOc#hXk@a+3;W-jX6R!j`>#dueV zyek#&hiARhwJVXTk(IX$yGi4O;kphztI+&s;raYaZnD@h$T=l`mE>_t7l`~r zZ6AT|XILVO_q(tL;B)+|y6_*w$n{NHO(rIj&4>-m;{fF2gIO($Mg1<>E$#lvf6TbS zC$AMkeH^99Yd}w?E2GqWJYMv=Fxn5y+3!+m`a|2cQ)HR-G#bRm(6wpw>x?{Y`B$a* zM(QXhRtyHFmMwoM5VggQ zrx1+cdF@`Uu4z`}I$&2sWn^&FUh_Jy25O&Y)YYyq zGZr#`3h8xgfqiaFI3$kM=hpJgYRUF+9E=PfO6>eUcjnqClzjN!m(hlU&M@B7h@ znzl79HLf)VnO7s}Sun>Y;8j2wu9xibuAgj7k`}lnNc5~LK4V%>l;iwE;A>wH$29tk zAUsNTKR~Ck$4c?3d@1666IYt@)6LZ0=$NCwg%m|(2Lad&0vEp(?mrhbHt=_XZakum zG_I(Co=#13{{RIoZeZ}TMXhE0*K*3;2q!h?)k*5n*%i!jehT=reW&XQW8w>Ux{Wxv z)WF*kx4-l0UZbMxQR})$y3?+sxwd1pG8~N64;XwP)4WkCwTY6+QBLUL18k?UY}cDy z-s(RMEmZ35@c zY~vj(Aymdf%&U>suE40#sq?BD{T`ia8%;6^u{tdVxW~d9`yp`EKP9G!~o-p z4DKy6Q_E^@;|0NArB{*4FP7`YAmk~1rP0)qes1-x708O)E=6!H%?I(XDF>+&caI#yV+(Ij#Gzh;*cN5U~Dfm&LW(rU695G+VLEo5ph353OM z^GbV>(zqMT(66M zBI$NF0v$hGvVe@_76gyZyRQ=7#|62CH%$``S-RIRYw*j$_i`Jn)sjh1@RbBs>RK2| zCj;>p#9C$6h$Fbvt=zE;aM<1NUQ?_5PSmXJ2AS~od^>!BkvHQf-o4+(o*B_JsFv$p zw?%|FMGCxQwOY`0uMM?=PvMO=%5OAs@(eQj@mnHKF!)Pvsy)O}`2PFPmR1f48#a$l zE8guin605yvX}_Z930mrrua)tj^auD;$MDnNC7>EwRg56DRit`gklF!a%q5BX;MKd zh}=mL9OAVt>}24mBc8&uH2rUEX4I(OPY1ZgbUJ;khRDe?VL&H2tSUzAxVsL4{?0#o z*!t8qx{UEcMb_Y@xX7v!T*0Z`c~*_JeG|rw68Lyp|H#E?ATGsLrIbksb!{YZ<`OJDM}!yA?SixAcH6 ztp0PF!CQ2a(OO0zj>5P6Dv5IwD;5BHRuYNR9g1II@>rW}@$XhGqPic%K>AgXk;OLI z2?DBW*8Xd4ww^`LrDe!#b4nOpE%#0HzqLBoOifBp-bO*IUJHqA?G_8xGLppZZoJmc zqkR^ifol|bJ?P{MkXY!6rjYkBw9)?ncP6%0I~)5y^jlw?4#ebDZ70NW+Kt+TNXsDF z2Rsv6_6FM2`O%TJxy4MPE^9KbjjpbaWJ}ompg{w7Z+e|>t!2|y*7i9MUK+E!OW={> z+0pH8Cxr$#1;l4Hq9Bw$Q4MC#5)g(GRq13O;6z2lC{{R?k3#(0T_VC3K+IM5I&2D%~{YIu> zxANFZp;@;rbGkk2*=r(?SmW*6rouf5Pz9J20!w&|wn`A1=3k+k9wb*KJXKQnF zZ>R$zAs`%Nn&98vzD5@Eh^%xoIE1ri-x$!56A=07T<(O{3&N;<)(vK<6DHn#n zs(9+|-qyw$oCeEnUt0Cw1N;+`YZa4PMookGxUWh0Bl|a4cx4*u_sn_G6qRr>)|v6s z#1i;g#zoR2LAij(Jabyrsi7)2)U)87Av`CggQo!7i5VQ`ip}^-uH9;W96@^+KQkQj zp0rn)Em_eRs~;VC)Opnhn!dE)bJD-Ju6{RiRc+0hmA>Gr@wijXOl1WHJB84h!~PWQ z$JEqKC}V+1yn52Ou1&c5nl~R)Q12eJZyvPnJCklcrlWI~Ii~L(w4mmJ#Ex#X)NQ7n zFv+ON$68k`R&3OAOSd#UgVv#u!Rl#qA)(%HJ*e}3m0ih0^Lo^6dWrXs=~>9!o@ut{ zBvlK`pRGD;fZ1SpJq>5x%nJ3cd96U9tzGSiV?Aq(*YC>jB>iik)~}St05J7GDqe1I0R&<8RspyD7(90xR-2M2rbwx05DGWnH5g$RrB=`u_le zR(v;K34Y9RO?Pbywx)^~JzH=80Is<6**H>nH_GYWq3arspBA+n%{y{EO;XbB?KJo% z4B2)cFFos_@kXIzqG{eihzXg8-He~sv!k)Kz0($0qfsX(rZHcc{{RwAqwN~^Rg8md z#rFYFYA{Q)b#6RZfN(SQti4wF8)C8Y)y|r@%*$Kyl7S|3Q{CQ)BfvF{J2Wm?@(+4g zE?QRVYo;YxvOPw~-V%F?sb{A&GjMpVp&M*FFnxKd`~0Kx0h*eYv7aO65o0UXtfT?c z=B)dPqz}1xUiEuUpUh93*9)AJ(CBf{p32%Zen6|OX0~h{2j1qHXo$_tT8<{TVh#$9 zoYtzmq>_=0DeI{Yr*3aF=Gbs{n&355meD1Nr3z#@9c#Gp4x#oNS6GiY=qrKMZ6?*F zGD*Eka53JxY1I^|9PXtEvQpEw;NFIpM9~vckIl4YiTZ|dkSku_!P4sFD=zFF_0;Ho z9k%ekn$M`)#`_eKg>nsdLZ>!|Jn5?*1@ZU5<6YLREo8fiFQgHwO@py=a5(zYBmJH{ z9q_8!4Oij~yxNYq`7vF>Ld1l1%C|M&S@?DziC+;;p(Hz2#Hm;c;TvJk>sVhFZsdYDq!uKo`QTWZ#VYo|aDtrlg)qQ`}G81*>w zaVS&o-n%agUbdv}q;RW_Yl4fxYK(ufrX&uyIIg$CHxpXM&l-)YxH&jA%Zb+3I_aHf zg(7=>Vodbhf0cR%!?3q^a>m4DlU{S+yZ+ZV^}&7AblHIt}Z$Klu+?oJ~o9=&=| z$_CDzq`)+?@v!sulaG35hwLV~zhQsE=Zx1c{{RVMzzmi$xhJCI6qY_M)o<<&#ARII z5Y=fkwF{k|qX4p)FOvM9UbR;8IFJJH$hr5fR_YC2=TKI-)UJei>*jQ)c!x;7y|z)O zYPUte9B;*Hq=M$tYB#pGhCMcAirWC~Zn^JOt}asM=NAsF=D2zM6|709d6&A~^k_g` zqD+dGZwBhx8?DW?)YmE3=8~ItIpnU+>dV4Y8-pwhkXJm4-0+>NTi=DfQUEpP(tLE( z{3T|RYu3g)UBW*xK69U-`crOyYhMmn+ZiL0Xg_Ez&t7|c@0fV50HF!UhvTSdlB>Dc0wG(5k<-xRGi zJ6M+TDRld(hZge@yna=qByDp0(zyQsiysLubf{9}PiDA=eEp|U&+qK<(5G{rdU{n| zAL1Oo7`TGZ#IDSx0FFR6w1XToW1%CSYo;|dN$z0c&cgjjX3lq1cJdVmbw@6z9s7B< z?in0p5lSwiROFC;mA^9|E`%DypvCi7HZ_SXuRnB8TH3mrH)HmeA$xIIv)M=H7EVPw zu~`u6I?cuOOs||U!8K0*08pO7!4}&jDKF&dtE>CJl_9w&{hpo$4{iU4}j z3q456zodD#w0E&N%JY#94SpnhMNx5ao0Auy8FH?DSxFMGC z{_y8^O(xZbt#b}S+SaVf2LzK_cHS5J8IN`_#+jvBM`e5%aQ(hg-Fg1wNsBtR(!}fr+bIGae9}B{NbDd?rSppM{8Ua zAd2n$M{cgWG|(BBgW9lf?59W%+R!dN^GPRj8A%-Wvu@WGk(l%HgPPUw7J!$^!sLO+ zdaoV)42>2^bK4cM;ZS3jVh|a+VAj#t#!P;%;Y)2bnphckFCzl0-y&$5c$@E*8NjZK zS@7M$Sjjc+He)#rlU%jkrOmpQ)mL?>A1^z zt;2rxCmWSls)O3Rr{af*HS2is;ag>UT%6^?ar8B@@UzEyoYrxTWelo`f(vd6YM#Wc z&rXL-ZCzS*kz!CYw2pYJ%h0UMBU9!l8TF{5*52rDw~^yh{42n%Eh5S8?w9Qfflqzi zYl3ln*Rk59tYQxfCYc**8tn1xUP9pJxUFa619-p1DW!OR85SmD45tM~276bc{7ul) zQH5Zd;nFgC1IJ3{v|k9@=&*TOOi}r+IGhYP_st13XDboKq|PmbGL>RIs=Ru1mU169 zGDp(3>^wbjY{pBwi3lA1?AC6pb2+*q2WJD`x+5bAE1rMx;Umy|CFR_qxOwJ6p*Y5V zwZZr+z}mQm+U-e#(a!Cx4nVJQ@ehaXFZ6YNSr+bPaKTt^#Z7FM`lf{yyT-P#qLK2h zIQmy=YQ`L=nL(oH5zFOxhV2F0oPoO;729}H%Ew5H8dSbwk?Wewy!bhzUuwT;xgu%D z+$@CgTDnbyejmFC&?=`)ft=G7i`QlDB>51i>z>r7R=A%^n${*Dl`0R`wnmvgrmAe! zM0m-|0s2;6wPw0}n6o6y+z;`nmf~`;d)<#nY@j6{&mIp$Kk!jrkf?!k99QBgOihjzd=cAE@Q3J{8=^K;>l|~VRN0G z>(IP8ti9%$yo@k7KK1ig!!(BXUkP=p-bX4n3~U$xYufa$6vg5BqJgD%gy5DSo@i*O zJF~oL8txJ#1XnMp*|mlL0G%H^;~!e=E%gg~%_GjVAb>NRVz5YC%aZN^k3Ics87rL; zYUa0xpcl5w=Wq>mdK~teQN)KN*C}Bk3KrD!OFBp;Q!|h<4_d}hchKpJH~c|le$Y0N z$<0@S(A&ta)ni+`dxDZ$WT5N$Q!Qr~aEz1kj%zMk8gnCGPTMmF&rT|9>Cv2I@+ys> z-EW(7^5l+cSgf9R%W^4MB8@n1?Yx9brwFV-1p3y6=Z8~Hg>NI&?cD&}5Cfm3RkHB< zT&~%nj(l^6=soINjV4%zW3`G%*PVonRJ3I`sdr8BD{2tzw7QBWPMe2X*3h+$UsStW zZAN5{ISv3KxLro~bc&W*dO+ZevMvbst?}VotzY{-T`O6-`%F$uid?A2)YcP4#hne` zi6PVP=F%m$l1U_1!;E7hxt#+Vmo8m1)SMep@kFUcWzN6)h>Z}=du;b<&bgp@$M)Wyv8T>bWe@VHQ!}2I-jt2+R zHRK)-yVSf3sI2n!EVKZ$%h2s1B&DRDSRS>UGSyi!b04l znFc+6wa-0@i!`*K66p=3CZLin%+jD@s(H!!)d}pO@hscpQ*DEsH}QT|;yx0R=ixjs zpAt(viNI8Busqkbcym!75G~d8pe@}Z+@O4ch^}dCvAkP2c9vfQ{6}kvi4aV3K;xxq z{6IGLaxLzUAOdV|!S&?SUl1)m(FluN*%jL7_<{Xv!#*JVS)WLh>CsIrvToXeeqqPG zX+jcDR4Gd4r^IW!o2^k|@Uh)J!v%Z__AlAz;52$PG3wgu#BUsi#?znHytm+;g~7SB z)V0XB&ogc++~csXr#vs={Y11E7r;eo$&dtq@$|0wG?s=^P3(1+H>oYe`HY_L5uTMwZPPUFndr@tGzGXRIii3Ie zry?( zFP)97+~U7Hqx-caeMB}KlgMNFn>9*HjLY)^Xo7c0&i?>fs``v;A@ea@%R!TFP^~DBhP*SGQoKXSH6@n7Z>^<&-S$hu*r49vnt0Ie^i& zaE;Fu75=&Qbzun^6;|f##K#p^?5#AJZjH@Eyl&8IHn+&!OO4gi+sAFmV9fHu7L?iL4nxqj=If`YRN!N>+C{r_{k78`HcmWYg(Uk2X+q&U)7)XW&SNwslCYNuQ}ZbNW|rtw|J9ZI6{5 z1!HO&<<6S9fh5(@IXPLw=>7`xd`&K)uaj`w*aau(WaK& z)@I(Z?9W`BS1s^sPSUL%HEEOsaM=SD(=Cp8?s|-`4wm8_9b}cyTpiW3X<#OdTr=!- z8QGj?@TwYg6D`Nvw5w&7KD}{Um;OzgrM1!9cQ-1(THvV`&geT9bOo1RxL>ocmm(f8 zF`x0RyWKYY-mJHAvN|A9l*T~sSOxEXA3!g4W!ebbob{>~9~kv5a_CDWA!7qz`N_!j ztoa$IIyPU#kEiNC@iHI*(>zp~pNOrzMC%A}N8aH2S1YSte{OvD9DcP;uPyAM{{TX4 z&N#=ndZ@wNPH69Jw0LBQ6v4;6T88=^DB?u|xgQL8)5>*@;|JHCmC?>2)glZHRH9EY zajrZ7&OkB0=*i%BsxWHgUTi0f;-3@kUA?NM#ix-em)|wbDC!)={aWY;KnUz>Ku(vM zUeD`TQYpQ(^G|L+Dt?i2z!fJVwvNQ!r-m0C8W{4w1lr*Qv;sUd?%!6T7&u8L{3>xK30FFOQ`%e@czBv z%gHCwphmY%!w44{{3~|G@;T&Vc7AQ9m%|%%dpr9$!qKUkpCV_gDH9Zz(Fp z(T?&|^$X~IE7&!OhNq@)PAdw+aRs~igQa$>Nm-oC@ed1lhEETDoXHIF>9UjiiE?Js z#!gJc@}QnZdl6m7+abTV5?V5{u*fQM4QG5o@Tc~+wQ+l+F7|G2ZAVMtjBR7vx8+=h ziKtz8diF@|GddHwp(g_0{gLZURB(2d-Twg3{KKKu-_5<04_aio5%Hdt4v~Epxe&Ot zZOGN7J*W`+n(Ty(<*m%9l(S$1lU21jB#$V|*VI<5R{mU@m#E}cUx;G3nfFFI^{Z^c zMlnl^7BX5RXZ_sP#)YU}$QDVMjojlHs`hfsapE@DSsT*~u;?VQ#5 zZ%^5y9-pmJU!Fm@RiO};H3PR=nae;SH-t%=(9?C6jzk#)p17(rT5aSE)pHvM`Aua2 zI>>b&w7>6JO<$i;j@~iQ=DhafSC>whZ{&SzR>Qn9@7}ijI)*J-1;NEh9gErR z@`nemYCSq&HN^W@12i^;W_nGZM3N)^sjpGKZLYj0opXWgqgU&&Qw-6#194B>$+{l z?w55X(>sTbGPnQ}(=>A;tjhi!ytjiw7Z9R9NBIJS2IjSB2 z)OC9uG3`8ErYgiY0Q*>a8&+6%qutw%Ngn4LZ?piCsYA6ZgB;B^rYE#!WMc0b)PDTu!s%y*I-*CQJ8FzVC`( z9(dnI@Kk|iaey=FUOVx#;>LlmXrS9js(I;6ZVc=7pN~35lXq)b*mgmD$3FldMGUFKMpXEj8jV`VoJ<9{vsAp3y!$J#(ir; zPrLrqgUxY;H7ch*p(t46b)9x=DZ;XyzwXypqu4>KLLTEDM$x!u6zjbr&r)r!K5wN+ zbh$K#3mN^v9PwJlMDm;mj{Y9Scj7^D;V6tjA1qg#*GHr2QQuod9oYTsV+SW0sC+@= z`&}ng7Pblt7TQj0drUU#EO!oZy+OrXo`XuqMd4MABQ~yHZkisZCpvNt_* zS^8CyY8S#wcE{4Yo9#Er&_t|GMg?VZ;&S%M_IJSJ6t~a62d*hDU-$UWH7Y^ou1;w) zq9*=_sl_$3M{uKY90DpNf?It<0F#ww+rG_jv>K5wdl8i+u1-$jm)6eEQD45 z$d%;{7F7u3R*kK{kU2lCSNmMMLiF~eGD#mV-nr$u(-TE+q=1YP0XXSf7MCv-hVrGd zGmLevb{$G9hE$gWY0YcJ;)r1j5)Ah1R~?C#thJ=-@%^BSt8cz>lASYI+K#mZJ|KNR zPxBP7@dp02Z&A8+gM1N!NXX{0?EFJxp)<{`z@KQ7jFahE&tlQ9;lB`Qc2|=pi!PgT zZozAfxFWgF9(dP5(46Z27rIGq6y`!E^9~o*wC%h(;qMmP%O;}1C7&g5p!Kgl)cyLbgH6axhHtR=B>*zJBE_|^}K8ePk1QZL#!fcsk{oM)v+;_KaB!rhIW zMU{AvnDR08t{+R&f8n0ITV!d`0%nWE7Q1;0*Pzs`Ot9T6j_j zO}cNL6am|{bvWo|q+)ne;KUkrt)RM78^g<~IK_3TE5WBVsF#&|Cp_({T9=3>Tj@p6 z3oQ5;&q||ztt?X|&Ui)g&(^V&P2(e`Tk)qnYXqZWpYLY0t$a@g=4oVHkVoFG3+-d< zZe5N*%{DpITO+e|#U%q}J0n9`y^1YfS(NbD=QLCvBf7G)(&Bj-Ze!0BRq_z(9|cjI zQAK}dpOSKuMaomE6_aSEdEZ(E%Eg=Rb5K88k>7Pj{c7Sh7DRsWr_^q7nrU;I0>sqd z_+NUj<{Em*#V~5aoxOY0Gm1u%qi4rT&O#eI=a6c&j15gQ{JeFll0U6uA)%AD2Ngo# z^Z3=Nq`;~d4~984laaYj_D`7BZS2@XR<$X%vu!ntsa;_X4{F9z0~1-e7&$e@Yxg7O z=C^gb?V$5qSBNi(E(y;y;${-u)|_vtf#NHWQb12tBE0X!GkGi4y3Y`57%lU5t{cR2 z`S`)kE8_7E^Jinx8K^$dCIwv6EyHTC!1?{_Z9bJ#O+)5$UB|-D1%JYG6+S-<%?%O#Va4JfADW#?DTvu@Y?6ay1X%uwO?IZDP_xGI{VQ%t1SeV}o9E`xbmCi{MA>&!TAY+O4dUuiJS{mlM##dx;f z&sp(|jc=$alXD%TIqO=M8fK*x)Om@X#1ZC7NW!nJeC99rZ$sNo$eUHU`#eYN**sPa zuAw%ebGBeqS3#{LR?E83i4z==T*R96FDY1X8o8c|sH8Nx8@?OL&FDCi`;0Qr3h ztjpa(8>@jV3NXFJPcvm2T6`i4n7aJNwgmfE10(5J+HLpS<%ywO?fokJ*DkzmG;;wg zuFln?pkUk$;F`?0caxwsyP&*b!6-N!)Ji~fb`qi>z{OunkYf3B_||N9u_E9BQmx|3 zKX=9}N^&A(lD^|lM_ss+?wW<4jGC=Izzc)YyHw734ZG7|k(t=nKXnC^_nRI@{P?ZM zxsG_5bIu5^J5bV9H4??JKDAM;eF)_`S&|(l0LZFFIO4g@YV_Vr%n8FBeQM0Nl4>X; z1dyX2l~ld3F~Zm%HEkJOIZS;@2(BP8N@N}WLyF=4AO_Vmt9uA{CIxVs429K4+|g2IQA7s z;a9+q9NT!N+fewWs@+UvMlTGZF)2UA@{TLsWB70Vpw_x}oo~3vz&_FIT~hc?XzoGq zo5MQo?}r{Q3&rNfgaXoJ_N|?M3tt9bHQ$YIEo8Yw`BEm!1Nhf*<8O<4U+lZ^*)23t z0MzGF#Q^#8IPYJd9~1uoXdP4H*Tg5dY3?+*QQ4TDjm>kyH)llUWRIx4LGfDG$2xTJ zJa>xRr0T3~l$PKTNx*7s z^=laZ(-O@e8RoXMd*(&}vvu{ZPs3g&h-t`@IL$R~<5b zl~VTOaImp5N)a}ty3nyC%vop4mPIH^(NSu+y?^u|b*ucza2&hEYH{gs+& z$-dFP{{R_U$-UJiNQiK9Mh0s~!Hgz~(i`R*rA?2PY_9KKZmiRt}aL(VIz-xSI*ut z&=PHIY99*|?AI}pWmtNjOy<2C;m^k1GsYI{qy~=LR*i8eB<^jzH(z==taC`y)AS)d zm}MbkImsv9vHVHkxUOJfgju?Rqk?_Sb~hSKldsuqL5@Y>u5(vnB*8` z_9C|KJRu&YliX@?sd6)GA?pizkHWmmT=1>`0EYExFJ^azi|6e?f2=3idi^S*-7ine z{sEI)o{%olT}8kFiQ|fnTVZi^k&IS9gSDmCnoCa+;@4ESkIWG<<(D5TWO2x?LnB*_ z&5@eu=S?PzBuA-e*pw8&s&`s@D)FDfw~@u&zJB#bHL!bC$mbMu5@K7#SGU%!S)blD zPAu{c(NOt6XJS|$Xlx5DASuWdO7<@>FS0`r2R zkL?nyb`lhx0O?f^ga?Oh!lL1gHZgEdQN3|24YXtMsb)|?s_z+a zRxnO|C{npHRzx;7hDeSwe;T)^Sa}leoHH+QJJ#NT;kS~|u|h^TrF(N=?fbpV4@zcc zCbMT}q*^=P!2^kukDf5ZWP8`oUlYG$e-8Xl)SFP$p7{`xc3Za5&#)j@(>I!Rhlt|a ztrd@N01#`Q*OuqQ@rb-FryIEaSN{O7LJiNBG|%`Y_lET^5J!2Z-_30VVB zNgH5xuSwHx8b*pSU@bvkm|%Rz)~a}(7lPmmaugGcE-RL&ymUgJAg}yy+TS+s#-qH1UAN24S8Jw`hn@(>9E#d9Bb0{I!hdVO7e+XaPVQ7@wl6KisLH6? zF~FzkT8UH$i^ocSph@6&=C!@hq^ye`6qHAB26|VcX_oM6Q3&-C?HL)u_0MYazYOVe zytxWZ4?JYKzNo1}?<;%6aPhfMU%QPs5wCW)5XUB?*X zHF4Nd+}G1C?(RuP(Ro?}+>n<4dhG#g?;LO85bouS3xB z?O4ds>}>o}@FuC^6p|A)qXzk-`Htlt+;LqOz+1~76WCm6tn-WQGBGu8KGnB!tNE7z~>dK3QYv&Dba@0(DRCeQia{XRXD6A6L`qyzqV%7WmqFt z!W^DD)xApAO*YI)DLuHYi)}vFPC+PD4%`~2tzE97hBpImrByg+5}Px$nAcm6GLk^( z4HULZ9+#0DD&~sclgP=`J}%fj=-55!Xs_$z^Ef)#NIq4@&8E2(YHPjdbl(^sK9BO`AB)ZgN2^YlPQtvm}6#$*#Y|vuswcIPnG9 z6ThZw<}+HYMcL|UhEtVKBM-#aL43leqUN}(+t-#s<$yRmex{5RdN&GQ+)eq?*NX!4xX{5g`^{N8z>I}^jO9clXBkF6!JTWPaz zDB9(D!1guQ_`c@DUC|OjXi{I4&h z=FdGV83a!o)$LkqQ6;%!Fvdqv4Kl^vJ51eYdXs@&Hou}bhI~UMyN$}uKpyrbxYWL0hKRu$*qX;kg5EsFShu;TuWZ9Bw;2Me!E+|o z*;Oy*x{?PF=Qys2Bo;Yeh&Ps!FimjVfP-?WUm2i&hz~uGk(!8(Z?}hch z5%^*lH0$-t%?V@?oRA!6y={2^0OAvPf56&5g0x7U+Vf8fbu{_NVCQ$;>)6*qmGn8B zY%TW`~pC73Eic71exkGm&9qY(V+En8-iQy{A|4=9#5S zcG`riE#B|F(y+9BYfl#p+76`|XXJpswbMp1)WV}@jNIsYkAh@tYhio1oMjN7%Zl`G zhT6WPVd2-8SV@RhW(H&-x_kDm?PB%P@nw6ZcLzUqovCZ{YF1$`)Veb4-O{c}bQEsR ze*0Bl8Cdy|HrZF415#=B65HKFY8^;q-g12^sPKfaF}_PU)V$02fMo?b zRvk^WNbGc05b9CGET1k$aMjg5qLz{(SQ7c`yPoytx@2BPvXaRtBXA^9cvy`ZFgdo^~{>azSo+E$g!~?N5C|f+RmM;%mvhWc*X_?Tzb+)b>-T$ zBxSLWt!3I-nDuDHkrJ{v9eqs>BIaawEZSw;-rGkK#ni4o^>KQ?!@X0)TBCTI!G2Yg zwq&u0{Gwj{I-J*{_=sCtYE5kb`*Y`rSLHE(jc3|v7nTL*xSQ>OWUMN?OkY#&T=I!G zFMK%o@cuZ`?QHy3mi9Wj4=#0#Y#@Vy!*kFI?XFlgxDB#(Bkw;ZzGwKs;mNG^OP>>H zmm#%B0p)}*BWS=G`d4@RFMM{k@!B?<;`T6IMEeHj&Umd7(6iBJvJG!Hl1O5|AU!io zgF&^6!gmsQqAxcfE-}C-fr{!bd^j%dytv3%;Q5uY!{(@K5nN5JTIrKSS_zlTE!*Yi zrB&FPOz~e6_zveyv5x8yF-YWTEu~!fjM?F3KinNVaZ8|h^>q@Ko+ed}=c7DaMn4l? z#jnPbYjWF0F=s3*6pQLHgI-tTe}!$Q$t(DB(eG?Q{pGS87WC$bryXPWf03Nvj;0$A zut2^^-4k^uo++~we5@qka6M~}@E43^(UGluL3D2{3ELg!HmHC3<&RP8?Ol`!9O$## z5Yfr=DfO-6D9K$I$~GV?r-mg8 zfslBsDW($KpVF;CrUk(#r!{&G%*~Dy=~e_A$IqJ37OD*&XXk;Me8FZ?`!L{hS8Z(- zBi+e0BiZeY9y(LuL*?Vrv2NufKU8M9+N5AEdR0Wz6%OuAYyFqZW9?4+Fg+-^&T{(L zkZ=uL(V3L4N%?zLoVs54*!QPtI#-!K2d||onnPlyx{ZCcm~=c~S3dS`ByKy`rC<1O z%C`l(*Egu?q9VkKE?tge>`eSNYe&Pr8f{Kuk!N;k(h!nqXd_ zRyr$aqtGJqF96=d01D=OPS0s}SxjoKax!_Yh~3*>?$mW@1`uRszH0d0@ow{8__Ga< zhPMl4m4P7VfGegNoOK7bf4Kv#eNf$%f0a;>keCYm@Q0uKiS6P zUa{b>32GW8fsa&|d*dB3PnnBy{=KXl%Wtu$P!0}9UMoJ+Pzw=@cg!b9c8bdnst zagVKJ8&*lY-0_^&koT6Nv2xP-Nbd-kF4BD|x0;c-kO&oe`c+$-&y*MIQ)zNSA2GJ$ ziqQp)ttw}V*fgrWJt|Rh_b_lL{r&3Wy!WQKTWU0Y4olP2jmk_jD+Z#})t z*eIwI=~>Y&y^O{}o1`4)IH$+rsV?T&6sn(m)Yx|_YSSquCLy1&&w9$WmR&0McA*SD zSv+NW)|Jkg7{3!n;hlbBF;)CcbN#z-<;FIY80(r1W3H@SYV9uU+Cyyy(5H~R^sZCD zkx6r^Pd&0az`$qBQX8*o>U3mj?Mx@{DC6ALMwzZnqj-p}y$KN?d{JwZaMwQ+FFqH1 zLYD7Aj`ic-;r!Ux#xi|Ct$!B$NPmhc9w*BvDIk^Ny$i(lmcA>~U0{b6>^@_h z*O$-XJI@MR-amwOIODTbEgip>avQ%n^`**%Cek)^nc}q2q`kVhxQ0~w<95-Ud)Lk% z8-6_MpAs)+()FaZ%r03>0G9)xCcV?euWwEf@adb z7TMTB(MJq(wCd#k@RC8nK9%za?CF&1YZhD>OLU`qw*gBoj^h(_HlK z-lmDOtA|oUw|~qD``)#7Mzxa6u)xG6u7>es zI@gHW-s5ey(}T`yGyW1bx|?LX27Nl#G_Po-Yi zK@Qm?xuURqRWF(pp&h8Mh`kJ3K4zkdEBf^O;A{1$r0Qx{>rqM6&;uf1t&>k_K@}Ag z0IYIJsIon3L&&H~WY7b*4_Zy&wkbTndOW^p5UjuhRZM_4HDQyAts-+k#>nBiR4*B3 z;->Qb=rPa+bzuQu@=!U-JbjMquxZDibM zbB+ygI{ojM?l*Nc@_6e0(C)*NhJaQC!Ju<@Q-h?yq#!tczPNp%i=WS#s%&k@#1iYd0|Xn^JGHvc)_n zGOloW_OFz!KWNW(5V4J<&1n7=mc-3>CGw7?Ndp~zYTz_IKT?~-FBSf!c$Vn@05pDS z+DE1<&?C9K(C^#Jw`Ps9rM6@r#mzj~#nD)%laLEwlk}{4ERMLlBWJ)@(0D#~ zxhj*zyeZx?bM&u4eKyZf)eY^^q&`xIZ!C7NE4Q|{mdvuq3M&BLH+uA63PtvtSB7>a z_5$4Yu1SPTej(8Gj~8neGili>idsV=Z6^cYt$B~fo0}Q+NK?W)@}UunCeN64uTHvx zJu_3YS3X=DcCjal%lNJE_es66icbzSa$Mv&+WUz=O2S7(c05Z?zLQUuV|2TkGBc5% z%DV3l>Q@@HONARxOz~N|#)&43js3S7LoX}1V>qpiKU%cY^p!C*VYu(@QkBX&eLumM zSFj?FC00)Rz#_ISbekU!L$>+Jll_sq^{z78$MWJOf>Dlx6*RsgYsU?6`K{pqJ3Th^ zTub|vLZ9slxu{qpplGlO^sZ~e`hrL?8)V|Q<+x(16rPoBSeXnEeV#I3n$Ent#Gfe6 zYfa;MVmZmGaoBEV^D3ZYBQ{y2Zh+NWku1>_BRQ?PEY(IuSC$1)+P7O6zli4L)8yVx z(NWx6u}}c!x)w!0!%-V$Cy*&b*ylyO=!7EkQd-(x1tHcxdS$C-?Zj#F4xZJCsB073 zvGT`GoL59Zn@-X$8tARU#1!+L)n*+nY^Hy<2;^cgqdU2*gW^e+#n_xk4;*_{9}Q|( znvSAP;c}y;8Hrs%u9EZ#+^5(USu3;#iY2%ND zIvQy3>QZX%(Ojuwe9X7yn(>=&5$c{F*P1N~!buTH!+CvIJR0|%8{l4#s`#GcMAxse zYa8M{_Y4N!{N}n#t4$kN*H+)*jifTc2=Zi-FeDiq9#6Qgh*Yu9Qk~BexcHkMo2OgL z;<)98Nf$U+%V5-cf5uCFc*h=!%+Lu!lOk<7$n0vb?F;bF#+SZ7xlIpDxxCV?rTP4* z7Yeu?^Y2_nvt?`HkF!CgMAmm(m86ZBmfxOE4Qi@$8MR~6yienM-49of%5(_i^m>-u z4PQlTi^QE#KDvy=BF*Z8wkk(-}Fgsawb7>ETrT_#aw|J7`wW$#)=G&TBVwL-4-KL#}Oy$&B5-e~r?&|u$k!wP~h#2=+g;mhm2GFc|n^$3Doo${lB@;|4y(x+nj9MA0Q z@zm>rBr2MrE|#q zLGa}@XfEgQ#7IFb?QG+0YIFD0blv_n$#{EQz3{P-FN?jUq1!T(mjnHU@7BHVQ`6(o z^^Ypd0J1_DfzES^K2JL zlWz_)z~p-$LssC0-ARxDJ68#&YIj}=)R}Eydsw&Tdr1alk+aOBJcT};IIjBB#1>v8 zwOKS-qjz8Rij9(f76%t<6Dj1aYxk1_O%Qn0%ya zS$H*W-XkI4R2C5%j$e~n*7jQ$flHVaO4ktXi)!_#5;GVf>q($HjWw+Ib)bTRA!2q8 zX~NC(lZ;j9?Sx884wY8watz78M>91{WXu{#Z%U=47V~WoQ>2L zWL&|SNdt&WhHvNg|RvSDL57vt!~0 zythP?1h8g2^sh(M*X)Q|P5||;FU9`=5RQ>!H}+1`bTAVGaXjFn>C{h6(d%eSduR=IBn-#XZRs`ZduN=e#A54RQ9THRhvq&M0?iCA?g25UN| zlue|xlUK0+0Ev{1<|z4abCFbTHA!@cMZLIU-3h8%M~bd3Nm&8fILThMHQu}S$w}Li zeXAnPuMel%?vdjxP>eV|cYP~<{{X>KJNfFP${d`Ye=5lMZ>YdEwEot@rbk`{ddG-G zwaftNflOzv4rl}C4;@>N?W5(Z2#}E6W17vejOtQ|;!>b@ae-cs zy;N68;ca28EknN!8m;_4v$eUhSYK;oV-od}oRInpy-Uu!*h2sTJk#bEA*pIYlYEU7%GuHzWzn&x9Qn45Mjb{7nI@5NrzjfxO%NE^QH7M-eC zS_^az>Ki=es*S~subUWIlnfu@qy%^N&{}G{?c`x`nCJshSc&U@c(L}3hsLD4F;wFNO?RV||5Z6)K^5EId+@i=z zjP&BQjoqqiRx+y-ZqBA;#~AO$L#S%{PNO_F^Gy_u$2&&4@Gav10KP?X9w)JfOmgx>in;77xWdE^ z`r-a0->HGNp7n$GOGh& z1y?SnRV8K@*EbhSlstCHqPQOyd{(*BJV`CBg}j9kLC9RuT@j6uk1@efMHT&QetI$b z)N*w+>Aw9kfFq)$qJSf!q^4{%0F>Ni>H7^iMh7&Tux>>npw=S%x>6*z~BYnfmss z^Jiu{*B7eZO4GJaex8-JuHVS1n?v=@a}!<3eK`_y&3LM-sQFDK{hPRsB$2WYJ*%bg zhlZxtb;}5$5;HLXgk8syJ60v4#rBAnOysc1?O$?#!61KSslF|IPrKD;Sd2P#(n7n? zuppwgN9SD?WT?|Q)SY=BseiEd?B8qfU*M*nWu_}E(Z?OblAsd12Oq6^z4wY6#Cn?A zXqM<+Gqu>{8lLkK7r3i5x9-VmR|OC{Eb&Gv@RnlXXx(!FZed=Z0U;R)%w zu)J%b-D+~$wxJ|b1t$SPsqe+WC;#?ftvJ>0BTmBZ&kHYCBW;_vy?6+ z6S3AJvehokGj3H50+2gZyT6C__7`sU(>#O84gmuh#dRs+A%CEG_)js^F(6ko@_%Kq zNl858t#Zv+(K{YF@ry&byoFxjLIekAzH83y^y#Fv+qmEw`V-@KhvL`tYY71Pky{x2 zE5I*dzR_-2L5+Zs(ykF!EiuV?{f{g@cPgjm&2-vb{kEe9;A@h$owd2X&wLJLI49D( z4-9yED_DX;LFTnqL`rsNN8wpuf>XQNw@vQ%`FR=Qvb5a+p*w)!*HdX@8o-@5W16S$ z5~t2G(Zj{fA%o1$ILBI<+{6fvwNbsDq+nYk0~FyCISsmpYSkwJU+3nM`%*EC9!+Py zpiF@CTd3U`buHZ7Bw+Db(`t%`>rzVp0BBsXtozvvA9I>&7B(u+eKWHR@J&{kUO~?} zttCy$3CA?PSJJdjz-2C$WVUBbDmGTtD=uoU<;%@g65hn=)1V(;@iFaYH8dVAFN6Txex zOuCLaAcI`Th~S4>)CcyV6Tri6Bkf%gPDV}L9QTXAYI~myMvLM52z5u*P8-a21apt! z2hzDuAN&y1z9+q|vkWU?bud%qN6PiidFH(fPVoN#g+3kKKBWXMmnST~W(WqkO>g4n zd_>YoX?Lqfw-Liw$4vOCO(a_2< z<~t27bos3Q+jWB^V|V3QS{>9npNU#)Y>kI)Y3aWYH%2hvk4|fUN$?WeDJ!%Q&q~G0 z=R#IGPYokS7vWtkuxV|&_O3(1m#yX%Il%t_8tY;NjPf&3<8wspbGpnZx}lCnU`Q2z z$Za;$d<~zetqpHTg8u+d1;5s3t#e)_ww4VoQr~dmxm@h*btqjXZQA&nO>Wt(u2ps* z-@zx5ShpJZOaA~RK*On#ISvj?(O{wpe#G>(MslbT|xg)~h7jlAyA)X|AMZ zVm!6o%}Q1@Q@)0T(MM|r>yB8A)He4YX_Mp_KzaI7TZ5_PdIj~SuB0vI@}n6b_U~Fb zluLa*tS9$tpK8$l)nwAiwMEVcddt)&8TsLK`qF8!#c?JYWKUviH>ip9v>I|Qr!B;W z?qXO&#?>Q?de=dtU763HZD|eEMCL&uBM<3VGf$_b$C4j>(RCp3YICc{cNdamRZ-X+ zRxfizY51qa`ieg6Q#-yPa`gTrmU8(EU&#CZgP$**_#0sBSR{8+xYj(2pr z-UioU=}Eg9!p$C!g=)`(dS9&-RnK*c@Z)SrA-Y zT*ol^R3C1Xxrm;I7mU6iS$L`fZlrsAy|@y_0VH~JUQw^S!R=o`avBi*1Md2Mo z`eTlswe6Bym~5S<$vHhM6H>Cb@f=XcbfEcJBXG}JEzZ|-9=e=fk?|+Zx`NNd5u_KB z#pZ=VN`c37^{wdGUe3D?k)!z7E`JT6Cks6U3I1xSC~fOSf_q_O5$F@g4Vs zNam2_oxZhh-W`$TiW9k{HZpEvXix6A zs$$g1C(L;!uj@T4It#xn^PVUy)V8w%9(z!lTFR{FA1ze=*8w~8PqNjcG8L7vlj~I& z^D<=Yj1L!Ed6Beg52bmRi2Nb;DH{6anWBw>BOQ6Ka@K4j)GdzE2YTYKyfCSD&fhQx zk=WNvRgOt6V~m@`x=wAOh2&XI-Z9@b)3=D=MT#5gO2l*1sGxWv+U`=!ia!dDABI+X zmDbrG81*$XhcQt1O+jWSQTAoZk&t~wUa;`nu@4~Pt=n5kZ{@^;DG&+{I}R(T(`{Bu zFW%sBTrHPin{0Ez?Vd=Z~B><4Lb; zi>_I1VaWBQ9EL6B-PP){1`D|7AoldHB>3z#FR;xgha$JLk`&xoUkvyi>(U3D<*n=_ z5y%eU&C>&|c$de22x-3({vz4K;#lvc^4=icM4MHB_RVciVq~m%PNDl_>pmIO8%-V= zwwC33-K$Di{!5S6yRU_RwME~FZ&n{0+5Mkz9>sRkJT05e&3_SZJE z87@&(M;QjaUS9xP+$@U=b6orUFgkp5Pb{k%@&Rn%`&2mC(#IOQt8T%@D($?UYUB!% z+e?Dr3Fb1h=Hfue| zeg+L`=vS!M2@`M!6(%P`szDc=i8Hq2j+IMV)1!t+jB*}9&2+EfcDmA|o&mZX_4;+L zXT(o!X>}STGj8W6Gyx8?aTbvra$UJ)I2_kM;$I%Y3I&ER;P>XbeOA{`OI_X}x1MMv zU5K&cD(9g&?O3-y6PHNRUR@$DHr`Q@9x~umwrdTEye+0l;%zzRwnPCzCkNWOi1a%T z66$hWBQjhJbAg)K(Jf!Y(3#TS;@zcgOP&U5^!@~WX5pI3_SPw8;LC%w{V_)|MoxwB z5iK5RZzqwQZYppMO{UrSk4ac<^yH39M39Zl0df;OD-O+84dvGd>U_XX+jwwU^yain4< z+yUVH!o6qqF1NEj5)Gu=pbrXz#}(k8wuX+wLl;_pJRhTDg+% z6R`>pty|Tm`$Hz#Ju`z*DP5XDa_D9Fibl0ugZkH<_@_6>!HLFe(7aKlET##BszPTy zYs&S15JpV4;aQKIdVNh{h?g$L-pt^yJ?O2K7u@7^JdR_`qs*n)J?Pjy>-w&&&lmJmh z6aZ894|-)vqb7hGuzS;y2HKG#80MPiV_;EhfQCAX^}ox^snh^s4sRinty zHJy6<2^|e=PZ*9Px2<7n88dUua@C!f*5@nZ3xRJLAlH!i-&`mhEBCKc_>5L4aT)z< z!aQws#os54;=X4!#3-j@zKuR(n(+p@WHK(}lU$wr%*3`y`qlkT;Qguh8pGA~GZK)S zYv3_89Z6_*xcf6NSiW|Ih**Q)6_cm5itNvmQwdv8xWtDDIXL2;RqdM=Yn5Yxk($<& z6k*KFWiD+Fli`1Yu0ACAyG_z`xID|9PT*TZ*p@lR@-_SC{{RHV{gPq*o4yvM#{On%9_hs7_6o*CDsvv!Y9)I{j}4!~5A&$lMOa=c0Kms5|y zqB~jPU8C;D#w!5ZKqSA%%<sOQGtoZJ?w+D2`Ir>=_CIxgcYoTCoSj_l&pMp&L&CGG`U=RVuoZx%Cv` z$rGQry1CP3+o_j`3Z4y1?UxDmH*0{0=g9lDQ^lIq*N7#^NYrDpVxjQnvvJ{wZV6bN zN(Of>NXPQ5WNi}GrDbC!(@2P(Xat-NYl!hzjMgN)vblqFGN!|o;|9CCO;bd1;@2KbZv1qwMewYtY(q}@`qw?;?Ly=2&Me`BX(uPk%YFu` zX!@PZ^6a|dN221FF_fOCui5yH31is-Qb(m|MR=tF-^m>-&b&Kvw)b4I{7rPw-r_(( zBp*t+JF;Q9w?3d$e5W-J+eDcX@M(}ZxKZV+XWUZU+JtfEj!5GiR`A?XDPCHMc@d`3Nh$Sc}AgX0cn}BB%I?l-FWWi;nq@%y+d#| z=DC|c41aCitdlIE!5j_;X)aX~^rE*(8WK{deJo$B$EHqi!v+_qpb%eUC`^ zN2f~KJWyO}st)&IhS`prk8ZW(Gi;`fHM-xuc6=6PUw2I5w2 zhbQ0Cw28%2bA!3~f#BZ|Joi>`T3G75d7B|1zouKIKf!)2(xR27u(?rlxPpof4tku{ zZn@x1A3@MRvoCc0M^TPWGh|t%{8>RYx$v9zXEypl6zvE`9#+-V^7o2YUDsh z+UYIszx zcBU&cRn!{56_ju|;8lAY(Q$^1oM(*IJcS(%tSPkT2AZ-eJBV?XTya_BQ+SsOMn07# zgvF$0>PY64qhvVlX<2Nvvv4pShvS;dw9{rw=9*AR>bX7pROa?5=F5|~d+}Eu>|WcE zkN_XU*0MG;@6G+!{C%be`{31kTYETLH_{Y8LTbb|K6fygNcTCW-CGET3iIzk8W2Zk z_FdK%P))pXGjPrM)jLfV>I=gw*}~D2(732=)9oQ+y4+55$kYrYXOrKvl}iLf~Kuchp? zkh>#yC1g8T=bTm_i?q8T{0~(WYdK!PS*XXD+ z@Wqm^*CUGb>k@CIo@-akOmd(e)$qrK=N|$*aXn6o524j@++o@y&0=X$8VX8;24x!{FkyGd#=0KMD06Kh2*=cAiO} z%{TjimfU}Edv~SKJ}%v9aG13M_gYd63&{o@o4DK8^siKgF=ZT!7~G)rZbfn0?||X) zY@T|?u-sdpG9*uyE#K`gaZ$?StbgDMn)*fkmbqgM#-B2}PNCC05CI~RQ{ue0cP8Im1LW&+tF{t-19Zsx(~Pg9(U`T= z?k0qm9qLqItAmQIrfLyiz|utGMC{6P4NSi~W~@RiU%v$O&07tXBB`~=Swi~N$Tl$f zkLyhu!(%^DwDXTj%DB>5GC=QL9oEs(pq&xp=hB%+EhVdNBL=Em*vxJa$DWnY&uj~v z3WedsfB-qFgR>Ns(OE7eSc1srq>E1bXWtuvr^}}jazVhWx?>Am6$fzad9At3xk^J# zi4~V%2h$awYo@Fh*<*_6V4W`RNSSbdDyOThrL?(s$NUQva}SiXg%}J0`BdpI%Y`_q z_E%P>E%Mw$un+Hy)@G;i4@J{wC|tQ-yI(bc`Hq7wmQK6ARynN8h#oi(lh&Q1_^!{y z)-3u);ELN@ammeHc*J%@pybjHW1ssIPK-mea({Sr_pUoz(5~UtP1cQN9ptD%+{6RN z*1aQ3wGv3rBIh8AhyD?TwP_@=4q3DJjzw)xVq3Z7J}&s1ujny}CeuVLpyO+UTyB%` zBgDQi-1XvO5wj6Pz34Ep`o~EWosL8c6UU|0D-OB06@=x9RRcq}U zT>{*`pNk^LC89Yk`Bd;;vcT(cu|WrM=--`X$>PXtW-(YK(-u7M`M|6txHDASB+zaL zJZ7M?jW?eljpNg;2`q3!<=ami2LAwP99Fi8;cHl}P1LOH{{VXd`u-G*9_L5ly=PQU z3P&0<7=(?%Ve3!3YiY`Twitws(4Mtlz?0c)cQn?@0*T8)N!YG+X_0882>P)h})A zmMy~7f7P!X_Ns7rxcJ+|2GUqXt*S99(k9mVdSsgK^>DVn2D=_*oRIkpGafe|$28HM zU5}e$)U7;q;`_zAu!>n?oG+Nm&#zkgNE_`k$|be85uio+m43xtNp# zt7f@f3qp$T#Dncft{F@6GAY`vmZv<@N9V+_$@jC?oezlD!#4`~j#*W9anBW zkB#(*XYo|YX@yiPg&bpnT=$Kk{{V?_iX)O2n$x}2ms#;0#p_6s?;x_1jB$>Y&3La> zZ?qF;%OVb^8LPw7%>}Z{!!*1MSDtu_!a7%kw0oCW zqa9h5O^zIVKwlF0s^;!F&73&$*KbDK#TB=p{1nkOn|#{CsN2NExGyUVlgZ@KTce6k zQfeu_aQCCm9`*f7d|2?Cy(sd<&;d-ks(TdH`>g^rOo9Q@p|NN0>e65Z^E9LjCG@ zm_6wg2xb?VNWsfgbKem)?eYF~;r=ny_cP@8 zuJgy*&RUu^#X!6yFzW=o%m9~CV%{Za_yvC`q1+Ceh%?n;1H)O@G&tueJ> zO>(AiQch1)ew}~8D}QJ6@W0?bmpUmEPST9y7|Vb4>*+m8O?J;!3T9`3b>kIZ;M_5I zAHeq7ZPEx5J;hEi4t*8=I0H!kzPZGE~m366%=-Q zj)?-=vjeo?_O3-OQSTlQ`~2QIbge%YYa48L`Gf+!jd}gIi<3{(R#@Gi2cG7+r`~jQ7kQFThPrb4hoEl&0TIn zS2*$EIW(O*Pq(@9*M;J;?4{H!-*%Yi$_=0KuAjxTPp;{5MFg=a9gASsEudZ8*sI#R zMov#t>s>Ij6ZdyLOTivBO-Dt0E7k&eF@kCz66>;fMN;1Qd9lpE44ieYM@foJJ^bjl ziC3pQAEk8KH;$q4Ez+-uVGLjy`+>S~-nr_h%v@TrnXl=wPj4N}5CD=4vCm57Z_IYn zje{9Jwe3%=L*kn+FH43bvA0}G9Rj%@?26-jPvQGJxsUdGHdn4!6`h%zTAaOwl#@rk zJ~3Snh9a3H4R#K|DwV#uZDsz7Ah`2Ac5zXk7fETp8PSvzfyHY}N2xLQcRRa1S{8(e z6mK5&Rx6jhmHyN*u;5oOq3V)Zxsk{!$0Dw_u`A2D%Hg>if30-JO61B&>62=XDVI2S z$Wc`E`CeXF8oje(mTscAQ&uxulqI*o=ZdQ;Z8fDkZyhR>(H!%NvtotKj@JwhbIn{6 zt-Xg{K%!M4eta6MENtZT#R9oO?~KghhB@`DjbaU{ob@%gaU5v>04O=frE}W6k8w80 zzgo%4Ns#^H9xDa9zQp4yb357170@EP8>OK&qtFnw^X~O^Qyd=B%&fje{jg z=O@~_={F+>B^}Q=)HGRV$-O)uYUeytqps>bm&##&%0n(SMdW@ znr$It)nae8NEaSh`9gR6YiR4BqU^Oiul^Ey`20_E6Gm^X%kd#Qa6XlDbNuUe9Y`!+DdN0l&&3i)s{wTWX#gG3oUL`5M~-dm}0BN9NzwMSqDs3GLdQ@hn-w$tL-Bl&wq zcAoXl>s}^~+E5^A3C(1qZOtUp*xB(sCV1P*8?t?CCrxIzfGneH0&`8a@l&(_u;bp9 zZqB3o#lYRir9BxW@?PPFD)pW3+1D(7@Wo)<$YFf9=~mw7&WQqb%}niLqq(IdKWRIG zr>3R$6e><~D?Rl;u|xxtlhYNOscL~7JcWq#9c!A*)adQ}V771^AkWsbqVXL1rS90% zgYQ^3I`nsE{T)~jaf+JDQXRx7LCT)htpqW?(-Cf+ z={q5*CTh&997@~y9Q3Ey>oMEMAePujN&DNeS&5FkLn!^;;1n_32o>%hv%kjcj|$xBS_g|v zsFq}fJdoMOYMfeEGmTe!Gw5+LU+c(?$CfbPg=}2dLmls(5y+4LzgpleJW~`JjpU!a zf3!%(GNT{@c+GbDICJ4WGE0J9LhM+BoDIjVLAsKA5P`Z`6#CR!WGfO%$I_%@`{`KZ z0C@MT=rvJ07+?-wLxIOntxqyEP;%IJh@$?{(wZBD-vf?Dde@&_d^RR0HYBy2B+4vt z#I4kf_RV@V&Cb|OyoF1}@}Ev9(%@NRaJUV~p}5Iem^izhFQ)jC{{TePCR<3#+(;DtzGAZymtn#a&2cKJHVTsEaz{pKU&kg@V%76<{eo!%{c}+V_%tn;9W&= zUNZP`d!<|KvUvXhvtn^Ek~TkSayw_K9QxGj3tLtA{{X=bTb;GS?vY(jLzcvI0tG$Lw6NX=6D_F@(Vxp|IHQGZj zN>YqdntGs#L1GA^E7Hbsl=hmBTX10*|qiJ>ZqnIp5rM%Zy zWu;An>zdB-rjRb!Voj%>*{+(#a$zOaK|X@BrqLHrye&I$J?Q2Yj}-Bao2qzX)>HPD zD(%M@;MRY`sUp0%^EKB8Cy+&YUyi&v_WAbB%xZmWjMh9JE$36G;Zz=bRdTbPy-xoC zz|&hq%?_1;8#YcoYq^~^K&$IsdGO-MT1bU5KqGh7y%PFiBC94q_o;5eyC>4D!BM-R zt*tXpSx}FttZgS!NTpFIZMeq+y=ldIZ2oWy#}S+u?~ae-I9m$tG3!Tt+JiV z^BTsN#WF`AWL6-1R^{i4G|4Q)inGQ*8Q!?(6{W|_j6H6~YYEKO9S1!tF3Vn;Ul1k6 zpv6jnzkoHj4~lIyBElJ0Xzbl;t$5E)N$IPi&3+^UDLqu z$UC%P3e$?>_fpf^-%q`_jv_EWdQ^cyn~N=Ydj4%D>R8epvX#NP-O2XHwRKZ?mrvHb zEcSZVq5I*030{Alc|`vJ3vcdkfw|OoMI!(f8QXSiqtP^-Q%Db|`F6fTWA~GN{{YO2 z1^!jR4&ZzBsBcq9=#GwZwz_uT3C1pyKX*HG?O8Kvmki?L zSJTFjta^vv{uRwX#oHeTMBZh-q8)*eaTf#ir)i(IW{0Wit7qanO-4xvbhh3kxjf8p}Sf5yD$;>C`&;5)nHX>{M&iwI?pZU;_lUtRG(hJGSx;XEsI ze`RyQ`GJS0UWU1E6MQOqG`e z=Dyg_ym=Ldnvm%SGr|FE9@X)8z&NMyC&lZ#XcZW=xj7m3udKBD+ga_^SYL(rku9$rG)J?(kDTtk25uLMN1zHe{NXcY7kr%Ns}r9=cg5crQ0Q)ozmXPxrB!q80}kH z$BIzS{#bY;myMupQTPhuwOebq)OXtC#N3{G*HG0a+KG4l``{DMn z@?)<#%~T9#&J)0Y73`zaBelA=TZV~oo%qES*?7wPN7n44xv@(%8S==56daBZK}B!Q zk;>ric-<6HU)1NslSB6@)YyLII)Dl&qJkdbQjVgcsYhC9M9cSS-KnYfX~&?dhK#80 zDs-wh@@y@Ny&rnd)XoD}TbH^WPCvyui$){_@m^EoO?by7pFbgUUXA06jfp7-7_SuZ z)%zQX0Q9ex%q3>ePYtofc(=q-+~ad*xIJRwq*7Stn&|vNHxgI!=>sEb_?z0J~Hf;ONA^{%yw-+A+K$`Xb~D$2y({RCiJukX z*1TtVZ+gg)G^`?2Zx#c180y$M+Qm&E#n zddG$Q-9Kn!gOT*E3qWWsuGU-WluMkpO?e-Nzi7L!5NHMq7mMzWjn7Jfe1CA|R(X&~ z+y<_Cl&=%J+H8BrjXXtTE|?M-(4Dy8*PmFGS>2WQ2Ci58dTa2b&fT8C=DIBg648?T zz4O|NPYvYY4=OK9w}8W9K->KT4pwh_r_wgMnDrzBDU%5P))V#Y`zQ6)IVs zrkyItpS^tkHG0+?HgBA*a(Z8g8cCwz_%m8J;vbRqMrVXnz%Edx2{lXt62B%m}EZI~P|| zlGAh@PTJ&uY(XkV7auU|Ofda}P%^?cqi{&+UazU%+IWjhD;R}jUZqIqHN*I~Li+@9 z#~3ZXKr%V4+q)t=7Q8X3c?=mp)IZt&u4kx)vR27Gz&tG`CyqVBFd20IZJ`Bit&qQIO*sushdRWQiOiTmhe6D<1n; zw^o=+7dwcc&T8f!o2WCwBaW!f-)l~LUdM^X27;YZ3kR%OQx z&0e^;GIbS3bCPmJb@LlC3zr9_S9ke2sV-kXcbcy6gdow(VJ(U`mwrsRJ;rMc+!=KN z!6WHfx6TFPh8fD#Fu;Q798#OQ6dJjpbm4bw6b+<|=Cg%|+3v9~AR5)Vx(#j;-Isnn zYcK6*%wZ?z=}MGt%Bd|1`sSslSjYaGG*O%%ylcrd{{Y%oPw>QP3VCxyH2z5d=Wkwr zN?(tbw^smvXWk@yANgnpdho9Rd_2^(e;VIjYm!Aan+>^SUD-SLb^NQrQF09)_ax?c%dRMb} zwg~SotnGX;Z3(-%Z@nV@+;#m0dS`|-$JAuChU(r05kjHD4hbFWLq1ZsfII^Sh4ia? zPYHn(Ys1U;zMQpE_^0BCEbbE0ZC)EzTo$)%IL@G`7>_t^$?ejv4$kDb=uz>d?xW(3WmCZGCEKYOnj!#W>&_~lhGX%o zc!TV|A~U2aGs>q=sH{C(#JazX?WUJajx81h&K^9**ax=i>^>XWTIre}+Gf>muCF(M zeCZT}$7<=7OOY6zUYp`eH1Nc!E|Nvi1Ot&y-HKN?>dW_9~r%n-=mCJwi>#5bQ ztls4s)HdFy(zI=4if9z+GyKzJ*CpYv7tdi5+v>*LobAr)>CPo!5R4x~UVTM&bn_M_)V@uzpTezK zYhPou3daOhX|&I>+xd^idzz+@o5+Ln)QnVeiB_X>yebYFyMVnp45fDx8k@ETM@bJkxD%{L*~RKE3NlOtup% zZsV^evz$(zVwKgGKe-1U)q6&>WO3(%_|=h0e26VEOGs6-^3pe7j@Nb zU*@;VMpnJU;upic7vpck2~xs4xG!|Q+i#Z8{-s{5Uqej6v^fm7P0JBfUYf@86@d^I`Nw^+bu{aqc-m;RptvwG|y1W;9NV|Z1 zmj3{{kdNZ5U07p5exh`gLqO(ZgEMNt`s?noIGqpI55{{Uug z91K!2ZtUmoZzI0ACK580Pi4);;8zW>_9Kc$bhN*TW5M%tn%C5>BC=Iw13XsI24L%d z3ZT@kKHH;2Al0#$XX~-CjDUaFoV zc8E2$(#z0O?ll9cS`^h{jn#+UAk&mncj^e>JU{Vb3wuSA#Z0!gvvF^6A>wn~51_8Y zMw%T(7HbI+(owxio}kwq;*W>%$vL^vWAoiPirP{8ls>>$FQm4y;qMW7dK)>rkQrr; ze2aL;RtkN)b5YFTz5f8b4`#TEW$Z|*(%DIOI+COSIjmm?{6|j^U3m^dNgoVY;Ysg; zde?3(!z^sLA%{^~Z>WsxjVV$NNZnZ<+0s466rGu_w&O>4kEx{7v@o|SB?MVY z?h|X&PYjYaVaUyOH$D|xi8B^R9mQno@r@mL8K#7CI+6?7iZBdR)(40*2L2T|?Oj!- zpZ1HUkx5`lJadX}rD`R(RaGa~0=hY_j&`*(JQ1h=0B2e=+>hemn(I}5-3VyPUh5q5+#wyg?OlSj~?n;%Ke_!87@KN zDhCzISj<2yyLsoWZRs8;Hc*%F#8FL-AJ6JNaf*E7_Gq`F_$N}1WuAMroe0v%QQ=f-?P>`u?@2;Exm7YpxEo?-k(w1UO9oHPhY1n&qgARFQ4%k+K>l z0f_u)=D0X=o@4!xzYaCP+T$Hs-r(S#a540!Yx+ln^-W11Ll&!W!_8}DbGy`>A4>E~ zjYmRZ9j1{4w{E>&<#Gq&E6%)K@K;RNd{%CCi_7~6{Io-p`xqj+aWl=yE{*6uC>oOz5JpTJeGhn^qQUqgAM zWt$8D-g4N*0C)G2!FOf;l2&i0AIiDOwB=IgO)YLo;N zId3%dl0`Wr)AbE{^G?z>#b*;ofrr|2oO;$3r-&YF7nb7MGUK1RayhJ~M2&A2YFbXO z7$;4Pf}1geT;GMf6XC0CsRi|f7Q}&tVr#qb-jbdv(L;#gjECFF$MdY86?i8|v%O)g z%c*^*JPTpDe?V&Eu_j%&!;KFv9|Rlj&N$hMkX}C)Q-s{{U!Mn?O?W z0({+rJnrvbQ)*hBrPZ8wGsFyTp;Q8X_ABKr8(y~feetKu*1}A07`n3@frE|>eODMo z(BLp4x{@0W&N!(sl(jjl+t>5h*rO`vj`dnp)+alynapFB0Y@XfbT@Y~ObWC}ht)+@ z7l~oQmnFCZ92!SuIbJ1ucwYM3DFdmdNu_EsTa|`pjC}=YF1K?OTUrPdA3$qAS-oYk zW@#ON-K}WLm7LFW$$mQO8t#g)#iiUxS~K%9f$Lot!p&~`TG0_T35!lK)C}~lH{%AO zI4Z~{o6O*0OCG+}4}cBspCocQo-p_!SQY+t*D3P|^p6m%u!oA`aE3vFkU6hC__g9o zn}xN~?Qg_PVcGJi2Z8J>(QjdUdpRzp+cd7fD!(KjrFia_9;vDPNs{-(c50SzJB7?_ z0Uf&06=Y*Q$UGnLmsZidI;}pbD~Tj_8;7aQ73ucgD{mS~Z2UiG8ZEdS?L7L?Qui9z z@tuZ^hNjp(=-55$`n>o7A{b6-)B%bp0UxCzb)|lkiPo79a%z=+^+i&z-lQT}`_ee( zmOk`IaE6`iG&n!Y!K{s5QMBT;cj7*K)-I_p4O=;Tqv~*eI6H*7^{*W9ykyNM(z<^R zjU(bO#!nGxUlhDWt7tZsx2tb!4Hmr(Jyj`euW<)_+h zfSO4+h6JuaZaJ^dGc5Lxw3R+rblUrme+`14DwWp9$G$0)K^8r0&ULG-%uaL7be<#r z(TYo>rs?{{{+|dNZk7gg{93rw`%bt|_Fa|r(JhbNLR+6tt$dCqP^i?CIvp9qO9i~K z%{sNbER#ZVWha7b(*FQvZ-sLFT=*Yaxsg&)ytUc!dgjGb)toK8NTh#t(`z`~tUM z19&QN8d$FUjss+47_JM!dc58vl1r};#`0V_EE_#dc-Eo&OL%+Y1^m)@g5y-b@dOGC z;tMHm7z4oE$_VUhOTqsD8!aCEM|UQrVTCNB>fPWB2d3aF!ml?|-ZZ63N;;$JFNPi< z)M1>Z?Z|@EAG*VmE1vkQWbrSH?V^U|MYs$)d)JtFclM&tqCRe^{l6u>u`JTVrcX3P z4!LDgFx_y zAPy_7pGdZZ+DR|Y@_phv)g2A(JS(8fd8%7m2}E5Af@>?l{{Rt(inYZT5aI&IXUoPt zs-;PCnkucHpQmY-+IN#RhBuH7E3vb>xtiU|zA`x#=XRRxHoCGTt+hxP7~;AOF7oqH z)MoM=h?k}t8Lu+6El)y}-Hwk?x*C3#?=xidt|AR>=bBf55)|gTKOU*F@Px8663Pd9 z`J!Ksw>lq+TFufy6G^q3Zx}RFqMm}OGwCl5-pg{pwtCm4_%6v`4EW?%&wd5?vu|~7 zq`Ao>wS5clyHtl*)Au8P2sO`$!Wv=fHqFrlQe7~Ne8AQ}h~aOwD#(Xt9M#*4!(*y9 zk~d+o)2(j8k!x1!E@NHCjFqoD*dBw_hr*r>gHsWWIN<*P7kcP?L*VO+3w4SH3{E>$ z&jk2c^qKs~P89psS9fgJR|xzNzNVCworJbLx<3nQFt~|bJiSe7kS9OKgQlJF!?A^Q^WEEWk`~a4|qLCjM((4^1%X_+|r)RzHWW zCDc;lYlS0g;AiPtJ{<7s+{*8K`>~#BODbDnCosIb&5sk;aQoFbYGQiPu3F=k505C1o3d_ILf&vzePVt@oLV8wN zR+0XCyWJQmd&14Bn^I&TkT|TJTf`S5MY(Hh#J2@o?+n*N3dE5gIRlJz#%m*7_Ju)JoCQv`ADE7qKOQaDzvoRr=Uw41~Y zadmD$4WH7c)qF)3fokjF+esRB1w#fMYTmV~&UFb8qN-;dYmU}DZDFSBUt+tJqqsPe zDx`ouwTV_aeN#-D^HXQ>^}D)D)0|d*rEOuLq>17Cc7PNuxR6D6TD`uT;)`XHeMV_a zeB+ah*N6OE@dSEp=}$LNOKsjzXkun0o&X?r_oDXH8oD`eh&qE)T8E4#B~+v z`hSaWWV;u){{X#*8$sQ<`Sz%lLL(hccS($2*pvuC1E-~QJ{Hgx)&?#*jMkNwg%+Lj zJYa6;rD;Q{+gqm6pd5d8u$1g{MkYJiLve1=Ao6F){psoL#c+N-*Z%X}(!Jji?F-nvfdE$q2D>8$gTeW8>oAVkG*$HI*{c1s^!4yHV4Q1(IS#c-sV->7lh7_VXRUx%XAJacL!%ogQPI>tUy zcXQIT{y6v!$3f8TA47^2j$**FfD2%EqKvtwkrIW`@~yqa#FnDpQC!$XuU_~` z@eF)K@T_|xkL{Kim6(hlPPK!HUed>Tpw5~us%&K$VhGRSRD4?~Z8Wt0C^O5gYFN{zSWFs}SM%hx@+-bpOkC$FWP`>d*#_TJp=B;1dZH&noBp}UEk57|P zlg(JgTM@Tsa;*qyarstup{7CNtu}ad1qDo-K=0SBMS9Xj9>pXdOw`&%tG&v}6aMK? z?&tWa0mgW%;kDm_=0}q{m4-uG+e9|BZQmsI=9}SPix>VDne6Z4msER~-xM*Bt!Sf- zt)9NTS6Xjxbt{RYk({s?kLK^%uSwvm4NF9OFpFud+HHz%do5PS_cN}bSYR@7ujn{z~_w}!uHE#`S{{RfGS@ij2 zioymjx)#eydxE2_b$$~4pk-T2cy&d8D^Xp+isj=UPNSs?dfDj4dfICXrFp{N?(@>Q zEo)R4;n}K$-Y|<$uz&2?M5VKg9zm;~3ewi*&E?ik7mvNoSciCe%-cj{u|i@zxb^j? z%^F@iNux*hcV1YxIsB^Pc+XGKA(BMFiadh5KKJ2Vp0V*6d~b0iUKohl4DBQ*m6{_f zv2v9>SK=GA)Djy;-SYh8de$w&-E7Rn)}@x0Dl@$8<}f^xbIn%QZUaO@u;RKRt{kT~ zs0IYc?glF&>rnHh+EnNMc=sOv0F6oF9cC>m))_b#|UxsRu8PtUu+Kv8`zCR@p#=j(Fm}c$?#%sTQ^5+QBDWDys1} zyL;EKcz;-uSW)iF0?G*vPD_2<1{N#&QC9CrGg@ukdfyZ~@LtC-efkHGQCJ-q78 zBj*E(_8mjPwj)rwy73TOR|~i-190i>UUzq|m~U=k)AXA?LIC&;a)TrDpbA=a?R-N* z;x)h|9&=kzT^ zX|8ar%)o$g?Ot!Hd^MNBx9xFbuU?o{iD=exRYrX)D_^>A5nNlpgfE_JqIqV0y!7i? z&vKThrg-~Fk3jIMrj2_XlQa3d6;4mL=~+G)_{uyrnS5V5=>BK`dEYj1Tu!rfulzZ6 zxYv!f*fDvSYk?sH>0HeE_0Px6Br&to4=j&d1@uOIVD?L=(K+&beu~kAwLB(+wcHSAW(v63Q^?gpyREPyBZ3~FO9e!cP zD>6S0Yr2d!=IZiW)n~?KpK~zJaBD}gGImFc_|sEayho=OvXuRudhQ?I2EM)UPmI^Z zo&&MJ(&2S8GQz;HBn`FUUmZL(bKwh1N0Uv6G_f-V3O#GA{fPW|BwiYQKgA2c`Jz+v zVY5{{R*SFCfo2u;4*K*|aTvs)#YGYD$ z7g6me)KZ(}Aj9%4go0BEV23B(mr^$R{;z5yfPor-c^UxM=A?SjBBmKWvuu~amR zeM?P@9|KD92xM#Ep#$LIGLrz4tL2*IL&5&BXm zT36{voobN}a%xc_29k=a2zZ@`N_mvDSv3tvKh)A_sEm0?LyE)IB{^!^lkOVB)jG8~ z=@VF_?0CP&ZwuMSr^~3r8IJ94pl#~JWcjJqwSR8CDERy0f5D#&>oZ(Ehl(yVeJ15R z)=<$;I7b-=BPvM9ru=oan(x9lqQN}Lk(T9d*e2};oH40OM^?l z@QilNZ0RdW``8b?~3z9uQ6WzZiA znKi7U>N|I7AIT()?octo;}!F)Kk!o@30_a9>R%qd19(%#UM0{8BI5H^Z!=UbM&et@ zCOx2g=RK>`{{Uk@+P6gT7wpU9e;R7u0nxQxCt22~@-zu=8Ync_?j~kXk_08ZrER0- z8?oBHK5=n+p0_f44~Ijw{{Vudd>ZhUr{irR$4c=nstGUeEiL}XZFjZu1ZXk<+5qZ% z*3ZPR+XCD6YWS1jFND4m@UEX1g>{J1%Tim5AtlYl%#+0e$sFu*s04(O&rU1K?tf`t zAAZ&vO{a%HV=sqLcz)Ny5_!hwPt<(Izh5(XLX4}ha#yM2pQp3xf3{8Kj*Fz<{A~CY zphM!n3|bvFHJe$Hn(*-7XlD@ohj;LR-*j_CpwhcSQ;T-F=pV9w?DgP(*(>9}?Og_+ zp~t8n4ftnA)U>vdjlx<>Ecd=)JF}2>uO8LoSAHk9{kZ=C;F}&T_^I(fK()E?M}&1N zD{Bcfn`2`bjqijzJhfsOnGW2O)aQ=f-~1AP_O8?|wf_Lxzr`OK^a~wod*2Rd>h_lx zOc2JiUJwK0Kg35))#E-R{jt13@zdc{J{I^9@ZU=Ce}*+zw$(2qv(%n-m7$eqP*ldf zSw}hiE1k(CYjtDoAK7o=eZ)RK@E3s~)&3v+KJZV7jkUe^g*-=Yjj!G$`~262X(ZkR zycGFP0yaAQzdLx3!dg%4;rnNNP4M@DR~jadsiIp)<{4F2=Uf7PkXGiC{{RI`g#1JB zzmNVRd<^imz2jdAeVz+LajZzM5VqX0u$RasavAsojpTD)Q{oL<#NV{v$4?miNE%{j z5cr1SC7Qw+Own65U9hfIOMU!j1MZ5>qfR7LX~xIXJ}9@i@%Ehnu`gN!A9}na=XLZQgvOM*#oV2eTYTEtG+D^5n z#Gh^^7?*iIW_unhqKdVyVNzFRPXzd~N$u5icxF3D%K%8Pq<#VXXlpE5-&{mw+CE$W zde@YAfA)O4(XGYovrBK2pCv%sU4MssIvuzDnJpPd`s6udT4EAtbem5@>wg1B2EPHG z<}zJ|<*uJVwTfGfmmmTgj@99x2!147Y1dYod;atU+9YFw-uSO(@b&lFHOPd=Xl(AiT5^lhAUtS z9E|QY$7bHAL}j7Y2mZ~Sqn(#07=k@H8G3u=4?8F}smmW~~6|Ko`H_^@`j56pRiHb4d)**1SNF zT8QRfosKva&fPPMg=ar2@gER)EJxtQrobX1+zsbCdABV*9`BnPvPUGNi*-ZJ9-gOYZ`i3J35oe z{&g0gs;r}9fr|Ag#w}`$Bv76vGY|phqIfn8up+fJBBtRCT?*7UQSXG;M=W-+%{8f+ zF0Q(I?zbzvar1N5vh`g`ZHMfV1ui)PtWBnQmuJo-A<3xjETIZc^YV{M-kp}lGHl6` z;_fSd-7*s0a=EMz6BB26{{UvZg=F&b6p%h~?I+}qzo&xMW@8_;{=yvN5M8N|1+ zUPXOv65OJKu14j_uceQ{FAscWg5hUj9recyr~&fNwrh^@pZpQyPr1E<`qRbQ{l@lJ z7R?kMTAcJBCUN-H=qtYG5AeHJytb9E7gK^uNimfq9xK0HVjWXSn&!aSL5JGXPa3k3 z+zj_M-{`-vmaX8;2*Vw?mfQ?^i~v8Cas&2TeM%|prqyq4(9e>Ji;fSyDO$rxD#@8g*EQ8QgyBF-5_9Y; zFIVuiFT2Y;{VSGfoiMSUd``C(q8ppE7N7ITHXEM2)Yh7P>)SK%5eCGh$dB?&VFlEiXFEsmN7igMhl{{UL*i*Iw4#cqjo z>nP&W<2LF;Zy6)0uTb#K#8$RjNJQEOHwyE;3@X_W-9vF(dVZwvrrYPo>si)mTE)>@ z+~~EZx$!l?i0YbjD5rozf-zL@G^3+xNN(<F@xkLAlUTYq9Z)9|SEz>Q$Po~830__^(hUwm`Uus4_4aI38U5fnx=clb_%c{wz zM6tIZj`d_(9Y)kMbfcMtk{#i_S+tz3lWkMf9&=qzh+z-s44E6L&2qMSPnR&~sjkDr z`c`66PkL7waqZ)|kQqTFd)1Jn$F>~f(vo{$Eb;l%BAuaXRs#6Z;knW_PQ*NlLk;*f zm8bYbXp=MPC4qC3mfig7;s=@ch9O(@snSq`8_B3(LYjTv{mjA7vevbppwU7S>t_QW zcNIoGSM1rx&!5t(&wgf;Jt|yN8f_X<+O5=}#yXzWqdtzX>AR!O{{XIQ7SmP`M~*XA zCh-|~0t|k2l}Pq3GBxyQr@ORexo$m%D&B^xq&&JqYsaCTWeY507adnb_vaKFxtT-t2-WYO6EPnsz$c3Nt5Cg@!G0~dwATP%v_2Cf9c$=~ zQr&*v_LP*k0OTH(iOJ1& ze+~5r{0}at9)^t?NdN>fE&N{f&98%++U^+?mNBk6Q|@jrZ5m^37;iCl(sH=DPg&44 ziz|8tpn^^Ena@-&UNXmQg4N^$fGO?}U?OHz&wWx{KIbsA$p60L3Y5xET7lxkV)Rdmy zd_O%@WF9M#@V1XWr{d^g(-@-9&P94At8Ek(@W-Mbk)#ny2d{Jaie}Mw+`zT7mgYDX z2Fy2{AR{|*>VFE;wVkwh&z|UGA12&$nzIU9=$eh~tc*yDA7?(90RI3}SURQJ$*7kt z`<=Ug;D6^8GGk$Pd>;74B9>_RatBdWKeoQX6tQW|wPbC?9!RQJx{RrhgfNpggYpp^Sh8hK0Yb;5~&u@D3e-!v!SY1sghSch_ zzc4JPXtn(o1S^#=GuhnC&pI`^qub2P5#VgGlk^myE3n=}+^4gY~T;B{g&-qtTW%jKd^> zx15|B$?jU&F6^h=CZR{WZc2A zAKv4d@>}m0Kf_&D?7IEz5L@xOIfw@buUh(EO(x{LlGqH+6ySFEt{UUvEr*X@n#OO2_k?!tbj1V#o z0UTAc@E1b0wtHPGSiI63(%v-wwUv4MHOH#BO=D2Fc=N$1xnb*Db0eI$q<+yF6pM?E zM$H@EP%Cds{in2@6yn=cv~(vRtf2E%G(Xs@!nYR6*H@PXh{^rZRN9~H72!=r&1ARM zwF_qtff_>|55FR^uO-T9PvSij!~X!aBkI~q?bYm5W90`Gzu`}hFzV0?eM0Uxn|9@B z+iy>$cu$D`0AbBm5eNJrnuXoUE_ZK5A5N9rcyr)ZtKnN)aje1-&?qu@&MSuK>E&n9 zdQXV&HJvQU6RXC{{oLeMO!jbG85Z_4&Pm(yl79-y@Q;aG!ge^V1B?dE4I z19+OP&5$2H5m)8>>KeNlt)P4X*F1Tp$A99fW{|1dw0ygibBtD>{4-vIB*l%r=9o`a zYllq!70zl}zNO*qH7)GCNvM#dau9z?x2HwoFA)sdU(b4@_~hWxupJzK3N$YS+B-uB zm=6sjNLxAgHC;S4q+4kzb>Yn_^7`a4VDURTsRy{}SG1oO%e|mOib)usiqwKE@>-vX?p@!o_3vP^smvms380}T;G?luymj3`= z^OEsoWGq~&x{iPjm51rh@IH=UM2b(cgYum2I5neju3hWl;F2K-h0B5tcjC9j z#X%;D!AqLyjlQ>vBlf5{@3D?rvUMAk)W3Tu5pDhwFilIVUOWhATp17iv+Y@y*7Iu; z`S(A$E71oa*B<7wrq-ihPm^0DTPrHR4hZd6ue>Y$rKPQ|p4f5JW|^$(L&KUwO|%JJ zd0O++@lyW)O1^pGT&X|aHM|wJAcEu}LPyP)O`6*Su5z04;0De0DQC{VU`1E!oin=WmI&zwt3v+B?@j zZL8`QT2onCUR}p#?YW>^i54b4rZ9Gs?nQQ=5UdQhSu31oxS7z$Ce!O*3yO-AwLKqc zC_N8w{fB>Qb^Vt9BG}#PQQm)MPjEid>tb9AxG&Hol zwlZv%GV&&Q!(+ZH@T_uv+(KDW2dwbf;cGR_MK zl}0hoO2ZSSG1AqZMWBDdEIuW8qsF?W--ortv9Q+EMRg1&;y*P(I1jQwt_E8Hfdf2O z*B%Z1k9;fe6X8S}R@gMht*@S5@Gj+8e;$D$&2QHO~!cQA>Ne z-Yd6EwYfY89Q7S(z83JR_;nNd&r{ryqp_ILmJgX+I0RKH9b2y~5qh z{#vU5N|Vnu!pR<;qx91lw9n&^XHtf z1taG_%vWV$@Uz1I01eW`JR@&ub#ZREp5;)6bB?5%%B!**Rm?Ai4W#%pMU5e|xV5xD zGNULGuh$h*RQ;nZKjA2z+ed=!mcs-;7;O9J+PE*;KjI+MH8EkJYV8gE$^el^>f8?A zwa)k(!}^DVv|`>Y^C!Q$03G8cvF<7rE^S2W@-x={C;0m7#M%;HSw}NX8B!Oub3PmK zJ^uiTZmjP7LkE)f5^qKd1~Kbg*NydG6G!2%_?E2Nd|6yHY^OhmH5bBtd&Js+hfmdP z=e@PNV-&Y?VSJ@I`LV}JPuyk2^B(ap#XV-nOaR~M^II_g093gyKT3axp62Wu+c@P; z@~VEc+UgYnXmZ2P?7|IMC*~)wP{{jw9PNr2}yJEu;7ZFyd8Oa9BpwibAi-~&HJIu zV12UE#?TE&W>@G%Xna4_Bhz*G<&s0?l1S#0#GVLtodmHf^TthPYF-_x~89F6M^KJqhql^Fs^=$~Z-V|O>V6Ek zMb%`N%SOrEc*S~6x5eKMd_~fvveo3bH;uw>2RQ!#_0p6}K4|flpxX7sX2i5HMA>C? z$^5HFO1Ki)M%ILdiEzq#wQKxK_;LRL2!;DibB2OOH~{2&_O43ONf%O%OA`@nDw zVJHmgqHW8$xT`krzwWRY^{nXcM5+6-DfZU$NZ-5N`P9NTWXOH|Uu)s9!K$NANCrUW zv`w=Qybfv6S(k5|ab0kgj3iRBw)0T#9Oj|a;Wo+ZTaj4=91gWlQLr-b%bM9v?1vMQ zye8!t5m=K|Ep!PaX7d$}>h3H&G7E>;3CDW77LqN_OlmRhTgGM*iRAj9fZW`9j)ad& zz`XD#o2@%dbrsd56aL|vQ-BYz2im=(TADbQ42#maZDxB9_(XoiuDVT(d?Vvn0|erWcMjYm@p#0a+W8!JU}$~K0sYU4||vTyjD2bMPI6z3nEZ_4*@TzQvj z#OFMksjBL;UB*?DpfxK~R;*y_*3uY1(V0tscfE7TaV@Ne?ZJ?b;XO@BcjHS<3Q{!- z);C0u0Yk^*imh|0T5FN{`i`PfW6Wwn{{RZnQn@azi7zZpqi)wIL`(r5T%Ark*EIK+ zQ(TymFu3D5;yC!6&wR3f=L4!;MBO>2(XXb%26C@FSY%bX(MGrnQ1{B`0qkYHwnr0n-|u~W}A)oDg3EJ_x~9V;11=8%smZVhNb zZdTAJW#c4OJ1tA?8mmirgCW5AdQoo-KsGVWLuG28+N=joJ5&~GOe4Rz1Jbsw;PRo` zg-!)$Sy{r8fs{`#)7=-Qnr6gjx+xcUTKrCDGt*;JWOArOJPBGSy7eZ`=M!<&^SgBUzoK@?9 z(%dxC3~s8|S1MG10PJcQ2^*kNCdoaqRPSGp-JD{PQQB4~Jt>mF(gHa-pa`SA@|)%) z(i_$jhTI7Brc0;3(m*{amfCYS-Xv7YHxqU>;MDh^8U1Q&eL()V&Z60QygdS7I~o!F~UY7TBempJ#Sbr@lq>M3R;%2Eq` zDHFvzJ|CN|MX+2jy7tj!x)xWAMnI{_S>!n>=)({)WS$EEp3LNGDGt`g5dyzsWF z)9MJu9P!+B_MjX}`rPtaYG>`J4oSfSpsvHgI{m%hgk;ifk%iQy@Yowh?v+KNw(+dn zZ6Z?mC#EsQVfYhJUkUt3lG|E7Tv$>!bmp{19M)%|ct1tD(ynbSqqv2ykYGqNwSK+p zv(aF+w~kp=kCq7z3FN+cBlWL6@V2-1-xunaHqsLXyowa|8P7`XbsbYrxA2M^c^B;x z&N>60b3wFZXU5RmYPz-NxLKf(<^m7g;C20LHd!FlRGl^{S|Z(l+V%QXeS1yRwE$vm z;>J!SIT#D?TDm2Knhmb_#_L^#XFO*WGB#SH2KUXq5gZREL@Xh;S`+PDYrQK>$mX|;Z4g$5iFDZ^_cn2Y$~fkLF5P@T(>!Bt z%XYFwAb&ARe4&rNJ69Frp9!A_>uq(ZLp8*zL9sT&2@_)(liRIy`Zm9JJ=u!LzSJc~ zJ*#h0x45~mVR;#S%g%6Uloa<7#c3Wsmd@0{s)Kzbr_2&T%ECXo+3()E{{RMFTX?F) zj+-J$$6nRMYJLlv-6c;C$aM9Q{K*kN<*DzVsN$&T`qOwCJvTv=PD>+4??@|v=b6qs*B(yV}Ihn$EivHd!fjm&k0`=f#wJda~wHSoJ z$e;}T#-?u%{{U!NzuO`J=e=6F@a6D{Q%((x4gnQ@(4S;KPQMnT%CnAEBaPjwcSF6q zWn(kKsm>L;)^?GjUg_5Px{U6}d{yl>!b!<%%&TtT6WX(>Qs}5tvo$o$a`M2s$sj7- zHlCDQXp&#twCM61f=hhNO5?pc3rL}F-W|i#+z{8HI=&EhUo0UN&L-2K9j0h4>Qh_PtPM^2l3-H z`Nhgu8cv&}TQ8Xew&Wf}pmSMwemIv#j^VV)tdi3t8;rGbf{$*A}$+}ptfa_&5{pllDui_LUK zz+SqO>lXs8SYAy8MYTKGZk}EMW$T{ZDlJRGGo3g|9gK0esA2vzfQ7W^?(NL8B<~kf zwDV51z0mXxFwb*gdvYhr?AomB`I;>B-9_|C6)t6ffsdE9N$}#zOF6URuk@&u$=xr1 z!m0soW1PM4bPn&R=__|{1e}=56><3*`Tqd+s_?u&@QlTGY3FY9@TOCe4i8%U4_nr3 zW|PaawTQ)zfN@_u{@6NWYCZv!>2{kuhcabHwO$wFCl;*&x9n%)1h&#NxA8opQEdj$ zk)BTn*1dzoz9G5Pb)x!0ZGjLK80R9sEB%>%Bul6G%SY4i=VVzCgDF0M*V_IXyoP@c ztnh`BM`EDYRySmE;3cV+Z7+2TnC?LR>wgL8KMK3zFA_)L`*^>$BXzhq3$y?#p1I;{ zfo|~lcR$)N@Iv4ae;z89sbhJoyis`RPulhg5IF?&_O1ieoYO@ON-M7w-cHg>9?&zl zo|Qt=K>Jqs<+pqx!D0q0q0{^`b88WMVtmFOGg?y_bbS%qP*J$&oP*l8iRaaedmept z6}Fb=Ysd5*Yoz`0@NAP>ErTN}%b&(gTx66p5j zvmqU8<1sN#N2P1(bMJ9&_HC{%S;+Z}MDh7o(I2pf$IVCKPmis%Uk=?BvcF*~CCSL% z$7%GhpZ>&c75@OU--);b71jJ6kyGN1iyg}DcDT1ula5Tv2kL8^7ft&+qewWxAFJ1X z3DW#adMCYf?9Pt*@l~NC0MSRRs z>UYz$qjTo37W^@?@L!2yx6!VqxN9a^nd6(xjQ8p|?OLA>JYRXJX&xZFjNM#MWpJ^; z04*2=bI29+HidQJ&mCDEBjJC;i6*pkF(#z9YqEAc6$%$Tbgp;B-?Lt|@Iykl@-3dy zEor>=On<1_Hsju$th$udjK7A~ch-~KCC}QH?I82sR0KlGaq@%HJoL?N>pnV?=fL;u zlH0>95#tU*yBzie^{y`OTGVuFODlbIUOF^pb=ZbI{{U)if2-;-p1Jm~Oz^*lbPZLO zUli%9bu_qQ3*f|mt#i%Xs4Jdn@OSoj(!M<3OX3e2+v_$rnslsUGrPeYf-|@k3;)x#R`XX1tT(<>YX|XzkZ!dmn|hB)PU-wap}VQ=2p{v?kOeS*0ZTJ#c+%f5ZA{ zzOXUf0*j8V#X+X(kil;x7YqKs7&)mXmR(BG;Z7=->c zpD#J2Va$0CjdZUQ86#~c%a;W7jJ7``S#Wrk`%3wBOL+{7#Gkt(n)RFLZz7w@(j_S4 z+OY3pOSh3V3>lP=kRvQ^%}JVlzBUi`cRe zTY6`TG>GhCGJ&`rd9Op#*TUX0(1bF&dAR(kxFlmze5ar3@QcM(JnjJTQ{CFFvh@{W z_9*n}q>jVxM#VuMfYvUle9~k$-l=}+oL@O+(s1$|k$`bl<$+yu!K{rTcgF2;*LM|t zZ<0O}6w@D*EyrP+ z&9(5wou#9!%W%>Wk>(yVT@BUnvjFl;z1N7#u517f)uzWM{eY|fa z)!39=CO2g8zh6q(*RQj5e$XM{e5bh-m-C$_))NW;0Fa?7{@DKj_0|rhZYQ^S^$U+F zVs9)GGweT=bVilgl)c4rzN>m9X4|xZT!z2mkFd$MBo0XIGg^9;t7+k$JFW4z`!&gU zhF4J1Y3g0@dUrLvXr6)eS55`xzW}h^EGSeGRj#5@DmXjhz^u|3ot_R`movxwdTU*T{^>uh+jsDOS1^X)z z_j~5GNh2v#Z1&4f7#pk``C#)v#t?up+r4LNekHh$aBWBfxyKdc-ZJqp(|lIVq>!Km z9$tEy>-<0CIWM%ID^ao_zA)RUoGyhLj^}%-YLZ@fM>p~$sO%SPM=TC2knqoe>>$;e z@^+m`ZQD!Z^sV0s=p#zDYl&vx6r2e0j1%8Aee_7LrQSH*&2ZFKJE^{HMYVeym-5%m z8+ZpjYRd(ROay#=DqAlNq#!o#hdnAw%fB)}BjXj#b7{L+SRq4?mAMsrO|gW`U4hM0 znf}XaWR>>ddQIGMO`BFG8Dh+c%18IOt6C?U zcYU$~HuKG4M|&;upEHWx@X8owTpnvC>}a(*S#91Je3u)YM>yuPF6`PjEc=)0E2prx zFBp?|%+;CV2xOK}GsY=e;A0Doy{YLS##myPQMda%2y>I3o|Maf^q>J9DCGiX0z@H3 zc&bknk>_AFc~996)BIH?6m!KKqH5-9MFT_#G!q>zItlofN)`YfD+M(2zV~#T_;h7=xmu|kRZ-;!Nq9>%yQ0`E4|F$hki8sKZjCH%3kblm}iwE`B$iT zGWrd7$cFcN?O^#l3i-?78p&_tT}MvV*YC)?Pp1|1e}Lt*dkgEWLlMOlvquhj%!8-$ ztCc$tr>Sejn#}e(&GocfKE}8Tamx%2hrKq!>gH<7tTiV=e zOiXr#jDU`#Cm+(czQHD{##md*fk&1GGg(`h*;H{bZZxm7PHuFBkUackjs;(R3E_@8 zRGC>o^8$0vdXgLYY_9&nWDK59BbG+SY#&a&l5myw=&*IpCt z_8agqis5u!GI(Q+by<0hKpc8jtKI4m$K_gOpgd>Voy}IHI?{%}3lI!3gN}RFZn@!T zHFz<0ppo}U>ZjVTT|9bvZ=O*O?puuJv~=qcso9w<8||ES;}q^Q&F;J(eWAxBejj+` zjzhXfpXZSWaEG;N_&dc*rCZLHpnqn-g|=M(0LR3y{6TZqC!oc2TDE}3-ba#Ovq+}_ zcILUe-wnre51V-popAx*47taa!=cBuN~g^EqU^|&xlW4SYabQqiu!mq^2x}B&e#09 z)tK~qtuGHC%5>aEADwyJwinhG^GNq4@2(Eyy~aMw2T_js>s=RyJ}yj}Sc6tZz0;#S z-fqBl92LjsO-jzv)AAQLV{=x!m*r&ISJVzEZOcg_nN)&DVT#e$?bF2m1Gc~L{C{MD zqYkG#go8DW2D;ai#-Zd07rrG&CD^!wWUTQqOLgDveDEf-I|g* zPQ!QVYM+WNE;QM9c!$IvW!uP%#h=$T<(?tc?k=_99>D8RuPEX6VCRoo)7kYibu4;@ zfuY=Mx&GXR!;V4PRcofxykB?WqBPx}9b0z!0~8*1KD)ZtnrQR*%UiPBd34rDMn3NB z4@&HO3-AiXm-|!2`k1|$M)IaCWS@M~<|mTpQ){DXabK+S-rY*%hcL%DG5!iGPRqvH zHLO>|S4+567;M9A+&>Y`Q_wE-CZ1H$EtK9O>=B0KW1*>Ze+paO>Qc?)8T|AFZMG|n zdhaHk8PEQ%l`NO09uv9 zkmLMM;~if>CNB=d4cI(#a!97Zl-^kUEiXIcO*FGKJLw)3# zS~G=K0g1<@T!Z1lTHTwQOP{kTdkW)%Y3-S6l!}pT#Q70q-=g` z>Yf*u!rvHUI)3yvld^5@p!$!-zSa0ge%C$+iwqrzBoJ~pSIhqZv|gArUyjnxX>bB+ zbG(C(MgIWnSH6D47qEDrMQa<&zzh>e_}kZ<*P|q{5!CVHCqh<7QQ@x*U(0c--996@ zQoBrp3VQUd+5FG=NYMD3X^>hSo>;&q0~NdC3l_S$o;z2eEo+hs*KE9M11sjV-z$R}349lDLP>Cp~zs`Y)O{IA;Ch)TF(aSkj{V z1IEF9d7`oO7#qVnEJ-W;{{X}>iYrT?vFEf?a@6%*!oRBzff~{fFov$_>o4)=29nyq zOBiw2H6)&NV-dIm=|Bq7MzbhAN%W({If6B4x?-wF4$F=AM?RlgwQ(z7AQBv?=|M8w zlEkZN#isk%Kgz1;aWRDEq!$YeB^>cl*BKuAATOm-o@o{)5*)5GQ&HJi zxSo6C<;R>o>&QG^ZRSZK9ff-zjbb+sE(UUI%zRI$F=xu0W19J#bsl@2Fg(jzwAo-> zfH~rB8eOtuVnzpbNzR9UVIT=4Jh}Go^vT645MPhL)@hR)Ny;JsW@r|E{ zY^S!ok~ro!UTWmv?!dwP#c3*h@Ug{Kt4Y}Xi`G6Q=>9IW{?0JGY$G09MFnEJ1>YKslb*e5{{ZYe;REAe0_h$n@x|145<=VE zn+hCYae-Q%J@E#G;xCIgt*1j2Ee+ck-I%iQM`Oi&Rz4D^QP}nJ`i;_8F8KTQmezDH z2U%&~vv-DKf(wNRkAG$@S$B1Bx=23t*yx@Y@Zj)ejqkz@`_$sLZN z1X>Zen0$~=Bb4O!$CwRrH-85HDSQC&KaR9-0sJo4Jb7i}#f3D@VhQbbO405N7tNVZ z@dJ_tbkn?GoK~fy&$VA3*!&9pp|qVd_FcTxHQhhNR?T_j+&e1Tv*EJpN!Y8LbmKMd zzZNxLk3JUoU##mo%)bq_Jtiv#p6)F#QG1K)ctYg-rXhyMY}bnX5&efXUxdH6EvBER zc;4FY#2TlEZnX>RNf{-3Wi0`g(Nv5f49YmzKbgOhBCw79@K05eQ`xk28v={92ta#Vqjn0v!_=-J6L{~b* z#@YmZir_n{lhlsYyW*ePL*hrkuNo(W{xxZub>_7?ELwcpI<>{E%((lZ%Bkt8w zU$*fAO>=K`<%_6S?Cd#2W>TSu92OjoX-m0DHQyTi-sJ2Ij#(K2vVob6>UxFYV3WZG%!ZvJeBEznwP>l z1oj$)vdH_AR3Hu6>rz-~>kAjvS8@}^PAg8|TeVA+7W+b{p|1(9XLF&($H)Hww=}w! zgS=C9e`#vsAi?*l^x$``AK4@J?9=pHc=XQ}Ng@_-325`ziu$+Wcf(Bw;}?dew(%v5 zH%T;Q7@j{-UlV@PKk!Z6Tf_Q;>c0(Oxwo_tmQ{<9xN*{h~Z~@F!FnZ;G$3V0GY$P;-j?8TdQmxV|rZ zHMYNwM0<}RWOp6TIjtJ8GpTc))E!~7ed(6ke}=fL*bVfq(n;lQI0HD%biOt50gB>C z?FPdc!yj7awP=?0Vr!LVc2ZQ1Kb2u1jORX-J~_Lh3620BCTc z4r9sbn#0wi)3hM(tGmqrQpFH&JG*gR9lf&4c=BF0Ee1YPahmyq_Lt;_F#zY9DgXxFwL7PqmK z9l~QX;GbT#r!mjS&jIk~h5UcwuM=sf#X5GGK8qat=MuK}3F@j>t$VD{=$2NOI%kG7 ztvcPN`D1psNXsvB#~pE+if@SxErjrB&kRc%@hDJ6D}eDgk8Lb8TdSQ%Q-JCa@Qe-# z&s+gZm^lpJia!T@0d1r%%ZdL0wxy7kRgdKa^yf9^+W!E;8MLpnytfl13=T0N$*X=8 zwA4N%c${8{ZXIHf5zhoE>t2cCpATL5$_TBk?gUS62*%Nony!5Wp=NR#ea)Vb@xfyE zlF77WNTjFp>s?Kq;>%e5&!S28X{0X7bGvqW(iuL`+w8XoJoT*&FkCk?Nr`>MTw+Oj7(BVNDgA2w zwZvv}0ptpyXK5_gAL&wV6+Fuhp5=haZaUVywm@vc>f?-5f*@EH>6*f^xwyEv9$6tt z^sa{5*!e@vY?E2Nid&M5$PbV!Tf?a|a{}Y_s#XY*1JHZcuAMZGAo84kRn0BUqIFt) zfCMtWGut&jppZ)zLyY6ru@*OF9&3Ev>920bs~ml5kl9mI>Huv1G}|NO44(A{vOdJB z>T%CK>ZO*lF69xkf+!KMIQvh`J5&!VH{Cd^5s?ZUebOo?xr-kt=7d~T$XXX+-lGIz1wHyG)a8YMiyg{SjfIo-Lzk69cuoYYZ>zcwg|>KtXo^d7ZGG;t=mhv ziRV4*2@WyTxp!c$NJk%?RT^j6SWhuBBz%<|?))lEAV!LQ04Cmxik}3^Ka~O2# zzSq846}j@dntUW)% zfG}_GBGR?nd*p&Hru$M>U3@kN%Sp{~m*glhQXKD<|Fr@>{c=u=tvhfgxQ z<8FAy54BP8*MX*wz`G!_kfddq2U0&8x<*w`C-}{Dd?zw$+A0$z&RKSjPAk~Fd9B)O zz7W%Fd?_Z@REp+O2HcRNBO|XSysN}O>i!H=y|-gMqTzGYX1X8Qjaymp<@Ej`wUX(h zMo7sdV1vbNQ)7-ho`K+GxQYuoQ0|83{a^>{+wiV~S-$&B0?y66u6Lex*BO7~_V9;> zAdcG2?VJJ{M&vIhs!!rOnfyNbmCeTIY^ZEwjC8Jen=`A`d`)NIt5>HuLJbqfL7-aRJ*BtLG!!R=%|@*NBiWhu`d0 zjmMToPCN2>sdRr2LE+eZ?<~B8<<3dmXnO&trFe?pOw(p-XyaS0m;sau;jagayiI#^ zadC8zSSw_R?pQWEU<&Ex(c{%z-0d-AsLxtSEoP3%i-OWJGGg;B^=eGeh zTjq7=2I0TPr0~V=u2kFouJ5-ZR{sDR?rgj#T8V(b%L>0HK3?#~gFVTI>8XrHv~;fmSX{~H_{;bDitz&%D}?mGI6T$p@2)&Qcs!jRS)=Ug zqly6FEcCC45?u>#6-#0ym*&b`lB4vlocL45R{9zH6X|krak}7>{HuQJP_@6iTdhLo zJb-`E3B&XL6sdpbz~9+{qsQIko@u9GYUU1);vHwgnmhjh!e3zwySjNx<^%dw9Un=$ z@rBSA(0!6<-_C{<8(?$Wa2$S>*Jv8Pp{iUxuC+Qm0R7V%{{V$AhxJRlsUw+J%7ter z$6)!CXZ$I)o{XC_3&mI3&V)YCsuqh-lz*ee0~2PL?8l;vdv&g3K=Fr(H62myBZ|gC zIWzD5*!JCyzSZe}6t$zO>Nfgzf>kZ<0a?CK#PRBR6~|e8JJfV-0%Y*S#!Cd5rh8>j z&hOOx$DVQPShV1+4OegSDJwgj9*N+K?Rp^ICz3eO^k`(_wdD9&q3AISt1VwsGpWYU zF|p6%Tt9^VCTb9@(P~7Y!23R!zzK8Q1Jw5KTe>fat#zB#j_v%Lpxc_=o90Y)2kA}? zHaQpWEv+uK6#mwZN#jB}l{XSU8p+mtQKv_#tPxwRD1(Brh0it9-OK%}sg*ztwg8U< zzB%T&?Qc)Ax4o7>5Ct+Z{nkz}wa~UPk?5Wb)%4wZ+_t+QjxYua3X<;5!tYfP_*!d; zQ#iw93iE9eSS>FFoGQg%j0QZ{tN2Cid?jfdkXnBEmpLSppT@Fg!|uE<{htF%rNXga zvU22YTw{-#u(Yin^3qvuH91}9I5{p#es$VvTAcdMo+Z1Le4=n5+5>)lXpci0hLTq1 zWrEoCR_cEm1Z3F==dm-|$7wa-IBz%u9^UvQb*nIVs?y%rrTx1^;9#3*xcmskRgO(6 zJ9n|u?Kwld$Q_PxRPH6Xf+tNOc5(gCf1Lm}?$1u~6wc>Rxr<;VEUr|XduFihd_@hl z-;@R3-(9AaJTx^6#+O`2XG4&86~;O3P)%>DYFByE3EQ5?4FGKF4`U1hTUoBW!`q(! z0F7AFW!5eo)hmaw>;{eb4L+~^nXe$yPyr`|ZjLf^xV zoKb6vOtNk@KM<1+p!RTMgNZTyDuwN$cw!0G&0x5mWY|Xx0P9GaTvjr9z9+a6x#v5I z{{Sk{X*40FTu-LPk8qLX9pwK2I?cXT5?sjnclNmOMyYnXcCBY)Y6YSa$7lzTN2k4c zx9t7#8&LRJ;x(64@}Y|AZ!GOSHxMi8?})8&@dx3R^|iczzevDSuxG7&jpDzDH#4+} zsL0JVtcFzs<H^I%~$Z$E2XU0H!>eJoTwSk zQ(VXFtML{sd&9D6+MI|cw%QaoQJU6(rRRxei~`Wa?BoN%Ak&fELZ!}z;zxZGQn-+F z6nnpwP`ADjeVDXl`G7aw_pKQxI*p`)&34*cF4aDBB7J5e_UAn?&G7K<4h+?V@&KxCY3=Rl)U>= zvmMB=(l_r9PHByN(3~jEOEQ)m8emWd&IvRU_0+zx6Niy-Z+Yid+a<;N2Pi_++TZ+Yn|4#)|yNVSDjK9PUi5Ex#6BN(7w)tZs0lXUQgpI8K4YM zcdw)TdEvrFJnDrwf!Tv<7~v~s^N zJ!;OqrWIKWk+}1k%!XM6VlcxQ=ia=y%{ba1;Fjm;_xuxI_Mz2&Ab2YO0K;oC!~Kf{ zQgG)lypS>v`?d6xeh;{wx$p_i=CE`y1zVUY~QR@DF?EB&U@Hq3b1-nK4w&R7DF)@?ZaZ z1wU){Jf9Ld>R{)h7`%uS7at8x39Z1lsMy|ifx3{Xaf7Dm<64AeQx+|T&(Jp2ID@-h zEgUDhARtm97@ndU&X7ezXO7SbDX>ET_-lIqVfbT3%@67p4YAJU*fXR3;ay@nfux6U zCFG|bqxzOGfps%cL00lCyiTYK3VkSkE`|{4HVeC1!$I!mcvC|Dyx+gZR^lbVp$~oK z2@R@)M#Q0P4P!{K4Ofi}X#*+<>PjB=JywO3D12(J4t@YQ20~-T{|+RMJ4B;v~-Y|xdWRmZ30RaXS9Od z%5N|%U7oN^OkrJyFJk2?raH{k6m*QTNe`rXkOHW^v7sh`zqf=opYPjGewURiSe79maQ-jrW)Q47i;eIiFi6U)0qkwlpXYq>`pY z>De@NpDl81L3_?fRu2Nnk?K(ELQ~it%podQB+<@fU>$>C8O^!gNE1XI>1FqVDIfH< z>?KvJVrx{Z2kukGb#6f?27%NX(N8>6Jf7*<5l>8r(WQid!jYaE!%vAO#=ZOrHTXIT zH-VeGB`AgKS~MFcuQv_)%by>B<|AtLd@Y!Rl&rl?LTrH&osYYq**tUEt?~0?l3rE1(Uvf3$+1RK(Y052R#VXsP9~NdiN9y_Kk);W{3%h&udxy-?{;b?jT=ml%#;xb2EzcHa@%`UT znytusk=)VySgz=S5f{BfNRsZ9ES9OiUMWaX;~-1csI;jLl*di|S%A9_fuaVCR;wx6 zT-;6kRYvkSdn@A5jQ73wWijwUbaL=@FbQlxJ^7d}w7YP+wzs7vMKsqvDp~qZ1v7fi zpnjl7ICa9d)IJiX$fhU`>W;$=N;P*ECSh_041H%or@YjTFP+$Yb?;t%}G zEUg+_A`g_%t|!b6&&gV#=JvC=$q_0UEmLNs-V-5TF{n@~3ol}~hxQ+a@jm#HVcw{x zeLzapgwt`n(ccqsy0P+^mHRU>9&H8nmUWALinL+xuiybn1aA|168nfO$r9tM(@vIU ze&q!Ci@159SVGq#!6-$ZiVA$0cY5kz@nL=WYgrX?HK*}1p-icY4FSb;pUX0f8HKJ2 ztxbg!!Mq3UNh*EIgr#pEeKZA9q#yKv9$$gI)$hKn;`+ifIjAkGg;{yNVn+YwC{U(& z)*9d-YVNn+F&Wn&>?Gmx>h%IHR&r@Xm3_r8t`buIKIL;9T2uVex$AzvpeBNVBh4|& zjFXqu@Fs}1@%6ikV>xT`K{)m-Iy5>@qpCEB#(Bl}LUZ-M>7@G2zHjLAZFPM0;7fMt z8;AWOWyOt5{ag}KHK{ZowoMJ}h`i1F0Ku+QTdl{V)kgj(UJck~*^+v)XZhz$*`Ajt zYS~YmCAumY*!T4*tWivL(^YTJzIwKlT!k6b`JuZ|X+Mw4#6y`-skUfbqY{q?RWL+{ z{?Q#M6YM(>k!PZz6?Cwx{Y^Vn#>3U1!IW&m-@No=7GGVecDN|4<@xfM4~!)?>Iui6 z3)#`D5g~GfINj5338(OhUy~ofqaVCg$MwH~`p-*~t@v|KIddR&f+0`E*@3H1c0Jx$ z3`jF|qoXv9AD8wg{zTqDoc-?K$ctxJl-o@F^#L|qku83|`|cXQjpAeMewU2g7!SGv zzce-h#iOI_Yq%L&Sumo$Q?QX?xx;unDDI^CX6I5)SQCiX@-CtBvk&OXBnZeO`IW_F zBq7U+)gkzp|HRlfqIP<-jrqja51;Tw5~G7y9c>p1+&}-uD!tcBQGV-hvXi<4Y(4_s z%5glG^KAcP+5{r&#}+t(8b_3OV+!)cnMm?;&&%bA^j_c3^WRU~VHIn#pv5IqVXo}4 z3h{)qi7tD(9VPdM%VO55m`x?dQlRF@y;_f<`~Yk5{#ywUUB3X$X|C&AdIwp`?gh2; zsJV9Z_S%8nNnV~`8wk<$xlwFlN^Y`!)0SDqLvP9WEFVI4yqNh|U1@sa)d>UkFi^9) z*Po(iHm>q~y;Sp)^U$@5eJX+QaGvuYx_k6SCB{+vl+SByUh5r4&11WLD4l%CAm^6g zFq<(JsNXNBukzum^&*S4#%iMG{>_xE3`a!q=7~JxY^e&nfYN!q@sv%K_z|t?p^!!3 zm5HA&e? zGUlk4f2o4lb~7ueY#w1Z1mCYZ3u`|x)g=?HXGdWYgUaH2xOi0}_$(DAc$C-zvaYaG z@9Al1OY*+gn4{&appP_e;&Wtnv!YeNGdW>9L*oi!zX%8rlXF|AKA!Y@n2~hyPwxdU zx|@5W1?|YvZc7$_pj3eUd+q@yBP{JJ9xhsvK_|SDXE$1T7v}2KNQQb?I9#6Q%z*6U zzL$Z2=vt}x;d^)M713*oXB|Fhx@kb^xzr}YxjqS+cP(Ut7X<(`}Q7vA_?kn=CxS6-i@5NXd1LWL& z35~n9JsN2f>^Xa$(l4lNl(;Y-{h-@IofchA?V`p#8AAVKvk9t;s2?Xf^wOOp!xsG5 z=+qe}S`iT`7a@^35arJg27CO}(N-aIJ8t_>>OH-<3i4lAZ0fG(eBw;i&w5%{^ZV5l z{A7TM`A&Q$uSZv!ZpxtW+eMAjl6b_fA-zEI>dYGR#J8Yct14EGgA)T?Ura;Tb&73c zirJs!Ta4@ifZ<`N&iO2GRWdIlL98NVM5A_+<-$@!z#s%3(>rVYS&gHotk~eTh8(9W zvuygR{6t<)Jj!CxyNhP&_6ovzwlF--Kg_(zK&Qh0m?M3JH~N*27&7F3$gfmM>zXGa z&mNWZ%M-K4)|~B6<(uTd^Q@3M&xSP7kN6mok|k&Q;H7x|9S_tS0rHro;11=j0JHrsP%gHN9g(msns(zUSRahq+ag`16@85)Ob~v zFE!~UNmA6!P1zD|6mRf)az3|S1nBWr?2#*DzBRxn04nGFrZz#Y2AAdvGQvkNa=v1R zXlwCaA3rbLm;{)_RNwcA&_NoOc!4}QNl{N{V&x|+!z%WF*o|Mz!szwdr-p}$nI#At z9FPx(S8*a;d&$Y}4;&CnPFBVKU7hMKU)42VkMnUwMQ<$@}2eA-+(NSFxM$D7ucqc^ewoOU57OQ(vgY$7Fax2A#65kINNXSVS4CqTgS{3g;;iYMl)V#H>~-Ht1MV!jJB z71z3K69?0n)$*~*5+KhRz~Zo=r?pLy70fq8BYQz_XRmXYqT^y^C9IhTjy^=j+h4CS z%@x)sah3Kex`}ZJkFKFIzs+pNu+hs|3YX-ht|5-JSO+OGBJ?31i|hfN&R4nc|742` z7TBU(VQSxc*&X48XAw|8OXel;q_sBFm89>bmu^4DAI4Z$<$c1cad)RRt7w{ml5&Xd zogYMhRS{pl^VWw!3n!CkNWgSxH;>`OaAlG&CsxHs>iyVP2CMi45<~l3_H=pmVjfR= z{=GaGskh9}7YrPH;~NNufB6qMe@)w0dys8yDN~|eiPz(~isn$KHS%7=6=i8Ul&IdS zoyjQ!`Ki=42gsNdd(xY zDCEFYdoY425^r*&E%`>ttE?r?wb5#RoasMA^i!-mRdjK-K;TDFT-^DXx_N(o)F01{ zXd6c6K35ek@rPdw&-T%#^{s`CzbmFi6V(S^cj|wHT(io~=NNMzQ|2@^MvYj{OMOF{ zowt|CPZTk1*!BVyoW~%B#zgANqmgf`GD!XAG>h1LzosRuc#sJ-8!53;l19T$xnicQ zQjO<#Vn*1}Nsjz8SZRk)zEAPo799Mm51D}{W)mI&6Kaz>KMV~02+=DG{QTWOi@FYd=36`Csf6nU{f4DrQ7aF!aI4`GI_(pP3G9@hCE2=!ss{u8bH( zM&_>4Ba>MC3c@caLb2hZQe}I8^mt4-9>`RlbRJQCXvC~3`X)usjFBd@1Kpru)Cyrq zSb9>^Qj51&t;d6!ySUK4?$;uUJqvweTlHIGdwpQV_f*t&5i)~aesG=cWFpICW8>~&a*7QdaJ!vH0^*)G-y2L zazicyOvMEkv=d|Z)wcSxWy&!Zb0QicomEu08BPEuxb?N~ zman56rQv%oI1u$m{@Eoo2W-)?#H10_&RZ9$-;#PIa-os3OBK^uvw>dVLjr{eqjN*R&xkLjb&+Ngn ztt+?BKMVjRg5%il-em;g)z2f?E7KliVI{b~@RJ`vw%m zP!A~EsRD7hPvk}I2uDG4jngwtH@BJgJYBMDIr`P!-)z=HixjwzuAw~dCMxAFpn=It z#tQ|xBG*ZRtpCGC5= zBsd}ign-p*kY-)W2dA&n22|T7p}g0X0dakP^n;2_VdbtTW=??r9pzNu8ez>$9SD-m z*zR>Qdkt1bF3nlq&7e&hOP-MDc~4A$4GF%5t+o4Jff0Da%&Es9=>SH;&de)D3^Awy z%KDzoEc#gv0vrZC;pWA7sqpxBbP|4_f6fIxdS}SUpWw%|n&V(9hCYjvBXQMHK>Iw9 zW#9E(^r*;?y?>mMn4Y;nc%>ZHatr__O>fV0&+s(fOd(Ux_>}Gn;GTX{m*ma*HE43l z^5$bPE4OIg2F1>1{Wl`RS@DjM0er;xCDz1EH{YPTyfrGSqvmi|nv>JFS>u4eAbj?AW$rU#8| z%(dk)QqhB@@r&lk@VU!jy&BwK3;X-8qN4NBX!)`(_$uFZC<=y5SAEPlJ3bM{ZxsXp z-IjyXOqt(**5>UY2~iTar5$(8Xrq3@ZwUapzfar@a5ku)Wcp$renm?Qk1d=ycEgc6 znx=okd)$l`QLjY5i&Bqu1rDxiyT&Vwy0(J6BrgnNo@QMLHxTDffy0m=(5vO=e@V9vgYH@4e%H*NAnG2vj-L;1ar>rNDDRSk zJf#Q)B+={&))$PBLF|VCyX_ZO!Z1+e6W&e{sNx#`iREx9B?m-|@^Y9eO7e3l=aSPw z)1lQIF7yriIKr>k>VI^FI^`a^h;xc<`)TPf>5=D8mZ7~zGe{k1SUdNFdE}=?^2bQM zh7gN3%GU1-Xp(30|9E_IvBOeJOHtP_t3FIj>*f! zK+@l6kkLJDqN0jv6KM*)GF1MiPn?aZ+7}}Q2d`zNGcKW0HB)ED!YY6+#!3%!mUl@` z%X8>SHU^9-JRahvMBD)IwzPFr3f|K!dwu#$3Iu)LIO{~NMNQhe2LK)_XWS7S7Aa|L zO8ZfZP1ndM%UJ)zK)tQ&=dO?uPL{t_#O3~*->{dvSXv!l=IE4>SU#I4Ad^8g>kgH9@J_R453!t8fy zk{-P+0(nwb4vHAt6_5%4p)&^1=v{l>(lWJeg0n09H9AjBv^0iTuPvxhTuWCJ=GUh; z*C4GnJtUANLN#t^c`!ED9?-a=VK~!>V9#N*r!V<~!VZQxWaF*w`>G$XMO8gv3V_ip z;W9Bx9R}k$EdbRzkRKRBbv`~<3-p+;uSQpUPWUK*gFTjvXcP1B!IroqA66g#1#Pkd z?zBv_{){voEFd3jo18pL@m(7(wg+L>u|bwbuj8ZtXA_il>5|C-UGhxaV2~<4h+%#f zT+?x~Xj^e)?~G*GnSJ+{mb7xr=fI4(m2NDtu&v|TbD#A6%mpi347YjKDfubD+5qf9%W%zXR9wg`vhzv>i3$tONh6r>D9ATrJ@Zj>JCARl`^gBX`mALhUeX2i-6WB8=Y^{BD_o~%ub|iQ0p5>t^eoGz@YE?Q|xp}lq+3IoWVbDpDT3^YAK+4SoZ4evMl4#hXeVY(BCMIdf!RU&HZvXnTd@m z=||4(dF_B5H@%je9r6doswukN@&1r&$!(&PvsW1R#pNIwI}JknYN^!FI+d`~j6D*< z{s5UUz2+`wTeoQ8!-J-;qXP2n<_|~R(t=OpfiF;HTQVZ5NxYDsG$BjJd6*g|5q6~e zPZA*C;XC-fo89YX{DhCExJb&;wFjpLWaf4y2ycWdZ*zI%zfj!l-v|J`272DHL8tC6 z{e}C@M5YH`%;@~FzD5y+&5E$+ZjP5_tN7^%~@+g+7X|;Y%n~yA2r|~ z7=lykJtyLCjqotuamDzhMe2u9>lfXoW)T5~bBB)we;Wl-5@6s+aNd;CwIxj%hwwK^ z|1Li%;Z!^qWfk5uqi;2#%7J6ogN!uhdLIC*=n5 zjFF6?&JGvL(4W4#OduNzw{gi%eecD}z+d8EMw&Pb%) zGFhSNVrf9>J`=;mwU`%ZSrX$78c1>k$U zhvPtox2WWslOB4XJi)59P2Bt$kM`f>$3-8?)Mwuq0~y=6(!MlOb8jU`c&y*F*SXrJ z4i89bzxP}D&r>FaOXY^Y=YIaP=&3^jU(VQy^^UYpamo;zKT`LKCPm?v_5*H(gHRoT zU~8a9zY1j%;N@cU!d5{;T_fiZx}B#quPTbM0-q7bcV;g2BKWrPAIA4NH}=oJxp^hW zG>$al(y9Zs1N>G|V{` zDZQ#C+9QQWUBWw*XQqX*HSiA7GRF+Ry3>pae2mu%6!sTZ)7qT9DhlRErKY*S8aCdm z7o2JWV}RChCjMbmUC~6v0%)9Y#lA)yyYDKH#d0;B(K*!-LCWu%zWl>*{4lo>)B3FQ zfyi>zzWOlL=KL|@^){z4VDqjhtd%QQMIbq3Na-7BMZh7zbzZOSoO@M=x>6YS#>S~_ z`*Q)a_{Q&CO#YP@T3bHSvwWG^d>oWT`6|!L!PdaPS=%!=hMH0>zxx$0&orgAh#A?{ z)Q>#A9gnMCK@@`y%65AHCeD?kT<0d)48G&y(w35&{_1c;u?pdG;^Y;!?eWA3%KynX zI+*gAe{J;b^zGGJ!LHnW&iGXIlvu^-M`arMfvg!^&eXEc(p7<5EAPTQx;o1*C$v|O zlk_b8S*9Q|E+S%#O%;J^!L0{YpTHkoKe+vASbCvEd(Xw#36JoK2e>*DTL1oWW+*OM zzZ4b4>Vo266H(rW_;WcI>%R-yde!T(4g(P3f2|SYA)a-rW98|(kB+#cntN@85jQMn zQF$4QEmyD%yWZvPJI8Z+F0LlNM$*Ial76tuBAYwLSiTsOS}xS zUITQqzIdnpwkT9Mc!Gt` z2%r4XlW4$-Y1NJgR4y&00|rw$;zm2>8frU2H4oBA(gl=H%M!%1>IVIlf=o1&tq|AG zyR8+m*a9hMiNX^mrYGyfHXB*`|J%{H308o#2=`x`L}|RzdxIDwGLjGPF917CXIQY{ zoDDbowS*T~+@<$dXsq_*mkA2ho>8RZc~!VcmGa2%_$#-Y7GT0?kKruYn=pP}HWL5$ z3R(IY1Wgs|M)rR4DcF1MJuMV?d!8`d;{`e^6<25cb)rNhfk-h^TWLz-*5aj!g@l^4 zZo(6SmT5{Oh2GI^xE$0;*;0IzyR{S8MX!=ofOD+r(Eh9j`95W8-6_NvD>)$c_Nv(B zh>?aaO(qg39H9C)-O(;@l&0J16c^&iTRAy~8#1Qg?`oTgOQ6%WPA9*YSy;{1ovi8b+Bi9N1%BYff8Ka9Hr znaZ8$$b^-Px$*^2k6Oo4id!Fd*~qcu$rbKe(VV{q!f5CHyll9*CYOwF6iap@JdzO^(9N6pQ&*u4RgaPn|BE$Vl4G|?- z{x0LYSz3MJ_MO*)<5Hy(fIn-i-tX+reHh#Ye{CRbhzjoSK^M7q!YYAV=Ghh zdR-H3tQtk2t-d6CIw$6_UxF)E1`~>hgBCatrOoUOlH!9($ER!t`U)-Pthf>55Li}K z)ka6{`=BK>JmAEE-u2o~U{@2jfPVtvy`QBdG~`ssCuwUmXyAmU^D6^ zGH7}0O~!jQ_M?u*TZY6dsKunvEls*gAZ^nTI*v&Oqt&W|IFL`yng6ZnHYWW(;1q@* zjn3=J0d~ee8xySBF2aUgYI>toHjQm`${V$7r#^vh^-nYdMT*RE-tLv|1@Y+aBkUw$^=uEYVvUO zctPB{co*D)D?7bJb6am!z7}UweKkXyDtbD2WcD}Oalso_>u`k!iSy~F7{U$jCmgjW z;YZJ>D(mdam&^kXvE$M?XoGaNGvXhH;9j^aPoIeW6*QOr3ID=w;7OeXeZ_OwlTbF| zEK=i6ROZJzidqCU`F}6}c_<3Kz5a(mav|*%kIyjeMR$iDt{Yj`zg+KSABe{v1JD<* zqr3|m9vPTB&mIWV9~_uTcT&*{Wi0&ZGdD5&dJj1CHd}(?m0m~Sh$VBS!ii`09frNk z-Fx3!@J3e30QBTJ0&O+K+(r8@k83r8()5l`?r8!ieA(711L;B2hNz$U3rh#$fj>R^ zH?#2BxbfUCY(f3}Q4I6Zy|iOkl&QJ}=z*D8o_uwac(QQZY0fp>`%&wsis@?hp9|do zPe#(GR~IxvA6Uo%n=wrYzb8CPWKqvL+2yTJo6UUh9e0gkOJ1$RO;=pPuNc{J!%byh z9T%HF?j08$kL)aC%=aHJ&CH4@OJ!x+bWa0Us2}Dtm1?myTrUD z#LiDU8EdUcO};PhH+-&X>-g4STs%N=^};RKciWrM8kU{+%VJIJ_^ z0L-lH?>Vfu;RuS>c2_>KJk|JR*6?NKIAy&zz5+9*n%s0?Gdp@oFUsS9Wonhx zn}$XVItt;_^|KvZ=}_mYLvZvOMU!2r>IoF3fgU$$9?>AOgaFG=VKHyDO~xmejqK}A z@N-4Dk6Je@+GI9$`tyhXCR)wyiFO+bdxU3{Y1ug96nxi^ z&y(onGd-pHMmQE(SK^=bd~*>r<6C-~zf)WK%${C4fJupKpKAXQ{Plklv!5-nsILFd zo4(_C-eY-h9O+CSXm&~JjAo6Lq79WEI`+Gp$Z6hqy26vu((#?)P>q*6+5z8k@8mCq zFfDSn2S9F9$%l3*UcInHLWjr0!L?`6o*>?kO!xPh)^0lw9b#}x6pv5tK3W0Fi1dLJ z&IT?!bNrqXf;3!=0rXPOFNM)U)68Q_=ye;)<}QPpYVDPX2%gN8xfRC8g>9@X06_K; zB8dghrj#?^JTca&EIGf9vXwD>Fq)Kp2`bv6oS43hc9>U)pUfU@PWdeOoL2O$o4dlV zJtTFHnoV~%M{5FNEo|*jjDF;szK7#(Wipd#NL9c4aUe>rcmY(Tt5`m$KaN4{ZVc{= z3_*Do^*xrnZt!ZNH6I@uN4FNY`#mPgIP+nFNP57FGUQIq^E$tZFNkRs7@XZ ztc5LrYwsV%A~n1tRGJ*Hd$y&d$SU$IGFvs`ZW%3Sc^9FMdQuJjO*s%1so0Z1oKv-5 z#Q6JM+a%Fhlqe%aS&s&Dn5Q4m_N%7;`>ao4pqm@00!fluMq}#|KGX8O--8Rv?_L%~ zFce6+N~F6h#+WA1h(Xc0+fISBJstvY+VeO+$O@&TG!RrD>tMf<{2||RZ;(xFhba1a zd86VON7#$yaa|!WZH#2@mHG$>x0vIgHY)fsB`E*>4s(Uz#zjo4aCP#6CTc8GE58o; zl#a$9xGQW9lAYRHYNO#~#8PD{YUlwLarvgHb<$(g-PY~NDt}ndd_X+|X}FI0gnfW+ zbT|T2o}F0!Qa0FFyw-!G+t%gbUb1fF6 za!j1R-F1ze%n}A{#lG~nYQ5(O5z^mj984d-X+&t8Jx$zJx%d$`qE zfNPU-kNw_v+)JTSJJWvBrw>_2`@H$i5J<5qsDa3@IYB>Mm=m|z<8Sl{LmW}u&hBvc z%Tdp;DIP6Dn|ZTl&!oZqWw)AmozZfbE$a%nv9BYOd9g|i9%H+*Mue``68iJHJgK$U zBZ-2o9@j382Bw;;(AJr+C|QdUXCPu+CDob9c6q@Tv22!BV*+#RD_>i{5qoy`B&>X- z)A&2P!RJNhLlungcp-g&<~T5i1jRYtH4^3z)7yMXDXP4;WRf{cd;M4kwjB>gru#h- z^nBuYGE{gScX5T;!J~V}mPF{%$<#97>-jkS{e_xytU1hWc7)|rI5Jgue5&m17c(YW ziY(M1d{CO@K7BJ9zuX6S_9Z|-R(SS-WujFDp=A_fhOyG#ko)Prx8^1NyKzZA%3I*( zKMc}DpHY#iy6(lSh%&}XGEneS7DLi2sF&DV#3{l)M zMKcV4sk*O1Ov3|{kp!c1P+7{hsSQ$k?+Xafz1x8@f2u%0cDAv<>&Pq)jN7r1leQPS zjSt0&?%9<~yq#YM*WjM~MBkaoWO*b2%$A}aK{fAv_Asv5bl(Q(AFwJ#2W{4bz>F^) zukCrVRqE`Www;ep3-_1>h!>bm->$Yb8BwNOx#;f-K3*LI{vxBOs`a}n464V0;^D9B z)D51&iQ5E?O*@L|KL#mmeWbw%+^h4?V)#Vel)Ji$QW+foX7BG^7LctHV; z%rvu4yDf{BJJ%)9$=$#=rf}Ki*L!)f-DbOyRZ7Jycle|8Kyz#)de^=e@_OdmN=v@T zi$64bxoM|?qz^*kPL<7PF_(k2ZJ$H%v^uV&FPqgNo&{B*>cFuF|9oWHa_k8Su=(1& zH6w0R&CbeGX7O6Y(5Ry6en{Obfh&0SGW_^OzgYUQ!F?l~()KHon+kDUA2+-zDpo<> zC(Q-GJS*0y=iYOIf1nhGQrgq0mt4Dq?S91Muy$X+sF3NGA#-AzwVck0Hg}ER!(q$r z&PCQ26q+1>m!25w+S_N?*-7Jyf%z^ZX1*5?_2oWkiA8(w%@fl_iw$*40%E^yhPn9g z5l#mHDi;2{KC@WRfhJ^@+Wgg?-#?6uc~*FKbo00A*IDfP@1w#gwy%y18XA@~BJ1W6 zH<7gv3$Z+{os%%PLl=Cp14FE9MkM>P+NYHTxm-o>up**e>`OE$jwbT=8p<6R$VWpN zv1HbO(RdrfZ$fm^TQzX*JIgg5Y-sj_=ask#WHgnKY1fVd2-BN>kZ<4$fqk|HP|_MN zPxEZg@F4kI)t?421t~(e%ji5$k7QPfXVL(5eUk>wwry^MYh?W3%FUW)9^gp8+u#-P z!W!4@d?*=*7{hK0C%1VJa1ndPUAbC}AQRVIU*nTAbxCT$LG`|_(W#S3I>WYiSsFu1 z!#wutpnoT5E2lney!d%0+mf0A^7%<&Sk>>GB>n+J#F&6h|27_(#v0vX@XY6Px{JIm z{IfTY{Qz&(w#JB8HkVfwNzleq&jWuTL||pZyIf5{_x=+c>#C@($JpLsW&7vDAq4Ux zbHp`jj?XO;S(HsPjzDL$&rCx?;}ioO=u1S%{%agQ;k#2lxq?vGSVqlx$La6*#yG$d zhWFTWKMmHfaVr@5ztF;JEU~OhZby{WdrekIt~gcLA8TXR(!ScN<$=JuZY8vog77ZX zerknLox`l0BGG571fk7n9RjOnoy>MkpJFpD+J5ACo5EhGm>zQ`7E=nTTnT^VT<)yU zA70+BC}f)cmbBOLZUy6qE*eKSDLX8x^O3K5)+=jYM9m7`)Tiz;tn;%&SB}WW)Iqpu zA> z$L>-ONg+)|kS#rA8t~%NOVmJ$UgZ<3&gazy9ZM@;=O3$^i0yaFv8$yRZ%^Cu!B)!< zSc8D*P=&&VOk{pD(j+E05VA|P;68ntXc`O|Wtpd2f+yo*P1RPEPl^U;(dHb)ui1y} z?n!^6?dQBsiyz_Ke_LP0P_IvwA2x3IQv+PfNtiK*tH4?K!->!mB8wBp5kLAs3My+R z&KSH+EU;H%aNJ`oCZr8793b7RQ*dF85%^+V_Hk57g4J&D=-76_B()g(^ zU&W4lapZO)P#c#se3J)rslPXy8^;{2^*he8Q%y(r_8u(RPVTQbzJvNa zn7F~mxrWEc2Cp;a+iW=X$;UK~@Z6edL#1%Hcdc_S{-b-@&A#JNl4jo6mdDOJy^W$c zwXIxRu_z@W?1Y0G)!w{-XMO%nNaiixsx5s8Ec6fk@K7+f0`|S0Q9dg7s8d|~-Kqp_ z#k>Q?z?q2h$+dTQT8T}-YoQU5P$#0pGb1<50De=SO}+@XeK%v6$M?aOAh!Sz1RP?@ z-rP2A9;qK)UwIq8+l==r^tkZs%X==eCT0(Cu#ab+ZO**9p4fV5M=dV|3aVG}L)9-0 zZrl1uTC^!BOmp)J-EzpVB~%UdS;_hVy$clF{|1EO38;5HQQT)!F9Rxh|8R#TW_fcE z!YIbVAKobWKePRN$e|fO+IumGMH%cTB;F7vJvhV6KAVxp}Zp0ki{n?BCh*+bPY zUH60J`{-RxoFayQ<{yZvip$|hvFx@Hx)IT2s`hIU*|ckW{e#5DzK|Vus)Uj$fMme1 zDdk%l7%{=pHuKd^%dr-NN>~$67THqwae>%QM335my(wxl;Ip`5^n=8vgmTp5e^`17 zlUY(m!zpqNc8*&$=ne~=kR?6DcK_JPt$iG3cg|$RPMZLmy5VPRTlR8$1dKMxK`rBQ z_q!MmwMtWE73S@-YBbx0^h`$W+2a(6>N%i&+CP9Pwa_S=e3_feg&+9J@lV^}iT-;! zz+rP}3azT*GGdiW&JYo~ENE=U4Fx@HS*Y597a1GN3#h42PnMtX9>z*Jo>sz5C+p<{ z#I_1jx<#oyn=0sgqIv&#%`M3(IrRF>ldY1m+MJSJ9Q1h_ibT{NrGwTEvL;lz@lm{f zTL}qHtMaA|Ax3kHtp0V9DML2?Ax+j?V=LN;`9Pd|cHF3-x4*vrj_Gl@kK%NDU% zS2Yzl)GzsNfpq=vGBgiA_Vls~S2w6o%deOaZ}m*4#SA`Ha2v_HpK{J!dmp*q$KwqY zm*RR!yW0&2i21V}&exa8y96K9QD5-ydFp1gJ{=plc*V5-Fx<5D^11!xLlwGb8+8>X zDFbf-q-*W9x`*0IlAC!wjiNWdJkqa01Z$(!?Yk+q{p*PB^~L+ASP2Dm zZ_BTL7-;!LOyoKcZG;({M9FZXy53z+&#M55itHR)Ui3V zUh@y*k;yCeAI4Aoe;EDA;Ef0~3|8RKz3l;kf@`rl-lGEniJU<@PM5;T_?g*57#L_F zp>PV`^*!q`3tA^c`&bs7;jumI!Dy*Q2pU1x5nGput5a#WXPdTRG#uoqxzdnQj4!r9 zD#g{$ura-UrtN%Fwl6T+oTaC*Fa<1IH@Q|BsT$CG$*q062RJE${KNQ)H?C=4@e?SX zEWhP$T5I@8>4ko1p@SR&{5$7|&XSMTYEJe1jw3T3JI%2-5j6MnxLaq0;c^zdR|k$F zFLc#Qz9o{k>SY>c&J|WA*Gm$bBKTA8w6>8)2Gpj{Zb?o*KmoJ0`mpH@g3;zl%k!}f zu0H55wPTO|{FZDfbdJ%PV}vRQJ8e@^HkbSP2-NqE1IF0e3(q|e=|u;du;oKc7~{wQ!?Bo7jYk>r(A|I+X}$Trn5oD&% zQFLJ4-^8(t54U$gBnM{i9(YlyewcZyO5D>uZ=bP>aO~2;0>JQb>>i}XW_x^jYb=mw z!btuL=ox7I$W-1u-tVoq$Otk)M{3u9Gk@VohN;zrIDO+$+%LWFjkA+QqWufksEaFT zL92JUefD#<7-u5;$%DxOyGo^w(MzOzrV+IEq`$Df##QqltJ84?$yjSE6@LFv)-Ee$i$eB;2kLf< zj}cUOC{YIcc)hyr=#n4R@qPKHiAX2&f^DA}Rh&aRcWqPUWah;#%!B6HOa|4s@_s8b zB3&H;yACfO?f^96j&kz-H-KAQezwGSojKPk;?Nuzac2HZqs7rHrt!?oAf&6GzeQo( z0x6Icp4kxFPUtU$l5hwL&{IKv)s(Gv(I=M9ywl49WYcd=LRJHrg$$M7b@z~AvS>Z9 zzM4O+QIFz0oV=KIP}i)s_1rRJG6skx z8nyals_)#^Z#+JC^}UIyux&I+Rr`fa;;>uSK{3u2tbl>kzwu6ZHwH+lU?KIRn=IgH z5%yPr@aAV9#O^X|+cXUcr-#YOQABSu5qJqDI5&P{EbSFneD&Tf;E1GxJytW5@jWM_ zyf*Hz9<$sRBKa+jRZ=uj`I|l5+lh1i8}5Bavg-)NeOiBpAHzcf*`QLYD|_Dkr($Wf z?q=|@;y8O=>ZeG_y|k{aot1s+NrMQ_Bv{PX91k+^F)?Iw@Z<)tMfSSaH}ha!p42@hBx(G}AFJg_xz` zz7BOY8R(7;zk~Kj8JpTQmtUv-_<|KOhT}egywgjw7mHCPPn(*4(pwj^ah=AEDAnPd zRZ}wFDKE&2th!UUrv-O?Ipe8I=b_$uM0WVat_I}#V~8FFW9TiQ+4$*O>53H(65d2R zZNvDg#crh8n-5%wiykKKw5bz1VV!uA;iH@20Ka>}r@6GTpU|$qs2^&NzY=j*G|q5# z`^Dgx?M6bwv${JJzQ11#P1jnDPe53;RS-bM3%n;m-F3xKjkw2J{G=GcrDDZ+2WQIN zUl7O81n7`Vvf0Jc+#%Z@hE2OJgj!DSaDPrGd34$D_c3(wgj8O3BWBj@%iK=der-&z zW!m%%59@cTuP|$vQ}xU20&`j;w;jSmD*>>57smr@nB~)P9%{Tun5~0AC=xC1wpv3J zyiR{q@Z{s(03WA+7zVy=7uWrRxvW5jXXdiRpBQrmlL^bUvj&9i*fg87KJ@&|TAOXC zY44Ywjyv#|*@O~<#Npsz;0a_KO9qYHlR0r8_}`l-aw35w9_eLOMG%fN$hn+bD8?Rs z_T`8Qd~IgmPA`B8BxG|77Euk3-3LTGW(N{?A?XLa=^CPW_fkAPyFV>k(q0QsQzR&+ z+Lq)Y0Gp;Y#rsH9!LxJ=JwMeNp1n5P-3(W2pj))3%@8F&4EIHbPJ zdvk39H@%iBliQUMFR%UFldviju!MWeMy$>A4$~gD1yw-%Rtq#f4hjq;-KG2eMrc)I z(UVJ!m{5WmD3y=VHjf<#;)3~%N3zr+G)ug+8snqp@$Wx8%`L4pzzZgMc(_lFr+Dr= zrEO&I;1p=DN#W7fb-g80^7eDrGxwF5p~8>O?lTWBp>kyl&IXt-Y$+j5a#bm-=k0Z) zpd;nb&AA-P!sOOG(jxX+A((3K4^qZp**&OmRD!Ju$I7g|^!$6)Kn2`22zwq`L&|qr zZL6%S60BczK|-8T}eq_l#~3MT_pdrIIIi&XXcuojm?H5b{N|M5w?fE{IrAW1>9HC^sXH zOTBwcbVn3BYM$-NsUMLNR>D|+U;m=jqOcL&1b0D);jlB6FMwI5=*bu!MYo#>C}}m2 zUsgo(;XiB@j_R&rP-=XgV-h1Mru=yRxGlNyO`EGmCC~2YEzZl(shp<;`QN9kUV!&Q zFQOA1hL<@q+*`!1az~XF8>b$kv9EH1Ksr^FLQm?9X_0_R1gD9<>KtG1-1Gq|LfQtI7Pv-Pt`-ZJYy}ricd&f8V#^T3~ z5exOml~dso1bH9%I!Ic@!1calIOMvsEbx2=-V!-+)IL?n$`!d}y2yhH$4ME^nS>y%_Wr(xwf%4m$5=wAk&{U}-pe z6`e#J0P|xG;%H%_^r=v*O(@==kkFX1X|yd93ZCpa@?P2ty}YnR%zsKaogjh;h?+{d z^q1N-AKEqGOSjQRoGjoFWyJXE$w5#H+ya?4WEGjuiv~jviQJYdI!GeE>9seUuW=9* zN(k)*4F}3m6t)c7L9E4Z@jt5G=6_)OFQtlx86lL4oAsh!(5*T zD@Ep`c++{mD)f-u0&#R^ed_wix1tW3Y+TQsc`GnGg;c6p{q_%-D4=M?&q4oPZuTQ znBR_p8y2{`u&!YYk%#K zyxPKW1)Fyxr%}afSY7!Ig;06#TE0nS-wPBXv6@eFMP`m>%KHBRNtrEl=^s$so9E;K zXh7vT#&OfVbv_>PaKF^R>Eaor zzPNUcY}b9fR_9`u1FPq#C#_=S;I-9$AvK}dSnET6h&auC_x7I1RF4uZHZ z4|wY8X%uTw!6BRGLmKVcJ@Z}0pLrb8Vl*n)L(rlv>Gv&(1j43qjQSGnXEO9b39A_e)6GlcZDoa#;cl>zx zJ8z))qgT`8g(imA=7f3^&mWy~KL|A;;hk8;sV2>`jhXB#=+2&RY?J -without output it will stream to stdout. -} - -node n1 { - type router - model mdr - network-config { - hostname n1 - ! - interface eth0 - ip address 10.0.0.1/32 - ipv6 address a:0::1/128 - ! - } - iconcoords {186.2364578872143 137.89039496012572} - labelcoords {186.2364578872143 161.89039496012572} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_green.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n2 { - type router - model mdr - network-config { - hostname n2 - ! - interface eth0 - ip address 10.0.0.2/32 - ipv6 address a:0::2/128 - ! - } - iconcoords {49.97421009111123 297.31725181124926} - labelcoords {49.97421009111123 321.31725181124926} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_green.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n3 { - type router - model mdr - network-config { - hostname n3 - ! - interface eth0 - ip address 10.0.0.3/32 - ipv6 address a:0::3/128 - ! - } - iconcoords {176.46110847174833 328.14864514530865} - labelcoords {176.46110847174833 352.14864514530865} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_green.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n4 { - type router - model mdr - network-config { - hostname n4 - ! - interface eth0 - ip address 10.0.0.4/32 - ipv6 address a:0::4/128 - ! - } - iconcoords {145.04062040794378 195.27962082775758} - labelcoords {145.04062040794378 219.27962082775758} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_green.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n5 { - type router - model mdr - network-config { - hostname n5 - ! - interface eth0 - ip address 10.0.0.5/32 - ipv6 address a:0::5/128 - ! - } - iconcoords {137.9101266949479 257.51849231830334} - labelcoords {137.9101266949479 281.51849231830334} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_green.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n6 { - type router - model mdr - network-config { - hostname n6 - ! - interface eth0 - ip address 10.0.0.6/32 - ipv6 address a:0::6/128 - ! - } - iconcoords {119.15850324229558 93.2505296351548} - labelcoords {119.15850324229558 117.2505296351548} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n7 { - type router - model mdr - network-config { - hostname n7 - ! - interface eth0 - ip address 10.0.0.7/32 - ipv6 address a:0::7/128 - ! - } - iconcoords {79.1102256826161 50.123535235375556} - labelcoords {79.1102256826161 74.12353523537556} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n8 { - type router - model mdr - network-config { - hostname n8 - ! - interface eth0 - ip address 10.0.0.8/32 - ipv6 address a:0::8/128 - ! - } - iconcoords {159.90259315202974 8.220638318379141} - labelcoords {159.90259315202974 32.220638318379144} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n9 { - type router - model mdr - network-config { - hostname n9 - ! - interface eth0 - ip address 10.0.0.9/32 - ipv6 address a:0::9/128 - ! - } - iconcoords {150.43010603614704 165.70781621981482} - labelcoords {150.43010603614704 189.70781621981482} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n10 { - type router - model mdr - network-config { - hostname n10 - ! - interface eth0 - ip address 10.0.0.10/32 - ipv6 address a:0::10/128 - ! - } - iconcoords {64.19289632467826 42.49909518554088} - labelcoords {64.19289632467826 66.49909518554088} - canvas c1 - interface-peer {eth0 n11} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif - services {zebra OSPFv3MDR SMF IPForward UserDefined} - custom-config { - custom-config-id service:UserDefined:custom-post-config-commands.sh - custom-command custom-post-config-commands.sh - config { - route add default dev eth0 - route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('custom-post-config-commands.sh', ) - startidx=35 - cmdup=('sh custom-post-config-commands.sh', ) - } - } -} - -node n11 { - type wlan - network-config { - hostname wlan11 - ! - interface wireless - ip address 10.0.0.0/32 - ipv6 address a:0::0/128 - ! - mobmodel - coreapi - basic_range - ns2script - ! - } - iconcoords {0 0} - labelcoords {0 0} - canvas c1 - interface-peer {e0 n1} - interface-peer {e1 n2} - interface-peer {e2 n3} - interface-peer {e3 n4} - interface-peer {e4 n5} - interface-peer {e5 n6} - interface-peer {e6 n7} - interface-peer {e7 n8} - interface-peer {e8 n9} - interface-peer {e9 n10} - custom-config { - custom-config-id ns2script - custom-command {10 3 11 10 10} - config { - file=sample4.scen - refresh_ms=50 - loop=1 - autostart=5 - map= - } - } - custom-config { - custom-config-id basic_range - custom-command {3 3 9 9 9} - config { - range=200 - bandwidth=54000000 - jitter=0 - delay=50000 - error=0 - } - } -} - -link l1 { - nodes {n11 n1} - bandwidth 54000000 - delay 50000 -} - -link l2 { - nodes {n11 n2} - bandwidth 54000000 - delay 50000 -} - -link l3 { - nodes {n11 n3} - bandwidth 54000000 - delay 50000 -} - -link l4 { - nodes {n11 n4} - bandwidth 54000000 - delay 50000 -} - -link l5 { - nodes {n11 n5} - bandwidth 54000000 - delay 50000 -} - -link l6 { - nodes {n11 n6} - bandwidth 54000000 - delay 50000 -} - -link l7 { - nodes {n11 n7} - bandwidth 54000000 - delay 50000 -} - -link l8 { - nodes {n11 n8} - bandwidth 54000000 - delay 50000 -} - -link l9 { - nodes {n11 n9} - bandwidth 54000000 - delay 50000 -} - -link l10 { - nodes {n11 n10} - bandwidth 54000000 - delay 50000 -} - -canvas c1 { - name {Canvas1} - wallpaper-style {upperleft} - wallpaper {sample4-bg.jpg} - size {1000 750} -} - -option global { - interface_names no - ip_addresses yes - ipv6_addresses yes - node_labels yes - link_labels yes - show_api no - background_images no - annotations yes - grid no - traffic_start 0 -} - -option session { -} - diff --git a/gui/configs/sample4.scen b/gui/configs/sample4.scen deleted file mode 100644 index 939176e7..00000000 --- a/gui/configs/sample4.scen +++ /dev/null @@ -1,2791 +0,0 @@ -$node_(1) set X_ 196.387421 -$node_(1) set Y_ 462.134022 -$ns_ at 0.000000 "$node_(1) setdest 196.387421 462.134022 1.000000" -$ns_ at 0.000000 "$node_(1) setdest 195.956911 462.201568 0.435777" -$node_(2) set X_ 108.414716 -$node_(2) set Y_ 393.160360 -$ns_ at 0.000000 "$node_(2) setdest 108.414716 393.160360 1.000000" -$ns_ at 0.000000 "$node_(2) setdest 108.686466 392.778045 0.469055" -$node_(3) set X_ 14.254378 -$node_(3) set Y_ 541.257030 -$ns_ at 0.000000 "$node_(3) setdest 14.254378 541.257030 1.000000" -$ns_ at 0.000000 "$node_(3) setdest 14.839150 541.372844 0.596131" -$node_(4) set X_ 41.851670 -$node_(4) set Y_ 545.867138 -$ns_ at 0.000000 "$node_(4) setdest 41.851670 545.867138 1.000000" -$ns_ at 0.000000 "$node_(4) setdest 42.442273 545.926217 0.593550" -$node_(5) set X_ 182.809226 -$node_(5) set Y_ 513.055969 -$ns_ at 0.000000 "$node_(5) setdest 182.809226 513.055969 1.000000" -$ns_ at 0.000000 "$node_(5) setdest 183.335280 513.337339 0.596575" -$node_(6) set X_ 122.027997 -$node_(6) set Y_ 524.087717 -$ns_ at 0.000000 "$node_(6) setdest 122.027997 524.087717 1.000000" -$ns_ at 0.000000 "$node_(6) setdest 122.475860 524.470641 0.589248" -$node_(7) set X_ 186.692167 -$node_(7) set Y_ 453.103964 -$ns_ at 0.000000 "$node_(7) setdest 186.692167 453.103964 1.000000" -$ns_ at 0.000000 "$node_(7) setdest 186.362331 453.043815 0.335275" -$node_(8) set X_ 6.841010 -$node_(8) set Y_ 411.004614 -$ns_ at 0.000000 "$node_(8) setdest 6.841010 411.004614 1.000000" -$ns_ at 0.000000 "$node_(8) setdest 6.715910 410.970880 0.129569" -$node_(9) set X_ 180.514289 -$node_(9) set Y_ 395.901964 -$ns_ at 0.000000 "$node_(9) setdest 180.514289 395.901964 1.000000" -$ns_ at 0.000000 "$node_(9) setdest 180.863640 396.303766 0.532438" -$node_(10) set X_ 148.853602 -$node_(10) set Y_ 357.991260 -$ns_ at 0.000000 "$node_(10) setdest 148.853602 357.991260 1.000000" -$ns_ at 0.000000 "$node_(10) setdest 148.959253 358.166829 0.204906" - -$ns_ at 1.000000 "$node_(1) setdest 194.187758 463.051431 1.962694" -$ns_ at 1.000000 "$node_(2) setdest 109.321754 390.842582 2.037058" -$ns_ at 1.000000 "$node_(3) setdest 16.393600 542.808055 2.115690" -$ns_ at 1.000000 "$node_(4) setdest 44.634359 546.049079 2.195526" -$ns_ at 1.000000 "$node_(5) setdest 184.328928 515.246522 2.152281" -$ns_ at 1.000000 "$node_(6) setdest 123.835691 526.192539 2.194099" -$ns_ at 1.000000 "$node_(7) setdest 184.877733 452.038170 1.793140" -$ns_ at 1.000000 "$node_(8) setdest 6.671562 410.117567 0.854465" -$ns_ at 1.000000 "$node_(9) setdest 181.894113 398.159435 2.122590" -$ns_ at 1.000000 "$node_(10) setdest 148.870931 359.695988 1.531708" - -$ns_ at 2.000000 "$node_(1) setdest 190.851655 464.311512 3.566145" -$ns_ at 2.000000 "$node_(2) setdest 110.783099 387.546466 3.605539" -$ns_ at 2.000000 "$node_(3) setdest 14.881262 545.183484 2.815996" -$ns_ at 2.000000 "$node_(4) setdest 48.394729 546.584695 3.798324" -$ns_ at 2.000000 "$node_(5) setdest 184.473917 519.006641 3.762914" -$ns_ at 2.000000 "$node_(6) setdest 126.386821 528.676353 3.560561" -$ns_ at 2.000000 "$node_(7) setdest 182.160868 450.006458 3.392523" -$ns_ at 2.000000 "$node_(8) setdest 8.577394 409.839307 1.926038" -$ns_ at 2.000000 "$node_(9) setdest 182.309184 401.800750 3.664895" -$ns_ at 2.000000 "$node_(10) setdest 149.229189 362.797090 3.121727" - -$ns_ at 3.000000 "$node_(1) setdest 185.998912 466.082945 5.165955" -$ns_ at 3.000000 "$node_(2) setdest 114.977824 384.500577 5.183932" -$ns_ at 3.000000 "$node_(3) setdest 12.849462 546.572220 2.461056" -$ns_ at 3.000000 "$node_(4) setdest 52.522431 543.493688 5.156767" -$ns_ at 3.000000 "$node_(5) setdest 181.227267 523.091806 5.218171" -$ns_ at 3.000000 "$node_(6) setdest 122.849749 526.513462 4.145958" -$ns_ at 3.000000 "$node_(7) setdest 178.377101 446.748671 4.993003" -$ns_ at 3.000000 "$node_(8) setdest 11.957948 411.081133 3.601427" -$ns_ at 3.000000 "$node_(9) setdest 179.694536 406.348826 5.246083" -$ns_ at 3.000000 "$node_(10) setdest 150.721736 367.286506 4.731021" - -$ns_ at 4.000000 "$node_(1) setdest 179.555767 468.148449 6.766123" -$ns_ at 4.000000 "$node_(2) setdest 121.705230 383.835205 6.760230" -$ns_ at 4.000000 "$node_(3) setdest 12.743213 545.655478 0.922878" -$ns_ at 4.000000 "$node_(4) setdest 54.718112 536.856974 6.990493" -$ns_ at 4.000000 "$node_(5) setdest 174.581069 521.988831 6.737099" -$ns_ at 4.000000 "$node_(6) setdest 117.358177 524.776868 5.759612" -$ns_ at 4.000000 "$node_(7) setdest 173.583229 442.224357 6.591709" -$ns_ at 4.000000 "$node_(8) setdest 16.085272 414.253650 5.205734" -$ns_ at 4.000000 "$node_(9) setdest 174.174132 410.497488 6.905523" -$ns_ at 4.000000 "$node_(10) setdest 152.442894 373.377115 6.329131" - -$ns_ at 5.000000 "$node_(1) setdest 184.255964 467.324102 4.771939" -$ns_ at 5.000000 "$node_(2) setdest 130.096253 384.724742 8.438041" -$ns_ at 5.000000 "$node_(3) setdest 13.104636 545.386686 0.450418" -$ns_ at 5.000000 "$node_(4) setdest 60.821055 533.607888 6.913933" -$ns_ at 5.000000 "$node_(5) setdest 176.727658 522.545813 2.217673" -$ns_ at 5.000000 "$node_(6) setdest 109.928718 524.861347 7.429940" -$ns_ at 5.000000 "$node_(7) setdest 168.331832 435.943930 8.186631" -$ns_ at 5.000000 "$node_(8) setdest 20.338476 419.569962 6.808298" -$ns_ at 5.000000 "$node_(9) setdest 166.303912 413.725191 8.506376" -$ns_ at 5.000000 "$node_(10) setdest 153.598648 381.217946 7.925553" - -$ns_ at 6.000000 "$node_(1) setdest 190.713020 468.199291 6.516097" -$ns_ at 6.000000 "$node_(2) setdest 140.041968 386.083359 10.038083" -$ns_ at 6.000000 "$node_(3) setdest 15.010480 545.397474 1.905875" -$ns_ at 6.000000 "$node_(4) setdest 69.199175 531.278561 8.695899" -$ns_ at 6.000000 "$node_(5) setdest 180.271997 521.405130 3.723372" -$ns_ at 6.000000 "$node_(6) setdest 100.969155 523.987540 9.002072" -$ns_ at 6.000000 "$node_(7) setdest 162.840946 427.835646 9.792553" -$ns_ at 6.000000 "$node_(8) setdest 24.574187 426.845069 8.418339" -$ns_ at 6.000000 "$node_(9) setdest 156.473605 416.105660 10.114424" -$ns_ at 6.000000 "$node_(10) setdest 153.809976 390.743972 9.528370" - -$ns_ at 7.000000 "$node_(1) setdest 198.802940 468.836289 8.114961" -$ns_ at 7.000000 "$node_(2) setdest 151.520674 388.001681 11.637897" -$ns_ at 7.000000 "$node_(3) setdest 18.516288 545.400428 3.505809" -$ns_ at 7.000000 "$node_(4) setdest 79.188417 528.784398 10.295912" -$ns_ at 7.000000 "$node_(5) setdest 185.412195 520.020244 5.323489" -$ns_ at 7.000000 "$node_(6) setdest 91.080154 520.135759 10.612660" -$ns_ at 7.000000 "$node_(7) setdest 157.194066 417.952547 11.382569" -$ns_ at 7.000000 "$node_(8) setdest 29.470473 435.584536 10.017580" -$ns_ at 7.000000 "$node_(9) setdest 144.909476 418.020989 11.721670" -$ns_ at 7.000000 "$node_(10) setdest 154.204220 401.865406 11.128419" - -$ns_ at 8.000000 "$node_(1) setdest 208.501664 469.415232 9.715988" -$ns_ at 8.000000 "$node_(2) setdest 164.443430 390.863715 13.235894" -$ns_ at 8.000000 "$node_(3) setdest 23.619197 545.235409 5.105577" -$ns_ at 8.000000 "$node_(4) setdest 90.784905 526.131143 11.896146" -$ns_ at 8.000000 "$node_(5) setdest 192.096154 518.214428 6.923603" -$ns_ at 8.000000 "$node_(6) setdest 80.107574 514.731340 12.231323" -$ns_ at 8.000000 "$node_(7) setdest 153.494434 405.549908 12.942672" -$ns_ at 8.000000 "$node_(8) setdest 34.279206 446.159167 11.616658" -$ns_ at 8.000000 "$node_(9) setdest 131.868827 420.741097 13.321318" -$ns_ at 8.000000 "$node_(10) setdest 155.452554 414.535462 12.731405" - -$ns_ at 9.000000 "$node_(1) setdest 219.760670 470.533402 11.314394" -$ns_ at 9.000000 "$node_(2) setdest 178.682089 395.031168 14.836006" -$ns_ at 9.000000 "$node_(3) setdest 30.308442 544.767661 6.705579" -$ns_ at 9.000000 "$node_(4) setdest 103.964771 523.226201 13.496205" -$ns_ at 9.000000 "$node_(5) setdest 200.282657 515.840475 8.523761" -$ns_ at 9.000000 "$node_(6) setdest 69.403546 506.039069 13.788828" -$ns_ at 9.000000 "$node_(7) setdest 157.365544 391.985292 14.106179" -$ns_ at 9.000000 "$node_(8) setdest 38.646714 458.620995 13.205010" -$ns_ at 9.000000 "$node_(9) setdest 117.255049 423.747093 14.919736" -$ns_ at 9.000000 "$node_(10) setdest 155.850673 428.857711 14.327781" - -$ns_ at 10.000000 "$node_(1) setdest 232.472738 472.803312 12.913139" -$ns_ at 10.000000 "$node_(2) setdest 194.127048 400.653131 16.436339" -$ns_ at 10.000000 "$node_(3) setdest 38.581962 544.035935 8.305815" -$ns_ at 10.000000 "$node_(4) setdest 118.685377 519.880090 15.096115" -$ns_ at 10.000000 "$node_(5) setdest 210.050487 513.181447 10.123286" -$ns_ at 10.000000 "$node_(6) setdest 59.302514 494.374293 15.430420" -$ns_ at 10.000000 "$node_(7) setdest 169.643190 381.472758 16.163353" -$ns_ at 10.000000 "$node_(8) setdest 40.877385 473.255023 14.803063" -$ns_ at 10.000000 "$node_(9) setdest 100.860701 425.784585 16.520473" -$ns_ at 10.000000 "$node_(10) setdest 154.521863 444.723981 15.921817" - -$ns_ at 11.000000 "$node_(1) setdest 246.478612 476.598268 14.510900" -$ns_ at 11.000000 "$node_(2) setdest 210.951195 407.159256 18.038337" -$ns_ at 11.000000 "$node_(3) setdest 48.438708 543.050999 9.905834" -$ns_ at 11.000000 "$node_(4) setdest 134.861031 515.746212 16.695530" -$ns_ at 11.000000 "$node_(5) setdest 221.527307 510.799257 11.721444" -$ns_ at 11.000000 "$node_(6) setdest 49.457411 480.494289 17.017067" -$ns_ at 11.000000 "$node_(7) setdest 180.598709 367.456279 17.790028" -$ns_ at 11.000000 "$node_(8) setdest 39.538357 489.562934 16.362792" -$ns_ at 11.000000 "$node_(9) setdest 83.020566 428.952409 18.119203" -$ns_ at 11.000000 "$node_(10) setdest 151.821820 462.044995 17.530195" - -$ns_ at 12.000000 "$node_(1) setdest 261.629729 482.087033 16.114679" -$ns_ at 12.000000 "$node_(2) setdest 229.245871 414.133015 19.578776" -$ns_ at 12.000000 "$node_(3) setdest 59.881260 541.845844 11.505842" -$ns_ at 12.000000 "$node_(4) setdest 152.423948 510.621388 18.295352" -$ns_ at 12.000000 "$node_(5) setdest 234.527040 507.889458 13.321411" -$ns_ at 12.000000 "$node_(6) setdest 40.966307 463.915095 18.627091" -$ns_ at 12.000000 "$node_(7) setdest 185.609934 356.000078 12.504276" -$ns_ at 12.000000 "$node_(8) setdest 30.885561 505.096833 17.781252" -$ns_ at 12.000000 "$node_(9) setdest 63.625003 431.905828 19.619138" -$ns_ at 12.000000 "$node_(10) setdest 146.050593 480.248923 19.096860" - -$ns_ at 13.000000 "$node_(1) setdest 278.393127 487.812114 17.714064" -$ns_ at 13.000000 "$node_(2) setdest 248.189196 420.533024 19.995242" -$ns_ at 13.000000 "$node_(3) setdest 72.938784 540.726815 13.105387" -$ns_ at 13.000000 "$node_(4) setdest 171.235204 504.613101 19.747478" -$ns_ at 13.000000 "$node_(5) setdest 249.025623 504.352557 14.923758" -$ns_ at 13.000000 "$node_(6) setdest 30.880946 446.819434 19.848832" -$ns_ at 13.000000 "$node_(7) setdest 184.657559 357.512927 1.787661" -$ns_ at 13.000000 "$node_(8) setdest 14.206642 507.144149 16.804101" -$ns_ at 13.000000 "$node_(9) setdest 44.005432 428.793757 19.864857" -$ns_ at 13.000000 "$node_(10) setdest 132.025204 492.782747 18.809792" - -$ns_ at 14.000000 "$node_(1) setdest 297.118073 492.525399 19.309031" -$ns_ at 14.000000 "$node_(2) setdest 267.609451 425.285611 19.993334" -$ns_ at 14.000000 "$node_(3) setdest 87.624368 539.967665 14.705193" -$ns_ at 14.000000 "$node_(4) setdest 190.013797 497.736791 19.997979" -$ns_ at 14.000000 "$node_(5) setdest 265.067340 500.390654 16.523722" -$ns_ at 14.000000 "$node_(6) setdest 22.990420 428.699834 19.763105" -$ns_ at 14.000000 "$node_(7) setdest 182.833109 360.375049 3.394165" -$ns_ at 14.000000 "$node_(8) setdest 11.626599 492.727976 14.645227" -$ns_ at 14.000000 "$node_(9) setdest 26.668091 418.946242 19.938830" -$ns_ at 14.000000 "$node_(10) setdest 123.299921 486.526765 10.736287" - -$ns_ at 15.000000 "$node_(1) setdest 316.902786 495.404161 19.993052" -$ns_ at 15.000000 "$node_(2) setdest 287.409944 428.039581 19.991095" -$ns_ at 15.000000 "$node_(3) setdest 103.927453 539.724173 16.304903" -$ns_ at 15.000000 "$node_(4) setdest 208.447762 489.981073 19.999056" -$ns_ at 15.000000 "$node_(5) setdest 282.569771 495.688589 18.123038" -$ns_ at 15.000000 "$node_(6) setdest 32.358017 413.328574 18.000764" -$ns_ at 15.000000 "$node_(7) setdest 180.522818 364.802409 4.993892" -$ns_ at 15.000000 "$node_(8) setdest 17.250049 478.879349 14.946828" -$ns_ at 15.000000 "$node_(9) setdest 19.305071 401.972918 18.501562" -$ns_ at 15.000000 "$node_(10) setdest 122.308127 476.484801 10.090823" - -$ns_ at 16.000000 "$node_(1) setdest 336.810376 497.321840 19.999742" -$ns_ at 16.000000 "$node_(2) setdest 307.390871 428.541832 19.987239" -$ns_ at 16.000000 "$node_(3) setdest 121.831706 539.952811 17.905713" -$ns_ at 16.000000 "$node_(4) setdest 227.120033 482.822730 19.997389" -$ns_ at 16.000000 "$node_(5) setdest 301.236586 489.579183 19.641151" -$ns_ at 16.000000 "$node_(6) setdest 46.948370 420.814042 16.398495" -$ns_ at 16.000000 "$node_(7) setdest 177.898557 370.854610 6.596658" -$ns_ at 16.000000 "$node_(8) setdest 30.672025 469.903968 16.146420" -$ns_ at 16.000000 "$node_(9) setdest 28.762169 396.296220 11.030031" -$ns_ at 16.000000 "$node_(10) setdest 119.039643 465.199922 11.748680" - -$ns_ at 17.000000 "$node_(1) setdest 356.723919 496.365486 19.936494" -$ns_ at 17.000000 "$node_(2) setdest 327.327857 427.009656 19.995774" -$ns_ at 17.000000 "$node_(3) setdest 141.310307 540.046329 19.478826" -$ns_ at 17.000000 "$node_(4) setdest 246.180029 476.772114 19.997335" -$ns_ at 17.000000 "$node_(5) setdest 320.056175 482.812486 19.999128" -$ns_ at 17.000000 "$node_(6) setdest 50.106366 436.546462 16.046245" -$ns_ at 17.000000 "$node_(7) setdest 175.044087 378.536882 8.195444" -$ns_ at 17.000000 "$node_(8) setdest 48.497193 467.760705 17.953557" -$ns_ at 17.000000 "$node_(9) setdest 38.413556 402.420929 11.430719" -$ns_ at 17.000000 "$node_(10) setdest 114.693546 452.584125 13.343422" - -$ns_ at 18.000000 "$node_(1) setdest 376.664288 496.703412 19.943231" -$ns_ at 18.000000 "$node_(2) setdest 346.945189 423.241158 19.976018" -$ns_ at 18.000000 "$node_(3) setdest 161.304062 539.571077 19.999402" -$ns_ at 18.000000 "$node_(4) setdest 265.558802 471.836704 19.997378" -$ns_ at 18.000000 "$node_(5) setdest 338.448532 474.970956 19.994209" -$ns_ at 18.000000 "$node_(6) setdest 54.288270 451.088370 15.131272" -$ns_ at 18.000000 "$node_(7) setdest 172.073073 387.868710 9.793362" -$ns_ at 18.000000 "$node_(8) setdest 67.655050 465.445201 19.297281" -$ns_ at 18.000000 "$node_(9) setdest 49.709921 408.850378 12.997910" -$ns_ at 18.000000 "$node_(10) setdest 114.878490 437.804560 14.780722" - -$ns_ at 19.000000 "$node_(1) setdest 396.221169 500.830441 19.987596" -$ns_ at 19.000000 "$node_(2) setdest 364.910034 414.653995 19.911680" -$ns_ at 19.000000 "$node_(3) setdest 181.265387 538.352550 19.998483" -$ns_ at 19.000000 "$node_(4) setdest 285.155517 467.848358 19.998454" -$ns_ at 19.000000 "$node_(5) setdest 356.023480 465.435990 19.994859" -$ns_ at 19.000000 "$node_(6) setdest 59.822992 466.650093 16.516669" -$ns_ at 19.000000 "$node_(7) setdest 170.484709 399.136223 11.378916" -$ns_ at 19.000000 "$node_(8) setdest 84.504418 457.452149 18.649130" -$ns_ at 19.000000 "$node_(9) setdest 63.410973 414.003103 14.637944" -$ns_ at 19.000000 "$node_(10) setdest 124.979075 425.189235 16.160700" - -$ns_ at 20.000000 "$node_(1) setdest 414.959731 507.703787 19.959373" -$ns_ at 20.000000 "$node_(2) setdest 380.876777 402.624609 19.991073" -$ns_ at 20.000000 "$node_(3) setdest 201.169537 536.405487 19.999156" -$ns_ at 20.000000 "$node_(4) setdest 304.943032 464.963448 19.996711" -$ns_ at 20.000000 "$node_(5) setdest 372.787924 454.543588 19.992274" -$ns_ at 20.000000 "$node_(6) setdest 70.020001 481.532051 18.040280" -$ns_ at 20.000000 "$node_(7) setdest 170.249709 412.128831 12.994733" -$ns_ at 20.000000 "$node_(8) setdest 93.638312 442.200433 17.777595" -$ns_ at 20.000000 "$node_(9) setdest 78.562641 419.829513 16.233302" -$ns_ at 20.000000 "$node_(10) setdest 142.579167 424.108364 17.633250" - -$ns_ at 21.000000 "$node_(1) setdest 429.209520 521.348596 19.729097" -$ns_ at 21.000000 "$node_(2) setdest 397.102346 390.982114 19.970398" -$ns_ at 21.000000 "$node_(3) setdest 220.965783 533.570502 19.998213" -$ns_ at 21.000000 "$node_(4) setdest 324.852277 463.066604 19.999402" -$ns_ at 21.000000 "$node_(5) setdest 388.665021 442.382765 19.999195" -$ns_ at 21.000000 "$node_(6) setdest 86.716919 491.602850 19.498924" -$ns_ at 21.000000 "$node_(7) setdest 169.847567 426.715435 14.592147" -$ns_ at 21.000000 "$node_(8) setdest 97.710618 423.903178 18.744951" -$ns_ at 21.000000 "$node_(9) setdest 95.770736 424.404680 17.805917" -$ns_ at 21.000000 "$node_(10) setdest 161.156216 426.885868 18.783538" - -$ns_ at 22.000000 "$node_(1) setdest 430.473009 540.114895 18.808785" -$ns_ at 22.000000 "$node_(2) setdest 416.281990 386.251137 19.754515" -$ns_ at 22.000000 "$node_(3) setdest 240.636740 529.963240 19.998972" -$ns_ at 22.000000 "$node_(4) setdest 344.804967 461.695943 19.999714" -$ns_ at 22.000000 "$node_(5) setdest 405.064820 430.950640 19.991171" -$ns_ at 22.000000 "$node_(6) setdest 105.990772 495.255793 19.616967" -$ns_ at 22.000000 "$node_(7) setdest 167.385262 442.713557 16.186502" -$ns_ at 22.000000 "$node_(8) setdest 103.162186 405.249727 19.433755" -$ns_ at 22.000000 "$node_(9) setdest 115.163365 425.341594 19.415248" -$ns_ at 22.000000 "$node_(10) setdest 179.829755 431.479678 19.230293" - -$ns_ at 23.000000 "$node_(1) setdest 415.678953 543.404262 15.155331" -$ns_ at 23.000000 "$node_(2) setdest 435.187649 392.319327 19.855651" -$ns_ at 23.000000 "$node_(3) setdest 260.149758 525.579574 19.999361" -$ns_ at 23.000000 "$node_(4) setdest 364.757106 460.319210 19.999581" -$ns_ at 23.000000 "$node_(5) setdest 423.001973 422.178788 19.967143" -$ns_ at 23.000000 "$node_(6) setdest 123.055577 489.304227 18.072872" -$ns_ at 23.000000 "$node_(7) setdest 163.127378 459.989903 17.793305" -$ns_ at 23.000000 "$node_(8) setdest 100.668183 387.349777 18.072860" -$ns_ at 23.000000 "$node_(9) setdest 134.745751 421.781273 19.903410" -$ns_ at 23.000000 "$node_(10) setdest 192.254617 443.561434 17.330494" - -$ns_ at 24.000000 "$node_(1) setdest 406.160525 540.747525 9.882242" -$ns_ at 24.000000 "$node_(2) setdest 449.530999 405.814727 19.694098" -$ns_ at 24.000000 "$node_(3) setdest 279.642597 521.105699 19.999658" -$ns_ at 24.000000 "$node_(4) setdest 384.596757 457.826144 19.995677" -$ns_ at 24.000000 "$node_(5) setdest 442.473674 417.861163 19.944649" -$ns_ at 24.000000 "$node_(6) setdest 134.199736 475.485411 17.752521" -$ns_ at 24.000000 "$node_(7) setdest 160.485918 479.161017 19.352233" -$ns_ at 24.000000 "$node_(8) setdest 89.621312 373.738896 17.529673" -$ns_ at 24.000000 "$node_(9) setdest 151.033770 410.479558 19.824942" -$ns_ at 24.000000 "$node_(10) setdest 187.121532 459.497919 16.742763" - -$ns_ at 25.000000 "$node_(1) setdest 409.358404 540.925330 3.202818" -$ns_ at 25.000000 "$node_(2) setdest 458.447905 423.373342 19.693049" -$ns_ at 25.000000 "$node_(3) setdest 299.300679 517.470033 19.991455" -$ns_ at 25.000000 "$node_(4) setdest 404.207394 453.940099 19.991959" -$ns_ at 25.000000 "$node_(5) setdest 462.251199 419.968804 19.889511" -$ns_ at 25.000000 "$node_(6) setdest 137.331615 457.789340 17.971076" -$ns_ at 25.000000 "$node_(7) setdest 163.430534 498.853924 19.911840" -$ns_ at 25.000000 "$node_(8) setdest 77.657124 359.369184 18.698407" -$ns_ at 25.000000 "$node_(9) setdest 164.260780 395.480602 19.998061" -$ns_ at 25.000000 "$node_(10) setdest 184.039441 474.459839 15.276071" - -$ns_ at 26.000000 "$node_(1) setdest 413.898194 539.190016 4.860144" -$ns_ at 26.000000 "$node_(2) setdest 472.249585 436.422368 18.993774" -$ns_ at 26.000000 "$node_(3) setdest 319.267001 516.756455 19.979069" -$ns_ at 26.000000 "$node_(4) setdest 422.915330 447.007413 19.951166" -$ns_ at 26.000000 "$node_(5) setdest 477.938097 430.823097 19.076018" -$ns_ at 26.000000 "$node_(6) setdest 140.850027 439.467490 18.656618" -$ns_ at 26.000000 "$node_(7) setdest 173.893091 515.708878 19.838210" -$ns_ at 26.000000 "$node_(8) setdest 62.077819 360.254769 15.604455" -$ns_ at 26.000000 "$node_(9) setdest 179.407140 382.455787 19.976437" -$ns_ at 26.000000 "$node_(10) setdest 185.534654 490.826466 16.434784" - -$ns_ at 27.000000 "$node_(1) setdest 419.345130 535.713495 6.461836" -$ns_ at 27.000000 "$node_(2) setdest 485.947996 449.586921 18.998734" -$ns_ at 27.000000 "$node_(3) setdest 339.044367 519.533812 19.971427" -$ns_ at 27.000000 "$node_(4) setdest 438.826119 435.000710 19.932740" -$ns_ at 27.000000 "$node_(5) setdest 473.471267 424.832381 7.472701" -$ns_ at 27.000000 "$node_(6) setdest 135.925019 421.904243 18.240706" -$ns_ at 27.000000 "$node_(7) setdest 186.435379 531.166580 19.906018" -$ns_ at 27.000000 "$node_(8) setdest 57.119411 374.294350 14.889447" -$ns_ at 27.000000 "$node_(9) setdest 192.143744 373.866180 15.362370" -$ns_ at 27.000000 "$node_(10) setdest 185.569664 508.866862 18.040430" - -$ns_ at 28.000000 "$node_(1) setdest 425.125458 530.097247 8.059430" -$ns_ at 28.000000 "$node_(2) setdest 493.049174 466.718934 18.545421" -$ns_ at 28.000000 "$node_(3) setdest 358.303469 524.898542 19.992332" -$ns_ at 28.000000 "$node_(4) setdest 450.847143 419.080495 19.948891" -$ns_ at 28.000000 "$node_(5) setdest 466.757695 428.118270 7.474565" -$ns_ at 28.000000 "$node_(6) setdest 128.600444 404.149699 19.206072" -$ns_ at 28.000000 "$node_(7) setdest 190.977325 534.505975 5.637449" -$ns_ at 28.000000 "$node_(8) setdest 50.549060 388.112799 15.300949" -$ns_ at 28.000000 "$node_(9) setdest 191.629729 374.111864 0.569712" -$ns_ at 28.000000 "$node_(10) setdest 181.834449 527.981880 19.476543" - -$ns_ at 29.000000 "$node_(1) setdest 431.663417 522.972367 9.669997" -$ns_ at 29.000000 "$node_(2) setdest 500.999975 483.730217 18.777619" -$ns_ at 29.000000 "$node_(3) setdest 378.191935 526.327594 19.939741" -$ns_ at 29.000000 "$node_(4) setdest 458.446194 400.622892 19.960678" -$ns_ at 29.000000 "$node_(5) setdest 461.699992 435.699961 9.113857" -$ns_ at 29.000000 "$node_(6) setdest 122.697249 385.435598 19.623081" -$ns_ at 29.000000 "$node_(7) setdest 183.725190 529.813555 8.637839" -$ns_ at 29.000000 "$node_(8) setdest 38.920729 400.522858 17.006694" -$ns_ at 29.000000 "$node_(9) setdest 190.433575 375.757305 2.034271" -$ns_ at 29.000000 "$node_(10) setdest 169.338208 541.367431 18.311990" - -$ns_ at 30.000000 "$node_(1) setdest 440.262619 515.700706 11.261586" -$ns_ at 30.000000 "$node_(2) setdest 500.811238 501.442061 17.712850" -$ns_ at 30.000000 "$node_(3) setdest 397.439899 521.321197 19.888392" -$ns_ at 30.000000 "$node_(4) setdest 464.984365 381.792314 19.933348" -$ns_ at 30.000000 "$node_(5) setdest 458.178246 445.894374 10.785581" -$ns_ at 30.000000 "$node_(6) setdest 117.489012 366.365374 19.768641" -$ns_ at 30.000000 "$node_(7) setdest 174.343370 525.704745 10.242113" -$ns_ at 30.000000 "$node_(8) setdest 24.090640 411.759729 18.606419" -$ns_ at 30.000000 "$node_(9) setdest 187.828459 378.293814 3.636002" -$ns_ at 30.000000 "$node_(10) setdest 152.821188 535.712898 17.458113" - -$ns_ at 31.000000 "$node_(1) setdest 451.405438 509.290896 12.854885" -$ns_ at 31.000000 "$node_(2) setdest 491.700571 517.036414 18.060678" -$ns_ at 31.000000 "$node_(3) setdest 413.171544 509.240492 19.835022" -$ns_ at 31.000000 "$node_(4) setdest 480.918024 372.117997 18.640651" -$ns_ at 31.000000 "$node_(5) setdest 456.464076 458.133299 12.358384" -$ns_ at 31.000000 "$node_(6) setdest 116.659357 360.796271 5.630563" -$ns_ at 31.000000 "$node_(7) setdest 164.951174 518.581014 11.788168" -$ns_ at 31.000000 "$node_(8) setdest 8.936318 423.738537 19.316970" -$ns_ at 31.000000 "$node_(9) setdest 184.393707 382.243473 5.234245" -$ns_ at 31.000000 "$node_(10) setdest 139.669561 526.256345 16.198509" - -$ns_ at 32.000000 "$node_(1) setdest 464.725397 503.658293 14.461934" -$ns_ at 32.000000 "$node_(2) setdest 479.083065 531.312050 19.052435" -$ns_ at 32.000000 "$node_(3) setdest 421.035268 491.095019 19.776156" -$ns_ at 32.000000 "$node_(4) setdest 490.592449 383.745440 15.125870" -$ns_ at 32.000000 "$node_(5) setdest 456.762816 472.118321 13.988212" -$ns_ at 32.000000 "$node_(6) setdest 116.717596 368.408818 7.612770" -$ns_ at 32.000000 "$node_(7) setdest 156.422329 508.202089 13.433662" -$ns_ at 32.000000 "$node_(8) setdest 11.745791 420.358995 4.394820" -$ns_ at 32.000000 "$node_(9) setdest 180.640795 387.951388 6.831153" -$ns_ at 32.000000 "$node_(10) setdest 126.512644 516.165541 16.580976" - -$ns_ at 33.000000 "$node_(1) setdest 480.312677 499.837211 16.048799" -$ns_ at 33.000000 "$node_(2) setdest 464.103605 542.498822 18.695670" -$ns_ at 33.000000 "$node_(3) setdest 415.566812 472.559995 19.324884" -$ns_ at 33.000000 "$node_(4) setdest 492.444864 398.380771 14.752097" -$ns_ at 33.000000 "$node_(5) setdest 454.811405 487.581008 15.585336" -$ns_ at 33.000000 "$node_(6) setdest 117.946938 377.618577 9.291444" -$ns_ at 33.000000 "$node_(7) setdest 147.983933 495.750139 15.041861" -$ns_ at 33.000000 "$node_(8) setdest 16.630884 421.422038 4.999419" -$ns_ at 33.000000 "$node_(9) setdest 176.046756 395.024567 8.434160" -$ns_ at 33.000000 "$node_(10) setdest 114.664512 502.380973 18.176703" - -$ns_ at 34.000000 "$node_(1) setdest 497.919072 498.422291 17.663158" -$ns_ at 34.000000 "$node_(2) setdest 467.653826 541.046000 3.835981" -$ns_ at 34.000000 "$node_(3) setdest 405.186017 464.081358 13.403290" -$ns_ at 34.000000 "$node_(4) setdest 490.175129 414.347121 16.126873" -$ns_ at 34.000000 "$node_(5) setdest 451.792079 504.480069 17.166671" -$ns_ at 34.000000 "$node_(6) setdest 121.883147 387.777476 10.894815" -$ns_ at 34.000000 "$node_(7) setdest 138.114893 482.374086 16.622777" -$ns_ at 34.000000 "$node_(8) setdest 22.994022 423.191629 6.604618" -$ns_ at 34.000000 "$node_(9) setdest 170.044883 403.068060 10.035948" -$ns_ at 34.000000 "$node_(10) setdest 107.004140 484.410586 19.534997" - -$ns_ at 35.000000 "$node_(1) setdest 517.152845 499.275087 19.252670" -$ns_ at 35.000000 "$node_(2) setdest 469.760083 536.639542 4.883974" -$ns_ at 35.000000 "$node_(3) setdest 406.522026 464.499466 1.399905" -$ns_ at 35.000000 "$node_(4) setdest 486.192447 431.664927 17.769867" -$ns_ at 35.000000 "$node_(5) setdest 441.963945 520.294525 18.619593" -$ns_ at 35.000000 "$node_(6) setdest 124.346991 399.961894 12.431032" -$ns_ at 35.000000 "$node_(7) setdest 124.150809 470.712739 18.192929" -$ns_ at 35.000000 "$node_(8) setdest 30.684577 426.047417 8.203668" -$ns_ at 35.000000 "$node_(9) setdest 162.654904 412.053873 11.634287" -$ns_ at 35.000000 "$node_(10) setdest 107.841118 465.759378 18.669978" - -$ns_ at 36.000000 "$node_(1) setdest 536.528998 504.082029 19.963517" -$ns_ at 36.000000 "$node_(2) setdest 474.403635 532.108135 6.488160" -$ns_ at 36.000000 "$node_(3) setdest 409.528015 464.468428 3.006149" -$ns_ at 36.000000 "$node_(4) setdest 484.427652 450.881008 19.296950" -$ns_ at 36.000000 "$node_(5) setdest 426.470273 532.788799 19.903788" -$ns_ at 36.000000 "$node_(6) setdest 120.932715 413.505237 13.967084" -$ns_ at 36.000000 "$node_(7) setdest 105.532349 464.813463 19.530707" -$ns_ at 36.000000 "$node_(8) setdest 39.253080 430.783080 9.790084" -$ns_ at 36.000000 "$node_(9) setdest 153.536221 421.645072 13.234104" -$ns_ at 36.000000 "$node_(10) setdest 117.666134 450.695452 17.984794" - -$ns_ at 37.000000 "$node_(1) setdest 554.428542 512.921944 19.963411" -$ns_ at 37.000000 "$node_(2) setdest 481.127335 527.610678 8.089206" -$ns_ at 37.000000 "$node_(3) setdest 414.102043 465.013680 4.606412" -$ns_ at 37.000000 "$node_(4) setdest 489.773407 469.940100 19.794597" -$ns_ at 37.000000 "$node_(5) setdest 408.058188 532.100718 18.424937" -$ns_ at 37.000000 "$node_(6) setdest 109.012095 423.192684 15.360592" -$ns_ at 37.000000 "$node_(7) setdest 85.728992 467.102452 19.935205" -$ns_ at 37.000000 "$node_(8) setdest 48.361002 437.630220 11.394629" -$ns_ at 37.000000 "$node_(9) setdest 142.102893 431.075459 14.820701" -$ns_ at 37.000000 "$node_(10) setdest 131.161133 437.935237 18.572509" - -$ns_ at 38.000000 "$node_(1) setdest 566.932229 527.655226 19.323866" -$ns_ at 38.000000 "$node_(2) setdest 490.148231 524.075412 9.688895" -$ns_ at 38.000000 "$node_(3) setdest 420.185075 466.255244 6.208443" -$ns_ at 38.000000 "$node_(4) setdest 501.252538 485.927117 19.681340" -$ns_ at 38.000000 "$node_(5) setdest 405.981429 521.845202 10.463677" -$ns_ at 38.000000 "$node_(6) setdest 91.954174 422.557957 17.069726" -$ns_ at 38.000000 "$node_(7) setdest 66.578736 472.830545 19.988581" -$ns_ at 38.000000 "$node_(8) setdest 58.379443 445.916629 13.001297" -$ns_ at 38.000000 "$node_(9) setdest 128.348746 440.069498 16.433785" -$ns_ at 38.000000 "$node_(10) setdest 139.114132 421.205939 18.523488" - -$ns_ at 39.000000 "$node_(1) setdest 567.143596 529.512240 1.869004" -$ns_ at 39.000000 "$node_(2) setdest 501.202329 521.792270 11.287418" -$ns_ at 39.000000 "$node_(3) setdest 427.677364 468.446739 7.806218" -$ns_ at 39.000000 "$node_(4) setdest 511.141012 502.780491 19.540167" -$ns_ at 39.000000 "$node_(5) setdest 413.374406 514.767835 10.234513" -$ns_ at 39.000000 "$node_(6) setdest 75.493177 413.507199 18.785117" -$ns_ at 39.000000 "$node_(7) setdest 46.764183 471.773954 19.842703" -$ns_ at 39.000000 "$node_(8) setdest 69.942011 454.838968 14.604833" -$ns_ at 39.000000 "$node_(9) setdest 112.291115 448.251876 18.022176" -$ns_ at 39.000000 "$node_(10) setdest 141.846200 402.561193 18.843852" - -$ns_ at 40.000000 "$node_(1) setdest 564.578377 527.996748 2.979440" -$ns_ at 40.000000 "$node_(2) setdest 514.059687 520.805131 12.895197" -$ns_ at 40.000000 "$node_(3) setdest 436.538030 471.609166 9.408100" -$ns_ at 40.000000 "$node_(4) setdest 519.473141 520.208352 19.317213" -$ns_ at 40.000000 "$node_(5) setdest 419.858457 504.879506 11.824634" -$ns_ at 40.000000 "$node_(6) setdest 87.235668 420.830481 13.838951" -$ns_ at 40.000000 "$node_(7) setdest 64.203274 476.552061 18.081820" -$ns_ at 40.000000 "$node_(8) setdest 84.829204 454.481993 14.891472" -$ns_ at 40.000000 "$node_(9) setdest 125.059425 443.474044 13.632954" -$ns_ at 40.000000 "$node_(10) setdest 148.729503 397.886383 8.320679" - -$ns_ at 41.000000 "$node_(1) setdest 560.539286 525.794333 4.600531" -$ns_ at 41.000000 "$node_(2) setdest 528.559240 520.724740 14.499776" -$ns_ at 41.000000 "$node_(3) setdest 446.636223 475.986259 11.006019" -$ns_ at 41.000000 "$node_(4) setdest 526.125692 538.415388 19.384339" -$ns_ at 41.000000 "$node_(5) setdest 424.189640 492.212788 13.386743" -$ns_ at 41.000000 "$node_(6) setdest 102.775617 424.456016 15.957271" -$ns_ at 41.000000 "$node_(7) setdest 83.933552 478.414079 19.817945" -$ns_ at 41.000000 "$node_(8) setdest 101.442514 452.999884 16.679290" -$ns_ at 41.000000 "$node_(9) setdest 140.551926 441.300742 15.644194" -$ns_ at 41.000000 "$node_(10) setdest 158.699125 396.791989 10.029510" - -$ns_ at 42.000000 "$node_(1) setdest 554.946328 523.113767 6.202145" -$ns_ at 42.000000 "$node_(2) setdest 544.648492 520.084739 16.101976" -$ns_ at 42.000000 "$node_(3) setdest 457.867768 481.716252 12.608743" -$ns_ at 42.000000 "$node_(4) setdest 542.996006 542.160589 17.281030" -$ns_ at 42.000000 "$node_(5) setdest 427.836410 477.619041 15.042485" -$ns_ at 42.000000 "$node_(6) setdest 120.073180 427.461833 17.556783" -$ns_ at 42.000000 "$node_(7) setdest 103.908927 479.371110 19.998288" -$ns_ at 42.000000 "$node_(8) setdest 119.693903 451.998492 18.278840" -$ns_ at 42.000000 "$node_(9) setdest 157.508841 438.167173 17.244020" -$ns_ at 42.000000 "$node_(10) setdest 170.268449 395.614996 11.629039" - -$ns_ at 43.000000 "$node_(1) setdest 548.011229 519.540767 7.801405" -$ns_ at 43.000000 "$node_(2) setdest 559.640611 513.386833 16.420280" -$ns_ at 43.000000 "$node_(3) setdest 470.540438 488.142494 14.208911" -$ns_ at 43.000000 "$node_(4) setdest 557.442321 534.605141 16.302785" -$ns_ at 43.000000 "$node_(5) setdest 432.038134 461.515754 16.642426" -$ns_ at 43.000000 "$node_(6) setdest 139.110535 429.593024 19.156274" -$ns_ at 43.000000 "$node_(7) setdest 123.907121 479.374828 19.998194" -$ns_ at 43.000000 "$node_(8) setdest 139.427933 451.544210 19.739258" -$ns_ at 43.000000 "$node_(9) setdest 176.047394 434.787992 18.844013" -$ns_ at 43.000000 "$node_(10) setdest 183.465605 394.695269 13.229166" - -$ns_ at 44.000000 "$node_(1) setdest 540.245181 514.250782 9.396566" -$ns_ at 44.000000 "$node_(2) setdest 557.197334 501.679640 11.959430" -$ns_ at 44.000000 "$node_(3) setdest 484.194340 496.104414 15.805733" -$ns_ at 44.000000 "$node_(4) setdest 569.805764 524.976564 15.670489" -$ns_ at 44.000000 "$node_(5) setdest 437.187949 444.017164 18.240648" -$ns_ at 44.000000 "$node_(6) setdest 159.082551 430.599768 19.997374" -$ns_ at 44.000000 "$node_(7) setdest 143.880972 478.393510 19.997942" -$ns_ at 44.000000 "$node_(8) setdest 159.427822 451.554805 19.999892" -$ns_ at 44.000000 "$node_(9) setdest 195.825003 432.098619 19.959623" -$ns_ at 44.000000 "$node_(10) setdest 198.232049 393.331915 14.829248" - -$ns_ at 45.000000 "$node_(1) setdest 531.522089 507.546145 11.002022" -$ns_ at 45.000000 "$node_(2) setdest 547.805553 492.435892 13.177725" -$ns_ at 45.000000 "$node_(3) setdest 499.562490 504.256506 17.396455" -$ns_ at 45.000000 "$node_(4) setdest 586.131716 520.450839 16.941632" -$ns_ at 45.000000 "$node_(5) setdest 444.245357 425.600998 19.722124" -$ns_ at 45.000000 "$node_(6) setdest 179.081213 430.697528 19.998900" -$ns_ at 45.000000 "$node_(7) setdest 163.775015 476.359693 19.997735" -$ns_ at 45.000000 "$node_(8) setdest 179.427632 451.479451 19.999952" -$ns_ at 45.000000 "$node_(9) setdest 215.744509 430.326634 19.998166" -$ns_ at 45.000000 "$node_(10) setdest 214.511122 391.127338 16.427671" - -$ns_ at 46.000000 "$node_(1) setdest 521.224593 500.285353 12.599902" -$ns_ at 46.000000 "$node_(2) setdest 537.140911 482.188971 14.789658" -$ns_ at 46.000000 "$node_(3) setdest 517.239989 511.230267 19.003350" -$ns_ at 46.000000 "$node_(4) setdest 596.737679 531.230366 15.122323" -$ns_ at 46.000000 "$node_(5) setdest 450.567683 406.626744 19.999853" -$ns_ at 46.000000 "$node_(6) setdest 199.077088 430.293213 19.999963" -$ns_ at 46.000000 "$node_(7) setdest 183.547456 473.359299 19.998794" -$ns_ at 46.000000 "$node_(8) setdest 199.426772 451.293967 19.999999" -$ns_ at 46.000000 "$node_(9) setdest 235.727172 429.545275 19.997933" -$ns_ at 46.000000 "$node_(10) setdest 232.313482 388.287908 18.027380" - -$ns_ at 47.000000 "$node_(1) setdest 509.132728 492.839445 14.200519" -$ns_ at 47.000000 "$node_(2) setdest 529.956513 467.566241 16.292323" -$ns_ at 47.000000 "$node_(3) setdest 530.443547 512.706866 13.285868" -$ns_ at 47.000000 "$node_(4) setdest 593.888061 544.610217 13.679939" -$ns_ at 47.000000 "$node_(5) setdest 455.365546 387.217155 19.993791" -$ns_ at 47.000000 "$node_(6) setdest 219.066969 429.662345 19.999833" -$ns_ at 47.000000 "$node_(7) setdest 203.164862 469.479130 19.997458" -$ns_ at 47.000000 "$node_(8) setdest 219.417361 451.789967 19.996742" -$ns_ at 47.000000 "$node_(9) setdest 255.709496 428.728816 19.998997" -$ns_ at 47.000000 "$node_(10) setdest 251.796297 386.439234 19.570326" - -$ns_ at 48.000000 "$node_(1) setdest 494.811654 486.211110 15.780621" -$ns_ at 48.000000 "$node_(2) setdest 523.405915 450.824130 17.978004" -$ns_ at 48.000000 "$node_(3) setdest 527.369831 511.982215 3.157982" -$ns_ at 48.000000 "$node_(4) setdest 596.143329 540.896760 4.344652" -$ns_ at 48.000000 "$node_(5) setdest 452.127739 368.087344 19.401882" -$ns_ at 48.000000 "$node_(6) setdest 239.040183 428.633694 19.999686" -$ns_ at 48.000000 "$node_(7) setdest 222.507492 464.407083 19.996575" -$ns_ at 48.000000 "$node_(8) setdest 239.319828 453.699710 19.993882" -$ns_ at 48.000000 "$node_(9) setdest 275.658454 427.303064 19.999843" -$ns_ at 48.000000 "$node_(10) setdest 271.767272 385.393628 19.998328" - -$ns_ at 49.000000 "$node_(1) setdest 477.936814 482.029186 17.385301" -$ns_ at 49.000000 "$node_(2) setdest 511.589591 435.283606 19.522638" -$ns_ at 49.000000 "$node_(3) setdest 522.811495 510.411820 4.821262" -$ns_ at 49.000000 "$node_(4) setdest 596.364469 534.992612 5.908287" -$ns_ at 49.000000 "$node_(5) setdest 441.999585 365.539662 10.443668" -$ns_ at 49.000000 "$node_(6) setdest 259.000403 427.373742 19.999946" -$ns_ at 49.000000 "$node_(7) setdest 241.427668 457.938519 19.995384" -$ns_ at 49.000000 "$node_(8) setdest 258.949550 457.488811 19.992080" -$ns_ at 49.000000 "$node_(9) setdest 295.601472 425.794473 19.999995" -$ns_ at 49.000000 "$node_(10) setdest 291.764641 385.099501 19.999532" - -$ns_ at 50.000000 "$node_(1) setdest 460.251786 475.213570 18.952911" -$ns_ at 50.000000 "$node_(2) setdest 494.572859 425.450831 19.653312" -$ns_ at 50.000000 "$node_(3) setdest 516.437962 509.551212 6.431374" -$ns_ at 50.000000 "$node_(4) setdest 595.905073 527.487889 7.518771" -$ns_ at 50.000000 "$node_(5) setdest 435.704871 370.756310 8.175380" -$ns_ at 50.000000 "$node_(6) setdest 278.984020 426.603522 19.998455" -$ns_ at 50.000000 "$node_(7) setdest 259.940900 450.373613 19.999189" -$ns_ at 50.000000 "$node_(8) setdest 278.151718 463.062180 19.994642" -$ns_ at 50.000000 "$node_(9) setdest 315.561187 424.532692 19.999558" -$ns_ at 50.000000 "$node_(10) setdest 311.760339 384.687257 19.999947" - -$ns_ at 51.000000 "$node_(1) setdest 445.750485 461.773203 19.771980" -$ns_ at 51.000000 "$node_(2) setdest 477.062237 431.160008 18.417833" -$ns_ at 51.000000 "$node_(3) setdest 508.417207 509.293695 8.024888" -$ns_ at 51.000000 "$node_(4) setdest 596.138322 518.372789 9.118084" -$ns_ at 51.000000 "$node_(5) setdest 427.847555 376.601237 9.792885" -$ns_ at 51.000000 "$node_(6) setdest 298.977580 426.115506 19.999515" -$ns_ at 51.000000 "$node_(7) setdest 278.425975 442.746479 19.996779" -$ns_ at 51.000000 "$node_(8) setdest 297.021088 469.690556 19.999713" -$ns_ at 51.000000 "$node_(9) setdest 335.550946 423.983930 19.997290" -$ns_ at 51.000000 "$node_(10) setdest 331.755079 384.949165 19.996455" - -$ns_ at 52.000000 "$node_(1) setdest 440.756113 442.613683 19.799772" -$ns_ at 52.000000 "$node_(2) setdest 463.491729 442.499863 17.684767" -$ns_ at 52.000000 "$node_(3) setdest 498.797256 509.801163 9.633327" -$ns_ at 52.000000 "$node_(4) setdest 595.872849 507.661271 10.714807" -$ns_ at 52.000000 "$node_(5) setdest 421.543150 385.787102 11.141168" -$ns_ at 52.000000 "$node_(6) setdest 318.966418 425.467482 19.999339" -$ns_ at 52.000000 "$node_(7) setdest 297.432455 436.535728 19.995493" -$ns_ at 52.000000 "$node_(8) setdest 316.154504 475.504807 19.997327" -$ns_ at 52.000000 "$node_(9) setdest 355.519975 424.976200 19.993668" -$ns_ at 52.000000 "$node_(10) setdest 351.681172 386.619992 19.996020" - -$ns_ at 53.000000 "$node_(1) setdest 439.775796 422.648723 19.989013" -$ns_ at 53.000000 "$node_(2) setdest 454.163430 457.931863 18.032299" -$ns_ at 53.000000 "$node_(3) setdest 487.566288 509.968935 11.232221" -$ns_ at 53.000000 "$node_(4) setdest 593.366650 495.626354 12.293098" -$ns_ at 53.000000 "$node_(5) setdest 426.618346 394.729658 10.282360" -$ns_ at 53.000000 "$node_(6) setdest 338.963772 425.552181 19.997533" -$ns_ at 53.000000 "$node_(7) setdest 316.854629 431.777866 19.996452" -$ns_ at 53.000000 "$node_(8) setdest 335.626595 480.039122 19.993058" -$ns_ at 53.000000 "$node_(9) setdest 375.323130 427.689354 19.988150" -$ns_ at 53.000000 "$node_(10) setdest 371.379909 390.033338 19.992278" - -$ns_ at 54.000000 "$node_(1) setdest 445.215882 403.632184 19.779365" -$ns_ at 54.000000 "$node_(2) setdest 454.059564 475.725275 17.793715" -$ns_ at 54.000000 "$node_(3) setdest 474.763417 509.199397 12.825977" -$ns_ at 54.000000 "$node_(4) setdest 586.634251 483.521630 13.850977" -$ns_ at 54.000000 "$node_(5) setdest 434.740699 390.416312 9.196607" -$ns_ at 54.000000 "$node_(6) setdest 358.922646 426.804947 19.998152" -$ns_ at 54.000000 "$node_(7) setdest 336.584130 428.536703 19.993958" -$ns_ at 54.000000 "$node_(8) setdest 355.462297 482.552656 19.994323" -$ns_ at 54.000000 "$node_(9) setdest 394.479217 433.330580 19.969455" -$ns_ at 54.000000 "$node_(10) setdest 390.644077 395.375055 19.991051" - -$ns_ at 55.000000 "$node_(1) setdest 453.489395 385.467485 19.960143" -$ns_ at 55.000000 "$node_(2) setdest 462.180023 491.875553 18.076873" -$ns_ at 55.000000 "$node_(3) setdest 460.781091 505.762029 14.398644" -$ns_ at 55.000000 "$node_(4) setdest 575.183381 473.135665 15.459324" -$ns_ at 55.000000 "$node_(5) setdest 443.385083 383.339482 11.171700" -$ns_ at 55.000000 "$node_(6) setdest 378.818295 428.840950 19.999553" -$ns_ at 55.000000 "$node_(7) setdest 356.438978 426.133796 19.999724" -$ns_ at 55.000000 "$node_(8) setdest 375.442154 483.043104 19.985875" -$ns_ at 55.000000 "$node_(9) setdest 411.603795 443.510768 19.922032" -$ns_ at 55.000000 "$node_(10) setdest 409.167270 402.886591 19.988293" - -$ns_ at 56.000000 "$node_(1) setdest 459.358776 366.350314 19.997896" -$ns_ at 56.000000 "$node_(2) setdest 474.439207 506.513884 19.093672" -$ns_ at 56.000000 "$node_(3) setdest 448.331346 496.551801 15.486266" -$ns_ at 56.000000 "$node_(4) setdest 559.796949 465.725065 17.078034" -$ns_ at 56.000000 "$node_(5) setdest 453.233562 375.205933 12.772907" -$ns_ at 56.000000 "$node_(6) setdest 398.640054 431.491358 19.998170" -$ns_ at 56.000000 "$node_(7) setdest 376.341269 424.293425 19.987200" -$ns_ at 56.000000 "$node_(8) setdest 395.289271 480.727854 19.981702" -$ns_ at 56.000000 "$node_(9) setdest 424.686463 458.541108 19.926549" -$ns_ at 56.000000 "$node_(10) setdest 426.588462 412.682524 19.986450" - -$ns_ at 57.000000 "$node_(1) setdest 474.147494 357.589355 17.188968" -$ns_ at 57.000000 "$node_(2) setdest 487.397435 521.211648 19.594386" -$ns_ at 57.000000 "$node_(3) setdest 449.175044 489.763733 6.840299" -$ns_ at 57.000000 "$node_(4) setdest 541.945847 460.100331 18.716289" -$ns_ at 57.000000 "$node_(5) setdest 461.910819 364.190126 14.022938" -$ns_ at 57.000000 "$node_(6) setdest 418.176323 435.711193 19.986816" -$ns_ at 57.000000 "$node_(7) setdest 395.624998 428.517124 19.740868" -$ns_ at 57.000000 "$node_(8) setdest 414.491546 475.216368 19.977584" -$ns_ at 57.000000 "$node_(9) setdest 432.332273 476.914703 19.900939" -$ns_ at 57.000000 "$node_(10) setdest 442.302058 425.016869 19.976315" - -$ns_ at 58.000000 "$node_(1) setdest 481.754901 367.368742 12.389877" -$ns_ at 58.000000 "$node_(2) setdest 501.253150 535.247087 19.722434" -$ns_ at 58.000000 "$node_(3) setdest 452.555239 490.811571 3.538882" -$ns_ at 58.000000 "$node_(4) setdest 523.200618 453.356899 19.921282" -$ns_ at 58.000000 "$node_(5) setdest 462.037992 362.225513 1.968725" -$ns_ at 58.000000 "$node_(6) setdest 436.692511 443.161055 19.958699" -$ns_ at 58.000000 "$node_(7) setdest 407.232993 444.170234 19.487570" -$ns_ at 58.000000 "$node_(8) setdest 432.402128 466.376774 19.973166" -$ns_ at 58.000000 "$node_(9) setdest 433.371712 496.829333 19.941738" -$ns_ at 58.000000 "$node_(10) setdest 455.460442 440.041839 19.972301" - -$ns_ at 59.000000 "$node_(1) setdest 490.840101 378.013714 13.994866" -$ns_ at 59.000000 "$node_(2) setdest 517.254096 544.656606 18.562578" -$ns_ at 59.000000 "$node_(3) setdest 456.805761 493.906270 5.257765" -$ns_ at 59.000000 "$node_(4) setdest 505.296597 444.480311 19.983688" -$ns_ at 59.000000 "$node_(5) setdest 459.985759 364.047842 2.744548" -$ns_ at 59.000000 "$node_(6) setdest 452.558464 455.227354 19.932988" -$ns_ at 59.000000 "$node_(7) setdest 405.781902 462.093611 17.982022" -$ns_ at 59.000000 "$node_(8) setdest 448.131072 454.084488 19.962465" -$ns_ at 59.000000 "$node_(9) setdest 431.643951 516.751552 19.996999" -$ns_ at 59.000000 "$node_(10) setdest 465.450760 457.326282 19.963928" - -$ns_ at 60.000000 "$node_(1) setdest 498.659527 391.489267 15.579922" -$ns_ at 60.000000 "$node_(2) setdest 534.755136 543.334674 17.550895" -$ns_ at 60.000000 "$node_(3) setdest 462.401977 497.870630 6.858118" -$ns_ at 60.000000 "$node_(4) setdest 488.791604 433.220713 19.979823" -$ns_ at 60.000000 "$node_(5) setdest 456.842494 367.045729 4.343667" -$ns_ at 60.000000 "$node_(6) setdest 465.331500 470.591333 19.980047" -$ns_ at 60.000000 "$node_(7) setdest 408.815556 476.318798 14.545068" -$ns_ at 60.000000 "$node_(8) setdest 460.493008 438.434407 19.943483" -$ns_ at 60.000000 "$node_(9) setdest 438.396275 534.407383 18.902969" -$ns_ at 60.000000 "$node_(10) setdest 472.292912 476.109195 19.990319" - -$ns_ at 61.000000 "$node_(1) setdest 506.422494 406.848972 17.210003" -$ns_ at 61.000000 "$node_(2) setdest 550.122906 534.408750 17.771901" -$ns_ at 61.000000 "$node_(3) setdest 469.441169 502.553605 8.454613" -$ns_ at 61.000000 "$node_(4) setdest 473.810761 419.970774 19.999664" -$ns_ at 61.000000 "$node_(5) setdest 452.869841 371.468100 5.944690" -$ns_ at 61.000000 "$node_(6) setdest 475.369253 487.873233 19.985509" -$ns_ at 61.000000 "$node_(7) setdest 420.177106 474.634595 11.485703" -$ns_ at 61.000000 "$node_(8) setdest 468.519800 420.146652 19.971764" -$ns_ at 61.000000 "$node_(9) setdest 456.064353 537.336055 17.909162" -$ns_ at 61.000000 "$node_(10) setdest 480.398446 494.324173 19.937028" - -$ns_ at 62.000000 "$node_(1) setdest 514.243671 423.949759 18.804460" -$ns_ at 62.000000 "$node_(2) setdest 558.597008 518.822165 17.741252" -$ns_ at 62.000000 "$node_(3) setdest 478.289486 507.332608 10.056420" -$ns_ at 62.000000 "$node_(4) setdest 459.228341 406.299144 19.989007" -$ns_ at 62.000000 "$node_(5) setdest 448.065246 377.284900 7.544488" -$ns_ at 62.000000 "$node_(6) setdest 483.292150 506.217705 19.982291" -$ns_ at 62.000000 "$node_(7) setdest 431.806592 467.919195 13.429130" -$ns_ at 62.000000 "$node_(8) setdest 473.157337 400.709492 19.982741" -$ns_ at 62.000000 "$node_(9) setdest 471.569985 531.759731 16.477864" -$ns_ at 62.000000 "$node_(10) setdest 493.533931 509.329068 19.942113" - -$ns_ at 63.000000 "$node_(1) setdest 526.606177 439.546625 19.902105" -$ns_ at 63.000000 "$node_(2) setdest 563.865355 500.625921 18.943568" -$ns_ at 63.000000 "$node_(3) setdest 488.865584 512.231308 11.655519" -$ns_ at 63.000000 "$node_(4) setdest 443.896167 393.463964 19.995435" -$ns_ at 63.000000 "$node_(5) setdest 443.134296 384.956898 9.119968" -$ns_ at 63.000000 "$node_(6) setdest 483.704532 525.909424 19.696036" -$ns_ at 63.000000 "$node_(7) setdest 441.488756 456.383377 15.060524" -$ns_ at 63.000000 "$node_(8) setdest 471.609423 381.023538 19.746717" -$ns_ at 63.000000 "$node_(9) setdest 484.411309 520.929706 16.798483" -$ns_ at 63.000000 "$node_(10) setdest 509.195143 521.746549 19.986681" - -$ns_ at 64.000000 "$node_(1) setdest 540.433816 453.956062 19.970865" -$ns_ at 64.000000 "$node_(2) setdest 568.124533 481.658093 19.440142" -$ns_ at 64.000000 "$node_(3) setdest 501.350038 516.664198 13.248098" -$ns_ at 64.000000 "$node_(4) setdest 433.455434 376.647829 19.793718" -$ns_ at 64.000000 "$node_(5) setdest 440.254466 395.258128 10.696204" -$ns_ at 64.000000 "$node_(6) setdest 469.652755 537.742107 18.370216" -$ns_ at 64.000000 "$node_(7) setdest 449.511886 441.764181 16.676076" -$ns_ at 64.000000 "$node_(8) setdest 457.550576 367.766860 19.323320" -$ns_ at 64.000000 "$node_(9) setdest 498.202162 508.754862 18.396045" -$ns_ at 64.000000 "$node_(10) setdest 527.839755 528.576108 19.856093" - -$ns_ at 65.000000 "$node_(1) setdest 536.004799 446.599409 8.586997" -$ns_ at 65.000000 "$node_(2) setdest 564.983309 461.913673 19.992735" -$ns_ at 65.000000 "$node_(3) setdest 500.747238 516.306833 0.700769" -$ns_ at 65.000000 "$node_(4) setdest 438.545894 357.691580 19.627842" -$ns_ at 65.000000 "$node_(5) setdest 441.586829 385.431591 9.916452" -$ns_ at 65.000000 "$node_(6) setdest 457.118274 526.488725 16.844935" -$ns_ at 65.000000 "$node_(7) setdest 457.806607 425.470338 18.283646" -$ns_ at 65.000000 "$node_(8) setdest 439.123220 364.402269 18.732003" -$ns_ at 65.000000 "$node_(9) setdest 510.416367 493.167415 19.802912" -$ns_ at 65.000000 "$node_(10) setdest 547.813104 529.300629 19.986485" - -$ns_ at 66.000000 "$node_(1) setdest 535.511187 436.310624 10.300619" -$ns_ at 66.000000 "$node_(2) setdest 562.492130 442.069901 19.999531" -$ns_ at 66.000000 "$node_(3) setdest 500.517193 514.277017 2.042810" -$ns_ at 66.000000 "$node_(4) setdest 445.642038 338.993091 19.999719" -$ns_ at 66.000000 "$node_(5) setdest 444.691682 374.116179 11.733655" -$ns_ at 66.000000 "$node_(6) setdest 455.508240 510.110942 16.456730" -$ns_ at 66.000000 "$node_(7) setdest 468.428808 408.858654 19.717485" -$ns_ at 66.000000 "$node_(8) setdest 419.931073 364.342807 19.192239" -$ns_ at 66.000000 "$node_(9) setdest 524.816169 479.714481 19.706235" -$ns_ at 66.000000 "$node_(10) setdest 567.683020 530.920241 19.935814" - -$ns_ at 67.000000 "$node_(1) setdest 534.977282 424.421906 11.900701" -$ns_ at 67.000000 "$node_(2) setdest 560.569724 422.162987 19.999522" -$ns_ at 67.000000 "$node_(3) setdest 500.250852 510.644079 3.642688" -$ns_ at 67.000000 "$node_(4) setdest 452.955902 320.378413 19.999972" -$ns_ at 67.000000 "$node_(5) setdest 448.073535 361.217857 13.334303" -$ns_ at 67.000000 "$node_(6) setdest 451.399100 495.313815 15.357083" -$ns_ at 67.000000 "$node_(7) setdest 481.733772 393.932468 19.995327" -$ns_ at 67.000000 "$node_(8) setdest 408.322022 365.329378 11.650896" -$ns_ at 67.000000 "$node_(9) setdest 539.158447 466.290889 19.644179" -$ns_ at 67.000000 "$node_(10) setdest 586.678542 530.162271 19.010638" - -$ns_ at 68.000000 "$node_(1) setdest 534.442950 410.931909 13.500575" -$ns_ at 68.000000 "$node_(2) setdest 558.901130 402.232965 19.999749" -$ns_ at 68.000000 "$node_(3) setdest 500.103546 505.403612 5.242537" -$ns_ at 68.000000 "$node_(4) setdest 460.080618 301.691006 19.999519" -$ns_ at 68.000000 "$node_(5) setdest 452.196525 346.864412 14.933869" -$ns_ at 68.000000 "$node_(6) setdest 438.416880 485.903560 16.034056" -$ns_ at 68.000000 "$node_(7) setdest 492.545093 377.214664 19.909034" -$ns_ at 68.000000 "$node_(8) setdest 416.839668 364.609333 8.548026" -$ns_ at 68.000000 "$node_(9) setdest 555.040544 454.694707 19.665006" -$ns_ at 68.000000 "$node_(10) setdest 586.825175 529.031950 1.139792" - -$ns_ at 69.000000 "$node_(1) setdest 534.282344 395.832941 15.099822" -$ns_ at 69.000000 "$node_(2) setdest 557.329589 382.294855 19.999950" -$ns_ at 69.000000 "$node_(3) setdest 500.199783 498.561725 6.842563" -$ns_ at 69.000000 "$node_(4) setdest 466.364502 282.705492 19.998423" -$ns_ at 69.000000 "$node_(5) setdest 457.330300 331.148052 16.533591" -$ns_ at 69.000000 "$node_(6) setdest 422.274174 478.513804 17.753744" -$ns_ at 69.000000 "$node_(7) setdest 503.862909 361.836359 19.094115" -$ns_ at 69.000000 "$node_(8) setdest 427.020554 367.160258 10.495602" -$ns_ at 69.000000 "$node_(9) setdest 571.735283 444.352269 19.638745" -$ns_ at 69.000000 "$node_(10) setdest 585.455531 526.966140 2.478608" - -$ns_ at 70.000000 "$node_(1) setdest 534.838474 379.142686 16.699517" -$ns_ at 70.000000 "$node_(2) setdest 555.525020 362.376742 19.999692" -$ns_ at 70.000000 "$node_(3) setdest 500.519465 490.124854 8.442926" -$ns_ at 70.000000 "$node_(4) setdest 471.472022 263.373599 19.995221" -$ns_ at 70.000000 "$node_(5) setdest 463.120393 313.962864 18.134383" -$ns_ at 70.000000 "$node_(6) setdest 408.213514 466.311334 18.617262" -$ns_ at 70.000000 "$node_(7) setdest 507.696506 363.297112 4.102471" -$ns_ at 70.000000 "$node_(8) setdest 439.013807 368.678079 12.088916" -$ns_ at 70.000000 "$node_(9) setdest 589.464572 437.178961 19.125482" -$ns_ at 70.000000 "$node_(10) setdest 583.204839 523.564669 4.078679" - -$ns_ at 71.000000 "$node_(1) setdest 536.112282 360.887514 18.299561" -$ns_ at 71.000000 "$node_(2) setdest 553.523133 342.477773 19.999413" -$ns_ at 71.000000 "$node_(3) setdest 501.048110 480.096108 10.042669" -$ns_ at 71.000000 "$node_(4) setdest 475.511485 243.786853 19.998948" -$ns_ at 71.000000 "$node_(5) setdest 469.394485 295.340571 19.650802" -$ns_ at 71.000000 "$node_(6) setdest 409.735707 449.316228 17.063139" -$ns_ at 71.000000 "$node_(7) setdest 509.753088 368.161673 5.281428" -$ns_ at 71.000000 "$node_(8) setdest 452.539013 366.922685 13.638644" -$ns_ at 71.000000 "$node_(9) setdest 593.411094 420.224329 17.407888" -$ns_ at 71.000000 "$node_(10) setdest 580.200954 518.748793 5.675913" - -$ns_ at 72.000000 "$node_(1) setdest 538.243058 341.252788 19.750004" -$ns_ at 72.000000 "$node_(2) setdest 552.067476 322.531052 19.999766" -$ns_ at 72.000000 "$node_(3) setdest 502.043198 468.496468 11.642244" -$ns_ at 72.000000 "$node_(4) setdest 478.483272 224.011916 19.996990" -$ns_ at 72.000000 "$node_(5) setdest 475.540955 276.308901 19.999589" -$ns_ at 72.000000 "$node_(6) setdest 417.775607 434.844392 16.555181" -$ns_ at 72.000000 "$node_(7) setdest 510.902737 374.952179 6.887138" -$ns_ at 72.000000 "$node_(8) setdest 467.088300 362.216077 15.291629" -$ns_ at 72.000000 "$node_(9) setdest 588.386379 404.792399 16.229363" -$ns_ at 72.000000 "$node_(10) setdest 576.937804 512.244383 7.277053" - -$ns_ at 73.000000 "$node_(1) setdest 540.337760 321.362851 19.999934" -$ns_ at 73.000000 "$node_(2) setdest 550.508182 302.593413 19.998521" -$ns_ at 73.000000 "$node_(3) setdest 503.738640 455.363500 13.241955" -$ns_ at 73.000000 "$node_(4) setdest 480.607929 204.125582 19.999511" -$ns_ at 73.000000 "$node_(5) setdest 482.491192 257.559586 19.996064" -$ns_ at 73.000000 "$node_(6) setdest 424.060892 418.184577 17.806018" -$ns_ at 73.000000 "$node_(7) setdest 511.222289 383.432144 8.485983" -$ns_ at 73.000000 "$node_(8) setdest 483.575039 358.506602 16.898898" -$ns_ at 73.000000 "$node_(9) setdest 581.016072 390.553508 16.033323" -$ns_ at 73.000000 "$node_(10) setdest 573.633501 504.005362 8.876930" - -$ns_ at 74.000000 "$node_(1) setdest 542.640833 301.496124 19.999775" -$ns_ at 74.000000 "$node_(2) setdest 547.211487 282.875900 19.991211" -$ns_ at 74.000000 "$node_(3) setdest 506.228546 440.731667 14.842176" -$ns_ at 74.000000 "$node_(4) setdest 483.949062 184.414401 19.992345" -$ns_ at 74.000000 "$node_(5) setdest 490.772371 239.358717 19.996239" -$ns_ at 74.000000 "$node_(6) setdest 428.971719 399.458697 19.359101" -$ns_ at 74.000000 "$node_(7) setdest 510.977845 393.521870 10.092687" -$ns_ at 74.000000 "$node_(8) setdest 501.649850 360.807649 18.220692" -$ns_ at 74.000000 "$node_(9) setdest 574.169947 374.218269 17.711845" -$ns_ at 74.000000 "$node_(10) setdest 569.666315 494.308359 10.477138" - -$ns_ at 75.000000 "$node_(1) setdest 545.286982 281.676690 19.995301" -$ns_ at 75.000000 "$node_(2) setdest 541.579801 263.698851 19.986873" -$ns_ at 75.000000 "$node_(3) setdest 509.521933 424.622555 16.442319" -$ns_ at 75.000000 "$node_(4) setdest 489.316472 165.158057 19.990394" -$ns_ at 75.000000 "$node_(5) setdest 499.170013 221.211394 19.996143" -$ns_ at 75.000000 "$node_(6) setdest 433.995690 380.248856 19.855938" -$ns_ at 75.000000 "$node_(7) setdest 509.830491 405.143663 11.678292" -$ns_ at 75.000000 "$node_(8) setdest 514.956828 375.067165 19.504088" -$ns_ at 75.000000 "$node_(9) setdest 563.225009 358.537277 19.122897" -$ns_ at 75.000000 "$node_(10) setdest 564.059199 483.616863 12.072607" - -$ns_ at 76.000000 "$node_(1) setdest 550.377288 262.356101 19.979900" -$ns_ at 76.000000 "$node_(2) setdest 533.540653 245.403103 19.984051" -$ns_ at 76.000000 "$node_(3) setdest 513.154562 406.949557 18.042473" -$ns_ at 76.000000 "$node_(4) setdest 496.890661 146.658823 19.989748" -$ns_ at 76.000000 "$node_(5) setdest 507.041942 202.829163 19.996842" -$ns_ at 76.000000 "$node_(6) setdest 441.406995 362.103882 19.600192" -$ns_ at 76.000000 "$node_(7) setdest 506.263148 417.944045 13.288180" -$ns_ at 76.000000 "$node_(8) setdest 523.622151 393.089514 19.997322" -$ns_ at 76.000000 "$node_(9) setdest 562.694870 356.369564 2.231598" -$ns_ at 76.000000 "$node_(10) setdest 556.855146 471.989381 13.678331" - -$ns_ at 77.000000 "$node_(1) setdest 559.088417 244.398391 19.959036" -$ns_ at 77.000000 "$node_(2) setdest 521.840951 229.244414 19.949593" -$ns_ at 77.000000 "$node_(3) setdest 516.301733 387.623702 19.580433" -$ns_ at 77.000000 "$node_(4) setdest 505.320440 128.522356 19.999815" -$ns_ at 77.000000 "$node_(5) setdest 515.254078 184.596382 19.996837" -$ns_ at 77.000000 "$node_(6) setdest 437.257639 351.072545 11.785905" -$ns_ at 77.000000 "$node_(7) setdest 500.846086 431.809163 14.885767" -$ns_ at 77.000000 "$node_(8) setdest 529.413794 412.094108 19.867504" -$ns_ at 77.000000 "$node_(9) setdest 565.572234 358.356299 3.496619" -$ns_ at 77.000000 "$node_(10) setdest 548.808724 459.002515 15.277551" - -$ns_ at 78.000000 "$node_(1) setdest 568.615890 226.866730 19.953243" -$ns_ at 78.000000 "$node_(2) setdest 506.765408 216.107743 19.996103" -$ns_ at 78.000000 "$node_(3) setdest 518.586099 367.756661 19.997941" -$ns_ at 78.000000 "$node_(4) setdest 511.394728 109.548785 19.922183" -$ns_ at 78.000000 "$node_(5) setdest 521.978222 165.767794 19.993245" -$ns_ at 78.000000 "$node_(6) setdest 429.959797 352.164602 7.379098" -$ns_ at 78.000000 "$node_(7) setdest 494.140339 446.876872 16.492510" -$ns_ at 78.000000 "$node_(8) setdest 525.963760 430.106023 18.339351" -$ns_ at 78.000000 "$node_(9) setdest 569.000240 362.124933 5.094490" -$ns_ at 78.000000 "$node_(10) setdest 540.470647 444.327845 16.878077" - -$ns_ at 79.000000 "$node_(1) setdest 574.185687 207.679959 19.978859" -$ns_ at 79.000000 "$node_(2) setdest 491.733402 202.925804 19.993117" -$ns_ at 79.000000 "$node_(3) setdest 519.783067 347.795031 19.997485" -$ns_ at 79.000000 "$node_(4) setdest 508.990521 89.908093 19.787293" -$ns_ at 79.000000 "$node_(5) setdest 526.722730 146.349523 19.989487" -$ns_ at 79.000000 "$node_(6) setdest 421.402925 354.646309 8.909485" -$ns_ at 79.000000 "$node_(7) setdest 484.722595 462.296802 18.068430" -$ns_ at 79.000000 "$node_(8) setdest 513.980626 443.368125 17.873971" -$ns_ at 79.000000 "$node_(9) setdest 572.479374 367.825573 6.678447" -$ns_ at 79.000000 "$node_(10) setdest 529.744275 429.315243 18.450834" - -$ns_ at 80.000000 "$node_(1) setdest 576.539904 187.859407 19.959875" -$ns_ at 80.000000 "$node_(2) setdest 480.207033 186.703672 19.900119" -$ns_ at 80.000000 "$node_(3) setdest 519.812887 327.797852 19.997201" -$ns_ at 80.000000 "$node_(4) setdest 497.292409 73.848971 19.868096" -$ns_ at 80.000000 "$node_(5) setdest 528.886672 126.481962 19.985060" -$ns_ at 80.000000 "$node_(6) setdest 415.020974 363.015006 10.524466" -$ns_ at 80.000000 "$node_(7) setdest 471.817545 477.042190 19.595070" -$ns_ at 80.000000 "$node_(8) setdest 503.184441 458.887502 18.905255" -$ns_ at 80.000000 "$node_(9) setdest 575.661628 375.491501 8.300193" -$ns_ at 80.000000 "$node_(10) setdest 514.499292 416.740217 19.762106" - -$ns_ at 81.000000 "$node_(1) setdest 574.626392 167.968199 19.983034" -$ns_ at 81.000000 "$node_(2) setdest 475.821624 167.311287 19.882063" -$ns_ at 81.000000 "$node_(3) setdest 518.646194 307.835016 19.996899" -$ns_ at 81.000000 "$node_(4) setdest 483.578324 59.304461 19.990471" -$ns_ at 81.000000 "$node_(5) setdest 527.651007 106.553198 19.967035" -$ns_ at 81.000000 "$node_(6) setdest 410.440591 374.312692 12.190882" -$ns_ at 81.000000 "$node_(7) setdest 456.292988 489.616829 19.978324" -$ns_ at 81.000000 "$node_(8) setdest 498.005915 477.169448 19.001228" -$ns_ at 81.000000 "$node_(9) setdest 579.725346 384.508368 9.890283" -$ns_ at 81.000000 "$node_(10) setdest 495.634540 410.515884 19.865074" - -$ns_ at 82.000000 "$node_(1) setdest 573.744222 148.036265 19.951446" -$ns_ at 82.000000 "$node_(2) setdest 474.558082 147.369780 19.981497" -$ns_ at 82.000000 "$node_(3) setdest 516.187480 287.990063 19.996686" -$ns_ at 82.000000 "$node_(4) setdest 474.515345 41.610136 19.880309" -$ns_ at 82.000000 "$node_(5) setdest 522.091375 87.379602 19.963374" -$ns_ at 82.000000 "$node_(6) setdest 414.780703 386.764139 13.186170" -$ns_ at 82.000000 "$node_(7) setdest 438.763875 499.134151 19.946158" -$ns_ at 82.000000 "$node_(8) setdest 500.792450 494.938482 17.986199" -$ns_ at 82.000000 "$node_(9) setdest 588.726105 391.049918 11.126794" -$ns_ at 82.000000 "$node_(10) setdest 475.806091 412.296842 19.908270" - -$ns_ at 83.000000 "$node_(1) setdest 577.404142 128.397041 19.977341" -$ns_ at 83.000000 "$node_(2) setdest 471.772322 127.583434 19.981491" -$ns_ at 83.000000 "$node_(3) setdest 512.431069 268.349770 19.996293" -$ns_ at 83.000000 "$node_(4) setdest 467.791067 22.805362 19.970865" -$ns_ at 83.000000 "$node_(5) setdest 513.352198 69.412545 19.979699" -$ns_ at 83.000000 "$node_(6) setdest 426.772346 396.441652 15.409535" -$ns_ at 83.000000 "$node_(7) setdest 419.593750 498.212291 19.192278" -$ns_ at 83.000000 "$node_(8) setdest 513.064464 506.922013 17.152474" -$ns_ at 83.000000 "$node_(9) setdest 594.729903 387.107313 7.182599" -$ns_ at 83.000000 "$node_(10) setdest 456.101092 415.641689 19.986870" - -$ns_ at 84.000000 "$node_(1) setdest 583.213841 109.262849 19.996747" -$ns_ at 84.000000 "$node_(2) setdest 476.419501 108.372979 19.764560" -$ns_ at 84.000000 "$node_(3) setdest 507.266385 249.033080 19.995211" -$ns_ at 84.000000 "$node_(4) setdest 462.492387 11.625346 12.372096" -$ns_ at 84.000000 "$node_(5) setdest 502.089366 52.902858 19.985523" -$ns_ at 84.000000 "$node_(6) setdest 437.511332 409.573265 16.963640" -$ns_ at 84.000000 "$node_(7) setdest 412.014189 481.555847 18.299914" -$ns_ at 84.000000 "$node_(8) setdest 526.654692 519.163066 18.290371" -$ns_ at 84.000000 "$node_(9) setdest 592.714197 381.218901 6.223863" -$ns_ at 84.000000 "$node_(10) setdest 436.259652 418.153011 19.999737" - -$ns_ at 85.000000 "$node_(1) setdest 587.867212 89.874667 19.938793" -$ns_ at 85.000000 "$node_(2) setdest 489.338727 93.291200 19.858662" -$ns_ at 85.000000 "$node_(3) setdest 500.466087 230.231287 19.993786" -$ns_ at 85.000000 "$node_(4) setdest 463.199929 17.989912 6.403773" -$ns_ at 85.000000 "$node_(5) setdest 487.155522 39.734993 19.910107" -$ns_ at 85.000000 "$node_(6) setdest 443.956620 426.937800 18.522117" -$ns_ at 85.000000 "$node_(7) setdest 404.982373 466.107830 16.973145" -$ns_ at 85.000000 "$node_(8) setdest 537.501281 535.276226 19.423759" -$ns_ at 85.000000 "$node_(9) setdest 588.601285 374.648766 7.751304" -$ns_ at 85.000000 "$node_(10) setdest 417.844644 423.934655 19.301293" - -$ns_ at 86.000000 "$node_(1) setdest 583.707241 70.590453 19.727804" -$ns_ at 86.000000 "$node_(2) setdest 507.837671 86.031211 19.872553" -$ns_ at 86.000000 "$node_(3) setdest 492.487335 211.892008 19.999741" -$ns_ at 86.000000 "$node_(4) setdest 460.684485 25.836346 8.239780" -$ns_ at 86.000000 "$node_(5) setdest 468.395888 33.126211 19.889693" -$ns_ at 86.000000 "$node_(6) setdest 439.617458 445.683926 19.241766" -$ns_ at 86.000000 "$node_(7) setdest 405.686381 458.064025 8.074554" -$ns_ at 86.000000 "$node_(8) setdest 552.956635 544.737738 18.121484" -$ns_ at 86.000000 "$node_(9) setdest 579.604555 372.897661 9.165562" -$ns_ at 86.000000 "$node_(10) setdest 417.084191 434.018891 10.112869" - -$ns_ at 87.000000 "$node_(1) setdest 568.163720 58.723273 19.555844" -$ns_ at 87.000000 "$node_(2) setdest 527.597802 85.380885 19.770830" -$ns_ at 87.000000 "$node_(3) setdest 484.486710 193.561998 19.999982" -$ns_ at 87.000000 "$node_(4) setdest 458.575323 35.422524 9.815466" -$ns_ at 87.000000 "$node_(5) setdest 448.529777 33.971581 19.884089" -$ns_ at 87.000000 "$node_(6) setdest 425.906823 457.123064 17.855963" -$ns_ at 87.000000 "$node_(7) setdest 408.452236 458.872840 2.881690" -$ns_ at 87.000000 "$node_(8) setdest 568.879506 540.146677 16.571531" -$ns_ at 87.000000 "$node_(9) setdest 569.851338 377.857203 10.941769" -$ns_ at 87.000000 "$node_(10) setdest 421.850394 441.875446 9.189240" - -$ns_ at 88.000000 "$node_(1) setdest 548.683399 54.449519 19.943618" -$ns_ at 88.000000 "$node_(2) setdest 546.933768 82.546059 19.542668" -$ns_ at 88.000000 "$node_(3) setdest 476.681038 175.148773 19.999384" -$ns_ at 88.000000 "$node_(4) setdest 461.366028 46.344763 11.273125" -$ns_ at 88.000000 "$node_(5) setdest 430.847089 43.014463 19.860795" -$ns_ at 88.000000 "$node_(6) setdest 410.587500 453.395095 15.766401" -$ns_ at 88.000000 "$node_(7) setdest 412.362473 461.216708 4.558911" -$ns_ at 88.000000 "$node_(8) setdest 582.276440 530.346179 16.599024" -$ns_ at 88.000000 "$node_(9) setdest 560.884729 386.754776 12.631979" -$ns_ at 88.000000 "$node_(10) setdest 424.841637 452.326111 10.870324" - -$ns_ at 89.000000 "$node_(1) setdest 529.270019 51.276340 19.671004" -$ns_ at 89.000000 "$node_(2) setdest 565.972708 77.913315 19.594477" -$ns_ at 89.000000 "$node_(3) setdest 469.023624 156.673222 19.999549" -$ns_ at 89.000000 "$node_(4) setdest 471.973165 53.282586 12.674571" -$ns_ at 89.000000 "$node_(5) setdest 419.286989 58.968693 19.702116" -$ns_ at 89.000000 "$node_(6) setdest 404.803098 439.911564 14.671910" -$ns_ at 89.000000 "$node_(7) setdest 416.934945 465.341967 6.158349" -$ns_ at 89.000000 "$node_(8) setdest 595.673075 523.961962 14.840082" -$ns_ at 89.000000 "$node_(9) setdest 554.608120 399.466950 14.177277" -$ns_ at 89.000000 "$node_(10) setdest 428.943927 464.092911 12.461395" - -$ns_ at 90.000000 "$node_(1) setdest 510.446672 45.560687 19.671987" -$ns_ at 90.000000 "$node_(2) setdest 581.900465 67.427062 19.069739" -$ns_ at 90.000000 "$node_(3) setdest 460.852421 138.421298 19.997532" -$ns_ at 90.000000 "$node_(4) setdest 486.548028 54.559831 14.630720" -$ns_ at 90.000000 "$node_(5) setdest 417.520328 78.793399 19.903267" -$ns_ at 90.000000 "$node_(6) setdest 412.989536 428.553731 14.000647" -$ns_ at 90.000000 "$node_(7) setdest 421.706379 471.443160 7.745395" -$ns_ at 90.000000 "$node_(8) setdest 596.698144 525.418757 1.781297" -$ns_ at 90.000000 "$node_(9) setdest 552.296746 415.092034 15.795117" -$ns_ at 90.000000 "$node_(10) setdest 437.002050 475.535203 13.994977" - -$ns_ at 91.000000 "$node_(1) setdest 491.216630 41.851459 19.584506" -$ns_ at 91.000000 "$node_(2) setdest 597.391272 59.977823 17.188841" -$ns_ at 91.000000 "$node_(3) setdest 451.041441 121.016462 19.979581" -$ns_ at 91.000000 "$node_(4) setdest 502.763761 55.445814 16.239919" -$ns_ at 91.000000 "$node_(5) setdest 420.064577 98.608541 19.977814" -$ns_ at 91.000000 "$node_(6) setdest 427.036725 421.558974 15.692359" -$ns_ at 91.000000 "$node_(7) setdest 425.224219 480.087841 9.333043" -$ns_ at 91.000000 "$node_(8) setdest 595.078325 527.548271 2.675565" -$ns_ at 91.000000 "$node_(9) setdest 555.215513 432.214111 17.369074" -$ns_ at 91.000000 "$node_(10) setdest 450.540971 483.206577 15.561245" - -$ns_ at 92.000000 "$node_(1) setdest 471.659908 39.220660 19.732878" -$ns_ at 92.000000 "$node_(2) setdest 599.260739 62.844430 3.422330" -$ns_ at 92.000000 "$node_(3) setdest 437.200521 106.710742 19.905394" -$ns_ at 92.000000 "$node_(4) setdest 520.463512 57.440346 17.811775" -$ns_ at 92.000000 "$node_(5) setdest 425.407301 117.784600 19.906430" -$ns_ at 92.000000 "$node_(6) setdest 441.106703 411.581456 17.248628" -$ns_ at 92.000000 "$node_(7) setdest 426.330437 490.960272 10.928563" -$ns_ at 92.000000 "$node_(8) setdest 592.410482 530.533599 4.003694" -$ns_ at 92.000000 "$node_(9) setdest 564.412524 448.873432 19.029397" -$ns_ at 92.000000 "$node_(10) setdest 467.267881 487.413523 17.247838" - -$ns_ at 93.000000 "$node_(1) setdest 453.466313 33.175001 19.171774" -$ns_ at 93.000000 "$node_(2) setdest 598.291343 67.449039 4.705545" -$ns_ at 93.000000 "$node_(3) setdest 420.425409 96.070528 19.865007" -$ns_ at 93.000000 "$node_(4) setdest 539.462165 61.491498 19.425773" -$ns_ at 93.000000 "$node_(5) setdest 434.020030 135.209813 19.437519" -$ns_ at 93.000000 "$node_(6) setdest 455.272226 399.073428 18.897428" -$ns_ at 93.000000 "$node_(7) setdest 427.424847 503.463387 12.550921" -$ns_ at 93.000000 "$node_(8) setdest 593.809342 529.223559 1.916510" -$ns_ at 93.000000 "$node_(9) setdest 576.244847 464.961799 19.970965" -$ns_ at 93.000000 "$node_(10) setdest 485.902916 490.396138 18.872215" - -$ns_ at 94.000000 "$node_(1) setdest 440.069927 20.181823 18.662418" -$ns_ at 94.000000 "$node_(2) setdest 596.289520 73.428855 6.305989" -$ns_ at 94.000000 "$node_(3) setdest 418.138459 85.885901 10.438235" -$ns_ at 94.000000 "$node_(4) setdest 559.121472 65.074947 19.983229" -$ns_ at 94.000000 "$node_(5) setdest 433.752323 153.363814 18.155975" -$ns_ at 94.000000 "$node_(6) setdest 468.907539 384.565199 19.910059" -$ns_ at 94.000000 "$node_(7) setdest 423.892158 517.002474 13.992382" -$ns_ at 94.000000 "$node_(8) setdest 594.496732 525.690274 3.599529" -$ns_ at 94.000000 "$node_(9) setdest 587.176402 481.519615 19.840871" -$ns_ at 94.000000 "$node_(10) setdest 505.557558 493.894481 19.963551" - -$ns_ at 95.000000 "$node_(1) setdest 427.052116 6.847278 18.635275" -$ns_ at 95.000000 "$node_(2) setdest 594.485579 81.120759 7.900607" -$ns_ at 95.000000 "$node_(3) setdest 420.911514 86.122459 2.783127" -$ns_ at 95.000000 "$node_(4) setdest 579.042638 65.882017 19.937508" -$ns_ at 95.000000 "$node_(5) setdest 419.915636 161.815294 16.213618" -$ns_ at 95.000000 "$node_(6) setdest 479.384927 367.530238 19.999139" -$ns_ at 95.000000 "$node_(7) setdest 413.636242 520.451794 10.820426" -$ns_ at 95.000000 "$node_(8) setdest 595.480416 520.598937 5.185494" -$ns_ at 95.000000 "$node_(9) setdest 588.142218 501.154215 19.658340" -$ns_ at 95.000000 "$node_(10) setdest 525.501306 495.121901 19.981483" - -$ns_ at 96.000000 "$node_(1) setdest 410.783725 0.750524 17.373284" -$ns_ at 96.000000 "$node_(2) setdest 593.127576 90.529264 9.506006" -$ns_ at 96.000000 "$node_(3) setdest 424.469755 88.906562 4.517998" -$ns_ at 96.000000 "$node_(4) setdest 589.252016 52.033514 17.205011" -$ns_ at 96.000000 "$node_(5) setdest 406.673798 155.191050 14.806312" -$ns_ at 96.000000 "$node_(6) setdest 483.266169 352.608643 15.418108" -$ns_ at 96.000000 "$node_(7) setdest 410.018337 513.556034 7.787216" -$ns_ at 96.000000 "$node_(8) setdest 595.625065 513.990687 6.609832" -$ns_ at 96.000000 "$node_(9) setdest 576.073216 515.525770 18.767056" -$ns_ at 96.000000 "$node_(10) setdest 544.912679 490.672198 19.914850" - -$ns_ at 97.000000 "$node_(1) setdest 419.156506 3.762852 8.898179" -$ns_ at 97.000000 "$node_(2) setdest 591.679304 101.541365 11.106928" -$ns_ at 97.000000 "$node_(3) setdest 429.445594 92.463295 6.116317" -$ns_ at 97.000000 "$node_(4) setdest 580.554829 37.419012 17.006609" -$ns_ at 97.000000 "$node_(5) setdest 406.950962 153.565137 1.649367" -$ns_ at 97.000000 "$node_(6) setdest 479.856644 351.887222 3.485012" -$ns_ at 97.000000 "$node_(7) setdest 408.684567 504.276932 9.374469" -$ns_ at 97.000000 "$node_(8) setdest 590.406909 507.617288 8.237073" -$ns_ at 97.000000 "$node_(9) setdest 559.752265 523.162622 18.019294" -$ns_ at 97.000000 "$node_(10) setdest 561.124452 479.086372 19.926187" - -$ns_ at 98.000000 "$node_(1) setdest 429.488659 2.608879 10.396395" -$ns_ at 98.000000 "$node_(2) setdest 589.054917 113.968791 12.701509" -$ns_ at 98.000000 "$node_(3) setdest 436.124983 96.326552 7.716151" -$ns_ at 98.000000 "$node_(4) setdest 574.740693 23.094755 15.459253" -$ns_ at 98.000000 "$node_(5) setdest 409.384783 153.230897 2.456664" -$ns_ at 98.000000 "$node_(6) setdest 474.746734 352.016833 5.111553" -$ns_ at 98.000000 "$node_(7) setdest 413.021931 494.129886 11.035183" -$ns_ at 98.000000 "$node_(8) setdest 580.882175 505.117671 9.847266" -$ns_ at 98.000000 "$node_(9) setdest 542.784470 531.635980 18.965860" -$ns_ at 98.000000 "$node_(10) setdest 575.265149 465.030323 19.938201" - -$ns_ at 99.000000 "$node_(1) setdest 441.489099 2.335719 12.003549" -$ns_ at 99.000000 "$node_(2) setdest 586.056851 127.939810 14.289078" -$ns_ at 99.000000 "$node_(3) setdest 444.433154 100.546506 9.318461" -$ns_ at 99.000000 "$node_(4) setdest 563.604426 11.802092 15.860034" -$ns_ at 99.000000 "$node_(5) setdest 413.431025 153.540340 4.058058" -$ns_ at 99.000000 "$node_(6) setdest 468.323715 353.930297 6.701979" -$ns_ at 99.000000 "$node_(7) setdest 422.987216 486.505659 12.547341" -$ns_ at 99.000000 "$node_(8) setdest 569.510780 507.343850 11.587256" -$ns_ at 99.000000 "$node_(9) setdest 530.489038 544.913627 18.096231" -$ns_ at 99.000000 "$node_(10) setdest 581.656414 446.357042 19.736760" - -$ns_ at 100.000000 "$node_(1) setdest 454.447553 5.677176 13.382334" -$ns_ at 100.000000 "$node_(2) setdest 586.790587 143.764948 15.842139" -$ns_ at 100.000000 "$node_(3) setdest 454.264488 105.292106 10.916769" -$ns_ at 100.000000 "$node_(4) setdest 547.205392 5.747685 17.480967" -$ns_ at 100.000000 "$node_(5) setdest 419.055426 154.172769 5.659845" -$ns_ at 100.000000 "$node_(6) setdest 468.513902 353.682612 0.312280" -$ns_ at 100.000000 "$node_(7) setdest 425.531876 476.300999 10.517147" -$ns_ at 100.000000 "$node_(8) setdest 568.125928 506.009333 1.923214" -$ns_ at 100.000000 "$node_(9) setdest 534.125064 533.948308 11.552442" -$ns_ at 100.000000 "$node_(10) setdest 574.270722 427.825799 19.948820" - -$ns_ at 101.000000 "$node_(1) setdest 463.974595 17.337902 15.057791" -$ns_ at 101.000000 "$node_(2) setdest 588.818288 160.985039 17.339062" -$ns_ at 101.000000 "$node_(3) setdest 465.953584 109.763324 12.515061" -$ns_ at 101.000000 "$node_(4) setdest 528.686907 4.225543 18.580936" -$ns_ at 101.000000 "$node_(5) setdest 426.301451 153.959775 7.249155" -$ns_ at 101.000000 "$node_(6) setdest 468.409172 351.964764 1.721038" -$ns_ at 101.000000 "$node_(7) setdest 425.627464 463.860769 12.440598" -$ns_ at 101.000000 "$node_(8) setdest 568.230938 502.795685 3.215363" -$ns_ at 101.000000 "$node_(9) setdest 534.843844 520.422103 13.545289" -$ns_ at 101.000000 "$node_(10) setdest 565.376509 409.915463 19.997179" - -$ns_ at 102.000000 "$node_(1) setdest 469.266398 33.192266 16.714186" -$ns_ at 102.000000 "$node_(2) setdest 583.250087 179.129202 18.979345" -$ns_ at 102.000000 "$node_(3) setdest 479.708421 112.845067 14.095839" -$ns_ at 102.000000 "$node_(4) setdest 513.846746 13.845484 17.685407" -$ns_ at 102.000000 "$node_(5) setdest 434.772540 151.433158 8.839861" -$ns_ at 102.000000 "$node_(6) setdest 467.957451 348.674042 3.321581" -$ns_ at 102.000000 "$node_(7) setdest 425.462374 449.821538 14.040202" -$ns_ at 102.000000 "$node_(8) setdest 568.504849 497.988118 4.815363" -$ns_ at 102.000000 "$node_(9) setdest 536.479818 505.366286 15.144440" -$ns_ at 102.000000 "$node_(10) setdest 555.303153 392.642708 19.995513" - -$ns_ at 103.000000 "$node_(1) setdest 465.730169 51.026601 18.181541" -$ns_ at 103.000000 "$node_(2) setdest 566.879047 186.735999 18.051989" -$ns_ at 103.000000 "$node_(3) setdest 495.386590 112.701027 15.678831" -$ns_ at 103.000000 "$node_(4) setdest 498.374210 23.147625 18.053509" -$ns_ at 103.000000 "$node_(5) setdest 443.971210 146.477076 10.448841" -$ns_ at 103.000000 "$node_(6) setdest 467.040158 343.838883 4.921401" -$ns_ at 103.000000 "$node_(7) setdest 424.846982 434.193648 15.640001" -$ns_ at 103.000000 "$node_(8) setdest 568.959563 491.588797 6.415456" -$ns_ at 103.000000 "$node_(9) setdest 539.291404 488.859842 16.744184" -$ns_ at 103.000000 "$node_(10) setdest 543.978114 376.161913 19.996828" - -$ns_ at 104.000000 "$node_(1) setdest 453.885584 66.862210 19.775255" -$ns_ at 104.000000 "$node_(2) setdest 550.420005 182.065219 17.108953" -$ns_ at 104.000000 "$node_(3) setdest 512.035228 108.074256 17.279588" -$ns_ at 104.000000 "$node_(4) setdest 480.422154 28.888008 18.847502" -$ns_ at 104.000000 "$node_(5) setdest 453.481156 139.084396 12.045363" -$ns_ at 104.000000 "$node_(6) setdest 465.522276 337.496223 6.521756" -$ns_ at 104.000000 "$node_(7) setdest 423.890552 416.980065 17.240133" -$ns_ at 104.000000 "$node_(8) setdest 569.408345 483.586152 8.015219" -$ns_ at 104.000000 "$node_(9) setdest 542.421361 470.785101 18.343743" -$ns_ at 104.000000 "$node_(10) setdest 532.315171 359.914903 19.999739" - -$ns_ at 105.000000 "$node_(1) setdest 441.554672 82.598803 19.992292" -$ns_ at 105.000000 "$node_(2) setdest 539.013776 170.214626 16.448058" -$ns_ at 105.000000 "$node_(3) setdest 529.234106 100.206225 18.913152" -$ns_ at 105.000000 "$node_(4) setdest 461.595790 33.254097 19.326011" -$ns_ at 105.000000 "$node_(5) setdest 463.150011 129.433979 13.660795" -$ns_ at 105.000000 "$node_(6) setdest 464.066377 329.507246 8.120554" -$ns_ at 105.000000 "$node_(7) setdest 423.478241 398.145310 18.839268" -$ns_ at 105.000000 "$node_(8) setdest 569.653858 473.974181 9.615106" -$ns_ at 105.000000 "$node_(9) setdest 544.689190 451.144354 19.771242" -$ns_ at 105.000000 "$node_(10) setdest 521.557519 343.060211 19.995192" - -$ns_ at 106.000000 "$node_(1) setdest 426.035377 95.120154 19.940731" -$ns_ at 106.000000 "$node_(2) setdest 527.796998 156.046188 18.070991" -$ns_ at 106.000000 "$node_(3) setdest 546.577423 90.292431 19.976836" -$ns_ at 106.000000 "$node_(4) setdest 442.458573 31.949902 19.181606" -$ns_ at 106.000000 "$node_(5) setdest 473.667535 118.375737 15.261160" -$ns_ at 106.000000 "$node_(6) setdest 463.038352 319.841988 9.719776" -$ns_ at 106.000000 "$node_(7) setdest 424.022196 378.194573 19.958150" -$ns_ at 106.000000 "$node_(8) setdest 569.813158 462.759869 11.215443" -$ns_ at 106.000000 "$node_(9) setdest 547.190950 431.303404 19.998052" -$ns_ at 106.000000 "$node_(10) setdest 512.059389 325.464003 19.996025" - -$ns_ at 107.000000 "$node_(1) setdest 413.339629 110.424764 19.884997" -$ns_ at 107.000000 "$node_(2) setdest 522.889895 138.019659 18.682489" -$ns_ at 107.000000 "$node_(3) setdest 562.785458 78.657080 19.951987" -$ns_ at 107.000000 "$node_(4) setdest 424.326276 36.316554 18.650680" -$ns_ at 107.000000 "$node_(5) setdest 485.278736 106.151196 16.859994" -$ns_ at 107.000000 "$node_(6) setdest 462.686740 308.528017 11.319434" -$ns_ at 107.000000 "$node_(7) setdest 425.056084 358.221365 19.999950" -$ns_ at 107.000000 "$node_(8) setdest 570.011307 449.945947 12.815454" -$ns_ at 107.000000 "$node_(9) setdest 550.802202 411.635114 19.997070" -$ns_ at 107.000000 "$node_(10) setdest 504.100758 307.123887 19.992490" - -$ns_ at 108.000000 "$node_(1) setdest 403.484524 120.881194 14.368718" -$ns_ at 108.000000 "$node_(2) setdest 522.671723 118.777356 19.243540" -$ns_ at 108.000000 "$node_(3) setdest 566.030236 61.969468 17.000146" -$ns_ at 108.000000 "$node_(4) setdest 406.729266 43.449566 18.987750" -$ns_ at 108.000000 "$node_(5) setdest 498.299352 93.063657 18.461314" -$ns_ at 108.000000 "$node_(6) setdest 463.350139 295.626592 12.918469" -$ns_ at 108.000000 "$node_(7) setdest 425.713473 338.232633 19.999539" -$ns_ at 108.000000 "$node_(8) setdest 570.151839 435.531284 14.415348" -$ns_ at 108.000000 "$node_(9) setdest 553.849836 391.873169 19.995562" -$ns_ at 108.000000 "$node_(10) setdest 497.862638 288.126445 19.995423" - -$ns_ at 109.000000 "$node_(1) setdest 403.989736 119.896423 1.106803" -$ns_ at 109.000000 "$node_(2) setdest 528.443915 101.055487 18.638209" -$ns_ at 109.000000 "$node_(3) setdest 555.086711 59.581719 11.200986" -$ns_ at 109.000000 "$node_(4) setdest 419.658364 34.543594 15.699616" -$ns_ at 109.000000 "$node_(5) setdest 512.018250 78.744240 19.830629" -$ns_ at 109.000000 "$node_(6) setdest 465.226532 281.230082 14.518276" -$ns_ at 109.000000 "$node_(7) setdest 425.892742 318.233998 19.999438" -$ns_ at 109.000000 "$node_(8) setdest 569.845697 419.519895 16.014315" -$ns_ at 109.000000 "$node_(9) setdest 555.287187 371.932228 19.992677" -$ns_ at 109.000000 "$node_(10) setdest 493.133245 268.700773 19.993096" - -$ns_ at 110.000000 "$node_(1) setdest 405.689023 117.799747 2.698820" -$ns_ at 110.000000 "$node_(2) setdest 542.452784 89.981334 17.857360" -$ns_ at 110.000000 "$node_(3) setdest 541.878384 60.468639 13.238071" -$ns_ at 110.000000 "$node_(4) setdest 431.508634 26.710829 14.204967" -$ns_ at 110.000000 "$node_(5) setdest 525.437273 63.918876 19.996540" -$ns_ at 110.000000 "$node_(6) setdest 468.870766 265.532533 16.115008" -$ns_ at 110.000000 "$node_(7) setdest 425.465752 298.239034 19.999523" -$ns_ at 110.000000 "$node_(8) setdest 568.423672 401.966936 17.610467" -$ns_ at 110.000000 "$node_(9) setdest 554.604727 351.953670 19.990211" -$ns_ at 110.000000 "$node_(10) setdest 490.462288 248.888314 19.991687" - -$ns_ at 111.000000 "$node_(1) setdest 409.267839 115.417933 4.298949" -$ns_ at 111.000000 "$node_(2) setdest 559.897956 86.045463 17.883655" -$ns_ at 111.000000 "$node_(3) setdest 527.059137 59.782209 14.835137" -$ns_ at 111.000000 "$node_(4) setdest 443.573833 19.915640 13.847152" -$ns_ at 111.000000 "$node_(5) setdest 538.192908 48.515225 19.999468" -$ns_ at 111.000000 "$node_(6) setdest 473.714036 248.485385 17.721809" -$ns_ at 111.000000 "$node_(7) setdest 424.698720 278.254092 19.999656" -$ns_ at 111.000000 "$node_(8) setdest 566.060462 382.899839 19.212989" -$ns_ at 111.000000 "$node_(9) setdest 551.708859 332.174554 19.989984" -$ns_ at 111.000000 "$node_(10) setdest 489.396329 228.922479 19.994270" - -$ns_ at 112.000000 "$node_(1) setdest 414.950785 113.903111 5.881374" -$ns_ at 112.000000 "$node_(2) setdest 578.124561 87.480642 18.283021" -$ns_ at 112.000000 "$node_(3) setdest 510.636699 60.626058 16.444104" -$ns_ at 112.000000 "$node_(4) setdest 457.652786 13.663710 15.404660" -$ns_ at 112.000000 "$node_(5) setdest 551.827674 34.309326 19.690465" -$ns_ at 112.000000 "$node_(6) setdest 478.228138 229.700152 19.319992" -$ns_ at 112.000000 "$node_(7) setdest 422.398639 258.396580 19.990277" -$ns_ at 112.000000 "$node_(8) setdest 565.174425 362.924990 19.994490" -$ns_ at 112.000000 "$node_(9) setdest 546.871512 312.774624 19.993929" -$ns_ at 112.000000 "$node_(10) setdest 491.447099 209.200491 19.828325" - -$ns_ at 113.000000 "$node_(1) setdest 422.446166 114.130760 7.498837" -$ns_ at 113.000000 "$node_(2) setdest 591.915195 78.408014 16.507397" -$ns_ at 113.000000 "$node_(3) setdest 492.624699 59.666840 18.037523" -$ns_ at 113.000000 "$node_(4) setdest 472.214347 5.489961 16.698779" -$ns_ at 113.000000 "$node_(5) setdest 551.486872 35.177611 0.932773" -$ns_ at 113.000000 "$node_(6) setdest 482.217820 210.104151 19.998020" -$ns_ at 113.000000 "$node_(7) setdest 417.831564 238.927314 19.997762" -$ns_ at 113.000000 "$node_(8) setdest 564.744712 342.930184 19.999424" -$ns_ at 113.000000 "$node_(9) setdest 540.209785 293.926814 19.990462" -$ns_ at 113.000000 "$node_(10) setdest 504.489346 196.354667 18.306158" - -$ns_ at 114.000000 "$node_(1) setdest 431.271998 116.305610 9.089845" -$ns_ at 114.000000 "$node_(2) setdest 588.736507 63.560605 15.183860" -$ns_ at 114.000000 "$node_(3) setdest 473.963039 54.031040 19.494096" -$ns_ at 114.000000 "$node_(4) setdest 473.434460 2.312632 3.403542" -$ns_ at 114.000000 "$node_(5) setdest 548.218838 37.090081 3.786501" -$ns_ at 114.000000 "$node_(6) setdest 484.657569 190.258834 19.994725" -$ns_ at 114.000000 "$node_(7) setdest 414.150519 219.279742 19.989426" -$ns_ at 114.000000 "$node_(8) setdest 563.955033 322.946138 19.999642" -$ns_ at 114.000000 "$node_(9) setdest 531.976806 275.701992 19.998151" -$ns_ at 114.000000 "$node_(10) setdest 520.244752 190.438199 16.829659" - -$ns_ at 115.000000 "$node_(1) setdest 440.908069 120.949190 10.696574" -$ns_ at 115.000000 "$node_(2) setdest 580.431419 50.836504 15.194645" -$ns_ at 115.000000 "$node_(3) setdest 456.876131 43.692246 19.971307" -$ns_ at 115.000000 "$node_(4) setdest 472.869595 2.467477 0.585704" -$ns_ at 115.000000 "$node_(5) setdest 543.700691 40.023340 5.386804" -$ns_ at 115.000000 "$node_(6) setdest 485.938648 170.301151 19.998756" -$ns_ at 115.000000 "$node_(7) setdest 414.076804 199.317789 19.962089" -$ns_ at 115.000000 "$node_(8) setdest 563.190475 302.961948 19.998810" -$ns_ at 115.000000 "$node_(9) setdest 522.369871 258.168219 19.993159" -$ns_ at 115.000000 "$node_(10) setdest 534.924858 194.630099 15.266877" - -$ns_ at 116.000000 "$node_(1) setdest 451.284786 127.573697 12.310985" -$ns_ at 116.000000 "$node_(2) setdest 569.402032 38.175636 16.791217" -$ns_ at 116.000000 "$node_(3) setdest 440.770647 31.838598 19.997390" -$ns_ at 116.000000 "$node_(4) setdest 472.841751 4.274661 1.807398" -$ns_ at 116.000000 "$node_(5) setdest 537.436100 43.104717 6.981403" -$ns_ at 116.000000 "$node_(6) setdest 486.954575 150.332081 19.994896" -$ns_ at 116.000000 "$node_(7) setdest 417.830901 179.685288 19.988205" -$ns_ at 116.000000 "$node_(8) setdest 563.641683 282.971460 19.995579" -$ns_ at 116.000000 "$node_(9) setdest 511.298664 241.517648 19.995328" -$ns_ at 116.000000 "$node_(10) setdest 550.011999 194.908027 15.089700" - -$ns_ at 117.000000 "$node_(1) setdest 462.138089 136.267655 13.906081" -$ns_ at 117.000000 "$node_(2) setdest 556.634968 24.940619 18.389225" -$ns_ at 117.000000 "$node_(3) setdest 425.324448 19.136132 19.998443" -$ns_ at 117.000000 "$node_(4) setdest 473.314494 7.680851 3.438840" -$ns_ at 117.000000 "$node_(5) setdest 529.438223 46.226951 8.585708" -$ns_ at 117.000000 "$node_(6) setdest 490.129007 130.598208 19.987566" -$ns_ at 117.000000 "$node_(7) setdest 423.966373 160.668563 19.981989" -$ns_ at 117.000000 "$node_(8) setdest 565.740884 263.087161 19.994799" -$ns_ at 117.000000 "$node_(9) setdest 499.055031 225.704650 19.998936" -$ns_ at 117.000000 "$node_(10) setdest 563.557238 186.500635 15.942326" - -$ns_ at 118.000000 "$node_(1) setdest 473.241458 147.092544 15.506870" -$ns_ at 118.000000 "$node_(2) setdest 539.814754 14.774438 19.653774" -$ns_ at 118.000000 "$node_(3) setdest 409.111886 8.883379 19.182442" -$ns_ at 118.000000 "$node_(4) setdest 473.692202 12.706450 5.039772" -$ns_ at 118.000000 "$node_(5) setdest 519.739209 49.337753 10.185674" -$ns_ at 118.000000 "$node_(6) setdest 496.431453 111.642085 19.976371" -$ns_ at 118.000000 "$node_(7) setdest 432.569997 142.630498 19.984847" -$ns_ at 118.000000 "$node_(8) setdest 568.702436 243.307677 19.999970" -$ns_ at 118.000000 "$node_(9) setdest 485.443278 211.070870 19.985678" -$ns_ at 118.000000 "$node_(10) setdest 570.192106 171.160831 16.713200" - -$ns_ at 119.000000 "$node_(1) setdest 487.251601 156.862702 17.080401" -$ns_ at 119.000000 "$node_(2) setdest 520.683497 9.021841 19.977421" -$ns_ at 119.000000 "$node_(3) setdest 417.073766 12.056418 8.570864" -$ns_ at 119.000000 "$node_(4) setdest 474.036968 19.336302 6.638810" -$ns_ at 119.000000 "$node_(5) setdest 508.315867 52.234824 11.784981" -$ns_ at 119.000000 "$node_(6) setdest 506.265369 94.271345 19.961175" -$ns_ at 119.000000 "$node_(7) setdest 443.201855 125.694874 19.996294" -$ns_ at 119.000000 "$node_(8) setdest 571.628211 223.523019 19.999821" -$ns_ at 119.000000 "$node_(9) setdest 470.395480 197.901690 19.996588" -$ns_ at 119.000000 "$node_(10) setdest 581.059668 156.562270 18.199503" - -$ns_ at 120.000000 "$node_(1) setdest 504.954771 159.215359 17.858813" -$ns_ at 120.000000 "$node_(2) setdest 501.192874 10.606251 19.554916" -$ns_ at 120.000000 "$node_(3) setdest 423.571462 19.617907 9.969763" -$ns_ at 120.000000 "$node_(4) setdest 474.472309 27.560057 8.235270" -$ns_ at 120.000000 "$node_(5) setdest 495.207683 54.945946 13.385614" -$ns_ at 120.000000 "$node_(6) setdest 520.516470 80.409235 19.880946" -$ns_ at 120.000000 "$node_(7) setdest 453.570709 108.596480 19.996705" -$ns_ at 120.000000 "$node_(8) setdest 573.762328 203.638794 19.998422" -$ns_ at 120.000000 "$node_(9) setdest 453.975818 186.542303 19.965996" -$ns_ at 120.000000 "$node_(10) setdest 592.135494 143.826225 16.878411" - -$ns_ at 121.000000 "$node_(1) setdest 509.718099 146.506082 13.572583" -$ns_ at 121.000000 "$node_(2) setdest 484.117793 19.082124 19.063023" -$ns_ at 121.000000 "$node_(3) setdest 433.058684 26.201559 11.547808" -$ns_ at 121.000000 "$node_(4) setdest 476.147484 37.254243 9.837858" -$ns_ at 121.000000 "$node_(5) setdest 480.493467 57.703401 14.970361" -$ns_ at 121.000000 "$node_(6) setdest 537.165573 83.737558 16.978527" -$ns_ at 121.000000 "$node_(7) setdest 464.612917 91.921714 19.999454" -$ns_ at 121.000000 "$node_(8) setdest 575.622097 183.725674 19.999777" -$ns_ at 121.000000 "$node_(9) setdest 435.402591 179.523497 19.855186" -$ns_ at 121.000000 "$node_(10) setdest 589.495037 140.928854 3.920047" - -$ns_ at 122.000000 "$node_(1) setdest 501.618767 135.407562 13.739589" -$ns_ at 122.000000 "$node_(2) setdest 468.354636 30.000884 19.175412" -$ns_ at 122.000000 "$node_(3) setdest 444.780251 32.212762 13.173066" -$ns_ at 122.000000 "$node_(4) setdest 478.682436 48.409195 11.439359" -$ns_ at 122.000000 "$node_(5) setdest 465.298067 64.267961 16.552753" -$ns_ at 122.000000 "$node_(6) setdest 544.950948 98.256877 16.474910" -$ns_ at 122.000000 "$node_(7) setdest 475.946542 75.443825 19.999297" -$ns_ at 122.000000 "$node_(8) setdest 576.534377 163.749996 19.996499" -$ns_ at 122.000000 "$node_(9) setdest 434.434766 179.467028 0.969471" -$ns_ at 122.000000 "$node_(10) setdest 584.521690 139.425209 5.195683" - -$ns_ at 123.000000 "$node_(1) setdest 492.075637 123.450755 15.298253" -$ns_ at 123.000000 "$node_(2) setdest 455.863068 44.093278 18.831751" -$ns_ at 123.000000 "$node_(3) setdest 458.619999 37.371581 14.769972" -$ns_ at 123.000000 "$node_(4) setdest 482.138433 60.980026 13.037244" -$ns_ at 123.000000 "$node_(5) setdest 449.568122 73.372764 18.174944" -$ns_ at 123.000000 "$node_(6) setdest 555.460624 109.423500 15.334495" -$ns_ at 123.000000 "$node_(7) setdest 488.072608 59.566099 19.978580" -$ns_ at 123.000000 "$node_(8) setdest 575.616599 143.782691 19.988386" -$ns_ at 123.000000 "$node_(9) setdest 437.345563 182.540188 4.232854" -$ns_ at 123.000000 "$node_(10) setdest 578.082071 137.243055 6.799300" - -$ns_ at 124.000000 "$node_(1) setdest 481.629922 110.164467 16.900841" -$ns_ at 124.000000 "$node_(2) setdest 442.838643 58.392410 19.341686" -$ns_ at 124.000000 "$node_(3) setdest 474.615429 40.719637 16.342070" -$ns_ at 124.000000 "$node_(4) setdest 486.172579 75.052483 14.639275" -$ns_ at 124.000000 "$node_(5) setdest 430.524277 77.428350 19.470897" -$ns_ at 124.000000 "$node_(6) setdest 570.380491 116.561320 16.539374" -$ns_ at 124.000000 "$node_(7) setdest 503.421106 46.832482 19.942953" -$ns_ at 124.000000 "$node_(8) setdest 571.969243 124.135771 19.982610" -$ns_ at 124.000000 "$node_(9) setdest 437.850553 188.097996 5.580703" -$ns_ at 124.000000 "$node_(10) setdest 570.292753 134.115544 8.393736" - -$ns_ at 125.000000 "$node_(1) setdest 468.764309 108.362457 12.991198" -$ns_ at 125.000000 "$node_(2) setdest 424.365917 65.103086 19.653874" -$ns_ at 125.000000 "$node_(3) setdest 458.785742 38.071495 16.049662" -$ns_ at 125.000000 "$node_(4) setdest 485.862028 75.256264 0.371442" -$ns_ at 125.000000 "$node_(5) setdest 410.538520 78.179722 19.999876" -$ns_ at 125.000000 "$node_(6) setdest 586.519711 124.964926 18.196017" -$ns_ at 125.000000 "$node_(7) setdest 522.204110 40.543630 19.807850" -$ns_ at 125.000000 "$node_(8) setdest 565.283378 105.313652 19.974308" -$ns_ at 125.000000 "$node_(9) setdest 438.236927 188.566948 0.607619" -$ns_ at 125.000000 "$node_(10) setdest 561.454881 129.437687 9.999516" - -$ns_ at 126.000000 "$node_(1) setdest 453.894330 110.665395 15.047252" -$ns_ at 126.000000 "$node_(2) setdest 404.988454 70.046829 19.998166" -$ns_ at 126.000000 "$node_(3) setdest 440.858781 37.340840 17.941845" -$ns_ at 126.000000 "$node_(4) setdest 484.107042 74.965456 1.778916" -$ns_ at 126.000000 "$node_(5) setdest 390.542704 78.440085 19.997511" -$ns_ at 126.000000 "$node_(6) setdest 592.964875 127.196911 6.820696" -$ns_ at 126.000000 "$node_(7) setdest 542.036992 42.707094 19.950533" -$ns_ at 126.000000 "$node_(8) setdest 554.346165 88.643407 19.937896" -$ns_ at 126.000000 "$node_(9) setdest 438.863799 187.609138 1.144713" -$ns_ at 126.000000 "$node_(10) setdest 550.853562 124.755186 11.589383" - -$ns_ at 127.000000 "$node_(1) setdest 437.536983 113.753231 16.646247" -$ns_ at 127.000000 "$node_(2) setdest 385.400042 74.078678 19.999042" -$ns_ at 127.000000 "$node_(3) setdest 421.408233 35.863244 19.506591" -$ns_ at 127.000000 "$node_(4) setdest 480.756885 74.527052 3.378720" -$ns_ at 127.000000 "$node_(5) setdest 370.587368 77.185177 19.994756" -$ns_ at 127.000000 "$node_(6) setdest 591.806569 125.973434 1.684805" -$ns_ at 127.000000 "$node_(7) setdest 561.938216 44.598425 19.990894" -$ns_ at 127.000000 "$node_(8) setdest 538.791423 76.225827 19.903424" -$ns_ at 127.000000 "$node_(9) setdest 439.851088 185.026858 2.764582" -$ns_ at 127.000000 "$node_(10) setdest 538.598737 119.856049 13.197813" - -$ns_ at 128.000000 "$node_(1) setdest 419.670201 117.456660 18.246569" -$ns_ at 128.000000 "$node_(2) setdest 365.724919 77.666346 19.999545" -$ns_ at 128.000000 "$node_(3) setdest 401.445644 34.670369 19.998197" -$ns_ at 128.000000 "$node_(4) setdest 475.797670 74.087926 4.978620" -$ns_ at 128.000000 "$node_(5) setdest 350.726157 74.834010 19.999892" -$ns_ at 128.000000 "$node_(6) setdest 589.270539 123.860295 3.301031" -$ns_ at 128.000000 "$node_(7) setdest 581.791247 44.803262 19.854088" -$ns_ at 128.000000 "$node_(8) setdest 520.702123 67.707079 19.994795" -$ns_ at 128.000000 "$node_(9) setdest 441.303563 180.909826 4.365734" -$ns_ at 128.000000 "$node_(10) setdest 525.473635 113.036002 14.791260" - -$ns_ at 129.000000 "$node_(1) setdest 400.190414 120.538102 19.722002" -$ns_ at 129.000000 "$node_(2) setdest 345.957172 80.701765 19.999440" -$ns_ at 129.000000 "$node_(3) setdest 381.449576 34.354000 19.998570" -$ns_ at 129.000000 "$node_(4) setdest 469.225898 73.791977 6.578432" -$ns_ at 129.000000 "$node_(5) setdest 330.797553 73.177839 19.997304" -$ns_ at 129.000000 "$node_(6) setdest 585.243076 121.062983 4.903612" -$ns_ at 129.000000 "$node_(7) setdest 588.511397 48.281694 7.567028" -$ns_ at 129.000000 "$node_(8) setdest 502.905331 58.615452 19.984581" -$ns_ at 129.000000 "$node_(9) setdest 443.695561 175.443621 5.966662" -$ns_ at 129.000000 "$node_(10) setdest 511.499269 104.458277 16.396959" - -$ns_ at 130.000000 "$node_(1) setdest 380.319010 122.788460 19.998421" -$ns_ at 130.000000 "$node_(2) setdest 326.114659 83.198800 19.999013" -$ns_ at 130.000000 "$node_(3) setdest 361.450892 34.562067 19.999767" -$ns_ at 130.000000 "$node_(4) setdest 461.047591 73.796428 8.178308" -$ns_ at 130.000000 "$node_(5) setdest 310.805689 73.087262 19.992069" -$ns_ at 130.000000 "$node_(6) setdest 580.472921 116.653619 6.495912" -$ns_ at 130.000000 "$node_(7) setdest 586.575808 48.184730 1.938017" -$ns_ at 130.000000 "$node_(8) setdest 485.758668 48.322000 19.999080" -$ns_ at 130.000000 "$node_(9) setdest 446.859035 168.570017 7.566637" -$ns_ at 130.000000 "$node_(10) setdest 497.658476 92.981586 17.980044" - -$ns_ at 131.000000 "$node_(1) setdest 360.365366 124.127494 19.998522" -$ns_ at 131.000000 "$node_(2) setdest 306.164975 84.538799 19.994637" -$ns_ at 131.000000 "$node_(3) setdest 341.453459 34.881321 19.999981" -$ns_ at 131.000000 "$node_(4) setdest 451.277647 74.201781 9.778349" -$ns_ at 131.000000 "$node_(5) setdest 290.929481 75.205162 19.988725" -$ns_ at 131.000000 "$node_(6) setdest 575.708834 110.114534 8.090498" -$ns_ at 131.000000 "$node_(7) setdest 583.023276 48.266735 3.553478" -$ns_ at 131.000000 "$node_(8) setdest 468.711352 37.876329 19.993075" -$ns_ at 131.000000 "$node_(9) setdest 451.428019 160.631101 9.159804" -$ns_ at 131.000000 "$node_(10) setdest 485.035837 78.081245 19.528215" - -$ns_ at 132.000000 "$node_(1) setdest 340.372607 124.577953 19.997833" -$ns_ at 132.000000 "$node_(2) setdest 286.178506 84.073191 19.991892" -$ns_ at 132.000000 "$node_(3) setdest 321.454012 34.894377 19.999451" -$ns_ at 132.000000 "$node_(4) setdest 439.923459 74.951472 11.378912" -$ns_ at 132.000000 "$node_(5) setdest 271.481106 79.805860 19.985138" -$ns_ at 132.000000 "$node_(6) setdest 571.726779 101.275821 9.694308" -$ns_ at 132.000000 "$node_(7) setdest 577.934453 49.068828 5.151648" -$ns_ at 132.000000 "$node_(8) setdest 450.507813 29.624318 19.986609" -$ns_ at 132.000000 "$node_(9) setdest 457.527500 151.759105 10.766428" -$ns_ at 132.000000 "$node_(10) setdest 474.583709 61.040590 19.990771" - -$ns_ at 133.000000 "$node_(1) setdest 320.380450 124.065568 19.998722" -$ns_ at 133.000000 "$node_(2) setdest 266.383509 81.306673 19.987384" -$ns_ at 133.000000 "$node_(3) setdest 301.478147 33.972686 19.997117" -$ns_ at 133.000000 "$node_(4) setdest 426.974114 75.826178 12.978853" -$ns_ at 133.000000 "$node_(5) setdest 252.963837 87.304381 19.977914" -$ns_ at 133.000000 "$node_(6) setdest 568.310797 90.505002 11.299534" -$ns_ at 133.000000 "$node_(7) setdest 571.352734 50.591970 6.755663" -$ns_ at 133.000000 "$node_(8) setdest 430.748481 26.892605 19.947266" -$ns_ at 133.000000 "$node_(9) setdest 464.585787 141.605483 12.365900" -$ns_ at 133.000000 "$node_(10) setdest 461.707413 45.848981 19.914416" - -$ns_ at 134.000000 "$node_(1) setdest 300.449527 122.443033 19.996858" -$ns_ at 134.000000 "$node_(2) setdest 247.068943 76.153410 19.990212" -$ns_ at 134.000000 "$node_(3) setdest 281.620279 31.641423 19.994242" -$ns_ at 134.000000 "$node_(4) setdest 412.407798 76.413196 14.578139" -$ns_ at 134.000000 "$node_(5) setdest 236.182515 98.124469 19.967150" -$ns_ at 134.000000 "$node_(6) setdest 565.493969 77.924687 12.891814" -$ns_ at 134.000000 "$node_(7) setdest 563.139327 52.127120 8.355642" -$ns_ at 134.000000 "$node_(8) setdest 416.947036 15.226109 18.071719" -$ns_ at 134.000000 "$node_(9) setdest 472.330576 129.982714 13.966765" -$ns_ at 134.000000 "$node_(10) setdest 445.040272 34.848403 19.970135" - -$ns_ at 135.000000 "$node_(1) setdest 280.660058 119.566270 19.997470" -$ns_ at 135.000000 "$node_(2) setdest 228.579859 68.567935 19.984636" -$ns_ at 135.000000 "$node_(3) setdest 261.870140 28.489966 19.999992" -$ns_ at 135.000000 "$node_(4) setdest 396.230443 76.619532 16.178671" -$ns_ at 135.000000 "$node_(5) setdest 221.570082 111.764000 19.988997" -$ns_ at 135.000000 "$node_(6) setdest 565.462360 63.456976 14.467745" -$ns_ at 135.000000 "$node_(7) setdest 553.580974 54.883009 9.947715" -$ns_ at 135.000000 "$node_(8) setdest 426.301069 2.292969 15.961330" -$ns_ at 135.000000 "$node_(9) setdest 481.564388 117.456807 15.561543" -$ns_ at 135.000000 "$node_(10) setdest 426.598641 27.230647 19.953044" - -$ns_ at 136.000000 "$node_(1) setdest 260.964022 116.093665 19.999821" -$ns_ at 136.000000 "$node_(2) setdest 211.157455 58.763950 19.991455" -$ns_ at 136.000000 "$node_(3) setdest 242.069536 25.684400 19.998378" -$ns_ at 136.000000 "$node_(4) setdest 378.451498 76.635633 17.778952" -$ns_ at 136.000000 "$node_(5) setdest 207.405609 125.883222 19.999618" -$ns_ at 136.000000 "$node_(6) setdest 570.550150 48.286694 16.000721" -$ns_ at 136.000000 "$node_(7) setdest 543.178360 59.884928 11.542685" -$ns_ at 136.000000 "$node_(8) setdest 439.426261 7.213786 14.017314" -$ns_ at 136.000000 "$node_(9) setdest 492.799836 104.479486 17.165259" -$ns_ at 136.000000 "$node_(10) setdest 416.515775 29.332216 10.299553" - -$ns_ at 137.000000 "$node_(1) setdest 241.166659 113.273096 19.997279" -$ns_ at 137.000000 "$node_(2) setdest 193.607811 49.185768 19.993288" -$ns_ at 137.000000 "$node_(3) setdest 222.148163 23.923978 19.999004" -$ns_ at 137.000000 "$node_(4) setdest 359.072806 76.657629 19.378705" -$ns_ at 137.000000 "$node_(5) setdest 192.886203 139.634471 19.997750" -$ns_ at 137.000000 "$node_(6) setdest 583.970533 42.100482 14.777547" -$ns_ at 137.000000 "$node_(7) setdest 532.296270 67.248819 13.139511" -$ns_ at 137.000000 "$node_(8) setdest 453.839916 9.148842 14.542968" -$ns_ at 137.000000 "$node_(9) setdest 505.861846 91.012627 18.760928" -$ns_ at 137.000000 "$node_(10) setdest 417.284418 30.284041 1.223431" - -$ns_ at 138.000000 "$node_(1) setdest 221.227107 111.767797 19.996292" -$ns_ at 138.000000 "$node_(2) setdest 175.271841 41.218919 19.991961" -$ns_ at 138.000000 "$node_(3) setdest 202.333247 21.224188 19.997993" -$ns_ at 138.000000 "$node_(4) setdest 339.081034 77.216611 19.999585" -$ns_ at 138.000000 "$node_(5) setdest 177.604021 152.479213 19.963278" -$ns_ at 138.000000 "$node_(6) setdest 588.327423 50.944124 9.858625" -$ns_ at 138.000000 "$node_(7) setdest 521.858823 77.648040 14.733774" -$ns_ at 138.000000 "$node_(8) setdest 470.072953 9.536007 16.237653" -$ns_ at 138.000000 "$node_(9) setdest 520.526387 77.499927 19.940959" -$ns_ at 138.000000 "$node_(10) setdest 420.076823 30.790374 2.837939" - -$ns_ at 139.000000 "$node_(1) setdest 201.240697 111.066682 19.998704" -$ns_ at 139.000000 "$node_(2) setdest 164.466411 38.985513 11.033831" -$ns_ at 139.000000 "$node_(3) setdest 184.238943 13.733066 19.583686" -$ns_ at 139.000000 "$node_(4) setdest 319.132136 78.610994 19.997570" -$ns_ at 139.000000 "$node_(5) setdest 159.330537 160.396138 19.914767" -$ns_ at 139.000000 "$node_(6) setdest 588.282286 62.792033 11.847995" -$ns_ at 139.000000 "$node_(7) setdest 512.243129 90.872745 16.350976" -$ns_ at 139.000000 "$node_(8) setdest 487.878750 9.368775 17.806582" -$ns_ at 139.000000 "$node_(9) setdest 536.534192 65.547922 19.977493" -$ns_ at 139.000000 "$node_(10) setdest 424.324084 29.536639 4.428439" - -$ns_ at 140.000000 "$node_(1) setdest 181.242347 111.274656 19.999432" -$ns_ at 140.000000 "$node_(2) setdest 175.502159 37.272010 11.167982" -$ns_ at 140.000000 "$node_(3) setdest 182.074451 1.712658 12.213731" -$ns_ at 140.000000 "$node_(4) setdest 299.283899 81.049008 19.997411" -$ns_ at 140.000000 "$node_(5) setdest 139.532044 162.682204 19.930038" -$ns_ at 140.000000 "$node_(6) setdest 589.138402 76.155223 13.390586" -$ns_ at 140.000000 "$node_(7) setdest 501.789191 105.467392 17.952396" -$ns_ at 140.000000 "$node_(8) setdest 505.637603 16.818056 19.257951" -$ns_ at 140.000000 "$node_(9) setdest 554.813129 57.628754 19.920661" -$ns_ at 140.000000 "$node_(10) setdest 429.800533 26.943825 6.059223" - -$ns_ at 141.000000 "$node_(1) setdest 161.247046 111.473323 19.996287" -$ns_ at 141.000000 "$node_(2) setdest 185.373829 29.829709 12.362755" -$ns_ at 141.000000 "$node_(3) setdest 183.778520 1.889613 1.713232" -$ns_ at 141.000000 "$node_(4) setdest 279.550001 84.297092 19.999419" -$ns_ at 141.000000 "$node_(5) setdest 119.793534 159.666849 19.967502" -$ns_ at 141.000000 "$node_(6) setdest 592.156148 90.830024 14.981874" -$ns_ at 141.000000 "$node_(7) setdest 488.189099 119.413179 19.479412" -$ns_ at 141.000000 "$node_(8) setdest 523.321051 26.105433 19.973976" -$ns_ at 141.000000 "$node_(9) setdest 571.486632 63.791740 17.776055" -$ns_ at 141.000000 "$node_(10) setdest 436.921300 24.140901 7.652561" - -$ns_ at 142.000000 "$node_(1) setdest 141.772095 115.540184 19.895051" -$ns_ at 142.000000 "$node_(2) setdest 196.339570 29.318053 10.977671" -$ns_ at 142.000000 "$node_(3) setdest 184.812005 4.915605 3.197612" -$ns_ at 142.000000 "$node_(4) setdest 259.803815 87.459443 19.997808" -$ns_ at 142.000000 "$node_(5) setdest 100.096591 156.319135 19.979409" -$ns_ at 142.000000 "$node_(6) setdest 590.692452 107.433540 16.667908" -$ns_ at 142.000000 "$node_(7) setdest 471.797782 130.833795 19.977632" -$ns_ at 142.000000 "$node_(8) setdest 541.126366 35.173355 19.981403" -$ns_ at 142.000000 "$node_(9) setdest 567.782585 75.167477 11.963585" -$ns_ at 142.000000 "$node_(10) setdest 446.013398 22.445407 9.248835" - -$ns_ at 143.000000 "$node_(1) setdest 127.450194 128.944032 19.615810" -$ns_ at 143.000000 "$node_(2) setdest 197.147859 36.740438 7.466266" -$ns_ at 143.000000 "$node_(3) setdest 185.893987 9.604906 4.812507" -$ns_ at 143.000000 "$node_(4) setdest 239.858385 88.607005 19.978416" -$ns_ at 143.000000 "$node_(5) setdest 80.175258 157.537770 19.958571" -$ns_ at 143.000000 "$node_(6) setdest 585.791697 124.971994 18.210293" -$ns_ at 143.000000 "$node_(7) setdest 454.924266 141.549003 19.988276" -$ns_ at 143.000000 "$node_(8) setdest 556.871642 47.471369 19.978860" -$ns_ at 143.000000 "$node_(9) setdest 558.206517 84.854499 13.621287" -$ns_ at 143.000000 "$node_(10) setdest 456.841721 21.664948 10.856413" - -$ns_ at 144.000000 "$node_(1) setdest 118.524599 146.840858 19.999066" -$ns_ at 144.000000 "$node_(2) setdest 196.591811 45.826445 9.103005" -$ns_ at 144.000000 "$node_(3) setdest 187.092769 15.899568 6.407796" -$ns_ at 144.000000 "$node_(4) setdest 220.066145 86.102236 19.950103" -$ns_ at 144.000000 "$node_(5) setdest 60.964143 162.769298 19.910697" -$ns_ at 144.000000 "$node_(6) setdest 574.313128 140.914141 19.644582" -$ns_ at 144.000000 "$node_(7) setdest 441.557267 156.254138 19.872536" -$ns_ at 144.000000 "$node_(8) setdest 571.374396 61.086555 19.892289" -$ns_ at 144.000000 "$node_(9) setdest 552.626228 98.963335 15.172307" -$ns_ at 144.000000 "$node_(10) setdest 469.299904 21.561095 12.458615" - -$ns_ at 145.000000 "$node_(1) setdest 112.115498 165.696718 19.915321" -$ns_ at 145.000000 "$node_(2) setdest 190.250128 47.613148 6.588570" -$ns_ at 145.000000 "$node_(3) setdest 187.313861 23.900730 8.004216" -$ns_ at 145.000000 "$node_(4) setdest 203.065906 94.794565 19.093577" -$ns_ at 145.000000 "$node_(5) setdest 45.972008 175.619703 19.745810" -$ns_ at 145.000000 "$node_(6) setdest 560.255115 155.135300 19.996727" -$ns_ at 145.000000 "$node_(7) setdest 438.601722 175.534770 19.505846" -$ns_ at 145.000000 "$node_(8) setdest 588.750250 69.671374 19.380903" -$ns_ at 145.000000 "$node_(9) setdest 551.878665 115.778256 16.831530" -$ns_ at 145.000000 "$node_(10) setdest 483.345939 22.123346 14.057284" - -$ns_ at 146.000000 "$node_(1) setdest 111.731159 185.496144 19.803156" -$ns_ at 146.000000 "$node_(2) setdest 183.547590 43.776632 7.722881" -$ns_ at 146.000000 "$node_(3) setdest 185.862180 33.389020 9.598699" -$ns_ at 146.000000 "$node_(4) setdest 190.626206 108.639388 18.612503" -$ns_ at 146.000000 "$node_(5) setdest 47.072918 193.458445 17.872681" -$ns_ at 146.000000 "$node_(6) setdest 545.916182 169.049201 19.980032" -$ns_ at 146.000000 "$node_(7) setdest 444.782179 193.174570 18.691190" -$ns_ at 146.000000 "$node_(8) setdest 586.255822 69.734557 2.495228" -$ns_ at 146.000000 "$node_(9) setdest 554.631147 134.007561 18.435936" -$ns_ at 146.000000 "$node_(10) setdest 498.884774 24.015570 15.653623" - -$ns_ at 147.000000 "$node_(1) setdest 111.899554 186.471049 0.989342" -$ns_ at 147.000000 "$node_(2) setdest 175.795557 38.607572 9.317360" -$ns_ at 147.000000 "$node_(3) setdest 182.523745 44.090935 11.210537" -$ns_ at 147.000000 "$node_(4) setdest 179.070997 123.870067 19.117961" -$ns_ at 147.000000 "$node_(5) setdest 62.376736 192.812895 15.317427" -$ns_ at 147.000000 "$node_(6) setdest 531.919229 183.302102 19.976483" -$ns_ at 147.000000 "$node_(7) setdest 436.724006 199.709287 10.374810" -$ns_ at 147.000000 "$node_(8) setdest 576.168467 67.370369 10.360701" -$ns_ at 147.000000 "$node_(9) setdest 562.586604 152.129905 19.791631" -$ns_ at 147.000000 "$node_(10) setdest 515.441797 28.772088 17.226708" - -$ns_ at 148.000000 "$node_(1) setdest 108.990066 180.641200 6.515540" -$ns_ at 148.000000 "$node_(2) setdest 167.327952 31.720295 10.914894" -$ns_ at 148.000000 "$node_(3) setdest 179.086940 56.426752 12.805624" -$ns_ at 148.000000 "$node_(4) setdest 163.850105 134.459779 18.542318" -$ns_ at 148.000000 "$node_(5) setdest 69.482057 179.583763 15.016508" -$ns_ at 148.000000 "$node_(6) setdest 513.623888 191.062746 19.873276" -$ns_ at 148.000000 "$node_(7) setdest 426.833193 195.609739 10.706749" -$ns_ at 148.000000 "$node_(8) setdest 564.268369 67.203121 11.901272" -$ns_ at 148.000000 "$node_(9) setdest 570.951086 170.282477 19.987006" -$ns_ at 148.000000 "$node_(10) setdest 531.755709 38.134043 18.809304" - -$ns_ at 149.000000 "$node_(1) setdest 104.753756 173.710069 8.123232" -$ns_ at 149.000000 "$node_(2) setdest 156.878825 24.944390 12.453801" -$ns_ at 149.000000 "$node_(3) setdest 176.599709 70.622921 14.412410" -$ns_ at 149.000000 "$node_(4) setdest 146.434634 142.639565 19.240778" -$ns_ at 149.000000 "$node_(5) setdest 75.707512 165.318603 15.564417" -$ns_ at 149.000000 "$node_(6) setdest 493.935495 190.646337 19.692796" -$ns_ at 149.000000 "$node_(7) setdest 417.399684 187.603159 12.373213" -$ns_ at 149.000000 "$node_(8) setdest 551.157370 70.606676 13.545571" -$ns_ at 149.000000 "$node_(9) setdest 576.243443 189.189175 19.633448" -$ns_ at 149.000000 "$node_(10) setdest 546.734747 51.323269 19.958137" - -$ns_ at 150.000000 "$node_(1) setdest 99.278520 165.679385 9.719573" -$ns_ at 150.000000 "$node_(2) setdest 143.075068 24.363392 13.815978" -$ns_ at 150.000000 "$node_(3) setdest 173.400696 86.306718 16.006723" -$ns_ at 150.000000 "$node_(4) setdest 130.649757 153.943580 19.415023" -$ns_ at 150.000000 "$node_(5) setdest 88.488112 154.041636 17.044464" -$ns_ at 150.000000 "$node_(6) setdest 475.349957 183.326049 19.975206" -$ns_ at 150.000000 "$node_(7) setdest 414.624429 174.179041 13.707991" -$ns_ at 150.000000 "$node_(8) setdest 537.189239 76.498837 15.160021" -$ns_ at 150.000000 "$node_(9) setdest 575.465562 180.778988 8.446085" -$ns_ at 150.000000 "$node_(10) setdest 560.401937 65.884227 19.970318" - -$ns_ at 151.000000 "$node_(1) setdest 91.813160 157.170777 11.319364" -$ns_ at 151.000000 "$node_(2) setdest 138.004596 35.391633 12.138031" -$ns_ at 151.000000 "$node_(3) setdest 168.114267 103.099736 17.605447" -$ns_ at 151.000000 "$node_(4) setdest 119.996573 169.374810 18.751351" -$ns_ at 151.000000 "$node_(5) setdest 105.657672 146.388340 18.798051" -$ns_ at 151.000000 "$node_(6) setdest 459.956503 171.347805 19.504788" -$ns_ at 151.000000 "$node_(7) setdest 416.813764 158.732695 15.600731" -$ns_ at 151.000000 "$node_(8) setdest 521.788366 83.114604 16.761720" -$ns_ at 151.000000 "$node_(9) setdest 577.687876 171.392622 9.645857" -$ns_ at 151.000000 "$node_(10) setdest 569.087851 83.782994 19.894998" - -$ns_ at 152.000000 "$node_(1) setdest 82.097039 148.659628 12.916759" -$ns_ at 152.000000 "$node_(2) setdest 146.119591 45.797946 13.196382" -$ns_ at 152.000000 "$node_(3) setdest 160.937701 120.920891 19.211888" -$ns_ at 152.000000 "$node_(4) setdest 105.936747 181.378621 18.487028" -$ns_ at 152.000000 "$node_(5) setdest 124.801631 141.076851 19.867135" -$ns_ at 152.000000 "$node_(6) setdest 448.544469 155.827294 19.264495" -$ns_ at 152.000000 "$node_(7) setdest 417.880719 141.561761 17.204051" -$ns_ at 152.000000 "$node_(8) setdest 503.612706 85.135031 18.287612" -$ns_ at 152.000000 "$node_(9) setdest 582.520079 161.274967 11.212365" -$ns_ at 152.000000 "$node_(10) setdest 569.702380 103.596801 19.823334" - -$ns_ at 153.000000 "$node_(1) setdest 70.379904 140.091185 14.515835" -$ns_ at 153.000000 "$node_(2) setdest 158.134566 54.430381 14.794545" -$ns_ at 153.000000 "$node_(3) setdest 156.219850 140.328761 19.973071" -$ns_ at 153.000000 "$node_(4) setdest 88.725972 189.580626 19.065247" -$ns_ at 153.000000 "$node_(5) setdest 144.327183 138.526583 19.691395" -$ns_ at 153.000000 "$node_(6) setdest 442.382049 137.609253 19.232068" -$ns_ at 153.000000 "$node_(7) setdest 416.376540 122.816638 18.805376" -$ns_ at 153.000000 "$node_(8) setdest 483.914674 83.287628 19.784472" -$ns_ at 153.000000 "$node_(9) setdest 586.204849 149.285184 12.543222" -$ns_ at 153.000000 "$node_(10) setdest 559.010783 119.996465 19.577008" - -$ns_ at 154.000000 "$node_(1) setdest 55.997138 132.866034 16.095551" -$ns_ at 154.000000 "$node_(2) setdest 172.406373 62.536019 16.412977" -$ns_ at 154.000000 "$node_(3) setdest 151.635699 159.667002 19.874155" -$ns_ at 154.000000 "$node_(4) setdest 78.054821 195.479620 12.193096" -$ns_ at 154.000000 "$node_(5) setdest 163.592391 140.383876 19.354528" -$ns_ at 154.000000 "$node_(6) setdest 441.383428 118.459568 19.175706" -$ns_ at 154.000000 "$node_(7) setdest 412.338720 103.315957 19.914330" -$ns_ at 154.000000 "$node_(8) setdest 464.344857 79.349340 19.962160" -$ns_ at 154.000000 "$node_(9) setdest 576.816577 139.350201 13.669073" -$ns_ at 154.000000 "$node_(10) setdest 540.866973 128.225326 19.922651" - -$ns_ at 155.000000 "$node_(1) setdest 41.252307 123.224103 17.617516" -$ns_ at 155.000000 "$node_(2) setdest 186.611964 72.729002 17.484157" -$ns_ at 155.000000 "$node_(3) setdest 144.090830 165.764530 9.700768" -$ns_ at 155.000000 "$node_(4) setdest 84.150229 193.306525 6.471193" -$ns_ at 155.000000 "$node_(5) setdest 178.718241 150.366969 18.123286" -$ns_ at 155.000000 "$node_(6) setdest 439.600336 99.066105 19.475263" -$ns_ at 155.000000 "$node_(7) setdest 407.087226 84.024775 19.993196" -$ns_ at 155.000000 "$node_(8) setdest 447.207539 69.162889 19.936185" -$ns_ at 155.000000 "$node_(9) setdest 561.438062 134.917972 16.004480" -$ns_ at 155.000000 "$node_(10) setdest 526.487380 140.831521 19.122992" - -$ns_ at 156.000000 "$node_(1) setdest 34.078752 105.954513 18.700231" -$ns_ at 156.000000 "$node_(2) setdest 187.094893 73.875178 1.243760" -$ns_ at 156.000000 "$node_(3) setdest 141.135685 162.335572 4.526658" -$ns_ at 156.000000 "$node_(4) setdest 92.326017 193.380787 8.176125" -$ns_ at 156.000000 "$node_(5) setdest 191.326981 163.978216 18.553877" -$ns_ at 156.000000 "$node_(6) setdest 441.938872 80.015861 19.193242" -$ns_ at 156.000000 "$node_(7) setdest 410.869511 64.803585 19.589788" -$ns_ at 156.000000 "$node_(8) setdest 431.974289 56.242401 19.974757" -$ns_ at 156.000000 "$node_(9) setdest 545.448883 127.932357 17.448572" -$ns_ at 156.000000 "$node_(10) setdest 515.851572 156.904956 19.273705" - -$ns_ at 157.000000 "$node_(1) setdest 43.916030 90.582641 18.250109" -$ns_ at 157.000000 "$node_(2) setdest 185.047818 73.249294 2.140618" -$ns_ at 157.000000 "$node_(3) setdest 137.743986 157.188007 6.164499" -$ns_ at 157.000000 "$node_(4) setdest 102.029528 194.793971 9.805877" -$ns_ at 157.000000 "$node_(5) setdest 189.463671 163.013794 2.098103" -$ns_ at 157.000000 "$node_(6) setdest 447.800127 61.558044 19.366087" -$ns_ at 157.000000 "$node_(7) setdest 421.274390 47.730933 19.993423" -$ns_ at 157.000000 "$node_(8) setdest 417.596276 42.348809 19.993978" -$ns_ at 157.000000 "$node_(9) setdest 533.516072 113.369140 18.827619" -$ns_ at 157.000000 "$node_(10) setdest 508.458281 174.872098 19.428817" - -$ns_ at 158.000000 "$node_(1) setdest 55.511989 78.080336 17.052094" -$ns_ at 158.000000 "$node_(2) setdest 181.442077 72.235518 3.745545" -$ns_ at 158.000000 "$node_(3) setdest 134.731133 150.035278 7.761367" -$ns_ at 158.000000 "$node_(4) setdest 113.388357 195.826949 11.405702" -$ns_ at 158.000000 "$node_(5) setdest 189.430347 155.904971 7.108901" -$ns_ at 158.000000 "$node_(6) setdest 451.172245 42.328961 19.522521" -$ns_ at 158.000000 "$node_(7) setdest 430.947390 30.485112 19.773347" -$ns_ at 158.000000 "$node_(8) setdest 416.344354 24.696906 17.696242" -$ns_ at 158.000000 "$node_(9) setdest 532.772610 95.462924 17.921644" -$ns_ at 158.000000 "$node_(10) setdest 499.709975 191.961210 19.198193" - -$ns_ at 159.000000 "$node_(1) setdest 62.113656 61.761513 17.603579" -$ns_ at 159.000000 "$node_(2) setdest 176.123023 71.889821 5.330276" -$ns_ at 159.000000 "$node_(3) setdest 131.954733 141.086339 9.369734" -$ns_ at 159.000000 "$node_(4) setdest 126.380996 196.373692 13.004139" -$ns_ at 159.000000 "$node_(5) setdest 187.683229 147.360821 8.720947" -$ns_ at 159.000000 "$node_(6) setdest 451.279335 22.737061 19.592193" -$ns_ at 159.000000 "$node_(7) setdest 436.024525 11.839659 19.324342" -$ns_ at 159.000000 "$node_(8) setdest 426.226077 23.617931 9.940454" -$ns_ at 159.000000 "$node_(9) setdest 526.035117 80.351338 16.545509" -$ns_ at 159.000000 "$node_(10) setdest 503.894359 181.756466 11.029318" - -$ns_ at 160.000000 "$node_(1) setdest 65.960718 43.172044 18.983367" -$ns_ at 160.000000 "$node_(2) setdest 169.348075 73.331064 6.926551" -$ns_ at 160.000000 "$node_(3) setdest 128.796997 130.584343 10.966459" -$ns_ at 160.000000 "$node_(4) setdest 140.930810 195.800748 14.561090" -$ns_ at 160.000000 "$node_(5) setdest 187.045369 137.058154 10.322393" -$ns_ at 160.000000 "$node_(6) setdest 444.402909 18.604950 8.022441" -$ns_ at 160.000000 "$node_(7) setdest 434.909325 14.365720 2.761278" -$ns_ at 160.000000 "$node_(8) setdest 424.301771 22.863179 2.067028" -$ns_ at 160.000000 "$node_(9) setdest 512.812174 79.050168 13.286808" -$ns_ at 160.000000 "$node_(10) setdest 495.740867 177.608074 9.148147" - -$ns_ at 161.000000 "$node_(1) setdest 72.042419 24.842076 19.312556" -$ns_ at 161.000000 "$node_(2) setdest 161.871350 77.405615 8.514892" -$ns_ at 161.000000 "$node_(3) setdest 126.355196 118.254232 12.569568" -$ns_ at 161.000000 "$node_(4) setdest 150.057613 187.830197 12.117269" -$ns_ at 161.000000 "$node_(5) setdest 187.048576 125.133800 11.924355" -$ns_ at 161.000000 "$node_(6) setdest 434.736032 18.300064 9.671684" -$ns_ at 161.000000 "$node_(7) setdest 431.202382 15.736051 3.952118" -$ns_ at 161.000000 "$node_(8) setdest 421.173291 24.251968 3.422882" -$ns_ at 161.000000 "$node_(9) setdest 497.627026 80.566955 15.260713" -$ns_ at 161.000000 "$node_(10) setdest 485.182776 174.616363 10.973770" - -$ns_ at 162.000000 "$node_(1) setdest 76.823348 6.990102 18.481078" -$ns_ at 162.000000 "$node_(2) setdest 155.188412 84.965774 10.090474" -$ns_ at 162.000000 "$node_(3) setdest 123.148854 104.452853 14.168934" -$ns_ at 162.000000 "$node_(4) setdest 146.530739 184.039119 5.177945" -$ns_ at 162.000000 "$node_(5) setdest 185.580284 111.692807 13.520953" -$ns_ at 162.000000 "$node_(6) setdest 423.465948 18.099012 11.271878" -$ns_ at 162.000000 "$node_(7) setdest 426.070562 17.854362 5.551829" -$ns_ at 162.000000 "$node_(8) setdest 416.609786 26.350567 5.022917" -$ns_ at 162.000000 "$node_(9) setdest 480.789422 81.428650 16.859639" -$ns_ at 162.000000 "$node_(10) setdest 473.049914 171.315733 12.573802" - -$ns_ at 163.000000 "$node_(1) setdest 74.663686 11.270534 4.794396" -$ns_ at 163.000000 "$node_(2) setdest 150.947840 95.880837 11.709870" -$ns_ at 163.000000 "$node_(3) setdest 117.765575 89.646315 15.754785" -$ns_ at 163.000000 "$node_(4) setdest 140.287067 180.992837 6.947177" -$ns_ at 163.000000 "$node_(5) setdest 184.617717 96.618690 15.104819" -$ns_ at 163.000000 "$node_(6) setdest 410.594549 18.024662 12.871613" -$ns_ at 163.000000 "$node_(7) setdest 419.556244 20.806580 7.152058" -$ns_ at 163.000000 "$node_(8) setdest 410.491787 28.885939 6.622539" -$ns_ at 163.000000 "$node_(9) setdest 462.331560 81.229685 18.458934" -$ns_ at 163.000000 "$node_(10) setdest 459.326921 167.770043 14.173654" - -$ns_ at 164.000000 "$node_(1) setdest 77.700460 16.056801 5.668364" -$ns_ at 164.000000 "$node_(2) setdest 148.502806 108.986321 13.331613" -$ns_ at 164.000000 "$node_(3) setdest 109.149818 74.597894 17.340307" -$ns_ at 164.000000 "$node_(4) setdest 131.820856 181.190189 8.468511" -$ns_ at 164.000000 "$node_(5) setdest 185.147114 79.901197 16.725873" -$ns_ at 164.000000 "$node_(6) setdest 396.123158 17.912799 14.471824" -$ns_ at 164.000000 "$node_(7) setdest 411.667762 24.597608 8.752145" -$ns_ at 164.000000 "$node_(8) setdest 402.783503 31.748758 8.222735" -$ns_ at 164.000000 "$node_(9) setdest 442.549827 79.886156 19.827305" -$ns_ at 164.000000 "$node_(10) setdest 443.980346 164.127469 15.772942" - -$ns_ at 165.000000 "$node_(1) setdest 80.751011 22.632665 7.248989" -$ns_ at 165.000000 "$node_(2) setdest 147.928686 123.907075 14.931795" -$ns_ at 165.000000 "$node_(3) setdest 96.035595 60.970960 18.912329" -$ns_ at 165.000000 "$node_(4) setdest 122.502042 185.210639 10.149105" -$ns_ at 165.000000 "$node_(5) setdest 185.141179 61.579353 18.321845" -$ns_ at 165.000000 "$node_(6) setdest 380.051979 17.762097 16.071885" -$ns_ at 165.000000 "$node_(7) setdest 402.404607 29.219681 10.352276" -$ns_ at 165.000000 "$node_(8) setdest 393.507649 34.981420 9.823012" -$ns_ at 165.000000 "$node_(9) setdest 422.735375 77.199676 19.995742" -$ns_ at 165.000000 "$node_(10) setdest 426.942629 160.730540 17.373052" - -$ns_ at 166.000000 "$node_(1) setdest 82.726194 31.276530 8.866665" -$ns_ at 166.000000 "$node_(2) setdest 148.987588 140.420750 16.547590" -$ns_ at 166.000000 "$node_(3) setdest 78.637722 51.317801 19.896468" -$ns_ at 166.000000 "$node_(4) setdest 111.343377 182.740860 11.428718" -$ns_ at 166.000000 "$node_(5) setdest 183.940304 41.880407 19.735515" -$ns_ at 166.000000 "$node_(6) setdest 362.380169 17.752944 17.671813" -$ns_ at 166.000000 "$node_(7) setdest 391.653384 34.440900 11.951984" -$ns_ at 166.000000 "$node_(8) setdest 382.669885 38.590161 11.422790" -$ns_ at 166.000000 "$node_(9) setdest 403.199353 72.940877 19.994837" -$ns_ at 166.000000 "$node_(10) setdest 408.274085 157.340788 18.973796" - -$ns_ at 167.000000 "$node_(1) setdest 83.836001 41.676120 10.458640" -$ns_ at 167.000000 "$node_(2) setdest 153.399183 157.898562 18.025984" -$ns_ at 167.000000 "$node_(3) setdest 58.975217 50.354423 19.686091" -$ns_ at 167.000000 "$node_(4) setdest 103.966143 171.791634 13.202619" -$ns_ at 167.000000 "$node_(5) setdest 192.412042 25.101152 18.796642" -$ns_ at 167.000000 "$node_(6) setdest 343.128857 18.513654 19.266336" -$ns_ at 167.000000 "$node_(7) setdest 379.364734 40.154703 13.552065" -$ns_ at 167.000000 "$node_(8) setdest 370.163237 42.213745 13.021007" -$ns_ at 167.000000 "$node_(9) setdest 384.109842 66.996327 19.993677" -$ns_ at 167.000000 "$node_(10) setdest 388.699756 153.273291 19.992471" - -$ns_ at 168.000000 "$node_(1) setdest 84.894126 53.682119 12.052537" -$ns_ at 168.000000 "$node_(2) setdest 167.272527 171.355308 19.327536" -$ns_ at 168.000000 "$node_(3) setdest 50.795974 63.637111 15.599033" -$ns_ at 168.000000 "$node_(4) setdest 99.748116 157.437131 14.961400" -$ns_ at 168.000000 "$node_(5) setdest 198.947067 22.026635 7.222133" -$ns_ at 168.000000 "$node_(6) setdest 323.346757 21.396871 19.991109" -$ns_ at 168.000000 "$node_(7) setdest 365.975599 47.239433 15.148014" -$ns_ at 168.000000 "$node_(8) setdest 355.878352 45.327028 14.620207" -$ns_ at 168.000000 "$node_(9) setdest 365.020316 61.038320 19.997696" -$ns_ at 168.000000 "$node_(10) setdest 369.105098 149.269829 19.999458" - -$ns_ at 169.000000 "$node_(1) setdest 89.451531 66.521653 13.624375" -$ns_ at 169.000000 "$node_(2) setdest 185.788334 169.598855 18.598931" -$ns_ at 169.000000 "$node_(3) setdest 57.023606 66.857513 7.011019" -$ns_ at 169.000000 "$node_(4) setdest 94.375213 141.785412 16.548244" -$ns_ at 169.000000 "$node_(5) setdest 197.685641 21.098308 1.566202" -$ns_ at 169.000000 "$node_(6) setdest 303.800583 25.627234 19.998722" -$ns_ at 169.000000 "$node_(7) setdest 351.976358 56.428967 16.745934" -$ns_ at 169.000000 "$node_(8) setdest 339.845401 47.794114 16.221653" -$ns_ at 169.000000 "$node_(9) setdest 345.625203 56.166910 19.997526" -$ns_ at 169.000000 "$node_(10) setdest 349.412594 145.778646 19.999576" - -$ns_ at 170.000000 "$node_(1) setdest 98.595971 78.660537 15.197805" -$ns_ at 170.000000 "$node_(2) setdest 191.824229 152.854155 17.799355" -$ns_ at 170.000000 "$node_(3) setdest 65.505872 65.288800 8.626105" -$ns_ at 170.000000 "$node_(4) setdest 84.771789 126.399680 18.136882" -$ns_ at 170.000000 "$node_(5) setdest 194.447590 20.748193 3.256924" -$ns_ at 170.000000 "$node_(6) setdest 284.422089 30.561769 19.996891" -$ns_ at 170.000000 "$node_(7) setdest 336.488392 66.266943 18.348375" -$ns_ at 170.000000 "$node_(8) setdest 322.137911 49.798598 17.820583" -$ns_ at 170.000000 "$node_(9) setdest 325.954317 52.576373 19.995892" -$ns_ at 170.000000 "$node_(10) setdest 329.735957 142.201287 19.999189" - -$ns_ at 171.000000 "$node_(1) setdest 112.977297 87.271027 16.761953" -$ns_ at 171.000000 "$node_(2) setdest 191.611035 136.352639 16.502893" -$ns_ at 171.000000 "$node_(3) setdest 75.600405 63.592078 10.236135" -$ns_ at 171.000000 "$node_(4) setdest 69.325659 114.455881 19.525298" -$ns_ at 171.000000 "$node_(5) setdest 189.626370 20.167736 4.856036" -$ns_ at 171.000000 "$node_(6) setdest 265.427300 36.816797 19.998184" -$ns_ at 171.000000 "$node_(7) setdest 319.125355 75.725898 19.772377" -$ns_ at 171.000000 "$node_(8) setdest 302.740361 50.564467 19.412663" -$ns_ at 171.000000 "$node_(9) setdest 306.097225 50.200000 19.998782" -$ns_ at 171.000000 "$node_(10) setdest 310.324303 137.409564 19.994322" - -$ns_ at 172.000000 "$node_(1) setdest 130.889740 91.652087 18.440426" -$ns_ at 172.000000 "$node_(2) setdest 188.195099 119.984720 16.720568" -$ns_ at 172.000000 "$node_(3) setdest 87.261624 61.566337 11.835863" -$ns_ at 172.000000 "$node_(4) setdest 50.408455 108.069384 19.966171" -$ns_ at 172.000000 "$node_(5) setdest 183.210315 19.462493 6.454698" -$ns_ at 172.000000 "$node_(6) setdest 246.804372 44.105199 19.998357" -$ns_ at 172.000000 "$node_(7) setdest 300.903681 83.960245 19.995847" -$ns_ at 172.000000 "$node_(8) setdest 282.761368 49.802834 19.993506" -$ns_ at 172.000000 "$node_(9) setdest 286.178420 48.427559 19.997508" -$ns_ at 172.000000 "$node_(10) setdest 291.419852 130.900985 19.993495" - -$ns_ at 173.000000 "$node_(1) setdest 150.117221 96.445478 19.815968" -$ns_ at 173.000000 "$node_(2) setdest 186.605797 101.739334 18.314476" -$ns_ at 173.000000 "$node_(3) setdest 100.596739 59.980711 13.429055" -$ns_ at 173.000000 "$node_(4) setdest 30.490170 107.030632 19.945353" -$ns_ at 173.000000 "$node_(5) setdest 175.384564 17.552862 8.055375" -$ns_ at 173.000000 "$node_(6) setdest 228.279753 51.641445 19.998913" -$ns_ at 173.000000 "$node_(7) setdest 282.201859 91.043224 19.998168" -$ns_ at 173.000000 "$node_(8) setdest 263.086759 46.344289 19.976279" -$ns_ at 173.000000 "$node_(9) setdest 266.189461 47.940458 19.994893" -$ns_ at 173.000000 "$node_(10) setdest 273.195059 122.679443 19.993419" - -$ns_ at 174.000000 "$node_(1) setdest 168.902350 103.226473 19.971554" -$ns_ at 174.000000 "$node_(2) setdest 184.513754 82.093305 19.757102" -$ns_ at 174.000000 "$node_(3) setdest 115.623096 60.000922 15.026371" -$ns_ at 174.000000 "$node_(4) setdest 11.378375 105.199769 19.199290" -$ns_ at 174.000000 "$node_(5) setdest 165.905684 15.739495 9.650776" -$ns_ at 174.000000 "$node_(6) setdest 210.524312 60.821660 19.988297" -$ns_ at 174.000000 "$node_(7) setdest 263.237099 97.391304 19.999006" -$ns_ at 174.000000 "$node_(8) setdest 244.452806 39.179900 19.963784" -$ns_ at 174.000000 "$node_(9) setdest 246.259591 49.492870 19.990241" -$ns_ at 174.000000 "$node_(10) setdest 255.875893 112.695630 19.990749" - -$ns_ at 175.000000 "$node_(1) setdest 179.680069 118.492693 18.687341" -$ns_ at 175.000000 "$node_(2) setdest 180.258778 62.740869 19.814682" -$ns_ at 175.000000 "$node_(3) setdest 132.021670 62.570627 16.598693" -$ns_ at 175.000000 "$node_(4) setdest 5.755446 88.484328 17.635853" -$ns_ at 175.000000 "$node_(5) setdest 155.223912 16.670444 10.722262" -$ns_ at 175.000000 "$node_(6) setdest 194.092342 72.196532 19.984929" -$ns_ at 175.000000 "$node_(7) setdest 244.024859 102.944527 19.998711" -$ns_ at 175.000000 "$node_(8) setdest 226.039257 31.479843 19.958700" -$ns_ at 175.000000 "$node_(9) setdest 226.666973 53.441639 19.986582" -$ns_ at 175.000000 "$node_(10) setdest 239.867016 100.730485 19.986216" - -$ns_ at 176.000000 "$node_(1) setdest 178.455056 113.826735 4.824088" -$ns_ at 176.000000 "$node_(2) setdest 170.317497 46.270492 19.238045" -$ns_ at 176.000000 "$node_(3) setdest 148.852278 69.512159 18.205884" -$ns_ at 176.000000 "$node_(4) setdest 7.747696 72.189753 16.415914" -$ns_ at 176.000000 "$node_(5) setdest 155.067960 17.267330 0.616923" -$ns_ at 176.000000 "$node_(6) setdest 179.520253 85.870172 19.982848" -$ns_ at 176.000000 "$node_(7) setdest 224.758061 108.308526 19.999549" -$ns_ at 176.000000 "$node_(8) setdest 206.348654 28.206572 19.960815" -$ns_ at 176.000000 "$node_(9) setdest 207.773501 59.963121 19.987322" -$ns_ at 176.000000 "$node_(10) setdest 225.733708 86.607919 19.979922" - -$ns_ at 177.000000 "$node_(1) setdest 175.246544 108.496016 6.221826" -$ns_ at 177.000000 "$node_(2) setdest 157.726290 31.362125 19.514044" -$ns_ at 177.000000 "$node_(3) setdest 164.683417 81.103727 19.621148" -$ns_ at 177.000000 "$node_(4) setdest 17.513917 60.031501 15.594941" -$ns_ at 177.000000 "$node_(5) setdest 156.535342 17.780235 1.554439" -$ns_ at 177.000000 "$node_(6) setdest 167.122891 101.545865 19.985543" -$ns_ at 177.000000 "$node_(7) setdest 205.299075 112.923724 19.998805" -$ns_ at 177.000000 "$node_(8) setdest 186.493072 30.105946 19.946222" -$ns_ at 177.000000 "$node_(9) setdest 189.928589 68.956396 19.982989" -$ns_ at 177.000000 "$node_(10) setdest 213.261658 71.046403 19.942738" - -$ns_ at 178.000000 "$node_(1) setdest 172.424003 101.197065 7.825690" -$ns_ at 178.000000 "$node_(2) setdest 142.888376 19.133692 19.227539" -$ns_ at 178.000000 "$node_(3) setdest 174.810337 98.211073 19.880034" -$ns_ at 178.000000 "$node_(4) setdest 31.152481 49.569283 17.189195" -$ns_ at 178.000000 "$node_(5) setdest 159.699097 18.019297 3.172774" -$ns_ at 178.000000 "$node_(6) setdest 157.052647 118.802745 19.980234" -$ns_ at 178.000000 "$node_(7) setdest 185.768249 117.229326 19.999784" -$ns_ at 178.000000 "$node_(8) setdest 167.818405 37.111714 19.945525" -$ns_ at 178.000000 "$node_(9) setdest 173.871013 80.833808 19.972948" -$ns_ at 178.000000 "$node_(10) setdest 196.419365 70.738967 16.845098" - -$ns_ at 179.000000 "$node_(1) setdest 170.753363 91.918408 9.427858" -$ns_ at 179.000000 "$node_(2) setdest 125.010723 12.749372 18.983414" -$ns_ at 179.000000 "$node_(3) setdest 181.874760 116.920836 19.999033" -$ns_ at 179.000000 "$node_(4) setdest 46.551054 38.789818 18.796620" -$ns_ at 179.000000 "$node_(5) setdest 163.906434 16.048997 4.645834" -$ns_ at 179.000000 "$node_(6) setdest 150.159618 137.551322 19.975559" -$ns_ at 179.000000 "$node_(7) setdest 166.344084 121.993628 19.999919" -$ns_ at 179.000000 "$node_(8) setdest 150.738069 47.480338 19.981147" -$ns_ at 179.000000 "$node_(9) setdest 160.581359 95.722920 19.957469" -$ns_ at 179.000000 "$node_(10) setdest 195.672687 84.091040 13.372934" - -$ns_ at 180.000000 "$node_(1) setdest 170.379290 80.898702 11.026053" -$ns_ at 180.000000 "$node_(2) setdest 106.108663 11.307135 18.957001" -$ns_ at 180.000000 "$node_(3) setdest 186.831517 136.224536 19.929934" -$ns_ at 180.000000 "$node_(4) setdest 63.824239 28.948857 19.879825" -$ns_ at 180.000000 "$node_(5) setdest 169.419179 13.556525 6.050023" -$ns_ at 180.000000 "$node_(6) setdest 147.828308 157.269197 19.855216" -$ns_ at 180.000000 "$node_(7) setdest 147.059157 127.267473 19.993046" -$ns_ at 180.000000 "$node_(8) setdest 134.966214 59.765581 19.991963" -$ns_ at 180.000000 "$node_(9) setdest 151.747848 113.601200 19.941509" -$ns_ at 180.000000 "$node_(10) setdest 189.493134 92.502152 10.437130" - -$ns_ at 181.000000 "$node_(1) setdest 171.163052 68.288192 12.634842" -$ns_ at 181.000000 "$node_(2) setdest 91.123305 20.053465 17.351060" -$ns_ at 181.000000 "$node_(3) setdest 188.637831 156.141046 19.998253" -$ns_ at 181.000000 "$node_(4) setdest 82.685943 28.747684 18.862777" -$ns_ at 181.000000 "$node_(5) setdest 172.747269 19.290485 6.629817" -$ns_ at 181.000000 "$node_(6) setdest 160.476531 170.330272 18.181563" -$ns_ at 181.000000 "$node_(7) setdest 128.509912 134.706388 19.985292" -$ns_ at 181.000000 "$node_(8) setdest 117.253969 68.951910 19.952752" -$ns_ at 181.000000 "$node_(9) setdest 145.153561 132.482364 19.999575" -$ns_ at 181.000000 "$node_(10) setdest 178.683836 98.024600 12.138302" - -$ns_ at 182.000000 "$node_(1) setdest 172.888706 54.198358 14.195116" -$ns_ at 182.000000 "$node_(2) setdest 83.890009 35.949121 17.464032" -$ns_ at 182.000000 "$node_(3) setdest 190.094980 176.021799 19.934083" -$ns_ at 182.000000 "$node_(4) setdest 96.855632 39.340425 17.691417" -$ns_ at 182.000000 "$node_(5) setdest 173.027925 27.952089 8.666149" -$ns_ at 182.000000 "$node_(6) setdest 177.244737 175.603016 17.577672" -$ns_ at 182.000000 "$node_(7) setdest 111.416146 145.032855 19.970798" -$ns_ at 182.000000 "$node_(8) setdest 97.650034 72.426294 19.909435" -$ns_ at 182.000000 "$node_(9) setdest 139.260466 151.590578 19.996310" -$ns_ at 182.000000 "$node_(10) setdest 167.962697 106.536181 13.689040" - -$ns_ at 183.000000 "$node_(1) setdest 180.428826 40.405392 15.719393" -$ns_ at 183.000000 "$node_(2) setdest 80.665629 54.207418 18.540821" -$ns_ at 183.000000 "$node_(3) setdest 196.076606 187.662698 13.087794" -$ns_ at 183.000000 "$node_(4) setdest 113.096835 43.407822 16.742771" -$ns_ at 183.000000 "$node_(5) setdest 175.004921 38.052270 10.291850" -$ns_ at 183.000000 "$node_(6) setdest 192.567746 173.044954 15.535067" -$ns_ at 183.000000 "$node_(7) setdest 94.933105 156.301721 19.966922" -$ns_ at 183.000000 "$node_(8) setdest 78.202415 68.303846 19.879749" -$ns_ at 183.000000 "$node_(9) setdest 128.466810 168.153105 19.769176" -$ns_ at 183.000000 "$node_(10) setdest 155.692441 115.659456 15.290302" - -$ns_ at 184.000000 "$node_(1) setdest 194.682139 32.290056 16.401695" -$ns_ at 184.000000 "$node_(2) setdest 71.721236 70.341996 18.447948" -$ns_ at 184.000000 "$node_(3) setdest 195.005636 184.210017 3.614967" -$ns_ at 184.000000 "$node_(4) setdest 131.373418 43.329977 18.276749" -$ns_ at 184.000000 "$node_(5) setdest 177.681189 49.641032 11.893773" -$ns_ at 184.000000 "$node_(6) setdest 192.538130 172.725928 0.320398" -$ns_ at 184.000000 "$node_(7) setdest 76.208559 163.180223 19.947993" -$ns_ at 184.000000 "$node_(8) setdest 59.386392 61.528995 19.998534" -$ns_ at 184.000000 "$node_(9) setdest 119.659162 170.816167 9.201443" -$ns_ at 184.000000 "$node_(10) setdest 139.468774 119.990598 16.791848" - -$ns_ at 185.000000 "$node_(1) setdest 195.613467 33.069178 1.214250" -$ns_ at 185.000000 "$node_(2) setdest 72.027737 89.787372 19.447792" -$ns_ at 185.000000 "$node_(3) setdest 194.672645 188.582756 4.385400" -$ns_ at 185.000000 "$node_(4) setdest 134.492679 47.692958 5.363338" -$ns_ at 185.000000 "$node_(5) setdest 173.964993 62.431439 13.319333" -$ns_ at 185.000000 "$node_(6) setdest 191.099665 172.527656 1.452065" -$ns_ at 185.000000 "$node_(7) setdest 56.380453 165.404161 19.952436" -$ns_ at 185.000000 "$node_(8) setdest 40.804330 54.137082 19.998335" -$ns_ at 185.000000 "$node_(9) setdest 119.805941 169.859912 0.967454" -$ns_ at 185.000000 "$node_(10) setdest 121.371407 116.477413 18.435216" - -$ns_ at 186.000000 "$node_(1) setdest 195.523460 35.547228 2.479684" -$ns_ at 186.000000 "$node_(2) setdest 72.860222 109.769952 19.999913" -$ns_ at 186.000000 "$node_(3) setdest 193.465576 194.532746 6.071194" -$ns_ at 186.000000 "$node_(4) setdest 134.472696 54.482129 6.789201" -$ns_ at 186.000000 "$node_(5) setdest 169.445995 76.675295 14.943519" -$ns_ at 186.000000 "$node_(6) setdest 188.017704 172.548818 3.082034" -$ns_ at 186.000000 "$node_(7) setdest 36.936529 161.362410 19.859555" -$ns_ at 186.000000 "$node_(8) setdest 21.592497 48.640305 19.982719" -$ns_ at 186.000000 "$node_(9) setdest 120.575903 167.393762 2.583551" -$ns_ at 186.000000 "$node_(10) setdest 104.372214 106.231584 19.848162" - -$ns_ at 187.000000 "$node_(1) setdest 195.465659 39.626432 4.079614" -$ns_ at 187.000000 "$node_(2) setdest 73.033876 129.767033 19.997835" -$ns_ at 187.000000 "$node_(3) setdest 192.328990 202.117959 7.669894" -$ns_ at 187.000000 "$node_(4) setdest 134.718626 62.867220 8.388696" -$ns_ at 187.000000 "$node_(5) setdest 165.002660 92.609977 16.542591" -$ns_ at 187.000000 "$node_(6) setdest 183.363363 172.076516 4.678243" -$ns_ at 187.000000 "$node_(7) setdest 27.040671 147.302132 17.193587" -$ns_ at 187.000000 "$node_(8) setdest 15.086590 34.481154 15.582310" -$ns_ at 187.000000 "$node_(9) setdest 122.262624 163.566603 4.182365" -$ns_ at 187.000000 "$node_(10) setdest 87.019330 96.377428 19.955625" - -$ns_ at 188.000000 "$node_(1) setdest 195.493442 45.306014 5.679650" -$ns_ at 188.000000 "$node_(2) setdest 72.088632 149.742168 19.997487" -$ns_ at 188.000000 "$node_(3) setdest 191.694603 211.364885 9.268662" -$ns_ at 188.000000 "$node_(4) setdest 135.397225 72.832879 9.988737" -$ns_ at 188.000000 "$node_(5) setdest 160.860419 110.273346 18.142567" -$ns_ at 188.000000 "$node_(6) setdest 177.331385 170.366266 6.269746" -$ns_ at 188.000000 "$node_(7) setdest 33.339932 142.144690 8.141247" -$ns_ at 188.000000 "$node_(8) setdest 25.950932 28.357513 12.471284" -$ns_ at 188.000000 "$node_(9) setdest 125.574753 158.840877 5.770848" -$ns_ at 188.000000 "$node_(10) setdest 73.723879 81.531864 19.928868" - -$ns_ at 189.000000 "$node_(1) setdest 195.501926 52.585695 7.279686" -$ns_ at 189.000000 "$node_(2) setdest 70.118723 169.643281 19.998371" -$ns_ at 189.000000 "$node_(3) setdest 191.784503 222.234607 10.870094" -$ns_ at 189.000000 "$node_(4) setdest 136.587465 84.360558 11.588963" -$ns_ at 189.000000 "$node_(5) setdest 157.134792 129.574013 19.656960" -$ns_ at 189.000000 "$node_(6) setdest 170.511875 166.445811 7.866110" -$ns_ at 189.000000 "$node_(7) setdest 42.075135 137.545000 9.872230" -$ns_ at 189.000000 "$node_(8) setdest 39.756298 24.207709 14.415582" -$ns_ at 189.000000 "$node_(9) setdest 131.266657 154.174797 7.360033" -$ns_ at 189.000000 "$node_(10) setdest 62.437001 65.038639 19.985497" - -$ns_ at 190.000000 "$node_(1) setdest 195.416493 61.464644 8.879359" -$ns_ at 190.000000 "$node_(2) setdest 67.278825 189.439428 19.998811" -$ns_ at 190.000000 "$node_(3) setdest 192.074302 234.702462 12.471222" -$ns_ at 190.000000 "$node_(4) setdest 138.172614 97.454006 13.189051" -$ns_ at 190.000000 "$node_(5) setdest 154.020435 149.328771 19.998742" -$ns_ at 190.000000 "$node_(6) setdest 163.520779 160.060724 9.468092" -$ns_ at 190.000000 "$node_(7) setdest 51.690561 131.290754 11.470484" -$ns_ at 190.000000 "$node_(8) setdest 55.087819 19.437284 16.056541" -$ns_ at 190.000000 "$node_(9) setdest 139.311546 150.191848 8.976865" -$ns_ at 190.000000 "$node_(10) setdest 59.419189 45.948052 19.327640" - -$ns_ at 191.000000 "$node_(1) setdest 195.032236 71.937101 10.479504" -$ns_ at 191.000000 "$node_(2) setdest 63.774126 209.129366 19.999414" -$ns_ at 191.000000 "$node_(3) setdest 192.134525 248.773197 14.070864" -$ns_ at 191.000000 "$node_(4) setdest 140.151210 112.110209 14.789156" -$ns_ at 191.000000 "$node_(5) setdest 151.528492 169.172266 19.999351" -$ns_ at 191.000000 "$node_(6) setdest 156.653106 151.371539 11.075507" -$ns_ at 191.000000 "$node_(7) setdest 61.020362 122.160481 13.054006" -$ns_ at 191.000000 "$node_(8) setdest 72.246356 15.431568 17.619908" -$ns_ at 191.000000 "$node_(9) setdest 149.037901 146.020315 10.583179" -$ns_ at 191.000000 "$node_(10) setdest 62.233515 26.981985 19.173735" - -$ns_ at 192.000000 "$node_(1) setdest 194.328858 83.995651 12.079047" -$ns_ at 192.000000 "$node_(2) setdest 60.068139 228.782066 19.999074" -$ns_ at 192.000000 "$node_(3) setdest 191.210367 264.413225 15.667308" -$ns_ at 192.000000 "$node_(4) setdest 142.034412 128.390629 16.388976" -$ns_ at 192.000000 "$node_(5) setdest 149.209226 189.037194 19.999859" -$ns_ at 192.000000 "$node_(6) setdest 149.885588 140.648727 12.679826" -$ns_ at 192.000000 "$node_(7) setdest 70.178665 110.699923 14.670341" -$ns_ at 192.000000 "$node_(8) setdest 91.480263 14.579377 19.252776" -$ns_ at 192.000000 "$node_(9) setdest 160.621424 145.650484 11.589425" -$ns_ at 192.000000 "$node_(10) setdest 71.531198 10.851366 18.618372" - -$ns_ at 193.000000 "$node_(1) setdest 193.150556 97.624358 13.679549" -$ns_ at 193.000000 "$node_(2) setdest 56.962041 248.539067 19.999673" -$ns_ at 193.000000 "$node_(3) setdest 188.728422 281.499973 17.266065" -$ns_ at 193.000000 "$node_(4) setdest 143.661611 146.305417 17.988535" -$ns_ at 193.000000 "$node_(5) setdest 146.639128 208.871240 19.999870" -$ns_ at 193.000000 "$node_(6) setdest 141.678111 128.965386 14.278065" -$ns_ at 193.000000 "$node_(7) setdest 77.526460 96.240451 16.219323" -$ns_ at 193.000000 "$node_(8) setdest 111.285642 11.901841 19.985551" -$ns_ at 193.000000 "$node_(9) setdest 162.320582 151.191100 5.795306" -$ns_ at 193.000000 "$node_(10) setdest 69.434904 14.512209 4.218556" - -$ns_ at 194.000000 "$node_(1) setdest 191.331293 112.793988 15.278331" -$ns_ at 194.000000 "$node_(2) setdest 54.045499 268.325206 19.999938" -$ns_ at 194.000000 "$node_(3) setdest 184.809887 299.958796 18.870163" -$ns_ at 194.000000 "$node_(4) setdest 144.576980 165.824228 19.540263" -$ns_ at 194.000000 "$node_(5) setdest 143.541952 228.628802 19.998844" -$ns_ at 194.000000 "$node_(6) setdest 132.011405 116.363647 15.882350" -$ns_ at 194.000000 "$node_(7) setdest 81.390315 78.832201 17.831897" -$ns_ at 194.000000 "$node_(8) setdest 130.995388 8.526521 19.996672" -$ns_ at 194.000000 "$node_(9) setdest 158.304055 156.109234 6.349844" -$ns_ at 194.000000 "$node_(10) setdest 64.357297 23.822765 10.605120" - -$ns_ at 195.000000 "$node_(1) setdest 188.282059 129.392447 16.876216" -$ns_ at 195.000000 "$node_(2) setdest 51.150472 288.114471 19.999904" -$ns_ at 195.000000 "$node_(3) setdest 179.637007 319.243200 19.966145" -$ns_ at 195.000000 "$node_(4) setdest 144.982177 185.819869 19.999746" -$ns_ at 195.000000 "$node_(5) setdest 139.870629 248.288518 19.999576" -$ns_ at 195.000000 "$node_(6) setdest 122.921583 101.453520 17.462438" -$ns_ at 195.000000 "$node_(7) setdest 80.824768 59.414565 19.425870" -$ns_ at 195.000000 "$node_(8) setdest 150.685052 6.112369 19.837111" -$ns_ at 195.000000 "$node_(9) setdest 153.669623 162.564787 7.946831" -$ns_ at 195.000000 "$node_(10) setdest 62.963882 36.031903 12.288395" - -$ns_ at 196.000000 "$node_(1) setdest 183.957321 147.358510 18.479253" -$ns_ at 196.000000 "$node_(2) setdest 48.611087 307.952411 19.999809" -$ns_ at 196.000000 "$node_(3) setdest 172.922634 338.070779 19.989011" -$ns_ at 196.000000 "$node_(4) setdest 145.105736 205.819344 19.999857" -$ns_ at 196.000000 "$node_(5) setdest 135.716006 267.851495 19.999273" -$ns_ at 196.000000 "$node_(6) setdest 114.965812 84.111046 19.080244" -$ns_ at 196.000000 "$node_(7) setdest 77.199943 39.771797 19.974427" -$ns_ at 196.000000 "$node_(8) setdest 170.172454 10.569598 19.990641" -$ns_ at 196.000000 "$node_(9) setdest 146.820750 169.209669 9.542616" -$ns_ at 196.000000 "$node_(10) setdest 65.562221 49.704614 13.917413" - -$ns_ at 197.000000 "$node_(1) setdest 179.424231 166.672897 19.839215" -$ns_ at 197.000000 "$node_(2) setdest 46.811525 327.868842 19.997566" -$ns_ at 197.000000 "$node_(3) setdest 163.939414 355.929108 19.990452" -$ns_ at 197.000000 "$node_(4) setdest 145.006109 225.818471 19.999375" -$ns_ at 197.000000 "$node_(5) setdest 130.662166 287.197475 19.995206" -$ns_ at 197.000000 "$node_(6) setdest 106.357417 66.062345 19.996501" -$ns_ at 197.000000 "$node_(7) setdest 75.946021 20.181201 19.630684" -$ns_ at 197.000000 "$node_(8) setdest 188.099728 18.417830 19.569923" -$ns_ at 197.000000 "$node_(9) setdest 138.645810 176.738594 11.113701" -$ns_ at 197.000000 "$node_(10) setdest 71.277978 64.136289 15.522342" - -$ns_ at 198.000000 "$node_(1) setdest 175.356307 186.254820 19.999992" -$ns_ at 198.000000 "$node_(2) setdest 45.427324 347.820835 19.999951" -$ns_ at 198.000000 "$node_(3) setdest 152.416252 372.246071 19.975649" -$ns_ at 198.000000 "$node_(4) setdest 143.832197 245.780166 19.996183" -$ns_ at 198.000000 "$node_(5) setdest 123.549176 305.874927 19.986041" -$ns_ at 198.000000 "$node_(6) setdest 95.007893 49.716550 19.899666" -$ns_ at 198.000000 "$node_(7) setdest 89.910882 8.256505 18.363434" -$ns_ at 198.000000 "$node_(8) setdest 186.767229 35.321285 16.955895" -$ns_ at 198.000000 "$node_(9) setdest 140.360459 185.666801 9.091364" -$ns_ at 198.000000 "$node_(10) setdest 79.585340 79.054188 17.075010" - -$ns_ at 199.000000 "$node_(1) setdest 171.310371 205.841290 19.999985" -$ns_ at 199.000000 "$node_(2) setdest 45.246485 367.808943 19.988926" -$ns_ at 199.000000 "$node_(3) setdest 141.026187 379.353825 13.425861" -$ns_ at 199.000000 "$node_(4) setdest 141.471649 265.638334 19.997976" -$ns_ at 199.000000 "$node_(5) setdest 113.615585 323.205618 19.975712" -$ns_ at 199.000000 "$node_(6) setdest 77.769915 49.534854 17.238935" -$ns_ at 199.000000 "$node_(7) setdest 106.824065 10.366785 17.044326" -$ns_ at 199.000000 "$node_(8) setdest 175.640526 47.155431 16.243476" -$ns_ at 199.000000 "$node_(9) setdest 145.881782 184.022631 5.760929" -$ns_ at 199.000000 "$node_(10) setdest 88.755604 95.337817 18.688240" - -$ns_ at 200.000000 "$node_(1) setdest 167.224719 225.419522 19.999993" -$ns_ at 200.000000 "$node_(2) setdest 49.050666 387.354600 19.912420" -$ns_ at 200.000000 "$node_(3) setdest 144.119591 377.312601 3.706177" -$ns_ at 200.000000 "$node_(4) setdest 138.256986 285.377161 19.998884" -$ns_ at 200.000000 "$node_(5) setdest 100.527566 338.285629 19.967548" -$ns_ at 200.000000 "$node_(6) setdest 72.091162 65.514596 16.958785" -$ns_ at 200.000000 "$node_(7) setdest 122.081158 16.304017 16.371610" -$ns_ at 200.000000 "$node_(8) setdest 160.926667 51.839992 15.441592" -$ns_ at 200.000000 "$node_(9) setdest 149.142428 177.126205 7.628401" -$ns_ at 200.000000 "$node_(10) setdest 99.613365 111.937528 19.835356" - -$ns_ at 201.000000 "$node_(1) setdest 163.241486 245.018750 19.999897" -$ns_ at 201.000000 "$node_(2) setdest 61.654558 402.610167 19.788644" -$ns_ at 201.000000 "$node_(3) setdest 149.076068 375.294812 5.351461" -$ns_ at 201.000000 "$node_(4) setdest 134.200711 304.958942 19.997488" -$ns_ at 201.000000 "$node_(5) setdest 84.538504 350.240382 19.964123" -$ns_ at 201.000000 "$node_(6) setdest 67.136324 80.376662 15.666251" -$ns_ at 201.000000 "$node_(7) setdest 139.717702 18.648063 17.791633" -$ns_ at 201.000000 "$node_(8) setdest 145.832431 59.287246 16.831446" -$ns_ at 201.000000 "$node_(9) setdest 152.552155 168.551362 9.227902" -$ns_ at 201.000000 "$node_(10) setdest 117.014782 121.404332 19.809839" - -$ns_ at 202.000000 "$node_(1) setdest 159.391115 264.644218 19.999609" -$ns_ at 202.000000 "$node_(2) setdest 78.236392 413.777419 19.991617" -$ns_ at 202.000000 "$node_(3) setdest 155.820516 373.560161 6.963950" -$ns_ at 202.000000 "$node_(4) setdest 129.372934 324.366691 19.999203" -$ns_ at 202.000000 "$node_(5) setdest 66.671342 359.206049 19.990464" -$ns_ at 202.000000 "$node_(6) setdest 59.005599 94.783951 16.543236" -$ns_ at 202.000000 "$node_(7) setdest 158.694781 17.342255 19.021952" -$ns_ at 202.000000 "$node_(8) setdest 128.180124 62.164422 17.885247" -$ns_ at 202.000000 "$node_(9) setdest 155.239978 158.052038 10.837906" -$ns_ at 202.000000 "$node_(10) setdest 136.907991 122.875448 19.947530" - -$ns_ at 203.000000 "$node_(1) setdest 156.090421 284.369430 19.999465" -$ns_ at 203.000000 "$node_(2) setdest 95.064626 424.526948 19.968521" -$ns_ at 203.000000 "$node_(3) setdest 163.970693 371.055823 8.526259" -$ns_ at 203.000000 "$node_(4) setdest 123.550868 343.497632 19.997233" -$ns_ at 203.000000 "$node_(5) setdest 47.626658 365.068247 19.926499" -$ns_ at 203.000000 "$node_(6) setdest 44.129184 104.390756 17.708711" -$ns_ at 203.000000 "$node_(7) setdest 173.699979 7.360376 18.022038" -$ns_ at 203.000000 "$node_(8) setdest 113.299302 53.211896 17.366248" -$ns_ at 203.000000 "$node_(9) setdest 158.404079 146.023580 12.437658" -$ns_ at 203.000000 "$node_(10) setdest 156.369232 118.860713 19.871034" - -$ns_ at 204.000000 "$node_(1) setdest 153.023861 304.132837 19.999901" -$ns_ at 204.000000 "$node_(2) setdest 111.823384 435.393263 19.973301" -$ns_ at 204.000000 "$node_(3) setdest 169.826488 362.901841 10.038813" -$ns_ at 204.000000 "$node_(4) setdest 116.289633 362.124419 19.992067" -$ns_ at 204.000000 "$node_(5) setdest 28.522161 370.489417 19.858773" -$ns_ at 204.000000 "$node_(6) setdest 27.051512 112.644070 18.967447" -$ns_ at 204.000000 "$node_(7) setdest 180.486356 8.534284 6.887160" -$ns_ at 204.000000 "$node_(8) setdest 98.103987 42.322359 18.694375" -$ns_ at 204.000000 "$node_(9) setdest 161.029362 132.243002 14.028416" -$ns_ at 204.000000 "$node_(10) setdest 172.443816 107.486758 19.691600" - -$ns_ at 205.000000 "$node_(1) setdest 149.277393 323.777154 19.998380" -$ns_ at 205.000000 "$node_(2) setdest 129.394110 444.945228 19.999261" -$ns_ at 205.000000 "$node_(3) setdest 168.110917 364.353857 2.247562" -$ns_ at 205.000000 "$node_(4) setdest 106.734376 379.674290 19.982515" -$ns_ at 205.000000 "$node_(5) setdest 24.594624 377.857992 8.349937" -$ns_ at 205.000000 "$node_(6) setdest 9.174780 116.138563 18.215078" -$ns_ at 205.000000 "$node_(7) setdest 181.039157 13.299606 4.797278" -$ns_ at 205.000000 "$node_(8) setdest 82.787587 30.297708 19.472656" -$ns_ at 205.000000 "$node_(9) setdest 162.200630 116.656242 15.630705" -$ns_ at 205.000000 "$node_(10) setdest 181.116590 90.598550 18.984958" - -$ns_ at 206.000000 "$node_(1) setdest 144.598638 343.219337 19.997231" -$ns_ at 206.000000 "$node_(2) setdest 147.113812 454.211788 19.996424" -$ns_ at 206.000000 "$node_(3) setdest 161.975039 369.257123 7.854363" -$ns_ at 206.000000 "$node_(4) setdest 94.731875 395.657510 19.988080" -$ns_ at 206.000000 "$node_(5) setdest 28.110519 380.700946 4.521493" -$ns_ at 206.000000 "$node_(6) setdest 5.389523 111.880557 5.697261" -$ns_ at 206.000000 "$node_(7) setdest 182.643028 19.505356 6.409660" -$ns_ at 206.000000 "$node_(8) setdest 66.703839 19.152674 19.567798" -$ns_ at 206.000000 "$node_(9) setdest 163.096529 99.441502 17.238037" -$ns_ at 206.000000 "$node_(10) setdest 185.879217 71.902868 19.292773" - -$ns_ at 207.000000 "$node_(1) setdest 138.750622 362.341225 19.996146" -$ns_ at 207.000000 "$node_(2) setdest 163.876030 465.070012 19.971805" -$ns_ at 207.000000 "$node_(3) setdest 153.481555 373.421602 9.459501" -$ns_ at 207.000000 "$node_(4) setdest 81.367103 410.535184 19.999058" -$ns_ at 207.000000 "$node_(5) setdest 33.182405 384.121656 6.117622" -$ns_ at 207.000000 "$node_(6) setdest 7.670427 109.002037 3.672656" -$ns_ at 207.000000 "$node_(7) setdest 183.240979 27.459965 7.977052" -$ns_ at 207.000000 "$node_(8) setdest 48.471800 15.353912 18.623584" -$ns_ at 207.000000 "$node_(9) setdest 164.150679 80.632580 18.838438" -$ns_ at 207.000000 "$node_(10) setdest 185.014933 52.993766 18.928844" - -$ns_ at 208.000000 "$node_(1) setdest 131.154711 380.829290 19.987657" -$ns_ at 208.000000 "$node_(2) setdest 180.272876 476.520635 19.999333" -$ns_ at 208.000000 "$node_(3) setdest 143.368479 377.932962 11.073692" -$ns_ at 208.000000 "$node_(4) setdest 69.391507 426.525693 19.977769" -$ns_ at 208.000000 "$node_(5) setdest 39.946435 387.849275 7.723163" -$ns_ at 208.000000 "$node_(6) setdest 10.931499 104.858445 5.272945" -$ns_ at 208.000000 "$node_(7) setdest 180.816137 36.719425 9.571701" -$ns_ at 208.000000 "$node_(8) setdest 30.381523 9.369616 19.054393" -$ns_ at 208.000000 "$node_(9) setdest 164.385587 60.684667 19.949297" -$ns_ at 208.000000 "$node_(10) setdest 174.507313 38.662418 17.770695" - -$ns_ at 209.000000 "$node_(1) setdest 121.092963 398.095887 19.984348" -$ns_ at 209.000000 "$node_(2) setdest 189.211708 490.664051 16.731375" -$ns_ at 209.000000 "$node_(3) setdest 131.945788 383.417256 12.671044" -$ns_ at 209.000000 "$node_(4) setdest 59.975120 444.153298 19.985015" -$ns_ at 209.000000 "$node_(5) setdest 48.328073 391.937141 9.325369" -$ns_ at 209.000000 "$node_(6) setdest 14.411675 98.942625 6.863568" -$ns_ at 209.000000 "$node_(7) setdest 175.728098 46.705469 11.207551" -$ns_ at 209.000000 "$node_(8) setdest 12.204122 7.859309 18.240037" -$ns_ at 209.000000 "$node_(9) setdest 159.026552 41.578356 19.843648" -$ns_ at 209.000000 "$node_(10) setdest 163.369819 23.521448 18.796083" - -$ns_ at 210.000000 "$node_(1) setdest 108.982057 413.993854 19.985480" -$ns_ at 210.000000 "$node_(2) setdest 180.764820 496.526252 10.281795" -$ns_ at 210.000000 "$node_(3) setdest 119.741871 390.808564 14.267692" -$ns_ at 210.000000 "$node_(4) setdest 53.047125 462.900705 19.986555" -$ns_ at 210.000000 "$node_(5) setdest 57.929229 397.148381 10.924249" -$ns_ at 210.000000 "$node_(6) setdest 16.629371 90.783736 8.454918" -$ns_ at 210.000000 "$node_(7) setdest 170.109979 58.216735 12.809079" -$ns_ at 210.000000 "$node_(8) setdest 7.612919 9.823576 4.993745" -$ns_ at 210.000000 "$node_(9) setdest 144.943214 27.647777 19.809125" -$ns_ at 210.000000 "$node_(10) setdest 151.654646 8.351943 19.166615" - -$ns_ at 211.000000 "$node_(1) setdest 94.765433 428.045068 19.988722" -$ns_ at 211.000000 "$node_(2) setdest 169.488840 501.292361 12.241876" -$ns_ at 211.000000 "$node_(3) setdest 106.907423 400.126968 15.860507" -$ns_ at 211.000000 "$node_(4) setdest 49.262673 482.502882 19.964153" -$ns_ at 211.000000 "$node_(5) setdest 68.775716 403.409497 12.523891" -$ns_ at 211.000000 "$node_(6) setdest 18.101119 80.820271 10.071578" -$ns_ at 211.000000 "$node_(7) setdest 164.220636 71.367090 14.408894" -$ns_ at 211.000000 "$node_(8) setdest 8.398181 10.582628 1.092152" -$ns_ at 211.000000 "$node_(9) setdest 126.252440 20.979851 19.844553" -$ns_ at 211.000000 "$node_(10) setdest 150.671362 7.925031 1.071962" - -$ns_ at 212.000000 "$node_(1) setdest 79.694798 440.482197 19.539862" -$ns_ at 212.000000 "$node_(2) setdest 158.086396 509.199851 13.876027" -$ns_ at 212.000000 "$node_(3) setdest 93.891593 411.784206 17.472923" -$ns_ at 212.000000 "$node_(4) setdest 51.602803 502.238394 19.873768" -$ns_ at 212.000000 "$node_(5) setdest 79.786377 412.225707 14.105326" -$ns_ at 212.000000 "$node_(6) setdest 18.082994 69.169270 11.651015" -$ns_ at 212.000000 "$node_(7) setdest 156.452151 85.357032 16.002119" -$ns_ at 212.000000 "$node_(8) setdest 10.252534 12.543807 2.699046" -$ns_ at 212.000000 "$node_(9) setdest 106.444082 18.349570 19.982227" -$ns_ at 212.000000 "$node_(10) setdest 150.561643 9.241322 1.320856" - -$ns_ at 213.000000 "$node_(1) setdest 74.331248 439.156532 5.524948" -$ns_ at 213.000000 "$node_(2) setdest 147.109484 520.059714 15.441154" -$ns_ at 213.000000 "$node_(3) setdest 78.802986 423.444845 19.069257" -$ns_ at 213.000000 "$node_(4) setdest 64.714464 515.886813 18.926040" -$ns_ at 213.000000 "$node_(5) setdest 90.367257 423.848581 15.717704" -$ns_ at 213.000000 "$node_(6) setdest 15.231940 56.211466 13.267750" -$ns_ at 213.000000 "$node_(7) setdest 146.294162 99.736602 17.605590" -$ns_ at 213.000000 "$node_(8) setdest 12.764348 16.030199 4.296992" -$ns_ at 213.000000 "$node_(9) setdest 87.094251 13.355646 19.983875" -$ns_ at 213.000000 "$node_(10) setdest 150.265932 12.167440 2.941022" - -$ns_ at 214.000000 "$node_(1) setdest 75.387413 435.963971 3.362726" -$ns_ at 214.000000 "$node_(2) setdest 134.637490 531.303365 16.791972" -$ns_ at 214.000000 "$node_(3) setdest 63.111503 435.821747 19.985253" -$ns_ at 214.000000 "$node_(4) setdest 82.741655 517.689625 18.117113" -$ns_ at 214.000000 "$node_(5) setdest 100.190863 438.094362 17.304495" -$ns_ at 214.000000 "$node_(6) setdest 11.435316 41.831751 14.872477" -$ns_ at 214.000000 "$node_(7) setdest 134.405054 114.825240 19.209838" -$ns_ at 214.000000 "$node_(8) setdest 15.786921 21.097420 5.900227" -$ns_ at 214.000000 "$node_(9) setdest 67.206233 11.386313 19.985283" -$ns_ at 214.000000 "$node_(10) setdest 150.233247 16.709509 4.542186" - -$ns_ at 215.000000 "$node_(1) setdest 78.105600 431.749429 5.015068" -$ns_ at 215.000000 "$node_(2) setdest 119.211728 527.255675 15.947976" -$ns_ at 215.000000 "$node_(3) setdest 48.423135 449.394750 19.999364" -$ns_ at 215.000000 "$node_(4) setdest 100.521552 517.808971 17.780297" -$ns_ at 215.000000 "$node_(5) setdest 109.423660 454.614792 18.925357" -$ns_ at 215.000000 "$node_(6) setdest 16.762073 29.826767 13.133696" -$ns_ at 215.000000 "$node_(7) setdest 121.638439 130.219167 19.998986" -$ns_ at 215.000000 "$node_(8) setdest 20.223833 27.143327 7.499279" -$ns_ at 215.000000 "$node_(9) setdest 47.635785 14.277190 19.782811" -$ns_ at 215.000000 "$node_(10) setdest 149.981298 22.846536 6.142197" - -$ns_ at 216.000000 "$node_(1) setdest 82.316111 426.647880 6.614696" -$ns_ at 216.000000 "$node_(2) setdest 110.714063 514.069971 15.686717" -$ns_ at 216.000000 "$node_(3) setdest 34.234170 463.437881 19.963373" -$ns_ at 216.000000 "$node_(4) setdest 119.756878 518.623367 19.252559" -$ns_ at 216.000000 "$node_(5) setdest 118.021417 472.643823 19.974168" -$ns_ at 216.000000 "$node_(6) setdest 24.439905 33.577223 8.544883" -$ns_ at 216.000000 "$node_(7) setdest 109.264356 145.928934 19.997868" -$ns_ at 216.000000 "$node_(8) setdest 26.436807 33.784570 9.094347" -$ns_ at 216.000000 "$node_(9) setdest 34.763093 28.005283 18.819318" -$ns_ at 216.000000 "$node_(10) setdest 149.466985 30.571752 7.742318" - -$ns_ at 217.000000 "$node_(1) setdest 87.966643 420.681429 8.217484" -$ns_ at 217.000000 "$node_(2) setdest 106.139891 497.477479 17.211446" -$ns_ at 217.000000 "$node_(3) setdest 24.871837 481.006527 19.907551" -$ns_ at 217.000000 "$node_(4) setdest 139.198045 521.043816 19.591262" -$ns_ at 217.000000 "$node_(5) setdest 125.144910 491.320562 19.989115" -$ns_ at 217.000000 "$node_(6) setdest 29.906717 42.714611 10.647906" -$ns_ at 217.000000 "$node_(7) setdest 95.624683 160.464758 19.933160" -$ns_ at 217.000000 "$node_(8) setdest 35.012079 40.154365 10.682209" -$ns_ at 217.000000 "$node_(9) setdest 26.794592 44.498695 18.317469" -$ns_ at 217.000000 "$node_(10) setdest 148.822317 39.891733 9.342250" - -$ns_ at 218.000000 "$node_(1) setdest 95.567803 414.482141 9.808608" -$ns_ at 218.000000 "$node_(2) setdest 101.751650 479.151427 18.844119" -$ns_ at 218.000000 "$node_(3) setdest 21.772410 500.718610 19.954264" -$ns_ at 218.000000 "$node_(4) setdest 156.440799 529.170085 19.061711" -$ns_ at 218.000000 "$node_(5) setdest 136.804828 507.434328 19.889875" -$ns_ at 218.000000 "$node_(6) setdest 34.936287 53.901566 12.265583" -$ns_ at 218.000000 "$node_(7) setdest 77.559907 162.800620 18.215168" -$ns_ at 218.000000 "$node_(8) setdest 46.265277 45.048070 12.271219" -$ns_ at 218.000000 "$node_(9) setdest 18.369496 61.553834 19.022618" -$ns_ at 218.000000 "$node_(10) setdest 148.315037 50.819341 10.939376" - -$ns_ at 219.000000 "$node_(1) setdest 105.384019 408.666566 11.409602" -$ns_ at 219.000000 "$node_(2) setdest 105.257830 460.439311 19.037767" -$ns_ at 219.000000 "$node_(3) setdest 20.836622 520.669754 19.973078" -$ns_ at 219.000000 "$node_(4) setdest 169.726291 541.962081 18.442870" -$ns_ at 219.000000 "$node_(5) setdest 151.392428 509.951508 14.803185" -$ns_ at 219.000000 "$node_(6) setdest 39.985524 66.816926 13.867275" -$ns_ at 219.000000 "$node_(7) setdest 65.983518 149.611440 17.548997" -$ns_ at 219.000000 "$node_(8) setdest 60.002002 46.833409 13.852258" -$ns_ at 219.000000 "$node_(9) setdest 12.671632 79.346833 18.683052" -$ns_ at 219.000000 "$node_(10) setdest 149.329428 63.307247 12.529038" - -$ns_ at 220.000000 "$node_(1) setdest 117.372851 403.595980 13.017025" -$ns_ at 220.000000 "$node_(2) setdest 114.312002 443.838623 18.909280" -$ns_ at 220.000000 "$node_(3) setdest 32.633983 533.959274 17.770455" -$ns_ at 220.000000 "$node_(4) setdest 186.809428 545.300049 17.406194" -$ns_ at 220.000000 "$node_(5) setdest 154.136381 499.903314 10.416116" -$ns_ at 220.000000 "$node_(6) setdest 38.966285 82.245893 15.462596" -$ns_ at 220.000000 "$node_(7) setdest 74.429529 163.526860 16.278023" -$ns_ at 220.000000 "$node_(8) setdest 62.748658 50.955781 4.953592" -$ns_ at 220.000000 "$node_(9) setdest 16.722542 97.580963 18.678688" -$ns_ at 220.000000 "$node_(10) setdest 147.564335 77.337282 14.140630" - -$ns_ at 221.000000 "$node_(1) setdest 130.510749 397.211113 14.607220" -$ns_ at 221.000000 "$node_(2) setdest 126.001789 428.533431 19.258765" -$ns_ at 221.000000 "$node_(3) setdest 47.085796 524.976442 17.016055" -$ns_ at 221.000000 "$node_(4) setdest 195.470877 545.496075 8.663667" -$ns_ at 221.000000 "$node_(5) setdest 153.537843 487.668110 12.249835" -$ns_ at 221.000000 "$node_(6) setdest 37.659369 99.258980 17.063211" -$ns_ at 221.000000 "$node_(7) setdest 81.550077 180.240654 18.167363" -$ns_ at 221.000000 "$node_(8) setdest 62.598894 57.433367 6.479317" -$ns_ at 221.000000 "$node_(9) setdest 23.470822 116.374653 19.968527" -$ns_ at 221.000000 "$node_(10) setdest 144.701469 92.814988 15.740247" - -$ns_ at 222.000000 "$node_(1) setdest 145.829089 392.029894 16.170856" -$ns_ at 222.000000 "$node_(2) setdest 140.217574 415.094347 19.562657" -$ns_ at 222.000000 "$node_(3) setdest 60.241100 516.107987 15.865420" -$ns_ at 222.000000 "$node_(4) setdest 195.175480 544.049314 1.476611" -$ns_ at 222.000000 "$node_(5) setdest 153.773151 473.824698 13.845411" -$ns_ at 222.000000 "$node_(6) setdest 36.836689 117.903151 18.662312" -$ns_ at 222.000000 "$node_(7) setdest 88.469997 198.652396 19.669203" -$ns_ at 222.000000 "$node_(8) setdest 62.213896 65.503403 8.079215" -$ns_ at 222.000000 "$node_(9) setdest 31.284840 134.781911 19.997150" -$ns_ at 222.000000 "$node_(10) setdest 140.588071 109.660694 17.340642" - -$ns_ at 223.000000 "$node_(1) setdest 163.506752 392.575980 17.686096" -$ns_ at 223.000000 "$node_(2) setdest 154.063643 401.028161 19.737558" -$ns_ at 223.000000 "$node_(3) setdest 74.782464 518.041618 14.669363" -$ns_ at 223.000000 "$node_(4) setdest 194.480877 541.034819 3.093486" -$ns_ at 223.000000 "$node_(5) setdest 154.461775 458.388033 15.452018" -$ns_ at 223.000000 "$node_(6) setdest 36.889515 137.817056 19.913975" -$ns_ at 223.000000 "$node_(7) setdest 93.285752 218.049531 19.986004" -$ns_ at 223.000000 "$node_(8) setdest 61.558857 75.160595 9.679381" -$ns_ at 223.000000 "$node_(9) setdest 40.120888 152.722334 19.998363" -$ns_ at 223.000000 "$node_(10) setdest 135.370957 127.870138 18.942073" - -$ns_ at 224.000000 "$node_(1) setdest 181.923802 396.004220 18.733408" -$ns_ at 224.000000 "$node_(2) setdest 167.390779 386.339495 19.833544" -$ns_ at 224.000000 "$node_(3) setdest 88.812375 526.590208 16.429145" -$ns_ at 224.000000 "$node_(4) setdest 193.757794 536.395966 4.694870" -$ns_ at 224.000000 "$node_(5) setdest 155.534575 441.369278 17.052534" -$ns_ at 224.000000 "$node_(6) setdest 37.937125 157.787942 19.998344" -$ns_ at 224.000000 "$node_(7) setdest 95.263234 237.932451 19.981015" -$ns_ at 224.000000 "$node_(8) setdest 60.618285 86.400311 11.279002" -$ns_ at 224.000000 "$node_(9) setdest 49.705686 170.274483 19.998657" -$ns_ at 224.000000 "$node_(10) setdest 129.766491 147.053821 19.985588" - -$ns_ at 225.000000 "$node_(1) setdest 169.232343 395.048481 12.727394" -$ns_ at 225.000000 "$node_(2) setdest 178.021040 369.992559 19.499353" -$ns_ at 225.000000 "$node_(3) setdest 105.697669 532.818640 17.997403" -$ns_ at 225.000000 "$node_(4) setdest 193.626695 530.109972 6.287361" -$ns_ at 225.000000 "$node_(5) setdest 157.030780 422.777712 18.651674" -$ns_ at 225.000000 "$node_(6) setdest 39.945670 177.684547 19.997729" -$ns_ at 225.000000 "$node_(7) setdest 93.862395 257.856020 19.972755" -$ns_ at 225.000000 "$node_(8) setdest 59.031456 99.180711 12.878534" -$ns_ at 225.000000 "$node_(9) setdest 59.205275 187.873059 19.998802" -$ns_ at 225.000000 "$node_(10) setdest 124.063931 166.223553 19.999945" - -$ns_ at 226.000000 "$node_(1) setdest 156.800156 391.440287 12.945205" -$ns_ at 226.000000 "$node_(2) setdest 181.618992 357.273651 13.218014" -$ns_ at 226.000000 "$node_(3) setdest 124.505138 538.184199 19.557865" -$ns_ at 226.000000 "$node_(4) setdest 193.643917 522.227082 7.882909" -$ns_ at 226.000000 "$node_(5) setdest 158.657327 402.933793 19.910469" -$ns_ at 226.000000 "$node_(6) setdest 43.108409 197.429911 19.997057" -$ns_ at 226.000000 "$node_(7) setdest 88.502871 277.089742 19.966486" -$ns_ at 226.000000 "$node_(8) setdest 56.808037 113.487980 14.479003" -$ns_ at 226.000000 "$node_(9) setdest 67.791820 205.933327 19.997551" -$ns_ at 226.000000 "$node_(10) setdest 117.964834 185.269423 19.998604" - -$ns_ at 227.000000 "$node_(1) setdest 142.278798 390.812500 14.534922" -$ns_ at 227.000000 "$node_(2) setdest 180.809611 361.122439 3.932972" -$ns_ at 227.000000 "$node_(3) setdest 139.353761 542.830733 15.558660" -$ns_ at 227.000000 "$node_(4) setdest 190.918757 513.212438 9.417553" -$ns_ at 227.000000 "$node_(5) setdest 158.201943 382.958722 19.980261" -$ns_ at 227.000000 "$node_(6) setdest 47.461748 216.947467 19.997164" -$ns_ at 227.000000 "$node_(7) setdest 79.883191 295.123722 19.988080" -$ns_ at 227.000000 "$node_(8) setdest 54.120836 129.341065 16.079222" -$ns_ at 227.000000 "$node_(9) setdest 75.603470 224.344458 19.999791" -$ns_ at 227.000000 "$node_(10) setdest 111.317961 204.132478 19.999894" - -$ns_ at 228.000000 "$node_(1) setdest 126.803939 394.954915 16.019702" -$ns_ at 228.000000 "$node_(2) setdest 181.453885 366.636563 5.551636" -$ns_ at 228.000000 "$node_(3) setdest 139.679950 541.809477 1.072084" -$ns_ at 228.000000 "$node_(4) setdest 182.221684 506.884617 10.755483" -$ns_ at 228.000000 "$node_(5) setdest 147.532398 367.471383 18.806830" -$ns_ at 228.000000 "$node_(6) setdest 53.185240 236.106169 19.995355" -$ns_ at 228.000000 "$node_(7) setdest 69.135376 311.964610 19.978263" -$ns_ at 228.000000 "$node_(8) setdest 50.220110 146.582020 17.676713" -$ns_ at 228.000000 "$node_(9) setdest 83.229589 242.832888 19.999493" -$ns_ at 228.000000 "$node_(10) setdest 104.487873 222.930048 19.999968" - -$ns_ at 229.000000 "$node_(1) setdest 112.719153 405.732941 17.735474" -$ns_ at 229.000000 "$node_(2) setdest 184.190891 373.250673 7.158048" -$ns_ at 229.000000 "$node_(3) setdest 138.130687 540.190583 2.240767" -$ns_ at 229.000000 "$node_(4) setdest 170.893314 511.903508 12.390368" -$ns_ at 229.000000 "$node_(5) setdest 131.769906 373.894402 17.020909" -$ns_ at 229.000000 "$node_(6) setdest 60.421096 254.745402 19.994464" -$ns_ at 229.000000 "$node_(7) setdest 55.227342 326.293985 19.969086" -$ns_ at 229.000000 "$node_(8) setdest 46.727716 165.535396 19.272448" -$ns_ at 229.000000 "$node_(9) setdest 90.276455 261.550003 19.999718" -$ns_ at 229.000000 "$node_(10) setdest 98.003508 241.846149 19.996647" - -$ns_ at 230.000000 "$node_(1) setdest 96.091336 415.488575 19.278400" -$ns_ at 230.000000 "$node_(2) setdest 183.469209 381.617058 8.397453" -$ns_ at 230.000000 "$node_(3) setdest 135.135321 537.790149 3.838527" -$ns_ at 230.000000 "$node_(4) setdest 159.237705 520.178185 14.294178" -$ns_ at 230.000000 "$node_(5) setdest 126.003487 389.332246 16.479642" -$ns_ at 230.000000 "$node_(6) setdest 69.231636 272.693606 19.994091" -$ns_ at 230.000000 "$node_(7) setdest 39.927801 339.173368 19.998862" -$ns_ at 230.000000 "$node_(8) setdest 44.917086 185.446450 19.993211" -$ns_ at 230.000000 "$node_(9) setdest 96.877144 280.425405 19.996247" -$ns_ at 230.000000 "$node_(10) setdest 92.829898 261.161671 19.996390" - -$ns_ at 231.000000 "$node_(1) setdest 76.542960 419.096553 19.878544" -$ns_ at 231.000000 "$node_(2) setdest 176.455767 382.214395 7.038833" -$ns_ at 231.000000 "$node_(3) setdest 130.270647 535.384863 5.426828" -$ns_ at 231.000000 "$node_(4) setdest 147.767236 531.122795 15.854216" -$ns_ at 231.000000 "$node_(5) setdest 120.093704 403.690952 15.527329" -$ns_ at 231.000000 "$node_(6) setdest 79.612346 289.781035 19.993483" -$ns_ at 231.000000 "$node_(7) setdest 24.003817 350.585990 19.591355" -$ns_ at 231.000000 "$node_(8) setdest 44.961975 205.440954 19.994554" -$ns_ at 231.000000 "$node_(9) setdest 99.747344 300.145262 19.927640" -$ns_ at 231.000000 "$node_(10) setdest 89.013268 280.789285 19.995247" - -$ns_ at 232.000000 "$node_(1) setdest 57.010907 414.931045 19.971292" -$ns_ at 232.000000 "$node_(2) setdest 170.625082 375.887436 8.603912" -$ns_ at 232.000000 "$node_(3) setdest 123.401898 533.915668 7.024119" -$ns_ at 232.000000 "$node_(4) setdest 133.831007 536.334199 14.878750" -$ns_ at 232.000000 "$node_(5) setdest 112.784511 418.983603 16.949616" -$ns_ at 232.000000 "$node_(6) setdest 91.565883 305.808159 19.993893" -$ns_ at 232.000000 "$node_(7) setdest 24.991666 366.397074 15.841913" -$ns_ at 232.000000 "$node_(8) setdest 46.668910 225.364489 19.996521" -$ns_ at 232.000000 "$node_(9) setdest 95.297668 319.497789 19.857489" -$ns_ at 232.000000 "$node_(10) setdest 86.767611 300.658389 19.995606" - -$ns_ at 233.000000 "$node_(1) setdest 39.647141 405.570459 19.726149" -$ns_ at 233.000000 "$node_(2) setdest 163.274148 368.970881 10.093313" -$ns_ at 233.000000 "$node_(3) setdest 114.780291 533.380993 8.638170" -$ns_ at 233.000000 "$node_(4) setdest 131.539148 532.333883 4.610330" -$ns_ at 233.000000 "$node_(5) setdest 104.102864 435.367253 18.541710" -$ns_ at 233.000000 "$node_(6) setdest 103.303347 321.997575 19.996631" -$ns_ at 233.000000 "$node_(7) setdest 30.412033 380.296306 14.918748" -$ns_ at 233.000000 "$node_(8) setdest 49.123918 245.211852 19.998622" -$ns_ at 233.000000 "$node_(9) setdest 83.212825 335.267364 19.867635" -$ns_ at 233.000000 "$node_(10) setdest 86.025912 320.638077 19.993450" - -$ns_ at 234.000000 "$node_(1) setdest 27.316123 390.616503 19.382332" -$ns_ at 234.000000 "$node_(2) setdest 152.190026 371.188100 11.303708" -$ns_ at 234.000000 "$node_(3) setdest 104.559734 533.881666 10.232813" -$ns_ at 234.000000 "$node_(4) setdest 134.437047 528.843275 4.536757" -$ns_ at 234.000000 "$node_(5) setdest 99.490371 454.660971 19.837405" -$ns_ at 234.000000 "$node_(6) setdest 113.260598 339.320990 19.981180" -$ns_ at 234.000000 "$node_(7) setdest 34.878867 395.284625 15.639767" -$ns_ at 234.000000 "$node_(8) setdest 52.561370 264.911186 19.996995" -$ns_ at 234.000000 "$node_(9) setdest 66.066130 345.377223 19.905235" -$ns_ at 234.000000 "$node_(10) setdest 87.285070 340.587013 19.988635" - -$ns_ at 235.000000 "$node_(1) setdest 20.218846 372.865040 19.117682" -$ns_ at 235.000000 "$node_(2) setdest 142.051256 379.923957 13.383193" -$ns_ at 235.000000 "$node_(3) setdest 92.840981 535.571717 11.839993" -$ns_ at 235.000000 "$node_(4) setdest 138.217326 524.011125 6.135160" -$ns_ at 235.000000 "$node_(5) setdest 91.141238 472.512581 19.707562" -$ns_ at 235.000000 "$node_(6) setdest 120.629818 357.902574 19.989513" -$ns_ at 235.000000 "$node_(7) setdest 37.667906 412.302677 17.245082" -$ns_ at 235.000000 "$node_(8) setdest 57.399640 284.312240 19.995243" -$ns_ at 235.000000 "$node_(9) setdest 47.135371 351.684805 19.953928" -$ns_ at 235.000000 "$node_(10) setdest 91.171326 360.189136 19.983649" - -$ns_ at 236.000000 "$node_(1) setdest 24.598928 356.149629 17.279760" -$ns_ at 236.000000 "$node_(2) setdest 133.409494 392.148552 14.970664" -$ns_ at 236.000000 "$node_(3) setdest 79.429653 536.017371 13.418731" -$ns_ at 236.000000 "$node_(4) setdest 141.644180 517.087121 7.725617" -$ns_ at 236.000000 "$node_(5) setdest 82.659254 489.792059 19.249010" -$ns_ at 236.000000 "$node_(6) setdest 124.911845 377.382671 19.945173" -$ns_ at 236.000000 "$node_(7) setdest 36.308163 431.068874 18.815394" -$ns_ at 236.000000 "$node_(8) setdest 63.770885 303.263885 19.993940" -$ns_ at 236.000000 "$node_(9) setdest 27.530214 350.712658 19.629245" -$ns_ at 236.000000 "$node_(10) setdest 98.063978 378.939773 19.977363" - -$ns_ at 237.000000 "$node_(1) setdest 40.321183 353.037350 16.027339" -$ns_ at 237.000000 "$node_(2) setdest 125.329380 406.653920 16.604033" -$ns_ at 237.000000 "$node_(3) setdest 64.843715 532.584356 14.984497" -$ns_ at 237.000000 "$node_(4) setdest 144.634350 508.245730 9.333344" -$ns_ at 237.000000 "$node_(5) setdest 82.909106 508.254419 18.464050" -$ns_ at 237.000000 "$node_(6) setdest 118.133725 394.817452 18.706002" -$ns_ at 237.000000 "$node_(7) setdest 29.233267 449.643599 19.876483" -$ns_ at 237.000000 "$node_(8) setdest 71.818285 321.564343 19.991683" -$ns_ at 237.000000 "$node_(9) setdest 29.921966 351.885394 2.663792" -$ns_ at 237.000000 "$node_(10) setdest 108.291461 396.089794 19.968090" - -$ns_ at 238.000000 "$node_(1) setdest 45.596210 362.703271 11.011628" -$ns_ at 238.000000 "$node_(2) setdest 116.291703 422.438321 18.188648" -$ns_ at 238.000000 "$node_(3) setdest 50.905662 523.641287 16.560429" -$ns_ at 238.000000 "$node_(4) setdest 147.083186 497.586315 10.937090" -$ns_ at 238.000000 "$node_(5) setdest 86.823206 527.075434 19.223704" -$ns_ at 238.000000 "$node_(6) setdest 100.295091 394.820595 17.838634" -$ns_ at 238.000000 "$node_(7) setdest 14.754694 462.701263 19.496965" -$ns_ at 238.000000 "$node_(8) setdest 82.106778 338.696777 19.984329" -$ns_ at 238.000000 "$node_(9) setdest 29.384525 352.572171 0.872069" -$ns_ at 238.000000 "$node_(10) setdest 121.581838 411.004409 19.976983" - -$ns_ at 239.000000 "$node_(1) setdest 43.050325 374.782260 12.344371" -$ns_ at 239.000000 "$node_(2) setdest 109.603123 440.967025 19.698985" -$ns_ at 239.000000 "$node_(3) setdest 40.281591 508.934509 18.142774" -$ns_ at 239.000000 "$node_(4) setdest 150.186991 485.439022 12.537557" -$ns_ at 239.000000 "$node_(5) setdest 88.363743 540.891623 13.901811" -$ns_ at 239.000000 "$node_(6) setdest 83.872867 392.609649 16.570387" -$ns_ at 239.000000 "$node_(7) setdest 2.120167 462.131925 12.647348" -$ns_ at 239.000000 "$node_(8) setdest 94.881055 354.058754 19.979301" -$ns_ at 239.000000 "$node_(9) setdest 28.147365 354.727230 2.484924" -$ns_ at 239.000000 "$node_(10) setdest 137.437686 423.128242 19.959841" - -$ns_ at 240.000000 "$node_(1) setdest 38.556092 388.011135 13.971445" -$ns_ at 240.000000 "$node_(2) setdest 102.994537 459.843356 19.999731" -$ns_ at 240.000000 "$node_(3) setdest 34.511155 490.212704 19.590914" -$ns_ at 240.000000 "$node_(4) setdest 153.699183 471.745840 14.136432" -$ns_ at 240.000000 "$node_(5) setdest 87.677276 538.921027 2.086741" -$ns_ at 240.000000 "$node_(6) setdest 67.844685 393.430187 16.049172" -$ns_ at 240.000000 "$node_(7) setdest 2.807388 458.762773 3.438526" -$ns_ at 240.000000 "$node_(8) setdest 109.948493 367.184167 19.982596" -$ns_ at 240.000000 "$node_(9) setdest 26.581030 358.478450 4.065102" -$ns_ at 240.000000 "$node_(10) setdest 155.787822 430.945677 19.945921" - -$ns_ at 241.000000 "$node_(1) setdest 36.249641 403.358559 15.519767" -$ns_ at 241.000000 "$node_(2) setdest 95.054734 478.197050 19.997464" -$ns_ at 241.000000 "$node_(3) setdest 38.588756 470.902314 19.736210" -$ns_ at 241.000000 "$node_(4) setdest 158.039693 456.618076 15.738147" -$ns_ at 241.000000 "$node_(5) setdest 85.810743 535.721185 3.704447" -$ns_ at 241.000000 "$node_(6) setdest 50.254348 394.635888 17.631610" -$ns_ at 241.000000 "$node_(7) setdest 5.492504 454.380668 5.139327" -$ns_ at 241.000000 "$node_(8) setdest 125.740547 379.432191 19.985071" -$ns_ at 241.000000 "$node_(9) setdest 26.686133 364.112657 5.635187" -$ns_ at 241.000000 "$node_(10) setdest 175.328309 429.760207 19.576413" - -$ns_ at 242.000000 "$node_(1) setdest 37.522192 420.480349 17.169015" -$ns_ at 242.000000 "$node_(2) setdest 90.631305 497.645680 19.945323" -$ns_ at 242.000000 "$node_(3) setdest 50.739464 455.055826 19.968748" -$ns_ at 242.000000 "$node_(4) setdest 162.672725 439.910564 17.337991" -$ns_ at 242.000000 "$node_(5) setdest 82.862827 531.310088 5.305468" -$ns_ at 242.000000 "$node_(6) setdest 31.030156 394.391413 19.225746" -$ns_ at 242.000000 "$node_(7) setdest 9.560885 449.014231 6.734268" -$ns_ at 242.000000 "$node_(8) setdest 138.863619 394.470220 19.958891" -$ns_ at 242.000000 "$node_(9) setdest 30.044622 370.532583 7.245336" -$ns_ at 242.000000 "$node_(10) setdest 184.068040 414.234527 17.816555" - -$ns_ at 243.000000 "$node_(1) setdest 37.985476 439.243636 18.769005" -$ns_ at 243.000000 "$node_(2) setdest 87.433717 517.377092 19.988827" -$ns_ at 243.000000 "$node_(3) setdest 62.449094 438.866145 19.980520" -$ns_ at 243.000000 "$node_(4) setdest 167.366807 421.571460 18.930323" -$ns_ at 243.000000 "$node_(5) setdest 79.256025 525.421283 6.905580" -$ns_ at 243.000000 "$node_(6) setdest 11.506341 396.543000 19.642013" -$ns_ at 243.000000 "$node_(7) setdest 15.539098 443.203051 8.337197" -$ns_ at 243.000000 "$node_(8) setdest 147.973211 412.218070 19.949207" -$ns_ at 243.000000 "$node_(9) setdest 36.059140 377.050285 8.868758" -$ns_ at 243.000000 "$node_(10) setdest 177.685561 398.128349 17.324694" - -$ns_ at 244.000000 "$node_(1) setdest 39.206090 459.137583 19.931358" -$ns_ at 244.000000 "$node_(2) setdest 83.154377 536.500088 19.595961" -$ns_ at 244.000000 "$node_(3) setdest 78.636311 427.281132 19.905741" -$ns_ at 244.000000 "$node_(4) setdest 170.390886 401.818715 19.982892" -$ns_ at 244.000000 "$node_(5) setdest 74.252665 518.545692 8.503374" -$ns_ at 244.000000 "$node_(6) setdest 7.973051 410.375276 14.276414" -$ns_ at 244.000000 "$node_(7) setdest 23.323807 437.026222 9.937551" -$ns_ at 244.000000 "$node_(8) setdest 153.374916 431.467556 19.993027" -$ns_ at 244.000000 "$node_(9) setdest 44.032723 383.856539 10.483469" -$ns_ at 244.000000 "$node_(10) setdest 172.718843 382.551826 16.349201" - -$ns_ at 245.000000 "$node_(1) setdest 34.618867 478.486864 19.885606" -$ns_ at 245.000000 "$node_(2) setdest 84.300844 531.592510 5.039713" -$ns_ at 245.000000 "$node_(3) setdest 94.940590 415.825326 19.926490" -$ns_ at 245.000000 "$node_(4) setdest 172.304961 394.881002 7.196912" -$ns_ at 245.000000 "$node_(5) setdest 68.133382 510.504064 10.105117" -$ns_ at 245.000000 "$node_(6) setdest 17.059711 420.972002 13.959154" -$ns_ at 245.000000 "$node_(7) setdest 32.971174 430.706107 11.533236" -$ns_ at 245.000000 "$node_(8) setdest 157.601063 450.999458 19.983881" -$ns_ at 245.000000 "$node_(9) setdest 53.145590 391.780127 12.075909" -$ns_ at 245.000000 "$node_(10) setdest 169.004729 365.196387 17.748406" - -$ns_ at 246.000000 "$node_(1) setdest 23.314948 494.915448 19.941839" -$ns_ at 246.000000 "$node_(2) setdest 80.388414 526.333405 6.554791" -$ns_ at 246.000000 "$node_(3) setdest 105.925896 399.190915 19.934407" -$ns_ at 246.000000 "$node_(4) setdest 172.261920 400.073454 5.192630" -$ns_ at 246.000000 "$node_(5) setdest 60.662128 501.492990 11.705516" -$ns_ at 246.000000 "$node_(6) setdest 25.067644 434.285222 15.536049" -$ns_ at 246.000000 "$node_(7) setdest 44.416211 424.250797 13.140012" -$ns_ at 246.000000 "$node_(8) setdest 157.547382 470.971881 19.972495" -$ns_ at 246.000000 "$node_(9) setdest 61.816142 402.356439 13.676142" -$ns_ at 246.000000 "$node_(10) setdest 159.697284 354.841814 13.922848" - -$ns_ at 247.000000 "$node_(1) setdest 11.471594 510.982443 19.960295" -$ns_ at 247.000000 "$node_(2) setdest 73.667647 521.515333 8.269373" -$ns_ at 247.000000 "$node_(3) setdest 115.687404 381.745967 19.990329" -$ns_ at 247.000000 "$node_(4) setdest 172.542353 406.883343 6.815660" -$ns_ at 247.000000 "$node_(5) setdest 53.043729 490.595790 13.296201" -$ns_ at 247.000000 "$node_(6) setdest 35.532652 447.799237 17.092249" -$ns_ at 247.000000 "$node_(7) setdest 57.583686 417.635230 14.735946" -$ns_ at 247.000000 "$node_(8) setdest 155.807521 490.895157 19.999102" -$ns_ at 247.000000 "$node_(9) setdest 70.586313 414.874960 15.284936" -$ns_ at 247.000000 "$node_(10) setdest 150.705382 353.022498 9.174106" - -$ns_ at 248.000000 "$node_(1) setdest 6.250205 530.216206 19.929890" -$ns_ at 248.000000 "$node_(2) setdest 64.550481 517.738746 9.868400" -$ns_ at 248.000000 "$node_(3) setdest 129.575043 368.902786 18.915967" -$ns_ at 248.000000 "$node_(4) setdest 172.766820 415.295599 8.415251" -$ns_ at 248.000000 "$node_(5) setdest 45.664917 477.649441 14.901504" -$ns_ at 248.000000 "$node_(6) setdest 49.236481 460.622756 18.767994" -$ns_ at 248.000000 "$node_(7) setdest 72.542200 411.059556 16.340032" -$ns_ at 248.000000 "$node_(8) setdest 154.151119 510.826019 19.999573" -$ns_ at 248.000000 "$node_(9) setdest 80.048453 428.859710 16.885062" -$ns_ at 248.000000 "$node_(10) setdest 150.693495 353.348529 0.326248" - -$ns_ at 249.000000 "$node_(1) setdest 15.633937 545.116140 17.608591" -$ns_ at 249.000000 "$node_(2) setdest 53.897778 513.466205 11.477573" -$ns_ at 249.000000 "$node_(3) setdest 147.143605 364.268821 18.169425" -$ns_ at 249.000000 "$node_(4) setdest 172.715108 425.310616 10.015150" -$ns_ at 249.000000 "$node_(5) setdest 40.276620 462.090927 16.465147" -$ns_ at 249.000000 "$node_(6) setdest 66.591813 470.358500 19.899554" -$ns_ at 249.000000 "$node_(7) setdest 89.011277 403.945945 17.939731" -$ns_ at 249.000000 "$node_(8) setdest 153.637467 522.766334 11.951358" -$ns_ at 249.000000 "$node_(9) setdest 90.366944 444.196722 18.484999" -$ns_ at 249.000000 "$node_(10) setdest 152.055411 354.274810 1.647062" - -$ns_ at 250.000000 "$node_(1) setdest 32.767440 547.185729 17.258045" -$ns_ at 250.000000 "$node_(2) setdest 42.327370 507.405581 13.061605" -$ns_ at 250.000000 "$node_(3) setdest 166.110136 361.566966 19.158010" -$ns_ at 250.000000 "$node_(4) setdest 171.517760 436.860424 11.611706" -$ns_ at 250.000000 "$node_(5) setdest 39.663162 444.108944 17.992445" -$ns_ at 250.000000 "$node_(6) setdest 82.640473 482.268268 19.985046" -$ns_ at 250.000000 "$node_(7) setdest 106.691634 395.709099 19.504889" -$ns_ at 250.000000 "$node_(8) setdest 156.539558 511.951326 11.197613" -$ns_ at 250.000000 "$node_(9) setdest 102.661633 459.753615 19.828673" -$ns_ at 250.000000 "$node_(10) setdest 155.016298 355.644768 3.262459" - diff --git a/gui/configs/sample5-mgen.imn b/gui/configs/sample5-mgen.imn deleted file mode 100644 index d80a58a6..00000000 --- a/gui/configs/sample5-mgen.imn +++ /dev/null @@ -1,127 +0,0 @@ -node n1 { - type router - model router - network-config { - hostname n1 - ! - interface eth0 - ip address 10.0.0.2/24 - ipv6 address a:0::2/64 - ! - router ospf - router-id 10.0.0.2 - network 10.0.0.0/24 area 0 - ! - router ospf6 - router-id 10.0.0.2 - interface eth0 area 0.0.0.0 - ! - } - canvas c1 - iconcoords {312.0 120.0} - labelcoords {312.0 148.0} - interface-peer {eth0 n2} - custom-config { - custom-config-id service:UserDefined:mgen.sh - custom-command mgen.sh - config { - #!/bin/sh - SCRIPTDIR=$SESSION_DIR - LOGDIR=/var/log - if [ `uname` = "Linux" ]; then - cd $SCRIPTDIR - else - cd /tmp/e0_`hostname` - fi - ( - cat << 'EOF' - # mgen receiver script - 15.0 LISTEN UDP 5001 - EOF - ) > recv.mgn - mgen input recv.mgn output $LOGDIR/mgen.log > /dev/null 2> /dev/null < /dev/null & - } - } - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('mgen.sh', ) - startidx=35 - cmdup=('sh mgen.sh', ) - } - } - services {zebra OSPFv2 OSPFv3 IPForward UserDefined} -} - -node n2 { - type router - model router - network-config { - hostname n2 - ! - interface eth0 - ip address 10.0.0.1/24 - ipv6 address a:0::1/64 - ! - } - canvas c1 - iconcoords {72.0 48.0} - labelcoords {72.0 76.0} - interface-peer {eth0 n1} - custom-config { - custom-config-id service:UserDefined - custom-command UserDefined - config { - files=('mgen.sh', ) - startidx=35 - cmdup=('sh mgen.sh', ) - } - } - custom-config { - custom-config-id service:UserDefined:mgen.sh - custom-command mgen.sh - config { - #!/bin/sh - HN=`hostname` - SCRIPTDIR=$SESSION_DIR - LOGDIR=/var/log - - cd $SCRIPTDIR - ( - cat << 'EOF' - # mgen sender script: send UDP traffic to UDP port 5001 after 15 seconds - 15.0 ON 1 UDP SRC 5000 DST 10.0.0.2/5001 PERIODIC [1 4096] - EOF - ) > send_$HN.mgn - mgen input send_$HN.mgn output $LOGDIR/mgen_$HN.log > /dev/null 2> /dev/null < /dev/null & - } - } - services {zebra OSPFv2 OSPFv3 IPForward UserDefined} -} - -link l1 { - nodes {n2 n1} - bandwidth 0 -} - -canvas c1 { - name {Canvas1} -} - -option global { - interface_names no - ip_addresses yes - ipv6_addresses yes - node_labels yes - link_labels yes - show_api no - background_images no - annotations yes - grid yes - traffic_start 0 -} - -option session { -} - diff --git a/gui/configs/sample6-emane-rfpipe.imn b/gui/configs/sample6-emane-rfpipe.imn deleted file mode 100644 index 9e0cc045..00000000 --- a/gui/configs/sample6-emane-rfpipe.imn +++ /dev/null @@ -1,271 +0,0 @@ -node n1 { - type router - model mdr - network-config { - hostname n1 - ! - interface eth0 - ip address 10.0.0.1/32 - ipv6 address a:0::1/128 - ! - } - iconcoords {263.148836492 76.94184084899999} - labelcoords {263.148836492 100.94184084899999} - canvas c1 - interface-peer {eth0 n11} -} - -node n2 { - type router - model mdr - network-config { - hostname n2 - ! - interface eth0 - ip address 10.0.0.2/32 - ipv6 address a:0::2/128 - ! - } - iconcoords {184.35166313500002 532.524009667} - labelcoords {184.35166313500002 556.524009667} - canvas c1 - interface-peer {eth0 n11} -} - -node n3 { - type router - model mdr - network-config { - hostname n3 - ! - interface eth0 - ip address 10.0.0.3/32 - ipv6 address a:0::3/128 - ! - } - iconcoords {121.17243156500001 313.104176223} - labelcoords {121.17243156500001 337.104176223} - canvas c1 - interface-peer {eth0 n11} -} - -node n4 { - type router - model mdr - network-config { - hostname n4 - ! - interface eth0 - ip address 10.0.0.4/32 - ipv6 address a:0::4/128 - ! - } - iconcoords {443.031505695 586.805480735} - labelcoords {443.031505695 610.805480735} - canvas c1 - interface-peer {eth0 n11} -} - -node n5 { - type router - model mdr - network-config { - hostname n5 - ! - interface eth0 - ip address 10.0.0.5/32 - ipv6 address a:0::5/128 - ! - } - iconcoords {548.817758443 209.207353139} - labelcoords {548.817758443 233.207353139} - canvas c1 - interface-peer {eth0 n11} -} - -node n6 { - type router - model mdr - network-config { - hostname n6 - ! - interface eth0 - ip address 10.0.0.6/32 - ipv6 address a:0::6/128 - ! - } - iconcoords {757.062318769 61.533941783} - labelcoords {757.062318769 85.533941783} - canvas c1 - interface-peer {eth0 n11} -} - -node n7 { - type router - model mdr - network-config { - hostname n7 - ! - interface eth0 - ip address 10.0.0.7/32 - ipv6 address a:0::7/128 - ! - } - iconcoords {778.142667152 489.227596061} - labelcoords {778.142667152 513.227596061} - canvas c1 - interface-peer {eth0 n11} -} - -node n8 { - type router - model mdr - network-config { - hostname n8 - ! - interface eth0 - ip address 10.0.0.8/32 - ipv6 address a:0::8/128 - ! - } - iconcoords {93.895107521 135.228007484} - labelcoords {93.895107521 159.228007484} - canvas c1 - interface-peer {eth0 n11} -} - -node n9 { - type router - model mdr - network-config { - hostname n9 - ! - interface eth0 - ip address 10.0.0.9/32 - ipv6 address a:0::9/128 - ! - } - iconcoords {528.693178831 84.9814304098} - labelcoords {528.693178831 108.9814304098} - canvas c1 - interface-peer {eth0 n11} -} - -node n10 { - type router - model mdr - network-config { - hostname n10 - ! - interface eth0 - ip address 10.0.0.10/32 - ipv6 address a:0::10/128 - ! - } - iconcoords {569.534639911 475.46828902} - labelcoords {569.534639911 499.46828902} - canvas c1 - interface-peer {eth0 n11} -} - -node n11 { - bandwidth 54000000 - type wlan - range 275 - network-config { - hostname wlan11 - ! - interface wireless - ip address 10.0.0.0/32 - ipv6 address a:0::0/128 - ! - mobmodel - coreapi - emane_rfpipe - ! - } - canvas c1 - iconcoords {65.0 558.0} - labelcoords {65.0 582.0} - interface-peer {e0 n1} - interface-peer {e1 n2} - interface-peer {e2 n3} - interface-peer {e3 n4} - interface-peer {e4 n5} - interface-peer {e5 n6} - interface-peer {e6 n7} - interface-peer {e7 n8} - interface-peer {e8 n9} - interface-peer {e9 n10} -} - -link l1 { - nodes {n11 n1} - bandwidth 54000000 -} - -link l2 { - nodes {n11 n2} - bandwidth 54000000 -} - -link l3 { - nodes {n11 n3} - bandwidth 54000000 -} - -link l4 { - nodes {n11 n4} - bandwidth 54000000 -} - -link l5 { - nodes {n11 n5} - bandwidth 54000000 -} - -link l6 { - nodes {n11 n6} - bandwidth 54000000 -} - -link l7 { - nodes {n11 n7} - bandwidth 54000000 -} - -link l8 { - nodes {n11 n8} - bandwidth 54000000 -} - -link l9 { - nodes {n11 n9} - bandwidth 54000000 -} - -link l10 { - nodes {n11 n10} - bandwidth 54000000 -} - -canvas c1 { - name {Canvas1} -} - -option global { - interface_names no - ip_addresses yes - ipv6_addresses yes - node_labels yes - link_labels yes - ipsec_configs yes - remote_exec no - exec_errors yes - show_api no - background_images no - annotations yes - grid yes - traffic_start 0 -} - diff --git a/gui/configs/sample7-emane-ieee80211abg.imn b/gui/configs/sample7-emane-ieee80211abg.imn deleted file mode 100644 index b1323f6f..00000000 --- a/gui/configs/sample7-emane-ieee80211abg.imn +++ /dev/null @@ -1,274 +0,0 @@ -node n1 { - type router - model mdr - network-config { - hostname n1 - ! - interface eth0 - ip address 10.0.0.1/32 - ipv6 address a:0::1/128 - ! - } - iconcoords {115.14883649199999 139.941840849} - labelcoords {115.14883649199999 167.941840849} - canvas c1 - interface-peer {eth0 n11} -} - -node n2 { - type router - model mdr - network-config { - hostname n2 - ! - interface eth0 - ip address 10.0.0.2/32 - ipv6 address a:0::2/128 - ! - } - iconcoords {190.35166313500002 519.524009667} - labelcoords {190.35166313500002 547.524009667} - canvas c1 - interface-peer {eth0 n11} -} - -node n3 { - type router - model mdr - network-config { - hostname n3 - ! - interface eth0 - ip address 10.0.0.3/32 - ipv6 address a:0::3/128 - ! - } - iconcoords {142.172431565 307.104176223} - labelcoords {142.172431565 335.104176223} - canvas c1 - interface-peer {eth0 n11} -} - -node n4 { - type router - model mdr - network-config { - hostname n4 - ! - interface eth0 - ip address 10.0.0.4/32 - ipv6 address a:0::4/128 - ! - } - iconcoords {395.031505695 589.805480735} - labelcoords {395.031505695 617.805480735} - canvas c1 - interface-peer {eth0 n11} -} - -node n5 { - type router - model mdr - network-config { - hostname n5 - ! - interface eth0 - ip address 10.0.0.5/32 - ipv6 address a:0::5/128 - ! - } - iconcoords {250.817758443 27.20735313899999} - labelcoords {250.817758443 55.20735313899999} - canvas c1 - interface-peer {eth0 n11} -} - -node n6 { - type router - model mdr - network-config { - hostname n6 - ! - interface eth0 - ip address 10.0.0.6/32 - ipv6 address a:0::6/128 - ! - } - iconcoords {757.062318769 61.533941783} - labelcoords {757.062318769 89.533941783} - canvas c1 - interface-peer {eth0 n11} -} - -node n7 { - type router - model mdr - network-config { - hostname n7 - ! - interface eth0 - ip address 10.0.0.7/32 - ipv6 address a:0::7/128 - ! - } - iconcoords {909.142667152 593.227596061} - labelcoords {909.142667152 621.227596061} - canvas c1 - interface-peer {eth0 n11} -} - -node n8 { - type router - model mdr - network-config { - hostname n8 - ! - interface eth0 - ip address 10.0.0.8/32 - ipv6 address a:0::8/128 - ! - } - iconcoords {351.895107521 337.228007484} - labelcoords {351.895107521 365.228007484} - canvas c1 - interface-peer {eth0 n11} -} - -node n9 { - type router - model mdr - network-config { - hostname n9 - ! - interface eth0 - ip address 10.0.0.9/32 - ipv6 address a:0::9/128 - ! - } - iconcoords {528.693178831 84.9814304098} - labelcoords {528.693178831 112.98143041} - canvas c1 - interface-peer {eth0 n11} -} - -node n10 { - type router - model mdr - network-config { - hostname n10 - ! - interface eth0 - ip address 10.0.0.10/32 - ipv6 address a:0::10/128 - ! - } - iconcoords {568.534639911 526.4682890199999} - labelcoords {568.534639911 554.4682890199999} - canvas c1 - interface-peer {eth0 n11} -} - -node n11 { - bandwidth 54000000 - type wlan - range 275 - network-config { - hostname wlan11 - ! - interface wireless - ip address 10.0.0.0/32 - ipv6 address a:0::0/128 - ! - mobmodel - coreapi - emane_ieee80211abg - ! - } - canvas c1 - iconcoords {65.0 558.0} - labelcoords {65.0 590.0} - interface-peer {e0 n1} - interface-peer {e1 n2} - interface-peer {e2 n3} - interface-peer {e3 n4} - interface-peer {e4 n5} - interface-peer {e5 n6} - interface-peer {e6 n7} - interface-peer {e7 n8} - interface-peer {e8 n9} - interface-peer {e9 n10} -} - -link l1 { - nodes {n11 n1} - bandwidth 54000000 -} - -link l2 { - nodes {n11 n2} - bandwidth 54000000 -} - -link l3 { - nodes {n11 n3} - bandwidth 54000000 -} - -link l4 { - nodes {n11 n4} - bandwidth 54000000 -} - -link l5 { - nodes {n11 n5} - bandwidth 54000000 -} - -link l6 { - nodes {n11 n6} - bandwidth 54000000 -} - -link l7 { - nodes {n11 n7} - bandwidth 54000000 -} - -link l8 { - nodes {n11 n8} - bandwidth 54000000 -} - -link l9 { - nodes {n11 n9} - bandwidth 54000000 -} - -link l10 { - nodes {n11 n10} - bandwidth 54000000 -} - -canvas c1 { - name {Canvas1} - refpt {0 0 47.5791667 -122.132322 2.0} - scale 350.0 - size {1000 750} -} - -option global { - interface_names no - ip_addresses yes - ipv6_addresses yes - node_labels yes - link_labels yes - ipsec_configs yes - remote_exec no - exec_errors yes - show_api no - background_images no - annotations yes - grid yes - traffic_start 0 -} - diff --git a/gui/configs/sample8-ipsec-service.imn b/gui/configs/sample8-ipsec-service.imn deleted file mode 100644 index fb82881f..00000000 --- a/gui/configs/sample8-ipsec-service.imn +++ /dev/null @@ -1,920 +0,0 @@ -comments { -Sample scenario showing IPsec service configuration. - -There are three red routers having the IPsec service enabled. The IPsec service -must be customized with the tunnel hosts (peers) and their keys, and the subnet -addresses that should be tunneled. - -For simplicity, the same keys and certificates are used in each of the three -IPsec gateways. These are written to node n1's configuration directory. Keys -can be generated using the openssl utility. - -Note that this scenario may require at patched kernel in order to work; see the -kernels subdirectory of the CORE source for kernel patches. - -The racoon keying daemon and setkey from the ipsec-tools package should also be -installed. -} - -node n1 { - type router - model router - network-config { - hostname n1 - ! - interface eth3 - ip address 192.168.6.1/24 - ipv6 address 2001:6::1/64 - ! - interface eth2 - ip address 192.168.5.1/24 - ipv6 address 2001:5::1/64 - ! - interface eth1 - ip address 192.168.1.1/24 - ipv6 address 2001:1::1/64 - ! - interface eth0 - ip address 192.168.0.1/24 - ipv6 address 2001:0::1/64 - ! - } - canvas c1 - iconcoords {210.0 172.0} - labelcoords {210.0 200.0} - interface-peer {eth0 n2} - interface-peer {eth1 n3} - interface-peer {eth2 n7} - interface-peer {eth3 n8} - custom-config { - custom-config-id service:IPsec:copycerts.sh - custom-command copycerts.sh - config { - #!/bin/sh - - FILES="test1.pem test1.key ca-cert.pem" - - mkdir -p /tmp/certs - - for f in $FILES; do - cp $f /tmp/certs - done - } - } - custom-config { - custom-config-id service:IPsec:ca-cert.pem - custom-command ca-cert.pem - config { - Certificate: - Data: - Version: 3 (0x2) - Serial Number: 16615976057451940887 (0xe697ce3064d18c17) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=WA, O=CORE CA/emailAddress=root@localhost - Validity - Not Before: Sep 9 17:18:04 2013 GMT - Not After : Sep 7 17:18:04 2023 GMT - Subject: C=US, ST=WA, O=CORE CA/emailAddress=root@localhost - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:d3:0d:ab:91:72:50:ca:10:43:8d:18:d8:92:05: - 9d:d9:aa:16:2b:d1:25:f8:be:52:48:e4:e7:7a:83: - 9b:b4:3b:26:12:fa:46:23:df:09:cb:34:ba:6f:f6: - 5e:38:9c:d4:90:ea:44:ad:65:f6:bd:85:6f:ac:9f: - 4c:83:d4:10:ab:0a:0e:cd:ba:99:1a:ae:f7:b7:e2: - c3:00:0b:c1:02:69:16:c7:55:e3:cf:4c:c3:72:77: - 10:be:da:66:ce:91:b2:cc:92:e1:a8:f0:74:fe:b9: - 03:38:fc:49:97:73:bb:40:55:1b:7d:3e:41:63:02: - b5:ad:f4:33:95:76:fd:7b:61 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Subject Key Identifier: - 9A:EF:A7:36:28:06:4A:0A:2F:F9:2E:99:BE:6F:06:E1:83:9C:A2:0E - X509v3 Authority Key Identifier: - keyid:9A:EF:A7:36:28:06:4A:0A:2F:F9:2E:99:BE:6F:06:E1:83:9C:A2:0E - - X509v3 Basic Constraints: - CA:TRUE - Signature Algorithm: sha1WithRSAEncryption - 2d:88:84:20:19:9b:97:90:2d:18:86:7d:db:6c:d0:5e:ae:c2: - 55:61:af:ca:86:5b:3b:e8:15:c5:31:de:ea:d3:7e:9e:39:61: - 2e:b4:a0:93:43:bf:a2:95:f8:b6:13:b3:2f:cb:f8:fb:72:8c: - 40:95:50:db:03:cc:f7:b8:a5:d8:fb:77:88:c4:f5:f9:65:85: - 29:c8:0c:e9:ce:c9:fa:1d:4e:b2:3f:92:dc:b5:2e:73:50:c3: - c8:3e:90:9e:9a:34:ef:fd:ed:de:74:0b:19:73:6a:95:de:90: - 3b:ee:db:b0:be:14:fd:bf:3e:c6:7b:cd:7d:3c:ba:45:3c:f1: - 46:d7 - -----BEGIN CERTIFICATE----- - MIICZDCCAc2gAwIBAgIJAOaXzjBk0YwXMA0GCSqGSIb3DQEBBQUAMEsxCzAJBgNV - BAYTAlVTMQswCQYDVQQIDAJXQTEQMA4GA1UECgwHQ09SRSBDQTEdMBsGCSqGSIb3 - DQEJARYOcm9vdEBsb2NhbGhvc3QwHhcNMTMwOTA5MTcxODA0WhcNMjMwOTA3MTcx - ODA0WjBLMQswCQYDVQQGEwJVUzELMAkGA1UECAwCV0ExEDAOBgNVBAoMB0NPUkUg - Q0ExHTAbBgkqhkiG9w0BCQEWDnJvb3RAbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEB - AQUAA4GNADCBiQKBgQDTDauRclDKEEONGNiSBZ3ZqhYr0SX4vlJI5Od6g5u0OyYS - +kYj3wnLNLpv9l44nNSQ6kStZfa9hW+sn0yD1BCrCg7Nupkarve34sMAC8ECaRbH - VePPTMNydxC+2mbOkbLMkuGo8HT+uQM4/EmXc7tAVRt9PkFjArWt9DOVdv17YQID - AQABo1AwTjAdBgNVHQ4EFgQUmu+nNigGSgov+S6Zvm8G4YOcog4wHwYDVR0jBBgw - FoAUmu+nNigGSgov+S6Zvm8G4YOcog4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B - AQUFAAOBgQAtiIQgGZuXkC0Yhn3bbNBersJVYa/Khls76BXFMd7q036eOWEutKCT - Q7+ilfi2E7Mvy/j7coxAlVDbA8z3uKXY+3eIxPX5ZYUpyAzpzsn6HU6yP5LctS5z - UMPIPpCemjTv/e3edAsZc2qV3pA77tuwvhT9vz7Ge819PLpFPPFG1w== - -----END CERTIFICATE----- - - } - } - custom-config { - custom-config-id service:IPsec:test1.pem - custom-command test1.pem - config { - Certificate: - Data: - Version: 3 (0x2) - Serial Number: 16098433458223693585 (0xdf691fefe5afbf11) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=WA, O=CORE CA/emailAddress=root@localhost - Validity - Not Before: Sep 9 17:44:47 2013 GMT - Not After : Sep 7 17:44:47 2023 GMT - Subject: C=US, ST=WA, O=core-dev, CN=test1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:b3:26:ed:b6:eb:26:ea:c0:5a:d1:09:6f:d4:5f: - 8d:11:cc:3c:ff:d7:5e:37:e6:55:71:5c:eb:c9:e8: - f8:8e:a3:85:99:2c:3e:a2:8e:b2:1c:2f:fe:99:c6: - 0d:d3:ce:c0:ed:c1:e2:4d:bc:10:35:f6:61:02:b9: - 8f:cc:c5:80:d1:7f:c8:2e:2d:9a:32:9f:8a:bb:32: - ea:14:82:e0:6f:cb:3d:9d:d5:1c:f1:43:52:9f:49: - 79:f1:94:03:48:2c:91:51:c7:8f:32:90:a7:c2:c0: - 25:64:34:f1:c7:f2:ac:d5:96:87:a2:0a:fb:e5:b3: - 0b:90:bf:6f:08:75:5d:54:cb - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - OpenSSL Generated Certificate - X509v3 Subject Key Identifier: - B3:EC:1A:56:77:F9:DC:0E:60:0F:B7:69:C9:DC:43:2D:09:39:A6:1C - X509v3 Authority Key Identifier: - keyid:9A:EF:A7:36:28:06:4A:0A:2F:F9:2E:99:BE:6F:06:E1:83:9C:A2:0E - - Signature Algorithm: sha1WithRSAEncryption - c5:3f:65:1f:b6:a4:33:fd:c8:04:a1:da:07:f6:e0:3b:55:b9: - 76:b7:aa:78:55:4a:59:ad:36:7f:cb:00:1c:32:cb:fe:40:72: - eb:49:27:b4:9d:5d:05:6f:30:37:1d:49:35:5e:0b:6b:5d:c5: - 07:3d:c8:63:1f:b6:46:6d:f9:c9:52:ce:1d:1f:d9:e8:02:46: - 95:18:26:39:ec:17:fe:ae:07:cf:55:25:45:1f:8a:e4:bb:f2: - 73:d2:e1:01:c3:8e:5f:eb:e4:7e:80:44:40:e6:a1:cd:85:9b: - e8:fb:16:d0:7b:4f:ad:3b:4c:eb:bd:67:02:2c:08:2b:62:f1: - c5:0a - -----BEGIN CERTIFICATE----- - MIICgTCCAeqgAwIBAgIJAN9pH+/lr78RMA0GCSqGSIb3DQEBBQUAMEsxCzAJBgNV - BAYTAlVTMQswCQYDVQQIDAJXQTEQMA4GA1UECgwHQ09SRSBDQTEdMBsGCSqGSIb3 - DQEJARYOcm9vdEBsb2NhbGhvc3QwHhcNMTMwOTA5MTc0NDQ3WhcNMjMwOTA3MTc0 - NDQ3WjA9MQswCQYDVQQGEwJVUzELMAkGA1UECAwCV0ExETAPBgNVBAoMCGNvcmUt - ZGV2MQ4wDAYDVQQDDAV0ZXN0MTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA - sybttusm6sBa0Qlv1F+NEcw8/9deN+ZVcVzryej4jqOFmSw+oo6yHC/+mcYN087A - 7cHiTbwQNfZhArmPzMWA0X/ILi2aMp+KuzLqFILgb8s9ndUc8UNSn0l58ZQDSCyR - UcePMpCnwsAlZDTxx/Ks1ZaHogr75bMLkL9vCHVdVMsCAwEAAaN7MHkwCQYDVR0T - BAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNh - dGUwHQYDVR0OBBYEFLPsGlZ3+dwOYA+3acncQy0JOaYcMB8GA1UdIwQYMBaAFJrv - pzYoBkoKL/kumb5vBuGDnKIOMA0GCSqGSIb3DQEBBQUAA4GBAMU/ZR+2pDP9yASh - 2gf24DtVuXa3qnhVSlmtNn/LABwyy/5AcutJJ7SdXQVvMDcdSTVeC2tdxQc9yGMf - tkZt+clSzh0f2egCRpUYJjnsF/6uB89VJUUfiuS78nPS4QHDjl/r5H6AREDmoc2F - m+j7FtB7T607TOu9ZwIsCCti8cUK - -----END CERTIFICATE----- - - } - } - custom-config { - custom-config-id service:IPsec:test1.key - custom-command test1.key - config { - -----BEGIN PRIVATE KEY----- - MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALMm7bbrJurAWtEJ - b9RfjRHMPP/XXjfmVXFc68no+I6jhZksPqKOshwv/pnGDdPOwO3B4k28EDX2YQK5 - j8zFgNF/yC4tmjKfirsy6hSC4G/LPZ3VHPFDUp9JefGUA0gskVHHjzKQp8LAJWQ0 - 8cfyrNWWh6IK++WzC5C/bwh1XVTLAgMBAAECgYB1zJIgZe04DPVqYC8lURL8cfRm - MeIlFZJ3MSdlo4fUmtddCYfB8dxRxok96cnrzRZ0/7jjblamdPQDC6rvdaqmfLFx - nJ/RVhCj6HqDMrQnv/9tnl6UQmkaYSnYvTn2GgmpqvBf9RUQk4+kjwgRgdqKxaIz - oH8j0ZxMh2DOZuzJMQJBAOJwEnbG085q2k1Qg8PQz0cpVG9QCE3sJUNs0hMPC7dk - IzknFtidlpCf6NMboJ2Nt9dzmJmKLqWb3oauyQRQA6MCQQDKin0wElLV1268IbcF - RXhkVlxcg5fDEazeNL9p1z5vmwaq0IcLtSPrIaect2hacCkfJoREhcA+f9YIpcod - lby5AkEApyXla0ofpXqYxIOPkGc96qCmlDh2uNZ9N0VH2Qu9MVW47oJdSe8h6oYv - /k2hhUvMjjzlQ0mOX28slyzEc+uAkwJAWlAsiE3zX+UjPIJwIMqcZ2lW3+3Rsyrj - gWXV4HUZIxzmeS5ouWC5NnSYT7o8ru8KdxhurDtTwMqx/sMmf9CwCQJAIDbMwwIs - XStw0y/M9+hdPUkccVoHyXKPTensyX/miAUwHZN/oadGUUOZO7XBKb1uNFv1uowU - 29bGgXa+mvb6aA== - -----END PRIVATE KEY----- - - } - } - custom-config { - custom-config-id service:IPsec:ipsec.sh - custom-command ipsec.sh - config { - #!/bin/sh - # set up static tunnel mode security assocation for service (security.py) - # -------- CUSTOMIZATION REQUIRED -------- - # - # The IPsec service builds ESP tunnels between the specified peers using the - # racoon IKEv2 keying daemon. You need to provide keys and the addresses of - # peers, along with subnets to tunnel. - - # directory containing the certificate and key described below - keydir=/tmp/certs - - # the name used for the "$certname.pem" x509 certificate and - # "$certname.key" RSA private key, which can be generated using openssl - certname=test1 - - # list the public-facing IP addresses, starting with the localhost and followed - # by each tunnel peer, separated with a single space - tunnelhosts="192.168.0.1AND192.168.0.2 192.168.1.1AND192.168.1.2" - - # Define T where i is the index for each tunnel peer host from - # the tunnel_hosts list above (0 is localhost). - # T is a list of IPsec tunnels with peer i, with a local subnet address - # followed by the remote subnet address: - # T="AND AND" - # For example, 192.168.0.0/24 is a local network (behind this node) to be - # tunneled and 192.168.2.0/24 is a remote network (behind peer 1) - T1="192.168.5.0/24AND192.168.8.0/24" - T2="192.168.5.0/24AND192.168.4.0/24 192.168.6.0/24AND192.168.4.0/24" - - # -------- END CUSTOMIZATION -------- - - echo "building config $PWD/ipsec.conf..." - echo "building config $PWD/ipsec.conf..." > $PWD/ipsec.log - - checkip=0 - if [ "$(dpkg -l | grep " sipcalc ")" = "" ]; then - echo "WARNING: ip validation disabled because package sipcalc not installed - " >> $PWD/ipsec.log - checkip=1 - fi - - echo "#!/usr/sbin/setkey -f - # Flush the SAD and SPD - flush; - spdflush; - - # Security policies \ - " > $PWD/ipsec.conf - i=0 - for hostpair in $tunnelhosts; do - i=`expr $i + 1` - # parse tunnel host IP - thishost=${hostpair%%AND*} - peerhost=${hostpair##*AND} - if [ $checkip = "0" ] && - [ "$(sipcalc "$thishost" "$peerhost" | grep ERR)" != "" ]; then - echo "ERROR: invalid host address $thishost or $peerhost \ - " >> $PWD/ipsec.log - fi - # parse each tunnel addresses - tunnel_list_var_name=T$i - eval tunnels="$"$tunnel_list_var_name"" - for ttunnel in $tunnels; do - lclnet=${ttunnel%%AND*} - rmtnet=${ttunnel##*AND} - if [ $checkip = "0" ] && - [ "$(sipcalc "$lclnet" "$rmtnet"| grep ERR)" != "" ]; then - echo "ERROR: invalid tunnel address $lclnet and $rmtnet \ - " >> $PWD/ipsec.log - fi - # add tunnel policies - echo " - spdadd $lclnet $rmtnet any -P out ipsec - esp/tunnel/$thishost-$peerhost/require; - spdadd $rmtnet $lclnet any -P in ipsec - esp/tunnel/$peerhost-$thishost/require; \ - " >> $PWD/ipsec.conf - done - done - - echo "building config $PWD/racoon.conf..." - if [ ! -e $keydir\/$certname.key ] || [ ! -e $keydir\/$certname.pem ]; then - echo "ERROR: missing certification files under $keydir \ - $certname.key or $certname.pem " >> $PWD/ipsec.log - fi - echo " - path certificate \"$keydir\"; - listen { - adminsock disabled; - } - remote anonymous - { - exchange_mode main; - certificate_type x509 \"$certname.pem\" \"$certname.key\"; - ca_type x509 \"ca-cert.pem\"; - my_identifier asn1dn; - peers_identifier asn1dn; - - proposal { - encryption_algorithm 3des ; - hash_algorithm sha1; - authentication_method rsasig ; - dh_group modp768; - } - } - sainfo anonymous - { - pfs_group modp768; - lifetime time 1 hour ; - encryption_algorithm 3des, blowfish 448, rijndael ; - authentication_algorithm hmac_sha1, hmac_md5 ; - compression_algorithm deflate ; - } - " > $PWD/racoon.conf - - # the setkey program is required from the ipsec-tools package - echo "running setkey -f $PWD/ipsec.conf..." - setkey -f $PWD/ipsec.conf - - echo "running racoon -d -f $PWD/racoon.conf..." - racoon -d -f $PWD/racoon.conf -l racoon.log - - } - } - custom-config { - custom-config-id service:IPsec - custom-command IPsec - config { - files=('ipsec.sh', 'test1.key', 'test1.pem', 'ca-cert.pem', 'copycerts.sh', ) - } - } - services {zebra OSPFv2 OSPFv3 IPForward IPsec} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif -} - -node n2 { - type router - model router - network-config { - hostname n2 - ! - interface eth3 - ip address 192.168.8.1/24 - ipv6 address 2001:8::1/64 - ! - interface eth2 - ip address 192.168.7.1/24 - ipv6 address 2001:7::1/64 - ! - interface eth1 - ip address 192.168.2.1/24 - ipv6 address 2001:2::1/64 - ! - interface eth0 - ip address 192.168.0.2/24 - ipv6 address 2001:0::2/64 - ! - } - canvas c1 - iconcoords {455.0 173.0} - labelcoords {455.0 201.0} - interface-peer {eth0 n1} - interface-peer {eth1 n4} - interface-peer {eth2 n9} - interface-peer {eth3 n10} - custom-config { - custom-config-id service:IPsec:ipsec.sh - custom-command ipsec.sh - config { - #!/bin/sh - # set up static tunnel mode security assocation for service (security.py) - # -------- CUSTOMIZATION REQUIRED -------- - # - # The IPsec service builds ESP tunnels between the specified peers using the - # racoon IKEv2 keying daemon. You need to provide keys and the addresses of - # peers, along with subnets to tunnel. - - # directory containing the certificate and key described below - keydir=/tmp/certs - - # the name used for the "$certname.pem" x509 certificate and - # "$certname.key" RSA private key, which can be generated using openssl - certname=test1 - - # list the public-facing IP addresses, starting with the localhost and followed - # by each tunnel peer, separated with a single space - tunnelhosts="192.168.0.2AND192.168.0.1" - - # Define T where i is the index for each tunnel peer host from - # the tunnel_hosts list above (0 is localhost). - # T is a list of IPsec tunnels with peer i, with a local subnet address - # followed by the remote subnet address: - # T="AND AND" - # For example, 192.168.0.0/24 is a local network (behind this node) to be - # tunneled and 192.168.2.0/24 is a remote network (behind peer 1) - T1="192.168.8.0/24AND192.168.5.0/24" - - # -------- END CUSTOMIZATION -------- - - echo "building config $PWD/ipsec.conf..." - echo "building config $PWD/ipsec.conf..." > $PWD/ipsec.log - - checkip=0 - if [ "$(dpkg -l | grep " sipcalc ")" = "" ]; then - echo "WARNING: ip validation disabled because package sipcalc not installed - " >> $PWD/ipsec.log - checkip=1 - fi - - echo "#!/usr/sbin/setkey -f - # Flush the SAD and SPD - flush; - spdflush; - - # Security policies \ - " > $PWD/ipsec.conf - i=0 - for hostpair in $tunnelhosts; do - i=`expr $i + 1` - # parse tunnel host IP - thishost=${hostpair%%AND*} - peerhost=${hostpair##*AND} - if [ $checkip = "0" ] && - [ "$(sipcalc "$thishost" "$peerhost" | grep ERR)" != "" ]; then - echo "ERROR: invalid host address $thishost or $peerhost \ - " >> $PWD/ipsec.log - fi - # parse each tunnel addresses - tunnel_list_var_name=T$i - eval tunnels="$"$tunnel_list_var_name"" - for ttunnel in $tunnels; do - lclnet=${ttunnel%%AND*} - rmtnet=${ttunnel##*AND} - if [ $checkip = "0" ] && - [ "$(sipcalc "$lclnet" "$rmtnet"| grep ERR)" != "" ]; then - echo "ERROR: invalid tunnel address $lclnet and $rmtnet \ - " >> $PWD/ipsec.log - fi - # add tunnel policies - echo " - spdadd $lclnet $rmtnet any -P out ipsec - esp/tunnel/$thishost-$peerhost/require; - spdadd $rmtnet $lclnet any -P in ipsec - esp/tunnel/$peerhost-$thishost/require; \ - " >> $PWD/ipsec.conf - done - done - - echo "building config $PWD/racoon.conf..." - if [ ! -e $keydir\/$certname.key ] || [ ! -e $keydir\/$certname.pem ]; then - echo "ERROR: missing certification files under $keydir \ - $certname.key or $certname.pem " >> $PWD/ipsec.log - fi - echo " - path certificate \"$keydir\"; - listen { - adminsock disabled; - } - remote anonymous - { - exchange_mode main; - certificate_type x509 \"$certname.pem\" \"$certname.key\"; - ca_type x509 \"ca-cert.pem\"; - my_identifier asn1dn; - peers_identifier asn1dn; - - proposal { - encryption_algorithm 3des ; - hash_algorithm sha1; - authentication_method rsasig ; - dh_group modp768; - } - } - sainfo anonymous - { - pfs_group modp768; - lifetime time 1 hour ; - encryption_algorithm 3des, blowfish 448, rijndael ; - authentication_algorithm hmac_sha1, hmac_md5 ; - compression_algorithm deflate ; - } - " > $PWD/racoon.conf - - # the setkey program is required from the ipsec-tools package - echo "running setkey -f $PWD/ipsec.conf..." - setkey -f $PWD/ipsec.conf - - echo "running racoon -d -f $PWD/racoon.conf..." - racoon -d -f $PWD/racoon.conf -l racoon.log - - } - } - services {zebra OSPFv2 OSPFv3 IPForward IPsec} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif -} - -node n3 { - type router - model router - network-config { - hostname n3 - ! - interface eth2 - ip address 192.168.4.1/24 - ipv6 address 2001:4::1/64 - ! - interface eth1 - ip address 192.168.3.1/24 - ipv6 address 2001:3::1/64 - ! - interface eth0 - ip address 192.168.1.2/24 - ipv6 address 2001:1::2/64 - ! - } - canvas c1 - iconcoords {211.0 375.0} - labelcoords {211.0 403.0} - interface-peer {eth0 n1} - interface-peer {eth1 n5} - interface-peer {eth2 n6} - custom-config { - custom-config-id service:IPsec:ipsec.sh - custom-command ipsec.sh - config { - #!/bin/sh - # set up static tunnel mode security assocation for service (security.py) - # -------- CUSTOMIZATION REQUIRED -------- - # - # The IPsec service builds ESP tunnels between the specified peers using the - # racoon IKEv2 keying daemon. You need to provide keys and the addresses of - # peers, along with subnets to tunnel. - - # directory containing the certificate and key described below - keydir=/tmp/certs - - # the name used for the "$certname.pem" x509 certificate and - # "$certname.key" RSA private key, which can be generated using openssl - certname=test1 - - # list the public-facing IP addresses, starting with the localhost and followed - # by each tunnel peer, separated with a single space - tunnelhosts="192.168.1.2AND192.168.1.1" - - # Define T where i is the index for each tunnel peer host from - # the tunnel_hosts list above (0 is localhost). - # T is a list of IPsec tunnels with peer i, with a local subnet address - # followed by the remote subnet address: - # T="AND AND" - # For example, 192.168.0.0/24 is a local network (behind this node) to be - # tunneled and 192.168.2.0/24 is a remote network (behind peer 1) - T1="192.168.4.0/24AND192.168.5.0/24 192.168.4.0/24AND192.168.6.0/24" - - # -------- END CUSTOMIZATION -------- - - echo "building config $PWD/ipsec.conf..." - echo "building config $PWD/ipsec.conf..." > $PWD/ipsec.log - - checkip=0 - if [ "$(dpkg -l | grep " sipcalc ")" = "" ]; then - echo "WARNING: ip validation disabled because package sipcalc not installed - " >> $PWD/ipsec.log - checkip=1 - fi - - echo "#!/usr/sbin/setkey -f - # Flush the SAD and SPD - flush; - spdflush; - - # Security policies \ - " > $PWD/ipsec.conf - i=0 - for hostpair in $tunnelhosts; do - i=`expr $i + 1` - # parse tunnel host IP - thishost=${hostpair%%AND*} - peerhost=${hostpair##*AND} - if [ $checkip = "0" ] && - [ "$(sipcalc "$thishost" "$peerhost" | grep ERR)" != "" ]; then - echo "ERROR: invalid host address $thishost or $peerhost \ - " >> $PWD/ipsec.log - fi - # parse each tunnel addresses - tunnel_list_var_name=T$i - eval tunnels="$"$tunnel_list_var_name"" - for ttunnel in $tunnels; do - lclnet=${ttunnel%%AND*} - rmtnet=${ttunnel##*AND} - if [ $checkip = "0" ] && - [ "$(sipcalc "$lclnet" "$rmtnet"| grep ERR)" != "" ]; then - echo "ERROR: invalid tunnel address $lclnet and $rmtnet \ - " >> $PWD/ipsec.log - fi - # add tunnel policies - echo " - spdadd $lclnet $rmtnet any -P out ipsec - esp/tunnel/$thishost-$peerhost/require; - spdadd $rmtnet $lclnet any -P in ipsec - esp/tunnel/$peerhost-$thishost/require; \ - " >> $PWD/ipsec.conf - done - done - - echo "building config $PWD/racoon.conf..." - if [ ! -e $keydir\/$certname.key ] || [ ! -e $keydir\/$certname.pem ]; then - echo "ERROR: missing certification files under $keydir \ - $certname.key or $certname.pem " >> $PWD/ipsec.log - fi - echo " - path certificate \"$keydir\"; - listen { - adminsock disabled; - } - remote anonymous - { - exchange_mode main; - certificate_type x509 \"$certname.pem\" \"$certname.key\"; - ca_type x509 \"ca-cert.pem\"; - my_identifier asn1dn; - peers_identifier asn1dn; - - proposal { - encryption_algorithm 3des ; - hash_algorithm sha1; - authentication_method rsasig ; - dh_group modp768; - } - } - sainfo anonymous - { - pfs_group modp768; - lifetime time 1 hour ; - encryption_algorithm 3des, blowfish 448, rijndael ; - authentication_algorithm hmac_sha1, hmac_md5 ; - compression_algorithm deflate ; - } - " > $PWD/racoon.conf - - # the setkey program is required from the ipsec-tools package - echo "running setkey -f $PWD/ipsec.conf..." - setkey -f $PWD/ipsec.conf - - echo "running racoon -d -f $PWD/racoon.conf..." - racoon -d -f $PWD/racoon.conf -l racoon.log - - } - } - services {zebra OSPFv2 OSPFv3 IPForward IPsec} - custom-image $CORE_DATA_DIR/icons/normal/router_red.gif -} - -node n4 { - type router - model router - network-config { - hostname n4 - ! - interface eth1 - ip address 192.168.9.1/24 - ipv6 address 2001:9::1/64 - ! - interface eth0 - ip address 192.168.2.2/24 - ipv6 address 2001:2::2/64 - ! - } - canvas c1 - iconcoords {456.0 376.0} - labelcoords {456.0 404.0} - interface-peer {eth0 n2} - interface-peer {eth1 n11} -} - -node n5 { - type router - model host - network-config { - hostname n5 - ! - interface eth0 - ip address 192.168.3.10/24 - ipv6 address 2001:3::10/64 - ! - } - canvas c1 - iconcoords {50.0 472.0} - labelcoords {50.0 504.0} - interface-peer {eth0 n3} -} - -node n6 { - type router - model host - network-config { - hostname n6 - ! - interface eth0 - ip address 192.168.4.10/24 - ipv6 address 2001:4::10/64 - ! - } - canvas c1 - iconcoords {44.0 292.0} - labelcoords {44.0 324.0} - interface-peer {eth0 n3} -} - -node n7 { - type router - model host - network-config { - hostname n7 - ! - interface eth0 - ip address 192.168.5.10/24 - ipv6 address 2001:5::10/64 - ! - } - canvas c1 - iconcoords {41.0 62.0} - labelcoords {41.0 94.0} - interface-peer {eth0 n1} -} - -node n8 { - type router - model host - network-config { - hostname n8 - ! - interface eth0 - ip address 192.168.6.10/24 - ipv6 address 2001:6::10/64 - ! - } - canvas c1 - iconcoords {39.0 121.0} - labelcoords {39.0 153.0} - interface-peer {eth0 n1} -} - -node n9 { - type router - model host - network-config { - hostname n9 - ! - interface eth0 - ip address 192.168.7.10/24 - ipv6 address 2001:7::10/64 - ! - } - canvas c1 - iconcoords {653.0 69.0} - labelcoords {653.0 101.0} - interface-peer {eth0 n2} -} - -node n10 { - type router - model host - network-config { - hostname n10 - ! - interface eth0 - ip address 192.168.8.10/24 - ipv6 address 2001:8::10/64 - ! - } - canvas c1 - iconcoords {454.0 48.0} - labelcoords {484.0 59.0} - interface-peer {eth0 n2} -} - -node n11 { - type router - model host - network-config { - hostname n11 - ! - interface eth0 - ip address 192.168.9.10/24 - ipv6 address 2001:9::10/64 - ! - } - canvas c1 - iconcoords {654.0 460.0} - labelcoords {654.0 492.0} - interface-peer {eth0 n4} -} - -link l1 { - nodes {n1 n2} - bandwidth 0 -} - -link l2 { - nodes {n1 n3} - bandwidth 0 -} - -link l3 { - nodes {n2 n4} - bandwidth 0 -} - -link l4 { - nodes {n3 n5} - bandwidth 0 -} - -link l5 { - nodes {n3 n6} - bandwidth 0 -} - -link l6 { - nodes {n1 n7} - bandwidth 0 -} - -link l7 { - nodes {n1 n8} - bandwidth 0 -} - -link l8 { - nodes {n2 n9} - bandwidth 0 -} - -link l9 { - nodes {n2 n10} - bandwidth 0 -} - -link l10 { - nodes {n4 n11} - bandwidth 0 -} - -annotation a1 { - iconcoords {8.0 6.0 514.0 99.0} - type rectangle - label {Tunnel 1} - labelcolor black - fontfamily {Arial} - fontsize {12} - color #ffd0d0 - width 0 - border #00ff00 - rad 22 - canvas c1 -} - -annotation a2 { - iconcoords {8.0 6.0 137.0 334.0} - type rectangle - label {Tunnel 2} - labelcolor black - fontfamily {Arial} - fontsize {12} - color #ffe1e1 - width 0 - border black - rad 23 - canvas c1 -} - -annotation a5 { - iconcoords {263.0 127.0} - type text - label {} - labelcolor black - fontfamily {Arial} - fontsize {12} - effects {underline} - canvas c1 -} - -canvas c1 { - name {Canvas1} -} - -option global { - interface_names yes - ip_addresses yes - ipv6_addresses no - node_labels yes - link_labels yes - ipsec_configs yes - exec_errors yes - show_api no - background_images no - annotations yes - grid yes - traffic_start 0 -} - diff --git a/gui/configs/sample9-vpn.imn b/gui/configs/sample9-vpn.imn deleted file mode 100644 index 095c2db4..00000000 --- a/gui/configs/sample9-vpn.imn +++ /dev/null @@ -1,1015 +0,0 @@ -comments { -Sample scenario showing VPNClient and VPNServer service configuration. - -This topology features an OpenVPN client and server for virtual private -networking. The client can access the private 10.0.6.0/24 network via the VPN -server. First wait until routing converges in the center routers (try using the -Adjacency Widget and wait for blue lines, meaning full adjacencies), then open -a shell on the vpnclient and try pinging the private address of the vpnserver: - - vpnclient> ping 10.0.6.1 - -You can also access the other 10.0.6.* hosts behind the server. Try running -tcpudmp on one of the center routers, e.g. the n2 eth1/10.0.5.2 interface, and -you'll see UDP packets with TLS encrypted data instead of ICMP packets. - -Keys are included as extra files in the VPNClient and VPNServer service -configuration. -} - -node n1 { - type router - model router - network-config { - hostname n1 - ! - interface eth2 - ip address 10.0.4.2/24 - ipv6 address 2001:4::2/64 - ! - interface eth1 - ip address 10.0.2.1/24 - ipv6 address 2001:2::1/64 - ! - interface eth0 - ip address 10.0.0.1/24 - ipv6 address 2001:0::1/64 - ! - } - canvas c1 - iconcoords {297.0 236.0} - labelcoords {297.0 264.0} - interface-peer {eth0 n6} - interface-peer {eth1 n2} - interface-peer {eth2 n3} -} - -node n2 { - type router - model router - network-config { - hostname n2 - ! - interface eth1 - ip address 10.0.5.2/24 - ipv6 address 2001:5::2/64 - ! - interface eth0 - ip address 10.0.2.2/24 - ipv6 address 2001:2::2/64 - ! - } - canvas c1 - iconcoords {298.0 432.0} - labelcoords {298.0 460.0} - interface-peer {eth0 n1} - interface-peer {eth1 n4} -} - -node n3 { - type router - model router - network-config { - hostname n3 - ! - interface eth1 - ip address 10.0.4.1/24 - ipv6 address 2001:4::1/64 - ! - interface eth0 - ip address 10.0.3.1/24 - ipv6 address 2001:3::1/64 - ! - } - canvas c1 - iconcoords {573.0 233.0} - labelcoords {573.0 261.0} - interface-peer {eth0 n4} - interface-peer {eth1 n1} -} - -node n4 { - type router - model router - network-config { - hostname n4 - ! - interface eth2 - ip address 10.0.5.1/24 - ipv6 address 2001:5::1/64 - ! - interface eth1 - ip address 10.0.3.2/24 - ipv6 address 2001:3::2/64 - ! - interface eth0 - ip address 10.0.1.1/24 - ipv6 address 2001:1::1/64 - ! - } - canvas c1 - iconcoords {574.0 429.0} - labelcoords {574.0 457.0} - interface-peer {eth0 n5} - interface-peer {eth1 n3} - interface-peer {eth2 n2} -} - -node n5 { - type router - model host - network-config { - hostname vpnserver - ! - interface eth1 - ipv6 address 2001:6::10/64 - ip address 10.0.6.1/24 - ! - interface eth0 - ip address 10.0.1.10/24 - ipv6 address 2001:1::10/64 - ! - } - canvas c1 - iconcoords {726.0 511.0} - labelcoords {726.0 543.0} - interface-peer {eth0 n4} - interface-peer {eth1 n7} - custom-config { - custom-config-id service:VPNServer:vpnserver.pem - custom-command vpnserver.pem - config { - Certificate: - Data: - Version: 3 (0x2) - Serial Number: 1 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=WA, O=core-dev/emailAddress=root@localhost - Validity - Not Before: May 19 02:09:57 2015 GMT - Not After : Apr 25 02:09:57 2115 GMT - Subject: C=US, ST=WA, O=core-dev, CN=vpnserver/emailAddress=root@localhost - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:d2:88:b2:9b:32:ac:38:ca:45:e0:6b:db:1c:92: - 5d:9a:42:23:df:64:a0:3b:c2:c4:f2:3a:75:bb:d6: - 54:12:61:6e:aa:ac:0f:a6:2e:d9:3b:63:dc:3d:48: - 02:f1:36:c8:97:d3:ef:24:6f:7f:dd:b7:9a:9d:6d: - c1:c9:e2:11:49:1c:e0:67:d6:b0:b7:62:84:9a:f8: - c3:af:4f:f7:77:29:74:01:81:47:49:84:d6:1c:0c: - 36:41:42:a2:3e:92:28:83:50:7a:9c:fd:f3:66:7c: - f8:d9:c7:f6:63:d2:59:d2:fd:9a:a4:9b:75:a6:16: - ec:37:de:05:dd:05:a2:31:65:79:66:eb:b3:82:41: - af:b9:e8:4a:bc:02:d6:a1:68:49:6c:09:e1:c5:9f: - 3e:cf:52:76:d9:63:65:7a:a5:34:75:ee:ce:a3:c6: - 92:f3:0d:2f:7f:b0:b4:12:fe:44:5f:77:10:25:98: - b2:45:af:69:c8:9b:13:fc:f9:de:c6:be:b5:cf:62: - 06:01:32:71:d5:84:1d:14:b9:28:46:80:f6:98:35: - 12:e4:c8:e4:7a:94:e5:99:a3:6b:34:de:be:33:fe: - 63:21:a3:cc:c4:64:15:49:e0:9d:57:84:b9:11:e5: - 05:79:ba:22:6e:e4:24:b0:64:f0:54:13:1a:f4:73: - 8a:ff - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Cert Type: - SSL Server - Netscape Comment: - OpenSSL Generated Server Certificate - X509v3 Subject Key Identifier: - A5:A6:80:4D:3C:CD:E2:FE:AD:32:FD:9D:B2:7C:B6:00:76:16:C0:41 - X509v3 Authority Key Identifier: - keyid:DB:D2:9C:8D:22:D9:D7:E2:38:A0:8D:6C:3B:BE:33:CE:8D:2A:BE:C8 - DirName:/C=US/ST=WA/O=core-dev/emailAddress=root@localhost - serial:CE:78:96:91:DB:9B:84:FD - - X509v3 Extended Key Usage: - TLS Web Server Authentication - X509v3 Key Usage: - Digital Signature, Key Encipherment - Signature Algorithm: sha256WithRSAEncryption - 3b:40:af:3a:c0:95:10:bc:d4:63:4a:1b:0f:9d:af:9c:27:29: - 34:c9:80:dc:c2:2d:72:40:0e:50:15:fe:b4:87:bc:59:56:de: - 81:96:1f:4f:ec:1a:44:ce:23:ba:69:b1:f5:ed:4b:1a:22:cf: - 16:17:29:f9:bb:69:12:3c:42:87:09:48:26:a2:b3:88:40:3e: - 3c:06:92:e1:65:6e:c0:62:50:55:08:5d:a0:4b:3a:0f:ff:9d: - 65:91:b9:bf:d3:69:b9:ac:27:83:2c:fd:5a:bd:58:d3:75:a0: - 70:e6:21:e9:f0:0d:19:a6:5f:2b:2d:1f:c9:fb:72:73:06:40: - 32:5a:f8:81:30:59:b7:cb:3a:a7:3e:6f:af:4c:4b:57:eb:4a: - d8:24:65:13:c3:86:fd:35:d3:6d:a0:3a:4b:63:40:9e:b4:98: - e0:a2:c7:f2:71:42:d5:08:72:95:fd:df:8f:05:e9:68:a8:f8: - 13:db:e6:0a:ec:c2:df:29:65:33:52:57:52:e5:7e:1d:09:2c: - 56:0b:cc:d3:2d:dd:46:72:f0:cb:8b:2d:53:c4:d3:9d:63:a6: - 6e:9f:dd:1a:7c:b2:87:d1:9e:4e:a0:b2:36:85:4a:5e:89:f9: - 01:82:94:3d:3a:86:17:84:48:d4:0c:c4:25:25:54:3f:d7:65: - 6b:85:c2:44:b3:6a:f5:74:69:f4:be:b2:13:68:a0:99:82:88: - 07:23:8e:a3:67:e0:88:07:fe:fd:ba:85:f8:8a:1f:ac:1e:7d: - ac:1e:f9:d1:3d:a8:fd:d9:91:9e:b2:3d:4f:f1:b4:80:9e:0b: - aa:bb:44:6a:20:08:68:a4:45:0e:21:21:4d:d1:5f:ab:a8:96: - 5a:29:e1:0f:9a:ff:a4:58:c6:80:15:51:98:ac:3c:23:4e:9e: - 8f:a2:34:c1:f6:4c:26:f0:33:8d:db:15:b9:30:03:a7:b3:17: - 31:9f:9a:5a:e7:a1:10:5e:61:57:04:bf:9a:6f:ec:87:15:4e: - 33:2a:0c:e4:4a:b0:66:ab:04:7a:32:4d:66:44:af:d9:ad:41: - a9:b1:05:c4:7d:2a:ba:2b:bb:c9:1e:5a:ff:cd:e0:e3:54:39: - b6:be:e2:70:6c:db:e6:71:dc:27:7e:ef:e9:11:1f:cb:fa:cd: - e1:57:a9:b9:ba:d6:69:fc:c0:d7:57:b0:51:4d:c4:2a:2f:1b: - 99:fc:b7:65:11:99:fe:0b:58:4e:11:aa:06:c6:e1:53:20:c7: - 56:0a:de:a6:65:c1:a6:41:e1:7b:1d:d7:17:45:b0:e4:66:50: - 26:d8:85:c3:c3:93:2d:df:b0:35:6d:29:9a:6b:cc:cc:75:de: - cf:72:37:8b:2d:24:b2:45 - -----BEGIN CERTIFICATE----- - MIIFQTCCAymgAwIBAgIBATANBgkqhkiG9w0BAQsFADBMMQswCQYDVQQGEwJVUzEL - MAkGA1UECBMCV0ExETAPBgNVBAoTCGNvcmUtZGV2MR0wGwYJKoZIhvcNAQkBFg5y - b290QGxvY2FsaG9zdDAgFw0xNTA1MTkwMjA5NTdaGA8yMTE1MDQyNTAyMDk1N1ow - YDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMREwDwYDVQQKEwhjb3JlLWRldjES - MBAGA1UEAxMJdnBuc2VydmVyMR0wGwYJKoZIhvcNAQkBFg5yb290QGxvY2FsaG9z - dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANKIspsyrDjKReBr2xyS - XZpCI99koDvCxPI6dbvWVBJhbqqsD6Yu2Ttj3D1IAvE2yJfT7yRvf923mp1twcni - EUkc4GfWsLdihJr4w69P93cpdAGBR0mE1hwMNkFCoj6SKINQepz982Z8+NnH9mPS - WdL9mqSbdaYW7DfeBd0FojFleWbrs4JBr7noSrwC1qFoSWwJ4cWfPs9SdtljZXql - NHXuzqPGkvMNL3+wtBL+RF93ECWYskWvacibE/z53sa+tc9iBgEycdWEHRS5KEaA - 9pg1EuTI5HqU5ZmjazTevjP+YyGjzMRkFUngnVeEuRHlBXm6Im7kJLBk8FQTGvRz - iv8CAwEAAaOCARYwggESMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMG - CWCGSAGG+EIBDQQmFiRPcGVuU1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNh - dGUwHQYDVR0OBBYEFKWmgE08zeL+rTL9nbJ8tgB2FsBBMHwGA1UdIwR1MHOAFNvS - nI0i2dfiOKCNbDu+M86NKr7IoVCkTjBMMQswCQYDVQQGEwJVUzELMAkGA1UECBMC - V0ExETAPBgNVBAoTCGNvcmUtZGV2MR0wGwYJKoZIhvcNAQkBFg5yb290QGxvY2Fs - aG9zdIIJAM54lpHbm4T9MBMGA1UdJQQMMAoGCCsGAQUFBwMBMAsGA1UdDwQEAwIF - oDANBgkqhkiG9w0BAQsFAAOCAgEAO0CvOsCVELzUY0obD52vnCcpNMmA3MItckAO - UBX+tIe8WVbegZYfT+waRM4jummx9e1LGiLPFhcp+btpEjxChwlIJqKziEA+PAaS - 4WVuwGJQVQhdoEs6D/+dZZG5v9Npuawngyz9Wr1Y03WgcOYh6fANGaZfKy0fyfty - cwZAMlr4gTBZt8s6pz5vr0xLV+tK2CRlE8OG/TXTbaA6S2NAnrSY4KLH8nFC1Qhy - lf3fjwXpaKj4E9vmCuzC3yllM1JXUuV+HQksVgvM0y3dRnLwy4stU8TTnWOmbp/d - Gnyyh9GeTqCyNoVKXon5AYKUPTqGF4RI1AzEJSVUP9dla4XCRLNq9XRp9L6yE2ig - mYKIByOOo2fgiAf+/bqF+IofrB59rB750T2o/dmRnrI9T/G0gJ4LqrtEaiAIaKRF - DiEhTdFfq6iWWinhD5r/pFjGgBVRmKw8I06ej6I0wfZMJvAzjdsVuTADp7MXMZ+a - WuehEF5hVwS/mm/shxVOMyoM5EqwZqsEejJNZkSv2a1BqbEFxH0quiu7yR5a/83g - 41Q5tr7icGzb5nHcJ37v6REfy/rN4VepubrWafzA11ewUU3EKi8bmfy3ZRGZ/gtY - ThGqBsbhUyDHVgrepmXBpkHhex3XF0Ww5GZQJtiFw8OTLd+wNW0pmmvMzHXez3I3 - iy0kskU= - -----END CERTIFICATE----- - } - } - custom-config { - custom-config-id service:VPNServer:vpnserver.key - custom-command vpnserver.key - config { - -----BEGIN PRIVATE KEY----- - MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDSiLKbMqw4ykXg - a9sckl2aQiPfZKA7wsTyOnW71lQSYW6qrA+mLtk7Y9w9SALxNsiX0+8kb3/dt5qd - bcHJ4hFJHOBn1rC3YoSa+MOvT/d3KXQBgUdJhNYcDDZBQqI+kiiDUHqc/fNmfPjZ - x/Zj0lnS/Zqkm3WmFuw33gXdBaIxZXlm67OCQa+56Eq8AtahaElsCeHFnz7PUnbZ - Y2V6pTR17s6jxpLzDS9/sLQS/kRfdxAlmLJFr2nImxP8+d7GvrXPYgYBMnHVhB0U - uShGgPaYNRLkyOR6lOWZo2s03r4z/mMho8zEZBVJ4J1XhLkR5QV5uiJu5CSwZPBU - Exr0c4r/AgMBAAECggEATaktMUC09NHwisNedSCstI13TB2DWegT3EKiUWLTamBU - gVKtByE68sR4ZoacxzvtLMx555fVtATZXP8yv/TLaYvkX4l7cHo/7iabkJzP7T32 - U+PLVxxQGtKKZPJehPRHS4ExaZ3n3kN1TGiNw+7BQapZFCVgdZ75DfaxdQFx/gQD - 4htDr7SZL/jG1Sn08Cf7DRQ9U0rISecmm9nG9LV1LXMfnbdWTwvmm/z0a6wjDZ4n - Byfd5jOOI4cpgetHhAQCH+ksComY0GBf21MOsfQT/NzfuW/KFGag992Yub8tBUFa - AG+SlaNZBiLAPYfMegjCxR1jZeUCthlB2kdzYKcmyQKBgQD4lgbktGO/VKjnKnGD - SR8oJT82HvkfB16M/pSlTNOTmAAbbY9yMNj/zKPJDOhxHLhFxmXqVnvs70Ye+pfT - 3o3v0NkAfdIhzNzqbFlUA15QqELhrXHaTtpU3/nyw+/lQhoiEof9yj9vuGBy4iDf - GdP1R8G7OWqJIDXwZd3s99XujQKBgQDY0CPvCe1j43wfG8MjI/bLeDWmxjGaLWJu - IKbMepEbqcaz9x+25Ey3E35DYtfLjeAQ+qRc5T4Cj6L9iG/mS89/ShPGj91xyFzQ - qoZf4lGB0/A80aTgmDiF4FxHFzWpXKaJPS1gTfWZ9Qs7r0LP8Uwni9dhO8LGPNAr - 9Ky3jaHyuwKBgQDxml74yZpoyw+eHVJWFyuBCTJ2l4Po9HCg+I3gWtsICCOShNl2 - UqOVen91WGZSCWfP6RQEvimUDrpIQaZu9U9eVc2S/LbOwx2zebsYPG3eVqsqTDjr - xNfOxiFYIbd3Ste7ZedmcrtVCg4zmjP4olGvgx53qUYyIGxMSbV4KyhxwQKBgQCQ - ba7SSLGrrdl8O5k1Knr3tb8/tp1KUFtWc0fJxQgu/lzQe5nT0qdL+Z9NsmWAQqV1 - ihG9lDRHrnlsHNw19GBoMeeUiTeB2XACzOWwr+mN66oISbtkpeJZREkUTmC/zmld - 2LQGiEhIY9U00B5YuSv62AwEyLOKLO6bqWT47U9piwKBgQDm2+ufGU+ZBr0qpyCf - TiZFngJ1fGK0tyVrERm1y83vWzbqaW9nX5hJilqYDB3jpHARvbY56+jWVSm4ADwG - dlqEpmPHBgDRYBkdLUl50TN5vINcXQCGlA0zOHAueAUESyL5nLnO7NsK/McSRDd5 - XonR43XumudHzs3R6BwBTKv1gw== - -----END PRIVATE KEY----- - } - } - custom-config { - custom-config-id service:VPNServer:vpnserver.sh - custom-command vpnserver.sh - config { - #!/bin/sh - # custom VPN Server Configuration for service (security.py) - # -------- CUSTOMIZATION REQUIRED -------- - # - # The VPNServer service sets up the OpenVPN server for building VPN tunnels - # that allow access via TUN/TAP device to private networks. - # - # note that the IPForward and DefaultRoute services should be enabled - - # directory containing the certificate and key described below, in addition to - # a CA certificate and DH key - certdir=$SESSION_DIR/certs - keydir=$PWD - - # the name used for a "$keyname.pem" certificate and "$keyname.key" private key. - keyname=vpnserver - - # the VPN subnet address from which the client VPN IP (for the TUN/TAP) - # will be allocated - vpnsubnet=10.0.200.0 - - # public IP address of this vpn server (same as VPNClient vpnserver= setting) - vpnserver=10.0.1.10 - - # optional list of private subnets reachable behind this VPN server - # each subnet and next hop is separated by a space - # ", , ..." - privatenets="10.0.6.0,10.0.1.10" - - # optional list of VPN clients, for statically assigning IP addresses to - # clients; also, an optional client subnet can be specified for adding static - # routes via the client - # Note: VPN addresses x.x.x.0-3 are reserved - # ",, ,, ..." - #vpnclients="client1KeyFilename,10.0.200.5,10.0.0.0 client2KeyFilename,," - vpnclients="" - - # NOTE: you may need to enable the StaticRoutes service on nodes within the - # private subnet, in order to have routes back to the client. - # /sbin/ip ro add /24 via - # /sbin/ip ro add /24 via - - # -------- END CUSTOMIZATION -------- - - echo > $PWD/vpnserver.log - rm -f -r $PWD/ccd - - # validate key and certification files - check-key-file() { - if [ ! -e $1 ]; then - echo "ERROR: missing certification or key file: $1" >> $PWD/vpnserver.log - fi - } - - check-key-file $keydir/$keyname.key - check-key-file $keydir/$keyname.pem - check-key-file $certdir/ca-cert.pem - check-key-file $certdir/dh2048.pem - - # validate configuration IP addresses - checkip=0 - if [ "$(dpkg -l | grep sipcalc)" = "" ]; then - echo "WARNING: ip validation disabled because package sipcalc not installed\ - " >> $PWD/vpnserver.log - checkip=1 - else - if [ "$(sipcalc "$vpnsubnet" "$vpnserver" | grep ERR)" != "" ]; then - echo "ERROR: invalid vpn subnet or server address \ - $vpnsubnet or $vpnserver " >> $PWD/vpnserver.log - fi - fi - - # create client vpn ip pool file - ( - cat << EOF - EOF - )> $PWD/ippool.txt - - # create server.conf file - ( - cat << EOF - # openvpn server config - local $vpnserver - server $vpnsubnet 255.255.255.0 - push redirect-gateway def1 - EOF - )> $PWD/server.conf - - # add routes to VPN server private subnets, and push these routes to clients - for privatenet in $privatenets; do - if [ $privatenet != "" ]; then - net=${privatenet%%,*} - nexthop=${privatenet##*,} - if [ $checkip = "0" ] && - [ "$(sipcalc "$net" "$nexthop" | grep ERR)" != "" ]; then - echo "ERROR: invalid vpn server private net address \ - $net or $nexthop " >> $PWD/vpnserver.log - fi - echo push route $net 255.255.255.0 >> $PWD/server.conf - fi - done - - # allow subnet through this VPN, one route for each client subnet - for client in $vpnclients; do - if [ $client != "" ]; then - cSubnetIP=${client##*,} - cVpnIP=${client#*,} - cVpnIP=${cVpnIP%%,*} - cKeyFilename=${client%%,*} - if [ "$cSubnetIP" != "" ]; then - if [ $checkip = "0" ] && - [ "$(sipcalc "$cSubnetIP" "$cVpnIP" | grep ERR)" != "" ]; then - echo "ERROR: invalid vpn client and subnet address \ - $cSubnetIP or $cVpnIP " >> $PWD/vpnserver.log - fi - echo route $cSubnetIP 255.255.255.0 >> $PWD/server.conf - if ! test -d $PWD/ccd; then - mkdir -p $PWD/ccd - echo client-config-dir $PWD/ccd >> $PWD/server.conf - fi - if test -e $PWD/ccd/$cKeyFilename; then - echo iroute $cSubnetIP 255.255.255.0 >> $PWD/ccd/$cKeyFilename - else - echo iroute $cSubnetIP 255.255.255.0 > $PWD/ccd/$cKeyFilename - fi - fi - if [ "$cVpnIP" != "" ]; then - echo $cKeyFilename,$cVpnIP >> $PWD/ippool.txt - fi - fi - done - - ( - cat << EOF - keepalive 10 120 - ca $certdir/ca-cert.pem - cert $keydir/$keyname.pem - key $keydir/$keyname.key - dh $certdir/dh2048.pem - cipher AES-256-CBC - status /var/log/openvpn-status.log - log /var/log/openvpn-server.log - ifconfig-pool-linear - ifconfig-pool-persist $PWD/ippool.txt - port 1194 - proto udp - dev tun - verb 4 - daemon - EOF - )>> $PWD/server.conf - - # start vpn server - openvpn --config server.conf - - } - } - custom-config { - custom-config-id service:VPNServer - custom-command VPNServer - config { - - ('vpnserver.sh', 'vpnserver.key', 'vpnserver.pem', ) - 50 - ('bash vpnserver.sh', ) - ('killall openvpn', ) - ('pidof openvpn', ) - - } - } - services {IPForward DefaultRoute SSH VPNServer} -} - -node n6 { - type router - model PC - network-config { - hostname vpnclient - ! - interface eth0 - ip address 10.0.0.20/24 - ipv6 address 2001:0::20/64 - ! - } - canvas c1 - iconcoords {120.0 133.0} - labelcoords {120.0 165.0} - interface-peer {eth0 n1} - custom-config { - custom-config-id service:VPNClient:vpnclient.key - custom-command vpnclient.key - config { - -----BEGIN PRIVATE KEY----- - MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC6T+1XG/EQX8pj - vGSq5QMS6G8sqozjDPInZz8hSukeJCueE9Ib/nbg9wXLST6fAVA/VsY4eGXZzQNB - vl6BxVXjjj/UkY4R+RXchKjg85fq+I37uZnzUL3S2jIalswB4LsLSGusBbTTfe8v - 0rMCPVUzojMSXhkOVJs1gzusmdNnqEg7TZ+W4Ov12jzACbRdGMA572sXvnXRPhdR - BI4CSfrsPRueWPO317oLDCECMrxzza9y65UFS3oPFvf2s6oR7FlAIEq0Z1YUQayx - LDH0kE1ZjhLxBmaqNO7hD0gCjYYX8XSHOpiq045N+OGmKcI3Th8ZsGkXKMMyQ1yN - a1c2PuehAgMBAAECggEAVVqYmPesEJxR1C9SzxfruJXTmNrpgHtF1NdwDIiNE8nu - UZUzBLAnNhj1BpSfo6iuYtYWKXi+8HEDtPLJyRnmp0Fb7L5iH8nFQilkVOpEBtmn - 8lKtPNMYo6him9vJynJyPlEHQt+6X8mp8nbMm5INnoIIc7m4MOCB2poslH5EY4/j - /WTohzXVdx3nhYAJ5v5uVi/i6jeNHfY+6sj6pBKDq82OrfxgjrtABRj3/K5UcVd0 - UBsaqXXObHxSvJkHFOSxK+qhVivuT3svZZlaYaleRB1oDmMx3uRNvtxdkhVz5zZY - zeEddu5/BQzHPpIwKR/HScpFes92fiQ639bJxIzGAQKBgQDtNoE7V2CVpvMVgTsX - 3WsqjTZZOnH8jWfWrOMPgRWmDWSA7P7SNSL7dCIftqdMv3pPxCoYVzH7Skp18HGD - 8EVRqrBUupfj7NXOWlG624qtlilWQsNwPkpjXWciQQapdAhEX+T+1/d5UrVR/mY9 - gP4M6rnT87ShcPPi/Otvr/B6SQKBgQDJEWj0wR5GyCfDA0L8ez3OzAwkiWB3K+8b - usc0Cs/+ZFOjQd4Qxahoo6lL8G17TaIcSvdrULaWsQ/oeJ40M2xzsdlwrrtr6ueL - 7q/mqsJeGLIN0h0I0i6DTUYWwzTR5CXCox967FZV46FQ8Jof3c7fsXCNUajHzcUh - zxqp+AdCmQKBgHeV5bqTxzZKrvtlZfQXBOKzw/VhuHs4kmOwTtvPGKnY0JUKZUB1 - 10fq+RUB0P+o/DFgVFRnCOSFRFqGt8NrCpcsNK7STqZyDCt2bwODkDsIm5hIGhzo - 2jmTqd2j6Ibe3xgRO/GZ0MHSB2TpmoNhFzJN1xbaInLM7ba+CLcKfHI5AoGBAIaS - b3O4uSHYnrwnt7KybXi2Gr5tb7HzJrKhfOf5AKKb1VqkIBOLpx55wzp/LVdka0aS - aixaNgp/cU0/RWtcq453jzeayvf8nYKLexFgYnyF/M3BPguEWPsqQenENtrv3tH5 - SX2FJnePxY0dq5n+Y5JV+SWsbNFliDYLniX6SimpAoGAR9ABECd9DMnhgi+WkhZs - 55YBE8P8jFuSUASBIKVmke60nDn4oot0YD74kykb6TxasGXX5lC1vCje/olNBIGM - y687YmrudDfXWxEUwlHMoec5wrHDGIGCnBRAlt4whDoCREH1H+fp/9BgAThcjv58 - NyNDfW+vGpDlkbwFvyhc4pY= - -----END PRIVATE KEY----- - } - } - custom-config { - custom-config-id service:VPNClient:vpnclient.pem - custom-command vpnclient.pem - config { - Certificate: - Data: - Version: 3 (0x2) - Serial Number: 2 (0x2) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=WA, O=core-dev/emailAddress=root@localhost - Validity - Not Before: May 19 02:09:57 2015 GMT - Not After : Apr 25 02:09:57 2115 GMT - Subject: C=US, ST=WA, O=core-dev, CN=vpnclient/emailAddress=root@localhost - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:ba:4f:ed:57:1b:f1:10:5f:ca:63:bc:64:aa:e5: - 03:12:e8:6f:2c:aa:8c:e3:0c:f2:27:67:3f:21:4a: - e9:1e:24:2b:9e:13:d2:1b:fe:76:e0:f7:05:cb:49: - 3e:9f:01:50:3f:56:c6:38:78:65:d9:cd:03:41:be: - 5e:81:c5:55:e3:8e:3f:d4:91:8e:11:f9:15:dc:84: - a8:e0:f3:97:ea:f8:8d:fb:b9:99:f3:50:bd:d2:da: - 32:1a:96:cc:01:e0:bb:0b:48:6b:ac:05:b4:d3:7d: - ef:2f:d2:b3:02:3d:55:33:a2:33:12:5e:19:0e:54: - 9b:35:83:3b:ac:99:d3:67:a8:48:3b:4d:9f:96:e0: - eb:f5:da:3c:c0:09:b4:5d:18:c0:39:ef:6b:17:be: - 75:d1:3e:17:51:04:8e:02:49:fa:ec:3d:1b:9e:58: - f3:b7:d7:ba:0b:0c:21:02:32:bc:73:cd:af:72:eb: - 95:05:4b:7a:0f:16:f7:f6:b3:aa:11:ec:59:40:20: - 4a:b4:67:56:14:41:ac:b1:2c:31:f4:90:4d:59:8e: - 12:f1:06:66:aa:34:ee:e1:0f:48:02:8d:86:17:f1: - 74:87:3a:98:aa:d3:8e:4d:f8:e1:a6:29:c2:37:4e: - 1f:19:b0:69:17:28:c3:32:43:5c:8d:6b:57:36:3e: - e7:a1 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - X509v3 Subject Key Identifier: - 55:33:21:40:42:B6:63:7F:EA:A5:20:FA:18:21:C7:27:5B:6F:65:68 - X509v3 Authority Key Identifier: - keyid:DB:D2:9C:8D:22:D9:D7:E2:38:A0:8D:6C:3B:BE:33:CE:8D:2A:BE:C8 - DirName:/C=US/ST=WA/O=core-dev/emailAddress=root@localhost - serial:CE:78:96:91:DB:9B:84:FD - - Signature Algorithm: sha256WithRSAEncryption - 33:e5:aa:b3:19:63:ce:24:c7:ee:2f:11:18:5b:7b:1d:6b:4c: - 71:2d:0b:ea:6f:9b:5e:43:11:45:50:a6:00:fc:19:11:50:46: - 6a:d8:1d:38:eb:9f:3a:81:09:6e:dc:ae:b3:df:71:85:e2:16: - 7e:b8:bf:4c:ec:36:97:ae:58:a6:d9:d1:64:47:cf:8b:e8:0e: - 8c:41:2e:c3:a7:32:ef:a0:90:c2:5c:e5:6f:aa:03:ca:15:7f: - fb:ef:42:b1:22:28:47:fe:0a:df:58:b5:88:5b:a6:15:f8:13: - 3f:7e:19:da:ec:3f:63:72:0b:e5:c6:94:9f:53:1c:99:60:48: - 25:b5:b4:60:9a:4a:94:ab:68:be:5a:08:67:4c:c8:b5:7e:12: - 32:2c:e9:e7:fb:d1:a2:40:a8:e6:68:0e:37:a1:48:99:17:b6: - 40:f6:50:0a:f7:16:d1:90:e6:8a:3e:b0:c7:21:aa:9a:b9:79: - 6a:69:5c:25:9b:4b:29:b7:0e:13:80:ea:e8:5c:6d:95:cd:5c: - 69:de:20:69:d7:df:20:ec:6f:7b:9f:1d:61:c2:d1:59:6f:1e: - 0a:45:01:f6:25:02:e5:be:fb:91:a9:82:08:c8:42:2a:3e:2c: - 75:bb:4e:9c:0a:b6:07:24:52:e5:4f:f5:81:45:7b:77:ca:19: - 38:56:7f:17:63:5e:1f:a4:be:03:7d:d3:48:fc:e9:43:5c:2b: - b1:d5:da:44:c0:0c:56:23:4a:7d:bf:c0:ac:c6:9c:93:6d:69: - 9a:b9:02:3e:aa:1b:27:3e:b1:c8:6a:39:96:09:1d:c0:08:c8: - 1c:a4:82:ea:d2:72:e7:e1:47:66:7f:76:ac:d5:8c:99:59:02: - 25:ee:ec:ad:76:65:0f:8a:ba:5f:a7:33:ef:8e:34:71:d2:f5: - 3c:63:b0:c4:b2:65:c2:55:2d:35:d7:13:04:9c:87:d2:76:6b: - af:37:ba:58:d2:63:e0:fb:9c:a4:3a:97:e4:e6:79:0f:ca:d4: - 07:8c:39:80:4d:5e:d4:09:3a:09:1f:16:1a:58:c0:96:58:19: - e8:f7:56:bc:bd:fd:23:f4:4b:93:eb:a4:f2:22:7d:7c:d2:f3: - 6b:5a:13:24:a6:b8:1a:33:0c:fa:cd:77:36:12:c8:c6:ac:e9: - 0f:29:1a:4f:c3:3c:92:53:8c:af:80:04:ac:9b:2a:73:af:a8: - 0f:ef:7d:9f:5e:7c:52:d3:03:2e:19:6f:25:b0:f7:17:ef:c9: - 37:b9:50:ad:60:b0:c7:d9:ba:8f:9e:93:27:ba:52:27:70:b8: - ae:2b:9a:f7:33:2a:fd:a6:51:f5:e2:42:1a:e9:e6:08:5e:62: - 75:e9:b2:1b:ca:ce:cd:d1 - -----BEGIN CERTIFICATE----- - MIIE1TCCAr2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADBMMQswCQYDVQQGEwJVUzEL - MAkGA1UECBMCV0ExETAPBgNVBAoTCGNvcmUtZGV2MR0wGwYJKoZIhvcNAQkBFg5y - b290QGxvY2FsaG9zdDAgFw0xNTA1MTkwMjA5NTdaGA8yMTE1MDQyNTAyMDk1N1ow - YDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMREwDwYDVQQKEwhjb3JlLWRldjES - MBAGA1UEAxMJdnBuY2xpZW50MR0wGwYJKoZIhvcNAQkBFg5yb290QGxvY2FsaG9z - dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALpP7Vcb8RBfymO8ZKrl - AxLobyyqjOMM8idnPyFK6R4kK54T0hv+duD3BctJPp8BUD9Wxjh4ZdnNA0G+XoHF - VeOOP9SRjhH5FdyEqODzl+r4jfu5mfNQvdLaMhqWzAHguwtIa6wFtNN97y/SswI9 - VTOiMxJeGQ5UmzWDO6yZ02eoSDtNn5bg6/XaPMAJtF0YwDnvaxe+ddE+F1EEjgJJ - +uw9G55Y87fXugsMIQIyvHPNr3LrlQVLeg8W9/azqhHsWUAgSrRnVhRBrLEsMfSQ - TVmOEvEGZqo07uEPSAKNhhfxdIc6mKrTjk344aYpwjdOHxmwaRcowzJDXI1rVzY+ - 56ECAwEAAaOBqzCBqDAJBgNVHRMEAjAAMB0GA1UdDgQWBBRVMyFAQrZjf+qlIPoY - IccnW29laDB8BgNVHSMEdTBzgBTb0pyNItnX4jigjWw7vjPOjSq+yKFQpE4wTDEL - MAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMREwDwYDVQQKEwhjb3JlLWRldjEdMBsG - CSqGSIb3DQEJARYOcm9vdEBsb2NhbGhvc3SCCQDOeJaR25uE/TANBgkqhkiG9w0B - AQsFAAOCAgEAM+WqsxljziTH7i8RGFt7HWtMcS0L6m+bXkMRRVCmAPwZEVBGatgd - OOufOoEJbtyus99xheIWfri/TOw2l65YptnRZEfPi+gOjEEuw6cy76CQwlzlb6oD - yhV/++9CsSIoR/4K31i1iFumFfgTP34Z2uw/Y3IL5caUn1McmWBIJbW0YJpKlKto - vloIZ0zItX4SMizp5/vRokCo5mgON6FImRe2QPZQCvcW0ZDmij6wxyGqmrl5amlc - JZtLKbcOE4Dq6Fxtlc1cad4gadffIOxve58dYcLRWW8eCkUB9iUC5b77kamCCMhC - Kj4sdbtOnAq2ByRS5U/1gUV7d8oZOFZ/F2NeH6S+A33TSPzpQ1wrsdXaRMAMViNK - fb/ArMack21pmrkCPqobJz6xyGo5lgkdwAjIHKSC6tJy5+FHZn92rNWMmVkCJe7s - rXZlD4q6X6cz7440cdL1PGOwxLJlwlUtNdcTBJyH0nZrrze6WNJj4PucpDqX5OZ5 - D8rUB4w5gE1e1Ak6CR8WGljAllgZ6PdWvL39I/RLk+uk8iJ9fNLza1oTJKa4GjMM - +s13NhLIxqzpDykaT8M8klOMr4AErJsqc6+oD+99n158UtMDLhlvJbD3F+/JN7lQ - rWCwx9m6j56TJ7pSJ3C4riua9zMq/aZR9eJCGunmCF5idemyG8rOzdE= - -----END CERTIFICATE----- - } - } - custom-config { - custom-config-id service:VPNClient:vpnclient.sh - custom-command vpnclient.sh - config { - #!/bin/sh - # custom VPN Client configuration for service (security.py) - # -------- CUSTOMIZATION REQUIRED -------- - # - # The VPNClient service builds a VPN tunnel to the specified VPN server using - # OpenVPN software and a virtual TUN/TAP device. - - # directory containing the certificate and key described below - certdir=$SESSION_DIR/certs - keydir=$PWD - - # the name used for a "$keyname.pem" certificate and "$keyname.key" private key. - keyname=vpnclient - - # the public IP address of the VPN server this client should connect with - vpnserver="10.0.1.10" - - # optional next hop for adding a static route to reach the VPN server - nexthop="" - - # --------- END CUSTOMIZATION -------- - - # validate addresses - if [ "$(dpkg -l | grep sipcalc)" = "" ]; then - echo "WARNING: ip validation disabled because package sipcalc not installed - " > $PWD/vpnclient.log - else - if [ "$(sipcalc "$vpnserver" "$nexthop" | grep ERR)" != "" ]; then - echo "ERROR: invalide address $vpnserver or $nexthop \ - " > $PWD/vpnclient.log - fi - fi - - # validate key and certification files - check-key-file() { - if [ ! -e $1 ]; then - echo "ERROR: missing certification or key file: $1" >> $PWD/vpnserver.log - fi - } - - check-key-file $keydir/$keyname.key - check-key-file $keydir/$keyname.pem - check-key-file $certdir/ca-cert.pem - check-key-file $certdir/dh2048.pem - - # if necessary, add a static route for reaching the VPN server IP via the IF - vpnservernet=${vpnserver%.*}.0/24 - if [ "$nexthop" != "" ]; then - /sbin/ip route add $vpnservernet via $nexthop - fi - - # create openvpn client.conf - ( - cat << EOF - client - dev tun - proto udp - remote $vpnserver 1194 - nobind - ca $certdir/ca-cert.pem - cert $keydir/$keyname.pem - key $keydir/$keyname.key - dh $certdir/dh2048.pem - cipher AES-256-CBC - log /var/log/openvpn-client.log - verb 4 - daemon - EOF - ) > client.conf - - openvpn --config client.conf - - } - } - custom-config { - custom-config-id service:VPNClient - custom-command VPNClient - config { - - ('vpnclient.sh', 'vpnclient.pem', 'vpnclient.key', ) - 60 - ('bash vpnclient.sh', ) - ('killall openvpn', ) - ('pidof openvpn', ) - - } - } - services {DefaultRoute VPNClient} -} - -node n7 { - type lanswitch - network-config { - hostname n7 - ! - } - canvas c1 - iconcoords {824.0 458.0} - labelcoords {824.0 482.0} - interface-peer {e0 n5} - interface-peer {e1 n8} - interface-peer {e2 n9} - interface-peer {e3 n10} -} - -node n8 { - type router - model PC - network-config { - hostname n8 - ! - interface eth0 - ip address 10.0.6.20/24 - ipv6 address 2001:6::20/64 - ! - } - canvas c1 - iconcoords {801.0 264.0} - labelcoords {801.0 296.0} - interface-peer {eth0 n7} -} - -node n9 { - type router - model PC - network-config { - hostname n9 - ! - interface eth0 - ip address 10.0.6.21/24 - ipv6 address 2001:6::21/64 - ! - } - canvas c1 - iconcoords {885.0 305.0} - labelcoords {885.0 337.0} - interface-peer {eth0 n7} -} - -node n10 { - type router - model PC - network-config { - hostname n10 - ! - interface eth0 - ip address 10.0.6.22/24 - ipv6 address 2001:6::22/64 - ! - } - canvas c1 - iconcoords {954.0 353.0} - labelcoords {954.0 385.0} - interface-peer {eth0 n7} -} - -link l1 { - nodes {n6 n1} - bandwidth 0 -} - -link l2 { - nodes {n4 n5} - bandwidth 0 -} - -link l3 { - nodes {n1 n2} - bandwidth 0 -} - -link l4 { - nodes {n3 n4} - bandwidth 0 -} - -link l5 { - nodes {n3 n1} - bandwidth 0 -} - -link l6 { - nodes {n4 n2} - bandwidth 0 -} - -link l7 { - nodes {n5 n7} - bandwidth 0 -} - -link l8 { - nodes {n8 n7} - bandwidth 0 -} - -link l9 { - nodes {n9 n7} - bandwidth 0 -} - -link l10 { - nodes {n10 n7} - bandwidth 0 -} - -annotation a1 { - iconcoords {661.0 187.0 997.0 579.0} - type rectangle - label {private network} - labelcolor black - fontfamily {Arial} - fontsize 12 - color #e9e9fe - width 0 - border black - rad 25 - effects {bold} - canvas c1 -} - -canvas c1 { - name {Canvas1} -} - -hook 3:instantiation_hook.sh { -#!/bin/sh -# session hook script; write commands here to execute on the host at the -# specified state - -CERT_DIR=$SESSION_DIR/certs -mkdir $CERT_DIR - -cat > $CERT_DIR/dh2048.pem < $CERT_DIR/ca-cert.pem <] [-s] [-a address] [-p port]" - echo " []" - echo "" - echo "Launches the CORE Tcl/Tk X11 GUI or starts an imn-based emulation." - echo "" - echo " -(-h)elp show help message and exit" - echo " -(-v)ersion show version number and exit" - echo " -(-b)atch batch mode (no X11 GUI)" - echo -n " -(-c)losebatch stop and clean up a batch mode " - echo "session " - echo " -(-s)tart start in execute mode, not edit mode" - echo " -(-a)ddress connect to the specified IP address (default 127.0.0.1)" - echo " -(-p)port connect to the specified TCP port (default 4038)" - echo " (optional) load the specified imn scenario file" - echo "" - echo "With no parameters, starts the GUI in edit mode with a blank canvas." - echo "" - exit 0 - ;; --v | --version) - exec echo "`basename $0` version @PACKAGE_VERSION@ (@PACKAGE_DATE@)" - exit 0 - ;; -esac - -SHELL=/bin/sh -export SHELL - -export LIBDIR="@CORE_LIB_DIR@" -export SBINDIR="@sbindir@" -# eval is used here to expand "~" to user's home dir -if [ x$CONFDIR = x ]; then export CONFDIR=`eval "echo @CORE_GUI_CONF_DIR@"` ; fi -export CORE_STATE_DIR="@CORE_STATE_DIR@" -export CORE_DATA_DIR="@CORE_DATA_DIR@" -export CORE_USER=`id -u -n` -export CORE_START_DIR=$PWD - -init_conf_dir() { - echo "Setting up user config area $CONFDIR, $CONFDIR/configs, and " - echo " $CONFDIR/myservices" - mkdir -p $CONFDIR - if [ $? != 0 ]; then echo "error making directory $CONFDIR!"; fi - mkdir -p $CONFDIR/configs - if [ $? != 0 ]; then - echo "error making directory $CONFDIR/configs!"; - else - cp -a $CORE_DATA_DIR/examples/configs/* $CONFDIR/configs/ - fi - mkdir -p $CONFDIR/myservices - if [ $? != 0 ]; then - echo "error making directory $CONFDIR/myservices!"; - else - cp -a $CORE_DATA_DIR/examples/myservices/* $CONFDIR/myservices/ - fi - mkdir -p $CONFDIR/myemane - if [ $? != 0 ]; then - echo "error making directory $CONFDIR/myemane!"; - else - cp -a $CORE_DATA_DIR/examples/myemane/* $CONFDIR/myemane/ - fi -} - -cd $LIBDIR - -core=$LIBDIR/core.tcl - -# locate wish8.5 binaries -WISHLIST="/usr/bin/wish8.6 /usr/local/bin/wish8.5 /usr/bin/wish8.5" -for wishbin in $WISHLIST -do - if [ -x $wishbin ] - then - WISH=$wishbin; - break; - fi; -done; - -if [ a$WISH = a ] -then - echo "CORE could not locate the Tcl/Tk binary (wish8.5)." - exit 1; -fi; - -# create /home/user/.core directory if necessary -if [ ! -e $CONFDIR ] -then - init_conf_dir -fi; - -# check for and fix write permissions on /home/user/.core directory -while [ ! -w $CONFDIR ]; -do - echo " CORE requires write permissions to the '$CONFDIR'" - echo " configuration directory for the user '$CORE_USER'," - echo " would you like to fix this now [Y/n]?" - read yn - if [ "z$yn" = "zn" ]; then - break - fi - echo -n " (sudo may prompt you for a password; if you do not have sudo set" - echo " up for the" - echo " user '$CORE_USER', su to root and run this command:" - echo " chown -R $CORE_USER $CONFDIR )" - sudo chown -R $U $CONFDIR - sudo chmod -R u+w $CONFDIR -done - -# GUI config directory should not be a file (old prefs) -if [ ! -d $CONFDIR ] -then - - mv $CONFDIR $CONFDIR.tmp - if [ $? != 0 ]; then echo "error moving $CONFDIR!"; exit 1; fi - init_conf_dir - echo "Old preferences file $CONFDIR has been moved to $CONFDIR/prefs.conf" - mv $CONFDIR.tmp $CONFDIR/prefs.conf - if [ $? != 0 ]; then echo "error moving $CONFDIR.tmp to $CONFDIR/prefs.conf!"; exit 1; fi -fi; - -case $1 in --b | --batch) - TCLBIN=`echo ${WISH} | sed s/wish/tclsh/g` - exec ${TCLBIN} $core "$@" - ;; --c | --closebatch) - TCLBIN=`echo ${WISH} | sed s/wish/tclsh/g` - exec ${TCLBIN} $core "$@" - ;; --s) - shift - exec ${WISH} $core -- "--start" "$@" - ;; --a) - shift - exec ${WISH} $core -- "--address" "$@" - ;; --p) - shift - exec ${WISH} $core -- "--port" "$@" - ;; -*) - exec ${WISH} $core -- $@ - ;; -esac - -cd $CORE_START_DIR diff --git a/gui/core.tcl b/gui/core.tcl deleted file mode 100644 index aad43fd4..00000000 --- a/gui/core.tcl +++ /dev/null @@ -1,196 +0,0 @@ -# -# Copyright 2004-2008 University of Zagreb, Croatia. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY AUTHOR 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 AUTHOR 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. -# -# This work was supported in part by Croatian Ministry of Science -# and Technology through the research contract #IP-2003-143. -# - -if {[lindex $argv 0] == "-b" || [lindex $argv 0] == "--batch"} { - set argv [lrange $argv 1 end] - set execMode batch -} elseif {[lindex $argv 0] == "-c" || [lindex $argv 0] == "--closebatch"} { - set argv [lrange $argv 1 end] - set execMode closebatch -} elseif {[lindex $argv 0] == "--addons"} { - set argv [lrange $argv 1 end] - set execMode addons -} else { - set execMode interactive -} - -set LIBDIR "" -set SBINDIR "/usr/local/sbin" -set CONFDIR "." -set CORE_DATA_DIR "." -set CORE_STATE_DIR "." -set CORE_START_DIR "" -set CORE_USER "" -if { [info exists env(LIBDIR)] } { - set LIBDIR $env(LIBDIR) -} -if { [info exists env(SBINDIR)] } { - set SBINDIR $env(SBINDIR) -} -if { [info exists env(CONFDIR)] } { - set CONFDIR $env(CONFDIR) -} -if { [info exists env(CORE_DATA_DIR)] } { - set CORE_DATA_DIR $env(CORE_DATA_DIR) -} -if { [info exists env(CORE_STATE_DIR)] } { - set CORE_STATE_DIR $env(CORE_STATE_DIR) -} -if { [info exists env(CORE_START_DIR)] } { - set CORE_START_DIR $env(CORE_START_DIR) -} -if { [info exists env(CORE_USER)] } { - set CORE_USER $env(CORE_USER) -} - -source "$LIBDIR/version.tcl" - -source "$LIBDIR/linkcfg.tcl" -source "$LIBDIR/nodecfg.tcl" -source "$LIBDIR/ipv4.tcl" -source "$LIBDIR/ipv6.tcl" -source "$LIBDIR/cfgparse.tcl" -source "$LIBDIR/exec.tcl" -source "$LIBDIR/canvas.tcl" - -source "$LIBDIR/editor.tcl" -source "$LIBDIR/annotations.tcl" - -source "$LIBDIR/help.tcl" -source "$LIBDIR/filemgmt.tcl" - -source "$LIBDIR/ns2imunes.tcl" - - -source "$LIBDIR/mobility.tcl" -source "$LIBDIR/api.tcl" -source "$LIBDIR/wlan.tcl" -source "$LIBDIR/wlanscript.tcl" -source "$LIBDIR/util.tcl" -source "$LIBDIR/plugins.tcl" -source "$LIBDIR/nodes.tcl" -source "$LIBDIR/services.tcl" -source "$LIBDIR/traffic.tcl" -source "$LIBDIR/exceptions.tcl" - -# -# Global variables are initialized here -# -set node_list {} -set link_list {} -set annotation_list {} -set canvas_list {} -set eid e0 -set plot_list {} -array set exec_servers {} -loadServersConf ;# populate exec_servers - -# global vars -set showAPI 0 -set mac_byte4 0 -set mac_byte5 0 -set g_mrulist {} -initDefaultPrefs -loadDotFile -loadPluginsConf -checkCommandLineAddressPort -autoConnectPlugins - -set g_abort_session 0 - -# -# Initialization should be complete now, so let's start doing something... -# - -if {$execMode == "interactive"} { - # GUI-related files - source "$LIBDIR/widget.tcl" - source "$LIBDIR/tooltips.tcl" - source "$LIBDIR/initgui.tcl" - source "$LIBDIR/topogen.tcl" - source "$LIBDIR/graph_partitioning.tcl" - source "$LIBDIR/gpgui.tcl" - source "$LIBDIR/debug.tcl" - # Load all Tcl files from the addons directory - foreach file [glob -nocomplain -directory "$LIBDIR/addons" *.tcl] { - if { [catch { if { [file isfile $file ] } { source "$file"; } } e] } { - puts "*** Error loading addon file: $file" - puts " $e" - } - } - setOperMode edit - fileOpenStartUp - foreach arg $argv { - if { $arg == "--start" } { - global currentFile - if { [file extension $currentFile] == ".xml" } { - after 100; update; # yield to other events so XML file - after 100; update; # can be loaded and received - } - startStopButton "exec"; break; - } - } -# Boeing changed elseif to catch batch and else to output error -} elseif {$execMode == "batch"} { - puts "batch execute $argv" - set sock [lindex [getEmulPlugin "*"] 2] - if { $sock == "" || $sock == "-1" || $sock == -1 } { exit.real; } - if {$argv != ""} { - global currentFile - set currentFile [argAbsPathname $argv] - set fileId [open $currentFile r] - set cfg "" - foreach entry [read $fileId] { - lappend cfg $entry - } - close $fileId - after 100 { - loadCfg $cfg - deployCfgAPI $sock - puts "Waiting to enter RUNTIME state..." - } - global vwaitdummy - vwait vwaitdummy - } -} elseif {$execMode == "closebatch"} { - global g_session_choice - set g_session_choice $argv - puts "Attempting to close session $argv ..." - global vwaitdummy - vwait vwaitdummy -} elseif {$execMode == "addons"} { - # pass control to included addons code - foreach file [glob -nocomplain -directory "$LIBDIR/addons" *.tcl] { - if { [file isfile $file ] } { source "$file"; } - } - global vwaitdummy - vwait vwaitdummy -} else { - puts "ERROR: execMode is not set in core.tcl" -} - diff --git a/gui/debug.tcl b/gui/debug.tcl deleted file mode 100644 index 60e45cbc..00000000 --- a/gui/debug.tcl +++ /dev/null @@ -1,46 +0,0 @@ -.menubar.tools add command -label "Debugger..." -command popupDebugger - -set g_last_debug_cmd "puts \"Hello world\"" - -proc popupDebugger {} { - global g_last_debug_cmd - - set wi .debugger - catch { destroy $wi } - toplevel $wi - - wm transient $wi . - wm resizable $wi 300 200 - wm title $wi "CORE Debugger" - - frame $wi.dbg -borderwidth 4 - label $wi.dbg.label1 \ - -text "Enter TCL/Tk commands below, press Run to evaluate:" - text $wi.dbg.cmd -bg white -width 100 -height 3 - - pack $wi.dbg.label1 $wi.dbg.cmd -side top -anchor w -padx 4 -pady 4 - pack $wi.dbg -side top - - $wi.dbg.cmd insert end "$g_last_debug_cmd" - - frame $wi.btn - # evaluate debugging commands entered into the text box below - button $wi.btn.exec -text "Run" -command { - global g_last_debug_cmd - set wi .debugger - set i 1 - set g_last_debug_cmd "" - while { 1 } { - set cmd [$wi.dbg.cmd get $i.0 $i.end] - set g_last_debug_cmd "$g_last_debug_cmd$cmd\n" - if { $cmd == "" } { break } - catch { eval $cmd } output - puts $output - incr i - } - } - button $wi.btn.close -text "Close" -command "destroy .debugger" - - pack $wi.btn.exec $wi.btn.close -side left -padx 4 -pady 4 - pack $wi.btn -side bottom -} diff --git a/gui/editor.tcl b/gui/editor.tcl deleted file mode 100644 index f93d85c1..00000000 --- a/gui/editor.tcl +++ /dev/null @@ -1,5348 +0,0 @@ -# -# Copyright 2004-2008 University of Zagreb, Croatia. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY AUTHOR 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 AUTHOR 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. -# -# This work was supported in part by the Croatian Ministry of Science -# and Technology through the research contract #IP-2003-143. -# - -#****h* imunes/editor.tcl -# NAME -# editor.tcl -- file used for defining functions that can be used in -# edit mode as well as all the functions which change the appearance -# of the imunes GUI. -# FUNCTION -# This module is used for defining all possible actions in imunes -# edit mode. It is also used for all the GUI related actions. -#**** - - -proc animateCursor {} { - global cursorState - global clock_seconds - - if { [clock seconds] == $clock_seconds } { - update - return - } - set clock_seconds [clock seconds] - if { $cursorState } { - .c config -cursor watch - set cursorState 0 - } else { - .c config -cursor pirate - set cursorState 1 - } - update -} - -#****f* editor.tcl/removeGUILink -# NAME -# removeGUILink -- remove link from GUI -# SYNOPSIS -# renoveGUILink $link_id $atomic -# FUNCTION -# Removes link from GUI. It removes standard links as well as -# split links and links connecting nodes on different canvases. -# INPUTS -# * link_id -- the link id -# * atomic -- defines if the remove was atomic action or a part -# of a composed, non-atomic action (relevant for updating log -# for undo). -#**** - -proc removeGUILink { link atomic } { - global changed - - set nodes [linkPeers $link] - set node1 [lindex $nodes 0] - set node2 [lindex $nodes 1] - if { [nodeType $node1] == "pseudo" } { - removeLink [getLinkMirror $link] - removeLink $link - removeNode [getNodeMirror $node1] - removeNode $node1 - .c delete $node1 - } elseif { [nodeType $node2] == "pseudo" } { - removeLink [getLinkMirror $link] - removeLink $link - removeNode [getNodeMirror $node2] - removeNode $node2 - .c delete $node2 - } else { - removeLink $link - } - .c delete $link - if { $atomic == "atomic" } { - set changed 1 - updateUndoLog - } -} - -#****f* editor.tcl/removeGUINode -# NAME -# removeGUINode -- remove node from GUI -# SYNOPSIS -# renoveGUINode $node_id -# FUNCTION -# Removes node from GUI. When removing a node from GUI the links -# connected to that node are also removed. -# INPUTS -# * node_id -- node id -#**** - -proc removeGUINode { node } { - set type [nodeType $node] - foreach ifc [ifcList $node] { - set peer [peerByIfc $node $ifc] - set link [lindex [.c gettags "link && $node && $peer"] 1] - removeGUILink $link non-atomic - } - if { [lsearch -exact "oval rectangle label text marker" $type] != -1 } { - deleteAnnotation .c $type $node - } elseif { $type != "pseudo" } { - removeNode $node - .c delete $node - } -} - -#****f* editor.tcl/updateUndoLog -# NAME -# updateUndoLog -- update the undo log -# SYNOPSIS -# updateUndoLog -# FUNCTION -# Updates the undo log. Writes the current configuration to the -# undolog array and updates the undolevel variable. -#**** - -proc updateUndoLog {} { - global changed undolog undolevel redolevel - - if { $changed } { - global t_undolog undolog - set t_undolog "" - dumpCfg string t_undolog - incr undolevel - set undolog($undolevel) $t_undolog - set redolevel $undolevel - updateUndoRedoMenu "" -# Boeing: XXX why is this set here? - set changed 0 - } -} - -#****f* editor.tcl/undo -# NAME -# undo -- undo function -# SYNOPSIS -# undo -# FUNCTION -# Undo the change. Reads the undolog and updates the current -# configuration. Reduces the value of undolevel. -#**** - -proc undo {} { - global undolevel undolog oper_mode - - if {$oper_mode == "edit" && $undolevel > 0} { - incr undolevel -1 - updateUndoRedoMenu "" - .c config -cursor watch - loadCfg $undolog($undolevel) - switchCanvas none - } -} - -#****f* editor.tcl/redo -# NAME -# redo -# SYNOPSIS -# redo -# FUNCTION -# Redo the change if possible (redolevel is greater than -# undolevel). Reads the configuration from undolog and -# updates the current configuration. Increases the value -# of undolevel. -#**** - -proc redo {} { - global undolevel redolevel undolog oper_mode - - if {$oper_mode == "edit" && $redolevel > $undolevel} { - incr undolevel - updateUndoRedoMenu "" - .c config -cursor watch - loadCfg $undolog($undolevel) - switchCanvas none - } -} - -proc updateUndoRedoMenu { forced } { - global undolevel redolevel - - if { $forced == "" } { - if { $undolevel > 0 } { set undo "normal" } else { set undo "disabled" } - if { $redolevel > $undolevel } { set redo "normal" - } else { set redo "disabled" } - } else { - set undo $forced - set redo $forced - } - - .menubar.edit entryconfigure "Undo" -state $undo - .menubar.edit entryconfigure "Redo" -state $redo -} - -#****f* editor.tcl/redrawAll -# NAME -# redrawAll -# SYNOPSIS -# redrawAll -# FUNCTION -# Redraws all the objects on the current canvas. -#**** - - -proc redrawAll {} { - global node_list plot_list link_list annotation_list plot_list background sizex sizey grid - global curcanvas zoom - global showAnnotations showGrid - - #Call_Trace ;# debugging when things disappear - - .bottom.zoom config -text "zoom [expr {int($zoom * 100)}]%" - set e_sizex [expr {int($sizex * $zoom)}] - set e_sizey [expr {int($sizey * $zoom)}] - set border 28 - .c configure -scrollregion \ - "-$border -$border [expr {$e_sizex + $border}] \ - [expr {$e_sizey + $border}]" - - - saveRestoreWlanLinks .c save - .c delete all - set background [.c create rectangle 0 0 $e_sizex $e_sizey \ - -fill white -tags "background"] - # Boeing: wallpaper - set wallpaper [lindex [getCanvasWallpaper $curcanvas] 0] - set wallpaperStyle [lindex [getCanvasWallpaper $curcanvas] 1] - if { $wallpaper != "" } { - drawWallpaper .c $wallpaper $wallpaperStyle - } - # end Boeing - - if { $showAnnotations == 1 } { - foreach obj $annotation_list { - # fix annotations having no canvas (from old config) - if { [getNodeCanvas $obj] == "" } { setNodeCanvas $obj $curcanvas} - if { [getNodeCanvas $obj] == $curcanvas } { - drawAnnotation $obj - } - } - } - - # Grid - set e_grid [expr {int($grid * $zoom)}] - set e_grid2 [expr {$e_grid * 2}] - if { $showGrid } { - for { set x $e_grid } { $x < $e_sizex } { incr x $e_grid } { - if { [expr {$x % $e_grid2}] != 0 } { - if { $zoom > 0.5 } { - .c create line $x 1 $x $e_sizey \ - -fill gray -dash {1 7} -tags "grid" - } - } else { - .c create line $x 1 $x $e_sizey -fill gray -dash {1 3} \ - -tags "grid" - } - } - for { set y $e_grid } { $y < $e_sizey } { incr y $e_grid } { - if { [expr {$y % $e_grid2}] != 0 } { - if { $zoom > 0.5 } { - .c create line 1 $y $e_sizex $y \ - -fill gray -dash {1 7} -tags "grid" - } - } else { - .c create line 1 $y $e_sizex $y -fill gray -dash {1 3} \ - -tags "grid" - } - } - } - - .c lower -withtags background - - foreach node $node_list { - if { [getNodeCanvas $node] == $curcanvas } { - drawNode .c $node - } - } - - redrawAllThruplots - foreach link $link_list { - set nodes [linkPeers $link] - if { [getNodeCanvas [lindex $nodes 0]] != $curcanvas || - [getNodeCanvas [lindex $nodes 1]] != $curcanvas } { - continue - } - drawLink $link - redrawLink $link - updateLinkLabel $link - } - saveRestoreWlanLinks .c restore - - .c config -cursor left_ptr - - raiseAll .c -} - -#****f* editor.tcl/drawNode -# NAME -# drawNode -# SYNOPSIS -# drawNode node_id -# FUNCTION -# Draws the specified node. Draws node's image (router pc -# host lanswitch rj45 hub pseudo) and label. -# The visibility of the label depends on the showNodeLabels -# variable for all types of nodes and on invisible variable -# for pseudo nodes. -# INPUTS -# * node_id -- node id -#**** - -proc drawNode { c node } { - global showNodeLabels - global router pc host lanswitch rj45 hub pseudo - global curcanvas zoom - global wlan - if { $c == "" } { set c .c } ;# default canvas - - set type [nodeType $node] - set coords [getNodeCoords $node] - set x [expr {[lindex $coords 0] * $zoom}] - set y [expr {[lindex $coords 1] * $zoom}] - # special handling for custom images, dummy nodes - # could move this to separate getImage function - set model "" - set cimg "" - set imgzoom $zoom - if { $zoom == 0.75 || $zoom == 1.5 } { set imgzoom 1.0 } - if { $type == "router" } { - set model [getNodeModel $node] - set cimg [getNodeTypeImage $model normal] - } - set tmp [absPathname [getCustomImage $node]] - if { $tmp != "" } { set cimg $tmp } - if { $cimg != "" } { - # name of global variable storing the image is the filename without path - set img [file tail $cimg] - # create the variable if the image hasn't been loaded before - global [set img] - if { ![info exists $img] } { - if { [catch { - set [set img] [image create photo -file $cimg] - createScaledImages $img - } e ] } { ;# problem loading image file - puts "icon error: $e" - set cimg "" ;# fall back to default model icon - setCustomImage $node "" ;# prevent errors elsewhere - } - } - if { $cimg != "" } { ;# only if image file loaded - global $img$imgzoom - $c create image $x $y -image [set $img$imgzoom] -tags "node $node" - } - } - if { $cimg == "" } { - if { $type == "pseudo" } { - $c create image $x $y -image [set $type] -tags "node $node" - } else { - # create scaled images based on zoom level - global $type$imgzoom - $c create image $x $y -image [set $type$imgzoom] \ - -tags "node $node" - } - } - set coords [getNodeLabelCoords $node] - set x [expr {[lindex $coords 0] * $zoom}] - set y [expr {[lindex $coords 1] * $zoom}] - if { [nodeType $node] != "pseudo" } { ;# Boeing: show remote server - set loc [getNodeLocation $node] - set labelstr0 "" - if { $loc != "" } { set labelstr0 "([getNodeLocation $node]):" } - set labelstr1 [getNodeName $node]; - set labelstr2 "" - if [info exists getNodePartition] { [getNodePartition $node]; } - set l [format "%s%s\n%s" $labelstr0 $labelstr1 $labelstr2]; - set label [$c create text $x $y -fill blue \ - -text "$l" \ - -tags "nodelabel $node"] - } else { - set pnode [getNodeName $node] - set pcanvas [getNodeCanvas $pnode] - set ifc [ifcByPeer $pnode [getNodeMirror $node]] - if { $pcanvas != $curcanvas } { - set label [$c create text $x $y -fill blue \ - -text "[getNodeName $pnode]:$ifc -@[getCanvasName $pcanvas]" \ - -tags "nodelabel $node" -justify center] - } else { - set label [$c create text $x $y -fill blue \ - -text "[getNodeName $pnode]:$ifc" \ - -tags "nodelabel $node" -justify center] - } - } - if { $showNodeLabels == 0} { - $c itemconfigure $label -state hidden - } - global invisible - if { $invisible == 1 && [nodeType $node] == "pseudo" } { - $c itemconfigure $label -state hidden - } -} - -#****f* editor.tcl/drawLink -# NAME -# drawLink -# SYNOPSIS -# drawLink link_id -# FUNCTION -# Draws the specified link. An arrow is displayed for links -# connected to pseudo nodes. If the variable invisible -# is specified link connecting a pseudo node stays hidden. -# INPUTS -# * link_id -- link id -#**** - -proc drawLink { link } { - set nodes [linkPeers $link] - set lnode1 [lindex $nodes 0] - set lnode2 [lindex $nodes 1] - set lwidth [getLinkWidth $link] - if { [getLinkMirror $link] != "" } { - set newlink [.c create line 0 0 0 0 \ - -fill [getLinkColor $link] -width $lwidth \ - -tags "link $link $lnode1 $lnode2" -arrow both] - } else { - set newlink [.c create line 0 0 0 0 \ - -fill [getLinkColor $link] -width $lwidth \ - -tags "link $link $lnode1 $lnode2"] - } - # Boeing: links between two nodes on different servers - if { [getNodeLocation $lnode1] != [getNodeLocation $lnode2]} { - .c itemconfigure $newlink -dash ","; - } - # end Boeing - # XXX Invisible pseudo-liks - global invisible - if { $invisible == 1 && [getLinkMirror $link] != "" } { - .c itemconfigure $link -state hidden - } - # Boeing: wlan links are hidden - if { [nodeType $lnode1] == "wlan" || [nodeType $lnode2] == "wlan" } { - global zoom - set imgzoom $zoom - if { $zoom == 0.75 || $zoom == 1.5 } { set imgzoom 1.0 } - global antenna$imgzoom - .c itemconfigure $link -state hidden - .c create image 0 0 -image [set antenna$imgzoom] \ - -tags "antenna $lnode2 $link" - .c create text 0 0 -tags "interface $lnode1 $link" -justify center - .c create text 0 0 -tags "interface $lnode2 $link" -justify center - .c raise interface "link || linklabel || background" - } else { - .c raise $newlink background - .c create text 0 0 -tags "linklabel $link" -justify center - .c create text 0 0 -tags "interface $lnode1 $link" -justify center - .c create text 0 0 -tags "interface $lnode2 $link" -justify center - .c raise linklabel "link || background" - .c raise interface "link || linklabel || background" - } - foreach n [list $lnode1 $lnode2] { - if { [getNodeHidden $n] } { - hideNode $n - statline "Hidden node(s) exist." - } - } -} - - -# draw a green link between wireless nodes (or other color if multiple WLANs) -# WLAN links appear on the canvas but not in the global link_list -proc drawWlanLink { node1 node2 wlan } { - global zoom defLinkWidth curcanvas - set c .c - - set wlanlink [$c find withtag "wlanlink && $node1 && $node2 && $wlan"] - if { $wlanlink != "" } { - return $wlanlink ;# already exists - } - - set color [getWlanColor $wlan] - - set xy [getNodeCoords $node1] - set x [lindex $xy 0]; set y [lindex $xy 1] - set pxy [getNodeCoords $node2] - set px [lindex $pxy 0]; set py [lindex $pxy 1] - - set wlanlink [$c create line [expr {$x*$zoom}] [expr {$y*$zoom}] \ - [expr {$px*$zoom}] [expr {$py*$zoom}] \ - -fill $color -width $defLinkWidth \ - -tags "wlanlink $node1 $node2 $wlan"] - - if { [getNodeCanvas $node1] == $curcanvas && - [getNodeCanvas $node2] == $curcanvas} { - $c itemconfigure $wlanlink -state normal - $c raise $wlanlink "background || grid || oval || rectangle" - } else { - $c itemconfigure $wlanlink -state hidden - } - - return $wlanlink -} - - -#****f* editor.tcl/chooseIfName -# NAME -# chooseIfName -- choose interface name -# SYNOPSIS -# set ifcName [chooseIfName $lnode1 $lnode2] -# FUNCTION -# Choose intreface name. The name can be: -# * eth -- for interface connecting pc, host and router -# * e -- for interface connecting hub and lanswitch -# INPUTS -# * link_id -- link id -# RESULT -# * ifcName -- the name of the interface -#**** - -proc chooseIfName { lnode1 lnode2 } { - global $lnode1 $lnode2 - - # TODO: just check if layer == NETWORK and return eth, LINK return e - switch -exact -- [nodeType $lnode1] { - pc { - return eth - } - host { - return eth - } - hub { - return e - } - lanswitch { - return e - } - router { - return eth - } - rj45 { - return - } - tunnel { - return e - } - ktunnel { - return - } - wlan { - return e - } - default { - return eth -# end Boeing: below - } - } -} - - -#****f* editor.tcl/listLANNodes -# NAME -# listLANNodes -- list LAN nodes -# SYNOPSIS -# set l2peers [listLANNodes $l2node $l2peers] -# FUNCTION -# Recursive function for finding all link layer nodes that are -# connected to node l2node. Returns the list of all link layer -# nodes that are on the same LAN as l2node. -# INPUTS -# * l2node -- node id of a link layer node -# * l2peers -- old link layer nodes on the same LAN -# RESULT -# * l2peers -- new link layer nodes on the same LAN -#**** - -proc listLANnodes { l2node l2peers } { - lappend l2peers $l2node - foreach ifc [ifcList $l2node] { - set peer [logicalPeerByIfc $l2node $ifc] - set type [nodeType $peer] - # Boeing - if { [ lsearch {lanswitch hub wlan} $type] != -1 } { - if { [lsearch $l2peers $peer] == -1 } { - set l2peers [listLANnodes $peer $l2peers] - } - } - } - return $l2peers -} - -#****f* editor.tcl/calcDxDy -# NAME -# calcDxDy lnode -- list LAN nodes -# SYNOPSIS -# calcDxDy $lnode -# FUNCTION -# Calculates dx and dy variables of the calling function. -# INPUTS -# * lnode -- node id of a node whose dx and dy coordinates are -# calculated -#**** - -proc calcDxDy { lnode } { - global showIfIPaddrs showIfIPv6addrs zoom - upvar dx x - upvar dy y - - if { $zoom > 1.0 } { - set x 1 - set y 1 - return - } - switch -exact -- [nodeType $lnode] { - hub { - set x [expr {1.5 / $zoom}] - set y [expr {2.6 / $zoom}] - } - lanswitch { - set x [expr {1.5 / $zoom}] - set y [expr {2.6 / $zoom}] - } - router { - set x [expr {1 / $zoom}] - set y [expr {2 / $zoom}] - } - rj45 { - set x [expr {1 / $zoom}] - set y [expr {1 / $zoom}] - } - tunnel { - set x [expr {1 / $zoom}] - set y [expr {1 / $zoom}] - } - wlan { - set x [expr {1.5 / $zoom}] - set y [expr {2.6 / $zoom}] - } - default { - set x [expr {1 / $zoom}] - set y [expr {2 / $zoom}] - } - } - return -} - -#****f* editor.tcl/updateIfcLabel -# NAME -# updateIfcLabel -- update interface label -# SYNOPSIS -# updateIfcLabel $lnode1 $lnode2 -# FUNCTION -# Updates the interface label, including interface name, -# interface state (* for interfaces that are down), IPv4 -# address and IPv6 address. -# INPUTS -# * lnode1 -- node id of a node where the interface resides -# * lnode2 -- node id of the node that is connected by this -# interface. -#**** -proc updateIfcLabel { lnode1 lnode2 } { - global showIfNames showIfIPaddrs showIfIPv6addrs - - set link [lindex [.c gettags "link && $lnode1 && $lnode2"] 1] - set ifc [ifcByPeer $lnode1 $lnode2] - set ifipv4addr [getIfcIPv4addr $lnode1 $ifc] - set ifipv6addr [getIfcIPv6addr $lnode1 $ifc] - if { $ifc == 0 } { - set ifc "" - } - if { [getIfcOperState $lnode1 $ifc] == "down" } { - set labelstr "*" - } else { - set labelstr "" - } - if { $showIfNames } { - set labelstr "$labelstr$ifc -" - } - if { $showIfIPaddrs && $ifipv4addr != "" } { - set labelstr "$labelstr$ifipv4addr -" - } - if { $showIfIPv6addrs && $ifipv6addr != "" } { - set labelstr "$labelstr$ifipv6addr -" - } - set labelstr \ - [string range $labelstr 0 [expr {[string length $labelstr] - 2}]] - .c itemconfigure "interface && $lnode1 && $link" \ - -text "$labelstr" - # Boeing: hide ifc label on wlans - if { [nodeType $lnode1] == "wlan" } { - .c itemconfigure "interface && $lnode1 && $link" -state hidden - } -} - - -#****f* editor.tcl/updateLinkLabel -# NAME -# updateLinkLabel -- update link label -# SYNOPSIS -# updateLinkLabel $link -# FUNCTION -# Updates the link label, including link bandwidth, link delay, -# BER and duplicate values. -# INPUTS -# * link -- link id of the link whose labels are updated. -#**** -proc updateLinkLabel { link } { - global showLinkLabels - - set bwstr [getLinkBandwidthString $link] - set delstr [getLinkDelayString $link] - set berstr [getLinkBERString $link] - set dupstr [getLinkDupString $link] - set labelstr " -" - if { "$bwstr" != "" } { - set labelstr "$labelstr$bwstr -" - } - if { "$delstr" != "" } { - set labelstr "$labelstr$delstr -" - } - if { "$berstr" != "" } { - set labelstr "$labelstr$berstr -" - } - if { "$dupstr" != "" } { - set labelstr "$labelstr$dupstr -" - } - set labelstr \ - [string range $labelstr 0 [expr {[string length $labelstr] - 2}]] - .c itemconfigure "linklabel && $link" -text "$labelstr" - if { $showLinkLabels == 0} { - .c itemconfigure "linklabel && $link" -state hidden - } -} - - -#****f* editor.tcl/redrawAllLinks -# NAME -# redrawAllLinks -- redraw all links -# SYNOPSIS -# redrawAllLinks -# FUNCTION -# Redraws all links on the current canvas. -#**** -proc redrawAllLinks {} { - global link_list curcanvas - - foreach link $link_list { - set nodes [linkPeers $link] - if { [getNodeCanvas [lindex $nodes 0]] != $curcanvas || - [getNodeCanvas [lindex $nodes 1]] != $curcanvas } { - continue - } - redrawLink $link - } -} - - -#****f* editor.tcl/redrawLink -# NAME -# redrawLink -- redraw a links -# SYNOPSIS -# redrawLink $link -# FUNCTION -# Redraws the specified link. -# INPUTS -# * link -- link id -#**** -proc redrawLink { link } { - global $link - - set limages [.c find withtag "link && $link"] - set limage1 [lindex $limages 0] - set limage2 [lindex $limages 1] - set tags [.c gettags $limage1] - set link [lindex $tags 1] - set lnode1 [lindex $tags 2] - set lnode2 [lindex $tags 3] - - set coords1 [.c coords "node && $lnode1"] - set coords2 [.c coords "node && $lnode2"] - set x1 [lindex $coords1 0] - set y1 [lindex $coords1 1] - set x2 [lindex $coords2 0] - set y2 [lindex $coords2 1] - - .c coords $limage1 $x1 $y1 $x2 $y2 - .c coords $limage2 $x1 $y1 $x2 $y2 - - set lx [expr {0.5 * ($x1 + $x2)}] - set ly [expr {0.5 * ($y1 + $y2)}] - .c coords "linklabel && $link" $lx $ly - - set n [expr {sqrt (($x1 - $x2) * ($x1 - $x2) + \ - ($y1 - $y2) * ($y1 - $y2)) * 0.015}] - if { $n < 1 } { - set n 1 - } - - calcDxDy $lnode1 - set lx [expr {($x1 * ($n * $dx - 1) + $x2) / $n / $dx}] - set ly [expr {($y1 * ($n * $dy - 1) + $y2) / $n / $dy}] - .c coords "interface && $lnode1 && $link" $lx $ly - updateIfcLabel $lnode1 $lnode2 - - calcDxDy $lnode2 - set lx [expr {($x1 + $x2 * ($n * $dx - 1)) / $n / $dx}] - set ly [expr {($y1 + $y2 * ($n * $dy - 1)) / $n / $dy}] - .c coords "interface && $lnode2 && $link" $lx $ly - updateIfcLabel $lnode2 $lnode1 - # Boeing - wlan antennas - if { [nodeType $lnode1] == "wlan" } { - global zoom - set an [lsearch -exact [findWlanNodes $lnode2] $lnode1] - if { $an < 0 || $an >= 5 } { set an 0 } - set dx [expr {20 - (10*$an)}] - .c coords "antenna && $lnode2 && $link" [expr {$x2-($dx*$zoom)}] \ - [expr {$y2-(20*$zoom)}] - } -} - -# Boeing -proc redrawWlanLink { link } { - global $link - - set tags [.c gettags $link] - set lnode1 [lindex $tags 1] - set lnode2 [lindex $tags 2] - set coords1 [.c coords "node && $lnode1"] - set coords2 [.c coords "node && $lnode2"] - set x1 [lindex $coords1 0] - set y1 [lindex $coords1 1] - set x2 [lindex $coords2 0] - set y2 [lindex $coords2 1] - set lx [expr {0.5 * ($x1 + $x2)}] - set ly [expr {0.5 * ($y1 + $y2)}] - - .c coords $link $x1 $y1 $x2 $y2 - .c coords "linklabel && $lnode2 && $lnode1" $lx $ly - - return -} -# end Boeing - -#****f* editor.tcl/splitGUILink -# NAME -# splitGUILink -- splits a links -# SYNOPSIS -# splitGUILink $link -# FUNCTION -# Splits the link and draws new links and new pseudo nodes -# on the canvas. -# INPUTS -# * link -- link id -#**** -proc splitGUILink { link } { - global changed zoom - - set peer_nodes [linkPeers $link] - set new_nodes [splitLink $link pseudo] - set orig_node1 [lindex $peer_nodes 0] - set orig_node2 [lindex $peer_nodes 1] - set new_node1 [lindex $new_nodes 0] - set new_node2 [lindex $new_nodes 1] - set new_link1 [linkByPeers $orig_node1 $new_node1] - set new_link2 [linkByPeers $orig_node2 $new_node2] - setLinkMirror $new_link1 $new_link2 - setLinkMirror $new_link2 $new_link1 - setNodeMirror $new_node1 $new_node2 - setNodeMirror $new_node2 $new_node1 - setNodeName $new_node1 $orig_node2 - setNodeName $new_node2 $orig_node1 - - set x1 [lindex [getNodeCoords $orig_node1] 0] - set y1 [lindex [getNodeCoords $orig_node1] 1] - set x2 [lindex [getNodeCoords $orig_node2] 0] - set y2 [lindex [getNodeCoords $orig_node2] 1] - - setNodeCoords $new_node1 \ - "[expr {($x1 + 0.4 * ($x2 - $x1)) / $zoom}] \ - [expr {($y1 + 0.4 * ($y2 - $y1)) / $zoom}]" - setNodeCoords $new_node2 \ - "[expr {($x1 + 0.6 * ($x2 - $x1)) / $zoom}] \ - [expr {($y1 + 0.6 * ($y2 - $y1)) / $zoom}]" - setNodeLabelCoords $new_node1 [getNodeCoords $new_node1] - setNodeLabelCoords $new_node2 [getNodeCoords $new_node2] - - set changed 1 - updateUndoLog - redrawAll -} - - -#****f* editor.tcl/selectNode -# NAME -# selectNode -- select node -# SYNOPSIS -# selectNode $c $obj -# FUNCTION -# Crates the selecting box around the specified canvas -# object. -# INPUTS -# * c -- tk canvas -# * obj -- tk canvas object tag id -#**** -proc selectNode { c obj } { - set node [lindex [$c gettags $obj] 1] - if { $node == "" } { return } ;# Boeing: fix occassional error - $c addtag selected withtag "node && $node" - if { [nodeType $node] == "pseudo" } { - set bbox [$c bbox "nodelabel && $node"] - } elseif { [nodeType $node] == "rectangle" } { - $c addtag selected withtag "rectangle && $node" - set bbox [$c bbox "rectangle && $node"] - } elseif { [nodeType $node] == "text" } { - $c addtag selected withtag "text && $node" - set bbox [$c bbox "text && $node"] - } elseif { [nodeType $node] == "oval" } { - $c addtag selected withtag "oval && $node" - set bbox [$c bbox "oval && $node"] - } else { - set bbox [$c bbox "node && $node"] - } - set bx1 [expr {[lindex $bbox 0] - 2}] - set by1 [expr {[lindex $bbox 1] - 2}] - set bx2 [expr {[lindex $bbox 2] + 1}] - set by2 [expr {[lindex $bbox 3] + 1}] - $c delete -withtags "selectmark && $node" - $c create line $bx1 $by1 $bx2 $by1 $bx2 $by2 $bx1 $by2 $bx1 $by1 \ - -dash {6 4} -fill black -width 1 -tags "selectmark $node" -} - -proc selectNodes { nodelist } { - foreach node $nodelist { - selectNode .c [.c find withtag "node && $node"] - } -} - -proc selectedNodes {} { - set selected {} - foreach obj [.c find withtag "node && selected"] { - lappend selected [lindex [.c gettags $obj] 1] - } - foreach obj [.c find withtag "oval && selected"] { - lappend selected [lindex [.c gettags $obj] 1] - } - foreach obj [.c find withtag "rectangle && selected"] { - lappend selected [lindex [.c gettags $obj] 1] - } - foreach obj [.c find withtag "text && selected"] { - lappend selected [lindex [.c gettags $obj] 1] - } - return $selected -} - -proc selectedRealNodes {} { - set selected {} - foreach obj [.c find withtag "node && selected"] { - set node [lindex [.c gettags $obj] 1] - if { [getNodeMirror $node] != "" || - [nodeType $node] == "rj45" } { - continue - } - lappend selected $node - } - return $selected -} - -proc selectAdjacent {} { - global curcanvas - - set selected [selectedNodes] - set adjacent {} - foreach node $selected { - foreach ifc [ifcList $node] { - set peer [peerByIfc $node $ifc] - if { [getNodeMirror $peer] != "" } { - return - } - if { [lsearch $adjacent $peer] < 0 } { - lappend adjacent $peer - } - } - } - selectNodes $adjacent -} - -#****f* editor.tcl/button3link -# NAME -# button3link -# SYNOPSIS -# button3link $c $x $y -# FUNCTION -# This procedure is called when a right mouse button is -# clicked on the canvas. If there is a link on the place of -# mouse click this procedure creates and configures a popup -# menu. The options in the menu are: -# * Configure -- configure the link -# * Delete -- delete the link -# * Split -- split the link -# * Merge -- this option is active only if the link is previously -# been split, by this action the link is merged. -# INPUTS -# * c -- tk canvas -# * x -- x coordinate for popup menu -# * y -- y coordinate for popup menu -#**** -proc button3link { c x y } { - global oper_mode env eid canvas_list node_list - global curcanvas - - set link [lindex [$c gettags {link && current}] 1] - if { $link == "" } { - set link [lindex [$c gettags {linklabel && current}] 1] - if { $link == "" } { - return - } - } - - .button3menu delete 0 end - - # - # Configure link - # - .button3menu add command -label "Configure" \ - -command "popupConfigDialog $c" - - # - # Delete link - # - if { $oper_mode != "exec" } { - .button3menu add command -label "Delete" \ - -command "removeGUILink $link atomic" - } else { - .button3menu add command -label "Delete" \ - -state disabled - } - - # - # Split link - # - if { $oper_mode != "exec" && [getLinkMirror $link] == "" } { - .button3menu add command -label "Split" \ - -command "splitGUILink $link" - } else { - .button3menu add command -label "Split" \ - -state disabled - } - - # - # Merge two pseudo nodes / links - # - if { $oper_mode != "exec" && [getLinkMirror $link] != "" && - [getNodeCanvas [getNodeMirror [lindex [linkPeers $link] 1]]] == - $curcanvas } { - .button3menu add command -label "Merge" \ - -command "mergeGUINode [lindex [linkPeers $link] 1]" - } else { - .button3menu add command -label "Merge" -state disabled - } - - set x [winfo pointerx .] - set y [winfo pointery .] - tk_popup .button3menu $x $y -} - - -#****f* editor.tcl/movetoCanvas -# NAME -# movetoCanvas -- move to canvas -# SYNOPSIS -# movetoCanvas $canvas -# FUNCTION -# This procedure moves all the nodes selected in the GUI to -# the specified canvas. -# INPUTS -# * canvas -- canvas id. -#**** -proc movetoCanvas { canvas } { - global changed - - set selected_nodes [selectedNodes] - foreach node $selected_nodes { - setNodeCanvas $node $canvas - set changed 1 - } - foreach obj [.c find withtag "linklabel"] { - set link [lindex [.c gettags $obj] 1] - set link_peers [linkPeers $link] - set peer1 [lindex $link_peers 0] - set peer2 [lindex $link_peers 1] - set peer1_in_selected [lsearch $selected_nodes $peer1] - set peer2_in_selected [lsearch $selected_nodes $peer2] - if { ($peer1_in_selected == -1 && $peer2_in_selected != -1) || - ($peer1_in_selected != -1 && $peer2_in_selected == -1) } { - if { [nodeType $peer2] == "pseudo" } { - setNodeCanvas $peer2 $canvas - if { [getNodeCanvas [getNodeMirror $peer2]] == $canvas } { - mergeLink $link - } - continue - } - set new_nodes [splitLink $link pseudo] - set new_node1 [lindex $new_nodes 0] - set new_node2 [lindex $new_nodes 1] - setNodeMirror $new_node1 $new_node2 - setNodeMirror $new_node2 $new_node1 - setNodeName $new_node1 $peer2 - setNodeName $new_node2 $peer1 - set link1 [linkByPeers $peer1 $new_node1] - set link2 [linkByPeers $peer2 $new_node2] - setLinkMirror $link1 $link2 - setLinkMirror $link2 $link1 - } - } - updateUndoLog - redrawAll -} - - -#****f* editor.tcl/mergeGUINode -# NAME -# mergeGUINode -- merge GUI node -# SYNOPSIS -# mergeGUINode $node -# FUNCTION -# This procedure removes the specified pseudo node as well -# as it's mirror copy. Also this procedure removes the -# pseudo links and reestablish the original link between -# the non-pseudo nodes. -# INPUTS -# * node -- node id of a pseudo node. -#**** -proc mergeGUINode { node } { - set link [lindex [linkByIfc $node [ifcList $node]] 0] - mergeLink $link - redrawAll -} - - -#****f* editor.tcl/button3node -# NAME -# button3node -# SYNOPSIS -# button3node $c $x $y -# FUNCTION -# This procedure is called when a right mouse button is -# clicked on the canvas. Also called when double-clicking -# on a node during runtime. -# If there is a node on the place of -# mouse click this procedure creates and configures a popup -# menu. The options in the menu are: -# * Configure -- configure the node -# * Create link to -- create a link to any available node, -# it can be on the same canvas or on a different canvas. -# * Move to -- move to some other canvas -# * Merge -- this option is available only for pseudo nodes -# that have mirror nodes on the same canvas (Pseudo nodes -# created by splitting a link). -# * Delete -- delete the node -# * Shell window -- specifies the shell window to open in -# exec mode. This option is available only to nodes on a -# network layer -# * Ethereal -- opens a Ethereal program for the specified -# node and the specified interface. This option is available -# only for network layer nodes in exec mode. -# INPUTS -# * c -- tk canvas -# * x -- x coordinate for popup menu -# * y -- y coordinate for popup menu -#**** -#old proc button3node { c x y } -#Boeing -proc button3node { c x y button } { - global oper_mode env eid canvas_list node_list curcanvas systype g_prefs - - set node [lindex [$c gettags {node && current}] 1] - if { $node == "" } { - set node [lindex [$c gettags {nodelabel && current}] 1] - if { $node == "" } { - return - } - } - set mirror_node [getNodeMirror $node] - - if { [$c gettags "node && $node && selected"] == "" } { - $c dtag node selected - $c delete -withtags selectmark - selectNode $c [$c find withtag "current"] - } - - # open up shells upon double-click or shift/ctrl-click - set shell $g_prefs(shell) - if { $button == "shift" || $button == "ctrl" } { - if { [nodeType $node] == "pseudo" } { - # - # Hyperlink to another canvas - # - set curcanvas [getNodeCanvas [getNodeMirror $node]] - switchCanvas none - return - } - # only open bash shells for NETWORK nodes and remote routers - if { [[typemodel $node].layer] != "NETWORK" } { - if { [typemodel $node] == "wlan" } { - wlanDoubleClick $node $button - } - return - } - if { $button == "shift" } { ;# normal bash shell - spawnShell $node $shell - } else { ;# right-click vtysh shell - set cmd [[typemodel $node].shellcmd $node] - if { $cmd != "/bin/sh" && $cmd != "" } { spawnShell $node $cmd } - } - return ;# open shell, don't post a menu - } - - # - # below here we build and post a menu - # - .button3menu delete 0 end - - # - # Configure node - # - if { [nodeType $node] != "pseudo" } { - .button3menu add command -label "Configure" \ - -command "popupConfigDialog $c" - } else { - .button3menu add command -label "Configure" \ - -command "popupConfigDialog $c" -state disabled - } - - # - # Select adjacent - # - if { [nodeType $node] != "pseudo" } { - .button3menu add command -label "Select adjacent" \ - -command "selectAdjacent" - } else { - .button3menu add command -label "Select adjacent" \ - -command "selectAdjacent" -state disabled - } - - # - # Create a new link - can be between different canvases - # - .button3menu.connect delete 0 end - if { $oper_mode == "exec" || [nodeType $node] == "pseudo" } { - #.button3menu add cascade -label "Create link to" \ - -menu .button3menu.connect -state disabled - } else { - .button3menu add cascade -label "Create link to" \ - -menu .button3menu.connect - } - destroy .button3menu.connect.selected - menu .button3menu.connect.selected -tearoff 0 - .button3menu.connect add cascade -label "Selected" \ - -menu .button3menu.connect.selected - .button3menu.connect.selected add command \ - -label "Chain" -command "P \[selectedRealNodes\]" - .button3menu.connect.selected add command \ - -label "Star" \ - -command "Kb \[lindex \[selectedRealNodes\] 0\] \ - \[lrange \[selectedNodes\] 1 end\]" - .button3menu.connect.selected add command \ - -label "Cycle" -command "C \[selectedRealNodes\]" - .button3menu.connect.selected add command \ - -label "Clique" -command "K \[selectedRealNodes\]" - .button3menu.connect add separator - foreach canvas $canvas_list { - destroy .button3menu.connect.$canvas - menu .button3menu.connect.$canvas -tearoff 0 - .button3menu.connect add cascade -label [getCanvasName $canvas] \ - -menu .button3menu.connect.$canvas - } - foreach peer_node $node_list { - set canvas [getNodeCanvas $peer_node] - if { $node != $peer_node && [nodeType $node] != "rj45" && - [lsearch {pseudo rj45} [nodeType $peer_node]] < 0 && - [ifcByLogicalPeer $node $peer_node] == "" } { - .button3menu.connect.$canvas add command \ - -label [getNodeName $peer_node] \ - -command "newGUILink $node $peer_node" - } elseif { [nodeType $peer_node] != "pseudo" } { - .button3menu.connect.$canvas add command \ - -label [getNodeName $peer_node] \ - -state disabled - } - } - # - # assign to emulation server - # - if { $oper_mode != "exec" } { - global exec_servers node_location - .button3menu.assign delete 0 end - .button3menu add cascade -label "Assign to" -menu .button3menu.assign - .button3menu.assign add command -label "(none)" \ - -command "assignSelection \"\"" - foreach server [lsort -dictionary [array names exec_servers]] { - .button3menu.assign add command -label "$server" \ - -command "assignSelection $server" - } - } - - # - # wlan link to all nodes - # - if { [nodeType $node] == "wlan" } { - .button3menu add command -label "Link to all routers" \ - -command "linkAllNodes $node" - set msg "Select new WLAN $node members:" - set cmd "linkSelectedNodes $node" - .button3menu add command -label "Select WLAN members..." \ - -command "popupSelectNodes \"$msg\" \"\" {$cmd}" - set state normal - if { $oper_mode != "exec" } { set state disabled } - .button3menu add command -label "Mobility script..." \ - -command "showMobilityScriptPopup $node" -state $state - } - - # - # Move to another canvas - # - .button3menu.moveto delete 0 end - if { $oper_mode != "exec" && [nodeType $node] != "pseudo" } { - .button3menu add cascade -label "Move to" \ - -menu .button3menu.moveto - .button3menu.moveto add command -label "Canvas:" -state disabled - foreach canvas $canvas_list { - if { $canvas != $curcanvas } { - .button3menu.moveto add command \ - -label [getCanvasName $canvas] \ - -command "movetoCanvas $canvas" - } else { - .button3menu.moveto add command \ - -label [getCanvasName $canvas] -state disabled - } - } - } - - # - # Merge two pseudo nodes / links - # - if { $oper_mode != "exec" && [nodeType $node] == "pseudo" && \ - [getNodeCanvas $mirror_node] == $curcanvas } { - .button3menu add command -label "Merge" \ - -command "mergeGUINode $node" - } - - # - # Delete selection - # - if { $oper_mode != "exec" } { - .button3menu add command -label "Cut" -command cutSelection - .button3menu add command -label "Copy" -command copySelection - .button3menu add command -label "Paste" -command pasteSelection - .button3menu add command -label "Delete" -command deleteSelection - } - - .button3menu add command -label "Hide" -command "hideSelected" - - # Boeing: flag used below - set execstate disabled - if { $oper_mode == "exec" } { set execstate normal } - - # - # Shell selection - # - .button3menu.shell delete 0 end - if { $oper_mode == "exec" && [[typemodel $node].layer] == "NETWORK" } { - .button3menu add cascade -label "Shell window" \ - -menu .button3menu.shell - set cmd [[typemodel $node].shellcmd $node] - if { $cmd != "/bin/sh" && $cmd != "" } { ;# typically adds vtysh - .button3menu.shell add command -label "$cmd" \ - -command "spawnShell $node $cmd" - } - .button3menu.shell add command -label "/bin/sh" \ - -command "spawnShell $node sh" - .button3menu.shell add command -label "$shell" \ - -command "spawnShell $node $shell" - } - - # - # services - # - .button3menu.services delete 0 end - if { $oper_mode == "exec" && [[typemodel $node].layer] == "NETWORK" } { - addServicesRightClickMenu .button3menu $node - } else { - .button3menu add command -label "Services..." -command \ - "sendConfRequestMessage -1 $node services 0x1 -1 \"\"" - } - - # - # Tcpdump, gpsd - # - if { $oper_mode == "exec" && [[typemodel $node].layer] == "NETWORK" } { - addInterfaceCommand $node .button3menu "Tcpdump" "tcpdump -n -l -i" \ - $execstate 1 - addInterfaceCommand $node .button3menu "TShark" "tshark -n -l -i" \ - $execstate 1 - addInterfaceCommand $node .button3menu "Wireshark" "wireshark -k -i" \ - $execstate 0 - # wireshark on host veth pair -- need veth pair name - #wireshark -k -i - if { [lindex $systype 0] == "Linux" } { - set name [getNodeName $node] - .button3menu add command -label "View log..." -state $execstate \ - -command "spawnShell $node \"less ../$name.log\"" - } - } - - # - # Finally post the popup menu on current pointer position - # - set x [winfo pointerx .] - set y [winfo pointery .] - - tk_popup .button3menu $x $y -} - - -#****f* editor.tcl/spawnShell -# NAME -# spawnShell -- spawn shell -# SYNOPSIS -# spawnShell $node $cmd -# FUNCTION -# This procedure spawns a new shell for a specified node. -# The shell is specified in cmd parameter. -# INPUTS -# * node -- node id of the node for which the shell -# is spawned. -# * cmd -- the path to the shell. -#**** -proc spawnShell { node cmd } { - # request an interactive terminal - set sock [lindex [getEmulPlugin $node] 2] - set flags 0x44 ;# set TTY, critical flags - set exec_num [newExecCallbackRequest shell] - sendExecMessage $sock $node $cmd $exec_num $flags -} - -# add a sub-menu to the parentmenu with the given command for each interface -proc addInterfaceCommand { node parentmenu txt cmd state isnodecmd } { - global g_current_session - set childmenu "$parentmenu.[lindex $cmd 0]" - $childmenu delete 0 end - $parentmenu add cascade -label $txt -menu $childmenu -state $state - if { ! $isnodecmd } { - if { $g_current_session == 0 } { set state disabled } - set ssid [shortSessionID $g_current_session] - } - foreach ifc [ifcList $node] { - set addr [lindex [getIfcIPv4addr $node $ifc] 0] - if { $addr != "" } { set addr " ($addr)" } - if { $isnodecmd } { ;# run command in a node - set icmd "spawnShell $node \"$cmd $ifc\"" - } else { ;# exec a command directly - set node_num [string range $node 1 end] - set hex [format "%x" $node_num] - set ifnum [string range $ifc 3 end] - set ifname "veth$hex\\.$ifnum\\.$ssid" - set icmd "exec $cmd $ifname &" - } - $childmenu add command -label "$ifc$addr" -state $state -command $icmd - } -} - -# Boeing: consolodate various raise statements here -proc raiseAll {c} { - $c raise rectangle background - $c raise oval "rectangle || background" - $c raise grid "oval || rectangle || background" - $c raise link "grid || oval || rectangle || background" - $c raise linklabel "link || grid || oval || rectangle || background" - $c raise newlink "linklabel || link || grid || oval || rectangle || background" - $c raise wlanlink "newlink || linklabel || link || grid || oval || rectangle || background" - $c raise antenna "wlanlink || newlink || linklabel || link || grid || oval || rectangle || background" - $c raise interface "antenna || wlanlink || newlink || linklabel || link || grid || oval || rectangle || background" - $c raise node "interface || antenna || wlanlink || newlink || linklabel || link || grid || oval || rectangle || background" - $c raise nodelabel "node || interface || antenna || wlanlink || newlink || linklabel || link || grid || oval || rectangle || background" - $c raise text "nodelabel || node || interface || antenna || wlanlink || newlink || linklabel || link || grid || oval || rectangle || background" - $c raise -cursor -} -# end Boeing - - -#****f* editor.tcl/button1 -# NAME -# button1 -# SYNOPSIS -# button1 $c $x $y $button -# FUNCTION -# This procedure is called when a left mouse button is -# clicked on the canvas. This procedure selects a new -# node or creates a new node, depending on the selected -# tool. -# INPUTS -# * c -- tk canvas -# * x -- x coordinate -# * y -- y coordinate -# * button -- the keyboard button that is pressed. -#**** -proc button1 { c x y button } { - global node_list plot_list curcanvas zoom - global activetool activetoolp newlink curobj changed def_router_model - global router pc host lanswitch rj45 hub - global oval rectangle text - global lastX lastY - global background selectbox - global defLinkColor defLinkWidth - global resizemode resizeobj - global wlan g_twoNodeSelect - global g_view_locked - - set x [$c canvasx $x] - set y [$c canvasy $y] - - set lastX $x - set lastY $y - - # TODO: clean this up - # - too many global variables - # - too many hardcoded cases (lanswitch, router, etc) - # - should be functionalized since lengthy if-else difficult to read - - set curobj [$c find withtag current] - set curtype [lindex [$c gettags current] 0] - - - if { $curtype == "node" || \ - $curtype == "oval" || $curtype == "rectangle" || $curtype == "text" \ - || ( $curtype == "nodelabel" && \ - [nodeType [lindex [$c gettags $curobj] 1]] == "pseudo") } { - set node [lindex [$c gettags current] 1] - set wasselected \ - [expr {[lsearch [$c find withtag "selected"] \ - [$c find withtag "node && $node"]] > -1}] - if { $button == "ctrl" } { - if { $wasselected } { - $c dtag $node selected - $c delete -withtags "selectmark && $node" - } - } elseif { !$wasselected } { - $c dtag node selected - $c delete -withtags selectmark - } - if { $activetool == "select" && !$wasselected} { - selectNode $c $curobj - } - } elseif { $curtype == "selectmark" } { - setResizeMode $c $x $y - } elseif { $activetool == "plot" } { - # plot tool: create new plot windows when clicking on a link - set link "" - set tags [$c gettags $curobj] - if { $curtype == "link" || $curtype == "linklabel" } { - set link [lindex $tags 1] - } elseif { $curtype == "interface" } { - set link [lindex $tags 2] - } - if { $link != "" } { - thruPlot $c $link $x $y 150 220 false - } - return - } elseif { $button != "ctrl" || $activetool != "select" } { - $c dtag node selected - $c delete -withtags selectmark - } - # user has clicked on a blank area or background item - if { [lsearch [.c gettags $curobj] background] != -1 || - [lsearch [.c gettags $curobj] grid] != -1 || - [lsearch [.c gettags $curobj] annotation] != -1 } { - # left mouse button pressed to create a new node - if { [lsearch {select marker link mobility twonode run stop oval \ - rectangle text} $activetool] < 0 } { - if { $g_view_locked == 1 } { return } - if { $activetoolp == "routers" } { - set node [newNode router] - setNodeModel $node $activetool - } else { - set node [newNode $activetool] - } - setNodeCanvas $node $curcanvas - setNodeCoords $node "[expr {$x / $zoom}] [expr {$y / $zoom}]" - lassign [getDefaultLabelOffsets $activetool] dx dy - setNodeLabelCoords $node "[expr {$x / $zoom + $dx}] \ - [expr {$y / $zoom + $dy}]" - drawNode $c $node - selectNode $c [$c find withtag "node && $node"] - set changed 1 - # remove any existing select box - } elseif { $activetool == "select" \ - && $curtype != "node" && $curtype != "nodelabel"} { - $c config -cursor cross - set lastX $x - set lastY $y - if {$selectbox != ""} { - # We actually shouldn't get here! - $c delete $selectbox - set selectbox "" - } - # begin drawing an annotation - } elseif { $activetoolp == "bgobjs" } { - set newcursor cross - if { $activetool == "text" } { set newcursor xterm } - $c config -cursor $newcursor - set lastX $x - set lastY $y - # draw with the marker - } elseif { $activetool == "marker" } { - global markersize markercolor - set newline [$c create oval $lastX $lastY $x $y \ - -width $markersize -outline $markercolor -tags "marker"] - $c raise $newline "background || link || linklabel || interface" - set lastX $x - set lastY $y - } - } else { - if {$curtype == "node" || $curtype == "nodelabel"} { - $c config -cursor fleur - } - if {$activetool == "link" && $curtype == "node"} { - $c config -cursor cross - set lastX [lindex [$c coords $curobj] 0] - set lastY [lindex [$c coords $curobj] 1] - set newlink [$c create line $lastX $lastY $x $y \ - -fill $defLinkColor -width $defLinkWidth \ - -tags "link"] - # twonode tool support - } elseif {$g_twoNodeSelect != "" && $curtype == "node"} { - set curnode [lindex [$c gettags $curobj] 1] - selectTwoNode $curnode - } elseif { $curtype == "node" } { - selectNode $c $curobj - } - # end Boeing - } - - raiseAll $c -} - -proc setResizeMode { c x y } { - set isThruplot false - set type1 notset - - if {$c == ".c"} { - set t1 [$c gettags current] - set o1 [lindex $t1 1] - set type1 [nodeType $o1] - } else { - set o1 $c - set c .c - set isThruplot true - } - #DYL - #puts "RESIZE NODETYPE = $type1" - global resizemode resizeobj - if {$type1== "oval" || $type1== "rectangle" || $isThruplot == true} { - set resizeobj $o1 - set bbox1 [$c bbox $o1] - set x1 [lindex $bbox1 0] - set y1 [lindex $bbox1 1] - set x2 [lindex $bbox1 2] - set y2 [lindex $bbox1 3] - set l 0 ;# left - set r 0 ;# right - set u 0 ;# up - set d 0 ;# down - - if { $x < [expr $x1+($x2-$x1)/8.0]} { set l 1 } - if { $x > [expr $x2-($x2-$x1)/8.0]} { set r 1 } - if { $y < [expr $y1+($y2-$y1)/8.0]} { set u 1 } - if { $y > [expr $y2-($y2-$y1)/8.0]} { set d 1 } - - if {$l==1} { - if {$u==1} { - set resizemode lu - } elseif {$d==1} { - set resizemode ld - } else { - set resizemode l - } - } elseif {$r==1} { - if {$u==1} { - set resizemode ru - } elseif {$d==1} { - set resizemode rd - } else { - set resizemode r - } - } elseif {$u==1} { - set resizemode u - } elseif {$d==1} { - set resizemode d - } else { - set resizemode false - } - } -} - - -#****f* editor.tcl/button1-motion -# NAME -# button1-motion -# SYNOPSIS -# button1-motion $c $x $y -# FUNCTION -# This procedure is called when a left mouse button is -# pressed and the mouse is moved around the canvas. -# This procedure creates new select box, moves the -# selected nodes or draws a new link. -# INPUTS -# * c -- tk canvas -# * x -- x coordinate -# * y -- y coordinate -#**** -proc button1-motion { c x y } { - global activetool newlink changed - global lastX lastY sizex sizey selectbox background - global oper_mode newoval newrect resizemode - global zoom - global g_view_locked - global thruPlotCur thruPlotDragStart - - set x [$c canvasx $x] - set y [$c canvasy $y] - - if {$thruPlotDragStart == "dragging"} { - #puts "active tool is $activetool" - thruPlotDrag $c $thruPlotCur $x $y null true - return - } - - # fix occasional error - if { $x == "" || $y == "" || $lastX == "" || $lastY == "" } { return } - - set curobj [$c find withtag current] - set curtype [lindex [$c gettags current] 0] - - # display coordinates in the status bar - set zoomx [expr {$x / $zoom}] - set zoomy [expr {$y / $zoom}] - .bottom.textbox config -text "<$zoomx, $zoomy>" - - # prevent dragging outside of the canvas area - if { $x < 0 } { - set x 0 - } elseif { $x > $sizex } { - set x $sizex - } - if { $y < 0 } { - set y 0 - } elseif { $y > $sizey } { - set y $sizey - } - - # marker tool drawing on the canvas - if { $activetool == "marker" } { - global markersize markercolor - set dx [expr {$x-$lastX} ] - set dy [expr {$y-$lastY} ] - # this provides smoother drawing - if { $dx > $markersize || $dy > $markersize } { - set mark [$c create line $lastX $lastY $x $y \ - -width $markersize -fill $markercolor -tags "marker"] - $c raise $mark \ - "marker || background || link || linklabel || interface" - } - set mark [$c create oval $x $y $x $y \ - -width $markersize -fill $markercolor \ - -outline $markercolor -tags "marker"] - $c raise $mark "marker || background || link || linklabel || interface" - set lastX $x - set lastY $y - return - } - # disable all other mouse drags in locked mode - if { $g_view_locked == 1 } { return } - - # don't move nodelabels in exec mode, use calcx,y instead of x,y - if {$oper_mode == "exec" && $curtype == "nodelabel" } { - set node [lindex [$c gettags $curobj] 1] - set curobj [$c find withtag "node && $node"] - set curtype "node" - set coords [$c coords $curobj] - set calcx [expr {[lindex $coords 0] / $zoom}] - set calcy [expr {[lindex $coords 1] / $zoom}] - selectNode $c $curobj - } else { - set calcx $x - set calcy $y - } - # drawing a new link - if {$activetool == "link" && $newlink != ""} { - $c coords $newlink $lastX $lastY $x $y - # draw a selection box - } elseif { $activetool == "select" && \ - ( $curobj == $selectbox || $curtype == "background" || $curtype == "grid")} { - if {$selectbox == ""} { - set selectbox [$c create line \ - $lastX $lastY $x $lastY $x $y $lastX $y $lastX $lastY \ - -dash {10 4} -fill black -width 1 -tags "selectbox"] - $c raise $selectbox "background || link || linklabel || interface" - } else { - $c coords $selectbox \ - $lastX $lastY $x $lastY $x $y $lastX $y $lastX $lastY - } - # move a text annotation - } elseif { $activetool == "select" && $curtype == "text" } { - $c move $curobj [expr {$x - $lastX}] [expr {$y - $lastY}] - set changed 1 - set lastX $x - set lastY $y - $c delete [$c find withtag "selectmark"] - # move a nodelabel apart from a node (edit mode only) - } elseif { $activetool == "select" && $curtype == "nodelabel" \ - && [nodeType [lindex [$c gettags $curobj] 1]] != "pseudo" } { - $c move $curobj [expr {$x - $lastX}] [expr {$y - $lastY}] - set changed 1 - set lastX $x - set lastY $y - # actually we should check if curobj==bkgImage - # annotations - } elseif { $activetool == "oval" && \ - ( $curobj == $newoval || $curobj == $background || $curtype == "background" || $curtype == "grid")} { - # Draw a new oval - if {$newoval == ""} { - set newoval [$c create oval $lastX $lastY $x $y \ - -dash {10 4} -width 1 -tags "newoval"] - $c raise $newoval "background || link || linklabel || interface" - } else { - $c coords $newoval \ - $lastX $lastY $x $y - } - # actually we should check if curobj==bkgImage - } elseif { $activetool == "rectangle" && \ - ( $curobj == $newrect || $curobj == $background || $curtype == "background" || $curtype == "grid")} { - # Draw a new rectangle - if {$newrect == ""} { - set newrect [$c create rectangle $lastX $lastY $x $y \ - -outline blue \ - -dash {10 4} -width 1 -tags "newrect"] - $c raise $newrect "oval || background || link || linklabel || interface" - } else { - $c coords $newrect $lastX $lastY $x $y - } - # resizing an annotation - } elseif { $curtype == "selectmark" } { - foreach o [$c find withtag "selected"] { - set node [lindex [$c gettags $o] 1] - set tagovi [$c gettags $o] - set koord [getNodeCoords $node] - - set oldX1 [lindex $koord 0] - set oldY1 [lindex $koord 1] - set oldX2 [lindex $koord 2] - set oldY2 [lindex $koord 3] - switch -exact -- $resizemode { - lu { - set oldX1 $x - set oldY1 $y - } - ld { - set oldX1 $x - set oldY2 $y - } - l { - set oldX1 $x - } - ru { - set oldX2 $x - set oldY1 $y - } - rd { - set oldX2 $x - set oldY2 $y - } - r { - set oldX2 $x - } - u { - set oldY1 $y - } - d { - set oldY2 $y - } - } - if {$selectbox == ""} { - # Boeing: fix "bad screen distance" error - if { $oldX1 == "" || $oldX2 == "" || $oldY1 == "" || \ - $oldY2 == "" } { return } - # end Boeing - set selectbox [$c create line \ - $oldX1 $oldY1 $oldX2 $oldY1 $oldX2 $oldY2 $oldX1 \ - $oldY2 $oldX1 $oldY1 \ - -dash {10 4} -fill black -width 1 -tags "selectbox"] - $c raise $selectbox \ - "background || link || linklabel || interface" - } else { - $c coords $selectbox \ - $oldX1 $oldY1 $oldX2 $oldY1 $oldX2 $oldY2 $oldX1 \ - $oldY2 $oldX1 $oldY1 - } - } - # selected node(s) are being moved - } else { - foreach img [$c find withtag "selected"] { - set node [lindex [$c gettags $img] 1] - set newcoords [$c coords $img] ;# different than getNodeCoords - set img [$c find withtag "selectmark && $node"] - if {$curtype == "oval" || $curtype == "rectangle"} { - $c move $img [expr {($x - $lastX) / 2}] \ - [expr {($y - $lastY) / 2}] - } else { - $c move $img [expr {$x - $lastX}] [expr {$y - $lastY}] - set img [$c find withtag "node && $node"] - $c move $img [expr {$x - $lastX}] [expr {$y - $lastY}] - set img [$c find withtag "nodelabel && $node"] - $c move $img [expr {$x - $lastX}] [expr {$y - $lastY}] - set img [$c find withtag "twonode && $node"] - if {$img != "" } {; # move Two Node Tool circles around node - $c move $img [expr {$x - $lastX}] [expr {$y - $lastY}] - }; - set img [$c find withtag "rangecircles && $node"] - if {$img != "" } {; # move throughput circles around node - $c move $img [expr {$x - $lastX}] [expr {$y - $lastY}] - }; - $c addtag need_redraw withtag "link && $node" - } - if { $oper_mode == "exec" } { - set newx [expr {[lindex $newcoords 0] / $zoom}] - set newy [expr {[lindex $newcoords 1] / $zoom}] - sendNodePosMessage -1 $node -1 $newx $newy -1 0 - } - $c addtag need_redraw withtag "wlanlink && $node" - widgets_move_node $c $node 0 - } - foreach link [$c find withtag "link && need_redraw"] { - redrawLink [lindex [$c gettags $link] 1] - } - foreach wlanlink [$c find withtag "wlanlink && need_redraw"] { - redrawWlanLink $wlanlink - } - $c dtag wlanlink need_redraw - $c dtag link need_redraw - set changed 1 - set lastX $x - set lastY $y - } -} - - -#****f* editor.tcl/pseudo.layer -# NAME -# pseudo.layer -# SYNOPSIS -# set layer [pseudo.layer] -# FUNCTION -# Returns the layer on which the pseudo node operates -# i.e. returns no layer. -# RESULT -# * layer -- returns an empty string -#**** -proc pseudo.layer {} { -} - - -#****f* editor.tcl/newGUILink -# NAME -# newGUILink -- new GUI link -# SYNOPSIS -# newGUILink $lnode1 $lnode2 -# FUNCTION -# This procedure is called to create a new link between -# nodes lnode1 and lnode2. Nodes can be on the same canvas -# or on different canvases. The result of this function -# is directly visible in GUI. -# INPUTS -# * lnode1 -- node id of the first node -# * lnode2 -- node id of the second node -#**** -proc newGUILink { lnode1 lnode2 } { - global changed - - set link [newLink $lnode1 $lnode2] - if { $link == "" } { - return - } - if { [getNodeCanvas $lnode1] != [getNodeCanvas $lnode2] } { - set new_nodes [splitLink $link pseudo] - set orig_nodes [linkPeers $link] - set new_node1 [lindex $new_nodes 0] - set new_node2 [lindex $new_nodes 1] - set orig_node1 [lindex $orig_nodes 0] - set orig_node2 [lindex $orig_nodes 1] - set new_link1 [linkByPeers $orig_node1 $new_node1] - set new_link2 [linkByPeers $orig_node2 $new_node2] - setNodeMirror $new_node1 $new_node2 - setNodeMirror $new_node2 $new_node1 - setNodeName $new_node1 $orig_node2 - setNodeName $new_node2 $orig_node1 - setLinkMirror $new_link1 $new_link2 - setLinkMirror $new_link2 $new_link1 - } - redrawAll - set changed 1 - updateUndoLog -} - - -#****f* editor.tcl/button1-release -# NAME -# button1-release -# SYNOPSIS -# button1-release $c $x $y -# FUNCTION -# This procedure is called when a left mouse button is -# released. -# The result of this function depends on the actions -# during the button1-motion procedure. -# INPUTS -# * c -- tk canvas -# * x -- x coordinate -# * y -- y coordinate -#**** -proc button1-release { c x y } { - global node_list plot_list activetool newlink curobj grid - global changed undolog undolevel redolevel selectbox - global lastX lastY sizex sizey zoom - global autorearrange_enabled - global resizemode resizeobj - set redrawNeeded 0 - global oper_mode - global g_prefs - global g_view_locked - - set x [$c canvasx $x] - set y [$c canvasy $y] - - $c config -cursor left_ptr - # place a new link between items - if {$activetool == "link" && $newlink != ""} { - if { $g_view_locked == 1 } { return } - $c delete $newlink - set newlink "" - set destobj "" - foreach obj [$c find overlapping $x $y $x $y] { - if {[lindex [$c gettags $obj] 0] == "node"} { - set destobj $obj - break - } - } - if {$destobj != "" && $curobj != "" && $destobj != $curobj} { - set lnode1 [lindex [$c gettags $curobj] 1] - set lnode2 [lindex [$c gettags $destobj] 1] - if { [ifcByLogicalPeer $lnode1 $lnode2] == "" } { - set link [newLink $lnode1 $lnode2] - if { $link != "" } { - drawLink $link - redrawLink $link - updateLinkLabel $link - set changed 1 - } - } - } - # annotations - } elseif {$activetool == "rectangle" || $activetool == "oval" } { - if { $g_view_locked == 1 } { return } - popupAnnotationDialog $c 0 "false" - # edit text annotation - } elseif {$activetool == "text" } { - if { $g_view_locked == 1 } { return } - textEnter $c $x $y - } - - if { $changed == 1 } { - set regular true - if { [lindex [$c gettags $curobj] 0] == "nodelabel" } { - set node [lindex [$c gettags $curobj] 1] - selectNode $c [$c find withtag "node && $node"] - } - set selected {} - foreach img [$c find withtag "selected"] { - set node [lindex [$c gettags $img] 1] - lappend selected $node - set coords [$c coords $img] - set x [expr {[lindex $coords 0] / $zoom}] - set y [expr {[lindex $coords 1] / $zoom}] - if { $autorearrange_enabled == 0 && $g_prefs(gui_snap_grid)} { - set dx [expr {(int($x / $grid + 0.5) * $grid - $x) * $zoom}] - set dy [expr {(int($y / $grid + 0.5) * $grid - $y) * $zoom}] - $c move $img $dx $dy - set coords [$c coords $img] - set x [expr {[lindex $coords 0] / $zoom}] - set y [expr {[lindex $coords 1] / $zoom}] - } else { - set dx 0 - set dy 0 - } - if {$x < 0 || $y < 0 || $x > $sizex || $y > $sizey} { - set regular false - } - # nodes with four coordinates - if { [lindex [$c gettags $node] 0] == "oval" || - [lindex [$c gettags $node] 0] == "rectangle" } { - set bbox [$c bbox "selectmark && $node"] - # Boeing: bbox causes annotations to grow, subtract 5 - if { [llength $bbox] > 3 } { - set x1 [lindex $bbox 0] - set y1 [lindex $bbox 1] - set x2 [expr {[lindex $bbox 2] - 5}] - set y2 [expr {[lindex $bbox 3] - 5}] - setNodeCoords $node "$x1 $y1 $x2 $y2" - set redrawNeeded 1 - if {$x1 < 0 || $y1 < 0 || $x1 > $sizex || $y1 > $sizey || \ - $x2 < 0 || $y2 < 0 || $x2 > $sizex || $y2 > $sizey} { - set regular false - } - } - # nodes with two coordinates - } else { - setNodeCoords $node "$x $y" - } - if {[$c find withtag "nodelabel && $node"] != "" } { - $c move "nodelabel && $node" $dx $dy - set coords [$c coords "nodelabel && $node"] - set x [expr {[lindex $coords 0] / $zoom}] - set y [expr {[lindex $coords 1] / $zoom}] - setNodeLabelCoords $node "$x $y" - if {$x < 0 || $y < 0 || $x > $sizex || $y > $sizey} { - set regular false - } - } - $c move "selectmark && $node" $dx $dy - $c addtag need_redraw withtag "link && $node" - set changed 1 - if { $oper_mode == "exec" } { - # send node position update using x,y stored in node - set xy [getNodeCoords $node] ;# read new coordinates - sendNodePosMessage -1 $node -1 [lindex $xy 0] [lindex $xy 1] \ - -1 0 - widgets_move_node $c $node 1 - } - $c addtag need_redraw withtag "wlanlink && $node" - } ;# end of: foreach img selected - if {$regular == "true"} { - # user has dragged something within the canvas boundaries - foreach link [$c find withtag "link && need_redraw"] { - redrawLink [lindex [$c gettags $link] 1] - } - } else { - # user has dragged something beyond the canvas boundaries - .c config -cursor watch - loadCfg $undolog($undolevel) - redrawAll - if {$activetool == "select" } { - selectNodes $selected - } - set changed 0 - } - $c dtag link need_redraw - nodeEnter $c - - # $changed!=1 - } elseif {$activetool == "select" } { - if {$selectbox == ""} { - set x1 $x - set y1 $y - rearrange_off - } else { - set coords [$c coords $selectbox] - set x [lindex $coords 0] - set y [lindex $coords 1] - set x1 [lindex $coords 4] - set y1 [lindex $coords 5] - $c delete $selectbox - set selectbox "" - } - - if { $resizemode == "false" } { - # select tool mouse button release while drawing select box - set enclosed {} - # fix occasional error - if { $x == "" || $y == "" || $x1 == "" || $y1 == "" } { return } - foreach obj [$c find enclosed $x $y $x1 $y1] { - set tags [$c gettags $obj] - if {[lindex $tags 0] == "node" && [lsearch $tags selected] == -1} { - lappend enclosed $obj - } - if {[lindex $tags 0] == "oval" && [lsearch $tags selected] == -1} { - lappend enclosed $obj - } - if {[lindex $tags 0] == "rectangle" && [lsearch $tags selected] == -1} { - lappend enclosed $obj - } - if {[lindex $tags 0] == "text" && [lsearch $tags selected] == -1} { - lappend enclosed $obj - } - } - foreach obj $enclosed { - selectNode $c $obj - } - } else { - # select tool resizing an object by dragging its handles - # DYL bugfix. if x,y does not change, do not resize! - # fixes a bug where the object dissappears - if { $x != $x1 || $y != $y1 } { - setNodeCoords $resizeobj "$x $y $x1 $y1" - } - set redrawNeeded 1 - set resizemode false - } - } - - if { $redrawNeeded } { - set redrawNeeded 0 - redrawAll - } else { - raiseAll $c - } - update - updateUndoLog -} - - -#****f* editor.tcl/nodeEnter -# NAME -# nodeEnter -# SYNOPSIS -# nodeEnter $c -# FUNCTION -# This procedure prints the node id, node name and -# node model (if exists), as well as all the interfaces -# of the node in the status line. -# Information is presented for the node above which is -# the mouse pointer. -# INPUTS -# * c -- tk canvas -#**** -proc nodeEnter { c } { - global activetool - - set curtags [$c gettags current] - if { [lsearch -exact "node nodelabel" [lindex $curtags 0]] < 0 } { - return ;# allow this proc to be called from button1-release - } - set node [lindex $curtags 1] - set type [nodeType $node] - set name [getNodeName $node] - set model [getNodeModel $node] - if { $model != "" } { - set line "{$node} $name ($model):" - } else { - set line "{$node} $name:" - } - if { $type != "rj45" && $type != "tunnel" } { - foreach ifc [ifcList $node] { - set line "$line $ifc:[getIfcIPv4addr $node $ifc]" - } - } - set xy [getNodeCoords $node] - set line "$line <[lindex $xy 0], [lindex $xy 1]>" - .bottom.textbox config -text "$line" - widgetObserveNode $c $node -} - - -#****f* editor.tcl/linkEnter -# NAME -# linkEnter -# SYNOPSIS -# linkEnter $c -# FUNCTION -# This procedure prints the link id, link bandwidth -# and link delay in the status line. -# Information is presented for the link above which is -# the mouse pointer. -# INPUTS -# * c -- tk canvas -#**** -proc linkEnter {c} { - global activetool link_list - - set link [lindex [$c gettags current] 1] - if { [lsearch $link_list $link] == -1 } { - return - } - set line "$link: [getLinkBandwidthString $link] [getLinkDelayString $link]" - .bottom.textbox config -text "$line" -} - - -#****f* editor.tcl/anyLeave -# NAME -# anyLeave -# SYNOPSIS -# anyLeave $c -# FUNCTION -# This procedure clears the status line. -# INPUTS -# * c -- tk canvas -#**** -proc anyLeave {c} { - global activetool - - .bottom.textbox config -text "" -# Boeing - widgetObserveNode $c "" -# nodeHighlights $c "" off "" -# end Boeing -} - - -#****f* editor.tcl/checkIntRange -# NAME -# checkIntRange -- check integer range -# SYNOPSIS -# set check [checkIntRange $str $low $high] -# FUNCTION -# This procedure checks the input string to see if it is -# an integer between the low and high value. -# INPUTS -# str -- string to check -# low -- the bottom value -# high -- the top value -# RESULT -# * check -- set to 1 if the str is string between low and high -# value, 0 otherwise. -#**** -proc checkIntRange { str low high } { - if { $str == "" } { - return 1 - } - set str [string trimleft $str 0] - if { $str == "" } { - set str 0 - } - if { ![string is integer $str] } { - return 0 - } - if { $str < $low || $str > $high } { - return 0 - } - return 1 -} - -proc checkFloatRange { str low high } { - if { $str == "" } { - return 1 - } - set str [string trimleft $str 0] - if { $str == "" } { - set str 0 - } - if { ![string is double $str] } { - return 0 - } - if { $str < $low || $str > $high } { - return 0 - } - return 1 -} - -proc checkHostname { str } { - # per RFC 952 and RFC 1123, any letter, number, or hyphen - return [regexp {^[A-Za-z0-9-]+$} $str] -} - - -#****f* editor.tcl/focusAndFlash -# NAME -# focusAndFlash -- focus and flash -# SYNOPSIS -# focusAndFlash $W $count -# FUNCTION -# This procedure sets the focus on the bad entry field -# and on this filed it provides an effect of flashing -# for approximately 1 second. -# INPUTS -# * W -- textbox field that caused the bed entry -# * count -- the parameter that causes flashes. -# It can be left blank. -#**** -proc focusAndFlash {W {count 9}} { - global badentry - - set fg black - set bg white - - if { $badentry == -1 } { - return - } else { - set badentry 1 - } - - focus -force $W - if {$count<1} { - $W configure -foreground $fg -background $bg - set badentry 0 - } else { - if {$count%2} { - $W configure -foreground $bg -background $fg - } else { - $W configure -foreground $fg -background $bg - } - after 200 [list focusAndFlash $W [expr {$count - 1}]] - } -} - - -#****f* editor.tcl/popupConfigDialog -# NAME -# popupConfigDialog -- popup Configuration Dialog Box -# SYNOPSIS -# popupConfigDialog $c -# FUNCTION -# Dynamically creates a popup dialog box for configuring -# links or nodes in IMUNES. -# INPUTS -# * c -- canvas id -#**** -proc popupConfigDialog { c } { - global activetool router_model link_color oper_mode - global badentry curcanvas - global node_location systype - global plugin_img_del - set type "" - - set wi .popup - if { [winfo exists $wi ] } { - return - } - catch {destroy $wi} - toplevel $wi - - wm transient $wi . - wm resizable $wi 1 1 - - set object_type "" - set tk_type [lindex [$c gettags current] 0] - set target [lindex [$c gettags current] 1] - if { [lsearch {node nodelabel interface} $tk_type] > -1 } { - set object_type node - } - if { [lsearch {link linklabel} $tk_type] > -1 } { - set object_type link - } - if { [lsearch {oval} $tk_type] > -1 } { - set object_type oval - } - if { [lsearch {rectangle} $tk_type] > -1 } { - set object_type rectangle - } - if { [lsearch {text} $tk_type] > -1 } { - set object_type text - } - if { "$object_type" == ""} { - destroy $wi - return - } - if { $object_type == "link" } { - set n0 [lindex [linkPeers $target] 0] - set n1 [lindex [linkPeers $target] 1] - # Boeing: added tunnel check - #if { [nodeType $n0] == "rj45" || [nodeType $n1] == "rj45" || \ - # [nodeType $n0] == "tunnel" || [nodeType $n1] == "tunnel" } { - # destroy $wi - # return - #} - } - $c dtag node selected - $c delete -withtags selectmark - - switch -exact -- $object_type { - node { - set type [nodeType $target] - if { $type == "pseudo" } { - # - # Hyperlink to another canvas - # - destroy $wi - set curcanvas [getNodeCanvas [getNodeMirror $target]] - switchCanvas none - return - } - set model [getNodeModel $target] - set router_model $model - wm title $wi "$type configuration" - ttk::frame $wi.ftop -borderwidth 4 - ttk::entry $wi.ftop.name -width 16 \ - -validate focus -invalidcommand "focusAndFlash %W" - if { $type == "rj45" } { - ttk::label $wi.ftop.name_label -text "Physical interface:" - } elseif { $type == "tunnel" } { - ttk::label $wi.ftop.name_label -text "IP address of tunnel peer:" - } else { - ttk::label $wi.ftop.name_label -text "Node name:" - $wi.ftop.name configure -validatecommand {checkHostname %P} - } - $wi.ftop.name insert 0 [getNodeName $target] - set img [getNodeImage $target] - ttk::button $wi.ftop.img -image $img -command "popupCustomImage $target" - - if { $type == "rj45" } { - rj45ifclist $wi $target 0 - } - # execution server - global exec_servers node_location - set node_location [getNodeLocation $target] - set servers [lsort -dictionary [array names exec_servers]] - set servers "(none) $servers" - if { $node_location == "" } { set node_location "(none)" } - eval tk_optionMenu $wi.ftop.menu node_location $servers - pack $wi.ftop.img $wi.ftop.menu $wi.ftop.name $wi.ftop.name_label \ - -side right -padx 4 -pady 4 - # end Boeing - pack $wi.ftop -side top - if { $type == "router" } { - - ttk::frame $wi.model -borderwidth 4 - ttk::label $wi.model.label -text "Type:" - set runstate "disabled" - if { $oper_mode == "edit" } { - eval tk_optionMenu $wi.model.menu router_model \ - [getNodeTypeNames] - set runstate "normal" - } else { - tk_optionMenu $wi.model.menu router_model $model - } - # would be nice to update the image upon selection; binding to - # will not work - #tkwait variable router_model "customImageApply $wi $target" - set sock [lindex [getEmulPlugin $target] 2] - ttk::button $wi.model.services -text "Services..." -state $runstate \ - -command \ - "sendConfRequestMessage $sock $target services 0x1 -1 \"\"" - pack $wi.model.services $wi.model.menu $wi.model.label \ - -side right -padx 0 -pady 0 - pack $wi.model -side top - } - - if { $type == "wlan" } { - wlanConfigDialogHelper $wi $target 0 - } elseif { $type == "tunnel" } { - # - # tunnel controls - # - ttk::frame $wi.con2 - global conntap - set conntap [netconfFetchSection $target "tunnel-tap"] - if { $conntap == "" } { set conntap off } - # TODO: clean this up - ttk::radiobutton $wi.con2.dotap0 \ - -variable conntap -value off \ - -text "tunnel to another CORE emulation" - ttk::frame $wi.con2.key - ttk::label $wi.con2.key.lab -text "GRE key:" - ttk::entry $wi.con2.key.key -width 6 - ttk::radiobutton $wi.con2.dotap1 -state disabled \ - -variable conntap -value on \ - -text "tunnel to the virtual TAP interface of another system" - pack $wi.con2.key.lab $wi.con2.key.key -side left - pack $wi.con2.dotap0 -side top -anchor w - pack $wi.con2.key -side top - pack $wi.con2.dotap1 -side top -anchor w - pack $wi.con2 -side top - set key [netconfFetchSection $target "tunnel-key"] - if { $key == "" } { set key 1 } - $wi.con2.key.key insert 0 $key - - # TODO: clean this up - ttk::frame $wi.conn - ttk::label $wi.conn.label -text "Transport type:" - tk_optionMenu $wi.conn.conntype conntype "UDP" "TCP" - $wi.conn.conntype configure -state disabled - pack $wi.conn.label $wi.conn.conntype -side left -anchor w - pack $wi.conn -side top - global conntype - set conntype [netconfFetchSection $target "tunnel-type"] - if { $conntype == "" } { set conntype "UDP" } - - - # TODO: clean this up - ttk::frame $wi.linfo - ttk::label $wi.linfo.label -text "Local hook:" - ttk::entry $wi.linfo.local -state disabled - set localhook [netconfFetchSection $target "local-hook"] - if { $localhook == "" || $localhook == "(none)" } { - # automatically generate local hook name - set ifc [lindex [ifcList $target] 0] - if { $ifc != "" } { - set hname [info hostname] - set peer [peerByIfc $target $ifc] - set localhook "$hname$peer" - } else { - set localhook "(none)" - } - } - $wi.linfo.local insert 0 $localhook - pack $wi.linfo.label $wi.linfo.local -side left -anchor w - pack $wi.linfo -side top - - ttk::frame $wi.pinfo - ttk::label $wi.pinfo.label -text "Peer hook:" - ttk::entry $wi.pinfo.peer -state disabled - $wi.pinfo.peer insert 0 \ - [netconfFetchSection $target "peer-hook"] - pack $wi.pinfo.label $wi.pinfo.peer -side left -anchor w - pack $wi.pinfo -side top - } - - # interface list - if { [[typemodel $target].layer] == "NETWORK" } { - # canvas used for scrolling frames for each interface - ttk::frame $wi.ifaces - set height [expr {100 * [llength [ifcList $target]]}] - if { $height > 300 } { set height 300 } - canvas $wi.ifaces.c -height $height -highlightthickness 0 \ - -yscrollcommand "$wi.ifaces.scroll set" - scrollbar $wi.ifaces.scroll -command "$wi.ifaces.c yview" - pack $wi.ifaces.c -side left -fill both -expand 1 - pack $wi.ifaces.scroll -side right -fill y - pack $wi.ifaces -side top -fill both -expand 1 - set y 0 - - foreach ifc [lsort -ascii [ifcList $target]] { - set fr $wi.ifaces.c.if$ifc - ttk::labelframe $fr -text "Interface $ifc" - $wi.ifaces.c create window 4 $y -window $fr -anchor nw - incr y 100 - - set peer [peerByIfc $target $ifc] - if { [isEmane $peer] } { - ttk::frame $fr.opts - set caps [getCapabilities $peer "mobmodel"] - set cap [lindex $caps 0] - set cmd "sendConfRequestMessage -1 $target $cap 0x1 -1 \"\"" - ttk::button $fr.opts.cfg -command $cmd \ - -text "$cap options..." - pack $fr.opts.cfg -side left -padx 4 - pack $fr.opts -side top -anchor w - incr y 28 - } - - ttk::frame $fr.cfg - # - # MAC address - # - ttk::frame $fr.cfg.mac - ttk::label $fr.cfg.mac.addrl -text "MAC address" \ - -anchor w - set macaddr [getIfcMacaddr $target $ifc] - global if${ifc}_auto_mac - if { $macaddr == "" } { - set if${ifc}_auto_mac 1 - set state disabled - } else { - set if${ifc}_auto_mac 0 - set state normal - } - ttk::checkbutton $fr.cfg.mac.auto -text "auto-assign" \ - -variable if${ifc}_auto_mac \ - -command "macEntryHelper $wi $ifc" - ttk::entry $fr.cfg.mac.addrv -width 15 \ - -state $state - $fr.cfg.mac.addrv insert 0 $macaddr - pack $fr.cfg.mac.addrl $fr.cfg.mac.auto \ - $fr.cfg.mac.addrv -side left -padx 4 - pack $fr.cfg.mac -side top -anchor w - - # - # IPv4 address - # - ttk::frame $fr.cfg.ipv4 - ttk::label $fr.cfg.ipv4.addrl -text "IPv4 address" \ - -anchor w - ttk::entry $fr.cfg.ipv4.addrv -width 30 \ - -validate focus -invalidcommand "focusAndFlash %W" - $fr.cfg.ipv4.addrv insert 0 \ - [getIfcIPv4addr $target $ifc] - $fr.cfg.ipv4.addrv configure \ - -validatecommand {checkIPv4Net %P} - ttk::button $fr.cfg.ipv4.clear -image $plugin_img_del \ - -command "$fr.cfg.ipv4.addrv delete 0 end" - pack $fr.cfg.ipv4.addrl $fr.cfg.ipv4.addrv \ - $fr.cfg.ipv4.clear -side left - pack $fr.cfg.ipv4 -side top -anchor w -padx 4 - - # - # IPv6 address - # - ttk::frame $fr.cfg.ipv6 - ttk::label $fr.cfg.ipv6.addrl -text "IPv6 address" \ - -anchor w - ttk::entry $fr.cfg.ipv6.addrv -width 30 \ - -validate focus -invalidcommand "focusAndFlash %W" - $fr.cfg.ipv6.addrv insert 0 \ - [getIfcIPv6addr $target $ifc] - $fr.cfg.ipv6.addrv configure -validatecommand {checkIPv6Net %P} - ttk::button $fr.cfg.ipv6.clear -image $plugin_img_del \ - -command "$fr.cfg.ipv6.addrv delete 0 end" - pack $fr.cfg.ipv6.addrl $fr.cfg.ipv6.addrv \ - $fr.cfg.ipv6.clear -side left - pack $fr.cfg.ipv6 -side top -anchor w -padx 4 - pack $fr.cfg -side left - bind $fr.cfg <4> "$wi.ifaces.c yview scroll -1 units" - bind $fr.cfg <5> "$wi.ifaces.c yview scroll 1 units" - } ;# end foreach ifc - $wi.ifaces.c configure -scrollregion "0 0 250 $y" - # mouse wheel bindings for scrolling - foreach ctl [list $wi.ifaces.c $wi.ifaces.scroll] { - bind $ctl <4> "$wi.ifaces.c yview scroll -1 units" - bind $ctl <5> "$wi.ifaces.c yview scroll 1 units" - bind $ctl "$wi.ifaces.c yview scroll -1 units" - bind $ctl "$wi.ifaces.c yview scroll 1 units" - } - } - } - oval { - destroy $wi - annotationConfig $c $target - return - } - rectangle { - destroy $wi - annotationConfig $c $target - return - } - text { - destroy $wi - annotationConfig $c $target - return - } - link { - wm title $wi "link configuration" - ttk::frame $wi.ftop -borderwidth 6 - set nam0 [getNodeName $n0] - set nam1 [getNodeName $n1] - ttk::label $wi.ftop.name_label -justify left -text \ - "Link from $nam0 to $nam1" - pack $wi.ftop.name_label -side right - pack $wi.ftop -side top - - set spinbox [getspinbox] - global g_link_config_uni_state - set g_link_config_uni_state "bid" - - ttk::frame $wi.preset -borderwidth 4 - global link_preset_val - set link_preset_val unlimited - set linkpreMenu [tk_optionMenu $wi.preset.linkpre link_preset_val a] - # unidirectional links not always supported - if { [isUniSupported $n0 $n1] } { - set unistate normal - } else { - set unistate disabled - } - ttk::button $wi.preset.uni -text " >> " -state $unistate \ - -command "linkConfigUni $wi" - pack $wi.preset.uni $wi.preset.linkpre -side right - linkPresets $wi $linkpreMenu init - pack $wi.preset -side top -anchor e - - ttk::frame $wi.unilabel -borderwidth 4 - ttk::label $wi.unilabel.updown -text "Symmetric link effects:" - pack $wi.unilabel.updown -side left -anchor w - pack $wi.unilabel -side top -anchor w - - ttk::frame $wi.bandwidth -borderwidth 4 - ttk::label $wi.bandwidth.label -anchor e -text "Bandwidth (bps):" - $spinbox $wi.bandwidth.value -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.bandwidth.value insert 0 [getLinkBandwidth $target] - $wi.bandwidth.value configure \ - -validatecommand {checkIntRange %P 0 1000000000} \ - -from 0 -to 1000000000 -increment 1000000 - pack $wi.bandwidth.value $wi.bandwidth.label -side right - pack $wi.bandwidth -side top -anchor e - - ttk::frame $wi.delay -borderwidth 4 - ttk::label $wi.delay.label -anchor e -text "Delay (us):" - $spinbox $wi.delay.value -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.delay.value insert 0 [getLinkDelay $target] - # 274 seconds is maximum netem delay for Linux 3.2.0-60-generic kernel - $wi.delay.value configure \ - -validatecommand {checkIntRange %P 0 274000000} \ - -from 0 -to 10000000 -increment 5 - pack $wi.delay.value $wi.delay.label -side right - pack $wi.delay -side top -anchor e - - ttk::frame $wi.jitter -borderwidth 4 - ttk::label $wi.jitter.label -anchor e -text "Jitter (us):" - $spinbox $wi.jitter.value -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.jitter.value insert 0 [getLinkJitter $target] - $wi.jitter.value configure \ - -validatecommand {checkIntRange %P 0 10000000} \ - -from 0 -to 10000000 -increment 5 - pack $wi.jitter.value $wi.jitter.label -side right - pack $wi.jitter -side top -anchor e - - ttk::frame $wi.ber -borderwidth 4 - if { [lindex $systype 0] == "Linux" } { - set bertext "Loss (%):" - set berinc 0.1 - set bermax 100.0 - } else { ;# netgraph uses BER - set bertext "BER (1/N):" - set berinc 1000 - set bermax 10000000000000 - } - ttk::label $wi.ber.label -anchor e -text $bertext - $spinbox $wi.ber.value -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.ber.value insert 0 [getLinkBER $target] - $wi.ber.value configure \ - -validatecommand "checkFloatRange %P 0.0 $bermax" \ - -from 0.0 -to $bermax -increment $berinc - pack $wi.ber.value $wi.ber.label -side right - pack $wi.ber -side top -anchor e - - ttk::frame $wi.dup -borderwidth 4 - ttk::label $wi.dup.label -anchor e -text "Duplicate (%):" - $spinbox $wi.dup.value -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.dup.value insert 0 [getLinkDup $target] - $wi.dup.value configure \ - -validatecommand {checkFloatRange %P 0 50} \ - -from 0 -to 50 -increment 1 - pack $wi.dup.value $wi.dup.label -side right - pack $wi.dup -side top -anchor e - -# Boeing: jitter -# frame $wi.jitter -borderwidth 4 -# label $wi.jitter.label -anchor e -text "Jitter (us):" -# spinbox $wi.jitter.value -bg white -justify right -width 10 \ -# -validate focus -invalidcommand "focusAndFlash %W" -# $wi.jitter.value insert 0 [getLinkJitter $target] -# $wi.jitter.value configure \ -# -validatecommand {checkIntRange %P 0 10000000} \ -# -from 0 -to 10000000 -increment 5 -# pack $wi.jitter.value $wi.jitter.label -side right -# pack $wi.jitter -side top -anchor e -# end Boeing - - ttk::frame $wi.color -borderwidth 4 - ttk::label $wi.color.label -anchor e -text "Color:" - set link_color [getLinkColor $target] - tk_optionMenu $wi.color.value link_color \ - Red Green Blue Yellow Magenta Cyan Black - $wi.color.value configure -width 8 - pack $wi.color.value $wi.color.label -side right - pack $wi.color -side top -anchor e - - ttk::frame $wi.width -borderwidth 4 - ttk::label $wi.width.label -anchor e -text "Width:" - $spinbox $wi.width.value -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.width.value insert 0 [getLinkWidth $target] - $wi.width.value configure \ - -validatecommand {checkIntRange %P 1 8} \ - -from 1 -to 8 -increment 1 - pack $wi.width.value $wi.width.label -side right - pack $wi.width -side top -anchor e - - # auto-expand upstream if values exist - set bw [getLinkBandwidth $target up] - set dl [getLinkDelay $target up] - set jt [getLinkJitter $target up] - set ber [getLinkBER $target up] - set dup [getLinkDup $target up] - if { $bw > 0 || $dl > 0 || $jt > 0 || $ber > 0 || $dup > 0 } { - linkConfigUni $wi - $wi.bandwidth.value2 delete 0 end - $wi.bandwidth.value2 insert 0 $bw - $wi.delay.value2 delete 0 end - $wi.delay.value2 insert 0 $dl - $wi.jitter.value2 delete 0 end - $wi.jitter.value2 insert 0 $jt - $wi.ber.value2 delete 0 end - $wi.ber.value2 insert 0 $ber - $wi.dup.value2 delete 0 end - $wi.dup.value2 insert 0 $dup - } - } - } ;# end switch - - ttk::frame $wi.butt -borderwidth 6 - # NOTE: plugins.tcl:popupCapabilityConfig may read this command option - ttk::button $wi.butt.apply -text "Apply" -command \ - "popupConfigApply $wi $object_type $target 0" - focus $wi.butt.apply - # Boeing: remove range circles upon cancel - if {$type == "wlan"} { - set cancelcmd "set badentry -1 ; destroy $wi;" - set cancelcmd "$cancelcmd updateRangeCircles $target 0" - } else { - set cancelcmd "set badentry -1 ; destroy $wi" - } - ttk::button $wi.butt.cancel -text "Cancel" -command $cancelcmd - #end Boeing - pack $wi.butt.cancel $wi.butt.apply -side right - pack $wi.butt -side bottom - bind $wi $cancelcmd -# bind $wi "popupConfigApply $wi $object_type $target 0" -} - - -proc linkConfigUni { wi } { - global g_link_config_uni_state - - set capt [lindex [$wi.preset.uni configure -text] 4] - - if { $capt == " >> " } { - set g_link_config_uni_state "uni" - $wi.preset.uni configure -text " << " - set txt "Asymmetric effects: downstream / upstream" - $wi.unilabel.updown configure -text $txt - - set spinbox [getspinbox] - if { ![winfo exists $wi.bandwidth.value2] } { - $spinbox $wi.bandwidth.value2 -justify right \ - -width 10 -validate focus -invalidcommand "focusAndFlash %W" - $wi.bandwidth.value2 configure \ - -validatecommand {checkIntRange %P 0 1000000000} \ - -from 0 -to 1000000000 -increment 1000000 - } - $wi.bandwidth.value2 delete 0 end - $wi.bandwidth.value2 insert 0 [$wi.bandwidth.value get] - pack $wi.bandwidth.value2 -side right - pack $wi.bandwidth.value2 -before $wi.bandwidth.value - - if { ![winfo exists $wi.delay.value2] } { - $spinbox $wi.delay.value2 -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.delay.value2 configure \ - -validatecommand {checkIntRange %P 0 10000000} \ - -from 0 -to 10000000 -increment 5 - } - $wi.delay.value2 delete 0 end - $wi.delay.value2 insert 0 [$wi.delay.value get] - pack $wi.delay.value2 -side right - pack $wi.delay.value2 -before $wi.delay.value - - if { ![winfo exists $wi.jitter.value2] } { - $spinbox $wi.jitter.value2 -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.jitter.value2 configure \ - -validatecommand {checkIntRange %P 0 10000000} \ - -from 0 -to 10000000 -increment 5 - } - $wi.jitter.value2 delete 0 end - $wi.jitter.value2 insert 0 [$wi.jitter.value get] - pack $wi.jitter.value2 -side right - pack $wi.jitter.value2 -before $wi.jitter.value - - if { ![winfo exists $wi.ber.value2] } { - $spinbox $wi.ber.value2 -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.ber.value2 configure \ - -validatecommand "checkFloatRange %P 0.0 100.0" \ - -from 0.0 -to 100.0 -increment 0.1 - } - $wi.ber.value2 delete 0 end - $wi.ber.value2 insert 0 [$wi.ber.value get] - pack $wi.ber.value2 -side right - pack $wi.ber.value2 -before $wi.ber.value - - if { ![winfo exists $wi.dup.value2] } { - $spinbox $wi.dup.value2 -justify right -width 10 \ - -validate focus -invalidcommand "focusAndFlash %W" - $wi.dup.value2 configure \ - -validatecommand {checkFloatRange %P 0 50} \ - -from 0 -to 50 -increment 1 - } - $wi.dup.value2 delete 0 end - $wi.dup.value2 insert 0 [$wi.dup.value get] - pack $wi.dup.value2 -side right - pack $wi.dup.value2 -before $wi.dup.value - } else { - set g_link_config_uni_state "bid" - $wi.preset.uni configure -text " >> " - $wi.unilabel.updown configure -text "Symmetric link effects:" - pack forget $wi.bandwidth.value2 - pack forget $wi.delay.value2 - pack forget $wi.jitter.value2 - pack forget $wi.ber.value2 - pack forget $wi.dup.value2 - } -} - -# unidirectional links are not always supported -proc isUniSupported { n1 n2 } { - set blacklist [list "hub" "lanswitch"] - set type1 [nodeType $n1] - set type2 [nodeType $n2] - # not yet supported for GRE tap device - if { $type1 == "tunnel" || $type2 == "tunnel" } { - return false - } - # unidirectional links are supported between two switches/hubs - if { [lsearch $blacklist $type1] != -1 && \ - [lsearch $blacklist $type2] != -1 } { - return true - } - # unidirectional links not supported between hub/switch and something else - if { [lsearch $blacklist $type1] != -1 || \ - [lsearch $blacklist $type2] != -1 } { - return false - } - # unidirectional links are supported between routers, rj45s, etc. - # WLANs not included here because they have no link dialog - return true -} - -# toggle the state of the mac address entry, and insert MAC address template -proc macEntryHelper { wi ifc } { - set fr $wi.ifaces.c.if$ifc - set ctl $fr.cfg.mac.addrv - set s normal - if { [$ctl cget -state] == $s } { set s disabled } - $ctl configure -state $s - - if { [$ctl get] == "" } { $ctl insert 0 "00:00:00:00:00:00" } -} - - -#****f* editor.tcl/popupConfigApply -# NAME -# popupConfigApply -- popup configuration apply -# SYNOPSIS -# popupConfigApply $w $object_type $target $phase -# FUNCTION -# This procedure is called when the button apply is pressed in -# popup configuration dialog box. It reads different -# configuration parameters depending on the object_type. -# INPUTS -# * w -- widget -# * object_type -- describes the object type that is currently -# configured. It can be either link or node. -# * target -- node id of the configured node or link id of the -# configured link -# * phase -- This procedure is invoked in two diffenet phases -# to enable validation of the entry that was the last made. -# When calling this function always use the phase parameter -# set to 0. -#**** -proc popupConfigApply { wi object_type target phase } { - global changed oper_mode router_model link_color badentry - global customEnabled ipsecEnabled - global eid - - $wi config -cursor watch - update - if { $phase == 0 } { - set badentry 0 - focus . - after 100 "popupConfigApply $wi $object_type $target 1" - return - } elseif { $badentry } { - $wi config -cursor left_ptr - return - } - switch -exact -- $object_type { - # - # Node - # - node { - set type [nodeType $target] - set model [getNodeModel $target] - set name [string trim [$wi.ftop.name get]] - set changed_to_remote 0 - global node_location - if { $node_location != [getNodeLocation $target] } { - if { $node_location == "(none)" } { set node_location "" } - setNodeLocation $target $node_location - set changed 1 - } - set node_location "" - if { $name != [getNodeName $target] } { - setNodeName $target $name - set changed 1 - } - if { $oper_mode == "edit" && $type == "router" && \ - $router_model != $model } { - setNodeModel $target $router_model - set changed 1 - if { $router_model == "remote" } { set changed_to_remote 1 };#Boeing - } - -# Boeing - added wlan, remote, tunnel, ktunnel items - if { $type == "wlan" } { - wlanConfigDialogHelper $wi $target 1 - } elseif { $type == "tunnel" } { - # - # apply tunnel items - # - set ipaddr "$name/24" ;# tunnel name == IP address of peer - set oldipaddr [getIfcIPv4addr $target e0] - if { $ipaddr != $oldipaddr } { - setIfcIPv4addr $target e0 $ipaddr - } - global conntype conntap - set oldconntype [netconfFetchSection $target "tunnel-type"] - if { $oldconntype != $conntype } { - netconfInsertSection $target [list "tunnel-type" $conntype] - } - set oldconntap [netconfFetchSection $target "tunnel-tap"] - if { $oldconntap != $conntap } { - netconfInsertSection $target [list "tunnel-tap" $conntap] - } - set oldkey [netconfFetchSection $target "tunnel-key"] - set key [$wi.con2.key.key get] - if { $oldkey != $key } { - netconfInsertSection $target [list "tunnel-key" $key] - } - - set oldlocal [netconfFetchSection $target "local-hook"] - set local [$wi.linfo.local get] - if { $oldlocal != $local } { - netconfInsertSection $target [list "local-hook" $local] - } - - set oldpeer [netconfFetchSection $target "peer-hook"] - set peer [$wi.pinfo.peer get] - if { $oldpeer != $peer } { - netconfInsertSection $target [list "peer-hook" $peer] - } - } elseif { $type == "ktunnel" } { - # - # apply ktunnel items - # - set oldlocal [netconfFetchSection $target "local-hook"] - set local [$wi.linfo.local get] - if { $oldlocal != $local } { - netconfInsertSection $target [list "local-hook" $local] - } -# Boeing changing to interface name for RJ45 -# } elseif { $type == "rj45" } { -# # -# # apply rj45 items -# # -# set ifcName [string trim [$wi.interface.name get]] -# puts "$ifcName\n" -# - } elseif { $type == "router" && [getNodeModel $target] == "remote" } { - if { $changed_to_remote == 0 } { - set i 1 - set remoteIP [string trim [$wi.remoteinfo.ip.text get $i.0 $i.end]] - if { $remoteIP != [router.remote.getRemoteIP $target] } { - router.remote.setRemoteIP $target $remoteIP - set changed 1 - } - set ifc [string trim [$wi.remoteinfo.ifc.text get $i.0 $i.end]] - if { $ifc != [router.remote.getCInterface $target] } { - router.remote.setCInterface $target $ifc - set changed 1 - } - set startcmd [string trim [$wi.remotecommands.start.text get $i.0 $i.end]] - if { $startcmd != [router.remote.getStartCmd $target] } { - router.remote.setStartCmd $target $startcmd - set changed 1 - } - set stopcmd [string trim [$wi.remotecommands.stop.text get $i.0 $i.end]] - if { $stopcmd != [router.remote.getStopCmd $target] } { - router.remote.setStopCmd $target $stopcmd - set changed 1 - } - } - } - - if {[[typemodel $target].layer] == "NETWORK"} { - foreach ifc [ifcList $target] { - set fr $wi.ifaces.c.if$ifc - set macaddr [$fr.cfg.mac.addrv get] - global if${ifc}_auto_mac - if { [set if${ifc}_auto_mac] == 1 } { set macaddr "" } - set oldmacaddr [getIfcMacaddr $target $ifc] - if { $macaddr != $oldmacaddr } { - setIfcMacaddr $target $ifc $macaddr - set changed 1 - } - set ipaddr [$fr.cfg.ipv4.addrv get] - set oldipaddr [getIfcIPv4addr $target $ifc] - if { $ipaddr != $oldipaddr } { - setIfcIPv4addr $target $ifc $ipaddr - set changed 1 - } - set ipaddr [$fr.cfg.ipv6.addrv get] - set oldipaddr [getIfcIPv6addr $target $ifc] - if { $ipaddr != $oldipaddr } { - setIfcIPv6addr $target $ifc $ipaddr - set changed 1 - } - } - } - } - - link { - global g_link_config_uni_state - set mirror [getLinkMirror $target] - - if { [setIfChanged $target $mirror $wi "bandwidth" "LinkBandwidth"] } { - set changed 1 - } - if { [setIfChanged $target $mirror $wi "delay" "LinkDelay"] } { - set changed 1 - } - if { [setIfChanged $target $mirror $wi "ber" "LinkBER"] } { - set changed 1 - } - if { [setIfChanged $target $mirror $wi "dup" "LinkDup"] } { - set changed 1 - } - if { [setIfChanged $target $mirror $wi "jitter" "LinkJitter"] } { - set changed 1 - } - - if { $link_color != [getLinkColor $target] } { - setLinkColor $target $link_color - if { $mirror != "" } { - setLinkColor $mirror $link_color - } - set changed 1 - } - set width [$wi.width.value get] - if { $width != [getLinkWidth $target] } { - setLinkWidth $target $width - if { $mirror != "" } { - setLinkWidth $mirror $width - } - set changed 1 - } - if { $changed == 1 && $oper_mode == "exec" } { - execSetLinkParams $eid $target - } - } - - } - - popdownConfig $wi -} - -# helper for Link Config dialog -# ctl must exist as $wi.$ctl.value{2}, and {get,set}$procname must be valid -# returns true when value has changed, false otherwise -proc setIfChanged { target mirror wi ctl procname } { - global g_link_config_uni_state - - set val [$wi.$ctl.value get] - if { $g_link_config_uni_state == "uni" } { - set val [list $val [$wi.$ctl.value2 get]] - } - set oldval [get$procname $target] - set oldval2 [get$procname $target "up"] - if { $oldval2 != "" } { - set oldval [list $oldval $oldval2] - } - if { $val != $oldval } { - set$procname $target $val - if { $mirror != "" } { - set$procname $mirror $val - } - return true - } - return false -} - -#****f* editor.tcl/printCanvas -# NAME -# printCanvas -- print canvas -# SYNOPSIS -# printCanvas $w -# FUNCTION -# This procedure is called when the print button in -# print dialog box is pressed. -# INPUTS -# * w -- print dialog widget -#**** -proc printCanvas { w } { - global sizex sizey - - set prncmd [$w.e1 get] - destroy $w - set p [open "|$prncmd" WRONLY] - puts $p [.c postscript -height $sizey -width $sizex -x 0 -y 0 -rotate yes -pageheight 297m -pagewidth 210m] - close $p -} - - -#****f* editor.tcl/deleteSelection -# NAME -# deleteSelection -- delete selection -# SYNOPSIS -# deleteSelection -# FUNCTION -# By calling this procedure all the selected nodes in imunes will -# be deleted. -#**** -proc deleteSelection { } { - global changed - global background - global viewid - catch {unset viewid} - .c config -cursor watch; update - - foreach lnode [selectedNodes] { - if { $lnode != "" } { - removeGUINode $lnode - } - set changed 1 - } - - raiseAll .c - updateUndoLog - .c config -cursor left_ptr - .bottom.textbox config -text "" -} - - -proc assignSelection { server } { - global changed - .c config -cursor watch; update - - foreach node [selectedNodes] { - if { $node != "" } { - setNodeLocation $node $server - } - set changed 1 - } - - redrawAll - updateUndoLog - .c config -cursor left_ptr - .bottom.textbox config -text "" -} - - -proc align2grid {} { - global sizex sizey grid zoom changed - - set node_objects [.c find withtag node] - if { [llength $node_objects] == 0 } { - return - } - - set step [expr {$grid * 4}] - - for { set x $step } { $x <= [expr {$sizex - $step}] } { incr x $step } { - for { set y $step } { $y <= [expr {$sizey - $step}] } { incr y $step } { - if { [llength $node_objects] == 0 } { - set changed 1 - updateUndoLog - redrawAll - return - } - set node [lindex [.c gettags [lindex $node_objects 0]] 1] - set node_objects [lreplace $node_objects 0 0] - setNodeCoords $node "$x $y" - lassign [getDefaultLabelOffsets [nodeType $node]] dx dy - setNodeLabelCoords $node "[expr {$x + $dx}] [expr {$y + $dy}]" - } - } -} - -#****f* editor.tcl/rearrange -# NAME -# rearrange -# SYNOPSIS -# rearrange $mode -# FUNCTION -# This procedure rearranges the position of nodes in imunes. -# It can be used to rearrange all the nodes or only the selected -# nodes. -# INPUTS -# * mode -- when set to "selected" only the selected nodes will be -# rearranged. -#**** -proc rearrange { mode } { - global link_list autorearrange_enabled sizex sizey curcanvas zoom activetool - - set activetool select - - if { $autorearrange_enabled } { - rearrange_off - return - } - set autorearrange_enabled 1 - .bottom.mbuf config -text "autorearrange" - if { $mode == "selected" } { - .menubar.tools entryconfigure "Auto rearrange all" -state disabled - .menubar.tools entryconfigure "Auto rearrange all" -indicatoron off - .menubar.tools entryconfigure "Auto rearrange selected" -indicatoron on - set tagmatch "node && selected" - } else { - .menubar.tools entryconfigure "Auto rearrange all" -indicatoron on - .menubar.tools entryconfigure "Auto rearrange selected" -state disabled - .menubar.tools entryconfigure "Auto rearrange selected" -indicatoron off - set tagmatch "node" - } - set otime [clock clicks -milliseconds] - while { $autorearrange_enabled } { - set ntime [clock clicks -milliseconds] - if { $otime == $ntime } { - set dt 0.001 - } else { - set dt [expr {($ntime - $otime) * 0.001}] - if { $dt > 0.2 } { - set dt 0.2 - } - set otime $ntime - } - - set objects [.c find withtag $tagmatch] - set peer_objects [.c find withtag node] - foreach obj $peer_objects { - set node [lindex [.c gettags $obj] 1] - set coords [.c coords $obj] - set x [expr {[lindex $coords 0] / $zoom}] - set y [expr {[lindex $coords 1] / $zoom}] - set x_t($node) $x - set y_t($node) $y - - if { $x > 0 } { - set fx [expr {1000 / ($x * $x + 100)}] - } else { - set fx 10 - } - set dx [expr {$sizex - $x}] - if { $dx > 0 } { - set fx [expr {$fx - 1000 / ($dx * $dx + 100)}] - } else { - set fx [expr {$fx - 10}] - } - - if { $y > 0 } { - set fy [expr {1000 / ($y * $y + 100)}] - } else { - set fy 10 - } - set dy [expr {$sizey - $y}] - if { $dy > 0 } { - set fy [expr {$fy - 1000 / ($dy * $dy + 100)}] - } else { - set fy [expr {$fy - 10}] - } - set fx_t($node) $fx - set fy_t($node) $fy - } - - foreach obj $objects { - set node [lindex [.c gettags $obj] 1] - set i [lsearch -exact $peer_objects $obj] - set peer_objects [lreplace $peer_objects $i $i] - set x $x_t($node) - set y $y_t($node) - foreach other_obj $peer_objects { - set other [lindex [.c gettags $other_obj] 1] - set o_x $x_t($other) - set o_y $y_t($other) - set dx [expr {$x - $o_x}] - set dy [expr {$y - $o_y}] - set d [expr {hypot($dx, $dy)}] - set d2 [expr {$d * $d}] - set p_fx [expr {1000.0 * $dx / ($d2 * $d + 100)}] - set p_fy [expr {1000.0 * $dy / ($d2 * $d + 100)}] - if {[linkByPeers $node $other] != ""} { - set p_fx [expr {$p_fx - $dx * $d2 * .0000000005}] - set p_fy [expr {$p_fy - $dy * $d2 * .0000000005}] - } - set fx_t($node) [expr {$fx_t($node) + $p_fx}] - set fy_t($node) [expr {$fy_t($node) + $p_fy}] - set fx_t($other) [expr {$fx_t($other) - $p_fx}] - set fy_t($other) [expr {$fy_t($other) - $p_fy}] - } - - foreach link $link_list { - set nodes [linkPeers $link] - if { [getNodeCanvas [lindex $nodes 0]] != $curcanvas || - [getNodeCanvas [lindex $nodes 1]] != $curcanvas || - [getLinkMirror $link] != "" } { - continue - } - set peers [linkPeers $link] - set coords0 [getNodeCoords [lindex $peers 0]] - set coords1 [getNodeCoords [lindex $peers 1]] - set o_x \ - [expr {([lindex $coords0 0] + [lindex $coords1 0]) * .5}] - set o_y \ - [expr {([lindex $coords0 1] + [lindex $coords1 1]) * .5}] - set dx [expr {$x - $o_x}] - set dy [expr {$y - $o_y}] - set d [expr {hypot($dx, $dy)}] - set d2 [expr {$d * $d}] - set fx_t($node) \ - [expr {$fx_t($node) + 500.0 * $dx / ($d2 * $d + 100)}] - set fy_t($node) \ - [expr {$fy_t($node) + 500.0 * $dy / ($d2 * $d + 100)}] - } - } - - foreach obj $objects { - set node [lindex [.c gettags $obj] 1] - if { [catch "set v_t($node)" v] } { - set vx 0.0 - set vy 0.0 - } else { - set vx [lindex $v_t($node) 0] - set vy [lindex $v_t($node) 1] - } - set vx [expr {$vx + 1000.0 * $fx_t($node) * $dt}] - set vy [expr {$vy + 1000.0 * $fy_t($node) * $dt}] - set dampk [expr {0.5 + ($vx * $vx + $vy * $vy) * 0.00001}] - set vx [expr {$vx * exp( - $dampk * $dt)}] - set vy [expr {$vy * exp( - $dampk * $dt)}] - set dx [expr {$vx * $dt}] - set dy [expr {$vy * $dt}] - set x [expr {$x_t($node) + $dx}] - set y [expr {$y_t($node) + $dy}] - set v_t($node) "$vx $vy" - - setNodeCoords $node "$x $y" - set e_dx [expr {$dx * $zoom}] - set e_dy [expr {$dy * $zoom}] - .c move $obj $e_dx $e_dy - set img [.c find withtag "selectmark && $node"] - .c move $img $e_dx $e_dy - set img [.c find withtag "nodelabel && $node"] - .c move $img $e_dx $e_dy - set x [expr {[lindex [.c coords $img] 0] / $zoom}] - set y [expr {[lindex [.c coords $img] 1] / $zoom}] - setNodeLabelCoords $node "$x $y" - .c addtag need_redraw withtag "link && $node" - } - foreach link [.c find withtag "link && need_redraw"] { - redrawLink [lindex [.c gettags $link] 1] - } - .c dtag link need_redraw - update - } - - rearrange_off - .bottom.mbuf config -text "" -} - -proc rearrange_off { } { - global autorearrange_enabled - set autorearrange_enabled 0 - .menubar.tools entryconfigure "Auto rearrange all" -state normal - .menubar.tools entryconfigure "Auto rearrange all" -indicatoron off - .menubar.tools entryconfigure "Auto rearrange selected" -state normal - .menubar.tools entryconfigure "Auto rearrange selected" -indicatoron off -} - - -#****f* editor.tcl/switchCanvas -# NAME -# switchCanvas -- switch canvas -# SYNOPSIS -# switchCanvas $direction -# FUNCTION -# This procedure switches the canvas in one of the defined -# directions (previous, next, first and last). -# INPUTS -# * direction -- the direction of switching canvas. Can be: prev -- -# previus, next -- next, first -- first, last -- last. -#**** -proc switchCanvas { direction } { - global canvas_list curcanvas - global sizex sizey - - set i [lsearch $canvas_list $curcanvas] - switch -exact -- $direction { - prev { - incr i -1 - if { $i < 0 } { - set curcanvas [lindex $canvas_list end] - } else { - set curcanvas [lindex $canvas_list $i] - } - } - next { - incr i - if { $i >= [llength $canvas_list] } { - set curcanvas [lindex $canvas_list 0] - } else { - set curcanvas [lindex $canvas_list $i] - } - } - first { - set curcanvas [lindex $canvas_list 0] - } - last { - set curcanvas [lindex $canvas_list end] - } - } - - .hframe.t delete all - set x 0 - foreach canvas $canvas_list { - set text [.hframe.t create text 0 0 \ - -text "[getCanvasName $canvas]" -tags "text $canvas"] - set ox [lindex [.hframe.t bbox $text] 2] - set oy [lindex [.hframe.t bbox $text] 3] - set tab [.hframe.t create polygon $x 0 [expr {$x + 7}] 18 \ - [expr {$x + 2 * $ox + 17}] 18 [expr {$x + 2 * $ox + 24}] 0 $x 0 \ - -fill gray -tags "tab $canvas"] - set line [.hframe.t create line 0 0 $x 0 [expr {$x + 7}] 18 \ - [expr {$x + 2 * $ox + 17}] 18 [expr {$x + 2 * $ox + 24}] 0 999 0 \ - -fill #808080 -width 2 -tags "line $canvas"] - .hframe.t coords $text [expr {$x + $ox + 12}] [expr {$oy + 2}] - .hframe.t raise $text - incr x [expr {2 * $ox + 17}] - } - incr x 7 - .hframe.t raise "$curcanvas" - .hframe.t itemconfigure "tab && $curcanvas" -fill #e0e0e0 - .hframe.t configure -scrollregion "0 0 $x 18" - update - set width [lindex [.hframe.t configure -width] 4] - set lborder [lindex [.hframe.t bbox "tab && $curcanvas"] 0] - set rborder [lindex [.hframe.t bbox "tab && $curcanvas"] 2] - set lmargin [expr {[lindex [.hframe.t xview] 0] * $x - 1}] - set rmargin [expr {[lindex [.hframe.t xview] 1] * $x + 1}] - if { $lborder < $lmargin } { - .hframe.t xview moveto [expr {1.0 * ($lborder - 10) / $x}] - } - if { $rborder > $rmargin } { - .hframe.t xview moveto [expr {1.0 * ($rborder - $width + 10) / $x}] - } - - set sizex [lindex [getCanvasSize $curcanvas] 0] - set sizey [lindex [getCanvasSize $curcanvas] 1] - - redrawAll -} - -proc resizeCanvasPopup {} { - global curcanvas - - set w .canvasSizeScaleDialog - catch {destroy $w} - toplevel $w - - wm transient $w . - wm title $w "Canvas Size and Scale" - - frame $w.buttons - pack $w.buttons -side bottom -fill x -pady 2m - button $w.buttons.print -text "Apply" -command "resizeCanvasApply $w" - button $w.buttons.cancel -text "Cancel" -command "destroy $w" - pack $w.buttons.print $w.buttons.cancel -side left -expand 1 - - set cursize [getCanvasSize $curcanvas] - set x [lindex $cursize 0] - set y [lindex $cursize 1] - set scale [getCanvasScale $curcanvas] - set refpt [getCanvasRefPoint $curcanvas] - set refx [lindex $refpt 0] - set refy [lindex $refpt 1] - set latitude [lindex $refpt 2] - set longitude [lindex $refpt 3] - set altitude [lindex $refpt 4] - - - labelframe $w.size -text "Size" - frame $w.size.pixels - pack $w.size $w.size.pixels -side top -padx 4 -pady 4 -fill x - spinbox $w.size.pixels.x -bg white -width 5 - $w.size.pixels.x insert 0 $x - $w.size.pixels.x configure -from 300 -to 5000 -increment 2 - label $w.size.pixels.label -text "W x" - spinbox $w.size.pixels.y -bg white -width 5 - $w.size.pixels.y insert 0 $y - $w.size.pixels.y configure -from 300 -to 5000 -increment 2 - label $w.size.pixels.label2 -text "H pixels" - pack $w.size.pixels.x $w.size.pixels.label $w.size.pixels.y \ - $w.size.pixels.label2 -side left -pady 2 -padx 2 -fill x - - frame $w.size.meters - pack $w.size.meters -side top -padx 4 -pady 4 -fill x - spinbox $w.size.meters.x -bg white -width 7 - $w.size.meters.x configure -from 300 -to 10000 -increment 100 - label $w.size.meters.label -text "x" - spinbox $w.size.meters.y -bg white -width 7 - $w.size.meters.y configure -from 300 -to 10000 -increment 100 - label $w.size.meters.label2 -text "meters" - pack $w.size.meters.x $w.size.meters.label $w.size.meters.y \ - $w.size.meters.label2 -side left -pady 2 -padx 2 -fill x - - labelframe $w.scale -text "Scale" - frame $w.scale.ppm - pack $w.scale $w.scale.ppm -side top -padx 4 -pady 4 -fill x - label $w.scale.ppm.label -text "100 pixels =" - entry $w.scale.ppm.metersper100 -bg white -width 10 - $w.scale.ppm.metersper100 insert 0 $scale - label $w.scale.ppm.label2 -text "meters" - pack $w.scale.ppm.label $w.scale.ppm.metersper100 \ - $w.scale.ppm.label2 -side left -pady 2 -padx 2 -fill x - - bind $w.size.pixels.x