diff --git a/agent/topology_probes.go b/agent/topology_probes.go
index 512893362a..978919ff03 100644
--- a/agent/topology_probes.go
+++ b/agent/topology_probes.go
@@ -26,10 +26,12 @@ import (
"github.com/skydive-project/skydive/graffiti/logging"
"github.com/skydive-project/skydive/plugin"
"github.com/skydive-project/skydive/probe"
+ "github.com/skydive-project/skydive/topology"
tp "github.com/skydive-project/skydive/topology/probes"
"github.com/skydive-project/skydive/topology/probes/bess"
"github.com/skydive-project/skydive/topology/probes/blockdev"
"github.com/skydive-project/skydive/topology/probes/docker"
+ "github.com/skydive-project/skydive/topology/probes/hardware"
"github.com/skydive-project/skydive/topology/probes/libvirt"
"github.com/skydive-project/skydive/topology/probes/lldp"
"github.com/skydive-project/skydive/topology/probes/lxd"
@@ -42,19 +44,17 @@ import (
"github.com/skydive-project/skydive/topology/probes/runc"
"github.com/skydive-project/skydive/topology/probes/socketinfo"
"github.com/skydive-project/skydive/topology/probes/vpp"
- "github.com/skydive-project/skydive/topology/probes/hardware"
)
func registerStaticProbes() {
blockdev.Register()
netlink.Register()
- docker.Register()
+ topology.RegisterContainer()
lldp.Register()
lxd.Register()
neutron.Register()
opencontrail.Register()
ovsdb.Register()
- runc.Register()
libvirt.Register()
ovn.Register()
hardware.Register()
diff --git a/analyzer/probes.go b/analyzer/probes.go
index f3b51a2f74..e05d9c55cb 100644
--- a/analyzer/probes.go
+++ b/analyzer/probes.go
@@ -26,8 +26,8 @@ import (
"github.com/skydive-project/skydive/plugin"
"github.com/skydive-project/skydive/probe"
"github.com/skydive-project/skydive/sflow"
+ "github.com/skydive-project/skydive/topology"
"github.com/skydive-project/skydive/topology/probes/blockdev"
- "github.com/skydive-project/skydive/topology/probes/docker"
"github.com/skydive-project/skydive/topology/probes/fabric"
"github.com/skydive-project/skydive/topology/probes/istio"
"github.com/skydive-project/skydive/topology/probes/k8s"
@@ -41,19 +41,17 @@ import (
"github.com/skydive-project/skydive/topology/probes/ovn"
"github.com/skydive-project/skydive/topology/probes/ovsdb"
"github.com/skydive-project/skydive/topology/probes/peering"
- "github.com/skydive-project/skydive/topology/probes/runc"
)
func registerStaticProbes() {
netlink.Register()
blockdev.Register()
- docker.Register()
+ topology.RegisterContainer()
lldp.Register()
lxd.Register()
neutron.Register()
opencontrail.Register()
ovsdb.Register()
- runc.Register()
libvirt.Register()
ovn.Register()
}
diff --git a/config/config.go b/config/config.go
index 97be447e2c..191e18b10c 100644
--- a/config/config.go
+++ b/config/config.go
@@ -210,7 +210,8 @@ func init() {
cfg.SetDefault("storage.elasticsearch.use_flattened", true)
cfg.SetDefault("storage.elasticsearch.exclude_from_mapping", []string{
"Metadata.*.Extra",
- "Metadata.Docker.Labels",
+ "Metadata.Container.Labels",
+ "Metadata.Container.Hosts.ByIP",
"Metadata.K8s.Labels",
"Metadata.Actions",
"Metadata.Filters",
diff --git a/etc/skydive.yml.default b/etc/skydive.yml.default
index 41791c2aa5..b012b8e67c 100644
--- a/etc/skydive.yml.default
+++ b/etc/skydive.yml.default
@@ -416,7 +416,8 @@ storage:
# Fields to exclude to avoid mapping explosion.
# exclude_from_mapping:
# - Metadata.*.Extra
- # - Metadata.Docker.Labels
+ # - Metadata.Container.Labels
+ # - Metadata.Container.Hosts.ByIP
# - Metadata.K8s.Labels
# - Metadata.Actions
# - Metadata.Filters
diff --git a/graffiti/graph/indexer_test.go b/graffiti/graph/indexer_test.go
index 6e08541886..fba371c70a 100644
--- a/graffiti/graph/indexer_test.go
+++ b/graffiti/graph/indexer_test.go
@@ -81,18 +81,18 @@ func TestMetadataIndexer(t *testing.T) {
filter := filters.NewAndFilter(
filters.NewTermStringFilter("Manager", "docker"),
filters.NewTermStringFilter("Type", "container"),
- filters.NewNotNullFilter("Docker.Labels.io.kubernetes.pod.name"),
- filters.NewNotNullFilter("Docker.Labels.io.kubernetes.pod.namespace"),
- filters.NewNotNullFilter("Docker.Labels.io.kubernetes.container.name"))
+ filters.NewNotNullFilter("Container.Labels.io.kubernetes.pod.name"),
+ filters.NewNotNullFilter("Container.Labels.io.kubernetes.pod.namespace"),
+ filters.NewNotNullFilter("Container.Labels.io.kubernetes.container.name"))
m := NewElementFilter(filter)
- dockerCache := NewMetadataIndexer(g, g, m, "Docker.Labels.io.kubernetes.pod.namespace", "Docker.Labels.io.kubernetes.pod.name", "Docker.Labels.io.kubernetes.container.name")
+ dockerCache := NewMetadataIndexer(g, g, m, "Container.Labels.io.kubernetes.pod.namespace", "Container.Labels.io.kubernetes.pod.name", "Container.Labels.io.kubernetes.container.name")
dockerCache.Start()
m5 := Metadata{
"Type": "container",
"Manager": "docker",
- "Docker": map[string]interface{}{
+ "Container": map[string]interface{}{
"Labels": map[string]interface{}{
"io": map[string]interface{}{
"kubernetes": map[string]interface{}{
diff --git a/statics/bindata.go b/statics/bindata.go
index 42c7fb5ba9..74c5bb3376 100644
--- a/statics/bindata.go
+++ b/statics/bindata.go
@@ -680,7 +680,7 @@ func staticsCssLegendCss() (*asset, error) {
return a, nil
}
-var _staticsCssSkydiveCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x3b\xed\x92\xdb\xa8\x96\xff\xfb\x29\xd8\x74\xa5\x7a\xe6\x8e\xe5\xc8\xb2\xdd\x1f\xee\x4a\xaa\x66\xef\xce\xd4\xfe\x98\x7d\x82\xa9\xfc\x40\x02\xdb\xdc\x46\x42\x17\x50\xdb\xee\x54\xf6\xd9\xb7\x00\x81\x40\x20\xb5\x33\xf7\x56\x6d\x52\xa9\xb4\xe0\x9c\xc3\xe1\x70\xbe\xa1\x8f\xb2\xa6\x0b\x50\x32\x74\x01\xdf\x6e\x00\x38\x11\x24\x8f\xbb\x55\x9e\x7f\x7c\xbe\x01\xe0\x88\xc9\xe1\x28\xfb\xcf\xef\x37\x37\x0e\xac\x86\xfc\x40\x9a\x1d\x80\x9d\x64\x0a\xb0\x85\x08\x91\xe6\x90\x49\xd6\xee\xc0\x36\x6f\xcf\x6a\xb0\x84\xd5\xcb\x81\xb3\xae\x41\x59\xc5\x28\xe3\x3b\x70\xbb\x2a\x57\xb8\x58\x6b\x5a\x4b\x04\xf9\x0b\x20\x4d\xdb\xc9\x05\x30\x1f\x12\x9f\x25\xe4\x18\xda\x6f\x3d\xb9\xdc\x33\x5e\x67\x15\x6b\x24\x67\xf4\x4f\x8e\x21\x62\x0d\xbd\x7c\x5d\xf4\x04\x04\xa6\xb8\x72\x14\xcc\xd7\x9f\x88\x08\x58\x52\x8c\xbe\x8e\x29\x7b\xf8\xe3\x19\x87\xa3\x37\x38\xc3\x3b\x00\x25\xe3\x08\xf3\x8c\x43\x44\x3a\xb1\x03\xf9\x30\xb6\x03\x0d\x6b\xb0\xfa\xb6\x58\x15\x54\x7f\xcd\x8e\xf5\x4e\x04\x39\x34\xa4\xc9\xf6\x04\x53\x24\x3c\x61\x66\x25\x93\x92\xd5\x3b\xb0\xda\x2a\xf1\x39\x09\xa5\xb0\xb4\x60\x26\xf9\x5c\xaf\xb6\xab\x27\x43\xe1\xc4\xf8\xcb\x9e\xb2\x53\x06\x4b\x21\x39\xac\x0c\xd2\x9e\x35\x32\x13\xe4\x0d\xef\xc0\xea\xde\x9c\x95\x19\x92\x17\x8a\x77\x80\x48\x48\x49\xf5\x3c\xc7\x99\xa3\x8b\xb0\xa8\x38\x69\x25\x61\x0d\x38\xae\x22\xea\xdb\xf6\x0c\xfe\x83\xd4\x2d\xe3\x12\x36\x72\x0e\xb7\x88\x70\x37\x57\xe3\xae\x23\xdc\xf5\xd5\xb8\x9b\x08\xb7\xb8\x1a\x77\x1b\xe1\xae\x62\x5c\xa3\x92\x3b\x58\x49\xf2\x8a\x17\xbd\x86\xee\x8e\xec\x15\x73\x8d\xce\x3a\x49\x49\x83\x8d\xe6\x8c\x8f\xbd\x57\x7b\xf0\x0b\x58\xee\x61\x56\x71\x26\xc4\x11\x12\x6e\xf4\xc6\x1e\xf8\x7e\xbf\xf7\xf5\x05\xa2\x57\xd8\x54\x18\x65\x4c\xb3\x19\xc2\xe6\xf0\x61\x5b\x3e\x3d\xc7\xa2\x8e\x34\xae\x5f\x7a\xb7\x67\x55\x67\x68\x8c\x55\x3c\x3b\xe1\xf2\x85\xc8\xac\x64\xe7\x4c\x1c\x21\x62\xa7\x61\x2e\x1e\xd3\xe4\x39\x6b\x11\x3b\x35\x59\x8d\x9b\x2e\xad\xbf\xb7\xab\xcd\x6a\x63\xd5\xd7\xb0\xa3\xb5\x3d\x53\x50\x6d\x06\x11\x62\xcd\x7b\x16\xaa\x50\xd3\x48\x3d\xe4\xe9\x48\x24\x4e\x59\xad\xf2\x06\x19\xa4\xe4\xd0\xec\x00\xc5\x7b\x99\xb6\xf6\x11\x7d\x4f\x38\x99\x68\x61\x45\x9a\xc3\x0e\xac\xac\x48\x49\xf3\x0f\x5c\xc9\x8c\xc2\x12\xd3\x05\x08\x3e\x3d\x8f\x0b\xee\x73\x8b\x50\xc1\x56\x76\x1c\x67\xea\x14\xc0\xb2\xed\x28\xcd\x14\x2b\x1a\xd8\xfa\x59\xae\xfd\xb2\x67\x90\x0d\x7c\x2d\x21\x07\x4b\x75\x6a\x90\x34\xbd\x6e\xf5\xb4\x9d\xff\xee\xc1\x32\xd2\xbc\x62\x2e\xf0\xd5\x9e\x2e\x25\xe0\x11\x29\xfb\x5d\x72\xd8\xa0\x40\xe5\xee\xb7\x4f\x15\x44\xcf\x31\xf7\xdb\x3c\xe4\x3e\xa2\xd5\xc0\xd7\x2f\x4b\x63\x38\x5f\x54\x50\xb8\x06\xcc\xe8\xeb\xb5\xc0\x83\x19\x26\xc4\x50\x3c\x15\x78\xbd\x99\x93\x6f\xf2\x38\x86\x61\x75\x6c\x3b\xb0\xee\xc3\x61\xef\x4c\x7b\xd8\xdc\x1b\x32\x70\x79\x20\x8b\x3d\x39\x63\xa4\xe2\xa9\xaf\x5d\xfd\x79\x1a\xc8\x5b\xd8\x9a\xc9\x3e\x4a\x0f\xc7\x6c\x7c\x4c\x70\x08\xab\xd5\x4a\x4f\x0d\x7a\xe7\x79\x0f\xe7\x40\x6a\x86\x70\xd2\x4e\x3c\x67\x91\x2f\x1f\x71\x1d\xef\xb2\xb8\xb7\x87\x29\x59\xcb\x28\x3b\x5c\x22\x05\x4c\x70\xea\x80\x33\xb4\x8e\x35\x36\xb4\xc7\x0a\x37\x12\xf3\xe7\xb1\xcb\x9c\xc8\x34\xec\xe1\x45\xf6\xbb\x19\xf3\x69\x97\xb6\xcc\x3d\x3d\xe9\xa5\x95\x66\x28\x97\xbf\x03\x47\x82\x10\x6e\xfa\xd3\x61\x08\x67\x46\xbe\xc4\xfa\x94\x8e\x0b\xb5\xa4\xf3\xce\x06\x92\xb3\x93\x66\x7f\xa1\x94\x86\x76\x75\xa3\xbf\x5c\xc4\xe8\x03\xcd\x7f\x63\xfa\x8a\x25\xa9\xe0\x02\xfc\xca\x09\xa4\x0b\x20\x60\x23\x32\x81\x39\xd9\x6b\xc1\x13\x4a\x77\xe0\x16\x63\x1c\x52\x5d\xda\x78\xe2\x13\xef\x07\xbf\x39\x3c\x8e\xd1\x80\xa6\x44\x36\xc0\xab\x2f\xcd\x8c\x90\x9c\xbd\x60\x3f\x8c\xb4\xb0\xc1\x14\x2c\xfd\x50\xa7\x49\x52\x06\xe5\x0e\x68\xfd\x9d\x4e\x19\xf4\xe8\xa9\x17\x65\xc3\x78\x0d\x69\xc2\xf4\x57\xb9\x9f\x76\xb8\xb8\x1b\xac\x5f\xca\x66\x01\x96\x65\x27\x25\x6b\xb2\x23\xa3\x08\x73\x3d\xe8\x1b\x84\x3d\xd4\x62\x13\x58\x9e\x59\x00\x14\xfd\x2a\x81\xbe\x44\xb1\x5d\x2f\x97\xc1\xca\x04\xcb\x61\x85\x39\x9d\x1a\xd6\x69\xcf\xa0\xb7\xfa\x11\x4b\x6b\x33\x1a\x04\xe9\x21\xe0\xe4\xe3\xdd\x3b\xf3\x51\x1e\x66\x3a\x15\xd7\x96\xe1\xe0\x70\x13\x86\x85\xde\x91\x84\x5e\xc8\x3a\x9c\x5e\x16\x4e\xad\x4d\xee\xae\x48\x09\x82\x70\x09\xf9\x02\x2c\x85\x84\xb2\x4b\x64\x17\x03\x5e\x76\x19\xb2\x7e\x37\x76\x1e\x8c\x24\x65\xe4\x86\xaa\x84\xa5\x9f\xee\x1a\x5e\x57\xdb\xa4\x77\x74\xc3\xbd\x50\xbd\x8d\xe9\x44\x9a\x50\x9a\x76\x7d\xcb\x8e\x64\x1c\x0b\xf2\xa6\x72\x79\x23\x1b\x26\x88\x3a\x5a\x65\x0d\x14\x2a\xfb\x88\x01\xb3\x23\x6c\x50\x0f\x1f\xb8\x3a\x17\xc5\x03\x68\x03\xe8\xc9\x15\x80\xc1\x75\x15\x8e\x4b\xc5\x74\x36\x3a\x4e\xe7\xd9\xfa\xfd\xea\x82\x69\x15\xca\xc0\xa5\xdb\x79\x68\x11\x09\xbd\xdf\x4c\x56\x5a\x83\xae\x5e\xb1\x52\x20\x6c\x17\x89\x8c\x61\x24\xf4\xcc\x4f\x3c\x42\xa0\x44\x09\xb0\x2c\x4c\xb8\x08\x1c\x43\xc9\x28\xf2\x8e\xd7\xed\xb8\x3d\x03\xc1\x28\x41\xe0\xf6\xe1\xe1\xc1\x57\x62\x0b\x31\xb1\xee\xb2\xa2\x4c\x60\x94\x4c\x53\xc7\x24\x66\x44\x90\xda\xd0\x6e\x4f\xb8\x90\x59\x75\x24\x14\xf9\xfa\xab\xe5\x39\x85\x15\x57\x33\xcb\x7c\x46\x0c\x23\x5e\xa6\x36\x59\x1e\xb2\x13\xe4\x0d\x69\x0e\xd7\xa4\x2c\x23\x64\x1d\x4a\x7d\xf4\xa8\x7c\x08\x1d\xe1\xb7\x51\xf8\x75\x7e\xff\x3a\xc7\x98\x76\x8a\x39\xc8\xd5\xcc\xb0\x43\xd1\x95\xd9\xa4\x76\x6f\xa7\xfb\x08\x7d\x8d\x1b\x2f\xf8\x43\x76\x55\x31\x4a\x61\x2b\x70\x76\xc4\x10\xf5\x39\x9d\x0d\xe7\x2d\x23\x26\xdf\x48\x00\x7a\x79\x63\xcf\x11\xe3\xb0\x39\x60\x2f\x47\x90\xa4\x1e\xe7\xd7\x3b\x70\xbb\x2d\x9e\xfe\xeb\x37\x93\x89\x75\xd4\x65\xfa\x94\x08\xb9\x00\x1d\xed\x8b\x03\xc6\x87\x11\x48\x31\x97\xc3\x27\xef\xa8\x01\xd7\xa4\xd5\x0f\x26\x02\x67\xf2\xd2\xe2\x48\xe5\x07\xfd\xa4\xc4\x2d\x46\x24\xae\x17\x80\x92\x61\x31\x37\x62\x16\x73\x9f\x7a\x31\xf5\x15\xda\xfe\x28\xbc\x24\xa4\xea\xad\x04\xd0\x50\xf4\xf4\x4b\x99\xa1\x61\x2d\xf3\x3d\x2c\x86\x68\xaa\x2b\x32\x41\x5d\xc6\xd4\xe5\x88\xba\x0c\xa9\x8f\xbd\x71\x9a\x2e\x8a\xe9\xa2\x11\x5d\x14\xd2\x45\x89\xe0\x36\xa1\x80\xdb\x89\x35\x97\xff\xec\x30\xbf\x24\x56\x36\x13\x83\x4f\xd9\xc3\x9a\xd0\xcb\x0e\xd4\xac\x61\xaa\xe2\x1c\xe7\xe8\xab\xd5\xd8\x72\x76\xe0\x76\xbd\x4e\x35\xaf\xfa\x34\xe5\xc4\x38\xca\x4a\x8e\xe1\xcb\x0e\xe8\xff\x32\x48\x75\xe2\x96\x36\x87\x9e\x6f\x49\x24\xc5\x3e\xbf\x76\xc0\xc8\xc9\x7e\x69\x29\xe9\x8f\x61\x0b\x63\x17\x38\xe9\xe8\xed\x5a\xc6\x2f\xf9\x8b\xb9\x11\xb3\x9a\xfb\xd4\xcb\xc1\x6a\x32\x71\x8d\xb6\x34\x13\xb0\xfa\xfc\x76\x48\x64\xfd\xca\x28\x48\x25\xc7\x59\x58\x6c\x0f\x08\x53\x2c\x03\x71\xb9\x11\xb3\x03\xf7\xa9\x77\x60\xbe\x02\x57\x0d\x9f\x36\x9b\x4d\x11\x65\xb0\x76\x81\xb4\x77\x87\xdb\x3c\x8f\x50\xfa\x36\x84\x84\xfc\x80\x65\xca\xde\x9c\xfc\x4b\xc6\xa4\x90\x1c\xb6\x99\x38\x11\x59\x1d\x7d\xea\x25\x85\xd5\xcb\x04\x58\x34\xe2\xf5\x3c\x62\xbd\x4c\x91\xc8\xc4\xcb\x05\x91\x57\x9c\x4d\x76\x7c\xf8\xa1\xfc\x69\xf5\xf4\xb4\x00\xc5\x7a\xbd\x00\xab\xa7\xe2\xe7\xf7\x28\xed\xf7\x33\xa4\x8a\xed\x7a\x01\x8a\xfc\x71\x01\x56\xf7\x93\xa4\xa2\x0a\xba\x2f\x92\xbf\xdf\xdc\x54\x84\x57\x14\x2f\x6b\xd8\xc0\x83\xed\xee\xb5\xb0\x22\xf2\xa2\x72\xc9\x27\xaf\x9e\xd3\xe5\xb8\x57\x7b\xb9\xfa\xce\x6b\xf6\xf6\xa7\x72\xb6\x55\xff\x7a\x9d\x8f\x8b\x9c\x20\xe6\xa9\xe8\x3a\xe4\xf4\x3e\xa1\x3e\x1d\x89\xf8\x0d\x80\x82\x3e\xb3\x0a\x73\xa4\x39\x2c\x46\x20\xd5\x11\x57\x2f\x25\x3b\x27\xdb\xd6\x43\x76\x3e\x89\x92\x2c\x0e\xd3\x8c\xd8\xce\xe7\x54\x0a\x3f\xe4\xfe\xb6\x1a\x09\xda\x91\xe4\x4d\x4b\xc8\xe5\x97\x5a\x4e\x00\x80\xac\x66\x6f\xf3\x10\xfa\xcf\x34\x44\x50\x61\x4e\x16\x71\x93\xfb\xf1\xda\xa9\x6f\x19\x69\x10\x3e\xef\x40\x11\xe3\xe8\xee\xe2\x9f\x2a\xa8\x7f\xfe\xa0\x92\xb0\x0f\x5f\x53\x22\xcf\x56\x41\x92\x65\x86\x4d\x09\x95\xba\x9c\xb0\x00\xba\x2e\x19\xb5\x33\xa7\x16\x6f\xa1\x10\x2a\x36\xa4\x19\x58\x85\x55\x9a\x64\x6d\x44\x3c\x98\x8c\x58\xfb\x7e\x73\x73\x2b\xf0\x3f\x3b\xdc\x54\x38\xec\x8f\x38\x35\xb9\xcf\x73\xcf\x70\x5c\xb2\x7a\x75\x7b\xbc\xf7\x51\x23\x1f\xbf\x36\x3e\x3e\xe8\xbc\x25\xce\x69\xb6\xef\x7e\x7f\x0f\xf7\xb8\xef\x54\x1f\xa1\x30\x5b\x27\x15\x6b\x14\xd0\xa7\xbf\xfd\x81\xf7\xd2\xaa\x8b\xae\x0a\x01\x69\x80\x3c\x12\x01\x2a\x28\xf0\x02\x94\x9d\x04\x44\x82\x8a\x75\x14\x81\x12\x03\x44\xf6\x7b\xcc\x55\xae\x8e\x3a\x0c\x24\x03\x4c\x1e\x31\x07\x02\x4b\x49\x9a\x83\x00\x19\xd8\x33\x0e\xf0\x19\xd6\x2d\xc5\x8a\x56\x7d\x01\x2d\x67\xca\x8f\x2b\x3a\x27\x28\x40\xb1\x05\x2d\x39\x63\x2a\xfe\xf6\x29\xd9\x86\x9c\x08\x58\x5e\x53\x26\x0a\x14\x7d\xff\xe5\xc4\x61\xdb\xfa\x0d\x18\xe7\x75\x8a\xa8\x9f\xd6\x8b\x50\x8c\x6c\x17\x96\x82\xd1\xce\xf6\xdd\x8d\x02\xd9\x0e\x4d\xdf\x43\xcc\x93\x45\x43\xaa\xb7\x33\xb5\xe4\xb8\x41\xe4\x0a\x86\x8d\x2d\x18\xde\x21\xfe\xd8\x9e\x3d\x3b\x4e\x2f\x90\xb5\x9c\xd4\xb0\x4f\xc8\xd2\xf5\xc9\x66\xb8\x83\xd3\x1d\x12\xd6\x0a\xbf\xce\xf9\x2b\xfd\xca\x11\x9d\xa5\x84\x65\x50\x9c\x6b\x4a\x20\xba\xdc\x88\xaa\xa9\x29\x5b\x9d\x5a\xa7\x81\xaf\xbe\x44\x13\xb5\xba\x7f\x2d\x90\xc0\xfe\x42\xc9\x17\x18\xb0\x78\xfb\xb8\x79\x7c\x78\xac\x5c\xc3\x5b\x43\xf8\x9d\x7b\x33\x70\x75\x77\x3e\xb1\x68\xd6\x12\x4a\x05\xf8\x02\x28\x01\x5f\x00\x5c\x80\xf7\x80\x66\xba\x2b\xb3\xde\xf3\x5d\xf7\x3b\xcf\x60\xdf\xb3\x55\x3c\xa6\xab\xf2\x6b\xd8\x9e\x94\x0e\x98\x27\xf1\x45\x15\x7d\xc3\xfd\xca\x55\x70\xfd\x31\x5d\x49\xf5\xba\x33\x8c\x94\xab\x18\x94\x6b\xbd\x79\x80\xe5\x7d\x5a\x16\x61\x87\x2d\xd9\x98\x41\x97\x06\xd6\xa4\xca\xa4\x6e\x08\x6a\x6f\xce\x0e\x0b\x30\x1e\x37\xcd\xe6\x78\xf0\x4f\xb3\x91\xaf\xe9\x49\x2d\x8a\xaf\xc9\xae\x53\xe2\x8e\x7d\xba\x0d\x9d\x6e\x28\x23\x22\x5a\x0a\x2f\x3b\x40\x1a\x85\x97\x95\x94\x99\x48\x96\xbe\x91\x34\x97\xa5\x93\xfb\x4d\xcd\xf6\xbb\x9e\x98\xf2\xf7\x3e\x05\xe2\x49\x60\xa6\x32\x9a\xbc\x63\x8c\xc2\xcd\x68\x89\xe0\xd3\x05\xa1\x6f\xa3\xde\xf3\x90\xf5\x86\xe8\xd2\x35\x81\xed\xe9\x0c\x5d\xea\xa9\xf6\xc2\x88\x02\x0a\x7b\x1f\x0f\x13\x6a\x15\xf2\xe9\xb7\xd0\x82\x52\x67\xd0\xf7\xf1\x05\x9b\x5b\x61\xad\xe2\x4f\xff\x2f\x4f\xeb\xc1\x9e\xe2\x81\x8b\x68\xd5\xa1\x63\x33\xa9\x3f\xa3\x5e\x7b\x78\xf9\x3f\x4f\x33\xd8\x4e\xf0\x9a\xe7\x1a\x81\x98\xdb\x6c\xbd\x6e\xdc\x2d\x59\x4f\x1d\x41\x64\x7b\x52\x95\x27\x40\x1e\x53\x81\xde\x88\xf8\x1d\xbd\x32\x04\xe2\xfd\x3c\xa8\x1d\x4d\x23\xc8\xa3\xdf\xf8\x4b\x35\x46\x46\x58\xee\xbd\xd4\x95\x62\x33\x08\x92\x1b\x47\xc7\xd9\x69\x6e\xbd\x09\xdd\x7a\x8f\x2a\xc2\x12\x12\xaa\x88\xff\x88\x00\x1c\x47\x3e\x91\x69\x02\xc9\x26\x4f\x7f\x73\x23\x31\xef\x6f\x50\x19\x07\xcb\xa1\x9c\x0e\xb5\x72\xed\xdd\xf5\x28\x0c\xfd\x1a\x42\x83\x91\xc6\x56\xc4\xc5\x53\x91\xba\x70\x7f\x48\xa1\x0e\x4f\xa6\x6c\xeb\xaf\x48\xa5\xbb\x3e\x0a\x22\xaf\x73\x76\x64\x7a\xb8\xe1\x93\x96\xe5\x1e\x8e\x75\x5c\xa3\xb8\x7b\xaa\xe5\xa3\x59\x87\x95\xba\xff\xf2\x82\x2f\x53\x2d\x31\x0f\xea\x15\xd2\x0e\x2f\x85\xe4\xaa\x92\x08\xb2\x84\xaa\xaa\x12\x90\x4d\x57\x97\x61\x7b\xfa\x82\x29\x65\xa7\x49\xa2\xbd\x9a\x25\x1a\x47\x93\xd4\xe3\x16\x78\x0a\xe3\x05\x5f\x7a\x2c\xd8\xb6\x94\x54\x50\x37\xe5\x02\x7a\x8b\x14\xf0\xfb\x20\x65\x08\x12\x30\xb2\x79\xf8\xf5\xd7\xdf\x7f\x4f\x33\xa2\x00\xfd\x23\x29\x9c\xfb\xeb\x21\x45\x57\xfa\xea\xed\x27\x15\xdb\xf9\x6e\x6e\x4c\xc0\x0e\xc5\xf4\xfc\x82\xe7\x1a\xdc\x77\xc4\xcd\xe1\x29\x6b\x61\xf5\x82\x65\x46\x49\xf3\xe2\xc3\x89\x97\x4b\x49\x3b\x3c\xd9\xcb\xe5\x1d\xc5\xc2\x2d\x4a\x9a\x46\x15\x07\xc9\xe0\x97\xa7\x10\x94\xf5\xfc\x8b\x6b\x9a\x18\xe1\x68\x84\xc6\xbc\x0d\xae\xd1\x7f\x8c\xb0\x31\x66\x91\xf5\x4f\x1e\x3c\xe3\xdf\x6c\x3f\xa6\x10\x44\x57\xab\xba\x2e\x81\x50\xe4\x49\x04\x1b\x1f\x63\x84\x75\x7a\x05\x8e\xc3\xc7\x51\x55\x9e\x94\x6a\x39\x56\xe9\xdc\x56\x4b\x21\xdc\x54\x26\x7f\x05\x94\x2b\xb7\xae\x81\x9d\xcd\xe2\x5d\x03\x37\xa2\x14\x3e\x08\x4b\xa4\xc4\xa1\x73\x74\x65\x37\x3e\xb7\xb0\x41\xba\x97\x92\x09\x09\xab\x17\xb0\xd4\x3f\xd7\xb0\x6f\x8b\x8e\xde\x98\xce\x63\x89\xae\x8c\x90\xac\xd5\xdf\xd6\x58\x42\x04\x25\xb4\x25\x45\xe4\x2f\xe0\x02\x5c\x01\x64\xa5\x79\x0d\x68\xd2\xd9\xee\x47\x17\x8d\xc3\x75\xc9\x64\x1a\x37\x7a\x51\x90\xbc\x56\x89\xcb\x49\xc6\xeb\xac\xe5\x58\xb7\x9a\x2a\xfc\xee\x23\xad\x2b\xda\xcd\xef\xdf\x44\xbb\xe5\xcc\x03\xe6\x71\x67\x7b\x3b\x7a\x04\x62\x2c\xdf\x12\x0f\xf3\x82\x21\xd7\x8f\xa8\xda\xb7\xe4\xd1\x84\xf7\x1e\x6e\xf6\xb5\xa3\x1d\xd1\xdd\xf8\x71\x49\x97\x5c\x32\x7e\x4e\xa7\x23\xf2\x7b\xcd\xf1\x81\x4e\xba\x37\xef\x1d\xba\x49\xf6\x01\xf8\x47\x27\x24\xd9\x5f\x6c\xc7\x67\x78\x0e\xe7\x65\x2d\x15\xab\x5b\xd6\xe0\x46\x8a\x28\x74\xd9\x4e\xed\xf8\x45\xe8\x91\x27\xbb\x65\xfd\x6b\x41\x4b\x78\x50\x46\xfb\x5a\x75\xe6\x6a\xde\x5c\x6d\xc4\xc2\xdb\xc3\x4c\x72\x28\x8e\x19\x4b\x7b\xc0\x52\x36\x99\x59\x6f\x01\xbc\x0f\xf7\x72\xda\x1f\xb3\xbe\xcb\x1b\x1a\x5c\x94\x5f\xad\xc5\xcf\xb9\x13\x6f\x12\xc2\xe9\xf0\x0a\x37\x91\x23\x9a\x3a\x29\x60\x77\x3c\x34\x30\x1d\xcd\x58\xd6\xa3\x89\x59\x1f\x3b\x51\x2e\x8b\x96\x66\xb6\xe3\xe9\xdc\x71\xdf\x30\x09\x23\xf7\x64\x8e\x69\xf8\xf0\x09\xfd\xa8\x35\x9b\x16\x71\xa2\x0b\x32\x03\xed\xc4\x30\x35\x9f\x78\x20\x9f\x3f\x27\x77\x39\xbb\xaf\xf7\x96\x9f\x87\xba\xba\x01\x19\xbe\x52\xfc\xb7\xb8\xb7\x90\xa4\x27\xe3\x80\xca\x36\xf5\x7a\x6e\xb8\xbb\x95\x4d\x66\x98\x3e\x8b\x99\x07\x36\xa9\x8b\xeb\x89\x27\x9b\x96\xaa\x79\x58\xaf\xe4\x96\xa8\xdd\x0a\xc7\xc0\x11\xd3\x36\x73\xf7\x3a\x36\x65\x53\xa3\xf6\x1a\xba\xed\xa4\x65\xce\x06\x9e\xa2\x18\xf5\xe4\xfd\xbb\x68\x6a\xc2\x68\x26\xf9\x38\x43\xca\x11\x76\xae\x64\x80\xdb\x43\x2a\xf0\x28\xd6\x16\x79\xe1\xf2\x66\x44\x58\x66\x02\xeb\xcc\x55\xe3\xe8\xa9\xf3\x63\x9f\x93\xc6\x15\xb9\xbd\x83\xec\x84\x2b\x72\xbd\xdf\x97\xa8\xd9\xdb\xd4\x8c\x48\x4f\x24\x07\xc7\x4f\x25\x13\xca\x95\xda\xde\x50\x01\xa7\xef\x64\x86\xab\xea\xe9\xf4\xda\xa7\x67\xae\x76\x6b\x65\x40\xd3\x44\x4d\x33\x36\xb8\x6a\xf3\x0e\x7a\x15\x04\xa5\x22\x7a\xb5\xe2\x6c\xad\x5c\xa9\xbf\xa9\x4b\x0d\x9b\x97\x1b\x43\x9e\x63\x30\x41\x76\x78\x56\xed\xe1\xf5\x56\x6f\xc4\xf5\xbf\x57\x50\x71\x45\x78\x2c\xee\x9d\x46\xc6\xe8\x2a\x3a\xc5\xea\xe9\xfe\xf7\x3e\x95\x76\xc0\x3b\xb8\x97\xae\xf0\xeb\x43\xff\x87\x0f\xcf\x93\x02\x77\x89\xc3\xe0\x82\xaf\x64\xcb\x5b\xc9\x11\x19\x5a\x1d\x53\xa2\xf5\xb0\xf4\x59\x3f\xf8\x17\x7a\x0f\xc1\xf9\xf6\x66\x63\x4f\xff\x31\x79\xd9\xb7\x35\x49\xa7\xdf\x55\x1a\x3f\x58\xf0\xcc\x75\x94\x26\x0d\xb7\xb8\x8a\x3d\xef\xa9\xc6\x78\x43\xd7\x19\xfa\x3a\x5d\xf0\xaf\x8a\xff\x4f\xfb\x4f\xee\xf1\x5f\xb4\xed\xe1\x50\x72\xef\xbc\xf2\x89\xc5\xfe\xfd\x86\x5f\xbc\x6b\xf8\xdf\x47\xbf\x9c\x36\xcd\xce\x9c\x99\x8f\x71\xff\xba\xa9\xa7\x4f\xe0\x2f\x9b\xfb\x0f\x90\x7b\xc7\x4c\x67\xc4\xe3\x61\x9a\x33\x79\x32\x62\xf7\x7b\x5b\x36\x65\x09\x4d\x75\x35\x7a\x20\x6e\xae\xe6\xc6\x17\xcd\x56\x6d\xf4\x1d\x86\xfa\x97\xfb\x26\x21\x39\x6c\x84\xe2\x6e\x07\x38\x93\x50\xe2\x9f\x36\x5b\x84\x0f\x3f\x5b\xfd\x9f\x9b\x9f\x9e\x33\x35\x73\x7b\xc9\x2a\x4a\xda\x92\x41\x8e\x82\x4c\x43\x4d\x69\x20\xef\x4d\x8b\xe9\x5f\x7e\xdd\xed\x2c\x67\xa6\xe7\x25\x5a\x65\xe2\x43\x9a\x65\x67\x61\xdb\x62\xc8\x61\x53\x61\xcf\x02\x63\x72\x06\x47\x59\xb8\x8f\xa0\x52\x1f\x9d\x51\xf6\x9c\x76\x42\xb2\x3a\xf3\xea\xd1\x6b\x8b\x7b\x7b\x12\x15\xa4\xd5\x4f\xc5\xb2\xd8\x72\x5c\x83\x5f\x94\x0f\xfd\x39\x48\x95\x96\xeb\x07\x3d\xb5\x5a\x9a\xff\xed\xb7\xf9\xb4\x4f\x9c\x82\x5f\xd7\xce\x7b\x98\xf1\xa4\xbb\x1a\xf3\xe6\x47\xcd\xec\xad\x9f\x91\x6f\x1f\xef\x57\xf7\xfa\x89\xc5\x2b\xe6\x92\x54\x90\xda\xa7\xe3\x35\x41\x88\xe2\xe8\xc6\x62\xbf\xdf\x83\x8e\xd3\x9f\x3e\x20\x28\xe1\x8e\xd4\xf0\x80\x3f\x89\xd7\xc3\x2f\xe7\x9a\x3e\x57\x47\xc8\x05\x96\x9f\x3b\xb9\x7f\x5c\x7c\x5c\xff\x5d\xbc\x1e\xc0\xb9\xa6\x8d\xf8\x7c\x77\x94\xb2\xdd\x7d\xfa\x74\x3a\x9d\x96\xa7\xf5\x92\xf1\xc3\xa7\x22\xcf\x73\x85\x79\x07\x5e\x09\x3e\xfd\x27\x3b\x7f\xbe\xcb\x41\x0e\x36\x60\x7b\xf7\x71\xfd\xdb\xc7\xf5\xdf\x5b\x28\x8f\xfa\x05\xd1\xe7\xbb\x8f\xc5\x7a\xbd\x59\xc3\x4d\x7e\x07\xd0\xe7\xbb\xff\x29\x40\xfe\x47\x0e\x8a\xe3\xe6\xad\xce\xc1\xf6\x8f\x1c\xac\x8f\x9b\xb7\xbb\x4f\x06\x4d\xd1\xfc\xb8\xfe\xed\xc3\xcf\xa0\x61\x19\xc7\x2d\x86\xd2\xbc\x22\xed\xc5\xe9\xfd\x4a\xda\xe8\x1d\x88\xe9\x32\xa9\x64\x3e\xd5\x23\x31\xb3\xfa\xa5\xc9\xc8\xb0\xbc\x47\x15\x15\x46\x1b\x04\x13\x11\xd2\x1c\xfe\xf3\xac\x8a\x26\x54\xd1\x4e\xc4\x63\x37\xdf\x6f\xfe\x2f\x00\x00\xff\xff\x19\x18\x4a\x02\x06\x40\x00\x00")
+var _staticsCssSkydiveCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x3b\xed\x92\xdb\xa8\x96\xff\xfb\x29\xd8\x74\xa5\x7a\xe6\x8e\xe5\xc8\xb2\xdd\x1f\xee\x4a\xaa\x66\xef\xce\xd4\xfe\x98\x7d\x82\xa9\xfc\x40\x02\xdb\xdc\x46\x42\x17\x50\xdb\xee\x54\xf6\xd9\xb7\x00\x81\x40\x20\xb5\x33\xf7\x56\x6d\x52\xa9\xb4\xe0\x9c\xc3\xe1\x70\xbe\xa1\x8f\xb2\xa6\x0b\x50\x32\x74\x01\xdf\x6e\x00\x38\x11\x24\x8f\xbb\x55\x9e\x7f\x7c\xbe\x01\xe0\x88\xc9\xe1\x28\xfb\xcf\xef\x37\x37\x0e\xac\x86\xfc\x40\x9a\x1d\x80\x9d\x64\x0a\xb0\x85\x08\x91\xe6\x90\x49\xd6\xee\xc0\x36\x6f\xcf\x6a\xb0\x84\xd5\xcb\x81\xb3\xae\x41\x59\xc5\x28\xe3\x3b\x70\xbb\x2a\x57\xb8\x58\x6b\x5a\x4b\x04\xf9\x0b\x20\x4d\xdb\xc9\x05\x30\x1f\x12\x9f\x25\xe4\x18\xda\x6f\x3d\xb9\xdc\x33\x5e\x67\x15\x6b\x24\x67\xf4\x4f\x8e\x21\x62\x0d\xbd\x7c\x5d\xf4\x04\x04\xa6\xb8\x72\x14\xcc\xd7\x9f\x88\x08\x58\x52\x8c\xbe\x8e\x29\x7b\xf8\xe3\x19\x87\xa3\x37\x38\xc3\x3b\x00\x25\xe3\x08\xf3\x8c\x43\x44\x3a\xb1\x03\xf9\x30\xb6\x03\x0d\x6b\xb0\xfa\xb6\x58\x15\x54\x7f\xcd\x8e\xf5\x4e\x04\x39\x34\xa4\xc9\xf6\x04\x53\x24\x3c\x61\x66\x25\x93\x92\xd5\x3b\xb0\xda\x2a\xf1\x39\x09\xa5\xb0\xb4\x60\x26\xf9\x5c\xaf\xb6\xab\x27\x43\xe1\xc4\xf8\xcb\x9e\xb2\x53\x06\x4b\x21\x39\xac\x0c\xd2\x9e\x35\x32\x13\xe4\x0d\xef\xc0\xea\xde\x9c\x95\x19\x92\x17\x8a\x77\x80\x48\x48\x49\xf5\x3c\xc7\x99\xa3\x8b\xb0\xa8\x38\x69\x25\x61\x0d\x38\xae\x22\xea\xdb\xf6\x0c\xfe\x83\xd4\x2d\xe3\x12\x36\x72\x0e\xb7\x88\x70\x37\x57\xe3\xae\x23\xdc\xf5\xd5\xb8\x9b\x08\xb7\xb8\x1a\x77\x1b\xe1\xae\x62\x5c\xa3\x92\x3b\x58\x49\xf2\x8a\x17\xbd\x86\xee\x8e\xec\x15\x73\x8d\xce\x3a\x49\x49\x83\x8d\xe6\x8c\x8f\xbd\x57\x7b\xf0\x0b\x58\xee\x61\x56\x71\x26\xc4\x11\x12\x6e\xf4\xc6\x1e\xf8\x7e\xbf\xf7\xf5\x05\xa2\x57\xd8\x54\x18\x65\x4c\xb3\x19\xc2\xe6\xf0\x61\x5b\x3e\x3d\xc7\xa2\x8e\x34\xae\x5f\x7a\xb7\x67\x55\x67\x68\x8c\x55\x3c\x3b\xe1\xf2\x85\xc8\xac\x64\xe7\x4c\x1c\x21\x62\xa7\x61\x2e\x1e\xd3\xe4\x39\x6b\x11\x3b\x35\x59\x8d\x9b\x2e\xad\xbf\xb7\xab\xcd\x6a\x63\xd5\xd7\xb0\xa3\xb5\x3d\x53\x50\x6d\x06\x11\x62\xcd\x7b\x16\xaa\x50\xd3\x48\x3d\xe4\xe9\x48\x24\x4e\x59\xad\xf2\x06\x19\xa4\xe4\xd0\xec\x00\xc5\x7b\x99\xb6\xf6\x11\x7d\x4f\x38\x99\x68\x61\x45\x9a\xc3\x0e\xac\xac\x48\x49\xf3\x0f\x5c\xc9\x8c\xc2\x12\xd3\x05\x08\x3e\x3d\x8f\x0b\xee\x73\x8b\x50\xc1\x56\x76\x1c\x67\xea\x14\xc0\xb2\xed\x28\xcd\x14\x2b\x1a\xd8\xfa\x59\xae\xfd\xb2\x67\x90\x0d\x7c\x2d\x21\x07\x4b\x75\x6a\x90\x34\xbd\x6e\xf5\xb4\x9d\xff\xee\xc1\x32\xd2\xbc\x62\x2e\xf0\xd5\x9e\x2e\x25\xe0\x11\x29\xfb\x5d\x72\xd8\xa0\x40\xe5\xee\xb7\x4f\x15\x44\xcf\x31\xf7\xdb\x3c\xe4\x3e\xa2\xd5\xc0\xd7\x2f\x4b\x63\x38\x5f\x54\x50\xb8\x06\xcc\xe8\xeb\xb5\xc0\x83\x19\x26\xc4\x50\x3c\x15\x78\xbd\x99\x93\x6f\xf2\x38\x86\x61\x75\x6c\x3b\xb0\xee\xc3\x61\xef\x4c\x7b\xd8\xdc\x1b\x32\x70\x79\x20\x8b\x3d\x39\x63\xa4\xe2\xa9\xaf\x5d\xfd\x79\x1a\xc8\x5b\xd8\x9a\xc9\x3e\x4a\x0f\xc7\x6c\x7c\x4c\x70\x08\xab\xd5\x4a\x4f\x0d\x7a\xe7\x79\x0f\xe7\x40\x6a\x86\x70\xd2\x4e\x3c\x67\x91\x2f\x1f\x71\x1d\xef\xb2\xb8\xb7\x87\x29\x59\xcb\x28\x3b\x5c\x22\x05\x4c\x70\xea\x80\x33\xb4\x8e\x35\x36\xb4\xc7\x0a\x37\x12\xf3\xe7\xb1\xcb\x9c\xc8\x34\xec\xe1\x45\xf6\xbb\x19\xf3\x69\x97\xb6\xcc\x3d\x3d\xe9\xa5\x95\x66\x28\x97\xbf\x03\x47\x82\x10\x6e\xfa\xd3\x61\x08\x67\x46\xbe\xc4\xfa\x94\x8e\x0b\xb5\xa4\xf3\xce\x06\x92\xb3\x93\x66\x7f\xa1\x94\x86\x76\x75\xa3\xbf\x5c\xc4\xe8\x03\xcd\x7f\x63\xfa\x8a\x25\xa9\xe0\x02\xfc\xca\x09\xa4\x0b\x20\x60\x23\x32\x81\x39\xd9\x6b\xc1\x13\x4a\x77\xe0\x16\x63\x1c\x52\x5d\xda\x78\xe2\x13\xef\x07\xbf\x39\x3c\x8e\xd1\x80\xa6\x44\x36\xc0\xab\x2f\xcd\x8c\x90\x9c\xbd\x60\x3f\x8c\xb4\xb0\xc1\x14\x2c\xfd\x50\xa7\x49\x52\x06\xe5\x0e\x68\xfd\x9d\x4e\x19\xf4\xe8\xa9\x17\x65\xc3\x78\x0d\x69\xc2\xf4\x57\xb9\x9f\x76\xb8\xb8\x1b\xac\x5f\xca\x66\x01\x96\x65\x27\x25\x6b\xb2\x23\xa3\x08\x73\x3d\xe8\x1b\x84\x3d\xd4\x62\x13\x58\x9e\x59\x00\x14\xfd\x2a\x81\xbe\x44\xb1\x5d\x2f\x97\xc1\xca\x04\xcb\x61\x85\x39\x9d\x1a\xd6\x69\xcf\xa0\xb7\xfa\x11\x4b\x6b\x33\x1a\x04\xe9\x21\xe0\xe4\xe3\xdd\x3b\xf3\x51\x1e\x66\x3a\x15\xd7\x96\xe1\xe0\x70\x13\x86\x85\xde\x91\x84\x5e\xc8\x3a\x9c\x5e\x16\x4e\xad\x4d\xee\xae\x48\x09\x82\x70\x09\xf9\x02\x2c\x85\x84\xb2\x4b\x64\x17\x03\x5e\x76\x19\xb2\x7e\x37\x76\x1e\x8c\x24\x65\xe4\x86\xaa\x84\xa5\x9f\xee\x1a\x5e\x57\xdb\xa4\x77\x74\xc3\xbd\x50\xbd\x8d\xe9\x44\x9a\x50\x9a\x76\x7d\xcb\x8e\x64\x1c\x0b\xf2\xa6\x72\x79\x23\x1b\x26\x88\x3a\x5a\x65\x0d\x14\x2a\xfb\x88\x01\xb3\x23\x6c\x50\x0f\x1f\xb8\x3a\x17\xc5\x03\x68\x03\xe8\xc9\x15\x80\xc1\x75\x15\x8e\x4b\xc5\x74\x36\x3a\x4e\xe7\xd9\xfa\xfd\xea\x82\x69\x15\xca\xc0\xa5\xdb\x79\x68\x11\x09\xbd\xdf\x4c\x56\x5a\x83\xae\x5e\xb1\x52\x20\x6c\x17\x89\x8c\x61\x24\xf4\xcc\x4f\x3c\x42\xa0\x44\x09\xb0\x2c\x4c\xb8\x08\x1c\x43\xc9\x28\xf2\x8e\xd7\xed\xb8\x3d\x03\xc1\x28\x41\xe0\xf6\xe1\xe1\xc1\x57\x62\x0b\x31\xb1\xee\xb2\xa2\x4c\x60\x94\x4c\x53\xc7\x24\x66\x44\x90\xda\xd0\x6e\x4f\xb8\x90\x59\x75\x24\x14\xf9\xfa\xab\xe5\x39\x85\x15\x57\x33\xcb\x7c\x46\x0c\x23\x5e\xa6\x36\x59\x1e\xb2\x13\xe4\x0d\x69\x0e\xd7\xa4\x2c\x23\x64\x1d\x4a\x7d\xf4\xa8\x7c\x08\x1d\xe1\xb7\x51\xf8\x75\x7e\xff\x3a\xc7\x98\x76\x8a\x39\xc8\xd5\xcc\xb0\x43\xd1\x95\xd9\xa4\x76\x6f\xa7\xfb\x08\x7d\x8d\x1b\x2f\xf8\x43\x76\x55\x31\x4a\x61\x2b\x70\x76\xc4\x10\xf5\x39\x9d\x0d\xe7\x2d\x23\x26\xdf\x48\x00\x7a\x79\x63\xcf\x11\xe3\xb0\x39\x60\x2f\x47\x90\xa4\x1e\xe7\xd7\x3b\x70\xbb\x2d\x9e\xfe\xeb\x37\x93\x89\x75\xd4\x65\xfa\x94\x08\xb9\x00\x1d\xed\x8b\x03\xc6\x87\x11\x48\x31\x97\xc3\x27\xef\xa8\x01\xd7\xa4\xd5\x0f\x26\x02\x67\xf2\xd2\xe2\x48\xe5\x07\xfd\xa4\xc4\x2d\x46\x24\xae\x17\x80\x92\x61\x31\x37\x62\x16\x73\x9f\x7a\x31\xf5\x15\xda\xfe\x28\xbc\x24\xa4\xea\xad\x04\xd0\x50\xf4\xf4\x4b\x99\xa1\x61\x2d\xf3\x3d\x2c\x86\x68\xaa\x2b\x32\x41\x5d\xc6\xd4\xe5\x88\xba\x0c\xa9\x8f\xbd\x71\x9a\x2e\x8a\xe9\xa2\x11\x5d\x14\xd2\x45\x89\xe0\x36\xa1\x80\xdb\x89\x35\x97\xff\xec\x30\xbf\x24\x56\x36\x13\x83\x4f\xd9\xc3\x9a\xd0\xcb\x0e\xd4\xac\x61\xaa\xe2\x1c\xe7\xe8\xab\xd5\xd8\x72\x76\xe0\x76\xbd\x4e\x35\xaf\xfa\x34\xe5\xc4\x38\xca\x4a\x8e\xe1\xcb\x0e\xe8\xff\x32\x48\x75\xe2\x96\x36\x87\x9e\x6f\x49\x24\xc5\x3e\xbf\x76\xc0\xc8\xc9\x7e\x69\x29\xe9\x8f\x61\x0b\x63\x17\x38\xe9\xe8\xed\x5a\xc6\x2f\xf9\x8b\xb9\x11\xb3\x9a\xfb\xd4\xcb\xc1\x6a\x32\x71\x8d\xb6\x34\x13\xb0\xfa\xfc\x76\x48\x64\xfd\xca\x28\x48\x25\xc7\x59\x58\x6c\x0f\x08\x53\x2c\x03\x71\xb9\x11\xb3\x03\xf7\xa9\x77\x60\xbe\x02\x57\x0d\x9f\x36\x9b\x4d\x11\x65\xb0\x76\x81\xb4\x77\x87\xdb\x3c\x8f\x50\xfa\x36\x84\x84\xfc\x80\x65\xca\xde\x9c\xfc\x4b\xc6\xa4\x90\x1c\xb6\x99\x38\x11\x59\x1d\x7d\xea\x25\x85\xd5\xcb\x04\x58\x34\xe2\xf5\x3c\x62\xbd\x4c\x91\xc8\xc4\xcb\x05\x91\x57\x9c\x4d\x76\x7c\xf8\xa1\xfc\x69\xf5\xf4\xb4\x00\xc5\x7a\xbd\x00\xab\xa7\xe2\xe7\xf7\x28\xed\xf7\x33\xa4\x8a\xed\x7a\x01\x8a\xfc\x71\x01\x56\xf7\x93\xa4\xa2\x0a\xba\x2f\x92\xbf\xdf\xdc\x54\x84\x57\x14\x2f\x6b\xd8\xc0\x83\xed\xee\xb5\xb0\x22\xf2\xa2\x72\xc9\x27\xaf\x9e\xd3\xe5\xb8\x57\x7b\xb9\xfa\xce\x6b\xf6\xf6\xa7\x72\xb6\x55\xff\x7a\x9d\x8f\x8b\x9c\x20\xe6\xa9\xe8\x3a\xe4\xf4\x3e\xa1\x3e\x1d\x89\xf8\x0d\x80\x82\x3e\xb3\x0a\x73\xa4\x39\x2c\x46\x20\xd5\x11\x57\x2f\x25\x3b\x27\xdb\xd6\x43\x76\x3e\x89\x92\x2c\x0e\xd3\x8c\xd8\xce\xe7\x54\x0a\x3f\xe4\xfe\xb6\x1a\x09\xda\x91\xe4\x4d\x4b\xc8\xe5\x97\x5a\x4e\x00\x80\xac\x66\x6f\xf3\x10\xfa\xcf\x34\x44\x50\x61\x4e\x16\x71\x93\xfb\xf1\xda\xa9\x6f\x19\x69\x10\x3e\xef\x40\x11\xe3\xe8\xee\xe2\x9f\x2a\xa8\x7f\xfe\xa0\x92\xb0\x0f\x5f\x53\x22\xcf\x56\x41\x92\x65\x86\x4d\x09\x95\xba\x9c\xb0\x00\xba\x2e\x19\xb5\x33\xa7\x16\x6f\xa1\x10\x2a\x36\xa4\x19\x58\x85\x55\x9a\x64\x6d\x44\x3c\x98\x8c\x58\xfb\x7e\x73\x73\x2b\xf0\x3f\x3b\xdc\x54\x38\xec\x8f\x38\x35\xb9\xcf\x73\xcf\x70\x5c\xb2\x7a\x75\x7b\xbc\xf7\x51\x23\x1f\xbf\x36\x3e\x3e\xe8\xbc\x25\xce\x69\xb6\xef\x7e\x7f\x0f\xf7\xb8\xef\x54\x1f\xa1\x30\x5b\x27\x15\x6b\x14\xd0\xa7\xbf\xfd\x81\xf7\xd2\xaa\x8b\xae\x0a\x01\x69\x80\x3c\x12\x01\x2a\x28\xf0\x02\x94\x9d\x04\x44\x82\x8a\x75\x14\x81\x12\x03\x44\xf6\x7b\xcc\x55\xae\x8e\x3a\x0c\x24\x03\x4c\x1e\x31\x07\x02\x4b\x49\x9a\x83\x00\x19\xd8\x33\x0e\xf0\x19\xd6\x2d\xc5\x8a\x56\x7d\x01\x2d\x67\xca\x8f\x2b\x3a\x27\x28\x40\xb1\x05\x2d\x39\x63\x2a\xfe\xf6\x29\xd9\x86\x9c\x08\x58\x5e\x53\x26\x0a\x14\x7d\xff\xe5\xc4\x61\xdb\xfa\x0d\x18\xe7\x75\x8a\xa8\x9f\xd6\x8b\x50\x8c\x6c\x17\x96\x82\xd1\xce\xf6\xdd\x8d\x02\xd9\x0e\x4d\xdf\x43\xcc\x93\x45\x43\xaa\xb7\x33\xb5\xe4\xb8\x41\xe4\x0a\x86\x8d\x2d\x18\xde\x21\xfe\xd8\x9e\x3d\x3b\x4e\x2f\x90\xb5\x9c\xd4\xb0\x4f\xc8\xd2\xf5\xc9\x66\xb8\x83\xd3\x1d\x12\xd6\x0a\xbf\xce\xf9\x2b\xfd\xca\x11\x9d\xa5\x84\x65\x50\x9c\x6b\x4a\x20\xba\xdc\x88\xaa\xa9\x29\x5b\x9d\x5a\xa7\x81\xaf\xbe\x44\x13\xb5\xba\x7f\x2d\x90\xc0\xfe\x42\xc9\x17\x18\xb0\x78\xfb\xb8\x79\x7c\x78\xac\x5c\xc3\x5b\x43\xf8\x9d\x7b\x33\x70\x75\x77\x3e\xb1\x68\xd6\x12\x4a\x05\xf8\x02\x28\x01\x5f\x00\x5c\x80\xf7\x80\x66\xba\x2b\xb3\xde\xf3\x5d\xf7\x3b\xcf\x60\xdf\xb3\x55\x3c\xa6\xab\xf2\x6b\xd8\x9e\x94\x0e\x98\x27\xf1\x45\x15\x7d\xc3\xfd\xca\x55\x70\xfd\x31\x5d\x49\xf5\xba\x33\x8c\x94\xab\x18\x94\x6b\xbd\x79\x80\xe5\x7d\x5a\x16\x61\x87\x2d\xd9\x98\x41\x97\x06\xd6\xa4\xca\xa4\x6e\x08\x6a\x6f\xce\x0e\x0b\x30\x1e\x37\xcd\xe6\x78\xf0\x4f\xb3\x91\xaf\xe9\x49\x2d\x8a\xaf\xc9\xae\x53\xe2\x8e\x7d\xba\x0d\x9d\x6e\x28\x23\x22\x5a\x0a\x2f\x3b\x40\x1a\x85\x97\x95\x94\x99\x48\x96\xbe\x91\x34\x97\xa5\x93\xfb\x4d\xcd\xf6\xbb\x9e\x98\xf2\xf7\x3e\x05\xe2\x49\x60\xa6\x32\x9a\xbc\x63\x8c\xc2\xcd\x68\x89\xe0\xd3\x05\xa1\x6f\xa3\xde\xf3\x90\xf5\x86\xe8\xd2\x35\x81\xed\xe9\x0c\x5d\xea\xa9\xf6\xc2\x88\x02\x0a\x7b\x1f\x0f\x13\x6a\x15\xf2\xe9\xb7\xd0\x82\x52\x67\xd0\xf7\xf1\x05\x9b\x5b\x61\xad\xe2\x4f\xff\x2f\x4f\xeb\xc1\x9e\xe2\x81\x8b\x68\xd5\xa1\x63\x33\xa9\x3f\xa3\x5e\x7b\x78\xf9\x3f\x4f\x33\xd8\x4e\xf0\x9a\xe7\x1a\x81\x98\xdb\x6c\xbd\x6e\xdc\x2d\x59\x4f\x1d\x41\x64\x7b\x52\x95\x27\x40\x1e\x53\x81\xde\x88\xf8\x1d\xbd\x32\x04\xe2\xfd\x3c\xa8\x1d\x4d\x23\xc8\xa3\xdf\xf8\x4b\x35\x46\x46\x58\xee\xbd\xd4\x95\x62\x33\x08\x92\x1b\x47\xc7\xd9\x69\x6e\xbd\x09\xdd\x7a\x8f\x2a\xc2\x12\x12\xaa\x88\xff\x88\x00\x1c\x47\x3e\x91\x69\x02\xc9\x26\x4f\x7f\x73\x23\x31\xef\x6f\x50\x19\x07\xcb\xa1\x9c\x0e\xb5\x72\xed\xdd\xf5\x28\x0c\xfd\x1a\x42\x83\x91\xc6\x56\xc4\xc5\x53\x91\xba\x70\x7f\x48\xa1\x0e\x4f\xa6\x6c\xeb\xaf\x48\xa5\xbb\x3e\x0a\x22\xaf\x73\x76\x64\x7a\xb8\xe1\x93\x96\xe5\x1e\x8e\x75\x5c\xa3\xb8\x7b\xaa\xe5\xa3\x59\x87\x95\xba\xff\xf2\x82\x2f\x53\x2d\x31\x0f\xea\x15\xd2\x0e\x2f\x85\xe4\xaa\x92\x08\xb2\x84\xaa\xaa\x12\x90\x4d\x57\x97\x61\x7b\xfa\x82\x29\x65\xa7\x49\xa2\xbd\x9a\x25\x1a\x47\x93\xd4\xe3\x16\x78\x0a\xe3\x05\x5f\x7a\x2c\xd8\xb6\x94\x54\x50\x37\xe5\x02\x7a\x8b\x14\xf0\xfb\x20\x65\x08\x12\x30\xb2\x79\xf8\xf5\xd7\xdf\x7f\x4f\x33\xa2\x00\xfd\x23\x29\x9c\xfb\xeb\x21\x45\x57\xfa\xea\xed\x27\x15\xdb\xf9\x6e\x6e\xc4\x63\xfa\xb1\x48\x70\x49\x1b\xbd\xd0\x89\xb9\xb0\x43\x31\x53\x7e\xd5\x74\x0d\xee\x3b\x67\xc6\xe1\x29\x6b\x61\xf5\x82\x65\x46\x49\xf3\xe2\xc3\x89\x97\x4b\x49\x3b\x3c\xd9\x10\xe6\x1d\xc5\xc2\x2d\x4a\x9a\x46\x55\x18\xc9\x08\x9a\xa7\x10\x94\x09\xfe\x8b\x6b\x9a\x40\xe3\x68\x84\xc2\xde\x06\x77\xf1\x3f\x46\xd8\x78\x04\x91\xf5\xef\x26\x3c\x0f\xb2\xd9\x7e\x4c\x21\x88\xae\x56\xc5\x61\x02\xa1\xc8\x93\x08\x36\xc8\xc6\x08\xeb\xf4\x0a\x1c\x87\x2f\xac\xaa\x3c\x29\xd5\x72\x6c\x17\xb9\x2d\xb9\x42\xb8\xa9\x72\xe0\x0a\x28\x57\xb3\x5d\x03\x3b\x5b\x0a\xb8\x2e\x70\x44\x29\x7c\x55\x96\xc8\xab\x43\x0f\xeb\x6a\x77\x7c\x6e\x61\x83\x74\x43\x26\x13\x12\x56\x2f\x60\xa9\x7f\xae\x61\xdf\x5b\x1d\x3d\x54\x9d\xc7\x12\x5d\x19\x21\x59\xd7\x71\x5b\x63\x09\x11\x94\xd0\xd6\x25\x91\xd3\x81\x0b\x70\x05\x90\x95\xe6\x35\xa0\x49\x8f\xbd\x1f\xdd\x56\x0e\x77\x2e\x93\xb9\xe0\xe8\x59\x42\xf2\x6e\x26\xae\x49\x19\xaf\xb3\x96\x63\xdd\xaf\xaa\xf0\xbb\x2f\xbd\xae\xe8\x59\xbf\x7f\x9d\xed\x96\x33\xaf\xa0\xc7\xed\xf1\xed\xe8\x25\x89\xb1\x7c\x4b\x3c\x4c\x2e\x86\x82\x21\xa2\x6a\x1f\xa4\x47\x13\xde\xa3\xba\xd9\x27\x93\x76\x44\xb7\xf4\xc7\x75\x61\x72\xc9\xf8\x4d\x9e\x0e\xeb\xef\x75\xd8\x07\x3a\xe9\x06\xbf\x77\xe8\xa6\x62\x00\xe0\x1f\x9d\x90\x64\x7f\xb1\x6d\xa3\xe1\x4d\x9d\x97\xfa\x54\xac\x6e\x59\x83\x1b\x29\xa2\xf8\xb7\x9a\x08\x5a\x47\x9e\x6c\xb9\xf5\x4f\x0e\x2d\xe1\x41\x19\xed\x93\xd7\x99\xfb\x7d\x73\x3f\x12\x0b\x6f\x0f\x33\xc9\xa1\x38\x66\x2c\xed\x01\x4b\xd9\x64\x66\xbd\x05\xf0\x3e\xdc\xf3\x6b\x7f\xcc\xfa\x2e\x6f\x68\x70\x51\x7e\xc9\x17\xbf\x09\x4f\x3c\x6c\x08\xa7\xc3\x7b\xe0\x44\xa2\x69\x8a\xad\x80\xdd\xf1\xd0\xc0\x74\x34\x63\x59\x8f\x26\x66\x7d\xec\x44\xcd\x2d\x5a\x9a\xd9\xb6\xa9\x73\xc7\x7d\xd7\x25\x8c\xdc\x93\x89\xaa\xe1\xc3\x27\xf4\xa3\xd6\x6c\xfa\xcc\x89\x56\xca\x0c\xb4\x13\xc3\xd4\x7c\xe2\x95\x7d\xfe\x9c\xdc\xe5\xec\xbe\xde\x5b\x7e\x1e\xea\xea\x2e\x66\xf8\xd4\xf1\xdf\xe2\xde\x42\x92\x9e\x8c\x03\x2a\xdb\xd4\x13\xbc\xe1\x02\x58\x36\x99\x61\xfa\x2c\x66\x5e\xe9\xa4\x6e\xbf\x27\xde\x7d\x5a\xaa\xe6\x75\xbe\x92\x5b\xa2\x00\x2c\x1c\x03\x47\x4c\xdb\xcc\x5d\x0e\xd9\x94\x4d\x8d\xda\xbb\xec\xb6\x93\x96\x39\x1b\x78\x8a\x62\xd4\xd8\xf7\x2f\xb4\xa9\x09\xa3\x99\xe4\xe3\x0c\x29\x47\xd8\xb9\x92\x01\x6e\x0f\xa9\xc0\xa3\x58\x5b\xe4\x85\xcb\x9b\x11\x61\x99\x09\xac\x33\xf7\x95\xa3\xf7\xd2\x8f\x7d\x4e\x1a\x97\xf5\xf6\x22\xb3\x13\xae\x52\xf6\x7e\xe9\xa2\x66\x6f\x53\x33\x22\x3d\x91\x1c\x1c\xbf\xb7\x4c\x28\x57\x6a\x7b\x43\x19\x9d\xbe\xd8\x19\xee\xbb\xa7\xd3\x6b\x9f\x9e\xb9\x1f\xae\x95\x01\x4d\x13\x35\x1d\xdd\xe0\xbe\xce\x3b\xe8\x55\x10\x94\x8a\xe8\xe9\x8b\xb3\xb5\x72\xa5\xfe\xa6\x6e\x46\x6c\x5e\x6e\x0c\x79\x8e\xc1\x04\xd9\xe1\x6d\xb6\x87\xd7\x5b\xbd\x11\xd7\xff\x5e\x41\xc5\x55\xf2\xb1\xb8\x77\x1a\x19\xa3\xab\xe8\x14\xab\xa7\xfb\xdf\xfb\x54\xda\x01\xef\xe0\x5e\xba\xc2\xaf\x0f\xfd\x1f\x3e\x3c\x4f\x0a\xdc\x25\x0e\x83\x0b\xbe\x92\x2d\x6f\x25\x47\x64\xe8\x97\x4c\x89\xd6\xc3\xd2\x67\xfd\xe0\xdf\x0a\x3e\x04\xe7\xdb\x9b\x8d\x3d\xfd\xc7\xe4\x8d\xe1\xd6\x24\x9d\x7e\x6b\x6a\xfc\xea\xc1\x33\xd7\x51\x9a\x34\x5c\x05\x2b\xf6\xbc\xf7\x1e\xe3\x0d\x5d\x67\xe8\xeb\x74\xd7\x60\x55\xfc\x7f\xda\x7f\x72\x8f\xff\xa2\x6d\x0f\x87\x92\x7b\xe7\x95\x4f\x2c\xf6\xef\x37\xfc\xe2\x5d\xc3\xff\x3e\xfa\x0d\xb7\x69\x76\xe6\xcc\x7c\x8c\xfb\xd7\x4d\x3d\x7d\x02\x7f\xd9\xdc\x7f\x80\xdc\x3b\x66\x3a\x23\x1e\x0f\xd3\x9c\xc9\x93\x11\xbb\xdf\x20\xb3\x29\x4b\x68\xaa\xab\xd1\x2b\x73\x73\xbf\x37\xbe\xad\xb6\x6a\xa3\x2f\x42\xd4\xbf\xdc\x37\x09\xc9\x61\x23\x14\x77\x3b\xc0\x99\x84\x12\xff\xb4\xd9\x22\x7c\xf8\xd9\xea\xff\xdc\xfc\xf4\x9c\xa9\x99\xdb\x4b\x56\x51\xd2\x96\x0c\x72\x14\x64\x1a\x6a\x4a\x03\x79\x0f\x63\x4c\x13\xf4\xeb\x6e\x67\x39\x33\x3d\x2f\xd1\x2a\x13\x1f\xd2\x2c\x3b\x0b\xdb\x16\x43\x0e\x9b\x0a\x7b\x16\x18\x93\x33\x38\xca\xc2\x7d\x04\x95\xfa\xe8\x8c\xb2\xe7\xb4\x13\x92\xd5\x99\x57\x8f\x5e\x5b\xdc\xdb\x93\xa8\x20\xad\x7e\x2a\x96\xc5\x96\xe3\x1a\xfc\xa2\x7c\xe8\xcf\x41\xaa\xb4\x5c\x3f\xe8\xa9\xd5\xd2\xfc\x6f\xbf\xcd\xa7\x7d\x27\x15\xfc\xce\x77\xde\xc3\x8c\x27\xdd\xfd\x9a\x37\x3f\xea\x88\x6f\xfd\x8c\x7c\xfb\x78\xbf\xba\xd7\xef\x34\x5e\x31\x97\xa4\x82\xd4\xbe\x3f\xaf\x09\x42\x14\x47\xd7\x1e\xfb\xfd\x1e\x74\x9c\xfe\xf4\x01\x41\x09\x77\xa4\x86\x07\xfc\x49\xbc\x1e\x7e\x39\xd7\xf4\xb9\x3a\x42\x2e\xb0\xfc\xdc\xc9\xfd\xe3\xe2\xe3\xfa\xef\xe2\xf5\x00\xce\x35\x6d\xc4\xe7\xbb\xa3\x94\xed\xee\xd3\xa7\xd3\xe9\xb4\x3c\xad\x97\x8c\x1f\x3e\x15\x79\x9e\x2b\xcc\x3b\xf0\x4a\xf0\xe9\x3f\xd9\xf9\xf3\x5d\x0e\x72\xb0\x01\xdb\xbb\x8f\xeb\xdf\x3e\xae\xff\xde\x42\x79\xd4\xcf\x90\x3e\xdf\x7d\x2c\xd6\xeb\xcd\x1a\x6e\xf2\x3b\x80\x3e\xdf\xfd\x4f\x01\xf2\x3f\x72\x50\x1c\x37\x6f\x75\x0e\xb6\x7f\xe4\x60\x7d\xdc\xbc\xdd\x7d\x32\x68\x8a\xe6\xc7\xf5\x6f\x1f\x7e\x06\x0d\xcb\x38\x6e\x31\x94\xe6\x29\x6a\x2f\x4e\xef\xf7\xda\x46\x8f\x49\x4c\x97\x49\x25\xf3\xa9\x1e\x89\x99\xd5\xcf\x55\x46\x86\xe5\xbd\xcc\xa8\x30\xda\x20\x98\x88\x90\xe6\xf0\x9f\x67\x55\x34\xa1\x8a\x76\x22\x1e\xbb\xf9\x7e\xf3\x7f\x01\x00\x00\xff\xff\x2f\x8a\x2c\xde\x4b\x40\x00\x00")
func staticsCssSkydiveCssBytes() ([]byte, error) {
return bindataRead(
@@ -2720,7 +2720,7 @@ func staticsJsComponentsTopologyRulesJs() (*asset, error) {
return a, nil
}
-var _staticsJsComponentsTopologyJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\x6d\x77\xdb\xb6\xd2\xe0\xf7\xfc\x0a\x84\x4f\x4f\x24\x35\x12\xe5\xa4\xf7\x76\xf3\xc8\x96\xef\x6d\xe3\xa4\xf1\xa6\x8e\xbb\xb5\x9b\x9e\xb3\xb6\x4f\x0f\x45\x42\x12\x62\x0a\xe0\x25\x40\xd9\xbe\xa9\xff\xfb\x1e\xbc\x12\x00\x41\x4a\x72\xdc\xde\xee\x6e\x3f\x34\x16\x30\x33\x98\x19\x0c\x06\x83\xc1\x0b\xc7\x5f\x83\x4f\x74\x89\x30\x03\xab\x2a\x67\x88\xb2\x72\x02\x58\x59\x41\xf0\xf5\xf8\xc9\x93\x75\x52\x02\x46\x0a\x92\x93\xc5\xdd\x6b\xb2\x2a\x08\x86\x98\xc9\xe2\x73\xbf\x18\x4c\xc1\xe7\x27\x4f\x00\xc0\xc9\x0a\x4e\x40\x4f\xa3\xf5\x86\xbc\x70\x85\x6e\x11\xa6\x13\x70\x91\x14\xe8\x84\xff\x3d\x04\x98\x30\x34\x47\x69\xc2\x10\xc1\xa2\xe8\x4a\x40\x32\xb8\x2a\xf2\x84\x71\x12\x97\x4f\x00\x00\xe0\x20\x43\x6b\x90\xe6\x09\xa5\xd3\x48\x13\x8d\x0e\x65\x9d\x5b\x9b\x92\x7c\x44\x57\xa3\xff\x01\xe6\x28\xcf\x41\x4a\x30\x83\x98\xd5\xa0\x61\x52\xa3\xec\x1b\x1b\xa4\x05\x28\x87\x0b\x88\x33\x17\x10\x80\x03\xca\x4a\x82\x17\x87\x5a\x17\x60\x8d\xe0\xcd\xc1\x58\x95\x1e\x8c\x67\xa5\x8f\x50\x80\xf5\x08\xcd\xa7\x51\x5a\x95\xa5\xc6\x7a\x8b\x72\x06\xcb\xe8\xf0\xf3\xe7\x66\xe9\xfd\xfd\xc1\xb8\x08\x11\x81\x39\x85\x87\x6f\xab\x3c\x6f\xa9\xe7\x8d\x68\xee\xdf\x55\xab\x04\x9f\xa3\x15\x7c\xcd\x55\x72\xcb\x78\x53\x6d\x75\xdd\x0d\xfe\x88\xd6\xd0\xaf\x3f\x18\x67\x68\x6d\x2b\xd9\xff\xcd\xf5\x89\x32\x4b\x99\xa4\xe0\x7d\x4e\x03\x6a\x0f\x81\x8d\x8a\x04\xc3\xbc\xa1\x7a\x0e\x2e\xc5\x5c\x22\xca\x48\x79\x17\xe9\x4e\x9b\x93\x72\x35\x5a\x94\xa4\x2a\x00\xc2\x45\xc5\x46\x74\xe5\x63\xbb\xbd\x6c\x21\x94\xe4\xa6\x09\x0b\xc0\x41\x9e\xcc\x60\x5e\xdb\x19\x66\x25\xc9\x47\xa2\x30\x02\x73\x52\xda\xe6\x94\x30\x58\xa0\xf4\x9a\xf7\xe8\x51\xc2\xe0\x98\x2b\xf7\x60\x2c\x60\x43\x94\x2d\x3e\x04\xb7\xa1\xe6\x5d\x30\x7a\x83\x58\xba\x04\xf2\x9f\xd1\x68\x0d\x4b\x86\xd2\xa4\xa1\x21\x83\x2a\xc8\x0a\xd5\x96\x49\x86\xc8\x28\x47\x6b\x18\x89\x61\x6a\xb1\xbd\x22\x19\x8c\x00\xbb\x2b\xa0\x02\x8b\xc0\x3a\xc9\x2b\x38\x8d\x24\xf8\x5a\x40\xe4\x35\xc6\x89\x40\x48\x97\x30\xbd\x86\xd9\x34\x52\x7f\x44\xe3\x36\x2e\xa4\x06\x85\xae\x2c\x36\x94\x45\xb5\x69\x27\xc8\xbf\xe9\xef\xad\x45\x30\x18\x61\x29\xb6\xe7\x59\x13\x3a\x7c\x27\xff\xd0\x9c\x1f\xd0\x22\xc1\xb5\xd3\x58\x2c\x72\x38\x22\x15\xa3\x28\x83\xad\xdd\x12\x40\x41\x58\x62\x1c\x8c\x79\xa5\xfe\x27\x68\x0f\xde\x20\xfb\x63\x2c\x25\x99\x51\xa3\x65\xb4\x82\x23\xae\xdb\xb0\x86\x93\x19\x25\x79\xc5\x1c\x43\x41\x2b\x78\x2e\x10\x1a\x46\x02\x26\x19\xa2\xc9\x2c\x87\x99\xdb\x13\x60\x3a\x9d\x82\xcb\x1e\xb7\x8c\xcb\xde\x0e\xdd\xc2\xf9\x3c\xfc\x4e\xb1\xb0\xa3\x35\x95\x7c\x08\x6f\x25\x63\x09\xf3\x84\x79\x83\xc1\xc8\xf8\xc8\x12\x71\xae\x0e\x7f\x56\x0d\x6e\x90\xe8\xaf\x64\x7b\xc6\xf9\xb9\xae\xdc\x72\x8a\x60\x92\x26\x39\xc4\x59\x52\x8e\x14\x03\x97\xbd\x00\xdc\x65\x2f\x02\x61\xe6\x27\xdc\x5d\x27\x8c\xe3\x65\xd9\xf8\xe4\x64\x7c\x77\x77\x77\xc7\xc1\x8b\x3c\x49\xe1\x92\xe4\x19\x2c\xa7\x51\x5d\xd5\x46\x67\x3d\x22\x78\x42\x0a\x88\xed\x3e\x3b\x95\x73\xce\x9b\xdb\x22\xc1\x19\xb7\xd4\x0e\xdc\x34\x27\x34\x80\xfb\x9a\xe4\x79\x52\xd0\x2e\x64\xcf\x09\xf1\x69\x22\x52\x73\x95\x3d\x15\x8c\xe8\x0a\x88\xb9\x49\x4d\x38\x51\x8b\x42\xb4\xe9\x8d\xa4\xea\xba\x2c\xb0\x8d\x23\x11\x2e\x28\x63\x56\x18\x7a\x48\x5f\xf6\xb8\x51\xd4\x3d\x73\x18\x14\xcb\x1a\x57\xa6\x37\x39\x41\xdd\xeb\x4e\xe7\xbc\x7b\x37\x59\xad\x26\x94\x6e\xad\x21\x3e\x87\x46\xa0\x53\x37\x6d\xd6\xb2\xcd\xb8\x04\x94\xdd\xe5\x70\x1a\xad\x92\x72\x81\xf0\x28\x87\x73\x36\x01\x2f\xf6\x8a\xdb\x36\xaa\xff\xbc\x86\x77\x55\x11\x43\xcc\x6c\x75\x73\x2e\xcf\xcb\x64\x0d\xdb\x7a\x6a\x0b\x3d\x0b\xe1\xc2\x83\x2b\xa0\xe1\x12\xe6\x42\xcb\x9e\x7e\x5f\x2e\xbf\xd9\x5b\x6d\xad\xdc\x9f\x61\xfe\x1f\xd3\xef\x0e\x7a\xd2\xee\x77\xa3\x9e\x6c\xe7\xb6\x84\x79\x31\x9a\x31\x1c\x6d\xa4\x09\x18\x62\xb9\xe5\xe5\x01\x07\x9d\x00\x78\x0b\x5e\x64\x2f\x97\xdf\xac\xfe\x4e\x01\x29\xc1\xcb\xe5\xdf\x57\xfc\x5f\xae\xdf\xc3\x67\xff\xf5\xea\xe5\xdf\xbf\xd9\xef\x72\x95\xb3\x8a\x31\x82\xd5\x74\x22\x7f\x18\x3d\xcf\x18\x06\x33\x86\x47\x45\x89\x56\x49\xd9\xea\xa7\x76\xd1\xf3\x3f\xd3\x1c\xa5\xd7\x41\x8b\x0c\x0f\x5b\x4f\x5d\x8b\xfc\xae\x58\xa2\x94\x60\x60\xfe\x52\xf6\x95\x94\x28\x19\x2d\x51\x96\x41\x3c\x8d\xf8\xfa\x30\xea\x9e\x22\xa4\xac\xa1\x80\x37\x38\x7b\x84\x4a\x83\x65\xe1\xb0\xbd\x3d\xce\xdf\x35\xd2\xdf\x29\xd6\x9f\xab\x95\x9b\x5c\xab\x75\x4d\xd3\x5b\x86\xf9\x66\x94\xe7\x88\x32\xab\xa1\x45\x09\x57\x39\xc2\xa3\x79\xb2\x26\x25\x62\x90\x7a\x03\x1e\xc6\x8b\x18\x2c\xe2\x8f\xfd\x41\xfc\x2e\xa1\xfd\xe1\xa0\x65\x60\x01\xd7\x7d\x28\xfe\x95\x79\x8a\xa5\xa1\x1e\xaa\x37\x28\x63\xcb\x09\xf8\xdb\x5e\xfb\x28\x0d\xb8\x12\xb5\x94\x6d\xf1\x8f\xb2\xf6\x7f\x55\xb0\xbc\xeb\x20\x49\xf0\x44\xe8\x60\x1a\x11\x2c\x31\x8e\x12\x96\x70\x85\x9c\xc1\x1c\xa6\xac\x15\xb5\xd3\x7d\xb5\xa9\xbb\xc3\x91\x78\x63\x23\xcd\x61\x52\x4a\x5f\x22\x87\x59\x4c\x19\x29\x7c\xe9\x5e\x73\xa8\xe8\xf0\x19\x1f\x35\xb4\xcb\x35\xc8\x68\x49\xc8\xe5\x76\x4a\xa0\xaf\xfd\x6c\x44\x13\xa4\x55\x3c\xdd\xc6\x4e\x91\xdc\xff\xdd\xa3\xf1\x1d\x5a\x2c\x73\xb4\x58\xb2\x3f\x70\x40\x2e\x75\x1b\x23\x5e\xb1\x71\x34\xb6\xf8\x5e\xa7\xdf\x0d\xc9\xcd\xe3\x71\xdb\x99\xfd\xcd\xaa\x58\x26\x14\xfd\x1b\xfa\x23\x12\xea\x8a\x1f\xa4\x25\xbd\xb9\x2d\xca\xce\x58\xd7\x8c\x48\xa3\x5c\x6f\x50\xb6\x20\x77\x8f\xc9\x47\x1c\x7d\x46\xd4\x2f\x1f\x80\x7e\xdf\xfe\x35\x47\x5f\xa0\x84\x9b\xb4\x1b\x69\x31\x52\xa8\x40\xab\x63\xe4\xb2\x12\x2d\x16\x7c\xe0\x34\x26\x65\x15\xbd\xfc\x73\x45\x2a\x0a\x95\xe9\xd0\x25\xb9\x39\x77\x57\x3c\x91\x82\xc8\x61\xb2\x86\xaa\xab\xce\xad\x08\x84\x54\xac\x0e\x4d\x96\x28\x83\x3e\x7e\x48\x09\xa2\xf3\x27\x8a\xc5\x8b\xcb\x9e\x09\x48\x2e\x7b\x43\x80\xa8\x47\xe2\x23\xa2\x68\x96\x43\xf0\x0f\x60\x41\x8e\x4a\xb8\x22\x3c\x30\x02\x13\xa7\x58\x3a\x8a\xcb\xde\xd5\x2e\x61\x4d\x4b\x48\xb3\xb9\x63\x82\xf9\x50\xdf\xa6\xd4\x90\xf0\x73\xa2\xaa\x03\xb8\x79\xfe\x9b\x90\xd5\x08\xe1\x68\xbb\x58\x32\x64\x6f\x2a\xc0\xfd\xdf\x84\xac\xc0\x31\xae\x7b\x84\x53\x3e\xc6\xcd\xdc\xf6\x86\xb8\xd0\x30\xb4\x9d\x0e\x83\xfa\x6b\x08\x28\x4c\xe5\x51\x24\x3c\xb5\x8d\x8e\xd3\x3e\x6d\xfa\xf8\xed\x64\x14\x3c\x3d\xa6\x90\x73\xf4\x58\x42\xbe\x45\x9e\x90\xbc\x60\x57\x21\xe7\x55\x9e\xd3\xb4\x84\xf0\xf1\xfa\x12\x8a\xfc\xc9\x96\x42\x06\xa7\x0e\x25\xe5\x1b\x45\xa8\x5e\xd8\x2c\x16\x39\xd4\x29\x96\xef\xef\x7e\x84\x6b\x98\xf7\xe7\x49\x4e\xe1\xa0\x53\x70\xc9\xd1\x48\x08\x4c\x59\x92\x5e\x07\xdc\x1d\xea\xd2\x52\x09\xf9\xec\x22\x94\x05\x44\xc1\x2a\x41\x58\x4c\x61\x0d\x8f\x10\xf0\x1f\x8f\xcb\x4b\x91\x57\x74\x44\xd1\x02\x4b\x4e\x68\x35\xdb\x92\x91\x8d\x1d\x97\x2a\xcd\x3e\x42\xd7\xbd\x36\xa4\xba\x3b\x8f\x5b\xd9\x9f\xd3\x77\x74\x95\xfc\x05\x3a\x6f\x85\xf0\x1f\xd1\x7b\xf5\xbe\x22\xc4\xec\x03\xc9\x20\x78\x3a\x05\x98\x5b\xeb\xb3\x67\xc0\x2a\x8e\x11\xfd\x81\x87\xdc\xa7\x37\x18\x96\xfd\x41\x64\x8d\xd7\x51\x92\xe7\x8f\x36\x66\xc7\xba\x9f\xc1\x6b\xd9\x38\x10\x4c\x9d\x97\xb0\x61\x11\x12\xe1\xbb\x3c\xef\x5b\x7c\x7e\xb9\x49\x08\xf8\x86\x5a\x62\xb9\xe0\x50\xca\x89\x9a\x3d\x55\xdb\x47\x48\x48\x1d\x91\x7c\x76\xe3\x0c\xe3\x1b\x2e\x7b\x13\xd0\x68\x2d\xd6\xc3\x2a\x1b\x82\x00\x9e\xb0\x4b\x8e\xf8\xb4\x03\xf3\x7e\xfb\x60\xe5\x21\x03\xbf\x40\xf8\x91\xba\xff\x27\x84\x01\x1f\x67\x98\x64\x7c\xed\xaa\xbb\xba\x40\xf8\xbb\xbc\xb9\x8d\xfb\xb8\x7e\xb1\xa2\xcb\x02\xe1\xff\xf8\x10\x27\xd7\xa3\x14\x95\x69\x0e\x1f\xdd\x3f\x57\xf8\x8b\x3b\x4a\x75\xd3\x2f\x9c\x52\xa8\xa3\x2a\xfc\x53\xa0\xab\x76\x53\xd0\x17\x77\x53\x48\x37\x8f\xc8\x81\x5c\x18\x6c\xee\xa4\x06\x1b\x81\x0e\x72\xe3\x7b\xef\x97\x3e\xd4\x80\xf0\x9c\xa8\x83\x0c\xde\x69\x95\xbf\x03\x8a\x32\x38\x4b\x9c\xf5\xd7\x01\x4b\x66\x54\xf9\x2e\x44\xbf\xc3\x49\x7e\xf7\x6f\xb1\x77\x96\xa4\x0c\xf1\x35\xd6\xd3\x34\xc1\x3f\xc3\x24\x7b\x9d\x14\xac\x2a\x21\x05\xff\x00\x2f\xc1\x04\xec\x79\x9d\xc6\x92\x99\x68\xd5\xcc\xc9\x0a\x5c\xa7\xc3\x3d\x2a\x0d\x25\xa6\xb2\x42\x2c\x84\x0f\x0f\xc6\xce\xcf\x16\x50\xbe\xc2\xaf\xa9\xff\xca\x17\xc8\x86\xc9\x67\xcf\x40\x23\x79\x5d\x67\xaf\xad\x06\x38\x11\xaf\x23\xb4\x28\xdd\x02\xfe\x00\x31\x2c\x13\x46\xca\xc8\x3b\x03\xd3\x6c\x4f\xcc\x8b\x09\x3e\xc6\x9f\x60\xca\x7e\x4a\xd2\x6b\xc8\x9a\x0a\x40\xa2\x16\x11\xac\x55\xe0\x15\x04\xc1\x25\xfb\x1a\xf6\xe1\xc2\xbc\xcd\xc9\x4d\x93\xa5\x79\x4e\x6e\x46\x2c\x99\xe5\x50\xaf\x1a\x0f\x0f\xc6\x81\xc2\x87\xb4\xf8\x5d\x0e\xcb\x80\x16\x12\x5e\xac\x35\x60\xfd\x08\x82\x29\xe1\xad\x1f\x0f\xe1\xe4\x57\x52\x5e\xcf\x83\xf2\xdf\xa8\x9a\x51\x9a\xe4\x5c\x74\xf7\xf7\x43\xda\x32\xc7\xb7\xca\x2a\xaf\xc7\x46\xfb\x36\x8b\xcf\x51\xbd\x1d\xc7\xf1\x0f\x0f\xc6\x5e\xc1\x83\x0c\x59\x26\x99\x40\x4a\x30\x25\x79\x73\x27\xff\x40\x67\xa1\x14\xc0\xe1\xc1\xd8\x2f\xd9\xd8\xac\x28\xb4\xd9\x3b\x10\x1e\x4a\x38\x2c\x3e\x29\x8c\x56\x90\x25\x59\xc2\x92\xa8\x19\x46\x9d\xe8\xaa\xc6\x04\x33\x31\x21\xcb\x34\x12\x0b\xb3\x26\x88\x92\xd1\xd0\x00\x93\x0c\xd2\xb4\x44\x22\x97\x33\x8d\x2e\x7b\xc7\x47\x13\x70\xd9\x7b\xee\x84\xad\x99\xef\xdb\xd4\x41\x41\x40\x73\xc2\xa6\x51\x92\x06\x73\x49\xad\xe1\xb1\x1f\x07\x87\x53\x78\x2d\x21\x2d\x27\xd0\x82\xe1\x4d\xc4\x19\x9c\x27\x55\xce\xc4\xdf\xb7\xb4\x05\xc7\xcb\x68\x6e\x1f\x13\xdb\xf3\x9c\xe8\x31\xa9\x05\x30\x0f\xf4\x8b\x13\xbb\xce\x93\x91\x9c\x42\xb7\x88\x57\xe7\xc9\x28\x25\xab\xa2\x84\x94\x6e\x11\xa4\xfa\x67\x5c\xc2\x21\xcd\x58\xf7\x9e\x5b\x4c\x66\xc2\x63\x66\x90\x25\x28\x07\x13\xf9\x73\x4b\xbb\xb3\xe4\xcc\x11\xbe\xa6\xd3\x48\x9b\xef\x8f\xfc\x67\x3f\x40\xa4\x7d\x9b\xcc\xb3\x63\x4d\x49\x1b\xc0\x19\x4b\x98\x37\x26\x0f\xc6\x0e\xf3\xce\x30\x13\xc3\x2a\x3c\xce\x60\xb6\x68\x1d\x67\x6f\xb2\xc5\x97\x0f\x1e\x4e\xa4\x39\x78\xba\x15\xcd\x71\x0c\xfd\xc3\x07\x4a\x96\x91\xf4\x1a\x96\x5d\x3e\xe4\x48\x40\xb4\x4a\xa8\xaa\x77\xb5\x10\x8d\xf6\x25\x1d\x42\xcb\xb4\xab\x53\xce\xca\x34\x60\x39\x8a\xed\x33\x52\x95\xa9\x6f\x1c\x9b\xf5\xcd\x69\x7e\x11\xcf\x6b\x94\x74\xf1\xfc\x11\x85\xc6\x8c\xe2\x99\x57\xee\xca\xb0\xc0\xf9\x12\x86\x33\xca\xba\x18\x3e\xa2\xee\x56\xaf\xb6\x0a\x48\x19\xc2\xe2\xd4\xf8\xce\x2c\x73\x92\x0f\x65\xf9\xfa\x15\xed\xb2\xe5\xf7\xaf\x02\xce\x5d\xb1\xfc\xfe\x15\x8d\xdf\xdc\xb2\x72\x37\x1d\x6b\xaa\x0f\x65\x78\x0e\x13\x11\x4b\x8b\xa8\x30\xc0\xf1\x5b\x59\xdf\xce\xb6\x01\x70\xb9\x76\xe8\x82\x89\xfa\x49\xc3\xb4\x79\x68\x6a\xc3\x6f\xcb\x3c\x59\xd3\x91\x13\x8d\x05\xbc\xb7\x97\xd8\xd2\xc5\xb1\x3a\xdf\x03\x2e\x7b\x64\x4d\x67\x25\xca\x16\xc1\x93\x6f\x4a\xca\x9f\x45\x2b\xae\x88\xbc\x65\xd3\x2d\x92\x82\xc3\x41\x04\x26\x8b\x32\x29\x96\xd3\x48\xfc\xc3\xa5\xb4\x50\xb6\x95\x91\x11\x96\xe4\xdc\xa6\x4a\x94\x86\xc5\xe4\x15\x1d\xfe\xbf\x44\xa9\xcf\xf9\xf2\xe5\xe1\x39\x27\x0b\x24\x59\x7a\x30\x5e\xbe\x74\x21\x54\x85\xee\xbe\xf0\x14\x2b\x38\x9a\x5c\xc3\x3b\xb1\x7e\x26\xb3\x24\xff\x98\x94\xf4\xe2\xb2\x87\x30\x83\xe5\x3c\x49\xa1\xe2\x7b\xc4\x61\x2e\x7b\x57\x5c\x05\x0e\xe5\xe6\xce\xe4\x7a\x44\x97\xe4\xc6\x69\xe9\xc7\x84\xb2\x5f\x8a\x2c\x61\xaa\x4d\x7b\x81\x68\xdd\x49\x10\xd1\xf7\x5e\x23\xb2\x5b\xbe\x3c\xe4\x04\x5a\x45\xdd\x4a\x58\x9f\x85\x1d\xc5\x6e\xe4\x57\x26\x2a\xe0\x7b\x2f\x88\x5c\x5c\xf6\x78\x03\x97\x3d\x1e\x47\x9d\xb1\xa4\x54\x7f\xfe\x7c\xfb\xfd\x1d\x83\x54\xff\x50\xab\x4f\xf9\xf3\xdc\xae\x3b\xaf\xeb\x36\xe9\xb8\xb1\xed\xd8\x61\x7a\xb3\x9c\xa4\xd7\x19\x5c\xb7\x5b\xdf\xf7\x0a\x62\x83\x15\x6a\x30\xf0\x50\x73\xf4\x38\xe9\xea\x2a\x8f\xa5\x60\x47\x79\xe4\x6c\xf3\x0c\xb7\xb4\x8b\x43\x6a\x55\xd6\xe9\x9a\x6e\xd0\xd3\xe9\xc7\xb3\x07\xab\x68\xb3\x66\xea\xf6\xff\x84\x41\x7b\xba\xa6\x7f\x81\x71\x1b\xe0\xe2\xff\x8f\xa1\xcb\x0d\x91\x8a\x7c\x47\xab\x39\x9e\xbd\xcd\xc9\xcd\x16\x06\x29\xe0\xc2\x66\xb9\x85\x5d\x82\x03\x9b\x8d\xae\xbe\xb2\xf9\x09\xf6\x91\x4d\xc8\x36\xce\x40\x03\x1e\x0b\x2d\x36\x2a\x5a\xfc\x22\x2b\xdd\xc6\x4c\x77\xd4\xc0\x76\xf6\x1a\xd4\x45\x20\x8d\xdf\x61\xad\xc7\xf3\x63\xfc\x4b\x9a\x50\xf6\xd3\xb5\xb6\xcc\xe3\xf9\x69\xc5\x1a\x65\xc7\xf8\x34\x65\xd0\x81\x71\x0b\x8e\xf1\x11\xa2\x69\x52\x66\xaa\xe4\x74\x4d\xb3\xe2\xc3\x3b\xc4\xec\x9f\x27\x88\x52\x98\x39\x25\x09\xbd\x16\x40\x5b\xf6\xe2\x2e\xf6\x5f\x92\x8a\x21\xbc\xe0\x74\x60\xbe\x7d\x74\x18\xeb\xd8\x3d\xfe\x59\x12\x38\xe7\x7c\xb4\x07\xbf\x0a\x0a\x30\x09\x16\xf2\x8c\xf2\xba\x0e\x03\x08\x6f\xd3\x50\xc0\x0b\xd2\x32\x9d\x80\xcf\x9f\x4b\x16\x9f\x95\x29\xf8\xfd\x77\x10\x61\x82\x61\x74\x7f\xef\x6c\x75\x14\x55\x9e\x8f\x4a\x71\x30\xf0\xb0\x8f\x32\x85\x71\x7c\x74\x7f\x3f\x30\x77\x75\x9a\x1e\xd4\x52\x13\xb7\xc9\x92\x71\x56\x45\xa0\x6a\x57\x3c\xdc\x0d\xd5\x09\xe7\xa8\xb1\x4f\xe1\xa9\x5e\xa4\xb1\x5b\x4e\xfd\xb6\x67\xba\xad\x3c\x37\x98\xa8\x1b\x58\x61\xa2\x4e\xfa\xbb\x83\x7f\x5b\xbe\xfa\x6f\x79\x3f\x99\x77\xd8\x04\xcc\x2b\x2c\xf2\x67\xfd\x01\xf8\x2c\xc0\x4a\xc8\xaa\x12\xab\x1f\x00\x64\x77\x38\x59\xa1\x54\x9e\xf4\x9d\x80\x8b\xab\xa1\xaa\x08\xb8\x95\x09\xd8\x0b\xd5\x4e\xc4\xb6\xb3\x5f\x73\x24\x2f\x3c\xf7\x74\xb9\x49\x3d\x4d\x80\x48\xa1\xfa\xf0\x9a\x83\x28\x32\x18\x8d\xab\xc3\x76\x6d\xe3\x94\x64\xa8\xf2\x84\x64\xbc\x5c\xdc\xcb\xf4\xeb\xfc\x6b\xc2\x36\x7e\xdb\x61\x3c\x8f\x77\xe5\xaf\x9a\xcc\xa9\x8a\x30\x6f\xea\xbe\xc6\x04\xd4\x57\x0c\x7d\xde\xd4\xfd\x95\x09\x88\x5e\xac\x4c\x65\x30\x63\x37\x31\x3d\x09\xc0\xf1\x4f\x1f\xff\xe6\x71\x28\x0a\xbf\x6d\x14\xfe\x88\xf0\xf5\xdb\x3c\x59\xd0\x46\x4d\xef\x03\xac\x58\x49\x70\xcc\x89\xf5\x3a\xab\xbf\xf5\xab\xef\xe5\x1f\xf7\xfb\x4f\xc4\xdf\x4f\x00\x58\x91\x0a\x33\xd1\xe5\xbe\x19\x36\xae\xe0\x83\x29\x60\x4b\x44\xf7\x45\xed\x3a\x29\x01\x85\xf9\xdc\x14\x8a\xd2\xf1\x18\x94\x15\x06\xd9\x37\x20\x4f\xee\x48\xc5\x24\xa1\x25\xa2\xb1\x58\xb3\x82\x29\xc0\xf0\x06\xfc\xc0\xff\xee\xdf\xc0\x19\x25\x3c\x56\x19\xd6\x6d\xc3\xb2\x1c\x18\x75\x09\xbc\xaf\x60\x59\x92\xb2\x5f\xab\x70\x05\x29\x4d\x16\x70\x02\x60\x59\x6a\xa9\x06\x92\xa7\xfb\x78\x86\x70\xd6\xe7\x78\x83\x81\xe2\x48\x10\x91\xcc\xa8\xd6\xb5\xdd\x08\x2e\x7e\x14\x35\x02\x65\x08\xa2\xd8\xbe\x9f\xef\x50\x10\xec\xc7\x49\x96\xbd\x4b\x70\x96\xc3\xb2\x6f\xd1\x55\xad\xb7\xc3\xd9\x00\x12\x25\x00\x51\x83\x98\x73\xd2\x60\x0a\x32\x38\x23\x15\x4e\x61\x9f\xeb\x3a\x0e\x9d\xa0\x96\x32\xf3\xea\xc1\x10\x7c\xb3\xb7\x37\xa8\xfb\xc7\x80\xff\x9a\xb0\x74\x09\x4b\xf1\x58\x82\x54\x19\xc1\x6f\xb2\x05\xfc\x2e\xcb\x78\xd7\xbb\xad\x0e\x0d\x08\x77\x79\x1b\x40\x44\x82\x0b\xe6\x90\x35\x81\x6a\x4b\x6b\xd3\x8d\xcf\x9f\xa3\x05\x7a\x87\x53\xde\x55\xb6\x12\x2c\x32\xbc\xfa\x67\xf8\xaf\x0a\x52\x56\xf7\xba\xac\x33\x7a\x10\xc4\xbe\xea\x2b\x3b\xca\x07\xf1\x9c\x03\xf6\x62\xf5\x48\x43\x6f\x10\x8b\xb3\x30\xdc\x83\x1b\x03\x5b\x0a\xde\xe8\x04\xf4\xa0\x71\x8c\x2b\x84\x7f\x95\x27\xe1\xbf\xd9\x33\xfe\x55\x1e\xa3\xb1\xc6\x0d\x5c\x43\xcc\x86\xa0\x42\x83\xda\x58\x79\x2f\xdc\x82\x29\xa8\x50\x0c\x73\xb8\x82\x98\xc5\xa4\x62\xb0\x14\xe4\xfa\xaa\xab\x34\xe0\x5d\x00\xf0\x1d\xe4\x73\xb0\x0f\x09\x73\xe8\xc0\xba\xb5\xf3\x24\x65\x84\x77\xb6\x14\x7d\x10\x17\x09\x9f\xc0\xfa\x83\xf8\x46\x36\x0b\x46\xe0\xd6\x43\x79\xd9\x05\xfe\x35\xd8\x8b\xf7\x5e\xfe\xf7\x7f\xff\x77\x8d\xf4\x55\x0c\x93\x74\xd9\x87\x39\x8c\xb9\xdb\x45\x78\x41\xfb\x03\x6b\x20\xa3\xec\x76\x08\x10\x83\xab\x81\xe5\xfd\x00\x70\xe1\x63\xf8\x2f\x0e\x38\x88\x53\x4a\xfb\xbd\xa5\x10\xb5\x37\x04\x77\xcf\x7b\xc5\x6d\xcf\x12\xb9\x15\x4f\x32\xd8\x97\x02\x8f\xe6\x2f\x07\x3e\xe6\xbd\xf9\xfb\xfe\x89\xfe\xad\x1d\x15\x2b\xd1\x02\x96\x30\x03\x37\x4b\x88\x01\x25\x2b\x08\x52\xe3\xea\x6e\x12\xcc\x28\x60\x04\x98\x73\xf9\xe3\x7a\x58\x0a\x58\x71\x80\xa5\x36\xd7\xaf\x28\x23\x25\x8c\x69\x35\xa3\x69\x89\x66\xb0\x6f\x54\xb1\xaa\x98\x48\x1c\xd7\x9a\x40\x73\x60\x4a\x63\xa6\x2f\x06\x46\xf5\x5d\x8c\x81\x11\x40\x0c\x7b\xe5\x33\x4c\x3d\x1f\x97\xc7\x47\x35\x89\x22\xb9\xcb\x49\x92\x19\x59\x61\x4e\x61\x5b\x23\x15\xde\xd4\x8c\x05\xf1\x25\x0d\x19\x75\xb5\x34\x63\xea\x1f\xda\x40\x06\x37\x35\x61\x41\xb4\x37\x72\xef\x7a\x1d\xc8\x94\x6f\x7d\xab\x2f\x5a\xbc\x2d\xc9\xea\x35\xc1\x73\xb4\xe8\x6b\x50\xce\x11\x67\x84\xcc\x95\x73\xe1\xf1\x2d\x8c\xff\xc5\x23\xc3\xba\x9b\x06\xe0\xa9\xd4\x78\x06\xe7\x08\xc3\x2c\xf2\xa6\xb6\x46\x7c\xa4\xe6\xd2\x16\x72\x5a\x27\x14\x32\x75\xbf\xa1\xb6\xb1\xc1\xe7\xd6\xf9\xa1\x3f\xd8\xbf\x1f\x82\x97\x7b\x66\x66\xb8\xdf\x42\x06\x79\x59\x61\x5b\x01\x64\x74\x15\xe4\x5e\x12\xda\xbe\x61\xb9\x3f\xbc\xa9\x61\x3d\x89\x56\x8c\xc8\x2d\x6b\x79\x9e\x57\x35\x23\xad\xc6\x41\xd0\xa1\x6d\xed\x48\x4d\xf4\xc1\x27\xa4\xd7\x04\x63\x98\x32\x3d\x2f\x35\x42\x21\x63\x58\x4d\x3a\xf7\x3b\x68\x35\x47\xf8\xfa\x37\x71\x3b\xec\x37\x0e\xb3\xa5\x94\x1c\xeb\x47\x8e\x24\xb7\x18\x02\x4a\xf6\xe8\x6e\xcf\x90\xee\xc0\xdf\xe4\x4b\x43\xbf\x2d\x51\xd6\xc5\xd5\x57\xfd\x5e\xec\x3d\x4e\x24\xe6\xd0\x15\x59\x1b\x8d\xa8\x66\x77\x54\x2f\xe7\x52\x28\xd8\x33\x29\xce\x4a\xaf\xd7\xe8\x86\xc0\xdd\xce\x7e\xc0\xd3\xeb\x18\x77\x06\xe7\xa4\x84\x47\x90\xb2\x92\xdc\x85\x22\x5d\xcb\x81\xa7\x64\xb5\x42\xac\xdf\xe3\xee\xfd\x17\x4c\xc5\x3d\x33\x98\xf5\xec\x10\xce\x83\x84\xd9\xa2\x0d\xb2\xc2\x37\x3c\xb2\xe9\x5b\xbc\x88\x82\x89\x7c\xb4\xca\x5f\x05\x69\xc6\x40\x7f\x9d\xe4\xae\x72\xd6\x49\x2e\xbc\x9e\x38\x0d\xe4\x28\xc4\x19\x89\xf5\xd5\x6b\x71\x23\xcd\x52\x8a\x3b\x28\x9c\x88\xac\x48\x2a\x0a\x7f\x44\xb2\x0f\x9d\xb0\x20\xd3\x31\x33\x5f\x2a\xda\x41\x88\xd3\x28\xaf\xe4\x51\x1a\x6b\xa9\xe7\x4c\x89\xfa\x78\x01\xd9\x3b\x52\x95\xb4\x3f\x00\xcf\x41\x34\x89\xc0\x73\x55\x7a\x82\x70\xc5\x60\xb3\xfc\x0c\xa6\x04\x67\xb4\xb5\x69\x27\xa3\xa6\x70\x78\x59\xc3\x1a\x86\xae\xbe\x9d\x45\xa5\xb1\x87\x86\xd6\x9f\xb6\x35\xd6\xda\x01\xfe\x92\x15\x70\xfb\x6d\xed\x84\xa6\x8e\x5b\x1b\x6c\x51\x40\xa0\x3d\xd0\x03\x09\x03\x3d\xa9\x43\x46\x7e\x24\x69\x92\xc3\x33\x56\x22\xbc\x68\x55\x8b\x59\xf0\x86\x75\xd1\x62\x63\xf5\x98\xd7\xa4\x78\x00\x55\x89\xb5\x80\x32\x70\xf5\x76\x51\x60\xd0\x99\x3c\x87\x13\x3e\xf1\x05\x73\xac\x90\xf6\x1d\x1e\xeb\x4c\xcf\x6e\xc4\x28\x2c\xd7\x28\x95\x31\x43\x4f\x93\xe8\xb9\xb4\xad\x14\xcf\x6e\xc4\x2d\xc4\x20\x45\xbe\x3c\x7a\x10\x45\x8e\xd8\x4a\x51\x67\x1b\x83\x94\x6b\xbb\xb5\x30\x06\xba\x41\x5c\xe5\xf9\x7e\x80\x07\x78\xcb\xca\x24\x65\x9a\x72\xdf\x27\x60\x12\x8c\x75\xa2\xe1\xa2\x77\x84\x4a\xe9\xf3\x86\xa0\xf7\xe1\xec\x24\x96\x87\x50\xf4\xaf\x8f\x28\xd1\x7f\x5a\xc7\x27\x7a\x57\x83\x56\xdd\xef\x26\x97\x38\x9b\xf6\x25\x72\x39\x89\x53\x5b\x2e\x3f\x67\xce\xc5\xa8\xff\xd2\x3b\x82\xfc\xef\xd3\x35\x8d\xeb\x1a\xfe\x2b\x84\x2b\x12\xf1\xb1\xff\x3b\x04\xe9\x64\x6f\x79\x81\x3e\xd3\xc0\xff\x36\x27\x3a\xf8\x0f\x79\xe0\xa8\x4b\x9b\x75\xb2\xb2\x55\x9f\xbe\x36\xec\x34\x76\x43\x53\x88\xaa\x23\xd5\xdf\xe5\x39\xb9\x81\x59\x7f\x50\x47\xdd\x4a\xe5\xd1\x0f\xb1\x68\x55\xdd\x41\xef\x71\xbc\xf3\xe3\x23\xce\x2f\xf7\xe9\xad\xca\x8f\xcf\x8f\x8f\xb8\xe7\xef\x0d\xe2\x33\x52\xb2\xfe\x20\xf2\xfa\xb2\xee\xde\x80\xa0\x52\x15\xdb\x1b\x8d\x91\xf2\xf7\xdf\x41\xa3\xb2\xe6\x49\x92\xdd\x68\x61\x1d\xb8\xad\x03\xf8\xac\x4c\xb7\x1f\xbb\xad\xec\x3a\xe3\x32\xfe\x70\x76\xb2\x19\x42\x0d\xd1\x6d\x85\x6a\xc3\x6f\x15\xec\x23\xda\xc1\x29\x3d\xaa\x60\x1f\x51\xf2\x70\xa9\x3e\xa2\xa4\x16\xc9\x97\xe9\x88\xb2\xff\x90\x4c\x96\xdb\x7c\xb8\x6c\x16\x91\xd6\x11\xf4\xfe\x15\x7d\xf4\xe1\xf3\xfe\x15\xdd\x0c\x21\xfd\xd9\xc3\xc6\x98\x41\x6f\xf7\x80\xca\x79\x3e\xba\x6c\x9a\xf0\xc3\x18\xd7\xd8\xad\x7c\xbb\x67\x4e\x1e\x9d\x7b\x97\xfc\x46\x19\x30\x29\x57\x49\x8e\xfe\xad\xa6\xa9\xf6\x29\xd4\x27\xdc\x35\xcf\xff\x11\x72\x3d\xba\x3c\x9b\xe4\xf0\x67\xf0\x47\x97\xc8\x6f\xe0\x11\x65\x6b\x90\x6e\x95\xd2\x9c\xf3\x79\x74\xf1\x4e\xd7\x9b\x5c\x44\x1d\x5f\x3d\xa2\xe8\x16\xd1\x2e\xa1\xff\xf0\xde\xdd\x4e\xfc\x3f\xd0\x06\x82\xe4\x5b\x55\x62\x1d\xa8\x79\x74\x55\xc8\x43\x41\x5b\xc0\x3c\xbe\x35\x38\x64\xbb\x85\xff\xc3\x2d\x62\x7b\x35\xfc\x81\x56\xd1\xd2\x80\xa7\x1a\xf7\x0e\x67\xd7\x1a\x37\x29\x8a\x18\xe2\x39\x29\x53\xd8\x8f\xd4\x5d\xcb\x68\x08\xa2\x12\x26\x59\xd4\x24\xeb\x5c\xde\x7c\x08\xdd\x1b\x4e\x20\x40\xd8\xb9\x73\xb9\x35\x61\x79\x9d\xb2\x10\x58\x2d\xd4\xd5\x46\x3a\x64\x4b\x92\x51\x93\xf9\x20\xf8\x27\x42\xd9\x31\x46\xe1\xe8\xd1\xca\xe2\xbb\xdb\xa6\xd6\x1e\xf6\x10\xbc\xb0\xd2\xf6\x26\x0f\x72\x76\xf6\xee\x0d\x16\xcf\x32\x6e\x92\x62\x01\x99\xdc\xb9\xf8\x98\xe4\x15\xec\xf7\x28\x5d\xfe\x06\x25\x6a\xaf\x41\xf6\xfd\xab\xb3\x07\x92\xbd\x7e\x45\x6b\xb2\xdc\x7c\xfb\x7d\xeb\x74\x59\x54\x94\x64\x06\x69\x74\xc5\x6b\x2e\xae\x06\x31\xc2\x19\xbc\x3d\x9d\xf7\xa3\xeb\x57\x34\x1a\x80\xc3\x29\x68\xca\x78\x4c\x19\x22\x0f\x64\x07\x71\xdc\x9a\x21\x87\xb2\x73\x3b\xcb\x22\x6c\xed\x53\x86\x4f\x36\xc8\x72\x71\xc7\x0b\x4c\xc1\xe7\x7b\x53\x2c\x76\xa7\xe2\xf3\x7a\x17\x8f\x50\x16\x99\x05\xb4\xdd\x5b\xfd\x81\x9d\x36\x14\xa4\xe2\x0f\x89\xc8\x8d\xda\x7b\xa4\x91\x38\x82\x15\x4d\x40\x84\x70\x86\xd2\x84\x91\x12\x84\xae\x93\x63\x78\x33\xba\x41\x38\x23\x37\xa0\x4c\x6e\x46\xd2\x44\x47\x9c\x6c\x34\xb4\xc9\x11\xfc\x3a\x47\xe9\x75\x14\x54\xa3\xfc\x4f\x92\x89\x49\x01\x71\x3f\x27\xa9\xda\x26\x2b\x09\x23\x29\xc9\xc1\x73\xd0\x1b\x8f\x7b\xe0\x39\x30\x55\x5c\x46\x51\x9c\xc1\x0c\x8e\x19\x2c\x57\x08\x27\xf9\xb8\xf7\x7c\x25\x04\x7a\x0e\x7a\xff\x90\x67\xac\x4c\x49\xef\x59\xba\xca\xa6\x94\x2e\x45\x62\x52\x16\x0e\x41\xef\xb7\x59\x9e\xe0\xeb\xde\x20\x9e\x93\xb4\x72\xd2\xbc\xe6\xac\x8a\x91\xe2\x84\x54\x14\x9e\xae\x61\xe9\x48\xf2\x39\x0c\x56\x31\x0f\xca\x00\xdd\xd7\x29\x50\xd7\x94\x44\x87\xb8\x76\xa8\xf2\xf7\x41\xcd\xc9\x07\xc7\xec\x21\xcc\xd0\x0a\x1e\xd7\x7b\x97\x56\x19\x98\x06\x32\x18\xf2\x7c\xc5\x99\xda\x37\xb0\xda\xc8\xfc\x23\x30\xcd\x9d\x09\x8d\xd5\x1b\x82\x6c\xe0\x93\x15\x19\x86\x26\x59\xd8\x4d\x16\x5a\x58\xbd\x21\x80\x1e\x59\xf9\x5e\x57\x50\x13\xf6\x66\x95\x04\xeb\x07\x90\x4f\xab\xb0\x23\xf4\xb1\x4f\x2b\x16\x42\x7f\xdb\xe2\x47\x7d\xf4\xb7\xa8\x81\x2e\x1f\x01\xd9\x88\x2d\xc1\x7c\x64\xfd\x30\xc5\x46\x74\x0d\xe8\x13\x08\xbc\xd4\x69\xef\xf4\x6c\xb5\xa5\xea\x9c\x62\xdb\x6f\x87\x77\x77\xc2\x7c\x0e\xdc\xd7\x0a\xb7\x60\xa2\xb1\x31\xed\x1f\x9a\x73\x58\x69\xd9\x7c\x76\x79\x81\x38\xa3\xbf\x22\xb6\xb4\x5b\xa7\xac\x1c\x02\x5a\xcd\xe7\xe8\xd6\x72\x4c\x6a\x54\x52\x56\x9a\x09\x43\xc2\x0c\x45\x59\x0e\xf1\x82\x2d\xc1\x48\x21\xaa\xdf\x72\xf3\x72\xf4\xc2\xed\x82\x24\xcb\xf4\x01\x40\xd3\x89\xea\xc1\x82\x21\x10\xfb\xa6\x43\xa0\xee\xb1\x5b\xe3\x5b\x02\xc4\x49\x51\x40\x9c\xf5\xbf\xea\x47\x07\xf2\xdb\x20\xe3\xc3\x68\x10\xaf\x93\xbc\x2f\x30\x07\x71\xc2\x58\xd9\xef\x29\xfc\x5e\x4d\xc9\xb3\x03\x55\xfc\xfe\x15\xe5\x73\x85\x3d\xf7\x30\xfe\x7b\xe0\x6d\x0b\x29\x70\x30\x05\xd1\x0f\xe6\x51\xcf\xde\x49\x82\x93\x05\x2c\x7b\x43\xc0\x95\x88\xb0\x98\x7b\x7b\x43\x20\xe7\xbc\xde\x60\x10\x59\x3b\x78\x7a\xeb\x97\x6a\x65\x3d\xe5\x33\xad\xe3\xfa\xe7\xa4\x04\x7d\xde\x1c\x02\x48\x3e\x18\x4d\xfd\xb9\x41\x14\x5e\xa0\x2b\xce\x89\xcc\xe2\xea\x82\xe7\xbc\xc0\x76\xd8\xd6\xdf\x9a\xfd\xe7\x53\x10\x49\xd6\xb9\xd4\x35\xdf\x86\x50\xfc\x89\xf0\x9f\x43\x10\x89\xbd\xbf\x41\x9d\xfa\xb5\x09\x2a\x63\x50\x54\xc3\x9d\xeb\x26\xb1\x36\xf6\xaf\xb0\x59\x83\x5c\xc3\xf3\xa8\x04\x70\xf6\x3c\xc4\x16\x93\x0a\xf4\xa7\xdf\xb4\xa7\x56\xb7\xe1\xf7\xaf\x68\x13\x41\xee\xcd\x3a\xf6\xa2\xac\xa4\x8d\x0d\x11\x2f\x3d\x8a\xf8\xc2\x92\x76\x50\x80\x68\xf9\x8b\x54\x20\x28\x7c\x81\x12\x3a\xcf\xec\x04\xfd\x76\x5b\x88\x97\x12\x4c\x19\x98\x6b\xdf\xfb\x55\x3f\xfa\xaf\x8e\x07\x58\xcd\x4c\x2f\xd1\xcc\x41\x1d\x1f\xd3\x7b\xda\xb5\xde\x64\x97\x0d\xc5\xe9\x12\xe5\x59\x09\x71\xdf\x3f\x4b\x01\x6a\x9a\x61\xa0\x27\xee\x40\x27\xf3\xfe\x19\x23\x65\xb2\x68\x1e\xe2\xe0\x01\x29\x0f\xdf\x72\x05\x10\x17\x25\x9c\xc3\x12\xe2\xb4\xe9\x7a\x8c\x84\x60\x0a\xfe\xe7\xd9\xe9\x87\xb8\x48\x4a\x0a\xfb\xad\xe8\xb1\x41\xd8\x77\x7c\x8f\x29\x76\x5d\x8a\x3a\x3a\x68\x6a\xed\x53\x83\x43\x30\xf7\xfd\x8f\x38\xf0\x51\x1b\xaa\xd4\xd9\x10\xcc\x63\x2c\x42\xc8\x79\x0c\x6f\xc5\x2b\x11\x88\x60\x27\x7c\x6c\x60\x1a\x5d\x6e\x81\x7c\x3f\x68\x7a\xa1\x7b\x7b\x21\x60\xeb\x28\xb4\x06\xd1\x9d\x5f\xeb\xa6\x3e\x96\xd8\xaa\x9b\x0e\xcd\x5c\xc3\xbb\xa1\xfc\x24\x8c\xab\x9f\x16\xed\x58\xe0\xfb\xed\xd0\x96\x46\x82\x08\xf6\xe9\x49\x8b\x77\x41\xc5\x5e\x2f\xba\x0b\x1b\xb7\x11\xee\xdf\x34\x57\xf2\xa6\xc9\xb0\x63\x46\xe3\xb1\x74\x63\x4a\x1b\x3c\x69\xa7\x2d\xdd\x82\x69\x20\xc9\xf3\x68\xc8\x17\x99\xfb\xdb\xe3\xa8\x33\x0b\x1c\x2f\x4a\xf3\x8a\x32\x58\x46\xa2\x18\xb3\x04\x61\xf9\x83\x9b\x0b\x2d\x92\x54\x70\xcf\x03\x70\xfe\x6f\x41\xb2\xe8\xca\x52\x57\x4b\x43\x96\x96\xdd\xb6\xec\x06\x34\xad\xad\xb9\xce\x60\x91\x93\xbb\x15\xc4\xcc\x67\xdc\xa9\x89\x3e\x91\x59\xa7\x00\x22\x11\x53\xe4\x28\x4d\xa8\x4c\x70\xa8\x5f\xdc\xea\x94\x4b\xce\x25\x5d\x71\x3e\x61\x5e\xe5\x1c\x6e\x47\xb1\x3d\x66\x83\x1c\x3e\x90\x8b\xad\x15\x86\x21\xbb\x21\xe5\xf5\x0e\xdd\x2c\x11\x0a\x92\xa3\xf4\xee\x81\xfd\x6d\x37\xda\x4a\x6f\x6b\x11\xd4\x51\x96\x4e\x11\x20\xce\x0a\x82\x30\xa3\xfc\x07\xc2\x0b\xee\xdd\xb6\x13\xcd\x6a\x60\x47\x29\x6d\xbe\xda\xda\xb7\x49\x6f\x2f\xb0\x9c\x6d\xb6\xef\xb3\x02\x96\x14\x51\x06\x31\x5b\x93\xbc\x5a\x05\xcb\xd2\x3c\x41\x2b\x5b\x68\xd9\x88\xcc\xba\xec\x2a\xb9\xcd\xa0\x33\x9e\x1f\x83\x91\x1d\x5c\x18\x9f\x7a\x02\x6a\x9a\xa3\xc5\x2a\x29\x36\xe8\x4c\xf7\x7d\x5a\xee\x3e\xb2\xed\x96\xed\xe6\x1a\xd4\x42\x33\x88\x9d\xe4\xeb\x9a\x43\xea\x10\xf3\x0b\x86\xb3\x12\x73\x8d\x4a\x56\x25\x79\x6d\xb2\xd1\x22\x61\xf0\x26\xb9\xeb\x90\xdc\x6a\xbf\x6d\x70\xef\x40\xdd\x89\x23\xd4\x8a\xfa\x37\x13\x73\x76\x06\x13\x2e\xb4\x1b\x51\xb8\x75\x0d\x65\x3a\x29\x04\x30\xad\x03\x98\x0b\x17\xf1\xca\x8d\xe1\x9a\xb8\x83\xd0\x11\x5c\x30\x0d\xb4\xd2\x29\xb0\x1d\x2d\x6f\x25\xb3\x41\x08\x8b\x6d\x9d\xba\x0f\x4b\x6e\x27\x33\x9a\xc2\x1b\xf4\x0e\xf9\x0d\x05\x4f\x05\x36\xe5\x20\x7c\xf8\xd0\x25\xc1\xee\xd7\x2c\xec\x54\xdd\x10\xc8\xf3\xc4\x6f\xbd\xce\xe4\x1a\x14\x47\x81\x01\x8c\x59\x52\x2e\x20\x8b\x45\xd0\xb6\x6f\xd5\x73\x8a\x22\xe5\x68\x40\x16\x90\x7d\xc7\x58\x89\x66\x15\x83\xfd\x48\x2f\x42\x6a\x0c\x52\x30\x1e\xc7\x66\x24\xad\xc4\xcd\xa3\x05\x64\x6f\xe4\xc5\xa2\xef\xef\x8e\xb3\xbe\x24\x38\x90\x4b\x90\x0f\x24\xab\xe3\x7c\x2b\x7d\x30\x05\x7b\xfb\x00\x81\x03\x41\x4c\x25\x1c\xf6\x01\x7a\xfe\xdc\xee\x0f\xae\x51\x5e\x7f\x81\xae\x24\xdf\x22\x65\xee\x1c\x35\x55\xdd\x66\x64\x37\xf0\xae\x10\x6a\x35\x16\x0d\x82\x81\xba\xab\xe6\xd0\xf7\x7c\xc2\x79\xd1\xc6\xba\xd0\x32\x23\xbf\xbb\x78\x27\x19\x1a\x8d\xe5\x75\xf0\xa0\x3a\x98\xea\xc5\xf4\x7e\x17\x98\x7f\x9e\xbd\x91\xe0\x6d\xf9\x1c\xca\x9f\x2c\x93\x6d\xf6\x61\xb1\x3a\x33\x82\x0d\xb9\x5a\xce\xb0\xb7\x27\x5e\xbd\xf3\xe7\xf5\x39\xeb\xd0\xe9\xf3\x8e\xda\xfa\xe8\xf4\x9e\x03\xe3\x25\xc8\x03\x28\xbd\x61\x2b\x35\x77\x1b\x40\x5f\x66\x6c\x3d\xdf\x3d\x0c\xa5\x73\x37\x2a\xa8\xfb\x60\xa7\xf3\xd9\xb9\xfa\x26\x73\xe7\xe5\x81\x5a\x17\x32\xff\x02\x99\xbe\x2e\xfb\xdd\x8c\x7a\x27\xeb\x83\x57\x0a\xb6\x23\xa6\x6e\x4f\xfb\xe7\xd1\xff\xa2\x8a\x6f\x6a\xc1\x53\xbc\x35\xd4\x98\x34\xb7\xe6\xa5\x89\xba\x5b\x2c\xb3\x1d\x34\xe0\x9b\x20\x6e\x9a\xc7\x17\xc3\x4f\xde\xb0\x5c\xab\xdb\x86\x8a\x69\x91\x73\x55\x4e\xec\xcb\x91\x4c\x54\xe8\x2b\x19\x2c\xbf\xd8\x73\x82\x4e\xd1\x5c\xae\x73\xc7\x87\xe0\xc5\xc0\x60\xe8\xeb\x1a\x2c\xbf\x78\xd1\x89\xf3\xb2\xc6\xd1\x57\x39\x58\x7e\xf1\x32\x10\x0c\xe9\xb3\x0a\x1c\xda\xbb\xc4\x11\xe8\x06\x73\xfb\xbe\x25\xb9\x57\xca\xfa\x33\x56\xfa\xda\x50\x98\xf6\xf4\xc7\xe7\xca\x1a\x21\x5e\x89\x2b\x3b\xe3\xfe\x65\xf6\x7c\x70\x49\xbf\xce\xc6\xce\x5c\xb9\xec\x04\x5e\xba\xc0\xab\x4e\xe0\x95\x0b\x4c\x3b\x81\xa9\x0b\x2c\x9e\x71\x53\xae\x6d\xcf\x89\x87\x06\x56\xdd\xf3\x29\x10\xb9\xbb\x63\xcc\xfa\x19\xef\x2a\xf0\x35\x78\xf5\xed\xdf\xf6\x1c\x8c\x65\x1b\xc6\x52\x61\x7c\xf3\xad\x8b\xb0\x6a\x43\x58\x29\x84\x6f\x1d\x70\xda\x06\x4e\xa5\xf1\x28\x63\xb4\x04\xaa\xff\xfe\x5a\x9c\x80\xb0\x05\x57\x47\x56\xce\xfd\x61\xd6\xbc\xf9\xc3\xa1\x13\x39\x5c\x6d\x48\x9b\xc0\xa8\x6e\x6a\xe0\x1d\x9a\x51\x98\x6d\xb6\x18\x98\xb1\x77\xca\x34\x37\x6f\x17\xf9\xa1\xde\x63\xae\x0f\x36\xad\x10\xbe\x3c\xa7\xd9\xf0\xff\xbb\x2c\x34\x1a\x19\xd6\x36\xed\x80\xdf\x7f\x57\x7b\x8d\x6a\x1b\xb1\x1f\x00\x1a\x82\x68\x10\x0d\x1a\x49\x6d\x67\x43\xd5\xc5\xa8\x39\xd9\x94\xf1\x57\x2f\x08\xc8\x8d\xc0\xde\x40\x5d\x6f\x0d\x5f\x18\xb5\x1c\x76\x1d\xeb\x06\xc2\x3d\x3f\xe1\xed\x71\x0a\x6f\x99\x93\x99\x0e\x64\x67\x41\x7d\xd8\xf8\xbc\xa1\x7e\x25\xa1\x0b\xda\x32\xc3\x4a\x2c\x7f\x72\x75\xe6\x44\xf0\x28\x33\xab\x1f\xa4\x07\xbe\xef\xb6\xdd\x70\x0a\x58\x9e\xc2\x57\x47\x33\x8e\x8f\xc4\xaa\x2c\x70\x65\xda\x4e\xbc\xdb\xdd\x4e\xd4\xf7\xe1\xe4\xb3\x04\x51\x0e\xe7\x22\x23\xb9\x17\xf9\xf9\x81\xd6\xef\xc1\x4d\x01\x2b\xeb\x35\xd9\xbd\xfd\x2c\x87\x39\x8f\x16\xf8\x5c\xdd\x86\x68\xae\x45\x3c\x5b\x8e\xc0\x99\x94\x36\xac\x70\x3f\x04\xbe\x93\x17\xe4\xea\xab\x7e\x4f\x7c\x44\xb1\x37\x88\x67\x79\x65\x05\xf5\xdb\x68\x72\xf4\xf7\xbf\x7d\x53\xdc\x46\x6e\xa0\xd6\xa1\x4c\xf1\x82\x8d\xab\x3e\xb3\xb2\x38\xab\x66\xe2\x12\xeb\xa4\xb1\x6e\xe1\x8b\x8d\x8d\x86\x23\xd6\xae\x66\x70\xc8\xa1\xa1\xd9\x97\xcb\x30\x9b\x9a\xd1\x73\xcc\x96\x10\xd7\xa6\x24\x5e\xf5\x76\x46\xb1\x38\x48\x39\x27\xe5\x1b\xb1\x9f\xa3\xe1\xe8\xc2\x1f\xeb\xe3\xb1\xf5\x8e\x84\x71\x00\x7c\x55\x2d\x36\xe4\xe9\x22\x16\xeb\x6d\x1f\x4d\x19\xa0\x7f\x82\x47\x2b\xa5\x37\x34\x98\x7c\xe5\x6c\xf5\xb6\xee\x73\x9f\x09\x98\x2d\xba\x98\x78\xc3\xab\x1f\xc4\x84\xc0\xdc\x86\x09\x19\xd4\x1c\x41\x1e\xbe\x5e\x5c\xed\x3f\x69\x63\xc6\x6a\x52\x5e\x98\x34\x0d\x66\xc7\x47\x01\x1e\x85\xef\x27\x15\xce\x5c\x43\xf2\x68\x73\xa8\x4f\xdd\x1a\xb7\xf2\x41\xed\xed\x8b\x73\x12\xdc\xcd\x6b\xf5\x7f\x12\x92\x07\x88\x01\xc3\x95\xed\x2b\xec\xff\x66\x25\x4c\xae\x9b\x15\xf7\x4f\xba\x7f\x37\xe4\x69\xe9\xbc\x5d\xe5\x91\x3d\xf9\xe7\xcb\x23\x62\x01\x41\x3b\xd4\xac\x30\x99\xb8\xa8\xe8\x72\x0b\x51\x06\x7e\xeb\xf7\x5d\x16\x59\x1b\x9d\x68\x64\x3b\xf3\xb7\x9e\x1c\xe1\xd3\x28\x47\x6c\x36\x6c\x37\x7b\x1f\xd8\x6f\x6d\x78\x39\x2b\x7f\xd2\x3d\x49\x84\xe3\x22\x93\xa9\x09\x87\x46\xf0\xb6\x68\x04\x46\x8d\xdc\x65\xcb\xf2\x53\x2f\xf1\x9f\x4e\x1b\x67\x8b\x14\x59\xfe\x4f\x5c\x42\xf1\xad\xe2\xfe\x78\x31\x46\x43\x10\x2d\xe2\x84\xf5\xcd\x8d\xd0\x10\xbd\xe7\x82\x53\x3b\x44\x74\x58\xc6\xf0\xc6\xd2\x89\x6a\x85\x23\xc5\x67\xd5\x4c\x3e\x2f\x66\x1f\x24\x72\xcf\xa7\xe9\x39\xa3\xef\x52\x69\x4f\x6c\x88\x59\x22\xa3\xe6\xed\x8d\x56\x1b\x8b\x69\x8e\x52\xe7\xa1\x04\xf7\x80\x15\xca\xbc\x81\x18\x0a\xc6\x5c\x13\x42\x99\x67\xb9\xe1\x2c\xa7\x37\xcf\xcb\x57\x51\x5a\x8e\x4e\xb7\x85\x14\x1a\xe9\x61\xa1\x45\x13\xdb\xcf\xed\xb4\xc4\x06\x49\x96\xbd\xce\x13\x1e\x20\xf8\x95\xea\x6b\x21\xb0\x71\x4d\xc0\x6b\xfa\xb5\xf5\x70\x61\x53\xdc\xf1\x18\xdc\x24\x88\x81\x97\x80\xc2\xb4\x23\x60\x6c\x08\xf0\xf0\xc0\x51\x9e\xd0\xd9\x56\x2a\x11\x22\xbe\x6c\x9e\xf4\xd7\x8f\xcd\xb4\x67\x40\xcd\x8b\x8d\x9e\xdb\xb5\xcf\xa5\x9a\x27\x6b\x5c\x8c\x86\x46\x9d\xef\xbf\x58\x4d\x62\x71\xcd\x3e\x74\xe2\xd5\xff\x66\x8c\x80\x0c\x91\xf5\x3e\xbe\xe9\x9c\x13\x93\x35\x5d\x0d\xf8\x9f\xee\x34\x38\x6e\x53\xde\x05\x17\xfb\x6c\xbf\xba\x21\x63\xc7\x82\xb2\xec\x35\x29\xee\xdc\x43\x4e\xe2\x4f\x2a\x1e\xcb\x40\xf3\x3b\x8d\xea\x24\xf1\x6a\xd4\x58\xbc\xd0\x0c\x9e\x3d\xb3\xc8\x89\x8b\x33\xbc\xa8\xef\x97\x8d\x80\x8f\x39\x00\x87\xae\xd3\x9c\x15\xdc\xc9\x9c\x24\x6c\x19\xcf\x73\x42\xca\xfe\x8b\xbd\xbd\x3d\xf0\x35\x78\x05\xbe\x06\x7d\x9b\xa0\x7a\x0f\x9a\xaf\x87\xf7\x06\xe0\xb9\xd3\xd8\xb9\x5d\x37\x00\xe3\xad\x38\xb1\x1c\x4c\x5d\x77\x11\x7d\x9f\xe0\x4c\x3c\xb2\x16\x5d\x81\x29\x98\xe9\x5f\xe7\x44\xbd\x27\x32\x2b\x68\x33\x95\x77\x21\x5f\xae\xee\x0d\x81\x78\x49\xa1\x77\xd5\x8c\x84\xaf\xfd\x5d\x21\xab\xd1\xeb\x2b\x71\x7b\x42\x9c\x67\x03\x6e\xb9\x78\xc3\x03\x57\xab\x19\x2c\x7b\xae\x23\xf5\xe0\xea\x74\x8f\x53\x31\x30\xef\xa1\xa8\x2c\x9b\xf3\x26\x8a\xe5\x5b\xfd\x6c\x50\x4d\xc5\x9b\xa1\xdd\xe7\x25\x5c\xa3\x93\xef\x4a\x00\x78\x9b\xe6\x55\xe6\xed\xc8\xac\xc4\x6d\xb0\x0d\xa6\x27\x3f\x17\x34\x68\xec\xb6\xcd\x11\xcc\x33\x40\xe6\x4d\xd2\x92\x78\x91\xb0\xa5\x58\xfa\xc3\x3c\x53\x99\xdf\x28\x8e\xfc\xc7\x7d\x4a\x42\x18\x98\x4a\x4e\x86\xa0\x28\xe1\x5a\xfe\xff\x3d\xbc\x0b\xce\x5f\x66\x87\x8f\x93\x6f\xdb\xe1\x93\xa4\xaf\x21\x1f\x56\x1c\xee\x02\x5d\xed\x7b\x19\x11\x24\xba\xd1\x22\x02\x46\xe0\x85\x1f\x5d\x65\xe2\x4d\x49\xc1\xe3\xc5\x35\xbc\xf3\x17\x04\xe3\x31\x90\x0f\x5e\xf3\x18\x89\xdd\x39\x75\xbc\x8d\x53\x51\x19\x5f\xc3\x3b\xda\xe7\x34\x06\xba\xa9\xa9\x8c\x53\x14\x79\x2e\xee\x85\x92\xf9\xca\x8d\xd1\x1a\xd1\xaa\x1d\xb4\x71\x14\x30\x15\xdc\xed\x7b\xc5\xef\x85\xe8\xd7\x5c\x87\x56\x8d\xd2\xb5\x25\x8e\xcb\xef\x53\xc1\xa4\xdf\xe8\xbd\x37\x81\x6a\x63\xe4\x3d\x66\xdb\x21\xff\xff\xfd\xfe\x93\x27\x5c\xf5\xe2\xf3\x62\xbc\xf3\xb5\x21\x92\x1b\x0c\x4b\x79\x02\x57\x2a\x59\x2e\xb7\xf9\x94\x21\xaa\x62\x94\xed\xeb\x52\x51\xa0\x2b\x4c\xe9\x0a\xf2\x01\xa7\xaf\x3d\xa9\x42\xf9\x48\xa4\x75\xb1\x45\x4e\x2f\xea\x94\xaa\x0b\xcb\xd4\xc3\x65\xe2\x6d\x32\xce\xa8\x60\x52\x5e\x30\x52\x75\x62\x0f\x85\x42\xf6\x93\x20\x6b\x8d\x23\xd9\x8e\xf3\x52\x97\x69\x5a\xfe\xb1\x6f\xae\xe0\x25\x59\x76\x22\x78\x6d\x99\xbe\x6c\x69\x2e\xb0\xfc\xbe\x9b\x70\x16\xea\xf9\x1e\x49\x25\x83\x79\x27\x15\x65\x3b\x41\x62\xfb\x5e\x6f\x88\xaf\x0f\x4f\xed\x67\x31\x87\x60\x49\x28\x1b\x9a\x8b\x68\x7e\x9f\x58\xbd\x21\x6e\x59\x4d\x05\xbc\xd5\x17\xea\x22\xe9\xd4\x50\xe0\x8e\xde\x52\xb6\x58\xca\xbb\xfa\x5f\x28\x9b\x90\x5d\x65\x03\xbe\xfc\xc9\xed\x46\xce\xb7\xb8\x0d\xda\xe8\x1b\xfb\xc3\x75\xde\xdd\x05\xad\x18\xfb\xba\xa9\x6c\x52\xdf\x82\x93\x1f\x6c\x53\xd6\x35\x95\x61\xb4\x98\x23\x9f\x8a\x26\x7e\xff\x1d\x98\x67\x1d\x2d\x78\x41\xbb\xee\x17\xff\xfd\x99\x40\x58\x24\x52\xfe\xb2\x56\x1c\xd7\x01\x53\x71\xda\x50\x9f\xc5\x59\x43\xb6\xe4\xff\x9a\x2f\xf4\x88\x03\x3a\x10\xc3\xb5\xac\xce\x13\xcc\xff\x9d\x11\x9c\x29\xb0\x82\x94\xcc\xb9\x4d\xe7\xfe\x17\x89\xef\x3c\xe0\x24\xe7\xe0\xac\x92\xd8\x86\xf2\xfa\x56\x11\x5c\xc8\x8b\xa9\x8b\x12\x32\x79\x3a\x2a\x2b\xb2\x6b\x41\x5a\x39\x02\xbd\xe7\x60\xb1\x6e\x2e\xbd\x38\xdd\x2e\xee\x19\xca\x2b\x93\xbe\xa9\xf1\xf5\x79\xb7\xa9\x0d\x01\x15\xaf\xb7\x0c\x81\x3c\x17\xb2\xa3\xe9\x49\x64\x1e\x14\x9b\x37\x60\xe4\xe8\x16\xc4\xf8\xf8\x16\x7f\x6c\x63\xaa\x7c\xac\x0b\x22\xd2\x5a\x2f\xe4\x30\xd4\x89\x39\x75\x6a\xa5\x59\x55\xfb\x38\xf9\x96\xb4\x91\xd5\x7a\x4a\x9a\xe0\x37\x65\x49\xca\xd7\x49\x9e\xcf\x92\xf4\xda\x92\xd1\x00\x81\x69\xfd\x3c\x61\xed\xfa\x5c\x3c\xee\x04\xdd\x92\x7a\xe0\x88\x8c\x9d\x3b\xc2\xda\x06\x9d\x75\x57\x54\xea\x55\x3e\x81\x48\xeb\x24\x97\xc9\xa5\x43\x27\x43\x25\xc3\x60\xb4\xae\x93\xc9\x4f\x80\xf3\xa4\x88\x49\xf0\xf7\x7a\x75\x5d\xd7\xab\x8b\xa6\xa1\xc6\xab\xc9\x32\xc2\x68\x12\x38\x42\x34\x0d\xd0\x40\x78\x9d\xe4\x28\xe3\x8b\xdf\x8d\x24\x4e\xe8\x42\xe3\xf6\x44\xaf\xe9\xbd\x85\xa2\x24\x29\xa4\x54\x94\x9d\xc8\x17\xbd\x5d\x6a\x72\x9a\x10\xcf\x13\xfa\xae\xa8\x7e\x41\xda\x72\x01\x4a\xb3\x8e\xab\xd7\xda\x96\xf9\x21\x0d\x51\x7b\x14\xb9\x4c\xdb\x48\x4b\x84\x3f\x7c\x34\xea\x04\x80\xa1\xab\xc7\xa8\x4d\x5a\x05\x39\x02\xfe\x10\x8c\x5e\x78\x4b\x1b\x83\xcb\xe3\xb2\x14\x4a\xc0\x21\x78\xd1\x78\x4a\x0f\x13\x86\xe6\x77\x8a\x39\xea\xbc\x33\x3d\x04\xeb\x17\x43\xb0\x7e\xe9\x30\x38\x04\x4b\x49\x42\xe5\xad\x7c\x5e\xeb\x58\x8b\x47\x71\x87\x32\x9a\x1b\x8d\x6a\xf6\x96\x3e\x8a\x15\xbb\xb1\xf2\xce\x8b\x31\xd3\x7a\xa0\x2c\x2f\x22\x82\xa3\xe7\x73\x54\x52\xf6\x4b\x51\xc0\x32\x4d\x28\xec\xc3\xf5\xc0\x3b\x4b\x97\x3a\x63\x52\xff\xa7\x4b\x65\xf7\x2f\x07\x7d\x25\x5b\x20\x0c\x02\xa9\xd8\x13\x77\xe2\x5d\xf5\xdd\xd9\x38\x27\x8b\x3e\xf4\x77\x35\xec\xc8\x40\x4c\x5f\x93\x8e\xb8\x48\xdf\xbb\x53\x73\xa5\x78\xa7\x9e\x54\x85\x03\xb8\x5f\x1b\x97\x1c\xdf\x17\x3a\x86\xba\x12\xa7\xa0\x48\x55\xd8\xaf\x09\xbb\x7d\xd8\xef\x09\x00\xf1\xa2\xba\xb8\x27\x48\xaa\x42\x07\xe5\xe6\x82\x9b\xa0\x60\xb1\xed\xbd\x49\xd8\x16\x40\xa8\xb4\x98\x0c\x37\x38\xef\x1c\x2f\x04\xbd\x6f\x73\x97\x19\x07\x2b\x43\xa0\x76\xce\xb1\x7e\x0a\xbe\x37\x04\x6a\x9d\x6f\xf3\xed\x46\x50\x95\x78\x37\x22\xc0\xb9\xcf\xb3\xcb\x46\x68\xc6\xd8\xc4\x93\x7c\xa2\x22\xd3\x6e\xc5\xd0\x1a\x38\xf1\x9c\xc7\x8a\x1d\xcd\xb9\x09\x3a\x11\xc7\x41\x37\x61\xce\xe4\xcd\xd7\x9c\x4f\xb0\xfd\xda\xdb\xd7\x59\x39\xb5\xf0\x1d\x8f\x95\x43\xe1\xc6\x2e\x03\x43\xbe\x46\x4b\x64\xa7\x1a\xcf\x80\xcd\x17\x6c\xdd\xf0\x48\x05\x91\x56\xa8\xc4\xad\xca\x63\xa3\x03\x32\x36\x71\xab\x93\x88\x79\xd2\xd2\xb0\x4f\x42\x04\x5f\x81\x5c\x4f\x06\x73\x39\x0c\x6a\x04\x97\xb4\x1d\x0e\x4b\xf5\xd7\xc1\xb0\x69\xdb\x9e\xe5\x9e\x3d\x03\x2d\x4f\x68\x76\x54\x89\x08\x45\x32\x18\x23\x6b\x27\x60\x9b\x47\x7b\xef\x37\xd8\x90\xfa\x7e\x41\x6d\xd9\xda\x72\x16\x90\x7d\x80\x68\xb1\x9c\x11\x7f\x2d\xe0\xfa\x8d\xda\x86\xb2\x36\x23\x12\x79\x76\x19\xa1\xd5\xd5\x17\x6a\xc5\xa0\xb5\xc4\x0b\x4d\x98\xa5\xa4\xe5\x3a\x11\xe5\x2a\x2a\x5a\x79\x1f\x9c\x9c\x2a\x4e\xd4\x40\xb4\x48\x34\x28\xeb\x40\xcd\xa7\xac\x42\xb1\x6d\x28\xd7\x21\x9e\xf6\xb1\xaa\xd6\xdc\x34\x74\xb4\x77\x2e\xc0\x69\xcb\xd0\x13\x5b\x7e\x12\xc2\xde\xf4\xdb\x3c\x22\x85\x32\x3d\x4d\xba\x8a\xf4\xb5\x58\x6f\xdd\xea\x16\x65\x4c\xa0\x25\xf2\x26\x0e\xbd\x92\x91\xa0\x8e\x2b\xf1\xa7\x11\x39\x22\x14\x6b\xbc\x6d\x39\xa6\xf4\xb2\x55\x8d\x0e\xbb\xd0\x2c\x92\x2f\x64\x69\x3d\x52\x64\x62\x52\x2f\xb6\x55\x0e\x43\x9c\x1d\xa1\x8a\xac\xaa\x1d\xec\xfb\x9a\x9a\x6a\xc4\xcd\xf3\xbc\x62\x49\x2f\x5d\xb5\xe6\xa4\xe4\x4e\x33\x76\xaf\xd8\xc3\x5c\x79\x21\x9f\xfd\xf6\x29\xaf\x1e\x61\xb5\x03\x71\x27\xe6\xc6\x8a\x5b\x00\x0e\x1d\x8f\x24\xdb\x33\x8b\x7c\xdb\xcd\xb5\x37\x2d\x61\x9d\x39\xb7\x31\xce\x75\xb7\x6e\xcf\x44\xd0\xd7\x6e\x62\xc2\xd3\x42\x83\x0d\x93\xfe\x08\xda\xd8\x10\xb8\xa9\x90\x2f\xb4\x35\xf9\xdb\x34\xa9\xf3\x2c\x52\x92\x56\xe4\x3a\xc8\x69\x15\x58\xe2\x9e\x41\x16\xee\x6d\xef\x45\xe4\x6d\x57\xa9\x6d\x27\xe9\x6c\xbf\x0a\x6f\xc4\x22\x78\x1b\x9a\x16\xff\xf6\x32\x13\x8a\x57\x97\xdb\x65\x83\xfa\x9b\x39\xbd\xa1\x80\xb5\xbe\x26\xa2\x6e\x76\x7a\x93\x3d\x74\x9e\xe3\xfc\x19\xe6\xe2\x46\x63\x7d\x28\x5b\x4c\xbd\x74\x89\x8a\x88\x2f\x8d\x5d\xe8\x1a\x4a\x24\x26\x5c\xf7\xa7\xc3\x54\x7b\x3c\x2a\x3f\xee\x4d\x2a\x4f\x1d\x0f\x65\xfc\xae\x5c\x4f\xed\xc0\xdf\x3f\x9c\x5f\x13\x95\xfb\x98\x27\x29\x8c\xf6\x9f\xd4\xb9\x4e\x87\x31\x3d\xba\xfb\x46\xfd\x32\x88\x76\x96\x05\x8a\xed\x06\x9b\x5e\x00\xa2\xc6\x9b\x0d\xad\xbb\xb5\x79\x0a\xd1\x1d\x4a\x7d\x07\xda\x09\x62\x80\x93\xd9\xb5\x01\x5c\x53\x07\xd6\xab\x05\x36\x3b\x61\x3e\xcc\x56\xc8\x78\xac\x2c\x0e\x20\x0a\x10\x13\xf6\x8b\xa8\x8e\x09\x01\x13\x5f\x9e\x81\x8c\xff\xa1\x68\x80\x44\x00\xaa\x21\x68\xf5\x38\x5b\x78\xdd\xad\x02\x02\xaf\xbb\xd9\x42\x84\x95\x0b\x9d\x25\x7d\xaa\xc4\x68\x9c\xfa\xf7\xf4\xaa\x04\xf1\xa6\xc3\xb0\x3a\xd9\xc2\x1e\xda\xbe\xc0\x19\xe1\x6b\x57\x90\x2e\x13\xbc\x80\x42\x32\x29\x2c\x99\x8b\x1f\x4a\x1f\x42\x4c\x90\x92\x2a\xcf\xc0\x0c\x1a\x8d\x08\x13\xb3\xad\x57\x4b\x69\xa5\x1f\xdd\xab\x82\xfa\x8e\xd3\xce\x7d\xd6\x98\xf9\xdd\x2c\x3b\xac\x5f\x60\xf7\x16\x36\x01\x17\xe6\x2f\x6c\x44\x0a\x40\x04\x83\xb5\x8f\xf1\x02\x6b\xe3\x77\xc2\xcb\x1e\xb7\x61\xb5\xfc\xb0\xb3\x00\xe2\x55\xf7\xcf\x7f\x9e\xa7\xb1\x43\x45\x47\xc9\x66\x22\xda\xd2\xc4\xac\x40\xd2\x77\x05\x5d\x21\x8f\xbd\x83\xf3\x82\xdb\x78\x9d\x24\x96\xbc\xd7\xfe\xa8\xc3\x8b\xf4\xdb\x06\xff\x7d\x60\x4d\x63\x8b\x2c\xbb\x4b\x94\x98\x11\x67\x83\x39\x49\xcb\x20\x98\xd5\xeb\x75\xbd\x00\xd8\xfa\x7b\x22\xa1\xf9\xa8\x8e\x2a\xd4\x8c\x64\xf2\xe5\x26\x4f\xd7\xf6\xc9\x93\x66\xda\x51\x63\x3a\x8f\x6d\x2d\x9c\x14\xc3\x10\xc0\x21\x40\x4e\xaa\x09\x61\xd0\x38\x36\x87\xf9\x58\x34\x67\x10\x9d\x83\x09\x2a\xab\xd1\xc7\xf1\xf1\xd1\x10\xe0\xf8\x9d\x98\xab\x71\x7c\xe2\x64\x89\x1b\x8b\xeb\x24\xcb\x80\xc8\x31\x01\x63\xcb\xe2\xcd\x36\xc0\x08\x28\x21\x2d\x60\x2a\xfd\x28\x29\xd1\x02\xe1\x24\x07\xa4\xcc\x94\x2f\xb1\xf9\xf4\x8e\xc3\x89\xdb\x6b\xe6\x98\xa2\xbb\x88\x38\xd9\x66\x38\xf9\x3b\xd9\x4f\xad\x95\x30\x8c\xa5\xdb\xbc\xaa\xdf\xf4\xd4\x15\xaf\x79\x6c\x75\x35\xb0\x13\x61\x04\x33\x84\x2b\xe8\x9f\xd5\x56\x41\x53\x1f\x0a\x75\x41\xa5\x2e\xe8\xa9\xcb\x49\x80\x98\x76\xbd\x52\xd5\xa8\x9f\x25\x7b\x7c\x1d\x3d\xfd\x7f\x4e\x47\xf6\xd8\x78\x5b\x92\xd5\xd9\x1d\x4e\x4f\xf4\xa7\x28\xeb\x5d\xff\xfa\x88\x6f\x38\x38\x2e\xe1\x31\x46\xcc\x19\xd4\xfe\x28\xac\x6b\x52\xfd\x0d\x1f\xe3\xe5\x57\x74\x11\x9f\xb1\x84\x55\x94\x4f\xec\x2f\xf7\xf6\x02\xa7\xba\x82\x3b\x20\x96\xae\xbc\xfa\x7e\xef\x17\x71\x03\x9f\x0f\xa3\x85\x0a\x45\xf4\x91\xa5\x21\x28\x72\x98\x50\x08\xd2\x25\x4c\xaf\x45\x95\x7f\xb5\xc4\xdd\x9b\x6e\x26\x5c\xb8\xbe\x04\xdb\xa7\xb3\x4f\x8d\xef\x3b\x7a\x07\x97\xc2\x2a\x53\xaf\xa8\xf6\x2c\xd7\xc6\xa3\x7b\xb1\x39\x60\x3e\x3d\x59\xe7\xee\x09\x65\x5b\xf8\xab\xd0\xb4\x6c\x9e\xb9\x0b\xa7\x14\xe4\x9e\xd8\x54\xee\x8a\x85\xe6\x3a\x69\x81\x9b\x46\x57\x6d\x6c\xae\xb3\xb4\xf3\x97\x4e\xcb\x78\x73\xcb\xd2\x9d\xb6\xda\x2c\x57\x75\x87\x91\x7a\x5d\xa4\xb1\xcc\x67\xa1\xda\xa6\x0f\xb5\x3d\xe5\x4d\x1e\xd6\x16\x93\xbd\x4f\x8c\xc4\x7b\x4b\xce\x85\x17\x71\xf5\x7c\xf6\xc9\x6c\x9b\x29\x1b\x76\x2e\x35\x06\x1b\xe2\xff\x91\xd9\xa7\x58\x5f\x17\x33\xf7\xf9\x42\x9f\x7e\x73\x36\xd1\x80\x9b\x12\xf5\x6f\x42\x71\xa2\xfa\x29\x31\xf7\x02\x4d\xf8\x6c\xa9\xd7\xde\x9f\xf5\xa0\xc3\x97\x5f\xd6\x0a\x0a\xda\x76\x51\xab\xed\x5c\xed\xbd\xaf\xce\x00\x55\xbd\xa3\xef\xec\x5a\xd6\xb2\xb8\x5e\x03\x80\x96\x3d\xce\x06\x61\x3b\x61\x46\xf9\xc2\xe8\x73\xf4\xc1\x3c\xf6\x31\x01\x91\x60\x35\x1a\x82\x88\xcf\x46\xbc\xe0\xac\xb6\x4a\x5e\x7c\x3a\xfb\x14\x4d\x38\x59\xfb\xfb\xb4\xf5\xce\x25\x85\x38\x13\xc3\xc4\x1a\x0d\xcd\x0d\xcb\xf0\x90\xd2\x6e\x5a\xcd\x83\xba\xe9\x22\xbf\x8b\xd4\x91\x07\x63\x95\x66\xc2\x93\xbe\x70\x00\x6a\xc5\xd8\xdb\x5a\xd1\xd9\x35\x2a\x0a\x84\x17\xfa\xdb\xc7\xe2\x75\x3e\xdd\x86\x77\x54\xcd\xb1\x71\xbd\x27\x34\xb4\x56\x33\xf4\x06\xb1\x74\x69\x58\xb4\x9a\xe4\x8e\xde\xe2\x76\xe2\xba\x99\xc0\xc4\x67\x54\x24\xff\x53\xa7\x97\x1a\xe4\x7c\x4a\x5c\xda\x2d\x50\xdf\x79\x4e\xde\x27\xe3\x4f\x02\x8e\x0b\x6b\x27\xfb\xa1\xde\x35\xf2\x29\xd6\xfb\x56\x9a\x96\x08\x27\xf4\xdf\x27\xee\x1e\x5a\x57\x03\x22\x49\x64\x91\x57\x1b\x73\x96\x8f\xaf\x1b\xf0\x76\x49\x9f\xba\x9b\x30\xc0\x8f\x9a\x43\x9c\xc9\x70\xc7\xe7\xd3\x89\xa3\x81\x93\xe8\x68\xe3\xbb\xa9\xea\x1d\x38\x6f\x61\xdc\xcc\x4f\x75\xa6\x74\x33\x33\x7c\x2e\xed\xec\x25\x31\xd9\x7e\x41\x2f\x99\xcf\x5f\x5b\xe4\x55\x22\xd1\x8a\x01\xda\x7b\xc9\x5e\x7f\xcb\xff\xe4\xc9\xcb\xb2\xfe\x50\xba\xa7\x2f\x15\x6e\xee\x7b\x28\x22\xc9\x1a\xc6\x90\xa1\xa8\x73\x90\xd0\x89\x76\x77\x35\x05\x9d\x42\x1e\xca\x46\x77\xea\x8c\xa6\x65\xec\xa0\xad\xa6\xb2\xdc\x98\x49\x2f\x5c\x5b\x98\x01\x4e\x34\x93\xb6\xbc\x0a\x22\x37\xe0\xec\x40\xaf\x4e\xc0\xc8\x94\x59\xdb\xd6\xa6\x9d\x55\x43\x99\xb7\xad\xeb\x93\xda\x76\x77\x78\x13\x1d\x2f\x04\x74\x86\x4a\x60\x2f\xbb\xd6\xc0\xfd\xfe\x93\xff\x13\x00\x00\xff\xff\x5a\x32\x63\x2f\x3f\xbf\x00\x00")
+var _staticsJsComponentsTopologyJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\x6d\x77\xdb\xb6\xd2\xe0\xf7\xfc\x0a\x84\x4f\x4f\x24\x35\x12\xe5\xa4\xf7\x76\xf3\xc8\x96\xef\x6d\xe3\xa4\xf1\xa6\x8e\xbb\xb5\x9b\x9e\xb3\xb6\x4f\x0f\x45\x42\x12\x62\x0a\xe0\x25\x40\xd9\xbe\xa9\xff\xfb\x1e\xbc\x12\x00\x41\x4a\x72\xdc\xde\xee\x6e\x3f\x34\x16\x30\x33\x98\x19\x0c\x06\x83\xc1\x0b\xc7\x5f\x83\x4f\x74\x89\x30\x03\xab\x2a\x67\x88\xb2\x72\x02\x58\x59\x41\xf0\xf5\xf8\xc9\x93\x75\x52\x02\x46\x0a\x92\x93\xc5\xdd\x6b\xb2\x2a\x08\x86\x98\xc9\xe2\x73\xbf\x18\x4c\xc1\xe7\x27\x4f\x00\xc0\xc9\x0a\x4e\x40\x4f\xa3\xf5\x86\xbc\x70\x85\x6e\x11\xa6\x13\x70\x91\x14\xe8\x84\xff\x3d\x04\x98\x30\x34\x47\x69\xc2\x10\xc1\xa2\xe8\x4a\x40\x32\xb8\x2a\xf2\x84\x71\x12\x97\x4f\x00\x00\xe0\x20\x43\x6b\x90\xe6\x09\xa5\xd3\x48\x13\x8d\x0e\x65\x9d\x5b\x9b\x92\x7c\x44\x57\xa3\xff\x01\xe6\x28\xcf\x41\x4a\x30\x83\x98\xd5\xa0\x61\x52\xa3\xec\x1b\x1b\xa4\x05\x28\x87\x0b\x88\x33\x17\x10\x80\x03\xca\x4a\x82\x17\x87\x5a\x17\x60\x8d\xe0\xcd\xc1\x58\x95\x1e\x8c\x67\xa5\x8f\x50\x80\xf5\x08\xcd\xa7\x51\x5a\x95\xa5\xc6\x7a\x8b\x72\x06\xcb\xe8\xf0\xf3\xe7\x66\xe9\xfd\xfd\xc1\xb8\x08\x11\x81\x39\x85\x87\x6f\xab\x3c\x6f\xa9\xe7\x8d\x68\xee\xdf\x55\xab\x04\x9f\xa3\x15\x7c\xcd\x55\x72\xcb\x78\x53\x6d\x75\xdd\x0d\xfe\x88\xd6\xd0\xaf\x3f\x18\x67\x68\x6d\x2b\xd9\xff\xcd\xf5\x89\x32\x4b\x99\xa4\xe0\x7d\x4e\x03\x6a\x0f\x81\x8d\x8a\x04\xc3\xbc\xa1\x7a\x0e\x2e\xc5\x5c\x22\xca\x48\x79\x17\xe9\x4e\x9b\x93\x72\x35\x5a\x94\xa4\x2a\x00\xc2\x45\xc5\x46\x74\xe5\x63\xbb\xbd\x6c\x21\x94\xe4\xa6\x09\x0b\xc0\x41\x9e\xcc\x60\x5e\xdb\x19\x66\x25\xc9\x47\xa2\x30\x02\x73\x52\xda\xe6\x94\x30\x58\xa0\xf4\x9a\xf7\xe8\x51\xc2\xe0\x98\x2b\xf7\x60\x2c\x60\x43\x94\x2d\x3e\x04\xb7\xa1\xe6\x5d\x30\x7a\x83\x58\xba\x04\xf2\x9f\xd1\x68\x0d\x4b\x86\xd2\xa4\xa1\x21\x83\x2a\xc8\x0a\xd5\x96\x49\x86\xc8\x28\x47\x6b\x18\x89\x61\x6a\xb1\xbd\x22\x19\x8c\x00\xbb\x2b\xa0\x02\x8b\xc0\x3a\xc9\x2b\x38\x8d\x24\xf8\x5a\x40\xe4\x35\xc6\x89\x40\x48\x97\x30\xbd\x86\xd9\x34\x52\x7f\x44\xe3\x36\x2e\xa4\x06\x85\xae\x2c\x36\x94\x45\xb5\x69\x27\xc8\xbf\xe9\xef\xad\x45\x30\x18\x61\x29\xb6\xe7\x59\x13\x3a\x7c\x27\xff\xd0\x9c\x1f\xd0\x22\xc1\xb5\xd3\x58\x2c\x72\x38\x22\x15\xa3\x28\x83\xad\xdd\x12\x40\x41\x58\x62\x1c\x8c\x79\xa5\xfe\x27\x68\x0f\xde\x20\xfb\x63\x2c\x25\x99\x51\xa3\x65\xb4\x82\x23\xae\xdb\xb0\x86\x93\x19\x25\x79\xc5\x1c\x43\x41\x2b\x78\x2e\x10\x1a\x46\x02\x26\x19\xa2\xc9\x2c\x87\x99\xdb\x13\x60\x3a\x9d\x82\xcb\x1e\xb7\x8c\xcb\xde\x0e\xdd\xc2\xf9\x3c\xfc\x4e\xb1\xb0\xa3\x35\x95\x7c\x08\x6f\x25\x63\x09\xf3\x84\x79\x83\xc1\xc8\xf8\xc8\x12\x71\xae\x0e\x7f\x56\x0d\x6e\x90\xe8\xaf\x64\x7b\xc6\xf9\xb9\xae\xdc\x72\x8a\x60\x92\x26\x39\xc4\x59\x52\x8e\x14\x03\x97\xbd\x00\xdc\x65\x2f\x02\x61\xe6\x27\xdc\x5d\x27\x8c\xe3\x65\xd9\xf8\xe4\x64\x7c\x77\x77\x77\xc7\xc1\x8b\x3c\x49\xe1\x92\xe4\x19\x2c\xa7\x51\x5d\xd5\x46\x67\x3d\x22\x78\x42\x0a\x88\xed\x3e\x3b\x95\x73\xce\x9b\xdb\x22\xc1\x19\xb7\xd4\x0e\xdc\x34\x27\x34\x80\xfb\x9a\xe4\x79\x52\xd0\x2e\x64\xcf\x09\xf1\x69\x22\x52\x73\x95\x3d\x15\x8c\xe8\x0a\x88\xb9\x49\x4d\x38\x51\x8b\x42\xb4\xe9\x8d\xa4\xea\xba\x2c\xb0\x8d\x23\x11\x2e\x28\x63\x56\x18\x7a\x48\x5f\xf6\xb8\x51\xd4\x3d\x73\x18\x14\xcb\x1a\x57\xa6\x37\x39\x41\xdd\xeb\x4e\xe7\xbc\x7b\x37\x59\xad\x26\x94\x6e\xad\x21\x3e\x87\x46\xa0\x53\x37\x6d\xd6\xb2\xcd\xb8\x04\x94\xdd\xe5\x70\x1a\xad\x92\x72\x81\xf0\x28\x87\x73\x36\x01\x2f\xf6\x8a\xdb\x36\xaa\xff\xbc\x86\x77\x55\x11\x43\xcc\x6c\x75\x73\x2e\xcf\xcb\x64\x0d\xdb\x7a\x6a\x0b\x3d\x0b\xe1\xc2\x83\x2b\xa0\xe1\x12\xe6\x42\xcb\x9e\x7e\x5f\x2e\xbf\xd9\x5b\x6d\xad\xdc\x9f\x61\xfe\x1f\xd3\xef\x0e\x7a\xd2\xee\x77\xa3\x9e\x6c\xe7\xb6\x84\x79\x31\x9a\x31\x1c\x6d\xa4\x09\x18\x62\xb9\xe5\xe5\x01\x07\x9d\x00\x78\x0b\x5e\x64\x2f\x97\xdf\xac\xfe\x4e\x01\x29\xc1\xcb\xe5\xdf\x57\xfc\x5f\xae\xdf\xc3\x67\xff\xf5\xea\xe5\xdf\xbf\xd9\xef\x72\x95\xb3\x8a\x31\x82\xd5\x74\x22\x7f\x18\x3d\xcf\x18\x06\x33\x86\x47\x45\x89\x56\x49\xd9\xea\xa7\x76\xd1\xf3\x3f\xd3\x1c\xa5\xd7\x41\x8b\x0c\x0f\x5b\x4f\x5d\x8b\xfc\xae\x58\xa2\x94\x60\x60\xfe\x52\xf6\x95\x94\x28\x19\x2d\x51\x96\x41\x3c\x8d\xf8\xfa\x30\xea\x9e\x22\xa4\xac\xa1\x80\x37\x38\x7b\x84\x4a\x83\x65\xe1\xb0\xbd\x3d\xce\xdf\x35\xd2\xdf\x29\xd6\x9f\xab\x95\x9b\x5c\xab\x75\x4d\xd3\x5b\x86\xf9\x66\x94\xe7\x88\x32\xab\xa1\x45\x09\x57\x39\xc2\xa3\x79\xb2\x26\x25\x62\x90\x7a\x03\x1e\xc6\x8b\x18\x2c\xe2\x8f\xfd\x41\xfc\x2e\xa1\xfd\xe1\xa0\x65\x60\x01\xd7\x7d\x28\xfe\x95\x79\x8a\xa5\xa1\x1e\xaa\x37\x28\x63\xcb\x09\xf8\xdb\x5e\xfb\x28\x0d\xb8\x12\xb5\x94\x6d\xf1\x8f\xb2\xf6\x7f\x55\xb0\xbc\xeb\x20\x49\xf0\x44\xe8\x60\x1a\x11\x2c\x31\x8e\x12\x96\x70\x85\x9c\xc1\x1c\xa6\xac\x15\xb5\xd3\x7d\xb5\xa9\xbb\xc3\x91\x78\x63\x23\xcd\x61\x52\x4a\x5f\x22\x87\x59\x4c\x19\x29\x7c\xe9\x5e\x73\xa8\xe8\xf0\x19\x1f\x35\xb4\xcb\x35\xc8\x68\x49\xc8\xe5\x76\x4a\xa0\xaf\xfd\x6c\x44\x13\xa4\x55\x3c\xdd\xc6\x4e\x91\xdc\xff\xdd\xa3\xf1\x1d\x5a\x2c\x73\xb4\x58\xb2\x3f\x70\x40\x2e\x75\x1b\x23\x5e\xb1\x71\x34\xb6\xf8\x5e\xa7\xdf\x0d\xc9\xcd\xe3\x71\xdb\x99\xfd\xcd\xaa\x58\x26\x14\xfd\x1b\xfa\x23\x12\xea\x8a\x1f\xa4\x25\xbd\xb9\x2d\xca\xce\x58\xd7\x8c\x48\xa3\x5c\x6f\x50\xb6\x20\x77\x8f\xc9\x47\x1c\x7d\x46\xd4\x2f\x1f\x80\x7e\xdf\xfe\x35\x47\x5f\xa0\x84\x9b\xb4\x1b\x69\x31\x52\xa8\x40\xab\x63\xe4\xb2\x12\x2d\x16\x7c\xe0\x34\x26\x65\x15\xbd\xfc\x73\x45\x2a\x0a\x95\xe9\xd0\x25\xb9\x39\x77\x57\x3c\x91\x82\xc8\x61\xb2\x86\xaa\xab\xce\xad\x08\x84\x54\xac\x0e\x4d\x96\x28\x83\x3e\x7e\x48\x09\xa2\xf3\x27\x8a\xc5\x8b\xcb\x9e\x09\x48\x2e\x7b\x43\x80\xa8\x47\xe2\x23\xa2\x68\x96\x43\xf0\x0f\x60\x41\x8e\x4a\xb8\x22\x3c\x30\x02\x13\xa7\x58\x3a\x8a\xcb\xde\xd5\x2e\x61\x4d\x4b\x48\xb3\xb9\x63\x82\xf9\x50\xdf\xa6\xd4\x90\xf0\x73\xa2\xaa\x03\xb8\x79\xfe\x9b\x90\xd5\x08\xe1\x68\xbb\x58\x32\x64\x6f\x2a\xc0\xfd\xdf\x84\xac\xc0\x31\xae\x7b\x84\x53\x3e\xc6\xcd\xdc\xf6\x86\xb8\xd0\x30\xb4\x9d\x0e\x83\xfa\x6b\x08\x28\x4c\xe5\x51\x24\x3c\xb5\x8d\x8e\xd3\x3e\x6d\xfa\xf8\xed\x64\x14\x3c\x3d\xa6\x90\x73\xf4\x58\x42\xbe\x45\x9e\x90\xbc\x60\x57\x21\xe7\x55\x9e\xd3\xb4\x84\xf0\xf1\xfa\x12\x8a\xfc\xc9\x96\x42\x06\xa7\x0e\x25\xe5\x1b\x45\xa8\x5e\xd8\x2c\x16\x39\xd4\x29\x96\xef\xef\x7e\x84\x6b\x98\xf7\xe7\x49\x4e\xe1\xa0\x53\x70\xc9\xd1\x48\x08\x4c\x59\x92\x5e\x07\xdc\x1d\xea\xd2\x52\x09\xf9\xec\x22\x94\x05\x44\xc1\x2a\x41\x58\x4c\x61\x0d\x8f\x10\xf0\x1f\x8f\xcb\x4b\x91\x57\x74\x44\xd1\x02\x4b\x4e\x68\x35\xdb\x92\x91\x8d\x1d\x97\x2a\xcd\x3e\x42\xd7\xbd\x36\xa4\xba\x3b\x8f\x5b\xd9\x9f\xd3\x77\x74\x95\xfc\x05\x3a\x6f\x85\xf0\x1f\xd1\x7b\xf5\xbe\x22\xc4\xec\x03\xc9\x20\x78\x3a\x05\x98\x5b\xeb\xb3\x67\xc0\x2a\x8e\x11\xfd\x81\x87\xdc\xa7\x37\x18\x96\xfd\x41\x64\x8d\xd7\x51\x92\xe7\x8f\x36\x66\xc7\xba\x9f\xc1\x6b\xd9\x38\x10\x4c\x9d\x97\xb0\x61\x11\x12\xe1\xbb\x3c\xef\x5b\x7c\x7e\xb9\x49\x08\xf8\x86\x5a\x62\xb9\xe0\x50\xca\x89\x9a\x3d\x55\xdb\x47\x48\x48\x1d\x91\x7c\x76\xe3\x0c\xe3\x1b\x2e\x7b\x13\xd0\x68\x2d\xd6\xc3\x2a\x1b\x82\x00\x9e\xb0\x4b\x8e\xf8\xb4\x03\xf3\x7e\xfb\x60\xe5\x21\x03\xbf\x40\xf8\x91\xba\xff\x27\x84\x01\x1f\x67\x98\x64\x7c\xed\xaa\xbb\xba\x40\xf8\xbb\xbc\xb9\x8d\xfb\xb8\x7e\xb1\xa2\xcb\x02\xe1\xff\xf8\x10\x27\xd7\xa3\x14\x95\x69\x0e\x1f\xdd\x3f\x57\xf8\x8b\x3b\x4a\x75\xd3\x2f\x9c\x52\xa8\xa3\x2a\xfc\x53\xa0\xab\x76\x53\xd0\x17\x77\x53\x48\x37\x8f\xc8\x81\x5c\x18\x6c\xee\xa4\x06\x1b\x81\x0e\x72\xe3\x7b\xef\x97\x3e\xd4\x80\xf0\x9c\xa8\x83\x0c\xde\x69\x95\xbf\x03\x8a\x32\x38\x4b\x9c\xf5\xd7\x01\x4b\x66\x54\xf9\x2e\x44\xbf\xc3\x49\x7e\xf7\x6f\xb1\x77\x96\xa4\x0c\xf1\x35\xd6\xd3\x34\xc1\x3f\xc3\x24\x7b\x9d\x14\xac\x2a\x21\x05\xff\x00\x2f\xc1\x04\xec\x79\x9d\xc6\x92\x99\x68\xd5\xcc\xc9\x0a\x5c\xa7\xc3\x3d\x2a\x0d\x25\xa6\xb2\x42\x2c\x84\x0f\x0f\xc6\xce\xcf\x16\x50\xbe\xc2\xaf\xa9\xff\xca\x17\xc8\x86\xc9\x67\xcf\x40\x23\x79\x5d\x67\xaf\xad\x06\x38\x11\xaf\x23\xb4\x28\xdd\x02\xfe\x00\x31\x2c\x13\x46\xca\xc8\x3b\x03\xd3\x6c\x4f\xcc\x8b\x09\x3e\xc6\x9f\x60\xca\x7e\x4a\xd2\x6b\xc8\x9a\x0a\x40\xa2\x16\x11\xac\x55\xe0\x15\x04\xc1\x25\xfb\x1a\xf6\xe1\xc2\xbc\xcd\xc9\x4d\x93\xa5\x79\x4e\x6e\x46\x2c\x99\xe5\x50\xaf\x1a\x0f\x0f\xc6\x81\xc2\x87\xb4\xf8\x5d\x0e\xcb\x80\x16\x12\x5e\xac\x35\x60\xfd\x08\x82\x29\xe1\xad\x1f\x0f\xe1\xe4\x57\x52\x5e\xcf\x83\xf2\xdf\xa8\x9a\x51\x9a\xe4\x5c\x74\xf7\xf7\x43\xda\x32\xc7\xb7\xca\x2a\xaf\xc7\x46\xfb\x36\x8b\xcf\x51\xbd\x1d\xc7\xf1\x0f\x0f\xc6\x5e\xc1\x83\x0c\x59\x26\x99\x40\x4a\x30\x25\x79\x73\x27\xff\x40\x67\xa1\x14\xc0\xe1\xc1\xd8\x2f\xd9\xd8\xac\x28\xb4\xd9\x3b\x10\x1e\x4a\x38\x2c\x3e\x29\x8c\x56\x90\x25\x59\xc2\x92\xa8\x19\x46\x9d\xe8\xaa\xc6\x04\x33\x31\x21\xcb\x34\x12\x0b\xb3\x26\x88\x92\xd1\xd0\x00\x93\x0c\xd2\xb4\x44\x22\x97\x33\x8d\x2e\x7b\xc7\x47\x13\x70\xd9\x7b\xee\x84\xad\x99\xef\xdb\xd4\x41\x41\x40\x73\xc2\xa6\x51\x92\x06\x73\x49\xad\xe1\xb1\x1f\x07\x87\x53\x78\x2d\x21\x2d\x27\xd0\x82\xe1\x4d\xc4\x19\x9c\x27\x55\xce\xc4\xdf\xb7\xb4\x05\xc7\xcb\x68\x6e\x1f\x13\xdb\xf3\x9c\xe8\x31\xa9\x05\x30\x0f\xf4\x8b\x13\xbb\xce\x93\x91\x9c\x42\xb7\x88\x57\xe7\xc9\x28\x25\xab\xa2\x84\x94\x6e\x11\xa4\xfa\x67\x5c\xc2\x21\xcd\x58\xf7\x9e\x5b\x4c\x66\xc2\x63\x66\x90\x25\x28\x07\x13\xf9\x73\x4b\xbb\xb3\xe4\xcc\x11\xbe\xa6\xd3\x48\x9b\xef\x8f\xfc\x67\x3f\x40\xa4\x7d\x9b\xcc\xb3\x63\x4d\x49\x1b\xc0\x19\x4b\x98\x37\x26\x0f\xc6\x0e\xf3\xce\x30\x13\xc3\x2a\x3c\xce\x60\xb6\x68\x1d\x67\x6f\xb2\xc5\x97\x0f\x1e\x4e\xa4\x39\x78\xba\x15\xcd\x71\x0c\xfd\xc3\x07\x4a\xc6\xe7\xa1\x04\x61\x58\x76\xb9\x91\xd7\x1a\xa8\x55\xce\x1a\x62\x57\x53\xb1\x30\xbf\xa4\x73\x68\x99\x76\x75\xd0\x59\x99\x06\xac\x48\x31\x7f\x46\xaa\x32\xf5\x0d\x65\xb3\xee\x39\xcd\x2f\xe2\x79\x8d\x92\x2e\x9e\x3f\xa2\xd0\xf8\x51\x3c\xf3\xca\x5d\x19\x16\x38\x5f\xc2\x70\x46\x59\x17\xc3\x47\xd4\xdd\xf6\x55\xac\x1e\x41\xca\x10\x16\x27\xc8\x77\x66\x99\x93\x7c\x28\xcb\xd7\xaf\x68\x97\x51\xbf\x7f\x15\x70\xf4\x8a\xe5\xf7\xaf\x68\xfc\xe6\x96\x95\xbb\xe9\x58\x53\x7d\x28\xc3\x73\x98\x88\xb8\x5a\x44\x88\x01\x8e\xdf\xca\xfa\x76\xb6\x0d\x80\xcb\xb5\x43\x17\x4c\xd4\x4f\x1a\xa6\xcd\xc3\x54\x1b\x7e\x5b\xe6\xc9\x9a\x8e\x9c\xc8\x2c\xe0\xc9\xbd\x24\x97\x2e\x8e\xd5\x59\x1f\x70\xd9\x23\x6b\x3a\x2b\x51\xb6\x08\x9e\x82\x53\x52\xfe\x2c\x5a\x71\x45\xe4\x2d\x9b\x6e\x91\x14\x1c\x0e\x22\x30\x59\x94\x49\xb1\x9c\x46\xe2\x1f\x2e\xa5\x85\xb2\xad\x8c\x8c\xb0\x24\xe7\x36\x55\xa2\x34\x2c\x26\xaf\xe8\x98\x0b\x4a\x94\xfa\x9c\x2f\x5f\x1e\x9e\x73\xb2\x40\x92\xa5\x07\xe3\xe5\x4b\x17\x42\x55\xe8\xee\x0b\x4f\xb7\x82\xa3\xc9\x35\xbc\x13\x6b\x69\x32\x4b\xf2\x8f\x49\x49\x2f\x2e\x7b\x08\x33\x58\xce\x93\x14\x2a\xbe\x47\x1c\xe6\xb2\x77\xc5\x55\xe0\x50\x6e\xee\x52\xae\x47\x74\x49\x6e\x9c\x96\x7e\x4c\x28\xfb\xa5\xc8\x12\xa6\xda\xb4\x17\x8b\xd6\xfd\x04\x11\x89\xef\x35\xa2\xbc\xe5\xcb\x43\x4e\xa0\x55\xd4\xad\x84\xf5\x59\xd8\x51\xec\x46\xae\x65\xa2\x82\xbf\xf7\x82\xc8\xc5\x65\x8f\x37\x70\xd9\xe3\x31\xd5\x19\x4b\x4a\xf5\xe7\xcf\xb7\xdf\xdf\x31\x48\xf5\x0f\xb5\x12\x95\x3f\xcf\xed\xba\xf3\xba\x6e\x93\x8e\x1b\x5b\x90\x1d\xa6\x37\xcb\x49\x7a\x9d\xc1\x75\xbb\xf5\x7d\xaf\x20\x36\x58\xa1\x06\x03\x0f\x35\x47\x8f\x93\xae\xae\xf2\x58\x0a\x76\x94\x47\xce\x36\xcf\x70\x4b\xbb\x38\xa4\x56\x65\x9d\xae\xe9\x06\x3d\x9d\x7e\x3c\x7b\xb0\x8a\x36\x6b\xa6\x6e\xff\x4f\x18\xb4\xa7\x6b\xfa\x17\x18\xb7\x01\x2e\xfe\xff\x18\xba\xdc\x10\xa9\xc8\x7d\xb4\x9a\xe3\xd9\xdb\x9c\xdc\x6c\x61\x90\x02\x2e\x6c\x96\x5b\xd8\x25\x38\xb0\xd9\xe8\xea\x2b\x9b\x9f\x60\x1f\xd9\x84\x6c\xe3\x0c\x34\xe0\xb1\xd0\x62\xa3\xa2\xc5\x2f\xb2\xd2\x6d\xcc\x74\x47\x0d\x6c\x67\xaf\x41\x5d\x04\x52\xfa\x1d\xd6\x7a\x3c\x3f\xc6\xbf\xa4\x09\x65\x3f\x5d\x6b\xcb\x3c\x9e\x9f\x56\xac\x51\x76\x8c\x4f\x53\x06\x1d\x18\xb7\xe0\x18\x1f\x21\x9a\x26\x65\xa6\x4a\x4e\xd7\x34\x2b\x3e\xbc\x43\xcc\xfe\x79\x82\x28\x85\x99\x53\x92\xd0\x6b\x01\xb4\x65\x2f\xee\x62\xff\x25\xa9\x18\xc2\x0b\x4e\x07\xe6\xdb\x47\x87\xb1\x8e\xdd\xe3\x9f\x25\x81\x73\xce\x47\x7b\xf0\xab\xa0\x00\x93\x60\x21\xcf\x28\xaf\xee\x30\x80\xf0\x36\x0d\x05\xbc\x20\x2d\xd3\x09\xf8\xfc\xb9\x64\xf1\x59\x99\x82\xdf\x7f\x07\x11\x26\x18\x46\xf7\xf7\xce\xb6\x47\x51\xe5\xf9\xa8\x14\x87\x04\x0f\xfb\x28\x53\x18\xc7\x47\xf7\xf7\x03\x73\x6f\xa7\xe9\x41\x2d\x35\x71\x9b\x2c\x19\x67\x55\x04\xaa\x76\xc5\xc3\xdd\x50\x9d\x7c\x8e\x1a\x7b\x16\x9e\xea\x45\x4a\xbb\xe5\x04\x70\x7b\xd6\xdb\xca\x79\x83\x89\xba\x8d\x15\x26\xea\xa4\xc2\x3b\xf8\xb7\xe5\xab\xff\x96\x77\x95\x79\x87\x4d\xc0\xbc\xc2\x22\x97\xd6\x1f\x80\xcf\x02\xac\x84\xac\x2a\xb1\xfa\x01\x40\x76\x87\x93\x15\x4a\xe5\xa9\xdf\x09\xb8\xb8\x1a\xaa\x8a\x80\x5b\x99\x80\xbd\x50\xed\x44\x6c\x41\xfb\x35\x47\xf2\xf2\x73\x4f\x97\x9b\x34\xd4\x04\x88\x74\xaa\x0f\xaf\x39\x88\x22\x83\xd1\xb8\x46\x6c\xd7\x36\x4e\x4c\x86\x2a\x4f\x48\xc6\xcb\xc5\x1d\x4d\xbf\xce\xbf\x32\x6c\xe3\xb7\x1d\xcc\xf3\x78\x57\xfe\xaa\xc9\x9c\xaa\x08\xf3\xa6\xee\x6e\x4c\x40\x7d\xdd\xd0\xe7\x4d\xdd\x65\x99\x80\xe8\xc5\xca\x54\x06\xb3\x77\x13\xd3\x93\x00\x1c\xff\xf4\xf1\x6f\x1e\x87\xa2\xf0\xdb\x46\xe1\x8f\x08\x5f\xbf\xcd\x93\x05\x6d\xd4\xf4\x3e\xc0\x8a\x95\x04\xc7\x9c\x58\xaf\xb3\xfa\x5b\xbf\xfa\x5e\xfe\x71\xbf\xff\x44\xfc\xfd\x04\x80\x15\xa9\x30\x13\x5d\xee\x9b\x61\xe3\x3a\x3e\x98\x02\xb6\x44\x74\x5f\xd4\xae\x93\x12\x50\x98\xcf\x4d\xa1\x28\x1d\x8f\x41\x59\x61\x90\x7d\x03\xf2\xe4\x8e\x54\x4c\x12\x5a\x22\x1a\x8b\x35\x2b\x98\x02\x0c\x6f\xc0\x0f\xfc\xef\xfe\x0d\x9c\x51\xc2\x63\x95\x61\xdd\x36\x2c\xcb\x81\x51\x97\xc0\xfb\x0a\x96\x25\x29\xfb\xb5\x0a\x57\x90\xd2\x64\x01\x27\x00\x96\xa5\x96\x6a\x20\x79\xba\x8f\x67\x08\x67\x7d\x8e\x37\x18\x28\x8e\x04\x11\xc9\x8c\x6a\x5d\xdb\x8d\xe0\xe2\x47\x51\x23\x50\x86\x20\x8a\xed\xbb\xfa\x0e\x05\xc1\x7e\x9c\x64\xd9\xbb\x04\x67\x39\x2c\xfb\x16\x5d\xd5\x7a\x3b\x9c\x0d\x20\x51\x02\x10\x35\x88\x39\x33\x0d\xa6\x20\x83\x33\x52\xe1\x14\xf6\xb9\xae\xe3\xd0\x69\x6a\x29\x33\xaf\x1e\x0c\xc1\x37\x7b\x7b\x83\xba\x7f\x0c\xf8\xaf\x09\x4b\x97\xb0\x14\x0f\x27\x48\x95\x11\xfc\x26\x5b\xc0\xef\xb2\x8c\x77\xbd\xdb\xea\xd0\x80\x70\x97\xb7\x01\x44\x24\xb8\x60\x0e\x59\x13\xa8\xb6\xb4\x36\xdd\xf8\xfc\x39\x5a\xa0\x77\x38\xe5\x5d\x65\x2b\xc1\x22\xc3\xab\x7f\x86\xff\xaa\x20\x65\x75\xaf\xcb\x3a\xa3\x07\x41\xec\xab\xbe\xb2\xa3\x7c\x10\xcf\x39\x60\x2f\x56\x0f\x36\xf4\x06\xb1\x38\x17\xc3\x3d\xb8\x31\xb0\xa5\xe0\x8d\x4e\x40\x0f\x1a\xc7\xb8\x42\xf8\x57\x79\x2a\xfe\x9b\x3d\xe3\x5f\xe5\x91\x1a\x6b\xdc\xc0\x35\xc4\x6c\x08\x2a\x34\xa8\x8d\x95\xf7\xc2\x2d\x98\x82\x0a\xc5\x30\x87\x2b\x88\x59\x4c\x2a\x06\x4b\x41\xae\xaf\xba\x4a\x03\xde\x05\x00\xdf\x41\x3e\x07\xfb\x90\x30\x87\x0e\xac\x5b\x3b\x4f\x52\x46\x78\x67\x4b\xd1\x07\x71\x91\xf0\x09\xac\x3f\x88\x6f\x64\xb3\x60\x04\x6e\x3d\x94\x97\x5d\xe0\x5f\x83\xbd\x78\xef\xe5\x7f\xff\xf7\x7f\xd7\x48\x5f\xc5\x30\x49\x97\x7d\x98\xc3\x98\xbb\x5d\x84\x17\xb4\x3f\xb0\x06\x32\xca\x6e\x87\x00\x31\xb8\x1a\x58\xde\x0f\x00\x17\x3e\x86\xff\xe2\x80\x83\x38\xa5\xb4\xdf\x5b\x0a\x51\x7b\x43\x70\xf7\xbc\x57\xdc\xf6\x2c\x91\x5b\xf1\x24\x83\x7d\x29\xf0\x68\xfe\x72\xe0\x63\xde\x9b\xbf\xef\x9f\xe8\xdf\xda\x51\xb1\x12\x2d\x60\x09\x33\x70\xb3\x84\x18\x50\xb2\x82\x20\x35\xae\xee\x26\xc1\x8c\x02\x46\x80\x39\xa3\x3f\xae\x87\xa5\x80\x15\x87\x59\x6a\x73\xfd\x8a\x32\x52\xc2\x98\x56\x33\x9a\x96\x68\x06\xfb\x46\x15\xab\x8a\x89\xc4\x71\xad\x09\x34\x07\xa6\x34\x66\xfa\x92\x60\x54\xdf\xcb\x18\x18\x01\xc4\xb0\x57\x3e\xc3\xd4\xf3\x71\x79\x7c\x54\x93\x28\x92\xbb\x9c\x24\x99\x91\x15\xe6\x14\xb6\x35\x52\xe1\x4d\xcd\x58\x10\x5f\xd2\x90\x51\x57\x4b\x33\xa6\xfe\xa1\x0d\x64\x70\x53\x13\x16\x44\x7b\x23\xf7\xae\xd7\x81\x4c\xf9\xd6\xb7\xfa\xd2\xc5\xdb\x92\xac\x5e\x13\x3c\x47\x8b\xbe\x06\xe5\x1c\x71\x46\xc8\x5c\x39\x17\x1e\xdf\xc2\xf8\x5f\x3c\x32\xac\xbb\x69\x00\x9e\x4a\x8d\x67\x70\x8e\x30\xcc\x22\x6f\x6a\x6b\xc4\x47\x6a\x2e\x6d\x21\xa7\x75\x42\x21\x53\x77\x1d\x6a\x1b\x1b\x7c\x6e\x9d\x1f\xfa\x83\xfd\xfb\x21\x78\xb9\x67\x66\x86\xfb\x2d\x64\x90\x17\x17\xb6\x15\x40\x46\x57\x41\xee\x25\xa1\xed\x1b\x96\x7b\xc5\x9b\x1a\xd6\x93\x68\xc5\x88\xdc\xbe\x96\x67\x7b\x55\x33\xd2\x6a\x1c\x04\x1d\xda\xd6\x8e\xd4\x44\x1f\x7c\x42\x7a\x4d\x30\x86\x29\xd3\xf3\x52\x23\x14\x32\x86\xd5\xa4\x73\xbf\x83\x56\x73\x84\xaf\x7f\x13\x37\xc5\x7e\xe3\x30\x5b\x4a\xc9\xb1\x7e\xe4\x48\x72\x8b\x21\xa0\x64\x8f\xee\xf6\x0c\xe9\x0e\xfc\x4d\xbe\x3a\xf4\xdb\x12\x65\x5d\x5c\x7d\xd5\xef\xc5\xde\x43\x45\x62\x0e\x5d\x91\xb5\xd1\x88\x6a\x76\x47\xf5\x72\x2e\x85\x82\x3d\x93\xe2\xac\xf4\x7a\x8d\x6e\x08\xdc\xf3\xec\x07\x3c\xbd\x8e\x71\x67\x70\x4e\x4a\x78\x04\x29\x2b\xc9\x5d\x28\xd2\xb5\x1c\x78\x4a\x56\x2b\xc4\xfa\x3d\xee\xde\x7f\xc1\x54\xdc\x39\x83\x59\xcf\x0e\xe1\x3c\x48\x98\x2d\xda\x20\x2b\x7c\xc3\x23\x9b\xbe\xc5\x8b\x28\x98\xc8\x07\xac\xfc\x55\x90\x66\x0c\xf4\xd7\x49\xee\x2a\x67\x9d\xe4\xc2\xeb\x89\x93\x41\x8e\x42\x9c\x91\x58\x5f\xc3\x16\xb7\xd3\x2c\xa5\xb8\x83\xc2\x89\xc8\x8a\xa4\xa2\xf0\x47\x24\xfb\xd0\x09\x0b\x32\x1d\x33\xf3\xa5\xa2\x1d\x84\x38\x8d\xf2\x4a\x1e\xa5\xb1\x96\x7a\xce\x94\xa8\x8f\x17\x90\xbd\x23\x55\x49\xfb\x03\xf0\x1c\x44\x93\x08\x3c\x57\xa5\x27\x08\x57\x0c\x36\xcb\xcf\x60\x4a\x70\x46\x5b\x9b\x76\x32\x6a\x0a\x87\x97\x35\xac\x61\xe8\xea\xdb\x59\x54\x1a\x7b\x68\x68\xfd\x69\x5b\x63\xad\x1d\xe0\x2f\x59\x01\xb7\xdf\xd6\x4e\x68\xea\xb8\xb5\xc1\x16\x05\x04\xda\x03\x3d\x90\x30\xd0\x93\x3a\x64\xe4\x47\x92\x26\x39\x3c\x63\x25\xc2\x8b\x56\xb5\x98\x05\x6f\x58\x17\x2d\x36\x56\x8f\x79\x4d\x8a\x07\x50\x95\x58\x0b\x28\x03\x57\xef\x18\x05\x06\x9d\xc9\x73\x38\xe1\x13\x5f\x30\xc7\x0a\x69\xdf\xe1\xb1\xce\xf4\xec\x46\x8c\xc2\x72\x8d\x52\x19\x33\xf4\x34\x89\x9e\x4b\xdb\x4a\xf1\xec\x46\xdc\x42\x0c\x52\xe4\xcb\xa3\x07\x51\xe4\x88\xad\x14\x75\xb6\x31\x48\xb9\xb6\x5b\x0b\x63\xa0\x1b\xc4\x55\x9e\xef\x07\x78\x80\xb7\xac\x4c\x52\xa6\x29\xf7\x7d\x02\x26\xc1\x58\x27\x1a\x2e\x7a\x47\xa8\x94\x3e\x6f\x08\x7a\x1f\xce\x4e\x62\x79\x08\x45\xff\xfa\x88\x12\xfd\xa7\x75\x7c\xa2\x77\x35\x68\xd5\xfd\x6e\x72\x89\x73\x6a\x5f\x22\x97\x93\x38\xb5\xe5\xf2\x73\xe6\x5c\x8c\xfa\x2f\xbd\x23\xc8\xff\x3e\x5d\xd3\xb8\xae\xe1\xbf\x42\xb8\x22\x11\x1f\xfb\xbf\x43\x90\x4e\xf6\x96\x17\xe8\x33\x0d\xfc\x6f\x73\xa2\x83\xff\x30\x67\x8e\xba\x14\x5a\xe7\x2b\x5b\x55\xea\x2b\xc4\xce\x64\x37\x94\x85\xa8\x3a\x61\xfd\x5d\x9e\x93\x1b\x98\xf5\x07\x75\xe0\xad\xb4\x1e\xfd\x10\x8b\x56\xd5\x95\xf4\x1e\xc7\x3b\x3f\x3e\xe2\x2c\x73\xb7\xde\xaa\xff\xf8\xfc\xf8\x88\x3b\xff\xde\x20\x3e\x23\x25\xeb\x0f\x22\xaf\x3b\xeb\x1e\x0e\x08\x6a\xb4\xb1\xbd\xe9\x18\x41\x7f\xff\x1d\x34\x2a\x6b\xb6\x0c\xe5\x8d\xa6\xd6\x8d\xde\x3a\x98\xcf\xca\x74\xfb\x71\xdc\xca\xb4\x33\x46\xe3\x0f\x67\x27\x9b\x21\xd4\x70\xdd\x56\xae\x36\xfc\x56\xc1\x3e\xa2\x1d\x1c\xd4\xa3\x0a\xf6\x11\x25\x0f\x97\xea\x23\x4a\x6a\x91\x7c\x99\x8e\x28\xfb\x0f\xc9\x64\xb9\xd0\x87\xcb\x66\x11\x69\x1d\x4a\xef\x5f\xd1\x47\x1f\x44\xef\x5f\xd1\xcd\x10\xd2\xb7\x3d\x6c\x98\x19\xf4\x76\x57\xa8\x1c\xe9\xa3\xcb\xa6\x09\x3f\x8c\x71\x8d\xdd\xca\xb7\x7b\xfe\xe4\xd1\xb9\x77\xc9\x6f\x94\x01\x93\x72\x95\xe4\xe8\xdf\x6a\xca\x6a\x9f\x4e\x7d\xc2\x5d\x73\xfe\x1f\x21\xd7\xa3\xcb\xb3\x49\x0e\x7f\x36\x7f\x74\x89\xfc\x06\x1e\x51\xb6\x06\xe9\x56\x29\xcd\x99\x9f\x47\x17\xef\x74\xbd\xc9\x45\xd4\xb1\xd6\x23\x8a\x6e\x11\xed\x12\xfa\x0f\xef\xdd\xed\xc4\xff\x03\x6d\x20\x48\xbe\x55\x25\xd6\xe1\x9a\x47\x57\x85\x3c\x20\xb4\x05\xcc\xe3\x5b\x83\x43\xb6\x5b\xf8\x3f\xdc\x22\xb6\x57\xc3\x1f\x68\x15\x2d\x0d\x78\xaa\x71\xef\x76\x76\xad\x77\x93\xa2\x88\x21\x9e\x93\x32\x85\xfd\x48\xdd\xc1\x8c\x86\x20\x2a\x61\x92\x45\x4d\xb2\xce\xa5\xce\x87\xd0\xbd\xe1\x04\x02\x84\x9d\xbb\x98\x5b\x13\x96\xd7\x2c\x0b\x81\xd5\x42\x5d\x6d\xaa\x43\xb6\x24\x19\x35\x59\x10\x82\x7f\x22\x94\x1d\x63\x14\x8e\x1e\xad\x8c\xbe\xbb\x85\x6a\xed\x67\x0f\xc1\x0b\x2b\x85\x6f\x72\x22\x67\x67\xef\xde\x60\xf1\x5c\xe3\x26\x29\x16\x90\xc9\x5d\x8c\x8f\x49\x5e\xc1\x7e\x8f\xd2\xe5\x6f\x50\xa2\xf6\x1a\x64\xdf\xbf\x3a\x7b\x20\xd9\xeb\x57\xb4\x26\xcb\xcd\xb7\xdf\xb7\x4e\x9a\x45\x45\x49\x66\x90\x46\x57\xbc\xe6\xe2\x6a\x10\x23\x9c\xc1\xdb\xd3\x79\x3f\xba\x7e\x45\xa3\x01\x38\x9c\x82\xa6\x8c\xc7\x94\x21\xf2\x40\x76\x10\xc7\xad\x19\x72\x28\x3b\xb7\xb6\x2c\xc2\xd6\x9e\x65\xf8\x94\x83\x2c\x17\x77\xbf\xc0\x14\x7c\xbe\x37\xc5\x62\xa7\x2a\x3e\xaf\x77\xf4\x08\x65\x91\x59\x49\xdb\xbd\xd5\x1f\xd8\x29\x44\x41\x2a\xfe\x90\x88\x3c\xa9\xbd\x5f\x1a\x89\xe3\x58\xd1\x04\x44\x08\x67\x28\x4d\x18\x29\x41\xe8\x9a\x39\x86\x37\xa3\x1b\x84\x33\x72\x03\xca\xe4\x66\x24\x4d\x74\xc4\xc9\x46\x43\x9b\x1c\xc1\xaf\x73\x94\x5e\x47\x41\x35\xca\xff\x24\x99\x98\x14\x10\xf7\x73\x92\xaa\x2d\xb3\x92\x30\x92\x92\x1c\x3c\x07\xbd\xf1\xb8\x07\x9e\x03\x53\xc5\x65\x14\xc5\x19\xcc\xe0\x98\xc1\x72\x85\x70\x92\x8f\x7b\xcf\x57\x42\xa0\xe7\xa0\xf7\x0f\x79\xde\xca\x94\xf4\x9e\xa5\xab\x6c\x4a\xe9\x52\x24\x29\x65\xe1\x10\xf4\x7e\x9b\xe5\x09\xbe\xee\x0d\xe2\x39\x49\x2b\x27\xe5\x6b\xce\xad\x18\x29\x4e\x48\x45\xe1\xe9\x1a\x96\x8e\x24\x9f\xc3\x60\x15\xf3\xa0\x0c\xd0\x7d\x9d\x0e\x75\x4d\x49\x74\x88\x6b\x87\x2a\x97\x1f\xd4\x9c\x7c\x88\xcc\x1e\xc2\x0c\xad\xe0\x71\xbd\x8f\x69\x95\x81\x69\x20\x95\x21\xcf\x5a\x9c\xa9\x3d\x04\xab\x8d\xcc\x3f\x0e\xd3\xdc\xa5\xd0\x58\xbd\x21\xc8\x06\x3e\x59\x91\x61\x68\x92\x85\xdd\x64\xa1\x85\xd5\x1b\x02\xe8\x91\x95\xef\x78\x05\x35\x61\x6f\x5c\x49\xb0\x7e\x00\xf9\xb4\x0a\x3b\x42\x1f\xfb\xb4\x62\x21\xf4\xb7\x2d\x7e\xd4\x47\x7f\x8b\x1a\xe8\xf2\x71\x90\x8d\xd8\x12\xcc\x47\xd6\x0f\x56\x6c\x44\xd7\x80\x3e\x81\xc0\x0b\x9e\xf6\xae\xcf\x56\xdb\xab\xce\x89\xb6\xfd\x76\x78\x77\x57\xcc\xe7\xc0\x7d\xc5\x70\x0b\x26\x1a\x9b\xd4\xfe\x01\x3a\x87\x95\x96\x8d\x68\x97\x17\x88\x33\xfa\x2b\x62\x4b\xbb\x75\xca\xca\x21\xa0\xd5\x7c\x8e\x6e\x2d\xc7\xa4\x46\x25\x65\xa5\x99\x30\x24\xcc\x50\x94\xe5\x10\x2f\xd8\x12\x8c\x14\xa2\xfa\x2d\x37\x32\x47\x2f\xdc\x2e\x48\xb2\x4c\x1f\x06\x34\x9d\xa8\x1e\x32\x18\x02\xb1\x87\x3a\x04\xea\x7e\xbb\x35\xbe\x25\x40\x9c\x14\x05\xc4\x59\xff\xab\x7e\x74\x20\xbf\x19\x32\x3e\x8c\x06\xf1\x3a\xc9\xfb\x02\x73\x10\x27\x8c\x95\xfd\x9e\xc2\xef\xd5\x94\x3c\x3b\x50\xc5\xef\x5f\x51\x3e\x57\xd8\x73\x0f\xe3\xbf\x07\xde\x16\x91\x02\x07\x53\x10\xfd\x60\x1e\xfb\xec\x9d\x24\x38\x59\xc0\xb2\x37\x04\x5c\x89\x08\x8b\xb9\xb7\x37\x04\x72\xce\xeb\x0d\x06\x91\xb5\x9b\xa7\xb7\x81\xa9\x56\xd6\x53\x3e\xd3\x3a\xae\x7f\x4e\x4a\xd0\xe7\xcd\x21\x80\xe4\x43\xd2\xd4\x9f\x1b\x44\xe1\x05\xba\xe2\x9c\xc8\x74\xae\x2e\x78\xce\x0b\x6c\x87\x6d\xfd\xad\xd9\x7f\x3e\x05\x91\x64\x9d\x4b\x5d\xf3\x6d\x08\xc5\x9f\x08\xff\x39\x04\x91\xd8\x07\x1c\xd4\x39\x60\x9b\xa0\x32\x06\x45\x35\xdc\xb9\x6e\x12\x6b\x63\xff\x0a\x9b\x35\xc8\x35\x3c\x8f\x4a\x00\x67\xcf\x43\x6c\x31\xa9\x40\x7f\xfa\x4d\x7b\x6a\x75\x1b\x7e\xff\x8a\x36\x11\xe4\x3e\xad\x63\x2f\xca\x4a\xda\xd8\x10\xf1\xd2\xa3\x88\x2f\x2c\x69\x07\x05\x88\x96\xbf\x48\x05\x82\xc2\x17\x28\xa1\xf3\xfc\x4e\xd0\x6f\xb7\x85\x78\x29\xc1\x94\x81\xb9\xf6\xbd\x5f\xf5\xa3\xff\xea\x78\x98\xd5\xcc\xf4\x12\xcd\x1c\xda\xf1\x31\xbd\x27\x5f\xeb\x0d\x77\xd9\x50\x9c\x2e\x51\x9e\x95\x10\xf7\xfd\x73\x15\xa0\xa6\x19\x06\x7a\xe2\x0e\x74\x32\xef\x9f\x31\x52\x26\x8b\xe6\x81\x0e\x1e\x90\xf2\xf0\x2d\x57\x00\x71\x51\xc2\x39\x2c\x21\x4e\x9b\xae\xc7\x48\x08\xa6\xe0\x7f\x9e\x9d\x7e\x88\x8b\xa4\xa4\xb0\xdf\x8a\x1e\x1b\x84\x7d\xc7\xf7\x98\x62\xd7\xa5\xa8\x63\x84\xa6\xd6\x3e\x41\x38\x04\x73\xdf\xff\x88\xc3\x1f\xb5\xa1\x4a\x9d\x0d\xc1\x3c\xc6\x22\x84\x9c\xc7\xf0\x56\xbc\x1e\x81\x08\x76\xc2\xc7\x06\xa6\xd1\xe5\x16\xc8\xf7\x83\xa6\x17\xba\xb7\x17\x02\xb6\x8e\x42\x6b\x10\xdd\xf9\xb5\x6e\xea\x23\x8a\xad\xba\xe9\xd0\xcc\x35\xbc\x1b\xca\x4f\xc5\xb8\xfa\x69\xd1\x8e\x05\xbe\xdf\x0e\x6d\x69\x24\x88\x60\x9f\xa4\xb4\x78\x17\x54\xec\xf5\xa2\xbb\xb0\x71\x1b\xe1\xfe\x4d\x73\x25\x6f\x9d\x0c\x3b\x66\x34\x1e\x4b\x37\xa6\xb4\xc1\x93\x76\xda\xd2\x2d\x98\x06\x92\x3c\x8f\x86\x7c\x91\xb9\xbf\x3d\x8e\x3a\xbf\xc0\xf1\xa2\x34\xaf\x28\x83\x65\x24\x8a\xf5\x03\x0f\x9c\xf1\x64\x05\x69\x91\xa4\x82\x7b\x1e\x80\xf3\x7f\x0b\x92\x45\x57\x96\xba\x5a\x1a\xb2\xb4\xec\xb6\x65\x37\xa0\x69\x6d\xcd\x75\x06\x8b\x9c\xdc\xad\x20\x66\x3e\xe3\x4e\x4d\xf4\x89\xcc\x3a\x05\x10\x89\x98\x22\x47\x69\x42\x65\x82\x43\xfd\xe2\x56\xa7\x5c\x72\x2e\xe9\x8a\xb3\x0a\xf3\x2a\xe7\x70\x3b\x8a\xed\x31\x1b\xe4\xf0\x81\x5c\x6c\xad\x30\x0c\xd9\x0d\x29\xaf\x77\xe8\x66\x89\x50\x90\x1c\xa5\x77\x0f\xec\x6f\xbb\xd1\x56\x7a\x5b\x8b\xa0\x8e\xb5\x74\x8a\x00\x71\x56\x10\x84\x19\xe5\x3f\x10\x5e\x70\xef\xb6\x9d\x68\x56\x03\x3b\x4a\x69\xf3\xd5\xd6\xbe\x4d\x7a\x7b\x81\xe5\x6c\xb3\x7d\x9f\x15\xb0\xa4\x88\x32\x88\xd9\x9a\xe4\xd5\x2a\x58\x96\xe6\x09\x5a\xd9\x42\xcb\x46\x64\xd6\x65\x57\xc9\x6d\x06\x9d\xf1\xfc\x18\x8c\xec\xe0\xc2\xf8\xd4\x13\x50\xd3\x1c\x2d\x56\x49\xb1\x41\x67\xba\xef\xd3\x72\xf7\x91\x6d\xb7\x6c\x37\xd7\xa0\x16\x9a\x41\xec\x24\x5f\xd7\x1c\x52\x87\x98\x5f\x30\x9c\x95\x98\x6b\x54\xb2\x2a\xc9\x6b\x93\x8d\x16\x09\x83\x37\xc9\x5d\x87\xe4\x56\xfb\x6d\x83\x7b\x07\xea\x4e\x1c\xa1\x56\xd4\xbf\x99\x98\xb3\x33\x98\x70\xa1\xdd\x88\xc2\xad\x6b\x28\xd3\x49\x21\x80\x69\x1d\xc0\x5c\xb8\x88\x57\x6e\x0c\xd7\xc4\x1d\x84\x8e\xe3\x82\x69\xa0\x95\x4e\x81\xed\x68\x79\x2b\x99\x0d\x42\x58\x6c\xeb\x04\x7e\x58\x72\x3b\x99\xd1\x14\xde\xa0\x77\xc8\x6f\x28\x78\x2a\xb0\x29\x07\xe1\xc3\x07\x30\x09\x76\xbf\x72\x61\xa7\xea\x86\x40\x9e\x2d\x7e\xeb\x75\x26\xd7\xa0\x38\x16\x0c\x60\xcc\x92\x72\x01\x59\x2c\x82\xb6\x7d\xab\x9e\x53\x14\x29\x47\x03\xb2\x80\xec\x3b\xc6\x4a\x34\xab\x18\xec\x47\x7a\x11\x52\x63\x90\x82\xf1\x38\x36\x23\x69\x25\x6e\x21\x2d\x20\x7b\x23\x2f\x19\x7d\x7f\x77\x9c\xf5\x25\xc1\x81\x5c\x82\x7c\x20\x59\x1d\xe7\x5b\xe9\x83\x29\xd8\xdb\x07\x08\x1c\x08\x62\x2a\xe1\xb0\x0f\xd0\xf3\xe7\x76\x7f\x70\x8d\xf2\xfa\x0b\x74\x25\xf9\x16\x29\x73\xe7\xd8\xa9\xea\x36\x23\xbb\x81\x77\x85\x50\xab\xb1\x68\x10\x0c\xd4\x5d\x35\x87\xbe\xf3\x13\xce\x8b\x36\xd6\x85\x96\x19\xf9\xdd\xc5\x3b\xc9\xd0\x68\x2c\xaf\x83\x87\xd6\xc1\x54\x2f\xa6\xf7\xbb\xc0\xfc\xb3\xed\x8d\x04\x6f\xcb\x67\x52\xfe\x64\x99\x6c\xb3\x0f\x8b\xd5\x99\x11\x6c\xc8\xd5\x72\x9e\xbd\x3d\xf1\xea\x9d\x45\xaf\xcf\x5c\x87\x4e\xa2\x77\xd4\xd6\xc7\xa8\xf7\x1c\x18\x2f\x41\x1e\x40\xe9\x0d\x5b\xa9\xb9\xdb\x00\xfa\x62\x63\xeb\x59\xef\x61\x28\x9d\xbb\x51\x41\xdd\x27\x3c\x9d\xcf\xd1\xd5\xb7\x9a\x3b\x2f\x12\xd4\xba\x90\xf9\x17\xc8\xf4\xd5\xd9\xef\x66\xd4\x3b\x65\x1f\xbc\x5e\xb0\x1d\x31\x75\x93\xda\x3f\x9b\xfe\x17\x55\x7c\x53\x0b\x9e\xe2\xad\xa1\xc6\xa4\xb9\x35\x2f\x50\xd4\xdd\x62\x99\xed\xa0\x01\xdf\x04\x71\xd3\x3c\xbe\x18\x7e\xf2\x86\xe5\x5a\xdd\x36\x54\x4c\x8b\x9c\xab\x72\x62\x5f\x94\x64\xa2\x42\x5f\xcf\x60\xf9\xc5\x9e\x13\x74\x8a\xe6\x72\x9d\x3b\x3e\x04\x2f\x06\x06\x43\x5f\xdd\x60\xf9\xc5\x8b\x4e\x9c\x97\x35\x8e\xbe\xd6\xc1\xf2\x8b\x97\x81\x60\x48\x9f\x55\xe0\xd0\xde\x85\x8e\x40\x37\x98\x9b\xf8\x2d\xc9\xbd\x52\xd6\x9f\xb1\xd2\xd7\x86\xc2\xb4\xa7\x3f\x3e\x57\xd6\x08\xf1\x4a\x5c\xdf\x19\xf7\x2f\xb3\xe7\x83\x4b\xfa\x75\x36\x76\xe6\xca\x65\x27\xf0\xd2\x05\x5e\x75\x02\xaf\x5c\x60\xda\x09\x4c\x5d\x60\xf1\xa4\x9b\x72\x6d\x7b\x4e\x3c\x34\xb0\xea\x9e\x4f\x81\xc8\xdd\x1d\x63\xd6\xcf\x78\x57\x81\xaf\xc1\xab\x6f\xff\xb6\xe7\x60\x2c\xdb\x30\x96\x0a\xe3\x9b\x6f\x5d\x84\x55\x1b\xc2\x4a\x21\x7c\xeb\x80\xd3\x36\x70\x2a\x8d\x47\x19\xa3\x25\x50\xfd\xf7\xd7\xe2\x04\x84\x2d\xb8\x3a\xb2\x72\xee\x0f\xb3\xe6\x2d\x20\x0e\x9d\xc8\xe1\x6a\x43\xda\x04\x46\x75\x53\x03\xef\xd0\x8c\xc2\x6c\xb3\xc5\xc0\x8c\xbd\x53\xa6\xb9\x79\xd3\xc8\x0f\xf5\x1e\x73\x7d\xb0\x69\x85\xf0\xe5\x39\xcd\x86\xff\xdf\x65\xa1\xd1\xc8\xb0\xb6\x69\x07\xfc\xfe\xbb\xda\x6b\x54\xdb\x88\xfd\x00\xd0\x10\x44\x83\x68\xd0\x48\x6a\x3b\x1b\xaa\x2e\x46\xcd\xc9\xa6\x8c\xbf\x7a\x4d\x40\x6e\x04\xf6\x06\xea\xaa\x6b\xf8\xf2\xa8\xe5\xb0\xeb\x58\x37\x10\xee\xf9\x09\x6f\x8f\x53\x78\xcb\x9c\xcc\x74\x20\x3b\x0b\xea\xc3\xc6\xe7\x0d\xf5\x2b\x09\x5d\xd0\x96\x19\x56\x62\xf9\x93\xab\x33\x27\x82\x47\x99\x59\xfd\x20\x3d\xf0\xdd\xb7\xed\x86\x53\xc0\xf2\x14\xbe\x3a\x9a\x71\x7c\x24\x56\x65\x81\xeb\xd3\x76\xe2\xdd\xee\x76\xa2\xbe\x1b\x27\x9f\x28\x88\x72\x38\x17\x19\xc9\xbd\xc8\xcf\x0f\xb4\x7e\x27\x6e\x0a\x58\x59\xaf\xc9\xee\xed\x27\x3a\xcc\x79\xb4\xc0\x67\xec\x36\x44\x73\x2d\xe2\xd9\x72\x04\xce\xa4\xb4\x61\x85\xfb\x21\xf0\xfd\xbc\x20\x57\x5f\xf5\x7b\xe2\xe3\x8a\xbd\x41\x3c\xcb\x2b\x2b\xa8\xdf\x46\x93\xa3\xbf\xff\xed\x9b\xe2\x36\x72\x03\xb5\x0e\x65\x8a\xd7\x6c\x5c\xf5\x99\x95\xc5\x59\x35\x13\x17\x5a\x27\x8d\x75\x0b\x5f\x6c\x6c\x34\x1c\xb1\x76\x35\x83\x43\x0e\x0d\xcd\xbe\x5c\x86\xd9\xd4\x8c\x9e\x63\xb6\x84\xb8\x36\x25\xf1\xda\xb7\x33\x8a\xc5\x41\xca\x39\x29\xdf\x88\xfd\x1c\x0d\x47\x17\xfe\x58\x1f\x8f\xad\x37\x25\x8c\x03\xe0\xab\x6a\xb1\x21\x4f\x17\xb1\x58\x6f\xfb\x68\xca\x00\xfd\x13\x3c\x5a\x29\xbd\xa1\xc1\xe4\x2b\x67\xab\xb7\x75\x9f\xfb\x4c\xc0\x6c\xd1\xc5\xc4\x1b\x5e\xfd\x20\x26\x04\xe6\x36\x4c\xc8\xa0\xe6\x08\xf2\xf0\xf5\xe2\x6a\xff\x49\x1b\x33\x56\x93\xf2\xf2\xa4\x69\x30\x3b\x3e\x0a\xf0\x28\x7c\x3f\xa9\x70\xe6\x1a\x92\x47\x9b\x43\x7d\xea\xd6\xb8\x95\x0f\x6a\x6f\x5f\x9c\x93\xe0\x6e\x5e\xab\xff\x93\x90\x3c\x40\x0c\x18\xae\x6c\x5f\x61\xff\x37\x2b\x61\x72\xdd\xac\xb8\x7f\xd2\xfd\xbb\x21\x4f\x4b\xe7\xed\x2a\x8f\xec\xc9\x3f\x5f\x1e\x11\x0b\x08\xda\xa1\x66\x85\xc9\xc4\x45\x45\x97\x5b\x88\x32\xf0\x5b\xbf\xef\xb2\xc8\xda\xe8\x44\x23\xdb\x99\xbf\xf5\xfc\x08\x9f\x46\x39\x62\xb3\x61\xbb\xd9\xfb\xc0\x7e\x6b\xc3\xcb\x59\xf9\x93\xee\x49\x22\x1c\x17\x99\x4c\x4d\x38\x34\x82\xb7\x45\x23\x30\x6a\xe4\x2e\x5b\x96\x9f\x7a\x89\xff\x74\xda\x38\x5b\xa4\xc8\xf2\x7f\xe2\x12\x8a\x6f\x18\xf7\xc7\x8b\x31\x1a\x82\x68\x11\x27\xac\x6f\xae\x86\x86\xe8\x3d\x17\x9c\xda\x21\xa2\xc3\x32\x86\x37\x96\x4e\x54\x2b\x1c\x29\x3e\xab\x66\xf2\xa9\x31\xfb\x20\x91\x7b\x3e\x4d\xcf\x19\x7d\x97\x4a\x7b\x62\x43\xcc\x12\x19\x35\xef\x70\xb4\xda\x58\x4c\x73\x94\x3a\x8f\x26\xb8\x07\xac\x50\xe6\x0d\xc4\x50\x30\xe6\x9a\x10\xca\x3c\xcb\x0d\x67\x39\xbd\x79\x5e\xbe\x90\xd2\x72\x74\xba\x2d\xa4\xd0\x48\x0f\x0b\x2d\x9a\xd8\x7e\x6e\xa7\x25\x36\x48\xb2\xec\x75\x9e\xf0\x00\xc1\xaf\x54\x5f\x11\x81\x8d\x6b\x02\x5e\xd3\xaf\xad\x47\x0c\x9b\xe2\x8e\xc7\xe0\x26\x41\x0c\xbc\x04\x14\xa6\x1d\x01\x63\x43\x80\x87\x07\x8e\xf2\x84\xce\xb6\x52\x89\x10\xf1\x65\xf3\xa4\xbf\x7e\x78\xa6\x3d\x03\x6a\x5e\x6f\xf4\xdc\xae\x7d\x2e\xd5\x3c\x5f\xe3\x62\x34\x34\xea\x7c\x17\xc6\x6a\x12\x8b\x2b\xf7\xa1\x13\xaf\xfe\xb7\x64\x04\x64\x88\xac\xf7\x51\x4e\xe7\x9c\x98\xac\xe9\x6a\xc0\xff\xa4\xa7\xc1\x71\x9b\xf2\x2e\xb8\xd8\x67\xfb\xd5\x0d\x19\x3b\x16\x94\x65\xaf\x49\x71\xe7\x1e\x72\x12\x7f\x52\xf1\x70\x06\x9a\xdf\x69\x54\x27\x89\x57\xa3\xc6\xe2\xb5\x66\xf0\xec\x99\x45\x4e\x5c\x9c\xe1\x45\x7d\xbf\x6c\x04\x7c\xcc\x01\x38\x74\x9d\xe6\xac\xe0\x4e\xe6\x24\x61\xcb\x78\x9e\x13\x52\xf6\x5f\xec\xed\xed\x81\xaf\xc1\x2b\xf0\x35\xe8\xdb\x04\xd5\xdb\xd0\x7c\x3d\xbc\x37\x00\xcf\x9d\xc6\xce\xed\xba\x01\x18\x6f\xc5\x89\xe5\x60\xea\xba\x8b\xe8\xfb\x04\x67\xe2\xc1\xb5\xe8\x0a\x4c\xc1\x4c\xff\x3a\x27\xea\x6d\x91\x59\x41\x9b\xa9\xbc\x0b\xf9\x8a\x75\x6f\x08\xc4\xab\x0a\xbd\xab\x66\x24\x7c\xed\xef\x0a\x59\x8d\x5e\x5f\x89\xdb\x13\xe2\x3c\x1b\x70\xcb\xc5\x7b\x1e\xb8\x5a\xcd\x60\xd9\x73\x1d\xa9\x07\x57\xa7\x7b\x9c\x8a\x81\x79\x1b\x45\x65\xd9\x9c\xf7\x51\x2c\xdf\xea\x67\x83\x6a\x2a\xde\x0c\xed\x3e\x35\xe1\x1a\x9d\x7c\x63\x02\xc0\xdb\x34\xaf\x32\x6f\x47\x66\x25\x6e\x83\x6d\x30\x3d\xf9\x19\xa1\x41\x63\xb7\x6d\x8e\x60\x9e\x01\x32\x6f\x92\x96\xc4\x8b\x84\x2d\xc5\xd2\x1f\xe6\x99\xca\xfc\x46\x71\xe4\x3f\xf4\x53\x12\xc2\xc0\x54\x72\x32\x04\x45\x09\xd7\xf2\xff\xef\xe1\x5d\x70\xfe\x32\x3b\x7c\x9c\x7c\xdb\x0e\x9f\x24\x7d\x0d\xf9\xb0\xe2\x70\x17\xe8\x6a\xdf\xcb\x88\x20\xd1\x8d\x16\x11\x30\x02\x2f\xfc\xe8\x2a\x13\xef\x4b\x0a\x1e\x2f\xae\xe1\x9d\xbf\x20\x18\x8f\x81\x7c\xfc\x9a\xc7\x48\xec\xce\xa9\xe3\x6d\x9c\x8a\xca\xf8\x1a\xde\xd1\x3e\xa7\x31\xd0\x4d\x4d\x65\x9c\xa2\xc8\x73\x71\x2f\x94\xcc\x57\x6e\x8c\xd6\x88\x56\xed\xa0\x8d\xa3\x80\xa9\xe0\x6e\xdf\x2b\x7e\x2f\x44\xbf\xe6\x3a\xb4\x6a\x94\xae\x2d\x71\x5c\x7e\x9f\x0a\x26\xfd\x46\xef\xbd\x09\x54\x1b\x23\xef\x31\xdb\x0e\xf9\xff\xef\xf7\x9f\x3c\xe1\xaa\x17\x9f\x1d\xe3\x9d\xaf\x0d\x91\xdc\x60\x58\xca\x13\xb8\x52\xc9\x72\xb9\xcd\xa7\x0c\x51\x15\xa3\x6c\x5f\x97\x8a\x02\x5d\x61\x4a\x57\x90\x0f\x38\x7d\xed\x49\x15\xca\x07\x23\xad\x8b\x2d\x72\x7a\x51\xa7\x54\x5d\x58\xa6\x1e\x31\x13\xef\x94\x71\x46\x05\x93\xf2\x82\x91\xaa\x13\x7b\x28\x14\xb2\x9f\x04\x59\x6b\x1c\xc9\x76\x9c\x57\xbb\x4c\xd3\xf2\x8f\x7d\x73\x05\x2f\xc9\xb2\x13\xc1\x6b\xcb\xf4\x65\x4b\x73\x81\xe5\x77\xdf\x84\xb3\x50\x4f\xf9\x48\x2a\x19\xcc\x3b\xa9\x28\xdb\x09\x12\xdb\xf7\x7a\x43\x7c\x95\x78\x6a\x3f\x91\x39\x04\x4b\x42\xd9\xd0\x5c\x44\xf3\xfb\xc4\xea\x0d\x71\xcb\x6a\x2a\xe0\xad\xbe\x50\x17\x49\xa7\x86\x02\x77\xf4\x96\xb2\xc5\x52\xde\xd5\xff\x42\xd9\x84\xec\x2a\x1b\xf0\xe5\x4f\x6e\x37\x72\xbe\xc5\x6d\xd0\x46\xdf\xd8\x1f\xb4\xf3\xee\x2e\x68\xc5\xd8\xd7\x4d\x65\x93\xfa\x16\x9c\xfc\x90\x9b\xb2\xae\xa9\x0c\xa3\xc5\x1c\xf9\x54\x34\xf1\xfb\xef\xc0\x3c\xf1\x68\xc1\x0b\xda\x75\xbf\xf8\x0f\xd1\x04\xc2\x22\x91\xf2\x97\xb5\xe2\xb8\x0e\x98\x8a\xd3\x86\xfa\x2c\xce\x1a\xb2\x25\xff\xd7\x7c\xad\x47\x1c\xd0\x81\x18\xae\x65\x75\x9e\x60\xfe\xef\x8c\xe0\x4c\x81\x15\xa4\x64\xce\x6d\x3a\xf7\xbf\x48\x7c\xf3\x01\x27\x39\x07\x67\x95\xc4\x36\x94\xd7\xb7\x8a\xe0\x42\x5e\x4c\x5d\x94\x90\xc9\xd3\x51\x59\x91\x5d\x0b\xd2\xca\x11\xe8\x3d\x07\x8b\x75\x73\xe9\xc5\xe9\x76\x71\xcf\x50\x5e\x99\xf4\x4d\x8d\xaf\xcf\xbb\x4d\x6d\x08\xa8\x78\xbd\x65\x08\xe4\xb9\x90\x1d\x4d\x4f\x22\xf3\xa0\xd8\xbc\x01\x23\x47\xb7\x20\xc6\xc7\xb7\xf8\x63\x1b\x53\xe5\x63\x5d\x10\x91\xd6\x7a\x21\x87\xa1\x4e\xcc\xa9\x53\x2b\xcd\xaa\xda\xc7\xc9\x77\xa5\x8d\xac\xd6\xb3\xd2\x04\xbf\x29\x4b\x52\xbe\x4e\xf2\x7c\x96\xa4\xd7\x96\x8c\x06\x08\x4c\xeb\xa7\x0a\x6b\xd7\xe7\xe2\x71\x27\xe8\x96\xd4\x03\x47\x64\xec\xdc\x11\xd6\x36\xe8\xac\xbb\xa2\x52\xaf\xf2\x39\x44\x5a\x27\xb9\x4c\x2e\x1d\x3a\x19\x2a\x19\x06\xa3\x75\x9d\x4c\x7e\x02\x9c\x27\x45\x4c\x82\xbf\xd7\xab\xeb\xba\x5e\x60\x34\x0d\x35\x5e\x50\x96\x11\x46\x93\xc0\x11\xa2\x69\x80\x06\xc2\xeb\x24\x47\x19\x5f\xfc\x6e\x24\x71\x42\x17\x1a\xb7\x27\x7a\x4d\xef\x2d\x14\x25\x49\x21\xa5\xa2\xec\x44\xbe\xee\xed\x52\x93\xd3\x84\x78\xaa\xd0\x77\x45\xf5\x6b\xd2\x96\x0b\x50\x9a\x75\x5c\xbd\xd6\xb6\xcc\x0f\x69\x88\xda\xa3\xc8\x65\xda\x46\x5a\x22\xfc\xe1\xa3\x51\x27\x00\x0c\x5d\x3d\x46\x6d\xd2\x2a\xc8\x11\xf0\x87\x60\xf4\xc2\x5b\xda\x18\x5c\x1e\x97\xa5\x50\x02\x0e\xc1\x8b\xc6\xb3\x7a\x98\x30\x34\xbf\x53\xcc\x51\xe7\xcd\xe9\x21\x58\xbf\x18\x82\xf5\x4b\x87\xc1\x21\x58\x4a\x12\x2a\x6f\xe5\xf3\x5a\xc7\x5a\x3c\x8a\x3b\x94\xd1\xdc\x68\x54\xb3\xb7\xf4\x51\xac\xd8\x8d\x95\x77\x5e\x8c\x99\xd6\x03\x65\x79\x11\x11\x1c\x3d\x9f\xa3\x92\xb2\x5f\x8a\x02\x96\x69\x42\x61\x1f\xae\x07\xde\x59\xba\xd4\x19\x93\xfa\x3f\x5d\x2a\xbb\x7f\x39\xe8\x2b\xd9\x02\x61\x10\x48\xc5\x9e\xb8\x13\xef\xaa\xef\xd1\xc6\x39\x59\xf4\xa1\xbf\xab\x61\x47\x06\x62\xfa\x9a\x74\xc4\x45\xfa\xde\x9d\x9a\x2b\xc5\x9b\xf5\xa4\x2a\x1c\xc0\xfd\xda\xb8\xe4\xf8\xbe\xd0\x31\xd4\x95\x38\x05\x45\xaa\xc2\x7e\x59\xd8\xed\xc3\x7e\x4f\x00\x88\xd7\xd5\xc5\x3d\x41\x52\x15\x3a\x28\x37\x17\xdc\x04\x05\x8b\x6d\xef\x7d\xc2\xb6\x00\x42\xa5\xc5\x64\xb8\xc1\x79\xe7\x78\x21\xe8\x7d\x9b\xbb\xcc\x38\x58\x19\x02\xb5\x73\x8e\xf5\xb3\xf0\xbd\x21\x50\xeb\x7c\x9b\x6f\x37\x82\xaa\xc4\xbb\x11\x01\xce\x7d\x9e\x5d\x36\x42\x33\xc6\x26\x9e\xe4\x13\x15\x99\x76\x2b\x86\xd6\xc0\x89\xe7\x3c\x56\xec\x68\xce\x4d\xd0\x89\x38\x0e\xba\x09\x73\x26\x6f\xbe\xe6\x7c\x82\xed\xd7\xde\xbe\xce\xca\xa9\x85\xef\x78\xac\x1c\x0a\x37\x76\x19\x18\xf2\x35\x5a\x22\x3b\xd5\x78\x06\x6c\xbe\x6c\xeb\x86\x47\x2a\x88\xb4\x42\x25\x6e\x55\x1e\x1b\x1d\x90\xb1\x89\x5b\x9d\x44\xcc\x93\x96\x86\x7d\x12\x22\xf8\x0a\xe4\x7a\x32\x98\xcb\x61\x50\x23\xb8\xa4\xed\x70\x58\xaa\xbf\x0e\x86\x4d\xdb\xf6\x2c\xf7\xec\x19\x68\x79\x4e\xb3\xa3\x4a\x44\x28\x92\xc1\x18\x59\x3b\x01\xdb\x3c\xe0\x7b\xbf\xc1\x86\xd4\xb7\x0c\x6a\xcb\xd6\x96\xb3\x80\xec\x03\x44\x8b\xe5\x8c\xf8\x6b\x01\xd7\x6f\xd4\x36\x94\xb5\x19\x91\xc8\xb3\xcb\x08\xad\xae\xbe\x50\x2b\x06\xad\x25\x5e\x68\xc2\x2c\x25\x2d\xd7\x89\x28\x57\x51\xd1\xca\xfb\xf8\xe4\x54\x71\xa2\x06\xa2\x45\xa2\x41\x59\x07\x6a\x3e\x65\x15\x8a\x6d\x43\xb9\x0e\xf1\xb4\x8f\x55\xb5\xe6\xa6\xa1\xa3\xbd\x73\x01\x4e\x5b\x86\x9e\xd8\xf2\x93\x10\xf6\xa6\xdf\xe6\x11\x29\x94\xe9\x69\xd2\x55\xa4\xaf\xc5\x7a\xeb\x56\xb7\x28\x63\x02\x2d\x91\x37\x71\xe8\x95\x8c\x04\x75\x5c\x89\x3f\x8d\xc8\x11\xa1\x58\xe3\x6d\xcb\x31\xa5\x97\xad\x6a\x74\xd8\x85\x66\x91\x7c\x21\x4b\xeb\x91\x22\x13\x93\x7a\xb1\xad\x72\x18\xe2\xec\x08\x55\x64\x55\xed\x60\xdf\xd7\xd4\x54\x23\x6e\x9e\xe7\x15\x4b\x7a\xe9\xaa\x35\x27\x25\x77\x9a\xb1\x7b\xc5\x1e\xe6\xca\x0b\xf9\xec\xb7\x4f\x79\xf5\x08\xab\x1d\x88\x3b\x31\x37\x56\xdc\x02\x70\xe8\x78\x24\xd9\x9e\x59\xe4\xdb\x6e\xae\xbd\x69\x09\xeb\xcc\xb9\x8d\x71\xae\xbb\x75\x7b\x26\x82\xbe\x76\x13\x13\x9e\x16\x1a\x6c\x98\xf4\x47\xd0\xc6\x86\xc0\x4d\x85\x7c\xa1\xad\xc9\xdf\xa6\x49\x9d\x67\x91\x92\xb4\x22\xd7\x41\x4e\xab\xc0\x12\xf7\x0c\xb2\x70\x6f\x7b\xaf\x23\x6f\xbb\x4a\x6d\x3b\x49\x67\xfb\x55\x78\x23\x16\xc1\xdb\xd0\xb4\xf8\xb7\x97\x99\x50\xbc\xc0\xdc\x2e\x1b\xd4\xdf\xcf\xe9\x0d\x05\xac\xf5\x65\x11\x75\xb3\xd3\x9b\xec\xa1\xf3\x1c\xe7\xcf\x30\x17\x37\x1a\xeb\x43\xd9\x62\xea\xa5\x4b\x54\x44\x7c\x69\xec\x42\xd7\x50\x22\x31\xe1\xba\x3f\x1d\xa6\xda\xe3\x51\xf9\x71\x6f\x52\x79\xea\x78\x28\xe3\x77\xe5\x7a\x6a\x07\xfe\xfe\xe1\xfc\x9a\xa8\xdc\xc7\x3c\x49\x61\xb4\xff\xa4\xce\x75\x3a\x8c\xe9\xd1\xdd\x37\xea\x97\x41\xb4\xb3\x2c\x50\x6c\x37\xd8\xf4\x02\x10\x35\xde\x6c\x68\xdd\xad\xcd\x53\x88\xee\x50\xea\x3b\xd0\x4e\x10\x03\x9c\xcc\xae\x0d\xe0\x9a\x3a\xb0\x5e\x2d\xb0\xd9\x09\xf3\x61\xb6\x42\xc6\x63\x65\x71\x00\x51\x80\x98\xb0\x5f\x44\x75\x4c\x08\x98\xf8\x0a\x0d\x64\xfc\x0f\x45\x03\x24\x02\x50\x0d\x41\xab\xc7\xd9\xc2\xeb\x6e\x15\x10\x78\xdd\xcd\x16\x22\xac\x5c\xe8\x2c\xe9\x53\x25\x46\xe3\xd4\xbf\xa7\x57\x25\x88\x37\x1d\x86\xd5\xc9\x16\xf6\xd0\xf6\x05\xce\x08\x5f\xbb\x82\x74\x99\xe0\x05\x14\x92\x49\x61\xc9\x5c\xfc\x50\xfa\x10\x62\x82\x94\x54\x79\x06\x66\xd0\x68\x44\x98\x98\x6d\xbd\x5a\x4a\x2b\xfd\xe8\x5e\x15\xd4\x77\x9c\x76\xee\xb3\xc6\xcc\xef\x66\xd9\x61\xfd\x1a\xbb\xb7\xb0\x09\xb8\x30\x7f\x61\x23\x52\x00\x22\x18\xac\x7d\x8c\x17\x58\x1b\xbf\x13\x5e\xf6\xb8\x0d\xab\xe5\x87\x9d\x05\x10\x2f\xbc\x7f\xfe\xf3\x3c\x8d\x1d\x2a\x3a\x4a\x36\x13\xd1\x96\x26\x66\x05\x92\xbe\x2b\xe8\x0a\x79\xec\x1d\x9c\x17\xdc\xc6\xeb\x24\xb1\xe4\xbd\xf6\x47\x1d\x5e\xa4\xdf\x36\xf8\xef\x03\x6b\x1a\x5b\x64\xd9\x5d\xa2\xc4\x8c\x38\x1b\xcc\x49\x5a\x06\xc1\xac\x5e\xaf\xeb\x05\xc0\xd6\xdf\x16\x09\xcd\x47\x75\x54\xa1\x66\x24\x93\x2f\x37\x79\xba\xb6\xcf\x9f\x34\xd3\x8e\x1a\xd3\x79\x6c\x6b\xe1\xa4\x18\x86\x00\x0e\x01\x72\x52\x4d\x08\x83\xc6\xb1\x39\xcc\xc7\xa2\x39\x83\xe8\x1c\x4c\x50\x59\x8d\x3e\x8e\x8f\x8f\x86\x00\xc7\xef\xc4\x5c\x8d\xe3\x13\x27\x4b\xdc\x58\x5c\x27\x59\x06\x44\x8e\x09\x18\x5b\x16\x6f\xb6\x01\x46\x40\x09\x69\x01\x53\xe9\x47\x49\x89\x16\x08\x27\x39\x20\x65\xa6\x7c\x89\xcd\xa7\x77\x1c\x4e\xdc\x5e\x33\xc7\x14\xdd\x45\xc4\xc9\x36\xc3\xc9\xdf\xc9\x7e\x6a\xad\x84\x61\x2c\xdd\xe6\x55\xfd\xa6\xa7\xae\x78\xcd\x63\xab\xab\x81\x9d\x08\x23\x98\x21\x5c\x41\xff\xac\xb6\x0a\x9a\xfa\x50\xa8\x0b\x2a\x75\x41\x4f\x5d\x4e\x02\xc4\xb4\xeb\x95\xaa\x46\xfd\x2c\xd9\xe3\xeb\xe8\xe9\xff\x73\x3a\xb2\xc7\xc6\xdb\x92\xac\xce\xee\x70\x7a\xa2\x3f\x4b\x59\xef\xfa\xd7\x47\x7c\xc3\xc1\x71\x09\x8f\x31\x62\xce\xa0\xf6\x47\x61\x5d\x93\xea\xef\xf9\x18\x2f\xbf\xa2\x8b\xf8\x8c\x25\xac\xa2\x7c\x62\x7f\xb9\xb7\x17\x38\xd5\x15\xdc\x01\xb1\x74\xe5\xd5\xf7\x7b\xbf\x88\x1b\xf8\x7c\x18\x2d\x54\x28\xa2\x8f\x2c\x0d\x41\x91\xc3\x84\x42\x90\x2e\x61\x7a\x2d\xaa\xfc\xab\x25\xee\xde\x74\x33\xe1\xc2\xf5\x25\xd8\x3e\x9d\x7d\x6a\x7c\xeb\xd1\x3b\xb8\x14\x56\x99\x7a\x45\xb5\x67\xb9\x36\x1e\xdd\x8b\xcd\x01\xf3\x19\xca\x3a\x77\x4f\x28\xdb\xc2\x5f\x85\xa6\x65\xf3\xcc\x5d\x38\xa5\x20\xf7\xc4\xa6\x72\x57\x2c\x34\xd7\x49\x0b\xdc\x34\xba\x6a\x63\x73\x9d\xa5\x9d\xbf\x74\x5a\xc6\x9b\x5b\x96\xee\xb4\xd5\x66\xb9\xaa\x3b\x8c\xd4\xeb\x22\x8d\x65\x3e\x11\xd5\x36\x7d\xa8\xed\x29\x6f\xf2\xb0\xb6\x98\xec\x7d\x62\x24\xde\x5b\x72\x2e\xbc\x88\xab\xe7\xb3\x4f\x66\xdb\x4c\xd9\xb0\x73\xa9\x31\xd8\x10\xff\x8f\xcc\x3e\xc5\xfa\xba\x98\xb9\xcf\x17\xfa\x0c\x9c\xb3\x89\x06\xdc\x94\xa8\x7f\x13\x8a\x13\xd5\x4f\x89\xb9\x17\x68\xc2\x67\x4b\xbd\xf6\xfe\xac\x07\x1d\xbe\xfc\xb2\x56\x50\xd0\xb6\x8b\x5a\x6d\xe7\x6a\xef\x7d\x75\x06\xa8\xea\x1d\x7d\x67\xd7\xb2\x96\xc5\xf5\x1a\x00\xb4\xec\x71\x36\x08\xdb\x09\x33\xca\x17\x46\x9f\xa3\x0f\xe6\xb1\x8f\x09\x88\x04\xab\xd1\x10\x44\x7c\x36\xe2\x05\x67\xb5\x55\xf2\xe2\xd3\xd9\xa7\x68\xc2\xc9\xda\xdf\xaa\xad\x77\x2e\x29\xc4\x99\x18\x26\xd6\x68\x68\x6e\x58\x86\x87\x94\x76\xd3\x6a\x1e\xd4\x4d\x17\xf9\x5d\xa4\x8e\x3c\x18\xab\x34\x13\x9e\xf4\x85\x03\x50\x2b\xc6\xde\xd6\x8a\xce\xae\x51\x51\x20\xbc\xd0\xdf\x41\x16\xaf\xf3\xe9\x36\xbc\xa3\x6a\x8e\x8d\xeb\x3d\xa1\xa1\xb5\x9a\xa1\x37\x88\xa5\x4b\xc3\xa2\xd5\x24\x77\xf4\x16\xb7\x13\xd7\xcd\x04\x26\x3e\xa3\x22\xf9\x9f\x3a\xbd\xd4\x20\xe7\x53\xe2\xd2\x6e\x81\xfa\xce\x73\xf2\x3e\x19\x7f\x12\x70\x5c\x58\x3b\xd9\x0f\xf5\xae\x91\x4f\xb1\xde\xb7\xd2\xb4\x44\x38\xa1\xff\x3e\x71\xf7\xd0\xba\x1a\x10\x49\x22\x8b\xbc\xda\x98\xb3\x7c\x7c\xdd\x80\xb7\x4b\xfa\xd4\xdd\x84\x01\x7e\xd4\x1c\xe2\x4c\x86\x3b\x3e\x9f\x4e\x1c\x0d\x9c\x44\x47\x1b\xdf\x4d\x55\xef\xc0\x79\x0b\xe3\x66\x7e\xaa\x33\xa5\x9b\x99\xe1\x73\x69\x67\x2f\x89\xc9\xf6\x0b\x7a\xc9\x7c\x0a\xdb\x22\xaf\x12\x89\x56\x0c\xd0\xde\x4b\xf6\xfa\x5b\xfe\x27\x4f\x5e\x96\xf5\x47\xd3\x3d\x7d\xa9\x70\x73\xdf\x43\x11\x49\xd6\x30\x86\x0c\x45\x9d\x83\x84\x4e\xb4\xbb\xab\x29\xe8\x14\xf2\x50\x36\xba\x53\x67\x34\x2d\x63\x07\x6d\x35\x95\xe5\xc6\x4c\x7a\xe1\xda\xc2\x0c\x70\xa2\x99\xb4\xe5\x55\x10\xb9\x01\x67\x07\x7a\x75\x02\x46\xa6\xcc\xda\xb6\x36\xed\xac\x1a\xca\xbc\x6d\x5d\x9f\xd4\xb6\xbb\xc3\x9b\xe8\x78\x21\xa0\x33\x54\x02\x7b\xd9\xb5\x06\xee\xf7\x9f\xfc\x9f\x00\x00\x00\xff\xff\xb4\x4e\x2a\xd9\x57\xbf\x00\x00")
func staticsJsComponentsTopologyJsBytes() ([]byte, error) {
return bindataRead(
diff --git a/statics/css/skydive.css b/statics/css/skydive.css
index 39685628aa..2818aba020 100644
--- a/statics/css/skydive.css
+++ b/statics/css/skydive.css
@@ -671,6 +671,11 @@ ul.dropdown-menu .fa.pull-right {
margin-bottom: 5px;
}
+.object-key-value.container {
+ padding-left: 0px;
+ width: 100%;
+}
+
.object-sub-detail .object-detail {
margin-left: 20px;
}
diff --git a/statics/js/components/topology.js b/statics/js/components/topology.js
index 71744be1a3..38f1e371bc 100644
--- a/statics/js/components/topology.js
+++ b/statics/js/components/topology.js
@@ -211,9 +211,9 @@ var TopologyComponent = {
title="Metadata" :description="\'ID: \'+currentEdge.id">\
\
\
- \
- \
+ \
+ \
\
\
@@ -468,7 +468,7 @@ var TopologyComponent = {
currentNodeMetadata: function() {
if (!this.currentNode) return null;
return this.extractMetadata(this.currentNode.metadata,
- ['LastUpdateMetric', 'Metric', 'Blockdev', 'Ovs.Metric', 'Ovs.LastUpdateMetric', 'SFlow.Metric', 'SFlow.LastUpdateMetric', 'RoutingTables', 'Features', 'K8s.Extra', 'Docker']);
+ ['LastUpdateMetric', 'Metric', 'Blockdev', 'Ovs.Metric', 'Ovs.LastUpdateMetric', 'SFlow.Metric', 'SFlow.LastUpdateMetric', 'RoutingTables', 'Features', 'K8s.Extra', 'Container']);
},
currentNodeFlowsQuery: function() {
@@ -477,9 +477,9 @@ var TopologyComponent = {
return null;
},
- currentNodeDocker: function() {
- if (!this.currentNodeMetadata || !this.currentNode.metadata.Docker) return null;
- return this.currentNode.metadata.Docker;
+ currentNodeContainer: function() {
+ if (!this.currentNodeMetadata || !this.currentNode.metadata.Container) return null;
+ return this.currentNode.metadata.Container;
},
currentEdgeSrc: function() {
diff --git a/tests/docker_test.go b/tests/docker_test.go
index 6fe81e6105..0de6f7e30c 100644
--- a/tests/docker_test.go
+++ b/tests/docker_test.go
@@ -40,7 +40,7 @@ func TestDockerSimple(t *testing.T) {
checks: []CheckFunction{func(c *CheckContext) error {
gremlin := c.gremlin.V().Has("Type", "netns", "Manager", "docker")
- gremlin = gremlin.Out("Type", "container", "Docker.ContainerName", "test-skydive-docker-simple")
+ gremlin = gremlin.Out("Type", "container", "Name", "test-skydive-docker-simple")
nodes, err := c.gh.GetNodes(gremlin)
if err != nil {
@@ -74,7 +74,7 @@ func TestDockerShareNamespace(t *testing.T) {
checks: []CheckFunction{func(c *CheckContext) error {
gremlin := c.gremlin.V().Has("Type", "netns", "Manager", "docker")
- gremlin = gremlin.Out().Has("Type", "container", "Docker.ContainerName", g.Within("test-skydive-docker-share-ns", "test-skydive-docker-share-ns2"))
+ gremlin = gremlin.Out().Has("Type", "container", "Name", g.Within("test-skydive-docker-share-ns", "test-skydive-docker-share-ns2"))
nodes, err := c.gh.GetNodes(gremlin)
if err != nil {
return err
@@ -104,7 +104,7 @@ func TestDockerNetHost(t *testing.T) {
mode: Replay,
checks: []CheckFunction{func(c *CheckContext) error {
- gremlin := c.gremlin.V().Has("Docker.ContainerName", "test-skydive-docker-net-host", "Type", "container")
+ gremlin := c.gremlin.V().Has("Name", "test-skydive-docker-net-host", "Type", "container")
nodes, err := c.gh.GetNodes(gremlin)
if err != nil {
return err
@@ -159,11 +159,11 @@ func TestDockerLabels(t *testing.T) {
mode: Replay,
checks: []CheckFunction{func(c *CheckContext) error {
- gremlin := c.gremlin.V().Has("Docker.ContainerName", "test-skydive-docker-strange-labels", "Type", "container", "Docker.Labels.a.b.c", "123", "Docker.Labels.a~b/c@d", "456")
+ gremlin := c.gremlin.V().Has("Name", "test-skydive-docker-strange-labels", "Type", "container", "Container.Labels.a.b.c", "123", "Container.Labels.a~b/c@d", "456")
_, err := c.gh.GetNode(gremlin)
return err
}, func(c *CheckContext) error {
- gremlin := c.gremlin.V().Has("Docker.ContainerName", "test-skydive-docker-many-labels", "Type", "container", "Docker.Labels.label999", "1")
+ gremlin := c.gremlin.V().Has("Name", "test-skydive-docker-many-labels", "Type", "container", "Container.Labels.label999", "1")
_, err := c.gh.GetNode(gremlin)
return err
}},
diff --git a/tests/runc_test.go b/tests/runc_test.go
index 39e54d4009..8c045f3127 100644
--- a/tests/runc_test.go
+++ b/tests/runc_test.go
@@ -42,7 +42,7 @@ func TestRuncSimple(t *testing.T) {
// Newer version of runc switched to bolt to store labels so
// we disable the test on labels for now
- gremlin := c.gremlin.V().Has("Type", "container", "Manager", "runc", "Runc.ContainerID", containerID) // , "Runc.CreateConfig.Labels.Name", "test")
+ gremlin := c.gremlin.V().Has("Type", "container", "Manager", "runc", "Container.ID", containerID) // , "Container.Labels.Name", "test")
gremlin = gremlin.In("Type", "netns", "Manager", "runc")
nodes, err := c.gh.GetNodes(gremlin)
diff --git a/topology/container.go b/topology/container.go
new file mode 100644
index 0000000000..407cd1bcec
--- /dev/null
+++ b/topology/container.go
@@ -0,0 +1,123 @@
+//go:generate go run github.com/skydive-project/skydive/graffiti/gendecoder -package github.com/skydive-project/skydive/topology
+//go:generate go run github.com/mailru/easyjson/easyjson $GOFILE
+
+/*
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy ofthe License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specificlanguage governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package topology
+
+import (
+ "bufio"
+ "encoding/json"
+ "fmt"
+ "net"
+ "os"
+ "strings"
+
+ "github.com/skydive-project/skydive/graffiti/getter"
+ "github.com/skydive-project/skydive/graffiti/graph"
+)
+
+// ContainerMetadata describe the metadata of a docker container
+// easyjson:json
+// gendecoder
+type ContainerMetadata struct {
+ ID string
+ Image string `json:",omitempty"`
+ ImageID string `json:",omitempty"`
+ Runtime string
+ Status string
+ InitProcessPID int64
+ Hosts Hosts `json:",omitempty"`
+ Labels graph.Metadata `json:",omitempty" field:"Metadata"`
+}
+
+// Hosts describes a /etc/hosts file
+// easyjson:json
+// gendecoder
+type Hosts struct {
+ IP string `json:",omitempty"`
+ Hostname string `json:",omitempty"`
+ ByIP graph.Metadata `json:",omitempty" field:"Metadata"`
+}
+
+func newHosts() *Hosts {
+ return &Hosts{ByIP: graph.Metadata{}}
+}
+
+// ReadHosts parses a 'hosts' file such as /etc/hosts
+func ReadHosts(path string) (*Hosts, error) {
+ file, err := os.Open(path)
+ if err != nil {
+ return nil, err
+ }
+ defer file.Close()
+
+ hosts := newHosts()
+ scanner := bufio.NewScanner(file)
+ for scanner.Scan() {
+ line := scanner.Text()
+
+ if err := scanner.Err(); err != nil {
+ return nil, err
+ }
+
+ if i := strings.IndexByte(line, '#'); i >= 0 {
+ // Discard comment.
+ line = line[0:i]
+ }
+
+ f := strings.Fields(line)
+ if len(f) < 2 {
+ continue
+ }
+
+ ip := net.ParseIP(f[0])
+ if ip == nil {
+ continue
+ }
+
+ if ip.IsLoopback() {
+ continue
+ }
+
+ hosts.IP = ip.String()
+ ips := make([]string, len(f))
+ for i := 1; i < len(f); i++ {
+ hosts.Hostname = strings.ToLower(f[i])
+ ips[i-1] = hosts.Hostname
+ }
+ hosts.ByIP[hosts.IP] = ips
+ }
+
+ return hosts, nil
+}
+
+// ContainerMetadataDecoder implements a json message raw decoder
+func ContainerMetadataDecoder(raw json.RawMessage) (getter.Getter, error) {
+ var m ContainerMetadata
+ if err := json.Unmarshal(raw, &m); err != nil {
+ return nil, fmt.Errorf("unable to unmarshal container metadata %s: %s", string(raw), err)
+ }
+
+ return &m, nil
+}
+
+// RegisterContainer registers container metadata decoder
+func RegisterContainer() {
+ graph.NodeMetadataDecoders["Container"] = ContainerMetadataDecoder
+}
diff --git a/topology/container_easyjson.go b/topology/container_easyjson.go
new file mode 100644
index 0000000000..76485c7870
--- /dev/null
+++ b/topology/container_easyjson.go
@@ -0,0 +1,225 @@
+// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT.
+
+package topology
+
+import (
+ json "encoding/json"
+ easyjson "github.com/mailru/easyjson"
+ jlexer "github.com/mailru/easyjson/jlexer"
+ jwriter "github.com/mailru/easyjson/jwriter"
+)
+
+// suppress unused package warning
+var (
+ _ *json.RawMessage
+ _ *jlexer.Lexer
+ _ *jwriter.Writer
+ _ easyjson.Marshaler
+)
+
+func easyjson1dbef17bDecodeGithubComSkydiveProjectSkydiveTopology(in *jlexer.Lexer, out *Hosts) {
+ isTopLevel := in.IsStart()
+ if in.IsNull() {
+ if isTopLevel {
+ in.Consumed()
+ }
+ in.Skip()
+ return
+ }
+ in.Delim('{')
+ for !in.IsDelim('}') {
+ key := in.UnsafeFieldName(false)
+ in.WantColon()
+ if in.IsNull() {
+ in.Skip()
+ in.WantComma()
+ continue
+ }
+ switch key {
+ case "IP":
+ out.IP = string(in.String())
+ case "Hostname":
+ out.Hostname = string(in.String())
+ case "ByIP":
+ (out.ByIP).UnmarshalEasyJSON(in)
+ default:
+ in.SkipRecursive()
+ }
+ in.WantComma()
+ }
+ in.Delim('}')
+ if isTopLevel {
+ in.Consumed()
+ }
+}
+func easyjson1dbef17bEncodeGithubComSkydiveProjectSkydiveTopology(out *jwriter.Writer, in Hosts) {
+ out.RawByte('{')
+ first := true
+ _ = first
+ if in.IP != "" {
+ const prefix string = ",\"IP\":"
+ first = false
+ out.RawString(prefix[1:])
+ out.String(string(in.IP))
+ }
+ if in.Hostname != "" {
+ const prefix string = ",\"Hostname\":"
+ if first {
+ first = false
+ out.RawString(prefix[1:])
+ } else {
+ out.RawString(prefix)
+ }
+ out.String(string(in.Hostname))
+ }
+ if len(in.ByIP) != 0 {
+ const prefix string = ",\"ByIP\":"
+ if first {
+ first = false
+ out.RawString(prefix[1:])
+ } else {
+ out.RawString(prefix)
+ }
+ (in.ByIP).MarshalEasyJSON(out)
+ }
+ out.RawByte('}')
+}
+
+// MarshalJSON supports json.Marshaler interface
+func (v Hosts) MarshalJSON() ([]byte, error) {
+ w := jwriter.Writer{}
+ easyjson1dbef17bEncodeGithubComSkydiveProjectSkydiveTopology(&w, v)
+ return w.Buffer.BuildBytes(), w.Error
+}
+
+// MarshalEasyJSON supports easyjson.Marshaler interface
+func (v Hosts) MarshalEasyJSON(w *jwriter.Writer) {
+ easyjson1dbef17bEncodeGithubComSkydiveProjectSkydiveTopology(w, v)
+}
+
+// UnmarshalJSON supports json.Unmarshaler interface
+func (v *Hosts) UnmarshalJSON(data []byte) error {
+ r := jlexer.Lexer{Data: data}
+ easyjson1dbef17bDecodeGithubComSkydiveProjectSkydiveTopology(&r, v)
+ return r.Error()
+}
+
+// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
+func (v *Hosts) UnmarshalEasyJSON(l *jlexer.Lexer) {
+ easyjson1dbef17bDecodeGithubComSkydiveProjectSkydiveTopology(l, v)
+}
+func easyjson1dbef17bDecodeGithubComSkydiveProjectSkydiveTopology1(in *jlexer.Lexer, out *ContainerMetadata) {
+ isTopLevel := in.IsStart()
+ if in.IsNull() {
+ if isTopLevel {
+ in.Consumed()
+ }
+ in.Skip()
+ return
+ }
+ in.Delim('{')
+ for !in.IsDelim('}') {
+ key := in.UnsafeFieldName(false)
+ in.WantColon()
+ if in.IsNull() {
+ in.Skip()
+ in.WantComma()
+ continue
+ }
+ switch key {
+ case "ID":
+ out.ID = string(in.String())
+ case "Image":
+ out.Image = string(in.String())
+ case "ImageID":
+ out.ImageID = string(in.String())
+ case "Runtime":
+ out.Runtime = string(in.String())
+ case "Status":
+ out.Status = string(in.String())
+ case "InitProcessPID":
+ out.InitProcessPID = int64(in.Int64())
+ case "Hosts":
+ (out.Hosts).UnmarshalEasyJSON(in)
+ case "Labels":
+ (out.Labels).UnmarshalEasyJSON(in)
+ default:
+ in.SkipRecursive()
+ }
+ in.WantComma()
+ }
+ in.Delim('}')
+ if isTopLevel {
+ in.Consumed()
+ }
+}
+func easyjson1dbef17bEncodeGithubComSkydiveProjectSkydiveTopology1(out *jwriter.Writer, in ContainerMetadata) {
+ out.RawByte('{')
+ first := true
+ _ = first
+ {
+ const prefix string = ",\"ID\":"
+ out.RawString(prefix[1:])
+ out.String(string(in.ID))
+ }
+ if in.Image != "" {
+ const prefix string = ",\"Image\":"
+ out.RawString(prefix)
+ out.String(string(in.Image))
+ }
+ if in.ImageID != "" {
+ const prefix string = ",\"ImageID\":"
+ out.RawString(prefix)
+ out.String(string(in.ImageID))
+ }
+ {
+ const prefix string = ",\"Runtime\":"
+ out.RawString(prefix)
+ out.String(string(in.Runtime))
+ }
+ {
+ const prefix string = ",\"Status\":"
+ out.RawString(prefix)
+ out.String(string(in.Status))
+ }
+ {
+ const prefix string = ",\"InitProcessPID\":"
+ out.RawString(prefix)
+ out.Int64(int64(in.InitProcessPID))
+ }
+ if true {
+ const prefix string = ",\"Hosts\":"
+ out.RawString(prefix)
+ (in.Hosts).MarshalEasyJSON(out)
+ }
+ if len(in.Labels) != 0 {
+ const prefix string = ",\"Labels\":"
+ out.RawString(prefix)
+ (in.Labels).MarshalEasyJSON(out)
+ }
+ out.RawByte('}')
+}
+
+// MarshalJSON supports json.Marshaler interface
+func (v ContainerMetadata) MarshalJSON() ([]byte, error) {
+ w := jwriter.Writer{}
+ easyjson1dbef17bEncodeGithubComSkydiveProjectSkydiveTopology1(&w, v)
+ return w.Buffer.BuildBytes(), w.Error
+}
+
+// MarshalEasyJSON supports easyjson.Marshaler interface
+func (v ContainerMetadata) MarshalEasyJSON(w *jwriter.Writer) {
+ easyjson1dbef17bEncodeGithubComSkydiveProjectSkydiveTopology1(w, v)
+}
+
+// UnmarshalJSON supports json.Unmarshaler interface
+func (v *ContainerMetadata) UnmarshalJSON(data []byte) error {
+ r := jlexer.Lexer{Data: data}
+ easyjson1dbef17bDecodeGithubComSkydiveProjectSkydiveTopology1(&r, v)
+ return r.Error()
+}
+
+// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
+func (v *ContainerMetadata) UnmarshalEasyJSON(l *jlexer.Lexer) {
+ easyjson1dbef17bDecodeGithubComSkydiveProjectSkydiveTopology1(l, v)
+}
diff --git a/topology/probes/runc/metadata_gendecoder.go b/topology/container_gendecoder.go
similarity index 50%
rename from topology/probes/runc/metadata_gendecoder.go
rename to topology/container_gendecoder.go
index 67f2d3233a..194ae3ad06 100644
--- a/topology/probes/runc/metadata_gendecoder.go
+++ b/topology/container_gendecoder.go
@@ -1,39 +1,54 @@
// Code generated - DO NOT EDIT.
-package runc
+package topology
import (
"github.com/skydive-project/skydive/graffiti/getter"
"strings"
)
-func (obj *CreateConfig) GetFieldBool(key string) (bool, error) {
+func (obj *ContainerMetadata) GetFieldBool(key string) (bool, error) {
return false, getter.ErrFieldNotFound
}
-func (obj *CreateConfig) GetFieldInt64(key string) (int64, error) {
+func (obj *ContainerMetadata) GetFieldInt64(key string) (int64, error) {
+ switch key {
+ case "InitProcessPID":
+ return int64(obj.InitProcessPID), nil
+ }
return 0, getter.ErrFieldNotFound
}
-func (obj *CreateConfig) GetFieldString(key string) (string, error) {
+func (obj *ContainerMetadata) GetFieldString(key string) (string, error) {
switch key {
+ case "ID":
+ return string(obj.ID), nil
case "Image":
return string(obj.Image), nil
case "ImageID":
return string(obj.ImageID), nil
+ case "Runtime":
+ return string(obj.Runtime), nil
+ case "Status":
+ return string(obj.Status), nil
}
return "", getter.ErrFieldNotFound
}
-func (obj *CreateConfig) GetFieldKeys() []string {
+func (obj *ContainerMetadata) GetFieldKeys() []string {
return []string{
+ "ID",
"Image",
"ImageID",
+ "Runtime",
+ "Status",
+ "InitProcessPID",
+ "Hosts",
"Labels",
}
}
-func (obj *CreateConfig) MatchBool(key string, predicate getter.BoolPredicate) bool {
+func (obj *ContainerMetadata) MatchBool(key string, predicate getter.BoolPredicate) bool {
first := key
index := strings.Index(key, ".")
if index != -1 {
@@ -49,7 +64,11 @@ func (obj *CreateConfig) MatchBool(key string, predicate getter.BoolPredicate) b
return false
}
-func (obj *CreateConfig) MatchInt64(key string, predicate getter.Int64Predicate) bool {
+func (obj *ContainerMetadata) MatchInt64(key string, predicate getter.Int64Predicate) bool {
+ if b, err := obj.GetFieldInt64(key); err == nil {
+ return predicate(b)
+ }
+
first := key
index := strings.Index(key, ".")
if index != -1 {
@@ -66,7 +85,7 @@ func (obj *CreateConfig) MatchInt64(key string, predicate getter.Int64Predicate)
return false
}
-func (obj *CreateConfig) MatchString(key string, predicate getter.StringPredicate) bool {
+func (obj *ContainerMetadata) MatchString(key string, predicate getter.StringPredicate) bool {
if b, err := obj.GetFieldString(key); err == nil {
return predicate(b)
}
@@ -87,11 +106,15 @@ func (obj *CreateConfig) MatchString(key string, predicate getter.StringPredicat
return false
}
-func (obj *CreateConfig) GetField(key string) (interface{}, error) {
+func (obj *ContainerMetadata) GetField(key string) (interface{}, error) {
if s, err := obj.GetFieldString(key); err == nil {
return s, nil
}
+ if i, err := obj.GetFieldInt64(key); err == nil {
+ return i, nil
+ }
+
first := key
index := strings.Index(key, ".")
if index != -1 {
@@ -217,153 +240,6 @@ func (obj *Hosts) GetField(key string) (interface{}, error) {
return nil, getter.ErrFieldNotFound
}
-func (obj *Metadata) GetFieldBool(key string) (bool, error) {
- return false, getter.ErrFieldNotFound
-}
-
-func (obj *Metadata) GetFieldInt64(key string) (int64, error) {
- return 0, getter.ErrFieldNotFound
-}
-
-func (obj *Metadata) GetFieldString(key string) (string, error) {
- switch key {
- case "ContainerID":
- return string(obj.ContainerID), nil
- case "Status":
- return string(obj.Status), nil
- }
- return "", getter.ErrFieldNotFound
-}
-
-func (obj *Metadata) GetFieldKeys() []string {
- return []string{
- "ContainerID",
- "Status",
- "Labels",
- "CreateConfig",
- "Hosts",
- }
-}
-
-func (obj *Metadata) MatchBool(key string, predicate getter.BoolPredicate) bool {
- first := key
- index := strings.Index(key, ".")
- if index != -1 {
- first = key[:index]
- }
-
- switch first {
- case "Labels":
- if index != -1 && obj.Labels != nil {
- return obj.Labels.MatchBool(key[index+1:], predicate)
- }
- case "CreateConfig":
- if index != -1 && obj.CreateConfig != nil {
- return obj.CreateConfig.MatchBool(key[index+1:], predicate)
- }
- case "Hosts":
- if index != -1 && obj.Hosts != nil {
- return obj.Hosts.MatchBool(key[index+1:], predicate)
- }
- }
- return false
-}
-
-func (obj *Metadata) MatchInt64(key string, predicate getter.Int64Predicate) bool {
- first := key
- index := strings.Index(key, ".")
- if index != -1 {
- first = key[:index]
- }
-
- switch first {
-
- case "Labels":
- if index != -1 && obj.Labels != nil {
- return obj.Labels.MatchInt64(key[index+1:], predicate)
- }
- case "CreateConfig":
- if index != -1 && obj.CreateConfig != nil {
- return obj.CreateConfig.MatchInt64(key[index+1:], predicate)
- }
- case "Hosts":
- if index != -1 && obj.Hosts != nil {
- return obj.Hosts.MatchInt64(key[index+1:], predicate)
- }
- }
- return false
-}
-
-func (obj *Metadata) MatchString(key string, predicate getter.StringPredicate) bool {
- if b, err := obj.GetFieldString(key); err == nil {
- return predicate(b)
- }
-
- first := key
- index := strings.Index(key, ".")
- if index != -1 {
- first = key[:index]
- }
-
- switch first {
-
- case "Labels":
- if index != -1 && obj.Labels != nil {
- return obj.Labels.MatchString(key[index+1:], predicate)
- }
- case "CreateConfig":
- if index != -1 && obj.CreateConfig != nil {
- return obj.CreateConfig.MatchString(key[index+1:], predicate)
- }
- case "Hosts":
- if index != -1 && obj.Hosts != nil {
- return obj.Hosts.MatchString(key[index+1:], predicate)
- }
- }
- return false
-}
-
-func (obj *Metadata) GetField(key string) (interface{}, error) {
- if s, err := obj.GetFieldString(key); err == nil {
- return s, nil
- }
-
- first := key
- index := strings.Index(key, ".")
- if index != -1 {
- first = key[:index]
- }
-
- switch first {
- case "Labels":
- if obj.Labels != nil {
- if index != -1 {
- return obj.Labels.GetField(key[index+1:])
- } else {
- return obj.Labels, nil
- }
- }
- case "CreateConfig":
- if obj.CreateConfig != nil {
- if index != -1 {
- return obj.CreateConfig.GetField(key[index+1:])
- } else {
- return obj.CreateConfig, nil
- }
- }
- case "Hosts":
- if obj.Hosts != nil {
- if index != -1 {
- return obj.Hosts.GetField(key[index+1:])
- } else {
- return obj.Hosts, nil
- }
- }
-
- }
- return nil, getter.ErrFieldNotFound
-}
-
func init() {
strings.Index("", ".")
}
diff --git a/topology/probes/docker/docker.go b/topology/probes/docker/docker.go
index 20fcaeb37e..7c51ba6724 100644
--- a/topology/probes/docker/docker.go
+++ b/topology/probes/docker/docker.go
@@ -105,9 +105,13 @@ func (p *ProbeHandler) registerContainer(id string) {
pid := int64(info.State.Pid)
- dockerMetadata := Metadata{
- ContainerID: info.ID,
- ContainerName: info.Name[1:],
+ dockerMetadata := topology.ContainerMetadata{
+ ID: info.ID,
+ Image: info.Config.Image,
+ ImageID: info.Image,
+ Runtime: "docker",
+ Status: info.State.Status,
+ InitProcessPID: pid,
}
if len(info.Config.Labels) != 0 {
@@ -117,18 +121,17 @@ func (p *ProbeHandler) registerContainer(id string) {
p.Ctx.Graph.Lock()
defer p.Ctx.Graph.Unlock()
- containerNode := p.Ctx.Graph.LookupFirstNode(graph.Metadata{"InitProcessPID": pid})
+ containerNode := p.Ctx.Graph.LookupFirstNode(graph.Metadata{"Container.InitProcessPID": pid})
if containerNode != nil {
- if err := p.Ctx.Graph.AddMetadata(containerNode, "Docker", dockerMetadata); err != nil {
+ if err := p.Ctx.Graph.AddMetadata(containerNode, "Container", dockerMetadata); err != nil {
p.Ctx.Logger.Error(err)
}
} else {
metadata := graph.Metadata{
- "Type": "container",
- "Name": info.Name[1:],
- "Manager": "docker",
- "InitProcessPID": pid,
- "Docker": dockerMetadata,
+ "Type": "container",
+ "Name": info.Name[1:],
+ "Manager": "docker",
+ "Container": dockerMetadata,
}
if containerNode, err = p.Ctx.Graph.NewNode(graph.GenID(), metadata); err != nil {
@@ -280,8 +283,3 @@ func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) {
return probes.NewProbeWrapper(p), nil
}
-
-// Register registers graph metadata decoders
-func Register() {
- graph.NodeMetadataDecoders["Docker"] = MetadataDecoder
-}
diff --git a/topology/probes/docker/metadata.go b/topology/probes/docker/metadata.go
deleted file mode 100644
index ea4dde424e..0000000000
--- a/topology/probes/docker/metadata.go
+++ /dev/null
@@ -1,48 +0,0 @@
-//go:generate go run github.com/skydive-project/skydive/graffiti/gendecoder -package github.com/skydive-project/skydive/topology/probes/docker
-//go:generate go run github.com/mailru/easyjson/easyjson $GOFILE
-
-/*
- * Copyright (C) 2019 Red Hat, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy ofthe License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specificlanguage governing permissions and
- * limitations under the License.
- *
- */
-
-package docker
-
-import (
- "encoding/json"
- "fmt"
-
- "github.com/skydive-project/skydive/graffiti/getter"
- "github.com/skydive-project/skydive/graffiti/graph"
-)
-
-// Metadata describe the metadata of a docker container
-// easyjson:json
-// gendecoder
-type Metadata struct {
- ContainerID string
- ContainerName string
- Labels graph.Metadata `field:"Metadata"`
-}
-
-// MetadataDecoder implements a json message raw decoder
-func MetadataDecoder(raw json.RawMessage) (getter.Getter, error) {
- var m Metadata
- if err := json.Unmarshal(raw, &m); err != nil {
- return nil, fmt.Errorf("unable to unmarshal docker metadata %s: %s", string(raw), err)
- }
-
- return &m, nil
-}
diff --git a/topology/probes/docker/metadata_easyjson.go b/topology/probes/docker/metadata_easyjson.go
deleted file mode 100644
index 181ceb2278..0000000000
--- a/topology/probes/docker/metadata_easyjson.go
+++ /dev/null
@@ -1,99 +0,0 @@
-// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT.
-
-package docker
-
-import (
- json "encoding/json"
- easyjson "github.com/mailru/easyjson"
- jlexer "github.com/mailru/easyjson/jlexer"
- jwriter "github.com/mailru/easyjson/jwriter"
-)
-
-// suppress unused package warning
-var (
- _ *json.RawMessage
- _ *jlexer.Lexer
- _ *jwriter.Writer
- _ easyjson.Marshaler
-)
-
-func easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesDocker(in *jlexer.Lexer, out *Metadata) {
- isTopLevel := in.IsStart()
- if in.IsNull() {
- if isTopLevel {
- in.Consumed()
- }
- in.Skip()
- return
- }
- in.Delim('{')
- for !in.IsDelim('}') {
- key := in.UnsafeFieldName(false)
- in.WantColon()
- if in.IsNull() {
- in.Skip()
- in.WantComma()
- continue
- }
- switch key {
- case "ContainerID":
- out.ContainerID = string(in.String())
- case "ContainerName":
- out.ContainerName = string(in.String())
- case "Labels":
- (out.Labels).UnmarshalEasyJSON(in)
- default:
- in.SkipRecursive()
- }
- in.WantComma()
- }
- in.Delim('}')
- if isTopLevel {
- in.Consumed()
- }
-}
-func easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesDocker(out *jwriter.Writer, in Metadata) {
- out.RawByte('{')
- first := true
- _ = first
- {
- const prefix string = ",\"ContainerID\":"
- out.RawString(prefix[1:])
- out.String(string(in.ContainerID))
- }
- {
- const prefix string = ",\"ContainerName\":"
- out.RawString(prefix)
- out.String(string(in.ContainerName))
- }
- {
- const prefix string = ",\"Labels\":"
- out.RawString(prefix)
- (in.Labels).MarshalEasyJSON(out)
- }
- out.RawByte('}')
-}
-
-// MarshalJSON supports json.Marshaler interface
-func (v Metadata) MarshalJSON() ([]byte, error) {
- w := jwriter.Writer{}
- easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesDocker(&w, v)
- return w.Buffer.BuildBytes(), w.Error
-}
-
-// MarshalEasyJSON supports easyjson.Marshaler interface
-func (v Metadata) MarshalEasyJSON(w *jwriter.Writer) {
- easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesDocker(w, v)
-}
-
-// UnmarshalJSON supports json.Unmarshaler interface
-func (v *Metadata) UnmarshalJSON(data []byte) error {
- r := jlexer.Lexer{Data: data}
- easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesDocker(&r, v)
- return r.Error()
-}
-
-// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
-func (v *Metadata) UnmarshalEasyJSON(l *jlexer.Lexer) {
- easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesDocker(l, v)
-}
diff --git a/topology/probes/docker/metadata_gendecoder.go b/topology/probes/docker/metadata_gendecoder.go
deleted file mode 100644
index c273baf429..0000000000
--- a/topology/probes/docker/metadata_gendecoder.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Code generated - DO NOT EDIT.
-
-package docker
-
-import (
- "github.com/skydive-project/skydive/graffiti/getter"
- "strings"
-)
-
-func (obj *Metadata) GetFieldBool(key string) (bool, error) {
- return false, getter.ErrFieldNotFound
-}
-
-func (obj *Metadata) GetFieldInt64(key string) (int64, error) {
- return 0, getter.ErrFieldNotFound
-}
-
-func (obj *Metadata) GetFieldString(key string) (string, error) {
- switch key {
- case "ContainerID":
- return string(obj.ContainerID), nil
- case "ContainerName":
- return string(obj.ContainerName), nil
- }
- return "", getter.ErrFieldNotFound
-}
-
-func (obj *Metadata) GetFieldKeys() []string {
- return []string{
- "ContainerID",
- "ContainerName",
- "Labels",
- }
-}
-
-func (obj *Metadata) MatchBool(key string, predicate getter.BoolPredicate) bool {
- first := key
- index := strings.Index(key, ".")
- if index != -1 {
- first = key[:index]
- }
-
- switch first {
- case "Labels":
- if index != -1 && obj.Labels != nil {
- return obj.Labels.MatchBool(key[index+1:], predicate)
- }
- }
- return false
-}
-
-func (obj *Metadata) MatchInt64(key string, predicate getter.Int64Predicate) bool {
- first := key
- index := strings.Index(key, ".")
- if index != -1 {
- first = key[:index]
- }
-
- switch first {
-
- case "Labels":
- if index != -1 && obj.Labels != nil {
- return obj.Labels.MatchInt64(key[index+1:], predicate)
- }
- }
- return false
-}
-
-func (obj *Metadata) MatchString(key string, predicate getter.StringPredicate) bool {
- if b, err := obj.GetFieldString(key); err == nil {
- return predicate(b)
- }
-
- first := key
- index := strings.Index(key, ".")
- if index != -1 {
- first = key[:index]
- }
-
- switch first {
-
- case "Labels":
- if index != -1 && obj.Labels != nil {
- return obj.Labels.MatchString(key[index+1:], predicate)
- }
- }
- return false
-}
-
-func (obj *Metadata) GetField(key string) (interface{}, error) {
- if s, err := obj.GetFieldString(key); err == nil {
- return s, nil
- }
-
- first := key
- index := strings.Index(key, ".")
- if index != -1 {
- first = key[:index]
- }
-
- switch first {
- case "Labels":
- if obj.Labels != nil {
- if index != -1 {
- return obj.Labels.GetField(key[index+1:])
- } else {
- return obj.Labels, nil
- }
- }
-
- }
- return nil, getter.ErrFieldNotFound
-}
-
-func init() {
- strings.Index("", ".")
-}
diff --git a/topology/probes/k8s/container.go b/topology/probes/k8s/container.go
index 1d9d5f1ba1..cfa0d24ad1 100644
--- a/topology/probes/k8s/container.go
+++ b/topology/probes/k8s/container.go
@@ -19,6 +19,7 @@ package k8s
import (
"fmt"
+ "strings"
"github.com/skydive-project/skydive/graffiti/filters"
"github.com/skydive-project/skydive/graffiti/graph"
@@ -30,12 +31,6 @@ import (
"k8s.io/client-go/kubernetes"
)
-const (
- dockerContainerNameField = "Docker.Labels.io.kubernetes.container.name"
- dockerPodNameField = "Docker.Labels.io.kubernetes.pod.name"
- dockerPodNamespaceField = "Docker.Labels.io.kubernetes.pod.namespace"
-)
-
type containerProbe struct {
*graph.EventHandler
*KubeCache
@@ -65,9 +60,15 @@ func (c *containerProbe) OnAdd(obj interface{}) {
wasUpdated := make(map[string]bool)
- for _, container := range pod.Spec.Containers {
+ for i, container := range pod.Spec.Containers {
uid := graph.GenID(string(pod.GetUID()), container.Name)
m := c.newMetadata(pod, &container)
+ if i < len(pod.Status.InitContainerStatuses) {
+ if splitted := strings.SplitN(pod.Status.ContainerStatuses[i].ContainerID, "://", 2); len(splitted) == 2 {
+ m.SetField(MetadataField("Runtime"), splitted[0])
+ m.SetField(MetadataField("ContainerID"), splitted[1])
+ }
+ }
if node := c.graph.GetNode(uid); node == nil {
var err error
@@ -151,14 +152,10 @@ func newPodContainerLinker(g *graph.Graph) probe.Handler {
func newDockerIndexer(g *graph.Graph) *graph.MetadataIndexer {
m := graph.NewElementFilter(filters.NewAndFilter(
- filters.NewTermStringFilter("Manager", "docker"),
filters.NewTermStringFilter("Type", "container"),
- filters.NewNotNullFilter(dockerPodNamespaceField),
- filters.NewNotNullFilter(dockerPodNameField),
- filters.NewNotNullFilter(dockerContainerNameField),
))
- return graph.NewMetadataIndexer(g, g, m, dockerPodNamespaceField, dockerPodNameField, dockerContainerNameField)
+ return graph.NewMetadataIndexer(g, g, m, "Container.ID")
}
func newContainerDockerLinker(g *graph.Graph) probe.Handler {
@@ -168,7 +165,7 @@ func newContainerDockerLinker(g *graph.Graph) probe.Handler {
}
containerFilter := newTypesFilter(Manager, "container")
- containerIndexer := newObjectIndexerFromFilter(g, containerProbe, containerFilter, MetadataFields("Namespace", "Pod", "Name")...)
+ containerIndexer := newObjectIndexerFromFilter(g, containerProbe, containerFilter, MetadataFields("ContainerID")...)
containerIndexer.Start()
dockerIndexer := newDockerIndexer(g)
diff --git a/topology/probes/runc/hosts.go b/topology/probes/runc/hosts.go
deleted file mode 100644
index 972dd5361c..0000000000
--- a/topology/probes/runc/hosts.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// +build linux
-
-/*
- * Copyright (C) 2019 IBM, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy ofthe License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specificlanguage governing permissions and
- * limitations under the License.
- *
- */
-
-package runc
-
-import (
- "bufio"
- "net"
- "os"
- "strings"
-
- "github.com/skydive-project/skydive/graffiti/graph"
-)
-
-func newHosts() *Hosts {
- return &Hosts{ByIP: graph.Metadata{}}
-}
-
-func readHosts(path string) (*Hosts, error) {
- file, err := os.Open(path)
- if err != nil {
- return nil, err
- }
- defer file.Close()
-
- hosts := newHosts()
- scanner := bufio.NewScanner(file)
- for scanner.Scan() {
- line := scanner.Text()
-
- if err := scanner.Err(); err != nil {
- return nil, err
- }
-
- if i := strings.IndexByte(line, '#'); i >= 0 {
- // Discard comment.
- line = line[0:i]
- }
-
- f := strings.Fields(line)
- if len(f) < 2 {
- continue
- }
-
- ip := net.ParseIP(f[0])
- if ip == nil {
- continue
- }
-
- if ip.IsLoopback() {
- continue
- }
-
- hosts.IP = ip.String()
- ips := make([]string, len(f))
- for i := 1; i < len(f); i++ {
- hosts.Hostname = strings.ToLower(f[i])
- ips[i-1] = hosts.Hostname
- }
- hosts.ByIP[hosts.IP] = ips
- }
-
- return hosts, nil
-}
diff --git a/topology/probes/runc/metadata.go b/topology/probes/runc/metadata.go
deleted file mode 100644
index a6555f205d..0000000000
--- a/topology/probes/runc/metadata.go
+++ /dev/null
@@ -1,68 +0,0 @@
-//go:generate go run github.com/skydive-project/skydive/graffiti/gendecoder -package github.com/skydive-project/skydive/topology/probes/runc
-//go:generate go run github.com/mailru/easyjson/easyjson $GOFILE
-
-/*
- * Copyright (C) 2019 Red Hat, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy ofthe License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specificlanguage governing permissions and
- * limitations under the License.
- *
- */
-
-package runc
-
-import (
- "encoding/json"
- "fmt"
-
- "github.com/skydive-project/skydive/graffiti/getter"
- "github.com/skydive-project/skydive/graffiti/graph"
-)
-
-// Metadata describes the information sotred for a runc container
-// easyjson:json
-// gendecoder
-type Metadata struct {
- ContainerID string `json:",omitempty"`
- Status string `json:",omitempty"`
- Labels graph.Metadata `json:",omitempty" field:"Metadata"`
- CreateConfig *CreateConfig `json:",omitempty"`
- Hosts *Hosts `json:",omitempty"`
-}
-
-// CreateConfig describes the creating parameters of a runc container
-// easyjson:json
-// gendecoder
-type CreateConfig struct {
- Image string `json:",omitempty"`
- ImageID string `json:",omitempty"`
- Labels graph.Metadata `json:",omitempty" field:"Metadata"`
-}
-
-// Hosts describes a runc host
-// easyjson:json
-// gendecoder
-type Hosts struct {
- IP string `json:",omitempty"`
- Hostname string `json:",omitempty"`
- ByIP graph.Metadata `json:",omitempty" field:"Metadata"`
-}
-
-// MetadataDecoder implements a json message raw decoder
-func MetadataDecoder(raw json.RawMessage) (getter.Getter, error) {
- var m Metadata
- if err := json.Unmarshal(raw, &m); err != nil {
- return nil, fmt.Errorf("unable to unmarshal RunC metadata %s: %s", string(raw), err)
- }
-
- return &m, nil
-}
diff --git a/topology/probes/runc/metadata_easyjson.go b/topology/probes/runc/metadata_easyjson.go
deleted file mode 100644
index 0d2adb958f..0000000000
--- a/topology/probes/runc/metadata_easyjson.go
+++ /dev/null
@@ -1,332 +0,0 @@
-// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT.
-
-package runc
-
-import (
- json "encoding/json"
- easyjson "github.com/mailru/easyjson"
- jlexer "github.com/mailru/easyjson/jlexer"
- jwriter "github.com/mailru/easyjson/jwriter"
-)
-
-// suppress unused package warning
-var (
- _ *json.RawMessage
- _ *jlexer.Lexer
- _ *jwriter.Writer
- _ easyjson.Marshaler
-)
-
-func easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesRunc(in *jlexer.Lexer, out *Metadata) {
- isTopLevel := in.IsStart()
- if in.IsNull() {
- if isTopLevel {
- in.Consumed()
- }
- in.Skip()
- return
- }
- in.Delim('{')
- for !in.IsDelim('}') {
- key := in.UnsafeFieldName(false)
- in.WantColon()
- if in.IsNull() {
- in.Skip()
- in.WantComma()
- continue
- }
- switch key {
- case "ContainerID":
- out.ContainerID = string(in.String())
- case "Status":
- out.Status = string(in.String())
- case "Labels":
- (out.Labels).UnmarshalEasyJSON(in)
- case "CreateConfig":
- if in.IsNull() {
- in.Skip()
- out.CreateConfig = nil
- } else {
- if out.CreateConfig == nil {
- out.CreateConfig = new(CreateConfig)
- }
- (*out.CreateConfig).UnmarshalEasyJSON(in)
- }
- case "Hosts":
- if in.IsNull() {
- in.Skip()
- out.Hosts = nil
- } else {
- if out.Hosts == nil {
- out.Hosts = new(Hosts)
- }
- (*out.Hosts).UnmarshalEasyJSON(in)
- }
- default:
- in.SkipRecursive()
- }
- in.WantComma()
- }
- in.Delim('}')
- if isTopLevel {
- in.Consumed()
- }
-}
-func easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesRunc(out *jwriter.Writer, in Metadata) {
- out.RawByte('{')
- first := true
- _ = first
- if in.ContainerID != "" {
- const prefix string = ",\"ContainerID\":"
- first = false
- out.RawString(prefix[1:])
- out.String(string(in.ContainerID))
- }
- if in.Status != "" {
- const prefix string = ",\"Status\":"
- if first {
- first = false
- out.RawString(prefix[1:])
- } else {
- out.RawString(prefix)
- }
- out.String(string(in.Status))
- }
- if len(in.Labels) != 0 {
- const prefix string = ",\"Labels\":"
- if first {
- first = false
- out.RawString(prefix[1:])
- } else {
- out.RawString(prefix)
- }
- (in.Labels).MarshalEasyJSON(out)
- }
- if in.CreateConfig != nil {
- const prefix string = ",\"CreateConfig\":"
- if first {
- first = false
- out.RawString(prefix[1:])
- } else {
- out.RawString(prefix)
- }
- (*in.CreateConfig).MarshalEasyJSON(out)
- }
- if in.Hosts != nil {
- const prefix string = ",\"Hosts\":"
- if first {
- first = false
- out.RawString(prefix[1:])
- } else {
- out.RawString(prefix)
- }
- (*in.Hosts).MarshalEasyJSON(out)
- }
- out.RawByte('}')
-}
-
-// MarshalJSON supports json.Marshaler interface
-func (v Metadata) MarshalJSON() ([]byte, error) {
- w := jwriter.Writer{}
- easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesRunc(&w, v)
- return w.Buffer.BuildBytes(), w.Error
-}
-
-// MarshalEasyJSON supports easyjson.Marshaler interface
-func (v Metadata) MarshalEasyJSON(w *jwriter.Writer) {
- easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesRunc(w, v)
-}
-
-// UnmarshalJSON supports json.Unmarshaler interface
-func (v *Metadata) UnmarshalJSON(data []byte) error {
- r := jlexer.Lexer{Data: data}
- easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesRunc(&r, v)
- return r.Error()
-}
-
-// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
-func (v *Metadata) UnmarshalEasyJSON(l *jlexer.Lexer) {
- easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesRunc(l, v)
-}
-func easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesRunc1(in *jlexer.Lexer, out *Hosts) {
- isTopLevel := in.IsStart()
- if in.IsNull() {
- if isTopLevel {
- in.Consumed()
- }
- in.Skip()
- return
- }
- in.Delim('{')
- for !in.IsDelim('}') {
- key := in.UnsafeFieldName(false)
- in.WantColon()
- if in.IsNull() {
- in.Skip()
- in.WantComma()
- continue
- }
- switch key {
- case "IP":
- out.IP = string(in.String())
- case "Hostname":
- out.Hostname = string(in.String())
- case "ByIP":
- (out.ByIP).UnmarshalEasyJSON(in)
- default:
- in.SkipRecursive()
- }
- in.WantComma()
- }
- in.Delim('}')
- if isTopLevel {
- in.Consumed()
- }
-}
-func easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesRunc1(out *jwriter.Writer, in Hosts) {
- out.RawByte('{')
- first := true
- _ = first
- if in.IP != "" {
- const prefix string = ",\"IP\":"
- first = false
- out.RawString(prefix[1:])
- out.String(string(in.IP))
- }
- if in.Hostname != "" {
- const prefix string = ",\"Hostname\":"
- if first {
- first = false
- out.RawString(prefix[1:])
- } else {
- out.RawString(prefix)
- }
- out.String(string(in.Hostname))
- }
- if len(in.ByIP) != 0 {
- const prefix string = ",\"ByIP\":"
- if first {
- first = false
- out.RawString(prefix[1:])
- } else {
- out.RawString(prefix)
- }
- (in.ByIP).MarshalEasyJSON(out)
- }
- out.RawByte('}')
-}
-
-// MarshalJSON supports json.Marshaler interface
-func (v Hosts) MarshalJSON() ([]byte, error) {
- w := jwriter.Writer{}
- easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesRunc1(&w, v)
- return w.Buffer.BuildBytes(), w.Error
-}
-
-// MarshalEasyJSON supports easyjson.Marshaler interface
-func (v Hosts) MarshalEasyJSON(w *jwriter.Writer) {
- easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesRunc1(w, v)
-}
-
-// UnmarshalJSON supports json.Unmarshaler interface
-func (v *Hosts) UnmarshalJSON(data []byte) error {
- r := jlexer.Lexer{Data: data}
- easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesRunc1(&r, v)
- return r.Error()
-}
-
-// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
-func (v *Hosts) UnmarshalEasyJSON(l *jlexer.Lexer) {
- easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesRunc1(l, v)
-}
-func easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesRunc2(in *jlexer.Lexer, out *CreateConfig) {
- isTopLevel := in.IsStart()
- if in.IsNull() {
- if isTopLevel {
- in.Consumed()
- }
- in.Skip()
- return
- }
- in.Delim('{')
- for !in.IsDelim('}') {
- key := in.UnsafeFieldName(false)
- in.WantColon()
- if in.IsNull() {
- in.Skip()
- in.WantComma()
- continue
- }
- switch key {
- case "Image":
- out.Image = string(in.String())
- case "ImageID":
- out.ImageID = string(in.String())
- case "Labels":
- (out.Labels).UnmarshalEasyJSON(in)
- default:
- in.SkipRecursive()
- }
- in.WantComma()
- }
- in.Delim('}')
- if isTopLevel {
- in.Consumed()
- }
-}
-func easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesRunc2(out *jwriter.Writer, in CreateConfig) {
- out.RawByte('{')
- first := true
- _ = first
- if in.Image != "" {
- const prefix string = ",\"Image\":"
- first = false
- out.RawString(prefix[1:])
- out.String(string(in.Image))
- }
- if in.ImageID != "" {
- const prefix string = ",\"ImageID\":"
- if first {
- first = false
- out.RawString(prefix[1:])
- } else {
- out.RawString(prefix)
- }
- out.String(string(in.ImageID))
- }
- if len(in.Labels) != 0 {
- const prefix string = ",\"Labels\":"
- if first {
- first = false
- out.RawString(prefix[1:])
- } else {
- out.RawString(prefix)
- }
- (in.Labels).MarshalEasyJSON(out)
- }
- out.RawByte('}')
-}
-
-// MarshalJSON supports json.Marshaler interface
-func (v CreateConfig) MarshalJSON() ([]byte, error) {
- w := jwriter.Writer{}
- easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesRunc2(&w, v)
- return w.Buffer.BuildBytes(), w.Error
-}
-
-// MarshalEasyJSON supports easyjson.Marshaler interface
-func (v CreateConfig) MarshalEasyJSON(w *jwriter.Writer) {
- easyjsonBa0ee0e3EncodeGithubComSkydiveProjectSkydiveTopologyProbesRunc2(w, v)
-}
-
-// UnmarshalJSON supports json.Unmarshaler interface
-func (v *CreateConfig) UnmarshalJSON(data []byte) error {
- r := jlexer.Lexer{Data: data}
- easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesRunc2(&r, v)
- return r.Error()
-}
-
-// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
-func (v *CreateConfig) UnmarshalEasyJSON(l *jlexer.Lexer) {
- easyjsonBa0ee0e3DecodeGithubComSkydiveProjectSkydiveTopologyProbesRunc2(l, v)
-}
diff --git a/topology/probes/runc/runc.go b/topology/probes/runc/runc.go
index 5f96cab546..dd86e1f4c3 100644
--- a/topology/probes/runc/runc.go
+++ b/topology/probes/runc/runc.go
@@ -21,7 +21,6 @@ package runc
import (
"encoding/json"
- "errors"
"fmt"
"io/ioutil"
"os"
@@ -31,6 +30,7 @@ import (
"time"
"github.com/fsnotify/fsnotify"
+ "github.com/pkg/errors"
"github.com/safchain/insanelock"
"github.com/spf13/cast"
"github.com/vishvananda/netns"
@@ -123,18 +123,22 @@ func (p *ProbeHandler) getLabels(raw []string) graph.Metadata {
return labels
}
+// CreateConfig describes the creating parameters of a runc container
+type CreateConfig struct {
+ Image string `json:",omitempty"`
+ ImageID string `json:",omitempty"`
+ Labels graph.Metadata `json:",omitempty" field:"Metadata"`
+}
+
func getCreateConfig(path string) (*CreateConfig, error) {
body, err := ioutil.ReadFile(path)
if err != nil {
- if os.IsNotExist(err) {
- return nil, nil
- }
- return nil, fmt.Errorf("Unable to read create config %s: %s", path, err)
+ return nil, errors.Wrapf(err, "unable to read create config %s", path)
}
var cc CreateConfig
if err := json.Unmarshal(body, &cc); err != nil {
- return nil, fmt.Errorf("Unable to parse create config %s: %s", path, err)
+ return nil, errors.Wrapf(err, "unable to parse create config %s", path)
}
return &cc, nil
@@ -162,12 +166,12 @@ func getStatus(state *containerState) string {
func parseState(path string) (*containerState, error) {
body, err := ioutil.ReadFile(path)
if err != nil {
- return nil, fmt.Errorf("Unable to read container state %s: %s", path, err)
+ return nil, errors.Wrapf(err, "unable to read container state %s", path)
}
var state containerState
if err := json.Unmarshal(body, &state); err != nil {
- return nil, fmt.Errorf("Unable to parse container state %s: %s", path, err)
+ return nil, errors.Wrapf(err, "unable to parse container state %s", path)
}
state.path = path
@@ -185,13 +189,13 @@ func getHostsFromState(state *containerState) (string, error) {
return "", fmt.Errorf("Unable to find binding of %s", path)
}
-func (p *ProbeHandler) parseHosts(state *containerState) *Hosts {
+func (p *ProbeHandler) parseHosts(state *containerState) *topology.Hosts {
path, err := getHostsFromState(state)
if err != nil {
return nil
}
- hosts, err := readHosts(path)
+ hosts, err := topology.ReadHosts(path)
if err != nil {
if os.IsNotExist(err) {
p.Ctx.Logger.Debug(err)
@@ -205,10 +209,12 @@ func (p *ProbeHandler) parseHosts(state *containerState) *Hosts {
return hosts
}
-func (p *ProbeHandler) getMetadata(state *containerState) Metadata {
- m := Metadata{
- ContainerID: state.ID,
- Status: getStatus(state),
+func (p *ProbeHandler) getMetadata(state *containerState) *topology.ContainerMetadata {
+ m := &topology.ContainerMetadata{
+ Runtime: "runc",
+ ID: state.ID,
+ Status: getStatus(state),
+ InitProcessPID: int64(state.InitProcessPid),
}
if labels := p.getLabels(state.Config.Labels); len(labels) > 0 {
@@ -217,15 +223,21 @@ func (p *ProbeHandler) getMetadata(state *containerState) Metadata {
if b, ok := labels["bundle"]; ok {
cc, err := getCreateConfig(b.(string) + "/artifacts/create-config")
if err != nil {
- p.Ctx.Logger.Error(err)
+ if !errors.Is(err, os.ErrNotExist) {
+ p.Ctx.Logger.Error(err)
+ }
} else {
- m.CreateConfig = cc
+ m.Image = cc.Image
+ m.ImageID = cc.ImageID
+ for k, v := range cc.Labels {
+ m.Labels[k] = v
+ }
}
}
}
if hosts := p.parseHosts(state); hosts != nil {
- m.Hosts = hosts
+ m.Hosts = *hosts
}
return m
@@ -238,7 +250,7 @@ func (p *ProbeHandler) updateContainer(path string, cnt *container) error {
}
p.Ctx.Graph.Lock()
- p.Ctx.Graph.AddMetadata(cnt.node, "Runc", p.getMetadata(state))
+ p.Ctx.Graph.AddMetadata(cnt.node, "Container", p.getMetadata(state))
p.Ctx.Graph.Unlock()
return nil
@@ -255,7 +267,7 @@ func (p *ProbeHandler) registerContainer(path string) error {
nsHandle, err := netns.GetFromPid(state.InitProcessPid)
if err != nil {
- return fmt.Errorf("Unable to open netns, pid %d, state file %s : %s", state.InitProcessPid, path, err)
+ return errors.Wrapf(err, "unable to open netns, pid %d, state file %s", state.InitProcessPid, path)
}
defer nsHandle.Close()
@@ -290,22 +302,20 @@ func (p *ProbeHandler) registerContainer(path string) error {
p.Ctx.Graph.Lock()
defer p.Ctx.Graph.Unlock()
- containerNode := p.Ctx.Graph.LookupFirstNode(graph.Metadata{"InitProcessPID": pid})
+ containerNode := p.Ctx.Graph.LookupFirstNode(graph.Metadata{"Container.InitProcessPID": pid})
if containerNode != nil {
tr := p.Ctx.Graph.StartMetadataTransaction(containerNode)
- tr.AddMetadata("Runc", runcMetadata)
+ tr.AddMetadata("Container", runcMetadata)
tr.AddMetadata("Runtime", "runc")
if err := tr.Commit(); err != nil {
p.Ctx.Logger.Error(err)
}
} else {
metadata := graph.Metadata{
- "Type": "container",
- "Name": state.ID,
- "Manager": "runc",
- "Runtime": "runc",
- "InitProcessPID": pid,
- "Runc": runcMetadata,
+ "Type": "container",
+ "Name": state.ID,
+ "Manager": "runc",
+ "Container": runcMetadata,
}
if containerNode, err = p.Ctx.Graph.NewNode(graph.GenID(), metadata); err != nil {
@@ -479,7 +489,7 @@ func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) {
watcher, err := fsnotify.NewWatcher()
if err != nil {
- return nil, fmt.Errorf("Unable to create a new Watcher: %s", err)
+ return nil, errors.Wrap(err, "unable to create a new watcher")
}
return &ProbeHandler{
@@ -490,8 +500,3 @@ func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) {
containers: make(map[string]*container),
}, nil
}
-
-// Register registers graph metadata decoders
-func Register() {
- graph.NodeMetadataDecoders["Runc"] = MetadataDecoder
-}
diff --git a/topology/probes/runc/runc_test.go b/topology/probes/runc/runc_test.go
index 27bfe3a76c..4619c65386 100644
--- a/topology/probes/runc/runc_test.go
+++ b/topology/probes/runc/runc_test.go
@@ -23,6 +23,7 @@ import (
"testing"
"github.com/skydive-project/skydive/graffiti/logging"
+ "github.com/skydive-project/skydive/topology"
tp "github.com/skydive-project/skydive/topology/probes"
ns "github.com/skydive-project/skydive/topology/probes/netns"
)
@@ -138,7 +139,7 @@ func TestReadHosts(t *testing.T) {
}
defer os.Remove(filename)
- hosts, err := readHosts(filename)
+ hosts, err := topology.ReadHosts(filename)
if err != nil {
t.Errorf("unable to parse file: %s", filename)
}