/*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
  
      http://www.apache.org/licenses/LICENSE-2.0
    	  
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
  
*/
var $dhtml=true;var $as3=false;var $js1=true;var $swf7=false;var $swf8=false;var $svg=false;var $as2=false;var $swf9=false;var $profile=false;var $runtime="dhtml";var $swf10=false;var $debug=false;var $j2me=false;try{
if(lz){

}}
catch(e){
lz={}};lz.embed={options:{},swf:function($1,$2){
if($2==null){
$2=8
};var $3=$1.url;var $4=this.__getqueryurl($3);if($1.accessible&&$1.accessible!="false"){
$4.flashvars+="&accessible=true"
};if($1.history){
$4.flashvars+="&history=true"
};if($1.bgcolor!=null){
$4.flashvars+="&bgcolor="+escape($1.bgcolor)
};$4.flashvars+="&width="+escape($1.width);$4.flashvars+="&height="+escape($1.height);$4.flashvars+="&__lzurl="+escape($3);$4.flashvars+="&__lzminimumversion="+escape($2);$4.flashvars+="&id="+escape($1.id);var $3=$4.url+"?"+$4.query;var $5={width:$1.width+"",height:$1.height+"",id:$1.id,bgcolor:$1.bgcolor,wmode:$1.wmode,flashvars:$4.flashvars,allowfullscreen:$1.allowfullscreen,flash8:$3,appenddiv:lz.embed._getAppendDiv($1.id,$1.appenddivid)};if(lz.embed[$1.id]){
alert("Warning: an app with the id: "+$1.id+" already exists.")
};var app=lz.embed[$1.id]=lz.embed.applications[$1.id]={runtime:"swf",_id:$1.id,setCanvasAttribute:lz.embed._setCanvasAttributeSWF,getCanvasAttribute:lz.embed._getCanvasAttributeSWF,callMethod:lz.embed._callMethodSWF,_ready:lz.embed._ready,_onload:[],_getSWFDiv:lz.embed._getSWFDiv,loaded:false,_sendMouseWheel:lz.embed._sendMouseWheel,_sendAllKeysUp:lz.embed._sendAllKeysUpSWF,_setCanvasAttributeDequeue:lz.embed._setCanvasAttributeDequeue,_sendPercLoad:lz.embed._sendPercLoad};if($1.history==false){
lz.embed.history.active=false
};lz.embed.dojo.addLoadedListener(lz.embed._loaded,app);lz.embed.dojo.setSwf($5,$2);if($1.cancelmousewheel!=true&&(lz.embed.browser.OS=="Mac"||($5.wmode=="transparent"||$5.wmode=="opaque")&&lz.embed.browser.OS=="Windows"&&(lz.embed.browser.isOpera||lz.embed.browser.isFirefox))){
if(lz.embed["mousewheel"]){
lz.embed.mousewheel.setCallback(app,"_sendMouseWheel")
}};if(($5.wmode=="transparent"||$5.wmode=="opaque")&&lz.embed.browser.OS=="Windows"&&(lz.embed.browser.isOpera||lz.embed.browser.isFirefox)){
var div=$5.appenddiv;div.onmouseout=function($1){
div.mouseisoutside=true
};div.onmouseover=function($1){
div.mouseisoutside=false
};div._gotmouseup=document.onmouseup=function($1){
if(div.mouseisoutside){
app.callMethod("LzMouseKernel.__mouseUpOutsideHandler()")
}}}},lfc:function($1,$2){
if($2==""){
$2="."
}else{
if(!$2||typeof $2!="string"){
alert("WARNING: lz.embed.lfc() requires a valid serverroot to be specified.");return
}};lz.embed.options.serverroot=$2;if(lz.embed.browser.isIE){
var $3=$2+"lps/includes/excanvas.js";this.__dhtmlLoadScript($3)
};if(lz.embed.browser.isIE&&lz.embed.browser.version<7||lz.embed.browser.isSafari&&lz.embed.browser.version<=419.3){
var $4=$1.indexOf("debug.js")||$1.indexOf("backtrace.js");if($4!=-1){
var $5=$1.substring($4,$1.length-3);$1=$1.substring(0,$4)+$5+"-simple.js"
}};this.__dhtmlLoadScript($1)
},dhtml:function($1){
var $2=this.__getqueryurl($1.url,true);var $3=$2.url+"?lzt=object&"+$2.query;lz.embed.__propcache={bgcolor:$1.bgcolor,width:$1.width.indexOf("%")==-1?$1.width+"px":$1.width,height:$1.height.indexOf("%")==-1?$1.height+"px":$1.height,id:$1.id,appenddiv:lz.embed._getAppendDiv($1.id,$1.appenddivid),url:$3,cancelkeyboardcontrol:$1.cancelkeyboardcontrol,serverroot:$1.serverroot,approot:$1.approot!=null?$1.approot:""};if(lz.embed[$1.id]){
alert("Warning: an app with the id: "+$1.id+" already exists.")
};var $4=lz.embed[$1.id]=lz.embed.applications[$1.id]={runtime:"dhtml",_id:$1.id,_ready:lz.embed._ready,_onload:[],loaded:false,setCanvasAttribute:lz.embed._setCanvasAttributeDHTML,getCanvasAttribute:lz.embed._getCanvasAttributeDHTML,_sendAllKeysUp:lz.embed._sendAllKeysUpDHTML};if($1.history==false){
lz.embed.history.active=false
};this.__dhtmlLoadScript($3);if(lz.embed.browser.OS=="Windows"&&lz.embed.browser.isFirefox){
window.focus()
}},applications:{},__dhtmlLoadScript:function($1){
var $2='<script type="text/javascript" language="JavaScript1.5" src="'+$1+'"></script>';document.writeln($2);return $2
},__dhtmlLoadLibrary:function($1){
var $2=document.createElement("script");this.__setAttr($2,"type","text/javascript");this.__setAttr($2,"src",$1);document.getElementsByTagName("head")[0].appendChild($2);return $2
},__getqueryurl:function($1,$2){
var $3=$1.split("?");$1=$3[0];if($3.length==1){
return {url:$1,flashvars:"",query:""}};var $4=this.__parseQuery($3[1]);var $5="";var $6="";var $7=new RegExp("\\+","g");for(var $8 in $4){
if($8==""||$8==null){
continue
};var $9=$4[$8];if($8=="lzr"||$8=="lzt"||$8=="debug"||$8=="profile"||$8=="lzbacktrace"||$8=="lzconsoledebug"||$8=="lzdebug"||$8=="lzkrank"||$8=="lzprofile"||$8=="lzcopyresources"||$8=="fb"||$8=="sourcelocators"||$8=="_canvas_debug"||$8=="lzsourceannotations"){
$5+=$8+"="+$9+"&"
};if($2){
if(window[$8]==null){
window[$8]=unescape($9.replace($7," "))
}};$6+=$8+"="+$9+"&"
};$5=$5.substr(0,$5.length-1);$6=$6.substr(0,$6.length-1);return {url:$1,flashvars:$6,query:$5}},__parseQuery:function($1){
if($1.indexOf("=")==-1){
return
};var $2=$1.split("&");var $3={};for(var $4=0;$4<$2.length;$4++){
var $5=$2[$4].split("=");if($5.length==1){
continue
};var $6=$5[0];var $7=$5[1];$3[$6]=$7
};return $3
},__setAttr:function($1,$2,$3){
$1.setAttribute($2,$3)
},_setCanvasAttributeSWF:function($1,$2,$3){
if(this.loaded&&lz.embed.dojo.comm[this._id]&&lz.embed.dojo.comm[this._id]["callMethod"]){
if($3){
lz.embed.history._store($1,$2)
}else{
lz.embed.dojo.comm[this._id].setCanvasAttribute($1,$2+"")
}}else{
if(this._setCanvasAttributeQ==null){
this._setCanvasAttributeQ=[[$1,$2,$3]]
}else{
this._setCanvasAttributeQ.push([$1,$2,$3])
}}},_setCanvasAttributeDHTML:function($1,$2,$3){
if($3){
lz.embed.history._store($1,$2)
}else{
if(canvas){
if(!canvas.__LZdeleted){
var $lzsc$102169433="$lzc$set_"+$1;if(Function["$lzsc$isa"]?Function.$lzsc$isa(canvas[$lzsc$102169433]):canvas[$lzsc$102169433] instanceof Function){
canvas[$lzsc$102169433]($2)
}else{
canvas[$1]=$2;var $lzsc$1997357926=canvas["on"+$1];if(LzEvent["$lzsc$isa"]?LzEvent.$lzsc$isa($lzsc$1997357926):$lzsc$1997357926 instanceof LzEvent){
if($lzsc$1997357926.ready){
$lzsc$1997357926.sendEvent($2)
}}}}}}},_loaded:function($1){
if(lz.embed[$1].loaded){
return
};if(lz.embed.dojo.info.commVersion==8){
setTimeout('lz.embed["'+$1+'"]._ready.call(lz.embed["'+$1+'"])',100)
}else{
lz.embed[$1]._ready.call(lz.embed[$1])
}},_setCanvasAttributeDequeue:function(){
while(this._setCanvasAttributeQ.length>0){
var $1=this._setCanvasAttributeQ.pop();this.setCanvasAttribute($1[0],$1[1],$1[2])
}},_ready:function($1){
this.loaded=true;if(this._callmethod){
for(var $2=0;$2<this._callmethod.length;$2++){
this.callMethod(this._callmethod[$2])
};this._callmethod=null
};if(this._setCanvasAttributeQ){
this._setCanvasAttributeDequeue()
};if($1){
this.canvas=$1
};for(var $2=0;$2<this._onload.length;$2++){
var $3=this._onload[$2];if(typeof $3=="function"){
$3(this)
}};if(this.onload&&typeof this.onload=="function"){
this.onload(this)
}},_getCanvasAttributeSWF:function($1){
if(this.loaded){
return lz.embed.dojo.comm[this._id].getCanvasAttribute($1)
}else{
alert("Flash is not ready: getCanvasAttribute"+$1)
}},_getCanvasAttributeDHTML:function($1){
return canvas[$1]
},browser:{init:function(){
if(this.initted){
return
};this.browser=this.searchString(this.dataBrowser)||"An unknown browser";this.version=this.searchVersion(navigator.userAgent)||this.searchVersion(navigator.appVersion)||"an unknown version";this.osversion=this.searchOSVersion(navigator.userAgent)||"an unknown osversion";this.subversion=this.searchSubVersion(navigator.userAgent);this.OS=this.searchString(this.dataOS)||"an unknown OS";this.initted=true;this.isNetscape=this.isSafari=this.isOpera=this.isFirefox=this.isIE=this.isIphone=false;if(this.browser=="Netscape"){
this.isNetscape=true
}else{
if(this.browser=="Safari"){
this.isSafari=true
}else{
if(this.browser=="Opera"){
this.isOpera=true
}else{
if(this.browser=="Firefox"){
this.isFirefox=true
}else{
if(this.browser=="Explorer"){
this.isIE=true
}else{
if(this.browser=="iPhone"){
this.isSafari=true;this.isIphone=true
}}}}}}},searchString:function($1){
for(var $2=0;$2<$1.length;$2++){
var $3=$1[$2].string;var $4=$1[$2].prop;this.versionSearchString=$1[$2].versionSearch||$1[$2].identity;this.osversionSearchString=$1[$2].osversionSearch||"";if($3){
if($3.indexOf($1[$2].subString)!=-1){
return $1[$2].identity
}}else{
if($4){
return $1[$2].identity
}}}},searchVersion:function($1){
var $2=$1.indexOf(this.versionSearchString);if($2==-1){
return
};return parseFloat($1.substring($2+this.versionSearchString.length+1))
},searchSubVersion:function($1){
var $2=new RegExp(this.versionSearchString+".\\d+\\.\\d+\\.([\\d.]+)");var $3=$2.exec($1);if($3&&$3.length>1){
return parseFloat($3[1])
}},searchOSVersion:function($1){
var $2=$1.indexOf(this.osversionSearchString);if($2==-1){
return
};return parseFloat($1.substring($2+this.osversionSearchString.length+1))
},dataBrowser:[{string:navigator.userAgent,subString:"iPhone",identity:"iPhone",versionSearch:"WebKit"},{string:navigator.userAgent,subString:"Chrome",identity:"Chrome"},{string:navigator.userAgent,subString:"OmniWeb",versionSearch:"OmniWeb/",identity:"OmniWeb"},{string:navigator.vendor,subString:"Apple",identity:"Safari",versionSearch:"WebKit"},{prop:window.opera,identity:"Opera"},{string:navigator.vendor,subString:"iCab",identity:"iCab"},{string:navigator.vendor,subString:"KDE",identity:"Konqueror"},{string:navigator.userAgent,subString:"Firefox",identity:"Firefox"},{string:navigator.userAgent,subString:"Iceweasel",versionSearch:"Iceweasel",identity:"Firefox"},{string:navigator.vendor,subString:"Camino",identity:"Camino"},{string:navigator.userAgent,subString:"Netscape",identity:"Netscape"},{string:navigator.userAgent,subString:"MSIE",identity:"Explorer",versionSearch:"MSIE",osversionSearch:"Windows NT"},{string:navigator.userAgent,subString:"Gecko",identity:"Mozilla",versionSearch:"rv"},{string:navigator.userAgent,subString:"Mozilla",identity:"Netscape",versionSearch:"Mozilla"}],dataOS:[{string:navigator.platform,subString:"Win",identity:"Windows"},{string:navigator.platform,subString:"Mac",identity:"Mac"},{string:navigator.userAgent,subString:"iPhone",identity:"iPhone/iPod"},{string:navigator.platform,subString:"Linux",identity:"Linux"}]},_callMethodSWF:function($1){
if(this.loaded){
return lz.embed.dojo.comm[this._id].callMethod($1)
}else{
if(!this._callmethod){
this._callmethod=[]
};this._callmethod.push($1)
}},_broadcastMethod:function($1){
var $2=[].slice.call(arguments,1);for(var $3 in lz.embed.applications){
var $4=lz.embed.applications[$3];if($4[$1]){
$4[$1].apply($4,$2)
}}},setCanvasAttribute:function($1,$2,$3){
lz.embed._broadcastMethod("setCanvasAttribute",$1,$2,$3)
},callMethod:function($1){
lz.embed._broadcastMethod("callMethod",$1)
},_getAppendDiv:function($1,$2){
var $3=$2?$2:$1+"Container";var $4=document.getElementById($3);if(!$4){
document.writeln('<div id="'+$3+'"></div>');$4=document.getElementById($3)
};return $4
},_getSWFDiv:function(){
return lz.embed.dojo.obj[this._id].get()
},_sendMouseWheel:function($1){
if($1!=null){
this.callMethod("lz.Keys.__mousewheelEvent("+$1+")")
}},_gotFocus:function(){
lz.embed._broadcastMethod("_sendAllKeysUp")
},_sendAllKeysUpSWF:function(){
this.callMethod("lz.Keys.__allKeysUp()")
},_sendAllKeysUpDHTML:function(){
if(lz["Keys"]&&lz.Keys["__allKeysUp"]){
lz.Keys.__allKeysUp()
}},_sendPercLoad:function($1){
if(this.onloadstatus&&typeof this.onloadstatus=="function"){
this.onloadstatus($1)
}},attachEventHandler:function($1,$2,callbackscope,callbackname,closure){
if(!(callbackscope&&callbackname&&typeof callbackscope[callbackname]=="function")){
return
};var $3=$1+$2+callbackscope+callbackname;var $4=this._handlers[$3];if($4!=null){
if($4 instanceof Array){
for(var $5=$4.length-1;$5>=0;--$5){
if($4[$5].$e===$1&&$4[$5].$c===callbackscope){
return
}}}else{
if($4.$e===$1&&$4.$c===callbackscope){
return
}}};var $6=function(){
var $1=window.event?[window.event]:[].slice.call(arguments,0);if(closure){
$1.push(closure)
};callbackscope[callbackname].apply(callbackscope,$1)
};$6.$e=$1;$6.$c=callbackscope;if($4!=null){
if($4 instanceof Array){
$4.push($6)
}else{
$4=[$4,$6]
}}else{
$4=$6
};this._handlers[$3]=$4;if($1["addEventListener"]){
$1.addEventListener($2,$6,false);return true
}else{
if($1["attachEvent"]){
return $1.attachEvent("on"+$2,$6)
}}},removeEventHandler:function($1,$2,$3,$4){
var $5=$1+$2+$3+$4;var $6,$7=this._handlers[$5];if($7!=null){
if($7 instanceof Array){
for(var $8=$7.length-1;$8>=0;--$8){
if($7[$8].$e===$1&&$7[$8].$c===$3){
$6=$7[$8];$7.splice($8,1);if($7.length==0){
delete this._handlers[$5]
}}}}else{
if($7.$e===$1&&$7.$c===$3){
$6=$7;delete this._handlers[$5]
}}};if(!$6){
return
};if($1["removeEventListener"]){
$1.removeEventListener($2,$6,false);return true
}else{
if($1["detachEvent"]){
return $1.detachEvent("on"+$2,$6)
}}},_handlers:{},_cleanupHandlers:function(){
lz.embed._handlers={}},getAbsolutePosition:function($1){
var $2=null;var $3={};var $4;if(!(lz.embed.browser.isFirefox&&$1==document.body)&&$1.getBoundingClientRect){
$4=$1.getBoundingClientRect();var $5=document.documentElement.scrollTop||document.body.scrollTop;var $6=document.documentElement.scrollLeft||document.body.scrollLeft;return {x:Math.floor($4.left+$6),y:Math.floor($4.top+$5)}}else{
if(document.getBoxObjectFor){
$4=document.getBoxObjectFor($1);$3={x:$4.x,y:$4.y}}else{
$3={x:$1.offsetLeft,y:$1.offsetTop};$2=$1.offsetParent;if($2!=$1){
while($2){
$3.x+=$2.offsetLeft;$3.y+=$2.offsetTop;$2=$2.offsetParent
}};if(lz.embed.browser.isSafari&&document.defaultView&&document.defaultView.getComputedStyle){
var $7=document.defaultView.getComputedStyle($1,"")
};if(lz.embed.browser.isOpera||lz.embed.browser.isSafari&&$7&&$7["position"]=="absolute"){
$3.y-=document.body.offsetTop
}}};if($1.parentNode){
$2=$1.parentNode
}else{
return $3
};while($2&&$2.tagName!="BODY"&&$2.tagName!="HTML"){
$3.x-=$2.scrollLeft;$3.y-=$2.scrollTop;if($2.parentNode){
$2=$2.parentNode
}else{
return $3
}};return $3
}};lz.embed.browser.init();lz.embed.attachEventHandler(window,"beforeunload",lz.embed,"_cleanupHandlers");lz.embed.attachEventHandler(window,"focus",lz.embed,"_gotFocus");if(lz.embed.browser.isIE){
lz.embed.attachEventHandler(window,"activate",lz.embed,"_gotFocus")
};try{
if(lzOptions){
if(lzOptions.dhtmlKeyboardControl){
alert("WARNING: this page uses lzOptions.dhtmlKeyboardControl.  Please use the cancelkeyboardcontrol embed argument for lz.embed.dhtml() instead.")
};if(lzOptions.ServerRoot){
alert("WARNING: this page uses lzOptions.ServerRoot.  Please use the second argument of lz.embed.lfc() instead.")
}}}
catch(e){

};lz.embed.dojo=function(){

};lz.embed.dojo={defaults:{flash8:null,ready:false,visible:true,width:500,height:400,bgcolor:"#ffffff",allowfullscreen:false,wmode:"window",flashvars:"",minimumVersion:8,id:"flashObject",appenddiv:null},obj:{},comm:{},_loadedListeners:[],_loadedListenerScopes:[],_installingListeners:[],_installingListenerScopes:[],setSwf:function($1,$2){
if($1==null){
return
};var $3={};for(var $4 in this.defaults){
var $5=$1[$4];if($5!=null){
$3[$4]=$5
}else{
$3[$4]=this.defaults[$4]
}};if($2!=null){
this.minimumVersion=$2
};this._initialize($3)
},addLoadedListener:function($1,$2){
this._loadedListeners.push($1);this._loadedListenerScopes.push($2)
},addInstallingListener:function($1,$2){
this._installingListeners.push($1);this._installingListenerScopes.push($2)
},loaded:function($1){
var $2=lz.embed.dojo;if($2._isinstaller){
top.location=top.location+""
};$2.info.installing=false;$2.ready=true;if($2._loadedListeners.length>0){
for(var $3=0;$3<$2._loadedListeners.length;$3++){
var $4=$2._loadedListenerScopes[$3];if($1!=$4._id){
continue
};lz.embed.dojo._loadedListeners[$3].apply($4,[$4._id])
}}},installing:function(){
var $1=lz.embed.dojo;if($1._installingListeners.length>0){
for(var $2=0;$2<$1._installingListeners.length;$2++){
var $3=$1._installingListenerScopes[$2];$1._installingListeners[$2].apply($3,[$3._id])
}}},_initialize:function($1){
var $2=lz.embed.dojo;var $3=new ($2.Install)($1.id);$2.installer=$3;var $4=new ($2.Embed)($1);$2.obj[$1.id]=$4;if($3.needed()==true){
$3.install()
}else{
$4.write($2.info.commVersion);$2.comm[$1.id]=new ($2.Communicator)($1.id)
}}};lz.embed.dojo.Info=function(){
if(lz.embed.browser.isIE){
document.writeln('<script language="VBScript" type="text/vbscript">');document.writeln("Function VBGetSwfVer(i)");document.writeln("  on error resume next");document.writeln("  Dim swControl, swVersion");document.writeln("  swVersion = 0");document.writeln('  set swControl = CreateObject("ShockwaveFlash.ShockwaveFlash." + CStr(i))');document.writeln("  if (IsObject(swControl)) then");document.writeln('    swVersion = swControl.GetVariable("$version")');document.writeln("  end if");document.writeln("  VBGetSwfVer = swVersion");document.writeln("End Function");document.writeln("</script>")
};this._detectVersion();this._detectCommunicationVersion()
};lz.embed.dojo.Info.prototype={version:-1,versionMajor:-1,versionMinor:-1,versionRevision:-1,capable:false,commVersion:8,installing:false,isVersionOrAbove:function($1,$2,$3){
$3=parseFloat("."+$3);if(this.versionMajor>=$1&&this.versionMinor>=$2&&this.versionRevision>=$3){
return true
}else{
return false
}},_detectVersion:function(){
var $1;var $2=lz.embed.browser.isIE;for(var $3=25;$3>0;$3--){
if($2){
$1=VBGetSwfVer($3)
}else{
$1=this._JSFlashInfo($3)
};if($1==-1){
this.capable=false;return
}else{
if($1!=0){
var $4;if($2){
var $5=$1.split(" ");var $6=$5[1];$4=$6.split(",")
}else{
$4=$1.split(".")
};this.versionMajor=$4[0];this.versionMinor=$4[1];this.versionRevision=$4[2];var $7=this.versionMajor+"."+this.versionRevision;this.version=parseFloat($7);this.capable=true;break
}}}},_JSFlashInfo:function($1){
if(navigator.plugins!=null&&navigator.plugins.length>0){
if(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]){
var $2=navigator.plugins["Shockwave Flash 2.0"]?" 2.0":"";var $3=navigator.plugins["Shockwave Flash"+$2].description;var $4=$3.split(" ");var $5=$4[2].split(".");var $6=$5[0];var $7=$5[1];if($4[3]!=""){
var $8=$4[3].split("r")
}else{
var $8=$4[4].split("r")
};var $9=$8[1]>0?$8[1]:0;var $10=$6+"."+$7+"."+$9;return $10
}};return -1
},_detectCommunicationVersion:function(){
if(this.capable==false){
this.commVersion=null;return
}}};lz.embed.dojo.Embed=function($1){
this.properties=$1;if(!this.properties.width){
this.properties.width="100%"
};if(!this.properties.height){
this.properties.height="100%"
};if(!this.properties.bgcolor){
this.properties.bgcolor="#ffffff"
};if(!this.properties.visible){
this.properties.visible=true
}};lz.embed.dojo.Embed.prototype={protocol:function(){
switch(window.location.protocol){
case "https:":
return "https";break;
default:
return "http";break;

}},__getCSSValue:function($1){
if($1&&$1.length&&$1.indexOf("%")!=-1){
return "1px"
}else{
return $1+"px"
}},write:function($1,$2){
var $3="";$3+="width: "+this.__getCSSValue(this.properties.width)+";";$3+="height: "+this.__getCSSValue(this.properties.height)+";";if(this.properties.visible==false){
$3+="position: absolute; ";$3+="z-index: 10000; ";$3+="top: -1000px; ";$3+="left: -1000px; "
};var $4;var $5;var $6=lz.embed;if($1>$6.dojo.version){
$2=true
};$5=this.properties.flash8;var $7=this.properties.flashvars;var $8=this.properties.flashvars;if($2){
var $9=escape(window.location);document.title=document.title.slice(0,47)+" - Flash Player Installation";var $10=escape(document.title);$7+="&MMredirectURL="+$9+"&MMplayerType=ActiveX"+"&MMdoctitle="+$10;$8+="&MMredirectURL="+$9+"&MMplayerType=PlugIn"
};if($6.browser.isIE){
$4='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '+'codebase="'+this.protocol()+"://fpdownload.macromedia.com/pub/shockwave/cabs/flash/"+'swflash.cab#version=8,0,0,0" '+'width="'+this.properties.width+'" '+'height="'+this.properties.height+'" '+'id="'+this.properties.id+'" '+'align="middle"> '+'<param name="allowScriptAccess" value="sameDomain" /> '+'<param name="movie" value="'+$5+'" /> '+'<param name="quality" value="high" /> '+'<param name="FlashVars" value="'+$7+'" /> '+'<param name="bgcolor" value="'+this.properties.bgcolor+'" /> '+'<param name="wmode" value="'+this.properties.wmode+'" /> '+'<param name="allowFullScreen" value="'+this.properties.allowfullscreen+'" /> '+"</object>"
}else{
$4='<embed src="'+$5+'" '+'quality="high" '+'bgcolor="'+this.properties.bgcolor+'" '+'wmode="'+this.properties.wmode+'" '+'allowFullScreen="'+this.properties.allowfullscreen+'" '+'width="'+this.properties.width+'" '+'height="'+this.properties.height+'" '+'id="'+this.properties.id+'" '+'name="'+this.properties.id+'" '+'FlashVars="'+$8+'" '+'swLiveConnect="true" '+'align="middle" '+'allowScriptAccess="sameDomain" '+'type="application/x-shockwave-flash" '+'pluginspage="'+this.protocol()+'://www.macromedia.com/go/getflashplayer" />'
};var $11=this.properties.id+"Container";var $12=this.properties.appenddiv;if($12){
$12.innerHTML=$4;$12.setAttribute("style",$3)
}else{
$4='<div id="'+$11+'" style="'+$3+'"> '+$4+"</div>";document.writeln($4)
}},get:function(){
try{
var $1=document.getElementById(this.properties.id+"")
}
catch(e){

};return $1
},setVisible:function($1){
var $2=document.getElementById(this.properties.id+"Container");if($1==true){
$2.style.visibility="visible"
}else{
$2.style.position="absolute";$2.style.x="-1000px";$2.style.y="-1000px";$2.style.visibility="hidden"
}},center:function(){
var $1=this.properties.width;var $2=this.properties.height;var $3=0;var $4=0;var $5=document.getElementById(this.properties.id+"Container");$5.style.top=$4+"px";$5.style.left=$3+"px"
}};lz.embed.dojo.Communicator=function($1){
this._id=$1
};lz.embed.dojo.Communicator.prototype={_addExternalInterfaceCallback:function(methodName,id){
var dojo=lz.embed.dojo;var $1=function(){
var $1=[];for(var $2=0;$2<arguments.length;$2++){
$1[$2]=arguments[$2]
};$1.length=arguments.length;return dojo.comm[id]._execFlash(methodName,$1,id)
};dojo.comm[id][methodName]=$1
},_encodeData:function($1){
var $2=RegExp("\\&([^;]*)\\;","g");$1=$1.replace($2,"&amp;$1;");$1=$1.replace(RegExp("<","g"),"&lt;");$1=$1.replace(RegExp(">","g"),"&gt;");$1=$1.replace("\\","&custom_backslash;&custom_backslash;");$1=$1.replace(RegExp("\\n","g"),"\\n");$1=$1.replace(RegExp("\\r","g"),"\\r");$1=$1.replace(RegExp("\\f","g"),"\\f");$1=$1.replace(RegExp("\\0","g"),"\\0");$1=$1.replace(RegExp("\\'","g"),"\\'");$1=$1.replace(RegExp('\\"',"g"),'\\"');return $1
},_decodeData:function($1){
if($1==null||typeof $1=="undefined"){
return $1
};$1=$1.replace(RegExp("\\&custom_lt\\;","g"),"<");$1=$1.replace(RegExp("\\&custom_gt\\;","g"),">");$1=eval('"'+$1+'"');return $1
},_chunkArgumentData:function($1,$2,$3){
var $4=lz.embed.dojo.obj[$3].get();var $5=Math.ceil($1.length/1024);for(var $6=0;$6<$5;$6++){
var $7=$6*1024;var $8=$6*1024+1024;if($6==$5-1){
$8=$6*1024+$1.length
};var $9=$1.substring($7,$8);$9=this._encodeData($9);$4.CallFunction('<invoke name="chunkArgumentData" '+'returntype="javascript">'+"<arguments>"+"<string>"+$9+"</string>"+"<number>"+$2+"</number>"+"</arguments>"+"</invoke>")
}},_chunkReturnData:function($1){
var $2=lz.embed.dojo.obj[$1].get();var $3=$2.getReturnLength();var $4=[];for(var $5=0;$5<$3;$5++){
var $6=$2.CallFunction('<invoke name="chunkReturnData" '+'returntype="javascript">'+"<arguments>"+"<number>"+$5+"</number>"+"</arguments>"+"</invoke>");if($6=='""'||$6=="''"){
$6=""
}else{
$6=$6.substring(1,$6.length-1)
};$4.push($6)
};var $7=$4.join("");return $7
},_execFlash:function($1,$2,$3){
var $4=lz.embed.dojo.obj[$3].get();$4.startExec();$4.setNumberArguments($2.length);for(var $5=0;$5<$2.length;$5++){
this._chunkArgumentData($2[$5],$5,$3)
};$4.exec($1);var $6=this._chunkReturnData($3);$6=this._decodeData($6);$4.endExec();return $6
}};lz.embed.dojo.Install=function($1){
this._id=$1
};lz.embed.dojo.Install.prototype={needed:function(){
var $1=lz.embed.dojo;if($1.info.capable==false){
return true
};if(lz.embed.browser.isSafari==true&&!$1.info.isVersionOrAbove(8,0,0)){
return true
};if($1.minimumVersion>$1.info.versionMajor){
return true
};if(!$1.info.isVersionOrAbove(8,0,0)){
return true
};return false
},install:function(){
var $1=lz.embed.dojo;$1.info.installing=true;$1.installing();var $2=$1.obj[this._id].properties;var $3=$2.flash8;var $4=$3.indexOf("swf7");if($4!=-1){
$1._tempurl=$3;$3=$3.substring(0,$4+3)+"8"+$3.substring($4+4,$3.length);$2.flash8=$3
};var $4=$3.indexOf("swf9");if($4!=-1){
$1._tempurl=$3;$3=$3.substring(0,$4+3)+"8"+$3.substring($4+4,$3.length);$2.flash8=$3
};$1.ready=false;if($1.info.capable==false){
$1._isinstaller=true;var $5=new ($1.Embed)($2);$5.write($1.minimumVersion)
}else{
if($1.info.isVersionOrAbove(6,0,65)){
var $5=new ($1.Embed)($2);$5.write($1.minimumVersion,true);$5.setVisible(true);$5.center()
}else{
alert("This content requires a more recent version of the Macromedia "+" Flash Player.");window.location="http://www.macromedia.com/go/getflashplayer"
}}},_onInstallStatus:function($1){
if($1=="Download.Complete"){
if(lz.embed.browser.isIE){
top.location=top.location+""
}}else{
if($1=="Download.Cancelled"){
alert("This content requires a more recent version of the Macromedia "+" Flash Player.");window.location="http://www.macromedia.com/go/getflashplayer"
}else{
if($1=="Download.Failed"){
alert("There was an error downloading the Flash Player update. "+"Please try again later, or visit macromedia.com to download "+"the latest version of the Flash plugin.");window.location="http://www.macromedia.com/go/getflashplayer"
}}}}};lz.embed.dojo.info=new (lz.embed.dojo.Info)();lz.embed.iframemanager={__counter:0,__frames:{},__namebyid:{},__loading:{},__callqueue:{},__calljsqueue:{},__sendmouseevents:{},__hidenativecontextmenu:{},__selectionbookmarks:{},create:function($1,$2,$3,$4,$5,$6){
var $7="__lz"+lz.embed.iframemanager.__counter++;var $8='javascript:""';var $9='lz.embed.iframemanager.__gotload("'+$7+'")';if($2==null||$2=="null"||$2==""){
$2=$7
};lz.embed.iframemanager.__namebyid[$7]=$2;if($4==null||$4=="undefined"){
$4=document.body
};if(document.all){
var $10="<iframe name='"+$2+"' id='"+$7+"' src='"+$8+"' onload='"+$9+"' frameBorder='0'";if($3!=true){
$10+=" scrolling='no'"
};$10+="></iframe>";var $11=document.createElement("div");lz.embed.__setAttr($11,"id",$7+"Container");$4.appendChild($11);$11.innerHTML=$10;var $12=document.getElementById($7)
}else{
var $12=document.createElement("iframe");lz.embed.__setAttr($12,"name",$2);lz.embed.__setAttr($12,"src",$8);lz.embed.__setAttr($12,"id",$7);lz.embed.__setAttr($12,"onload",$9);if($3!=true){
lz.embed.__setAttr($12,"scrolling","no")
};this.appendTo($12,$4)
};if($12){
this.__finishCreate($7,$1,$2,$3,$4,$5,$6)
}else{
this.__callqueue[$7]=[["__finishCreate",$7,$1,$2,$3,$4,$5,$6]];setTimeout('lz.embed.iframemanager.__checkiframe("'+$7+'")',10)
};return $7+""
},__checkiframe:function($1){
var $2=document.getElementById($1);if($2){
var $3=lz.embed.iframemanager.__callqueue[$1];delete lz.embed.iframemanager.__callqueue[$1];lz.embed.iframemanager.__playQueue($3)
}else{
setTimeout('lz.embed.iframemanager.__checkiframe("'+$1+'")',10)
}},__playQueue:function($1){
var $2=lz.embed.iframemanager;for(var $3=0;$3<$1.length;$3++){
var $4=$1[$3];var $5=$4.splice(0,1);$2[$5].apply($2,$4)
}},__finishCreate:function($1,$2,$3,$4,$5,$6,$7){
var $8=document.getElementById($1);if(typeof $2=="string"){
$8.appcontainer=lz.embed.applications[$2]._getSWFDiv()
};$8.owner=$2;lz.embed.iframemanager.__frames[$1]=$8;this.__namebyid[$1]=$3;var $9=lz.embed.iframemanager.getFrame($1);$9.__gotload=lz.embed.iframemanager.__gotload;$9._defaultz=$6?$6:99900;this.setZ($1,$9._defaultz);lz.embed.iframemanager.__topiframe=$1;if(document.getElementById&&!document.all){
$9.style.border="0"
}else{
if(document.all){
lz.embed.__setAttr($9,"allowtransparency","true");var $10=lz.embed[$9.owner];if($10&&$10.runtime=="swf"){
var $11=$10._getSWFDiv();$11.onfocus=lz.embed.iframemanager.__refresh
}}};$9.style.position="absolute"
},appendTo:function($1,$2){
if($2.__appended==$2){
return
};if($1.__appended){
old=$1.__appended.removeChild($1);$2.appendChild(old)
}else{
$2.appendChild($1)
};$1.__appended=$2
},getFrame:function($1){
return lz.embed.iframemanager.__frames[$1]
},getFrameWindow:function($1){
if(!this["framesColl"]){
if(document.frames){
this.framesColl=document.frames
}else{
this.framesColl=window.frames
}};return this.framesColl[$1]
},setSrc:function($1,$2,$3){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["setSrc",$1,$2,$3]);return
};this.__setSendMouseEvents($1,false);if($3){
var $4=lz.embed.iframemanager.getFrame($1);if(!$4){
return
};lz.embed.__setAttr($4,"src",$2)
}else{
var $1=lz.embed.iframemanager.__namebyid[$1];var $4=window[$1];if(!$4){
return
};$4.location.replace($2)
};this.__loading[$1]=true
},setPosition:function($1,$2,$3,$4,$5,$6,$7){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["setPosition",$1,$2,$3,$4,$5,$6,$7]);return
};var $8=lz.embed.iframemanager.getFrame($1);if(!$8){
return
};if($8.appcontainer){
var $9=lz.embed.getAbsolutePosition($8.appcontainer)
}else{
var $9={x:0,y:0}};if($2!=null&&!isNaN($2)){
$8.style.left=$2+$9.x+"px"
};if($3!=null&&!isNaN($3)){
$8.style.top=$3+$9.y+"px"
};if($4!=null&&!isNaN($4)){
$8.style.width=$4+"px"
};if($5!=null&&!isNaN($5)){
$8.style.height=$5+"px"
};if($6!=null){
if(typeof $6=="string"){
$6=$6=="true"
};$8.style.display=$6?"block":"none"
};if($7!=null){
this.setZ($1,$7+$8._defaultz)
}},setVisible:function($1,$2){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["setVisible",$1,$2]);return
};if(typeof $2=="string"){
$2=$2=="true"
};var $3=lz.embed.iframemanager.getFrame($1);if(!$3){
return
};$3.style.display=$2?"block":"none"
},bringToFront:function($1){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["bringToFront",$1]);return
};var $2=lz.embed.iframemanager.getFrame($1);if(!$2){
return
};$2._defaultz=100000;this.setZ($1,$2._defaultz);lz.embed.iframemanager.__topiframe=$1
},sendToBack:function($1){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["sendToBack",$1]);return
};var $2=lz.embed.iframemanager.getFrame($1);if(!$2){
return
};$2._defaultz=99900;this.setZ($1,$2._defaultz)
},__gotload:function($1){
var $2=lz.embed.iframemanager.getFrame($1);if(!$2){
return
};if($2.owner&&$2.owner.__gotload){
$2.owner.__gotload()
}else{
lz.embed[$2.owner].callMethod("lz.embed.iframemanager.__gotload('"+$1+"')")
};this.__loading[$1]=false;if(this.__sendmouseevents[$1]){
this.__setSendMouseEvents($1,true)
};if(this.__calljsqueue[$1]){
this.__playQueue(this.__calljsqueue[$1]);delete this.__calljsqueue[$1]
}},__refresh:function(){
if(lz.embed.iframemanager.__topiframe){
var $1=lz.embed.iframemanager.getFrame(lz.embed.iframemanager.__topiframe);if($1.style.display=="block"){
$1.style.display="none";$1.style.display="block"
}}},setZ:function($1,$2){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["setZ",$1,$2]);return
};var $3=lz.embed.iframemanager.getFrame($1);if(!$3){
return
};$3.style.zIndex=$2
},scrollBy:function($1,$2,$3){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["scrollBy",$1,$2,$3]);return
};var $1=lz.embed.iframemanager.__namebyid[$1];var $4=window.frames[$1];if(!$4){
return
};$4.scrollBy($2,$3)
},__destroy:function($1){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["__destroy",$1]);return
};var $2=lz.embed.iframemanager.__frames[$1];if($2){
this.__setSendMouseEvents($1,false);$2.owner=null;$2.appcontainer=null;LzSprite.prototype.__discardElement($2);delete lz.embed.iframemanager.__frames[$1];delete lz.embed.iframemanager.__namebyid[$1]
}},callJavascript:function($1,$2,$3,$4){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["callJavascript",$1,$2,$3,$4]);return
};if(this.__loading[$1]){
if(!this.__calljsqueue[$1]){
this.__calljsqueue[$1]=[]
};this.__calljsqueue[$1].push(["callJavascript",$1,$2,$3,$4]);return
};var $5=lz.embed.iframemanager.getFrameWindow($1);if(!$4){
$4=[]
};try{
var $6=$5.eval($2);if($6){
var $7=$6.apply($5,$4);if($3){
$3.execute($7)
};return $7
}}
catch(e){

}},__globalMouseover:function($1,$2){
var $3=lz.embed.iframemanager.getFrame($2);if(!$3){
return
};$1=window.event;if($3.owner&&$3.owner.sprite){
if($1.toElement&&$1.toElement.nodeName!="IFRAME"){
LzMouseKernel.__resetMouse()
}}},__mouseEvent:function($1,$2){
var $3=lz.embed;var $4=$3.iframemanager.getFrame($2);if(!$4){
return
};if(!$1){
$1=window.event
};var $5="on"+$1.type;if($4.owner&&$4.owner.sprite&&$4.owner.sprite.__mouseEvent){
if($5=="oncontextmenu"){
if(!$3.iframemanager.__hidenativecontextmenu[$2]){
return
}else{
var $6=$3.getAbsolutePosition($4);LzMouseKernel.__sendMouseMove($1,$6.x,$6.y);return LzMouseKernel.__showContextMenu($1)
}};$4.owner.sprite.__mouseEvent($1);if($5=="onmouseup"){
if(LzMouseKernel.__lastMouseDown==$4.owner.sprite){
LzMouseKernel.__lastMouseDown=null
}}}else{
if($5=="onmouseleave"){
$5="onmouseout"
}else{
if($5=="onmouseenter"){
$5="onmouseover"
}else{
if($5=="oncontextmenu"){
return
}}};$3[$4.owner].callMethod("lz.embed.iframemanager.__gotMouseEvent('"+$2+"','"+$5+"')")
}},setSendMouseEvents:function($1,$2){
if(this.__callqueue[$1]){
this.__callqueue[$1].push(["setSendMouseEvents",$1,$2]);return
};this.__sendmouseevents[$1]=$2
},__setSendMouseEvents:function(id,$1){
var iframe=lz.embed.iframemanager.getFrameWindow(id);if(!iframe){
return
};if($1){
if(lz.embed.browser.isIE){
lz.embed.attachEventHandler(document,"mouseover",lz.embed.iframemanager,"__globalMouseover",id)
};try{
lz.embed.attachEventHandler(iframe.document,"mousedown",lz.embed.iframemanager,"__mouseEvent",id);lz.embed.attachEventHandler(iframe.document,"mouseup",lz.embed.iframemanager,"__mouseEvent",id);lz.embed.attachEventHandler(iframe.document,"click",lz.embed.iframemanager,"__mouseEvent",id);iframe.document.oncontextmenu=function($1){
if(!$1){
$1=iframe.event
};return lz.embed.iframemanager.__mouseEvent($1,id)
};if(lz.embed.browser.isIE){
lz.embed.attachEventHandler(iframe.document,"mouseenter",lz.embed.iframemanager,"__mouseEvent",id);lz.embed.attachEventHandler(iframe.document,"mouseleave",lz.embed.iframemanager,"__mouseEvent",id)
}else{
lz.embed.attachEventHandler(iframe.document,"mouseover",lz.embed.iframemanager,"__mouseEvent",id);lz.embed.attachEventHandler(iframe.document,"mouseout",lz.embed.iframemanager,"__mouseEvent",id)
}}
catch(e){

}}else{
if(lz.embed.browser.isIE){
lz.embed.removeEventHandler(document,"mouseover",lz.embed.iframemanager,"__globalMouseover")
};try{
lz.embed.removeEventHandler(iframe.document,"mousedown",lz.embed.iframemanager,"__mouseEvent");lz.embed.removeEventHandler(iframe.document,"mouseup",lz.embed.iframemanager,"__mouseEvent");lz.embed.removeEventHandler(iframe.document,"click",lz.embed.iframemanager,"__mouseEvent");iframe.document.oncontextmenu=null;if(lz.embed.browser.isIE){
lz.embed.removeEventHandler(iframe.document,"mouseenter",lz.embed.iframemanager,"__mouseEvent");lz.embed.removeEventHandler(iframe.document,"mouseleave",lz.embed.iframemanager,"__mouseEvent")
}else{
lz.embed.removeEventHandler(iframe.document,"mouseover",lz.embed.iframemanager,"__mouseEvent");lz.embed.removeEventHandler(iframe.document,"mouseout",lz.embed.iframemanager,"__mouseEvent")
}}
catch(e){

}}},setShowNativeContextMenu:function($1,$2){
this.__hidenativecontextmenu[$1]=!$2
},storeSelection:function($1){
var $2=lz.embed.iframemanager;var $3=$2.getFrameWindow($1);if($3&&$3.document&&$3.document.selection&&$3.document.selection.type=="Text"){
$2.__selectionbookmarks[$1]=$3.document.selection.createRange().getBookmark()
}},restoreSelection:function($1){
var $2=lz.embed.iframemanager;var $3=$2.getFrameWindow($1);if($2.__selectionbookmarks[$1]&&$3){
var $4=$2.__selectionbookmarks[$1];var $5=$3.document.body.createTextRange();$5.moveToBookmark($4);$5.select()
}}};lz.embed.mousewheel={__mousewheelEvent:function($1){
if(!$1){
$1=window.event
};var $2=0;if($1.wheelDelta){
$2=$1.wheelDelta/120;if(lz.embed.browser.isOpera){
$2=-$2
}}else{
if($1.detail){
$2=-$1.detail/3
}};if($1.preventDefault){
$1.preventDefault()
};$1.returnValue=false;var $3=lz.embed.mousewheel.__callbacks.length;if($2!=null&&$3>0){
for(var $4=0;$4<$3;$4+=2){
var $5=lz.embed.mousewheel.__callbacks[$4];var $6=lz.embed.mousewheel.__callbacks[$4+1];if($5&&$5[$6]){
$5[$6]($2)
}}}},__callbacks:[],setCallback:function($1,$2){
var $3=lz&&lz.embed&&lz.embed.options&&lz.embed.options.cancelkeyboardcontrol!=true||true;if(lz.embed.mousewheel.__callbacks.length==0&&$3){
if(window.addEventListener){
lz.embed.attachEventHandler(window,"DOMMouseScroll",lz.embed.mousewheel,"__mousewheelEvent")
};lz.embed.attachEventHandler(document,"mousewheel",lz.embed.mousewheel,"__mousewheelEvent")
};lz.embed.mousewheel.__callbacks.push($1,$2)
}};lz.embed.history={active:null,_currentstate:null,_apps:[],_intervalID:null,_registeredapps:{},intervaltime:200,init:function(){
var $1=lz.embed.history;if($1.active||$1.active==false){
return
};$1.active=true;$1._title=top.document.title;var $2=$1.get();if(lz.embed.browser.isSafari){
$1._historylength=history.length;$1._history=[];for(var $3=1;$3<$1._historylength;$3++){
$1._history.push("")
};$1._history.push($2);var $4=document.createElement("form");$4.method="get";document.body.appendChild($4);$1._form=$4;if(!top.document.location.lzaddr){
top.document.location.lzaddr={}};if(top.document.location.lzaddr.history){
$1._history=top.document.location.lzaddr.history.split(",")
};if($2!=""){
$1.set($2)
}}else{
if(lz.embed.browser.isIE){
var $2=top.location.hash;if($2){
$2=$2.substring(1)
};var $3=document.createElement("iframe");lz.embed.__setAttr($3,"id","lzHistory");lz.embed.__setAttr($3,"frameborder","no");lz.embed.__setAttr($3,"scrolling","no");lz.embed.__setAttr($3,"width","0");lz.embed.__setAttr($3,"height","0");lz.embed.__setAttr($3,"src",'javascript:""');document.body.appendChild($3);$3=document.getElementById("lzHistory");$1._iframe=$3;$3.style.display="none";$3.style.position="absolute";$3.style.left="-999px";var $5=$3.contentDocument||$3.contentWindow.document;$5.open();$5.close();if($2!=""){
$5.location.hash="#"+$2;$1._parse($2)
}}else{
if($2!=""){
$1._parse($2);$1._currentstate=$2
}}};if($1._intervalID!=null){
clearInterval($1._intervalID)
};if($1.intervaltime>0){
$1._intervalID=setInterval("lz.embed.history._checklocationhash()",$1.intervaltime)
}},listen:function($1){
if(typeof $1=="string"){
$1=lz.embed.applications[$1];if(!$1||!$1.runtime){
return
}};if(!$1){
return
};var $2=lz.embed.history;if($2._registeredapps[$1._id]){
return
};$2._registeredapps[$1.id]=true;$2._apps.push($1);$2.init()
},_checklocationhash:function(){
if(lz.embed.dojo&&lz.embed.dojo.info&&lz.embed.dojo.info.installing){
return
};if(lz.embed.browser.isSafari){
var $1=this._history[this._historylength-1];if($1==""||$1=="#"){
$1="#0"
};if(!this._skip&&this._historylength!=history.length){
this._historylength=history.length;if(typeof $1!="undefined"){
$1=$1.substring(1);this._currentstate=$1;this._parse($1)
}}else{
this._parse($1.substring(1))
}}else{
var $1=lz.embed.history.get();if($1==""){
$1="0"
};if(lz.embed.browser.isIE){
if($1!=this._currentstate){
top.location.hash=$1=="0"?"":"#"+$1;this._currentstate=$1;this._parse($1)
};if(top.document.title!=this._title){
top.document.title=this._title
}}else{
this._currentstate=$1;this._parse($1)
}}},set:function($1){
if(lz.embed.history.active==false){
return
};if($1==null){
$1=""
};if(lz.embed.history._currentstate==$1){
return
};lz.embed.history._currentstate=$1;var $2="#"+$1;if(lz.embed.browser.isIE){
top.location.hash=$2=="#0"?"":$2;var $3=lz.embed.history._iframe.contentDocument||lz.embed.history._iframe.contentWindow.document;$3.open();$3.close();$3.location.hash=$2;lz.embed.history._parse($1+"")
}else{
if(lz.embed.browser.isSafari){
lz.embed.history._history[history.length]=$2;lz.embed.history._historylength=history.length+1;if(lz.embed.browser.version<412){
if(top.location.search==""){
lz.embed.history._form.action=$2;top.document.location.lzaddr.history=lz.embed.history._history.toString();lz.embed.history._skip=true;lz.embed.history._form.submit();lz.embed.history._skip=false
}}else{
var $4=document.createEvent("MouseEvents");$4.initEvent("click",true,true);var $5=document.createElement("a");$5.href=$2;$5.dispatchEvent($4)
}}else{
top.location.hash=$2;lz.embed.history._parse($1+"")
}};return true
},get:function(){
var $1="";if(lz.embed.browser.isIE){
if(lz.embed.history._iframe){
var $2=lz.embed.history._iframe.contentDocument||lz.embed.history._iframe.contentWindow.document;$1=$2.location.hash
}}else{
$1=top.location.href
};var $3=$1.indexOf("#");if($3!=-1){
return $1.substring($3+1)
};return ""
},_parse:function($1){
var $2=lz.embed.history;if($1.length==0){
return
};for(var $3=0,$4=lz.embed.history._apps.length;$3<$4;$3++){
var $5=lz.embed.history._apps[$3];if(!$5.loaded||$5._lasthash==$1){
continue
};$5._lasthash=$1;if($1.indexOf("_lz")!=-1){
$1=$1.substring(3);var $6=$1.split(",");for(var $7=0;$7<$6.length;$7++){
var $8=$6[$7];var $9=$8.indexOf("=");var $10=unescape($8.substring(0,$9));var $11=unescape($8.substring($9+1));lz.embed.setCanvasAttribute($10,$11);if(window["canvas"]){
canvas.setAttribute($10,$11)
}}}else{
if($5.runtime=="swf"){
$2.__setFlash($1,$5._id)
}else{
if(window["lz"]&&lz["History"]&&lz.History["isReady"]&&lz.History["receiveHistory"]){
lz.History.receiveHistory($1)
}}}}},_store:function($1,$2){
if($1 instanceof Object){
var $3="";for(var $4 in $1){
if($3!=""){
$3+=","
};$3+=escape($4)+"="+escape($1[$4])
}}else{
var $3=escape($1)+"="+escape($2)
};this.set("_lz"+$3)
},__setFlash:function($1,$2){
var $3=lz.embed[$2];if($3&&$3.loaded&&$3.runtime=="swf"){
var $4=$3._getSWFDiv();if($4){
var $5=$3.callMethod("lz.History.receiveHistory("+$1+")");$3._lasthash=$1
}}}};if(lz.embed.browser.isFirefox){
window.onunload=function(){

}};lz.embed.regex={cache:{},create:function($1,$2,$3){
try{
var $4=lz.embed.regex;$4.cache[$1]=new RegExp($4.unmask($2),$4.unmask($3));return true
}
catch(e){
return e.name+": "+e.message
}},test:function($1,$2,$3){
var $4=lz.embed.regex;var $5=$4.cache[$1];$5.lastIndex=$3;return [$5.test($4.unmask($2)),$5.lastIndex]
},exec:function($1,$2,$3){
var $4=lz.embed.regex;var $5=$4.cache[$1];$5.lastIndex=$3;var $6=$5.exec($4.unmask($2));if($6){
($6=$4.maskArr($6)).push($6.index,$5.lastIndex);return $6
}else{
return null
}},match:function($1,$2){
var $3=lz.embed.regex;var $4=$3.unmask($2).match($3.cache[$1]);return $4?$3.maskArr($4):null
},replace:function($1,$2,$3){
var $4=lz.embed.regex;return $4.mask($4.unmask($2).replace($4.cache[$1],$4.unmask($3)))
},search:function($1,$2){
var $3=lz.embed.regex;return $3.unmask($2).search($3.cache[$1])
},split:function($1,$2,$3){
var $4=lz.embed.regex;return $4.maskArr($4.unmask($2).split($4.cache[$1],$3))
},remove:function($1){
delete lz.embed.regex.cache[$1]
},mask:function($1){

var re = /^\s*$/;
var re2 = /\s/g;
;return( $1==null||!re.test($1)?$1:"__#lznull"+$1.replace(re2,function($1){
switch($1){
case " ":
return "w";
case "\f":
return "f";
case "\n":
return "n";
case "\r":
return "r";
case "\t":
return "t";
case "\xA0":
return "s";
case "\u2028":
return "l";
case "\u2029":
return "p";

}}))
},unmask:function($1){
return $1=="__#lznull"?"":$1
},maskArr:function($1){
var $2=lz.embed.regex;for(var $3=0;$3<$1.length;++$3){
$1[$3]=$2.mask($1[$3])
};return $1
}};