diff --git a/EHEC_Server/EHEC_Server/EHEC_Server.csproj b/EHEC_Server/EHEC_Server/EHEC_Server.csproj
index b6df2d2..310d3a0 100644
--- a/EHEC_Server/EHEC_Server/EHEC_Server.csproj
+++ b/EHEC_Server/EHEC_Server/EHEC_Server.csproj
@@ -80,10 +80,55 @@
EntityModelCodeGenerator
Model.Designer.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Model.edmx
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Web.config
@@ -107,6 +152,13 @@
+
+ cluster.aspx
+ ASPXCodeBehind
+
+
+ cluster.aspx
+
diff --git a/EHEC_Server/EHEC_Server/Web.config b/EHEC_Server/EHEC_Server/Web.config
index e2466e9..3fd839c 100644
--- a/EHEC_Server/EHEC_Server/Web.config
+++ b/EHEC_Server/EHEC_Server/Web.config
@@ -30,8 +30,8 @@
-
-
+
+
diff --git a/EHEC_Server/EHEC_Server/alchemy/alchemy-white.css b/EHEC_Server/EHEC_Server/alchemy/alchemy-white.css
new file mode 100644
index 0000000..c48f614
--- /dev/null
+++ b/EHEC_Server/EHEC_Server/alchemy/alchemy-white.css
@@ -0,0 +1,698 @@
+@-webkit-keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 25% {
+ opacity: .3;
+ }
+
+ 50% {
+ opacity: .66;
+ }
+
+ 75% {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 25% {
+ opacity: .3;
+ }
+
+ 50% {
+ opacity: .66;
+ }
+
+ 75% {
+ opacity: 1;
+ }
+}
+
+@-webkit-keyframes pulse {
+ 0% {
+ text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
+ }
+
+ 25% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
+ }
+
+ 50% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
+ }
+
+ 75% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
+ }
+}
+
+@keyframes pulse {
+ 0% {
+ text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
+ }
+
+ 25% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
+ }
+
+ 50% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
+ }
+
+ 75% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
+ }
+}
+
+@-webkit-keyframes slide-in {
+ 0% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+}
+
+@keyframes slide-in {
+ 0% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+}
+
+@-webkit-keyframes slide-out {
+ 0% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+}
+
+@keyframes slide-out {
+ 100% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+}
+
+svg {
+ background: white;
+ position: absolute;
+ left: 0;
+ cursor: -webkit-grab;
+ height: 100%;
+ width: 100%;
+ color: #333;
+}
+
+.edge path {
+ fill: none;
+}
+
+.edge .edge-handler {
+ stroke: transparent;
+ fill: none;
+}
+
+.edge text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+}
+
+.edge.active text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+}
+
+.edge.active:hover,
+.edge.active.selected {
+ cursor: pointer;
+}
+
+.edge.active:hover text,
+.edge.active.selected text {
+ display: block;
+}
+
+#zoom-controls {
+ background-color: rgba(0,0,0,0.3);
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ box-shadow: 0 0 5px rgba(255,255,255,0.3);
+ margin-top: 10%;
+ z-index: 5;
+ position: relative;
+ display: block;
+ width: 55px;
+}
+
+#zoom-controls #zoom-in,
+#zoom-controls #zoom-out,
+#zoom-controls #zoom-reset {
+ padding: 12px;
+ margin: 0;
+ width: 100%;
+}
+
+#zoom-controls #zoom-in i,
+#zoom-controls #zoom-out i,
+#zoom-controls #zoom-reset i {
+ color: #E89619;
+}
+
+#zoom-controls #zoom-in:hover,
+#zoom-controls #zoom-out:hover,
+#zoom-controls #zoom-reset:hover {
+ background-color: rgba(255,255,255,0.2);
+}
+
+#zoom-controls #zoom-in:active,
+#zoom-controls #zoom-out:active,
+#zoom-controls #zoom-reset:active {
+ border: none;
+}
+
+.fa-caret-right,
+.fa-caret-down {
+ margin: 0 5px;
+ color: #68b9fe;
+}
+
+#search {
+ margin-top: 2em;
+ margin-bottom: 1em;
+ padding: .5em 1em;
+ width: 100%;
+}
+
+#search span {
+ vertical-align: bottom;
+}
+
+#search input {
+ background-color: transparent;
+ border: thin dashed #68B9FE;
+ font-size: 20px;
+ padding-left: 0.5em;
+ margin-top: -1px;
+}
+
+#search input::-webkit-input-placeholder {
+ color: white;
+}
+
+#search input:-moz-placeholder {
+ color: white;
+}
+
+#search input::-moz-placeholder {
+ color: white;
+}
+
+#search input:-ms-input-placeholder {
+ color: white;
+}
+
+#search .search-icon {
+ height: 22px;
+ background-color: transparent;
+ border: thin dashed #68B9FE;
+ color: white;
+}
+
+#stats {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #68b9fe;
+}
+
+#stats #stats-header {
+ padding: 10px;
+}
+
+#stats #all-stats {
+ color: white;
+ border-radius: none;
+ border: none;
+ background: transparent;
+ overflow: auto;
+}
+
+#stats #all-stats li {
+ padding: 3px;
+}
+
+#stats #node-stats-graph,
+#stats #edge-stats-graph {
+ height: 250px;
+}
+
+#stats #node-stats-graph svg,
+#stats #edge-stats-graph svg {
+ opacity: .6;
+ background: transparent;
+}
+
+#stats #node-stats-graph text,
+#stats #edge-stats-graph text {
+ font-size: 16px;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+}
+
+#stats #node-stats-graph .no-data,
+#stats #edge-stats-graph .no-data {
+ margin: 30px 0;
+ color: #68b9fe;
+}
+
+#stats .badge {
+ border-radius: 0;
+ height: 100%;
+ background-color: rgba(104,185,254,0.6);
+}
+
+#editor {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #68b9fe;
+}
+
+#editor h3 {
+ padding: 10px;
+}
+
+#editor #element-options {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+ cursor: pointer;
+ margin-top: 10px;
+ margin-left: 2%;
+ color: white;
+}
+
+#editor #element-options .node-property,
+#editor #element-options #node-add-property {
+ display: -webkit-inline-flex;
+ display: inline-flex;
+ margin: 4px 0;
+ width: 100%;
+}
+
+#editor #element-options .property-value,
+#editor #element-options #node-add-property #add-property #node-add-prop-value {
+ border: thin rgba(255,255,255,0.2) solid;
+ border-left: none;
+ background-color: black;
+ color: white;
+ width: 100%;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+#editor #element-options .property-name,
+#editor #element-options #node-add-property #add-property #node-add-prop-key {
+ text-align: center;
+ font-weight: 200;
+ cursor: default;
+ background: #2E2E2E;
+ border: thin transparent solid;
+ color: #68b9fe;
+ border-right: none;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+#editor #element-options #node-add-property #add-property {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-grow: 2;
+ flex-grow: 2;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+}
+
+#editor #element-options #node-add-property #add-property #node-add-prop-value {
+ text-align: center;
+ width: 100%;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 4px;
+ border: thin rgba(255,255,255,0.2) solid;
+}
+
+#editor #element-options #node-add-property #add-property #node-add-prop-key {
+ cursor: text;
+ width: 100%;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 0;
+}
+
+#editor #element-options input[type="submit"],
+#editor #element-options #update-properties {
+ color: #68b9fe;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ width: auto;
+ background: rgba(255,255,255,0.1);
+ border: thin solid #68b9fe;
+ text-align: center;
+}
+
+#editor #element-options input[type="submit"]:active,
+#editor #element-options #update-properties:active,
+#editor #element-options input[type="submit"]:focus,
+#editor #element-options #update-properties:focus {
+ outline: none;
+}
+
+#editor #element-options input[type="submit"]:hover,
+#editor #element-options #update-properties:hover {
+ color: white;
+ border: thin solid white;
+}
+
+#editor #element-options #update-properties {
+ border-radius: 4px;
+ padding: 10px;
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+#editor #editor-interactions.active {
+ color: #68b9fe;
+}
+
+#editor #editor-interactions.inactive {
+ color: white;
+}
+
+#editor #node-editor.enabled {
+ -webkit-animation: fadeIn 1s linear;
+ animation: fadeIn 1s linear;
+}
+
+#control-dash-wrapper {
+ font-family: 'Source Sans Pro', Helvetica, sans-serif;
+ letter-spacing: .05em;
+ height: inherit;
+ z-index: inherit;
+ padding: 0;
+}
+
+#control-dash-wrapper.initial {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+}
+
+#control-dash-wrapper.initial #dash-toggle {
+ color: #68b9fe;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper.off-canvas {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ -webkit-animation: slide-out .75s linear;
+ animation: slide-out .75s linear;
+}
+
+#control-dash-wrapper.off-canvas #dash-toggle {
+ color: #68b9fe;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper.on-canvas {
+ -webkit-animation: slide-in .75s ease-in-out;
+ animation: slide-in .75s ease-in-out;
+}
+
+#control-dash-wrapper.on-canvas * {
+ box-shadow: none !important;
+}
+
+#control-dash-wrapper.on-canvas #dash-toggle {
+ color: rgba(104,185,254,0.6);
+}
+
+#control-dash-wrapper.on-canvas #dash-toggle:hover {
+ color: #68b9fe;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper #control-dash {
+ overflow-x: hidden;
+ overflow-y: scroll;
+ background-color: rgba(0,0,0,0.3);
+ padding: 0;
+ height: inherit;
+ z-index: 5;
+}
+
+#control-dash-wrapper #control-dash h3 {
+ display: inline;
+ margin: 0;
+}
+
+#control-dash-wrapper #dash-toggle {
+ z-index: 5;
+ background-color: rgba(0,0,0,0.3);
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ box-shadow: 0 0 5px rgba(255,255,255,0.3);
+ position: absolute;
+ left: 0;
+ top: 50%;
+ font-size: 2.2em;
+ color: rgba(255,255,255,0.2);
+ padding: 10px;
+}
+
+#control-dash-wrapper button {
+ border-radius: 0;
+ border: none;
+ background-color: transparent;
+}
+
+#control-dash-wrapper button:active {
+ border: none;
+}
+
+#control-dash-wrapper h3 {
+ font-weight: 200;
+ margin-top: 10px;
+ color: white;
+ cursor: pointer;
+ vertical-align: top;
+}
+
+#control-dash-wrapper li {
+ cursor: pointer;
+ background: transparent;
+ border: none;
+ border-radius: 0;
+}
+
+.node {
+ cursor: pointer;
+}
+
+.node text.root {
+ font-size: 32px;
+}
+
+.node text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+}
+
+.node.active {
+ opacity: 1;
+}
+
+.node.active.selected text {
+ display: block;
+}
+
+.node.active:hover text {
+ display: block;
+}
+
+#filters {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #68b9fe;
+ color: white;
+}
+
+#filters form {
+ width: 100%;
+}
+
+#filters #filter-header {
+ padding: 10px;
+}
+
+#filters #filter-relationships,
+#filters #filter-nodes {
+ background-color: transparent;
+ display: inline-block;
+ width: 45%;
+ margin-left: 2%;
+ overflow: auto;
+ text-align: center;
+ vertical-align: top;
+}
+
+#filters #filter-relationships #filter-node-header,
+#filters #filter-relationships #filter-rel-header,
+#filters #filter-nodes #filter-node-header,
+#filters #filter-nodes #filter-rel-header {
+ margin: 10px 0;
+ cursor: pointer;
+ background-color: transparent;
+ border: none;
+ border-radius: 0;
+ width: 100%;
+}
+
+#filters #filter-relationships #filter-node-header h4,
+#filters #filter-relationships #filter-rel-header h4,
+#filters #filter-nodes #filter-node-header h4,
+#filters #filter-nodes #filter-rel-header h4 {
+ font-weight: 200;
+ display: inline;
+ color: white;
+}
+
+#filters #filter-relationships #filter-node-header:active,
+#filters #filter-relationships #filter-rel-header:active,
+#filters #filter-nodes #filter-node-header:active,
+#filters #filter-nodes #filter-rel-header:active {
+ border: none;
+ box-shadow: none;
+}
+
+#filters #filter-relationships #rel-dropdown,
+#filters #filter-relationships #node-dropdown,
+#filters #filter-nodes #rel-dropdown,
+#filters #filter-nodes #node-dropdown {
+ margin: 20px 0;
+ border-radius: none;
+ border: none;
+ background: transparent;
+}
+
+#filters #filter-relationships #rel-dropdown li,
+#filters #filter-relationships #node-dropdown li,
+#filters #filter-nodes #rel-dropdown li,
+#filters #filter-nodes #node-dropdown li {
+ padding: 5px;
+}
+
+#filters #filter-relationships #rel-dropdown li:hover,
+#filters #filter-relationships #node-dropdown li:hover,
+#filters #filter-nodes #rel-dropdown li:hover,
+#filters #filter-nodes #node-dropdown li:hover {
+ background-color: rgba(255,255,255,0.2);
+}
+
+#filters .disabled {
+ color: rgba(255,255,255,0.5);
+}
+
+#filters .disabled:hover {
+ color: #68b9fe;
+}
+
+.alchemy {
+ position: relative;
+}
+
+.alchemy #search form {
+ z-index: 2;
+ display: inline;
+ margin-left: 100px;
+}
+
+.alchemy #add-tag {
+ width: 300px;
+ display: inline-block;
+}
+
+.alchemy #tags input {
+ max-width: 220px;
+}
+
+.alchemy #tags-list {
+ padding: 0;
+}
+
+.alchemy #tags-list .icon-remove-sign {
+ cursor: pointer;
+}
+
+.alchemy #tags-list li {
+ display: inline-block;
+ margin-top: 5px;
+}
+
+.alchemy #tags-list span {
+ background-color: #ccc;
+ color: #333;
+ border-radius: 10em;
+ display: inline-block;
+ padding: 1px 6px;
+}
+
+.alchemy #filter-nodes label,
+.alchemy #filter-relationships label {
+ font-weight: normal;
+ margin-right: 1em;
+}
+
+.alchemy .clear {
+ clear: both;
+}
+
+.alchemy text {
+ font-weight: 200;
+ text-anchor: middle;
+}
\ No newline at end of file
diff --git a/EHEC_Server/EHEC_Server/alchemy/alchemy.css b/EHEC_Server/EHEC_Server/alchemy/alchemy.css
new file mode 100644
index 0000000..6571ef0
--- /dev/null
+++ b/EHEC_Server/EHEC_Server/alchemy/alchemy.css
@@ -0,0 +1,714 @@
+@-webkit-keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 25% {
+ opacity: .3;
+ }
+
+ 50% {
+ opacity: .66;
+ }
+
+ 75% {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 25% {
+ opacity: .3;
+ }
+
+ 50% {
+ opacity: .66;
+ }
+
+ 75% {
+ opacity: 1;
+ }
+}
+
+@-webkit-keyframes pulse {
+ 0% {
+ text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
+ }
+
+ 25% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
+ }
+
+ 50% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
+ }
+
+ 75% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
+ }
+}
+
+@keyframes pulse {
+ 0% {
+ text-shadow: 0 0 10px rgba(255,255,255,0.2),0 0 12px rgba(255,255,255,0.2),0 0 16px rgba(255,255,255,0.2);
+ }
+
+ 25% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 6px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7);
+ }
+
+ 50% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 20px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 10px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7);
+ }
+
+ 75% {
+ text-shadow: 0 0 12px rgba(255,255,255,0.2),0 0 15px rgba(255,255,255,0.2),0 0 25px rgba(255,255,255,0.2),0 0 8px rgba(104,185,254,0.7),0 0 12px rgba(104,185,254,0.7),0 0 15px rgba(104,185,254,0.7),0 0 20px rgba(104,185,254,0.7);
+ }
+}
+
+@-webkit-keyframes slide-in {
+ 0% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+}
+
+@keyframes slide-in {
+ 0% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+}
+
+@-webkit-keyframes slide-out {
+ 0% {
+ -webkit-transform: translate(0%, 0);
+ transform: translate(0%, 0);
+ }
+
+ 100% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+}
+
+@keyframes slide-out {
+ 100% {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ }
+}
+
+svg {
+ position: absolute;
+ left: 0;
+ cursor: -webkit-grab;
+ height: 100%;
+ width: 100%;
+ color: #333;
+}
+
+.node {
+ cursor: pointer;
+}
+
+.node text.root {
+ font-size: 32px;
+}
+
+.node text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+}
+
+.node.active {
+ opacity: 1;
+}
+
+.node.active.selected text {
+ display: block;
+}
+
+.node.active:hover text {
+ display: block;
+}
+
+defs #arrow path {
+ stroke: #CCC;
+ stroke-opacity: 0.2;
+ fill: #CCC;
+ opacity: 1;
+}
+
+.edge text {
+ stroke-width: 0;
+}
+
+.edge .edge-handler {
+ fill: none;
+ stroke: none;
+}
+
+.edge .edge-line {
+ fill: none;
+}
+
+.edge.active text {
+ display: none;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ text-shadow: 1px 1px #333, -1px 1px #333, 1px -1px #333, -1px -1px #333;
+ z-index: 1000;
+}
+
+.edge.active:hover,
+.edge.active.selected {
+ cursor: pointer;
+}
+
+.edge.active:hover text,
+.edge.active.selected text {
+ display: block;
+}
+
+.edge.active.highlight text {
+ display: block;
+}
+
+#zoom-controls {
+ background-color: transparent;
+ background-image: url("images/maze-black.png");
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ box-shadow: 0 0 5px rgba(255,255,255,0.3);
+ margin-top: 10%;
+ z-index: 5;
+ position: relative;
+ display: block;
+ width: 55px;
+}
+
+#zoom-controls #zoom-in,
+#zoom-controls #zoom-out,
+#zoom-controls #zoom-reset {
+ padding: 12px;
+ margin: 0;
+ width: 100%;
+}
+
+#zoom-controls #zoom-in i,
+#zoom-controls #zoom-out i,
+#zoom-controls #zoom-reset i {
+ color: #E89619;
+}
+
+#zoom-controls #zoom-in:hover,
+#zoom-controls #zoom-out:hover,
+#zoom-controls #zoom-reset:hover {
+ background-color: rgba(255,255,255,0.2);
+}
+
+#zoom-controls #zoom-in:active,
+#zoom-controls #zoom-out:active,
+#zoom-controls #zoom-reset:active {
+ border: none;
+}
+
+.fa-caret-right,
+.fa-caret-down,
+.fa-search {
+ margin: 0 5px;
+ color: #e89619;
+}
+
+#search {
+ margin-top: 2em;
+ margin-bottom: 1em;
+ padding: .5em 1em;
+ width: 100%;
+}
+
+#search span {
+ vertical-align: bottom;
+}
+
+#search input {
+ background-color: black;
+ border: none;
+ font-size: 20px;
+ color: white;
+ padding-left: 0.5em;
+}
+
+#search .search-icon {
+ height: 22px;
+ background-color: #000;
+ border-color: #000;
+ border-right-color: #111;
+}
+
+#stats {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #e89619;
+}
+
+#stats #stats-header {
+ padding: 10px;
+}
+
+#stats #all-stats {
+ color: white;
+ border-radius: none;
+ border: none;
+ background: transparent;
+ overflow: auto;
+}
+
+#stats #all-stats li {
+ padding: 3px;
+}
+
+#stats #node-stats-graph,
+#stats #edge-stats-graph {
+ height: 250px;
+}
+
+#stats #node-stats-graph svg,
+#stats #edge-stats-graph svg {
+ opacity: .6;
+ background: transparent;
+}
+
+#stats #node-stats-graph text,
+#stats #edge-stats-graph text {
+ font-size: 16px;
+ fill: white;
+ font-weight: 200;
+ text-anchor: middle;
+ z-index: 1000;
+}
+
+#stats #node-stats-graph .no-data,
+#stats #edge-stats-graph .no-data {
+ margin: 30px 0;
+ color: #e89619;
+}
+
+#stats .badge {
+ border-radius: 0;
+ height: 100%;
+ background-color: rgba(104,185,254,0.6);
+}
+
+#editor {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #e89619;
+}
+
+#editor h3 {
+ padding: 10px;
+}
+
+#editor #element-options {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+ cursor: pointer;
+ margin-top: 10px;
+ margin-left: 2%;
+ color: white;
+}
+
+#editor #element-options .property,
+#editor #element-options #add-property-form {
+ display: -webkit-inline-flex;
+ display: inline-flex;
+ margin: 4px 0;
+ width: 100%;
+}
+
+#editor #element-options .property-value,
+#editor #element-options #add-property-form #add-property #add-prop-value {
+ border: thin rgba(255,255,255,0.2) solid;
+ border-left: none;
+ background-color: black;
+ color: white;
+ width: 100%;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+#editor #element-options .property-name,
+#editor #element-options #add-property-form #add-property #add-prop-key {
+ text-align: center;
+ font-weight: 200;
+ cursor: default;
+ background: #2E2E2E;
+ border: thin transparent solid;
+ color: #e89619;
+ border-right: none;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+#editor #element-options input[type="submit"],
+#editor #element-options #update-properties {
+ color: #e89619;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ width: auto;
+ background: rgba(255,255,255,0.1);
+ border: thin solid #e89619;
+ text-align: center;
+}
+
+#editor #element-options input[type="submit"]:active,
+#editor #element-options #update-properties:active,
+#editor #element-options input[type="submit"]:focus,
+#editor #element-options #update-properties:focus {
+ outline: none;
+}
+
+#editor #element-options input[type="submit"]:hover,
+#editor #element-options #update-properties:hover {
+ color: white;
+ border: thin solid white;
+}
+
+#editor #element-options #update-properties {
+ border-radius: 4px;
+ padding: 10px;
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+#editor #element-options #add-property-form #add-property {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-grow: 2;
+ flex-grow: 2;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+}
+
+#editor #element-options #add-property-form #add-property #add-prop-value {
+ text-align: center;
+ width: 100%;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 4px;
+ border: thin rgba(255,255,255,0.2) solid;
+}
+
+#editor #element-options #add-property-form #add-property #add-prop-key {
+ cursor: text;
+ width: 100%;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 0;
+}
+
+#editor #editor-interactions.active {
+ color: #e89619;
+}
+
+#editor #editor-interactions.inactive {
+ color: white;
+}
+
+#editor #node-editor.enabled,
+#editor #edge-editor.enabled {
+ -webkit-animation: fadeIn 1s linear;
+ animation: fadeIn 1s linear;
+}
+
+#control-dash-wrapper {
+ font-family: 'Source Sans Pro', Helvetica, sans-serif;
+ letter-spacing: .05em;
+ height: inherit;
+ z-index: inherit;
+ padding: 0;
+}
+
+#control-dash-wrapper.initial {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+}
+
+#control-dash-wrapper.initial #dash-toggle {
+ color: #e89619;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper.off-canvas {
+ -webkit-transform: translate(-100%, 0);
+ transform: translate(-100%, 0);
+ -webkit-animation: slide-out .75s linear;
+ animation: slide-out .75s linear;
+}
+
+#control-dash-wrapper.off-canvas #dash-toggle {
+ color: #e89619;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper.on-canvas {
+ -webkit-animation: slide-in .75s ease-in-out;
+ animation: slide-in .75s ease-in-out;
+}
+
+#control-dash-wrapper.on-canvas * {
+ box-shadow: none !important;
+}
+
+#control-dash-wrapper.on-canvas #dash-toggle {
+ color: rgba(232,150,25,0.6);
+}
+
+#control-dash-wrapper.on-canvas #dash-toggle:hover {
+ color: #e89619;
+ -webkit-animation: 4s pulse linear;
+ animation: 4s pulse linear;
+}
+
+#control-dash-wrapper #control-dash {
+ overflow-x: hidden;
+ overflow-y: scroll;
+ background-color: transparent;
+ background-image: url("images/maze-black.png");
+ padding: 0;
+ height: inherit;
+ z-index: 5;
+}
+
+#control-dash-wrapper #control-dash h3 {
+ display: inline;
+ margin: 0;
+}
+
+#control-dash-wrapper #dash-toggle {
+ z-index: 5;
+ background-color: transparent;
+ background-image: url("images/maze-black.png");
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ box-shadow: 0 0 5px rgba(255,255,255,0.3);
+ position: absolute;
+ left: 0;
+ top: 50%;
+ font-size: 2.2em;
+ color: rgba(255,255,255,0.2);
+ padding: 10px;
+}
+
+#control-dash-wrapper button {
+ border-radius: 0;
+ border: none;
+ background-color: transparent;
+}
+
+#control-dash-wrapper button:active {
+ border: none;
+}
+
+#control-dash-wrapper h3 {
+ font-weight: 200;
+ margin-top: 10px;
+ color: white;
+ cursor: pointer;
+ vertical-align: top;
+}
+
+#control-dash-wrapper li {
+ cursor: pointer;
+ background: transparent;
+ border: none;
+ border-radius: 0;
+}
+
+#clustering {
+ padding: 0.5em 1em;
+ cursor: pointer;
+ color: white;
+ border-bottom: thin dashed #E89619;
+}
+
+#clustering #cluster_control_header,
+#clustering #cluster-key-container {
+ padding: 10px 10px 0 10px;
+}
+
+#clustering #cluster-key {
+ color: #333;
+ background-color: #000;
+ border-radius: 4px;
+ border: thin solid #333;
+ text-align: center;
+ display: inline-block;
+ width: 100%;
+}
+
+#filters {
+ padding: 0.5em 1em;
+ background-color: transparent;
+ border-bottom: thin dashed #e89619;
+ color: white;
+}
+
+#filters form {
+ width: 100%;
+}
+
+#filters #filter-header {
+ padding: 10px;
+}
+
+#filters #filter-relationships,
+#filters #filter-nodes {
+ background-color: transparent;
+ display: inline-block;
+ width: 45%;
+ margin-left: 2%;
+ overflow: auto;
+ text-align: center;
+ vertical-align: top;
+}
+
+#filters #filter-relationships #filter-node-header,
+#filters #filter-relationships #filter-rel-header,
+#filters #filter-nodes #filter-node-header,
+#filters #filter-nodes #filter-rel-header {
+ margin: 10px 0;
+ cursor: pointer;
+ background-color: transparent;
+ border: none;
+ border-radius: 0;
+ width: 100%;
+}
+
+#filters #filter-relationships #filter-node-header h4,
+#filters #filter-relationships #filter-rel-header h4,
+#filters #filter-nodes #filter-node-header h4,
+#filters #filter-nodes #filter-rel-header h4 {
+ font-weight: 200;
+ display: inline;
+ color: white;
+}
+
+#filters #filter-relationships #filter-node-header:active,
+#filters #filter-relationships #filter-rel-header:active,
+#filters #filter-nodes #filter-node-header:active,
+#filters #filter-nodes #filter-rel-header:active {
+ border: none;
+ box-shadow: none;
+}
+
+#filters #filter-relationships #rel-dropdown,
+#filters #filter-relationships #node-dropdown,
+#filters #filter-nodes #rel-dropdown,
+#filters #filter-nodes #node-dropdown {
+ margin: 20px 0;
+ border-radius: none;
+ border: none;
+ background: transparent;
+}
+
+#filters #filter-relationships #rel-dropdown li,
+#filters #filter-relationships #node-dropdown li,
+#filters #filter-nodes #rel-dropdown li,
+#filters #filter-nodes #node-dropdown li {
+ padding: 5px;
+}
+
+#filters #filter-relationships #rel-dropdown li:hover,
+#filters #filter-relationships #node-dropdown li:hover,
+#filters #filter-nodes #rel-dropdown li:hover,
+#filters #filter-nodes #node-dropdown li:hover {
+ background-color: rgba(255,255,255,0.2);
+}
+
+#filters .disabled {
+ color: rgba(255,255,255,0.5);
+}
+
+#filters .disabled:hover {
+ color: #fdc670;
+}
+
+.alchemy {
+ position: relative;
+}
+
+.alchemy #search form {
+ z-index: 2;
+ display: inline;
+ margin-left: 100px;
+}
+
+.alchemy #add-tag {
+ width: 300px;
+ display: inline-block;
+}
+
+.alchemy #tags input {
+ max-width: 220px;
+}
+
+.alchemy #tags-list {
+ padding: 0;
+}
+
+.alchemy #tags-list .icon-remove-sign {
+ cursor: pointer;
+}
+
+.alchemy #tags-list li {
+ display: inline-block;
+ margin-top: 5px;
+}
+
+.alchemy #tags-list span {
+ background-color: #ccc;
+ color: #333;
+ border-radius: 10em;
+ display: inline-block;
+ padding: 1px 6px;
+}
+
+.alchemy #filter-nodes label,
+.alchemy #filter-relationships label {
+ font-weight: normal;
+ margin-right: 1em;
+}
+
+.alchemy .clear {
+ clear: both;
+}
+
+.alchemy text {
+ font-weight: 200;
+ text-anchor: middle;
+}
\ No newline at end of file
diff --git a/EHEC_Server/EHEC_Server/alchemy/alchemy.js b/EHEC_Server/EHEC_Server/alchemy/alchemy.js
new file mode 100644
index 0000000..9f88452
--- /dev/null
+++ b/EHEC_Server/EHEC_Server/alchemy/alchemy.js
@@ -0,0 +1,3153 @@
+(function() {
+ "Alchemy.js is a graph drawing application for the web.\nCopyright (C) 2014 GraphAlchemist, Inc.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License\nalong with this program. If not, see .\nlets";
+ var Alchemy, Clustering, DrawEdge, DrawEdges, DrawNode, DrawNodes, Editor, EditorInteractions, EditorUtils, Layout, root, warnings,
+ __slice = [].slice,
+ __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+
+ Alchemy = (function() {
+ function Alchemy(userConf) {
+ if (userConf == null) {
+ userConf = null;
+ }
+ this.a = this;
+ this.version = "0.4.1";
+ this.get = new this.Get(this);
+ this.remove = new this.Remove(this);
+ this.create = new this.Create(this);
+ this.set = new this.Set(this);
+ this.drawing = {
+ DrawEdge: DrawEdge(this),
+ DrawEdges: DrawEdges(this),
+ DrawNode: DrawNode(this),
+ DrawNodes: DrawNodes(this),
+ EdgeUtils: this.EdgeUtils(this),
+ NodeUtils: this.NodeUtils(this)
+ };
+ this.controlDash = this.controlDash(this);
+ this.stats = this.stats(this);
+ this.layout = Layout;
+ this.clustering = Clustering;
+ this.models = {
+ Node: this.Node(this),
+ Edge: this.Edge(this)
+ };
+ this.utils = {
+ warnings: new warnings(this)
+ };
+ this.filters = this.filters(this);
+ this.exports = this.exports(this);
+ this.visControls = {};
+ this.styles = {};
+ this.editor = {};
+ this.log = {};
+ this.state = {
+ "interactions": "default",
+ "layout": "default"
+ };
+ this.startGraph = this.startGraph(this);
+ this.updateGraph = this.updateGraph(this);
+ this.generateLayout = this.generateLayout(this);
+ this.svgStyles = this.svgStyles(this);
+ this.interactions = this.interactions(this);
+ this.search = this.search(this);
+ this.plugins = this.plugins(this);
+ this._nodes = {};
+ this._edges = {};
+ this.getNodes = this.get.getNodes;
+ this.getEdges = this.get.getEdges;
+ this.allNodes = this.get.allNodes;
+ this.allEdges = this.get.allEdges;
+ if (userConf) {
+ this.begin(userConf);
+ }
+ }
+
+ Alchemy.prototype.begin = function(userConf) {
+ var conf;
+ conf = this.setConf(userConf);
+ switch (typeof this.conf.dataSource) {
+ case 'string':
+ d3.json(this.a.conf.dataSource, this.a.startGraph);
+ break;
+ case 'object':
+ this.a.startGraph(this.a.conf.dataSource);
+ }
+ this.plugins.init();
+ Alchemy.prototype.instances.push(this);
+ return this;
+ };
+
+ Alchemy.prototype.setConf = function(userConf) {
+ var key, val;
+ if (userConf.theme != null) {
+ userConf = _.merge(_.cloneDeep(this.defaults), this.a.themes["" + userConf.theme]);
+ }
+ for (key in userConf) {
+ val = userConf[key];
+ switch (key) {
+ case "clusterColors":
+ userConf["clusterColours"] = val;
+ break;
+ case "backgroundColor":
+ userConf["backgroundColour"] = val;
+ break;
+ case "nodeColor":
+ userConf[nodeColour] = val;
+ }
+ }
+ return this.a.conf = _.merge(_.cloneDeep(this.defaults), userConf);
+ };
+
+ Alchemy.prototype.instances = [];
+
+ Alchemy.prototype.getInst = function(svg) {
+ var instNumber;
+ instNumber = parseInt(d3.select(svg).attr("alchInst"));
+ return Alchemy.prototype.instances[instNumber];
+ };
+
+ return Alchemy;
+
+ })();
+
+ root = typeof exports !== "undefined" && exports !== null ? exports : this;
+
+ root.Alchemy = Alchemy;
+
+ root.alchemy = {
+ begin: function(config) {
+ return root.alchemy = new Alchemy(config);
+ }
+ };
+
+ Alchemy.prototype.Create = (function() {
+ function Create(instance) {
+ this.a = instance;
+ }
+
+ Create.prototype.nodes = function() {
+ var a, n, nodeMap, nodeMaps, registerNode, _i, _len;
+ nodeMap = arguments[0], nodeMaps = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ a = this.a;
+ registerNode = function(node) {
+ var aNode;
+ if (!a._nodes[node.id]) {
+ aNode = new a.models.Node(node);
+ a._nodes[node.id] = aNode;
+ return [aNode];
+ } else {
+ return console.warn("A node with the id " + node.id + " already exists.\nConsider using the @a.get.nodes() method to \nretrieve the node and then using the Node methods.");
+ }
+ };
+ nodeMaps = _.union(nodeMaps, nodeMap);
+ for (_i = 0, _len = nodeMaps.length; _i < _len; _i++) {
+ n = nodeMaps[_i];
+ registerNode(n);
+ }
+ if (this.a.initial) {
+ return this.a.updateGraph();
+ }
+ };
+
+ Create.prototype.edges = function() {
+ var a, allEdges, edgeMap, edgeMaps, registerEdge;
+ edgeMap = arguments[0], edgeMaps = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ a = this.a;
+ registerEdge = function(edge) {
+ var aEdge, edgeArray;
+ if (edge.id && !a._edges[edge.id]) {
+ aEdge = new a.models.Edge(edge);
+ a._edges[edge.id] = [aEdge];
+ return [aEdge];
+ } else if (edge.id && a._edges[edge.id]) {
+ return console.warn("An edge with that id " + someEdgeMap.id + " already exists.\nConsider using the @a.get.edge() method to \nretrieve the edge and then using the Edge methods.\nNote: id's are not required for edges. Alchemy will create\nan unlimited number of edges for the same source and target node.\nSimply omit 'id' when creating the edge.");
+ } else {
+ edgeArray = a._edges["" + edge.source + "-" + edge.target];
+ if (edgeArray) {
+ aEdge = new a.models.Edge(edge, edgeArray.length);
+ edgeArray.push(aEdge);
+ return [aEdge];
+ } else {
+ aEdge = new a.models.Edge(edge, 0);
+ a._edges["" + edge.source + "-" + edge.target] = [aEdge];
+ return [aEdge];
+ }
+ }
+ };
+ allEdges = _.uniq(_.flatten(arguments));
+ _.each(allEdges, function(e) {
+ return registerEdge(e);
+ });
+ if (this.a.initial) {
+ return this.a.updateGraph();
+ }
+ };
+
+ return Create;
+
+ })();
+
+ Alchemy.prototype.Get = function(instance) {
+ return {
+ a: instance,
+ _el: [],
+ _elType: null,
+ _makeChain: function(inp) {
+ var returnedGet;
+ returnedGet = this;
+ returnedGet.__proto__ = [].__proto__;
+ while (returnedGet.length) {
+ returnedGet.pop();
+ }
+ _.each(inp, function(e) {
+ return returnedGet.push(e);
+ });
+ return returnedGet;
+ },
+ nodes: function() {
+ var a, allIDs, id, ids, nodeList;
+ id = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ if (id != null) {
+ allIDs = _.map(arguments, function(arg) {
+ return String(arg);
+ });
+ a = this.a;
+ nodeList = (function(a) {
+ return _.filter(a._nodes, function(val, key) {
+ if (_.contains(allIDs, key)) {
+ return val;
+ }
+ });
+ })(a);
+ }
+ this._elType = "node";
+ this._el = nodeList;
+ return this._makeChain(nodeList);
+ },
+ edges: function() {
+ var a, allIDs, edgeList, id, ids;
+ id = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ if (id != null) {
+ allIDs = _.map(arguments, function(arg) {
+ return String(arg);
+ });
+ a = this.a;
+ edgeList = (function(a) {
+ return _.flatten(_.filter(a._edges, function(val, key) {
+ if (_.contains(allIDs, key)) {
+ return val;
+ }
+ }));
+ })(a);
+ }
+ this._elType = "edge";
+ this._el = edgeList;
+ return this._makeChain(edgeList);
+ },
+ all: function() {
+ var a, elType;
+ a = this.a;
+ elType = this._elType;
+ this._el = (function(elType) {
+ switch (elType) {
+ case "node":
+ return a.elements.nodes.val;
+ case "edge":
+ return a.elements.edges.flat;
+ }
+ })(elType);
+ return this._makeChain(this._el);
+ },
+ elState: function(state) {
+ var elList;
+ elList = _.filter(this._el, function(e) {
+ return e._state === state;
+ });
+ this._el = elList;
+ return this._makeChain(elList);
+ },
+ state: function(key) {
+ if (this.a.state.key != null) {
+ return this.a.state.key;
+ }
+ },
+ type: function(type) {
+ var elList;
+ elList = _.filter(this._el, function(e) {
+ return e._nodeType === type || e._edgeType === type;
+ });
+ this._el = elList;
+ return this._makeChain(elList);
+ },
+ activeNodes: function() {
+ return _.filter(this.a._nodes, function(node) {
+ if (node._state === "active") {
+ return node;
+ }
+ });
+ },
+ activeEdges: function() {
+ return _.filter(this.a.get.allEdges(), function(edge) {
+ if (edge._state === "active") {
+ return edge;
+ }
+ });
+ },
+ state: function(key) {
+ if (this.a.state.key != null) {
+ return this.a.state.key;
+ }
+ },
+ clusters: function() {
+ var clusterMap, nodesByCluster;
+ clusterMap = this.a.layout._clustering.clusterMap;
+ nodesByCluster = {};
+ _.each(clusterMap, function(key, value) {
+ return nodesByCluster[value] = _.select(this.a.get.allNodes(), function(node) {
+ return node.getProperties()[this.a.conf.clusterKey] === value;
+ });
+ });
+ return nodesByCluster;
+ },
+ clusterColours: function() {
+ var clusterColoursObject, clusterMap;
+ clusterMap = this.a.layout._clustering.clusterMap;
+ clusterColoursObject = {};
+ _.each(clusterMap, function(key, value) {
+ return clusterColoursObject[value] = this.a.conf.clusterColours[key % this.a.conf.clusterColours.length];
+ });
+ return clusterColoursObject;
+ },
+ allEdges: function() {
+ return this.a.elements.nodes.flat;
+ },
+ allNodes: function(type) {
+ if (type != null) {
+ return _.filter(this.a._nodes, function(n) {
+ if (n._nodeType === type) {
+ return n;
+ }
+ });
+ } else {
+ return this.a.elements.nodes.val;
+ }
+ },
+ getNodes: function() {
+ var a, id, ids;
+ id = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ a = this.a;
+ ids.push(id);
+ return _.map(ids, function(id) {
+ return a._nodes[id];
+ });
+ },
+ getEdges: function(id, target) {
+ var a, edge_id;
+ if (id == null) {
+ id = null;
+ }
+ if (target == null) {
+ target = null;
+ }
+ a = this.a;
+ if ((id != null) && (target != null)) {
+ edge_id = "" + id + "-" + target;
+ return this.a._edges[edge_id];
+ } else if ((id != null) && (target == null)) {
+ return this.a._nodes[id]._adjacentEdges;
+ }
+ }
+ };
+ };
+
+ Alchemy.prototype.Remove = (function() {
+ function Remove(instance) {
+ this.a = instance;
+ }
+
+ Remove.prototype.nodes = function(nodeMap) {
+ return _.each(nodeMap, function(n) {
+ if (n._nodeType != null) {
+ return n.remove();
+ }
+ });
+ };
+
+ Remove.prototype.edges = function(edgeMap) {
+ return _.each(edgeMap, function(e) {
+ if (e._edgeType != null) {
+ return e.remove();
+ }
+ });
+ };
+
+ return Remove;
+
+ })();
+
+ Alchemy.prototype.Set = function(instance) {
+ return {
+ a: instance,
+ state: function(key, value) {
+ return this.a.state.key = value;
+ }
+ };
+ };
+
+ Clustering = (function() {
+ function Clustering(instance) {
+ var clustering, conf, nodes, _charge, _friction, _gravity, _linkDistancefn, _linkStrength;
+ this.a = instance;
+ nodes = this.a._nodes;
+ conf = this.a.conf;
+ clustering = this;
+ this.clusterKey = conf.clusterKey;
+ this.identifyClusters(this.a);
+ _charge = -500;
+ _linkStrength = function(edge) {
+ var sourceCluster, targetCluster;
+ sourceCluster = nodes[edge.source.id]._properties[this.clusterKey];
+ targetCluster = nodes[edge.target.id]._properties[this.clusterKey];
+ if (sourceCluster === targetCluster) {
+ return 0.15;
+ } else {
+ return 0;
+ }
+ };
+ _friction = function() {
+ return 0.7;
+ };
+ _linkDistancefn = function(edge) {
+ nodes = edge.self.a._nodes;
+ if (nodes[edge.source.id]._properties.root || nodes[edge.target.id]._properties.root) {
+ return 300;
+ } else if (nodes[edge.source.id]._properties[this.clusterKey] === nodes[edge.target.id]._properties[this.clusterKey]) {
+ return 10;
+ } else {
+ return 600;
+ }
+ };
+ _gravity = function(k) {
+ return 8 * k;
+ };
+ this.layout = {
+ charge: _charge,
+ linkStrength: function(edge) {
+ return _linkStrength(edge);
+ },
+ friction: function() {
+ return _friction();
+ },
+ linkDistancefn: function(edge) {
+ return _linkDistancefn(edge);
+ },
+ gravity: function(k) {
+ return _gravity(k);
+ }
+ };
+ }
+
+ Clustering.prototype.identifyClusters = function(a) {
+ var clusters, nodes, _i, _ref, _results;
+ nodes = a.elements.nodes.val;
+ clusters = _.uniq(_.map(nodes, function(node) {
+ return node.getProperties()[a.conf.clusterKey];
+ }));
+ return this.clusterMap = _.zipObject(clusters, (function() {
+ _results = [];
+ for (var _i = 0, _ref = clusters.length; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
+ return _results;
+ }).apply(this));
+ };
+
+ Clustering.prototype.getClusterColour = function(clusterValue) {
+ var index;
+ index = this.clusterMap[clusterValue] % this.a.conf.clusterColours.length;
+ return this.a.conf.clusterColours[index];
+ };
+
+ Clustering.prototype.edgeGradient = function(edges) {
+ var Q, defs, edge, endColour, gradient, gradient_id, id, ids, nodes, startColour, _i, _len, _ref, _results;
+ defs = this.a.vis.select("" + this.a.conf.divSelector + " svg");
+ Q = {};
+ nodes = this.a._nodes;
+ _ref = _.map(edges, function(edge) {
+ return edge._d3;
+ });
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ edge = _ref[_i];
+ if (nodes[edge.source.id]._properties.root || nodes[edge.target.id]._properties.root) {
+ continue;
+ }
+ if (nodes[edge.source.id]._properties[this.clusterKey] === nodes[edge.target.id]._properties[this.clusterKey]) {
+ continue;
+ }
+ if (nodes[edge.target.id]._properties[this.clusterKey] !== nodes[edge.source.id]._properties[this.clusterKey]) {
+ id = nodes[edge.source.id]._properties[this.clusterKey] + "-" + nodes[edge.target.id]._properties[this.clusterKey];
+ if (id in Q) {
+ continue;
+ } else if (!(id in Q)) {
+ startColour = this.getClusterColour(nodes[edge.target.id]._properties[this.clusterKey]);
+ endColour = this.getClusterColour(nodes[edge.source.id]._properties[this.clusterKey]);
+ Q[id] = {
+ 'startColour': startColour,
+ 'endColour': endColour
+ };
+ }
+ }
+ }
+ _results = [];
+ for (ids in Q) {
+ gradient_id = "cluster-gradient-" + ids;
+ gradient = defs.append("svg:linearGradient").attr("id", gradient_id);
+ gradient.append("svg:stop").attr("offset", "0%").attr("stop-color", Q[ids]['startColour']);
+ _results.push(gradient.append("svg:stop").attr("offset", "100%").attr("stop-color", Q[ids]['endColour']));
+ }
+ return _results;
+ };
+
+ return Clustering;
+
+ })();
+
+ Alchemy.prototype.clusterControls = {
+ init: function() {
+ var changeClusterHTML;
+ changeClusterHTML = "";
+ this.a.dash.select("#clustering-container").append("div").attr("id", "cluster-key-container").attr('class', 'property form-inline form-group').html(changeClusterHTML).style("display", "none");
+ this.a.dash.select("#cluster_control_header").on("click", function() {
+ var display, element;
+ element = this.a.dash.select("#cluster-key-container");
+ return display = element.style("display");
+ });
+ element.style("display", function(e) {
+ if (display === "block") {
+ return "none";
+ } else {
+ return "block";
+ }
+ });
+ if (this.a.dash.select("#cluster-key-container").style("display") === "none") {
+ this.a.dash.select("#cluster-arrow").attr("class", "fa fa-2x fa-caret-right");
+ } else {
+ this.a.dash.select("#cluster-arrow").attr("class", "fa fa-2x fa-caret-down");
+ }
+ return this.a.dash.select("#cluster-key").on("keydown", function() {
+ if (d3.event.keyIdentifier === "Enter") {
+ this.a.conf.cluster = true;
+ this.a.conf.clusterKey = this.value;
+ return this.a.generateLayout();
+ }
+ });
+ }
+ };
+
+ Alchemy.prototype.controlDash = function(instance) {
+ var a;
+ a = instance;
+ return {
+ init: function() {
+ var divSelector;
+ if (this.dashIsShown()) {
+ divSelector = a.conf.divSelector;
+ a.dash = d3.select("" + divSelector).append("div").attr("id", "control-dash-wrapper").attr("class", "col-md-4 initial");
+ a.dash.append("i").attr("id", "dash-toggle").attr("class", "fa fa-flask col-md-offset-12");
+ a.dash.append("div").attr("id", "control-dash").attr("class", "col-md-12");
+ a.dash.select('#dash-toggle').on('click', a.interactions.toggleControlDash);
+ a.controlDash.zoomCtrl();
+ a.controlDash.search();
+ a.controlDash.filters();
+ a.controlDash.stats();
+ a.controlDash.clustering();
+ return a.controlDash.exports();
+ }
+ },
+ search: function() {
+ if (a.conf.search) {
+ a.dash.select("#control-dash").append("div").attr("id", "search").html("\n \n \n
");
+ return a.search.init();
+ }
+ },
+ zoomCtrl: function() {
+ if (a.conf.zoomControls) {
+ a.dash.select("#control-dash-wrapper").append("div").attr("id", "zoom-controls").attr("class", "col-md-offset-12").html(" ");
+ a.dash.select('#zoom-in').on("click", function() {
+ return a.interactions.clickZoom('in');
+ });
+ a.dash.select('#zoom-out').on("click", function() {
+ return a.interactions.clickZoom('out');
+ });
+ return a.dash.select('#zoom-reset').on("click", function() {
+ return a.interactions.clickZoom('reset');
+ });
+ }
+ },
+ filters: function() {
+ if (a.conf.nodeFilters || a.conf.edgeFilters) {
+ a.dash.select("#control-dash").append("div").attr("id", "filters");
+ return a.filters.init();
+ }
+ },
+ stats: function() {
+ var stats_html;
+ if (a.conf.nodeStats || a.conf.edgeStats) {
+ stats_html = "\n";
+ a.dash.select("#control-dash").append("div").attr("id", "stats").html(stats_html).select('#stats-header').on('click', function() {
+ if (a.dash.select('#all-stats').classed("in")) {
+ return a.dash.select("#stats-header>span").attr("class", "fa fa-2x fa-caret-right");
+ } else {
+ return a.dash.select("#stats-header>span").attr("class", "fa fa-2x fa-caret-down");
+ }
+ });
+ return a.stats.init();
+ }
+ },
+ exports: function() {
+ var exports_html;
+ if (a.conf.exportSVG) {
+ exports_html = "\n";
+ a.dash.select("#control-dash").append("div").attr("id", "exports").attr("style", "padding: 0.5em 1em; border-bottom: thin dashed #E89619; color: white;").html(exports_html).select("#exports-header");
+ return a.exports.init();
+ }
+ },
+ clustering: function() {
+ var clusterControl_html;
+ if (a.conf.clusterControl) {
+ clusterControl_html = "\n \n
";
+ a.dash.select("#control-dash").append("div").attr("id", "clustering").html(clusterControl_html).select('#cluster_control_header');
+ return a.clusterControls.init();
+ }
+ },
+ dashIsShown: function() {
+ var conf;
+ conf = a.conf;
+ return conf.showEditor || conf.captionToggle || conf.toggleRootNodes || conf.removeElement || conf.clusterControl || conf.nodeStats || conf.edgeStats || conf.edgeFilters || conf.nodeFilters || conf.edgesToggle || conf.nodesToggle || conf.search || conf.exportSVG;
+ }
+ };
+ };
+
+ Alchemy.prototype.filters = (function(_this) {
+ return function(instance) {
+ var a;
+ a = instance;
+ return {
+ init: function() {
+ var caption, edgeType, edgeTypes, nodeKey, nodeType, nodeTypes, types, _i, _j, _len, _len1, _ref;
+ a.filters.show();
+ if (a.conf.edgeFilters) {
+ a.filters.showEdgeFilters();
+ }
+ if (a.conf.nodeFilters) {
+ a.filters.showNodeFilters();
+ }
+ if (a.conf.nodeTypes) {
+ nodeKey = Object.keys(a.conf.nodeTypes);
+ nodeTypes = '';
+ _ref = a.conf.nodeTypes[nodeKey];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ nodeType = _ref[_i];
+ caption = nodeType.replace('_', ' ');
+ nodeTypes += "" + caption + "";
+ }
+ a.dash.select('#node-dropdown').html(nodeTypes);
+ }
+ if (a.conf.edgeTypes) {
+ if (_.isPlainObject(a.conf.edgeTypes)) {
+ types = _.values(a.conf.edgeTypes)[0];
+ } else {
+ types = a.conf.edgeTypes;
+ }
+ edgeTypes = '';
+ for (_j = 0, _len1 = types.length; _j < _len1; _j++) {
+ edgeType = types[_j];
+ caption = edgeType.replace('_', ' ');
+ edgeTypes += "" + caption + "";
+ }
+ a.dash.select('#rel-dropdown').html(edgeTypes);
+ }
+ if (a.conf.captionsToggle) {
+ a.filters.captionsToggle();
+ }
+ if (a.conf.edgesToggle) {
+ a.filters.edgesToggle();
+ }
+ if (a.conf.nodesToggle) {
+ a.filters.nodesToggle();
+ }
+ return a.filters.update();
+ },
+ show: function() {
+ var filter_html;
+ filter_html = "\n ";
+ a.dash.select('#control-dash #filters').html(filter_html);
+ a.dash.selectAll('#filter-header').on('click', function() {
+ if (a.dash.select('#filters>form').classed("in")) {
+ return a.dash.select("#filter-header>span").attr("class", "fa fa-2x fa-caret-right");
+ } else {
+ return a.dash.select("#filter-header>span").attr("class", "fa fa-2x fa-caret-down");
+ }
+ });
+ return a.dash.select('#filters form');
+ },
+ showEdgeFilters: function() {
+ var rel_filter_html;
+ rel_filter_html = "\n";
+ a.dash.select('#filters form').append("div").attr("id", "filter-relationships").html(rel_filter_html);
+ return a.dash.select("#filter-rel-header").on('click', function() {
+ if (a.dash.select('#rel-dropdown').classed("in")) {
+ return a.dash.select("#filter-rel-header>span").attr("class", "fa fa-lg fa-caret-right");
+ } else {
+ return a.dash.select("#filter-rel-header>span").attr("class", "fa fa-lg fa-caret-down");
+ }
+ });
+ },
+ showNodeFilters: function() {
+ var node_filter_html;
+ node_filter_html = "\n";
+ a.dash.select('#filters form').append("div").attr("id", "filter-nodes").html(node_filter_html);
+ return a.dash.select("#filter-node-header").on('click', function() {
+ if (a.dash.select('#node-dropdown').classed("in")) {
+ return a.dash.select("#filter-node-header>span").attr("class", "fa fa-lg fa-caret-right");
+ } else {
+ return a.dash.select("#filter-node-header>span").attr("class", "fa fa-lg fa-caret-down");
+ }
+ });
+ },
+ captionsToggle: function() {
+ return a.dash.select("#filters form").append("li").attr({
+ "id": "toggle-captions",
+ "class": "list-group-item active-label toggle"
+ }).html("Show Captions").on("click", function() {
+ var isDisplayed;
+ isDisplayed = a.dash.select("g text").attr("style");
+ if (isDisplayed === "display: block" || null) {
+ return a.dash.selectAll("g text").attr("style", "display: none");
+ } else {
+ return a.dash.selectAll("g text").attr("style", "display: block");
+ }
+ });
+ },
+ edgesToggle: function() {
+ return a.dash.select("#filters form").append("li").attr({
+ "id": "toggle-edges",
+ "class": "list-group-item active-label toggle"
+ }).html("Toggle Edges").on("click", function() {
+ if (_.contains(_.pluck(_.flatten(_.values(a._edges)), "_state"), "active")) {
+ return _.each(_.values(a._edges), function(edges) {
+ return _.each(edges, function(e) {
+ if (e._state === "active") {
+ return e.toggleHidden();
+ }
+ });
+ });
+ } else {
+ return _.each(_.values(a._edges), function(edges) {
+ return _.each(edges, function(e) {
+ var source, target;
+ source = a._nodes[e._properties.source];
+ target = a._nodes[e._properties.target];
+ if (source._state === "active" && target._state === "active") {
+ return e.toggleHidden();
+ }
+ });
+ });
+ }
+ });
+ },
+ nodesToggle: function() {
+ return a.dash.select("#filters form").append("li").attr({
+ "id": "toggle-nodes",
+ "class": "list-group-item active-label toggle"
+ }).html("Toggle Nodes").on("click", function() {
+ var nodes;
+ nodes = _.values(a._nodes);
+ if (_.contains(_.pluck(nodes, "_state"), "active")) {
+ return _.each(nodes, function(n) {
+ if (a.conf.toggleRootNodes && n._d3.root) {
+ return;
+ }
+ if (n._state === "active") {
+ return n.toggleHidden();
+ }
+ });
+ } else {
+ return _.each(_.values(a._nodes), function(n) {
+ if (a.conf.toggleRootNodes && n._d3.root) {
+ return;
+ }
+ return n.toggleHidden();
+ });
+ }
+ });
+ },
+ update: function() {
+ return a.dash.selectAll(".nodeType, .edgeType").on("click", function() {
+ var element, tag;
+ element = d3.select(this);
+ tag = element.attr("name");
+ a.vis.selectAll("." + tag).each(function(d) {
+ var edge, node, source, target;
+ if (a._nodes[d.id] != null) {
+ node = a._nodes[d.id];
+ return node.toggleHidden();
+ } else {
+ edge = a._edges[d.id][0];
+ source = a._nodes[edge._properties.source];
+ target = a._nodes[edge._properties.target];
+ if (source._state === "active" && target._state === "active") {
+ return edge.toggleHidden();
+ }
+ }
+ });
+ return a.stats.nodeStats();
+ });
+ }
+ };
+ };
+ })(this);
+
+ Alchemy.prototype.Index = function(instance, all) {
+ var a, edges, elements, nodes;
+ a = instance;
+ elements = {
+ nodes: {
+ val: (function() {
+ return _.values(a._nodes);
+ })()
+ },
+ edges: {
+ val: (function() {
+ return _.values(a._edges);
+ })()
+ }
+ };
+ nodes = elements.nodes;
+ edges = elements.edges;
+ elements.edges.flat = (function() {
+ return _.flatten(edges.val);
+ })();
+ elements.nodes.d3 = (function() {
+ return _.map(nodes.val, function(n) {
+ return n._d3;
+ });
+ })();
+ elements.edges.d3 = (function() {
+ return _.map(edges.flat, function(e) {
+ return e._d3;
+ });
+ })();
+ a.elements = elements;
+ return function() {
+ a.elements.nodes.svg = (function() {
+ return a.vis.selectAll('g.node');
+ })();
+ return a.elements.edges.svg = (function() {
+ return a.vis.selectAll('g.edge');
+ })();
+ };
+ };
+
+ Alchemy.prototype.interactions = function(instance) {
+ var a;
+ a = instance;
+ return {
+ edgeClick: function(d) {
+ var edge;
+ if (d3.event.defaultPrevented) {
+ return;
+ }
+ d3.event.stopPropagation();
+ edge = d.self;
+ if (typeof a.conf.edgeClick === 'function') {
+ a.conf.edgeClick(edge);
+ }
+ if (edge._state !== "hidden") {
+ edge._state = (function() {
+ if (edge._state === "selected") {
+ return "active";
+ }
+ return "selected";
+ })();
+ return edge.setStyles();
+ }
+ },
+ edgeMouseOver: function(d) {
+ var edge;
+ edge = d.self;
+ if (edge._state !== "hidden") {
+ if (edge._state !== "selected") {
+ edge._state = "highlighted";
+ }
+ return edge.setStyles();
+ }
+ },
+ edgeMouseOut: function(d) {
+ var edge;
+ edge = d.self;
+ if (edge._state !== "hidden") {
+ if (edge._state !== "selected") {
+ edge._state = "active";
+ }
+ return edge.setStyles();
+ }
+ },
+ nodeMouseOver: function(n) {
+ var node;
+ node = n.self;
+ if (node._state !== "hidden") {
+ if (node._state !== "selected") {
+ node._state = "highlighted";
+ node.setStyles();
+ }
+ if (typeof a.conf.nodeMouseOver === 'function') {
+ return a.conf.nodeMouseOver(node);
+ } else if (typeof a.conf.nodeMouseOver === ('number' || 'string')) {
+ return node.properties[a.conf.nodeMouseOver];
+ }
+ }
+ },
+ nodeMouseOut: function(n) {
+ var node;
+ node = n.self;
+ a = node.a;
+ if (node._state !== "hidden") {
+ if (node._state !== "selected") {
+ node._state = "active";
+ node.setStyles();
+ }
+ if ((a.conf.nodeMouseOut != null) && typeof a.conf.nodeMouseOut === 'function') {
+ return a.conf.nodeMouseOut(n);
+ }
+ }
+ },
+ nodeClick: function(n) {
+ var node;
+ if (d3.event.defaultPrevented) {
+ return;
+ }
+ d3.event.stopPropagation();
+ node = n.self;
+ if (typeof a.conf.nodeClick === 'function') {
+ a.conf.nodeClick(node);
+ }
+ if (node._state !== "hidden") {
+ node._state = (function() {
+ if (node._state === "selected") {
+ return "active";
+ }
+ return "selected";
+ })();
+ return node.setStyles();
+ }
+ },
+ zoom: function(extent) {
+ if (this._zoomBehavior == null) {
+ this._zoomBehavior = d3.behavior.zoom();
+ }
+ return this._zoomBehavior.scaleExtent(extent).on("zoom", function(d) {
+ a = Alchemy.prototype.getInst(this);
+ return a.vis.attr("transform", "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")");
+ });
+ },
+ clickZoom: function(direction) {
+ var scale, x, y, _ref;
+ _ref = a.vis.attr("transform").match(/(-*\d+\.*\d*)/g).map(function(a) {
+ return parseFloat(a);
+ }), x = _ref[0], y = _ref[1], scale = _ref[2];
+ a.vis.attr("transform", function() {
+ if (direction === "in") {
+ if (scale < a.conf.scaleExtent[1]) {
+ scale += 0.2;
+ }
+ return "translate(" + x + "," + y + ") scale(" + scale + ")";
+ } else if (direction === "out") {
+ if (scale > a.conf.scaleExtent[0]) {
+ scale -= 0.2;
+ }
+ return "translate(" + x + "," + y + ") scale(" + scale + ")";
+ } else if (direction === "reset") {
+ return "translate(0,0) scale(1)";
+ } else {
+ return console.log('error');
+ }
+ });
+ if (this._zoomBehavior == null) {
+ this._zoomBehavior = d3.behavior.zoom();
+ }
+ return this._zoomBehavior.scale(scale).translate([x, y]);
+ },
+ nodeDragStarted: function(d, i) {
+ d3.event.preventDefault;
+ d3.event.sourceEvent.stopPropagation();
+ d3.select(this).classed("dragging", true);
+ return d.fixed = true;
+ },
+ nodeDragged: function(d, i) {
+ var edges, node;
+ a = d.self.a;
+ d.x += d3.event.dx;
+ d.y += d3.event.dy;
+ d.px += d3.event.dx;
+ d.py += d3.event.dy;
+ node = d3.select(this);
+ node.attr("transform", "translate(" + d.x + ", " + d.y + ")");
+ edges = d.self._adjacentEdges;
+ return _.each(edges, function(edge) {
+ var selection;
+ selection = a.vis.select("#edge-" + edge.id + "-" + edge._index);
+ return a._drawEdges.updateEdge(selection.data()[0]);
+ });
+ },
+ nodeDragended: function(d, i) {
+ a = d.self.a;
+ d3.select(this).classed({
+ "dragging": false
+ });
+ if (!a.conf.forceLocked) {
+ return a.force.start();
+ }
+ },
+ nodeDoubleClick: function(d) {
+ return null;
+ },
+ deselectAll: function() {
+ var _ref;
+ a = Alchemy.prototype.getInst(this);
+ if ((_ref = d3.event) != null ? _ref.defaultPrevented : void 0) {
+ return;
+ }
+ if (a.conf.showEditor === true) {
+ a.modifyElements.nodeEditorClear();
+ }
+ _.each(a._nodes, function(n) {
+ n._state = "active";
+ return n.setStyles();
+ });
+ _.each(a._edges, function(edge) {
+ return _.each(edge, function(e) {
+ e._state = "active";
+ return e.setStyles();
+ });
+ });
+ if (a.conf.deselectAll && typeof (a.conf.deselectAll === 'function')) {
+ return a.conf.deselectAll();
+ }
+ }
+ };
+ };
+
+ Layout = (function() {
+ function Layout(instance) {
+ this.tick = __bind(this.tick, this);
+ this.linkStrength = __bind(this.linkStrength, this);
+ this.gravity = __bind(this.gravity, this);
+ var a, conf, nodes;
+ this.a = a = instance;
+ conf = this.a.conf;
+ nodes = this.a._nodes;
+ this.k = Math.sqrt(Math.log(_.size(this.a._nodes)) / (conf.graphWidth() * conf.graphHeight()));
+ this._clustering = new this.a.clustering(this.a);
+ this.d3NodeInternals = a.elements.nodes.d3;
+ if (conf.cluster) {
+ this._charge = function() {
+ return this._clustering.layout.charge;
+ };
+ this._linkStrength = function(edge) {
+ return this._clustering.layout.linkStrength(edge);
+ };
+ } else {
+ this._charge = function() {
+ return -10 / this.k;
+ };
+ this._linkStrength = function(edge) {
+ if (nodes[edge.source.id].getProperties('root') || nodes[edge.target.id].getProperties('root')) {
+ return 1;
+ } else {
+ return 0.9;
+ }
+ };
+ }
+ if (conf.cluster) {
+ this._linkDistancefn = function(edge) {
+ return this._clustering.layout.linkDistancefn(edge);
+ };
+ } else if (conf.linkDistancefn === 'default') {
+ this._linkDistancefn = function(edge) {
+ return 1 / (this.k * 50);
+ };
+ } else if (typeof conf.linkDistancefn === 'number') {
+ this._linkDistancefn = function(edge) {
+ return conf.linkDistancefn;
+ };
+ } else if (typeof conf.linkDistancefn === 'function') {
+ this._linkDistancefn = function(edge) {
+ return conf.linkDistancefn(edge);
+ };
+ }
+ }
+
+ Layout.prototype.gravity = function() {
+ if (this.a.conf.cluster) {
+ return this._clustering.layout.gravity(this.k);
+ } else {
+ return 50 * this.k;
+ }
+ };
+
+ Layout.prototype.linkStrength = function(edge) {
+ return this._linkStrength(edge);
+ };
+
+ Layout.prototype.friction = function() {
+ return 0.9;
+ };
+
+ Layout.prototype.collide = function(node) {
+ var conf, nx1, nx2, ny1, ny2, r;
+ conf = this.a.conf;
+ r = 2 * (node.radius + node['stroke-width']) + conf.nodeOverlap;
+ nx1 = node.x - r;
+ nx2 = node.x + r;
+ ny1 = node.y - r;
+ ny2 = node.y + r;
+ return function(quad, x1, y1, x2, y2) {
+ var l, x, y;
+ if (quad.point && (quad.point !== node)) {
+ x = node.x - Math.abs(quad.point.x);
+ y = node.y - quad.point.y;
+ l = Math.sqrt(x * x + y * y);
+ r = r;
+ if (l < r) {
+ l = (l - r) / l * conf.alpha;
+ node.x -= x *= l;
+ node.y -= y *= l;
+ quad.point.x += x;
+ quad.point.y += y;
+ }
+ }
+ return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
+ };
+ };
+
+ Layout.prototype.tick = function(draw) {
+ var a, edges, node, nodes, q, _i, _len, _ref;
+ a = this.a;
+ nodes = a.elements.nodes.svg;
+ edges = a.elements.edges.svg;
+ if (a.conf.collisionDetection) {
+ q = d3.geom.quadtree(this.d3NodeInternals);
+ _ref = this.d3NodeInternals;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ node = _ref[_i];
+ q.visit(this.collide(node));
+ }
+ }
+ nodes.attr("transform", function(d) {
+ return "translate(" + d.x + "," + d.y + ")";
+ });
+ this.drawEdge = a.drawing.DrawEdge;
+ this.drawEdge.styleText(edges);
+ return this.drawEdge.styleLink(edges);
+ };
+
+ Layout.prototype.positionRootNodes = function() {
+ var conf, container, i, n, rootNodes, _i, _len, _ref, _ref1, _results;
+ conf = this.a.conf;
+ container = {
+ width: conf.graphWidth(),
+ height: conf.graphHeight()
+ };
+ rootNodes = _.filter(this.a.elements.nodes.val, function(node) {
+ return node.getProperties('root');
+ });
+ if (rootNodes.length === 1) {
+ n = rootNodes[0];
+ _ref = [container.width / 2, container.width / 2], n._d3.x = _ref[0], n._d3.px = _ref[1];
+ _ref1 = [container.height / 2, container.height / 2], n._d3.y = _ref1[0], n._d3.py = _ref1[1];
+ n._d3.fixed = true;
+ } else {
+ _results = [];
+ for (i = _i = 0, _len = rootNodes.length; _i < _len; i = ++_i) {
+ n = rootNodes[i];
+ n._d3.x = container.width / Math.sqrt(rootNodes.length * (i + 1));
+ n._d3.y = container.height / 2;
+ _results.push(n._d3.fixed = true);
+ }
+ return _results;
+ }
+ };
+
+ Layout.prototype.chargeDistance = function() {
+ return 500;
+ };
+
+ Layout.prototype.linkDistancefn = function(edge) {
+ return this._linkDistancefn(edge);
+ };
+
+ Layout.prototype.charge = function() {
+ return this._charge();
+ };
+
+ return Layout;
+
+ })();
+
+ Alchemy.prototype.generateLayout = function(instance) {
+ var a;
+ a = instance;
+ return function(start) {
+ var conf;
+ if (start == null) {
+ start = false;
+ }
+ conf = a.conf;
+ a.layout = new Layout(a);
+ return a.force = d3.layout.force().size([conf.graphWidth(), conf.graphHeight()]).theta(1.0).gravity(a.layout.gravity()).friction(a.layout.friction()).nodes(a.elements.nodes.d3).links(a.elements.edges.d3).linkDistance(function(link) {
+ return a.layout.linkDistancefn(link);
+ }).linkStrength(function(link) {
+ return a.layout.linkStrength(link);
+ }).charge(a.layout.charge()).chargeDistance(a.layout.chargeDistance());
+ };
+ };
+
+ Alchemy.prototype.search = function(instance) {
+ var a;
+ a = instance;
+ return {
+ init: function() {
+ var searchBox;
+ searchBox = a.dash.select("#search input");
+ return searchBox.on("keyup", function() {
+ var input;
+ input = searchBox[0][0].value.toLowerCase();
+ a.vis.selectAll(".node").classed("inactive", false);
+ a.vis.selectAll("text").attr("style", function() {
+ if (input !== "") {
+ return "display: inline;";
+ }
+ });
+ return a.vis.selectAll(".node").classed("inactive", function(node) {
+ var DOMtext, hidden;
+ DOMtext = d3.select(this).text();
+ switch (a.conf.searchMethod) {
+ case 'contains':
+ hidden = DOMtext.toLowerCase().indexOf(input) < 0;
+ break;
+ case 'begins':
+ hidden = DOMtext.toLowerCase().indexOf(input) !== 0;
+ }
+ if (hidden) {
+ a.vis.selectAll("[source-target*='" + node.id + "']").classed("inactive", hidden);
+ } else {
+ a.vis.selectAll("[source-target*='" + node.id + "']").classed("inactive", function(edge) {
+ var nodeIDs, sourceHidden, targetHidden;
+ nodeIDs = [edge.source.id, edge.target.id];
+ sourceHidden = a.vis.select("#node-" + nodeIDs[0]).classed("inactive");
+ targetHidden = a.vis.select("#node-" + nodeIDs[1]).classed("inactive");
+ return targetHidden || sourceHidden;
+ });
+ }
+ return hidden;
+ });
+ });
+ }
+ };
+ };
+
+ Alchemy.prototype.startGraph = function(instance) {
+ var a;
+ a = instance;
+ return function(data) {
+ var conf, d3Edges, d3Nodes, defs, editor, editorInteractions;
+ conf = a.conf;
+ if (d3.select(conf.divSelector).empty()) {
+ console.warn(a.utils.warnings.divWarning());
+ }
+ if (!data) {
+ data = {
+ nodes: [],
+ edges: []
+ };
+ a.utils.warnings.dataWarning();
+ }
+ if (data.edges == null) {
+ data.edges = [];
+ }
+ a.create.nodes(data.nodes);
+ data.edges.forEach(function(e) {
+ return a.create.edges(e);
+ });
+ a.vis = d3.select(conf.divSelector).attr("style", "width:" + (conf.graphWidth()) + "px; height:" + (conf.graphHeight()) + "px; background:" + conf.backgroundColour + ";").append("svg").attr("xmlns", "http://www.w3.org/2000/svg").attr("xlink", "http://www.w3.org/1999/xlink").attr("pointer-events", "all").attr("style", "background:" + conf.backgroundColour + ";").attr("alchInst", Alchemy.prototype.instances.length - 1).on('click', a.interactions.deselectAll).call(a.interactions.zoom(conf.scaleExtent)).on("dblclick.zoom", null).append('g').attr("transform", "translate(" + conf.initialTranslate + ") scale(" + conf.initialScale + ")");
+ a.interactions.zoom().scale(conf.initialScale);
+ a.interactions.zoom().translate(conf.initialTranslate);
+ a.index = Alchemy.prototype.Index(a);
+ a.generateLayout();
+ a.controlDash.init();
+ d3Edges = a.elements.edges.d3;
+ d3Nodes = a.elements.nodes.d3;
+ a.layout.positionRootNodes();
+ a.force.start();
+ if (conf.forceLocked) {
+ while (a.force.alpha() > 0.005) {
+ a.force.tick();
+ }
+ }
+ a._drawEdges = a.drawing.DrawEdges;
+ a._drawNodes = a.drawing.DrawNodes;
+ a._drawEdges.createEdge(d3Edges);
+ a._drawNodes.createNode(d3Nodes);
+ a.index();
+ a.elements.nodes.svg.attr("transform", function(id, i) {
+ return "translate(" + id.x + ", " + id.y + ")";
+ });
+ console.log(Date() + ' completed initial computation');
+ if (!conf.forceLocked) {
+ a.force.on("tick", a.layout.tick).start();
+ }
+ if (conf.afterLoad != null) {
+ if (typeof conf.afterLoad === 'function') {
+ conf.afterLoad();
+ } else if (typeof conf.afterLoad === 'string') {
+ a[conf.afterLoad] = true;
+ }
+ }
+ if (conf.cluster) {
+ defs = d3.select("" + a.conf.divSelector + " svg").append("svg:defs");
+ }
+ if (conf.nodeStats) {
+ a.stats.nodeStats();
+ }
+ if (conf.showEditor) {
+ editor = new a.editor.Editor;
+ editorInteractions = new a.editor.Interactions;
+ d3.select("body").on('keydown', editorInteractions.deleteSelected);
+ editor.startEditor();
+ }
+ return a.initial = true;
+ };
+ };
+
+ Alchemy.prototype.stats = function(instance) {
+ var a;
+ a = instance;
+ return {
+ init: function() {
+ return a.stats.update();
+ },
+ nodeStats: function() {
+ var activeNodes, allNodes, caption, inactiveNodes, nodeData, nodeGraph, nodeKeys, nodeNum, nodeStats, nodeType, nodeTypes, _i, _len, _ref;
+ nodeData = [];
+ allNodes = a.get.allNodes().length;
+ activeNodes = a.get.activeNodes().length;
+ inactiveNodes = allNodes - activeNodes;
+ nodeStats = "Number of nodes: " + allNodes + " Number of active nodes: " + activeNodes + " Number of inactive nodes: " + inactiveNodes + "";
+ if (a.conf.nodeTypes) {
+ nodeKeys = Object.keys(a.conf.nodeTypes);
+ nodeTypes = '';
+ _ref = a.conf.nodeTypes[nodeKeys];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ nodeType = _ref[_i];
+ caption = nodeType.replace('_', ' ');
+ nodeNum = a.vis.selectAll("g.node." + nodeType)[0].length;
+ nodeTypes += "Number of " + caption + " nodes: " + nodeNum + "";
+ nodeData.push(["" + nodeType, nodeNum]);
+ }
+ nodeStats += nodeTypes;
+ }
+ nodeGraph = "";
+ nodeStats += nodeGraph;
+ a.dash.select('#node-stats').html(nodeStats);
+ return this.insertSVG("node", nodeData);
+ },
+ edgeStats: function() {
+ var activeEdges, allEdges, caption, edgeData, edgeGraph, edgeKeys, edgeNum, edgeStats, edgeType, edgeTypes, inactiveEdges, _i, _len;
+ edgeData = [];
+ allEdges = a.get.allEdges().length;
+ activeEdges = a.get.activeEdges().length;
+ inactiveEdges = allEdges - activeEdges;
+ edgeStats = "Number of relationships: " + allEdges + " Number of active relationships: " + activeEdges + " Number of inactive relationships: " + inactiveEdges + "";
+ if (a.conf.edgeTypes) {
+ edgeKeys = _.values(alchemy.conf.edgeTypes)[0];
+ edgeTypes = '';
+ for (_i = 0, _len = edgeKeys.length; _i < _len; _i++) {
+ edgeType = edgeKeys[_i];
+ if (!edgeType) {
+ continue;
+ }
+ caption = edgeType.replace('_', ' ');
+ edgeNum = _.filter(a.get.allEdges(), function(edge) {
+ if (edge._edgeType === edgeType) {
+ return edge;
+ }
+ }).length;
+ edgeTypes += "Number of " + caption + " relationships: " + edgeNum + "";
+ edgeData.push(["" + caption, edgeNum]);
+ }
+ edgeStats += edgeTypes;
+ }
+ edgeGraph = "";
+ edgeStats += edgeGraph;
+ a.dash.select('#rel-stats').html(edgeStats);
+ return this.insertSVG("edge", edgeData);
+ },
+ insertSVG: function(element, data) {
+ var arc, arcs, color, height, pie, radius, svg, width;
+ if (data === null) {
+ return a.dash.select("#" + element + "-stats-graph").html("
There are no " + element + "Types listed in your conf.
");
+ } else {
+ width = a.conf.graphWidth() * .25;
+ height = 250;
+ radius = width / 4;
+ color = d3.scale.category20();
+ arc = d3.svg.arc().outerRadius(radius - 10).innerRadius(radius / 2);
+ pie = d3.layout.pie().sort(null).value(function(d) {
+ return d[1];
+ });
+ svg = a.dash.select("#" + element + "-stats-graph").append("svg").append("g").style({
+ "width": width,
+ "height": height
+ }).attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
+ arcs = svg.selectAll(".arc").data(pie(data)).enter().append("g").classed("arc", true).on("mouseover", function(d, i) {
+ return a.dash.select("#" + data[i][0] + "-stat").classed("hidden", false);
+ }).on("mouseout", function(d, i) {
+ return a.dash.select("#" + data[i][0] + "-stat").classed("hidden", true);
+ });
+ arcs.append("path").attr("d", arc).attr("stroke", function(d, i) {
+ return color(i);
+ }).attr("stroke-width", 2).attr("fill-opacity", "0.3");
+ return arcs.append("text").attr("transform", function(d) {
+ return "translate(" + arc.centroid(d) + ")";
+ }).attr("id", function(d, i) {
+ return "" + data[i][0] + "-stat";
+ }).attr("dy", ".35em").classed("hidden", true).text(function(d, i) {
+ return data[i][0];
+ });
+ }
+ },
+ update: function() {
+ if (a.conf.nodeStats) {
+ this.nodeStats();
+ }
+ if (a.conf.edgeStats) {
+ return this.edgeStats();
+ }
+ }
+ };
+ };
+
+ Alchemy.prototype.updateGraph = function(instance) {
+ var a;
+ a = instance;
+ return function() {
+ a.generateLayout();
+ a._drawEdges.createEdge(a.elements.edges.d3);
+ a._drawNodes.createNode(a.elements.nodes.d3);
+ a.layout.positionRootNodes();
+ a.force.start();
+ while (a.force.alpha() > 0.005) {
+ a.force.tick();
+ }
+ a.force.on("tick", a.layout.tick).start();
+ return a.elements.nodes.svg.attr('transform', function(id, i) {
+ return "translate(" + id.x + ", " + id.y + ")";
+ });
+ };
+ };
+
+ Alchemy.prototype.defaults = {
+ plugins: null,
+ renderer: "svg",
+ graphWidth: function() {
+ return d3.select(this.divSelector).node().parentElement.clientWidth;
+ },
+ graphHeight: function() {
+ if (d3.select(this.divSelector).node().parentElement.nodeName === "BODY") {
+ return window.innerHeight;
+ } else {
+ return d3.select(this.divSelector).node().parentElement.clientHeight;
+ }
+ },
+ alpha: 0.5,
+ collisionDetection: true,
+ nodeOverlap: 25,
+ fixNodes: false,
+ fixRootNodes: false,
+ forceLocked: true,
+ linkDistancefn: 'default',
+ nodePositions: null,
+ showEditor: false,
+ captionToggle: false,
+ toggleRootNodes: false,
+ removeElement: false,
+ cluster: false,
+ clusterKey: "cluster",
+ clusterColours: d3.shuffle(["#DD79FF", "#FFFC00", "#00FF30", "#5168FF", "#00C0FF", "#FF004B", "#00CDCD", "#f83f00", "#f800df", "#ff8d8f", "#ffcd00", "#184fff", "#ff7e00"]),
+ clusterControl: false,
+ nodeStats: false,
+ edgeStats: false,
+ edgeFilters: false,
+ nodeFilters: false,
+ edgesToggle: false,
+ nodesToggle: false,
+ zoomControls: false,
+ nodeCaption: 'caption',
+ nodeCaptionsOnByDefault: false,
+ nodeStyle: {
+ "all": {
+ "radius": 10,
+ "color": "#68B9FE",
+ "borderColor": "#127DC1",
+ "borderWidth": function(d, radius) {
+ return radius / 3;
+ },
+ "captionColor": "#FFFFFF",
+ "captionBackground": null,
+ "captionSize": 12,
+ "selected": {
+ "color": "#FFFFFF",
+ "borderColor": "#349FE3"
+ },
+ "highlighted": {
+ "color": "#EEEEFF"
+ },
+ "hidden": {
+ "color": "none",
+ "borderColor": "none"
+ }
+ }
+ },
+ nodeColour: null,
+ nodeMouseOver: 'caption',
+ nodeRadius: 10,
+ nodeTypes: null,
+ rootNodes: 'root',
+ rootNodeRadius: 15,
+ nodeClick: null,
+ edgeCaption: 'caption',
+ edgeCaptionsOnByDefault: false,
+ edgeStyle: {
+ "all": {
+ "width": 4,
+ "color": "#CCC",
+ "opacity": 0.2,
+ "directed": true,
+ "curved": true,
+ "selected": {
+ "opacity": 1
+ },
+ "highlighted": {
+ "opacity": 1
+ },
+ "hidden": {
+ "opacity": 0
+ }
+ }
+ },
+ edgeTypes: null,
+ curvedEdges: false,
+ edgeWidth: function() {
+ return 4;
+ },
+ edgeOverlayWidth: 20,
+ directedEdges: false,
+ edgeArrowSize: 5,
+ edgeClick: null,
+ search: false,
+ searchMethod: "contains",
+ backgroundColour: "#000000",
+ theme: null,
+ afterLoad: 'afterLoad',
+ divSelector: '#alchemy',
+ dataSource: null,
+ initialScale: 1,
+ initialTranslate: [0, 0],
+ scaleExtent: [0.5, 2.4],
+ exportSVG: false,
+ dataWarning: "default",
+ warningMessage: "There be no data! What's going on?"
+ };
+
+ DrawEdge = function(instance) {
+ return {
+ a: instance,
+ createLink: function(edge) {
+ var conf;
+ conf = this.a.conf;
+ edge.append('path').attr('class', 'edge-line').attr('id', function(d) {
+ return "path-" + d.id;
+ });
+ edge.filter(function(d) {
+ return d.caption != null;
+ }).append('text');
+ return edge.append('path').attr('class', 'edge-handler').style('stroke-width', "" + conf.edgeOverlayWidth).style('opacity', "0");
+ },
+ styleLink: function(edge) {
+ var a, conf, utils;
+ a = this.a;
+ conf = this.a.conf;
+ utils = this.a.drawing.EdgeUtils;
+ return edge.each(function(d) {
+ var curve, curviness, edgeWalk, endx, endy, g, midpoint, startx, starty;
+ edgeWalk = utils.edgeWalk(d);
+ curviness = conf.curvedEdges ? 30 : 0;
+ curve = curviness / 10;
+ startx = d.source.radius + (d["stroke-width"] / 2);
+ starty = curviness / 10;
+ midpoint = edgeWalk.edgeLength / 2;
+ endx = edgeWalk.edgeLength - (d.target.radius - (d.target["stroke-width"] / 2));
+ endy = curviness / 10;
+ g = d3.select(this);
+ g.style(utils.edgeStyle(d));
+ g.attr('transform', "translate(" + d.source.x + ", " + d.source.y + ") rotate(" + edgeWalk.edgeAngle + ")");
+ g.select('.edge-line').attr('d', (function() {
+ var arrow, line, w;
+ line = "M" + startx + "," + starty + "q" + midpoint + "," + curviness + " " + endx + "," + endy;
+ if (conf.directedEdges) {
+ w = d["stroke-width"] * 2;
+ arrow = "l" + (-w) + "," + (w + curve) + " l" + w + "," + (-w - curve) + " l" + (-w) + "," + (-w + curve);
+ return line + arrow;
+ }
+ return line;
+ })());
+ return g.select('.edge-handler').attr('d', function(d) {
+ return g.select('.edge-line').attr('d');
+ });
+ });
+ },
+ classEdge: function(edge) {
+ return edge.classed('active', true);
+ },
+ styleText: function(edge) {
+ var conf, curved, utils;
+ conf = this.a.conf;
+ curved = conf.curvedEdges;
+ utils = this.a.drawing.EdgeUtils;
+ return edge.select('text').each(function(d) {
+ var dx, edgeWalk;
+ edgeWalk = utils.edgeWalk(d);
+ dx = edgeWalk.edgeLength / 2;
+ return d3.select(this).attr('dx', "" + dx).text(d.caption).attr("xlink:xlink:href", "#path-" + d.source.id + "-" + d.target.id).style("display", function(d) {
+ if (conf.edgeCaptionsOnByDefault) {
+ return "block";
+ }
+ });
+ });
+ },
+ setInteractions: function(edge) {
+ var interactions;
+ interactions = this.a.interactions;
+ return edge.select('.edge-handler').on('click', interactions.edgeClick).on('mouseover', function(d) {
+ return interactions.edgeMouseOver(d);
+ }).on('mouseout', function(d) {
+ return interactions.edgeMouseOut(d);
+ });
+ }
+ };
+ };
+
+ DrawEdges = function(instance) {
+ return {
+ a: instance,
+ createEdge: function(d3Edges) {
+ var drawEdge, edge;
+ drawEdge = this.a.drawing.DrawEdge;
+ edge = this.a.vis.selectAll("g.edge").data(d3Edges);
+ edge.enter().append('g').attr("id", function(d) {
+ return "edge-" + d.id + "-" + d.pos;
+ }).attr('class', function(d) {
+ return "edge " + d.edgeType;
+ }).attr('source-target', function(d) {
+ return "" + d.source.id + "-" + d.target.id;
+ });
+ drawEdge.createLink(edge);
+ drawEdge.classEdge(edge);
+ drawEdge.styleLink(edge);
+ drawEdge.styleText(edge);
+ drawEdge.setInteractions(edge);
+ edge.exit().remove();
+ if (this.a.conf.directedEdges && this.a.conf.curvedEdges) {
+ return edge.select('.edge-line').attr('marker-end', 'url(#arrow)');
+ }
+ },
+ updateEdge: function(d3Edge) {
+ var drawEdge, edge;
+ drawEdge = this.a.drawing.DrawEdge;
+ edge = this.a.vis.select("#edge-" + d3Edge.id + "-" + d3Edge.pos);
+ drawEdge.classEdge(edge);
+ drawEdge.styleLink(edge);
+ drawEdge.styleText(edge);
+ return drawEdge.setInteractions(edge);
+ }
+ };
+ };
+
+ DrawNode = function(instance) {
+ return {
+ a: instance,
+ styleText: function(node) {
+ var conf, nodes, utils;
+ conf = this.a.conf;
+ utils = this.a.drawing.NodeUtils;
+ nodes = this.a._nodes;
+ return node.selectAll("text").attr('dy', function(d) {
+ if (nodes[d.id].getProperties().root) {
+ return conf.rootNodeRadius / 2;
+ } else {
+ return conf.nodeRadius * 2 - 5;
+ }
+ }).attr('visibility', function(d) {
+ if (nodes[d.id]._state === "hidden") {
+ return "hidden";
+ } else {
+ return "visible";
+ }
+ }).text(function(d) {
+ return utils.nodeText(d);
+ }).style("display", function(d) {
+ if (conf.nodeCaptionsOnByDefault) {
+ return "block";
+ }
+ });
+ },
+ createNode: function(node) {
+ node = _.difference(node, node.select("circle").data());
+ node.__proto__ = d3.select().__proto__;
+ node.append('circle').attr('id', function(d) {
+ return "circle-" + d.id;
+ });
+ return node.append('svg:text').attr('id', function(d) {
+ return "text-" + d.id;
+ });
+ },
+ styleNode: function(node) {
+ var utils;
+ utils = this.a.drawing.NodeUtils;
+ return node.selectAll('circle').attr('r', function(d) {
+ if (typeof d.radius === "function") {
+ return d.radius();
+ } else {
+ return d.radius;
+ }
+ }).each(function(d) {
+ return d3.select(this).style(utils.nodeStyle(d));
+ });
+ },
+ setInteractions: function(node) {
+ var conf, coreInteractions, drag, editorEnabled, editorInteractions, nonRootNodes, rootNodes;
+ conf = this.a.conf;
+ coreInteractions = this.a.interactions;
+ editorEnabled = this.a.get.state("interactions") === "editor";
+ drag = d3.behavior.drag().origin(Object).on("dragstart", null).on("drag", null).on("dragend", null);
+ if (editorEnabled) {
+ editorInteractions = new this.a.editor.Interactions;
+ return node.on('mouseup', function(d) {
+ return editorInteractions.nodeMouseUp(d);
+ }).on('mouseover', function(d) {
+ return editorInteractions.nodeMouseOver(d);
+ }).on('mouseout', function(d) {
+ return editorInteractions.nodeMouseOut(d);
+ }).on('dblclick', function(d) {
+ return coreInteractions.nodeDoubleClick(d);
+ }).on('click', function(d) {
+ return editorInteractions.nodeClick(d);
+ });
+ } else {
+ node.on('mouseup', null).on('mouseover', function(d) {
+ return coreInteractions.nodeMouseOver(d);
+ }).on('mouseout', function(d) {
+ return coreInteractions.nodeMouseOut(d);
+ }).on('dblclick', function(d) {
+ return coreInteractions.nodeDoubleClick(d);
+ }).on('click', function(d) {
+ return coreInteractions.nodeClick(d);
+ });
+ drag = d3.behavior.drag().origin(Object).on("dragstart", coreInteractions.nodeDragStarted).on("drag", coreInteractions.nodeDragged).on("dragend", coreInteractions.nodeDragended);
+ if (!conf.fixNodes) {
+ nonRootNodes = node.filter(function(d) {
+ return d.root !== true;
+ });
+ nonRootNodes.call(drag);
+ }
+ if (!conf.fixRootNodes) {
+ rootNodes = node.filter(function(d) {
+ return d.root === true;
+ });
+ return rootNodes.call(drag);
+ }
+ }
+ }
+ };
+ };
+
+ DrawNodes = function(instance) {
+ return {
+ a: instance,
+ createNode: function(d3Nodes) {
+ var drawNode, node;
+ drawNode = this.a.drawing.DrawNode;
+ node = this.a.vis.selectAll("g.node").data(d3Nodes, function(n) {
+ return n.id;
+ });
+ node.enter().append("g").attr("class", function(d) {
+ var nodeType;
+ nodeType = d.self._nodeType;
+ return "node " + nodeType + " active";
+ }).attr('id', function(d) {
+ return "node-" + d.id;
+ }).classed('root', function(d) {
+ return d.root;
+ });
+ drawNode.createNode(node);
+ drawNode.styleNode(node);
+ drawNode.styleText(node);
+ drawNode.setInteractions(node);
+ return node.exit().remove();
+ },
+ updateNode: function(alchemyNode) {
+ var drawNode, node;
+ drawNode = this.a.drawing.DrawNode;
+ node = this.a.vis.select("#node-" + alchemyNode.id);
+ drawNode.styleNode(node);
+ drawNode.styleText(node);
+ return drawNode.setInteractions(node);
+ }
+ };
+ };
+
+ Alchemy.prototype.EdgeUtils = function(instance) {
+ return {
+ a: instance,
+ edgeStyle: function(d) {
+ var clustering, conf, edge, nodes, styles;
+ conf = this.a.conf;
+ edge = this.a._edges[d.id][d.pos];
+ styles = this.a.svgStyles.edge.update(edge);
+ nodes = this.a._nodes;
+ if (this.a.conf.cluster) {
+ clustering = this.a.layout._clustering;
+ styles.stroke = (function(d) {
+ var clusterKey, gid, id, index, source, target;
+ clusterKey = conf.clusterKey;
+ source = nodes[d.source.id]._properties;
+ target = nodes[d.target.id]._properties;
+ if (source.root || target.root) {
+ index = source.root ? target[clusterKey] : source[clusterKey];
+ return "" + (clustering.getClusterColour(index));
+ } else if (source[clusterKey] === target[clusterKey]) {
+ index = source[clusterKey];
+ return "" + (clustering.getClusterColour(index));
+ } else if (source[clusterKey] !== target[clusterKey]) {
+ id = "" + source[clusterKey] + "-" + target[clusterKey];
+ gid = "cluster-gradient-" + id;
+ return "url(#" + gid + ")";
+ }
+ })(d);
+ }
+ return styles;
+ },
+ triangle: function(edge) {
+ var height, hyp, width;
+ width = edge.target.x - edge.source.x;
+ height = edge.target.y - edge.source.y;
+ hyp = Math.sqrt(height * height + width * width);
+ return [width, height, hyp];
+ },
+ edgeWalk: function(edge) {
+ var curveOffset, edgeLength, edgeWidth, height, hyp, startPathX, width, _ref;
+ _ref = this.triangle(edge), width = _ref[0], height = _ref[1], hyp = _ref[2];
+ edgeWidth = edge['stroke-width'];
+ curveOffset = 2;
+ startPathX = edge.source.radius + edge.source['stroke-width'] - (edgeWidth / 2) + curveOffset;
+ edgeLength = hyp - startPathX - curveOffset * 1.5;
+ return {
+ edgeAngle: Math.atan2(height, width) / Math.PI * 180,
+ edgeLength: edgeLength
+ };
+ },
+ middleLine: function(edge) {
+ return this.curvedDirectedEdgeWalk(edge, 'middle');
+ },
+ startLine: function(edge) {
+ return this.curvedDirectedEdgeWalk(edge, 'linkStart');
+ },
+ endLine: function(edge) {
+ return this.curvedDirectedEdgeWalk(edge, 'linkEnd');
+ },
+ edgeLength: function(edge) {
+ var height, hyp, width;
+ width = edge.target.x - edge.source.x;
+ height = edge.target.y - edge.source.y;
+ return hyp = Math.sqrt(height * height + width * width);
+ },
+ edgeAngle: function(edge) {
+ var height, width;
+ width = edge.target.x - edge.source.x;
+ height = edge.target.y - edge.source.y;
+ return Math.atan2(height, width) / Math.PI * 180;
+ },
+ captionAngle: function(angle) {
+ if (angle < -90 || angle > 90) {
+ return 180;
+ } else {
+ return 0;
+ }
+ },
+ middlePath: function(edge) {
+ var midPoint, pathNode;
+ pathNode = this.a.vis.select("#path-" + edge.id).node();
+ midPoint = pathNode.getPointAtLength(pathNode.getTotalLength() / 2);
+ return {
+ x: midPoint.x,
+ y: midPoint.y
+ };
+ },
+ middlePathCurve: function(edge) {
+ var midPoint, pathNode;
+ pathNode = d3.select("#path-" + edge.id).node();
+ midPoint = pathNode.getPointAtLength(pathNode.getTotalLength() / 2);
+ return {
+ x: midPoint.x,
+ y: midPoint.y
+ };
+ }
+ };
+ };
+
+ Alchemy.prototype.NodeUtils = function(instance) {
+ var a;
+ a = instance;
+ return {
+ nodeStyle: function(d) {
+ var conf, node;
+ conf = a.conf;
+ node = d.self;
+ if (conf.cluster && (node._state !== "hidden")) {
+ d.fill = (function(d) {
+ var clusterMap, clustering, colour, colourIndex, colours, key, nodeProp;
+ clustering = a.layout._clustering;
+ nodeProp = node.getProperties();
+ clusterMap = clustering.clusterMap;
+ key = conf.clusterKey;
+ colours = conf.clusterColours;
+ colourIndex = clusterMap[nodeProp[key]] % colours.length;
+ colour = colours[colourIndex];
+ return "" + colour;
+ })(d);
+ d.stroke = d.fill;
+ }
+ return d;
+ },
+ nodeText: function(d) {
+ var caption, conf, nodeProps;
+ conf = a.conf;
+ nodeProps = a._nodes[d.id]._properties;
+ if (conf.nodeCaption && typeof conf.nodeCaption === 'string') {
+ if (nodeProps[conf.nodeCaption] != null) {
+ return nodeProps[conf.nodeCaption];
+ } else {
+ return '';
+ }
+ } else if (conf.nodeCaption && typeof conf.nodeCaption === 'function') {
+ caption = conf.nodeCaption(nodeProps);
+ if (caption === void 0 || String(caption) === 'undefined') {
+ a.log["caption"] = "At least one caption returned undefined";
+ conf.caption = false;
+ }
+ return caption;
+ }
+ }
+ };
+ };
+
+ Alchemy.prototype.svgStyles = function(instance) {
+ return {
+ a: instance,
+ node: {
+ a: this.a,
+ populate: function(node) {
+ var conf, d, defaultStyle, fill, nodeType, nodeTypeKey, radius, stroke, strokeWidth, style, svgStyles, toFunc, typedStyle;
+ conf = this.a.conf;
+ defaultStyle = _.omit(conf.nodeStyle.all, "selected", "highlighted", "hidden");
+ d = node;
+ toFunc = function(inp) {
+ if (typeof inp === "function") {
+ return inp;
+ }
+ return function() {
+ return inp;
+ };
+ };
+ nodeTypeKey = _.keys(conf.nodeTypes)[0];
+ nodeType = node.getProperties()[nodeTypeKey];
+ if (conf.nodeStyle[nodeType] === void 0) {
+ nodeType = "all";
+ }
+ typedStyle = _.assign(_.cloneDeep(defaultStyle), conf.nodeStyle[nodeType]);
+ style = _.assign(typedStyle, conf.nodeStyle[nodeType][node._state]);
+ radius = toFunc(style.radius);
+ fill = toFunc(style.color);
+ stroke = toFunc(style.borderColor);
+ strokeWidth = toFunc(style.borderWidth);
+ svgStyles = {};
+ svgStyles["radius"] = radius(d);
+ svgStyles["fill"] = fill(d);
+ svgStyles["stroke"] = stroke(d);
+ svgStyles["stroke-width"] = strokeWidth(d, radius(d));
+ return svgStyles;
+ }
+ },
+ edge: {
+ a: this.a,
+ populate: function(edge) {
+ var color, conf, defaultStyle, edgeType, opacity, style, svgStyles, toFunc, typedStyle, width;
+ conf = this.a.conf;
+ defaultStyle = _.omit(conf.edgeStyle.all, "selected", "highlighted", "hidden");
+ toFunc = function(inp) {
+ if (typeof inp === "function") {
+ return inp;
+ }
+ return function() {
+ return inp;
+ };
+ };
+ edgeType = edge._edgeType;
+ if (conf.edgeStyle[edgeType] === void 0) {
+ edgeType = "all";
+ }
+ typedStyle = _.assign(_.cloneDeep(defaultStyle), conf.edgeStyle[edgeType]);
+ style = _.assign(typedStyle, conf.edgeStyle[edgeType][edge._state]);
+ width = toFunc(style.width);
+ color = toFunc(style.color);
+ opacity = toFunc(style.opacity);
+ svgStyles = {
+ "stroke": color(edge),
+ "stroke-width": width(edge),
+ "opacity": opacity(edge),
+ "fill": "none"
+ };
+ return svgStyles;
+ },
+ update: function(edge) {
+ var color, conf, opacity, style, svgStyles, toFunc, width;
+ conf = this.a.conf;
+ style = edge._style;
+ toFunc = function(inp) {
+ if (typeof inp === "function") {
+ return inp;
+ }
+ return function() {
+ return inp;
+ };
+ };
+ width = toFunc(style.width);
+ color = toFunc(style.color);
+ opacity = toFunc(style.opacity);
+ svgStyles = {
+ "stroke": color(edge),
+ "stroke-width": width(edge),
+ "opacity": opacity(edge),
+ "fill": "none"
+ };
+ return svgStyles;
+ }
+ }
+ };
+ };
+
+ Editor = (function() {
+ function Editor() {
+ this.nodeEditor = __bind(this.nodeEditor, this);
+ this.startEditor = __bind(this.startEditor, this);
+ this.utils = new alchemy.editor.Utils;
+ }
+
+ Editor.prototype.editorContainerHTML = "\n\n
\n - Remove Selected
\n - Editor mode enabled, click to disable editor interactions
\n
\n
";
+
+ Editor.prototype.elementEditorHTML = function(type) {
+ return "" + type + " Editor
\n\n";
+ };
+
+ Editor.prototype.startEditor = function() {
+ var divSelector, editor, editor_interactions, html, utils;
+ divSelector = alchemy.conf.divSelector;
+ html = this.editorContainerHTML;
+ editor = alchemy.dash.select("#control-dash").append("div").attr("id", "editor").html(html);
+ editor.select('#editor-header').on('click', function() {
+ if (alchemy.dash.select('#element-options').classed("in")) {
+ return alchemy.dash.select("#editor-header>span").attr("class", "fa fa-2x fa-caret-right");
+ } else {
+ return alchemy.dash.select("#editor-header>span").attr("class", "fa fa-2x fa-caret-down");
+ }
+ });
+ editor_interactions = editor.select('#element-options ul #editor-interactions').on('click', function() {
+ return d3.select(this).attr("class", function() {
+ if (alchemy.get.state() === 'editor') {
+ alchemy.set.state('interactions', 'default');
+ return "inactive list-group-item";
+ } else {
+ alchemy.set.state('interactions', 'editor');
+ return "active list-group-item";
+ }
+ }).html(function() {
+ if (alchemy.get.state() === 'editor') {
+ return "Disable Editor Interactions";
+ } else {
+ return "Enable Editor Interactions";
+ }
+ });
+ });
+ editor.select("#element-options ul #remove").on("click", function() {
+ return alchemy.editor.remove();
+ });
+ utils = this.utils;
+ return editor_interactions.on("click", function() {
+ if (!alchemy.dash.select("#editor-interactions").classed("active")) {
+ utils.enableEditor();
+ return alchemy.dash.select("#editor-interactions").classed({
+ "active": true,
+ "inactive": false
+ }).html("Editor mode enabled, click to disable editor interactions");
+ } else {
+ utils.disableEditor();
+ return alchemy.dash.select("#editor-interactions").classed({
+ "active": false,
+ "inactive": true
+ }).html("Editor mode disabled, click to enable editor interactions");
+ }
+ });
+ };
+
+ Editor.prototype.nodeEditor = function(n) {
+ var add_property, divSelector, editor, elementEditor, html, nodeProperties, node_property, options, property, property_list, updateProperty, val;
+ divSelector = alchemy.conf.divSelector;
+ editor = alchemy.dash.select("#control-dash #editor");
+ options = editor.select('#element-options');
+ html = this.elementEditorHTML("Node");
+ elementEditor = options.append('div').attr('id', 'node-editor').html(html);
+ elementEditor.attr("class", function() {
+ var active;
+ active = alchemy.dash.select("#editor-interactions").classed("active");
+ if (active) {
+ return "enabled";
+ }
+ return "hidden";
+ });
+ add_property = editor.select("#node-editor form #add-property");
+ add_property.select("#node-add-prop-key").attr("placeholder", "New Property Name").attr("value", null);
+ add_property.select("#node-add-prop-value").attr("placeholder", "New Property Value").attr("value", null);
+ alchemy.dash.select("#add-property-form").on("submit", function() {
+ var key, value;
+ event.preventDefault();
+ key = alchemy.dash.select('#add-prop-key').property('value');
+ key = key.replace(/\s/g, "_");
+ value = alchemy.dash.select('#add-prop-value').property('value');
+ updateProperty(key, value, true);
+ alchemy.dash.selectAll("#add-property .edited-property").classed({
+ "edited-property": false
+ });
+ return this.reset();
+ });
+ nodeProperties = alchemy._nodes[n.id].getProperties();
+ alchemy.vis.select("#node-" + n.id).classed({
+ "editing": true
+ });
+ property_list = editor.select("#node-editor #properties-list");
+ for (property in nodeProperties) {
+ val = nodeProperties[property];
+ node_property = property_list.append("div").attr("id", "node-" + property).attr("class", "property form-inline form-group");
+ node_property.append("label").attr("for", "node-" + property + "-input").attr("class", "form-control property-name").text("" + property);
+ node_property.append("input").attr("id", "node-" + property + "-input").attr("class", "form-control property-value").attr("value", "" + val);
+ }
+ alchemy.dash.select("#properties-list").on("submit", function() {
+ var key, properties, selection, value, _i, _len, _ref;
+ event.preventDefault();
+ properties = alchemy.dash.selectAll(".edited-property");
+ _ref = properties[0];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ property = _ref[_i];
+ selection = alchemy.dash.select(property);
+ key = selection.select("label").text();
+ value = selection.select("input").attr('value');
+ updateProperty(key, value, false);
+ }
+ alchemy.dash.selectAll("#node-properties-list .edited-property").classed({
+ "edited-property": false
+ });
+ return this.reset();
+ });
+ d3.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown", function() {
+ if (d3.event.keyCode === 13) {
+ event.preventDefault();
+ }
+ return d3.select(this).classed({
+ "edited-property": true
+ });
+ });
+ return updateProperty = function(key, value, newProperty) {
+ var drawNodes, nodeID;
+ nodeID = n.id;
+ if ((key !== "") && (value !== "")) {
+ alchemy._nodes[nodeID].setProperty("" + key, "" + value);
+ drawNodes = alchemy._drawNodes;
+ drawNodes.updateNode(alchemy.viz.select("#node-" + nodeID));
+ if (newProperty === true) {
+ alchemy.dash.select("#node-add-prop-key").attr("value", "property added/updated to key: " + key);
+ return alchemy.dash.select("#node-add-prop-value").attr("value", "property at " + key + " updated to: " + value);
+ } else {
+ return alchemy.dash.select("#node-" + key + "-input").attr("value", "property at " + key + " updated to: " + value);
+ }
+ } else {
+ if (newProperty === true) {
+ alchemy.dash.select("#node-add-prop-key").attr("value", "null or invalid input");
+ return alchemy.dash.select("#node-add-prop-value").attr("value", "null or invlid input");
+ } else {
+ return alchemy.dash.select("#node-" + key + "-input").attr("value", "null or invalid input");
+ }
+ }
+ };
+ };
+
+ Editor.prototype.editorClear = function() {
+ alchemy.dash.selectAll(".node").classed({
+ "editing": false
+ });
+ alchemy.dash.selectAll(".edge").classed({
+ "editing": false
+ });
+ alchemy.dash.select("#node-editor").remove();
+ alchemy.dash.select("#edge-editor").remove();
+ return alchemy.dash.select("#node-add-prop-submit").attr("placeholder", function() {
+ if (alchemy.vis.selectAll(".selected").empty()) {
+ return "select a node or edge to edit properties";
+ }
+ return "add a property to this element";
+ });
+ };
+
+ Editor.prototype.edgeEditor = function(e) {
+ var add_property, divSelector, edgeProperties, edge_property, editor, elementEditor, html, options, property, property_list, updateProperty, val;
+ divSelector = alchemy.conf.divSelector;
+ editor = alchemy.dash("#control-dash #editor");
+ options = editor.select('#element-options');
+ html = this.elementEditorHTML("Edge");
+ elementEditor = options.append('div').attr('id', 'edge-editor').html(html);
+ elementEditor.attr("class", function() {
+ if (alchemy.dash.select("#editor-interactions").classed("active")) {
+ return "enabled";
+ }
+ return "hidden";
+ });
+ add_property = editor.select("#edge-editor form #add-property");
+ add_property.select("#add-prop-key").attr("placeholder", "New Property Name").attr("value", null);
+ add_property.select("#add-prop-value").attr("placeholder", "New Property Value").attr("value", null);
+ edgeProperties = alchemy._edges[e.id].getProperties();
+ alchemy.vis.select("#edge-" + e.id).classed({
+ "editing": true
+ });
+ property_list = editor.select("#edge-editor #properties-list");
+ for (property in edgeProperties) {
+ val = edgeProperties[property];
+ edge_property = property_list.append("div").attr("id", "edge-" + property).attr("class", "property form-inline form-group");
+ edge_property.append("label").attr("for", "edge-" + property + "-input").attr("class", "form-control property-name").text("" + property);
+ edge_property.append("input").attr("id", "edge-" + property + "-input").attr("class", "form-control property-value").attr("value", "" + val);
+ }
+ alchemy.dash.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown", function() {
+ if (d3.event.keyCode === 13) {
+ event.preventDefault();
+ }
+ return d3.select(this).classed({
+ "edited-property": true
+ });
+ });
+ alchemy.dash.select("#add-property-form").on("submit", function() {
+ var key, value;
+ event.preventDefault();
+ key = alchemy.dash.select("#add-prop-key").property('value');
+ key = key.replace(/\s/g, "_");
+ value = alchemy.dash.select("#add-prop-value").property('value');
+ updateProperty(key, value, true);
+ alchemy.dash.selectAll("#add-property .edited-property").classed({
+ "edited-property": false
+ });
+ return this.reset();
+ });
+ d3.select("#properties-list").on("submit", function() {
+ var key, properties, selection, value, _i, _len, _ref;
+ event.preventDefault();
+ properties = alchemy.dash.selectAll(".edited-property");
+ _ref = properties[0];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ property = _ref[_i];
+ selection = alchemy.dash.select(property);
+ key = selection.select("label").text();
+ value = selection.select("input").property('value');
+ updateProperty(key, value, false);
+ }
+ alchemy.dash.selectAll("#properties-list .edited-property").classed({
+ "edited-property": false
+ });
+ return this.reset();
+ });
+ return updateProperty = function(key, value, newProperty) {
+ var drawEdges, edgeID, edgeSelection;
+ edgeID = e.id;
+ if ((key !== "") && (value !== "")) {
+ alchemy._edges[edgeID].setProperty("" + key, "" + value);
+ edgeSelection = alchemy.vis.select("#edge-" + edgeID);
+ drawEdges = new alchemy.drawing.DrawEdges;
+ drawEdges.updateEdge(alchemy.vis.select("#edge-" + edgeID));
+ if (newProperty === true) {
+ alchemy.dash.select("#add-prop-key").attr("value", "property added/updated to key: " + key);
+ return alchemy.dash.select("#add-prop-value").attr("value", "property at " + key + " updated to: " + value);
+ } else {
+ return alchemy.dash.select("#edge-" + key + "-input").attr("value", "property at " + key + " updated to: " + value);
+ }
+ } else {
+ if (newProperty === true) {
+ alchemy.dash.select("#add-prop-key").attr("value", "null or invalid input");
+ return alchemy.dash.select("#add-prop-value").attr("value", "null or invlid input");
+ } else {
+ return alchemy.dash.select("#edge-" + key + "-input").attr("value", "null or invalid input");
+ }
+ }
+ };
+ };
+
+ return Editor;
+
+ })();
+
+ EditorInteractions = (function() {
+ function EditorInteractions() {
+ this.reset = __bind(this.reset, this);
+ this.deleteSelected = __bind(this.deleteSelected, this);
+ this.addNodeDragended = __bind(this.addNodeDragended, this);
+ this.addNodeDragging = __bind(this.addNodeDragging, this);
+ this.addNodeStart = __bind(this.addNodeStart, this);
+ this.edgeClick = __bind(this.edgeClick, this);
+ this.nodeClick = __bind(this.nodeClick, this);
+ this.nodeMouseUp = __bind(this.nodeMouseUp, this);
+ this.editor = new alchemy.editor.Editor;
+ }
+
+ EditorInteractions.prototype.nodeMouseOver = function(n) {
+ var radius;
+ if (!d3.select(this).select("circle").empty()) {
+ radius = d3.select(this).select("circle").attr("r");
+ d3.select(this).select("circle").attr("r", radius * 3);
+ }
+ return this;
+ };
+
+ EditorInteractions.prototype.nodeMouseUp = function(n) {
+ if (this.sourceNode !== n) {
+ this.mouseUpNode = true;
+ this.targetNode = n;
+ this.click = false;
+ } else {
+ this.click = true;
+ }
+ return this;
+ };
+
+ EditorInteractions.prototype.nodeMouseOut = function(n) {
+ var radius;
+ if (!d3.select(this).select("circle").empty()) {
+ radius = d3.select(this).select("circle").attr("r");
+ d3.select(this).select("circle").attr("r", radius / 3);
+ }
+ return this;
+ };
+
+ EditorInteractions.prototype.nodeClick = function(c) {
+ var selected;
+ d3.event.stopPropagation();
+ if (!alchemy.vis.select("#node-" + c.id).empty()) {
+ selected = alchemy.vis.select("#node-" + c.id).classed('selected');
+ alchemy.vis.select("#node-" + c.id).classed('selected', !selected);
+ }
+ this.editor.editorClear();
+ return this.editor.nodeEditor(c);
+ };
+
+ EditorInteractions.prototype.edgeClick = function(e) {
+ d3.event.stopPropagation();
+ this.editor.editorClear();
+ return this.editor.edgeEditor(e);
+ };
+
+ EditorInteractions.prototype.addNodeStart = function(d, i) {
+ d3.event.sourceEvent.stopPropagation();
+ this.sourceNode = d;
+ alchemy.vis.select('#dragline').classed({
+ "hidden": false
+ });
+ return this;
+ };
+
+ EditorInteractions.prototype.addNodeDragging = function(d, i) {
+ var x2coord, y2coord;
+ x2coord = d3.event.x;
+ y2coord = d3.event.y;
+ alchemy.vis.select('#dragline').attr("x1", this.sourceNode.x).attr("y1", this.sourceNode.y).attr("x2", x2coord).attr("y2", y2coord).attr("style", "stroke: #FFF");
+ return this;
+ };
+
+ EditorInteractions.prototype.addNodeDragended = function(d, i) {
+ var dragline, targetX, targetY;
+ if (!this.click) {
+ if (!this.mouseUpNode) {
+ dragline = alchemy.vis.select("#dragline");
+ targetX = dragline.attr("x2");
+ targetY = dragline.attr("y2");
+ this.targetNode = {
+ id: "" + (_.uniqueId('addedNode_')),
+ x: parseFloat(targetX),
+ y: parseFloat(targetY),
+ caption: "node added"
+ };
+ }
+ this.newEdge = {
+ id: "" + this.sourceNode.id + "-" + this.targetNode.id,
+ source: this.sourceNode.id,
+ target: this.targetNode.id,
+ caption: "edited"
+ };
+ alchemy.editor.update(this.targetNode, this.newEdge);
+ }
+ this.reset();
+ return this;
+ };
+
+ EditorInteractions.prototype.deleteSelected = function(d) {
+ switch (d3.event.keyCode) {
+ case 8:
+ case 46:
+ if (!(d3.select(d3.event.target).node().tagName === ("INPUT" || "TEXTAREA"))) {
+ d3.event.preventDefault();
+ return alchemy.editor.remove();
+ }
+ }
+ };
+
+ EditorInteractions.prototype.reset = function() {
+ this.mouseUpNode = null;
+ this.sourceNode = null;
+ this.targetNode = null;
+ this.newEdge = null;
+ this.click = null;
+ alchemy.vis.select("#dragline").classed({
+ "hidden": true
+ }).attr("x1", 0).attr("y1", 0).attr("x2", 0).attr("y2", 0);
+ return this;
+ };
+
+ EditorInteractions;
+
+ return EditorInteractions;
+
+ })();
+
+ EditorUtils = (function() {
+ function EditorUtils() {
+ this.enableEditor = __bind(this.enableEditor, this);
+ this.drawNodes = alchemy._drawNodes;
+ this.drawEdges = alchemy._drawEdges;
+ }
+
+ EditorUtils.prototype.enableEditor = function() {
+ var dragLine, editor, selectedElements;
+ alchemy.set.state("interactions", "editor");
+ dragLine = alchemy.vis.append("line").attr("id", "dragline");
+ this.drawNodes.updateNode(alchemy.node);
+ this.drawEdges.updateEdge(alchemy.edge);
+ selectedElements = alchemy.vis.selectAll(".selected");
+ editor = new alchemy.editor.Editor;
+ if ((!selectedElements.empty()) && (selectedElements.length === 1)) {
+ if (selectedElements.classed('node')) {
+ editor.nodeEditor(selectedElements.datum());
+ return alchemy.dash.select("#node-editor").attr("class", "enabled").style("opacity", 1);
+ } else if (selectedElements.classed('edge')) {
+ editor.edgeEditor(selectedElements.datum());
+ return alchemy.dash.select("#edge-editor").attr("class", "enabled").style("opacity", 1);
+ }
+ } else {
+ return selectedElements.classed({
+ "selected": false
+ });
+ }
+ };
+
+ EditorUtils.prototype.disableEditor = function() {
+ alchemy.setState("interactions", "default");
+ alchemy.vis.select("#dragline").remove();
+ alchemy.dash.select("#node-editor").transition().duration(300).style("opacity", 0);
+ alchemy.dash.select("#node-editor").transition().delay(300).attr("class", "hidden");
+ this.drawNodes.updateNode(alchemy.node);
+ return alchemy.vis.selectAll(".node").classed({
+ "selected": false
+ });
+ };
+
+ EditorUtils.prototype.remove = function() {
+ var edge, node, nodeID, node_data, selectedNodes, _i, _j, _len, _len1, _ref, _ref1, _results;
+ selectedNodes = alchemy.vis.selectAll(".selected.node");
+ _ref = selectedNodes[0];
+ _results = [];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ node = _ref[_i];
+ nodeID = alchemy.vis.select(node).data()[0].id;
+ node_data = alchemy._nodes[nodeID];
+ if (node_data != null) {
+ _ref1 = node_data.adjacentEdges;
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+ edge = _ref1[_j];
+ alchemy._edges = _.omit(alchemy._edges, "" + edge.id + "-" + edge._index);
+ alchemy.edge = alchemy.edge.data(_.map(alchemy._edges, function(e) {
+ return e._d3;
+ }), function(e) {
+ return e.id;
+ });
+ alchemy.vis.select("#edge-" + edge.id + "-" + edge._index).remove();
+ }
+ alchemy._nodes = _.omit(alchemy._nodes, "" + nodeID);
+ alchemy.node = alchemy.node.data(_.map(alchemy._nodes, function(n) {
+ return n._d3;
+ }), function(n) {
+ return n.id;
+ });
+ alchemy.vis.select(node).remove();
+ if (alchemy.get.state("interactions") === "editor") {
+ _results.push(alchemy.modifyElements.nodeEditorClear());
+ } else {
+ _results.push(void 0);
+ }
+ } else {
+ _results.push(void 0);
+ }
+ }
+ return _results;
+ };
+
+ EditorUtils.prototype.addNode = function(node) {
+ var newNode;
+ newNode = alchemy._nodes[node.id] = new alchemy.models.Node({
+ id: "" + node.id
+ });
+ newNode.setProperty("caption", node.caption);
+ newNode.setD3Property("x", node.x);
+ newNode.setD3Property("y", node.y);
+ return alchemy.node = alchemy.node.data(_.map(alchemy._nodes, function(n) {
+ return n._d3;
+ }), function(n) {
+ return n.id;
+ });
+ };
+
+ EditorUtils.prototype.addEdge = function(edge) {
+ var newEdge;
+ newEdge = alchemy._edges[edge.id] = new alchemy.models.Edge(edge);
+ return alchemy.edge = alchemy.edge.data(_.map(alchemy._edges, function(e) {
+ return e._d3;
+ }), function(e) {
+ return e.id;
+ });
+ };
+
+ EditorUtils.prototype.update = function(node, edge) {
+ if (!this.mouseUpNode) {
+ alchemy.editor.addNode(node);
+ alchemy.editor.addEdge(edge);
+ this.drawEdges.createEdge(alchemy.edge);
+ this.drawNodes.createNode(alchemy.node);
+ } else {
+ alchemy.editor.addEdge(edge);
+ this.drawEdges.createEdge(alchemy.edge);
+ }
+ return alchemy.layout.tick();
+ };
+
+ return EditorUtils;
+
+ })();
+
+ Alchemy.prototype.Edge = function(instance) {
+ var Edge;
+ return Edge = (function() {
+ function Edge(edge, index) {
+ var conf;
+ if (index == null) {
+ index = null;
+ }
+ this.allNodesActive = __bind(this.allNodesActive, this);
+ this.setProperties = __bind(this.setProperties, this);
+ this.getStyles = __bind(this.getStyles, this);
+ this.setProperties = __bind(this.setProperties, this);
+ this.getProperties = __bind(this.getProperties, this);
+ this._setID = __bind(this._setID, this);
+ this._setD3Properties = __bind(this._setD3Properties, this);
+ this.a = instance;
+ conf = this.a.conf;
+ this.id = this._setID(edge);
+ this._index = index;
+ this._state = "active";
+ this._properties = edge;
+ this._edgeType = this._setEdgeType();
+ this._style = conf.edgeStyle[this._edgeType] != null ? _.merge(_.clone(conf.edgeStyle["all"]), conf.edgeStyle[this._edgeType]) : _.clone(conf.edgeStyle["all"]);
+ this._d3 = _.merge({
+ 'id': this.id,
+ 'pos': this._index,
+ 'edgeType': this._edgeType,
+ 'source': this.a._nodes[this._properties.source]._d3,
+ 'target': this.a._nodes[this._properties.target]._d3,
+ 'self': this
+ }, this.a.svgStyles.edge.populate(this));
+ this._setCaption(edge, conf);
+ this.a._nodes["" + edge.source]._addEdge(this);
+ this.a._nodes["" + edge.target]._addEdge(this);
+ }
+
+ Edge.prototype._setD3Properties = function(props) {
+ return _.merge(this._d3, props);
+ };
+
+ Edge.prototype._setID = function(e) {
+ if (e.id != null) {
+ return e.id;
+ } else {
+ return "" + e.source + "-" + e.target;
+ }
+ };
+
+ Edge.prototype._setCaption = function(edge, conf) {
+ var cap, edgeCaption;
+ cap = conf.edgeCaption;
+ edgeCaption = (function(edge) {
+ switch (typeof cap) {
+ case 'string' || 'number':
+ return edge[cap];
+ case 'function':
+ return cap(edge);
+ }
+ })(edge);
+ if (edgeCaption) {
+ return this._d3.caption = edgeCaption;
+ }
+ };
+
+ Edge.prototype._setEdgeType = function() {
+ var conf, edgeType, lookup;
+ conf = this.a.conf;
+ if (conf.edgeTypes) {
+ if (_.isPlainObject(conf.edgeTypes)) {
+ lookup = Object.keys(this.a.conf.edgeTypes);
+ edgeType = this._properties[lookup];
+ } else if (_.isArray(conf.edgeTypes)) {
+ edgeType = this._properties["caption"];
+ } else if (typeof conf.edgeTypes === 'string') {
+ edgeType = this._properties[conf.edgeTypes];
+ }
+ }
+ if (edgeType === void 0) {
+ edgeType = "all";
+ }
+ this._setD3Properties('edgeType', edgeType);
+ return edgeType;
+ };
+
+ Edge.prototype.getProperties = function() {
+ var key, keys, query;
+ key = arguments[0], keys = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ if (key == null) {
+ key = null;
+ }
+ if ((key == null) && (keys.length === 0)) {
+ return this._properties;
+ } else if (keys.length !== 0) {
+ query = _.union([key], keys);
+ return _.pick(this._properties, query);
+ } else {
+ return this._properties[key];
+ }
+ };
+
+ Edge.prototype.setProperties = function(property, value) {
+ if (value == null) {
+ value = null;
+ }
+ if (_.isPlainObject(property)) {
+ _.assign(this._properties, property);
+ if ('source' in property) {
+ this._setD3Properties({
+ 'source': alchemy._nodes[property.source]._d3
+ });
+ }
+ if ('target' in property) {
+ this._setD3Properties({
+ 'target': alchemy._nodes[property.target]._d3
+ });
+ }
+ } else {
+ this._properties[property] = value;
+ if ((property === 'source') || (property === 'target')) {
+ this._setD3Properties({
+ property: alchemy._nodes[value]._d3
+ });
+ }
+ }
+ return this;
+ };
+
+ Edge.prototype.getStyles = function() {
+ var edge, key, keys;
+ key = arguments[0], keys = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ edge = this;
+ if (key === void 0) {
+ return edge._style;
+ }
+ return _.map(arguments, function(arg) {
+ return edge._style[arg];
+ });
+ };
+
+ Edge.prototype.setProperties = function(property, value) {
+ if (value == null) {
+ value = null;
+ }
+ if (_.isPlainObject(property)) {
+ _.assign(this._properties, property);
+ if ('source' in property) {
+ this._setD3Properties({
+ 'source': this.a._nodes[property.source]._d3
+ });
+ }
+ if ('target' in property) {
+ this._setD3Properties({
+ 'target': this.a._nodes[property.target]._d3
+ });
+ }
+ } else {
+ this._properties[property] = value;
+ if ((property === 'source') || (property === 'target')) {
+ this._setD3Properties({
+ property: this.a._nodes[value]._d3
+ });
+ }
+ }
+ return this;
+ };
+
+ Edge.prototype.setStyles = function(key, value) {
+ if (value == null) {
+ value = null;
+ }
+ if (key === void 0) {
+ key = this.a.svgStyles.edge.populate(this);
+ }
+ if (_.isPlainObject(key)) {
+ _.assign(this._style, key);
+ } else if (typeof key === "string") {
+ this._style[key] = value;
+ }
+ this._setD3Properties(this.a.svgStyles.edge.update(this));
+ this.a._drawEdges.updateEdge(this._d3);
+ return this;
+ };
+
+ Edge.prototype.toggleHidden = function() {
+ this._state = this._state === "hidden" ? "active" : "hidden";
+ return this.setStyles();
+ };
+
+ Edge.prototype.allNodesActive = function() {
+ var sourceId, sourceNode, targetId, targetNode;
+ sourceId = this._properties.source;
+ targetId = this._properties.target;
+ sourceNode = alchemy.get.nodes(sourceId)[0];
+ targetNode = alchemy.get.nodes(targetId)[0];
+ return sourceNode._state === "active" && targetNode._state === "active";
+ };
+
+ Edge.prototype.remove = function() {
+ var edge, filteredLinkList;
+ edge = this;
+ delete this.a._edges[edge.id];
+ if (this.a._nodes[edge._properties.source] != null) {
+ _.remove(this.a._nodes[edge._properties.source]._adjacentEdges, function(e) {
+ if (e.id === edge.id) {
+ return e;
+ }
+ });
+ }
+ if (this.a._nodes[edge._properties.target] != null) {
+ _.remove(this.a._nodes[edge._properties.target]._adjacentEdges, function(e) {
+ if (e.id === edge.id) {
+ return e;
+ }
+ });
+ }
+ this.a.vis.select("#edge-" + edge.id + "-" + edge._index).remove();
+ filteredLinkList = _.filter(this.a.force.links(), function(link) {
+ if (link.id !== edge.id) {
+ return link;
+ }
+ });
+ return this.a.force.links(filteredLinkList);
+ };
+
+ return Edge;
+
+ })();
+ };
+
+ Alchemy.prototype.Node = function(instance) {
+ var Node;
+ return Node = (function() {
+ function Node(node) {
+ this.getStyles = __bind(this.getStyles, this);
+ this.setProperty = __bind(this.setProperty, this);
+ this.getProperties = __bind(this.getProperties, this);
+ this._setD3Properties = __bind(this._setD3Properties, this);
+ this._setNodeType = __bind(this._setNodeType, this);
+ var conf;
+ this.a = instance;
+ conf = this.a.conf;
+ this.id = node.id;
+ this._properties = node;
+ this._d3 = _.merge({
+ 'id': this.id,
+ 'root': this._properties[conf.rootNodes],
+ 'self': this
+ }, this.a.svgStyles.node.populate(this));
+ this._nodeType = this._setNodeType();
+ this._style = conf.nodeStyle[this._nodeType] ? conf.nodeStyle[this._nodeType] : conf.nodeStyle["all"];
+ this._state = "active";
+ this._adjacentEdges = [];
+ }
+
+ Node.prototype._setNodeType = function() {
+ var conf, lookup, nodeType, types;
+ conf = this.a.conf;
+ if (conf.nodeTypes) {
+ if (_.isPlainObject(conf.nodeTypes)) {
+ lookup = Object.keys(this.a.conf.nodeTypes);
+ types = _.values(conf.nodeTypes);
+ nodeType = this._properties[lookup];
+ } else if (typeof conf.nodeTypes === 'string') {
+ nodeType = this._properties[conf.nodeTypes];
+ }
+ }
+ if (nodeType === void 0) {
+ nodeType = "all";
+ }
+ this._setD3Properties('nodeType', nodeType);
+ return nodeType;
+ };
+
+ Node.prototype._setD3Properties = function(props) {
+ return _.merge(this._d3, props);
+ };
+
+ Node.prototype._addEdge = function(edge) {
+ return this._adjacentEdges = _.union(this._adjacentEdges, [edge]);
+ };
+
+ Node.prototype.getProperties = function() {
+ var key, keys, query;
+ key = arguments[0], keys = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ if (key == null) {
+ key = null;
+ }
+ if ((key == null) && (keys.length === 0)) {
+ return this._properties;
+ } else if (keys.length !== 0) {
+ query = _.union([key], keys);
+ return _.pick(this._properties, query);
+ } else {
+ return this._properties[key];
+ }
+ };
+
+ Node.prototype.setProperty = function(property, value) {
+ if (value == null) {
+ value = null;
+ }
+ if (_.isPlainObject(property)) {
+ _.assign(this._properties, property);
+ } else {
+ this._properties[property] = value;
+ }
+ return this;
+ };
+
+ Node.prototype.removeProperty = function() {
+ var prop, properties, property, _i, _len;
+ property = arguments[0], properties = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ for (_i = 0, _len = arguments.length; _i < _len; _i++) {
+ prop = arguments[_i];
+ delete this._properties[prop];
+ }
+ return this;
+ };
+
+ Node.prototype.getStyles = function() {
+ var key, keys, node;
+ key = arguments[0], keys = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ node = this;
+ if (key === void 0) {
+ return node._style;
+ }
+ return _.map(arguments, function(arg) {
+ return node._style[arg];
+ });
+ };
+
+ Node.prototype.setStyles = function(key, value) {
+ if (value == null) {
+ value = null;
+ }
+ if (key === void 0) {
+ key = this.a.svgStyles.node.populate(this);
+ } else if (_.isPlainObject(key)) {
+ _.assign(this._style, key);
+ } else {
+ this._style[key] = value;
+ }
+ this._setD3Properties(this.a.svgStyles.node.populate(this));
+ this.a._drawNodes.updateNode(this._d3);
+ return this;
+ };
+
+ Node.prototype.toggleHidden = function() {
+ var a;
+ a = this.a;
+ this._state = this._state === "hidden" ? "active" : "hidden";
+ this.setStyles();
+ return _.each(this._adjacentEdges, function(e) {
+ var source, sourceState, target, targetState, _ref;
+ _ref = e.id.split("-"), source = _ref[0], target = _ref[1];
+ sourceState = a._nodes["" + source]._state;
+ targetState = a._nodes["" + target]._state;
+ if (e._state === "hidden" && (sourceState === "active" && targetState === "active")) {
+ return e.toggleHidden();
+ } else if (e._state === "active" && (sourceState === "hidden" || targetState === "hidden")) {
+ return e.toggleHidden();
+ }
+ });
+ };
+
+ Node.prototype.outDegree = function() {
+ return this._adjacentEdges.length;
+ };
+
+ Node.prototype.remove = function() {
+ while (!_.isEmpty(this._adjacentEdges)) {
+ this._adjacentEdges[0].remove();
+ }
+ delete this.a._nodes[this.id];
+ return this.a.vis.select("#node-" + this.id).remove();
+ };
+
+ return Node;
+
+ })();
+ };
+
+ Alchemy.prototype.plugins = function(instance) {
+ return {
+ init: function() {
+ return _.each(_.keys(instance.conf.plugins), function(key) {
+ instance.plugins[key] = Alchemy.prototype.plugins[key](instance);
+ if (instance.plugins[key].init != null) {
+ return instance.plugins[key].init();
+ }
+ });
+ }
+ };
+ };
+
+ Alchemy.prototype.themes = {
+ "default": {
+ "backgroundColour": "#000000",
+ "nodeStyle": {
+ "all": {
+ "radius": function() {
+ return 10;
+ },
+ "color": function() {
+ return "#68B9FE";
+ },
+ "borderColor": function() {
+ return "#127DC1";
+ },
+ "borderWidth": function(d, radius) {
+ return radius / 3;
+ },
+ "captionColor": function() {
+ return "#FFFFFF";
+ },
+ "captionBackground": function() {
+ return null;
+ },
+ "captionSize": 12,
+ "selected": {
+ "color": function() {
+ return "#FFFFFF";
+ },
+ "borderColor": function() {
+ return "#349FE3";
+ }
+ },
+ "highlighted": {
+ "color": function() {
+ return "#EEEEFF";
+ }
+ },
+ "hidden": {
+ "color": function() {
+ return "none";
+ },
+ "borderColor": function() {
+ return "none";
+ }
+ }
+ }
+ },
+ "edgeStyle": {
+ "all": {
+ "width": 4,
+ "color": "#CCC",
+ "opacity": 0.2,
+ "directed": true,
+ "curved": true,
+ "selected": {
+ "opacity": 1
+ },
+ "highlighted": {
+ "opacity": 1
+ },
+ "hidden": {
+ "opacity": 0
+ }
+ }
+ }
+ },
+ "white": {
+ "theme": "white",
+ "backgroundColour": "#FFFFFF",
+ "nodeStyle": {
+ "all": {
+ "radius": function() {
+ return 10;
+ },
+ "color": function() {
+ return "#68B9FE";
+ },
+ "borderColor": function() {
+ return "#127DC1";
+ },
+ "borderWidth": function(d, radius) {
+ return radius / 3;
+ },
+ "captionColor": function() {
+ return "#FFFFFF";
+ },
+ "captionBackground": function() {
+ return null;
+ },
+ "captionSize": 12,
+ "selected": {
+ "color": function() {
+ return "#FFFFFF";
+ },
+ "borderColor": function() {
+ return "38DD38";
+ }
+ },
+ "highlighted": {
+ "color": function() {
+ return "#EEEEFF";
+ }
+ },
+ "hidden": {
+ "color": function() {
+ return "none";
+ },
+ "borderColor": function() {
+ return "none";
+ }
+ }
+ }
+ },
+ "edgeStyle": {
+ "all": {
+ "width": 4,
+ "color": "#333",
+ "opacity": 0.4,
+ "directed": false,
+ "curved": false,
+ "selected": {
+ "color": "#38DD38",
+ "opacity": 0.9
+ },
+ "highlighted": {
+ "color": "#383838",
+ "opacity": 0.7
+ },
+ "hidden": {
+ "opacity": 0
+ }
+ }
+ }
+ }
+ };
+
+ Alchemy.prototype.exports = function(instance) {
+ var a;
+ a = instance;
+ return {
+ init: function() {
+ return a.exports.show();
+ },
+ show: function() {
+ return a.dash.select("#all-exports").append("li").attr({
+ "class": "list-group-item active-label toggle"
+ }).html("SVG").on("click", function(e) {
+ var sanitizedUrl, str, svg, url, win;
+ svg = d3.select("" + a.conf.divSelector + " svg").node();
+ str = (new XMLSerializer).serializeToString(svg);
+ url = "data:image/svg+xml;utf8," + str;
+ sanitizedUrl = url.replace("xlink:", "");
+ win = window.open(sanitizedUrl);
+ return win.focus();
+ });
+ }
+ };
+ };
+
+ warnings = (function() {
+ function warnings(instance) {
+ this.dataWarning = __bind(this.dataWarning, this);
+ this.a = instance;
+ }
+
+ warnings.prototype.dataWarning = function() {
+ if (this.a.conf.dataWarning && typeof this.a.conf.dataWarning === 'function') {
+ return this.a.conf.dataWarning();
+ } else if (this.a.conf.dataWarning === 'default') {
+ return console.log("No dataSource was loaded");
+ }
+ };
+
+ warnings.prototype.divWarning = function() {
+ return "create an element that matches the value for 'divSelector' in your conf.\nFor instance, if you are using the default 'divSelector' conf, simply provide\n.";
+ };
+
+ return warnings;
+
+ })();
+
+}).call(this);
+
+//# sourceMappingURL=alchemy.js.map
diff --git a/EHEC_Server/EHEC_Server/alchemy/alchemy.min.css b/EHEC_Server/EHEC_Server/alchemy/alchemy.min.css
new file mode 100644
index 0000000..c665783
--- /dev/null
+++ b/EHEC_Server/EHEC_Server/alchemy/alchemy.min.css
@@ -0,0 +1 @@
+@-webkit-keyframes fadeIn{0%{opacity:0}25%{opacity:.3}50%{opacity:.66}75%{opacity:1}}@keyframes fadeIn{0%{opacity:0}25%{opacity:.3}50%{opacity:.66}75%{opacity:1}}@-webkit-keyframes pulse{0%{text-shadow:0 0 10px rgba(255,255,255,.2),0 0 12px rgba(255,255,255,.2),0 0 16px rgba(255,255,255,.2)}25%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 6px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7)}50%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7)}75%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 25px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 12px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7),0 0 20px rgba(104,185,254,.7)}}@keyframes pulse{0%{text-shadow:0 0 10px rgba(255,255,255,.2),0 0 12px rgba(255,255,255,.2),0 0 16px rgba(255,255,255,.2)}25%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 6px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7)}50%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 20px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 10px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7)}75%{text-shadow:0 0 12px rgba(255,255,255,.2),0 0 15px rgba(255,255,255,.2),0 0 25px rgba(255,255,255,.2),0 0 8px rgba(104,185,254,.7),0 0 12px rgba(104,185,254,.7),0 0 15px rgba(104,185,254,.7),0 0 20px rgba(104,185,254,.7)}}@-webkit-keyframes slide-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0%,0);transform:translate(0%,0)}}@keyframes slide-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0%,0);transform:translate(0%,0)}}@-webkit-keyframes slide-out{0%{-webkit-transform:translate(0%,0);transform:translate(0%,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@keyframes slide-out{100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}svg{position:absolute;left:0;cursor:-webkit-grab;height:100%;width:100%;color:#333}.node{cursor:pointer}.node text.root{font-size:32px}.node text{display:none;fill:#fff;font-weight:200;text-anchor:middle;z-index:1000;text-shadow:1px 1px #333,-1px 1px #333,1px -1px #333,-1px -1px #333}.node.active{opacity:1}.node.active.selected text,.node.active:hover text{display:block}defs #arrow path{stroke:#CCC;stroke-opacity:.2;fill:#CCC;opacity:1}.edge text{stroke-width:0}.edge .edge-handler{fill:none;stroke:none}.edge .edge-line{fill:none}.edge.active text{display:none;fill:#fff;font-weight:200;text-anchor:middle;text-shadow:1px 1px #333,-1px 1px #333,1px -1px #333,-1px -1px #333;z-index:1000}.edge.active.selected,.edge.active:hover{cursor:pointer}.edge.active.highlight text,.edge.active.selected text,.edge.active:hover text{display:block}#zoom-controls{background-color:transparent;background-image:url(images/maze-black.png);border-top-right-radius:3px;border-bottom-right-radius:3px;box-shadow:0 0 5px rgba(255,255,255,.3);margin-top:10%;z-index:5;position:relative;display:block;width:55px}#zoom-controls #zoom-in,#zoom-controls #zoom-out,#zoom-controls #zoom-reset{padding:12px;margin:0;width:100%}#zoom-controls #zoom-in i,#zoom-controls #zoom-out i,#zoom-controls #zoom-reset i{color:#E89619}#zoom-controls #zoom-in:hover,#zoom-controls #zoom-out:hover,#zoom-controls #zoom-reset:hover{background-color:rgba(255,255,255,.2)}#zoom-controls #zoom-in:active,#zoom-controls #zoom-out:active,#zoom-controls #zoom-reset:active{border:0}.fa-caret-down,.fa-caret-right,.fa-search{margin:0 5px;color:#e89619}#search{margin-top:2em;margin-bottom:1em;padding:.5em 1em;width:100%}#search span{vertical-align:bottom}#search input{background-color:#000;border:0;font-size:20px;color:#fff;padding-left:.5em}#search .search-icon{height:22px;background-color:#000;border-color:#000;border-right-color:#111}#stats{padding:.5em 1em;background-color:transparent;border-bottom:thin dashed #e89619}#stats #stats-header{padding:10px}#stats #all-stats{color:#fff;border-radius:none;border:0;background:0 0;overflow:auto}#stats #all-stats li{padding:3px}#stats #edge-stats-graph,#stats #node-stats-graph{height:250px}#stats #edge-stats-graph svg,#stats #node-stats-graph svg{opacity:.6;background:0 0}#stats #edge-stats-graph text,#stats #node-stats-graph text{font-size:16px;fill:#fff;font-weight:200;text-anchor:middle;z-index:1000}#stats #edge-stats-graph .no-data,#stats #node-stats-graph .no-data{margin:30px 0;color:#e89619}#stats .badge{border-radius:0;height:100%;background-color:rgba(104,185,254,.6)}#editor{padding:.5em 1em;background-color:transparent;border-bottom:thin dashed #e89619}#editor h3{padding:10px}#editor #element-options{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;cursor:pointer;margin-top:10px;margin-left:2%;color:#fff}#editor #element-options #add-property-form,#editor #element-options .property{display:-webkit-inline-flex;display:inline-flex;margin:4px 0;width:100%}#editor #element-options #add-property-form #add-property #add-prop-value,#editor #element-options .property-value{border:thin rgba(255,255,255,.2) solid;border-left:0;background-color:#000;color:#fff;width:100%;border-top-left-radius:0;border-bottom-left-radius:0}#editor #element-options #add-property-form #add-property #add-prop-key,#editor #element-options .property-name{text-align:center;font-weight:200;cursor:default;background:#2E2E2E;border:thin transparent solid;color:#e89619;border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}#editor #element-options #update-properties,#editor #element-options input[type=submit]{color:#e89619;border-top-right-radius:4px;border-bottom-right-radius:4px;width:auto;background:rgba(255,255,255,.1);border:thin solid #e89619;text-align:center}#editor #element-options #update-properties:active,#editor #element-options #update-properties:focus,#editor #element-options input[type=submit]:active,#editor #element-options input[type=submit]:focus{outline:0}#editor #element-options #update-properties:hover,#editor #element-options input[type=submit]:hover{color:#fff;border:thin solid #fff}#editor #element-options #update-properties{border-radius:4px;padding:10px;width:100%;margin-bottom:20px}#editor #element-options #add-property-form #add-property{display:-webkit-flex;display:flex;-webkit-flex-grow:2;flex-grow:2;-webkit-flex-direction:column;flex-direction:column}#editor #element-options #add-property-form #add-property #add-prop-value{text-align:center;width:100%;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border:thin rgba(255,255,255,.2) solid}#editor #element-options #add-property-form #add-property #add-prop-key{cursor:text;width:100%;border-top-left-radius:4px;border-bottom-left-radius:0}#editor #editor-interactions.active{color:#e89619}#editor #editor-interactions.inactive{color:#fff}#editor #edge-editor.enabled,#editor #node-editor.enabled{-webkit-animation:fadeIn 1s linear;animation:fadeIn 1s linear}#control-dash-wrapper{font-family:'Source Sans Pro',Helvetica,sans-serif;letter-spacing:.05em;height:inherit;z-index:inherit;padding:0}#control-dash-wrapper.initial{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}#control-dash-wrapper.initial #dash-toggle{color:#e89619;-webkit-animation:4s pulse linear;animation:4s pulse linear}#control-dash-wrapper.off-canvas{-webkit-transform:translate(-100%,0);transform:translate(-100%,0);-webkit-animation:slide-out .75s linear;animation:slide-out .75s linear}#control-dash-wrapper.off-canvas #dash-toggle{color:#e89619;-webkit-animation:4s pulse linear;animation:4s pulse linear}#control-dash-wrapper.on-canvas{-webkit-animation:slide-in .75s ease-in-out;animation:slide-in .75s ease-in-out}#control-dash-wrapper.on-canvas *{box-shadow:none!important}#control-dash-wrapper.on-canvas #dash-toggle{color:rgba(232,150,25,.6)}#control-dash-wrapper.on-canvas #dash-toggle:hover{color:#e89619;-webkit-animation:4s pulse linear;animation:4s pulse linear}#control-dash-wrapper #control-dash{overflow-x:hidden;overflow-y:scroll;background-color:transparent;background-image:url(images/maze-black.png);padding:0;height:inherit;z-index:5}#control-dash-wrapper #control-dash h3{display:inline;margin:0}#control-dash-wrapper #dash-toggle{z-index:5;background-color:transparent;background-image:url(images/maze-black.png);border-top-right-radius:3px;border-bottom-right-radius:3px;box-shadow:0 0 5px rgba(255,255,255,.3);position:absolute;left:0;top:50%;font-size:2.2em;color:rgba(255,255,255,.2);padding:10px}#control-dash-wrapper button{border-radius:0;border:0;background-color:transparent}#control-dash-wrapper button:active{border:0}#control-dash-wrapper h3{font-weight:200;margin-top:10px;color:#fff;cursor:pointer;vertical-align:top}#control-dash-wrapper li{cursor:pointer;background:0 0;border:0;border-radius:0}#clustering{padding:.5em 1em;cursor:pointer;color:#fff;border-bottom:thin dashed #E89619}#clustering #cluster-key-container,#clustering #cluster_control_header{padding:10px 10px 0}#clustering #cluster-key{color:#333;background-color:#000;border-radius:4px;border:thin solid #333;text-align:center;display:inline-block;width:100%}#filters{padding:.5em 1em;background-color:transparent;border-bottom:thin dashed #e89619;color:#fff}#filters form{width:100%}#filters #filter-header{padding:10px}#filters #filter-nodes,#filters #filter-relationships{background-color:transparent;display:inline-block;width:45%;margin-left:2%;overflow:auto;text-align:center;vertical-align:top}#filters #filter-nodes #filter-node-header,#filters #filter-nodes #filter-rel-header,#filters #filter-relationships #filter-node-header,#filters #filter-relationships #filter-rel-header{margin:10px 0;cursor:pointer;background-color:transparent;border:0;border-radius:0;width:100%}#filters #filter-nodes #filter-node-header h4,#filters #filter-nodes #filter-rel-header h4,#filters #filter-relationships #filter-node-header h4,#filters #filter-relationships #filter-rel-header h4{font-weight:200;display:inline;color:#fff}#filters #filter-nodes #filter-node-header:active,#filters #filter-nodes #filter-rel-header:active,#filters #filter-relationships #filter-node-header:active,#filters #filter-relationships #filter-rel-header:active{border:0;box-shadow:none}#filters #filter-nodes #node-dropdown,#filters #filter-nodes #rel-dropdown,#filters #filter-relationships #node-dropdown,#filters #filter-relationships #rel-dropdown{margin:20px 0;border-radius:none;border:0;background:0 0}#filters #filter-nodes #node-dropdown li,#filters #filter-nodes #rel-dropdown li,#filters #filter-relationships #node-dropdown li,#filters #filter-relationships #rel-dropdown li{padding:5px}#filters #filter-nodes #node-dropdown li:hover,#filters #filter-nodes #rel-dropdown li:hover,#filters #filter-relationships #node-dropdown li:hover,#filters #filter-relationships #rel-dropdown li:hover{background-color:rgba(255,255,255,.2)}#filters .disabled{color:rgba(255,255,255,.5)}#filters .disabled:hover{color:#fdc670}.alchemy{position:relative}.alchemy #search form{z-index:2;display:inline;margin-left:100px}.alchemy #add-tag{width:300px;display:inline-block}.alchemy #tags input{max-width:220px}.alchemy #tags-list{padding:0}.alchemy #tags-list .icon-remove-sign{cursor:pointer}.alchemy #tags-list li{display:inline-block;margin-top:5px}.alchemy #tags-list span{background-color:#ccc;color:#333;border-radius:10em;display:inline-block;padding:1px 6px}.alchemy #filter-nodes label,.alchemy #filter-relationships label{font-weight:400;margin-right:1em}.alchemy .clear{clear:both}.alchemy text{font-weight:200;text-anchor:middle}
\ No newline at end of file
diff --git a/EHEC_Server/EHEC_Server/alchemy/alchemy.min.js b/EHEC_Server/EHEC_Server/alchemy/alchemy.min.js
new file mode 100644
index 0000000..5f43854
--- /dev/null
+++ b/EHEC_Server/EHEC_Server/alchemy/alchemy.min.js
@@ -0,0 +1,3 @@
+(function(){"Alchemy.js is a graph drawing application for the web.\nCopyright (C) 2014 GraphAlchemist, Inc.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License\nalong with this program. If not, see .\nlets";var a,b,c,d,e,f,g,h,i,j,k,l,m=[].slice,n=function(a,b){return function(){return a.apply(b,arguments)}};a=function(){function a(a){null==a&&(a=null),this.a=this,this.version="0.4.1",this.get=new this.Get(this),this.remove=new this.Remove(this),this.create=new this.Create(this),this.set=new this.Set(this),this.drawing={DrawEdge:c(this),DrawEdges:d(this),DrawNode:e(this),DrawNodes:f(this),EdgeUtils:this.EdgeUtils(this),NodeUtils:this.NodeUtils(this)},this.controlDash=this.controlDash(this),this.stats=this.stats(this),this.layout=j,this.clustering=b,this.models={Node:this.Node(this),Edge:this.Edge(this)},this.utils={warnings:new l(this)},this.filters=this.filters(this),this.exports=this.exports(this),this.visControls={},this.styles={},this.editor={},this.log={},this.state={interactions:"default",layout:"default"},this.startGraph=this.startGraph(this),this.updateGraph=this.updateGraph(this),this.generateLayout=this.generateLayout(this),this.svgStyles=this.svgStyles(this),this.interactions=this.interactions(this),this.search=this.search(this),this.plugins=this.plugins(this),this._nodes={},this._edges={},this.getNodes=this.get.getNodes,this.getEdges=this.get.getEdges,this.allNodes=this.get.allNodes,this.allEdges=this.get.allEdges,a&&this.begin(a)}return a.prototype.begin=function(b){var c;switch(c=this.setConf(b),typeof this.conf.dataSource){case"string":d3.json(this.a.conf.dataSource,this.a.startGraph);break;case"object":this.a.startGraph(this.a.conf.dataSource)}return this.plugins.init(),a.prototype.instances.push(this),this},a.prototype.setConf=function(a){var b,c;null!=a.theme&&(a=_.merge(_.cloneDeep(this.defaults),this.a.themes[""+a.theme]));for(b in a)switch(c=a[b],b){case"clusterColors":a.clusterColours=c;break;case"backgroundColor":a.backgroundColour=c;break;case"nodeColor":a[nodeColour]=c}return this.a.conf=_.merge(_.cloneDeep(this.defaults),a)},a.prototype.instances=[],a.prototype.getInst=function(b){var c;return c=parseInt(d3.select(b).attr("alchInst")),a.prototype.instances[c]},a}(),k="undefined"!=typeof exports&&null!==exports?exports:this,k.Alchemy=a,k.alchemy={begin:function(b){return k.alchemy=new a(b)}},a.prototype.Create=function(){function a(a){this.a=a}return a.prototype.nodes=function(){var a,b,c,d,e,f,g;for(c=arguments[0],d=2<=arguments.length?m.call(arguments,1):[],a=this.a,e=function(b){var c;return a._nodes[b.id]?console.warn("A node with the id "+b.id+" already exists.\nConsider using the @a.get.nodes() method to \nretrieve the node and then using the Node methods."):(c=new a.models.Node(b),a._nodes[b.id]=c,[c])},d=_.union(d,c),f=0,g=d.length;g>f;f++)b=d[f],e(b);return this.a.initial?this.a.updateGraph():void 0},a.prototype.edges=function(){var a,b,c,d,e;return c=arguments[0],d=2<=arguments.length?m.call(arguments,1):[],a=this.a,e=function(b){var c,d;return b.id&&!a._edges[b.id]?(c=new a.models.Edge(b),a._edges[b.id]=[c],[c]):b.id&&a._edges[b.id]?console.warn("An edge with that id "+someEdgeMap.id+" already exists.\nConsider using the @a.get.edge() method to \nretrieve the edge and then using the Edge methods.\nNote: id's are not required for edges. Alchemy will create\nan unlimited number of edges for the same source and target node.\nSimply omit 'id' when creating the edge."):(d=a._edges[""+b.source+"-"+b.target],d?(c=new a.models.Edge(b,d.length),d.push(c),[c]):(c=new a.models.Edge(b,0),a._edges[""+b.source+"-"+b.target]=[c],[c]))},b=_.uniq(_.flatten(arguments)),_.each(b,function(a){return e(a)}),this.a.initial?this.a.updateGraph():void 0},a}(),a.prototype.Get=function(a){return{a:a,_el:[],_elType:null,_makeChain:function(a){var b;for(b=this,b.__proto__=[].__proto__;b.length;)b.pop();return _.each(a,function(a){return b.push(a)}),b},nodes:function(){var a,b,c,d,e;return c=arguments[0],d=2<=arguments.length?m.call(arguments,1):[],null!=c&&(b=_.map(arguments,function(a){return String(a)}),a=this.a,e=function(a){return _.filter(a._nodes,function(a,c){return _.contains(b,c)?a:void 0})}(a)),this._elType="node",this._el=e,this._makeChain(e)},edges:function(){var a,b,c,d,e;return d=arguments[0],e=2<=arguments.length?m.call(arguments,1):[],null!=d&&(b=_.map(arguments,function(a){return String(a)}),a=this.a,c=function(a){return _.flatten(_.filter(a._edges,function(a,c){return _.contains(b,c)?a:void 0}))}(a)),this._elType="edge",this._el=c,this._makeChain(c)},all:function(){var a,b;return a=this.a,b=this._elType,this._el=function(b){switch(b){case"node":return a.elements.nodes.val;case"edge":return a.elements.edges.flat}}(b),this._makeChain(this._el)},elState:function(a){var b;return b=_.filter(this._el,function(b){return b._state===a}),this._el=b,this._makeChain(b)},state:function(){return null!=this.a.state.key?this.a.state.key:void 0},type:function(a){var b;return b=_.filter(this._el,function(b){return b._nodeType===a||b._edgeType===a}),this._el=b,this._makeChain(b)},activeNodes:function(){return _.filter(this.a._nodes,function(a){return"active"===a._state?a:void 0})},activeEdges:function(){return _.filter(this.a.get.allEdges(),function(a){return"active"===a._state?a:void 0})},state:function(){return null!=this.a.state.key?this.a.state.key:void 0},clusters:function(){var a,b;return a=this.a.layout._clustering.clusterMap,b={},_.each(a,function(a,c){return b[c]=_.select(this.a.get.allNodes(),function(a){return a.getProperties()[this.a.conf.clusterKey]===c})}),b},clusterColours:function(){var a,b;return b=this.a.layout._clustering.clusterMap,a={},_.each(b,function(b,c){return a[c]=this.a.conf.clusterColours[b%this.a.conf.clusterColours.length]}),a},allEdges:function(){return this.a.elements.nodes.flat},allNodes:function(a){return null!=a?_.filter(this.a._nodes,function(b){return b._nodeType===a?b:void 0}):this.a.elements.nodes.val},getNodes:function(){var a,b,c;return b=arguments[0],c=2<=arguments.length?m.call(arguments,1):[],a=this.a,c.push(b),_.map(c,function(b){return a._nodes[b]})},getEdges:function(a,b){var c,d;return null==a&&(a=null),null==b&&(b=null),c=this.a,null!=a&&null!=b?(d=""+a+"-"+b,this.a._edges[d]):null!=a&&null==b?this.a._nodes[a]._adjacentEdges:void 0}}},a.prototype.Remove=function(){function a(a){this.a=a}return a.prototype.nodes=function(a){return _.each(a,function(a){return null!=a._nodeType?a.remove():void 0})},a.prototype.edges=function(a){return _.each(a,function(a){return null!=a._edgeType?a.remove():void 0})},a}(),a.prototype.Set=function(a){return{a:a,state:function(a,b){return this.a.state.key=b}}},b=function(){function a(a){var b,c,d,e,f,g,h,i;this.a=a,d=this.a._nodes,c=this.a.conf,b=this,this.clusterKey=c.clusterKey,this.identifyClusters(this.a),e=-500,i=function(a){var b,c;return b=d[a.source.id]._properties[this.clusterKey],c=d[a.target.id]._properties[this.clusterKey],b===c?.15:0},f=function(){return.7},h=function(a){return d=a.self.a._nodes,d[a.source.id]._properties.root||d[a.target.id]._properties.root?300:d[a.source.id]._properties[this.clusterKey]===d[a.target.id]._properties[this.clusterKey]?10:600},g=function(a){return 8*a},this.layout={charge:e,linkStrength:function(a){return i(a)},friction:function(){return f()},linkDistancefn:function(a){return h(a)},gravity:function(a){return g(a)}}}return a.prototype.identifyClusters=function(a){var b,c,d;return c=a.elements.nodes.val,b=_.uniq(_.map(c,function(b){return b.getProperties()[a.conf.clusterKey]})),this.clusterMap=_.zipObject(b,function(){d=[];for(var a=0,c=b.length;c>=0?c>=a:a>=c;c>=0?a++:a--)d.push(a);return d}.apply(this))},a.prototype.getClusterColour=function(a){var b;return b=this.clusterMap[a]%this.a.conf.clusterColours.length,this.a.conf.clusterColours[b]},a.prototype.edgeGradient=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;for(c=this.a.vis.select(""+this.a.conf.divSelector+" svg"),b={},j=this.a._nodes,n=_.map(a,function(a){return a._d3}),l=0,m=n.length;m>l;l++)if(d=n[l],!j[d.source.id]._properties.root&&!j[d.target.id]._properties.root&&j[d.source.id]._properties[this.clusterKey]!==j[d.target.id]._properties[this.clusterKey]&&j[d.target.id]._properties[this.clusterKey]!==j[d.source.id]._properties[this.clusterKey]){if(h=j[d.source.id]._properties[this.clusterKey]+"-"+j[d.target.id]._properties[this.clusterKey],h in b)continue;h in b||(k=this.getClusterColour(j[d.target.id]._properties[this.clusterKey]),e=this.getClusterColour(j[d.source.id]._properties[this.clusterKey]),b[h]={startColour:k,endColour:e})}o=[];for(i in b)g="cluster-gradient-"+i,f=c.append("svg:linearGradient").attr("id",g),f.append("svg:stop").attr("offset","0%").attr("stop-color",b[i].startColour),o.push(f.append("svg:stop").attr("offset","100%").attr("stop-color",b[i].endColour));return o},a}(),a.prototype.clusterControls={init:function(){var a;return a="",this.a.dash.select("#clustering-container").append("div").attr("id","cluster-key-container").attr("class","property form-inline form-group").html(a).style("display","none"),this.a.dash.select("#cluster_control_header").on("click",function(){var a,b;return b=this.a.dash.select("#cluster-key-container"),a=b.style("display")}),element.style("display",function(){return"block"===display?"none":"block"}),"none"===this.a.dash.select("#cluster-key-container").style("display")?this.a.dash.select("#cluster-arrow").attr("class","fa fa-2x fa-caret-right"):this.a.dash.select("#cluster-arrow").attr("class","fa fa-2x fa-caret-down"),this.a.dash.select("#cluster-key").on("keydown",function(){return"Enter"===d3.event.keyIdentifier?(this.a.conf.cluster=!0,this.a.conf.clusterKey=this.value,this.a.generateLayout()):void 0})}},a.prototype.controlDash=function(a){var b;return b=a,{init:function(){var a;return this.dashIsShown()?(a=b.conf.divSelector,b.dash=d3.select(""+a).append("div").attr("id","control-dash-wrapper").attr("class","col-md-4 initial"),b.dash.append("i").attr("id","dash-toggle").attr("class","fa fa-flask col-md-offset-12"),b.dash.append("div").attr("id","control-dash").attr("class","col-md-12"),b.dash.select("#dash-toggle").on("click",b.interactions.toggleControlDash),b.controlDash.zoomCtrl(),b.controlDash.search(),b.controlDash.filters(),b.controlDash.stats(),b.controlDash.clustering(),b.controlDash.exports()):void 0},search:function(){return b.conf.search?(b.dash.select("#control-dash").append("div").attr("id","search").html("\n \n \n
"),b.search.init()):void 0},zoomCtrl:function(){return b.conf.zoomControls?(b.dash.select("#control-dash-wrapper").append("div").attr("id","zoom-controls").attr("class","col-md-offset-12").html(" "),b.dash.select("#zoom-in").on("click",function(){return b.interactions.clickZoom("in")}),b.dash.select("#zoom-out").on("click",function(){return b.interactions.clickZoom("out")}),b.dash.select("#zoom-reset").on("click",function(){return b.interactions.clickZoom("reset")})):void 0},filters:function(){return b.conf.nodeFilters||b.conf.edgeFilters?(b.dash.select("#control-dash").append("div").attr("id","filters"),b.filters.init()):void 0},stats:function(){var a;return b.conf.nodeStats||b.conf.edgeStats?(a='\n',b.dash.select("#control-dash").append("div").attr("id","stats").html(a).select("#stats-header").on("click",function(){return b.dash.select("#all-stats").classed("in")?b.dash.select("#stats-header>span").attr("class","fa fa-2x fa-caret-right"):b.dash.select("#stats-header>span").attr("class","fa fa-2x fa-caret-down")}),b.stats.init()):void 0},exports:function(){var a;return b.conf.exportSVG?(a='\n',b.dash.select("#control-dash").append("div").attr("id","exports").attr("style","padding: 0.5em 1em; border-bottom: thin dashed #E89619; color: white;").html(a).select("#exports-header"),b.exports.init()):void 0},clustering:function(){var a;return b.conf.clusterControl?(a='\n \n
',b.dash.select("#control-dash").append("div").attr("id","clustering").html(a).select("#cluster_control_header"),b.clusterControls.init()):void 0},dashIsShown:function(){var a;return a=b.conf,a.showEditor||a.captionToggle||a.toggleRootNodes||a.removeElement||a.clusterControl||a.nodeStats||a.edgeStats||a.edgeFilters||a.nodeFilters||a.edgesToggle||a.nodesToggle||a.search||a.exportSVG}}},a.prototype.filters=function(){return function(a){var b;return b=a,{init:function(){var a,c,d,e,f,g,h,i,j,k,l,m;if(b.filters.show(),b.conf.edgeFilters&&b.filters.showEdgeFilters(),b.conf.nodeFilters&&b.filters.showNodeFilters(),b.conf.nodeTypes){for(e=Object.keys(b.conf.nodeTypes),g="",m=b.conf.nodeTypes[e],i=0,k=m.length;k>i;i++)f=m[i],a=f.replace("_"," "),g+=""+a+"";b.dash.select("#node-dropdown").html(g)}if(b.conf.edgeTypes){for(h=_.isPlainObject(b.conf.edgeTypes)?_.values(b.conf.edgeTypes)[0]:b.conf.edgeTypes,d="",j=0,l=h.length;l>j;j++)c=h[j],a=c.replace("_"," "),d+=""+a+"";b.dash.select("#rel-dropdown").html(d)}return b.conf.captionsToggle&&b.filters.captionsToggle(),b.conf.edgesToggle&&b.filters.edgesToggle(),b.conf.nodesToggle&&b.filters.nodesToggle(),b.filters.update()},show:function(){var a;return a='\n ',b.dash.select("#control-dash #filters").html(a),b.dash.selectAll("#filter-header").on("click",function(){return b.dash.select("#filters>form").classed("in")?b.dash.select("#filter-header>span").attr("class","fa fa-2x fa-caret-right"):b.dash.select("#filter-header>span").attr("class","fa fa-2x fa-caret-down")}),b.dash.select("#filters form")},showEdgeFilters:function(){var a;return a='\n',b.dash.select("#filters form").append("div").attr("id","filter-relationships").html(a),b.dash.select("#filter-rel-header").on("click",function(){return b.dash.select("#rel-dropdown").classed("in")?b.dash.select("#filter-rel-header>span").attr("class","fa fa-lg fa-caret-right"):b.dash.select("#filter-rel-header>span").attr("class","fa fa-lg fa-caret-down")})},showNodeFilters:function(){var a;return a='\n',b.dash.select("#filters form").append("div").attr("id","filter-nodes").html(a),b.dash.select("#filter-node-header").on("click",function(){return b.dash.select("#node-dropdown").classed("in")?b.dash.select("#filter-node-header>span").attr("class","fa fa-lg fa-caret-right"):b.dash.select("#filter-node-header>span").attr("class","fa fa-lg fa-caret-down")})},captionsToggle:function(){return b.dash.select("#filters form").append("li").attr({id:"toggle-captions","class":"list-group-item active-label toggle"}).html("Show Captions").on("click",function(){var a;return a=b.dash.select("g text").attr("style"),"display: block"===a?b.dash.selectAll("g text").attr("style","display: none"):b.dash.selectAll("g text").attr("style","display: block")})},edgesToggle:function(){return b.dash.select("#filters form").append("li").attr({id:"toggle-edges","class":"list-group-item active-label toggle"}).html("Toggle Edges").on("click",function(){return _.contains(_.pluck(_.flatten(_.values(b._edges)),"_state"),"active")?_.each(_.values(b._edges),function(a){return _.each(a,function(a){return"active"===a._state?a.toggleHidden():void 0})}):_.each(_.values(b._edges),function(a){return _.each(a,function(a){var c,d;return c=b._nodes[a._properties.source],d=b._nodes[a._properties.target],"active"===c._state&&"active"===d._state?a.toggleHidden():void 0})})})},nodesToggle:function(){return b.dash.select("#filters form").append("li").attr({id:"toggle-nodes","class":"list-group-item active-label toggle"}).html("Toggle Nodes").on("click",function(){var a;return a=_.values(b._nodes),_.contains(_.pluck(a,"_state"),"active")?_.each(a,function(a){return b.conf.toggleRootNodes&&a._d3.root?void 0:"active"===a._state?a.toggleHidden():void 0}):_.each(_.values(b._nodes),function(a){return b.conf.toggleRootNodes&&a._d3.root?void 0:a.toggleHidden()})})},update:function(){return b.dash.selectAll(".nodeType, .edgeType").on("click",function(){var a,c;return a=d3.select(this),c=a.attr("name"),b.vis.selectAll("."+c).each(function(a){var c,d,e,f;return null!=b._nodes[a.id]?(d=b._nodes[a.id],d.toggleHidden()):(c=b._edges[a.id][0],e=b._nodes[c._properties.source],f=b._nodes[c._properties.target],"active"===e._state&&"active"===f._state?c.toggleHidden():void 0)}),b.stats.nodeStats()})}}}}(this),a.prototype.Index=function(a){var b,c,d,e;return b=a,d={nodes:{val:function(){return _.values(b._nodes)}()},edges:{val:function(){return _.values(b._edges)}()}},e=d.nodes,c=d.edges,d.edges.flat=function(){return _.flatten(c.val)}(),d.nodes.d3=function(){return _.map(e.val,function(a){return a._d3})}(),d.edges.d3=function(){return _.map(c.flat,function(a){return a._d3})}(),b.elements=d,function(){return b.elements.nodes.svg=function(){return b.vis.selectAll("g.node")}(),b.elements.edges.svg=function(){return b.vis.selectAll("g.edge")}()}},a.prototype.interactions=function(b){var c;return c=b,{edgeClick:function(a){var b;if(!d3.event.defaultPrevented)return d3.event.stopPropagation(),b=a.self,"function"==typeof c.conf.edgeClick&&c.conf.edgeClick(b),"hidden"!==b._state?(b._state=function(){return"selected"===b._state?"active":"selected"}(),b.setStyles()):void 0},edgeMouseOver:function(a){var b;return b=a.self,"hidden"!==b._state?("selected"!==b._state&&(b._state="highlighted"),b.setStyles()):void 0},edgeMouseOut:function(a){var b;return b=a.self,"hidden"!==b._state?("selected"!==b._state&&(b._state="active"),b.setStyles()):void 0},nodeMouseOver:function(a){var b;if(b=a.self,"hidden"!==b._state){if("selected"!==b._state&&(b._state="highlighted",b.setStyles()),"function"==typeof c.conf.nodeMouseOver)return c.conf.nodeMouseOver(b);if("number"==typeof c.conf.nodeMouseOver)return b.properties[c.conf.nodeMouseOver]}},nodeMouseOut:function(a){var b;return b=a.self,c=b.a,"hidden"!==b._state&&("selected"!==b._state&&(b._state="active",b.setStyles()),null!=c.conf.nodeMouseOut&&"function"==typeof c.conf.nodeMouseOut)?c.conf.nodeMouseOut(a):void 0},nodeClick:function(a){var b;if(!d3.event.defaultPrevented)return d3.event.stopPropagation(),b=a.self,"function"==typeof c.conf.nodeClick&&c.conf.nodeClick(b),"hidden"!==b._state?(b._state=function(){return"selected"===b._state?"active":"selected"}(),b.setStyles()):void 0},zoom:function(b){return null==this._zoomBehavior&&(this._zoomBehavior=d3.behavior.zoom()),this._zoomBehavior.scaleExtent(b).on("zoom",function(){return c=a.prototype.getInst(this),c.vis.attr("transform","translate("+d3.event.translate+") scale("+d3.event.scale+")")})},clickZoom:function(a){var b,d,e,f;return f=c.vis.attr("transform").match(/(-*\d+\.*\d*)/g).map(function(a){return parseFloat(a)}),d=f[0],e=f[1],b=f[2],c.vis.attr("transform",function(){return"in"===a?(bc.conf.scaleExtent[0]&&(b-=.2),"translate("+d+","+e+") scale("+b+")"):"reset"===a?"translate(0,0) scale(1)":console.log("error")}),null==this._zoomBehavior&&(this._zoomBehavior=d3.behavior.zoom()),this._zoomBehavior.scale(b).translate([d,e])},nodeDragStarted:function(a){return d3.event.preventDefault,d3.event.sourceEvent.stopPropagation(),d3.select(this).classed("dragging",!0),a.fixed=!0},nodeDragged:function(a){var b,d;return c=a.self.a,a.x+=d3.event.dx,a.y+=d3.event.dy,a.px+=d3.event.dx,a.py+=d3.event.dy,d=d3.select(this),d.attr("transform","translate("+a.x+", "+a.y+")"),b=a.self._adjacentEdges,_.each(b,function(a){var b;return b=c.vis.select("#edge-"+a.id+"-"+a._index),c._drawEdges.updateEdge(b.data()[0])})},nodeDragended:function(a){return c=a.self.a,d3.select(this).classed({dragging:!1}),c.conf.forceLocked?void 0:c.force.start()},nodeDoubleClick:function(){return null},deselectAll:function(){var b;return c=a.prototype.getInst(this),(null!=(b=d3.event)?b.defaultPrevented:0)?void 0:(c.conf.showEditor===!0&&c.modifyElements.nodeEditorClear(),_.each(c._nodes,function(a){return a._state="active",a.setStyles()}),_.each(c._edges,function(a){return _.each(a,function(a){return a._state="active",a.setStyles()})}),c.conf.deselectAll?c.conf.deselectAll():void 0)}}},j=function(){function a(a){this.tick=n(this.tick,this),this.linkStrength=n(this.linkStrength,this),this.gravity=n(this.gravity,this);var b,c,d;this.a=b=a,c=this.a.conf,d=this.a._nodes,this.k=Math.sqrt(Math.log(_.size(this.a._nodes))/(c.graphWidth()*c.graphHeight())),this._clustering=new this.a.clustering(this.a),this.d3NodeInternals=b.elements.nodes.d3,c.cluster?(this._charge=function(){return this._clustering.layout.charge},this._linkStrength=function(a){return this._clustering.layout.linkStrength(a)}):(this._charge=function(){return-10/this.k},this._linkStrength=function(a){return d[a.source.id].getProperties("root")||d[a.target.id].getProperties("root")?1:.9}),c.cluster?this._linkDistancefn=function(a){return this._clustering.layout.linkDistancefn(a)}:"default"===c.linkDistancefn?this._linkDistancefn=function(){return 1/(50*this.k)}:"number"==typeof c.linkDistancefn?this._linkDistancefn=function(){return c.linkDistancefn}:"function"==typeof c.linkDistancefn&&(this._linkDistancefn=function(a){return c.linkDistancefn(a)})}return a.prototype.gravity=function(){return this.a.conf.cluster?this._clustering.layout.gravity(this.k):50*this.k},a.prototype.linkStrength=function(a){return this._linkStrength(a)},a.prototype.friction=function(){return.9},a.prototype.collide=function(a){var b,c,d,e,f,g;return b=this.a.conf,g=2*(a.radius+a["stroke-width"])+b.nodeOverlap,c=a.x-g,d=a.x+g,e=a.y-g,f=a.y+g,function(h,i,j,k,l){var m,n,o;return h.point&&h.point!==a&&(n=a.x-Math.abs(h.point.x),o=a.y-h.point.y,m=Math.sqrt(n*n+o*o),g=g,g>m&&(m=(m-g)/m*b.alpha,a.x-=n*=m,a.y-=o*=m,h.point.x+=n,h.point.y+=o)),i>d||c>k||j>f||e>l}},a.prototype.tick=function(){var a,b,c,d,e,f,g,h;if(a=this.a,d=a.elements.nodes.svg,b=a.elements.edges.svg,a.conf.collisionDetection)for(e=d3.geom.quadtree(this.d3NodeInternals),h=this.d3NodeInternals,f=0,g=h.length;g>f;f++)c=h[f],e.visit(this.collide(c));return d.attr("transform",function(a){return"translate("+a.x+","+a.y+")"}),this.drawEdge=a.drawing.DrawEdge,this.drawEdge.styleText(b),this.drawEdge.styleLink(b)},a.prototype.positionRootNodes=function(){var a,b,c,d,e,f,g,h,i,j;if(a=this.a.conf,b={width:a.graphWidth(),height:a.graphHeight()},e=_.filter(this.a.elements.nodes.val,function(a){return a.getProperties("root")}),1!==e.length){for(j=[],c=f=0,g=e.length;g>f;c=++f)d=e[c],d._d3.x=b.width/Math.sqrt(e.length*(c+1)),d._d3.y=b.height/2,j.push(d._d3.fixed=!0);return j}d=e[0],h=[b.width/2,b.width/2],d._d3.x=h[0],d._d3.px=h[1],i=[b.height/2,b.height/2],d._d3.y=i[0],d._d3.py=i[1],d._d3.fixed=!0},a.prototype.chargeDistance=function(){return 500},a.prototype.linkDistancefn=function(a){return this._linkDistancefn(a)},a.prototype.charge=function(){return this._charge()},a}(),a.prototype.generateLayout=function(a){var b;return b=a,function(a){var c;return null==a&&(a=!1),c=b.conf,b.layout=new j(b),b.force=d3.layout.force().size([c.graphWidth(),c.graphHeight()]).theta(1).gravity(b.layout.gravity()).friction(b.layout.friction()).nodes(b.elements.nodes.d3).links(b.elements.edges.d3).linkDistance(function(a){return b.layout.linkDistancefn(a)}).linkStrength(function(a){return b.layout.linkStrength(a)}).charge(b.layout.charge()).chargeDistance(b.layout.chargeDistance())}},a.prototype.search=function(a){var b;return b=a,{init:function(){var a;return a=b.dash.select("#search input"),a.on("keyup",function(){var c;return c=a[0][0].value.toLowerCase(),b.vis.selectAll(".node").classed("inactive",!1),b.vis.selectAll("text").attr("style",function(){return""!==c?"display: inline;":void 0}),b.vis.selectAll(".node").classed("inactive",function(a){var d,e;switch(d=d3.select(this).text(),b.conf.searchMethod){case"contains":e=d.toLowerCase().indexOf(c)<0;break;case"begins":e=0!==d.toLowerCase().indexOf(c)}return e?b.vis.selectAll("[source-target*='"+a.id+"']").classed("inactive",e):b.vis.selectAll("[source-target*='"+a.id+"']").classed("inactive",function(a){var c,d,e;return c=[a.source.id,a.target.id],d=b.vis.select("#node-"+c[0]).classed("inactive"),e=b.vis.select("#node-"+c[1]).classed("inactive"),e||d}),e})})}}},a.prototype.startGraph=function(b){var c;return c=b,function(b){var d,e,f,g,h,i;if(d=c.conf,d3.select(d.divSelector).empty()&&console.warn(c.utils.warnings.divWarning()),b||(b={nodes:[],edges:[]},c.utils.warnings.dataWarning()),null==b.edges&&(b.edges=[]),c.create.nodes(b.nodes),b.edges.forEach(function(a){return c.create.edges(a)}),c.vis=d3.select(d.divSelector).attr("style","width:"+d.graphWidth()+"px; height:"+d.graphHeight()+"px; background:"+d.backgroundColour+";").append("svg").attr("xmlns","http://www.w3.org/2000/svg").attr("xlink","http://www.w3.org/1999/xlink").attr("pointer-events","all").attr("style","background:"+d.backgroundColour+";").attr("alchInst",a.prototype.instances.length-1).on("click",c.interactions.deselectAll).call(c.interactions.zoom(d.scaleExtent)).on("dblclick.zoom",null).append("g").attr("transform","translate("+d.initialTranslate+") scale("+d.initialScale+")"),c.interactions.zoom().scale(d.initialScale),c.interactions.zoom().translate(d.initialTranslate),c.index=a.prototype.Index(c),c.generateLayout(),c.controlDash.init(),e=c.elements.edges.d3,f=c.elements.nodes.d3,c.layout.positionRootNodes(),c.force.start(),d.forceLocked)for(;c.force.alpha()>.005;)c.force.tick();return c._drawEdges=c.drawing.DrawEdges,c._drawNodes=c.drawing.DrawNodes,c._drawEdges.createEdge(e),c._drawNodes.createNode(f),c.index(),c.elements.nodes.svg.attr("transform",function(a){return"translate("+a.x+", "+a.y+")"}),console.log(Date()+" completed initial computation"),d.forceLocked||c.force.on("tick",c.layout.tick).start(),null!=d.afterLoad&&("function"==typeof d.afterLoad?d.afterLoad():"string"==typeof d.afterLoad&&(c[d.afterLoad]=!0)),d.cluster&&(g=d3.select(""+c.conf.divSelector+" svg").append("svg:defs")),d.nodeStats&&c.stats.nodeStats(),d.showEditor&&(h=new c.editor.Editor,i=new c.editor.Interactions,d3.select("body").on("keydown",i.deleteSelected),h.startEditor()),c.initial=!0}},a.prototype.stats=function(a){var b;return b=a,{init:function(){return b.stats.update()},nodeStats:function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o;if(f=[],c=b.get.allNodes().length,a=b.get.activeNodes().length,e=c-a,j="Number of nodes: "+c+" Number of active nodes: "+a+" Number of inactive nodes: "+e+"",b.conf.nodeTypes){for(h=Object.keys(b.conf.nodeTypes),l="",o=b.conf.nodeTypes[h],m=0,n=o.length;n>m;m++)k=o[m],d=k.replace("_"," "),i=b.vis.selectAll("g.node."+k)[0].length,l+="Number of "+d+" nodes: "+i+"",f.push([""+k,i]);j+=l}return g="",j+=g,b.dash.select("#node-stats").html(j),this.insertSVG("node",f)},edgeStats:function(){var a,c,d,e,f,g,h,i,j,k,l,m,n;if(e=[],c=b.get.allEdges().length,a=b.get.activeEdges().length,l=c-a,i="Number of relationships: "+c+" Number of active relationships: "+a+" Number of inactive relationships: "+l+"",b.conf.edgeTypes){for(g=_.values(alchemy.conf.edgeTypes)[0],k="",m=0,n=g.length;n>m;m++)j=g[m],j&&(d=j.replace("_"," "),h=_.filter(b.get.allEdges(),function(a){return a._edgeType===j?a:void 0}).length,k+="Number of "+d+" relationships: "+h+"",e.push([""+d,h]));i+=k}return f="",i+=f,b.dash.select("#rel-stats").html(i),this.insertSVG("edge",e)},insertSVG:function(a,c){var d,e,f,g,h,i,j,k;return null===c?b.dash.select("#"+a+"-stats-graph").html("
There are no "+a+"Types listed in your conf.
"):(k=.25*b.conf.graphWidth(),g=250,i=k/4,f=d3.scale.category20(),d=d3.svg.arc().outerRadius(i-10).innerRadius(i/2),h=d3.layout.pie().sort(null).value(function(a){return a[1]}),j=b.dash.select("#"+a+"-stats-graph").append("svg").append("g").style({width:k,height:g}).attr("transform","translate("+k/2+","+g/2+")"),e=j.selectAll(".arc").data(h(c)).enter().append("g").classed("arc",!0).on("mouseover",function(a,d){return b.dash.select("#"+c[d][0]+"-stat").classed("hidden",!1)}).on("mouseout",function(a,d){return b.dash.select("#"+c[d][0]+"-stat").classed("hidden",!0)}),e.append("path").attr("d",d).attr("stroke",function(a,b){return f(b)}).attr("stroke-width",2).attr("fill-opacity","0.3"),e.append("text").attr("transform",function(a){return"translate("+d.centroid(a)+")"}).attr("id",function(a,b){return""+c[b][0]+"-stat"}).attr("dy",".35em").classed("hidden",!0).text(function(a,b){return c[b][0]}))},update:function(){return b.conf.nodeStats&&this.nodeStats(),b.conf.edgeStats?this.edgeStats():void 0}}},a.prototype.updateGraph=function(a){var b;return b=a,function(){for(b.generateLayout(),b._drawEdges.createEdge(b.elements.edges.d3),b._drawNodes.createNode(b.elements.nodes.d3),b.layout.positionRootNodes(),b.force.start();b.force.alpha()>.005;)b.force.tick();
+return b.force.on("tick",b.layout.tick).start(),b.elements.nodes.svg.attr("transform",function(a){return"translate("+a.x+", "+a.y+")"})}},a.prototype.defaults={plugins:null,renderer:"svg",graphWidth:function(){return d3.select(this.divSelector).node().parentElement.clientWidth},graphHeight:function(){return"BODY"===d3.select(this.divSelector).node().parentElement.nodeName?window.innerHeight:d3.select(this.divSelector).node().parentElement.clientHeight},alpha:.5,collisionDetection:!0,nodeOverlap:25,fixNodes:!1,fixRootNodes:!1,forceLocked:!0,linkDistancefn:"default",nodePositions:null,showEditor:!1,captionToggle:!1,toggleRootNodes:!1,removeElement:!1,cluster:!1,clusterKey:"cluster",clusterColours:d3.shuffle(["#DD79FF","#FFFC00","#00FF30","#5168FF","#00C0FF","#FF004B","#00CDCD","#f83f00","#f800df","#ff8d8f","#ffcd00","#184fff","#ff7e00"]),clusterControl:!1,nodeStats:!1,edgeStats:!1,edgeFilters:!1,nodeFilters:!1,edgesToggle:!1,nodesToggle:!1,zoomControls:!1,nodeCaption:"caption",nodeCaptionsOnByDefault:!1,nodeStyle:{all:{radius:10,color:"#68B9FE",borderColor:"#127DC1",borderWidth:function(a,b){return b/3},captionColor:"#FFFFFF",captionBackground:null,captionSize:12,selected:{color:"#FFFFFF",borderColor:"#349FE3"},highlighted:{color:"#EEEEFF"},hidden:{color:"none",borderColor:"none"}}},nodeColour:null,nodeMouseOver:"caption",nodeRadius:10,nodeTypes:null,rootNodes:"root",rootNodeRadius:15,nodeClick:null,edgeCaption:"caption",edgeCaptionsOnByDefault:!1,edgeStyle:{all:{width:4,color:"#CCC",opacity:.2,directed:!0,curved:!0,selected:{opacity:1},highlighted:{opacity:1},hidden:{opacity:0}}},edgeTypes:null,curvedEdges:!1,edgeWidth:function(){return 4},edgeOverlayWidth:20,directedEdges:!1,edgeArrowSize:5,edgeClick:null,search:!1,searchMethod:"contains",backgroundColour:"#000000",theme:null,afterLoad:"afterLoad",divSelector:"#alchemy",dataSource:null,initialScale:1,initialTranslate:[0,0],scaleExtent:[.5,2.4],exportSVG:!1,dataWarning:"default",warningMessage:"There be no data! What's going on?"},c=function(a){return{a:a,createLink:function(a){var b;return b=this.a.conf,a.append("path").attr("class","edge-line").attr("id",function(a){return"path-"+a.id}),a.filter(function(a){return null!=a.caption}).append("text"),a.append("path").attr("class","edge-handler").style("stroke-width",""+b.edgeOverlayWidth).style("opacity","0")},styleLink:function(a){var b,c,d;return b=this.a,c=this.a.conf,d=this.a.drawing.EdgeUtils,a.each(function(a){var b,e,f,g,h,i,j,k,l;return f=d.edgeWalk(a),e=c.curvedEdges?30:0,b=e/10,k=a.source.radius+a["stroke-width"]/2,l=e/10,j=f.edgeLength/2,g=f.edgeLength-(a.target.radius-a.target["stroke-width"]/2),h=e/10,i=d3.select(this),i.style(d.edgeStyle(a)),i.attr("transform","translate("+a.source.x+", "+a.source.y+") rotate("+f.edgeAngle+")"),i.select(".edge-line").attr("d",function(){var d,f,i;return f="M"+k+","+l+"q"+j+","+e+" "+g+","+h,c.directedEdges?(i=2*a["stroke-width"],d="l"+-i+","+(i+b)+" l"+i+","+(-i-b)+" l"+-i+","+(-i+b),f+d):f}()),i.select(".edge-handler").attr("d",function(){return i.select(".edge-line").attr("d")})})},classEdge:function(a){return a.classed("active",!0)},styleText:function(a){var b,c,d;return b=this.a.conf,c=b.curvedEdges,d=this.a.drawing.EdgeUtils,a.select("text").each(function(a){var c,e;return e=d.edgeWalk(a),c=e.edgeLength/2,d3.select(this).attr("dx",""+c).text(a.caption).attr("xlink:xlink:href","#path-"+a.source.id+"-"+a.target.id).style("display",function(){return b.edgeCaptionsOnByDefault?"block":void 0})})},setInteractions:function(a){var b;return b=this.a.interactions,a.select(".edge-handler").on("click",b.edgeClick).on("mouseover",function(a){return b.edgeMouseOver(a)}).on("mouseout",function(a){return b.edgeMouseOut(a)})}}},d=function(a){return{a:a,createEdge:function(a){var b,c;return b=this.a.drawing.DrawEdge,c=this.a.vis.selectAll("g.edge").data(a),c.enter().append("g").attr("id",function(a){return"edge-"+a.id+"-"+a.pos}).attr("class",function(a){return"edge "+a.edgeType}).attr("source-target",function(a){return""+a.source.id+"-"+a.target.id}),b.createLink(c),b.classEdge(c),b.styleLink(c),b.styleText(c),b.setInteractions(c),c.exit().remove(),this.a.conf.directedEdges&&this.a.conf.curvedEdges?c.select(".edge-line").attr("marker-end","url(#arrow)"):void 0},updateEdge:function(a){var b,c;return b=this.a.drawing.DrawEdge,c=this.a.vis.select("#edge-"+a.id+"-"+a.pos),b.classEdge(c),b.styleLink(c),b.styleText(c),b.setInteractions(c)}}},e=function(a){return{a:a,styleText:function(a){var b,c,d;return b=this.a.conf,d=this.a.drawing.NodeUtils,c=this.a._nodes,a.selectAll("text").attr("dy",function(a){return c[a.id].getProperties().root?b.rootNodeRadius/2:2*b.nodeRadius-5}).attr("visibility",function(a){return"hidden"===c[a.id]._state?"hidden":"visible"}).text(function(a){return d.nodeText(a)}).style("display",function(){return b.nodeCaptionsOnByDefault?"block":void 0})},createNode:function(a){return a=_.difference(a,a.select("circle").data()),a.__proto__=d3.select().__proto__,a.append("circle").attr("id",function(a){return"circle-"+a.id}),a.append("svg:text").attr("id",function(a){return"text-"+a.id})},styleNode:function(a){var b;return b=this.a.drawing.NodeUtils,a.selectAll("circle").attr("r",function(a){return"function"==typeof a.radius?a.radius():a.radius}).each(function(a){return d3.select(this).style(b.nodeStyle(a))})},setInteractions:function(a){var b,c,d,e,f,g,h;return b=this.a.conf,c=this.a.interactions,e="editor"===this.a.get.state("interactions"),d=d3.behavior.drag().origin(Object).on("dragstart",null).on("drag",null).on("dragend",null),e?(f=new this.a.editor.Interactions,a.on("mouseup",function(a){return f.nodeMouseUp(a)}).on("mouseover",function(a){return f.nodeMouseOver(a)}).on("mouseout",function(a){return f.nodeMouseOut(a)}).on("dblclick",function(a){return c.nodeDoubleClick(a)}).on("click",function(a){return f.nodeClick(a)})):(a.on("mouseup",null).on("mouseover",function(a){return c.nodeMouseOver(a)}).on("mouseout",function(a){return c.nodeMouseOut(a)}).on("dblclick",function(a){return c.nodeDoubleClick(a)}).on("click",function(a){return c.nodeClick(a)}),d=d3.behavior.drag().origin(Object).on("dragstart",c.nodeDragStarted).on("drag",c.nodeDragged).on("dragend",c.nodeDragended),b.fixNodes||(g=a.filter(function(a){return a.root!==!0}),g.call(d)),b.fixRootNodes?void 0:(h=a.filter(function(a){return a.root===!0}),h.call(d)))}}},f=function(a){return{a:a,createNode:function(a){var b,c;return b=this.a.drawing.DrawNode,c=this.a.vis.selectAll("g.node").data(a,function(a){return a.id}),c.enter().append("g").attr("class",function(a){var b;return b=a.self._nodeType,"node "+b+" active"}).attr("id",function(a){return"node-"+a.id}).classed("root",function(a){return a.root}),b.createNode(c),b.styleNode(c),b.styleText(c),b.setInteractions(c),c.exit().remove()},updateNode:function(a){var b,c;return b=this.a.drawing.DrawNode,c=this.a.vis.select("#node-"+a.id),b.styleNode(c),b.styleText(c),b.setInteractions(c)}}},a.prototype.EdgeUtils=function(a){return{a:a,edgeStyle:function(a){var b,c,d,e,f;return c=this.a.conf,d=this.a._edges[a.id][a.pos],f=this.a.svgStyles.edge.update(d),e=this.a._nodes,this.a.conf.cluster&&(b=this.a.layout._clustering,f.stroke=function(a){var d,f,g,h,i,j;return d=c.clusterKey,i=e[a.source.id]._properties,j=e[a.target.id]._properties,i.root||j.root?(h=i.root?j[d]:i[d],""+b.getClusterColour(h)):i[d]===j[d]?(h=i[d],""+b.getClusterColour(h)):i[d]!==j[d]?(g=""+i[d]+"-"+j[d],f="cluster-gradient-"+g,"url(#"+f+")"):void 0}(a)),f},triangle:function(a){var b,c,d;return d=a.target.x-a.source.x,b=a.target.y-a.source.y,c=Math.sqrt(b*b+d*d),[d,b,c]},edgeWalk:function(a){var b,c,d,e,f,g,h,i;return i=this.triangle(a),h=i[0],e=i[1],f=i[2],d=a["stroke-width"],b=2,g=a.source.radius+a.source["stroke-width"]-d/2+b,c=f-g-1.5*b,{edgeAngle:Math.atan2(e,h)/Math.PI*180,edgeLength:c}},middleLine:function(a){return this.curvedDirectedEdgeWalk(a,"middle")},startLine:function(a){return this.curvedDirectedEdgeWalk(a,"linkStart")},endLine:function(a){return this.curvedDirectedEdgeWalk(a,"linkEnd")},edgeLength:function(a){var b,c,d;return d=a.target.x-a.source.x,b=a.target.y-a.source.y,c=Math.sqrt(b*b+d*d)},edgeAngle:function(a){var b,c;return c=a.target.x-a.source.x,b=a.target.y-a.source.y,Math.atan2(b,c)/Math.PI*180},captionAngle:function(a){return-90>a||a>90?180:0},middlePath:function(a){var b,c;return c=this.a.vis.select("#path-"+a.id).node(),b=c.getPointAtLength(c.getTotalLength()/2),{x:b.x,y:b.y}},middlePathCurve:function(a){var b,c;return c=d3.select("#path-"+a.id).node(),b=c.getPointAtLength(c.getTotalLength()/2),{x:b.x,y:b.y}}}},a.prototype.NodeUtils=function(a){var b;return b=a,{nodeStyle:function(a){var c,d;return c=b.conf,d=a.self,c.cluster&&"hidden"!==d._state&&(a.fill=function(){var a,e,f,g,h,i,j;return e=b.layout._clustering,j=d.getProperties(),a=e.clusterMap,i=c.clusterKey,h=c.clusterColours,g=a[j[i]]%h.length,f=h[g],""+f}(a),a.stroke=a.fill),a},nodeText:function(a){var c,d,e;return d=b.conf,e=b._nodes[a.id]._properties,d.nodeCaption&&"string"==typeof d.nodeCaption?null!=e[d.nodeCaption]?e[d.nodeCaption]:"":d.nodeCaption&&"function"==typeof d.nodeCaption?(c=d.nodeCaption(e),(void 0===c||"undefined"===String(c))&&(b.log.caption="At least one caption returned undefined",d.caption=!1),c):void 0}}},a.prototype.svgStyles=function(a){return{a:a,node:{a:this.a,populate:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;return b=this.a.conf,d=_.omit(b.nodeStyle.all,"selected","highlighted","hidden"),c=a,m=function(a){return"function"==typeof a?a:function(){return a}},g=_.keys(b.nodeTypes)[0],f=a.getProperties()[g],void 0===b.nodeStyle[f]&&(f="all"),n=_.assign(_.cloneDeep(d),b.nodeStyle[f]),k=_.assign(n,b.nodeStyle[f][a._state]),h=m(k.radius),e=m(k.color),i=m(k.borderColor),j=m(k.borderWidth),l={},l.radius=h(c),l.fill=e(c),l.stroke=i(c),l["stroke-width"]=j(c,h(c)),l}},edge:{a:this.a,populate:function(a){var b,c,d,e,f,g,h,i,j,k;return c=this.a.conf,d=_.omit(c.edgeStyle.all,"selected","highlighted","hidden"),i=function(a){return"function"==typeof a?a:function(){return a}},e=a._edgeType,void 0===c.edgeStyle[e]&&(e="all"),j=_.assign(_.cloneDeep(d),c.edgeStyle[e]),g=_.assign(j,c.edgeStyle[e][a._state]),k=i(g.width),b=i(g.color),f=i(g.opacity),h={stroke:b(a),"stroke-width":k(a),opacity:f(a),fill:"none"}},update:function(a){var b,c,d,e,f,g,h;return c=this.a.conf,e=a._style,g=function(a){return"function"==typeof a?a:function(){return a}},h=g(e.width),b=g(e.color),d=g(e.opacity),f={stroke:b(a),"stroke-width":h(a),opacity:d(a),fill:"none"}}}}},g=function(){function a(){this.nodeEditor=n(this.nodeEditor,this),this.startEditor=n(this.startEditor,this),this.utils=new alchemy.editor.Utils}return a.prototype.editorContainerHTML='\n\n
\n - Remove Selected
\n - Editor mode enabled, click to disable editor interactions
\n
\n
',a.prototype.elementEditorHTML=function(a){return""+a+' Editor
\n\n'},a.prototype.startEditor=function(){var a,b,c,d,e;return a=alchemy.conf.divSelector,d=this.editorContainerHTML,b=alchemy.dash.select("#control-dash").append("div").attr("id","editor").html(d),b.select("#editor-header").on("click",function(){return alchemy.dash.select("#element-options").classed("in")?alchemy.dash.select("#editor-header>span").attr("class","fa fa-2x fa-caret-right"):alchemy.dash.select("#editor-header>span").attr("class","fa fa-2x fa-caret-down")}),c=b.select("#element-options ul #editor-interactions").on("click",function(){return d3.select(this).attr("class",function(){return"editor"===alchemy.get.state()?(alchemy.set.state("interactions","default"),"inactive list-group-item"):(alchemy.set.state("interactions","editor"),"active list-group-item")}).html(function(){return"editor"===alchemy.get.state()?"Disable Editor Interactions":"Enable Editor Interactions"})}),b.select("#element-options ul #remove").on("click",function(){return alchemy.editor.remove()}),e=this.utils,c.on("click",function(){return alchemy.dash.select("#editor-interactions").classed("active")?(e.disableEditor(),alchemy.dash.select("#editor-interactions").classed({active:!1,inactive:!0}).html("Editor mode disabled, click to enable editor interactions")):(e.enableEditor(),alchemy.dash.select("#editor-interactions").classed({active:!0,inactive:!1}).html("Editor mode enabled, click to disable editor interactions"))})},a.prototype.nodeEditor=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;c=alchemy.conf.divSelector,d=alchemy.dash.select("#control-dash #editor"),i=d.select("#element-options"),f=this.elementEditorHTML("Node"),e=i.append("div").attr("id","node-editor").html(f),e.attr("class",function(){var a;return a=alchemy.dash.select("#editor-interactions").classed("active"),a?"enabled":"hidden"}),b=d.select("#node-editor form #add-property"),b.select("#node-add-prop-key").attr("placeholder","New Property Name").attr("value",null),b.select("#node-add-prop-value").attr("placeholder","New Property Value").attr("value",null),alchemy.dash.select("#add-property-form").on("submit",function(){var a,b;return event.preventDefault(),a=alchemy.dash.select("#add-prop-key").property("value"),a=a.replace(/\s/g,"_"),b=alchemy.dash.select("#add-prop-value").property("value"),l(a,b,!0),alchemy.dash.selectAll("#add-property .edited-property").classed({"edited-property":!1}),this.reset()}),g=alchemy._nodes[a.id].getProperties(),alchemy.vis.select("#node-"+a.id).classed({editing:!0}),k=d.select("#node-editor #properties-list");for(j in g)m=g[j],h=k.append("div").attr("id","node-"+j).attr("class","property form-inline form-group"),h.append("label").attr("for","node-"+j+"-input").attr("class","form-control property-name").text(""+j),h.append("input").attr("id","node-"+j+"-input").attr("class","form-control property-value").attr("value",""+m);return alchemy.dash.select("#properties-list").on("submit",function(){var a,b,c,d,e,f,g;for(event.preventDefault(),b=alchemy.dash.selectAll(".edited-property"),g=b[0],e=0,f=g.length;f>e;e++)j=g[e],c=alchemy.dash.select(j),a=c.select("label").text(),d=c.select("input").attr("value"),l(a,d,!1);return alchemy.dash.selectAll("#node-properties-list .edited-property").classed({"edited-property":!1}),this.reset()}),d3.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown",function(){return 13===d3.event.keyCode&&event.preventDefault(),d3.select(this).classed({"edited-property":!0})}),l=function(b,c,d){var e,f;return f=a.id,""!==b&&""!==c?(alchemy._nodes[f].setProperty(""+b,""+c),e=alchemy._drawNodes,e.updateNode(alchemy.viz.select("#node-"+f)),d===!0?(alchemy.dash.select("#node-add-prop-key").attr("value","property added/updated to key: "+b),alchemy.dash.select("#node-add-prop-value").attr("value","property at "+b+" updated to: "+c)):alchemy.dash.select("#node-"+b+"-input").attr("value","property at "+b+" updated to: "+c)):d===!0?(alchemy.dash.select("#node-add-prop-key").attr("value","null or invalid input"),alchemy.dash.select("#node-add-prop-value").attr("value","null or invlid input")):alchemy.dash.select("#node-"+b+"-input").attr("value","null or invalid input")}},a.prototype.editorClear=function(){return alchemy.dash.selectAll(".node").classed({editing:!1}),alchemy.dash.selectAll(".edge").classed({editing:!1}),alchemy.dash.select("#node-editor").remove(),alchemy.dash.select("#edge-editor").remove(),alchemy.dash.select("#node-add-prop-submit").attr("placeholder",function(){return alchemy.vis.selectAll(".selected").empty()?"select a node or edge to edit properties":"add a property to this element"})},a.prototype.edgeEditor=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;c=alchemy.conf.divSelector,f=alchemy.dash("#control-dash #editor"),i=f.select("#element-options"),h=this.elementEditorHTML("Edge"),g=i.append("div").attr("id","edge-editor").html(h),g.attr("class",function(){return alchemy.dash.select("#editor-interactions").classed("active")?"enabled":"hidden"}),b=f.select("#edge-editor form #add-property"),b.select("#add-prop-key").attr("placeholder","New Property Name").attr("value",null),b.select("#add-prop-value").attr("placeholder","New Property Value").attr("value",null),d=alchemy._edges[a.id].getProperties(),alchemy.vis.select("#edge-"+a.id).classed({editing:!0}),k=f.select("#edge-editor #properties-list");for(j in d)m=d[j],e=k.append("div").attr("id","edge-"+j).attr("class","property form-inline form-group"),e.append("label").attr("for","edge-"+j+"-input").attr("class","form-control property-name").text(""+j),e.append("input").attr("id","edge-"+j+"-input").attr("class","form-control property-value").attr("value",""+m);return alchemy.dash.selectAll("#add-prop-key, #add-prop-value, .property").on("keydown",function(){return 13===d3.event.keyCode&&event.preventDefault(),d3.select(this).classed({"edited-property":!0})}),alchemy.dash.select("#add-property-form").on("submit",function(){var a,b;return event.preventDefault(),a=alchemy.dash.select("#add-prop-key").property("value"),a=a.replace(/\s/g,"_"),b=alchemy.dash.select("#add-prop-value").property("value"),l(a,b,!0),alchemy.dash.selectAll("#add-property .edited-property").classed({"edited-property":!1}),this.reset()}),d3.select("#properties-list").on("submit",function(){var a,b,c,d,e,f,g;for(event.preventDefault(),b=alchemy.dash.selectAll(".edited-property"),g=b[0],e=0,f=g.length;f>e;e++)j=g[e],c=alchemy.dash.select(j),a=c.select("label").text(),d=c.select("input").property("value"),l(a,d,!1);return alchemy.dash.selectAll("#properties-list .edited-property").classed({"edited-property":!1}),this.reset()}),l=function(b,c,d){var e,f,g;return f=a.id,""!==b&&""!==c?(alchemy._edges[f].setProperty(""+b,""+c),g=alchemy.vis.select("#edge-"+f),e=new alchemy.drawing.DrawEdges,e.updateEdge(alchemy.vis.select("#edge-"+f)),d===!0?(alchemy.dash.select("#add-prop-key").attr("value","property added/updated to key: "+b),alchemy.dash.select("#add-prop-value").attr("value","property at "+b+" updated to: "+c)):alchemy.dash.select("#edge-"+b+"-input").attr("value","property at "+b+" updated to: "+c)):d===!0?(alchemy.dash.select("#add-prop-key").attr("value","null or invalid input"),alchemy.dash.select("#add-prop-value").attr("value","null or invlid input")):alchemy.dash.select("#edge-"+b+"-input").attr("value","null or invalid input")}},a}(),h=function(){function a(){this.reset=n(this.reset,this),this.deleteSelected=n(this.deleteSelected,this),this.addNodeDragended=n(this.addNodeDragended,this),this.addNodeDragging=n(this.addNodeDragging,this),this.addNodeStart=n(this.addNodeStart,this),this.edgeClick=n(this.edgeClick,this),this.nodeClick=n(this.nodeClick,this),this.nodeMouseUp=n(this.nodeMouseUp,this),this.editor=new alchemy.editor.Editor}return a.prototype.nodeMouseOver=function(){var a;return d3.select(this).select("circle").empty()||(a=d3.select(this).select("circle").attr("r"),d3.select(this).select("circle").attr("r",3*a)),this},a.prototype.nodeMouseUp=function(a){return this.sourceNode!==a?(this.mouseUpNode=!0,this.targetNode=a,this.click=!1):this.click=!0,this},a.prototype.nodeMouseOut=function(){var a;return d3.select(this).select("circle").empty()||(a=d3.select(this).select("circle").attr("r"),d3.select(this).select("circle").attr("r",a/3)),this},a.prototype.nodeClick=function(a){var b;return d3.event.stopPropagation(),alchemy.vis.select("#node-"+a.id).empty()||(b=alchemy.vis.select("#node-"+a.id).classed("selected"),alchemy.vis.select("#node-"+a.id).classed("selected",!b)),this.editor.editorClear(),this.editor.nodeEditor(a)},a.prototype.edgeClick=function(a){return d3.event.stopPropagation(),this.editor.editorClear(),this.editor.edgeEditor(a)},a.prototype.addNodeStart=function(a){return d3.event.sourceEvent.stopPropagation(),this.sourceNode=a,alchemy.vis.select("#dragline").classed({hidden:!1}),this},a.prototype.addNodeDragging=function(){var a,b;return a=d3.event.x,b=d3.event.y,alchemy.vis.select("#dragline").attr("x1",this.sourceNode.x).attr("y1",this.sourceNode.y).attr("x2",a).attr("y2",b).attr("style","stroke: #FFF"),this},a.prototype.addNodeDragended=function(){var a,b,c;return this.click||(this.mouseUpNode||(a=alchemy.vis.select("#dragline"),b=a.attr("x2"),c=a.attr("y2"),this.targetNode={id:""+_.uniqueId("addedNode_"),x:parseFloat(b),y:parseFloat(c),caption:"node added"}),this.newEdge={id:""+this.sourceNode.id+"-"+this.targetNode.id,source:this.sourceNode.id,target:this.targetNode.id,caption:"edited"},alchemy.editor.update(this.targetNode,this.newEdge)),this.reset(),this},a.prototype.deleteSelected=function(){switch(d3.event.keyCode){case 8:case 46:if("INPUT"!==d3.select(d3.event.target).node().tagName)return d3.event.preventDefault(),alchemy.editor.remove()}},a.prototype.reset=function(){return this.mouseUpNode=null,this.sourceNode=null,this.targetNode=null,this.newEdge=null,this.click=null,alchemy.vis.select("#dragline").classed({hidden:!0}).attr("x1",0).attr("y1",0).attr("x2",0).attr("y2",0),this},a}(),i=function(){function a(){this.enableEditor=n(this.enableEditor,this),this.drawNodes=alchemy._drawNodes,this.drawEdges=alchemy._drawEdges}return a.prototype.enableEditor=function(){var a,b,c;return alchemy.set.state("interactions","editor"),a=alchemy.vis.append("line").attr("id","dragline"),this.drawNodes.updateNode(alchemy.node),this.drawEdges.updateEdge(alchemy.edge),c=alchemy.vis.selectAll(".selected"),b=new alchemy.editor.Editor,c.empty()||1!==c.length?c.classed({selected:!1}):c.classed("node")?(b.nodeEditor(c.datum()),alchemy.dash.select("#node-editor").attr("class","enabled").style("opacity",1)):c.classed("edge")?(b.edgeEditor(c.datum()),alchemy.dash.select("#edge-editor").attr("class","enabled").style("opacity",1)):void 0},a.prototype.disableEditor=function(){return alchemy.setState("interactions","default"),alchemy.vis.select("#dragline").remove(),alchemy.dash.select("#node-editor").transition().duration(300).style("opacity",0),alchemy.dash.select("#node-editor").transition().delay(300).attr("class","hidden"),this.drawNodes.updateNode(alchemy.node),alchemy.vis.selectAll(".node").classed({selected:!1})},a.prototype.remove=function(){var a,b,c,d,e,f,g,h,i,j,k,l;for(e=alchemy.vis.selectAll(".selected.node"),j=e[0],l=[],f=0,h=j.length;h>f;f++)if(b=j[f],c=alchemy.vis.select(b).data()[0].id,d=alchemy._nodes[c],null!=d){for(k=d.adjacentEdges,g=0,i=k.length;i>g;g++)a=k[g],alchemy._edges=_.omit(alchemy._edges,""+a.id+"-"+a._index),alchemy.edge=alchemy.edge.data(_.map(alchemy._edges,function(a){return a._d3}),function(a){return a.id}),alchemy.vis.select("#edge-"+a.id+"-"+a._index).remove();alchemy._nodes=_.omit(alchemy._nodes,""+c),alchemy.node=alchemy.node.data(_.map(alchemy._nodes,function(a){return a._d3}),function(a){return a.id}),alchemy.vis.select(b).remove(),l.push("editor"===alchemy.get.state("interactions")?alchemy.modifyElements.nodeEditorClear():void 0)}else l.push(void 0);return l},a.prototype.addNode=function(a){var b;return b=alchemy._nodes[a.id]=new alchemy.models.Node({id:""+a.id}),b.setProperty("caption",a.caption),b.setD3Property("x",a.x),b.setD3Property("y",a.y),alchemy.node=alchemy.node.data(_.map(alchemy._nodes,function(a){return a._d3}),function(a){return a.id})},a.prototype.addEdge=function(a){var b;return b=alchemy._edges[a.id]=new alchemy.models.Edge(a),alchemy.edge=alchemy.edge.data(_.map(alchemy._edges,function(a){return a._d3}),function(a){return a.id})},a.prototype.update=function(a,b){return this.mouseUpNode?(alchemy.editor.addEdge(b),this.drawEdges.createEdge(alchemy.edge)):(alchemy.editor.addNode(a),alchemy.editor.addEdge(b),this.drawEdges.createEdge(alchemy.edge),this.drawNodes.createNode(alchemy.node)),alchemy.layout.tick()},a}(),a.prototype.Edge=function(a){var b;return b=function(){function b(b,c){var d;null==c&&(c=null),this.allNodesActive=n(this.allNodesActive,this),this.setProperties=n(this.setProperties,this),this.getStyles=n(this.getStyles,this),this.setProperties=n(this.setProperties,this),this.getProperties=n(this.getProperties,this),this._setID=n(this._setID,this),this._setD3Properties=n(this._setD3Properties,this),this.a=a,d=this.a.conf,this.id=this._setID(b),this._index=c,this._state="active",this._properties=b,this._edgeType=this._setEdgeType(),this._style=null!=d.edgeStyle[this._edgeType]?_.merge(_.clone(d.edgeStyle.all),d.edgeStyle[this._edgeType]):_.clone(d.edgeStyle.all),this._d3=_.merge({id:this.id,pos:this._index,edgeType:this._edgeType,source:this.a._nodes[this._properties.source]._d3,target:this.a._nodes[this._properties.target]._d3,self:this},this.a.svgStyles.edge.populate(this)),this._setCaption(b,d),this.a._nodes[""+b.source]._addEdge(this),this.a._nodes[""+b.target]._addEdge(this)}return b.prototype._setD3Properties=function(a){return _.merge(this._d3,a)},b.prototype._setID=function(a){return null!=a.id?a.id:""+a.source+"-"+a.target},b.prototype._setCaption=function(a,b){var c,d;return c=b.edgeCaption,d=function(a){switch(typeof c){case"string":return a[c];case"function":return c(a)}}(a),d?this._d3.caption=d:void 0},b.prototype._setEdgeType=function(){var a,b,c;return a=this.a.conf,a.edgeTypes&&(_.isPlainObject(a.edgeTypes)?(c=Object.keys(this.a.conf.edgeTypes),b=this._properties[c]):_.isArray(a.edgeTypes)?b=this._properties.caption:"string"==typeof a.edgeTypes&&(b=this._properties[a.edgeTypes])),void 0===b&&(b="all"),this._setD3Properties("edgeType",b),b},b.prototype.getProperties=function(){var a,b,c;return a=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],null==a&&(a=null),null==a&&0===b.length?this._properties:0!==b.length?(c=_.union([a],b),_.pick(this._properties,c)):this._properties[a]},b.prototype.setProperties=function(a,b){return null==b&&(b=null),_.isPlainObject(a)?(_.assign(this._properties,a),"source"in a&&this._setD3Properties({source:alchemy._nodes[a.source]._d3}),"target"in a&&this._setD3Properties({target:alchemy._nodes[a.target]._d3})):(this._properties[a]=b,("source"===a||"target"===a)&&this._setD3Properties({property:alchemy._nodes[b]._d3})),this},b.prototype.getStyles=function(){var a,b,c;return b=arguments[0],c=2<=arguments.length?m.call(arguments,1):[],a=this,void 0===b?a._style:_.map(arguments,function(b){return a._style[b]})},b.prototype.setProperties=function(a,b){return null==b&&(b=null),_.isPlainObject(a)?(_.assign(this._properties,a),"source"in a&&this._setD3Properties({source:this.a._nodes[a.source]._d3}),"target"in a&&this._setD3Properties({target:this.a._nodes[a.target]._d3})):(this._properties[a]=b,("source"===a||"target"===a)&&this._setD3Properties({property:this.a._nodes[b]._d3})),this},b.prototype.setStyles=function(a,b){return null==b&&(b=null),void 0===a&&(a=this.a.svgStyles.edge.populate(this)),_.isPlainObject(a)?_.assign(this._style,a):"string"==typeof a&&(this._style[a]=b),this._setD3Properties(this.a.svgStyles.edge.update(this)),this.a._drawEdges.updateEdge(this._d3),this},b.prototype.toggleHidden=function(){return this._state="hidden"===this._state?"active":"hidden",this.setStyles()},b.prototype.allNodesActive=function(){var a,b,c,d;return a=this._properties.source,c=this._properties.target,b=alchemy.get.nodes(a)[0],d=alchemy.get.nodes(c)[0],"active"===b._state&&"active"===d._state},b.prototype.remove=function(){var a,b;return a=this,delete this.a._edges[a.id],null!=this.a._nodes[a._properties.source]&&_.remove(this.a._nodes[a._properties.source]._adjacentEdges,function(b){return b.id===a.id?b:void 0}),null!=this.a._nodes[a._properties.target]&&_.remove(this.a._nodes[a._properties.target]._adjacentEdges,function(b){return b.id===a.id?b:void 0}),this.a.vis.select("#edge-"+a.id+"-"+a._index).remove(),b=_.filter(this.a.force.links(),function(b){return b.id!==a.id?b:void 0}),this.a.force.links(b)},b}()},a.prototype.Node=function(a){var b;return b=function(){function b(b){this.getStyles=n(this.getStyles,this),this.setProperty=n(this.setProperty,this),this.getProperties=n(this.getProperties,this),this._setD3Properties=n(this._setD3Properties,this),this._setNodeType=n(this._setNodeType,this);var c;this.a=a,c=this.a.conf,this.id=b.id,this._properties=b,this._d3=_.merge({id:this.id,root:this._properties[c.rootNodes],self:this},this.a.svgStyles.node.populate(this)),this._nodeType=this._setNodeType(),this._style=c.nodeStyle[this._nodeType]?c.nodeStyle[this._nodeType]:c.nodeStyle.all,this._state="active",this._adjacentEdges=[]}return b.prototype._setNodeType=function(){var a,b,c,d;return a=this.a.conf,a.nodeTypes&&(_.isPlainObject(a.nodeTypes)?(b=Object.keys(this.a.conf.nodeTypes),d=_.values(a.nodeTypes),c=this._properties[b]):"string"==typeof a.nodeTypes&&(c=this._properties[a.nodeTypes])),void 0===c&&(c="all"),this._setD3Properties("nodeType",c),c},b.prototype._setD3Properties=function(a){return _.merge(this._d3,a)},b.prototype._addEdge=function(a){return this._adjacentEdges=_.union(this._adjacentEdges,[a])},b.prototype.getProperties=function(){var a,b,c;return a=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],null==a&&(a=null),null==a&&0===b.length?this._properties:0!==b.length?(c=_.union([a],b),_.pick(this._properties,c)):this._properties[a]},b.prototype.setProperty=function(a,b){return null==b&&(b=null),_.isPlainObject(a)?_.assign(this._properties,a):this._properties[a]=b,this},b.prototype.removeProperty=function(){var a,b,c,d,e;for(c=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],d=0,e=arguments.length;e>d;d++)a=arguments[d],delete this._properties[a];return this},b.prototype.getStyles=function(){var a,b,c;return a=arguments[0],b=2<=arguments.length?m.call(arguments,1):[],c=this,void 0===a?c._style:_.map(arguments,function(a){return c._style[a]})},b.prototype.setStyles=function(a,b){return null==b&&(b=null),void 0===a?a=this.a.svgStyles.node.populate(this):_.isPlainObject(a)?_.assign(this._style,a):this._style[a]=b,this._setD3Properties(this.a.svgStyles.node.populate(this)),this.a._drawNodes.updateNode(this._d3),this},b.prototype.toggleHidden=function(){var a;return a=this.a,this._state="hidden"===this._state?"active":"hidden",this.setStyles(),_.each(this._adjacentEdges,function(b){var c,d,e,f,g;return g=b.id.split("-"),c=g[0],e=g[1],d=a._nodes[""+c]._state,f=a._nodes[""+e]._state,"hidden"===b._state&&"active"===d&&"active"===f?b.toggleHidden():"active"!==b._state||"hidden"!==d&&"hidden"!==f?void 0:b.toggleHidden()})},b.prototype.outDegree=function(){return this._adjacentEdges.length},b.prototype.remove=function(){for(;!_.isEmpty(this._adjacentEdges);)this._adjacentEdges[0].remove();return delete this.a._nodes[this.id],this.a.vis.select("#node-"+this.id).remove()},b}()},a.prototype.plugins=function(b){return{init:function(){return _.each(_.keys(b.conf.plugins),function(c){return b.plugins[c]=a.prototype.plugins[c](b),null!=b.plugins[c].init?b.plugins[c].init():void 0})}}},a.prototype.themes={"default":{backgroundColour:"#000000",nodeStyle:{all:{radius:function(){return 10},color:function(){return"#68B9FE"},borderColor:function(){return"#127DC1"},borderWidth:function(a,b){return b/3},captionColor:function(){return"#FFFFFF"},captionBackground:function(){return null},captionSize:12,selected:{color:function(){return"#FFFFFF"},borderColor:function(){return"#349FE3"}},highlighted:{color:function(){return"#EEEEFF"}},hidden:{color:function(){return"none"},borderColor:function(){return"none"}}}},edgeStyle:{all:{width:4,color:"#CCC",opacity:.2,directed:!0,curved:!0,selected:{opacity:1},highlighted:{opacity:1},hidden:{opacity:0}}}},white:{theme:"white",backgroundColour:"#FFFFFF",nodeStyle:{all:{radius:function(){return 10
+},color:function(){return"#68B9FE"},borderColor:function(){return"#127DC1"},borderWidth:function(a,b){return b/3},captionColor:function(){return"#FFFFFF"},captionBackground:function(){return null},captionSize:12,selected:{color:function(){return"#FFFFFF"},borderColor:function(){return"38DD38"}},highlighted:{color:function(){return"#EEEEFF"}},hidden:{color:function(){return"none"},borderColor:function(){return"none"}}}},edgeStyle:{all:{width:4,color:"#333",opacity:.4,directed:!1,curved:!1,selected:{color:"#38DD38",opacity:.9},highlighted:{color:"#383838",opacity:.7},hidden:{opacity:0}}}}},a.prototype.exports=function(a){var b;return b=a,{init:function(){return b.exports.show()},show:function(){return b.dash.select("#all-exports").append("li").attr({"class":"list-group-item active-label toggle"}).html("SVG").on("click",function(){var a,c,d,e,f;return d=d3.select(""+b.conf.divSelector+" svg").node(),c=(new XMLSerializer).serializeToString(d),e="data:image/svg+xml;utf8,"+c,a=e.replace("xlink:",""),f=window.open(a),f.focus()})}}},l=function(){function a(a){this.dataWarning=n(this.dataWarning,this),this.a=a}return a.prototype.dataWarning=function(){return this.a.conf.dataWarning&&"function"==typeof this.a.conf.dataWarning?this.a.conf.dataWarning():"default"===this.a.conf.dataWarning?console.log("No dataSource was loaded"):void 0},a.prototype.divWarning=function(){return"create an element that matches the value for 'divSelector' in your conf.\nFor instance, if you are using the default 'divSelector' conf, simply provide\n."},a}()}).call(this);
\ No newline at end of file
diff --git a/EHEC_Server/EHEC_Server/alchemy/scripts/vendor.js b/EHEC_Server/EHEC_Server/alchemy/scripts/vendor.js
new file mode 100644
index 0000000..c4c3f2d
--- /dev/null
+++ b/EHEC_Server/EHEC_Server/alchemy/scripts/vendor.js
@@ -0,0 +1,10 @@
+if(function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b=a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(hb.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=ob[a]={};return _.each(a.match(nb)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ub,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:tb.test(c)?_.parseJSON(c):c}catch(e){}sb.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Kb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)rb.set(a[c],"globalEval",!b||rb.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(rb.hasData(a)&&(f=rb.access(a),g=rb.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sb.hasData(a)&&(h=sb.access(a),i=_.extend({},h),sb.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&yb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Ob[a];return c||(c=t(a,b),"none"!==c&&c||(Nb=(Nb||_("")).appendTo(b.documentElement),b=Nb[0].contentDocument,b.write(),b.close(),c=t(a,b),Nb.detach()),Ob[a]=c),c}function v(a,b,c){var d,e,f,g,h=a.style;return c=c||Rb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||_.contains(a.ownerDocument,a)||(g=_.style(a,b)),Qb.test(g)&&Pb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function w(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function x(a,b){if(b in a)return b;for(var c=b[0].toUpperCase()+b.slice(1),d=b,e=Xb.length;e--;)if(b=Xb[e]+c,b in a)return b;return d}function y(a,b,c){var d=Tb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=_.css(a,c+wb[f],!0,e)),d?("content"===c&&(g-=_.css(a,"padding"+wb[f],!0,e)),"margin"!==c&&(g-=_.css(a,"border"+wb[f]+"Width",!0,e))):(g+=_.css(a,"padding"+wb[f],!0,e),"padding"!==c&&(g+=_.css(a,"border"+wb[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Rb(a),g="border-box"===_.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=v(a,b,f),(0>e||null==e)&&(e=a.style[b]),Qb.test(e))return e;d=g&&(Y.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=rb.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&xb(d)&&(f[g]=rb.access(d,"olddisplay",u(d.nodeName)))):(e=xb(d),"none"===c&&e||rb.set(d,"olddisplay",e?c:_.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function C(a,b,c,d,e){return new C.prototype.init(a,b,c,d,e)}function D(){return setTimeout(function(){Yb=void 0}),Yb=_.now()}function E(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=wb[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function F(a,b,c){for(var d,e=(cc[b]||[]).concat(cc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function G(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},n=a.style,o=a.nodeType&&xb(a),p=rb.get(a,"fxshow");c.queue||(h=_._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,_.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[n.overflow,n.overflowX,n.overflowY],j=_.css(a,"display"),k="none"===j?rb.get(a,"olddisplay")||u(a.nodeName):j,"inline"===k&&"none"===_.css(a,"float")&&(n.display="inline-block")),c.overflow&&(n.overflow="hidden",l.always(function(){n.overflow=c.overflow[0],n.overflowX=c.overflow[1],n.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],$b.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(o?"hide":"show")){if("show"!==e||!p||void 0===p[d])continue;o=!0}m[d]=p&&p[d]||_.style(a,d)}else j=void 0;if(_.isEmptyObject(m))"inline"===("none"===j?u(a.nodeName):j)&&(n.display=j);else{p?"hidden"in p&&(o=p.hidden):p=rb.access(a,"fxshow",{}),f&&(p.hidden=!o),o?_(a).show():l.done(function(){_(a).hide()}),l.done(function(){var b;rb.remove(a,"fxshow");for(b in m)_.style(a,b,m[b])});for(d in m)g=F(o?p[d]:0,d,l),d in p||(p[d]=g.start,o&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function H(a,b){var c,d,e,f,g;for(c in a)if(d=_.camelCase(c),e=b[d],f=a[c],_.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=_.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function I(a,b,c){var d,e,f=0,g=bc.length,h=_.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Yb||D(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:_.extend({},b),opts:_.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Yb||D(),duration:c.duration,tweens:[],createTween:function(b,c){var d=_.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(H(k,j.opts.specialEasing);g>f;f++)if(d=bc[f].call(j,a,k,j.opts))return d;return _.map(k,F,j),_.isFunction(j.opts.start)&&j.opts.start.call(a,j),_.fx.timer(_.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function J(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(nb)||[];if(_.isFunction(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function K(a,b,c,d){function e(h){var i;return f[h]=!0,_.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===vc;return e(b.dataTypes[0])||!f["*"]&&e("*")}function L(a,b){var c,d,e=_.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&_.extend(!0,a,d),a}function M(a,b,c){for(var d,e,f,g,h=a.contents,i=a.dataTypes;"*"===i[0];)i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function N(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];for(f=k.shift();f;)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}function O(a,b,c,d){var e;if(_.isArray(b))_.each(b,function(b,e){c||zc.test(a)?d(a,e):O(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==_.type(b))d(a,b);else for(e in b)O(a+"["+e+"]",b[e],c,d)}function P(a){return _.isWindow(a)?a:9===a.nodeType&&a.defaultView}var Q=[],R=Q.slice,S=Q.concat,T=Q.push,U=Q.indexOf,V={},W=V.toString,X=V.hasOwnProperty,Y={},Z=a.document,$="2.1.1",_=function(a,b){return new _.fn.init(a,b)},ab=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bb=/^-ms-/,cb=/-([\da-z])/gi,db=function(a,b){return b.toUpperCase()};_.fn=_.prototype={jquery:$,constructor:_,selector:"",length:0,toArray:function(){return R.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:R.call(this)},pushStack:function(a){var b=_.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return _.each(this,a,b)},map:function(a){return this.pushStack(_.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(R.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:T,sort:Q.sort,splice:Q.splice},_.extend=_.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||_.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(_.isPlainObject(d)||(e=_.isArray(d)))?(e?(e=!1,f=c&&_.isArray(c)?c:[]):f=c&&_.isPlainObject(c)?c:{},g[b]=_.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},_.extend({expando:"jQuery"+($+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===_.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!_.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==_.type(a)||a.nodeType||_.isWindow(a)?!1:a.constructor&&!X.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?V[W.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=_.trim(a),a&&(1===a.indexOf("use strict")?(b=Z.createElement("script"),b.text=a,Z.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(bb,"ms-").replace(cb,db)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.length,h=c(a);if(d){if(h)for(;g>f&&(e=b.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=b.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=b.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),e===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(ab,"")},makeArray:function(a,b){var d=b||[];return null!=a&&(c(Object(a))?_.merge(d,"string"==typeof a?[a]:a):T.call(d,a)),d},inArray:function(a,b,c){return null==b?-1:U.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,d){var e,f=0,g=a.length,h=c(a),i=[];if(h)for(;g>f;f++)e=b(a[f],f,d),null!=e&&i.push(e);else for(f in a)e=b(a[f],f,d),null!=e&&i.push(e);return S.apply([],i)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),_.isFunction(a)?(d=R.call(arguments,2),e=function(){return a.apply(b||this,d.concat(R.call(arguments)))},e.guid=a.guid=a.guid||_.guid++,e):void 0},now:Date.now,support:Y}),_.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){V["[object "+b+"]"]=b.toLowerCase()});var eb=function(a){function b(a,b,c,d){var e,f,g,h,i,j,l,n,o,p;if((b?b.ownerDocument||b:O)!==G&&F(b),b=b||G,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(I&&!d){if(e=sb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&M(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return _.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&v.getElementsByClassName&&b.getElementsByClassName)return _.apply(c,b.getElementsByClassName(g)),c}if(v.qsa&&(!J||!J.test(a))){if(n=l=N,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(j=z(a),(l=b.getAttribute("id"))?n=l.replace(ub,"\\$&"):b.setAttribute("id",n),n="[id='"+n+"'] ",i=j.length;i--;)j[i]=n+m(j[i]);o=tb.test(a)&&k(b.parentNode)||b,p=j.join(",")}if(p)try{return _.apply(c,o.querySelectorAll(p)),c}catch(q){}finally{l||b.removeAttribute("id")}}}return B(a.replace(ib,"$1"),b,c,d)}function c(){function a(c,d){return b.push(c+" ")>w.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[N]=!0,a}function e(a){var b=G.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=a.length;d--;)w.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return d(function(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function k(a){return a&&typeof a.getElementsByTagName!==V&&a}function l(){}function m(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function n(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=Q++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[P,f];if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e){if(i=b[N]||(b[N]={}),(h=i[d])&&h[0]===P&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function o(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,c,d){for(var e=0,f=c.length;f>e;e++)b(a,c[e],d);return d}function q(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function r(a,b,c,e,f,g){return e&&!e[N]&&(e=r(e)),f&&!f[N]&&(f=r(f,g)),d(function(d,g,h,i){var j,k,l,m=[],n=[],o=g.length,r=d||p(b||"*",h.nodeType?[h]:h,[]),s=!a||!d&&b?r:q(r,m,a,h,i),t=c?f||(d?a:o||e)?[]:g:s;if(c&&c(s,t,h,i),e)for(j=q(t,n),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[n[k]]=!(s[n[k]]=l));if(d){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?bb.call(d,l):m[k])>-1&&(d[j]=!(g[j]=l))}}else t=q(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function s(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return bb.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==C)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=w.relative[a[h].type])k=[n(o(k),c)];else{if(c=w.filter[a[h].type].apply(null,a[h].matches),c[N]){for(d=++h;e>d&&!w.relative[a[d].type];d++);return r(h>1&&o(k),h>1&&m(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ib,"$1"),c,d>h&&s(a.slice(h,d)),e>d&&s(a=a.slice(d)),e>d&&m(a))}k.push(c)}return o(k)}function t(a,c){var e=c.length>0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],r=[],s=C,t=d||f&&w.find.TAG("*",j),u=P+=null==s?1:Math.random()||.1,v=t.length;for(j&&(C=g!==G&&g);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0;m=a[l++];)if(m(k,g,h)){i.push(k);break}j&&(P=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,r,g,h);if(d){if(n>0)for(;o--;)p[o]||r[o]||(r[o]=Z.call(i));r=q(r)}_.apply(i,r),j&&!d&&r.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(P=u,C=s),p};return e?d(g):g}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P=0,Q=0,R=c(),S=c(),T=c(),U=function(a,b){return a===b&&(E=!0),0},V="undefined",W=1<<31,X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,ab=Y.slice,bb=Y.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},cb="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",db="[\\x20\\t\\r\\n\\f]",eb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",fb=eb.replace("w","w#"),gb="\\["+db+"*("+eb+")(?:"+db+"*([*^$|!~]?=)"+db+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+fb+"))|)"+db+"*\\]",hb=":("+eb+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+gb+")*)|.*)\\)|)",ib=new RegExp("^"+db+"+|((?:^|[^\\\\])(?:\\\\.)*)"+db+"+$","g"),jb=new RegExp("^"+db+"*,"+db+"*"),kb=new RegExp("^"+db+"*([>+~]|"+db+")"+db+"*"),lb=new RegExp("="+db+"*([^\\]'\"]*?)"+db+"*\\]","g"),mb=new RegExp(hb),nb=new RegExp("^"+fb+"$"),ob={ID:new RegExp("^#("+eb+")"),CLASS:new RegExp("^\\.("+eb+")"),TAG:new RegExp("^("+eb.replace("w","w*")+")"),ATTR:new RegExp("^"+gb),PSEUDO:new RegExp("^"+hb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+db+"*(even|odd|(([+-]|)(\\d*)n|)"+db+"*(?:([+-]|)"+db+"*(\\d+)|))"+db+"*\\)|)","i"),bool:new RegExp("^(?:"+cb+")$","i"),needsContext:new RegExp("^"+db+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+db+"*((?:-\\d)?\\d*)"+db+"*\\)|)(?=[^-]|$)","i")},pb=/^(?:input|select|textarea|button)$/i,qb=/^h\d$/i,rb=/^[^{]+\{\s*\[native \w/,sb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tb=/[+~]/,ub=/'|\\/g,vb=new RegExp("\\\\([\\da-f]{1,6}"+db+"?|("+db+")|.)","ig"),wb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{_.apply(Y=ab.call(O.childNodes),O.childNodes),Y[O.childNodes.length].nodeType}catch(xb){_={apply:Y.length?function(a,b){$.apply(a,ab.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}v=b.support={},y=b.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},F=b.setDocument=function(a){var b,c=a?a.ownerDocument||a:O,d=c.defaultView;return c!==G&&9===c.nodeType&&c.documentElement?(G=c,H=c.documentElement,I=!y(c),d&&d!==d.top&&(d.addEventListener?d.addEventListener("unload",function(){F()},!1):d.attachEvent&&d.attachEvent("onunload",function(){F()})),v.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),v.getElementsByTagName=e(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),v.getElementsByClassName=rb.test(c.getElementsByClassName)&&e(function(a){return a.innerHTML="",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),v.getById=e(function(a){return H.appendChild(a).id=N,!c.getElementsByName||!c.getElementsByName(N).length}),v.getById?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&I){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){return a.getAttribute("id")===b}}):(delete w.find.ID,w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b}}),w.find.TAG=v.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.CLASS=v.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==V&&I?b.getElementsByClassName(a):void 0},K=[],J=[],(v.qsa=rb.test(c.querySelectorAll))&&(e(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&J.push("[*^$]="+db+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||J.push("\\["+db+"*(?:value|"+cb+")"),a.querySelectorAll(":checked").length||J.push(":checked")}),e(function(a){var b=c.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&J.push("name"+db+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||J.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),J.push(",.*:")})),(v.matchesSelector=rb.test(L=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&e(function(a){v.disconnectedMatch=L.call(a,"div"),L.call(a,"[s!='']:x"),K.push("!=",hb)}),J=J.length&&new RegExp(J.join("|")),K=K.length&&new RegExp(K.join("|")),b=rb.test(H.compareDocumentPosition),M=b||rb.test(H.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=b?function(a,b){if(a===b)return E=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!v.sortDetached&&b.compareDocumentPosition(a)===d?a===c||a.ownerDocument===O&&M(O,a)?-1:b===c||b.ownerDocument===O&&M(O,b)?1:D?bb.call(D,a)-bb.call(D,b):0:4&d?-1:1)}:function(a,b){if(a===b)return E=!0,0;var d,e=0,f=a.parentNode,h=b.parentNode,i=[a],j=[b];if(!f||!h)return a===c?-1:b===c?1:f?-1:h?1:D?bb.call(D,a)-bb.call(D,b):0;if(f===h)return g(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?g(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},c):G},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if((a.ownerDocument||a)!==G&&F(a),c=c.replace(lb,"='$1']"),!(!v.matchesSelector||!I||K&&K.test(c)||J&&J.test(c)))try{var d=L.call(a,c);if(d||v.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return b(c,G,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!==G&&F(a),M(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!==G&&F(a);var c=w.attrHandle[b.toLowerCase()],d=c&&X.call(w.attrHandle,b.toLowerCase())?c(a,b,!I):void 0;return void 0!==d?d:v.attributes||!I?a.getAttribute(b):(d=a.getAttributeNode(b))&&d.specified?d.value:null},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(E=!v.detectDuplicates,D=!v.sortStable&&a.slice(0),a.sort(U),E){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return D=null,a},x=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=x(b);return c},w=b.selectors={cacheLength:50,createPseudo:d,match:ob,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(vb,wb),a[3]=(a[3]||a[4]||a[5]||"").replace(vb,wb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return ob.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&mb.test(c)&&(b=z(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(vb,wb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=R[a+" "];return b||(b=new RegExp("(^|"+db+")"+a+"("+db+"|$)"))&&R(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:c?(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f+" ").indexOf(d)>-1:"|="===c?f===d||f.slice(0,d.length+1)===d+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===P&&j[1],m=j[0]===P&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[P,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===P)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[P,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,c){var e,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||b.error("unsupported pseudo: "+a);return f[N]?f(c):f.length>1?(e=[a,a,"",c],w.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=bb.call(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=A(a.replace(ib,"$1"));return e[N]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:d(function(a){return nb.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(vb,wb).toLowerCase(),function(b){var c;do if(c=I?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===H},focus:function(a){return a===G.activeElement&&(!G.hasFocus||G.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return qb.test(a.nodeName)},input:function(a){return pb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:j(function(){return[0]}),last:j(function(a,b){return[b-1]}),eq:j(function(a,b,c){return[0>c?c+b:c]}),even:j(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:j(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:j(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:j(function(a,b,c){for(var d=0>c?c+b:c;++d2&&"ID"===(g=f[0]).type&&v.getById&&9===b.nodeType&&I&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(vb,wb),b)||[])[0],!b)return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=ob.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(vb,wb),tb.test(f[0].type)&&k(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return _.apply(c,d),c;break}}return(j||A(a,l))(d,b,!I,c,tb.test(a)&&k(b.parentNode)||b),c},v.sortStable=N.split("").sort(U).join("")===N,v.detectDuplicates=!!E,F(),v.sortDetached=e(function(a){return 1&a.compareDocumentPosition(G.createElement("div"))}),e(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),v.attributes&&e(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(cb,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);_.find=eb,_.expr=eb.selectors,_.expr[":"]=_.expr.pseudos,_.unique=eb.uniqueSort,_.text=eb.getText,_.isXMLDoc=eb.isXML,_.contains=eb.contains;var fb=_.expr.match.needsContext,gb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,hb=/^.[^:#\[\.,]*$/;_.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?_.find.matchesSelector(d,a)?[d]:[]:_.find.matches(a,_.grep(b,function(a){return 1===a.nodeType}))},_.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(_(a).filter(function(){for(b=0;c>b;b++)if(_.contains(e[b],this))return!0
+}));for(b=0;c>b;b++)_.find(a,e[b],d);return d=this.pushStack(c>1?_.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(d(this,a||[],!1))},not:function(a){return this.pushStack(d(this,a||[],!0))},is:function(a){return!!d(this,"string"==typeof a&&fb.test(a)?_(a):a||[],!1).length}});var ib,jb=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,kb=_.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:jb.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||ib).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof _?b[0]:b,_.merge(this,_.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:Z,!0)),gb.test(c[1])&&_.isPlainObject(b))for(c in b)_.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=Z.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=Z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):_.isFunction(a)?"undefined"!=typeof ib.ready?ib.ready(a):a(_):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),_.makeArray(a,this))};kb.prototype=_.fn,ib=_(Z);var lb=/^(?:parents|prev(?:Until|All))/,mb={children:!0,contents:!0,next:!0,prev:!0};_.extend({dir:function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&_(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),_.fn.extend({has:function(a){var b=_(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(_.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=fb.test(a)||"string"!=typeof a?_(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&_.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?_.unique(f):f)},index:function(a){return a?"string"==typeof a?U.call(_(a),this[0]):U.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(_.unique(_.merge(this.get(),_(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),_.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return _.dir(a,"parentNode")},parentsUntil:function(a,b,c){return _.dir(a,"parentNode",c)},next:function(a){return e(a,"nextSibling")},prev:function(a){return e(a,"previousSibling")},nextAll:function(a){return _.dir(a,"nextSibling")},prevAll:function(a){return _.dir(a,"previousSibling")},nextUntil:function(a,b,c){return _.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return _.dir(a,"previousSibling",c)},siblings:function(a){return _.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return _.sibling(a.firstChild)},contents:function(a){return a.contentDocument||_.merge([],a.childNodes)}},function(a,b){_.fn[a]=function(c,d){var e=_.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=_.filter(d,e)),this.length>1&&(mb[a]||_.unique(e),lb.test(a)&&e.reverse()),this.pushStack(e)}});var nb=/\S+/g,ob={};_.Callbacks=function(a){a="string"==typeof a?ob[a]||f(a):_.extend({},a);var b,c,d,e,g,h,i=[],j=!a.once&&[],k=function(f){for(b=a.memory&&f,c=!0,h=e||0,e=0,g=i.length,d=!0;i&&g>h;h++)if(i[h].apply(f[0],f[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,i&&(j?j.length&&k(j.shift()):b?i=[]:l.disable())},l={add:function(){if(i){var c=i.length;!function f(b){_.each(b,function(b,c){var d=_.type(c);"function"===d?a.unique&&l.has(c)||i.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),d?g=i.length:b&&(e=c,k(b))}return this},remove:function(){return i&&_.each(arguments,function(a,b){for(var c;(c=_.inArray(b,i,c))>-1;)i.splice(c,1),d&&(g>=c&&g--,h>=c&&h--)}),this},has:function(a){return a?_.inArray(a,i)>-1:!(!i||!i.length)},empty:function(){return i=[],g=0,this},disable:function(){return i=j=b=void 0,this},disabled:function(){return!i},lock:function(){return j=void 0,b||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return!i||c&&!j||(b=b||[],b=[a,b.slice?b.slice():b],d?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!c}};return l},_.extend({Deferred:function(a){var b=[["resolve","done",_.Callbacks("once memory"),"resolved"],["reject","fail",_.Callbacks("once memory"),"rejected"],["notify","progress",_.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return _.Deferred(function(c){_.each(b,function(b,f){var g=_.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&_.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?_.extend(a,d):d}},e={};return d.pipe=d.then,_.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b,c,d,e=0,f=R.call(arguments),g=f.length,h=1!==g||a&&_.isFunction(a.promise)?g:0,i=1===h?a:_.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?R.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);g>e;e++)f[e]&&_.isFunction(f[e].promise)?f[e].promise().done(j(e,d,f)).fail(i.reject).progress(j(e,c,b)):--h;return h||i.resolveWith(d,f),i.promise()}});var pb;_.fn.ready=function(a){return _.ready.promise().done(a),this},_.extend({isReady:!1,readyWait:1,holdReady:function(a){a?_.readyWait++:_.ready(!0)},ready:function(a){(a===!0?--_.readyWait:_.isReady)||(_.isReady=!0,a!==!0&&--_.readyWait>0||(pb.resolveWith(Z,[_]),_.fn.triggerHandler&&(_(Z).triggerHandler("ready"),_(Z).off("ready"))))}}),_.ready.promise=function(b){return pb||(pb=_.Deferred(),"complete"===Z.readyState?setTimeout(_.ready):(Z.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1))),pb.promise(b)},_.ready.promise();var qb=_.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===_.type(c)){e=!0;for(h in c)_.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,_.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(_(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};_.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType},h.uid=1,h.accepts=_.acceptData,h.prototype={key:function(a){if(!h.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=h.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,_.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(_.isEmptyObject(f))_.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,_.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{_.isArray(b)?d=b.concat(b.map(_.camelCase)):(e=_.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(nb)||[])),c=d.length;for(;c--;)delete g[d[c]]}},hasData:function(a){return!_.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var rb=new h,sb=new h,tb=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ub=/([A-Z])/g;_.extend({hasData:function(a){return sb.hasData(a)||rb.hasData(a)},data:function(a,b,c){return sb.access(a,b,c)},removeData:function(a,b){sb.remove(a,b)},_data:function(a,b,c){return rb.access(a,b,c)},_removeData:function(a,b){rb.remove(a,b)}}),_.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=sb.get(f),1===f.nodeType&&!rb.get(f,"hasDataAttrs"))){for(c=g.length;c--;)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=_.camelCase(d.slice(5)),i(f,d,e[d])));rb.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){sb.set(this,a)}):qb(this,function(b){var c,d=_.camelCase(a);if(f&&void 0===b){if(c=sb.get(f,a),void 0!==c)return c;if(c=sb.get(f,d),void 0!==c)return c;if(c=i(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=sb.get(this,d);sb.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&sb.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){sb.remove(this,a)})}}),_.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=rb.get(a,b),c&&(!d||_.isArray(c)?d=rb.access(a,b,_.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=_.queue(a,b),d=c.length,e=c.shift(),f=_._queueHooks(a,b),g=function(){_.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return rb.get(a,c)||rb.access(a,c,{empty:_.Callbacks("once memory").add(function(){rb.remove(a,[b+"queue",c])})})}}),_.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",Y.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var zb="undefined";Y.focusinBubbles="onfocusin"in a;var Ab=/^key/,Bb=/^(?:mouse|pointer|contextmenu)|click/,Cb=/^(?:focusinfocus|focusoutblur)$/,Db=/^([^.]*)(?:\.(.+)|)$/;_.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=rb.get(a);if(q)for(c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=_.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return typeof _!==zb&&_.event.triggered!==b.type?_.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(nb)||[""],j=b.length;j--;)h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=_.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=_.event.special[n]||{},k=_.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&_.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),_.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=rb.hasData(a)&&rb.get(a);if(q&&(i=q.events)){for(b=(b||"").match(nb)||[""],j=b.length;j--;)if(h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=_.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||_.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)_.event.remove(a,n+b[j],c,d,!0);_.isEmptyObject(i)&&(delete q.handle,rb.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m=[d||Z],n=X.call(b,"type")?b.type:b,o=X.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||Z,3!==d.nodeType&&8!==d.nodeType&&!Cb.test(n+_.event.triggered)&&(n.indexOf(".")>=0&&(o=n.split("."),n=o.shift(),o.sort()),j=n.indexOf(":")<0&&"on"+n,b=b[_.expando]?b:new _.Event(n,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=o.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:_.makeArray(c,[b]),l=_.event.special[n]||{},e||!l.trigger||l.trigger.apply(d,c)!==!1)){if(!e&&!l.noBubble&&!_.isWindow(d)){for(i=l.delegateType||n,Cb.test(i+n)||(g=g.parentNode);g;g=g.parentNode)m.push(g),h=g;h===(d.ownerDocument||Z)&&m.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=m[f++])&&!b.isPropagationStopped();)b.type=f>1?i:l.bindType||n,k=(rb.get(g,"events")||{})[b.type]&&rb.get(g,"handle"),k&&k.apply(g,c),k=j&&g[j],k&&k.apply&&_.acceptData(g)&&(b.result=k.apply(g,c),b.result===!1&&b.preventDefault());return b.type=n,e||b.isDefaultPrevented()||l._default&&l._default.apply(m.pop(),c)!==!1||!_.acceptData(d)||j&&_.isFunction(d[n])&&!_.isWindow(d)&&(h=d[j],h&&(d[j]=null),_.event.triggered=n,d[n](),_.event.triggered=void 0,h&&(d[j]=h)),b.result}},dispatch:function(a){a=_.event.fix(a);var b,c,d,e,f,g=[],h=R.call(arguments),i=(rb.get(this,"events")||{})[a.type]||[],j=_.event.special[a.type]||{};if(h[0]=a,a.delegateTarget=this,!j.preDispatch||j.preDispatch.call(this,a)!==!1){for(g=_.event.handlers.call(this,a,i),b=0;(e=g[b++])&&!a.isPropagationStopped();)for(a.currentTarget=e.elem,c=0;(f=e.handlers[c++])&&!a.isImmediatePropagationStopped();)(!a.namespace_re||a.namespace_re.test(f.namespace))&&(a.handleObj=f,a.data=f.data,d=((_.event.special[f.origType]||{}).handle||f.handler).apply(e.elem,h),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return j.postDispatch&&j.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?_(e,this).index(i)>=0:_.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,Fb=/<([\w:]+)/,Gb=/<|?\w+;/,Hb=/<(?:script|style|link)/i,Ib=/checked\s*(?:[^=]|=\s*.checked.)/i,Jb=/^$|\/(?:java|ecma)script/i,Kb=/^true\/(.*)/,Lb=/^\s*\s*$/g,Mb={option:[1,""],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};Mb.optgroup=Mb.option,Mb.tbody=Mb.tfoot=Mb.colgroup=Mb.caption=Mb.thead,Mb.th=Mb.td,_.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=_.contains(a.ownerDocument,a);if(!(Y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||_.isXMLDoc(a)))for(g=r(h),f=r(a),d=0,e=f.length;e>d;d++)s(f[d],g[d]);if(b)if(c)for(f=f||r(a),g=g||r(h),d=0,e=f.length;e>d;d++)q(f[d],g[d]);else q(a,h);return g=r(h,"script"),g.length>0&&p(g,!i&&r(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===_.type(e))_.merge(l,e.nodeType?[e]:e);else if(Gb.test(e)){for(f=f||k.appendChild(b.createElement("div")),g=(Fb.exec(e)||["",""])[1].toLowerCase(),h=Mb[g]||Mb._default,f.innerHTML=h[1]+e.replace(Eb,"<$1>$2>")+h[2],j=h[0];j--;)f=f.lastChild;_.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));for(k.textContent="",m=0;e=l[m++];)if((!d||-1===_.inArray(e,d))&&(i=_.contains(e.ownerDocument,e),f=r(k.appendChild(e),"script"),i&&p(f),c))for(j=0;e=f[j++];)Jb.test(e.type||"")&&c.push(e);return k},cleanData:function(a){for(var b,c,d,e,f=_.event.special,g=0;void 0!==(c=a[g]);g++){if(_.acceptData(c)&&(e=c[rb.expando],e&&(b=rb.cache[e]))){if(b.events)for(d in b.events)f[d]?_.event.remove(c,d):_.removeEvent(c,d,b.handle);rb.cache[e]&&delete rb.cache[e]}delete sb.cache[c[sb.expando]]}}}),_.fn.extend({text:function(a){return qb(this,function(a){return void 0===a?_.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?_.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||_.cleanData(r(c)),c.parentNode&&(b&&_.contains(c.ownerDocument,c)&&p(r(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(_.cleanData(r(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return _.clone(this,a,b)})},html:function(a){return qb(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Hb.test(a)&&!Mb[(Fb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Eb,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(_.cleanData(r(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,_.cleanData(r(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=S.apply([],a);var c,d,e,f,g,h,i=0,j=this.length,k=this,l=j-1,m=a[0],p=_.isFunction(m);if(p||j>1&&"string"==typeof m&&!Y.checkClone&&Ib.test(m))return this.each(function(c){var d=k.eq(c);p&&(a[0]=m.call(this,c,d.html())),d.domManip(a,b)});if(j&&(c=_.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(e=_.map(r(c,"script"),n),f=e.length;j>i;i++)g=c,i!==l&&(g=_.clone(g,!0,!0),f&&_.merge(e,r(g,"script"))),b.call(this[i],g,i);if(f)for(h=e[e.length-1].ownerDocument,_.map(e,o),i=0;f>i;i++)g=e[i],Jb.test(g.type||"")&&!rb.access(g,"globalEval")&&_.contains(h,g)&&(g.src?_._evalUrl&&_._evalUrl(g.src):_.globalEval(g.textContent.replace(Lb,"")))}return this}}),_.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){_.fn[a]=function(a){for(var c,d=[],e=_(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),_(e[g])[b](c),T.apply(d,c.get());return this.pushStack(d)}});var Nb,Ob={},Pb=/^margin/,Qb=new RegExp("^("+vb+")(?!px)[a-z%]+$","i"),Rb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};!function(){function b(){g.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",g.innerHTML="",e.appendChild(f);var b=a.getComputedStyle(g,null);c="1%"!==b.top,d="4px"===b.width,e.removeChild(f)}var c,d,e=Z.documentElement,f=Z.createElement("div"),g=Z.createElement("div");g.style&&(g.style.backgroundClip="content-box",g.cloneNode(!0).style.backgroundClip="",Y.clearCloneStyle="content-box"===g.style.backgroundClip,f.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",f.appendChild(g),a.getComputedStyle&&_.extend(Y,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return null==d&&b(),d},reliableMarginRight:function(){var b,c=g.appendChild(Z.createElement("div"));return c.style.cssText=g.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",g.style.width="1px",e.appendChild(f),b=!parseFloat(a.getComputedStyle(c,null).marginRight),e.removeChild(f),b}}))}(),_.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Sb=/^(none|table(?!-c[ea]).+)/,Tb=new RegExp("^("+vb+")(.*)$","i"),Ub=new RegExp("^([+-])=("+vb+")","i"),Vb={position:"absolute",visibility:"hidden",display:"block"},Wb={letterSpacing:"0",fontWeight:"400"},Xb=["Webkit","O","Moz","ms"];_.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=v(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=_.camelCase(b),i=a.style;return b=_.cssProps[h]||(_.cssProps[h]=x(i,h)),g=_.cssHooks[b]||_.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ub.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(_.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||_.cssNumber[h]||(c+="px"),Y.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=_.camelCase(b);return b=_.cssProps[h]||(_.cssProps[h]=x(a.style,h)),g=_.cssHooks[b]||_.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=v(a,b,d)),"normal"===e&&b in Wb&&(e=Wb[b]),""===c||c?(f=parseFloat(e),c===!0||_.isNumeric(f)?f||0:e):e}}),_.each(["height","width"],function(a,b){_.cssHooks[b]={get:function(a,c,d){return c?Sb.test(_.css(a,"display"))&&0===a.offsetWidth?_.swap(a,Vb,function(){return A(a,b,d)}):A(a,b,d):void 0},set:function(a,c,d){var e=d&&Rb(a);return y(a,c,d?z(a,b,d,"border-box"===_.css(a,"boxSizing",!1,e),e):0)}}}),_.cssHooks.marginRight=w(Y.reliableMarginRight,function(a,b){return b?_.swap(a,{display:"inline-block"},v,[a,"marginRight"]):void 0}),_.each({margin:"",padding:"",border:"Width"},function(a,b){_.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+wb[d]+b]=f[d]||f[d-2]||f[0];return e}},Pb.test(a)||(_.cssHooks[a+b].set=y)}),_.fn.extend({css:function(a,b){return qb(this,function(a,b,c){var d,e,f={},g=0;if(_.isArray(b)){for(d=Rb(a),e=b.length;e>g;g++)f[b[g]]=_.css(a,b[g],!1,d);return f}return void 0!==c?_.style(a,b,c):_.css(a,b)},a,b,arguments.length>1)},show:function(){return B(this,!0)},hide:function(){return B(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){xb(this)?_(this).show():_(this).hide()})}}),_.Tween=C,C.prototype={constructor:C,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(_.cssNumber[c]?"":"px")},cur:function(){var a=C.propHooks[this.prop];return a&&a.get?a.get(this):C.propHooks._default.get(this)},run:function(a){var b,c=C.propHooks[this.prop];return this.pos=b=this.options.duration?_.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):C.propHooks._default.set(this),this}},C.prototype.init.prototype=C.prototype,C.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=_.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){_.fx.step[a.prop]?_.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[_.cssProps[a.prop]]||_.cssHooks[a.prop])?_.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},C.propHooks.scrollTop=C.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},_.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},_.fx=C.prototype.init,_.fx.step={};var Yb,Zb,$b=/^(?:toggle|show|hide)$/,_b=new RegExp("^(?:([+-])=|)("+vb+")([a-z%]*)$","i"),ac=/queueHooks$/,bc=[G],cc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=_b.exec(b),f=e&&e[3]||(_.cssNumber[a]?"":"px"),g=(_.cssNumber[a]||"px"!==f&&+d)&&_b.exec(_.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,_.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};_.Animation=_.extend(I,{tweener:function(a,b){_.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],cc[c]=cc[c]||[],cc[c].unshift(b)},prefilter:function(a,b){b?bc.unshift(a):bc.push(a)}}),_.speed=function(a,b,c){var d=a&&"object"==typeof a?_.extend({},a):{complete:c||!c&&b||_.isFunction(a)&&a,duration:a,easing:c&&b||b&&!_.isFunction(b)&&b};return d.duration=_.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in _.fx.speeds?_.fx.speeds[d.duration]:_.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){_.isFunction(d.old)&&d.old.call(this),d.queue&&_.dequeue(this,d.queue)},d},_.fn.extend({fadeTo:function(a,b,c,d){return this.filter(xb).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=_.isEmptyObject(a),f=_.speed(b,c,d),g=function(){var b=I(this,_.extend({},a),f);(e||rb.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=_.timers,g=rb.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ac.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&_.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=rb.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=_.timers,g=d?d.length:0;for(c.finish=!0,_.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),_.each(["toggle","show","hide"],function(a,b){var c=_.fn[b];
+_.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(E(b,!0),a,d,e)}}),_.each({slideDown:E("show"),slideUp:E("hide"),slideToggle:E("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){_.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),_.timers=[],_.fx.tick=function(){var a,b=0,c=_.timers;for(Yb=_.now();b1)},removeAttr:function(a){return this.each(function(){_.removeAttr(this,a)})}}),_.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===zb?_.prop(a,b,c):(1===f&&_.isXMLDoc(a)||(b=b.toLowerCase(),d=_.attrHooks[b]||(_.expr.match.bool.test(b)?ec:dc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=_.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void _.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(nb);if(f&&1===a.nodeType)for(;c=f[e++];)d=_.propFix[c]||c,_.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!Y.radioValue&&"radio"===b&&_.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),ec={set:function(a,b,c){return b===!1?_.removeAttr(a,c):a.setAttribute(c,c),c}},_.each(_.expr.match.bool.source.match(/\w+/g),function(a,b){var c=fc[b]||_.find.attr;fc[b]=function(a,b,d){var e,f;return d||(f=fc[b],fc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,fc[b]=f),e}});var gc=/^(?:input|select|textarea|button)$/i;_.fn.extend({prop:function(a,b){return qb(this,_.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[_.propFix[a]||a]})}}),_.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!_.isXMLDoc(a),f&&(b=_.propFix[b]||b,e=_.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||gc.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),Y.optSelected||(_.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),_.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){_.propFix[this.toLowerCase()]=this});var hc=/[\t\r\n\f]/g;_.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):" ")){for(f=0;e=b[f++];)d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=_.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):"")){for(f=0;e=b[f++];)for(;d.indexOf(" "+e+" ")>=0;)d=d.replace(" "+e+" "," ");g=a?_.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(_.isFunction(a)?function(c){_(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c)for(var b,d=0,e=_(this),f=a.match(nb)||[];b=f[d++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else(c===zb||"boolean"===c)&&(this.className&&rb.set(this,"__className__",this.className),this.className=this.className||a===!1?"":rb.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(hc," ").indexOf(b)>=0)return!0;return!1}});var ic=/\r/g;_.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=_.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,_(this).val()):a,null==e?e="":"number"==typeof e?e+="":_.isArray(e)&&(e=_.map(e,function(a){return null==a?"":a+""})),b=_.valHooks[this.type]||_.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=_.valHooks[e.type]||_.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ic,""):null==c?"":c)}}}),_.extend({valHooks:{option:{get:function(a){var b=_.find.attr(a,"value");return null!=b?b:_.trim(_.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(Y.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&_.nodeName(c.parentNode,"optgroup"))){if(b=_(c).val(),f)return b;g.push(b)}return g},set:function(a,b){for(var c,d,e=a.options,f=_.makeArray(b),g=e.length;g--;)d=e[g],(d.selected=_.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),_.each(["radio","checkbox"],function(){_.valHooks[this]={set:function(a,b){return _.isArray(b)?a.checked=_.inArray(_(a).val(),b)>=0:void 0}},Y.checkOn||(_.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),_.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){_.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),_.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var jc=_.now(),kc=/\?/;_.parseJSON=function(a){return JSON.parse(a+"")},_.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&_.error("Invalid XML: "+a),b};var lc,mc,nc=/#.*$/,oc=/([?&])_=[^&]*/,pc=/^(.*?):[ \t]*([^\r\n]*)$/gm,qc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rc=/^(?:GET|HEAD)$/,sc=/^\/\//,tc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,uc={},vc={},wc="*/".concat("*");try{mc=location.href}catch(xc){mc=Z.createElement("a"),mc.href="",mc=mc.href}lc=tc.exec(mc.toLowerCase())||[],_.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:mc,type:"GET",isLocal:qc.test(lc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":wc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":_.parseJSON,"text xml":_.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?L(L(a,_.ajaxSettings),b):L(_.ajaxSettings,a)},ajaxPrefilter:J(uc),ajaxTransport:J(vc),ajax:function(a,b){function c(a,b,c,g){var i,k,r,s,u,w=b;2!==t&&(t=2,h&&clearTimeout(h),d=void 0,f=g||"",v.readyState=a>0?4:0,i=a>=200&&300>a||304===a,c&&(s=M(l,v,c)),s=N(l,s,v,i),i?(l.ifModified&&(u=v.getResponseHeader("Last-Modified"),u&&(_.lastModified[e]=u),u=v.getResponseHeader("etag"),u&&(_.etag[e]=u)),204===a||"HEAD"===l.type?w="nocontent":304===a?w="notmodified":(w=s.state,k=s.data,r=s.error,i=!r)):(r=w,(a||!w)&&(w="error",0>a&&(a=0))),v.status=a,v.statusText=(b||w)+"",i?o.resolveWith(m,[k,w,v]):o.rejectWith(m,[v,w,r]),v.statusCode(q),q=void 0,j&&n.trigger(i?"ajaxSuccess":"ajaxError",[v,l,i?k:r]),p.fireWith(m,[v,w]),j&&(n.trigger("ajaxComplete",[v,l]),--_.active||_.event.trigger("ajaxStop")))}"object"==typeof a&&(b=a,a=void 0),b=b||{};var d,e,f,g,h,i,j,k,l=_.ajaxSetup({},b),m=l.context||l,n=l.context&&(m.nodeType||m.jquery)?_(m):_.event,o=_.Deferred(),p=_.Callbacks("once memory"),q=l.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!g)for(g={};b=pc.exec(f);)g[b[1].toLowerCase()]=b[2];b=g[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return d&&d.abort(b),c(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,l.url=((a||l.url||mc)+"").replace(nc,"").replace(sc,lc[1]+"//"),l.type=b.method||b.type||l.method||l.type,l.dataTypes=_.trim(l.dataType||"*").toLowerCase().match(nb)||[""],null==l.crossDomain&&(i=tc.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]===lc[1]&&i[2]===lc[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(lc[3]||("http:"===lc[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=_.param(l.data,l.traditional)),K(uc,l,b,v),2===t)return v;j=l.global,j&&0===_.active++&&_.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!rc.test(l.type),e=l.url,l.hasContent||(l.data&&(e=l.url+=(kc.test(e)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=oc.test(e)?e.replace(oc,"$1_="+jc++):e+(kc.test(e)?"&":"?")+"_="+jc++)),l.ifModified&&(_.lastModified[e]&&v.setRequestHeader("If-Modified-Since",_.lastModified[e]),_.etag[e]&&v.setRequestHeader("If-None-Match",_.etag[e])),(l.data&&l.hasContent&&l.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",l.contentType),v.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+wc+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)v.setRequestHeader(k,l.headers[k]);if(l.beforeSend&&(l.beforeSend.call(m,v,l)===!1||2===t))return v.abort();u="abort";for(k in{success:1,error:1,complete:1})v[k](l[k]);if(d=K(vc,l,b,v)){v.readyState=1,j&&n.trigger("ajaxSend",[v,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){v.abort("timeout")},l.timeout));try{t=1,d.send(r,c)}catch(w){if(!(2>t))throw w;c(-1,w)}}else c(-1,"No Transport");return v},getJSON:function(a,b,c){return _.get(a,b,c,"json")},getScript:function(a,b){return _.get(a,void 0,b,"script")}}),_.each(["get","post"],function(a,b){_[b]=function(a,c,d,e){return _.isFunction(c)&&(e=e||d,d=c,c=void 0),_.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){_.fn[b]=function(a){return this.on(b,a)}}),_._evalUrl=function(a){return _.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},_.fn.extend({wrapAll:function(a){var b;return _.isFunction(a)?this.each(function(b){_(this).wrapAll(a.call(this,b))}):(this[0]&&(b=_(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(_.isFunction(a)?function(b){_(this).wrapInner(a.call(this,b))}:function(){var b=_(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=_.isFunction(a);return this.each(function(c){_(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){_.nodeName(this,"body")||_(this).replaceWith(this.childNodes)}).end()}}),_.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},_.expr.filters.visible=function(a){return!_.expr.filters.hidden(a)};var yc=/%20/g,zc=/\[\]$/,Ac=/\r?\n/g,Bc=/^(?:submit|button|image|reset|file)$/i,Cc=/^(?:input|select|textarea|keygen)/i;_.param=function(a,b){var c,d=[],e=function(a,b){b=_.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=_.ajaxSettings&&_.ajaxSettings.traditional),_.isArray(a)||a.jquery&&!_.isPlainObject(a))_.each(a,function(){e(this.name,this.value)});else for(c in a)O(c,a[c],b,e);return d.join("&").replace(yc,"+")},_.fn.extend({serialize:function(){return _.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=_.prop(this,"elements");return a?_.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!_(this).is(":disabled")&&Cc.test(this.nodeName)&&!Bc.test(a)&&(this.checked||!yb.test(a))}).map(function(a,b){var c=_(this).val();return null==c?null:_.isArray(c)?_.map(c,function(a){return{name:b.name,value:a.replace(Ac,"\r\n")}}):{name:b.name,value:c.replace(Ac,"\r\n")}}).get()}}),_.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Dc=0,Ec={},Fc={0:200,1223:204},Gc=_.ajaxSettings.xhr();a.ActiveXObject&&_(a).on("unload",function(){for(var a in Ec)Ec[a]()}),Y.cors=!!Gc&&"withCredentials"in Gc,Y.ajax=Gc=!!Gc,_.ajaxTransport(function(a){var b;return Y.cors||Gc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Dc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Ec[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Fc[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Ec[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),_.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return _.globalEval(a),a}}}),_.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),_.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=_("--%>
+ <%----%>
+
+
+
+
+
+
+ <%----%>
+
+
+ <%----%>
+
+
+
+
+
+
+
+
+
+
+