/*
 * Copyright 2011-2014 Software Freedom Conservancy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* AUTO GENERATED - DO NOT EDIT BY HAND */

#include <stddef.h>  // For NULL.

#include "atoms.h"

namespace webdriver {
namespace atoms {

const char* const CLEAR[] = {
    "function(){return function(){var g,aa=this;function k(a){return void 0!",
    "==a}function l(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){return\"function\"=",
    "=ca(a)}function fa(a){var b=typeof a;return\"object\"==b&&null!=a||\"fu",
    "nction\"==b}function ga(a,b,c){return a.call.apply(a.bind,arguments)}\n",
    "function ha(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arr",
    "ay.prototype.slice.call(arguments,2);return function(){var c=Array.prot",
    "otype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a",
    ".apply(b,c)}}return function(){return a.apply(b,arguments)}}function ia",
    "(a,b,c){ia=Function.prototype.bind&&-1!=Function.prototype.bind.toStrin",
    "g().indexOf(\"native code\")?ga:ha;return ia.apply(null,arguments)}\nfu",
    "nction ja(a,b){var c=Array.prototype.slice.call(arguments,1);return fun",
    "ction(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b",
    ")}}function p(a,b){function c(){}c.prototype=b.prototype;a.Da=b.prototy",
    "pe;a.prototype=new c;a.prototype.constructor=a;a.Ba=function(a,c,f){for",
    "(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argu",
    "ments[e];return b.prototype[c].apply(a,d)}};var ka=window;var la=String",
    ".prototype.trim?function(a){return a.trim()}:function(a){return a.repla",
    "ce(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ma(a,b){return a<b?-1:a",
    ">b?1:0}function na(a){return String(a).replace(/\\-([a-z])/g,function(a",
    ",c){return c.toUpperCase()})};function oa(a,b){if(l(a))return l(b)&&1==",
    "b.length?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]==",
    "=b)return c;return-1}function q(a,b){for(var c=a.length,d=l(a)?a.split(",
    "\"\"):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function pa(a,b,c){",
    "var d=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}function ",
    "r(a,b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&",
    "&b.call(void 0,d[e],e,a))return!0;return!1}\nfunction qa(a,b){for(var c",
    "=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,",
    "d[e],e,a))return!1;return!0}function ra(a){return Array.prototype.conca",
    "t.apply([],arguments)}function sa(a){var b=a.length;if(0<b){for(var c=A",
    "rray(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function ta(a,b,c){retu",
    "rn 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.",
    "slice.call(a,b,c)};var ua={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7",
    "\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f",
    "5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\"",
    ",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"",
    "#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d26",
    "91e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\"",
    ",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#",
    "008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#00",
    "6400\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b00",
    "8b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#99",
    "32cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8",
    "f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:",
    "\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:",
    "\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#6969",
    "69\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0",
    "\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\n",
    "ghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#8",
    "08080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",hone",
    "ydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b",
    "0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavende",
    "rblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",light",
    "blue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgold",
    "enrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",li",
    "ghtgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlig",
    "htseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#77889",
    "9\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:",
    "\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",ma",
    "genta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediu",
    "mblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",med",
    "iumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:",
    "\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",mid",
    "nightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoc",
    "casin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#f",
    "df5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",oran",
    "gered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegree",
    "n:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papay",
    "awhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb",
    "\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff",
    "0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b451",
    "3\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nse",
    "ashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87c",
    "eeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\"",
    ",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#",
    "d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquo",
    "ise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",",
    "whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var ",
    "va=\"backgroundColor borderTopColor borderRightColor borderBottomColor ",
    "borderLeftColor color outlineColor\".split(\" \"),wa=/#([0-9a-fA-F])([0",
    "-9a-fA-F])([0-9a-fA-F])/,xa=/^#(?:[0-9a-f]{3}){1,2}$/i,ya=/^(?:rgba)?",
    "\\((\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,za",
    "=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0",
    ",2})\\)$/i;function u(a,b){this.code=a;this.state=v[a]||Aa;this.message",
    "=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a",
    ".toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.i",
    "ndexOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a",
    ".name=this.name;this.stack=a.stack||\"\"}p(u,Error);var Aa=\"unknown er",
    "ror\",v={15:\"element not selectable\",11:\"element not visible\"};v[31",
    "]=Aa;v[30]=Aa;v[24]=\"invalid cookie domain\";v[29]=\"invalid element c",
    "oordinates\";v[12]=\"invalid element state\";\nv[32]=\"invalid selector",
    "\";v[51]=\"invalid selector\";v[52]=\"invalid selector\";v[17]=\"javasc",
    "ript error\";v[405]=\"unsupported operation\";v[34]=\"move target out o",
    "f bounds\";v[27]=\"no such alert\";v[7]=\"no such element\";v[8]=\"no s",
    "uch frame\";v[23]=\"no such window\";v[28]=\"script timeout\";v[33]=\"s",
    "ession not created\";v[10]=\"stale element reference\";v[21]=\"timeout",
    "\";v[25]=\"unable to set cookie\";v[26]=\"unexpected alert open\";v[13]",
    "=Aa;v[9]=\"unknown command\";u.prototype.toString=function(){return thi",
    "s.name+\": \"+this.message};var Ba;a:{var Ca=aa.navigator;if(Ca){var Da",
    "=Ca.userAgent;if(Da){Ba=Da;break a}}Ba=\"\"};function Fa(a){var b=Ga;Ob",
    "ject.prototype.hasOwnProperty.call(b,\"528\")||(b[\"528\"]=a(\"528\"))}",
    ";var Ha=-1!=Ba.indexOf(\"Macintosh\"),Ia=-1!=Ba.indexOf(\"Windows\"),Ja",
    ",Ka=\"\",La=/WebKit\\/(\\S+)/.exec(Ba);La&&(Ka=La?La[1]:\"\");Ja=Ka;var",
    " Ga={};\nfunction Ma(){Fa(function(){for(var a=0,b=la(String(Ja)).split",
    "(\".\"),c=la(\"528\").split(\".\"),d=Math.max(b.length,c.length),e=0;0=",
    "=a&&e<d;e++){var f=b[e]||\"\",h=c[e]||\"\";do{f=/(\\d*)(\\D*)(.*)/.exec",
    "(f)||[\"\",\"\",\"\",\"\"];h=/(\\d*)(\\D*)(.*)/.exec(h)||[\"\",\"\",\"",
    "\",\"\"];if(0==f[0].length&&0==h[0].length)break;a=ma(0==f[1].length?0:",
    "parseInt(f[1],10),0==h[1].length?0:parseInt(h[1],10))||ma(0==f[2].lengt",
    "h,0==h[2].length)||ma(f[2],h[2]);f=f[3];h=h[3]}while(0==a)}return 0<=a}",
    ")};function w(a,b){this.x=k(a)?a:0;this.y=k(b)?b:0}g=w.prototype;g.clon",
    "e=function(){return new w(this.x,this.y)};g.toString=function(){return",
    "\"(\"+this.x+\", \"+this.y+\")\"};g.ceil=function(){this.x=Math.ceil(th",
    "is.x);this.y=Math.ceil(this.y);return this};g.floor=function(){this.x=M",
    "ath.floor(this.x);this.y=Math.floor(this.y);return this};g.round=functi",
    "on(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};",
    "\ng.translate=function(a,b){a instanceof w?(this.x+=a.x,this.y+=a.y):(t",
    "his.x+=Number(a),n(b)&&(this.y+=b));return this};g.scale=function(a,b){",
    "b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Na(a,b){this.width",
    "=a;this.height=b}g=Na.prototype;g.clone=function(){return new Na(this.w",
    "idth,this.height)};g.toString=function(){return\"(\"+this.width+\" x \"",
    "+this.height+\")\"};g.ceil=function(){this.width=Math.ceil(this.width);",
    "this.height=Math.ceil(this.height);return this};g.floor=function(){this",
    ".width=Math.floor(this.width);this.height=Math.floor(this.height);retur",
    "n this};g.round=function(){this.width=Math.round(this.width);this.heigh",
    "t=Math.round(this.height);return this};\ng.scale=function(a,b){b=n(b)?b",
    ":a;this.width*=a;this.height*=b;return this};function Oa(a,b,c){functio",
    "n d(c){c&&b.appendChild(l(c)?a.createTextNode(c):c)}for(var e=1;e<c.len",
    "gth;e++){var f=c[e];!da(f)||fa(f)&&0<f.nodeType?d(f):q(Pa(f)?sa(f):f,d)",
    "}}function Qa(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}fu",
    "nction Ra(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a",
    "==b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)r",
    "eturn a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.paren",
    "tNode;return b==a}\nfunction Sa(a,b){if(a==b)return 0;if(a.compareDocum",
    "entPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex",
    "\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeTy",
    "pe,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.p",
    "arentNode,f=b.parentNode;return e==f?Ta(a,b):!c&&Ra(e,b)?-1*Ua(a,b):!d&",
    "&Ra(f,a)?Ua(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sou",
    "rceIndex)}d=x(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.c",
    "reateRange();a.selectNode(b);\na.collapse(!0);return c.compareBoundaryP",
    "oints(aa.Range.START_TO_END,a)}function Ua(a,b){var c=a.parentNode;if(c",
    "==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Ta(b,a)}functi",
    "on Ta(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}function",
    " x(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Pa(a)",
    "{if(a&&\"number\"==typeof a.length){if(fa(a))return\"function\"==typeof",
    " a.item||\"string\"==typeof a.item;if(ea(a))return\"function\"==typeof ",
    "a.item}return!1}\nfunction Va(a,b,c){a&&!c&&(a=a.parentNode);for(c=0;a;",
    "){if(b(a))return a;a=a.parentNode;c++}return null}function Wa(a){try{re",
    "turn a&&a.activeElement}catch(b){}return null}function Xa(a){this.M=a||",
    "aa.document||document}g=Xa.prototype;g.getElementsByTagName=function(a,",
    "b){return(b||this.M).getElementsByTagName(String(a))};g.createElement=f",
    "unction(a){return this.M.createElement(String(a))};g.createTextNode=fun",
    "ction(a){return this.M.createTextNode(String(a))};g.appendChild=functio",
    "n(a,b){a.appendChild(b)};\ng.append=function(a,b){Oa(x(a),a,arguments)}",
    ";g.canHaveChildren=function(a){if(1!=a.nodeType)return!1;switch(a.tagNa",
    "me){case \"APPLET\":case \"AREA\":case \"BASE\":case \"BR\":case \"COL",
    "\":case \"COMMAND\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"IM",
    "G\":case \"INPUT\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":cas",
    "e \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"OBJ",
    "ECT\":case \"PARAM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":cas",
    "e \"TRACK\":case \"WBR\":return!1}return!0};\ng.removeNode=function(a){",
    "return a&&a.parentNode?a.parentNode.removeChild(a):null};g.contains=Ra;",
    "function Ya(a){var b=\"tabindex\";return\"style\"==b?Za(a.style.cssText",
    "):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var $a=/[;]+(?=(?",
    ":(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\\([^",
    "()]*\\))*[^()]*$)/;function Za(a){var b=[];q(a.split($a),function(a){va",
    "r c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a.length&&b",
    ".push(a[0].toLowerCase(),\":\",a[1],\";\"))});b=b.join(\"\");return b=",
    "\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfunction A(a,b){b&&\"string\"!=",
    "=typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.to",
    "UpperCase()==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu L",
    "abs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby gra",
    "nted, free of charge, to any person obtaining a copy\n of this software",
    " and associated documentation files (the \"Software\"), to\n deal in th",
    "e Software without restriction, including without limitation the\n righ",
    "ts to use, copy, modify, merge, publish, distribute, sublicense, and/or",
    "\n sell copies of the Software, and to permit persons to whom the Softw",
    "are is\n furnished to do so, subject to the following conditions:\n\n T",
    "he above copyright notice and this permission notice shall be included ",
    "in\n all copies or substantial portions of the Software.\n\n THE SOFTWA",
    "RE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IM",
    "PLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
    "\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SH",
    "ALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES",
    " OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERW",
    "ISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE U",
    "SE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction ab(a,b,c){this.s=",
    "a;this.ya=b||1;this.o=c||1};function bb(a){this.$=a;this.P=0}function c",
    "b(a){a=a.match(db);for(var b=0;b<a.length;b++)eb.test(a[b])&&a.splice(b",
    ",1);return new bb(a)}var db=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(",
    "?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d",
    "+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,eb=/^\\s/;function B(a,b){return a",
    ".$[a.P+(b||0)]}bb.prototype.next=function(){return this.$[this.P++]};bb",
    ".prototype.back=function(){this.P--};bb.prototype.empty=function(){retu",
    "rn this.$.length<=this.P};function C(a){var b=null,c=a.nodeType;1==c&&(",
    "b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b",
    "?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElemen",
    "t:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.node",
    "Value),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling);)",
    ";}}else b=a.nodeValue;return\"\"+b}\nfunction fb(a,b,c){if(null===b)ret",
    "urn!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==c?",
    "!!a.getAttribute(b):a.getAttribute(b,2)==c}function gb(a,b,c,d,e){retur",
    "n hb.call(null,a,b,l(c)?c:null,l(d)?d:null,e||new D)}\nfunction hb(a,b,",
    "c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),q(",
    "b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"",
    "class\"==c?(b=b.getElementsByClassName(d),q(b,function(b){b.className==",
    "d&&a.matches(b)&&e.add(b)})):a instanceof E?ib(a,b,c,d,e):b.getElements",
    "ByTagName&&(b=b.getElementsByTagName(a.getName()),q(b,function(a){fb(a,",
    "c,d)&&e.add(a)}));return e}\nfunction ib(a,b,c,d,e){for(b=b.firstChild;",
    "b;b=b.nextSibling)fb(b,c,d)&&a.matches(b)&&e.add(b),ib(a,b,c,d,e)};func",
    "tion D(){this.o=this.j=null;this.J=0}function jb(a){this.node=a;this.ne",
    "xt=this.F=null}function kb(a,b){if(!a.j)return b;if(!b.j)return a;var c",
    "=a.j;b=b.j;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.",
    "next):0<Sa(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.F=d)?d.next=",
    "e:a.j=e,d=e,f++;for(e=c||b;e;)e.F=d,d=d.next=e,f++,e=e.next;a.o=d;a.J=f",
    ";return a}D.prototype.unshift=function(a){a=new jb(a);a.next=this.j;thi",
    "s.o?this.j.F=a:this.j=this.o=a;this.j=a;this.J++};\nD.prototype.add=fun",
    "ction(a){a=new jb(a);a.F=this.o;this.j?this.o.next=a:this.j=this.o=a;th",
    "is.o=a;this.J++};function lb(a){return(a=a.j)?a.node:null}D.prototype.v",
    "=function(){return this.J};function mb(a){return(a=lb(a))?C(a):\"\"}D.p",
    "rototype.iterator=function(a){return new nb(this,!!a)};function nb(a,b)",
    "{this.ua=a;this.ca=(this.H=b)?a.o:a.j;this.X=null}nb.prototype.next=fun",
    "ction(){var a=this.ca;if(null==a)return null;var b=this.X=a;this.ca=thi",
    "s.H?a.F:a.next;return b.node};\nnb.prototype.remove=function(){var a=th",
    "is.ua,b=this.X;if(!b)throw Error(\"Next must be called at least once be",
    "fore remove.\");var c=b.F,b=b.next;c?c.next=b:a.j=b;b?b.F=c:a.o=c;a.J--",
    ";this.X=null};function F(a){this.i=a;this.l=this.A=!1;this.K=null}funct",
    "ion H(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}F.",
    "prototype.h=function(){return this.A};function ob(a,b){a.A=b}function p",
    "b(a,b){a.l=b}F.prototype.D=function(){return this.K};function I(a,b){a=",
    "a.evaluate(b);return a instanceof D?+mb(a):+a}function J(a,b){a=a.evalu",
    "ate(b);return a instanceof D?mb(a):\"\"+a}function qb(a,b){a=a.evaluate",
    "(b);return a instanceof D?!!a.v():!!a};function rb(a,b,c){F.call(this,a",
    ".i);this.Z=a;this.ga=b;this.la=c;this.A=b.h()||c.h();this.l=b.l||c.l;th",
    "is.Z==sb&&(c.l||c.h()||4==c.i||0==c.i||!b.D()?b.l||b.h()||4==b.i||0==b.",
    "i||!c.D()||(this.K={name:c.D().name,I:b}):this.K={name:b.D().name,I:c})",
    "}p(rb,F);\nfunction tb(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f",
    ";if(b instanceof D&&c instanceof D){b=b.iterator();for(d=b.next();d;d=b",
    ".next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a(C(d),C(f)))retu",
    "rn!0;return!1}if(b instanceof D||c instanceof D){b instanceof D?(e=b,d=",
    "c):(e=c,d=b);f=e.iterator();for(var h=typeof d,m=f.next();m;m=f.next())",
    "{switch(h){case \"number\":m=+C(m);break;case \"boolean\":m=!!C(m);brea",
    "k;case \"string\":m=C(m);break;default:throw Error(\"Illegal primitive ",
    "type for comparison.\");\n}if(e==b&&a(m,d)||e==c&&a(d,m))return!0}retur",
    "n!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"",
    "number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}rb.pr",
    "ototype.evaluate=function(a){return this.Z.u(this.ga,this.la,a)};rb.pro",
    "totype.toString=function(){var a=\"Binary Expression: \"+this.Z,a=a+H(t",
    "his.ga);return a+=H(this.la)};function ub(a,b,c,d){this.xa=a;this.ja=b;",
    "this.i=c;this.u=d}ub.prototype.toString=function(){return this.xa};var ",
    "vb={};\nfunction K(a,b,c,d){if(vb.hasOwnProperty(a))throw Error(\"Binar",
    "y operator already created: \"+a);a=new ub(a,b,c,d);return vb[a.toStrin",
    "g()]=a}K(\"div\",6,1,function(a,b,c){return I(a,c)/I(b,c)});K(\"mod\",6",
    ",1,function(a,b,c){return I(a,c)%I(b,c)});K(\"*\",6,1,function(a,b,c){r",
    "eturn I(a,c)*I(b,c)});K(\"+\",5,1,function(a,b,c){return I(a,c)+I(b,c)}",
    ");K(\"-\",5,1,function(a,b,c){return I(a,c)-I(b,c)});K(\"<\",4,2,functi",
    "on(a,b,c){return tb(function(a,b){return a<b},a,b,c)});\nK(\">\",4,2,fu",
    "nction(a,b,c){return tb(function(a,b){return a>b},a,b,c)});K(\"<=\",4,2",
    ",function(a,b,c){return tb(function(a,b){return a<=b},a,b,c)});K(\">=\"",
    ",4,2,function(a,b,c){return tb(function(a,b){return a>=b},a,b,c)});var ",
    "sb=K(\"=\",3,2,function(a,b,c){return tb(function(a,b){return a==b},a,b",
    ",c,!0)});K(\"!=\",3,2,function(a,b,c){return tb(function(a,b){return a!",
    "=b},a,b,c,!0)});K(\"and\",2,2,function(a,b,c){return qb(a,c)&&qb(b,c)})",
    ";K(\"or\",1,2,function(a,b,c){return qb(a,c)||qb(b,c)});function wb(a,b",
    "){if(b.v()&&4!=a.i)throw Error(\"Primary expression must evaluate to no",
    "deset if filter has predicate(s).\");F.call(this,a.i);this.ka=a;this.f=",
    "b;this.A=a.h();this.l=a.l}p(wb,F);wb.prototype.evaluate=function(a){a=t",
    "his.ka.evaluate(a);return xb(this.f,a)};wb.prototype.toString=function(",
    "){var a=\"Filter:\"+H(this.ka);return a+=H(this.f)};function yb(a,b){if",
    "(b.length<a.ia)throw Error(\"Function \"+a.m+\" expects at least\"+a.ia",
    "+\" arguments, \"+b.length+\" given\");if(null!==a.Y&&b.length>a.Y)thro",
    "w Error(\"Function \"+a.m+\" expects at most \"+a.Y+\" arguments, \"+b.",
    "length+\" given\");a.va&&q(b,function(b,d){if(4!=b.i)throw Error(\"Argu",
    "ment \"+d+\" to function \"+a.m+\" is not of type Nodeset: \"+b);});F.c",
    "all(this,a.i);this.O=a;this.U=b;ob(this,a.A||r(b,function(a){return a.h",
    "()}));pb(this,a.ta&&!b.length||a.sa&&!!b.length||r(b,function(a){return",
    " a.l}))}\np(yb,F);yb.prototype.evaluate=function(a){return this.O.u.app",
    "ly(null,ra(a,this.U))};yb.prototype.toString=function(){var a=\"Functio",
    "n: \"+this.O;if(this.U.length)var b=pa(this.U,function(a,b){return a+H(",
    "b)},\"Arguments:\"),a=a+H(b);return a};function zb(a,b,c,d,e,f,h,m,y){t",
    "his.m=a;this.i=b;this.A=c;this.ta=d;this.sa=e;this.u=f;this.ia=h;this.Y",
    "=k(m)?m:h;this.va=!!y}zb.prototype.toString=function(){return this.m};v",
    "ar Ab={};\nfunction L(a,b,c,d,e,f,h,m){if(Ab.hasOwnProperty(a))throw Er",
    "ror(\"Function already created: \"+a+\".\");Ab[a]=new zb(a,b,c,d,!1,e,f",
    ",h,m)}L(\"boolean\",2,!1,!1,function(a,b){return qb(b,a)},1);L(\"ceilin",
    "g\",1,!1,!1,function(a,b){return Math.ceil(I(b,a))},1);L(\"concat\",3,!",
    "1,!1,function(a,b){return pa(ta(arguments,1),function(b,d){return b+J(d",
    ",a)},\"\")},2,null);L(\"contains\",2,!1,!1,function(a,b,c){b=J(b,a);a=J",
    "(c,a);return-1!=b.indexOf(a)},2);L(\"count\",1,!1,!1,function(a,b){retu",
    "rn b.evaluate(a).v()},1,1,!0);\nL(\"false\",2,!1,!1,function(){return!1",
    "},0);L(\"floor\",1,!1,!1,function(a,b){return Math.floor(I(b,a))},1);L(",
    "\"id\",4,!1,!1,function(a,b){var c=a.s,d=9==c.nodeType?c:c.ownerDocumen",
    "t;a=J(b,a).split(/\\s+/);var e=[];q(a,function(a){a=d.getElementById(a)",
    ";!a||0<=oa(e,a)||e.push(a)});e.sort(Sa);var f=new D;q(e,function(a){f.a",
    "dd(a)});return f},1);L(\"lang\",2,!1,!1,function(){return!1},1);L(\"las",
    "t\",1,!0,!1,function(a){if(1!=arguments.length)throw Error(\"Function l",
    "ast expects ()\");return a.o},0);\nL(\"local-name\",3,!1,!0,function(a,",
    "b){return(a=b?lb(b.evaluate(a)):a.s)?a.localName||a.nodeName.toLowerCas",
    "e():\"\"},0,1,!0);L(\"name\",3,!1,!0,function(a,b){return(a=b?lb(b.eval",
    "uate(a)):a.s)?a.nodeName.toLowerCase():\"\"},0,1,!0);L(\"namespace-uri",
    "\",3,!0,!1,function(){return\"\"},0,1,!0);L(\"normalize-space\",3,!1,!0",
    ",function(a,b){return(b?J(b,a):C(a.s)).replace(/[\\s\\xa0]+/g,\" \").re",
    "place(/^\\s+|\\s+$/g,\"\")},0,1);L(\"not\",2,!1,!1,function(a,b){return",
    "!qb(b,a)},1);\nL(\"number\",1,!1,!0,function(a,b){return b?I(b,a):+C(a.",
    "s)},0,1);L(\"position\",1,!0,!1,function(a){return a.ya},0);L(\"round\"",
    ",1,!1,!1,function(a,b){return Math.round(I(b,a))},1);L(\"starts-with\",",
    "2,!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);return 0==b.lastIndexOf(a,0)}",
    ",2);L(\"string\",3,!1,!0,function(a,b){return b?J(b,a):C(a.s)},0,1);L(",
    "\"string-length\",1,!1,!0,function(a,b){return(b?J(b,a):C(a.s)).length}",
    ",0,1);\nL(\"substring\",3,!1,!1,function(a,b,c,d){c=I(c,a);if(isNaN(c)|",
    "|Infinity==c||-Infinity==c)return\"\";d=d?I(d,a):Infinity;if(isNaN(d)||",
    "-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=J(b,a)",
    ";return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3)",
    ";L(\"substring-after\",3,!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);c=b.in",
    "dexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nL(\"substring-b",
    "efore\",3,!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);a=b.indexOf(a);return",
    "-1==a?\"\":b.substring(0,a)},2);L(\"sum\",1,!1,!1,function(a,b){a=b.eva",
    "luate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+C(c);return",
    " b},1,1,!0);L(\"translate\",3,!1,!1,function(a,b,c,d){b=J(b,a);c=J(c,a)",
    ";var e=J(d,a);d={};for(var f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[",
    "a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d",
    "[a]:a;return c},3);L(\"true\",2,!1,!1,function(){return!0},0);function ",
    "E(a,b){this.na=a;this.ha=k(b)?b:null;this.B=null;switch(a){case \"comme",
    "nt\":this.B=8;break;case \"text\":this.B=3;break;case \"processing-inst",
    "ruction\":this.B=7;break;case \"node\":break;default:throw Error(\"Unex",
    "pected argument\");}}function Bb(a){return\"comment\"==a||\"text\"==a||",
    "\"processing-instruction\"==a||\"node\"==a}E.prototype.matches=function",
    "(a){return null===this.B||this.B==a.nodeType};E.prototype.getName=funct",
    "ion(){return this.na};\nE.prototype.toString=function(){var a=\"Kind Te",
    "st: \"+this.na;null===this.ha||(a+=H(this.ha));return a};function Cb(a)",
    "{F.call(this,3);this.ma=a.substring(1,a.length-1)}p(Cb,F);Cb.prototype.",
    "evaluate=function(){return this.ma};Cb.prototype.toString=function(){re",
    "turn\"Literal: \"+this.ma};function Db(a,b){this.m=a.toLowerCase();a=\"",
    "*\"==this.m?\"*\":\"http://www.w3.org/1999/xhtml\";this.R=b?b.toLowerCa",
    "se():a}Db.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b)",
    "return!1;b=k(a.localName)?a.localName:a.nodeName;return\"*\"!=this.m&&t",
    "his.m!=b.toLowerCase()?!1:\"*\"==this.R?!0:this.R==(a.namespaceURI?a.na",
    "mespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};Db.prototyp",
    "e.getName=function(){return this.m};\nDb.prototype.toString=function(){",
    "return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.R?\"\":th",
    "is.R+\":\")+this.m};function Eb(a){F.call(this,1);this.oa=a}p(Eb,F);Eb.",
    "prototype.evaluate=function(){return this.oa};Eb.prototype.toString=fun",
    "ction(){return\"Number: \"+this.oa};function Fb(a,b){F.call(this,a.i);t",
    "his.ea=a;this.L=b;this.A=a.h();this.l=a.l;1==this.L.length&&(a=this.L[0",
    "],a.V||a.C!=Gb||(a=a.T,\"*\"!=a.getName()&&(this.K={name:a.getName(),I:",
    "null})))}p(Fb,F);function Hb(){F.call(this,4)}p(Hb,F);Hb.prototype.eval",
    "uate=function(a){var b=new D;a=a.s;9==a.nodeType?b.add(a):b.add(a.owner",
    "Document);return b};Hb.prototype.toString=function(){return\"Root Helpe",
    "r Expression\"};function Ib(){F.call(this,4)}p(Ib,F);Ib.prototype.evalu",
    "ate=function(a){var b=new D;b.add(a.s);return b};\nIb.prototype.toStrin",
    "g=function(){return\"Context Helper Expression\"};function Jb(a){return",
    "\"/\"==a||\"//\"==a}\nFb.prototype.evaluate=function(a){var b=this.ea.e",
    "valuate(a);if(!(b instanceof D))throw Error(\"Filter expression must ev",
    "aluate to nodeset.\");a=this.L;for(var c=0,d=a.length;c<d&&b.v();c++){v",
    "ar e=a[c],f=b.iterator(e.C.H);if(e.h()||e.C!=Kb)if(e.h()||e.C!=Lb){var ",
    "h=f.next();for(b=e.evaluate(new ab(h));null!=(h=f.next());)h=e.evaluate",
    "(new ab(h)),b=kb(b,h)}else h=f.next(),b=e.evaluate(new ab(h));else{for(",
    "h=f.next();(b=f.next())&&(!h.contains||h.contains(b))&&b.compareDocumen",
    "tPosition(h)&8;h=b);b=e.evaluate(new ab(h))}}return b};\nFb.prototype.t",
    "oString=function(){var a=\"Path Expression:\"+H(this.ea);if(this.L.leng",
    "th){var b=pa(this.L,function(a,b){return a+H(b)},\"Steps:\");a+=H(b)}re",
    "turn a};function N(a,b){this.f=a;this.H=!!b}function xb(a,b,c){for(c=c|",
    "|0;c<a.f.length;c++)for(var d=a.f[c],e=b.iterator(),f=b.v(),h,m=0;h=e.n",
    "ext();m++){var y=a.H?f-m:m+1;h=d.evaluate(new ab(h,y,f));if(\"number\"=",
    "=typeof h)y=y==h;else if(\"string\"==typeof h||\"boolean\"==typeof h)y=",
    "!!h;else if(h instanceof D)y=0<h.v();else throw Error(\"Predicate.evalu",
    "ate returned an unexpected type.\");y||e.remove()}return b}N.prototype.",
    "D=function(){return 0<this.f.length?this.f[0].D():null};\nN.prototype.h",
    "=function(){for(var a=0;a<this.f.length;a++){var b=this.f[a];if(b.h()||",
    "1==b.i||0==b.i)return!0}return!1};N.prototype.v=function(){return this.",
    "f.length};N.prototype.toString=function(){return pa(this.f,function(a,b",
    "){return a+H(b)},\"Predicates:\")};function O(a,b,c,d){F.call(this,4);t",
    "his.C=a;this.T=b;this.f=c||new N([]);this.V=!!d;b=this.f.D();a.Aa&&b&&(",
    "this.K={name:b.name,I:b.I});this.A=this.f.h()}p(O,F);\nO.prototype.eval",
    "uate=function(a){var b=a.s,c=this.D(),d=null,e=null,f=0;c&&(d=c.name,e=",
    "c.I?J(c.I,a):null,f=1);if(this.V)if(this.h()||this.C!=Mb)if(b=(new O(Nb",
    ",new E(\"node\"))).evaluate(a).iterator(),c=b.next())for(a=this.u(c,d,e",
    ",f);null!=(c=b.next());)a=kb(a,this.u(c,d,e,f));else a=new D;else a=gb(",
    "this.T,b,d,e),a=xb(this.f,a,f);else a=this.u(a.s,d,e,f);return a};O.pro",
    "totype.u=function(a,b,c,d){a=this.C.O(this.T,a,b,c);return a=xb(this.f,",
    "a,d)};\nO.prototype.toString=function(){var a=\"Step:\"+H(\"Operator: ",
    "\"+(this.V?\"//\":\"/\"));this.C.m&&(a+=H(\"Axis: \"+this.C));a+=H(this",
    ".T);if(this.f.v()){var b=pa(this.f.f,function(a,b){return a+H(b)},\"Pre",
    "dicates:\");a+=H(b)}return a};function Ob(a,b,c,d){this.m=a;this.O=b;th",
    "is.H=c;this.Aa=d}Ob.prototype.toString=function(){return this.m};var Pb",
    "={};function P(a,b,c,d){if(Pb.hasOwnProperty(a))throw Error(\"Axis alre",
    "ady created: \"+a);b=new Ob(a,b,c,!!d);return Pb[a]=b}\nP(\"ancestor\",",
    "function(a,b){for(var c=new D;b=b.parentNode;)a.matches(b)&&c.unshift(b",
    ");return c},!0);P(\"ancestor-or-self\",function(a,b){var c=new D;do a.m",
    "atches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);\nvar Gb=P(",
    "\"attribute\",function(a,b){var c=new D,d=a.getName();if(b=b.attributes",
    ")if(a instanceof E&&null===a.B||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);el",
    "se(a=b.getNamedItem(d))&&c.add(a);return c},!1),Mb=P(\"child\",function",
    "(a,b,c,d,e){c=l(c)?c:null;d=l(d)?d:null;e=e||new D;for(b=b.firstChild;b",
    ";b=b.nextSibling)fb(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);P(",
    "\"descendant\",gb,!1,!0);\nvar Nb=P(\"descendant-or-self\",function(a,b",
    ",c,d){var e=new D;fb(b,c,d)&&a.matches(b)&&e.add(b);return gb(a,b,c,d,e",
    ")},!1,!0),Kb=P(\"following\",function(a,b,c,d){var e=new D;do for(var f",
    "=b;f=f.nextSibling;)fb(f,c,d)&&a.matches(f)&&e.add(f),e=gb(a,f,c,d,e);w",
    "hile(b=b.parentNode);return e},!1,!0);P(\"following-sibling\",function(",
    "a,b){for(var c=new D;b=b.nextSibling;)a.matches(b)&&c.add(b);return c},",
    "!1);P(\"namespace\",function(){return new D},!1);\nvar Qb=P(\"parent\",",
    "function(a,b){var c=new D;if(9==b.nodeType)return c;if(2==b.nodeType)re",
    "turn c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);retu",
    "rn c},!1),Lb=P(\"preceding\",function(a,b,c,d){var e=new D,f=[];do f.un",
    "shift(b);while(b=b.parentNode);for(var h=1,m=f.length;h<m;h++){var y=[]",
    ";for(b=f[h];b=b.previousSibling;)y.unshift(b);for(var G=0,t=y.length;G<",
    "t;G++)b=y[G],fb(b,c,d)&&a.matches(b)&&e.add(b),e=gb(a,b,c,d,e)}return e",
    "},!0,!0);\nP(\"preceding-sibling\",function(a,b){for(var c=new D;b=b.pr",
    "eviousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Rb=P(\"self",
    "\",function(a,b){var c=new D;a.matches(b)&&c.add(b);return c},!1);funct",
    "ion Sb(a){F.call(this,1);this.da=a;this.A=a.h();this.l=a.l}p(Sb,F);Sb.p",
    "rototype.evaluate=function(a){return-I(this.da,a)};Sb.prototype.toStrin",
    "g=function(){return\"Unary Expression: -\"+H(this.da)};function Tb(a){F",
    ".call(this,4);this.S=a;ob(this,r(this.S,function(a){return a.h()}));pb(",
    "this,r(this.S,function(a){return a.l}))}p(Tb,F);Tb.prototype.evaluate=f",
    "unction(a){var b=new D;q(this.S,function(c){c=c.evaluate(a);if(!(c inst",
    "anceof D))throw Error(\"Path expression must evaluate to NodeSet.\");b=",
    "kb(b,c)});return b};Tb.prototype.toString=function(){return pa(this.S,f",
    "unction(a,b){return a+H(b)},\"Union Expression:\")};function Ub(a,b){th",
    "is.a=a;this.wa=b}function Vb(a){for(var b,c=[];;){Q(a,\"Missing right h",
    "and side of binary expression.\");b=Wb(a);var d=a.a.next();if(!d)break;",
    "var e=(d=vb[d]||null)&&d.ja;if(!e){a.a.back();break}for(;c.length&&e<=c",
    "[c.length-1].ja;)b=new rb(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;",
    ")b=new rb(c.pop(),c.pop(),b);return b}function Q(a,b){if(a.a.empty())th",
    "row Error(b);}function Xb(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad t",
    "oken, expected: \"+b+\" got: \"+a);}\nfunction Yb(a){a=a.a.next();if(\"",
    ")\"!=a)throw Error(\"Bad token: \"+a);}function Zb(a){a=a.a.next();if(2",
    ">a.length)throw Error(\"Unclosed literal string\");return new Cb(a)}\nf",
    "unction $b(a){var b=[];if(Jb(B(a.a))){var c=a.a.next();var d=B(a.a);if(",
    "\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![",
    "0-9])[\\w]/.test(d)))return new Hb;d=new Hb;Q(a,\"Missing next location",
    " step.\");c=ac(a,c);b.push(c)}else{a:{c=B(a.a);d=c.charAt(0);switch(d){",
    "case \"$\":throw Error(\"Variable reference not allowed in HTML XPath\"",
    ");case \"(\":a.a.next();c=Vb(a);Q(a,'unclosed \"(\"');Xb(a,\")\");break",
    ";case '\"':case \"'\":c=Zb(a);break;default:if(isNaN(+c))if(!Bb(c)&&/(?",
    "![0-9])[\\w]/.test(d)&&\"(\"==B(a.a,\n1)){c=a.a.next();c=Ab[c]||null;a.",
    "a.next();for(d=[];\")\"!=B(a.a);){Q(a,\"Missing function argument list.",
    "\");d.push(Vb(a));if(\",\"!=B(a.a))break;a.a.next()}Q(a,\"Unclosed func",
    "tion argument list.\");Yb(a);c=new yb(c,d)}else{c=null;break a}else c=n",
    "ew Eb(+a.a.next())}\"[\"==B(a.a)&&(d=new N(bc(a)),c=new wb(c,d))}if(c)i",
    "f(Jb(B(a.a)))d=c;else return c;else c=ac(a,\"/\"),d=new Ib,b.push(c)}fo",
    "r(;Jb(B(a.a));)c=a.a.next(),Q(a,\"Missing next location step.\"),c=ac(a",
    ",c),b.push(c);return new Fb(d,b)}\nfunction ac(a,b){if(\"/\"!=b&&\"//\"",
    "!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"==B(a.a)){",
    "var c=new O(Rb,new E(\"node\"));a.a.next();return c}if(\"..\"==B(a.a))r",
    "eturn c=new O(Qb,new E(\"node\")),a.a.next(),c;if(\"@\"==B(a.a)){var d=",
    "Gb;a.a.next();Q(a,\"Missing attribute name\")}else if(\"::\"==B(a.a,1))",
    "{if(!/(?![0-9])[\\w]/.test(B(a.a).charAt(0)))throw Error(\"Bad token: ",
    "\"+a.a.next());var e=a.a.next();d=Pb[e]||null;if(!d)throw Error(\"No ax",
    "is with name: \"+e);a.a.next();Q(a,\"Missing node name\")}else d=Mb;e=",
    "\nB(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==B(a.a,1)){i",
    "f(!Bb(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if(!Bb(e))",
    "throw Error(\"Invalid type name: \"+e);Xb(a,\"(\");Q(a,\"Bad nodetype\"",
    ");var f=B(a.a).charAt(0),h=null;if('\"'==f||\"'\"==f)h=Zb(a);Q(a,\"Bad ",
    "nodetype\");Yb(a);e=new E(e,h)}else if(e=a.a.next(),f=e.indexOf(\":\"),",
    "-1==f)e=new Db(e);else{var h=e.substring(0,f);if(\"*\"==h)var m=\"*\";e",
    "lse if(m=a.wa(h),!m)throw Error(\"Namespace prefix not declared: \"+h);",
    "e=e.substr(f+1);e=new Db(e,m)}else throw Error(\"Bad token: \"+\na.a.ne",
    "xt());a=new N(bc(a),d.H);return c||new O(d,e,a,\"//\"==b)}function bc(a",
    "){for(var b=[];\"[\"==B(a.a);){a.a.next();Q(a,\"Missing predicate expre",
    "ssion.\");var c=Vb(a);b.push(c);Q(a,\"Unclosed predicate expression.\")",
    ";Xb(a,\"]\")}return b}function Wb(a){if(\"-\"==B(a.a))return a.a.next()",
    ",new Sb(Wb(a));var b=$b(a);if(\"|\"!=B(a.a))a=b;else{for(b=[b];\"|\"==a",
    ".a.next();)Q(a,\"Missing next union location path.\"),b.push($b(a));a.a",
    ".back();a=new Tb(b)}return a};function cc(a){switch(a.nodeType){case 1:",
    "return ja(dc,a);case 9:return cc(a.documentElement);case 11:case 10:cas",
    "e 6:case 12:return ec;default:return a.parentNode?cc(a.parentNode):ec}}",
    "function ec(){return null}function dc(a,b){if(a.prefix==b)return a.name",
    "spaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNode(\"x",
    "mlns:\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.paren",
    "tNode.nodeType?dc(a.parentNode,b):null};function fc(a,b){if(!a.length)t",
    "hrow Error(\"Empty XPath expression.\");a=cb(a);if(a.empty())throw Erro",
    "r(\"Invalid XPath expression.\");b?ea(b)||(b=ia(b.lookupNamespaceURI,b)",
    "):b=function(){return null};var c=Vb(new Ub(a,b));if(!a.empty())throw E",
    "rror(\"Bad token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate",
    "(new ab(a));return new R(a,b)}}\nfunction R(a,b){if(0==b)if(a instanceo",
    "f D)b=4;else if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b",
    "=1;else if(\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected eval",
    "uation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof D))throw Error(\"",
    "value could not be converted to the specified type\");this.resultType=b",
    ";switch(b){case 2:this.stringValue=a instanceof D?mb(a):\"\"+a;break;ca",
    "se 1:this.numberValue=a instanceof D?+mb(a):+a;break;case 3:this.boolea",
    "nValue=a instanceof D?0<a.v():!!a;break;case 4:case 5:case 6:case 7:var",
    " c=\na.iterator();var d=[];for(var e=c.next();e;e=c.next())d.push(e);th",
    "is.snapshotLength=a.v();this.invalidIteratorState=!1;break;case 8:case ",
    "9:this.singleNodeValue=lb(a);break;default:throw Error(\"Unknown XPathR",
    "esult type.\");}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw",
    " Error(\"iterateNext called with wrong result type\");return f>=d.lengt",
    "h?null:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(",
    "\"snapshotItem called with wrong result type\");return a>=d.length||0>a",
    "?null:d[a]}}\nR.ANY_TYPE=0;R.NUMBER_TYPE=1;R.STRING_TYPE=2;R.BOOLEAN_TY",
    "PE=3;R.UNORDERED_NODE_ITERATOR_TYPE=4;R.ORDERED_NODE_ITERATOR_TYPE=5;R.",
    "UNORDERED_NODE_SNAPSHOT_TYPE=6;R.ORDERED_NODE_SNAPSHOT_TYPE=7;R.ANY_UNO",
    "RDERED_NODE_TYPE=8;R.FIRST_ORDERED_NODE_TYPE=9;function gc(a){this.look",
    "upNamespaceURI=cc(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var",
    " c=a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPa",
    "thResult=R,c.evaluate=function(a,b,c,h){return(new fc(a,c)).evaluate(b,",
    "h)},c.createExpression=function(a,b){return new fc(a,b)},c.createNSReso",
    "lver=function(a){return new gc(a)}});var S={};S.aa=function(){var a={Ea",
    ":\"http://www.w3.org/2000/svg\"};return function(b){return a[b]||null}}",
    "();\nS.u=function(a,b,c){var d=x(a);if(!d.documentElement)return null;t",
    "ry{for(var e=d.createNSResolver?d.createNSResolver(d.documentElement):S",
    ".aa,f={},h=d.getElementsByTagName(\"*\"),m=0;m<h.length;++m){var y=h[m]",
    ",G=y.namespaceURI;if(G&&!f[G]){var t=y.lookupPrefix(G);if(!t)var z=G.ma",
    "tch(\".*/(\\\\w+)/?$\"),t=z?z[1]:\"xhtml\";f[G]=t}}var M={},T;for(T in ",
    "f)M[f[T]]=T;e=function(a){return M[a]||null};try{return d.evaluate(b,a,",
    "e,c,null)}catch(Ea){if(\"TypeError\"===Ea.name)return e=d.createNSResol",
    "ver?d.createNSResolver(d.documentElement):\nS.aa,d.evaluate(b,a,e,c,nul",
    "l);throw Ea;}}catch(Ea){throw new u(32,\"Unable to locate an element wi",
    "th the xpath expression \"+b+\" because of the following error:\\n\"+Ea",
    ");}};S.ba=function(a,b){if(!a||1!=a.nodeType)throw new u(32,'The result",
    " of the xpath expression \"'+b+'\" is: '+a+\". It should be an element.",
    "\");};\nS.za=function(a,b){var c=function(){var c=S.u(b,a,9);return c?c",
    ".singleNodeValue||null:b.selectSingleNode?(c=x(b),c.setProperty&&c.setP",
    "roperty(\"SelectionLanguage\",\"XPath\"),b.selectSingleNode(a)):null}()",
    ";null===c||S.ba(c,a);return c};\nS.Ca=function(a,b){var c=function(){va",
    "r c=S.u(b,a,7);if(c){for(var e=c.snapshotLength,f=[],h=0;h<e;++h)f.push",
    "(c.snapshotItem(h));return f}return b.selectNodes?(c=x(b),c.setProperty",
    "&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selectNodes(a)):[]}(",
    ");q(c,function(b){S.ba(b,a)});return c};function hc(a,b,c,d){this.top=a",
    ";this.right=b;this.bottom=c;this.left=d}g=hc.prototype;g.clone=function",
    "(){return new hc(this.top,this.right,this.bottom,this.left)};g.toString",
    "=function(){return\"(\"+this.top+\"t, \"+this.right+\"r, \"+this.bottom",
    "+\"b, \"+this.left+\"l)\"};g.contains=function(a){return this&&a?a inst",
    "anceof hc?a.left>=this.left&&a.right<=this.right&&a.top>=this.top&&a.bo",
    "ttom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=",
    "this.bottom:!1};\ng.expand=function(a,b,c,d){fa(a)?(this.top-=a.top,thi",
    "s.right+=a.right,this.bottom+=a.bottom,this.left-=a.left):(this.top-=a,",
    "this.right+=Number(b),this.bottom+=Number(c),this.left-=Number(d));retu",
    "rn this};g.ceil=function(){this.top=Math.ceil(this.top);this.right=Math",
    ".ceil(this.right);this.bottom=Math.ceil(this.bottom);this.left=Math.cei",
    "l(this.left);return this};\ng.floor=function(){this.top=Math.floor(this",
    ".top);this.right=Math.floor(this.right);this.bottom=Math.floor(this.bot",
    "tom);this.left=Math.floor(this.left);return this};g.round=function(){th",
    "is.top=Math.round(this.top);this.right=Math.round(this.right);this.bott",
    "om=Math.round(this.bottom);this.left=Math.round(this.left);return this}",
    ";g.translate=function(a,b){a instanceof w?(this.left+=a.x,this.right+=a",
    ".x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,n(b)&&(t",
    "his.top+=b,this.bottom+=b));return this};\ng.scale=function(a,b){b=n(b)",
    "?b:a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=b;return this}",
    ";function U(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}",
    "g=U.prototype;g.clone=function(){return new U(this.left,this.top,this.w",
    "idth,this.height)};g.toString=function(){return\"(\"+this.left+\", \"+t",
    "his.top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};g.contains=func",
    "tion(a){return a instanceof w?a.x>=this.left&&a.x<=this.left+this.width",
    "&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&this.left",
    "+this.width>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.t",
    "op+a.height};\ng.ceil=function(){this.left=Math.ceil(this.left);this.to",
    "p=Math.ceil(this.top);this.width=Math.ceil(this.width);this.height=Math",
    ".ceil(this.height);return this};g.floor=function(){this.left=Math.floor",
    "(this.left);this.top=Math.floor(this.top);this.width=Math.floor(this.wi",
    "dth);this.height=Math.floor(this.height);return this};g.round=function(",
    "){this.left=Math.round(this.left);this.top=Math.round(this.top);this.wi",
    "dth=Math.round(this.width);this.height=Math.round(this.height);return t",
    "his};\ng.translate=function(a,b){a instanceof w?(this.left+=a.x,this.to",
    "p+=a.y):(this.left+=a,n(b)&&(this.top+=b));return this};g.scale=functio",
    "n(a,b){b=n(b)?b:a;this.left*=a;this.width*=a;this.top*=b;this.height*=b",
    ";return this};var ic=\"function\"===typeof ShadowRoot,jc=\"A AREA BUTTO",
    "N INPUT LABEL SELECT TEXTAREA\".split(\" \");function kc(a){return r(jc",
    ",function(b){return A(a,b)})||null!=Ya(a)&&0<=Number(a.tabIndex)||lc(a)",
    "}var mc=\"BUTTON INPUT OPTGROUP OPTION SELECT TEXTAREA\".split(\" \");",
    "\nfunction nc(a){return r(mc,function(b){return A(a,b)})?a.disabled?!1:",
    "a.parentNode&&1==a.parentNode.nodeType&&A(a,\"OPTGROUP\")||A(a,\"OPTION",
    "\")?nc(a.parentNode):!Va(a,function(a){var b=a.parentNode;if(b&&A(b,\"F",
    "IELDSET\")&&b.disabled){if(!A(a,\"LEGEND\"))return!0;for(;a=k(a.previou",
    "sElementSibling)?a.previousElementSibling:Qa(a.previousSibling);)if(A(a",
    ",\"LEGEND\"))return!0}return!1},!0):!0}var oc=\"text search tel url ema",
    "il password number\".split(\" \");\nfunction V(a,b){return A(a,\"INPUT",
    "\")?a.type.toLowerCase()==b:!1}function pc(a){function b(a){return\"inh",
    "erit\"==a.contentEditable?(a=qc(a))?b(a):!1:\"true\"==a.contentEditable",
    "}return k(a.contentEditable)?k(a.isContentEditable)?a.isContentEditable",
    ":b(a):!1}\nfunction lc(a){return((A(a,\"TEXTAREA\")?!0:A(a,\"INPUT\")?0",
    "<=oa(oc,a.type.toLowerCase()):pc(a)?!0:!1)||(A(a,\"INPUT\")?\"file\"==a",
    ".type.toLowerCase():!1)||V(a,\"range\")||V(a,\"date\")||V(a,\"month\")|",
    "|V(a,\"week\")||V(a,\"time\")||V(a,\"datetime-local\")||V(a,\"color\"))",
    "&&!a.readOnly}function qc(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.",
    "nodeType&&11!=a.nodeType;)a=a.parentNode;return A(a)?a:null}\nfunction ",
    "W(a,b){b=na(b);if(\"float\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"",
    "cssFloat\";a:{var c=b;var d=x(a);if(d.defaultView&&d.defaultView.getCom",
    "putedStyle&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getPr",
    "opertyValue(c)||\"\";break a}c=\"\"}a=c||rc(a,b);if(null===a)a=null;els",
    "e if(0<=oa(va,b)){b:{var e=a.match(ya);if(e&&(b=Number(e[1]),c=Number(e",
    "[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&25",
    "5>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(za)",
    ")if(b=Number(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&",
    "255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCa",
    "se();c=ua[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.",
    "length&&(c=c.replace(wa,\"#$1$1$2$2$3$3\")),!xa.test(c))){b=null;break ",
    "b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.s",
    "ubstr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return a}\nfunct",
    "ion rc(a,b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&ea(c.getPropert",
    "yValue)&&(d=c.getPropertyValue(b));return\"inherit\"!=d?k(d)?d:null:(a=",
    "qc(a))?rc(a,b):null}\nfunction sc(a,b,c){function d(a){var b=tc(a);retu",
    "rn 0<b.height&&0<b.width?!0:A(a,\"PATH\")&&(0<b.height||0<b.width)?(a=W",
    "(a,\"stroke-width\"),!!a&&0<parseInt(a,10)):\"hidden\"!=W(a,\"overflow",
    "\")&&r(a.childNodes,function(a){return 3==a.nodeType||A(a)&&d(a)})}func",
    "tion e(a){return uc(a)==X&&qa(a.childNodes,function(a){return!A(a)||e(a",
    ")||!d(a)})}if(!A(a))throw Error(\"Argument to isShown must be of type E",
    "lement\");if(A(a,\"BODY\"))return!0;if(A(a,\"OPTION\")||A(a,\"OPTGROUP",
    "\"))return a=Va(a,function(a){return A(a,\"SELECT\")}),\n!!a&&sc(a,!0,c",
    ");var f=vc(a);if(f)return!!f.fa&&0<f.rect.width&&0<f.rect.height&&sc(f.",
    "fa,b,c);if(A(a,\"INPUT\")&&\"hidden\"==a.type.toLowerCase()||A(a,\"NOSC",
    "RIPT\"))return!1;f=W(a,\"visibility\");return\"collapse\"!=f&&\"hidden",
    "\"!=f&&c(a)&&(b||0!=wc(a))&&d(a)?!e(a):!1}\nfunction xc(a){function b(a",
    "){if(A(a)&&\"none\"==W(a,\"display\"))return!1;a:{var c=a.parentNode;if",
    "(a.getDestinationInsertionPoints){var e=a.getDestinationInsertionPoints",
    "();if(0<e.length){a=e[e.length-1];break a}}a=c&&c.shadowRoot&&void 0!==",
    "a.assignedSlot?a.assignedSlot?a.assignedSlot.parentNode:null:c}return i",
    "c&&a instanceof ShadowRoot||a&&(9==a.nodeType||11==a.nodeType)?!0:!!a&&",
    "b(a)}return sc(a,!0,b)}var X=\"hidden\";\nfunction uc(a){function b(a){",
    "function b(a){return a==h?!0:0==W(a,\"display\").lastIndexOf(\"inline\"",
    ",0)||\"absolute\"==c&&\"static\"==W(a,\"position\")?!1:!0}var c=W(a,\"p",
    "osition\");if(\"fixed\"==c)return G=!0,a==h?null:h;for(a=qc(a);a&&!b(a)",
    ";)a=qc(a);return a}function c(a){var b=a;if(\"visible\"==y)if(a==h&&m)b",
    "=m;else if(a==m)return{x:\"visible\",y:\"visible\"};b={x:W(b,\"overflow",
    "-x\"),y:W(b,\"overflow-y\")};a==h&&(b.x=\"visible\"==b.x?\"auto\":b.x,b",
    ".y=\"visible\"==b.y?\"auto\":b.y);return b}function d(a){if(a==h){var b",
    "=(new Xa(f)).M;\na=b.scrollingElement?b.scrollingElement:b.body||b.docu",
    "mentElement;b=b.parentWindow||b.defaultView;a=new w(b.pageXOffset||a.sc",
    "rollLeft,b.pageYOffset||a.scrollTop)}else a=new w(a.scrollLeft,a.scroll",
    "Top);return a}var e=yc(a);var f=x(a),h=f.documentElement,m=f.body,y=W(h",
    ",\"overflow\"),G;for(a=b(a);a;a=b(a)){var t=c(a);if(\"visible\"!=t.x||",
    "\"visible\"!=t.y){var z=tc(a);if(0==z.width||0==z.height)return X;var M",
    "=e.right<z.left,T=e.bottom<z.top;if(M&&\"hidden\"==t.x||T&&\"hidden\"==",
    "t.y)return X;if(M&&\"visible\"!=t.x||\nT&&\"visible\"!=t.y){M=d(a);T=e.",
    "bottom<z.top-M.y;if(e.right<z.left-M.x&&\"visible\"!=t.x||T&&\"visible",
    "\"!=t.x)return X;e=uc(a);return e==X?X:\"scroll\"}M=e.left>=z.left+z.wi",
    "dth;z=e.top>=z.top+z.height;if(M&&\"hidden\"==t.x||z&&\"hidden\"==t.y)r",
    "eturn X;if(M&&\"visible\"!=t.x||z&&\"visible\"!=t.y){if(G&&(t=d(a),e.le",
    "ft>=h.scrollWidth-t.x||e.right>=h.scrollHeight-t.y))return X;e=uc(a);re",
    "turn e==X?X:\"scroll\"}}}return\"none\"}\nfunction tc(a){var b=vc(a);if",
    "(b)return b.rect;if(A(a,\"HTML\"))return a=x(a),a=((a?a.parentWindow||a",
    ".defaultView:window)||window).document,a=\"CSS1Compat\"==a.compatMode?a",
    ".documentElement:a.body,a=new Na(a.clientWidth,a.clientHeight),new U(0,",
    "0,a.width,a.height);try{var c=a.getBoundingClientRect()}catch(d){return",
    " new U(0,0,0,0)}return new U(c.left,c.top,c.right-c.left,c.bottom-c.top",
    ")}\nfunction vc(a){var b=A(a,\"MAP\");if(!b&&!A(a,\"AREA\"))return null",
    ";var c=b?a:A(a.parentNode,\"MAP\")?a.parentNode:null,d=null,e=null;c&&c",
    ".name&&(d=S.za('/descendant::*[@usemap = \"#'+c.name+'\"]',x(c)))&&(e=t",
    "c(d),b||\"default\"==a.shape.toLowerCase()||(a=zc(a),b=Math.min(Math.ma",
    "x(a.left,0),e.width),c=Math.min(Math.max(a.top,0),e.height),e=new U(b+e",
    ".left,c+e.top,Math.min(a.width,e.width-b),Math.min(a.height,e.height-c)",
    ")));return{fa:d,rect:e||new U(0,0,0,0)}}\nfunction zc(a){var b=a.shape.",
    "toLowerCase();a=a.coords.split(\",\");if(\"rect\"==b&&4==a.length){var ",
    "b=a[0],c=a[1];return new U(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.le",
    "ngth)return b=a[2],new U(a[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.len",
    "gth){for(var b=a[0],c=a[1],d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a",
    "[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);retur",
    "n new U(b,c,d-b,e-c)}return new U(0,0,0,0)}function yc(a){a=tc(a);retur",
    "n new hc(a.top,a.left+a.width,a.top+a.height,a.left)}\nfunction wc(a){v",
    "ar b=1,c=W(a,\"opacity\");c&&(b=Number(c));(a=qc(a))&&(b*=wc(a));return",
    " b};Ma();Ma();function Ac(a,b,c){this.B=a;this.pa=b;this.qa=c}Ac.protot",
    "ype.create=function(a){a=x(a).createEvent(\"HTMLEvents\");a.initEvent(t",
    "his.B,this.pa,this.qa);return a};Ac.prototype.toString=function(){retur",
    "n this.B};var Bc=new Ac(\"blur\",!1,!1),Cc=new Ac(\"change\",!0,!1);fun",
    "ction Dc(a,b){b=b.create(a,void 0);\"isTrusted\"in b||(b.isTrusted=!1);",
    "a.dispatchEvent(b)};function Ec(){this.N=ka.document.documentElement;va",
    "r a=Wa(x(this.N));a&&Fc(this,a)}function Fc(a,b){a.N=b;A(b,\"OPTION\")&",
    "&Va(b,function(a){return A(a,\"SELECT\")})}function Gc(a){var b=Va(a.N,",
    "function(a){return!!a&&A(a)&&kc(a)},!0),b=b||a.N;a=Wa(x(b));if(b!=a){if",
    "(a&&ea(a.blur)&&!A(a,\"BODY\"))try{a.blur()}catch(c){throw c;}ea(b.focu",
    "s)&&b.focus()}};function Hc(a,b){this.w={};this.g=[];this.G=0;var c=arg",
    "uments.length;if(1<c){if(c%2)throw Error(\"Uneven number of arguments\"",
    ");for(var d=0;d<c;d+=2)this.set(arguments[d],arguments[d+1])}else a&&th",
    "is.addAll(a)}function Ic(a){Jc(a);return a.g.concat()}g=Hc.prototype;g.",
    "clear=function(){this.w={};this.G=this.g.length=0};g.remove=function(a)",
    "{return Object.prototype.hasOwnProperty.call(this.w,a)?(delete this.w[a",
    "],this.G--,this.g.length>2*this.G&&Jc(this),!0):!1};\nfunction Jc(a){va",
    "r b,c;if(a.G!=a.g.length){for(b=c=0;c<a.g.length;){var d=a.g[c];Object.",
    "prototype.hasOwnProperty.call(a.w,d)&&(a.g[b++]=d);c++}a.g.length=b}if(",
    "a.G!=a.g.length){var e={};for(b=c=0;c<a.g.length;)d=a.g[c],Object.proto",
    "type.hasOwnProperty.call(e,d)||(a.g[b++]=d,e[d]=1),c++;a.g.length=b}}g.",
    "get=function(a,b){return Object.prototype.hasOwnProperty.call(this.w,a)",
    "?this.w[a]:b};g.set=function(a,b){Object.prototype.hasOwnProperty.call(",
    "this.w,a)||(this.G++,this.g.push(a));this.w[a]=b};\ng.addAll=function(a",
    "){if(a instanceof Hc){var b=Ic(a);Jc(a);for(var c=[],d=0;d<a.g.length;d",
    "++)c.push(a.w[a.g[d]]);a=c}else{b=[];var d=0;for(e in a)b[d++]=e;d=[];v",
    "ar e=0;for(c in a)d[e++]=a[c];a=d}for(c=0;c<b.length;c++)this.set(b[c],",
    "a[c])};g.forEach=function(a,b){for(var c=Ic(this),d=0;d<c.length;d++){v",
    "ar e=c[d],f=this.get(e);a.call(b,f,e,this)}};g.clone=function(){return ",
    "new Hc(this)};var Kc={};function Y(a,b,c){fa(a)&&(a=a.b);a=new Lc(a);!b",
    "||b in Kc&&!c||(Kc[b]={key:a,shift:!1},c&&(Kc[c]={key:a,shift:!0}));ret",
    "urn a}function Lc(a){this.code=a}Y(8);Y(9);Y(13);var Mc=Y(16),Nc=Y(17),",
    "Oc=Y(18);Y(19);Y(20);Y(27);Y(32,\" \");Y(33);Y(34);Y(35);Y(36);Y(37);Y(",
    "38);Y(39);Y(40);Y(44);Y(45);Y(46);Y(48,\"0\",\")\");Y(49,\"1\",\"!\");Y",
    "(50,\"2\",\"@\");Y(51,\"3\",\"#\");Y(52,\"4\",\"$\");Y(53,\"5\",\"%\");",
    "Y(54,\"6\",\"^\");Y(55,\"7\",\"&\");Y(56,\"8\",\"*\");Y(57,\"9\",\"(\")",
    ";Y(65,\"a\",\"A\");Y(66,\"b\",\"B\");Y(67,\"c\",\"C\");Y(68,\"d\",\"D\"",
    ");\nY(69,\"e\",\"E\");Y(70,\"f\",\"F\");Y(71,\"g\",\"G\");Y(72,\"h\",\"",
    "H\");Y(73,\"i\",\"I\");Y(74,\"j\",\"J\");Y(75,\"k\",\"K\");Y(76,\"l\",",
    "\"L\");Y(77,\"m\",\"M\");Y(78,\"n\",\"N\");Y(79,\"o\",\"O\");Y(80,\"p\"",
    ",\"P\");Y(81,\"q\",\"Q\");Y(82,\"r\",\"R\");Y(83,\"s\",\"S\");Y(84,\"t",
    "\",\"T\");Y(85,\"u\",\"U\");Y(86,\"v\",\"V\");Y(87,\"w\",\"W\");Y(88,\"",
    "x\",\"X\");Y(89,\"y\",\"Y\");Y(90,\"z\",\"Z\");var Pc=Y(Ia?{c:91,b:91}:",
    "Ha?{c:224,b:91}:{c:0,b:91});Y(Ia?{c:92,b:92}:Ha?{c:224,b:93}:{c:0,b:92}",
    ");Y(Ia?{c:93,b:93}:Ha?{c:0,b:0}:{c:93,b:null});Y({c:96,b:96},\"0\");Y({",
    "c:97,b:97},\"1\");\nY({c:98,b:98},\"2\");Y({c:99,b:99},\"3\");Y({c:100,",
    "b:100},\"4\");Y({c:101,b:101},\"5\");Y({c:102,b:102},\"6\");Y({c:103,b:",
    "103},\"7\");Y({c:104,b:104},\"8\");Y({c:105,b:105},\"9\");Y({c:106,b:10",
    "6},\"*\");Y({c:107,b:107},\"+\");Y({c:109,b:109},\"-\");Y({c:110,b:110}",
    ",\".\");Y({c:111,b:111},\"/\");Y(144);Y(112);Y(113);Y(114);Y(115);Y(116",
    ");Y(117);Y(118);Y(119);Y(120);Y(121);Y(122);Y(123);Y({c:107,b:187},\"=",
    "\",\"+\");Y(108,\",\");Y({c:109,b:189},\"-\",\"_\");Y(188,\",\",\"<\");",
    "Y(190,\".\",\">\");Y(191,\"/\",\"?\");Y(192,\"`\",\"~\");Y(219,\"[\",\"",
    "{\");\nY(220,\"\\\\\",\"|\");Y(221,\"]\",\"}\");Y({c:59,b:186},\";\",\"",
    ":\");Y(222,\"'\",'\"');var Qc=new Hc;Qc.set(1,Mc);Qc.set(2,Nc);Qc.set(4",
    ",Oc);Qc.set(8,Pc);(function(a){var b=new Hc;q(Ic(a),function(c){b.set(a",
    ".get(c).code,c)});return b})(Qc);function Z(){Ec.call(this)}p(Z,Ec);Z.W",
    "=void 0;Z.ra=function(){return Z.W?Z.W:Z.W=new Z};function Rc(a){var b=",
    "Z.ra();Fc(b,a);Gc(b)};ba(\"_\",function(a){if(!xc(a)||!nc(a)||\"none\"=",
    "=W(a,\"pointer-events\"))throw new u(12,\"Element is not currently inte",
    "ractable and may not be manipulated\");if(!lc(a))throw new u(12,\"Eleme",
    "nt must be user-editable in order to clear it.\");if(a.value){Rc(a);a.v",
    "alue=\"\";Dc(a,Cc);Dc(a,Bc);var b=ka.document.body;if(b)Rc(b);else thro",
    "w new u(13,\"Cannot unfocus element after clearing.\");}else A(a,\"INPU",
    "T\")&&a.getAttribute(\"type\")&&\"number\"==a.getAttribute(\"type\").to",
    "LowerCase()&&(Rc(a),a.value=\"\");pc(a)&&(Rc(a),a.innerHTML=\n\" \")});",
    "; return this._.apply(null,arguments);}.apply({navigator:typeof window!",
    "='undefined'?window.navigator:null,document:typeof window!='undefined'?",
    "window.document:null}, arguments);}",
    NULL
};

const char* const CLICK[] = {
    "function(){return function(){var g,aa=this;function k(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){return\"function\"=",
    "=ca(a)}function fa(a){var b=typeof a;return\"object\"==b&&null!=a||\"fu",
    "nction\"==b}function ga(a,b,c){return a.call.apply(a.bind,arguments)}\n",
    "function ha(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arr",
    "ay.prototype.slice.call(arguments,2);return function(){var c=Array.prot",
    "otype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a",
    ".apply(b,c)}}return function(){return a.apply(b,arguments)}}function ia",
    "(a,b,c){ia=Function.prototype.bind&&-1!=Function.prototype.bind.toStrin",
    "g().indexOf(\"native code\")?ga:ha;return ia.apply(null,arguments)}\nfu",
    "nction ja(a,b){var c=Array.prototype.slice.call(arguments,1);return fun",
    "ction(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b",
    ")}}function p(a,b){function c(){}c.prototype=b.prototype;a.Na=b.prototy",
    "pe;a.prototype=new c;a.prototype.constructor=a;a.La=function(a,c,f){for",
    "(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argu",
    "ments[e];return b.prototype[c].apply(a,d)}};var ka=window;var la=String",
    ".prototype.trim?function(a){return a.trim()}:function(a){return a.repla",
    "ce(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};\nfunction na(a,b){var c=0;a=la(",
    "String(a)).split(\".\");b=la(String(b)).split(\".\");for(var d=Math.max",
    "(a.length,b.length),e=0;0==c&&e<d;e++){var f=a[e]||\"\",h=b[e]||\"\";do",
    "{f=/(\\d*)(\\D*)(.*)/.exec(f)||[\"\",\"\",\"\",\"\"];h=/(\\d*)(\\D*)(.*",
    ")/.exec(h)||[\"\",\"\",\"\",\"\"];if(0==f[0].length&&0==h[0].length)bre",
    "ak;c=oa(0==f[1].length?0:parseInt(f[1],10),0==h[1].length?0:parseInt(h[",
    "1],10))||oa(0==f[2].length,0==h[2].length)||oa(f[2],h[2]);f=f[3];h=h[3]",
    "}while(0==c)}return c}function oa(a,b){return a<b?-1:a>b?1:0}\nfunction",
    " pa(a){return String(a).replace(/\\-([a-z])/g,function(a,c){return c.to",
    "UpperCase()})};function qa(a,b){if(m(a))return m(b)&&1==b.length?a.inde",
    "xOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;ret",
    "urn-1}function t(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c",
    ";e++)e in d&&b.call(void 0,d[e],e,a)}function ra(a,b,c){var d=c;t(a,fun",
    "ction(c,f){d=b.call(void 0,d,c,f,a)});return d}function sa(a,b){for(var",
    " c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0",
    ",d[e],e,a))return!0;return!1}\nfunction ta(a,b){for(var c=a.length,d=m(",
    "a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))retu",
    "rn!1;return!0}function ua(a){return Array.prototype.concat.apply([],arg",
    "uments)}function va(a){var b=a.length;if(0<b){for(var c=Array(b),d=0;d<",
    "b;d++)c[d]=a[d];return c}return[]}function wa(a,b,c){return 2>=argument",
    "s.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b",
    ",c)};var xa={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:\"#00f",
    "fff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",bisque",
    ":\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"#0000f",
    "f\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887\",cade",
    "tblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",coral:\"",
    "#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimson:\"#dc",
    "143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkg",
    "oldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\",\ndarkg",
    "rey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolive",
    "green:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred",
    ":\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateb",
    "lue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f4f\",dar",
    "kturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deep",
    "skyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:",
    "\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",forestgreen:",
    "\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhite:\"#f",
    "8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",green:",
    "\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#f0fff0",
    "\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",ivory:",
    "\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:\"#fff",
    "0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"#add8e",
    "6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodyellow:",
    "\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey:\"#d",
    "3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightseagreen:",
    "\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",lightsl",
    "ategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",",
    "lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff0",
    "0ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#000",
    "0cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagreen:",
    "\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",m",
    "ediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#",
    "191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#ffe4",
    "b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",olive",
    ":\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#ff45",
    "00\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb98\"",
    ",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip:\"#ffef",
    "d5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dd",
    "a0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",rosybr",
    "own:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"",
    "#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:\"#fff",
    "5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slatebl",
    "ue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:\"#fffa",
    "fa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal",
    ":\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0",
    "\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"",
    "#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var ya=\"backgrou",
    "ndColor borderTopColor borderRightColor borderBottomColor borderLeftCol",
    "or color outlineColor\".split(\" \"),za=/#([0-9a-fA-F])([0-9a-fA-F])([0",
    "-9a-fA-F])/,Aa=/^#(?:[0-9a-f]{3}){1,2}$/i,Ba=/^(?:rgba)?\\((\\d{1,3}),",
    "\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,Ca=/^(?:rgb)?\\(",
    "(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$/i;fun",
    "ction u(a,b){this.code=a;this.state=w[a]||Da;this.message=b||\"\";a=thi",
    "s.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase()",
    ".replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error",
    "\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=this.nam",
    "e;this.stack=a.stack||\"\"}p(u,Error);var Da=\"unknown error\",w={15:\"",
    "element not selectable\",11:\"element not visible\"};w[31]=Da;w[30]=Da;",
    "w[24]=\"invalid cookie domain\";w[29]=\"invalid element coordinates\";w",
    "[12]=\"invalid element state\";\nw[32]=\"invalid selector\";w[51]=\"inv",
    "alid selector\";w[52]=\"invalid selector\";w[17]=\"javascript error\";w",
    "[405]=\"unsupported operation\";w[34]=\"move target out of bounds\";w[2",
    "7]=\"no such alert\";w[7]=\"no such element\";w[8]=\"no such frame\";w[",
    "23]=\"no such window\";w[28]=\"script timeout\";w[33]=\"session not cre",
    "ated\";w[10]=\"stale element reference\";w[21]=\"timeout\";w[25]=\"unab",
    "le to set cookie\";w[26]=\"unexpected alert open\";w[13]=Da;w[9]=\"unkn",
    "own command\";u.prototype.toString=function(){return this.name+\": \"+t",
    "his.message};var x;a:{var Ea=aa.navigator;if(Ea){var Fa=Ea.userAgent;if",
    "(Fa){x=Fa;break a}}x=\"\"};function Ga(a){var b=Ha;Object.prototype.has",
    "OwnProperty.call(b,\"528\")||(b[\"528\"]=a(\"528\"))};var Ia=-1!=x.inde",
    "xOf(\"Macintosh\"),Ja=-1!=x.indexOf(\"Windows\"),Ka,La=\"\",Ma=/WebKit",
    "\\/(\\S+)/.exec(x);Ma&&(La=Ma?Ma[1]:\"\");Ka=La;var Ha={};function Na()",
    "{Ga(function(){return 0<=na(Ka,\"528\")})};function Oa(a){return(a=a.ex",
    "ec(x))?a[1]:\"\"}var Pa=-1!=x.indexOf(\"iPhone\")&&-1==x.indexOf(\"iPod",
    "\")&&-1==x.indexOf(\"iPad\")||-1!=x.indexOf(\"iPad\")||-1!=x.indexOf(\"",
    "iPod\")?Oa(/CriOS\\/([0-9.]+)/):Oa(/Chrome\\/([0-9.]+)/);var Qa=10<=Num",
    "ber(void 0);function z(a,b){this.x=k(a)?a:0;this.y=k(b)?b:0}g=z.prototy",
    "pe;g.clone=function(){return new z(this.x,this.y)};g.toString=function(",
    "){return\"(\"+this.x+\", \"+this.y+\")\"};g.ceil=function(){this.x=Math",
    ".ceil(this.x);this.y=Math.ceil(this.y);return this};g.floor=function(){",
    "this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};g.roun",
    "d=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return",
    " this};\ng.translate=function(a,b){a instanceof z?(this.x+=a.x,this.y+=",
    "a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};g.scale=functio",
    "n(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Ra(a,b){thi",
    "s.width=a;this.height=b}g=Ra.prototype;g.clone=function(){return new Ra",
    "(this.width,this.height)};g.toString=function(){return\"(\"+this.width+",
    "\" x \"+this.height+\")\"};g.ceil=function(){this.width=Math.ceil(this.",
    "width);this.height=Math.ceil(this.height);return this};g.floor=function",
    "(){this.width=Math.floor(this.width);this.height=Math.floor(this.height",
    ");return this};g.round=function(){this.width=Math.round(this.width);thi",
    "s.height=Math.round(this.height);return this};\ng.scale=function(a,b){b",
    "=n(b)?b:a;this.width*=a;this.height*=b;return this};function Sa(a){retu",
    "rn a?a.parentWindow||a.defaultView:window}function Ta(a,b,c){function d",
    "(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.length",
    ";e++){var f=c[e];!da(f)||fa(f)&&0<f.nodeType?d(f):t(Ua(f)?va(f):f,d)}}f",
    "unction Va(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}\nfun",
    "ction Wa(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a=",
    "=b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)re",
    "turn a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parent",
    "Node;return b==a}\nfunction Xa(a,b){if(a==b)return 0;if(a.compareDocume",
    "ntPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex",
    "\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeTy",
    "pe,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.p",
    "arentNode,f=b.parentNode;return e==f?Ya(a,b):!c&&Wa(e,b)?-1*Za(a,b):!d&",
    "&Wa(f,a)?Za(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sou",
    "rceIndex)}d=A(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.c",
    "reateRange();a.selectNode(b);\na.collapse(!0);return c.compareBoundaryP",
    "oints(aa.Range.START_TO_END,a)}function Za(a,b){var c=a.parentNode;if(c",
    "==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Ya(b,a)}functi",
    "on Ya(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}function",
    " A(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Ua(a)",
    "{if(a&&\"number\"==typeof a.length){if(fa(a))return\"function\"==typeof",
    " a.item||\"string\"==typeof a.item;if(ea(a))return\"function\"==typeof ",
    "a.item}return!1}\nfunction $a(a,b,c){a&&!c&&(a=a.parentNode);for(c=0;a;",
    "){if(b(a))return a;a=a.parentNode;c++}return null}function ab(a){try{re",
    "turn a&&a.activeElement}catch(b){}return null}function bb(a){this.R=a||",
    "aa.document||document}g=bb.prototype;g.I=function(a){return m(a)?this.R",
    ".getElementById(a):a};g.getElementsByTagName=function(a,b){return(b||th",
    "is.R).getElementsByTagName(String(a))};g.createElement=function(a){retu",
    "rn this.R.createElement(String(a))};g.createTextNode=function(a){return",
    " this.R.createTextNode(String(a))};\ng.appendChild=function(a,b){a.appe",
    "ndChild(b)};g.append=function(a,b){Ta(A(a),a,arguments)};g.canHaveChild",
    "ren=function(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPL",
    "ET\":case \"AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAN",
    "D\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT",
    "\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case ",
    "\"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PAR",
    "AM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case",
    " \"WBR\":return!1}return!0};\ng.removeNode=function(a){return a&&a.pare",
    "ntNode?a.parentNode.removeChild(a):null};g.contains=Wa;function cb(a){v",
    "ar b=\"tabindex\";return\"style\"==b?db(a.style.cssText):(a=a.getAttrib",
    "uteNode(b))&&a.specified?a.value:null}var eb=/[;]+(?=(?:(?:[^\"]*\"){2}",
    ")*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\\([^()]*\\))*[^()]*$",
    ")/;function db(a){var b=[];t(a.split(eb),function(a){var c=a.indexOf(\"",
    ":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a.length&&b.push(a[0].toLow",
    "erCase(),\":\",a[1],\";\"))});b=b.join(\"\");return b=\";\"==b.charAt(b",
    ".length-1)?b:b+\";\"}\nfunction B(a,b){b&&\"string\"!==typeof b&&(b=b.t",
    "oString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}f",
    "unction fb(a){return B(a,\"OPTION\")?!0:B(a,\"INPUT\")?(a=a.type.toLowe",
    "rCase(),\"checkbox\"==a||\"radio\"==a):!1}function gb(a){if(!fb(a))thro",
    "w new u(15,\"Element is not selectable\");var b=\"selected\",c=a.type&&",
    "a.type.toLowerCase();if(\"checkbox\"==c||\"radio\"==c)b=\"checked\";ret",
    "urn!!a[b]};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, I",
    "nc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, ",
    "free of charge, to any person obtaining a copy\n of this software and a",
    "ssociated documentation files (the \"Software\"), to\n deal in the Soft",
    "ware without restriction, including without limitation the\n rights to ",
    "use, copy, modify, merge, publish, distribute, sublicense, and/or\n sel",
    "l copies of the Software, and to permit persons to whom the Software is",
    "\n furnished to do so, subject to the following conditions:\n\n The abo",
    "ve copyright notice and this permission notice shall be included in\n a",
    "ll copies or substantial portions of the Software.\n\n THE SOFTWARE IS ",
    "PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED,",
    " INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITN",
    "ESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
    "\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTH",
    "ER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, AR",
    "ISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR O",
    "THER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction hb(a,b,c){this.v=a;this.",
    "Ia=b||1;this.u=c||1};function ib(a){this.ja=a;this.Z=0}function jb(a){a",
    "=a.match(kb);for(var b=0;b<a.length;b++)lb.test(a[b])&&a.splice(b,1);re",
    "turn new ib(a)}var kb=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9",
    "-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^",
    "\"]*\"|'[^']*'|[!<>]=|\\s+|./g,lb=/^\\s/;function C(a,b){return a.ja[a.",
    "Z+(b||0)]}ib.prototype.next=function(){return this.ja[this.Z++]};ib.pro",
    "totype.back=function(){this.Z--};ib.prototype.empty=function(){return t",
    "his.ja.length<=this.Z};function D(a){var b=null,c=a.nodeType;1==c&&(b=a",
    ".textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"",
    "\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a",
    ".firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeVal",
    "ue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}",
    "else b=a.nodeValue;return\"\"+b}\nfunction mb(a,b,c){if(null===b)return",
    "!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==c?!!a",
    ".getAttribute(b):a.getAttribute(b,2)==c}function nb(a,b,c,d,e){return o",
    "b.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new E)}\nfunction ob(a,b,c,d",
    ",e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),t(b,f",
    "unction(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"cla",
    "ss\"==c?(b=b.getElementsByClassName(d),t(b,function(b){b.className==d&&",
    "a.matches(b)&&e.add(b)})):a instanceof F?pb(a,b,c,d,e):b.getElementsByT",
    "agName&&(b=b.getElementsByTagName(a.getName()),t(b,function(a){mb(a,c,d",
    ")&&e.add(a)}));return e}\nfunction pb(a,b,c,d,e){for(b=b.firstChild;b;b",
    "=b.nextSibling)mb(b,c,d)&&a.matches(b)&&e.add(b),pb(a,b,c,d,e)};functio",
    "n E(){this.u=this.m=null;this.T=0}function qb(a){this.node=a;this.next=",
    "this.L=null}function rb(a,b){if(!a.m)return b;if(!b.m)return a;var c=a.",
    "m;b=b.m;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.nex",
    "t):0<Xa(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.L=d)?d.next=e:a",
    ".m=e,d=e,f++;for(e=c||b;e;)e.L=d,d=d.next=e,f++,e=e.next;a.u=d;a.T=f;re",
    "turn a}E.prototype.unshift=function(a){a=new qb(a);a.next=this.m;this.u",
    "?this.m.L=a:this.m=this.u=a;this.m=a;this.T++};\nE.prototype.add=functi",
    "on(a){a=new qb(a);a.L=this.u;this.m?this.u.next=a:this.m=this.u=a;this.",
    "u=a;this.T++};function sb(a){return(a=a.m)?a.node:null}E.prototype.A=fu",
    "nction(){return this.T};function tb(a){return(a=sb(a))?D(a):\"\"}E.prot",
    "otype.iterator=function(a){return new ub(this,!!a)};function ub(a,b){th",
    "is.Ea=a;this.oa=(this.O=b)?a.u:a.m;this.ga=null}ub.prototype.next=funct",
    "ion(){var a=this.oa;if(null==a)return null;var b=this.ga=a;this.oa=this",
    ".O?a.L:a.next;return b.node};\nub.prototype.remove=function(){var a=thi",
    "s.Ea,b=this.ga;if(!b)throw Error(\"Next must be called at least once be",
    "fore remove.\");var c=b.L,b=b.next;c?c.next=b:a.m=b;b?b.L=c:a.u=c;a.T--",
    ";this.ga=null};function G(a){this.l=a;this.o=this.F=!1;this.U=null}func",
    "tion H(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}G",
    ".prototype.i=function(){return this.F};function vb(a,b){a.F=b}function ",
    "wb(a,b){a.o=b}G.prototype.J=function(){return this.U};function I(a,b){a",
    "=a.evaluate(b);return a instanceof E?+tb(a):+a}function K(a,b){a=a.eval",
    "uate(b);return a instanceof E?tb(a):\"\"+a}function xb(a,b){a=a.evaluat",
    "e(b);return a instanceof E?!!a.A():!!a};function yb(a,b,c){G.call(this,",
    "a.l);this.ia=a;this.ta=b;this.ya=c;this.F=b.i()||c.i();this.o=b.o||c.o;",
    "this.ia==zb&&(c.o||c.i()||4==c.l||0==c.l||!b.J()?b.o||b.i()||4==b.l||0=",
    "=b.l||!c.J()||(this.U={name:c.J().name,P:b}):this.U={name:b.J().name,P:",
    "c})}p(yb,G);\nfunction Ab(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);va",
    "r f;if(b instanceof E&&c instanceof E){b=b.iterator();for(d=b.next();d;",
    "d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a(D(d),D(f)))r",
    "eturn!0;return!1}if(b instanceof E||c instanceof E){b instanceof E?(e=b",
    ",d=c):(e=c,d=b);f=e.iterator();for(var h=typeof d,l=f.next();l;l=f.next",
    "()){switch(h){case \"number\":l=+D(l);break;case \"boolean\":l=!!D(l);b",
    "reak;case \"string\":l=D(l);break;default:throw Error(\"Illegal primiti",
    "ve type for comparison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}re",
    "turn!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c)",
    ":\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}yb",
    ".prototype.evaluate=function(a){return this.ia.w(this.ta,this.ya,a)};yb",
    ".prototype.toString=function(){var a=\"Binary Expression: \"+this.ia,a=",
    "a+H(this.ta);return a+=H(this.ya)};function Bb(a,b,c,d){this.Ha=a;this.",
    "wa=b;this.l=c;this.w=d}Bb.prototype.toString=function(){return this.Ha}",
    ";var Cb={};\nfunction L(a,b,c,d){if(Cb.hasOwnProperty(a))throw Error(\"",
    "Binary operator already created: \"+a);a=new Bb(a,b,c,d);return Cb[a.to",
    "String()]=a}L(\"div\",6,1,function(a,b,c){return I(a,c)/I(b,c)});L(\"mo",
    "d\",6,1,function(a,b,c){return I(a,c)%I(b,c)});L(\"*\",6,1,function(a,b",
    ",c){return I(a,c)*I(b,c)});L(\"+\",5,1,function(a,b,c){return I(a,c)+I(",
    "b,c)});L(\"-\",5,1,function(a,b,c){return I(a,c)-I(b,c)});L(\"<\",4,2,f",
    "unction(a,b,c){return Ab(function(a,b){return a<b},a,b,c)});\nL(\">\",4",
    ",2,function(a,b,c){return Ab(function(a,b){return a>b},a,b,c)});L(\"<=",
    "\",4,2,function(a,b,c){return Ab(function(a,b){return a<=b},a,b,c)});L(",
    "\">=\",4,2,function(a,b,c){return Ab(function(a,b){return a>=b},a,b,c)}",
    ");var zb=L(\"=\",3,2,function(a,b,c){return Ab(function(a,b){return a==",
    "b},a,b,c,!0)});L(\"!=\",3,2,function(a,b,c){return Ab(function(a,b){ret",
    "urn a!=b},a,b,c,!0)});L(\"and\",2,2,function(a,b,c){return xb(a,c)&&xb(",
    "b,c)});L(\"or\",1,2,function(a,b,c){return xb(a,c)||xb(b,c)});function ",
    "Db(a,b){if(b.A()&&4!=a.l)throw Error(\"Primary expression must evaluate",
    " to nodeset if filter has predicate(s).\");G.call(this,a.l);this.xa=a;t",
    "his.f=b;this.F=a.i();this.o=a.o}p(Db,G);Db.prototype.evaluate=function(",
    "a){a=this.xa.evaluate(a);return Eb(this.f,a)};Db.prototype.toString=fun",
    "ction(){var a=\"Filter:\"+H(this.xa);return a+=H(this.f)};function Fb(a",
    ",b){if(b.length<a.va)throw Error(\"Function \"+a.s+\" expects at least",
    "\"+a.va+\" arguments, \"+b.length+\" given\");if(null!==a.ha&&b.length>",
    "a.ha)throw Error(\"Function \"+a.s+\" expects at most \"+a.ha+\" argume",
    "nts, \"+b.length+\" given\");a.Fa&&t(b,function(b,d){if(4!=b.l)throw Er",
    "ror(\"Argument \"+d+\" to function \"+a.s+\" is not of type Nodeset: \"",
    "+b);});G.call(this,a.l);this.X=a;this.ea=b;vb(this,a.F||sa(b,function(a",
    "){return a.i()}));wb(this,a.Da&&!b.length||a.Ca&&!!b.length||sa(b,funct",
    "ion(a){return a.o}))}\np(Fb,G);Fb.prototype.evaluate=function(a){return",
    " this.X.w.apply(null,ua(a,this.ea))};Fb.prototype.toString=function(){v",
    "ar a=\"Function: \"+this.X;if(this.ea.length)var b=ra(this.ea,function(",
    "a,b){return a+H(b)},\"Arguments:\"),a=a+H(b);return a};function Gb(a,b,",
    "c,d,e,f,h,l,q){this.s=a;this.l=b;this.F=c;this.Da=d;this.Ca=e;this.w=f;",
    "this.va=h;this.ha=k(l)?l:h;this.Fa=!!q}Gb.prototype.toString=function()",
    "{return this.s};var Hb={};\nfunction M(a,b,c,d,e,f,h,l){if(Hb.hasOwnPro",
    "perty(a))throw Error(\"Function already created: \"+a+\".\");Hb[a]=new ",
    "Gb(a,b,c,d,!1,e,f,h,l)}M(\"boolean\",2,!1,!1,function(a,b){return xb(b,",
    "a)},1);M(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(I(b,a))},1)",
    ";M(\"concat\",3,!1,!1,function(a,b){return ra(wa(arguments,1),function(",
    "b,d){return b+K(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,",
    "b,c){b=K(b,a);a=K(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,f",
    "unction(a,b){return b.evaluate(a).A()},1,1,!0);\nM(\"false\",2,!1,!1,fu",
    "nction(){return!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.flo",
    "or(I(b,a))},1);M(\"id\",4,!1,!1,function(a,b){var c=a.v,d=9==c.nodeType",
    "?c:c.ownerDocument;a=K(b,a).split(/\\s+/);var e=[];t(a,function(a){a=d.",
    "getElementById(a);!a||0<=qa(e,a)||e.push(a)});e.sort(Xa);var f=new E;t(",
    "e,function(a){f.add(a)});return f},1);M(\"lang\",2,!1,!1,function(){ret",
    "urn!1},1);M(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw E",
    "rror(\"Function last expects ()\");return a.u},0);\nM(\"local-name\",3,",
    "!1,!0,function(a,b){return(a=b?sb(b.evaluate(a)):a.v)?a.localName||a.no",
    "deName.toLowerCase():\"\"},0,1,!0);M(\"name\",3,!1,!0,function(a,b){ret",
    "urn(a=b?sb(b.evaluate(a)):a.v)?a.nodeName.toLowerCase():\"\"},0,1,!0);M",
    "(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);M(\"normalize",
    "-space\",3,!1,!0,function(a,b){return(b?K(b,a):D(a.v)).replace(/[\\s\\x",
    "a0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);M(\"not\",2,!1,!1,func",
    "tion(a,b){return!xb(b,a)},1);\nM(\"number\",1,!1,!0,function(a,b){retur",
    "n b?I(b,a):+D(a.v)},0,1);M(\"position\",1,!0,!1,function(a){return a.Ia",
    "},0);M(\"round\",1,!1,!1,function(a,b){return Math.round(I(b,a))},1);M(",
    "\"starts-with\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return 0==b.l",
    "astIndexOf(a,0)},2);M(\"string\",3,!1,!0,function(a,b){return b?K(b,a):",
    "D(a.v)},0,1);M(\"string-length\",1,!1,!0,function(a,b){return(b?K(b,a):",
    "D(a.v)).length},0,1);\nM(\"substring\",3,!1,!1,function(a,b,c,d){c=I(c,",
    "a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?I(d,a):Infinit",
    "y;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.ma",
    "x(c,0);a=K(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.",
    "round(d))},2,3);M(\"substring-after\",3,!1,!1,function(a,b,c){b=K(b,a);",
    "a=K(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\n",
    "M(\"substring-before\",3,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);a=b.in",
    "dexOf(a);return-1==a?\"\":b.substring(0,a)},2);M(\"sum\",1,!1,!1,functi",
    "on(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())",
    "b+=+D(c);return b},1,1,!0);M(\"translate\",3,!1,!1,function(a,b,c,d){b=",
    "K(b,a);c=K(c,a);var e=K(d,a);d={};for(var f=0;f<c.length;f++)a=c.charAt",
    "(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.charAt",
    "(f),c+=a in d?d[a]:a;return c},3);M(\"true\",2,!1,!1,function(){return!",
    "0},0);function F(a,b){this.Aa=a;this.ua=k(b)?b:null;this.B=null;switch(",
    "a){case \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"",
    "processing-instruction\":this.B=7;break;case \"node\":break;default:thr",
    "ow Error(\"Unexpected argument\");}}function Ib(a){return\"comment\"==a",
    "||\"text\"==a||\"processing-instruction\"==a||\"node\"==a}F.prototype.m",
    "atches=function(a){return null===this.B||this.B==a.nodeType};F.prototyp",
    "e.getName=function(){return this.Aa};\nF.prototype.toString=function(){",
    "var a=\"Kind Test: \"+this.Aa;null===this.ua||(a+=H(this.ua));return a}",
    ";function Jb(a){G.call(this,3);this.za=a.substring(1,a.length-1)}p(Jb,G",
    ");Jb.prototype.evaluate=function(){return this.za};Jb.prototype.toStrin",
    "g=function(){return\"Literal: \"+this.za};function Kb(a,b){this.s=a.toL",
    "owerCase();a=\"*\"==this.s?\"*\":\"http://www.w3.org/1999/xhtml\";this.",
    "aa=b?b.toLowerCase():a}Kb.prototype.matches=function(a){var b=a.nodeTyp",
    "e;if(1!=b&&2!=b)return!1;b=k(a.localName)?a.localName:a.nodeName;return",
    "\"*\"!=this.s&&this.s!=b.toLowerCase()?!1:\"*\"==this.aa?!0:this.aa==(a",
    ".namespaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xht",
    "ml\")};Kb.prototype.getName=function(){return this.s};\nKb.prototype.to",
    "String=function(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml",
    "\"==this.aa?\"\":this.aa+\":\")+this.s};function Lb(a){G.call(this,1);t",
    "his.Ba=a}p(Lb,G);Lb.prototype.evaluate=function(){return this.Ba};Lb.pr",
    "ototype.toString=function(){return\"Number: \"+this.Ba};function Mb(a,b",
    "){G.call(this,a.l);this.ra=a;this.V=b;this.F=a.i();this.o=a.o;1==this.V",
    ".length&&(a=this.V[0],a.fa||a.H!=Nb||(a=a.da,\"*\"!=a.getName()&&(this.",
    "U={name:a.getName(),P:null})))}p(Mb,G);function Ob(){G.call(this,4)}p(O",
    "b,G);Ob.prototype.evaluate=function(a){var b=new E;a=a.v;9==a.nodeType?",
    "b.add(a):b.add(a.ownerDocument);return b};Ob.prototype.toString=functio",
    "n(){return\"Root Helper Expression\"};function Pb(){G.call(this,4)}p(Pb",
    ",G);Pb.prototype.evaluate=function(a){var b=new E;b.add(a.v);return b};",
    "\nPb.prototype.toString=function(){return\"Context Helper Expression\"}",
    ";function Qb(a){return\"/\"==a||\"//\"==a}\nMb.prototype.evaluate=funct",
    "ion(a){var b=this.ra.evaluate(a);if(!(b instanceof E))throw Error(\"Fil",
    "ter expression must evaluate to nodeset.\");a=this.V;for(var c=0,d=a.le",
    "ngth;c<d&&b.A();c++){var e=a[c],f=b.iterator(e.H.O);if(e.i()||e.H!=Rb)i",
    "f(e.i()||e.H!=Sb){var h=f.next();for(b=e.evaluate(new hb(h));null!=(h=f",
    ".next());)h=e.evaluate(new hb(h)),b=rb(b,h)}else h=f.next(),b=e.evaluat",
    "e(new hb(h));else{for(h=f.next();(b=f.next())&&(!h.contains||h.contains",
    "(b))&&b.compareDocumentPosition(h)&8;h=b);b=e.evaluate(new hb(h))}}retu",
    "rn b};\nMb.prototype.toString=function(){var a=\"Path Expression:\"+H(t",
    "his.ra);if(this.V.length){var b=ra(this.V,function(a,b){return a+H(b)},",
    "\"Steps:\");a+=H(b)}return a};function Tb(a,b){this.f=a;this.O=!!b}func",
    "tion Eb(a,b,c){for(c=c||0;c<a.f.length;c++)for(var d=a.f[c],e=b.iterato",
    "r(),f=b.A(),h,l=0;h=e.next();l++){var q=a.O?f-l:l+1;h=d.evaluate(new hb",
    "(h,q,f));if(\"number\"==typeof h)q=q==h;else if(\"string\"==typeof h||",
    "\"boolean\"==typeof h)q=!!h;else if(h instanceof E)q=0<h.A();else throw",
    " Error(\"Predicate.evaluate returned an unexpected type.\");q||e.remove",
    "()}return b}Tb.prototype.J=function(){return 0<this.f.length?this.f[0].",
    "J():null};\nTb.prototype.i=function(){for(var a=0;a<this.f.length;a++){",
    "var b=this.f[a];if(b.i()||1==b.l||0==b.l)return!0}return!1};Tb.prototyp",
    "e.A=function(){return this.f.length};Tb.prototype.toString=function(){r",
    "eturn ra(this.f,function(a,b){return a+H(b)},\"Predicates:\")};function",
    " N(a,b,c,d){G.call(this,4);this.H=a;this.da=b;this.f=c||new Tb([]);this",
    ".fa=!!d;b=this.f.J();a.Ka&&b&&(this.U={name:b.name,P:b.P});this.F=this.",
    "f.i()}p(N,G);\nN.prototype.evaluate=function(a){var b=a.v,c=this.J(),d=",
    "null,e=null,f=0;c&&(d=c.name,e=c.P?K(c.P,a):null,f=1);if(this.fa)if(thi",
    "s.i()||this.H!=Ub)if(b=(new N(Vb,new F(\"node\"))).evaluate(a).iterator",
    "(),c=b.next())for(a=this.w(c,d,e,f);null!=(c=b.next());)a=rb(a,this.w(c",
    ",d,e,f));else a=new E;else a=nb(this.da,b,d,e),a=Eb(this.f,a,f);else a=",
    "this.w(a.v,d,e,f);return a};N.prototype.w=function(a,b,c,d){a=this.H.X(",
    "this.da,a,b,c);return a=Eb(this.f,a,d)};\nN.prototype.toString=function",
    "(){var a=\"Step:\"+H(\"Operator: \"+(this.fa?\"//\":\"/\"));this.H.s&&(",
    "a+=H(\"Axis: \"+this.H));a+=H(this.da);if(this.f.A()){var b=ra(this.f.f",
    ",function(a,b){return a+H(b)},\"Predicates:\");a+=H(b)}return a};functi",
    "on Wb(a,b,c,d){this.s=a;this.X=b;this.O=c;this.Ka=d}Wb.prototype.toStri",
    "ng=function(){return this.s};var Xb={};function O(a,b,c,d){if(Xb.hasOwn",
    "Property(a))throw Error(\"Axis already created: \"+a);b=new Wb(a,b,c,!!",
    "d);return Xb[a]=b}\nO(\"ancestor\",function(a,b){for(var c=new E;b=b.pa",
    "rentNode;)a.matches(b)&&c.unshift(b);return c},!0);O(\"ancestor-or-self",
    "\",function(a,b){var c=new E;do a.matches(b)&&c.unshift(b);while(b=b.pa",
    "rentNode);return c},!0);\nvar Nb=O(\"attribute\",function(a,b){var c=ne",
    "w E,d=a.getName();if(b=b.attributes)if(a instanceof F&&null===a.B||\"*",
    "\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);r",
    "eturn c},!1),Ub=O(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:",
    "null;e=e||new E;for(b=b.firstChild;b;b=b.nextSibling)mb(b,c,d)&&a.match",
    "es(b)&&e.add(b);return e},!1,!0);O(\"descendant\",nb,!1,!0);\nvar Vb=O(",
    "\"descendant-or-self\",function(a,b,c,d){var e=new E;mb(b,c,d)&&a.match",
    "es(b)&&e.add(b);return nb(a,b,c,d,e)},!1,!0),Rb=O(\"following\",functio",
    "n(a,b,c,d){var e=new E;do for(var f=b;f=f.nextSibling;)mb(f,c,d)&&a.mat",
    "ches(f)&&e.add(f),e=nb(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0",
    ");O(\"following-sibling\",function(a,b){for(var c=new E;b=b.nextSibling",
    ";)a.matches(b)&&c.add(b);return c},!1);O(\"namespace\",function(){retur",
    "n new E},!1);\nvar Yb=O(\"parent\",function(a,b){var c=new E;if(9==b.no",
    "deType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.par",
    "entNode;a.matches(b)&&c.add(b);return c},!1),Sb=O(\"preceding\",functio",
    "n(a,b,c,d){var e=new E,f=[];do f.unshift(b);while(b=b.parentNode);for(v",
    "ar h=1,l=f.length;h<l;h++){var q=[];for(b=f[h];b=b.previousSibling;)q.u",
    "nshift(b);for(var y=0,r=q.length;y<r;y++)b=q[y],mb(b,c,d)&&a.matches(b)",
    "&&e.add(b),e=nb(a,b,c,d,e)}return e},!0,!0);\nO(\"preceding-sibling\",f",
    "unction(a,b){for(var c=new E;b=b.previousSibling;)a.matches(b)&&c.unshi",
    "ft(b);return c},!0);var Zb=O(\"self\",function(a,b){var c=new E;a.match",
    "es(b)&&c.add(b);return c},!1);function $b(a){G.call(this,1);this.qa=a;t",
    "his.F=a.i();this.o=a.o}p($b,G);$b.prototype.evaluate=function(a){return",
    "-I(this.qa,a)};$b.prototype.toString=function(){return\"Unary Expressio",
    "n: -\"+H(this.qa)};function ac(a){G.call(this,4);this.ba=a;vb(this,sa(t",
    "his.ba,function(a){return a.i()}));wb(this,sa(this.ba,function(a){retur",
    "n a.o}))}p(ac,G);ac.prototype.evaluate=function(a){var b=new E;t(this.b",
    "a,function(c){c=c.evaluate(a);if(!(c instanceof E))throw Error(\"Path e",
    "xpression must evaluate to NodeSet.\");b=rb(b,c)});return b};ac.prototy",
    "pe.toString=function(){return ra(this.ba,function(a,b){return a+H(b)},",
    "\"Union Expression:\")};function bc(a,b){this.a=a;this.Ga=b}function cc",
    "(a){for(var b,c=[];;){P(a,\"Missing right hand side of binary expressio",
    "n.\");b=dc(a);var d=a.a.next();if(!d)break;var e=(d=Cb[d]||null)&&d.wa;",
    "if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].wa;)b=new yb(c.",
    "pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new yb(c.pop(),c.pop(),b)",
    ";return b}function P(a,b){if(a.a.empty())throw Error(b);}function ec(a,",
    "b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got:",
    " \"+a);}\nfunction fc(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad tok",
    "en: \"+a);}function gc(a){a=a.a.next();if(2>a.length)throw Error(\"Uncl",
    "osed literal string\");return new Jb(a)}\nfunction hc(a){var b=[];if(Qb",
    "(C(a.a))){var c=a.a.next();var d=C(a.a);if(\"/\"==c&&(a.a.empty()||\".",
    "\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return",
    " new Ob;d=new Ob;P(a,\"Missing next location step.\");c=ic(a,c);b.push(",
    "c)}else{a:{c=C(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Va",
    "riable reference not allowed in HTML XPath\");case \"(\":a.a.next();c=c",
    "c(a);P(a,'unclosed \"(\"');ec(a,\")\");break;case '\"':case \"'\":c=gc(",
    "a);break;default:if(isNaN(+c))if(!Ib(c)&&/(?![0-9])[\\w]/.test(d)&&\"(",
    "\"==C(a.a,\n1)){c=a.a.next();c=Hb[c]||null;a.a.next();for(d=[];\")\"!=C",
    "(a.a);){P(a,\"Missing function argument list.\");d.push(cc(a));if(\",\"",
    "!=C(a.a))break;a.a.next()}P(a,\"Unclosed function argument list.\");fc(",
    "a);c=new Fb(c,d)}else{c=null;break a}else c=new Lb(+a.a.next())}\"[\"==",
    "C(a.a)&&(d=new Tb(jc(a)),c=new Db(c,d))}if(c)if(Qb(C(a.a)))d=c;else ret",
    "urn c;else c=ic(a,\"/\"),d=new Pb,b.push(c)}for(;Qb(C(a.a));)c=a.a.next",
    "(),P(a,\"Missing next location step.\"),c=ic(a,c),b.push(c);return new ",
    "Mb(d,b)}\nfunction ic(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op ",
    "should be \"/\" or \"//\"');if(\".\"==C(a.a)){var c=new N(Zb,new F(\"no",
    "de\"));a.a.next();return c}if(\"..\"==C(a.a))return c=new N(Yb,new F(\"",
    "node\")),a.a.next(),c;if(\"@\"==C(a.a)){var d=Nb;a.a.next();P(a,\"Missi",
    "ng attribute name\")}else if(\"::\"==C(a.a,1)){if(!/(?![0-9])[\\w]/.tes",
    "t(C(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.n",
    "ext();d=Xb[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.ne",
    "xt();P(a,\"Missing node name\")}else d=Ub;e=\nC(a.a);if(/(?![0-9])[\\w",
    "\\*]/.test(e.charAt(0)))if(\"(\"==C(a.a,1)){if(!Ib(e))throw Error(\"Inv",
    "alid node type: \"+e);e=a.a.next();if(!Ib(e))throw Error(\"Invalid type",
    " name: \"+e);ec(a,\"(\");P(a,\"Bad nodetype\");var f=C(a.a).charAt(0),h",
    "=null;if('\"'==f||\"'\"==f)h=gc(a);P(a,\"Bad nodetype\");fc(a);e=new F(",
    "e,h)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new Kb(e);else{var",
    " h=e.substring(0,f);if(\"*\"==h)var l=\"*\";else if(l=a.Ga(h),!l)throw ",
    "Error(\"Namespace prefix not declared: \"+h);e=e.substr(f+1);e=new Kb(e",
    ",l)}else throw Error(\"Bad token: \"+\na.a.next());a=new Tb(jc(a),d.O);",
    "return c||new N(d,e,a,\"//\"==b)}function jc(a){for(var b=[];\"[\"==C(a",
    ".a);){a.a.next();P(a,\"Missing predicate expression.\");var c=cc(a);b.p",
    "ush(c);P(a,\"Unclosed predicate expression.\");ec(a,\"]\")}return b}fun",
    "ction dc(a){if(\"-\"==C(a.a))return a.a.next(),new $b(dc(a));var b=hc(a",
    ");if(\"|\"!=C(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)P(a,\"Missing ",
    "next union location path.\"),b.push(hc(a));a.a.back();a=new ac(b)}retur",
    "n a};function kc(a){switch(a.nodeType){case 1:return ja(lc,a);case 9:re",
    "turn kc(a.documentElement);case 11:case 10:case 6:case 12:return mc;def",
    "ault:return a.parentNode?kc(a.parentNode):mc}}function mc(){return null",
    "}function lc(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3",
    ".org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.sp",
    "ecified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?lc(a.paren",
    "tNode,b):null};function nc(a,b){if(!a.length)throw Error(\"Empty XPath ",
    "expression.\");a=jb(a);if(a.empty())throw Error(\"Invalid XPath express",
    "ion.\");b?ea(b)||(b=ia(b.lookupNamespaceURI,b)):b=function(){return nul",
    "l};var c=cc(new bc(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.ne",
    "xt());this.evaluate=function(a,b){a=c.evaluate(new hb(a));return new Q(",
    "a,b)}}\nfunction Q(a,b){if(0==b)if(a instanceof E)b=4;else if(\"string",
    "\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"==",
    "typeof a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2!=",
    "b&&1!=b&&3!=b&&!(a instanceof E))throw Error(\"value could not be conve",
    "rted to the specified type\");this.resultType=b;switch(b){case 2:this.s",
    "tringValue=a instanceof E?tb(a):\"\"+a;break;case 1:this.numberValue=a ",
    "instanceof E?+tb(a):+a;break;case 3:this.booleanValue=a instanceof E?0<",
    "a.A():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var d=",
    "[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.A();",
    "this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeValue=s",
    "b(a);break;default:throw Error(\"Unknown XPathResult type.\");}var f=0;",
    "this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext cal",
    "led with wrong result type\");return f>=d.length?null:d[f++]};this.snap",
    "shotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called wi",
    "th wrong result type\");return a>=d.length||0>a?null:d[a]}}\nQ.ANY_TYPE",
    "=0;Q.NUMBER_TYPE=1;Q.STRING_TYPE=2;Q.BOOLEAN_TYPE=3;Q.UNORDERED_NODE_IT",
    "ERATOR_TYPE=4;Q.ORDERED_NODE_ITERATOR_TYPE=5;Q.UNORDERED_NODE_SNAPSHOT_",
    "TYPE=6;Q.ORDERED_NODE_SNAPSHOT_TYPE=7;Q.ANY_UNORDERED_NODE_TYPE=8;Q.FIR",
    "ST_ORDERED_NODE_TYPE=9;function oc(a){this.lookupNamespaceURI=kc(a)}\nb",
    "a(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Documen",
    "t.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Q,c.evaluate=fu",
    "nction(a,b,c,h){return(new nc(a,c)).evaluate(b,h)},c.createExpression=f",
    "unction(a,b){return new nc(a,b)},c.createNSResolver=function(a){return ",
    "new oc(a)}});var R={};R.ka=function(){var a={Oa:\"http://www.w3.org/200",
    "0/svg\"};return function(b){return a[b]||null}}();\nR.w=function(a,b,c)",
    "{var d=A(a);if(!d.documentElement)return null;try{for(var e=d.createNSR",
    "esolver?d.createNSResolver(d.documentElement):R.ka,f={},h=d.getElements",
    "ByTagName(\"*\"),l=0;l<h.length;++l){var q=h[l],y=q.namespaceURI;if(y&&",
    "!f[y]){var r=q.lookupPrefix(y);if(!r)var v=y.match(\".*/(\\\\w+)/?$\"),",
    "r=v?v[1]:\"xhtml\";f[y]=r}}var J={},U;for(U in f)J[f[U]]=U;e=function(a",
    "){return J[a]||null};try{return d.evaluate(b,a,e,c,null)}catch(ma){if(",
    "\"TypeError\"===ma.name)return e=d.createNSResolver?d.createNSResolver(",
    "d.documentElement):\nR.ka,d.evaluate(b,a,e,c,null);throw ma;}}catch(ma)",
    "{throw new u(32,\"Unable to locate an element with the xpath expression",
    " \"+b+\" because of the following error:\\n\"+ma);}};R.na=function(a,b)",
    "{if(!a||1!=a.nodeType)throw new u(32,'The result of the xpath expressio",
    "n \"'+b+'\" is: '+a+\". It should be an element.\");};\nR.Ja=function(a",
    ",b){var c=function(){var c=R.w(b,a,9);return c?c.singleNodeValue||null:",
    "b.selectSingleNode?(c=A(b),c.setProperty&&c.setProperty(\"SelectionLang",
    "uage\",\"XPath\"),b.selectSingleNode(a)):null}();null===c||R.na(c,a);re",
    "turn c};\nR.Ma=function(a,b){var c=function(){var c=R.w(b,a,7);if(c){fo",
    "r(var e=c.snapshotLength,f=[],h=0;h<e;++h)f.push(c.snapshotItem(h));ret",
    "urn f}return b.selectNodes?(c=A(b),c.setProperty&&c.setProperty(\"Selec",
    "tionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();t(c,function(b){R.na(",
    "b,a)});return c};function pc(a,b,c,d){this.top=a;this.right=b;this.bott",
    "om=c;this.left=d}g=pc.prototype;g.clone=function(){return new pc(this.t",
    "op,this.right,this.bottom,this.left)};g.toString=function(){return\"(\"",
    "+this.top+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)",
    "\"};g.contains=function(a){return this&&a?a instanceof pc?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:!1};\ng.exp",
    "and=function(a,b,c,d){fa(a)?(this.top-=a.top,this.right+=a.right,this.b",
    "ottom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),t",
    "his.bottom+=Number(c),this.left-=Number(d));return this};g.ceil=functio",
    "n(){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.",
    "bottom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return thi",
    "s};\ng.floor=function(){this.top=Math.floor(this.top);this.right=Math.f",
    "loor(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.flo",
    "or(this.left);return this};g.round=function(){this.top=Math.round(this.",
    "top);this.right=Math.round(this.right);this.bottom=Math.round(this.bott",
    "om);this.left=Math.round(this.left);return this};g.translate=function(a",
    ",b){a instanceof z?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.b",
    "ottom+=a.y):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+",
    "=b));return this};\ng.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.",
    "right*=a;this.top*=b;this.bottom*=b;return this};function S(a,b,c,d){th",
    "is.left=a;this.top=b;this.width=c;this.height=d}g=S.prototype;g.clone=f",
    "unction(){return new S(this.left,this.top,this.width,this.height)};g.to",
    "String=function(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.wi",
    "dth+\"w x \"+this.height+\"h)\"};g.contains=function(a){return a instan",
    "ceof z?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=t",
    "his.top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.w",
    "idth&&this.top<=a.top&&this.top+this.height>=a.top+a.height};\ng.ceil=f",
    "unction(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);t",
    "his.width=Math.ceil(this.width);this.height=Math.ceil(this.height);retu",
    "rn this};g.floor=function(){this.left=Math.floor(this.left);this.top=Ma",
    "th.floor(this.top);this.width=Math.floor(this.width);this.height=Math.f",
    "loor(this.height);return this};g.round=function(){this.left=Math.round(",
    "this.left);this.top=Math.round(this.top);this.width=Math.round(this.wid",
    "th);this.height=Math.round(this.height);return this};\ng.translate=func",
    "tion(a,b){a instanceof z?(this.left+=a.x,this.top+=a.y):(this.left+=a,n",
    "(b)&&(this.top+=b));return this};g.scale=function(a,b){b=n(b)?b:a;this.",
    "left*=a;this.width*=a;this.top*=b;this.height*=b;return this};function ",
    "qc(a,b){var c=A(a);return c.defaultView&&c.defaultView.getComputedStyle",
    "&&(a=c.defaultView.getComputedStyle(a,null))?a[b]||a.getPropertyValue(b",
    ")||\"\":\"\"}function rc(a){var b=a.offsetWidth,c=a.offsetHeight;if((!k",
    "(b)||!b&&!c)&&a.getBoundingClientRect){a:{try{var d=a.getBoundingClient",
    "Rect()}catch(e){a={left:0,top:0,right:0,bottom:0};break a}a=d}return ne",
    "w Ra(a.right-a.left,a.bottom-a.top)}return new Ra(b,c)};var sc=\"functi",
    "on\"===typeof ShadowRoot;function tc(a){return uc(a)&&vc(a)&&\"none\"!=",
    "T(a,\"pointer-events\")}var wc=\"A AREA BUTTON INPUT LABEL SELECT TEXTA",
    "REA\".split(\" \");\nfunction xc(a){return sa(wc,function(b){return B(a",
    ",b)})||null!=cb(a)&&0<=Number(a.tabIndex)||((B(a,\"TEXTAREA\")?!0:B(a,",
    "\"INPUT\")?0<=qa(yc,a.type.toLowerCase()):zc(a)?!0:!1)||(B(a,\"INPUT\")",
    "?\"file\"==a.type.toLowerCase():!1)||Ac(a,\"range\")||Ac(a,\"date\")||A",
    "c(a,\"month\")||Ac(a,\"week\")||Ac(a,\"time\")||Ac(a,\"datetime-local\"",
    ")||Ac(a,\"color\"))&&!a.readOnly}var Bc=\"BUTTON INPUT OPTGROUP OPTION ",
    "SELECT TEXTAREA\".split(\" \");\nfunction vc(a){return sa(Bc,function(b",
    "){return B(a,b)})?a.disabled?!1:a.parentNode&&1==a.parentNode.nodeType&",
    "&B(a,\"OPTGROUP\")||B(a,\"OPTION\")?vc(a.parentNode):!$a(a,function(a){",
    "var b=a.parentNode;if(b&&B(b,\"FIELDSET\")&&b.disabled){if(!B(a,\"LEGEN",
    "D\"))return!0;for(;a=k(a.previousElementSibling)?a.previousElementSibli",
    "ng:Va(a.previousSibling);)if(B(a,\"LEGEND\"))return!0}return!1},!0):!0}",
    "var yc=\"text search tel url email password number\".split(\" \");\nfun",
    "ction Ac(a,b){return B(a,\"INPUT\")?a.type.toLowerCase()==b:!1}function",
    " zc(a){function b(a){return\"inherit\"==a.contentEditable?(a=Cc(a))?b(a",
    "):!1:\"true\"==a.contentEditable}return k(a.contentEditable)?k(a.isCont",
    "entEditable)?a.isContentEditable:b(a):!1}function Cc(a){for(a=a.parentN",
    "ode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;ret",
    "urn B(a)?a:null}\nfunction T(a,b){b=pa(b);if(\"float\"==b||\"cssFloat\"",
    "==b||\"styleFloat\"==b)b=\"cssFloat\";a=qc(a,b)||Dc(a,b);if(null===a)a=",
    "null;else if(0<=qa(ya,b)){b:{var c=a.match(Ba);if(c){b=Number(c[1]);var",
    " d=Number(c[2]),e=Number(c[3]),c=Number(c[4]);if(0<=b&&255>=b&&0<=d&&25",
    "5>=d&&0<=e&&255>=e&&0<=c&&1>=c){b=[b,d,e,c];break b}}b=null}if(!b)b:{if",
    "(e=a.match(Ca))if(b=Number(e[1]),d=Number(e[2]),e=Number(e[3]),0<=b&&25",
    "5>=b&&0<=d&&255>=d&&0<=e&&255>=e){b=[b,d,e,1];break b}b=null}if(!b)b:{b",
    "=a.toLowerCase();d=xa[b.toLowerCase()];\nif(!d&&(d=\"#\"==b.charAt(0)?b",
    ":\"#\"+b,4==d.length&&(d=d.replace(za,\"#$1$1$2$2$3$3\")),!Aa.test(d)))",
    "{b=null;break b}b=[parseInt(d.substr(1,2),16),parseInt(d.substr(3,2),16",
    "),parseInt(d.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}re",
    "turn a}function Dc(a,b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&ea(",
    "c.getPropertyValue)&&(d=c.getPropertyValue(b));return\"inherit\"!=d?k(d",
    ")?d:null:(a=Cc(a))?Dc(a,b):null}\nfunction Ec(a,b,c){function d(a){var ",
    "b=Fc(a);return 0<b.height&&0<b.width?!0:B(a,\"PATH\")&&(0<b.height||0<b",
    ".width)?(a=T(a,\"stroke-width\"),!!a&&0<parseInt(a,10)):\"hidden\"!=T(a",
    ",\"overflow\")&&sa(a.childNodes,function(a){return 3==a.nodeType||B(a)&",
    "&d(a)})}function e(a){return Gc(a)==V&&ta(a.childNodes,function(a){retu",
    "rn!B(a)||e(a)||!d(a)})}if(!B(a))throw Error(\"Argument to isShown must ",
    "be of type Element\");if(B(a,\"BODY\"))return!0;if(B(a,\"OPTION\")||B(a",
    ",\"OPTGROUP\"))return a=$a(a,function(a){return B(a,\"SELECT\")}),\n!!a",
    "&&Ec(a,!0,c);var f=Hc(a);if(f)return!!f.sa&&0<f.rect.width&&0<f.rect.he",
    "ight&&Ec(f.sa,b,c);if(B(a,\"INPUT\")&&\"hidden\"==a.type.toLowerCase()|",
    "|B(a,\"NOSCRIPT\"))return!1;f=T(a,\"visibility\");return\"collapse\"!=f",
    "&&\"hidden\"!=f&&c(a)&&(b||0!=Ic(a))&&d(a)?!e(a):!1}\nfunction uc(a){fu",
    "nction b(a){if(B(a)&&\"none\"==T(a,\"display\"))return!1;a:{var c=a.par",
    "entNode;if(a.getDestinationInsertionPoints){var e=a.getDestinationInser",
    "tionPoints();if(0<e.length){a=e[e.length-1];break a}}a=c&&c.shadowRoot&",
    "&void 0!==a.assignedSlot?a.assignedSlot?a.assignedSlot.parentNode:null:",
    "c}return sc&&a instanceof ShadowRoot||a&&(9==a.nodeType||11==a.nodeType",
    ")?!0:!!a&&b(a)}return Ec(a,!0,b)}var V=\"hidden\";\nfunction Gc(a,b){fu",
    "nction c(a){function b(a){return a==h?!0:0==T(a,\"display\").lastIndexO",
    "f(\"inline\",0)||\"absolute\"==c&&\"static\"==T(a,\"position\")?!1:!0}v",
    "ar c=T(a,\"position\");if(\"fixed\"==c)return y=!0,a==h?null:h;for(a=Cc",
    "(a);a&&!b(a);)a=Cc(a);return a}function d(a){var b=a;if(\"visible\"==q)",
    "if(a==h&&l)b=l;else if(a==l)return{x:\"visible\",y:\"visible\"};b={x:T(",
    "b,\"overflow-x\"),y:T(b,\"overflow-y\")};a==h&&(b.x=\"visible\"==b.x?\"",
    "auto\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y);return b}function e(a){if",
    "(a==h){var b=(new bb(f)).R;\na=b.scrollingElement?b.scrollingElement:b.",
    "body||b.documentElement;b=b.parentWindow||b.defaultView;a=new z(b.pageX",
    "Offset||a.scrollLeft,b.pageYOffset||a.scrollTop)}else a=new z(a.scrollL",
    "eft,a.scrollTop);return a}b=Jc(a,b);var f=A(a),h=f.documentElement,l=f.",
    "body,q=T(h,\"overflow\"),y;for(a=c(a);a;a=c(a)){var r=d(a);if(\"visible",
    "\"!=r.x||\"visible\"!=r.y){var v=Fc(a);if(0==v.width||0==v.height)retur",
    "n V;var J=b.right<v.left,U=b.bottom<v.top;if(J&&\"hidden\"==r.x||U&&\"h",
    "idden\"==r.y)return V;if(J&&\"visible\"!=r.x||\nU&&\"visible\"!=r.y){J=",
    "e(a);U=b.bottom<v.top-J.y;if(b.right<v.left-J.x&&\"visible\"!=r.x||U&&",
    "\"visible\"!=r.x)return V;b=Gc(a);return b==V?V:\"scroll\"}J=b.left>=v.",
    "left+v.width;v=b.top>=v.top+v.height;if(J&&\"hidden\"==r.x||v&&\"hidden",
    "\"==r.y)return V;if(J&&\"visible\"!=r.x||v&&\"visible\"!=r.y){if(y&&(r=",
    "e(a),b.left>=h.scrollWidth-r.x||b.right>=h.scrollHeight-r.y))return V;b",
    "=Gc(a);return b==V?V:\"scroll\"}}}return\"none\"}\nfunction Fc(a){var b",
    "=Hc(a);if(b)return b.rect;if(B(a,\"HTML\"))return a=A(a),a=(Sa(a)||wind",
    "ow).document,a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=",
    "new Ra(a.clientWidth,a.clientHeight),new S(0,0,a.width,a.height);try{va",
    "r c=a.getBoundingClientRect()}catch(d){return new S(0,0,0,0)}return new",
    " S(c.left,c.top,c.right-c.left,c.bottom-c.top)}\nfunction Hc(a){var b=B",
    "(a,\"MAP\");if(!b&&!B(a,\"AREA\"))return null;var c=b?a:B(a.parentNode,",
    "\"MAP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=R.Ja('/descendan",
    "t::*[@usemap = \"#'+c.name+'\"]',A(c)))&&(e=Fc(d),b||\"default\"==a.sha",
    "pe.toLowerCase()||(a=Kc(a),b=Math.min(Math.max(a.left,0),e.width),c=Mat",
    "h.min(Math.max(a.top,0),e.height),e=new S(b+e.left,c+e.top,Math.min(a.w",
    "idth,e.width-b),Math.min(a.height,e.height-c))));return{sa:d,rect:e||ne",
    "w S(0,0,0,0)}}\nfunction Kc(a){var b=a.shape.toLowerCase();a=a.coords.s",
    "plit(\",\");if(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return new S",
    "(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new S(a",
    "[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c=a[1]",
    ",d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=",
    "Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new S(b,c,d-b,e-c)}retur",
    "n new S(0,0,0,0)}\nfunction Jc(a,b){a=Fc(a);a=new pc(a.top,a.left+a.wid",
    "th,a.top+a.height,a.left);b&&(b=b instanceof S?b:new S(b.x,b.y,1,1),a.l",
    "eft=Math.min(Math.max(a.left+b.left,a.left),a.right),a.top=Math.min(Mat",
    "h.max(a.top+b.top,a.top),a.bottom),a.right=Math.min(Math.max(a.left+b.w",
    "idth,a.left),a.right),a.bottom=Math.min(Math.max(a.top+b.height,a.top),",
    "a.bottom));return a}function Ic(a){var b=1,c=T(a,\"opacity\");c&&(b=Num",
    "ber(c));(a=Cc(a))&&(b*=Ic(a));return b};Na();Na();function Lc(a,b,c){th",
    "is.B=a;this.la=b;this.ma=c}Lc.prototype.create=function(a){a=A(a).creat",
    "eEvent(\"HTMLEvents\");a.initEvent(this.B,this.la,this.ma);return a};Lc",
    ".prototype.toString=function(){return this.B};function W(a,b,c){Lc.call",
    "(this,a,b,c)}p(W,Lc);\nW.prototype.create=function(a,b){if(this==Mc)thr",
    "ow new u(9,\"Browser does not support a mouse pixel scroll event.\");va",
    "r c=A(a);a=Sa(c);c=c.createEvent(\"MouseEvents\");this==Nc&&(c.wheelDel",
    "ta=b.wheelDelta);c.initMouseEvent(this.B,this.la,this.ma,a,1,b.clientX,",
    "b.clientY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b",
    ".button,b.relatedTarget);return c};function X(a,b,c){Lc.call(this,a,b,c",
    ")}p(X,Lc);X.prototype.create=function(){throw new u(9,\"Browser does no",
    "t support MSPointer events.\");};\nvar Oc=new Lc(\"change\",!0,!1),Pc=n",
    "ew W(\"click\",!0,!0),Qc=new W(\"contextmenu\",!0,!0),Rc=new W(\"dblcli",
    "ck\",!0,!0),Sc=new W(\"mousedown\",!0,!0),Tc=new W(\"mousemove\",!0,!1)",
    ",Uc=new W(\"mouseout\",!0,!0),Vc=new W(\"mouseover\",!0,!0),Wc=new W(\"",
    "mouseup\",!0,!0),Nc=new W(\"mousewheel\",!0,!0),Mc=new W(\"MozMousePixe",
    "lScroll\",!0,!0),Xc=new X(\"MSGotPointerCapture\",!0,!1),Yc=new X(\"MSL",
    "ostPointerCapture\",!0,!1),Zc=new X(\"MSPointerDown\",!0,!0),$c=new X(",
    "\"MSPointerMove\",!0,!0),ad=new X(\"MSPointerOver\",!0,!0),bd=new X(\"M",
    "SPointerOut\",\n!0,!0),cd=new X(\"MSPointerUp\",!0,!0);function dd(a,b,",
    "c){b=b.create(a,c);\"isTrusted\"in b||(b.isTrusted=!1);return a.dispatc",
    "hEvent(b)};function ed(a,b){this.g=ka.document.documentElement;this.G=n",
    "ull;var c=ab(A(this.g));c&&fd(this,c);this.$=a||new gd;this.pa=b||new h",
    "d}ed.prototype.I=function(){return this.g};function fd(a,b){a.g=b;a.G=B",
    "(b,\"OPTION\")?$a(b,function(a){return B(a,\"SELECT\")}):null}\ned.prot",
    "otype.W=function(a,b,c,d,e,f,h,l){if(!f&&!tc(this.g))return!1;if(d&&Vc!",
    "=a&&Uc!=a)throw new u(12,\"Event type does not allow related target: \"",
    "+a);b={clientX:b.x,clientY:b.y,button:c,altKey:0!=(this.$.ca&4),ctrlKey",
    ":0!=(this.$.ca&2),shiftKey:0!=(this.$.ca&1),metaKey:0!=(this.$.ca&8),wh",
    "eelDelta:e||0,relatedTarget:d||null,count:l||1};h=h||1;c=this.g;a!=Pc&&",
    "a!=Sc&&h in id?c=id[h]:this.G&&(c=jd(this,a));return c?this.pa.W(c,a,b)",
    ":!0};\ned.prototype.S=function(a,b,c,d,e,f,h,l){if(!l&&!tc(this.g))retu",
    "rn!1;if(h&&ad!=a&&bd!=a)throw new u(12,\"Event type does not allow rela",
    "ted target: \"+a);b={clientX:b.x,clientY:b.y,button:c,altKey:!1,ctrlKey",
    ":!1,shiftKey:!1,metaKey:!1,relatedTarget:h||null,width:0,height:0,press",
    "ure:0,rotation:0,pointerId:d,tiltX:0,tiltY:0,pointerType:e,isPrimary:f}",
    ";c=this.G?jd(this,a):this.g;id[d]&&(c=id[d]);d=Sa(A(this.g));if(d&&a==Z",
    "c){var q=d.Element.prototype.msSetPointerCapture;d.Element.prototype.ms",
    "SetPointerCapture=\nfunction(a){id[a]=this}}a=c?this.pa.S(c,a,b):!0;q&&",
    "(d.Element.prototype.msSetPointerCapture=q);return a};function jd(a,b){",
    "switch(b){case Pc:case Wc:return a.G.multiple?a.g:a.G;default:return a.",
    "G.multiple?a.g:null}}function kd(a){var b=$a(a.g,function(a){return!!a&",
    "&B(a)&&xc(a)},!0),b=b||a.g;a=ab(A(b));if(b!=a){if(a&&ea(a.blur)&&!B(a,",
    "\"BODY\"))try{a.blur()}catch(c){throw c;}ea(b.focus)&&b.focus()}}functi",
    "on gd(){this.ca=0}var id={};function hd(){}hd.prototype.W=function(a,b,",
    "c){return dd(a,b,c)};\nhd.prototype.S=function(a,b,c){return dd(a,b,c)}",
    ";function ld(a,b){this.D={};this.h=[];this.M=0;var c=arguments.length;i",
    "f(1<c){if(c%2)throw Error(\"Uneven number of arguments\");for(var d=0;d",
    "<c;d+=2)this.set(arguments[d],arguments[d+1])}else a&&this.addAll(a)}fu",
    "nction md(a){nd(a);return a.h.concat()}g=ld.prototype;g.clear=function(",
    "){this.D={};this.M=this.h.length=0};g.remove=function(a){return Object.",
    "prototype.hasOwnProperty.call(this.D,a)?(delete this.D[a],this.M--,this",
    ".h.length>2*this.M&&nd(this),!0):!1};\nfunction nd(a){var b,c;if(a.M!=a",
    ".h.length){for(b=c=0;c<a.h.length;){var d=a.h[c];Object.prototype.hasOw",
    "nProperty.call(a.D,d)&&(a.h[b++]=d);c++}a.h.length=b}if(a.M!=a.h.length",
    "){var e={};for(b=c=0;c<a.h.length;)d=a.h[c],Object.prototype.hasOwnProp",
    "erty.call(e,d)||(a.h[b++]=d,e[d]=1),c++;a.h.length=b}}g.get=function(a,",
    "b){return Object.prototype.hasOwnProperty.call(this.D,a)?this.D[a]:b};g",
    ".set=function(a,b){Object.prototype.hasOwnProperty.call(this.D,a)||(thi",
    "s.M++,this.h.push(a));this.D[a]=b};\ng.addAll=function(a){if(a instance",
    "of ld){var b=md(a);nd(a);for(var c=[],d=0;d<a.h.length;d++)c.push(a.D[a",
    ".h[d]]);a=c}else{b=[];var d=0;for(e in a)b[d++]=e;d=[];var e=0;for(c in",
    " a)d[e++]=a[c];a=d}for(c=0;c<b.length;c++)this.set(b[c],a[c])};g.forEac",
    "h=function(a,b){for(var c=md(this),d=0;d<c.length;d++){var e=c[d],f=thi",
    "s.get(e);a.call(b,f,e,this)}};g.clone=function(){return new ld(this)};v",
    "ar od={};function Y(a,b,c){fa(a)&&(a=a.b);a=new pd(a);!b||b in od&&!c||",
    "(od[b]={key:a,shift:!1},c&&(od[c]={key:a,shift:!0}));return a}function ",
    "pd(a){this.code=a}Y(8);Y(9);Y(13);var qd=Y(16),rd=Y(17),sd=Y(18);Y(19);",
    "Y(20);Y(27);Y(32,\" \");Y(33);Y(34);Y(35);Y(36);Y(37);Y(38);Y(39);Y(40)",
    ";Y(44);Y(45);Y(46);Y(48,\"0\",\")\");Y(49,\"1\",\"!\");Y(50,\"2\",\"@\"",
    ");Y(51,\"3\",\"#\");Y(52,\"4\",\"$\");Y(53,\"5\",\"%\");Y(54,\"6\",\"^",
    "\");Y(55,\"7\",\"&\");Y(56,\"8\",\"*\");Y(57,\"9\",\"(\");Y(65,\"a\",\"",
    "A\");Y(66,\"b\",\"B\");Y(67,\"c\",\"C\");Y(68,\"d\",\"D\");\nY(69,\"e\"",
    ",\"E\");Y(70,\"f\",\"F\");Y(71,\"g\",\"G\");Y(72,\"h\",\"H\");Y(73,\"i",
    "\",\"I\");Y(74,\"j\",\"J\");Y(75,\"k\",\"K\");Y(76,\"l\",\"L\");Y(77,\"",
    "m\",\"M\");Y(78,\"n\",\"N\");Y(79,\"o\",\"O\");Y(80,\"p\",\"P\");Y(81,",
    "\"q\",\"Q\");Y(82,\"r\",\"R\");Y(83,\"s\",\"S\");Y(84,\"t\",\"T\");Y(85",
    ",\"u\",\"U\");Y(86,\"v\",\"V\");Y(87,\"w\",\"W\");Y(88,\"x\",\"X\");Y(8",
    "9,\"y\",\"Y\");Y(90,\"z\",\"Z\");var td=Y(Ja?{c:91,b:91}:Ia?{c:224,b:91",
    "}:{c:0,b:91});Y(Ja?{c:92,b:92}:Ia?{c:224,b:93}:{c:0,b:92});Y(Ja?{c:93,b",
    ":93}:Ia?{c:0,b:0}:{c:93,b:null});Y({c:96,b:96},\"0\");Y({c:97,b:97},\"1",
    "\");\nY({c:98,b:98},\"2\");Y({c:99,b:99},\"3\");Y({c:100,b:100},\"4\");",
    "Y({c:101,b:101},\"5\");Y({c:102,b:102},\"6\");Y({c:103,b:103},\"7\");Y(",
    "{c:104,b:104},\"8\");Y({c:105,b:105},\"9\");Y({c:106,b:106},\"*\");Y({c",
    ":107,b:107},\"+\");Y({c:109,b:109},\"-\");Y({c:110,b:110},\".\");Y({c:1",
    "11,b:111},\"/\");Y(144);Y(112);Y(113);Y(114);Y(115);Y(116);Y(117);Y(118",
    ");Y(119);Y(120);Y(121);Y(122);Y(123);Y({c:107,b:187},\"=\",\"+\");Y(108",
    ",\",\");Y({c:109,b:189},\"-\",\"_\");Y(188,\",\",\"<\");Y(190,\".\",\">",
    "\");Y(191,\"/\",\"?\");Y(192,\"`\",\"~\");Y(219,\"[\",\"{\");\nY(220,\"",
    "\\\\\",\"|\");Y(221,\"]\",\"}\");Y({c:59,b:186},\";\",\":\");Y(222,\"'",
    "\",'\"');var ud=new ld;ud.set(1,qd);ud.set(2,rd);ud.set(4,sd);ud.set(8,",
    "td);(function(a){var b=new ld;t(md(a),function(c){b.set(a.get(c).code,c",
    ")});return b})(ud);function vd(a,b,c){ed.call(this,b,c);this.K=this.j=n",
    "ull;this.C=new z(0,0);this.Y=this.N=!1;if(a){n(a.buttonPressed)&&(this.",
    "j=a.buttonPressed);try{B(a.elementPressed)&&(this.K=a.elementPressed)}c",
    "atch(d){this.j=null}this.C=new z(a.clientXY.x,a.clientXY.y);this.N=!!a.",
    "nextClickIsDoubleClick;this.Y=!!a.hasEverInteracted;try{a.element&&B(a.",
    "element)&&fd(this,a.element)}catch(d){this.j=null}}}p(vd,ed);var Z={};Z",
    "[Pc]=[0,1,2,null];Z[Qc]=[null,null,2,null];Z[Wc]=[0,1,2,null];Z[Uc]=[0,",
    "1,2,4];Z[Tc]=[0,1,2,4];\nQa&&(Z[Zc]=Z[Wc],Z[cd]=Z[Wc],Z[$c]=[-1,-1,-1,-",
    "1],Z[bd]=Z[$c],Z[ad]=Z[$c]);Z[Rc]=Z[Pc];Z[Sc]=Z[Wc];Z[Vc]=Z[Uc];var wd=",
    "{};wd[Sc]=Zc;wd[Tc]=$c;wd[Uc]=bd;wd[Vc]=ad;wd[Wc]=cd;vd.prototype.move=",
    "function(a,b){var c=tc(a),d=Fc(a);this.C.x=b.x+d.left;this.C.y=b.y+d.to",
    "p;b=this.I();if(a!=b){try{Sa(A(b)).closed&&(b=null)}catch(e){b=null}b&&",
    "(d=b===ka.document.documentElement||b===ka.document.body,b=!this.Y&&d?n",
    "ull:b,xd(this,Uc,a));fd(this,a);xd(this,Vc,b,null,c)}xd(this,Tc,null,nu",
    "ll,c);this.N=!1};\nvd.prototype.scroll=function(a){if(0==a)throw new u(",
    "13,\"Must scroll a non-zero number of ticks.\");for(var b=0<a?-120:120,",
    "c=0;c<Math.abs(a);c++)xd(this,Nc,null,b)};function xd(a,b,c,d,e,f){a.Y=",
    "!0;if(Qa){var h=wd[b];if(h&&!a.S(h,a.C,yd(a,h),1,MSPointerEvent.MSPOINT",
    "ER_TYPE_MOUSE,!0,c,e))return!1}return a.W(b,a.C,yd(a,b),c,d,e,null,f)}f",
    "unction yd(a,b){if(!(b in Z))return 0;a=Z[b][null===a.j?3:a.j];if(null=",
    "==a)throw new u(13,\"Event does not permit the specified mouse button.",
    "\");return a}\nvd.prototype.getState=function(){return{buttonPressed:th",
    "is.j,elementPressed:this.K,clientXY:{x:this.C.x,y:this.C.y},nextClickIs",
    "DoubleClick:this.N,hasEverInteracted:this.Y,element:this.I()}};function",
    " zd(a,b){this.x=a;this.y=b}p(zd,z);g=zd.prototype;g.clone=function(){re",
    "turn new zd(this.x,this.y)};g.scale=z.prototype.scale;g.normalize=funct",
    "ion(){return this.scale(1/Math.sqrt(this.x*this.x+this.y*this.y))};g.ad",
    "d=function(a){this.x+=a.x;this.y+=a.y;return this};g.rotate=function(a)",
    "{var b=Math.cos(a);a=Math.sin(a);var c=this.y*b+this.x*a;this.x=this.x*",
    "b-this.y*a;this.y=c;return this};function Ad(a){var b;(b=qc(a,\"display",
    "\"))||(b=a.currentStyle?a.currentStyle.display:null);if(\"none\"!=(b||a",
    ".style&&a.style.display))b=rc(a);else{b=a.style;var c=b.display,d=b.vis",
    "ibility,e=b.position;b.visibility=\"hidden\";b.position=\"absolute\";b.",
    "display=\"inline\";var f=rc(a);b.display=c;b.position=e;b.visibility=d;",
    "b=f}return 0<b.width&&0<b.height||!a.offsetParent?b:Ad(a.offsetParent)}",
    ";ba(\"_\",function(a,b,c,d){if(!uc(a))throw new u(11,\"Element is not c",
    "urrently visible and may not be manipulated\");b:{var e=b||void 0;if(\"",
    "scroll\"==Gc(a,e)){if(a.scrollIntoView&&(a.scrollIntoView(),\"none\"==G",
    "c(a,e)))break b;for(var f=Jc(a,e),h=Cc(a);h;h=Cc(h)){var l=h,q=Fc(l);va",
    "r y=l;var r=qc(y,\"borderLeftWidth\");var v=qc(y,\"borderRightWidth\");",
    "var J=qc(y,\"borderTopWidth\");y=qc(y,\"borderBottomWidth\");v=new pc(p",
    "arseFloat(J),parseFloat(v),parseFloat(y),parseFloat(r));r=f.left-q.left",
    "-v.left;q=f.top-q.top-\nv.top;v=l.clientHeight+f.top-f.bottom;l.scrollL",
    "eft+=Math.min(r,Math.max(r-(l.clientWidth+f.left-f.right),0));l.scrollT",
    "op+=Math.min(q,Math.max(q-v,0))}Gc(a,e)}}b?b=new zd(b.x,b.y):(b=Ad(a),b",
    "=new zd(b.width/2,b.height/2));c=c||new vd;c.move(a,b);if(null!==c.j)th",
    "row new u(13,\"Cannot press more than one button or an already pressed ",
    "button.\");c.j=0;c.K=c.I();if(B(c.I(),\"OPTION\")||B(c.I(),\"SELECT\")|",
    "|xd(c,Sc,null,null,!1,void 0))Qa&&0==c.j&&B(c.K,\"OPTION\")&&c.S(Xc,c.C",
    ",0,1,MSPointerEvent.MSPOINTER_TYPE_MOUSE,\n!0),kd(c);if(null===c.j)thro",
    "w new u(13,\"Cannot release a button when no button is pressed.\");c.G&",
    "&tc(c.g)&&(a=c.G,b=gb(c.g),!b||a.multiple)&&(c.g.selected=!b,a.multiple",
    "&&!(0<=na(Pa,28))||dd(a,Oc));a=tc(c.I());xd(c,Wc,null,null,d,void 0);tr",
    "y{if(0==c.j&&c.I()==c.K){var U=c.C,ma=yd(c,Pc);if(a||tc(c.g))!c.G&&fb(c",
    ".g)&&gb(c.g),c.W(Pc,U,ma,null,0,a,void 0);c.N&&xd(c,Rc);c.N=!c.N;Qa&&0=",
    "=c.j&&B(c.K,\"OPTION\")&&c.S(Yc,new z(0,0),0,1,MSPointerEvent.MSPOINTER",
    "_TYPE_MOUSE,!1)}else 2==c.j&&xd(c,Qc)}catch(Bd){}id=\n{};c.j=null;c.K=n",
    "ull});; return this._.apply(null,arguments);}.apply({navigator:typeof w",
    "indow!='undefined'?window.navigator:null,document:typeof window!='undef",
    "ined'?window.document:null}, arguments);}",
    NULL
};

const char* const EXECUTE_ASYNC_SCRIPT[] = {
    "function(){return function(){function e(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.len",
    "gth&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typeof a.propertyIs",
    "Enumerable&&!a.propertyIsEnumerable(\"splice\"))return\"array\";if(\"[o",
    "bject Function]\"==c||\"undefined\"!=typeof a.call&&\"undefined\"!=type",
    "of a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"call\"))return\"fu",
    "nction\"}else return\"null\";\nelse if(\"function\"==b&&\"undefined\"==",
    "typeof a.call)return\"object\";return b}function k(a){var b=e(a);return",
    "\"array\"==b||\"object\"==b&&\"number\"==typeof a.length}function m(a){",
    "var b=typeof a;return\"object\"==b&&null!=a||\"function\"==b}function n",
    "(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){v",
    "ar b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}}var p=",
    "Date.now||function(){return+new Date};function q(a,b){this.code=a;this.",
    "state=r[a]||t;this.message=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-",
    "z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")}",
    ");b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)a+=\"Error\";this.name",
    "=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}\n(f",
    "unction(){var a=Error;function b(){}b.prototype=a.prototype;q.f=a.proto",
    "type;q.prototype=new b;q.prototype.constructor=q;q.c=function(b,d,f){fo",
    "r(var c=Array(arguments.length-2),l=2;l<arguments.length;l++)c[l-2]=arg",
    "uments[l];return a.prototype[d].apply(b,c)}})();var t=\"unknown error\"",
    ",r={15:\"element not selectable\",11:\"element not visible\"};r[31]=t;r",
    "[30]=t;r[24]=\"invalid cookie domain\";r[29]=\"invalid element coordina",
    "tes\";r[12]=\"invalid element state\";r[32]=\"invalid selector\";r[51]=",
    "\"invalid selector\";\nr[52]=\"invalid selector\";r[17]=\"javascript er",
    "ror\";r[405]=\"unsupported operation\";r[34]=\"move target out of bound",
    "s\";r[27]=\"no such alert\";r[7]=\"no such element\";r[8]=\"no such fra",
    "me\";r[23]=\"no such window\";r[28]=\"script timeout\";r[33]=\"session ",
    "not created\";r[10]=\"stale element reference\";r[21]=\"timeout\";r[25]",
    "=\"unable to set cookie\";r[26]=\"unexpected alert open\";r[13]=t;r[9]=",
    "\"unknown command\";q.prototype.toString=function(){return this.name+\"",
    ": \"+this.message};function u(a,b){for(var c=a.length,d=Array(c),f=\"st",
    "ring\"==typeof a?a.split(\"\"):a,g=0;g<c;g++)g in f&&(d[g]=b.call(void ",
    "0,f[g],g,a));return d};function w(a,b){var c={},d;for(d in a)b.call(voi",
    "d 0,a[d],d,a)&&(c[d]=a[d]);return c}function x(a,b){var c={},d;for(d in",
    " a)c[d]=b.call(void 0,a[d],d,a);return c}function y(a,b){return null!==",
    "a&&b in a}function z(a,b){for(var c in a)if(b.call(void 0,a[c],c,a))ret",
    "urn c};function A(){this.a=void 0}\nfunction B(a,b,c){if(null==b)c.push",
    "(\"null\");else{if(\"object\"==typeof b){if(\"array\"==e(b)){var d=b;b=",
    "d.length;c.push(\"[\");for(var f=\"\",g=0;g<b;g++)c.push(f),f=d[g],B(a,",
    "a.a?a.a.call(d,String(g),f):f,c),f=\",\";c.push(\"]\");return}if(b inst",
    "anceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();",
    "else{c.push(\"{\");g=\"\";for(d in b)Object.prototype.hasOwnProperty.ca",
    "ll(b,d)&&(f=b[d],\"function\"!=typeof f&&(c.push(g),C(d,c),c.push(\":\"",
    "),B(a,a.a?a.a.call(b,d,f):f,c),g=\",\"));c.push(\"}\");return}}switch(t",
    "ypeof b){case \"string\":C(b,\nc);break;case \"number\":c.push(isFinite",
    "(b)&&!isNaN(b)?String(b):\"null\");break;case \"boolean\":c.push(String",
    "(b));break;case \"function\":c.push(\"null\");break;default:throw Error",
    "(\"Unknown type: \"+typeof b);}}}var D={'\"':'\\\\\"',\"\\\\\":\"",
    "\\\\\\\\\",\"/\":\"\\\\/\",\"\\b\":\"\\\\b\",\"\\f\":\"\\\\f\",\"\\n\":",
    "\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\x0B\":\"\\\\u000b\"},",
    "E=/\\uffff/.test(\"\\uffff\")?/[\\\\\\\"\\x00-\\x1f\\x7f-\\uffff]/g:/[",
    "\\\\\\\"\\x00-\\x1f\\x7f-\\xff]/g;\nfunction C(a,b){b.push('\"',a.repla",
    "ce(E,function(a){var b=D[a];b||(b=\"\\\\u\"+(a.charCodeAt(0)|65536).toS",
    "tring(16).substr(1),D[a]=b);return b}),'\"')};function F(a){function b(",
    "a,d){switch(e(a)){case \"string\":case \"number\":case \"boolean\":retu",
    "rn a;case \"function\":return a.toString();case \"array\":return u(a,fu",
    "nction(a){return b(a,d)});case \"object\":if(0<=d.indexOf(a))throw new ",
    "q(17,\"Recursive object cannot be transferred\");if(y(a,\"nodeType\")&&",
    "(1==a.nodeType||9==a.nodeType)){var c={};c.ELEMENT=G(a);return c}if(y(a",
    ",\"document\"))return c={},c.WINDOW=G(a),c;d.push(a);if(k(a))return u(a",
    ",function(a){return b(a,d)});a=w(a,function(a,b){return\"number\"==type",
    "of b||\n\"string\"==typeof b});return x(a,function(a){return b(a,d)});d",
    "efault:return null}}return b(a,[])}function H(a,b){return\"array\"==e(a",
    ")?u(a,function(a){return H(a,b)}):m(a)?\"function\"==typeof a?a:y(a,\"E",
    "LEMENT\")?K(a.ELEMENT,b):y(a,\"WINDOW\")?K(a.WINDOW,b):x(a,function(a){",
    "return H(a,b)}):a}function L(a,b){if(\"string\"==typeof a)try{return ne",
    "w b.Function(a)}catch(c){throw c;}return b==window?a:new b.Function(\"r",
    "eturn (\"+a+\").apply(null,arguments);\")}\nfunction M(a){a=a||document",
    ";var b=a.$wdc_;b||(b=a.$wdc_={},b.b=p());b.b||(b.b=p());return b}functi",
    "on G(a){var b=M(a.ownerDocument),c=z(b,function(b){return b==a});c||(c=",
    "\":wdc:\"+b.b++,b[c]=a);return c}\nfunction K(a,b){a=decodeURIComponent",
    "(a);b=b||document;var c=M(b);if(!y(c,a))throw new q(10,\"Element does n",
    "ot exist in cache\");var d=c[a];if(y(d,\"setInterval\")){if(d.closed)th",
    "row delete c[a],new q(23,\"Window has been closed.\");return d}for(var ",
    "f=d;f;){if(f==b.documentElement)return d;f=f.parentNode}delete c[a];thr",
    "ow new q(10,\"Element is no longer attached to the DOM\");};function N(",
    "a,b,c,d,f,g){function l(a,b){J||(h.removeEventListener?h.removeEventLis",
    "tener(\"unload\",v,!0):h.detachEvent(\"onunload\",v),h.clearTimeout(S),",
    "0!=a?(a=new q(a,b.message||b+\"\"),a.stack=b.stack,b={status:y(a,\"code",
    "\")?a.code:13,value:{message:a.message}}):b={status:0,value:F(b)},f&&(a",
    "=[],B(new A,b,a),b=a.join(\"\")),d(b),J=!0)}function v(){l(13,Error(\"D",
    "etected a page unload event; asynchronous script execution does not wor",
    "k across page loads.\"))}var h=g||window,J=!1;g=n(l,13);if(h.closed)g(",
    "\"Unable to execute script; the target window is closed.\");\nelse{a=L(",
    "a,h);b=H(b,h.document);b.push(n(l,0));h.addEventListener?h.addEventList",
    "ener(\"unload\",v,!0):h.attachEvent(\"onunload\",v);var T=p();try{a.app",
    "ly(h,b);var S=h.setTimeout(function(){l(28,Error(\"Timed out waiting fo",
    "r asyncrhonous script result after \"+(p()-T)+\" ms\"))},Math.max(0,c))",
    "}catch(I){l(I.code||13,I)}}}var O=[\"_\"],P=this;O[0]in P||!P.execScrip",
    "t||P.execScript(\"var \"+O[0]);\nfor(var Q;O.length&&(Q=O.shift());){va",
    "r R;if(R=!O.length)R=void 0!==N;R?P[Q]=N:P=P[Q]&&P[Q]!==Object.prototyp",
    "e[Q]?P[Q]:P[Q]={}};; return this._.apply(null,arguments);}.apply({navig",
    "ator:typeof window!='undefined'?window.navigator:null,document:typeof w",
    "indow!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const EXECUTE_SCRIPT[] = {
    "function(){return function(){function e(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.len",
    "gth&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typeof a.propertyIs",
    "Enumerable&&!a.propertyIsEnumerable(\"splice\"))return\"array\";if(\"[o",
    "bject Function]\"==c||\"undefined\"!=typeof a.call&&\"undefined\"!=type",
    "of a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"call\"))return\"fu",
    "nction\"}else return\"null\";\nelse if(\"function\"==b&&\"undefined\"==",
    "typeof a.call)return\"object\";return b}function h(a){var b=e(a);return",
    "\"array\"==b||\"object\"==b&&\"number\"==typeof a.length}function l(a){",
    "var b=typeof a;return\"object\"==b&&null!=a||\"function\"==b}var m=Date",
    ".now||function(){return+new Date};var n=window;function q(a,b){this.cod",
    "e=a;this.state=r[a]||t;this.message=b||\"\";a=this.state.replace(/((?:^",
    "|\\s+)[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+",
    "/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)a+=\"Error\";",
    "this.name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||",
    "\"\"}\n(function(){var a=Error;function b(){}b.prototype=a.prototype;q.",
    "f=a.prototype;q.prototype=new b;q.prototype.constructor=q;q.c=function(",
    "b,d,f){for(var c=Array(arguments.length-2),k=2;k<arguments.length;k++)c",
    "[k-2]=arguments[k];return a.prototype[d].apply(b,c)}})();var t=\"unknow",
    "n error\",r={15:\"element not selectable\",11:\"element not visible\"};",
    "r[31]=t;r[30]=t;r[24]=\"invalid cookie domain\";r[29]=\"invalid element",
    " coordinates\";r[12]=\"invalid element state\";r[32]=\"invalid selector",
    "\";r[51]=\"invalid selector\";\nr[52]=\"invalid selector\";r[17]=\"java",
    "script error\";r[405]=\"unsupported operation\";r[34]=\"move target out",
    " of bounds\";r[27]=\"no such alert\";r[7]=\"no such element\";r[8]=\"no",
    " such frame\";r[23]=\"no such window\";r[28]=\"script timeout\";r[33]=",
    "\"session not created\";r[10]=\"stale element reference\";r[21]=\"timeo",
    "ut\";r[25]=\"unable to set cookie\";r[26]=\"unexpected alert open\";r[1",
    "3]=t;r[9]=\"unknown command\";q.prototype.toString=function(){return th",
    "is.name+\": \"+this.message};function u(a,b){for(var c=a.length,d=Array",
    "(c),f=\"string\"==typeof a?a.split(\"\"):a,g=0;g<c;g++)g in f&&(d[g]=b.",
    "call(void 0,f[g],g,a));return d};function v(a,b){var c={},d;for(d in a)",
    "b.call(void 0,a[d],d,a)&&(c[d]=a[d]);return c}function w(a,b){var c={},",
    "d;for(d in a)c[d]=b.call(void 0,a[d],d,a);return c}function x(a,b){retu",
    "rn null!==a&&b in a}function y(a,b){for(var c in a)if(b.call(void 0,a[c",
    "],c,a))return c};function z(){this.a=void 0}\nfunction A(a,b,c){if(null",
    "==b)c.push(\"null\");else{if(\"object\"==typeof b){if(\"array\"==e(b)){",
    "var d=b;b=d.length;c.push(\"[\");for(var f=\"\",g=0;g<b;g++)c.push(f),f",
    "=d[g],A(a,a.a?a.a.call(d,String(g),f):f,c),f=\",\";c.push(\"]\");return",
    "}if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.",
    "valueOf();else{c.push(\"{\");g=\"\";for(d in b)Object.prototype.hasOwnP",
    "roperty.call(b,d)&&(f=b[d],\"function\"!=typeof f&&(c.push(g),B(d,c),c.",
    "push(\":\"),A(a,a.a?a.a.call(b,d,f):f,c),g=\",\"));c.push(\"}\");return",
    "}}switch(typeof b){case \"string\":B(b,\nc);break;case \"number\":c.pus",
    "h(isFinite(b)&&!isNaN(b)?String(b):\"null\");break;case \"boolean\":c.p",
    "ush(String(b));break;case \"function\":c.push(\"null\");break;default:t",
    "hrow Error(\"Unknown type: \"+typeof b);}}}var C={'\"':'\\\\\"',\"",
    "\\\\\":\"\\\\\\\\\",\"/\":\"\\\\/\",\"\\b\":\"\\\\b\",\"\\f\":\"\\\\f\"",
    ",\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\x0B\":\"",
    "\\\\u000b\"},D=/\\uffff/.test(\"\\uffff\")?/[\\\\\\\"\\x00-\\x1f\\x7f-",
    "\\uffff]/g:/[\\\\\\\"\\x00-\\x1f\\x7f-\\xff]/g;\nfunction B(a,b){b.push",
    "('\"',a.replace(D,function(a){var b=C[a];b||(b=\"\\\\u\"+(a.charCodeAt(",
    "0)|65536).toString(16).substr(1),C[a]=b);return b}),'\"')};function E(a",
    "){function b(a,d){switch(e(a)){case \"string\":case \"number\":case \"b",
    "oolean\":return a;case \"function\":return a.toString();case \"array\":",
    "return u(a,function(a){return b(a,d)});case \"object\":if(0<=d.indexOf(",
    "a))throw new q(17,\"Recursive object cannot be transferred\");if(x(a,\"",
    "nodeType\")&&(1==a.nodeType||9==a.nodeType)){var c={};c.ELEMENT=F(a);re",
    "turn c}if(x(a,\"document\"))return c={},c.WINDOW=F(a),c;d.push(a);if(h(",
    "a))return u(a,function(a){return b(a,d)});a=v(a,function(a,b){return\"n",
    "umber\"==typeof b||\n\"string\"==typeof b});return w(a,function(a){retu",
    "rn b(a,d)});default:return null}}return b(a,[])}function G(a,b){return",
    "\"array\"==e(a)?u(a,function(a){return G(a,b)}):l(a)?\"function\"==type",
    "of a?a:x(a,\"ELEMENT\")?H(a.ELEMENT,b):x(a,\"WINDOW\")?H(a.WINDOW,b):w(",
    "a,function(a){return G(a,b)}):a}function I(a){a=a||document;var b=a.$wd",
    "c_;b||(b=a.$wdc_={},b.b=m());b.b||(b.b=m());return b}function F(a){var ",
    "b=I(a.ownerDocument),c=y(b,function(b){return b==a});c||(c=\":wdc:\"+b.",
    "b++,b[c]=a);return c}\nfunction H(a,b){a=decodeURIComponent(a);b=b||doc",
    "ument;var c=I(b);if(!x(c,a))throw new q(10,\"Element does not exist in ",
    "cache\");var d=c[a];if(x(d,\"setInterval\")){if(d.closed)throw delete c",
    "[a],new q(23,\"Window has been closed.\");return d}for(var f=d;f;){if(f",
    "==b.documentElement)return d;f=f.parentNode}delete c[a];throw new q(10,",
    "\"Element is no longer attached to the DOM\");};function J(a,b,c,d){d=d",
    "||n;try{a:{var f=a;if(\"string\"==typeof f)try{a=new d.Function(f);brea",
    "k a}catch(p){throw p;}a=d==window?f:new d.Function(\"return (\"+f+\").a",
    "pply(null,arguments);\")}var g=G(b,d.document);var k={status:0,value:E(",
    "a.apply(null,g))}}catch(p){k={status:x(p,\"code\")?p.code:13,value:{mes",
    "sage:p.message}}}c&&(a=[],A(new z,k,a),k=a.join(\"\"));return k}var K=[",
    "\"_\"],L=this;K[0]in L||!L.execScript||L.execScript(\"var \"+K[0]);\nfo",
    "r(var M;K.length&&(M=K.shift());){var N;if(N=!K.length)N=void 0!==J;N?L",
    "[M]=J:L=L[M]&&L[M]!==Object.prototype[M]?L[M]:L[M]={}};; return this._.",
    "apply(null,arguments);}.apply({navigator:typeof window!='undefined'?win",
    "dow.navigator:null,document:typeof window!='undefined'?window.document:",
    "null}, arguments);}",
    NULL
};

const char* const EXECUTE_SQL[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.b=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.a=function(c,m,p",
    "){for(var l=Array(arguments.length-2),g=2;g<arguments.length;g++)l[g-2]",
    "=arguments[g];return a.prototype[m].apply(c,l)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function h(a){this.rows=[];for(var c=0;c<a.rows.",
    "length;c++)this.rows[c]=a.rows.item(c);this.rowsAffected=a.rowsAffected",
    ";this.insertId=-1;try{this.insertId=a.insertId}catch(n){}};function k(a",
    ",c,n,m,p,l,g){function u(a,c){c=new h(c);m(a,c)}try{var w=b.openDatabas",
    "e(a,\"\",a+\"name\",5242880)}catch(v){throw new d(13,v.message);}w.tran",
    "saction(function(a){a.executeSql(c,n,u,g)},p,l)}var q=[\"_\"],r=this;q[",
    "0]in r||!r.execScript||r.execScript(\"var \"+q[0]);for(var t;q.length&&",
    "(t=q.shift());)q.length||void 0===k?r=r[t]&&r[t]!==Object.prototype[t]?",
    "r[t]:r[t]={}:r[t]=k;; return this._.apply(null,arguments);}.apply({navi",
    "gator:typeof window!='undefined'?window.navigator:null,document:typeof ",
    "window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const FIND_ELEMENTS[] = {
    "function(){return function(){var h,aa=this;function l(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&l(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function p(a){return\"function\"==",
    "ca(a)}function ea(a){var b=typeof a;return\"object\"==b&&null!=a||\"fun",
    "ction\"==b}function fa(a,b,c){return a.call.apply(a.bind,arguments)}\nf",
    "unction ga(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arra",
    "y.prototype.slice.call(arguments,2);return function(){var c=Array.proto",
    "type.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.",
    "apply(b,c)}}return function(){return a.apply(b,arguments)}}function ha(",
    "a,b,c){ha=Function.prototype.bind&&-1!=Function.prototype.bind.toString",
    "().indexOf(\"native code\")?fa:ga;return ha.apply(null,arguments)}\nfun",
    "ction ia(a,b){var c=Array.prototype.slice.call(arguments,1);return func",
    "tion(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)",
    "}}function q(a,b){function c(){}c.prototype=b.prototype;a.xa=b.prototyp",
    "e;a.prototype=new c;a.prototype.constructor=a;a.wa=function(a,c,f){for(",
    "var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argum",
    "ents[e];return b.prototype[c].apply(a,d)}};var ja=window;function t(a,b",
    "){this.code=a;this.state=v[a]||ka;this.message=b||\"\";a=this.state.rep",
    "lace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase().replace(/^",
    "[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)a+",
    "=\"Error\";this.name=a;a=Error(this.message);a.name=this.name;this.stac",
    "k=a.stack||\"\"}q(t,Error);var ka=\"unknown error\",v={15:\"element not",
    " selectable\",11:\"element not visible\"};v[31]=ka;v[30]=ka;v[24]=\"inv",
    "alid cookie domain\";v[29]=\"invalid element coordinates\";v[12]=\"inva",
    "lid element state\";\nv[32]=\"invalid selector\";v[51]=\"invalid select",
    "or\";v[52]=\"invalid selector\";v[17]=\"javascript error\";v[405]=\"uns",
    "upported operation\";v[34]=\"move target out of bounds\";v[27]=\"no suc",
    "h alert\";v[7]=\"no such element\";v[8]=\"no such frame\";v[23]=\"no su",
    "ch window\";v[28]=\"script timeout\";v[33]=\"session not created\";v[10",
    "]=\"stale element reference\";v[21]=\"timeout\";v[25]=\"unable to set c",
    "ookie\";v[26]=\"unexpected alert open\";v[13]=ka;v[9]=\"unknown command",
    "\";t.prototype.toString=function(){return this.name+\": \"+this.message",
    "};var la;function ma(a){var b=a.length-1;return 0<=b&&a.indexOf(\" \",b",
    ")==b}var na=String.prototype.trim?function(a){return a.trim()}:function",
    "(a){return a.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function oa(a)",
    "{return String(a).replace(/\\-([a-z])/g,function(a,c){return c.toUpperC",
    "ase()})};function pa(a,b){if(m(a))return m(b)&&1==b.length?a.indexOf(b,",
    "0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}",
    "function w(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)e",
    " in d&&b.call(void 0,d[e],e,a)}function qa(a,b){for(var c=a.length,d=[]",
    ",e=0,f=m(a)?a.split(\"\"):a,g=0;g<c;g++)if(g in f){var k=f[g];b.call(vo",
    "id 0,k,g,a)&&(d[e++]=k)}return d}function ra(a,b,c){var d=c;w(a,functio",
    "n(c,f){d=b.call(void 0,d,c,f,a)});return d}\nfunction sa(a,b){for(var c",
    "=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d",
    "[e],e,a))return!0;return!1}function ta(a,b){for(var c=a.length,d=m(a)?a",
    ".split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))return!1",
    ";return!0}function ua(a,b){a:{for(var c=a.length,d=m(a)?a.split(\"\"):a",
    ",e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}retur",
    "n 0>b?null:m(a)?a.charAt(b):a[b]}function va(a){return Array.prototype.",
    "concat.apply([],arguments)}\nfunction wa(a){var b=a.length;if(0<b){for(",
    "var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function xa(a,b,",
    "c){return 2>=arguments.length?Array.prototype.slice.call(a,b):Array.pro",
    "totype.slice.call(a,b,c)};function x(a,b){this.x=l(a)?a:0;this.y=l(b)?b",
    ":0}h=x.prototype;h.clone=function(){return new x(this.x,this.y)};h.toSt",
    "ring=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function",
    "(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.flo",
    "or=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);retur",
    "n this};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(",
    "this.y);return this};\nh.translate=function(a,b){a instanceof x?(this.x",
    "+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h",
    ".scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};functi",
    "on ya(a,b){this.width=a;this.height=b}h=ya.prototype;h.clone=function()",
    "{return new ya(this.width,this.height)};h.toString=function(){return\"(",
    "\"+this.width+\" x \"+this.height+\")\"};h.ceil=function(){this.width=M",
    "ath.ceil(this.width);this.height=Math.ceil(this.height);return this};h.",
    "floor=function(){this.width=Math.floor(this.width);this.height=Math.flo",
    "or(this.height);return this};h.round=function(){this.width=Math.round(t",
    "his.width);this.height=Math.round(this.height);return this};\nh.scale=f",
    "unction(a,b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};funct",
    "ion y(a){return a?new za(z(a)):la||(la=new za)}function Aa(a,b,c){funct",
    "ion d(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.l",
    "ength;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):w(Ba(f)?wa(f):f,",
    "d)}}function Ca(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}",
    "\nfunction Da(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)retu",
    "rn a==b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPositi",
    "on)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.p",
    "arentNode;return b==a}\nfunction Ea(a,b){if(a==b)return 0;if(a.compareD",
    "ocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceI",
    "ndex\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.no",
    "deType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e",
    "=a.parentNode,f=b.parentNode;return e==f?Ga(a,b):!c&&Da(e,b)?-1*Ha(a,b)",
    ":!d&&Da(f,a)?Ha(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f",
    ".sourceIndex)}d=z(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a",
    "=d.createRange();a.selectNode(b);\na.collapse(!0);return c.compareBound",
    "aryPoints(aa.Range.START_TO_END,a)}function Ha(a,b){var c=a.parentNode;",
    "if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Ga(b,a)}fu",
    "nction Ga(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}func",
    "tion z(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function B",
    "a(a){if(a&&\"number\"==typeof a.length){if(ea(a))return\"function\"==ty",
    "peof a.item||\"string\"==typeof a.item;if(p(a))return\"function\"==type",
    "of a.item}return!1}\nfunction Ia(a,b){a&&(a=a.parentNode);for(var c=0;a",
    ";){if(b(a))return a;a=a.parentNode;c++}return null}function za(a){this.",
    "C=a||aa.document||document}h=za.prototype;h.getElementsByTagName=functi",
    "on(a,b){return(b||this.C).getElementsByTagName(String(a))};\nfunction B",
    "(a,b,c,d){a=d||a.C;var e=b&&\"*\"!=b?String(b).toUpperCase():\"\";if(a.",
    "querySelectorAll&&a.querySelector&&(e||c))c=a.querySelectorAll(e+(c?\".",
    "\"+c:\"\"));else if(c&&a.getElementsByClassName)if(d=a.getElementsByCla",
    "ssName(c),e){a={};for(var f=b=0,g;g=d[f];f++)e==g.nodeName&&(a[b++]=g);",
    "a.length=b;c=a}else c=d;else if(d=a.getElementsByTagName(e||\"*\"),c){a",
    "={};for(f=b=0;g=d[f];f++){var e=g.className,k;if(k=\"function\"==typeof",
    " e.split)k=0<=pa(e.split(/\\s+/),c);k&&(a[b++]=g)}a.length=b;c=a}else c",
    "=d;return c}\nh.createElement=function(a){return this.C.createElement(S",
    "tring(a))};h.createTextNode=function(a){return this.C.createTextNode(St",
    "ring(a))};h.appendChild=function(a,b){a.appendChild(b)};h.append=functi",
    "on(a,b){Aa(z(a),a,arguments)};h.canHaveChildren=function(a){if(1!=a.nod",
    "eType)return!1;switch(a.tagName){case \"APPLET\":case \"AREA\":case \"B",
    "ASE\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"F",
    "RAME\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"I",
    "SINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIP",
    "T\":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case ",
    "\"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0",
    "};\nh.removeNode=function(a){return a&&a.parentNode?a.parentNode.remove",
    "Child(a):null};h.contains=Da;var Ja={K:function(a){return!(!a.querySele",
    "ctorAll||!a.querySelector)},A:function(a,b){if(!a)throw new t(32,\"No c",
    "lass name specified\");a=na(a);if(-1!==a.indexOf(\" \"))throw new t(32,",
    "\"Compound class names not permitted\");if(Ja.K(b))try{return b.querySe",
    "lector(\".\"+a.replace(/\\./g,\"\\\\.\"))||null}catch(c){throw new t(32",
    ",\"An invalid or illegal class name was specified\");}a=B(y(b),\"*\",a,",
    "b);return a.length?a[0]:null},l:function(a,b){if(!a)throw new t(32,\"No",
    " class name specified\");a=na(a);if(-1!==a.indexOf(\" \"))throw new t(3",
    "2,\n\"Compound class names not permitted\");if(Ja.K(b))try{return b.que",
    "rySelectorAll(\".\"+a.replace(/\\./g,\"\\\\.\"))}catch(c){throw new t(3",
    "2,\"An invalid or illegal class name was specified\");}return B(y(b),\"",
    "*\",a,b)}};var Ka={A:function(a,b){p(b.querySelector);if(!a)throw new t",
    "(32,\"No selector specified\");a=na(a);try{var c=b.querySelector(a)}cat",
    "ch(d){throw new t(32,\"An invalid or illegal selector was specified\");",
    "}return c&&1==c.nodeType?c:null},l:function(a,b){p(b.querySelectorAll);",
    "if(!a)throw new t(32,\"No selector specified\");a=na(a);try{return b.qu",
    "erySelectorAll(a)}catch(c){throw new t(32,\"An invalid or illegal selec",
    "tor was specified\");}}};var La={aliceblue:\"#f0f8ff\",antiquewhite:\"#",
    "faebd7\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beig",
    "e:\"#f5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ff",
    "ebcd\",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlyw",
    "ood:\"#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:",
    "\"#d2691e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#ff",
    "f8dc\",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcy",
    "an:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen",
    ":\"#006400\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:",
    "\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchi",
    "d:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:",
    "\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darksla",
    "tegrey:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",dee",
    "ppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:",
    "\"#696969\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"",
    "#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdc",
    "dc\",\nghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gr",
    "ay:\"#808080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080",
    "\",honeydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indig",
    "o:\"#4b0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",",
    "lavenderblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd",
    "\",lightblue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",l",
    "ightgoldenrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90e",
    "e90\",lightgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a",
    "\",\nlightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:",
    "\"#778899\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",light",
    "yellow:\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0",
    "e6\",magenta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa",
    "\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370",
    "db\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumsprin",
    "ggreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c7158",
    "5\",midnightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1",
    "\",\nmoccasin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldl",
    "ace:\"#fdf5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa50",
    "0\",orangered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",",
    "palegreen:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093",
    "\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:",
    "\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",",
    "red:\"#ff0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown",
    ":\"#8b4513\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b",
    "57\",\nseashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skybl",
    "ue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"",
    "#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4",
    "\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff634",
    "7\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"",
    "#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd",
    "32\"};var Ma=\"backgroundColor borderTopColor borderRightColor borderBo",
    "ttomColor borderLeftColor color outlineColor\".split(\" \"),Na=/#([0-9a",
    "-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,Oa=/^#(?:[0-9a-f]{3}){1,2}$/i,Pa=/^(",
    "?:rgba)?\\((\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)",
    "\\)$/i,Qa=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[",
    "1-9]\\d{0,2})\\)$/i;function Ra(a,b){b=b.toLowerCase();return\"style\"=",
    "=b?Sa(a.style.cssText):(a=a.getAttributeNode(b))&&a.specified?a.value:n",
    "ull}var Ta=/[;]+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2})*[^'",
    "]*$)(?=(?:[^()]*\\([^()]*\\))*[^()]*$)/;function Sa(a){var b=[];w(a.spl",
    "it(Ta),function(a){var c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.slice",
    "(c+1)],2==a.length&&b.push(a[0].toLowerCase(),\":\",a[1],\";\"))});b=b.",
    "join(\"\");return b=\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfunction C(",
    "a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeTyp",
    "e&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The MIT License\n\n Copyrig",
    "ht (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Perm",
    "ission is hereby granted, free of charge, to any person obtaining a cop",
    "y\n of this software and associated documentation files (the \"Software",
    "\"), to\n deal in the Software without restriction, including without l",
    "imitation the\n rights to use, copy, modify, merge, publish, distribute",
    ", sublicense, and/or\n sell copies of the Software, and to permit perso",
    "ns to whom the Software is\n furnished to do so, subject to the followi",
    "ng conditions:\n\n The above copyright notice and this permission notic",
    "e shall be included in\n all copies or substantial portions of the Soft",
    "ware.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY K",
    "IND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ",
    "OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEM",
    "ENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR",
    " ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTR",
    "ACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH TH",
    "E SOFTWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunctio",
    "n Ua(a,b,c){this.m=a;this.ua=b||1;this.j=c||1};function Va(a){this.W=a;",
    "this.M=0}function Wa(a){a=a.match(Xa);for(var b=0;b<a.length;b++)Ya.tes",
    "t(a[b])&&a.splice(b,1);return new Va(a)}var Xa=/\\$?(?:(?![0-9-\\.])(?:",
    "\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+",
    "(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Ya=/^\\s/;funct",
    "ion E(a,b){return a.W[a.M+(b||0)]}Va.prototype.next=function(){return t",
    "his.W[this.M++]};Va.prototype.back=function(){this.M--};Va.prototype.em",
    "pty=function(){return this.W.length<=this.M};function F(a){var b=null,c",
    "=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b",
    "=void 0==b||null==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9=",
    "=c?a.documentElement:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.n",
    "odeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[",
    "--c].nextSibling););}}else b=a.nodeValue;return\"\"+b}\nfunction Za(a,b",
    ",c){if(null===b)return!0;try{if(!a.getAttribute)return!1}catch(d){retur",
    "n!1}return null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function ",
    "$a(a,b,c,d,e){return ab.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new G)",
    "}\nfunction ab(a,b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getE",
    "lementsByName(d),w(b,function(b){a.matches(b)&&e.add(b)})):b.getElement",
    "sByClassName&&d&&\"class\"==c?(b=b.getElementsByClassName(d),w(b,functi",
    "on(b){b.className==d&&a.matches(b)&&e.add(b)})):a instanceof H?bb(a,b,c",
    ",d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.getName()),w(",
    "b,function(a){Za(a,c,d)&&e.add(a)}));return e}\nfunction bb(a,b,c,d,e){",
    "for(b=b.firstChild;b;b=b.nextSibling)Za(b,c,d)&&a.matches(b)&&e.add(b),",
    "bb(a,b,c,d,e)};function G(){this.j=this.g=null;this.H=0}function cb(a){",
    "this.node=a;this.next=this.B=null}function db(a,b){if(!a.g)return b;if(",
    "!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node",
    "?(e=c,c=c.next,b=b.next):0<Ea(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.ne",
    "xt),(e.B=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.B=d,d=d.next=e,f++,e",
    "=e.next;a.j=d;a.H=f;return a}G.prototype.unshift=function(a){a=new cb(a",
    ");a.next=this.g;this.j?this.g.B=a:this.g=this.j=a;this.g=a;this.H++};\n",
    "G.prototype.add=function(a){a=new cb(a);a.B=this.j;this.g?this.j.next=a",
    ":this.g=this.j=a;this.j=a;this.H++};function eb(a){return(a=a.g)?a.node",
    ":null}G.prototype.s=function(){return this.H};function fb(a){return(a=e",
    "b(a))?F(a):\"\"}G.prototype.iterator=function(a){return new gb(this,!!a",
    ")};function gb(a,b){this.qa=a;this.Z=(this.D=b)?a.j:a.g;this.T=null}gb.",
    "prototype.next=function(){var a=this.Z;if(null==a)return null;var b=thi",
    "s.T=a;this.Z=this.D?a.B:a.next;return b.node};\ngb.prototype.remove=fun",
    "ction(){var a=this.qa,b=this.T;if(!b)throw Error(\"Next must be called ",
    "at least once before remove.\");var c=b.B,b=b.next;c?c.next=b:a.g=b;b?b",
    ".B=c:a.j=c;a.H--;this.T=null};function I(a){this.f=a;this.h=this.u=!1;t",
    "his.I=null}function J(a){return\"\\n  \"+a.toString().split(\"\\n\").jo",
    "in(\"\\n  \")}I.prototype.c=function(){return this.u};function hb(a,b){",
    "a.u=b}function ib(a,b){a.h=b}I.prototype.w=function(){return this.I};fu",
    "nction K(a,b){a=a.evaluate(b);return a instanceof G?+fb(a):+a}function ",
    "M(a,b){a=a.evaluate(b);return a instanceof G?fb(a):\"\"+a}function jb(a",
    ",b){a=a.evaluate(b);return a instanceof G?!!a.s():!!a};function kb(a,b,",
    "c){I.call(this,a.f);this.V=a;this.ca=b;this.ia=c;this.u=b.c()||c.c();th",
    "is.h=b.h||c.h;this.V==lb&&(c.h||c.c()||4==c.f||0==c.f||!b.w()?b.h||b.c(",
    ")||4==b.f||0==b.f||!c.w()||(this.I={name:c.w().name,G:b}):this.I={name:",
    "b.w().name,G:c})}q(kb,I);\nfunction mb(a,b,c,d,e){b=b.evaluate(d);c=c.e",
    "valuate(d);var f;if(b instanceof G&&c instanceof G){b=b.iterator();for(",
    "d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a",
    "(F(d),F(f)))return!0;return!1}if(b instanceof G||c instanceof G){b inst",
    "anceof G?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,k=f.next",
    "();k;k=f.next()){switch(g){case \"number\":k=+F(k);break;case \"boolean",
    "\":k=!!F(k);break;case \"string\":k=F(k);break;default:throw Error(\"Il",
    "legal primitive type for comparison.\");\n}if(e==b&&a(k,d)||e==c&&a(d,k",
    "))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof",
    " c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c",
    "):a(+b,+c)}kb.prototype.evaluate=function(a){return this.V.o(this.ca,th",
    "is.ia,a)};kb.prototype.toString=function(){var a=\"Binary Expression: ",
    "\"+this.V,a=a+J(this.ca);return a+=J(this.ia)};function nb(a,b,c,d){thi",
    "s.ta=a;this.ga=b;this.f=c;this.o=d}nb.prototype.toString=function(){ret",
    "urn this.ta};var ob={};\nfunction N(a,b,c,d){if(ob.hasOwnProperty(a))th",
    "row Error(\"Binary operator already created: \"+a);a=new nb(a,b,c,d);re",
    "turn ob[a.toString()]=a}N(\"div\",6,1,function(a,b,c){return K(a,c)/K(b",
    ",c)});N(\"mod\",6,1,function(a,b,c){return K(a,c)%K(b,c)});N(\"*\",6,1,",
    "function(a,b,c){return K(a,c)*K(b,c)});N(\"+\",5,1,function(a,b,c){retu",
    "rn K(a,c)+K(b,c)});N(\"-\",5,1,function(a,b,c){return K(a,c)-K(b,c)});N",
    "(\"<\",4,2,function(a,b,c){return mb(function(a,b){return a<b},a,b,c)})",
    ";\nN(\">\",4,2,function(a,b,c){return mb(function(a,b){return a>b},a,b,",
    "c)});N(\"<=\",4,2,function(a,b,c){return mb(function(a,b){return a<=b},",
    "a,b,c)});N(\">=\",4,2,function(a,b,c){return mb(function(a,b){return a>",
    "=b},a,b,c)});var lb=N(\"=\",3,2,function(a,b,c){return mb(function(a,b)",
    "{return a==b},a,b,c,!0)});N(\"!=\",3,2,function(a,b,c){return mb(functi",
    "on(a,b){return a!=b},a,b,c,!0)});N(\"and\",2,2,function(a,b,c){return j",
    "b(a,c)&&jb(b,c)});N(\"or\",1,2,function(a,b,c){return jb(a,c)||jb(b,c)}",
    ");function pb(a,b){if(b.s()&&4!=a.f)throw Error(\"Primary expression mu",
    "st evaluate to nodeset if filter has predicate(s).\");I.call(this,a.f);",
    "this.ha=a;this.b=b;this.u=a.c();this.h=a.h}q(pb,I);pb.prototype.evaluat",
    "e=function(a){a=this.ha.evaluate(a);return qb(this.b,a)};pb.prototype.t",
    "oString=function(){var a=\"Filter:\"+J(this.ha);return a+=J(this.b)};fu",
    "nction rb(a,b){if(b.length<a.fa)throw Error(\"Function \"+a.i+\" expect",
    "s at least\"+a.fa+\" arguments, \"+b.length+\" given\");if(null!==a.U&&",
    "b.length>a.U)throw Error(\"Function \"+a.i+\" expects at most \"+a.U+\"",
    " arguments, \"+b.length+\" given\");a.ra&&w(b,function(b,d){if(4!=b.f)t",
    "hrow Error(\"Argument \"+d+\" to function \"+a.i+\" is not of type Node",
    "set: \"+b);});I.call(this,a.f);this.L=a;this.R=b;hb(this,a.u||sa(b,func",
    "tion(a){return a.c()}));ib(this,a.pa&&!b.length||a.oa&&!!b.length||sa(b",
    ",function(a){return a.h}))}\nq(rb,I);rb.prototype.evaluate=function(a){",
    "return this.L.o.apply(null,va(a,this.R))};rb.prototype.toString=functio",
    "n(){var a=\"Function: \"+this.L;if(this.R.length)var b=ra(this.R,functi",
    "on(a,b){return a+J(b)},\"Arguments:\"),a=a+J(b);return a};function sb(a",
    ",b,c,d,e,f,g,k,u){this.i=a;this.f=b;this.u=c;this.pa=d;this.oa=e;this.o",
    "=f;this.fa=g;this.U=l(k)?k:g;this.ra=!!u}sb.prototype.toString=function",
    "(){return this.i};var tb={};\nfunction O(a,b,c,d,e,f,g,k){if(tb.hasOwnP",
    "roperty(a))throw Error(\"Function already created: \"+a+\".\");tb[a]=ne",
    "w sb(a,b,c,d,!1,e,f,g,k)}O(\"boolean\",2,!1,!1,function(a,b){return jb(",
    "b,a)},1);O(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(K(b,a))},",
    "1);O(\"concat\",3,!1,!1,function(a,b){return ra(xa(arguments,1),functio",
    "n(b,d){return b+M(d,a)},\"\")},2,null);O(\"contains\",2,!1,!1,function(",
    "a,b,c){b=M(b,a);a=M(c,a);return-1!=b.indexOf(a)},2);O(\"count\",1,!1,!1",
    ",function(a,b){return b.evaluate(a).s()},1,1,!0);\nO(\"false\",2,!1,!1,",
    "function(){return!1},0);O(\"floor\",1,!1,!1,function(a,b){return Math.f",
    "loor(K(b,a))},1);O(\"id\",4,!1,!1,function(a,b){var c=a.m,d=9==c.nodeTy",
    "pe?c:c.ownerDocument;a=M(b,a).split(/\\s+/);var e=[];w(a,function(a){a=",
    "d.getElementById(a);!a||0<=pa(e,a)||e.push(a)});e.sort(Ea);var f=new G;",
    "w(e,function(a){f.add(a)});return f},1);O(\"lang\",2,!1,!1,function(){r",
    "eturn!1},1);O(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw",
    " Error(\"Function last expects ()\");return a.j},0);\nO(\"local-name\",",
    "3,!1,!0,function(a,b){return(a=b?eb(b.evaluate(a)):a.m)?a.localName||a.",
    "nodeName.toLowerCase():\"\"},0,1,!0);O(\"name\",3,!1,!0,function(a,b){r",
    "eturn(a=b?eb(b.evaluate(a)):a.m)?a.nodeName.toLowerCase():\"\"},0,1,!0)",
    ";O(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);O(\"normali",
    "ze-space\",3,!1,!0,function(a,b){return(b?M(b,a):F(a.m)).replace(/[\\s",
    "\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);O(\"not\",2,!1,!1,f",
    "unction(a,b){return!jb(b,a)},1);\nO(\"number\",1,!1,!0,function(a,b){re",
    "turn b?K(b,a):+F(a.m)},0,1);O(\"position\",1,!0,!1,function(a){return a",
    ".ua},0);O(\"round\",1,!1,!1,function(a,b){return Math.round(K(b,a))},1)",
    ";O(\"starts-with\",2,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);return 0==",
    "b.lastIndexOf(a,0)},2);O(\"string\",3,!1,!0,function(a,b){return b?M(b,",
    "a):F(a.m)},0,1);O(\"string-length\",1,!1,!0,function(a,b){return(b?M(b,",
    "a):F(a.m)).length},0,1);\nO(\"substring\",3,!1,!1,function(a,b,c,d){c=K",
    "(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?K(d,a):Infi",
    "nity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math",
    ".max(c,0);a=M(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Ma",
    "th.round(d))},2,3);O(\"substring-after\",3,!1,!1,function(a,b,c){b=M(b,",
    "a);a=M(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2)",
    ";\nO(\"substring-before\",3,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);a=b",
    ".indexOf(a);return-1==a?\"\":b.substring(0,a)},2);O(\"sum\",1,!1,!1,fun",
    "ction(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next",
    "())b+=+F(c);return b},1,1,!0);O(\"translate\",3,!1,!1,function(a,b,c,d)",
    "{b=M(b,a);c=M(c,a);var e=M(d,a);d={};for(var f=0;f<c.length;f++)a=c.cha",
    "rAt(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.cha",
    "rAt(f),c+=a in d?d[a]:a;return c},3);O(\"true\",2,!1,!1,function(){retu",
    "rn!0},0);function H(a,b){this.la=a;this.da=l(b)?b:null;this.F=null;swit",
    "ch(a){case \"comment\":this.F=8;break;case \"text\":this.F=3;break;case",
    " \"processing-instruction\":this.F=7;break;case \"node\":break;default:",
    "throw Error(\"Unexpected argument\");}}function ub(a){return\"comment\"",
    "==a||\"text\"==a||\"processing-instruction\"==a||\"node\"==a}H.prototyp",
    "e.matches=function(a){return null===this.F||this.F==a.nodeType};H.proto",
    "type.getName=function(){return this.la};\nH.prototype.toString=function",
    "(){var a=\"Kind Test: \"+this.la;null===this.da||(a+=J(this.da));return",
    " a};function vb(a){I.call(this,3);this.ka=a.substring(1,a.length-1)}q(v",
    "b,I);vb.prototype.evaluate=function(){return this.ka};vb.prototype.toSt",
    "ring=function(){return\"Literal: \"+this.ka};function wb(a,b){this.i=a.",
    "toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";th",
    "is.N=b?b.toLowerCase():a}wb.prototype.matches=function(a){var b=a.nodeT",
    "ype;if(1!=b&&2!=b)return!1;b=l(a.localName)?a.localName:a.nodeName;retu",
    "rn\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.N?!0:this.N==(a",
    ".namespaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xht",
    "ml\")};wb.prototype.getName=function(){return this.i};\nwb.prototype.to",
    "String=function(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml",
    "\"==this.N?\"\":this.N+\":\")+this.i};function xb(a){I.call(this,1);thi",
    "s.ma=a}q(xb,I);xb.prototype.evaluate=function(){return this.ma};xb.prot",
    "otype.toString=function(){return\"Number: \"+this.ma};function yb(a,b){",
    "I.call(this,a.f);this.aa=a;this.J=b;this.u=a.c();this.h=a.h;1==this.J.l",
    "ength&&(a=this.J[0],a.S||a.v!=zb||(a=a.P,\"*\"!=a.getName()&&(this.I={n",
    "ame:a.getName(),G:null})))}q(yb,I);function Ab(){I.call(this,4)}q(Ab,I)",
    ";Ab.prototype.evaluate=function(a){var b=new G;a=a.m;9==a.nodeType?b.ad",
    "d(a):b.add(a.ownerDocument);return b};Ab.prototype.toString=function(){",
    "return\"Root Helper Expression\"};function Bb(){I.call(this,4)}q(Bb,I);",
    "Bb.prototype.evaluate=function(a){var b=new G;b.add(a.m);return b};\nBb",
    ".prototype.toString=function(){return\"Context Helper Expression\"};fun",
    "ction Cb(a){return\"/\"==a||\"//\"==a}\nyb.prototype.evaluate=function(",
    "a){var b=this.aa.evaluate(a);if(!(b instanceof G))throw Error(\"Filter ",
    "expression must evaluate to nodeset.\");a=this.J;for(var c=0,d=a.length",
    ";c<d&&b.s();c++){var e=a[c],f=b.iterator(e.v.D);if(e.c()||e.v!=Db)if(e.",
    "c()||e.v!=Eb){var g=f.next();for(b=e.evaluate(new Ua(g));null!=(g=f.nex",
    "t());)g=e.evaluate(new Ua(g)),b=db(b,g)}else g=f.next(),b=e.evaluate(ne",
    "w Ua(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains(b))",
    "&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new Ua(g))}}return b",
    "};\nyb.prototype.toString=function(){var a=\"Path Expression:\"+J(this.",
    "aa);if(this.J.length){var b=ra(this.J,function(a,b){return a+J(b)},\"St",
    "eps:\");a+=J(b)}return a};function P(a,b){this.b=a;this.D=!!b}function ",
    "qb(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f",
    "=b.s(),g,k=0;g=e.next();k++){var u=a.D?f-k:k+1;g=d.evaluate(new Ua(g,u,",
    "f));if(\"number\"==typeof g)u=u==g;else if(\"string\"==typeof g||\"bool",
    "ean\"==typeof g)u=!!g;else if(g instanceof G)u=0<g.s();else throw Error",
    "(\"Predicate.evaluate returned an unexpected type.\");u||e.remove()}ret",
    "urn b}P.prototype.w=function(){return 0<this.b.length?this.b[0].w():nul",
    "l};\nP.prototype.c=function(){for(var a=0;a<this.b.length;a++){var b=th",
    "is.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};P.prototype.s=funct",
    "ion(){return this.b.length};P.prototype.toString=function(){return ra(t",
    "his.b,function(a,b){return a+J(b)},\"Predicates:\")};function Q(a,b,c,d",
    "){I.call(this,4);this.v=a;this.P=b;this.b=c||new P([]);this.S=!!d;b=thi",
    "s.b.w();a.va&&b&&(this.I={name:b.name,G:b.G});this.u=this.b.c()}q(Q,I);",
    "\nQ.prototype.evaluate=function(a){var b=a.m,c=this.w(),d=null,e=null,f",
    "=0;c&&(d=c.name,e=c.G?M(c.G,a):null,f=1);if(this.S)if(this.c()||this.v!",
    "=Fb)if(b=(new Q(Gb,new H(\"node\"))).evaluate(a).iterator(),c=b.next())",
    "for(a=this.o(c,d,e,f);null!=(c=b.next());)a=db(a,this.o(c,d,e,f));else ",
    "a=new G;else a=$a(this.P,b,d,e),a=qb(this.b,a,f);else a=this.o(a.m,d,e,",
    "f);return a};Q.prototype.o=function(a,b,c,d){a=this.v.L(this.P,a,b,c);r",
    "eturn a=qb(this.b,a,d)};\nQ.prototype.toString=function(){var a=\"Step:",
    "\"+J(\"Operator: \"+(this.S?\"//\":\"/\"));this.v.i&&(a+=J(\"Axis: \"+t",
    "his.v));a+=J(this.P);if(this.b.s()){var b=ra(this.b.b,function(a,b){ret",
    "urn a+J(b)},\"Predicates:\");a+=J(b)}return a};function Hb(a,b,c,d){thi",
    "s.i=a;this.L=b;this.D=c;this.va=d}Hb.prototype.toString=function(){retu",
    "rn this.i};var Ib={};function R(a,b,c,d){if(Ib.hasOwnProperty(a))throw ",
    "Error(\"Axis already created: \"+a);b=new Hb(a,b,c,!!d);return Ib[a]=b}",
    "\nR(\"ancestor\",function(a,b){for(var c=new G;b=b.parentNode;)a.matche",
    "s(b)&&c.unshift(b);return c},!0);R(\"ancestor-or-self\",function(a,b){v",
    "ar c=new G;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c",
    "},!0);\nvar zb=R(\"attribute\",function(a,b){var c=new G,d=a.getName();",
    "if(b=b.attributes)if(a instanceof H&&null===a.F||\"*\"==d)for(d=0;a=b[d",
    "];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1),Fb=R(",
    "\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||new G;fo",
    "r(b=b.firstChild;b;b=b.nextSibling)Za(b,c,d)&&a.matches(b)&&e.add(b);re",
    "turn e},!1,!0);R(\"descendant\",$a,!1,!0);\nvar Gb=R(\"descendant-or-se",
    "lf\",function(a,b,c,d){var e=new G;Za(b,c,d)&&a.matches(b)&&e.add(b);re",
    "turn $a(a,b,c,d,e)},!1,!0),Db=R(\"following\",function(a,b,c,d){var e=n",
    "ew G;do for(var f=b;f=f.nextSibling;)Za(f,c,d)&&a.matches(f)&&e.add(f),",
    "e=$a(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);R(\"following-si",
    "bling\",function(a,b){for(var c=new G;b=b.nextSibling;)a.matches(b)&&c.",
    "add(b);return c},!1);R(\"namespace\",function(){return new G},!1);\nvar",
    " Jb=R(\"parent\",function(a,b){var c=new G;if(9==b.nodeType)return c;if",
    "(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(",
    "b)&&c.add(b);return c},!1),Eb=R(\"preceding\",function(a,b,c,d){var e=n",
    "ew G,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,k=f.length;",
    "g<k;g++){var u=[];for(b=f[g];b=b.previousSibling;)u.unshift(b);for(var ",
    "D=0,r=u.length;D<r;D++)b=u[D],Za(b,c,d)&&a.matches(b)&&e.add(b),e=$a(a,",
    "b,c,d,e)}return e},!0,!0);\nR(\"preceding-sibling\",function(a,b){for(v",
    "ar c=new G;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0",
    ");var Kb=R(\"self\",function(a,b){var c=new G;a.matches(b)&&c.add(b);re",
    "turn c},!1);function Lb(a){I.call(this,1);this.$=a;this.u=a.c();this.h=",
    "a.h}q(Lb,I);Lb.prototype.evaluate=function(a){return-K(this.$,a)};Lb.pr",
    "ototype.toString=function(){return\"Unary Expression: -\"+J(this.$)};fu",
    "nction Mb(a){I.call(this,4);this.O=a;hb(this,sa(this.O,function(a){retu",
    "rn a.c()}));ib(this,sa(this.O,function(a){return a.h}))}q(Mb,I);Mb.prot",
    "otype.evaluate=function(a){var b=new G;w(this.O,function(c){c=c.evaluat",
    "e(a);if(!(c instanceof G))throw Error(\"Path expression must evaluate t",
    "o NodeSet.\");b=db(b,c)});return b};Mb.prototype.toString=function(){re",
    "turn ra(this.O,function(a,b){return a+J(b)},\"Union Expression:\")};fun",
    "ction Nb(a,b){this.a=a;this.sa=b}function Ob(a){for(var b,c=[];;){S(a,",
    "\"Missing right hand side of binary expression.\");b=Pb(a);var d=a.a.ne",
    "xt();if(!d)break;var e=(d=ob[d]||null)&&d.ga;if(!e){a.a.back();break}fo",
    "r(;c.length&&e<=c[c.length-1].ga;)b=new kb(c.pop(),c.pop(),b);c.push(b,",
    "d)}for(;c.length;)b=new kb(c.pop(),c.pop(),b);return b}function S(a,b){",
    "if(a.a.empty())throw Error(b);}function Qb(a,b){a=a.a.next();if(a!=b)th",
    "row Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction Rb(a){a",
    "=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function Sb(a){",
    "a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\");ret",
    "urn new vb(a)}\nfunction Tb(a){var b=[];if(Cb(E(a.a))){var c=a.a.next()",
    ";var d=E(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&",
    "&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new Ab;d=new Ab;S(a,\"Miss",
    "ing next location step.\");c=Ub(a,c);b.push(c)}else{a:{c=E(a.a);d=c.cha",
    "rAt(0);switch(d){case \"$\":throw Error(\"Variable reference not allowe",
    "d in HTML XPath\");case \"(\":a.a.next();c=Ob(a);S(a,'unclosed \"(\"');",
    "Qb(a,\")\");break;case '\"':case \"'\":c=Sb(a);break;default:if(isNaN(+",
    "c))if(!ub(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==E(a.a,\n1)){c=a.a.next()",
    ";c=tb[c]||null;a.a.next();for(d=[];\")\"!=E(a.a);){S(a,\"Missing functi",
    "on argument list.\");d.push(Ob(a));if(\",\"!=E(a.a))break;a.a.next()}S(",
    "a,\"Unclosed function argument list.\");Rb(a);c=new rb(c,d)}else{c=null",
    ";break a}else c=new xb(+a.a.next())}\"[\"==E(a.a)&&(d=new P(Vb(a)),c=ne",
    "w pb(c,d))}if(c)if(Cb(E(a.a)))d=c;else return c;else c=Ub(a,\"/\"),d=ne",
    "w Bb,b.push(c)}for(;Cb(E(a.a));)c=a.a.next(),S(a,\"Missing next locatio",
    "n step.\"),c=Ub(a,c),b.push(c);return new yb(d,b)}\nfunction Ub(a,b){if",
    "(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');i",
    "f(\".\"==E(a.a)){var c=new Q(Kb,new H(\"node\"));a.a.next();return c}if",
    "(\"..\"==E(a.a))return c=new Q(Jb,new H(\"node\")),a.a.next(),c;if(\"@",
    "\"==E(a.a)){var d=zb;a.a.next();S(a,\"Missing attribute name\")}else if",
    "(\"::\"==E(a.a,1)){if(!/(?![0-9])[\\w]/.test(E(a.a).charAt(0)))throw Er",
    "ror(\"Bad token: \"+a.a.next());var e=a.a.next();d=Ib[e]||null;if(!d)th",
    "row Error(\"No axis with name: \"+e);a.a.next();S(a,\"Missing node name",
    "\")}else d=Fb;e=\nE(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"",
    "(\"==E(a.a,1)){if(!ub(e))throw Error(\"Invalid node type: \"+e);e=a.a.n",
    "ext();if(!ub(e))throw Error(\"Invalid type name: \"+e);Qb(a,\"(\");S(a,",
    "\"Bad nodetype\");var f=E(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=",
    "Sb(a);S(a,\"Bad nodetype\");Rb(a);e=new H(e,g)}else if(e=a.a.next(),f=e",
    ".indexOf(\":\"),-1==f)e=new wb(e);else{var g=e.substring(0,f);if(\"*\"=",
    "=g)var k=\"*\";else if(k=a.sa(g),!k)throw Error(\"Namespace prefix not ",
    "declared: \"+g);e=e.substr(f+1);e=new wb(e,k)}else throw Error(\"Bad to",
    "ken: \"+\na.a.next());a=new P(Vb(a),d.D);return c||new Q(d,e,a,\"//\"==",
    "b)}function Vb(a){for(var b=[];\"[\"==E(a.a);){a.a.next();S(a,\"Missing",
    " predicate expression.\");var c=Ob(a);b.push(c);S(a,\"Unclosed predicat",
    "e expression.\");Qb(a,\"]\")}return b}function Pb(a){if(\"-\"==E(a.a))r",
    "eturn a.a.next(),new Lb(Pb(a));var b=Tb(a);if(\"|\"!=E(a.a))a=b;else{fo",
    "r(b=[b];\"|\"==a.a.next();)S(a,\"Missing next union location path.\"),b",
    ".push(Tb(a));a.a.back();a=new Mb(b)}return a};function Wb(a){switch(a.n",
    "odeType){case 1:return ia(Xb,a);case 9:return Wb(a.documentElement);cas",
    "e 11:case 10:case 6:case 12:return Yb;default:return a.parentNode?Wb(a.",
    "parentNode):Yb}}function Yb(){return null}function Xb(a,b){if(a.prefix=",
    "=b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getA",
    "ttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parent",
    "Node&&9!=a.parentNode.nodeType?Xb(a.parentNode,b):null};function Zb(a,b",
    "){if(!a.length)throw Error(\"Empty XPath expression.\");a=Wa(a);if(a.em",
    "pty())throw Error(\"Invalid XPath expression.\");b?p(b)||(b=ha(b.lookup",
    "NamespaceURI,b)):b=function(){return null};var c=Ob(new Nb(a,b));if(!a.",
    "empty())throw Error(\"Bad token: \"+a.next());this.evaluate=function(a,",
    "b){a=c.evaluate(new Ua(a));return new T(a,b)}}\nfunction T(a,b){if(0==b",
    ")if(a instanceof G)b=4;else if(\"string\"==typeof a)b=2;else if(\"numbe",
    "r\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Error(\"",
    "Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof G)",
    ")throw Error(\"value could not be converted to the specified type\");th",
    "is.resultType=b;switch(b){case 2:this.stringValue=a instanceof G?fb(a):",
    "\"\"+a;break;case 1:this.numberValue=a instanceof G?+fb(a):+a;break;cas",
    "e 3:this.booleanValue=a instanceof G?0<a.s():!!a;break;case 4:case 5:ca",
    "se 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.next",
    "())d.push(e);this.snapshotLength=a.s();this.invalidIteratorState=!1;bre",
    "ak;case 8:case 9:this.singleNodeValue=eb(a);break;default:throw Error(",
    "\"Unknown XPathResult type.\");}var f=0;this.iterateNext=function(){if(",
    "4!=b&&5!=b)throw Error(\"iterateNext called with wrong result type\");r",
    "eturn f>=d.length?null:d[f++]};this.snapshotItem=function(a){if(6!=b&&7",
    "!=b)throw Error(\"snapshotItem called with wrong result type\");return ",
    "a>=d.length||0>a?null:d[a]}}\nT.ANY_TYPE=0;T.NUMBER_TYPE=1;T.STRING_TYP",
    "E=2;T.BOOLEAN_TYPE=3;T.UNORDERED_NODE_ITERATOR_TYPE=4;T.ORDERED_NODE_IT",
    "ERATOR_TYPE=5;T.UNORDERED_NODE_SNAPSHOT_TYPE=6;T.ORDERED_NODE_SNAPSHOT_",
    "TYPE=7;T.ANY_UNORDERED_NODE_TYPE=8;T.FIRST_ORDERED_NODE_TYPE=9;function",
    " $b(a){this.lookupNamespaceURI=Wb(a)}\nba(\"wgxpath.install\",function(",
    "a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.document;if(!c.e",
    "valuate||b)a.XPathResult=T,c.evaluate=function(a,b,c,g){return(new Zb(a",
    ",c)).evaluate(b,g)},c.createExpression=function(a,b){return new Zb(a,b)",
    "},c.createNSResolver=function(a){return new $b(a)}});var U={};U.X=funct",
    "ion(){var a={ya:\"http://www.w3.org/2000/svg\"};return function(b){retu",
    "rn a[b]||null}}();\nU.o=function(a,b,c){var d=z(a);if(!d.documentElemen",
    "t)return null;try{for(var e=d.createNSResolver?d.createNSResolver(d.doc",
    "umentElement):U.X,f={},g=d.getElementsByTagName(\"*\"),k=0;k<g.length;+",
    "+k){var u=g[k],D=u.namespaceURI;if(D&&!f[D]){var r=u.lookupPrefix(D);if",
    "(!r)var A=D.match(\".*/(\\\\w+)/?$\"),r=A?A[1]:\"xhtml\";f[D]=r}}var L=",
    "{},W;for(W in f)L[f[W]]=W;e=function(a){return L[a]||null};try{return d",
    ".evaluate(b,a,e,c,null)}catch(Fa){if(\"TypeError\"===Fa.name)return e=d",
    ".createNSResolver?d.createNSResolver(d.documentElement):\nU.X,d.evaluat",
    "e(b,a,e,c,null);throw Fa;}}catch(Fa){throw new t(32,\"Unable to locate ",
    "an element with the xpath expression \"+b+\" because of the following e",
    "rror:\\n\"+Fa);}};U.Y=function(a,b){if(!a||1!=a.nodeType)throw new t(32",
    ",'The result of the xpath expression \"'+b+'\" is: '+a+\". It should be",
    " an element.\");};\nU.A=function(a,b){var c=function(){var c=U.o(b,a,9)",
    ";return c?c.singleNodeValue||null:b.selectSingleNode?(c=z(b),c.setPrope",
    "rty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selectSingleNode(",
    "a)):null}();null===c||U.Y(c,a);return c};\nU.l=function(a,b){var c=func",
    "tion(){var c=U.o(b,a,7);if(c){for(var e=c.snapshotLength,f=[],g=0;g<e;+",
    "+g)f.push(c.snapshotItem(g));return f}return b.selectNodes?(c=z(b),c.se",
    "tProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selectNodes",
    "(a)):[]}();w(c,function(b){U.Y(b,a)});return c};function ac(a,b,c,d){th",
    "is.top=a;this.right=b;this.bottom=c;this.left=d}h=ac.prototype;h.clone=",
    "function(){return new ac(this.top,this.right,this.bottom,this.left)};h.",
    "toString=function(){return\"(\"+this.top+\"t, \"+this.right+\"r, \"+thi",
    "s.bottom+\"b, \"+this.left+\"l)\"};h.contains=function(a){return this&&",
    "a?a instanceof ac?a.left>=this.left&&a.right<=this.right&&a.top>=this.t",
    "op&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.to",
    "p&&a.y<=this.bottom:!1};\nh.expand=function(a,b,c,d){ea(a)?(this.top-=a",
    ".top,this.right+=a.right,this.bottom+=a.bottom,this.left-=a.left):(this",
    ".top-=a,this.right+=Number(b),this.bottom+=Number(c),this.left-=Number(",
    "d));return this};h.ceil=function(){this.top=Math.ceil(this.top);this.ri",
    "ght=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this.left=",
    "Math.ceil(this.left);return this};\nh.floor=function(){this.top=Math.fl",
    "oor(this.top);this.right=Math.floor(this.right);this.bottom=Math.floor(",
    "this.bottom);this.left=Math.floor(this.left);return this};h.round=funct",
    "ion(){this.top=Math.round(this.top);this.right=Math.round(this.right);t",
    "his.bottom=Math.round(this.bottom);this.left=Math.round(this.left);retu",
    "rn this};h.translate=function(a,b){a instanceof x?(this.left+=a.x,this.",
    "right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,",
    "n(b)&&(this.top+=b,this.bottom+=b));return this};\nh.scale=function(a,b",
    "){b=n(b)?b:a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=b;retu",
    "rn this};function V(a,b,c,d){this.left=a;this.top=b;this.width=c;this.h",
    "eight=d}h=V.prototype;h.clone=function(){return new V(this.left,this.to",
    "p,this.width,this.height)};h.toString=function(){return\"(\"+this.left+",
    "\", \"+this.top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};h.conta",
    "ins=function(a){return a instanceof x?a.x>=this.left&&a.x<=this.left+th",
    "is.width&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&t",
    "his.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+this.hei",
    "ght>=a.top+a.height};\nh.ceil=function(){this.left=Math.ceil(this.left)",
    ";this.top=Math.ceil(this.top);this.width=Math.ceil(this.width);this.hei",
    "ght=Math.ceil(this.height);return this};h.floor=function(){this.left=Ma",
    "th.floor(this.left);this.top=Math.floor(this.top);this.width=Math.floor",
    "(this.width);this.height=Math.floor(this.height);return this};h.round=f",
    "unction(){this.left=Math.round(this.left);this.top=Math.round(this.top)",
    ";this.width=Math.round(this.width);this.height=Math.round(this.height);",
    "return this};\nh.translate=function(a,b){a instanceof x?(this.left+=a.x",
    ",this.top+=a.y):(this.left+=a,n(b)&&(this.top+=b));return this};h.scale",
    "=function(a,b){b=n(b)?b:a;this.left*=a;this.width*=a;this.top*=b;this.h",
    "eight*=b;return this};var bc=\"function\"===typeof ShadowRoot;function ",
    "cc(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeTyp",
    "e;)a=a.parentNode;return C(a)?a:null}\nfunction X(a,b){b=oa(b);if(\"flo",
    "at\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat\";a:{var c=b;v",
    "ar d=z(a);if(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.defaul",
    "tView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||\"\";br",
    "eak a}c=\"\"}a=c||dc(a,b);if(null===a)a=null;else if(0<=pa(Ma,b)){b:{va",
    "r e=a.match(Pa);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[3]),e=N",
    "umber(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b",
    ",c,d,e];break b}b=null}if(!b)b:{if(d=a.match(Qa))if(b=Number(d[1]),\nc=",
    "Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b",
    "=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=La[b.toLowerCase",
    "()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&(c=c.replace(Na",
    ",\"#$1$1$2$2$3$3\")),!Oa.test(c))){b=null;break b}b=[parseInt(c.substr(",
    "1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?",
    "\"rgba(\"+b.join(\", \")+\")\":a}return a}\nfunction dc(a,b){var c=a.cu",
    "rrentStyle||a.style,d=c[b];!l(d)&&p(c.getPropertyValue)&&(d=c.getProper",
    "tyValue(b));return\"inherit\"!=d?l(d)?d:null:(a=cc(a))?dc(a,b):null}\nf",
    "unction ec(a,b,c){function d(a){var b=fc(a);return 0<b.height&&0<b.widt",
    "h?!0:C(a,\"PATH\")&&(0<b.height||0<b.width)?(a=X(a,\"stroke-width\"),!!",
    "a&&0<parseInt(a,10)):\"hidden\"!=X(a,\"overflow\")&&sa(a.childNodes,fun",
    "ction(a){return 3==a.nodeType||C(a)&&d(a)})}function e(a){return gc(a)=",
    "=Y&&ta(a.childNodes,function(a){return!C(a)||e(a)||!d(a)})}if(!C(a))thr",
    "ow Error(\"Argument to isShown must be of type Element\");if(C(a,\"BODY",
    "\"))return!0;if(C(a,\"OPTION\")||C(a,\"OPTGROUP\"))return a=Ia(a,functi",
    "on(a){return C(a,\"SELECT\")}),\n!!a&&ec(a,!0,c);var f=hc(a);if(f)retur",
    "n!!f.ba&&0<f.rect.width&&0<f.rect.height&&ec(f.ba,b,c);if(C(a,\"INPUT\"",
    ")&&\"hidden\"==a.type.toLowerCase()||C(a,\"NOSCRIPT\"))return!1;f=X(a,",
    "\"visibility\");return\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=ic(a",
    "))&&d(a)?!e(a):!1}\nfunction jc(a){function b(a){if(C(a)&&\"none\"==X(a",
    ",\"display\"))return!1;a:{var c=a.parentNode;if(a.getDestinationInserti",
    "onPoints){var e=a.getDestinationInsertionPoints();if(0<e.length){a=e[e.",
    "length-1];break a}}a=c&&c.shadowRoot&&void 0!==a.assignedSlot?a.assigne",
    "dSlot?a.assignedSlot.parentNode:null:c}return bc&&a instanceof ShadowRo",
    "ot||a&&(9==a.nodeType||11==a.nodeType)?!0:!!a&&b(a)}return ec(a,!1,b)}v",
    "ar Y=\"hidden\";\nfunction gc(a){function b(a){function b(a){return a==",
    "g?!0:0==X(a,\"display\").lastIndexOf(\"inline\",0)||\"absolute\"==c&&\"",
    "static\"==X(a,\"position\")?!1:!0}var c=X(a,\"position\");if(\"fixed\"=",
    "=c)return D=!0,a==g?null:g;for(a=cc(a);a&&!b(a);)a=cc(a);return a}funct",
    "ion c(a){var b=a;if(\"visible\"==u)if(a==g&&k)b=k;else if(a==k)return{x",
    ":\"visible\",y:\"visible\"};b={x:X(b,\"overflow-x\"),y:X(b,\"overflow-y",
    "\")};a==g&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"au",
    "to\":b.y);return b}function d(a){if(a==g){var b=(new za(f)).C;\na=b.scr",
    "ollingElement?b.scrollingElement:b.body||b.documentElement;b=b.parentWi",
    "ndow||b.defaultView;a=new x(b.pageXOffset||a.scrollLeft,b.pageYOffset||",
    "a.scrollTop)}else a=new x(a.scrollLeft,a.scrollTop);return a}var e=kc(a",
    ");var f=z(a),g=f.documentElement,k=f.body,u=X(g,\"overflow\"),D;for(a=b",
    "(a);a;a=b(a)){var r=c(a);if(\"visible\"!=r.x||\"visible\"!=r.y){var A=f",
    "c(a);if(0==A.width||0==A.height)return Y;var L=e.right<A.left,W=e.botto",
    "m<A.top;if(L&&\"hidden\"==r.x||W&&\"hidden\"==r.y)return Y;if(L&&\"visi",
    "ble\"!=r.x||\nW&&\"visible\"!=r.y){L=d(a);W=e.bottom<A.top-L.y;if(e.rig",
    "ht<A.left-L.x&&\"visible\"!=r.x||W&&\"visible\"!=r.x)return Y;e=gc(a);r",
    "eturn e==Y?Y:\"scroll\"}L=e.left>=A.left+A.width;A=e.top>=A.top+A.heigh",
    "t;if(L&&\"hidden\"==r.x||A&&\"hidden\"==r.y)return Y;if(L&&\"visible\"!",
    "=r.x||A&&\"visible\"!=r.y){if(D&&(r=d(a),e.left>=g.scrollWidth-r.x||e.r",
    "ight>=g.scrollHeight-r.y))return Y;e=gc(a);return e==Y?Y:\"scroll\"}}}r",
    "eturn\"none\"}\nfunction fc(a){var b=hc(a);if(b)return b.rect;if(C(a,\"",
    "HTML\"))return a=z(a),a=((a?a.parentWindow||a.defaultView:window)||wind",
    "ow).document,a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=",
    "new ya(a.clientWidth,a.clientHeight),new V(0,0,a.width,a.height);try{va",
    "r c=a.getBoundingClientRect()}catch(d){return new V(0,0,0,0)}return new",
    " V(c.left,c.top,c.right-c.left,c.bottom-c.top)}\nfunction hc(a){var b=C",
    "(a,\"MAP\");if(!b&&!C(a,\"AREA\"))return null;var c=b?a:C(a.parentNode,",
    "\"MAP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=U.A('/descendant",
    "::*[@usemap = \"#'+c.name+'\"]',z(c)))&&(e=fc(d),b||\"default\"==a.shap",
    "e.toLowerCase()||(a=lc(a),b=Math.min(Math.max(a.left,0),e.width),c=Math",
    ".min(Math.max(a.top,0),e.height),e=new V(b+e.left,c+e.top,Math.min(a.wi",
    "dth,e.width-b),Math.min(a.height,e.height-c))));return{ba:d,rect:e||new",
    " V(0,0,0,0)}}\nfunction lc(a){var b=a.shape.toLowerCase();a=a.coords.sp",
    "lit(\",\");if(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return new V(",
    "b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new V(a[",
    "0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c=a[1],",
    "d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=M",
    "ath.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new V(b,c,d-b,e-c)}return",
    " new V(0,0,0,0)}function kc(a){a=fc(a);return new ac(a.top,a.left+a.wid",
    "th,a.top+a.height,a.left)}\nfunction mc(a){return a.replace(/^[^\\S\\xa",
    "0]+|[^\\S\\xa0]+$/g,\"\")}function nc(a){var b=[];bc?oc(a,b):pc(a,b);va",
    "r c=b;a=c.length;for(var b=Array(a),c=m(c)?c.split(\"\"):c,d=0;d<a;d++)",
    "d in c&&(b[d]=mc.call(void 0,c[d]));return mc(b.join(\"\\n\")).replace(",
    "/\\xa0/g,\" \")}\nfunction qc(a,b,c){if(C(a,\"BR\"))b.push(\"\");else{v",
    "ar d=C(a,\"TD\"),e=X(a,\"display\"),f=!d&&!(0<=pa(rc,e)),g=l(a.previous",
    "ElementSibling)?a.previousElementSibling:Ca(a.previousSibling),g=g?X(g,",
    "\"display\"):\"\",k=X(a,\"float\")||X(a,\"cssFloat\")||X(a,\"styleFloat",
    "\");!f||\"run-in\"==g&&\"none\"==k||/^[\\s\\xa0]*$/.test(b[b.length-1]|",
    "|\"\")||b.push(\"\");var u=jc(a),D=null,r=null;u&&(D=X(a,\"white-space",
    "\"),r=X(a,\"text-transform\"));w(a.childNodes,function(a){c(a,b,u,D,r)}",
    ");a=b[b.length-1]||\"\";!d&&\"table-cell\"!=e||!a||ma(a)||(b[b.length-",
    "\n1]+=\" \");f&&\"run-in\"!=e&&!/^[\\s\\xa0]*$/.test(a)&&b.push(\"\")}}",
    "function pc(a,b){qc(a,b,function(a,b,e,f,g){3==a.nodeType&&e?sc(a,b,f,g",
    "):C(a)&&pc(a,b)})}var rc=\"inline inline-block inline-table none table-",
    "cell table-column table-column-group\".split(\" \");\nfunction sc(a,b,c",
    ",d){a=a.nodeValue.replace(/[\\u200b\\u200e\\u200f]/g,\"\");a=a.replace(",
    "/(\\r\\n|\\r|\\n)/g,\"\\n\");if(\"normal\"==c||\"nowrap\"==c)a=a.replac",
    "e(/\\n/g,\" \");a=\"pre\"==c||\"pre-wrap\"==c?a.replace(/[ \\f\\t\\v\\u",
    "2028\\u2029]/g,\"\\u00a0\"):a.replace(/[\\ \\f\\t\\v\\u2028\\u2029]+/g,",
    "\" \");\"capitalize\"==d?a=a.replace(/(^|\\s)(\\S)/g,function(a,b,c){re",
    "turn b+c.toUpperCase()}):\"uppercase\"==d?a=a.toUpperCase():\"lowercase",
    "\"==d&&(a=a.toLowerCase());c=b.pop()||\"\";ma(c)&&0==a.lastIndexOf(\" ",
    "\",0)&&(a=a.substr(1));b.push(c+a)}\nfunction ic(a){var b=1,c=X(a,\"opa",
    "city\");c&&(b=Number(c));(a=cc(a))&&(b*=ic(a));return b}\nfunction tc(a",
    ",b,c,d,e){var f;if(3==a.nodeType&&c)sc(a,b,d,e);else if(C(a))if(C(a,\"C",
    "ONTENT\")||C(a,\"SLOT\")){for(f=a;f.parentNode;)f=f.parentNode;f instan",
    "ceof ShadowRoot?(a=C(a,\"CONTENT\")?a.getDistributedNodes():a.assignedN",
    "odes(),w(a,function(a){tc(a,b,c,d,e)})):oc(a,b)}else if(C(a,\"SHADOW\")",
    "){for(f=a;f.parentNode;)f=f.parentNode;if(f instanceof ShadowRoot&&(a=f",
    "))for(a=a.olderShadowRoot;a;)w(a.childNodes,function(a){tc(a,b,c,d,e)})",
    ",a=a.olderShadowRoot}else oc(a,b)}\nfunction oc(a,b){a.shadowRoot&&w(a.",
    "shadowRoot.childNodes,function(a){tc(a,b,!0,null,null)});qc(a,b,functio",
    "n(a,b,e,f,g){var c=null;1==a.nodeType?c=a:3==a.nodeType&&(c=a);null!=c&",
    "&(null!=c.assignedSlot||c.getDestinationInsertionPoints&&0<c.getDestina",
    "tionInsertionPoints().length)||tc(a,b,e,f,g)})};var uc={K:function(a,b)",
    "{return!(!a.querySelectorAll||!a.querySelector)&&!/^\\d.*/.test(b)},A:f",
    "unction(a,b){var c=y(b),d=m(a)?c.C.getElementById(a):a;return d?Ra(d,\"",
    "id\")==a&&b!=d&&Da(b,d)?d:ua(B(c,\"*\"),function(c){return Ra(c,\"id\")",
    "==a&&b!=c&&Da(b,c)}):null},l:function(a,b){if(!a)return[];if(uc.K(b,a))",
    "try{return b.querySelectorAll(\"#\"+uc.na(a))}catch(c){return[]}b=B(y(b",
    "),\"*\",null,b);return qa(b,function(b){return Ra(b,\"id\")==a})},na:fu",
    "nction(a){return a.replace(/([\\s'\"\\\\#.:;,!?+<>=~*^$|%&@`{}\\-\\/\\[",
    "\\]\\(\\)])/g,\n\"\\\\$1\")}};var Z={},vc={};Z.ja=function(a,b,c){try{v",
    "ar d=Ka.l(\"a\",b)}catch(e){d=B(y(b),\"A\",null,b)}return ua(d,function",
    "(b){b=nc(b);b=b.replace(/^[\\s]+|[\\s]+$/g,\"\");return c&&-1!=b.indexO",
    "f(a)||b==a})};Z.ea=function(a,b,c){try{var d=Ka.l(\"a\",b)}catch(e){d=B",
    "(y(b),\"A\",null,b)}return qa(d,function(b){b=nc(b);b=b.replace(/^[\\s]",
    "+|[\\s]+$/g,\"\");return c&&-1!=b.indexOf(a)||b==a})};Z.A=function(a,b)",
    "{return Z.ja(a,b,!1)};Z.l=function(a,b){return Z.ea(a,b,!1)};vc.A=funct",
    "ion(a,b){return Z.ja(a,b,!0)};\nvc.l=function(a,b){return Z.ea(a,b,!0)}",
    ";var wc={A:function(a,b){if(\"\"===a)throw new t(32,'Unable to locate a",
    "n element with the tagName \"\"');return b.getElementsByTagName(a)[0]||",
    "null},l:function(a,b){if(\"\"===a)throw new t(32,'Unable to locate an e",
    "lement with the tagName \"\"');return b.getElementsByTagName(a)}};var x",
    "c={className:Ja,\"class name\":Ja,css:Ka,\"css selector\":Ka,id:uc,link",
    "Text:Z,\"link text\":Z,name:{A:function(a,b){b=B(y(b),\"*\",null,b);ret",
    "urn ua(b,function(b){return Ra(b,\"name\")==a})},l:function(a,b){b=B(y(",
    "b),\"*\",null,b);return qa(b,function(b){return Ra(b,\"name\")==a})}},p",
    "artialLinkText:vc,\"partial link text\":vc,tagName:wc,\"tag name\":wc,x",
    "path:U};ba(\"_\",function(a,b){a:{for(c in a)if(a.hasOwnProperty(c))bre",
    "ak a;var c=null}if(c){var d=xc[c];if(d&&p(d.l))return d.l(a[c],b||ja.do",
    "cument)}throw new t(61,\"Unsupported locator strategy: \"+c);});; retur",
    "n this._.apply(null,arguments);}.apply({navigator:typeof window!='undef",
    "ined'?window.navigator:null,document:typeof window!='undefined'?window.",
    "document:null}, arguments);}",
    NULL
};

const char* const GET_EFFECTIVE_STYLE[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof 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\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ga(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a){var b=m;function c(){}c.prototype=b.prototype;",
    "a.na=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=funct",
    "ion(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e",
    "++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function ha(a",
    "){return String(a).replace(/\\-([a-z])/g,function(a,c){return c.toUpper",
    "Case()})};function ia(a,b){if(h(a))return h(b)&&1==b.length?a.indexOf(b",
    ",0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1",
    "}function n(a,b){for(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)",
    "e in d&&b.call(void 0,d[e],e,a)}function p(a,b,c){var d=c;n(a,function(",
    "c,f){d=b.call(void 0,d,c,f,a)});return d}function q(a,b){for(var c=a.le",
    "ngth,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e",
    ",a))return!0;return!1}function ja(a){return Array.prototype.concat.appl",
    "y([],arguments)}\nfunction ka(a,b,c){return 2>=arguments.length?Array.p",
    "rototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var ma={ali",
    "ceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:\"#00ffff\",aquamarine",
    ":\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",bisque:\"#ffe4c4\",bla",
    "ck:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"#0000ff\",blueviolet:",
    "\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887\",cadetblue:\"#5f9ea0",
    "\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",coral:\"#ff7f50\",cornf",
    "lowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimson:\"#dc143c\",cyan:\"#",
    "00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkgoldenrod:\"#b88",
    "60b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\",\ndarkgrey:\"#a9a9a9\"",
    ",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolivegreen:\"#556b2f",
    "\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred:\"#8b0000\",da",
    "rksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateblue:\"#483d8b\"",
    ",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f4f\",darkturquoise:\"#0",
    "0ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deepskyblue:\"#00bf",
    "ff\",dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:\"#1e90ff\",fir",
    "ebrick:\"#b22222\",floralwhite:\"#fffaf0\",forestgreen:\"#228b22\",fuch",
    "sia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhite:\"#f8f8ff\",gold:\"#",
    "ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",green:\"#008000\",green",
    "yellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#f0fff0\",hotpink:\"#ff6",
    "9b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",ivory:\"#fffff0\",khaki:",
    "\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:\"#fff0f5\",lawngreen:\"",
    "#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"#add8e6\",lightcoral:\"#",
    "f08080\",lightcyan:\"#e0ffff\",lightgoldenrodyellow:\"#fafad2\",lightgr",
    "ay:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey:\"#d3d3d3\",lightpink:",
    "\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightseagreen:\"#20b2aa\",lightsk",
    "yblue:\"#87cefa\",lightslategray:\"#778899\",lightslategrey:\"#778899\"",
    ",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",lime:\"#00ff00\",li",
    "megreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff00ff\",maroon:\"#800",
    "000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#0000cd\",mediumorchid:",
    "\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagreen:\"#3cb371\",mediums",
    "lateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",mediumturquoise:\"#4",
    "8d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#191970\",mintcream:",
    "\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#ffe4b5\",navajowhite:\"",
    "#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",olive:\"#808000\",olived",
    "rab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#ff4500\",orchid:\"#da70",
    "d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb98\",paleturquoise:\"#a",
    "feeee\",palevioletred:\"#db7093\",papayawhip:\"#ffefd5\",peachpuff:\"#f",
    "fdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:",
    "\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",ro",
    "yalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"#fa8072\",sandybro",
    "wn:\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:\"#fff5ee\",sienna:\"#a0",
    "522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slateblue:\"#6a5acd\",sla",
    "tegray:\"#708090\",slategrey:\"#708090\",snow:\"#fffafa\",springgreen:",
    "\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal:\"#008080\",this",
    "tle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0\",violet:\"#ee82",
    "ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:",
    "\"#ffff00\",yellowgreen:\"#9acd32\"};var na=\"backgroundColor borderTop",
    "Color borderRightColor borderBottomColor borderLeftColor color outlineC",
    "olor\".split(\" \"),oa=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,pa=/^",
    "#(?:[0-9a-f]{3}){1,2}$/i,qa=/^(?:rgba)?\\((\\d{1,3}),\\s?(\\d{1,3}),\\s",
    "?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,ra=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),",
    "\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$/i;function sa(a,b){if(!",
    "a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);",
    "if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.co",
    "mpareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}",
    "\nfunction ta(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return",
    " a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNo",
    "de&&\"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.pare",
    "ntNode;return e==f?ua(a,b):!c&&sa(e,b)?-1*va(a,b):!d&&sa(f,a)?va(b,a):(",
    "c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.n",
    "odeType?a:a.ownerDocument||a.document;c=d.createRange();c.selectNode(a)",
    ";c.collapse(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);retu",
    "rn c.compareBoundaryPoints(aa.Range.START_TO_END,a)}function va(a,b){va",
    "r c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;",
    "return ua(b,a)}function ua(a,b){for(;b=b.previousSibling;)if(b==a)retur",
    "n-1;return 1};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs",
    ", Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby grante",
    "d, free of charge, to any person obtaining a copy\n of this software an",
    "d associated documentation files (the \"Software\"), to\n deal in the S",
    "oftware without restriction, including without limitation the\n rights ",
    "to use, copy, modify, merge, publish, distribute, sublicense, and/or\n ",
    "sell copies of the Software, and to permit persons to whom the Software",
    " is\n furnished to do so, subject to the following conditions:\n\n The ",
    "above copyright notice and this permission notice shall be included in",
    "\n all copies or substantial portions of the Software.\n\n THE SOFTWARE",
    " IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPL",
    "IED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n ",
    "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL",
    " THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR",
    " OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE",
    ", ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE ",
    "OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction r(a,b,c){this.l=a;th",
    "is.ka=b||1;this.j=c||1};function t(a){this.S=a;this.I=0}function wa(a){",
    "a=a.match(xa);for(var b=0;b<a.length;b++)ya.test(a[b])&&a.splice(b,1);r",
    "eturn new t(a)}var xa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9",
    "-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^",
    "\"]*\"|'[^']*'|[!<>]=|\\s+|./g,ya=/^\\s/;function u(a,b){return a.S[a.I",
    "+(b||0)]}t.prototype.next=function(){return this.S[this.I++]};t.prototy",
    "pe.back=function(){this.I--};t.prototype.empty=function(){return this.S",
    ".length<=this.I};function v(a){var b=null,c=a.nodeType;1==c&&(b=a.textC",
    "ontent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);",
    "if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.first",
    "Child;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[",
    "c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b",
    "=a.nodeValue;return\"\"+b}\nfunction x(a,b,c){if(null===b)return!0;try{",
    "if(!a.getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAtt",
    "ribute(b):a.getAttribute(b,2)==c}function y(a,b,c,d,e){return za.call(n",
    "ull,a,b,h(c)?c:null,h(d)?d:null,e||new z)}\nfunction za(a,b,c,d,e){b.ge",
    "tElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),n(b,function(",
    "b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?",
    "(b=b.getElementsByClassName(d),n(b,function(b){b.className==d&&a.matche",
    "s(b)&&e.add(b)})):a instanceof A?Aa(a,b,c,d,e):b.getElementsByTagName&&",
    "(b=b.getElementsByTagName(a.getName()),n(b,function(a){x(a,c,d)&&e.add(",
    "a)}));return e}function Aa(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibl",
    "ing)x(b,c,d)&&a.matches(b)&&e.add(b),Aa(a,b,c,d,e)};function z(){this.j",
    "=this.g=null;this.D=0}function Ba(a){this.node=a;this.next=this.w=null}",
    "function Ca(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(",
    "var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<ta(c.no",
    "de,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++",
    ";for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}z.pro",
    "totype.unshift=function(a){a=new Ba(a);a.next=this.g;this.j?this.g.w=a:",
    "this.g=this.j=a;this.g=a;this.D++};\nz.prototype.add=function(a){a=new ",
    "Ba(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++",
    "};function B(a){return(a=a.g)?a.node:null}z.prototype.m=function(){retu",
    "rn this.D};function C(a){return(a=B(a))?v(a):\"\"}z.prototype.iterator=",
    "function(a){return new Da(this,!!a)};function Da(a,b){this.ga=a;this.T=",
    "(this.A=b)?a.j:a.g;this.O=null}Da.prototype.next=function(){var a=this.",
    "T;if(null==a)return null;var b=this.O=a;this.T=this.A?a.w:a.next;return",
    " b.node};\nDa.prototype.remove=function(){var a=this.ga,b=this.O;if(!b)",
    "throw Error(\"Next must be called at least once before remove.\");var c",
    "=b.w,b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};functio",
    "n m(a){this.f=a;this.h=this.o=!1;this.F=null}function D(a){return\"\\n ",
    " \"+a.toString().split(\"\\n\").join(\"\\n  \")}m.prototype.c=function(",
    "){return this.o};function Ea(a,b){a.o=b}function Fa(a,b){a.h=b}m.protot",
    "ype.u=function(){return this.F};function E(a,b){a=a.evaluate(b);return ",
    "a instanceof z?+C(a):+a}function F(a,b){a=a.evaluate(b);return a instan",
    "ceof z?C(a):\"\"+a}function G(a,b){a=a.evaluate(b);return a instanceof ",
    "z?!!a.m():!!a};function H(a,b,c){m.call(this,a.f);this.R=a;this.W=b;thi",
    "s.aa=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.R==Ga&&(c.h||c.c()||4==",
    "c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c",
    ".u().name,C:b}):this.F={name:b.u().name,C:c})}k(H);\nfunction I(a,b,c,d",
    ",e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof z&&c instance",
    "of z){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e",
    ".next();f;f=e.next())if(a(v(d),v(f)))return!0;return!1}if(b instanceof ",
    "z||c instanceof z){b instanceof z?(e=b,d=c):(e=c,d=b);f=e.iterator();fo",
    "r(var g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l=+",
    "v(l);break;case \"boolean\":l=!!v(l);break;case \"string\":l=v(l);break",
    ";default:throw Error(\"Illegal primitive type for comparison.\");\n}if(",
    "e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==type",
    "of b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"",
    "==typeof c?a(+b,+c):a(b,c):a(+b,+c)}H.prototype.evaluate=function(a){re",
    "turn this.R.v(this.W,this.aa,a)};H.prototype.toString=function(){var a=",
    "\"Binary Expression: \"+this.R,a=a+D(this.W);return a+=D(this.aa)};func",
    "tion Ha(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}Ha.prototype.toSt",
    "ring=function(){return this.ja};var Ia={};\nfunction J(a,b,c,d){if(Ia.h",
    "asOwnProperty(a))throw Error(\"Binary operator already created: \"+a);a",
    "=new Ha(a,b,c,d);return Ia[a.toString()]=a}J(\"div\",6,1,function(a,b,c",
    "){return E(a,c)/E(b,c)});J(\"mod\",6,1,function(a,b,c){return E(a,c)%E(",
    "b,c)});J(\"*\",6,1,function(a,b,c){return E(a,c)*E(b,c)});J(\"+\",5,1,f",
    "unction(a,b,c){return E(a,c)+E(b,c)});J(\"-\",5,1,function(a,b,c){retur",
    "n E(a,c)-E(b,c)});J(\"<\",4,2,function(a,b,c){return I(function(a,b){re",
    "turn a<b},a,b,c)});\nJ(\">\",4,2,function(a,b,c){return I(function(a,b)",
    "{return a>b},a,b,c)});J(\"<=\",4,2,function(a,b,c){return I(function(a,",
    "b){return a<=b},a,b,c)});J(\">=\",4,2,function(a,b,c){return I(function",
    "(a,b){return a>=b},a,b,c)});var Ga=J(\"=\",3,2,function(a,b,c){return I",
    "(function(a,b){return a==b},a,b,c,!0)});J(\"!=\",3,2,function(a,b,c){re",
    "turn I(function(a,b){return a!=b},a,b,c,!0)});J(\"and\",2,2,function(a,",
    "b,c){return G(a,c)&&G(b,c)});J(\"or\",1,2,function(a,b,c){return G(a,c)",
    "||G(b,c)});function K(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expre",
    "ssion must evaluate to nodeset if filter has predicate(s).\");m.call(th",
    "is,a.f);this.$=a;this.b=b;this.o=a.c();this.h=a.h}k(K);K.prototype.eval",
    "uate=function(a){a=this.$.evaluate(a);return Ja(this.b,a)};K.prototype.",
    "toString=function(){var a=\"Filter:\"+D(this.$);return a+=D(this.b)};fu",
    "nction L(a,b){if(b.length<a.Y)throw Error(\"Function \"+a.i+\" expects ",
    "at least\"+a.Y+\" arguments, \"+b.length+\" given\");if(null!==a.P&&b.l",
    "ength>a.P)throw Error(\"Function \"+a.i+\" expects at most \"+a.P+\" ar",
    "guments, \"+b.length+\" given\");a.ha&&n(b,function(b,d){if(4!=b.f)thro",
    "w Error(\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset",
    ": \"+b);});m.call(this,a.f);this.H=a;this.M=b;Ea(this,a.o||q(b,function",
    "(a){return a.c()}));Fa(this,a.fa&&!b.length||a.ea&&!!b.length||q(b,func",
    "tion(a){return a.h}))}k(L);\nL.prototype.evaluate=function(a){return th",
    "is.H.v.apply(null,ja(a,this.M))};L.prototype.toString=function(){var a=",
    "\"Function: \"+this.H;if(this.M.length)var b=p(this.M,function(a,b){ret",
    "urn a+D(b)},\"Arguments:\"),a=a+D(b);return a};function Ka(a,b,c,d,e,f,",
    "g,l,w){this.i=a;this.f=b;this.o=c;this.fa=d;this.ea=e;this.v=f;this.Y=g",
    ";this.P=void 0!==l?l:g;this.ha=!!w}Ka.prototype.toString=function(){ret",
    "urn this.i};var La={};\nfunction M(a,b,c,d,e,f,g,l){if(La.hasOwnPropert",
    "y(a))throw Error(\"Function already created: \"+a+\".\");La[a]=new Ka(a",
    ",b,c,d,!1,e,f,g,l)}M(\"boolean\",2,!1,!1,function(a,b){return G(b,a)},1",
    ");M(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(E(b,a))},1);M(\"",
    "concat\",3,!1,!1,function(a,b){return p(ka(arguments,1),function(b,d){r",
    "eturn b+F(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c){b",
    "=F(b,a);a=F(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,functio",
    "n(a,b){return b.evaluate(a).m()},1,1,!0);\nM(\"false\",2,!1,!1,function",
    "(){return!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(E(b",
    ",a))},1);M(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.o",
    "wnerDocument;a=F(b,a).split(/\\s+/);var e=[];n(a,function(a){a=d.getEle",
    "mentById(a);!a||0<=ia(e,a)||e.push(a)});e.sort(ta);var f=new z;n(e,func",
    "tion(a){f.add(a)});return f},1);M(\"lang\",2,!1,!1,function(){return!1}",
    ",1);M(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw Error(",
    "\"Function last expects ()\");return a.j},0);\nM(\"local-name\",3,!1,!0",
    ",function(a,b){return(a=b?B(b.evaluate(a)):a.l)?a.localName||a.nodeName",
    ".toLowerCase():\"\"},0,1,!0);M(\"name\",3,!1,!0,function(a,b){return(a=",
    "b?B(b.evaluate(a)):a.l)?a.nodeName.toLowerCase():\"\"},0,1,!0);M(\"name",
    "space-uri\",3,!0,!1,function(){return\"\"},0,1,!0);M(\"normalize-space",
    "\",3,!1,!0,function(a,b){return(b?F(b,a):v(a.l)).replace(/[\\s\\xa0]+/g",
    ",\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);M(\"not\",2,!1,!1,function(a",
    ",b){return!G(b,a)},1);\nM(\"number\",1,!1,!0,function(a,b){return b?E(b",
    ",a):+v(a.l)},0,1);M(\"position\",1,!0,!1,function(a){return a.ka},0);M(",
    "\"round\",1,!1,!1,function(a,b){return Math.round(E(b,a))},1);M(\"start",
    "s-with\",2,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);return 0==b.lastInde",
    "xOf(a,0)},2);M(\"string\",3,!1,!0,function(a,b){return b?F(b,a):v(a.l)}",
    ",0,1);M(\"string-length\",1,!1,!0,function(a,b){return(b?F(b,a):v(a.l))",
    ".length},0,1);\nM(\"substring\",3,!1,!1,function(a,b,c,d){c=E(c,a);if(i",
    "sNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?E(d,a):Infinity;if(is",
    "NaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);",
    "a=F(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d",
    "))},2,3);M(\"substring-after\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a",
    ");c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nM(\"sub",
    "string-before\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);a=b.indexOf(a",
    ");return-1==a?\"\":b.substring(0,a)},2);M(\"sum\",1,!1,!1,function(a,b)",
    "{a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+v(c",
    ");return b},1,1,!0);M(\"translate\",3,!1,!1,function(a,b,c,d){b=F(b,a);",
    "c=F(c,a);var e=F(d,a);d={};for(var f=0;f<c.length;f++)a=c.charAt(f),a i",
    "n d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=",
    "a in d?d[a]:a;return c},3);M(\"true\",2,!1,!1,function(){return!0},0);f",
    "unction A(a,b){this.ca=a;this.X=void 0!==b?b:null;this.B=null;switch(a)",
    "{case \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"pr",
    "ocessing-instruction\":this.B=7;break;case \"node\":break;default:throw",
    " Error(\"Unexpected argument\");}}function Ma(a){return\"comment\"==a||",
    "\"text\"==a||\"processing-instruction\"==a||\"node\"==a}A.prototype.mat",
    "ches=function(a){return null===this.B||this.B==a.nodeType};A.prototype.",
    "getName=function(){return this.ca};\nA.prototype.toString=function(){va",
    "r a=\"Kind Test: \"+this.ca;null===this.X||(a+=D(this.X));return a};fun",
    "ction N(a){m.call(this,3);this.ba=a.substring(1,a.length-1)}k(N);N.prot",
    "otype.evaluate=function(){return this.ba};N.prototype.toString=function",
    "(){return\"Literal: \"+this.ba};function O(a,b){this.i=a.toLowerCase();",
    "a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";this.J=b?b.toLow",
    "erCase():a}O.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!",
    "=b)return!1;b=void 0!==a.localName?a.localName:a.nodeName;return\"*\"!=",
    "this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.J?!0:this.J==(a.namespac",
    "eURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};O.",
    "prototype.getName=function(){return this.i};\nO.prototype.toString=func",
    "tion(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.J?",
    "\"\":this.J+\":\")+this.i};function P(a){m.call(this,1);this.da=a}k(P);",
    "P.prototype.evaluate=function(){return this.da};P.prototype.toString=fu",
    "nction(){return\"Number: \"+this.da};function Q(a,b){m.call(this,a.f);t",
    "his.V=a;this.G=b;this.o=a.c();this.h=a.h;1==this.G.length&&(a=this.G[0]",
    ",a.N||a.s!=Na||(a=a.L,\"*\"!=a.getName()&&(this.F={name:a.getName(),C:n",
    "ull})))}k(Q);function R(){m.call(this,4)}k(R);R.prototype.evaluate=func",
    "tion(a){var b=new z;a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocument)",
    ";return b};R.prototype.toString=function(){return\"Root Helper Expressi",
    "on\"};function S(){m.call(this,4)}k(S);S.prototype.evaluate=function(a)",
    "{var b=new z;b.add(a.l);return b};\nS.prototype.toString=function(){ret",
    "urn\"Context Helper Expression\"};function Oa(a){return\"/\"==a||\"//\"",
    "==a}\nQ.prototype.evaluate=function(a){var b=this.V.evaluate(a);if(!(b ",
    "instanceof z))throw Error(\"Filter expression must evaluate to nodeset.",
    "\");a=this.G;for(var c=0,d=a.length;c<d&&b.m();c++){var e=a[c],f=b.iter",
    "ator(e.s.A);if(e.c()||e.s!=Pa)if(e.c()||e.s!=Qa){var g=f.next();for(b=e",
    ".evaluate(new r(g));null!=(g=f.next());)g=e.evaluate(new r(g)),b=Ca(b,g",
    ")}else g=f.next(),b=e.evaluate(new r(g));else{for(g=f.next();(b=f.next(",
    "))&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8;g=b);b",
    "=e.evaluate(new r(g))}}return b};\nQ.prototype.toString=function(){var ",
    "a=\"Path Expression:\"+D(this.V);if(this.G.length){var b=p(this.G,funct",
    "ion(a,b){return a+D(b)},\"Steps:\");a+=D(b)}return a};function T(a,b){t",
    "his.b=a;this.A=!!b}function Ja(a,b,c){for(c=c||0;c<a.b.length;c++)for(v",
    "ar d=a.b[c],e=b.iterator(),f=b.m(),g,l=0;g=e.next();l++){var w=a.A?f-l:",
    "l+1;g=d.evaluate(new r(g,w,f));if(\"number\"==typeof g)w=w==g;else if(",
    "\"string\"==typeof g||\"boolean\"==typeof g)w=!!g;else if(g instanceof ",
    "z)w=0<g.m();else throw Error(\"Predicate.evaluate returned an unexpecte",
    "d type.\");w||e.remove()}return b}T.prototype.u=function(){return 0<thi",
    "s.b.length?this.b[0].u():null};\nT.prototype.c=function(){for(var a=0;a",
    "<this.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}r",
    "eturn!1};T.prototype.m=function(){return this.b.length};T.prototype.toS",
    "tring=function(){return p(this.b,function(a,b){return a+D(b)},\"Predica",
    "tes:\")};function U(a,b,c,d){m.call(this,4);this.s=a;this.L=b;this.b=c|",
    "|new T([]);this.N=!!d;b=this.b.u();a.la&&b&&(this.F={name:b.name,C:b.C}",
    ");this.o=this.b.c()}k(U);\nU.prototype.evaluate=function(a){var b=a.l,c",
    "=this.u(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?F(c.C,a):null,f=1);if(th",
    "is.N)if(this.c()||this.s!=Ra)if(b=(new U(Sa,new A(\"node\"))).evaluate(",
    "a).iterator(),c=b.next())for(a=this.v(c,d,e,f);null!=(c=b.next());)a=Ca",
    "(a,this.v(c,d,e,f));else a=new z;else a=y(this.L,b,d,e),a=Ja(this.b,a,f",
    ");else a=this.v(a.l,d,e,f);return a};U.prototype.v=function(a,b,c,d){a=",
    "this.s.H(this.L,a,b,c);return a=Ja(this.b,a,d)};\nU.prototype.toString=",
    "function(){var a=\"Step:\"+D(\"Operator: \"+(this.N?\"//\":\"/\"));this",
    ".s.i&&(a+=D(\"Axis: \"+this.s));a+=D(this.L);if(this.b.m()){var b=p(thi",
    "s.b.b,function(a,b){return a+D(b)},\"Predicates:\");a+=D(b)}return a};f",
    "unction Ta(a,b,c,d){this.i=a;this.H=b;this.A=c;this.la=d}Ta.prototype.t",
    "oString=function(){return this.i};var Ua={};function V(a,b,c,d){if(Ua.h",
    "asOwnProperty(a))throw Error(\"Axis already created: \"+a);b=new Ta(a,b",
    ",c,!!d);return Ua[a]=b}\nV(\"ancestor\",function(a,b){for(var c=new z;b",
    "=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);V(\"ancestor-or",
    "-self\",function(a,b){var c=new z;do a.matches(b)&&c.unshift(b);while(b",
    "=b.parentNode);return c},!0);\nvar Na=V(\"attribute\",function(a,b){var",
    " c=new z,d=a.getName();if(b=b.attributes)if(a instanceof A&&null===a.B|",
    "|\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(",
    "a);return c},!1),Ra=V(\"child\",function(a,b,c,d,e){c=h(c)?c:null;d=h(d",
    ")?d:null;e=e||new z;for(b=b.firstChild;b;b=b.nextSibling)x(b,c,d)&&a.ma",
    "tches(b)&&e.add(b);return e},!1,!0);V(\"descendant\",y,!1,!0);\nvar Sa=",
    "V(\"descendant-or-self\",function(a,b,c,d){var e=new z;x(b,c,d)&&a.matc",
    "hes(b)&&e.add(b);return y(a,b,c,d,e)},!1,!0),Pa=V(\"following\",functio",
    "n(a,b,c,d){var e=new z;do for(var f=b;f=f.nextSibling;)x(f,c,d)&&a.matc",
    "hes(f)&&e.add(f),e=y(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);",
    "V(\"following-sibling\",function(a,b){for(var c=new z;b=b.nextSibling;)",
    "a.matches(b)&&c.add(b);return c},!1);V(\"namespace\",function(){return ",
    "new z},!1);\nvar Va=V(\"parent\",function(a,b){var c=new z;if(9==b.node",
    "Type)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.paren",
    "tNode;a.matches(b)&&c.add(b);return c},!1),Qa=V(\"preceding\",function(",
    "a,b,c,d){var e=new z,f=[];do f.unshift(b);while(b=b.parentNode);for(var",
    " g=1,l=f.length;g<l;g++){var w=[];for(b=f[g];b=b.previousSibling;)w.uns",
    "hift(b);for(var la=0,ib=w.length;la<ib;la++)b=w[la],x(b,c,d)&&a.matches",
    "(b)&&e.add(b),e=y(a,b,c,d,e)}return e},!0,!0);\nV(\"preceding-sibling\"",
    ",function(a,b){for(var c=new z;b=b.previousSibling;)a.matches(b)&&c.uns",
    "hift(b);return c},!0);var Wa=V(\"self\",function(a,b){var c=new z;a.mat",
    "ches(b)&&c.add(b);return c},!1);function W(a){m.call(this,1);this.U=a;t",
    "his.o=a.c();this.h=a.h}k(W);W.prototype.evaluate=function(a){return-E(t",
    "his.U,a)};W.prototype.toString=function(){return\"Unary Expression: -\"",
    "+D(this.U)};function X(a){m.call(this,4);this.K=a;Ea(this,q(this.K,func",
    "tion(a){return a.c()}));Fa(this,q(this.K,function(a){return a.h}))}k(X)",
    ";X.prototype.evaluate=function(a){var b=new z;n(this.K,function(c){c=c.",
    "evaluate(a);if(!(c instanceof z))throw Error(\"Path expression must eva",
    "luate to NodeSet.\");b=Ca(b,c)});return b};X.prototype.toString=functio",
    "n(){return p(this.K,function(a,b){return a+D(b)},\"Union Expression:\")",
    "};function Xa(a,b){this.a=a;this.ia=b}function Ya(a){for(var b,c=[];;){",
    "Y(a,\"Missing right hand side of binary expression.\");b=Za(a);var d=a.",
    "a.next();if(!d)break;var e=(d=Ia[d]||null)&&d.Z;if(!e){a.a.back();break",
    "}for(;c.length&&e<=c[c.length-1].Z;)b=new H(c.pop(),c.pop(),b);c.push(b",
    ",d)}for(;c.length;)b=new H(c.pop(),c.pop(),b);return b}function Y(a,b){",
    "if(a.a.empty())throw Error(b);}function $a(a,b){a=a.a.next();if(a!=b)th",
    "row Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction ab(a){a",
    "=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function bb(a){",
    "a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\");ret",
    "urn new N(a)}\nfunction cb(a){var b=[];if(Oa(u(a.a))){var c=a.a.next();",
    "var d=u(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&",
    "\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new R;d=new R;Y(a,\"Missing",
    " next location step.\");c=db(a,c);b.push(c)}else{a:{c=u(a.a);d=c.charAt",
    "(0);switch(d){case \"$\":throw Error(\"Variable reference not allowed i",
    "n HTML XPath\");case \"(\":a.a.next();c=Ya(a);Y(a,'unclosed \"(\"');$a(",
    "a,\")\");break;case '\"':case \"'\":c=bb(a);break;default:if(isNaN(+c))",
    "if(!Ma(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==u(a.a,\n1)){c=a.a.next();c=",
    "La[c]||null;a.a.next();for(d=[];\")\"!=u(a.a);){Y(a,\"Missing function ",
    "argument list.\");d.push(Ya(a));if(\",\"!=u(a.a))break;a.a.next()}Y(a,",
    "\"Unclosed function argument list.\");ab(a);c=new L(c,d)}else{c=null;br",
    "eak a}else c=new P(+a.a.next())}\"[\"==u(a.a)&&(d=new T(eb(a)),c=new K(",
    "c,d))}if(c)if(Oa(u(a.a)))d=c;else return c;else c=db(a,\"/\"),d=new S,b",
    ".push(c)}for(;Oa(u(a.a));)c=a.a.next(),Y(a,\"Missing next location step",
    ".\"),c=db(a,c),b.push(c);return new Q(d,b)}\nfunction db(a,b){if(\"/\"!",
    "=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"",
    "==u(a.a)){var c=new U(Wa,new A(\"node\"));a.a.next();return c}if(\"..\"",
    "==u(a.a))return c=new U(Va,new A(\"node\")),a.a.next(),c;if(\"@\"==u(a.",
    "a)){var d=Na;a.a.next();Y(a,\"Missing attribute name\")}else if(\"::\"=",
    "=u(a.a,1)){if(!/(?![0-9])[\\w]/.test(u(a.a).charAt(0)))throw Error(\"Ba",
    "d token: \"+a.a.next());var e=a.a.next();d=Ua[e]||null;if(!d)throw Erro",
    "r(\"No axis with name: \"+e);a.a.next();Y(a,\"Missing node name\")}else",
    " d=Ra;e=\nu(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==u(a",
    ".a,1)){if(!Ma(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if",
    "(!Ma(e))throw Error(\"Invalid type name: \"+e);$a(a,\"(\");Y(a,\"Bad no",
    "detype\");var f=u(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=bb(a);Y(",
    "a,\"Bad nodetype\");ab(a);e=new A(e,g)}else if(e=a.a.next(),f=e.indexOf",
    "(\":\"),-1==f)e=new O(e);else{var g=e.substring(0,f);if(\"*\"==g)var l=",
    "\"*\";else if(l=a.ia(g),!l)throw Error(\"Namespace prefix not declared:",
    " \"+g);e=e.substr(f+1);e=new O(e,l)}else throw Error(\"Bad token: \"+\n",
    "a.a.next());a=new T(eb(a),d.A);return c||new U(d,e,a,\"//\"==b)}functio",
    "n eb(a){for(var b=[];\"[\"==u(a.a);){a.a.next();Y(a,\"Missing predicate",
    " expression.\");var c=Ya(a);b.push(c);Y(a,\"Unclosed predicate expressi",
    "on.\");$a(a,\"]\")}return b}function Za(a){if(\"-\"==u(a.a))return a.a.",
    "next(),new W(Za(a));var b=cb(a);if(\"|\"!=u(a.a))a=b;else{for(b=[b];\"|",
    "\"==a.a.next();)Y(a,\"Missing next union location path.\"),b.push(cb(a)",
    ");a.a.back();a=new X(b)}return a};function fb(a){switch(a.nodeType){cas",
    "e 1:return ga(gb,a);case 9:return fb(a.documentElement);case 11:case 10",
    ":case 6:case 12:return hb;default:return a.parentNode?fb(a.parentNode):",
    "hb}}function hb(){return null}function gb(a,b){if(a.prefix==b)return a.",
    "namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNode",
    "(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.p",
    "arentNode.nodeType?gb(a.parentNode,b):null};function jb(a,b){if(!a.leng",
    "th)throw Error(\"Empty XPath expression.\");a=wa(a);if(a.empty())throw ",
    "Error(\"Invalid XPath expression.\");b?\"function\"==ca(b)||(b=fa(b.loo",
    "kupNamespaceURI,b)):b=function(){return null};var c=Ya(new Xa(a,b));if(",
    "!a.empty())throw Error(\"Bad token: \"+a.next());this.evaluate=function",
    "(a,b){a=c.evaluate(new r(a));return new Z(a,b)}}\nfunction Z(a,b){if(0=",
    "=b)if(a instanceof z)b=4;else if(\"string\"==typeof a)b=2;else if(\"num",
    "ber\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Error(",
    "\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof ",
    "z))throw Error(\"value could not be converted to the specified type\");",
    "this.resultType=b;switch(b){case 2:this.stringValue=a instanceof z?C(a)",
    ":\"\"+a;break;case 1:this.numberValue=a instanceof z?+C(a):+a;break;cas",
    "e 3:this.booleanValue=a instanceof z?0<a.m():!!a;break;case 4:case 5:ca",
    "se 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.next",
    "())d.push(e);this.snapshotLength=a.m();this.invalidIteratorState=!1;bre",
    "ak;case 8:case 9:this.singleNodeValue=B(a);break;default:throw Error(\"",
    "Unknown XPathResult type.\");}var f=0;this.iterateNext=function(){if(4!",
    "=b&&5!=b)throw Error(\"iterateNext called with wrong result type\");ret",
    "urn f>=d.length?null:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=",
    "b)throw Error(\"snapshotItem called with wrong result type\");return a>",
    "=d.length||0>a?null:d[a]}}\nZ.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=",
    "2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITER",
    "ATOR_TYPE=5;Z.UNORDERED_NODE_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TY",
    "PE=7;Z.ANY_UNORDERED_NODE_TYPE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function k",
    "b(a){this.lookupNamespaceURI=fb(a)}\nba(\"wgxpath.install\",function(a,",
    "b){a=a||aa;var c=a.Document&&a.Document.prototype||a.document;if(!c.eva",
    "luate||b)a.XPathResult=Z,c.evaluate=function(a,b,c,g){return(new jb(a,c",
    ")).evaluate(b,g)},c.createExpression=function(a,b){return new jb(a,b)},",
    "c.createNSResolver=function(a){return new kb(a)}});function lb(a,b){var",
    " c=a.currentStyle||a.style,d=c[b];void 0===d&&\"function\"==ca(c.getPro",
    "pertyValue)&&(d=c.getPropertyValue(b));if(\"inherit\"!=d)return void 0!",
    "==d?d:null;var e;for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11",
    "!=a.nodeType;)a=a.parentNode;e&&\"string\"!==typeof e&&(e=e.toString())",
    ";return(e=!a||1!=a.nodeType||e&&a.tagName.toUpperCase()!=e?null:a)?lb(e",
    ",b):null};ba(\"_\",function(a,b){b=ha(b);if(\"float\"==b||\"cssFloat\"=",
    "=b||\"styleFloat\"==b)b=\"cssFloat\";a:{var c=b;var d=9==a.nodeType?a:a",
    ".ownerDocument||a.document;if(d.defaultView&&d.defaultView.getComputedS",
    "tyle&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getProperty",
    "Value(c)||\"\";break a}c=\"\"}a=c||lb(a,b);if(null===a)a=null;else if(0",
    "<=ia(na,b)){b:{var e=a.match(qa);if(e&&(b=Number(e[1]),c=Number(e[2]),d",
    "=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&",
    "0<=e&&1>=e)){b=[b,c,d,e];break b}b=\nnull}if(!b)b:{if(d=a.match(ra))if(",
    "b=Number(d[1]),c=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c",
    "&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c",
    "=ma[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length",
    "&&(c=c.replace(oa,\"#$1$1$2$2$3$3\")),!pa.test(c))){b=null;break b}b=[p",
    "arseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(",
    "5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return a});; return th",
    "is._.apply(null,arguments);}.apply({navigator:typeof window!='undefined",
    "'?window.navigator:null,document:typeof window!='undefined'?window.docu",
    "ment:null}, arguments);}",
    NULL
};

const char* const GET_LOCATION[] = {
    "function(){return function(){var d,h=this;\nfunction k(a){var b=typeof ",
    "a;if(\"object\"==b)if(a){if(a instanceof Array)return\"array\";if(a ins",
    "tanceof Object)return b;var e=Object.prototype.toString.call(a);if(\"[o",
    "bject Window]\"==e)return\"object\";if(\"[object Array]\"==e||\"number",
    "\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typ",
    "eof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\"))return",
    "\"array\";if(\"[object Function]\"==e||\"undefined\"!=typeof a.call&&\"",
    "undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"c",
    "all\"))return\"function\"}else return\"null\";else if(\"function\"==\nb",
    "&&\"undefined\"==typeof a.call)return\"object\";return b}function l(a){",
    "var b=k(a);return\"array\"==b||\"object\"==b&&\"number\"==typeof a.leng",
    "th}function m(a){var b=typeof a;return\"object\"==b&&null!=a||\"functio",
    "n\"==b};var n;function q(a,b){for(var e=a.length,c=\"string\"==typeof a",
    "?a.split(\"\"):a,g=0;g<e;g++)g in c&&b.call(void 0,c[g],g,a)}function r",
    "(a){var b=a.length;if(0<b){for(var e=Array(b),c=0;c<b;c++)e[c]=a[c];ret",
    "urn e}return[]};function t(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b",
    "?b:0}d=t.prototype;d.clone=function(){return new t(this.x,this.y)};d.to",
    "String=function(){return\"(\"+this.x+\", \"+this.y+\")\"};d.ceil=functi",
    "on(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};d.f",
    "loor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);ret",
    "urn this};d.round=function(){this.x=Math.round(this.x);this.y=Math.roun",
    "d(this.y);return this};\nd.translate=function(a,b){a instanceof t?(this",
    ".x+=a.x,this.y+=a.y):(this.x+=Number(a),\"number\"==typeof b&&(this.y+=",
    "b));return this};d.scale=function(a,b){this.x*=a;this.y*=\"number\"==ty",
    "peof b?b:a;return this};function u(a,b,e){function c(c){c&&b.appendChil",
    "d(\"string\"==typeof c?a.createTextNode(c):c)}for(var g=1;g<e.length;g+",
    "+){var f=e[g];if(!l(f)||m(f)&&0<f.nodeType)c(f);else{a:{if(f&&\"number",
    "\"==typeof f.length){if(m(f)){var p=\"function\"==typeof f.item||\"stri",
    "ng\"==typeof f.item;break a}if(\"function\"==k(f)){p=\"function\"==type",
    "of f.item;break a}}p=!1}q(p?r(f):f,c)}}}function v(a){return 9==a.nodeT",
    "ype?a:a.ownerDocument||a.document}function w(a){this.a=a||h.document||d",
    "ocument}d=w.prototype;\nd.getElementsByTagName=function(a,b){return(b||",
    "this.a).getElementsByTagName(String(a))};d.createElement=function(a){re",
    "turn this.a.createElement(String(a))};d.createTextNode=function(a){retu",
    "rn this.a.createTextNode(String(a))};d.appendChild=function(a,b){a.appe",
    "ndChild(b)};d.append=function(a,b){u(v(a),a,arguments)};d.canHaveChildr",
    "en=function(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPLE",
    "T\":case \"AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAND",
    "\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT",
    "\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case ",
    "\"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PAR",
    "AM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case",
    " \"WBR\":return!1}return!0};\nd.removeNode=function(a){return a&&a.pare",
    "ntNode?a.parentNode.removeChild(a):null};d.contains=function(a,b){if(!a",
    "||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);i",
    "f(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.com",
    "pareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a};f",
    "unction x(a){var b=v(a),e=new t(0,0);if(a==(b?v(b):document).documentEl",
    "ement)return e;a:{try{var c=a.getBoundingClientRect()}catch(g){a={left:",
    "0,top:0,right:0,bottom:0};break a}a=c}c=(b?new w(v(b)):n||(n=new w)).a;",
    "b=c.scrollingElement?c.scrollingElement:c.body||c.documentElement;c=c.p",
    "arentWindow||c.defaultView;b=new t(c.pageXOffset||b.scrollLeft,c.pageYO",
    "ffset||b.scrollTop);e.x=a.left+b.x;e.y=a.top+b.y;return e}var y=[\"_\"]",
    ",z=h;y[0]in z||!z.execScript||z.execScript(\"var \"+y[0]);\nfor(var A;y",
    ".length&&(A=y.shift());)y.length||void 0===x?z=z[A]&&z[A]!==Object.prot",
    "otype[A]?z[A]:z[A]={}:z[A]=x;; return this._.apply(null,arguments);}.ap",
    "ply({navigator:typeof window!='undefined'?window.navigator:null,documen",
    "t:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SIZE[] = {
    "function(){return function(){function c(a,b){this.width=a;this.height=b",
    "}c.prototype.clone=function(){return new c(this.width,this.height)};c.p",
    "rototype.toString=function(){return\"(\"+this.width+\" x \"+this.height",
    "+\")\"};c.prototype.ceil=function(){this.width=Math.ceil(this.width);th",
    "is.height=Math.ceil(this.height);return this};c.prototype.floor=functio",
    "n(){this.width=Math.floor(this.width);this.height=Math.floor(this.heigh",
    "t);return this};\nc.prototype.round=function(){this.width=Math.round(th",
    "is.width);this.height=Math.round(this.height);return this};c.prototype.",
    "scale=function(a,b){this.width*=a;this.height*=\"number\"==typeof b?b:a",
    ";return this};function d(a){var b=a.offsetWidth,g=a.offsetHeight;if((vo",
    "id 0===b||!b&&!g)&&a.getBoundingClientRect){a:{try{var h=a.getBoundingC",
    "lientRect()}catch(l){a={left:0,top:0,right:0,bottom:0};break a}a=h}retu",
    "rn new c(a.right-a.left,a.bottom-a.top)}return new c(b,g)};function e(a",
    "){b:{var b=9==a.nodeType?a:a.ownerDocument||a.document;if(b.defaultView",
    "&&b.defaultView.getComputedStyle&&(b=b.defaultView.getComputedStyle(a,n",
    "ull))){b=b.display||b.getPropertyValue(\"display\")||\"\";break b}b=\"",
    "\"}if(\"none\"!=(b||(a.currentStyle?a.currentStyle.display:null)||a.sty",
    "le&&a.style.display))a=d(a);else{b=a.style;var g=b.display,h=b.visibili",
    "ty,l=b.position;b.visibility=\"hidden\";b.position=\"absolute\";b.displ",
    "ay=\"inline\";a=d(a);b.display=g;b.position=l;b.visibility=h}return a}",
    "\nvar f=[\"_\"],k=this;f[0]in k||!k.execScript||k.execScript(\"var \"+f",
    "[0]);for(var m;f.length&&(m=f.shift());)f.length||void 0===e?k=k[m]&&k[",
    "m]!==Object.prototype[m]?k[m]:k[m]={}:k[m]=e;; return this._.apply(null",
    ",arguments);}.apply({navigator:typeof window!='undefined'?window.naviga",
    "tor:null,document:typeof window!='undefined'?window.document:null}, arg",
    "uments);}",
    NULL
};

const char* const IS_DISPLAYED[] = {
    "function(){return function(){var h,aa=this;function k(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){var b=typeof a;retu",
    "rn\"object\"==b&&null!=a||\"function\"==b}function fa(a,b,c){return a.c",
    "all.apply(a.bind,arguments)}\nfunction ga(a,b,c){if(!a)throw Error();if",
    "(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);retu",
    "rn function(){var c=Array.prototype.slice.call(arguments);Array.prototy",
    "pe.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.a",
    "pply(b,arguments)}}function ha(a,b,c){ha=Function.prototype.bind&&-1!=F",
    "unction.prototype.bind.toString().indexOf(\"native code\")?fa:ga;return",
    " ha.apply(null,arguments)}\nfunction ia(a,b){var c=Array.prototype.slic",
    "e.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,ar",
    "guments);return a.apply(this,b)}}function p(a,b){function c(){}c.protot",
    "ype=b.prototype;a.pa=b.prototype;a.prototype=new c;a.prototype.construc",
    "tor=a;a.oa=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<ar",
    "guments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)",
    "}};function ja(a){return String(a).replace(/\\-([a-z])/g,function(a,c){",
    "return c.toUpperCase()})};function ka(a,b){if(m(a))return m(b)&&1==b.le",
    "ngth?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)r",
    "eturn c;return-1}function q(a,b){for(var c=a.length,d=m(a)?a.split(\"\"",
    "):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function u(a,b,c){var d",
    "=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}function v(a,b",
    "){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.ca",
    "ll(void 0,d[e],e,a))return!0;return!1}\nfunction la(a,b){for(var c=a.le",
    "ngth,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],",
    "e,a))return!1;return!0}function ma(a){return Array.prototype.concat.app",
    "ly([],arguments)}function na(a){var b=a.length;if(0<b){for(var c=Array(",
    "b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function oa(a,b,c){return 2>",
    "=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice",
    ".call(a,b,c)};var pa={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aq",
    "ua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc",
    "\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue",
    ":\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb8",
    "87\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\"",
    ",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crim",
    "son:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8",
    "b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400",
    "\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\"",
    ",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc",
    "\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",",
    "darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f",
    "4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1",
    "493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",d",
    "odgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",for",
    "estgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostw",
    "hite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080",
    "\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:",
    "\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082",
    "\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblu",
    "sh:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue",
    ":\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenro",
    "dyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightg",
    "rey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightse",
    "agreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",",
    "lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ff",
    "ffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta",
    ":\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue",
    ":\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumse",
    "agreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00f",
    "a9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightb",
    "lue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:",
    "\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6",
    "\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered",
    ":\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#",
    "98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip",
    ":\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",pl",
    "um:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000",
    "\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",",
    "salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashe",
    "ll:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb",
    "\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",sn",
    "ow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b",
    "48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise",
    ":\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whi",
    "tesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var qa=",
    "\"backgroundColor borderTopColor borderRightColor borderBottomColor bor",
    "derLeftColor color outlineColor\".split(\" \"),ra=/#([0-9a-fA-F])([0-9a",
    "-fA-F])([0-9a-fA-F])/,sa=/^#(?:[0-9a-f]{3}){1,2}$/i,ta=/^(?:rgba)?\\((",
    "\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,ua=/^(",
    "?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})",
    "\\)$/i;function va(a,b){this.code=a;this.state=w[a]||wa;this.message=b|",
    "|\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.to",
    "UpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.inde",
    "xOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.na",
    "me=this.name;this.stack=a.stack||\"\"}p(va,Error);var wa=\"unknown erro",
    "r\",w={15:\"element not selectable\",11:\"element not visible\"};w[31]=",
    "wa;w[30]=wa;w[24]=\"invalid cookie domain\";w[29]=\"invalid element coo",
    "rdinates\";w[12]=\"invalid element state\";\nw[32]=\"invalid selector\"",
    ";w[51]=\"invalid selector\";w[52]=\"invalid selector\";w[17]=\"javascri",
    "pt error\";w[405]=\"unsupported operation\";w[34]=\"move target out of ",
    "bounds\";w[27]=\"no such alert\";w[7]=\"no such element\";w[8]=\"no suc",
    "h frame\";w[23]=\"no such window\";w[28]=\"script timeout\";w[33]=\"ses",
    "sion not created\";w[10]=\"stale element reference\";w[21]=\"timeout\";",
    "w[25]=\"unable to set cookie\";w[26]=\"unexpected alert open\";w[13]=wa",
    ";w[9]=\"unknown command\";va.prototype.toString=function(){return this.",
    "name+\": \"+this.message};function x(a,b){this.x=k(a)?a:0;this.y=k(b)?b",
    ":0}h=x.prototype;h.clone=function(){return new x(this.x,this.y)};h.toSt",
    "ring=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function",
    "(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.flo",
    "or=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);retur",
    "n this};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(",
    "this.y);return this};\nh.translate=function(a,b){a instanceof x?(this.x",
    "+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h",
    ".scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};functi",
    "on xa(a,b){this.width=a;this.height=b}h=xa.prototype;h.clone=function()",
    "{return new xa(this.width,this.height)};h.toString=function(){return\"(",
    "\"+this.width+\" x \"+this.height+\")\"};h.ceil=function(){this.width=M",
    "ath.ceil(this.width);this.height=Math.ceil(this.height);return this};h.",
    "floor=function(){this.width=Math.floor(this.width);this.height=Math.flo",
    "or(this.height);return this};h.round=function(){this.width=Math.round(t",
    "his.width);this.height=Math.round(this.height);return this};\nh.scale=f",
    "unction(a,b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};funct",
    "ion ya(a,b,c){function d(c){c&&b.appendChild(m(c)?a.createTextNode(c):c",
    ")}for(var e=1;e<c.length;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(",
    "f):q(za(f)?na(f):f,d)}}function Aa(a,b){if(!a||!b)return!1;if(a.contain",
    "s&&1==b.nodeType)return a==b||a.contains(b);if(\"undefined\"!=typeof a.",
    "compareDocumentPosition)return a==b||!!(a.compareDocumentPosition(b)&16",
    ");for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction Ba(a,b){if(a==b)r",
    "eturn 0;if(a.compareDocumentPosition)return a.compareDocumentPosition(b",
    ")&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourceIndex\"in a.pare",
    "ntNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceInde",
    "x-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==f?Ca(a,b):!",
    "c&&Aa(e,b)?-1*Da(a,b):!d&&Aa(f,a)?Da(b,a):(c?a.sourceIndex:e.sourceInde",
    "x)-(d?b.sourceIndex:f.sourceIndex)}d=z(a);c=d.createRange();c.selectNod",
    "e(a);c.collapse(!0);a=d.createRange();a.selectNode(b);\na.collapse(!0);",
    "return c.compareBoundaryPoints(aa.Range.START_TO_END,a)}function Da(a,b",
    "){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentN",
    "ode;return Ca(b,a)}function Ca(a,b){for(;b=b.previousSibling;)if(b==a)r",
    "eturn-1;return 1}function z(a){return 9==a.nodeType?a:a.ownerDocument||",
    "a.document}function za(a){if(a&&\"number\"==typeof a.length){if(ea(a))r",
    "eturn\"function\"==typeof a.item||\"string\"==typeof a.item;if(\"functi",
    "on\"==ca(a))return\"function\"==typeof a.item}return!1}\nfunction Ea(a,",
    "b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;",
    "c++}return null}function Fa(a){this.H=a||aa.document||document}h=Fa.pro",
    "totype;h.getElementsByTagName=function(a,b){return(b||this.H).getElemen",
    "tsByTagName(String(a))};h.createElement=function(a){return this.H.creat",
    "eElement(String(a))};h.createTextNode=function(a){return this.H.createT",
    "extNode(String(a))};h.appendChild=function(a,b){a.appendChild(b)};h.app",
    "end=function(a,b){ya(z(a),a,arguments)};\nh.canHaveChildren=function(a)",
    "{if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPLET\":case \"ARE",
    "A\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBE",
    "D\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAM",
    "E\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":ca",
    "se \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCR",
    "IPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return",
    "!1}return!0};h.removeNode=function(a){return a&&a.parentNode?a.parentNo",
    "de.removeChild(a):null};\nh.contains=Aa;function A(a,b){b&&\"string\"!=",
    "=typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.to",
    "UpperCase()==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu L",
    "abs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby gra",
    "nted, free of charge, to any person obtaining a copy\n of this software",
    " and associated documentation files (the \"Software\"), to\n deal in th",
    "e Software without restriction, including without limitation the\n righ",
    "ts to use, copy, modify, merge, publish, distribute, sublicense, and/or",
    "\n sell copies of the Software, and to permit persons to whom the Softw",
    "are is\n furnished to do so, subject to the following conditions:\n\n T",
    "he above copyright notice and this permission notice shall be included ",
    "in\n all copies or substantial portions of the Software.\n\n THE SOFTWA",
    "RE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IM",
    "PLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
    "\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SH",
    "ALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES",
    " OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERW",
    "ISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE U",
    "SE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction B(a,b,c){this.l=a",
    ";this.ma=b||1;this.j=c||1};function Ga(a){this.T=a;this.J=0}function Ha",
    "(a){a=a.match(Ia);for(var b=0;b<a.length;b++)Ja.test(a[b])&&a.splice(b,",
    "1);return new Ga(a)}var Ia=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?",
    "![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+",
    "|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Ja=/^\\s/;function C(a,b){return a.",
    "T[a.J+(b||0)]}Ga.prototype.next=function(){return this.T[this.J++]};Ga.",
    "prototype.back=function(){this.J--};Ga.prototype.empty=function(){retur",
    "n this.T.length<=this.J};function D(a){var b=null,c=a.nodeType;1==c&&(b",
    "=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?",
    "\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement",
    ":a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeV",
    "alue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););",
    "}}else b=a.nodeValue;return\"\"+b}\nfunction F(a,b,c){if(null===b)retur",
    "n!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==c?!!",
    "a.getAttribute(b):a.getAttribute(b,2)==c}function Ka(a,b,c,d,e){return ",
    "La.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new G)}\nfunction La(a,b,c,",
    "d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),q(b,",
    "function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"cl",
    "ass\"==c?(b=b.getElementsByClassName(d),q(b,function(b){b.className==d&",
    "&a.matches(b)&&e.add(b)})):a instanceof H?Ma(a,b,c,d,e):b.getElementsBy",
    "TagName&&(b=b.getElementsByTagName(a.getName()),q(b,function(a){F(a,c,d",
    ")&&e.add(a)}));return e}function Ma(a,b,c,d,e){for(b=b.firstChild;b;b=b",
    ".nextSibling)F(b,c,d)&&a.matches(b)&&e.add(b),Ma(a,b,c,d,e)};function G",
    "(){this.j=this.g=null;this.D=0}function Na(a){this.node=a;this.next=thi",
    "s.w=null}function Oa(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b",
    "=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):",
    "0<Ba(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=",
    "e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;retur",
    "n a}G.prototype.unshift=function(a){a=new Na(a);a.next=this.g;this.j?th",
    "is.g.w=a:this.g=this.j=a;this.g=a;this.D++};\nG.prototype.add=function(",
    "a){a=new Na(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a",
    ";this.D++};function Pa(a){return(a=a.g)?a.node:null}G.prototype.m=funct",
    "ion(){return this.D};function Qa(a){return(a=Pa(a))?D(a):\"\"}G.prototy",
    "pe.iterator=function(a){return new Ra(this,!!a)};function Ra(a,b){this.",
    "ia=a;this.U=(this.A=b)?a.j:a.g;this.P=null}Ra.prototype.next=function()",
    "{var a=this.U;if(null==a)return null;var b=this.P=a;this.U=this.A?a.w:a",
    ".next;return b.node};\nRa.prototype.remove=function(){var a=this.ia,b=t",
    "his.P;if(!b)throw Error(\"Next must be called at least once before remo",
    "ve.\");var c=b.w,b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.P=n",
    "ull};function I(a){this.f=a;this.h=this.o=!1;this.F=null}function K(a){",
    "return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}I.prototype",
    ".c=function(){return this.o};function Sa(a,b){a.o=b}function Ta(a,b){a.",
    "h=b}I.prototype.u=function(){return this.F};function L(a,b){a=a.evaluat",
    "e(b);return a instanceof G?+Qa(a):+a}function M(a,b){a=a.evaluate(b);re",
    "turn a instanceof G?Qa(a):\"\"+a}function O(a,b){a=a.evaluate(b);return",
    " a instanceof G?!!a.m():!!a};function Ua(a,b,c){I.call(this,a.f);this.S",
    "=a;this.Y=b;this.ca=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.S==Va&&(",
    "c.h||c.c()||4==c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||",
    "(this.F={name:c.u().name,C:b}):this.F={name:b.u().name,C:c})}p(Ua,I);\n",
    "function P(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instan",
    "ceof G&&c instanceof G){b=b.iterator();for(d=b.next();d;d=b.next())for(",
    "e=c.iterator(),f=e.next();f;f=e.next())if(a(D(d),D(f)))return!0;return!",
    "1}if(b instanceof G||c instanceof G){b instanceof G?(e=b,d=c):(e=c,d=b)",
    ";f=e.iterator();for(var g=typeof d,l=f.next();l;l=f.next()){switch(g){c",
    "ase \"number\":l=+D(l);break;case \"boolean\":l=!!D(l);break;case \"str",
    "ing\":l=D(l);break;default:throw Error(\"Illegal primitive type for com",
    "parison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return e",
    "?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==ty",
    "peof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}Ua.prototype.eval",
    "uate=function(a){return this.S.v(this.Y,this.ca,a)};Ua.prototype.toStri",
    "ng=function(){var a=\"Binary Expression: \"+this.S,a=a+K(this.Y);return",
    " a+=K(this.ca)};function Wa(a,b,c,d){this.la=a;this.aa=b;this.f=c;this.",
    "v=d}Wa.prototype.toString=function(){return this.la};var Xa={};\nfuncti",
    "on Q(a,b,c,d){if(Xa.hasOwnProperty(a))throw Error(\"Binary operator alr",
    "eady created: \"+a);a=new Wa(a,b,c,d);return Xa[a.toString()]=a}Q(\"div",
    "\",6,1,function(a,b,c){return L(a,c)/L(b,c)});Q(\"mod\",6,1,function(a,",
    "b,c){return L(a,c)%L(b,c)});Q(\"*\",6,1,function(a,b,c){return L(a,c)*L",
    "(b,c)});Q(\"+\",5,1,function(a,b,c){return L(a,c)+L(b,c)});Q(\"-\",5,1,",
    "function(a,b,c){return L(a,c)-L(b,c)});Q(\"<\",4,2,function(a,b,c){retu",
    "rn P(function(a,b){return a<b},a,b,c)});\nQ(\">\",4,2,function(a,b,c){r",
    "eturn P(function(a,b){return a>b},a,b,c)});Q(\"<=\",4,2,function(a,b,c)",
    "{return P(function(a,b){return a<=b},a,b,c)});Q(\">=\",4,2,function(a,b",
    ",c){return P(function(a,b){return a>=b},a,b,c)});var Va=Q(\"=\",3,2,fun",
    "ction(a,b,c){return P(function(a,b){return a==b},a,b,c,!0)});Q(\"!=\",3",
    ",2,function(a,b,c){return P(function(a,b){return a!=b},a,b,c,!0)});Q(\"",
    "and\",2,2,function(a,b,c){return O(a,c)&&O(b,c)});Q(\"or\",1,2,function",
    "(a,b,c){return O(a,c)||O(b,c)});function Ya(a,b){if(b.m()&&4!=a.f)throw",
    " Error(\"Primary expression must evaluate to nodeset if filter has pred",
    "icate(s).\");I.call(this,a.f);this.ba=a;this.b=b;this.o=a.c();this.h=a.",
    "h}p(Ya,I);Ya.prototype.evaluate=function(a){a=this.ba.evaluate(a);retur",
    "n Za(this.b,a)};Ya.prototype.toString=function(){var a=\"Filter:\"+K(th",
    "is.ba);return a+=K(this.b)};function $a(a,b){if(b.length<a.$)throw Erro",
    "r(\"Function \"+a.i+\" expects at least\"+a.$+\" arguments, \"+b.length",
    "+\" given\");if(null!==a.R&&b.length>a.R)throw Error(\"Function \"+a.i+",
    "\" expects at most \"+a.R+\" arguments, \"+b.length+\" given\");a.ja&&q",
    "(b,function(b,d){if(4!=b.f)throw Error(\"Argument \"+d+\" to function ",
    "\"+a.i+\" is not of type Nodeset: \"+b);});I.call(this,a.f);this.I=a;th",
    "is.N=b;Sa(this,a.o||v(b,function(a){return a.c()}));Ta(this,a.ha&&!b.le",
    "ngth||a.ga&&!!b.length||v(b,function(a){return a.h}))}\np($a,I);$a.prot",
    "otype.evaluate=function(a){return this.I.v.apply(null,ma(a,this.N))};$a",
    ".prototype.toString=function(){var a=\"Function: \"+this.I;if(this.N.le",
    "ngth)var b=u(this.N,function(a,b){return a+K(b)},\"Arguments:\"),a=a+K(",
    "b);return a};function ab(a,b,c,d,e,f,g,l,r){this.i=a;this.f=b;this.o=c;",
    "this.ha=d;this.ga=e;this.v=f;this.$=g;this.R=k(l)?l:g;this.ja=!!r}ab.pr",
    "ototype.toString=function(){return this.i};var bb={};\nfunction R(a,b,c",
    ",d,e,f,g,l){if(bb.hasOwnProperty(a))throw Error(\"Function already crea",
    "ted: \"+a+\".\");bb[a]=new ab(a,b,c,d,!1,e,f,g,l)}R(\"boolean\",2,!1,!1",
    ",function(a,b){return O(b,a)},1);R(\"ceiling\",1,!1,!1,function(a,b){re",
    "turn Math.ceil(L(b,a))},1);R(\"concat\",3,!1,!1,function(a,b){return u(",
    "oa(arguments,1),function(b,d){return b+M(d,a)},\"\")},2,null);R(\"conta",
    "ins\",2,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);return-1!=b.indexOf(a)}",
    ",2);R(\"count\",1,!1,!1,function(a,b){return b.evaluate(a).m()},1,1,!0)",
    ";\nR(\"false\",2,!1,!1,function(){return!1},0);R(\"floor\",1,!1,!1,func",
    "tion(a,b){return Math.floor(L(b,a))},1);R(\"id\",4,!1,!1,function(a,b){",
    "var c=a.l,d=9==c.nodeType?c:c.ownerDocument;a=M(b,a).split(/\\s+/);var ",
    "e=[];q(a,function(a){a=d.getElementById(a);!a||0<=ka(e,a)||e.push(a)});",
    "e.sort(Ba);var f=new G;q(e,function(a){f.add(a)});return f},1);R(\"lang",
    "\",2,!1,!1,function(){return!1},1);R(\"last\",1,!0,!1,function(a){if(1!",
    "=arguments.length)throw Error(\"Function last expects ()\");return a.j}",
    ",0);\nR(\"local-name\",3,!1,!0,function(a,b){return(a=b?Pa(b.evaluate(a",
    ")):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);R(\"name\",",
    "3,!1,!0,function(a,b){return(a=b?Pa(b.evaluate(a)):a.l)?a.nodeName.toLo",
    "werCase():\"\"},0,1,!0);R(\"namespace-uri\",3,!0,!1,function(){return\"",
    "\"},0,1,!0);R(\"normalize-space\",3,!1,!0,function(a,b){return(b?M(b,a)",
    ":D(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,",
    "1);R(\"not\",2,!1,!1,function(a,b){return!O(b,a)},1);\nR(\"number\",1,!",
    "1,!0,function(a,b){return b?L(b,a):+D(a.l)},0,1);R(\"position\",1,!0,!1",
    ",function(a){return a.ma},0);R(\"round\",1,!1,!1,function(a,b){return M",
    "ath.round(L(b,a))},1);R(\"starts-with\",2,!1,!1,function(a,b,c){b=M(b,a",
    ");a=M(c,a);return 0==b.lastIndexOf(a,0)},2);R(\"string\",3,!1,!0,functi",
    "on(a,b){return b?M(b,a):D(a.l)},0,1);R(\"string-length\",1,!1,!0,functi",
    "on(a,b){return(b?M(b,a):D(a.l)).length},0,1);\nR(\"substring\",3,!1,!1,",
    "function(a,b,c,d){c=L(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)retur",
    "n\"\";d=d?L(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.",
    "round(c)-1;var e=Math.max(c,0);a=M(b,a);return Infinity==d?a.substring(",
    "e):a.substring(e,c+Math.round(d))},2,3);R(\"substring-after\",3,!1,!1,f",
    "unction(a,b,c){b=M(b,a);a=M(c,a);c=b.indexOf(a);return-1==c?\"\":b.subs",
    "tring(c+a.length)},2);\nR(\"substring-before\",3,!1,!1,function(a,b,c){",
    "b=M(b,a);a=M(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);",
    "R(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(var ",
    "c=a.next();c;c=a.next())b+=+D(c);return b},1,1,!0);R(\"translate\",3,!1",
    ",!1,function(a,b,c,d){b=M(b,a);c=M(c,a);var e=M(d,a);d={};for(var f=0;f",
    "<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f",
    "<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);R(\"true\",2,",
    "!1,!1,function(){return!0},0);function H(a,b){this.ea=a;this.Z=k(b)?b:n",
    "ull;this.B=null;switch(a){case \"comment\":this.B=8;break;case \"text\"",
    ":this.B=3;break;case \"processing-instruction\":this.B=7;break;case \"n",
    "ode\":break;default:throw Error(\"Unexpected argument\");}}function cb(",
    "a){return\"comment\"==a||\"text\"==a||\"processing-instruction\"==a||\"",
    "node\"==a}H.prototype.matches=function(a){return null===this.B||this.B=",
    "=a.nodeType};H.prototype.getName=function(){return this.ea};\nH.prototy",
    "pe.toString=function(){var a=\"Kind Test: \"+this.ea;null===this.Z||(a+",
    "=K(this.Z));return a};function db(a){I.call(this,3);this.da=a.substring",
    "(1,a.length-1)}p(db,I);db.prototype.evaluate=function(){return this.da}",
    ";db.prototype.toString=function(){return\"Literal: \"+this.da};function",
    " eb(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.o",
    "rg/1999/xhtml\";this.K=b?b.toLowerCase():a}eb.prototype.matches=functio",
    "n(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=k(a.localName)?a.localNa",
    "me:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==th",
    "is.K?!0:this.K==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http://w",
    "ww.w3.org/1999/xhtml\")};eb.prototype.getName=function(){return this.i}",
    ";\neb.prototype.toString=function(){return\"Name Test: \"+(\"http://www",
    ".w3.org/1999/xhtml\"==this.K?\"\":this.K+\":\")+this.i};function fb(a){",
    "I.call(this,1);this.fa=a}p(fb,I);fb.prototype.evaluate=function(){retur",
    "n this.fa};fb.prototype.toString=function(){return\"Number: \"+this.fa}",
    ";function gb(a,b){I.call(this,a.f);this.W=a;this.G=b;this.o=a.c();this.",
    "h=a.h;1==this.G.length&&(a=this.G[0],a.O||a.s!=hb||(a=a.M,\"*\"!=a.getN",
    "ame()&&(this.F={name:a.getName(),C:null})))}p(gb,I);function ib(){I.cal",
    "l(this,4)}p(ib,I);ib.prototype.evaluate=function(a){var b=new G;a=a.l;9",
    "==a.nodeType?b.add(a):b.add(a.ownerDocument);return b};ib.prototype.toS",
    "tring=function(){return\"Root Helper Expression\"};function jb(){I.call",
    "(this,4)}p(jb,I);jb.prototype.evaluate=function(a){var b=new G;b.add(a.",
    "l);return b};\njb.prototype.toString=function(){return\"Context Helper ",
    "Expression\"};function kb(a){return\"/\"==a||\"//\"==a}\ngb.prototype.e",
    "valuate=function(a){var b=this.W.evaluate(a);if(!(b instanceof G))throw",
    " Error(\"Filter expression must evaluate to nodeset.\");a=this.G;for(va",
    "r c=0,d=a.length;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c(",
    ")||e.s!=lb)if(e.c()||e.s!=mb){var g=f.next();for(b=e.evaluate(new B(g))",
    ";null!=(g=f.next());)g=e.evaluate(new B(g)),b=Oa(b,g)}else g=f.next(),b",
    "=e.evaluate(new B(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g",
    ".contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new B(g",
    "))}}return b};\ngb.prototype.toString=function(){var a=\"Path Expressio",
    "n:\"+K(this.W);if(this.G.length){var b=u(this.G,function(a,b){return a+",
    "K(b)},\"Steps:\");a+=K(b)}return a};function S(a,b){this.b=a;this.A=!!b",
    "}function Za(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.it",
    "erator(),f=b.m(),g,l=0;g=e.next();l++){var r=a.A?f-l:l+1;g=d.evaluate(n",
    "ew B(g,r,f));if(\"number\"==typeof g)r=r==g;else if(\"string\"==typeof ",
    "g||\"boolean\"==typeof g)r=!!g;else if(g instanceof G)r=0<g.m();else th",
    "row Error(\"Predicate.evaluate returned an unexpected type.\");r||e.rem",
    "ove()}return b}S.prototype.u=function(){return 0<this.b.length?this.b[0",
    "].u():null};\nS.prototype.c=function(){for(var a=0;a<this.b.length;a++)",
    "{var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};S.prototyp",
    "e.m=function(){return this.b.length};S.prototype.toString=function(){re",
    "turn u(this.b,function(a,b){return a+K(b)},\"Predicates:\")};function T",
    "(a,b,c,d){I.call(this,4);this.s=a;this.M=b;this.b=c||new S([]);this.O=!",
    "!d;b=this.b.u();a.na&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()",
    "}p(T,I);\nT.prototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,",
    "e=null,f=0;c&&(d=c.name,e=c.C?M(c.C,a):null,f=1);if(this.O)if(this.c()|",
    "|this.s!=nb)if(b=(new T(ob,new H(\"node\"))).evaluate(a).iterator(),c=b",
    ".next())for(a=this.v(c,d,e,f);null!=(c=b.next());)a=Oa(a,this.v(c,d,e,f",
    "));else a=new G;else a=Ka(this.M,b,d,e),a=Za(this.b,a,f);else a=this.v(",
    "a.l,d,e,f);return a};T.prototype.v=function(a,b,c,d){a=this.s.I(this.M,",
    "a,b,c);return a=Za(this.b,a,d)};\nT.prototype.toString=function(){var a",
    "=\"Step:\"+K(\"Operator: \"+(this.O?\"//\":\"/\"));this.s.i&&(a+=K(\"Ax",
    "is: \"+this.s));a+=K(this.M);if(this.b.m()){var b=u(this.b.b,function(a",
    ",b){return a+K(b)},\"Predicates:\");a+=K(b)}return a};function pb(a,b,c",
    ",d){this.i=a;this.I=b;this.A=c;this.na=d}pb.prototype.toString=function",
    "(){return this.i};var qb={};function U(a,b,c,d){if(qb.hasOwnProperty(a)",
    ")throw Error(\"Axis already created: \"+a);b=new pb(a,b,c,!!d);return q",
    "b[a]=b}\nU(\"ancestor\",function(a,b){for(var c=new G;b=b.parentNode;)a",
    ".matches(b)&&c.unshift(b);return c},!0);U(\"ancestor-or-self\",function",
    "(a,b){var c=new G;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);r",
    "eturn c},!0);\nvar hb=U(\"attribute\",function(a,b){var c=new G,d=a.get",
    "Name();if(b=b.attributes)if(a instanceof H&&null===a.B||\"*\"==d)for(d=",
    "0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1)",
    ",nb=U(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||ne",
    "w G;for(b=b.firstChild;b;b=b.nextSibling)F(b,c,d)&&a.matches(b)&&e.add(",
    "b);return e},!1,!0);U(\"descendant\",Ka,!1,!0);\nvar ob=U(\"descendant-",
    "or-self\",function(a,b,c,d){var e=new G;F(b,c,d)&&a.matches(b)&&e.add(b",
    ");return Ka(a,b,c,d,e)},!1,!0),lb=U(\"following\",function(a,b,c,d){var",
    " e=new G;do for(var f=b;f=f.nextSibling;)F(f,c,d)&&a.matches(f)&&e.add(",
    "f),e=Ka(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);U(\"following",
    "-sibling\",function(a,b){for(var c=new G;b=b.nextSibling;)a.matches(b)&",
    "&c.add(b);return c},!1);U(\"namespace\",function(){return new G},!1);\n",
    "var rb=U(\"parent\",function(a,b){var c=new G;if(9==b.nodeType)return c",
    ";if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.match",
    "es(b)&&c.add(b);return c},!1),mb=U(\"preceding\",function(a,b,c,d){var ",
    "e=new G,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.leng",
    "th;g<l;g++){var r=[];for(b=f[g];b=b.previousSibling;)r.unshift(b);for(v",
    "ar J=0,t=r.length;J<t;J++)b=r[J],F(b,c,d)&&a.matches(b)&&e.add(b),e=Ka(",
    "a,b,c,d,e)}return e},!0,!0);\nU(\"preceding-sibling\",function(a,b){for",
    "(var c=new G;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},",
    "!0);var sb=U(\"self\",function(a,b){var c=new G;a.matches(b)&&c.add(b);",
    "return c},!1);function tb(a){I.call(this,1);this.V=a;this.o=a.c();this.",
    "h=a.h}p(tb,I);tb.prototype.evaluate=function(a){return-L(this.V,a)};tb.",
    "prototype.toString=function(){return\"Unary Expression: -\"+K(this.V)};",
    "function ub(a){I.call(this,4);this.L=a;Sa(this,v(this.L,function(a){ret",
    "urn a.c()}));Ta(this,v(this.L,function(a){return a.h}))}p(ub,I);ub.prot",
    "otype.evaluate=function(a){var b=new G;q(this.L,function(c){c=c.evaluat",
    "e(a);if(!(c instanceof G))throw Error(\"Path expression must evaluate t",
    "o NodeSet.\");b=Oa(b,c)});return b};ub.prototype.toString=function(){re",
    "turn u(this.L,function(a,b){return a+K(b)},\"Union Expression:\")};func",
    "tion vb(a,b){this.a=a;this.ka=b}function wb(a){for(var b,c=[];;){V(a,\"",
    "Missing right hand side of binary expression.\");b=xb(a);var d=a.a.next",
    "();if(!d)break;var e=(d=Xa[d]||null)&&d.aa;if(!e){a.a.back();break}for(",
    ";c.length&&e<=c[c.length-1].aa;)b=new Ua(c.pop(),c.pop(),b);c.push(b,d)",
    "}for(;c.length;)b=new Ua(c.pop(),c.pop(),b);return b}function V(a,b){if",
    "(a.a.empty())throw Error(b);}function yb(a,b){a=a.a.next();if(a!=b)thro",
    "w Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction zb(a){a=a",
    ".a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function Ab(a){a=",
    "a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\");retur",
    "n new db(a)}\nfunction Bb(a){var b=[];if(kb(C(a.a))){var c=a.a.next();v",
    "ar d=C(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&",
    "\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new ib;d=new ib;V(a,\"Missi",
    "ng next location step.\");c=Cb(a,c);b.push(c)}else{a:{c=C(a.a);d=c.char",
    "At(0);switch(d){case \"$\":throw Error(\"Variable reference not allowed",
    " in HTML XPath\");case \"(\":a.a.next();c=wb(a);V(a,'unclosed \"(\"');y",
    "b(a,\")\");break;case '\"':case \"'\":c=Ab(a);break;default:if(isNaN(+c",
    "))if(!cb(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==C(a.a,\n1)){c=a.a.next();",
    "c=bb[c]||null;a.a.next();for(d=[];\")\"!=C(a.a);){V(a,\"Missing functio",
    "n argument list.\");d.push(wb(a));if(\",\"!=C(a.a))break;a.a.next()}V(a",
    ",\"Unclosed function argument list.\");zb(a);c=new $a(c,d)}else{c=null;",
    "break a}else c=new fb(+a.a.next())}\"[\"==C(a.a)&&(d=new S(Db(a)),c=new",
    " Ya(c,d))}if(c)if(kb(C(a.a)))d=c;else return c;else c=Cb(a,\"/\"),d=new",
    " jb,b.push(c)}for(;kb(C(a.a));)c=a.a.next(),V(a,\"Missing next location",
    " step.\"),c=Cb(a,c),b.push(c);return new gb(d,b)}\nfunction Cb(a,b){if(",
    "\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');if",
    "(\".\"==C(a.a)){var c=new T(sb,new H(\"node\"));a.a.next();return c}if(",
    "\"..\"==C(a.a))return c=new T(rb,new H(\"node\")),a.a.next(),c;if(\"@\"",
    "==C(a.a)){var d=hb;a.a.next();V(a,\"Missing attribute name\")}else if(",
    "\"::\"==C(a.a,1)){if(!/(?![0-9])[\\w]/.test(C(a.a).charAt(0)))throw Err",
    "or(\"Bad token: \"+a.a.next());var e=a.a.next();d=qb[e]||null;if(!d)thr",
    "ow Error(\"No axis with name: \"+e);a.a.next();V(a,\"Missing node name",
    "\")}else d=nb;e=\nC(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"",
    "(\"==C(a.a,1)){if(!cb(e))throw Error(\"Invalid node type: \"+e);e=a.a.n",
    "ext();if(!cb(e))throw Error(\"Invalid type name: \"+e);yb(a,\"(\");V(a,",
    "\"Bad nodetype\");var f=C(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=",
    "Ab(a);V(a,\"Bad nodetype\");zb(a);e=new H(e,g)}else if(e=a.a.next(),f=e",
    ".indexOf(\":\"),-1==f)e=new eb(e);else{var g=e.substring(0,f);if(\"*\"=",
    "=g)var l=\"*\";else if(l=a.ka(g),!l)throw Error(\"Namespace prefix not ",
    "declared: \"+g);e=e.substr(f+1);e=new eb(e,l)}else throw Error(\"Bad to",
    "ken: \"+\na.a.next());a=new S(Db(a),d.A);return c||new T(d,e,a,\"//\"==",
    "b)}function Db(a){for(var b=[];\"[\"==C(a.a);){a.a.next();V(a,\"Missing",
    " predicate expression.\");var c=wb(a);b.push(c);V(a,\"Unclosed predicat",
    "e expression.\");yb(a,\"]\")}return b}function xb(a){if(\"-\"==C(a.a))r",
    "eturn a.a.next(),new tb(xb(a));var b=Bb(a);if(\"|\"!=C(a.a))a=b;else{fo",
    "r(b=[b];\"|\"==a.a.next();)V(a,\"Missing next union location path.\"),b",
    ".push(Bb(a));a.a.back();a=new ub(b)}return a};function Eb(a){switch(a.n",
    "odeType){case 1:return ia(Fb,a);case 9:return Eb(a.documentElement);cas",
    "e 11:case 10:case 6:case 12:return Gb;default:return a.parentNode?Eb(a.",
    "parentNode):Gb}}function Gb(){return null}function Fb(a,b){if(a.prefix=",
    "=b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getA",
    "ttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parent",
    "Node&&9!=a.parentNode.nodeType?Fb(a.parentNode,b):null};function Hb(a,b",
    "){if(!a.length)throw Error(\"Empty XPath expression.\");a=Ha(a);if(a.em",
    "pty())throw Error(\"Invalid XPath expression.\");b?\"function\"==ca(b)|",
    "|(b=ha(b.lookupNamespaceURI,b)):b=function(){return null};var c=wb(new ",
    "vb(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.next());this.evalu",
    "ate=function(a,b){a=c.evaluate(new B(a));return new W(a,b)}}\nfunction ",
    "W(a,b){if(0==b)if(a instanceof G)b=4;else if(\"string\"==typeof a)b=2;e",
    "lse if(\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else ",
    "throw Error(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a",
    " instanceof G))throw Error(\"value could not be converted to the specif",
    "ied type\");this.resultType=b;switch(b){case 2:this.stringValue=a insta",
    "nceof G?Qa(a):\"\"+a;break;case 1:this.numberValue=a instanceof G?+Qa(a",
    "):+a;break;case 3:this.booleanValue=a instanceof G?0<a.m():!!a;break;ca",
    "se 4:case 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.nex",
    "t();e;e=c.next())d.push(e);this.snapshotLength=a.m();this.invalidIterat",
    "orState=!1;break;case 8:case 9:this.singleNodeValue=Pa(a);break;default",
    ":throw Error(\"Unknown XPathResult type.\");}var f=0;this.iterateNext=f",
    "unction(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wrong res",
    "ult type\");return f>=d.length?null:d[f++]};this.snapshotItem=function(",
    "a){if(6!=b&&7!=b)throw Error(\"snapshotItem called with wrong result ty",
    "pe\");return a>=d.length||0>a?null:d[a]}}\nW.ANY_TYPE=0;W.NUMBER_TYPE=1",
    ";W.STRING_TYPE=2;W.BOOLEAN_TYPE=3;W.UNORDERED_NODE_ITERATOR_TYPE=4;W.OR",
    "DERED_NODE_ITERATOR_TYPE=5;W.UNORDERED_NODE_SNAPSHOT_TYPE=6;W.ORDERED_N",
    "ODE_SNAPSHOT_TYPE=7;W.ANY_UNORDERED_NODE_TYPE=8;W.FIRST_ORDERED_NODE_TY",
    "PE=9;function Ib(a){this.lookupNamespaceURI=Eb(a)}\nba(\"wgxpath.instal",
    "l\",function(a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.doc",
    "ument;if(!c.evaluate||b)a.XPathResult=W,c.evaluate=function(a,b,c,g){re",
    "turn(new Hb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){retur",
    "n new Hb(a,b)},c.createNSResolver=function(a){return new Ib(a)}});var J",
    "b=function(){var a={qa:\"http://www.w3.org/2000/svg\"};return function(",
    "b){return a[b]||null}}();\nfunction Kb(a,b){var c=z(a);if(!c.documentEl",
    "ement)return null;try{for(var d=c.createNSResolver?c.createNSResolver(c",
    ".documentElement):Jb,e={},f=c.getElementsByTagName(\"*\"),g=0;g<f.lengt",
    "h;++g){var l=f[g],r=l.namespaceURI;if(r&&!e[r]){var J=l.lookupPrefix(r)",
    ";if(!J)var t=r.match(\".*/(\\\\w+)/?$\"),J=t?t[1]:\"xhtml\";e[r]=J}}var",
    " y={},E;for(E in e)y[e[E]]=E;d=function(a){return y[a]||null};try{retur",
    "n c.evaluate(b,a,d,9,null)}catch(N){if(\"TypeError\"===N.name)return d=",
    "c.createNSResolver?c.createNSResolver(c.documentElement):\nJb,c.evaluat",
    "e(b,a,d,9,null);throw N;}}catch(N){throw new va(32,\"Unable to locate a",
    "n element with the xpath expression \"+b+\" because of the following er",
    "ror:\\n\"+N);}}\nfunction Lb(a,b){var c=function(){var c=Kb(b,a);return",
    " c?c.singleNodeValue||null:b.selectSingleNode?(c=z(b),c.setProperty&&c.",
    "setProperty(\"SelectionLanguage\",\"XPath\"),b.selectSingleNode(a)):nul",
    "l}();if(null!==c&&(!c||1!=c.nodeType))throw new va(32,'The result of th",
    "e xpath expression \"'+a+'\" is: '+c+\". It should be an element.\");re",
    "turn c};function Mb(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this",
    ".left=d}h=Mb.prototype;h.clone=function(){return new Mb(this.top,this.r",
    "ight,this.bottom,this.left)};h.toString=function(){return\"(\"+this.top",
    "+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"};h.con",
    "tains=function(a){return this&&a?a instanceof Mb?a.left>=this.left&&a.r",
    "ight<=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:!1};\nh.expand=funct",
    "ion(a,b,c,d){ea(a)?(this.top-=a.top,this.right+=a.right,this.bottom+=a.",
    "bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),this.botto",
    "m+=Number(c),this.left-=Number(d));return this};h.ceil=function(){this.",
    "top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom=Ma",
    "th.ceil(this.bottom);this.left=Math.ceil(this.left);return this};\nh.fl",
    "oor=function(){this.top=Math.floor(this.top);this.right=Math.floor(this",
    ".right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.l",
    "eft);return this};h.round=function(){this.top=Math.round(this.top);this",
    ".right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.",
    "left=Math.round(this.left);return this};h.translate=function(a,b){a ins",
    "tanceof x?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.",
    "y):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+=b));retu",
    "rn this};\nh.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.right*=a;",
    "this.top*=b;this.bottom*=b;return this};function X(a,b,c,d){this.left=a",
    ";this.top=b;this.width=c;this.height=d}h=X.prototype;h.clone=function()",
    "{return new X(this.left,this.top,this.width,this.height)};h.toString=fu",
    "nction(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.width+\"w x",
    " \"+this.height+\"h)\"};h.contains=function(a){return a instanceof x?a.",
    "x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+t",
    "his.height:this.left<=a.left&&this.left+this.width>=a.left+a.width&&thi",
    "s.top<=a.top&&this.top+this.height>=a.top+a.height};\nh.ceil=function()",
    "{this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);this.width",
    "=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};",
    "h.floor=function(){this.left=Math.floor(this.left);this.top=Math.floor(",
    "this.top);this.width=Math.floor(this.width);this.height=Math.floor(this",
    ".height);return this};h.round=function(){this.left=Math.round(this.left",
    ");this.top=Math.round(this.top);this.width=Math.round(this.width);this.",
    "height=Math.round(this.height);return this};\nh.translate=function(a,b)",
    "{a instanceof x?(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(thi",
    "s.top+=b));return this};h.scale=function(a,b){b=n(b)?b:a;this.left*=a;t",
    "his.width*=a;this.top*=b;this.height*=b;return this};var Nb=\"function",
    "\"===typeof ShadowRoot;function Ob(a){for(a=a.parentNode;a&&1!=a.nodeTy",
    "pe&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return A(a)?a:null}\n",
    "function Y(a,b){b=ja(b);if(\"float\"==b||\"cssFloat\"==b||\"styleFloat",
    "\"==b)b=\"cssFloat\";a:{var c=b;var d=z(a);if(d.defaultView&&d.defaultV",
    "iew.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c",
    "]||d.getPropertyValue(c)||\"\";break a}c=\"\"}a=c||Pb(a,b);if(null===a)",
    "a=null;else if(0<=ka(qa,b)){b:{var e=a.match(ta);if(e&&(b=Number(e[1]),",
    "c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c",
    "&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a",
    ".match(ua))if(b=Number(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&&255>",
    "=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a",
    ".toLowerCase();c=pa[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#",
    "\"+b,4==c.length&&(c=c.replace(ra,\"#$1$1$2$2$3$3\")),!sa.test(c))){b=n",
    "ull;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),pa",
    "rseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return",
    " a}\nfunction Pb(a,b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&\"fun",
    "ction\"==ca(c.getPropertyValue)&&(d=c.getPropertyValue(b));return\"inhe",
    "rit\"!=d?k(d)?d:null:(a=Ob(a))?Pb(a,b):null}\nfunction Qb(a,b,c){functi",
    "on d(a){var b=Rb(a);return 0<b.height&&0<b.width?!0:A(a,\"PATH\")&&(0<b",
    ".height||0<b.width)?(a=Y(a,\"stroke-width\"),!!a&&0<parseInt(a,10)):\"h",
    "idden\"!=Y(a,\"overflow\")&&v(a.childNodes,function(a){return 3==a.node",
    "Type||A(a)&&d(a)})}function e(a){return Sb(a)==Z&&la(a.childNodes,funct",
    "ion(a){return!A(a)||e(a)||!d(a)})}if(!A(a))throw Error(\"Argument to is",
    "Shown must be of type Element\");if(A(a,\"BODY\"))return!0;if(A(a,\"OPT",
    "ION\")||A(a,\"OPTGROUP\"))return a=Ea(a,function(a){return A(a,\"SELECT",
    "\")}),\n!!a&&Qb(a,!0,c);var f=Tb(a);if(f)return!!f.X&&0<f.rect.width&&0",
    "<f.rect.height&&Qb(f.X,b,c);if(A(a,\"INPUT\")&&\"hidden\"==a.type.toLow",
    "erCase()||A(a,\"NOSCRIPT\"))return!1;f=Y(a,\"visibility\");return\"coll",
    "apse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=Ub(a))&&d(a)?!e(a):!1}var Z=\"hi",
    "dden\";\nfunction Sb(a){function b(a){function b(a){return a==g?!0:0==Y",
    "(a,\"display\").lastIndexOf(\"inline\",0)||\"absolute\"==c&&\"static\"=",
    "=Y(a,\"position\")?!1:!0}var c=Y(a,\"position\");if(\"fixed\"==c)return",
    " J=!0,a==g?null:g;for(a=Ob(a);a&&!b(a);)a=Ob(a);return a}function c(a){",
    "var b=a;if(\"visible\"==r)if(a==g&&l)b=l;else if(a==l)return{x:\"visibl",
    "e\",y:\"visible\"};b={x:Y(b,\"overflow-x\"),y:Y(b,\"overflow-y\")};a==g",
    "&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y)",
    ";return b}function d(a){if(a==g){var b=(new Fa(f)).H;\na=b.scrollingEle",
    "ment?b.scrollingElement:b.body||b.documentElement;b=b.parentWindow||b.d",
    "efaultView;a=new x(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollT",
    "op)}else a=new x(a.scrollLeft,a.scrollTop);return a}var e=Vb(a);var f=z",
    "(a),g=f.documentElement,l=f.body,r=Y(g,\"overflow\"),J;for(a=b(a);a;a=b",
    "(a)){var t=c(a);if(\"visible\"!=t.x||\"visible\"!=t.y){var y=Rb(a);if(0",
    "==y.width||0==y.height)return Z;var E=e.right<y.left,N=e.bottom<y.top;i",
    "f(E&&\"hidden\"==t.x||N&&\"hidden\"==t.y)return Z;if(E&&\"visible\"!=t.",
    "x||\nN&&\"visible\"!=t.y){E=d(a);N=e.bottom<y.top-E.y;if(e.right<y.left",
    "-E.x&&\"visible\"!=t.x||N&&\"visible\"!=t.x)return Z;e=Sb(a);return e==",
    "Z?Z:\"scroll\"}E=e.left>=y.left+y.width;y=e.top>=y.top+y.height;if(E&&",
    "\"hidden\"==t.x||y&&\"hidden\"==t.y)return Z;if(E&&\"visible\"!=t.x||y&",
    "&\"visible\"!=t.y){if(J&&(t=d(a),e.left>=g.scrollWidth-t.x||e.right>=g.",
    "scrollHeight-t.y))return Z;e=Sb(a);return e==Z?Z:\"scroll\"}}}return\"n",
    "one\"}\nfunction Rb(a){var b=Tb(a);if(b)return b.rect;if(A(a,\"HTML\"))",
    "return a=z(a),a=((a?a.parentWindow||a.defaultView:window)||window).docu",
    "ment,a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=new xa(a",
    ".clientWidth,a.clientHeight),new X(0,0,a.width,a.height);try{var c=a.ge",
    "tBoundingClientRect()}catch(d){return new X(0,0,0,0)}return new X(c.lef",
    "t,c.top,c.right-c.left,c.bottom-c.top)}\nfunction Tb(a){var b=A(a,\"MAP",
    "\");if(!b&&!A(a,\"AREA\"))return null;var c=b?a:A(a.parentNode,\"MAP\")",
    "?a.parentNode:null,d=null,e=null;c&&c.name&&(d=Lb('/descendant::*[@usem",
    "ap = \"#'+c.name+'\"]',z(c)))&&(e=Rb(d),b||\"default\"==a.shape.toLower",
    "Case()||(a=Wb(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.min(Math",
    ".max(a.top,0),e.height),e=new X(b+e.left,c+e.top,Math.min(a.width,e.wid",
    "th-b),Math.min(a.height,e.height-c))));return{X:d,rect:e||new X(0,0,0,0",
    ")}}\nfunction Wb(a){var b=a.shape.toLowerCase();a=a.coords.split(\",\")",
    ";if(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return new X(b,c,a[2]-b",
    ",a[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new X(a[0]-b,a[1]-",
    "b,2*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c=a[1],d=b,e=c,f=",
    "2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,",
    "a[f+1]),e=Math.max(e,a[f+1]);return new X(b,c,d-b,e-c)}return new X(0,0",
    ",0,0)}function Vb(a){a=Rb(a);return new Mb(a.top,a.left+a.width,a.top+a",
    ".height,a.left)}\nfunction Ub(a){var b=1,c=Y(a,\"opacity\");c&&(b=Numbe",
    "r(c));(a=Ob(a))&&(b*=Ub(a));return b};ba(\"_\",function(a,b){function c",
    "(a){if(A(a)&&\"none\"==Y(a,\"display\"))return!1;a:{var b=a.parentNode;",
    "if(a.getDestinationInsertionPoints){var d=a.getDestinationInsertionPoin",
    "ts();if(0<d.length){a=d[d.length-1];break a}}a=b&&b.shadowRoot&&void 0!",
    "==a.assignedSlot?a.assignedSlot?a.assignedSlot.parentNode:null:b}return",
    " Nb&&a instanceof ShadowRoot||a&&(9==a.nodeType||11==a.nodeType)?!0:!!a",
    "&&c(a)}return Qb(a,!!b,c)});; return this._.apply(null,arguments);}.app",
    "ly({navigator:typeof window!='undefined'?window.navigator:null,document",
    ":typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const IS_ENABLED[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof 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\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ga(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a){var b=m;function c(){}c.prototype=b.prototype;",
    "a.na=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=funct",
    "ion(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e",
    "++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function n(a,",
    "b){for(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call",
    "(void 0,d[e],e,a)}function p(a,b,c){var d=c;n(a,function(c,f){d=b.call(",
    "void 0,d,c,f,a)});return d}function q(a,b){for(var c=a.length,d=h(a)?a.",
    "split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;r",
    "eturn!1}function ha(a){return Array.prototype.concat.apply([],arguments",
    ")}function ia(a,b,c){return 2>=arguments.length?Array.prototype.slice.c",
    "all(a,b):Array.prototype.slice.call(a,b,c)};function ja(a){for(;a&&1!=a",
    ".nodeType;)a=a.previousSibling;return a}function ka(a,b){if(!a||!b)retu",
    "rn!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"undef",
    "ined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDocum",
    "entPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction ",
    "la(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareD",
    "ocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourc",
    "eIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)re",
    "turn a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;retu",
    "rn e==f?na(a,b):!c&&ka(e,b)?-1*oa(a,b):!d&&ka(f,a)?oa(b,a):(c?a.sourceI",
    "ndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType?a:a",
    ".ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.collapse",
    "(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.compar",
    "eBoundaryPoints(aa.Range.START_TO_END,a)}function oa(a,b){var c=a.paren",
    "tNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return na(b",
    ",a)}function na(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return ",
    "1}function pa(a,b){for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}",
    "return null};function r(a,b){b&&\"string\"!==typeof b&&(b=b.toString())",
    ";return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The",
    " MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2",
    "012 Google Inc.\n\n Permission is hereby granted, free of charge, to an",
    "y person obtaining a copy\n of this software and associated documentati",
    "on files (the \"Software\"), to\n deal in the Software without restrict",
    "ion, including without limitation the\n rights to use, copy, modify, me",
    "rge, publish, distribute, sublicense, and/or\n sell copies of the Softw",
    "are, and to permit persons to whom the Software is\n furnished to do so",
    ", subject to the following conditions:\n\n The above copyright notice a",
    "nd this permission notice shall be included in\n all copies or substant",
    "ial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", W",
    "ITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LI",
    "MITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR ",
    "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIG",
    "HT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETH",
    "ER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF ",
    "OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN TH",
    "E SOFTWARE.\n*/\nfunction t(a,b,c){this.l=a;this.ka=b||1;this.j=c||1};f",
    "unction u(a){this.S=a;this.I=0}function qa(a){a=a.match(ra);for(var b=0",
    ";b<a.length;b++)sa.test(a[b])&&a.splice(b,1);return new u(a)}var ra=/",
    "\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+",
    ")|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|",
    "\\s+|./g,sa=/^\\s/;function v(a,b){return a.S[a.I+(b||0)]}u.prototype.n",
    "ext=function(){return this.S[this.I++]};u.prototype.back=function(){thi",
    "s.I--};u.prototype.empty=function(){return this.S.length<=this.I};funct",
    "ion x(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||nu",
    "ll==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=typeof ",
    "b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;for(var c=0,d=[]",
    ",b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.first",
    "Child);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return\"",
    "\"+b}\nfunction y(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)re",
    "turn!1}catch(d){return!1}return null==c?!!a.getAttribute(b):a.getAttrib",
    "ute(b,2)==c}function z(a,b,c,d,e){return ta.call(null,a,b,h(c)?c:null,h",
    "(d)?d:null,e||new A)}\nfunction ta(a,b,c,d,e){b.getElementsByName&&d&&",
    "\"name\"==c?(b=b.getElementsByName(d),n(b,function(b){a.matches(b)&&e.a",
    "dd(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.getElementsByCl",
    "assName(d),n(b,function(b){b.className==d&&a.matches(b)&&e.add(b)})):a ",
    "instanceof B?ua(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTa",
    "gName(a.getName()),n(b,function(a){y(a,c,d)&&e.add(a)}));return e}funct",
    "ion ua(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)y(b,c,d)&&a.matc",
    "hes(b)&&e.add(b),ua(a,b,c,d,e)};function A(){this.j=this.g=null;this.D=",
    "0}function va(a){this.node=a;this.next=this.w=null}function wa(a,b){if(",
    "!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,f=0;c&&",
    "b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<la(c.node,b.node)?(e=b,b=b.",
    "next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.w=d",
    ",d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}A.prototype.unshift=funct",
    "ion(a){a=new va(a);a.next=this.g;this.j?this.g.w=a:this.g=this.j=a;this",
    ".g=a;this.D++};\nA.prototype.add=function(a){a=new va(a);a.w=this.j;thi",
    "s.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};function C(a){retu",
    "rn(a=a.g)?a.node:null}A.prototype.m=function(){return this.D};function ",
    "D(a){return(a=C(a))?x(a):\"\"}A.prototype.iterator=function(a){return n",
    "ew xa(this,!!a)};function xa(a,b){this.ga=a;this.T=(this.A=b)?a.j:a.g;t",
    "his.O=null}xa.prototype.next=function(){var a=this.T;if(null==a)return ",
    "null;var b=this.O=a;this.T=this.A?a.w:a.next;return b.node};\nxa.protot",
    "ype.remove=function(){var a=this.ga,b=this.O;if(!b)throw Error(\"Next m",
    "ust be called at least once before remove.\");var c=b.w,b=b.next;c?c.ne",
    "xt=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};function m(a){this.f=a;this",
    ".h=this.o=!1;this.F=null}function E(a){return\"\\n  \"+a.toString().spl",
    "it(\"\\n\").join(\"\\n  \")}m.prototype.c=function(){return this.o};fun",
    "ction ya(a,b){a.o=b}function za(a,b){a.h=b}m.prototype.u=function(){ret",
    "urn this.F};function F(a,b){a=a.evaluate(b);return a instanceof A?+D(a)",
    ":+a}function G(a,b){a=a.evaluate(b);return a instanceof A?D(a):\"\"+a}f",
    "unction H(a,b){a=a.evaluate(b);return a instanceof A?!!a.m():!!a};funct",
    "ion I(a,b,c){m.call(this,a.f);this.R=a;this.W=b;this.aa=c;this.o=b.c()|",
    "|c.c();this.h=b.h||c.h;this.R==Aa&&(c.h||c.c()||4==c.f||0==c.f||!b.u()?",
    "b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c.u().name,C:b}):this",
    ".F={name:b.u().name,C:c})}k(I);\nfunction J(a,b,c,d,e){b=b.evaluate(d);",
    "c=c.evaluate(d);var f;if(b instanceof A&&c instanceof A){b=b.iterator()",
    ";for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next()",
    ")if(a(x(d),x(f)))return!0;return!1}if(b instanceof A||c instanceof A){b",
    " instanceof A?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,l=f",
    ".next();l;l=f.next()){switch(g){case \"number\":l=+x(l);break;case \"bo",
    "olean\":l=!!x(l);break;case \"string\":l=x(l);break;default:throw Error",
    "(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(l,d)||e==c&&",
    "a(d,l))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==t",
    "ypeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):",
    "a(b,c):a(+b,+c)}I.prototype.evaluate=function(a){return this.R.v(this.W",
    ",this.aa,a)};I.prototype.toString=function(){var a=\"Binary Expression:",
    " \"+this.R,a=a+E(this.W);return a+=E(this.aa)};function Ba(a,b,c,d){thi",
    "s.ja=a;this.Z=b;this.f=c;this.v=d}Ba.prototype.toString=function(){retu",
    "rn this.ja};var Ca={};\nfunction K(a,b,c,d){if(Ca.hasOwnProperty(a))thr",
    "ow Error(\"Binary operator already created: \"+a);a=new Ba(a,b,c,d);ret",
    "urn Ca[a.toString()]=a}K(\"div\",6,1,function(a,b,c){return F(a,c)/F(b,",
    "c)});K(\"mod\",6,1,function(a,b,c){return F(a,c)%F(b,c)});K(\"*\",6,1,f",
    "unction(a,b,c){return F(a,c)*F(b,c)});K(\"+\",5,1,function(a,b,c){retur",
    "n F(a,c)+F(b,c)});K(\"-\",5,1,function(a,b,c){return F(a,c)-F(b,c)});K(",
    "\"<\",4,2,function(a,b,c){return J(function(a,b){return a<b},a,b,c)});",
    "\nK(\">\",4,2,function(a,b,c){return J(function(a,b){return a>b},a,b,c)",
    "});K(\"<=\",4,2,function(a,b,c){return J(function(a,b){return a<=b},a,b",
    ",c)});K(\">=\",4,2,function(a,b,c){return J(function(a,b){return a>=b},",
    "a,b,c)});var Aa=K(\"=\",3,2,function(a,b,c){return J(function(a,b){retu",
    "rn a==b},a,b,c,!0)});K(\"!=\",3,2,function(a,b,c){return J(function(a,b",
    "){return a!=b},a,b,c,!0)});K(\"and\",2,2,function(a,b,c){return H(a,c)&",
    "&H(b,c)});K(\"or\",1,2,function(a,b,c){return H(a,c)||H(b,c)});function",
    " L(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expression must evaluate",
    " to nodeset if filter has predicate(s).\");m.call(this,a.f);this.$=a;th",
    "is.b=b;this.o=a.c();this.h=a.h}k(L);L.prototype.evaluate=function(a){a=",
    "this.$.evaluate(a);return Da(this.b,a)};L.prototype.toString=function()",
    "{var a=\"Filter:\"+E(this.$);return a+=E(this.b)};function M(a,b){if(b.",
    "length<a.Y)throw Error(\"Function \"+a.i+\" expects at least\"+a.Y+\" a",
    "rguments, \"+b.length+\" given\");if(null!==a.P&&b.length>a.P)throw Err",
    "or(\"Function \"+a.i+\" expects at most \"+a.P+\" arguments, \"+b.lengt",
    "h+\" given\");a.ha&&n(b,function(b,d){if(4!=b.f)throw Error(\"Argument ",
    "\"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b);});m.call(t",
    "his,a.f);this.H=a;this.M=b;ya(this,a.o||q(b,function(a){return a.c()}))",
    ";za(this,a.fa&&!b.length||a.ea&&!!b.length||q(b,function(a){return a.h}",
    "))}k(M);\nM.prototype.evaluate=function(a){return this.H.v.apply(null,h",
    "a(a,this.M))};M.prototype.toString=function(){var a=\"Function: \"+this",
    ".H;if(this.M.length)var b=p(this.M,function(a,b){return a+E(b)},\"Argum",
    "ents:\"),a=a+E(b);return a};function Ea(a,b,c,d,e,f,g,l,w){this.i=a;thi",
    "s.f=b;this.o=c;this.fa=d;this.ea=e;this.v=f;this.Y=g;this.P=void 0!==l?",
    "l:g;this.ha=!!w}Ea.prototype.toString=function(){return this.i};var Fa=",
    "{};\nfunction N(a,b,c,d,e,f,g,l){if(Fa.hasOwnProperty(a))throw Error(\"",
    "Function already created: \"+a+\".\");Fa[a]=new Ea(a,b,c,d,!1,e,f,g,l)}",
    "N(\"boolean\",2,!1,!1,function(a,b){return H(b,a)},1);N(\"ceiling\",1,!",
    "1,!1,function(a,b){return Math.ceil(F(b,a))},1);N(\"concat\",3,!1,!1,fu",
    "nction(a,b){return p(ia(arguments,1),function(b,d){return b+G(d,a)},\"",
    "\")},2,null);N(\"contains\",2,!1,!1,function(a,b,c){b=G(b,a);a=G(c,a);r",
    "eturn-1!=b.indexOf(a)},2);N(\"count\",1,!1,!1,function(a,b){return b.ev",
    "aluate(a).m()},1,1,!0);\nN(\"false\",2,!1,!1,function(){return!1},0);N(",
    "\"floor\",1,!1,!1,function(a,b){return Math.floor(F(b,a))},1);N(\"id\",",
    "4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDocument;a=G(b",
    ",a).split(/\\s+/);var e=[];n(a,function(a){a=d.getElementById(a);var b;",
    "if(!(b=!a)){a:if(h(e))b=h(a)&&1==a.length?e.indexOf(a,0):-1;else{for(b=",
    "0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b||e.push(a)})",
    ";e.sort(la);var f=new A;n(e,function(a){f.add(a)});return f},1);N(\"lan",
    "g\",2,!1,!1,function(){return!1},1);\nN(\"last\",1,!0,!1,function(a){if",
    "(1!=arguments.length)throw Error(\"Function last expects ()\");return a",
    ".j},0);N(\"local-name\",3,!1,!0,function(a,b){return(a=b?C(b.evaluate(a",
    ")):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);N(\"name\",",
    "3,!1,!0,function(a,b){return(a=b?C(b.evaluate(a)):a.l)?a.nodeName.toLow",
    "erCase():\"\"},0,1,!0);N(\"namespace-uri\",3,!0,!1,function(){return\"",
    "\"},0,1,!0);\nN(\"normalize-space\",3,!1,!0,function(a,b){return(b?G(b,",
    "a):x(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},",
    "0,1);N(\"not\",2,!1,!1,function(a,b){return!H(b,a)},1);N(\"number\",1,!",
    "1,!0,function(a,b){return b?F(b,a):+x(a.l)},0,1);N(\"position\",1,!0,!1",
    ",function(a){return a.ka},0);N(\"round\",1,!1,!1,function(a,b){return M",
    "ath.round(F(b,a))},1);N(\"starts-with\",2,!1,!1,function(a,b,c){b=G(b,a",
    ");a=G(c,a);return 0==b.lastIndexOf(a,0)},2);N(\"string\",3,!1,!0,functi",
    "on(a,b){return b?G(b,a):x(a.l)},0,1);\nN(\"string-length\",1,!1,!0,func",
    "tion(a,b){return(b?G(b,a):x(a.l)).length},0,1);N(\"substring\",3,!1,!1,",
    "function(a,b,c,d){c=F(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)retur",
    "n\"\";d=d?F(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.",
    "round(c)-1;var e=Math.max(c,0);a=G(b,a);return Infinity==d?a.substring(",
    "e):a.substring(e,c+Math.round(d))},2,3);N(\"substring-after\",3,!1,!1,f",
    "unction(a,b,c){b=G(b,a);a=G(c,a);c=b.indexOf(a);return-1==c?\"\":b.subs",
    "tring(c+a.length)},2);\nN(\"substring-before\",3,!1,!1,function(a,b,c){",
    "b=G(b,a);a=G(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);",
    "N(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(var ",
    "c=a.next();c;c=a.next())b+=+x(c);return b},1,1,!0);N(\"translate\",3,!1",
    ",!1,function(a,b,c,d){b=G(b,a);c=G(c,a);var e=G(d,a);d={};for(var f=0;f",
    "<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f",
    "<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);N(\"true\",2,",
    "!1,!1,function(){return!0},0);function B(a,b){this.ca=a;this.X=void 0!=",
    "=b?b:null;this.B=null;switch(a){case \"comment\":this.B=8;break;case \"",
    "text\":this.B=3;break;case \"processing-instruction\":this.B=7;break;ca",
    "se \"node\":break;default:throw Error(\"Unexpected argument\");}}functi",
    "on Ga(a){return\"comment\"==a||\"text\"==a||\"processing-instruction\"=",
    "=a||\"node\"==a}B.prototype.matches=function(a){return null===this.B||t",
    "his.B==a.nodeType};B.prototype.getName=function(){return this.ca};\nB.p",
    "rototype.toString=function(){var a=\"Kind Test: \"+this.ca;null===this.",
    "X||(a+=E(this.X));return a};function O(a){m.call(this,3);this.ba=a.subs",
    "tring(1,a.length-1)}k(O);O.prototype.evaluate=function(){return this.ba",
    "};O.prototype.toString=function(){return\"Literal: \"+this.ba};function",
    " P(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.or",
    "g/1999/xhtml\";this.J=b?b.toLowerCase():a}P.prototype.matches=function(",
    "a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.localName?a.loc",
    "alName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"",
    "==this.J?!0:this.J==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http",
    "://www.w3.org/1999/xhtml\")};P.prototype.getName=function(){return this",
    ".i};\nP.prototype.toString=function(){return\"Name Test: \"+(\"http://w",
    "ww.w3.org/1999/xhtml\"==this.J?\"\":this.J+\":\")+this.i};function Q(a)",
    "{m.call(this,1);this.da=a}k(Q);Q.prototype.evaluate=function(){return t",
    "his.da};Q.prototype.toString=function(){return\"Number: \"+this.da};fun",
    "ction R(a,b){m.call(this,a.f);this.V=a;this.G=b;this.o=a.c();this.h=a.h",
    ";1==this.G.length&&(a=this.G[0],a.N||a.s!=Ha||(a=a.L,\"*\"!=a.getName()",
    "&&(this.F={name:a.getName(),C:null})))}k(R);function S(){m.call(this,4)",
    "}k(S);S.prototype.evaluate=function(a){var b=new A;a=a.l;9==a.nodeType?",
    "b.add(a):b.add(a.ownerDocument);return b};S.prototype.toString=function",
    "(){return\"Root Helper Expression\"};function T(){m.call(this,4)}k(T);T",
    ".prototype.evaluate=function(a){var b=new A;b.add(a.l);return b};\nT.pr",
    "ototype.toString=function(){return\"Context Helper Expression\"};functi",
    "on Ia(a){return\"/\"==a||\"//\"==a}\nR.prototype.evaluate=function(a){v",
    "ar b=this.V.evaluate(a);if(!(b instanceof A))throw Error(\"Filter expre",
    "ssion must evaluate to nodeset.\");a=this.G;for(var c=0,d=a.length;c<d&",
    "&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=Ja)if(e.c()||",
    "e.s!=Ka){var g=f.next();for(b=e.evaluate(new t(g));null!=(g=f.next());)",
    "g=e.evaluate(new t(g)),b=wa(b,g)}else g=f.next(),b=e.evaluate(new t(g))",
    ";else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains(b))&&b.comp",
    "areDocumentPosition(g)&8;g=b);b=e.evaluate(new t(g))}}return b};\nR.pro",
    "totype.toString=function(){var a=\"Path Expression:\"+E(this.V);if(this",
    ".G.length){var b=p(this.G,function(a,b){return a+E(b)},\"Steps:\");a+=E",
    "(b)}return a};function U(a,b){this.b=a;this.A=!!b}function Da(a,b,c){fo",
    "r(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f=b.m(),g,l=0",
    ";g=e.next();l++){var w=a.A?f-l:l+1;g=d.evaluate(new t(g,w,f));if(\"numb",
    "er\"==typeof g)w=w==g;else if(\"string\"==typeof g||\"boolean\"==typeof",
    " g)w=!!g;else if(g instanceof A)w=0<g.m();else throw Error(\"Predicate.",
    "evaluate returned an unexpected type.\");w||e.remove()}return b}U.proto",
    "type.u=function(){return 0<this.b.length?this.b[0].u():null};\nU.protot",
    "ype.c=function(){for(var a=0;a<this.b.length;a++){var b=this.b[a];if(b.",
    "c()||1==b.f||0==b.f)return!0}return!1};U.prototype.m=function(){return ",
    "this.b.length};U.prototype.toString=function(){return p(this.b,function",
    "(a,b){return a+E(b)},\"Predicates:\")};function V(a,b,c,d){m.call(this,",
    "4);this.s=a;this.L=b;this.b=c||new U([]);this.N=!!d;b=this.b.u();a.la&&",
    "b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()}k(V);\nV.prototype.ev",
    "aluate=function(a){var b=a.l,c=this.u(),d=null,e=null,f=0;c&&(d=c.name,",
    "e=c.C?G(c.C,a):null,f=1);if(this.N)if(this.c()||this.s!=La)if(b=(new V(",
    "Ma,new B(\"node\"))).evaluate(a).iterator(),c=b.next())for(a=this.v(c,d",
    ",e,f);null!=(c=b.next());)a=wa(a,this.v(c,d,e,f));else a=new A;else a=z",
    "(this.L,b,d,e),a=Da(this.b,a,f);else a=this.v(a.l,d,e,f);return a};V.pr",
    "ototype.v=function(a,b,c,d){a=this.s.H(this.L,a,b,c);return a=Da(this.b",
    ",a,d)};\nV.prototype.toString=function(){var a=\"Step:\"+E(\"Operator: ",
    "\"+(this.N?\"//\":\"/\"));this.s.i&&(a+=E(\"Axis: \"+this.s));a+=E(this",
    ".L);if(this.b.m()){var b=p(this.b.b,function(a,b){return a+E(b)},\"Pred",
    "icates:\");a+=E(b)}return a};function Na(a,b,c,d){this.i=a;this.H=b;thi",
    "s.A=c;this.la=d}Na.prototype.toString=function(){return this.i};var Oa=",
    "{};function W(a,b,c,d){if(Oa.hasOwnProperty(a))throw Error(\"Axis alrea",
    "dy created: \"+a);b=new Na(a,b,c,!!d);return Oa[a]=b}\nW(\"ancestor\",f",
    "unction(a,b){for(var c=new A;b=b.parentNode;)a.matches(b)&&c.unshift(b)",
    ";return c},!0);W(\"ancestor-or-self\",function(a,b){var c=new A;do a.ma",
    "tches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);\nvar Ha=W(",
    "\"attribute\",function(a,b){var c=new A,d=a.getName();if(b=b.attributes",
    ")if(a instanceof B&&null===a.B||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);el",
    "se(a=b.getNamedItem(d))&&c.add(a);return c},!1),La=W(\"child\",function",
    "(a,b,c,d,e){c=h(c)?c:null;d=h(d)?d:null;e=e||new A;for(b=b.firstChild;b",
    ";b=b.nextSibling)y(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);W(\"",
    "descendant\",z,!1,!0);\nvar Ma=W(\"descendant-or-self\",function(a,b,c,",
    "d){var e=new A;y(b,c,d)&&a.matches(b)&&e.add(b);return z(a,b,c,d,e)},!1",
    ",!0),Ja=W(\"following\",function(a,b,c,d){var e=new A;do for(var f=b;f=",
    "f.nextSibling;)y(f,c,d)&&a.matches(f)&&e.add(f),e=z(a,f,c,d,e);while(b=",
    "b.parentNode);return e},!1,!0);W(\"following-sibling\",function(a,b){fo",
    "r(var c=new A;b=b.nextSibling;)a.matches(b)&&c.add(b);return c},!1);W(",
    "\"namespace\",function(){return new A},!1);\nvar Pa=W(\"parent\",functi",
    "on(a,b){var c=new A;if(9==b.nodeType)return c;if(2==b.nodeType)return c",
    ".add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);return c},",
    "!1),Ka=W(\"preceding\",function(a,b,c,d){var e=new A,f=[];do f.unshift(",
    "b);while(b=b.parentNode);for(var g=1,l=f.length;g<l;g++){var w=[];for(b",
    "=f[g];b=b.previousSibling;)w.unshift(b);for(var ma=0,db=w.length;ma<db;",
    "ma++)b=w[ma],y(b,c,d)&&a.matches(b)&&e.add(b),e=z(a,b,c,d,e)}return e},",
    "!0,!0);\nW(\"preceding-sibling\",function(a,b){for(var c=new A;b=b.prev",
    "iousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Qa=W(\"self\"",
    ",function(a,b){var c=new A;a.matches(b)&&c.add(b);return c},!1);functio",
    "n X(a){m.call(this,1);this.U=a;this.o=a.c();this.h=a.h}k(X);X.prototype",
    ".evaluate=function(a){return-F(this.U,a)};X.prototype.toString=function",
    "(){return\"Unary Expression: -\"+E(this.U)};function Ra(a){m.call(this,",
    "4);this.K=a;ya(this,q(this.K,function(a){return a.c()}));za(this,q(this",
    ".K,function(a){return a.h}))}k(Ra);Ra.prototype.evaluate=function(a){va",
    "r b=new A;n(this.K,function(c){c=c.evaluate(a);if(!(c instanceof A))thr",
    "ow Error(\"Path expression must evaluate to NodeSet.\");b=wa(b,c)});ret",
    "urn b};Ra.prototype.toString=function(){return p(this.K,function(a,b){r",
    "eturn a+E(b)},\"Union Expression:\")};function Sa(a,b){this.a=a;this.ia",
    "=b}function Ta(a){for(var b,c=[];;){Y(a,\"Missing right hand side of bi",
    "nary expression.\");b=Ua(a);var d=a.a.next();if(!d)break;var e=(d=Ca[d]",
    "||null)&&d.Z;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].Z;",
    ")b=new I(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new I(c.pop(),",
    "c.pop(),b);return b}function Y(a,b){if(a.a.empty())throw Error(b);}func",
    "tion Va(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"",
    "+b+\" got: \"+a);}\nfunction Wa(a){a=a.a.next();if(\")\"!=a)throw Error",
    "(\"Bad token: \"+a);}function Xa(a){a=a.a.next();if(2>a.length)throw Er",
    "ror(\"Unclosed literal string\");return new O(a)}\nfunction Ya(a){var b",
    "=[];if(Ia(v(a.a))){var c=a.a.next();var d=v(a.a);if(\"/\"==c&&(a.a.empt",
    "y()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)",
    "))return new S;d=new S;Y(a,\"Missing next location step.\");c=Za(a,c);b",
    ".push(c)}else{a:{c=v(a.a);d=c.charAt(0);switch(d){case \"$\":throw Erro",
    "r(\"Variable reference not allowed in HTML XPath\");case \"(\":a.a.next",
    "();c=Ta(a);Y(a,'unclosed \"(\"');Va(a,\")\");break;case '\"':case \"'\"",
    ":c=Xa(a);break;default:if(isNaN(+c))if(!Ga(c)&&/(?![0-9])[\\w]/.test(d)",
    "&&\"(\"==v(a.a,\n1)){c=a.a.next();c=Fa[c]||null;a.a.next();for(d=[];\")",
    "\"!=v(a.a);){Y(a,\"Missing function argument list.\");d.push(Ta(a));if(",
    "\",\"!=v(a.a))break;a.a.next()}Y(a,\"Unclosed function argument list.\"",
    ");Wa(a);c=new M(c,d)}else{c=null;break a}else c=new Q(+a.a.next())}\"[",
    "\"==v(a.a)&&(d=new U($a(a)),c=new L(c,d))}if(c)if(Ia(v(a.a)))d=c;else r",
    "eturn c;else c=Za(a,\"/\"),d=new T,b.push(c)}for(;Ia(v(a.a));)c=a.a.nex",
    "t(),Y(a,\"Missing next location step.\"),c=Za(a,c),b.push(c);return new",
    " R(d,b)}\nfunction Za(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op ",
    "should be \"/\" or \"//\"');if(\".\"==v(a.a)){var c=new V(Qa,new B(\"no",
    "de\"));a.a.next();return c}if(\"..\"==v(a.a))return c=new V(Pa,new B(\"",
    "node\")),a.a.next(),c;if(\"@\"==v(a.a)){var d=Ha;a.a.next();Y(a,\"Missi",
    "ng attribute name\")}else if(\"::\"==v(a.a,1)){if(!/(?![0-9])[\\w]/.tes",
    "t(v(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.n",
    "ext();d=Oa[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.ne",
    "xt();Y(a,\"Missing node name\")}else d=La;e=\nv(a.a);if(/(?![0-9])[\\w",
    "\\*]/.test(e.charAt(0)))if(\"(\"==v(a.a,1)){if(!Ga(e))throw Error(\"Inv",
    "alid node type: \"+e);e=a.a.next();if(!Ga(e))throw Error(\"Invalid type",
    " name: \"+e);Va(a,\"(\");Y(a,\"Bad nodetype\");var f=v(a.a).charAt(0),g",
    "=null;if('\"'==f||\"'\"==f)g=Xa(a);Y(a,\"Bad nodetype\");Wa(a);e=new B(",
    "e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new P(e);else{var ",
    "g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ia(g),!l)throw E",
    "rror(\"Namespace prefix not declared: \"+g);e=e.substr(f+1);e=new P(e,l",
    ")}else throw Error(\"Bad token: \"+\na.a.next());a=new U($a(a),d.A);ret",
    "urn c||new V(d,e,a,\"//\"==b)}function $a(a){for(var b=[];\"[\"==v(a.a)",
    ";){a.a.next();Y(a,\"Missing predicate expression.\");var c=Ta(a);b.push",
    "(c);Y(a,\"Unclosed predicate expression.\");Va(a,\"]\")}return b}functi",
    "on Ua(a){if(\"-\"==v(a.a))return a.a.next(),new X(Ua(a));var b=Ya(a);if",
    "(\"|\"!=v(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing next",
    " union location path.\"),b.push(Ya(a));a.a.back();a=new Ra(b)}return a}",
    ";function ab(a){switch(a.nodeType){case 1:return ga(bb,a);case 9:return",
    " ab(a.documentElement);case 11:case 10:case 6:case 12:return cb;default",
    ":return a.parentNode?ab(a.parentNode):cb}}function cb(){return null}fun",
    "ction bb(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org",
    "/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specif",
    "ied?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?bb(a.parentNod",
    "e,b):null};function eb(a,b){if(!a.length)throw Error(\"Empty XPath expr",
    "ession.\");a=qa(a);if(a.empty())throw Error(\"Invalid XPath expression.",
    "\");b?\"function\"==ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=function(){",
    "return null};var c=Ta(new Sa(a,b));if(!a.empty())throw Error(\"Bad toke",
    "n: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new t(a));retu",
    "rn new Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceof A)b=4;else if(",
    "\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boo",
    "lean\"==typeof a)b=3;else throw Error(\"Unexpected evaluation result.\"",
    ");if(2!=b&&1!=b&&3!=b&&!(a instanceof A))throw Error(\"value could not ",
    "be converted to the specified type\");this.resultType=b;switch(b){case ",
    "2:this.stringValue=a instanceof A?D(a):\"\"+a;break;case 1:this.numberV",
    "alue=a instanceof A?+D(a):+a;break;case 3:this.booleanValue=a instanceo",
    "f A?0<a.m():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();",
    "var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=",
    "a.m();this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeV",
    "alue=C(a);break;default:throw Error(\"Unknown XPathResult type.\");}var",
    " f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNex",
    "t called with wrong result type\");return f>=d.length?null:d[f++]};this",
    ".snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem call",
    "ed with wrong result type\");return a>=d.length||0>a?null:d[a]}}\nZ.ANY",
    "_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NO",
    "DE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE_SNAP",
    "SHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TYPE=8;",
    "Z.FIRST_ORDERED_NODE_TYPE=9;function fb(a){this.lookupNamespaceURI=ab(a",
    ")}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Do",
    "cument.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Z,c.evalua",
    "te=function(a,b,c,g){return(new eb(a,c)).evaluate(b,g)},c.createExpress",
    "ion=function(a,b){return new eb(a,b)},c.createNSResolver=function(a){re",
    "turn new fb(a)}});var gb=\"BUTTON INPUT OPTGROUP OPTION SELECT TEXTAREA",
    "\".split(\" \");function hb(a){return q(gb,function(b){return r(a,b)})?",
    "a.disabled?!1:a.parentNode&&1==a.parentNode.nodeType&&r(a,\"OPTGROUP\")",
    "||r(a,\"OPTION\")?hb(a.parentNode):!pa(a,function(a){var b=a.parentNode",
    ";if(b&&r(b,\"FIELDSET\")&&b.disabled){if(!r(a,\"LEGEND\"))return!0;for(",
    ";a=void 0!==a.previousElementSibling?a.previousElementSibling:ja(a.prev",
    "iousSibling);)if(r(a,\"LEGEND\"))return!0}return!1}):!0};ba(\"_\",hb);;",
    " return this._.apply(null,arguments);}.apply({navigator:typeof window!=",
    "'undefined'?window.navigator:null,document:typeof window!='undefined'?w",
    "indow.document:null}, arguments);}",
    NULL
};

const char* const SUBMIT[] = {
    "function(){return function(){var f,k=this;function l(a){return\"string",
    "\"==typeof a}function aa(a,b){a=a.split(\".\");var c=k;a[0]in c||!c.exe",
    "cScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());",
    ")a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c",
    "[d]=b}\nfunction ba(a){var b=typeof a;if(\"object\"==b)if(a){if(a insta",
    "nceof Array)return\"array\";if(a instanceof Object)return b;var c=Objec",
    "t.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.prope",
    "rtyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c",
    "||\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnume",
    "rable&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function ca(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function da(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction ea(a,b,c){ea=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?ca:da;return ea.apply(null,argumen",
    "ts)}function fa(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction n(a,b){function c(){}c.prototype=b.prototype;a.xa=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.wa=function(a,",
    "c,g){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};var ga=window;var h",
    "a=String.prototype.trim?function(a){return a.trim()}:function(a){return",
    " a.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ia(a,b){return ",
    "a<b?-1:a>b?1:0};function p(a,b){for(var c=a.length,d=l(a)?a.split(\"\")",
    ":a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function q(a,b,c){var d=",
    "c;p(a,function(c,g){d=b.call(void 0,d,c,g,a)});return d}function r(a,b)",
    "{for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.cal",
    "l(void 0,d[e],e,a))return!0;return!1}function ja(a){return Array.protot",
    "ype.concat.apply([],arguments)}function ka(a,b,c){return 2>=arguments.l",
    "ength?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)",
    "};function t(a,b){this.code=a;this.state=u[a]||v;this.message=b||\"\";a",
    "=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCa",
    "se().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"E",
    "rror\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=this",
    ".name;this.stack=a.stack||\"\"}n(t,Error);var v=\"unknown error\",u={15",
    ":\"element not selectable\",11:\"element not visible\"};u[31]=v;u[30]=v",
    ";u[24]=\"invalid cookie domain\";u[29]=\"invalid element coordinates\";",
    "u[12]=\"invalid element state\";\nu[32]=\"invalid selector\";u[51]=\"in",
    "valid selector\";u[52]=\"invalid selector\";u[17]=\"javascript error\";",
    "u[405]=\"unsupported operation\";u[34]=\"move target out of bounds\";u[",
    "27]=\"no such alert\";u[7]=\"no such element\";u[8]=\"no such frame\";u",
    "[23]=\"no such window\";u[28]=\"script timeout\";u[33]=\"session not cr",
    "eated\";u[10]=\"stale element reference\";u[21]=\"timeout\";u[25]=\"una",
    "ble to set cookie\";u[26]=\"unexpected alert open\";u[13]=v;u[9]=\"unkn",
    "own command\";t.prototype.toString=function(){return this.name+\": \"+t",
    "his.message};var w;a:{var la=k.navigator;if(la){var ma=la.userAgent;if(",
    "ma){w=ma;break a}}w=\"\"};function na(a){var b=oa;Object.prototype.hasO",
    "wnProperty.call(b,\"528\")||(b[\"528\"]=a(\"528\"))};var pa=-1!=w.index",
    "Of(\"Macintosh\"),qa=-1!=w.indexOf(\"Windows\"),ra,sa=\"\",ta=/WebKit",
    "\\/(\\S+)/.exec(w);ta&&(sa=ta?ta[1]:\"\");ra=sa;var oa={};\nfunction ua",
    "(){na(function(){for(var a=0,b=ha(String(ra)).split(\".\"),c=ha(\"528\"",
    ").split(\".\"),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var g=b",
    "[e]||\"\",h=c[e]||\"\";do{g=/(\\d*)(\\D*)(.*)/.exec(g)||[\"\",\"\",\"\"",
    ",\"\"];h=/(\\d*)(\\D*)(.*)/.exec(h)||[\"\",\"\",\"\",\"\"];if(0==g[0].l",
    "ength&&0==h[0].length)break;a=ia(0==g[1].length?0:parseInt(g[1],10),0==",
    "h[1].length?0:parseInt(h[1],10))||ia(0==g[2].length,0==h[2].length)||ia",
    "(g[2],h[2]);g=g[3];h=h[3]}while(0==a)}return 0<=a})};function va(a,b){i",
    "f(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(",
    "b);if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a",
    ".compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==",
    "a}\nfunction wa(a,b){if(a==b)return 0;if(a.compareDocumentPosition)retu",
    "rn a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parent",
    "Node&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeTy",
    "pe;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,g=b.pa",
    "rentNode;return e==g?xa(a,b):!c&&va(e,b)?-1*ya(a,b):!d&&va(g,a)?ya(b,a)",
    ":(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:g.sourceIndex)}d=za(a",
    ");c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRange();a.",
    "selectNode(b);\na.collapse(!0);return c.compareBoundaryPoints(k.Range.S",
    "TART_TO_END,a)}function ya(a,b){var c=a.parentNode;if(c==b)return-1;for",
    "(;b.parentNode!=c;)b=b.parentNode;return xa(b,a)}function xa(a,b){for(;",
    "b=b.previousSibling;)if(b==a)return-1;return 1}function za(a){return 9=",
    "=a.nodeType?a:a.ownerDocument||a.document}function Ba(a,b,c){a&&!c&&(a=",
    "a.parentNode);for(c=0;a;){if(b(a))return a;a=a.parentNode;c++}return nu",
    "ll};function x(a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!!",
    "a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The MIT Lice",
    "nse\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Googl",
    "e Inc.\n\n Permission is hereby granted, free of charge, to any person ",
    "obtaining a copy\n of this software and associated documentation files ",
    "(the \"Software\"), to\n deal in the Software without restriction, incl",
    "uding without limitation the\n rights to use, copy, modify, merge, publ",
    "ish, distribute, sublicense, and/or\n sell copies of the Software, and ",
    "to permit persons to whom the Software is\n furnished to do so, subject",
    " to the following conditions:\n\n The above copyright notice and this p",
    "ermission notice shall be included in\n all copies or substantial porti",
    "ons of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WA",
    "RRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO ",
    "THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE A",
    "ND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDER",
    "S BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ",
    "ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CON",
    "NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWAR",
    "E.\n*/\nfunction y(a,b,c){this.s=a;this.ua=b||1;this.o=c||1};function C",
    "a(a){this.Y=a;this.N=0}function Da(a){a=a.match(Ea);for(var b=0;b<a.len",
    "gth;b++)Fa.test(a[b])&&a.splice(b,1);return new Ca(a)}var Ea=/\\$?(?:(?",
    "![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|",
    "\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,F",
    "a=/^\\s/;function A(a,b){return a.Y[a.N+(b||0)]}Ca.prototype.next=funct",
    "ion(){return this.Y[this.N++]};Ca.prototype.back=function(){this.N--};C",
    "a.prototype.empty=function(){return this.Y.length<=this.N};function B(a",
    "){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a",
    ".innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=typeof b)if(9=",
    "=c||1==c){a=9==c?a.documentElement:a.firstChild;for(var c=0,d=[],b=\"\"",
    ";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);",
    "for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return\"\"+b}\nf",
    "unction C(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}c",
    "atch(d){return!1}return null==c?!!a.getAttribute(b):a.getAttribute(b,2)",
    "==c}function D(a,b,c,d,e){return Ga.call(null,a,b,l(c)?c:null,l(d)?d:nu",
    "ll,e||new E)}\nfunction Ga(a,b,c,d,e){b.getElementsByName&&d&&\"name\"=",
    "=c?(b=b.getElementsByName(d),p(b,function(b){a.matches(b)&&e.add(b)})):",
    "b.getElementsByClassName&&d&&\"class\"==c?(b=b.getElementsByClassName(d",
    "),p(b,function(b){b.className==d&&a.matches(b)&&e.add(b)})):a instanceo",
    "f F?Ha(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.g",
    "etName()),p(b,function(a){C(a,c,d)&&e.add(a)}));return e}function Ha(a,",
    "b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)C(b,c,d)&&a.matches(b)&&e",
    ".add(b),Ha(a,b,c,d,e)};function E(){this.o=this.j=null;this.J=0}functio",
    "n Ia(a){this.node=a;this.next=this.F=null}function Ja(a,b){if(!a.j)retu",
    "rn b;if(!b.j)return a;var c=a.j;b=b.j;for(var d=null,e,g=0;c&&b;)c.node",
    "==b.node?(e=c,c=c.next,b=b.next):0<wa(c.node,b.node)?(e=b,b=b.next):(e=",
    "c,c=c.next),(e.F=d)?d.next=e:a.j=e,d=e,g++;for(e=c||b;e;)e.F=d,d=d.next",
    "=e,g++,e=e.next;a.o=d;a.J=g;return a}E.prototype.unshift=function(a){a=",
    "new Ia(a);a.next=this.j;this.o?this.j.F=a:this.j=this.o=a;this.j=a;this",
    ".J++};\nE.prototype.add=function(a){a=new Ia(a);a.F=this.o;this.j?this.",
    "o.next=a:this.j=this.o=a;this.o=a;this.J++};function Ka(a){return(a=a.j",
    ")?a.node:null}E.prototype.u=function(){return this.J};function La(a){re",
    "turn(a=Ka(a))?B(a):\"\"}E.prototype.iterator=function(a){return new Ma(",
    "this,!!a)};function Ma(a,b){this.qa=a;this.Z=(this.H=b)?a.o:a.j;this.V=",
    "null}Ma.prototype.next=function(){var a=this.Z;if(null==a)return null;v",
    "ar b=this.V=a;this.Z=this.H?a.F:a.next;return b.node};\nMa.prototype.re",
    "move=function(){var a=this.qa,b=this.V;if(!b)throw Error(\"Next must be",
    " called at least once before remove.\");var c=b.F,b=b.next;c?c.next=b:a",
    ".j=b;b?b.F=c:a.o=c;a.J--;this.V=null};function G(a){this.i=a;this.l=thi",
    "s.w=!1;this.K=null}function H(a){return\"\\n  \"+a.toString().split(\"",
    "\\n\").join(\"\\n  \")}G.prototype.h=function(){return this.w};function",
    " Na(a,b){a.w=b}function Oa(a,b){a.l=b}G.prototype.C=function(){return t",
    "his.K};function I(a,b){a=a.evaluate(b);return a instanceof E?+La(a):+a}",
    "function J(a,b){a=a.evaluate(b);return a instanceof E?La(a):\"\"+a}func",
    "tion K(a,b){a=a.evaluate(b);return a instanceof E?!!a.u():!!a};function",
    " L(a,b,c){G.call(this,a.i);this.X=a;this.ca=b;this.ha=c;this.w=b.h()||c",
    ".h();this.l=b.l||c.l;this.X==Pa&&(c.l||c.h()||4==c.i||0==c.i||!b.C()?b.",
    "l||b.h()||4==b.i||0==b.i||!c.C()||(this.K={name:c.C().name,I:b}):this.K",
    "={name:b.C().name,I:c})}n(L,G);\nfunction M(a,b,c,d,e){b=b.evaluate(d);",
    "c=c.evaluate(d);var g;if(b instanceof E&&c instanceof E){b=b.iterator()",
    ";for(d=b.next();d;d=b.next())for(e=c.iterator(),g=e.next();g;g=e.next()",
    ")if(a(B(d),B(g)))return!0;return!1}if(b instanceof E||c instanceof E){b",
    " instanceof E?(e=b,d=c):(e=c,d=b);g=e.iterator();for(var h=typeof d,m=g",
    ".next();m;m=g.next()){switch(h){case \"number\":m=+B(m);break;case \"bo",
    "olean\":m=!!B(m);break;case \"string\":m=B(m);break;default:throw Error",
    "(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(m,d)||e==c&&",
    "a(d,m))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==t",
    "ypeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):",
    "a(b,c):a(+b,+c)}L.prototype.evaluate=function(a){return this.X.D(this.c",
    "a,this.ha,a)};L.prototype.toString=function(){var a=\"Binary Expression",
    ": \"+this.X,a=a+H(this.ca);return a+=H(this.ha)};function Qa(a,b,c,d){t",
    "his.ta=a;this.fa=b;this.i=c;this.D=d}Qa.prototype.toString=function(){r",
    "eturn this.ta};var Ra={};\nfunction N(a,b,c,d){if(Ra.hasOwnProperty(a))",
    "throw Error(\"Binary operator already created: \"+a);a=new Qa(a,b,c,d);",
    "return Ra[a.toString()]=a}N(\"div\",6,1,function(a,b,c){return I(a,c)/I",
    "(b,c)});N(\"mod\",6,1,function(a,b,c){return I(a,c)%I(b,c)});N(\"*\",6,",
    "1,function(a,b,c){return I(a,c)*I(b,c)});N(\"+\",5,1,function(a,b,c){re",
    "turn I(a,c)+I(b,c)});N(\"-\",5,1,function(a,b,c){return I(a,c)-I(b,c)})",
    ";N(\"<\",4,2,function(a,b,c){return M(function(a,b){return a<b},a,b,c)}",
    ");\nN(\">\",4,2,function(a,b,c){return M(function(a,b){return a>b},a,b,",
    "c)});N(\"<=\",4,2,function(a,b,c){return M(function(a,b){return a<=b},a",
    ",b,c)});N(\">=\",4,2,function(a,b,c){return M(function(a,b){return a>=b",
    "},a,b,c)});var Pa=N(\"=\",3,2,function(a,b,c){return M(function(a,b){re",
    "turn a==b},a,b,c,!0)});N(\"!=\",3,2,function(a,b,c){return M(function(a",
    ",b){return a!=b},a,b,c,!0)});N(\"and\",2,2,function(a,b,c){return K(a,c",
    ")&&K(b,c)});N(\"or\",1,2,function(a,b,c){return K(a,c)||K(b,c)});functi",
    "on Sa(a,b){if(b.u()&&4!=a.i)throw Error(\"Primary expression must evalu",
    "ate to nodeset if filter has predicate(s).\");G.call(this,a.i);this.ga=",
    "a;this.f=b;this.w=a.h();this.l=a.l}n(Sa,G);Sa.prototype.evaluate=functi",
    "on(a){a=this.ga.evaluate(a);return Ta(this.f,a)};Sa.prototype.toString=",
    "function(){var a=\"Filter:\"+H(this.ga);return a+=H(this.f)};function U",
    "a(a,b){if(b.length<a.ea)throw Error(\"Function \"+a.m+\" expects at lea",
    "st\"+a.ea+\" arguments, \"+b.length+\" given\");if(null!==a.W&&b.length",
    ">a.W)throw Error(\"Function \"+a.m+\" expects at most \"+a.W+\" argumen",
    "ts, \"+b.length+\" given\");a.ra&&p(b,function(b,d){if(4!=b.i)throw Err",
    "or(\"Argument \"+d+\" to function \"+a.m+\" is not of type Nodeset: \"+",
    "b);});G.call(this,a.i);this.M=a;this.S=b;Na(this,a.w||r(b,function(a){r",
    "eturn a.h()}));Oa(this,a.pa&&!b.length||a.oa&&!!b.length||r(b,function(",
    "a){return a.l}))}\nn(Ua,G);Ua.prototype.evaluate=function(a){return thi",
    "s.M.D.apply(null,ja(a,this.S))};Ua.prototype.toString=function(){var a=",
    "\"Function: \"+this.M;if(this.S.length)var b=q(this.S,function(a,b){ret",
    "urn a+H(b)},\"Arguments:\"),a=a+H(b);return a};function Va(a,b,c,d,e,g,",
    "h,m,z){this.m=a;this.i=b;this.w=c;this.pa=d;this.oa=e;this.D=g;this.ea=",
    "h;this.W=void 0!==m?m:h;this.ra=!!z}Va.prototype.toString=function(){re",
    "turn this.m};var Wa={};\nfunction O(a,b,c,d,e,g,h,m){if(Wa.hasOwnProper",
    "ty(a))throw Error(\"Function already created: \"+a+\".\");Wa[a]=new Va(",
    "a,b,c,d,!1,e,g,h,m)}O(\"boolean\",2,!1,!1,function(a,b){return K(b,a)},",
    "1);O(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(I(b,a))},1);O(",
    "\"concat\",3,!1,!1,function(a,b){return q(ka(arguments,1),function(b,d)",
    "{return b+J(d,a)},\"\")},2,null);O(\"contains\",2,!1,!1,function(a,b,c)",
    "{b=J(b,a);a=J(c,a);return-1!=b.indexOf(a)},2);O(\"count\",1,!1,!1,funct",
    "ion(a,b){return b.evaluate(a).u()},1,1,!0);\nO(\"false\",2,!1,!1,functi",
    "on(){return!1},0);O(\"floor\",1,!1,!1,function(a,b){return Math.floor(I",
    "(b,a))},1);O(\"id\",4,!1,!1,function(a,b){var c=a.s,d=9==c.nodeType?c:c",
    ".ownerDocument;a=J(b,a).split(/\\s+/);var e=[];p(a,function(a){a=d.getE",
    "lementById(a);var b;if(!(b=!a)){a:if(l(e))b=l(a)&&1==a.length?e.indexOf",
    "(a,0):-1;else{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b",
    "=0<=b}b||e.push(a)});e.sort(wa);var g=new E;p(e,function(a){g.add(a)});",
    "return g},1);O(\"lang\",2,!1,!1,function(){return!1},1);\nO(\"last\",1,",
    "!0,!1,function(a){if(1!=arguments.length)throw Error(\"Function last ex",
    "pects ()\");return a.o},0);O(\"local-name\",3,!1,!0,function(a,b){retur",
    "n(a=b?Ka(b.evaluate(a)):a.s)?a.localName||a.nodeName.toLowerCase():\"\"",
    "},0,1,!0);O(\"name\",3,!1,!0,function(a,b){return(a=b?Ka(b.evaluate(a))",
    ":a.s)?a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"namespace-uri\",3,!0,!",
    "1,function(){return\"\"},0,1,!0);\nO(\"normalize-space\",3,!1,!0,functi",
    "on(a,b){return(b?J(b,a):B(a.s)).replace(/[\\s\\xa0]+/g,\" \").replace(/",
    "^\\s+|\\s+$/g,\"\")},0,1);O(\"not\",2,!1,!1,function(a,b){return!K(b,a)",
    "},1);O(\"number\",1,!1,!0,function(a,b){return b?I(b,a):+B(a.s)},0,1);O",
    "(\"position\",1,!0,!1,function(a){return a.ua},0);O(\"round\",1,!1,!1,f",
    "unction(a,b){return Math.round(I(b,a))},1);O(\"starts-with\",2,!1,!1,fu",
    "nction(a,b,c){b=J(b,a);a=J(c,a);return 0==b.lastIndexOf(a,0)},2);O(\"st",
    "ring\",3,!1,!0,function(a,b){return b?J(b,a):B(a.s)},0,1);\nO(\"string-",
    "length\",1,!1,!0,function(a,b){return(b?J(b,a):B(a.s)).length},0,1);O(",
    "\"substring\",3,!1,!1,function(a,b,c,d){c=I(c,a);if(isNaN(c)||Infinity=",
    "=c||-Infinity==c)return\"\";d=d?I(d,a):Infinity;if(isNaN(d)||-Infinity=",
    "==d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=J(b,a);return In",
    "finity==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);O(\"subst",
    "ring-after\",3,!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);c=b.indexOf(a);r",
    "eturn-1==c?\"\":b.substring(c+a.length)},2);\nO(\"substring-before\",3,",
    "!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);a=b.indexOf(a);return-1==a?\"\"",
    ":b.substring(0,a)},2);O(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).i",
    "terator();b=0;for(var c=a.next();c;c=a.next())b+=+B(c);return b},1,1,!0",
    ");O(\"translate\",3,!1,!1,function(a,b,c,d){b=J(b,a);c=J(c,a);var e=J(d",
    ",a);d={};for(var g=0;g<c.length;g++)a=c.charAt(g),a in d||(d[a]=e.charA",
    "t(g));c=\"\";for(g=0;g<b.length;g++)a=b.charAt(g),c+=a in d?d[a]:a;retu",
    "rn c},3);O(\"true\",2,!1,!1,function(){return!0},0);function F(a,b){thi",
    "s.ja=a;this.da=void 0!==b?b:null;this.A=null;switch(a){case \"comment\"",
    ":this.A=8;break;case \"text\":this.A=3;break;case \"processing-instruct",
    "ion\":this.A=7;break;case \"node\":break;default:throw Error(\"Unexpect",
    "ed argument\");}}function Xa(a){return\"comment\"==a||\"text\"==a||\"pr",
    "ocessing-instruction\"==a||\"node\"==a}F.prototype.matches=function(a){",
    "return null===this.A||this.A==a.nodeType};F.prototype.getName=function(",
    "){return this.ja};\nF.prototype.toString=function(){var a=\"Kind Test: ",
    "\"+this.ja;null===this.da||(a+=H(this.da));return a};function Ya(a){G.c",
    "all(this,3);this.ia=a.substring(1,a.length-1)}n(Ya,G);Ya.prototype.eval",
    "uate=function(){return this.ia};Ya.prototype.toString=function(){return",
    "\"Literal: \"+this.ia};function P(a,b){this.m=a.toLowerCase();a=\"*\"==",
    "this.m?\"*\":\"http://www.w3.org/1999/xhtml\";this.O=b?b.toLowerCase():",
    "a}P.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b)return",
    "!1;b=void 0!==a.localName?a.localName:a.nodeName;return\"*\"!=this.m&&t",
    "his.m!=b.toLowerCase()?!1:\"*\"==this.O?!0:this.O==(a.namespaceURI?a.na",
    "mespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};P.prototype",
    ".getName=function(){return this.m};\nP.prototype.toString=function(){re",
    "turn\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.O?\"\":this",
    ".O+\":\")+this.m};function Za(a){G.call(this,1);this.ka=a}n(Za,G);Za.pr",
    "ototype.evaluate=function(){return this.ka};Za.prototype.toString=funct",
    "ion(){return\"Number: \"+this.ka};function $a(a,b){G.call(this,a.i);thi",
    "s.ba=a;this.L=b;this.w=a.h();this.l=a.l;1==this.L.length&&(a=this.L[0],",
    "a.T||a.B!=ab||(a=a.R,\"*\"!=a.getName()&&(this.K={name:a.getName(),I:nu",
    "ll})))}n($a,G);function Q(){G.call(this,4)}n(Q,G);Q.prototype.evaluate=",
    "function(a){var b=new E;a=a.s;9==a.nodeType?b.add(a):b.add(a.ownerDocum",
    "ent);return b};Q.prototype.toString=function(){return\"Root Helper Expr",
    "ession\"};function bb(){G.call(this,4)}n(bb,G);bb.prototype.evaluate=fu",
    "nction(a){var b=new E;b.add(a.s);return b};\nbb.prototype.toString=func",
    "tion(){return\"Context Helper Expression\"};function cb(a){return\"/\"=",
    "=a||\"//\"==a}\n$a.prototype.evaluate=function(a){var b=this.ba.evaluat",
    "e(a);if(!(b instanceof E))throw Error(\"Filter expression must evaluate",
    " to nodeset.\");a=this.L;for(var c=0,d=a.length;c<d&&b.u();c++){var e=a",
    "[c],g=b.iterator(e.B.H);if(e.h()||e.B!=db)if(e.h()||e.B!=eb){var h=g.ne",
    "xt();for(b=e.evaluate(new y(h));null!=(h=g.next());)h=e.evaluate(new y(",
    "h)),b=Ja(b,h)}else h=g.next(),b=e.evaluate(new y(h));else{for(h=g.next(",
    ");(b=g.next())&&(!h.contains||h.contains(b))&&b.compareDocumentPosition",
    "(h)&8;h=b);b=e.evaluate(new y(h))}}return b};\n$a.prototype.toString=fu",
    "nction(){var a=\"Path Expression:\"+H(this.ba);if(this.L.length){var b=",
    "q(this.L,function(a,b){return a+H(b)},\"Steps:\");a+=H(b)}return a};fun",
    "ction R(a,b){this.f=a;this.H=!!b}function Ta(a,b,c){for(c=c||0;c<a.f.le",
    "ngth;c++)for(var d=a.f[c],e=b.iterator(),g=b.u(),h,m=0;h=e.next();m++){",
    "var z=a.H?g-m:m+1;h=d.evaluate(new y(h,z,g));if(\"number\"==typeof h)z=",
    "z==h;else if(\"string\"==typeof h||\"boolean\"==typeof h)z=!!h;else if(",
    "h instanceof E)z=0<h.u();else throw Error(\"Predicate.evaluate returned",
    " an unexpected type.\");z||e.remove()}return b}R.prototype.C=function()",
    "{return 0<this.f.length?this.f[0].C():null};\nR.prototype.h=function(){",
    "for(var a=0;a<this.f.length;a++){var b=this.f[a];if(b.h()||1==b.i||0==b",
    ".i)return!0}return!1};R.prototype.u=function(){return this.f.length};R.",
    "prototype.toString=function(){return q(this.f,function(a,b){return a+H(",
    "b)},\"Predicates:\")};function S(a,b,c,d){G.call(this,4);this.B=a;this.",
    "R=b;this.f=c||new R([]);this.T=!!d;b=this.f.C();a.va&&b&&(this.K={name:",
    "b.name,I:b.I});this.w=this.f.h()}n(S,G);\nS.prototype.evaluate=function",
    "(a){var b=a.s,c=this.C(),d=null,e=null,g=0;c&&(d=c.name,e=c.I?J(c.I,a):",
    "null,g=1);if(this.T)if(this.h()||this.B!=fb)if(b=(new S(gb,new F(\"node",
    "\"))).evaluate(a).iterator(),c=b.next())for(a=this.D(c,d,e,g);null!=(c=",
    "b.next());)a=Ja(a,this.D(c,d,e,g));else a=new E;else a=D(this.R,b,d,e),",
    "a=Ta(this.f,a,g);else a=this.D(a.s,d,e,g);return a};S.prototype.D=funct",
    "ion(a,b,c,d){a=this.B.M(this.R,a,b,c);return a=Ta(this.f,a,d)};\nS.prot",
    "otype.toString=function(){var a=\"Step:\"+H(\"Operator: \"+(this.T?\"//",
    "\":\"/\"));this.B.m&&(a+=H(\"Axis: \"+this.B));a+=H(this.R);if(this.f.u",
    "()){var b=q(this.f.f,function(a,b){return a+H(b)},\"Predicates:\");a+=H",
    "(b)}return a};function hb(a,b,c,d){this.m=a;this.M=b;this.H=c;this.va=d",
    "}hb.prototype.toString=function(){return this.m};var ib={};function T(a",
    ",b,c,d){if(ib.hasOwnProperty(a))throw Error(\"Axis already created: \"+",
    "a);b=new hb(a,b,c,!!d);return ib[a]=b}\nT(\"ancestor\",function(a,b){fo",
    "r(var c=new E;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);",
    "T(\"ancestor-or-self\",function(a,b){var c=new E;do a.matches(b)&&c.uns",
    "hift(b);while(b=b.parentNode);return c},!0);\nvar ab=T(\"attribute\",fu",
    "nction(a,b){var c=new E,d=a.getName();if(b=b.attributes)if(a instanceof",
    " F&&null===a.A||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedI",
    "tem(d))&&c.add(a);return c},!1),fb=T(\"child\",function(a,b,c,d,e){c=l(",
    "c)?c:null;d=l(d)?d:null;e=e||new E;for(b=b.firstChild;b;b=b.nextSibling",
    ")C(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);T(\"descendant\",D,!",
    "1,!0);\nvar gb=T(\"descendant-or-self\",function(a,b,c,d){var e=new E;C",
    "(b,c,d)&&a.matches(b)&&e.add(b);return D(a,b,c,d,e)},!1,!0),db=T(\"foll",
    "owing\",function(a,b,c,d){var e=new E;do for(var g=b;g=g.nextSibling;)C",
    "(g,c,d)&&a.matches(g)&&e.add(g),e=D(a,g,c,d,e);while(b=b.parentNode);re",
    "turn e},!1,!0);T(\"following-sibling\",function(a,b){for(var c=new E;b=",
    "b.nextSibling;)a.matches(b)&&c.add(b);return c},!1);T(\"namespace\",fun",
    "ction(){return new E},!1);\nvar jb=T(\"parent\",function(a,b){var c=new",
    " E;if(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerEleme",
    "nt),c;b=b.parentNode;a.matches(b)&&c.add(b);return c},!1),eb=T(\"preced",
    "ing\",function(a,b,c,d){var e=new E,g=[];do g.unshift(b);while(b=b.pare",
    "ntNode);for(var h=1,m=g.length;h<m;h++){var z=[];for(b=g[h];b=b.previou",
    "sSibling;)z.unshift(b);for(var Aa=0,Fb=z.length;Aa<Fb;Aa++)b=z[Aa],C(b,",
    "c,d)&&a.matches(b)&&e.add(b),e=D(a,b,c,d,e)}return e},!0,!0);\nT(\"prec",
    "eding-sibling\",function(a,b){for(var c=new E;b=b.previousSibling;)a.ma",
    "tches(b)&&c.unshift(b);return c},!0);var kb=T(\"self\",function(a,b){va",
    "r c=new E;a.matches(b)&&c.add(b);return c},!1);function lb(a){G.call(th",
    "is,1);this.aa=a;this.w=a.h();this.l=a.l}n(lb,G);lb.prototype.evaluate=f",
    "unction(a){return-I(this.aa,a)};lb.prototype.toString=function(){return",
    "\"Unary Expression: -\"+H(this.aa)};function mb(a){G.call(this,4);this.",
    "P=a;Na(this,r(this.P,function(a){return a.h()}));Oa(this,r(this.P,funct",
    "ion(a){return a.l}))}n(mb,G);mb.prototype.evaluate=function(a){var b=ne",
    "w E;p(this.P,function(c){c=c.evaluate(a);if(!(c instanceof E))throw Err",
    "or(\"Path expression must evaluate to NodeSet.\");b=Ja(b,c)});return b}",
    ";mb.prototype.toString=function(){return q(this.P,function(a,b){return ",
    "a+H(b)},\"Union Expression:\")};function nb(a,b){this.a=a;this.sa=b}fun",
    "ction ob(a){for(var b,c=[];;){U(a,\"Missing right hand side of binary e",
    "xpression.\");b=pb(a);var d=a.a.next();if(!d)break;var e=(d=Ra[d]||null",
    ")&&d.fa;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].fa;)b=n",
    "ew L(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new L(c.pop(),c.po",
    "p(),b);return b}function U(a,b){if(a.a.empty())throw Error(b);}function",
    " qb(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+",
    "\" got: \"+a);}\nfunction rb(a){a=a.a.next();if(\")\"!=a)throw Error(\"",
    "Bad token: \"+a);}function sb(a){a=a.a.next();if(2>a.length)throw Error",
    "(\"Unclosed literal string\");return new Ya(a)}\nfunction tb(a){var b=[",
    "];if(cb(A(a.a))){var c=a.a.next();var d=A(a.a);if(\"/\"==c&&(a.a.empty(",
    ")||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))",
    "return new Q;d=new Q;U(a,\"Missing next location step.\");c=ub(a,c);b.p",
    "ush(c)}else{a:{c=A(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(",
    "\"Variable reference not allowed in HTML XPath\");case \"(\":a.a.next()",
    ";c=ob(a);U(a,'unclosed \"(\"');qb(a,\")\");break;case '\"':case \"'\":c",
    "=sb(a);break;default:if(isNaN(+c))if(!Xa(c)&&/(?![0-9])[\\w]/.test(d)&&",
    "\"(\"==A(a.a,\n1)){c=a.a.next();c=Wa[c]||null;a.a.next();for(d=[];\")\"",
    "!=A(a.a);){U(a,\"Missing function argument list.\");d.push(ob(a));if(\"",
    ",\"!=A(a.a))break;a.a.next()}U(a,\"Unclosed function argument list.\");",
    "rb(a);c=new Ua(c,d)}else{c=null;break a}else c=new Za(+a.a.next())}\"[",
    "\"==A(a.a)&&(d=new R(vb(a)),c=new Sa(c,d))}if(c)if(cb(A(a.a)))d=c;else ",
    "return c;else c=ub(a,\"/\"),d=new bb,b.push(c)}for(;cb(A(a.a));)c=a.a.n",
    "ext(),U(a,\"Missing next location step.\"),c=ub(a,c),b.push(c);return n",
    "ew $a(d,b)}\nfunction ub(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step ",
    "op should be \"/\" or \"//\"');if(\".\"==A(a.a)){var c=new S(kb,new F(",
    "\"node\"));a.a.next();return c}if(\"..\"==A(a.a))return c=new S(jb,new ",
    "F(\"node\")),a.a.next(),c;if(\"@\"==A(a.a)){var d=ab;a.a.next();U(a,\"M",
    "issing attribute name\")}else if(\"::\"==A(a.a,1)){if(!/(?![0-9])[\\w]/",
    ".test(A(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a",
    ".a.next();d=ib[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.",
    "a.next();U(a,\"Missing node name\")}else d=fb;e=\nA(a.a);if(/(?![0-9])[",
    "\\w\\*]/.test(e.charAt(0)))if(\"(\"==A(a.a,1)){if(!Xa(e))throw Error(\"",
    "Invalid node type: \"+e);e=a.a.next();if(!Xa(e))throw Error(\"Invalid t",
    "ype name: \"+e);qb(a,\"(\");U(a,\"Bad nodetype\");var g=A(a.a).charAt(0",
    "),h=null;if('\"'==g||\"'\"==g)h=sb(a);U(a,\"Bad nodetype\");rb(a);e=new",
    " F(e,h)}else if(e=a.a.next(),g=e.indexOf(\":\"),-1==g)e=new P(e);else{v",
    "ar h=e.substring(0,g);if(\"*\"==h)var m=\"*\";else if(m=a.sa(h),!m)thro",
    "w Error(\"Namespace prefix not declared: \"+h);e=e.substr(g+1);e=new P(",
    "e,m)}else throw Error(\"Bad token: \"+\na.a.next());a=new R(vb(a),d.H);",
    "return c||new S(d,e,a,\"//\"==b)}function vb(a){for(var b=[];\"[\"==A(a",
    ".a);){a.a.next();U(a,\"Missing predicate expression.\");var c=ob(a);b.p",
    "ush(c);U(a,\"Unclosed predicate expression.\");qb(a,\"]\")}return b}fun",
    "ction pb(a){if(\"-\"==A(a.a))return a.a.next(),new lb(pb(a));var b=tb(a",
    ");if(\"|\"!=A(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)U(a,\"Missing ",
    "next union location path.\"),b.push(tb(a));a.a.back();a=new mb(b)}retur",
    "n a};function wb(a){switch(a.nodeType){case 1:return fa(xb,a);case 9:re",
    "turn wb(a.documentElement);case 11:case 10:case 6:case 12:return yb;def",
    "ault:return a.parentNode?wb(a.parentNode):yb}}function yb(){return null",
    "}function xb(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3",
    ".org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.sp",
    "ecified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?xb(a.paren",
    "tNode,b):null};function zb(a,b){if(!a.length)throw Error(\"Empty XPath ",
    "expression.\");a=Da(a);if(a.empty())throw Error(\"Invalid XPath express",
    "ion.\");b?\"function\"==ba(b)||(b=ea(b.lookupNamespaceURI,b)):b=functio",
    "n(){return null};var c=ob(new nb(a,b));if(!a.empty())throw Error(\"Bad ",
    "token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new y(a));",
    "return new V(a,b)}}\nfunction V(a,b){if(0==b)if(a instanceof E)b=4;else",
    " if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(",
    "\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected evaluation resu",
    "lt.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof E))throw Error(\"value could",
    " not be converted to the specified type\");this.resultType=b;switch(b){",
    "case 2:this.stringValue=a instanceof E?La(a):\"\"+a;break;case 1:this.n",
    "umberValue=a instanceof E?+La(a):+a;break;case 3:this.booleanValue=a in",
    "stanceof E?0<a.u():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iter",
    "ator();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshot",
    "Length=a.u();this.invalidIteratorState=!1;break;case 8:case 9:this.sing",
    "leNodeValue=Ka(a);break;default:throw Error(\"Unknown XPathResult type.",
    "\");}var g=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"it",
    "erateNext called with wrong result type\");return g>=d.length?null:d[g+",
    "+]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotI",
    "tem called with wrong result type\");return a>=d.length||0>a?null:d[a]}",
    "}\nV.ANY_TYPE=0;V.NUMBER_TYPE=1;V.STRING_TYPE=2;V.BOOLEAN_TYPE=3;V.UNOR",
    "DERED_NODE_ITERATOR_TYPE=4;V.ORDERED_NODE_ITERATOR_TYPE=5;V.UNORDERED_N",
    "ODE_SNAPSHOT_TYPE=6;V.ORDERED_NODE_SNAPSHOT_TYPE=7;V.ANY_UNORDERED_NODE",
    "_TYPE=8;V.FIRST_ORDERED_NODE_TYPE=9;function Ab(a){this.lookupNamespace",
    "URI=wb(a)}\naa(\"wgxpath.install\",function(a,b){a=a||k;var c=a.Documen",
    "t&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=V,c",
    ".evaluate=function(a,b,c,h){return(new zb(a,c)).evaluate(b,h)},c.create",
    "Expression=function(a,b){return new zb(a,b)},c.createNSResolver=functio",
    "n(a){return new Ab(a)}});ua();ua();function Bb(a,b,c){this.A=a;this.la=",
    "b;this.ma=c}Bb.prototype.create=function(a){a=za(a).createEvent(\"HTMLE",
    "vents\");a.initEvent(this.A,this.la,this.ma);return a};Bb.prototype.toS",
    "tring=function(){return this.A};var Cb=new Bb(\"submit\",!0,!0);functio",
    "n Db(){this.$=ga.document.documentElement;a:{var a=za(this.$);try{var b",
    "=a&&a.activeElement;break a}catch(c){}b=null}b&&Eb(this,b)}function Eb(",
    "a,b){a.$=b;x(b,\"OPTION\")&&Ba(b,function(a){return x(a,\"SELECT\")})}f",
    "unction Gb(a){return x(a,\"FORM\")};function W(a,b){this.v={};this.g=[]",
    ";this.G=0;var c=arguments.length;if(1<c){if(c%2)throw Error(\"Uneven nu",
    "mber of arguments\");for(var d=0;d<c;d+=2)this.set(arguments[d],argumen",
    "ts[d+1])}else a&&this.addAll(a)}function Hb(a){Ib(a);return a.g.concat(",
    ")}f=W.prototype;f.clear=function(){this.v={};this.G=this.g.length=0};f.",
    "remove=function(a){return Object.prototype.hasOwnProperty.call(this.v,a",
    ")?(delete this.v[a],this.G--,this.g.length>2*this.G&&Ib(this),!0):!1};",
    "\nfunction Ib(a){var b,c;if(a.G!=a.g.length){for(b=c=0;c<a.g.length;){v",
    "ar d=a.g[c];Object.prototype.hasOwnProperty.call(a.v,d)&&(a.g[b++]=d);c",
    "++}a.g.length=b}if(a.G!=a.g.length){var e={};for(b=c=0;c<a.g.length;)d=",
    "a.g[c],Object.prototype.hasOwnProperty.call(e,d)||(a.g[b++]=d,e[d]=1),c",
    "++;a.g.length=b}}f.get=function(a,b){return Object.prototype.hasOwnProp",
    "erty.call(this.v,a)?this.v[a]:b};f.set=function(a,b){Object.prototype.h",
    "asOwnProperty.call(this.v,a)||(this.G++,this.g.push(a));this.v[a]=b};\n",
    "f.addAll=function(a){if(a instanceof W){var b=Hb(a);Ib(a);for(var c=[],",
    "d=0;d<a.g.length;d++)c.push(a.v[a.g[d]]);a=c}else{b=[];var d=0;for(e in",
    " a)b[d++]=e;d=[];var e=0;for(c in a)d[e++]=a[c];a=d}for(c=0;c<b.length;",
    "c++)this.set(b[c],a[c])};f.forEach=function(a,b){for(var c=Hb(this),d=0",
    ";d<c.length;d++){var e=c[d],g=this.get(e);a.call(b,g,e,this)}};f.clone=",
    "function(){return new W(this)};var Jb={};function X(a,b,c){var d=typeof",
    " a;(\"object\"==d&&null!=a||\"function\"==d)&&(a=a.b);a=new Kb(a);!b||b",
    " in Jb&&!c||(Jb[b]={key:a,shift:!1},c&&(Jb[c]={key:a,shift:!0}));return",
    " a}function Kb(a){this.code=a}X(8);X(9);X(13);var Lb=X(16),Mb=X(17),Nb=",
    "X(18);X(19);X(20);X(27);X(32,\" \");X(33);X(34);X(35);X(36);X(37);X(38)",
    ";X(39);X(40);X(44);X(45);X(46);X(48,\"0\",\")\");X(49,\"1\",\"!\");X(50",
    ",\"2\",\"@\");X(51,\"3\",\"#\");X(52,\"4\",\"$\");X(53,\"5\",\"%\");X(5",
    "4,\"6\",\"^\");X(55,\"7\",\"&\");X(56,\"8\",\"*\");X(57,\"9\",\"(\");X(",
    "65,\"a\",\"A\");\nX(66,\"b\",\"B\");X(67,\"c\",\"C\");X(68,\"d\",\"D\")",
    ";X(69,\"e\",\"E\");X(70,\"f\",\"F\");X(71,\"g\",\"G\");X(72,\"h\",\"H\"",
    ");X(73,\"i\",\"I\");X(74,\"j\",\"J\");X(75,\"k\",\"K\");X(76,\"l\",\"L",
    "\");X(77,\"m\",\"M\");X(78,\"n\",\"N\");X(79,\"o\",\"O\");X(80,\"p\",\"",
    "P\");X(81,\"q\",\"Q\");X(82,\"r\",\"R\");X(83,\"s\",\"S\");X(84,\"t\",",
    "\"T\");X(85,\"u\",\"U\");X(86,\"v\",\"V\");X(87,\"w\",\"W\");X(88,\"x\"",
    ",\"X\");X(89,\"y\",\"Y\");X(90,\"z\",\"Z\");var Ob=X(qa?{c:91,b:91}:pa?",
    "{c:224,b:91}:{c:0,b:91});X(qa?{c:92,b:92}:pa?{c:224,b:93}:{c:0,b:92});X",
    "(qa?{c:93,b:93}:pa?{c:0,b:0}:{c:93,b:null});\nX({c:96,b:96},\"0\");X({c",
    ":97,b:97},\"1\");X({c:98,b:98},\"2\");X({c:99,b:99},\"3\");X({c:100,b:1",
    "00},\"4\");X({c:101,b:101},\"5\");X({c:102,b:102},\"6\");X({c:103,b:103",
    "},\"7\");X({c:104,b:104},\"8\");X({c:105,b:105},\"9\");X({c:106,b:106},",
    "\"*\");X({c:107,b:107},\"+\");X({c:109,b:109},\"-\");X({c:110,b:110},\"",
    ".\");X({c:111,b:111},\"/\");X(144);X(112);X(113);X(114);X(115);X(116);X",
    "(117);X(118);X(119);X(120);X(121);X(122);X(123);X({c:107,b:187},\"=\",",
    "\"+\");X(108,\",\");X({c:109,b:189},\"-\",\"_\");X(188,\",\",\"<\");X(1",
    "90,\".\",\">\");X(191,\"/\",\"?\");\nX(192,\"`\",\"~\");X(219,\"[\",\"{",
    "\");X(220,\"\\\\\",\"|\");X(221,\"]\",\"}\");X({c:59,b:186},\";\",\":\"",
    ");X(222,\"'\",'\"');var Y=new W;Y.set(1,Lb);Y.set(2,Mb);Y.set(4,Nb);Y.s",
    "et(8,Ob);(function(a){var b=new W;p(Hb(a),function(c){b.set(a.get(c).co",
    "de,c)});return b})(Y);function Z(){Db.call(this)}n(Z,Db);Z.U=void 0;Z.n",
    "a=function(){return Z.U?Z.U:Z.U=new Z};aa(\"_\",function(a){var b=Ba(a,",
    "Gb,!0);if(!b)throw new t(7,\"Element was not in a form, so could not su",
    "bmit.\");var c=Z.na();Eb(c,a);if(!Gb(b))throw new t(12,\"Element is not",
    " a form, so could not submit.\");a=Cb.create(b,void 0);\"isTrusted\"in ",
    "a||(a.isTrusted=!1);b.dispatchEvent(a)&&(x(b.submit)?b.constructor.prot",
    "otype.submit.call(b):b.submit())});; return this._.apply(null,arguments",
    ");}.apply({navigator:typeof window!='undefined'?window.navigator:null,d",
    "ocument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const FIND_ELEMENT[] = {
    "function(){return function(){var h,aa=this;function l(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&l(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function p(a){return\"function\"==",
    "ca(a)}function ea(a){var b=typeof a;return\"object\"==b&&null!=a||\"fun",
    "ction\"==b}function fa(a,b,c){return a.call.apply(a.bind,arguments)}\nf",
    "unction ga(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arra",
    "y.prototype.slice.call(arguments,2);return function(){var c=Array.proto",
    "type.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.",
    "apply(b,c)}}return function(){return a.apply(b,arguments)}}function ha(",
    "a,b,c){ha=Function.prototype.bind&&-1!=Function.prototype.bind.toString",
    "().indexOf(\"native code\")?fa:ga;return ha.apply(null,arguments)}\nfun",
    "ction ia(a,b){var c=Array.prototype.slice.call(arguments,1);return func",
    "tion(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)",
    "}}function q(a,b){function c(){}c.prototype=b.prototype;a.xa=b.prototyp",
    "e;a.prototype=new c;a.prototype.constructor=a;a.wa=function(a,c,f){for(",
    "var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argum",
    "ents[e];return b.prototype[c].apply(a,d)}};var ja=window;var ka;functio",
    "n la(a){var b=a.length-1;return 0<=b&&a.indexOf(\" \",b)==b}var ma=Stri",
    "ng.prototype.trim?function(a){return a.trim()}:function(a){return a.rep",
    "lace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function na(a){return String(a",
    ").replace(/\\-([a-z])/g,function(a,c){return c.toUpperCase()})};functio",
    "n oa(a,b){if(m(a))return m(b)&&1==b.length?a.indexOf(b,0):-1;for(var c=",
    "0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}function t(a,b){",
    "for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(vo",
    "id 0,d[e],e,a)}function pa(a,b){for(var c=a.length,d=[],e=0,f=m(a)?a.sp",
    "lit(\"\"):a,g=0;g<c;g++)if(g in f){var k=f[g];b.call(void 0,k,g,a)&&(d[",
    "e++]=k)}return d}function qa(a,b,c){var d=c;t(a,function(c,f){d=b.call(",
    "void 0,d,c,f,a)});return d}\nfunction ra(a,b){for(var c=a.length,d=m(a)",
    "?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!",
    "0;return!1}function sa(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e",
    "=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))return!1;return!0}functi",
    "on ta(a,b){a:{for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(",
    "e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return 0>b?null:m(a)?",
    "a.charAt(b):a[b]}function ua(a){return Array.prototype.concat.apply([],",
    "arguments)}\nfunction va(a){var b=a.length;if(0<b){for(var c=Array(b),d",
    "=0;d<b;d++)c[d]=a[d];return c}return[]}function wa(a,b,c){return 2>=arg",
    "uments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.cal",
    "l(a,b,c)};var xa={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:",
    "\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",",
    "bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"",
    "#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887",
    "\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",c",
    "oral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimso",
    "n:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b",
    "\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\"",
    ",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",d",
    "arkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\"",
    ",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",da",
    "rkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f",
    "4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff149",
    "3\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dod",
    "gerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",fores",
    "tgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhi",
    "te:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",",
    "green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#",
    "f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",i",
    "vory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:",
    "\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"",
    "#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodye",
    "llow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey",
    ":\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightseagr",
    "een:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",lig",
    "htslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe",
    "0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"",
    "#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"",
    "#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagr",
    "een:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a",
    "\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue",
    ":\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#",
    "ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",o",
    "live:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#",
    "ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb",
    "98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip:\"#",
    "ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:",
    "\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",r",
    "osybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salm",
    "on:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:",
    "\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",s",
    "lateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:",
    "\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c",
    "\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"",
    "#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whites",
    "moke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var ya=\"b",
    "ackgroundColor borderTopColor borderRightColor borderBottomColor border",
    "LeftColor color outlineColor\".split(\" \"),za=/#([0-9a-fA-F])([0-9a-fA",
    "-F])([0-9a-fA-F])/,Aa=/^#(?:[0-9a-f]{3}){1,2}$/i,Ba=/^(?:rgba)?\\((\\d{",
    "1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,Ca=/^(?:rg",
    "b)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$",
    "/i;function v(a,b){this.code=a;this.state=w[a]||Ea;this.message=b||\"\"",
    ";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpper",
    "Case().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(",
    "\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=t",
    "his.name;this.stack=a.stack||\"\"}q(v,Error);var Ea=\"unknown error\",w",
    "={15:\"element not selectable\",11:\"element not visible\"};w[31]=Ea;w[",
    "30]=Ea;w[24]=\"invalid cookie domain\";w[29]=\"invalid element coordina",
    "tes\";w[12]=\"invalid element state\";\nw[32]=\"invalid selector\";w[51",
    "]=\"invalid selector\";w[52]=\"invalid selector\";w[17]=\"javascript er",
    "ror\";w[405]=\"unsupported operation\";w[34]=\"move target out of bound",
    "s\";w[27]=\"no such alert\";w[7]=\"no such element\";w[8]=\"no such fra",
    "me\";w[23]=\"no such window\";w[28]=\"script timeout\";w[33]=\"session ",
    "not created\";w[10]=\"stale element reference\";w[21]=\"timeout\";w[25]",
    "=\"unable to set cookie\";w[26]=\"unexpected alert open\";w[13]=Ea;w[9]",
    "=\"unknown command\";v.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function x(a,b){this.x=l(a)?a:0;this.y=l(b)?b:0}h=",
    "x.prototype;h.clone=function(){return new x(this.x,this.y)};h.toString=",
    "function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function(){th",
    "is.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.floor=fu",
    "nction(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return thi",
    "s};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.",
    "y);return this};\nh.translate=function(a,b){a instanceof x?(this.x+=a.x",
    ",this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h.scal",
    "e=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Fa",
    "(a,b){this.width=a;this.height=b}h=Fa.prototype;h.clone=function(){retu",
    "rn new Fa(this.width,this.height)};h.toString=function(){return\"(\"+th",
    "is.width+\" x \"+this.height+\")\"};h.ceil=function(){this.width=Math.c",
    "eil(this.width);this.height=Math.ceil(this.height);return this};h.floor",
    "=function(){this.width=Math.floor(this.width);this.height=Math.floor(th",
    "is.height);return this};h.round=function(){this.width=Math.round(this.w",
    "idth);this.height=Math.round(this.height);return this};\nh.scale=functi",
    "on(a,b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};function y",
    "(a){return a?new Ga(z(a)):ka||(ka=new Ga)}function Ha(a,b,c){function d",
    "(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.length",
    ";e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):t(Ia(f)?va(f):f,d)}}f",
    "unction Ja(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}\nfun",
    "ction Ka(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a=",
    "=b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)re",
    "turn a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parent",
    "Node;return b==a}\nfunction La(a,b){if(a==b)return 0;if(a.compareDocume",
    "ntPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex",
    "\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeTy",
    "pe,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.p",
    "arentNode,f=b.parentNode;return e==f?Ma(a,b):!c&&Ka(e,b)?-1*Na(a,b):!d&",
    "&Ka(f,a)?Na(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sou",
    "rceIndex)}d=z(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.c",
    "reateRange();a.selectNode(b);\na.collapse(!0);return c.compareBoundaryP",
    "oints(aa.Range.START_TO_END,a)}function Na(a,b){var c=a.parentNode;if(c",
    "==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Ma(b,a)}functi",
    "on Ma(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}function",
    " z(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Ia(a)",
    "{if(a&&\"number\"==typeof a.length){if(ea(a))return\"function\"==typeof",
    " a.item||\"string\"==typeof a.item;if(p(a))return\"function\"==typeof a",
    ".item}return!1}\nfunction Oa(a,b){a&&(a=a.parentNode);for(var c=0;a;){i",
    "f(b(a))return a;a=a.parentNode;c++}return null}function Ga(a){this.C=a|",
    "|aa.document||document}h=Ga.prototype;h.getElementsByTagName=function(a",
    ",b){return(b||this.C).getElementsByTagName(String(a))};\nfunction B(a,b",
    ",c,d){a=d||a.C;var e=b&&\"*\"!=b?String(b).toUpperCase():\"\";if(a.quer",
    "ySelectorAll&&a.querySelector&&(e||c))c=a.querySelectorAll(e+(c?\".\"+c",
    ":\"\"));else if(c&&a.getElementsByClassName)if(d=a.getElementsByClassNa",
    "me(c),e){a={};for(var f=b=0,g;g=d[f];f++)e==g.nodeName&&(a[b++]=g);a.le",
    "ngth=b;c=a}else c=d;else if(d=a.getElementsByTagName(e||\"*\"),c){a={};",
    "for(f=b=0;g=d[f];f++){var e=g.className,k;if(k=\"function\"==typeof e.s",
    "plit)k=0<=oa(e.split(/\\s+/),c);k&&(a[b++]=g)}a.length=b;c=a}else c=d;r",
    "eturn c}\nh.createElement=function(a){return this.C.createElement(Strin",
    "g(a))};h.createTextNode=function(a){return this.C.createTextNode(String",
    "(a))};h.appendChild=function(a,b){a.appendChild(b)};h.append=function(a",
    ",b){Ha(z(a),a,arguments)};h.canHaveChildren=function(a){if(1!=a.nodeTyp",
    "e)return!1;switch(a.tagName){case \"APPLET\":case \"AREA\":case \"BASE",
    "\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"FRAM",
    "E\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"ISIN",
    "DEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\"",
    ":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case \"SO",
    "URCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0};\n",
    "h.removeNode=function(a){return a&&a.parentNode?a.parentNode.removeChil",
    "d(a):null};h.contains=Ka;function Pa(a,b){b=b.toLowerCase();return\"sty",
    "le\"==b?Qa(a.style.cssText):(a=a.getAttributeNode(b))&&a.specified?a.va",
    "lue:null}var Ra=/[;]+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2}",
    ")*[^']*$)(?=(?:[^()]*\\([^()]*\\))*[^()]*$)/;function Qa(a){var b=[];t(",
    "a.split(Ra),function(a){var c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.",
    "slice(c+1)],2==a.length&&b.push(a[0].toLowerCase(),\":\",a[1],\";\"))})",
    ";b=b.join(\"\");return b=\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfuncti",
    "on C(a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!!a&&1==a.no",
    "deType&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The MIT License\n\n Co",
    "pyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n",
    " Permission is hereby granted, free of charge, to any person obtaining ",
    "a copy\n of this software and associated documentation files (the \"Sof",
    "tware\"), to\n deal in the Software without restriction, including with",
    "out limitation the\n rights to use, copy, modify, merge, publish, distr",
    "ibute, sublicense, and/or\n sell copies of the Software, and to permit ",
    "persons to whom the Software is\n furnished to do so, subject to the fo",
    "llowing conditions:\n\n The above copyright notice and this permission ",
    "notice shall be included in\n all copies or substantial portions of the",
    " Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ",
    "ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRAN",
    "TIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFR",
    "INGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABL",
    "E FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF ",
    "CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WI",
    "TH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfu",
    "nction Sa(a,b,c){this.m=a;this.ua=b||1;this.j=c||1};function Ta(a){this",
    ".W=a;this.M=0}function Ua(a){a=a.match(Va);for(var b=0;b<a.length;b++)W",
    "a.test(a[b])&&a.splice(b,1);return new Ta(a)}var Va=/\\$?(?:(?![0-9-\\.",
    "])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::",
    "|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Wa=/^\\s/;",
    "function E(a,b){return a.W[a.M+(b||0)]}Ta.prototype.next=function(){ret",
    "urn this.W[this.M++]};Ta.prototype.back=function(){this.M--};Ta.prototy",
    "pe.empty=function(){return this.W.length<=this.M};function F(a){var b=n",
    "ull,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a.innerTex",
    "t:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c)",
    "{a=9==c?a.documentElement:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1",
    "!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!",
    "(a=d[--c].nextSibling););}}else b=a.nodeValue;return\"\"+b}\nfunction X",
    "a(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}catch(d){",
    "return!1}return null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}func",
    "tion Ya(a,b,c,d,e){return Za.call(null,a,b,m(c)?c:null,m(d)?d:null,e||n",
    "ew G)}\nfunction Za(a,b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b",
    ".getElementsByName(d),t(b,function(b){a.matches(b)&&e.add(b)})):b.getEl",
    "ementsByClassName&&d&&\"class\"==c?(b=b.getElementsByClassName(d),t(b,f",
    "unction(b){b.className==d&&a.matches(b)&&e.add(b)})):a instanceof H?$a(",
    "a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.getName(",
    ")),t(b,function(a){Xa(a,c,d)&&e.add(a)}));return e}\nfunction $a(a,b,c,",
    "d,e){for(b=b.firstChild;b;b=b.nextSibling)Xa(b,c,d)&&a.matches(b)&&e.ad",
    "d(b),$a(a,b,c,d,e)};function G(){this.j=this.g=null;this.H=0}function a",
    "b(a){this.node=a;this.next=this.B=null}function bb(a,b){if(!a.g)return ",
    "b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b",
    ".node?(e=c,c=c.next,b=b.next):0<La(c.node,b.node)?(e=b,b=b.next):(e=c,c",
    "=c.next),(e.B=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.B=d,d=d.next=e,",
    "f++,e=e.next;a.j=d;a.H=f;return a}G.prototype.unshift=function(a){a=new",
    " ab(a);a.next=this.g;this.j?this.g.B=a:this.g=this.j=a;this.g=a;this.H+",
    "+};\nG.prototype.add=function(a){a=new ab(a);a.B=this.j;this.g?this.j.n",
    "ext=a:this.g=this.j=a;this.j=a;this.H++};function cb(a){return(a=a.g)?a",
    ".node:null}G.prototype.s=function(){return this.H};function db(a){retur",
    "n(a=cb(a))?F(a):\"\"}G.prototype.iterator=function(a){return new eb(thi",
    "s,!!a)};function eb(a,b){this.qa=a;this.Z=(this.D=b)?a.j:a.g;this.T=nul",
    "l}eb.prototype.next=function(){var a=this.Z;if(null==a)return null;var ",
    "b=this.T=a;this.Z=this.D?a.B:a.next;return b.node};\neb.prototype.remov",
    "e=function(){var a=this.qa,b=this.T;if(!b)throw Error(\"Next must be ca",
    "lled at least once before remove.\");var c=b.B,b=b.next;c?c.next=b:a.g=",
    "b;b?b.B=c:a.j=c;a.H--;this.T=null};function I(a){this.f=a;this.h=this.v",
    "=!1;this.I=null}function J(a){return\"\\n  \"+a.toString().split(\"\\n",
    "\").join(\"\\n  \")}I.prototype.c=function(){return this.v};function fb",
    "(a,b){a.v=b}function gb(a,b){a.h=b}I.prototype.A=function(){return this",
    ".I};function K(a,b){a=a.evaluate(b);return a instanceof G?+db(a):+a}fun",
    "ction M(a,b){a=a.evaluate(b);return a instanceof G?db(a):\"\"+a}functio",
    "n hb(a,b){a=a.evaluate(b);return a instanceof G?!!a.s():!!a};function i",
    "b(a,b,c){I.call(this,a.f);this.V=a;this.ca=b;this.ia=c;this.v=b.c()||c.",
    "c();this.h=b.h||c.h;this.V==jb&&(c.h||c.c()||4==c.f||0==c.f||!b.A()?b.h",
    "||b.c()||4==b.f||0==b.f||!c.A()||(this.I={name:c.A().name,G:b}):this.I=",
    "{name:b.A().name,G:c})}q(ib,I);\nfunction kb(a,b,c,d,e){b=b.evaluate(d)",
    ";c=c.evaluate(d);var f;if(b instanceof G&&c instanceof G){b=b.iterator(",
    ");for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next(",
    "))if(a(F(d),F(f)))return!0;return!1}if(b instanceof G||c instanceof G){",
    "b instanceof G?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,k=",
    "f.next();k;k=f.next()){switch(g){case \"number\":k=+F(k);break;case \"b",
    "oolean\":k=!!F(k);break;case \"string\":k=F(k);break;default:throw Erro",
    "r(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(k,d)||e==c&",
    "&a(d,k))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==",
    "typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c)",
    ":a(b,c):a(+b,+c)}ib.prototype.evaluate=function(a){return this.V.o(this",
    ".ca,this.ia,a)};ib.prototype.toString=function(){var a=\"Binary Express",
    "ion: \"+this.V,a=a+J(this.ca);return a+=J(this.ia)};function lb(a,b,c,d",
    "){this.ta=a;this.ga=b;this.f=c;this.o=d}lb.prototype.toString=function(",
    "){return this.ta};var mb={};\nfunction N(a,b,c,d){if(mb.hasOwnProperty(",
    "a))throw Error(\"Binary operator already created: \"+a);a=new lb(a,b,c,",
    "d);return mb[a.toString()]=a}N(\"div\",6,1,function(a,b,c){return K(a,c",
    ")/K(b,c)});N(\"mod\",6,1,function(a,b,c){return K(a,c)%K(b,c)});N(\"*\"",
    ",6,1,function(a,b,c){return K(a,c)*K(b,c)});N(\"+\",5,1,function(a,b,c)",
    "{return K(a,c)+K(b,c)});N(\"-\",5,1,function(a,b,c){return K(a,c)-K(b,c",
    ")});N(\"<\",4,2,function(a,b,c){return kb(function(a,b){return a<b},a,b",
    ",c)});\nN(\">\",4,2,function(a,b,c){return kb(function(a,b){return a>b}",
    ",a,b,c)});N(\"<=\",4,2,function(a,b,c){return kb(function(a,b){return a",
    "<=b},a,b,c)});N(\">=\",4,2,function(a,b,c){return kb(function(a,b){retu",
    "rn a>=b},a,b,c)});var jb=N(\"=\",3,2,function(a,b,c){return kb(function",
    "(a,b){return a==b},a,b,c,!0)});N(\"!=\",3,2,function(a,b,c){return kb(f",
    "unction(a,b){return a!=b},a,b,c,!0)});N(\"and\",2,2,function(a,b,c){ret",
    "urn hb(a,c)&&hb(b,c)});N(\"or\",1,2,function(a,b,c){return hb(a,c)||hb(",
    "b,c)});function nb(a,b){if(b.s()&&4!=a.f)throw Error(\"Primary expressi",
    "on must evaluate to nodeset if filter has predicate(s).\");I.call(this,",
    "a.f);this.ha=a;this.b=b;this.v=a.c();this.h=a.h}q(nb,I);nb.prototype.ev",
    "aluate=function(a){a=this.ha.evaluate(a);return ob(this.b,a)};nb.protot",
    "ype.toString=function(){var a=\"Filter:\"+J(this.ha);return a+=J(this.b",
    ")};function pb(a,b){if(b.length<a.fa)throw Error(\"Function \"+a.i+\" e",
    "xpects at least\"+a.fa+\" arguments, \"+b.length+\" given\");if(null!==",
    "a.U&&b.length>a.U)throw Error(\"Function \"+a.i+\" expects at most \"+a",
    ".U+\" arguments, \"+b.length+\" given\");a.ra&&t(b,function(b,d){if(4!=",
    "b.f)throw Error(\"Argument \"+d+\" to function \"+a.i+\" is not of type",
    " Nodeset: \"+b);});I.call(this,a.f);this.L=a;this.R=b;fb(this,a.v||ra(b",
    ",function(a){return a.c()}));gb(this,a.pa&&!b.length||a.oa&&!!b.length|",
    "|ra(b,function(a){return a.h}))}\nq(pb,I);pb.prototype.evaluate=functio",
    "n(a){return this.L.o.apply(null,ua(a,this.R))};pb.prototype.toString=fu",
    "nction(){var a=\"Function: \"+this.L;if(this.R.length)var b=qa(this.R,f",
    "unction(a,b){return a+J(b)},\"Arguments:\"),a=a+J(b);return a};function",
    " qb(a,b,c,d,e,f,g,k,u){this.i=a;this.f=b;this.v=c;this.pa=d;this.oa=e;t",
    "his.o=f;this.fa=g;this.U=l(k)?k:g;this.ra=!!u}qb.prototype.toString=fun",
    "ction(){return this.i};var rb={};\nfunction O(a,b,c,d,e,f,g,k){if(rb.ha",
    "sOwnProperty(a))throw Error(\"Function already created: \"+a+\".\");rb[",
    "a]=new qb(a,b,c,d,!1,e,f,g,k)}O(\"boolean\",2,!1,!1,function(a,b){retur",
    "n hb(b,a)},1);O(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(K(b,",
    "a))},1);O(\"concat\",3,!1,!1,function(a,b){return qa(wa(arguments,1),fu",
    "nction(b,d){return b+M(d,a)},\"\")},2,null);O(\"contains\",2,!1,!1,func",
    "tion(a,b,c){b=M(b,a);a=M(c,a);return-1!=b.indexOf(a)},2);O(\"count\",1,",
    "!1,!1,function(a,b){return b.evaluate(a).s()},1,1,!0);\nO(\"false\",2,!",
    "1,!1,function(){return!1},0);O(\"floor\",1,!1,!1,function(a,b){return M",
    "ath.floor(K(b,a))},1);O(\"id\",4,!1,!1,function(a,b){var c=a.m,d=9==c.n",
    "odeType?c:c.ownerDocument;a=M(b,a).split(/\\s+/);var e=[];t(a,function(",
    "a){a=d.getElementById(a);!a||0<=oa(e,a)||e.push(a)});e.sort(La);var f=n",
    "ew G;t(e,function(a){f.add(a)});return f},1);O(\"lang\",2,!1,!1,functio",
    "n(){return!1},1);O(\"last\",1,!0,!1,function(a){if(1!=arguments.length)",
    "throw Error(\"Function last expects ()\");return a.j},0);\nO(\"local-na",
    "me\",3,!1,!0,function(a,b){return(a=b?cb(b.evaluate(a)):a.m)?a.localNam",
    "e||a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"name\",3,!1,!0,function(a",
    ",b){return(a=b?cb(b.evaluate(a)):a.m)?a.nodeName.toLowerCase():\"\"},0,",
    "1,!0);O(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);O(\"no",
    "rmalize-space\",3,!1,!0,function(a,b){return(b?M(b,a):F(a.m)).replace(/",
    "[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);O(\"not\",2,!1,",
    "!1,function(a,b){return!hb(b,a)},1);\nO(\"number\",1,!1,!0,function(a,b",
    "){return b?K(b,a):+F(a.m)},0,1);O(\"position\",1,!0,!1,function(a){retu",
    "rn a.ua},0);O(\"round\",1,!1,!1,function(a,b){return Math.round(K(b,a))",
    "},1);O(\"starts-with\",2,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);return",
    " 0==b.lastIndexOf(a,0)},2);O(\"string\",3,!1,!0,function(a,b){return b?",
    "M(b,a):F(a.m)},0,1);O(\"string-length\",1,!1,!0,function(a,b){return(b?",
    "M(b,a):F(a.m)).length},0,1);\nO(\"substring\",3,!1,!1,function(a,b,c,d)",
    "{c=K(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?K(d,a):",
    "Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=",
    "Math.max(c,0);a=M(b,a);return Infinity==d?a.substring(e):a.substring(e,",
    "c+Math.round(d))},2,3);O(\"substring-after\",3,!1,!1,function(a,b,c){b=",
    "M(b,a);a=M(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)",
    "},2);\nO(\"substring-before\",3,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a)",
    ";a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);O(\"sum\",1,!1,!1",
    ",function(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.",
    "next())b+=+F(c);return b},1,1,!0);O(\"translate\",3,!1,!1,function(a,b,",
    "c,d){b=M(b,a);c=M(c,a);var e=M(d,a);d={};for(var f=0;f<c.length;f++)a=c",
    ".charAt(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b",
    ".charAt(f),c+=a in d?d[a]:a;return c},3);O(\"true\",2,!1,!1,function(){",
    "return!0},0);function H(a,b){this.la=a;this.da=l(b)?b:null;this.F=null;",
    "switch(a){case \"comment\":this.F=8;break;case \"text\":this.F=3;break;",
    "case \"processing-instruction\":this.F=7;break;case \"node\":break;defa",
    "ult:throw Error(\"Unexpected argument\");}}function sb(a){return\"comme",
    "nt\"==a||\"text\"==a||\"processing-instruction\"==a||\"node\"==a}H.prot",
    "otype.matches=function(a){return null===this.F||this.F==a.nodeType};H.p",
    "rototype.getName=function(){return this.la};\nH.prototype.toString=func",
    "tion(){var a=\"Kind Test: \"+this.la;null===this.da||(a+=J(this.da));re",
    "turn a};function tb(a){I.call(this,3);this.ka=a.substring(1,a.length-1)",
    "}q(tb,I);tb.prototype.evaluate=function(){return this.ka};tb.prototype.",
    "toString=function(){return\"Literal: \"+this.ka};function ub(a,b){this.",
    "i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml",
    "\";this.N=b?b.toLowerCase():a}ub.prototype.matches=function(a){var b=a.",
    "nodeType;if(1!=b&&2!=b)return!1;b=l(a.localName)?a.localName:a.nodeName",
    ";return\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.N?!0:this.",
    "N==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/199",
    "9/xhtml\")};ub.prototype.getName=function(){return this.i};\nub.prototy",
    "pe.toString=function(){return\"Name Test: \"+(\"http://www.w3.org/1999/",
    "xhtml\"==this.N?\"\":this.N+\":\")+this.i};function vb(a){I.call(this,1",
    ");this.ma=a}q(vb,I);vb.prototype.evaluate=function(){return this.ma};vb",
    ".prototype.toString=function(){return\"Number: \"+this.ma};function wb(",
    "a,b){I.call(this,a.f);this.aa=a;this.J=b;this.v=a.c();this.h=a.h;1==thi",
    "s.J.length&&(a=this.J[0],a.S||a.w!=xb||(a=a.P,\"*\"!=a.getName()&&(this",
    ".I={name:a.getName(),G:null})))}q(wb,I);function yb(){I.call(this,4)}q(",
    "yb,I);yb.prototype.evaluate=function(a){var b=new G;a=a.m;9==a.nodeType",
    "?b.add(a):b.add(a.ownerDocument);return b};yb.prototype.toString=functi",
    "on(){return\"Root Helper Expression\"};function zb(){I.call(this,4)}q(z",
    "b,I);zb.prototype.evaluate=function(a){var b=new G;b.add(a.m);return b}",
    ";\nzb.prototype.toString=function(){return\"Context Helper Expression\"",
    "};function Ab(a){return\"/\"==a||\"//\"==a}\nwb.prototype.evaluate=func",
    "tion(a){var b=this.aa.evaluate(a);if(!(b instanceof G))throw Error(\"Fi",
    "lter expression must evaluate to nodeset.\");a=this.J;for(var c=0,d=a.l",
    "ength;c<d&&b.s();c++){var e=a[c],f=b.iterator(e.w.D);if(e.c()||e.w!=Bb)",
    "if(e.c()||e.w!=Cb){var g=f.next();for(b=e.evaluate(new Sa(g));null!=(g=",
    "f.next());)g=e.evaluate(new Sa(g)),b=bb(b,g)}else g=f.next(),b=e.evalua",
    "te(new Sa(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contain",
    "s(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new Sa(g))}}ret",
    "urn b};\nwb.prototype.toString=function(){var a=\"Path Expression:\"+J(",
    "this.aa);if(this.J.length){var b=qa(this.J,function(a,b){return a+J(b)}",
    ",\"Steps:\");a+=J(b)}return a};function P(a,b){this.b=a;this.D=!!b}func",
    "tion ob(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterato",
    "r(),f=b.s(),g,k=0;g=e.next();k++){var u=a.D?f-k:k+1;g=d.evaluate(new Sa",
    "(g,u,f));if(\"number\"==typeof g)u=u==g;else if(\"string\"==typeof g||",
    "\"boolean\"==typeof g)u=!!g;else if(g instanceof G)u=0<g.s();else throw",
    " Error(\"Predicate.evaluate returned an unexpected type.\");u||e.remove",
    "()}return b}P.prototype.A=function(){return 0<this.b.length?this.b[0].A",
    "():null};\nP.prototype.c=function(){for(var a=0;a<this.b.length;a++){va",
    "r b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};P.prototype.s",
    "=function(){return this.b.length};P.prototype.toString=function(){retur",
    "n qa(this.b,function(a,b){return a+J(b)},\"Predicates:\")};function Q(a",
    ",b,c,d){I.call(this,4);this.w=a;this.P=b;this.b=c||new P([]);this.S=!!d",
    ";b=this.b.A();a.va&&b&&(this.I={name:b.name,G:b.G});this.v=this.b.c()}q",
    "(Q,I);\nQ.prototype.evaluate=function(a){var b=a.m,c=this.A(),d=null,e=",
    "null,f=0;c&&(d=c.name,e=c.G?M(c.G,a):null,f=1);if(this.S)if(this.c()||t",
    "his.w!=Db)if(b=(new Q(Eb,new H(\"node\"))).evaluate(a).iterator(),c=b.n",
    "ext())for(a=this.o(c,d,e,f);null!=(c=b.next());)a=bb(a,this.o(c,d,e,f))",
    ";else a=new G;else a=Ya(this.P,b,d,e),a=ob(this.b,a,f);else a=this.o(a.",
    "m,d,e,f);return a};Q.prototype.o=function(a,b,c,d){a=this.w.L(this.P,a,",
    "b,c);return a=ob(this.b,a,d)};\nQ.prototype.toString=function(){var a=",
    "\"Step:\"+J(\"Operator: \"+(this.S?\"//\":\"/\"));this.w.i&&(a+=J(\"Axi",
    "s: \"+this.w));a+=J(this.P);if(this.b.s()){var b=qa(this.b.b,function(a",
    ",b){return a+J(b)},\"Predicates:\");a+=J(b)}return a};function Fb(a,b,c",
    ",d){this.i=a;this.L=b;this.D=c;this.va=d}Fb.prototype.toString=function",
    "(){return this.i};var Gb={};function R(a,b,c,d){if(Gb.hasOwnProperty(a)",
    ")throw Error(\"Axis already created: \"+a);b=new Fb(a,b,c,!!d);return G",
    "b[a]=b}\nR(\"ancestor\",function(a,b){for(var c=new G;b=b.parentNode;)a",
    ".matches(b)&&c.unshift(b);return c},!0);R(\"ancestor-or-self\",function",
    "(a,b){var c=new G;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);r",
    "eturn c},!0);\nvar xb=R(\"attribute\",function(a,b){var c=new G,d=a.get",
    "Name();if(b=b.attributes)if(a instanceof H&&null===a.F||\"*\"==d)for(d=",
    "0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1)",
    ",Db=R(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||ne",
    "w G;for(b=b.firstChild;b;b=b.nextSibling)Xa(b,c,d)&&a.matches(b)&&e.add",
    "(b);return e},!1,!0);R(\"descendant\",Ya,!1,!0);\nvar Eb=R(\"descendant",
    "-or-self\",function(a,b,c,d){var e=new G;Xa(b,c,d)&&a.matches(b)&&e.add",
    "(b);return Ya(a,b,c,d,e)},!1,!0),Bb=R(\"following\",function(a,b,c,d){v",
    "ar e=new G;do for(var f=b;f=f.nextSibling;)Xa(f,c,d)&&a.matches(f)&&e.a",
    "dd(f),e=Ya(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);R(\"follow",
    "ing-sibling\",function(a,b){for(var c=new G;b=b.nextSibling;)a.matches(",
    "b)&&c.add(b);return c},!1);R(\"namespace\",function(){return new G},!1)",
    ";\nvar Hb=R(\"parent\",function(a,b){var c=new G;if(9==b.nodeType)retur",
    "n c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.ma",
    "tches(b)&&c.add(b);return c},!1),Cb=R(\"preceding\",function(a,b,c,d){v",
    "ar e=new G,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,k=f.l",
    "ength;g<k;g++){var u=[];for(b=f[g];b=b.previousSibling;)u.unshift(b);fo",
    "r(var D=0,r=u.length;D<r;D++)b=u[D],Xa(b,c,d)&&a.matches(b)&&e.add(b),e",
    "=Ya(a,b,c,d,e)}return e},!0,!0);\nR(\"preceding-sibling\",function(a,b)",
    "{for(var c=new G;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return",
    " c},!0);var Ib=R(\"self\",function(a,b){var c=new G;a.matches(b)&&c.add",
    "(b);return c},!1);function Jb(a){I.call(this,1);this.$=a;this.v=a.c();t",
    "his.h=a.h}q(Jb,I);Jb.prototype.evaluate=function(a){return-K(this.$,a)}",
    ";Jb.prototype.toString=function(){return\"Unary Expression: -\"+J(this.",
    "$)};function Kb(a){I.call(this,4);this.O=a;fb(this,ra(this.O,function(a",
    "){return a.c()}));gb(this,ra(this.O,function(a){return a.h}))}q(Kb,I);K",
    "b.prototype.evaluate=function(a){var b=new G;t(this.O,function(c){c=c.e",
    "valuate(a);if(!(c instanceof G))throw Error(\"Path expression must eval",
    "uate to NodeSet.\");b=bb(b,c)});return b};Kb.prototype.toString=functio",
    "n(){return qa(this.O,function(a,b){return a+J(b)},\"Union Expression:\"",
    ")};function Lb(a,b){this.a=a;this.sa=b}function Mb(a){for(var b,c=[];;)",
    "{S(a,\"Missing right hand side of binary expression.\");b=Nb(a);var d=a",
    ".a.next();if(!d)break;var e=(d=mb[d]||null)&&d.ga;if(!e){a.a.back();bre",
    "ak}for(;c.length&&e<=c[c.length-1].ga;)b=new ib(c.pop(),c.pop(),b);c.pu",
    "sh(b,d)}for(;c.length;)b=new ib(c.pop(),c.pop(),b);return b}function S(",
    "a,b){if(a.a.empty())throw Error(b);}function Ob(a,b){a=a.a.next();if(a!",
    "=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction Pb",
    "(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function Q",
    "b(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\"",
    ");return new tb(a)}\nfunction Rb(a){var b=[];if(Ab(E(a.a))){var c=a.a.n",
    "ext();var d=E(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@",
    "\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new yb;d=new yb;S(a,",
    "\"Missing next location step.\");c=Sb(a,c);b.push(c)}else{a:{c=E(a.a);d",
    "=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable reference not ",
    "allowed in HTML XPath\");case \"(\":a.a.next();c=Mb(a);S(a,'unclosed \"",
    "(\"');Ob(a,\")\");break;case '\"':case \"'\":c=Qb(a);break;default:if(i",
    "sNaN(+c))if(!sb(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==E(a.a,\n1)){c=a.a.",
    "next();c=rb[c]||null;a.a.next();for(d=[];\")\"!=E(a.a);){S(a,\"Missing ",
    "function argument list.\");d.push(Mb(a));if(\",\"!=E(a.a))break;a.a.nex",
    "t()}S(a,\"Unclosed function argument list.\");Pb(a);c=new pb(c,d)}else{",
    "c=null;break a}else c=new vb(+a.a.next())}\"[\"==E(a.a)&&(d=new P(Tb(a)",
    "),c=new nb(c,d))}if(c)if(Ab(E(a.a)))d=c;else return c;else c=Sb(a,\"/\"",
    "),d=new zb,b.push(c)}for(;Ab(E(a.a));)c=a.a.next(),S(a,\"Missing next l",
    "ocation step.\"),c=Sb(a,c),b.push(c);return new wb(d,b)}\nfunction Sb(a",
    ",b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//",
    "\"');if(\".\"==E(a.a)){var c=new Q(Ib,new H(\"node\"));a.a.next();retur",
    "n c}if(\"..\"==E(a.a))return c=new Q(Hb,new H(\"node\")),a.a.next(),c;i",
    "f(\"@\"==E(a.a)){var d=xb;a.a.next();S(a,\"Missing attribute name\")}el",
    "se if(\"::\"==E(a.a,1)){if(!/(?![0-9])[\\w]/.test(E(a.a).charAt(0)))thr",
    "ow Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=Gb[e]||null;if(",
    "!d)throw Error(\"No axis with name: \"+e);a.a.next();S(a,\"Missing node",
    " name\")}else d=Db;e=\nE(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))",
    "if(\"(\"==E(a.a,1)){if(!sb(e))throw Error(\"Invalid node type: \"+e);e=",
    "a.a.next();if(!sb(e))throw Error(\"Invalid type name: \"+e);Ob(a,\"(\")",
    ";S(a,\"Bad nodetype\");var f=E(a.a).charAt(0),g=null;if('\"'==f||\"'\"=",
    "=f)g=Qb(a);S(a,\"Bad nodetype\");Pb(a);e=new H(e,g)}else if(e=a.a.next(",
    "),f=e.indexOf(\":\"),-1==f)e=new ub(e);else{var g=e.substring(0,f);if(",
    "\"*\"==g)var k=\"*\";else if(k=a.sa(g),!k)throw Error(\"Namespace prefi",
    "x not declared: \"+g);e=e.substr(f+1);e=new ub(e,k)}else throw Error(\"",
    "Bad token: \"+\na.a.next());a=new P(Tb(a),d.D);return c||new Q(d,e,a,\"",
    "//\"==b)}function Tb(a){for(var b=[];\"[\"==E(a.a);){a.a.next();S(a,\"M",
    "issing predicate expression.\");var c=Mb(a);b.push(c);S(a,\"Unclosed pr",
    "edicate expression.\");Ob(a,\"]\")}return b}function Nb(a){if(\"-\"==E(",
    "a.a))return a.a.next(),new Jb(Nb(a));var b=Rb(a);if(\"|\"!=E(a.a))a=b;e",
    "lse{for(b=[b];\"|\"==a.a.next();)S(a,\"Missing next union location path",
    ".\"),b.push(Rb(a));a.a.back();a=new Kb(b)}return a};function Ub(a){swit",
    "ch(a.nodeType){case 1:return ia(Vb,a);case 9:return Ub(a.documentElemen",
    "t);case 11:case 10:case 6:case 12:return Wb;default:return a.parentNode",
    "?Ub(a.parentNode):Wb}}function Wb(){return null}function Vb(a,b){if(a.p",
    "refix==b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=",
    "a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.",
    "parentNode&&9!=a.parentNode.nodeType?Vb(a.parentNode,b):null};function ",
    "Xb(a,b){if(!a.length)throw Error(\"Empty XPath expression.\");a=Ua(a);i",
    "f(a.empty())throw Error(\"Invalid XPath expression.\");b?p(b)||(b=ha(b.",
    "lookupNamespaceURI,b)):b=function(){return null};var c=Mb(new Lb(a,b));",
    "if(!a.empty())throw Error(\"Bad token: \"+a.next());this.evaluate=funct",
    "ion(a,b){a=c.evaluate(new Sa(a));return new T(a,b)}}\nfunction T(a,b){i",
    "f(0==b)if(a instanceof G)b=4;else if(\"string\"==typeof a)b=2;else if(",
    "\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw E",
    "rror(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instan",
    "ceof G))throw Error(\"value could not be converted to the specified typ",
    "e\");this.resultType=b;switch(b){case 2:this.stringValue=a instanceof G",
    "?db(a):\"\"+a;break;case 1:this.numberValue=a instanceof G?+db(a):+a;br",
    "eak;case 3:this.booleanValue=a instanceof G?0<a.s():!!a;break;case 4:ca",
    "se 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e",
    "=c.next())d.push(e);this.snapshotLength=a.s();this.invalidIteratorState",
    "=!1;break;case 8:case 9:this.singleNodeValue=cb(a);break;default:throw ",
    "Error(\"Unknown XPathResult type.\");}var f=0;this.iterateNext=function",
    "(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wrong result typ",
    "e\");return f>=d.length?null:d[f++]};this.snapshotItem=function(a){if(6",
    "!=b&&7!=b)throw Error(\"snapshotItem called with wrong result type\");r",
    "eturn a>=d.length||0>a?null:d[a]}}\nT.ANY_TYPE=0;T.NUMBER_TYPE=1;T.STRI",
    "NG_TYPE=2;T.BOOLEAN_TYPE=3;T.UNORDERED_NODE_ITERATOR_TYPE=4;T.ORDERED_N",
    "ODE_ITERATOR_TYPE=5;T.UNORDERED_NODE_SNAPSHOT_TYPE=6;T.ORDERED_NODE_SNA",
    "PSHOT_TYPE=7;T.ANY_UNORDERED_NODE_TYPE=8;T.FIRST_ORDERED_NODE_TYPE=9;fu",
    "nction Yb(a){this.lookupNamespaceURI=Ub(a)}\nba(\"wgxpath.install\",fun",
    "ction(a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.document;i",
    "f(!c.evaluate||b)a.XPathResult=T,c.evaluate=function(a,b,c,g){return(ne",
    "w Xb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){return new X",
    "b(a,b)},c.createNSResolver=function(a){return new Yb(a)}});var U={};U.X",
    "=function(){var a={ya:\"http://www.w3.org/2000/svg\"};return function(b",
    "){return a[b]||null}}();\nU.o=function(a,b,c){var d=z(a);if(!d.document",
    "Element)return null;try{for(var e=d.createNSResolver?d.createNSResolver",
    "(d.documentElement):U.X,f={},g=d.getElementsByTagName(\"*\"),k=0;k<g.le",
    "ngth;++k){var u=g[k],D=u.namespaceURI;if(D&&!f[D]){var r=u.lookupPrefix",
    "(D);if(!r)var A=D.match(\".*/(\\\\w+)/?$\"),r=A?A[1]:\"xhtml\";f[D]=r}}",
    "var L={},W;for(W in f)L[f[W]]=W;e=function(a){return L[a]||null};try{re",
    "turn d.evaluate(b,a,e,c,null)}catch(Da){if(\"TypeError\"===Da.name)retu",
    "rn e=d.createNSResolver?d.createNSResolver(d.documentElement):\nU.X,d.e",
    "valuate(b,a,e,c,null);throw Da;}}catch(Da){throw new v(32,\"Unable to l",
    "ocate an element with the xpath expression \"+b+\" because of the follo",
    "wing error:\\n\"+Da);}};U.Y=function(a,b){if(!a||1!=a.nodeType)throw ne",
    "w v(32,'The result of the xpath expression \"'+b+'\" is: '+a+\". It sho",
    "uld be an element.\");};\nU.u=function(a,b){var c=function(){var c=U.o(",
    "b,a,9);return c?c.singleNodeValue||null:b.selectSingleNode?(c=z(b),c.se",
    "tProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selectSingl",
    "eNode(a)):null}();null===c||U.Y(c,a);return c};\nU.l=function(a,b){var ",
    "c=function(){var c=U.o(b,a,7);if(c){for(var e=c.snapshotLength,f=[],g=0",
    ";g<e;++g)f.push(c.snapshotItem(g));return f}return b.selectNodes?(c=z(b",
    "),c.setProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selec",
    "tNodes(a)):[]}();t(c,function(b){U.Y(b,a)});return c};function Zb(a,b,c",
    ",d){this.top=a;this.right=b;this.bottom=c;this.left=d}h=Zb.prototype;h.",
    "clone=function(){return new Zb(this.top,this.right,this.bottom,this.lef",
    "t)};h.toString=function(){return\"(\"+this.top+\"t, \"+this.right+\"r, ",
    "\"+this.bottom+\"b, \"+this.left+\"l)\"};h.contains=function(a){return ",
    "this&&a?a instanceof Zb?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>=t",
    "his.top&&a.y<=this.bottom:!1};\nh.expand=function(a,b,c,d){ea(a)?(this.",
    "top-=a.top,this.right+=a.right,this.bottom+=a.bottom,this.left-=a.left)",
    ":(this.top-=a,this.right+=Number(b),this.bottom+=Number(c),this.left-=N",
    "umber(d));return this};h.ceil=function(){this.top=Math.ceil(this.top);t",
    "his.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this",
    ".left=Math.ceil(this.left);return this};\nh.floor=function(){this.top=M",
    "ath.floor(this.top);this.right=Math.floor(this.right);this.bottom=Math.",
    "floor(this.bottom);this.left=Math.floor(this.left);return this};h.round",
    "=function(){this.top=Math.round(this.top);this.right=Math.round(this.ri",
    "ght);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left",
    ");return this};h.translate=function(a,b){a instanceof x?(this.left+=a.x",
    ",this.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.rig",
    "ht+=a,n(b)&&(this.top+=b,this.bottom+=b));return this};\nh.scale=functi",
    "on(a,b){b=n(b)?b:a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=",
    "b;return this};function V(a,b,c,d){this.left=a;this.top=b;this.width=c;",
    "this.height=d}h=V.prototype;h.clone=function(){return new V(this.left,t",
    "his.top,this.width,this.height)};h.toString=function(){return\"(\"+this",
    ".left+\", \"+this.top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};h",
    ".contains=function(a){return a instanceof x?a.x>=this.left&&a.x<=this.l",
    "eft+this.width&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.l",
    "eft&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+th",
    "is.height>=a.top+a.height};\nh.ceil=function(){this.left=Math.ceil(this",
    ".left);this.top=Math.ceil(this.top);this.width=Math.ceil(this.width);th",
    "is.height=Math.ceil(this.height);return this};h.floor=function(){this.l",
    "eft=Math.floor(this.left);this.top=Math.floor(this.top);this.width=Math",
    ".floor(this.width);this.height=Math.floor(this.height);return this};h.r",
    "ound=function(){this.left=Math.round(this.left);this.top=Math.round(thi",
    "s.top);this.width=Math.round(this.width);this.height=Math.round(this.he",
    "ight);return this};\nh.translate=function(a,b){a instanceof x?(this.lef",
    "t+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(this.top+=b));return this};h",
    ".scale=function(a,b){b=n(b)?b:a;this.left*=a;this.width*=a;this.top*=b;",
    "this.height*=b;return this};var $b=\"function\"===typeof ShadowRoot;fun",
    "ction ac(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.n",
    "odeType;)a=a.parentNode;return C(a)?a:null}\nfunction X(a,b){b=na(b);if",
    "(\"float\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat\";a:{var",
    " c=b;var d=z(a);if(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.",
    "defaultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||",
    "\"\";break a}c=\"\"}a=c||bc(a,b);if(null===a)a=null;else if(0<=oa(ya,b)",
    "){b:{var e=a.match(Ba);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[",
    "3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e",
    ")){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(Ca))if(b=Number(d[1",
    "]),\nc=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&25",
    "5>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=xa[b.toLo",
    "werCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&(c=c.rep",
    "lace(za,\"#$1$1$2$2$3$3\")),!Aa.test(c))){b=null;break b}b=[parseInt(c.",
    "substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1",
    "]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return a}\nfunction bc(a,b){var ",
    "c=a.currentStyle||a.style,d=c[b];!l(d)&&p(c.getPropertyValue)&&(d=c.get",
    "PropertyValue(b));return\"inherit\"!=d?l(d)?d:null:(a=ac(a))?bc(a,b):nu",
    "ll}\nfunction cc(a,b,c){function d(a){var b=dc(a);return 0<b.height&&0<",
    "b.width?!0:C(a,\"PATH\")&&(0<b.height||0<b.width)?(a=X(a,\"stroke-width",
    "\"),!!a&&0<parseInt(a,10)):\"hidden\"!=X(a,\"overflow\")&&ra(a.childNod",
    "es,function(a){return 3==a.nodeType||C(a)&&d(a)})}function e(a){return ",
    "ec(a)==Y&&sa(a.childNodes,function(a){return!C(a)||e(a)||!d(a)})}if(!C(",
    "a))throw Error(\"Argument to isShown must be of type Element\");if(C(a,",
    "\"BODY\"))return!0;if(C(a,\"OPTION\")||C(a,\"OPTGROUP\"))return a=Oa(a,",
    "function(a){return C(a,\"SELECT\")}),\n!!a&&cc(a,!0,c);var f=fc(a);if(f",
    ")return!!f.ba&&0<f.rect.width&&0<f.rect.height&&cc(f.ba,b,c);if(C(a,\"I",
    "NPUT\")&&\"hidden\"==a.type.toLowerCase()||C(a,\"NOSCRIPT\"))return!1;f",
    "=X(a,\"visibility\");return\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!",
    "=gc(a))&&d(a)?!e(a):!1}\nfunction hc(a){function b(a){if(C(a)&&\"none\"",
    "==X(a,\"display\"))return!1;a:{var c=a.parentNode;if(a.getDestinationIn",
    "sertionPoints){var e=a.getDestinationInsertionPoints();if(0<e.length){a",
    "=e[e.length-1];break a}}a=c&&c.shadowRoot&&void 0!==a.assignedSlot?a.as",
    "signedSlot?a.assignedSlot.parentNode:null:c}return $b&&a instanceof Sha",
    "dowRoot||a&&(9==a.nodeType||11==a.nodeType)?!0:!!a&&b(a)}return cc(a,!1",
    ",b)}var Y=\"hidden\";\nfunction ec(a){function b(a){function b(a){retur",
    "n a==g?!0:0==X(a,\"display\").lastIndexOf(\"inline\",0)||\"absolute\"==",
    "c&&\"static\"==X(a,\"position\")?!1:!0}var c=X(a,\"position\");if(\"fix",
    "ed\"==c)return D=!0,a==g?null:g;for(a=ac(a);a&&!b(a);)a=ac(a);return a}",
    "function c(a){var b=a;if(\"visible\"==u)if(a==g&&k)b=k;else if(a==k)ret",
    "urn{x:\"visible\",y:\"visible\"};b={x:X(b,\"overflow-x\"),y:X(b,\"overf",
    "low-y\")};a==g&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y",
    "?\"auto\":b.y);return b}function d(a){if(a==g){var b=(new Ga(f)).C;\na=",
    "b.scrollingElement?b.scrollingElement:b.body||b.documentElement;b=b.par",
    "entWindow||b.defaultView;a=new x(b.pageXOffset||a.scrollLeft,b.pageYOff",
    "set||a.scrollTop)}else a=new x(a.scrollLeft,a.scrollTop);return a}var e",
    "=ic(a);var f=z(a),g=f.documentElement,k=f.body,u=X(g,\"overflow\"),D;fo",
    "r(a=b(a);a;a=b(a)){var r=c(a);if(\"visible\"!=r.x||\"visible\"!=r.y){va",
    "r A=dc(a);if(0==A.width||0==A.height)return Y;var L=e.right<A.left,W=e.",
    "bottom<A.top;if(L&&\"hidden\"==r.x||W&&\"hidden\"==r.y)return Y;if(L&&",
    "\"visible\"!=r.x||\nW&&\"visible\"!=r.y){L=d(a);W=e.bottom<A.top-L.y;if",
    "(e.right<A.left-L.x&&\"visible\"!=r.x||W&&\"visible\"!=r.x)return Y;e=e",
    "c(a);return e==Y?Y:\"scroll\"}L=e.left>=A.left+A.width;A=e.top>=A.top+A",
    ".height;if(L&&\"hidden\"==r.x||A&&\"hidden\"==r.y)return Y;if(L&&\"visi",
    "ble\"!=r.x||A&&\"visible\"!=r.y){if(D&&(r=d(a),e.left>=g.scrollWidth-r.",
    "x||e.right>=g.scrollHeight-r.y))return Y;e=ec(a);return e==Y?Y:\"scroll",
    "\"}}}return\"none\"}\nfunction dc(a){var b=fc(a);if(b)return b.rect;if(",
    "C(a,\"HTML\"))return a=z(a),a=((a?a.parentWindow||a.defaultView:window)",
    "||window).document,a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.b",
    "ody,a=new Fa(a.clientWidth,a.clientHeight),new V(0,0,a.width,a.height);",
    "try{var c=a.getBoundingClientRect()}catch(d){return new V(0,0,0,0)}retu",
    "rn new V(c.left,c.top,c.right-c.left,c.bottom-c.top)}\nfunction fc(a){v",
    "ar b=C(a,\"MAP\");if(!b&&!C(a,\"AREA\"))return null;var c=b?a:C(a.paren",
    "tNode,\"MAP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=U.u('/desc",
    "endant::*[@usemap = \"#'+c.name+'\"]',z(c)))&&(e=dc(d),b||\"default\"==",
    "a.shape.toLowerCase()||(a=jc(a),b=Math.min(Math.max(a.left,0),e.width),",
    "c=Math.min(Math.max(a.top,0),e.height),e=new V(b+e.left,c+e.top,Math.mi",
    "n(a.width,e.width-b),Math.min(a.height,e.height-c))));return{ba:d,rect:",
    "e||new V(0,0,0,0)}}\nfunction jc(a){var b=a.shape.toLowerCase();a=a.coo",
    "rds.split(\",\");if(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return ",
    "new V(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],ne",
    "w V(a[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c",
    "=a[1],d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f",
    "]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new V(b,c,d-b,e-c)}",
    "return new V(0,0,0,0)}function ic(a){a=dc(a);return new Zb(a.top,a.left",
    "+a.width,a.top+a.height,a.left)}\nfunction kc(a){return a.replace(/^[^",
    "\\S\\xa0]+|[^\\S\\xa0]+$/g,\"\")}function lc(a){var b=[];$b?mc(a,b):nc(",
    "a,b);var c=b;a=c.length;for(var b=Array(a),c=m(c)?c.split(\"\"):c,d=0;d",
    "<a;d++)d in c&&(b[d]=kc.call(void 0,c[d]));return kc(b.join(\"\\n\")).r",
    "eplace(/\\xa0/g,\" \")}\nfunction oc(a,b,c){if(C(a,\"BR\"))b.push(\"\")",
    ";else{var d=C(a,\"TD\"),e=X(a,\"display\"),f=!d&&!(0<=oa(pc,e)),g=l(a.p",
    "reviousElementSibling)?a.previousElementSibling:Ja(a.previousSibling),g",
    "=g?X(g,\"display\"):\"\",k=X(a,\"float\")||X(a,\"cssFloat\")||X(a,\"sty",
    "leFloat\");!f||\"run-in\"==g&&\"none\"==k||/^[\\s\\xa0]*$/.test(b[b.len",
    "gth-1]||\"\")||b.push(\"\");var u=hc(a),D=null,r=null;u&&(D=X(a,\"white",
    "-space\"),r=X(a,\"text-transform\"));t(a.childNodes,function(a){c(a,b,u",
    ",D,r)});a=b[b.length-1]||\"\";!d&&\"table-cell\"!=e||!a||la(a)||(b[b.le",
    "ngth-\n1]+=\" \");f&&\"run-in\"!=e&&!/^[\\s\\xa0]*$/.test(a)&&b.push(\"",
    "\")}}function nc(a,b){oc(a,b,function(a,b,e,f,g){3==a.nodeType&&e?qc(a,",
    "b,f,g):C(a)&&nc(a,b)})}var pc=\"inline inline-block inline-table none t",
    "able-cell table-column table-column-group\".split(\" \");\nfunction qc(",
    "a,b,c,d){a=a.nodeValue.replace(/[\\u200b\\u200e\\u200f]/g,\"\");a=a.rep",
    "lace(/(\\r\\n|\\r|\\n)/g,\"\\n\");if(\"normal\"==c||\"nowrap\"==c)a=a.r",
    "eplace(/\\n/g,\" \");a=\"pre\"==c||\"pre-wrap\"==c?a.replace(/[ \\f\\t",
    "\\v\\u2028\\u2029]/g,\"\\u00a0\"):a.replace(/[\\ \\f\\t\\v\\u2028\\u202",
    "9]+/g,\" \");\"capitalize\"==d?a=a.replace(/(^|\\s)(\\S)/g,function(a,b",
    ",c){return b+c.toUpperCase()}):\"uppercase\"==d?a=a.toUpperCase():\"low",
    "ercase\"==d&&(a=a.toLowerCase());c=b.pop()||\"\";la(c)&&0==a.lastIndexO",
    "f(\" \",0)&&(a=a.substr(1));b.push(c+a)}\nfunction gc(a){var b=1,c=X(a,",
    "\"opacity\");c&&(b=Number(c));(a=ac(a))&&(b*=gc(a));return b}\nfunction",
    " rc(a,b,c,d,e){var f;if(3==a.nodeType&&c)qc(a,b,d,e);else if(C(a))if(C(",
    "a,\"CONTENT\")||C(a,\"SLOT\")){for(f=a;f.parentNode;)f=f.parentNode;f i",
    "nstanceof ShadowRoot?(a=C(a,\"CONTENT\")?a.getDistributedNodes():a.assi",
    "gnedNodes(),t(a,function(a){rc(a,b,c,d,e)})):mc(a,b)}else if(C(a,\"SHAD",
    "OW\")){for(f=a;f.parentNode;)f=f.parentNode;if(f instanceof ShadowRoot&",
    "&(a=f))for(a=a.olderShadowRoot;a;)t(a.childNodes,function(a){rc(a,b,c,d",
    ",e)}),a=a.olderShadowRoot}else mc(a,b)}\nfunction mc(a,b){a.shadowRoot&",
    "&t(a.shadowRoot.childNodes,function(a){rc(a,b,!0,null,null)});oc(a,b,fu",
    "nction(a,b,e,f,g){var c=null;1==a.nodeType?c=a:3==a.nodeType&&(c=a);nul",
    "l!=c&&(null!=c.assignedSlot||c.getDestinationInsertionPoints&&0<c.getDe",
    "stinationInsertionPoints().length)||rc(a,b,e,f,g)})};var sc={K:function",
    "(a){return!(!a.querySelectorAll||!a.querySelector)},u:function(a,b){if(",
    "!a)throw new v(32,\"No class name specified\");a=ma(a);if(-1!==a.indexO",
    "f(\" \"))throw new v(32,\"Compound class names not permitted\");if(sc.K",
    "(b))try{return b.querySelector(\".\"+a.replace(/\\./g,\"\\\\.\"))||null",
    "}catch(c){throw new v(32,\"An invalid or illegal class name was specifi",
    "ed\");}a=B(y(b),\"*\",a,b);return a.length?a[0]:null},l:function(a,b){i",
    "f(!a)throw new v(32,\"No class name specified\");a=ma(a);if(-1!==a.inde",
    "xOf(\" \"))throw new v(32,\n\"Compound class names not permitted\");if(",
    "sc.K(b))try{return b.querySelectorAll(\".\"+a.replace(/\\./g,\"\\\\.\")",
    ")}catch(c){throw new v(32,\"An invalid or illegal class name was specif",
    "ied\");}return B(y(b),\"*\",a,b)}};var tc={u:function(a,b){p(b.querySel",
    "ector);if(!a)throw new v(32,\"No selector specified\");a=ma(a);try{var ",
    "c=b.querySelector(a)}catch(d){throw new v(32,\"An invalid or illegal se",
    "lector was specified\");}return c&&1==c.nodeType?c:null},l:function(a,b",
    "){p(b.querySelectorAll);if(!a)throw new v(32,\"No selector specified\")",
    ";a=ma(a);try{return b.querySelectorAll(a)}catch(c){throw new v(32,\"An ",
    "invalid or illegal selector was specified\");}}};var uc={K:function(a,b",
    "){return!(!a.querySelectorAll||!a.querySelector)&&!/^\\d.*/.test(b)},u:",
    "function(a,b){var c=y(b),d=m(a)?c.C.getElementById(a):a;return d?Pa(d,",
    "\"id\")==a&&b!=d&&Ka(b,d)?d:ta(B(c,\"*\"),function(c){return Pa(c,\"id",
    "\")==a&&b!=c&&Ka(b,c)}):null},l:function(a,b){if(!a)return[];if(uc.K(b,",
    "a))try{return b.querySelectorAll(\"#\"+uc.na(a))}catch(c){return[]}b=B(",
    "y(b),\"*\",null,b);return pa(b,function(b){return Pa(b,\"id\")==a})},na",
    ":function(a){return a.replace(/([\\s'\"\\\\#.:;,!?+<>=~*^$|%&@`{}\\-\\/",
    "\\[\\]\\(\\)])/g,\n\"\\\\$1\")}};var Z={},vc={};Z.ja=function(a,b,c){tr",
    "y{var d=tc.l(\"a\",b)}catch(e){d=B(y(b),\"A\",null,b)}return ta(d,funct",
    "ion(b){b=lc(b);b=b.replace(/^[\\s]+|[\\s]+$/g,\"\");return c&&-1!=b.ind",
    "exOf(a)||b==a})};Z.ea=function(a,b,c){try{var d=tc.l(\"a\",b)}catch(e){",
    "d=B(y(b),\"A\",null,b)}return pa(d,function(b){b=lc(b);b=b.replace(/^[",
    "\\s]+|[\\s]+$/g,\"\");return c&&-1!=b.indexOf(a)||b==a})};Z.u=function(",
    "a,b){return Z.ja(a,b,!1)};Z.l=function(a,b){return Z.ea(a,b,!1)};vc.u=f",
    "unction(a,b){return Z.ja(a,b,!0)};\nvc.l=function(a,b){return Z.ea(a,b,",
    "!0)};var wc={u:function(a,b){if(\"\"===a)throw new v(32,'Unable to loca",
    "te an element with the tagName \"\"');return b.getElementsByTagName(a)[",
    "0]||null},l:function(a,b){if(\"\"===a)throw new v(32,'Unable to locate ",
    "an element with the tagName \"\"');return b.getElementsByTagName(a)}};v",
    "ar xc={className:sc,\"class name\":sc,css:tc,\"css selector\":tc,id:uc,",
    "linkText:Z,\"link text\":Z,name:{u:function(a,b){b=B(y(b),\"*\",null,b)",
    ";return ta(b,function(b){return Pa(b,\"name\")==a})},l:function(a,b){b=",
    "B(y(b),\"*\",null,b);return pa(b,function(b){return Pa(b,\"name\")==a})",
    "}},partialLinkText:vc,\"partial link text\":vc,tagName:wc,\"tag name\":",
    "wc,xpath:U};function yc(a){for(var b in a)if(a.hasOwnProperty(b))return",
    " b;return null};var zc=\"function\"===typeof ShadowRoot;ba(\"_\",functi",
    "on(a,b){var c;a:{if(c=yc(a)){var d=xc[c];if(d&&p(d.u)){c=d.u(a[c],b||ja",
    ".document);break a}}throw new v(61,\"Unsupported locator strategy: \"+c",
    ");}if(c)return c;if(zc&&b){for(c=b;c.parentNode;)c=c.parentNode;if(c in",
    "stanceof ShadowRoot){a:{if((c=yc(a))&&(d=xc[c])&&p(d.l)){a=d.l(a[c],b||",
    "ja.document);break a}throw new v(61,\"Unsupported locator strategy: \"+",
    "c);}if(c=a[0])return c}}return null});; return this._.apply(null,argume",
    "nts);}.apply({navigator:typeof window!='undefined'?window.navigator:nul",
    "l,document:typeof window!='undefined'?window.document:null}, arguments)",
    ";}",
    NULL
};

const char* const GET_FIRST_CLIENT_RECT[] = {
    "function(){return function(){var h,aa=this;function k(a){return\"string",
    "\"==typeof a}function m(a){return\"number\"==typeof a}function ba(a,b){",
    "a=a.split(\".\");var c=aa;a[0]in c||!c.execScript||c.execScript(\"var ",
    "\"+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]",
    "&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b}\nfunction ca(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&&\"undefine",
    "d\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\")",
    ")return\"array\";if(\"[object Function]\"==c||\"undefined\"!=typeof a.c",
    "all&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumera",
    "ble(\"call\"))return\"function\"}else return\"null\";\nelse if(\"functi",
    "on\"==b&&\"undefined\"==typeof a.call)return\"object\";return b}functio",
    "n da(a,b,c){return a.call.apply(a.bind,arguments)}function ea(a,b,c){if",
    "(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.ca",
    "ll(arguments,2);return function(){var c=Array.prototype.slice.call(argu",
    "ments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return f",
    "unction(){return a.apply(b,arguments)}}\nfunction fa(a,b,c){fa=Function",
    ".prototype.bind&&-1!=Function.prototype.bind.toString().indexOf(\"nativ",
    "e code\")?da:ea;return fa.apply(null,arguments)}function ga(a,b){var c=",
    "Array.prototype.slice.call(arguments,1);return function(){var b=c.slice",
    "();b.push.apply(b,arguments);return a.apply(this,b)}}\nfunction n(a){va",
    "r b=p;function c(){}c.prototype=b.prototype;a.na=b.prototype;a.prototyp",
    "e=new c;a.prototype.constructor=a;a.ma=function(a,c,f){for(var d=Array(",
    "arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=arguments[e];retu",
    "rn b.prototype[c].apply(a,d)}};function q(a,b){for(var c=a.length,d=k(a",
    ")?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function ",
    "r(a,b,c){var d=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}",
    "function t(a,b){for(var c=a.length,d=k(a)?a.split(\"\"):a,e=0;e<c;e++)i",
    "f(e in d&&b.call(void 0,d[e],e,a))return!0;return!1}function ha(a){retu",
    "rn Array.prototype.concat.apply([],arguments)}function ia(a,b,c){return",
    " 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.sl",
    "ice.call(a,b,c)};function u(a,b){this.x=void 0!==a?a:0;this.y=void 0!==",
    "b?b:0}h=u.prototype;h.clone=function(){return new u(this.x,this.y)};h.t",
    "oString=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=funct",
    "ion(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.",
    "floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);re",
    "turn this};h.round=function(){this.x=Math.round(this.x);this.y=Math.rou",
    "nd(this.y);return this};\nh.translate=function(a,b){a instanceof u?(thi",
    "s.x+=a.x,this.y+=a.y):(this.x+=Number(a),m(b)&&(this.y+=b));return this",
    "};h.scale=function(a,b){b=m(b)?b:a;this.x*=a;this.y*=b;return this};fun",
    "ction ja(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a=",
    "=b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)re",
    "turn a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parent",
    "Node;return b==a}\nfunction ka(a,b){if(a==b)return 0;if(a.compareDocume",
    "ntPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex",
    "\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeTy",
    "pe,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.p",
    "arentNode,f=b.parentNode;return e==f?la(a,b):!c&&ja(e,b)?-1*ma(a,b):!d&",
    "&ja(f,a)?ma(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sou",
    "rceIndex)}d=9==a.nodeType?a:a.ownerDocument||a.document;c=d.createRange",
    "();c.selectNode(a);c.collapse(!0);\na=d.createRange();a.selectNode(b);a",
    ".collapse(!0);return c.compareBoundaryPoints(aa.Range.START_TO_END,a)}f",
    "unction ma(a,b){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=",
    "c;)b=b.parentNode;return la(b,a)}function la(a,b){for(;b=b.previousSibl",
    "ing;)if(b==a)return-1;return 1};/*\n\n The MIT License\n\n Copyright (c",
    ") 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permissio",
    "n is hereby granted, free of charge, to any person obtaining a copy\n o",
    "f this software and associated documentation files (the \"Software\"), ",
    "to\n deal in the Software without restriction, including without limita",
    "tion the\n rights to use, copy, modify, merge, publish, distribute, sub",
    "license, and/or\n sell copies of the Software, and to permit persons to",
    " whom the Software is\n furnished to do so, subject to the following co",
    "nditions:\n\n The above copyright notice and this permission notice sha",
    "ll be included in\n all copies or substantial portions of the Software.",
    "\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, ",
    "EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ME",
    "RCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ",
    "IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ",
    "CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ",
    "TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOF",
    "TWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction v(a",
    ",b,c){this.l=a;this.ka=b||1;this.j=c||1};function w(a){this.S=a;this.I=",
    "0}function na(a){a=a.match(pa);for(var b=0;b<a.length;b++)qa.test(a[b])",
    "&&a.splice(b,1);return new w(a)}var pa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w",
    "-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.",
    "\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,qa=/^\\s/;function y(",
    "a,b){return a.S[a.I+(b||0)]}w.prototype.next=function(){return this.S[t",
    "his.I++]};w.prototype.back=function(){this.I--};w.prototype.empty=funct",
    "ion(){return this.S.length<=this.I};function z(a){var b=null,c=a.nodeTy",
    "pe;1==c&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==",
    "b||null==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.docu",
    "mentElement:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&",
    "(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].next",
    "Sibling););}}else b=a.nodeValue;return\"\"+b}\nfunction A(a,b,c){if(nul",
    "l===b)return!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return",
    " null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function B(a,b,c,d,",
    "e){return ra.call(null,a,b,k(c)?c:null,k(d)?d:null,e||new C)}\nfunction",
    " ra(a,b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByNa",
    "me(d),q(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassNam",
    "e&&d&&\"class\"==c?(b=b.getElementsByClassName(d),q(b,function(b){b.cla",
    "ssName==d&&a.matches(b)&&e.add(b)})):a instanceof D?sa(a,b,c,d,e):b.get",
    "ElementsByTagName&&(b=b.getElementsByTagName(a.getName()),q(b,function(",
    "a){A(a,c,d)&&e.add(a)}));return e}function sa(a,b,c,d,e){for(b=b.firstC",
    "hild;b;b=b.nextSibling)A(b,c,d)&&a.matches(b)&&e.add(b),sa(a,b,c,d,e)};",
    "function C(){this.j=this.g=null;this.D=0}function ta(a){this.node=a;thi",
    "s.next=this.w=null}function ua(a,b){if(!a.g)return b;if(!b.g)return a;v",
    "ar c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,",
    "b=b.next):0<ka(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.n",
    "ext=e:a.g=e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a",
    ".D=f;return a}C.prototype.unshift=function(a){a=new ta(a);a.next=this.g",
    ";this.j?this.g.w=a:this.g=this.j=a;this.g=a;this.D++};\nC.prototype.add",
    "=function(a){a=new ta(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=",
    "a;this.j=a;this.D++};function E(a){return(a=a.g)?a.node:null}C.prototyp",
    "e.m=function(){return this.D};function F(a){return(a=E(a))?z(a):\"\"}C.",
    "prototype.iterator=function(a){return new va(this,!!a)};function va(a,b",
    "){this.ga=a;this.T=(this.A=b)?a.j:a.g;this.O=null}va.prototype.next=fun",
    "ction(){var a=this.T;if(null==a)return null;var b=this.O=a;this.T=this.",
    "A?a.w:a.next;return b.node};\nva.prototype.remove=function(){var a=this",
    ".ga,b=this.O;if(!b)throw Error(\"Next must be called at least once befo",
    "re remove.\");var c=b.w,b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;t",
    "his.O=null};function p(a){this.f=a;this.h=this.o=!1;this.F=null}functio",
    "n G(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}p.pr",
    "ototype.c=function(){return this.o};function wa(a,b){a.o=b}function xa(",
    "a,b){a.h=b}p.prototype.u=function(){return this.F};function H(a,b){a=a.",
    "evaluate(b);return a instanceof C?+F(a):+a}function I(a,b){a=a.evaluate",
    "(b);return a instanceof C?F(a):\"\"+a}function J(a,b){a=a.evaluate(b);r",
    "eturn a instanceof C?!!a.m():!!a};function K(a,b,c){p.call(this,a.f);th",
    "is.R=a;this.W=b;this.aa=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.R==y",
    "a&&(c.h||c.c()||4==c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u",
    "()||(this.F={name:c.u().name,C:b}):this.F={name:b.u().name,C:c})}n(K);",
    "\nfunction L(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b inst",
    "anceof C&&c instanceof C){b=b.iterator();for(d=b.next();d;d=b.next())fo",
    "r(e=c.iterator(),f=e.next();f;f=e.next())if(a(z(d),z(f)))return!0;retur",
    "n!1}if(b instanceof C||c instanceof C){b instanceof C?(e=b,d=c):(e=c,d=",
    "b);f=e.iterator();for(var g=typeof d,l=f.next();l;l=f.next()){switch(g)",
    "{case \"number\":l=+z(l);break;case \"boolean\":l=!!z(l);break;case \"s",
    "tring\":l=z(l);break;default:throw Error(\"Illegal primitive type for c",
    "omparison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return",
    " e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==",
    "typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}K.prototype.eva",
    "luate=function(a){return this.R.v(this.W,this.aa,a)};K.prototype.toStri",
    "ng=function(){var a=\"Binary Expression: \"+this.R,a=a+G(this.W);return",
    " a+=G(this.aa)};function za(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v",
    "=d}za.prototype.toString=function(){return this.ja};var Aa={};\nfunctio",
    "n M(a,b,c,d){if(Aa.hasOwnProperty(a))throw Error(\"Binary operator alre",
    "ady created: \"+a);a=new za(a,b,c,d);return Aa[a.toString()]=a}M(\"div",
    "\",6,1,function(a,b,c){return H(a,c)/H(b,c)});M(\"mod\",6,1,function(a,",
    "b,c){return H(a,c)%H(b,c)});M(\"*\",6,1,function(a,b,c){return H(a,c)*H",
    "(b,c)});M(\"+\",5,1,function(a,b,c){return H(a,c)+H(b,c)});M(\"-\",5,1,",
    "function(a,b,c){return H(a,c)-H(b,c)});M(\"<\",4,2,function(a,b,c){retu",
    "rn L(function(a,b){return a<b},a,b,c)});\nM(\">\",4,2,function(a,b,c){r",
    "eturn L(function(a,b){return a>b},a,b,c)});M(\"<=\",4,2,function(a,b,c)",
    "{return L(function(a,b){return a<=b},a,b,c)});M(\">=\",4,2,function(a,b",
    ",c){return L(function(a,b){return a>=b},a,b,c)});var ya=M(\"=\",3,2,fun",
    "ction(a,b,c){return L(function(a,b){return a==b},a,b,c,!0)});M(\"!=\",3",
    ",2,function(a,b,c){return L(function(a,b){return a!=b},a,b,c,!0)});M(\"",
    "and\",2,2,function(a,b,c){return J(a,c)&&J(b,c)});M(\"or\",1,2,function",
    "(a,b,c){return J(a,c)||J(b,c)});function N(a,b){if(b.m()&&4!=a.f)throw ",
    "Error(\"Primary expression must evaluate to nodeset if filter has predi",
    "cate(s).\");p.call(this,a.f);this.$=a;this.b=b;this.o=a.c();this.h=a.h}",
    "n(N);N.prototype.evaluate=function(a){a=this.$.evaluate(a);return Ba(th",
    "is.b,a)};N.prototype.toString=function(){var a=\"Filter:\"+G(this.$);re",
    "turn a+=G(this.b)};function O(a,b){if(b.length<a.Y)throw Error(\"Functi",
    "on \"+a.i+\" expects at least\"+a.Y+\" arguments, \"+b.length+\" given",
    "\");if(null!==a.P&&b.length>a.P)throw Error(\"Function \"+a.i+\" expect",
    "s at most \"+a.P+\" arguments, \"+b.length+\" given\");a.ha&&q(b,functi",
    "on(b,d){if(4!=b.f)throw Error(\"Argument \"+d+\" to function \"+a.i+\" ",
    "is not of type Nodeset: \"+b);});p.call(this,a.f);this.H=a;this.M=b;wa(",
    "this,a.o||t(b,function(a){return a.c()}));xa(this,a.fa&&!b.length||a.ea",
    "&&!!b.length||t(b,function(a){return a.h}))}n(O);\nO.prototype.evaluate",
    "=function(a){return this.H.v.apply(null,ha(a,this.M))};O.prototype.toSt",
    "ring=function(){var a=\"Function: \"+this.H;if(this.M.length)var b=r(th",
    "is.M,function(a,b){return a+G(b)},\"Arguments:\"),a=a+G(b);return a};fu",
    "nction Ca(a,b,c,d,e,f,g,l,x){this.i=a;this.f=b;this.o=c;this.fa=d;this.",
    "ea=e;this.v=f;this.Y=g;this.P=void 0!==l?l:g;this.ha=!!x}Ca.prototype.t",
    "oString=function(){return this.i};var Da={};\nfunction P(a,b,c,d,e,f,g,",
    "l){if(Da.hasOwnProperty(a))throw Error(\"Function already created: \"+a",
    "+\".\");Da[a]=new Ca(a,b,c,d,!1,e,f,g,l)}P(\"boolean\",2,!1,!1,function",
    "(a,b){return J(b,a)},1);P(\"ceiling\",1,!1,!1,function(a,b){return Math",
    ".ceil(H(b,a))},1);P(\"concat\",3,!1,!1,function(a,b){return r(ia(argume",
    "nts,1),function(b,d){return b+I(d,a)},\"\")},2,null);P(\"contains\",2,!",
    "1,!1,function(a,b,c){b=I(b,a);a=I(c,a);return-1!=b.indexOf(a)},2);P(\"c",
    "ount\",1,!1,!1,function(a,b){return b.evaluate(a).m()},1,1,!0);\nP(\"fa",
    "lse\",2,!1,!1,function(){return!1},0);P(\"floor\",1,!1,!1,function(a,b)",
    "{return Math.floor(H(b,a))},1);P(\"id\",4,!1,!1,function(a,b){var c=a.l",
    ",d=9==c.nodeType?c:c.ownerDocument;a=I(b,a).split(/\\s+/);var e=[];q(a,",
    "function(a){a=d.getElementById(a);var b;if(!(b=!a)){a:if(k(e))b=k(a)&&1",
    "==a.length?e.indexOf(a,0):-1;else{for(b=0;b<e.length;b++)if(b in e&&e[b",
    "]===a)break a;b=-1}b=0<=b}b||e.push(a)});e.sort(ka);var f=new C;q(e,fun",
    "ction(a){f.add(a)});return f},1);P(\"lang\",2,!1,!1,function(){return!1",
    "},1);\nP(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw Erro",
    "r(\"Function last expects ()\");return a.j},0);P(\"local-name\",3,!1,!0",
    ",function(a,b){return(a=b?E(b.evaluate(a)):a.l)?a.localName||a.nodeName",
    ".toLowerCase():\"\"},0,1,!0);P(\"name\",3,!1,!0,function(a,b){return(a=",
    "b?E(b.evaluate(a)):a.l)?a.nodeName.toLowerCase():\"\"},0,1,!0);P(\"name",
    "space-uri\",3,!0,!1,function(){return\"\"},0,1,!0);\nP(\"normalize-spac",
    "e\",3,!1,!0,function(a,b){return(b?I(b,a):z(a.l)).replace(/[\\s\\xa0]+/",
    "g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);P(\"not\",2,!1,!1,function(",
    "a,b){return!J(b,a)},1);P(\"number\",1,!1,!0,function(a,b){return b?H(b,",
    "a):+z(a.l)},0,1);P(\"position\",1,!0,!1,function(a){return a.ka},0);P(",
    "\"round\",1,!1,!1,function(a,b){return Math.round(H(b,a))},1);P(\"start",
    "s-with\",2,!1,!1,function(a,b,c){b=I(b,a);a=I(c,a);return 0==b.lastInde",
    "xOf(a,0)},2);P(\"string\",3,!1,!0,function(a,b){return b?I(b,a):z(a.l)}",
    ",0,1);\nP(\"string-length\",1,!1,!0,function(a,b){return(b?I(b,a):z(a.l",
    ")).length},0,1);P(\"substring\",3,!1,!1,function(a,b,c,d){c=H(c,a);if(i",
    "sNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?H(d,a):Infinity;if(is",
    "NaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);",
    "a=I(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d",
    "))},2,3);P(\"substring-after\",3,!1,!1,function(a,b,c){b=I(b,a);a=I(c,a",
    ");c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nP(\"sub",
    "string-before\",3,!1,!1,function(a,b,c){b=I(b,a);a=I(c,a);a=b.indexOf(a",
    ");return-1==a?\"\":b.substring(0,a)},2);P(\"sum\",1,!1,!1,function(a,b)",
    "{a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+z(c",
    ");return b},1,1,!0);P(\"translate\",3,!1,!1,function(a,b,c,d){b=I(b,a);",
    "c=I(c,a);var e=I(d,a);d={};for(var f=0;f<c.length;f++)a=c.charAt(f),a i",
    "n d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=",
    "a in d?d[a]:a;return c},3);P(\"true\",2,!1,!1,function(){return!0},0);f",
    "unction D(a,b){this.ca=a;this.X=void 0!==b?b:null;this.B=null;switch(a)",
    "{case \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"pr",
    "ocessing-instruction\":this.B=7;break;case \"node\":break;default:throw",
    " Error(\"Unexpected argument\");}}function Ea(a){return\"comment\"==a||",
    "\"text\"==a||\"processing-instruction\"==a||\"node\"==a}D.prototype.mat",
    "ches=function(a){return null===this.B||this.B==a.nodeType};D.prototype.",
    "getName=function(){return this.ca};\nD.prototype.toString=function(){va",
    "r a=\"Kind Test: \"+this.ca;null===this.X||(a+=G(this.X));return a};fun",
    "ction Q(a){p.call(this,3);this.ba=a.substring(1,a.length-1)}n(Q);Q.prot",
    "otype.evaluate=function(){return this.ba};Q.prototype.toString=function",
    "(){return\"Literal: \"+this.ba};function R(a,b){this.i=a.toLowerCase();",
    "a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";this.J=b?b.toLow",
    "erCase():a}R.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!",
    "=b)return!1;b=void 0!==a.localName?a.localName:a.nodeName;return\"*\"!=",
    "this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.J?!0:this.J==(a.namespac",
    "eURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};R.",
    "prototype.getName=function(){return this.i};\nR.prototype.toString=func",
    "tion(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.J?",
    "\"\":this.J+\":\")+this.i};function S(a){p.call(this,1);this.da=a}n(S);",
    "S.prototype.evaluate=function(){return this.da};S.prototype.toString=fu",
    "nction(){return\"Number: \"+this.da};function T(a,b){p.call(this,a.f);t",
    "his.V=a;this.G=b;this.o=a.c();this.h=a.h;1==this.G.length&&(a=this.G[0]",
    ",a.N||a.s!=Fa||(a=a.L,\"*\"!=a.getName()&&(this.F={name:a.getName(),C:n",
    "ull})))}n(T);function U(){p.call(this,4)}n(U);U.prototype.evaluate=func",
    "tion(a){var b=new C;a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocument)",
    ";return b};U.prototype.toString=function(){return\"Root Helper Expressi",
    "on\"};function Ga(){p.call(this,4)}n(Ga);Ga.prototype.evaluate=function",
    "(a){var b=new C;b.add(a.l);return b};\nGa.prototype.toString=function()",
    "{return\"Context Helper Expression\"};function Ha(a){return\"/\"==a||\"",
    "//\"==a}\nT.prototype.evaluate=function(a){var b=this.V.evaluate(a);if(",
    "!(b instanceof C))throw Error(\"Filter expression must evaluate to node",
    "set.\");a=this.G;for(var c=0,d=a.length;c<d&&b.m();c++){var e=a[c],f=b.",
    "iterator(e.s.A);if(e.c()||e.s!=Ia)if(e.c()||e.s!=Ja){var g=f.next();for",
    "(b=e.evaluate(new v(g));null!=(g=f.next());)g=e.evaluate(new v(g)),b=ua",
    "(b,g)}else g=f.next(),b=e.evaluate(new v(g));else{for(g=f.next();(b=f.n",
    "ext())&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8;g=",
    "b);b=e.evaluate(new v(g))}}return b};\nT.prototype.toString=function(){",
    "var a=\"Path Expression:\"+G(this.V);if(this.G.length){var b=r(this.G,f",
    "unction(a,b){return a+G(b)},\"Steps:\");a+=G(b)}return a};function V(a,",
    "b){this.b=a;this.A=!!b}function Ba(a,b,c){for(c=c||0;c<a.b.length;c++)f",
    "or(var d=a.b[c],e=b.iterator(),f=b.m(),g,l=0;g=e.next();l++){var x=a.A?",
    "f-l:l+1;g=d.evaluate(new v(g,x,f));if(\"number\"==typeof g)x=x==g;else ",
    "if(\"string\"==typeof g||\"boolean\"==typeof g)x=!!g;else if(g instance",
    "of C)x=0<g.m();else throw Error(\"Predicate.evaluate returned an unexpe",
    "cted type.\");x||e.remove()}return b}V.prototype.u=function(){return 0<",
    "this.b.length?this.b[0].u():null};\nV.prototype.c=function(){for(var a=",
    "0;a<this.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!",
    "0}return!1};V.prototype.m=function(){return this.b.length};V.prototype.",
    "toString=function(){return r(this.b,function(a,b){return a+G(b)},\"Pred",
    "icates:\")};function W(a,b,c,d){p.call(this,4);this.s=a;this.L=b;this.b",
    "=c||new V([]);this.N=!!d;b=this.b.u();a.la&&b&&(this.F={name:b.name,C:b",
    ".C});this.o=this.b.c()}n(W);\nW.prototype.evaluate=function(a){var b=a.",
    "l,c=this.u(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?I(c.C,a):null,f=1);if",
    "(this.N)if(this.c()||this.s!=Ka)if(b=(new W(La,new D(\"node\"))).evalua",
    "te(a).iterator(),c=b.next())for(a=this.v(c,d,e,f);null!=(c=b.next());)a",
    "=ua(a,this.v(c,d,e,f));else a=new C;else a=B(this.L,b,d,e),a=Ba(this.b,",
    "a,f);else a=this.v(a.l,d,e,f);return a};W.prototype.v=function(a,b,c,d)",
    "{a=this.s.H(this.L,a,b,c);return a=Ba(this.b,a,d)};\nW.prototype.toStri",
    "ng=function(){var a=\"Step:\"+G(\"Operator: \"+(this.N?\"//\":\"/\"));t",
    "his.s.i&&(a+=G(\"Axis: \"+this.s));a+=G(this.L);if(this.b.m()){var b=r(",
    "this.b.b,function(a,b){return a+G(b)},\"Predicates:\");a+=G(b)}return a",
    "};function Ma(a,b,c,d){this.i=a;this.H=b;this.A=c;this.la=d}Ma.prototyp",
    "e.toString=function(){return this.i};var Na={};function X(a,b,c,d){if(N",
    "a.hasOwnProperty(a))throw Error(\"Axis already created: \"+a);b=new Ma(",
    "a,b,c,!!d);return Na[a]=b}\nX(\"ancestor\",function(a,b){for(var c=new ",
    "C;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);X(\"ancestor",
    "-or-self\",function(a,b){var c=new C;do a.matches(b)&&c.unshift(b);whil",
    "e(b=b.parentNode);return c},!0);\nvar Fa=X(\"attribute\",function(a,b){",
    "var c=new C,d=a.getName();if(b=b.attributes)if(a instanceof D&&null===a",
    ".B||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.a",
    "dd(a);return c},!1),Ka=X(\"child\",function(a,b,c,d,e){c=k(c)?c:null;d=",
    "k(d)?d:null;e=e||new C;for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a",
    ".matches(b)&&e.add(b);return e},!1,!0);X(\"descendant\",B,!1,!0);\nvar ",
    "La=X(\"descendant-or-self\",function(a,b,c,d){var e=new C;A(b,c,d)&&a.m",
    "atches(b)&&e.add(b);return B(a,b,c,d,e)},!1,!0),Ia=X(\"following\",func",
    "tion(a,b,c,d){var e=new C;do for(var f=b;f=f.nextSibling;)A(f,c,d)&&a.m",
    "atches(f)&&e.add(f),e=B(a,f,c,d,e);while(b=b.parentNode);return e},!1,!",
    "0);X(\"following-sibling\",function(a,b){for(var c=new C;b=b.nextSiblin",
    "g;)a.matches(b)&&c.add(b);return c},!1);X(\"namespace\",function(){retu",
    "rn new C},!1);\nvar Oa=X(\"parent\",function(a,b){var c=new C;if(9==b.n",
    "odeType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.pa",
    "rentNode;a.matches(b)&&c.add(b);return c},!1),Ja=X(\"preceding\",functi",
    "on(a,b,c,d){var e=new C,f=[];do f.unshift(b);while(b=b.parentNode);for(",
    "var g=1,l=f.length;g<l;g++){var x=[];for(b=f[g];b=b.previousSibling;)x.",
    "unshift(b);for(var oa=0,db=x.length;oa<db;oa++)b=x[oa],A(b,c,d)&&a.matc",
    "hes(b)&&e.add(b),e=B(a,b,c,d,e)}return e},!0,!0);\nX(\"preceding-siblin",
    "g\",function(a,b){for(var c=new C;b=b.previousSibling;)a.matches(b)&&c.",
    "unshift(b);return c},!0);var Pa=X(\"self\",function(a,b){var c=new C;a.",
    "matches(b)&&c.add(b);return c},!1);function Qa(a){p.call(this,1);this.U",
    "=a;this.o=a.c();this.h=a.h}n(Qa);Qa.prototype.evaluate=function(a){retu",
    "rn-H(this.U,a)};Qa.prototype.toString=function(){return\"Unary Expressi",
    "on: -\"+G(this.U)};function Ra(a){p.call(this,4);this.K=a;wa(this,t(thi",
    "s.K,function(a){return a.c()}));xa(this,t(this.K,function(a){return a.h",
    "}))}n(Ra);Ra.prototype.evaluate=function(a){var b=new C;q(this.K,functi",
    "on(c){c=c.evaluate(a);if(!(c instanceof C))throw Error(\"Path expressio",
    "n must evaluate to NodeSet.\");b=ua(b,c)});return b};Ra.prototype.toStr",
    "ing=function(){return r(this.K,function(a,b){return a+G(b)},\"Union Exp",
    "ression:\")};function Sa(a,b){this.a=a;this.ia=b}function Ta(a){for(var",
    " b,c=[];;){Y(a,\"Missing right hand side of binary expression.\");b=Ua(",
    "a);var d=a.a.next();if(!d)break;var e=(d=Aa[d]||null)&&d.Z;if(!e){a.a.b",
    "ack();break}for(;c.length&&e<=c[c.length-1].Z;)b=new K(c.pop(),c.pop(),",
    "b);c.push(b,d)}for(;c.length;)b=new K(c.pop(),c.pop(),b);return b}funct",
    "ion Y(a,b){if(a.a.empty())throw Error(b);}function Va(a,b){a=a.a.next()",
    ";if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunct",
    "ion Wa(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}func",
    "tion Xa(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal st",
    "ring\");return new Q(a)}\nfunction Ya(a){var b=[];if(Ha(y(a.a))){var c=",
    "a.a.next();var d=y(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&",
    "&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new U;d=new U;Y(",
    "a,\"Missing next location step.\");c=Za(a,c);b.push(c)}else{a:{c=y(a.a)",
    ";d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable reference no",
    "t allowed in HTML XPath\");case \"(\":a.a.next();c=Ta(a);Y(a,'unclosed ",
    "\"(\"');Va(a,\")\");break;case '\"':case \"'\":c=Xa(a);break;default:if",
    "(isNaN(+c))if(!Ea(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==y(a.a,\n1)){c=a.",
    "a.next();c=Da[c]||null;a.a.next();for(d=[];\")\"!=y(a.a);){Y(a,\"Missin",
    "g function argument list.\");d.push(Ta(a));if(\",\"!=y(a.a))break;a.a.n",
    "ext()}Y(a,\"Unclosed function argument list.\");Wa(a);c=new O(c,d)}else",
    "{c=null;break a}else c=new S(+a.a.next())}\"[\"==y(a.a)&&(d=new V($a(a)",
    "),c=new N(c,d))}if(c)if(Ha(y(a.a)))d=c;else return c;else c=Za(a,\"/\")",
    ",d=new Ga,b.push(c)}for(;Ha(y(a.a));)c=a.a.next(),Y(a,\"Missing next lo",
    "cation step.\"),c=Za(a,c),b.push(c);return new T(d,b)}\nfunction Za(a,b",
    "){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"",
    "');if(\".\"==y(a.a)){var c=new W(Pa,new D(\"node\"));a.a.next();return ",
    "c}if(\"..\"==y(a.a))return c=new W(Oa,new D(\"node\")),a.a.next(),c;if(",
    "\"@\"==y(a.a)){var d=Fa;a.a.next();Y(a,\"Missing attribute name\")}else",
    " if(\"::\"==y(a.a,1)){if(!/(?![0-9])[\\w]/.test(y(a.a).charAt(0)))throw",
    " Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=Na[e]||null;if(!d",
    ")throw Error(\"No axis with name: \"+e);a.a.next();Y(a,\"Missing node n",
    "ame\")}else d=Ka;e=\ny(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if",
    "(\"(\"==y(a.a,1)){if(!Ea(e))throw Error(\"Invalid node type: \"+e);e=a.",
    "a.next();if(!Ea(e))throw Error(\"Invalid type name: \"+e);Va(a,\"(\");Y",
    "(a,\"Bad nodetype\");var f=y(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f",
    ")g=Xa(a);Y(a,\"Bad nodetype\");Wa(a);e=new D(e,g)}else if(e=a.a.next(),",
    "f=e.indexOf(\":\"),-1==f)e=new R(e);else{var g=e.substring(0,f);if(\"*",
    "\"==g)var l=\"*\";else if(l=a.ia(g),!l)throw Error(\"Namespace prefix n",
    "ot declared: \"+g);e=e.substr(f+1);e=new R(e,l)}else throw Error(\"Bad ",
    "token: \"+\na.a.next());a=new V($a(a),d.A);return c||new W(d,e,a,\"//\"",
    "==b)}function $a(a){for(var b=[];\"[\"==y(a.a);){a.a.next();Y(a,\"Missi",
    "ng predicate expression.\");var c=Ta(a);b.push(c);Y(a,\"Unclosed predic",
    "ate expression.\");Va(a,\"]\")}return b}function Ua(a){if(\"-\"==y(a.a)",
    ")return a.a.next(),new Qa(Ua(a));var b=Ya(a);if(\"|\"!=y(a.a))a=b;else{",
    "for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing next union location path.\")",
    ",b.push(Ya(a));a.a.back();a=new Ra(b)}return a};function ab(a){switch(a",
    ".nodeType){case 1:return ga(bb,a);case 9:return ab(a.documentElement);c",
    "ase 11:case 10:case 6:case 12:return cb;default:return a.parentNode?ab(",
    "a.parentNode):cb}}function cb(){return null}function bb(a,b){if(a.prefi",
    "x==b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.ge",
    "tAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.pare",
    "ntNode&&9!=a.parentNode.nodeType?bb(a.parentNode,b):null};function eb(a",
    ",b){if(!a.length)throw Error(\"Empty XPath expression.\");a=na(a);if(a.",
    "empty())throw Error(\"Invalid XPath expression.\");b?\"function\"==ca(b",
    ")||(b=fa(b.lookupNamespaceURI,b)):b=function(){return null};var c=Ta(ne",
    "w Sa(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.next());this.eva",
    "luate=function(a,b){a=c.evaluate(new v(a));return new Z(a,b)}}\nfunctio",
    "n Z(a,b){if(0==b)if(a instanceof C)b=4;else if(\"string\"==typeof a)b=2",
    ";else if(\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;els",
    "e throw Error(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!",
    "(a instanceof C))throw Error(\"value could not be converted to the spec",
    "ified type\");this.resultType=b;switch(b){case 2:this.stringValue=a ins",
    "tanceof C?F(a):\"\"+a;break;case 1:this.numberValue=a instanceof C?+F(a",
    "):+a;break;case 3:this.booleanValue=a instanceof C?0<a.m():!!a;break;ca",
    "se 4:case 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.nex",
    "t();e;e=c.next())d.push(e);this.snapshotLength=a.m();this.invalidIterat",
    "orState=!1;break;case 8:case 9:this.singleNodeValue=E(a);break;default:",
    "throw Error(\"Unknown XPathResult type.\");}var f=0;this.iterateNext=fu",
    "nction(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wrong resu",
    "lt type\");return f>=d.length?null:d[f++]};this.snapshotItem=function(a",
    "){if(6!=b&&7!=b)throw Error(\"snapshotItem called with wrong result typ",
    "e\");return a>=d.length||0>a?null:d[a]}}\nZ.ANY_TYPE=0;Z.NUMBER_TYPE=1;",
    "Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NODE_ITERATOR_TYPE=4;Z.ORD",
    "ERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE_SNAPSHOT_TYPE=6;Z.ORDERED_NO",
    "DE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TYPE=8;Z.FIRST_ORDERED_NODE_TYP",
    "E=9;function fb(a){this.lookupNamespaceURI=ab(a)}\nba(\"wgxpath.install",
    "\",function(a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.docu",
    "ment;if(!c.evaluate||b)a.XPathResult=Z,c.evaluate=function(a,b,c,g){ret",
    "urn(new eb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){return",
    " new eb(a,b)},c.createNSResolver=function(a){return new fb(a)}});functi",
    "on gb(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}h=gb.p",
    "rototype;h.clone=function(){return new gb(this.left,this.top,this.width",
    ",this.height)};h.toString=function(){return\"(\"+this.left+\", \"+this.",
    "top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};h.contains=function",
    "(a){return a instanceof u?a.x>=this.left&&a.x<=this.left+this.width&&a.",
    "y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&this.left+thi",
    "s.width>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a",
    ".height};\nh.ceil=function(){this.left=Math.ceil(this.left);this.top=Ma",
    "th.ceil(this.top);this.width=Math.ceil(this.width);this.height=Math.cei",
    "l(this.height);return this};h.floor=function(){this.left=Math.floor(thi",
    "s.left);this.top=Math.floor(this.top);this.width=Math.floor(this.width)",
    ";this.height=Math.floor(this.height);return this};h.round=function(){th",
    "is.left=Math.round(this.left);this.top=Math.round(this.top);this.width=",
    "Math.round(this.width);this.height=Math.round(this.height);return this}",
    ";\nh.translate=function(a,b){a instanceof u?(this.left+=a.x,this.top+=a",
    ".y):(this.left+=a,m(b)&&(this.top+=b));return this};h.scale=function(a,",
    "b){b=m(b)?b:a;this.left*=a;this.width*=a;this.top*=b;this.height*=b;ret",
    "urn this};ba(\"_\",function(a){var b=a.getClientRects();if(0==b.length)",
    "throw Error(\"Element does not have any client rects\");b=b[0];if(1==a.",
    "nodeType){b:{try{var c=a.getBoundingClientRect()}catch(d){a={left:0,top",
    ":0,right:0,bottom:0};break b}a=c}a=new u(a.left,a.top)}else a=a.changed",
    "Touches?a.changedTouches[0]:a,a=new u(a.clientX,a.clientY);return new g",
    "b(b.left-a.x,b.top-a.y,b.right-b.left,b.bottom-b.top)});; return this._",
    ".apply(null,arguments);}.apply({navigator:typeof window!='undefined'?wi",
    "ndow.navigator:null,document:typeof window!='undefined'?window.document",
    ":null}, arguments);}",
    NULL
};

const char* const GET_LOCATION_IN_VIEW[] = {
    "function(){return function(){var h,k=this;function m(a){return\"string",
    "\"==typeof a}function n(a){return\"number\"==typeof a}function aa(a,b){",
    "a=a.split(\".\");var c=k;a[0]in c||!c.execScript||c.execScript(\"var \"",
    "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&",
    "c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b}\nfunction ba(a){var b=t",
    "ypeof 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);i",
    "f(\"[object Window]\"==c)return\"object\";if(\"[object Array]\"==c||\"n",
    "umber\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefined\"",
    "!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\"))re",
    "turn\"array\";if(\"[object Function]\"==c||\"undefined\"!=typeof a.call",
    "&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable",
    "(\"call\"))return\"function\"}else return\"null\";\nelse if(\"function",
    "\"==b&&\"undefined\"==typeof a.call)return\"object\";return b}function ",
    "ca(a){var b=ba(a);return\"array\"==b||\"object\"==b&&\"number\"==typeof",
    " a.length}function da(a){var b=typeof a;return\"object\"==b&&null!=a||",
    "\"function\"==b}function ea(a,b,c){return a.call.apply(a.bind,arguments",
    ")}\nfunction fa(a,b,c){if(!a)throw Error();if(2<arguments.length){var d",
    "=Array.prototype.slice.call(arguments,2);return function(){var c=Array.",
    "prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);retu",
    "rn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}functio",
    "n ga(a,b,c){ga=Function.prototype.bind&&-1!=Function.prototype.bind.toS",
    "tring().indexOf(\"native code\")?ea:fa;return ga.apply(null,arguments)}",
    "\nfunction ha(a,b){var c=Array.prototype.slice.call(arguments,1);return",
    " function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(th",
    "is,b)}}function p(a){var b=q;function c(){}c.prototype=b.prototype;a.oa",
    "=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.na=function(",
    "a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d",
    "[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};var r;function t(",
    "a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.ca",
    "ll(void 0,d[e],e,a)}function u(a,b,c){var d=c;t(a,function(c,f){d=b.cal",
    "l(void 0,d,c,f,a)});return d}function v(a,b){for(var c=a.length,d=m(a)?",
    "a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0",
    ";return!1}function ia(a){return Array.prototype.concat.apply([],argumen",
    "ts)}function ja(a){var b=a.length;if(0<b){for(var c=Array(b),d=0;d<b;d+",
    "+)c[d]=a[d];return c}return[]}\nfunction ka(a,b,c){return 2>=arguments.",
    "length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c",
    ")};function w(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}h=w.prot",
    "otype;h.clone=function(){return new w(this.x,this.y)};h.toString=functi",
    "on(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function(){this.x=M",
    "ath.ceil(this.x);this.y=Math.ceil(this.y);return this};h.floor=function",
    "(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};h.r",
    "ound=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);ret",
    "urn this};\nh.translate=function(a,b){a instanceof w?(this.x+=a.x,this.",
    "y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h.scale=func",
    "tion(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function x(a,b){t",
    "his.width=a;this.height=b}h=x.prototype;h.clone=function(){return new x",
    "(this.width,this.height)};h.toString=function(){return\"(\"+this.width+",
    "\" x \"+this.height+\")\"};h.ceil=function(){this.width=Math.ceil(this.",
    "width);this.height=Math.ceil(this.height);return this};h.floor=function",
    "(){this.width=Math.floor(this.width);this.height=Math.floor(this.height",
    ");return this};h.round=function(){this.width=Math.round(this.width);thi",
    "s.height=Math.round(this.height);return this};\nh.scale=function(a,b){b",
    "=n(b)?b:a;this.width*=a;this.height*=b;return this};function la(a,b,c){",
    "function d(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=1;",
    "e<c.length;e++){var f=c[e];!ca(f)||da(f)&&0<f.nodeType?d(f):t(ma(f)?ja(",
    "f):f,d)}}function na(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeTy",
    "pe)return a==b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumen",
    "tPosition)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b",
    ";)b=b.parentNode;return b==a}\nfunction oa(a,b){if(a==b)return 0;if(a.c",
    "ompareDocumentPosition)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.sourceInde",
    "x;var e=a.parentNode,f=b.parentNode;return e==f?pa(a,b):!c&&na(e,b)?-1*",
    "qa(a,b):!d&&na(f,a)?qa(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.source",
    "Index:f.sourceIndex)}d=z(a);c=d.createRange();c.selectNode(a);c.collaps",
    "e(!0);a=d.createRange();a.selectNode(b);\na.collapse(!0);return c.compa",
    "reBoundaryPoints(k.Range.START_TO_END,a)}function qa(a,b){var c=a.paren",
    "tNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return pa(b",
    ",a)}function pa(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return ",
    "1}function z(a){return 9==a.nodeType?a:a.ownerDocument||a.document}func",
    "tion ma(a){if(a&&\"number\"==typeof a.length){if(da(a))return\"function",
    "\"==typeof a.item||\"string\"==typeof a.item;if(\"function\"==ba(a))ret",
    "urn\"function\"==typeof a.item}return!1}\nfunction A(a){this.D=a||k.doc",
    "ument||document}h=A.prototype;h.getElementsByTagName=function(a,b){retu",
    "rn(b||this.D).getElementsByTagName(String(a))};function ra(a){a=a.D;a=(",
    "a.parentWindow||a.defaultView||window).document;a=\"CSS1Compat\"==a.com",
    "patMode?a.documentElement:a.body;return new x(a.clientWidth,a.clientHei",
    "ght)}h.createElement=function(a){return this.D.createElement(String(a))",
    "};h.createTextNode=function(a){return this.D.createTextNode(String(a))}",
    ";h.appendChild=function(a,b){a.appendChild(b)};\nh.append=function(a,b)",
    "{la(z(a),a,arguments)};h.canHaveChildren=function(a){if(1!=a.nodeType)r",
    "eturn!1;switch(a.tagName){case \"APPLET\":case \"AREA\":case \"BASE\":c",
    "ase \"BR\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"FRAME\":",
    "case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"ISINDEX",
    "\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\":ca",
    "se \"META\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case \"SOURC",
    "E\":case \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0};\nh.r",
    "emoveNode=function(a){return a&&a.parentNode?a.parentNode.removeChild(a",
    "):null};h.contains=na;/*\n\n The MIT License\n\n Copyright (c) 2007 Cyb",
    "ozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereb",
    "y granted, free of charge, to any person obtaining a copy\n of this sof",
    "tware and associated documentation files (the \"Software\"), to\n deal ",
    "in the Software without restriction, including without limitation the\n",
    " rights to use, copy, modify, merge, publish, distribute, sublicense, a",
    "nd/or\n sell copies of the Software, and to permit persons to whom the ",
    "Software is\n furnished to do so, subject to the following conditions:",
    "\n\n The above copyright notice and this permission notice shall be inc",
    "luded in\n all copies or substantial portions of the Software.\n\n THE ",
    "SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS O",
    "R\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABI",
    "LITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVE",
    "NT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DA",
    "MAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR O",
    "THERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR ",
    "THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction B(a,b,c){thi",
    "s.l=a;this.la=b||1;this.j=c||1};function C(a){this.T=a;this.J=0}functio",
    "n sa(a){a=a.match(ta);for(var b=0;b<a.length;b++)ua.test(a[b])&&a.splic",
    "e(b,1);return new C(a)}var ta=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)",
    "?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.",
    "\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,ua=/^\\s/;function D(a,b){retur",
    "n a.T[a.J+(b||0)]}C.prototype.next=function(){return this.T[this.J++]};",
    "C.prototype.back=function(){this.J--};C.prototype.empty=function(){retu",
    "rn this.T.length<=this.J};function E(a){var b=null,c=a.nodeType;1==c&&(",
    "b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b",
    "?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElemen",
    "t:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.node",
    "Value),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling);)",
    ";}}else b=a.nodeValue;return\"\"+b}\nfunction F(a,b,c){if(null===b)retu",
    "rn!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==c?!",
    "!a.getAttribute(b):a.getAttribute(b,2)==c}function G(a,b,c,d,e){return ",
    "va.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new H)}\nfunction va(a,b,c,",
    "d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),t(b,",
    "function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"cl",
    "ass\"==c?(b=b.getElementsByClassName(d),t(b,function(b){b.className==d&",
    "&a.matches(b)&&e.add(b)})):a instanceof I?wa(a,b,c,d,e):b.getElementsBy",
    "TagName&&(b=b.getElementsByTagName(a.getName()),t(b,function(a){F(a,c,d",
    ")&&e.add(a)}));return e}function wa(a,b,c,d,e){for(b=b.firstChild;b;b=b",
    ".nextSibling)F(b,c,d)&&a.matches(b)&&e.add(b),wa(a,b,c,d,e)};function H",
    "(){this.j=this.g=null;this.F=0}function xa(a){this.node=a;this.next=thi",
    "s.w=null}function za(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b",
    "=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):",
    "0<oa(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=",
    "e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.F=f;retur",
    "n a}H.prototype.unshift=function(a){a=new xa(a);a.next=this.g;this.j?th",
    "is.g.w=a:this.g=this.j=a;this.g=a;this.F++};\nH.prototype.add=function(",
    "a){a=new xa(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a",
    ";this.F++};function J(a){return(a=a.g)?a.node:null}H.prototype.m=functi",
    "on(){return this.F};function K(a){return(a=J(a))?E(a):\"\"}H.prototype.",
    "iterator=function(a){return new Aa(this,!!a)};function Aa(a,b){this.ha=",
    "a;this.U=(this.A=b)?a.j:a.g;this.P=null}Aa.prototype.next=function(){va",
    "r a=this.U;if(null==a)return null;var b=this.P=a;this.U=this.A?a.w:a.ne",
    "xt;return b.node};\nAa.prototype.remove=function(){var a=this.ha,b=this",
    ".P;if(!b)throw Error(\"Next must be called at least once before remove.",
    "\");var c=b.w,b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.F--;this.P=null",
    "};function q(a){this.f=a;this.h=this.o=!1;this.G=null}function L(a){ret",
    "urn\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}q.prototype.c=",
    "function(){return this.o};function Ba(a,b){a.o=b}function Ca(a,b){a.h=b",
    "}q.prototype.u=function(){return this.G};function M(a,b){a=a.evaluate(b",
    ");return a instanceof H?+K(a):+a}function N(a,b){a=a.evaluate(b);return",
    " a instanceof H?K(a):\"\"+a}function O(a,b){a=a.evaluate(b);return a in",
    "stanceof H?!!a.m():!!a};function P(a,b,c){q.call(this,a.f);this.S=a;thi",
    "s.X=b;this.ba=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.S==Da&&(c.h||c",
    ".c()||4==c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.",
    "G={name:c.u().name,C:b}):this.G={name:b.u().name,C:c})}p(P);\nfunction ",
    "Q(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof H&&c",
    " instanceof H){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.itera",
    "tor(),f=e.next();f;f=e.next())if(a(E(d),E(f)))return!0;return!1}if(b in",
    "stanceof H||c instanceof H){b instanceof H?(e=b,d=c):(e=c,d=b);f=e.iter",
    "ator();for(var g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"num",
    "ber\":l=+E(l);break;case \"boolean\":l=!!E(l);break;case \"string\":l=E",
    "(l);break;default:throw Error(\"Illegal primitive type for comparison.",
    "\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boole",
    "an\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||",
    "\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}P.prototype.evaluate=func",
    "tion(a){return this.S.v(this.X,this.ba,a)};P.prototype.toString=functio",
    "n(){var a=\"Binary Expression: \"+this.S,a=a+L(this.X);return a+=L(this",
    ".ba)};function Ea(a,b,c,d){this.ka=a;this.$=b;this.f=c;this.v=d}Ea.prot",
    "otype.toString=function(){return this.ka};var Fa={};\nfunction R(a,b,c,",
    "d){if(Fa.hasOwnProperty(a))throw Error(\"Binary operator already create",
    "d: \"+a);a=new Ea(a,b,c,d);return Fa[a.toString()]=a}R(\"div\",6,1,func",
    "tion(a,b,c){return M(a,c)/M(b,c)});R(\"mod\",6,1,function(a,b,c){return",
    " M(a,c)%M(b,c)});R(\"*\",6,1,function(a,b,c){return M(a,c)*M(b,c)});R(",
    "\"+\",5,1,function(a,b,c){return M(a,c)+M(b,c)});R(\"-\",5,1,function(a",
    ",b,c){return M(a,c)-M(b,c)});R(\"<\",4,2,function(a,b,c){return Q(funct",
    "ion(a,b){return a<b},a,b,c)});\nR(\">\",4,2,function(a,b,c){return Q(fu",
    "nction(a,b){return a>b},a,b,c)});R(\"<=\",4,2,function(a,b,c){return Q(",
    "function(a,b){return a<=b},a,b,c)});R(\">=\",4,2,function(a,b,c){return",
    " Q(function(a,b){return a>=b},a,b,c)});var Da=R(\"=\",3,2,function(a,b,",
    "c){return Q(function(a,b){return a==b},a,b,c,!0)});R(\"!=\",3,2,functio",
    "n(a,b,c){return Q(function(a,b){return a!=b},a,b,c,!0)});R(\"and\",2,2,",
    "function(a,b,c){return O(a,c)&&O(b,c)});R(\"or\",1,2,function(a,b,c){re",
    "turn O(a,c)||O(b,c)});function Ga(a,b){if(b.m()&&4!=a.f)throw Error(\"P",
    "rimary expression must evaluate to nodeset if filter has predicate(s).",
    "\");q.call(this,a.f);this.aa=a;this.b=b;this.o=a.c();this.h=a.h}p(Ga);G",
    "a.prototype.evaluate=function(a){a=this.aa.evaluate(a);return Ha(this.b",
    ",a)};Ga.prototype.toString=function(){var a=\"Filter:\"+L(this.aa);retu",
    "rn a+=L(this.b)};function Ia(a,b){if(b.length<a.Z)throw Error(\"Functio",
    "n \"+a.i+\" expects at least\"+a.Z+\" arguments, \"+b.length+\" given\"",
    ");if(null!==a.R&&b.length>a.R)throw Error(\"Function \"+a.i+\" expects ",
    "at most \"+a.R+\" arguments, \"+b.length+\" given\");a.ia&&t(b,function",
    "(b,d){if(4!=b.f)throw Error(\"Argument \"+d+\" to function \"+a.i+\" is",
    " not of type Nodeset: \"+b);});q.call(this,a.f);this.I=a;this.N=b;Ba(th",
    "is,a.o||v(b,function(a){return a.c()}));Ca(this,a.ga&&!b.length||a.fa&&",
    "!!b.length||v(b,function(a){return a.h}))}p(Ia);\nIa.prototype.evaluate",
    "=function(a){return this.I.v.apply(null,ia(a,this.N))};Ia.prototype.toS",
    "tring=function(){var a=\"Function: \"+this.I;if(this.N.length)var b=u(t",
    "his.N,function(a,b){return a+L(b)},\"Arguments:\"),a=a+L(b);return a};f",
    "unction Ja(a,b,c,d,e,f,g,l,y){this.i=a;this.f=b;this.o=c;this.ga=d;this",
    ".fa=e;this.v=f;this.Z=g;this.R=void 0!==l?l:g;this.ia=!!y}Ja.prototype.",
    "toString=function(){return this.i};var Ka={};\nfunction S(a,b,c,d,e,f,g",
    ",l){if(Ka.hasOwnProperty(a))throw Error(\"Function already created: \"+",
    "a+\".\");Ka[a]=new Ja(a,b,c,d,!1,e,f,g,l)}S(\"boolean\",2,!1,!1,functio",
    "n(a,b){return O(b,a)},1);S(\"ceiling\",1,!1,!1,function(a,b){return Mat",
    "h.ceil(M(b,a))},1);S(\"concat\",3,!1,!1,function(a,b){return u(ka(argum",
    "ents,1),function(b,d){return b+N(d,a)},\"\")},2,null);S(\"contains\",2,",
    "!1,!1,function(a,b,c){b=N(b,a);a=N(c,a);return-1!=b.indexOf(a)},2);S(\"",
    "count\",1,!1,!1,function(a,b){return b.evaluate(a).m()},1,1,!0);\nS(\"f",
    "alse\",2,!1,!1,function(){return!1},0);S(\"floor\",1,!1,!1,function(a,b",
    "){return Math.floor(M(b,a))},1);S(\"id\",4,!1,!1,function(a,b){var c=a.",
    "l,d=9==c.nodeType?c:c.ownerDocument;a=N(b,a).split(/\\s+/);var e=[];t(a",
    ",function(a){a=d.getElementById(a);var b;if(!(b=!a)){a:if(m(e))b=m(a)&&",
    "1==a.length?e.indexOf(a,0):-1;else{for(b=0;b<e.length;b++)if(b in e&&e[",
    "b]===a)break a;b=-1}b=0<=b}b||e.push(a)});e.sort(oa);var f=new H;t(e,fu",
    "nction(a){f.add(a)});return f},1);S(\"lang\",2,!1,!1,function(){return!",
    "1},1);\nS(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw Err",
    "or(\"Function last expects ()\");return a.j},0);S(\"local-name\",3,!1,!",
    "0,function(a,b){return(a=b?J(b.evaluate(a)):a.l)?a.localName||a.nodeNam",
    "e.toLowerCase():\"\"},0,1,!0);S(\"name\",3,!1,!0,function(a,b){return(a",
    "=b?J(b.evaluate(a)):a.l)?a.nodeName.toLowerCase():\"\"},0,1,!0);S(\"nam",
    "espace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);\nS(\"normalize-spa",
    "ce\",3,!1,!0,function(a,b){return(b?N(b,a):E(a.l)).replace(/[\\s\\xa0]+",
    "/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);S(\"not\",2,!1,!1,function",
    "(a,b){return!O(b,a)},1);S(\"number\",1,!1,!0,function(a,b){return b?M(b",
    ",a):+E(a.l)},0,1);S(\"position\",1,!0,!1,function(a){return a.la},0);S(",
    "\"round\",1,!1,!1,function(a,b){return Math.round(M(b,a))},1);S(\"start",
    "s-with\",2,!1,!1,function(a,b,c){b=N(b,a);a=N(c,a);return 0==b.lastInde",
    "xOf(a,0)},2);S(\"string\",3,!1,!0,function(a,b){return b?N(b,a):E(a.l)}",
    ",0,1);\nS(\"string-length\",1,!1,!0,function(a,b){return(b?N(b,a):E(a.l",
    ")).length},0,1);S(\"substring\",3,!1,!1,function(a,b,c,d){c=M(c,a);if(i",
    "sNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?M(d,a):Infinity;if(is",
    "NaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);",
    "a=N(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d",
    "))},2,3);S(\"substring-after\",3,!1,!1,function(a,b,c){b=N(b,a);a=N(c,a",
    ");c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nS(\"sub",
    "string-before\",3,!1,!1,function(a,b,c){b=N(b,a);a=N(c,a);a=b.indexOf(a",
    ");return-1==a?\"\":b.substring(0,a)},2);S(\"sum\",1,!1,!1,function(a,b)",
    "{a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+E(c",
    ");return b},1,1,!0);S(\"translate\",3,!1,!1,function(a,b,c,d){b=N(b,a);",
    "c=N(c,a);var e=N(d,a);d={};for(var f=0;f<c.length;f++)a=c.charAt(f),a i",
    "n d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=",
    "a in d?d[a]:a;return c},3);S(\"true\",2,!1,!1,function(){return!0},0);f",
    "unction I(a,b){this.da=a;this.Y=void 0!==b?b:null;this.B=null;switch(a)",
    "{case \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"pr",
    "ocessing-instruction\":this.B=7;break;case \"node\":break;default:throw",
    " Error(\"Unexpected argument\");}}function La(a){return\"comment\"==a||",
    "\"text\"==a||\"processing-instruction\"==a||\"node\"==a}I.prototype.mat",
    "ches=function(a){return null===this.B||this.B==a.nodeType};I.prototype.",
    "getName=function(){return this.da};\nI.prototype.toString=function(){va",
    "r a=\"Kind Test: \"+this.da;null===this.Y||(a+=L(this.Y));return a};fun",
    "ction Ma(a){q.call(this,3);this.ca=a.substring(1,a.length-1)}p(Ma);Ma.p",
    "rototype.evaluate=function(){return this.ca};Ma.prototype.toString=func",
    "tion(){return\"Literal: \"+this.ca};function T(a,b){this.i=a.toLowerCas",
    "e();a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";this.K=b?b.t",
    "oLowerCase():a}T.prototype.matches=function(a){var b=a.nodeType;if(1!=b",
    "&&2!=b)return!1;b=void 0!==a.localName?a.localName:a.nodeName;return\"*",
    "\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.K?!0:this.K==(a.name",
    "spaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")",
    "};T.prototype.getName=function(){return this.i};\nT.prototype.toString=",
    "function(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==thi",
    "s.K?\"\":this.K+\":\")+this.i};function Na(a){q.call(this,1);this.ea=a}",
    "p(Na);Na.prototype.evaluate=function(){return this.ea};Na.prototype.toS",
    "tring=function(){return\"Number: \"+this.ea};function Oa(a,b){q.call(th",
    "is,a.f);this.W=a;this.H=b;this.o=a.c();this.h=a.h;1==this.H.length&&(a=",
    "this.H[0],a.O||a.s!=Pa||(a=a.M,\"*\"!=a.getName()&&(this.G={name:a.getN",
    "ame(),C:null})))}p(Oa);function U(){q.call(this,4)}p(U);U.prototype.eva",
    "luate=function(a){var b=new H;a=a.l;9==a.nodeType?b.add(a):b.add(a.owne",
    "rDocument);return b};U.prototype.toString=function(){return\"Root Helpe",
    "r Expression\"};function Qa(){q.call(this,4)}p(Qa);Qa.prototype.evaluat",
    "e=function(a){var b=new H;b.add(a.l);return b};\nQa.prototype.toString=",
    "function(){return\"Context Helper Expression\"};function Ra(a){return\"",
    "/\"==a||\"//\"==a}\nOa.prototype.evaluate=function(a){var b=this.W.eval",
    "uate(a);if(!(b instanceof H))throw Error(\"Filter expression must evalu",
    "ate to nodeset.\");a=this.H;for(var c=0,d=a.length;c<d&&b.m();c++){var ",
    "e=a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=Sa)if(e.c()||e.s!=Ta){var g=f",
    ".next();for(b=e.evaluate(new B(g));null!=(g=f.next());)g=e.evaluate(new",
    " B(g)),b=za(b,g)}else g=f.next(),b=e.evaluate(new B(g));else{for(g=f.ne",
    "xt();(b=f.next())&&(!g.contains||g.contains(b))&&b.compareDocumentPosit",
    "ion(g)&8;g=b);b=e.evaluate(new B(g))}}return b};\nOa.prototype.toString",
    "=function(){var a=\"Path Expression:\"+L(this.W);if(this.H.length){var ",
    "b=u(this.H,function(a,b){return a+L(b)},\"Steps:\");a+=L(b)}return a};f",
    "unction V(a,b){this.b=a;this.A=!!b}function Ha(a,b,c){for(c=c||0;c<a.b.",
    "length;c++)for(var d=a.b[c],e=b.iterator(),f=b.m(),g,l=0;g=e.next();l++",
    "){var y=a.A?f-l:l+1;g=d.evaluate(new B(g,y,f));if(\"number\"==typeof g)",
    "y=y==g;else if(\"string\"==typeof g||\"boolean\"==typeof g)y=!!g;else i",
    "f(g instanceof H)y=0<g.m();else throw Error(\"Predicate.evaluate return",
    "ed an unexpected type.\");y||e.remove()}return b}V.prototype.u=function",
    "(){return 0<this.b.length?this.b[0].u():null};\nV.prototype.c=function(",
    "){for(var a=0;a<this.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0=",
    "=b.f)return!0}return!1};V.prototype.m=function(){return this.b.length};",
    "V.prototype.toString=function(){return u(this.b,function(a,b){return a+",
    "L(b)},\"Predicates:\")};function W(a,b,c,d){q.call(this,4);this.s=a;thi",
    "s.M=b;this.b=c||new V([]);this.O=!!d;b=this.b.u();a.ma&&b&&(this.G={nam",
    "e:b.name,C:b.C});this.o=this.b.c()}p(W);\nW.prototype.evaluate=function",
    "(a){var b=a.l,c=this.u(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?N(c.C,a):",
    "null,f=1);if(this.O)if(this.c()||this.s!=Ua)if(b=(new W(Va,new I(\"node",
    "\"))).evaluate(a).iterator(),c=b.next())for(a=this.v(c,d,e,f);null!=(c=",
    "b.next());)a=za(a,this.v(c,d,e,f));else a=new H;else a=G(this.M,b,d,e),",
    "a=Ha(this.b,a,f);else a=this.v(a.l,d,e,f);return a};W.prototype.v=funct",
    "ion(a,b,c,d){a=this.s.I(this.M,a,b,c);return a=Ha(this.b,a,d)};\nW.prot",
    "otype.toString=function(){var a=\"Step:\"+L(\"Operator: \"+(this.O?\"//",
    "\":\"/\"));this.s.i&&(a+=L(\"Axis: \"+this.s));a+=L(this.M);if(this.b.m",
    "()){var b=u(this.b.b,function(a,b){return a+L(b)},\"Predicates:\");a+=L",
    "(b)}return a};function Wa(a,b,c,d){this.i=a;this.I=b;this.A=c;this.ma=d",
    "}Wa.prototype.toString=function(){return this.i};var Xa={};function X(a",
    ",b,c,d){if(Xa.hasOwnProperty(a))throw Error(\"Axis already created: \"+",
    "a);b=new Wa(a,b,c,!!d);return Xa[a]=b}\nX(\"ancestor\",function(a,b){fo",
    "r(var c=new H;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);",
    "X(\"ancestor-or-self\",function(a,b){var c=new H;do a.matches(b)&&c.uns",
    "hift(b);while(b=b.parentNode);return c},!0);\nvar Pa=X(\"attribute\",fu",
    "nction(a,b){var c=new H,d=a.getName();if(b=b.attributes)if(a instanceof",
    " I&&null===a.B||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedI",
    "tem(d))&&c.add(a);return c},!1),Ua=X(\"child\",function(a,b,c,d,e){c=m(",
    "c)?c:null;d=m(d)?d:null;e=e||new H;for(b=b.firstChild;b;b=b.nextSibling",
    ")F(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);X(\"descendant\",G,!",
    "1,!0);\nvar Va=X(\"descendant-or-self\",function(a,b,c,d){var e=new H;F",
    "(b,c,d)&&a.matches(b)&&e.add(b);return G(a,b,c,d,e)},!1,!0),Sa=X(\"foll",
    "owing\",function(a,b,c,d){var e=new H;do for(var f=b;f=f.nextSibling;)F",
    "(f,c,d)&&a.matches(f)&&e.add(f),e=G(a,f,c,d,e);while(b=b.parentNode);re",
    "turn e},!1,!0);X(\"following-sibling\",function(a,b){for(var c=new H;b=",
    "b.nextSibling;)a.matches(b)&&c.add(b);return c},!1);X(\"namespace\",fun",
    "ction(){return new H},!1);\nvar Ya=X(\"parent\",function(a,b){var c=new",
    " H;if(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerEleme",
    "nt),c;b=b.parentNode;a.matches(b)&&c.add(b);return c},!1),Ta=X(\"preced",
    "ing\",function(a,b,c,d){var e=new H,f=[];do f.unshift(b);while(b=b.pare",
    "ntNode);for(var g=1,l=f.length;g<l;g++){var y=[];for(b=f[g];b=b.previou",
    "sSibling;)y.unshift(b);for(var ya=0,sb=y.length;ya<sb;ya++)b=y[ya],F(b,",
    "c,d)&&a.matches(b)&&e.add(b),e=G(a,b,c,d,e)}return e},!0,!0);\nX(\"prec",
    "eding-sibling\",function(a,b){for(var c=new H;b=b.previousSibling;)a.ma",
    "tches(b)&&c.unshift(b);return c},!0);var Za=X(\"self\",function(a,b){va",
    "r c=new H;a.matches(b)&&c.add(b);return c},!1);function $a(a){q.call(th",
    "is,1);this.V=a;this.o=a.c();this.h=a.h}p($a);$a.prototype.evaluate=func",
    "tion(a){return-M(this.V,a)};$a.prototype.toString=function(){return\"Un",
    "ary Expression: -\"+L(this.V)};function ab(a){q.call(this,4);this.L=a;B",
    "a(this,v(this.L,function(a){return a.c()}));Ca(this,v(this.L,function(a",
    "){return a.h}))}p(ab);ab.prototype.evaluate=function(a){var b=new H;t(t",
    "his.L,function(c){c=c.evaluate(a);if(!(c instanceof H))throw Error(\"Pa",
    "th expression must evaluate to NodeSet.\");b=za(b,c)});return b};ab.pro",
    "totype.toString=function(){return u(this.L,function(a,b){return a+L(b)}",
    ",\"Union Expression:\")};function bb(a,b){this.a=a;this.ja=b}function c",
    "b(a){for(var b,c=[];;){Y(a,\"Missing right hand side of binary expressi",
    "on.\");b=db(a);var d=a.a.next();if(!d)break;var e=(d=Fa[d]||null)&&d.$;",
    "if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].$;)b=new P(c.po",
    "p(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new P(c.pop(),c.pop(),b);re",
    "turn b}function Y(a,b){if(a.a.empty())throw Error(b);}function eb(a,b){",
    "a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"",
    "+a);}\nfunction fb(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token:",
    " \"+a);}function gb(a){a=a.a.next();if(2>a.length)throw Error(\"Unclose",
    "d literal string\");return new Ma(a)}\nfunction hb(a){var b=[];if(Ra(D(",
    "a.a))){var c=a.a.next();var d=D(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=",
    "d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new",
    " U;d=new U;Y(a,\"Missing next location step.\");c=ib(a,c);b.push(c)}els",
    "e{a:{c=D(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable",
    " reference not allowed in HTML XPath\");case \"(\":a.a.next();c=cb(a);Y",
    "(a,'unclosed \"(\"');eb(a,\")\");break;case '\"':case \"'\":c=gb(a);bre",
    "ak;default:if(isNaN(+c))if(!La(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==D(a",
    ".a,\n1)){c=a.a.next();c=Ka[c]||null;a.a.next();for(d=[];\")\"!=D(a.a);)",
    "{Y(a,\"Missing function argument list.\");d.push(cb(a));if(\",\"!=D(a.a",
    "))break;a.a.next()}Y(a,\"Unclosed function argument list.\");fb(a);c=ne",
    "w Ia(c,d)}else{c=null;break a}else c=new Na(+a.a.next())}\"[\"==D(a.a)&",
    "&(d=new V(jb(a)),c=new Ga(c,d))}if(c)if(Ra(D(a.a)))d=c;else return c;el",
    "se c=ib(a,\"/\"),d=new Qa,b.push(c)}for(;Ra(D(a.a));)c=a.a.next(),Y(a,",
    "\"Missing next location step.\"),c=ib(a,c),b.push(c);return new Oa(d,b)",
    "}\nfunction ib(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should ",
    "be \"/\" or \"//\"');if(\".\"==D(a.a)){var c=new W(Za,new I(\"node\"));",
    "a.a.next();return c}if(\"..\"==D(a.a))return c=new W(Ya,new I(\"node\")",
    "),a.a.next(),c;if(\"@\"==D(a.a)){var d=Pa;a.a.next();Y(a,\"Missing attr",
    "ibute name\")}else if(\"::\"==D(a.a,1)){if(!/(?![0-9])[\\w]/.test(D(a.a",
    ").charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.next();d",
    "=Xa[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.next();Y(",
    "a,\"Missing node name\")}else d=Ua;e=\nD(a.a);if(/(?![0-9])[\\w\\*]/.te",
    "st(e.charAt(0)))if(\"(\"==D(a.a,1)){if(!La(e))throw Error(\"Invalid nod",
    "e type: \"+e);e=a.a.next();if(!La(e))throw Error(\"Invalid type name: ",
    "\"+e);eb(a,\"(\");Y(a,\"Bad nodetype\");var f=D(a.a).charAt(0),g=null;i",
    "f('\"'==f||\"'\"==f)g=gb(a);Y(a,\"Bad nodetype\");fb(a);e=new I(e,g)}el",
    "se if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new T(e);else{var g=e.sub",
    "string(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ja(g),!l)throw Error(\"",
    "Namespace prefix not declared: \"+g);e=e.substr(f+1);e=new T(e,l)}else ",
    "throw Error(\"Bad token: \"+\na.a.next());a=new V(jb(a),d.A);return c||",
    "new W(d,e,a,\"//\"==b)}function jb(a){for(var b=[];\"[\"==D(a.a);){a.a.",
    "next();Y(a,\"Missing predicate expression.\");var c=cb(a);b.push(c);Y(a",
    ",\"Unclosed predicate expression.\");eb(a,\"]\")}return b}function db(a",
    "){if(\"-\"==D(a.a))return a.a.next(),new $a(db(a));var b=hb(a);if(\"|\"",
    "!=D(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing next union",
    " location path.\"),b.push(hb(a));a.a.back();a=new ab(b)}return a};funct",
    "ion kb(a){switch(a.nodeType){case 1:return ha(lb,a);case 9:return kb(a.",
    "documentElement);case 11:case 10:case 6:case 12:return mb;default:retur",
    "n a.parentNode?kb(a.parentNode):mb}}function mb(){return null}function ",
    "lb(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org/1999/",
    "xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.",
    "value||null:a.parentNode&&9!=a.parentNode.nodeType?lb(a.parentNode,b):n",
    "ull};function nb(a,b){if(!a.length)throw Error(\"Empty XPath expression",
    ".\");a=sa(a);if(a.empty())throw Error(\"Invalid XPath expression.\");b?",
    "\"function\"==ba(b)||(b=ga(b.lookupNamespaceURI,b)):b=function(){return",
    " null};var c=cb(new bb(a,b));if(!a.empty())throw Error(\"Bad token: \"+",
    "a.next());this.evaluate=function(a,b){a=c.evaluate(new B(a));return new",
    " Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceof H)b=4;else if(\"stri",
    "ng\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"",
    "==typeof a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2",
    "!=b&&1!=b&&3!=b&&!(a instanceof H))throw Error(\"value could not be con",
    "verted to the specified type\");this.resultType=b;switch(b){case 2:this",
    ".stringValue=a instanceof H?K(a):\"\"+a;break;case 1:this.numberValue=a",
    " instanceof H?+K(a):+a;break;case 3:this.booleanValue=a instanceof H?0<",
    "a.m():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var d=",
    "[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.m();",
    "this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeValue=J",
    "(a);break;default:throw Error(\"Unknown XPathResult type.\");}var f=0;t",
    "his.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext call",
    "ed with wrong result type\");return f>=d.length?null:d[f++]};this.snaps",
    "hotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called wit",
    "h wrong result type\");return a>=d.length||0>a?null:d[a]}}\nZ.ANY_TYPE=",
    "0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NODE_ITE",
    "RATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE_SNAPSHOT_T",
    "YPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TYPE=8;Z.FIRS",
    "T_ORDERED_NODE_TYPE=9;function ob(a){this.lookupNamespaceURI=kb(a)}\naa",
    "(\"wgxpath.install\",function(a,b){a=a||k;var c=a.Document&&a.Document.",
    "prototype||a.document;if(!c.evaluate||b)a.XPathResult=Z,c.evaluate=func",
    "tion(a,b,c,g){return(new nb(a,c)).evaluate(b,g)},c.createExpression=fun",
    "ction(a,b){return new nb(a,b)},c.createNSResolver=function(a){return ne",
    "w ob(a)}});function pb(a,b,c,d){this.top=a;this.right=b;this.bottom=c;t",
    "his.left=d}h=pb.prototype;h.clone=function(){return new pb(this.top,thi",
    "s.right,this.bottom,this.left)};h.toString=function(){return\"(\"+this.",
    "top+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"};h.",
    "contains=function(a){return this&&a?a instanceof pb?a.left>=this.left&&",
    "a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.l",
    "eft&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\nh.expand=fu",
    "nction(a,b,c,d){da(a)?(this.top-=a.top,this.right+=a.right,this.bottom+",
    "=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),this.bo",
    "ttom+=Number(c),this.left-=Number(d));return this};h.ceil=function(){th",
    "is.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom",
    "=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this};\nh",
    ".floor=function(){this.top=Math.floor(this.top);this.right=Math.floor(t",
    "his.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(thi",
    "s.left);return this};h.round=function(){this.top=Math.round(this.top);t",
    "his.right=Math.round(this.right);this.bottom=Math.round(this.bottom);th",
    "is.left=Math.round(this.left);return this};h.translate=function(a,b){a ",
    "instanceof w?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+",
    "=a.y):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+=b));r",
    "eturn this};\nh.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.right*",
    "=a;this.top*=b;this.bottom*=b;return this};function qb(a,b,c,d){this.le",
    "ft=a;this.top=b;this.width=c;this.height=d}h=qb.prototype;h.clone=funct",
    "ion(){return new qb(this.left,this.top,this.width,this.height)};h.toStr",
    "ing=function(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.width",
    "+\"w x \"+this.height+\"h)\"};h.contains=function(a){return a instanceo",
    "f w?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this",
    ".top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.widt",
    "h&&this.top<=a.top&&this.top+this.height>=a.top+a.height};\nh.ceil=func",
    "tion(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);this",
    ".width=Math.ceil(this.width);this.height=Math.ceil(this.height);return ",
    "this};h.floor=function(){this.left=Math.floor(this.left);this.top=Math.",
    "floor(this.top);this.width=Math.floor(this.width);this.height=Math.floo",
    "r(this.height);return this};h.round=function(){this.left=Math.round(thi",
    "s.left);this.top=Math.round(this.top);this.width=Math.round(this.width)",
    ";this.height=Math.round(this.height);return this};\nh.translate=functio",
    "n(a,b){a instanceof w?(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b)",
    "&&(this.top+=b));return this};h.scale=function(a,b){b=n(b)?b:a;this.lef",
    "t*=a;this.width*=a;this.top*=b;this.height*=b;return this};function rb(",
    "a,b){var c=z(a);return c.defaultView&&c.defaultView.getComputedStyle&&(",
    "a=c.defaultView.getComputedStyle(a,null))?a[b]||a.getPropertyValue(b)||",
    "\"\":\"\"}function tb(a){try{var b=a.getBoundingClientRect()}catch(c){r",
    "eturn{left:0,top:0,right:0,bottom:0}}return b}\nfunction ub(a){var b=z(",
    "a),c=new w(0,0);if(a==(b?z(b):document).documentElement)return c;a=tb(a",
    ");var d=(b?new A(z(b)):r||(r=new A)).D,b=d.scrollingElement?d.scrolling",
    "Element:d.body||d.documentElement,d=d.parentWindow||d.defaultView,b=new",
    " w(d.pageXOffset||b.scrollLeft,d.pageYOffset||b.scrollTop);c.x=a.left+b",
    ".x;c.y=a.top+b.y;return c}function vb(a){if(1==a.nodeType)return a=tb(a",
    "),new w(a.left,a.top);a=a.changedTouches?a.changedTouches[0]:a;return n",
    "ew w(a.clientX,a.clientY)};var wb=\"function\"===typeof ShadowRoot;func",
    "tion xb(a,b){b=ub(b);var c=ub(a);b=new w(b.x-c.x,b.y-c.y);var d=rb(a,\"",
    "borderLeftWidth\");var e=rb(a,\"borderRightWidth\");c=rb(a,\"borderTopW",
    "idth\");a=rb(a,\"borderBottomWidth\");a=new pb(parseFloat(c),parseFloat",
    "(e),parseFloat(a),parseFloat(d));b.x-=a.left;b.y-=a.top;return b}\nfunc",
    "tion yb(a,b,c){function d(a,b,c,d,e){d=new qb(c.x+d.left,c.y+d.top,d.wi",
    "dth,d.height);c=[0,0];b=[b.width,b.height];var f=[d.left,d.top];d=[d.wi",
    "dth,d.height];for(var g=0;2>g;g++)if(d[g]>b[g])c[g]=e?f[g]+d[g]/2-b[g]/",
    "2:f[g];else{var l=f[g]-b[g]+d[g];0<l?c[g]=l:0>f[g]&&(c[g]=f[g])}e=new w",
    "(c[0],c[1]);a.scrollLeft+=e.x;a.scrollTop+=e.y}function e(a){var b=a.pa",
    "rentNode;wb&&b instanceof ShadowRoot&&(b=a.host);return b}for(var f=z(a",
    "),g=e(a),l;g&&g!=f.documentElement&&g!=f.body;)l=xb(g,a),d(g,new x(g.cl",
    "ientWidth,\ng.clientHeight),l,b,c),g=e(g);l=vb(a);a=ra(a?new A(z(a)):r|",
    "|(r=new A));d(f.documentElement,a,l,b,c);d(f.body,a,l,b,c)};aa(\"_\",fu",
    "nction(a,b,c){c||(c=new qb(0,0,a.offsetWidth,a.offsetHeight));yb(a,c,b)",
    ";a=vb(a);return new w(a.x+c.left,a.y+c.top)});; return this._.apply(nul",
    "l,arguments);}.apply({navigator:typeof window!='undefined'?window.navig",
    "ator:null,document:typeof window!='undefined'?window.document:null}, ar",
    "guments);}",
    NULL
};

const char* const GET_PAGE_ZOOM[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof 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\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ga(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a){var b=m;function c(){}c.prototype=b.prototype;",
    "a.na=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=funct",
    "ion(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e",
    "++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function n(a,",
    "b){for(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call",
    "(void 0,d[e],e,a)}function p(a,b,c){var d=c;n(a,function(c,f){d=b.call(",
    "void 0,d,c,f,a)});return d}function q(a,b){for(var c=a.length,d=h(a)?a.",
    "split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;r",
    "eturn!1}function ha(a){return Array.prototype.concat.apply([],arguments",
    ")}function ia(a,b,c){return 2>=arguments.length?Array.prototype.slice.c",
    "all(a,b):Array.prototype.slice.call(a,b,c)};function ja(a,b){if(!a||!b)",
    "return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"u",
    "ndefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareD",
    "ocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunct",
    "ion ka(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.comp",
    "areDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"s",
    "ourceIndex\"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?ma(a,b):!c&&ja(e,b)?-1*na(a,b):!d&&ja(f,a)?na(b,a):(c?a.sou",
    "rceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType",
    "?a:a.ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.coll",
    "apse(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.co",
    "mpareBoundaryPoints(aa.Range.START_TO_END,a)}function na(a,b){var c=a.p",
    "arentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return ",
    "ma(b,a)}function ma(a,b){for(;b=b.previousSibling;)if(b==a)return-1;ret",
    "urn 1};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.",
    "\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, fre",
    "e of charge, to any person obtaining a copy\n of this software and asso",
    "ciated documentation files (the \"Software\"), to\n deal in the Softwar",
    "e without restriction, including without limitation the\n rights to use",
    ", copy, modify, merge, publish, distribute, sublicense, and/or\n sell c",
    "opies of the Software, and to permit persons to whom the Software is\n ",
    "furnished to do so, subject to the following conditions:\n\n The above ",
    "copyright notice and this permission notice shall be included in\n all ",
    "copies or substantial portions of the Software.\n\n THE SOFTWARE IS PRO",
    "VIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, IN",
    "CLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS",
    " FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n ",
    "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
    "\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARIS",
    "ING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTH",
    "ER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction r(a,b,c){this.l=a;this.ka=",
    "b||1;this.j=c||1};function t(a){this.S=a;this.I=0}function oa(a){a=a.ma",
    "tch(pa);for(var b=0;b<a.length;b++)qa.test(a[b])&&a.splice(b,1);return ",
    "new t(a)}var pa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])",
    "(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"",
    "|'[^']*'|[!<>]=|\\s+|./g,qa=/^\\s/;function u(a,b){return a.S[a.I+(b||0",
    ")]}t.prototype.next=function(){return this.S[this.I++]};t.prototype.bac",
    "k=function(){this.I--};t.prototype.empty=function(){return this.S.lengt",
    "h<=this.I};function v(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent",
    ",b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"s",
    "tring\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;",
    "for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a",
    ";while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nod",
    "eValue;return\"\"+b}\nfunction x(a,b,c){if(null===b)return!0;try{if(!a.",
    "getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAttribute",
    "(b):a.getAttribute(b,2)==c}function y(a,b,c,d,e){return ra.call(null,a,",
    "b,h(c)?c:null,h(d)?d:null,e||new z)}\nfunction ra(a,b,c,d,e){b.getEleme",
    "ntsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),n(b,function(b){a.m",
    "atches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.g",
    "etElementsByClassName(d),n(b,function(b){b.className==d&&a.matches(b)&&",
    "e.add(b)})):a instanceof A?sa(a,b,c,d,e):b.getElementsByTagName&&(b=b.g",
    "etElementsByTagName(a.getName()),n(b,function(a){x(a,c,d)&&e.add(a)}));",
    "return e}function sa(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)x(",
    "b,c,d)&&a.matches(b)&&e.add(b),sa(a,b,c,d,e)};function z(){this.j=this.",
    "g=null;this.D=0}function ta(a){this.node=a;this.next=this.w=null}functi",
    "on ua(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=",
    "null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<ka(c.node,b.n",
    "ode)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e",
    "=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}z.prototype",
    ".unshift=function(a){a=new ta(a);a.next=this.g;this.j?this.g.w=a:this.g",
    "=this.j=a;this.g=a;this.D++};\nz.prototype.add=function(a){a=new ta(a);",
    "a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};func",
    "tion B(a){return(a=a.g)?a.node:null}z.prototype.m=function(){return thi",
    "s.D};function C(a){return(a=B(a))?v(a):\"\"}z.prototype.iterator=functi",
    "on(a){return new va(this,!!a)};function va(a,b){this.ga=a;this.T=(this.",
    "A=b)?a.j:a.g;this.O=null}va.prototype.next=function(){var a=this.T;if(n",
    "ull==a)return null;var b=this.O=a;this.T=this.A?a.w:a.next;return b.nod",
    "e};\nva.prototype.remove=function(){var a=this.ga,b=this.O;if(!b)throw ",
    "Error(\"Next must be called at least once before remove.\");var c=b.w,b",
    "=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};function m(a)",
    "{this.f=a;this.h=this.o=!1;this.F=null}function D(a){return\"\\n  \"+a.",
    "toString().split(\"\\n\").join(\"\\n  \")}m.prototype.c=function(){retu",
    "rn this.o};function wa(a,b){a.o=b}function xa(a,b){a.h=b}m.prototype.u=",
    "function(){return this.F};function E(a,b){a=a.evaluate(b);return a inst",
    "anceof z?+C(a):+a}function F(a,b){a=a.evaluate(b);return a instanceof z",
    "?C(a):\"\"+a}function G(a,b){a=a.evaluate(b);return a instanceof z?!!a.",
    "m():!!a};function H(a,b,c){m.call(this,a.f);this.R=a;this.W=b;this.aa=c",
    ";this.o=b.c()||c.c();this.h=b.h||c.h;this.R==ya&&(c.h||c.c()||4==c.f||0",
    "==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c.u().n",
    "ame,C:b}):this.F={name:b.u().name,C:c})}k(H);\nfunction I(a,b,c,d,e){b=",
    "b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof z&&c instanceof z){",
    "b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next(",
    ");f;f=e.next())if(a(v(d),v(f)))return!0;return!1}if(b instanceof z||c i",
    "nstanceof z){b instanceof z?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var ",
    "g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l=+v(l);b",
    "reak;case \"boolean\":l=!!v(l);break;case \"string\":l=v(l);break;defau",
    "lt:throw Error(\"Illegal primitive type for comparison.\");\n}if(e==b&&",
    "a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==typeof b||",
    "\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==type",
    "of c?a(+b,+c):a(b,c):a(+b,+c)}H.prototype.evaluate=function(a){return t",
    "his.R.v(this.W,this.aa,a)};H.prototype.toString=function(){var a=\"Bina",
    "ry Expression: \"+this.R,a=a+D(this.W);return a+=D(this.aa)};function z",
    "a(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}za.prototype.toString=f",
    "unction(){return this.ja};var Aa={};\nfunction J(a,b,c,d){if(Aa.hasOwnP",
    "roperty(a))throw Error(\"Binary operator already created: \"+a);a=new z",
    "a(a,b,c,d);return Aa[a.toString()]=a}J(\"div\",6,1,function(a,b,c){retu",
    "rn E(a,c)/E(b,c)});J(\"mod\",6,1,function(a,b,c){return E(a,c)%E(b,c)})",
    ";J(\"*\",6,1,function(a,b,c){return E(a,c)*E(b,c)});J(\"+\",5,1,functio",
    "n(a,b,c){return E(a,c)+E(b,c)});J(\"-\",5,1,function(a,b,c){return E(a,",
    "c)-E(b,c)});J(\"<\",4,2,function(a,b,c){return I(function(a,b){return a",
    "<b},a,b,c)});\nJ(\">\",4,2,function(a,b,c){return I(function(a,b){retur",
    "n a>b},a,b,c)});J(\"<=\",4,2,function(a,b,c){return I(function(a,b){ret",
    "urn a<=b},a,b,c)});J(\">=\",4,2,function(a,b,c){return I(function(a,b){",
    "return a>=b},a,b,c)});var ya=J(\"=\",3,2,function(a,b,c){return I(funct",
    "ion(a,b){return a==b},a,b,c,!0)});J(\"!=\",3,2,function(a,b,c){return I",
    "(function(a,b){return a!=b},a,b,c,!0)});J(\"and\",2,2,function(a,b,c){r",
    "eturn G(a,c)&&G(b,c)});J(\"or\",1,2,function(a,b,c){return G(a,c)||G(b,",
    "c)});function K(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expression ",
    "must evaluate to nodeset if filter has predicate(s).\");m.call(this,a.f",
    ");this.$=a;this.b=b;this.o=a.c();this.h=a.h}k(K);K.prototype.evaluate=f",
    "unction(a){a=this.$.evaluate(a);return Ba(this.b,a)};K.prototype.toStri",
    "ng=function(){var a=\"Filter:\"+D(this.$);return a+=D(this.b)};function",
    " L(a,b){if(b.length<a.Y)throw Error(\"Function \"+a.i+\" expects at lea",
    "st\"+a.Y+\" arguments, \"+b.length+\" given\");if(null!==a.P&&b.length>",
    "a.P)throw Error(\"Function \"+a.i+\" expects at most \"+a.P+\" argument",
    "s, \"+b.length+\" given\");a.ha&&n(b,function(b,d){if(4!=b.f)throw Erro",
    "r(\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b",
    ");});m.call(this,a.f);this.H=a;this.M=b;wa(this,a.o||q(b,function(a){re",
    "turn a.c()}));xa(this,a.fa&&!b.length||a.ea&&!!b.length||q(b,function(a",
    "){return a.h}))}k(L);\nL.prototype.evaluate=function(a){return this.H.v",
    ".apply(null,ha(a,this.M))};L.prototype.toString=function(){var a=\"Func",
    "tion: \"+this.H;if(this.M.length)var b=p(this.M,function(a,b){return a+",
    "D(b)},\"Arguments:\"),a=a+D(b);return a};function Ca(a,b,c,d,e,f,g,l,w)",
    "{this.i=a;this.f=b;this.o=c;this.fa=d;this.ea=e;this.v=f;this.Y=g;this.",
    "P=void 0!==l?l:g;this.ha=!!w}Ca.prototype.toString=function(){return th",
    "is.i};var Da={};\nfunction M(a,b,c,d,e,f,g,l){if(Da.hasOwnProperty(a))t",
    "hrow Error(\"Function already created: \"+a+\".\");Da[a]=new Ca(a,b,c,d",
    ",!1,e,f,g,l)}M(\"boolean\",2,!1,!1,function(a,b){return G(b,a)},1);M(\"",
    "ceiling\",1,!1,!1,function(a,b){return Math.ceil(E(b,a))},1);M(\"concat",
    "\",3,!1,!1,function(a,b){return p(ia(arguments,1),function(b,d){return ",
    "b+F(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c){b=F(b,a",
    ");a=F(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,function(a,b)",
    "{return b.evaluate(a).m()},1,1,!0);\nM(\"false\",2,!1,!1,function(){ret",
    "urn!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(E(b,a))},",
    "1);M(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDo",
    "cument;a=F(b,a).split(/\\s+/);var e=[];n(a,function(a){a=d.getElementBy",
    "Id(a);var b;if(!(b=!a)){a:if(h(e))b=h(a)&&1==a.length?e.indexOf(a,0):-1",
    ";else{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b|",
    "|e.push(a)});e.sort(ka);var f=new z;n(e,function(a){f.add(a)});return f",
    "},1);M(\"lang\",2,!1,!1,function(){return!1},1);\nM(\"last\",1,!0,!1,fu",
    "nction(a){if(1!=arguments.length)throw Error(\"Function last expects ()",
    "\");return a.j},0);M(\"local-name\",3,!1,!0,function(a,b){return(a=b?B(",
    "b.evaluate(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0)",
    ";M(\"name\",3,!1,!0,function(a,b){return(a=b?B(b.evaluate(a)):a.l)?a.no",
    "deName.toLowerCase():\"\"},0,1,!0);M(\"namespace-uri\",3,!0,!1,function",
    "(){return\"\"},0,1,!0);\nM(\"normalize-space\",3,!1,!0,function(a,b){re",
    "turn(b?F(b,a):v(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+",
    "$/g,\"\")},0,1);M(\"not\",2,!1,!1,function(a,b){return!G(b,a)},1);M(\"n",
    "umber\",1,!1,!0,function(a,b){return b?E(b,a):+v(a.l)},0,1);M(\"positio",
    "n\",1,!0,!1,function(a){return a.ka},0);M(\"round\",1,!1,!1,function(a,",
    "b){return Math.round(E(b,a))},1);M(\"starts-with\",2,!1,!1,function(a,b",
    ",c){b=F(b,a);a=F(c,a);return 0==b.lastIndexOf(a,0)},2);M(\"string\",3,!",
    "1,!0,function(a,b){return b?F(b,a):v(a.l)},0,1);\nM(\"string-length\",1",
    ",!1,!0,function(a,b){return(b?F(b,a):v(a.l)).length},0,1);M(\"substring",
    "\",3,!1,!1,function(a,b,c,d){c=E(c,a);if(isNaN(c)||Infinity==c||-Infini",
    "ty==c)return\"\";d=d?E(d,a):Infinity;if(isNaN(d)||-Infinity===d)return",
    "\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=F(b,a);return Infinity==d?",
    "a.substring(e):a.substring(e,c+Math.round(d))},2,3);M(\"substring-after",
    "\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);c=b.indexOf(a);return-1==c",
    "?\"\":b.substring(c+a.length)},2);\nM(\"substring-before\",3,!1,!1,func",
    "tion(a,b,c){b=F(b,a);a=F(c,a);a=b.indexOf(a);return-1==a?\"\":b.substri",
    "ng(0,a)},2);M(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();",
    "b=0;for(var c=a.next();c;c=a.next())b+=+v(c);return b},1,1,!0);M(\"tran",
    "slate\",3,!1,!1,function(a,b,c,d){b=F(b,a);c=F(c,a);var e=F(d,a);d={};f",
    "or(var f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"",
    "\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);M",
    "(\"true\",2,!1,!1,function(){return!0},0);function A(a,b){this.ca=a;thi",
    "s.X=void 0!==b?b:null;this.B=null;switch(a){case \"comment\":this.B=8;b",
    "reak;case \"text\":this.B=3;break;case \"processing-instruction\":this.",
    "B=7;break;case \"node\":break;default:throw Error(\"Unexpected argument",
    "\");}}function Ea(a){return\"comment\"==a||\"text\"==a||\"processing-in",
    "struction\"==a||\"node\"==a}A.prototype.matches=function(a){return null",
    "===this.B||this.B==a.nodeType};A.prototype.getName=function(){return th",
    "is.ca};\nA.prototype.toString=function(){var a=\"Kind Test: \"+this.ca;",
    "null===this.X||(a+=D(this.X));return a};function N(a){m.call(this,3);th",
    "is.ba=a.substring(1,a.length-1)}k(N);N.prototype.evaluate=function(){re",
    "turn this.ba};N.prototype.toString=function(){return\"Literal: \"+this.",
    "ba};function O(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http",
    "://www.w3.org/1999/xhtml\";this.J=b?b.toLowerCase():a}O.prototype.match",
    "es=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.loc",
    "alName?a.localName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCas",
    "e()?!1:\"*\"==this.J?!0:this.J==(a.namespaceURI?a.namespaceURI.toLowerC",
    "ase():\"http://www.w3.org/1999/xhtml\")};O.prototype.getName=function()",
    "{return this.i};\nO.prototype.toString=function(){return\"Name Test: \"",
    "+(\"http://www.w3.org/1999/xhtml\"==this.J?\"\":this.J+\":\")+this.i};f",
    "unction P(a){m.call(this,1);this.da=a}k(P);P.prototype.evaluate=functio",
    "n(){return this.da};P.prototype.toString=function(){return\"Number: \"+",
    "this.da};function Q(a,b){m.call(this,a.f);this.V=a;this.G=b;this.o=a.c(",
    ");this.h=a.h;1==this.G.length&&(a=this.G[0],a.N||a.s!=Fa||(a=a.L,\"*\"!",
    "=a.getName()&&(this.F={name:a.getName(),C:null})))}k(Q);function R(){m.",
    "call(this,4)}k(R);R.prototype.evaluate=function(a){var b=new z;a=a.l;9=",
    "=a.nodeType?b.add(a):b.add(a.ownerDocument);return b};R.prototype.toStr",
    "ing=function(){return\"Root Helper Expression\"};function S(){m.call(th",
    "is,4)}k(S);S.prototype.evaluate=function(a){var b=new z;b.add(a.l);retu",
    "rn b};\nS.prototype.toString=function(){return\"Context Helper Expressi",
    "on\"};function Ga(a){return\"/\"==a||\"//\"==a}\nQ.prototype.evaluate=f",
    "unction(a){var b=this.V.evaluate(a);if(!(b instanceof z))throw Error(\"",
    "Filter expression must evaluate to nodeset.\");a=this.G;for(var c=0,d=a",
    ".length;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=H",
    "a)if(e.c()||e.s!=Ia){var g=f.next();for(b=e.evaluate(new r(g));null!=(g",
    "=f.next());)g=e.evaluate(new r(g)),b=ua(b,g)}else g=f.next(),b=e.evalua",
    "te(new r(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains",
    "(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new r(g))}}retur",
    "n b};\nQ.prototype.toString=function(){var a=\"Path Expression:\"+D(thi",
    "s.V);if(this.G.length){var b=p(this.G,function(a,b){return a+D(b)},\"St",
    "eps:\");a+=D(b)}return a};function T(a,b){this.b=a;this.A=!!b}function ",
    "Ba(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f",
    "=b.m(),g,l=0;g=e.next();l++){var w=a.A?f-l:l+1;g=d.evaluate(new r(g,w,f",
    "));if(\"number\"==typeof g)w=w==g;else if(\"string\"==typeof g||\"boole",
    "an\"==typeof g)w=!!g;else if(g instanceof z)w=0<g.m();else throw Error(",
    "\"Predicate.evaluate returned an unexpected type.\");w||e.remove()}retu",
    "rn b}T.prototype.u=function(){return 0<this.b.length?this.b[0].u():null",
    "};\nT.prototype.c=function(){for(var a=0;a<this.b.length;a++){var b=thi",
    "s.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};T.prototype.m=functi",
    "on(){return this.b.length};T.prototype.toString=function(){return p(thi",
    "s.b,function(a,b){return a+D(b)},\"Predicates:\")};function U(a,b,c,d){",
    "m.call(this,4);this.s=a;this.L=b;this.b=c||new T([]);this.N=!!d;b=this.",
    "b.u();a.la&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()}k(U);\nU.",
    "prototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,e=null,f=0;c",
    "&&(d=c.name,e=c.C?F(c.C,a):null,f=1);if(this.N)if(this.c()||this.s!=Ja)",
    "if(b=(new U(Ka,new A(\"node\"))).evaluate(a).iterator(),c=b.next())for(",
    "a=this.v(c,d,e,f);null!=(c=b.next());)a=ua(a,this.v(c,d,e,f));else a=ne",
    "w z;else a=y(this.L,b,d,e),a=Ba(this.b,a,f);else a=this.v(a.l,d,e,f);re",
    "turn a};U.prototype.v=function(a,b,c,d){a=this.s.H(this.L,a,b,c);return",
    " a=Ba(this.b,a,d)};\nU.prototype.toString=function(){var a=\"Step:\"+D(",
    "\"Operator: \"+(this.N?\"//\":\"/\"));this.s.i&&(a+=D(\"Axis: \"+this.s",
    "));a+=D(this.L);if(this.b.m()){var b=p(this.b.b,function(a,b){return a+",
    "D(b)},\"Predicates:\");a+=D(b)}return a};function La(a,b,c,d){this.i=a;",
    "this.H=b;this.A=c;this.la=d}La.prototype.toString=function(){return thi",
    "s.i};var Ma={};function V(a,b,c,d){if(Ma.hasOwnProperty(a))throw Error(",
    "\"Axis already created: \"+a);b=new La(a,b,c,!!d);return Ma[a]=b}\nV(\"",
    "ancestor\",function(a,b){for(var c=new z;b=b.parentNode;)a.matches(b)&&",
    "c.unshift(b);return c},!0);V(\"ancestor-or-self\",function(a,b){var c=n",
    "ew z;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);",
    "\nvar Fa=V(\"attribute\",function(a,b){var c=new z,d=a.getName();if(b=b",
    ".attributes)if(a instanceof A&&null===a.B||\"*\"==d)for(d=0;a=b[d];d++)",
    "c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1),Ja=V(\"child",
    "\",function(a,b,c,d,e){c=h(c)?c:null;d=h(d)?d:null;e=e||new z;for(b=b.f",
    "irstChild;b;b=b.nextSibling)x(b,c,d)&&a.matches(b)&&e.add(b);return e},",
    "!1,!0);V(\"descendant\",y,!1,!0);\nvar Ka=V(\"descendant-or-self\",func",
    "tion(a,b,c,d){var e=new z;x(b,c,d)&&a.matches(b)&&e.add(b);return y(a,b",
    ",c,d,e)},!1,!0),Ha=V(\"following\",function(a,b,c,d){var e=new z;do for",
    "(var f=b;f=f.nextSibling;)x(f,c,d)&&a.matches(f)&&e.add(f),e=y(a,f,c,d,",
    "e);while(b=b.parentNode);return e},!1,!0);V(\"following-sibling\",funct",
    "ion(a,b){for(var c=new z;b=b.nextSibling;)a.matches(b)&&c.add(b);return",
    " c},!1);V(\"namespace\",function(){return new z},!1);\nvar Na=V(\"paren",
    "t\",function(a,b){var c=new z;if(9==b.nodeType)return c;if(2==b.nodeTyp",
    "e)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);",
    "return c},!1),Ia=V(\"preceding\",function(a,b,c,d){var e=new z,f=[];do ",
    "f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.length;g<l;g++){var ",
    "w=[];for(b=f[g];b=b.previousSibling;)w.unshift(b);for(var la=0,$a=w.len",
    "gth;la<$a;la++)b=w[la],x(b,c,d)&&a.matches(b)&&e.add(b),e=y(a,b,c,d,e)}",
    "return e},!0,!0);\nV(\"preceding-sibling\",function(a,b){for(var c=new ",
    "z;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Oa=",
    "V(\"self\",function(a,b){var c=new z;a.matches(b)&&c.add(b);return c},!",
    "1);function W(a){m.call(this,1);this.U=a;this.o=a.c();this.h=a.h}k(W);W",
    ".prototype.evaluate=function(a){return-E(this.U,a)};W.prototype.toStrin",
    "g=function(){return\"Unary Expression: -\"+D(this.U)};function X(a){m.c",
    "all(this,4);this.K=a;wa(this,q(this.K,function(a){return a.c()}));xa(th",
    "is,q(this.K,function(a){return a.h}))}k(X);X.prototype.evaluate=functio",
    "n(a){var b=new z;n(this.K,function(c){c=c.evaluate(a);if(!(c instanceof",
    " z))throw Error(\"Path expression must evaluate to NodeSet.\");b=ua(b,c",
    ")});return b};X.prototype.toString=function(){return p(this.K,function(",
    "a,b){return a+D(b)},\"Union Expression:\")};function Pa(a,b){this.a=a;t",
    "his.ia=b}function Qa(a){for(var b,c=[];;){Y(a,\"Missing right hand side",
    " of binary expression.\");b=Ra(a);var d=a.a.next();if(!d)break;var e=(d",
    "=Aa[d]||null)&&d.Z;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length",
    "-1].Z;)b=new H(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new H(c.",
    "pop(),c.pop(),b);return b}function Y(a,b){if(a.a.empty())throw Error(b)",
    ";}function Sa(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expect",
    "ed: \"+b+\" got: \"+a);}\nfunction Ta(a){a=a.a.next();if(\")\"!=a)throw",
    " Error(\"Bad token: \"+a);}function Ua(a){a=a.a.next();if(2>a.length)th",
    "row Error(\"Unclosed literal string\");return new N(a)}\nfunction Va(a)",
    "{var b=[];if(Ga(u(a.a))){var c=a.a.next();var d=u(a.a);if(\"/\"==c&&(a.",
    "a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.t",
    "est(d)))return new R;d=new R;Y(a,\"Missing next location step.\");c=Wa(",
    "a,c);b.push(c)}else{a:{c=u(a.a);d=c.charAt(0);switch(d){case \"$\":thro",
    "w Error(\"Variable reference not allowed in HTML XPath\");case \"(\":a.",
    "a.next();c=Qa(a);Y(a,'unclosed \"(\"');Sa(a,\")\");break;case '\"':case",
    " \"'\":c=Ua(a);break;default:if(isNaN(+c))if(!Ea(c)&&/(?![0-9])[\\w]/.t",
    "est(d)&&\"(\"==u(a.a,\n1)){c=a.a.next();c=Da[c]||null;a.a.next();for(d=",
    "[];\")\"!=u(a.a);){Y(a,\"Missing function argument list.\");d.push(Qa(a",
    "));if(\",\"!=u(a.a))break;a.a.next()}Y(a,\"Unclosed function argument l",
    "ist.\");Ta(a);c=new L(c,d)}else{c=null;break a}else c=new P(+a.a.next()",
    ")}\"[\"==u(a.a)&&(d=new T(Xa(a)),c=new K(c,d))}if(c)if(Ga(u(a.a)))d=c;e",
    "lse return c;else c=Wa(a,\"/\"),d=new S,b.push(c)}for(;Ga(u(a.a));)c=a.",
    "a.next(),Y(a,\"Missing next location step.\"),c=Wa(a,c),b.push(c);retur",
    "n new Q(d,b)}\nfunction Wa(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Ste",
    "p op should be \"/\" or \"//\"');if(\".\"==u(a.a)){var c=new U(Oa,new A",
    "(\"node\"));a.a.next();return c}if(\"..\"==u(a.a))return c=new U(Na,new",
    " A(\"node\")),a.a.next(),c;if(\"@\"==u(a.a)){var d=Fa;a.a.next();Y(a,\"",
    "Missing attribute name\")}else if(\"::\"==u(a.a,1)){if(!/(?![0-9])[\\w]",
    "/.test(u(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=",
    "a.a.next();d=Ma[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a",
    ".a.next();Y(a,\"Missing node name\")}else d=Ja;e=\nu(a.a);if(/(?![0-9])",
    "[\\w\\*]/.test(e.charAt(0)))if(\"(\"==u(a.a,1)){if(!Ea(e))throw Error(",
    "\"Invalid node type: \"+e);e=a.a.next();if(!Ea(e))throw Error(\"Invalid",
    " type name: \"+e);Sa(a,\"(\");Y(a,\"Bad nodetype\");var f=u(a.a).charAt",
    "(0),g=null;if('\"'==f||\"'\"==f)g=Ua(a);Y(a,\"Bad nodetype\");Ta(a);e=n",
    "ew A(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new O(e);else",
    "{var g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ia(g),!l)th",
    "row Error(\"Namespace prefix not declared: \"+g);e=e.substr(f+1);e=new ",
    "O(e,l)}else throw Error(\"Bad token: \"+\na.a.next());a=new T(Xa(a),d.A",
    ");return c||new U(d,e,a,\"//\"==b)}function Xa(a){for(var b=[];\"[\"==u",
    "(a.a);){a.a.next();Y(a,\"Missing predicate expression.\");var c=Qa(a);b",
    ".push(c);Y(a,\"Unclosed predicate expression.\");Sa(a,\"]\")}return b}f",
    "unction Ra(a){if(\"-\"==u(a.a))return a.a.next(),new W(Ra(a));var b=Va(",
    "a);if(\"|\"!=u(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing",
    " next union location path.\"),b.push(Va(a));a.a.back();a=new X(b)}retur",
    "n a};function Ya(a){switch(a.nodeType){case 1:return ga(Za,a);case 9:re",
    "turn Ya(a.documentElement);case 11:case 10:case 6:case 12:return ab;def",
    "ault:return a.parentNode?Ya(a.parentNode):ab}}function ab(){return null",
    "}function Za(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3",
    ".org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.sp",
    "ecified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?Za(a.paren",
    "tNode,b):null};function bb(a,b){if(!a.length)throw Error(\"Empty XPath ",
    "expression.\");a=oa(a);if(a.empty())throw Error(\"Invalid XPath express",
    "ion.\");b?\"function\"==ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=functio",
    "n(){return null};var c=Qa(new Pa(a,b));if(!a.empty())throw Error(\"Bad ",
    "token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new r(a));",
    "return new Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceof z)b=4;else",
    " if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(",
    "\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected evaluation resu",
    "lt.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof z))throw Error(\"value could",
    " not be converted to the specified type\");this.resultType=b;switch(b){",
    "case 2:this.stringValue=a instanceof z?C(a):\"\"+a;break;case 1:this.nu",
    "mberValue=a instanceof z?+C(a):+a;break;case 3:this.booleanValue=a inst",
    "anceof z?0<a.m():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterat",
    "or();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLe",
    "ngth=a.m();this.invalidIteratorState=!1;break;case 8:case 9:this.single",
    "NodeValue=B(a);break;default:throw Error(\"Unknown XPathResult type.\")",
    ";}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"itera",
    "teNext called with wrong result type\");return f>=d.length?null:d[f++]}",
    ";this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem",
    " called with wrong result type\");return a>=d.length||0>a?null:d[a]}}\n",
    "Z.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDER",
    "ED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE",
    "_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TY",
    "PE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function cb(a){this.lookupNamespaceURI",
    "=Ya(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&",
    "&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Z,c.e",
    "valuate=function(a,b,c,g){return(new bb(a,c)).evaluate(b,g)},c.createEx",
    "pression=function(a,b){return new bb(a,b)},c.createNSResolver=function(",
    "a){return new cb(a)}});ba(\"_\",function(a){a=9==a.nodeType?a:a.ownerDo",
    "cument||a.document;var b=a.documentElement;return a.width/Math.max(b.cl",
    "ientWidth,b.offsetWidth,b.scrollWidth)});; return this._.apply(null,arg",
    "uments);}.apply({navigator:typeof window!='undefined'?window.navigator:",
    "null,document:typeof window!='undefined'?window.document:null}, argumen",
    "ts);}",
    NULL
};

const char* const IS_ELEMENT_CLICKABLE[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof 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\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ga(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a){var b=m;function c(){}c.prototype=b.prototype;",
    "a.na=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=funct",
    "ion(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e",
    "++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function n(a,",
    "b){for(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call",
    "(void 0,d[e],e,a)}function p(a,b,c){var d=c;n(a,function(c,f){d=b.call(",
    "void 0,d,c,f,a)});return d}function q(a,b){for(var c=a.length,d=h(a)?a.",
    "split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;r",
    "eturn!1}function ha(a){return Array.prototype.concat.apply([],arguments",
    ")}function ia(a,b,c){return 2>=arguments.length?Array.prototype.slice.c",
    "all(a,b):Array.prototype.slice.call(a,b,c)};function ja(a,b){if(!a||!b)",
    "return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"u",
    "ndefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareD",
    "ocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunct",
    "ion ka(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.comp",
    "areDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"s",
    "ourceIndex\"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?ma(a,b):!c&&ja(e,b)?-1*na(a,b):!d&&ja(f,a)?na(b,a):(c?a.sou",
    "rceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType",
    "?a:a.ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.coll",
    "apse(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.co",
    "mpareBoundaryPoints(aa.Range.START_TO_END,a)}function na(a,b){var c=a.p",
    "arentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return ",
    "ma(b,a)}function ma(a,b){for(;b=b.previousSibling;)if(b==a)return-1;ret",
    "urn 1};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.",
    "\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, fre",
    "e of charge, to any person obtaining a copy\n of this software and asso",
    "ciated documentation files (the \"Software\"), to\n deal in the Softwar",
    "e without restriction, including without limitation the\n rights to use",
    ", copy, modify, merge, publish, distribute, sublicense, and/or\n sell c",
    "opies of the Software, and to permit persons to whom the Software is\n ",
    "furnished to do so, subject to the following conditions:\n\n The above ",
    "copyright notice and this permission notice shall be included in\n all ",
    "copies or substantial portions of the Software.\n\n THE SOFTWARE IS PRO",
    "VIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, IN",
    "CLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS",
    " FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n ",
    "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
    "\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARIS",
    "ING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTH",
    "ER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction r(a,b,c){this.l=a;this.ka=",
    "b||1;this.j=c||1};function t(a){this.S=a;this.I=0}function oa(a){a=a.ma",
    "tch(pa);for(var b=0;b<a.length;b++)qa.test(a[b])&&a.splice(b,1);return ",
    "new t(a)}var pa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])",
    "(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"",
    "|'[^']*'|[!<>]=|\\s+|./g,qa=/^\\s/;function u(a,b){return a.S[a.I+(b||0",
    ")]}t.prototype.next=function(){return this.S[this.I++]};t.prototype.bac",
    "k=function(){this.I--};t.prototype.empty=function(){return this.S.lengt",
    "h<=this.I};function v(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent",
    ",b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"s",
    "tring\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;",
    "for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a",
    ";while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nod",
    "eValue;return\"\"+b}\nfunction x(a,b,c){if(null===b)return!0;try{if(!a.",
    "getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAttribute",
    "(b):a.getAttribute(b,2)==c}function y(a,b,c,d,e){return ra.call(null,a,",
    "b,h(c)?c:null,h(d)?d:null,e||new z)}\nfunction ra(a,b,c,d,e){b.getEleme",
    "ntsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),n(b,function(b){a.m",
    "atches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.g",
    "etElementsByClassName(d),n(b,function(b){b.className==d&&a.matches(b)&&",
    "e.add(b)})):a instanceof A?sa(a,b,c,d,e):b.getElementsByTagName&&(b=b.g",
    "etElementsByTagName(a.getName()),n(b,function(a){x(a,c,d)&&e.add(a)}));",
    "return e}function sa(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)x(",
    "b,c,d)&&a.matches(b)&&e.add(b),sa(a,b,c,d,e)};function z(){this.j=this.",
    "g=null;this.D=0}function ta(a){this.node=a;this.next=this.w=null}functi",
    "on ua(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=",
    "null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<ka(c.node,b.n",
    "ode)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e",
    "=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}z.prototype",
    ".unshift=function(a){a=new ta(a);a.next=this.g;this.j?this.g.w=a:this.g",
    "=this.j=a;this.g=a;this.D++};\nz.prototype.add=function(a){a=new ta(a);",
    "a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};func",
    "tion B(a){return(a=a.g)?a.node:null}z.prototype.m=function(){return thi",
    "s.D};function C(a){return(a=B(a))?v(a):\"\"}z.prototype.iterator=functi",
    "on(a){return new va(this,!!a)};function va(a,b){this.ga=a;this.T=(this.",
    "A=b)?a.j:a.g;this.O=null}va.prototype.next=function(){var a=this.T;if(n",
    "ull==a)return null;var b=this.O=a;this.T=this.A?a.w:a.next;return b.nod",
    "e};\nva.prototype.remove=function(){var a=this.ga,b=this.O;if(!b)throw ",
    "Error(\"Next must be called at least once before remove.\");var c=b.w,b",
    "=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};function m(a)",
    "{this.f=a;this.h=this.o=!1;this.F=null}function D(a){return\"\\n  \"+a.",
    "toString().split(\"\\n\").join(\"\\n  \")}m.prototype.c=function(){retu",
    "rn this.o};function wa(a,b){a.o=b}function xa(a,b){a.h=b}m.prototype.u=",
    "function(){return this.F};function E(a,b){a=a.evaluate(b);return a inst",
    "anceof z?+C(a):+a}function F(a,b){a=a.evaluate(b);return a instanceof z",
    "?C(a):\"\"+a}function G(a,b){a=a.evaluate(b);return a instanceof z?!!a.",
    "m():!!a};function H(a,b,c){m.call(this,a.f);this.R=a;this.W=b;this.aa=c",
    ";this.o=b.c()||c.c();this.h=b.h||c.h;this.R==ya&&(c.h||c.c()||4==c.f||0",
    "==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c.u().n",
    "ame,C:b}):this.F={name:b.u().name,C:c})}k(H);\nfunction I(a,b,c,d,e){b=",
    "b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof z&&c instanceof z){",
    "b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next(",
    ");f;f=e.next())if(a(v(d),v(f)))return!0;return!1}if(b instanceof z||c i",
    "nstanceof z){b instanceof z?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var ",
    "g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l=+v(l);b",
    "reak;case \"boolean\":l=!!v(l);break;case \"string\":l=v(l);break;defau",
    "lt:throw Error(\"Illegal primitive type for comparison.\");\n}if(e==b&&",
    "a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==typeof b||",
    "\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==type",
    "of c?a(+b,+c):a(b,c):a(+b,+c)}H.prototype.evaluate=function(a){return t",
    "his.R.v(this.W,this.aa,a)};H.prototype.toString=function(){var a=\"Bina",
    "ry Expression: \"+this.R,a=a+D(this.W);return a+=D(this.aa)};function z",
    "a(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}za.prototype.toString=f",
    "unction(){return this.ja};var Aa={};\nfunction J(a,b,c,d){if(Aa.hasOwnP",
    "roperty(a))throw Error(\"Binary operator already created: \"+a);a=new z",
    "a(a,b,c,d);return Aa[a.toString()]=a}J(\"div\",6,1,function(a,b,c){retu",
    "rn E(a,c)/E(b,c)});J(\"mod\",6,1,function(a,b,c){return E(a,c)%E(b,c)})",
    ";J(\"*\",6,1,function(a,b,c){return E(a,c)*E(b,c)});J(\"+\",5,1,functio",
    "n(a,b,c){return E(a,c)+E(b,c)});J(\"-\",5,1,function(a,b,c){return E(a,",
    "c)-E(b,c)});J(\"<\",4,2,function(a,b,c){return I(function(a,b){return a",
    "<b},a,b,c)});\nJ(\">\",4,2,function(a,b,c){return I(function(a,b){retur",
    "n a>b},a,b,c)});J(\"<=\",4,2,function(a,b,c){return I(function(a,b){ret",
    "urn a<=b},a,b,c)});J(\">=\",4,2,function(a,b,c){return I(function(a,b){",
    "return a>=b},a,b,c)});var ya=J(\"=\",3,2,function(a,b,c){return I(funct",
    "ion(a,b){return a==b},a,b,c,!0)});J(\"!=\",3,2,function(a,b,c){return I",
    "(function(a,b){return a!=b},a,b,c,!0)});J(\"and\",2,2,function(a,b,c){r",
    "eturn G(a,c)&&G(b,c)});J(\"or\",1,2,function(a,b,c){return G(a,c)||G(b,",
    "c)});function K(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expression ",
    "must evaluate to nodeset if filter has predicate(s).\");m.call(this,a.f",
    ");this.$=a;this.b=b;this.o=a.c();this.h=a.h}k(K);K.prototype.evaluate=f",
    "unction(a){a=this.$.evaluate(a);return Ba(this.b,a)};K.prototype.toStri",
    "ng=function(){var a=\"Filter:\"+D(this.$);return a+=D(this.b)};function",
    " L(a,b){if(b.length<a.Y)throw Error(\"Function \"+a.i+\" expects at lea",
    "st\"+a.Y+\" arguments, \"+b.length+\" given\");if(null!==a.P&&b.length>",
    "a.P)throw Error(\"Function \"+a.i+\" expects at most \"+a.P+\" argument",
    "s, \"+b.length+\" given\");a.ha&&n(b,function(b,d){if(4!=b.f)throw Erro",
    "r(\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b",
    ");});m.call(this,a.f);this.H=a;this.M=b;wa(this,a.o||q(b,function(a){re",
    "turn a.c()}));xa(this,a.fa&&!b.length||a.ea&&!!b.length||q(b,function(a",
    "){return a.h}))}k(L);\nL.prototype.evaluate=function(a){return this.H.v",
    ".apply(null,ha(a,this.M))};L.prototype.toString=function(){var a=\"Func",
    "tion: \"+this.H;if(this.M.length)var b=p(this.M,function(a,b){return a+",
    "D(b)},\"Arguments:\"),a=a+D(b);return a};function Ca(a,b,c,d,e,f,g,l,w)",
    "{this.i=a;this.f=b;this.o=c;this.fa=d;this.ea=e;this.v=f;this.Y=g;this.",
    "P=void 0!==l?l:g;this.ha=!!w}Ca.prototype.toString=function(){return th",
    "is.i};var Da={};\nfunction M(a,b,c,d,e,f,g,l){if(Da.hasOwnProperty(a))t",
    "hrow Error(\"Function already created: \"+a+\".\");Da[a]=new Ca(a,b,c,d",
    ",!1,e,f,g,l)}M(\"boolean\",2,!1,!1,function(a,b){return G(b,a)},1);M(\"",
    "ceiling\",1,!1,!1,function(a,b){return Math.ceil(E(b,a))},1);M(\"concat",
    "\",3,!1,!1,function(a,b){return p(ia(arguments,1),function(b,d){return ",
    "b+F(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c){b=F(b,a",
    ");a=F(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,function(a,b)",
    "{return b.evaluate(a).m()},1,1,!0);\nM(\"false\",2,!1,!1,function(){ret",
    "urn!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(E(b,a))},",
    "1);M(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDo",
    "cument;a=F(b,a).split(/\\s+/);var e=[];n(a,function(a){a=d.getElementBy",
    "Id(a);var b;if(!(b=!a)){a:if(h(e))b=h(a)&&1==a.length?e.indexOf(a,0):-1",
    ";else{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b|",
    "|e.push(a)});e.sort(ka);var f=new z;n(e,function(a){f.add(a)});return f",
    "},1);M(\"lang\",2,!1,!1,function(){return!1},1);\nM(\"last\",1,!0,!1,fu",
    "nction(a){if(1!=arguments.length)throw Error(\"Function last expects ()",
    "\");return a.j},0);M(\"local-name\",3,!1,!0,function(a,b){return(a=b?B(",
    "b.evaluate(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0)",
    ";M(\"name\",3,!1,!0,function(a,b){return(a=b?B(b.evaluate(a)):a.l)?a.no",
    "deName.toLowerCase():\"\"},0,1,!0);M(\"namespace-uri\",3,!0,!1,function",
    "(){return\"\"},0,1,!0);\nM(\"normalize-space\",3,!1,!0,function(a,b){re",
    "turn(b?F(b,a):v(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+",
    "$/g,\"\")},0,1);M(\"not\",2,!1,!1,function(a,b){return!G(b,a)},1);M(\"n",
    "umber\",1,!1,!0,function(a,b){return b?E(b,a):+v(a.l)},0,1);M(\"positio",
    "n\",1,!0,!1,function(a){return a.ka},0);M(\"round\",1,!1,!1,function(a,",
    "b){return Math.round(E(b,a))},1);M(\"starts-with\",2,!1,!1,function(a,b",
    ",c){b=F(b,a);a=F(c,a);return 0==b.lastIndexOf(a,0)},2);M(\"string\",3,!",
    "1,!0,function(a,b){return b?F(b,a):v(a.l)},0,1);\nM(\"string-length\",1",
    ",!1,!0,function(a,b){return(b?F(b,a):v(a.l)).length},0,1);M(\"substring",
    "\",3,!1,!1,function(a,b,c,d){c=E(c,a);if(isNaN(c)||Infinity==c||-Infini",
    "ty==c)return\"\";d=d?E(d,a):Infinity;if(isNaN(d)||-Infinity===d)return",
    "\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=F(b,a);return Infinity==d?",
    "a.substring(e):a.substring(e,c+Math.round(d))},2,3);M(\"substring-after",
    "\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);c=b.indexOf(a);return-1==c",
    "?\"\":b.substring(c+a.length)},2);\nM(\"substring-before\",3,!1,!1,func",
    "tion(a,b,c){b=F(b,a);a=F(c,a);a=b.indexOf(a);return-1==a?\"\":b.substri",
    "ng(0,a)},2);M(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();",
    "b=0;for(var c=a.next();c;c=a.next())b+=+v(c);return b},1,1,!0);M(\"tran",
    "slate\",3,!1,!1,function(a,b,c,d){b=F(b,a);c=F(c,a);var e=F(d,a);d={};f",
    "or(var f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"",
    "\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);M",
    "(\"true\",2,!1,!1,function(){return!0},0);function A(a,b){this.ca=a;thi",
    "s.X=void 0!==b?b:null;this.B=null;switch(a){case \"comment\":this.B=8;b",
    "reak;case \"text\":this.B=3;break;case \"processing-instruction\":this.",
    "B=7;break;case \"node\":break;default:throw Error(\"Unexpected argument",
    "\");}}function Ea(a){return\"comment\"==a||\"text\"==a||\"processing-in",
    "struction\"==a||\"node\"==a}A.prototype.matches=function(a){return null",
    "===this.B||this.B==a.nodeType};A.prototype.getName=function(){return th",
    "is.ca};\nA.prototype.toString=function(){var a=\"Kind Test: \"+this.ca;",
    "null===this.X||(a+=D(this.X));return a};function N(a){m.call(this,3);th",
    "is.ba=a.substring(1,a.length-1)}k(N);N.prototype.evaluate=function(){re",
    "turn this.ba};N.prototype.toString=function(){return\"Literal: \"+this.",
    "ba};function O(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http",
    "://www.w3.org/1999/xhtml\";this.J=b?b.toLowerCase():a}O.prototype.match",
    "es=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.loc",
    "alName?a.localName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCas",
    "e()?!1:\"*\"==this.J?!0:this.J==(a.namespaceURI?a.namespaceURI.toLowerC",
    "ase():\"http://www.w3.org/1999/xhtml\")};O.prototype.getName=function()",
    "{return this.i};\nO.prototype.toString=function(){return\"Name Test: \"",
    "+(\"http://www.w3.org/1999/xhtml\"==this.J?\"\":this.J+\":\")+this.i};f",
    "unction P(a){m.call(this,1);this.da=a}k(P);P.prototype.evaluate=functio",
    "n(){return this.da};P.prototype.toString=function(){return\"Number: \"+",
    "this.da};function Q(a,b){m.call(this,a.f);this.V=a;this.G=b;this.o=a.c(",
    ");this.h=a.h;1==this.G.length&&(a=this.G[0],a.N||a.s!=Fa||(a=a.L,\"*\"!",
    "=a.getName()&&(this.F={name:a.getName(),C:null})))}k(Q);function R(){m.",
    "call(this,4)}k(R);R.prototype.evaluate=function(a){var b=new z;a=a.l;9=",
    "=a.nodeType?b.add(a):b.add(a.ownerDocument);return b};R.prototype.toStr",
    "ing=function(){return\"Root Helper Expression\"};function S(){m.call(th",
    "is,4)}k(S);S.prototype.evaluate=function(a){var b=new z;b.add(a.l);retu",
    "rn b};\nS.prototype.toString=function(){return\"Context Helper Expressi",
    "on\"};function Ga(a){return\"/\"==a||\"//\"==a}\nQ.prototype.evaluate=f",
    "unction(a){var b=this.V.evaluate(a);if(!(b instanceof z))throw Error(\"",
    "Filter expression must evaluate to nodeset.\");a=this.G;for(var c=0,d=a",
    ".length;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=H",
    "a)if(e.c()||e.s!=Ia){var g=f.next();for(b=e.evaluate(new r(g));null!=(g",
    "=f.next());)g=e.evaluate(new r(g)),b=ua(b,g)}else g=f.next(),b=e.evalua",
    "te(new r(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains",
    "(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new r(g))}}retur",
    "n b};\nQ.prototype.toString=function(){var a=\"Path Expression:\"+D(thi",
    "s.V);if(this.G.length){var b=p(this.G,function(a,b){return a+D(b)},\"St",
    "eps:\");a+=D(b)}return a};function T(a,b){this.b=a;this.A=!!b}function ",
    "Ba(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f",
    "=b.m(),g,l=0;g=e.next();l++){var w=a.A?f-l:l+1;g=d.evaluate(new r(g,w,f",
    "));if(\"number\"==typeof g)w=w==g;else if(\"string\"==typeof g||\"boole",
    "an\"==typeof g)w=!!g;else if(g instanceof z)w=0<g.m();else throw Error(",
    "\"Predicate.evaluate returned an unexpected type.\");w||e.remove()}retu",
    "rn b}T.prototype.u=function(){return 0<this.b.length?this.b[0].u():null",
    "};\nT.prototype.c=function(){for(var a=0;a<this.b.length;a++){var b=thi",
    "s.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};T.prototype.m=functi",
    "on(){return this.b.length};T.prototype.toString=function(){return p(thi",
    "s.b,function(a,b){return a+D(b)},\"Predicates:\")};function U(a,b,c,d){",
    "m.call(this,4);this.s=a;this.L=b;this.b=c||new T([]);this.N=!!d;b=this.",
    "b.u();a.la&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()}k(U);\nU.",
    "prototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,e=null,f=0;c",
    "&&(d=c.name,e=c.C?F(c.C,a):null,f=1);if(this.N)if(this.c()||this.s!=Ja)",
    "if(b=(new U(Ka,new A(\"node\"))).evaluate(a).iterator(),c=b.next())for(",
    "a=this.v(c,d,e,f);null!=(c=b.next());)a=ua(a,this.v(c,d,e,f));else a=ne",
    "w z;else a=y(this.L,b,d,e),a=Ba(this.b,a,f);else a=this.v(a.l,d,e,f);re",
    "turn a};U.prototype.v=function(a,b,c,d){a=this.s.H(this.L,a,b,c);return",
    " a=Ba(this.b,a,d)};\nU.prototype.toString=function(){var a=\"Step:\"+D(",
    "\"Operator: \"+(this.N?\"//\":\"/\"));this.s.i&&(a+=D(\"Axis: \"+this.s",
    "));a+=D(this.L);if(this.b.m()){var b=p(this.b.b,function(a,b){return a+",
    "D(b)},\"Predicates:\");a+=D(b)}return a};function La(a,b,c,d){this.i=a;",
    "this.H=b;this.A=c;this.la=d}La.prototype.toString=function(){return thi",
    "s.i};var Ma={};function V(a,b,c,d){if(Ma.hasOwnProperty(a))throw Error(",
    "\"Axis already created: \"+a);b=new La(a,b,c,!!d);return Ma[a]=b}\nV(\"",
    "ancestor\",function(a,b){for(var c=new z;b=b.parentNode;)a.matches(b)&&",
    "c.unshift(b);return c},!0);V(\"ancestor-or-self\",function(a,b){var c=n",
    "ew z;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);",
    "\nvar Fa=V(\"attribute\",function(a,b){var c=new z,d=a.getName();if(b=b",
    ".attributes)if(a instanceof A&&null===a.B||\"*\"==d)for(d=0;a=b[d];d++)",
    "c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1),Ja=V(\"child",
    "\",function(a,b,c,d,e){c=h(c)?c:null;d=h(d)?d:null;e=e||new z;for(b=b.f",
    "irstChild;b;b=b.nextSibling)x(b,c,d)&&a.matches(b)&&e.add(b);return e},",
    "!1,!0);V(\"descendant\",y,!1,!0);\nvar Ka=V(\"descendant-or-self\",func",
    "tion(a,b,c,d){var e=new z;x(b,c,d)&&a.matches(b)&&e.add(b);return y(a,b",
    ",c,d,e)},!1,!0),Ha=V(\"following\",function(a,b,c,d){var e=new z;do for",
    "(var f=b;f=f.nextSibling;)x(f,c,d)&&a.matches(f)&&e.add(f),e=y(a,f,c,d,",
    "e);while(b=b.parentNode);return e},!1,!0);V(\"following-sibling\",funct",
    "ion(a,b){for(var c=new z;b=b.nextSibling;)a.matches(b)&&c.add(b);return",
    " c},!1);V(\"namespace\",function(){return new z},!1);\nvar Na=V(\"paren",
    "t\",function(a,b){var c=new z;if(9==b.nodeType)return c;if(2==b.nodeTyp",
    "e)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);",
    "return c},!1),Ia=V(\"preceding\",function(a,b,c,d){var e=new z,f=[];do ",
    "f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.length;g<l;g++){var ",
    "w=[];for(b=f[g];b=b.previousSibling;)w.unshift(b);for(var la=0,$a=w.len",
    "gth;la<$a;la++)b=w[la],x(b,c,d)&&a.matches(b)&&e.add(b),e=y(a,b,c,d,e)}",
    "return e},!0,!0);\nV(\"preceding-sibling\",function(a,b){for(var c=new ",
    "z;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Oa=",
    "V(\"self\",function(a,b){var c=new z;a.matches(b)&&c.add(b);return c},!",
    "1);function W(a){m.call(this,1);this.U=a;this.o=a.c();this.h=a.h}k(W);W",
    ".prototype.evaluate=function(a){return-E(this.U,a)};W.prototype.toStrin",
    "g=function(){return\"Unary Expression: -\"+D(this.U)};function X(a){m.c",
    "all(this,4);this.K=a;wa(this,q(this.K,function(a){return a.c()}));xa(th",
    "is,q(this.K,function(a){return a.h}))}k(X);X.prototype.evaluate=functio",
    "n(a){var b=new z;n(this.K,function(c){c=c.evaluate(a);if(!(c instanceof",
    " z))throw Error(\"Path expression must evaluate to NodeSet.\");b=ua(b,c",
    ")});return b};X.prototype.toString=function(){return p(this.K,function(",
    "a,b){return a+D(b)},\"Union Expression:\")};function Pa(a,b){this.a=a;t",
    "his.ia=b}function Qa(a){for(var b,c=[];;){Y(a,\"Missing right hand side",
    " of binary expression.\");b=Ra(a);var d=a.a.next();if(!d)break;var e=(d",
    "=Aa[d]||null)&&d.Z;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length",
    "-1].Z;)b=new H(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new H(c.",
    "pop(),c.pop(),b);return b}function Y(a,b){if(a.a.empty())throw Error(b)",
    ";}function Sa(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expect",
    "ed: \"+b+\" got: \"+a);}\nfunction Ta(a){a=a.a.next();if(\")\"!=a)throw",
    " Error(\"Bad token: \"+a);}function Ua(a){a=a.a.next();if(2>a.length)th",
    "row Error(\"Unclosed literal string\");return new N(a)}\nfunction Va(a)",
    "{var b=[];if(Ga(u(a.a))){var c=a.a.next();var d=u(a.a);if(\"/\"==c&&(a.",
    "a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.t",
    "est(d)))return new R;d=new R;Y(a,\"Missing next location step.\");c=Wa(",
    "a,c);b.push(c)}else{a:{c=u(a.a);d=c.charAt(0);switch(d){case \"$\":thro",
    "w Error(\"Variable reference not allowed in HTML XPath\");case \"(\":a.",
    "a.next();c=Qa(a);Y(a,'unclosed \"(\"');Sa(a,\")\");break;case '\"':case",
    " \"'\":c=Ua(a);break;default:if(isNaN(+c))if(!Ea(c)&&/(?![0-9])[\\w]/.t",
    "est(d)&&\"(\"==u(a.a,\n1)){c=a.a.next();c=Da[c]||null;a.a.next();for(d=",
    "[];\")\"!=u(a.a);){Y(a,\"Missing function argument list.\");d.push(Qa(a",
    "));if(\",\"!=u(a.a))break;a.a.next()}Y(a,\"Unclosed function argument l",
    "ist.\");Ta(a);c=new L(c,d)}else{c=null;break a}else c=new P(+a.a.next()",
    ")}\"[\"==u(a.a)&&(d=new T(Xa(a)),c=new K(c,d))}if(c)if(Ga(u(a.a)))d=c;e",
    "lse return c;else c=Wa(a,\"/\"),d=new S,b.push(c)}for(;Ga(u(a.a));)c=a.",
    "a.next(),Y(a,\"Missing next location step.\"),c=Wa(a,c),b.push(c);retur",
    "n new Q(d,b)}\nfunction Wa(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Ste",
    "p op should be \"/\" or \"//\"');if(\".\"==u(a.a)){var c=new U(Oa,new A",
    "(\"node\"));a.a.next();return c}if(\"..\"==u(a.a))return c=new U(Na,new",
    " A(\"node\")),a.a.next(),c;if(\"@\"==u(a.a)){var d=Fa;a.a.next();Y(a,\"",
    "Missing attribute name\")}else if(\"::\"==u(a.a,1)){if(!/(?![0-9])[\\w]",
    "/.test(u(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=",
    "a.a.next();d=Ma[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a",
    ".a.next();Y(a,\"Missing node name\")}else d=Ja;e=\nu(a.a);if(/(?![0-9])",
    "[\\w\\*]/.test(e.charAt(0)))if(\"(\"==u(a.a,1)){if(!Ea(e))throw Error(",
    "\"Invalid node type: \"+e);e=a.a.next();if(!Ea(e))throw Error(\"Invalid",
    " type name: \"+e);Sa(a,\"(\");Y(a,\"Bad nodetype\");var f=u(a.a).charAt",
    "(0),g=null;if('\"'==f||\"'\"==f)g=Ua(a);Y(a,\"Bad nodetype\");Ta(a);e=n",
    "ew A(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new O(e);else",
    "{var g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ia(g),!l)th",
    "row Error(\"Namespace prefix not declared: \"+g);e=e.substr(f+1);e=new ",
    "O(e,l)}else throw Error(\"Bad token: \"+\na.a.next());a=new T(Xa(a),d.A",
    ");return c||new U(d,e,a,\"//\"==b)}function Xa(a){for(var b=[];\"[\"==u",
    "(a.a);){a.a.next();Y(a,\"Missing predicate expression.\");var c=Qa(a);b",
    ".push(c);Y(a,\"Unclosed predicate expression.\");Sa(a,\"]\")}return b}f",
    "unction Ra(a){if(\"-\"==u(a.a))return a.a.next(),new W(Ra(a));var b=Va(",
    "a);if(\"|\"!=u(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing",
    " next union location path.\"),b.push(Va(a));a.a.back();a=new X(b)}retur",
    "n a};function Ya(a){switch(a.nodeType){case 1:return ga(Za,a);case 9:re",
    "turn Ya(a.documentElement);case 11:case 10:case 6:case 12:return ab;def",
    "ault:return a.parentNode?Ya(a.parentNode):ab}}function ab(){return null",
    "}function Za(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3",
    ".org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.sp",
    "ecified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?Za(a.paren",
    "tNode,b):null};function bb(a,b){if(!a.length)throw Error(\"Empty XPath ",
    "expression.\");a=oa(a);if(a.empty())throw Error(\"Invalid XPath express",
    "ion.\");b?\"function\"==ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=functio",
    "n(){return null};var c=Qa(new Pa(a,b));if(!a.empty())throw Error(\"Bad ",
    "token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new r(a));",
    "return new Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceof z)b=4;else",
    " if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(",
    "\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected evaluation resu",
    "lt.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof z))throw Error(\"value could",
    " not be converted to the specified type\");this.resultType=b;switch(b){",
    "case 2:this.stringValue=a instanceof z?C(a):\"\"+a;break;case 1:this.nu",
    "mberValue=a instanceof z?+C(a):+a;break;case 3:this.booleanValue=a inst",
    "anceof z?0<a.m():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterat",
    "or();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLe",
    "ngth=a.m();this.invalidIteratorState=!1;break;case 8:case 9:this.single",
    "NodeValue=B(a);break;default:throw Error(\"Unknown XPathResult type.\")",
    ";}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"itera",
    "teNext called with wrong result type\");return f>=d.length?null:d[f++]}",
    ";this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem",
    " called with wrong result type\");return a>=d.length||0>a?null:d[a]}}\n",
    "Z.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDER",
    "ED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE",
    "_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TY",
    "PE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function cb(a){this.lookupNamespaceURI",
    "=Ya(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&",
    "&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Z,c.e",
    "valuate=function(a,b,c,g){return(new bb(a,c)).evaluate(b,g)},c.createEx",
    "pression=function(a,b){return new bb(a,b)},c.createNSResolver=function(",
    "a){return new cb(a)}});ba(\"_\",function(a,b){function c(a,b){a={clicka",
    "ble:a};b&&(a.message=b);return a}for(var d=a;d.parentNode;)d=d.parentNo",
    "de;var e=d.elementFromPoint(b.x,b.y);if(e==a)return c(!0);b=\"(\"+b.x+",
    "\", \"+b.y+\")\";if(null==e)return c(!1,\"Element is not clickable at p",
    "oint \"+b);d=e.outerHTML.replace(e.innerHTML,e.hasChildNodes()?\"...\":",
    "\"\");for(e=e.parentNode;e;){if(e==a)return c(!0,\"Element's descendant",
    " would receive the click. Consider clicking the descendant instead. Des",
    "cendant: \"+d);e=e.parentNode}a=a.outerHTML.replace(a.innerHTML,\na.has",
    "ChildNodes()?\"...\":\"\");return c(!1,\"Element \"+a+\" is not clickab",
    "le at point \"+b+\". Other element would receive the click: \"+d)});; r",
    "eturn this._.apply(null,arguments);}.apply({navigator:typeof window!='u",
    "ndefined'?window.navigator:null,document:typeof window!='undefined'?win",
    "dow.document:null}, arguments);}",
    NULL
};

const char* const IS_ELEMENT_DISPLAYED[] = {
    "function(){return function(){var h,aa=this;function k(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){var b=typeof a;retu",
    "rn\"object\"==b&&null!=a||\"function\"==b}function fa(a,b,c){return a.c",
    "all.apply(a.bind,arguments)}\nfunction ga(a,b,c){if(!a)throw Error();if",
    "(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);retu",
    "rn function(){var c=Array.prototype.slice.call(arguments);Array.prototy",
    "pe.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.a",
    "pply(b,arguments)}}function ha(a,b,c){ha=Function.prototype.bind&&-1!=F",
    "unction.prototype.bind.toString().indexOf(\"native code\")?fa:ga;return",
    " ha.apply(null,arguments)}\nfunction ia(a,b){var c=Array.prototype.slic",
    "e.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,ar",
    "guments);return a.apply(this,b)}}function p(a,b){function c(){}c.protot",
    "ype=b.prototype;a.ta=b.prototype;a.prototype=new c;a.prototype.construc",
    "tor=a;a.ra=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<ar",
    "guments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)",
    "}};function ja(a){return String(a).replace(/\\-([a-z])/g,function(a,c){",
    "return c.toUpperCase()})};function ka(a,b){if(m(a))return m(b)&&1==b.le",
    "ngth?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)r",
    "eturn c;return-1}function r(a,b){for(var c=a.length,d=m(a)?a.split(\"\"",
    "):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function t(a,b,c){var d",
    "=c;r(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}function la(a,",
    "b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.c",
    "all(void 0,d[e],e,a))return!0;return!1}\nfunction ma(a,b){for(var c=a.l",
    "ength,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e]",
    ",e,a))return!1;return!0}function na(a){return Array.prototype.concat.ap",
    "ply([],arguments)}function oa(a){var b=a.length;if(0<b){for(var c=Array",
    "(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function pa(a,b,c){return 2",
    ">=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slic",
    "e.call(a,b,c)};var qa={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",a",
    "qua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5d",
    "c\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blu",
    "e:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb",
    "887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e",
    "\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",cr",
    "imson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008",
    "b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#00640",
    "0\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b",
    "\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932",
    "cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f",
    "\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"",
    "#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#",
    "ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969",
    "\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\"",
    ",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\ngh",
    "ostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808",
    "080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeyd",
    "ew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b00",
    "82\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderb",
    "lush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightbl",
    "ue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgolden",
    "rodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",ligh",
    "tgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlight",
    "seagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899",
    "\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"",
    "#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",mage",
    "nta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumb",
    "lue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediu",
    "mseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#",
    "00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnig",
    "htblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccas",
    "in:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5",
    "e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",oranger",
    "ed:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:",
    "\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayaw",
    "hip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\"",
    ",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff00",
    "00\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513",
    "\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nsea",
    "shell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ce",
    "eb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",",
    "snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d",
    "2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoi",
    "se:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",w",
    "hitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var r",
    "a=\"backgroundColor borderTopColor borderRightColor borderBottomColor b",
    "orderLeftColor color outlineColor\".split(\" \"),sa=/#([0-9a-fA-F])([0-",
    "9a-fA-F])([0-9a-fA-F])/,ta=/^#(?:[0-9a-f]{3}){1,2}$/i,ua=/^(?:rgba)?\\(",
    "(\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,wa=/^",
    "(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}",
    ")\\)$/i;function xa(a,b){this.code=a;this.state=u[a]||ya;this.message=b",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.ind",
    "exOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}p(xa,Error);var ya=\"unknown err",
    "or\",u={15:\"element not selectable\",11:\"element not visible\"};u[31]",
    "=ya;u[30]=ya;u[24]=\"invalid cookie domain\";u[29]=\"invalid element co",
    "ordinates\";u[12]=\"invalid element state\";\nu[32]=\"invalid selector",
    "\";u[51]=\"invalid selector\";u[52]=\"invalid selector\";u[17]=\"javasc",
    "ript error\";u[405]=\"unsupported operation\";u[34]=\"move target out o",
    "f bounds\";u[27]=\"no such alert\";u[7]=\"no such element\";u[8]=\"no s",
    "uch frame\";u[23]=\"no such window\";u[28]=\"script timeout\";u[33]=\"s",
    "ession not created\";u[10]=\"stale element reference\";u[21]=\"timeout",
    "\";u[25]=\"unable to set cookie\";u[26]=\"unexpected alert open\";u[13]",
    "=ya;u[9]=\"unknown command\";xa.prototype.toString=function(){return th",
    "is.name+\": \"+this.message};function v(a,b){this.x=k(a)?a:0;this.y=k(b",
    ")?b:0}h=v.prototype;h.clone=function(){return new v(this.x,this.y)};h.t",
    "oString=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=funct",
    "ion(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.",
    "floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);re",
    "turn this};h.round=function(){this.x=Math.round(this.x);this.y=Math.rou",
    "nd(this.y);return this};\nh.translate=function(a,b){a instanceof v?(thi",
    "s.x+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this",
    "};h.scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};fun",
    "ction za(a,b){this.width=a;this.height=b}h=za.prototype;h.clone=functio",
    "n(){return new za(this.width,this.height)};h.toString=function(){return",
    "\"(\"+this.width+\" x \"+this.height+\")\"};h.ceil=function(){this.widt",
    "h=Math.ceil(this.width);this.height=Math.ceil(this.height);return this}",
    ";h.floor=function(){this.width=Math.floor(this.width);this.height=Math.",
    "floor(this.height);return this};h.round=function(){this.width=Math.roun",
    "d(this.width);this.height=Math.round(this.height);return this};\nh.scal",
    "e=function(a,b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};fu",
    "nction Aa(a,b,c){function d(c){c&&b.appendChild(m(c)?a.createTextNode(c",
    "):c)}for(var e=1;e<c.length;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType",
    "?d(f):r(Ba(f)?oa(f):f,d)}}function Ca(a,b){if(!a||!b)return!1;if(a.cont",
    "ains&&1==b.nodeType)return a==b||a.contains(b);if(\"undefined\"!=typeof",
    " a.compareDocumentPosition)return a==b||!!(a.compareDocumentPosition(b)",
    "&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction Da(a,b){if(a==",
    "b)return 0;if(a.compareDocumentPosition)return a.compareDocumentPositio",
    "n(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourceIndex\"in a.p",
    "arentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceI",
    "ndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==f?Ea(a,b",
    "):!c&&Ca(e,b)?-1*Fa(a,b):!d&&Ca(f,a)?Fa(b,a):(c?a.sourceIndex:e.sourceI",
    "ndex)-(d?b.sourceIndex:f.sourceIndex)}d=x(a);c=d.createRange();c.select",
    "Node(a);c.collapse(!0);a=d.createRange();a.selectNode(b);\na.collapse(!",
    "0);return c.compareBoundaryPoints(aa.Range.START_TO_END,a)}function Fa(",
    "a,b){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.pare",
    "ntNode;return Ea(b,a)}function Ea(a,b){for(;b=b.previousSibling;)if(b==",
    "a)return-1;return 1}function x(a){return 9==a.nodeType?a:a.ownerDocumen",
    "t||a.document}function Ba(a){if(a&&\"number\"==typeof a.length){if(ea(a",
    "))return\"function\"==typeof a.item||\"string\"==typeof a.item;if(\"fun",
    "ction\"==ca(a))return\"function\"==typeof a.item}return!1}\nfunction Ga",
    "(a,b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNo",
    "de;c++}return null}function Ha(a){this.H=a||aa.document||document}h=Ha.",
    "prototype;h.getElementsByTagName=function(a,b){return(b||this.H).getEle",
    "mentsByTagName(String(a))};h.createElement=function(a){return this.H.cr",
    "eateElement(String(a))};h.createTextNode=function(a){return this.H.crea",
    "teTextNode(String(a))};h.appendChild=function(a,b){a.appendChild(b)};h.",
    "append=function(a,b){Aa(x(a),a,arguments)};\nh.canHaveChildren=function",
    "(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPLET\":case \"",
    "AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAND\":case \"E",
    "MBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IF",
    "RAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\"",
    ":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PARAM\":case \"",
    "SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":ret",
    "urn!1}return!0};h.removeNode=function(a){return a&&a.parentNode?a.paren",
    "tNode.removeChild(a):null};\nh.contains=Ca;function z(a,b){b&&\"string",
    "\"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagNam",
    "e.toUpperCase()==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybo",
    "zu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby",
    " granted, free of charge, to any person obtaining a copy\n of this soft",
    "ware and associated documentation files (the \"Software\"), to\n deal i",
    "n the Software without restriction, including without limitation the\n ",
    "rights to use, copy, modify, merge, publish, distribute, sublicense, an",
    "d/or\n sell copies of the Software, and to permit persons to whom the S",
    "oftware is\n furnished to do so, subject to the following conditions:\n",
    "\n The above copyright notice and this permission notice shall be inclu",
    "ded in\n all copies or substantial portions of the Software.\n\n THE SO",
    "FTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
    "\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL",
    "ITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVEN",
    "T SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAM",
    "AGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OT",
    "HERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR T",
    "HE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction A(a,b,c){this",
    ".l=a;this.oa=b||1;this.j=c||1};function Ia(a){this.T=a;this.J=0}functio",
    "n Ja(a){a=a.match(Ka);for(var b=0;b<a.length;b++)La.test(a[b])&&a.splic",
    "e(b,1);return new Ia(a)}var Ka=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):",
    ")?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.",
    "\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,La=/^\\s/;function B(a,b){retur",
    "n a.T[a.J+(b||0)]}Ia.prototype.next=function(){return this.T[this.J++]}",
    ";Ia.prototype.back=function(){this.J--};Ia.prototype.empty=function(){r",
    "eturn this.T.length<=this.J};function C(a){var b=null,c=a.nodeType;1==c",
    "&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null",
    "==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentEle",
    "ment:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.n",
    "odeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling",
    "););}}else b=a.nodeValue;return\"\"+b}\nfunction E(a,b,c){if(null===b)r",
    "eturn!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==",
    "c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function Ma(a,b,c,d,e){ret",
    "urn Na.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new F)}\nfunction Na(a,",
    "b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),",
    "r(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&",
    "\"class\"==c?(b=b.getElementsByClassName(d),r(b,function(b){b.className",
    "==d&&a.matches(b)&&e.add(b)})):a instanceof G?Oa(a,b,c,d,e):b.getElemen",
    "tsByTagName&&(b=b.getElementsByTagName(a.getName()),r(b,function(a){E(a",
    ",c,d)&&e.add(a)}));return e}function Oa(a,b,c,d,e){for(b=b.firstChild;b",
    ";b=b.nextSibling)E(b,c,d)&&a.matches(b)&&e.add(b),Oa(a,b,c,d,e)};functi",
    "on F(){this.j=this.g=null;this.D=0}function Pa(a){this.node=a;this.next",
    "=this.w=null}function Qa(a,b){if(!a.g)return b;if(!b.g)return a;var c=a",
    ".g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.ne",
    "xt):0<Da(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:",
    "a.g=e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;r",
    "eturn a}F.prototype.unshift=function(a){a=new Pa(a);a.next=this.g;this.",
    "j?this.g.w=a:this.g=this.j=a;this.g=a;this.D++};\nF.prototype.add=funct",
    "ion(a){a=new Pa(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this",
    ".j=a;this.D++};function Ra(a){return(a=a.g)?a.node:null}F.prototype.o=f",
    "unction(){return this.D};function Sa(a){return(a=Ra(a))?C(a):\"\"}F.pro",
    "totype.iterator=function(a){return new Ta(this,!!a)};function Ta(a,b){t",
    "his.ka=a;this.W=(this.A=b)?a.j:a.g;this.P=null}Ta.prototype.next=functi",
    "on(){var a=this.W;if(null==a)return null;var b=this.P=a;this.W=this.A?a",
    ".w:a.next;return b.node};\nTa.prototype.remove=function(){var a=this.ka",
    ",b=this.P;if(!b)throw Error(\"Next must be called at least once before ",
    "remove.\");var c=b.w,b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this",
    ".P=null};function I(a){this.f=a;this.h=this.s=!1;this.F=null}function J",
    "(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}I.proto",
    "type.c=function(){return this.s};function Ua(a,b){a.s=b}function Va(a,b",
    "){a.h=b}I.prototype.v=function(){return this.F};function K(a,b){a=a.eva",
    "luate(b);return a instanceof F?+Sa(a):+a}function L(a,b){a=a.evaluate(b",
    ");return a instanceof F?Sa(a):\"\"+a}function M(a,b){a=a.evaluate(b);re",
    "turn a instanceof F?!!a.o():!!a};function Wa(a,b,c){I.call(this,a.f);th",
    "is.S=a;this.$=b;this.ea=c;this.s=b.c()||c.c();this.h=b.h||c.h;this.S==X",
    "a&&(c.h||c.c()||4==c.f||0==c.f||!b.v()?b.h||b.c()||4==b.f||0==b.f||!c.v",
    "()||(this.F={name:c.v().name,C:b}):this.F={name:b.v().name,C:c})}p(Wa,I",
    ");\nfunction N(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b in",
    "stanceof F&&c instanceof F){b=b.iterator();for(d=b.next();d;d=b.next())",
    "for(e=c.iterator(),f=e.next();f;f=e.next())if(a(C(d),C(f)))return!0;ret",
    "urn!1}if(b instanceof F||c instanceof F){b instanceof F?(e=b,d=c):(e=c,",
    "d=b);f=e.iterator();for(var g=typeof d,l=f.next();l;l=f.next()){switch(",
    "g){case \"number\":l=+C(l);break;case \"boolean\":l=!!C(l);break;case ",
    "\"string\":l=C(l);break;default:throw Error(\"Illegal primitive type fo",
    "r comparison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}ret",
    "urn e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number",
    "\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}Wa.prototyp",
    "e.evaluate=function(a){return this.S.m(this.$,this.ea,a)};Wa.prototype.",
    "toString=function(){var a=\"Binary Expression: \"+this.S,a=a+J(this.$);",
    "return a+=J(this.ea)};function Ya(a,b,c,d){this.na=a;this.ca=b;this.f=c",
    ";this.m=d}Ya.prototype.toString=function(){return this.na};var Za={};\n",
    "function O(a,b,c,d){if(Za.hasOwnProperty(a))throw Error(\"Binary operat",
    "or already created: \"+a);a=new Ya(a,b,c,d);return Za[a.toString()]=a}O",
    "(\"div\",6,1,function(a,b,c){return K(a,c)/K(b,c)});O(\"mod\",6,1,funct",
    "ion(a,b,c){return K(a,c)%K(b,c)});O(\"*\",6,1,function(a,b,c){return K(",
    "a,c)*K(b,c)});O(\"+\",5,1,function(a,b,c){return K(a,c)+K(b,c)});O(\"-",
    "\",5,1,function(a,b,c){return K(a,c)-K(b,c)});O(\"<\",4,2,function(a,b,",
    "c){return N(function(a,b){return a<b},a,b,c)});\nO(\">\",4,2,function(a",
    ",b,c){return N(function(a,b){return a>b},a,b,c)});O(\"<=\",4,2,function",
    "(a,b,c){return N(function(a,b){return a<=b},a,b,c)});O(\">=\",4,2,funct",
    "ion(a,b,c){return N(function(a,b){return a>=b},a,b,c)});var Xa=O(\"=\",",
    "3,2,function(a,b,c){return N(function(a,b){return a==b},a,b,c,!0)});O(",
    "\"!=\",3,2,function(a,b,c){return N(function(a,b){return a!=b},a,b,c,!0",
    ")});O(\"and\",2,2,function(a,b,c){return M(a,c)&&M(b,c)});O(\"or\",1,2,",
    "function(a,b,c){return M(a,c)||M(b,c)});function $a(a,b){if(b.o()&&4!=a",
    ".f)throw Error(\"Primary expression must evaluate to nodeset if filter ",
    "has predicate(s).\");I.call(this,a.f);this.da=a;this.b=b;this.s=a.c();t",
    "his.h=a.h}p($a,I);$a.prototype.evaluate=function(a){a=this.da.evaluate(",
    "a);return ab(this.b,a)};$a.prototype.toString=function(){var a=\"Filter",
    ":\"+J(this.da);return a+=J(this.b)};function bb(a,b){if(b.length<a.ba)t",
    "hrow Error(\"Function \"+a.i+\" expects at least\"+a.ba+\" arguments, ",
    "\"+b.length+\" given\");if(null!==a.R&&b.length>a.R)throw Error(\"Funct",
    "ion \"+a.i+\" expects at most \"+a.R+\" arguments, \"+b.length+\" given",
    "\");a.la&&r(b,function(b,d){if(4!=b.f)throw Error(\"Argument \"+d+\" to",
    " function \"+a.i+\" is not of type Nodeset: \"+b);});I.call(this,a.f);t",
    "his.I=a;this.N=b;Ua(this,a.s||la(b,function(a){return a.c()}));Va(this,",
    "a.ja&&!b.length||a.ia&&!!b.length||la(b,function(a){return a.h}))}\np(b",
    "b,I);bb.prototype.evaluate=function(a){return this.I.m.apply(null,na(a,",
    "this.N))};bb.prototype.toString=function(){var a=\"Function: \"+this.I;",
    "if(this.N.length)var b=t(this.N,function(a,b){return a+J(b)},\"Argument",
    "s:\"),a=a+J(b);return a};function cb(a,b,c,d,e,f,g,l,w){this.i=a;this.f",
    "=b;this.s=c;this.ja=d;this.ia=e;this.m=f;this.ba=g;this.R=k(l)?l:g;this",
    ".la=!!w}cb.prototype.toString=function(){return this.i};var db={};\nfun",
    "ction P(a,b,c,d,e,f,g,l){if(db.hasOwnProperty(a))throw Error(\"Function",
    " already created: \"+a+\".\");db[a]=new cb(a,b,c,d,!1,e,f,g,l)}P(\"bool",
    "ean\",2,!1,!1,function(a,b){return M(b,a)},1);P(\"ceiling\",1,!1,!1,fun",
    "ction(a,b){return Math.ceil(K(b,a))},1);P(\"concat\",3,!1,!1,function(a",
    ",b){return t(pa(arguments,1),function(b,d){return b+L(d,a)},\"\")},2,nu",
    "ll);P(\"contains\",2,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);return-1!=",
    "b.indexOf(a)},2);P(\"count\",1,!1,!1,function(a,b){return b.evaluate(a)",
    ".o()},1,1,!0);\nP(\"false\",2,!1,!1,function(){return!1},0);P(\"floor\"",
    ",1,!1,!1,function(a,b){return Math.floor(K(b,a))},1);P(\"id\",4,!1,!1,f",
    "unction(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDocument;a=L(b,a).split",
    "(/\\s+/);var e=[];r(a,function(a){a=d.getElementById(a);!a||0<=ka(e,a)|",
    "|e.push(a)});e.sort(Da);var f=new F;r(e,function(a){f.add(a)});return f",
    "},1);P(\"lang\",2,!1,!1,function(){return!1},1);P(\"last\",1,!0,!1,func",
    "tion(a){if(1!=arguments.length)throw Error(\"Function last expects ()\"",
    ");return a.j},0);\nP(\"local-name\",3,!1,!0,function(a,b){return(a=b?Ra",
    "(b.evaluate(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0",
    ");P(\"name\",3,!1,!0,function(a,b){return(a=b?Ra(b.evaluate(a)):a.l)?a.",
    "nodeName.toLowerCase():\"\"},0,1,!0);P(\"namespace-uri\",3,!0,!1,functi",
    "on(){return\"\"},0,1,!0);P(\"normalize-space\",3,!1,!0,function(a,b){re",
    "turn(b?L(b,a):C(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+",
    "$/g,\"\")},0,1);P(\"not\",2,!1,!1,function(a,b){return!M(b,a)},1);\nP(",
    "\"number\",1,!1,!0,function(a,b){return b?K(b,a):+C(a.l)},0,1);P(\"posi",
    "tion\",1,!0,!1,function(a){return a.oa},0);P(\"round\",1,!1,!1,function",
    "(a,b){return Math.round(K(b,a))},1);P(\"starts-with\",2,!1,!1,function(",
    "a,b,c){b=L(b,a);a=L(c,a);return 0==b.lastIndexOf(a,0)},2);P(\"string\",",
    "3,!1,!0,function(a,b){return b?L(b,a):C(a.l)},0,1);P(\"string-length\",",
    "1,!1,!0,function(a,b){return(b?L(b,a):C(a.l)).length},0,1);\nP(\"substr",
    "ing\",3,!1,!1,function(a,b,c,d){c=K(c,a);if(isNaN(c)||Infinity==c||-Inf",
    "inity==c)return\"\";d=d?K(d,a):Infinity;if(isNaN(d)||-Infinity===d)retu",
    "rn\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=L(b,a);return Infinity==",
    "d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);P(\"substring-aft",
    "er\",3,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);c=b.indexOf(a);return-1=",
    "=c?\"\":b.substring(c+a.length)},2);\nP(\"substring-before\",3,!1,!1,fu",
    "nction(a,b,c){b=L(b,a);a=L(c,a);a=b.indexOf(a);return-1==a?\"\":b.subst",
    "ring(0,a)},2);P(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator(",
    ");b=0;for(var c=a.next();c;c=a.next())b+=+C(c);return b},1,1,!0);P(\"tr",
    "anslate\",3,!1,!1,function(a,b,c,d){b=L(b,a);c=L(c,a);var e=L(d,a);d={}",
    ";for(var f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=",
    "\"\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3)",
    ";P(\"true\",2,!1,!1,function(){return!0},0);function G(a,b){this.ga=a;t",
    "his.aa=k(b)?b:null;this.B=null;switch(a){case \"comment\":this.B=8;brea",
    "k;case \"text\":this.B=3;break;case \"processing-instruction\":this.B=7",
    ";break;case \"node\":break;default:throw Error(\"Unexpected argument\")",
    ";}}function eb(a){return\"comment\"==a||\"text\"==a||\"processing-instr",
    "uction\"==a||\"node\"==a}G.prototype.matches=function(a){return null===",
    "this.B||this.B==a.nodeType};G.prototype.getName=function(){return this.",
    "ga};\nG.prototype.toString=function(){var a=\"Kind Test: \"+this.ga;nul",
    "l===this.aa||(a+=J(this.aa));return a};function fb(a){I.call(this,3);th",
    "is.fa=a.substring(1,a.length-1)}p(fb,I);fb.prototype.evaluate=function(",
    "){return this.fa};fb.prototype.toString=function(){return\"Literal: \"+",
    "this.fa};function gb(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":",
    "\"http://www.w3.org/1999/xhtml\";this.K=b?b.toLowerCase():a}gb.prototyp",
    "e.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=k(a.loc",
    "alName)?a.localName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCa",
    "se()?!1:\"*\"==this.K?!0:this.K==(a.namespaceURI?a.namespaceURI.toLower",
    "Case():\"http://www.w3.org/1999/xhtml\")};gb.prototype.getName=function",
    "(){return this.i};\ngb.prototype.toString=function(){return\"Name Test:",
    " \"+(\"http://www.w3.org/1999/xhtml\"==this.K?\"\":this.K+\":\")+this.i",
    "};function hb(a){I.call(this,1);this.ha=a}p(hb,I);hb.prototype.evaluate",
    "=function(){return this.ha};hb.prototype.toString=function(){return\"Nu",
    "mber: \"+this.ha};function ib(a,b){I.call(this,a.f);this.Y=a;this.G=b;t",
    "his.s=a.c();this.h=a.h;1==this.G.length&&(a=this.G[0],a.O||a.u!=jb||(a=",
    "a.M,\"*\"!=a.getName()&&(this.F={name:a.getName(),C:null})))}p(ib,I);fu",
    "nction kb(){I.call(this,4)}p(kb,I);kb.prototype.evaluate=function(a){va",
    "r b=new F;a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocument);return b}",
    ";kb.prototype.toString=function(){return\"Root Helper Expression\"};fun",
    "ction lb(){I.call(this,4)}p(lb,I);lb.prototype.evaluate=function(a){var",
    " b=new F;b.add(a.l);return b};\nlb.prototype.toString=function(){return",
    "\"Context Helper Expression\"};function mb(a){return\"/\"==a||\"//\"==a",
    "}\nib.prototype.evaluate=function(a){var b=this.Y.evaluate(a);if(!(b in",
    "stanceof F))throw Error(\"Filter expression must evaluate to nodeset.\"",
    ");a=this.G;for(var c=0,d=a.length;c<d&&b.o();c++){var e=a[c],f=b.iterat",
    "or(e.u.A);if(e.c()||e.u!=nb)if(e.c()||e.u!=ob){var g=f.next();for(b=e.e",
    "valuate(new A(g));null!=(g=f.next());)g=e.evaluate(new A(g)),b=Qa(b,g)}",
    "else g=f.next(),b=e.evaluate(new A(g));else{for(g=f.next();(b=f.next())",
    "&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e",
    ".evaluate(new A(g))}}return b};\nib.prototype.toString=function(){var a",
    "=\"Path Expression:\"+J(this.Y);if(this.G.length){var b=t(this.G,functi",
    "on(a,b){return a+J(b)},\"Steps:\");a+=J(b)}return a};function Q(a,b){th",
    "is.b=a;this.A=!!b}function ab(a,b,c){for(c=c||0;c<a.b.length;c++)for(va",
    "r d=a.b[c],e=b.iterator(),f=b.o(),g,l=0;g=e.next();l++){var w=a.A?f-l:l",
    "+1;g=d.evaluate(new A(g,w,f));if(\"number\"==typeof g)w=w==g;else if(\"",
    "string\"==typeof g||\"boolean\"==typeof g)w=!!g;else if(g instanceof F)",
    "w=0<g.o();else throw Error(\"Predicate.evaluate returned an unexpected ",
    "type.\");w||e.remove()}return b}Q.prototype.v=function(){return 0<this.",
    "b.length?this.b[0].v():null};\nQ.prototype.c=function(){for(var a=0;a<t",
    "his.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}ret",
    "urn!1};Q.prototype.o=function(){return this.b.length};Q.prototype.toStr",
    "ing=function(){return t(this.b,function(a,b){return a+J(b)},\"Predicate",
    "s:\")};function R(a,b,c,d){I.call(this,4);this.u=a;this.M=b;this.b=c||n",
    "ew Q([]);this.O=!!d;b=this.b.v();a.qa&&b&&(this.F={name:b.name,C:b.C});",
    "this.s=this.b.c()}p(R,I);\nR.prototype.evaluate=function(a){var b=a.l,c",
    "=this.v(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?L(c.C,a):null,f=1);if(th",
    "is.O)if(this.c()||this.u!=pb)if(b=(new R(qb,new G(\"node\"))).evaluate(",
    "a).iterator(),c=b.next())for(a=this.m(c,d,e,f);null!=(c=b.next());)a=Qa",
    "(a,this.m(c,d,e,f));else a=new F;else a=Ma(this.M,b,d,e),a=ab(this.b,a,",
    "f);else a=this.m(a.l,d,e,f);return a};R.prototype.m=function(a,b,c,d){a",
    "=this.u.I(this.M,a,b,c);return a=ab(this.b,a,d)};\nR.prototype.toString",
    "=function(){var a=\"Step:\"+J(\"Operator: \"+(this.O?\"//\":\"/\"));thi",
    "s.u.i&&(a+=J(\"Axis: \"+this.u));a+=J(this.M);if(this.b.o()){var b=t(th",
    "is.b.b,function(a,b){return a+J(b)},\"Predicates:\");a+=J(b)}return a};",
    "function rb(a,b,c,d){this.i=a;this.I=b;this.A=c;this.qa=d}rb.prototype.",
    "toString=function(){return this.i};var sb={};function T(a,b,c,d){if(sb.",
    "hasOwnProperty(a))throw Error(\"Axis already created: \"+a);b=new rb(a,",
    "b,c,!!d);return sb[a]=b}\nT(\"ancestor\",function(a,b){for(var c=new F;",
    "b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);T(\"ancestor-o",
    "r-self\",function(a,b){var c=new F;do a.matches(b)&&c.unshift(b);while(",
    "b=b.parentNode);return c},!0);\nvar jb=T(\"attribute\",function(a,b){va",
    "r c=new F,d=a.getName();if(b=b.attributes)if(a instanceof G&&null===a.B",
    "||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add",
    "(a);return c},!1),pb=T(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(",
    "d)?d:null;e=e||new F;for(b=b.firstChild;b;b=b.nextSibling)E(b,c,d)&&a.m",
    "atches(b)&&e.add(b);return e},!1,!0);T(\"descendant\",Ma,!1,!0);\nvar q",
    "b=T(\"descendant-or-self\",function(a,b,c,d){var e=new F;E(b,c,d)&&a.ma",
    "tches(b)&&e.add(b);return Ma(a,b,c,d,e)},!1,!0),nb=T(\"following\",func",
    "tion(a,b,c,d){var e=new F;do for(var f=b;f=f.nextSibling;)E(f,c,d)&&a.m",
    "atches(f)&&e.add(f),e=Ma(a,f,c,d,e);while(b=b.parentNode);return e},!1,",
    "!0);T(\"following-sibling\",function(a,b){for(var c=new F;b=b.nextSibli",
    "ng;)a.matches(b)&&c.add(b);return c},!1);T(\"namespace\",function(){ret",
    "urn new F},!1);\nvar tb=T(\"parent\",function(a,b){var c=new F;if(9==b.",
    "nodeType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.p",
    "arentNode;a.matches(b)&&c.add(b);return c},!1),ob=T(\"preceding\",funct",
    "ion(a,b,c,d){var e=new F,f=[];do f.unshift(b);while(b=b.parentNode);for",
    "(var g=1,l=f.length;g<l;g++){var w=[];for(b=f[g];b=b.previousSibling;)w",
    ".unshift(b);for(var D=0,q=w.length;D<q;D++)b=w[D],E(b,c,d)&&a.matches(b",
    ")&&e.add(b),e=Ma(a,b,c,d,e)}return e},!0,!0);\nT(\"preceding-sibling\",",
    "function(a,b){for(var c=new F;b=b.previousSibling;)a.matches(b)&&c.unsh",
    "ift(b);return c},!0);var ub=T(\"self\",function(a,b){var c=new F;a.matc",
    "hes(b)&&c.add(b);return c},!1);function vb(a){I.call(this,1);this.X=a;t",
    "his.s=a.c();this.h=a.h}p(vb,I);vb.prototype.evaluate=function(a){return",
    "-K(this.X,a)};vb.prototype.toString=function(){return\"Unary Expression",
    ": -\"+J(this.X)};function wb(a){I.call(this,4);this.L=a;Ua(this,la(this",
    ".L,function(a){return a.c()}));Va(this,la(this.L,function(a){return a.h",
    "}))}p(wb,I);wb.prototype.evaluate=function(a){var b=new F;r(this.L,func",
    "tion(c){c=c.evaluate(a);if(!(c instanceof F))throw Error(\"Path express",
    "ion must evaluate to NodeSet.\");b=Qa(b,c)});return b};wb.prototype.toS",
    "tring=function(){return t(this.L,function(a,b){return a+J(b)},\"Union E",
    "xpression:\")};function xb(a,b){this.a=a;this.ma=b}function yb(a){for(v",
    "ar b,c=[];;){U(a,\"Missing right hand side of binary expression.\");b=z",
    "b(a);var d=a.a.next();if(!d)break;var e=(d=Za[d]||null)&&d.ca;if(!e){a.",
    "a.back();break}for(;c.length&&e<=c[c.length-1].ca;)b=new Wa(c.pop(),c.p",
    "op(),b);c.push(b,d)}for(;c.length;)b=new Wa(c.pop(),c.pop(),b);return b",
    "}function U(a,b){if(a.a.empty())throw Error(b);}function Ab(a,b){a=a.a.",
    "next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a);}",
    "\nfunction Bb(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a",
    ");}function Cb(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed lit",
    "eral string\");return new fb(a)}\nfunction Db(a){var b=[];if(mb(B(a.a))",
    "){var c=a.a.next();var d=B(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"",
    "..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new kb;d",
    "=new kb;U(a,\"Missing next location step.\");c=Eb(a,c);b.push(c)}else{a",
    ":{c=B(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable re",
    "ference not allowed in HTML XPath\");case \"(\":a.a.next();c=yb(a);U(a,",
    "'unclosed \"(\"');Ab(a,\")\");break;case '\"':case \"'\":c=Cb(a);break;",
    "default:if(isNaN(+c))if(!eb(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==B(a.a,",
    "\n1)){c=a.a.next();c=db[c]||null;a.a.next();for(d=[];\")\"!=B(a.a);){U(",
    "a,\"Missing function argument list.\");d.push(yb(a));if(\",\"!=B(a.a))b",
    "reak;a.a.next()}U(a,\"Unclosed function argument list.\");Bb(a);c=new b",
    "b(c,d)}else{c=null;break a}else c=new hb(+a.a.next())}\"[\"==B(a.a)&&(d",
    "=new Q(Fb(a)),c=new $a(c,d))}if(c)if(mb(B(a.a)))d=c;else return c;else ",
    "c=Eb(a,\"/\"),d=new lb,b.push(c)}for(;mb(B(a.a));)c=a.a.next(),U(a,\"Mi",
    "ssing next location step.\"),c=Eb(a,c),b.push(c);return new ib(d,b)}\nf",
    "unction Eb(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be ",
    "\"/\" or \"//\"');if(\".\"==B(a.a)){var c=new R(ub,new G(\"node\"));a.a",
    ".next();return c}if(\"..\"==B(a.a))return c=new R(tb,new G(\"node\")),a",
    ".a.next(),c;if(\"@\"==B(a.a)){var d=jb;a.a.next();U(a,\"Missing attribu",
    "te name\")}else if(\"::\"==B(a.a,1)){if(!/(?![0-9])[\\w]/.test(B(a.a).c",
    "harAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=sb",
    "[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.next();U(a,",
    "\"Missing node name\")}else d=pb;e=\nB(a.a);if(/(?![0-9])[\\w\\*]/.test",
    "(e.charAt(0)))if(\"(\"==B(a.a,1)){if(!eb(e))throw Error(\"Invalid node ",
    "type: \"+e);e=a.a.next();if(!eb(e))throw Error(\"Invalid type name: \"+",
    "e);Ab(a,\"(\");U(a,\"Bad nodetype\");var f=B(a.a).charAt(0),g=null;if('",
    "\"'==f||\"'\"==f)g=Cb(a);U(a,\"Bad nodetype\");Bb(a);e=new G(e,g)}else ",
    "if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new gb(e);else{var g=e.subst",
    "ring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ma(g),!l)throw Error(\"Na",
    "mespace prefix not declared: \"+g);e=e.substr(f+1);e=new gb(e,l)}else t",
    "hrow Error(\"Bad token: \"+\na.a.next());a=new Q(Fb(a),d.A);return c||n",
    "ew R(d,e,a,\"//\"==b)}function Fb(a){for(var b=[];\"[\"==B(a.a);){a.a.n",
    "ext();U(a,\"Missing predicate expression.\");var c=yb(a);b.push(c);U(a,",
    "\"Unclosed predicate expression.\");Ab(a,\"]\")}return b}function zb(a)",
    "{if(\"-\"==B(a.a))return a.a.next(),new vb(zb(a));var b=Db(a);if(\"|\"!",
    "=B(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)U(a,\"Missing next union ",
    "location path.\"),b.push(Db(a));a.a.back();a=new wb(b)}return a};functi",
    "on Gb(a){switch(a.nodeType){case 1:return ia(Hb,a);case 9:return Gb(a.d",
    "ocumentElement);case 11:case 10:case 6:case 12:return Ib;default:return",
    " a.parentNode?Gb(a.parentNode):Ib}}function Ib(){return null}function H",
    "b(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org/1999/x",
    "html\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.v",
    "alue||null:a.parentNode&&9!=a.parentNode.nodeType?Hb(a.parentNode,b):nu",
    "ll};function Jb(a,b){if(!a.length)throw Error(\"Empty XPath expression.",
    "\");a=Ja(a);if(a.empty())throw Error(\"Invalid XPath expression.\");b?",
    "\"function\"==ca(b)||(b=ha(b.lookupNamespaceURI,b)):b=function(){return",
    " null};var c=yb(new xb(a,b));if(!a.empty())throw Error(\"Bad token: \"+",
    "a.next());this.evaluate=function(a,b){a=c.evaluate(new A(a));return new",
    " V(a,b)}}\nfunction V(a,b){if(0==b)if(a instanceof F)b=4;else if(\"stri",
    "ng\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"",
    "==typeof a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2",
    "!=b&&1!=b&&3!=b&&!(a instanceof F))throw Error(\"value could not be con",
    "verted to the specified type\");this.resultType=b;switch(b){case 2:this",
    ".stringValue=a instanceof F?Sa(a):\"\"+a;break;case 1:this.numberValue=",
    "a instanceof F?+Sa(a):+a;break;case 3:this.booleanValue=a instanceof F?",
    "0<a.o():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var ",
    "d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.o(",
    ");this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeValue",
    "=Ra(a);break;default:throw Error(\"Unknown XPathResult type.\");}var f=",
    "0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext c",
    "alled with wrong result type\");return f>=d.length?null:d[f++]};this.sn",
    "apshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called ",
    "with wrong result type\");return a>=d.length||0>a?null:d[a]}}\nV.ANY_TY",
    "PE=0;V.NUMBER_TYPE=1;V.STRING_TYPE=2;V.BOOLEAN_TYPE=3;V.UNORDERED_NODE_",
    "ITERATOR_TYPE=4;V.ORDERED_NODE_ITERATOR_TYPE=5;V.UNORDERED_NODE_SNAPSHO",
    "T_TYPE=6;V.ORDERED_NODE_SNAPSHOT_TYPE=7;V.ANY_UNORDERED_NODE_TYPE=8;V.F",
    "IRST_ORDERED_NODE_TYPE=9;function Kb(a){this.lookupNamespaceURI=Gb(a)}",
    "\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Docu",
    "ment.prototype||a.document;if(!c.evaluate||b)a.XPathResult=V,c.evaluate",
    "=function(a,b,c,g){return(new Jb(a,c)).evaluate(b,g)},c.createExpressio",
    "n=function(a,b){return new Jb(a,b)},c.createNSResolver=function(a){retu",
    "rn new Kb(a)}});var W={};W.U=function(){var a={ua:\"http://www.w3.org/2",
    "000/svg\"};return function(b){return a[b]||null}}();\nW.m=function(a,b,",
    "c){var d=x(a);if(!d.documentElement)return null;try{for(var e=d.createN",
    "SResolver?d.createNSResolver(d.documentElement):W.U,f={},g=d.getElement",
    "sByTagName(\"*\"),l=0;l<g.length;++l){var w=g[l],D=w.namespaceURI;if(D&",
    "&!f[D]){var q=w.lookupPrefix(D);if(!q)var y=D.match(\".*/(\\\\w+)/?$\")",
    ",q=y?y[1]:\"xhtml\";f[D]=q}}var H={},S;for(S in f)H[f[S]]=S;e=function(",
    "a){return H[a]||null};try{return d.evaluate(b,a,e,c,null)}catch(va){if(",
    "\"TypeError\"===va.name)return e=d.createNSResolver?d.createNSResolver(",
    "d.documentElement):\nW.U,d.evaluate(b,a,e,c,null);throw va;}}catch(va){",
    "throw new xa(32,\"Unable to locate an element with the xpath expression",
    " \"+b+\" because of the following error:\\n\"+va);}};W.V=function(a,b){",
    "if(!a||1!=a.nodeType)throw new xa(32,'The result of the xpath expressio",
    "n \"'+b+'\" is: '+a+\". It should be an element.\");};\nW.pa=function(a",
    ",b){var c=function(){var c=W.m(b,a,9);return c?c.singleNodeValue||null:",
    "b.selectSingleNode?(c=x(b),c.setProperty&&c.setProperty(\"SelectionLang",
    "uage\",\"XPath\"),b.selectSingleNode(a)):null}();null===c||W.V(c,a);ret",
    "urn c};\nW.sa=function(a,b){var c=function(){var c=W.m(b,a,7);if(c){for",
    "(var e=c.snapshotLength,f=[],g=0;g<e;++g)f.push(c.snapshotItem(g));retu",
    "rn f}return b.selectNodes?(c=x(b),c.setProperty&&c.setProperty(\"Select",
    "ionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();r(c,function(b){W.V(b,",
    "a)});return c};function Lb(a,b,c,d){this.top=a;this.right=b;this.bottom",
    "=c;this.left=d}h=Lb.prototype;h.clone=function(){return new Lb(this.top",
    ",this.right,this.bottom,this.left)};h.toString=function(){return\"(\"+t",
    "his.top+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"",
    "};h.contains=function(a){return this&&a?a instanceof Lb?a.left>=this.le",
    "ft&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=th",
    "is.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\nh.expan",
    "d=function(a,b,c,d){ea(a)?(this.top-=a.top,this.right+=a.right,this.bot",
    "tom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),thi",
    "s.bottom+=Number(c),this.left-=Number(d));return this};h.ceil=function(",
    "){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bo",
    "ttom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this}",
    ";\nh.floor=function(){this.top=Math.floor(this.top);this.right=Math.flo",
    "or(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor",
    "(this.left);return this};h.round=function(){this.top=Math.round(this.to",
    "p);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom",
    ");this.left=Math.round(this.left);return this};h.translate=function(a,b",
    "){a instanceof v?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bot",
    "tom+=a.y):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+=b",
    "));return this};\nh.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.ri",
    "ght*=a;this.top*=b;this.bottom*=b;return this};function X(a,b,c,d){this",
    ".left=a;this.top=b;this.width=c;this.height=d}h=X.prototype;h.clone=fun",
    "ction(){return new X(this.left,this.top,this.width,this.height)};h.toSt",
    "ring=function(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.widt",
    "h+\"w x \"+this.height+\"h)\"};h.contains=function(a){return a instance",
    "of v?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=thi",
    "s.top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.wid",
    "th&&this.top<=a.top&&this.top+this.height>=a.top+a.height};\nh.ceil=fun",
    "ction(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);thi",
    "s.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return",
    " this};h.floor=function(){this.left=Math.floor(this.left);this.top=Math",
    ".floor(this.top);this.width=Math.floor(this.width);this.height=Math.flo",
    "or(this.height);return this};h.round=function(){this.left=Math.round(th",
    "is.left);this.top=Math.round(this.top);this.width=Math.round(this.width",
    ");this.height=Math.round(this.height);return this};\nh.translate=functi",
    "on(a,b){a instanceof v?(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b",
    ")&&(this.top+=b));return this};h.scale=function(a,b){b=n(b)?b:a;this.le",
    "ft*=a;this.width*=a;this.top*=b;this.height*=b;return this};var Mb=\"fu",
    "nction\"===typeof ShadowRoot;function Nb(a){for(a=a.parentNode;a&&1!=a.",
    "nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return z(a)?a:n",
    "ull}\nfunction Y(a,b){b=ja(b);if(\"float\"==b||\"cssFloat\"==b||\"style",
    "Float\"==b)b=\"cssFloat\";a:{var c=b;var d=x(a);if(d.defaultView&&d.def",
    "aultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){",
    "c=d[c]||d.getPropertyValue(c)||\"\";break a}c=\"\"}a=c||Ob(a,b);if(null",
    "===a)a=null;else if(0<=ka(ra,b)){b:{var e=a.match(ua);if(e&&(b=Number(e",
    "[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&2",
    "55>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{i",
    "f(d=a.match(wa))if(b=Number(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&",
    "&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b",
    ":{b=a.toLowerCase();c=qa[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?",
    "b:\"#\"+b,4==c.length&&(c=c.replace(sa,\"#$1$1$2$2$3$3\")),!ta.test(c))",
    "){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),1",
    "6),parseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}r",
    "eturn a}\nfunction Ob(a,b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&",
    "\"function\"==ca(c.getPropertyValue)&&(d=c.getPropertyValue(b));return",
    "\"inherit\"!=d?k(d)?d:null:(a=Nb(a))?Ob(a,b):null}\nfunction Pb(a,b,c){",
    "function d(a){var b=Qb(a);return 0<b.height&&0<b.width?!0:z(a,\"PATH\")",
    "&&(0<b.height||0<b.width)?(a=Y(a,\"stroke-width\"),!!a&&0<parseInt(a,10",
    ")):\"hidden\"!=Y(a,\"overflow\")&&la(a.childNodes,function(a){return 3=",
    "=a.nodeType||z(a)&&d(a)})}function e(a){return Rb(a)==Z&&ma(a.childNode",
    "s,function(a){return!z(a)||e(a)||!d(a)})}if(!z(a))throw Error(\"Argumen",
    "t to isShown must be of type Element\");if(z(a,\"BODY\"))return!0;if(z(",
    "a,\"OPTION\")||z(a,\"OPTGROUP\"))return a=Ga(a,function(a){return z(a,",
    "\"SELECT\")}),\n!!a&&Pb(a,!0,c);var f=Sb(a);if(f)return!!f.Z&&0<f.rect.",
    "width&&0<f.rect.height&&Pb(f.Z,b,c);if(z(a,\"INPUT\")&&\"hidden\"==a.ty",
    "pe.toLowerCase()||z(a,\"NOSCRIPT\"))return!1;f=Y(a,\"visibility\");retu",
    "rn\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=Tb(a))&&d(a)?!e(a):!1}\n",
    "function Ub(a,b){function c(a){if(z(a)&&\"none\"==Y(a,\"display\"))retu",
    "rn!1;a:{var b=a.parentNode;if(a.getDestinationInsertionPoints){var d=a.",
    "getDestinationInsertionPoints();if(0<d.length){a=d[d.length-1];break a}",
    "}a=b&&b.shadowRoot&&void 0!==a.assignedSlot?a.assignedSlot?a.assignedSl",
    "ot.parentNode:null:b}return Mb&&a instanceof ShadowRoot||a&&(9==a.nodeT",
    "ype||11==a.nodeType)?!0:!!a&&c(a)}return Pb(a,!!b,c)}var Z=\"hidden\";",
    "\nfunction Rb(a){function b(a){function b(a){return a==g?!0:0==Y(a,\"di",
    "splay\").lastIndexOf(\"inline\",0)||\"absolute\"==c&&\"static\"==Y(a,\"",
    "position\")?!1:!0}var c=Y(a,\"position\");if(\"fixed\"==c)return D=!0,a",
    "==g?null:g;for(a=Nb(a);a&&!b(a);)a=Nb(a);return a}function c(a){var b=a",
    ";if(\"visible\"==w)if(a==g&&l)b=l;else if(a==l)return{x:\"visible\",y:",
    "\"visible\"};b={x:Y(b,\"overflow-x\"),y:Y(b,\"overflow-y\")};a==g&&(b.x",
    "=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y);retur",
    "n b}function d(a){if(a==g){var b=(new Ha(f)).H;\na=b.scrollingElement?b",
    ".scrollingElement:b.body||b.documentElement;b=b.parentWindow||b.default",
    "View;a=new v(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)}el",
    "se a=new v(a.scrollLeft,a.scrollTop);return a}var e=Vb(a);var f=x(a),g=",
    "f.documentElement,l=f.body,w=Y(g,\"overflow\"),D;for(a=b(a);a;a=b(a)){v",
    "ar q=c(a);if(\"visible\"!=q.x||\"visible\"!=q.y){var y=Qb(a);if(0==y.wi",
    "dth||0==y.height)return Z;var H=e.right<y.left,S=e.bottom<y.top;if(H&&",
    "\"hidden\"==q.x||S&&\"hidden\"==q.y)return Z;if(H&&\"visible\"!=q.x||\n",
    "S&&\"visible\"!=q.y){H=d(a);S=e.bottom<y.top-H.y;if(e.right<y.left-H.x&",
    "&\"visible\"!=q.x||S&&\"visible\"!=q.x)return Z;e=Rb(a);return e==Z?Z:",
    "\"scroll\"}H=e.left>=y.left+y.width;y=e.top>=y.top+y.height;if(H&&\"hid",
    "den\"==q.x||y&&\"hidden\"==q.y)return Z;if(H&&\"visible\"!=q.x||y&&\"vi",
    "sible\"!=q.y){if(D&&(q=d(a),e.left>=g.scrollWidth-q.x||e.right>=g.scrol",
    "lHeight-q.y))return Z;e=Rb(a);return e==Z?Z:\"scroll\"}}}return\"none\"",
    "}\nfunction Qb(a){var b=Sb(a);if(b)return b.rect;if(z(a,\"HTML\"))retur",
    "n a=x(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,",
    "a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=new za(a.clie",
    "ntWidth,a.clientHeight),new X(0,0,a.width,a.height);try{var c=a.getBoun",
    "dingClientRect()}catch(d){return new X(0,0,0,0)}return new X(c.left,c.t",
    "op,c.right-c.left,c.bottom-c.top)}\nfunction Sb(a){var b=z(a,\"MAP\");i",
    "f(!b&&!z(a,\"AREA\"))return null;var c=b?a:z(a.parentNode,\"MAP\")?a.pa",
    "rentNode:null,d=null,e=null;c&&c.name&&(d=W.pa('/descendant::*[@usemap ",
    "= \"#'+c.name+'\"]',x(c)))&&(e=Qb(d),b||\"default\"==a.shape.toLowerCas",
    "e()||(a=Wb(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.min(Math.ma",
    "x(a.top,0),e.height),e=new X(b+e.left,c+e.top,Math.min(a.width,e.width-",
    "b),Math.min(a.height,e.height-c))));return{Z:d,rect:e||new X(0,0,0,0)}}",
    "\nfunction Wb(a){var b=a.shape.toLowerCase();a=a.coords.split(\",\");if",
    "(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return new X(b,c,a[2]-b,a[",
    "3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new X(a[0]-b,a[1]-b,2",
    "*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c=a[1],d=b,e=c,f=2;f",
    "+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f",
    "+1]),e=Math.max(e,a[f+1]);return new X(b,c,d-b,e-c)}return new X(0,0,0,",
    "0)}function Vb(a){a=Qb(a);return new Lb(a.top,a.left+a.width,a.top+a.he",
    "ight,a.left)}\nfunction Tb(a){var b=1,c=Y(a,\"opacity\");c&&(b=Number(c",
    "));(a=Nb(a))&&(b*=Tb(a));return b};var Xb=\"function\"===typeof ShadowR",
    "oot;function Yb(a,b,c){if(!Ub(a,c))return!1;if(Xb){for(;a.parentNode;)a",
    "=a.parentNode;if(a instanceof ShadowRoot)return Yb(a.host,b)}return!0};",
    "ba(\"_\",Yb);; return this._.apply(null,arguments);}.apply({navigator:t",
    "ypeof window!='undefined'?window.navigator:null,document:typeof window!",
    "='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const CLEAR_LOCAL_STORAGE[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(){if(null==(b||b).localStorage)throw new d(13,\"",
    "Local storage undefined\");(new g(b.localStorage)).clear()}var k=[\"_\"",
    "],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n",
    ";k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m",
    "=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._.apply(n",
    "ull,arguments);}.apply({navigator:typeof window!='undefined'?window.nav",
    "igator:null,document:typeof window!='undefined'?window.document:null}, ",
    "arguments);}",
    NULL
};

const char* const CLEAR_SESSION_STORAGE[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(){var a=b||b;if(null!=a.sessionStorage&&null!=a.",
    "sessionStorage.clear)a=new g(b.sessionStorage);else throw new d(13,\"Se",
    "ssion storage undefined\");a.clear()}var k=[\"_\"],m=this;k[0]in m||!m.",
    "execScript||m.execScript(\"var \"+k[0]);for(var n;k.length&&(n=k.shift(",
    "));){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m[n]!==Object.p",
    "rototype[n]?m[n]:m[n]={}};; return this._.apply(null,arguments);}.apply",
    "({navigator:typeof window!='undefined'?window.navigator:null,document:t",
    "ypeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_APPCACHE_STATUS[] = {
    "function(){return function(){var a=window;function d(b,c){this.code=b;t",
    "his.state=e[b]||f;this.message=c||\"\";b=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(b){return b.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=b.length-5;if(0>c||b.indexOf(\"Error\",c)!=c)b+=\"Error\";this.",
    "name=b;b=Error(this.message);b.name=this.name;this.stack=b.stack||\"\"}",
    "\n(function(){var b=Error;function c(){}c.prototype=b.prototype;d.b=b.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.a=function(c,q,r",
    "){for(var n=Array(arguments.length-2),k=2;k<arguments.length;k++)n[k-2]",
    "=arguments[k];return b.prototype[q].apply(c,n)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(){if(null!=(a||a).applicationCache)va",
    "r b=a.applicationCache.status;else throw new d(13,\"Undefined applicati",
    "on cache\");return b}var h=[\"_\"],l=this;h[0]in l||!l.execScript||l.ex",
    "ecScript(\"var \"+h[0]);for(var m;h.length&&(m=h.shift());){var p;if(p=",
    "!h.length)p=void 0!==g;p?l[m]=g:l=l[m]&&l[m]!==Object.prototype[m]?l[m]",
    ":l[m]={}};; return this._.apply(null,arguments);}.apply({navigator:type",
    "of window!='undefined'?window.navigator:null,document:typeof window!='u",
    "ndefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_ATTRIBUTE[] = {
    "function(){return function(){function d(a){return\"string\"==typeof a};",
    "function g(a,b){for(var c=a.length,e=d(a)?a.split(\"\"):a,f=0;f<c;f++)f",
    " in e&&b.call(void 0,e[f],f,a)};function h(a,b){this.code=a;this.state=",
    "k[a]||n;this.message=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,",
    "function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.",
    "length-5;if(0>b||a.indexOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=E",
    "rror(this.message);a.name=this.name;this.stack=a.stack||\"\"}\n(functio",
    "n(){var a=Error;function b(){}b.prototype=a.prototype;h.b=a.prototype;h",
    ".prototype=new b;h.prototype.constructor=h;h.a=function(b,e,f){for(var ",
    "c=Array(arguments.length-2),m=2;m<arguments.length;m++)c[m-2]=arguments",
    "[m];return a.prototype[e].apply(b,c)}})();var n=\"unknown error\",k={15",
    ":\"element not selectable\",11:\"element not visible\"};k[31]=n;k[30]=n",
    ";k[24]=\"invalid cookie domain\";k[29]=\"invalid element coordinates\";",
    "k[12]=\"invalid element state\";k[32]=\"invalid selector\";k[51]=\"inva",
    "lid selector\";\nk[52]=\"invalid selector\";k[17]=\"javascript error\";",
    "k[405]=\"unsupported operation\";k[34]=\"move target out of bounds\";k[",
    "27]=\"no such alert\";k[7]=\"no such element\";k[8]=\"no such frame\";k",
    "[23]=\"no such window\";k[28]=\"script timeout\";k[33]=\"session not cr",
    "eated\";k[10]=\"stale element reference\";k[21]=\"timeout\";k[25]=\"una",
    "ble to set cookie\";k[26]=\"unexpected alert open\";k[13]=n;k[9]=\"unkn",
    "own command\";h.prototype.toString=function(){return this.name+\": \"+t",
    "his.message};function p(a,b){b=b.toLowerCase();return\"style\"==b?q(a.s",
    "tyle.cssText):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var r",
    "=/[;]+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:",
    "[^()]*\\([^()]*\\))*[^()]*$)/;function q(a){var b=[];g(a.split(r),funct",
    "ion(a){var c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a.",
    "length&&b.push(a[0].toLowerCase(),\":\",a[1],\";\"))});b=b.join(\"\");r",
    "eturn b=\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfunction t(a,b){b&&\"st",
    "ring\"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.ta",
    "gName.toUpperCase()==b)}function u(a){return t(a,\"OPTION\")?!0:t(a,\"I",
    "NPUT\")?(a=a.type.toLowerCase(),\"checkbox\"==a||\"radio\"==a):!1};var ",
    "v={\"class\":\"className\",readonly:\"readOnly\"},w=\"allowfullscreen a",
    "llowpaymentrequest allowusermedia async autofocus autoplay checked comp",
    "act complete controls declare default defaultchecked defaultselected de",
    "fer disabled ended formnovalidate hidden indeterminate iscontenteditabl",
    "e ismap itemscope loop multiple muted nohref nomodule noresize noshade ",
    "novalidate nowrap open paused playsinline pubdate readonly required rev",
    "ersed scoped seamless seeking selected truespeed typemustmatch willvali",
    "date\".split(\" \");function x(a,b){var c=b.toLowerCase();if(\"style\"=",
    "=c)return(b=a.style)&&!d(b)&&(b=b.cssText),b;if((\"selected\"==c||\"che",
    "cked\"==c)&&u(a)){if(!u(a))throw new h(15,\"Element is not selectable\"",
    ");b=\"selected\";var e=a.type&&a.type.toLowerCase();if(\"checkbox\"==e|",
    "|\"radio\"==e)b=\"checked\";return a[b]?\"true\":null}var f=t(a,\"A\");",
    "if(t(a,\"IMG\")&&\"src\"==c||f&&\"href\"==c)return(b=p(a,c))&&(b=a[c]),",
    "b;if(\"spellcheck\"==c){b=p(a,c);if(null!==b){if(\"false\"==b.toLowerCa",
    "se())return\"false\";if(\"true\"==b.toLowerCase())return\"true\"}return",
    " a[c]+\n\"\"}f=v[b]||b;a:if(d(w))c=d(c)&&1==c.length?w.indexOf(c,0):-1;",
    "else{for(var l=0;l<w.length;l++)if(l in w&&w[l]===c){c=l;break a}c=-1}i",
    "f(0<=c)return(b=null!==p(a,b)||a[f])?\"true\":null;try{e=a[f]}catch(m){",
    "}(c=null==e)||(c=typeof e,c=\"object\"==c&&null!=e||\"function\"==c);b=",
    "c?p(a,b):e;return null!=b?b.toString():null}var y=[\"_\"],z=this;y[0]in",
    " z||!z.execScript||z.execScript(\"var \"+y[0]);\nfor(var A;y.length&&(A",
    "=y.shift());){var B;if(B=!y.length)B=void 0!==x;B?z[A]=x:z=z[A]&&z[A]!=",
    "=Object.prototype[A]?z[A]:z[A]={}};; return this._.apply(null,arguments",
    ");}.apply({navigator:typeof window!='undefined'?window.navigator:null,d",
    "ocument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){if(null==(b||b).localStorage)throw new d(13,",
    "\"Local storage undefined\");return(new g(b.localStorage)).getItem(a)}v",
    "ar k=[\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]",
    ");for(var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h",
    ";q?m[n]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return thi",
    "s._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'",
    "?window.navigator:null,document:typeof window!='undefined'?window.docum",
    "ent:null}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_KEY[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){if(null==(b||b).localStorage)throw new d(13,",
    "\"Local storage undefined\");return(new g(b.localStorage)).key(a)}var k",
    "=[\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);fo",
    "r(var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m",
    "[n]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._.",
    "apply(null,arguments);}.apply({navigator:typeof window!='undefined'?win",
    "dow.navigator:null,document:typeof window!='undefined'?window.document:",
    "null}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_KEYS[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,k,t",
    "){for(var h=Array(arguments.length-2),n=2;n<arguments.length;n++)h[n-2]",
    "=arguments[n];return a.prototype[k].apply(c,h)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(h){throw new d(13,h.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function l(){if(null==(b||b).localStorage)throw new d(13,\"",
    "Local storage undefined\");var a=new g(b.localStorage);for(var c=[],h=a",
    ".size(),k=0;k<h;k++)c[k]=a.a.key(k);return c}var m=[\"_\"],p=this;m[0]i",
    "n p||!p.execScript||p.execScript(\"var \"+m[0]);for(var q;m.length&&(q=",
    "m.shift());){var r;if(r=!m.length)r=void 0!==l;r?p[q]=l:p=p[q]&&p[q]!==",
    "Object.prototype[q]?p[q]:p[q]={}};; return this._.apply(null,arguments)",
    ";}.apply({navigator:typeof window!='undefined'?window.navigator:null,do",
    "cument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_SIZE[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(){if(null==(b||b).localStorage)throw new d(13,\"",
    "Local storage undefined\");return(new g(b.localStorage)).size()}var k=[",
    "\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);for(",
    "var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n",
    "]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._.ap",
    "ply(null,arguments);}.apply({navigator:typeof window!='undefined'?windo",
    "w.navigator:null,document:typeof window!='undefined'?window.document:nu",
    "ll}, arguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){var c=b||b;if(null!=c.sessionStorage&&null!=c",
    ".sessionStorage.clear)c=new g(b.sessionStorage);else throw new d(13,\"S",
    "ession storage undefined\");return c.getItem(a)}var k=[\"_\"],m=this;k[",
    "0]in m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n;k.length&&",
    "(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m[n]",
    "!==Object.prototype[n]?m[n]:m[n]={}};; return this._.apply(null,argumen",
    "ts);}.apply({navigator:typeof window!='undefined'?window.navigator:null",
    ",document:typeof window!='undefined'?window.document:null}, arguments);",
    "}",
    NULL
};

const char* const GET_SESSION_STORAGE_KEY[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){var c=b||b;if(null!=c.sessionStorage&&null!=c",
    ".sessionStorage.clear)c=new g(b.sessionStorage);else throw new d(13,\"S",
    "ession storage undefined\");return c.key(a)}var k=[\"_\"],m=this;k[0]in",
    " m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n;k.length&&(n=k",
    ".shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m[n]!==O",
    "bject.prototype[n]?m[n]:m[n]={}};; return this._.apply(null,arguments);",
    "}.apply({navigator:typeof window!='undefined'?window.navigator:null,doc",
    "ument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_KEYS[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,k,t",
    "){for(var h=Array(arguments.length-2),n=2;n<arguments.length;n++)h[n-2]",
    "=arguments[n];return a.prototype[k].apply(c,h)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(h){throw new d(13,h.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function l(){var a=b||b;if(null!=a.sessionStorage&&null!=a.",
    "sessionStorage.clear)a=new g(b.sessionStorage);else throw new d(13,\"Se",
    "ssion storage undefined\");for(var c=[],h=a.size(),k=0;k<h;k++)c[k]=a.a",
    ".key(k);return c}var m=[\"_\"],p=this;m[0]in p||!p.execScript||p.execSc",
    "ript(\"var \"+m[0]);for(var q;m.length&&(q=m.shift());){var r;if(r=!m.l",
    "ength)r=void 0!==l;r?p[q]=l:p=p[q]&&p[q]!==Object.prototype[q]?p[q]:p[q",
    "]={}};; return this._.apply(null,arguments);}.apply({navigator:typeof w",
    "indow!='undefined'?window.navigator:null,document:typeof window!='undef",
    "ined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_SIZE[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(){var a=b||b;if(null!=a.sessionStorage&&null!=a.",
    "sessionStorage.clear)a=new g(b.sessionStorage);else throw new d(13,\"Se",
    "ssion storage undefined\");return a.size()}var k=[\"_\"],m=this;k[0]in ",
    "m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n;k.length&&(n=k.",
    "shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m[n]!==Ob",
    "ject.prototype[n]?m[n]:m[n]={}};; return this._.apply(null,arguments);}",
    ".apply({navigator:typeof window!='undefined'?window.navigator:null,docu",
    "ment:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_TEXT[] = {
    "function(){return function(){var g,aa=this;function k(a){return void 0!",
    "==a}function l(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){var b=typeof a;retu",
    "rn\"object\"==b&&null!=a||\"function\"==b}function fa(a,b,c){return a.c",
    "all.apply(a.bind,arguments)}\nfunction ga(a,b,c){if(!a)throw Error();if",
    "(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);retu",
    "rn function(){var c=Array.prototype.slice.call(arguments);Array.prototy",
    "pe.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.a",
    "pply(b,arguments)}}function ha(a,b,c){ha=Function.prototype.bind&&-1!=F",
    "unction.prototype.bind.toString().indexOf(\"native code\")?fa:ga;return",
    " ha.apply(null,arguments)}\nfunction ia(a,b){var c=Array.prototype.slic",
    "e.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,ar",
    "guments);return a.apply(this,b)}}function p(a,b){function c(){}c.protot",
    "ype=b.prototype;a.ya=b.prototype;a.prototype=new c;a.prototype.construc",
    "tor=a;a.wa=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<ar",
    "guments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)",
    "}};function ja(a){var b=a.length-1;return 0<=b&&a.indexOf(\" \",b)==b}v",
    "ar ka=String.prototype.trim?function(a){return a.trim()}:function(a){re",
    "turn a.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function la(a,b){ret",
    "urn a<b?-1:a>b?1:0}function ma(a){return String(a).replace(/\\-([a-z])/",
    "g,function(a,c){return c.toUpperCase()})};function na(a,b){if(l(a))retu",
    "rn l(b)&&1==b.length?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c ",
    "in a&&a[c]===b)return c;return-1}function q(a,b){for(var c=a.length,d=l",
    "(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}functio",
    "n r(a,b,c){var d=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return ",
    "d}function oa(a,b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e+",
    "+)if(e in d&&b.call(void 0,d[e],e,a))return!0;return!1}\nfunction pa(a,",
    "b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.",
    "call(void 0,d[e],e,a))return!1;return!0}function qa(a){return Array.pro",
    "totype.concat.apply([],arguments)}function ra(a){var b=a.length;if(0<b)",
    "{for(var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function sa",
    "(a,b,c){return 2>=arguments.length?Array.prototype.slice.call(a,b):Arra",
    "y.prototype.slice.call(a,b,c)};var ta={aliceblue:\"#f0f8ff\",antiquewhi",
    "te:\"#faebd7\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff",
    "\",beige:\"#f5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmon",
    "d:\"#ffebcd\",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\"",
    ",burlywood:\"#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",cho",
    "colate:\"#d2691e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsil",
    "k:\"#fff8dc\",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\"",
    ",darkcyan:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",da",
    "rkgreen:\"#006400\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkma",
    "genta:\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",dar",
    "korchid:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseag",
    "reen:\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",da",
    "rkslategrey:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3",
    "\",deeppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dim",
    "grey:\"#696969\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhi",
    "te:\"#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"",
    "#dcdcdc\",\nghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520",
    "\",gray:\"#808080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#8",
    "08080\",honeydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",",
    "indigo:\"#4b0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6",
    "fa\",lavenderblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#ff",
    "facd\",lightblue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff",
    "\",lightgoldenrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"",
    "#90ee90\",lightgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ff",
    "a07a\",\nlightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslateg",
    "ray:\"#778899\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",l",
    "ightyellow:\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#",
    "faf0e6\",magenta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66c",
    "daa\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9",
    "370db\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumsp",
    "ringgreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c7",
    "1585\",midnightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4",
    "e1\",\nmoccasin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",ol",
    "dlace:\"#fdf5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa",
    "500\",orangered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa",
    "\",palegreen:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7",
    "093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pin",
    "k:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080",
    "\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebr",
    "own:\"#8b4513\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2",
    "e8b57\",\nseashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",sk",
    "yblue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey",
    ":\"#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682",
    "b4\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6",
    "347\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:",
    "\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9a",
    "cd32\"};var ua=\"backgroundColor borderTopColor borderRightColor border",
    "BottomColor borderLeftColor color outlineColor\".split(\" \"),va=/#([0-",
    "9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,wa=/^#(?:[0-9a-f]{3}){1,2}$/i,xa=/",
    "^(?:rgba)?\\((\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*",
    ")\\)$/i,ya=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|",
    "[1-9]\\d{0,2})\\)$/i;function za(a,b){this.code=a;this.state=u[a]||Ba;t",
    "his.message=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(",
    "a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;",
    "if(0>b||a.indexOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this",
    ".message);a.name=this.name;this.stack=a.stack||\"\"}p(za,Error);var Ba=",
    "\"unknown error\",u={15:\"element not selectable\",11:\"element not vis",
    "ible\"};u[31]=Ba;u[30]=Ba;u[24]=\"invalid cookie domain\";u[29]=\"inval",
    "id element coordinates\";u[12]=\"invalid element state\";\nu[32]=\"inva",
    "lid selector\";u[51]=\"invalid selector\";u[52]=\"invalid selector\";u[",
    "17]=\"javascript error\";u[405]=\"unsupported operation\";u[34]=\"move ",
    "target out of bounds\";u[27]=\"no such alert\";u[7]=\"no such element\"",
    ";u[8]=\"no such frame\";u[23]=\"no such window\";u[28]=\"script timeout",
    "\";u[33]=\"session not created\";u[10]=\"stale element reference\";u[21",
    "]=\"timeout\";u[25]=\"unable to set cookie\";u[26]=\"unexpected alert o",
    "pen\";u[13]=Ba;u[9]=\"unknown command\";za.prototype.toString=function(",
    "){return this.name+\": \"+this.message};var Ca;a:{var Da=aa.navigator;i",
    "f(Da){var Ea=Da.userAgent;if(Ea){Ca=Ea;break a}}Ca=\"\"};function Fa(a)",
    "{var b=Ga;Object.prototype.hasOwnProperty.call(b,\"528\")||(b[\"528\"]=",
    "a(\"528\"))};var Ha=-1!=Ca.indexOf(\"Macintosh\"),Ia=-1!=Ca.indexOf(\"W",
    "indows\"),Ja,Ka=\"\",La=/WebKit\\/(\\S+)/.exec(Ca);La&&(Ka=La?La[1]:\"",
    "\");Ja=Ka;var Ga={};\nfunction Ma(){Fa(function(){for(var a=0,b=ka(Stri",
    "ng(Ja)).split(\".\"),c=ka(\"528\").split(\".\"),d=Math.max(b.length,c.l",
    "ength),e=0;0==a&&e<d;e++){var f=b[e]||\"\",h=c[e]||\"\";do{f=/(\\d*)(",
    "\\D*)(.*)/.exec(f)||[\"\",\"\",\"\",\"\"];h=/(\\d*)(\\D*)(.*)/.exec(h)|",
    "|[\"\",\"\",\"\",\"\"];if(0==f[0].length&&0==h[0].length)break;a=la(0==",
    "f[1].length?0:parseInt(f[1],10),0==h[1].length?0:parseInt(h[1],10))||la",
    "(0==f[2].length,0==h[2].length)||la(f[2],h[2]);f=f[3];h=h[3]}while(0==a",
    ")}return 0<=a})};function w(a,b){this.x=k(a)?a:0;this.y=k(b)?b:0}g=w.pr",
    "ototype;g.clone=function(){return new w(this.x,this.y)};g.toString=func",
    "tion(){return\"(\"+this.x+\", \"+this.y+\")\"};g.ceil=function(){this.x",
    "=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};g.floor=functi",
    "on(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};g",
    ".round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);r",
    "eturn this};\ng.translate=function(a,b){a instanceof w?(this.x+=a.x,thi",
    "s.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};g.scale=fu",
    "nction(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Na(a,b",
    "){this.width=a;this.height=b}g=Na.prototype;g.clone=function(){return n",
    "ew Na(this.width,this.height)};g.toString=function(){return\"(\"+this.w",
    "idth+\" x \"+this.height+\")\"};g.ceil=function(){this.width=Math.ceil(",
    "this.width);this.height=Math.ceil(this.height);return this};g.floor=fun",
    "ction(){this.width=Math.floor(this.width);this.height=Math.floor(this.h",
    "eight);return this};g.round=function(){this.width=Math.round(this.width",
    ");this.height=Math.round(this.height);return this};\ng.scale=function(a",
    ",b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};function Oa(a,",
    "b,c){function d(c){c&&b.appendChild(l(c)?a.createTextNode(c):c)}for(var",
    " e=1;e<c.length;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):q(Pa(f",
    ")?ra(f):f,d)}}function Qa(a){for(;a&&1!=a.nodeType;)a=a.previousSibling",
    ";return a}function Ra(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeT",
    "ype)return a==b||a.contains(b);if(\"undefined\"!=typeof a.compareDocume",
    "ntPosition)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=",
    "b;)b=b.parentNode;return b==a}\nfunction Sa(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.sourceIn",
    "dex;var e=a.parentNode,f=b.parentNode;return e==f?Ta(a,b):!c&&Ra(e,b)?-",
    "1*Ua(a,b):!d&&Ra(f,a)?Ua(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sour",
    "ceIndex:f.sourceIndex)}d=x(a);c=d.createRange();c.selectNode(a);c.colla",
    "pse(!0);a=d.createRange();a.selectNode(b);\na.collapse(!0);return c.com",
    "pareBoundaryPoints(aa.Range.START_TO_END,a)}function Ua(a,b){var c=a.pa",
    "rentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return T",
    "a(b,a)}function Ta(a,b){for(;b=b.previousSibling;)if(b==a)return-1;retu",
    "rn 1}function x(a){return 9==a.nodeType?a:a.ownerDocument||a.document}f",
    "unction Pa(a){if(a&&\"number\"==typeof a.length){if(ea(a))return\"funct",
    "ion\"==typeof a.item||\"string\"==typeof a.item;if(\"function\"==ca(a))",
    "return\"function\"==typeof a.item}return!1}\nfunction Va(a,b){a&&(a=a.p",
    "arentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}return n",
    "ull}function Wa(a){this.M=a||aa.document||document}g=Wa.prototype;g.get",
    "ElementsByTagName=function(a,b){return(b||this.M).getElementsByTagName(",
    "String(a))};g.createElement=function(a){return this.M.createElement(Str",
    "ing(a))};g.createTextNode=function(a){return this.M.createTextNode(Stri",
    "ng(a))};g.appendChild=function(a,b){a.appendChild(b)};g.append=function",
    "(a,b){Oa(x(a),a,arguments)};\ng.canHaveChildren=function(a){if(1!=a.nod",
    "eType)return!1;switch(a.tagName){case \"APPLET\":case \"AREA\":case \"B",
    "ASE\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"F",
    "RAME\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"I",
    "SINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIP",
    "T\":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case ",
    "\"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0",
    "};g.removeNode=function(a){return a&&a.parentNode?a.parentNode.removeCh",
    "ild(a):null};\ng.contains=Ra;function y(a,b){b&&\"string\"!==typeof b&&",
    "(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()",
    "==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n",
    " Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, free ",
    "of charge, to any person obtaining a copy\n of this software and associ",
    "ated documentation files (the \"Software\"), to\n deal in the Software ",
    "without restriction, including without limitation the\n rights to use, ",
    "copy, modify, merge, publish, distribute, sublicense, and/or\n sell cop",
    "ies of the Software, and to permit persons to whom the Software is\n fu",
    "rnished to do so, subject to the following conditions:\n\n The above co",
    "pyright notice and this permission notice shall be included in\n all co",
    "pies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVI",
    "DED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCL",
    "UDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS F",
    "OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AU",
    "THORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n ",
    "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING",
    "\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ",
    "DEALINGS\n IN THE SOFTWARE.\n*/\nfunction z(a,b,c){this.s=a;this.ta=b||",
    "1;this.o=c||1};function Xa(a){this.Y=a;this.O=0}function Ya(a){a=a.matc",
    "h(Za);for(var b=0;b<a.length;b++)$a.test(a[b])&&a.splice(b,1);return ne",
    "w Xa(a)}var Za=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(",
    "?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|",
    "'[^']*'|[!<>]=|\\s+|./g,$a=/^\\s/;function B(a,b){return a.Y[a.O+(b||0)",
    "]}Xa.prototype.next=function(){return this.Y[this.O++]};Xa.prototype.ba",
    "ck=function(){this.O--};Xa.prototype.empty=function(){return this.Y.len",
    "gth<=this.O};function D(a){var b=null,c=a.nodeType;1==c&&(b=a.textConte",
    "nt,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(",
    "\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChi",
    "ld;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++",
    "]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.",
    "nodeValue;return\"\"+b}\nfunction E(a,b,c){if(null===b)return!0;try{if(",
    "!a.getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAttrib",
    "ute(b):a.getAttribute(b,2)==c}function ab(a,b,c,d,e){return bb.call(nul",
    "l,a,b,l(c)?c:null,l(d)?d:null,e||new F)}\nfunction bb(a,b,c,d,e){b.getE",
    "lementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),q(b,function(b)",
    "{a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b",
    "=b.getElementsByClassName(d),q(b,function(b){b.className==d&&a.matches(",
    "b)&&e.add(b)})):a instanceof G?cb(a,b,c,d,e):b.getElementsByTagName&&(b",
    "=b.getElementsByTagName(a.getName()),q(b,function(a){E(a,c,d)&&e.add(a)",
    "}));return e}function cb(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSiblin",
    "g)E(b,c,d)&&a.matches(b)&&e.add(b),cb(a,b,c,d,e)};function F(){this.o=t",
    "his.j=null;this.J=0}function db(a){this.node=a;this.next=this.D=null}fu",
    "nction eb(a,b){if(!a.j)return b;if(!b.j)return a;var c=a.j;b=b.j;for(va",
    "r d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<Sa(c.node",
    ",b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.D=d)?d.next=e:a.j=e,d=e,f++;f",
    "or(e=c||b;e;)e.D=d,d=d.next=e,f++,e=e.next;a.o=d;a.J=f;return a}F.proto",
    "type.unshift=function(a){a=new db(a);a.next=this.j;this.o?this.j.D=a:th",
    "is.j=this.o=a;this.j=a;this.J++};\nF.prototype.add=function(a){a=new db",
    "(a);a.D=this.o;this.j?this.o.next=a:this.j=this.o=a;this.o=a;this.J++};",
    "function fb(a){return(a=a.j)?a.node:null}F.prototype.v=function(){retur",
    "n this.J};function gb(a){return(a=fb(a))?D(a):\"\"}F.prototype.iterator",
    "=function(a){return new hb(this,!!a)};function hb(a,b){this.pa=a;this.a",
    "a=(this.G=b)?a.o:a.j;this.V=null}hb.prototype.next=function(){var a=thi",
    "s.aa;if(null==a)return null;var b=this.V=a;this.aa=this.G?a.D:a.next;re",
    "turn b.node};\nhb.prototype.remove=function(){var a=this.pa,b=this.V;if",
    "(!b)throw Error(\"Next must be called at least once before remove.\");v",
    "ar c=b.D,b=b.next;c?c.next=b:a.j=b;b?b.D=c:a.o=c;a.J--;this.V=null};fun",
    "ction H(a){this.i=a;this.l=this.A=!1;this.K=null}function I(a){return\"",
    "\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}H.prototype.h=funct",
    "ion(){return this.A};function ib(a,b){a.A=b}function jb(a,b){a.l=b}H.pr",
    "ototype.C=function(){return this.K};function J(a,b){a=a.evaluate(b);ret",
    "urn a instanceof F?+gb(a):+a}function K(a,b){a=a.evaluate(b);return a i",
    "nstanceof F?gb(a):\"\"+a}function M(a,b){a=a.evaluate(b);return a insta",
    "nceof F?!!a.v():!!a};function kb(a,b,c){H.call(this,a.i);this.X=a;this.",
    "ea=b;this.ja=c;this.A=b.h()||c.h();this.l=b.l||c.l;this.X==lb&&(c.l||c.",
    "h()||4==c.i||0==c.i||!b.C()?b.l||b.h()||4==b.i||0==b.i||!c.C()||(this.K",
    "={name:c.C().name,I:b}):this.K={name:b.C().name,I:c})}p(kb,H);\nfunctio",
    "n mb(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof F",
    "&&c instanceof F){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.it",
    "erator(),f=e.next();f;f=e.next())if(a(D(d),D(f)))return!0;return!1}if(b",
    " instanceof F||c instanceof F){b instanceof F?(e=b,d=c):(e=c,d=b);f=e.i",
    "terator();for(var h=typeof d,m=f.next();m;m=f.next()){switch(h){case \"",
    "number\":m=+D(m);break;case \"boolean\":m=!!D(m);break;case \"string\":",
    "m=D(m);break;default:throw Error(\"Illegal primitive type for compariso",
    "n.\");\n}if(e==b&&a(m,d)||e==c&&a(d,m))return!0}return!1}return e?\"boo",
    "lean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b",
    "||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}kb.prototype.evaluate=f",
    "unction(a){return this.X.u(this.ea,this.ja,a)};kb.prototype.toString=fu",
    "nction(){var a=\"Binary Expression: \"+this.X,a=a+I(this.ea);return a+=",
    "I(this.ja)};function nb(a,b,c,d){this.sa=a;this.ha=b;this.i=c;this.u=d}",
    "nb.prototype.toString=function(){return this.sa};var ob={};\nfunction N",
    "(a,b,c,d){if(ob.hasOwnProperty(a))throw Error(\"Binary operator already",
    " created: \"+a);a=new nb(a,b,c,d);return ob[a.toString()]=a}N(\"div\",6",
    ",1,function(a,b,c){return J(a,c)/J(b,c)});N(\"mod\",6,1,function(a,b,c)",
    "{return J(a,c)%J(b,c)});N(\"*\",6,1,function(a,b,c){return J(a,c)*J(b,c",
    ")});N(\"+\",5,1,function(a,b,c){return J(a,c)+J(b,c)});N(\"-\",5,1,func",
    "tion(a,b,c){return J(a,c)-J(b,c)});N(\"<\",4,2,function(a,b,c){return m",
    "b(function(a,b){return a<b},a,b,c)});\nN(\">\",4,2,function(a,b,c){retu",
    "rn mb(function(a,b){return a>b},a,b,c)});N(\"<=\",4,2,function(a,b,c){r",
    "eturn mb(function(a,b){return a<=b},a,b,c)});N(\">=\",4,2,function(a,b,",
    "c){return mb(function(a,b){return a>=b},a,b,c)});var lb=N(\"=\",3,2,fun",
    "ction(a,b,c){return mb(function(a,b){return a==b},a,b,c,!0)});N(\"!=\",",
    "3,2,function(a,b,c){return mb(function(a,b){return a!=b},a,b,c,!0)});N(",
    "\"and\",2,2,function(a,b,c){return M(a,c)&&M(b,c)});N(\"or\",1,2,functi",
    "on(a,b,c){return M(a,c)||M(b,c)});function pb(a,b){if(b.v()&&4!=a.i)thr",
    "ow Error(\"Primary expression must evaluate to nodeset if filter has pr",
    "edicate(s).\");H.call(this,a.i);this.ia=a;this.f=b;this.A=a.h();this.l=",
    "a.l}p(pb,H);pb.prototype.evaluate=function(a){a=this.ia.evaluate(a);ret",
    "urn qb(this.f,a)};pb.prototype.toString=function(){var a=\"Filter:\"+I(",
    "this.ia);return a+=I(this.f)};function rb(a,b){if(b.length<a.ga)throw E",
    "rror(\"Function \"+a.m+\" expects at least\"+a.ga+\" arguments, \"+b.le",
    "ngth+\" given\");if(null!==a.W&&b.length>a.W)throw Error(\"Function \"+",
    "a.m+\" expects at most \"+a.W+\" arguments, \"+b.length+\" given\");a.q",
    "a&&q(b,function(b,d){if(4!=b.i)throw Error(\"Argument \"+d+\" to functi",
    "on \"+a.m+\" is not of type Nodeset: \"+b);});H.call(this,a.i);this.N=a",
    ";this.T=b;ib(this,a.A||oa(b,function(a){return a.h()}));jb(this,a.oa&&!",
    "b.length||a.na&&!!b.length||oa(b,function(a){return a.l}))}\np(rb,H);rb",
    ".prototype.evaluate=function(a){return this.N.u.apply(null,qa(a,this.T)",
    ")};rb.prototype.toString=function(){var a=\"Function: \"+this.N;if(this",
    ".T.length)var b=r(this.T,function(a,b){return a+I(b)},\"Arguments:\"),a",
    "=a+I(b);return a};function sb(a,b,c,d,e,f,h,m,v){this.m=a;this.i=b;this",
    ".A=c;this.oa=d;this.na=e;this.u=f;this.ga=h;this.W=k(m)?m:h;this.qa=!!v",
    "}sb.prototype.toString=function(){return this.m};var tb={};\nfunction O",
    "(a,b,c,d,e,f,h,m){if(tb.hasOwnProperty(a))throw Error(\"Function alread",
    "y created: \"+a+\".\");tb[a]=new sb(a,b,c,d,!1,e,f,h,m)}O(\"boolean\",2",
    ",!1,!1,function(a,b){return M(b,a)},1);O(\"ceiling\",1,!1,!1,function(a",
    ",b){return Math.ceil(J(b,a))},1);O(\"concat\",3,!1,!1,function(a,b){ret",
    "urn r(sa(arguments,1),function(b,d){return b+K(d,a)},\"\")},2,null);O(",
    "\"contains\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return-1!=b.inde",
    "xOf(a)},2);O(\"count\",1,!1,!1,function(a,b){return b.evaluate(a).v()},",
    "1,1,!0);\nO(\"false\",2,!1,!1,function(){return!1},0);O(\"floor\",1,!1,",
    "!1,function(a,b){return Math.floor(J(b,a))},1);O(\"id\",4,!1,!1,functio",
    "n(a,b){var c=a.s,d=9==c.nodeType?c:c.ownerDocument;a=K(b,a).split(/\\s+",
    "/);var e=[];q(a,function(a){a=d.getElementById(a);!a||0<=na(e,a)||e.pus",
    "h(a)});e.sort(Sa);var f=new F;q(e,function(a){f.add(a)});return f},1);O",
    "(\"lang\",2,!1,!1,function(){return!1},1);O(\"last\",1,!0,!1,function(a",
    "){if(1!=arguments.length)throw Error(\"Function last expects ()\");retu",
    "rn a.o},0);\nO(\"local-name\",3,!1,!0,function(a,b){return(a=b?fb(b.eva",
    "luate(a)):a.s)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"",
    "name\",3,!1,!0,function(a,b){return(a=b?fb(b.evaluate(a)):a.s)?a.nodeNa",
    "me.toLowerCase():\"\"},0,1,!0);O(\"namespace-uri\",3,!0,!1,function(){r",
    "eturn\"\"},0,1,!0);O(\"normalize-space\",3,!1,!0,function(a,b){return(b",
    "?K(b,a):D(a.s)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"",
    "\")},0,1);O(\"not\",2,!1,!1,function(a,b){return!M(b,a)},1);\nO(\"numbe",
    "r\",1,!1,!0,function(a,b){return b?J(b,a):+D(a.s)},0,1);O(\"position\",",
    "1,!0,!1,function(a){return a.ta},0);O(\"round\",1,!1,!1,function(a,b){r",
    "eturn Math.round(J(b,a))},1);O(\"starts-with\",2,!1,!1,function(a,b,c){",
    "b=K(b,a);a=K(c,a);return 0==b.lastIndexOf(a,0)},2);O(\"string\",3,!1,!0",
    ",function(a,b){return b?K(b,a):D(a.s)},0,1);O(\"string-length\",1,!1,!0",
    ",function(a,b){return(b?K(b,a):D(a.s)).length},0,1);\nO(\"substring\",3",
    ",!1,!1,function(a,b,c,d){c=J(c,a);if(isNaN(c)||Infinity==c||-Infinity==",
    "c)return\"\";d=d?J(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";",
    "c=Math.round(c)-1;var e=Math.max(c,0);a=K(b,a);return Infinity==d?a.sub",
    "string(e):a.substring(e,c+Math.round(d))},2,3);O(\"substring-after\",3,",
    "!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);c=b.indexOf(a);return-1==c?\"\"",
    ":b.substring(c+a.length)},2);\nO(\"substring-before\",3,!1,!1,function(",
    "a,b,c){b=K(b,a);a=K(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,",
    "a)},2);O(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;f",
    "or(var c=a.next();c;c=a.next())b+=+D(c);return b},1,1,!0);O(\"translate",
    "\",3,!1,!1,function(a,b,c,d){b=K(b,a);c=K(c,a);var e=K(d,a);d={};for(va",
    "r f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"\";fo",
    "r(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);O(\"tr",
    "ue\",2,!1,!1,function(){return!0},0);function G(a,b){this.la=a;this.fa=",
    "k(b)?b:null;this.H=null;switch(a){case \"comment\":this.H=8;break;case ",
    "\"text\":this.H=3;break;case \"processing-instruction\":this.H=7;break;",
    "case \"node\":break;default:throw Error(\"Unexpected argument\");}}func",
    "tion ub(a){return\"comment\"==a||\"text\"==a||\"processing-instruction",
    "\"==a||\"node\"==a}G.prototype.matches=function(a){return null===this.H",
    "||this.H==a.nodeType};G.prototype.getName=function(){return this.la};\n",
    "G.prototype.toString=function(){var a=\"Kind Test: \"+this.la;null===th",
    "is.fa||(a+=I(this.fa));return a};function vb(a){H.call(this,3);this.ka=",
    "a.substring(1,a.length-1)}p(vb,H);vb.prototype.evaluate=function(){retu",
    "rn this.ka};vb.prototype.toString=function(){return\"Literal: \"+this.k",
    "a};function wb(a,b){this.m=a.toLowerCase();a=\"*\"==this.m?\"*\":\"http",
    "://www.w3.org/1999/xhtml\";this.P=b?b.toLowerCase():a}wb.prototype.matc",
    "hes=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=k(a.localName",
    ")?a.localName:a.nodeName;return\"*\"!=this.m&&this.m!=b.toLowerCase()?!",
    "1:\"*\"==this.P?!0:this.P==(a.namespaceURI?a.namespaceURI.toLowerCase()",
    ":\"http://www.w3.org/1999/xhtml\")};wb.prototype.getName=function(){ret",
    "urn this.m};\nwb.prototype.toString=function(){return\"Name Test: \"+(",
    "\"http://www.w3.org/1999/xhtml\"==this.P?\"\":this.P+\":\")+this.m};fun",
    "ction xb(a){H.call(this,1);this.ma=a}p(xb,H);xb.prototype.evaluate=func",
    "tion(){return this.ma};xb.prototype.toString=function(){return\"Number:",
    " \"+this.ma};function yb(a,b){H.call(this,a.i);this.ca=a;this.L=b;this.",
    "A=a.h();this.l=a.l;1==this.L.length&&(a=this.L[0],a.U||a.B!=zb||(a=a.S,",
    "\"*\"!=a.getName()&&(this.K={name:a.getName(),I:null})))}p(yb,H);functi",
    "on Ab(){H.call(this,4)}p(Ab,H);Ab.prototype.evaluate=function(a){var b=",
    "new F;a=a.s;9==a.nodeType?b.add(a):b.add(a.ownerDocument);return b};Ab.",
    "prototype.toString=function(){return\"Root Helper Expression\"};functio",
    "n Bb(){H.call(this,4)}p(Bb,H);Bb.prototype.evaluate=function(a){var b=n",
    "ew F;b.add(a.s);return b};\nBb.prototype.toString=function(){return\"Co",
    "ntext Helper Expression\"};function Cb(a){return\"/\"==a||\"//\"==a}\ny",
    "b.prototype.evaluate=function(a){var b=this.ca.evaluate(a);if(!(b insta",
    "nceof F))throw Error(\"Filter expression must evaluate to nodeset.\");a",
    "=this.L;for(var c=0,d=a.length;c<d&&b.v();c++){var e=a[c],f=b.iterator(",
    "e.B.G);if(e.h()||e.B!=Db)if(e.h()||e.B!=Eb){var h=f.next();for(b=e.eval",
    "uate(new z(h));null!=(h=f.next());)h=e.evaluate(new z(h)),b=eb(b,h)}els",
    "e h=f.next(),b=e.evaluate(new z(h));else{for(h=f.next();(b=f.next())&&(",
    "!h.contains||h.contains(b))&&b.compareDocumentPosition(h)&8;h=b);b=e.ev",
    "aluate(new z(h))}}return b};\nyb.prototype.toString=function(){var a=\"",
    "Path Expression:\"+I(this.ca);if(this.L.length){var b=r(this.L,function",
    "(a,b){return a+I(b)},\"Steps:\");a+=I(b)}return a};function P(a,b){this",
    ".f=a;this.G=!!b}function qb(a,b,c){for(c=c||0;c<a.f.length;c++)for(var ",
    "d=a.f[c],e=b.iterator(),f=b.v(),h,m=0;h=e.next();m++){var v=a.G?f-m:m+1",
    ";h=d.evaluate(new z(h,v,f));if(\"number\"==typeof h)v=v==h;else if(\"st",
    "ring\"==typeof h||\"boolean\"==typeof h)v=!!h;else if(h instanceof F)v=",
    "0<h.v();else throw Error(\"Predicate.evaluate returned an unexpected ty",
    "pe.\");v||e.remove()}return b}P.prototype.C=function(){return 0<this.f.",
    "length?this.f[0].C():null};\nP.prototype.h=function(){for(var a=0;a<thi",
    "s.f.length;a++){var b=this.f[a];if(b.h()||1==b.i||0==b.i)return!0}retur",
    "n!1};P.prototype.v=function(){return this.f.length};P.prototype.toStrin",
    "g=function(){return r(this.f,function(a,b){return a+I(b)},\"Predicates:",
    "\")};function Q(a,b,c,d){H.call(this,4);this.B=a;this.S=b;this.f=c||new",
    " P([]);this.U=!!d;b=this.f.C();a.va&&b&&(this.K={name:b.name,I:b.I});th",
    "is.A=this.f.h()}p(Q,H);\nQ.prototype.evaluate=function(a){var b=a.s,c=t",
    "his.C(),d=null,e=null,f=0;c&&(d=c.name,e=c.I?K(c.I,a):null,f=1);if(this",
    ".U)if(this.h()||this.B!=Fb)if(b=(new Q(Gb,new G(\"node\"))).evaluate(a)",
    ".iterator(),c=b.next())for(a=this.u(c,d,e,f);null!=(c=b.next());)a=eb(a",
    ",this.u(c,d,e,f));else a=new F;else a=ab(this.S,b,d,e),a=qb(this.f,a,f)",
    ";else a=this.u(a.s,d,e,f);return a};Q.prototype.u=function(a,b,c,d){a=t",
    "his.B.N(this.S,a,b,c);return a=qb(this.f,a,d)};\nQ.prototype.toString=f",
    "unction(){var a=\"Step:\"+I(\"Operator: \"+(this.U?\"//\":\"/\"));this.",
    "B.m&&(a+=I(\"Axis: \"+this.B));a+=I(this.S);if(this.f.v()){var b=r(this",
    ".f.f,function(a,b){return a+I(b)},\"Predicates:\");a+=I(b)}return a};fu",
    "nction Hb(a,b,c,d){this.m=a;this.N=b;this.G=c;this.va=d}Hb.prototype.to",
    "String=function(){return this.m};var Ib={};function R(a,b,c,d){if(Ib.ha",
    "sOwnProperty(a))throw Error(\"Axis already created: \"+a);b=new Hb(a,b,",
    "c,!!d);return Ib[a]=b}\nR(\"ancestor\",function(a,b){for(var c=new F;b=",
    "b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);R(\"ancestor-or-",
    "self\",function(a,b){var c=new F;do a.matches(b)&&c.unshift(b);while(b=",
    "b.parentNode);return c},!0);\nvar zb=R(\"attribute\",function(a,b){var ",
    "c=new F,d=a.getName();if(b=b.attributes)if(a instanceof G&&null===a.H||",
    "\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a",
    ");return c},!1),Fb=R(\"child\",function(a,b,c,d,e){c=l(c)?c:null;d=l(d)",
    "?d:null;e=e||new F;for(b=b.firstChild;b;b=b.nextSibling)E(b,c,d)&&a.mat",
    "ches(b)&&e.add(b);return e},!1,!0);R(\"descendant\",ab,!1,!0);\nvar Gb=",
    "R(\"descendant-or-self\",function(a,b,c,d){var e=new F;E(b,c,d)&&a.matc",
    "hes(b)&&e.add(b);return ab(a,b,c,d,e)},!1,!0),Db=R(\"following\",functi",
    "on(a,b,c,d){var e=new F;do for(var f=b;f=f.nextSibling;)E(f,c,d)&&a.mat",
    "ches(f)&&e.add(f),e=ab(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0",
    ");R(\"following-sibling\",function(a,b){for(var c=new F;b=b.nextSibling",
    ";)a.matches(b)&&c.add(b);return c},!1);R(\"namespace\",function(){retur",
    "n new F},!1);\nvar Jb=R(\"parent\",function(a,b){var c=new F;if(9==b.no",
    "deType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.par",
    "entNode;a.matches(b)&&c.add(b);return c},!1),Eb=R(\"preceding\",functio",
    "n(a,b,c,d){var e=new F,f=[];do f.unshift(b);while(b=b.parentNode);for(v",
    "ar h=1,m=f.length;h<m;h++){var v=[];for(b=f[h];b=b.previousSibling;)v.u",
    "nshift(b);for(var C=0,t=v.length;C<t;C++)b=v[C],E(b,c,d)&&a.matches(b)&",
    "&e.add(b),e=ab(a,b,c,d,e)}return e},!0,!0);\nR(\"preceding-sibling\",fu",
    "nction(a,b){for(var c=new F;b=b.previousSibling;)a.matches(b)&&c.unshif",
    "t(b);return c},!0);var Kb=R(\"self\",function(a,b){var c=new F;a.matche",
    "s(b)&&c.add(b);return c},!1);function Lb(a){H.call(this,1);this.ba=a;th",
    "is.A=a.h();this.l=a.l}p(Lb,H);Lb.prototype.evaluate=function(a){return-",
    "J(this.ba,a)};Lb.prototype.toString=function(){return\"Unary Expression",
    ": -\"+I(this.ba)};function Mb(a){H.call(this,4);this.R=a;ib(this,oa(thi",
    "s.R,function(a){return a.h()}));jb(this,oa(this.R,function(a){return a.",
    "l}))}p(Mb,H);Mb.prototype.evaluate=function(a){var b=new F;q(this.R,fun",
    "ction(c){c=c.evaluate(a);if(!(c instanceof F))throw Error(\"Path expres",
    "sion must evaluate to NodeSet.\");b=eb(b,c)});return b};Mb.prototype.to",
    "String=function(){return r(this.R,function(a,b){return a+I(b)},\"Union ",
    "Expression:\")};function Nb(a,b){this.a=a;this.ra=b}function Ob(a){for(",
    "var b,c=[];;){S(a,\"Missing right hand side of binary expression.\");b=",
    "Pb(a);var d=a.a.next();if(!d)break;var e=(d=ob[d]||null)&&d.ha;if(!e){a",
    ".a.back();break}for(;c.length&&e<=c[c.length-1].ha;)b=new kb(c.pop(),c.",
    "pop(),b);c.push(b,d)}for(;c.length;)b=new kb(c.pop(),c.pop(),b);return ",
    "b}function S(a,b){if(a.a.empty())throw Error(b);}function Qb(a,b){a=a.a",
    ".next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a);}",
    "\nfunction Rb(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a",
    ");}function Sb(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed lit",
    "eral string\");return new vb(a)}\nfunction Tb(a){var b=[];if(Cb(B(a.a))",
    "){var c=a.a.next();var d=B(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"",
    "..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new Ab;d",
    "=new Ab;S(a,\"Missing next location step.\");c=Ub(a,c);b.push(c)}else{a",
    ":{c=B(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable re",
    "ference not allowed in HTML XPath\");case \"(\":a.a.next();c=Ob(a);S(a,",
    "'unclosed \"(\"');Qb(a,\")\");break;case '\"':case \"'\":c=Sb(a);break;",
    "default:if(isNaN(+c))if(!ub(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==B(a.a,",
    "\n1)){c=a.a.next();c=tb[c]||null;a.a.next();for(d=[];\")\"!=B(a.a);){S(",
    "a,\"Missing function argument list.\");d.push(Ob(a));if(\",\"!=B(a.a))b",
    "reak;a.a.next()}S(a,\"Unclosed function argument list.\");Rb(a);c=new r",
    "b(c,d)}else{c=null;break a}else c=new xb(+a.a.next())}\"[\"==B(a.a)&&(d",
    "=new P(Vb(a)),c=new pb(c,d))}if(c)if(Cb(B(a.a)))d=c;else return c;else ",
    "c=Ub(a,\"/\"),d=new Bb,b.push(c)}for(;Cb(B(a.a));)c=a.a.next(),S(a,\"Mi",
    "ssing next location step.\"),c=Ub(a,c),b.push(c);return new yb(d,b)}\nf",
    "unction Ub(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be ",
    "\"/\" or \"//\"');if(\".\"==B(a.a)){var c=new Q(Kb,new G(\"node\"));a.a",
    ".next();return c}if(\"..\"==B(a.a))return c=new Q(Jb,new G(\"node\")),a",
    ".a.next(),c;if(\"@\"==B(a.a)){var d=zb;a.a.next();S(a,\"Missing attribu",
    "te name\")}else if(\"::\"==B(a.a,1)){if(!/(?![0-9])[\\w]/.test(B(a.a).c",
    "harAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=Ib",
    "[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.next();S(a,",
    "\"Missing node name\")}else d=Fb;e=\nB(a.a);if(/(?![0-9])[\\w\\*]/.test",
    "(e.charAt(0)))if(\"(\"==B(a.a,1)){if(!ub(e))throw Error(\"Invalid node ",
    "type: \"+e);e=a.a.next();if(!ub(e))throw Error(\"Invalid type name: \"+",
    "e);Qb(a,\"(\");S(a,\"Bad nodetype\");var f=B(a.a).charAt(0),h=null;if('",
    "\"'==f||\"'\"==f)h=Sb(a);S(a,\"Bad nodetype\");Rb(a);e=new G(e,h)}else ",
    "if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new wb(e);else{var h=e.subst",
    "ring(0,f);if(\"*\"==h)var m=\"*\";else if(m=a.ra(h),!m)throw Error(\"Na",
    "mespace prefix not declared: \"+h);e=e.substr(f+1);e=new wb(e,m)}else t",
    "hrow Error(\"Bad token: \"+\na.a.next());a=new P(Vb(a),d.G);return c||n",
    "ew Q(d,e,a,\"//\"==b)}function Vb(a){for(var b=[];\"[\"==B(a.a);){a.a.n",
    "ext();S(a,\"Missing predicate expression.\");var c=Ob(a);b.push(c);S(a,",
    "\"Unclosed predicate expression.\");Qb(a,\"]\")}return b}function Pb(a)",
    "{if(\"-\"==B(a.a))return a.a.next(),new Lb(Pb(a));var b=Tb(a);if(\"|\"!",
    "=B(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)S(a,\"Missing next union ",
    "location path.\"),b.push(Tb(a));a.a.back();a=new Mb(b)}return a};functi",
    "on Wb(a){switch(a.nodeType){case 1:return ia(Xb,a);case 9:return Wb(a.d",
    "ocumentElement);case 11:case 10:case 6:case 12:return Yb;default:return",
    " a.parentNode?Wb(a.parentNode):Yb}}function Yb(){return null}function X",
    "b(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org/1999/x",
    "html\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.v",
    "alue||null:a.parentNode&&9!=a.parentNode.nodeType?Xb(a.parentNode,b):nu",
    "ll};function Zb(a,b){if(!a.length)throw Error(\"Empty XPath expression.",
    "\");a=Ya(a);if(a.empty())throw Error(\"Invalid XPath expression.\");b?",
    "\"function\"==ca(b)||(b=ha(b.lookupNamespaceURI,b)):b=function(){return",
    " null};var c=Ob(new Nb(a,b));if(!a.empty())throw Error(\"Bad token: \"+",
    "a.next());this.evaluate=function(a,b){a=c.evaluate(new z(a));return new",
    " U(a,b)}}\nfunction U(a,b){if(0==b)if(a instanceof F)b=4;else if(\"stri",
    "ng\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"",
    "==typeof a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2",
    "!=b&&1!=b&&3!=b&&!(a instanceof F))throw Error(\"value could not be con",
    "verted to the specified type\");this.resultType=b;switch(b){case 2:this",
    ".stringValue=a instanceof F?gb(a):\"\"+a;break;case 1:this.numberValue=",
    "a instanceof F?+gb(a):+a;break;case 3:this.booleanValue=a instanceof F?",
    "0<a.v():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var ",
    "d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.v(",
    ");this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeValue",
    "=fb(a);break;default:throw Error(\"Unknown XPathResult type.\");}var f=",
    "0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext c",
    "alled with wrong result type\");return f>=d.length?null:d[f++]};this.sn",
    "apshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called ",
    "with wrong result type\");return a>=d.length||0>a?null:d[a]}}\nU.ANY_TY",
    "PE=0;U.NUMBER_TYPE=1;U.STRING_TYPE=2;U.BOOLEAN_TYPE=3;U.UNORDERED_NODE_",
    "ITERATOR_TYPE=4;U.ORDERED_NODE_ITERATOR_TYPE=5;U.UNORDERED_NODE_SNAPSHO",
    "T_TYPE=6;U.ORDERED_NODE_SNAPSHOT_TYPE=7;U.ANY_UNORDERED_NODE_TYPE=8;U.F",
    "IRST_ORDERED_NODE_TYPE=9;function $b(a){this.lookupNamespaceURI=Wb(a)}",
    "\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Docu",
    "ment.prototype||a.document;if(!c.evaluate||b)a.XPathResult=U,c.evaluate",
    "=function(a,b,c,h){return(new Zb(a,c)).evaluate(b,h)},c.createExpressio",
    "n=function(a,b){return new Zb(a,b)},c.createNSResolver=function(a){retu",
    "rn new $b(a)}});var V={};V.Z=function(){var a={za:\"http://www.w3.org/2",
    "000/svg\"};return function(b){return a[b]||null}}();\nV.u=function(a,b,",
    "c){var d=x(a);if(!d.documentElement)return null;try{for(var e=d.createN",
    "SResolver?d.createNSResolver(d.documentElement):V.Z,f={},h=d.getElement",
    "sByTagName(\"*\"),m=0;m<h.length;++m){var v=h[m],C=v.namespaceURI;if(C&",
    "&!f[C]){var t=v.lookupPrefix(C);if(!t)var A=C.match(\".*/(\\\\w+)/?$\")",
    ",t=A?A[1]:\"xhtml\";f[C]=t}}var L={},T;for(T in f)L[f[T]]=T;e=function(",
    "a){return L[a]||null};try{return d.evaluate(b,a,e,c,null)}catch(Aa){if(",
    "\"TypeError\"===Aa.name)return e=d.createNSResolver?d.createNSResolver(",
    "d.documentElement):\nV.Z,d.evaluate(b,a,e,c,null);throw Aa;}}catch(Aa){",
    "throw new za(32,\"Unable to locate an element with the xpath expression",
    " \"+b+\" because of the following error:\\n\"+Aa);}};V.$=function(a,b){",
    "if(!a||1!=a.nodeType)throw new za(32,'The result of the xpath expressio",
    "n \"'+b+'\" is: '+a+\". It should be an element.\");};\nV.ua=function(a",
    ",b){var c=function(){var c=V.u(b,a,9);return c?c.singleNodeValue||null:",
    "b.selectSingleNode?(c=x(b),c.setProperty&&c.setProperty(\"SelectionLang",
    "uage\",\"XPath\"),b.selectSingleNode(a)):null}();null===c||V.$(c,a);ret",
    "urn c};\nV.xa=function(a,b){var c=function(){var c=V.u(b,a,7);if(c){for",
    "(var e=c.snapshotLength,f=[],h=0;h<e;++h)f.push(c.snapshotItem(h));retu",
    "rn f}return b.selectNodes?(c=x(b),c.setProperty&&c.setProperty(\"Select",
    "ionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();q(c,function(b){V.$(b,",
    "a)});return c};function ac(a,b,c,d){this.top=a;this.right=b;this.bottom",
    "=c;this.left=d}g=ac.prototype;g.clone=function(){return new ac(this.top",
    ",this.right,this.bottom,this.left)};g.toString=function(){return\"(\"+t",
    "his.top+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"",
    "};g.contains=function(a){return this&&a?a instanceof ac?a.left>=this.le",
    "ft&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=th",
    "is.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\ng.expan",
    "d=function(a,b,c,d){ea(a)?(this.top-=a.top,this.right+=a.right,this.bot",
    "tom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),thi",
    "s.bottom+=Number(c),this.left-=Number(d));return this};g.ceil=function(",
    "){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bo",
    "ttom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this}",
    ";\ng.floor=function(){this.top=Math.floor(this.top);this.right=Math.flo",
    "or(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor",
    "(this.left);return this};g.round=function(){this.top=Math.round(this.to",
    "p);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom",
    ");this.left=Math.round(this.left);return this};g.translate=function(a,b",
    "){a instanceof w?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bot",
    "tom+=a.y):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+=b",
    "));return this};\ng.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.ri",
    "ght*=a;this.top*=b;this.bottom*=b;return this};function W(a,b,c,d){this",
    ".left=a;this.top=b;this.width=c;this.height=d}g=W.prototype;g.clone=fun",
    "ction(){return new W(this.left,this.top,this.width,this.height)};g.toSt",
    "ring=function(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.widt",
    "h+\"w x \"+this.height+\"h)\"};g.contains=function(a){return a instance",
    "of w?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=thi",
    "s.top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.wid",
    "th&&this.top<=a.top&&this.top+this.height>=a.top+a.height};\ng.ceil=fun",
    "ction(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);thi",
    "s.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return",
    " this};g.floor=function(){this.left=Math.floor(this.left);this.top=Math",
    ".floor(this.top);this.width=Math.floor(this.width);this.height=Math.flo",
    "or(this.height);return this};g.round=function(){this.left=Math.round(th",
    "is.left);this.top=Math.round(this.top);this.width=Math.round(this.width",
    ");this.height=Math.round(this.height);return this};\ng.translate=functi",
    "on(a,b){a instanceof w?(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b",
    ")&&(this.top+=b));return this};g.scale=function(a,b){b=n(b)?b:a;this.le",
    "ft*=a;this.width*=a;this.top*=b;this.height*=b;return this};var bc=\"fu",
    "nction\"===typeof ShadowRoot;function cc(a){for(a=a.parentNode;a&&1!=a.",
    "nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return y(a)?a:n",
    "ull}\nfunction X(a,b){b=ma(b);if(\"float\"==b||\"cssFloat\"==b||\"style",
    "Float\"==b)b=\"cssFloat\";a:{var c=b;var d=x(a);if(d.defaultView&&d.def",
    "aultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){",
    "c=d[c]||d.getPropertyValue(c)||\"\";break a}c=\"\"}a=c||dc(a,b);if(null",
    "===a)a=null;else if(0<=na(ua,b)){b:{var e=a.match(xa);if(e&&(b=Number(e",
    "[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&2",
    "55>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{i",
    "f(d=a.match(ya))if(b=Number(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&",
    "&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b",
    ":{b=a.toLowerCase();c=ta[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?",
    "b:\"#\"+b,4==c.length&&(c=c.replace(va,\"#$1$1$2$2$3$3\")),!wa.test(c))",
    "){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),1",
    "6),parseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}r",
    "eturn a}\nfunction dc(a,b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&",
    "\"function\"==ca(c.getPropertyValue)&&(d=c.getPropertyValue(b));return",
    "\"inherit\"!=d?k(d)?d:null:(a=cc(a))?dc(a,b):null}\nfunction ec(a,b,c){",
    "function d(a){var b=fc(a);return 0<b.height&&0<b.width?!0:y(a,\"PATH\")",
    "&&(0<b.height||0<b.width)?(a=X(a,\"stroke-width\"),!!a&&0<parseInt(a,10",
    ")):\"hidden\"!=X(a,\"overflow\")&&oa(a.childNodes,function(a){return 3=",
    "=a.nodeType||y(a)&&d(a)})}function e(a){return gc(a)==Y&&pa(a.childNode",
    "s,function(a){return!y(a)||e(a)||!d(a)})}if(!y(a))throw Error(\"Argumen",
    "t to isShown must be of type Element\");if(y(a,\"BODY\"))return!0;if(y(",
    "a,\"OPTION\")||y(a,\"OPTGROUP\"))return a=Va(a,function(a){return y(a,",
    "\"SELECT\")}),\n!!a&&ec(a,!0,c);var f=hc(a);if(f)return!!f.da&&0<f.rect",
    ".width&&0<f.rect.height&&ec(f.da,b,c);if(y(a,\"INPUT\")&&\"hidden\"==a.",
    "type.toLowerCase()||y(a,\"NOSCRIPT\"))return!1;f=X(a,\"visibility\");re",
    "turn\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=ic(a))&&d(a)?!e(a):!1}",
    "\nfunction jc(a){function b(a){if(y(a)&&\"none\"==X(a,\"display\"))retu",
    "rn!1;a:{var c=a.parentNode;if(a.getDestinationInsertionPoints){var e=a.",
    "getDestinationInsertionPoints();if(0<e.length){a=e[e.length-1];break a}",
    "}a=c&&c.shadowRoot&&void 0!==a.assignedSlot?a.assignedSlot?a.assignedSl",
    "ot.parentNode:null:c}return bc&&a instanceof ShadowRoot||a&&(9==a.nodeT",
    "ype||11==a.nodeType)?!0:!!a&&b(a)}return ec(a,!1,b)}var Y=\"hidden\";\n",
    "function gc(a){function b(a){function b(a){return a==h?!0:0==X(a,\"disp",
    "lay\").lastIndexOf(\"inline\",0)||\"absolute\"==c&&\"static\"==X(a,\"po",
    "sition\")?!1:!0}var c=X(a,\"position\");if(\"fixed\"==c)return C=!0,a==",
    "h?null:h;for(a=cc(a);a&&!b(a);)a=cc(a);return a}function c(a){var b=a;i",
    "f(\"visible\"==v)if(a==h&&m)b=m;else if(a==m)return{x:\"visible\",y:\"v",
    "isible\"};b={x:X(b,\"overflow-x\"),y:X(b,\"overflow-y\")};a==h&&(b.x=\"",
    "visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y);return b",
    "}function d(a){if(a==h){var b=(new Wa(f)).M;\na=b.scrollingElement?b.sc",
    "rollingElement:b.body||b.documentElement;b=b.parentWindow||b.defaultVie",
    "w;a=new w(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)}else ",
    "a=new w(a.scrollLeft,a.scrollTop);return a}var e=kc(a);var f=x(a),h=f.d",
    "ocumentElement,m=f.body,v=X(h,\"overflow\"),C;for(a=b(a);a;a=b(a)){var ",
    "t=c(a);if(\"visible\"!=t.x||\"visible\"!=t.y){var A=fc(a);if(0==A.width",
    "||0==A.height)return Y;var L=e.right<A.left,T=e.bottom<A.top;if(L&&\"hi",
    "dden\"==t.x||T&&\"hidden\"==t.y)return Y;if(L&&\"visible\"!=t.x||\nT&&",
    "\"visible\"!=t.y){L=d(a);T=e.bottom<A.top-L.y;if(e.right<A.left-L.x&&\"",
    "visible\"!=t.x||T&&\"visible\"!=t.x)return Y;e=gc(a);return e==Y?Y:\"sc",
    "roll\"}L=e.left>=A.left+A.width;A=e.top>=A.top+A.height;if(L&&\"hidden",
    "\"==t.x||A&&\"hidden\"==t.y)return Y;if(L&&\"visible\"!=t.x||A&&\"visib",
    "le\"!=t.y){if(C&&(t=d(a),e.left>=h.scrollWidth-t.x||e.right>=h.scrollHe",
    "ight-t.y))return Y;e=gc(a);return e==Y?Y:\"scroll\"}}}return\"none\"}\n",
    "function fc(a){var b=hc(a);if(b)return b.rect;if(y(a,\"HTML\"))return a",
    "=x(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,a=",
    "\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=new Na(a.client",
    "Width,a.clientHeight),new W(0,0,a.width,a.height);try{var c=a.getBoundi",
    "ngClientRect()}catch(d){return new W(0,0,0,0)}return new W(c.left,c.top",
    ",c.right-c.left,c.bottom-c.top)}\nfunction hc(a){var b=y(a,\"MAP\");if(",
    "!b&&!y(a,\"AREA\"))return null;var c=b?a:y(a.parentNode,\"MAP\")?a.pare",
    "ntNode:null,d=null,e=null;c&&c.name&&(d=V.ua('/descendant::*[@usemap = ",
    "\"#'+c.name+'\"]',x(c)))&&(e=fc(d),b||\"default\"==a.shape.toLowerCase(",
    ")||(a=lc(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.min(Math.max(",
    "a.top,0),e.height),e=new W(b+e.left,c+e.top,Math.min(a.width,e.width-b)",
    ",Math.min(a.height,e.height-c))));return{da:d,rect:e||new W(0,0,0,0)}}",
    "\nfunction lc(a){var b=a.shape.toLowerCase();a=a.coords.split(\",\");if",
    "(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return new W(b,c,a[2]-b,a[",
    "3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new W(a[0]-b,a[1]-b,2",
    "*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c=a[1],d=b,e=c,f=2;f",
    "+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f",
    "+1]),e=Math.max(e,a[f+1]);return new W(b,c,d-b,e-c)}return new W(0,0,0,",
    "0)}function kc(a){a=fc(a);return new ac(a.top,a.left+a.width,a.top+a.he",
    "ight,a.left)}\nfunction mc(a){return a.replace(/^[^\\S\\xa0]+|[^\\S\\xa",
    "0]+$/g,\"\")}\nfunction nc(a,b,c){if(y(a,\"BR\"))b.push(\"\");else{var ",
    "d=y(a,\"TD\"),e=X(a,\"display\"),f=!d&&!(0<=na(oc,e)),h=k(a.previousEle",
    "mentSibling)?a.previousElementSibling:Qa(a.previousSibling),h=h?X(h,\"d",
    "isplay\"):\"\",m=X(a,\"float\")||X(a,\"cssFloat\")||X(a,\"styleFloat\")",
    ";!f||\"run-in\"==h&&\"none\"==m||/^[\\s\\xa0]*$/.test(b[b.length-1]||\"",
    "\")||b.push(\"\");var v=jc(a),C=null,t=null;v&&(C=X(a,\"white-space\"),",
    "t=X(a,\"text-transform\"));q(a.childNodes,function(a){c(a,b,v,C,t)});a=",
    "b[b.length-1]||\"\";!d&&\"table-cell\"!=e||!a||ja(a)||(b[b.length-\n1]+",
    "=\" \");f&&\"run-in\"!=e&&!/^[\\s\\xa0]*$/.test(a)&&b.push(\"\")}}funct",
    "ion pc(a,b){nc(a,b,function(a,b,e,f,h){3==a.nodeType&&e?qc(a,b,f,h):y(a",
    ")&&pc(a,b)})}var oc=\"inline inline-block inline-table none table-cell ",
    "table-column table-column-group\".split(\" \");\nfunction qc(a,b,c,d){a",
    "=a.nodeValue.replace(/[\\u200b\\u200e\\u200f]/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\\u202",
    "8\\u2029]/g,\"\\u00a0\"):a.replace(/[\\ \\f\\t\\v\\u2028\\u2029]+/g,\" ",
    "\");\"capitalize\"==d?a=a.replace(/(^|\\s)(\\S)/g,function(a,b,c){retur",
    "n b+c.toUpperCase()}):\"uppercase\"==d?a=a.toUpperCase():\"lowercase\"=",
    "=d&&(a=a.toLowerCase());c=b.pop()||\"\";ja(c)&&0==a.lastIndexOf(\" \",0",
    ")&&(a=a.substr(1));b.push(c+a)}\nfunction ic(a){var b=1,c=X(a,\"opacity",
    "\");c&&(b=Number(c));(a=cc(a))&&(b*=ic(a));return b}\nfunction rc(a,b,c",
    ",d,e){var f;if(3==a.nodeType&&c)qc(a,b,d,e);else if(y(a))if(y(a,\"CONTE",
    "NT\")||y(a,\"SLOT\")){for(f=a;f.parentNode;)f=f.parentNode;f instanceof",
    " ShadowRoot?(a=y(a,\"CONTENT\")?a.getDistributedNodes():a.assignedNodes",
    "(),q(a,function(a){rc(a,b,c,d,e)})):sc(a,b)}else if(y(a,\"SHADOW\")){fo",
    "r(f=a;f.parentNode;)f=f.parentNode;if(f instanceof ShadowRoot&&(a=f))fo",
    "r(a=a.olderShadowRoot;a;)q(a.childNodes,function(a){rc(a,b,c,d,e)}),a=a",
    ".olderShadowRoot}else sc(a,b)}\nfunction sc(a,b){a.shadowRoot&&q(a.shad",
    "owRoot.childNodes,function(a){rc(a,b,!0,null,null)});nc(a,b,function(a,",
    "b,e,f,h){var c=null;1==a.nodeType?c=a:3==a.nodeType&&(c=a);null!=c&&(nu",
    "ll!=c.assignedSlot||c.getDestinationInsertionPoints&&0<c.getDestination",
    "InsertionPoints().length)||rc(a,b,e,f,h)})};Ma();Ma();function tc(a,b){",
    "this.w={};this.g=[];this.F=0;var c=arguments.length;if(1<c){if(c%2)thro",
    "w Error(\"Uneven number of arguments\");for(var d=0;d<c;d+=2)this.set(a",
    "rguments[d],arguments[d+1])}else a&&this.addAll(a)}function uc(a){vc(a)",
    ";return a.g.concat()}g=tc.prototype;g.clear=function(){this.w={};this.F",
    "=this.g.length=0};g.remove=function(a){return Object.prototype.hasOwnPr",
    "operty.call(this.w,a)?(delete this.w[a],this.F--,this.g.length>2*this.F",
    "&&vc(this),!0):!1};\nfunction vc(a){var b,c;if(a.F!=a.g.length){for(b=c",
    "=0;c<a.g.length;){var d=a.g[c];Object.prototype.hasOwnProperty.call(a.w",
    ",d)&&(a.g[b++]=d);c++}a.g.length=b}if(a.F!=a.g.length){var e={};for(b=c",
    "=0;c<a.g.length;)d=a.g[c],Object.prototype.hasOwnProperty.call(e,d)||(a",
    ".g[b++]=d,e[d]=1),c++;a.g.length=b}}g.get=function(a,b){return Object.p",
    "rototype.hasOwnProperty.call(this.w,a)?this.w[a]:b};g.set=function(a,b)",
    "{Object.prototype.hasOwnProperty.call(this.w,a)||(this.F++,this.g.push(",
    "a));this.w[a]=b};\ng.addAll=function(a){if(a instanceof tc){var b=uc(a)",
    ";vc(a);for(var c=[],d=0;d<a.g.length;d++)c.push(a.w[a.g[d]]);a=c}else{b",
    "=[];var d=0;for(e in a)b[d++]=e;d=[];var e=0;for(c in a)d[e++]=a[c];a=d",
    "}for(c=0;c<b.length;c++)this.set(b[c],a[c])};g.forEach=function(a,b){fo",
    "r(var c=uc(this),d=0;d<c.length;d++){var e=c[d],f=this.get(e);a.call(b,",
    "f,e,this)}};g.clone=function(){return new tc(this)};var wc={};function ",
    "Z(a,b,c){ea(a)&&(a=a.b);a=new xc(a);!b||b in wc&&!c||(wc[b]={key:a,shif",
    "t:!1},c&&(wc[c]={key:a,shift:!0}));return a}function xc(a){this.code=a}",
    "Z(8);Z(9);Z(13);var yc=Z(16),zc=Z(17),Ac=Z(18);Z(19);Z(20);Z(27);Z(32,",
    "\" \");Z(33);Z(34);Z(35);Z(36);Z(37);Z(38);Z(39);Z(40);Z(44);Z(45);Z(46",
    ");Z(48,\"0\",\")\");Z(49,\"1\",\"!\");Z(50,\"2\",\"@\");Z(51,\"3\",\"#",
    "\");Z(52,\"4\",\"$\");Z(53,\"5\",\"%\");Z(54,\"6\",\"^\");Z(55,\"7\",\"",
    "&\");Z(56,\"8\",\"*\");Z(57,\"9\",\"(\");Z(65,\"a\",\"A\");Z(66,\"b\",",
    "\"B\");Z(67,\"c\",\"C\");Z(68,\"d\",\"D\");\nZ(69,\"e\",\"E\");Z(70,\"f",
    "\",\"F\");Z(71,\"g\",\"G\");Z(72,\"h\",\"H\");Z(73,\"i\",\"I\");Z(74,\"",
    "j\",\"J\");Z(75,\"k\",\"K\");Z(76,\"l\",\"L\");Z(77,\"m\",\"M\");Z(78,",
    "\"n\",\"N\");Z(79,\"o\",\"O\");Z(80,\"p\",\"P\");Z(81,\"q\",\"Q\");Z(82",
    ",\"r\",\"R\");Z(83,\"s\",\"S\");Z(84,\"t\",\"T\");Z(85,\"u\",\"U\");Z(8",
    "6,\"v\",\"V\");Z(87,\"w\",\"W\");Z(88,\"x\",\"X\");Z(89,\"y\",\"Y\");Z(",
    "90,\"z\",\"Z\");var Bc=Z(Ia?{c:91,b:91}:Ha?{c:224,b:91}:{c:0,b:91});Z(I",
    "a?{c:92,b:92}:Ha?{c:224,b:93}:{c:0,b:92});Z(Ia?{c:93,b:93}:Ha?{c:0,b:0}",
    ":{c:93,b:null});Z({c:96,b:96},\"0\");Z({c:97,b:97},\"1\");\nZ({c:98,b:9",
    "8},\"2\");Z({c:99,b:99},\"3\");Z({c:100,b:100},\"4\");Z({c:101,b:101},",
    "\"5\");Z({c:102,b:102},\"6\");Z({c:103,b:103},\"7\");Z({c:104,b:104},\"",
    "8\");Z({c:105,b:105},\"9\");Z({c:106,b:106},\"*\");Z({c:107,b:107},\"+",
    "\");Z({c:109,b:109},\"-\");Z({c:110,b:110},\".\");Z({c:111,b:111},\"/\"",
    ");Z(144);Z(112);Z(113);Z(114);Z(115);Z(116);Z(117);Z(118);Z(119);Z(120)",
    ";Z(121);Z(122);Z(123);Z({c:107,b:187},\"=\",\"+\");Z(108,\",\");Z({c:10",
    "9,b:189},\"-\",\"_\");Z(188,\",\",\"<\");Z(190,\".\",\">\");Z(191,\"/\"",
    ",\"?\");Z(192,\"`\",\"~\");Z(219,\"[\",\"{\");\nZ(220,\"\\\\\",\"|\");Z",
    "(221,\"]\",\"}\");Z({c:59,b:186},\";\",\":\");Z(222,\"'\",'\"');var Cc=",
    "new tc;Cc.set(1,yc);Cc.set(2,zc);Cc.set(4,Ac);Cc.set(8,Bc);(function(a)",
    "{var b=new tc;q(uc(a),function(c){b.set(a.get(c).code,c)});return b})(C",
    "c);ba(\"_\",function(a){var b=[];bc?sc(a,b):pc(a,b);var c=b;a=c.length;",
    "for(var b=Array(a),c=l(c)?c.split(\"\"):c,d=0;d<a;d++)d in c&&(b[d]=mc.",
    "call(void 0,c[d]));return mc(b.join(\"\\n\")).replace(/\\xa0/g,\" \")})",
    ";; return this._.apply(null,arguments);}.apply({navigator:typeof window",
    "!='undefined'?window.navigator:null,document:typeof window!='undefined'",
    "?window.document:null}, arguments);}",
    NULL
};

const char* const IS_SELECTED[] = {
    "function(){return function(){var f,k=this;function l(a){return\"string",
    "\"==typeof a}function aa(a,b){a=a.split(\".\");var c=k;a[0]in c||!c.exe",
    "cScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());",
    ")a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c",
    "[d]=b}\nfunction ba(a){var b=typeof a;if(\"object\"==b)if(a){if(a insta",
    "nceof Array)return\"array\";if(a instanceof Object)return b;var c=Objec",
    "t.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.prope",
    "rtyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c",
    "||\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnume",
    "rable&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function ca(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function da(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction ea(a,b,c){ea=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?ca:da;return ea.apply(null,argumen",
    "ts)}function fa(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction n(a,b){function c(){}c.prototype=b.prototype;a.sa=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.ra=function(a,",
    "c,g){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};var ga=String.proto",
    "type.trim?function(a){return a.trim()}:function(a){return a.replace(/^[",
    "\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ha(a,b){return a<b?-1:a>b?1:0",
    "};function p(a,b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++",
    ")e in d&&b.call(void 0,d[e],e,a)}function q(a,b,c){var d=c;p(a,function",
    "(c,g){d=b.call(void 0,d,c,g,a)});return d}function r(a,b){for(var c=a.l",
    "ength,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],",
    "e,a))return!0;return!1}function ia(a){return Array.prototype.concat.app",
    "ly([],arguments)}function ja(a,b,c){return 2>=arguments.length?Array.pr",
    "ototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};function ka(",
    "a,b){this.code=a;this.state=t[a]||u;this.message=b||\"\";a=this.state.r",
    "eplace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase().replace(",
    "/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)",
    "a+=\"Error\";this.name=a;a=Error(this.message);a.name=this.name;this.st",
    "ack=a.stack||\"\"}n(ka,Error);var u=\"unknown error\",t={15:\"element n",
    "ot selectable\",11:\"element not visible\"};t[31]=u;t[30]=u;t[24]=\"inv",
    "alid cookie domain\";t[29]=\"invalid element coordinates\";t[12]=\"inva",
    "lid element state\";\nt[32]=\"invalid selector\";t[51]=\"invalid select",
    "or\";t[52]=\"invalid selector\";t[17]=\"javascript error\";t[405]=\"uns",
    "upported operation\";t[34]=\"move target out of bounds\";t[27]=\"no suc",
    "h alert\";t[7]=\"no such element\";t[8]=\"no such frame\";t[23]=\"no su",
    "ch window\";t[28]=\"script timeout\";t[33]=\"session not created\";t[10",
    "]=\"stale element reference\";t[21]=\"timeout\";t[25]=\"unable to set c",
    "ookie\";t[26]=\"unexpected alert open\";t[13]=u;t[9]=\"unknown command",
    "\";ka.prototype.toString=function(){return this.name+\": \"+this.messag",
    "e};var v;a:{var la=k.navigator;if(la){var ma=la.userAgent;if(ma){v=ma;b",
    "reak a}}v=\"\"};function na(a){var b=oa;Object.prototype.hasOwnProperty",
    ".call(b,\"528\")||(b[\"528\"]=a(\"528\"))};var pa=-1!=v.indexOf(\"Macin",
    "tosh\"),qa=-1!=v.indexOf(\"Windows\"),ra,sa=\"\",ta=/WebKit\\/(\\S+)/.e",
    "xec(v);ta&&(sa=ta?ta[1]:\"\");ra=sa;var oa={};\nfunction ua(){na(functi",
    "on(){for(var a=0,b=ga(String(ra)).split(\".\"),c=ga(\"528\").split(\".",
    "\"),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var g=b[e]||\"\",h",
    "=c[e]||\"\";do{g=/(\\d*)(\\D*)(.*)/.exec(g)||[\"\",\"\",\"\",\"\"];h=/(",
    "\\d*)(\\D*)(.*)/.exec(h)||[\"\",\"\",\"\",\"\"];if(0==g[0].length&&0==h",
    "[0].length)break;a=ha(0==g[1].length?0:parseInt(g[1],10),0==h[1].length",
    "?0:parseInt(h[1],10))||ha(0==g[2].length,0==h[2].length)||ha(g[2],h[2])",
    ";g=g[3];h=h[3]}while(0==a)}return 0<=a})};function va(a,b){if(!a||!b)re",
    "turn!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"und",
    "efined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDoc",
    "umentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunctio",
    "n wa(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compar",
    "eDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sou",
    "rceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)",
    "return a.sourceIndex-b.sourceIndex;var e=a.parentNode,g=b.parentNode;re",
    "turn e==g?ya(a,b):!c&&va(e,b)?-1*za(a,b):!d&&va(g,a)?za(b,a):(c?a.sourc",
    "eIndex:e.sourceIndex)-(d?b.sourceIndex:g.sourceIndex)}d=9==a.nodeType?a",
    ":a.ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.collap",
    "se(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.comp",
    "areBoundaryPoints(k.Range.START_TO_END,a)}function za(a,b){var c=a.pare",
    "ntNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return ya(",
    "b,a)}function ya(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return",
    " 1};function Aa(a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!",
    "!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}function Ba(a){retu",
    "rn Aa(a,\"OPTION\")?!0:Aa(a,\"INPUT\")?(a=a.type.toLowerCase(),\"checkb",
    "ox\"==a||\"radio\"==a):!1};/*\n\n The MIT License\n\n Copyright (c) 200",
    "7 Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is ",
    "hereby granted, free of charge, to any person obtaining a copy\n of thi",
    "s software and associated documentation files (the \"Software\"), to\n ",
    "deal in the Software without restriction, including without limitation ",
    "the\n rights to use, copy, modify, merge, publish, distribute, sublicen",
    "se, and/or\n sell copies of the Software, and to permit persons to whom",
    " the Software is\n furnished to do so, subject to the following conditi",
    "ons:\n\n The above copyright notice and this permission notice shall be",
    " included in\n all copies or substantial portions of the Software.\n\n ",
    "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRE",
    "SS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHAN",
    "TABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO",
    " EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM",
    ", DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT ",
    "OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE",
    " OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction w(a,b,c)",
    "{this.s=a;this.pa=b||1;this.o=c||1};function x(a){this.X=a;this.N=0}fun",
    "ction Ca(a){a=a.match(Da);for(var b=0;b<a.length;b++)Ea.test(a[b])&&a.s",
    "plice(b,1);return new x(a)}var Da=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]",
    "+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|",
    "\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Ea=/^\\s/;function y(a,b){re",
    "turn a.X[a.N+(b||0)]}x.prototype.next=function(){return this.X[this.N++",
    "]};x.prototype.back=function(){this.N--};x.prototype.empty=function(){r",
    "eturn this.X.length<=this.N};function A(a){var b=null,c=a.nodeType;1==c",
    "&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null",
    "==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentEle",
    "ment:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.n",
    "odeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling",
    "););}}else b=a.nodeValue;return\"\"+b}\nfunction B(a,b,c){if(null===b)r",
    "eturn!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==",
    "c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function C(a,b,c,d,e){retu",
    "rn Fa.call(null,a,b,l(c)?c:null,l(d)?d:null,e||new D)}\nfunction Fa(a,b",
    ",c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),p",
    "(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&",
    "\"class\"==c?(b=b.getElementsByClassName(d),p(b,function(b){b.className",
    "==d&&a.matches(b)&&e.add(b)})):a instanceof E?Ga(a,b,c,d,e):b.getElemen",
    "tsByTagName&&(b=b.getElementsByTagName(a.getName()),p(b,function(a){B(a",
    ",c,d)&&e.add(a)}));return e}function Ga(a,b,c,d,e){for(b=b.firstChild;b",
    ";b=b.nextSibling)B(b,c,d)&&a.matches(b)&&e.add(b),Ga(a,b,c,d,e)};functi",
    "on D(){this.o=this.j=null;this.J=0}function Ha(a){this.node=a;this.next",
    "=this.D=null}function Ia(a,b){if(!a.j)return b;if(!b.j)return a;var c=a",
    ".j;b=b.j;for(var d=null,e,g=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.ne",
    "xt):0<wa(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.D=d)?d.next=e:",
    "a.j=e,d=e,g++;for(e=c||b;e;)e.D=d,d=d.next=e,g++,e=e.next;a.o=d;a.J=g;r",
    "eturn a}D.prototype.unshift=function(a){a=new Ha(a);a.next=this.j;this.",
    "o?this.j.D=a:this.j=this.o=a;this.j=a;this.J++};\nD.prototype.add=funct",
    "ion(a){a=new Ha(a);a.D=this.o;this.j?this.o.next=a:this.j=this.o=a;this",
    ".o=a;this.J++};function F(a){return(a=a.j)?a.node:null}D.prototype.u=fu",
    "nction(){return this.J};function G(a){return(a=F(a))?A(a):\"\"}D.protot",
    "ype.iterator=function(a){return new Ja(this,!!a)};function Ja(a,b){this",
    ".la=a;this.Y=(this.G=b)?a.o:a.j;this.U=null}Ja.prototype.next=function(",
    "){var a=this.Y;if(null==a)return null;var b=this.U=a;this.Y=this.G?a.D:",
    "a.next;return b.node};\nJa.prototype.remove=function(){var a=this.la,b=",
    "this.U;if(!b)throw Error(\"Next must be called at least once before rem",
    "ove.\");var c=b.D,b=b.next;c?c.next=b:a.j=b;b?b.D=c:a.o=c;a.J--;this.U=",
    "null};function H(a){this.i=a;this.l=this.w=!1;this.K=null}function I(a)",
    "{return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}H.prototyp",
    "e.h=function(){return this.w};function Ka(a,b){a.w=b}function La(a,b){a",
    ".l=b}H.prototype.B=function(){return this.K};function J(a,b){a=a.evalua",
    "te(b);return a instanceof D?+G(a):+a}function K(a,b){a=a.evaluate(b);re",
    "turn a instanceof D?G(a):\"\"+a}function L(a,b){a=a.evaluate(b);return ",
    "a instanceof D?!!a.u():!!a};function M(a,b,c){H.call(this,a.i);this.W=a",
    ";this.aa=b;this.fa=c;this.w=b.h()||c.h();this.l=b.l||c.l;this.W==Ma&&(c",
    ".l||c.h()||4==c.i||0==c.i||!b.B()?b.l||b.h()||4==b.i||0==b.i||!c.B()||(",
    "this.K={name:c.B().name,I:b}):this.K={name:b.B().name,I:c})}n(M,H);\nfu",
    "nction N(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var g;if(b instance",
    "of D&&c instanceof D){b=b.iterator();for(d=b.next();d;d=b.next())for(e=",
    "c.iterator(),g=e.next();g;g=e.next())if(a(A(d),A(g)))return!0;return!1}",
    "if(b instanceof D||c instanceof D){b instanceof D?(e=b,d=c):(e=c,d=b);g",
    "=e.iterator();for(var h=typeof d,m=g.next();m;m=g.next()){switch(h){cas",
    "e \"number\":m=+A(m);break;case \"boolean\":m=!!A(m);break;case \"strin",
    "g\":m=A(m);break;default:throw Error(\"Illegal primitive type for compa",
    "rison.\");\n}if(e==b&&a(m,d)||e==c&&a(d,m))return!0}return!1}return e?",
    "\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typ",
    "eof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}M.prototype.evalua",
    "te=function(a){return this.W.C(this.aa,this.fa,a)};M.prototype.toString",
    "=function(){var a=\"Binary Expression: \"+this.W,a=a+I(this.aa);return ",
    "a+=I(this.fa)};function Na(a,b,c,d){this.oa=a;this.da=b;this.i=c;this.C",
    "=d}Na.prototype.toString=function(){return this.oa};var Oa={};\nfunctio",
    "n O(a,b,c,d){if(Oa.hasOwnProperty(a))throw Error(\"Binary operator alre",
    "ady created: \"+a);a=new Na(a,b,c,d);return Oa[a.toString()]=a}O(\"div",
    "\",6,1,function(a,b,c){return J(a,c)/J(b,c)});O(\"mod\",6,1,function(a,",
    "b,c){return J(a,c)%J(b,c)});O(\"*\",6,1,function(a,b,c){return J(a,c)*J",
    "(b,c)});O(\"+\",5,1,function(a,b,c){return J(a,c)+J(b,c)});O(\"-\",5,1,",
    "function(a,b,c){return J(a,c)-J(b,c)});O(\"<\",4,2,function(a,b,c){retu",
    "rn N(function(a,b){return a<b},a,b,c)});\nO(\">\",4,2,function(a,b,c){r",
    "eturn N(function(a,b){return a>b},a,b,c)});O(\"<=\",4,2,function(a,b,c)",
    "{return N(function(a,b){return a<=b},a,b,c)});O(\">=\",4,2,function(a,b",
    ",c){return N(function(a,b){return a>=b},a,b,c)});var Ma=O(\"=\",3,2,fun",
    "ction(a,b,c){return N(function(a,b){return a==b},a,b,c,!0)});O(\"!=\",3",
    ",2,function(a,b,c){return N(function(a,b){return a!=b},a,b,c,!0)});O(\"",
    "and\",2,2,function(a,b,c){return L(a,c)&&L(b,c)});O(\"or\",1,2,function",
    "(a,b,c){return L(a,c)||L(b,c)});function Pa(a,b){if(b.u()&&4!=a.i)throw",
    " Error(\"Primary expression must evaluate to nodeset if filter has pred",
    "icate(s).\");H.call(this,a.i);this.ea=a;this.f=b;this.w=a.h();this.l=a.",
    "l}n(Pa,H);Pa.prototype.evaluate=function(a){a=this.ea.evaluate(a);retur",
    "n Qa(this.f,a)};Pa.prototype.toString=function(){var a=\"Filter:\"+I(th",
    "is.ea);return a+=I(this.f)};function Ra(a,b){if(b.length<a.ca)throw Err",
    "or(\"Function \"+a.m+\" expects at least\"+a.ca+\" arguments, \"+b.leng",
    "th+\" given\");if(null!==a.V&&b.length>a.V)throw Error(\"Function \"+a.",
    "m+\" expects at most \"+a.V+\" arguments, \"+b.length+\" given\");a.ma&",
    "&p(b,function(b,d){if(4!=b.i)throw Error(\"Argument \"+d+\" to function",
    " \"+a.m+\" is not of type Nodeset: \"+b);});H.call(this,a.i);this.M=a;t",
    "his.S=b;Ka(this,a.w||r(b,function(a){return a.h()}));La(this,a.ka&&!b.l",
    "ength||a.ja&&!!b.length||r(b,function(a){return a.l}))}\nn(Ra,H);Ra.pro",
    "totype.evaluate=function(a){return this.M.C.apply(null,ia(a,this.S))};R",
    "a.prototype.toString=function(){var a=\"Function: \"+this.M;if(this.S.l",
    "ength)var b=q(this.S,function(a,b){return a+I(b)},\"Arguments:\"),a=a+I",
    "(b);return a};function Sa(a,b,c,d,e,g,h,m,z){this.m=a;this.i=b;this.w=c",
    ";this.ka=d;this.ja=e;this.C=g;this.ca=h;this.V=void 0!==m?m:h;this.ma=!",
    "!z}Sa.prototype.toString=function(){return this.m};var Ta={};\nfunction",
    " P(a,b,c,d,e,g,h,m){if(Ta.hasOwnProperty(a))throw Error(\"Function alre",
    "ady created: \"+a+\".\");Ta[a]=new Sa(a,b,c,d,!1,e,g,h,m)}P(\"boolean\"",
    ",2,!1,!1,function(a,b){return L(b,a)},1);P(\"ceiling\",1,!1,!1,function",
    "(a,b){return Math.ceil(J(b,a))},1);P(\"concat\",3,!1,!1,function(a,b){r",
    "eturn q(ja(arguments,1),function(b,d){return b+K(d,a)},\"\")},2,null);P",
    "(\"contains\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return-1!=b.ind",
    "exOf(a)},2);P(\"count\",1,!1,!1,function(a,b){return b.evaluate(a).u()}",
    ",1,1,!0);\nP(\"false\",2,!1,!1,function(){return!1},0);P(\"floor\",1,!1",
    ",!1,function(a,b){return Math.floor(J(b,a))},1);P(\"id\",4,!1,!1,functi",
    "on(a,b){var c=a.s,d=9==c.nodeType?c:c.ownerDocument;a=K(b,a).split(/\\s",
    "+/);var e=[];p(a,function(a){a=d.getElementById(a);var b;if(!(b=!a)){a:",
    "if(l(e))b=l(a)&&1==a.length?e.indexOf(a,0):-1;else{for(b=0;b<e.length;b",
    "++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b||e.push(a)});e.sort(wa);va",
    "r g=new D;p(e,function(a){g.add(a)});return g},1);P(\"lang\",2,!1,!1,fu",
    "nction(){return!1},1);\nP(\"last\",1,!0,!1,function(a){if(1!=arguments.",
    "length)throw Error(\"Function last expects ()\");return a.o},0);P(\"loc",
    "al-name\",3,!1,!0,function(a,b){return(a=b?F(b.evaluate(a)):a.s)?a.loca",
    "lName||a.nodeName.toLowerCase():\"\"},0,1,!0);P(\"name\",3,!1,!0,functi",
    "on(a,b){return(a=b?F(b.evaluate(a)):a.s)?a.nodeName.toLowerCase():\"\"}",
    ",0,1,!0);P(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);\nP",
    "(\"normalize-space\",3,!1,!0,function(a,b){return(b?K(b,a):A(a.s)).repl",
    "ace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);P(\"not\",",
    "2,!1,!1,function(a,b){return!L(b,a)},1);P(\"number\",1,!1,!0,function(a",
    ",b){return b?J(b,a):+A(a.s)},0,1);P(\"position\",1,!0,!1,function(a){re",
    "turn a.pa},0);P(\"round\",1,!1,!1,function(a,b){return Math.round(J(b,a",
    "))},1);P(\"starts-with\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);retu",
    "rn 0==b.lastIndexOf(a,0)},2);P(\"string\",3,!1,!0,function(a,b){return ",
    "b?K(b,a):A(a.s)},0,1);\nP(\"string-length\",1,!1,!0,function(a,b){retur",
    "n(b?K(b,a):A(a.s)).length},0,1);P(\"substring\",3,!1,!1,function(a,b,c,",
    "d){c=J(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?J(d,a",
    "):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var ",
    "e=Math.max(c,0);a=K(b,a);return Infinity==d?a.substring(e):a.substring(",
    "e,c+Math.round(d))},2,3);P(\"substring-after\",3,!1,!1,function(a,b,c){",
    "b=K(b,a);a=K(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.lengt",
    "h)},2);\nP(\"substring-before\",3,!1,!1,function(a,b,c){b=K(b,a);a=K(c,",
    "a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);P(\"sum\",1,!1,",
    "!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=",
    "a.next())b+=+A(c);return b},1,1,!0);P(\"translate\",3,!1,!1,function(a,",
    "b,c,d){b=K(b,a);c=K(c,a);var e=K(d,a);d={};for(var g=0;g<c.length;g++)a",
    "=c.charAt(g),a in d||(d[a]=e.charAt(g));c=\"\";for(g=0;g<b.length;g++)a",
    "=b.charAt(g),c+=a in d?d[a]:a;return c},3);P(\"true\",2,!1,!1,function(",
    "){return!0},0);function E(a,b){this.ha=a;this.ba=void 0!==b?b:null;this",
    ".H=null;switch(a){case \"comment\":this.H=8;break;case \"text\":this.H=",
    "3;break;case \"processing-instruction\":this.H=7;break;case \"node\":br",
    "eak;default:throw Error(\"Unexpected argument\");}}function Ua(a){retur",
    "n\"comment\"==a||\"text\"==a||\"processing-instruction\"==a||\"node\"==",
    "a}E.prototype.matches=function(a){return null===this.H||this.H==a.nodeT",
    "ype};E.prototype.getName=function(){return this.ha};\nE.prototype.toStr",
    "ing=function(){var a=\"Kind Test: \"+this.ha;null===this.ba||(a+=I(this",
    ".ba));return a};function Va(a){H.call(this,3);this.ga=a.substring(1,a.l",
    "ength-1)}n(Va,H);Va.prototype.evaluate=function(){return this.ga};Va.pr",
    "ototype.toString=function(){return\"Literal: \"+this.ga};function Q(a,b",
    "){this.m=a.toLowerCase();a=\"*\"==this.m?\"*\":\"http://www.w3.org/1999",
    "/xhtml\";this.O=b?b.toLowerCase():a}Q.prototype.matches=function(a){var",
    " b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.localName?a.localName",
    ":a.nodeName;return\"*\"!=this.m&&this.m!=b.toLowerCase()?!1:\"*\"==this",
    ".O?!0:this.O==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http://www",
    ".w3.org/1999/xhtml\")};Q.prototype.getName=function(){return this.m};\n",
    "Q.prototype.toString=function(){return\"Name Test: \"+(\"http://www.w3.",
    "org/1999/xhtml\"==this.O?\"\":this.O+\":\")+this.m};function Wa(a){H.ca",
    "ll(this,1);this.ia=a}n(Wa,H);Wa.prototype.evaluate=function(){return th",
    "is.ia};Wa.prototype.toString=function(){return\"Number: \"+this.ia};fun",
    "ction Xa(a,b){H.call(this,a.i);this.$=a;this.L=b;this.w=a.h();this.l=a.",
    "l;1==this.L.length&&(a=this.L[0],a.T||a.A!=Ya||(a=a.R,\"*\"!=a.getName(",
    ")&&(this.K={name:a.getName(),I:null})))}n(Xa,H);function R(){H.call(thi",
    "s,4)}n(R,H);R.prototype.evaluate=function(a){var b=new D;a=a.s;9==a.nod",
    "eType?b.add(a):b.add(a.ownerDocument);return b};R.prototype.toString=fu",
    "nction(){return\"Root Helper Expression\"};function Za(){H.call(this,4)",
    "}n(Za,H);Za.prototype.evaluate=function(a){var b=new D;b.add(a.s);retur",
    "n b};\nZa.prototype.toString=function(){return\"Context Helper Expressi",
    "on\"};function $a(a){return\"/\"==a||\"//\"==a}\nXa.prototype.evaluate=",
    "function(a){var b=this.$.evaluate(a);if(!(b instanceof D))throw Error(",
    "\"Filter expression must evaluate to nodeset.\");a=this.L;for(var c=0,d",
    "=a.length;c<d&&b.u();c++){var e=a[c],g=b.iterator(e.A.G);if(e.h()||e.A!",
    "=ab)if(e.h()||e.A!=bb){var h=g.next();for(b=e.evaluate(new w(h));null!=",
    "(h=g.next());)h=e.evaluate(new w(h)),b=Ia(b,h)}else h=g.next(),b=e.eval",
    "uate(new w(h));else{for(h=g.next();(b=g.next())&&(!h.contains||h.contai",
    "ns(b))&&b.compareDocumentPosition(h)&8;h=b);b=e.evaluate(new w(h))}}ret",
    "urn b};\nXa.prototype.toString=function(){var a=\"Path Expression:\"+I(",
    "this.$);if(this.L.length){var b=q(this.L,function(a,b){return a+I(b)},",
    "\"Steps:\");a+=I(b)}return a};function S(a,b){this.f=a;this.G=!!b}funct",
    "ion Qa(a,b,c){for(c=c||0;c<a.f.length;c++)for(var d=a.f[c],e=b.iterator",
    "(),g=b.u(),h,m=0;h=e.next();m++){var z=a.G?g-m:m+1;h=d.evaluate(new w(h",
    ",z,g));if(\"number\"==typeof h)z=z==h;else if(\"string\"==typeof h||\"b",
    "oolean\"==typeof h)z=!!h;else if(h instanceof D)z=0<h.u();else throw Er",
    "ror(\"Predicate.evaluate returned an unexpected type.\");z||e.remove()}",
    "return b}S.prototype.B=function(){return 0<this.f.length?this.f[0].B():",
    "null};\nS.prototype.h=function(){for(var a=0;a<this.f.length;a++){var b",
    "=this.f[a];if(b.h()||1==b.i||0==b.i)return!0}return!1};S.prototype.u=fu",
    "nction(){return this.f.length};S.prototype.toString=function(){return q",
    "(this.f,function(a,b){return a+I(b)},\"Predicates:\")};function T(a,b,c",
    ",d){H.call(this,4);this.A=a;this.R=b;this.f=c||new S([]);this.T=!!d;b=t",
    "his.f.B();a.qa&&b&&(this.K={name:b.name,I:b.I});this.w=this.f.h()}n(T,H",
    ");\nT.prototype.evaluate=function(a){var b=a.s,c=this.B(),d=null,e=null",
    ",g=0;c&&(d=c.name,e=c.I?K(c.I,a):null,g=1);if(this.T)if(this.h()||this.",
    "A!=cb)if(b=(new T(db,new E(\"node\"))).evaluate(a).iterator(),c=b.next(",
    "))for(a=this.C(c,d,e,g);null!=(c=b.next());)a=Ia(a,this.C(c,d,e,g));els",
    "e a=new D;else a=C(this.R,b,d,e),a=Qa(this.f,a,g);else a=this.C(a.s,d,e",
    ",g);return a};T.prototype.C=function(a,b,c,d){a=this.A.M(this.R,a,b,c);",
    "return a=Qa(this.f,a,d)};\nT.prototype.toString=function(){var a=\"Step",
    ":\"+I(\"Operator: \"+(this.T?\"//\":\"/\"));this.A.m&&(a+=I(\"Axis: \"+",
    "this.A));a+=I(this.R);if(this.f.u()){var b=q(this.f.f,function(a,b){ret",
    "urn a+I(b)},\"Predicates:\");a+=I(b)}return a};function eb(a,b,c,d){thi",
    "s.m=a;this.M=b;this.G=c;this.qa=d}eb.prototype.toString=function(){retu",
    "rn this.m};var fb={};function U(a,b,c,d){if(fb.hasOwnProperty(a))throw ",
    "Error(\"Axis already created: \"+a);b=new eb(a,b,c,!!d);return fb[a]=b}",
    "\nU(\"ancestor\",function(a,b){for(var c=new D;b=b.parentNode;)a.matche",
    "s(b)&&c.unshift(b);return c},!0);U(\"ancestor-or-self\",function(a,b){v",
    "ar c=new D;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c",
    "},!0);\nvar Ya=U(\"attribute\",function(a,b){var c=new D,d=a.getName();",
    "if(b=b.attributes)if(a instanceof E&&null===a.H||\"*\"==d)for(d=0;a=b[d",
    "];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1),cb=U(",
    "\"child\",function(a,b,c,d,e){c=l(c)?c:null;d=l(d)?d:null;e=e||new D;fo",
    "r(b=b.firstChild;b;b=b.nextSibling)B(b,c,d)&&a.matches(b)&&e.add(b);ret",
    "urn e},!1,!0);U(\"descendant\",C,!1,!0);\nvar db=U(\"descendant-or-self",
    "\",function(a,b,c,d){var e=new D;B(b,c,d)&&a.matches(b)&&e.add(b);retur",
    "n C(a,b,c,d,e)},!1,!0),ab=U(\"following\",function(a,b,c,d){var e=new D",
    ";do for(var g=b;g=g.nextSibling;)B(g,c,d)&&a.matches(g)&&e.add(g),e=C(a",
    ",g,c,d,e);while(b=b.parentNode);return e},!1,!0);U(\"following-sibling",
    "\",function(a,b){for(var c=new D;b=b.nextSibling;)a.matches(b)&&c.add(b",
    ");return c},!1);U(\"namespace\",function(){return new D},!1);\nvar gb=U",
    "(\"parent\",function(a,b){var c=new D;if(9==b.nodeType)return c;if(2==b",
    ".nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c",
    ".add(b);return c},!1),bb=U(\"preceding\",function(a,b,c,d){var e=new D,",
    "g=[];do g.unshift(b);while(b=b.parentNode);for(var h=1,m=g.length;h<m;h",
    "++){var z=[];for(b=g[h];b=b.previousSibling;)z.unshift(b);for(var xa=0,",
    "yb=z.length;xa<yb;xa++)b=z[xa],B(b,c,d)&&a.matches(b)&&e.add(b),e=C(a,b",
    ",c,d,e)}return e},!0,!0);\nU(\"preceding-sibling\",function(a,b){for(va",
    "r c=new D;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0)",
    ";var hb=U(\"self\",function(a,b){var c=new D;a.matches(b)&&c.add(b);ret",
    "urn c},!1);function ib(a){H.call(this,1);this.Z=a;this.w=a.h();this.l=a",
    ".l}n(ib,H);ib.prototype.evaluate=function(a){return-J(this.Z,a)};ib.pro",
    "totype.toString=function(){return\"Unary Expression: -\"+I(this.Z)};fun",
    "ction jb(a){H.call(this,4);this.P=a;Ka(this,r(this.P,function(a){return",
    " a.h()}));La(this,r(this.P,function(a){return a.l}))}n(jb,H);jb.prototy",
    "pe.evaluate=function(a){var b=new D;p(this.P,function(c){c=c.evaluate(a",
    ");if(!(c instanceof D))throw Error(\"Path expression must evaluate to N",
    "odeSet.\");b=Ia(b,c)});return b};jb.prototype.toString=function(){retur",
    "n q(this.P,function(a,b){return a+I(b)},\"Union Expression:\")};functio",
    "n kb(a,b){this.a=a;this.na=b}function lb(a){for(var b,c=[];;){V(a,\"Mis",
    "sing right hand side of binary expression.\");b=mb(a);var d=a.a.next();",
    "if(!d)break;var e=(d=Oa[d]||null)&&d.da;if(!e){a.a.back();break}for(;c.",
    "length&&e<=c[c.length-1].da;)b=new M(c.pop(),c.pop(),b);c.push(b,d)}for",
    "(;c.length;)b=new M(c.pop(),c.pop(),b);return b}function V(a,b){if(a.a.",
    "empty())throw Error(b);}function nb(a,b){a=a.a.next();if(a!=b)throw Err",
    "or(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction ob(a){a=a.a.ne",
    "xt();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function pb(a){a=a.a.n",
    "ext();if(2>a.length)throw Error(\"Unclosed literal string\");return new",
    " Va(a)}\nfunction qb(a){var b=[];if($a(y(a.a))){var c=a.a.next();var d=",
    "y(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!",
    "=d&&!/(?![0-9])[\\w]/.test(d)))return new R;d=new R;V(a,\"Missing next ",
    "location step.\");c=rb(a,c);b.push(c)}else{a:{c=y(a.a);d=c.charAt(0);sw",
    "itch(d){case \"$\":throw Error(\"Variable reference not allowed in HTML",
    " XPath\");case \"(\":a.a.next();c=lb(a);V(a,'unclosed \"(\"');nb(a,\")",
    "\");break;case '\"':case \"'\":c=pb(a);break;default:if(isNaN(+c))if(!U",
    "a(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==y(a.a,\n1)){c=a.a.next();c=Ta[c]",
    "||null;a.a.next();for(d=[];\")\"!=y(a.a);){V(a,\"Missing function argum",
    "ent list.\");d.push(lb(a));if(\",\"!=y(a.a))break;a.a.next()}V(a,\"Uncl",
    "osed function argument list.\");ob(a);c=new Ra(c,d)}else{c=null;break a",
    "}else c=new Wa(+a.a.next())}\"[\"==y(a.a)&&(d=new S(sb(a)),c=new Pa(c,d",
    "))}if(c)if($a(y(a.a)))d=c;else return c;else c=rb(a,\"/\"),d=new Za,b.p",
    "ush(c)}for(;$a(y(a.a));)c=a.a.next(),V(a,\"Missing next location step.",
    "\"),c=rb(a,c),b.push(c);return new Xa(d,b)}\nfunction rb(a,b){if(\"/\"!",
    "=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"",
    "==y(a.a)){var c=new T(hb,new E(\"node\"));a.a.next();return c}if(\"..\"",
    "==y(a.a))return c=new T(gb,new E(\"node\")),a.a.next(),c;if(\"@\"==y(a.",
    "a)){var d=Ya;a.a.next();V(a,\"Missing attribute name\")}else if(\"::\"=",
    "=y(a.a,1)){if(!/(?![0-9])[\\w]/.test(y(a.a).charAt(0)))throw Error(\"Ba",
    "d token: \"+a.a.next());var e=a.a.next();d=fb[e]||null;if(!d)throw Erro",
    "r(\"No axis with name: \"+e);a.a.next();V(a,\"Missing node name\")}else",
    " d=cb;e=\ny(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==y(a",
    ".a,1)){if(!Ua(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if",
    "(!Ua(e))throw Error(\"Invalid type name: \"+e);nb(a,\"(\");V(a,\"Bad no",
    "detype\");var g=y(a.a).charAt(0),h=null;if('\"'==g||\"'\"==g)h=pb(a);V(",
    "a,\"Bad nodetype\");ob(a);e=new E(e,h)}else if(e=a.a.next(),g=e.indexOf",
    "(\":\"),-1==g)e=new Q(e);else{var h=e.substring(0,g);if(\"*\"==h)var m=",
    "\"*\";else if(m=a.na(h),!m)throw Error(\"Namespace prefix not declared:",
    " \"+h);e=e.substr(g+1);e=new Q(e,m)}else throw Error(\"Bad token: \"+\n",
    "a.a.next());a=new S(sb(a),d.G);return c||new T(d,e,a,\"//\"==b)}functio",
    "n sb(a){for(var b=[];\"[\"==y(a.a);){a.a.next();V(a,\"Missing predicate",
    " expression.\");var c=lb(a);b.push(c);V(a,\"Unclosed predicate expressi",
    "on.\");nb(a,\"]\")}return b}function mb(a){if(\"-\"==y(a.a))return a.a.",
    "next(),new ib(mb(a));var b=qb(a);if(\"|\"!=y(a.a))a=b;else{for(b=[b];\"",
    "|\"==a.a.next();)V(a,\"Missing next union location path.\"),b.push(qb(a",
    "));a.a.back();a=new jb(b)}return a};function tb(a){switch(a.nodeType){c",
    "ase 1:return fa(ub,a);case 9:return tb(a.documentElement);case 11:case ",
    "10:case 6:case 12:return vb;default:return a.parentNode?tb(a.parentNode",
    "):vb}}function vb(){return null}function ub(a,b){if(a.prefix==b)return ",
    "a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNo",
    "de(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a",
    ".parentNode.nodeType?ub(a.parentNode,b):null};function wb(a,b){if(!a.le",
    "ngth)throw Error(\"Empty XPath expression.\");a=Ca(a);if(a.empty())thro",
    "w Error(\"Invalid XPath expression.\");b?\"function\"==ba(b)||(b=ea(b.l",
    "ookupNamespaceURI,b)):b=function(){return null};var c=lb(new kb(a,b));i",
    "f(!a.empty())throw Error(\"Bad token: \"+a.next());this.evaluate=functi",
    "on(a,b){a=c.evaluate(new w(a));return new W(a,b)}}\nfunction W(a,b){if(",
    "0==b)if(a instanceof D)b=4;else if(\"string\"==typeof a)b=2;else if(\"n",
    "umber\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Erro",
    "r(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceo",
    "f D))throw Error(\"value could not be converted to the specified type\"",
    ");this.resultType=b;switch(b){case 2:this.stringValue=a instanceof D?G(",
    "a):\"\"+a;break;case 1:this.numberValue=a instanceof D?+G(a):+a;break;c",
    "ase 3:this.booleanValue=a instanceof D?0<a.u():!!a;break;case 4:case 5:",
    "case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.ne",
    "xt())d.push(e);this.snapshotLength=a.u();this.invalidIteratorState=!1;b",
    "reak;case 8:case 9:this.singleNodeValue=F(a);break;default:throw Error(",
    "\"Unknown XPathResult type.\");}var g=0;this.iterateNext=function(){if(",
    "4!=b&&5!=b)throw Error(\"iterateNext called with wrong result type\");r",
    "eturn g>=d.length?null:d[g++]};this.snapshotItem=function(a){if(6!=b&&7",
    "!=b)throw Error(\"snapshotItem called with wrong result type\");return ",
    "a>=d.length||0>a?null:d[a]}}\nW.ANY_TYPE=0;W.NUMBER_TYPE=1;W.STRING_TYP",
    "E=2;W.BOOLEAN_TYPE=3;W.UNORDERED_NODE_ITERATOR_TYPE=4;W.ORDERED_NODE_IT",
    "ERATOR_TYPE=5;W.UNORDERED_NODE_SNAPSHOT_TYPE=6;W.ORDERED_NODE_SNAPSHOT_",
    "TYPE=7;W.ANY_UNORDERED_NODE_TYPE=8;W.FIRST_ORDERED_NODE_TYPE=9;function",
    " xb(a){this.lookupNamespaceURI=tb(a)}\naa(\"wgxpath.install\",function(",
    "a,b){a=a||k;var c=a.Document&&a.Document.prototype||a.document;if(!c.ev",
    "aluate||b)a.XPathResult=W,c.evaluate=function(a,b,c,h){return(new wb(a,",
    "c)).evaluate(b,h)},c.createExpression=function(a,b){return new wb(a,b)}",
    ",c.createNSResolver=function(a){return new xb(a)}});ua();ua();function ",
    "X(a,b){this.v={};this.g=[];this.F=0;var c=arguments.length;if(1<c){if(c",
    "%2)throw Error(\"Uneven number of arguments\");for(var d=0;d<c;d+=2)thi",
    "s.set(arguments[d],arguments[d+1])}else a&&this.addAll(a)}function zb(a",
    "){Ab(a);return a.g.concat()}f=X.prototype;f.clear=function(){this.v={};",
    "this.F=this.g.length=0};f.remove=function(a){return Object.prototype.ha",
    "sOwnProperty.call(this.v,a)?(delete this.v[a],this.F--,this.g.length>2*",
    "this.F&&Ab(this),!0):!1};\nfunction Ab(a){var b,c;if(a.F!=a.g.length){f",
    "or(b=c=0;c<a.g.length;){var d=a.g[c];Object.prototype.hasOwnProperty.ca",
    "ll(a.v,d)&&(a.g[b++]=d);c++}a.g.length=b}if(a.F!=a.g.length){var e={};f",
    "or(b=c=0;c<a.g.length;)d=a.g[c],Object.prototype.hasOwnProperty.call(e,",
    "d)||(a.g[b++]=d,e[d]=1),c++;a.g.length=b}}f.get=function(a,b){return Ob",
    "ject.prototype.hasOwnProperty.call(this.v,a)?this.v[a]:b};f.set=functio",
    "n(a,b){Object.prototype.hasOwnProperty.call(this.v,a)||(this.F++,this.g",
    ".push(a));this.v[a]=b};\nf.addAll=function(a){if(a instanceof X){var b=",
    "zb(a);Ab(a);for(var c=[],d=0;d<a.g.length;d++)c.push(a.v[a.g[d]]);a=c}e",
    "lse{b=[];var d=0;for(e in a)b[d++]=e;d=[];var e=0;for(c in a)d[e++]=a[c",
    "];a=d}for(c=0;c<b.length;c++)this.set(b[c],a[c])};f.forEach=function(a,",
    "b){for(var c=zb(this),d=0;d<c.length;d++){var e=c[d],g=this.get(e);a.ca",
    "ll(b,g,e,this)}};f.clone=function(){return new X(this)};var Bb={};funct",
    "ion Y(a,b,c){var d=typeof a;(\"object\"==d&&null!=a||\"function\"==d)&&",
    "(a=a.b);a=new Cb(a);!b||b in Bb&&!c||(Bb[b]={key:a,shift:!1},c&&(Bb[c]=",
    "{key:a,shift:!0}));return a}function Cb(a){this.code=a}Y(8);Y(9);Y(13);",
    "var Db=Y(16),Eb=Y(17),Fb=Y(18);Y(19);Y(20);Y(27);Y(32,\" \");Y(33);Y(34",
    ");Y(35);Y(36);Y(37);Y(38);Y(39);Y(40);Y(44);Y(45);Y(46);Y(48,\"0\",\")",
    "\");Y(49,\"1\",\"!\");Y(50,\"2\",\"@\");Y(51,\"3\",\"#\");Y(52,\"4\",\"",
    "$\");Y(53,\"5\",\"%\");Y(54,\"6\",\"^\");Y(55,\"7\",\"&\");Y(56,\"8\",",
    "\"*\");Y(57,\"9\",\"(\");Y(65,\"a\",\"A\");\nY(66,\"b\",\"B\");Y(67,\"c",
    "\",\"C\");Y(68,\"d\",\"D\");Y(69,\"e\",\"E\");Y(70,\"f\",\"F\");Y(71,\"",
    "g\",\"G\");Y(72,\"h\",\"H\");Y(73,\"i\",\"I\");Y(74,\"j\",\"J\");Y(75,",
    "\"k\",\"K\");Y(76,\"l\",\"L\");Y(77,\"m\",\"M\");Y(78,\"n\",\"N\");Y(79",
    ",\"o\",\"O\");Y(80,\"p\",\"P\");Y(81,\"q\",\"Q\");Y(82,\"r\",\"R\");Y(8",
    "3,\"s\",\"S\");Y(84,\"t\",\"T\");Y(85,\"u\",\"U\");Y(86,\"v\",\"V\");Y(",
    "87,\"w\",\"W\");Y(88,\"x\",\"X\");Y(89,\"y\",\"Y\");Y(90,\"z\",\"Z\");v",
    "ar Gb=Y(qa?{c:91,b:91}:pa?{c:224,b:91}:{c:0,b:91});Y(qa?{c:92,b:92}:pa?",
    "{c:224,b:93}:{c:0,b:92});Y(qa?{c:93,b:93}:pa?{c:0,b:0}:{c:93,b:null});",
    "\nY({c:96,b:96},\"0\");Y({c:97,b:97},\"1\");Y({c:98,b:98},\"2\");Y({c:9",
    "9,b:99},\"3\");Y({c:100,b:100},\"4\");Y({c:101,b:101},\"5\");Y({c:102,b",
    ":102},\"6\");Y({c:103,b:103},\"7\");Y({c:104,b:104},\"8\");Y({c:105,b:1",
    "05},\"9\");Y({c:106,b:106},\"*\");Y({c:107,b:107},\"+\");Y({c:109,b:109",
    "},\"-\");Y({c:110,b:110},\".\");Y({c:111,b:111},\"/\");Y(144);Y(112);Y(",
    "113);Y(114);Y(115);Y(116);Y(117);Y(118);Y(119);Y(120);Y(121);Y(122);Y(1",
    "23);Y({c:107,b:187},\"=\",\"+\");Y(108,\",\");Y({c:109,b:189},\"-\",\"_",
    "\");Y(188,\",\",\"<\");Y(190,\".\",\">\");Y(191,\"/\",\"?\");\nY(192,\"",
    "`\",\"~\");Y(219,\"[\",\"{\");Y(220,\"\\\\\",\"|\");Y(221,\"]\",\"}\");",
    "Y({c:59,b:186},\";\",\":\");Y(222,\"'\",'\"');var Z=new X;Z.set(1,Db);Z",
    ".set(2,Eb);Z.set(4,Fb);Z.set(8,Gb);(function(a){var b=new X;p(zb(a),fun",
    "ction(c){b.set(a.get(c).code,c)});return b})(Z);aa(\"_\",function(a){if",
    "(Ba(a)){if(!Ba(a))throw new ka(15,\"Element is not selectable\");var b=",
    "\"selected\",c=a.type&&a.type.toLowerCase();if(\"checkbox\"==c||\"radio",
    "\"==c)b=\"checked\";a=!!a[b]}else a=!1;return a});; return this._.apply",
    "(null,arguments);}.apply({navigator:typeof window!='undefined'?window.n",
    "avigator:null,document:typeof window!='undefined'?window.document:null}",
    ", arguments);}",
    NULL
};

const char* const REMOVE_LOCAL_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){if(null==(b||b).localStorage)throw new d(13,",
    "\"Local storage undefined\");return(new g(b.localStorage)).removeItem(a",
    ")}var k=[\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k",
    "[0]);for(var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!",
    "==h;q?m[n]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return ",
    "this._.apply(null,arguments);}.apply({navigator:typeof window!='undefin",
    "ed'?window.navigator:null,document:typeof window!='undefined'?window.do",
    "cument:null}, arguments);}",
    NULL
};

const char* const REMOVE_SESSION_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){var c=b||b;if(null!=c.sessionStorage&&null!=c",
    ".sessionStorage.clear)c=new g(b.sessionStorage);else throw new d(13,\"S",
    "ession storage undefined\");return c.removeItem(a)}var k=[\"_\"],m=this",
    ";k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n;k.lengt",
    "h&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m",
    "[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._.apply(null,argu",
    "ments);}.apply({navigator:typeof window!='undefined'?window.navigator:n",
    "ull,document:typeof window!='undefined'?window.document:null}, argument",
    "s);}",
    NULL
};

const char* const SET_LOCAL_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a,c){if(null==(b||b).localStorage)throw new d(13",
    ",\"Local storage undefined\");(new g(b.localStorage)).setItem(a,c)}var ",
    "k=[\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);f",
    "or(var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?",
    "m[n]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._",
    ".apply(null,arguments);}.apply({navigator:typeof window!='undefined'?wi",
    "ndow.navigator:null,document:typeof window!='undefined'?window.document",
    ":null}, arguments);}",
    NULL
};

const char* const SET_SESSION_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function e(a,c){this.code=a;t",
    "his.state=f[a]||g;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;e.c=a.p",
    "rototype;e.prototype=new c;e.prototype.constructor=e;e.b=function(c,r,t",
    "){for(var d=Array(arguments.length-2),m=2;m<arguments.length;m++)d[m-2]",
    "=arguments[m];return a.prototype[r].apply(c,d)}})();var g=\"unknown err",
    "or\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]",
    "=g;f[30]=g;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coor",
    "dinates\";f[12]=\"invalid element state\";f[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";\nf[52]=\"invalid selector\";f[17]=\"javascrip",
    "t error\";f[405]=\"unsupported operation\";f[34]=\"move target out of b",
    "ounds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such",
    " frame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sess",
    "ion not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f",
    "[25]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=g;f",
    "[9]=\"unknown command\";e.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function h(a){this.a=a}h.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(d){throw new e(13,d.message",
    ");}};h.prototype.getItem=function(a){return this.a.getItem(a)};h.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};h.prototype.clear=function(){this.a.clear()};h.prototype.size=",
    "function(){return this.a.length};h.prototype.key=function(a){return thi",
    "s.a.key(a)};function k(a,c){var d=b||b;if(null!=d.sessionStorage&&null!",
    "=d.sessionStorage.clear)d=new h(b.sessionStorage);else throw new e(13,",
    "\"Session storage undefined\");d.setItem(a,c)}var l=[\"_\"],n=this;l[0]",
    "in n||!n.execScript||n.execScript(\"var \"+l[0]);for(var p;l.length&&(p",
    "=l.shift());){var q;if(q=!l.length)q=void 0!==k;q?n[p]=k:n=n[p]&&n[p]!=",
    "=Object.prototype[p]?n[p]:n[p]={}};; return this._.apply(null,arguments",
    ");}.apply({navigator:typeof window!='undefined'?window.navigator:null,d",
    "ocument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

}  // namespace atoms
}  // namespace webdriver

