Bug 742947 - Integrate Selenium atoms, r=jgriffin
authorMalini Das <mdas@mozilla.com>
Tue, 10 Apr 2012 17:28:08 -0700
changeset 91368 731f7b016723d77e2fb9de930e110c1f5dbd4f78
parent 91367 ab4a85bc480a54e5c71c0823d8deebd023789ab8
child 91369 fdd10e0e6e5e4733dc76535020d5482de6e0134e
push idunknown
push userunknown
push dateunknown
reviewersjgriffin
bugs742947
milestone14.0a1
Bug 742947 - Integrate Selenium atoms, r=jgriffin
testing/marionette/ChromeUtils.js
testing/marionette/EventUtils.js
testing/marionette/Makefile.in
testing/marionette/atoms/HOWTO
testing/marionette/atoms/Makefile.in
testing/marionette/atoms/atoms.js
testing/marionette/atoms/jar.mn
testing/marionette/components/marionettecomponent.js
testing/marionette/jar.mn
testing/marionette/marionette-actors.js
testing/marionette/marionette-listener.js
new file mode 100644
--- /dev/null
+++ b/testing/marionette/ChromeUtils.js
@@ -0,0 +1,308 @@
+/**
+ * ChromeUtils.js is a set of mochitest utilities that are used to 
+ * synthesize events in the browser.  These are only used by 
+ * mochitest-chrome and browser-chrome tests.  Originally these functions were in 
+ * EventUtils.js, but when porting to specialPowers, we didn't want
+ * to move unnecessary functions.
+ *
+ * ChromeUtils.js depends on EventUtils.js being loaded.
+ *
+ */
+
+/**
+ * Synthesize a query text content event.
+ *
+ * @param aOffset  The character offset.  0 means the first character in the
+ *                 selection root.
+ * @param aLength  The length of getting text.  If the length is too long,
+ *                 the extra length is ignored.
+ * @param aWindow  Optional (If null, current |window| will be used)
+ * @return         An nsIQueryContentEventResult object.  If this failed,
+ *                 the result might be null.
+ */
+function synthesizeQueryTextContent(aOffset, aLength, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (!utils) {
+    return nsnull;
+  }
+  return utils.sendQueryContentEvent(utils.QUERY_TEXT_CONTENT,
+                                     aOffset, aLength, 0, 0);
+}
+
+/**
+ * Synthesize a query caret rect event.
+ *
+ * @param aOffset  The caret offset.  0 means left side of the first character
+ *                 in the selection root.
+ * @param aWindow  Optional (If null, current |window| will be used)
+ * @return         An nsIQueryContentEventResult object.  If this failed,
+ *                 the result might be null.
+ */
+function synthesizeQueryCaretRect(aOffset, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (!utils) {
+    return nsnull;
+  }
+  return utils.sendQueryContentEvent(utils.QUERY_CARET_RECT,
+                                     aOffset, 0, 0, 0);
+}
+
+/**
+ * Synthesize a query text rect event.
+ *
+ * @param aOffset  The character offset.  0 means the first character in the
+ *                 selection root.
+ * @param aLength  The length of the text.  If the length is too long,
+ *                 the extra length is ignored.
+ * @param aWindow  Optional (If null, current |window| will be used)
+ * @return         An nsIQueryContentEventResult object.  If this failed,
+ *                 the result might be null.
+ */
+function synthesizeQueryTextRect(aOffset, aLength, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (!utils) {
+    return nsnull;
+  }
+  return utils.sendQueryContentEvent(utils.QUERY_TEXT_RECT,
+                                     aOffset, aLength, 0, 0);
+}
+
+/**
+ * Synthesize a query editor rect event.
+ *
+ * @param aWindow  Optional (If null, current |window| will be used)
+ * @return         An nsIQueryContentEventResult object.  If this failed,
+ *                 the result might be null.
+ */
+function synthesizeQueryEditorRect(aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (!utils) {
+    return nsnull;
+  }
+  return utils.sendQueryContentEvent(utils.QUERY_EDITOR_RECT, 0, 0, 0, 0);
+}
+
+/**
+ * Synthesize a character at point event.
+ *
+ * @param aX, aY   The offset in the client area of the DOM window.
+ * @param aWindow  Optional (If null, current |window| will be used)
+ * @return         An nsIQueryContentEventResult object.  If this failed,
+ *                 the result might be null.
+ */
+function synthesizeCharAtPoint(aX, aY, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (!utils) {
+    return nsnull;
+  }
+  return utils.sendQueryContentEvent(utils.QUERY_CHARACTER_AT_POINT,
+                                     0, 0, aX, aY);
+}
+
+/**
+ * Synthesize a selection set event.
+ *
+ * @param aOffset  The character offset.  0 means the first character in the
+ *                 selection root.
+ * @param aLength  The length of the text.  If the length is too long,
+ *                 the extra length is ignored.
+ * @param aReverse If true, the selection is from |aOffset + aLength| to
+ *                 |aOffset|.  Otherwise, from |aOffset| to |aOffset + aLength|.
+ * @param aWindow  Optional (If null, current |window| will be used)
+ * @return         True, if succeeded.  Otherwise false.
+ */
+function synthesizeSelectionSet(aOffset, aLength, aReverse, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (!utils) {
+    return false;
+  }
+  return utils.sendSelectionSetEvent(aOffset, aLength, aReverse);
+}
+
+/**
+ * Emulate a dragstart event.
+ *  element - element to fire the dragstart event on
+ *  expectedDragData - the data you expect the data transfer to contain afterwards
+ *                      This data is in the format:
+ *                         [ [ {type: value, data: value, test: function}, ... ], ... ]
+ *                     can be null
+ *  aWindow - optional; defaults to the current window object.
+ *  x - optional; initial x coordinate
+ *  y - optional; initial y coordinate
+ * Returns null if data matches.
+ * Returns the event.dataTransfer if data does not match
+ *
+ * eqTest is an optional function if comparison can't be done with x == y;
+ *   function (actualData, expectedData) {return boolean}
+ *   @param actualData from dataTransfer
+ *   @param expectedData from expectedDragData
+ * see bug 462172 for example of use
+ *
+ */
+function synthesizeDragStart(element, expectedDragData, aWindow, x, y)
+{
+  if (!aWindow)
+    aWindow = window;
+  x = x || 2;
+  y = y || 2;
+  const step = 9;
+
+  var result = "trapDrag was not called";
+  var trapDrag = function(event) {
+    try {
+      var dataTransfer = event.dataTransfer;
+      result = null;
+      if (!dataTransfer)
+        throw "no dataTransfer";
+      if (expectedDragData == null ||
+          dataTransfer.mozItemCount != expectedDragData.length)
+        throw dataTransfer;
+      for (var i = 0; i < dataTransfer.mozItemCount; i++) {
+        var dtTypes = dataTransfer.mozTypesAt(i);
+        if (dtTypes.length != expectedDragData[i].length)
+          throw dataTransfer;
+        for (var j = 0; j < dtTypes.length; j++) {
+          if (dtTypes[j] != expectedDragData[i][j].type)
+            throw dataTransfer;
+          var dtData = dataTransfer.mozGetDataAt(dtTypes[j],i);
+          if (expectedDragData[i][j].eqTest) {
+            if (!expectedDragData[i][j].eqTest(dtData, expectedDragData[i][j].data))
+              throw dataTransfer;
+          }
+          else if (expectedDragData[i][j].data != dtData)
+            throw dataTransfer;
+        }
+      }
+    } catch(ex) {
+      result = ex;
+    }
+    event.preventDefault();
+    event.stopPropagation();
+  }
+  aWindow.addEventListener("dragstart", trapDrag, false);
+  synthesizeMouse(element, x, y, { type: "mousedown" }, aWindow);
+  x += step; y += step;
+  synthesizeMouse(element, x, y, { type: "mousemove" }, aWindow);
+  x += step; y += step;
+  synthesizeMouse(element, x, y, { type: "mousemove" }, aWindow);
+  aWindow.removeEventListener("dragstart", trapDrag, false);
+  synthesizeMouse(element, x, y, { type: "mouseup" }, aWindow);
+  return result;
+}
+
+/**
+ * Emulate a drop by emulating a dragstart and firing events dragenter, dragover, and drop.
+ *  srcElement - the element to use to start the drag, usually the same as destElement
+ *               but if destElement isn't suitable to start a drag on pass a suitable
+ *               element for srcElement
+ *  destElement - the element to fire the dragover, dragleave and drop events
+ *  dragData - the data to supply for the data transfer
+ *                     This data is in the format:
+ *                       [ [ {type: value, data: value}, ...], ... ]
+ *  dropEffect - the drop effect to set during the dragstart event, or 'move' if null
+ *  aWindow - optional; defaults to the current window object.
+ *  eventUtils - optional; allows you to pass in a reference to EventUtils.js. 
+ *               If the eventUtils parameter is not passed in, we assume EventUtils.js is 
+ *               in the scope. Used by browser-chrome tests.
+ *
+ * Returns the drop effect that was desired.
+ */
+function synthesizeDrop(srcElement, destElement, dragData, dropEffect, aWindow, eventUtils)
+{
+  if (!aWindow)
+    aWindow = window;
+
+  var synthesizeMouseAtCenter = (eventUtils || window).synthesizeMouseAtCenter;
+  var synthesizeMouse = (eventUtils || window).synthesizeMouse;
+
+  var gWindowUtils  = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
+                             getInterface(Components.interfaces.nsIDOMWindowUtils);
+  var ds = Components.classes["@mozilla.org/widget/dragservice;1"].
+           getService(Components.interfaces.nsIDragService);
+
+  var dataTransfer;
+  var trapDrag = function(event) {
+    dataTransfer = event.dataTransfer;
+    for (var i = 0; i < dragData.length; i++) {
+      var item = dragData[i];
+      for (var j = 0; j < item.length; j++) {
+        dataTransfer.mozSetDataAt(item[j].type, item[j].data, i);
+      }
+    }
+    dataTransfer.dropEffect = dropEffect || "move";
+    event.preventDefault();
+    event.stopPropagation();
+  }
+
+  ds.startDragSession();
+
+  try {
+    // need to use real mouse action
+    aWindow.addEventListener("dragstart", trapDrag, true);
+    synthesizeMouseAtCenter(srcElement, { type: "mousedown" }, aWindow);
+
+    var rect = srcElement.getBoundingClientRect();
+    var x = rect.width / 2;
+    var y = rect.height / 2;
+    synthesizeMouse(srcElement, x, y, { type: "mousemove" }, aWindow);
+    synthesizeMouse(srcElement, x+10, y+10, { type: "mousemove" }, aWindow);
+    aWindow.removeEventListener("dragstart", trapDrag, true);
+
+    event = aWindow.document.createEvent("DragEvents");
+    event.initDragEvent("dragenter", true, true, aWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
+    gWindowUtils.dispatchDOMEventViaPresShell(destElement, event, true);
+
+    var event = aWindow.document.createEvent("DragEvents");
+    event.initDragEvent("dragover", true, true, aWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
+    if (gWindowUtils.dispatchDOMEventViaPresShell(destElement, event, true)) {
+      synthesizeMouseAtCenter(destElement, { type: "mouseup" }, aWindow);
+      return "none";
+    }
+
+    if (dataTransfer.dropEffect != "none") {
+      event = aWindow.document.createEvent("DragEvents");
+      event.initDragEvent("drop", true, true, aWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
+      gWindowUtils.dispatchDOMEventViaPresShell(destElement, event, true);
+    }
+
+    synthesizeMouseAtCenter(destElement, { type: "mouseup" }, aWindow);
+
+    return dataTransfer.dropEffect;
+  } finally {
+    ds.endDragSession(true);
+  }
+};
+
+var PluginUtils =
+{
+  withTestPlugin : function(callback)
+  {
+    if (typeof Components == "undefined")
+    {
+      todo(false, "Not a Mozilla-based browser");
+      return false;
+    }
+
+    var ph = Components.classes["@mozilla.org/plugin/host;1"]
+                       .getService(Components.interfaces.nsIPluginHost);
+    var tags = ph.getPluginTags();
+
+    // Find the test plugin
+    for (var i = 0; i < tags.length; i++)
+    {
+      if (tags[i].name == "Test Plug-in")
+      {
+        callback(tags[i]);
+        return true;
+      }
+    }
+    todo(false, "Need a test plugin on this platform");
+    return false;
+  }
+};
new file mode 100644
--- /dev/null
+++ b/testing/marionette/EventUtils.js
@@ -0,0 +1,646 @@
+/**
+ * EventUtils provides some utility methods for creating and sending DOM events.
+ * Current methods:
+ *  sendMouseEvent
+ *  sendChar
+ *  sendString
+ *  sendKey
+ *  synthesizeMouse
+ *  synthesizeMouseAtCenter
+ *  synthesizeMouseScroll
+ *  synthesizeKey
+ *  synthesizeMouseExpectEvent
+ *  synthesizeKeyExpectEvent
+ *
+ *  When adding methods to this file, please add a performance test for it.
+ */
+
+/**
+ * Send a mouse event to the node aTarget (aTarget can be an id, or an
+ * actual node) . The "event" passed in to aEvent is just a JavaScript
+ * object with the properties set that the real mouse event object should
+ * have. This includes the type of the mouse event.
+ * E.g. to send an click event to the node with id 'node' you might do this:
+ *
+ * sendMouseEvent({type:'click'}, 'node');
+ */
+function getElement(id) {
+  return ((typeof(id) == "string") ?
+    document.getElementById(id) : id); 
+};   
+
+this.$ = this.getElement;
+const KeyEvent = Components.interfaces.nsIDOMKeyEvent;
+
+function sendMouseEvent(aEvent, aTarget, aWindow) {
+  if (['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout'].indexOf(aEvent.type) == -1) {
+    throw new Error("sendMouseEvent doesn't know about event type '" + aEvent.type + "'");
+  }
+
+  if (!aWindow) {
+    aWindow = window;
+  }
+
+  if (!(aTarget instanceof Element)) {
+    aTarget = aWindow.document.getElementById(aTarget);
+  }
+
+  var event = aWindow.document.createEvent('MouseEvent');
+
+  var typeArg          = aEvent.type;
+  var canBubbleArg     = true;
+  var cancelableArg    = true;
+  var viewArg          = aWindow;
+  var detailArg        = aEvent.detail        || (aEvent.type == 'click'     ||
+                                                  aEvent.type == 'mousedown' ||
+                                                  aEvent.type == 'mouseup' ? 1 :
+                                                  aEvent.type == 'dblclick'? 2 : 0);
+  var screenXArg       = aEvent.screenX       || 0;
+  var screenYArg       = aEvent.screenY       || 0;
+  var clientXArg       = aEvent.clientX       || 0;
+  var clientYArg       = aEvent.clientY       || 0;
+  var ctrlKeyArg       = aEvent.ctrlKey       || false;
+  var altKeyArg        = aEvent.altKey        || false;
+  var shiftKeyArg      = aEvent.shiftKey      || false;
+  var metaKeyArg       = aEvent.metaKey       || false;
+  var buttonArg        = aEvent.button        || 0;
+  var relatedTargetArg = aEvent.relatedTarget || null;
+
+  event.initMouseEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg,
+                       screenXArg, screenYArg, clientXArg, clientYArg,
+                       ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg,
+                       buttonArg, relatedTargetArg);
+
+  //removed: SpecialPowers.dispatchEvent(aWindow, aTarget, event);
+}
+
+/**
+ * Send the char aChar to the focused element.  This method handles casing of
+ * chars (sends the right charcode, and sends a shift key for uppercase chars).
+ * No other modifiers are handled at this point.
+ *
+ * For now this method only works for English letters (lower and upper case)
+ * and the digits 0-9.
+ */
+function sendChar(aChar, aWindow) {
+  // DOM event charcodes match ASCII (JS charcodes) for a-zA-Z0-9.
+  var hasShift = (aChar == aChar.toUpperCase());
+  synthesizeKey(aChar, { shiftKey: hasShift }, aWindow);
+}
+
+/**
+ * Send the string aStr to the focused element.
+ *
+ * For now this method only works for English letters (lower and upper case)
+ * and the digits 0-9.
+ */
+function sendString(aStr, aWindow) {
+  for (var i = 0; i < aStr.length; ++i) {
+    sendChar(aStr.charAt(i), aWindow);
+  }
+}
+
+/**
+ * Send the non-character key aKey to the focused node.
+ * The name of the key should be the part that comes after "DOM_VK_" in the
+ *   KeyEvent constant name for this key.
+ * No modifiers are handled at this point.
+ */
+function sendKey(aKey, aWindow) {
+  var keyName = "VK_" + aKey.toUpperCase();
+  synthesizeKey(keyName, { shiftKey: false }, aWindow);
+}
+
+/**
+ * Parse the key modifier flags from aEvent. Used to share code between
+ * synthesizeMouse and synthesizeKey.
+ */
+function _parseModifiers(aEvent)
+{
+  const masks = Components.interfaces.nsIDOMNSEvent;
+  var mval = 0;
+  if (aEvent.shiftKey)
+    mval |= masks.SHIFT_MASK;
+  if (aEvent.ctrlKey)
+    mval |= masks.CONTROL_MASK;
+  if (aEvent.altKey)
+    mval |= masks.ALT_MASK;
+  if (aEvent.metaKey)
+    mval |= masks.META_MASK;
+  if (aEvent.accelKey)
+    mval |= (navigator.platform.indexOf("Mac") >= 0) ? masks.META_MASK :
+                                                       masks.CONTROL_MASK;
+
+  return mval;
+}
+
+/**
+ * Synthesize a mouse event on a target. The actual client point is determined
+ * by taking the aTarget's client box and offseting it by aOffsetX and
+ * aOffsetY. This allows mouse clicks to be simulated by calling this method.
+ *
+ * aEvent is an object which may contain the properties:
+ *   shiftKey, ctrlKey, altKey, metaKey, accessKey, clickCount, button, type
+ *
+ * If the type is specified, an mouse event of that type is fired. Otherwise,
+ * a mousedown followed by a mouse up is performed.
+ *
+ * aWindow is optional, and defaults to the current window object.
+ */
+function synthesizeMouse(aTarget, aOffsetX, aOffsetY, aEvent, aWindow)
+{
+  var rect = aTarget.getBoundingClientRect();
+  synthesizeMouseAtPoint(rect.left + aOffsetX, rect.top + aOffsetY,
+			 aEvent, aWindow);
+}
+
+/*
+ * Synthesize a mouse event at a particular point in aWindow.
+ *
+ * aEvent is an object which may contain the properties:
+ *   shiftKey, ctrlKey, altKey, metaKey, accessKey, clickCount, button, type
+ *
+ * If the type is specified, an mouse event of that type is fired. Otherwise,
+ * a mousedown followed by a mouse up is performed.
+ *
+ * aWindow is optional, and defaults to the current window object.
+ */
+function synthesizeMouseAtPoint(left, top, aEvent, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+
+  if (utils) {
+    var button = aEvent.button || 0;
+    var clickCount = aEvent.clickCount || 1;
+    var modifiers = _parseModifiers(aEvent);
+
+    if (("type" in aEvent) && aEvent.type) {
+      utils.sendMouseEvent(aEvent.type, left, top, button, clickCount, modifiers);
+    }
+    else {
+      utils.sendMouseEvent("mousedown", left, top, button, clickCount, modifiers);
+      utils.sendMouseEvent("mouseup", left, top, button, clickCount, modifiers);
+    }
+  }
+}
+
+// Call synthesizeMouse with coordinates at the center of aTarget.
+function synthesizeMouseAtCenter(aTarget, aEvent, aWindow)
+{
+  var rect = aTarget.getBoundingClientRect();
+  synthesizeMouse(aTarget, rect.width / 2, rect.height / 2, aEvent,
+                  aWindow);
+}
+
+/**
+ * Synthesize a mouse scroll event on a target. The actual client point is determined
+ * by taking the aTarget's client box and offseting it by aOffsetX and
+ * aOffsetY.
+ *
+ * aEvent is an object which may contain the properties:
+ *   shiftKey, ctrlKey, altKey, metaKey, accessKey, button, type, axis, delta, hasPixels
+ *
+ * If the type is specified, a mouse scroll event of that type is fired. Otherwise,
+ * "DOMMouseScroll" is used.
+ *
+ * If the axis is specified, it must be one of "horizontal" or "vertical". If not specified,
+ * "vertical" is used.
+ *
+ * 'delta' is the amount to scroll by (can be positive or negative). It must
+ * be specified.
+ *
+ * 'hasPixels' specifies whether kHasPixels should be set in the scrollFlags.
+ *
+ * 'isMomentum' specifies whether kIsMomentum should be set in the scrollFlags.
+ *
+ * aWindow is optional, and defaults to the current window object.
+ */
+function synthesizeMouseScroll(aTarget, aOffsetX, aOffsetY, aEvent, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+
+  if (utils) {
+    // See nsMouseScrollFlags in nsGUIEvent.h
+    const kIsVertical = 0x02;
+    const kIsHorizontal = 0x04;
+    const kHasPixels = 0x08;
+    const kIsMomentum = 0x40;
+
+    var button = aEvent.button || 0;
+    var modifiers = _parseModifiers(aEvent);
+
+    var rect = aTarget.getBoundingClientRect();
+
+    var left = rect.left;
+    var top = rect.top;
+
+    var type = (("type" in aEvent) && aEvent.type) || "DOMMouseScroll";
+    var axis = aEvent.axis || "vertical";
+    var scrollFlags = (axis == "horizontal") ? kIsHorizontal : kIsVertical;
+    if (aEvent.hasPixels) {
+      scrollFlags |= kHasPixels;
+    }
+    if (aEvent.isMomentum) {
+      scrollFlags |= kIsMomentum;
+    }
+    utils.sendMouseScrollEvent(type, left + aOffsetX, top + aOffsetY, button,
+                               scrollFlags, aEvent.delta, modifiers);
+  }
+}
+
+function _computeKeyCodeFromChar(aChar)
+{
+  if (aChar.length != 1) {
+    return 0;
+  }
+  const nsIDOMKeyEvent = Components.interfaces.nsIDOMKeyEvent;
+  if (aChar >= 'a' && aChar <= 'z') {
+    return nsIDOMKeyEvent.DOM_VK_A + aChar.charCodeAt(0) - 'a'.charCodeAt(0);
+  }
+  if (aChar >= 'A' && aChar <= 'Z') {
+    return nsIDOMKeyEvent.DOM_VK_A + aChar.charCodeAt(0) - 'A'.charCodeAt(0);
+  }
+  if (aChar >= '0' && aChar <= '9') {
+    return nsIDOMKeyEvent.DOM_VK_0 + aChar.charCodeAt(0) - '0'.charCodeAt(0);
+  }
+  // returns US keyboard layout's keycode
+  switch (aChar) {
+    case '~':
+    case '`':
+      return nsIDOMKeyEvent.DOM_VK_BACK_QUOTE;
+    case '!':
+      return nsIDOMKeyEvent.DOM_VK_1;
+    case '@':
+      return nsIDOMKeyEvent.DOM_VK_2;
+    case '#':
+      return nsIDOMKeyEvent.DOM_VK_3;
+    case '$':
+      return nsIDOMKeyEvent.DOM_VK_4;
+    case '%':
+      return nsIDOMKeyEvent.DOM_VK_5;
+    case '^':
+      return nsIDOMKeyEvent.DOM_VK_6;
+    case '&':
+      return nsIDOMKeyEvent.DOM_VK_7;
+    case '*':
+      return nsIDOMKeyEvent.DOM_VK_8;
+    case '(':
+      return nsIDOMKeyEvent.DOM_VK_9;
+    case ')':
+      return nsIDOMKeyEvent.DOM_VK_0;
+    case '-':
+    case '_':
+      return nsIDOMKeyEvent.DOM_VK_SUBTRACT;
+    case '+':
+    case '=':
+      return nsIDOMKeyEvent.DOM_VK_EQUALS;
+    case '{':
+    case '[':
+      return nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET;
+    case '}':
+    case ']':
+      return nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET;
+    case '|':
+    case '\\':
+      return nsIDOMKeyEvent.DOM_VK_BACK_SLASH;
+    case ':':
+    case ';':
+      return nsIDOMKeyEvent.DOM_VK_SEMICOLON;
+    case '\'':
+    case '"':
+      return nsIDOMKeyEvent.DOM_VK_QUOTE;
+    case '<':
+    case ',':
+      return nsIDOMKeyEvent.DOM_VK_COMMA;
+    case '>':
+    case '.':
+      return nsIDOMKeyEvent.DOM_VK_PERIOD;
+    case '?':
+    case '/':
+      return nsIDOMKeyEvent.DOM_VK_SLASH;
+    default:
+      return 0;
+  }
+}
+
+/**
+ * isKeypressFiredKey() returns TRUE if the given key should cause keypress
+ * event when widget handles the native key event.  Otherwise, FALSE.
+ *
+ * aDOMKeyCode should be one of consts of nsIDOMKeyEvent::DOM_VK_*, or a key
+ * name begins with "VK_", or a character.
+ */
+function isKeypressFiredKey(aDOMKeyCode)
+{
+  const KeyEvent = Components.interfaces.nsIDOMKeyEvent;
+  if (typeof(aDOMKeyCode) == "string") {
+    if (aDOMKeyCode.indexOf("VK_") == 0) {
+      aDOMKeyCode = KeyEvent["DOM_" + aDOMKeyCode];
+      if (!aDOMKeyCode) {
+        throw "Unknown key: " + aDOMKeyCode;
+      }
+    } else {
+      // If the key generates a character, it must cause a keypress event.
+      return true;
+    }
+  }
+  switch (aDOMKeyCode) {
+    case KeyEvent.DOM_VK_SHIFT:
+    case KeyEvent.DOM_VK_CONTROL:
+    case KeyEvent.DOM_VK_ALT:
+    case KeyEvent.DOM_VK_CAPS_LOCK:
+    case KeyEvent.DOM_VK_NUM_LOCK:
+    case KeyEvent.DOM_VK_SCROLL_LOCK:
+    case KeyEvent.DOM_VK_META:
+      return false;
+    default:
+      return true;
+  }
+}
+
+/**
+ * Synthesize a key event. It is targeted at whatever would be targeted by an
+ * actual keypress by the user, typically the focused element.
+ *
+ * aKey should be either a character or a keycode starting with VK_ such as
+ * VK_ENTER.
+ *
+ * aEvent is an object which may contain the properties:
+ *   shiftKey, ctrlKey, altKey, metaKey, accessKey, type
+ *
+ * If the type is specified, a key event of that type is fired. Otherwise,
+ * a keydown, a keypress and then a keyup event are fired in sequence.
+ *
+ * aWindow is optional, and defaults to the current window object.
+ */
+function synthesizeKey(aKey, aEvent, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (utils) {
+    var keyCode = 0, charCode = 0;
+    if (aKey.indexOf("VK_") == 0) {
+      keyCode = KeyEvent["DOM_" + aKey];
+      if (!keyCode) {
+        throw "Unknown key: " + aKey;
+      }
+    } else {
+      charCode = aKey.charCodeAt(0);
+      keyCode = _computeKeyCodeFromChar(aKey.charAt(0));
+    }
+
+    var modifiers = _parseModifiers(aEvent);
+
+    if (!("type" in aEvent) || !aEvent.type) {
+      // Send keydown + (optional) keypress + keyup events.
+      var keyDownDefaultHappened =
+          utils.sendKeyEvent("keydown", keyCode, 0, modifiers);
+      if (isKeypressFiredKey(keyCode)) {
+        utils.sendKeyEvent("keypress", charCode ? 0 : keyCode, charCode,
+                           modifiers, !keyDownDefaultHappened);
+      }
+      utils.sendKeyEvent("keyup", keyCode, 0, modifiers);
+    } else if (aEvent.type == "keypress") {
+      // Send standalone keypress event.
+      utils.sendKeyEvent(aEvent.type, charCode ? 0 : keyCode,
+                         charCode, modifiers);
+    } else {
+      // Send other standalone event than keypress.
+      utils.sendKeyEvent(aEvent.type, keyCode, 0, modifiers);
+    }
+  }
+}
+
+var _gSeenEvent = false;
+
+/**
+ * Indicate that an event with an original target of aExpectedTarget and
+ * a type of aExpectedEvent is expected to be fired, or not expected to
+ * be fired.
+ */
+function _expectEvent(aExpectedTarget, aExpectedEvent, aTestName)
+{
+  if (!aExpectedTarget || !aExpectedEvent)
+    return null;
+
+  _gSeenEvent = false;
+
+  var type = (aExpectedEvent.charAt(0) == "!") ?
+             aExpectedEvent.substring(1) : aExpectedEvent;
+  var eventHandler = function(event) {
+    var epassed = (!_gSeenEvent && event.originalTarget == aExpectedTarget &&
+                   event.type == type);
+    is(epassed, true, aTestName + " " + type + " event target " + (_gSeenEvent ? "twice" : ""));
+    _gSeenEvent = true;
+  };
+
+  aExpectedTarget.addEventListener(type, eventHandler, false);
+  return eventHandler;
+}
+
+/**
+ * Check if the event was fired or not. The event handler aEventHandler
+ * will be removed.
+ */
+function _checkExpectedEvent(aExpectedTarget, aExpectedEvent, aEventHandler, aTestName)
+{
+  if (aEventHandler) {
+    var expectEvent = (aExpectedEvent.charAt(0) != "!");
+    var type = expectEvent ? aExpectedEvent : aExpectedEvent.substring(1);
+    aExpectedTarget.removeEventListener(type, aEventHandler, false);
+    var desc = type + " event";
+    if (!expectEvent)
+      desc += " not";
+    is(_gSeenEvent, expectEvent, aTestName + " " + desc + " fired");
+  }
+
+  _gSeenEvent = false;
+}
+
+/**
+ * Similar to synthesizeMouse except that a test is performed to see if an
+ * event is fired at the right target as a result.
+ *
+ * aExpectedTarget - the expected originalTarget of the event.
+ * aExpectedEvent - the expected type of the event, such as 'select'.
+ * aTestName - the test name when outputing results
+ *
+ * To test that an event is not fired, use an expected type preceded by an
+ * exclamation mark, such as '!select'. This might be used to test that a
+ * click on a disabled element doesn't fire certain events for instance.
+ *
+ * aWindow is optional, and defaults to the current window object.
+ */
+function synthesizeMouseExpectEvent(aTarget, aOffsetX, aOffsetY, aEvent,
+                                    aExpectedTarget, aExpectedEvent, aTestName,
+                                    aWindow)
+{
+  var eventHandler = _expectEvent(aExpectedTarget, aExpectedEvent, aTestName);
+  synthesizeMouse(aTarget, aOffsetX, aOffsetY, aEvent, aWindow);
+  _checkExpectedEvent(aExpectedTarget, aExpectedEvent, eventHandler, aTestName);
+}
+
+/**
+ * Similar to synthesizeKey except that a test is performed to see if an
+ * event is fired at the right target as a result.
+ *
+ * aExpectedTarget - the expected originalTarget of the event.
+ * aExpectedEvent - the expected type of the event, such as 'select'.
+ * aTestName - the test name when outputing results
+ *
+ * To test that an event is not fired, use an expected type preceded by an
+ * exclamation mark, such as '!select'.
+ *
+ * aWindow is optional, and defaults to the current window object.
+ */
+function synthesizeKeyExpectEvent(key, aEvent, aExpectedTarget, aExpectedEvent,
+                                  aTestName, aWindow)
+{
+  var eventHandler = _expectEvent(aExpectedTarget, aExpectedEvent, aTestName);
+  synthesizeKey(key, aEvent, aWindow);
+  _checkExpectedEvent(aExpectedTarget, aExpectedEvent, eventHandler, aTestName);
+}
+
+function disableNonTestMouseEvents(aDisable)
+{
+  var domutils = _getDOMWindowUtils();
+  domutils.disableNonTestMouseEvents(aDisable);
+}
+
+function _getDOMWindowUtils(aWindow)
+{
+  if (!aWindow) {
+    aWindow = window;
+  }
+
+  //TODO: this is assuming we are in chrome space
+  return aWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
+                               getInterface(Components.interfaces.nsIDOMWindowUtils);
+}
+
+// Must be synchronized with nsIDOMWindowUtils.
+const COMPOSITION_ATTR_RAWINPUT              = 0x02;
+const COMPOSITION_ATTR_SELECTEDRAWTEXT       = 0x03;
+const COMPOSITION_ATTR_CONVERTEDTEXT         = 0x04;
+const COMPOSITION_ATTR_SELECTEDCONVERTEDTEXT = 0x05;
+
+/**
+ * Synthesize a composition event.
+ *
+ * @param aEvent               The composition event information.  This must
+ *                             have |type| member.  The value must be
+ *                             "compositionstart", "compositionend" or
+ *                             "compositionupdate".
+ *                             And also this may have |data| and |locale| which
+ *                             would be used for the value of each property of
+ *                             the composition event.  Note that the data would
+ *                             be ignored if the event type were
+ *                             "compositionstart".
+ * @param aWindow              Optional (If null, current |window| will be used)
+ */
+function synthesizeComposition(aEvent, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (!utils) {
+    return;
+  }
+
+  utils.sendCompositionEvent(aEvent.type, aEvent.data ? aEvent.data : "",
+                             aEvent.locale ? aEvent.locale : "");
+}
+/**
+ * Synthesize a text event.
+ *
+ * @param aEvent   The text event's information, this has |composition|
+ *                 and |caret| members.  |composition| has |string| and
+ *                 |clauses| members.  |clauses| must be array object.  Each
+ *                 object has |length| and |attr|.  And |caret| has |start| and
+ *                 |length|.  See the following tree image.
+ *
+ *                 aEvent
+ *                   +-- composition
+ *                   |     +-- string
+ *                   |     +-- clauses[]
+ *                   |           +-- length
+ *                   |           +-- attr
+ *                   +-- caret
+ *                         +-- start
+ *                         +-- length
+ *
+ *                 Set the composition string to |composition.string|.  Set its
+ *                 clauses information to the |clauses| array.
+ *
+ *                 When it's composing, set the each clauses' length to the
+ *                 |composition.clauses[n].length|.  The sum of the all length
+ *                 values must be same as the length of |composition.string|.
+ *                 Set nsIDOMWindowUtils.COMPOSITION_ATTR_* to the
+ *                 |composition.clauses[n].attr|.
+ *
+ *                 When it's not composing, set 0 to the
+ *                 |composition.clauses[0].length| and
+ *                 |composition.clauses[0].attr|.
+ *
+ *                 Set caret position to the |caret.start|. It's offset from
+ *                 the start of the composition string.  Set caret length to
+ *                 |caret.length|.  If it's larger than 0, it should be wide
+ *                 caret.  However, current nsEditor doesn't support wide
+ *                 caret, therefore, you should always set 0 now.
+ *
+ * @param aWindow  Optional (If null, current |window| will be used)
+ */
+function synthesizeText(aEvent, aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (!utils) {
+    return;
+  }
+
+  if (!aEvent.composition || !aEvent.composition.clauses ||
+      !aEvent.composition.clauses[0]) {
+    return;
+  }
+
+  var firstClauseLength = aEvent.composition.clauses[0].length;
+  var firstClauseAttr   = aEvent.composition.clauses[0].attr;
+  var secondClauseLength = 0;
+  var secondClauseAttr = 0;
+  var thirdClauseLength = 0;
+  var thirdClauseAttr = 0;
+  if (aEvent.composition.clauses[1]) {
+    secondClauseLength = aEvent.composition.clauses[1].length;
+    secondClauseAttr   = aEvent.composition.clauses[1].attr;
+    if (aEvent.composition.clauses[2]) {
+      thirdClauseLength = aEvent.composition.clauses[2].length;
+      thirdClauseAttr   = aEvent.composition.clauses[2].attr;
+    }
+  }
+
+  var caretStart = -1;
+  var caretLength = 0;
+  if (aEvent.caret) {
+    caretStart = aEvent.caret.start;
+    caretLength = aEvent.caret.length;
+  }
+
+  utils.sendTextEvent(aEvent.composition.string,
+                      firstClauseLength, firstClauseAttr,
+                      secondClauseLength, secondClauseAttr,
+                      thirdClauseLength, thirdClauseAttr,
+                      caretStart, caretLength);
+}
+
+/**
+ * Synthesize a query selected text event.
+ *
+ * @param aWindow  Optional (If null, current |window| will be used)
+ * @return         An nsIQueryContentEventResult object.  If this failed,
+ *                 the result might be null.
+ */
+function synthesizeQuerySelectedText(aWindow)
+{
+  var utils = _getDOMWindowUtils(aWindow);
+  if (!utils) {
+    return null;
+  }
+
+  return utils.sendQueryContentEvent(utils.QUERY_SELECTED_TEXT, 0, 0, 0, 0);
+}
--- a/testing/marionette/Makefile.in
+++ b/testing/marionette/Makefile.in
@@ -5,15 +5,17 @@
 DEPTH = ../..
 topsrcdir = @top_srcdir@
 srcdir = @srcdir@
 VPATH = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 ifdef ENABLE_MARIONETTE
-    DIRS += components
+    DIRS += components \
+            atoms \
+            $(NULL)
   ifdef ENABLE_TESTS
       DIRS += tests
   endif
 endif
 
 include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/testing/marionette/atoms/HOWTO
@@ -0,0 +1,29 @@
+These atoms are generated from the selenium trunk. They are minified versions of what's in the trunk,
+optimized to run on Firefox. To generate them, clone the repo:
+
+    svn checkout http://selenium.googlecode.com/svn/trunk/ selenium-read-only 
+
+then run the Google closure compiler and specify which atom you'd like to get.
+For example, this will generate the "get_text" atom:
+
+    cd selenium-read-only
+    ./go //javascript/webdriver/atoms:get_text:firefox
+
+This generates the atom, which is a function. You'll need to assign that function to a variable of your choice 
+which you can then import, i.e.: you'll need to modify the atom with a variable assignment:
+
+  var myVar = <atom code>
+
+You can now import this atom and call it with myVar(). Please note the name of the function as a comment above this line to help readability in the atoms file.
+
+For more information on atoms, refer to http://code.google.com/p/selenium/wiki/AutomationAtoms#Atoms_Summary
+
+Currently bundled atoms (please update as you add more):
+- clearElement
+- click
+- getAttributeValue
+- getElementText
+- isElementDisplayed
+- isElementEnabled
+- isElementSelected
+- sendKeysToElement/type
new file mode 100644
--- /dev/null
+++ b/testing/marionette/atoms/Makefile.in
@@ -0,0 +1,11 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this file,
+# You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEPTH = ../../..
+topsrcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/testing/marionette/atoms/atoms.js
@@ -0,0 +1,302 @@
+//clearElement
+var clearElement = function(){return function(){function g(a){throw a;}var h=void 0,i=!0,k=null,l=!1;function n(a){return function(){return this[a]}}function o(a){return function(){return a}}var p,q=this;
+function aa(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
+else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function r(a){return a!==h}function ba(a){var b=aa(a);return"array"==b||"object"==b&&"number"==typeof a.length}function t(a){return"string"==typeof a}function w(a){return"function"==aa(a)}function ca(a){a=aa(a);return"object"==a||"array"==a||"function"==a}var da="closure_uid_"+Math.floor(2147483648*Math.random()).toString(36),ea=0,fa=Date.now||function(){return+new Date};
+function x(a,b){function c(){}c.prototype=b.prototype;a.$=b.prototype;a.prototype=new c};function ga(a,b){for(var c=1;c<arguments.length;c++)var d=(""+arguments[c]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,d);return a}function ha(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}function ia(a){if(!ja.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(ka,"&amp;"));-1!=a.indexOf("<")&&(a=a.replace(la,"&lt;"));-1!=a.indexOf(">")&&(a=a.replace(ma,"&gt;"));-1!=a.indexOf('"')&&(a=a.replace(na,"&quot;"));return a}var ka=/&/g,la=/</g,ma=/>/g,na=/\"/g,ja=/[&<>\"]/;
+function oa(a,b){for(var c=0,d=ha(""+a).split("."),e=ha(""+b).split("."),f=Math.max(d.length,e.length),j=0;0==c&&j<f;j++){var m=d[j]||"",s=e[j]||"",O=RegExp("(\\d*)(\\D*)","g"),E=RegExp("(\\d*)(\\D*)","g");do{var u=O.exec(m)||["","",""],v=E.exec(s)||["","",""];if(0==u[0].length&&0==v[0].length)break;c=((0==u[1].length?0:parseInt(u[1],10))<(0==v[1].length?0:parseInt(v[1],10))?-1:(0==u[1].length?0:parseInt(u[1],10))>(0==v[1].length?0:parseInt(v[1],10))?1:0)||((0==u[2].length)<(0==v[2].length)?-1:(0==
+u[2].length)>(0==v[2].length)?1:0)||(u[2]<v[2]?-1:u[2]>v[2]?1:0)}while(0==c)}return c}var pa=2147483648*Math.random()|0,qa={};function ra(a){return qa[a]||(qa[a]=(""+a).replace(/\-([a-z])/g,function(a,c){return c.toUpperCase()}))};var sa,ta;function ua(){return q.navigator?q.navigator.userAgent:k}var va,wa=q.navigator;va=wa&&wa.platform||"";sa=-1!=va.indexOf("Mac");ta=-1!=va.indexOf("Win");var xa=-1!=va.indexOf("Linux"),ya,za="",Aa=/rv\:([^\);]+)(\)|;)/.exec(ua());ya=za=Aa?Aa[1]:"";var Ba={};var Ca=window;function Da(a,b){for(var c in a)b.call(h,a[c],c,a)}function Ea(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b};function y(a,b){this.code=a;this.message=b||"";this.name=Fa[a]||Fa[13];var c=Error(this.message);c.name=this.name;this.stack=c.stack||""}x(y,Error);
+var Fa={7:"NoSuchElementError",8:"NoSuchFrameError",9:"UnknownCommandError",10:"StaleElementReferenceError",11:"ElementNotVisibleError",12:"InvalidElementStateError",13:"UnknownError",15:"ElementNotSelectableError",19:"XPathLookupError",23:"NoSuchWindowError",24:"InvalidCookieDomainError",25:"UnableToSetCookieError",26:"ModalDialogOpenedError",27:"NoModalDialogOpenError",28:"ScriptTimeoutError",32:"InvalidSelectorError",33:"SqlDatabaseError",34:"MoveTargetOutOfBoundsError"};
+y.prototype.toString=function(){return"["+this.name+"] "+this.message};function Ga(a){this.stack=Error().stack||"";a&&(this.message=""+a)}x(Ga,Error);Ga.prototype.name="CustomError";function Ha(a,b){b.unshift(a);Ga.call(this,ga.apply(k,b));b.shift()}x(Ha,Ga);Ha.prototype.name="AssertionError";function Ia(a,b,c){if(!a){var d=Array.prototype.slice.call(arguments,2),e="Assertion failed";if(b)var e=e+(": "+b),f=d;g(new Ha(""+e,f||[]))}}function Ja(a,b){g(new Ha("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1)))};function z(a){return a[a.length-1]}var Ka=Array.prototype;function A(a,b){if(t(a))return!t(b)||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}function La(a,b){for(var c=a.length,d=t(a)?a.split(""):a,e=0;e<c;e++)e in d&&b.call(h,d[e],e,a)}function Ma(a,b){for(var c=a.length,d=Array(c),e=t(a)?a.split(""):a,f=0;f<c;f++)f in e&&(d[f]=b.call(h,e[f],f,a));return d}
+function Na(a,b,c){for(var d=a.length,e=t(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&b.call(c,e[f],f,a))return i;return l}function Oa(a,b,c){for(var d=a.length,e=t(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&!b.call(c,e[f],f,a))return l;return i}function Pa(a,b){var c;a:{c=a.length;for(var d=t(a)?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(h,d[e],e,a)){c=e;break a}c=-1}return 0>c?k:t(a)?a.charAt(c):a[c]}function Qa(a){return Ka.concat.apply(Ka,arguments)}
+function Ra(a){if("array"==aa(a))return Qa(a);for(var b=[],c=0,d=a.length;c<d;c++)b[c]=a[c];return b}function Sa(a,b,c){Ia(a.length!=k);return 2>=arguments.length?Ka.slice.call(a,b):Ka.slice.call(a,b,c)};var Ta;Ba["1.9.1"]||(Ba["1.9.1"]=0<=oa(ya,"1.9.1"));function Ua(a,b){var c;c=(c=a.className)&&"function"==typeof c.split?c.split(/\s+/):[];var d=Sa(arguments,1),e;e=c;for(var f=0,j=0;j<d.length;j++)0<=A(e,d[j])||(e.push(d[j]),f++);e=f==d.length;a.className=c.join(" ");return e};function B(a,b){this.x=r(a)?a:0;this.y=r(b)?b:0}B.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function Va(a,b){this.width=a;this.height=b}Va.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};Va.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};Va.prototype.scale=function(a){this.width*=a;this.height*=a;return this};var C=3;function Wa(a){return a?new Xa(D(a)):Ta||(Ta=new Xa)}function Ya(a,b){Da(b,function(b,d){"style"==d?a.style.cssText=b:"class"==d?a.className=b:"for"==d?a.htmlFor=b:d in Za?a.setAttribute(Za[d],b):0==d.lastIndexOf("aria-",0)?a.setAttribute(d,b):a[d]=b})}var Za={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",rowspan:"rowSpan",valign:"vAlign",height:"height",width:"width",usemap:"useMap",frameborder:"frameBorder",maxlength:"maxLength",type:"type"};
+function F(a){return a?a.parentWindow||a.defaultView:window}function $a(a,b,c){function d(c){c&&b.appendChild(t(c)?a.createTextNode(c):c)}for(var e=2;e<c.length;e++){var f=c[e];ba(f)&&!(ca(f)&&0<f.nodeType)?La(ab(f)?Ra(f):f,d):d(f)}}function bb(a){return a&&a.parentNode?a.parentNode.removeChild(a):k}
+function G(a,b){if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}
+function cb(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if("sourceIndex"in a||a.parentNode&&"sourceIndex"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==f?db(a,b):!c&&G(e,b)?-1*eb(a,b):!d&&G(f,a)?eb(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=D(a);c=d.createRange();c.selectNode(a);c.collapse(i);d=d.createRange();d.selectNode(b);d.collapse(i);
+return c.compareBoundaryPoints(q.Range.START_TO_END,d)}function eb(a,b){var c=a.parentNode;if(c==b)return-1;for(var d=b;d.parentNode!=c;)d=d.parentNode;return db(d,a)}function db(a,b){for(var c=b;c=c.previousSibling;)if(c==a)return-1;return 1}
+function fb(a){var b,c=arguments.length;if(c){if(1==c)return arguments[0]}else return k;var d=[],e=Infinity;for(b=0;b<c;b++){for(var f=[],j=arguments[b];j;)f.unshift(j),j=j.parentNode;d.push(f);e=Math.min(e,f.length)}f=k;for(b=0;b<e;b++){for(var j=d[0][b],m=1;m<c;m++)if(j!=d[m][b])return f;f=j}return f}function D(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function gb(a,b){var c=[];return hb(a,b,c,i)?c[0]:h}
+function hb(a,b,c,d){if(a!=k)for(a=a.firstChild;a;){if(b(a)&&(c.push(a),d)||hb(a,b,c,d))return i;a=a.nextSibling}return l}var ib={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},jb={IMG:" ",BR:"\n"};function kb(a,b,c){if(!(a.nodeName in ib))if(a.nodeType==C)c?b.push((""+a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in jb)b.push(jb[a.nodeName]);else for(a=a.firstChild;a;)kb(a,b,c),a=a.nextSibling}
+function ab(a){if(a&&"number"==typeof a.length){if(ca(a))return"function"==typeof a.item||"string"==typeof a.item;if(w(a))return"function"==typeof a.item}return l}function lb(a,b){for(var a=a.parentNode,c=0;a;){if(b(a))return a;a=a.parentNode;c++}return k}function Xa(a){this.v=a||q.document||document}p=Xa.prototype;p.ea=n("v");p.z=function(a){return t(a)?this.v.getElementById(a):a};
+p.da=function(a,b,c){var d=this.v,e=arguments,f=e[1],j=d.createElement(e[0]);f&&(t(f)?j.className=f:"array"==aa(f)?Ua.apply(k,[j].concat(f)):Ya(j,f));2<e.length&&$a(d,j,e);return j};p.createElement=function(a){return this.v.createElement(a)};p.createTextNode=function(a){return this.v.createTextNode(a)};p.qa=function(){return this.v.parentWindow||this.v.defaultView};
+function mb(a){var b=a.v,a="CSS1Compat"==b.compatMode?b.documentElement:b.body,b=b.parentWindow||b.defaultView;return new B(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)}p.appendChild=function(a,b){a.appendChild(b)};p.removeNode=bb;p.contains=G;var H={};H.ya=function(){var a={Oa:"http://www.w3.org/2000/svg"};return function(b){return a[b]||k}}();H.ma=function(a,b,c){var d=D(a);if(!d.implementation.hasFeature("XPath","3.0"))return k;try{var e=d.createNSResolver?d.createNSResolver(d.documentElement):H.ya;return d.evaluate(b,a,e,c,k)}catch(f){"NS_ERROR_ILLEGAL_VALUE"!=f.name&&g(new y(32,"Unable to locate an element with the xpath expression "+b+" because of the following error:\n"+f))}};
+H.ka=function(a,b){(!a||1!=a.nodeType)&&g(new y(32,'The result of the xpath expression "'+b+'" is: '+a+". It should be an element."))};H.Ia=function(a,b){var c=function(){var c=H.ma(b,a,9);return c?c.singleNodeValue||k:b.selectSingleNode?(c=D(b),c.setProperty&&c.setProperty("SelectionLanguage","XPath"),b.selectSingleNode(a)):k}();c===k||H.ka(c,a);return c};
+H.Na=function(a,b){var c=function(){var c=H.ma(b,a,7);if(c){for(var e=c.snapshotLength,f=[],j=0;j<e;++j)f.push(c.snapshotItem(j));return f}return b.selectNodes?(c=D(b),c.setProperty&&c.setProperty("SelectionLanguage","XPath"),b.selectNodes(a)):[]}();La(c,function(b){H.ka(b,a)});return c};var nb,ob="",pb=/Firefox\/([0-9.]+)/.exec(ua());nb=ob=pb?pb[2]||pb[1]:"";var qb=k,rb=function(){var a=q.Components;if(!a)return l;try{if(!a.classes)return l}catch(b){return l}var c=a.classes,a=a.interfaces,d=c["@mozilla.org/xpcom/version-comparator;1"].getService(a.nsIVersionComparator),e=c["@mozilla.org/xre/app-info;1"].getService(a.nsIXULAppInfo).version;qb=function(a){return 0<=d.Ka(e,""+a)};return i}();var I="StopIteration"in q?q.StopIteration:Error("StopIteration");function J(){}J.prototype.next=function(){g(I)};J.prototype.r=function(){return this};function sb(a){if(a instanceof J)return a;if("function"==typeof a.r)return a.r(l);if(ba(a)){var b=0,c=new J;c.next=function(){for(;;){b>=a.length&&g(I);if(b in a)return a[b++];b++}};return c}g(Error("Not implemented"))};function K(a,b,c,d,e){this.o=!!b;a&&L(this,a,d);this.depth=e!=h?e:this.q||0;this.o&&(this.depth*=-1);this.za=!c}x(K,J);p=K.prototype;p.p=k;p.q=0;p.ha=l;function L(a,b,c,d){if(a.p=b)a.q="number"==typeof c?c:1!=a.p.nodeType?0:a.o?-1:1;"number"==typeof d&&(a.depth=d)}
+p.next=function(){var a;if(this.ha){(!this.p||this.za&&0==this.depth)&&g(I);a=this.p;var b=this.o?-1:1;if(this.q==b){var c=this.o?a.lastChild:a.firstChild;c?L(this,c):L(this,a,-1*b)}else(c=this.o?a.previousSibling:a.nextSibling)?L(this,c):L(this,a.parentNode,-1*b);this.depth+=this.q*(this.o?-1:1)}else this.ha=i;(a=this.p)||g(I);return a};
+p.splice=function(a){var b=this.p,c=this.o?1:-1;this.q==c&&(this.q=-1*c,this.depth+=this.q*(this.o?-1:1));this.o=!this.o;K.prototype.next.call(this);this.o=!this.o;for(var c=ba(arguments[0])?arguments[0]:arguments,d=c.length-1;0<=d;d--)b.parentNode&&b.parentNode.insertBefore(c[d],b.nextSibling);bb(b)};function tb(a,b,c,d){K.call(this,a,b,c,k,d)}x(tb,K);tb.prototype.next=function(){do tb.$.next.call(this);while(-1==this.q);return this.p};function ub(a,b){var c=D(a);return c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(a,k))?c[b]||c.getPropertyValue(b):""}function vb(a,b){return ub(a,b)||(a.currentStyle?a.currentStyle[b]:k)||a.style&&a.style[b]}
+function wb(a){for(var b=D(a),c=vb(a,"position"),d="fixed"==c||"absolute"==c,a=a.parentNode;a&&a!=b;a=a.parentNode)if(c=vb(a,"position"),d=d&&"static"==c&&a!=b.documentElement&&a!=b.body,!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||"fixed"==c||"absolute"==c||"relative"==c))return a;return k}
+function xb(a){var b=new B;if(1==a.nodeType)if(a.getBoundingClientRect)a=a.getBoundingClientRect(),b.x=a.left,b.y=a.top;else{var c=mb(Wa(a));var d,e=D(a),f=vb(a,"position"),j=e.getBoxObjectFor&&!a.getBoundingClientRect&&"absolute"==f&&(d=e.getBoxObjectFor(a))&&(0>d.screenX||0>d.screenY),f=new B(0,0),m=(e?9==e.nodeType?e:D(e):document).documentElement;if(a!=m)if(a.getBoundingClientRect)d=a.getBoundingClientRect(),a=mb(Wa(e)),f.x=d.left+a.x,f.y=d.top+a.y;else if(e.getBoxObjectFor&&!j)d=e.getBoxObjectFor(a),
+a=e.getBoxObjectFor(m),f.x=d.screenX-a.screenX,f.y=d.screenY-a.screenY;else{d=a;do f.x+=d.offsetLeft,f.y+=d.offsetTop,d!=a&&(f.x+=d.clientLeft||0,f.y+=d.clientTop||0),d=d.offsetParent;while(d&&d!=a);for(d=a;(d=wb(d))&&d!=e.body&&d!=m;)f.x-=d.scrollLeft,f.y-=d.scrollTop}b.x=f.x-c.x;b.y=f.y-c.y}else c=w(a.pa),d=a,a.targetTouches?d=a.targetTouches[0]:c&&a.pa().targetTouches&&(d=a.pa().targetTouches[0]),b.x=d.clientX,b.y=d.clientY;return b}
+function yb(a){var b=a.offsetWidth,c=a.offsetHeight;return!r(b)&&a.getBoundingClientRect?(a=a.getBoundingClientRect(),new Va(a.right-a.left,a.bottom-a.top)):new Va(b,c)};function M(a,b){return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}var zb={"class":"className",readonly:"readOnly"},Ab=["checked","disabled","draggable","hidden"];function Bb(a,b){var c=zb[b]||b,d=a[c];if(!r(d)&&0<=A(Ab,c))return l;if(c="value"==b)if(c=M(a,"OPTION")){var e;c=b.toLowerCase();if(a.hasAttribute)e=a.hasAttribute(c);else try{e=a.attributes[c].specified}catch(f){e=l}c=!e}c&&(d=[],kb(a,d,l),d=d.join(""));return d}
+var Cb="async,autofocus,autoplay,checked,compact,complete,controls,declare,defaultchecked,defaultselected,defer,disabled,draggable,ended,formnovalidate,hidden,indeterminate,iscontenteditable,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,paused,pubdate,readonly,required,reversed,scoped,seamless,seeking,selected,spellcheck,truespeed,willvalidate".split(","),Db="BUTTON,INPUT,OPTGROUP,OPTION,SELECT,TEXTAREA".split(",");
+function Eb(a){var b=a.tagName.toUpperCase();return!(0<=A(Db,b))?i:Bb(a,"disabled")?l:a.parentNode&&1==a.parentNode.nodeType&&"OPTGROUP"==b||"OPTION"==b?Eb(a.parentNode):i}var Fb="text,search,tel,url,email,password,number".split(",");function Gb(a){return M(a,"TEXTAREA")?i:M(a,"INPUT")?0<=A(Fb,a.type.toLowerCase()):Hb(a)?i:l}
+function Hb(a){function b(a){return"inherit"==a.contentEditable?(a=Ib(a))?b(a):l:"true"==a.contentEditable}return!r(a.contentEditable)?l:r(a.isContentEditable)?a.isContentEditable:b(a)}function Ib(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return M(a)?a:k}function Jb(a,b){b=ra(b);return ub(a,b)||Kb(a,b)}
+function Kb(a,b){var c=a.currentStyle||a.style,d=c[b];!r(d)&&w(c.getPropertyValue)&&(d=c.getPropertyValue(b));return"inherit"!=d?r(d)?d:k:(c=Ib(a))?Kb(c,b):k}function Lb(a){if(w(a.getBBox))try{var b=a.getBBox();if(b)return b}catch(c){}if("none"!=vb(a,"display"))a=yb(a);else{var b=a.style,d=b.display,e=b.visibility,f=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";a=yb(a);b.display=d;b.position=f;b.visibility=e}return a}
+function Mb(a,b){function c(a){if("none"==Jb(a,"display"))return l;a=Ib(a);return!a||c(a)}function d(a){var b=Lb(a);return 0<b.height&&0<b.width?i:Na(a.childNodes,function(a){return a.nodeType==C||M(a)&&d(a)})}function e(a){var b=Ib(a);if(b&&"hidden"==Jb(b,"overflow")){var c=Lb(b),d=xb(b),a=xb(a);return d.x+c.width<a.x||d.y+c.height<a.y?l:e(b)}return i}M(a)||g(Error("Argument to isShown must be of type Element"));if(M(a,"OPTION")||M(a,"OPTGROUP")){var f=lb(a,function(a){return M(a,"SELECT")});return!!f&&
+Mb(f,i)}if(M(a,"MAP")){if(!a.name)return l;f=D(a);f=f.evaluate?H.Ia('/descendant::*[@usemap = "#'+a.name+'"]',f):gb(f,function(b){var c;if(c=M(b))8==b.nodeType?b=k:(c="usemap","style"==c?(b=ha(b.style.cssText).toLowerCase(),b=";"==b.charAt(b.length-1)?b:b+";"):(b=b.getAttributeNode(c),b=!b?k:0<=A(Cb,c)?"true":b.specified?b.value:k)),c=b=="#"+a.name;return c});return!!f&&Mb(f,b)}return M(a,"AREA")?(f=lb(a,function(a){return M(a,"MAP")}),!!f&&Mb(f,b)):M(a,"INPUT")&&"hidden"==a.type.toLowerCase()||M(a,
+"NOSCRIPT")||"hidden"==Jb(a,"visibility")||!c(a)||!b&&0==Nb(a)||!d(a)||!e(a)?l:i}function Nb(a){var b=1,c=Jb(a,"opacity");c&&(b=Number(c));(a=Ib(a))&&(b*=Nb(a));return b};function N(){this.w=Ca.document.documentElement;this.ua=k;var a=D(this.w).activeElement;a&&Ob(this,a)}N.prototype.z=n("w");function Ob(a,b){a.w=b;a.ua=M(b,"OPTION")?lb(b,function(a){return M(a,"SELECT")}):k}
+function Pb(a,b,c,d,e,f){function j(a,c){var d={identifier:a,screenX:c.x,screenY:c.y,clientX:c.x,clientY:c.y,pageX:c.x,pageY:c.y};m.changedTouches.push(d);if(b==Qb||b==Rb)m.touches.push(d),m.targetTouches.push(d)}var m={touches:[],targetTouches:[],changedTouches:[],altKey:l,ctrlKey:l,shiftKey:l,metaKey:l,relatedTarget:k,scale:0,rotation:0};j(c,d);r(e)&&j(e,f);Sb(a.w,b,m)}rb&&rb&&(rb?qb(4):oa(nb,4));rb&&(rb?qb(4):oa(nb,4));function P(a,b,c){this.J=a;this.S=b;this.T=c}P.prototype.create=function(a){a=D(a).createEvent("HTMLEvents");a.initEvent(this.J,this.S,this.T);return a};P.prototype.toString=n("J");function Q(a,b,c){P.call(this,a,b,c)}x(Q,P);
+Q.prototype.create=function(a,b){var c=D(a),d=F(c),c=c.createEvent("MouseEvents"),e=1;this==Tb&&(e=b.wheelDelta/-40);this==Ub&&(e=b.wheelDelta);c.initMouseEvent(this.J,this.S,this.T,d,e,0,0,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};function Vb(a,b,c){P.call(this,a,b,c)}x(Vb,P);
+Vb.prototype.create=function(a,b){var c=D(a),d=F(c),e=b.charCode?0:b.keyCode,c=c.createEvent("KeyboardEvent");c.initKeyEvent(this.J,this.S,this.T,d,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,e,b.charCode);this.J==Wb&&b.preventDefault&&c.preventDefault();return c};function Xb(a,b,c){P.call(this,a,b,c)}x(Xb,P);
+Xb.prototype.create=function(a,b){function c(b){var c=Ma(b,function(b){return{identifier:b.identifier,screenX:b.screenX,screenY:b.screenY,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,target:a}});c.item=function(a){return c[a]};return c}var d=D(a),e=F(d),f=c(b.changedTouches),j=b.touches==b.changedTouches?f:c(b.touches),m=b.targetTouches==b.changedTouches?f:c(b.targetTouches),d=d.createEvent("MouseEvents");d.initMouseEvent(this.J,this.S,this.T,e,1,0,0,b.clientX,b.clientY,b.ctrlKey,
+b.altKey,b.shiftKey,b.metaKey,0,b.relatedTarget);d.touches=j;d.targetTouches=m;d.changedTouches=f;d.scale=b.scale;d.rotation=b.rotation;return d};
+var Yb=new P("change",i,l),Zb=new Q("click",i,i),$b=new Q("contextmenu",i,i),ac=new Q("dblclick",i,i),bc=new Q("mousedown",i,i),cc=new Q("mousemove",i,l),dc=new Q("mouseout",i,i),ec=new Q("mouseover",i,i),fc=new Q("mouseup",i,i),Tb=new Q("DOMMouseScroll",i,i),Ub=new Q("MozMousePixelScroll",i,i),Wb=new Vb("keypress",i,i),Rb=new Xb("touchmove",i,i),Qb=new Xb("touchstart",i,i);function Sb(a,b,c){b=b.create(a,c);"isTrusted"in b||(b.La=l);a.dispatchEvent(b)};function gc(a){if("function"==typeof a.L)return a.L();if(t(a))return a.split("");if(ba(a)){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}return Ea(a)};function hc(a,b){this.n={};this.ta={};var c=arguments.length;if(1<c){c%2&&g(Error("Uneven number of arguments"));for(var d=0;d<c;d+=2)this.set(arguments[d],arguments[d+1])}else a&&this.aa(a)}p=hc.prototype;p.ia=0;p.L=function(){var a=[],b;for(b in this.n)":"==b.charAt(0)&&a.push(this.n[b]);return a};function ic(a){var b=[],c;for(c in a.n)if(":"==c.charAt(0)){var d=c.substring(1);b.push(a.ta[c]?Number(d):d)}return b}
+p.set=function(a,b){var c=":"+a;c in this.n||(this.ia++,"number"==typeof a&&(this.ta[c]=i));this.n[c]=b};p.aa=function(a){var b;if(a instanceof hc)b=ic(a),a=a.L();else{b=[];var c=0,d;for(d in a)b[c++]=d;a=Ea(a)}for(c=0;c<b.length;c++)this.set(b[c],a[c])};p.r=function(a){var b=0,c=ic(this),d=this.n,e=this.ia,f=this,j=new J;j.next=function(){for(;;){e!=f.ia&&g(Error("The map has changed since the iterator was created"));b>=c.length&&g(I);var j=c[b++];return a?j:d[":"+j]}};return j};function jc(a){this.n=new hc;a&&this.aa(a)}function kc(a){var b=typeof a;return"object"==b&&a||"function"==b?"o"+(a[da]||(a[da]=++ea)):b.substr(0,1)+a}p=jc.prototype;p.add=function(a){this.n.set(kc(a),a)};p.aa=function(a){for(var a=gc(a),b=a.length,c=0;c<b;c++)this.add(a[c])};p.contains=function(a){return":"+kc(a)in this.n.n};p.L=function(){return this.n.L()};p.r=function(){return this.n.r(l)};function lc(){N.call(this);Gb(this.z())&&Bb(this.z(),"readOnly");this.Ha=new jc}x(lc,N);var mc={};function R(a,b,c){ca(a)&&(a=a.c);a=new nc(a);if(b&&(!(b in mc)||c))mc[b]={key:a,shift:l},c&&(mc[c]={key:a,shift:i})}function nc(a){this.code=a}R(8);R(9);R(13);R(16);R(17);R(18);R(19);R(20);R(27);R(32," ");R(33);R(34);R(35);R(36);R(37);R(38);R(39);R(40);R(44);R(45);R(46);R(48,"0",")");R(49,"1","!");R(50,"2","@");R(51,"3","#");R(52,"4","$");R(53,"5","%");R(54,"6","^");R(55,"7","&");R(56,"8","*");
+R(57,"9","(");R(65,"a","A");R(66,"b","B");R(67,"c","C");R(68,"d","D");R(69,"e","E");R(70,"f","F");R(71,"g","G");R(72,"h","H");R(73,"i","I");R(74,"j","J");R(75,"k","K");R(76,"l","L");R(77,"m","M");R(78,"n","N");R(79,"o","O");R(80,"p","P");R(81,"q","Q");R(82,"r","R");R(83,"s","S");R(84,"t","T");R(85,"u","U");R(86,"v","V");R(87,"w","W");R(88,"x","X");R(89,"y","Y");R(90,"z","Z");R(ta?{c:91,e:91,opera:219}:sa?{c:224,e:91,opera:17}:{c:0,e:91,opera:k});
+R(ta?{c:92,e:92,opera:220}:sa?{c:224,e:93,opera:17}:{c:0,e:92,opera:k});R(ta?{c:93,e:93,opera:0}:sa?{c:0,e:0,opera:16}:{c:93,e:k,opera:0});R({c:96,e:96,opera:48},"0");R({c:97,e:97,opera:49},"1");R({c:98,e:98,opera:50},"2");R({c:99,e:99,opera:51},"3");R({c:100,e:100,opera:52},"4");R({c:101,e:101,opera:53},"5");R({c:102,e:102,opera:54},"6");R({c:103,e:103,opera:55},"7");R({c:104,e:104,opera:56},"8");R({c:105,e:105,opera:57},"9");R({c:106,e:106,opera:xa?56:42},"*");R({c:107,e:107,opera:xa?61:43},"+");
+R({c:109,e:109,opera:xa?109:45},"-");R({c:110,e:110,opera:xa?190:78},".");R({c:111,e:111,opera:xa?191:47},"/");R(144);R(112);R(113);R(114);R(115);R(116);R(117);R(118);R(119);R(120);R(121);R(122);R(123);R({c:107,e:187,opera:61},"=","+");R({c:109,e:189,opera:109},"-","_");R(188,",","<");R(190,".",">");R(191,"/","?");R(192,"`","~");R(219,"[","{");R(220,"\\","|");R(221,"]","}");R({c:59,e:186,opera:59},";",":");R(222,"'",'"');lc.prototype.X=function(a){return this.Ha.contains(a)};function oc(a){return pc(a||arguments.callee.caller,[])}
+function pc(a,b){var c=[];if(0<=A(b,a))c.push("[...circular reference...]");else if(a&&50>b.length){c.push(qc(a)+"(");for(var d=a.arguments,e=0;e<d.length;e++){0<e&&c.push(", ");var f;f=d[e];switch(typeof f){case "object":f=f?"object":"null";break;case "string":break;case "number":f=""+f;break;case "boolean":f=f?"true":"false";break;case "function":f=(f=qc(f))?f:"[fn]";break;default:f=typeof f}40<f.length&&(f=f.substr(0,40)+"...");c.push(f)}b.push(a);c.push(")\n");try{c.push(pc(a.caller,b))}catch(j){c.push("[exception trying to get caller]\n")}}else a?
+c.push("[...long stack...]"):c.push("[end]");return c.join("")}function qc(a){if(rc[a])return rc[a];a=""+a;if(!rc[a]){var b=/function ([^\(]+)/.exec(a);rc[a]=b?b[1]:"[Anonymous]"}return rc[a]}var rc={};function sc(a,b,c,d,e){this.reset(a,b,c,d,e)}sc.prototype.oa=k;sc.prototype.na=k;var tc=0;sc.prototype.reset=function(a,b,c,d,e){"number"==typeof e||tc++;d||fa();this.N=a;this.Fa=b;delete this.oa;delete this.na};sc.prototype.va=function(a){this.N=a};function S(a){this.Ga=a}S.prototype.Y=k;S.prototype.N=k;S.prototype.ba=k;S.prototype.ra=k;function uc(a,b){this.name=a;this.value=b}uc.prototype.toString=n("name");var vc=new uc("WARNING",900),wc=new uc("CONFIG",700);S.prototype.getParent=n("Y");S.prototype.va=function(a){this.N=a};function xc(a){if(a.N)return a.N;if(a.Y)return xc(a.Y);Ja("Root logger has no level set.");return k}
+S.prototype.log=function(a,b,c){if(a.value>=xc(this).value){a=this.Ca(a,b,c);b="log:"+a.Fa;q.console&&(q.console.timeStamp?q.console.timeStamp(b):q.console.markTimeline&&q.console.markTimeline(b));q.msWriteProfilerMark&&q.msWriteProfilerMark(b);for(b=this;b;){var c=b,d=a;if(c.ra)for(var e=0,f=h;f=c.ra[e];e++)f(d);b=b.getParent()}}};
+S.prototype.Ca=function(a,b,c){var d=new sc(a,""+b,this.Ga);if(c){d.oa=c;var e;var f=arguments.callee.caller;try{var j;var m;c:{for(var s=["window","location","href"],O=q,E;E=s.shift();)if(O[E]!=k)O=O[E];else{m=k;break c}m=O}if(t(c))j={message:c,name:"Unknown error",lineNumber:"Not available",fileName:m,stack:"Not available"};else{var u,v,s=l;try{u=c.lineNumber||c.Ma||"Not available"}catch(md){u="Not available",s=i}try{v=c.fileName||c.filename||c.sourceURL||m}catch(nd){v="Not available",s=i}j=s||
+!c.lineNumber||!c.fileName||!c.stack?{message:c.message,name:c.name,lineNumber:u,fileName:v,stack:c.stack||"Not available"}:c}e="Message: "+ia(j.message)+'\nUrl: <a href="view-source:'+j.fileName+'" target="_new">'+j.fileName+"</a>\nLine: "+j.lineNumber+"\n\nBrowser stack:\n"+ia(j.stack+"-> ")+"[end]\n\nJS stack traversal:\n"+ia(oc(f)+"-> ")}catch(kd){e="Exception trying to expose exception! You win, we lose. "+kd}d.na=e}return d};var yc={},zc=k;
+function Ac(a){zc||(zc=new S(""),yc[""]=zc,zc.va(wc));var b;if(!(b=yc[a])){b=new S(a);var c=a.lastIndexOf("."),d=a.substr(c+1),c=Ac(a.substr(0,c));c.ba||(c.ba={});c.ba[d]=b;b.Y=c;yc[a]=b}return b};function Bc(){}x(Bc,function(){});Ac("goog.dom.SavedRange");x(function(a){this.Ja="goog_"+pa++;this.Aa="goog_"+pa++;this.la=Wa(a.ea());a.R(this.la.da("SPAN",{id:this.Ja}),this.la.da("SPAN",{id:this.Aa}))},Bc);function T(){}function Cc(a){if(a.getSelection)return a.getSelection();var a=a.document,b=a.selection;if(b){try{var c=b.createRange();if(c.parentElement){if(c.parentElement().document!=a)return k}else if(!c.length||c.item(0).document!=a)return k}catch(d){return k}return b}return k}function Dc(a){for(var b=[],c=0,d=a.D();c<d;c++)b.push(a.A(c));return b}T.prototype.F=o(l);T.prototype.ea=function(){return D(this.b())};T.prototype.qa=function(){return F(this.ea())};
+T.prototype.containsNode=function(a,b){return this.u(Ec(Fc(a),h),b)};function U(a,b){K.call(this,a,b,i)}x(U,K);function V(){}x(V,T);V.prototype.u=function(a,b){var c=Dc(this),d=Dc(a);return(b?Na:Oa)(d,function(a){return Na(c,function(c){return c.u(a,b)})})};V.prototype.insertNode=function(a,b){if(b){var c=this.b();c.parentNode&&c.parentNode.insertBefore(a,c)}else c=this.g(),c.parentNode&&c.parentNode.insertBefore(a,c.nextSibling);return a};V.prototype.R=function(a,b){this.insertNode(a,i);this.insertNode(b,l)};function Gc(a,b,c,d,e){var f;if(a&&(this.f=a,this.i=b,this.d=c,this.h=d,1==a.nodeType&&"BR"!=a.tagName&&(a=a.childNodes,(b=a[b])?(this.f=b,this.i=0):(a.length&&(this.f=z(a)),f=i)),1==c.nodeType))(this.d=c.childNodes[d])?this.h=0:this.d=c;U.call(this,e?this.d:this.f,e);if(f)try{this.next()}catch(j){j!=I&&g(j)}}x(Gc,U);p=Gc.prototype;p.f=k;p.d=k;p.i=0;p.h=0;p.b=n("f");p.g=n("d");p.M=function(){return this.ha&&this.p==this.d&&(!this.h||1!=this.q)};p.next=function(){this.M()&&g(I);return Gc.$.next.call(this)};"ScriptEngine"in q&&"JScript"==q.ScriptEngine()&&(q.ScriptEngineMajorVersion(),q.ScriptEngineMinorVersion(),q.ScriptEngineBuildVersion());function Hc(){}Hc.prototype.u=function(a,b){var c=b&&!a.isCollapsed(),d=a.a;try{return c?0<=this.l(d,0,1)&&0>=this.l(d,1,0):0<=this.l(d,0,0)&&0>=this.l(d,1,1)}catch(e){g(e)}};Hc.prototype.containsNode=function(a,b){return this.u(Fc(a),b)};Hc.prototype.r=function(){return new Gc(this.b(),this.j(),this.g(),this.k())};function Ic(a){this.a=a}x(Ic,Hc);p=Ic.prototype;p.C=function(){return this.a.commonAncestorContainer};p.b=function(){return this.a.startContainer};p.j=function(){return this.a.startOffset};p.g=function(){return this.a.endContainer};p.k=function(){return this.a.endOffset};p.l=function(a,b,c){return this.a.compareBoundaryPoints(1==c?1==b?q.Range.START_TO_START:q.Range.START_TO_END:1==b?q.Range.END_TO_START:q.Range.END_TO_END,a)};p.isCollapsed=function(){return this.a.collapsed};
+p.select=function(a){this.Z(F(D(this.b())).getSelection(),a)};p.Z=function(a){a.removeAllRanges();a.addRange(this.a)};p.insertNode=function(a,b){var c=this.a.cloneRange();c.collapse(b);c.insertNode(a);c.detach();return a};
+p.R=function(a,b){var c=F(D(this.b()));if(c=(c=Cc(c||window))&&Jc(c))var d=c.b(),e=c.g(),f=c.j(),j=c.k();var m=this.a.cloneRange(),s=this.a.cloneRange();m.collapse(l);s.collapse(i);m.insertNode(b);s.insertNode(a);m.detach();s.detach();if(c){if(d.nodeType==C)for(;f>d.length;){f-=d.length;do d=d.nextSibling;while(d==a||d==b)}if(e.nodeType==C)for(;j>e.length;){j-=e.length;do e=e.nextSibling;while(e==a||e==b)}c=new Kc;c.G=Lc(d,f,e,j);"BR"==d.tagName&&(m=d.parentNode,f=A(m.childNodes,d),d=m);"BR"==e.tagName&&
+(m=e.parentNode,j=A(m.childNodes,e),e=m);c.G?(c.f=e,c.i=j,c.d=d,c.h=f):(c.f=d,c.i=f,c.d=e,c.h=j);c.select()}};p.collapse=function(a){this.a.collapse(a)};function W(a){this.a=a}x(W,Ic);function Fc(a){var b=D(a).createRange();if(a.nodeType==C)b.setStart(a,0),b.setEnd(a,a.length);else if(X(a)){for(var c,d=a;(c=d.firstChild)&&X(c);)d=c;b.setStart(d,0);for(d=a;(c=d.lastChild)&&X(c);)d=c;b.setEnd(d,1==d.nodeType?d.childNodes.length:d.length)}else c=a.parentNode,a=A(c.childNodes,a),b.setStart(c,a),b.setEnd(c,a+1);return new W(b)}
+W.prototype.Z=function(a,b){var c=b?this.g():this.b(),d=b?this.k():this.j(),e=b?this.b():this.g(),f=b?this.j():this.k();a.collapse(c,d);(c!=e||d!=f)&&a.extend(e,f)};function Mc(a){this.a=a}x(Mc,Hc);Ac("goog.dom.browserrange.IeRange");function Nc(a){var b=D(a).body.createTextRange();if(1==a.nodeType)b.moveToElementText(a),X(a)&&!a.childNodes.length&&b.collapse(l);else{for(var c=0,d=a;d=d.previousSibling;){var e=d.nodeType;if(e==C)c+=d.length;else if(1==e){b.moveToElementText(d);break}}d||b.moveToElementText(a.parentNode);b.collapse(!d);c&&b.move("character",c);b.moveEnd("character",a.length)}return b}p=Mc.prototype;p.O=k;p.f=k;p.d=k;p.i=-1;p.h=-1;
+p.s=function(){this.O=this.f=this.d=k;this.i=this.h=-1};
+p.C=function(){if(!this.O){var a=this.a.text,b=this.a.duplicate(),c=a.replace(/ +$/,"");(c=a.length-c.length)&&b.moveEnd("character",-c);c=b.parentElement();b=b.htmlText.replace(/(\r\n|\r|\n)+/g," ").length;if(this.isCollapsed()&&0<b)return this.O=c;for(;b>c.outerHTML.replace(/(\r\n|\r|\n)+/g," ").length;)c=c.parentNode;for(;1==c.childNodes.length&&c.innerText==(c.firstChild.nodeType==C?c.firstChild.nodeValue:c.firstChild.innerText)&&X(c.firstChild);)c=c.firstChild;0==a.length&&(c=Oc(this,c));this.O=
+c}return this.O};function Oc(a,b){for(var c=b.childNodes,d=0,e=c.length;d<e;d++){var f=c[d];if(X(f)){var j=Nc(f),m=j.htmlText!=f.outerHTML;if(a.isCollapsed()&&m?0<=a.l(j,1,1)&&0>=a.l(j,1,0):a.a.inRange(j))return Oc(a,f)}}return b}p.b=function(){this.f||(this.f=Pc(this,1),this.isCollapsed()&&(this.d=this.f));return this.f};p.j=function(){0>this.i&&(this.i=Qc(this,1),this.isCollapsed()&&(this.h=this.i));return this.i};
+p.g=function(){if(this.isCollapsed())return this.b();this.d||(this.d=Pc(this,0));return this.d};p.k=function(){if(this.isCollapsed())return this.j();0>this.h&&(this.h=Qc(this,0),this.isCollapsed()&&(this.i=this.h));return this.h};p.l=function(a,b,c){return this.a.compareEndPoints((1==b?"Start":"End")+"To"+(1==c?"Start":"End"),a)};
+function Pc(a,b,c){c=c||a.C();if(!c||!c.firstChild)return c;for(var d=1==b,e=0,f=c.childNodes.length;e<f;e++){var j=d?e:f-e-1,m=c.childNodes[j],s;try{s=Fc(m)}catch(O){continue}var E=s.a;if(a.isCollapsed())if(X(m)){if(s.u(a))return Pc(a,b,m)}else{if(0==a.l(E,1,1)){a.i=a.h=j;break}}else{if(a.u(s)){if(!X(m)){d?a.i=j:a.h=j+1;break}return Pc(a,b,m)}if(0>a.l(E,1,0)&&0<a.l(E,0,1))return Pc(a,b,m)}}return c}
+function Qc(a,b){var c=1==b,d=c?a.b():a.g();if(1==d.nodeType){for(var d=d.childNodes,e=d.length,f=c?1:-1,j=c?0:e-1;0<=j&&j<e;j+=f){var m=d[j];if(!X(m)&&0==a.a.compareEndPoints((1==b?"Start":"End")+"To"+(1==b?"Start":"End"),Fc(m).a))return c?j:j+1}return-1==j?0:j}e=a.a.duplicate();f=Nc(d);e.setEndPoint(c?"EndToEnd":"StartToStart",f);e=e.text.length;return c?d.length-e:e}p.isCollapsed=function(){return 0==this.a.compareEndPoints("StartToEnd",this.a)};p.select=function(){this.a.select()};
+function Rc(a,b,c){var d;d=d||Wa(a.parentElement());var e;1!=b.nodeType&&(e=i,b=d.da("DIV",k,b));a.collapse(c);d=d||Wa(a.parentElement());var f=c=b.id;c||(c=b.id="goog_"+pa++);a.pasteHTML(b.outerHTML);(b=d.z(c))&&(f||b.removeAttribute("id"));if(e){a=b.firstChild;e=b;if((d=e.parentNode)&&11!=d.nodeType)if(e.removeNode)e.removeNode(l);else{for(;b=e.firstChild;)d.insertBefore(b,e);bb(e)}b=a}return b}p.insertNode=function(a,b){var c=Rc(this.a.duplicate(),a,b);this.s();return c};
+p.R=function(a,b){var c=this.a.duplicate(),d=this.a.duplicate();Rc(c,a,i);Rc(d,b,l);this.s()};p.collapse=function(a){this.a.collapse(a);a?(this.d=this.f,this.h=this.i):(this.f=this.d,this.i=this.h)};function Sc(a){this.a=a}x(Sc,Ic);Sc.prototype.Z=function(a){a.collapse(this.b(),this.j());(this.g()!=this.b()||this.k()!=this.j())&&a.extend(this.g(),this.k());0==a.rangeCount&&a.addRange(this.a)};function Tc(a){this.a=a}x(Tc,Ic);Tc.prototype.l=function(a,b,c){return Ba["528"]||(Ba["528"]=0<=oa(ya,"528"))?Tc.$.l.call(this,a,b,c):this.a.compareBoundaryPoints(1==c?1==b?q.Range.START_TO_START:q.Range.END_TO_START:1==b?q.Range.START_TO_END:q.Range.END_TO_END,a)};Tc.prototype.Z=function(a,b){a.removeAllRanges();b?a.setBaseAndExtent(this.g(),this.k(),this.b(),this.j()):a.setBaseAndExtent(this.b(),this.j(),this.g(),this.k())};function X(a){var b;a:if(1!=a.nodeType)b=l;else{switch(a.tagName){case "APPLET":case "AREA":case "BASE":case "BR":case "COL":case "FRAME":case "HR":case "IMG":case "INPUT":case "IFRAME":case "ISINDEX":case "LINK":case "NOFRAMES":case "NOSCRIPT":case "META":case "OBJECT":case "PARAM":case "SCRIPT":case "STYLE":b=l;break a}b=i}return b||a.nodeType==C};function Kc(){}x(Kc,T);function Ec(a,b){var c=new Kc;c.K=a;c.G=!!b;return c}p=Kc.prototype;p.K=k;p.f=k;p.i=k;p.d=k;p.h=k;p.G=l;p.fa=o("text");p.W=function(){return Y(this).a};p.s=function(){this.f=this.i=this.d=this.h=k};p.D=o(1);p.A=function(){return this};function Y(a){var b;if(!(b=a.K)){b=a.b();var c=a.j(),d=a.g(),e=a.k(),f=D(b).createRange();f.setStart(b,c);f.setEnd(d,e);b=a.K=new W(f)}return b}p.C=function(){return Y(this).C()};p.b=function(){return this.f||(this.f=Y(this).b())};
+p.j=function(){return this.i!=k?this.i:this.i=Y(this).j()};p.g=function(){return this.d||(this.d=Y(this).g())};p.k=function(){return this.h!=k?this.h:this.h=Y(this).k()};p.F=n("G");p.u=function(a,b){var c=a.fa();return"text"==c?Y(this).u(Y(a),b):"control"==c?(c=Uc(a),(b?Na:Oa)(c,function(a){return this.containsNode(a,b)},this)):l};p.isCollapsed=function(){return Y(this).isCollapsed()};p.r=function(){return new Gc(this.b(),this.j(),this.g(),this.k())};p.select=function(){Y(this).select(this.G)};
+p.insertNode=function(a,b){var c=Y(this).insertNode(a,b);this.s();return c};p.R=function(a,b){Y(this).R(a,b);this.s()};p.ga=function(){return new Vc(this)};p.collapse=function(a){a=this.F()?!a:a;this.K&&this.K.collapse(a);a?(this.d=this.f,this.h=this.i):(this.f=this.d,this.i=this.h);this.G=l};function Vc(a){a.F()?a.g():a.b();a.F()?a.k():a.j();a.F()?a.b():a.g();a.F()?a.j():a.k()}x(Vc,Bc);function Wc(){}x(Wc,V);p=Wc.prototype;p.a=k;p.m=k;p.Q=k;p.s=function(){this.Q=this.m=k};p.fa=o("control");p.W=function(){return this.a||document.body.createControlRange()};p.D=function(){return this.a?this.a.length:0};p.A=function(a){a=this.a.item(a);return Ec(Fc(a),h)};p.C=function(){return fb.apply(k,Uc(this))};p.b=function(){return Xc(this)[0]};p.j=o(0);p.g=function(){var a=Xc(this),b=z(a);return Pa(a,function(a){return G(a,b)})};p.k=function(){return this.g().childNodes.length};
+function Uc(a){if(!a.m&&(a.m=[],a.a))for(var b=0;b<a.a.length;b++)a.m.push(a.a.item(b));return a.m}function Xc(a){a.Q||(a.Q=Uc(a).concat(),a.Q.sort(function(a,c){return a.sourceIndex-c.sourceIndex}));return a.Q}p.isCollapsed=function(){return!this.a||!this.a.length};p.r=function(){return new Yc(this)};p.select=function(){this.a&&this.a.select()};p.ga=function(){return new Zc(this)};p.collapse=function(){this.a=k;this.s()};function Zc(a){this.m=Uc(a)}x(Zc,Bc);
+function Yc(a){a&&(this.m=Xc(a),this.f=this.m.shift(),this.d=z(this.m)||this.f);U.call(this,this.f,l)}x(Yc,U);p=Yc.prototype;p.f=k;p.d=k;p.m=k;p.b=n("f");p.g=n("d");p.M=function(){return!this.depth&&!this.m.length};p.next=function(){this.M()&&g(I);if(!this.depth){var a=this.m.shift();L(this,a,1,1);return a}return Yc.$.next.call(this)};function $c(){this.t=[];this.P=[];this.U=this.I=k}x($c,V);p=$c.prototype;p.Ea=Ac("goog.dom.MultiRange");p.s=function(){this.P=[];this.U=this.I=k};p.fa=o("mutli");p.W=function(){1<this.t.length&&this.Ea.log(vc,"getBrowserRangeObject called on MultiRange with more than 1 range",h);return this.t[0]};p.D=function(){return this.t.length};p.A=function(a){this.P[a]||(this.P[a]=Ec(new W(this.t[a]),h));return this.P[a]};
+p.C=function(){if(!this.U){for(var a=[],b=0,c=this.D();b<c;b++)a.push(this.A(b).C());this.U=fb.apply(k,a)}return this.U};function ad(a){a.I||(a.I=Dc(a),a.I.sort(function(a,c){var d=a.b(),e=a.j(),f=c.b(),j=c.j();return d==f&&e==j?0:Lc(d,e,f,j)?1:-1}));return a.I}p.b=function(){return ad(this)[0].b()};p.j=function(){return ad(this)[0].j()};p.g=function(){return z(ad(this)).g()};p.k=function(){return z(ad(this)).k()};p.isCollapsed=function(){return 0==this.t.length||1==this.t.length&&this.A(0).isCollapsed()};
+p.r=function(){return new bd(this)};p.select=function(){var a=Cc(this.qa());a.removeAllRanges();for(var b=0,c=this.D();b<c;b++)a.addRange(this.A(b).W())};p.ga=function(){return new cd(this)};p.collapse=function(a){if(!this.isCollapsed()){var b=a?this.A(0):this.A(this.D()-1);this.s();b.collapse(a);this.P=[b];this.I=[b];this.t=[b.W()]}};function cd(a){Ma(Dc(a),function(a){return a.ga()})}x(cd,Bc);function bd(a){a&&(this.H=Ma(ad(a),function(a){return sb(a)}));U.call(this,a?this.b():k,l)}x(bd,U);p=bd.prototype;
+p.H=k;p.V=0;p.b=function(){return this.H[0].b()};p.g=function(){return z(this.H).g()};p.M=function(){return this.H[this.V].M()};p.next=function(){try{var a=this.H[this.V],b=a.next();L(this,a.p,a.q,a.depth);return b}catch(c){return(c!==I||this.H.length-1==this.V)&&g(c),this.V++,this.next()}};function Jc(a){var b,c=l;if(a.createRange)try{b=a.createRange()}catch(d){return k}else if(a.rangeCount){if(1<a.rangeCount){b=new $c;for(var c=0,e=a.rangeCount;c<e;c++)b.t.push(a.getRangeAt(c));return b}b=a.getRangeAt(0);c=Lc(a.anchorNode,a.anchorOffset,a.focusNode,a.focusOffset)}else return k;b&&b.addElement?(a=new Wc,a.a=b):a=Ec(new W(b),c);return a}
+function Lc(a,b,c,d){if(a==c)return d<b;var e;if(1==a.nodeType&&b)if(e=a.childNodes[b])a=e,b=0;else if(G(a,c))return i;if(1==c.nodeType&&d)if(e=c.childNodes[d])c=e,d=0;else if(G(c,a))return l;return 0<(cb(a,c)||b-d)};function dd(){N.call(this);this.ja=k;this.B=new B(0,0);this.sa=l}x(dd,N);var Z={};Z[Zb]=[0,1,2,k];Z[$b]=[k,k,2,k];Z[fc]=[0,1,2,k];Z[dc]=[0,0,0,0];Z[cc]=[0,0,0,0];Z[ac]=Z[Zb];Z[bc]=Z[fc];Z[ec]=Z[dc];dd.prototype.move=function(a,b){var c=xb(a);this.B.x=b.x+c.x;this.B.y=b.y+c.y;a!=this.z()&&(c=this.z()===Ca.document.documentElement||this.z()===Ca.document.body,c=!this.sa&&c?k:this.z(),ed(this,dc,a),Ob(this,a),ed(this,ec,c));ed(this,cc)};
+function ed(a,b,c){a.sa=i;var d=a.B,e;b in Z?(e=Z[b][a.ja===k?3:a.ja],e===k&&g(new y(13,"Event does not permit the specified mouse button."))):e=0;Mb(a.w,i)&&Eb(a.w)&&(c&&!(ec==b||dc==b)&&g(new y(12,"Event type does not allow related target: "+b)),c={clientX:d.x,clientY:d.y,button:e,altKey:l,ctrlKey:l,shiftKey:l,metaKey:l,wheelDelta:0,relatedTarget:c||k},(a=a.w)&&Sb(a,b,c))};function fd(){N.call(this);this.B=new B(0,0);this.ca=new B(0,0)}x(fd,N);fd.prototype.xa=0;fd.prototype.wa=0;fd.prototype.move=function(a,b,c){this.X()||Ob(this,a);a=xb(a);this.B.x=b.x+a.x;this.B.y=b.y+a.y;r(c)&&(this.ca.x=c.x+a.x,this.ca.y=c.y+a.y);if(this.X()){b=Rb;this.X()||g(new y(13,"Should never fire event when touchscreen is not pressed."));var d,e;this.wa&&(d=this.wa,e=this.ca);Pb(this,b,this.xa,this.B,d,e)}};fd.prototype.X=function(){return!!this.xa};function gd(a,b){this.x=a;this.y=b}x(gd,B);gd.prototype.scale=function(a){this.x*=a;this.y*=a;return this};gd.prototype.add=function(a){this.x+=a.x;this.y+=a.y;return this};function hd(){N.call(this)}x(hd,N);(function(a){a.Ba=function(){return a.Da||(a.Da=new a)}})(hd);function id(a){(!Mb(a,i)||!Eb(a))&&g(new y(12,"Element is not currently interactable and may not be manipulated"));(!Gb(a)||Bb(a,"readOnly"))&&g(new y(12,"Element must be user-editable in order to clear it."));var b=hd.Ba();Ob(b,a);var b=b.ua||b.w,c=D(b).activeElement;if(b!=c){if(c&&w(c.blur))try{c.blur()}catch(d){g(d)}w(b.focus)&&b.focus()}a.value&&(a.value="",Sb(a,Yb));Hb(a)&&(a.innerHTML=" ")}var jd=["_"],$=q;!(jd[0]in $)&&$.execScript&&$.execScript("var "+jd[0]);
+for(var ld;jd.length&&(ld=jd.shift());)!jd.length&&r(id)?$[ld]=id:$=$[ld]?$[ld]:$[ld]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
+//click
+var click = function(){return function(){function g(a){throw a;}var h=void 0,i=!0,k=null,l=!1;function n(a){return function(){return this[a]}}function o(a){return function(){return a}}var p,q=this;
+function aa(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
+else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function r(a){return a!==h}function ba(a){var b=aa(a);return"array"==b||"object"==b&&"number"==typeof a.length}function t(a){return"string"==typeof a}function u(a){return"function"==aa(a)}function ca(a){a=aa(a);return"object"==a||"array"==a||"function"==a}var da="closure_uid_"+Math.floor(2147483648*Math.random()).toString(36),ea=0,fa=Date.now||function(){return+new Date};
+function x(a,b){function c(){}c.prototype=b.prototype;a.ca=b.prototype;a.prototype=new c};function ga(a,b){for(var c=1;c<arguments.length;c++)var d=(""+arguments[c]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,d);return a}function ha(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}function ia(a){if(!ja.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(ka,"&amp;"));-1!=a.indexOf("<")&&(a=a.replace(la,"&lt;"));-1!=a.indexOf(">")&&(a=a.replace(ma,"&gt;"));-1!=a.indexOf('"')&&(a=a.replace(na,"&quot;"));return a}var ka=/&/g,la=/</g,ma=/>/g,na=/\"/g,ja=/[&<>\"]/;
+function oa(a,b){for(var c=0,d=ha(""+a).split("."),e=ha(""+b).split("."),f=Math.max(d.length,e.length),j=0;0==c&&j<f;j++){var m=d[j]||"",s=e[j]||"",F=RegExp("(\\d*)(\\D*)","g"),B=RegExp("(\\d*)(\\D*)","g");do{var v=F.exec(m)||["","",""],w=B.exec(s)||["","",""];if(0==v[0].length&&0==w[0].length)break;c=((0==v[1].length?0:parseInt(v[1],10))<(0==w[1].length?0:parseInt(w[1],10))?-1:(0==v[1].length?0:parseInt(v[1],10))>(0==w[1].length?0:parseInt(w[1],10))?1:0)||((0==v[2].length)<(0==w[2].length)?-1:(0==
+v[2].length)>(0==w[2].length)?1:0)||(v[2]<w[2]?-1:v[2]>w[2]?1:0)}while(0==c)}return c}var pa=2147483648*Math.random()|0,qa={};function ra(a){return qa[a]||(qa[a]=(""+a).replace(/\-([a-z])/g,function(a,c){return c.toUpperCase()}))};var sa,ta;function ua(){return q.navigator?q.navigator.userAgent:k}var va,wa=q.navigator;va=wa&&wa.platform||"";sa=-1!=va.indexOf("Mac");ta=-1!=va.indexOf("Win");var xa=-1!=va.indexOf("Linux"),ya,za="",Aa=/rv\:([^\);]+)(\)|;)/.exec(ua());ya=za=Aa?Aa[1]:"";var Ba={};var Ca=window;function Da(a,b){for(var c in a)b.call(h,a[c],c,a)}function Ea(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b};function y(a,b){this.code=a;this.message=b||"";this.name=Fa[a]||Fa[13];var c=Error(this.message);c.name=this.name;this.stack=c.stack||""}x(y,Error);
+var Fa={7:"NoSuchElementError",8:"NoSuchFrameError",9:"UnknownCommandError",10:"StaleElementReferenceError",11:"ElementNotVisibleError",12:"InvalidElementStateError",13:"UnknownError",15:"ElementNotSelectableError",19:"XPathLookupError",23:"NoSuchWindowError",24:"InvalidCookieDomainError",25:"UnableToSetCookieError",26:"ModalDialogOpenedError",27:"NoModalDialogOpenError",28:"ScriptTimeoutError",32:"InvalidSelectorError",33:"SqlDatabaseError",34:"MoveTargetOutOfBoundsError"};
+y.prototype.toString=function(){return"["+this.name+"] "+this.message};function Ga(a){this.stack=Error().stack||"";a&&(this.message=""+a)}x(Ga,Error);Ga.prototype.name="CustomError";function Ha(a,b){b.unshift(a);Ga.call(this,ga.apply(k,b));b.shift()}x(Ha,Ga);Ha.prototype.name="AssertionError";function Ia(a,b,c){if(!a){var d=Array.prototype.slice.call(arguments,2),e="Assertion failed";if(b)var e=e+(": "+b),f=d;g(new Ha(""+e,f||[]))}}function Ja(a,b){g(new Ha("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1)))};function z(a){return a[a.length-1]}var Ka=Array.prototype;function A(a,b){if(t(a))return!t(b)||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}function La(a,b){for(var c=a.length,d=t(a)?a.split(""):a,e=0;e<c;e++)e in d&&b.call(h,d[e],e,a)}function Ma(a,b){for(var c=a.length,d=Array(c),e=t(a)?a.split(""):a,f=0;f<c;f++)f in e&&(d[f]=b.call(h,e[f],f,a));return d}
+function Na(a,b,c){for(var d=a.length,e=t(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&b.call(c,e[f],f,a))return i;return l}function Oa(a,b,c){for(var d=a.length,e=t(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&!b.call(c,e[f],f,a))return l;return i}function Pa(a,b){var c;a:{c=a.length;for(var d=t(a)?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(h,d[e],e,a)){c=e;break a}c=-1}return 0>c?k:t(a)?a.charAt(c):a[c]}function Qa(a){return Ka.concat.apply(Ka,arguments)}
+function Ra(a){if("array"==aa(a))return Qa(a);for(var b=[],c=0,d=a.length;c<d;c++)b[c]=a[c];return b}function Sa(a,b,c){Ia(a.length!=k);return 2>=arguments.length?Ka.slice.call(a,b):Ka.slice.call(a,b,c)};var Ta;Ba["1.9.1"]||(Ba["1.9.1"]=0<=oa(ya,"1.9.1"));function Ua(a,b){var c;c=(c=a.className)&&"function"==typeof c.split?c.split(/\s+/):[];var d=Sa(arguments,1),e;e=c;for(var f=0,j=0;j<d.length;j++)0<=A(e,d[j])||(e.push(d[j]),f++);e=f==d.length;a.className=c.join(" ");return e};function C(a,b){this.x=r(a)?a:0;this.y=r(b)?b:0}C.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function Va(a,b){this.width=a;this.height=b}Va.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};Va.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};Va.prototype.scale=function(a){this.width*=a;this.height*=a;return this};var D=3;function Wa(a){return a?new Xa(E(a)):Ta||(Ta=new Xa)}function Ya(a,b){Da(b,function(b,d){"style"==d?a.style.cssText=b:"class"==d?a.className=b:"for"==d?a.htmlFor=b:d in Za?a.setAttribute(Za[d],b):0==d.lastIndexOf("aria-",0)?a.setAttribute(d,b):a[d]=b})}var Za={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",rowspan:"rowSpan",valign:"vAlign",height:"height",width:"width",usemap:"useMap",frameborder:"frameBorder",maxlength:"maxLength",type:"type"};
+function $a(a){var b="CSS1Compat"==a.compatMode?a.documentElement:a.body,a=a.parentWindow||a.defaultView;return new C(a.pageXOffset||b.scrollLeft,a.pageYOffset||b.scrollTop)}function G(a){return a?a.parentWindow||a.defaultView:window}function ab(a,b,c){function d(c){c&&b.appendChild(t(c)?a.createTextNode(c):c)}for(var e=2;e<c.length;e++){var f=c[e];ba(f)&&!(ca(f)&&0<f.nodeType)?La(bb(f)?Ra(f):f,d):d(f)}}function cb(a){return a&&a.parentNode?a.parentNode.removeChild(a):k}
+function H(a,b){if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}
+function db(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if("sourceIndex"in a||a.parentNode&&"sourceIndex"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==f?eb(a,b):!c&&H(e,b)?-1*fb(a,b):!d&&H(f,a)?fb(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=E(a);c=d.createRange();c.selectNode(a);c.collapse(i);d=d.createRange();d.selectNode(b);d.collapse(i);
+return c.compareBoundaryPoints(q.Range.START_TO_END,d)}function fb(a,b){var c=a.parentNode;if(c==b)return-1;for(var d=b;d.parentNode!=c;)d=d.parentNode;return eb(d,a)}function eb(a,b){for(var c=b;c=c.previousSibling;)if(c==a)return-1;return 1}
+function gb(a){var b,c=arguments.length;if(c){if(1==c)return arguments[0]}else return k;var d=[],e=Infinity;for(b=0;b<c;b++){for(var f=[],j=arguments[b];j;)f.unshift(j),j=j.parentNode;d.push(f);e=Math.min(e,f.length)}f=k;for(b=0;b<e;b++){for(var j=d[0][b],m=1;m<c;m++)if(j!=d[m][b])return f;f=j}return f}function E(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function hb(a,b){var c=[];return ib(a,b,c,i)?c[0]:h}
+function ib(a,b,c,d){if(a!=k)for(a=a.firstChild;a;){if(b(a)&&(c.push(a),d)||ib(a,b,c,d))return i;a=a.nextSibling}return l}var jb={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},kb={IMG:" ",BR:"\n"};function lb(a,b,c){if(!(a.nodeName in jb))if(a.nodeType==D)c?b.push((""+a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in kb)b.push(kb[a.nodeName]);else for(a=a.firstChild;a;)lb(a,b,c),a=a.nextSibling}
+function bb(a){if(a&&"number"==typeof a.length){if(ca(a))return"function"==typeof a.item||"string"==typeof a.item;if(u(a))return"function"==typeof a.item}return l}function mb(a,b){for(var a=a.parentNode,c=0;a;){if(b(a))return a;a=a.parentNode;c++}return k}function Xa(a){this.v=a||q.document||document}p=Xa.prototype;p.ia=n("v");p.m=function(a){return t(a)?this.v.getElementById(a):a};
+p.ga=function(a,b,c){var d=this.v,e=arguments,f=e[1],j=d.createElement(e[0]);f&&(t(f)?j.className=f:"array"==aa(f)?Ua.apply(k,[j].concat(f)):Ya(j,f));2<e.length&&ab(d,j,e);return j};p.createElement=function(a){return this.v.createElement(a)};p.createTextNode=function(a){return this.v.createTextNode(a)};p.ta=function(){return this.v.parentWindow||this.v.defaultView};p.appendChild=function(a,b){a.appendChild(b)};p.removeNode=cb;p.contains=H;var I={};I.Aa=function(){var a={Qa:"http://www.w3.org/2000/svg"};return function(b){return a[b]||k}}();I.pa=function(a,b,c){var d=E(a);if(!d.implementation.hasFeature("XPath","3.0"))return k;try{var e=d.createNSResolver?d.createNSResolver(d.documentElement):I.Aa;return d.evaluate(b,a,e,c,k)}catch(f){"NS_ERROR_ILLEGAL_VALUE"!=f.name&&g(new y(32,"Unable to locate an element with the xpath expression "+b+" because of the following error:\n"+f))}};
+I.na=function(a,b){(!a||1!=a.nodeType)&&g(new y(32,'The result of the xpath expression "'+b+'" is: '+a+". It should be an element."))};I.Ja=function(a,b){var c=function(){var c=I.pa(b,a,9);return c?c.singleNodeValue||k:b.selectSingleNode?(c=E(b),c.setProperty&&c.setProperty("SelectionLanguage","XPath"),b.selectSingleNode(a)):k}();c===k||I.na(c,a);return c};
+I.Pa=function(a,b){var c=function(){var c=I.pa(b,a,7);if(c){for(var e=c.snapshotLength,f=[],j=0;j<e;++j)f.push(c.snapshotItem(j));return f}return b.selectNodes?(c=E(b),c.setProperty&&c.setProperty("SelectionLanguage","XPath"),b.selectNodes(a)):[]}();La(c,function(b){I.na(b,a)});return c};var nb,ob="",pb=/Firefox\/([0-9.]+)/.exec(ua());nb=ob=pb?pb[2]||pb[1]:"";function qb(){return J?rb(4):0<=oa(nb,4)}var rb=k,J=function(){var a=q.Components;if(!a)return l;try{if(!a.classes)return l}catch(b){return l}var c=a.classes,a=a.interfaces,d=c["@mozilla.org/xpcom/version-comparator;1"].getService(a.nsIVersionComparator),e=c["@mozilla.org/xre/app-info;1"].getService(a.nsIXULAppInfo).version;rb=function(a){return 0<=d.La(e,""+a)};return i}();var K="StopIteration"in q?q.StopIteration:Error("StopIteration");function L(){}L.prototype.next=function(){g(K)};L.prototype.t=function(){return this};function sb(a){if(a instanceof L)return a;if("function"==typeof a.t)return a.t(l);if(ba(a)){var b=0,c=new L;c.next=function(){for(;;){b>=a.length&&g(K);if(b in a)return a[b++];b++}};return c}g(Error("Not implemented"))};function M(a,b,c,d,e){this.q=!!b;a&&N(this,a,d);this.depth=e!=h?e:this.s||0;this.q&&(this.depth*=-1);this.Ba=!c}x(M,L);p=M.prototype;p.r=k;p.s=0;p.la=l;function N(a,b,c,d){if(a.r=b)a.s="number"==typeof c?c:1!=a.r.nodeType?0:a.q?-1:1;"number"==typeof d&&(a.depth=d)}
+p.next=function(){var a;if(this.la){(!this.r||this.Ba&&0==this.depth)&&g(K);a=this.r;var b=this.q?-1:1;if(this.s==b){var c=this.q?a.lastChild:a.firstChild;c?N(this,c):N(this,a,-1*b)}else(c=this.q?a.previousSibling:a.nextSibling)?N(this,c):N(this,a.parentNode,-1*b);this.depth+=this.s*(this.q?-1:1)}else this.la=i;(a=this.r)||g(K);return a};
+p.splice=function(a){var b=this.r,c=this.q?1:-1;this.s==c&&(this.s=-1*c,this.depth+=this.s*(this.q?-1:1));this.q=!this.q;M.prototype.next.call(this);this.q=!this.q;for(var c=ba(arguments[0])?arguments[0]:arguments,d=c.length-1;0<=d;d--)b.parentNode&&b.parentNode.insertBefore(c[d],b.nextSibling);cb(b)};function tb(a,b,c,d){M.call(this,a,b,c,k,d)}x(tb,M);tb.prototype.next=function(){do tb.ca.next.call(this);while(-1==this.s);return this.r};function ub(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d}ub.prototype.toString=function(){return"("+this.top+"t, "+this.right+"r, "+this.bottom+"b, "+this.left+"l)"};ub.prototype.contains=function(a){return!this||!a?l:a instanceof ub?a.left>=this.left&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom};function O(a,b){var c=E(a);return c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(a,k))?c[b]||c.getPropertyValue(b):""}function vb(a,b){return O(a,b)||(a.currentStyle?a.currentStyle[b]:k)||a.style&&a.style[b]}
+function wb(a){for(var b=E(a),c=vb(a,"position"),d="fixed"==c||"absolute"==c,a=a.parentNode;a&&a!=b;a=a.parentNode)if(c=vb(a,"position"),d=d&&"static"==c&&a!=b.documentElement&&a!=b.body,!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||"fixed"==c||"absolute"==c||"relative"==c))return a;return k}
+function xb(a){var b,c=E(a),d=vb(a,"position"),e=c.getBoxObjectFor&&!a.getBoundingClientRect&&"absolute"==d&&(b=c.getBoxObjectFor(a))&&(0>b.screenX||0>b.screenY),d=new C(0,0),f=(c?9==c.nodeType?c:E(c):document).documentElement;if(a==f)return d;if(a.getBoundingClientRect)b=a.getBoundingClientRect(),a=Wa(c),a=$a(a.v),d.x=b.left+a.x,d.y=b.top+a.y;else if(c.getBoxObjectFor&&!e)b=c.getBoxObjectFor(a),a=c.getBoxObjectFor(f),d.x=b.screenX-a.screenX,d.y=b.screenY-a.screenY;else{b=a;do d.x+=b.offsetLeft,d.y+=
+b.offsetTop,b!=a&&(d.x+=b.clientLeft||0,d.y+=b.clientTop||0),b=b.offsetParent;while(b&&b!=a);for(b=a;(b=wb(b))&&b!=c.body&&b!=f;)d.x-=b.scrollLeft,d.y-=b.scrollTop}return d}
+function yb(a){var b=new C;if(1==a.nodeType)if(a.getBoundingClientRect)a=a.getBoundingClientRect(),b.x=a.left,b.y=a.top;else{var c;c=Wa(a);c=$a(c.v);a=xb(a);b.x=a.x-c.x;b.y=a.y-c.y}else{c=u(a.sa);var d=a;a.targetTouches?d=a.targetTouches[0]:c&&a.sa().targetTouches&&(d=a.sa().targetTouches[0]);b.x=d.clientX;b.y=d.clientY}return b}
+function zb(a){if("none"!=vb(a,"display"))return Ab(a);var b=a.style,c=b.display,d=b.visibility,e=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";a=Ab(a);b.display=c;b.position=e;b.visibility=d;return a}function Ab(a){var b=a.offsetWidth,c=a.offsetHeight;return!r(b)&&a.getBoundingClientRect?(a=a.getBoundingClientRect(),new Va(a.right-a.left,a.bottom-a.top)):new Va(b,c)};function P(a,b){return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}function Bb(a){return P(a,"OPTION")?i:P(a,"INPUT")?(a=a.type.toLowerCase(),"checkbox"==a||"radio"==a):l}var Cb={"class":"className",readonly:"readOnly"},Db=["checked","disabled","draggable","hidden"];
+function Eb(a,b){var c=Cb[b]||b,d=a[c];if(!r(d)&&0<=A(Db,c))return l;if(c="value"==b)if(c=P(a,"OPTION")){var e;c=b.toLowerCase();if(a.hasAttribute)e=a.hasAttribute(c);else try{e=a.attributes[c].specified}catch(f){e=l}c=!e}c&&(d=[],lb(a,d,l),d=d.join(""));return d}
+var Fb="async,autofocus,autoplay,checked,compact,complete,controls,declare,defaultchecked,defaultselected,defer,disabled,draggable,ended,formnovalidate,hidden,indeterminate,iscontenteditable,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,paused,pubdate,readonly,required,reversed,scoped,seamless,seeking,selected,spellcheck,truespeed,willvalidate".split(","),Gb="BUTTON,INPUT,OPTGROUP,OPTION,SELECT,TEXTAREA".split(",");
+function Hb(a){var b=a.tagName.toUpperCase();return!(0<=A(Gb,b))?i:Eb(a,"disabled")?l:a.parentNode&&1==a.parentNode.nodeType&&"OPTGROUP"==b||"OPTION"==b?Hb(a.parentNode):i}var Ib="text,search,tel,url,email,password,number".split(",");function Jb(a){function b(a){return"inherit"==a.contentEditable?(a=Kb(a))?b(a):l:"true"==a.contentEditable}return!r(a.contentEditable)?l:r(a.isContentEditable)?a.isContentEditable:b(a)}
+function Kb(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return P(a)?a:k}function Lb(a,b){b=ra(b);return O(a,b)||Mb(a,b)}function Mb(a,b){var c=a.currentStyle||a.style,d=c[b];!r(d)&&u(c.getPropertyValue)&&(d=c.getPropertyValue(b));return"inherit"!=d?r(d)?d:k:(c=Kb(a))?Mb(c,b):k}function Nb(a){if(u(a.getBBox))try{var b=a.getBBox();if(b)return b}catch(c){}return zb(a)}
+function Ob(a,b){function c(a){if("none"==Lb(a,"display"))return l;a=Kb(a);return!a||c(a)}function d(a){var b=Nb(a);return 0<b.height&&0<b.width?i:Na(a.childNodes,function(a){return a.nodeType==D||P(a)&&d(a)})}function e(a){var b=Kb(a);if(b&&"hidden"==Lb(b,"overflow")){var c=Nb(b),d=yb(b),a=yb(a);return d.x+c.width<a.x||d.y+c.height<a.y?l:e(b)}return i}P(a)||g(Error("Argument to isShown must be of type Element"));if(P(a,"OPTION")||P(a,"OPTGROUP")){var f=mb(a,function(a){return P(a,"SELECT")});return!!f&&
+Ob(f,i)}if(P(a,"MAP")){if(!a.name)return l;f=E(a);f=f.evaluate?I.Ja('/descendant::*[@usemap = "#'+a.name+'"]',f):hb(f,function(b){var c;if(c=P(b))8==b.nodeType?b=k:(c="usemap","style"==c?(b=ha(b.style.cssText).toLowerCase(),b=";"==b.charAt(b.length-1)?b:b+";"):(b=b.getAttributeNode(c),b=!b?k:0<=A(Fb,c)?"true":b.specified?b.value:k)),c=b=="#"+a.name;return c});return!!f&&Ob(f,b)}return P(a,"AREA")?(f=mb(a,function(a){return P(a,"MAP")}),!!f&&Ob(f,b)):P(a,"INPUT")&&"hidden"==a.type.toLowerCase()||P(a,
+"NOSCRIPT")||"hidden"==Lb(a,"visibility")||!c(a)||!b&&0==Pb(a)||!d(a)||!e(a)?l:i}function Pb(a){var b=1,c=Lb(a,"opacity");c&&(b=Number(c));(a=Kb(a))&&(b*=Pb(a));return b};function Q(){this.l=Ca.document.documentElement;this.ba=k;var a=E(this.l).activeElement;a&&Qb(this,a)}Q.prototype.m=n("l");function Qb(a,b){a.l=b;a.ba=P(b,"OPTION")?mb(b,function(a){return P(a,"SELECT")}):k}function Rb(a,b,c,d,e,f){if(!Ob(a.l,i)||!Hb(a.l))return l;e&&!(Sb==b||Tb==b)&&g(new y(12,"Event type does not allow related target: "+b));c={clientX:c.x,clientY:c.y,button:d,altKey:l,ctrlKey:l,shiftKey:l,metaKey:l,wheelDelta:f||0,relatedTarget:e||k};return(a=a.l)?Ub(a,b,c):i}
+function Vb(a,b,c,d,e,f){function j(a,c){var d={identifier:a,screenX:c.x,screenY:c.y,clientX:c.x,clientY:c.y,pageX:c.x,pageY:c.y};m.changedTouches.push(d);if(b==Wb||b==Xb)m.touches.push(d),m.targetTouches.push(d)}var m={touches:[],targetTouches:[],changedTouches:[],altKey:l,ctrlKey:l,shiftKey:l,metaKey:l,relatedTarget:k,scale:0,rotation:0};j(c,d);r(e)&&j(e,f);Ub(a.l,b,m)}var Yb=!J||J&&!qb(),Zb=J&&qb(),$b=J;
+function ac(a){if(!a.href)return l;if(!J)return i;if(Zb)return l;if(a.target||0==a.href.toLowerCase().indexOf("javascript"))return!$b;var b=G(E(a)),c=b.location.href;var b=b.location,d=a.href.match(bc);if(d){var a=d[1]||"",e=d[2]||"",f=d[3]||"",j=d[4]||"",d=d[5]||"";if(!a&&(a=b.protocol,!e))if(e=b.host,f){if("/"!=f.charAt(0)){var m=b.pathname.lastIndexOf("/");-1!=m&&(f=b.pathname.substr(0,m+1)+f)}}else f=b.pathname,j=j||b.search;b=a+"//"+e+f+j+d}else b="";return c.split("#")[0]!==b.split("#")[0]}
+var bc=/^([^:/?#.]+:)?(?:\/\/([^/]*))?([^?#]+)?(\?[^#]*)?(#.*)?$/;function R(a,b,c){this.K=a;this.T=b;this.U=c}R.prototype.create=function(a){a=E(a).createEvent("HTMLEvents");a.initEvent(this.K,this.T,this.U);return a};R.prototype.toString=n("K");function S(a,b,c){R.call(this,a,b,c)}x(S,R);
+S.prototype.create=function(a,b){var c=E(a),d=G(c),c=c.createEvent("MouseEvents"),e=1;this==cc&&(e=b.wheelDelta/-40);this==dc&&(e=b.wheelDelta);c.initMouseEvent(this.K,this.T,this.U,d,e,0,0,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};function ec(a,b,c){R.call(this,a,b,c)}x(ec,R);
+ec.prototype.create=function(a,b){var c=E(a),d=G(c),e=b.charCode?0:b.keyCode,c=c.createEvent("KeyboardEvent");c.initKeyEvent(this.K,this.T,this.U,d,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,e,b.charCode);this.K==fc&&b.preventDefault&&c.preventDefault();return c};function gc(a,b,c){R.call(this,a,b,c)}x(gc,R);
+gc.prototype.create=function(a,b){function c(b){var c=Ma(b,function(b){return{identifier:b.identifier,screenX:b.screenX,screenY:b.screenY,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,target:a}});c.item=function(a){return c[a]};return c}var d=E(a),e=G(d),f=c(b.changedTouches),j=b.touches==b.changedTouches?f:c(b.touches),m=b.targetTouches==b.changedTouches?f:c(b.targetTouches),d=d.createEvent("MouseEvents");d.initMouseEvent(this.K,this.T,this.U,e,1,0,0,b.clientX,b.clientY,b.ctrlKey,
+b.altKey,b.shiftKey,b.metaKey,0,b.relatedTarget);d.touches=j;d.targetTouches=m;d.changedTouches=f;d.scale=b.scale;d.rotation=b.rotation;return d};
+var hc=new R("change",i,l),ic=new S("click",i,i),jc=new S("contextmenu",i,i),kc=new S("dblclick",i,i),lc=new S("mousedown",i,i),mc=new S("mousemove",i,l),Tb=new S("mouseout",i,i),Sb=new S("mouseover",i,i),nc=new S("mouseup",i,i),cc=new S("DOMMouseScroll",i,i),dc=new S("MozMousePixelScroll",i,i),fc=new ec("keypress",i,i),Xb=new gc("touchmove",i,i),Wb=new gc("touchstart",i,i);function Ub(a,b,c){b=b.create(a,c);"isTrusted"in b||(b.Na=l);return a.dispatchEvent(b)};function oc(a){if("function"==typeof a.M)return a.M();if(t(a))return a.split("");if(ba(a)){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}return Ea(a)};function pc(a,b){this.p={};this.wa={};var c=arguments.length;if(1<c){c%2&&g(Error("Uneven number of arguments"));for(var d=0;d<c;d+=2)this.set(arguments[d],arguments[d+1])}else a&&this.da(a)}p=pc.prototype;p.ma=0;p.M=function(){var a=[],b;for(b in this.p)":"==b.charAt(0)&&a.push(this.p[b]);return a};function qc(a){var b=[],c;for(c in a.p)if(":"==c.charAt(0)){var d=c.substring(1);b.push(a.wa[c]?Number(d):d)}return b}
+p.set=function(a,b){var c=":"+a;c in this.p||(this.ma++,"number"==typeof a&&(this.wa[c]=i));this.p[c]=b};p.da=function(a){var b;if(a instanceof pc)b=qc(a),a=a.M();else{b=[];var c=0,d;for(d in a)b[c++]=d;a=Ea(a)}for(c=0;c<b.length;c++)this.set(b[c],a[c])};p.t=function(a){var b=0,c=qc(this),d=this.p,e=this.ma,f=this,j=new L;j.next=function(){for(;;){e!=f.ma&&g(Error("The map has changed since the iterator was created"));b>=c.length&&g(K);var j=c[b++];return a?j:d[":"+j]}};return j};function rc(a){this.p=new pc;a&&this.da(a)}function sc(a){var b=typeof a;return"object"==b&&a||"function"==b?"o"+(a[da]||(a[da]=++ea)):b.substr(0,1)+a}p=rc.prototype;p.add=function(a){this.p.set(sc(a),a)};p.da=function(a){for(var a=oc(a),b=a.length,c=0;c<b;c++)this.add(a[c])};p.contains=function(a){return":"+sc(a)in this.p.p};p.M=function(){return this.p.M()};p.t=function(){return this.p.t(l)};function tc(){Q.call(this);var a=this.m();(P(a,"TEXTAREA")||(P(a,"INPUT")?0<=A(Ib,a.type.toLowerCase()):Jb(a)))&&Eb(a,"readOnly");this.Ia=new rc}x(tc,Q);var uc={};function T(a,b,c){ca(a)&&(a=a.c);a=new vc(a);if(b&&(!(b in uc)||c))uc[b]={key:a,shift:l},c&&(uc[c]={key:a,shift:i})}function vc(a){this.code=a}T(8);T(9);T(13);T(16);T(17);T(18);T(19);T(20);T(27);T(32," ");T(33);T(34);T(35);T(36);T(37);T(38);T(39);T(40);T(44);T(45);T(46);T(48,"0",")");T(49,"1","!");T(50,"2","@");T(51,"3","#");T(52,"4","$");
+T(53,"5","%");T(54,"6","^");T(55,"7","&");T(56,"8","*");T(57,"9","(");T(65,"a","A");T(66,"b","B");T(67,"c","C");T(68,"d","D");T(69,"e","E");T(70,"f","F");T(71,"g","G");T(72,"h","H");T(73,"i","I");T(74,"j","J");T(75,"k","K");T(76,"l","L");T(77,"m","M");T(78,"n","N");T(79,"o","O");T(80,"p","P");T(81,"q","Q");T(82,"r","R");T(83,"s","S");T(84,"t","T");T(85,"u","U");T(86,"v","V");T(87,"w","W");T(88,"x","X");T(89,"y","Y");T(90,"z","Z");T(ta?{c:91,e:91,opera:219}:sa?{c:224,e:91,opera:17}:{c:0,e:91,opera:k});
+T(ta?{c:92,e:92,opera:220}:sa?{c:224,e:93,opera:17}:{c:0,e:92,opera:k});T(ta?{c:93,e:93,opera:0}:sa?{c:0,e:0,opera:16}:{c:93,e:k,opera:0});T({c:96,e:96,opera:48},"0");T({c:97,e:97,opera:49},"1");T({c:98,e:98,opera:50},"2");T({c:99,e:99,opera:51},"3");T({c:100,e:100,opera:52},"4");T({c:101,e:101,opera:53},"5");T({c:102,e:102,opera:54},"6");T({c:103,e:103,opera:55},"7");T({c:104,e:104,opera:56},"8");T({c:105,e:105,opera:57},"9");T({c:106,e:106,opera:xa?56:42},"*");T({c:107,e:107,opera:xa?61:43},"+");
+T({c:109,e:109,opera:xa?109:45},"-");T({c:110,e:110,opera:xa?190:78},".");T({c:111,e:111,opera:xa?191:47},"/");T(144);T(112);T(113);T(114);T(115);T(116);T(117);T(118);T(119);T(120);T(121);T(122);T(123);T({c:107,e:187,opera:61},"=","+");T({c:109,e:189,opera:109},"-","_");T(188,",","<");T(190,".",">");T(191,"/","?");T(192,"`","~");T(219,"[","{");T(220,"\\","|");T(221,"]","}");T({c:59,e:186,opera:59},";",":");T(222,"'",'"');tc.prototype.Y=function(a){return this.Ia.contains(a)};function wc(a){return xc(a||arguments.callee.caller,[])}
+function xc(a,b){var c=[];if(0<=A(b,a))c.push("[...circular reference...]");else if(a&&50>b.length){c.push(yc(a)+"(");for(var d=a.arguments,e=0;e<d.length;e++){0<e&&c.push(", ");var f;f=d[e];switch(typeof f){case "object":f=f?"object":"null";break;case "string":break;case "number":f=""+f;break;case "boolean":f=f?"true":"false";break;case "function":f=(f=yc(f))?f:"[fn]";break;default:f=typeof f}40<f.length&&(f=f.substr(0,40)+"...");c.push(f)}b.push(a);c.push(")\n");try{c.push(xc(a.caller,b))}catch(j){c.push("[exception trying to get caller]\n")}}else a?
+c.push("[...long stack...]"):c.push("[end]");return c.join("")}function yc(a){if(zc[a])return zc[a];a=""+a;if(!zc[a]){var b=/function ([^\(]+)/.exec(a);zc[a]=b?b[1]:"[Anonymous]"}return zc[a]}var zc={};function Ac(a,b,c,d,e){this.reset(a,b,c,d,e)}Ac.prototype.ra=k;Ac.prototype.qa=k;var Bc=0;Ac.prototype.reset=function(a,b,c,d,e){"number"==typeof e||Bc++;d||fa();this.O=a;this.Ga=b;delete this.ra;delete this.qa};Ac.prototype.xa=function(a){this.O=a};function U(a){this.Ha=a}U.prototype.$=k;U.prototype.O=k;U.prototype.ea=k;U.prototype.ua=k;function Cc(a,b){this.name=a;this.value=b}Cc.prototype.toString=n("name");var Dc=new Cc("WARNING",900),Ec=new Cc("CONFIG",700);U.prototype.getParent=n("$");U.prototype.xa=function(a){this.O=a};function Fc(a){if(a.O)return a.O;if(a.$)return Fc(a.$);Ja("Root logger has no level set.");return k}
+U.prototype.log=function(a,b,c){if(a.value>=Fc(this).value){a=this.Da(a,b,c);b="log:"+a.Ga;q.console&&(q.console.timeStamp?q.console.timeStamp(b):q.console.markTimeline&&q.console.markTimeline(b));q.msWriteProfilerMark&&q.msWriteProfilerMark(b);for(b=this;b;){var c=b,d=a;if(c.ua)for(var e=0,f=h;f=c.ua[e];e++)f(d);b=b.getParent()}}};
+U.prototype.Da=function(a,b,c){var d=new Ac(a,""+b,this.Ha);if(c){d.ra=c;var e;var f=arguments.callee.caller;try{var j;var m;c:{for(var s=["window","location","href"],F=q,B;B=s.shift();)if(F[B]!=k)F=F[B];else{m=k;break c}m=F}if(t(c))j={message:c,name:"Unknown error",lineNumber:"Not available",fileName:m,stack:"Not available"};else{var v,w,s=l;try{v=c.lineNumber||c.Oa||"Not available"}catch(xd){v="Not available",s=i}try{w=c.fileName||c.filename||c.sourceURL||m}catch(yd){w="Not available",s=i}j=s||
+!c.lineNumber||!c.fileName||!c.stack?{message:c.message,name:c.name,lineNumber:v,fileName:w,stack:c.stack||"Not available"}:c}e="Message: "+ia(j.message)+'\nUrl: <a href="view-source:'+j.fileName+'" target="_new">'+j.fileName+"</a>\nLine: "+j.lineNumber+"\n\nBrowser stack:\n"+ia(j.stack+"-> ")+"[end]\n\nJS stack traversal:\n"+ia(wc(f)+"-> ")}catch(vd){e="Exception trying to expose exception! You win, we lose. "+vd}d.qa=e}return d};var Gc={},Hc=k;
+function Ic(a){Hc||(Hc=new U(""),Gc[""]=Hc,Hc.xa(Ec));var b;if(!(b=Gc[a])){b=new U(a);var c=a.lastIndexOf("."),d=a.substr(c+1),c=Ic(a.substr(0,c));c.ea||(c.ea={});c.ea[d]=b;b.$=c;Gc[a]=b}return b};function Jc(){}x(Jc,function(){});Ic("goog.dom.SavedRange");x(function(a){this.Ka="goog_"+pa++;this.Ca="goog_"+pa++;this.oa=Wa(a.ia());a.S(this.oa.ga("SPAN",{id:this.Ka}),this.oa.ga("SPAN",{id:this.Ca}))},Jc);function Kc(){}function Lc(a){if(a.getSelection)return a.getSelection();var a=a.document,b=a.selection;if(b){try{var c=b.createRange();if(c.parentElement){if(c.parentElement().document!=a)return k}else if(!c.length||c.item(0).document!=a)return k}catch(d){return k}return b}return k}function Mc(a){for(var b=[],c=0,d=a.F();c<d;c++)b.push(a.C(c));return b}Kc.prototype.G=o(l);Kc.prototype.ia=function(){return E(this.b())};Kc.prototype.ta=function(){return G(this.ia())};
+Kc.prototype.containsNode=function(a,b){return this.B(Nc(Oc(a),h),b)};function V(a,b){M.call(this,a,b,i)}x(V,M);function Pc(){}x(Pc,Kc);Pc.prototype.B=function(a,b){var c=Mc(this),d=Mc(a);return(b?Na:Oa)(d,function(a){return Na(c,function(c){return c.B(a,b)})})};Pc.prototype.insertNode=function(a,b){if(b){var c=this.b();c.parentNode&&c.parentNode.insertBefore(a,c)}else c=this.g(),c.parentNode&&c.parentNode.insertBefore(a,c.nextSibling);return a};Pc.prototype.S=function(a,b){this.insertNode(a,i);this.insertNode(b,l)};function Qc(a,b,c,d,e){var f;if(a&&(this.f=a,this.i=b,this.d=c,this.h=d,1==a.nodeType&&"BR"!=a.tagName&&(a=a.childNodes,(b=a[b])?(this.f=b,this.i=0):(a.length&&(this.f=z(a)),f=i)),1==c.nodeType))(this.d=c.childNodes[d])?this.h=0:this.d=c;V.call(this,e?this.d:this.f,e);if(f)try{this.next()}catch(j){j!=K&&g(j)}}x(Qc,V);p=Qc.prototype;p.f=k;p.d=k;p.i=0;p.h=0;p.b=n("f");p.g=n("d");p.N=function(){return this.la&&this.r==this.d&&(!this.h||1!=this.s)};p.next=function(){this.N()&&g(K);return Qc.ca.next.call(this)};"ScriptEngine"in q&&"JScript"==q.ScriptEngine()&&(q.ScriptEngineMajorVersion(),q.ScriptEngineMinorVersion(),q.ScriptEngineBuildVersion());function Rc(){}Rc.prototype.B=function(a,b){var c=b&&!a.isCollapsed(),d=a.a;try{return c?0<=this.n(d,0,1)&&0>=this.n(d,1,0):0<=this.n(d,0,0)&&0>=this.n(d,1,1)}catch(e){g(e)}};Rc.prototype.containsNode=function(a,b){return this.B(Oc(a),b)};Rc.prototype.t=function(){return new Qc(this.b(),this.j(),this.g(),this.k())};function Sc(a){this.a=a}x(Sc,Rc);p=Sc.prototype;p.D=function(){return this.a.commonAncestorContainer};p.b=function(){return this.a.startContainer};p.j=function(){return this.a.startOffset};p.g=function(){return this.a.endContainer};p.k=function(){return this.a.endOffset};p.n=function(a,b,c){return this.a.compareBoundaryPoints(1==c?1==b?q.Range.START_TO_START:q.Range.START_TO_END:1==b?q.Range.END_TO_START:q.Range.END_TO_END,a)};p.isCollapsed=function(){return this.a.collapsed};
+p.select=function(a){this.aa(G(E(this.b())).getSelection(),a)};p.aa=function(a){a.removeAllRanges();a.addRange(this.a)};p.insertNode=function(a,b){var c=this.a.cloneRange();c.collapse(b);c.insertNode(a);c.detach();return a};
+p.S=function(a,b){var c=G(E(this.b()));if(c=(c=Lc(c||window))&&Tc(c))var d=c.b(),e=c.g(),f=c.j(),j=c.k();var m=this.a.cloneRange(),s=this.a.cloneRange();m.collapse(l);s.collapse(i);m.insertNode(b);s.insertNode(a);m.detach();s.detach();if(c){if(d.nodeType==D)for(;f>d.length;){f-=d.length;do d=d.nextSibling;while(d==a||d==b)}if(e.nodeType==D)for(;j>e.length;){j-=e.length;do e=e.nextSibling;while(e==a||e==b)}c=new Uc;c.H=Vc(d,f,e,j);"BR"==d.tagName&&(m=d.parentNode,f=A(m.childNodes,d),d=m);"BR"==e.tagName&&
+(m=e.parentNode,j=A(m.childNodes,e),e=m);c.H?(c.f=e,c.i=j,c.d=d,c.h=f):(c.f=d,c.i=f,c.d=e,c.h=j);c.select()}};p.collapse=function(a){this.a.collapse(a)};function Wc(a){this.a=a}x(Wc,Sc);function Oc(a){var b=E(a).createRange();if(a.nodeType==D)b.setStart(a,0),b.setEnd(a,a.length);else if(W(a)){for(var c,d=a;(c=d.firstChild)&&W(c);)d=c;b.setStart(d,0);for(d=a;(c=d.lastChild)&&W(c);)d=c;b.setEnd(d,1==d.nodeType?d.childNodes.length:d.length)}else c=a.parentNode,a=A(c.childNodes,a),b.setStart(c,a),b.setEnd(c,a+1);return new Wc(b)}
+Wc.prototype.aa=function(a,b){var c=b?this.g():this.b(),d=b?this.k():this.j(),e=b?this.b():this.g(),f=b?this.j():this.k();a.collapse(c,d);(c!=e||d!=f)&&a.extend(e,f)};function Xc(a){this.a=a}x(Xc,Rc);Ic("goog.dom.browserrange.IeRange");function Yc(a){var b=E(a).body.createTextRange();if(1==a.nodeType)b.moveToElementText(a),W(a)&&!a.childNodes.length&&b.collapse(l);else{for(var c=0,d=a;d=d.previousSibling;){var e=d.nodeType;if(e==D)c+=d.length;else if(1==e){b.moveToElementText(d);break}}d||b.moveToElementText(a.parentNode);b.collapse(!d);c&&b.move("character",c);b.moveEnd("character",a.length)}return b}p=Xc.prototype;p.P=k;p.f=k;p.d=k;p.i=-1;p.h=-1;
+p.u=function(){this.P=this.f=this.d=k;this.i=this.h=-1};
+p.D=function(){if(!this.P){var a=this.a.text,b=this.a.duplicate(),c=a.replace(/ +$/,"");(c=a.length-c.length)&&b.moveEnd("character",-c);c=b.parentElement();b=b.htmlText.replace(/(\r\n|\r|\n)+/g," ").length;if(this.isCollapsed()&&0<b)return this.P=c;for(;b>c.outerHTML.replace(/(\r\n|\r|\n)+/g," ").length;)c=c.parentNode;for(;1==c.childNodes.length&&c.innerText==(c.firstChild.nodeType==D?c.firstChild.nodeValue:c.firstChild.innerText)&&W(c.firstChild);)c=c.firstChild;0==a.length&&(c=Zc(this,c));this.P=
+c}return this.P};function Zc(a,b){for(var c=b.childNodes,d=0,e=c.length;d<e;d++){var f=c[d];if(W(f)){var j=Yc(f),m=j.htmlText!=f.outerHTML;if(a.isCollapsed()&&m?0<=a.n(j,1,1)&&0>=a.n(j,1,0):a.a.inRange(j))return Zc(a,f)}}return b}p.b=function(){this.f||(this.f=$c(this,1),this.isCollapsed()&&(this.d=this.f));return this.f};p.j=function(){0>this.i&&(this.i=ad(this,1),this.isCollapsed()&&(this.h=this.i));return this.i};
+p.g=function(){if(this.isCollapsed())return this.b();this.d||(this.d=$c(this,0));return this.d};p.k=function(){if(this.isCollapsed())return this.j();0>this.h&&(this.h=ad(this,0),this.isCollapsed()&&(this.i=this.h));return this.h};p.n=function(a,b,c){return this.a.compareEndPoints((1==b?"Start":"End")+"To"+(1==c?"Start":"End"),a)};
+function $c(a,b,c){c=c||a.D();if(!c||!c.firstChild)return c;for(var d=1==b,e=0,f=c.childNodes.length;e<f;e++){var j=d?e:f-e-1,m=c.childNodes[j],s;try{s=Oc(m)}catch(F){continue}var B=s.a;if(a.isCollapsed())if(W(m)){if(s.B(a))return $c(a,b,m)}else{if(0==a.n(B,1,1)){a.i=a.h=j;break}}else{if(a.B(s)){if(!W(m)){d?a.i=j:a.h=j+1;break}return $c(a,b,m)}if(0>a.n(B,1,0)&&0<a.n(B,0,1))return $c(a,b,m)}}return c}
+function ad(a,b){var c=1==b,d=c?a.b():a.g();if(1==d.nodeType){for(var d=d.childNodes,e=d.length,f=c?1:-1,j=c?0:e-1;0<=j&&j<e;j+=f){var m=d[j];if(!W(m)&&0==a.a.compareEndPoints((1==b?"Start":"End")+"To"+(1==b?"Start":"End"),Oc(m).a))return c?j:j+1}return-1==j?0:j}e=a.a.duplicate();f=Yc(d);e.setEndPoint(c?"EndToEnd":"StartToStart",f);e=e.text.length;return c?d.length-e:e}p.isCollapsed=function(){return 0==this.a.compareEndPoints("StartToEnd",this.a)};p.select=function(){this.a.select()};
+function bd(a,b,c){var d;d=d||Wa(a.parentElement());var e;1!=b.nodeType&&(e=i,b=d.ga("DIV",k,b));a.collapse(c);d=d||Wa(a.parentElement());var f=c=b.id;c||(c=b.id="goog_"+pa++);a.pasteHTML(b.outerHTML);(b=d.m(c))&&(f||b.removeAttribute("id"));if(e){a=b.firstChild;e=b;if((d=e.parentNode)&&11!=d.nodeType)if(e.removeNode)e.removeNode(l);else{for(;b=e.firstChild;)d.insertBefore(b,e);cb(e)}b=a}return b}p.insertNode=function(a,b){var c=bd(this.a.duplicate(),a,b);this.u();return c};
+p.S=function(a,b){var c=this.a.duplicate(),d=this.a.duplicate();bd(c,a,i);bd(d,b,l);this.u()};p.collapse=function(a){this.a.collapse(a);a?(this.d=this.f,this.h=this.i):(this.f=this.d,this.i=this.h)};function cd(a){this.a=a}x(cd,Sc);cd.prototype.aa=function(a){a.collapse(this.b(),this.j());(this.g()!=this.b()||this.k()!=this.j())&&a.extend(this.g(),this.k());0==a.rangeCount&&a.addRange(this.a)};function dd(a){this.a=a}x(dd,Sc);dd.prototype.n=function(a,b,c){return Ba["528"]||(Ba["528"]=0<=oa(ya,"528"))?dd.ca.n.call(this,a,b,c):this.a.compareBoundaryPoints(1==c?1==b?q.Range.START_TO_START:q.Range.END_TO_START:1==b?q.Range.START_TO_END:q.Range.END_TO_END,a)};dd.prototype.aa=function(a,b){a.removeAllRanges();b?a.setBaseAndExtent(this.g(),this.k(),this.b(),this.j()):a.setBaseAndExtent(this.b(),this.j(),this.g(),this.k())};function W(a){var b;a:if(1!=a.nodeType)b=l;else{switch(a.tagName){case "APPLET":case "AREA":case "BASE":case "BR":case "COL":case "FRAME":case "HR":case "IMG":case "INPUT":case "IFRAME":case "ISINDEX":case "LINK":case "NOFRAMES":case "NOSCRIPT":case "META":case "OBJECT":case "PARAM":case "SCRIPT":case "STYLE":b=l;break a}b=i}return b||a.nodeType==D};function Uc(){}x(Uc,Kc);function Nc(a,b){var c=new Uc;c.L=a;c.H=!!b;return c}p=Uc.prototype;p.L=k;p.f=k;p.i=k;p.d=k;p.h=k;p.H=l;p.ja=o("text");p.X=function(){return X(this).a};p.u=function(){this.f=this.i=this.d=this.h=k};p.F=o(1);p.C=function(){return this};function X(a){var b;if(!(b=a.L)){b=a.b();var c=a.j(),d=a.g(),e=a.k(),f=E(b).createRange();f.setStart(b,c);f.setEnd(d,e);b=a.L=new Wc(f)}return b}p.D=function(){return X(this).D()};p.b=function(){return this.f||(this.f=X(this).b())};
+p.j=function(){return this.i!=k?this.i:this.i=X(this).j()};p.g=function(){return this.d||(this.d=X(this).g())};p.k=function(){return this.h!=k?this.h:this.h=X(this).k()};p.G=n("H");p.B=function(a,b){var c=a.ja();return"text"==c?X(this).B(X(a),b):"control"==c?(c=ed(a),(b?Na:Oa)(c,function(a){return this.containsNode(a,b)},this)):l};p.isCollapsed=function(){return X(this).isCollapsed()};p.t=function(){return new Qc(this.b(),this.j(),this.g(),this.k())};p.select=function(){X(this).select(this.H)};
+p.insertNode=function(a,b){var c=X(this).insertNode(a,b);this.u();return c};p.S=function(a,b){X(this).S(a,b);this.u()};p.ka=function(){return new fd(this)};p.collapse=function(a){a=this.G()?!a:a;this.L&&this.L.collapse(a);a?(this.d=this.f,this.h=this.i):(this.f=this.d,this.i=this.h);this.H=l};function fd(a){a.G()?a.g():a.b();a.G()?a.k():a.j();a.G()?a.b():a.g();a.G()?a.j():a.k()}x(fd,Jc);function gd(){}x(gd,Pc);p=gd.prototype;p.a=k;p.o=k;p.R=k;p.u=function(){this.R=this.o=k};p.ja=o("control");p.X=function(){return this.a||document.body.createControlRange()};p.F=function(){return this.a?this.a.length:0};p.C=function(a){a=this.a.item(a);return Nc(Oc(a),h)};p.D=function(){return gb.apply(k,ed(this))};p.b=function(){return hd(this)[0]};p.j=o(0);p.g=function(){var a=hd(this),b=z(a);return Pa(a,function(a){return H(a,b)})};p.k=function(){return this.g().childNodes.length};
+function ed(a){if(!a.o&&(a.o=[],a.a))for(var b=0;b<a.a.length;b++)a.o.push(a.a.item(b));return a.o}function hd(a){a.R||(a.R=ed(a).concat(),a.R.sort(function(a,c){return a.sourceIndex-c.sourceIndex}));return a.R}p.isCollapsed=function(){return!this.a||!this.a.length};p.t=function(){return new id(this)};p.select=function(){this.a&&this.a.select()};p.ka=function(){return new jd(this)};p.collapse=function(){this.a=k;this.u()};function jd(a){this.o=ed(a)}x(jd,Jc);
+function id(a){a&&(this.o=hd(a),this.f=this.o.shift(),this.d=z(this.o)||this.f);V.call(this,this.f,l)}x(id,V);p=id.prototype;p.f=k;p.d=k;p.o=k;p.b=n("f");p.g=n("d");p.N=function(){return!this.depth&&!this.o.length};p.next=function(){this.N()&&g(K);if(!this.depth){var a=this.o.shift();N(this,a,1,1);return a}return id.ca.next.call(this)};function kd(){this.w=[];this.Q=[];this.V=this.J=k}x(kd,Pc);p=kd.prototype;p.Fa=Ic("goog.dom.MultiRange");p.u=function(){this.Q=[];this.V=this.J=k};p.ja=o("mutli");p.X=function(){1<this.w.length&&this.Fa.log(Dc,"getBrowserRangeObject called on MultiRange with more than 1 range",h);return this.w[0]};p.F=function(){return this.w.length};p.C=function(a){this.Q[a]||(this.Q[a]=Nc(new Wc(this.w[a]),h));return this.Q[a]};
+p.D=function(){if(!this.V){for(var a=[],b=0,c=this.F();b<c;b++)a.push(this.C(b).D());this.V=gb.apply(k,a)}return this.V};function ld(a){a.J||(a.J=Mc(a),a.J.sort(function(a,c){var d=a.b(),e=a.j(),f=c.b(),j=c.j();return d==f&&e==j?0:Vc(d,e,f,j)?1:-1}));return a.J}p.b=function(){return ld(this)[0].b()};p.j=function(){return ld(this)[0].j()};p.g=function(){return z(ld(this)).g()};p.k=function(){return z(ld(this)).k()};p.isCollapsed=function(){return 0==this.w.length||1==this.w.length&&this.C(0).isCollapsed()};
+p.t=function(){return new md(this)};p.select=function(){var a=Lc(this.ta());a.removeAllRanges();for(var b=0,c=this.F();b<c;b++)a.addRange(this.C(b).X())};p.ka=function(){return new nd(this)};p.collapse=function(a){if(!this.isCollapsed()){var b=a?this.C(0):this.C(this.F()-1);this.u();b.collapse(a);this.Q=[b];this.J=[b];this.w=[b.X()]}};function nd(a){Ma(Mc(a),function(a){return a.ka()})}x(nd,Jc);function md(a){a&&(this.I=Ma(ld(a),function(a){return sb(a)}));V.call(this,a?this.b():k,l)}x(md,V);p=md.prototype;
+p.I=k;p.W=0;p.b=function(){return this.I[0].b()};p.g=function(){return z(this.I).g()};p.N=function(){return this.I[this.W].N()};p.next=function(){try{var a=this.I[this.W],b=a.next();N(this,a.r,a.s,a.depth);return b}catch(c){return(c!==K||this.I.length-1==this.W)&&g(c),this.W++,this.next()}};function Tc(a){var b,c=l;if(a.createRange)try{b=a.createRange()}catch(d){return k}else if(a.rangeCount){if(1<a.rangeCount){b=new kd;for(var c=0,e=a.rangeCount;c<e;c++)b.w.push(a.getRangeAt(c));return b}b=a.getRangeAt(0);c=Vc(a.anchorNode,a.anchorOffset,a.focusNode,a.focusOffset)}else return k;b&&b.addElement?(a=new gd,a.a=b):a=Nc(new Wc(b),c);return a}
+function Vc(a,b,c,d){if(a==c)return d<b;var e;if(1==a.nodeType&&b)if(e=a.childNodes[b])a=e,b=0;else if(H(a,c))return i;if(1==c.nodeType&&d)if(e=c.childNodes[d])c=e,d=0;else if(H(c,a))return l;return 0<(db(a,c)||b-d)};function od(){Q.call(this);this.ha=this.z=k;this.A=new C(0,0);this.va=this.Z=l}x(od,Q);var Y={};Y[ic]=[0,1,2,k];Y[jc]=[k,k,2,k];Y[nc]=[0,1,2,k];Y[Tb]=[0,0,0,0];Y[mc]=[0,0,0,0];Y[kc]=Y[ic];Y[lc]=Y[nc];Y[Sb]=Y[Tb];od.prototype.move=function(a,b){var c=yb(a);this.A.x=b.x+c.x;this.A.y=b.y+c.y;a!=this.m()&&(c=this.m()===Ca.document.documentElement||this.m()===Ca.document.body,c=!this.va&&c?k:this.m(),Z(this,Tb,a),Qb(this,a),Z(this,Sb,c));Z(this,mc);this.Z=l};
+function Z(a,b,c){a.va=i;return Rb(a,b,a.A,pd(a,b),c,h)}function pd(a,b){if(!(b in Y))return 0;var c=Y[b][a.z===k?3:a.z];c===k&&g(new y(13,"Event does not permit the specified mouse button."));return c};function qd(){Q.call(this);this.A=new C(0,0);this.fa=new C(0,0)}x(qd,Q);qd.prototype.za=0;qd.prototype.ya=0;qd.prototype.move=function(a,b,c){this.Y()||Qb(this,a);a=yb(a);this.A.x=b.x+a.x;this.A.y=b.y+a.y;r(c)&&(this.fa.x=c.x+a.x,this.fa.y=c.y+a.y);if(this.Y()){b=Xb;this.Y()||g(new y(13,"Should never fire event when touchscreen is not pressed."));var d,e;this.ya&&(d=this.ya,e=this.fa);Vb(this,b,this.za,this.A,d,e)}};qd.prototype.Y=function(){return!!this.za};function rd(a,b){this.x=a;this.y=b}x(rd,C);rd.prototype.scale=function(a){this.x*=a;this.y*=a;return this};rd.prototype.add=function(a){this.x+=a.x;this.y+=a.y;return this};function sd(){Q.call(this)}x(sd,Q);(function(a){a.Ma=function(){return a.Ea||(a.Ea=new a)}})(sd);function td(a,b,c){Ob(a,i)||g(new y(11,"Element is not currently visible and may not be manipulated"));var d=E(a).documentElement,e=xb(a),f=xb(d),j,m,s,F;F=O(d,"borderLeftWidth");s=O(d,"borderRightWidth");j=O(d,"borderTopWidth");m=O(d,"borderBottomWidth");j=new ub(parseFloat(j),parseFloat(s),parseFloat(m),parseFloat(F));m=e.x-f.x-j.left;e=e.y-f.y-j.top;f=d.clientHeight-a.offsetHeight;d.scrollLeft+=Math.min(m,Math.max(m-(d.clientWidth-a.offsetWidth),0));d.scrollTop+=Math.min(e,Math.max(e-f,0));b||
+(b=zb(a),b=new C(b.width/2,b.height/2));c=c||new od;c.move(a,b);c.z!==k&&g(new y(13,"Cannot press more then one button or an already pressed button."));c.z=0;c.ha=c.m();!qb()&&(P(c.m(),"OPTION")||P(c.m(),"SELECT"))?a=i:(a=E(c.m()).activeElement,a=(b=Z(c,lc))&&a!=E(c.m()).activeElement?l:b);if(a&&(a=c.ba||c.l,b=E(a).activeElement,a!=b)){if(b&&u(b.blur))try{b.blur()}catch(B){g(B)}u(a.focus)&&a.focus()}c.z===k&&g(new y(13,"Cannot release a button when no button is pressed."));Z(c,nc);if(0==c.z&&c.m()==
+c.ha){b=c.A;d=pd(c,ic);if(Ob(c.l,i)&&Hb(c.l)){a=k;if(Yb)for(e=c.l;e;e=e.parentNode)if(P(e,"A")){a=e;break}else{a:{if(P(e,"INPUT")&&(f=e.type.toLowerCase(),"submit"==f||"image"==f)){f=i;break a}if(P(e,"BUTTON")&&(f=e.type.toLowerCase(),"submit"==f)){f=i;break a}f=l}if(f)break}if(e=Bb(c.l)){e=c.l;Bb(e)||g(new y(15,"Element is not selectable"));f="selected";m=e.type&&e.type.toLowerCase();if("checkbox"==m||"radio"==m)f="checked";e=!!Eb(e,f)}if(c.ba&&(f=c.ba,!e||f.multiple))c.l.selected=!e,Ub(f,hc);Rb(c,
+ic,b,d)&&a&&ac(a)&&(b=a.href,d=G(E(a)),a.target?d.open(b,a.target):d.location.href=b)}c.Z&&Z(c,kc);c.Z=!c.Z}else 2==c.z&&Z(c,jc);c.z=k;c.ha=k}var ud=["_"],$=q;!(ud[0]in $)&&$.execScript&&$.execScript("var "+ud[0]);for(var wd;ud.length&&(wd=ud.shift());)!ud.length&&r(td)?$[wd]=td:$=$[wd]?$[wd]:$[wd]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
+//getAttributeValue
+var getAttributeValue = function(){return function(){var f=null,g=!1,h=this;
+function i(a){var c=typeof a;if("object"==c)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return c;var b=Object.prototype.toString.call(a);if("[object Window]"==b)return"object";if("[object Array]"==b||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==b||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if("function"==
+c&&"undefined"==typeof a.call)return"object";return c}function j(a,c){function b(){}b.prototype=c.prototype;a.f=c.prototype;a.prototype=new b};function k(a,c){for(var b=1;b<arguments.length;b++)var d=(""+arguments[b]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,d);return a}function l(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")};var m,n="",o=/rv\:([^\);]+)(\)|;)/.exec(h.navigator?h.navigator.userAgent:f);m=n=o?o[1]:"";var p={};function q(a,c){this.code=a;this.message=c||"";this.name=r[a]||r[13];var b=Error(this.message);b.name=this.name;this.stack=b.stack||""}j(q,Error);
+var r={7:"NoSuchElementError",8:"NoSuchFrameError",9:"UnknownCommandError",10:"StaleElementReferenceError",11:"ElementNotVisibleError",12:"InvalidElementStateError",13:"UnknownError",15:"ElementNotSelectableError",19:"XPathLookupError",23:"NoSuchWindowError",24:"InvalidCookieDomainError",25:"UnableToSetCookieError",26:"ModalDialogOpenedError",27:"NoModalDialogOpenError",28:"ScriptTimeoutError",32:"InvalidSelectorError",33:"SqlDatabaseError",34:"MoveTargetOutOfBoundsError"};
+q.prototype.toString=function(){return"["+this.name+"] "+this.message};function s(a){this.stack=Error().stack||"";a&&(this.message=""+a)}j(s,Error);s.prototype.name="CustomError";function t(a,c){c.unshift(a);s.call(this,k.apply(f,c));c.shift()}j(t,s);t.prototype.name="AssertionError";function u(a,c){if("string"==typeof a)return"string"!=typeof c||1!=c.length?-1:a.indexOf(c,0);for(var b=0;b<a.length;b++)if(b in a&&a[b]===c)return b;return-1};if(!p["1.9.1"]){for(var v=0,w=l(""+m).split("."),x=l("1.9.1").split("."),y=Math.max(w.length,x.length),z=0;0==v&&z<y;z++){var A=w[z]||"",B=x[z]||"",C=RegExp("(\\d*)(\\D*)","g"),D=RegExp("(\\d*)(\\D*)","g");do{var E=C.exec(A)||["","",""],F=D.exec(B)||["","",""];if(0==E[0].length&&0==F[0].length)break;v=((0==E[1].length?0:parseInt(E[1],10))<(0==F[1].length?0:parseInt(F[1],10))?-1:(0==E[1].length?0:parseInt(E[1],10))>(0==F[1].length?0:parseInt(F[1],10))?1:0)||((0==E[2].length)<(0==F[2].length)?-1:(0==
+E[2].length)>(0==F[2].length)?1:0)||(E[2]<F[2]?-1:E[2]>F[2]?1:0)}while(0==v)}p["1.9.1"]=0<=v};var G={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},H={IMG:" ",BR:"\n"};function I(a,c,b){if(!(a.nodeName in G))if(3==a.nodeType)b?c.push((""+a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):c.push(a.nodeValue);else if(a.nodeName in H)c.push(H[a.nodeName]);else for(a=a.firstChild;a;)I(a,c,b),a=a.nextSibling};(function(){var a=h.Components;if(!a)return g;try{if(!a.classes)return g}catch(c){return g}var b=a.classes,a=a.interfaces;b["@mozilla.org/xpcom/version-comparator;1"].getService(a.nsIVersionComparator);b["@mozilla.org/xre/app-info;1"].getService(a.nsIXULAppInfo);return!0})();var J="StopIteration"in h?h.StopIteration:Error("StopIteration");function K(){}K.prototype.next=function(){throw J;};function L(a,c,b,d,e){this.a=!!c;a&&M(this,a,d);this.depth=void 0!=e?e:this.c||0;this.a&&(this.depth*=-1);this.e=!b}j(L,K);L.prototype.b=f;L.prototype.c=0;L.prototype.d=g;function M(a,c,b){if(a.b=c)a.c="number"==typeof b?b:1!=a.b.nodeType?0:a.a?-1:1}
+L.prototype.next=function(){var a;if(this.d){if(!this.b||this.e&&0==this.depth)throw J;a=this.b;var c=this.a?-1:1;if(this.c==c){var b=this.a?a.lastChild:a.firstChild;b?M(this,b):M(this,a,-1*c)}else(b=this.a?a.previousSibling:a.nextSibling)?M(this,b):M(this,a.parentNode,-1*c);this.depth+=this.c*(this.a?-1:1)}else this.d=!0;a=this.b;if(!this.b)throw J;return a};
+L.prototype.splice=function(a){var c=this.b,b=this.a?1:-1;this.c==b&&(this.c=-1*b,this.depth+=this.c*(this.a?-1:1));this.a=!this.a;L.prototype.next.call(this);this.a=!this.a;for(var b=arguments[0],d=i(b),b="array"==d||"object"==d&&"number"==typeof b.length?arguments[0]:arguments,d=b.length-1;0<=d;d--)c.parentNode&&c.parentNode.insertBefore(b[d],c.nextSibling);c&&c.parentNode&&c.parentNode.removeChild(c)};function N(a,c,b,d){L.call(this,a,c,b,f,d)}j(N,L);N.prototype.next=function(){do N.f.next.call(this);while(-1==this.c);return this.b};function O(a,c){return!!a&&1==a.nodeType&&(!c||a.tagName.toUpperCase()==c)}function P(a){return O(a,"OPTION")?!0:O(a,"INPUT")?(a=a.type.toLowerCase(),"checkbox"==a||"radio"==a):g}var Q={"class":"className",readonly:"readOnly"},R=["checked","disabled","draggable","hidden"];
+function S(a,c){var b=Q[c]||c,d=a[b];if(void 0===d&&0<=u(R,b))return g;if(b="value"==c)if(b=O(a,"OPTION")){var e;b=c.toLowerCase();if(a.hasAttribute)e=a.hasAttribute(b);else try{e=a.attributes[b].specified}catch(Y){e=g}b=!e}b&&(d=[],I(a,d,g),d=d.join(""));return d}var T="async,autofocus,autoplay,checked,compact,complete,controls,declare,defaultchecked,defaultselected,defer,disabled,draggable,ended,formnovalidate,hidden,indeterminate,iscontenteditable,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,paused,pubdate,readonly,required,reversed,scoped,seamless,seeking,selected,spellcheck,truespeed,willvalidate".split(",");
+function U(a,c){if(8==a.nodeType)return f;c=c.toLowerCase();if("style"==c){var b=l(a.style.cssText).toLowerCase();return b=";"==b.charAt(b.length-1)?b:b+";"}b=a.getAttributeNode(c);return!b?f:0<=u(T,c)?"true":b.specified?b.value:f};function V(a,c){var b=f,d=c.toLowerCase();if("style"==c.toLowerCase()){if((b=a.style)&&"string"!=typeof b)b=b.cssText;return b}if("selected"==d||"checked"==d&&P(a)){if(!P(a))throw new q(15,"Element is not selectable");var e="selected",d=a.type&&a.type.toLowerCase();if("checkbox"==d||"radio"==d)e="checked";return S(a,e)?"true":f}b=O(a,"A");if(O(a,"IMG")&&"src"==d||b&&"href"==d)return(b=U(a,d))&&(b=S(a,d)),b;try{e=S(a,c)}catch(Y){}if(!(d=e==f))d=i(e),d="object"==d||"array"==d||"function"==d;b=d?U(a,
+c):e;return b!=f?b.toString():f}var W=["_"],X=h;!(W[0]in X)&&X.execScript&&X.execScript("var "+W[0]);for(var Z;W.length&&(Z=W.shift());)!W.length&&void 0!==V?X[Z]=V:X=X[Z]?X[Z]:X[Z]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
+//getElementText
+var getElementText = function(){return function(){var g=void 0,h=!0,i=null,j=!1,k=this;
+function l(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
+else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function m(a){return"string"==typeof a}function n(a,b){function c(){}c.prototype=b.prototype;a.h=b.prototype;a.prototype=new c};function o(a){var b=a.length-1;return 0<=b&&a.indexOf(" ",b)==b}function aa(a,b){for(var c=1;c<arguments.length;c++)var d=(""+arguments[c]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,d);return a}function p(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}var q={};function ba(a){return q[a]||(q[a]=(""+a).replace(/\-([a-z])/g,function(a,c){return c.toUpperCase()}))};var s,ca="",u=/rv\:([^\);]+)(\)|;)/.exec(k.navigator?k.navigator.userAgent:i);s=ca=u?u[1]:"";var v={};var da=window;function w(a,b){this.code=a;this.message=b||"";this.name=x[a]||x[13];var c=Error(this.message);c.name=this.name;this.stack=c.stack||""}n(w,Error);
+var x={7:"NoSuchElementError",8:"NoSuchFrameError",9:"UnknownCommandError",10:"StaleElementReferenceError",11:"ElementNotVisibleError",12:"InvalidElementStateError",13:"UnknownError",15:"ElementNotSelectableError",19:"XPathLookupError",23:"NoSuchWindowError",24:"InvalidCookieDomainError",25:"UnableToSetCookieError",26:"ModalDialogOpenedError",27:"NoModalDialogOpenError",28:"ScriptTimeoutError",32:"InvalidSelectorError",33:"SqlDatabaseError",34:"MoveTargetOutOfBoundsError"};
+w.prototype.toString=function(){return"["+this.name+"] "+this.message};function y(a){this.stack=Error().stack||"";a&&(this.message=""+a)}n(y,Error);y.prototype.name="CustomError";function z(a,b){b.unshift(a);y.call(this,aa.apply(i,b));b.shift()}n(z,y);z.prototype.name="AssertionError";function ea(a,b){for(var c=a.length,d=m(a)?a.split(""):a,e=0;e<c;e++)e in d&&b.call(g,d[e],e,a)}function fa(a,b){for(var c=a.length,d=m(a)?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(g,d[e],e,a))return h;return j}function A(a,b){var c;a:if(m(a))c=!m(b)||1!=b.length?-1:a.indexOf(b,0);else{for(c=0;c<a.length;c++)if(c in a&&a[c]===b)break a;c=-1}return 0<=c};var B;
+if(!v["1.9.1"]){for(var C=0,D=p(""+s).split("."),E=p("1.9.1").split("."),ga=Math.max(D.length,E.length),F=0;0==C&&F<ga;F++){var ha=D[F]||"",ia=E[F]||"",ja=RegExp("(\\d*)(\\D*)","g"),ka=RegExp("(\\d*)(\\D*)","g");do{var G=ja.exec(ha)||["","",""],H=ka.exec(ia)||["","",""];if(0==G[0].length&&0==H[0].length)break;C=((0==G[1].length?0:parseInt(G[1],10))<(0==H[1].length?0:parseInt(H[1],10))?-1:(0==G[1].length?0:parseInt(G[1],10))>(0==H[1].length?0:parseInt(H[1],10))?1:0)||((0==G[2].length)<(0==H[2].length)?-1:
+(0==G[2].length)>(0==H[2].length)?1:0)||(G[2]<H[2]?-1:G[2]>H[2]?1:0)}while(0==C)}v["1.9.1"]=0<=C};function I(a,b){this.x=a!==g?a:0;this.y=b!==g?b:0}I.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function J(a,b){this.width=a;this.height=b}J.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};var K=3;function L(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function la(a,b){var c=[];return M(a,b,c,h)?c[0]:g}function M(a,b,c,d){if(a!=i)for(a=a.firstChild;a;){if(b(a)&&(c.push(a),d)||M(a,b,c,d))return h;a=a.nextSibling}return j}function ma(a,b){for(var a=a.parentNode,c=0;a;){if(b(a))return a;a=a.parentNode;c++}return i}function N(a){this.g=a||k.document||document}
+function na(a){var b=a.g,a="CSS1Compat"==b.compatMode?b.documentElement:b.body,b=b.parentWindow||b.defaultView;return new I(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)};var oa=function(){var a={i:"http://www.w3.org/2000/svg"};return function(b){return a[b]||i}}();
+function pa(a,b){var c=function(){var c;a:{var e=L(b);if(e.implementation.hasFeature("XPath","3.0")){try{var f=e.createNSResolver?e.createNSResolver(e.documentElement):oa;c=e.evaluate(a,b,f,9,i);break a}catch(r){if("NS_ERROR_ILLEGAL_VALUE"!=r.name)throw new w(32,"Unable to locate an element with the xpath expression "+a+" because of the following error:\n"+r);}c=g}else c=i}return c?c.singleNodeValue||i:b.selectSingleNode?(c=L(b),c.setProperty&&c.setProperty("SelectionLanguage","XPath"),b.selectSingleNode(a)):
+i}();if(c!==i&&(!c||1!=c.nodeType))throw new w(32,'The result of the xpath expression "'+a+'" is: '+c+". It should be an element.");return c};(function(){var a=k.Components;if(!a)return j;try{if(!a.classes)return j}catch(b){return j}var c=a.classes,a=a.interfaces;c["@mozilla.org/xpcom/version-comparator;1"].getService(a.nsIVersionComparator);c["@mozilla.org/xre/app-info;1"].getService(a.nsIXULAppInfo);return h})();var P="StopIteration"in k?k.StopIteration:Error("StopIteration");function qa(){}qa.prototype.next=function(){throw P;};function Q(a,b,c,d,e){this.a=!!b;a&&R(this,a,d);this.depth=e!=g?e:this.c||0;this.a&&(this.depth*=-1);this.f=!c}n(Q,qa);Q.prototype.b=i;Q.prototype.c=0;Q.prototype.e=j;function R(a,b,c){if(a.b=b)a.c="number"==typeof c?c:1!=a.b.nodeType?0:a.a?-1:1}
+Q.prototype.next=function(){var a;if(this.e){if(!this.b||this.f&&0==this.depth)throw P;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?R(this,c):R(this,a,-1*b)}else(c=this.a?a.previousSibling:a.nextSibling)?R(this,c):R(this,a.parentNode,-1*b);this.depth+=this.c*(this.a?-1:1)}else this.e=h;a=this.b;if(!this.b)throw P;return a};
+Q.prototype.splice=function(a){var b=this.b,c=this.a?1:-1;this.c==c&&(this.c=-1*c,this.depth+=this.c*(this.a?-1:1));this.a=!this.a;Q.prototype.next.call(this);this.a=!this.a;for(var c=arguments[0],d=l(c),c="array"==d||"object"==d&&"number"==typeof c.length?arguments[0]:arguments,d=c.length-1;0<=d;d--)b.parentNode&&b.parentNode.insertBefore(c[d],b.nextSibling);b&&b.parentNode&&b.parentNode.removeChild(b)};function S(a,b,c,d){Q.call(this,a,b,c,i,d)}n(S,Q);S.prototype.next=function(){do S.h.next.call(this);while(-1==this.c);return this.b};function ra(a,b){var c=L(a);return c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(a,i))?c[b]||c.getPropertyValue(b):""}function T(a,b){return ra(a,b)||(a.currentStyle?a.currentStyle[b]:i)||a.style&&a.style[b]}
+function sa(a){for(var b=L(a),c=T(a,"position"),d="fixed"==c||"absolute"==c,a=a.parentNode;a&&a!=b;a=a.parentNode)if(c=T(a,"position"),d=d&&"static"==c&&a!=b.documentElement&&a!=b.body,!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||"fixed"==c||"absolute"==c||"relative"==c))return a;return i}
+function ta(a){var b=new I;if(1==a.nodeType)if(a.getBoundingClientRect)a=a.getBoundingClientRect(),b.x=a.left,b.y=a.top;else{var c=na(a?new N(L(a)):B||(B=new N));var d,e=L(a),f=T(a,"position"),r=e.getBoxObjectFor&&!a.getBoundingClientRect&&"absolute"==f&&(d=e.getBoxObjectFor(a))&&(0>d.screenX||0>d.screenY),f=new I(0,0),t=(e?9==e.nodeType?e:L(e):document).documentElement;if(a!=t)if(a.getBoundingClientRect)d=a.getBoundingClientRect(),a=na(e?new N(L(e)):B||(B=new N)),f.x=d.left+a.x,f.y=d.top+a.y;else if(e.getBoxObjectFor&&
+!r)d=e.getBoxObjectFor(a),a=e.getBoxObjectFor(t),f.x=d.screenX-a.screenX,f.y=d.screenY-a.screenY;else{d=a;do f.x+=d.offsetLeft,f.y+=d.offsetTop,d!=a&&(f.x+=d.clientLeft||0,f.y+=d.clientTop||0),d=d.offsetParent;while(d&&d!=a);for(d=a;(d=sa(d))&&d!=e.body&&d!=t;)f.x-=d.scrollLeft,f.y-=d.scrollTop}b.x=f.x-c.x;b.y=f.y-c.y}else c="function"==l(a.d),d=a,a.targetTouches?d=a.targetTouches[0]:c&&a.d().targetTouches&&(d=a.d().targetTouches[0]),b.x=d.clientX,b.y=d.clientY;return b}
+function ua(a){var b=a.offsetWidth,c=a.offsetHeight;return b===g&&a.getBoundingClientRect?(a=a.getBoundingClientRect(),new J(a.right-a.left,a.bottom-a.top)):new J(b,c)};function U(a,b){return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}var va="async,autofocus,autoplay,checked,compact,complete,controls,declare,defaultchecked,defaultselected,defer,disabled,draggable,ended,formnovalidate,hidden,indeterminate,iscontenteditable,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,paused,pubdate,readonly,required,reversed,scoped,seamless,seeking,selected,spellcheck,truespeed,willvalidate".split(",");
+function V(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return U(a)?a:i}function W(a,b){b=ba(b);return ra(a,b)||wa(a,b)}function wa(a,b){var c=a.currentStyle||a.style,d=c[b];d===g&&"function"==l(c.getPropertyValue)&&(d=c.getPropertyValue(b));return"inherit"!=d?d!==g?d:i:(c=V(a))?wa(c,b):i}
+function xa(a){if("function"==l(a.getBBox))try{var b=a.getBBox();if(b)return b}catch(c){}if("none"!=T(a,"display"))a=ua(a);else{var b=a.style,d=b.display,e=b.visibility,f=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";a=ua(a);b.display=d;b.position=f;b.visibility=e}return a}
+function X(a,b){function c(a){if("none"==W(a,"display"))return j;a=V(a);return!a||c(a)}function d(a){var b=xa(a);return 0<b.height&&0<b.width?h:fa(a.childNodes,function(a){return a.nodeType==K||U(a)&&d(a)})}function e(a){var b=V(a);if(b&&"hidden"==W(b,"overflow")){var c=xa(b),d=ta(b),a=ta(a);return d.x+c.width<a.x||d.y+c.height<a.y?j:e(b)}return h}if(!U(a))throw Error("Argument to isShown must be of type Element");if(U(a,"OPTION")||U(a,"OPTGROUP")){var f=ma(a,function(a){return U(a,"SELECT")});return!!f&&
+X(f,h)}if(U(a,"MAP")){if(!a.name)return j;f=L(a);f=f.evaluate?pa('/descendant::*[@usemap = "#'+a.name+'"]',f):la(f,function(b){var c;if(c=U(b))8==b.nodeType?b=i:(c="usemap","style"==c?(b=p(b.style.cssText).toLowerCase(),b=";"==b.charAt(b.length-1)?b:b+";"):(b=b.getAttributeNode(c),b=!b?i:A(va,c)?"true":b.specified?b.value:i)),c=b=="#"+a.name;return c});return!!f&&X(f,b)}return U(a,"AREA")?(f=ma(a,function(a){return U(a,"MAP")}),!!f&&X(f,b)):U(a,"INPUT")&&"hidden"==a.type.toLowerCase()||U(a,"NOSCRIPT")||
+"hidden"==W(a,"visibility")||!c(a)||!b&&0==ya(a)||!d(a)||!e(a)?j:h}function za(a){return a.replace(/^[^\S\xa0]+|[^\S\xa0]+$/g,"")}
+function Aa(a,b){if(U(a,"BR"))b.push("");else{var c=U(a,"TD"),d=W(a,"display"),e=!c&&!A(Ba,d);e&&!/^[\s\xa0]*$/.test(b[b.length-1]||"")&&b.push("");var f=X(a),r=i,t=i;f&&(r=W(a,"white-space"),t=W(a,"text-transform"));ea(a.childNodes,function(a){a.nodeType==K&&f?Ca(a,b,r,t):U(a)&&Aa(a,b)});var O=b[b.length-1]||"";if((c||"table-cell"==d)&&O&&!o(O))b[b.length-1]+=" ";e&&!/^[\s\xa0]*$/.test(O)&&b.push("")}}var Ba="inline,inline-block,inline-table,none,table-cell,table-column,table-column-group".split(",");
+function Ca(a,b,c,d){a=a.nodeValue.replace(/\u200b/g,"");a=a.replace(/(\r\n|\r|\n)/g,"\n");if("normal"==c||"nowrap"==c)a=a.replace(/\n/g," ");a="pre"==c||"pre-wrap"==c?a.replace(/[ \f\t\v\u2028\u2029]/g,"\u00a0"):a.replace(/[\ \f\t\v\u2028\u2029]+/g," ");"capitalize"==d?a=a.replace(/(^|\s)(\S)/g,function(a,b,c){return b+c.toUpperCase()}):"uppercase"==d?a=a.toUpperCase():"lowercase"==d&&(a=a.toLowerCase());c=b.pop()||"";o(c)&&0==a.lastIndexOf(" ",0)&&(a=a.substr(1));b.push(c+a)}
+function ya(a){var b=1,c=W(a,"opacity");c&&(b=Number(c));(a=V(a))&&(b*=ya(a));return b};function Da(a){var b;a:{for(b=a;b;){if(b.tagName&&"head"==b.tagName.toLowerCase()){b=h;break a}try{b=b.parentNode}catch(c){break}}b=j}if(b)return b=L(a),"TITLE"==a.tagName.toUpperCase()&&(b?b.parentWindow||b.defaultView:window)==da.top?p(b.title):"";b=[];Aa(a,b);var d=b,a=d.length;b=Array(a);for(var d=m(d)?d.split(""):d,e=0;e<a;e++)e in d&&(b[e]=za.call(g,d[e]));return za(b.join("\n")).replace(/\xa0/g," ")}var Y=["_"],Z=k;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);
+for(var $;Y.length&&($=Y.shift());)!Y.length&&Da!==g?Z[$]=Da:Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
+//isElementDisplayed
+var isElementDisplayed = function(){return function(){var g=void 0,h=!0,i=null,j=!1,k=this;
+function l(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
+else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function m(a,b){function c(){}c.prototype=b.prototype;a.h=b.prototype;a.prototype=new c};function aa(a,b){for(var c=1;c<arguments.length;c++)var d=(""+arguments[c]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,d);return a}function n(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}var o={};function ba(a){return o[a]||(o[a]=(""+a).replace(/\-([a-z])/g,function(a,c){return c.toUpperCase()}))};var p,ca="",q=/rv\:([^\);]+)(\)|;)/.exec(k.navigator?k.navigator.userAgent:i);p=ca=q?q[1]:"";var r={};function s(a,b){this.code=a;this.message=b||"";this.name=t[a]||t[13];var c=Error(this.message);c.name=this.name;this.stack=c.stack||""}m(s,Error);
+var t={7:"NoSuchElementError",8:"NoSuchFrameError",9:"UnknownCommandError",10:"StaleElementReferenceError",11:"ElementNotVisibleError",12:"InvalidElementStateError",13:"UnknownError",15:"ElementNotSelectableError",19:"XPathLookupError",23:"NoSuchWindowError",24:"InvalidCookieDomainError",25:"UnableToSetCookieError",26:"ModalDialogOpenedError",27:"NoModalDialogOpenError",28:"ScriptTimeoutError",32:"InvalidSelectorError",33:"SqlDatabaseError",34:"MoveTargetOutOfBoundsError"};
+s.prototype.toString=function(){return"["+this.name+"] "+this.message};function u(a){this.stack=Error().stack||"";a&&(this.message=""+a)}m(u,Error);u.prototype.name="CustomError";function v(a,b){b.unshift(a);u.call(this,aa.apply(i,b));b.shift()}m(v,u);v.prototype.name="AssertionError";function da(a,b){for(var c=a.length,d="string"==typeof a?a.split(""):a,f=0;f<c;f++)if(f in d&&b.call(g,d[f],f,a))return h;return j};var w;
+if(!r["1.9.1"]){for(var x=0,y=n(""+p).split("."),z=n("1.9.1").split("."),ea=Math.max(y.length,z.length),A=0;0==x&&A<ea;A++){var fa=y[A]||"",ga=z[A]||"",ha=RegExp("(\\d*)(\\D*)","g"),ia=RegExp("(\\d*)(\\D*)","g");do{var B=ha.exec(fa)||["","",""],C=ia.exec(ga)||["","",""];if(0==B[0].length&&0==C[0].length)break;x=((0==B[1].length?0:parseInt(B[1],10))<(0==C[1].length?0:parseInt(C[1],10))?-1:(0==B[1].length?0:parseInt(B[1],10))>(0==C[1].length?0:parseInt(C[1],10))?1:0)||((0==B[2].length)<(0==C[2].length)?-1:
+(0==B[2].length)>(0==C[2].length)?1:0)||(B[2]<C[2]?-1:B[2]>C[2]?1:0)}while(0==x)}r["1.9.1"]=0<=x};function D(a,b){this.x=a!==g?a:0;this.y=b!==g?b:0}D.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function F(a,b){this.width=a;this.height=b}F.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};var ja=3;function G(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function ka(a,b){var c=[];return H(a,b,c,h)?c[0]:g}function H(a,b,c,d){if(a!=i)for(a=a.firstChild;a;){if(b(a)&&(c.push(a),d)||H(a,b,c,d))return h;a=a.nextSibling}return j}function I(a,b){for(var a=a.parentNode,c=0;a;){if(b(a))return a;a=a.parentNode;c++}return i}function J(a){this.g=a||k.document||document}
+function K(a){var b=a.g,a="CSS1Compat"==b.compatMode?b.documentElement:b.body,b=b.parentWindow||b.defaultView;return new D(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)};var la=function(){var a={i:"http://www.w3.org/2000/svg"};return function(b){return a[b]||i}}();
+function ma(a,b){var c=function(){var c;a:{var f=G(b);if(f.implementation.hasFeature("XPath","3.0")){try{var e=f.createNSResolver?f.createNSResolver(f.documentElement):la;c=f.evaluate(a,b,e,9,i);break a}catch(E){if("NS_ERROR_ILLEGAL_VALUE"!=E.name)throw new s(32,"Unable to locate an element with the xpath expression "+a+" because of the following error:\n"+E);}c=g}else c=i}return c?c.singleNodeValue||i:b.selectSingleNode?(c=G(b),c.setProperty&&c.setProperty("SelectionLanguage","XPath"),b.selectSingleNode(a)):
+i}();if(c!==i&&(!c||1!=c.nodeType))throw new s(32,'The result of the xpath expression "'+a+'" is: '+c+". It should be an element.");return c};(function(){var a=k.Components;if(!a)return j;try{if(!a.classes)return j}catch(b){return j}var c=a.classes,a=a.interfaces;c["@mozilla.org/xpcom/version-comparator;1"].getService(a.nsIVersionComparator);c["@mozilla.org/xre/app-info;1"].getService(a.nsIXULAppInfo);return h})();var L="StopIteration"in k?k.StopIteration:Error("StopIteration");function M(){}M.prototype.next=function(){throw L;};function O(a,b,c,d,f){this.a=!!b;a&&P(this,a,d);this.depth=f!=g?f:this.c||0;this.a&&(this.depth*=-1);this.f=!c}m(O,M);O.prototype.b=i;O.prototype.c=0;O.prototype.e=j;function P(a,b,c){if(a.b=b)a.c="number"==typeof c?c:1!=a.b.nodeType?0:a.a?-1:1}
+O.prototype.next=function(){var a;if(this.e){if(!this.b||this.f&&0==this.depth)throw L;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?P(this,c):P(this,a,-1*b)}else(c=this.a?a.previousSibling:a.nextSibling)?P(this,c):P(this,a.parentNode,-1*b);this.depth+=this.c*(this.a?-1:1)}else this.e=h;a=this.b;if(!this.b)throw L;return a};
+O.prototype.splice=function(a){var b=this.b,c=this.a?1:-1;this.c==c&&(this.c=-1*c,this.depth+=this.c*(this.a?-1:1));this.a=!this.a;O.prototype.next.call(this);this.a=!this.a;for(var c=arguments[0],d=l(c),c="array"==d||"object"==d&&"number"==typeof c.length?arguments[0]:arguments,d=c.length-1;0<=d;d--)b.parentNode&&b.parentNode.insertBefore(c[d],b.nextSibling);b&&b.parentNode&&b.parentNode.removeChild(b)};function Q(a,b,c,d){O.call(this,a,b,c,i,d)}m(Q,O);Q.prototype.next=function(){do Q.h.next.call(this);while(-1==this.c);return this.b};function R(a,b){var c=G(a);return c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(a,i))?c[b]||c.getPropertyValue(b):""}function S(a,b){return R(a,b)||(a.currentStyle?a.currentStyle[b]:i)||a.style&&a.style[b]}
+function na(a){for(var b=G(a),c=S(a,"position"),d="fixed"==c||"absolute"==c,a=a.parentNode;a&&a!=b;a=a.parentNode)if(c=S(a,"position"),d=d&&"static"==c&&a!=b.documentElement&&a!=b.body,!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||"fixed"==c||"absolute"==c||"relative"==c))return a;return i}
+function oa(a){var b=new D;if(1==a.nodeType)if(a.getBoundingClientRect)a=a.getBoundingClientRect(),b.x=a.left,b.y=a.top;else{var c=K(a?new J(G(a)):w||(w=new J));var d,f=G(a),e=S(a,"position"),E=f.getBoxObjectFor&&!a.getBoundingClientRect&&"absolute"==e&&(d=f.getBoxObjectFor(a))&&(0>d.screenX||0>d.screenY),e=new D(0,0),N=(f?9==f.nodeType?f:G(f):document).documentElement;if(a!=N)if(a.getBoundingClientRect)d=a.getBoundingClientRect(),a=K(f?new J(G(f)):w||(w=new J)),e.x=d.left+a.x,e.y=d.top+a.y;else if(f.getBoxObjectFor&&
+!E)d=f.getBoxObjectFor(a),a=f.getBoxObjectFor(N),e.x=d.screenX-a.screenX,e.y=d.screenY-a.screenY;else{d=a;do e.x+=d.offsetLeft,e.y+=d.offsetTop,d!=a&&(e.x+=d.clientLeft||0,e.y+=d.clientTop||0),d=d.offsetParent;while(d&&d!=a);for(d=a;(d=na(d))&&d!=f.body&&d!=N;)e.x-=d.scrollLeft,e.y-=d.scrollTop}b.x=e.x-c.x;b.y=e.y-c.y}else c="function"==l(a.d),d=a,a.targetTouches?d=a.targetTouches[0]:c&&a.d().targetTouches&&(d=a.d().targetTouches[0]),b.x=d.clientX,b.y=d.clientY;return b}
+function pa(a){var b=a.offsetWidth,c=a.offsetHeight;return b===g&&a.getBoundingClientRect?(a=a.getBoundingClientRect(),new F(a.right-a.left,a.bottom-a.top)):new F(b,c)};function T(a,b){return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}var U="async,autofocus,autoplay,checked,compact,complete,controls,declare,defaultchecked,defaultselected,defer,disabled,draggable,ended,formnovalidate,hidden,indeterminate,iscontenteditable,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,paused,pubdate,readonly,required,reversed,scoped,seamless,seeking,selected,spellcheck,truespeed,willvalidate".split(",");
+function V(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return T(a)?a:i}function W(a,b){b=ba(b);return R(a,b)||qa(a,b)}function qa(a,b){var c=a.currentStyle||a.style,d=c[b];d===g&&"function"==l(c.getPropertyValue)&&(d=c.getPropertyValue(b));return"inherit"!=d?d!==g?d:i:(c=V(a))?qa(c,b):i}
+function ra(a){if("function"==l(a.getBBox))try{var b=a.getBBox();if(b)return b}catch(c){}if("none"!=S(a,"display"))a=pa(a);else{var b=a.style,d=b.display,f=b.visibility,e=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";a=pa(a);b.display=d;b.position=e;b.visibility=f}return a}
+function X(a,b){function c(a){if("none"==W(a,"display"))return j;a=V(a);return!a||c(a)}function d(a){var b=ra(a);return 0<b.height&&0<b.width?h:da(a.childNodes,function(a){return a.nodeType==ja||T(a)&&d(a)})}function f(a){var b=V(a);if(b&&"hidden"==W(b,"overflow")){var c=ra(b),d=oa(b),a=oa(a);return d.x+c.width<a.x||d.y+c.height<a.y?j:f(b)}return h}if(!T(a))throw Error("Argument to isShown must be of type Element");if(T(a,"OPTION")||T(a,"OPTGROUP")){var e=I(a,function(a){return T(a,"SELECT")});return!!e&&
+X(e,h)}if(T(a,"MAP")){if(!a.name)return j;e=G(a);e=e.evaluate?ma('/descendant::*[@usemap = "#'+a.name+'"]',e):ka(e,function(b){var c;if(c=T(b)){if(8==b.nodeType)c=i;else if(c="usemap","style"==c)c=n(b.style.cssText).toLowerCase(),c=";"==c.charAt(c.length-1)?c:c+";";else if(b=b.getAttributeNode(c)){b:if("string"==typeof U)c="string"!=typeof c||1!=c.length?-1:U.indexOf(c,0);else{for(var d=0;d<U.length;d++)if(d in U&&U[d]===c){c=d;break b}c=-1}c=0<=c?"true":b.specified?b.value:i}else c=i;c=c=="#"+a.name}return c});
+return!!e&&X(e,b)}return T(a,"AREA")?(e=I(a,function(a){return T(a,"MAP")}),!!e&&X(e,b)):T(a,"INPUT")&&"hidden"==a.type.toLowerCase()||T(a,"NOSCRIPT")||"hidden"==W(a,"visibility")||!c(a)||!b&&0==sa(a)||!d(a)||!f(a)?j:h}function sa(a){var b=1,c=W(a,"opacity");c&&(b=Number(c));(a=V(a))&&(b*=sa(a));return b};var ta=X,Y=["_"],Z=k;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)!Y.length&&ta!==g?Z[$]=ta:Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
+//isElementEnabled
+var isElementEnabled = function(){return function(){var e=this;function f(a,c){function b(){}b.prototype=c.prototype;a.d=c.prototype;a.prototype=new b};function g(a,c){for(var b=1;b<arguments.length;b++)var d=(""+arguments[b]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,d);return a};var h,i="",j=/rv\:([^\);]+)(\)|;)/.exec(e.navigator?e.navigator.userAgent:null);h=i=j?j[1]:"";var k={};function l(a,c){this.code=a;this.message=c||"";this.name=m[a]||m[13];var b=Error(this.message);b.name=this.name;this.stack=b.stack||""}f(l,Error);
+var m={7:"NoSuchElementError",8:"NoSuchFrameError",9:"UnknownCommandError",10:"StaleElementReferenceError",11:"ElementNotVisibleError",12:"InvalidElementStateError",13:"UnknownError",15:"ElementNotSelectableError",19:"XPathLookupError",23:"NoSuchWindowError",24:"InvalidCookieDomainError",25:"UnableToSetCookieError",26:"ModalDialogOpenedError",27:"NoModalDialogOpenError",28:"ScriptTimeoutError",32:"InvalidSelectorError",33:"SqlDatabaseError",34:"MoveTargetOutOfBoundsError"};
+l.prototype.toString=function(){return"["+this.name+"] "+this.message};function n(a){this.stack=Error().stack||"";a&&(this.message=""+a)}f(n,Error);n.prototype.name="CustomError";function o(a,c){c.unshift(a);n.call(this,g.apply(null,c));c.shift()}f(o,n);o.prototype.name="AssertionError";function p(a,c){var b;a:if("string"==typeof a)b="string"!=typeof c||1!=c.length?-1:a.indexOf(c,0);else{for(b=0;b<a.length;b++)if(b in a&&a[b]===c)break a;b=-1}return 0<=b};if(!k["1.9.1"]){for(var q=0,r=(""+h).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),s="1.9.1".replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),t=Math.max(r.length,s.length),u=0;0==q&&u<t;u++){var v=r[u]||"",w=s[u]||"",x=RegExp("(\\d*)(\\D*)","g"),z=RegExp("(\\d*)(\\D*)","g");do{var A=x.exec(v)||["","",""],B=z.exec(w)||["","",""];if(0==A[0].length&&0==B[0].length)break;q=((0==A[1].length?0:parseInt(A[1],10))<(0==B[1].length?0:parseInt(B[1],10))?-1:(0==A[1].length?0:parseInt(A[1],10))>(0==B[1].length?
+0:parseInt(B[1],10))?1:0)||((0==A[2].length)<(0==B[2].length)?-1:(0==A[2].length)>(0==B[2].length)?1:0)||(A[2]<B[2]?-1:A[2]>B[2]?1:0)}while(0==q)}k["1.9.1"]=0<=q};(function(){var a=e.Components;if(!a)return!1;try{if(!a.classes)return!1}catch(c){return!1}var b=a.classes,a=a.interfaces;b["@mozilla.org/xpcom/version-comparator;1"].getService(a.nsIVersionComparator);b["@mozilla.org/xre/app-info;1"].getService(a.nsIXULAppInfo);return!0})();function C(a,c,b,d,y){this.b=!!c;if(a&&(this.a=a))this.c="number"==typeof d?d:1!=this.a.nodeType?0:this.b?-1:1;this.depth=void 0!=y?y:this.c||0;this.b&&(this.depth*=-1)}f(C,function(){});C.prototype.a=null;C.prototype.c=0;f(function(a,c,b,d){C.call(this,a,c,0,null,d)},C);var D={"class":"className",readonly:"readOnly"},E=["checked","disabled","draggable","hidden"],F="BUTTON,INPUT,OPTGROUP,OPTION,SELECT,TEXTAREA".split(",");function G(a){var c=a.tagName.toUpperCase();if(p(F,c)){var b;b=D.disabled||"disabled";var d=a[b];b=void 0===d&&p(E,b)?!1:d;a=b?!1:a.parentNode&&1==a.parentNode.nodeType&&"OPTGROUP"==c||"OPTION"==c?G(a.parentNode):!0}else a=!0;return a};var H=G,I=["_"],J=e;!(I[0]in J)&&J.execScript&&J.execScript("var "+I[0]);for(var K;I.length&&(K=I.shift());)!I.length&&void 0!==H?J[K]=H:J=J[K]?J[K]:J[K]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
+//isElementSelected
+var isElementSelected = function(){return function(){var f=!1,g=this;function h(a,b){function c(){}c.prototype=b.prototype;a.d=b.prototype;a.prototype=new c};function i(a,b){for(var c=1;c<arguments.length;c++)var d=(""+arguments[c]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,d);return a};var k,l="",m=/rv\:([^\);]+)(\)|;)/.exec(g.navigator?g.navigator.userAgent:null);k=l=m?m[1]:"";var n={};function o(a,b){this.code=a;this.message=b||"";this.name=p[a]||p[13];var c=Error(this.message);c.name=this.name;this.stack=c.stack||""}h(o,Error);
+var p={7:"NoSuchElementError",8:"NoSuchFrameError",9:"UnknownCommandError",10:"StaleElementReferenceError",11:"ElementNotVisibleError",12:"InvalidElementStateError",13:"UnknownError",15:"ElementNotSelectableError",19:"XPathLookupError",23:"NoSuchWindowError",24:"InvalidCookieDomainError",25:"UnableToSetCookieError",26:"ModalDialogOpenedError",27:"NoModalDialogOpenError",28:"ScriptTimeoutError",32:"InvalidSelectorError",33:"SqlDatabaseError",34:"MoveTargetOutOfBoundsError"};
+o.prototype.toString=function(){return"["+this.name+"] "+this.message};function q(a){this.stack=Error().stack||"";a&&(this.message=""+a)}h(q,Error);q.prototype.name="CustomError";function r(a,b){b.unshift(a);q.call(this,i.apply(null,b));b.shift()}h(r,q);r.prototype.name="AssertionError";if(!n["1.9.1"]){for(var s=0,t=(""+k).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),u="1.9.1".replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),v=Math.max(t.length,u.length),w=0;0==s&&w<v;w++){var x=t[w]||"",y=u[w]||"",z=RegExp("(\\d*)(\\D*)","g"),A=RegExp("(\\d*)(\\D*)","g");do{var B=z.exec(x)||["","",""],C=A.exec(y)||["","",""];if(0==B[0].length&&0==C[0].length)break;s=((0==B[1].length?0:parseInt(B[1],10))<(0==C[1].length?0:parseInt(C[1],10))?-1:(0==B[1].length?0:parseInt(B[1],10))>(0==C[1].length?
+0:parseInt(C[1],10))?1:0)||((0==B[2].length)<(0==C[2].length)?-1:(0==B[2].length)>(0==C[2].length)?1:0)||(B[2]<C[2]?-1:B[2]>C[2]?1:0)}while(0==s)}n["1.9.1"]=0<=s};var D={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},E={IMG:" ",BR:"\n"};function F(a,b,c){if(!(a.nodeName in D))if(3==a.nodeType)c?b.push((""+a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in E)b.push(E[a.nodeName]);else for(a=a.firstChild;a;)F(a,b,c),a=a.nextSibling};(function(){var a=g.Components;if(!a)return f;try{if(!a.classes)return f}catch(b){return f}var c=a.classes,a=a.interfaces;c["@mozilla.org/xpcom/version-comparator;1"].getService(a.nsIVersionComparator);c["@mozilla.org/xre/app-info;1"].getService(a.nsIXULAppInfo);return!0})();function G(a,b,c,d,e){this.b=!!b;if(a&&(this.a=a))this.c="number"==typeof d?d:1!=this.a.nodeType?0:this.b?-1:1;this.depth=void 0!=e?e:this.c||0;this.b&&(this.depth*=-1)}h(G,function(){});G.prototype.a=null;G.prototype.c=0;h(function(a,b,c,d){G.call(this,a,b,0,null,d)},G);function H(a,b){return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}function I(a){return H(a,"OPTION")?!0:H(a,"INPUT")?(a=a.type.toLowerCase(),"checkbox"==a||"radio"==a):f}var J={"class":"className",readonly:"readOnly"},K=["checked","disabled","draggable","hidden"];function L(a){if(I(a)){if(!I(a))throw new o(15,"Element is not selectable");var b="selected",c=a.type&&a.type.toLowerCase();if("checkbox"==c||"radio"==c)b="checked";var c=b,d=J[c]||c,b=a[d],e;if(e=void 0===b){b:if("string"==typeof K)d="string"!=typeof d||1!=d.length?-1:K.indexOf(d,0);else{for(e=0;e<K.length;e++)if(e in K&&K[e]===d){d=e;break b}d=-1}e=0<=d}if(e)a=f;else{if(d="value"==c)if(d=H(a,"OPTION")){var j;c=c.toLowerCase();if(a.hasAttribute)j=a.hasAttribute(c);else try{j=a.attributes[c].specified}catch(P){j=
+f}d=!j}d&&(j=[],F(a,j,f),b=j.join(""));a=b}a=!!a}else a=f;return a}var M=["_"],N=g;!(M[0]in N)&&N.execScript&&N.execScript("var "+M[0]);for(var O;M.length&&(O=M.shift());)!M.length&&void 0!==L?N[O]=L:N=N[O]?N[O]:N[O]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
+//sendKeysToElement/type
+var sendKeysToElement = function(){return function(){function g(a){throw a;}var h=void 0,i=!0,k=null,l=!1;function n(a){return function(){return this[a]}}function o(a){return function(){return a}}var p,q=this;
+function aa(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
+else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function s(a){return a!==h}function ba(a){var b=aa(a);return"array"==b||"object"==b&&"number"==typeof a.length}function t(a){return"string"==typeof a}function u(a){return"function"==aa(a)}function ca(a){a=aa(a);return"object"==a||"array"==a||"function"==a}var da="closure_uid_"+Math.floor(2147483648*Math.random()).toString(36),ea=0,fa=Date.now||function(){return+new Date};
+function x(a,b){function c(){}c.prototype=b.prototype;a.aa=b.prototype;a.prototype=new c};function ga(a,b){for(var c=1;c<arguments.length;c++)var d=(""+arguments[c]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,d);return a}function ha(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}function ia(a){if(!ja.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(ka,"&amp;"));-1!=a.indexOf("<")&&(a=a.replace(la,"&lt;"));-1!=a.indexOf(">")&&(a=a.replace(ma,"&gt;"));-1!=a.indexOf('"')&&(a=a.replace(na,"&quot;"));return a}var ka=/&/g,la=/</g,ma=/>/g,na=/\"/g,ja=/[&<>\"]/;
+function oa(a,b){for(var c=0,d=ha(""+a).split("."),e=ha(""+b).split("."),f=Math.max(d.length,e.length),j=0;0==c&&j<f;j++){var m=d[j]||"",r=e[j]||"",O=RegExp("(\\d*)(\\D*)","g"),G=RegExp("(\\d*)(\\D*)","g");do{var v=O.exec(m)||["","",""],w=G.exec(r)||["","",""];if(0==v[0].length&&0==w[0].length)break;c=((0==v[1].length?0:parseInt(v[1],10))<(0==w[1].length?0:parseInt(w[1],10))?-1:(0==v[1].length?0:parseInt(v[1],10))>(0==w[1].length?0:parseInt(w[1],10))?1:0)||((0==v[2].length)<(0==w[2].length)?-1:(0==
+v[2].length)>(0==w[2].length)?1:0)||(v[2]<w[2]?-1:v[2]>w[2]?1:0)}while(0==c)}return c}var pa=2147483648*Math.random()|0,qa={};function ra(a){return qa[a]||(qa[a]=(""+a).replace(/\-([a-z])/g,function(a,c){return c.toUpperCase()}))};var sa,ta;function ua(){return q.navigator?q.navigator.userAgent:k}var va,wa=q.navigator;va=wa&&wa.platform||"";sa=-1!=va.indexOf("Mac");ta=-1!=va.indexOf("Win");var xa=-1!=va.indexOf("Linux"),ya,za="",Aa=/rv\:([^\);]+)(\)|;)/.exec(ua());ya=za=Aa?Aa[1]:"";var Ba={};var Ca=window;function Da(a,b){for(var c in a)b.call(h,a[c],c,a)}function Ea(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b};function y(a,b){this.code=a;this.message=b||"";this.name=Fa[a]||Fa[13];var c=Error(this.message);c.name=this.name;this.stack=c.stack||""}x(y,Error);
+var Fa={7:"NoSuchElementError",8:"NoSuchFrameError",9:"UnknownCommandError",10:"StaleElementReferenceError",11:"ElementNotVisibleError",12:"InvalidElementStateError",13:"UnknownError",15:"ElementNotSelectableError",19:"XPathLookupError",23:"NoSuchWindowError",24:"InvalidCookieDomainError",25:"UnableToSetCookieError",26:"ModalDialogOpenedError",27:"NoModalDialogOpenError",28:"ScriptTimeoutError",32:"InvalidSelectorError",33:"SqlDatabaseError",34:"MoveTargetOutOfBoundsError"};
+y.prototype.toString=function(){return"["+this.name+"] "+this.message};function Ga(a){this.stack=Error().stack||"";a&&(this.message=""+a)}x(Ga,Error);Ga.prototype.name="CustomError";function Ha(a,b){b.unshift(a);Ga.call(this,ga.apply(k,b));b.shift()}x(Ha,Ga);Ha.prototype.name="AssertionError";function Ia(a,b,c){if(!a){var d=Array.prototype.slice.call(arguments,2),e="Assertion failed";if(b)var e=e+(": "+b),f=d;g(new Ha(""+e,f||[]))}}function Ja(a,b){g(new Ha("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1)))};function z(a){return a[a.length-1]}var Ka=Array.prototype;function A(a,b){if(t(a))return!t(b)||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}function La(a,b){for(var c=a.length,d=t(a)?a.split(""):a,e=0;e<c;e++)e in d&&b.call(h,d[e],e,a)}function Ma(a,b){for(var c=a.length,d=Array(c),e=t(a)?a.split(""):a,f=0;f<c;f++)f in e&&(d[f]=b.call(h,e[f],f,a));return d}
+function Na(a,b,c){for(var d=a.length,e=t(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&b.call(c,e[f],f,a))return i;return l}function Oa(a,b,c){for(var d=a.length,e=t(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&!b.call(c,e[f],f,a))return l;return i}function Pa(a,b){var c;a:{c=a.length;for(var d=t(a)?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(h,d[e],e,a)){c=e;break a}c=-1}return 0>c?k:t(a)?a.charAt(c):a[c]}function Qa(a){return Ka.concat.apply(Ka,arguments)}
+function Ra(a){if("array"==aa(a))return Qa(a);for(var b=[],c=0,d=a.length;c<d;c++)b[c]=a[c];return b}function Sa(a,b,c){Ia(a.length!=k);return 2>=arguments.length?Ka.slice.call(a,b):Ka.slice.call(a,b,c)};var Ta;Ba["1.9.1"]||(Ba["1.9.1"]=0<=oa(ya,"1.9.1"));function Ua(a,b){var c;c=(c=a.className)&&"function"==typeof c.split?c.split(/\s+/):[];var d=Sa(arguments,1),e;e=c;for(var f=0,j=0;j<d.length;j++)0<=A(e,d[j])||(e.push(d[j]),f++);e=f==d.length;a.className=c.join(" ");return e};function B(a,b){this.x=s(a)?a:0;this.y=s(b)?b:0}B.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function Va(a,b){this.width=a;this.height=b}Va.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};Va.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};Va.prototype.scale=function(a){this.width*=a;this.height*=a;return this};var C=3;function Wa(a){return a?new Xa(D(a)):Ta||(Ta=new Xa)}function Ya(a,b){Da(b,function(b,d){"style"==d?a.style.cssText=b:"class"==d?a.className=b:"for"==d?a.htmlFor=b:d in Za?a.setAttribute(Za[d],b):0==d.lastIndexOf("aria-",0)?a.setAttribute(d,b):a[d]=b})}var Za={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",rowspan:"rowSpan",valign:"vAlign",height:"height",width:"width",usemap:"useMap",frameborder:"frameBorder",maxlength:"maxLength",type:"type"};
+function E(a){return a?a.parentWindow||a.defaultView:window}function $a(a,b,c){function d(c){c&&b.appendChild(t(c)?a.createTextNode(c):c)}for(var e=2;e<c.length;e++){var f=c[e];ba(f)&&!(ca(f)&&0<f.nodeType)?La(ab(f)?Ra(f):f,d):d(f)}}function bb(a){return a&&a.parentNode?a.parentNode.removeChild(a):k}
+function F(a,b){if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}
+function cb(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if("sourceIndex"in a||a.parentNode&&"sourceIndex"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==f?db(a,b):!c&&F(e,b)?-1*eb(a,b):!d&&F(f,a)?eb(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=D(a);c=d.createRange();c.selectNode(a);c.collapse(i);d=d.createRange();d.selectNode(b);d.collapse(i);
+return c.compareBoundaryPoints(q.Range.START_TO_END,d)}function eb(a,b){var c=a.parentNode;if(c==b)return-1;for(var d=b;d.parentNode!=c;)d=d.parentNode;return db(d,a)}function db(a,b){for(var c=b;c=c.previousSibling;)if(c==a)return-1;return 1}
+function fb(a){var b,c=arguments.length;if(c){if(1==c)return arguments[0]}else return k;var d=[],e=Infinity;for(b=0;b<c;b++){for(var f=[],j=arguments[b];j;)f.unshift(j),j=j.parentNode;d.push(f);e=Math.min(e,f.length)}f=k;for(b=0;b<e;b++){for(var j=d[0][b],m=1;m<c;m++)if(j!=d[m][b])return f;f=j}return f}function D(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function gb(a,b){var c=[];return hb(a,b,c,i)?c[0]:h}
+function hb(a,b,c,d){if(a!=k)for(a=a.firstChild;a;){if(b(a)&&(c.push(a),d)||hb(a,b,c,d))return i;a=a.nextSibling}return l}var ib={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},jb={IMG:" ",BR:"\n"};function kb(a,b,c){if(!(a.nodeName in ib))if(a.nodeType==C)c?b.push((""+a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in jb)b.push(jb[a.nodeName]);else for(a=a.firstChild;a;)kb(a,b,c),a=a.nextSibling}
+function ab(a){if(a&&"number"==typeof a.length){if(ca(a))return"function"==typeof a.item||"string"==typeof a.item;if(u(a))return"function"==typeof a.item}return l}function lb(a,b){for(var a=a.parentNode,c=0;a;){if(b(a))return a;a=a.parentNode;c++}return k}function Xa(a){this.A=a||q.document||document}p=Xa.prototype;p.ha=n("A");p.q=function(a){return t(a)?this.A.getElementById(a):a};
+p.fa=function(a,b,c){var d=this.A,e=arguments,f=e[1],j=d.createElement(e[0]);f&&(t(f)?j.className=f:"array"==aa(f)?Ua.apply(k,[j].concat(f)):Ya(j,f));2<e.length&&$a(d,j,e);return j};p.createElement=function(a){return this.A.createElement(a)};p.createTextNode=function(a){return this.A.createTextNode(a)};p.ua=function(){return this.A.parentWindow||this.A.defaultView};
+function mb(a){var b=a.A,a="CSS1Compat"==b.compatMode?b.documentElement:b.body,b=b.parentWindow||b.defaultView;return new B(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)}p.appendChild=function(a,b){a.appendChild(b)};p.removeNode=bb;p.contains=F;var H={};H.Ba=function(){var a={Ra:"http://www.w3.org/2000/svg"};return function(b){return a[b]||k}}();H.qa=function(a,b,c){var d=D(a);if(!d.implementation.hasFeature("XPath","3.0"))return k;try{var e=d.createNSResolver?d.createNSResolver(d.documentElement):H.Ba;return d.evaluate(b,a,e,c,k)}catch(f){"NS_ERROR_ILLEGAL_VALUE"!=f.name&&g(new y(32,"Unable to locate an element with the xpath expression "+b+" because of the following error:\n"+f))}};
+H.oa=function(a,b){(!a||1!=a.nodeType)&&g(new y(32,'The result of the xpath expression "'+b+'" is: '+a+". It should be an element."))};H.Ka=function(a,b){var c=function(){var c=H.qa(b,a,9);return c?c.singleNodeValue||k:b.selectSingleNode?(c=D(b),c.setProperty&&c.setProperty("SelectionLanguage","XPath"),b.selectSingleNode(a)):k}();c===k||H.oa(c,a);return c};
+H.Qa=function(a,b){var c=function(){var c=H.qa(b,a,7);if(c){for(var e=c.snapshotLength,f=[],j=0;j<e;++j)f.push(c.snapshotItem(j));return f}return b.selectNodes?(c=D(b),c.setProperty&&c.setProperty("SelectionLanguage","XPath"),b.selectNodes(a)):[]}();La(c,function(b){H.oa(b,a)});return c};var nb,ob="",pb=/Firefox\/([0-9.]+)/.exec(ua());nb=ob=pb?pb[2]||pb[1]:"";var qb=k,rb=function(){var a=q.Components;if(!a)return l;try{if(!a.classes)return l}catch(b){return l}var c=a.classes,a=a.interfaces,d=c["@mozilla.org/xpcom/version-comparator;1"].getService(a.nsIVersionComparator),e=c["@mozilla.org/xre/app-info;1"].getService(a.nsIXULAppInfo).version;qb=function(a){return 0<=d.Ma(e,""+a)};return i}();var I="StopIteration"in q?q.StopIteration:Error("StopIteration");function J(){}J.prototype.next=function(){g(I)};J.prototype.t=function(){return this};function sb(a){if(a instanceof J)return a;if("function"==typeof a.t)return a.t(l);if(ba(a)){var b=0,c=new J;c.next=function(){for(;;){b>=a.length&&g(I);if(b in a)return a[b++];b++}};return c}g(Error("Not implemented"))};function K(a,b,c,d,e){this.p=!!b;a&&L(this,a,d);this.depth=e!=h?e:this.s||0;this.p&&(this.depth*=-1);this.Ca=!c}x(K,J);p=K.prototype;p.r=k;p.s=0;p.ma=l;function L(a,b,c,d){if(a.r=b)a.s="number"==typeof c?c:1!=a.r.nodeType?0:a.p?-1:1;"number"==typeof d&&(a.depth=d)}
+p.next=function(){var a;if(this.ma){(!this.r||this.Ca&&0==this.depth)&&g(I);a=this.r;var b=this.p?-1:1;if(this.s==b){var c=this.p?a.lastChild:a.firstChild;c?L(this,c):L(this,a,-1*b)}else(c=this.p?a.previousSibling:a.nextSibling)?L(this,c):L(this,a.parentNode,-1*b);this.depth+=this.s*(this.p?-1:1)}else this.ma=i;(a=this.r)||g(I);return a};
+p.splice=function(a){var b=this.r,c=this.p?1:-1;this.s==c&&(this.s=-1*c,this.depth+=this.s*(this.p?-1:1));this.p=!this.p;K.prototype.next.call(this);this.p=!this.p;for(var c=ba(arguments[0])?arguments[0]:arguments,d=c.length-1;0<=d;d--)b.parentNode&&b.parentNode.insertBefore(c[d],b.nextSibling);bb(b)};function tb(a,b,c,d){K.call(this,a,b,c,k,d)}x(tb,K);tb.prototype.next=function(){do tb.aa.next.call(this);while(-1==this.s);return this.r};function ub(a,b){var c=D(a);return c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(a,k))?c[b]||c.getPropertyValue(b):""}function vb(a,b){return ub(a,b)||(a.currentStyle?a.currentStyle[b]:k)||a.style&&a.style[b]}
+function wb(a){for(var b=D(a),c=vb(a,"position"),d="fixed"==c||"absolute"==c,a=a.parentNode;a&&a!=b;a=a.parentNode)if(c=vb(a,"position"),d=d&&"static"==c&&a!=b.documentElement&&a!=b.body,!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||"fixed"==c||"absolute"==c||"relative"==c))return a;return k}
+function xb(a){var b=new B;if(1==a.nodeType)if(a.getBoundingClientRect)a=a.getBoundingClientRect(),b.x=a.left,b.y=a.top;else{var c=mb(Wa(a));var d,e=D(a),f=vb(a,"position"),j=e.getBoxObjectFor&&!a.getBoundingClientRect&&"absolute"==f&&(d=e.getBoxObjectFor(a))&&(0>d.screenX||0>d.screenY),f=new B(0,0),m=(e?9==e.nodeType?e:D(e):document).documentElement;if(a!=m)if(a.getBoundingClientRect)d=a.getBoundingClientRect(),a=mb(Wa(e)),f.x=d.left+a.x,f.y=d.top+a.y;else if(e.getBoxObjectFor&&!j)d=e.getBoxObjectFor(a),
+a=e.getBoxObjectFor(m),f.x=d.screenX-a.screenX,f.y=d.screenY-a.screenY;else{d=a;do f.x+=d.offsetLeft,f.y+=d.offsetTop,d!=a&&(f.x+=d.clientLeft||0,f.y+=d.clientTop||0),d=d.offsetParent;while(d&&d!=a);for(d=a;(d=wb(d))&&d!=e.body&&d!=m;)f.x-=d.scrollLeft,f.y-=d.scrollTop}b.x=f.x-c.x;b.y=f.y-c.y}else c=u(a.ta),d=a,a.targetTouches?d=a.targetTouches[0]:c&&a.ta().targetTouches&&(d=a.ta().targetTouches[0]),b.x=d.clientX,b.y=d.clientY;return b}
+function yb(a){var b=a.offsetWidth,c=a.offsetHeight;return!s(b)&&a.getBoundingClientRect?(a=a.getBoundingClientRect(),new Va(a.right-a.left,a.bottom-a.top)):new Va(b,c)};function M(a,b){return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}var zb={"class":"className",readonly:"readOnly"},Ab=["checked","disabled","draggable","hidden"];function Bb(a,b){var c=zb[b]||b,d=a[c];if(!s(d)&&0<=A(Ab,c))return l;if(c="value"==b)if(c=M(a,"OPTION")){var e;c=b.toLowerCase();if(a.hasAttribute)e=a.hasAttribute(c);else try{e=a.attributes[c].specified}catch(f){e=l}c=!e}c&&(d=[],kb(a,d,l),d=d.join(""));return d}
+var Cb="async,autofocus,autoplay,checked,compact,complete,controls,declare,defaultchecked,defaultselected,defer,disabled,draggable,ended,formnovalidate,hidden,indeterminate,iscontenteditable,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,paused,pubdate,readonly,required,reversed,scoped,seamless,seeking,selected,spellcheck,truespeed,willvalidate".split(","),Db="BUTTON,INPUT,OPTGROUP,OPTION,SELECT,TEXTAREA".split(",");
+function Eb(a){var b=a.tagName.toUpperCase();return!(0<=A(Db,b))?i:Bb(a,"disabled")?l:a.parentNode&&1==a.parentNode.nodeType&&"OPTGROUP"==b||"OPTION"==b?Eb(a.parentNode):i}var Fb="text,search,tel,url,email,password,number".split(",");function Gb(a){return M(a,"TEXTAREA")?i:M(a,"INPUT")?0<=A(Fb,a.type.toLowerCase()):Hb(a)?i:l}
+function Hb(a){function b(a){return"inherit"==a.contentEditable?(a=Ib(a))?b(a):l:"true"==a.contentEditable}return!s(a.contentEditable)?l:s(a.isContentEditable)?a.isContentEditable:b(a)}function Ib(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return M(a)?a:k}function Jb(a,b){b=ra(b);return ub(a,b)||Kb(a,b)}
+function Kb(a,b){var c=a.currentStyle||a.style,d=c[b];!s(d)&&u(c.getPropertyValue)&&(d=c.getPropertyValue(b));return"inherit"!=d?s(d)?d:k:(c=Ib(a))?Kb(c,b):k}function Lb(a){if(u(a.getBBox))try{var b=a.getBBox();if(b)return b}catch(c){}if("none"!=vb(a,"display"))a=yb(a);else{var b=a.style,d=b.display,e=b.visibility,f=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";a=yb(a);b.display=d;b.position=f;b.visibility=e}return a}
+function N(a,b){function c(a){if("none"==Jb(a,"display"))return l;a=Ib(a);return!a||c(a)}function d(a){var b=Lb(a);return 0<b.height&&0<b.width?i:Na(a.childNodes,function(a){return a.nodeType==C||M(a)&&d(a)})}function e(a){var b=Ib(a);if(b&&"hidden"==Jb(b,"overflow")){var c=Lb(b),d=xb(b),a=xb(a);return d.x+c.width<a.x||d.y+c.height<a.y?l:e(b)}return i}M(a)||g(Error("Argument to isShown must be of type Element"));if(M(a,"OPTION")||M(a,"OPTGROUP")){var f=lb(a,function(a){return M(a,"SELECT")});return!!f&&
+N(f,i)}if(M(a,"MAP")){if(!a.name)return l;f=D(a);f=f.evaluate?H.Ka('/descendant::*[@usemap = "#'+a.name+'"]',f):gb(f,function(b){var c;if(c=M(b))8==b.nodeType?b=k:(c="usemap","style"==c?(b=ha(b.style.cssText).toLowerCase(),b=";"==b.charAt(b.length-1)?b:b+";"):(b=b.getAttributeNode(c),b=!b?k:0<=A(Cb,c)?"true":b.specified?b.value:k)),c=b=="#"+a.name;return c});return!!f&&N(f,b)}return M(a,"AREA")?(f=lb(a,function(a){return M(a,"MAP")}),!!f&&N(f,b)):M(a,"INPUT")&&"hidden"==a.type.toLowerCase()||M(a,
+"NOSCRIPT")||"hidden"==Jb(a,"visibility")||!c(a)||!b&&0==Mb(a)||!d(a)||!e(a)?l:i}function Mb(a){var b=1,c=Jb(a,"opacity");c&&(b=Number(c));(a=Ib(a))&&(b*=Mb(a));return b};function P(){this.v=Ca.document.documentElement;this.xa=k;var a=D(this.v).activeElement;a&&Nb(this,a)}P.prototype.q=n("v");function Nb(a,b){a.v=b;a.xa=M(b,"OPTION")?lb(b,function(a){return M(a,"SELECT")}):k}
+function Ob(a,b,c,d,e,f){function j(a,c){var d={identifier:a,screenX:c.x,screenY:c.y,clientX:c.x,clientY:c.y,pageX:c.x,pageY:c.y};m.changedTouches.push(d);if(b==Pb||b==Qb)m.touches.push(d),m.targetTouches.push(d)}var m={touches:[],targetTouches:[],changedTouches:[],altKey:l,ctrlKey:l,shiftKey:l,metaKey:l,relatedTarget:k,scale:0,rotation:0};j(c,d);s(e)&&j(e,f);Rb(a.v,b,m)}rb&&rb&&(rb?qb(4):oa(nb,4));rb&&(rb?qb(4):oa(nb,4));function Q(a,b,c){this.L=a;this.U=b;this.V=c}Q.prototype.create=function(a){a=D(a).createEvent("HTMLEvents");a.initEvent(this.L,this.U,this.V);return a};Q.prototype.toString=n("L");function R(a,b,c){Q.call(this,a,b,c)}x(R,Q);
+R.prototype.create=function(a,b){var c=D(a),d=E(c),c=c.createEvent("MouseEvents"),e=1;this==Sb&&(e=b.wheelDelta/-40);this==Tb&&(e=b.wheelDelta);c.initMouseEvent(this.L,this.U,this.V,d,e,0,0,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};function Ub(a,b,c){Q.call(this,a,b,c)}x(Ub,Q);
+Ub.prototype.create=function(a,b){var c=D(a),d=E(c),e=b.charCode?0:b.keyCode,c=c.createEvent("KeyboardEvent");c.initKeyEvent(this.L,this.U,this.V,d,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,e,b.charCode);this.L==Vb&&b.preventDefault&&c.preventDefault();return c};function Wb(a,b,c){Q.call(this,a,b,c)}x(Wb,Q);
+Wb.prototype.create=function(a,b){function c(b){var c=Ma(b,function(b){return{identifier:b.identifier,screenX:b.screenX,screenY:b.screenY,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,target:a}});c.item=function(a){return c[a]};return c}var d=D(a),e=E(d),f=c(b.changedTouches),j=b.touches==b.changedTouches?f:c(b.touches),m=b.targetTouches==b.changedTouches?f:c(b.targetTouches),d=d.createEvent("MouseEvents");d.initMouseEvent(this.L,this.U,this.V,e,1,0,0,b.clientX,b.clientY,b.ctrlKey,
+b.altKey,b.shiftKey,b.metaKey,0,b.relatedTarget);d.touches=j;d.targetTouches=m;d.changedTouches=f;d.scale=b.scale;d.rotation=b.rotation;return d};
+var Xb=new R("click",i,i),Yb=new R("contextmenu",i,i),Zb=new R("dblclick",i,i),$b=new R("mousedown",i,i),ac=new R("mousemove",i,l),bc=new R("mouseout",i,i),cc=new R("mouseover",i,i),dc=new R("mouseup",i,i),Sb=new R("DOMMouseScroll",i,i),Tb=new R("MozMousePixelScroll",i,i),ec=new Ub("keydown",i,i),Vb=new Ub("keypress",i,i),fc=new Ub("keyup",i,i),Qb=new Wb("touchmove",i,i),Pb=new Wb("touchstart",i,i);function Rb(a,b,c){b=b.create(a,c);"isTrusted"in b||(b.Oa=l);return a.dispatchEvent(b)};function gc(a,b){hc(a)&&(a.selectionStart=b,a.selectionEnd=b)}function hc(a){try{return"number"==typeof a.selectionStart}catch(b){return l}};function ic(a){if("function"==typeof a.N)return a.N();if(t(a))return a.split("");if(ba(a)){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}return Ea(a)};function jc(a,b){this.l={};this.ja={};var c=arguments.length;if(1<c){c%2&&g(Error("Uneven number of arguments"));for(var d=0;d<c;d+=2)this.set(arguments[d],arguments[d+1])}else a&&this.ca(a)}p=jc.prototype;p.ba=0;p.N=function(){var a=[],b;for(b in this.l)":"==b.charAt(0)&&a.push(this.l[b]);return a};function kc(a){var b=[],c;for(c in a.l)if(":"==c.charAt(0)){var d=c.substring(1);b.push(a.ja[c]?Number(d):d)}return b}
+p.remove=function(a){var a=":"+a,b=this.l,c;(c=a in b)&&delete b[a];return c?(delete this.ja[a],this.ba++,i):l};p.set=function(a,b){var c=":"+a;c in this.l||(this.ba++,"number"==typeof a&&(this.ja[c]=i));this.l[c]=b};p.ca=function(a){var b;if(a instanceof jc)b=kc(a),a=a.N();else{b=[];var c=0,d;for(d in a)b[c++]=d;a=Ea(a)}for(c=0;c<b.length;c++)this.set(b[c],a[c])};
+p.t=function(a){var b=0,c=kc(this),d=this.l,e=this.ba,f=this,j=new J;j.next=function(){for(;;){e!=f.ba&&g(Error("The map has changed since the iterator was created"));b>=c.length&&g(I);var j=c[b++];return a?j:d[":"+j]}};return j};function lc(a){this.l=new jc;a&&this.ca(a)}function mc(a){var b=typeof a;return"object"==b&&a||"function"==b?"o"+(a[da]||(a[da]=++ea)):b.substr(0,1)+a}p=lc.prototype;p.add=function(a){this.l.set(mc(a),a)};p.ca=function(a){for(var a=ic(a),b=a.length,c=0;c<b;c++)this.add(a[c])};p.remove=function(a){return this.l.remove(mc(a))};p.contains=function(a){return":"+mc(a)in this.l.l};p.N=function(){return this.l.N()};p.t=function(){return this.l.t(l)};function nc(){P.call(this);this.ga=Gb(this.q())&&!Bb(this.q(),"readOnly");this.ka=new lc}x(nc,P);var oc={};function S(a,b,c){ca(a)&&(a=a.c);a=new pc(a,b,c);if(b&&(!(b in oc)||c))oc[b]={key:a,shift:l},c&&(oc[c]={key:a,shift:i});return a}function pc(a,b,c){this.code=a;this.C=b||k;this.Ja=c||this.C}S(8);S(9);var qc=S(13),T=S(16),rc=S(17),sc=S(18);S(19);S(20);S(27);S(32," ");S(33);S(34);S(35);S(36);var tc=S(37);S(38);var uc=S(39);S(40);S(44);S(45);S(46);S(48,"0",")");S(49,"1","!");S(50,"2","@");
+S(51,"3","#");S(52,"4","$");S(53,"5","%");S(54,"6","^");S(55,"7","&");S(56,"8","*");S(57,"9","(");S(65,"a","A");S(66,"b","B");S(67,"c","C");S(68,"d","D");S(69,"e","E");S(70,"f","F");S(71,"g","G");S(72,"h","H");S(73,"i","I");S(74,"j","J");S(75,"k","K");S(76,"l","L");S(77,"m","M");S(78,"n","N");S(79,"o","O");S(80,"p","P");S(81,"q","Q");S(82,"r","R");S(83,"s","S");S(84,"t","T");S(85,"u","U");S(86,"v","V");S(87,"w","W");S(88,"x","X");S(89,"y","Y");S(90,"z","Z");
+var vc=S(ta?{c:91,e:91,opera:219}:sa?{c:224,e:91,opera:17}:{c:0,e:91,opera:k}),wc=S(ta?{c:92,e:92,opera:220}:sa?{c:224,e:93,opera:17}:{c:0,e:92,opera:k}),xc=S(ta?{c:93,e:93,opera:0}:sa?{c:0,e:0,opera:16}:{c:93,e:k,opera:0});S({c:96,e:96,opera:48},"0");S({c:97,e:97,opera:49},"1");S({c:98,e:98,opera:50},"2");S({c:99,e:99,opera:51},"3");S({c:100,e:100,opera:52},"4");S({c:101,e:101,opera:53},"5");S({c:102,e:102,opera:54},"6");S({c:103,e:103,opera:55},"7");S({c:104,e:104,opera:56},"8");
+S({c:105,e:105,opera:57},"9");S({c:106,e:106,opera:xa?56:42},"*");S({c:107,e:107,opera:xa?61:43},"+");S({c:109,e:109,opera:xa?109:45},"-");S({c:110,e:110,opera:xa?190:78},".");S({c:111,e:111,opera:xa?191:47},"/");S(144);S(112);S(113);S(114);S(115);S(116);S(117);S(118);S(119);S(120);S(121);S(122);S(123);S({c:107,e:187,opera:61},"=","+");S({c:109,e:189,opera:109},"-","_");S(188,",","<");S(190,".",">");S(191,"/","?");S(192,"`","~");S(219,"[","{");S(220,"\\","|");S(221,"]","}");
+S({c:59,e:186,opera:59},";",":");S(222,"'",'"');var yc=[sc,rc,vc,T];nc.prototype.m=function(a){return this.ka.contains(a)};function zc(a,b){a.m(b)&&0<=A(yc,b)&&g(new y(13,"Cannot press a modifier key that is already pressed."));var c=b.code!==k&&Ac(a,ec,b);if((!Bc(b)||Ac(a,Vb,b,!c))&&c&&a.ga&&!b.C)switch(b){case tc:case uc:var c=a.q(),d=0;hc(c)&&(d=c.selectionStart);c=d;b==tc?gc(a.q(),c-1):gc(a.q(),c+1)}a.ka.add(b)}
+function Bc(a){if(a.C||a==qc)return i;switch(a){case T:case rc:case sc:return l;case vc:case wc:case xc:return i;default:return i}}function Cc(a,b){a.m(b)||g(new y(13,"Cannot release a key that is not pressed."));b.code===k||Ac(a,fc,b);a.ka.remove(b)}
+function Ac(a,b,c,d){c.code===k&&g(new y(13,"Key must have a keycode to be fired."));var e=a.m(sc),f=a.m(rc),j=a.m(vc),m=a.m(T),r=c.code;c.C&&b==Vb?(c.C||g(new y(13,"not a character key")),c=(a.m(T)?c.Ja:c.C).charCodeAt(0)):c=0;return Rb(a.v,b,{altKey:e,ctrlKey:f,metaKey:j,shiftKey:m,keyCode:r,charCode:c,preventDefault:!!d})}
+function Dc(a,b){Nb(a,b);a.ga=Gb(b)&&!Bb(b,"readOnly");var c;c=a.xa||a.v;var d=D(c).activeElement;if(c==d)c=l;else{if(d&&u(d.blur))try{d.blur()}catch(e){g(e)}u(c.focus)?(c.focus(),c=i):c=l}a.ga&&c&&gc(b,b.value.length)};function Ec(a){return Fc(a||arguments.callee.caller,[])}
+function Fc(a,b){var c=[];if(0<=A(b,a))c.push("[...circular reference...]");else if(a&&50>b.length){c.push(Gc(a)+"(");for(var d=a.arguments,e=0;e<d.length;e++){0<e&&c.push(", ");var f;f=d[e];switch(typeof f){case "object":f=f?"object":"null";break;case "string":break;case "number":f=""+f;break;case "boolean":f=f?"true":"false";break;case "function":f=(f=Gc(f))?f:"[fn]";break;default:f=typeof f}40<f.length&&(f=f.substr(0,40)+"...");c.push(f)}b.push(a);c.push(")\n");try{c.push(Fc(a.caller,b))}catch(j){c.push("[exception trying to get caller]\n")}}else a?
+c.push("[...long stack...]"):c.push("[end]");return c.join("")}function Gc(a){if(Hc[a])return Hc[a];a=""+a;if(!Hc[a]){var b=/function ([^\(]+)/.exec(a);Hc[a]=b?b[1]:"[Anonymous]"}return Hc[a]}var Hc={};function Ic(a,b,c,d,e){this.reset(a,b,c,d,e)}Ic.prototype.sa=k;Ic.prototype.ra=k;var Jc=0;Ic.prototype.reset=function(a,b,c,d,e){"number"==typeof e||Jc++;d||fa();this.P=a;this.Ha=b;delete this.sa;delete this.ra};Ic.prototype.ya=function(a){this.P=a};function U(a){this.Ia=a}U.prototype.Z=k;U.prototype.P=k;U.prototype.da=k;U.prototype.va=k;function Kc(a,b){this.name=a;this.value=b}Kc.prototype.toString=n("name");var Lc=new Kc("WARNING",900),Mc=new Kc("CONFIG",700);U.prototype.getParent=n("Z");U.prototype.ya=function(a){this.P=a};function Nc(a){if(a.P)return a.P;if(a.Z)return Nc(a.Z);Ja("Root logger has no level set.");return k}
+U.prototype.log=function(a,b,c){if(a.value>=Nc(this).value){a=this.Ea(a,b,c);b="log:"+a.Ha;q.console&&(q.console.timeStamp?q.console.timeStamp(b):q.console.markTimeline&&q.console.markTimeline(b));q.msWriteProfilerMark&&q.msWriteProfilerMark(b);for(b=this;b;){var c=b,d=a;if(c.va)for(var e=0,f=h;f=c.va[e];e++)f(d);b=b.getParent()}}};
+U.prototype.Ea=function(a,b,c){var d=new Ic(a,""+b,this.Ia);if(c){d.sa=c;var e;var f=arguments.callee.caller;try{var j;var m;c:{for(var r=["window","location","href"],O=q,G;G=r.shift();)if(O[G]!=k)O=O[G];else{m=k;break c}m=O}if(t(c))j={message:c,name:"Unknown error",lineNumber:"Not available",fileName:m,stack:"Not available"};else{var v,w,r=l;try{v=c.lineNumber||c.Pa||"Not available"}catch(Ed){v="Not available",r=i}try{w=c.fileName||c.filename||c.sourceURL||m}catch(Fd){w="Not available",r=i}j=r||
+!c.lineNumber||!c.fileName||!c.stack?{message:c.message,name:c.name,lineNumber:v,fileName:w,stack:c.stack||"Not available"}:c}e="Message: "+ia(j.message)+'\nUrl: <a href="view-source:'+j.fileName+'" target="_new">'+j.fileName+"</a>\nLine: "+j.lineNumber+"\n\nBrowser stack:\n"+ia(j.stack+"-> ")+"[end]\n\nJS stack traversal:\n"+ia(Ec(f)+"-> ")}catch(Cd){e="Exception trying to expose exception! You win, we lose. "+Cd}d.ra=e}return d};var Oc={},Pc=k;
+function Qc(a){Pc||(Pc=new U(""),Oc[""]=Pc,Pc.ya(Mc));var b;if(!(b=Oc[a])){b=new U(a);var c=a.lastIndexOf("."),d=a.substr(c+1),c=Qc(a.substr(0,c));c.da||(c.da={});c.da[d]=b;b.Z=c;Oc[a]=b}return b};function Rc(){}x(Rc,function(){});Qc("goog.dom.SavedRange");x(function(a){this.La="goog_"+pa++;this.Da="goog_"+pa++;this.pa=Wa(a.ha());a.T(this.pa.fa("SPAN",{id:this.La}),this.pa.fa("SPAN",{id:this.Da}))},Rc);function V(){}function Sc(a){if(a.getSelection)return a.getSelection();var a=a.document,b=a.selection;if(b){try{var c=b.createRange();if(c.parentElement){if(c.parentElement().document!=a)return k}else if(!c.length||c.item(0).document!=a)return k}catch(d){return k}return b}return k}function Tc(a){for(var b=[],c=0,d=a.G();c<d;c++)b.push(a.B(c));return b}V.prototype.H=o(l);V.prototype.ha=function(){return D(this.b())};V.prototype.ua=function(){return E(this.ha())};
+V.prototype.containsNode=function(a,b){return this.z(Uc(Vc(a),h),b)};function W(a,b){K.call(this,a,b,i)}x(W,K);function Wc(){}x(Wc,V);Wc.prototype.z=function(a,b){var c=Tc(this),d=Tc(a);return(b?Na:Oa)(d,function(a){return Na(c,function(c){return c.z(a,b)})})};Wc.prototype.insertNode=function(a,b){if(b){var c=this.b();c.parentNode&&c.parentNode.insertBefore(a,c)}else c=this.g(),c.parentNode&&c.parentNode.insertBefore(a,c.nextSibling);return a};Wc.prototype.T=function(a,b){this.insertNode(a,i);this.insertNode(b,l)};function Xc(a,b,c,d,e){var f;if(a&&(this.f=a,this.i=b,this.d=c,this.h=d,1==a.nodeType&&"BR"!=a.tagName&&(a=a.childNodes,(b=a[b])?(this.f=b,this.i=0):(a.length&&(this.f=z(a)),f=i)),1==c.nodeType))(this.d=c.childNodes[d])?this.h=0:this.d=c;W.call(this,e?this.d:this.f,e);if(f)try{this.next()}catch(j){j!=I&&g(j)}}x(Xc,W);p=Xc.prototype;p.f=k;p.d=k;p.i=0;p.h=0;p.b=n("f");p.g=n("d");p.O=function(){return this.ma&&this.r==this.d&&(!this.h||1!=this.s)};p.next=function(){this.O()&&g(I);return Xc.aa.next.call(this)};"ScriptEngine"in q&&"JScript"==q.ScriptEngine()&&(q.ScriptEngineMajorVersion(),q.ScriptEngineMinorVersion(),q.ScriptEngineBuildVersion());function Yc(){}Yc.prototype.z=function(a,b){var c=b&&!a.isCollapsed(),d=a.a;try{return c?0<=this.n(d,0,1)&&0>=this.n(d,1,0):0<=this.n(d,0,0)&&0>=this.n(d,1,1)}catch(e){g(e)}};Yc.prototype.containsNode=function(a,b){return this.z(Vc(a),b)};Yc.prototype.t=function(){return new Xc(this.b(),this.j(),this.g(),this.k())};function Zc(a){this.a=a}x(Zc,Yc);p=Zc.prototype;p.F=function(){return this.a.commonAncestorContainer};p.b=function(){return this.a.startContainer};p.j=function(){return this.a.startOffset};p.g=function(){return this.a.endContainer};p.k=function(){return this.a.endOffset};p.n=function(a,b,c){return this.a.compareBoundaryPoints(1==c?1==b?q.Range.START_TO_START:q.Range.START_TO_END:1==b?q.Range.END_TO_START:q.Range.END_TO_END,a)};p.isCollapsed=function(){return this.a.collapsed};
+p.select=function(a){this.$(E(D(this.b())).getSelection(),a)};p.$=function(a){a.removeAllRanges();a.addRange(this.a)};p.insertNode=function(a,b){var c=this.a.cloneRange();c.collapse(b);c.insertNode(a);c.detach();return a};
+p.T=function(a,b){var c=E(D(this.b()));if(c=(c=Sc(c||window))&&$c(c))var d=c.b(),e=c.g(),f=c.j(),j=c.k();var m=this.a.cloneRange(),r=this.a.cloneRange();m.collapse(l);r.collapse(i);m.insertNode(b);r.insertNode(a);m.detach();r.detach();if(c){if(d.nodeType==C)for(;f>d.length;){f-=d.length;do d=d.nextSibling;while(d==a||d==b)}if(e.nodeType==C)for(;j>e.length;){j-=e.length;do e=e.nextSibling;while(e==a||e==b)}c=new ad;c.I=bd(d,f,e,j);"BR"==d.tagName&&(m=d.parentNode,f=A(m.childNodes,d),d=m);"BR"==e.tagName&&
+(m=e.parentNode,j=A(m.childNodes,e),e=m);c.I?(c.f=e,c.i=j,c.d=d,c.h=f):(c.f=d,c.i=f,c.d=e,c.h=j);c.select()}};p.collapse=function(a){this.a.collapse(a)};function cd(a){this.a=a}x(cd,Zc);function Vc(a){var b=D(a).createRange();if(a.nodeType==C)b.setStart(a,0),b.setEnd(a,a.length);else if(X(a)){for(var c,d=a;(c=d.firstChild)&&X(c);)d=c;b.setStart(d,0);for(d=a;(c=d.lastChild)&&X(c);)d=c;b.setEnd(d,1==d.nodeType?d.childNodes.length:d.length)}else c=a.parentNode,a=A(c.childNodes,a),b.setStart(c,a),b.setEnd(c,a+1);return new cd(b)}
+cd.prototype.$=function(a,b){var c=b?this.g():this.b(),d=b?this.k():this.j(),e=b?this.b():this.g(),f=b?this.j():this.k();a.collapse(c,d);(c!=e||d!=f)&&a.extend(e,f)};function dd(a){this.a=a}x(dd,Yc);Qc("goog.dom.browserrange.IeRange");function ed(a){var b=D(a).body.createTextRange();if(1==a.nodeType)b.moveToElementText(a),X(a)&&!a.childNodes.length&&b.collapse(l);else{for(var c=0,d=a;d=d.previousSibling;){var e=d.nodeType;if(e==C)c+=d.length;else if(1==e){b.moveToElementText(d);break}}d||b.moveToElementText(a.parentNode);b.collapse(!d);c&&b.move("character",c);b.moveEnd("character",a.length)}return b}p=dd.prototype;p.Q=k;p.f=k;p.d=k;p.i=-1;p.h=-1;
+p.u=function(){this.Q=this.f=this.d=k;this.i=this.h=-1};
+p.F=function(){if(!this.Q){var a=this.a.text,b=this.a.duplicate(),c=a.replace(/ +$/,"");(c=a.length-c.length)&&b.moveEnd("character",-c);c=b.parentElement();b=b.htmlText.replace(/(\r\n|\r|\n)+/g," ").length;if(this.isCollapsed()&&0<b)return this.Q=c;for(;b>c.outerHTML.replace(/(\r\n|\r|\n)+/g," ").length;)c=c.parentNode;for(;1==c.childNodes.length&&c.innerText==(c.firstChild.nodeType==C?c.firstChild.nodeValue:c.firstChild.innerText)&&X(c.firstChild);)c=c.firstChild;0==a.length&&(c=fd(this,c));this.Q=
+c}return this.Q};function fd(a,b){for(var c=b.childNodes,d=0,e=c.length;d<e;d++){var f=c[d];if(X(f)){var j=ed(f),m=j.htmlText!=f.outerHTML;if(a.isCollapsed()&&m?0<=a.n(j,1,1)&&0>=a.n(j,1,0):a.a.inRange(j))return fd(a,f)}}return b}p.b=function(){this.f||(this.f=gd(this,1),this.isCollapsed()&&(this.d=this.f));return this.f};p.j=function(){0>this.i&&(this.i=hd(this,1),this.isCollapsed()&&(this.h=this.i));return this.i};
+p.g=function(){if(this.isCollapsed())return this.b();this.d||(this.d=gd(this,0));return this.d};p.k=function(){if(this.isCollapsed())return this.j();0>this.h&&(this.h=hd(this,0),this.isCollapsed()&&(this.i=this.h));return this.h};p.n=function(a,b,c){return this.a.compareEndPoints((1==b?"Start":"End")+"To"+(1==c?"Start":"End"),a)};
+function gd(a,b,c){c=c||a.F();if(!c||!c.firstChild)return c;for(var d=1==b,e=0,f=c.childNodes.length;e<f;e++){var j=d?e:f-e-1,m=c.childNodes[j],r;try{r=Vc(m)}catch(O){continue}var G=r.a;if(a.isCollapsed())if(X(m)){if(r.z(a))return gd(a,b,m)}else{if(0==a.n(G,1,1)){a.i=a.h=j;break}}else{if(a.z(r)){if(!X(m)){d?a.i=j:a.h=j+1;break}return gd(a,b,m)}if(0>a.n(G,1,0)&&0<a.n(G,0,1))return gd(a,b,m)}}return c}
+function hd(a,b){var c=1==b,d=c?a.b():a.g();if(1==d.nodeType){for(var d=d.childNodes,e=d.length,f=c?1:-1,j=c?0:e-1;0<=j&&j<e;j+=f){var m=d[j];if(!X(m)&&0==a.a.compareEndPoints((1==b?"Start":"End")+"To"+(1==b?"Start":"End"),Vc(m).a))return c?j:j+1}return-1==j?0:j}e=a.a.duplicate();f=ed(d);e.setEndPoint(c?"EndToEnd":"StartToStart",f);e=e.text.length;return c?d.length-e:e}p.isCollapsed=function(){return 0==this.a.compareEndPoints("StartToEnd",this.a)};p.select=function(){this.a.select()};
+function id(a,b,c){var d;d=d||Wa(a.parentElement());var e;1!=b.nodeType&&(e=i,b=d.fa("DIV",k,b));a.collapse(c);d=d||Wa(a.parentElement());var f=c=b.id;c||(c=b.id="goog_"+pa++);a.pasteHTML(b.outerHTML);(b=d.q(c))&&(f||b.removeAttribute("id"));if(e){a=b.firstChild;e=b;if((d=e.parentNode)&&11!=d.nodeType)if(e.removeNode)e.removeNode(l);else{for(;b=e.firstChild;)d.insertBefore(b,e);bb(e)}b=a}return b}p.insertNode=function(a,b){var c=id(this.a.duplicate(),a,b);this.u();return c};
+p.T=function(a,b){var c=this.a.duplicate(),d=this.a.duplicate();id(c,a,i);id(d,b,l);this.u()};p.collapse=function(a){this.a.collapse(a);a?(this.d=this.f,this.h=this.i):(this.f=this.d,this.i=this.h)};function jd(a){this.a=a}x(jd,Zc);jd.prototype.$=function(a){a.collapse(this.b(),this.j());(this.g()!=this.b()||this.k()!=this.j())&&a.extend(this.g(),this.k());0==a.rangeCount&&a.addRange(this.a)};function kd(a){this.a=a}x(kd,Zc);kd.prototype.n=function(a,b,c){return Ba["528"]||(Ba["528"]=0<=oa(ya,"528"))?kd.aa.n.call(this,a,b,c):this.a.compareBoundaryPoints(1==c?1==b?q.Range.START_TO_START:q.Range.END_TO_START:1==b?q.Range.START_TO_END:q.Range.END_TO_END,a)};kd.prototype.$=function(a,b){a.removeAllRanges();b?a.setBaseAndExtent(this.g(),this.k(),this.b(),this.j()):a.setBaseAndExtent(this.b(),this.j(),this.g(),this.k())};function X(a){var b;a:if(1!=a.nodeType)b=l;else{switch(a.tagName){case "APPLET":case "AREA":case "BASE":case "BR":case "COL":case "FRAME":case "HR":case "IMG":case "INPUT":case "IFRAME":case "ISINDEX":case "LINK":case "NOFRAMES":case "NOSCRIPT":case "META":case "OBJECT":case "PARAM":case "SCRIPT":case "STYLE":b=l;break a}b=i}return b||a.nodeType==C};function ad(){}x(ad,V);function Uc(a,b){var c=new ad;c.M=a;c.I=!!b;return c}p=ad.prototype;p.M=k;p.f=k;p.i=k;p.d=k;p.h=k;p.I=l;p.ia=o("text");p.Y=function(){return Y(this).a};p.u=function(){this.f=this.i=this.d=this.h=k};p.G=o(1);p.B=function(){return this};function Y(a){var b;if(!(b=a.M)){b=a.b();var c=a.j(),d=a.g(),e=a.k(),f=D(b).createRange();f.setStart(b,c);f.setEnd(d,e);b=a.M=new cd(f)}return b}p.F=function(){return Y(this).F()};p.b=function(){return this.f||(this.f=Y(this).b())};
+p.j=function(){return this.i!=k?this.i:this.i=Y(this).j()};p.g=function(){return this.d||(this.d=Y(this).g())};p.k=function(){return this.h!=k?this.h:this.h=Y(this).k()};p.H=n("I");p.z=function(a,b){var c=a.ia();return"text"==c?Y(this).z(Y(a),b):"control"==c?(c=ld(a),(b?Na:Oa)(c,function(a){return this.containsNode(a,b)},this)):l};p.isCollapsed=function(){return Y(this).isCollapsed()};p.t=function(){return new Xc(this.b(),this.j(),this.g(),this.k())};p.select=function(){Y(this).select(this.I)};
+p.insertNode=function(a,b){var c=Y(this).insertNode(a,b);this.u();return c};p.T=function(a,b){Y(this).T(a,b);this.u()};p.la=function(){return new md(this)};p.collapse=function(a){a=this.H()?!a:a;this.M&&this.M.collapse(a);a?(this.d=this.f,this.h=this.i):(this.f=this.d,this.i=this.h);this.I=l};function md(a){a.H()?a.g():a.b();a.H()?a.k():a.j();a.H()?a.b():a.g();a.H()?a.j():a.k()}x(md,Rc);function nd(){}x(nd,Wc);p=nd.prototype;p.a=k;p.o=k;p.S=k;p.u=function(){this.S=this.o=k};p.ia=o("control");p.Y=function(){return this.a||document.body.createControlRange()};p.G=function(){return this.a?this.a.length:0};p.B=function(a){a=this.a.item(a);return Uc(Vc(a),h)};p.F=function(){return fb.apply(k,ld(this))};p.b=function(){return od(this)[0]};p.j=o(0);p.g=function(){var a=od(this),b=z(a);return Pa(a,function(a){return F(a,b)})};p.k=function(){return this.g().childNodes.length};
+function ld(a){if(!a.o&&(a.o=[],a.a))for(var b=0;b<a.a.length;b++)a.o.push(a.a.item(b));return a.o}function od(a){a.S||(a.S=ld(a).concat(),a.S.sort(function(a,c){return a.sourceIndex-c.sourceIndex}));return a.S}p.isCollapsed=function(){return!this.a||!this.a.length};p.t=function(){return new pd(this)};p.select=function(){this.a&&this.a.select()};p.la=function(){return new qd(this)};p.collapse=function(){this.a=k;this.u()};function qd(a){this.o=ld(a)}x(qd,Rc);
+function pd(a){a&&(this.o=od(a),this.f=this.o.shift(),this.d=z(this.o)||this.f);W.call(this,this.f,l)}x(pd,W);p=pd.prototype;p.f=k;p.d=k;p.o=k;p.b=n("f");p.g=n("d");p.O=function(){return!this.depth&&!this.o.length};p.next=function(){this.O()&&g(I);if(!this.depth){var a=this.o.shift();L(this,a,1,1);return a}return pd.aa.next.call(this)};function rd(){this.w=[];this.R=[];this.W=this.K=k}x(rd,Wc);p=rd.prototype;p.Ga=Qc("goog.dom.MultiRange");p.u=function(){this.R=[];this.W=this.K=k};p.ia=o("mutli");p.Y=function(){1<this.w.length&&this.Ga.log(Lc,"getBrowserRangeObject called on MultiRange with more than 1 range",h);return this.w[0]};p.G=function(){return this.w.length};p.B=function(a){this.R[a]||(this.R[a]=Uc(new cd(this.w[a]),h));return this.R[a]};
+p.F=function(){if(!this.W){for(var a=[],b=0,c=this.G();b<c;b++)a.push(this.B(b).F());this.W=fb.apply(k,a)}return this.W};function sd(a){a.K||(a.K=Tc(a),a.K.sort(function(a,c){var d=a.b(),e=a.j(),f=c.b(),j=c.j();return d==f&&e==j?0:bd(d,e,f,j)?1:-1}));return a.K}p.b=function(){return sd(this)[0].b()};p.j=function(){return sd(this)[0].j()};p.g=function(){return z(sd(this)).g()};p.k=function(){return z(sd(this)).k()};p.isCollapsed=function(){return 0==this.w.length||1==this.w.length&&this.B(0).isCollapsed()};
+p.t=function(){return new td(this)};p.select=function(){var a=Sc(this.ua());a.removeAllRanges();for(var b=0,c=this.G();b<c;b++)a.addRange(this.B(b).Y())};p.la=function(){return new ud(this)};p.collapse=function(a){if(!this.isCollapsed()){var b=a?this.B(0):this.B(this.G()-1);this.u();b.collapse(a);this.R=[b];this.K=[b];this.w=[b.Y()]}};function ud(a){Ma(Tc(a),function(a){return a.la()})}x(ud,Rc);function td(a){a&&(this.J=Ma(sd(a),function(a){return sb(a)}));W.call(this,a?this.b():k,l)}x(td,W);p=td.prototype;
+p.J=k;p.X=0;p.b=function(){return this.J[0].b()};p.g=function(){return z(this.J).g()};p.O=function(){return this.J[this.X].O()};p.next=function(){try{var a=this.J[this.X],b=a.next();L(this,a.r,a.s,a.depth);return b}catch(c){return(c!==I||this.J.length-1==this.X)&&g(c),this.X++,this.next()}};function $c(a){var b,c=l;if(a.createRange)try{b=a.createRange()}catch(d){return k}else if(a.rangeCount){if(1<a.rangeCount){b=new rd;for(var c=0,e=a.rangeCount;c<e;c++)b.w.push(a.getRangeAt(c));return b}b=a.getRangeAt(0);c=bd(a.anchorNode,a.anchorOffset,a.focusNode,a.focusOffset)}else return k;b&&b.addElement?(a=new nd,a.a=b):a=Uc(new cd(b),c);return a}
+function bd(a,b,c,d){if(a==c)return d<b;var e;if(1==a.nodeType&&b)if(e=a.childNodes[b])a=e,b=0;else if(F(a,c))return i;if(1==c.nodeType&&d)if(e=c.childNodes[d])c=e,d=0;else if(F(c,a))return l;return 0<(cb(a,c)||b-d)};function vd(){P.call(this);this.na=k;this.D=new B(0,0);this.wa=l}x(vd,P);var Z={};Z[Xb]=[0,1,2,k];Z[Yb]=[k,k,2,k];Z[dc]=[0,1,2,k];Z[bc]=[0,0,0,0];Z[ac]=[0,0,0,0];Z[Zb]=Z[Xb];Z[$b]=Z[dc];Z[cc]=Z[bc];vd.prototype.move=function(a,b){var c=xb(a);this.D.x=b.x+c.x;this.D.y=b.y+c.y;a!=this.q()&&(c=this.q()===Ca.document.documentElement||this.q()===Ca.document.body,c=!this.wa&&c?k:this.q(),wd(this,bc,a),Nb(this,a),wd(this,cc,c));wd(this,ac)};
+function wd(a,b,c){a.wa=i;var d=a.D,e;b in Z?(e=Z[b][a.na===k?3:a.na],e===k&&g(new y(13,"Event does not permit the specified mouse button."))):e=0;N(a.v,i)&&Eb(a.v)&&(c&&!(cc==b||bc==b)&&g(new y(12,"Event type does not allow related target: "+b)),c={clientX:d.x,clientY:d.y,button:e,altKey:l,ctrlKey:l,shiftKey:l,metaKey:l,wheelDelta:0,relatedTarget:c||k},(a=a.v)&&Rb(a,b,c))};function xd(){P.call(this);this.D=new B(0,0);this.ea=new B(0,0)}x(xd,P);xd.prototype.Aa=0;xd.prototype.za=0;xd.prototype.move=function(a,b,c){this.m()||Nb(this,a);a=xb(a);this.D.x=b.x+a.x;this.D.y=b.y+a.y;s(c)&&(this.ea.x=c.x+a.x,this.ea.y=c.y+a.y);if(this.m()){b=Qb;this.m()||g(new y(13,"Should never fire event when touchscreen is not pressed."));var d,e;this.za&&(d=this.za,e=this.ea);Ob(this,b,this.Aa,this.D,d,e)}};xd.prototype.m=function(){return!!this.Aa};function yd(a,b){this.x=a;this.y=b}x(yd,B);yd.prototype.scale=function(a){this.x*=a;this.y*=a;return this};yd.prototype.add=function(a){this.x+=a.x;this.y+=a.y;return this};function zd(){P.call(this)}x(zd,P);(function(a){a.Na=function(){return a.Fa||(a.Fa=new a)}})(zd);function Ad(a,b){N(a,i)||g(new y(11,"Element is not currently visible and may not be manipulated"));(!N(a,i)||!Eb(a))&&g(new y(12,"Element is not currently interactable and may not be manipulated"));var c=new nc;Dc(c,a);var d=Sa(arguments,1);La(d,function(a){t(a)?La(a.split(""),function(a){1!=a.length&&g(new y(13,"Argument not a single character: "+a));var b=oc[a];b||(b=a.toUpperCase(),b=S(b.charCodeAt(0),a.toLowerCase(),b),b={key:b,shift:a!=b.C});a=b;a.shift&&zc(c,T);zc(c,a.key);Cc(c,a.key);a.shift&&
+Cc(c,T)}):0<=A(yc,a)?c.m(a)?Cc(c,a):zc(c,a):(zc(c,a),Cc(c,a))});La(yc,function(a){c.m(a)&&Cc(c,a)})}var Bd=["_"],$=q;!(Bd[0]in $)&&$.execScript&&$.execScript("var "+Bd[0]);for(var Dd;Bd.length&&(Dd=Bd.shift());)!Bd.length&&s(Ad)?$[Dd]=Ad:$=$[Dd]?$[Dd]:$[Dd]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
new file mode 100644
--- /dev/null
+++ b/testing/marionette/atoms/jar.mn
@@ -0,0 +1,3 @@
+marionette.jar:
+% content marionette %content/
+	content/atoms.js	(atoms.js)
--- a/testing/marionette/components/marionettecomponent.js
+++ b/testing/marionette/components/marionettecomponent.js
@@ -4,51 +4,51 @@
 
 const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 
 const MARIONETTE_CONTRACTID = "@mozilla.org/marionette;1";
 const MARIONETTE_CID = Components.ID("{786a1369-dca5-4adc-8486-33d23c88010a}");
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/services-sync/log4moz.js");
 
 function MarionetteComponent() {
   this._loaded = false;
+  // set up the logger
+  this.logger = Log4Moz.repository.getLogger("Marionette");
 }
 
 MarionetteComponent.prototype = {
   classDescription: "Marionette component",
   classID: MARIONETTE_CID,
   contractID: MARIONETTE_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
   _xpcom_categories: [{category: "profile-after-change", service: true}],
 
   observe: function mc_observe(aSubject, aTopic, aData) {
     let observerService = Services.obs;
     switch (aTopic) {
       case "profile-after-change":
         if (Services.prefs.getBoolPref('marionette.defaultPrefs.enabled')) {
-          // set up the logger
-          Cu.import("resource://gre/modules/FileUtils.jsm");
-          Cu.import("resource://gre/modules/services-sync/log4moz.js");
 
-          let logger = Log4Moz.repository.getLogger("Marionette");
-          logger.level = Log4Moz.Level["All"];
+          this.logger.level = Log4Moz.Level["All"];
           let logf = FileUtils.getFile('ProfD', ['marionette.log']);
           
           let formatter = new Log4Moz.BasicFormatter();
-          logger.addAppender(new Log4Moz.FileAppender(logf, formatter));
-          logger.info("MarionetteComponent loaded");
+          this.logger.addAppender(new Log4Moz.FileAppender(logf, formatter));
+          this.logger.info("MarionetteComponent loaded");
 
           //add observers
           observerService.addObserver(this, "final-ui-startup", false);
           observerService.addObserver(this, "xpcom-shutdown", false);
         }
         else {
-          logger.info("marionette not enabled");
+          this.logger.info("marionette not enabled");
         }
         break;
       case "final-ui-startup":
         observerService.removeObserver(this, "final-ui-startup");
         this.init();
         break;
       case "xpcom-shutdown":
         observerService.removeObserver(this, "xpcom-shutdown");
@@ -69,17 +69,17 @@ MarionetteComponent.prototype = {
       }
       try {
         Cu.import('resource:///modules/devtools/dbg-server.jsm');
         DebuggerServer.addActors('chrome://marionette/content/marionette-actors.js');
         DebuggerServer.initTransport();
         DebuggerServer.openListener(port, true);
       }
       catch(e) {
-        logger.error('exception: ' + e.name + ', ' + e.message);
+        this.logger.error('exception: ' + e.name + ', ' + e.message);
       }
     }
   },
 
   uninit: function mc_uninit() {
     DebuggerServer.closeListener();
     this._loaded = false;
   },
--- a/testing/marionette/jar.mn
+++ b/testing/marionette/jar.mn
@@ -1,7 +1,9 @@
 marionette.jar:
 % content marionette %content/
   content/marionette-actors.js      (marionette-actors.js)
   content/marionette-listener.js    (marionette-listener.js)
   content/marionette-elements.js    (marionette-elements.js)
   content/marionette-log-obj.js     (marionette-log-obj.js)
   content/marionette-simpletest.js  (marionette-simpletest.js)
+  content/EventUtils.js  (EventUtils.js)
+  content/ChromeUtils.js  (ChromeUtils.js)
--- a/testing/marionette/marionette-actors.js
+++ b/testing/marionette/marionette-actors.js
@@ -11,24 +11,28 @@ let Ci = Components.interfaces;
 let Cc = Components.classes;
 let Cu = Components.utils;
 
 let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"]
              .getService(Ci.mozIJSSubScriptLoader);
 loader.loadSubScript("chrome://marionette/content/marionette-simpletest.js");
 loader.loadSubScript("chrome://marionette/content/marionette-log-obj.js");
 Cu.import("chrome://marionette/content/marionette-elements.js");
+let utils = {};
+loader.loadSubScript("chrome://marionette/content/EventUtils.js", utils);
+loader.loadSubScript("chrome://marionette/content/ChromeUtils.js", utils);
 
 let prefs = Cc["@mozilla.org/preferences-service;1"]
             .getService(Ci.nsIPrefBranch);
 prefs.setBoolPref("marionette.contentListener", false);
 
 let xulAppInfo = Cc["@mozilla.org/xre/app-info;1"]
                  .getService(Ci.nsIXULAppInfo);
 let appName = xulAppInfo.name;
+loader.loadSubScript("chrome://marionette/content/atoms.js", utils);
 
 // import logger
 Cu.import("resource://gre/modules/services-sync/log4moz.js");
 let logger = Log4Moz.repository.getLogger("Marionette");
 logger.info('marionette-actors.js loaded');
 
 /**
  * Creates the root actor once a connection is established
@@ -210,30 +214,30 @@ MarionetteDriverActor.prototype = {
 
   /**
    * Gets the current active window
    * 
    * @return nsIDOMWindow
    */
   getCurrentWindow: function MDA_getCurrentWindow() {
     let type = null;
-    if (appName != "B2G") {
+    if (appName != "B2G" && this.context == "content") {
       type = 'navigator:browser';
     }
     return this.windowMediator.getMostRecentWindow(type);
   },
 
   /**
    * Gets the the window enumerator
    *
    * @return nsISimpleEnumerator
    */
   getWinEnumerator: function MDA_getWinEnumerator() {
     let type = null;
-    if (appName != "B2G") {
+    if (appName != "B2G" && this.context == "content") {
       type = 'navigator:browser';
     }
     return this.windowMediator.getEnumerator(type);
   },
 
   /**
    * Create a new BrowserObj for window and add to known browsers
    * 
@@ -269,17 +273,51 @@ MarionetteDriverActor.prototype = {
    *        Window whose browser we need to access
    * @param boolean newSession
    *        True if this is the first time we're talking to this browser
    */
   startBrowser: function MDA_startBrowser(win, newSession) {
     this.addBrowser(win);
     this.curBrowser.newSession = newSession;
     this.curBrowser.startSession(newSession);
-    this.curBrowser.loadFrameScript("chrome://marionette/content/marionette-listener.js", win);
+    try {
+      this.curBrowser.loadFrameScript("chrome://marionette/content/marionette-listener.js", win);
+    }
+    catch (e) {
+      //there may not always be a content process
+      logger.info("could not load listener into content for page: " + win.location.href);
+    }
+    utils.window = win;
+  },
+
+  /**
+   * Recursively get all labeled text
+   *
+   * @param nsIDOMElement el
+   *        The parent element
+   * @param array lines
+   *        Array that holds the text lines
+   */
+  getVisibleText: function MDA_getVisibleText(el, lines) {
+    let nodeName = el.nodeName;
+    try {
+      if (utils.isElementDisplayed(el)) {
+        if (el.value) {
+          lines.push(el.value);
+        }
+        for (var child in el.childNodes) {
+          this.getVisibleText(el.childNodes[child], lines);
+        };
+      }
+    }
+    catch (e) {
+      if (nodeName == "#text") {
+        lines.push(el.textContent);
+      }
+    }
   },
 
   /**
    * Marionette API:
    */
 
   /**
    * Create a new session. This creates a BrowserObj.
@@ -359,16 +397,17 @@ MarionetteDriverActor.prototype = {
       this.sendError(e.message, e.num, e.stack);
       return;
     }
 
     let _chromeSandbox = new Cu.Sandbox(aWindow,
        { sandboxPrototype: aWindow, wantXrays: false, sandboxName: ''});
     _chromeSandbox.__namedArgs = this.curBrowser.elementManager.applyNamedArgs(args);
     _chromeSandbox.__marionetteParams = args;
+    _chromeSandbox.testUtils = utils;
 
     marionette.exports.forEach(function(fn) {
       _chromeSandbox[fn] = marionette[fn].bind(marionette);
     });
 
     return _chromeSandbox;
   },
 
@@ -596,16 +635,20 @@ MarionetteDriverActor.prototype = {
 
   /**
    * Navigates to given url
    *
    * @param object aRequest
    *        'value' member holds the url to navigate to
    */
   goUrl: function MDA_goUrl(aRequest) {
+    if (this.context == "chrome") {
+      this.getCurrentWindow().location.href = aRequest.value;
+      this.sendOk();
+    }
     this.sendAsync("goUrl", aRequest);
   },
 
   /**
    * Gets current url
    */
   getUrl: function MDA_getUrl() {
     if (this.context == "chrome") {
@@ -676,16 +719,17 @@ MarionetteDriverActor.prototype = {
       let foundWin = winEn.getNext();
       let winId = foundWin.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils).outerWindowID;
       winId = winId + ((appName == "B2G") ? '-b2g' : '');
       if (aRequest.value == foundWin.name || aRequest.value == winId) {
         if (this.browsers[winId] == undefined) {
           //enable Marionette in that browser window
           this.startBrowser(foundWin, false);
         }
+        utils.window = foundWin;
         foundWin.focus();
         this.curBrowser = this.browsers[winId];
         this.sendOk();
         return;
       }
     }
     this.sendError("Unable to locate window " + aRequest.value, 23, null);
   },
@@ -772,17 +816,214 @@ MarionetteDriverActor.prototype = {
   /**
    * Send click event to element
    * 
    * @param object aRequest
    *        'element' member holds the reference id to
    *        the element that will be clicked
    */
   clickElement: function MDA_clickElement(aRequest) {
-    this.sendAsync("clickElement", {element: aRequest.element});
+    if (this.context == "chrome") {
+      try {
+        //NOTE: click atom fails, fall back to click() action
+        let el = this.curBrowser.elementManager.getKnownElement(aRequest.element, this.getCurrentWindow());
+        el.click();
+        this.sendOk();
+      }
+      catch (e) {
+        this.sendError(e.message, e.num, e.stack);
+      }
+    }
+    else {
+      this.sendAsync("clickElement", {element: aRequest.element});
+    }
+  },
+
+  /**
+   * Get a given attribute of an element
+   *
+   * @param object aRequest
+   *        'element' member holds the reference id to
+   *        the element that will be inspected
+   *        'name' member holds the name of the attribute to retrieve
+   */
+  getAttributeValue: function MDA_getAttributeValue(aRequest) {
+    if (this.context == "chrome") {
+      try {
+        let el = this.curBrowser.elementManager.getKnownElement(aRequest.element, this.getCurrentWindow());
+        this.sendResponse(utils.getAttributeValue(el, aRequest.name));
+      }
+      catch (e) {
+        this.sendError(e.message, e.num, e.stack);
+      }
+    }
+    else {
+      this.sendAsync("getAttributeValue", {element: aRequest.element, name: aRequest.name});
+    }
+  },
+
+  /**
+   * Get the text of an element, if any. Includes the text of all child elements.
+   *
+   * @param object aRequest
+   *        'element' member holds the reference id to
+   *        the element that will be inspected 
+   */
+  getElementText: function MDA_getElementText(aRequest) {
+    if (this.context == "chrome") {
+      //Note: for chrome, we look at text nodes, and any node with a "label" field
+      try {
+        let el = this.curBrowser.elementManager.getKnownElement(aRequest.element, this.getCurrentWindow());
+        let lines = [];
+        this.getVisibleText(el, lines);
+        lines = lines.join("\n");
+        this.sendResponse(lines);
+      }
+      catch (e) {
+        this.sendError(e.message, e.num, e.stack);
+      }
+    }
+    else {
+      this.sendAsync("getElementText", {element: aRequest.element});
+    }
+  },
+
+  /**
+   * Check if element is displayed
+   *
+   * @param object aRequest
+   *        'element' member holds the reference id to
+   *        the element that will be checked 
+   */
+  isElementDisplayed: function MDA_isElementDisplayed(aRequest) {
+    if (this.context == "chrome") {
+      try {
+        let el = this.curBrowser.elementManager.getKnownElement(aRequest.element, this.getCurrentWindow());
+        this.sendResponse(utils.isElementDisplayed(el));
+      }
+      catch (e) {
+        this.sendError(e.message, e.num, e.stack);
+      }
+    }
+    else {
+      this.sendAsync("isElementDisplayed", {element:aRequest.element});
+    }
+  },
+
+  /**
+   * Check if element is enabled
+   *
+   * @param object aRequest
+   *        'element' member holds the reference id to
+   *        the element that will be checked
+   */
+  isElementEnabled: function MDA_isElementEnabled(aRequest) {
+    if (this.context == "chrome") {
+      try {
+        //Selenium atom doesn't quite work here
+        let el = this.curBrowser.elementManager.getKnownElement(aRequest.element, this.getCurrentWindow());
+        if (el.disabled != undefined) {
+          this.sendResponse(!!!el.disabled);
+        }
+        else {
+        this.sendResponse(true);
+        }
+      }
+      catch (e) {
+        this.sendError(e.message, e.num, e.stack);
+      }
+    }
+    else {
+      this.sendAsync("isElementEnabled", {element:aRequest.element});
+    }
+  },
+
+  /**
+   * Check if element is selected
+   *
+   * @param object aRequest
+   *        'element' member holds the reference id to
+   *        the element that will be checked
+   */
+  isElementSelected: function MDA_isElementSelected(aRequest) {
+    if (this.context == "chrome") {
+      try {
+        //Selenium atom doesn't quite work here
+        let el = this.curBrowser.elementManager.getKnownElement(aRequest.element, this.getCurrentWindow());
+        if (el.checked != undefined) {
+          this.sendResponse(!!el.checked);
+        }
+        else if (el.selected != undefined) {
+          this.sendResponse(!!el.selected);
+        }
+        else {
+          this.sendResponse(true);
+        }
+      }
+      catch (e) {
+        this.sendError(e.message, e.num, e.stack);
+      }
+    }
+    else {
+      this.sendAsync("isElementSelected", {element:aRequest.element});
+    }
+  },
+
+  /**
+   * Send key presses to element after focusing on it
+   *
+   * @param object aRequest
+   *        'element' member holds the reference id to
+   *        the element that will be checked
+   *        'value' member holds the value to send to the element
+   */
+  sendKeysToElement: function MDA_sendKeysToElement(aRequest) {
+    if (this.context == "chrome") {
+      try {
+        let el = this.curBrowser.elementManager.getKnownElement(aRequest.element, this.getCurrentWindow());
+        el.focus();
+        utils.sendString(aRequest.value, utils.window);
+        this.sendOk();
+      }
+      catch (e) {
+        this.sendError(e.message, e.num, e.stack);
+      }
+    }
+    else {
+      this.sendAsync("sendKeysToElement", {element:aRequest.element, value: aRequest.value});
+    }
+  },
+
+  /**
+   * Clear the text of an element
+   *
+   * @param object aRequest
+   *        'element' member holds the reference id to
+   *        the element that will be cleared 
+   */
+  clearElement: function MDA_clearElement(aRequest) {
+    if (this.context == "chrome") {
+      //the selenium atom doesn't work here
+      try {
+        let el = this.curBrowser.elementManager.getKnownElement(aRequest.element, this.getCurrentWindow());
+        if (el.nodeName == "textbox") {
+          el.value = "";
+        }
+        else if (el.nodeName == "checkbox") {
+          el.checked = false;
+        }
+        this.sendOk();
+      }
+      catch (e) {
+        this.sendError(e.message, e.num, e.stack);
+      }
+    }
+    else {
+      this.sendAsync("clearElement", {element:aRequest.element});
+    }
   },
 
   /**
    * Deletes the session.
    * 
    * If it is a desktop environment, it will close the session's tab and close all listeners
    *
    * If it is a B2G environment, it will make the main content listener sleep, and close
@@ -891,16 +1132,23 @@ MarionetteDriverActor.prototype.requestT
   "executeScript": MarionetteDriverActor.prototype.execute,
   "setScriptTimeout": MarionetteDriverActor.prototype.setScriptTimeout,
   "executeAsyncScript": MarionetteDriverActor.prototype.executeWithCallback,
   "executeJSScript": MarionetteDriverActor.prototype.executeJSScript,
   "setSearchTimeout": MarionetteDriverActor.prototype.setSearchTimeout,
   "findElement": MarionetteDriverActor.prototype.findElement,
   "findElements": MarionetteDriverActor.prototype.findElements,
   "clickElement": MarionetteDriverActor.prototype.clickElement,
+  "getAttributeValue": MarionetteDriverActor.prototype.getAttributeValue,
+  "getElementText": MarionetteDriverActor.prototype.getElementText,
+  "isElementDisplayed": MarionetteDriverActor.prototype.isElementDisplayed,
+  "isElementEnabled": MarionetteDriverActor.prototype.isElementEnabled,
+  "isElementSelected": MarionetteDriverActor.prototype.isElementSelected,
+  "sendKeysToElement": MarionetteDriverActor.prototype.sendKeysToElement,
+  "clearElement": MarionetteDriverActor.prototype.clearElement,
   "goUrl": MarionetteDriverActor.prototype.goUrl,
   "getUrl": MarionetteDriverActor.prototype.getUrl,
   "goBack": MarionetteDriverActor.prototype.goBack,
   "goForward": MarionetteDriverActor.prototype.goForward,
   "refresh":  MarionetteDriverActor.prototype.refresh,
   "getWindow":  MarionetteDriverActor.prototype.getWindow,
   "getWindows":  MarionetteDriverActor.prototype.getWindows,
   "switchToFrame": MarionetteDriverActor.prototype.switchToFrame,
@@ -915,17 +1163,16 @@ MarionetteDriverActor.prototype.requestT
  * @param nsIDOMWindow win
  *        The window whose browser needs to be accessed
  */
 
 function BrowserObj(win) {
   this.DESKTOP = "desktop";
   this.B2G = "B2G";
   this.browser;
-  this.browser_mm;
   this.tab = null;
   this.knownFrames = [];
   this.curFrameId = null;
   this.startPage = "about:blank";
   this.mainContentId = null; // used in B2G to identify the homescreen content page
   this.messageManager = Cc["@mozilla.org/globalmessagemanager;1"].
                              getService(Ci.nsIChromeFrameMessageManager);
   this.newSession = true; //used to set curFrameId upon new session
@@ -965,18 +1212,19 @@ BrowserObj.prototype = {
       //if we have a new tab, make it the selected tab and give it focus
       this.browser.selectedTab = this.tab;
       let newTabBrowser = this.browser.getBrowserForTab(this.tab);
       //focus the tab
       newTabBrowser.ownerDocument.defaultView.focus();
     }
     else {
       //set this.tab to the currently focused tab
-      this.tab = this.browser.selectedTab;
-      this.browser_mm = this.browser.getBrowserForTab(this.tab).messageManager;
+      if (this.browser != undefined && this.browser.selectedTab != undefined) {
+        this.tab = this.browser.selectedTab;
+      }
     }
   },
 
   /**
    * Closes current tab
    */
   closeTab: function BO_closeTab() {
     if (this.tab != null && (appName != "B2G")) {
--- a/testing/marionette/marionette-listener.js
+++ b/testing/marionette/marionette-listener.js
@@ -7,16 +7,22 @@ let Cu = Components.utils;
 let uuidGen = Components.classes["@mozilla.org/uuid-generator;1"]
              .getService(Components.interfaces.nsIUUIDGenerator);
 
 let loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
              .getService(Components.interfaces.mozIJSSubScriptLoader);
 loader.loadSubScript("chrome://marionette/content/marionette-simpletest.js");
 loader.loadSubScript("chrome://marionette/content/marionette-log-obj.js");
 Components.utils.import("chrome://marionette/content/marionette-elements.js");
+let utils = {};
+utils.window = content;
+//load Event/ChromeUtils for use with JS scripts:
+loader.loadSubScript("chrome://marionette/content/EventUtils.js", utils)
+loader.loadSubScript("chrome://marionette/content/ChromeUtils.js", utils);
+loader.loadSubScript("chrome://marionette/content/atoms.js", utils);
 let marionetteLogObj = new MarionetteLogObj();
 
 let isB2G = false;
 
 let marionetteTimeout = null;
 let winUtil = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils);
 let listenerId = null; //unique ID of this listener
 let activeFrame = null;
@@ -50,16 +56,23 @@ function startListeners() {
   addMessageListener("Marionette:goUrl" + listenerId, goUrl);
   addMessageListener("Marionette:getUrl" + listenerId, getUrl);
   addMessageListener("Marionette:goBack" + listenerId, goBack);
   addMessageListener("Marionette:goForward" + listenerId, goForward);
   addMessageListener("Marionette:refresh" + listenerId, refresh);
   addMessageListener("Marionette:findElementContent" + listenerId, findElementContent);
   addMessageListener("Marionette:findElementsContent" + listenerId, findElementsContent);
   addMessageListener("Marionette:clickElement" + listenerId, clickElement);
+  addMessageListener("Marionette:getAttributeValue" + listenerId, getAttributeValue);
+  addMessageListener("Marionette:getElementText" + listenerId, getElementText);
+  addMessageListener("Marionette:isElementDisplayed" + listenerId, isElementDisplayed);
+  addMessageListener("Marionette:isElementEnabled" + listenerId, isElementEnabled);
+  addMessageListener("Marionette:isElementSelected" + listenerId, isElementSelected);
+  addMessageListener("Marionette:sendKeysToElement" + listenerId, sendKeysToElement);
+  addMessageListener("Marionette:clearElement" + listenerId, clearElement);
   addMessageListener("Marionette:switchToFrame" + listenerId, switchToFrame);
   addMessageListener("Marionette:deleteSession" + listenerId, deleteSession);
   addMessageListener("Marionette:sleepSession" + listenerId, sleepSession);
 }
 
 /**
  * Called when we start a new session. It registers the
  * current environment, and resets all values
@@ -100,16 +113,23 @@ function deleteSession(msg) {
   removeMessageListener("Marionette:goUrl" + listenerId, goUrl);
   removeMessageListener("Marionette:getUrl" + listenerId, getUrl);
   removeMessageListener("Marionette:goBack" + listenerId, goBack);
   removeMessageListener("Marionette:goForward" + listenerId, goForward);
   removeMessageListener("Marionette:refresh" + listenerId, refresh);
   removeMessageListener("Marionette:findElementContent" + listenerId, findElementContent);
   removeMessageListener("Marionette:findElementsContent" + listenerId, findElementsContent);
   removeMessageListener("Marionette:clickElement" + listenerId, clickElement);
+  removeMessageListener("Marionette:getAttributeValue" + listenerId, getAttributeValue);
+  removeMessageListener("Marionette:getElementText" + listenerId, getElementText);
+  removeMessageListener("Marionette:isElementDisplayed" + listenerId, isElementDisplayed);
+  removeMessageListener("Marionette:isElementEnabled" + listenerId, isElementEnabled);
+  removeMessageListener("Marionette:isElementSelected" + listenerId, isElementSelected);
+  removeMessageListener("Marionette:sendKeysToElement" + listenerId, sendKeysToElement);
+  removeMessageListener("Marionette:clearElement" + listenerId, clearElement);
   removeMessageListener("Marionette:switchToFrame" + listenerId, switchToFrame);
   removeMessageListener("Marionette:deleteSession" + listenerId, deleteSession);
   removeMessageListener("Marionette:sleepSession" + listenerId, sleepSession);
   this.elementManager.reset();
 }
 
 /*
  * Helper methods 
@@ -187,16 +207,17 @@ function createExecuteContentSandbox(aWi
 
   let sandbox = new Cu.Sandbox(aWindow);
   sandbox.window = aWindow;
   sandbox.document = sandbox.window.document;
   sandbox.navigator = sandbox.window.navigator;
   sandbox.__namedArgs = elementManager.applyNamedArgs(args);
   sandbox.__marionetteParams = args;
   sandbox.__proto__ = sandbox.window;
+  sandbox.testUtils = utils;
 
   marionette.exports.forEach(function(fn) {
     sandbox[fn] = marionette[fn].bind(marionette);
   });
 
   return sandbox;
 }
 
@@ -416,60 +437,149 @@ function refresh(msg) {
   let listen = function() { removeEventListener("DOMContentLoaded", arguments.callee, false); sendOk() } ;
   addEventListener("DOMContentLoaded", listen, false);
 }
 
 /**
  * Find an element in the document using requested search strategy 
  */
 function findElementContent(msg) {
-  //Todo: extend to support findChildElement
   let id;
   try {
     let notify = function(id) { sendResponse({value:id});};
     let curWin = activeFrame ? win.frames[activeFrame] : win;
     id = elementManager.find(curWin, msg.json, notify, false);
   }
   catch (e) {
     sendError(e.message, e.num, e.stack);
-    return;
   }
 }
 
 /**
  * Find elements in the document using requested search strategy 
  */
 function findElementsContent(msg) {
-  //Todo: extend to support findChildElement
   let id;
   try {
     let notify = function(id) { sendResponse({value:id});};
     let curWin = activeFrame ? win.frames[activeFrame] : win;
     id = elementManager.find(curWin, msg.json, notify, true);
   }
   catch (e) {
     sendError(e.message, e.num, e.stack);
-    return;
   }
 }
 
 /**
  * Send click event to element
  */
 function clickElement(msg) {
   let el;
   try {
+    //el = elementManager.click(msg.json.element, win);
     el = elementManager.getKnownElement(msg.json.element, win);
+    utils.click(el);
+    sendOk();
+  }
+  catch (e) {
+    sendError(e.message, e.num, e.stack);
+  }
+}
+
+/**
+ * Get a given attribute of an element
+ */
+function getAttributeValue(msg) {
+  try {
+    let el = elementManager.getKnownElement(msg.json.element, win);
+    sendResponse({value: utils.getAttributeValue(el, msg.json.name)});
+  }
+  catch (e) {
+    sendError(e.message, e.num, e.stack);
+  }
+}
+
+/**
+ * Get the text of this element. This includes text from child elements.
+ */
+function getElementText(msg) {
+  try {
+    let el = elementManager.getKnownElement(msg.json.element, win);
+    sendResponse({value: utils.getElementText(el)});
+  }
+  catch (e) {
+    sendError(e.message, e.num, e.stack);
+  }
+}
+
+/**
+ * Check if element is displayed
+ */
+function isElementDisplayed(msg) {
+  try {
+    let el = elementManager.getKnownElement(msg.json.element, win);
+    sendResponse({value: utils.isElementDisplayed(el)});
   }
   catch (e) {
     sendError(e.message, e.num, e.stack);
-    return;
+  }
+}
+
+/**
+ * Check if element is enabled
+ */
+function isElementEnabled(msg) {
+  try {
+    let el = elementManager.getKnownElement(msg.json.element, win);
+    sendResponse({value: utils.isElementEnabled(el)});
+  }
+  catch (e) {
+    sendError(e.message, e.num, e.stack);
+  }
+}
+
+/**
+ * Check if element is selected
+ */
+function isElementSelected(msg) {
+  try {
+    let el = elementManager.getKnownElement(msg.json.element, win);
+    sendResponse({value: utils.isElementSelected(el)});
+  }
+  catch (e) {
+    sendError(e.message, e.num, e.stack);
   }
-  el.click();
-  sendOk();
+}
+
+/**
+ * Send keys to element
+ */
+function sendKeysToElement(msg) {
+  try {
+    let el = elementManager.getKnownElement(msg.json.element, win);
+    utils.sendKeysToElement(el, msg.json.value);
+    sendOk();
+  }
+  catch (e) {
+    sendError(e.message, e.num, e.stack);
+  }
+}
+
+/**
+ * Clear the text of an element
+ */
+function clearElement(msg) {
+  try {
+    let el = elementManager.getKnownElement(msg.json.element, win);
+    utils.clearElement(el);
+    sendOk();
+  }
+  catch (e) {
+    sendError(e.message, e.num, e.stack);
+  }
 }
 
 /**
  * Switch to frame given either the server-assigned element id,
  * its index in window.frames, or the iframe's name or id.
  */
 function switchToFrame(msg) {
   let foundFrame = null;