From 9fb195880b3052ab4d6e6c5627f6e20d48b1432a Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Tue, 17 Jul 2012 12:08:04 +0530 Subject: [PATCH 01/24] First cut for webview recording. Added jquery and recorder js. Able to record click on elements and enter text on text boxes. --- recorder/jquery1.7.2.js | 4 ++ recorder/recorder.js | 64 +++++++++++++++++++ recorder/src/org/imaginea/botbot/Command.java | 20 ++++-- .../org/imaginea/botbot/ListenerAdder.java | 8 +++ .../src/org/imaginea/botbot/Recorder.java | 11 ++++ .../org/imaginea/botbot/ServerProperties.java | 4 ++ 6 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 recorder/jquery1.7.2.js create mode 100644 recorder/recorder.js diff --git a/recorder/jquery1.7.2.js b/recorder/jquery1.7.2.js new file mode 100644 index 0000000..93adea1 --- /dev/null +++ b/recorder/jquery1.7.2.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.2 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/recorder/recorder.js b/recorder/recorder.js new file mode 100644 index 0000000..1babf0a --- /dev/null +++ b/recorder/recorder.js @@ -0,0 +1,64 @@ +var botbot = { + + addListener: function() { + window.irecorder.printHtml('adding listener'); + $('body').on('click', function() { + var attrLoc = ['id','class','name','href']; + var typeLoc = ['input','img','a','select']; + var ele = event.target; + var temp = null; + var attrvalue = []; + for (typ in typeLoc) { + if (typeLoc[typ] == $(ele)[0].nodeName.toLowerCase()) { + temp = ele; + attrvalue.push('tag:' + $(ele)[0].nodeName.toLowerCase()); + break; + } + } + for (att in attrLoc) { + if ($(ele).attr(attrLoc[att])) { + attrvalue.push(attrLoc[att] + ':' + $(ele).attr(attrLoc[att])); + } + } + if (attrvalue.length != 0 && (temp === null)) { + temp = ele; + attrvalue.push('tag:' + $(ele)[0].nodeName.toLowerCase()); + } + if ($(ele).text() != '') { + attrvalue.push('text:' + $(ele).text()); + } + + window.irecorder.printHtml('click element value is :- ' + attrvalue.toString()); + window.irecorder.record('clickonelement',attrvalue.toString()); + }); + + $('input[type="password"],input[type="text"]').on('change', function() { + var attrLoc = ['id','class','name','href']; + var typeLoc = ['input','img','a','select']; + var ele = event.target; + var temp = null; + var attrvalue = []; + for (typ in typeLoc) { + if (typeLoc[typ] == $(ele)[0].nodeName.toLowerCase()) { + temp = ele; + attrvalue.push('tag:' + $(ele)[0].nodeName.toLowerCase()); + break; + } + } + for (att in attrLoc) { + if ($(ele).attr(attrLoc[att])) { + attrvalue.push(attrLoc[att] + ':' + $(ele).attr(attrLoc[att])); + } + } + if (attrvalue.length != 0 && (temp === null)) { + temp = ele; + attrvalue.push('tag:' + $(ele)[0].nodeName.toLowerCase()); + } + if ($(ele).val() != '') { + attrvalue.push('value:' + $(ele).val()); + } + window.irecorder.printHtml('text element value is :- ' + attrvalue.toString()); + window.irecorder.record('entertext',attrvalue.toString()); + }); + } +}; \ No newline at end of file diff --git a/recorder/src/org/imaginea/botbot/Command.java b/recorder/src/org/imaginea/botbot/Command.java index a7c37a2..88fc6b9 100644 --- a/recorder/src/org/imaginea/botbot/Command.java +++ b/recorder/src/org/imaginea/botbot/Command.java @@ -38,6 +38,16 @@ public void add(String command, Object view, Object... args) { } } + + public void add(String command, String... args) { + this.userAction = command; + if(args.length==1 && args[0].equals("")){ + this.arguments= new ArrayList(); + } + else{ + this.arguments = new ArrayList(Arrays.asList(args)); + } + } public void add(String command, View view, Object... args) { this.userAction = command; @@ -106,14 +116,16 @@ public void add(String command) { public String toString() { String retText; try { - retText = "command =" + this.userAction + "; view=" + view.toString() - + "; viewClassName=" + this.viewClassName + "; id=" + id + retText = "command =" + this.userAction + ";"; + if(view!=null) retText=retText+"view=" + view.toString(); + retText=retText+ "; viewClassName=" + this.viewClassName + "; id=" + id + "; args[0]=" + arguments.get(0).toString() + "; args[1]=" + arguments.get(1).toString() + "; args[2]=" + arguments.get(2).toString(); } catch (IndexOutOfBoundsException e) { - retText = "command =" + this.userAction + "; view=" + view.toString() - + "; viewClassName=" + this.viewClassName + "; id=" + id + retText = "command =" + this.userAction + ";"; + if(view!=null) retText=retText+"view=" + view.toString(); + retText=retText + "; viewClassName=" + this.viewClassName + "; id=" + id + "; args=" + arguments.toString(); } return retText; diff --git a/recorder/src/org/imaginea/botbot/ListenerAdder.java b/recorder/src/org/imaginea/botbot/ListenerAdder.java index e23886c..75df9c7 100644 --- a/recorder/src/org/imaginea/botbot/ListenerAdder.java +++ b/recorder/src/org/imaginea/botbot/ListenerAdder.java @@ -6,11 +6,14 @@ import java.util.Set; import org.imaginea.botbot.OnClickListenerTest; +import org.imaginea.botbot.webview.EventAdderClient; +import org.imaginea.botbot.webview.RecorderInterface; import android.content.Context; import android.text.InputType; import android.util.Log; import android.view.*; +import android.webkit.WebView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; @@ -106,6 +109,11 @@ public OnItemClickListener containOnItemClickListener(View v) { public void addListeners(View view) { boolean containsClick = containOnClikListener(view); + if(view instanceof WebView){ + ((WebView)view).addJavascriptInterface(new RecorderInterface(), "irecorder"); + ((WebView)view).setWebViewClient(new EventAdderClient()); + return; + } if (containsClick || (view instanceof ImageView)) { processedView.add(view); return; diff --git a/recorder/src/org/imaginea/botbot/Recorder.java b/recorder/src/org/imaginea/botbot/Recorder.java index 678fd4b..c423453 100644 --- a/recorder/src/org/imaginea/botbot/Recorder.java +++ b/recorder/src/org/imaginea/botbot/Recorder.java @@ -114,4 +114,15 @@ public static void record(String userAction, Menu menu) { ct.publish(command); commandList.add(command); } + + + public static void record(String userAction, String... args) { + + Command command = new Command(); + command.add(userAction, args); + + publishCommand(command); + commandList.add(command); + Log.i(LOG_TAG, "command received: " + command.toString()); + } } diff --git a/recorder/src/org/imaginea/botbot/ServerProperties.java b/recorder/src/org/imaginea/botbot/ServerProperties.java index 6db791c..bdf6a27 100644 --- a/recorder/src/org/imaginea/botbot/ServerProperties.java +++ b/recorder/src/org/imaginea/botbot/ServerProperties.java @@ -40,4 +40,8 @@ public ServerProperties() { public static void setResources(Context context){ ServerProperties.resources = context.getResources(); } + + public static Resources getResources(){ + return resources; + } } From caf9886491abe7d8ce8deefc10cc06a6b8b9f916 Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Tue, 17 Jul 2012 12:15:05 +0530 Subject: [PATCH 02/24] Adding the missed webview related files --- .../botbot/webview/EventAdderClient.java | 44 +++++++++++++++++++ .../botbot/webview/RecorderInterface.java | 30 +++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 recorder/src/org/imaginea/botbot/webview/EventAdderClient.java create mode 100644 recorder/src/org/imaginea/botbot/webview/RecorderInterface.java diff --git a/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java b/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java new file mode 100644 index 0000000..34f6d31 --- /dev/null +++ b/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java @@ -0,0 +1,44 @@ +package org.imaginea.botbot.webview; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.imaginea.botbot.ServerProperties; + +import android.content.res.AssetManager; +import android.util.Log; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +public class EventAdderClient extends WebViewClient{ + private String openJs(String fileName) { + String jscontent=""; + try{ + AssetManager assetManager = ServerProperties.getResources().getAssets(); + InputStream inputStream = assetManager.open(fileName); + InputStreamReader isr = new InputStreamReader(inputStream); + BufferedReader br = new BufferedReader(isr); + + String line; + while (( line = br.readLine()) != null) { + jscontent += line; + } + inputStream.close(); + }catch(Exception e){ + Log.e("bot-bot",e.getMessage()); + } + return jscontent; + } + @Override + public void onPageFinished(WebView view, String url) { + view.loadUrl("javascript:"+this.openJs("jquery1.7.2.js")+this.openJs("recorder.js")+"botbot.addListener();"); + view.loadUrl("javascript:window.irecorder.printHtml(document.getElementsByTagName('html')[0].innerHTML);"); + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return false; + } +} diff --git a/recorder/src/org/imaginea/botbot/webview/RecorderInterface.java b/recorder/src/org/imaginea/botbot/webview/RecorderInterface.java new file mode 100644 index 0000000..c24fe6a --- /dev/null +++ b/recorder/src/org/imaginea/botbot/webview/RecorderInterface.java @@ -0,0 +1,30 @@ +package org.imaginea.botbot.webview; + +import org.imaginea.botbot.Recorder; + +import android.util.Log; + +public class RecorderInterface { + String htmlContent=""; + + public void record(String action, String args){ + + Recorder.record(action, args); + } + + public void recorderAdded(){ + Log.i("bot-bot", "recorder integrated"); + } + + public void printHtml(String html){ + Log.i("bot-bot",html); + } + + public void storeHtmlContent(String html){ + this.htmlContent=html; + } + + public boolean searchText(String text){ + return htmlContent.contains(text); + } +} From 32805d26c06112c33c1a4817978b409c79bac51e Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Wed, 18 Jul 2012 12:01:23 +0530 Subject: [PATCH 03/24] Created resources fodler and moved all the files that needs to be kept assets into it. --- recorder/build.xml | 2 +- recorder/{ => resources}/jquery1.7.2.js | 0 recorder/{ => resources}/recorder.js | 0 recorder/{ => resources}/recorder.properties | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename recorder/{ => resources}/jquery1.7.2.js (100%) rename recorder/{ => resources}/recorder.js (100%) rename recorder/{ => resources}/recorder.properties (100%) diff --git a/recorder/build.xml b/recorder/build.xml index 1577f9d..177bb83 100644 --- a/recorder/build.xml +++ b/recorder/build.xml @@ -103,7 +103,7 @@ - + diff --git a/recorder/jquery1.7.2.js b/recorder/resources/jquery1.7.2.js similarity index 100% rename from recorder/jquery1.7.2.js rename to recorder/resources/jquery1.7.2.js diff --git a/recorder/recorder.js b/recorder/resources/recorder.js similarity index 100% rename from recorder/recorder.js rename to recorder/resources/recorder.js diff --git a/recorder/recorder.properties b/recorder/resources/recorder.properties similarity index 100% rename from recorder/recorder.properties rename to recorder/resources/recorder.properties From 22c26f5dc53618f09d7b19fa43f3ca1fb279ee94 Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Tue, 21 Aug 2012 16:20:29 +0530 Subject: [PATCH 04/24] Adding the working code of webview recording. --- recorder/resources/recorder.js | 180 ++++++++++++++---- recorder/src/org/imaginea/botbot/Command.java | 57 ++++-- .../src/org/imaginea/botbot/Recorder.java | 17 +- .../botbot/webview/EventAdderClient.java | 1 - .../botbot/webview/RecorderInterface.java | 15 +- 5 files changed, 188 insertions(+), 82 deletions(-) diff --git a/recorder/resources/recorder.js b/recorder/resources/recorder.js index 1babf0a..2ef63f0 100644 --- a/recorder/resources/recorder.js +++ b/recorder/resources/recorder.js @@ -1,64 +1,170 @@ var botbot = { addListener: function() { - window.irecorder.printHtml('adding listener'); - $('body').on('click', function() { + if(window._botbotEventInitialized){ + return; + } + window._botbotEventInitialized = true; + document.getElementsByTagName('body')[0].addEventListener('click', function() { var attrLoc = ['id','class','name','href']; var typeLoc = ['input','img','a','select']; var ele = event.target; var temp = null; - var attrvalue = []; - for (typ in typeLoc) { - if (typeLoc[typ] == $(ele)[0].nodeName.toLowerCase()) { - temp = ele; - attrvalue.push('tag:' + $(ele)[0].nodeName.toLowerCase()); - break; - } - } - for (att in attrLoc) { - if ($(ele).attr(attrLoc[att])) { - attrvalue.push(attrLoc[att] + ':' + $(ele).attr(attrLoc[att])); - } + var attrvalue = {}; + var data={}; + function getAllValues(){ + var aValues=[]; + for(key in attrvalue){ + aValues.push('"'+key+'='+attrvalue[key]+'"'); + } + data['command']='clickwebelement'; + data['args[0]']=!attrvalue['locator']? '':attrvalue['locator']; + if(attrvalue['index']>0) data['args[1]']=attrvalue['index']; + data['args[0]-data']=aValues; + return JSON.stringify(data); } - if (attrvalue.length != 0 && (temp === null)) { - temp = ele; - attrvalue.push('tag:' + $(ele)[0].nodeName.toLowerCase()); + + function getLocator(){ + var tag = attrvalue['tag']; + var id = !attrvalue['id'] ? '' : attrvalue['id']; + var name = !attrvalue['name'] ? '' : attrvalue['name']; + var cls = !attrvalue['class'] ? '' : attrvalue['class'].replace( /\s/g, '.'); + + var locator = tag + (!cls ? '' : "." + cls) + (!id ? '' : "#" + id) + (!name ? '' : '[name=\'' + name + '\']'); + + return locator; } - if ($(ele).text() != '') { - attrvalue.push('text:' + $(ele).text()); + + function getIndex(locator,ele){ + var elements=$(locator); + for(i in elements){ + if(elements[i]===$(ele)[0]){ + return i; + } + } + return null; } - - window.irecorder.printHtml('click element value is :- ' + attrvalue.toString()); - window.irecorder.record('clickonelement',attrvalue.toString()); - }); - $('input[type="password"],input[type="text"]').on('change', function() { - var attrLoc = ['id','class','name','href']; - var typeLoc = ['input','img','a','select']; - var ele = event.target; - var temp = null; - var attrvalue = []; for (typ in typeLoc) { if (typeLoc[typ] == $(ele)[0].nodeName.toLowerCase()) { temp = ele; - attrvalue.push('tag:' + $(ele)[0].nodeName.toLowerCase()); + attrvalue['tag']= $(ele)[0].nodeName.toLowerCase(); break; } } for (att in attrLoc) { if ($(ele).attr(attrLoc[att])) { - attrvalue.push(attrLoc[att] + ':' + $(ele).attr(attrLoc[att])); + attrvalue[attrLoc[att]] = $(ele).attr(attrLoc[att]); } } if (attrvalue.length != 0 && (temp === null)) { temp = ele; - attrvalue.push('tag:' + $(ele)[0].nodeName.toLowerCase()); + attrvalue['tag'] = $(ele)[0].nodeName.toLowerCase(); } - if ($(ele).val() != '') { - attrvalue.push('value:' + $(ele).val()); + if ($(ele).text() != '') { + attrvalue['text'] = $(ele).text(); + } + var locator=getLocator(); + if(locator!=''){ + attrvalue['locator']=locator; + } + var index=getIndex(locator,ele); + if(index!=null){ + attrvalue['index']=index; } - window.irecorder.printHtml('text element value is :- ' + attrvalue.toString()); - window.irecorder.record('entertext',attrvalue.toString()); - }); + window.irecorder.record(getAllValues()); + + },true); + + var inpList=document.getElementsByTagName('input'); + var inpListLnth=inpList.length; + for (i=0; i0){ + data['args[1]']=attrvalue['index']; + data['args[2]']=getTextValue(ele); + } else{ + data['args[1]']=getTextValue(ele); + } + for(key in attrvalue){ + aValues.push('"'+key+'='+attrvalue[key]+'"'); + } + data['args[0]-data']=aValues; + return JSON.stringify(data); + } + + function getLocator(){ + var tag = attrvalue['tag']; + var id = !attrvalue['id'] ? '' : attrvalue['id']; + var name = !attrvalue['name'] ? '' : attrvalue['name']; + var cls = !attrvalue['class'] ? '' : attrvalue['class'].replace( /\s/g, '.'); + + var locator = tag + (!cls ? '' : "." + cls) + (!id ? '' : "#" + id) + (!name ? '' : '[name=\'' + name + '\']'); + + return locator; + } + + function getTextValue(ele){ + var text=''; + if ($(ele).val() != '') { + text= $(ele).val(); + } + return text; + } + + function getIndex(locator,ele){ + var elements=$(locator); + for(i in elements){ + if(elements[i]===$(ele)[0]){ + return i; + } + } + return null; + } + + for (typ in typeLoc) { + if (typeLoc[typ] == $(ele)[0].nodeName.toLowerCase()) { + temp = ele; + attrvalue['tag']= $(ele)[0].nodeName.toLowerCase(); + break; + } + } + for (att in attrLoc) { + if ($(ele).attr(attrLoc[att])) { + attrvalue[attrLoc[att]] = $(ele).attr(attrLoc[att]); + } + } + if (attrvalue.length != 0 && (temp === null)) { + temp = ele; + attrvalue['tag'] = $(ele)[0].nodeName.toLowerCase(); + } + var locator=getLocator(); + if(locator!=''){ + attrvalue['locator']=locator; + } + var index=getIndex(locator,ele); + if(index!=null){ + attrvalue['index']=index; + } + window.irecorder.record(getAllValues()); + },true); + } + } + window.irecorder.recorderAdded(); + } }; \ No newline at end of file diff --git a/recorder/src/org/imaginea/botbot/Command.java b/recorder/src/org/imaginea/botbot/Command.java index 4897c13..4934649 100644 --- a/recorder/src/org/imaginea/botbot/Command.java +++ b/recorder/src/org/imaginea/botbot/Command.java @@ -4,23 +4,28 @@ import java.util.Arrays; import java.util.List; +import org.json.JSONException; +import org.json.JSONObject; + import android.content.res.Resources.NotFoundException; +import android.util.Log; import android.view.MenuItem; import android.view.View; public class Command { ViewClasses vc = new ViewClasses(); - - public Command() { - - } - - String userAction; + JSONObject json=new JSONObject(); + String userAction=""; Object view; List arguments; int id = 0; String viewClassName = ""; + String commandData = ""; + + public Command() { + } + public void add(String command, Object view, Object... args) { this.userAction = command; this.view = view; @@ -37,7 +42,6 @@ public void add(String command, Object view, Object... args) { arguments.add(0, (String)view); this.userAction="clicktext"; } - } public void add(String command, String... args) { @@ -77,6 +81,7 @@ public void add(String command, View view, Object... args) { if (command.contentEquals("click")) { this.userAction = "clickbyid"; } + } catch (NotFoundException e) { //Escaping in case the rid resource is not found } @@ -100,25 +105,35 @@ private String getStringIdFromResource(View view, int id) } return rid; } + + private void createCommandData(){ + try { + json.put("command", this.userAction); - public String getData() { - String data = ""; - data = data.concat("\"command\":\"" + this.userAction + "\""); - data = data.concat(",\"viewClassName\":\"" + this.viewClassName + "\""); - int i=0; - for (Object args:arguments) { - data = data.concat(",\"args[" + i + "]\":\"" + args + "\""); - i++; + json.put("viewClassName", this.viewClassName); + for (int i = 0; i < arguments.size(); i++) { + json.put("args[" + i + "]", arguments.get(i)); + } + commandData=json.toString(); + commandData = commandData.replace("\"", "\\\""); + + Log.i("bot-bot","command data is:"+commandData); + } catch (JSONException e) { + Log.i("bot-bot", "unable to generate the JSON data in command."); + Log.i("bot-bot", e.getMessage()); } + } - data = data.replace("\"", "\\\""); - data = "{".concat(data).concat("}"); - return data; + public String getData() { + if(commandData.contentEquals("")) createCommandData(); + return commandData; } - public void add(String command) { - this.userAction = command; - this.arguments= new ArrayList(); + public void add(String data) { + this.commandData=data; + Log.i("bot-bot","Web Command data is:"+commandData); + this.commandData = this.commandData.replace("\\\"", ""); + this.commandData = this.commandData.replace("\"", "\\\""); } @Override diff --git a/recorder/src/org/imaginea/botbot/Recorder.java b/recorder/src/org/imaginea/botbot/Recorder.java index 4e0fa7a..bc5bad7 100644 --- a/recorder/src/org/imaginea/botbot/Recorder.java +++ b/recorder/src/org/imaginea/botbot/Recorder.java @@ -112,25 +112,20 @@ public static void record(String userAction, Menu menu) { Command command = new Command(); command.add(userAction); publishCommand(command); - ct.publish(command); commandList.add(command); } - public static void record(String userAction, String... args) { - + public static void record(String userAction, MenuItem item) { Command command = new Command(); - command.add(userAction, args); - + command.add(userAction,item); publishCommand(command); commandList.add(command); - Log.i(LOG_TAG, "command received: " + command.toString()); } - - public static void record(String userAction, MenuItem item) { - Command command = new Command(); - command.add(userAction,item); + + public static void webViewRecord(String data){ + Command command=new Command(); + command.add(data); publishCommand(command); - ct.publish(command); commandList.add(command); } diff --git a/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java b/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java index 34f6d31..491b180 100644 --- a/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java +++ b/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java @@ -33,7 +33,6 @@ private String openJs(String fileName) { @Override public void onPageFinished(WebView view, String url) { view.loadUrl("javascript:"+this.openJs("jquery1.7.2.js")+this.openJs("recorder.js")+"botbot.addListener();"); - view.loadUrl("javascript:window.irecorder.printHtml(document.getElementsByTagName('html')[0].innerHTML);"); } @Override diff --git a/recorder/src/org/imaginea/botbot/webview/RecorderInterface.java b/recorder/src/org/imaginea/botbot/webview/RecorderInterface.java index c24fe6a..0107eda 100644 --- a/recorder/src/org/imaginea/botbot/webview/RecorderInterface.java +++ b/recorder/src/org/imaginea/botbot/webview/RecorderInterface.java @@ -5,26 +5,17 @@ import android.util.Log; public class RecorderInterface { - String htmlContent=""; - public void record(String action, String args){ - - Recorder.record(action, args); + public void record(String data){ + Recorder.webViewRecord(data); } public void recorderAdded(){ - Log.i("bot-bot", "recorder integrated"); + Log.i("bot-bot", "Bot-Bot Recorder integrated"); } public void printHtml(String html){ Log.i("bot-bot",html); } - public void storeHtmlContent(String html){ - this.htmlContent=html; - } - - public boolean searchText(String text){ - return htmlContent.contains(text); - } } From bf1f1c571e1bac093130ce7ff1ac491f67da8c89 Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Fri, 14 Sep 2012 13:10:31 +0530 Subject: [PATCH 05/24] Adding support for webview runner. --- runner/lib/robotium-solo-3.4.1.jar | Bin 0 -> 58041 bytes .../bot-bot-test/assets/jquery1.7.2.js | 2 + .../bot-bot-test/assets/runner.js | 68 ++++++ .../bot-bot-test/assets/testrunner.js | 50 +++++ .../botbot/common/RobotiumBaseClass.java | 4 + .../botbot/keywords/KeywordCaller.java | 1 + .../botbot/keywords/WebViewDefinition.java | 203 ++++++++++++++++++ .../imaginea/botbot/webview/WebViewInfo.java | 32 +++ .../botbot/webview/WebViewRunnerClient.java | 41 ++++ .../webview/WebViewRunnerInterface.java | 53 +++++ .../imaginea/botbot/webview/WebViewUtil.java | 148 +++++++++++++ 11 files changed, 602 insertions(+) create mode 100644 runner/lib/robotium-solo-3.4.1.jar create mode 100644 runner/resources/robotium-files/bot-bot-test/assets/jquery1.7.2.js create mode 100644 runner/resources/robotium-files/bot-bot-test/assets/runner.js create mode 100644 runner/resources/robotium-files/bot-bot-test/assets/testrunner.js create mode 100644 runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java create mode 100644 runner/src/org/imaginea/botbot/webview/WebViewInfo.java create mode 100644 runner/src/org/imaginea/botbot/webview/WebViewRunnerClient.java create mode 100644 runner/src/org/imaginea/botbot/webview/WebViewRunnerInterface.java create mode 100644 runner/src/org/imaginea/botbot/webview/WebViewUtil.java diff --git a/runner/lib/robotium-solo-3.4.1.jar b/runner/lib/robotium-solo-3.4.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..88906845a372b41f752619b7476ac90cf4161b36 GIT binary patch literal 58041 zcmb5V1CS^|vNk%lZQHhOn`dm>GiPkuw$9kLZQHiq*}Hr9-iP>OUq^IzMbwvFSshhb zmHA~UNCSgF0sP~N@qiHgufo3`kbmE@qAG&4l5%473jcyZ07Ub^8F>63fXM%Mpnb|;=ek5yp^X84h#U`1_l7Y_MeCg8aZ3IS~z>CI$KyfkucI3SsOSx zWvi|!Aq%4L(#8iEu*A!vI7DM1nP_Y}2!n_Y5N!m)Yfa6D3>%Y8KIWAj1^NZ}86*=O z1-=gk;+uGQF$n}ntIDX_+U9n@JZ`l=9Gs-q0(deg$CAipO6*02D|1*81?A%k z-%NQ(g^+UJM&$7BQnb-5jYlO6<>h+UN~>37!uX_HW^Z5VuG>**IgspJxLi&xI*a};0#?TMC<+lR-@G#0tXE~Yo0G@_0?*y zn-aW%QD+Yx2zIT7(O(zr)jAV5FXI~D0qQ07Hfa27upgMGF>a(RfD!s&-5sb94bNb{ zABC*kY3X=o79|^Hem*CKRQGk4Q&`>iU5N>T&}18-s-{COX&wh8H)qb9474Sh3y=a?JRIRWHr45 zlfOlqxuuiJPyW<8E$4_ZQe+C|NXMc|IOYjRe9X+_4`P8!T$a#4N|q1Ns4e_P|8INp z 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 NrocvC>m~l({{U@D1_}TG literal 0 HcmV?d00001 diff --git a/runner/resources/robotium-files/bot-bot-test/assets/jquery1.7.2.js b/runner/resources/robotium-files/bot-bot-test/assets/jquery1.7.2.js new file mode 100644 index 0000000..3b8d15d --- /dev/null +++ b/runner/resources/robotium-files/bot-bot-test/assets/jquery1.7.2.js @@ -0,0 +1,2 @@ +/*! jQuery v@1.8.1 jquery.com | jquery.org/license */ +(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.1",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b

a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
t
",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j=0),h[l]&&j.push(k);j.length&&t.push({elem:f,matches:j})}n.length>o&&t.push({elem:this,matches:n.slice(o)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function $(a,b,c,d){c=c||[],b=b||q;var e,f,g,j,k=b.nodeType;if(k!==1&&k!==9)return[];if(!a||typeof a!="string")return c;g=h(b);if(!g&&!d)if(e=L.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&i(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return u.apply(c,t.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&X&&b.getElementsByClassName)return u.apply(c,t.call(b.getElementsByClassName(j),0)),c}return bk(a,b,c,d,g)}function _(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function ba(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bb(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bc(a,b,c,d){var e,g,h,i,j,k,l,m,n,p,r=!c&&b!==q,s=(r?"":"")+a.replace(H,"$1"),u=y[o][s];if(u)return d?0:t.call(u,0);j=a,k=[],m=0,n=f.preFilter,p=f.filter;while(j){if(!e||(g=I.exec(j)))g&&(j=j.slice(g[0].length),h.selector=l),k.push(h=[]),l="",r&&(j=" "+j);e=!1;if(g=J.exec(j))l+=g[0],j=j.slice(g[0].length),e=h.push({part:g.pop().replace(H," "),string:g[0],captures:g});for(i in p)(g=S[i].exec(j))&&(!n[i]||(g=n[i](g,b,c)))&&(l+=g[0],j=j.slice(g[0].length),e=h.push({part:i,string:g.shift(),captures:g}));if(!e)break}return l&&(h.selector=l),d?j.length:j?$.error(a):t.call(y(s,k),0)}function bd(a,b,e,f){var g=b.dir,h=s++;return a||(a=function(a){return a===e}),b.first?function(b){while(b=b[g])if(b.nodeType===1)return a(b)&&b}:f?function(b){while(b=b[g])if(b.nodeType===1&&a(b))return b}:function(b){var e,f=h+"."+c,i=f+"."+d;while(b=b[g])if(b.nodeType===1){if((e=b[o])===i)return b.sizset;if(typeof e=="string"&&e.indexOf(f)===0){if(b.sizset)return b}else{b[o]=i;if(a(b))return b.sizset=!0,b;b.sizset=!1}}}}function be(a,b){return a?function(c){var d=b(c);return d&&a(d===!0?c:d)}:b}function bf(a,b,c){var d,e,g=0;for(;d=a[g];g++)f.relative[d.part]?e=bd(e,f.relative[d.part],b,c):e=be(e,f.filter[d.part].apply(null,d.captures.concat(b,c)));return e}function bg(a){return function(b){var c,d=0;for(;c=a[d];d++)if(c(b))return!0;return!1}}function bh(a,b,c,d){var e=0,f=b.length;for(;e0?i(h,c,g):[]}function bj(a,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s=0,t=a.length,v=S.POS,w=new RegExp("^"+v.source+"(?!"+A+")","i"),x=function(){var a=1,c=arguments.length-2;for(;al){g+=k.slice(l,n.index),l=p,q=[c],J.test(g)&&(m&&(q=m),m=e);if(r=O.test(g))g=g.slice(0,-5).replace(J,"$&*"),l++;n.length>1&&n[0].replace(w,x),m=bi(g,n[1],n[2],q,m,r)}g=""}}o||(g+=k),o=!1}g?J.test(g)?bh(g,m||[c],d,e):$(g,c,d,e?e.concat(m):m):u.apply(d,m)}return t===1?d:$.uniqueSort(d)}function bk(a,b,e,g,h){a=a.replace(H,"$1");var i,k,l,m,n,o,p,q,r,s,v=bc(a,b,h),w=b.nodeType;if(S.POS.test(a))return bj(v,b,e,g);if(g)i=t.call(g,0);else if(v.length===1){if((o=t.call(v[0],0)).length>2&&(p=o[0]).part==="ID"&&w===9&&!h&&f.relative[o[1].part]){b=f.find.ID(p.captures[0].replace(R,""),b,h)[0];if(!b)return e;a=a.slice(o.shift().string.length)}r=(v=N.exec(o[0].string))&&!v.index&&b.parentNode||b,q="";for(n=o.length-1;n>=0;n--){p=o[n],s=p.part,q=p.string+q;if(f.relative[s])break;if(f.order.test(s)){i=f.find[s](p.captures[0].replace(R,""),r,h);if(i==null)continue;a=a.slice(0,a.length-q.length)+q.replace(S[s],""),a||u.apply(e,t.call(i,0));break}}}if(a){k=j(a,b,h),c=k.dirruns++,i==null&&(i=f.find.TAG("*",N.test(a)&&b.parentNode||b));for(n=0;m=i[n];n++)d=k.runs++,k(m)&&e.push(m)}return e}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=a.document,r=q.documentElement,s=0,t=[].slice,u=[].push,v=function(a,b){return a[o]=b||!0,a},w=function(){var a={},b=[];return v(function(c,d){return b.push(c)>f.cacheLength&&delete a[b.shift()],a[c]=d},a)},x=w(),y=w(),z=w(),A="[\\x20\\t\\r\\n\\f]",B="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",C=B.replace("w","w#"),D="([*^$|!~]?=)",E="\\["+A+"*("+B+")"+A+"*(?:"+D+A+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+C+")|)|)"+A+"*\\]",F=":("+B+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+E+")|[^:]|\\\\.)*|.*))\\)|)",G=":(nth|eq|gt|lt|first|last|even|odd)(?:\\(((?:-\\d)?\\d*)\\)|)(?=[^-]|$)",H=new RegExp("^"+A+"+|((?:^|[^\\\\])(?:\\\\.)*)"+A+"+$","g"),I=new RegExp("^"+A+"*,"+A+"*"),J=new RegExp("^"+A+"*([\\x20\\t\\r\\n\\f>+~])"+A+"*"),K=new RegExp(F),L=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,M=/^:not/,N=/[\x20\t\r\n\f]*[+~]/,O=/:not\($/,P=/h\d/i,Q=/input|select|textarea|button/i,R=/\\(?!\\)/g,S={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),NAME:new RegExp("^\\[name=['\"]?("+B+")['\"]?\\]"),TAG:new RegExp("^("+B.replace("w","w*")+")"),ATTR:new RegExp("^"+E),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+A+"*(even|odd|(([+-]|)(\\d*)n|)"+A+"*(?:([+-]|)"+A+"*(\\d+)|))"+A+"*\\)|)","i"),POS:new RegExp(G,"ig"),needsContext:new RegExp("^"+A+"*[>+~]|"+G,"i")},T=function(a){var b=q.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},U=T(function(a){return a.appendChild(q.createComment("")),!a.getElementsByTagName("*").length}),V=T(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),W=T(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),X=T(function(a){return a.innerHTML="",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),Y=T(function(a){a.id=o+0,a.innerHTML="
",r.insertBefore(a,r.firstChild);var b=q.getElementsByName&&q.getElementsByName(o).length===2+q.getElementsByName(o+0).length;return e=!q.getElementById(o),r.removeChild(a),b});try{t.call(r.childNodes,0)[0].nodeType}catch(Z){t=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}$.matches=function(a,b){return $(a,null,null,b)},$.matchesSelector=function(a,b){return $(b,null,null,[a]).length>0},g=$.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=g(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=g(b);return c},h=$.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},i=$.contains=r.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:r.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},$.attr=function(a,b){var c,d=h(a);return d||(b=b.toLowerCase()),f.attrHandle[b]?f.attrHandle[b](a):W||d?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},f=$.selectors={cacheLength:50,createPseudo:v,match:S,order:new RegExp("ID|TAG"+(Y?"|NAME":"")+(X?"|CLASS":"")),attrHandle:V?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:e?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:U?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(R,""),a[3]=(a[4]||a[5]||"").replace(R,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||$.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&$.error(a[0]),a},PSEUDO:function(a,b,c){var d,e;if(S.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(d=a[4])K.test(d)&&(e=bc(d,b,c,!0))&&(e=d.indexOf(")",d.length-e)-d.length)&&(d=d.slice(0,e),a[0]=a[0].slice(0,e)),a[2]=d;return a.slice(0,3)}},filter:{ID:e?function(a){return a=a.replace(R,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(R,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(R,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=x[o][a];return b||(b=x(a,new RegExp("(^|"+A+")"+a+"("+A+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=$.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return $.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=s++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[o]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[o]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e,g=f.pseudos[a]||f.pseudos[a.toLowerCase()];return g||$.error("unsupported pseudo: "+a),g[o]?g(b,c,d):g.length>1?(e=[a,a,"",b],function(a){return g(a,0,e)}):g}},pseudos:{not:v(function(a,b,c){var d=j(a.replace(H,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!f.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:v(function(a){return function(b){return(b.textContent||b.innerText||g(b)).indexOf(a)>-1}}),has:v(function(a){return function(b){return $(a,b).length>0}}),header:function(a){return P.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:_("radio"),checkbox:_("checkbox"),file:_("file"),password:_("password"),image:_("image"),submit:ba("submit"),reset:ba("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return Q.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e",a.querySelectorAll("[selected]").length||e.push("\\["+A+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="

",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+A+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bk=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return u.apply(f,t.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j,k,l,m=d.getAttribute("id"),n=m||o,p=N.test(a)&&d.parentNode||d;m?n=n.replace(c,"\\$&"):d.setAttribute("id",n),j=bc(a,d,h),n="[id='"+n+"']";for(k=0,l=j.length;k0})}(),f.setFilters.nth=f.setFilters.eq,f.filters=f.pseudos,$.attr=p.attr,p.find=$,p.expr=$.selectors,p.expr[":"]=p.expr.pseudos,p.unique=$.uniqueSort,p.text=$.getText,p.isXMLDoc=$.isXML,p.contains=$.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
","
"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{cj=f.href}catch(cy){cj=e.createElement("a"),cj.href="",cj=cj.href}ck=ct.exec(cj.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:cj,isLocal:cn.test(ck[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=""+(c||y),k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,ck[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]==ck[1]&&i[2]==ck[2]&&(i[3]||(i[1]==="http:"?80:443))==(ck[3]||(ck[1]==="http:"?80:443)))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e,f=this.createTween(a,b),g=cQ.exec(b),h=f.cur(),i=+h||0,j=1;if(g){c=+g[2],d=g[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&i){i=p.css(f.elem,a,!0)||c||1;do e=j=j||".5",i=i/j,p.style(f.elem,a,i+d),j=f.cur()/h;while(j!==1&&j!==e)}f.unit=d,f.start=i,f.end=g[1]?i+(g[1]+1)*c:c}return f}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/runner/resources/robotium-files/bot-bot-test/assets/runner.js b/runner/resources/robotium-files/bot-bot-test/assets/runner.js new file mode 100644 index 0000000..7a16be2 --- /dev/null +++ b/runner/resources/robotium-files/bot-bot-test/assets/runner.js @@ -0,0 +1,68 @@ +var botbotrunner = { + + clickwebelement: function(locator,index){ + var temEle=$(locator); + var ele = this.getElement(temEle,index); + console.log("Inside click on element "+locator+" index-"+index); + this.clickonelement(ele,index); + }, + + clickwebtext: function(text,index){ + var temEle = $("*:contains('"+text+"')").filter(function(){return $(this).children().length < 1}); + var ele = this.getElement(temEle,index); + console.log("Inside click on element "+text+" index-"+index); + this.clickonelement(ele,index); + }, + + clickonelement: function(ele,index){ + + if(ele==undefined){ + window.ibotbot.setMessage("Element not available on page"); + }else if(this.isDisplayed(ele)){ + var evnt = document.createEvent('MouseEvents'); + evnt.initEvent( 'click', true, true ); + ele.dispatchEvent(evnt); + window.ibotbot.successfull(); + }else{ + window.ibotbot.setMessage("Element not visible."); + } + }, + + enterwebtext:function (locator, index, text) { + var temEle=$(locator); + var ele = this.getElement(temEle,index); + if (ele == undefined) { + window.ibotbot.setMessage("Element not available on page"); + } else if (this.isDisplayed(ele)) { + $(ele).val(text); + window.ibotbot.successfull(); + } else { + window.ibotbot.setMessage("Element not visible."); + } + }, + + iselementpresent:function(locator,index){ + var temEle=$(locator); + var ele = this.getElement(temEle,index); + if(ele!=undefined) window.ibotbot.elementFound(); + }, + + istextpresent:function(text,index){ + var temEle = $("*:contains('"+text+"')").filter(function(){return $(this).children().length < 1}); + var ele = this.getElement(temEle,index); + if(ele!=undefined) window.ibotbot.elementFound(); + }, + + getElement:function(ele,index){ + var rEle=undefined; + if(ele.length!=0 && index viewInfoList = new ArrayList(); + private WebViewUtil webUtil=new WebViewUtil(); + private int TIMEOUT=30000; + private Activity prevActivity; + + public WebViewDefinition(Prefrences prefrences){ + Object executionContext=prefrences.getExecutionContext(); + if(executionContext instanceof Solo){ + this.solo=(Solo) executionContext; + }else{ + this.solo=null; + } + collectSupportedMethods(this.getClass()); + } + + @Override + public boolean methodSUpported(Command command) { + boolean supported = false; + if (this.solo != null && methodMap.containsKey(command.getName()) && isWebViewAvailable()) { + supported = true; + } + return supported; + } + + @Override + public void execute(Command command) { + invoker(this, command.getName(), Arrays.asList(command.getParameters())); + } + + private boolean isWebViewAvailable(){ + if(prevActivity!=null && prevActivity==solo.getCurrentActivity()) + return true; + + boolean available = false; + final long endTime = SystemClock.uptimeMillis() + 10000; + while((SystemClock.uptimeMillis() < endTime) & !available){ + ArrayList views = solo.getViews(); + prevActivity=solo.getCurrentActivity(); + viewInfoList.clear(); + if (views.size() > 0) { + for (View view : views) { + if (view.getClass().isAssignableFrom(WebView.class)) { + available = true; + WebViewRunnerInterface webIntrfc = new WebViewRunnerInterface(); + WebViewRunnerClient webClient = new WebViewRunnerClient(); + + ((WebView) view).addJavascriptInterface(webIntrfc,"ibotbot"); + ((WebView) view).setWebViewClient(webClient); + ((WebView) view).setWebChromeClient(new WebChromeClient() { + @Override + public boolean onConsoleMessage(ConsoleMessage cm) { + Log.i("bot-bot", cm.message()+ " -- From line " + + cm.lineNumber() + " of " + cm.toString()); + return true; + } + }); + ((WebView) view).reload(); + viewInfoList.add(new WebViewInfo().setView((WebView)view).setRunnerClient(webClient).setRunnerInterface(webIntrfc)); + } + } + } + } + return available; + } + + public void clickwebelement(String locator){ + this.clickwebelement(locator, 0); + } + + public void clickwebtext(String text){ + this.clickwebtext(text, 0); + } + + public void waitforelementpresent(String locator, int index,long timeout){ + final long endTime = SystemClock.uptimeMillis() + timeout; + boolean found = false; + try { + while (SystemClock.uptimeMillis() < endTime) { + for (WebViewInfo viewInfo : viewInfoList) { + found = webUtil.isElementPresent(viewInfo, locator, index); + if (found) + return; + Thread.sleep(200); + } + } + } catch (InterruptedException e) { + } + Assert.assertTrue("Unable to locate element with locator: "+locator+" and index: "+index, found); + } + + public void waitforelementpresent(String locator, int index){ + this.waitforelementpresent(locator, index, TIMEOUT); + } + + public void waitfortextpresent(String text, int index,long timeout){ + final long endTime = SystemClock.uptimeMillis() + timeout; + boolean found = false; + try { + while (SystemClock.uptimeMillis() < endTime) { + for (WebViewInfo viewInfo : viewInfoList) { + found = webUtil.isTextPresent(viewInfo, text, index); + if (found) + return; + Thread.sleep(200); + } + } + } catch (InterruptedException e) { + } + Assert.assertTrue("Unable to locate element with text: "+text+" and index: "+index, found); + } + + public void waitfortextpresent(String locator, int index){ + this.waitfortextpresent(locator, index, TIMEOUT); + } + + + + public void clickwebelement(String locator,int index){ + waitforelementpresent(locator, index); + boolean executed=false; + for (WebViewInfo viewInfo : viewInfoList) { + if(webUtil.isElementPresent(viewInfo, locator, index) && !executed){ + webUtil.clickElement(viewInfo, locator, index); + executed=true; + } + } + String message="Unable to click on web element with locator: "+locator+" and index: "+index+". Element not found or it is not visible."; + Assert.assertTrue(message, executed); + } + + public void clickwebtext(String text,int index){ + waitfortextpresent(text, index); + boolean executed=false; + for (WebViewInfo viewInfo : viewInfoList) { + if(webUtil.isTextPresent(viewInfo, text, index) && !executed){ + webUtil.clickElementBasedOnText(viewInfo, text, index); + executed=true; + } + } + String message="Unable to click on web element with text: "+text+" and index: "+index+". Element not found or it is not visible."; + Assert.assertTrue(message, executed); + } + + public void enterwebtext(String locator,String text){ + this.enterwebtext(locator, 0, text); + } + + public void enterwebtext(String locator,int index,String text){ + waitforelementpresent(locator, index); + boolean executed=false; + for (WebViewInfo viewInfo : viewInfoList) { + if(webUtil.isElementPresent(viewInfo, locator, index) && !executed){ + webUtil.enterText(viewInfo, locator, index, text); + executed=true; + } + String message="Unable to enter text on web element with locator: "+locator+" and index: "+index+". Element not found or it is not visible."; + Assert.assertTrue(message, executed); + } + } + + public void waitForPageToLoad(long timeout){ + final long endTime = SystemClock.uptimeMillis() + timeout; + boolean loaded = false; + try { + while (SystemClock.uptimeMillis() < endTime) { + for (WebViewInfo viewInfo : viewInfoList) { + loaded = viewInfo.getRunnerClient().pageLoaded(); + if (loaded) + return; + Thread.sleep(500); + } + } + } catch (InterruptedException e) { + } + } + +} diff --git a/runner/src/org/imaginea/botbot/webview/WebViewInfo.java b/runner/src/org/imaginea/botbot/webview/WebViewInfo.java new file mode 100644 index 0000000..3695dbc --- /dev/null +++ b/runner/src/org/imaginea/botbot/webview/WebViewInfo.java @@ -0,0 +1,32 @@ +package org.imaginea.botbot.webview; + +import android.webkit.WebView; + +public class WebViewInfo { + private WebView view; + private WebViewRunnerClient runnerClient; + private WebViewRunnerInterface runnerInterface; + + public WebView getView() { + return view; + } + public WebViewInfo setView(WebView view) { + this.view = view; + return this; + } + public WebViewRunnerClient getRunnerClient() { + return runnerClient; + } + public WebViewInfo setRunnerClient(WebViewRunnerClient runnerClient) { + this.runnerClient = runnerClient; + return this; + } + public WebViewRunnerInterface getRunnerInterface() { + return runnerInterface; + } + public WebViewInfo setRunnerInterface(WebViewRunnerInterface runnerInterface) { + this.runnerInterface = runnerInterface; + return this; + } + +} diff --git a/runner/src/org/imaginea/botbot/webview/WebViewRunnerClient.java b/runner/src/org/imaginea/botbot/webview/WebViewRunnerClient.java new file mode 100644 index 0000000..4818e03 --- /dev/null +++ b/runner/src/org/imaginea/botbot/webview/WebViewRunnerClient.java @@ -0,0 +1,41 @@ +package org.imaginea.botbot.webview; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.util.Log; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +public class WebViewRunnerClient extends WebViewClient{ + private WebView cView; + private boolean loaded=false; + + @Override + public void onPageFinished(WebView view, String url) { + this.cView=view; + this.loaded=true; + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return false; + } + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + this.loaded=false; + } + + public WebView getStroedView(){ + return cView; + } + + public boolean pageLoaded(){ + return this.loaded; + } +} diff --git a/runner/src/org/imaginea/botbot/webview/WebViewRunnerInterface.java b/runner/src/org/imaginea/botbot/webview/WebViewRunnerInterface.java new file mode 100644 index 0000000..0f1df0b --- /dev/null +++ b/runner/src/org/imaginea/botbot/webview/WebViewRunnerInterface.java @@ -0,0 +1,53 @@ +package org.imaginea.botbot.webview; + +import junit.framework.Assert; + +public class WebViewRunnerInterface { + private boolean successfull; + private boolean elementFound; + private String message; + + public WebViewRunnerInterface(){ + resetValues(); + } + + private void resetValues(){ + this.successfull=false; + this.elementFound=false; + this.message="No message defined"; + } + + public void assertMethod(String value,String msg){ + Assert.assertTrue(msg, value.contentEquals("true")); + } + + public void successfull(){ + this.successfull=true; + } + + public boolean isSuccessfull(){ + boolean temp=successfull; + resetValues(); + return temp; + } + + public void setMessage(String message){ + this.message=message; + } + + public String getMessage(){ + String temp=this.message; + resetValues(); + return temp; + } + + public void elementFound(){ + this.elementFound=true; + } + + public boolean isElementFound(){ + boolean temp=this.elementFound; + resetValues(); + return temp; + } +} diff --git a/runner/src/org/imaginea/botbot/webview/WebViewUtil.java b/runner/src/org/imaginea/botbot/webview/WebViewUtil.java new file mode 100644 index 0000000..a642cbb --- /dev/null +++ b/runner/src/org/imaginea/botbot/webview/WebViewUtil.java @@ -0,0 +1,148 @@ +package org.imaginea.botbot.webview; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +import junit.framework.Assert; + +import android.content.res.AssetManager; +import android.os.SystemClock; +import android.util.Log; +import android.webkit.WebView; + +public class WebViewUtil { + + private static AssetManager assetManager; + private static String jqueryScript,runnerScript,jsScript; + public static void setAssetManager(AssetManager assetManager){ + WebViewUtil.assetManager=assetManager; + //WebViewUtil.jsScript=getLoadedScripts(); + WebViewUtil.jqueryScript=openJs("jquery1.7.2.js"); + WebViewUtil.runnerScript=openJs("testrunner.js"); + } + + private static String openJs(String fileName) { + String jscontent=""; + try{ + InputStream inputStream = assetManager.open(fileName); + InputStreamReader isr = new InputStreamReader(inputStream); + BufferedReader br = new BufferedReader(isr); + + String line; + while (( line = br.readLine()) != null) { + jscontent += line; + } + inputStream.close(); + }catch(Exception e){ + Log.e("bot-bot",e.getMessage()); + } + return jscontent; + } + + private boolean waitForElement(WebViewRunnerInterface runnerInterface){ + final long endTime = SystemClock.uptimeMillis() + 10000; + boolean found = false; + try { + while (SystemClock.uptimeMillis() < endTime) { + found = runnerInterface.isElementFound(); + if (found) + break; + Thread.sleep(200); + } + } catch (InterruptedException e) { + } + return found; + } + + private boolean waitForCommandSuccess(WebViewRunnerInterface runnerInterface){ + final long endTime = SystemClock.uptimeMillis() + 10000; + boolean found = false; + try { + while (SystemClock.uptimeMillis() < endTime) { + found = runnerInterface.isSuccessfull(); + if (found) + break; + Thread.sleep(200); + } + } catch (InterruptedException e) { + } + return found; + } + + private static String getLoadedScripts(){ + String script=""; + script+=openJs("jquery1.7.2.js"); + script+=openJs("testrunner.js"); + return script; + } + + private void loadScripts(WebView view){ + view.loadUrl("javascript: "+jqueryScript); + view.loadUrl("javascript: "+runnerScript); + } + + public void clickElement(WebViewInfo viewInfo,String locator,int index){ + locator=locator.replace("'", "\""); + WebView view=viewInfo.getView(); + WebViewRunnerInterface runnerInterface=viewInfo.getRunnerInterface(); + loadScripts(view); + String executeScript="javascript:"; + executeScript+=" botbotrunner.clickwebelement('"+locator+"',"+index+");"; + view.loadUrl(executeScript); + + boolean success= waitForCommandSuccess(runnerInterface); + String errorMsg=runnerInterface.getMessage(); + Assert.assertTrue(errorMsg,success ); + } + + public void clickElementBasedOnText(WebViewInfo viewInfo,String text,int index){ + text=text.replace("'", "\""); + WebView view=viewInfo.getView(); + WebViewRunnerInterface runnerInterface=viewInfo.getRunnerInterface(); + loadScripts(view); + String executeScript="javascript:"; + executeScript+=" botbotrunner.clickwebtext('"+text+"',"+index+");"; + view.loadUrl(executeScript); + + boolean success= waitForCommandSuccess(runnerInterface); + String errorMsg=runnerInterface.getMessage(); + Assert.assertTrue(errorMsg,success ); + } + + public void enterText(WebViewInfo viewInfo,String locator,int index,String text){ + locator=locator.replace("'", "\""); + WebView view=viewInfo.getView(); + WebViewRunnerInterface runnerInterface=viewInfo.getRunnerInterface(); + loadScripts(view); + String executeScript="javascript:"; + executeScript+=" botbotrunner.enterwebtext('"+locator+"',"+index+",'"+text+"');"; + view.loadUrl(executeScript); + + boolean success= waitForCommandSuccess(runnerInterface); + String errorMsg=runnerInterface.getMessage(); + Assert.assertTrue(errorMsg,success ); + } + + public boolean isElementPresent(WebViewInfo viewInfo,String locator, int index){ + locator=locator.replace("'", "\""); + WebView view=viewInfo.getView(); + WebViewRunnerInterface runnerInterface=viewInfo.getRunnerInterface(); + loadScripts(view); + String executeScript="javascript:"; + executeScript+=" botbotrunner.iselementpresent('"+locator+"',"+index+");"; + view.loadUrl(executeScript); + return waitForElement(runnerInterface); + } + + public boolean isTextPresent(WebViewInfo viewInfo,String text, int index){ + text=text.replace("'", "\""); + WebView view=viewInfo.getView(); + WebViewRunnerInterface runnerInterface=viewInfo.getRunnerInterface(); + loadScripts(view); + String executeScript="javascript:"; + executeScript+=" botbotrunner.istextpresent('"+text+"',"+index+");"; + view.loadUrl(executeScript); + return waitForElement(runnerInterface); + } +} From 97694662fb58effc79bdfcf193f16df7b1709c08 Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Mon, 17 Sep 2012 11:43:44 +0530 Subject: [PATCH 06/24] Modified recorder to store util class as window element. --- recorder/resources/recorder.js | 269 ++++++++---------- .../org/imaginea/botbot/ListenerAdder.java | 10 + .../botbot/webview/EventAdderClient.java | 4 +- server/src/main/webapp/index.html | 1 + 4 files changed, 127 insertions(+), 157 deletions(-) diff --git a/recorder/resources/recorder.js b/recorder/resources/recorder.js index 2ef63f0..0c819a7 100644 --- a/recorder/resources/recorder.js +++ b/recorder/resources/recorder.js @@ -1,170 +1,127 @@ -var botbot = { - addListener: function() { - if(window._botbotEventInitialized){ - return; - } - window._botbotEventInitialized = true; - document.getElementsByTagName('body')[0].addEventListener('click', function() { - var attrLoc = ['id','class','name','href']; - var typeLoc = ['input','img','a','select']; - var ele = event.target; - var temp = null; - var attrvalue = {}; - var data={}; - function getAllValues(){ - var aValues=[]; - for(key in attrvalue){ - aValues.push('"'+key+'='+attrvalue[key]+'"'); - } - data['command']='clickwebelement'; - data['args[0]']=!attrvalue['locator']? '':attrvalue['locator']; - if(attrvalue['index']>0) data['args[1]']=attrvalue['index']; - data['args[0]-data']=aValues; - return JSON.stringify(data); - } - function getLocator(){ - var tag = attrvalue['tag']; - var id = !attrvalue['id'] ? '' : attrvalue['id']; - var name = !attrvalue['name'] ? '' : attrvalue['name']; - var cls = !attrvalue['class'] ? '' : attrvalue['class'].replace( /\s/g, '.'); +function botbotutil() { + this.attrLoc = ['id', 'class', 'name', 'href']; + this.typeLoc = ['input', 'img', 'a', 'select']; + this.attrvalue = {}; + this.data = {}; - var locator = tag + (!cls ? '' : "." + cls) + (!id ? '' : "#" + id) + (!name ? '' : '[name=\'' + name + '\']'); + this.getCollectedElementInfo = function (ele) { + var aValues = []; + this.getAllLocatorValues(ele); + var temp =this.attrvalue; + this.attrvalue={}; + return temp; + }; - return locator; - } + this.getLocator = function () { + var tag = this.attrvalue['tag']; + var id = !this.attrvalue['id'] ? '' : this.attrvalue['id']; + var name = !this.attrvalue['name'] ? '' : this.attrvalue['name']; + var cls = !this.attrvalue['class'] ? '' : this.attrvalue['class'].replace(/\s/g, '.'); + if (cls != '') this.attrvalue['class'] = cls; - function getIndex(locator,ele){ - var elements=$(locator); - for(i in elements){ - if(elements[i]===$(ele)[0]){ - return i; - } - } - return null; - } + var locator = tag + (!cls ? '' : "." + cls) + (!id ? '' : "#" + id) + (!name ? '' : '[name=\'' + name + '\']'); - for (typ in typeLoc) { - if (typeLoc[typ] == $(ele)[0].nodeName.toLowerCase()) { - temp = ele; - attrvalue['tag']= $(ele)[0].nodeName.toLowerCase(); - break; - } - } - for (att in attrLoc) { - if ($(ele).attr(attrLoc[att])) { - attrvalue[attrLoc[att]] = $(ele).attr(attrLoc[att]); - } + return locator; + }; + + this.getIndex = function (locator, ele) { + var elements = $(locator); + for (i in elements) { + if (elements[i] === $(ele)[0]) { + return i; } - if (attrvalue.length != 0 && (temp === null)) { + } + return null; + }; + + this.getTextValue = function (ele) { + var text = ''; + if ($(ele).val() != '') { + text = $(ele).val(); + } + return text; + }; + + this.getAllLocatorValues = function (ele) { + + for (typ in this.typeLoc) { + if (this.typeLoc[typ] == $(ele)[0].nodeName.toLowerCase()) { temp = ele; - attrvalue['tag'] = $(ele)[0].nodeName.toLowerCase(); + this.attrvalue['tag'] = $(ele)[0].nodeName.toLowerCase(); + break; } - if ($(ele).text() != '') { - attrvalue['text'] = $(ele).text(); + } + for (att in this.attrLoc) { + if ($(ele).attr(this.attrLoc[att])) { + this.attrvalue[this.attrLoc[att]] = $(ele).attr(this.attrLoc[att]); } - var locator=getLocator(); - if(locator!=''){ - attrvalue['locator']=locator; - } - var index=getIndex(locator,ele); - if(index!=null){ - attrvalue['index']=index; + } + if (this.attrvalue.length != 0 && (temp === null)) { + temp = ele; + this.attrvalue['tag'] = $(ele)[0].nodeName.toLowerCase(); + } + if ($(ele).text() != '') { + this.attrvalue['text'] = $(ele).text(); + } + + var locator = this.getLocator(); + if (locator != '') { + this.attrvalue['locator'] = locator; + } + var index = this.getIndex(locator, ele); + if (index != null) { + this.attrvalue['index'] = index; + } + }; +} + +var botbot = { + + addListener:function () { + if (window._botbotEventInitialized) { + return; + } + window._botbotEventInitialized = true; + window._botbotutil=new botbotutil(); + document.getElementsByTagName('body')[0].addEventListener('click', function () { + var ele = event.target; + var aValues = []; + var util = window._botbotutil; + var data = {}; + var attrvalue = util.getCollectedElementInfo(ele); + for (key in attrvalue) { + aValues.push('"' + key + '=' + attrvalue[key] + '"'); } - window.irecorder.record(getAllValues()); - - },true); - - var inpList=document.getElementsByTagName('input'); - var inpListLnth=inpList.length; - for (i=0; i0){ - data['args[1]']=attrvalue['index']; - data['args[2]']=getTextValue(ele); - } else{ - data['args[1]']=getTextValue(ele); - } - for(key in attrvalue){ - aValues.push('"'+key+'='+attrvalue[key]+'"'); - } - data['args[0]-data']=aValues; - return JSON.stringify(data); - } - - function getLocator(){ - var tag = attrvalue['tag']; - var id = !attrvalue['id'] ? '' : attrvalue['id']; - var name = !attrvalue['name'] ? '' : attrvalue['name']; - var cls = !attrvalue['class'] ? '' : attrvalue['class'].replace( /\s/g, '.'); - - var locator = tag + (!cls ? '' : "." + cls) + (!id ? '' : "#" + id) + (!name ? '' : '[name=\'' + name + '\']'); - - return locator; - } - - function getTextValue(ele){ - var text=''; - if ($(ele).val() != '') { - text= $(ele).val(); - } - return text; - } - - function getIndex(locator,ele){ - var elements=$(locator); - for(i in elements){ - if(elements[i]===$(ele)[0]){ - return i; - } - } - return null; - } - - for (typ in typeLoc) { - if (typeLoc[typ] == $(ele)[0].nodeName.toLowerCase()) { - temp = ele; - attrvalue['tag']= $(ele)[0].nodeName.toLowerCase(); - break; - } - } - for (att in attrLoc) { - if ($(ele).attr(attrLoc[att])) { - attrvalue[attrLoc[att]] = $(ele).attr(attrLoc[att]); - } - } - if (attrvalue.length != 0 && (temp === null)) { - temp = ele; - attrvalue['tag'] = $(ele)[0].nodeName.toLowerCase(); - } - var locator=getLocator(); - if(locator!=''){ - attrvalue['locator']=locator; - } - var index=getIndex(locator,ele); - if(index!=null){ - attrvalue['index']=index; - } - window.irecorder.record(getAllValues()); - },true); - } - } - window.irecorder.recorderAdded(); + data['command'] = 'clickwebelement'; + data['args[0]'] = !attrvalue['locator'] ? '' : attrvalue['locator']; + if (attrvalue['index'] > 0) data['args[1]'] = attrvalue['index']; + data['args[0]-data'] = aValues; + window.irecorder.record(JSON.stringify(data)); + }, true); + + + $('input[type="text"], input[type="password"]').on('change', function (e) { + var ele = e.target; + var util = window._botbotutil; + var attrvalue = util.getCollectedElementInfo(ele); + var data = {}; + var aValues = []; + data['command'] = 'enterwebtext'; + data['args[0]'] = !attrvalue['locator'] ? '' : attrvalue['locator']; + if (attrvalue['index'] > 0) { + data['args[1]'] = attrvalue['index']; + data['args[2]'] = util.getTextValue(ele); + } else { + data['args[1]'] = util.getTextValue(ele); + } + for (key in attrvalue) { + aValues.push('"' + key + '=' + attrvalue[key] + '"'); + } + data['args[0]-data'] = aValues; + window.irecorder.record(JSON.stringify(data)); + }); } }; \ No newline at end of file diff --git a/recorder/src/org/imaginea/botbot/ListenerAdder.java b/recorder/src/org/imaginea/botbot/ListenerAdder.java index 75df9c7..2b76e59 100644 --- a/recorder/src/org/imaginea/botbot/ListenerAdder.java +++ b/recorder/src/org/imaginea/botbot/ListenerAdder.java @@ -13,6 +13,8 @@ import android.text.InputType; import android.util.Log; import android.view.*; +import android.webkit.ConsoleMessage; +import android.webkit.WebChromeClient; import android.webkit.WebView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; @@ -112,6 +114,14 @@ public void addListeners(View view) { if(view instanceof WebView){ ((WebView)view).addJavascriptInterface(new RecorderInterface(), "irecorder"); ((WebView)view).setWebViewClient(new EventAdderClient()); + ((WebView)view).setWebChromeClient(new WebChromeClient() { + @Override + public boolean onConsoleMessage(ConsoleMessage cm) { + Log.i("bot-bot", cm.message()+ " -- From line " + + cm.lineNumber() + " of " + cm.toString()); + return true; + } + }); return; } if (containsClick || (view instanceof ImageView)) { diff --git a/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java b/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java index 491b180..2a1e05e 100644 --- a/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java +++ b/recorder/src/org/imaginea/botbot/webview/EventAdderClient.java @@ -32,7 +32,9 @@ private String openJs(String fileName) { } @Override public void onPageFinished(WebView view, String url) { - view.loadUrl("javascript:"+this.openJs("jquery1.7.2.js")+this.openJs("recorder.js")+"botbot.addListener();"); + view.loadUrl("javascript:"+this.openJs("jquery1.7.2.js")); + view.loadUrl("javascript:"+this.openJs("recorder.js")); + view.loadUrl("javascript:"+"botbot.addListener();"); } @Override diff --git a/server/src/main/webapp/index.html b/server/src/main/webapp/index.html index af15f1f..15d2ca2 100644 --- a/server/src/main/webapp/index.html +++ b/server/src/main/webapp/index.html @@ -762,6 +762,7 @@

Records of session: From c19144fdff7a698fcb8c29213f993d86e70ab1f3 Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Mon, 17 Sep 2012 15:26:13 +0530 Subject: [PATCH 07/24] Fixing certain issues --- runner/src/org/imaginea/botbot/common/RobotiumBaseClass.java | 2 +- runner/src/org/imaginea/botbot/webview/WebViewUtil.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/runner/src/org/imaginea/botbot/common/RobotiumBaseClass.java b/runner/src/org/imaginea/botbot/common/RobotiumBaseClass.java index 5af1796..b24fdf7 100644 --- a/runner/src/org/imaginea/botbot/common/RobotiumBaseClass.java +++ b/runner/src/org/imaginea/botbot/common/RobotiumBaseClass.java @@ -53,7 +53,7 @@ protected void setUp() throws Exception { Resources resources =context.getResources(); assetManager = resources.getAssets(); prefrences.setExecutionContext(solo); - WebViewRunnerClient.setAssetManager(assetManager); + WebViewUtil.setAssetManager(assetManager); } @Override diff --git a/runner/src/org/imaginea/botbot/webview/WebViewUtil.java b/runner/src/org/imaginea/botbot/webview/WebViewUtil.java index a642cbb..e05cac6 100644 --- a/runner/src/org/imaginea/botbot/webview/WebViewUtil.java +++ b/runner/src/org/imaginea/botbot/webview/WebViewUtil.java @@ -14,10 +14,9 @@ public class WebViewUtil { private static AssetManager assetManager; - private static String jqueryScript,runnerScript,jsScript; + private static String jqueryScript,runnerScript; public static void setAssetManager(AssetManager assetManager){ WebViewUtil.assetManager=assetManager; - //WebViewUtil.jsScript=getLoadedScripts(); WebViewUtil.jqueryScript=openJs("jquery1.7.2.js"); WebViewUtil.runnerScript=openJs("testrunner.js"); } From 9b55cd951e8e2779efda96b9895fb3ea5cee3b71 Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Thu, 1 Nov 2012 15:49:33 +0530 Subject: [PATCH 08/24] Updated the dex2jar --- recorder/build.xml | 7 +-- recorder/lib/dex2jar-0.0.9.8/epo-debug.jar | Bin 1468402 -> 0 bytes .../lib/dex-translator-0.0.9.8.jar | Bin 71191 -> 0 bytes .../LICENSE.txt | 0 .../NOTICE.txt | 0 .../d2j-apk-sign.bat | 0 .../d2j-apk-sign.sh | 0 .../d2j-asm-verify.bat | 0 .../d2j-asm-verify.sh | 0 .../d2j-dex-asmifier.bat | 0 .../d2j-dex-asmifier.sh | 0 .../d2j-dex-dump.bat | 0 .../d2j-dex-dump.sh | 0 .../d2j-dex2jar.bat | 0 .../d2j-dex2jar.sh | 0 .../d2j-init-deobf.bat | 0 .../d2j-init-deobf.sh | 0 .../lib/dex2jar-0.0.9.9/d2j-jar-access.bat | 23 ++++++++++ .../lib/dex2jar-0.0.9.9/d2j-jar-access.sh | 40 ++++++++++++++++++ .../d2j-jar-remap.bat | 0 .../d2j-jar-remap.sh | 0 .../d2j-jar2dex.bat | 0 .../d2j-jar2dex.sh | 0 .../d2j-jar2jasmin.bat | 0 .../d2j-jar2jasmin.sh | 0 .../d2j-jasmin2jar.bat | 0 .../d2j-jasmin2jar.sh | 0 .../dex-dump.bat | 0 .../dex-dump.sh | 0 .../dex2jar.bat | 0 .../dex2jar.sh | 0 .../lib/asm-LICENSE.txt | 0 .../lib/asm-all-3.3.1.jar | Bin .../lib/commons-cli-1.2.jar | Bin .../lib/commons-io-LICENSE.txt | 0 .../lib/commons-io-NOTICE.txt | 0 .../lib/commons-lite-1.10.jar} | Bin 10017 -> 10017 bytes .../lib/dex-ir-1.7.jar} | Bin 112408 -> 112409 bytes .../lib/dex-reader-1.10.jar} | Bin 109755 -> 109755 bytes .../lib/dex-tools-0.0.0.5.jar} | Bin 58316 -> 64511 bytes .../lib/dex-translator-0.0.9.9.jar | Bin 0 -> 73273 bytes .../lib/dx-NOTICE | 0 .../lib/dx.jar | Bin .../lib/jasmin-p2.5.jar | Bin .../lib/license-jasmin.txt | 0 .../lib/p-rename-1.1.jar} | Bin 40659 -> 40475 bytes .../setclasspath.bat | 0 .../src/org/imaginea/botbot/Convertor.java | 2 +- 48 files changed, 68 insertions(+), 4 deletions(-) delete mode 100644 recorder/lib/dex2jar-0.0.9.8/epo-debug.jar delete mode 100644 recorder/lib/dex2jar-0.0.9.8/lib/dex-translator-0.0.9.8.jar rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/LICENSE.txt (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/NOTICE.txt (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-apk-sign.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-apk-sign.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-asm-verify.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-asm-verify.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-dex-asmifier.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-dex-asmifier.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-dex-dump.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-dex-dump.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-dex2jar.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-dex2jar.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-init-deobf.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-init-deobf.sh (100%) create mode 100644 recorder/lib/dex2jar-0.0.9.9/d2j-jar-access.bat create mode 100755 recorder/lib/dex2jar-0.0.9.9/d2j-jar-access.sh rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-jar-remap.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-jar-remap.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-jar2dex.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-jar2dex.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-jar2jasmin.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-jar2jasmin.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-jasmin2jar.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/d2j-jasmin2jar.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/dex-dump.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/dex-dump.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/dex2jar.bat (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/dex2jar.sh (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/lib/asm-LICENSE.txt (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/lib/asm-all-3.3.1.jar (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/lib/commons-cli-1.2.jar (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/lib/commons-io-LICENSE.txt (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/lib/commons-io-NOTICE.txt (100%) rename recorder/lib/{dex2jar-0.0.9.8/lib/commons-lite-1.9.jar => dex2jar-0.0.9.9/lib/commons-lite-1.10.jar} (75%) rename recorder/lib/{dex2jar-0.0.9.8/lib/dex-ir-1.6.jar => dex2jar-0.0.9.9/lib/dex-ir-1.7.jar} (76%) rename recorder/lib/{dex2jar-0.0.9.8/lib/dex-reader-1.9.jar => dex2jar-0.0.9.9/lib/dex-reader-1.10.jar} (85%) rename recorder/lib/{dex2jar-0.0.9.8/lib/dex-tools-0.0.0.4.jar => dex2jar-0.0.9.9/lib/dex-tools-0.0.0.5.jar} (62%) create mode 100644 recorder/lib/dex2jar-0.0.9.9/lib/dex-translator-0.0.9.9.jar rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/lib/dx-NOTICE (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/lib/dx.jar (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/lib/jasmin-p2.5.jar (100%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/lib/license-jasmin.txt (100%) rename recorder/lib/{dex2jar-0.0.9.8/lib/p-rename-1.0.jar => dex2jar-0.0.9.9/lib/p-rename-1.1.jar} (60%) rename recorder/lib/{dex2jar-0.0.9.8 => dex2jar-0.0.9.9}/setclasspath.bat (100%) diff --git a/recorder/build.xml b/recorder/build.xml index e85e5ed..963caac 100644 --- a/recorder/build.xml +++ b/recorder/build.xml @@ -38,8 +38,8 @@ - - + + @@ -183,8 +183,9 @@ - + + diff --git a/recorder/lib/dex2jar-0.0.9.8/epo-debug.jar b/recorder/lib/dex2jar-0.0.9.8/epo-debug.jar deleted file mode 100644 index ef397dc03a8f4b3830e9e7af97731ec46db3fa90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1468402 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

a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/runner/resources/robotium-files/bot-bot-test/assets/runner.js b/runner/resources/robotium-files/bot-bot-test/assets/runner.js new file mode 100644 index 0000000..f09de5c --- /dev/null +++ b/runner/resources/robotium-files/bot-bot-test/assets/runner.js @@ -0,0 +1,51 @@ +var botbotrunner= { + util:new botbotutil(), + clickonelement: function(locator,index){ + var ele = this.util.getElement(locator,index); + if(ele==undefined){ + window.ibotbot.setMessage("Element not available on page"); + }else if(this.util.isDisplayed(ele)){ + var evnt = document.createEvent('MouseEvents'); + evnt.initEvent( 'click', true, true ); + ele.dispatchEvent(evnt); + }else{ + window.ibotbot.setMessage("Element not visible."); + } + }, + + enterwebtext: function(locator,index,text){ + var ele = this.util.getElement(locator,index); + if(ele==undefined){ + window.ibotbot.setMessage("Element not available on page"); + }else if(this.util.isDisplayed(ele)){ + $(ele).val(text); + window.ibotbot.successfull(); + }else{ + window.ibotbot.setMessage("Element not visible."); + } + }, + + iselementpresent:function(locator,index){ + var ele = this.util.getElement(locator,index); + if(ele!=undefined) window.ibotbot.elementPresent(); + } + + +} + +function botbotutil(){ + +this.getElement=function(locator,index){ + var ele=$(locator); + var rEle=undefined; + if(ele.length!=0 && index Date: Sun, 3 Feb 2013 19:39:03 +0530 Subject: [PATCH 15/24] Doing relaod after adding interface to attache the interface --- .../botbot/keywords/WebViewDefinition.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java b/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java index 99c28ca..5ebfc11 100644 --- a/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java +++ b/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java @@ -9,7 +9,6 @@ import org.imaginea.botbot.common.Prefrences; import org.imaginea.botbot.webview.UIThreadRunnerUtil; import org.imaginea.botbot.webview.UiRunnableListener; -import org.imaginea.botbot.webview.WebViewCommandRunner; import org.imaginea.botbot.webview.WebViewInfo; import org.imaginea.botbot.webview.WebViewRunnerClient; import org.imaginea.botbot.webview.WebViewRunnerInterface; @@ -18,9 +17,6 @@ import android.os.SystemClock; import android.view.View; import android.app.Activity; -import android.util.Log; -import android.webkit.ConsoleMessage; -import android.webkit.WebChromeClient; import android.webkit.WebView; import com.jayway.android.robotium.solo.Solo; @@ -57,6 +53,9 @@ public void execute(Command command) { } private boolean isWebViewAvailable(){ + if(prevActivity!=null && prevActivity==solo.getCurrentActivity()) + return true; + boolean available = false; final long endTime = SystemClock.uptimeMillis() + 10000; while((SystemClock.uptimeMillis() < endTime) & !available){ @@ -66,17 +65,18 @@ private boolean isWebViewAvailable(){ if (views.size() > 0) { for (View view : views) { if (view.getClass().isAssignableFrom(WebView.class)) { + WebView wview=(WebView)view; available = true; WebViewRunnerInterface webIntrfc = new WebViewRunnerInterface(); WebViewRunnerClient webClient = new WebViewRunnerClient((WebView)view); Activity currentActivity=(Activity) view.getContext(); - InitWebView initWebView = new InitWebView((WebView)view, webIntrfc, webClient); + InitWebView initWebView = new InitWebView(wview, webIntrfc, webClient); UIThreadRunnerUtil scriptRunUtil=new UIThreadRunnerUtil(currentActivity,initWebView); scriptRunUtil.startOnUiAndWait(); - viewInfoList.add(new WebViewInfo().setView((WebView)view).setRunnerClient(webClient).setRunnerInterface(webIntrfc)); + viewInfoList.add(new WebViewInfo().setView(wview).setRunnerClient(webClient).setRunnerInterface(webIntrfc)); } } } @@ -222,8 +222,8 @@ public boolean onConsoleMessage(ConsoleMessage cm) { + " of " + cm.toString()); return true; } - }); - view.reload();*/ + });*/ + view.reload(); } } From e74e7c7f32900f818a2e0ee7bcdfa48f4690ba7c Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Thu, 18 Apr 2013 15:02:14 +0530 Subject: [PATCH 16/24] Improved the code to relod view and waitfor activity to load. --- .../bot-bot-test/assets/runner.js | 9 +++++- runner/robo-build.xml | 12 +++---- .../botbot/common/RobotiumBaseClass.java | 1 + .../botbot/keywords/WebViewDefinition.java | 32 ++++++++----------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/runner/resources/robotium-files/bot-bot-test/assets/runner.js b/runner/resources/robotium-files/bot-bot-test/assets/runner.js index 7a16be2..bbf2531 100644 --- a/runner/resources/robotium-files/bot-bot-test/assets/runner.js +++ b/runner/resources/robotium-files/bot-bot-test/assets/runner.js @@ -35,6 +35,7 @@ var botbotrunner = { window.ibotbot.setMessage("Element not available on page"); } else if (this.isDisplayed(ele)) { $(ele).val(text); + this.fireEvent(ele); window.ibotbot.successfull(); } else { window.ibotbot.setMessage("Element not visible."); @@ -63,6 +64,12 @@ var botbotrunner = { isDisplayed:function (ele) { return $(ele).is(':visible'); - } + }, + + fireEvent:function (target) { + var evt = document.createEvent("UIEvent"); + evt.initEvent("keyup", true, true); + target.dispatchEvent(evt); + } } diff --git a/runner/robo-build.xml b/runner/robo-build.xml index 7b08da6..0b2b7c3 100644 --- a/runner/robo-build.xml +++ b/runner/robo-build.xml @@ -77,13 +77,12 @@ - - - - + + + - + @@ -93,7 +92,6 @@ - @@ -102,8 +100,6 @@ - - diff --git a/runner/src/org/imaginea/botbot/common/RobotiumBaseClass.java b/runner/src/org/imaginea/botbot/common/RobotiumBaseClass.java index 80f2c90..0e8956b 100644 --- a/runner/src/org/imaginea/botbot/common/RobotiumBaseClass.java +++ b/runner/src/org/imaginea/botbot/common/RobotiumBaseClass.java @@ -54,6 +54,7 @@ protected void setUp() throws Exception { prefrences.setAssetManager(assetManager); prefrences.setExecutionContext(solo); WebViewUtil.setAssetManager(assetManager); + solo.waitForActivity(solo.getCurrentActivity().getClass().toString()); } @Override diff --git a/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java b/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java index 5ebfc11..0662fa2 100644 --- a/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java +++ b/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java @@ -17,6 +17,7 @@ import android.os.SystemClock; import android.view.View; import android.app.Activity; +import android.content.Intent; import android.webkit.WebView; import com.jayway.android.robotium.solo.Solo; @@ -26,7 +27,7 @@ public class WebViewDefinition extends BaseKeywordDefinitions { private ArrayList viewInfoList = new ArrayList(); private WebViewUtil webUtil=new WebViewUtil(); private int TIMEOUT=30000; - private Activity prevActivity; + private static String prevActivity; public WebViewDefinition(Prefrences prefrences){ Object executionContext=prefrences.getExecutionContext(); @@ -53,14 +54,14 @@ public void execute(Command command) { } private boolean isWebViewAvailable(){ - if(prevActivity!=null && prevActivity==solo.getCurrentActivity()) + if(prevActivity!=null && WebViewDefinition.prevActivity.contentEquals(solo.getCurrentActivity().getClass().toString())) return true; boolean available = false; final long endTime = SystemClock.uptimeMillis() + 10000; while((SystemClock.uptimeMillis() < endTime) & !available){ ArrayList views = solo.getViews(); - prevActivity=solo.getCurrentActivity(); + WebViewDefinition.prevActivity=solo.getCurrentActivity().getClass().toString(); viewInfoList.clear(); if (views.size() > 0) { for (View view : views) { @@ -74,8 +75,9 @@ private boolean isWebViewAvailable(){ InitWebView initWebView = new InitWebView(wview, webIntrfc, webClient); UIThreadRunnerUtil scriptRunUtil=new UIThreadRunnerUtil(currentActivity,initWebView); - scriptRunUtil.startOnUiAndWait(); - + scriptRunUtil.startOnUiAndWait(); + Activity viewActivity= (Activity)wview.getContext(); + solo.waitForActivity(viewActivity.getClass().toString()); viewInfoList.add(new WebViewInfo().setView(wview).setRunnerClient(webClient).setRunnerInterface(webIntrfc)); } } @@ -144,7 +146,7 @@ public void clickwebelement(String locator,int index){ waitforelementpresent(locator, index); boolean executed=false; for (WebViewInfo viewInfo : viewInfoList) { - if(webUtil.isElementPresent(viewInfo, locator, index) && !executed){ + if(!executed){ webUtil.clickElement(viewInfo, locator, index); executed=true; } @@ -157,7 +159,7 @@ public void clickwebtext(String text,int index){ waitfortextpresent(text, index); boolean executed=false; for (WebViewInfo viewInfo : viewInfoList) { - if(webUtil.isTextPresent(viewInfo, text, index) && !executed){ + if(!executed){ webUtil.clickElementBasedOnText(viewInfo, text, index); executed=true; } @@ -174,7 +176,7 @@ public void enterwebtext(String locator,int index,String text){ waitforelementpresent(locator, index); boolean executed=false; for (WebViewInfo viewInfo : viewInfoList) { - if(webUtil.isElementPresent(viewInfo, locator, index) && !executed){ + if(!executed){ webUtil.enterText(viewInfo, locator, index, text); executed=true; } @@ -213,17 +215,11 @@ public InitWebView(WebView view, WebViewRunnerInterface webIntrfc, public void onRunOnUIThread() { view.addJavascriptInterface(webIntrfc, "ibotbot"); - /*view.setWebViewClient(webClient); - view.setWebChromeClient(new WebChromeClient() { - @Override - public boolean onConsoleMessage(ConsoleMessage cm) { - Log.i("bot-bot", - cm.message() + " -- From line " + cm.lineNumber() - + " of " + cm.toString()); - return true; - } - });*/ view.reload(); + Activity act=(Activity)view.getContext(); + Intent intent= act.getIntent(); + act.startActivity(intent); + //view.reload(); } } From c16a2d67a8d60eb61439c3bc950d93fa6ce6e2d1 Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Thu, 18 Apr 2013 15:22:28 +0530 Subject: [PATCH 17/24] Adding info about what each class does --- .../org/imaginea/botbot/keywords/WebViewDefinition.java | 3 +++ .../org/imaginea/botbot/webview/UIThreadRunnerUtil.java | 4 +--- .../org/imaginea/botbot/webview/UiRunnableListener.java | 4 +--- .../org/imaginea/botbot/webview/WebViewCommandRunner.java | 6 +++++- runner/src/org/imaginea/botbot/webview/WebViewInfo.java | 7 ++++++- .../org/imaginea/botbot/webview/WebViewRunnerClient.java | 1 - .../imaginea/botbot/webview/WebViewRunnerInterface.java | 7 ++++++- runner/src/org/imaginea/botbot/webview/WebViewUtil.java | 6 ++++++ 8 files changed, 28 insertions(+), 10 deletions(-) diff --git a/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java b/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java index 0662fa2..16511e5 100644 --- a/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java +++ b/runner/src/org/imaginea/botbot/keywords/WebViewDefinition.java @@ -201,6 +201,9 @@ public void waitForPageToLoad(long timeout){ } } + /** + * Initializes the webview and adds the Javascript interface to the view + */ private class InitWebView implements UiRunnableListener { private WebView view; private WebViewRunnerInterface webIntrfc; diff --git a/runner/src/org/imaginea/botbot/webview/UIThreadRunnerUtil.java b/runner/src/org/imaginea/botbot/webview/UIThreadRunnerUtil.java index 250b604..903c9ce 100644 --- a/runner/src/org/imaginea/botbot/webview/UIThreadRunnerUtil.java +++ b/runner/src/org/imaginea/botbot/webview/UIThreadRunnerUtil.java @@ -3,9 +3,7 @@ import android.app.Activity; /** - * Blocking Runnable executing on UI thread - * - * @author + * Used to execute commands on the UI thread. * */ diff --git a/runner/src/org/imaginea/botbot/webview/UiRunnableListener.java b/runner/src/org/imaginea/botbot/webview/UiRunnableListener.java index d925d3b..140641a 100644 --- a/runner/src/org/imaginea/botbot/webview/UiRunnableListener.java +++ b/runner/src/org/imaginea/botbot/webview/UiRunnableListener.java @@ -1,9 +1,7 @@ package org.imaginea.botbot.webview; /** - * Events for blocking runnable executing on UI thread - * - * @author + * Interface to be used to invoke webview methods on the UI thread * */ public interface UiRunnableListener { diff --git a/runner/src/org/imaginea/botbot/webview/WebViewCommandRunner.java b/runner/src/org/imaginea/botbot/webview/WebViewCommandRunner.java index 2035e2d..bcd3c7c 100644 --- a/runner/src/org/imaginea/botbot/webview/WebViewCommandRunner.java +++ b/runner/src/org/imaginea/botbot/webview/WebViewCommandRunner.java @@ -1,7 +1,11 @@ package org.imaginea.botbot.webview; import android.webkit.WebView; - +/** + * Used to execute java script methods on the webview + * @author Varun Menon + * + */ public class WebViewCommandRunner implements UiRunnableListener{ private WebView view; diff --git a/runner/src/org/imaginea/botbot/webview/WebViewInfo.java b/runner/src/org/imaginea/botbot/webview/WebViewInfo.java index 3695dbc..45f0065 100644 --- a/runner/src/org/imaginea/botbot/webview/WebViewInfo.java +++ b/runner/src/org/imaginea/botbot/webview/WebViewInfo.java @@ -1,7 +1,12 @@ package org.imaginea.botbot.webview; import android.webkit.WebView; - +/** + * Stores the information of a webview + * + * @author Varun Menon + * + */ public class WebViewInfo { private WebView view; private WebViewRunnerClient runnerClient; diff --git a/runner/src/org/imaginea/botbot/webview/WebViewRunnerClient.java b/runner/src/org/imaginea/botbot/webview/WebViewRunnerClient.java index e22c71c..271be87 100644 --- a/runner/src/org/imaginea/botbot/webview/WebViewRunnerClient.java +++ b/runner/src/org/imaginea/botbot/webview/WebViewRunnerClient.java @@ -1,6 +1,5 @@ package org.imaginea.botbot.webview; -import android.graphics.Bitmap; import java.lang.reflect.Field; import java.lang.reflect.Method; diff --git a/runner/src/org/imaginea/botbot/webview/WebViewRunnerInterface.java b/runner/src/org/imaginea/botbot/webview/WebViewRunnerInterface.java index 8336f81..b491b6e 100644 --- a/runner/src/org/imaginea/botbot/webview/WebViewRunnerInterface.java +++ b/runner/src/org/imaginea/botbot/webview/WebViewRunnerInterface.java @@ -1,7 +1,12 @@ package org.imaginea.botbot.webview; import junit.framework.Assert; - +/** + * THe java script interface to be used along with the webview + * + * @author Varun Menon + * + */ public class WebViewRunnerInterface { private boolean successfull; private boolean elementFound; diff --git a/runner/src/org/imaginea/botbot/webview/WebViewUtil.java b/runner/src/org/imaginea/botbot/webview/WebViewUtil.java index 6d3362a..e3c4771 100644 --- a/runner/src/org/imaginea/botbot/webview/WebViewUtil.java +++ b/runner/src/org/imaginea/botbot/webview/WebViewUtil.java @@ -12,6 +12,12 @@ import android.util.Log; import android.webkit.WebView; +/** + * Util class to execute different java script methods for each required user action. + * + * @author Varun Menon + * + */ public class WebViewUtil { private static AssetManager assetManager; From d8e26af692f3fec1a6efa3f8405d4da97d0c0da2 Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Thu, 18 Apr 2013 17:06:02 +0530 Subject: [PATCH 18/24] Removing the unused code from WebViewListener and fixing issue with command class. --- recorder/src/org/imaginea/botbot/Command.java | 14 ++- .../botbot/webview/WebViewListnerAdder.java | 91 ------------------- 2 files changed, 13 insertions(+), 92 deletions(-) diff --git a/recorder/src/org/imaginea/botbot/Command.java b/recorder/src/org/imaginea/botbot/Command.java index 4934649..ccb7bc4 100644 --- a/recorder/src/org/imaginea/botbot/Command.java +++ b/recorder/src/org/imaginea/botbot/Command.java @@ -130,7 +130,19 @@ public String getData() { } public void add(String data) { - this.commandData=data; + try{ + JSONObject testJson= new JSONObject(data); + this.commandData=data; + }catch(JSONException jse){ + json=new JSONObject(); + try{ + json.put("command", data); + }catch(JSONException e){ + Log.i("bot-bot", "unable to generate the JSON data in command."); + Log.i("bot-bot", e.getMessage()); + } + this.commandData=json.toString(); + } Log.i("bot-bot","Web Command data is:"+commandData); this.commandData = this.commandData.replace("\\\"", ""); this.commandData = this.commandData.replace("\"", "\\\""); diff --git a/recorder/src/org/imaginea/botbot/webview/WebViewListnerAdder.java b/recorder/src/org/imaginea/botbot/webview/WebViewListnerAdder.java index d857102..60d34da 100644 --- a/recorder/src/org/imaginea/botbot/webview/WebViewListnerAdder.java +++ b/recorder/src/org/imaginea/botbot/webview/WebViewListnerAdder.java @@ -22,33 +22,6 @@ public void addListner(){ wview.loadUrl("javascript:(function(){if(typeof jQuery=='undefined'){"+this.openJs("jquery1.7.2.js")+"}})();"); wview.loadUrl("javascript:"+this.openJs("recorder.js")); wview.loadUrl("javascript:"+"botbot.addListener();"); - - //Commenting the following code, which was used for Phonegap based apps. - /*if(CordovaWebView.class.isAssignableFrom(wview.getClass())){ - wview.loadUrl("javascript:(function(){if(typeof jQuery=='undefined'){"+this.openJs("jquery1.7.2.js")+"}})();"); - wview.loadUrl("javascript:"+this.openJs("recorder.js")); - wview.loadUrl("javascript:"+"botbot.addListener();"); - //wview.getSettings().setJavaScriptEnabled(true); - CordovaWebViewClient cClient=getCordovaWebViewClient(wview); - CordovaInterface cIntf=getCordovaInterface(cClient); - CordovaWebView cView=getCordovaView(cClient); - if(IceCreamCordovaWebViewClient.class.isAssignableFrom(cClient.getClass())){ - wview.setWebViewClient(new EventAdderICSCorodovaClient(cIntf, cView, cClient)); - }else{ - wview.setWebViewClient(new EventAdderCorodovaClient(cIntf, cView, cClient)); - } - }else{ - wview.setWebViewClient(new EventAdderClient(wview)); - wview.setWebChromeClient(new WebChromeClient() { - @Override - public boolean onConsoleMessage(ConsoleMessage cm) { - Log.i("bot-bot", cm.message()+ " -- From line " - + cm.lineNumber() + " of " + cm.toString()); - return true; - } - }); - }*/ - } private String openJs(String fileName) { @@ -69,68 +42,4 @@ private String openJs(String fileName) { } return jscontent; } - /*private CordovaInterface getCordovaInterface(CordovaWebViewClient client) { - CordovaInterface cInterface = null; - //CordovaWebViewClient client=null; - Class klass = client.getClass(); - // Checking for WebView Class - while (!klass.equals(CordovaWebViewClient.class)) { - klass = klass.getSuperclass(); - } - try { - // Checking for mCallbackProxy - Field cInterfaceField = klass.getDeclaredField("cordova"); - cInterfaceField.setAccessible(true); - cInterface = (CordovaInterface)cInterfaceField.get(client); - - } catch (Exception e) { - Log.i("bot-bot", e.getMessage()); - } - return cInterface; - - } - - private CordovaWebView getCordovaView(CordovaWebViewClient client) { - - CordovaWebView cAppView = null; - // CordovaWebViewClient client=null; - Class klass = client.getClass(); - // Checking for WebView Class - while (!klass.equals(CordovaWebViewClient.class)) { - klass = klass.getSuperclass(); - } - try { - // Checking for mCallbackProxy - - Field cAppViewField = klass.getDeclaredField("appView"); - cAppViewField.setAccessible(true); - cAppView = (CordovaWebView) cAppViewField.get(client); - - } catch (Exception e) { - Log.i("bot-bot", e.getMessage()); - } - return cAppView; - - } - - private CordovaWebViewClient getCordovaWebViewClient(WebView wview) { - - CordovaWebViewClient client = null; - Class klass = wview.getClass(); - // Checking for WebView Class - while (!klass.equals(CordovaWebView.class)) { - klass = klass.getSuperclass(); - } - try { - // Checking for mCallbackProxy - Field f = klass.getDeclaredField("viewClient"); - f.setAccessible(true); - client = (CordovaWebViewClient)f.get(wview); - - } catch (Exception e) { - Log.i("bot-bot", e.getMessage()); - } - return client; - } -*/ } From 9b2c893cc6775c413a4090cfdead21ae0c015417 Mon Sep 17 00:00:00 2001 From: Varun Menon Date: Thu, 18 Apr 2013 17:11:04 +0530 Subject: [PATCH 19/24] reverting the changes done --- default.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/default.properties b/default.properties index c401b98..c92f259 100644 --- a/default.properties +++ b/default.properties @@ -1,8 +1,8 @@ -APP_PACKAGE=com.mkyong.android -DEFAULT_ACTIVITY=MainActivity +APP_PACKAGE=org.wordpress.android +DEFAULT_ACTIVITY=Dashboard FRAMEWORK=robotium -TESTCASE_FOLDER=Webviewtest -TEST_APK_FILENAME=./test_apk/WebAndroidApp.apk +TESTCASE_FOLDER=wordpress +TEST_APK_FILENAME=wordpress.apk ANDROID_VERSION=android-15 key.store=${user.home}/.android/debug.keystore From 4e27062d40f9c750628e6bc1d92583691aabdef3 Mon Sep 17 00:00:00 2001 From: ajay458 Date: Wed, 11 Dec 2013 17:56:08 +0530 Subject: [PATCH 20/24] Update .gitignore --- server/.gitignore | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server/.gitignore b/server/.gitignore index a6f89c2..e0e54f9 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1 +1,8 @@ -/target/ \ No newline at end of file +/target/ +/recorder/robo-bin/ +/runner/bin1/ +/runner/resignapk/ +/runner/robo-bin/ +/runner/resources/ +/runner/staging/ +/runner/test-report/ From 926f1b5cf736ef1f2f5025697e9191b3e554d0e5 Mon Sep 17 00:00:00 2001 From: ajaypasumarthi Date: Wed, 11 Dec 2013 18:06:35 +0530 Subject: [PATCH 21/24] Working changes for bot-bot --- .gitignore | 14 ++++++ build.xml | 2 +- recorder/build.xml | 20 ++++++--- .../imaginea/botbot/CommandTransmitter.java | 19 ++++++-- runner/build.xml | 0 runner/robo-build.xml | 43 ++++++++++++------- 6 files changed, 72 insertions(+), 26 deletions(-) create mode 100644 .gitignore mode change 100644 => 100755 build.xml mode change 100644 => 100755 runner/build.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5bc9bd --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fmodern\fcharset0 Courier;} +{\colortbl;\red255\green255\blue255;\red38\green38\blue38;} +\margl1440\margr1440\vieww10800\viewh8400\viewkind0 +\deftab720 +\pard\pardeftab720\sl360 + +\f0\fs24 \cf2 /recorder/robo-bin/\ +/runner/bin1/\ +/runner/resignapk/\ +/runner/robo-bin/\ +/runner/resources/\ +/runner/staging/\ +/runner/test-report/} \ No newline at end of file diff --git a/build.xml b/build.xml old mode 100644 new mode 100755 index 77da394..6eace7b --- a/build.xml +++ b/build.xml @@ -15,7 +15,7 @@ - + diff --git a/recorder/build.xml b/recorder/build.xml index 963caac..56c83c0 100644 --- a/recorder/build.xml +++ b/recorder/build.xml @@ -36,7 +36,7 @@ - + @@ -46,7 +46,10 @@ - + + + + @@ -103,7 +106,8 @@ - + + @@ -183,9 +187,8 @@ - + - @@ -194,14 +197,17 @@ - + + + + - + diff --git a/recorder/src/org/imaginea/botbot/CommandTransmitter.java b/recorder/src/org/imaginea/botbot/CommandTransmitter.java index cdbc46d..ce3ed39 100644 --- a/recorder/src/org/imaginea/botbot/CommandTransmitter.java +++ b/recorder/src/org/imaginea/botbot/CommandTransmitter.java @@ -195,10 +195,17 @@ String getSession(){ sb.append(line); } rd.close(); + String status=""; String result = sb.toString(); - String status = result.substring( - result.indexOf("") + 8, - result.indexOf("")); + //if(result.indexOf("")>0 && result.indexOf("")>0){ + + status = result.substring( + result.indexOf("") + 8, + result.indexOf("")); + + + //} + if (status.contentEquals("stopped")) { recordID=1; prevRecord=0; @@ -212,6 +219,12 @@ String getSession(){ "Unable to get status of the record. Application will continue without recording"); Log.i("bot-bot","Url is : "+ sUrl + "/api/recordsessions/"+CommandTransmitter.sessionID); Log.i("bot-bot", "Error is: "+e.toString()); + }catch (Exception e) { + Log.i("bot-bot", + "Unable to get status of the record. Application will continue without recording"); + Log.i("bot-bot","Url is : "+ sUrl + "/api/recordsessions/"+CommandTransmitter.sessionID); + Log.i("bot-bot", "Error is: "+e.toString()); + session = CommandTransmitter.sessionID; } } return session; diff --git a/runner/build.xml b/runner/build.xml old mode 100644 new mode 100755 diff --git a/runner/robo-build.xml b/runner/robo-build.xml index 0b2b7c3..529b243 100644 --- a/runner/robo-build.xml +++ b/runner/robo-build.xml @@ -10,17 +10,16 @@ + - - - + - + @@ -33,12 +32,19 @@ - + + + + + - + + + + @@ -77,12 +83,13 @@ - - - + + + + - + @@ -92,6 +99,7 @@ + @@ -100,6 +108,8 @@ + + @@ -122,7 +132,7 @@ - + @@ -177,7 +187,7 @@ - + @@ -215,21 +225,24 @@ - + + + + - + - + From b3715cc0a4399afbcb196c43dd1049095987aef2 Mon Sep 17 00:00:00 2001 From: ajaypasumarthi Date: Thu, 12 Dec 2013 17:03:13 +0530 Subject: [PATCH 22/24] no message --- default.properties | 4 +++- recorder/build.xml | 8 +++++++- runner/robo-build.xml | 10 ++++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/default.properties b/default.properties index c92f259..435475c 100644 --- a/default.properties +++ b/default.properties @@ -3,7 +3,9 @@ DEFAULT_ACTIVITY=Dashboard FRAMEWORK=robotium TESTCASE_FOLDER=wordpress TEST_APK_FILENAME=wordpress.apk -ANDROID_VERSION=android-15 +ANDROID_VERSION=android-19 +VERSION_CODE=19.0.0 +SDK_VERSION=4.3 key.store=${user.home}/.android/debug.keystore key.store.password=android diff --git a/recorder/build.xml b/recorder/build.xml index 56c83c0..f2cd7e0 100644 --- a/recorder/build.xml +++ b/recorder/build.xml @@ -36,7 +36,13 @@ - + + + + + + + diff --git a/runner/robo-build.xml b/runner/robo-build.xml index 529b243..0b6e707 100644 --- a/runner/robo-build.xml +++ b/runner/robo-build.xml @@ -35,8 +35,14 @@ - - + + + + + + + + From ad3df3d7a56dc552057c7582831b9f8b9299833d Mon Sep 17 00:00:00 2001 From: ajaypasumarthi Date: Thu, 12 Dec 2013 17:04:54 +0530 Subject: [PATCH 23/24] Removing unnecessary code --- server/.gitignore | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/server/.gitignore b/server/.gitignore index e0e54f9..a6f89c2 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1,8 +1 @@ -/target/ -/recorder/robo-bin/ -/runner/bin1/ -/runner/resignapk/ -/runner/robo-bin/ -/runner/resources/ -/runner/staging/ -/runner/test-report/ +/target/ \ No newline at end of file From 96a76e5fd3279241e953484c6007ff7aca7867aa Mon Sep 17 00:00:00 2001 From: ajaypasumarthi Date: Fri, 13 Dec 2013 17:35:13 +0530 Subject: [PATCH 24/24] no message --- .gitignore | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index c5bc9bd..523195f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,7 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1265 -{\fonttbl\f0\fmodern\fcharset0 Courier;} -{\colortbl;\red255\green255\blue255;\red38\green38\blue38;} -\margl1440\margr1440\vieww10800\viewh8400\viewkind0 -\deftab720 -\pard\pardeftab720\sl360 - -\f0\fs24 \cf2 /recorder/robo-bin/\ -/runner/bin1/\ -/runner/resignapk/\ -/runner/robo-bin/\ -/runner/resources/\ -/runner/staging/\ -/runner/test-report/} \ No newline at end of file +/recorder/robo-bin/ +/runner/bin1/ +/runner/resignapk/ +/runner/robo-bin/ +/runner/resources/ +/runner/staging/ +/runner/test-report/ \ No newline at end of file