Skip to content

Instantly share code, notes, and snippets.

@ahdinosaur
Created October 26, 2014 20:05
Show Gist options
  • Save ahdinosaur/c25cd8ef79da8f35f302 to your computer and use it in GitHub Desktop.
Save ahdinosaur/c25cd8ef79da8f35f302 to your computer and use it in GitHub Desktop.
requirebin sketch
// create graph:
var createGraph = require('ngraph.graph');
var createSvg = require('ngraph.svg');
var QS = require('query-string');
var graphGenerators = require('ngraph.generators');
function render (svg) {
var query = QS.parse(window.location.search.substring(1));
var graph = getGraphFromQueryString(query);
var graphics = createSvg(graph, {
interactive: true,
});
graphics.run();
return graphics.svgRoot;
}
function getGraphFromQueryString(query) {
var createGraph = graphGenerators[query.graph] || graphGenerators.grid;
return createGraph(getNumber(query.n), getNumber(query.m), getNumber(query.k));
}
function getNumber(string, defaultValue) {
var number = parseFloat(string);
return (typeof number === 'number') && !isNaN(number) ? number : (defaultValue || 10);
}
var svg;
function draw () {
if (!svg) {
svg = render();
}
svg.setAttribute('height', document.body.clientHeight);
svg.setAttribute('width', document.body.clientWidth);
}
window.addEventListener('resize', draw);
draw();
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){module.exports=function(subject){validateSubject(subject);var eventsStorage=createEventsStorage(subject);subject.on=eventsStorage.on;subject.off=eventsStorage.off;subject.fire=eventsStorage.fire;return subject};function createEventsStorage(subject){var registeredEvents=Object.create(null);return{on:function(eventName,callback,ctx){if(typeof callback!=="function"){throw new Error("callback is expected to be a function")}var handlers=registeredEvents[eventName];if(!handlers){handlers=registeredEvents[eventName]=[]}handlers.push({callback:callback,ctx:ctx});return subject},off:function(eventName,callback){var wantToRemoveAll=typeof eventName==="undefined";if(wantToRemoveAll){registeredEvents=Object.create(null);return subject}if(registeredEvents[eventName]){var deleteAllCallbacksForEvent=typeof callback!=="function";if(deleteAllCallbacksForEvent){delete registeredEvents[eventName]}else{var callbacks=registeredEvents[eventName];for(var i=0;i<callbacks.length;++i){if(callbacks[i].callback===callback){callbacks.splice(i,1)}}}}return subject},fire:function(eventName){var callbacks=registeredEvents[eventName];if(!callbacks){return subject}var fireArguments;if(arguments.length>1){fireArguments=Array.prototype.splice.call(arguments,1)}for(var i=0;i<callbacks.length;++i){var callbackInfo=callbacks[i];callbackInfo.callback.apply(callbackInfo.ctx,fireArguments)}return subject}}}function validateSubject(subject){if(!subject){throw new Error("Eventify cannot use falsy object as events subject")}var reservedWords=["on","fire","off"];for(var i=0;i<reservedWords.length;++i){if(subject.hasOwnProperty(reservedWords[i])){throw new Error("Subject cannot be eventified, since it already has property '"+reservedWords[i]+"'")}}}},{}],"ngraph.graph":[function(require,module,exports){module.exports=function(){var nodes=typeof Object.create==="function"?Object.create(null):{},links=[],multiEdges={},nodesCount=0,suspendEvents=0,changes=[],fireGraphChanged=function(graph){graph.fire("changed",changes)},enterModification=function(){suspendEvents+=1},exitModification=function(graph){suspendEvents-=1;if(suspendEvents===0&&changes.length>0){fireGraphChanged(graph);changes.length=0}},recordNodeChange=function(node,changeType){changes.push({node:node,changeType:changeType})},recordLinkChange=function(link,changeType){changes.push({link:link,changeType:changeType})},linkConnectionSymbol="👉 ";var graphPart={addNode:function(nodeId,data){if(typeof nodeId==="undefined"){throw new Error("Invalid node identifier")}enterModification();var node=this.getNode(nodeId);if(!node){node=new Node(nodeId);nodesCount++;recordNodeChange(node,"add")}else{recordNodeChange(node,"update")}node.data=data;nodes[nodeId]=node;exitModification(this);return node},addLink:function(fromId,toId,data){enterModification();var fromNode=this.getNode(fromId)||this.addNode(fromId);var toNode=this.getNode(toId)||this.addNode(toId);var linkId=fromId.toString()+linkConnectionSymbol+toId.toString();var isMultiEdge=multiEdges.hasOwnProperty(linkId);if(isMultiEdge||this.hasLink(fromId,toId)){if(!isMultiEdge){multiEdges[linkId]=0}linkId+="@"+ ++multiEdges[linkId]}var link=new Link(fromId,toId,data,linkId);links.push(link);fromNode.links.push(link);toNode.links.push(link);recordLinkChange(link,"add");exitModification(this);return link},removeLink:function(link){if(!link){return false}var idx=indexOfElementInArray(link,links);if(idx<0){return false}enterModification();links.splice(idx,1);var fromNode=this.getNode(link.fromId);var toNode=this.getNode(link.toId);if(fromNode){idx=indexOfElementInArray(link,fromNode.links);if(idx>=0){fromNode.links.splice(idx,1)}}if(toNode){idx=indexOfElementInArray(link,toNode.links);if(idx>=0){toNode.links.splice(idx,1)}}recordLinkChange(link,"remove");exitModification(this);return true},removeNode:function(nodeId){var node=this.getNode(nodeId);if(!node){return false}enterModification();while(node.links.length){var link=node.links[0];this.removeLink(link)}delete nodes[nodeId];nodesCount--;recordNodeChange(node,"remove");exitModification(this);return true},getNode:function(nodeId){return nodes[nodeId]},getNodesCount:function(){return nodesCount},getLinksCount:function(){return links.length},getLinks:function(nodeId){var node=this.getNode(nodeId);return node?node.links:null},forEachNode:function(callback){if(typeof callback!=="function"){return}var node;for(node in nodes){if(callback(nodes[node])){return}}},forEachLinkedNode:function(nodeId,callback,oriented){var node=this.getNode(nodeId),i,link,linkedNodeId;if(node&&node.links&&typeof callback==="function"){if(oriented){for(i=0;i<node.links.length;++i){link=node.links[i];if(link.fromId===nodeId){callback(nodes[link.toId],link)}}}else{for(i=0;i<node.links.length;++i){link=node.links[i];linkedNodeId=link.fromId===nodeId?link.toId:link.fromId;callback(nodes[linkedNodeId],link)}}}},forEachLink:function(callback){var i,length;if(typeof callback==="function"){for(i=0,length=links.length;i<length;++i){callback(links[i])}}},beginUpdate:function(){enterModification()},endUpdate:function(){exitModification(this)},clear:function(){var that=this;that.beginUpdate();that.forEachNode(function(node){that.removeNode(node.id)});that.endUpdate()},hasLink:function(fromNodeId,toNodeId){var node=this.getNode(fromNodeId),i;if(!node){return null}for(i=0;i<node.links.length;++i){var link=node.links[i];if(link.fromId===fromNodeId&&link.toId===toNodeId){return link}}return null}};var eventify=require("ngraph.events");eventify(graphPart);return graphPart};function indexOfElementInArray(element,array){if(array.indexOf){return array.indexOf(element)}var len=array.length,i;for(i=0;i<len;i+=1){if(array[i]===element){return i}}return-1}function Node(id){this.id=id;this.links=[];this.data=null}function Link(fromId,toId,data,id){this.fromId=fromId;this.toId=toId;this.data=data;this.id=id}},{"ngraph.events":1}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var merge=require("ngraph.merge");module.exports=getDefaultLayout;function getDefaultLayout(graph,settings){if(settings.layout)return settings.layout;settings=merge(settings,{physics:{springLength:30,springCoeff:8e-4,dragCoeff:.01,gravity:-1.2,theta:1}});var createLayout=require("ngraph.forcelayout");var physics=require("ngraph.physics.simulator");return createLayout(graph,physics(settings.physics))}},{"ngraph.forcelayout":5,"ngraph.merge":7,"ngraph.physics.simulator":8}],2:[function(require,module,exports){var svg=require("simplesvg");exports.nodeBuilder=nodeBuilder;exports.nodePositionCallback=nodePositionCallback;exports.linkBuilder=linkBuilder;exports.linkPositionCallback=linkPositionCallback;function nodeBuilder(node){return svg("rect").attr("width",10).attr("height",10).attr("fill","#00a2e8")}function nodePositionCallback(nodeUI,pos){nodeUI.attr("x",pos.x-5).attr("y",pos.y-5)}function linkBuilder(linkUI,pos){return svg("line").attr("stroke","#999")}function linkPositionCallback(linkUI,fromPos,toPos){linkUI.attr("x1",fromPos.x).attr("y1",fromPos.y).attr("x2",toPos.x).attr("y2",toPos.y)}},{simplesvg:22}],3:[function(require,module,exports){(function(window,document,exportName,undefined){"use strict";var VENDOR_PREFIXES=["","webkit","moz","MS","ms","o"];var TEST_ELEMENT=document.createElement("div");var TYPE_FUNCTION="function";var round=Math.round;var abs=Math.abs;var now=Date.now;function setTimeoutContext(fn,timeout,context){return setTimeout(bindFn(fn,context),timeout)}function invokeArrayArg(arg,fn,context){if(Array.isArray(arg)){each(arg,context[fn],context);return true}return false}function each(obj,iterator,context){var i;if(!obj){return}if(obj.forEach){obj.forEach(iterator,context)}else if(obj.length!==undefined){i=0;while(i<obj.length){iterator.call(context,obj[i],i,obj);i++}}else{for(i in obj){obj.hasOwnProperty(i)&&iterator.call(context,obj[i],i,obj)}}}function extend(dest,src,merge){var keys=Object.keys(src);var i=0;while(i<keys.length){if(!merge||merge&&dest[keys[i]]===undefined){dest[keys[i]]=src[keys[i]]}i++}return dest}function merge(dest,src){return extend(dest,src,true)}function inherit(child,base,properties){var baseP=base.prototype,childP;childP=child.prototype=Object.create(baseP);childP.constructor=child;childP._super=baseP;if(properties){extend(childP,properties)}}function bindFn(fn,context){return function boundFn(){return fn.apply(context,arguments)}}function boolOrFn(val,args){if(typeof val==TYPE_FUNCTION){return val.apply(args?args[0]||undefined:undefined,args)}return val}function ifUndefined(val1,val2){return val1===undefined?val2:val1}function addEventListeners(target,types,handler){each(splitStr(types),function(type){target.addEventListener(type,handler,false)})}function removeEventListeners(target,types,handler){each(splitStr(types),function(type){target.removeEventListener(type,handler,false)})}function hasParent(node,parent){while(node){if(node==parent){return true}node=node.parentNode}return false}function inStr(str,find){return str.indexOf(find)>-1}function splitStr(str){return str.trim().split(/\s+/g)}function inArray(src,find,findByKey){if(src.indexOf&&!findByKey){return src.indexOf(find)}else{var i=0;while(i<src.length){if(findByKey&&src[i][findByKey]==find||!findByKey&&src[i]===find){return i}i++}return-1}}function toArray(obj){return Array.prototype.slice.call(obj,0)}function uniqueArray(src,key,sort){var results=[];var values=[];var i=0;while(i<src.length){var val=key?src[i][key]:src[i];if(inArray(values,val)<0){results.push(src[i])}values[i]=val;i++}if(sort){if(!key){results=results.sort()}else{results=results.sort(function sortUniqueArray(a,b){return a[key]>b[key]})}}return results}function prefixed(obj,property){var prefix,prop;var camelProp=property[0].toUpperCase()+property.slice(1);var i=0;while(i<VENDOR_PREFIXES.length){prefix=VENDOR_PREFIXES[i];prop=prefix?prefix+camelProp:property;if(prop in obj){return prop}i++}return undefined}var _uniqueId=1;function uniqueId(){return _uniqueId++}function getWindowForElement(element){var doc=element.ownerDocument;return doc.defaultView||doc.parentWindow}var MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android/i;var SUPPORT_TOUCH="ontouchstart"in window;var SUPPORT_POINTER_EVENTS=prefixed(window,"PointerEvent")!==undefined;var SUPPORT_ONLY_TOUCH=SUPPORT_TOUCH&&MOBILE_REGEX.test(navigator.userAgent);var INPUT_TYPE_TOUCH="touch";var INPUT_TYPE_PEN="pen";var INPUT_TYPE_MOUSE="mouse";var INPUT_TYPE_KINECT="kinect";var COMPUTE_INTERVAL=25;var INPUT_START=1;var INPUT_MOVE=2;var INPUT_END=4;var INPUT_CANCEL=8;var DIRECTION_NONE=1;var DIRECTION_LEFT=2;var DIRECTION_RIGHT=4;var DIRECTION_UP=8;var DIRECTION_DOWN=16;var DIRECTION_HORIZONTAL=DIRECTION_LEFT|DIRECTION_RIGHT;var DIRECTION_VERTICAL=DIRECTION_UP|DIRECTION_DOWN;var DIRECTION_ALL=DIRECTION_HORIZONTAL|DIRECTION_VERTICAL;var PROPS_XY=["x","y"];var PROPS_CLIENT_XY=["clientX","clientY"];function Input(manager,callback){var self=this;this.manager=manager;this.callback=callback;this.element=manager.element;this.target=manager.options.inputTarget;this.domHandler=function(ev){if(boolOrFn(manager.options.enable,[manager])){self.handler(ev)}};this.init()}Input.prototype={handler:function(){},init:function(){this.evEl&&addEventListeners(this.element,this.evEl,this.domHandler);this.evTarget&&addEventListeners(this.target,this.evTarget,this.domHandler);this.evWin&&addEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&removeEventListeners(this.element,this.evEl,this.domHandler);this.evTarget&&removeEventListeners(this.target,this.evTarget,this.domHandler);this.evWin&&removeEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)}};function createInputInstance(manager){var Type;var inputClass=manager.options.inputClass;if(inputClass){Type=inputClass}else if(SUPPORT_POINTER_EVENTS){Type=PointerEventInput}else if(SUPPORT_ONLY_TOUCH){Type=TouchInput}else if(!SUPPORT_TOUCH){Type=MouseInput}else{Type=TouchMouseInput}return new Type(manager,inputHandler)}function inputHandler(manager,eventType,input){var pointersLen=input.pointers.length;var changedPointersLen=input.changedPointers.length;var isFirst=eventType&INPUT_START&&pointersLen-changedPointersLen===0;var isFinal=eventType&(INPUT_END|INPUT_CANCEL)&&pointersLen-changedPointersLen===0;input.isFirst=!!isFirst;input.isFinal=!!isFinal;if(isFirst){manager.session={}}input.eventType=eventType;computeInputData(manager,input);manager.emit("hammer.input",input);manager.recognize(input);manager.session.prevInput=input}function computeInputData(manager,input){var session=manager.session;var pointers=input.pointers;var pointersLength=pointers.length;if(!session.firstInput){session.firstInput=simpleCloneInputData(input)}if(pointersLength>1&&!session.firstMultiple){session.firstMultiple=simpleCloneInputData(input)}else if(pointersLength===1){session.firstMultiple=false}var firstInput=session.firstInput;var firstMultiple=session.firstMultiple;var offsetCenter=firstMultiple?firstMultiple.center:firstInput.center;var center=input.center=getCenter(pointers);input.timeStamp=now();input.deltaTime=input.timeStamp-firstInput.timeStamp;input.angle=getAngle(offsetCenter,center);input.distance=getDistance(offsetCenter,center);computeDeltaXY(session,input);input.offsetDirection=getDirection(input.deltaX,input.deltaY);input.scale=firstMultiple?getScale(firstMultiple.pointers,pointers):1;input.rotation=firstMultiple?getRotation(firstMultiple.pointers,pointers):0;computeIntervalInputData(session,input);var target=manager.element;if(hasParent(input.srcEvent.target,target)){target=input.srcEvent.target}input.target=target}function computeDeltaXY(session,input){var center=input.center;var offset=session.offsetDelta||{};var prevDelta=session.prevDelta||{};var prevInput=session.prevInput||{};if(input.eventType===INPUT_START||prevInput.eventType===INPUT_END){prevDelta=session.prevDelta={x:prevInput.deltaX||0,y:prevInput.deltaY||0};offset=session.offsetDelta={x:center.x,y:center.y}}input.deltaX=prevDelta.x+(center.x-offset.x);input.deltaY=prevDelta.y+(center.y-offset.y)}function computeIntervalInputData(session,input){var last=session.lastInterval||input,deltaTime=input.timeStamp-last.timeStamp,velocity,velocityX,velocityY,direction;if(input.eventType!=INPUT_CANCEL&&(deltaTime>COMPUTE_INTERVAL||last.velocity===undefined)){var deltaX=last.deltaX-input.deltaX;var deltaY=last.deltaY-input.deltaY;var v=getVelocity(deltaTime,deltaX,deltaY);velocityX=v.x;velocityY=v.y;velocity=abs(v.x)>abs(v.y)?v.x:v.y;direction=getDirection(deltaX,deltaY);session.lastInterval=input}else{velocity=last.velocity;velocityX=last.velocityX;velocityY=last.velocityY;direction=last.direction}input.velocity=velocity;input.velocityX=velocityX;input.velocityY=velocityY;input.direction=direction}function simpleCloneInputData(input){var pointers=[];var i=0;while(i<input.pointers.length){pointers[i]={clientX:round(input.pointers[i].clientX),clientY:round(input.pointers[i].clientY)};i++}return{timeStamp:now(),pointers:pointers,center:getCenter(pointers),deltaX:input.deltaX,deltaY:input.deltaY}}function getCenter(pointers){var pointersLength=pointers.length;if(pointersLength===1){return{x:round(pointers[0].clientX),y:round(pointers[0].clientY)}}var x=0,y=0,i=0;while(i<pointersLength){x+=pointers[i].clientX;y+=pointers[i].clientY;i++}return{x:round(x/pointersLength),y:round(y/pointersLength)}}function getVelocity(deltaTime,x,y){return{x:x/deltaTime||0,y:y/deltaTime||0}}function getDirection(x,y){if(x===y){return DIRECTION_NONE}if(abs(x)>=abs(y)){return x>0?DIRECTION_LEFT:DIRECTION_RIGHT}return y>0?DIRECTION_UP:DIRECTION_DOWN}function getDistance(p1,p2,props){if(!props){props=PROPS_XY}var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.sqrt(x*x+y*y)}function getAngle(p1,p2,props){if(!props){props=PROPS_XY}var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.atan2(y,x)*180/Math.PI}function getRotation(start,end){return getAngle(end[1],end[0],PROPS_CLIENT_XY)-getAngle(start[1],start[0],PROPS_CLIENT_XY)}function getScale(start,end){return getDistance(end[0],end[1],PROPS_CLIENT_XY)/getDistance(start[0],start[1],PROPS_CLIENT_XY)}var MOUSE_INPUT_MAP={mousedown:INPUT_START,mousemove:INPUT_MOVE,mouseup:INPUT_END};var MOUSE_ELEMENT_EVENTS="mousedown";var MOUSE_WINDOW_EVENTS="mousemove mouseup";function MouseInput(){this.evEl=MOUSE_ELEMENT_EVENTS;this.evWin=MOUSE_WINDOW_EVENTS;this.allow=true;this.pressed=false;Input.apply(this,arguments)}inherit(MouseInput,Input,{handler:function MEhandler(ev){var eventType=MOUSE_INPUT_MAP[ev.type];if(eventType&INPUT_START&&ev.button===0){this.pressed=true}if(eventType&INPUT_MOVE&&ev.which!==1){eventType=INPUT_END}if(!this.pressed||!this.allow){return}if(eventType&INPUT_END){this.pressed=false}this.callback(this.manager,eventType,{pointers:[ev],changedPointers:[ev],pointerType:INPUT_TYPE_MOUSE,srcEvent:ev})}});var POINTER_INPUT_MAP={pointerdown:INPUT_START,pointermove:INPUT_MOVE,pointerup:INPUT_END,pointercancel:INPUT_CANCEL,pointerout:INPUT_CANCEL};var IE10_POINTER_TYPE_ENUM={2:INPUT_TYPE_TOUCH,3:INPUT_TYPE_PEN,4:INPUT_TYPE_MOUSE,5:INPUT_TYPE_KINECT};var POINTER_ELEMENT_EVENTS="pointerdown";var POINTER_WINDOW_EVENTS="pointermove pointerup pointercancel";if(window.MSPointerEvent){POINTER_ELEMENT_EVENTS="MSPointerDown";POINTER_WINDOW_EVENTS="MSPointerMove MSPointerUp MSPointerCancel"}function PointerEventInput(){this.evEl=POINTER_ELEMENT_EVENTS;this.evWin=POINTER_WINDOW_EVENTS;Input.apply(this,arguments);this.store=this.manager.session.pointerEvents=[]}inherit(PointerEventInput,Input,{handler:function PEhandler(ev){var store=this.store;var removePointer=false;var eventTypeNormalized=ev.type.toLowerCase().replace("ms","");var eventType=POINTER_INPUT_MAP[eventTypeNormalized];var pointerType=IE10_POINTER_TYPE_ENUM[ev.pointerType]||ev.pointerType;var isTouch=pointerType==INPUT_TYPE_TOUCH;var storeIndex=inArray(store,ev.pointerId,"pointerId");if(eventType&INPUT_START&&(ev.button===0||isTouch)){if(storeIndex<0){store.push(ev);storeIndex=store.length-1}}else if(eventType&(INPUT_END|INPUT_CANCEL)){removePointer=true}if(storeIndex<0){return}store[storeIndex]=ev;this.callback(this.manager,eventType,{pointers:store,changedPointers:[ev],pointerType:pointerType,srcEvent:ev});if(removePointer){store.splice(storeIndex,1)}}});var SINGLE_TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL};var SINGLE_TOUCH_TARGET_EVENTS="touchstart";var SINGLE_TOUCH_WINDOW_EVENTS="touchstart touchmove touchend touchcancel";function SingleTouchInput(){this.evTarget=SINGLE_TOUCH_TARGET_EVENTS;this.evWin=SINGLE_TOUCH_WINDOW_EVENTS;this.started=false;Input.apply(this,arguments)}inherit(SingleTouchInput,Input,{handler:function TEhandler(ev){var type=SINGLE_TOUCH_INPUT_MAP[ev.type];if(type===INPUT_START){this.started=true}if(!this.started){return}var touches=normalizeSingleTouches.call(this,ev,type);if(type&(INPUT_END|INPUT_CANCEL)&&touches[0].length-touches[1].length===0){this.started=false}this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}});function normalizeSingleTouches(ev,type){var all=toArray(ev.touches);var changed=toArray(ev.changedTouches);if(type&(INPUT_END|INPUT_CANCEL)){all=uniqueArray(all.concat(changed),"identifier",true)}return[all,changed]}var TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL};var TOUCH_TARGET_EVENTS="touchstart touchmove touchend touchcancel";function TouchInput(){this.evTarget=TOUCH_TARGET_EVENTS;this.targetIds={};Input.apply(this,arguments)}inherit(TouchInput,Input,{handler:function MTEhandler(ev){var type=TOUCH_INPUT_MAP[ev.type];var touches=getTouches.call(this,ev,type);if(!touches){return}this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}});function getTouches(ev,type){var allTouches=toArray(ev.touches);var targetIds=this.targetIds;if(type&(INPUT_START|INPUT_MOVE)&&allTouches.length===1){targetIds[allTouches[0].identifier]=true;return[allTouches,allTouches]}var i,targetTouches,changedTouches=toArray(ev.changedTouches),changedTargetTouches=[],target=this.target;targetTouches=allTouches.filter(function(touch){return hasParent(touch.target,target)});if(type===INPUT_START){i=0;while(i<targetTouches.length){targetIds[targetTouches[i].identifier]=true;i++}}i=0;while(i<changedTouches.length){if(targetIds[changedTouches[i].identifier]){changedTargetTouches.push(changedTouches[i])}if(type&(INPUT_END|INPUT_CANCEL)){delete targetIds[changedTouches[i].identifier]}i++}if(!changedTargetTouches.length){return}return[uniqueArray(targetTouches.concat(changedTargetTouches),"identifier",true),changedTargetTouches]}function TouchMouseInput(){Input.apply(this,arguments);var handler=bindFn(this.handler,this);this.touch=new TouchInput(this.manager,handler);this.mouse=new MouseInput(this.manager,handler)}inherit(TouchMouseInput,Input,{handler:function TMEhandler(manager,inputEvent,inputData){var isTouch=inputData.pointerType==INPUT_TYPE_TOUCH,isMouse=inputData.pointerType==INPUT_TYPE_MOUSE;if(isTouch){this.mouse.allow=false}else if(isMouse&&!this.mouse.allow){return}if(inputEvent&(INPUT_END|INPUT_CANCEL)){this.mouse.allow=true}this.callback(manager,inputEvent,inputData)},destroy:function destroy(){this.touch.destroy();this.mouse.destroy()}});var PREFIXED_TOUCH_ACTION=prefixed(TEST_ELEMENT.style,"touchAction");var NATIVE_TOUCH_ACTION=PREFIXED_TOUCH_ACTION!==undefined;var TOUCH_ACTION_COMPUTE="compute";var TOUCH_ACTION_AUTO="auto";var TOUCH_ACTION_MANIPULATION="manipulation";var TOUCH_ACTION_NONE="none";var TOUCH_ACTION_PAN_X="pan-x";var TOUCH_ACTION_PAN_Y="pan-y";function TouchAction(manager,value){this.manager=manager;this.set(value)}TouchAction.prototype={set:function(value){if(value==TOUCH_ACTION_COMPUTE){value=this.compute()}if(NATIVE_TOUCH_ACTION){this.manager.element.style[PREFIXED_TOUCH_ACTION]=value}this.actions=value.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var actions=[];each(this.manager.recognizers,function(recognizer){if(boolOrFn(recognizer.options.enable,[recognizer])){actions=actions.concat(recognizer.getTouchAction())}});return cleanTouchActions(actions.join(" "))},preventDefaults:function(input){if(NATIVE_TOUCH_ACTION){return}var srcEvent=input.srcEvent;var direction=input.offsetDirection;if(this.manager.session.prevented){srcEvent.preventDefault();return}var actions=this.actions;var hasNone=inStr(actions,TOUCH_ACTION_NONE);var hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y);var hasPanX=inStr(actions,TOUCH_ACTION_PAN_X);if(hasNone||hasPanY&&direction&DIRECTION_HORIZONTAL||hasPanX&&direction&DIRECTION_VERTICAL){return this.preventSrc(srcEvent)}},preventSrc:function(srcEvent){this.manager.session.prevented=true;srcEvent.preventDefault()}};function cleanTouchActions(actions){if(inStr(actions,TOUCH_ACTION_NONE)){return TOUCH_ACTION_NONE}var hasPanX=inStr(actions,TOUCH_ACTION_PAN_X);var hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y);if(hasPanX&&hasPanY){return TOUCH_ACTION_PAN_X+" "+TOUCH_ACTION_PAN_Y}if(hasPanX||hasPanY){return hasPanX?TOUCH_ACTION_PAN_X:TOUCH_ACTION_PAN_Y}if(inStr(actions,TOUCH_ACTION_MANIPULATION)){return TOUCH_ACTION_MANIPULATION}return TOUCH_ACTION_AUTO}var STATE_POSSIBLE=1;var STATE_BEGAN=2;var STATE_CHANGED=4;var STATE_ENDED=8;var STATE_RECOGNIZED=STATE_ENDED;var STATE_CANCELLED=16;var STATE_FAILED=32;function Recognizer(options){this.id=uniqueId();this.manager=null;this.options=merge(options||{},this.defaults);this.options.enable=ifUndefined(this.options.enable,true);this.state=STATE_POSSIBLE;this.simultaneous={};this.requireFail=[]}Recognizer.prototype={defaults:{},set:function(options){extend(this.options,options);this.manager&&this.manager.touchAction.update();return this},recognizeWith:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"recognizeWith",this)){return this}var simultaneous=this.simultaneous;otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);if(!simultaneous[otherRecognizer.id]){simultaneous[otherRecognizer.id]=otherRecognizer;otherRecognizer.recognizeWith(this)}return this},dropRecognizeWith:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"dropRecognizeWith",this)){return this}otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);delete this.simultaneous[otherRecognizer.id];return this},requireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"requireFailure",this)){return this}var requireFail=this.requireFail;otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);if(inArray(requireFail,otherRecognizer)===-1){requireFail.push(otherRecognizer);otherRecognizer.requireFailure(this)}return this},dropRequireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"dropRequireFailure",this)){return this}otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);var index=inArray(this.requireFail,otherRecognizer);if(index>-1){this.requireFail.splice(index,1)}return this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(otherRecognizer){return!!this.simultaneous[otherRecognizer.id]},emit:function(input){var self=this;var state=this.state;function emit(withState){self.manager.emit(self.options.event+(withState?stateStr(state):""),input)}if(state<STATE_ENDED){emit(true)}emit();if(state>=STATE_ENDED){emit(true)}},tryEmit:function(input){if(this.canEmit()){return this.emit(input)}this.state=STATE_FAILED},canEmit:function(){var i=0;while(i<this.requireFail.length){if(!(this.requireFail[i].state&(STATE_FAILED|STATE_POSSIBLE))){return false}i++}return true},recognize:function(inputData){var inputDataClone=extend({},inputData);if(!boolOrFn(this.options.enable,[this,inputDataClone])){this.reset();this.state=STATE_FAILED;return}if(this.state&(STATE_RECOGNIZED|STATE_CANCELLED|STATE_FAILED)){this.state=STATE_POSSIBLE}this.state=this.process(inputDataClone);if(this.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED|STATE_CANCELLED)){this.tryEmit(inputDataClone)}},process:function(inputData){},getTouchAction:function(){},reset:function(){}};function stateStr(state){if(state&STATE_CANCELLED){return"cancel"}else if(state&STATE_ENDED){return"end"}else if(state&STATE_CHANGED){return"move"}else if(state&STATE_BEGAN){return"start"}return""}function directionStr(direction){if(direction==DIRECTION_DOWN){return"down"}else if(direction==DIRECTION_UP){return"up"}else if(direction==DIRECTION_LEFT){return"left"}else if(direction==DIRECTION_RIGHT){return"right"}return""}function getRecognizerByNameIfManager(otherRecognizer,recognizer){var manager=recognizer.manager;if(manager){return manager.get(otherRecognizer)}return otherRecognizer}function AttrRecognizer(){Recognizer.apply(this,arguments)}inherit(AttrRecognizer,Recognizer,{defaults:{pointers:1},attrTest:function(input){var optionPointers=this.options.pointers;return optionPointers===0||input.pointers.length===optionPointers},process:function(input){var state=this.state;var eventType=input.eventType;var isRecognized=state&(STATE_BEGAN|STATE_CHANGED);var isValid=this.attrTest(input);if(isRecognized&&(eventType&INPUT_CANCEL||!isValid)){return state|STATE_CANCELLED}else if(isRecognized||isValid){if(eventType&INPUT_END){return state|STATE_ENDED}else if(!(state&STATE_BEGAN)){return STATE_BEGAN}return state|STATE_CHANGED}return STATE_FAILED}});function PanRecognizer(){AttrRecognizer.apply(this,arguments);this.pX=null;this.pY=null}inherit(PanRecognizer,AttrRecognizer,{defaults:{event:"pan",threshold:10,pointers:1,direction:DIRECTION_ALL},getTouchAction:function(){var direction=this.options.direction;var actions=[];if(direction&DIRECTION_HORIZONTAL){actions.push(TOUCH_ACTION_PAN_Y)}if(direction&DIRECTION_VERTICAL){actions.push(TOUCH_ACTION_PAN_X)}return actions},directionTest:function(input){var options=this.options;var hasMoved=true;var distance=input.distance;var direction=input.direction;var x=input.deltaX;var y=input.deltaY;if(!(direction&options.direction)){if(options.direction&DIRECTION_HORIZONTAL){direction=x===0?DIRECTION_NONE:x<0?DIRECTION_LEFT:DIRECTION_RIGHT;hasMoved=x!=this.pX;distance=Math.abs(input.deltaX)}else{direction=y===0?DIRECTION_NONE:y<0?DIRECTION_UP:DIRECTION_DOWN;hasMoved=y!=this.pY;distance=Math.abs(input.deltaY)}}input.direction=direction;return hasMoved&&distance>options.threshold&&direction&options.direction},attrTest:function(input){return AttrRecognizer.prototype.attrTest.call(this,input)&&(this.state&STATE_BEGAN||!(this.state&STATE_BEGAN)&&this.directionTest(input))},emit:function(input){this.pX=input.deltaX;this.pY=input.deltaY;var direction=directionStr(input.direction);if(direction){this.manager.emit(this.options.event+direction,input)}this._super.emit.call(this,input)}});function PinchRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.scale-1)>this.options.threshold||this.state&STATE_BEGAN)},emit:function(input){this._super.emit.call(this,input);if(input.scale!==1){var inOut=input.scale<1?"in":"out";this.manager.emit(this.options.event+inOut,input)}}});function PressRecognizer(){Recognizer.apply(this,arguments);this._timer=null;this._input=null}inherit(PressRecognizer,Recognizer,{defaults:{event:"press",pointers:1,time:500,threshold:5},getTouchAction:function(){return[TOUCH_ACTION_AUTO]},process:function(input){var options=this.options;var validPointers=input.pointers.length===options.pointers;var validMovement=input.distance<options.threshold;var validTime=input.deltaTime>options.time;this._input=input;if(!validMovement||!validPointers||input.eventType&(INPUT_END|INPUT_CANCEL)&&!validTime){this.reset()}else if(input.eventType&INPUT_START){this.reset();this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED;this.tryEmit()},options.time,this)}else if(input.eventType&INPUT_END){return STATE_RECOGNIZED}return STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(input){if(this.state!==STATE_RECOGNIZED){return}if(input&&input.eventType&INPUT_END){this.manager.emit(this.options.event+"up",input)}else{this._input.timeStamp=now();this.manager.emit(this.options.event,this._input)}}});function RotateRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.rotation)>this.options.threshold||this.state&STATE_BEGAN)}});function SwipeRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:"swipe",threshold:10,velocity:.65,direction:DIRECTION_HORIZONTAL|DIRECTION_VERTICAL,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)
},attrTest:function(input){var direction=this.options.direction;var velocity;if(direction&(DIRECTION_HORIZONTAL|DIRECTION_VERTICAL)){velocity=input.velocity}else if(direction&DIRECTION_HORIZONTAL){velocity=input.velocityX}else if(direction&DIRECTION_VERTICAL){velocity=input.velocityY}return this._super.attrTest.call(this,input)&&direction&input.direction&&input.distance>this.options.threshold&&abs(velocity)>this.options.velocity&&input.eventType&INPUT_END},emit:function(input){var direction=directionStr(input.direction);if(direction){this.manager.emit(this.options.event+direction,input)}this.manager.emit(this.options.event,input)}});function TapRecognizer(){Recognizer.apply(this,arguments);this.pTime=false;this.pCenter=false;this._timer=null;this._input=null;this.count=0}inherit(TapRecognizer,Recognizer,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[TOUCH_ACTION_MANIPULATION]},process:function(input){var options=this.options;var validPointers=input.pointers.length===options.pointers;var validMovement=input.distance<options.threshold;var validTouchTime=input.deltaTime<options.time;this.reset();if(input.eventType&INPUT_START&&this.count===0){return this.failTimeout()}if(validMovement&&validTouchTime&&validPointers){if(input.eventType!=INPUT_END){return this.failTimeout()}var validInterval=this.pTime?input.timeStamp-this.pTime<options.interval:true;var validMultiTap=!this.pCenter||getDistance(this.pCenter,input.center)<options.posThreshold;this.pTime=input.timeStamp;this.pCenter=input.center;if(!validMultiTap||!validInterval){this.count=1}else{this.count+=1}this._input=input;var tapCount=this.count%options.taps;if(tapCount===0){if(!this.hasRequireFailures()){return STATE_RECOGNIZED}else{this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED;this.tryEmit()},options.interval,this);return STATE_BEGAN}}}return STATE_FAILED},failTimeout:function(){this._timer=setTimeoutContext(function(){this.state=STATE_FAILED},this.options.interval,this);return STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(){if(this.state==STATE_RECOGNIZED){this._input.tapCount=this.count;this.manager.emit(this.options.event,this._input)}}});function Hammer(element,options){options=options||{};options.recognizers=ifUndefined(options.recognizers,Hammer.defaults.preset);return new Manager(element,options)}Hammer.VERSION="2.0.4";Hammer.defaults={domEvents:false,touchAction:TOUCH_ACTION_COMPUTE,enable:true,inputTarget:null,inputClass:null,preset:[[RotateRecognizer,{enable:false}],[PinchRecognizer,{enable:false},["rotate"]],[SwipeRecognizer,{direction:DIRECTION_HORIZONTAL}],[PanRecognizer,{direction:DIRECTION_HORIZONTAL},["swipe"]],[TapRecognizer],[TapRecognizer,{event:"doubletap",taps:2},["tap"]],[PressRecognizer]],cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};var STOP=1;var FORCED_STOP=2;function Manager(element,options){options=options||{};this.options=merge(options,Hammer.defaults);this.options.inputTarget=this.options.inputTarget||element;this.handlers={};this.session={};this.recognizers=[];this.element=element;this.input=createInputInstance(this);this.touchAction=new TouchAction(this,this.options.touchAction);toggleCssProps(this,true);each(options.recognizers,function(item){var recognizer=this.add(new item[0](item[1]));item[2]&&recognizer.recognizeWith(item[2]);item[3]&&recognizer.requireFailure(item[3])},this)}Manager.prototype={set:function(options){extend(this.options,options);if(options.touchAction){this.touchAction.update()}if(options.inputTarget){this.input.destroy();this.input.target=options.inputTarget;this.input.init()}return this},stop:function(force){this.session.stopped=force?FORCED_STOP:STOP},recognize:function(inputData){var session=this.session;if(session.stopped){return}this.touchAction.preventDefaults(inputData);var recognizer;var recognizers=this.recognizers;var curRecognizer=session.curRecognizer;if(!curRecognizer||curRecognizer&&curRecognizer.state&STATE_RECOGNIZED){curRecognizer=session.curRecognizer=null}var i=0;while(i<recognizers.length){recognizer=recognizers[i];if(session.stopped!==FORCED_STOP&&(!curRecognizer||recognizer==curRecognizer||recognizer.canRecognizeWith(curRecognizer))){recognizer.recognize(inputData)}else{recognizer.reset()}if(!curRecognizer&&recognizer.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED)){curRecognizer=session.curRecognizer=recognizer}i++}},get:function(recognizer){if(recognizer instanceof Recognizer){return recognizer}var recognizers=this.recognizers;for(var i=0;i<recognizers.length;i++){if(recognizers[i].options.event==recognizer){return recognizers[i]}}return null},add:function(recognizer){if(invokeArrayArg(recognizer,"add",this)){return this}var existing=this.get(recognizer.options.event);if(existing){this.remove(existing)}this.recognizers.push(recognizer);recognizer.manager=this;this.touchAction.update();return recognizer},remove:function(recognizer){if(invokeArrayArg(recognizer,"remove",this)){return this}var recognizers=this.recognizers;recognizer=this.get(recognizer);recognizers.splice(inArray(recognizers,recognizer),1);this.touchAction.update();return this},on:function(events,handler){var handlers=this.handlers;each(splitStr(events),function(event){handlers[event]=handlers[event]||[];handlers[event].push(handler)});return this},off:function(events,handler){var handlers=this.handlers;each(splitStr(events),function(event){if(!handler){delete handlers[event]}else{handlers[event].splice(inArray(handlers[event],handler),1)}});return this},emit:function(event,data){if(this.options.domEvents){triggerDomEvent(event,data)}var handlers=this.handlers[event]&&this.handlers[event].slice();if(!handlers||!handlers.length){return}data.type=event;data.preventDefault=function(){data.srcEvent.preventDefault()};var i=0;while(i<handlers.length){handlers[i](data);i++}},destroy:function(){this.element&&toggleCssProps(this,false);this.handlers={};this.session={};this.input.destroy();this.element=null}};function toggleCssProps(manager,add){var element=manager.element;each(manager.options.cssProps,function(value,name){element.style[prefixed(element.style,name)]=add?value:""})}function triggerDomEvent(event,data){var gestureEvent=document.createEvent("Event");gestureEvent.initEvent(event,true,true);gestureEvent.gesture=data;data.target.dispatchEvent(gestureEvent)}extend(Hammer,{INPUT_START:INPUT_START,INPUT_MOVE:INPUT_MOVE,INPUT_END:INPUT_END,INPUT_CANCEL:INPUT_CANCEL,STATE_POSSIBLE:STATE_POSSIBLE,STATE_BEGAN:STATE_BEGAN,STATE_CHANGED:STATE_CHANGED,STATE_ENDED:STATE_ENDED,STATE_RECOGNIZED:STATE_RECOGNIZED,STATE_CANCELLED:STATE_CANCELLED,STATE_FAILED:STATE_FAILED,DIRECTION_NONE:DIRECTION_NONE,DIRECTION_LEFT:DIRECTION_LEFT,DIRECTION_RIGHT:DIRECTION_RIGHT,DIRECTION_UP:DIRECTION_UP,DIRECTION_DOWN:DIRECTION_DOWN,DIRECTION_HORIZONTAL:DIRECTION_HORIZONTAL,DIRECTION_VERTICAL:DIRECTION_VERTICAL,DIRECTION_ALL:DIRECTION_ALL,Manager:Manager,Input:Input,TouchAction:TouchAction,TouchInput:TouchInput,MouseInput:MouseInput,PointerEventInput:PointerEventInput,TouchMouseInput:TouchMouseInput,SingleTouchInput:SingleTouchInput,Recognizer:Recognizer,AttrRecognizer:AttrRecognizer,Tap:TapRecognizer,Pan:PanRecognizer,Swipe:SwipeRecognizer,Pinch:PinchRecognizer,Rotate:RotateRecognizer,Press:PressRecognizer,on:addEventListeners,off:removeEventListeners,each:each,merge:merge,extend:extend,inherit:inherit,bindFn:bindFn,prefixed:prefixed});if(typeof define==TYPE_FUNCTION&&define.amd){define(function(){return Hammer})}else if(typeof module!="undefined"&&module.exports){module.exports=Hammer}else{window[exportName]=Hammer}})(window,document,"Hammer")},{}],4:[function(require,module,exports){module.exports=function(subject){validateSubject(subject);var eventsStorage=createEventsStorage(subject);subject.on=eventsStorage.on;subject.off=eventsStorage.off;subject.fire=eventsStorage.fire;return subject};function createEventsStorage(subject){var registeredEvents=Object.create(null);return{on:function(eventName,callback,ctx){if(typeof callback!=="function"){throw new Error("callback is expected to be a function")}var handlers=registeredEvents[eventName];if(!handlers){handlers=registeredEvents[eventName]=[]}handlers.push({callback:callback,ctx:ctx});return subject},off:function(eventName,callback){var wantToRemoveAll=typeof eventName==="undefined";if(wantToRemoveAll){registeredEvents=Object.create(null);return subject}if(registeredEvents[eventName]){var deleteAllCallbacksForEvent=typeof callback!=="function";if(deleteAllCallbacksForEvent){delete registeredEvents[eventName]}else{var callbacks=registeredEvents[eventName];for(var i=0;i<callbacks.length;++i){if(callbacks[i].callback===callback){callbacks.splice(i,1)}}}}return subject},fire:function(eventName){var callbacks=registeredEvents[eventName];if(!callbacks){return subject}var fireArguments;if(arguments.length>1){fireArguments=Array.prototype.splice.call(arguments,1)}for(var i=0;i<callbacks.length;++i){var callbackInfo=callbacks[i];callbackInfo.callback.apply(callbackInfo.ctx,fireArguments)}return subject}}}function validateSubject(subject){if(!subject){throw new Error("Eventify cannot use falsy object as events subject")}var reservedWords=["on","fire","off"];for(var i=0;i<reservedWords.length;++i){if(subject.hasOwnProperty(reservedWords[i])){throw new Error("Subject cannot be eventified, since it already has property '"+reservedWords[i]+"'")}}}},{}],5:[function(require,module,exports){module.exports=createLayout;var MAX_MOVEMENT=.001;function createLayout(graph,physicsSimulator){if(!graph){throw new Error("Graph structure cannot be undefined")}var simulator=require("ngraph.physics.simulator"),physics=require("ngraph.physics.primitives");physicsSimulator=physicsSimulator||simulator();var nodeBodies=typeof Object.create==="function"?Object.create(null):{},springs={};initPhysics();listenToGraphEvents();return{step:function(){var totalMovement=physicsSimulator.step();return totalMovement<MAX_MOVEMENT},getNodePosition:function(nodeId){return getInitializedBody(nodeId).pos},setNodePosition:function(nodeId,x,y){var body=getInitializedBody(nodeId);body.prevPos.x=body.pos.x=x;body.prevPos.y=body.pos.y=y},getLinkPosition:function(linkId){var spring=springs[linkId];if(spring){return{from:spring.from.pos,to:spring.to.pos}}},getGraphRect:function(){return physicsSimulator.getBBox()},pinNode:function(node,isPinned){var body=getInitializedBody(node.id);body.isPinned=!!isPinned},isNodePinned:function(node){return getInitializedBody(node.id).isPinned},dispose:function(){graph.off("changed",onGraphChanged)},simulator:physicsSimulator};function listenToGraphEvents(){graph.on("changed",onGraphChanged)}function onGraphChanged(changes){for(var i=0;i<changes.length;++i){var change=changes[i];if(change.changeType==="add"){if(change.node){initBody(change.node.id)}if(change.link){initLink(change.link)}}else if(change.changeType==="remove"){if(change.node){releaseNode(change.node)}if(change.link){releaseLink(change.link)}}}}function initPhysics(){graph.forEachNode(function(node){initBody(node.id)});graph.forEachLink(initLink)}function initBody(nodeId){var body=nodeBodies[nodeId];if(!body){var node=graph.getNode(nodeId);if(!node){throw new Error("initBody() was called with unknown node id")}var pos=node.position;if(!pos){var neighbors=getNeighborBodies(node);pos=physicsSimulator.getBestNewBodyPosition(neighbors)}body=physicsSimulator.addBodyAt(pos);nodeBodies[nodeId]=body;updateBodyMass(nodeId);if(isNodeOriginallyPinned(node)){body.isPinned=true}}}function releaseNode(node){var nodeId=node.id;var body=nodeBodies[nodeId];if(body){nodeBodies[nodeId]=null;delete nodeBodies[nodeId];physicsSimulator.removeBody(body)}}function initLink(link){updateBodyMass(link.fromId);updateBodyMass(link.toId);var fromBody=nodeBodies[link.fromId],toBody=nodeBodies[link.toId],spring=physicsSimulator.addSpring(fromBody,toBody,link.length);springs[link.id]=spring}function releaseLink(link){var spring=springs[link.id];if(spring){var from=graph.getNode(link.fromId),to=graph.getNode(link.toId);if(from)updateBodyMass(from.id);if(to)updateBodyMass(to.id);delete springs[link.id];physicsSimulator.removeSpring(spring)}}function getNeighborBodies(node){var neighbors=[];if(!node.links){return neighbors}var maxNeighbors=Math.min(node.links.length,2);for(var i=0;i<maxNeighbors;++i){var link=node.links[i];var otherBody=link.fromId!==node.id?nodeBodies[link.fromId]:nodeBodies[link.toId];if(otherBody&&otherBody.pos){neighbors.push(otherBody)}}return neighbors}function updateBodyMass(nodeId){var body=nodeBodies[nodeId];body.mass=nodeMass(nodeId)}function isNodeOriginallyPinned(node){return node&&(node.isPinned||node.data&&node.data.isPinned)}function getInitializedBody(nodeId){var body=nodeBodies[nodeId];if(!body){initBody(nodeId);body=nodeBodies[nodeId]}return body}function nodeMass(nodeId){return 1+graph.getLinks(nodeId).length/3}}},{"ngraph.physics.primitives":6,"ngraph.physics.simulator":8}],6:[function(require,module,exports){module.exports={Body:Body,Vector2d:Vector2d,Body3d:Body3d,Vector3d:Vector3d};function Body(x,y){this.pos=new Vector2d(x,y);this.prevPos=new Vector2d(x,y);this.force=new Vector2d;this.velocity=new Vector2d;this.mass=1}Body.prototype.setPosition=function(x,y){this.prevPos.x=this.pos.x=x;this.prevPos.y=this.pos.y=y};function Vector2d(x,y){if(x&&typeof x!=="number"){this.x=typeof x.x==="number"?x.x:0;this.y=typeof x.y==="number"?x.y:0}else{this.x=typeof x==="number"?x:0;this.y=typeof y==="number"?y:0}}Vector2d.prototype.reset=function(){this.x=this.y=0};function Body3d(x,y,z){this.pos=new Vector3d(x,y,z);this.prevPos=new Vector3d(x,y,z);this.force=new Vector3d;this.velocity=new Vector3d;this.mass=1}Body3d.prototype.setPosition=function(x,y,z){this.prevPos.x=this.pos.x=x;this.prevPos.y=this.pos.y=y;this.prevPos.z=this.pos.z=z};function Vector3d(x,y,z){if(x&&typeof x!=="number"){this.x=typeof x.x==="number"?x.x:0;this.y=typeof x.y==="number"?x.y:0;this.z=typeof x.z==="number"?x.z:0}else{this.x=typeof x==="number"?x:0;this.y=typeof y==="number"?y:0;this.z=typeof z==="number"?z:0}}Vector3d.prototype.reset=function(){this.x=this.y=this.z=0}},{}],7:[function(require,module,exports){module.exports=merge;function merge(target,options){var key;if(!target){target={}}if(options){for(key in options){if(options.hasOwnProperty(key)){var targetHasIt=target.hasOwnProperty(key),optionsValueType=typeof options[key],shouldReplace=!targetHasIt||typeof target[key]!==optionsValueType;if(shouldReplace){target[key]=options[key]}else if(optionsValueType==="object"){target[key]=merge(target[key],options[key])}}}}return target}},{}],8:[function(require,module,exports){module.exports=physicsSimulator;function physicsSimulator(settings){var Spring=require("./lib/spring");var expose=require("ngraph.expose");var merge=require("ngraph.merge");settings=merge(settings,{springLength:30,springCoeff:8e-4,gravity:-1.2,theta:.8,dragCoeff:.02,timeStep:20});var createQuadTree=settings.createQuadTree||require("ngraph.quadtreebh");var createBounds=settings.createBounds||require("./lib/bounds");var createDragForce=settings.createDragForce||require("./lib/dragForce");var createSpringForce=settings.createSpringForce||require("./lib/springForce");var integrate=settings.integrator||require("./lib/eulerIntegrator");var createBody=settings.createBody||require("./lib/createBody");var bodies=[],springs=[],quadTree=createQuadTree(settings),bounds=createBounds(bodies,settings),springForce=createSpringForce(settings),dragForce=createDragForce(settings);var publicApi={bodies:bodies,step:function(){accumulateForces();var totalMovement=integrate(bodies,settings.timeStep);bounds.update();return totalMovement},addBody:function(body){if(!body){throw new Error("Body is required")}bodies.push(body);return body},addBodyAt:function(pos){if(!pos){throw new Error("Body position is required")}var body=createBody(pos);bodies.push(body);return body},removeBody:function(body){if(!body){return}var idx=bodies.indexOf(body);if(idx<0){return}bodies.splice(idx,1);if(bodies.length===0){bounds.reset()}return true},addSpring:function(body1,body2,springLength,springWeight,springCoefficient){if(!body1||!body2){throw new Error("Cannot add null spring to force simulator")}if(typeof springLength!=="number"){springLength=-1}var spring=new Spring(body1,body2,springLength,springCoefficient>=0?springCoefficient:-1,springWeight);springs.push(spring);return spring},removeSpring:function(spring){if(!spring){return}var idx=springs.indexOf(spring);if(idx>-1){springs.splice(idx,1);return true}},getBestNewBodyPosition:function(neighbors){return bounds.getBestNewPosition(neighbors)},getBBox:function(){return bounds.box},gravity:function(value){if(value!==undefined){settings.gravity=value;quadTree.options({gravity:value});return this}else{return settings.gravity}},theta:function(value){if(value!==undefined){settings.theta=value;quadTree.options({theta:value});return this}else{return settings.theta}}};expose(settings,publicApi);return publicApi;function accumulateForces(){var body,i=bodies.length;if(i){quadTree.insertBodies(bodies);while(i--){body=bodies[i];body.force.reset();quadTree.updateBodyForce(body);dragForce.update(body)}}i=springs.length;while(i--){springForce.update(springs[i])}}}},{"./lib/bounds":9,"./lib/createBody":10,"./lib/dragForce":11,"./lib/eulerIntegrator":12,"./lib/spring":13,"./lib/springForce":14,"ngraph.expose":15,"ngraph.merge":7,"ngraph.quadtreebh":17}],9:[function(require,module,exports){module.exports=function(bodies,settings){var random=require("ngraph.random").random(42);var boundingBox={x1:0,y1:0,x2:0,y2:0};return{box:boundingBox,update:updateBoundingBox,reset:function(){boundingBox.x1=boundingBox.y1=0;boundingBox.x2=boundingBox.y2=0},getBestNewPosition:function(neighbors){var graphRect=boundingBox;var baseX=0,baseY=0;if(neighbors.length){for(var i=0;i<neighbors.length;++i){baseX+=neighbors[i].pos.x;baseY+=neighbors[i].pos.y}baseX/=neighbors.length;baseY/=neighbors.length}else{baseX=(graphRect.x1+graphRect.x2)/2;baseY=(graphRect.y1+graphRect.y2)/2}var springLength=settings.springLength;return{x:baseX+random.next(springLength)-springLength/2,y:baseY+random.next(springLength)-springLength/2}}};function updateBoundingBox(){var i=bodies.length;if(i===0){return}var x1=Number.MAX_VALUE,y1=Number.MAX_VALUE,x2=Number.MIN_VALUE,y2=Number.MIN_VALUE;while(i--){var body=bodies[i];if(body.isPinned){body.pos.x=body.prevPos.x;body.pos.y=body.prevPos.y}else{body.prevPos.x=body.pos.x;body.prevPos.y=body.pos.y}if(body.pos.x<x1){x1=body.pos.x}if(body.pos.x>x2){x2=body.pos.x}if(body.pos.y<y1){y1=body.pos.y}if(body.pos.y>y2){y2=body.pos.y}}boundingBox.x1=x1;boundingBox.x2=x2;boundingBox.y1=y1;boundingBox.y2=y2}}},{"ngraph.random":21}],10:[function(require,module,exports){var physics=require("ngraph.physics.primitives");module.exports=function(pos){return new physics.Body(pos)}},{"ngraph.physics.primitives":16}],11:[function(require,module,exports){module.exports=function(options){var merge=require("ngraph.merge"),expose=require("ngraph.expose");options=merge(options,{dragCoeff:.02});var api={update:function(body){body.force.x-=options.dragCoeff*body.velocity.x;body.force.y-=options.dragCoeff*body.velocity.y}};expose(options,api,["dragCoeff"]);return api}},{"ngraph.expose":15,"ngraph.merge":7}],12:[function(require,module,exports){module.exports=integrate;function integrate(bodies,timeStep){var dx=0,tx=0,dy=0,ty=0,i,max=bodies.length;for(i=0;i<max;++i){var body=bodies[i],coeff=timeStep/body.mass;body.velocity.x+=coeff*body.force.x;body.velocity.y+=coeff*body.force.y;var vx=body.velocity.x,vy=body.velocity.y,v=Math.sqrt(vx*vx+vy*vy);if(v>1){body.velocity.x=vx/v;body.velocity.y=vy/v}dx=timeStep*body.velocity.x;dy=timeStep*body.velocity.y;body.pos.x+=dx;body.pos.y+=dy;tx+=dx;ty+=dy}return(tx*tx+ty*ty)/bodies.length}},{}],13:[function(require,module,exports){module.exports=Spring;function Spring(fromBody,toBody,length,coeff,weight){this.from=fromBody;this.to=toBody;this.length=length;this.coeff=coeff;this.weight=typeof weight==="number"?weight:1}},{}],14:[function(require,module,exports){module.exports=function(options){var merge=require("ngraph.merge");var random=require("ngraph.random").random(42);var expose=require("ngraph.expose");options=merge(options,{springCoeff:2e-4,springLength:80});var api={update:function(spring){var body1=spring.from,body2=spring.to,length=spring.length<0?options.springLength:spring.length,dx=body2.pos.x-body1.pos.x,dy=body2.pos.y-body1.pos.y,r=Math.sqrt(dx*dx+dy*dy);if(r===0){dx=(random.nextDouble()-.5)/50;dy=(random.nextDouble()-.5)/50;r=Math.sqrt(dx*dx+dy*dy)}var d=r-length;var coeff=(!spring.coeff||spring.coeff<0?options.springCoeff:spring.coeff)*d/r*spring.weight;body1.force.x+=coeff*dx;body1.force.y+=coeff*dy;body2.force.x-=coeff*dx;body2.force.y-=coeff*dy}};expose(options,api,["springCoeff","springLength"]);return api}},{"ngraph.expose":15,"ngraph.merge":7,"ngraph.random":21}],15:[function(require,module,exports){module.exports=exposeProperties;function exposeProperties(settings,target,filter){var needsFilter=Object.prototype.toString.call(filter)==="[object Array]";if(needsFilter){for(var i=0;i<filter.length;++i){augment(settings,target,filter[i])}}else{for(var key in settings){augment(settings,target,key)}}}function augment(source,target,key){if(source.hasOwnProperty(key)){if(typeof target[key]==="function"){return}target[key]=function(value){if(value!==undefined){source[key]=value;return target}return source[key]}}}},{}],16:[function(require,module,exports){module.exports={Body:Body,Vector2d:Vector2d,Body3d:Body3d,Vector3d:Vector3d};function Body(x,y){this.pos=new Vector2d(x,y);this.prevPos=new Vector2d(x,y);this.force=new Vector2d;this.velocity=new Vector2d;this.mass=1}function Vector2d(x,y){if(x&&typeof x!=="number"){this.x=typeof x.x==="number"?x.x:0;this.y=typeof x.y==="number"?x.y:0}else{this.x=typeof x==="number"?x:0;this.y=typeof y==="number"?y:0}}Vector2d.prototype.reset=function(){this.x=this.y=0};function Body3d(x,y,z){this.pos=new Vector3d(x,y,z);this.prevPos=new Vector3d(x,y,z);this.force=new Vector3d;this.velocity=new Vector3d;this.mass=1}function Vector3d(x,y,z){if(x&&typeof x!=="number"){this.x=typeof x.x==="number"?x.x:0;this.y=typeof x.y==="number"?x.y:0;this.z=typeof x.z==="number"?x.z:0}else{this.x=typeof x==="number"?x:0;this.y=typeof y==="number"?y:0;this.z=typeof z==="number"?z:0}}Vector3d.prototype.reset=function(){this.x=this.y=this.z=0}},{}],17:[function(require,module,exports){module.exports=function(options){options=options||{};options.gravity=typeof options.gravity==="number"?options.gravity:-1;options.theta=typeof options.theta==="number"?options.theta:.8;var random=require("ngraph.random").random(1984),Node=require("./node"),InsertStack=require("./insertStack"),isSamePosition=require("./isSamePosition");var gravity=options.gravity,updateQueue=[],insertStack=new InsertStack,theta=options.theta,nodesCache=[],currentInCache=0,newNode=function(){var node=nodesCache[currentInCache];if(node){node.quads[0]=null;node.quads[1]=null;node.quads[2]=null;node.quads[3]=null;node.body=null;node.mass=node.massX=node.massY=0;node.left=node.right=node.top=node.bottom=0}else{node=new Node;nodesCache[currentInCache]=node}++currentInCache;return node},root=newNode(),insert=function(newBody){insertStack.reset();insertStack.push(root,newBody);while(!insertStack.isEmpty()){var stackItem=insertStack.pop(),node=stackItem.node,body=stackItem.body;if(!node.body){var x=body.pos.x;var y=body.pos.y;node.mass=node.mass+body.mass;node.massX=node.massX+body.mass*x;node.massY=node.massY+body.mass*y;var quadIdx=0,left=node.left,right=(node.right+left)/2,top=node.top,bottom=(node.bottom+top)/2;if(x>right){quadIdx=quadIdx+1;var oldLeft=left;left=right;right=right+(right-oldLeft)}if(y>bottom){quadIdx=quadIdx+2;var oldTop=top;top=bottom;bottom=bottom+(bottom-oldTop)}var child=node.quads[quadIdx];if(!child){child=newNode();child.left=left;child.top=top;child.right=right;child.bottom=bottom;child.body=body;node.quads[quadIdx]=child}else{insertStack.push(child,body)}}else{var oldBody=node.body;node.body=null;if(isSamePosition(oldBody.pos,body.pos)){if(node.right-node.left<1e-8){return}do{var offset=random.nextDouble();var dx=(node.right-node.left)*offset;var dy=(node.bottom-node.top)*offset;oldBody.pos.x=node.left+dx;oldBody.pos.y=node.top+dy}while(isSamePosition(oldBody.pos,body.pos))}insertStack.push(node,oldBody);insertStack.push(node,body)}}},update=function(sourceBody){var queue=updateQueue,v,dx,dy,r,queueLength=1,shiftIdx=0,pushIdx=1;queue[0]=root;while(queueLength){var node=queue[shiftIdx],body=node.body;queueLength-=1;shiftIdx+=1;if(body&&body!==sourceBody){dx=body.pos.x-sourceBody.pos.x;dy=body.pos.y-sourceBody.pos.y;r=Math.sqrt(dx*dx+dy*dy);if(r===0){dx=(random.nextDouble()-.5)/50;dy=(random.nextDouble()-.5)/50;r=Math.sqrt(dx*dx+dy*dy)}v=gravity*body.mass*sourceBody.mass/(r*r*r);sourceBody.force.x+=v*dx;sourceBody.force.y+=v*dy}else{dx=node.massX/node.mass-sourceBody.pos.x;dy=node.massY/node.mass-sourceBody.pos.y;r=Math.sqrt(dx*dx+dy*dy);if(r===0){dx=(random.nextDouble()-.5)/50;dy=(random.nextDouble()-.5)/50;r=Math.sqrt(dx*dx+dy*dy)}if((node.right-node.left)/r<theta){v=gravity*node.mass*sourceBody.mass/(r*r*r);sourceBody.force.x+=v*dx;sourceBody.force.y+=v*dy}else{if(node.quads[0]){queue[pushIdx]=node.quads[0];queueLength+=1;pushIdx+=1}if(node.quads[1]){queue[pushIdx]=node.quads[1];queueLength+=1;pushIdx+=1}if(node.quads[2]){queue[pushIdx]=node.quads[2];queueLength+=1;pushIdx+=1}if(node.quads[3]){queue[pushIdx]=node.quads[3];queueLength+=1;pushIdx+=1}}}}},insertBodies=function(bodies){var x1=Number.MAX_VALUE,y1=Number.MAX_VALUE,x2=Number.MIN_VALUE,y2=Number.MIN_VALUE,i,max=bodies.length;i=max;while(i--){var x=bodies[i].pos.x;var y=bodies[i].pos.y;if(x<x1){x1=x}if(x>x2){x2=x}if(y<y1){y1=y}if(y>y2){y2=y}}var dx=x2-x1,dy=y2-y1;if(dx>dy){y2=y1+dx}else{x2=x1+dy}currentInCache=0;root=newNode();root.left=x1;root.right=x2;root.top=y1;root.bottom=y2;i=max-1;if(i>0){root.body=bodies[i]}while(i--){insert(bodies[i],root)}};return{insertBodies:insertBodies,updateBodyForce:update,options:function(newOptions){if(newOptions){if(typeof newOptions.gravity==="number"){gravity=newOptions.gravity}if(typeof newOptions.theta==="number"){theta=newOptions.theta}return this}return{gravity:gravity,theta:theta}}}}},{"./insertStack":18,"./isSamePosition":19,"./node":20,"ngraph.random":21}],18:[function(require,module,exports){module.exports=InsertStack;function InsertStack(){this.stack=[];this.popIdx=0}InsertStack.prototype={isEmpty:function(){return this.popIdx===0},push:function(node,body){var item=this.stack[this.popIdx];if(!item){this.stack[this.popIdx]=new InsertStackElement(node,body)}else{item.node=node;item.body=body}++this.popIdx},pop:function(){if(this.popIdx>0){return this.stack[--this.popIdx]}},reset:function(){this.popIdx=0}};function InsertStackElement(node,body){this.node=node;this.body=body}},{}],19:[function(require,module,exports){module.exports=function isSamePosition(point1,point2){var dx=Math.abs(point1.x-point2.x);var dy=Math.abs(point1.y-point2.y);return dx<1e-8&&dy<1e-8}},{}],20:[function(require,module,exports){module.exports=function Node(){this.body=null;this.quads=[];this.mass=0;this.massX=0;this.massY=0;this.left=0;this.top=0;this.bottom=0;this.right=0;this.isInternal=false}},{}],21:[function(require,module,exports){module.exports={random:random,randomIterator:randomIterator};function random(inputSeed){var seed=typeof inputSeed==="number"?inputSeed:+new Date;var randomFunc=function(){seed=seed+2127912214+(seed<<12)&4294967295;seed=(seed^3345072700^seed>>>19)&4294967295;seed=seed+374761393+(seed<<5)&4294967295;seed=(seed+3550635116^seed<<9)&4294967295;seed=seed+4251993797+(seed<<3)&4294967295;seed=(seed^3042594569^seed>>>16)&4294967295;return(seed&268435455)/268435456};return{next:function(maxValue){return Math.floor(randomFunc()*maxValue)},nextDouble:function(){return randomFunc()}}}function randomIterator(array,customRandom){var localRandom=customRandom||random();if(typeof localRandom.next!=="function"){throw new Error("customRandom does not match expected API: next() function is missing")}return{forEach:function(callback){var i,j,t;for(i=array.length-1;i>0;--i){j=localRandom.next(i+1);t=array[j];array[j]=array[i];array[i]=t;callback(t)}if(array.length){callback(array[0])}},shuffle:function(){var i,j,t;for(i=array.length-1;i>0;--i){j=localRandom.next(i+1);t=array[j];array[j]=array[i];array[i]=t}return array}}}},{}],22:[function(require,module,exports){module.exports=svg;svg.compile=require("./lib/compile");var compileTemplate=svg.compileTemplate=require("./lib/compileTemplate");var domEvents=require("add-event-listener");var svgns="http://www.w3.org/2000/svg";var xlinkns="http://www.w3.org/1999/xlink";function svg(element){var svgElement=element;if(typeof element==="string"){svgElement=window.document.createElementNS(svgns,element)}else if(element.simplesvg){return element}var compiledTempalte;svgElement.simplesvg=true;svgElement.attr=attr;svgElement.append=append;svgElement.on=on;svgElement.off=off;svgElement.dataSource=dataSource;return svgElement;function dataSource(model){if(!compiledTempalte)compiledTempalte=compileTemplate(svgElement);compiledTempalte.link(model)}function on(name,cb,useCapture){domEvents.addEventListener(svgElement,name,cb,useCapture);return svgElement}function off(name,cb,useCapture){domEvents.removeEventListener(svgElement,name,cb,useCapture);return svgElement}function append(child){svgElement.appendChild(svg(child));return child}function attr(name,value){if(arguments.length===2){if(value!==null){svgElement.setAttributeNS(null,name,value)}else{svgElement.removeAttributeNS(null,name)}return svgElement}return svgElement.getAttributeNS(null,name)}}},{"./lib/compile":23,"./lib/compileTemplate":24,"add-event-listener":25}],23:[function(require,module,exports){var parser=new DOMParser;var svg=require("../");module.exports=compile;function compile(svgText){try{svgText=addNamespaces(svgText);return svg(parser.parseFromString(svgText,"text/xml").documentElement)}catch(e){throw e}}function addNamespaces(text){if(!text)return;var namespaces='xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"';var match=text.match(/^<\w+/);if(match){var tagLength=match[0].length;return text.substr(0,tagLength)+" "+namespaces+" "+text.substr(tagLength)}else{throw new Error("Cannot parse input text: invalid xml?")}}},{"../":22}],24:[function(require,module,exports){module.exports=template;var BINDING_EXPR=/{{(.+?)}}/;function template(domNode){var allBindings=Object.create(null);extractAllBindings(domNode,allBindings);return{link:function(model){Object.keys(allBindings).forEach(function(key){var setter=allBindings[key];setter(model)})}}}function extractAllBindings(domNode,allBindings){var nodeType=domNode.nodeType;var typeSupported=nodeType===1||nodeType===3;if(!typeSupported)return;var i;if(domNode.hasChildNodes()){var domChildren=domNode.childNodes;for(i=0;i<domChildren.length;++i){extractAllBindings(domChildren[i],allBindings)}}if(nodeType===3){bindTextContent(domNode,allBindings)}if(!domNode.attributes)return;var attrs=domNode.attributes;for(i=0;i<attrs.length;++i){bindDomAttribute(attrs[i],domNode,allBindings)}}function bindDomAttribute(domAttribute,element,allBindings){var value=domAttribute.value;if(!value)return;var modelNameMatch=value.match(BINDING_EXPR);if(!modelNameMatch)return;var attrName=domAttribute.localName;var modelPropertyName=modelNameMatch[1];var isSimpleValue=modelPropertyName.indexOf(".")<0;if(!isSimpleValue)throw new Error("simplesvg currently does not support nested bindings");allBindings[modelPropertyName]=attributeSetter;function attributeSetter(model){element.setAttributeNS(null,attrName,model[modelPropertyName])}}function bindTextContent(element,allBindings){var value=element.nodeValue;
if(!value)return;var modelNameMatch=value.match(BINDING_EXPR);if(!modelNameMatch)return;var modelPropertyName=modelNameMatch[1];var isSimpleValue=modelPropertyName.indexOf(".")<0;allBindings[modelPropertyName]=textSetter;function textSetter(model){element.nodeValue=model[modelPropertyName]}}},{}],25:[function(require,module,exports){addEventListener.removeEventListener=removeEventListener;addEventListener.addEventListener=addEventListener;module.exports=addEventListener;var Events=null;function addEventListener(el,eventName,listener,useCapture){Events=Events||(document.addEventListener?{add:stdAttach,rm:stdDetach}:{add:oldIEAttach,rm:oldIEDetach});return Events.add(el,eventName,listener,useCapture)}function removeEventListener(el,eventName,listener,useCapture){Events=Events||(document.addEventListener?{add:stdAttach,rm:stdDetach}:{add:oldIEAttach,rm:oldIEDetach});return Events.rm(el,eventName,listener,useCapture)}function stdAttach(el,eventName,listener,useCapture){el.addEventListener(eventName,listener,useCapture)}function stdDetach(el,eventName,listener,useCapture){el.removeEventListener(eventName,listener,useCapture)}function oldIEAttach(el,eventName,listener,useCapture){if(useCapture){throw new Error("cannot useCapture in oldIE")}el.attachEvent("on"+eventName,listener)}function oldIEDetach(el,eventName,listener,useCapture){el.detachEvent("on"+eventName,listener)}},{}],26:[function(require,module,exports){module.exports=addWheelListener;var prefix="",_addEventListener,onwheel,support;if(window.addEventListener){_addEventListener="addEventListener"}else{_addEventListener="attachEvent";prefix="on"}support="onwheel"in document.createElement("div")?"wheel":document.onmousewheel!==undefined?"mousewheel":"DOMMouseScroll";function addWheelListener(elem,callback,useCapture){_addWheelListener(elem,support,callback,useCapture);if(support=="DOMMouseScroll"){_addWheelListener(elem,"MozMousePixelScroll",callback,useCapture)}}function _addWheelListener(elem,eventName,callback,useCapture){elem[_addEventListener](prefix+eventName,support=="wheel"?callback:function(originalEvent){!originalEvent&&(originalEvent=window.event);var event={originalEvent:originalEvent,target:originalEvent.target||originalEvent.srcElement,type:"wheel",deltaMode:originalEvent.type=="MozMousePixelScroll"?0:1,deltaX:0,delatZ:0,preventDefault:function(){originalEvent.preventDefault?originalEvent.preventDefault():originalEvent.returnValue=false}};if(support=="mousewheel"){event.deltaY=-1/40*originalEvent.wheelDelta;originalEvent.wheelDeltaX&&(event.deltaX=-1/40*originalEvent.wheelDeltaX)}else{event.deltaY=originalEvent.detail}return callback(event)},useCapture||false)}},{}],"ngraph.svg":[function(require,module,exports){var svg=require("simplesvg");var hammer=require("hammerjs");var MOVE_EVENTS="panstart panmove panend";module.exports=ngraphSvg;function ngraphSvg(graph,settings){settings=settings||{};var layout=require("./lib/defaultLayout.js")(graph,settings);var container=settings.container||document.body;var isStable=false;var disposed=false;var sceneInitialized=false;var svgRoot=createSvgRoot(container);var sceneRoot=createSceneRoot(svgRoot);var sceneTransform=createSceneTransform(sceneRoot);var panSession={};var panNode=0;var linkLayer=addLayer("links",sceneRoot);var nodeLayer=addLayer("nodes",sceneRoot);var nodes=Object.create(null);var links=Object.create(null);var fromX=0,fromY=0;var screenPinchX,screenPinchY,lastScale;var cachedPos={x:0,y:0},cachedFromPos={x:0,y:0},cachedToPos={x:0,y:0};var defaultUI=require("./lib/defaultUI.js");var nodeBuilder=defaultUI.nodeBuilder,nodePositionCallback=defaultUI.nodePositionCallback,linkBuilder=defaultUI.linkBuilder,linkPositionCallback=defaultUI.linkPositionCallback;var currentTransform={tx:0,ty:0,scale:1};var api={run:animationLoop,renderOneFrame:renderOneFrame,layout:layout,dispose:dispose,node:setNodeBuilder,link:setLinkBuilder,placeNode:placeNode,placeLink:placeLink,svgRoot:svgRoot};require("ngraph.events")(api);return api;function dispose(){layout.dispose();api.off();disposed=true;listenToGraphEvents(false);releaseDOMEvents()}function placeLink(newPlaceLinkCallback){linkPositionCallback=newPlaceLinkCallback;return api}function placeNode(newPlaceCallback){nodePositionCallback=newPlaceCallback;return api}function animationLoop(){if(disposed)return;requestAnimationFrame(animationLoop);if(!isStable){isStable=layout.step();renderOneFrame()}}function renderOneFrame(){if(disposed)return;if(!sceneInitialized)initializeScene();for(var nodeId in nodes){var nodeInfo=nodes[nodeId];cachedPos.x=nodeInfo.pos.x;cachedPos.y=nodeInfo.pos.y;nodePositionCallback(nodeInfo.ui,cachedPos,nodeInfo.model)}for(var linkId in links){var linkInfo=links[linkId];cachedFromPos.x=linkInfo.pos.from.x;cachedFromPos.y=linkInfo.pos.from.y;cachedToPos.x=linkInfo.pos.to.x;cachedToPos.y=linkInfo.pos.to.y;linkPositionCallback(linkInfo.ui,cachedFromPos,cachedToPos,linkInfo.model)}}function initializeScene(){graph.forEachNode(addNode);graph.forEachLink(addLink);moveTo(container.clientWidth/2,container.clientHeight/2);listenToGraphEvents(true);sceneInitialized=true}function addLink(link){var linkUI=linkBuilder(link);if(!linkUI)throw new Error("Link builder is supposed to return SVG object");links[link.id]={pos:layout.getLinkPosition(link.id),model:link,ui:linkUI};linkLayer.append(linkUI)}function addNode(node){var ui=nodeBuilder(node);if(!ui)throw new Error("Node builder is supposed to return SVG object");nodeLayer.append(ui);var pos=layout.getNodePosition(node.id);var nodeDescriptor={pos:pos,model:node,ui:ui};var recognizers={recognizers:[[hammer.Pan,{threshold:1}]]};nodeDescriptor.events=hammer(ui,recognizers).on(MOVE_EVENTS,onNodePan(pos,node));nodes[node.id]=nodeDescriptor}function setLinkBuilder(builderCallback){if(typeof builderCallback!=="function")throw new Error("link builder callback is supposed to be a function");linkBuilder=builderCallback;return api}function setNodeBuilder(builderCallback){if(typeof builderCallback!=="function")throw new Error("node builder callback is supposed to be a function");nodeBuilder=builderCallback;return api}function listenToGraphEvents(isOn){graph[isOn?"on":"off"]("changed",onGraphChanged)}function onGraphChanged(changes){resetStable();for(var i=0;i<changes.length;++i){var change=changes[i];if(change.changeType==="add"){if(change.node){addNode(change.node)}if(change.link){addLink(change.link)}}else if(change.changeType==="remove"){if(change.node){removeNode(change.node)}if(change.link){removeLink(change.link)}}}}function resetStable(){isStable=false}function createSvgRoot(element){if(element instanceof SVGSVGElement)return element;var svgRoot=svg("svg");element.appendChild(svgRoot);return svgRoot}function createSceneRoot(svgRoot){var scene=svg("g").attr("buffered-rendering","dynamic");svgRoot.append(scene);var sceneMoveRecognizer={recognizers:[[hammer.Pan,{threshold:1}],[hammer.Pinch,{enable:true}]]};hammer(container,sceneMoveRecognizer).on(MOVE_EVENTS,onScenePan).on("pinchstart pinchin pinchout",onScreenPinch);var addWheelListener=require("wheel");addWheelListener(svgRoot,onWheel);return scene}function onScenePan(e){if(e.target!==svgRoot||panNode>0)return;if(e.type==="panmove"){currentTransform.tx=fromX+e.deltaX;currentTransform.ty=fromY+e.deltaY;updateTransformMatrix()}else if(e.type==="panstart"){fromX=currentTransform.tx;fromY=currentTransform.ty}}function onWheel(e){var isZoomIn=e.deltaY<0;var direction=isZoomIn?1:-1;var factor=1+direction*.1;var x=e.offsetX===undefined?e.layerX:e.offsetX;var y=e.offsetY===undefined?e.layerY:e.offsetY;zoomTo(x,y,factor);e.preventDefault()}function zoomTo(x,y,factor){currentTransform.tx=x-factor*(x-currentTransform.tx);currentTransform.ty=y-factor*(y-currentTransform.ty);currentTransform.scale*=factor;updateTransformMatrix()}function addLayer(name,parent){var layer=svg("g").attr("id",name);parent.append(layer);return layer}function getModelPosition(pos){return{x:(pos.x-currentTransform.tx)/currentTransform.scale,y:(pos.y-currentTransform.ty)/currentTransform.scale}}function createSceneTransform(scene){var transform=svgRoot.createSVGTransform();scene.transform.baseVal.appendItem(transform);return transform}function moveTo(x,y){currentTransform.tx=x;currentTransform.ty=y;updateTransformMatrix()}function updateTransformMatrix(){sceneTransform.matrix.e=currentTransform.tx;sceneTransform.matrix.f=currentTransform.ty;sceneTransform.matrix.a=sceneTransform.matrix.d=currentTransform.scale}function onNodePan(pos,model){return function onNodePan(e){var clickPosition=getModelPosition(e.center);var status;resetStable();if(e.type==="panmove"){status=panSession[model.id];layout.setNodePosition(model.id,clickPosition.x-status.dx,clickPosition.y-status.dy)}else if(e.type==="panstart"){panSession[model.id]={isPinned:layout.isNodePinned(model),dx:clickPosition.x-pos.x,dy:clickPosition.y-pos.y};layout.pinNode(model,true);panNode+=1}else if(e.type==="panend"){status=panSession[model.id];if(status)layout.pinNode(model,status.isPinned);panNode-=1;if(panNode<0)panNode=0}}}function releaseDOMEvents(){for(var key in nodes){var descriptor=nodes[key];if(descriptor.events)descriptor.events.destroy()}}function removeNode(node){var descriptor=nodes[node.id];if(!descriptor)return;descriptor.events.destroy();var parent=descriptor.ui.parentNode;if(parent)parent.removeChild(descriptor.ui);delete nodes[node.id]}function removeLink(link){var descriptor=links[link.id];if(!descriptor)return;var parent=descriptor.ui.parentNode;if(parent)parent.removeChild(descriptor.ui);delete links[link.id]}function onScreenPinch(e){if(e.target!==svgRoot)return;if(e.type==="pinchstart"){screenPinchX=e.center.x;screenPinchY=e.center.y;lastScale=e.scale}else{var direction=lastScale>e.scale?-1:1;lastScale=e.scale;var factor=1+direction*.04;zoomTo(screenPinchX,screenPinchY,factor)}}}},{"./lib/defaultLayout.js":1,"./lib/defaultUI.js":2,hammerjs:3,"ngraph.events":4,simplesvg:22,wheel:26}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({"query-string":[function(require,module,exports){(function(){"use strict";var queryString={};queryString.parse=function(str){if(typeof str!=="string"){return{}}str=str.trim().replace(/^(\?|#)/,"");if(!str){return{}}return str.trim().split("&").reduce(function(ret,param){var parts=param.replace(/\+/g," ").split("=");var key=parts[0];var val=parts[1];key=decodeURIComponent(key);val=val===undefined?null:decodeURIComponent(val);if(!ret.hasOwnProperty(key)){ret[key]=val}else if(Array.isArray(ret[key])){ret[key].push(val)}else{ret[key]=[ret[key],val]}return ret},{})};queryString.stringify=function(obj){return obj?Object.keys(obj).map(function(key){var val=obj[key];if(Array.isArray(val)){return val.map(function(val2){return encodeURIComponent(key)+"="+encodeURIComponent(val2)}).join("&")}return encodeURIComponent(key)+"="+encodeURIComponent(val)}).join("&"):""};if(typeof define==="function"&&define.amd){define(function(){return queryString})}else if(typeof module!=="undefined"&&module.exports){module.exports=queryString}else{window.queryString=queryString}})()},{}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){module.exports=function(){var nodes={},links=[],multiEdges={},nodesCount=0,suspendEvents=0,changes=[],fireGraphChanged=function(graph){graph.fire("changed",changes)},enterModification=function(){suspendEvents+=1},exitModification=function(graph){suspendEvents-=1;if(suspendEvents===0&&changes.length>0){fireGraphChanged(graph);changes.length=0}},recordNodeChange=function(node,changeType){changes.push({node:node,changeType:changeType})},recordLinkChange=function(link,changeType){changes.push({link:link,changeType:changeType})},linkConnectionSymbol="👉 ";var graphPart={addNode:function(nodeId,data){if(typeof nodeId==="undefined"){throw new Error("Invalid node identifier")}enterModification();var node=this.getNode(nodeId);if(!node){node=new Node(nodeId);nodesCount++;recordNodeChange(node,"add")}else{recordNodeChange(node,"update")}node.data=data;nodes[nodeId]=node;exitModification(this);return node},addLink:function(fromId,toId,data){enterModification();var fromNode=this.getNode(fromId)||this.addNode(fromId);var toNode=this.getNode(toId)||this.addNode(toId);var linkId=fromId.toString()+linkConnectionSymbol+toId.toString();var isMultiEdge=multiEdges.hasOwnProperty(linkId);if(isMultiEdge||this.hasLink(fromId,toId)){if(!isMultiEdge){multiEdges[linkId]=0}linkId+="@"+ ++multiEdges[linkId]}var link=new Link(fromId,toId,data,linkId);links.push(link);fromNode.links.push(link);toNode.links.push(link);recordLinkChange(link,"add");exitModification(this);return link},removeLink:function(link){if(!link){return false}var idx=indexOfElementInArray(link,links);if(idx<0){return false}enterModification();links.splice(idx,1);var fromNode=this.getNode(link.fromId);var toNode=this.getNode(link.toId);if(fromNode){idx=indexOfElementInArray(link,fromNode.links);if(idx>=0){fromNode.links.splice(idx,1)}}if(toNode){idx=indexOfElementInArray(link,toNode.links);if(idx>=0){toNode.links.splice(idx,1)}}recordLinkChange(link,"remove");exitModification(this);return true},removeNode:function(nodeId){var node=this.getNode(nodeId);if(!node){return false}enterModification();while(node.links.length){var link=node.links[0];this.removeLink(link)}delete nodes[nodeId];nodesCount--;recordNodeChange(node,"remove");exitModification(this);return true},getNode:function(nodeId){return nodes[nodeId]},getNodesCount:function(){return nodesCount},getLinksCount:function(){return links.length},getLinks:function(nodeId){var node=this.getNode(nodeId);return node?node.links:null},forEachNode:function(callback){if(typeof callback!=="function"){return}var node;for(node in nodes){if(nodes.hasOwnProperty(node)){if(callback(nodes[node])){return}}}},forEachLinkedNode:function(nodeId,callback,oriented){var node=this.getNode(nodeId),i,link,linkedNodeId;if(node&&node.links&&typeof callback==="function"){if(oriented){for(i=0;i<node.links.length;++i){link=node.links[i];if(link.fromId===nodeId){callback(nodes[link.toId],link)}}}else{for(i=0;i<node.links.length;++i){link=node.links[i];linkedNodeId=link.fromId===nodeId?link.toId:link.fromId;callback(nodes[linkedNodeId],link)}}}},forEachLink:function(callback){var i,length;if(typeof callback==="function"){for(i=0,length=links.length;i<length;++i){callback(links[i])}}},beginUpdate:function(){enterModification()},endUpdate:function(){exitModification(this)},clear:function(){var that=this;that.beginUpdate();that.forEachNode(function(node){that.removeNode(node.id)});that.endUpdate()},hasLink:function(fromNodeId,toNodeId){var node=this.getNode(fromNodeId),i;if(!node){return null}for(i=0;i<node.links.length;++i){var link=node.links[i];if(link.fromId===fromNodeId&&link.toId===toNodeId){return link}}return null}};var eventify=require("ngraph.events");eventify(graphPart);return graphPart};function indexOfElementInArray(element,array){if(array.indexOf){return array.indexOf(element)}var len=array.length,i;for(i=0;i<len;i+=1){if(array[i]===element){return i}}return-1}function Node(id){this.id=id;this.links=[];this.data=null}function Link(fromId,toId,data,id){this.fromId=fromId;this.toId=toId;this.data=data;this.id=id}},{"ngraph.events":2}],2:[function(require,module,exports){module.exports=function(subject){validateSubject(subject);var eventsStorage=createEventsStorage(subject);subject.on=eventsStorage.on;subject.off=eventsStorage.off;subject.fire=eventsStorage.fire;return subject};function createEventsStorage(subject){var registeredEvents={};return{on:function(eventName,callback,ctx){if(typeof callback!=="function"){throw new Error("callback is expected to be a function")}if(!registeredEvents.hasOwnProperty(eventName)){registeredEvents[eventName]=[]}registeredEvents[eventName].push({callback:callback,ctx:ctx});return subject},off:function(eventName,callback){var wantToRemoveAll=typeof eventName==="undefined";if(wantToRemoveAll){registeredEvents={};return subject}if(registeredEvents.hasOwnProperty(eventName)){var deleteAllCallbacksForEvent=typeof callback!=="function";if(deleteAllCallbacksForEvent){delete registeredEvents[eventName]}else{var callbacks=registeredEvents[eventName];for(var i=0;i<callbacks.length;++i){if(callbacks[i].callback===callback){callbacks.splice(i,1)}}}}return subject},fire:function(eventName){var noEventsToFire=!registeredEvents.hasOwnProperty(eventName);if(noEventsToFire){return subject}var callbacks=registeredEvents[eventName];var fireArguments=Array.prototype.splice.call(arguments,1);for(var i=0;i<callbacks.length;++i){var callbackInfo=callbacks[i];callbackInfo.callback.apply(callbackInfo.ctx,fireArguments)}return subject}}}function validateSubject(subject){if(!subject){throw new Error("Eventify cannot use falsy object as events subject")}var reservedWords=["on","fire","off"];for(var i=0;i<reservedWords.length;++i){if(subject.hasOwnProperty(reservedWords[i])){throw new Error("Subject cannot be eventified, since it already has property '"+reservedWords[i]+"'")}}}},{}],3:[function(require,module,exports){module.exports={random:random,randomIterator:randomIterator};function random(inputSeed){var seed=typeof inputSeed==="number"?inputSeed:+new Date;var randomFunc=function(){seed=seed+2127912214+(seed<<12)&4294967295;seed=(seed^3345072700^seed>>>19)&4294967295;seed=seed+374761393+(seed<<5)&4294967295;seed=(seed+3550635116^seed<<9)&4294967295;seed=seed+4251993797+(seed<<3)&4294967295;seed=(seed^3042594569^seed>>>16)&4294967295;return(seed&268435455)/268435456};return{next:function(maxValue){return Math.floor(randomFunc()*maxValue)},nextDouble:function(){return randomFunc()}}}function randomIterator(array,customRandom){var localRandom=customRandom||random();if(typeof localRandom.next!=="function"){throw new Error("customRandom does not match expected API: next() function is missing")}return{forEach:function(callback){var i,j,t;for(i=array.length-1;i>0;--i){j=localRandom.next(i+1);t=array[j];array[j]=array[i];array[i]=t;callback(t)}if(array.length){callback(array[0])}},shuffle:function(){var i,j,t;for(i=array.length-1;i>0;--i){j=localRandom.next(i+1);t=array[j];array[j]=array[i];array[i]=t}return array}}}},{}],"ngraph.generators":[function(require,module,exports){module.exports={ladder:ladder,complete:complete,completeBipartite:completeBipartite,balancedBinTree:balancedBinTree,path:path,circularLadder:circularLadder,grid:grid,grid3:grid3,noLinks:noLinks,wattsStrogatz:wattsStrogatz};var createGraph=require("ngraph.graph");function ladder(n){if(!n||n<0){throw new Error("Invalid number of nodes")}var g=createGraph(),i;for(i=0;i<n-1;++i){g.addLink(i,i+1);g.addLink(n+i,n+i+1);g.addLink(i,n+i)}g.addLink(n-1,2*n-1);return g}function circularLadder(n){if(!n||n<0){throw new Error("Invalid number of nodes")}var g=ladder(n);g.addLink(0,n-1);g.addLink(n,2*n-1);return g}function complete(n){if(!n||n<1){throw new Error("At least two nodes are expected for complete graph")}var g=createGraph(),i,j;for(i=0;i<n;++i){for(j=i+1;j<n;++j){if(i!==j){g.addLink(i,j);g.addLink(j,i)}}}return g}function completeBipartite(n,m){if(!n||!m||n<0||m<0){throw new Error("Graph dimensions are invalid. Number of nodes in each partition should be greate than 0")}var g=createGraph(),i,j;for(i=0;i<n;++i){for(j=n;j<n+m;++j){g.addLink(i,j)}}return g}function path(n){if(!n||n<0){throw new Error("Invalid number of nodes")}var g=createGraph(),i;g.addNode(0);for(i=1;i<n;++i){g.addLink(i-1,i)}return g}function grid(n,m){if(n<1||m<1){throw new Error("Invalid number of nodes in grid graph")}var g=createGraph(),i,j;if(n===1&&m===1){g.addNode(0);return g}for(i=0;i<n;++i){for(j=0;j<m;++j){var node=i+j*n;if(i>0){g.addLink(node,i-1+j*n)}if(j>0){g.addLink(node,i+(j-1)*n)}}}return g}function grid3(n,m,z){if(n<1||m<1||z<1){throw new Error("Invalid number of nodes in grid3 graph")}var g=createGraph(),i,j,k;if(n===1&&m===1&&z===1){g.addNode(0);return g}for(k=0;k<z;++k){for(i=0;i<n;++i){for(j=0;j<m;++j){var level=k*n*m;var node=i+j*n+level;if(i>0){g.addLink(node,i-1+j*n+level)}if(j>0){g.addLink(node,i+(j-1)*n+level)}if(k>0){g.addLink(node,i+j*n+(k-1)*n*m)}}}}return g}function balancedBinTree(n){if(n<0){throw new Error("Invalid number of nodes in balanced tree")}var g=createGraph(),count=Math.pow(2,n),level;if(n===0){g.addNode(1)}for(level=1;level<count;++level){var root=level,left=root*2,right=root*2+1;g.addLink(root,left);g.addLink(root,right)}return g}function noLinks(n){if(n<0){throw new Error("Number of nodes shoul be >= 0")}var g=createGraph(),i;for(i=0;i<n;++i){g.addNode(i)}return g}function wattsStrogatz(n,k,p,seed){if(k>=n)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var random=require("ngraph.random").random(seed||42);var g=createGraph(),i,to;for(i=0;i<n;++i){g.addNode(i)}var neighborsSize=Math.floor(k/2+1);for(var j=1;j<neighborsSize;++j){for(i=0;i<n;++i){to=(j+i)%n;g.addLink(i,to)}}for(j=1;j<neighborsSize;++j){for(i=0;i<n;++i){if(random.nextDouble()<p){var from=i;to=(j+i)%n;var newTo=random.next(n);var needsRewire=newTo===from||g.hasLink(from,newTo);if(needsRewire&&g.getLinks(from).length===n-1){continue}while(needsRewire){newTo=random.next(n);needsRewire=newTo===from||g.hasLink(from,newTo)}var link=g.hasLink(from,to);g.removeLink(link);g.addLink(from,newTo)}}}return g}},{"ngraph.graph":1,"ngraph.random":3}]},{},[]);var createGraph=require("ngraph.graph");var createSvg=require("ngraph.svg");var QS=require("query-string");var graphGenerators=require("ngraph.generators");function render(svg){var query=QS.parse(window.location.search.substring(1));var graph=getGraphFromQueryString(query);var graphics=createSvg(graph,{interactive:true});graphics.run();return graphics.svgRoot}function getGraphFromQueryString(query){var createGraph=graphGenerators[query.graph]||graphGenerators.grid;return createGraph(getNumber(query.n),getNumber(query.m),getNumber(query.k))}function getNumber(string,defaultValue){var number=parseFloat(string);return typeof number==="number"&&!isNaN(number)?number:defaultValue||10}var svg;function draw(){if(!svg){svg=render()}svg.setAttribute("height",document.body.clientHeight);svg.setAttribute("width",document.body.clientWidth)}window.addEventListener("resize",draw);draw();
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"ngraph.graph": "0.0.4",
"ngraph.svg": "0.0.6",
"query-string": "1.0.0",
"ngraph.generators": "0.0.8"
}
}
<style type='text/css'>html, body { margin: 0; padding: 0; border: 0; }
body, html { height: 100%; width: 100%; }</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment