]> source.dussan.org Git - svg.js.git/commitdiff
fix tests
authorUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Thu, 18 Oct 2018 10:37:55 +0000 (12:37 +0200)
committerUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Thu, 18 Oct 2018 10:37:55 +0000 (12:37 +0200)
14 files changed:
dist/svg.js
dist/svg.js.map [new file with mode: 0644]
dist/svg.min.js [new file with mode: 0644]
gulpfile.js
spec/SpecRunner.html
spec/spec/event.js
spec/spec/fx.js
spec/spec/number.js
spec/spec/queue.js
spec/spec/runner.js
src/event.js
src/eventtarget.js [new file with mode: 0644]
src/number.js
src/runner.js

index 0858996311254986726a1c643de5770b94187e20..f78ec031924d4dbcab7c8b9f16dd4c9e91928737 100644 (file)
@@ -6,7 +6,7 @@
 * @copyright Wout Fierens <wout@mick-wout.com>
 * @license MIT
 *
-* BUILT: Thu Oct 18 2018 11:19:30 GMT+0200 (GMT+02:00)
+* BUILT: Thu Oct 18 2018 11:49:16 GMT+0200 (GMT+02:00)
 */;
 \r
 (function(root, factory) {\r
@@ -1049,143 +1049,7 @@ SVG.Number = SVG.invent({
       return new SVG.Number(this.destination).minus(this).times(pos).plus(this);
     }
   }
-}); // Add events to elements
-
-/*\r
-;[ 'click',\r
-  'dblclick',\r
-  'mousedown',\r
-  'mouseup',\r
-  'mouseover',\r
-  'mouseout',\r
-  'mousemove',\r
-  'mouseenter',\r
-  'mouseleave',\r
-  'touchstart',\r
-  'touchmove',\r
-  'touchleave',\r
-  'touchend',\r
-  'touchcancel' ].forEach(function (event) {\r
-    // add event to SVG.Element\r
-    SVG.Element.prototype[event] = function (f) {\r
-    // bind event to element rather than element node\r
-      SVG.on(this, event, f)\r
-      return this\r
-    }\r
-  })\r
-*/
-
-SVG.listenerId = 0; // Add event binder in the SVG namespace
-
-SVG.on = function (node, events, listener, binding, options) {
-  var l = listener.bind(binding || node);
-  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node; // events can be an array of events or a string of events
-
-  events = Array.isArray(events) ? events : events.split(SVG.regex.delimiter); // ensure instance object for nodes which are not adopted
-
-  n.instance = n.instance || {
-    events: {} // pull event handlers from the element
-
-  };
-  var bag = n.instance.events; // add id to listener
-
-  if (!listener._svgjsListenerId) {
-    listener._svgjsListenerId = ++SVG.listenerId;
-  }
-
-  events.forEach(function (event) {
-    var ev = event.split('.')[0];
-    var ns = event.split('.')[1] || '*'; // ensure valid object
-
-    bag[ev] = bag[ev] || {};
-    bag[ev][ns] = bag[ev][ns] || {}; // reference listener
-
-    bag[ev][ns][listener._svgjsListenerId] = l; // add listener
-
-    n.addEventListener(ev, l, options || false);
-  });
-}; // Add event unbinder in the SVG namespace
-
-
-SVG.off = function (node, events, listener, options) {
-  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node;
-  if (!n.instance) return; // listener can be a function or a number
-
-  if (typeof listener === 'function') {
-    listener = listener._svgjsListenerId;
-    if (!listener) return;
-  } // pull event handlers from the element
-
-
-  var bag = n.instance.events; // events can be an array of events or a string or undefined
-
-  events = Array.isArray(events) ? events : (events || '').split(SVG.regex.delimiter);
-  events.forEach(function (event) {
-    var ev = event && event.split('.')[0];
-    var ns = event && event.split('.')[1];
-    var namespace, l;
-
-    if (listener) {
-      // remove listener reference
-      if (bag[ev] && bag[ev][ns || '*']) {
-        // removeListener
-        n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false);
-        delete bag[ev][ns || '*'][listener];
-      }
-    } else if (ev && ns) {
-      // remove all listeners for a namespaced event
-      if (bag[ev] && bag[ev][ns]) {
-        for (l in bag[ev][ns]) {
-          SVG.off(n, [ev, ns].join('.'), l);
-        }
-
-        delete bag[ev][ns];
-      }
-    } else if (ns) {
-      // remove all listeners for a specific namespace
-      for (event in bag) {
-        for (namespace in bag[event]) {
-          if (ns === namespace) {
-            SVG.off(n, [event, ns].join('.'));
-          }
-        }
-      }
-    } else if (ev) {
-      // remove all listeners for the event
-      if (bag[ev]) {
-        for (namespace in bag[ev]) {
-          SVG.off(n, [ev, namespace].join('.'));
-        }
-
-        delete bag[ev];
-      }
-    } else {
-      // remove all listeners on a given node
-      for (event in bag) {
-        SVG.off(n, event);
-      }
-
-      n.instance.events = {};
-    }
-  });
-};
-
-SVG.dispatch = function (node, event, data) {
-  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node; // Dispatch event
-
-  if (event instanceof window.Event) {
-    n.dispatchEvent(event);
-  } else {
-    event = new window.CustomEvent(event, {
-      detail: data,
-      cancelable: true
-    });
-    n.dispatchEvent(event);
-  }
-
-  return event;
-};
-
+});
 SVG.EventTarget = SVG.invent({
   create: function create() {},
   extend: {
@@ -1493,9 +1357,133 @@ SVG.Element = SVG.invent({
       return this.node;
     }
   }
+}) // Add events to elements
+;
+['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout', 'mousemove', 'mouseenter', 'mouseleave', 'touchstart', 'touchmove', 'touchleave', 'touchend', 'touchcancel'].forEach(function (event) {
+  // add event to SVG.Element
+  SVG.Element.prototype[event] = function (f) {
+    if (f === null) {
+      SVG.off(this, event);
+    } else {
+      SVG.on(this, event, f);
+    }
+
+    return this;
+  };
 });
+SVG.listenerId = 0; // Add event binder in the SVG namespace
+
+SVG.on = function (node, events, listener, binding, options) {
+  var l = listener.bind(binding || node);
+  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node; // events can be an array of events or a string of events
+
+  events = Array.isArray(events) ? events : events.split(SVG.regex.delimiter); // ensure instance object for nodes which are not adopted
+
+  n.instance = n.instance || {
+    events: {} // pull event handlers from the element
+
+  };
+  var bag = n.instance.events; // add id to listener
+
+  if (!listener._svgjsListenerId) {
+    listener._svgjsListenerId = ++SVG.listenerId;
+  }
+
+  events.forEach(function (event) {
+    var ev = event.split('.')[0];
+    var ns = event.split('.')[1] || '*'; // ensure valid object
+
+    bag[ev] = bag[ev] || {};
+    bag[ev][ns] = bag[ev][ns] || {}; // reference listener
+
+    bag[ev][ns][listener._svgjsListenerId] = l; // add listener
+
+    n.addEventListener(ev, l, options || false);
+  });
+}; // Add event unbinder in the SVG namespace
+
+
+SVG.off = function (node, events, listener, options) {
+  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node;
+  if (!n.instance) return; // listener can be a function or a number
+
+  if (typeof listener === 'function') {
+    listener = listener._svgjsListenerId;
+    if (!listener) return;
+  } // pull event handlers from the element
+
+
+  var bag = n.instance.events; // events can be an array of events or a string or undefined
+
+  events = Array.isArray(events) ? events : (events || '').split(SVG.regex.delimiter);
+  events.forEach(function (event) {
+    var ev = event && event.split('.')[0];
+    var ns = event && event.split('.')[1];
+    var namespace, l;
+
+    if (listener) {
+      // remove listener reference
+      if (bag[ev] && bag[ev][ns || '*']) {
+        // removeListener
+        n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false);
+        delete bag[ev][ns || '*'][listener];
+      }
+    } else if (ev && ns) {
+      // remove all listeners for a namespaced event
+      if (bag[ev] && bag[ev][ns]) {
+        for (l in bag[ev][ns]) {
+          SVG.off(n, [ev, ns].join('.'), l);
+        }
+
+        delete bag[ev][ns];
+      }
+    } else if (ns) {
+      // remove all listeners for a specific namespace
+      for (event in bag) {
+        for (namespace in bag[event]) {
+          if (ns === namespace) {
+            SVG.off(n, [event, ns].join('.'));
+          }
+        }
+      }
+    } else if (ev) {
+      // remove all listeners for the event
+      if (bag[ev]) {
+        for (namespace in bag[ev]) {
+          SVG.off(n, [ev, namespace].join('.'));
+        }
+
+        delete bag[ev];
+      }
+    } else {
+      // remove all listeners on a given node
+      for (event in bag) {
+        SVG.off(n, event);
+      }
+
+      n.instance.events = {};
+    }
+  });
+};
+
+SVG.dispatch = function (node, event, data) {
+  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node; // Dispatch event
+
+  if (event instanceof window.Event) {
+    n.dispatchEvent(event);
+  } else {
+    event = new window.CustomEvent(event, {
+      detail: data,
+      cancelable: true
+    });
+    n.dispatchEvent(event);
+  }
+
+  return event;
+};
 /* global abcdef arrayToMatrix closeEnough formatTransforms isMatrixLike matrixMultiply */
 
+
 SVG.Matrix = SVG.invent({
   // Initialize
   create: function create(source) {
diff --git a/dist/svg.js.map b/dist/svg.js.map
new file mode 100644 (file)
index 0000000..bc48b35
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["svg.js","regex.js","utilities.js","default.js","queue.js","color.js","array.js","pointarray.js","patharray.js","number.js","eventtarget.js","HtmlNode.js","element.js","event.js","matrix.js","point.js","attr.js","transform.js","css.js","parent.js","flatten.js","container.js","defs.js","group.js","arrange.js","mask.js","clip.js","gradient.js","pattern.js","doc.js","shape.js","bare.js","symbol.js","use.js","rect.js","ellipse.js","line.js","poly.js","pointed.js","path.js","image.js","text.js","textpath.js","hyperlink.js","marker.js","sugar.js","data.js","memory.js","selector.js","helpers.js","boxes.js","parser.js","animator.js","morph.js","runner.js","timeline.js","controller.js"],"names":["SVG","window","element","supported","createElement","ns","xmlns","xlink","svgjs","did","eid","name","capitalize","create","document","createElementNS","extend","modules","methods","key","i","Array","isArray","length","prototype","invent","config","initializer","node","inherit","call","constructor","construct","parent","Container","adopt","instance","Element","SVGElement","HtmlNode","nodeName","Doc","Gradient","Parent","regex","numberAndUnit","hex","rgb","reference","transforms","whitespace","isHex","isRgb","isCss","isBlank","isNumber","isPercent","isImage","delimiter","hyphen","pathLetters","isPathLetter","numbersWithDots","dots","utils","map","array","block","il","result","push","filter","radians","d","Math","PI","degrees","r","filterSVGElements","nodes","el","void","defaults","timeline","duration","ease","delay","attrs","fill","stroke","opacity","x","y","cx","cy","width","height","rx","ry","offset","Queue","_first","_last","value","item","next","prev","shift","remove","first","last","Color","color","g","b","match","test","exec","replace","parseInt","fullHex","arguments","toString","toHex","toArray","fromArray","a","compToHex","round","toRgb","join","brightness","morph","destination","at","pos","isColor","fallback","valueOf","parse","lastValue","lastDestination","settle","seen","indexOf","trim","split","parseFloat","reverse","clone","arrayClone","PointArray","reduce","curr","concat","toLine","x1","y1","x2","y2","points","pop","len","move","box","bbox","isNaN","size","maxX","Infinity","maxY","minX","minY","forEach","max","min","pathHandlers","M","c","p","p0","L","H","V","C","S","Q","T","Z","A","mlhvqtcsaz","j","jl","toUpperCase","PathArray","arrayToString","l","equalCommands","pathArray","sourceArray","destinationArray","s","paramCnt","pathRegReplace","Point","index","slice","parser","path","setAttribute","getBBox","Number","unit","isFinite","toJSON","plus","number","minus","times","divide","to","relative","EventTarget","on","event","listener","binding","options","off","dispatch","data","fire","add","children","insertBefore","put","getEventTarget","events","dom","type","hasAttribute","setData","JSON","getAttribute","attr","center","proportionalSize","writeDataToDom","assignNewId","cloneNode","after","removeElement","addTo","putIn","id","inside","show","css","hide","visible","classes","hasClass","addClass","removeClass","toggleClass","get","parentNode","matches","doc","defs","parents","selector","native","svg","well","innerHTML","appendChild","firstElementChild","outerHTML","is","each","removeAttribute","Object","keys","stringify","o","obj","f","listenerId","bind","n","bag","_svgjsListenerId","ev","addEventListener","namespace","removeEventListener","Event","dispatchEvent","CustomEvent","detail","cancelable","Matrix","source","base","arrayToMatrix","matrixify","isMatrixLike","transform","e","matrix","multiplyO","t","formatTransforms","current","ox","oy","transformer","translateO","lmultiplyO","scaleO","scaleX","scaleY","skewO","skewX","skewY","shearO","shear","rotateO","theta","px","py","origin","dx","dy","tx","ty","compose","originX","originY","sx","sy","lam","rotate","translateX","translateY","decompose","determinant","ccw","sqrt","thetaRad","atan2","ct","cos","st","sin","multiply","matrixMultiply","lmultiply","inverseO","det","Error","na","nb","nc","nd","ne","nf","inverse","translate","scale","flip","axis","around","flipO","lx","skew","tan","ly","skewXO","skewYO","aroundO","createSVGMatrix","abcdef","equals","other","comp","closeEnough","ctm","getCTM","screenCTM","isRoot","rect","m","getScreenCTM","point","createSVGPoint","v","attributes","nodeValue","image","Image","pattern","leading","setAttributeNS","rebuild","untransform","str","kv","apply","toParent","pCtm","toDoc","decomposed","getOrigin","cleanRelative","ret","style","cssText","camelCase","has","deep","removeChild","clear","hasChildNodes","lastChild","_defs","flatten","G","Defs","ungroup","group","siblings","position","forward","backward","front","back","before","Mask","targets","unmask","select","mask","maskWith","masker","ClipPath","unclip","clip","clipWith","clipper","stop","Stop","update","url","gradient","Timeline","from","_target","fx","fy","Pattern","patternUnits","version","getElementsByTagName","nested","Shape","Bare","method","words","text","createTextNode","Symbol","symbol","Use","file","use","Rect","Circle","circle","Ellipse","ellipse","Line","plot","line","Polyline","polyline","Polygon","polygon","_array","MorphArray","Path","load","callback","img","ratio","src","Text","_rebuild","_build","undefined","childNodes","firstLine","nodeType","newLined","textContent","build","tspan","newLine","self","blankLineOffset","plain","Tspan","getComputedTextLength","TextPath","track","textPath","txt","target","link","linkTo","Marker","ref","marker","viewbox","sugar","prefix","extension","mat","angle","direction","directionString","dmove","radius","getTotalLength","pointAt","getPointAtLength","font","remember","k","memory","forget","_memory","getElementById","idFromReference","query","querySelectorAll","$$","$","querySelector","makeNested","charAt","isNulledBox","w","h","domContains","documentElement","contains","arr","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","toLowerCase","substring","ensureCentre","fullBox","threshold","abs","flipBoth","flipX","flipY","positionX","positionY","relativeX","relativeY","string","bx","includes","by","Box","left","top","merge","xMin","xMax","yMin","yMax","pts","addOffset","pageXOffset","pageYOffset","Exception","console","warn","rbox","getBoundingClientRect","ForeignObject","View","body","overflow","Animator","nextDraw","frames","timeouts","timer","performance","Date","frame","fn","run","requestAnimationFrame","_draw","transform_frame","timeout","time","now","cancelFrame","clearTimeout","nextTimeout","lastTimeout","nextFrame","lastFrame","Morphable","stepper","_stepper","Ease","_from","_to","_type","_context","_morphObj","val","_set","NonMorphable","MorphableTypes","ObjectBag","done","complete","_this","step","TransformBag","assign","objOrArr","values","entries","sort","args","easing","Runner","Controller","_element","_timeline","_queue","_duration","_isDeclarative","_history","enabled","_time","tags","transformId","_haveReversed","_reverse","_loopsDone","_swing","_wait","_times","animate","when","sanitise","loop","schedule","_prepareRunner","runner","unschedule","swing","wait","queue","initFn","runFn","isTransform","initialiser","initialised","finished","_continue","during","dt","loops","loopDuration","loopsDone","floor","relativeTime","whole","partial","swinging","backwards","uncliped","pow","clipped","endTime","swingForward","forwards","progress","running","_lastPosition","justStarted","_lastTime","justFinished","declarative","_initialise","converged","_run","finish","active","tag","untag","_dispatcher","_rememberMorpher","morpher","caller","_tryRetarget","splice","needsIt","positionOrDt","allfinished","addTransform","clearTransform","Stepper","FakeRunner","mergeWith","getRunnerTransform","mergeTransforms","runners","_transformationRunners","netTransform","_frameId","RunnerArray","ids","leftSibling","lastRunner","edit","newRunner","deleteCnt","_clearTransformRunnersBefore","currentRunner","clearBefore","_currentTransform","addRunner","frameId","styleAttr","zoom","level","affine","isMatrix","currentAngle","startTransform","setup","start","rTarget","rCurrent","possibilities","distances","shortest","affineParameters","retarget","newTransforms","_queueNumber","_queueNumberDelta","_tryRetargetDelta","_queueObject","makeSchedule","runnerInfo","end","_timeSource","_startTime","_speed","_persist","_nextFrame","_paused","_runners","_order","_lastSourceTime","_lastStepTime","_step","absoluteStartTime","persist","play","pause","seek","speed","yes","currentSpeed","positive","dtOrForever","dtSource","dtTime","runnersLeft","dtToStart","makeSetterGetter","bezier","t0","x0","t1","recalculate","overshoot","_overshoot","eps","pi","os","log","zeta","wn","Spring","velocity","acceleration","newPosition","PID","windup","integral","error","P","I","D"],"mappings":"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","file":"svg.js","sourcesContent":["/* global createElement, capitalize */\r\n/* eslint-disable new-cap */\r\n\r\n// The main wrapping element\r\nvar SVG = window.SVG = function (element) {\r\n  if (SVG.supported) {\r\n    element = createElement(element)\r\n    return element\r\n  }\r\n}\r\n\r\n// Svg must be supported if we reached this stage\r\nSVG.supported = true\r\n\r\n// Default namespaces\r\nSVG.ns = 'http://www.w3.org/2000/svg'\r\nSVG.xmlns = 'http://www.w3.org/2000/xmlns/'\r\nSVG.xlink = 'http://www.w3.org/1999/xlink'\r\nSVG.svgjs = 'http://svgjs.com/svgjs'\r\n\r\n// Element id sequence\r\nSVG.did = 1000\r\n\r\n// Get next named element id\r\nSVG.eid = function (name) {\r\n  return 'Svgjs' + capitalize(name) + (SVG.did++)\r\n}\r\n\r\n// Method for element creation\r\nSVG.create = function (name) {\r\n  // create element\r\n  return document.createElementNS(this.ns, name)\r\n}\r\n\r\n// Method for extending objects\r\nSVG.extend = function (modules, methods) {\r\n  var key, i\r\n\r\n  modules = Array.isArray(modules) ? modules : [modules]\r\n\r\n  for (i = modules.length - 1; i >= 0; i--) {\r\n    if (modules[i]) {\r\n      for (key in methods) {\r\n        modules[i].prototype[key] = methods[key]\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n// Invent new element\r\nSVG.invent = function (config) {\r\n  // Create element initializer\r\n  var initializer = typeof config.create === 'function' ? config.create\r\n    : function (node) {\r\n      config.inherit.call(this, node || SVG.create(config.create))\r\n    }\r\n\r\n  // Inherit prototype\r\n  if (config.inherit) {\r\n    initializer.prototype = new config.inherit()\r\n    initializer.prototype.constructor = initializer\r\n  }\r\n\r\n  // Extend with methods\r\n  if (config.extend) {\r\n    SVG.extend(initializer, config.extend)\r\n  }\r\n\r\n  // Attach construct method to parent\r\n  if (config.construct) { SVG.extend(config.parent || SVG.Container, config.construct) }\r\n\r\n  return initializer\r\n}\r\n\r\n// Adopt existing svg elements\r\nSVG.adopt = function (node) {\r\n  // check for presence of node\r\n  if (!node) return null\r\n\r\n  // make sure a node isn't already adopted\r\n  if (node.instance instanceof SVG.Element) return node.instance\r\n\r\n  if (!(node instanceof window.SVGElement)) {\r\n    return new SVG.HtmlNode(node)\r\n  }\r\n\r\n  // initialize variables\r\n  var element\r\n\r\n  // adopt with element-specific settings\r\n  if (node.nodeName === 'svg') {\r\n    element = new SVG.Doc(node)\r\n  } else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient') {\r\n    element = new SVG.Gradient(node)\r\n  } else if (SVG[capitalize(node.nodeName)]) {\r\n    element = new SVG[capitalize(node.nodeName)](node)\r\n  } else {\r\n    element = new SVG.Parent(node)\r\n  }\r\n\r\n  return element\r\n}\r\n","// Storage for regular expressions\r\nSVG.regex = {\r\n  // Parse unit value\r\n  numberAndUnit: /^([+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?)([a-z%]*)$/i,\r\n\r\n  // Parse hex value\r\n  hex: /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i,\r\n\r\n  // Parse rgb value\r\n  rgb: /rgb\\((\\d+),(\\d+),(\\d+)\\)/,\r\n\r\n  // Parse reference id\r\n  reference: /#([a-z0-9\\-_]+)/i,\r\n\r\n  // splits a transformation chain\r\n  transforms: /\\)\\s*,?\\s*/,\r\n\r\n  // Whitespace\r\n  whitespace: /\\s/g,\r\n\r\n  // Test hex value\r\n  isHex: /^#[a-f0-9]{3,6}$/i,\r\n\r\n  // Test rgb value\r\n  isRgb: /^rgb\\(/,\r\n\r\n  // Test css declaration\r\n  isCss: /[^:]+:[^;]+;?/,\r\n\r\n  // Test for blank string\r\n  isBlank: /^(\\s+)?$/,\r\n\r\n  // Test for numeric string\r\n  isNumber: /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n  // Test for percent value\r\n  isPercent: /^-?[\\d.]+%$/,\r\n\r\n  // Test for image url\r\n  isImage: /\\.(jpg|jpeg|png|gif|svg)(\\?[^=]+.*)?/i,\r\n\r\n  // split at whitespace and comma\r\n  delimiter: /[\\s,]+/,\r\n\r\n  // The following regex are used to parse the d attribute of a path\r\n\r\n  // Matches all hyphens which are not after an exponent\r\n  hyphen: /([^e])-/gi,\r\n\r\n  // Replaces and tests for all path letters\r\n  pathLetters: /[MLHVCSQTAZ]/gi,\r\n\r\n  // yes we need this one, too\r\n  isPathLetter: /[MLHVCSQTAZ]/i,\r\n\r\n  // matches 0.154.23.45\r\n  numbersWithDots: /((\\d?\\.\\d+(?:e[+-]?\\d+)?)((?:\\.\\d+(?:e[+-]?\\d+)?)+))+/gi,\r\n\r\n  // matches .\r\n  dots: /\\./g\r\n}\r\n","\r\nSVG.utils = {\r\n  // Map function\r\n  map: function (array, block) {\r\n    var i\r\n    var il = array.length\r\n    var result = []\r\n\r\n    for (i = 0; i < il; i++) {\r\n      result.push(block(array[i]))\r\n    }\r\n\r\n    return result\r\n  },\r\n\r\n  // Filter function\r\n  filter: function (array, block) {\r\n    var i\r\n    var il = array.length\r\n    var result = []\r\n\r\n    for (i = 0; i < il; i++) {\r\n      if (block(array[i])) { result.push(array[i]) }\r\n    }\r\n\r\n    return result\r\n  },\r\n\r\n  // Degrees to radians\r\n  radians: function (d) {\r\n    return d % 360 * Math.PI / 180\r\n  },\r\n\r\n  // Radians to degrees\r\n  degrees: function (r) {\r\n    return r * 180 / Math.PI % 360\r\n  },\r\n\r\n  filterSVGElements: function (nodes) {\r\n    return this.filter(nodes, function (el) { return el instanceof window.SVGElement })\r\n  }\r\n\r\n}\r\n","\r\nSVG.void = function () {}\r\n\r\nSVG.defaults = {\r\n\r\n  // Default animation values\r\n  timeline: {\r\n    duration: 400,\r\n    ease: '>',\r\n    delay: 0\r\n  },\r\n\r\n  // Default attribute values\r\n  attrs: {\r\n\r\n    // fill and stroke\r\n    'fill-opacity': 1,\r\n    'stroke-opacity': 1,\r\n    'stroke-width': 0,\r\n    'stroke-linejoin': 'miter',\r\n    'stroke-linecap': 'butt',\r\n    fill: '#000000',\r\n    stroke: '#000000',\r\n    opacity: 1,\r\n\r\n    // position\r\n    x: 0,\r\n    y: 0,\r\n    cx: 0,\r\n    cy: 0,\r\n\r\n    // size\r\n    width: 0,\r\n    height: 0,\r\n\r\n    // radius\r\n    r: 0,\r\n    rx: 0,\r\n    ry: 0,\r\n\r\n    // gradient\r\n    offset: 0,\r\n    'stop-opacity': 1,\r\n    'stop-color': '#000000',\r\n\r\n    // text\r\n    'font-size': 16,\r\n    'font-family': 'Helvetica, Arial, sans-serif',\r\n    'text-anchor': 'start'\r\n  }\r\n}\r\n","SVG.Queue = SVG.invent({\r\n  create: function () {\r\n    this._first = null\r\n    this._last = null\r\n  },\r\n\r\n  extend: {\r\n    push: function (value) {\r\n      // An item stores an id and the provided value\r\n      var item = value.next ? value : { value: value, next: null, prev: null }\r\n\r\n      // Deal with the queue being empty or populated\r\n      if (this._last) {\r\n        item.prev = this._last\r\n        this._last.next = item\r\n        this._last = item\r\n      } else {\r\n        this._last = item\r\n        this._first = item\r\n      }\r\n\r\n      // Update the length and return the current item\r\n      return item\r\n    },\r\n\r\n    shift: function () {\r\n      // Check if we have a value\r\n      var remove = this._first\r\n      if (!remove) return null\r\n\r\n      // If we do, remove it and relink things\r\n      this._first = remove.next\r\n      if (this._first) this._first.prev = null\r\n      this._last = this._first ? this._last : null\r\n      return remove.value\r\n    },\r\n\r\n    // Shows us the first item in the list\r\n    first: function () {\r\n      return this._first && this._first.value\r\n    },\r\n\r\n    // Shows us the last item in the list\r\n    last: function () {\r\n      return this._last && this._last.value\r\n    },\r\n\r\n    // Removes the item that was returned from the push\r\n    remove: function (item) {\r\n      // Relink the previous item\r\n      if (item.prev) item.prev.next = item.next\r\n      if (item.next) item.next.prev = item.prev\r\n      if (item === this._last) this._last = item.prev\r\n      if (item === this._first) this._first = item.next\r\n\r\n      // Invalidate item\r\n      item.prev = null\r\n      item.next = null\r\n    }\r\n  }\r\n})\r\n","/* globals fullHex, compToHex */\r\n\r\n/*\r\n\r\nColor {\r\n  constructor (a, b, c, space) {\r\n    space: 'hsl'\r\n    a: 30\r\n    b: 20\r\n    c: 10\r\n  },\r\n\r\n  toRgb () { return new Color in rgb space }\r\n  toHsl () { return new Color in hsl space }\r\n  toLab () { return new Color in lab space }\r\n\r\n  toArray () { [space, a, b, c] }\r\n  fromArray () { convert it back }\r\n}\r\n\r\n// Conversions aren't always exact because of monitor profiles etc...\r\nnew Color(h, s, l, 'hsl') !== new Color(r, g, b).hsl()\r\nnew Color(100, 100, 100, [space])\r\nnew Color('hsl(30, 20, 10)')\r\n\r\n// Sugar\r\nSVG.rgb(30, 20, 50).lab()\r\nSVG.hsl()\r\nSVG.lab('rgb(100, 100, 100)')\r\n*/\r\n\r\n// Module for color convertions\r\nSVG.Color = function (color, g, b) {\r\n  var match\r\n\r\n  // initialize defaults\r\n  this.r = 0\r\n  this.g = 0\r\n  this.b = 0\r\n\r\n  if (!color) return\r\n\r\n  // parse color\r\n  if (typeof color === 'string') {\r\n    if (SVG.regex.isRgb.test(color)) {\r\n      // get rgb values\r\n      match = SVG.regex.rgb.exec(color.replace(SVG.regex.whitespace, ''))\r\n\r\n      // parse numeric values\r\n      this.r = parseInt(match[1])\r\n      this.g = parseInt(match[2])\r\n      this.b = parseInt(match[3])\r\n    } else if (SVG.regex.isHex.test(color)) {\r\n      // get hex values\r\n      match = SVG.regex.hex.exec(fullHex(color))\r\n\r\n      // parse numeric values\r\n      this.r = parseInt(match[1], 16)\r\n      this.g = parseInt(match[2], 16)\r\n      this.b = parseInt(match[3], 16)\r\n    }\r\n  } else if (Array.isArray(color)) {\r\n    this.r = color[0]\r\n    this.g = color[1]\r\n    this.b = color[2]\r\n  } else if (typeof color === 'object') {\r\n    this.r = color.r\r\n    this.g = color.g\r\n    this.b = color.b\r\n  } else if (arguments.length === 3) {\r\n    this.r = color\r\n    this.g = g\r\n    this.b = b\r\n  }\r\n}\r\n\r\nSVG.extend(SVG.Color, {\r\n  // Default to hex conversion\r\n  toString: function () {\r\n    return this.toHex()\r\n  },\r\n  toArray: function () {\r\n    return [this.r, this.g, this.b]\r\n  },\r\n  fromArray: function (a) {\r\n    return new SVG.Color(a)\r\n  },\r\n  // Build hex value\r\n  toHex: function () {\r\n    return '#' +\r\n      compToHex(Math.round(this.r)) +\r\n      compToHex(Math.round(this.g)) +\r\n      compToHex(Math.round(this.b))\r\n  },\r\n  // Build rgb value\r\n  toRgb: function () {\r\n    return 'rgb(' + [this.r, this.g, this.b].join() + ')'\r\n  },\r\n  // Calculate true brightness\r\n  brightness: function () {\r\n    return (this.r / 255 * 0.30) +\r\n      (this.g / 255 * 0.59) +\r\n      (this.b / 255 * 0.11)\r\n  },\r\n  // Make color morphable\r\n  morph: function (color) {\r\n    this.destination = new SVG.Color(color)\r\n\r\n    return this\r\n  },\r\n  // Get morphed color at given position\r\n  at: function (pos) {\r\n    // make sure a destination is defined\r\n    if (!this.destination) return this\r\n\r\n    // normalise pos\r\n    pos = pos < 0 ? 0 : pos > 1 ? 1 : pos\r\n\r\n    // generate morphed color\r\n    return new SVG.Color({\r\n      r: ~~(this.r + (this.destination.r - this.r) * pos),\r\n      g: ~~(this.g + (this.destination.g - this.g) * pos),\r\n      b: ~~(this.b + (this.destination.b - this.b) * pos)\r\n    })\r\n  }\r\n\r\n})\r\n\r\n// Testers\r\n\r\n// Test if given value is a color string\r\nSVG.Color.test = function (color) {\r\n  color += ''\r\n  return SVG.regex.isHex.test(color) ||\r\n    SVG.regex.isRgb.test(color)\r\n}\r\n\r\n// Test if given value is a rgb object\r\nSVG.Color.isRgb = function (color) {\r\n  return color && typeof color.r === 'number' &&\r\n    typeof color.g === 'number' &&\r\n    typeof color.b === 'number'\r\n}\r\n\r\n// Test if given value is a color\r\nSVG.Color.isColor = function (color) {\r\n  return SVG.Color.isRgb(color) || SVG.Color.test(color)\r\n}\r\n","/* global arrayClone */\r\n\r\n// Module for array conversion\r\nSVG.Array = function (array, fallback) {\r\n  array = (array || []).valueOf()\r\n\r\n  // if array is empty and fallback is provided, use fallback\r\n  if (array.length === 0 && fallback) {\r\n    array = fallback.valueOf()\r\n  }\r\n\r\n  // parse array\r\n  this.value = this.parse(array)\r\n}\r\n\r\nSVG.extend(SVG.Array, {\r\n  // Make array morphable\r\n  morph: function (array) {\r\n    this.destination = this.parse(array)\r\n\r\n    // normalize length of arrays\r\n    if (this.value.length !== this.destination.length) {\r\n      var lastValue = this.value[this.value.length - 1]\r\n      var lastDestination = this.destination[this.destination.length - 1]\r\n\r\n      while (this.value.length > this.destination.length) {\r\n        this.destination.push(lastDestination)\r\n      }\r\n      while (this.value.length < this.destination.length) {\r\n        this.value.push(lastValue)\r\n      }\r\n    }\r\n\r\n    return this\r\n  },\r\n  // Clean up any duplicate points\r\n  settle: function () {\r\n    // find all unique values\r\n    for (var i = 0, il = this.value.length, seen = []; i < il; i++) {\r\n      if (seen.indexOf(this.value[i]) === -1) {\r\n        seen.push(this.value[i])\r\n      }\r\n    }\r\n\r\n    // set new value\r\n    this.value = seen\r\n    return seen\r\n  },\r\n  // Get morphed array at given position\r\n  at: function (pos) {\r\n    // make sure a destination is defined\r\n    if (!this.destination) return this\r\n\r\n    // generate morphed array\r\n    for (var i = 0, il = this.value.length, array = []; i < il; i++) {\r\n      array.push(this.value[i] + (this.destination[i] - this.value[i]) * pos)\r\n    }\r\n\r\n    return new SVG.Array(array)\r\n  },\r\n  toArray: function () {\r\n    return this.value\r\n  },\r\n  // Convert array to string\r\n  toString: function () {\r\n    return this.value.join(' ')\r\n  },\r\n  // Real value\r\n  valueOf: function () {\r\n    return this.value\r\n  },\r\n  // Parse whitespace separated string\r\n  parse: function (array) {\r\n    array = array.valueOf()\r\n\r\n    // if already is an array, no need to parse it\r\n    if (Array.isArray(array)) return array\r\n\r\n    return array.trim().split(SVG.regex.delimiter).map(parseFloat)\r\n  },\r\n  // Reverse array\r\n  reverse: function () {\r\n    this.value.reverse()\r\n\r\n    return this\r\n  },\r\n  clone: function () {\r\n    var clone = new this.constructor()\r\n    clone.value = arrayClone(this.value)\r\n    return clone\r\n  }\r\n})\r\n","\r\n// Poly points array\r\nSVG.PointArray = function (array, fallback) {\r\n  SVG.Array.call(this, array, fallback || [[0, 0]])\r\n}\r\n\r\n// Inherit from SVG.Array\r\nSVG.PointArray.prototype = new SVG.Array()\r\nSVG.PointArray.prototype.constructor = SVG.PointArray\r\n\r\nSVG.extend(SVG.PointArray, {\r\n  // Convert array to string\r\n  toString: function () {\r\n    // convert to a poly point string\r\n    for (var i = 0, il = this.value.length, array = []; i < il; i++) {\r\n      array.push(this.value[i].join(','))\r\n    }\r\n\r\n    return array.join(' ')\r\n  },\r\n\r\n  toArray: function () {\r\n    return this.value.reduce(function (prev, curr) {\r\n      return [].concat.call(prev, curr)\r\n    }, [])\r\n  },\r\n\r\n  // Convert array to line object\r\n  toLine: function () {\r\n    return {\r\n      x1: this.value[0][0],\r\n      y1: this.value[0][1],\r\n      x2: this.value[1][0],\r\n      y2: this.value[1][1]\r\n    }\r\n  },\r\n\r\n  // Get morphed array at given position\r\n  at: function (pos) {\r\n    // make sure a destination is defined\r\n    if (!this.destination) return this\r\n\r\n    // generate morphed point string\r\n    for (var i = 0, il = this.value.length, array = []; i < il; i++) {\r\n      array.push([\r\n        this.value[i][0] + (this.destination[i][0] - this.value[i][0]) * pos,\r\n        this.value[i][1] + (this.destination[i][1] - this.value[i][1]) * pos\r\n      ])\r\n    }\r\n\r\n    return new SVG.PointArray(array)\r\n  },\r\n\r\n  // Parse point string and flat array\r\n  parse: function (array) {\r\n    var points = []\r\n\r\n    array = array.valueOf()\r\n\r\n    // if it is an array\r\n    if (Array.isArray(array)) {\r\n      // and it is not flat, there is no need to parse it\r\n      if (Array.isArray(array[0])) {\r\n        return array\r\n      }\r\n    } else { // Else, it is considered as a string\r\n      // parse points\r\n      array = array.trim().split(SVG.regex.delimiter).map(parseFloat)\r\n    }\r\n\r\n    // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints\r\n    // Odd number of coordinates is an error. In such cases, drop the last odd coordinate.\r\n    if (array.length % 2 !== 0) array.pop()\r\n\r\n    // wrap points in two-tuples and parse points as floats\r\n    for (var i = 0, len = array.length; i < len; i = i + 2) {\r\n      points.push([ array[i], array[i + 1] ])\r\n    }\r\n\r\n    return points\r\n  },\r\n\r\n  // Move point string\r\n  move: function (x, y) {\r\n    var box = this.bbox()\r\n\r\n    // get relative offset\r\n    x -= box.x\r\n    y -= box.y\r\n\r\n    // move every point\r\n    if (!isNaN(x) && !isNaN(y)) {\r\n      for (var i = this.value.length - 1; i >= 0; i--) {\r\n        this.value[i] = [this.value[i][0] + x, this.value[i][1] + y]\r\n      }\r\n    }\r\n\r\n    return this\r\n  },\r\n  // Resize poly string\r\n  size: function (width, height) {\r\n    var i\r\n    var box = this.bbox()\r\n\r\n    // recalculate position of all points according to new size\r\n    for (i = this.value.length - 1; i >= 0; i--) {\r\n      if (box.width) this.value[i][0] = ((this.value[i][0] - box.x) * width) / box.width + box.x\r\n      if (box.height) this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y\r\n    }\r\n\r\n    return this\r\n  },\r\n\r\n  // Get bounding box of points\r\n  bbox: function () {\r\n    var maxX = -Infinity\r\n    var maxY = -Infinity\r\n    var minX = Infinity\r\n    var minY = Infinity\r\n    this.value.forEach(function (el) {\r\n      maxX = Math.max(el[0], maxX)\r\n      maxY = Math.max(el[1], maxY)\r\n      minX = Math.min(el[0], minX)\r\n      minY = Math.min(el[1], minY)\r\n    })\r\n    return {x: minX, y: minY, width: maxX - minX, height: maxY - minY}\r\n  }\r\n})\r\n","/* globals arrayToString, pathRegReplace */\r\n\r\nvar pathHandlers = {\r\n  M: function (c, p, p0) {\r\n    p.x = p0.x = c[0]\r\n    p.y = p0.y = c[1]\r\n\r\n    return ['M', p.x, p.y]\r\n  },\r\n  L: function (c, p) {\r\n    p.x = c[0]\r\n    p.y = c[1]\r\n    return ['L', c[0], c[1]]\r\n  },\r\n  H: function (c, p) {\r\n    p.x = c[0]\r\n    return ['H', c[0]]\r\n  },\r\n  V: function (c, p) {\r\n    p.y = c[0]\r\n    return ['V', c[0]]\r\n  },\r\n  C: function (c, p) {\r\n    p.x = c[4]\r\n    p.y = c[5]\r\n    return ['C', c[0], c[1], c[2], c[3], c[4], c[5]]\r\n  },\r\n  S: function (c, p) {\r\n    p.x = c[2]\r\n    p.y = c[3]\r\n    return ['S', c[0], c[1], c[2], c[3]]\r\n  },\r\n  Q: function (c, p) {\r\n    p.x = c[2]\r\n    p.y = c[3]\r\n    return ['Q', c[0], c[1], c[2], c[3]]\r\n  },\r\n  T: function (c, p) {\r\n    p.x = c[0]\r\n    p.y = c[1]\r\n    return ['T', c[0], c[1]]\r\n  },\r\n  Z: function (c, p, p0) {\r\n    p.x = p0.x\r\n    p.y = p0.y\r\n    return ['Z']\r\n  },\r\n  A: function (c, p) {\r\n    p.x = c[5]\r\n    p.y = c[6]\r\n    return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]]\r\n  }\r\n}\r\n\r\nvar mlhvqtcsaz = 'mlhvqtcsaz'.split('')\r\n\r\nfor (var i = 0, il = mlhvqtcsaz.length; i < il; ++i) {\r\n  pathHandlers[mlhvqtcsaz[i]] = (function (i) {\r\n    return function (c, p, p0) {\r\n      if (i === 'H') c[0] = c[0] + p.x\r\n      else if (i === 'V') c[0] = c[0] + p.y\r\n      else if (i === 'A') {\r\n        c[5] = c[5] + p.x\r\n        c[6] = c[6] + p.y\r\n      } else {\r\n        for (var j = 0, jl = c.length; j < jl; ++j) {\r\n          c[j] = c[j] + (j % 2 ? p.y : p.x)\r\n        }\r\n      }\r\n\r\n      return pathHandlers[i](c, p, p0)\r\n    }\r\n  })(mlhvqtcsaz[i].toUpperCase())\r\n}\r\n\r\n// Path points array\r\nSVG.PathArray = function (array, fallback) {\r\n  SVG.Array.call(this, array, fallback || [['M', 0, 0]])\r\n}\r\n\r\n// Inherit from SVG.Array\r\nSVG.PathArray.prototype = new SVG.Array()\r\nSVG.PathArray.prototype.constructor = SVG.PathArray\r\n\r\nSVG.extend(SVG.PathArray, {\r\n  // Convert array to string\r\n  toString: function () {\r\n    return arrayToString(this.value)\r\n  },\r\n  toArray: function () {\r\n    return this.value.reduce(function (prev, curr) {\r\n      return [].concat.call(prev, curr)\r\n    }, [])\r\n  },\r\n  // Move path string\r\n  move: function (x, y) {\r\n    // get bounding box of current situation\r\n    var box = this.bbox()\r\n\r\n    // get relative offset\r\n    x -= box.x\r\n    y -= box.y\r\n\r\n    if (!isNaN(x) && !isNaN(y)) {\r\n      // move every point\r\n      for (var l, i = this.value.length - 1; i >= 0; i--) {\r\n        l = this.value[i][0]\r\n\r\n        if (l === 'M' || l === 'L' || l === 'T') {\r\n          this.value[i][1] += x\r\n          this.value[i][2] += y\r\n        } else if (l === 'H') {\r\n          this.value[i][1] += x\r\n        } else if (l === 'V') {\r\n          this.value[i][1] += y\r\n        } else if (l === 'C' || l === 'S' || l === 'Q') {\r\n          this.value[i][1] += x\r\n          this.value[i][2] += y\r\n          this.value[i][3] += x\r\n          this.value[i][4] += y\r\n\r\n          if (l === 'C') {\r\n            this.value[i][5] += x\r\n            this.value[i][6] += y\r\n          }\r\n        } else if (l === 'A') {\r\n          this.value[i][6] += x\r\n          this.value[i][7] += y\r\n        }\r\n      }\r\n    }\r\n\r\n    return this\r\n  },\r\n  // Resize path string\r\n  size: function (width, height) {\r\n    // get bounding box of current situation\r\n    var box = this.bbox()\r\n    var i, l\r\n\r\n    // recalculate position of all points according to new size\r\n    for (i = this.value.length - 1; i >= 0; i--) {\r\n      l = this.value[i][0]\r\n\r\n      if (l === 'M' || l === 'L' || l === 'T') {\r\n        this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r\n        this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y\r\n      } else if (l === 'H') {\r\n        this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r\n      } else if (l === 'V') {\r\n        this.value[i][1] = ((this.value[i][1] - box.y) * height) / box.height + box.y\r\n      } else if (l === 'C' || l === 'S' || l === 'Q') {\r\n        this.value[i][1] = ((this.value[i][1] - box.x) * width) / box.width + box.x\r\n        this.value[i][2] = ((this.value[i][2] - box.y) * height) / box.height + box.y\r\n        this.value[i][3] = ((this.value[i][3] - box.x) * width) / box.width + box.x\r\n        this.value[i][4] = ((this.value[i][4] - box.y) * height) / box.height + box.y\r\n\r\n        if (l === 'C') {\r\n          this.value[i][5] = ((this.value[i][5] - box.x) * width) / box.width + box.x\r\n          this.value[i][6] = ((this.value[i][6] - box.y) * height) / box.height + box.y\r\n        }\r\n      } else if (l === 'A') {\r\n        // resize radii\r\n        this.value[i][1] = (this.value[i][1] * width) / box.width\r\n        this.value[i][2] = (this.value[i][2] * height) / box.height\r\n\r\n        // move position values\r\n        this.value[i][6] = ((this.value[i][6] - box.x) * width) / box.width + box.x\r\n        this.value[i][7] = ((this.value[i][7] - box.y) * height) / box.height + box.y\r\n      }\r\n    }\r\n\r\n    return this\r\n  },\r\n  // Test if the passed path array use the same path data commands as this path array\r\n  equalCommands: function (pathArray) {\r\n    var i, il, equalCommands\r\n\r\n    pathArray = new SVG.PathArray(pathArray)\r\n\r\n    equalCommands = this.value.length === pathArray.value.length\r\n    for (i = 0, il = this.value.length; equalCommands && i < il; i++) {\r\n      equalCommands = this.value[i][0] === pathArray.value[i][0]\r\n    }\r\n\r\n    return equalCommands\r\n  },\r\n  // Make path array morphable\r\n  morph: function (pathArray) {\r\n    pathArray = new SVG.PathArray(pathArray)\r\n\r\n    if (this.equalCommands(pathArray)) {\r\n      this.destination = pathArray\r\n    } else {\r\n      this.destination = null\r\n    }\r\n\r\n    return this\r\n  },\r\n  // Get morphed path array at given position\r\n  at: function (pos) {\r\n    // make sure a destination is defined\r\n    if (!this.destination) return this\r\n\r\n    var sourceArray = this.value\r\n    var destinationArray = this.destination.value\r\n    var array = []\r\n    var pathArray = new SVG.PathArray()\r\n    var i, il, j, jl\r\n\r\n    // Animate has specified in the SVG spec\r\n    // See: https://www.w3.org/TR/SVG11/paths.html#PathElement\r\n    for (i = 0, il = sourceArray.length; i < il; i++) {\r\n      array[i] = [sourceArray[i][0]]\r\n      for (j = 1, jl = sourceArray[i].length; j < jl; j++) {\r\n        array[i][j] = sourceArray[i][j] + (destinationArray[i][j] - sourceArray[i][j]) * pos\r\n      }\r\n      // For the two flags of the elliptical arc command, the SVG spec say:\r\n      // Flags and booleans are interpolated as fractions between zero and one, with any non-zero value considered to be a value of one/true\r\n      // Elliptical arc command as an array followed by corresponding indexes:\r\n      // ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\r\n      //   0    1   2        3                 4             5      6  7\r\n      if (array[i][0] === 'A') {\r\n        array[i][4] = +(array[i][4] !== 0)\r\n        array[i][5] = +(array[i][5] !== 0)\r\n      }\r\n    }\r\n\r\n    // Directly modify the value of a path array, this is done this way for performance\r\n    pathArray.value = array\r\n    return pathArray\r\n  },\r\n  // Absolutize and parse path to array\r\n  parse: function (array) {\r\n    // if it's already a patharray, no need to parse it\r\n    if (array instanceof SVG.PathArray) return array.valueOf()\r\n\r\n    // prepare for parsing\r\n    var s\r\n    var paramCnt = { 'M': 2, 'L': 2, 'H': 1, 'V': 1, 'C': 6, 'S': 4, 'Q': 4, 'T': 2, 'A': 7, 'Z': 0 }\r\n\r\n    if (typeof array === 'string') {\r\n      array = array\r\n        .replace(SVG.regex.numbersWithDots, pathRegReplace) // convert 45.123.123 to 45.123 .123\r\n        .replace(SVG.regex.pathLetters, ' $& ') // put some room between letters and numbers\r\n        .replace(SVG.regex.hyphen, '$1 -')      // add space before hyphen\r\n        .trim()                                 // trim\r\n        .split(SVG.regex.delimiter)   // split into array\r\n    } else {\r\n      array = array.reduce(function (prev, curr) {\r\n        return [].concat.call(prev, curr)\r\n      }, [])\r\n    }\r\n\r\n    // array now is an array containing all parts of a path e.g. ['M', '0', '0', 'L', '30', '30' ...]\r\n    var result = []\r\n    var p = new SVG.Point()\r\n    var p0 = new SVG.Point()\r\n    var index = 0\r\n    var len = array.length\r\n\r\n    do {\r\n      // Test if we have a path letter\r\n      if (SVG.regex.isPathLetter.test(array[index])) {\r\n        s = array[index]\r\n        ++index\r\n      // If last letter was a move command and we got no new, it defaults to [L]ine\r\n      } else if (s === 'M') {\r\n        s = 'L'\r\n      } else if (s === 'm') {\r\n        s = 'l'\r\n      }\r\n\r\n      result.push(pathHandlers[s].call(null,\r\n          array.slice(index, (index = index + paramCnt[s.toUpperCase()])).map(parseFloat),\r\n          p, p0\r\n        )\r\n      )\r\n    } while (len > index)\r\n\r\n    return result\r\n  },\r\n  // Get bounding box of path\r\n  bbox: function () {\r\n    SVG.parser().path.setAttribute('d', this.toString())\r\n    return SVG.parser.nodes.path.getBBox()\r\n  }\r\n\r\n})\r\n","\r\n// Module for unit convertions\r\nSVG.Number = SVG.invent({\r\n  // Initialize\r\n  create: function (value, unit) {\r\n    unit = Array.isArray(value) ? value[1] : unit\r\n    value = Array.isArray(value) ? value[0] : value\r\n\r\n    // initialize defaults\r\n    this.value = 0\r\n    this.unit = unit || ''\r\n\r\n    // parse value\r\n    if (typeof value === 'number') {\r\n      // ensure a valid numeric value\r\n      this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value\r\n    } else if (typeof value === 'string') {\r\n      unit = value.match(SVG.regex.numberAndUnit)\r\n\r\n      if (unit) {\r\n        // make value numeric\r\n        this.value = parseFloat(unit[1])\r\n\r\n        // normalize\r\n        if (unit[5] === '%') { this.value /= 100 } else if (unit[5] === 's') {\r\n          this.value *= 1000\r\n        }\r\n\r\n        // store unit\r\n        this.unit = unit[5]\r\n      }\r\n    } else {\r\n      if (value instanceof SVG.Number) {\r\n        this.value = value.valueOf()\r\n        this.unit = value.unit\r\n      }\r\n    }\r\n  },\r\n  // Add methods\r\n  extend: {\r\n    // Stringalize\r\n    toString: function () {\r\n      return (this.unit === '%' ? ~~(this.value * 1e8) / 1e6\r\n        : this.unit === 's' ? this.value / 1e3\r\n        : this.value\r\n      ) + this.unit\r\n    },\r\n    toJSON: function () {\r\n      return this.toString()\r\n    },   // Convert to primitive\r\n    toArray: function () {\r\n      return [this.value, this.unit]\r\n    },\r\n    valueOf: function () {\r\n      return this.value\r\n    },\r\n    // Add number\r\n    plus: function (number) {\r\n      number = new SVG.Number(number)\r\n      return new SVG.Number(this + number, this.unit || number.unit)\r\n    },\r\n    // Subtract number\r\n    minus: function (number) {\r\n      number = new SVG.Number(number)\r\n      return new SVG.Number(this - number, this.unit || number.unit)\r\n    },\r\n    // Multiply number\r\n    times: function (number) {\r\n      number = new SVG.Number(number)\r\n      return new SVG.Number(this * number, this.unit || number.unit)\r\n    },\r\n    // Divide number\r\n    divide: function (number) {\r\n      number = new SVG.Number(number)\r\n      return new SVG.Number(this / number, this.unit || number.unit)\r\n    },\r\n    // Convert to different unit\r\n    to: function (unit) {\r\n      var number = new SVG.Number(this)\r\n\r\n      if (typeof unit === 'string') {\r\n        number.unit = unit\r\n      }\r\n\r\n      return number\r\n    },\r\n    // Make number morphable\r\n    morph: function (number) {\r\n      this.destination = new SVG.Number(number)\r\n\r\n      if (number.relative) {\r\n        this.destination.value += this.value\r\n      }\r\n\r\n      return this\r\n    },\r\n    // Get morphed number at given position\r\n    at: function (pos) {\r\n      // Make sure a destination is defined\r\n      if (!this.destination) return this\r\n\r\n      // Generate new morphed number\r\n      return new SVG.Number(this.destination)\r\n          .minus(this)\r\n          .times(pos)\r\n          .plus(this)\r\n    }\r\n  }\r\n})\r\n","SVG.EventTarget = SVG.invent({\r\n  create: function () {},\r\n  extend: {\r\n    // Bind given event to listener\r\n    on: function (event, listener, binding, options) {\r\n      SVG.on(this, event, listener, binding, options)\r\n      return this\r\n    },\r\n    // Unbind event from listener\r\n    off: function (event, listener) {\r\n      SVG.off(this, event, listener)\r\n      return this\r\n    },\r\n    dispatch: function (event, data) {\r\n      return SVG.dispatch(this, event, data)\r\n    },\r\n    // Fire given event\r\n    fire: function (event, data) {\r\n      this.dispatch(event, data)\r\n      return this\r\n    }\r\n  }\r\n})\r\n","/* global createElement */\r\n\r\nSVG.HtmlNode = SVG.invent({\r\n  inherit: SVG.EventTarget,\r\n  create: function (element) {\r\n    this.node = element\r\n  },\r\n\r\n  extend: {\r\n    add: function (element, i) {\r\n      element = createElement(element)\r\n\r\n      if (element.node !== this.node.children[i]) {\r\n        this.node.insertBefore(element.node, this.node.children[i] || null)\r\n      }\r\n\r\n      return this\r\n    },\r\n\r\n    put: function (element, i) {\r\n      this.add(element, i)\r\n      return element\r\n    },\r\n\r\n    getEventTarget: function () {\r\n      return this.node\r\n    }\r\n  }\r\n})\r\n","/* global proportionalSize, assignNewId, createElement, matches, is */\r\n\r\nSVG.Element = SVG.invent({\r\n  inherit: SVG.EventTarget,\r\n\r\n  // Initialize node\r\n  create: function (node) {\r\n    // event listener\r\n    this.events = {}\r\n\r\n    // initialize data object\r\n    this.dom = {}\r\n\r\n    // create circular reference\r\n    this.node = node\r\n    if (this.node) {\r\n      this.type = node.nodeName\r\n      this.node.instance = this\r\n      this.events = node.events || {}\r\n\r\n      if (node.hasAttribute('svgjs:data')) {\r\n        // pull svgjs data from the dom (getAttributeNS doesn't work in html5)\r\n        this.setData(JSON.parse(node.getAttribute('svgjs:data')) || {})\r\n      }\r\n    }\r\n  },\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Move over x-axis\r\n    x: function (x) {\r\n      return this.attr('x', x)\r\n    },\r\n\r\n    // Move over y-axis\r\n    y: function (y) {\r\n      return this.attr('y', y)\r\n    },\r\n\r\n    // Move by center over x-axis\r\n    cx: function (x) {\r\n      return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2)\r\n    },\r\n\r\n    // Move by center over y-axis\r\n    cy: function (y) {\r\n      return y == null\r\n        ? this.y() + this.height() / 2\r\n        : this.y(y - this.height() / 2)\r\n    },\r\n\r\n    // Move element to given x and y values\r\n    move: function (x, y) {\r\n      return this.x(x).y(y)\r\n    },\r\n\r\n    // Move element by its center\r\n    center: function (x, y) {\r\n      return this.cx(x).cy(y)\r\n    },\r\n\r\n    // Set width of element\r\n    width: function (width) {\r\n      return this.attr('width', width)\r\n    },\r\n\r\n    // Set height of element\r\n    height: function (height) {\r\n      return this.attr('height', height)\r\n    },\r\n\r\n    // Set element size to given width and height\r\n    size: function (width, height) {\r\n      var p = proportionalSize(this, width, height)\r\n\r\n      return this\r\n        .width(new SVG.Number(p.width))\r\n        .height(new SVG.Number(p.height))\r\n    },\r\n\r\n    // Clone element\r\n    clone: function (parent) {\r\n      // write dom data to the dom so the clone can pickup the data\r\n      this.writeDataToDom()\r\n\r\n      // clone element and assign new id\r\n      var clone = assignNewId(this.node.cloneNode(true))\r\n\r\n      // insert the clone in the given parent or after myself\r\n      if (parent) parent.add(clone)\r\n      else this.after(clone)\r\n\r\n      return clone\r\n    },\r\n\r\n    // Remove element\r\n    remove: function () {\r\n      if (this.parent()) { this.parent().removeElement(this) }\r\n\r\n      return this\r\n    },\r\n\r\n    // Replace element\r\n    replace: function (element) {\r\n      this.after(element).remove()\r\n\r\n      return element\r\n    },\r\n\r\n    // Add element to given container and return self\r\n    addTo: function (parent) {\r\n      return createElement(parent).put(this)\r\n    },\r\n\r\n    // Add element to given container and return container\r\n    putIn: function (parent) {\r\n      return createElement(parent).add(this)\r\n    },\r\n\r\n    // Get / set id\r\n    id: function (id) {\r\n      // generate new id if no id set\r\n      if (typeof id === 'undefined' && !this.node.id) {\r\n        this.node.id = SVG.eid(this.type)\r\n      }\r\n\r\n      // dont't set directly width this.node.id to make `null` work correctly\r\n      return this.attr('id', id)\r\n    },\r\n\r\n    // Checks whether the given point inside the bounding box of the element\r\n    inside: function (x, y) {\r\n      var box = this.bbox()\r\n\r\n      return x > box.x &&\r\n        y > box.y &&\r\n        x < box.x + box.width &&\r\n        y < box.y + box.height\r\n    },\r\n\r\n    // Show element\r\n    show: function () {\r\n      return this.css('display', '')\r\n    },\r\n\r\n    // Hide element\r\n    hide: function () {\r\n      return this.css('display', 'none')\r\n    },\r\n\r\n    // Is element visible?\r\n    visible: function () {\r\n      return this.css('display') !== 'none'\r\n    },\r\n\r\n    // Return id on string conversion\r\n    toString: function () {\r\n      return this.id()\r\n    },\r\n\r\n    // Return array of classes on the node\r\n    classes: function () {\r\n      var attr = this.attr('class')\r\n      return attr == null ? [] : attr.trim().split(SVG.regex.delimiter)\r\n    },\r\n\r\n    // Return true if class exists on the node, false otherwise\r\n    hasClass: function (name) {\r\n      return this.classes().indexOf(name) !== -1\r\n    },\r\n\r\n    // Add class to the node\r\n    addClass: function (name) {\r\n      if (!this.hasClass(name)) {\r\n        var array = this.classes()\r\n        array.push(name)\r\n        this.attr('class', array.join(' '))\r\n      }\r\n\r\n      return this\r\n    },\r\n\r\n    // Remove class from the node\r\n    removeClass: function (name) {\r\n      if (this.hasClass(name)) {\r\n        this.attr('class', this.classes().filter(function (c) {\r\n          return c !== name\r\n        }).join(' '))\r\n      }\r\n\r\n      return this\r\n    },\r\n\r\n    // Toggle the presence of a class on the node\r\n    toggleClass: function (name) {\r\n      return this.hasClass(name) ? this.removeClass(name) : this.addClass(name)\r\n    },\r\n\r\n    // Get referenced element form attribute value\r\n    reference: function (attr) {\r\n      return SVG.get(this.attr(attr))\r\n    },\r\n\r\n    // Returns the parent element instance\r\n    parent: function (type) {\r\n      var parent = this\r\n\r\n      // check for parent\r\n      if (!parent.node.parentNode) return null\r\n\r\n      // get parent element\r\n      parent = SVG.adopt(parent.node.parentNode)\r\n\r\n      if (!type) return parent\r\n\r\n      // loop trough ancestors if type is given\r\n      while (parent && parent.node instanceof window.SVGElement) {\r\n        if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent\r\n        parent = SVG.adopt(parent.node.parentNode)\r\n      }\r\n    },\r\n\r\n    // Get parent document\r\n    doc: function () {\r\n      var p = this.parent(SVG.Doc)\r\n      return p && p.doc()\r\n    },\r\n\r\n    // Get defs\r\n    defs: function () {\r\n      return this.doc().defs()\r\n    },\r\n\r\n    // return array of all ancestors of given type up to the root svg\r\n    parents: function (type) {\r\n      var parents = []\r\n      var parent = this\r\n\r\n      do {\r\n        parent = parent.parent(type)\r\n        if (!parent || !parent.node) break\r\n\r\n        parents.push(parent)\r\n      } while (parent.parent)\r\n\r\n      return parents\r\n    },\r\n\r\n    // matches the element vs a css selector\r\n    matches: function (selector) {\r\n      return matches(this.node, selector)\r\n    },\r\n\r\n    // Returns the svg node to call native svg methods on it\r\n    native: function () {\r\n      return this.node\r\n    },\r\n\r\n    // Import raw svg\r\n    svg: function (svg) {\r\n      var well, len\r\n\r\n      // act as a setter if svg is given\r\n      if (svg && this instanceof SVG.Parent) {\r\n        // create temporary holder\r\n        well = document.createElementNS(SVG.ns, 'svg')\r\n        // dump raw svg\r\n        well.innerHTML = svg\r\n\r\n        // transplant nodes\r\n        for (len = well.children.length; len--;) {\r\n          this.node.appendChild(well.firstElementChild)\r\n        }\r\n\r\n      // otherwise act as a getter\r\n      } else {\r\n        // write svgjs data to the dom\r\n        this.writeDataToDom()\r\n\r\n        return this.node.outerHTML\r\n      }\r\n\r\n      return this\r\n    },\r\n\r\n    // write svgjs data to the dom\r\n    writeDataToDom: function () {\r\n      // dump variables recursively\r\n      if (this.is(SVG.Parent)) {\r\n        this.each(function () {\r\n          this.writeDataToDom()\r\n        })\r\n      }\r\n\r\n      // remove previously set data\r\n      this.node.removeAttribute('svgjs:data')\r\n\r\n      if (Object.keys(this.dom).length) {\r\n        this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428\r\n      }\r\n      return this\r\n    },\r\n\r\n    // set given data to the elements data property\r\n    setData: function (o) {\r\n      this.dom = o\r\n      return this\r\n    },\r\n    is: function (obj) {\r\n      return is(this, obj)\r\n    },\r\n    getEventTarget: function () {\r\n      return this.node\r\n    }\r\n  }\r\n})\r\n","// Add events to elements\r\n;[ 'click',\r\n  'dblclick',\r\n  'mousedown',\r\n  'mouseup',\r\n  'mouseover',\r\n  'mouseout',\r\n  'mousemove',\r\n  'mouseenter',\r\n  'mouseleave',\r\n  'touchstart',\r\n  'touchmove',\r\n  'touchleave',\r\n  'touchend',\r\n  'touchcancel' ].forEach(function (event) {\r\n    // add event to SVG.Element\r\n    SVG.Element.prototype[event] = function (f) {\r\n      if (f === null) {\r\n        SVG.off(this, event)\r\n      } else {\r\n        SVG.on(this, event, f)\r\n      }\r\n      return this\r\n    }\r\n  })\r\n\r\nSVG.listenerId = 0\r\n\r\n// Add event binder in the SVG namespace\r\nSVG.on = function (node, events, listener, binding, options) {\r\n  var l = listener.bind(binding || node)\r\n  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node\r\n\r\n  // events can be an array of events or a string of events\r\n  events = Array.isArray(events) ? events : events.split(SVG.regex.delimiter)\r\n\r\n  // ensure instance object for nodes which are not adopted\r\n  n.instance = n.instance || {events: {}}\r\n\r\n  // pull event handlers from the element\r\n  var bag = n.instance.events\r\n\r\n  // add id to listener\r\n  if (!listener._svgjsListenerId) {\r\n    listener._svgjsListenerId = ++SVG.listenerId\r\n  }\r\n\r\n  events.forEach(function (event) {\r\n    var ev = event.split('.')[0]\r\n    var ns = event.split('.')[1] || '*'\r\n\r\n    // ensure valid object\r\n    bag[ev] = bag[ev] || {}\r\n    bag[ev][ns] = bag[ev][ns] || {}\r\n\r\n    // reference listener\r\n    bag[ev][ns][listener._svgjsListenerId] = l\r\n\r\n    // add listener\r\n    n.addEventListener(ev, l, options || false)\r\n  })\r\n}\r\n\r\n// Add event unbinder in the SVG namespace\r\nSVG.off = function (node, events, listener, options) {\r\n  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node\r\n  if (!n.instance) return\r\n\r\n  // listener can be a function or a number\r\n  if (typeof listener === 'function') {\r\n    listener = listener._svgjsListenerId\r\n    if (!listener) return\r\n  }\r\n\r\n  // pull event handlers from the element\r\n  var bag = n.instance.events\r\n\r\n  // events can be an array of events or a string or undefined\r\n  events = Array.isArray(events) ? events : (events || '').split(SVG.regex.delimiter)\r\n\r\n  events.forEach(function (event) {\r\n    var ev = event && event.split('.')[0]\r\n    var ns = event && event.split('.')[1]\r\n    var namespace, l\r\n\r\n    if (listener) {\r\n      // remove listener reference\r\n      if (bag[ev] && bag[ev][ns || '*']) {\r\n        // removeListener\r\n        n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false)\r\n\r\n        delete bag[ev][ns || '*'][listener]\r\n      }\r\n    } else if (ev && ns) {\r\n      // remove all listeners for a namespaced event\r\n      if (bag[ev] && bag[ev][ns]) {\r\n        for (l in bag[ev][ns]) { SVG.off(n, [ev, ns].join('.'), l) }\r\n\r\n        delete bag[ev][ns]\r\n      }\r\n    } else if (ns) {\r\n      // remove all listeners for a specific namespace\r\n      for (event in bag) {\r\n        for (namespace in bag[event]) {\r\n          if (ns === namespace) { SVG.off(n, [event, ns].join('.')) }\r\n        }\r\n      }\r\n    } else if (ev) {\r\n      // remove all listeners for the event\r\n      if (bag[ev]) {\r\n        for (namespace in bag[ev]) { SVG.off(n, [ev, namespace].join('.')) }\r\n\r\n        delete bag[ev]\r\n      }\r\n    } else {\r\n      // remove all listeners on a given node\r\n      for (event in bag) { SVG.off(n, event) }\r\n\r\n      n.instance.events = {}\r\n    }\r\n  })\r\n}\r\n\r\nSVG.dispatch = function (node, event, data) {\r\n  var n = node instanceof SVG.EventTarget ? node.getEventTarget() : node\r\n\r\n  // Dispatch event\r\n  if (event instanceof window.Event) {\r\n    n.dispatchEvent(event)\r\n  } else {\r\n    event = new window.CustomEvent(event, {detail: data, cancelable: true})\r\n    n.dispatchEvent(event)\r\n  }\r\n  return event\r\n}\r\n","/* global abcdef arrayToMatrix closeEnough formatTransforms isMatrixLike matrixMultiply */\r\n\r\nSVG.Matrix = SVG.invent({\r\n  // Initialize\r\n  create: function (source) {\r\n    var base = arrayToMatrix([1, 0, 0, 1, 0, 0])\r\n\r\n    // ensure source as object\r\n    source = source instanceof SVG.Element ? source.matrixify()\r\n      : typeof source === 'string' ? arrayToMatrix(source.split(SVG.regex.delimiter).map(parseFloat))\r\n      : Array.isArray(source) ? arrayToMatrix(source)\r\n      : (typeof source === 'object' && isMatrixLike(source)) ? source\r\n      : (typeof source === 'object') ? new SVG.Matrix().transform(source)\r\n      : arguments.length === 6 ? arrayToMatrix([].slice.call(arguments))\r\n      : base\r\n\r\n    // Merge the source matrix with the base matrix\r\n    this.a = source.a != null ? source.a : base.a\r\n    this.b = source.b != null ? source.b : base.b\r\n    this.c = source.c != null ? source.c : base.c\r\n    this.d = source.d != null ? source.d : base.d\r\n    this.e = source.e != null ? source.e : base.e\r\n    this.f = source.f != null ? source.f : base.f\r\n  },\r\n\r\n  // Add methods\r\n  extend: {\r\n\r\n    // Clones this matrix\r\n    clone: function () {\r\n      return new SVG.Matrix(this)\r\n    },\r\n\r\n    // Transform a matrix into another matrix by manipulating the space\r\n    transform: function (o) {\r\n      // Check if o is a matrix and then left multiply it directly\r\n      if (isMatrixLike(o)) {\r\n        var matrix = new SVG.Matrix(o)\r\n        return matrix.multiplyO(this)\r\n      }\r\n\r\n      // Get the proposed transformations and the current transformations\r\n      var t = formatTransforms(o)\r\n      var current = this\r\n      let { x: ox, y: oy } = new SVG.Point(t.ox, t.oy).transform(current)\r\n\r\n      // Construct the resulting matrix\r\n      var transformer = new SVG.Matrix()\r\n        .translateO(t.rx, t.ry)\r\n        .lmultiplyO(current)\r\n        .translateO(-ox, -oy)\r\n        .scaleO(t.scaleX, t.scaleY)\r\n        .skewO(t.skewX, t.skewY)\r\n        .shearO(t.shear)\r\n        .rotateO(t.theta)\r\n        .translateO(ox, oy)\r\n\r\n      // If we want the origin at a particular place, we force it there\r\n      if (isFinite(t.px) || isFinite(t.py)) {\r\n        const origin = new SVG.Point(ox, oy).transform(transformer)\r\n        // TODO: Replace t.px with isFinite(t.px)\r\n        const dx = t.px ? t.px - origin.x : 0\r\n        const dy = t.py ? t.py - origin.y : 0\r\n        transformer.translateO(dx, dy)\r\n      }\r\n\r\n      // Translate now after positioning\r\n      transformer.translateO(t.tx, t.ty)\r\n      return transformer\r\n    },\r\n\r\n    // Applies a matrix defined by its affine parameters\r\n    compose: function (o) {\r\n      if (o.origin) {\r\n        o.originX = o.origin[0]\r\n        o.originY = o.origin[1]\r\n      }\r\n      // Get the parameters\r\n      var ox = o.originX || 0\r\n      var oy = o.originY || 0\r\n      var sx = o.scaleX || 1\r\n      var sy = o.scaleY || 1\r\n      var lam = o.shear || 0\r\n      var theta = o.rotate || 0\r\n      var tx = o.translateX || 0\r\n      var ty = o.translateY || 0\r\n\r\n      // Apply the standard matrix\r\n      var result = new SVG.Matrix()\r\n        .translateO(-ox, -oy)\r\n        .scaleO(sx, sy)\r\n        .shearO(lam)\r\n        .rotateO(theta)\r\n        .translateO(tx, ty)\r\n        .lmultiplyO(this)\r\n        .translateO(ox, oy)\r\n      return result\r\n    },\r\n\r\n    // Decomposes this matrix into its affine parameters\r\n    decompose: function (cx = 0, cy = 0) {\r\n      // Get the parameters from the matrix\r\n      var a = this.a\r\n      var b = this.b\r\n      var c = this.c\r\n      var d = this.d\r\n      var e = this.e\r\n      var f = this.f\r\n\r\n      // Figure out if the winding direction is clockwise or counterclockwise\r\n      var determinant = a * d - b * c\r\n      var ccw = determinant > 0 ? 1 : -1\r\n\r\n      // Since we only shear in x, we can use the x basis to get the x scale\r\n      // and the rotation of the resulting matrix\r\n      var sx = ccw * Math.sqrt(a * a + b * b)\r\n      var thetaRad = Math.atan2(ccw * b, ccw * a)\r\n      var theta = 180 / Math.PI * thetaRad\r\n      var ct = Math.cos(thetaRad)\r\n      var st = Math.sin(thetaRad)\r\n\r\n      // We can then solve the y basis vector simultaneously to get the other\r\n      // two affine parameters directly from these parameters\r\n      var lam = (a * c + b * d) / determinant\r\n      var sy = ((c * sx) / (lam * a - b)) || ((d * sx) / (lam * b + a))\r\n\r\n      // Use the translations\r\n      let tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy)\r\n      let ty = f - cy + cx * st * sx + cy * (lam * st * sx + ct * sy)\r\n\r\n      // Construct the decomposition and return it\r\n      return {\r\n        // Return the affine parameters\r\n        scaleX: sx,\r\n        scaleY: sy,\r\n        shear: lam,\r\n        rotate: theta,\r\n        translateX: tx,\r\n        translateY: ty,\r\n        originX: cx,\r\n        originY: cy,\r\n\r\n        // Return the matrix parameters\r\n        a: this.a,\r\n        b: this.b,\r\n        c: this.c,\r\n        d: this.d,\r\n        e: this.e,\r\n        f: this.f\r\n      }\r\n    },\r\n\r\n    // Morph one matrix into another\r\n    morph: function (matrix) {\r\n      // Store new destination\r\n      this.destination = new SVG.Matrix(matrix)\r\n      return this\r\n    },\r\n\r\n    // Get morphed matrix at a given position\r\n    at: function (pos) {\r\n      // Make sure a destination is defined\r\n      if (!this.destination) return this\r\n\r\n      // Calculate morphed matrix at a given position\r\n      var matrix = new SVG.Matrix({\r\n        a: this.a + (this.destination.a - this.a) * pos,\r\n        b: this.b + (this.destination.b - this.b) * pos,\r\n        c: this.c + (this.destination.c - this.c) * pos,\r\n        d: this.d + (this.destination.d - this.d) * pos,\r\n        e: this.e + (this.destination.e - this.e) * pos,\r\n        f: this.f + (this.destination.f - this.f) * pos\r\n      })\r\n\r\n      return matrix\r\n    },\r\n\r\n    // Left multiplies by the given matrix\r\n    multiply: function (matrix) {\r\n      return this.clone().multiplyO(matrix)\r\n    },\r\n\r\n    multiplyO: function (matrix) {\r\n      // Get the matrices\r\n      var l = this\r\n      var r = matrix instanceof SVG.Matrix\r\n        ? matrix\r\n        : new SVG.Matrix(matrix)\r\n\r\n      return matrixMultiply(l, r, this)\r\n    },\r\n\r\n    lmultiply: function (matrix) {\r\n      return this.clone().lmultiplyO(matrix)\r\n    },\r\n\r\n    lmultiplyO: function (matrix) {\r\n      var r = this\r\n      var l = matrix instanceof SVG.Matrix\r\n        ? matrix\r\n        : new SVG.Matrix(matrix)\r\n\r\n      return matrixMultiply(l, r, this)\r\n    },\r\n\r\n    // Inverses matrix\r\n    inverseO: function () {\r\n      // Get the current parameters out of the matrix\r\n      var a = this.a\r\n      var b = this.b\r\n      var c = this.c\r\n      var d = this.d\r\n      var e = this.e\r\n      var f = this.f\r\n\r\n      // Invert the 2x2 matrix in the top left\r\n      var det = a * d - b * c\r\n      if (!det) throw new Error('Cannot invert ' + this)\r\n\r\n      // Calculate the top 2x2 matrix\r\n      var na = d / det\r\n      var nb = -b / det\r\n      var nc = -c / det\r\n      var nd = a / det\r\n\r\n      // Apply the inverted matrix to the top right\r\n      var ne = -(na * e + nc * f)\r\n      var nf = -(nb * e + nd * f)\r\n\r\n      // Construct the inverted matrix\r\n      this.a = na\r\n      this.b = nb\r\n      this.c = nc\r\n      this.d = nd\r\n      this.e = ne\r\n      this.f = nf\r\n\r\n      return this\r\n    },\r\n\r\n    inverse: function () {\r\n      return this.clone().inverseO()\r\n    },\r\n\r\n    // Translate matrix\r\n    translate: function (x, y) {\r\n      return this.clone().translateO(x, y)\r\n    },\r\n\r\n    translateO: function (x, y) {\r\n      this.e += x || 0\r\n      this.f += y || 0\r\n      return this\r\n    },\r\n\r\n    // Scale matrix\r\n    scale: function (x, y, cx, cy) {\r\n      return this.clone().scaleO(...arguments)\r\n    },\r\n\r\n    scaleO: function (x, y = x, cx = 0, cy = 0) {\r\n      // Support uniform scaling\r\n      if (arguments.length === 3) {\r\n        cy = cx\r\n        cx = y\r\n        y = x\r\n      }\r\n\r\n      let {a, b, c, d, e, f} = this\r\n\r\n      this.a = a * x\r\n      this.b = b * y\r\n      this.c = c * x\r\n      this.d = d * y\r\n      this.e = e * x - cx * x + cx\r\n      this.f = f * y - cy * y + cy\r\n\r\n      return this\r\n    },\r\n\r\n    // Rotate matrix\r\n    rotate: function (r, cx, cy) {\r\n      return this.clone().rotateO(r, cx, cy)\r\n    },\r\n\r\n    rotateO: function (r, cx = 0, cy = 0) {\r\n      // Convert degrees to radians\r\n      r = SVG.utils.radians(r)\r\n\r\n      let cos = Math.cos(r)\r\n      let sin = Math.sin(r)\r\n\r\n      let {a, b, c, d, e, f} = this\r\n\r\n      this.a = a * cos - b * sin\r\n      this.b = b * cos + a * sin\r\n      this.c = c * cos - d * sin\r\n      this.d = d * cos + c * sin\r\n      this.e = e * cos - f * sin + cy * sin - cx * cos + cx\r\n      this.f = f * cos + e * sin - cx * sin - cy * cos + cy\r\n\r\n      return this\r\n    },\r\n\r\n    // Flip matrix on x or y, at a given offset\r\n    flip: function (axis, around) {\r\n      return this.clone().flipO(axis, around)\r\n    },\r\n\r\n    flipO: function (axis, around) {\r\n      return axis === 'x' ? this.scaleO(-1, 1, around, 0)\r\n        : axis === 'y' ? this.scaleO(1, -1, 0, around)\r\n        : this.scaleO(-1, -1, axis, around || axis) // Define an x, y flip point\r\n    },\r\n\r\n    // Shear matrix\r\n    shear: function (a, cx, cy) {\r\n      return this.clone().shearO(a, cx, cy)\r\n    },\r\n\r\n    shearO: function (lx, cx = 0, cy = 0) {\r\n      let {a, b, c, d, e, f} = this\r\n\r\n      this.a = a + b * lx\r\n      this.c = c + d * lx\r\n      this.e = e + f * lx - cy * lx\r\n\r\n      return this\r\n    },\r\n\r\n    // Skew Matrix\r\n    skew: function (x, y, cx, cy) {\r\n      return this.clone().skewO(...arguments)\r\n    },\r\n\r\n    skewO: function (x, y = x, cx = 0, cy = 0) {\r\n      // support uniformal skew\r\n      if (arguments.length === 3) {\r\n        cy = cx\r\n        cx = y\r\n        y = x\r\n      }\r\n\r\n      // Convert degrees to radians\r\n      x = SVG.utils.radians(x)\r\n      y = SVG.utils.radians(y)\r\n\r\n      let lx = Math.tan(x)\r\n      let ly = Math.tan(y)\r\n\r\n      let {a, b, c, d, e, f} = this\r\n\r\n      this.a = a + b * lx\r\n      this.b = b + a * ly\r\n      this.c = c + d * lx\r\n      this.d = d + c * ly\r\n      this.e = e + f * lx - cy * lx\r\n      this.f = f + e * ly - cx * ly\r\n\r\n      return this\r\n    },\r\n\r\n    // SkewX\r\n    skewX: function (x, cx, cy) {\r\n      return this.skew(x, 0, cx, cy)\r\n    },\r\n\r\n    skewXO: function (x, cx, cy) {\r\n      return this.skewO(x, 0, cx, cy)\r\n    },\r\n\r\n    // SkewY\r\n    skewY: function (y, cx, cy) {\r\n      return this.skew(0, y, cx, cy)\r\n    },\r\n\r\n    skewYO: function (y, cx, cy) {\r\n      return this.skewO(0, y, cx, cy)\r\n    },\r\n\r\n    // Transform around a center point\r\n    aroundO: function (cx, cy, matrix) {\r\n      var dx = cx || 0\r\n      var dy = cy || 0\r\n      return this.translateO(-dx, -dy).lmultiplyO(matrix).translateO(dx, dy)\r\n    },\r\n\r\n    around: function (cx, cy, matrix) {\r\n      return this.clone().aroundO(cx, cy, matrix)\r\n    },\r\n\r\n    // Convert to native SVGMatrix\r\n    native: function () {\r\n      // create new matrix\r\n      var matrix = SVG.parser.nodes.svg.node.createSVGMatrix()\r\n\r\n      // update with current values\r\n      for (var i = abcdef.length - 1; i >= 0; i--) {\r\n        matrix[abcdef[i]] = this[abcdef[i]]\r\n      }\r\n\r\n      return matrix\r\n    },\r\n\r\n    // Check if two matrices are equal\r\n    equals: function (other) {\r\n      var comp = new SVG.Matrix(other)\r\n      return closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b) &&\r\n        closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d) &&\r\n        closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f)\r\n    },\r\n\r\n    // Convert matrix to string\r\n    toString: function () {\r\n      return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')'\r\n    },\r\n\r\n    toArray: function () {\r\n      return [this.a, this.b, this.c, this.d, this.e, this.f]\r\n    },\r\n\r\n    valueOf: function () {\r\n      return {\r\n        a: this.a,\r\n        b: this.b,\r\n        c: this.c,\r\n        d: this.d,\r\n        e: this.e,\r\n        f: this.f\r\n      }\r\n    }\r\n  },\r\n\r\n  // Define parent\r\n  parent: SVG.Element,\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Get current matrix\r\n    ctm: function () {\r\n      return new SVG.Matrix(this.node.getCTM())\r\n    },\r\n    // Get current screen matrix\r\n    screenCTM: function () {\r\n      /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537\r\n         This is needed because FF does not return the transformation matrix\r\n         for the inner coordinate system when getScreenCTM() is called on nested svgs.\r\n         However all other Browsers do that */\r\n      if (this instanceof SVG.Doc && !this.isRoot()) {\r\n        var rect = this.rect(1, 1)\r\n        var m = rect.node.getScreenCTM()\r\n        rect.remove()\r\n        return new SVG.Matrix(m)\r\n      }\r\n      return new SVG.Matrix(this.node.getScreenCTM())\r\n    }\r\n  }\r\n})\r\n\r\n// let extensions = {}\r\n// ['rotate'].forEach((method) => {\r\n//   let methodO = method + 'O'\r\n//   extensions[method] = function (...args) {\r\n//     return new SVG.Matrix(this)[methodO](...args)\r\n//   }\r\n// })\r\n//\r\n// SVG.extend(SVG.Matrix, extensions)\r\n\r\n// function matrixMultiplyParams (matrix, a, b, c, d, e, f) {\r\n//   return matrixMultiply({a, b, c, d, e, f}, matrix, matrix)\r\n// }\r\n","\r\nSVG.Point = SVG.invent({\r\n  // Initialize\r\n  create: function (x, y, base) {\r\n    var source\r\n    base = base || {x: 0, y: 0}\r\n\r\n    // ensure source as object\r\n    source = Array.isArray(x) ? {x: x[0], y: x[1]}\r\n      : typeof x === 'object' ? {x: x.x, y: x.y}\r\n      : {x: x, y: y}\r\n\r\n    // merge source\r\n    this.x = source.x == null ? base.x : source.x\r\n    this.y = source.y == null ? base.y : source.y\r\n  },\r\n\r\n  // Add methods\r\n  extend: {\r\n    // Clone point\r\n    clone: function () {\r\n      return new SVG.Point(this)\r\n    },\r\n\r\n    // Morph one point into another\r\n    morph: function (x, y) {\r\n      // store new destination\r\n      this.destination = new SVG.Point(x, y)\r\n      return this\r\n    },\r\n\r\n    // Get morphed point at a given position\r\n    at: function (pos) {\r\n      // make sure a destination is defined\r\n      if (!this.destination) return this\r\n\r\n      // calculate morphed matrix at a given position\r\n      var point = new SVG.Point({\r\n        x: this.x + (this.destination.x - this.x) * pos,\r\n        y: this.y + (this.destination.y - this.y) * pos\r\n      })\r\n      return point\r\n    },\r\n\r\n    // Convert to native SVGPoint\r\n    native: function () {\r\n      // create new point\r\n      var point = SVG.parser.nodes.svg.node.createSVGPoint()\r\n\r\n      // update with current values\r\n      point.x = this.x\r\n      point.y = this.y\r\n      return point\r\n    },\r\n\r\n    // transform point with matrix\r\n    transform: function (m) {\r\n      // Perform the matrix multiplication\r\n      var x = m.a * this.x + m.c * this.y + m.e\r\n      var y = m.b * this.x + m.d * this.y + m.f\r\n\r\n      // Return the required point\r\n      return new SVG.Point(x, y)\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n\r\n  // Get point\r\n  point: function (x, y) {\r\n    return new SVG.Point(x, y).transform(this.screenCTM().inverse())\r\n  }\r\n})\r\n","SVG.extend(SVG.Element, {\r\n  // Set svg element attribute\r\n  attr: function (a, v, n) {\r\n    // act as full getter\r\n    if (a == null) {\r\n      // get an object of attributes\r\n      a = {}\r\n      v = this.node.attributes\r\n      for (n = v.length - 1; n >= 0; n--) {\r\n        a[v[n].nodeName] = SVG.regex.isNumber.test(v[n].nodeValue)\r\n          ? parseFloat(v[n].nodeValue)\r\n          : v[n].nodeValue\r\n      }\r\n      return a\r\n    } else if (typeof a === 'object') {\r\n      // apply every attribute individually if an object is passed\r\n      for (v in a) this.attr(v, a[v])\r\n    } else if (v === null) {\r\n        // remove value\r\n      this.node.removeAttribute(a)\r\n    } else if (v == null) {\r\n      // act as a getter if the first and only argument is not an object\r\n      v = this.node.getAttribute(a)\r\n      return v == null ? SVG.defaults.attrs[a]\r\n        : SVG.regex.isNumber.test(v) ? parseFloat(v)\r\n        : v\r\n    } else {\r\n      // convert image fill and stroke to patterns\r\n      if (a === 'fill' || a === 'stroke') {\r\n        if (SVG.regex.isImage.test(v)) {\r\n          v = this.doc().defs().image(v)\r\n        }\r\n\r\n        if (v instanceof SVG.Image) {\r\n          v = this.doc().defs().pattern(0, 0, function () {\r\n            this.add(v)\r\n          })\r\n        }\r\n      }\r\n\r\n      // ensure correct numeric values (also accepts NaN and Infinity)\r\n      if (typeof v === 'number') {\r\n        v = new SVG.Number(v)\r\n      } else if (SVG.Color.isColor(v)) {\r\n        // ensure full hex color\r\n        v = new SVG.Color(v)\r\n      } else if (Array.isArray(v)) {\r\n        // parse array values\r\n        v = new SVG.Array(v)\r\n      }\r\n\r\n      // if the passed attribute is leading...\r\n      if (a === 'leading') {\r\n        // ... call the leading method instead\r\n        if (this.leading) {\r\n          this.leading(v)\r\n        }\r\n      } else {\r\n        // set given attribute on node\r\n        typeof n === 'string' ? this.node.setAttributeNS(n, a, v.toString())\r\n          : this.node.setAttribute(a, v.toString())\r\n      }\r\n\r\n      // rebuild if required\r\n      if (this.rebuild && (a === 'font-size' || a === 'x')) {\r\n        this.rebuild(a, v)\r\n      }\r\n    }\r\n\r\n    return this\r\n  }\r\n})\r\n","/* global arrayToMatrix getOrigin isMatrixLike */\r\n\r\nSVG.extend(SVG.Element, {\r\n  // Reset all transformations\r\n  untransform: function () {\r\n    return this.attr('transform', null)\r\n  },\r\n\r\n  // merge the whole transformation chain into one matrix and returns it\r\n  matrixify: function () {\r\n    var matrix = (this.attr('transform') || '')\r\n      // split transformations\r\n      .split(SVG.regex.transforms).slice(0, -1).map(function (str) {\r\n        // generate key => value pairs\r\n        var kv = str.trim().split('(')\r\n        return [kv[0],\r\n          kv[1].split(SVG.regex.delimiter)\r\n            .map(function (str) { return parseFloat(str) })\r\n        ]\r\n      })\r\n      .reverse()\r\n      // merge every transformation into one matrix\r\n      .reduce(function (matrix, transform) {\r\n        if (transform[0] === 'matrix') {\r\n          return matrix.lmultiply(arrayToMatrix(transform[1]))\r\n        }\r\n        return matrix[transform[0]].apply(matrix, transform[1])\r\n      }, new SVG.Matrix())\r\n\r\n    return matrix\r\n  },\r\n\r\n  // add an element to another parent without changing the visual representation on the screen\r\n  toParent: function (parent) {\r\n    if (this === parent) return this\r\n    var ctm = this.screenCTM()\r\n    var pCtm = parent.screenCTM().inverse()\r\n\r\n    this.addTo(parent).untransform().transform(pCtm.multiply(ctm))\r\n\r\n    return this\r\n  },\r\n\r\n  // same as above with parent equals root-svg\r\n  toDoc: function () {\r\n    return this.toParent(this.doc())\r\n  }\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n\r\n  // Add transformations\r\n  transform: function (o, relative) {\r\n    // Act as a getter if no object was passed\r\n    if (o == null || typeof o === 'string') {\r\n      var decomposed = new SVG.Matrix(this).decompose()\r\n      return decomposed[o] || decomposed\r\n    }\r\n\r\n    if (!isMatrixLike(o)) {\r\n      // Set the origin according to the defined transform\r\n      o = {...o, origin: getOrigin(o, this)}\r\n    }\r\n\r\n    // The user can pass a boolean, an SVG.Element or an SVG.Matrix or nothing\r\n    var cleanRelative = relative === true ? this : (relative || false)\r\n    var result = new SVG.Matrix(cleanRelative).transform(o)\r\n    return this.attr('transform', result)\r\n  }\r\n})\r\n","/* global camelCase */\r\n\r\nSVG.extend(SVG.Element, {\r\n  // Dynamic style generator\r\n  css: function (s, v) {\r\n    var ret = {}\r\n    var t, i\r\n    if (arguments.length === 0) {\r\n      // get full style as object\r\n      this.node.style.cssText.split(/\\s*;\\s*/).filter(function (el) { return !!el.length }).forEach(function (el) {\r\n        t = el.split(/\\s*:\\s*/)\r\n        ret[t[0]] = t[1]\r\n      })\r\n      return ret\r\n    }\r\n\r\n    if (arguments.length < 2) {\r\n      // get style properties in the array\r\n      if (Array.isArray(s)) {\r\n        for (i = s.length; i--;) {\r\n          ret[camelCase(s[i])] = this.node.style[camelCase(s[i])]\r\n        }\r\n        return ret\r\n      }\r\n\r\n      // get style for property\r\n      if (typeof s === 'string') {\r\n        return this.node.style[camelCase(s)]\r\n      }\r\n\r\n      // set styles in object\r\n      if (typeof s === 'object') {\r\n        for (i in s) {\r\n          // set empty string if null/undefined/'' was given\r\n          this.node.style[camelCase(i)] = (s[i] == null || SVG.regex.isBlank.test(s[i])) ? '' : s[i]\r\n        }\r\n      }\r\n    }\r\n\r\n    // set style for property\r\n    if (arguments.length === 2) {\r\n      this.node.style[camelCase(s)] = (v == null || SVG.regex.isBlank.test(v)) ? '' : v\r\n    }\r\n\r\n    return this\r\n  }\r\n})\r\n","/* global createElement */\r\n\r\nSVG.Parent = SVG.invent({\r\n  // Initialize node\r\n  create: function (node) {\r\n    SVG.Element.call(this, node)\r\n  },\r\n\r\n  // Inherit from\r\n  inherit: SVG.Element,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Returns all child elements\r\n    children: function () {\r\n      return SVG.utils.map(this.node.children, function (node) {\r\n        return SVG.adopt(node)\r\n      })\r\n    },\r\n    // Add given element at a position\r\n    add: function (element, i) {\r\n      element = createElement(element)\r\n\r\n      if (element.node !== this.node.children[i]) {\r\n        this.node.insertBefore(element.node, this.node.children[i] || null)\r\n      }\r\n\r\n      return this\r\n    },\r\n    // Basically does the same as `add()` but returns the added element instead\r\n    put: function (element, i) {\r\n      this.add(element, i)\r\n      return element.instance || element\r\n    },\r\n    // Checks if the given element is a child\r\n    has: function (element) {\r\n      return this.index(element) >= 0\r\n    },\r\n    // Gets index of given element\r\n    index: function (element) {\r\n      return [].slice.call(this.node.children).indexOf(element.node)\r\n    },\r\n    // Get a element at the given index\r\n    get: function (i) {\r\n      return SVG.adopt(this.node.children[i])\r\n    },\r\n    // Get first child\r\n    first: function () {\r\n      return this.get(0)\r\n    },\r\n    // Get the last child\r\n    last: function () {\r\n      return this.get(this.node.children.length - 1)\r\n    },\r\n    // Iterates over all children and invokes a given block\r\n    each: function (block, deep) {\r\n      var children = this.children()\r\n      var i, il\r\n\r\n      for (i = 0, il = children.length; i < il; i++) {\r\n        if (children[i] instanceof SVG.Element) {\r\n          block.apply(children[i], [i, children])\r\n        }\r\n\r\n        if (deep && (children[i] instanceof SVG.Parent)) {\r\n          children[i].each(block, deep)\r\n        }\r\n      }\r\n\r\n      return this\r\n    },\r\n    // Remove a given child\r\n    removeElement: function (element) {\r\n      this.node.removeChild(element.node)\r\n\r\n      return this\r\n    },\r\n    // Remove all elements in this container\r\n    clear: function () {\r\n      // remove children\r\n      while (this.node.hasChildNodes()) {\r\n        this.node.removeChild(this.node.lastChild)\r\n      }\r\n\r\n      // remove defs reference\r\n      delete this._defs\r\n\r\n      return this\r\n    }\r\n  }\r\n\r\n})\r\n","SVG.extend(SVG.Parent, {\r\n  flatten: function (parent) {\r\n    // flattens is only possible for nested svgs and groups\r\n    if (!(this instanceof SVG.G || this instanceof SVG.Doc)) {\r\n      return this\r\n    }\r\n\r\n    parent = parent || (this instanceof SVG.Doc && this.isRoot() ? this : this.parent(SVG.Parent))\r\n\r\n    this.each(function () {\r\n      if (this instanceof SVG.Defs) return this\r\n      if (this instanceof SVG.Parent) return this.flatten(parent)\r\n      return this.toParent(parent)\r\n    })\r\n\r\n    // we need this so that SVG.Doc does not get removed\r\n    this.node.firstElementChild || this.remove()\r\n\r\n    return this\r\n  },\r\n  ungroup: function (parent) {\r\n    // ungroup is only possible for nested svgs and groups\r\n    if (!(this instanceof SVG.G || (this instanceof SVG.Doc && !this.isRoot()))) {\r\n      return this\r\n    }\r\n\r\n    parent = parent || this.parent(SVG.Parent)\r\n\r\n    this.each(function () {\r\n      return this.toParent(parent)\r\n    })\r\n\r\n    // we need this so that SVG.Doc does not get removed\r\n    this.remove()\r\n\r\n    return this\r\n  }\r\n})\r\n","SVG.Container = SVG.invent({\r\n  // Initialize node\r\n  create: function (node) {\r\n    SVG.Element.call(this, node)\r\n  },\r\n\r\n  // Inherit from\r\n  inherit: SVG.Parent\r\n})\r\n","SVG.Defs = SVG.invent({\r\n  // Initialize node\r\n  create: 'defs',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container\r\n})\r\n","SVG.G = SVG.invent({\r\n  // Initialize node\r\n  create: 'g',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container,\r\n\r\n  // Add class methods\r\n  extend: {\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create a group element\r\n    group: function () {\r\n      return this.put(new SVG.G())\r\n    }\r\n  }\r\n})\r\n","// ### This module adds backward / forward functionality to elements.\r\n\r\n//\r\nSVG.extend(SVG.Element, {\r\n  // Get all siblings, including myself\r\n  siblings: function () {\r\n    return this.parent().children()\r\n  },\r\n\r\n  // Get the curent position siblings\r\n  position: function () {\r\n    return this.parent().index(this)\r\n  },\r\n\r\n  // Get the next element (will return null if there is none)\r\n  next: function () {\r\n    return this.siblings()[this.position() + 1]\r\n  },\r\n\r\n  // Get the next element (will return null if there is none)\r\n  prev: function () {\r\n    return this.siblings()[this.position() - 1]\r\n  },\r\n\r\n  // Send given element one step forward\r\n  forward: function () {\r\n    var i = this.position() + 1\r\n    var p = this.parent()\r\n\r\n    // move node one step forward\r\n    p.removeElement(this).add(this, i)\r\n\r\n    // make sure defs node is always at the top\r\n    if (p instanceof SVG.Doc) {\r\n      p.node.appendChild(p.defs().node)\r\n    }\r\n\r\n    return this\r\n  },\r\n\r\n  // Send given element one step backward\r\n  backward: function () {\r\n    var i = this.position()\r\n\r\n    if (i > 0) {\r\n      this.parent().removeElement(this).add(this, i - 1)\r\n    }\r\n\r\n    return this\r\n  },\r\n\r\n  // Send given element all the way to the front\r\n  front: function () {\r\n    var p = this.parent()\r\n\r\n    // Move node forward\r\n    p.node.appendChild(this.node)\r\n\r\n    // Make sure defs node is always at the top\r\n    if (p instanceof SVG.Doc) {\r\n      p.node.appendChild(p.defs().node)\r\n    }\r\n\r\n    return this\r\n  },\r\n\r\n  // Send given element all the way to the back\r\n  back: function () {\r\n    if (this.position() > 0) {\r\n      this.parent().removeElement(this).add(this, 0)\r\n    }\r\n\r\n    return this\r\n  },\r\n\r\n  // Inserts a given element before the targeted element\r\n  before: function (element) {\r\n    element.remove()\r\n\r\n    var i = this.position()\r\n\r\n    this.parent().add(element, i)\r\n\r\n    return this\r\n  },\r\n\r\n  // Insters a given element after the targeted element\r\n  after: function (element) {\r\n    element.remove()\r\n\r\n    var i = this.position()\r\n\r\n    this.parent().add(element, i + 1)\r\n\r\n    return this\r\n  }\r\n})\r\n","SVG.Mask = SVG.invent({\r\n  // Initialize node\r\n  create: 'mask',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Unmask all masked elements and remove itself\r\n    remove: function () {\r\n      // unmask all targets\r\n      this.targets().forEach(function (el) {\r\n        el.unmask()\r\n      })\r\n\r\n      // remove mask from parent\r\n      return SVG.Element.prototype.remove.call(this)\r\n    },\r\n\r\n    targets: function () {\r\n      return SVG.select('svg [mask*=\"' + this.id() + '\"]')\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create masking element\r\n    mask: function () {\r\n      return this.defs().put(new SVG.Mask())\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n  // Distribute mask to svg element\r\n  maskWith: function (element) {\r\n    // use given mask or create a new one\r\n    var masker = element instanceof SVG.Mask ? element : this.parent().mask().add(element)\r\n\r\n    // apply mask\r\n    return this.attr('mask', 'url(\"#' + masker.id() + '\")')\r\n  },\r\n  // Unmask element\r\n  unmask: function () {\r\n    return this.attr('mask', null)\r\n  },\r\n  masker: function () {\r\n    return this.reference('mask')\r\n  }\r\n})\r\n","SVG.ClipPath = SVG.invent({\r\n  // Initialize node\r\n  create: 'clipPath',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Unclip all clipped elements and remove itself\r\n    remove: function () {\r\n      // unclip all targets\r\n      this.targets().forEach(function (el) {\r\n        el.unclip()\r\n      })\r\n\r\n      // remove clipPath from parent\r\n      return SVG.Element.prototype.remove.call(this)\r\n    },\r\n\r\n    targets: function () {\r\n      return SVG.select('svg [clip-path*=\"' + this.id() + '\"]')\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create clipping element\r\n    clip: function () {\r\n      return this.defs().put(new SVG.ClipPath())\r\n    }\r\n  }\r\n})\r\n\r\n//\r\nSVG.extend(SVG.Element, {\r\n  // Distribute clipPath to svg element\r\n  clipWith: function (element) {\r\n    // use given clip or create a new one\r\n    var clipper = element instanceof SVG.ClipPath ? element : this.parent().clip().add(element)\r\n\r\n    // apply mask\r\n    return this.attr('clip-path', 'url(\"#' + clipper.id() + '\")')\r\n  },\r\n  // Unclip element\r\n  unclip: function () {\r\n    return this.attr('clip-path', null)\r\n  },\r\n  clipper: function () {\r\n    return this.reference('clip-path')\r\n  }\r\n\r\n})\r\n","SVG.Gradient = SVG.invent({\r\n  // Initialize node\r\n  create: function (type) {\r\n    SVG.Element.call(this, typeof type === 'object' ? type : SVG.create(type + 'Gradient'))\r\n  },\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Add a color stop\r\n    stop: function (offset, color, opacity) {\r\n      return this.put(new SVG.Stop()).update(offset, color, opacity)\r\n    },\r\n    // Update gradient\r\n    update: function (block) {\r\n      // remove all stops\r\n      this.clear()\r\n\r\n      // invoke passed block\r\n      if (typeof block === 'function') {\r\n        block.call(this, this)\r\n      }\r\n\r\n      return this\r\n    },\r\n    // Return the fill id\r\n    url: function () {\r\n      return 'url(#' + this.id() + ')'\r\n    },\r\n    // Alias string convertion to fill\r\n    toString: function () {\r\n      return this.url()\r\n    },\r\n    // custom attr to handle transform\r\n    attr: function (a, b, c) {\r\n      if (a === 'transform') a = 'gradientTransform'\r\n      return SVG.Container.prototype.attr.call(this, a, b, c)\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create gradient element in defs\r\n    gradient: function (type, block) {\r\n      return this.defs().gradient(type, block)\r\n    }\r\n  }\r\n})\r\n\r\n// Add animatable methods to both gradient and fx module\r\nSVG.extend([SVG.Gradient, SVG.Timeline], {\r\n  // From position\r\n  from: function (x, y) {\r\n    return (this._target || this).type === 'radialGradient'\r\n      ? this.attr({ fx: new SVG.Number(x), fy: new SVG.Number(y) })\r\n      : this.attr({ x1: new SVG.Number(x), y1: new SVG.Number(y) })\r\n  },\r\n  // To position\r\n  to: function (x, y) {\r\n    return (this._target || this).type === 'radialGradient'\r\n      ? this.attr({ cx: new SVG.Number(x), cy: new SVG.Number(y) })\r\n      : this.attr({ x2: new SVG.Number(x), y2: new SVG.Number(y) })\r\n  }\r\n})\r\n\r\n// Base gradient generation\r\nSVG.extend(SVG.Defs, {\r\n  // define gradient\r\n  gradient: function (type, block) {\r\n    return this.put(new SVG.Gradient(type)).update(block)\r\n  }\r\n\r\n})\r\n\r\nSVG.Stop = SVG.invent({\r\n  // Initialize node\r\n  create: 'stop',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Element,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // add color stops\r\n    update: function (o) {\r\n      if (typeof o === 'number' || o instanceof SVG.Number) {\r\n        o = {\r\n          offset: arguments[0],\r\n          color: arguments[1],\r\n          opacity: arguments[2]\r\n        }\r\n      }\r\n\r\n      // set attributes\r\n      if (o.opacity != null) this.attr('stop-opacity', o.opacity)\r\n      if (o.color != null) this.attr('stop-color', o.color)\r\n      if (o.offset != null) this.attr('offset', new SVG.Number(o.offset))\r\n\r\n      return this\r\n    }\r\n  }\r\n})\r\n","SVG.Pattern = SVG.invent({\r\n  // Initialize node\r\n  create: 'pattern',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Return the fill id\r\n    url: function () {\r\n      return 'url(#' + this.id() + ')'\r\n    },\r\n    // Update pattern by rebuilding\r\n    update: function (block) {\r\n      // remove content\r\n      this.clear()\r\n\r\n      // invoke passed block\r\n      if (typeof block === 'function') {\r\n        block.call(this, this)\r\n      }\r\n\r\n      return this\r\n    },\r\n    // Alias string convertion to fill\r\n    toString: function () {\r\n      return this.url()\r\n    },\r\n    // custom attr to handle transform\r\n    attr: function (a, b, c) {\r\n      if (a === 'transform') a = 'patternTransform'\r\n      return SVG.Container.prototype.attr.call(this, a, b, c)\r\n    }\r\n\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create pattern element in defs\r\n    pattern: function (width, height, block) {\r\n      return this.defs().pattern(width, height, block)\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend(SVG.Defs, {\r\n  // Define gradient\r\n  pattern: function (width, height, block) {\r\n    return this.put(new SVG.Pattern()).update(block).attr({\r\n      x: 0,\r\n      y: 0,\r\n      width: width,\r\n      height: height,\r\n      patternUnits: 'userSpaceOnUse'\r\n    })\r\n  }\r\n\r\n})\r\n","SVG.Doc = SVG.invent({\r\n  // Initialize node\r\n  create: function (node) {\r\n    SVG.Element.call(this, node || SVG.create('svg'))\r\n\r\n    // set svg element attributes and ensure defs node\r\n    this.namespace()\r\n  },\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    isRoot: function () {\r\n      return !this.node.parentNode || !(this.node.parentNode instanceof window.SVGElement) || this.node.parentNode.nodeName === '#document'\r\n    },\r\n    // Check if this is a root svg. If not, call docs from this element\r\n    doc: function () {\r\n      if (this.isRoot()) return this\r\n      return SVG.Element.prototype.doc.call(this)\r\n    },\r\n    // Add namespaces\r\n    namespace: function () {\r\n      if (!this.isRoot()) return this.doc().namespace()\r\n      return this\r\n        .attr({ xmlns: SVG.ns, version: '1.1' })\r\n        .attr('xmlns:xlink', SVG.xlink, SVG.xmlns)\r\n        .attr('xmlns:svgjs', SVG.svgjs, SVG.xmlns)\r\n    },\r\n    // Creates and returns defs element\r\n    defs: function () {\r\n      if (!this.isRoot()) return this.doc().defs()\r\n      return SVG.adopt(this.node.getElementsByTagName('defs')[0]) || this.put(new SVG.Defs())\r\n    },\r\n    // custom parent method\r\n    parent: function (type) {\r\n      if (this.isRoot()) {\r\n        return this.node.parentNode.nodeName === '#document' ? null : this.node.parentNode\r\n      }\r\n\r\n      return SVG.Element.prototype.parent.call(this, type)\r\n    },\r\n    // Removes the doc from the DOM\r\n    remove: function () {\r\n      if (!this.isRoot()) {\r\n        return SVG.Element.prototype.remove.call(this)\r\n      }\r\n\r\n      if (this.parent()) {\r\n        this.parent().removeChild(this.node)\r\n      }\r\n\r\n      return this\r\n    },\r\n    clear: function () {\r\n      // remove children\r\n      while (this.node.hasChildNodes()) {\r\n        this.node.removeChild(this.node.lastChild)\r\n      }\r\n      return this\r\n    }\r\n  },\r\n  construct: {\r\n    // Create nested svg document\r\n    nested: function () {\r\n      return this.put(new SVG.Doc())\r\n    }\r\n  }\r\n})\r\n","\r\nSVG.Shape = SVG.invent({\r\n  // Initialize node\r\n  create: function (node) {\r\n    SVG.Element.call(this, node)\r\n  },\r\n\r\n  // Inherit from\r\n  inherit: SVG.Element\r\n})\r\n","\r\nSVG.Bare = SVG.invent({\r\n  // Initialize\r\n  create: function (element, inherit) {\r\n    // construct element\r\n    SVG.Element.call(this, SVG.create(element))\r\n\r\n    // inherit custom methods\r\n    if (inherit) {\r\n      for (var method in inherit.prototype) {\r\n        if (typeof inherit.prototype[method] === 'function') {\r\n          this[method] = inherit.prototype[method]\r\n        }\r\n      }\r\n    }\r\n  },\r\n\r\n  // Inherit from\r\n  inherit: SVG.Element,\r\n\r\n  // Add methods\r\n  extend: {\r\n    // Insert some plain text\r\n    words: function (text) {\r\n      // remove contents\r\n      while (this.node.hasChildNodes()) {\r\n        this.node.removeChild(this.node.lastChild)\r\n      }\r\n\r\n      // create text node\r\n      this.node.appendChild(document.createTextNode(text))\r\n\r\n      return this\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend(SVG.Parent, {\r\n  // Create an element that is not described by SVG.js\r\n  element: function (element, inherit) {\r\n    return this.put(new SVG.Bare(element, inherit))\r\n  }\r\n})\r\n","\r\nSVG.Symbol = SVG.invent({\r\n  // Initialize node\r\n  create: 'symbol',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container,\r\n\r\n  construct: {\r\n    // create symbol\r\n    symbol: function () {\r\n      return this.put(new SVG.Symbol())\r\n    }\r\n  }\r\n})\r\n","\r\nSVG.Use = SVG.invent({\r\n  // Initialize node\r\n  create: 'use',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Shape,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Use element as a reference\r\n    element: function (element, file) {\r\n      // Set lined element\r\n      return this.attr('href', (file || '') + '#' + element, SVG.xlink)\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create a use element\r\n    use: function (element, file) {\r\n      return this.put(new SVG.Use()).element(element, file)\r\n    }\r\n  }\r\n})\r\n","\r\nSVG.Rect = SVG.invent({\r\n  // Initialize node\r\n  create: 'rect',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Shape,\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create a rect element\r\n    rect: function (width, height) {\r\n      return this.put(new SVG.Rect()).size(width, height)\r\n    }\r\n  }\r\n})\r\n","/* global proportionalSize */\r\n\r\nSVG.Circle = SVG.invent({\r\n  // Initialize node\r\n  create: 'circle',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Shape,\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create circle element, based on ellipse\r\n    circle: function (size) {\r\n      return this.put(new SVG.Circle()).rx(new SVG.Number(size).divide(2)).move(0, 0)\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend([SVG.Circle, SVG.Timeline], {\r\n  // Radius x value\r\n  rx: function (rx) {\r\n    return this.attr('r', rx)\r\n  },\r\n  // Alias radius x value\r\n  ry: function (ry) {\r\n    return this.rx(ry)\r\n  }\r\n})\r\n\r\nSVG.Ellipse = SVG.invent({\r\n  // Initialize node\r\n  create: 'ellipse',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Shape,\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create an ellipse\r\n    ellipse: function (width, height) {\r\n      return this.put(new SVG.Ellipse()).size(width, height).move(0, 0)\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend([SVG.Ellipse, SVG.Rect, SVG.Timeline], {\r\n  // Radius x value\r\n  rx: function (rx) {\r\n    return this.attr('rx', rx)\r\n  },\r\n  // Radius y value\r\n  ry: function (ry) {\r\n    return this.attr('ry', ry)\r\n  }\r\n})\r\n\r\n// Add common method\r\nSVG.extend([SVG.Circle, SVG.Ellipse], {\r\n    // Move over x-axis\r\n  x: function (x) {\r\n    return x == null ? this.cx() - this.rx() : this.cx(x + this.rx())\r\n  },\r\n    // Move over y-axis\r\n  y: function (y) {\r\n    return y == null ? this.cy() - this.ry() : this.cy(y + this.ry())\r\n  },\r\n    // Move by center over x-axis\r\n  cx: function (x) {\r\n    return x == null ? this.attr('cx') : this.attr('cx', x)\r\n  },\r\n    // Move by center over y-axis\r\n  cy: function (y) {\r\n    return y == null ? this.attr('cy') : this.attr('cy', y)\r\n  },\r\n    // Set width of element\r\n  width: function (width) {\r\n    return width == null ? this.rx() * 2 : this.rx(new SVG.Number(width).divide(2))\r\n  },\r\n    // Set height of element\r\n  height: function (height) {\r\n    return height == null ? this.ry() * 2 : this.ry(new SVG.Number(height).divide(2))\r\n  },\r\n    // Custom size function\r\n  size: function (width, height) {\r\n    var p = proportionalSize(this, width, height)\r\n\r\n    return this\r\n        .rx(new SVG.Number(p.width).divide(2))\r\n        .ry(new SVG.Number(p.height).divide(2))\r\n  }\r\n})\r\n","/* global proportionalSize */\r\n\r\nSVG.Line = SVG.invent({\r\n  // Initialize node\r\n  create: 'line',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Shape,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Get array\r\n    array: function () {\r\n      return new SVG.PointArray([\r\n        [ this.attr('x1'), this.attr('y1') ],\r\n        [ this.attr('x2'), this.attr('y2') ]\r\n      ])\r\n    },\r\n\r\n    // Overwrite native plot() method\r\n    plot: function (x1, y1, x2, y2) {\r\n      if (x1 == null) {\r\n        return this.array()\r\n      } else if (typeof y1 !== 'undefined') {\r\n        x1 = { x1: x1, y1: y1, x2: x2, y2: y2 }\r\n      } else {\r\n        x1 = new SVG.PointArray(x1).toLine()\r\n      }\r\n\r\n      return this.attr(x1)\r\n    },\r\n\r\n    // Move by left top corner\r\n    move: function (x, y) {\r\n      return this.attr(this.array().move(x, y).toLine())\r\n    },\r\n\r\n    // Set element size to given width and height\r\n    size: function (width, height) {\r\n      var p = proportionalSize(this, width, height)\r\n      return this.attr(this.array().size(p.width, p.height).toLine())\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create a line element\r\n    line: function (x1, y1, x2, y2) {\r\n      // make sure plot is called as a setter\r\n      // x1 is not necessarily a number, it can also be an array, a string and a SVG.PointArray\r\n      return SVG.Line.prototype.plot.apply(\r\n        this.put(new SVG.Line())\r\n      , x1 != null ? [x1, y1, x2, y2] : [0, 0, 0, 0]\r\n      )\r\n    }\r\n  }\r\n})\r\n","/* global proportionalSize */\r\n\r\nSVG.Polyline = SVG.invent({\r\n  // Initialize node\r\n  create: 'polyline',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Shape,\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create a wrapped polyline element\r\n    polyline: function (p) {\r\n      // make sure plot is called as a setter\r\n      return this.put(new SVG.Polyline()).plot(p || new SVG.PointArray())\r\n    }\r\n  }\r\n})\r\n\r\nSVG.Polygon = SVG.invent({\r\n  // Initialize node\r\n  create: 'polygon',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Shape,\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create a wrapped polygon element\r\n    polygon: function (p) {\r\n      // make sure plot is called as a setter\r\n      return this.put(new SVG.Polygon()).plot(p || new SVG.PointArray())\r\n    }\r\n  }\r\n})\r\n\r\n// Add polygon-specific functions\r\nSVG.extend([SVG.Polyline, SVG.Polygon], {\r\n  // Get array\r\n  array: function () {\r\n    return this._array || (this._array = new SVG.PointArray(this.attr('points')))\r\n  },\r\n\r\n  // Plot new path\r\n  plot: function (p) {\r\n    return (p == null) ? this.array()\r\n      : this.clear().attr('points', typeof p === 'string' ? p\r\n      : (this._array = new SVG.PointArray(p)))\r\n  },\r\n\r\n  // Clear array cache\r\n  clear: function () {\r\n    delete this._array\r\n    return this\r\n  },\r\n\r\n  // Move by left top corner\r\n  move: function (x, y) {\r\n    return this.attr('points', this.array().move(x, y))\r\n  },\r\n\r\n  // Set element size to given width and height\r\n  size: function (width, height) {\r\n    var p = proportionalSize(this, width, height)\r\n    return this.attr('points', this.array().size(p.width, p.height))\r\n  }\r\n})\r\n","// unify all point to point elements\r\nSVG.extend([SVG.Line, SVG.Polyline, SVG.Polygon], {\r\n  // Define morphable array\r\n  MorphArray: SVG.PointArray,\r\n  // Move by left top corner over x-axis\r\n  x: function (x) {\r\n    return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r\n  },\r\n  // Move by left top corner over y-axis\r\n  y: function (y) {\r\n    return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r\n  },\r\n  // Set width of element\r\n  width: function (width) {\r\n    var b = this.bbox()\r\n\r\n    return width == null ? b.width : this.size(width, b.height)\r\n  },\r\n  // Set height of element\r\n  height: function (height) {\r\n    var b = this.bbox()\r\n\r\n    return height == null ? b.height : this.size(b.width, height)\r\n  }\r\n})\r\n","/* global proportionalSize */\r\n\r\nSVG.Path = SVG.invent({\r\n  // Initialize node\r\n  create: 'path',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Shape,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Define morphable array\r\n    MorphArray: SVG.PathArray,\r\n    // Get array\r\n    array: function () {\r\n      return this._array || (this._array = new SVG.PathArray(this.attr('d')))\r\n    },\r\n    // Plot new path\r\n    plot: function (d) {\r\n      return (d == null) ? this.array()\r\n        : this.clear().attr('d', typeof d === 'string' ? d : (this._array = new SVG.PathArray(d)))\r\n    },\r\n    // Clear array cache\r\n    clear: function () {\r\n      delete this._array\r\n      return this\r\n    },\r\n    // Move by left top corner\r\n    move: function (x, y) {\r\n      return this.attr('d', this.array().move(x, y))\r\n    },\r\n    // Move by left top corner over x-axis\r\n    x: function (x) {\r\n      return x == null ? this.bbox().x : this.move(x, this.bbox().y)\r\n    },\r\n    // Move by left top corner over y-axis\r\n    y: function (y) {\r\n      return y == null ? this.bbox().y : this.move(this.bbox().x, y)\r\n    },\r\n    // Set element size to given width and height\r\n    size: function (width, height) {\r\n      var p = proportionalSize(this, width, height)\r\n      return this.attr('d', this.array().size(p.width, p.height))\r\n    },\r\n    // Set width of element\r\n    width: function (width) {\r\n      return width == null ? this.bbox().width : this.size(width, this.bbox().height)\r\n    },\r\n    // Set height of element\r\n    height: function (height) {\r\n      return height == null ? this.bbox().height : this.size(this.bbox().width, height)\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create a wrapped path element\r\n    path: function (d) {\r\n      // make sure plot is called as a setter\r\n      return this.put(new SVG.Path()).plot(d || new SVG.PathArray())\r\n    }\r\n  }\r\n})\r\n","SVG.Image = SVG.invent({\r\n  // Initialize node\r\n  create: 'image',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Shape,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // (re)load image\r\n    load: function (url, callback) {\r\n      if (!url) return this\r\n\r\n      var img = new window.Image()\r\n\r\n      SVG.on(img, 'load', function (e) {\r\n        var p = this.parent(SVG.Pattern)\r\n\r\n        // ensure image size\r\n        if (this.width() === 0 && this.height() === 0) {\r\n          this.size(img.width, img.height)\r\n        }\r\n\r\n        if (p instanceof SVG.Pattern) {\r\n          // ensure pattern size if not set\r\n          if (p.width() === 0 && p.height() === 0) {\r\n            p.size(this.width(), this.height())\r\n          }\r\n        }\r\n\r\n        if (typeof callback === 'function') {\r\n          callback.call(this, {\r\n            width: img.width,\r\n            height: img.height,\r\n            ratio: img.width / img.height,\r\n            url: url\r\n          })\r\n        }\r\n      }, this)\r\n\r\n      SVG.on(img, 'load error', function () {\r\n        // dont forget to unbind memory leaking events\r\n        SVG.off(img)\r\n      })\r\n\r\n      return this.attr('href', (img.src = url), SVG.xlink)\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // create image element, load image and set its size\r\n    image: function (source, callback) {\r\n      return this.put(new SVG.Image()).size(0, 0).load(source, callback)\r\n    }\r\n  }\r\n})\r\n","SVG.Text = SVG.invent({\r\n  // Initialize node\r\n  create: function (node) {\r\n    SVG.Element.call(this, node || SVG.create('text'))\r\n    this.dom.leading = new SVG.Number(1.3)    // store leading value for rebuilding\r\n    this._rebuild = true                      // enable automatic updating of dy values\r\n    this._build = false                     // disable build mode for adding multiple lines\r\n\r\n    // set default font\r\n    this.attr('font-family', SVG.defaults.attrs['font-family'])\r\n  },\r\n\r\n  // Inherit from\r\n  inherit: SVG.Parent,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Move over x-axis\r\n    x: function (x) {\r\n      // act as getter\r\n      if (x == null) {\r\n        return this.attr('x')\r\n      }\r\n\r\n      return this.attr('x', x)\r\n    },\r\n    // Move over y-axis\r\n    y: function (y) {\r\n      var oy = this.attr('y')\r\n      var o = typeof oy === 'number' ? oy - this.bbox().y : 0\r\n\r\n      // act as getter\r\n      if (y == null) {\r\n        return typeof oy === 'number' ? oy - o : oy\r\n      }\r\n\r\n      return this.attr('y', typeof y === 'number' ? y + o : y)\r\n    },\r\n    // Move center over x-axis\r\n    cx: function (x) {\r\n      return x == null ? this.bbox().cx : this.x(x - this.bbox().width / 2)\r\n    },\r\n    // Move center over y-axis\r\n    cy: function (y) {\r\n      return y == null ? this.bbox().cy : this.y(y - this.bbox().height / 2)\r\n    },\r\n    // Set the text content\r\n    text: function (text) {\r\n      // act as getter\r\n      if (text === undefined) {\r\n        var children = this.node.childNodes\r\n        var firstLine = 0\r\n        text = ''\r\n\r\n        for (var i = 0, len = children.length; i < len; ++i) {\r\n          // skip textPaths - they are no lines\r\n          if (children[i].nodeName === 'textPath') {\r\n            if (i === 0) firstLine = 1\r\n            continue\r\n          }\r\n\r\n          // add newline if its not the first child and newLined is set to true\r\n          if (i !== firstLine && children[i].nodeType !== 3 && SVG.adopt(children[i]).dom.newLined === true) {\r\n            text += '\\n'\r\n          }\r\n\r\n          // add content of this node\r\n          text += children[i].textContent\r\n        }\r\n\r\n        return text\r\n      }\r\n\r\n      // remove existing content\r\n      this.clear().build(true)\r\n\r\n      if (typeof text === 'function') {\r\n        // call block\r\n        text.call(this, this)\r\n      } else {\r\n        // store text and make sure text is not blank\r\n        text = text.split('\\n')\r\n\r\n        // build new lines\r\n        for (var j = 0, jl = text.length; j < jl; j++) {\r\n          this.tspan(text[j]).newLine()\r\n        }\r\n      }\r\n\r\n      // disable build mode and rebuild lines\r\n      return this.build(false).rebuild()\r\n    },\r\n    // Set / get leading\r\n    leading: function (value) {\r\n      // act as getter\r\n      if (value == null) {\r\n        return this.dom.leading\r\n      }\r\n\r\n      // act as setter\r\n      this.dom.leading = new SVG.Number(value)\r\n\r\n      return this.rebuild()\r\n    },\r\n    // Rebuild appearance type\r\n    rebuild: function (rebuild) {\r\n      // store new rebuild flag if given\r\n      if (typeof rebuild === 'boolean') {\r\n        this._rebuild = rebuild\r\n      }\r\n\r\n      // define position of all lines\r\n      if (this._rebuild) {\r\n        var self = this\r\n        var blankLineOffset = 0\r\n        var dy = this.dom.leading * new SVG.Number(this.attr('font-size'))\r\n\r\n        this.each(function () {\r\n          if (this.dom.newLined) {\r\n            this.attr('x', self.attr('x'))\r\n\r\n            if (this.text() === '\\n') {\r\n              blankLineOffset += dy\r\n            } else {\r\n              this.attr('dy', dy + blankLineOffset)\r\n              blankLineOffset = 0\r\n            }\r\n          }\r\n        })\r\n\r\n        this.fire('rebuild')\r\n      }\r\n\r\n      return this\r\n    },\r\n    // Enable / disable build mode\r\n    build: function (build) {\r\n      this._build = !!build\r\n      return this\r\n    },\r\n    // overwrite method from parent to set data properly\r\n    setData: function (o) {\r\n      this.dom = o\r\n      this.dom.leading = new SVG.Number(o.leading || 1.3)\r\n      return this\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create text element\r\n    text: function (text) {\r\n      return this.put(new SVG.Text()).text(text)\r\n    },\r\n    // Create plain text element\r\n    plain: function (text) {\r\n      return this.put(new SVG.Text()).plain(text)\r\n    }\r\n  }\r\n\r\n})\r\n\r\nSVG.Tspan = SVG.invent({\r\n  // Initialize node\r\n  create: 'tspan',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Parent,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Set text content\r\n    text: function (text) {\r\n      if (text == null) return this.node.textContent + (this.dom.newLined ? '\\n' : '')\r\n\r\n      typeof text === 'function' ? text.call(this, this) : this.plain(text)\r\n\r\n      return this\r\n    },\r\n    // Shortcut dx\r\n    dx: function (dx) {\r\n      return this.attr('dx', dx)\r\n    },\r\n    // Shortcut dy\r\n    dy: function (dy) {\r\n      return this.attr('dy', dy)\r\n    },\r\n    // Create new line\r\n    newLine: function () {\r\n      // fetch text parent\r\n      var t = this.parent(SVG.Text)\r\n\r\n      // mark new line\r\n      this.dom.newLined = true\r\n\r\n      // apply new position\r\n      return this.dy(t.dom.leading * t.attr('font-size')).attr('x', t.x())\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend([SVG.Text, SVG.Tspan], {\r\n  // Create plain text node\r\n  plain: function (text) {\r\n    // clear if build mode is disabled\r\n    if (this._build === false) {\r\n      this.clear()\r\n    }\r\n\r\n    // create text node\r\n    this.node.appendChild(document.createTextNode(text))\r\n\r\n    return this\r\n  },\r\n  // Create a tspan\r\n  tspan: function (text) {\r\n    var tspan = new SVG.Tspan()\r\n\r\n    // clear if build mode is disabled\r\n    if (!this._build) {\r\n      this.clear()\r\n    }\r\n\r\n    // add new tspan\r\n    this.node.appendChild(tspan.node)\r\n\r\n    return tspan.text(text)\r\n  },\r\n  // FIXME: Does this also work for textpath?\r\n  // Get length of text element\r\n  length: function () {\r\n    return this.node.getComputedTextLength()\r\n  }\r\n})\r\n","SVG.TextPath = SVG.invent({\r\n  // Initialize node\r\n  create: 'textPath',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Text,\r\n\r\n  // Define parent class\r\n  parent: SVG.Parent,\r\n\r\n  // Add parent method\r\n  extend: {\r\n    MorphArray: SVG.PathArray,\r\n    // return the array of the path track element\r\n    array: function () {\r\n      var track = this.track()\r\n\r\n      return track ? track.array() : null\r\n    },\r\n    // Plot path if any\r\n    plot: function (d) {\r\n      var track = this.track()\r\n      var pathArray = null\r\n\r\n      if (track) {\r\n        pathArray = track.plot(d)\r\n      }\r\n\r\n      return (d == null) ? pathArray : this\r\n    },\r\n    // Get the path element\r\n    track: function () {\r\n      return this.reference('href')\r\n    }\r\n  },\r\n  construct: {\r\n    textPath: function (text, path) {\r\n      return this.defs().path(path).text(text).addTo(this)\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend([SVG.Text], {\r\n    // Create path for text to run on\r\n  path: function (track) {\r\n    var path = new SVG.TextPath()\r\n\r\n    // if d is a path, reuse it\r\n    if (!(track instanceof SVG.Path)) {\r\n      // create path element\r\n      track = this.doc().defs().path(track)\r\n    }\r\n\r\n    // link textPath to path and add content\r\n    path.attr('href', '#' + track, SVG.xlink)\r\n\r\n    // add textPath element as child node and return textPath\r\n    return this.put(path)\r\n  },\r\n  // Todo: make this plural?\r\n  // Get the textPath children\r\n  textPath: function () {\r\n    return this.select('textPath')\r\n  }\r\n})\r\n\r\nSVG.extend([SVG.Path], {\r\n  // creates a textPath from this path\r\n  text: function (text) {\r\n    if (text instanceof SVG.Text) {\r\n      var txt = text.text()\r\n      return text.clear().path(this).text(txt)\r\n    }\r\n    return this.parent().put(new SVG.Text()).path(this).text(text)\r\n  }\r\n  // TODO: Maybe add `targets` to get all textPaths associated with this path\r\n})\r\n","SVG.A = SVG.invent({\r\n  // Initialize node\r\n  create: 'a',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Link url\r\n    to: function (url) {\r\n      return this.attr('href', url, SVG.xlink)\r\n    },\r\n    // Link target attribute\r\n    target: function (target) {\r\n      return this.attr('target', target)\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    // Create a hyperlink element\r\n    link: function (url) {\r\n      return this.put(new SVG.A()).to(url)\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend(SVG.Element, {\r\n  // Create a hyperlink element\r\n  linkTo: function (url) {\r\n    var link = new SVG.A()\r\n\r\n    if (typeof url === 'function') { url.call(link, link) } else {\r\n      link.to(url)\r\n    }\r\n\r\n    return this.parent().put(link).put(this)\r\n  }\r\n\r\n})\r\n","SVG.Marker = SVG.invent({\r\n  // Initialize node\r\n  create: 'marker',\r\n\r\n  // Inherit from\r\n  inherit: SVG.Container,\r\n\r\n  // Add class methods\r\n  extend: {\r\n    // Set width of element\r\n    width: function (width) {\r\n      return this.attr('markerWidth', width)\r\n    },\r\n    // Set height of element\r\n    height: function (height) {\r\n      return this.attr('markerHeight', height)\r\n    },\r\n    // Set marker refX and refY\r\n    ref: function (x, y) {\r\n      return this.attr('refX', x).attr('refY', y)\r\n    },\r\n    // Update marker\r\n    update: function (block) {\r\n      // remove all content\r\n      this.clear()\r\n\r\n      // invoke passed block\r\n      if (typeof block === 'function') { block.call(this, this) }\r\n\r\n      return this\r\n    },\r\n    // Return the fill id\r\n    toString: function () {\r\n      return 'url(#' + this.id() + ')'\r\n    }\r\n  },\r\n\r\n  // Add parent method\r\n  construct: {\r\n    marker: function (width, height, block) {\r\n      // Create marker element in defs\r\n      return this.defs().marker(width, height, block)\r\n    }\r\n  }\r\n\r\n})\r\n\r\nSVG.extend(SVG.Defs, {\r\n  // Create marker\r\n  marker: function (width, height, block) {\r\n    // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto\r\n    return this.put(new SVG.Marker())\r\n      .size(width, height)\r\n      .ref(width / 2, height / 2)\r\n      .viewbox(0, 0, width, height)\r\n      .attr('orient', 'auto')\r\n      .update(block)\r\n  }\r\n\r\n})\r\n\r\nSVG.extend([SVG.Line, SVG.Polyline, SVG.Polygon, SVG.Path], {\r\n  // Create and attach markers\r\n  marker: function (marker, width, height, block) {\r\n    var attr = ['marker']\r\n\r\n    // Build attribute name\r\n    if (marker !== 'all') attr.push(marker)\r\n    attr = attr.join('-')\r\n\r\n    // Set marker attribute\r\n    marker = arguments[1] instanceof SVG.Marker\r\n      ? arguments[1]\r\n      : this.doc().marker(width, height, block)\r\n\r\n    return this.attr(attr, marker)\r\n  }\r\n})\r\n","// Define list of available attributes for stroke and fill\r\nvar sugar = {\r\n  stroke: ['color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset'],\r\n  fill: ['color', 'opacity', 'rule'],\r\n  prefix: function (t, a) {\r\n    return a === 'color' ? t : t + '-' + a\r\n  }\r\n}\r\n\r\n// Add sugar for fill and stroke\r\n;['fill', 'stroke'].forEach(function (m) {\r\n  var extension = {}\r\n  var i\r\n\r\n  extension[m] = function (o) {\r\n    if (typeof o === 'undefined') {\r\n      return this\r\n    }\r\n    if (typeof o === 'string' || SVG.Color.isRgb(o) || (o && typeof o.fill === 'function')) {\r\n      this.attr(m, o)\r\n    } else {\r\n      // set all attributes from sugar.fill and sugar.stroke list\r\n      for (i = sugar[m].length - 1; i >= 0; i--) {\r\n        if (o[sugar[m][i]] != null) {\r\n          this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]])\r\n        }\r\n      }\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  SVG.extend([SVG.Element, SVG.Timeline], extension)\r\n})\r\n\r\nSVG.extend([SVG.Element, SVG.Timeline], {\r\n  // Let the user set the matrix directly\r\n  matrix: function (mat, b, c, d, e, f) {\r\n    // Act as a getter\r\n    if (mat == null) {\r\n      return new SVG.Matrix(this)\r\n    }\r\n\r\n    // Act as a setter, the user can pass a matrix or a set of numbers\r\n    return this.attr('transform', new SVG.Matrix(mat, b, c, d, e, f))\r\n  },\r\n\r\n  // Map rotation to transform\r\n  rotate: function (angle, cx, cy) {\r\n    return this.transform({rotate: angle, ox: cx, oy: cy}, true)\r\n  },\r\n\r\n  // Map skew to transform\r\n  skew: function (x, y, cx, cy) {\r\n    return arguments.length === 1 || arguments.length === 3\r\n      ? this.transform({skew: x, ox: y, oy: cx}, true)\r\n      : this.transform({skew: [x, y], ox: cx, oy: cy}, true)\r\n  },\r\n\r\n  shear: function (lam, cx, cy) {\r\n    return this.transform({shear: lam, ox: cx, oy: cy}, true)\r\n  },\r\n\r\n  // Map scale to transform\r\n  scale: function (x, y, cx, cy) {\r\n    return arguments.length === 1 || arguments.length === 3\r\n      ? this.transform({ scale: x, ox: y, oy: cx }, true)\r\n      : this.transform({ scale: [x, y], ox: cx, oy: cy }, true)\r\n  },\r\n\r\n  // Map translate to transform\r\n  translate: function (x, y) {\r\n    return this.transform({ translate: [x, y] }, true)\r\n  },\r\n\r\n  // Map relative translations to transform\r\n  relative: function (x, y) {\r\n    return this.transform({ relative: [x, y] }, true)\r\n  },\r\n\r\n  // Map flip to transform\r\n  flip: function (direction, around) {\r\n    var directionString = typeof direction === 'string' ? direction\r\n      : isFinite(direction) ? 'both'\r\n      : 'both'\r\n    var origin = (direction === 'both' && isFinite(around)) ? [around, around]\r\n      : (direction === 'x') ? [around, 0]\r\n      : (direction === 'y') ? [0, around]\r\n      : isFinite(direction) ? [direction, direction]\r\n      : [0, 0]\r\n    this.transform({flip: directionString, origin: origin}, true)\r\n  },\r\n\r\n  // Opacity\r\n  opacity: function (value) {\r\n    return this.attr('opacity', value)\r\n  },\r\n\r\n  // Relative move over x axis\r\n  dx: function (x) {\r\n    return this.x(new SVG.Number(x).plus(this instanceof SVG.Timeline ? 0 : this.x()), true)\r\n  },\r\n\r\n  // Relative move over y axis\r\n  dy: function (y) {\r\n    return this.y(new SVG.Number(y).plus(this instanceof SVG.Timeline ? 0 : this.y()), true)\r\n  },\r\n\r\n  // Relative move over x and y axes\r\n  dmove: function (x, y) {\r\n    return this.dx(x).dy(y)\r\n  }\r\n})\r\n\r\nSVG.extend([SVG.Rect, SVG.Ellipse, SVG.Circle, SVG.Gradient, SVG.Timeline], {\r\n  // Add x and y radius\r\n  radius: function (x, y) {\r\n    var type = (this._target || this).type\r\n    return type === 'radialGradient' || type === 'radialGradient'\r\n      ? this.attr('r', new SVG.Number(x))\r\n      : this.rx(x).ry(y == null ? x : y)\r\n  }\r\n})\r\n\r\nSVG.extend(SVG.Path, {\r\n  // Get path length\r\n  length: function () {\r\n    return this.node.getTotalLength()\r\n  },\r\n  // Get point at length\r\n  pointAt: function (length) {\r\n    return new SVG.Point(this.node.getPointAtLength(length))\r\n  }\r\n})\r\n\r\nSVG.extend([SVG.Parent, SVG.Text, SVG.Tspan, SVG.Timeline], {\r\n  // Set font\r\n  font: function (a, v) {\r\n    if (typeof a === 'object') {\r\n      for (v in a) this.font(v, a[v])\r\n    }\r\n\r\n    return a === 'leading'\r\n        ? this.leading(v)\r\n      : a === 'anchor'\r\n        ? this.attr('text-anchor', v)\r\n      : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style'\r\n        ? this.attr('font-' + a, v)\r\n      : this.attr(a, v)\r\n  }\r\n})\r\n","\r\nSVG.extend(SVG.Element, {\r\n  // Store data values on svg nodes\r\n  data: function (a, v, r) {\r\n    if (typeof a === 'object') {\r\n      for (v in a) {\r\n        this.data(v, a[v])\r\n      }\r\n    } else if (arguments.length < 2) {\r\n      try {\r\n        return JSON.parse(this.attr('data-' + a))\r\n      } catch (e) {\r\n        return this.attr('data-' + a)\r\n      }\r\n    } else {\r\n      this.attr('data-' + a,\r\n        v === null ? null\r\n        : r === true || typeof v === 'string' || typeof v === 'number' ? v\r\n        : JSON.stringify(v)\r\n      )\r\n    }\r\n\r\n    return this\r\n  }\r\n})\r\n","\r\nSVG.extend(SVG.Element, {\r\n  // Remember arbitrary data\r\n  remember: function (k, v) {\r\n    // remember every item in an object individually\r\n    if (typeof arguments[0] === 'object') {\r\n      for (var key in k) {\r\n        this.remember(key, k[key])\r\n      }\r\n    } else if (arguments.length === 1) {\r\n      // retrieve memory\r\n      return this.memory()[k]\r\n    } else {\r\n      // store memory\r\n      this.memory()[k] = v\r\n    }\r\n\r\n    return this\r\n  },\r\n\r\n  // Erase a given memory\r\n  forget: function () {\r\n    if (arguments.length === 0) {\r\n      this._memory = {}\r\n    } else {\r\n      for (var i = arguments.length - 1; i >= 0; i--) {\r\n        delete this.memory()[arguments[i]]\r\n      }\r\n    }\r\n    return this\r\n  },\r\n\r\n  // Initialize or return local memory object\r\n  memory: function () {\r\n    return this._memory || (this._memory = {})\r\n  }\r\n})\r\n","/* global idFromReference */\r\n\r\n// Method for getting an element by id\r\nSVG.get = function (id) {\r\n  var node = document.getElementById(idFromReference(id) || id)\r\n  return SVG.adopt(node)\r\n}\r\n\r\n// Select elements by query string\r\nSVG.select = function (query, parent) {\r\n  return SVG.utils.map((parent || document).querySelectorAll(query), function (node) {\r\n    return SVG.adopt(node)\r\n  })\r\n}\r\n\r\nSVG.$$ = function (query, parent) {\r\n  return SVG.utils.map((parent || document).querySelectorAll(query), function (node) {\r\n    return SVG.adopt(node)\r\n  })\r\n}\r\n\r\nSVG.$ = function (query, parent) {\r\n  return SVG.adopt((parent || document).querySelector(query))\r\n}\r\n\r\nSVG.extend(SVG.Parent, {\r\n  // Scoped select method\r\n  select: function (query) {\r\n    return SVG.select(query, this.node)\r\n  }\r\n})\r\n","/* eslint no-unused-vars: 0 */\r\n\r\nfunction createElement (element, makeNested) {\r\n  if (element instanceof SVG.Element) return element\r\n\r\n  if (typeof element === 'object') {\r\n    return SVG.adopt(element)\r\n  }\r\n\r\n  if (element == null) {\r\n    return new SVG.Doc()\r\n  }\r\n\r\n  if (typeof element === 'string' && element.charAt(0) !== '<') {\r\n    return SVG.adopt(document.querySelector(element))\r\n  }\r\n\r\n  var node = SVG.create('svg')\r\n  node.innerHTML = element\r\n\r\n  element = SVG.adopt(node.firstElementChild)\r\n\r\n  return element\r\n}\r\n\r\nfunction isNulledBox (box) {\r\n  return !box.w && !box.h && !box.x && !box.y\r\n}\r\n\r\nfunction domContains (node) {\r\n  return (document.documentElement.contains || function (node) {\r\n    // This is IE - it does not support contains() for top-level SVGs\r\n    while (node.parentNode) {\r\n      node = node.parentNode\r\n    }\r\n    return node === document\r\n  }).call(document.documentElement, node)\r\n}\r\n\r\nfunction pathRegReplace (a, b, c, d) {\r\n  return c + d.replace(SVG.regex.dots, ' .')\r\n}\r\n\r\n// creates deep clone of array\r\nfunction arrayClone (arr) {\r\n  var clone = arr.slice(0)\r\n  for (var i = clone.length; i--;) {\r\n    if (Array.isArray(clone[i])) {\r\n      clone[i] = arrayClone(clone[i])\r\n    }\r\n  }\r\n  return clone\r\n}\r\n\r\n// tests if a given element is instance of an object\r\nfunction is (el, obj) {\r\n  return el instanceof obj\r\n}\r\n\r\n// tests if a given selector matches an element\r\nfunction matches (el, selector) {\r\n  return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector)\r\n}\r\n\r\n// Convert dash-separated-string to camelCase\r\nfunction camelCase (s) {\r\n  return s.toLowerCase().replace(/-(.)/g, function (m, g) {\r\n    return g.toUpperCase()\r\n  })\r\n}\r\n\r\n// Capitalize first letter of a string\r\nfunction capitalize (s) {\r\n  return s.charAt(0).toUpperCase() + s.slice(1)\r\n}\r\n\r\n// Ensure to six-based hex\r\nfunction fullHex (hex) {\r\n  return hex.length === 4\r\n    ? [ '#',\r\n      hex.substring(1, 2), hex.substring(1, 2),\r\n      hex.substring(2, 3), hex.substring(2, 3),\r\n      hex.substring(3, 4), hex.substring(3, 4)\r\n    ].join('')\r\n    : hex\r\n}\r\n\r\n// Component to hex value\r\nfunction compToHex (comp) {\r\n  var hex = comp.toString(16)\r\n  return hex.length === 1 ? '0' + hex : hex\r\n}\r\n\r\n// Calculate proportional width and height values when necessary\r\nfunction proportionalSize (element, width, height) {\r\n  if (width == null || height == null) {\r\n    var box = element.bbox()\r\n\r\n    if (width == null) {\r\n      width = box.width / box.height * height\r\n    } else if (height == null) {\r\n      height = box.height / box.width * width\r\n    }\r\n  }\r\n\r\n  return {\r\n    width: width,\r\n    height: height\r\n  }\r\n}\r\n\r\n// Map matrix array to object\r\nfunction arrayToMatrix (a) {\r\n  return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] }\r\n}\r\n\r\n// Add centre point to transform object\r\nfunction ensureCentre (o, target) {\r\n  o.cx = o.cx == null ? target.bbox().cx : o.cx\r\n  o.cy = o.cy == null ? target.bbox().cy : o.cy\r\n}\r\n\r\n// PathArray Helpers\r\nfunction arrayToString (a) {\r\n  for (var i = 0, il = a.length, s = ''; i < il; i++) {\r\n    s += a[i][0]\r\n\r\n    if (a[i][1] != null) {\r\n      s += a[i][1]\r\n\r\n      if (a[i][2] != null) {\r\n        s += ' '\r\n        s += a[i][2]\r\n\r\n        if (a[i][3] != null) {\r\n          s += ' '\r\n          s += a[i][3]\r\n          s += ' '\r\n          s += a[i][4]\r\n\r\n          if (a[i][5] != null) {\r\n            s += ' '\r\n            s += a[i][5]\r\n            s += ' '\r\n            s += a[i][6]\r\n\r\n            if (a[i][7] != null) {\r\n              s += ' '\r\n              s += a[i][7]\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return s + ' '\r\n}\r\n\r\n// Deep new id assignment\r\nfunction assignNewId (node) {\r\n  // do the same for SVG child nodes as well\r\n  for (var i = node.children.length - 1; i >= 0; i--) {\r\n    assignNewId(node.children[i])\r\n  }\r\n\r\n  if (node.id) {\r\n    return SVG.adopt(node).id(SVG.eid(node.nodeName))\r\n  }\r\n\r\n  return SVG.adopt(node)\r\n}\r\n\r\n// Add more bounding box properties\r\nfunction fullBox (b) {\r\n  if (b.x == null) {\r\n    b.x = 0\r\n    b.y = 0\r\n    b.width = 0\r\n    b.height = 0\r\n  }\r\n\r\n  b.w = b.width\r\n  b.h = b.height\r\n  b.x2 = b.x + b.width\r\n  b.y2 = b.y + b.height\r\n  b.cx = b.x + b.width / 2\r\n  b.cy = b.y + b.height / 2\r\n\r\n  return b\r\n}\r\n\r\n// Get id from reference string\r\nfunction idFromReference (url) {\r\n  var m = (url || '').toString().match(SVG.regex.reference)\r\n\r\n  if (m) return m[1]\r\n}\r\n\r\n// Create matrix array for looping\r\nvar abcdef = 'abcdef'.split('')\r\n\r\nfunction closeEnough (a, b, threshold) {\r\n  return Math.abs(b - a) < (threshold || 1e-6)\r\n}\r\n\r\nfunction isMatrixLike (o) {\r\n  return (\r\n    o.a != null ||\r\n    o.b != null ||\r\n    o.c != null ||\r\n    o.d != null ||\r\n    o.e != null ||\r\n    o.f != null\r\n  )\r\n}\r\n\r\n// TODO: Refactor this to a static function of matrix.js\r\nfunction formatTransforms (o) {\r\n  // Get all of the parameters required to form the matrix\r\n  var flipBoth = o.flip === 'both' || o.flip === true\r\n  var flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1\r\n  var flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1\r\n  var skewX = o.skew && o.skew.length ? o.skew[0]\r\n    : isFinite(o.skew) ? o.skew\r\n    : isFinite(o.skewX) ? o.skewX\r\n    : 0\r\n  var skewY = o.skew && o.skew.length ? o.skew[1]\r\n    : isFinite(o.skew) ? o.skew\r\n    : isFinite(o.skewY) ? o.skewY\r\n    : 0\r\n  var scaleX = o.scale && o.scale.length ? o.scale[0] * flipX\r\n    : isFinite(o.scale) ? o.scale * flipX\r\n    : isFinite(o.scaleX) ? o.scaleX * flipX\r\n    : flipX\r\n  var scaleY = o.scale && o.scale.length ? o.scale[1] * flipY\r\n    : isFinite(o.scale) ? o.scale * flipY\r\n    : isFinite(o.scaleY) ? o.scaleY * flipY\r\n    : flipY\r\n  var shear = o.shear || 0\r\n  var theta = o.rotate || o.theta || 0\r\n  var origin = new SVG.Point(o.origin || o.around || o.ox || o.originX, o.oy || o.originY)\r\n  var ox = origin.x\r\n  var oy = origin.y\r\n  var position = new SVG.Point(o.position || o.px || o.positionX, o.py || o.positionY)\r\n  var px = position.x\r\n  var py = position.y\r\n  var translate = new SVG.Point(o.translate || o.tx || o.translateX, o.ty || o.translateY)\r\n  var tx = translate.x\r\n  var ty = translate.y\r\n  var relative = new SVG.Point(o.relative || o.rx || o.relativeX, o.ry || o.relativeY)\r\n  var rx = relative.x\r\n  var ry = relative.y\r\n\r\n  // Populate all of the values\r\n  return {\r\n    scaleX, scaleY, skewX, skewY, shear, theta, rx, ry, tx, ty, ox, oy, px, py\r\n  }\r\n}\r\n\r\n// left matrix, right matrix, target matrix which is overwritten\r\nfunction matrixMultiply (l, r, o) {\r\n  // Work out the product directly\r\n  var a = l.a * r.a + l.c * r.b\r\n  var b = l.b * r.a + l.d * r.b\r\n  var c = l.a * r.c + l.c * r.d\r\n  var d = l.b * r.c + l.d * r.d\r\n  var e = l.e + l.a * r.e + l.c * r.f\r\n  var f = l.f + l.b * r.e + l.d * r.f\r\n\r\n  // make sure to use local variables because l/r and o could be the same\r\n  o.a = a\r\n  o.b = b\r\n  o.c = c\r\n  o.d = d\r\n  o.e = e\r\n  o.f = f\r\n\r\n  return o\r\n}\r\n\r\nfunction getOrigin (o, element) {\r\n  // Allow origin or around as the names\r\n  let origin = o.origin // o.around == null ? o.origin : o.around\r\n  let ox, oy\r\n\r\n  // Allow the user to pass a string to rotate around a given point\r\n  if (typeof origin === 'string' || origin == null) {\r\n    // Get the bounding box of the element with no transformations applied\r\n    const string = (origin || 'center').toLowerCase().trim()\r\n    const { height, width, x, y } = element.bbox()\r\n\r\n    // Calculate the transformed x and y coordinates\r\n    let bx = string.includes('left') ? x\r\n      : string.includes('right') ? x + width\r\n      : x + width / 2\r\n    let by = string.includes('top') ? y\r\n      : string.includes('bottom') ? y + height\r\n      : y + height / 2\r\n\r\n    // Set the bounds eg : \"bottom-left\", \"Top right\", \"middle\" etc...\r\n    ox = o.ox != null ? o.ox : bx\r\n    oy = o.oy != null ? o.oy : by\r\n  } else {\r\n    ox = origin[0]\r\n    oy = origin[1]\r\n  }\r\n\r\n  // Return the origin as it is if it wasn't a string\r\n  return [ ox, oy ]\r\n}\r\n","/* globals fullBox, domContains, isNulledBox, Exception */\r\n\r\nSVG.Box = SVG.invent({\r\n  create: function (source) {\r\n    var base = [0, 0, 0, 0]\r\n    source = typeof source === 'string' ? source.split(SVG.regex.delimiter).map(parseFloat)\r\n      : Array.isArray(source) ? source\r\n      : typeof source === 'object' ? [source.left != null ? source.left\r\n      : source.x, source.top != null ? source.top : source.y, source.width, source.height]\r\n      : arguments.length === 4 ? [].slice.call(arguments)\r\n      : base\r\n\r\n    this.x = source[0]\r\n    this.y = source[1]\r\n    this.width = source[2]\r\n    this.height = source[3]\r\n\r\n    // add center, right, bottom...\r\n    fullBox(this)\r\n  },\r\n  extend: {\r\n    // Merge rect box with another, return a new instance\r\n    merge: function (box) {\r\n      var x = Math.min(this.x, box.x)\r\n      var y = Math.min(this.y, box.y)\r\n\r\n      return new SVG.Box(\r\n        x, y,\r\n        Math.max(this.x + this.width, box.x + box.width) - x,\r\n        Math.max(this.y + this.height, box.y + box.height) - y\r\n      )\r\n    },\r\n\r\n    transform: function (m) {\r\n      var xMin = Infinity\r\n      var xMax = -Infinity\r\n      var yMin = Infinity\r\n      var yMax = -Infinity\r\n\r\n      var pts = [\r\n        new SVG.Point(this.x, this.y),\r\n        new SVG.Point(this.x2, this.y),\r\n        new SVG.Point(this.x, this.y2),\r\n        new SVG.Point(this.x2, this.y2)\r\n      ]\r\n\r\n      pts.forEach(function (p) {\r\n        p = p.transform(m)\r\n        xMin = Math.min(xMin, p.x)\r\n        xMax = Math.max(xMax, p.x)\r\n        yMin = Math.min(yMin, p.y)\r\n        yMax = Math.max(yMax, p.y)\r\n      })\r\n\r\n      return new SVG.Box(\r\n        xMin, yMin,\r\n        xMax - xMin,\r\n        yMax - yMin\r\n      )\r\n    },\r\n\r\n    addOffset: function () {\r\n      // offset by window scroll position, because getBoundingClientRect changes when window is scrolled\r\n      this.x += window.pageXOffset\r\n      this.y += window.pageYOffset\r\n      return this\r\n    },\r\n    toString: function () {\r\n      return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height\r\n    },\r\n    toArray: function () {\r\n      return [this.x, this.y, this.width, this.height]\r\n    },\r\n    morph: function (x, y, width, height) {\r\n      this.destination = new SVG.Box(x, y, width, height)\r\n      return this\r\n    },\r\n\r\n    at: function (pos) {\r\n      if (!this.destination) return this\r\n\r\n      return new SVG.Box(\r\n          this.x + (this.destination.x - this.x) * pos\r\n        , this.y + (this.destination.y - this.y) * pos\r\n        , this.width + (this.destination.width - this.width) * pos\r\n        , this.height + (this.destination.height - this.height) * pos\r\n      )\r\n    }\r\n  },\r\n\r\n    // Define Parent\r\n  parent: SVG.Element,\r\n\r\n  // Constructor\r\n  construct: {\r\n    // Get bounding box\r\n    bbox: function () {\r\n      var box\r\n\r\n      try {\r\n        // find native bbox\r\n        box = this.node.getBBox()\r\n\r\n        if (isNulledBox(box) && !domContains(this.node)) {\r\n          throw new Exception('Element not in the dom')\r\n        }\r\n      } catch (e) {\r\n        try {\r\n          var clone = this.clone(SVG.parser().svg).show()\r\n          box = clone.node.getBBox()\r\n          clone.remove()\r\n        } catch (e) {\r\n          console.warn('Getting a bounding box of this element is not possible')\r\n        }\r\n      }\r\n\r\n      return new SVG.Box(box)\r\n    },\r\n\r\n    rbox: function (el) {\r\n      // IE11 throws an error when element not in dom\r\n      try {\r\n        var box = new SVG.Box(this.node.getBoundingClientRect())\r\n        if (el) return box.transform(el.screenCTM().inverse())\r\n        return box.addOffset()\r\n      } catch (e) {\r\n        return new SVG.Box()\r\n      }\r\n    }\r\n  }\r\n})\r\n\r\nSVG.extend([SVG.Doc, SVG.Symbol, SVG.Image, SVG.Pattern, SVG.Marker, SVG.ForeignObject, SVG.View], {\r\n  viewbox: function (x, y, width, height) {\r\n    // act as getter\r\n    if (x == null) return new SVG.Box(this.attr('viewBox'))\r\n\r\n    // act as setter\r\n    return this.attr('viewBox', new SVG.Box(x, y, width, height))\r\n  }\r\n})\r\n","\r\nSVG.parser = function () {\r\n  var b\r\n\r\n  if (!SVG.parser.nodes.svg.node.parentNode) {\r\n    b = document.body || document.documentElement\r\n    SVG.parser.nodes.svg.addTo(b)\r\n  }\r\n\r\n  return SVG.parser.nodes\r\n}\r\n\r\nSVG.parser.nodes = {\r\n  svg: SVG().size(2, 0).css({\r\n    opacity: 0,\r\n    position: 'absolute',\r\n    left: '-100%',\r\n    top: '-100%',\r\n    overflow: 'hidden'\r\n  })\r\n}\r\n\r\nSVG.parser.nodes.path = SVG.parser.nodes.svg.path().node\r\n","/* global requestAnimationFrame */\n\nSVG.Animator = {\n  nextDraw: null,\n  frames: new SVG.Queue(),\n  timeouts: new SVG.Queue(),\n  timer: window.performance || window.Date,\n  transforms: [],\n\n  frame: function (fn) {\n    // Store the node\n    var node = SVG.Animator.frames.push({ run: fn })\n\n    // Request an animation frame if we don't have one\n    if (SVG.Animator.nextDraw === null) {\n      SVG.Animator.nextDraw = requestAnimationFrame(SVG.Animator._draw)\n    }\n\n    // Return the node so we can remove it easily\n    return node\n  },\n\n  transform_frame: function (fn, id) {\n    SVG.Animator.transforms[id] = fn\n  },\n\n  timeout: function (fn, delay) {\n    delay = delay || 0\n\n    // Work out when the event should fire\n    var time = SVG.Animator.timer.now() + delay\n\n    // Add the timeout to the end of the queue\n    var node = SVG.Animator.timeouts.push({ run: fn, time: time })\n\n    // Request another animation frame if we need one\n    if (SVG.Animator.nextDraw === null) {\n      SVG.Animator.nextDraw = requestAnimationFrame(SVG.Animator._draw)\n    }\n\n    return node\n  },\n\n  cancelFrame: function (node) {\n    SVG.Animator.frames.remove(node)\n  },\n\n  clearTimeout: function (node) {\n    SVG.Animator.timeouts.remove(node)\n  },\n\n  _draw: function (now) {\n    // Run all the timeouts we can run, if they are not ready yet, add them\n    // to the end of the queue immediately! (bad timeouts!!! [sarcasm])\n    var nextTimeout = null\r\n    var lastTimeout = SVG.Animator.timeouts.last()\n    while ((nextTimeout = SVG.Animator.timeouts.shift())) {\n      // Run the timeout if its time, or push it to the end\n      if (now >= nextTimeout.time) {\n        nextTimeout.run()\n      } else {\n        SVG.Animator.timeouts.push(nextTimeout)\n      }\n\n      // If we hit the last item, we should stop shifting out more items\n      if (nextTimeout === lastTimeout) break\n    }\n\n    // Run all of the animation frames\n    var nextFrame = null\n    var lastFrame = SVG.Animator.frames.last()\n    while ((nextFrame !== lastFrame) && (nextFrame = SVG.Animator.frames.shift())) {\n      nextFrame.run()\n    }\n\n    SVG.Animator.transforms.forEach(function (el) { el() })\n\n    // If we have remaining timeouts or frames, draw until we don't anymore\n    SVG.Animator.nextDraw = SVG.Animator.timeouts.first() || SVG.Animator.frames.first()\n        ? requestAnimationFrame(SVG.Animator._draw)\n        : null\n  }\n}\n","\r\nSVG.Morphable = SVG.invent({\r\n  create: function (stepper) {\r\n    // FIXME: the default stepper does not know about easing\r\n    this._stepper = stepper || new SVG.Ease('-')\r\n\r\n    this._from = null\r\n    this._to = null\r\n    this._type = null\r\n    this._context = null\r\n    this._morphObj = null\r\n  },\r\n\r\n  extend: {\r\n\r\n    from: function (val) {\r\n      if (val == null) {\r\n        return this._from\r\n      }\r\n\r\n      this._from = this._set(val)\r\n      return this\r\n    },\r\n\r\n    to: function (val) {\r\n      if (val == null) {\r\n        return this._to\r\n      }\r\n\r\n      this._to = this._set(val)\r\n      return this\r\n    },\r\n\r\n    type: function (type) {\r\n      // getter\r\n      if (type == null) {\r\n        return this._type\r\n      }\r\n\r\n      // setter\r\n      this._type = type\r\n      return this\r\n    },\r\n\r\n    _set: function (value) {\r\n      if (!this._type) {\r\n        var type = typeof value\r\n\r\n        if (type === 'number') {\r\n          this.type(SVG.Number)\r\n        } else if (type === 'string') {\r\n          if (SVG.Color.isColor(value)) {\r\n            this.type(SVG.Color)\r\n          } else if (SVG.regex.delimiter.test(value)) {\r\n            this.type(SVG.regex.pathLetters.test(value)\r\n              ? SVG.PathArray\r\n              : SVG.Array\r\n            )\r\n          } else if (SVG.regex.numberAndUnit.test(value)) {\r\n            this.type(SVG.Number)\r\n          } else {\r\n            this.type(SVG.Morphable.NonMorphable)\r\n          }\r\n        } else if (SVG.MorphableTypes.indexOf(value.constructor) > -1) {\r\n          this.type(value.constructor)\r\n        } else if (Array.isArray(value)) {\r\n          this.type(SVG.Array)\r\n        } else if (type === 'object') {\r\n          this.type(SVG.Morphable.ObjectBag)\r\n        } else {\r\n          this.type(SVG.Morphable.NonMorphable)\r\n        }\r\n      }\r\n\r\n      var result = (new this._type(value)).toArray()\r\n      this._morphObj = this._morphObj || new this._type()\r\n      this._context = this._context ||\r\n        Array.apply(null, Array(result.length)).map(Object)\r\n      return result\r\n    },\r\n\r\n    stepper: function (stepper) {\r\n      if (stepper == null) return this._stepper\r\n      this._stepper = stepper\r\n      return this\r\n    },\r\n\r\n    done: function () {\r\n      var complete = this._context\r\n        .map(this._stepper.done)\r\n        .reduce(function (last, curr) {\r\n          return last && curr\r\n        }, true)\r\n      return complete\r\n    },\r\n\r\n    at: function (pos) {\r\n      var _this = this\r\n\r\n      return this._morphObj.fromArray(\r\n        this._from.map(function (i, index) {\r\n          return _this._stepper.step(i, _this._to[index], pos, _this._context[index], _this._context)\r\n        })\r\n      )\r\n    }\r\n  }\r\n})\r\n\r\nSVG.Morphable.NonMorphable = SVG.invent({\r\n  create: function (val) {\r\n    val = Array.isArray(val) ? val[0] : val\r\n    this.value = val\r\n  },\r\n\r\n  extend: {\r\n    valueOf: function () {\r\n      return this.value\r\n    },\r\n\r\n    toArray: function () {\r\n      return [this.value]\r\n    }\r\n  }\r\n})\r\n\r\nSVG.Morphable.TransformBag = SVG.invent({\r\n  create: function (obj) {\r\n    if (Array.isArray(obj)) {\r\n      obj = {\r\n        scaleX: obj[0],\r\n        scaleY: obj[1],\r\n        shear: obj[2],\r\n        rotate: obj[3],\r\n        translateX: obj[4],\r\n        translateY: obj[5],\r\n        originX: obj[6],\r\n        originY: obj[7]\r\n      }\r\n    }\r\n\r\n    Object.assign(this, SVG.Morphable.TransformBag.defaults, obj)\r\n  },\r\n\r\n  extend: {\r\n    toArray: function () {\r\n      var v = this\r\n\r\n      return [\r\n        v.scaleX,\r\n        v.scaleY,\r\n        v.shear,\r\n        v.rotate,\r\n        v.translateX,\r\n        v.translateY,\r\n        v.originX,\r\n        v.originY\r\n      ]\r\n    }\r\n  }\r\n})\r\n\r\nSVG.Morphable.TransformBag.defaults = {\r\n  scaleX: 1,\r\n  scaleY: 1,\r\n  shear: 0,\r\n  rotate: 0,\r\n  translateX: 0,\r\n  translateY: 0,\r\n  originX: 0,\r\n  originY: 0\r\n}\r\n\r\nSVG.Morphable.ObjectBag = SVG.invent({\r\n  create: function (objOrArr) {\r\n    this.values = []\r\n\r\n    if (Array.isArray(objOrArr)) {\r\n      this.values = objOrArr\r\n      return\r\n    }\r\n\r\n    var entries = Object.entries(objOrArr || {}).sort((a, b) => {\r\n      return a[0] - b[0]\r\n    })\r\n\r\n    this.values = entries.reduce((last, curr) => last.concat(curr), [])\r\n  },\r\n\r\n  extend: {\r\n    valueOf: function () {\r\n      var obj = {}\r\n      var arr = this.values\r\n\r\n      for (var i = 0, len = arr.length; i < len; i += 2) {\r\n        obj[arr[i]] = arr[i + 1]\r\n      }\r\n\r\n      return obj\r\n    },\r\n\r\n    toArray: function () {\r\n      return this.values\r\n    }\r\n  }\r\n})\r\n\r\nSVG.MorphableTypes = [\r\n  SVG.Number,\r\n  SVG.Color,\r\n  SVG.Box,\r\n  SVG.Matrix,\r\n  SVG.Array,\r\n  SVG.PointArray,\r\n  SVG.PathArray,\r\n  SVG.Morphable.NonMorphable,\r\n  SVG.Morphable.TransformBag,\r\n  SVG.Morphable.ObjectBag\r\n]\r\n\r\nSVG.extend(SVG.MorphableTypes, {\r\n  to: function (val, args) {\r\n    return new SVG.Morphable()\r\n      .type(this.constructor)\r\n      .from(this.valueOf())\r\n      .to(val, args)\r\n  },\r\n  fromArray: function (arr) {\r\n    this.constructor(arr)\r\n    return this\r\n  }\r\n})\r\n","/* global isMatrixLike getOrigin */\r\n\r\nSVG.easing = {\r\n  '-': function (pos) { return pos },\r\n  '<>': function (pos) { return -Math.cos(pos * Math.PI) / 2 + 0.5 },\r\n  '>': function (pos) { return Math.sin(pos * Math.PI / 2) },\r\n  '<': function (pos) { return -Math.cos(pos * Math.PI / 2) + 1 }\r\n}\r\n\r\nSVG.Runner = SVG.invent({\r\n  parent: SVG.Element,\r\n\r\n  create: function (options) {\r\n    // Store a unique id on the runner, so that we can identify it later\r\n    this.id = SVG.Runner.id++\r\n\r\n    // Ensure a default value\r\n    options = options == null\r\n      ? SVG.defaults.timeline.duration\r\n      : options\r\n\r\n    // Ensure that we get a controller\r\n    options = typeof options === 'function'\r\n      ? new SVG.Controller(options)\r\n      : options\r\n\r\n    // Declare all of the variables\r\n    this._element = null\r\n    this._timeline = null\r\n    this.done = false\r\n    this._queue = []\r\n\r\n    // Work out the stepper and the duration\r\n    this._duration = typeof options === 'number' && options\r\n    this._isDeclarative = options instanceof SVG.Controller\r\n    this._stepper = this._isDeclarative ? options : new SVG.Ease()\r\n\r\n    // We copy the current values from the timeline because they can change\r\n    this._history = {}\r\n\r\n    // Store the state of the runner\r\n    this.enabled = true\r\n    this._time = 0\r\n    this._last = 0\r\n    this.tags = {}\r\n\r\n    // Save transforms applied to this runner\r\n    this.transforms = new SVG.Matrix()\r\n    this.transformId = 1\r\n\r\n    // Looping variables\r\n    this._haveReversed = false\r\n    this._reverse = false\r\n    this._loopsDone = 0\r\n    this._swing = false\r\n    this._wait = 0\r\n    this._times = 1\r\n  },\r\n\r\n  construct: {\r\n\r\n    animate: function (duration, delay, when) {\r\n      var o = SVG.Runner.sanitise(duration, delay, when)\r\n      var timeline = this.timeline()\r\n      return new SVG.Runner(o.duration)\r\n        .loop(o)\r\n        .element(this)\r\n        .timeline(timeline)\r\n        .schedule(delay, when)\r\n    },\r\n\r\n    delay: function (by, when) {\r\n      return this.animate(0, by, when)\r\n    }\r\n  },\r\n\r\n  extend: {\r\n\r\n    /*\r\n    Runner Definitions\r\n    ==================\r\n    These methods help us define the runtime behaviour of the Runner or they\r\n    help us make new runners from the current runner\r\n    */\r\n\r\n    element: function (element) {\r\n      if (element == null) return this._element\r\n      this._element = element\r\n      element._prepareRunner()\r\n      return this\r\n    },\r\n\r\n    timeline: function (timeline) {\r\n      // check explicitly for undefined so we can set the timeline to null\r\n      if (typeof timeline === 'undefined') return this._timeline\r\n      this._timeline = timeline\r\n      return this\r\n    },\r\n\r\n    animate: function (duration, delay, when) {\r\n      var o = SVG.Runner.sanitise(duration, delay, when)\r\n      var runner = new SVG.Runner(o.duration)\r\n      if (this._timeline) runner.timeline(this._timeline)\r\n      if (this._element) runner.element(this._element)\r\n      return runner.loop(o).schedule(delay, when)\r\n    },\r\n\r\n    schedule: function (timeline, delay, when) {\r\n      // The user doesn't need to pass a timeline if we already have one\r\n      if (!(timeline instanceof SVG.Timeline)) {\r\n        when = delay\r\n        delay = timeline\r\n        timeline = this.timeline()\r\n      }\r\n\r\n      // If there is no timeline, yell at the user...\r\n      if (!timeline) {\r\n        throw Error('Runner cannot be scheduled without timeline')\r\n      }\r\n\r\n      // Schedule the runner on the timeline provided\r\n      timeline.schedule(this, delay, when)\r\n      return this\r\n    },\r\n\r\n    unschedule: function () {\r\n      var timeline = this.timeline()\r\n      timeline && timeline.unschedule(this)\r\n      return this\r\n    },\r\n\r\n    loop: function (times, swing, wait) {\r\n      // Deal with the user passing in an object\r\n      if (typeof times === 'object') {\r\n        swing = times.swing\r\n        wait = times.wait\r\n        times = times.times\r\n      }\r\n\r\n      // Sanitise the values and store them\r\n      this._times = times || Infinity\r\n      this._swing = swing || false\r\n      this._wait = wait || 0\r\n      return this\r\n    },\r\n\r\n    delay: function (delay) {\r\n      return this.animate(0, delay)\r\n    },\r\n\r\n    /*\r\n    Basic Functionality\r\n    ===================\r\n    These methods allow us to attach basic functions to the runner directly\r\n    */\r\n\r\n    queue: function (initFn, runFn, isTransform) {\r\n      this._queue.push({\r\n        initialiser: initFn || SVG.void,\r\n        runner: runFn || SVG.void,\r\n        isTransform: isTransform,\r\n        initialised: false,\r\n        finished: false\r\n      })\r\n      var timeline = this.timeline()\r\n      timeline && this.timeline()._continue()\r\n      return this\r\n    },\r\n\r\n    during: function (fn) {\r\n      return this.queue(null, fn)\r\n    },\r\n\r\n    after (fn) {\r\n      return this.on('finish', fn)\r\n    },\r\n\r\n    /*\r\n    Runner animation methods\r\n    ========================\r\n    Control how the animation plays\r\n    */\r\n\r\n    time: function (time) {\r\n      if (time == null) {\r\n        return this._time\r\n      }\r\n      let dt = time - this._time\r\n      this.step(dt)\r\n      return this\r\n    },\r\n\r\n    duration: function () {\r\n      return this._times * (this._wait + this._duration) - this._wait\r\n    },\r\n\r\n    loops: function (p) {\r\n      var loopDuration = this._duration + this._wait\r\n      if (p == null) {\r\n        var loopsDone = Math.floor(this._time / loopDuration)\r\n        var relativeTime = (this._time - loopsDone * loopDuration)\r\n        var position = relativeTime / this._duration\r\n        return Math.min(loopsDone + position, this._times)\r\n      }\r\n      var whole = Math.floor(p)\r\n      var partial = p % 1\r\n      var time = loopDuration * whole + this._duration * partial\r\n      return this.time(time)\r\n    },\r\n\r\n    position: function (p) {\r\n      // Get all of the variables we need\r\n      var x = this._time\r\n      var d = this._duration\r\n      var w = this._wait\r\n      var t = this._times\r\n      var s = this._swing\r\n      var r = this._reverse\r\n      var position\r\n\r\n      if (p == null) {\r\n        /*\r\n        This function converts a time to a position in the range [0, 1]\r\n        The full explanation can be found in this desmos demonstration\r\n          https://www.desmos.com/calculator/u4fbavgche\r\n        The logic is slightly simplified here because we can use booleans\r\n        */\r\n\r\n        // Figure out the value without thinking about the start or end time\r\n        const f = function (x) {\r\n          var swinging = s * Math.floor(x % (2 * (w + d)) / (w + d))\r\n          var backwards = (swinging && !r) || (!swinging && r)\r\n          var uncliped = Math.pow(-1, backwards) * (x % (w + d)) / d + backwards\r\n          var clipped = Math.max(Math.min(uncliped, 1), 0)\r\n          return clipped\r\n        }\r\n\r\n        // Figure out the value by incorporating the start time\r\n        var endTime = t * (w + d) - w\r\n        position = x <= 0 ? Math.round(f(1e-5))\r\n          : x < endTime ? f(x)\r\n          : Math.round(f(endTime - 1e-5))\r\n        return position\r\n      }\r\n\r\n      // Work out the loops done and add the position to the loops done\r\n      var loopsDone = Math.floor(this.loops())\r\n      var swingForward = s && (loopsDone % 2 === 0)\r\n      var forwards = (swingForward && !r) || (r && swingForward)\r\n      position = loopsDone + (forwards ? p : 1 - p)\r\n      return this.loops(position)\r\n    },\r\n\r\n    progress: function (p) {\r\n      if (p == null) {\r\n        return Math.min(1, this._time / this.duration())\r\n      }\r\n      return this.time(p * this.duration())\r\n    },\r\n\r\n    step: function (dt) {\r\n      // If we are inactive, this stepper just gets skipped\r\n      if (!this.enabled) return this\r\n\r\n      // Update the time and get the new position\r\n      dt = dt == null ? 16 : dt\r\n      this._time += dt\r\n      var position = this.position()\r\n\r\n      // Figure out if we need to run the stepper in this frame\r\n      var running = this._lastPosition !== position && this._time >= 0\r\n      this._lastPosition = position\r\n\r\n      // Figure out if we just started\r\n      var duration = this.duration()\r\n      var justStarted = this._lastTime < 0 && this._time > 0\r\n      var justFinished = this._lastTime < this._time && this.time > duration\r\n      this._lastTime = this._time\r\n      if (justStarted) {\r\n        // this.fire('start', this)\r\n      }\r\n\r\n      // Work out if the runner is finished set the done flag here so animations\r\n      // know, that they are running in the last step (this is good for\r\n      // transformations which can be merged)\r\n      var declarative = this._isDeclarative\r\n      this.done = !declarative && !justFinished && this._time >= duration\r\n\r\n      // Call initialise and the run function\r\n      if (running || declarative) {\r\n        this._initialise(running)\r\n\r\n        // clear the transforms on this runner so they dont get added again and again\r\n        this.transforms = new SVG.Matrix()\r\n        var converged = this._run(declarative ? dt : position)\r\n        // this.fire('step', this)\r\n      }\r\n      // correct the done flag here\r\n      // declaritive animations itself know when they converged\r\n      this.done = this.done || (converged && declarative)\r\n      // if (this.done) {\r\n      //   this.fire('finish', this)\r\n      // }\r\n      return this\r\n    },\r\n\r\n    finish: function () {\r\n      return this.step(Infinity)\r\n    },\r\n\r\n    reverse: function (reverse) {\r\n      this._reverse = reverse == null ? !this._reverse : reverse\r\n      return this\r\n    },\r\n\r\n    ease: function (fn) {\r\n      this._stepper = new SVG.Ease(fn)\r\n      return this\r\n    },\r\n\r\n    active: function (enabled) {\r\n      if (enabled == null) return this.enabled\r\n      this.enabled = enabled\r\n      return this\r\n    },\r\n\r\n    /*\r\n    Runner Management\r\n    =================\r\n    Functions that are used to help index the runner\r\n    */\r\n\r\n    tag: function (name) {\r\n      // Act as a getter to get all of the tags on this object\r\n      if (name == null) return Object.keys(this.tags)\r\n\r\n      // Add all of the tags to the object directly\r\n      name = Array.isArray(name) ? name : [name]\r\n      for (var i = name.length; i--;) {\r\n        this.tags[name[i]] = true\r\n      }\r\n      return this\r\n    },\r\n\r\n    untag: function (name) {\r\n      name = Array.isArray(name) ? name : [name]\r\n      for (var i = name.length; i--;) {\r\n        delete this.tags[name[i]]\r\n      }\r\n      return this\r\n    },\r\n\r\n    getEventTarget: function () {\r\n      return this._dispatcher\r\n    },\r\n\r\n    /*\r\n    Private Methods\r\n    ===============\r\n    Methods that shouldn't be used externally\r\n    */\r\n\r\n    // Save a morpher to the morpher list so that we can retarget it later\r\n    _rememberMorpher: function (method, morpher) {\r\n      this._history[method] = {\r\n        morpher: morpher,\r\n        caller: this._queue[this._queue.length - 1]\r\n      }\r\n    },\r\n\r\n    // Try to set the target for a morpher if the morpher exists, otherwise\r\n    // do nothing and return false\r\n    _tryRetarget: function (method, target) {\r\n      if (this._history[method]) {\r\n        // if the last method wasnt even initialised, throw it away\r\n        if (!this._history[method].caller.initialised) {\r\n          let index = this._queue.indexOf(this._history[method].caller)\r\n          this._queue.splice(index, 1)\r\n          return false\r\n        }\r\n\r\n        // for the case of transformations, we use the special retarget function\r\n        // which has access to the outer scope\r\n        if (this._history[method].caller.isTransform) {\r\n          this._history[method].caller.isTransform(target)\r\n        // for everything else a simple morpher change is sufficient\r\n        } else {\r\n          this._history[method].morpher.to(target)\r\n        }\r\n\r\n        this._history[method].caller.finished = false\r\n        var timeline = this.timeline()\r\n        timeline && timeline._continue()\r\n        return true\r\n      }\r\n      return false\r\n    },\r\n\r\n    // Run each initialise function in the runner if required\r\n    _initialise: function (running) {\r\n      // If we aren't running, we shouldn't initialise when not declarative\r\n      if (!running && !this._isDeclarative) return\r\n\r\n      // Loop through all of the initialisers\r\n      for (var i = 0, len = this._queue.length; i < len; ++i) {\r\n        // Get the current initialiser\r\n        var current = this._queue[i]\r\n\r\n        // Determine whether we need to initialise\r\n        var needsIt = this._isDeclarative || (!current.initialised && running)\r\n        running = !current.finished\r\n\r\n        // Call the initialiser if we need to\r\n        if (needsIt && running) {\r\n          current.initialiser.call(this)\r\n          current.initialised = true\r\n        }\r\n      }\r\n    },\r\n\r\n    // Run each run function for the position or dt given\r\n    _run: function (positionOrDt) {\r\n      // Run all of the _queue directly\r\n      var allfinished = true\r\n      for (var i = 0, len = this._queue.length; i < len; ++i) {\r\n        // Get the current function to run\r\n        var current = this._queue[i]\r\n\r\n        // Run the function if its not finished, we keep track of the finished\r\n        // flag for the sake of declarative _queue\r\n        var converged = current.runner.call(this, positionOrDt)\r\n        current.finished = current.finished || (converged === true)\r\n        allfinished = allfinished && current.finished\r\n      }\r\n\r\n      // We report when all of the constructors are finished\r\n      return allfinished\r\n    },\r\n\r\n    addTransform: function (transform, index) {\r\n      this.transforms.lmultiplyO(transform)\r\n      return this\r\n    },\r\n\r\n    clearTransform: function () {\r\n      this.transforms = new SVG.Matrix()\r\n      return this\r\n    }\r\n  }\r\n})\r\n\r\nSVG.Runner.id = 0\r\n\r\nSVG.Runner.sanitise = function (duration, delay, when) {\r\n  // Initialise the default parameters\r\n  var times = 1\r\n  var swing = false\r\n  var wait = 0\r\n  duration = duration || SVG.defaults.timeline.duration\r\n  delay = delay || SVG.defaults.timeline.delay\r\n  when = when || 'last'\r\n\r\n  // If we have an object, unpack the values\r\n  if (typeof duration === 'object' && !(duration instanceof SVG.Stepper)) {\r\n    delay = duration.delay || delay\r\n    when = duration.when || when\r\n    swing = duration.swing || swing\r\n    times = duration.times || times\r\n    wait = duration.wait || wait\r\n    duration = duration.duration || SVG.defaults.timeline.duration\r\n  }\r\n\r\n  return {\r\n    duration: duration,\r\n    delay: delay,\r\n    swing: swing,\r\n    times: times,\r\n    wait: wait,\r\n    when: when\r\n  }\r\n}\r\n\r\nSVG.FakeRunner = class {\r\n  constructor (transforms = new SVG.Matrix(), id = -1, done = true) {\r\n    this.transforms = transforms\r\n    this.id = id\r\n    this.done = done\r\n  }\r\n}\r\n\r\nSVG.extend([SVG.Runner, SVG.FakeRunner], {\r\n  mergeWith (runner) {\r\n    return new SVG.FakeRunner(\r\n      runner.transforms.lmultiply(this.transforms),\r\n      runner.id\r\n    )\r\n  }\r\n})\r\n\r\n// SVG.FakeRunner.emptyRunner = new SVG.FakeRunner()\r\n\r\nconst lmultiply = (last, curr) => last.lmultiplyO(curr)\r\nconst getRunnerTransform = (runner) => runner.transforms\r\n\r\nfunction mergeTransforms () {\r\n  // Find the matrix to apply to the element and apply it\r\n  let runners = this._transformationRunners.runners\r\n  let netTransform = runners\r\n    .map(getRunnerTransform)\r\n    .reduce(lmultiply, new SVG.Matrix())\r\n\r\n  this.transform(netTransform)\r\n\r\n  this._transformationRunners.merge()\r\n\r\n  if (this._transformationRunners.length() === 1) {\r\n    this._frameId = null\r\n  }\r\n}\r\n\r\nclass RunnerArray {\r\n  constructor () {\r\n    this.runners = []\r\n    this.ids = []\r\n  }\r\n\r\n  add (runner) {\r\n    if (this.runners.includes(runner)) return\r\n\r\n    let id = runner.id + 1\r\n\r\n    let leftSibling = this.ids.reduce((last, curr) => {\r\n      if (curr > last && curr < id) return curr\r\n      return last\r\n    }, 0)\r\n\r\n    let index = this.ids.indexOf(leftSibling) + 1\r\n\r\n    this.ids.splice(index, 0, id)\r\n    this.runners.splice(index, 0, runner)\r\n\r\n    return this\r\n  }\r\n\r\n  getByID (id) {\r\n    return this.runners[this.ids.indexOf(id + 1)]\r\n  }\r\n\r\n  remove (id) {\r\n    let index = this.ids.indexOf(id + 1)\r\n    this.ids.splice(index, 1)\r\n    this.runners.splice(index, 1)\r\n    return this\r\n  }\r\n\r\n  merge () {\r\n    let lastRunner = null\r\n    this.runners.forEach((runner, i) => {\r\n      if (lastRunner && runner.done && lastRunner.done) {\r\n        this.remove(runner.id)\r\n        this.edit(lastRunner.id, runner.mergeWith(lastRunner))\r\n      }\r\n\r\n      lastRunner = runner\r\n    })\r\n\r\n    return this\r\n  }\r\n\r\n  edit (id, newRunner) {\r\n    let index = this.ids.indexOf(id + 1)\r\n    this.ids.splice(index, 1, id)\r\n    this.runners.splice(index, 1, newRunner)\r\n    return this\r\n  }\r\n\r\n  length () {\r\n    return this.ids.length\r\n  }\r\n\r\n  clearBefore (id) {\r\n    let deleteCnt = this.ids.indexOf(id + 1) || 1\r\n    this.ids.splice(0, deleteCnt, 0)\r\n    this.runners.splice(0, deleteCnt, new SVG.FakeRunner())\r\n    return this\r\n  }\r\n}\r\n\r\nSVG.extend(SVG.Element, {\r\n  // this function searches for all runners on the element and deletes the ones\r\n  // which run before the current one. This is because absolute transformations\r\n  // overwfrite anything anyway so there is no need to waste time computing\r\n  // other runners\r\n  _clearTransformRunnersBefore: function (currentRunner) {\r\n    this._transformationRunners.clearBefore(currentRunner.id)\r\n  },\r\n\r\n  _currentTransform (current) {\r\n    return this._transformationRunners.runners\r\n      // we need the equal sign here to make sure, that also transformations\r\n      // on the same runner which execute before the current transformation are\r\n      // taken into account\r\n      .filter((runner) => runner.id <= current.id)\r\n      .map(getRunnerTransform)\r\n      .reduce(lmultiply, new SVG.Matrix())\r\n  },\r\n\r\n  addRunner: function (runner) {\r\n    this._transformationRunners.add(runner)\r\n\r\n    SVG.Animator.transform_frame(\r\n      mergeTransforms.bind(this), this._frameId\r\n    )\r\n  },\r\n\r\n  _prepareRunner: function () {\r\n    if (this._frameId == null) {\r\n      this._transformationRunners = new RunnerArray()\r\n        .add(new SVG.FakeRunner(new SVG.Matrix(this)))\r\n\r\n      this._frameId = SVG.Element.frameId++\r\n    }\r\n  }\r\n})\r\n\r\nSVG.Element.frameId = 0\r\n\r\nSVG.extend(SVG.Runner, {\r\n  attr: function (a, v) {\r\n    return this.styleAttr('attr', a, v)\r\n  },\r\n\r\n  // Add animatable styles\r\n  css: function (s, v) {\r\n    return this.styleAttr('css', s, v)\r\n  },\r\n\r\n  styleAttr (type, name, val) {\r\n    // apply attributes individually\r\n    if (typeof name === 'object') {\r\n      for (var key in val) {\r\n        this.styleAttr(type, key, val[key])\r\n      }\r\n    }\r\n\r\n    var morpher = new SVG.Morphable(this._stepper).to(val)\r\n\r\n    this.queue(function () {\r\n      morpher = morpher.from(this.element()[type](name))\r\n    }, function (pos) {\r\n      this.element()[type](name, morpher.at(pos))\r\n      return morpher.done()\r\n    })\r\n\r\n    return this\r\n  },\r\n\r\n  zoom: function (level, point) {\r\n    var morpher = new SVG.Morphable(this._stepper).to(new SVG.Number(level))\r\n\r\n    this.queue(function () {\r\n      morpher = morpher.from(this.zoom())\r\n    }, function (pos) {\r\n      this.element().zoom(morpher.at(pos), point)\r\n      return morpher.done()\r\n    })\r\n\r\n    return this\r\n  },\r\n\r\n  /**\r\n   ** absolute transformations\r\n   **/\r\n\r\n  //\r\n  // M v -----|-----(D M v = F v)------|----->  T v\r\n  //\r\n  // 1. define the final state (T) and decompose it (once)\r\n  //    t = [tx, ty, the, lam, sy, sx]\r\n  // 2. on every frame: pull the current state of all previous transforms\r\n  //    (M - m can change)\r\n  //   and then write this as m = [tx0, ty0, the0, lam0, sy0, sx0]\r\n  // 3. Find the interpolated matrix F(pos) = m + pos * (t - m)\r\n  //   - Note F(0) = M\r\n  //   - Note F(1) = T\r\n  // 4. Now you get the delta matrix as a result: D = F * inv(M)\r\n\r\n  transform: function (transforms, relative, affine) {\r\n    // If we have a declarative function, we should retarget it if possible\r\n    relative = transforms.relative || relative\r\n    if (this._isDeclarative && !relative && this._tryRetarget('transform', transforms)) {\r\n      return this\r\n    }\r\n\r\n    // Parse the parameters\r\n    var isMatrix = isMatrixLike(transforms)\r\n    affine = transforms.affine != null\r\n      ? transforms.affine\r\n      : (affine != null ? affine : !isMatrix)\r\n\r\n    // Create a morepher and set its type\r\n    const morpher = new SVG.Morphable()\r\n      .type(affine ? SVG.Morphable.TransformBag : SVG.Matrix)\r\n      .stepper(this._stepper)\r\n\r\n    let origin\r\n    let element\r\n    let current\r\n    let currentAngle\r\n    let startTransform\r\n\r\n    function setup () {\r\n      // make sure element and origin is defined\r\n      element = element || this.element()\r\n      origin = origin || getOrigin(transforms, element)\r\n\r\n      startTransform = new SVG.Matrix(relative ? undefined : element)\r\n\r\n      // add the runner to the element so it can merge transformations\r\n      element.addRunner(this)\r\n\r\n      // Deactivate all transforms that have run so far if we are absolute\r\n      if (!relative) {\r\n        element._clearTransformRunnersBefore(this)\r\n      }\r\n    }\r\n\r\n    function run (pos) {\r\n      // clear all other transforms before this in case something is saved\r\n      // on this runner. We are absolute. We dont need these!\r\n      if (!relative) this.clearTransform()\r\n\r\n      let {x, y} = new SVG.Point(origin).transform(element._currentTransform(this))\r\n\r\n      let target = new SVG.Matrix({...transforms, origin: [x, y]})\r\n      let start = this._isDeclarative && current\r\n        ? current\r\n        : startTransform\r\n\r\n      if (affine) {\r\n        target = target.decompose(x, y)\r\n        start = start.decompose(x, y)\r\n\r\n        // Get the current and target angle as it was set\r\n        const rTarget = target.rotate\r\n        const rCurrent = start.rotate\r\n\r\n        // Figure out the shortest path to rotate directly\r\n        const possibilities = [rTarget - 360, rTarget, rTarget + 360]\r\n        const distances = possibilities.map(a => Math.abs(a - rCurrent))\r\n        const shortest = Math.min(...distances)\r\n        const index = distances.indexOf(shortest)\r\n        target.rotate = possibilities[index]\r\n      }\r\n\r\n      if (relative) {\r\n        // we have to be careful here not to overwrite the rotation\r\n        // with the rotate method of SVG.Matrix\r\n        if (!isMatrix) {\r\n          target.rotate = transforms.rotate || 0\r\n        }\r\n        if (this._isDeclarative && currentAngle) {\r\n          start.rotate = currentAngle\r\n        }\r\n      }\r\n\r\n      morpher.from(start)\r\n      morpher.to(target)\r\n\r\n      let affineParameters = morpher.at(pos)\r\n      currentAngle = affineParameters.rotate\r\n      current = new SVG.Matrix(affineParameters)\r\n\r\n      this.addTransform(current)\r\n      return morpher.done()\r\n    }\r\n\r\n    function retarget (newTransforms) {\r\n      // only get a new origin if it changed since the last call\r\n      if (\r\n        (newTransforms.origin || 'center').toString() !==\r\n        (transforms.origin || 'center').toString()\r\n      ) {\r\n        origin = getOrigin(transforms, element)\r\n      }\r\n\r\n      // overwrite the old transformations with the new ones\r\n      transforms = {...newTransforms, origin}\r\n    }\r\n\r\n    this.queue(setup, run, retarget)\r\n    this._isDeclarative && this._rememberMorpher('transform', morpher)\r\n    return this\r\n  },\r\n\r\n  // Animatable x-axis\r\n  x: function (x, relative) {\r\n    return this._queueNumber('x', x)\r\n  },\r\n\r\n  // Animatable y-axis\r\n  y: function (y) {\r\n    return this._queueNumber('y', y)\r\n  },\r\n\r\n  dx: function (x) {\r\n    return this._queueNumberDelta('dx', x)\r\n  },\r\n\r\n  dy: function (y) {\r\n    return this._queueNumberDelta('dy', y)\r\n  },\r\n\r\n  _queueNumberDelta: function (method, to) {\r\n    to = new SVG.Number(to)\r\n\r\n    // Try to change the target if we have this method already registerd\r\n    if (this._tryRetargetDelta(method, to)) return this\r\n\r\n    // Make a morpher and queue the animation\r\n    var morpher = new SVG.Morphable(this._stepper).to(to)\r\n    this.queue(function () {\r\n      var from = this.element()[method]()\r\n      morpher.from(from)\r\n      morpher.to(from + to)\r\n    }, function (pos) {\r\n      this.element()[method](morpher.at(pos))\r\n      return morpher.done()\r\n    })\r\n\r\n    // Register the morpher so that if it is changed again, we can retarget it\r\n    this._rememberMorpher(method, morpher)\r\n    return this\r\n  },\r\n\r\n  _queueObject: function (method, to) {\r\n    // Try to change the target if we have this method already registerd\r\n    if (this._tryRetarget(method, to)) return this\r\n\r\n    // Make a morpher and queue the animation\r\n    var morpher = new SVG.Morphable(this._stepper).to(to)\r\n    this.queue(function () {\r\n      morpher.from(this.element()[method]())\r\n    }, function (pos) {\r\n      this.element()[method](morpher.at(pos))\r\n      return morpher.done()\r\n    })\r\n\r\n    // Register the morpher so that if it is changed again, we can retarget it\r\n    this._rememberMorpher(method, morpher)\r\n    return this\r\n  },\r\n\r\n  _queueNumber: function (method, value) {\r\n    return this._queueObject(method, new SVG.Number(value))\r\n  },\r\n\r\n  // Animatable center x-axis\r\n  cx: function (x) {\r\n    return this._queueNumber('cx', x)\r\n  },\r\n\r\n  // Animatable center y-axis\r\n  cy: function (y) {\r\n    return this._queueNumber('cy', y)\r\n  },\r\n\r\n  // Add animatable move\r\n  move: function (x, y) {\r\n    return this.x(x).y(y)\r\n  },\r\n\r\n  // Add animatable center\r\n  center: function (x, y) {\r\n    return this.cx(x).cy(y)\r\n  },\r\n\r\n  // Add animatable size\r\n  size: function (width, height) {\r\n    // animate bbox based size for all other elements\r\n    var box\r\n\r\n    if (!width || !height) {\r\n      box = this._element.bbox()\r\n    }\r\n\r\n    if (!width) {\r\n      width = box.width / box.height * height\r\n    }\r\n\r\n    if (!height) {\r\n      height = box.height / box.width * width\r\n    }\r\n\r\n    return this\r\n      .width(width)\r\n      .height(height)\r\n  },\r\n\r\n  // Add animatable width\r\n  width: function (width) {\r\n    return this._queueNumber('width', width)\r\n  },\r\n\r\n  // Add animatable height\r\n  height: function (height) {\r\n    return this._queueNumber('height', height)\r\n  },\r\n\r\n  // Add animatable plot\r\n  plot: function (a, b, c, d) {\r\n    // Lines can be plotted with 4 arguments\r\n    if (arguments.length === 4) {\r\n      return this.plot([a, b, c, d])\r\n    }\r\n\r\n    // FIXME: this needs to be rewritten such that the element is only accesed\r\n    // in the init function\r\n    return this._queueObject('plot', new this._element.MorphArray(a))\r\n\r\n    /*\r\n    var morpher = this._element.morphArray().to(a)\r\n\r\n    this.queue(function () {\r\n      morpher.from(this._element.array())\r\n    }, function (pos) {\r\n      this._element.plot(morpher.at(pos))\r\n    })\r\n\r\n    return this\r\n    */\r\n  },\r\n\r\n  // Add leading method\r\n  leading: function (value) {\r\n    return this._queueNumber('leading', value)\r\n  },\r\n\r\n  // Add animatable viewbox\r\n  viewbox: function (x, y, width, height) {\r\n    return this._queueObject('viewbox', new SVG.Box(x, y, width, height))\r\n  },\r\n\r\n  update: function (o) {\r\n    if (typeof o !== 'object') {\r\n      return this.update({\r\n        offset: arguments[0],\r\n        color: arguments[1],\r\n        opacity: arguments[2]\r\n      })\r\n    }\r\n\r\n    if (o.opacity != null) this.attr('stop-opacity', o.opacity)\r\n    if (o.color != null) this.attr('stop-color', o.color)\r\n    if (o.offset != null) this.attr('offset', o.offset)\r\n\r\n    return this\r\n  }\r\n})\r\n","\r\n// Must Change ....\r\nSVG.easing = {\r\n  '-': function (pos) { return pos },\r\n  '<>': function (pos) { return -Math.cos(pos * Math.PI) / 2 + 0.5 },\r\n  '>': function (pos) { return Math.sin(pos * Math.PI / 2) },\r\n  '<': function (pos) { return -Math.cos(pos * Math.PI / 2) + 1 }\r\n}\r\n\r\nvar time = window.performance || Date\r\n\r\nvar makeSchedule = function (runnerInfo) {\r\n  var start = runnerInfo.start\r\n  var duration = runnerInfo.runner.duration()\r\n  var end = start + duration\r\n  return {start: start, duration: duration, end: end, runner: runnerInfo.runner}\r\n}\r\n\r\nSVG.Timeline = SVG.invent({\r\n  inherit: SVG.EventTarget,\r\n\r\n  // Construct a new timeline on the given element\r\n  create: function () {\r\n    this._timeSource = function () {\r\n      return time.now()\r\n    }\r\n\r\n    this._dispatcher = document.createElement('div')\r\n\r\n    // Store the timing variables\r\n    this._startTime = 0\r\n    this._speed = 1.0\r\n\r\n    // Play control variables control how the animation proceeds\r\n    this._reverse = false\r\n    this._persist = 0\r\n\r\n    // Keep track of the running animations and their starting parameters\r\n    this._nextFrame = null\r\n    this._paused = false\r\n    this._runners = []\r\n    this._order = []\r\n    this._time = 0\r\n    this._lastSourceTime = 0\r\n    this._lastStepTime = 0\r\n  },\r\n\r\n  extend: {\r\n\r\n    getEventTarget () {\r\n      return this._dispatcher\r\n    },\r\n\r\n    /**\r\n     *\r\n     */\r\n\r\n    // schedules a runner on the timeline\r\n    schedule (runner, delay, when) {\r\n      if (runner == null) {\r\n        return this._runners.map(makeSchedule).sort(function (a, b) {\r\n          return (a.start - b.start) || (a.duration - b.duration)\r\n        })\r\n      }\r\n\r\n      if (!this.active()) {\r\n        this._step()\r\n        if (when == null) {\r\n          when = 'now'\r\n        }\r\n      }\r\n\r\n      // The start time for the next animation can either be given explicitly,\r\n      // derived from the current timeline time or it can be relative to the\r\n      // last start time to chain animations direclty\r\n      var absoluteStartTime = 0\r\n      delay = delay || 0\r\n\r\n      // Work out when to start the animation\r\n      if (when == null || when === 'last' || when === 'after') {\r\n        // Take the last time and increment\r\n        absoluteStartTime = this._startTime\r\n      } else if (when === 'absolute' || when === 'start') {\r\n        absoluteStartTime = delay\r\n        delay = 0\r\n      } else if (when === 'now') {\r\n        absoluteStartTime = this._time\r\n      } else if (when === 'relative') {\r\n        let runnerInfo = this._runners[runner.id]\r\n        if (runnerInfo) {\r\n          absoluteStartTime = runnerInfo.start + delay\r\n          delay = 0\r\n        }\r\n      } else {\r\n        throw new Error('Invalid value for the \"when\" parameter')\r\n      }\r\n\r\n      // Manage runner\r\n      runner.unschedule()\r\n      runner.timeline(this)\r\n      runner.time(-delay)\r\n\r\n      // Save startTime for next runner\r\n      this._startTime = absoluteStartTime + runner.duration() + delay\r\n\r\n      // Save runnerInfo\r\n      this._runners[runner.id] = {\r\n        persist: this.persist(),\r\n        runner: runner,\r\n        start: absoluteStartTime\r\n      }\r\n\r\n      // Save order and continue\r\n      this._order.push(runner.id)\r\n      this._continue()\r\n      return this\r\n    },\r\n\r\n    // Remove the runner from this timeline\r\n    unschedule (runner) {\r\n      var index = this._order.indexOf(runner.id)\r\n      if (index < 0) return this\r\n\r\n      delete this._runners[runner.id]\r\n      this._order.splice(index, 1)\r\n      runner.timeline(null)\r\n      return this\r\n    },\r\n\r\n    play () {\r\n      // Now make sure we are not paused and continue the animation\r\n      this._paused = false\r\n      return this._continue()\r\n    },\r\n\r\n    pause () {\r\n      // Cancel the next animation frame and pause\r\n      this._nextFrame = null\r\n      this._paused = true\r\n      return this\r\n    },\r\n\r\n    stop () {\r\n      // Cancel the next animation frame and go to start\r\n      this.seek(-this._time)\r\n      return this.pause()\r\n    },\r\n\r\n    finish () {\r\n      this.seek(Infinity)\r\n      return this.pause()\r\n    },\r\n\r\n    speed (speed) {\r\n      if (speed == null) return this._speed\r\n      this._speed = speed\r\n      return this\r\n    },\r\n\r\n    reverse (yes) {\r\n      var currentSpeed = this.speed()\r\n      if (yes == null) return this.speed(-currentSpeed)\r\n\r\n      var positive = Math.abs(currentSpeed)\r\n      return this.speed(yes ? positive : -positive)\r\n    },\r\n\r\n    seek (dt) {\r\n      this._time += dt\r\n      return this._continue()\r\n    },\r\n\r\n    time (time) {\r\n      if (time == null) return this._time\r\n      this._time = time\r\n      return this\r\n    },\r\n\r\n    persist (dtOrForever) {\r\n      if (dtOrForever == null) return this._persist\r\n      this._persist = dtOrForever\r\n      return this\r\n    },\r\n\r\n    source (fn) {\r\n      if (fn == null) return this._timeSource\r\n      this._timeSource = fn\r\n      return this\r\n    },\r\n\r\n    _step () {\r\n      // If the timeline is paused, just do nothing\r\n      if (this._paused) return\r\n\r\n      // Get the time delta from the last time and update the time\r\n      // TODO: Deal with window.blur window.focus to pause animations\r\n      var time = this._timeSource()\r\n      var dtSource = time - this._lastSourceTime\r\n      var dtTime = this._speed * dtSource + (this._time - this._lastStepTime)\r\n      this._lastSourceTime = time\r\n\r\n      // Update the time\r\n      this._time += dtTime\r\n      this._lastStepTime = this._time\r\n      // this.fire('time', this._time)\r\n\r\n      // Run all of the runners directly\r\n      var runnersLeft = false\r\n      for (var i = 0, len = this._order.length; i < len; i++) {\r\n        // Get and run the current runner and ignore it if its inactive\r\n        var runnerInfo = this._runners[this._order[i]]\r\n        var runner = runnerInfo.runner\r\n        let dt = dtTime\r\n\r\n        // Make sure that we give the actual difference\r\n        // between runner start time and now\r\n        let dtToStart = this._time - runnerInfo.start\r\n\r\n        // Dont run runner if not started yet\r\n        if (dtToStart < 0) {\r\n          runnersLeft = true\r\n          continue\r\n        } else if (dtToStart < dt) {\r\n          // Adjust dt to make sure that animation is on point\r\n          dt = dtToStart\r\n        }\r\n\r\n        if (!runner.active()) continue\r\n\r\n        // If this runner is still going, signal that we need another animation\r\n        // frame, otherwise, remove the completed runner\r\n        var finished = runner.step(dt).done\r\n        if (!finished) {\r\n          runnersLeft = true\r\n          // continue\r\n        } else if (runnerInfo.persist !== true) {\r\n          // runner is finished. And runner might get removed\r\n\r\n          // TODO: Figure out end time of runner\r\n          var endTime = runner.duration() - runner.time() + this._time\r\n\r\n          if (endTime + this._persist < this._time) {\r\n            // Delete runner and correct index\r\n            delete this._runners[this._order[i]]\r\n            this._order.splice(i--, 1) && --len\r\n            runner.timeline(null)\r\n          }\r\n        }\r\n      }\r\n\r\n      // Get the next animation frame to keep the simulation going\r\n      if (runnersLeft) {\r\n        this._nextFrame = SVG.Animator.frame(this._step.bind(this))\r\n      } else {\r\n        this._nextFrame = null\r\n      }\r\n      return this\r\n    },\r\n\r\n    // Checks if we are running and continues the animation\r\n    _continue () {\r\n      if (this._paused) return this\r\n      if (!this._nextFrame) {\r\n        this._nextFrame = SVG.Animator.frame(this._step.bind(this))\r\n      }\r\n      return this\r\n    },\r\n\r\n    active () {\r\n      return !!this._nextFrame\r\n    }\r\n  },\r\n\r\n  // These methods will be added to all SVG.Element objects\r\n  parent: SVG.Element,\r\n  construct: {\r\n    timeline: function () {\r\n      this._timeline = (this._timeline || new SVG.Timeline())\r\n      return this._timeline\r\n    }\r\n  }\r\n})\r\n","\r\n// c = {\r\n//   finished: Whether or not we are finished\r\n// }\r\n\r\n/***\r\nBase Class\r\n==========\r\nThe base stepper class that will be\r\n***/\r\n\r\nfunction makeSetterGetter (k, f) {\r\n  return function (v) {\r\n    if (v == null) return this[v]\r\n    this[k] = v\r\n    if (f) f.call(this)\r\n    return this\r\n  }\r\n}\r\n\r\nSVG.Stepper = SVG.invent({\r\n  create: function () {}\r\n})\r\n\r\n/***\r\nEasing Functions\r\n================\r\n***/\r\n\r\nSVG.Ease = SVG.invent({\r\n  inherit: SVG.Stepper,\r\n\r\n  create: function (fn) {\r\n    SVG.Stepper.call(this, fn)\r\n\r\n    this.ease = SVG.easing[fn || SVG.defaults.timeline.ease] || fn\r\n  },\r\n\r\n  extend: {\r\n\r\n    step: function (from, to, pos) {\r\n      if (typeof from !== 'number') {\r\n        return pos < 1 ? from : to\r\n      }\r\n      return from + (to - from) * this.ease(pos)\r\n    },\r\n\r\n    done: function (dt, c) {\r\n      return false\r\n    }\r\n  }\r\n})\r\n\r\nSVG.easing = {\r\n  '-': function (pos) { return pos },\r\n  '<>': function (pos) { return -Math.cos(pos * Math.PI) / 2 + 0.5 },\r\n  '>': function (pos) { return Math.sin(pos * Math.PI / 2) },\r\n  '<': function (pos) { return -Math.cos(pos * Math.PI / 2) + 1 },\r\n  bezier: function (t0, x0, t1, x1) {\r\n    return function (t) {\r\n      // TODO: FINISH\r\n    }\r\n  }\r\n}\r\n\r\n/***\r\nController Types\r\n================\r\n***/\r\n\r\nSVG.Controller = SVG.invent({\r\n  inherit: SVG.Stepper,\r\n\r\n  create: function (fn) {\r\n    SVG.Stepper.call(this, fn)\r\n    this.stepper = fn\r\n  },\r\n\r\n  extend: {\r\n\r\n    step: function (current, target, dt, c) {\r\n      return this.stepper(current, target, dt, c)\r\n    },\r\n\r\n    done: function (c) {\r\n      return c.done\r\n    }\r\n  }\r\n})\r\n\r\nfunction recalculate () {\r\n  // Apply the default parameters\r\n  var duration = (this._duration || 500) / 1000\r\n  var overshoot = this._overshoot || 0\r\n\r\n  // Calculate the PID natural response\r\n  var eps = 1e-10\r\n  var pi = Math.PI\r\n  var os = Math.log(overshoot / 100 + eps)\r\n  var zeta = -os / Math.sqrt(pi * pi + os * os)\r\n  var wn = 3.9 / (zeta * duration)\r\n\r\n  // Calculate the Spring values\r\n  this.d = 2 * zeta * wn\r\n  this.k = wn * wn\r\n}\r\n\r\nSVG.Spring = SVG.invent({\r\n  inherit: SVG.Controller,\r\n\r\n  create: function (duration, overshoot) {\r\n    this.duration(duration || 500)\r\n      .overshoot(overshoot || 0)\r\n  },\r\n\r\n  extend: {\r\n    step: function (current, target, dt, c) {\r\n      if (typeof current === 'string') return current\r\n      c.done = dt === Infinity\r\n      if (dt === Infinity) return target\r\n      if (dt === 0) return current\r\n\r\n      if (dt > 100) dt = 16\r\n\r\n      dt /= 1000\r\n\r\n      // Get the previous velocity\r\n      var velocity = c.velocity || 0\r\n\r\n      // Apply the control to get the new position and store it\r\n      var acceleration = -this.d * velocity - this.k * (current - target)\r\n      var newPosition = current +\r\n        velocity * dt +\r\n        acceleration * dt * dt / 2\r\n\r\n      // Store the velocity\r\n      c.velocity = velocity + acceleration * dt\r\n\r\n      // Figure out if we have converged, and if so, pass the value\r\n      c.done = Math.abs(target - newPosition) + Math.abs(velocity) < 0.002\r\n      return c.done ? target : newPosition\r\n    },\r\n\r\n    duration: makeSetterGetter('_duration', recalculate),\r\n    overshoot: makeSetterGetter('_overshoot', recalculate)\r\n  }\r\n})\r\n\r\nSVG.PID = SVG.invent({\r\n  inherit: SVG.Controller,\r\n\r\n  create: function (p, i, d, windup) {\r\n    SVG.Controller.call(this)\r\n\r\n    p = p == null ? 0.1 : p\r\n    i = i == null ? 0.01 : i\r\n    d = d == null ? 0 : d\r\n    windup = windup == null ? 1000 : windup\r\n    this.p(p).i(i).d(d).windup(windup)\r\n  },\r\n\r\n  extend: {\r\n    step: function (current, target, dt, c) {\r\n      if (typeof current === 'string') return current\r\n      c.done = dt === Infinity\r\n\r\n      if (dt === Infinity) return target\r\n      if (dt === 0) return current\r\n\r\n      var p = target - current\r\n      var i = (c.integral || 0) + p * dt\r\n      var d = (p - (c.error || 0)) / dt\r\n      var windup = this.windup\r\n\r\n      // antiwindup\r\n      if (windup !== false) {\r\n        i = Math.max(-windup, Math.min(i, windup))\r\n      }\r\n\r\n      c.error = p\r\n      c.integral = i\r\n\r\n      c.done = Math.abs(p) < 0.001\r\n\r\n      return c.done ? target : current + (this.P * p + this.I * i + this.D * d)\r\n    },\r\n\r\n    windup: makeSetterGetter('windup'),\r\n    p: makeSetterGetter('P'),\r\n    i: makeSetterGetter('I'),\r\n    d: makeSetterGetter('D')\r\n  }\r\n})\r\n"]}
\ No newline at end of file
diff --git a/dist/svg.min.js b/dist/svg.min.js
new file mode 100644 (file)
index 0000000..0b5e35c
--- /dev/null
@@ -0,0 +1,3 @@
+/*! svg.js v3.0.0 MIT*/;!function(t,e){"function"==typeof define&&define.amd?define(function(){return e(t,t.document)}):"object"==typeof exports?module.exports=t.document?e(t,t.document):function(t){return e(t,t.document)}:t.SVG=e(t,t.document)}("undefined"!=typeof window?window:this,function(t,e){function n(t){return s(t)||r(t)||i()}function i(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function r(t){if(Symbol.iterator in Object(t)||"[object Arguments]"===Object.prototype.toString.call(t))return Array.from(t)}function s(t){if(Array.isArray(t)){for(var e=0,n=new Array(t.length);e<t.length;e++)n[e]=t[e];return n}}function o(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function a(t,e,n){return e&&o(t.prototype,e),n&&o(t,n),t}function h(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{},i=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(i=i.concat(Object.getOwnPropertySymbols(n).filter(function(t){return Object.getOwnPropertyDescriptor(n,t).enumerable}))),i.forEach(function(e){l(t,e,n[e])})}return t}function l(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function c(t){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function f(t,n){if(t instanceof q.Element)return t;if("object"===c(t))return q.adopt(t);if(null==t)return new q.Doc;if("string"==typeof t&&"<"!==t.charAt(0))return q.adopt(e.querySelector(t));var i=q.create("svg");return i.innerHTML=t,t=q.adopt(i.firstElementChild)}function d(t){return!(t.w||t.h||t.x||t.y)}function p(t){return(e.documentElement.contains||function(t){for(;t.parentNode;)t=t.parentNode;return t===e}).call(e.documentElement,t)}function m(t,e,n,i){return n+i.replace(q.regex.dots," .")}function v(t){for(var e=t.slice(0),n=e.length;n--;)Array.isArray(e[n])&&(e[n]=v(e[n]));return e}function y(t,e){return t instanceof e}function x(t,e){return(t.matches||t.matchesSelector||t.msMatchesSelector||t.mozMatchesSelector||t.webkitMatchesSelector||t.oMatchesSelector).call(t,e)}function g(t){return t.toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()})}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}function b(t){return 4===t.length?["#",t.substring(1,2),t.substring(1,2),t.substring(2,3),t.substring(2,3),t.substring(3,4),t.substring(3,4)].join(""):t}function _(t){var e=t.toString(16);return 1===e.length?"0"+e:e}function A(t,e,n){if(null==e||null==n){var i=t.bbox();null==e?e=i.width/i.height*n:null==n&&(n=i.height/i.width*e)}return{width:e,height:n}}function M(t){return{a:t[0],b:t[1],c:t[2],d:t[3],e:t[4],f:t[5]}}function P(t){for(var e=0,n=t.length,i="";e<n;e++)i+=t[e][0],null!=t[e][1]&&(i+=t[e][1],null!=t[e][2]&&(i+=" ",i+=t[e][2],null!=t[e][3]&&(i+=" ",i+=t[e][3],i+=" ",i+=t[e][4],null!=t[e][5]&&(i+=" ",i+=t[e][5],i+=" ",i+=t[e][6],null!=t[e][7]&&(i+=" ",i+=t[e][7])))));return i+" "}function N(t){for(var e=t.children.length-1;e>=0;e--)N(t.children[e]);return t.id?q.adopt(t).id(q.eid(t.nodeName)):q.adopt(t)}function E(t){return null==t.x&&(t.x=0,t.y=0,t.width=0,t.height=0),t.w=t.width,t.h=t.height,t.x2=t.x+t.width,t.y2=t.y+t.height,t.cx=t.x+t.width/2,t.cy=t.y+t.height/2,t}function O(t){var e=(t||"").toString().match(q.regex.reference);if(e)return e[1]}function T(t,e,n){return Math.abs(e-t)<(n||1e-6)}function k(t){return null!=t.a||null!=t.b||null!=t.c||null!=t.d||null!=t.e||null!=t.f}function C(t){var e="both"===t.flip||!0===t.flip,n=t.flip&&(e||"x"===t.flip)?-1:1,i=t.flip&&(e||"y"===t.flip)?-1:1,r=t.skew&&t.skew.length?t.skew[0]:isFinite(t.skew)?t.skew:isFinite(t.skewX)?t.skewX:0,s=t.skew&&t.skew.length?t.skew[1]:isFinite(t.skew)?t.skew:isFinite(t.skewY)?t.skewY:0,o=t.scale&&t.scale.length?t.scale[0]*n:isFinite(t.scale)?t.scale*n:isFinite(t.scaleX)?t.scaleX*n:n,a=t.scale&&t.scale.length?t.scale[1]*i:isFinite(t.scale)?t.scale*i:isFinite(t.scaleY)?t.scaleY*i:i,h=t.shear||0,u=t.rotate||t.theta||0,l=new q.Point(t.origin||t.around||t.ox||t.originX,t.oy||t.originY),c=l.x,f=l.y,d=new q.Point(t.position||t.px||t.positionX,t.py||t.positionY),p=d.x,m=d.y,v=new q.Point(t.translate||t.tx||t.translateX,t.ty||t.translateY),y=v.x,x=v.y,g=new q.Point(t.relative||t.rx||t.relativeX,t.ry||t.relativeY);return{scaleX:o,scaleY:a,skewX:r,skewY:s,shear:h,theta:u,rx:g.x,ry:g.y,tx:y,ty:x,ox:c,oy:f,px:p,py:m}}function S(t,e,n){var i=t.a*e.a+t.c*e.b,r=t.b*e.a+t.d*e.b,s=t.a*e.c+t.c*e.d,o=t.b*e.c+t.d*e.d,a=t.e+t.a*e.e+t.c*e.f,h=t.f+t.b*e.e+t.d*e.f;return n.a=i,n.b=r,n.c=s,n.d=o,n.e=a,n.f=h,n}function j(t,e){var n,i,r=t.origin;if("string"==typeof r||null==r){var s=(r||"center").toLowerCase().trim(),o=e.bbox(),a=o.height,h=o.width,u=o.x,l=o.y,c=s.includes("left")?u:s.includes("right")?u+h:u+h/2,f=s.includes("top")?l:s.includes("bottom")?l+a:l+a/2;n=null!=t.ox?t.ox:c,i=null!=t.oy?t.oy:f}else n=r[0],i=r[1];return[n,i]}function D(){var t=this._transformationRunners.runners,e=t.map(V).reduce(G,new q.Matrix);this.transform(e),this._transformationRunners.merge(),1===this._transformationRunners.length()&&(this._frameId=null)}function R(t,e){return function(n){return null==n?this[n]:(this[t]=n,e&&e.call(this),this)}}function I(){var t=(this._duration||500)/1e3,e=this._overshoot||0,n=Math.PI,i=Math.log(e/100+1e-10),r=-i/Math.sqrt(n*n+i*i),s=3.9/(r*t);this.d=2*r*s,this.k=s*s}if(!e.createElementNS||!e.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)return{supported:!1};var q=t.SVG=function(t){if(q.supported)return t=f(t)};q.supported=!0,q.ns="http://www.w3.org/2000/svg",q.xmlns="http://www.w3.org/2000/xmlns/",q.xlink="http://www.w3.org/1999/xlink",q.svgjs="http://svgjs.com/svgjs",q.did=1e3,q.eid=function(t){return"Svgjs"+w(t)+q.did++},q.create=function(t){return e.createElementNS(this.ns,t)},q.extend=function(t,e){var n,i;for(t=Array.isArray(t)?t:[t],i=t.length-1;i>=0;i--)if(t[i])for(n in e)t[i].prototype[n]=e[n]},q.invent=function(t){var e="function"==typeof t.create?t.create:function(e){t.inherit.call(this,e||q.create(t.create))};return t.inherit&&(e.prototype=new t.inherit,e.prototype.constructor=e),t.extend&&q.extend(e,t.extend),t.construct&&q.extend(t.parent||q.Container,t.construct),e},q.adopt=function(e){if(!e)return null;if(e.instance instanceof q.Element)return e.instance;if(!(e instanceof t.SVGElement))return new q.HtmlNode(e);return"svg"===e.nodeName?new q.Doc(e):"linearGradient"===e.nodeName||"radialGradient"===e.nodeName?new q.Gradient(e):q[w(e.nodeName)]?new(q[w(e.nodeName)])(e):new q.Parent(e)},q.regex={numberAndUnit:/^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i,hex:/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,rgb:/rgb\((\d+),(\d+),(\d+)\)/,reference:/#([a-z0-9\-_]+)/i,transforms:/\)\s*,?\s*/,whitespace:/\s/g,isHex:/^#[a-f0-9]{3,6}$/i,isRgb:/^rgb\(/,isCss:/[^:]+:[^;]+;?/,isBlank:/^(\s+)?$/,isNumber:/^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,isPercent:/^-?[\d.]+%$/,isImage:/\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i,delimiter:/[\s,]+/,hyphen:/([^e])-/gi,pathLetters:/[MLHVCSQTAZ]/gi,isPathLetter:/[MLHVCSQTAZ]/i,numbersWithDots:/((\d?\.\d+(?:e[+-]?\d+)?)((?:\.\d+(?:e[+-]?\d+)?)+))+/gi,dots:/\./g},q.utils={map:function(t,e){var n,i=t.length,r=[];for(n=0;n<i;n++)r.push(e(t[n]));return r},filter:function(t,e){var n,i=t.length,r=[];for(n=0;n<i;n++)e(t[n])&&r.push(t[n]);return r},radians:function(t){return t%360*Math.PI/180},degrees:function(t){return 180*t/Math.PI%360},filterSVGElements:function(e){return this.filter(e,function(e){return e instanceof t.SVGElement})}},q.void=function(){},q.defaults={timeline:{duration:400,ease:">",delay:0},attrs:{"fill-opacity":1,"stroke-opacity":1,"stroke-width":0,"stroke-linejoin":"miter","stroke-linecap":"butt",fill:"#000000",stroke:"#000000",opacity:1,x:0,y:0,cx:0,cy:0,width:0,height:0,r:0,rx:0,ry:0,offset:0,"stop-opacity":1,"stop-color":"#000000","font-size":16,"font-family":"Helvetica, Arial, sans-serif","text-anchor":"start"}},q.Queue=q.invent({create:function(){this._first=null,this._last=null},extend:{push:function(t){var e=t.next?t:{value:t,next:null,prev:null};return this._last?(e.prev=this._last,this._last.next=e,this._last=e):(this._last=e,this._first=e),e},shift:function(){var t=this._first;return t?(this._first=t.next,this._first&&(this._first.prev=null),this._last=this._first?this._last:null,t.value):null},first:function(){return this._first&&this._first.value},last:function(){return this._last&&this._last.value},remove:function(t){t.prev&&(t.prev.next=t.next),t.next&&(t.next.prev=t.prev),t===this._last&&(this._last=t.prev),t===this._first&&(this._first=t.next),t.prev=null,t.next=null}}}),q.Color=function(t,e,n){var i;this.r=0,this.g=0,this.b=0,t&&("string"==typeof t?q.regex.isRgb.test(t)?(i=q.regex.rgb.exec(t.replace(q.regex.whitespace,"")),this.r=parseInt(i[1]),this.g=parseInt(i[2]),this.b=parseInt(i[3])):q.regex.isHex.test(t)&&(i=q.regex.hex.exec(b(t)),this.r=parseInt(i[1],16),this.g=parseInt(i[2],16),this.b=parseInt(i[3],16)):Array.isArray(t)?(this.r=t[0],this.g=t[1],this.b=t[2]):"object"===c(t)?(this.r=t.r,this.g=t.g,this.b=t.b):3===arguments.length&&(this.r=t,this.g=e,this.b=n))},q.extend(q.Color,{toString:function(){return this.toHex()},toArray:function(){return[this.r,this.g,this.b]},fromArray:function(t){return new q.Color(t)},toHex:function(){return"#"+_(Math.round(this.r))+_(Math.round(this.g))+_(Math.round(this.b))},toRgb:function(){return"rgb("+[this.r,this.g,this.b].join()+")"},brightness:function(){return this.r/255*.3+this.g/255*.59+this.b/255*.11},morph:function(t){return this.destination=new q.Color(t),this},at:function(t){return this.destination?(t=t<0?0:t>1?1:t,new q.Color({r:~~(this.r+(this.destination.r-this.r)*t),g:~~(this.g+(this.destination.g-this.g)*t),b:~~(this.b+(this.destination.b-this.b)*t)})):this}}),q.Color.test=function(t){return t+="",q.regex.isHex.test(t)||q.regex.isRgb.test(t)},q.Color.isRgb=function(t){return t&&"number"==typeof t.r&&"number"==typeof t.g&&"number"==typeof t.b},q.Color.isColor=function(t){return q.Color.isRgb(t)||q.Color.test(t)},q.Array=function(t,e){t=(t||[]).valueOf(),0===t.length&&e&&(t=e.valueOf()),this.value=this.parse(t)},q.extend(q.Array,{morph:function(t){if(this.destination=this.parse(t),this.value.length!==this.destination.length){for(var e=this.value[this.value.length-1],n=this.destination[this.destination.length-1];this.value.length>this.destination.length;)this.destination.push(n);for(;this.value.length<this.destination.length;)this.value.push(e)}return this},settle:function(){for(var t=0,e=this.value.length,n=[];t<e;t++)-1===n.indexOf(this.value[t])&&n.push(this.value[t]);return this.value=n,n},at:function(t){if(!this.destination)return this;for(var e=0,n=this.value.length,i=[];e<n;e++)i.push(this.value[e]+(this.destination[e]-this.value[e])*t);return new q.Array(i)},toArray:function(){return this.value},toString:function(){return this.value.join(" ")},valueOf:function(){return this.value},parse:function(t){return t=t.valueOf(),Array.isArray(t)?t:t.trim().split(q.regex.delimiter).map(parseFloat)},reverse:function(){return this.value.reverse(),this},clone:function(){var t=new this.constructor;return t.value=v(this.value),t}}),q.PointArray=function(t,e){q.Array.call(this,t,e||[[0,0]])},q.PointArray.prototype=new q.Array,q.PointArray.prototype.constructor=q.PointArray,q.extend(q.PointArray,{toString:function(){for(var t=0,e=this.value.length,n=[];t<e;t++)n.push(this.value[t].join(","));return n.join(" ")},toArray:function(){return this.value.reduce(function(t,e){return[].concat.call(t,e)},[])},toLine:function(){return{x1:this.value[0][0],y1:this.value[0][1],x2:this.value[1][0],y2:this.value[1][1]}},at:function(t){if(!this.destination)return this;for(var e=0,n=this.value.length,i=[];e<n;e++)i.push([this.value[e][0]+(this.destination[e][0]-this.value[e][0])*t,this.value[e][1]+(this.destination[e][1]-this.value[e][1])*t]);return new q.PointArray(i)},parse:function(t){var e=[];if(t=t.valueOf(),Array.isArray(t)){if(Array.isArray(t[0]))return t}else t=t.trim().split(q.regex.delimiter).map(parseFloat);t.length%2!=0&&t.pop();for(var n=0,i=t.length;n<i;n+=2)e.push([t[n],t[n+1]]);return e},move:function(t,e){var n=this.bbox();if(t-=n.x,e-=n.y,!isNaN(t)&&!isNaN(e))for(var i=this.value.length-1;i>=0;i--)this.value[i]=[this.value[i][0]+t,this.value[i][1]+e];return this},size:function(t,e){var n,i=this.bbox();for(n=this.value.length-1;n>=0;n--)i.width&&(this.value[n][0]=(this.value[n][0]-i.x)*t/i.width+i.x),i.height&&(this.value[n][1]=(this.value[n][1]-i.y)*e/i.height+i.y);return this},bbox:function(){var t=-1/0,e=-1/0,n=1/0,i=1/0;return this.value.forEach(function(r){t=Math.max(r[0],t),e=Math.max(r[1],e),n=Math.min(r[0],n),i=Math.min(r[1],i)}),{x:n,y:i,width:t-n,height:e-i}}});for(var B={M:function(t,e,n){return e.x=n.x=t[0],e.y=n.y=t[1],["M",e.x,e.y]},L:function(t,e){return e.x=t[0],e.y=t[1],["L",t[0],t[1]]},H:function(t,e){return e.x=t[0],["H",t[0]]},V:function(t,e){return e.y=t[0],["V",t[0]]},C:function(t,e){return e.x=t[4],e.y=t[5],["C",t[0],t[1],t[2],t[3],t[4],t[5]]},S:function(t,e){return e.x=t[2],e.y=t[3],["S",t[0],t[1],t[2],t[3]]},Q:function(t,e){return e.x=t[2],e.y=t[3],["Q",t[0],t[1],t[2],t[3]]},T:function(t,e){return e.x=t[0],e.y=t[1],["T",t[0],t[1]]},Z:function(t,e,n){return e.x=n.x,e.y=n.y,["Z"]},A:function(t,e){return e.x=t[5],e.y=t[6],["A",t[0],t[1],t[2],t[3],t[4],t[5],t[6]]}},L="mlhvqtcsaz".split(""),F=0,z=L.length;F<z;++F)B[L[F]]=function(t){return function(e,n,i){if("H"===t)e[0]=e[0]+n.x;else if("V"===t)e[0]=e[0]+n.y;else if("A"===t)e[5]=e[5]+n.x,e[6]=e[6]+n.y;else for(var r=0,s=e.length;r<s;++r)e[r]=e[r]+(r%2?n.y:n.x);return B[t](e,n,i)}}(L[F].toUpperCase());q.PathArray=function(t,e){q.Array.call(this,t,e||[["M",0,0]])},q.PathArray.prototype=new q.Array,q.PathArray.prototype.constructor=q.PathArray,q.extend(q.PathArray,{toString:function(){return P(this.value)},toArray:function(){return this.value.reduce(function(t,e){return[].concat.call(t,e)},[])},move:function(t,e){var n=this.bbox();if(t-=n.x,e-=n.y,!isNaN(t)&&!isNaN(e))for(var i,r=this.value.length-1;r>=0;r--)i=this.value[r][0],"M"===i||"L"===i||"T"===i?(this.value[r][1]+=t,this.value[r][2]+=e):"H"===i?this.value[r][1]+=t:"V"===i?this.value[r][1]+=e:"C"===i||"S"===i||"Q"===i?(this.value[r][1]+=t,this.value[r][2]+=e,this.value[r][3]+=t,this.value[r][4]+=e,"C"===i&&(this.value[r][5]+=t,this.value[r][6]+=e)):"A"===i&&(this.value[r][6]+=t,this.value[r][7]+=e);return this},size:function(t,e){var n,i,r=this.bbox();for(n=this.value.length-1;n>=0;n--)i=this.value[n][0],"M"===i||"L"===i||"T"===i?(this.value[n][1]=(this.value[n][1]-r.x)*t/r.width+r.x,this.value[n][2]=(this.value[n][2]-r.y)*e/r.height+r.y):"H"===i?this.value[n][1]=(this.value[n][1]-r.x)*t/r.width+r.x:"V"===i?this.value[n][1]=(this.value[n][1]-r.y)*e/r.height+r.y:"C"===i||"S"===i||"Q"===i?(this.value[n][1]=(this.value[n][1]-r.x)*t/r.width+r.x,this.value[n][2]=(this.value[n][2]-r.y)*e/r.height+r.y,this.value[n][3]=(this.value[n][3]-r.x)*t/r.width+r.x,this.value[n][4]=(this.value[n][4]-r.y)*e/r.height+r.y,"C"===i&&(this.value[n][5]=(this.value[n][5]-r.x)*t/r.width+r.x,this.value[n][6]=(this.value[n][6]-r.y)*e/r.height+r.y)):"A"===i&&(this.value[n][1]=this.value[n][1]*t/r.width,this.value[n][2]=this.value[n][2]*e/r.height,this.value[n][6]=(this.value[n][6]-r.x)*t/r.width+r.x,this.value[n][7]=(this.value[n][7]-r.y)*e/r.height+r.y);return this},equalCommands:function(t){var e,n,i;for(t=new q.PathArray(t),i=this.value.length===t.value.length,e=0,n=this.value.length;i&&e<n;e++)i=this.value[e][0]===t.value[e][0];return i},morph:function(t){return t=new q.PathArray(t),this.equalCommands(t)?this.destination=t:this.destination=null,this},at:function(t){if(!this.destination)return this;var e,n,i,r,s=this.value,o=this.destination.value,a=[],h=new q.PathArray;for(e=0,n=s.length;e<n;e++){for(a[e]=[s[e][0]],i=1,r=s[e].length;i<r;i++)a[e][i]=s[e][i]+(o[e][i]-s[e][i])*t;"A"===a[e][0]&&(a[e][4]=+(0!==a[e][4]),a[e][5]=+(0!==a[e][5]))}return h.value=a,h},parse:function(t){if(t instanceof q.PathArray)return t.valueOf();var e,n={M:2,L:2,H:1,V:1,C:6,S:4,Q:4,T:2,A:7,Z:0};t="string"==typeof t?t.replace(q.regex.numbersWithDots,m).replace(q.regex.pathLetters," $& ").replace(q.regex.hyphen,"$1 -").trim().split(q.regex.delimiter):t.reduce(function(t,e){return[].concat.call(t,e)},[]);var i=[],r=new q.Point,s=new q.Point,o=0,a=t.length;do{q.regex.isPathLetter.test(t[o])?(e=t[o],++o):"M"===e?e="L":"m"===e&&(e="l"),i.push(B[e].call(null,t.slice(o,o+=n[e.toUpperCase()]).map(parseFloat),r,s))}while(a>o);return i},bbox:function(){return q.parser().path.setAttribute("d",this.toString()),q.parser.nodes.path.getBBox()}}),q.Number=q.invent({create:function(t,e){e=Array.isArray(t)?t[1]:e,t=Array.isArray(t)?t[0]:t,this.value=0,this.unit=e||"","number"==typeof t?this.value=isNaN(t)?0:isFinite(t)?t:t<0?-3.4e38:3.4e38:"string"==typeof t?(e=t.match(q.regex.numberAndUnit))&&(this.value=parseFloat(e[1]),"%"===e[5]?this.value/=100:"s"===e[5]&&(this.value*=1e3),this.unit=e[5]):t instanceof q.Number&&(this.value=t.valueOf(),this.unit=t.unit)},extend:{toString:function(){return("%"===this.unit?~~(1e8*this.value)/1e6:"s"===this.unit?this.value/1e3:this.value)+this.unit},toJSON:function(){return this.toString()},toArray:function(){return[this.value,this.unit]},valueOf:function(){return this.value},plus:function(t){return t=new q.Number(t),new q.Number(this+t,this.unit||t.unit)},minus:function(t){return t=new q.Number(t),new q.Number(this-t,this.unit||t.unit)},times:function(t){return t=new q.Number(t),new q.Number(this*t,this.unit||t.unit)},divide:function(t){return t=new q.Number(t),new q.Number(this/t,this.unit||t.unit)},to:function(t){var e=new q.Number(this);return"string"==typeof t&&(e.unit=t),e},morph:function(t){return this.destination=new q.Number(t),t.relative&&(this.destination.value+=this.value),this},at:function(t){return this.destination?new q.Number(this.destination).minus(this).times(t).plus(this):this}}}),q.EventTarget=q.invent({create:function(){},extend:{on:function(t,e,n,i){return q.on(this,t,e,n,i),this},off:function(t,e){return q.off(this,t,e),this},dispatch:function(t,e){return q.dispatch(this,t,e)},fire:function(t,e){return this.dispatch(t,e),this}}}),q.HtmlNode=q.invent({inherit:q.EventTarget,create:function(t){this.node=t},extend:{add:function(t,e){return t=f(t),t.node!==this.node.children[e]&&this.node.insertBefore(t.node,this.node.children[e]||null),this},put:function(t,e){return this.add(t,e),t},getEventTarget:function(){return this.node}}}),q.Element=q.invent({inherit:q.EventTarget,create:function(t){this.events={},this.dom={},this.node=t,this.node&&(this.type=t.nodeName,this.node.instance=this,this.events=t.events||{},t.hasAttribute("svgjs:data")&&this.setData(JSON.parse(t.getAttribute("svgjs:data"))||{}))},extend:{x:function(t){return this.attr("x",t)},y:function(t){return this.attr("y",t)},cx:function(t){return null==t?this.x()+this.width()/2:this.x(t-this.width()/2)},cy:function(t){return null==t?this.y()+this.height()/2:this.y(t-this.height()/2)},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},width:function(t){return this.attr("width",t)},height:function(t){return this.attr("height",t)},size:function(t,e){var n=A(this,t,e);return this.width(new q.Number(n.width)).height(new q.Number(n.height))},clone:function(t){this.writeDataToDom();var e=N(this.node.cloneNode(!0));return t?t.add(e):this.after(e),e},remove:function(){return this.parent()&&this.parent().removeElement(this),this},replace:function(t){return this.after(t).remove(),t},addTo:function(t){return f(t).put(this)},putIn:function(t){return f(t).add(this)},id:function(t){return void 0!==t||this.node.id||(this.node.id=q.eid(this.type)),this.attr("id",t)},inside:function(t,e){var n=this.bbox();return t>n.x&&e>n.y&&t<n.x+n.width&&e<n.y+n.height},show:function(){return this.css("display","")},hide:function(){return this.css("display","none")},visible:function(){return"none"!==this.css("display")},toString:function(){return this.id()},classes:function(){var t=this.attr("class");return null==t?[]:t.trim().split(q.regex.delimiter)},hasClass:function(t){return-1!==this.classes().indexOf(t)},addClass:function(t){if(!this.hasClass(t)){var e=this.classes();e.push(t),this.attr("class",e.join(" "))}return this},removeClass:function(t){return this.hasClass(t)&&this.attr("class",this.classes().filter(function(e){return e!==t}).join(" ")),this},toggleClass:function(t){return this.hasClass(t)?this.removeClass(t):this.addClass(t)},reference:function(t){return q.get(this.attr(t))},parent:function(e){var n=this;if(!n.node.parentNode)return null;if(n=q.adopt(n.node.parentNode),!e)return n;for(;n&&n.node instanceof t.SVGElement;){if("string"==typeof e?n.matches(e):n instanceof e)return n;n=q.adopt(n.node.parentNode)}},doc:function(){var t=this.parent(q.Doc);return t&&t.doc()},defs:function(){return this.doc().defs()},parents:function(t){var e=[],n=this;do{if(!(n=n.parent(t))||!n.node)break;e.push(n)}while(n.parent);return e},matches:function(t){return x(this.node,t)},native:function(){return this.node},svg:function(t){var n,i;if(!(t&&this instanceof q.Parent))return this.writeDataToDom(),this.node.outerHTML;for(n=e.createElementNS(q.ns,"svg"),n.innerHTML=t,i=n.children.length;i--;)this.node.appendChild(n.firstElementChild);return this},writeDataToDom:function(){return this.is(q.Parent)&&this.each(function(){this.writeDataToDom()}),this.node.removeAttribute("svgjs:data"),Object.keys(this.dom).length&&this.node.setAttribute("svgjs:data",JSON.stringify(this.dom)),this},setData:function(t){return this.dom=t,this},is:function(t){return y(this,t)},getEventTarget:function(){return this.node}}}),["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","mouseenter","mouseleave","touchstart","touchmove","touchleave","touchend","touchcancel"].forEach(function(t){q.Element.prototype[t]=function(e){return null===e?q.off(this,t):q.on(this,t,e),this}}),q.listenerId=0,q.on=function(t,e,n,i,r){var s=n.bind(i||t),o=t instanceof q.EventTarget?t.getEventTarget():t;e=Array.isArray(e)?e:e.split(q.regex.delimiter),o.instance=o.instance||{events:{}};var a=o.instance.events;n._svgjsListenerId||(n._svgjsListenerId=++q.listenerId),e.forEach(function(t){var e=t.split(".")[0],i=t.split(".")[1]||"*";a[e]=a[e]||{},a[e][i]=a[e][i]||{},a[e][i][n._svgjsListenerId]=s,o.addEventListener(e,s,r||!1)})},q.off=function(t,e,n,i){var r=t instanceof q.EventTarget?t.getEventTarget():t;if(r.instance&&("function"!=typeof n||(n=n._svgjsListenerId))){var s=r.instance.events;e=Array.isArray(e)?e:(e||"").split(q.regex.delimiter),e.forEach(function(t){var e,o,a=t&&t.split(".")[0],h=t&&t.split(".")[1];if(n)s[a]&&s[a][h||"*"]&&(r.removeEventListener(a,s[a][h||"*"][n],i||!1),delete s[a][h||"*"][n]);else if(a&&h){if(s[a]&&s[a][h]){for(o in s[a][h])q.off(r,[a,h].join("."),o);delete s[a][h]}}else if(h)for(t in s)for(e in s[t])h===e&&q.off(r,[t,h].join("."));else if(a){if(s[a]){for(e in s[a])q.off(r,[a,e].join("."));delete s[a]}}else{for(t in s)q.off(r,t);r.instance.events={}}})}},q.dispatch=function(e,n,i){var r=e instanceof q.EventTarget?e.getEventTarget():e;return n instanceof t.Event?r.dispatchEvent(n):(n=new t.CustomEvent(n,{detail:i,cancelable:!0}),r.dispatchEvent(n)),n},q.Matrix=q.invent({create:function(t){var e=M([1,0,0,1,0,0]);t=t instanceof q.Element?t.matrixify():"string"==typeof t?M(t.split(q.regex.delimiter).map(parseFloat)):Array.isArray(t)?M(t):"object"===c(t)&&k(t)?t:"object"===c(t)?(new q.Matrix).transform(t):6===arguments.length?M([].slice.call(arguments)):e,this.a=null!=t.a?t.a:e.a,this.b=null!=t.b?t.b:e.b,this.c=null!=t.c?t.c:e.c,this.d=null!=t.d?t.d:e.d,this.e=null!=t.e?t.e:e.e,this.f=null!=t.f?t.f:e.f},extend:{clone:function(){return new q.Matrix(this)},transform:function(t){if(k(t)){return new q.Matrix(t).multiplyO(this)}var e=C(t),n=this,i=new q.Point(e.ox,e.oy).transform(n),r=i.x,s=i.y,o=(new q.Matrix).translateO(e.rx,e.ry).lmultiplyO(n).translateO(-r,-s).scaleO(e.scaleX,e.scaleY).skewO(e.skewX,e.skewY).shearO(e.shear).rotateO(e.theta).translateO(r,s);if(isFinite(e.px)||isFinite(e.py)){var a=new q.Point(r,s).transform(o),h=e.px?e.px-a.x:0,u=e.py?e.py-a.y:0;o.translateO(h,u)}return o.translateO(e.tx,e.ty),o},compose:function(t){t.origin&&(t.originX=t.origin[0],t.originY=t.origin[1]);var e=t.originX||0,n=t.originY||0,i=t.scaleX||1,r=t.scaleY||1,s=t.shear||0,o=t.rotate||0,a=t.translateX||0,h=t.translateY||0;return(new q.Matrix).translateO(-e,-n).scaleO(i,r).shearO(s).rotateO(o).translateO(a,h).lmultiplyO(this).translateO(e,n)},decompose:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=this.a,i=this.b,r=this.c,s=this.d,o=this.e,a=this.f,h=n*s-i*r,u=h>0?1:-1,l=u*Math.sqrt(n*n+i*i),c=Math.atan2(u*i,u*n),f=180/Math.PI*c,d=Math.cos(c),p=Math.sin(c),m=(n*r+i*s)/h,v=r*l/(m*n-i)||s*l/(m*i+n);return{scaleX:l,scaleY:v,shear:m,rotate:f,translateX:o-t+t*d*l+e*(m*d*l-p*v),translateY:a-e+t*p*l+e*(m*p*l+d*v),originX:t,originY:e,a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f}},morph:function(t){return this.destination=new q.Matrix(t),this},at:function(t){return this.destination?new q.Matrix({a:this.a+(this.destination.a-this.a)*t,b:this.b+(this.destination.b-this.b)*t,c:this.c+(this.destination.c-this.c)*t,d:this.d+(this.destination.d-this.d)*t,e:this.e+(this.destination.e-this.e)*t,f:this.f+(this.destination.f-this.f)*t}):this},multiply:function(t){return this.clone().multiplyO(t)},multiplyO:function(t){return S(this,t instanceof q.Matrix?t:new q.Matrix(t),this)},lmultiply:function(t){return this.clone().lmultiplyO(t)},lmultiplyO:function(t){var e=this;return S(t instanceof q.Matrix?t:new q.Matrix(t),e,this)},inverseO:function(){var t=this.a,e=this.b,n=this.c,i=this.d,r=this.e,s=this.f,o=t*i-e*n;if(!o)throw new Error("Cannot invert "+this);var a=i/o,h=-e/o,u=-n/o,l=t/o,c=-(a*r+u*s),f=-(h*r+l*s);return this.a=a,this.b=h,this.c=u,this.d=l,this.e=c,this.f=f,this},inverse:function(){return this.clone().inverseO()},translate:function(t,e){return this.clone().translateO(t,e)},translateO:function(t,e){return this.e+=t||0,this.f+=e||0,this},scale:function(t,e,n,i){var r;return(r=this.clone()).scaleO.apply(r,arguments)},scaleO:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;3===arguments.length&&(i=n,n=e,e=t);var r=this.a,s=this.b,o=this.c,a=this.d,h=this.e,u=this.f;return this.a=r*t,this.b=s*e,this.c=o*t,this.d=a*e,this.e=h*t-n*t+n,this.f=u*e-i*e+i,this},rotate:function(t,e,n){return this.clone().rotateO(t,e,n)},rotateO:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;t=q.utils.radians(t);var i=Math.cos(t),r=Math.sin(t),s=this.a,o=this.b,a=this.c,h=this.d,u=this.e,l=this.f;return this.a=s*i-o*r,this.b=o*i+s*r,this.c=a*i-h*r,this.d=h*i+a*r,this.e=u*i-l*r+n*r-e*i+e,this.f=l*i+u*r-e*r-n*i+n,this},flip:function(t,e){return this.clone().flipO(t,e)},flipO:function(t,e){return"x"===t?this.scaleO(-1,1,e,0):"y"===t?this.scaleO(1,-1,0,e):this.scaleO(-1,-1,t,e||t)},shear:function(t,e,n){return this.clone().shearO(t,e,n)},shearO:function(t){var e=(arguments.length>1&&void 0!==arguments[1]&&arguments[1],arguments.length>2&&void 0!==arguments[2]?arguments[2]:0),n=this.a,i=this.b,r=this.c,s=this.d,o=this.e,a=this.f;return this.a=n+i*t,this.c=r+s*t,this.e=o+a*t-e*t,this},skew:function(t,e,n,i){var r;return(r=this.clone()).skewO.apply(r,arguments)},skewO:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;3===arguments.length&&(i=n,n=e,e=t),t=q.utils.radians(t),e=q.utils.radians(e);var r=Math.tan(t),s=Math.tan(e),o=this.a,a=this.b,h=this.c,u=this.d,l=this.e,c=this.f;return this.a=o+a*r,this.b=a+o*s,this.c=h+u*r,this.d=u+h*s,this.e=l+c*r-i*r,this.f=c+l*s-n*s,this},skewX:function(t,e,n){return this.skew(t,0,e,n)},skewXO:function(t,e,n){return this.skewO(t,0,e,n)},skewY:function(t,e,n){return this.skew(0,t,e,n)},skewYO:function(t,e,n){return this.skewO(0,t,e,n)},aroundO:function(t,e,n){var i=t||0,r=e||0;return this.translateO(-i,-r).lmultiplyO(n).translateO(i,r)},around:function(t,e,n){return this.clone().aroundO(t,e,n)},native:function(){for(var t=q.parser.nodes.svg.node.createSVGMatrix(),e=Y.length-1;e>=0;e--)t[Y[e]]=this[Y[e]];return t},equals:function(t){var e=new q.Matrix(t);return T(this.a,e.a)&&T(this.b,e.b)&&T(this.c,e.c)&&T(this.d,e.d)&&T(this.e,e.e)&&T(this.f,e.f)},toString:function(){return"matrix("+this.a+","+this.b+","+this.c+","+this.d+","+this.e+","+this.f+")"},toArray:function(){return[this.a,this.b,this.c,this.d,this.e,this.f]},valueOf:function(){return{a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f}}},parent:q.Element,construct:{ctm:function(){return new q.Matrix(this.node.getCTM())},screenCTM:function(){if(this instanceof q.Doc&&!this.isRoot()){var t=this.rect(1,1),e=t.node.getScreenCTM();return t.remove(),new q.Matrix(e)}return new q.Matrix(this.node.getScreenCTM())}}}),q.Point=q.invent({create:function(t,e,n){var i;n=n||{x:0,y:0},i=Array.isArray(t)?{x:t[0],y:t[1]}:"object"===c(t)?{x:t.x,y:t.y}:{x:t,y:e},this.x=null==i.x?n.x:i.x,this.y=null==i.y?n.y:i.y},extend:{clone:function(){return new q.Point(this)},morph:function(t,e){return this.destination=new q.Point(t,e),this},at:function(t){return this.destination?new q.Point({x:this.x+(this.destination.x-this.x)*t,y:this.y+(this.destination.y-this.y)*t}):this},native:function(){var t=q.parser.nodes.svg.node.createSVGPoint();return t.x=this.x,t.y=this.y,t},transform:function(t){var e=t.a*this.x+t.c*this.y+t.e,n=t.b*this.x+t.d*this.y+t.f;return new q.Point(e,n)}}}),q.extend(q.Element,{point:function(t,e){return new q.Point(t,e).transform(this.screenCTM().inverse())}}),q.extend(q.Element,{attr:function(t,e,n){if(null==t){for(t={},e=this.node.attributes,n=e.length-1;n>=0;n--)t[e[n].nodeName]=q.regex.isNumber.test(e[n].nodeValue)?parseFloat(e[n].nodeValue):e[n].nodeValue;return t}if("object"===c(t))for(e in t)this.attr(e,t[e]);else if(null===e)this.node.removeAttribute(t);else{if(null==e)return e=this.node.getAttribute(t),null==e?q.defaults.attrs[t]:q.regex.isNumber.test(e)?parseFloat(e):e;"fill"!==t&&"stroke"!==t||(q.regex.isImage.test(e)&&(e=this.doc().defs().image(e)),e instanceof q.Image&&(e=this.doc().defs().pattern(0,0,function(){this.add(e)}))),"number"==typeof e?e=new q.Number(e):q.Color.isColor(e)?e=new q.Color(e):Array.isArray(e)&&(e=new q.Array(e)),"leading"===t?this.leading&&this.leading(e):"string"==typeof n?this.node.setAttributeNS(n,t,e.toString()):this.node.setAttribute(t,e.toString()),!this.rebuild||"font-size"!==t&&"x"!==t||this.rebuild(t,e)}return this}}),q.extend(q.Element,{untransform:function(){return this.attr("transform",null)},matrixify:function(){return(this.attr("transform")||"").split(q.regex.transforms).slice(0,-1).map(function(t){var e=t.trim().split("(");return[e[0],e[1].split(q.regex.delimiter).map(function(t){return parseFloat(t)})]}).reverse().reduce(function(t,e){return"matrix"===e[0]?t.lmultiply(M(e[1])):t[e[0]].apply(t,e[1])},new q.Matrix)},toParent:function(t){if(this===t)return this;var e=this.screenCTM(),n=t.screenCTM().inverse();return this.addTo(t).untransform().transform(n.multiply(e)),this},toDoc:function(){return this.toParent(this.doc())}}),q.extend(q.Element,{transform:function(t,e){if(null==t||"string"==typeof t){var n=new q.Matrix(this).decompose();return n[t]||n}k(t)||(t=u({},t,{
+origin:j(t,this)}));var i=!0===e?this:e||!1,r=new q.Matrix(i).transform(t);return this.attr("transform",r)}}),q.extend(q.Element,{css:function(t,e){var n,i,r={};if(0===arguments.length)return this.node.style.cssText.split(/\s*;\s*/).filter(function(t){return!!t.length}).forEach(function(t){n=t.split(/\s*:\s*/),r[n[0]]=n[1]}),r;if(arguments.length<2){if(Array.isArray(t)){for(i=t.length;i--;)r[g(t[i])]=this.node.style[g(t[i])];return r}if("string"==typeof t)return this.node.style[g(t)];if("object"===c(t))for(i in t)this.node.style[g(i)]=null==t[i]||q.regex.isBlank.test(t[i])?"":t[i]}return 2===arguments.length&&(this.node.style[g(t)]=null==e||q.regex.isBlank.test(e)?"":e),this}}),q.Parent=q.invent({create:function(t){q.Element.call(this,t)},inherit:q.Element,extend:{children:function(){return q.utils.map(this.node.children,function(t){return q.adopt(t)})},add:function(t,e){return t=f(t),t.node!==this.node.children[e]&&this.node.insertBefore(t.node,this.node.children[e]||null),this},put:function(t,e){return this.add(t,e),t.instance||t},has:function(t){return this.index(t)>=0},index:function(t){return[].slice.call(this.node.children).indexOf(t.node)},get:function(t){return q.adopt(this.node.children[t])},first:function(){return this.get(0)},last:function(){return this.get(this.node.children.length-1)},each:function(t,e){var n,i,r=this.children();for(n=0,i=r.length;n<i;n++)r[n]instanceof q.Element&&t.apply(r[n],[n,r]),e&&r[n]instanceof q.Parent&&r[n].each(t,e);return this},removeElement:function(t){return this.node.removeChild(t.node),this},clear:function(){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return delete this._defs,this}}}),q.extend(q.Parent,{flatten:function(t){return this instanceof q.G||this instanceof q.Doc?(t=t||(this instanceof q.Doc&&this.isRoot()?this:this.parent(q.Parent)),this.each(function(){return this instanceof q.Defs?this:this instanceof q.Parent?this.flatten(t):this.toParent(t)}),this.node.firstElementChild||this.remove(),this):this},ungroup:function(t){return this instanceof q.G||this instanceof q.Doc&&!this.isRoot()?(t=t||this.parent(q.Parent),this.each(function(){return this.toParent(t)}),this.remove(),this):this}}),q.Container=q.invent({create:function(t){q.Element.call(this,t)},inherit:q.Parent}),q.Defs=q.invent({create:"defs",inherit:q.Container}),q.G=q.invent({create:"g",inherit:q.Container,extend:{},construct:{group:function(){return this.put(new q.G)}}}),q.extend(q.Element,{siblings:function(){return this.parent().children()},position:function(){return this.parent().index(this)},next:function(){return this.siblings()[this.position()+1]},prev:function(){return this.siblings()[this.position()-1]},forward:function(){var t=this.position()+1,e=this.parent();return e.removeElement(this).add(this,t),e instanceof q.Doc&&e.node.appendChild(e.defs().node),this},backward:function(){var t=this.position();return t>0&&this.parent().removeElement(this).add(this,t-1),this},front:function(){var t=this.parent();return t.node.appendChild(this.node),t instanceof q.Doc&&t.node.appendChild(t.defs().node),this},back:function(){return this.position()>0&&this.parent().removeElement(this).add(this,0),this},before:function(t){t.remove();var e=this.position();return this.parent().add(t,e),this},after:function(t){t.remove();var e=this.position();return this.parent().add(t,e+1),this}}),q.Mask=q.invent({create:"mask",inherit:q.Container,extend:{remove:function(){return this.targets().forEach(function(t){t.unmask()}),q.Element.prototype.remove.call(this)},targets:function(){return q.select('svg [mask*="'+this.id()+'"]')}},construct:{mask:function(){return this.defs().put(new q.Mask)}}}),q.extend(q.Element,{maskWith:function(t){var e=t instanceof q.Mask?t:this.parent().mask().add(t);return this.attr("mask",'url("#'+e.id()+'")')},unmask:function(){return this.attr("mask",null)},masker:function(){return this.reference("mask")}}),q.ClipPath=q.invent({create:"clipPath",inherit:q.Container,extend:{remove:function(){return this.targets().forEach(function(t){t.unclip()}),q.Element.prototype.remove.call(this)},targets:function(){return q.select('svg [clip-path*="'+this.id()+'"]')}},construct:{clip:function(){return this.defs().put(new q.ClipPath)}}}),q.extend(q.Element,{clipWith:function(t){var e=t instanceof q.ClipPath?t:this.parent().clip().add(t);return this.attr("clip-path",'url("#'+e.id()+'")')},unclip:function(){return this.attr("clip-path",null)},clipper:function(){return this.reference("clip-path")}}),q.Gradient=q.invent({create:function(t){q.Element.call(this,"object"===c(t)?t:q.create(t+"Gradient"))},inherit:q.Container,extend:{stop:function(t,e,n){return this.put(new q.Stop).update(t,e,n)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},url:function(){return"url(#"+this.id()+")"},toString:function(){return this.url()},attr:function(t,e,n){return"transform"===t&&(t="gradientTransform"),q.Container.prototype.attr.call(this,t,e,n)}},construct:{gradient:function(t,e){return this.defs().gradient(t,e)}}}),q.extend([q.Gradient,q.Timeline],{from:function(t,e){return"radialGradient"===(this._target||this).type?this.attr({fx:new q.Number(t),fy:new q.Number(e)}):this.attr({x1:new q.Number(t),y1:new q.Number(e)})},to:function(t,e){return"radialGradient"===(this._target||this).type?this.attr({cx:new q.Number(t),cy:new q.Number(e)}):this.attr({x2:new q.Number(t),y2:new q.Number(e)})}}),q.extend(q.Defs,{gradient:function(t,e){return this.put(new q.Gradient(t)).update(e)}}),q.Stop=q.invent({create:"stop",inherit:q.Element,extend:{update:function(t){return("number"==typeof t||t instanceof q.Number)&&(t={offset:arguments[0],color:arguments[1],opacity:arguments[2]}),null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",new q.Number(t.offset)),this}}}),q.Pattern=q.invent({create:"pattern",inherit:q.Container,extend:{url:function(){return"url(#"+this.id()+")"},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return this.url()},attr:function(t,e,n){return"transform"===t&&(t="patternTransform"),q.Container.prototype.attr.call(this,t,e,n)}},construct:{pattern:function(t,e,n){return this.defs().pattern(t,e,n)}}}),q.extend(q.Defs,{pattern:function(t,e,n){return this.put(new q.Pattern).update(n).attr({x:0,y:0,width:t,height:e,patternUnits:"userSpaceOnUse"})}}),q.Doc=q.invent({create:function(t){q.Element.call(this,t||q.create("svg")),this.namespace()},inherit:q.Container,extend:{isRoot:function(){return!(this.node.parentNode&&this.node.parentNode instanceof t.SVGElement&&"#document"!==this.node.parentNode.nodeName)},doc:function(){return this.isRoot()?this:q.Element.prototype.doc.call(this)},namespace:function(){return this.isRoot()?this.attr({xmlns:q.ns,version:"1.1"}).attr("xmlns:xlink",q.xlink,q.xmlns).attr("xmlns:svgjs",q.svgjs,q.xmlns):this.doc().namespace()},defs:function(){return this.isRoot()?q.adopt(this.node.getElementsByTagName("defs")[0])||this.put(new q.Defs):this.doc().defs()},parent:function(t){return this.isRoot()?"#document"===this.node.parentNode.nodeName?null:this.node.parentNode:q.Element.prototype.parent.call(this,t)},remove:function(){return this.isRoot()?(this.parent()&&this.parent().removeChild(this.node),this):q.Element.prototype.remove.call(this)},clear:function(){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return this}},construct:{nested:function(){return this.put(new q.Doc)}}}),q.Shape=q.invent({create:function(t){q.Element.call(this,t)},inherit:q.Element}),q.Bare=q.invent({create:function(t,e){if(q.Element.call(this,q.create(t)),e)for(var n in e.prototype)"function"==typeof e.prototype[n]&&(this[n]=e.prototype[n])},inherit:q.Element,extend:{words:function(t){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return this.node.appendChild(e.createTextNode(t)),this}}}),q.extend(q.Parent,{element:function(t,e){return this.put(new q.Bare(t,e))}}),q.Symbol=q.invent({create:"symbol",inherit:q.Container,construct:{symbol:function(){return this.put(new q.Symbol)}}}),q.Use=q.invent({create:"use",inherit:q.Shape,extend:{element:function(t,e){return this.attr("href",(e||"")+"#"+t,q.xlink)}},construct:{use:function(t,e){return this.put(new q.Use).element(t,e)}}}),q.Rect=q.invent({create:"rect",inherit:q.Shape,construct:{rect:function(t,e){return this.put(new q.Rect).size(t,e)}}}),q.Circle=q.invent({create:"circle",inherit:q.Shape,construct:{circle:function(t){return this.put(new q.Circle).rx(new q.Number(t).divide(2)).move(0,0)}}}),q.extend([q.Circle,q.Timeline],{rx:function(t){return this.attr("r",t)},ry:function(t){return this.rx(t)}}),q.Ellipse=q.invent({create:"ellipse",inherit:q.Shape,construct:{ellipse:function(t,e){return this.put(new q.Ellipse).size(t,e).move(0,0)}}}),q.extend([q.Ellipse,q.Rect,q.Timeline],{rx:function(t){return this.attr("rx",t)},ry:function(t){return this.attr("ry",t)}}),q.extend([q.Circle,q.Ellipse],{x:function(t){return null==t?this.cx()-this.rx():this.cx(t+this.rx())},y:function(t){return null==t?this.cy()-this.ry():this.cy(t+this.ry())},cx:function(t){return null==t?this.attr("cx"):this.attr("cx",t)},cy:function(t){return null==t?this.attr("cy"):this.attr("cy",t)},width:function(t){return null==t?2*this.rx():this.rx(new q.Number(t).divide(2))},height:function(t){return null==t?2*this.ry():this.ry(new q.Number(t).divide(2))},size:function(t,e){var n=A(this,t,e);return this.rx(new q.Number(n.width).divide(2)).ry(new q.Number(n.height).divide(2))}}),q.Line=q.invent({create:"line",inherit:q.Shape,extend:{array:function(){return new q.PointArray([[this.attr("x1"),this.attr("y1")],[this.attr("x2"),this.attr("y2")]])},plot:function(t,e,n,i){return null==t?this.array():(t=void 0!==e?{x1:t,y1:e,x2:n,y2:i}:new q.PointArray(t).toLine(),this.attr(t))},move:function(t,e){return this.attr(this.array().move(t,e).toLine())},size:function(t,e){var n=A(this,t,e);return this.attr(this.array().size(n.width,n.height).toLine())}},construct:{line:function(t,e,n,i){return q.Line.prototype.plot.apply(this.put(new q.Line),null!=t?[t,e,n,i]:[0,0,0,0])}}}),q.Polyline=q.invent({create:"polyline",inherit:q.Shape,construct:{polyline:function(t){return this.put(new q.Polyline).plot(t||new q.PointArray)}}}),q.Polygon=q.invent({create:"polygon",inherit:q.Shape,construct:{polygon:function(t){return this.put(new q.Polygon).plot(t||new q.PointArray)}}}),q.extend([q.Polyline,q.Polygon],{array:function(){return this._array||(this._array=new q.PointArray(this.attr("points")))},plot:function(t){return null==t?this.array():this.clear().attr("points","string"==typeof t?t:this._array=new q.PointArray(t))},clear:function(){return delete this._array,this},move:function(t,e){return this.attr("points",this.array().move(t,e))},size:function(t,e){var n=A(this,t,e);return this.attr("points",this.array().size(n.width,n.height))}}),q.extend([q.Line,q.Polyline,q.Polygon],{MorphArray:q.PointArray,x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},width:function(t){var e=this.bbox();return null==t?e.width:this.size(t,e.height)},height:function(t){var e=this.bbox();return null==t?e.height:this.size(e.width,t)}}),q.Path=q.invent({create:"path",inherit:q.Shape,extend:{MorphArray:q.PathArray,array:function(){return this._array||(this._array=new q.PathArray(this.attr("d")))},plot:function(t){return null==t?this.array():this.clear().attr("d","string"==typeof t?t:this._array=new q.PathArray(t))},clear:function(){return delete this._array,this},move:function(t,e){return this.attr("d",this.array().move(t,e))},x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},size:function(t,e){var n=A(this,t,e);return this.attr("d",this.array().size(n.width,n.height))},width:function(t){return null==t?this.bbox().width:this.size(t,this.bbox().height)},height:function(t){return null==t?this.bbox().height:this.size(this.bbox().width,t)}},construct:{path:function(t){return this.put(new q.Path).plot(t||new q.PathArray)}}}),q.Image=q.invent({create:"image",inherit:q.Shape,extend:{load:function(e,n){if(!e)return this;var i=new t.Image;return q.on(i,"load",function(t){var r=this.parent(q.Pattern);0===this.width()&&0===this.height()&&this.size(i.width,i.height),r instanceof q.Pattern&&0===r.width()&&0===r.height()&&r.size(this.width(),this.height()),"function"==typeof n&&n.call(this,{width:i.width,height:i.height,ratio:i.width/i.height,url:e})},this),q.on(i,"load error",function(){q.off(i)}),this.attr("href",i.src=e,q.xlink)}},construct:{image:function(t,e){return this.put(new q.Image).size(0,0).load(t,e)}}}),q.Text=q.invent({create:function(t){q.Element.call(this,t||q.create("text")),this.dom.leading=new q.Number(1.3),this._rebuild=!0,this._build=!1,this.attr("font-family",q.defaults.attrs["font-family"])},inherit:q.Parent,extend:{x:function(t){return null==t?this.attr("x"):this.attr("x",t)},y:function(t){var e=this.attr("y"),n="number"==typeof e?e-this.bbox().y:0;return null==t?"number"==typeof e?e-n:e:this.attr("y","number"==typeof t?t+n:t)},cx:function(t){return null==t?this.bbox().cx:this.x(t-this.bbox().width/2)},cy:function(t){return null==t?this.bbox().cy:this.y(t-this.bbox().height/2)},text:function(t){if(void 0===t){var e=this.node.childNodes,n=0;t="";for(var i=0,r=e.length;i<r;++i)"textPath"!==e[i].nodeName?(i!==n&&3!==e[i].nodeType&&!0===q.adopt(e[i]).dom.newLined&&(t+="\n"),t+=e[i].textContent):0===i&&(n=1);return t}if(this.clear().build(!0),"function"==typeof t)t.call(this,this);else{t=t.split("\n");for(var s=0,o=t.length;s<o;s++)this.tspan(t[s]).newLine()}return this.build(!1).rebuild()},leading:function(t){return null==t?this.dom.leading:(this.dom.leading=new q.Number(t),this.rebuild())},rebuild:function(t){if("boolean"==typeof t&&(this._rebuild=t),this._rebuild){var e=this,n=0,i=this.dom.leading*new q.Number(this.attr("font-size"));this.each(function(){this.dom.newLined&&(this.attr("x",e.attr("x")),"\n"===this.text()?n+=i:(this.attr("dy",i+n),n=0))}),this.fire("rebuild")}return this},build:function(t){return this._build=!!t,this},setData:function(t){return this.dom=t,this.dom.leading=new q.Number(t.leading||1.3),this}},construct:{text:function(t){return this.put(new q.Text).text(t)},plain:function(t){return this.put(new q.Text).plain(t)}}}),q.Tspan=q.invent({create:"tspan",inherit:q.Parent,extend:{text:function(t){return null==t?this.node.textContent+(this.dom.newLined?"\n":""):("function"==typeof t?t.call(this,this):this.plain(t),this)},dx:function(t){return this.attr("dx",t)},dy:function(t){return this.attr("dy",t)},newLine:function(){var t=this.parent(q.Text);return this.dom.newLined=!0,this.dy(t.dom.leading*t.attr("font-size")).attr("x",t.x())}}}),q.extend([q.Text,q.Tspan],{plain:function(t){return!1===this._build&&this.clear(),this.node.appendChild(e.createTextNode(t)),this},tspan:function(t){var e=new q.Tspan;return this._build||this.clear(),this.node.appendChild(e.node),e.text(t)},length:function(){return this.node.getComputedTextLength()}}),q.TextPath=q.invent({create:"textPath",inherit:q.Text,parent:q.Parent,extend:{MorphArray:q.PathArray,array:function(){var t=this.track();return t?t.array():null},plot:function(t){var e=this.track(),n=null;return e&&(n=e.plot(t)),null==t?n:this},track:function(){return this.reference("href")}},construct:{textPath:function(t,e){return this.defs().path(e).text(t).addTo(this)}}}),q.extend([q.Text],{path:function(t){var e=new q.TextPath;return t instanceof q.Path||(t=this.doc().defs().path(t)),e.attr("href","#"+t,q.xlink),this.put(e)},textPath:function(){return this.select("textPath")}}),q.extend([q.Path],{text:function(t){if(t instanceof q.Text){var e=t.text();return t.clear().path(this).text(e)}return this.parent().put(new q.Text).path(this).text(t)}}),q.A=q.invent({create:"a",inherit:q.Container,extend:{to:function(t){return this.attr("href",t,q.xlink)},target:function(t){return this.attr("target",t)}},construct:{link:function(t){return this.put(new q.A).to(t)}}}),q.extend(q.Element,{linkTo:function(t){var e=new q.A;return"function"==typeof t?t.call(e,e):e.to(t),this.parent().put(e).put(this)}}),q.Marker=q.invent({create:"marker",inherit:q.Container,extend:{width:function(t){return this.attr("markerWidth",t)},height:function(t){return this.attr("markerHeight",t)},ref:function(t,e){return this.attr("refX",t).attr("refY",e)},update:function(t){return this.clear(),"function"==typeof t&&t.call(this,this),this},toString:function(){return"url(#"+this.id()+")"}},construct:{marker:function(t,e,n){return this.defs().marker(t,e,n)}}}),q.extend(q.Defs,{marker:function(t,e,n){return this.put(new q.Marker).size(t,e).ref(t/2,e/2).viewbox(0,0,t,e).attr("orient","auto").update(n)}}),q.extend([q.Line,q.Polyline,q.Polygon,q.Path],{marker:function(t,e,n,i){var r=["marker"];return"all"!==t&&r.push(t),r=r.join("-"),t=arguments[1]instanceof q.Marker?arguments[1]:this.doc().marker(e,n,i),this.attr(r,t)}});var X={stroke:["color","width","opacity","linecap","linejoin","miterlimit","dasharray","dashoffset"],fill:["color","opacity","rule"],prefix:function(t,e){return"color"===e?t:t+"-"+e}};["fill","stroke"].forEach(function(t){var e,n={};n[t]=function(n){if(void 0===n)return this;if("string"==typeof n||q.Color.isRgb(n)||n&&"function"==typeof n.fill)this.attr(t,n);else for(e=X[t].length-1;e>=0;e--)null!=n[X[t][e]]&&this.attr(X.prefix(t,X[t][e]),n[X[t][e]]);return this},q.extend([q.Element,q.Timeline],n)}),q.extend([q.Element,q.Timeline],{matrix:function(t,e,n,i,r,s){return null==t?new q.Matrix(this):this.attr("transform",new q.Matrix(t,e,n,i,r,s))},rotate:function(t,e,n){return this.transform({rotate:t,ox:e,oy:n},!0)},skew:function(t,e,n,i){return 1===arguments.length||3===arguments.length?this.transform({skew:t,ox:e,oy:n},!0):this.transform({skew:[t,e],ox:n,oy:i},!0)},shear:function(t,e,n){return this.transform({shear:t,ox:e,oy:n},!0)},scale:function(t,e,n,i){return 1===arguments.length||3===arguments.length?this.transform({scale:t,ox:e,oy:n},!0):this.transform({scale:[t,e],ox:n,oy:i},!0)},translate:function(t,e){return this.transform({translate:[t,e]},!0)},relative:function(t,e){return this.transform({relative:[t,e]},!0)},flip:function(t,e){var n="string"==typeof t?t:(isFinite(t),"both"),i="both"===t&&isFinite(e)?[e,e]:"x"===t?[e,0]:"y"===t?[0,e]:isFinite(t)?[t,t]:[0,0];this.transform({flip:n,origin:i},!0)},opacity:function(t){return this.attr("opacity",t)},dx:function(t){return this.x(new q.Number(t).plus(this instanceof q.Timeline?0:this.x()),!0)},dy:function(t){return this.y(new q.Number(t).plus(this instanceof q.Timeline?0:this.y()),!0)},dmove:function(t,e){return this.dx(t).dy(e)}}),q.extend([q.Rect,q.Ellipse,q.Circle,q.Gradient,q.Timeline],{radius:function(t,e){var n=(this._target||this).type;return"radialGradient"===n||"radialGradient"===n?this.attr("r",new q.Number(t)):this.rx(t).ry(null==e?t:e)}}),q.extend(q.Path,{length:function(){return this.node.getTotalLength()},pointAt:function(t){return new q.Point(this.node.getPointAtLength(t))}}),q.extend([q.Parent,q.Text,q.Tspan,q.Timeline],{font:function(t,e){if("object"===c(t))for(e in t)this.font(e,t[e]);return"leading"===t?this.leading(e):"anchor"===t?this.attr("text-anchor",e):"size"===t||"family"===t||"weight"===t||"stretch"===t||"variant"===t||"style"===t?this.attr("font-"+t,e):this.attr(t,e)}}),q.extend(q.Element,{data:function(t,e,n){if("object"===c(t))for(e in t)this.data(e,t[e]);else if(arguments.length<2)try{return JSON.parse(this.attr("data-"+t))}catch(e){return this.attr("data-"+t)}else this.attr("data-"+t,null===e?null:!0===n||"string"==typeof e||"number"==typeof e?e:JSON.stringify(e));return this}}),q.extend(q.Element,{remember:function(t,e){if("object"===c(arguments[0]))for(var n in t)this.remember(n,t[n]);else{if(1===arguments.length)return this.memory()[t];this.memory()[t]=e}return this},forget:function(){if(0===arguments.length)this._memory={};else for(var t=arguments.length-1;t>=0;t--)delete this.memory()[arguments[t]];return this},memory:function(){return this._memory||(this._memory={})}}),q.get=function(t){var n=e.getElementById(O(t)||t);return q.adopt(n)},q.select=function(t,n){return q.utils.map((n||e).querySelectorAll(t),function(t){return q.adopt(t)})},q.$$=function(t,n){return q.utils.map((n||e).querySelectorAll(t),function(t){return q.adopt(t)})},q.$=function(t,n){return q.adopt((n||e).querySelector(t))},q.extend(q.Parent,{select:function(t){return q.select(t,this.node)}});var Y="abcdef".split("");q.Box=q.invent({create:function(t){var e=[0,0,0,0];t="string"==typeof t?t.split(q.regex.delimiter).map(parseFloat):Array.isArray(t)?t:"object"===c(t)?[null!=t.left?t.left:t.x,null!=t.top?t.top:t.y,t.width,t.height]:4===arguments.length?[].slice.call(arguments):e,this.x=t[0],this.y=t[1],this.width=t[2],this.height=t[3],E(this)},extend:{merge:function(t){var e=Math.min(this.x,t.x),n=Math.min(this.y,t.y);return new q.Box(e,n,Math.max(this.x+this.width,t.x+t.width)-e,Math.max(this.y+this.height,t.y+t.height)-n)},transform:function(t){var e=1/0,n=-1/0,i=1/0,r=-1/0;return[new q.Point(this.x,this.y),new q.Point(this.x2,this.y),new q.Point(this.x,this.y2),new q.Point(this.x2,this.y2)].forEach(function(s){s=s.transform(t),e=Math.min(e,s.x),n=Math.max(n,s.x),i=Math.min(i,s.y),r=Math.max(r,s.y)}),new q.Box(e,i,n-e,r-i)},addOffset:function(){return this.x+=t.pageXOffset,this.y+=t.pageYOffset,this},toString:function(){return this.x+" "+this.y+" "+this.width+" "+this.height},toArray:function(){return[this.x,this.y,this.width,this.height]},morph:function(t,e,n,i){return this.destination=new q.Box(t,e,n,i),this},at:function(t){return this.destination?new q.Box(this.x+(this.destination.x-this.x)*t,this.y+(this.destination.y-this.y)*t,this.width+(this.destination.width-this.width)*t,this.height+(this.destination.height-this.height)*t):this}},parent:q.Element,construct:{bbox:function(){var t;try{if(t=this.node.getBBox(),d(t)&&!p(this.node))throw new Exception("Element not in the dom")}catch(n){try{var e=this.clone(q.parser().svg).show();t=e.node.getBBox(),e.remove()}catch(t){console.warn("Getting a bounding box of this element is not possible")}}return new q.Box(t)},rbox:function(t){try{var e=new q.Box(this.node.getBoundingClientRect());return t?e.transform(t.screenCTM().inverse()):e.addOffset()}catch(t){return new q.Box}}}}),q.extend([q.Doc,q.Symbol,q.Image,q.Pattern,q.Marker,q.ForeignObject,q.View],{viewbox:function(t,e,n,i){return null==t?new q.Box(this.attr("viewBox")):this.attr("viewBox",new q.Box(t,e,n,i))}}),q.parser=function(){var t;return q.parser.nodes.svg.node.parentNode||(t=e.body||e.documentElement,q.parser.nodes.svg.addTo(t)),q.parser.nodes},q.parser.nodes={svg:q().size(2,0).css({opacity:0,position:"absolute",left:"-100%",top:"-100%",overflow:"hidden"})},q.parser.nodes.path=q.parser.nodes.svg.path().node,q.Animator={nextDraw:null,frames:new q.Queue,timeouts:new q.Queue,timer:t.performance||t.Date,transforms:[],frame:function(t){var e=q.Animator.frames.push({run:t});return null===q.Animator.nextDraw&&(q.Animator.nextDraw=requestAnimationFrame(q.Animator._draw)),e},transform_frame:function(t,e){q.Animator.transforms[e]=t},timeout:function(t,e){e=e||0;var n=q.Animator.timer.now()+e,i=q.Animator.timeouts.push({run:t,time:n});return null===q.Animator.nextDraw&&(q.Animator.nextDraw=requestAnimationFrame(q.Animator._draw)),i},cancelFrame:function(t){q.Animator.frames.remove(t)},clearTimeout:function(t){q.Animator.timeouts.remove(t)},_draw:function(t){for(var e=null,n=q.Animator.timeouts.last();(e=q.Animator.timeouts.shift())&&(t>=e.time?e.run():q.Animator.timeouts.push(e),e!==n););for(var i=null,r=q.Animator.frames.last();i!==r&&(i=q.Animator.frames.shift());)i.run();q.Animator.transforms.forEach(function(t){t()}),q.Animator.nextDraw=q.Animator.timeouts.first()||q.Animator.frames.first()?requestAnimationFrame(q.Animator._draw):null}},q.Morphable=q.invent({create:function(t){this._stepper=t||new q.Ease("-"),this._from=null,this._to=null,this._type=null,this._context=null,this._morphObj=null},extend:{from:function(t){return null==t?this._from:(this._from=this._set(t),this)},to:function(t){return null==t?this._to:(this._to=this._set(t),this)},type:function(t){return null==t?this._type:(this._type=t,this)},_set:function(t){if(!this._type){var e=c(t);"number"===e?this.type(q.Number):"string"===e?q.Color.isColor(t)?this.type(q.Color):q.regex.delimiter.test(t)?this.type(q.regex.pathLetters.test(t)?q.PathArray:q.Array):q.regex.numberAndUnit.test(t)?this.type(q.Number):this.type(q.Morphable.NonMorphable):q.MorphableTypes.indexOf(t.constructor)>-1?this.type(t.constructor):Array.isArray(t)?this.type(q.Array):"object"===e?this.type(q.Morphable.ObjectBag):this.type(q.Morphable.NonMorphable)}var n=new this._type(t).toArray();return this._morphObj=this._morphObj||new this._type,this._context=this._context||Array.apply(null,Array(n.length)).map(Object),n},stepper:function(t){return null==t?this._stepper:(this._stepper=t,this)},done:function(){return this._context.map(this._stepper.done).reduce(function(t,e){return t&&e},!0)},at:function(t){var e=this;return this._morphObj.fromArray(this._from.map(function(n,i){return e._stepper.step(n,e._to[i],t,e._context[i],e._context)}))}}}),q.Morphable.NonMorphable=q.invent({create:function(t){t=Array.isArray(t)?t[0]:t,this.value=t},extend:{valueOf:function(){return this.value},toArray:function(){return[this.value]}}}),q.Morphable.TransformBag=q.invent({create:function(t){Array.isArray(t)&&(t={scaleX:t[0],scaleY:t[1],shear:t[2],rotate:t[3],translateX:t[4],translateY:t[5],originX:t[6],originY:t[7]}),Object.assign(this,q.Morphable.TransformBag.defaults,t)},extend:{toArray:function(){var t=this;return[t.scaleX,t.scaleY,t.shear,t.rotate,t.translateX,t.translateY,t.originX,t.originY]}}}),q.Morphable.TransformBag.defaults={scaleX:1,scaleY:1,shear:0,rotate:0,translateX:0,translateY:0,originX:0,originY:0},q.Morphable.ObjectBag=q.invent({create:function(t){if(this.values=[],Array.isArray(t))return void(this.values=t);var e=Object.entries(t||{}).sort(function(t,e){return t[0]-e[0]});this.values=e.reduce(function(t,e){return t.concat(e)},[])},extend:{valueOf:function(){for(var t={},e=this.values,n=0,i=e.length;n<i;n+=2)t[e[n]]=e[n+1];return t},toArray:function(){return this.values}}}),q.MorphableTypes=[q.Number,q.Color,q.Box,q.Matrix,q.Array,q.PointArray,q.PathArray,q.Morphable.NonMorphable,q.Morphable.TransformBag,q.Morphable.ObjectBag],q.extend(q.MorphableTypes,{to:function(t,e){return(new q.Morphable).type(this.constructor).from(this.valueOf()).to(t,e)},fromArray:function(t){return this.constructor(t),this}}),q.easing={"-":function(t){return t},"<>":function(t){return-Math.cos(t*Math.PI)/2+.5},">":function(t){return Math.sin(t*Math.PI/2)},"<":function(t){return 1-Math.cos(t*Math.PI/2)}},q.Runner=q.invent({parent:q.Element,create:function(t){this.id=q.Runner.id++,t=null==t?q.defaults.timeline.duration:t,t="function"==typeof t?new q.Controller(t):t,this._element=null,this._timeline=null,this.done=!1,this._queue=[],this._duration="number"==typeof t&&t,this._isDeclarative=t instanceof q.Controller,this._stepper=this._isDeclarative?t:new q.Ease,this._history={},this.enabled=!0,this._time=0,this._last=0,this.tags={},this.transforms=new q.Matrix,this.transformId=1,this._haveReversed=!1,this._reverse=!1,this._loopsDone=0,this._swing=!1,this._wait=0,this._times=1},construct:{animate:function(t,e,n){var i=q.Runner.sanitise(t,e,n),r=this.timeline();return new q.Runner(i.duration).loop(i).element(this).timeline(r).schedule(e,n)},delay:function(t,e){return this.animate(0,t,e)}},extend:{element:function(t){return null==t?this._element:(this._element=t,t._prepareRunner(),this)},timeline:function(t){return void 0===t?this._timeline:(this._timeline=t,this)},animate:function(t,e,n){var i=q.Runner.sanitise(t,e,n),r=new q.Runner(i.duration);return this._timeline&&r.timeline(this._timeline),this._element&&r.element(this._element),r.loop(i).schedule(e,n)},schedule:function(t,e,n){if(t instanceof q.Timeline||(n=e,e=t,t=this.timeline()),!t)throw Error("Runner cannot be scheduled without timeline");return t.schedule(this,e,n),this},unschedule:function(){var t=this.timeline();return t&&t.unschedule(this),this},loop:function(t,e,n){return"object"===c(t)&&(e=t.swing,n=t.wait,t=t.times),this._times=t||1/0,this._swing=e||!1,this._wait=n||0,this},delay:function(t){return this.animate(0,t)},queue:function(t,e,n){return this._queue.push({initialiser:t||q.void,runner:e||q.void,isTransform:n,initialised:!1,finished:!1}),this.timeline()&&this.timeline()._continue(),this},during:function(t){return this.queue(null,t)},after:function(t){return this.on("finish",t)},time:function(t){if(null==t)return this._time;var e=t-this._time;return this.step(e),this},duration:function(){return this._times*(this._wait+this._duration)-this._wait},loops:function(t){var e=this._duration+this._wait;if(null==t){var n=Math.floor(this._time/e),i=this._time-n*e,r=i/this._duration;return Math.min(n+r,this._times)}var s=Math.floor(t),o=t%1,a=e*s+this._duration*o;return this.time(a)},position:function(t){var e,n=this._time,i=this._duration,r=this._wait,s=this._times,o=this._swing,a=this._reverse;if(null==t){var h=function(t){var e=o*Math.floor(t%(2*(r+i))/(r+i)),n=e&&!a||!e&&a,s=Math.pow(-1,n)*(t%(r+i))/i+n;return Math.max(Math.min(s,1),0)},u=s*(r+i)-r;return e=n<=0?Math.round(h(1e-5)):n<u?h(n):Math.round(h(u-1e-5)),e}var l=Math.floor(this.loops()),c=o&&l%2==0;return e=l+(c&&!a||a&&c?t:1-t),this.loops(e)},progress:function(t){return null==t?Math.min(1,this._time/this.duration()):this.time(t*this.duration())},step:function(t){if(!this.enabled)return this;t=null==t?16:t,this._time+=t;var e=this.position(),n=this._lastPosition!==e&&this._time>=0;this._lastPosition=e;var i=this.duration(),r=(this._lastTime<0&&this._time,this._lastTime<this._time&&this.time>i);this._lastTime=this._time;var s=this._isDeclarative;if(this.done=!s&&!r&&this._time>=i,n||s){this._initialise(n),this.transforms=new q.Matrix;var o=this._run(s?t:e)}return this.done=this.done||o&&s,this},finish:function(){return this.step(1/0)},reverse:function(t){return this._reverse=null==t?!this._reverse:t,this},ease:function(t){return this._stepper=new q.Ease(t),this},active:function(t){return null==t?this.enabled:(this.enabled=t,this)},tag:function(t){if(null==t)return Object.keys(this.tags);t=Array.isArray(t)?t:[t];for(var e=t.length;e--;)this.tags[t[e]]=!0;return this},untag:function(t){t=Array.isArray(t)?t:[t];for(var e=t.length;e--;)delete this.tags[t[e]];return this},getEventTarget:function(){return this._dispatcher},_rememberMorpher:function(t,e){this._history[t]={morpher:e,caller:this._queue[this._queue.length-1]}},_tryRetarget:function(t,e){if(this._history[t]){if(!this._history[t].caller.initialised){var n=this._queue.indexOf(this._history[t].caller);return this._queue.splice(n,1),!1}this._history[t].caller.isTransform?this._history[t].caller.isTransform(e):this._history[t].morpher.to(e),this._history[t].caller.finished=!1;var i=this.timeline();return i&&i._continue(),!0}return!1},_initialise:function(t){if(t||this._isDeclarative)for(var e=0,n=this._queue.length;e<n;++e){var i=this._queue[e],r=this._isDeclarative||!i.initialised&&t;t=!i.finished,r&&t&&(i.initialiser.call(this),i.initialised=!0)}},_run:function(t){for(var e=!0,n=0,i=this._queue.length;n<i;++n){var r=this._queue[n],s=r.runner.call(this,t);r.finished=r.finished||!0===s,e=e&&r.finished}return e},addTransform:function(t,e){return this.transforms.lmultiplyO(t),this},clearTransform:function(){return this.transforms=new q.Matrix,this}}}),q.Runner.id=0,q.Runner.sanitise=function(t,e,n){var i=1,r=!1,s=0;return t=t||q.defaults.timeline.duration,e=e||q.defaults.timeline.delay,n=n||"last","object"!==c(t)||t instanceof q.Stepper||(e=t.delay||e,
+n=t.when||n,r=t.swing||r,i=t.times||i,s=t.wait||s,t=t.duration||q.defaults.timeline.duration),{duration:t,delay:e,swing:r,times:i,wait:s,when:n}},q.FakeRunner=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new q.Matrix,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1,i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];h(this,t),this.transforms=e,this.id=n,this.done=i}return t}(),q.extend([q.Runner,q.FakeRunner],{mergeWith:function(t){return new q.FakeRunner(t.transforms.lmultiply(this.transforms),t.id)}});var G=function(t,e){return t.lmultiplyO(e)},V=function(t){return t.transforms},H=function(){function t(){h(this,t),this.runners=[],this.ids=[]}return a(t,[{key:"add",value:function(t){if(!this.runners.includes(t)){var e=t.id+1,n=this.ids.reduce(function(t,n){return n>t&&n<e?n:t},0),i=this.ids.indexOf(n)+1;return this.ids.splice(i,0,e),this.runners.splice(i,0,t),this}}},{key:"getByID",value:function(t){return this.runners[this.ids.indexOf(t+1)]}},{key:"remove",value:function(t){var e=this.ids.indexOf(t+1);return this.ids.splice(e,1),this.runners.splice(e,1),this}},{key:"merge",value:function(){var t=this,e=null;return this.runners.forEach(function(n,i){e&&n.done&&e.done&&(t.remove(n.id),t.edit(e.id,n.mergeWith(e))),e=n}),this}},{key:"edit",value:function(t,e){var n=this.ids.indexOf(t+1);return this.ids.splice(n,1,t),this.runners.splice(n,1,e),this}},{key:"length",value:function(){return this.ids.length}},{key:"clearBefore",value:function(t){var e=this.ids.indexOf(t+1)||1;return this.ids.splice(0,e,0),this.runners.splice(0,e,new q.FakeRunner),this}}]),t}();q.extend(q.Element,{_clearTransformRunnersBefore:function(t){this._transformationRunners.clearBefore(t.id)},_currentTransform:function(t){return this._transformationRunners.runners.filter(function(e){return e.id<=t.id}).map(V).reduce(G,new q.Matrix)},addRunner:function(t){this._transformationRunners.add(t),q.Animator.transform_frame(D.bind(this),this._frameId)},_prepareRunner:function(){null==this._frameId&&(this._transformationRunners=(new H).add(new q.FakeRunner(new q.Matrix(this))),this._frameId=q.Element.frameId++)}}),q.Element.frameId=0,q.extend(q.Runner,{attr:function(t,e){return this.styleAttr("attr",t,e)},css:function(t,e){return this.styleAttr("css",t,e)},styleAttr:function(t,e,n){if("object"===c(e))for(var i in n)this.styleAttr(t,i,n[i]);var r=new q.Morphable(this._stepper).to(n);return this.queue(function(){r=r.from(this.element()[t](e))},function(n){return this.element()[t](e,r.at(n)),r.done()}),this},zoom:function(t,e){var n=new q.Morphable(this._stepper).to(new q.Number(t));return this.queue(function(){n=n.from(this.zoom())},function(t){return this.element().zoom(n.at(t),e),n.done()}),this},transform:function(t,e,i){function r(){l=l||this.element(),h=h||j(t,l),d=new q.Matrix(e?void 0:l),l.addRunner(this),e||l._clearTransformRunnersBefore(this)}function s(r){e||this.clearTransform();var s=new q.Point(h).transform(l._currentTransform(this)),o=s.x,m=s.y,v=new q.Matrix(u({},t,{origin:[o,m]})),y=this._isDeclarative&&c?c:d;if(i){v=v.decompose(o,m),y=y.decompose(o,m);var x=v.rotate,g=y.rotate,w=[x-360,x,x+360],b=w.map(function(t){return Math.abs(t-g)}),_=Math.min.apply(Math,n(b)),A=b.indexOf(_);v.rotate=w[A]}e&&(a||(v.rotate=t.rotate||0),this._isDeclarative&&f&&(y.rotate=f)),p.from(y),p.to(v);var M=p.at(r);return f=M.rotate,c=new q.Matrix(M),this.addTransform(c),p.done()}function o(e){(e.origin||"center").toString()!==(t.origin||"center").toString()&&(h=j(t,l)),t=u({},e,{origin:h})}if(e=t.relative||e,this._isDeclarative&&!e&&this._tryRetarget("transform",t))return this;var a=k(t);i=null!=t.affine?t.affine:null!=i?i:!a;var h,l,c,f,d,p=(new q.Morphable).type(i?q.Morphable.TransformBag:q.Matrix).stepper(this._stepper);return this.queue(r,s,o),this._isDeclarative&&this._rememberMorpher("transform",p),this},x:function(t,e){return this._queueNumber("x",t)},y:function(t){return this._queueNumber("y",t)},dx:function(t){return this._queueNumberDelta("dx",t)},dy:function(t){return this._queueNumberDelta("dy",t)},_queueNumberDelta:function(t,e){if(e=new q.Number(e),this._tryRetargetDelta(t,e))return this;var n=new q.Morphable(this._stepper).to(e);return this.queue(function(){var i=this.element()[t]();n.from(i),n.to(i+e)},function(e){return this.element()[t](n.at(e)),n.done()}),this._rememberMorpher(t,n),this},_queueObject:function(t,e){if(this._tryRetarget(t,e))return this;var n=new q.Morphable(this._stepper).to(e);return this.queue(function(){n.from(this.element()[t]())},function(e){return this.element()[t](n.at(e)),n.done()}),this._rememberMorpher(t,n),this},_queueNumber:function(t,e){return this._queueObject(t,new q.Number(e))},cx:function(t){return this._queueNumber("cx",t)},cy:function(t){return this._queueNumber("cy",t)},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},size:function(t,e){var n;return t&&e||(n=this._element.bbox()),t||(t=n.width/n.height*e),e||(e=n.height/n.width*t),this.width(t).height(e)},width:function(t){return this._queueNumber("width",t)},height:function(t){return this._queueNumber("height",t)},plot:function(t,e,n,i){return 4===arguments.length?this.plot([t,e,n,i]):this._queueObject("plot",new this._element.MorphArray(t))},leading:function(t){return this._queueNumber("leading",t)},viewbox:function(t,e,n,i){return this._queueObject("viewbox",new q.Box(t,e,n,i))},update:function(t){return"object"!==c(t)?this.update({offset:arguments[0],color:arguments[1],opacity:arguments[2]}):(null!=t.opacity&&this.attr("stop-opacity",t.opacity),null!=t.color&&this.attr("stop-color",t.color),null!=t.offset&&this.attr("offset",t.offset),this)}}),q.easing={"-":function(t){return t},"<>":function(t){return-Math.cos(t*Math.PI)/2+.5},">":function(t){return Math.sin(t*Math.PI/2)},"<":function(t){return 1-Math.cos(t*Math.PI/2)}};var U=t.performance||Date,$=function(t){var e=t.start,n=t.runner.duration();return{start:e,duration:n,end:e+n,runner:t.runner}};return q.Timeline=q.invent({inherit:q.EventTarget,create:function(){this._timeSource=function(){return U.now()},this._dispatcher=e.createElement("div"),this._startTime=0,this._speed=1,this._reverse=!1,this._persist=0,this._nextFrame=null,this._paused=!1,this._runners=[],this._order=[],this._time=0,this._lastSourceTime=0,this._lastStepTime=0},extend:{getEventTarget:function(){return this._dispatcher},schedule:function(t,e,n){if(null==t)return this._runners.map($).sort(function(t,e){return t.start-e.start||t.duration-e.duration});this.active()||(this._step(),null==n&&(n="now"));var i=0;if(e=e||0,null==n||"last"===n||"after"===n)i=this._startTime;else if("absolute"===n||"start"===n)i=e,e=0;else if("now"===n)i=this._time;else{if("relative"!==n)throw new Error('Invalid value for the "when" parameter');var r=this._runners[t.id];r&&(i=r.start+e,e=0)}return t.unschedule(),t.timeline(this),t.time(-e),this._startTime=i+t.duration()+e,this._runners[t.id]={persist:this.persist(),runner:t,start:i},this._order.push(t.id),this._continue(),this},unschedule:function(t){var e=this._order.indexOf(t.id);return e<0?this:(delete this._runners[t.id],this._order.splice(e,1),t.timeline(null),this)},play:function(){return this._paused=!1,this._continue()},pause:function(){return this._nextFrame=null,this._paused=!0,this},stop:function(){return this.seek(-this._time),this.pause()},finish:function(){return this.seek(1/0),this.pause()},speed:function(t){return null==t?this._speed:(this._speed=t,this)},reverse:function(t){var e=this.speed();if(null==t)return this.speed(-e);var n=Math.abs(e);return this.speed(t?n:-n)},seek:function(t){return this._time+=t,this._continue()},time:function(t){return null==t?this._time:(this._time=t,this)},persist:function(t){return null==t?this._persist:(this._persist=t,this)},source:function(t){return null==t?this._timeSource:(this._timeSource=t,this)},_step:function(){if(!this._paused){var t=this._timeSource(),e=t-this._lastSourceTime,n=this._speed*e+(this._time-this._lastStepTime);this._lastSourceTime=t,this._time+=n,this._lastStepTime=this._time;for(var i=!1,r=0,s=this._order.length;r<s;r++){var o=this._runners[this._order[r]],a=o.runner,h=n,u=this._time-o.start;if(u<0)i=!0;else if(u<h&&(h=u),a.active()){var l=a.step(h).done;if(l){if(!0!==o.persist){var c=a.duration()-a.time()+this._time;c+this._persist<this._time&&(delete this._runners[this._order[r]],this._order.splice(r--,1)&&--s,a.timeline(null))}}else i=!0}}return this._nextFrame=i?q.Animator.frame(this._step.bind(this)):null,this}},_continue:function(){return this._paused?this:(this._nextFrame||(this._nextFrame=q.Animator.frame(this._step.bind(this))),this)},active:function(){return!!this._nextFrame}},parent:q.Element,construct:{timeline:function(){return this._timeline=this._timeline||new q.Timeline,this._timeline}}}),q.Stepper=q.invent({create:function(){}}),q.Ease=q.invent({inherit:q.Stepper,create:function(t){q.Stepper.call(this,t),this.ease=q.easing[t||q.defaults.timeline.ease]||t},extend:{step:function(t,e,n){return"number"!=typeof t?n<1?t:e:t+(e-t)*this.ease(n)},done:function(t,e){return!1}}}),q.easing={"-":function(t){return t},"<>":function(t){return-Math.cos(t*Math.PI)/2+.5},">":function(t){return Math.sin(t*Math.PI/2)},"<":function(t){return 1-Math.cos(t*Math.PI/2)},bezier:function(t,e,n,i){return function(t){}}},q.Controller=q.invent({inherit:q.Stepper,create:function(t){q.Stepper.call(this,t),this.stepper=t},extend:{step:function(t,e,n,i){return this.stepper(t,e,n,i)},done:function(t){return t.done}}}),q.Spring=q.invent({inherit:q.Controller,create:function(t,e){this.duration(t||500).overshoot(e||0)},extend:{step:function(t,e,n,i){if("string"==typeof t)return t;if(i.done=n===1/0,n===1/0)return e;if(0===n)return t;n>100&&(n=16),n/=1e3;var r=i.velocity||0,s=-this.d*r-this.k*(t-e),o=t+r*n+s*n*n/2;return i.velocity=r+s*n,i.done=Math.abs(e-o)+Math.abs(r)<.002,i.done?e:o},duration:R("_duration",I),overshoot:R("_overshoot",I)}}),q.PID=q.invent({inherit:q.Controller,create:function(t,e,n,i){q.Controller.call(this),t=null==t?.1:t,e=null==e?.01:e,n=null==n?0:n,i=null==i?1e3:i,this.p(t).i(e).d(n).windup(i)},extend:{step:function(t,e,n,i){if("string"==typeof t)return t;if(i.done=n===1/0,n===1/0)return e;if(0===n)return t;var r=e-t,s=(i.integral||0)+r*n,o=(r-(i.error||0))/n,a=this.windup;return!1!==a&&(s=Math.max(-a,Math.min(s,a))),i.error=r,i.integral=s,i.done=Math.abs(r)<.001,i.done?e:t+(this.P*r+this.I*s+this.D*o)},windup:R("windup"),p:R("P"),i:R("I"),d:R("D")}}),q});
\ No newline at end of file
index 0f140f97d075362aee17f1e68a47b4a0296b6219..adf37767239c36b9cf8dce35c4990077b4a2f293 100644 (file)
@@ -40,9 +40,10 @@ var parts = [
   'src/pointarray.js',\r
   'src/patharray.js',\r
   'src/number.js',\r
-  'src/event.js',\r
+  'src/eventtarget.js',\r
   'src/HtmlNode.js',\r
   'src/element.js',\r
+  'src/event.js',\r
   'src/matrix.js',\r
   'src/point.js',\r
   'src/attr.js',\r
index 2a9b8d8e2d76e458ba9c4760bc840630a8b6eb04..cdc31de5f151b979114e3fb2da6c8cf04af7bfd4 100644 (file)
@@ -60,7 +60,7 @@
 
 
   <!-- include spec files here... -->
-  <!--
+
   <script src="spec/adopter.js"></script>
   <script src="spec/arrange.js"></script>
   <script src="spec/array.js"></script>
   <script src="spec/ellipse.js"></script>
   <script src="spec/event.js"></script>
   <script src="spec/fx.js"></script>
-  <script src="spec/gradient.js"></script>-->
+  <script src="spec/gradient.js"></script>
   <script src="spec/helper.js"></script>
-  <!--<script src="spec/hyperlink.js"></script>
+  <script src="spec/hyperlink.js"></script>
   <script src="spec/image.js"></script>
   <script src="spec/line.js"></script>
   <script src="spec/marker.js"></script>
-  <script src="spec/mask.js"></script>-->
-  <!--<script src="spec/matrix.js"></script>-->
-  <!--<script src="spec/number.js"></script>
+  <script src="spec/mask.js"></script>
+  <script src="spec/matrix.js"></script>
+  <script src="spec/number.js"></script>
   <script src="spec/path.js"></script>
   <script src="spec/pattern.js"></script>
   <script src="spec/point.js"></script>
   <script src="spec/tspan.js"></script>
   <script src="spec/use.js"></script>
   <script src="spec/utils.js"></script>
-  <script src="spec/viewbox.js"></script> -->
-
+  <script src="spec/viewbox.js"></script>
   <script src="spec/morphing.js"></script>
   <script src="spec/animator.js"></script>
   <script src="spec/runner.js"></script>
+  <script src="spec/queue.js"></script>
 </body>
 </html>
index 5f12172418aa2996f234d56827e7333eaa2735b2..63291518407cd6940f7638050bf3d9be16537a0a 100644 (file)
@@ -205,7 +205,7 @@ describe('Event', function() {
 
       rect.on('event.namespace bla foo.bar otherfoo.bar keepthis', action)
       rect.off('event.namespace bla .bar')
-      
+
       expect(Object.keys(rect.events['event']).length).toBe(0)
       expect(rect.events['bla']).toBeUndefined()
       expect(Object.keys(rect.events['foo']).length).toBe(0)
index e813cf156cfb1e88e2b6d387fe08e74f3ce49214..365a19619506b34b18dfc079315cf4c3e1e96c0c 100644 (file)
-describe('FX', function() {
-  var rect, fx, undefined;
-
-  beforeEach(function() {
-    rect = draw.rect(100,100).move(100,100)
-    fx = rect.animate(500)
-
-    jasmine.clock().install()
-    jasmine.clock().mockDate() // This freeze the Date
-  })
-
-  afterEach(function() {
-    jasmine.clock().uninstall()
-
-    fx.stop(false, true)
-  })
-
-
-  it('creates an instance of SVG.FX and sets parameter', function() {
-    expect(fx instanceof SVG.FX).toBe(true)
-    expect(fx._target).toBe(rect)
-    expect(fx.absPos).toBe(0)
-    expect(fx.pos).toBe(0)
-    expect(fx.lastPos).toBe(0)
-    expect(fx.paused).toBe(false)
-    expect(fx.active).toBe(false)
-    expect(fx._speed).toBe(1)
-    expect(fx.situations).toEqual([])
-    expect(fx.situation.init).toBe(false)
-    expect(fx.situation.reversed).toBe(false)
-    expect(fx.situation.duration).toBe(500)
-    expect(fx.situation.delay).toBe(0)
-    expect(fx.situation.loops).toBe(false)
-    expect(fx.situation.loop).toBe(0)
-    expect(fx.situation.animations).toEqual({})
-    expect(fx.situation.attrs).toEqual({})
-    expect(fx.situation.styles).toEqual({})
-    expect(fx.situation.transforms).toEqual([])
-    expect(fx.situation.once).toEqual({})
-  })
-
-  describe('animate()', function () {
-    it('set duration, ease and delay of the new situation to their default value when they are not passed', function() {
-      var defaultDuration = 1000
-        , defaultEase = SVG.easing['-']
-        , defaultDelay = 0
-        , lastSituation = fx.animate().last()
-
-      expect(lastSituation.duration).toBe(defaultDuration)
-      expect(lastSituation.ease).toBe(defaultEase)
-      expect(lastSituation.delay).toBe(defaultDelay)
-    })
-
-    it('use the passed values to set duration, ease and delay of the new situation', function() {
-      var duration = 14502
-        , ease = '>'
-        , delay = 450
-        , lastSituation = fx.animate(duration, ease, delay).last()
-
-      expect(lastSituation.duration).toBe(duration)
-      expect(lastSituation.ease).toBe(SVG.easing[ease])
-      expect(lastSituation.delay).toBe(delay)
-    })
-
-    it('allow duration, ease and delay to be passed in an object', function() {
-      var o = {
-                duration: 7892
-              , ease: '<'
-              , delay: 1145
-              }
-        , lastSituation = fx.animate(o).last()
-
-      expect(lastSituation.duration).toBe(o.duration)
-      expect(lastSituation.ease).toBe(SVG.easing[o.ease])
-      expect(lastSituation.delay).toBe(o.delay)
-    })
-
-    it('allow ease to be a custom function', function () {
-      var customEase = function() {}
-        , lastSituation = fx.animate({ease: customEase}).last()
-
-      expect(lastSituation.ease).toBe(customEase)
-    })
-  })
-
-  describe('target()', function(){
-    it('returns the current fx object with no argument given', function(){
-      expect(fx.target()).toBe(rect)
-    })
-
-    it('changes the target of the animation when parameter given', function(){
-      var c = draw.circle(5)
-      expect(fx.target(c).target()).toBe(c)
-    })
-  })
-
-
-  describe('timeToAbsPos()', function() {
-    it('converts a timestamp to an absolute progress', function() {
-      expect(fx.timeToAbsPos( fx.situation.start + fx.situation.duration*0.5 )).toBe(0.5)
-    })
-
-    it('should take speed into consideration', function() {
-      var spd
-
-      spd = 4
-      fx.speed(spd)
-      expect(fx.timeToAbsPos( fx.situation.start + (fx.situation.duration/spd)*0.5 )).toBe(0.5)
-
-      spd = 0.5
-      fx.speed(spd)
-      expect(fx.timeToAbsPos( fx.situation.start + (fx.situation.duration/spd)*0.25 )).toBe(0.25)
-    })
-  })
-
-
-  describe('absPosToTime()', function() {
-    it('converts an absolute progress to a timestamp', function() {
-      expect(fx.absPosToTime(0.5)).toBe( fx.situation.start + fx.situation.duration*0.5 )
-    })
-
-    it('should take speed into consideration', function() {
-      var spd
-
-      spd = 4
-      fx.speed(spd)
-      expect(fx.absPosToTime(0.5)).toBe( fx.situation.start + (fx.situation.duration/spd)*0.5 )
-
-      spd = 0.5
-      fx.speed(spd)
-      expect(fx.absPosToTime(0.25)).toBe( fx.situation.start + (fx.situation.duration/spd)*0.25 )
-    })
-  })
-
-
-  describe('atStart()', function () {
-    it('sets the animation at the start', function() {
-      // When the animation is running forward, the start position is 0
-      fx.pos = 0.5
-      expect(fx.atStart().pos).toBe(0)
-
-      // When the animation is running backward, the start position is 1
-      fx.pos = 0.5
-      expect(fx.reverse(true).atStart().pos).toBe(1)
-    })
-
-    it('sets the animation at the start, before any loops', function() {
-      fx.loop(true)
-
-      // When the animation is running forward, the start position is 0
-      fx.at(3.7, true)
-      expect(fx.absPos).toBe(3.7)
-      expect(fx.pos).toBeCloseTo(0.7)
-      expect(fx.situation.loop).toBe(3)
-
-      fx.atStart()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(0)
-      expect(fx.situation.loop).toBe(0)
-
-      // When the animation is running backward, the start position is 1
-      fx.reverse(true).at(2.14, true)
-      expect(fx.absPos).toBe(2.14)
-      expect(fx.pos).toBeCloseTo(1 - 0.14)
-      expect(fx.situation.loop).toBe(2)
-      expect(fx.situation.reversed).toBe(true)
-
-      fx.atStart()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(1)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.reversed).toBe(true)
-    })
-
-    it('sets the animation at the start, before any loops when reversing is true', function() {
-      fx.loop(true, true) // Set reversing to true
-
-      // When the animation is running forward, the start position is 0
-      fx.at(11.21, true)
-      expect(fx.absPos).toBe(11.21)
-      expect(fx.pos).toBeCloseTo(1 - 0.21)
-      expect(fx.situation.loop).toBe(11)
-      expect(fx.situation.reversed).toBe(true)
-
-      fx.atStart()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(0)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.reversed).toBe(false)
-
-      // When the animation is running backward, the start position is 1
-      fx.reverse(true).at(14.10, true)
-      expect(fx.absPos).toBe(14.10)
-      expect(fx.pos).toBeCloseTo(1 - 0.10)
-      expect(fx.situation.loop).toBe(14)
-      expect(fx.situation.reversed).toBe(true)
-
-      fx.atStart()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(1)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.reversed).toBe(true)
-    })
-  })
-
-
-  describe('atEnd()', function () {
-    it('sets the animation at the end', function() {
-      // When the animation is running forward, the end position is 1
-      fx.pos = 0.5
-      expect(fx.atEnd().pos).toBe(1)
-      expect(fx.situation).toBeNull()
-
-      // Recreate an animation since the other one was ended
-      fx.animate()
-
-      // When the animation is running backward, the end position is 0
-      fx.pos = 0.5
-      expect(fx.reverse(true).atEnd().pos).toBe(0)
-      expect(fx.situation).toBeNull()
-    })
-
-    it('sets the animation at the end, after all loops', function() {
-      var loops
-
-      // When the animation is running forward, the end position is 1
-      loops = 12
-      fx.loop(loops).start().step()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(0)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(loops)
-
-      fx.atEnd()
-      expect(fx.absPos).toBe(loops)
-      expect(fx.pos).toBe(1)
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-
-      // Recreate an animation since the other one was ended
-      fx.animate()
-
-
-      // When the animation is running backward, the end position is 0
-      loops = 21
-      fx.reverse(true).loop(loops).start().step()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(1)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(loops)
-      expect(fx.situation.reversed).toBe(true)
-
-      fx.atEnd()
-      expect(fx.absPos).toBe(loops)
-      expect(fx.pos).toBe(0)
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-    })
-
-    it('sets the animation at the end, after all loops when reversing is true', function() {
-      var loops
-
-      // When reversing is true, the end position is 0 when loops is even and
-      // 1 when loops is odd
-
-      // The animation is running forward
-      loops = 6
-      fx.loop(loops, true).start().step()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(0)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(loops)
-      expect(fx.situation.reversed).toBe(false)
-
-      fx.atEnd()
-      expect(fx.absPos).toBe(loops)
-      expect(fx.pos).toBe(0) // End position is 0 because loops is even
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-
-      // Recreate an animation since the other one was ended
-      fx.animate()
-
-      // When reversing is true and the animation is running backward,
-      // the end position is 1 when loops is even and 0 when loops is odd
-
-      // The animation is running backward
-      loops = 3
-      fx.reverse(true).loop(loops, true).start().step()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(1)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(loops)
-      expect(fx.situation.reversed).toBe(true)
-
-      fx.atEnd()
-      expect(fx.absPos).toBe(loops)
-      expect(fx.pos).toBe(0) // End position is 0 because loops is odd
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-    })
-
-    it('sets the animation at the end of the current iteration when in an infinite loop', function () {
-      // When the animation is running forward, the end position is 1
-      fx.loop(true).start().step()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(0)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(true)
-
-      // Should be halfway through iteration 10
-      jasmine.clock().tick(500 * 10 + 250)
-      fx.step()
-      expect(fx.absPos).toBe(10.5)
-      expect(fx.pos).toBe(0.5)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(10)
-      expect(fx.situation.loops).toBe(true)
-
-      fx.atEnd()
-      expect(fx.absPos).toBe(11)
-      expect(fx.pos).toBe(1)
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-
-      // Recreate an animation since the other one was ended
-      fx.animate(500)
-
-      // When the animation is running backward, the end position is 0
-      fx.reverse(true).loop(true).start().step()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(1)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(true)
-      expect(fx.situation.reversed).toBe(true)
-
-      // Should be halfway through iteration 21
-      jasmine.clock().tick(500 * 21 + 250)
-      fx.step()
-      expect(fx.absPos).toBe(21.5)
-      expect(fx.pos).toBe(0.5)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(21)
-      expect(fx.situation.loops).toBe(true)
-
-      fx.atEnd()
-      expect(fx.absPos).toBe(22)
-      expect(fx.pos).toBe(0)
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-    })
-
-
-    it('sets the animation at the end of the current iteration when in an infinite loop and reversing is true', function () {
-      // When reversing is true, the end position is 1 when ending on an even
-      // iteration and 0 when ending on an odd iteration as illustrated below:
-
-      //   0          Iteration          1
-      //   |--------------0------------->|
-      //   |<-------------1--------------|
-      //   |--------------2------------->|
-      //   |<-------------3--------------|
-      //                 ...
-
-
-      // The animation is running forward
-      fx.loop(true, true).start().step()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(0)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(true)
-
-      // Should be halfway through iteration 11
-      jasmine.clock().tick(500 * 11 + 250)
-      fx.step()
-      expect(fx.absPos).toBe(11.5)
-      expect(fx.pos).toBe(0.5)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(11)
-      expect(fx.situation.loops).toBe(true)
-
-      fx.atEnd()
-      expect(fx.absPos).toBe(12)
-      expect(fx.pos).toBe(0) // End position is 0 because ended on a odd iteration
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-
-      // Recreate an animation since the other one was ended
-      fx.animate(500)
-
-      // When reversing is true and the animation is running backward,
-      // the end position is 0 when ending on an even iteration and
-      // 1 when ending on an odd iteration as illustrated below:
-
-      //   0          Iteration          1
-      //   |<-------------0--------------|
-      //   |--------------1------------->|
-      //   |<-------------2--------------|
-      //   |--------------3------------->|
-      //                 ...
-
-      // The animation is running backward
-      fx.reverse(true).loop(true).start().step()
-      expect(fx.absPos).toBe(0)
-      expect(fx.pos).toBe(1)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(true)
-      expect(fx.situation.reversed).toBe(true)
-
-      // Should be halfway through iteration 42
-      jasmine.clock().tick(500 * 42 + 250)
-      fx.step()
-      expect(fx.absPos).toBe(42.5)
-      expect(fx.pos).toBe(0.5)
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(42)
-      expect(fx.situation.loops).toBe(true)
-
-      fx.atEnd()
-      expect(fx.absPos).toBe(43)
-      expect(fx.pos).toBe(0) // End position is 0 because ended on an even iteration
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-    })
-  })
-
-
-  describe('at()', function() {
-    it('sets the progress to the specified position', function() {
-      var pos
-
-      // Animation running forward
-      pos = 0.5
-      expect(fx.at(pos).pos).toBe(pos)
-      expect(fx.situation.start).toBe(+new Date - fx.situation.duration * pos)
-
-      // Animation running backward
-      pos = 0.4
-      expect(fx.reverse(true).at(pos).pos).toBe(pos)
-      expect(fx.situation.start).toBe(+new Date - fx.situation.duration * (1-pos))
-    })
-
-    it('should convert a position to an absolute position', function () {
-      var pos, loop, absPos
-
-      fx.loop(true)
-
-      // Animation running forward
-      pos = 0.7
-      loop = 4
-      absPos = pos+loop
-      fx.situation.loop = loop
-      expect(fx.at(pos).absPos).toBe(absPos)
-      expect(fx.situation.start).toBe(+new Date - fx.situation.duration * absPos)
-
-      // Animation running backward
-      pos = 0.23
-      loop = 9
-      absPos = (1-pos)+loop
-      fx.situation.loop = loop
-      fx.situation.reversed = true
-      expect(fx.at(pos).absPos).toBe(absPos)
-      expect(fx.situation.start).toBe(+new Date - fx.situation.duration * absPos)
-
-    })
-
-    it('should end the animation when the end position is passed', function() {
-      var pos
-
-      fx.start()
-      expect(fx.active).toBe(true)
-      expect(fx.situation).not.toBeNull()
-
-      // When running forward, the end position is 1
-      pos = 1
-      expect(fx.at(pos).pos).toBe(pos)
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-
-      // Recreate an animation since the other one was ended
-      fx.animate().start()
-      expect(fx.active).toBe(true)
-      expect(fx.situation).not.toBeNull()
-
-      // When running backward, the end position is 0
-      pos = 0
-      expect(fx.reverse(true).at(pos).pos).toBe(pos)
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-    })
-
-    it('correct the passed position when it is out of [0,1] and the animation is not looping', function () {
-      var pos
-
-      pos = -0.7
-      expect(fx.at(pos).pos).toBe(0)
-
-      pos = 1.3
-      expect(fx.at(pos).pos).toBe(1)
-
-      // Recreate an animation since the other one was ended
-      fx.animate()
-
-      // Should work even when animation is running backward
-      pos = 1.3
-      expect(fx.reverse(true).at(pos).pos).toBe(1)
-
-      pos = -0.7
-      expect(fx.reverse(true).at(pos).pos).toBe(0)
-    })
-
-    it('should, when the animation is looping and the passed position is out of [0,1], use the integer part of postion to update the loop counter and set position to its fractional part', function(){
-      var loop, pos, posFrac, posInt
-
-      // Without the reverse flag
-      fx.loop(10)
-      expect(fx.situation.loops).toBe(10)
-      expect(fx.situation.loop).toBe(loop = 0)
-
-      pos = 1.3
-      posFrac = pos % 1
-      posInt = pos - posFrac
-      expect(fx.at(pos).pos).toBeCloseTo(posFrac)
-      expect(fx.situation.loop).toBe(loop += posInt)
-
-      pos = 7.723
-      posFrac = pos % 1
-      posInt = pos - posFrac
-      expect(fx.at(pos).pos).toBeCloseTo(posFrac)
-      expect(fx.situation.loop).toBe(loop += posInt)
-
-      // In this case, pos is above the remaining number of loops, so we expect
-      // the position to be set to 1 and the animation to be ended
-      pos = 4.3
-      posFrac = pos % 1
-      posInt = pos - posFrac
-      expect(fx.at(pos).pos).toBe(1)
-      expect(fx.situation).toBeNull()
-
-      // Recreate an animation since the other one was ended
-      fx.animate()
-
-      // With the reverse flag, the position is reversed each time loop is odd
-      fx.loop(10, true)
-      expect(fx.situation.loops).toBe(10)
-      expect(fx.situation.loop).toBe(loop = 0)
-      expect(fx.situation.reversed).toBe(false)
-
-      pos = 3.3
-      posFrac = pos % 1
-      posInt = pos - posFrac
-      expect(fx.at(pos).pos).toBeCloseTo(1-posFrac) // Animation is reversed because 0+3 is odd
-      expect(fx.situation.loop).toBe(loop += posInt)
-      expect(fx.situation.reversed).toBe(true)
-
-      // When the passed position is below 0, the integer part of position is
-      // substracted from 1, so, in this case, -0.6 has 1 as is integer part
-      // This is necessary so we can add something to the loop counter
-      pos = -0.645
-      posFrac = (1-pos) % 1
-      posInt = (1-pos) - posFrac
-      expect(fx.at(pos).pos).toBeCloseTo(posFrac)
-      expect(fx.situation.loop).toBe(loop += posInt)
-      expect(fx.situation.reversed).toBe(false)
-
-      // In this case, pos is above the remaining number of loop, so we expect
-      // the position to be set to 0 (since we end reversed) and the animation to
-      // be ended
-      pos = 7.2
-      posFrac = pos % 1
-      posInt = pos - posFrac
-      expect(fx.at(pos).pos).toBe(0)
-      expect(fx.situation).toBeNull()
-    })
-
-    it('should, when the animation is in a infinite loop and the passed position is out of [0,1], use the integer part of postion to update the loop counter and set position to its fractional part', function(){
-      var loop, pos, posFrac, posInt
-
-      // Without the reverse flag
-      fx.loop(true)
-      expect(fx.situation.loops).toBe(true)
-      expect(fx.situation.loop).toBe(loop = 0)
-
-      pos = 10.34
-      posFrac = pos % 1
-      posInt = pos - posFrac
-      expect(fx.at(pos).pos).toBeCloseTo(posFrac)
-      expect(fx.situation.loop).toBe(loop += posInt)
-
-      // With the reverse flag, the position is reversed each time loop is odd
-      fx.loop(true, true)
-      expect(fx.situation.loops).toBe(true)
-      expect(fx.situation.loop).toBe(loop = 0)
-      expect(fx.situation.reversed).toBe(false)
-
-      pos = 3.3
-      posFrac = pos % 1
-      posInt = pos - posFrac
-      expect(fx.at(pos).pos).toBeCloseTo(1-posFrac) // Animation is reversed because 3+0 is odd
-      expect(fx.situation.loop).toBe(loop += posInt)
-      expect(fx.situation.reversed).toBe(true)
-
-      pos = -8.41
-      posFrac = (1-pos) % 1
-      posInt = (1-pos) - posFrac
-      expect(fx.at(pos).pos).toBeCloseTo(posFrac)
-      expect(fx.situation.loop).toBe(loop += posInt)
-      expect(fx.situation.reversed).toBe(false)
-    })
-
-    it('should take speed into consideration', function() {
-      var dur, spd
-
-      dur = fx.situation.duration
-
-      spd = 4
-      fx.speed(spd).at(0)
-      expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
-
-      spd = 5
-      fx.speed(spd).at(0.15)
-      expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
-
-      spd = 0.25
-      fx.speed(spd).at(0.75)
-      expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
-
-      spd = 0.5
-      fx.speed(spd).at(0.83)
-      expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
-    })
-
-    it('should consider the first parameter as an absolute position when the second parameter is true', function() {
-      var absPos
-
-      fx.loop(true)
-
-      absPos = 3.2
-      expect(fx.at(absPos, true).absPos).toBe(absPos)
-
-      absPos = -4.27
-      expect(fx.at(absPos, true).absPos).toBe(absPos)
-
-      absPos = 0
-      expect(fx.at(absPos, true).absPos).toBe(absPos)
-
-      absPos = 1
-      expect(fx.at(absPos, true).absPos).toBe(absPos)
-    })
-  })
-
-
-  describe('start()', function(){
-    it('starts the animation', function() {
-      fx.start()
-      expect(fx.active).toBe(true)
-
-      jasmine.clock().tick(200)
-      fx.step() // Call step to update the animation
-
-      expect(fx.pos).toBeGreaterThan(0)
-    })
-
-    it('should take speed into consideration', function() {
-      var dur = 500
-        , delay = 300
-        , spd = 4
-
-
-      fx.stop().animate(dur, '-', delay).speed(spd).start()
-      expect(fx.situation.finish - new Date).toBe(delay/spd + dur/spd)
-    })
-
-    it('should do the delay', function() {
-      fx.situation.delay = 1000
-      expect(fx.start().active).toBe(true)
-
-      jasmine.clock().tick(501)
-      fx.step() // Call step to update the animation
-      expect(fx.active).toBe(true)
-
-      jasmine.clock().tick(501)
-      fx.step() // Call step to update the animation
-      expect(fx.active).toBe(true)
-
-      jasmine.clock().tick(501)
-      fx.step() // Call step to update the animation
-      expect(fx.active).toBe(false)
-    })
-  })
-
-  describe('delay()', function() {
-    it('should push an empty situation with its duration attribute set to the duration of the delay', function() {
-      var delay = 8300
-      fx.delay(delay)
-      expect(fx.situations[0].duration).toBe(delay)
-    })
-  })
-
-
-  describe('pause()', function() {
-    it('pause the animation', function() {
-      expect(fx.pause().paused).toBe(true)
-    })
-  })
-
-  describe('play()', function() {
-    it('returns itself when animation not paused', function() {
-      expect(fx.paused).toBe(false)
-      expect(fx.play()).toBe(fx)
-    })
-
-    it('unpause the animation', function() {
-      var start = fx.start().pause().situation.start
-
-      jasmine.clock().tick(200)
-
-      expect(fx.situation.start).toBe(start)
-      expect(fx.play().paused).toBe(false)
-      expect(fx.situation.start).not.toBe(start)
-    })
-
-    it('should not change the position when the animation is unpaused while it is set to run backward', function(){
-      var pos = 0.4
-
-      expect(fx.reverse(true).at(pos).pause().play().pos).toBe(pos)
-    })
-
-    it('should be able to unpause the delay', function () {
-      fx.stop().animate(500, '-', 300).start().step()
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBeCloseTo(-0.6)
-
-      // At this point, we should have an animation of 500 ms with a delay of
-      // 300 ms that should be running.
-
-      jasmine.clock().tick(150)
-
-      // Should be halfway through the delay
-      fx.step()
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(-0.3)
-
-      expect(fx.pause().paused).toBe(true) // Pause the delay
-
-      jasmine.clock().tick(150)
-
-      // Unpause, should still be halfway through the delay
-      expect(fx.play().paused).toBe(false)
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(-0.3)
-
-      jasmine.clock().tick(150)
-
-      // Delay should be done
-      fx.step()
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(0)
-
-      jasmine.clock().tick(500)
-
-      // Animation and delay should be done
-      fx.step()
-      expect(fx.active).toBe(false)
-      expect(fx.pos).toBe(1)
-      expect(fx.absPos).toBe(1)
-    })
-  })
-
-
-  describe('speed()', function() {
-    it('set the speed of the animation', function(){
-      var dur, spd
-
-      dur = fx.situation.duration
-
-      spd = 2
-      fx.speed(spd)
-      expect(fx._speed).toBe(spd)
-      expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
-
-      spd = 0.5
-      fx.speed(spd)
-      expect(fx._speed).toBe(spd)
-      expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
-
-      spd = 2
-      fx.at(0.2).speed(spd)
-      expect(fx._speed).toBe(spd)
-      expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
-
-      spd = 1
-      fx.speed(spd)
-      expect(fx._speed).toBe(spd)
-      expect(fx.situation.finish-fx.situation.start).toBe(dur)
-    })
-
-    it('should not change the position when the animation is run backward', function(){
-      var pos = 0.4
-
-      expect(fx.reverse(true).at(pos).speed(2).pos).toBe(pos)
-    })
-
-    it('return the current speed with no argument given', function(){
-      var spd
-
-      spd = 2
-      fx._speed = spd
-      expect(fx.speed()).toBe(spd)
-
-      spd = 0.5
-      fx._speed = spd
-      expect(fx.speed()).toBe(spd)
-
-      spd = 1
-      fx._speed = spd
-      expect(fx.speed()).toBe(spd)
-    })
-
-    it('pause the animation when a speed of 0 is passed', function(){
-      var spd = fx._speed
-
-      expect(fx.speed(0)).toBe(fx)
-      expect(fx._speed).toBe(spd)
-      expect(fx.paused).toBe(true)
-    })
-
-    it('should affect all animations in the queue', function(){
-      fx.speed(2).animate(300)
-      expect(fx.situations.length).not.toBe(0)
-      expect(fx.pos).not.toBe(1)
-
-      // At this point, there should be 2 animations in the queue to be played:
-      // the one of 500ms that is added before every test and the one of 300ms
-      // we just added. Normally, it would take 800ms before both of these
-      // animations are done, but because we set the speed to 2, it should
-      // only take 400ms to do both animations.
-      fx.start().step()
-
-      jasmine.clock().tick(250)
-
-      // Should be playing the second animation
-      fx.step()
-      expect(fx.active).toBe(true)
-      expect(fx.situations.length).toBe(0)
-      expect(fx.pos).not.toBe(1)
-
-      jasmine.clock().tick(150) // 400ms have passed
-
-      // All animations should be done
-      fx.step()
-      expect(fx.active).toBe(false)
-      expect(fx.situations.length).toBe(0)
-      expect(fx.pos).toBe(1)
-    })
-
-    it('should affect the delay', function() {
-      fx.stop().animate(500, '-', 300).start().step()
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBeCloseTo(-0.6)
-
-      fx.speed(2)
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBeCloseTo(-0.6)
-
-      // At this point, we should have an animation of 500 ms with a delay of
-      // 300 ms that should be running. Normally, it would take 800 ms for the
-      // animation and its delay to complete, but because the speed is set to 2
-      // , it should only take 400ms
-
-      jasmine.clock().tick(75)
-
-      // Should be halfway through the delay
-      fx.step()
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(-0.3)
-
-      jasmine.clock().tick(75)
-
-      // Delay should be done
-      fx.step()
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(0)
-
-      jasmine.clock().tick(250)
-
-      // Animation and delay should be done
-      fx.step()
-      expect(fx.active).toBe(false)
-      expect(fx.pos).toBe(1)
-      expect(fx.absPos).toBe(1)
-    })
-  })
-
-
-  describe('reverse()', function() {
-    it('toggles the direction of the animation without a parameter', function() {
-      expect(fx.reverse().situation.reversed).toBe(true)
-    })
-    it('sets the direction to backwards with true given', function() {
-      expect(fx.reverse(true).situation.reversed).toBe(true)
-    })
-    it('sets the direction to forwards with false given', function() {
-      expect(fx.reverse(false).situation.reversed).toBe(false)
-    })
-  })
-
-
-  describe('queue()', function() {
-    it('can add a situation to the queue', function() {
-      var situation = new SVG.Situation({duration: 1000, delay: 0, ease: SVG.easing['-']})
-
-      fx.queue(situation)
-      expect(fx.situations[0]).toBe(situation)
-    })
-
-    it('can add a function to the queue', function() {
-      var f = function(){}
-
-      fx.queue(f)
-      expect(fx.situations[0]).toBe(f)
-    })
-
-    it('should set the situation attribute before pushing something in the situations queue', function(){
-      var situation = new SVG.Situation({duration: 1000, delay: 0, ease: SVG.easing['-']})
-
-      // Clear the animation that is created before each test
-      fx.stop()
-
-      expect(fx.situation).toBeNull()
-      expect(fx.situations.length).toBe(0)
-      fx.queue(situation)
-      expect(fx.situation).toBe(situation)
-      expect(fx.situations.length).toBe(0)
-    })
-  })
-
-
-  describe('dequeue()', function() {
-    it('should pull the next situtation from the queue', function() {
-      var situation = new SVG.Situation({duration: 1000, delay: 0, ease: SVG.easing['-']})
-
-      fx.queue(situation)
-      expect(fx.situtation).not.toBe(situation)
-      expect(fx.situations[0]).toBe(situation)
-
-      fx.dequeue()
-      expect(fx.situation).toBe(situation)
-      expect(fx.situations.length).toBe(0)
-    })
-
-    it('initialize the animation pulled from the queue to its start position', function() {
-      // When the animation is forward, the start position is 0
-      fx.animate()
-      fx.pos = 0.5
-      expect(fx.dequeue().pos).toBe(0)
-
-      // When the animation backward, the start position is 1
-      fx.animate().reverse(true)
-      fx.pos = 0.5
-      expect(fx.dequeue().pos).toBe(1)
-    })
-
-    it('when the first element of the queue is a function, it should execute it', function() {
-      var called = false
-
-      fx.queue(function(){
-        called = true
-        expect(this).toBe(fx)
-        this.dequeue()
-      }).dequeue()
-
-      expect(called).toBe(true)
-    })
-
-    it('should stop the currently running animation when there is one', function() {
-      fx.start()
-      expect(fx.active).toBe(true)
-      fx.queue(function() {
-        expect(this.active).toBe(false)
-        this.dequeue()
-      })
-      fx.dequeue()
-    })
-  })
-
-
-  describe('stop()', function() {
-    it('stops the animation immediately without a parameter', function() {
-      fx.animate(500).start()
-      expect(fx.stop().situation).toBeNull()
-      expect(fx.active).toBe(false)
-      expect(fx.situations.length).toBe(1)
-    })
-    it('stops the animation immediately and fullfill it if first parameter true', function() {
-      fx.animate(500).start()
-      expect(fx.stop(true).situation).toBeNull()
-      expect(fx.active).toBe(false)
-      expect(fx.pos).toBe(1)
-      expect(fx.situations.length).toBe(1)
-    })
-    it('stops the animation immediately and remove all items from queue when second parameter true', function() {
-      fx.animate(500).start()
-      expect(fx.stop(false, true).situation).toBeNull()
-      expect(fx.active).toBe(false)
-      expect(fx.situations.length).toBe(0)
-    })
-  })
-
-
-  describe('reset()', function() {
-    it('resets the element to the state it was when the current animation was started', function() {
-      var loops = 4
-        , situation = fx.situation
-
-      // These settings make the animations run backward
-      fx.situation.loop = 2
-      fx.situation.loops = loops
-      fx.situation.reversed = true
-      fx.pos = 0.5
-      fx.absPos = 2.5
-
-      fx.reset()
-
-      expect(fx.situation).toBe(situation)
-      expect(fx.situation.loops).toBe(loops)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.reversed).toBe(true) // True because the animation is backward
-      expect(fx.pos).toBe(1)
-      expect(fx.absPos).toBe(0)
-    })
-  })
-
-
-  describe('finish()', function() {
-    it('finish the whole animation by fullfilling every single one', function() {
-      fx.animate(500)
-      expect(fx.finish().pos).toBe(1)
-      expect(fx.situations.length).toBe(0)
-      expect(fx.situation).toBeNull()
-    })
-  })
-
-
-  describe('progress()', function() {
-    it('returns the current position', function() {
-      expect(fx.progress()).toBe(0)
-      expect(fx.progress()).toBe(fx.pos)
-    })
-    it('returns the current position as eased value if fist argument is true', function() {
-      var anim = draw.rect(100,100).animate(500,'>').start()
-      expect(anim.progress(true)).toBe(0)
-
-      anim.at(0.25)
-      expect(anim.progress(true)).toBeCloseTo(anim.situation.ease(0.25))
-    })
-  })
-
-
-  describe('after()', function() {
-    it('adds a callback which is called when the current animation is finished', function() {
-      var called = false
-
-      fx.start().after(function(situation){
-        expect(fx.situation).toBe(situation)
-        expect(fx.pos).toBe(1)
-        called = true
-      })
-
-      jasmine.clock().tick(500)
-      fx.step()
-      expect(called).toBe(true)
-    })
-  })
-
-
-  describe('afterAll()', function() {
-    it('adds a callback which is called when all animations are finished', function() {
-      var called = false
-
-      fx.animate(150).animate(125).start().afterAll(function(){
-        expect(fx.pos).toBe(1)
-        expect(fx.situations.length).toBe(0)
-        called = true
-      })
-
-      expect(fx.situations.length).toBe(2)
-
-      // End of the first animation
-      jasmine.clock().tick(500)
-      fx.step()
-      expect(fx.situations.length).toBe(1)
-      expect(called).toBe(false)
-
-      // End of the second animation
-      jasmine.clock().tick(150)
-      fx.step()
-      expect(fx.situations.length).toBe(0)
-      expect(called).toBe(false)
-
-      // End of the third and last animation
-      jasmine.clock().tick(125)
-      fx.step()
-      expect(fx.situation).toBeNull()
-      expect(called).toBe(true)
-    })
-  })
-
-
-  describe('during()', function() {
-    it('adds a callback which is called on every animation step', function() {
-      var called = 0
-
-      fx.start().during(function(pos, morph, eased, situation){
-
-        expect(fx.situation).toBe(situation)
-
-        switch(++called) {
-          case 1:
-            expect(pos).toBeCloseTo(0.25)
-            break
-
-          case 2:
-            expect(pos).toBeCloseTo(0.5)
-            break
-
-          case 3:
-            expect(pos).toBeCloseTo(0.65)
-            break
-
-          case 4:
-            expect(pos).toBe(1)
-            break
-        }
-
-        expect(morph(0, 100)).toBeCloseTo(pos*100)
-
-      })
-
-      jasmine.clock().tick(125)
-      fx.step()
-      expect(called).toBe(1)
-
-      jasmine.clock().tick(125) // 250 ms have passed
-      fx.step()
-      expect(called).toBe(2)
-
-      jasmine.clock().tick(75) // 325 ms have passed
-      fx.step()
-      expect(called).toBe(3)
-
-      jasmine.clock().tick(175) // 500 ms have passed
-      fx.step()
-      expect(called).toBe(4)
-    })
-  })
-
-
-  describe('duringAll()', function() {
-    it('adds a callback which is called on every animation step for the whole chain', function() {
-
-      fx.finish()
-      rect.off('.fx')
-
-      fx.animate(500).start().animate(500)
-
-      var sit = null
-
-      var pos1 = false
-      var pos2 = false
-
-      fx.duringAll(function(pos, morph, eased, situation){
-
-        if(pos1){
-          pos1 = false
-          sit = situation
-          expect(this.fx.pos).toBeCloseTo(0.6)
-        }
-
-        if(pos2){
-          pos2 = null
-          expect(situation).not.toBe(sit)
-          expect(this.fx.pos).toBeCloseTo(0.75)
-        }
-      })
-
-      pos1 = true
-      jasmine.clock().tick(300)
-      fx.step()
-
-      jasmine.clock().tick(200) // End of the first animation
-      fx.step()
-
-      pos2 = true
-      jasmine.clock().tick(375)
-      fx.step()
-
-      if(pos1 || pos2) {
-        fail('Not enough situations called')
-      }
-    })
-  })
-
-
-  describe('once()', function() {
-    it('adds a callback which is called once at the specified position', function() {
-      var called = false
-
-      fx.start().once(0.5, function(pos, eased){
-        called = true
-        expect(pos).toBeCloseTo(0.5)
-      })
-
-      jasmine.clock().tick(125)
-      fx.step()
-      expect(called).toBe(false)
-
-      jasmine.clock().tick(125) // 250 ms have passed
-      fx.step()
-      expect(called).toBe(true)
-    })
-
-    it('adds the callback on the last situation', function () {
-      var callback = function () {}
-
-      fx.animate(500).animate(500).once(0.5, callback)
-      expect(fx.situation.once['0.5']).toBeUndefined()
-      expect(fx.situations[0].once['0.5']).toBeUndefined()
-      expect(fx.situations[1].once['0.5']).toBe(callback)
-    })
-  })
-
-
-  describe('loop()', function() {
-    it('should create an eternal loop when no arguments are given', function() {
-      var time = 10523, dur = fx.situation.duration
-
-      fx.loop()
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(true)
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(0)
-
-      fx.start().step()
-      jasmine.clock().tick(time)
-      fx.step()
-
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe( Math.floor(time/dur) )
-      expect(fx.situation.loops).toBe(true)
-      expect(fx.pos).toBeCloseTo((time/dur) % 1)
-      expect(fx.absPos).toBeCloseTo(time/dur)
-    })
-
-    it('should create an eternal loop when the first argument is true', function() {
-      var time = 850452, dur = fx.situation.duration
-
-      fx.loop(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(true)
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(0)
-
-      fx.start().step()
-      jasmine.clock().tick(time)
-      fx.step()
-
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe( Math.floor(time/dur) )
-      expect(fx.situation.loops).toBe(true)
-      expect(fx.pos).toBeCloseTo((time/dur) % 1)
-      expect(fx.absPos).toBeCloseTo(time/dur)
-    })
-
-    it('should loop for the specified number of times', function() {
-      var time = 0, dur = fx.situation.duration
-
-      fx.loop(3)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(3)
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(0)
-
-      fx.start().step()
-      jasmine.clock().tick(200)
-      time = 200
-
-      fx.step()
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(3)
-      expect(fx.pos).toBeCloseTo((time/dur) % 1)
-      expect(fx.absPos).toBeCloseTo(time/dur)
-
-      jasmine.clock().tick(550)
-      time += 550 // time at 750
-
-      fx.step()
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(1)
-      expect(fx.situation.loops).toBe(3)
-      expect(fx.pos).toBeCloseTo((time/dur) % 1)
-      expect(fx.absPos).toBeCloseTo(time/dur)
-
-      jasmine.clock().tick(570)
-      time += 570 // time at 1320
-
-      fx.step()
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(2)
-      expect(fx.situation.loops).toBe(3)
-      expect(fx.pos).toBeCloseTo((time/dur) % 1)
-      expect(fx.absPos).toBeCloseTo(time/dur)
-
-      jasmine.clock().tick(180)
-      time += 180 // time at 1500
-
-      fx.step()
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-      expect(fx.pos).toBe(1)
-      expect(fx.absPos).toBe(3)
-    })
-
-    it('should go from beginning to end and start over again (0->1.0->1.0->1.) by default', function() {
-      var time = 0, dur = fx.situation.duration
-
-      fx.loop(2)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(2)
-      expect(fx.situation.reversing).toBe(false)
-      expect(fx.situation.reversed).toBe(false)
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(0)
-
-      fx.start().step()
-      jasmine.clock().tick(325)
-      time = 325
-
-      fx.step()
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(2)
-      expect(fx.situation.reversing).toBe(false)
-      expect(fx.situation.reversed).toBe(false)
-      expect(fx.pos).toBeCloseTo((time/dur) % 1)
-      expect(fx.absPos).toBeCloseTo(time/dur)
-
-      jasmine.clock().tick(575)
-      time += 575 // time at 900
-
-      fx.step()
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(1)
-      expect(fx.situation.loops).toBe(2)
-      expect(fx.situation.reversing).toBe(false)
-      expect(fx.situation.reversed).toBe(false)
-      expect(fx.pos).toBeCloseTo((time/dur) % 1)
-      expect(fx.absPos).toBeCloseTo(time/dur)
-
-      jasmine.clock().tick(200)
-      time += 200 // time at 1100
-
-      fx.step()
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-      expect(fx.pos).toBe(1)
-      expect(fx.absPos).toBe(2)
-    })
-
-    it('should be completely reversed before starting over (0->1->0->1->0->1.) when the reverse flag is passed', function() {
-      var time = 0, dur = fx.situation.duration
-
-      fx.loop(2, true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(2)
-      expect(fx.situation.reversing).toBe(true)
-      expect(fx.situation.reversed).toBe(false)
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(0)
-
-      fx.start().step()
-      jasmine.clock().tick(325)
-      time = 325
-
-      fx.step()
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(2)
-      expect(fx.situation.reversing).toBe(true)
-      expect(fx.situation.reversed).toBe(false)
-      expect(fx.pos).toBeCloseTo((time/dur) % 1)
-      expect(fx.absPos).toBeCloseTo(time/dur)
-
-      jasmine.clock().tick(575)
-      time += 575 // time at 900
-
-      fx.step()
-      expect(fx.active).toBe(true)
-      expect(fx.situation.loop).toBe(1)
-      expect(fx.situation.loops).toBe(2)
-      expect(fx.situation.reversing).toBe(true)
-      expect(fx.situation.reversed).toBe(true)
-      expect(fx.pos).toBeCloseTo(1 - (time/dur) % 1)
-      expect(fx.absPos).toBeCloseTo(time/dur)
-
-      jasmine.clock().tick(200)
-      time += 200 // time at 1100
-
-      fx.step()
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-      expect(fx.pos).toBe(0)
-      expect(fx.absPos).toBe(2)
-    })
-
-    it('should be applied on the last situation', function() {
-      fx.loop(5)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(5)
-      expect(fx.situation.reversing).toBe(false)
-
-      fx.animate().loop(3, true)
-      expect(fx.situation.loop).toBe(0)
-      expect(fx.situation.loops).toBe(5)
-      expect(fx.situation.reversing).toBe(false)
-
-      var c = fx.last()
-      expect(c.loop).toBe(0)
-      expect(c.loops).toBe(3)
-      expect(c.reversing).toBe(true)
-    })
-
-    it('should be possible to call it with false as the first argument', function() {
-      fx.situation.loops = true
-      fx.loop(false)
-      expect(fx.situation.loops).toBe(false)
-    })
-  })
-
-
-  describe('step()', function() {
-    it('should not recalculate the absolute position if the first parameter is true', function() {
-      var absPos
-
-      // We shift start to help us see if the absolute position get recalculated
-      // If it get recalculated, the result would be 0.5
-      fx.situation.start -= 250
-
-      absPos = 0.4
-      fx.absPos = absPos
-      expect(fx.step(true).absPos).toBe(absPos)
-
-      absPos = 0
-      fx.absPos = absPos
-      expect(fx.step(true).absPos).toBe(absPos)
-
-      absPos = -3.7
-      fx.absPos = absPos
-      expect(fx.step(true).absPos).toBe(absPos)
-
-      absPos = 1
-      fx.absPos = absPos
-      expect(fx.step(true).absPos).toBe(absPos)
-    })
-
-    it('should not allow an absolute position to be above the end', function() {
-      var absPos, loops
-
-      // With no loops, absolute position should not go above 1
-      absPos = 4.26
-      fx.absPos = absPos
-      expect(fx.step(true).absPos).toBe(1)
-      expect(fx.situation).toBeNull()
-
-      fx.animate() // Recreate an animation since the other one was ended
-
-      // With loops, absolute position should not go above loops
-      loops = 4
-      absPos = 7.42
-      fx.absPos = absPos
-      expect(fx.loop(loops).step(true).absPos).toBe(loops)
-      expect(fx.situation).toBeNull()
-    })
-
-    describe('when converting an absolute position to a position', function() {
-      it('should, when the absolute position is below the maximum number of loops, use the integer part of the absolute position to set the loop counter and use its fractional part to set the position', function(){
-        var absPos, absPosFrac, absPosInt, loops
-
-        // Without the reverse flag
-        loops = 12
-        absPos = 4.52
-        absPosInt = Math.floor(absPos)
-        absPosFrac = absPos - absPosInt
-        fx.absPos = absPos
-        fx.loop(loops).step(true)
-        expect(fx.pos).toBe(absPosFrac)
-        expect(fx.situation.loop).toBe(absPosInt)
-
-        fx.stop().animate()
-
-        loops = true
-        absPos = 2.57
-        absPosInt = Math.floor(absPos)
-        absPosFrac = absPos - absPosInt
-        fx.absPos = absPos
-        fx.loop(loops).step(true)
-        expect(fx.pos).toBe(absPosFrac)
-        expect(fx.situation.loop).toBe(absPosInt)
-
-        fx.stop().animate()
-
-        // With the reverse flag, the position is reversed at each odd loop
-        loops = 412
-        absPos = 6.14
-        absPosInt = Math.floor(absPos)
-        absPosFrac = absPos - absPosInt
-        fx.absPos = absPos
-        fx.loop(loops, true).step(true)
-        expect(fx.pos).toBe(absPosFrac)
-        expect(fx.situation.loop).toBe(absPosInt)
-        expect(fx.situation.reversed).toBe(false)
-
-        fx.stop().animate()
-
-        loops = true
-        absPos = 5.12
-        absPosInt = Math.floor(absPos)
-        absPosFrac = absPos - absPosInt
-        fx.absPos = absPos
-        fx.loop(loops, true).step(true)
-        expect(fx.pos).toBe(1-absPosFrac) // Odd loop, so it is reversed
-        expect(fx.situation.loop).toBe(absPosInt)
-        expect(fx.situation.reversed).toBe(true)
-
-        fx.stop().animate()
-
-        // When the animation is set to run backward, it is the opposite, the position is reversed at each even loop
-        loops = 14
-        absPos = 8.46
-        absPosInt = Math.floor(absPos)
-        absPosFrac = absPos - absPosInt
-        fx.absPos = absPos
-        fx.reverse(true).loop(loops, true).step(true)
-        expect(fx.pos).toBe(1-absPosFrac) // Even loop, so it is reversed
-        expect(fx.situation.loop).toBe(absPosInt)
-        expect(fx.situation.reversed).toBe(true)
-
-        fx.stop().animate()
-
-        loops = true
-        absPos = 3.12
-        absPosInt = Math.floor(absPos)
-        absPosFrac = absPos - absPosInt
-        fx.absPos = absPos
-        fx.reverse(true).loop(loops, true).step(true)
-        expect(fx.pos).toBe(absPosFrac)
-        expect(fx.situation.loop).toBe(absPosInt)
-        expect(fx.situation.reversed).toBe(false)
-      })
-
-      it('should, when the absolute position is above or equal to the the maximum number of loops, set the position to its end value and end the animation', function() {
-        var absPos, loops
-
-        // Without the reverse flag, the end value of position is 1
-        loops = 6
-        absPos = 13.52
-        fx.absPos = absPos
-        fx.loop(loops).step(true)
-        expect(fx.pos).toBe(1)
-        expect(fx.situation).toBeNull()
-
-        fx.animate() // Recreate an animation since the other one was ended
-
-        loops = false
-        absPos = 146.22
-        fx.absPos = absPos
-        fx.loop(loops).step(true)
-        expect(fx.pos).toBe(1)
-        expect(fx.situation).toBeNull()
-
-        fx.animate() // Recreate an animation since the other one was ended
-
-        // With the reverse flag, the end value of position is 0 when loops is even and 1 when loops is an odd number or false
-        loops = 6
-        absPos = 6
-        fx.absPos = absPos
-        fx.loop(loops, true).step(true)
-        expect(fx.pos).toBe(0) // Even loops
-        expect(fx.situation).toBeNull()
-
-        fx.animate() // Recreate an animation since the other one was ended
-
-        loops = false
-        absPos = 4.47
-        fx.absPos = absPos
-        fx.loop(loops, true).step(true)
-        expect(fx.pos).toBe(1) // 1 since loops is false
-        expect(fx.situation).toBeNull()
-
-        fx.animate() // Recreate an animation since the other one was ended
-
-        // When the animation is set to run backward, it is the opposite, the end value of position is 1 when loops is even and 0 when loops is an odd number or false
-        loops = 8
-        absPos = 12.65
-        fx.absPos = absPos
-        fx.reverse(true).loop(loops, true).step(true)
-        expect(fx.pos).toBe(1) // Even loops
-        expect(fx.situation).toBeNull()
-
-        fx.animate() // Recreate an animation since the other one was ended
-
-        loops = 11
-        absPos = 12.41
-        fx.absPos = absPos
-        fx.reverse(true).loop(loops, true).step(true)
-        expect(fx.pos).toBe(0) // Odd loops
-        expect(fx.situation).toBeNull()
-      })
-
-      it('should set the position to its start value when the absolute position is below 0', function() {
-        var absPos
-
-        // When the animation is not set to run backward the start value is 0
-        absPos = -2.27
-        fx.loop(7)
-        fx.situation.loop = 3
-        fx.absPos = absPos
-        fx.step(true)
-        expect(fx.pos).toBe(0)
-        expect(fx.absPos).toBe(absPos)
-        expect(fx.situation.loop).toBe(0)
-
-        fx.stop().animate()
-
-        // When the animation is set to run backward the start value is 1
-        absPos = -4.12
-        fx.absPos = absPos
-        fx.reverse(true).step(true)
-        expect(fx.pos).toBe(1)
-        expect(fx.absPos).toBe(absPos)
-      })
-
-      it('should, when looping with the reverse flag, toggle reversed only when the difference between the new value of loop counter and its old value is odd', function() {
-        // The new value of the loop counter is the integer part of absPos
-
-        fx.loop(9, true)
-        expect(fx.situation.loop).toBe(0)
-        expect(fx.pos).toBe(0)
-        expect(fx.situation.reversed).toBe(false)
-
-        fx.absPos = 3
-        fx.step(true)
-        expect(fx.situation.reversed).toBe(true) // (3-0) is odd
-
-        fx.absPos = 1
-        fx.step(true)
-        expect(fx.situation.reversed).toBe(true) // (1-3) is even
-
-        fx.absPos = 6
-        fx.step(true)
-        expect(fx.situation.reversed).toBe(false) // (6-1) is odd
-
-        fx.absPos = 9
-        fx.step(true)
-        expect(fx.situation).toBeNull()
-        expect(fx.pos).toBe(1) // It should end not reversed, which mean the position is expected to be 1
-                               // ((9-1)-6) is even, the -1 is because we do not want reversed to be toggled after the last loop
-      })
-    })
-
-
-    it('should not throw an error when stop is called in a during callback', function () {
-      fx.move(100,100).start()
-      fx.during(function () {this.stop()})
-      expect(fx.step.bind(fx)).not.toThrow()
-    })
-
-    it('should not throw an error when finish is called in a during callback', function () {
-      fx.move(100,100).start()
-      fx.during(function () {this.finish()})
-      expect(fx.step.bind(fx)).not.toThrow()
-    })
-
-    it('should not set active to false if the afterAll callback add situations to the situations queue', function () {
-      fx.afterAll(function(){this.animate(500).move(0,0)})
-
-      jasmine.clock().tick(500)
-      fx.step()
-      expect(fx.active).toBe(true)
-      expect(fx.situation).not.toBeNull()
-      expect(fx.situations.length).toBe(0)
-
-      jasmine.clock().tick(500)
-      fx.step()
-      expect(fx.active).toBe(false)
-      expect(fx.situation).toBeNull()
-      expect(fx.situations.length).toBe(0)
-    })
-  })
-
-
-  it('animates the x/y-attr', function() {
-    var called = false
-
-    fx.move(200,200).after(function(){
-
-      expect(rect.x()).toBe(200)
-      expect(rect.y()).toBe(200)
-      called = true
-
-    })
-
-    jasmine.clock().tick(250)
-    fx.step()
-    expect(rect.x()).toBeGreaterThan(100)
-    expect(rect.y()).toBeGreaterThan(100)
-
-    jasmine.clock().tick(250)
-    fx.step()
-    expect(called).toBe(true)
-  })
-
-  // it('animates matrix', function() {
-  //   var ctm, called = false
-  //
-  //   fx.transform({a:0.8, b:0.4, c:-0.15, d:0.7, e: 90.3, f: 27.07}).after(function(){
-  //
-  //     var ctm = rect.ctm()
-  //     expect(ctm.a).toBeCloseTo(0.8)
-  //     expect(ctm.b).toBeCloseTo(0.4)
-  //     expect(ctm.c).toBeCloseTo(-0.15)
-  //     expect(ctm.d).toBeCloseTo(0.7)
-  //     expect(ctm.e).toBeCloseTo(90.3)
-  //     expect(ctm.f).toBeCloseTo(27.07)
-  //     called = true
-  //
-  //   })
-  //
-  //   jasmine.clock().tick(250)
-  //   fx.step()
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBeLessThan(1)
-  //   expect(ctm.b).toBeGreaterThan(0)
-  //   expect(ctm.c).toBeLessThan(0)
-  //   expect(ctm.d).toBeGreaterThan(0)
-  //   expect(ctm.e).toBeGreaterThan(0)
-  //   expect(ctm.f).toBeGreaterThan(0)
-  //
-  //   jasmine.clock().tick(250)
-  //   fx.step()
-  //   expect(called).toBe(true)
-  // })
-
-  // it('animate a scale transform using the passed center point when there is already a transform in place', function(){
-  //   var ctm
-  //
-  //   // When no ceter point is passed to the method scale, it use the center of the element as the center point
-  //
-  //   rect.scale(2) // The transform in place
-  //
-  //   fx.scale(0.5)
-  //   jasmine.clock().tick(500) // Have the animation reach its end
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(0.5)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(0.5)
-  //   expect(ctm.e).toBe(75)
-  //   expect(ctm.f).toBe(75)
-  // })
-
-  // it('animate a flip(x) transform', function() {
-  //   var ctm
-  //
-  //   fx.transform({flip: 'x'}).start()
-  //
-  //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(0.5)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(1)
-  //   expect(ctm.e).toBe(75)
-  //   expect(ctm.f).toBe(0)
-  //
-  //   jasmine.clock().tick(475) // Have the animation reach its end
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(-1)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(1)
-  //   expect(ctm.e).toBe(300)
-  //   expect(ctm.f).toBe(0)
-  // })
-
-  // it('animate a flip(x) transform with an offset', function() {
-  //   var ctm
-  //
-  //   fx.transform({flip: 'x', offset: 20}).start()
-  //
-  //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(0.5)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(1)
-  //   expect(ctm.e).toBe(10)
-  //   expect(ctm.f).toBe(0)
-  //
-  //   jasmine.clock().tick(475) // Have the animation reach its end
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(-1)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(1)
-  //   expect(ctm.e).toBe(40)
-  //   expect(ctm.f).toBe(0)
-  // })
-
-  // it('animate a flip(y) transform', function() {
-  //   var ctm
-  //
-  //   fx.transform({flip: 'y'}).start()
-  //
-  //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(1)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(0.5)
-  //   expect(ctm.e).toBe(0)
-  //   expect(ctm.f).toBe(75)
-  //
-  //   jasmine.clock().tick(475) // Have the animation reach its end
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(1)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(-1)
-  //   expect(ctm.e).toBe(0)
-  //   expect(ctm.f).toBe(300)
-  // })
-
-  // it('animate a flip(y) transform with an offset', function() {
-  //   var ctm
-  //
-  //   fx.transform({flip: 'y', offset: 20}).start()
-  //
-  //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(1)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(0.5)
-  //   expect(ctm.e).toBe(0)
-  //   expect(ctm.f).toBe(10)
-  //
-  //   jasmine.clock().tick(475) // Have the animation reach its end
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(1)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(-1)
-  //   expect(ctm.e).toBe(0)
-  //   expect(ctm.f).toBe(40)
-  // })
-
-  // it('animate a flip() transform', function() {
-  //   var ctm
-  //
-  //   fx.transform({flip: 'both'}).start()
-  //
-  //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(0.5)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(0.5)
-  //   expect(ctm.e).toBe(75)
-  //   expect(ctm.f).toBe(75)
-  //
-  //   jasmine.clock().tick(475) // Have the animation reach its end
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(-1)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(-1)
-  //   expect(ctm.e).toBe(300)
-  //   expect(ctm.f).toBe(300)
-  // })
-
-  // it('animate a flip() transform with an offset', function() {
-  //   var ctm
-  //
-  //   fx.transform({flip: 'both', offset: 20}).start()
-  //
-  //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(0.5)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(0.5)
-  //   expect(ctm.e).toBe(10)
-  //   expect(ctm.f).toBe(10)
-  //
-  //   jasmine.clock().tick(475) // Have the animation reach its end
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(-1)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(-1)
-  //   expect(ctm.e).toBe(40)
-  //   expect(ctm.f).toBe(40)
-  // })
-
-  // it('animate relative matrix transform', function(){
-  //   var ctm
-  //
-  //   fx.transform(new SVG.Matrix().scale(2,0,0), true)
-  //
-  //   jasmine.clock().tick(250) // Have the animation be half way
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(1.5)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(1.5)
-  //   expect(ctm.e).toBe(0)
-  //   expect(ctm.f).toBe(0)
-  //
-  //   jasmine.clock().tick(250) // Have the animation reach its end
-  //   fx.step()
-  //
-  //   ctm = rect.ctm()
-  //   expect(ctm.a).toBe(2)
-  //   expect(ctm.b).toBe(0)
-  //   expect(ctm.c).toBe(0)
-  //   expect(ctm.d).toBe(2)
-  //   expect(ctm.e).toBe(0)
-  //   expect(ctm.f).toBe(0)
-  // })
-
-  describe('when animating plots', function() {
-    it('should allow plot animations to be chained', function() {
-      var pathString1 = 'M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80'
-        , pathString2 = 'M10 80 C 40 150, 65 150, 95 80 S 150 10, 180 80'
-        , path = draw.path(pathString1)
-        , morph
-
-      fx = path.animate(1000).plot(pathString2).animate(1000).plot(pathString1)
-      morph = new SVG.PathArray(pathString1).morph(pathString2)
-
-      fx.start()
-      expect(path.array()).toEqual(morph.at(0))
-
-      jasmine.clock().tick(500) // Have the first animation be half way
-      fx.step()
-      expect(path.array()).toEqual(morph.at(0.5))
-
-      jasmine.clock().tick(500) // Have the first animation reach its end
-      fx.step()
-      expect(path.array()).toEqual(morph.at(1))
-      morph = new SVG.PathArray(pathString2).morph(pathString1)
-      expect(path.array()).toEqual(morph.at(0))
-
-      jasmine.clock().tick(500) // Have the second animation be half way
-      fx.step()
-      expect(path.array()).toEqual(morph.at(0.5))
-
-      jasmine.clock().tick(500) // Have the second animation reach its end
-      fx.step()
-      expect(path.array()).toEqual(morph.at(1))
-    })
-
-    it('should allow plot to be called on a polyline', function() {
-      var startValue = [[0,0], [100,50], [50,100], [150,50], [200,50]]
-        , endValue = [[0,0], [100,50], [50,100], [150,50], [200,50], [250,100], [300,50], [350,50]]
-        , morph = new SVG.PointArray(startValue).morph(endValue)
-        , polyline = draw.polyline(startValue)
-
-      fx = polyline.animate(3000).plot(endValue)
-
-      fx.start()
-      expect(polyline.array()).toEqual(morph.at(0))
-
-      jasmine.clock().tick(1500) // Have the animation be half way
-      fx.step()
-      expect(polyline.array()).toEqual(morph.at(0.5))
-
-      jasmine.clock().tick(1500) // Have the animation reach its end
-      fx.step()
-      expect(polyline.array()).toEqual(morph.at(1))
-    })
-
-    it('should allow plot to be called on a polygon', function() {
-      var startValue = [[0,0], [100,50], [50,100], [150,50], [200,50]]
-        , endValue = [[0,0], [100,50], [50,100], [150,50], [200,50], [250,100], [300,50], [350,50]]
-        , morph = new SVG.PointArray(startValue).morph(endValue)
-        , polygon = draw.polygon(startValue)
-
-      fx = polygon.animate(3000).plot(endValue)
-
-      fx.start()
-      expect(polygon.array()).toEqual(morph.at(0))
-
-      jasmine.clock().tick(1500) // Have the animation be half way
-      fx.step()
-      expect(polygon.array()).toEqual(morph.at(0.5))
-
-      jasmine.clock().tick(1500) // Have the animation reach its end
-      fx.step()
-      expect(polygon.array()).toEqual(morph.at(1))
-    })
-
-    it('should allow plot to be called on a path', function() {
-      var startValue = new SVG.PathArray('M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80')
-        , endValue = new SVG.PathArray('M10 80 C 40 150, 65 150, 95 80 S 150 10, 180 80')
-        , morph = new SVG.PathArray(startValue).morph(endValue)
-        , path = draw.path(startValue)
-
-      fx = path.animate(2000).plot(endValue)
-
-      fx.start()
-      expect(path.array()).toEqual(morph.at(0))
-
-      jasmine.clock().tick(1000) // Have the animation be half way
-      fx.step()
-      expect(path.array()).toEqual(morph.at(0.5))
-
-      jasmine.clock().tick(1000) // Have the animation reach its end
-      fx.step()
-      expect(path.array()).toEqual(morph.at(1))
-    })
-
-    it('should allow plot to be called on a textpath', function() {
-      var startValue = new SVG.PathArray('M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80')
-        , endValue = new SVG.PathArray('M10 80 C 40 150, 65 150, 95 80 S 150 10, 180 80')
-        , morph = new SVG.PathArray(startValue).morph(endValue)
-        , textPath
-
-      var text = draw.text(function(add) {
-        add.tspan("We go up and down, then we go down, then up again")
-      })
-
-      textPath = text.path(startValue)
-      fx = textPath.animate(500).plot(endValue)
-
-      fx.start()
-      expect(textPath.array()).toEqual(morph.at(0))
-
-      jasmine.clock().tick(250) // Have the animation be half way
-      fx.step()
-      expect(textPath.array()).toEqual(morph.at(0.5))
-
-      jasmine.clock().tick(250) // Have the animation reach its end
-      fx.step()
-      expect(textPath.array()).toEqual(morph.at(1))
-    })
-
-    it('should allow plot to be called on a line', function() {
-      var startValue = '0,0 100,150'
-        , endValue = [[50,30], [120,250]]
-        , morph = new SVG.PointArray(startValue).morph(endValue)
-        , line = draw.line(startValue)
-
-      fx = line.animate(3000).plot(endValue)
-
-      fx.start()
-      expect(line.array()).toEqual(morph.at(0))
-
-      jasmine.clock().tick(1500) // Have the animation be half way
-      fx.step()
-      expect(line.array()).toEqual(morph.at(0.5))
-
-      jasmine.clock().tick(1500) // Have the animation reach its end
-      fx.step()
-      expect(line.array()).toEqual(morph.at(1))
-    })
-
-    it('should allow plot to be called with 4 parameters on a line', function () {
-      var startPointArray = new SVG.PointArray('0,0 100,150')
-        , endPointArray = new SVG.PointArray([[50,30], [120,250]])
-        , morph = new SVG.PointArray(startPointArray).morph(endPointArray)
-        , a
-
-      a = startPointArray.value
-      var line = draw.line(a[0][0], a[0][1], a[1][0], a[1][1])
-
-      a = endPointArray.value
-      fx = line.animate(3000).plot(a[0][0], a[0][1], a[1][0], a[1][1])
-
-      fx.start()
-      expect(line.array()).toEqual(morph.at(0))
-
-      jasmine.clock().tick(1500) // Have the animation be half way
-      fx.step()
-      expect(line.array()).toEqual(morph.at(0.5))
-
-      jasmine.clock().tick(1500) // Have the animation reach its end
-      fx.step()
-      expect(line.array()).toEqual(morph.at(1))
-    })
-  })
-
-
-  describe('when animating attributes', function() {
-    it('should be possible to animate numeric attributes', function () {
-      var startValue = 0
-        , endValue = 150
-        , morph = new SVG.Number(startValue).morph(endValue)
-
-      var text = draw.text(function(add) {
-        add.tspan('We go ')
-        add.tspan('up').fill('#f09').dy(-40)
-        add.tspan(', then we go down, then up again').dy(40)
-      })
-
-      var path = 'M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
-
-      var textPath = text.path(path).font({ size: 42.5, family: 'Verdana' })
-
-
-      textPath.attr('startOffset', startValue)
-      fx = textPath.animate(1000).attr('startOffset', endValue)
-
-      fx.start()
-      expect(textPath.attr('startOffset')).toBe(morph.at(0).value)
-
-      jasmine.clock().tick(500) // Have the animation be half way
-      fx.step()
-      expect(textPath.attr('startOffset')).toBe(morph.at(0.5).value)
-
-      jasmine.clock().tick(500) // Have the animation reach its end
-      fx.step()
-      expect(textPath.attr('startOffset')).toBe(morph.at(1).value)
-    })
-
-    it('should be possible to animate non-numeric attributes', function () {
-      var startValue = 'butt'
-        , endValue = 'round'
-        , line = draw.line('0,0 100,150').attr('stroke-linecap', startValue)
-
-      fx = line.animate(3000).attr('stroke-linecap', endValue)
-
-      fx.start()
-      expect(line.attr('stroke-linecap')).toBe(startValue)
-
-      jasmine.clock().tick(1500) // Have the animation be half way
-      fx.step()
-      expect(line.attr('stroke-linecap')).toBe(startValue)
-
-      jasmine.clock().tick(1500) // Have the animation reach its end
-      fx.step()
-      expect(line.attr('stroke-linecap')).toBe(endValue)
-    })
-
-    it('should be possible to animate color attributes by using SVG.Color', function() {
-      var startValue = 'rgb(42,251,100)'
-        , endValue = 'rgb(10,80,175)'
-        , morph = new SVG.Color(startValue).morph(endValue)
-
-      rect.attr('fill', startValue)
-      fx.attr('fill', endValue)
-
-      fx.start()
-      expect(rect.attr('fill')).toBe(morph.at(0).toString())
-
-      jasmine.clock().tick(250) // Have the animation be half way
-      fx.step()
-      expect(rect.attr('fill')).toBe(morph.at(0.5).toString())
-
-      jasmine.clock().tick(250) // Have the animation reach its end
-      fx.step()
-      expect(rect.attr('fill')).toBe(morph.at(1).toString())
-    })
-
-    it('should be possible to pass percentage strings to numeric attributes', function () {
-      var startValue = '0%'
-        , endValue = '80%'
-        , morph = new SVG.Number(startValue).morph(endValue)
-
-      var text = draw.text(function(add) {
-        add.tspan('We go ')
-        add.tspan('up').fill('#f09').dy(-40)
-        add.tspan(', then we go down, then up again').dy(40)
-      })
-
-      var path = 'M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
-
-      var textPath = text.path(path).font({ size: 42.5, family: 'Verdana' })
-
-      textPath.attr('startOffset', startValue)
-      fx = textPath.animate(1000).attr('startOffset', endValue)
-
-      fx.start()
-      expect(textPath.attr('startOffset')).toBe(morph.at(0).toString())
-
-      jasmine.clock().tick(500) // Have the animation be half way
-      fx.step()
-      expect(textPath.attr('startOffset')).toBe(morph.at(0.5).toString())
-
-      jasmine.clock().tick(500) // Have the animation reach its end
-      fx.step()
-      expect(textPath.attr('startOffset')).toBe(morph.at(1).toString())
-    })
-
-    it('should allow 0 to be specified without unit', function () {
-      // This code snippet come from issue #552
-
-      var gradient = draw.gradient('linear', function(add) {
-        s1 = add.stop(0, '#33235b')
-        s2 = add.stop(0.5, '#E97639')
-        s3 = add.stop(1, '#33235b')
-      })
-
-      var r1, r2;
-      var fill = draw.pattern('300%', '100%', function(add) {
-        r1 = add.rect('150%', '100%').fill(gradient)
-        r2 = add.rect('150%', '100%').fill(gradient)
-      });
-      fill.attr({patternUnits: 'userSpaceOnUse'})
-
-      r1.attr('x', 0).animate('0.5s').attr('x', '150%')
-      r2.attr('x', '-150%').animate('0.5s').attr('x', 0)
-
-      var text = draw.text('Manifesto').move('50%', '50%').fill(fill)
-      text.font({
-        size: 70
-        , anchor: 'middle'
-        , leading: 1
-      })
-
-      r1.fx.start()
-      r2.fx.start()
-
-      jasmine.clock().tick(250) // Have the animation be half way
-      r1.fx.step()
-      r2.fx.step()
-      expect(r1.attr('x')).toBe('75%')
-      expect(r2.attr('x')).toBe('-75%')
-
-      jasmine.clock().tick(250) // Have the animation reach its end
-      r1.fx.step()
-      r2.fx.step()
-      expect(r1.attr('x')).toBe('150%')
-      expect(r2.attr('x')).toBe('0%')
-    })
-  })
-
-
-  describe('when animating styles', function() {
-    it('should be possible to animate numeric styles', function () {
-      var startValue = 0
-        , endValue = 5
-        , morph = new SVG.Number(startValue).morph(endValue)
-
-      rect.css('stroke-width', startValue)
-      fx.css('stroke-width', endValue)
-
-      fx.start()
-      expect(rect.css('stroke-width')).toBe(morph.at(0).toString())
-
-      jasmine.clock().tick(250) // Have the animation be half way
-      fx.step()
-      expect(rect.css('stroke-width')).toBe(morph.at(0.5).toString())
-
-      jasmine.clock().tick(250) // Have the animation reach its end
-      fx.step()
-      expect(rect.css('stroke-width')).toBe(morph.at(1).toString())
-    })
-
-    it('should be possible to animate non-numeric styles', function () {
-      var startValue = 'butt'
-        , endValue = 'round'
-        , line = draw.line('0,0 100,150').css('stroke-linecap', startValue)
-
-      fx = line.animate(3000).css('stroke-linecap', endValue)
-
-      fx.start()
-      expect(line.css('stroke-linecap')).toBe(startValue)
-
-      jasmine.clock().tick(1500) // Have the animation be half way
-      fx.step()
-      expect(line.css('stroke-linecap')).toBe(startValue)
-
-      jasmine.clock().tick(1500) // Have the animation reach its end
-      fx.step()
-      expect(line.css('stroke-linecap')).toBe(endValue)
-    })
-
-    it('should be possible to animate color styles by using SVG.Color', function() {
-      var startValue = '#81DE01'
-        , endValue = '#B1835D'
-        , morph = new SVG.Color(startValue).morph(endValue)
-
-      rect.css('fill', startValue)
-      fx.css('fill', endValue)
-
-
-      fx.start()
-      // When setting a style color, it get saved as  a rgb() string even if it was passed as an hex code
-      // The style rgb string has spaces while the one returned by SVG.Color do not as show bellow
-      // CSS: rgb(255, 255, 255)                    SVG.Color: rgb(255,255,255)
-      // The space in the style rbg string are removed so they can be equal
-      expect(rect.css('fill').replace(/\s+/g, '')).toBe(morph.at(0).toRgb())
-
-      jasmine.clock().tick(250) // Have the animation be half way
-      fx.step()
-      expect(rect.css('fill').replace(/ /g, '')).toBe(morph.at(0.5).toRgb())
-
-      jasmine.clock().tick(250) // Have the animation reach its end
-      fx.step()
-      expect(rect.css('fill').replace(/ /g, '')).toBe(morph.at(1).toRgb())
-    })
-
-    it('should be possible to pass percentage strings to numeric styles', function () {
-      var startValue = '0%'
-        , endValue = '5%'
-        , morph = new SVG.Number(startValue).morph(endValue)
-
-      rect.css('stroke-width', startValue)
-      fx.css('stroke-width', endValue)
-
-      fx.start()
-      expect(rect.css('stroke-width')).toBe(morph.at(0).toString())
-
-      jasmine.clock().tick(250) // Have the animation be half way
-      fx.step()
-      expect(rect.css('stroke-width')).toBe(morph.at(0.5).toString())
-
-      jasmine.clock().tick(250) // Have the animation reach its end
-      fx.step()
-      expect(rect.css('stroke-width')).toBe(morph.at(1).toString())
-    })
-
-    it('should allow 0 to be specified without a unit', function () {
-      var r1 = draw.rect(100,100).move(200,200)
-        , r2 = draw.rect(100,100).move(400,400)
-
-      r1.css('stroke-width', '100%').animate(500).css('stroke-width', 0)
-      r2.css('stroke-width', 0).animate(500).css('stroke-width', '100%')
-
-      r1.fx.start()
-      r2.fx.start()
-      expect(r1.css('stroke-width')).toBe('100%')
-      expect(r2.css('stroke-width')).toBe('0%')
-
-      jasmine.clock().tick(250) // Have the animation be half way
-      r1.fx.step()
-      r2.fx.step()
-      expect(r1.css('stroke-width')).toBe('50%')
-      expect(r2.css('stroke-width')).toBe('50%')
-
-      jasmine.clock().tick(250) // Have the animation reach its end
-      r1.fx.step()
-      r2.fx.step()
-      expect(r1.css('stroke-width')).toBe('0%')
-      expect(r2.css('stroke-width')).toBe('100%')
-    })
-  })
-
-
-  describe('add()', function() {
-    it('adds to animations obj by default', function() {
-      fx.add('x', new SVG.Number(20))
-      expect(fx.situation.animations.x.value).toBe(20)
-    })
-
-    it('adds to specified obj', function() {
-      fx.add('x', new SVG.Number(20), 'animations')
-      fx.add('x', new SVG.Number(20), 'attrs')
-      fx.add('x', new SVG.Number(20), 'styles')
-      expect(fx.situation.animations.x.value).toBe(20)
-      expect(fx.situation.attrs.x.value).toBe(20)
-      expect(fx.situation.styles.x.value).toBe(20)
-    })
-  })
-
-  describe('attr()', function() {
-    it('should allow an object to be passed', function() {
-      spyOn(fx, 'attr').and.callThrough()
-      fx.attr({
-        x: 20,
-        y: 20
-      })
-
-      expect(fx.attr).toHaveBeenCalledWith('x', 20)
-      expect(fx.attr).toHaveBeenCalledWith('y', 20)
-    })
-
-    it('should call add() with attrs as method', function() {
-      spyOn(fx, 'add')
-      fx.attr('x', 20)
-      expect(fx.add).toHaveBeenCalledWith('x', 20, 'attrs')
-    })
-  })
-
-  describe('css()', function() {
-    it('should allow an object to be passed', function() {
-      spyOn(fx, 'css').and.callThrough()
-      fx.css({
-        x: 20,
-        y: 20
-      })
-
-      expect(fx.css).toHaveBeenCalledWith('x', 20)
-      expect(fx.css).toHaveBeenCalledWith('y', 20)
-    })
-
-    it('should call add() with styles as method', function() {
-      spyOn(fx, 'add')
-      fx.css('x', 20)
-      expect(fx.add).toHaveBeenCalledWith('x', 20, 'styles')
-    })
-  })
-
-  describe('x() / y()', function() {
-    it('should add an entry to the animations obj', function() {
-      spyOn(fx, 'add')
-      fx.x(20)
-      fx.y(20)
-
-      expect(fx.add).toHaveBeenCalledWith('x', jasmine.objectContaining({value:20}))
-      expect(fx.add).toHaveBeenCalledWith('y', jasmine.objectContaining({value:20}))
-    })
-
-    it('allows relative move with relative flag set', function() {
-      spyOn(fx, 'add')
-      fx.x(20, true)
-      fx.y(20, true)
-
-      expect(fx.add).toHaveBeenCalledWith('x', jasmine.objectContaining({value:20, relative:true }))
-      expect(fx.add).toHaveBeenCalledWith('y', jasmine.objectContaining({value:20, relative:true }))
-    })
-
-    it('redirects to transform when target is a group', function() {
-      var group = draw.group()
-        , fx = group.animate(500)
-
-      spyOn(fx, 'transform')
-
-      fx.x(20)
-      fx.y(20)
-
-      expect(fx.transform).toHaveBeenCalledWith({x: 20}, undefined)
-      expect(fx.transform).toHaveBeenCalledWith({y: 20}, undefined)
-    })
-
-    it('redirects to transform when target is a group with relative flag set', function() {
-      var group = draw.group()
-        , fx = group.animate(500)
-
-      spyOn(fx, 'transform')
-
-      fx.x(20, true)
-      fx.y(20, true)
-
-      expect(fx.transform).toHaveBeenCalledWith({x: 20}, true)
-      expect(fx.transform).toHaveBeenCalledWith({y: 20}, true)
-    })
-  })
-
-  describe('cx() / cy()', function() {
-    it('should call add with method and argument', function() {
-      spyOn(fx, 'add')
-      fx.cx(20)
-      fx.cy(20)
-
-      expect(fx.add).toHaveBeenCalledWith('cx', jasmine.objectContaining({value:20}))
-      expect(fx.add).toHaveBeenCalledWith('cy', jasmine.objectContaining({value:20}))
-    })
-  })
-
-  describe('move()', function() {
-    it('should redirect call to x() and y()', function() {
-      spyOn(fx, 'x').and.callThrough()
-      spyOn(fx, 'y').and.callThrough()
-      fx.move(20, 20)
-
-      expect(fx.x).toHaveBeenCalledWith(20)
-      expect(fx.y).toHaveBeenCalledWith(20)
-    })
-  })
-
-  describe('center()', function() {
-    it('should redirect call to cx() and cy()', function() {
-      spyOn(fx, 'cx').and.callThrough()
-      spyOn(fx, 'cy').and.callThrough()
-      fx.center(20, 20)
-
-      expect(fx.cx).toHaveBeenCalledWith(20)
-      expect(fx.cy).toHaveBeenCalledWith(20)
-    })
-  })
-
-  describe('size()', function() {
-    it('should set font-size with attr() when called on a text', function() {
-      var text = draw.text('Hello World')
-        , fx = text.animate(500)
-
-      spyOn(fx, 'attr')
-      fx.size(20)
-      expect(fx.attr).toHaveBeenCalledWith('font-size', 20)
-    })
-
-    it('should set width and height with add()', function() {
-      spyOn(fx, 'add').and.callThrough()
-      fx.size(20, 20)
-
-      expect(fx.add).toHaveBeenCalledWith('width', jasmine.objectContaining({value:20}))
-      expect(fx.add).toHaveBeenCalledWith('height', jasmine.objectContaining({value:20}))
-    })
-
-    it('should calculate proportional size when only height or width is given', function() {
-      spyOn(fx, 'add').and.callThrough()
-      fx.size(40, null)
-      fx.size(null, 60)
-
-      expect(fx.add).toHaveBeenCalledWith('width', jasmine.objectContaining({value:40}))
-      expect(fx.add).toHaveBeenCalledWith('height', jasmine.objectContaining({value:40}))
-
-      expect(fx.add).toHaveBeenCalledWith('width', jasmine.objectContaining({value:60}))
-      expect(fx.add).toHaveBeenCalledWith('height', jasmine.objectContaining({value:60}))
-    })
-  })
-
-  describe('width()', function() {
-    it('should set width with add()', function() {
-      spyOn(fx, 'add').and.callThrough()
-      fx.width(20)
-      expect(fx.add).toHaveBeenCalledWith('width', jasmine.objectContaining({value:20}))
-    })
-
-    it('should animate the width attribute', function() {
-      fx.width(200)
-      expect(rect.width()).toBe(100)
-
-      jasmine.clock().tick(250)
-      fx.step()
-      expect(rect.width()).toBe(150)
-
-      jasmine.clock().tick(250)
-      fx.step()
-      expect(rect.width()).toBe(200)
-    })
-  })
-
-  describe('height()', function() {
-    it('should set height with add()', function() {
-      spyOn(fx, 'add').and.callThrough()
-      fx.height(20)
-      expect(fx.add).toHaveBeenCalledWith('height', jasmine.objectContaining({value:20}))
-    })
-
-    it('should animate the height attribute', function() {
-      fx.height(200)
-      expect(rect.height()).toBe(100)
-
-      jasmine.clock().tick(250)
-      fx.step()
-      expect(rect.height()).toBe(150)
-
-      jasmine.clock().tick(250)
-      fx.step()
-      expect(rect.height()).toBe(200)
-    })
-  })
-
-  describe('plot()', function() {
-    it('should call add with plot as method', function() {
-      var polyline = draw.polyline('10 10 20 20 30 10 50 20')
-        , fx = polyline.animate(500)
-
-      spyOn(fx, 'add')
-      fx.plot('5 5 30 29 40 19 12 30')
-      expect(fx.add).toHaveBeenCalledWith('plot', new SVG.PointArray('5 5 30 29 40 19 12 30'))
-    })
-
-    it('also accept parameter list', function() {
-      var line = draw.line('10 10 20 20')
-        , fx = line.animate(500)
-
-      spyOn(fx, 'add')
-      fx.plot(5, 5, 10, 10)
-      expect(fx.add).toHaveBeenCalledWith('plot', new SVG.PointArray([5, 5, 10, 10]))
-    })
-  })
-
-  describe('leading()', function() {
-    it('should call add with method and argument', function() {
-      var text = draw.text('Hello World')
-        , fx = text.animate(500)
-      spyOn(fx, 'add')
-      fx.leading(3)
-
-      expect(fx.add).toHaveBeenCalledWith('leading', jasmine.objectContaining({value:3}))
-    })
-
-    it('does nothiing when not called on text', function() {
-      spyOn(fx, 'add')
-      fx.leading(3)
-      expect(fx.add).not.toHaveBeenCalled()
-    })
-  })
-
-  describe('viewbox()', function() {
-    it('should call add with method and argument', function() {
-      var nested = draw.nested()
-        , fx = nested.animate(500)
-      spyOn(fx, 'add')
-      fx.viewbox(1,2,3,4)
-
-      expect(fx.add).toHaveBeenCalledWith('viewbox', jasmine.objectContaining({x:1, y:2, width:3, height:4}))
-    })
-
-    it('does nothing when not called on SVG.Container', function() {
-      spyOn(fx, 'add')
-      fx.viewbox(1,2,3,4)
-      expect(fx.add).not.toHaveBeenCalled()
-    })
-  })
-
-  describe('update()', function() {
-    it('should convert call with 3 arguments to call with obj', function() {
-      var stop = new SVG.Stop()
-        , fx = stop.animate()
-      spyOn(fx, 'update').and.callThrough()
-      fx.update(1,'#ccc',0.5)
-
-      expect(fx.update).toHaveBeenCalledWith({offset: 1, color: '#ccc', opacity: 0.5})
-    })
-
-    it('calls add with method argument and attrs as type', function() {
-      var stop = new SVG.Stop()
-        , fx = stop.animate()
-      spyOn(fx, 'add')
-      fx.update({offset: 1, color: '#ccc', opacity: 0.5})
-
-      expect(fx.add).toHaveBeenCalledWith('stop-opacity', 0.5, 'attrs')
-      expect(fx.add).toHaveBeenCalledWith('stop-color', '#ccc', 'attrs')
-      expect(fx.add).toHaveBeenCalledWith('offset', 1, 'attrs')
-    })
-
-    it('does nothing when not called on SVG.Stop', function() {
-      spyOn(fx, 'add')
-      fx.update({offset: 1, color: '#ccc', opacity: 0.5})
-      expect(fx.add).not.toHaveBeenCalled()
-    })
-  })
-
-  // describe('transform()', function() {
-  //   it('returns itself when no valid transformation was found', function() {
-  //     expect(fx.transform({})).toBe(fx)
-  //   })
-  //   it('gets the current transforms', function() {
-  //     expect(fx.transform()).toEqual(new SVG.Matrix(rect).extract())
-  //   })
-  //   it('gets a certain transformation if used with an argument', function() {
-  //     expect(fx.transform('x')).toEqual(0)
-  //   })
-  //   it('adds an entry to transforms when matrix given', function() {
-  //     var matrix = new SVG.Matrix(1,2,3,4,5,6)
-  //     fx.transform(matrix)
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(matrix))
-  //   })
-  //   it('sets relative flag when given', function() {
-  //     var matrix = new SVG.Matrix(1,2,3,4,5,6)
-  //     fx.transform(matrix, true)
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(matrix))
-  //     expect(fx.situation.transforms[0].relative).toBe(true)
-  //   })
-  //   it('adds an entry to transforms when rotation given', function() {
-  //     fx.transform({rotation: 30, cx:0, cy:0})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Rotate(30, 0, 0)))
-  //   })
-  //   it('adds an entry to transforms when scale given', function() {
-  //     fx.transform({scale: 2, cx:0, cy:0})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Scale(2, 2, 0, 0)))
-  //   })
-  //   it('adds an entry to transforms when scaleX given', function() {
-  //     fx.transform({scaleX: 2, cx:0, cy:0})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Scale(2, 1, 0, 0)))
-  //   })
-  //   it('adds an entry to transforms when scaleY given', function() {
-  //     fx.transform({scaleY: 2, cx:0, cy:0})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Scale(1, 2, 0, 0)))
-  //   })
-  //   it('adds an entry to transforms when skewX given', function() {
-  //     fx.transform({skewX: 2, cx:0, cy:0})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Skew(2, 0, 0, 0)))
-  //   })
-  //   it('adds an entry to transforms when skewY given', function() {
-  //     fx.transform({skewY: 2, cx:0, cy:0})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Skew(0, 2, 0, 0)))
-  //   })
-  //   it('adds an entry to transforms when flip x given', function() {
-  //     fx.transform({flip: 'x'})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining((new SVG.Matrix()).flip('x', 150)))
-  //   })
-  //   it('adds an entry to transforms when flip x with offset given', function() {
-  //     fx.transform({flip: 'x', offset: 100})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining((new SVG.Matrix()).flip('x', 100)))
-  //   })
-  //   it('adds an entry to transforms when flip y given', function() {
-  //     fx.transform({flip: 'y'})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining((new SVG.Matrix()).flip('y', 150)))
-  //   })
-  //   it('adds an entry to transforms when x given', function() {
-  //     fx.transform({x:20})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Translate(20, undefined)))
-  //   })
-  //   it('adds an entry to transforms when y given', function() {
-  //     fx.transform({y:20})
-  //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Translate(undefined, 20)))
-  //   })
-  // })
-
-  /* shortcuts for animation */
-  describe('animate()', function() {
-    it('creates a new fx instance on the element', function() {
-      var rect = draw.rect(100,100)
-      rect.animate(100)
-      expect(rect.fx instanceof SVG.FX).toBeTruthy()
-    })
-
-    it('redirects the call to fx.animate()', function() {
-      spyOn(fx, 'animate')
-      rect.animate()
-      expect(fx.animate).toHaveBeenCalled()
-    })
-  })
-
-  describe('delay()', function() {
-    it('creates a new fx instance on the element', function() {
-      var rect = draw.rect(100,100)
-      rect.delay(100)
-      expect(rect.fx instanceof SVG.FX).toBeTruthy()
-    })
-
-    it('redirects the call to fx.delay()', function() {
-      spyOn(fx, 'delay')
-      rect.delay(5)
-      expect(fx.delay).toHaveBeenCalled()
-    })
-  })
-
-  describe('stop()', function() {
-    it('redirects the call to fx.stop()', function() {
-      spyOn(fx, 'stop')
-      rect.stop()
-      expect(fx.stop).toHaveBeenCalled()
-    })
-  })
-
-  describe('finish()', function() {
-    it('redirects the call to fx.finish()', function() {
-      spyOn(fx, 'finish')
-      rect.finish()
-      expect(fx.finish).toHaveBeenCalled()
-    })
-  })
-
-  describe('pause()', function() {
-    it('redirects the call to fx.pause()', function() {
-      spyOn(fx, 'pause')
-      rect.pause()
-      expect(fx.pause).toHaveBeenCalled()
-    })
-  })
-
-  describe('play()', function() {
-    it('redirects the call to fx.play()', function() {
-      spyOn(fx, 'play')
-      rect.play()
-      expect(fx.play).toHaveBeenCalled()
-    })
-  })
-
-  describe('speed()', function() {
-    it('redirects the call to fx.speed() as getter', function() {
-      spyOn(fx, 'speed')
-      rect.speed()
-      expect(fx.speed).toHaveBeenCalled()
-    })
-
-    it('redirects the call to fx.speed() as setter', function() {
-      spyOn(fx, 'speed').and.callThrough()
-      expect(rect.speed(5)).toBe(rect)
-      expect(fx.speed).toHaveBeenCalled()
-    })
-  })
-})
-
-describe('SVG.MorphObj', function() {
-  it('accepts color strings and converts them to SVG.Color', function() {
-    var obj = new SVG.MorphObj('#000', '#fff')
-    expect(obj instanceof SVG.Color).toBeTruthy()
-
-    obj = new SVG.MorphObj('rgb(0,0,0)', 'rgb(255,255,255)')
-    expect(obj instanceof SVG.Color).toBeTruthy()
-  })
-
-  it('accepts numbers and converts them to SVG.Number', function() {
-    var obj = new SVG.MorphObj('0', '10')
-    expect(obj instanceof SVG.Number).toBeTruthy()
-
-    var obj = new SVG.MorphObj(0, 10)
-    expect(obj instanceof SVG.Number).toBeTruthy()
-  })
-
-  it('accepts any other values', function() {
-    var obj = new SVG.MorphObj('Hello', 'World')
-
-    expect(obj.value).toBe('Hello')
-    expect(obj.destination).toBe('World')
-  })
-
-  it('morphes unmorphable objects with plain morphing', function() {
-    var obj = new SVG.MorphObj('Hello', 'World')
-
-    expect(obj.at(0,0)).toBe('Hello')
-    expect(obj.at(0.5,0.5)).toBe('Hello')
-    expect(obj.at(1,1)).toBe('World')
-  })
-
-  it('converts to its value when casted', function() {
-    var obj = new SVG.MorphObj('Hello', 'World')
-    expect(obj.valueOf()).toBe('Hello')
-    expect(obj + 'World').toBe('HelloWorld')
-  })
-})
+// describe('FX', function() {
+//   var rect, fx, undefined;
+//
+//   beforeEach(function() {
+//     rect = draw.rect(100,100).move(100,100)
+//     fx = rect.animate(500)
+//
+//     jasmine.clock().install()
+//     jasmine.clock().mockDate() // This freeze the Date
+//   })
+//
+//   afterEach(function() {
+//     jasmine.clock().uninstall()
+//
+//     fx.stop(false, true)
+//   })
+//
+//
+//   it('creates an instance of SVG.FX and sets parameter', function() {
+//     expect(fx instanceof SVG.FX).toBe(true)
+//     expect(fx._target).toBe(rect)
+//     expect(fx.absPos).toBe(0)
+//     expect(fx.pos).toBe(0)
+//     expect(fx.lastPos).toBe(0)
+//     expect(fx.paused).toBe(false)
+//     expect(fx.active).toBe(false)
+//     expect(fx._speed).toBe(1)
+//     expect(fx.situations).toEqual([])
+//     expect(fx.situation.init).toBe(false)
+//     expect(fx.situation.reversed).toBe(false)
+//     expect(fx.situation.duration).toBe(500)
+//     expect(fx.situation.delay).toBe(0)
+//     expect(fx.situation.loops).toBe(false)
+//     expect(fx.situation.loop).toBe(0)
+//     expect(fx.situation.animations).toEqual({})
+//     expect(fx.situation.attrs).toEqual({})
+//     expect(fx.situation.styles).toEqual({})
+//     expect(fx.situation.transforms).toEqual([])
+//     expect(fx.situation.once).toEqual({})
+//   })
+//
+//   describe('animate()', function () {
+//     it('set duration, ease and delay of the new situation to their default value when they are not passed', function() {
+//       var defaultDuration = 1000
+//         , defaultEase = SVG.easing['-']
+//         , defaultDelay = 0
+//         , lastSituation = fx.animate().last()
+//
+//       expect(lastSituation.duration).toBe(defaultDuration)
+//       expect(lastSituation.ease).toBe(defaultEase)
+//       expect(lastSituation.delay).toBe(defaultDelay)
+//     })
+//
+//     it('use the passed values to set duration, ease and delay of the new situation', function() {
+//       var duration = 14502
+//         , ease = '>'
+//         , delay = 450
+//         , lastSituation = fx.animate(duration, ease, delay).last()
+//
+//       expect(lastSituation.duration).toBe(duration)
+//       expect(lastSituation.ease).toBe(SVG.easing[ease])
+//       expect(lastSituation.delay).toBe(delay)
+//     })
+//
+//     it('allow duration, ease and delay to be passed in an object', function() {
+//       var o = {
+//                 duration: 7892
+//               , ease: '<'
+//               , delay: 1145
+//               }
+//         , lastSituation = fx.animate(o).last()
+//
+//       expect(lastSituation.duration).toBe(o.duration)
+//       expect(lastSituation.ease).toBe(SVG.easing[o.ease])
+//       expect(lastSituation.delay).toBe(o.delay)
+//     })
+//
+//     it('allow ease to be a custom function', function () {
+//       var customEase = function() {}
+//         , lastSituation = fx.animate({ease: customEase}).last()
+//
+//       expect(lastSituation.ease).toBe(customEase)
+//     })
+//   })
+//
+//   describe('target()', function(){
+//     it('returns the current fx object with no argument given', function(){
+//       expect(fx.target()).toBe(rect)
+//     })
+//
+//     it('changes the target of the animation when parameter given', function(){
+//       var c = draw.circle(5)
+//       expect(fx.target(c).target()).toBe(c)
+//     })
+//   })
+//
+//
+//   describe('timeToAbsPos()', function() {
+//     it('converts a timestamp to an absolute progress', function() {
+//       expect(fx.timeToAbsPos( fx.situation.start + fx.situation.duration*0.5 )).toBe(0.5)
+//     })
+//
+//     it('should take speed into consideration', function() {
+//       var spd
+//
+//       spd = 4
+//       fx.speed(spd)
+//       expect(fx.timeToAbsPos( fx.situation.start + (fx.situation.duration/spd)*0.5 )).toBe(0.5)
+//
+//       spd = 0.5
+//       fx.speed(spd)
+//       expect(fx.timeToAbsPos( fx.situation.start + (fx.situation.duration/spd)*0.25 )).toBe(0.25)
+//     })
+//   })
+//
+//
+//   describe('absPosToTime()', function() {
+//     it('converts an absolute progress to a timestamp', function() {
+//       expect(fx.absPosToTime(0.5)).toBe( fx.situation.start + fx.situation.duration*0.5 )
+//     })
+//
+//     it('should take speed into consideration', function() {
+//       var spd
+//
+//       spd = 4
+//       fx.speed(spd)
+//       expect(fx.absPosToTime(0.5)).toBe( fx.situation.start + (fx.situation.duration/spd)*0.5 )
+//
+//       spd = 0.5
+//       fx.speed(spd)
+//       expect(fx.absPosToTime(0.25)).toBe( fx.situation.start + (fx.situation.duration/spd)*0.25 )
+//     })
+//   })
+//
+//
+//   describe('atStart()', function () {
+//     it('sets the animation at the start', function() {
+//       // When the animation is running forward, the start position is 0
+//       fx.pos = 0.5
+//       expect(fx.atStart().pos).toBe(0)
+//
+//       // When the animation is running backward, the start position is 1
+//       fx.pos = 0.5
+//       expect(fx.reverse(true).atStart().pos).toBe(1)
+//     })
+//
+//     it('sets the animation at the start, before any loops', function() {
+//       fx.loop(true)
+//
+//       // When the animation is running forward, the start position is 0
+//       fx.at(3.7, true)
+//       expect(fx.absPos).toBe(3.7)
+//       expect(fx.pos).toBeCloseTo(0.7)
+//       expect(fx.situation.loop).toBe(3)
+//
+//       fx.atStart()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.situation.loop).toBe(0)
+//
+//       // When the animation is running backward, the start position is 1
+//       fx.reverse(true).at(2.14, true)
+//       expect(fx.absPos).toBe(2.14)
+//       expect(fx.pos).toBeCloseTo(1 - 0.14)
+//       expect(fx.situation.loop).toBe(2)
+//       expect(fx.situation.reversed).toBe(true)
+//
+//       fx.atStart()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.reversed).toBe(true)
+//     })
+//
+//     it('sets the animation at the start, before any loops when reversing is true', function() {
+//       fx.loop(true, true) // Set reversing to true
+//
+//       // When the animation is running forward, the start position is 0
+//       fx.at(11.21, true)
+//       expect(fx.absPos).toBe(11.21)
+//       expect(fx.pos).toBeCloseTo(1 - 0.21)
+//       expect(fx.situation.loop).toBe(11)
+//       expect(fx.situation.reversed).toBe(true)
+//
+//       fx.atStart()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.reversed).toBe(false)
+//
+//       // When the animation is running backward, the start position is 1
+//       fx.reverse(true).at(14.10, true)
+//       expect(fx.absPos).toBe(14.10)
+//       expect(fx.pos).toBeCloseTo(1 - 0.10)
+//       expect(fx.situation.loop).toBe(14)
+//       expect(fx.situation.reversed).toBe(true)
+//
+//       fx.atStart()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.reversed).toBe(true)
+//     })
+//   })
+//
+//
+//   describe('atEnd()', function () {
+//     it('sets the animation at the end', function() {
+//       // When the animation is running forward, the end position is 1
+//       fx.pos = 0.5
+//       expect(fx.atEnd().pos).toBe(1)
+//       expect(fx.situation).toBeNull()
+//
+//       // Recreate an animation since the other one was ended
+//       fx.animate()
+//
+//       // When the animation is running backward, the end position is 0
+//       fx.pos = 0.5
+//       expect(fx.reverse(true).atEnd().pos).toBe(0)
+//       expect(fx.situation).toBeNull()
+//     })
+//
+//     it('sets the animation at the end, after all loops', function() {
+//       var loops
+//
+//       // When the animation is running forward, the end position is 1
+//       loops = 12
+//       fx.loop(loops).start().step()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(loops)
+//
+//       fx.atEnd()
+//       expect(fx.absPos).toBe(loops)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//
+//       // Recreate an animation since the other one was ended
+//       fx.animate()
+//
+//
+//       // When the animation is running backward, the end position is 0
+//       loops = 21
+//       fx.reverse(true).loop(loops).start().step()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(loops)
+//       expect(fx.situation.reversed).toBe(true)
+//
+//       fx.atEnd()
+//       expect(fx.absPos).toBe(loops)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//     })
+//
+//     it('sets the animation at the end, after all loops when reversing is true', function() {
+//       var loops
+//
+//       // When reversing is true, the end position is 0 when loops is even and
+//       // 1 when loops is odd
+//
+//       // The animation is running forward
+//       loops = 6
+//       fx.loop(loops, true).start().step()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(loops)
+//       expect(fx.situation.reversed).toBe(false)
+//
+//       fx.atEnd()
+//       expect(fx.absPos).toBe(loops)
+//       expect(fx.pos).toBe(0) // End position is 0 because loops is even
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//
+//       // Recreate an animation since the other one was ended
+//       fx.animate()
+//
+//       // When reversing is true and the animation is running backward,
+//       // the end position is 1 when loops is even and 0 when loops is odd
+//
+//       // The animation is running backward
+//       loops = 3
+//       fx.reverse(true).loop(loops, true).start().step()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(loops)
+//       expect(fx.situation.reversed).toBe(true)
+//
+//       fx.atEnd()
+//       expect(fx.absPos).toBe(loops)
+//       expect(fx.pos).toBe(0) // End position is 0 because loops is odd
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//     })
+//
+//     it('sets the animation at the end of the current iteration when in an infinite loop', function () {
+//       // When the animation is running forward, the end position is 1
+//       fx.loop(true).start().step()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(true)
+//
+//       // Should be halfway through iteration 10
+//       jasmine.clock().tick(500 * 10 + 250)
+//       fx.step()
+//       expect(fx.absPos).toBe(10.5)
+//       expect(fx.pos).toBe(0.5)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(10)
+//       expect(fx.situation.loops).toBe(true)
+//
+//       fx.atEnd()
+//       expect(fx.absPos).toBe(11)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//
+//       // Recreate an animation since the other one was ended
+//       fx.animate(500)
+//
+//       // When the animation is running backward, the end position is 0
+//       fx.reverse(true).loop(true).start().step()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(true)
+//       expect(fx.situation.reversed).toBe(true)
+//
+//       // Should be halfway through iteration 21
+//       jasmine.clock().tick(500 * 21 + 250)
+//       fx.step()
+//       expect(fx.absPos).toBe(21.5)
+//       expect(fx.pos).toBe(0.5)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(21)
+//       expect(fx.situation.loops).toBe(true)
+//
+//       fx.atEnd()
+//       expect(fx.absPos).toBe(22)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//     })
+//
+//
+//     it('sets the animation at the end of the current iteration when in an infinite loop and reversing is true', function () {
+//       // When reversing is true, the end position is 1 when ending on an even
+//       // iteration and 0 when ending on an odd iteration as illustrated below:
+//
+//       //   0          Iteration          1
+//       //   |--------------0------------->|
+//       //   |<-------------1--------------|
+//       //   |--------------2------------->|
+//       //   |<-------------3--------------|
+//       //                 ...
+//
+//
+//       // The animation is running forward
+//       fx.loop(true, true).start().step()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(true)
+//
+//       // Should be halfway through iteration 11
+//       jasmine.clock().tick(500 * 11 + 250)
+//       fx.step()
+//       expect(fx.absPos).toBe(11.5)
+//       expect(fx.pos).toBe(0.5)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(11)
+//       expect(fx.situation.loops).toBe(true)
+//
+//       fx.atEnd()
+//       expect(fx.absPos).toBe(12)
+//       expect(fx.pos).toBe(0) // End position is 0 because ended on a odd iteration
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//
+//       // Recreate an animation since the other one was ended
+//       fx.animate(500)
+//
+//       // When reversing is true and the animation is running backward,
+//       // the end position is 0 when ending on an even iteration and
+//       // 1 when ending on an odd iteration as illustrated below:
+//
+//       //   0          Iteration          1
+//       //   |<-------------0--------------|
+//       //   |--------------1------------->|
+//       //   |<-------------2--------------|
+//       //   |--------------3------------->|
+//       //                 ...
+//
+//       // The animation is running backward
+//       fx.reverse(true).loop(true).start().step()
+//       expect(fx.absPos).toBe(0)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(true)
+//       expect(fx.situation.reversed).toBe(true)
+//
+//       // Should be halfway through iteration 42
+//       jasmine.clock().tick(500 * 42 + 250)
+//       fx.step()
+//       expect(fx.absPos).toBe(42.5)
+//       expect(fx.pos).toBe(0.5)
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(42)
+//       expect(fx.situation.loops).toBe(true)
+//
+//       fx.atEnd()
+//       expect(fx.absPos).toBe(43)
+//       expect(fx.pos).toBe(0) // End position is 0 because ended on an even iteration
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//     })
+//   })
+//
+//
+//   describe('at()', function() {
+//     it('sets the progress to the specified position', function() {
+//       var pos
+//
+//       // Animation running forward
+//       pos = 0.5
+//       expect(fx.at(pos).pos).toBe(pos)
+//       expect(fx.situation.start).toBe(+new Date - fx.situation.duration * pos)
+//
+//       // Animation running backward
+//       pos = 0.4
+//       expect(fx.reverse(true).at(pos).pos).toBe(pos)
+//       expect(fx.situation.start).toBe(+new Date - fx.situation.duration * (1-pos))
+//     })
+//
+//     it('should convert a position to an absolute position', function () {
+//       var pos, loop, absPos
+//
+//       fx.loop(true)
+//
+//       // Animation running forward
+//       pos = 0.7
+//       loop = 4
+//       absPos = pos+loop
+//       fx.situation.loop = loop
+//       expect(fx.at(pos).absPos).toBe(absPos)
+//       expect(fx.situation.start).toBe(+new Date - fx.situation.duration * absPos)
+//
+//       // Animation running backward
+//       pos = 0.23
+//       loop = 9
+//       absPos = (1-pos)+loop
+//       fx.situation.loop = loop
+//       fx.situation.reversed = true
+//       expect(fx.at(pos).absPos).toBe(absPos)
+//       expect(fx.situation.start).toBe(+new Date - fx.situation.duration * absPos)
+//
+//     })
+//
+//     it('should end the animation when the end position is passed', function() {
+//       var pos
+//
+//       fx.start()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation).not.toBeNull()
+//
+//       // When running forward, the end position is 1
+//       pos = 1
+//       expect(fx.at(pos).pos).toBe(pos)
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//
+//       // Recreate an animation since the other one was ended
+//       fx.animate().start()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation).not.toBeNull()
+//
+//       // When running backward, the end position is 0
+//       pos = 0
+//       expect(fx.reverse(true).at(pos).pos).toBe(pos)
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//     })
+//
+//     it('correct the passed position when it is out of [0,1] and the animation is not looping', function () {
+//       var pos
+//
+//       pos = -0.7
+//       expect(fx.at(pos).pos).toBe(0)
+//
+//       pos = 1.3
+//       expect(fx.at(pos).pos).toBe(1)
+//
+//       // Recreate an animation since the other one was ended
+//       fx.animate()
+//
+//       // Should work even when animation is running backward
+//       pos = 1.3
+//       expect(fx.reverse(true).at(pos).pos).toBe(1)
+//
+//       pos = -0.7
+//       expect(fx.reverse(true).at(pos).pos).toBe(0)
+//     })
+//
+//     it('should, when the animation is looping and the passed position is out of [0,1], use the integer part of postion to update the loop counter and set position to its fractional part', function(){
+//       var loop, pos, posFrac, posInt
+//
+//       // Without the reverse flag
+//       fx.loop(10)
+//       expect(fx.situation.loops).toBe(10)
+//       expect(fx.situation.loop).toBe(loop = 0)
+//
+//       pos = 1.3
+//       posFrac = pos % 1
+//       posInt = pos - posFrac
+//       expect(fx.at(pos).pos).toBeCloseTo(posFrac)
+//       expect(fx.situation.loop).toBe(loop += posInt)
+//
+//       pos = 7.723
+//       posFrac = pos % 1
+//       posInt = pos - posFrac
+//       expect(fx.at(pos).pos).toBeCloseTo(posFrac)
+//       expect(fx.situation.loop).toBe(loop += posInt)
+//
+//       // In this case, pos is above the remaining number of loops, so we expect
+//       // the position to be set to 1 and the animation to be ended
+//       pos = 4.3
+//       posFrac = pos % 1
+//       posInt = pos - posFrac
+//       expect(fx.at(pos).pos).toBe(1)
+//       expect(fx.situation).toBeNull()
+//
+//       // Recreate an animation since the other one was ended
+//       fx.animate()
+//
+//       // With the reverse flag, the position is reversed each time loop is odd
+//       fx.loop(10, true)
+//       expect(fx.situation.loops).toBe(10)
+//       expect(fx.situation.loop).toBe(loop = 0)
+//       expect(fx.situation.reversed).toBe(false)
+//
+//       pos = 3.3
+//       posFrac = pos % 1
+//       posInt = pos - posFrac
+//       expect(fx.at(pos).pos).toBeCloseTo(1-posFrac) // Animation is reversed because 0+3 is odd
+//       expect(fx.situation.loop).toBe(loop += posInt)
+//       expect(fx.situation.reversed).toBe(true)
+//
+//       // When the passed position is below 0, the integer part of position is
+//       // substracted from 1, so, in this case, -0.6 has 1 as is integer part
+//       // This is necessary so we can add something to the loop counter
+//       pos = -0.645
+//       posFrac = (1-pos) % 1
+//       posInt = (1-pos) - posFrac
+//       expect(fx.at(pos).pos).toBeCloseTo(posFrac)
+//       expect(fx.situation.loop).toBe(loop += posInt)
+//       expect(fx.situation.reversed).toBe(false)
+//
+//       // In this case, pos is above the remaining number of loop, so we expect
+//       // the position to be set to 0 (since we end reversed) and the animation to
+//       // be ended
+//       pos = 7.2
+//       posFrac = pos % 1
+//       posInt = pos - posFrac
+//       expect(fx.at(pos).pos).toBe(0)
+//       expect(fx.situation).toBeNull()
+//     })
+//
+//     it('should, when the animation is in a infinite loop and the passed position is out of [0,1], use the integer part of postion to update the loop counter and set position to its fractional part', function(){
+//       var loop, pos, posFrac, posInt
+//
+//       // Without the reverse flag
+//       fx.loop(true)
+//       expect(fx.situation.loops).toBe(true)
+//       expect(fx.situation.loop).toBe(loop = 0)
+//
+//       pos = 10.34
+//       posFrac = pos % 1
+//       posInt = pos - posFrac
+//       expect(fx.at(pos).pos).toBeCloseTo(posFrac)
+//       expect(fx.situation.loop).toBe(loop += posInt)
+//
+//       // With the reverse flag, the position is reversed each time loop is odd
+//       fx.loop(true, true)
+//       expect(fx.situation.loops).toBe(true)
+//       expect(fx.situation.loop).toBe(loop = 0)
+//       expect(fx.situation.reversed).toBe(false)
+//
+//       pos = 3.3
+//       posFrac = pos % 1
+//       posInt = pos - posFrac
+//       expect(fx.at(pos).pos).toBeCloseTo(1-posFrac) // Animation is reversed because 3+0 is odd
+//       expect(fx.situation.loop).toBe(loop += posInt)
+//       expect(fx.situation.reversed).toBe(true)
+//
+//       pos = -8.41
+//       posFrac = (1-pos) % 1
+//       posInt = (1-pos) - posFrac
+//       expect(fx.at(pos).pos).toBeCloseTo(posFrac)
+//       expect(fx.situation.loop).toBe(loop += posInt)
+//       expect(fx.situation.reversed).toBe(false)
+//     })
+//
+//     it('should take speed into consideration', function() {
+//       var dur, spd
+//
+//       dur = fx.situation.duration
+//
+//       spd = 4
+//       fx.speed(spd).at(0)
+//       expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
+//
+//       spd = 5
+//       fx.speed(spd).at(0.15)
+//       expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
+//
+//       spd = 0.25
+//       fx.speed(spd).at(0.75)
+//       expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
+//
+//       spd = 0.5
+//       fx.speed(spd).at(0.83)
+//       expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
+//     })
+//
+//     it('should consider the first parameter as an absolute position when the second parameter is true', function() {
+//       var absPos
+//
+//       fx.loop(true)
+//
+//       absPos = 3.2
+//       expect(fx.at(absPos, true).absPos).toBe(absPos)
+//
+//       absPos = -4.27
+//       expect(fx.at(absPos, true).absPos).toBe(absPos)
+//
+//       absPos = 0
+//       expect(fx.at(absPos, true).absPos).toBe(absPos)
+//
+//       absPos = 1
+//       expect(fx.at(absPos, true).absPos).toBe(absPos)
+//     })
+//   })
+//
+//
+//   describe('start()', function(){
+//     it('starts the animation', function() {
+//       fx.start()
+//       expect(fx.active).toBe(true)
+//
+//       jasmine.clock().tick(200)
+//       fx.step() // Call step to update the animation
+//
+//       expect(fx.pos).toBeGreaterThan(0)
+//     })
+//
+//     it('should take speed into consideration', function() {
+//       var dur = 500
+//         , delay = 300
+//         , spd = 4
+//
+//
+//       fx.stop().animate(dur, '-', delay).speed(spd).start()
+//       expect(fx.situation.finish - new Date).toBe(delay/spd + dur/spd)
+//     })
+//
+//     it('should do the delay', function() {
+//       fx.situation.delay = 1000
+//       expect(fx.start().active).toBe(true)
+//
+//       jasmine.clock().tick(501)
+//       fx.step() // Call step to update the animation
+//       expect(fx.active).toBe(true)
+//
+//       jasmine.clock().tick(501)
+//       fx.step() // Call step to update the animation
+//       expect(fx.active).toBe(true)
+//
+//       jasmine.clock().tick(501)
+//       fx.step() // Call step to update the animation
+//       expect(fx.active).toBe(false)
+//     })
+//   })
+//
+//   describe('delay()', function() {
+//     it('should push an empty situation with its duration attribute set to the duration of the delay', function() {
+//       var delay = 8300
+//       fx.delay(delay)
+//       expect(fx.situations[0].duration).toBe(delay)
+//     })
+//   })
+//
+//
+//   describe('pause()', function() {
+//     it('pause the animation', function() {
+//       expect(fx.pause().paused).toBe(true)
+//     })
+//   })
+//
+//   describe('play()', function() {
+//     it('returns itself when animation not paused', function() {
+//       expect(fx.paused).toBe(false)
+//       expect(fx.play()).toBe(fx)
+//     })
+//
+//     it('unpause the animation', function() {
+//       var start = fx.start().pause().situation.start
+//
+//       jasmine.clock().tick(200)
+//
+//       expect(fx.situation.start).toBe(start)
+//       expect(fx.play().paused).toBe(false)
+//       expect(fx.situation.start).not.toBe(start)
+//     })
+//
+//     it('should not change the position when the animation is unpaused while it is set to run backward', function(){
+//       var pos = 0.4
+//
+//       expect(fx.reverse(true).at(pos).pause().play().pos).toBe(pos)
+//     })
+//
+//     it('should be able to unpause the delay', function () {
+//       fx.stop().animate(500, '-', 300).start().step()
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBeCloseTo(-0.6)
+//
+//       // At this point, we should have an animation of 500 ms with a delay of
+//       // 300 ms that should be running.
+//
+//       jasmine.clock().tick(150)
+//
+//       // Should be halfway through the delay
+//       fx.step()
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(-0.3)
+//
+//       expect(fx.pause().paused).toBe(true) // Pause the delay
+//
+//       jasmine.clock().tick(150)
+//
+//       // Unpause, should still be halfway through the delay
+//       expect(fx.play().paused).toBe(false)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(-0.3)
+//
+//       jasmine.clock().tick(150)
+//
+//       // Delay should be done
+//       fx.step()
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(0)
+//
+//       jasmine.clock().tick(500)
+//
+//       // Animation and delay should be done
+//       fx.step()
+//       expect(fx.active).toBe(false)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.absPos).toBe(1)
+//     })
+//   })
+//
+//
+//   describe('speed()', function() {
+//     it('set the speed of the animation', function(){
+//       var dur, spd
+//
+//       dur = fx.situation.duration
+//
+//       spd = 2
+//       fx.speed(spd)
+//       expect(fx._speed).toBe(spd)
+//       expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
+//
+//       spd = 0.5
+//       fx.speed(spd)
+//       expect(fx._speed).toBe(spd)
+//       expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
+//
+//       spd = 2
+//       fx.at(0.2).speed(spd)
+//       expect(fx._speed).toBe(spd)
+//       expect(fx.situation.finish-fx.situation.start).toBe(dur/spd)
+//
+//       spd = 1
+//       fx.speed(spd)
+//       expect(fx._speed).toBe(spd)
+//       expect(fx.situation.finish-fx.situation.start).toBe(dur)
+//     })
+//
+//     it('should not change the position when the animation is run backward', function(){
+//       var pos = 0.4
+//
+//       expect(fx.reverse(true).at(pos).speed(2).pos).toBe(pos)
+//     })
+//
+//     it('return the current speed with no argument given', function(){
+//       var spd
+//
+//       spd = 2
+//       fx._speed = spd
+//       expect(fx.speed()).toBe(spd)
+//
+//       spd = 0.5
+//       fx._speed = spd
+//       expect(fx.speed()).toBe(spd)
+//
+//       spd = 1
+//       fx._speed = spd
+//       expect(fx.speed()).toBe(spd)
+//     })
+//
+//     it('pause the animation when a speed of 0 is passed', function(){
+//       var spd = fx._speed
+//
+//       expect(fx.speed(0)).toBe(fx)
+//       expect(fx._speed).toBe(spd)
+//       expect(fx.paused).toBe(true)
+//     })
+//
+//     it('should affect all animations in the queue', function(){
+//       fx.speed(2).animate(300)
+//       expect(fx.situations.length).not.toBe(0)
+//       expect(fx.pos).not.toBe(1)
+//
+//       // At this point, there should be 2 animations in the queue to be played:
+//       // the one of 500ms that is added before every test and the one of 300ms
+//       // we just added. Normally, it would take 800ms before both of these
+//       // animations are done, but because we set the speed to 2, it should
+//       // only take 400ms to do both animations.
+//       fx.start().step()
+//
+//       jasmine.clock().tick(250)
+//
+//       // Should be playing the second animation
+//       fx.step()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situations.length).toBe(0)
+//       expect(fx.pos).not.toBe(1)
+//
+//       jasmine.clock().tick(150) // 400ms have passed
+//
+//       // All animations should be done
+//       fx.step()
+//       expect(fx.active).toBe(false)
+//       expect(fx.situations.length).toBe(0)
+//       expect(fx.pos).toBe(1)
+//     })
+//
+//     it('should affect the delay', function() {
+//       fx.stop().animate(500, '-', 300).start().step()
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBeCloseTo(-0.6)
+//
+//       fx.speed(2)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBeCloseTo(-0.6)
+//
+//       // At this point, we should have an animation of 500 ms with a delay of
+//       // 300 ms that should be running. Normally, it would take 800 ms for the
+//       // animation and its delay to complete, but because the speed is set to 2
+//       // , it should only take 400ms
+//
+//       jasmine.clock().tick(75)
+//
+//       // Should be halfway through the delay
+//       fx.step()
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(-0.3)
+//
+//       jasmine.clock().tick(75)
+//
+//       // Delay should be done
+//       fx.step()
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(0)
+//
+//       jasmine.clock().tick(250)
+//
+//       // Animation and delay should be done
+//       fx.step()
+//       expect(fx.active).toBe(false)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.absPos).toBe(1)
+//     })
+//   })
+//
+//
+//   describe('reverse()', function() {
+//     it('toggles the direction of the animation without a parameter', function() {
+//       expect(fx.reverse().situation.reversed).toBe(true)
+//     })
+//     it('sets the direction to backwards with true given', function() {
+//       expect(fx.reverse(true).situation.reversed).toBe(true)
+//     })
+//     it('sets the direction to forwards with false given', function() {
+//       expect(fx.reverse(false).situation.reversed).toBe(false)
+//     })
+//   })
+//
+//
+//   describe('queue()', function() {
+//     it('can add a situation to the queue', function() {
+//       var situation = new SVG.Situation({duration: 1000, delay: 0, ease: SVG.easing['-']})
+//
+//       fx.queue(situation)
+//       expect(fx.situations[0]).toBe(situation)
+//     })
+//
+//     it('can add a function to the queue', function() {
+//       var f = function(){}
+//
+//       fx.queue(f)
+//       expect(fx.situations[0]).toBe(f)
+//     })
+//
+//     it('should set the situation attribute before pushing something in the situations queue', function(){
+//       var situation = new SVG.Situation({duration: 1000, delay: 0, ease: SVG.easing['-']})
+//
+//       // Clear the animation that is created before each test
+//       fx.stop()
+//
+//       expect(fx.situation).toBeNull()
+//       expect(fx.situations.length).toBe(0)
+//       fx.queue(situation)
+//       expect(fx.situation).toBe(situation)
+//       expect(fx.situations.length).toBe(0)
+//     })
+//   })
+//
+//
+//   describe('dequeue()', function() {
+//     it('should pull the next situtation from the queue', function() {
+//       var situation = new SVG.Situation({duration: 1000, delay: 0, ease: SVG.easing['-']})
+//
+//       fx.queue(situation)
+//       expect(fx.situtation).not.toBe(situation)
+//       expect(fx.situations[0]).toBe(situation)
+//
+//       fx.dequeue()
+//       expect(fx.situation).toBe(situation)
+//       expect(fx.situations.length).toBe(0)
+//     })
+//
+//     it('initialize the animation pulled from the queue to its start position', function() {
+//       // When the animation is forward, the start position is 0
+//       fx.animate()
+//       fx.pos = 0.5
+//       expect(fx.dequeue().pos).toBe(0)
+//
+//       // When the animation backward, the start position is 1
+//       fx.animate().reverse(true)
+//       fx.pos = 0.5
+//       expect(fx.dequeue().pos).toBe(1)
+//     })
+//
+//     it('when the first element of the queue is a function, it should execute it', function() {
+//       var called = false
+//
+//       fx.queue(function(){
+//         called = true
+//         expect(this).toBe(fx)
+//         this.dequeue()
+//       }).dequeue()
+//
+//       expect(called).toBe(true)
+//     })
+//
+//     it('should stop the currently running animation when there is one', function() {
+//       fx.start()
+//       expect(fx.active).toBe(true)
+//       fx.queue(function() {
+//         expect(this.active).toBe(false)
+//         this.dequeue()
+//       })
+//       fx.dequeue()
+//     })
+//   })
+//
+//
+//   describe('stop()', function() {
+//     it('stops the animation immediately without a parameter', function() {
+//       fx.animate(500).start()
+//       expect(fx.stop().situation).toBeNull()
+//       expect(fx.active).toBe(false)
+//       expect(fx.situations.length).toBe(1)
+//     })
+//     it('stops the animation immediately and fullfill it if first parameter true', function() {
+//       fx.animate(500).start()
+//       expect(fx.stop(true).situation).toBeNull()
+//       expect(fx.active).toBe(false)
+//       expect(fx.pos).toBe(1)
+//       expect(fx.situations.length).toBe(1)
+//     })
+//     it('stops the animation immediately and remove all items from queue when second parameter true', function() {
+//       fx.animate(500).start()
+//       expect(fx.stop(false, true).situation).toBeNull()
+//       expect(fx.active).toBe(false)
+//       expect(fx.situations.length).toBe(0)
+//     })
+//   })
+//
+//
+//   describe('reset()', function() {
+//     it('resets the element to the state it was when the current animation was started', function() {
+//       var loops = 4
+//         , situation = fx.situation
+//
+//       // These settings make the animations run backward
+//       fx.situation.loop = 2
+//       fx.situation.loops = loops
+//       fx.situation.reversed = true
+//       fx.pos = 0.5
+//       fx.absPos = 2.5
+//
+//       fx.reset()
+//
+//       expect(fx.situation).toBe(situation)
+//       expect(fx.situation.loops).toBe(loops)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.reversed).toBe(true) // True because the animation is backward
+//       expect(fx.pos).toBe(1)
+//       expect(fx.absPos).toBe(0)
+//     })
+//   })
+//
+//
+//   describe('finish()', function() {
+//     it('finish the whole animation by fullfilling every single one', function() {
+//       fx.animate(500)
+//       expect(fx.finish().pos).toBe(1)
+//       expect(fx.situations.length).toBe(0)
+//       expect(fx.situation).toBeNull()
+//     })
+//   })
+//
+//
+//   describe('progress()', function() {
+//     it('returns the current position', function() {
+//       expect(fx.progress()).toBe(0)
+//       expect(fx.progress()).toBe(fx.pos)
+//     })
+//     it('returns the current position as eased value if fist argument is true', function() {
+//       var anim = draw.rect(100,100).animate(500,'>').start()
+//       expect(anim.progress(true)).toBe(0)
+//
+//       anim.at(0.25)
+//       expect(anim.progress(true)).toBeCloseTo(anim.situation.ease(0.25))
+//     })
+//   })
+//
+//
+//   describe('after()', function() {
+//     it('adds a callback which is called when the current animation is finished', function() {
+//       var called = false
+//
+//       fx.start().after(function(situation){
+//         expect(fx.situation).toBe(situation)
+//         expect(fx.pos).toBe(1)
+//         called = true
+//       })
+//
+//       jasmine.clock().tick(500)
+//       fx.step()
+//       expect(called).toBe(true)
+//     })
+//   })
+//
+//
+//   describe('afterAll()', function() {
+//     it('adds a callback which is called when all animations are finished', function() {
+//       var called = false
+//
+//       fx.animate(150).animate(125).start().afterAll(function(){
+//         expect(fx.pos).toBe(1)
+//         expect(fx.situations.length).toBe(0)
+//         called = true
+//       })
+//
+//       expect(fx.situations.length).toBe(2)
+//
+//       // End of the first animation
+//       jasmine.clock().tick(500)
+//       fx.step()
+//       expect(fx.situations.length).toBe(1)
+//       expect(called).toBe(false)
+//
+//       // End of the second animation
+//       jasmine.clock().tick(150)
+//       fx.step()
+//       expect(fx.situations.length).toBe(0)
+//       expect(called).toBe(false)
+//
+//       // End of the third and last animation
+//       jasmine.clock().tick(125)
+//       fx.step()
+//       expect(fx.situation).toBeNull()
+//       expect(called).toBe(true)
+//     })
+//   })
+//
+//
+//   describe('during()', function() {
+//     it('adds a callback which is called on every animation step', function() {
+//       var called = 0
+//
+//       fx.start().during(function(pos, morph, eased, situation){
+//
+//         expect(fx.situation).toBe(situation)
+//
+//         switch(++called) {
+//           case 1:
+//             expect(pos).toBeCloseTo(0.25)
+//             break
+//
+//           case 2:
+//             expect(pos).toBeCloseTo(0.5)
+//             break
+//
+//           case 3:
+//             expect(pos).toBeCloseTo(0.65)
+//             break
+//
+//           case 4:
+//             expect(pos).toBe(1)
+//             break
+//         }
+//
+//         expect(morph(0, 100)).toBeCloseTo(pos*100)
+//
+//       })
+//
+//       jasmine.clock().tick(125)
+//       fx.step()
+//       expect(called).toBe(1)
+//
+//       jasmine.clock().tick(125) // 250 ms have passed
+//       fx.step()
+//       expect(called).toBe(2)
+//
+//       jasmine.clock().tick(75) // 325 ms have passed
+//       fx.step()
+//       expect(called).toBe(3)
+//
+//       jasmine.clock().tick(175) // 500 ms have passed
+//       fx.step()
+//       expect(called).toBe(4)
+//     })
+//   })
+//
+//
+//   describe('duringAll()', function() {
+//     it('adds a callback which is called on every animation step for the whole chain', function() {
+//
+//       fx.finish()
+//       rect.off('.fx')
+//
+//       fx.animate(500).start().animate(500)
+//
+//       var sit = null
+//
+//       var pos1 = false
+//       var pos2 = false
+//
+//       fx.duringAll(function(pos, morph, eased, situation){
+//
+//         if(pos1){
+//           pos1 = false
+//           sit = situation
+//           expect(this.fx.pos).toBeCloseTo(0.6)
+//         }
+//
+//         if(pos2){
+//           pos2 = null
+//           expect(situation).not.toBe(sit)
+//           expect(this.fx.pos).toBeCloseTo(0.75)
+//         }
+//       })
+//
+//       pos1 = true
+//       jasmine.clock().tick(300)
+//       fx.step()
+//
+//       jasmine.clock().tick(200) // End of the first animation
+//       fx.step()
+//
+//       pos2 = true
+//       jasmine.clock().tick(375)
+//       fx.step()
+//
+//       if(pos1 || pos2) {
+//         fail('Not enough situations called')
+//       }
+//     })
+//   })
+//
+//
+//   describe('once()', function() {
+//     it('adds a callback which is called once at the specified position', function() {
+//       var called = false
+//
+//       fx.start().once(0.5, function(pos, eased){
+//         called = true
+//         expect(pos).toBeCloseTo(0.5)
+//       })
+//
+//       jasmine.clock().tick(125)
+//       fx.step()
+//       expect(called).toBe(false)
+//
+//       jasmine.clock().tick(125) // 250 ms have passed
+//       fx.step()
+//       expect(called).toBe(true)
+//     })
+//
+//     it('adds the callback on the last situation', function () {
+//       var callback = function () {}
+//
+//       fx.animate(500).animate(500).once(0.5, callback)
+//       expect(fx.situation.once['0.5']).toBeUndefined()
+//       expect(fx.situations[0].once['0.5']).toBeUndefined()
+//       expect(fx.situations[1].once['0.5']).toBe(callback)
+//     })
+//   })
+//
+//
+//   describe('loop()', function() {
+//     it('should create an eternal loop when no arguments are given', function() {
+//       var time = 10523, dur = fx.situation.duration
+//
+//       fx.loop()
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(true)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(0)
+//
+//       fx.start().step()
+//       jasmine.clock().tick(time)
+//       fx.step()
+//
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe( Math.floor(time/dur) )
+//       expect(fx.situation.loops).toBe(true)
+//       expect(fx.pos).toBeCloseTo((time/dur) % 1)
+//       expect(fx.absPos).toBeCloseTo(time/dur)
+//     })
+//
+//     it('should create an eternal loop when the first argument is true', function() {
+//       var time = 850452, dur = fx.situation.duration
+//
+//       fx.loop(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(true)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(0)
+//
+//       fx.start().step()
+//       jasmine.clock().tick(time)
+//       fx.step()
+//
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe( Math.floor(time/dur) )
+//       expect(fx.situation.loops).toBe(true)
+//       expect(fx.pos).toBeCloseTo((time/dur) % 1)
+//       expect(fx.absPos).toBeCloseTo(time/dur)
+//     })
+//
+//     it('should loop for the specified number of times', function() {
+//       var time = 0, dur = fx.situation.duration
+//
+//       fx.loop(3)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(3)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(0)
+//
+//       fx.start().step()
+//       jasmine.clock().tick(200)
+//       time = 200
+//
+//       fx.step()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(3)
+//       expect(fx.pos).toBeCloseTo((time/dur) % 1)
+//       expect(fx.absPos).toBeCloseTo(time/dur)
+//
+//       jasmine.clock().tick(550)
+//       time += 550 // time at 750
+//
+//       fx.step()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(1)
+//       expect(fx.situation.loops).toBe(3)
+//       expect(fx.pos).toBeCloseTo((time/dur) % 1)
+//       expect(fx.absPos).toBeCloseTo(time/dur)
+//
+//       jasmine.clock().tick(570)
+//       time += 570 // time at 1320
+//
+//       fx.step()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(2)
+//       expect(fx.situation.loops).toBe(3)
+//       expect(fx.pos).toBeCloseTo((time/dur) % 1)
+//       expect(fx.absPos).toBeCloseTo(time/dur)
+//
+//       jasmine.clock().tick(180)
+//       time += 180 // time at 1500
+//
+//       fx.step()
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//       expect(fx.pos).toBe(1)
+//       expect(fx.absPos).toBe(3)
+//     })
+//
+//     it('should go from beginning to end and start over again (0->1.0->1.0->1.) by default', function() {
+//       var time = 0, dur = fx.situation.duration
+//
+//       fx.loop(2)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(2)
+//       expect(fx.situation.reversing).toBe(false)
+//       expect(fx.situation.reversed).toBe(false)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(0)
+//
+//       fx.start().step()
+//       jasmine.clock().tick(325)
+//       time = 325
+//
+//       fx.step()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(2)
+//       expect(fx.situation.reversing).toBe(false)
+//       expect(fx.situation.reversed).toBe(false)
+//       expect(fx.pos).toBeCloseTo((time/dur) % 1)
+//       expect(fx.absPos).toBeCloseTo(time/dur)
+//
+//       jasmine.clock().tick(575)
+//       time += 575 // time at 900
+//
+//       fx.step()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(1)
+//       expect(fx.situation.loops).toBe(2)
+//       expect(fx.situation.reversing).toBe(false)
+//       expect(fx.situation.reversed).toBe(false)
+//       expect(fx.pos).toBeCloseTo((time/dur) % 1)
+//       expect(fx.absPos).toBeCloseTo(time/dur)
+//
+//       jasmine.clock().tick(200)
+//       time += 200 // time at 1100
+//
+//       fx.step()
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//       expect(fx.pos).toBe(1)
+//       expect(fx.absPos).toBe(2)
+//     })
+//
+//     it('should be completely reversed before starting over (0->1->0->1->0->1.) when the reverse flag is passed', function() {
+//       var time = 0, dur = fx.situation.duration
+//
+//       fx.loop(2, true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(2)
+//       expect(fx.situation.reversing).toBe(true)
+//       expect(fx.situation.reversed).toBe(false)
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(0)
+//
+//       fx.start().step()
+//       jasmine.clock().tick(325)
+//       time = 325
+//
+//       fx.step()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(2)
+//       expect(fx.situation.reversing).toBe(true)
+//       expect(fx.situation.reversed).toBe(false)
+//       expect(fx.pos).toBeCloseTo((time/dur) % 1)
+//       expect(fx.absPos).toBeCloseTo(time/dur)
+//
+//       jasmine.clock().tick(575)
+//       time += 575 // time at 900
+//
+//       fx.step()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation.loop).toBe(1)
+//       expect(fx.situation.loops).toBe(2)
+//       expect(fx.situation.reversing).toBe(true)
+//       expect(fx.situation.reversed).toBe(true)
+//       expect(fx.pos).toBeCloseTo(1 - (time/dur) % 1)
+//       expect(fx.absPos).toBeCloseTo(time/dur)
+//
+//       jasmine.clock().tick(200)
+//       time += 200 // time at 1100
+//
+//       fx.step()
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//       expect(fx.pos).toBe(0)
+//       expect(fx.absPos).toBe(2)
+//     })
+//
+//     it('should be applied on the last situation', function() {
+//       fx.loop(5)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(5)
+//       expect(fx.situation.reversing).toBe(false)
+//
+//       fx.animate().loop(3, true)
+//       expect(fx.situation.loop).toBe(0)
+//       expect(fx.situation.loops).toBe(5)
+//       expect(fx.situation.reversing).toBe(false)
+//
+//       var c = fx.last()
+//       expect(c.loop).toBe(0)
+//       expect(c.loops).toBe(3)
+//       expect(c.reversing).toBe(true)
+//     })
+//
+//     it('should be possible to call it with false as the first argument', function() {
+//       fx.situation.loops = true
+//       fx.loop(false)
+//       expect(fx.situation.loops).toBe(false)
+//     })
+//   })
+//
+//
+//   describe('step()', function() {
+//     it('should not recalculate the absolute position if the first parameter is true', function() {
+//       var absPos
+//
+//       // We shift start to help us see if the absolute position get recalculated
+//       // If it get recalculated, the result would be 0.5
+//       fx.situation.start -= 250
+//
+//       absPos = 0.4
+//       fx.absPos = absPos
+//       expect(fx.step(true).absPos).toBe(absPos)
+//
+//       absPos = 0
+//       fx.absPos = absPos
+//       expect(fx.step(true).absPos).toBe(absPos)
+//
+//       absPos = -3.7
+//       fx.absPos = absPos
+//       expect(fx.step(true).absPos).toBe(absPos)
+//
+//       absPos = 1
+//       fx.absPos = absPos
+//       expect(fx.step(true).absPos).toBe(absPos)
+//     })
+//
+//     it('should not allow an absolute position to be above the end', function() {
+//       var absPos, loops
+//
+//       // With no loops, absolute position should not go above 1
+//       absPos = 4.26
+//       fx.absPos = absPos
+//       expect(fx.step(true).absPos).toBe(1)
+//       expect(fx.situation).toBeNull()
+//
+//       fx.animate() // Recreate an animation since the other one was ended
+//
+//       // With loops, absolute position should not go above loops
+//       loops = 4
+//       absPos = 7.42
+//       fx.absPos = absPos
+//       expect(fx.loop(loops).step(true).absPos).toBe(loops)
+//       expect(fx.situation).toBeNull()
+//     })
+//
+//     describe('when converting an absolute position to a position', function() {
+//       it('should, when the absolute position is below the maximum number of loops, use the integer part of the absolute position to set the loop counter and use its fractional part to set the position', function(){
+//         var absPos, absPosFrac, absPosInt, loops
+//
+//         // Without the reverse flag
+//         loops = 12
+//         absPos = 4.52
+//         absPosInt = Math.floor(absPos)
+//         absPosFrac = absPos - absPosInt
+//         fx.absPos = absPos
+//         fx.loop(loops).step(true)
+//         expect(fx.pos).toBe(absPosFrac)
+//         expect(fx.situation.loop).toBe(absPosInt)
+//
+//         fx.stop().animate()
+//
+//         loops = true
+//         absPos = 2.57
+//         absPosInt = Math.floor(absPos)
+//         absPosFrac = absPos - absPosInt
+//         fx.absPos = absPos
+//         fx.loop(loops).step(true)
+//         expect(fx.pos).toBe(absPosFrac)
+//         expect(fx.situation.loop).toBe(absPosInt)
+//
+//         fx.stop().animate()
+//
+//         // With the reverse flag, the position is reversed at each odd loop
+//         loops = 412
+//         absPos = 6.14
+//         absPosInt = Math.floor(absPos)
+//         absPosFrac = absPos - absPosInt
+//         fx.absPos = absPos
+//         fx.loop(loops, true).step(true)
+//         expect(fx.pos).toBe(absPosFrac)
+//         expect(fx.situation.loop).toBe(absPosInt)
+//         expect(fx.situation.reversed).toBe(false)
+//
+//         fx.stop().animate()
+//
+//         loops = true
+//         absPos = 5.12
+//         absPosInt = Math.floor(absPos)
+//         absPosFrac = absPos - absPosInt
+//         fx.absPos = absPos
+//         fx.loop(loops, true).step(true)
+//         expect(fx.pos).toBe(1-absPosFrac) // Odd loop, so it is reversed
+//         expect(fx.situation.loop).toBe(absPosInt)
+//         expect(fx.situation.reversed).toBe(true)
+//
+//         fx.stop().animate()
+//
+//         // When the animation is set to run backward, it is the opposite, the position is reversed at each even loop
+//         loops = 14
+//         absPos = 8.46
+//         absPosInt = Math.floor(absPos)
+//         absPosFrac = absPos - absPosInt
+//         fx.absPos = absPos
+//         fx.reverse(true).loop(loops, true).step(true)
+//         expect(fx.pos).toBe(1-absPosFrac) // Even loop, so it is reversed
+//         expect(fx.situation.loop).toBe(absPosInt)
+//         expect(fx.situation.reversed).toBe(true)
+//
+//         fx.stop().animate()
+//
+//         loops = true
+//         absPos = 3.12
+//         absPosInt = Math.floor(absPos)
+//         absPosFrac = absPos - absPosInt
+//         fx.absPos = absPos
+//         fx.reverse(true).loop(loops, true).step(true)
+//         expect(fx.pos).toBe(absPosFrac)
+//         expect(fx.situation.loop).toBe(absPosInt)
+//         expect(fx.situation.reversed).toBe(false)
+//       })
+//
+//       it('should, when the absolute position is above or equal to the the maximum number of loops, set the position to its end value and end the animation', function() {
+//         var absPos, loops
+//
+//         // Without the reverse flag, the end value of position is 1
+//         loops = 6
+//         absPos = 13.52
+//         fx.absPos = absPos
+//         fx.loop(loops).step(true)
+//         expect(fx.pos).toBe(1)
+//         expect(fx.situation).toBeNull()
+//
+//         fx.animate() // Recreate an animation since the other one was ended
+//
+//         loops = false
+//         absPos = 146.22
+//         fx.absPos = absPos
+//         fx.loop(loops).step(true)
+//         expect(fx.pos).toBe(1)
+//         expect(fx.situation).toBeNull()
+//
+//         fx.animate() // Recreate an animation since the other one was ended
+//
+//         // With the reverse flag, the end value of position is 0 when loops is even and 1 when loops is an odd number or false
+//         loops = 6
+//         absPos = 6
+//         fx.absPos = absPos
+//         fx.loop(loops, true).step(true)
+//         expect(fx.pos).toBe(0) // Even loops
+//         expect(fx.situation).toBeNull()
+//
+//         fx.animate() // Recreate an animation since the other one was ended
+//
+//         loops = false
+//         absPos = 4.47
+//         fx.absPos = absPos
+//         fx.loop(loops, true).step(true)
+//         expect(fx.pos).toBe(1) // 1 since loops is false
+//         expect(fx.situation).toBeNull()
+//
+//         fx.animate() // Recreate an animation since the other one was ended
+//
+//         // When the animation is set to run backward, it is the opposite, the end value of position is 1 when loops is even and 0 when loops is an odd number or false
+//         loops = 8
+//         absPos = 12.65
+//         fx.absPos = absPos
+//         fx.reverse(true).loop(loops, true).step(true)
+//         expect(fx.pos).toBe(1) // Even loops
+//         expect(fx.situation).toBeNull()
+//
+//         fx.animate() // Recreate an animation since the other one was ended
+//
+//         loops = 11
+//         absPos = 12.41
+//         fx.absPos = absPos
+//         fx.reverse(true).loop(loops, true).step(true)
+//         expect(fx.pos).toBe(0) // Odd loops
+//         expect(fx.situation).toBeNull()
+//       })
+//
+//       it('should set the position to its start value when the absolute position is below 0', function() {
+//         var absPos
+//
+//         // When the animation is not set to run backward the start value is 0
+//         absPos = -2.27
+//         fx.loop(7)
+//         fx.situation.loop = 3
+//         fx.absPos = absPos
+//         fx.step(true)
+//         expect(fx.pos).toBe(0)
+//         expect(fx.absPos).toBe(absPos)
+//         expect(fx.situation.loop).toBe(0)
+//
+//         fx.stop().animate()
+//
+//         // When the animation is set to run backward the start value is 1
+//         absPos = -4.12
+//         fx.absPos = absPos
+//         fx.reverse(true).step(true)
+//         expect(fx.pos).toBe(1)
+//         expect(fx.absPos).toBe(absPos)
+//       })
+//
+//       it('should, when looping with the reverse flag, toggle reversed only when the difference between the new value of loop counter and its old value is odd', function() {
+//         // The new value of the loop counter is the integer part of absPos
+//
+//         fx.loop(9, true)
+//         expect(fx.situation.loop).toBe(0)
+//         expect(fx.pos).toBe(0)
+//         expect(fx.situation.reversed).toBe(false)
+//
+//         fx.absPos = 3
+//         fx.step(true)
+//         expect(fx.situation.reversed).toBe(true) // (3-0) is odd
+//
+//         fx.absPos = 1
+//         fx.step(true)
+//         expect(fx.situation.reversed).toBe(true) // (1-3) is even
+//
+//         fx.absPos = 6
+//         fx.step(true)
+//         expect(fx.situation.reversed).toBe(false) // (6-1) is odd
+//
+//         fx.absPos = 9
+//         fx.step(true)
+//         expect(fx.situation).toBeNull()
+//         expect(fx.pos).toBe(1) // It should end not reversed, which mean the position is expected to be 1
+//                                // ((9-1)-6) is even, the -1 is because we do not want reversed to be toggled after the last loop
+//       })
+//     })
+//
+//
+//     it('should not throw an error when stop is called in a during callback', function () {
+//       fx.move(100,100).start()
+//       fx.during(function () {this.stop()})
+//       expect(fx.step.bind(fx)).not.toThrow()
+//     })
+//
+//     it('should not throw an error when finish is called in a during callback', function () {
+//       fx.move(100,100).start()
+//       fx.during(function () {this.finish()})
+//       expect(fx.step.bind(fx)).not.toThrow()
+//     })
+//
+//     it('should not set active to false if the afterAll callback add situations to the situations queue', function () {
+//       fx.afterAll(function(){this.animate(500).move(0,0)})
+//
+//       jasmine.clock().tick(500)
+//       fx.step()
+//       expect(fx.active).toBe(true)
+//       expect(fx.situation).not.toBeNull()
+//       expect(fx.situations.length).toBe(0)
+//
+//       jasmine.clock().tick(500)
+//       fx.step()
+//       expect(fx.active).toBe(false)
+//       expect(fx.situation).toBeNull()
+//       expect(fx.situations.length).toBe(0)
+//     })
+//   })
+//
+//
+//   it('animates the x/y-attr', function() {
+//     var called = false
+//
+//     fx.move(200,200).after(function(){
+//
+//       expect(rect.x()).toBe(200)
+//       expect(rect.y()).toBe(200)
+//       called = true
+//
+//     })
+//
+//     jasmine.clock().tick(250)
+//     fx.step()
+//     expect(rect.x()).toBeGreaterThan(100)
+//     expect(rect.y()).toBeGreaterThan(100)
+//
+//     jasmine.clock().tick(250)
+//     fx.step()
+//     expect(called).toBe(true)
+//   })
+//
+//   // it('animates matrix', function() {
+//   //   var ctm, called = false
+//   //
+//   //   fx.transform({a:0.8, b:0.4, c:-0.15, d:0.7, e: 90.3, f: 27.07}).after(function(){
+//   //
+//   //     var ctm = rect.ctm()
+//   //     expect(ctm.a).toBeCloseTo(0.8)
+//   //     expect(ctm.b).toBeCloseTo(0.4)
+//   //     expect(ctm.c).toBeCloseTo(-0.15)
+//   //     expect(ctm.d).toBeCloseTo(0.7)
+//   //     expect(ctm.e).toBeCloseTo(90.3)
+//   //     expect(ctm.f).toBeCloseTo(27.07)
+//   //     called = true
+//   //
+//   //   })
+//   //
+//   //   jasmine.clock().tick(250)
+//   //   fx.step()
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBeLessThan(1)
+//   //   expect(ctm.b).toBeGreaterThan(0)
+//   //   expect(ctm.c).toBeLessThan(0)
+//   //   expect(ctm.d).toBeGreaterThan(0)
+//   //   expect(ctm.e).toBeGreaterThan(0)
+//   //   expect(ctm.f).toBeGreaterThan(0)
+//   //
+//   //   jasmine.clock().tick(250)
+//   //   fx.step()
+//   //   expect(called).toBe(true)
+//   // })
+//
+//   // it('animate a scale transform using the passed center point when there is already a transform in place', function(){
+//   //   var ctm
+//   //
+//   //   // When no ceter point is passed to the method scale, it use the center of the element as the center point
+//   //
+//   //   rect.scale(2) // The transform in place
+//   //
+//   //   fx.scale(0.5)
+//   //   jasmine.clock().tick(500) // Have the animation reach its end
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(0.5)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(0.5)
+//   //   expect(ctm.e).toBe(75)
+//   //   expect(ctm.f).toBe(75)
+//   // })
+//
+//   // it('animate a flip(x) transform', function() {
+//   //   var ctm
+//   //
+//   //   fx.transform({flip: 'x'}).start()
+//   //
+//   //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(0.5)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(1)
+//   //   expect(ctm.e).toBe(75)
+//   //   expect(ctm.f).toBe(0)
+//   //
+//   //   jasmine.clock().tick(475) // Have the animation reach its end
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(-1)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(1)
+//   //   expect(ctm.e).toBe(300)
+//   //   expect(ctm.f).toBe(0)
+//   // })
+//
+//   // it('animate a flip(x) transform with an offset', function() {
+//   //   var ctm
+//   //
+//   //   fx.transform({flip: 'x', offset: 20}).start()
+//   //
+//   //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(0.5)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(1)
+//   //   expect(ctm.e).toBe(10)
+//   //   expect(ctm.f).toBe(0)
+//   //
+//   //   jasmine.clock().tick(475) // Have the animation reach its end
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(-1)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(1)
+//   //   expect(ctm.e).toBe(40)
+//   //   expect(ctm.f).toBe(0)
+//   // })
+//
+//   // it('animate a flip(y) transform', function() {
+//   //   var ctm
+//   //
+//   //   fx.transform({flip: 'y'}).start()
+//   //
+//   //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(1)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(0.5)
+//   //   expect(ctm.e).toBe(0)
+//   //   expect(ctm.f).toBe(75)
+//   //
+//   //   jasmine.clock().tick(475) // Have the animation reach its end
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(1)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(-1)
+//   //   expect(ctm.e).toBe(0)
+//   //   expect(ctm.f).toBe(300)
+//   // })
+//
+//   // it('animate a flip(y) transform with an offset', function() {
+//   //   var ctm
+//   //
+//   //   fx.transform({flip: 'y', offset: 20}).start()
+//   //
+//   //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(1)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(0.5)
+//   //   expect(ctm.e).toBe(0)
+//   //   expect(ctm.f).toBe(10)
+//   //
+//   //   jasmine.clock().tick(475) // Have the animation reach its end
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(1)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(-1)
+//   //   expect(ctm.e).toBe(0)
+//   //   expect(ctm.f).toBe(40)
+//   // })
+//
+//   // it('animate a flip() transform', function() {
+//   //   var ctm
+//   //
+//   //   fx.transform({flip: 'both'}).start()
+//   //
+//   //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(0.5)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(0.5)
+//   //   expect(ctm.e).toBe(75)
+//   //   expect(ctm.f).toBe(75)
+//   //
+//   //   jasmine.clock().tick(475) // Have the animation reach its end
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(-1)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(-1)
+//   //   expect(ctm.e).toBe(300)
+//   //   expect(ctm.f).toBe(300)
+//   // })
+//
+//   // it('animate a flip() transform with an offset', function() {
+//   //   var ctm
+//   //
+//   //   fx.transform({flip: 'both', offset: 20}).start()
+//   //
+//   //   jasmine.clock().tick(125) // Have the animation be 1/4 of the way (not halfway as usual because of a bug in the node method getCTM on Firefox)
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(0.5)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(0.5)
+//   //   expect(ctm.e).toBe(10)
+//   //   expect(ctm.f).toBe(10)
+//   //
+//   //   jasmine.clock().tick(475) // Have the animation reach its end
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(-1)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(-1)
+//   //   expect(ctm.e).toBe(40)
+//   //   expect(ctm.f).toBe(40)
+//   // })
+//
+//   // it('animate relative matrix transform', function(){
+//   //   var ctm
+//   //
+//   //   fx.transform(new SVG.Matrix().scale(2,0,0), true)
+//   //
+//   //   jasmine.clock().tick(250) // Have the animation be half way
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(1.5)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(1.5)
+//   //   expect(ctm.e).toBe(0)
+//   //   expect(ctm.f).toBe(0)
+//   //
+//   //   jasmine.clock().tick(250) // Have the animation reach its end
+//   //   fx.step()
+//   //
+//   //   ctm = rect.ctm()
+//   //   expect(ctm.a).toBe(2)
+//   //   expect(ctm.b).toBe(0)
+//   //   expect(ctm.c).toBe(0)
+//   //   expect(ctm.d).toBe(2)
+//   //   expect(ctm.e).toBe(0)
+//   //   expect(ctm.f).toBe(0)
+//   // })
+//
+//   describe('when animating plots', function() {
+//     it('should allow plot animations to be chained', function() {
+//       var pathString1 = 'M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80'
+//         , pathString2 = 'M10 80 C 40 150, 65 150, 95 80 S 150 10, 180 80'
+//         , path = draw.path(pathString1)
+//         , morph
+//
+//       fx = path.animate(1000).plot(pathString2).animate(1000).plot(pathString1)
+//       morph = new SVG.PathArray(pathString1).morph(pathString2)
+//
+//       fx.start()
+//       expect(path.array()).toEqual(morph.at(0))
+//
+//       jasmine.clock().tick(500) // Have the first animation be half way
+//       fx.step()
+//       expect(path.array()).toEqual(morph.at(0.5))
+//
+//       jasmine.clock().tick(500) // Have the first animation reach its end
+//       fx.step()
+//       expect(path.array()).toEqual(morph.at(1))
+//       morph = new SVG.PathArray(pathString2).morph(pathString1)
+//       expect(path.array()).toEqual(morph.at(0))
+//
+//       jasmine.clock().tick(500) // Have the second animation be half way
+//       fx.step()
+//       expect(path.array()).toEqual(morph.at(0.5))
+//
+//       jasmine.clock().tick(500) // Have the second animation reach its end
+//       fx.step()
+//       expect(path.array()).toEqual(morph.at(1))
+//     })
+//
+//     it('should allow plot to be called on a polyline', function() {
+//       var startValue = [[0,0], [100,50], [50,100], [150,50], [200,50]]
+//         , endValue = [[0,0], [100,50], [50,100], [150,50], [200,50], [250,100], [300,50], [350,50]]
+//         , morph = new SVG.PointArray(startValue).morph(endValue)
+//         , polyline = draw.polyline(startValue)
+//
+//       fx = polyline.animate(3000).plot(endValue)
+//
+//       fx.start()
+//       expect(polyline.array()).toEqual(morph.at(0))
+//
+//       jasmine.clock().tick(1500) // Have the animation be half way
+//       fx.step()
+//       expect(polyline.array()).toEqual(morph.at(0.5))
+//
+//       jasmine.clock().tick(1500) // Have the animation reach its end
+//       fx.step()
+//       expect(polyline.array()).toEqual(morph.at(1))
+//     })
+//
+//     it('should allow plot to be called on a polygon', function() {
+//       var startValue = [[0,0], [100,50], [50,100], [150,50], [200,50]]
+//         , endValue = [[0,0], [100,50], [50,100], [150,50], [200,50], [250,100], [300,50], [350,50]]
+//         , morph = new SVG.PointArray(startValue).morph(endValue)
+//         , polygon = draw.polygon(startValue)
+//
+//       fx = polygon.animate(3000).plot(endValue)
+//
+//       fx.start()
+//       expect(polygon.array()).toEqual(morph.at(0))
+//
+//       jasmine.clock().tick(1500) // Have the animation be half way
+//       fx.step()
+//       expect(polygon.array()).toEqual(morph.at(0.5))
+//
+//       jasmine.clock().tick(1500) // Have the animation reach its end
+//       fx.step()
+//       expect(polygon.array()).toEqual(morph.at(1))
+//     })
+//
+//     it('should allow plot to be called on a path', function() {
+//       var startValue = new SVG.PathArray('M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80')
+//         , endValue = new SVG.PathArray('M10 80 C 40 150, 65 150, 95 80 S 150 10, 180 80')
+//         , morph = new SVG.PathArray(startValue).morph(endValue)
+//         , path = draw.path(startValue)
+//
+//       fx = path.animate(2000).plot(endValue)
+//
+//       fx.start()
+//       expect(path.array()).toEqual(morph.at(0))
+//
+//       jasmine.clock().tick(1000) // Have the animation be half way
+//       fx.step()
+//       expect(path.array()).toEqual(morph.at(0.5))
+//
+//       jasmine.clock().tick(1000) // Have the animation reach its end
+//       fx.step()
+//       expect(path.array()).toEqual(morph.at(1))
+//     })
+//
+//     it('should allow plot to be called on a textpath', function() {
+//       var startValue = new SVG.PathArray('M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80')
+//         , endValue = new SVG.PathArray('M10 80 C 40 150, 65 150, 95 80 S 150 10, 180 80')
+//         , morph = new SVG.PathArray(startValue).morph(endValue)
+//         , textPath
+//
+//       var text = draw.text(function(add) {
+//         add.tspan("We go up and down, then we go down, then up again")
+//       })
+//
+//       textPath = text.path(startValue)
+//       fx = textPath.animate(500).plot(endValue)
+//
+//       fx.start()
+//       expect(textPath.array()).toEqual(morph.at(0))
+//
+//       jasmine.clock().tick(250) // Have the animation be half way
+//       fx.step()
+//       expect(textPath.array()).toEqual(morph.at(0.5))
+//
+//       jasmine.clock().tick(250) // Have the animation reach its end
+//       fx.step()
+//       expect(textPath.array()).toEqual(morph.at(1))
+//     })
+//
+//     it('should allow plot to be called on a line', function() {
+//       var startValue = '0,0 100,150'
+//         , endValue = [[50,30], [120,250]]
+//         , morph = new SVG.PointArray(startValue).morph(endValue)
+//         , line = draw.line(startValue)
+//
+//       fx = line.animate(3000).plot(endValue)
+//
+//       fx.start()
+//       expect(line.array()).toEqual(morph.at(0))
+//
+//       jasmine.clock().tick(1500) // Have the animation be half way
+//       fx.step()
+//       expect(line.array()).toEqual(morph.at(0.5))
+//
+//       jasmine.clock().tick(1500) // Have the animation reach its end
+//       fx.step()
+//       expect(line.array()).toEqual(morph.at(1))
+//     })
+//
+//     it('should allow plot to be called with 4 parameters on a line', function () {
+//       var startPointArray = new SVG.PointArray('0,0 100,150')
+//         , endPointArray = new SVG.PointArray([[50,30], [120,250]])
+//         , morph = new SVG.PointArray(startPointArray).morph(endPointArray)
+//         , a
+//
+//       a = startPointArray.value
+//       var line = draw.line(a[0][0], a[0][1], a[1][0], a[1][1])
+//
+//       a = endPointArray.value
+//       fx = line.animate(3000).plot(a[0][0], a[0][1], a[1][0], a[1][1])
+//
+//       fx.start()
+//       expect(line.array()).toEqual(morph.at(0))
+//
+//       jasmine.clock().tick(1500) // Have the animation be half way
+//       fx.step()
+//       expect(line.array()).toEqual(morph.at(0.5))
+//
+//       jasmine.clock().tick(1500) // Have the animation reach its end
+//       fx.step()
+//       expect(line.array()).toEqual(morph.at(1))
+//     })
+//   })
+//
+//
+//   describe('when animating attributes', function() {
+//     it('should be possible to animate numeric attributes', function () {
+//       var startValue = 0
+//         , endValue = 150
+//         , morph = new SVG.Number(startValue).morph(endValue)
+//
+//       var text = draw.text(function(add) {
+//         add.tspan('We go ')
+//         add.tspan('up').fill('#f09').dy(-40)
+//         add.tspan(', then we go down, then up again').dy(40)
+//       })
+//
+//       var path = 'M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
+//
+//       var textPath = text.path(path).font({ size: 42.5, family: 'Verdana' })
+//
+//
+//       textPath.attr('startOffset', startValue)
+//       fx = textPath.animate(1000).attr('startOffset', endValue)
+//
+//       fx.start()
+//       expect(textPath.attr('startOffset')).toBe(morph.at(0).value)
+//
+//       jasmine.clock().tick(500) // Have the animation be half way
+//       fx.step()
+//       expect(textPath.attr('startOffset')).toBe(morph.at(0.5).value)
+//
+//       jasmine.clock().tick(500) // Have the animation reach its end
+//       fx.step()
+//       expect(textPath.attr('startOffset')).toBe(morph.at(1).value)
+//     })
+//
+//     it('should be possible to animate non-numeric attributes', function () {
+//       var startValue = 'butt'
+//         , endValue = 'round'
+//         , line = draw.line('0,0 100,150').attr('stroke-linecap', startValue)
+//
+//       fx = line.animate(3000).attr('stroke-linecap', endValue)
+//
+//       fx.start()
+//       expect(line.attr('stroke-linecap')).toBe(startValue)
+//
+//       jasmine.clock().tick(1500) // Have the animation be half way
+//       fx.step()
+//       expect(line.attr('stroke-linecap')).toBe(startValue)
+//
+//       jasmine.clock().tick(1500) // Have the animation reach its end
+//       fx.step()
+//       expect(line.attr('stroke-linecap')).toBe(endValue)
+//     })
+//
+//     it('should be possible to animate color attributes by using SVG.Color', function() {
+//       var startValue = 'rgb(42,251,100)'
+//         , endValue = 'rgb(10,80,175)'
+//         , morph = new SVG.Color(startValue).morph(endValue)
+//
+//       rect.attr('fill', startValue)
+//       fx.attr('fill', endValue)
+//
+//       fx.start()
+//       expect(rect.attr('fill')).toBe(morph.at(0).toString())
+//
+//       jasmine.clock().tick(250) // Have the animation be half way
+//       fx.step()
+//       expect(rect.attr('fill')).toBe(morph.at(0.5).toString())
+//
+//       jasmine.clock().tick(250) // Have the animation reach its end
+//       fx.step()
+//       expect(rect.attr('fill')).toBe(morph.at(1).toString())
+//     })
+//
+//     it('should be possible to pass percentage strings to numeric attributes', function () {
+//       var startValue = '0%'
+//         , endValue = '80%'
+//         , morph = new SVG.Number(startValue).morph(endValue)
+//
+//       var text = draw.text(function(add) {
+//         add.tspan('We go ')
+//         add.tspan('up').fill('#f09').dy(-40)
+//         add.tspan(', then we go down, then up again').dy(40)
+//       })
+//
+//       var path = 'M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100'
+//
+//       var textPath = text.path(path).font({ size: 42.5, family: 'Verdana' })
+//
+//       textPath.attr('startOffset', startValue)
+//       fx = textPath.animate(1000).attr('startOffset', endValue)
+//
+//       fx.start()
+//       expect(textPath.attr('startOffset')).toBe(morph.at(0).toString())
+//
+//       jasmine.clock().tick(500) // Have the animation be half way
+//       fx.step()
+//       expect(textPath.attr('startOffset')).toBe(morph.at(0.5).toString())
+//
+//       jasmine.clock().tick(500) // Have the animation reach its end
+//       fx.step()
+//       expect(textPath.attr('startOffset')).toBe(morph.at(1).toString())
+//     })
+//
+//     it('should allow 0 to be specified without unit', function () {
+//       // This code snippet come from issue #552
+//
+//       var gradient = draw.gradient('linear', function(add) {
+//         s1 = add.stop(0, '#33235b')
+//         s2 = add.stop(0.5, '#E97639')
+//         s3 = add.stop(1, '#33235b')
+//       })
+//
+//       var r1, r2;
+//       var fill = draw.pattern('300%', '100%', function(add) {
+//         r1 = add.rect('150%', '100%').fill(gradient)
+//         r2 = add.rect('150%', '100%').fill(gradient)
+//       });
+//       fill.attr({patternUnits: 'userSpaceOnUse'})
+//
+//       r1.attr('x', 0).animate('0.5s').attr('x', '150%')
+//       r2.attr('x', '-150%').animate('0.5s').attr('x', 0)
+//
+//       var text = draw.text('Manifesto').move('50%', '50%').fill(fill)
+//       text.font({
+//         size: 70
+//         , anchor: 'middle'
+//         , leading: 1
+//       })
+//
+//       r1.fx.start()
+//       r2.fx.start()
+//
+//       jasmine.clock().tick(250) // Have the animation be half way
+//       r1.fx.step()
+//       r2.fx.step()
+//       expect(r1.attr('x')).toBe('75%')
+//       expect(r2.attr('x')).toBe('-75%')
+//
+//       jasmine.clock().tick(250) // Have the animation reach its end
+//       r1.fx.step()
+//       r2.fx.step()
+//       expect(r1.attr('x')).toBe('150%')
+//       expect(r2.attr('x')).toBe('0%')
+//     })
+//   })
+//
+//
+//   describe('when animating styles', function() {
+//     it('should be possible to animate numeric styles', function () {
+//       var startValue = 0
+//         , endValue = 5
+//         , morph = new SVG.Number(startValue).morph(endValue)
+//
+//       rect.css('stroke-width', startValue)
+//       fx.css('stroke-width', endValue)
+//
+//       fx.start()
+//       expect(rect.css('stroke-width')).toBe(morph.at(0).toString())
+//
+//       jasmine.clock().tick(250) // Have the animation be half way
+//       fx.step()
+//       expect(rect.css('stroke-width')).toBe(morph.at(0.5).toString())
+//
+//       jasmine.clock().tick(250) // Have the animation reach its end
+//       fx.step()
+//       expect(rect.css('stroke-width')).toBe(morph.at(1).toString())
+//     })
+//
+//     it('should be possible to animate non-numeric styles', function () {
+//       var startValue = 'butt'
+//         , endValue = 'round'
+//         , line = draw.line('0,0 100,150').css('stroke-linecap', startValue)
+//
+//       fx = line.animate(3000).css('stroke-linecap', endValue)
+//
+//       fx.start()
+//       expect(line.css('stroke-linecap')).toBe(startValue)
+//
+//       jasmine.clock().tick(1500) // Have the animation be half way
+//       fx.step()
+//       expect(line.css('stroke-linecap')).toBe(startValue)
+//
+//       jasmine.clock().tick(1500) // Have the animation reach its end
+//       fx.step()
+//       expect(line.css('stroke-linecap')).toBe(endValue)
+//     })
+//
+//     it('should be possible to animate color styles by using SVG.Color', function() {
+//       var startValue = '#81DE01'
+//         , endValue = '#B1835D'
+//         , morph = new SVG.Color(startValue).morph(endValue)
+//
+//       rect.css('fill', startValue)
+//       fx.css('fill', endValue)
+//
+//
+//       fx.start()
+//       // When setting a style color, it get saved as  a rgb() string even if it was passed as an hex code
+//       // The style rgb string has spaces while the one returned by SVG.Color do not as show bellow
+//       // CSS: rgb(255, 255, 255)                    SVG.Color: rgb(255,255,255)
+//       // The space in the style rbg string are removed so they can be equal
+//       expect(rect.css('fill').replace(/\s+/g, '')).toBe(morph.at(0).toRgb())
+//
+//       jasmine.clock().tick(250) // Have the animation be half way
+//       fx.step()
+//       expect(rect.css('fill').replace(/ /g, '')).toBe(morph.at(0.5).toRgb())
+//
+//       jasmine.clock().tick(250) // Have the animation reach its end
+//       fx.step()
+//       expect(rect.css('fill').replace(/ /g, '')).toBe(morph.at(1).toRgb())
+//     })
+//
+//     it('should be possible to pass percentage strings to numeric styles', function () {
+//       var startValue = '0%'
+//         , endValue = '5%'
+//         , morph = new SVG.Number(startValue).morph(endValue)
+//
+//       rect.css('stroke-width', startValue)
+//       fx.css('stroke-width', endValue)
+//
+//       fx.start()
+//       expect(rect.css('stroke-width')).toBe(morph.at(0).toString())
+//
+//       jasmine.clock().tick(250) // Have the animation be half way
+//       fx.step()
+//       expect(rect.css('stroke-width')).toBe(morph.at(0.5).toString())
+//
+//       jasmine.clock().tick(250) // Have the animation reach its end
+//       fx.step()
+//       expect(rect.css('stroke-width')).toBe(morph.at(1).toString())
+//     })
+//
+//     it('should allow 0 to be specified without a unit', function () {
+//       var r1 = draw.rect(100,100).move(200,200)
+//         , r2 = draw.rect(100,100).move(400,400)
+//
+//       r1.css('stroke-width', '100%').animate(500).css('stroke-width', 0)
+//       r2.css('stroke-width', 0).animate(500).css('stroke-width', '100%')
+//
+//       r1.fx.start()
+//       r2.fx.start()
+//       expect(r1.css('stroke-width')).toBe('100%')
+//       expect(r2.css('stroke-width')).toBe('0%')
+//
+//       jasmine.clock().tick(250) // Have the animation be half way
+//       r1.fx.step()
+//       r2.fx.step()
+//       expect(r1.css('stroke-width')).toBe('50%')
+//       expect(r2.css('stroke-width')).toBe('50%')
+//
+//       jasmine.clock().tick(250) // Have the animation reach its end
+//       r1.fx.step()
+//       r2.fx.step()
+//       expect(r1.css('stroke-width')).toBe('0%')
+//       expect(r2.css('stroke-width')).toBe('100%')
+//     })
+//   })
+//
+//
+//   describe('add()', function() {
+//     it('adds to animations obj by default', function() {
+//       fx.add('x', new SVG.Number(20))
+//       expect(fx.situation.animations.x.value).toBe(20)
+//     })
+//
+//     it('adds to specified obj', function() {
+//       fx.add('x', new SVG.Number(20), 'animations')
+//       fx.add('x', new SVG.Number(20), 'attrs')
+//       fx.add('x', new SVG.Number(20), 'styles')
+//       expect(fx.situation.animations.x.value).toBe(20)
+//       expect(fx.situation.attrs.x.value).toBe(20)
+//       expect(fx.situation.styles.x.value).toBe(20)
+//     })
+//   })
+//
+//   describe('attr()', function() {
+//     it('should allow an object to be passed', function() {
+//       spyOn(fx, 'attr').and.callThrough()
+//       fx.attr({
+//         x: 20,
+//         y: 20
+//       })
+//
+//       expect(fx.attr).toHaveBeenCalledWith('x', 20)
+//       expect(fx.attr).toHaveBeenCalledWith('y', 20)
+//     })
+//
+//     it('should call add() with attrs as method', function() {
+//       spyOn(fx, 'add')
+//       fx.attr('x', 20)
+//       expect(fx.add).toHaveBeenCalledWith('x', 20, 'attrs')
+//     })
+//   })
+//
+//   describe('css()', function() {
+//     it('should allow an object to be passed', function() {
+//       spyOn(fx, 'css').and.callThrough()
+//       fx.css({
+//         x: 20,
+//         y: 20
+//       })
+//
+//       expect(fx.css).toHaveBeenCalledWith('x', 20)
+//       expect(fx.css).toHaveBeenCalledWith('y', 20)
+//     })
+//
+//     it('should call add() with styles as method', function() {
+//       spyOn(fx, 'add')
+//       fx.css('x', 20)
+//       expect(fx.add).toHaveBeenCalledWith('x', 20, 'styles')
+//     })
+//   })
+//
+//   describe('x() / y()', function() {
+//     it('should add an entry to the animations obj', function() {
+//       spyOn(fx, 'add')
+//       fx.x(20)
+//       fx.y(20)
+//
+//       expect(fx.add).toHaveBeenCalledWith('x', jasmine.objectContaining({value:20}))
+//       expect(fx.add).toHaveBeenCalledWith('y', jasmine.objectContaining({value:20}))
+//     })
+//
+//     it('allows relative move with relative flag set', function() {
+//       spyOn(fx, 'add')
+//       fx.x(20, true)
+//       fx.y(20, true)
+//
+//       expect(fx.add).toHaveBeenCalledWith('x', jasmine.objectContaining({value:20, relative:true }))
+//       expect(fx.add).toHaveBeenCalledWith('y', jasmine.objectContaining({value:20, relative:true }))
+//     })
+//
+//     it('redirects to transform when target is a group', function() {
+//       var group = draw.group()
+//         , fx = group.animate(500)
+//
+//       spyOn(fx, 'transform')
+//
+//       fx.x(20)
+//       fx.y(20)
+//
+//       expect(fx.transform).toHaveBeenCalledWith({x: 20}, undefined)
+//       expect(fx.transform).toHaveBeenCalledWith({y: 20}, undefined)
+//     })
+//
+//     it('redirects to transform when target is a group with relative flag set', function() {
+//       var group = draw.group()
+//         , fx = group.animate(500)
+//
+//       spyOn(fx, 'transform')
+//
+//       fx.x(20, true)
+//       fx.y(20, true)
+//
+//       expect(fx.transform).toHaveBeenCalledWith({x: 20}, true)
+//       expect(fx.transform).toHaveBeenCalledWith({y: 20}, true)
+//     })
+//   })
+//
+//   describe('cx() / cy()', function() {
+//     it('should call add with method and argument', function() {
+//       spyOn(fx, 'add')
+//       fx.cx(20)
+//       fx.cy(20)
+//
+//       expect(fx.add).toHaveBeenCalledWith('cx', jasmine.objectContaining({value:20}))
+//       expect(fx.add).toHaveBeenCalledWith('cy', jasmine.objectContaining({value:20}))
+//     })
+//   })
+//
+//   describe('move()', function() {
+//     it('should redirect call to x() and y()', function() {
+//       spyOn(fx, 'x').and.callThrough()
+//       spyOn(fx, 'y').and.callThrough()
+//       fx.move(20, 20)
+//
+//       expect(fx.x).toHaveBeenCalledWith(20)
+//       expect(fx.y).toHaveBeenCalledWith(20)
+//     })
+//   })
+//
+//   describe('center()', function() {
+//     it('should redirect call to cx() and cy()', function() {
+//       spyOn(fx, 'cx').and.callThrough()
+//       spyOn(fx, 'cy').and.callThrough()
+//       fx.center(20, 20)
+//
+//       expect(fx.cx).toHaveBeenCalledWith(20)
+//       expect(fx.cy).toHaveBeenCalledWith(20)
+//     })
+//   })
+//
+//   describe('size()', function() {
+//     it('should set font-size with attr() when called on a text', function() {
+//       var text = draw.text('Hello World')
+//         , fx = text.animate(500)
+//
+//       spyOn(fx, 'attr')
+//       fx.size(20)
+//       expect(fx.attr).toHaveBeenCalledWith('font-size', 20)
+//     })
+//
+//     it('should set width and height with add()', function() {
+//       spyOn(fx, 'add').and.callThrough()
+//       fx.size(20, 20)
+//
+//       expect(fx.add).toHaveBeenCalledWith('width', jasmine.objectContaining({value:20}))
+//       expect(fx.add).toHaveBeenCalledWith('height', jasmine.objectContaining({value:20}))
+//     })
+//
+//     it('should calculate proportional size when only height or width is given', function() {
+//       spyOn(fx, 'add').and.callThrough()
+//       fx.size(40, null)
+//       fx.size(null, 60)
+//
+//       expect(fx.add).toHaveBeenCalledWith('width', jasmine.objectContaining({value:40}))
+//       expect(fx.add).toHaveBeenCalledWith('height', jasmine.objectContaining({value:40}))
+//
+//       expect(fx.add).toHaveBeenCalledWith('width', jasmine.objectContaining({value:60}))
+//       expect(fx.add).toHaveBeenCalledWith('height', jasmine.objectContaining({value:60}))
+//     })
+//   })
+//
+//   describe('width()', function() {
+//     it('should set width with add()', function() {
+//       spyOn(fx, 'add').and.callThrough()
+//       fx.width(20)
+//       expect(fx.add).toHaveBeenCalledWith('width', jasmine.objectContaining({value:20}))
+//     })
+//
+//     it('should animate the width attribute', function() {
+//       fx.width(200)
+//       expect(rect.width()).toBe(100)
+//
+//       jasmine.clock().tick(250)
+//       fx.step()
+//       expect(rect.width()).toBe(150)
+//
+//       jasmine.clock().tick(250)
+//       fx.step()
+//       expect(rect.width()).toBe(200)
+//     })
+//   })
+//
+//   describe('height()', function() {
+//     it('should set height with add()', function() {
+//       spyOn(fx, 'add').and.callThrough()
+//       fx.height(20)
+//       expect(fx.add).toHaveBeenCalledWith('height', jasmine.objectContaining({value:20}))
+//     })
+//
+//     it('should animate the height attribute', function() {
+//       fx.height(200)
+//       expect(rect.height()).toBe(100)
+//
+//       jasmine.clock().tick(250)
+//       fx.step()
+//       expect(rect.height()).toBe(150)
+//
+//       jasmine.clock().tick(250)
+//       fx.step()
+//       expect(rect.height()).toBe(200)
+//     })
+//   })
+//
+//   describe('plot()', function() {
+//     it('should call add with plot as method', function() {
+//       var polyline = draw.polyline('10 10 20 20 30 10 50 20')
+//         , fx = polyline.animate(500)
+//
+//       spyOn(fx, 'add')
+//       fx.plot('5 5 30 29 40 19 12 30')
+//       expect(fx.add).toHaveBeenCalledWith('plot', new SVG.PointArray('5 5 30 29 40 19 12 30'))
+//     })
+//
+//     it('also accept parameter list', function() {
+//       var line = draw.line('10 10 20 20')
+//         , fx = line.animate(500)
+//
+//       spyOn(fx, 'add')
+//       fx.plot(5, 5, 10, 10)
+//       expect(fx.add).toHaveBeenCalledWith('plot', new SVG.PointArray([5, 5, 10, 10]))
+//     })
+//   })
+//
+//   describe('leading()', function() {
+//     it('should call add with method and argument', function() {
+//       var text = draw.text('Hello World')
+//         , fx = text.animate(500)
+//       spyOn(fx, 'add')
+//       fx.leading(3)
+//
+//       expect(fx.add).toHaveBeenCalledWith('leading', jasmine.objectContaining({value:3}))
+//     })
+//
+//     it('does nothiing when not called on text', function() {
+//       spyOn(fx, 'add')
+//       fx.leading(3)
+//       expect(fx.add).not.toHaveBeenCalled()
+//     })
+//   })
+//
+//   describe('viewbox()', function() {
+//     it('should call add with method and argument', function() {
+//       var nested = draw.nested()
+//         , fx = nested.animate(500)
+//       spyOn(fx, 'add')
+//       fx.viewbox(1,2,3,4)
+//
+//       expect(fx.add).toHaveBeenCalledWith('viewbox', jasmine.objectContaining({x:1, y:2, width:3, height:4}))
+//     })
+//
+//     it('does nothing when not called on SVG.Container', function() {
+//       spyOn(fx, 'add')
+//       fx.viewbox(1,2,3,4)
+//       expect(fx.add).not.toHaveBeenCalled()
+//     })
+//   })
+//
+//   describe('update()', function() {
+//     it('should convert call with 3 arguments to call with obj', function() {
+//       var stop = new SVG.Stop()
+//         , fx = stop.animate()
+//       spyOn(fx, 'update').and.callThrough()
+//       fx.update(1,'#ccc',0.5)
+//
+//       expect(fx.update).toHaveBeenCalledWith({offset: 1, color: '#ccc', opacity: 0.5})
+//     })
+//
+//     it('calls add with method argument and attrs as type', function() {
+//       var stop = new SVG.Stop()
+//         , fx = stop.animate()
+//       spyOn(fx, 'add')
+//       fx.update({offset: 1, color: '#ccc', opacity: 0.5})
+//
+//       expect(fx.add).toHaveBeenCalledWith('stop-opacity', 0.5, 'attrs')
+//       expect(fx.add).toHaveBeenCalledWith('stop-color', '#ccc', 'attrs')
+//       expect(fx.add).toHaveBeenCalledWith('offset', 1, 'attrs')
+//     })
+//
+//     it('does nothing when not called on SVG.Stop', function() {
+//       spyOn(fx, 'add')
+//       fx.update({offset: 1, color: '#ccc', opacity: 0.5})
+//       expect(fx.add).not.toHaveBeenCalled()
+//     })
+//   })
+//
+//   // describe('transform()', function() {
+//   //   it('returns itself when no valid transformation was found', function() {
+//   //     expect(fx.transform({})).toBe(fx)
+//   //   })
+//   //   it('gets the current transforms', function() {
+//   //     expect(fx.transform()).toEqual(new SVG.Matrix(rect).extract())
+//   //   })
+//   //   it('gets a certain transformation if used with an argument', function() {
+//   //     expect(fx.transform('x')).toEqual(0)
+//   //   })
+//   //   it('adds an entry to transforms when matrix given', function() {
+//   //     var matrix = new SVG.Matrix(1,2,3,4,5,6)
+//   //     fx.transform(matrix)
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(matrix))
+//   //   })
+//   //   it('sets relative flag when given', function() {
+//   //     var matrix = new SVG.Matrix(1,2,3,4,5,6)
+//   //     fx.transform(matrix, true)
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(matrix))
+//   //     expect(fx.situation.transforms[0].relative).toBe(true)
+//   //   })
+//   //   it('adds an entry to transforms when rotation given', function() {
+//   //     fx.transform({rotation: 30, cx:0, cy:0})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Rotate(30, 0, 0)))
+//   //   })
+//   //   it('adds an entry to transforms when scale given', function() {
+//   //     fx.transform({scale: 2, cx:0, cy:0})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Scale(2, 2, 0, 0)))
+//   //   })
+//   //   it('adds an entry to transforms when scaleX given', function() {
+//   //     fx.transform({scaleX: 2, cx:0, cy:0})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Scale(2, 1, 0, 0)))
+//   //   })
+//   //   it('adds an entry to transforms when scaleY given', function() {
+//   //     fx.transform({scaleY: 2, cx:0, cy:0})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Scale(1, 2, 0, 0)))
+//   //   })
+//   //   it('adds an entry to transforms when skewX given', function() {
+//   //     fx.transform({skewX: 2, cx:0, cy:0})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Skew(2, 0, 0, 0)))
+//   //   })
+//   //   it('adds an entry to transforms when skewY given', function() {
+//   //     fx.transform({skewY: 2, cx:0, cy:0})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Skew(0, 2, 0, 0)))
+//   //   })
+//   //   it('adds an entry to transforms when flip x given', function() {
+//   //     fx.transform({flip: 'x'})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining((new SVG.Matrix()).flip('x', 150)))
+//   //   })
+//   //   it('adds an entry to transforms when flip x with offset given', function() {
+//   //     fx.transform({flip: 'x', offset: 100})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining((new SVG.Matrix()).flip('x', 100)))
+//   //   })
+//   //   it('adds an entry to transforms when flip y given', function() {
+//   //     fx.transform({flip: 'y'})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining((new SVG.Matrix()).flip('y', 150)))
+//   //   })
+//   //   it('adds an entry to transforms when x given', function() {
+//   //     fx.transform({x:20})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Translate(20, undefined)))
+//   //   })
+//   //   it('adds an entry to transforms when y given', function() {
+//   //     fx.transform({y:20})
+//   //     expect(fx.situation.transforms[0]).toEqual(jasmine.objectContaining(new SVG.Translate(undefined, 20)))
+//   //   })
+//   // })
+//
+//   /* shortcuts for animation */
+//   describe('animate()', function() {
+//     it('creates a new fx instance on the element', function() {
+//       var rect = draw.rect(100,100)
+//       rect.animate(100)
+//       expect(rect.fx instanceof SVG.FX).toBeTruthy()
+//     })
+//
+//     it('redirects the call to fx.animate()', function() {
+//       spyOn(fx, 'animate')
+//       rect.animate()
+//       expect(fx.animate).toHaveBeenCalled()
+//     })
+//   })
+//
+//   describe('delay()', function() {
+//     it('creates a new fx instance on the element', function() {
+//       var rect = draw.rect(100,100)
+//       rect.delay(100)
+//       expect(rect.fx instanceof SVG.FX).toBeTruthy()
+//     })
+//
+//     it('redirects the call to fx.delay()', function() {
+//       spyOn(fx, 'delay')
+//       rect.delay(5)
+//       expect(fx.delay).toHaveBeenCalled()
+//     })
+//   })
+//
+//   describe('stop()', function() {
+//     it('redirects the call to fx.stop()', function() {
+//       spyOn(fx, 'stop')
+//       rect.stop()
+//       expect(fx.stop).toHaveBeenCalled()
+//     })
+//   })
+//
+//   describe('finish()', function() {
+//     it('redirects the call to fx.finish()', function() {
+//       spyOn(fx, 'finish')
+//       rect.finish()
+//       expect(fx.finish).toHaveBeenCalled()
+//     })
+//   })
+//
+//   describe('pause()', function() {
+//     it('redirects the call to fx.pause()', function() {
+//       spyOn(fx, 'pause')
+//       rect.pause()
+//       expect(fx.pause).toHaveBeenCalled()
+//     })
+//   })
+//
+//   describe('play()', function() {
+//     it('redirects the call to fx.play()', function() {
+//       spyOn(fx, 'play')
+//       rect.play()
+//       expect(fx.play).toHaveBeenCalled()
+//     })
+//   })
+//
+//   describe('speed()', function() {
+//     it('redirects the call to fx.speed() as getter', function() {
+//       spyOn(fx, 'speed')
+//       rect.speed()
+//       expect(fx.speed).toHaveBeenCalled()
+//     })
+//
+//     it('redirects the call to fx.speed() as setter', function() {
+//       spyOn(fx, 'speed').and.callThrough()
+//       expect(rect.speed(5)).toBe(rect)
+//       expect(fx.speed).toHaveBeenCalled()
+//     })
+//   })
+// })
+//
+// describe('SVG.MorphObj', function() {
+//   it('accepts color strings and converts them to SVG.Color', function() {
+//     var obj = new SVG.MorphObj('#000', '#fff')
+//     expect(obj instanceof SVG.Color).toBeTruthy()
+//
+//     obj = new SVG.MorphObj('rgb(0,0,0)', 'rgb(255,255,255)')
+//     expect(obj instanceof SVG.Color).toBeTruthy()
+//   })
+//
+//   it('accepts numbers and converts them to SVG.Number', function() {
+//     var obj = new SVG.MorphObj('0', '10')
+//     expect(obj instanceof SVG.Number).toBeTruthy()
+//
+//     var obj = new SVG.MorphObj(0, 10)
+//     expect(obj instanceof SVG.Number).toBeTruthy()
+//   })
+//
+//   it('accepts any other values', function() {
+//     var obj = new SVG.MorphObj('Hello', 'World')
+//
+//     expect(obj.value).toBe('Hello')
+//     expect(obj.destination).toBe('World')
+//   })
+//
+//   it('morphes unmorphable objects with plain morphing', function() {
+//     var obj = new SVG.MorphObj('Hello', 'World')
+//
+//     expect(obj.at(0,0)).toBe('Hello')
+//     expect(obj.at(0.5,0.5)).toBe('Hello')
+//     expect(obj.at(1,1)).toBe('World')
+//   })
+//
+//   it('converts to its value when casted', function() {
+//     var obj = new SVG.MorphObj('Hello', 'World')
+//     expect(obj.valueOf()).toBe('Hello')
+//     expect(obj + 'World').toBe('HelloWorld')
+//   })
+// })
index 58c14bd701f20174169b414824c983299f3b0aa5..ce5c6410a38024eca4737e1e71b383176d6afa36 100644 (file)
@@ -94,25 +94,6 @@ describe('Number', function() {
     })
   })
 
-  describe('to()', function() {
-    beforeEach(function() {
-      number = number.plus(4)
-    })
-    it('returns a new instance', function() {
-      expect(number.to('em')).not.toBe(number)
-      expect(number.to('em') instanceof SVG.Number).toBeTruthy()
-    })
-    it('changes the unit value', function() {
-      number = number.to('%')
-      expect(number.unit).toBe('%')
-    })
-    it('changes the output value', function() {
-      var oldNumber = number.valueOf()
-      number = number.to('%')
-      expect(number.toString()).toBe('400%')
-    })
-  })
-
   describe('plus()', function() {
     it('returns a new instance', function() {
       expect(number.plus(4.5)).not.toBe(number)
index 738831c78aede9c2f973012802ccb9c6d7e6d700..531b900cd2ba175b309ddd9c660e04779e8e48f6 100644 (file)
@@ -44,46 +44,20 @@ describe ('SVG.Queue()', function () {
       expect(queue.first()).toBe(1)
       expect(queue.last()).toBe(3)
     })
-
-    it ('changes the length when you add things', function () {
-      var queue = new SVG.Queue()
-      queue.push(1)
-      expect(queue.length).toBe(1)
-      queue.push(2)
-      expect(queue.length).toBe(2)
-    })
   })
 
   describe('remove ()', function () {
-    it('removes an item from the queue which matches the matcher', function () {
+    it('removes the given item from the queue', function () {
       var queue = new SVG.Queue()
       queue.push(1)
       queue.push(2)
-      queue.push(3)
+      var item = queue.push(3)
 
-      queue.remove(function(item) {
-        return item.value == 3
-      })
+      queue.remove(item)
 
-      expect(queue.length).toBe(2)
       expect(queue.last()).toBe(2)
       expect(queue.first()).toBe(1)
     })
-
-    it('removes no item from the queue if nothing is matched', function () {
-      var queue = new SVG.Queue()
-      queue.push(1)
-      queue.push(2)
-      queue.push(3)
-
-      queue.remove(function(item) {
-        return item.value == 4
-      })
-
-      expect(queue.length).toBe(3)
-      expect(queue.last()).toBe(3)
-      expect(queue.first()).toBe(1)
-    })
   })
 
   describe('shift ()', function () {
@@ -101,7 +75,6 @@ describe ('SVG.Queue()', function () {
 
       var val = queue.shift()
 
-      expect(queue.length).toBe(2)
       expect(queue.last()).toBe(3)
       expect(queue.first()).toBe(2)
 
index c1c59729cffaecb250e6ae2621c10858a9e41bc5..c824effd81880027555a245e51d7df6c5cc1fbe8 100644 (file)
@@ -133,47 +133,6 @@ describe('SVG.Runner', function () {
     })
   })
 
-  describe('tag()', function () {
-    it('acts as a getter', function () {
-      var runner = new SVG.Runner()
-
-      runner.tags = {foo: true}
-      expect(runner.tag()).toEqual(jasmine.arrayContaining(['foo']))
-    })
-
-    it('sets one tag with a string given', function () {
-      var runner = new SVG.Runner()
-
-      runner.tag('foo')
-      expect(runner.tags).toEqual(jasmine.objectContaining({foo: true}))
-    })
-
-    it('sets multiple tags with an array given', function () {
-      var runner = new SVG.Runner()
-
-      runner.tag(['foo', 'bar', 'baz'])
-      expect(runner.tags).toEqual(jasmine.objectContaining({foo: true, bar: true, baz: true}))
-    })
-  })
-
-  describe('untag()', function () {
-    it('untags with a string given', function () {
-      var runner = new SVG.Runner()
-
-      runner.tag('foo')
-      runner.untag('foo')
-      expect(runner.tags).toEqual(jasmine.objectContaining({}))
-    })
-
-    it('untags multiple tags with an array given', function () {
-      var runner = new SVG.Runner()
-
-      runner.tag(['foo', 'bar', 'baz'])
-      runner.untag(['bar', 'baz'])
-      expect(runner.tags).toEqual(jasmine.objectContaining({foo: true}))
-    })
-  })
-
 
   describe('step()', function () {
 
@@ -779,12 +738,14 @@ describe('SVG.Runner', function () {
 
       var runner2 = runner.animate(500, 1000)
 
+      var t = timeline.time()
+
       expect(runner2.timeline()).toBe(timeline)
       expect(runner2.time()).toBe(-1000)
 
       expect(timeline.schedule()).toEqual(jasmine.objectContaining([
-        jasmine.objectContaining({start: 0, duration: 1000, end: 1000, runner: runner}),
-        jasmine.objectContaining({start: 1000, duration: 500, end: 1500, runner: runner2})
+        jasmine.objectContaining({start: t, duration: 1000, end: t+1000, runner: runner}),
+        jasmine.objectContaining({start: t+1000, duration: 500, end: t+1500, runner: runner2})
       ]))
     })
   })
@@ -814,35 +775,35 @@ describe('SVG.Runner', function () {
     })
   })
 
-  describe('after()', function () {
-    it('returns itself', function () {
-      var runner = new SVG.Runner()
-      expect(runner.after(runFn)).toBe(runner)
-    })
-
-    it('binds a function to the after event', function () {
-      var runner = new SVG.Runner()
-      spyOn(runner, 'on')
-      runner.after(runFn)
-
-      expect(runner.on).toHaveBeenCalledWith('finish', runFn)
-    })
-  })
-
-  describe('finish()', function () {
-    it('returns itself', function () {
-      var runner = new SVG.Runner()
-      expect(runner.finish()).toBe(runner)
-    })
-
-    it('calls step with Infinity as argument', function () {
-      var runner = new SVG.Runner()
-      spyOn(runner, 'step')
-      runner.finish()
-
-      expect(runner.step).toHaveBeenCalledWith(Infinity)
-    })
-  })
+  // describe('after()', function () {
+  //   it('returns itself', function () {
+  //     var runner = new SVG.Runner()
+  //     expect(runner.after(runFn)).toBe(runner)
+  //   })
+  //
+  //   it('binds a function to the after event', function () {
+  //     var runner = new SVG.Runner()
+  //     spyOn(runner, 'on')
+  //     runner.after(runFn)
+  //
+  //     expect(runner.on).toHaveBeenCalledWith('finish', runFn)
+  //   })
+  // })
+  //
+  // describe('finish()', function () {
+  //   it('returns itself', function () {
+  //     var runner = new SVG.Runner()
+  //     expect(runner.finish()).toBe(runner)
+  //   })
+  //
+  //   it('calls step with Infinity as argument', function () {
+  //     var runner = new SVG.Runner()
+  //     spyOn(runner, 'step')
+  //     runner.finish()
+  //
+  //     expect(runner.step).toHaveBeenCalledWith(Infinity)
+  //   })
+  // })
 
   describe('reverse()', function () {
     it('returns itself', function () {
index 64a791c9a975b031bc4798a91fd399ddc14e98f9..4f1660970f1b7c7cc4e94ab567a80532963bf6ec 100644 (file)
@@ -1,5 +1,4 @@
 // Add events to elements
-/*
 ;[ 'click',
   'dblclick',
   'mousedown',
   'touchcancel' ].forEach(function (event) {
     // add event to SVG.Element
     SVG.Element.prototype[event] = function (f) {
-    // bind event to element rather than element node
-      SVG.on(this, event, f)
+      if (f === null) {
+        SVG.off(this, event)
+      } else {
+        SVG.on(this, event, f)
+      }
       return this
     }
   })
-*/
 
 SVG.listenerId = 0
 
@@ -132,27 +133,3 @@ SVG.dispatch = function (node, event, data) {
   }
   return event
 }
-
-SVG.EventTarget = SVG.invent({
-  create: function () {},
-  extend: {
-    // Bind given event to listener
-    on: function (event, listener, binding, options) {
-      SVG.on(this, event, listener, binding, options)
-      return this
-    },
-    // Unbind event from listener
-    off: function (event, listener) {
-      SVG.off(this, event, listener)
-      return this
-    },
-    dispatch: function (event, data) {
-      return SVG.dispatch(this, event, data)
-    },
-    // Fire given event
-    fire: function (event, data) {
-      this.dispatch(event, data)
-      return this
-    }
-  }
-})
diff --git a/src/eventtarget.js b/src/eventtarget.js
new file mode 100644 (file)
index 0000000..fbe4781
--- /dev/null
@@ -0,0 +1,23 @@
+SVG.EventTarget = SVG.invent({
+  create: function () {},
+  extend: {
+    // Bind given event to listener
+    on: function (event, listener, binding, options) {
+      SVG.on(this, event, listener, binding, options)
+      return this
+    },
+    // Unbind event from listener
+    off: function (event, listener) {
+      SVG.off(this, event, listener)
+      return this
+    },
+    dispatch: function (event, data) {
+      return SVG.dispatch(this, event, data)
+    },
+    // Fire given event
+    fire: function (event, data) {
+      this.dispatch(event, data)
+      return this
+    }
+  }
+})
index 7fef7f25829ddd5cdd8f7149a6fd487b0049055c..2135b61245285adecf65a0e8b945de6cfa1b880d 100644 (file)
@@ -74,16 +74,6 @@ SVG.Number = SVG.invent({
       number = new SVG.Number(number)
       return new SVG.Number(this / number, this.unit || number.unit)
     },
-    // Convert to different unit
-    to: function (unit) {
-      var number = new SVG.Number(this)
-
-      if (typeof unit === 'string') {
-        number.unit = unit
-      }
-
-      return number
-    },
     // Make number morphable
     morph: function (number) {
       this.destination = new SVG.Number(number)
index 41280a08c4294cb264a696ecd42290f3ef6ba418..97e04e245ec1a382633773ed05d26392b680b91f 100644 (file)
@@ -42,7 +42,6 @@ SVG.Runner = SVG.invent({
     this.enabled = true
     this._time = 0
     this._last = 0
-    this.tags = {}
 
     // Save transforms applied to this runner
     this.transforms = new SVG.Matrix()
@@ -324,36 +323,6 @@ SVG.Runner = SVG.invent({
       return this
     },
 
-    /*
-    Runner Management
-    =================
-    Functions that are used to help index the runner
-    */
-
-    tag: function (name) {
-      // Act as a getter to get all of the tags on this object
-      if (name == null) return Object.keys(this.tags)
-
-      // Add all of the tags to the object directly
-      name = Array.isArray(name) ? name : [name]
-      for (var i = name.length; i--;) {
-        this.tags[name[i]] = true
-      }
-      return this
-    },
-
-    untag: function (name) {
-      name = Array.isArray(name) ? name : [name]
-      for (var i = name.length; i--;) {
-        delete this.tags[name[i]]
-      }
-      return this
-    },
-
-    getEventTarget: function () {
-      return this._dispatcher
-    },
-
     /*
     Private Methods
     ===============