<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>UpUtils</name>
	<version>0.0.4</version>
  <mincmsversion>1.9.1</mincmsversion>
	<help><![CDATA[CjxoMj5Eb2N1bWVudGF0aW9uPC9oMj4KPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgc29tZSB1dGlsaXR5IG1ldGhvZHMgaGFuZHkgd2hlbiBwcm9ncmFtbWluZyBtb2R1bGVzLjwvcD4KCjxoMj5TdXBwb3J0PC9oMj4KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgdGhlIGNtcyBkZXZlbG9wbWVudCBmb3JnZSBhdCA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnIj5kZXYuY21zbWFkZXNpbXBsZS5vcmc8L2E+LjwvbGk+CjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9XCJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmdcIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi48L2xpPgo8bGk+VGhlIGF1dGhvcihzKSwgYXJub3VkIGV0IGFsbCBjYW4gc29tZXRpbWVzIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0LyNjbXNcIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvcihzKSBkaXJlY3RseS48L2xpPiAgCjwvdWw+CjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dApvZiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5saWNlbnNlPC9hPiBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+Cgo8aDI+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMj4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDExLCBBcm5vdWQgdmFuIFN1c3RlcmVuIDxhIGhyZWY9Im1haWx0bzphcm5vdWRAdXBzZXJ2aWNlLm5sIj4mbHQ7YXJub3VkQHVwc2VydmljZS5ubCZndDs8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+Cgo8c3Ryb25nPlN1cHBvcnQgbW9yZSBtb2RzIGxpa2UgdGhpczo8L3N0cm9uZz4KCjxwPgo8Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImVuY3J5cHRlZCIgdmFsdWU9Ii0tLS0tQkVHSU4gUEtDUzctLS0tLU1JSUhUd1lKS29aSWh2Y05BUWNFb0lJSFFEQ0NCendDQVFFeGdnRXdNSUlCTEFJQkFEQ0JsRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjBDQVFBd0RRWUpLb1pJaHZjTkFRRUJCUUFFZ1lBbkxXdmpZaTJjUVlDNFR4WWxTaG1iOEw4bVRmM3h3VmlKVTVreXphSlZSa0JuVy9KQkZUMFJDbzdSRkdXUVlMT0s2QkI2bmc5Nm5jMUhPYUN4bUg2aXEyTUpxU3YrRTgxMWhDTWVBOHhaN3F6SnR3Qzg2TmhGc255WW5tb3hZdFRZcS8wTmdwZC9qM1Q5TjdFOVhVMzBDRUl2Vm82QzBmeE92ZUFuS0orallqRUxNQWtHQlNzT0F3SWFCUUF3Z2N3R0NTcUdTSWIzRFFFSEFUQVVCZ2dxaGtpRzl3MERCd1FJRW1aVm9UaDZJVVdBZ2FneHl6WDlTendveU9hNGZkejkyczdacm13MTVHYnRlTGl6QW1ockNCYVVPczNTMWlWM2VOU04rMEhrVHFBdm9ESmJ2aDBrMXltalphUGswNWJVYVkxNGpzdFk4SytqcTFpU1ZUaUljSFlzeWNqVkFKT0Y3RnZOdmRQaHZmckxjdzBkV0QyWmk2bnJDQmZ1UXdqcHZiUzlCdyt6dXdqay8rVUR1QmwzUHNLbVFMVDFNN2tCSWlSU3AxbVRYdXlEK3YzYWM2Sy9FSHpvbnBaZ3JPalB0L3BmaUxmNkd0WHhIVzJnZ2dPSE1JSURnekNDQXV5Z0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjB3SGhjTk1EUXdNakV6TVRBeE16RTFXaGNOTXpVd01qRXpNVEF4TXpFMVdqQ0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMHdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTUZIVHQzOFJNeExYSnlPMlNtUytOZGw3MlQ3b0tKNHU0dXcrNmF3bnRBTFdoMDNQZXdtSUp1emJBTFNjc1RTNHNab1MxZktjaUJHb2gxMWdJZkh6eWx2a2ROZS9oSmw2Ni9SR3FyajVyRmIwOHNBQUJOVHpEVGlxcU5wSmVCc1lzL2MyYWlHb3pwdFgyUmxuQmt0SCtTVU5wQWFqVzcyNE52Mld2aGlmNnNGQWdNQkFBR2pnZTR3Z2Vzd0hRWURWUjBPQkJZRUZKYWZmTHZHYnhlOVdUOVMxd29iN0JEV1pKUnJNSUc3QmdOVkhTTUVnYk13Z2JDQUZKYWZmTHZHYnhlOVdUOVMxd29iN0JEV1pKUnJvWUdVcElHUk1JR09NUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVTF2ZFc1MFlXbHVJRlpwWlhjeEZEQVNCZ05WQkFvVEMxQmhlVkJoYkNCSmJtTXVNUk13RVFZRFZRUUxGQXBzYVhabFgyTmxjblJ6TVJFd0R3WURWUVFERkFoc2FYWmxYMkZ3YVRFY01Cb0dDU3FHU0liM0RRRUpBUllOY21WQWNHRjVjR0ZzTG1OdmJZSUJBREFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFJRmZPbGFhZ0ZybDcxK2pxNk9LaWRiV0ZTRStRNEZxUk92ZGdJT050aCs4a1NLLy9ZLzRpaHVFNFltdnpuNWNlRTNTL2lCU1FRTWp5dmIrczJUV2JRWUR3Y3AxMjlPUEliRDllcGRyNHRKT1VOaVNvanc3Qkh3WVJpUGg1OFMxeEdsRmdIRlh3ckVCYjNkZ05iTVVhK3U0cWVjdHNNQVhwVkhuRDl3SXlmbUhNWUlCbWpDQ0FaWUNBUUV3Z1pRd2dZNHhDekFKQmdOVkJBWVRBbFZUTVFzd0NRWURWUVFJRXdKRFFURVdNQlFHQTFVRUJ4TU5UVzkxYm5SaGFXNGdWbWxsZHpFVU1CSUdBMVVFQ2hNTFVHRjVVR0ZzSUVsdVl5NHhFekFSQmdOVkJBc1VDbXhwZG1WZlkyVnlkSE14RVRBUEJnTlZCQU1VQ0d4cGRtVmZZWEJwTVJ3d0dnWUpLb1pJaHZjTkFRa0JGZzF5WlVCd1lYbHdZV3d1WTI5dEFnRUFNQWtHQlNzT0F3SWFCUUNnWFRBWUJna3Foa2lHOXcwQkNRTXhDd1lKS29aSWh2Y05BUWNCTUJ3R0NTcUdTSWIzRFFFSkJURVBGdzB4TVRFd01qSXhNVEl3TXpSYU1DTUdDU3FHU0liM0RRRUpCREVXQkJSbEY3dlZYNUxYMlg1SXRZN2Ntd0EvUlpUQXRUQU5CZ2txaGtpRzl3MEJBUUVGQUFTQmdJcnlZZWtIaFNyK2ZXSGVtVS9YNnNZcWZkQnVZNDlkNytrQ0lwbWRidEtSWlMrekMvODFXaHo5UExoaHVObFdTcnhTY3ltUWV4K1ZuRmdTZ2ZyR1AxNzROendLSXM4cmRLWXlIcENoTlpsVlA3cEplQXJidHVuZFVpc3ZycGM4d1B4bHJqTkNNeFJFL3JOWEhlUG1HdXVLYnZSamkzajBuSVdma0Y2dUJ6Y08tLS0tLUVORCBQS0NTNy0tLS0tCiI+CjxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9lbl9VUy9pL2J0bi9idG5fZG9uYXRlQ0NfTEcuZ2lmIiBib3JkZXI9IjAiIG5hbWU9InN1Ym1pdCIgYWx0PSJQYXlQYWwgLSBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZSEiPgo8aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vbmxfTkwvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KPC9mb3JtPjxici8+PGJyLz4KCjxwPlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uPC9wPgo8cD5Ib3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCmluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIApzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLjwvcD4KPHA+VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKT3IgcmVhZCBpdCA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPm9ubGluZTwvYT48L3A+CjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGF0IGxhbmd1YWdlIHRvIHVzZSBmb3IgZGlzcGxheSBvbiB0aGUgZnJvbnRlbmQuIE5vdCBhbGwgbW9kdWxlcyBzdXBwb3J0IG9yIG5lZWQgdGhpcy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBBcm5vdWQgdmFuIFN1c3RlcmVuICZsdDthcm5vdWRAdXBzZXJ2aWNlLm5sJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDAuMC40PGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PGJyIC8+Cgo8Yj4wLjAuNCB2ZXJzaW9uPC9iPiAtIDIyIG9rdCAyMDExIDxiciAvPgoKPHVsPgo8bGk+YmFzZURBTzogbW9yZSBjb25zaXN0ZW5jeSAoZGJfcmVzdWx0IC0+ICRkYnJlc3VsdCk8L2xpPgo8bGk+YmFzZURBTzogdmFsdWUgY2hlY2sgb24gZmV0Y2hfYWxsX3doZXJlIG1ldGhvZDwvbGk+CjxsaT5VcExvZ2dlcjogbW9kaWZ5IG1zZ192YWx1ZSwgYWRkICc6JyB0byBzdHJpbmcgdG8gbG9nPC9saT4KPGxpPlVwSGVscGVyOiBhZGQgbW9kaWZ5X2lucHV0X3NlbGVjbGlzdDwvbGk+CjxsaT5VcEhlbHBlcjogYWRkIGdldF91cGxvYWRzX2ZpbGVzX3JlY3Vyc2l2ZTwvbGk+CjxsaT5VcEhlbHBlcjogYWRkIGFycmF5X2ZsYXQgbWV0aG9kPC9saT4KPGxpPlVwSGVscGVyOiBjaGFuZ2UgbWtkaXIgMDc3NSB0byAwNzc3IG9uIG1ha2VfdXBsb2Fkc19kaXJlY3RvcnkgbWV0aG9kPC9saT4KPGxpPlVwSGVscGVyOiBhZGQgYXJyYXlfcGx1Y2sgYWx0ZXJuYXRpdmUgdG8gYXJyYXlfbWFwIHdoaWNoIGdpdmVzIHByb2JsZW1zIG9uIHBocCA8IDUuMyBob3N0czwvbGk+CjxsaT5BZGQgUGF5UGFsIGRvbmF0aW9uIGJ1dHRvbiB0byBkb2N1bWVudGF0aW9uPC9saT4KPGxpPkNNU01TIDEuMTAgY29tcGF0aWJsZTwvbGk+CjwvdWw+IDxiciAvPgoKPGI+MC4wLjMgdmVyc2lvbjwvYj4gLSA5IGF1ZyAyMDExIDxiciAvPgoKPHVsPgo8bGk+QWRkIGF1dG9sb2FkZXIgdG8gVXBVdGlscyBjbGFzczwvbGk+CjxsaT5BZGQgVXBVcGxvYWQuY2xhc3MucGhwPC9saT4KPGxpPkFkZCBVcExvZ2dlci5jbGFzcy5waHA8L2xpPgo8bGk+QWRkIHNvbWUgcGFyYW1ldGVyIGNoZWNraW5nIHRvIGJhc2VEQU8uY2xhc3MucGhwPC9saT4KPGxpPkFkZCBmZXRjaF9hbGxfd2hlcmUgYW5kIHVwZGF0ZV93aGVyZSBtZXRob2QgdG8gYmFzZURBTy5jbGFzcy5waHA8L2xpPgo8bGk+QWRkIHN1YnNpdHV0ZSBmdW5jdGlvbmFsaXR5IHRvIFVwU21hcnR5LmNsYXNzLnBocDwvbGk+CjxsaT5BZGQgdHJlZSBtYW5pcHVsYXRpb24gbWV0aG9kcyAobGlrZTogbWtkaXIsIHJtZGlyIGNwKSB0byBVcEhlbHBlci5jbGFzcy5waHA8L2xpPgo8L3VsPiA8YnIgLz4KCjxiPjAuMC4yIHZlcnNpb248L2I+IC0gMjAganVuIDIwMTEgPGJyIC8+Cgo8dWw+CjxsaT5Nb2R1bGUgYWRkZWQgdG8gdHJhbnNsYXRpb24gY2VudGVyPC9saT4KPGxpPkFkZGVkIGR1dGNoIHRyYW5zbGF0aW9uIGxhbmcvZXh0L25sX05MLnBocDwvbGk+CjxsaT5BZGQgbWV0aG9kIG5leHRfcHJpbWFyeV9rZXkgdG8gYmFzZSBkYXRhIG9iamVjdCA8L2xpPgo8L3VsPiA8YnIgLz4KCgo8Yj4wLjAuMSBpbml0aWFsIHZlcnNpb248L2I+IC0gNiBqdW4gMjAxMQo8YnIgLz4=]]></about>
	<description><![CDATA[Utility module to store generic classes and code.]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/changelog.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGJyIC8+Cgo8Yj4wLjAuNCB2ZXJzaW9uPC9iPiAtIDIyIG9rdCAyMDExIDxiciAvPgoKPHVsPgo8bGk+YmFzZURBTzogbW9yZSBjb25zaXN0ZW5jeSAoZGJfcmVzdWx0IC0+ICRkYnJlc3VsdCk8L2xpPgo8bGk+YmFzZURBTzogdmFsdWUgY2hlY2sgb24gZmV0Y2hfYWxsX3doZXJlIG1ldGhvZDwvbGk+CjxsaT5VcExvZ2dlcjogbW9kaWZ5IG1zZ192YWx1ZSwgYWRkICc6JyB0byBzdHJpbmcgdG8gbG9nPC9saT4KPGxpPlVwSGVscGVyOiBhZGQgbW9kaWZ5X2lucHV0X3NlbGVjbGlzdDwvbGk+CjxsaT5VcEhlbHBlcjogYWRkIGdldF91cGxvYWRzX2ZpbGVzX3JlY3Vyc2l2ZTwvbGk+CjxsaT5VcEhlbHBlcjogYWRkIGFycmF5X2ZsYXQgbWV0aG9kPC9saT4KPGxpPlVwSGVscGVyOiBjaGFuZ2UgbWtkaXIgMDc3NSB0byAwNzc3IG9uIG1ha2VfdXBsb2Fkc19kaXJlY3RvcnkgbWV0aG9kPC9saT4KPGxpPlVwSGVscGVyOiBhZGQgYXJyYXlfcGx1Y2sgYWx0ZXJuYXRpdmUgdG8gYXJyYXlfbWFwIHdoaWNoIGdpdmVzIHByb2JsZW1zIG9uIHBocCA8IDUuMyBob3N0czwvbGk+CjxsaT5BZGQgUGF5UGFsIGRvbmF0aW9uIGJ1dHRvbiB0byBkb2N1bWVudGF0aW9uPC9saT4KPGxpPkNNU01TIDEuMTAgY29tcGF0aWJsZTwvbGk+CjwvdWw+IDxiciAvPgoKPGI+MC4wLjMgdmVyc2lvbjwvYj4gLSA5IGF1ZyAyMDExIDxiciAvPgoKPHVsPgo8bGk+QWRkIGF1dG9sb2FkZXIgdG8gVXBVdGlscyBjbGFzczwvbGk+CjxsaT5BZGQgVXBVcGxvYWQuY2xhc3MucGhwPC9saT4KPGxpPkFkZCBVcExvZ2dlci5jbGFzcy5waHA8L2xpPgo8bGk+QWRkIHNvbWUgcGFyYW1ldGVyIGNoZWNraW5nIHRvIGJhc2VEQU8uY2xhc3MucGhwPC9saT4KPGxpPkFkZCBmZXRjaF9hbGxfd2hlcmUgYW5kIHVwZGF0ZV93aGVyZSBtZXRob2QgdG8gYmFzZURBTy5jbGFzcy5waHA8L2xpPgo8bGk+QWRkIHN1YnNpdHV0ZSBmdW5jdGlvbmFsaXR5IHRvIFVwU21hcnR5LmNsYXNzLnBocDwvbGk+CjxsaT5BZGQgdHJlZSBtYW5pcHVsYXRpb24gbWV0aG9kcyAobGlrZTogbWtkaXIsIHJtZGlyIGNwKSB0byBVcEhlbHBlci5jbGFzcy5waHA8L2xpPgo8L3VsPiA8YnIgLz4KCjxiPjAuMC4yIHZlcnNpb248L2I+IC0gMjAganVuIDIwMTEgPGJyIC8+Cgo8dWw+CjxsaT5Nb2R1bGUgYWRkZWQgdG8gdHJhbnNsYXRpb24gY2VudGVyPC9saT4KPGxpPkFkZGVkIGR1dGNoIHRyYW5zbGF0aW9uIGxhbmcvZXh0L25sX05MLnBocDwvbGk+CjxsaT5BZGQgbWV0aG9kIG5leHRfcHJpbWFyeV9rZXkgdG8gYmFzZSBkYXRhIG9iamVjdCA8L2xpPgo8L3VsPiA8YnIgLz4KCgo8Yj4wLjAuMSBpbml0aWFsIHZlcnNpb248L2I+IC0gNiBqdW4gMjAxMQo=]]></data>
	</file>
	<file>
	  <filename>/docs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/docs/COPYING</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQogICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3CgogQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCiBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQoKICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgpzb2Z0d2FyZSBhbmQgb3RoZXIga2luZHMgb2Ygd29ya3MuCgogIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhbmQgb3RoZXIgcHJhY3RpY2FsIHdvcmtzIGFyZSBkZXNpZ25lZAp0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgdGhlIHdvcmtzLiAgQnkgY29udHJhc3QsCnRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCnNoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZnJlZQpzb2Z0d2FyZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFdlLCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB1c2UgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCmFueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiAgWW91IGNhbiBhcHBseSBpdCB0bwp5b3VyIHByb2dyYW1zLCB0b28uCgogIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQpoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCnRoZW0gaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91CndhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CmZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgoKICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZGVueWluZyB5b3UKdGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCmNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZgp5b3UgbW9kaWZ5IGl0OiByZXNwb25zaWJpbGl0aWVzIHRvIHJlc3BlY3QgdGhlIGZyZWVkb20gb2Ygb3RoZXJzLgoKICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCmdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IHBhc3Mgb24gdG8gdGhlIHJlY2lwaWVudHMgdGhlIHNhbWUKZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkKa25vdyB0aGVpciByaWdodHMuCgogIERldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKKDEpIGFzc2VydCBjb3B5cmlnaHQgb24gdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIExpY2Vuc2UKZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KCiAgRm9yIHRoZSBkZXZlbG9wZXJzJyBhbmQgYXV0aG9ycycgcHJvdGVjdGlvbiwgdGhlIEdQTCBjbGVhcmx5IGV4cGxhaW5zCnRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcwpjaGFuZ2VkLCBzbyB0aGF0IHRoZWlyIHByb2JsZW1zIHdpbGwgbm90IGJlIGF0dHJpYnV0ZWQgZXJyb25lb3VzbHkgdG8KYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KCiAgU29tZSBkZXZpY2VzIGFyZSBkZXNpZ25lZCB0byBkZW55IHVzZXJzIGFjY2VzcyB0byBpbnN0YWxsIG9yIHJ1bgptb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKY2FuIGRvIHNvLiAgVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBhaW0gb2YKcHJvdGVjdGluZyB1c2VycycgZnJlZWRvbSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlLiAgVGhlIHN5c3RlbWF0aWMKcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KdXNlLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hlcmUgaXQgaXMgbW9zdCB1bmFjY2VwdGFibGUuICBUaGVyZWZvcmUsIHdlCmhhdmUgZGVzaWduZWQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBHUEwgdG8gcHJvaGliaXQgdGhlIHByYWN0aWNlIGZvciB0aG9zZQpwcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQpzdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UgZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMKb2YgdGhlIEdQTCwgYXMgbmVlZGVkIHRvIHByb3RlY3QgdGhlIGZyZWVkb20gb2YgdXNlcnMuCgogIEZpbmFsbHksIGV2ZXJ5IHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuClN0YXRlcyBzaG91bGQgbm90IGFsbG93IHBhdGVudHMgdG8gcmVzdHJpY3QgZGV2ZWxvcG1lbnQgYW5kIHVzZSBvZgpzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bwphdm9pZCB0aGUgc3BlY2lhbCBkYW5nZXIgdGhhdCBwYXRlbnRzIGFwcGxpZWQgdG8gYSBmcmVlIHByb2dyYW0gY291bGQKbWFrZSBpdCBlZmZlY3RpdmVseSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgdGhlIEdQTCBhc3N1cmVzIHRoYXQKcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCgogIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCm1vZGlmaWNhdGlvbiBmb2xsb3cuCgogICAgICAgICAgICAgICAgICAgICAgIFRFUk1TIEFORCBDT05ESVRJT05TCgogIDAuIERlZmluaXRpb25zLgoKICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KCiAgIkNvcHlyaWdodCIgYWxzbyBtZWFucyBjb3B5cmlnaHQtbGlrZSBsYXdzIHRoYXQgYXBwbHkgdG8gb3RoZXIga2luZHMgb2YKd29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KCiAgIlRoZSBQcm9ncmFtIiByZWZlcnMgdG8gYW55IGNvcHlyaWdodGFibGUgd29yayBsaWNlbnNlZCB1bmRlciB0aGlzCkxpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZAoicmVjaXBpZW50cyIgbWF5IGJlIGluZGl2aWR1YWxzIG9yIG9yZ2FuaXphdGlvbnMuCgogIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsKaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCmV4YWN0IGNvcHkuICBUaGUgcmVzdWx0aW5nIHdvcmsgaXMgY2FsbGVkIGEgIm1vZGlmaWVkIHZlcnNpb24iIG9mIHRoZQplYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KCiAgQSAiY292ZXJlZCB3b3JrIiBtZWFucyBlaXRoZXIgdGhlIHVubW9kaWZpZWQgUHJvZ3JhbSBvciBhIHdvcmsgYmFzZWQKb24gdGhlIFByb2dyYW0uCgogIFRvICJwcm9wYWdhdGUiIGEgd29yayBtZWFucyB0byBkbyBhbnl0aGluZyB3aXRoIGl0IHRoYXQsIHdpdGhvdXQKcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgppbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKY29tcHV0ZXIgb3IgbW9kaWZ5aW5nIGEgcHJpdmF0ZSBjb3B5LiAgUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywKZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUKcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgoKICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCnBhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIgdGhyb3VnaAphIGNvbXB1dGVyIG5ldHdvcmssIHdpdGggbm8gdHJhbnNmZXIgb2YgYSBjb3B5LCBpcyBub3QgY29udmV5aW5nLgoKICBBbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBkaXNwbGF5cyAiQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyIKdG8gdGhlIGV4dGVudCB0aGF0IGl0IGluY2x1ZGVzIGEgY29udmVuaWVudCBhbmQgcHJvbWluZW50bHkgdmlzaWJsZQpmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKdGVsbHMgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHdvcmsgKGV4Y2VwdCB0byB0aGUKZXh0ZW50IHRoYXQgd2FycmFudGllcyBhcmUgcHJvdmlkZWQpLCB0aGF0IGxpY2Vuc2VlcyBtYXkgY29udmV5IHRoZQp3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgp0aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQptZW51LCBhIHByb21pbmVudCBpdGVtIGluIHRoZSBsaXN0IG1lZXRzIHRoaXMgY3JpdGVyaW9uLgoKICAxLiBTb3VyY2UgQ29kZS4KCiAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZQpmb3JtIG9mIGEgd29yay4KCiAgQSAiU3RhbmRhcmQgSW50ZXJmYWNlIiBtZWFucyBhbiBpbnRlcmZhY2UgdGhhdCBlaXRoZXIgaXMgYW4gb2ZmaWNpYWwKc3RhbmRhcmQgZGVmaW5lZCBieSBhIHJlY29nbml6ZWQgc3RhbmRhcmRzIGJvZHksIG9yLCBpbiB0aGUgY2FzZSBvZgppbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAppcyB3aWRlbHkgdXNlZCBhbW9uZyBkZXZlbG9wZXJzIHdvcmtpbmcgaW4gdGhhdCBsYW5ndWFnZS4KCiAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXIKdGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKcGFja2FnaW5nIGEgTWFqb3IgQ29tcG9uZW50LCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhhdCBNYWpvcgpDb21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQKTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCmltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluIHNvdXJjZSBjb2RlIGZvcm0uICBBCiJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAooa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCihpZiBhbnkpIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHdvcmsgcnVucywgb3IgYSBjb21waWxlciB1c2VkIHRvCnByb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgoKICBUaGUgIkNvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsCnRoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUKd29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bwpjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuICBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MKU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQpwcm9ncmFtcyB3aGljaCBhcmUgdXNlZCB1bm1vZGlmaWVkIGluIHBlcmZvcm1pbmcgdGhvc2UgYWN0aXZpdGllcyBidXQKd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiAgRm9yIGV4YW1wbGUsIENvcnJlc3BvbmRpbmcgU291cmNlCmluY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCnRoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQpsaW5rZWQgc3VicHJvZ3JhbXMgdGhhdCB0aGUgd29yayBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gcmVxdWlyZSwKc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgoKICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzCmNhbiByZWdlbmVyYXRlIGF1dG9tYXRpY2FsbHkgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgQ29ycmVzcG9uZGluZwpTb3VyY2UuCgogIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYSB3b3JrIGluIHNvdXJjZSBjb2RlIGZvcm0gaXMgdGhhdApzYW1lIHdvcmsuCgogIDIuIEJhc2ljIFBlcm1pc3Npb25zLgoKICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZgpjb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZApjb25kaXRpb25zIGFyZSBtZXQuICBUaGlzIExpY2Vuc2UgZXhwbGljaXRseSBhZmZpcm1zIHlvdXIgdW5saW1pdGVkCnBlcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCmNvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cwpjb250ZW50LCBjb25zdGl0dXRlcyBhIGNvdmVyZWQgd29yay4gIFRoaXMgTGljZW5zZSBhY2tub3dsZWRnZXMgeW91cgpyaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4KCiAgWW91IG1heSBtYWtlLCBydW4gYW5kIHByb3BhZ2F0ZSBjb3ZlcmVkIHdvcmtzIHRoYXQgeW91IGRvIG5vdApjb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucwppbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCm9mIGhhdmluZyB0aGVtIG1ha2UgbW9kaWZpY2F0aW9ucyBleGNsdXNpdmVseSBmb3IgeW91LCBvciBwcm92aWRlIHlvdQp3aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoCnRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCm5vdCBjb250cm9sIGNvcHlyaWdodC4gIFRob3NlIHRodXMgbWFraW5nIG9yIHJ1bm5pbmcgdGhlIGNvdmVyZWQgd29ya3MKZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbgphbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKeW91ciBjb3B5cmlnaHRlZCBtYXRlcmlhbCBvdXRzaWRlIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHlvdS4KCiAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGJlbG93LiAgU3VibGljZW5zaW5nIGlzIG5vdCBhbGxvd2VkOyBzZWN0aW9uIDEwCm1ha2VzIGl0IHVubmVjZXNzYXJ5LgoKICAzLiBQcm90ZWN0aW5nIFVzZXJzJyBMZWdhbCBSaWdodHMgRnJvbSBBbnRpLUNpcmN1bXZlbnRpb24gTGF3LgoKICBObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKbWVhc3VyZSB1bmRlciBhbnkgYXBwbGljYWJsZSBsYXcgZnVsZmlsbGluZyBvYmxpZ2F0aW9ucyB1bmRlciBhcnRpY2xlCjExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgpzaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCm1lYXN1cmVzLgoKICBXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCmNpcmN1bXZlbnRpb24gb2YgdGVjaG5vbG9naWNhbCBtZWFzdXJlcyB0byB0aGUgZXh0ZW50IHN1Y2ggY2lyY3VtdmVudGlvbgppcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCnRoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdCBvcGVyYXRpb24gb3IKbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGFzIGEgbWVhbnMgb2YgZW5mb3JjaW5nLCBhZ2FpbnN0IHRoZSB3b3JrJ3MKdXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCnRlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCgogIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCgogIFlvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQpyZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAphcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2U7CmtlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQpub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7CmtlZXAgaW50YWN0IGFsbCBub3RpY2VzIG9mIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYWxsCnJlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgoKICBZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCmFuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuCgogIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCgogIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKdGVybXMgb2Ygc2VjdGlvbiA0LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CgogICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCiAgICBpdCwgYW5kIGdpdmluZyBhIHJlbGV2YW50IGRhdGUuCgogICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKICAgIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IGNvbmRpdGlvbnMgYWRkZWQgdW5kZXIgc2VjdGlvbgogICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bwogICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KCiAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcwogICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCiAgICBMaWNlbnNlIHdpbGwgdGhlcmVmb3JlIGFwcGx5LCBhbG9uZyB3aXRoIGFueSBhcHBsaWNhYmxlIHNlY3Rpb24gNwogICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCiAgICBwZXJtaXNzaW9uIHRvIGxpY2Vuc2UgdGhlIHdvcmsgaW4gYW55IG90aGVyIHdheSwgYnV0IGl0IGRvZXMgbm90CiAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgoKICAgIGQpIElmIHRoZSB3b3JrIGhhcyBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZXMsIGVhY2ggbXVzdCBkaXNwbGF5CiAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCiAgICB3b3JrIG5lZWQgbm90IG1ha2UgdGhlbSBkbyBzby4KCiAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAp3b3Jrcywgd2hpY2ggYXJlIG5vdCBieSB0aGVpciBuYXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgY292ZXJlZCB3b3JrLAphbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLAppbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCiJhZ2dyZWdhdGUiIGlmIHRoZSBjb21waWxhdGlvbiBhbmQgaXRzIHJlc3VsdGluZyBjb3B5cmlnaHQgYXJlIG5vdAp1c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzCmJleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yawppbiBhbiBhZ2dyZWdhdGUgZG9lcyBub3QgY2F1c2UgdGhpcyBMaWNlbnNlIHRvIGFwcGx5IHRvIHRoZSBvdGhlcgpwYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgoKICA2LiBDb252ZXlpbmcgTm9uLVNvdXJjZSBGb3Jtcy4KCiAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMKb2Ygc2VjdGlvbnMgNCBhbmQgNSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBjb252ZXkgdGhlCm1hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKaW4gb25lIG9mIHRoZXNlIHdheXM6CgogICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAogICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZpeGVkIG9uIGEgZHVyYWJsZSBwaHlzaWNhbCBtZWRpdW0KICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgoKICAgIGIpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQogICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKICAgIGxvbmcgYXMgeW91IG9mZmVyIHNwYXJlIHBhcnRzIG9yIGN1c3RvbWVyIHN1cHBvcnQgZm9yIHRoYXQgcHJvZHVjdAogICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQogICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCiAgICBwcm9kdWN0IHRoYXQgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIG9uIGEgZHVyYWJsZSBwaHlzaWNhbAogICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubwogICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCiAgICBjb252ZXlpbmcgb2Ygc291cmNlLCBvciAoMikgYWNjZXNzIHRvIGNvcHkgdGhlCiAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgoKICAgIGMpIENvbnZleSBpbmRpdmlkdWFsIGNvcGllcyBvZiB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlCiAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcwogICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKICAgIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBvYmplY3QgY29kZSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZAogICAgd2l0aCBzdWJzZWN0aW9uIDZiLgoKICAgIGQpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIGZyb20gYSBkZXNpZ25hdGVkCiAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGluIHRoZSBzYW1lIHdheSB0aHJvdWdoIHRoZSBzYW1lIHBsYWNlIGF0IG5vCiAgICBmdXJ0aGVyIGNoYXJnZS4gIFlvdSBuZWVkIG5vdCByZXF1aXJlIHJlY2lwaWVudHMgdG8gY29weSB0aGUKICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCiAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKICAgIG1heSBiZSBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgKG9wZXJhdGVkIGJ5IHlvdSBvciBhIHRoaXJkIHBhcnR5KQogICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCiAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQogICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBSZWdhcmRsZXNzIG9mIHdoYXQgc2VydmVyIGhvc3RzIHRoZQogICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCiAgICBhdmFpbGFibGUgZm9yIGFzIGxvbmcgYXMgbmVlZGVkIHRvIHNhdGlzZnkgdGhlc2UgcmVxdWlyZW1lbnRzLgoKICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKICAgIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZCBDb3JyZXNwb25kaW5nCiAgICBTb3VyY2Ugb2YgdGhlIHdvcmsgYXJlIGJlaW5nIG9mZmVyZWQgdG8gdGhlIGdlbmVyYWwgcHVibGljIGF0IG5vCiAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KCiAgQSBzZXBhcmFibGUgcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGNvZGUsIHdob3NlIHNvdXJjZSBjb2RlIGlzIGV4Y2x1ZGVkCmZyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCmluY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KCiAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKdGFuZ2libGUgcGVyc29uYWwgcHJvcGVydHkgd2hpY2ggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcGVyc29uYWwsIGZhbWlseSwKb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IgaW5jb3Jwb3JhdGlvbgppbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsCmRvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvdmVyYWdlLiAgRm9yIGEgcGFydGljdWxhcgpwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLCAibm9ybWFsbHkgdXNlZCIgcmVmZXJzIHRvIGEKdHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCm9mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheSBpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyCmFjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQgdG8gdXNlLCB0aGUgcHJvZHVjdC4gIEEgcHJvZHVjdAppcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbApjb21tZXJjaWFsLCBpbmR1c3RyaWFsIG9yIG5vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudAp0aGUgb25seSBzaWduaWZpY2FudCBtb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4KCiAgIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLApwcm9jZWR1cmVzLCBhdXRob3JpemF0aW9uIGtleXMsIG9yIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbGwKYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQphIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhlIGluZm9ybWF0aW9uIG11c3QKc3VmZmljZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGludWVkIGZ1bmN0aW9uaW5nIG9mIHRoZSBtb2RpZmllZCBvYmplY3QKY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCgogIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCnNwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCnBhcnQgb2YgYSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0aGUgcmlnaHQgb2YgcG9zc2Vzc2lvbiBhbmQgdXNlIG9mIHRoZQpVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCmZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCkNvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkIHVuZGVyIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGFjY29tcGFuaWVkCmJ5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQppZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAptb2RpZmllZCBvYmplY3QgY29kZSBvbiB0aGUgVXNlciBQcm9kdWN0IChmb3IgZXhhbXBsZSwgdGhlIHdvcmsgaGFzCmJlZW4gaW5zdGFsbGVkIGluIFJPTSkuCgogIFRoZSByZXF1aXJlbWVudCB0byBwcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGEKcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCmZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlIHJlY2lwaWVudCwgb3IgZm9yCnRoZSBVc2VyIFByb2R1Y3QgaW4gd2hpY2ggaXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkLiAgQWNjZXNzIHRvIGEKbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yayBvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kCnByb3RvY29scyBmb3IgY29tbXVuaWNhdGlvbiBhY3Jvc3MgdGhlIG5ldHdvcmsuCgogIENvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkLCBhbmQgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIHByb3ZpZGVkLAppbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24gbXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIHB1YmxpY2x5CmRvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCnNvdXJjZSBjb2RlIGZvcm0pLCBhbmQgbXVzdCByZXF1aXJlIG5vIHNwZWNpYWwgcGFzc3dvcmQgb3Iga2V5IGZvcgp1bnBhY2tpbmcsIHJlYWRpbmcgb3IgY29weWluZy4KCiAgNy4gQWRkaXRpb25hbCBUZXJtcy4KCiAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgpBZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVudGlyZSBQcm9ncmFtIHNoYWxsCmJlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKdGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gIElmIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMKYXBwbHkgb25seSB0byBwYXJ0IG9mIHRoZSBQcm9ncmFtLCB0aGF0IHBhcnQgbWF5IGJlIHVzZWQgc2VwYXJhdGVseQp1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5CnRoaXMgTGljZW5zZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucy4KCiAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgpyZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKaXQuICAoQWRkaXRpb25hbCBwZXJtaXNzaW9ucyBtYXkgYmUgd3JpdHRlbiB0byByZXF1aXJlIHRoZWlyIG93bgpyZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLApmb3Igd2hpY2ggeW91IGhhdmUgb3IgY2FuIGdpdmUgYXBwcm9wcmlhdGUgY29weXJpZ2h0IHBlcm1pc3Npb24uCgogIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgZm9yIG1hdGVyaWFsIHlvdQphZGQgdG8gYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgKGlmIGF1dGhvcml6ZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mCnRoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgoKICAgIGEpIERpc2NsYWltaW5nIHdhcnJhbnR5IG9yIGxpbWl0aW5nIGxpYWJpbGl0eSBkaWZmZXJlbnRseSBmcm9tIHRoZQogICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKCiAgICBiKSBSZXF1aXJpbmcgcHJlc2VydmF0aW9uIG9mIHNwZWNpZmllZCByZWFzb25hYmxlIGxlZ2FsIG5vdGljZXMgb3IKICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCgogICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgogICAgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KICAgIHJlYXNvbmFibGUgd2F5cyBhcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbjsgb3IKCiAgICBkKSBMaW1pdGluZyB0aGUgdXNlIGZvciBwdWJsaWNpdHkgcHVycG9zZXMgb2YgbmFtZXMgb2YgbGljZW5zb3JzIG9yCiAgICBhdXRob3JzIG9mIHRoZSBtYXRlcmlhbDsgb3IKCiAgICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCiAgICB0cmFkZSBuYW1lcywgdHJhZGVtYXJrcywgb3Igc2VydmljZSBtYXJrczsgb3IKCiAgICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0CiAgICBtYXRlcmlhbCBieSBhbnlvbmUgd2hvIGNvbnZleXMgdGhlIG1hdGVyaWFsIChvciBtb2RpZmllZCB2ZXJzaW9ucyBvZgogICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgogICAgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5IGltcG9zZSBvbgogICAgdGhvc2UgbGljZW5zb3JzIGFuZCBhdXRob3JzLgoKICBBbGwgb3RoZXIgbm9uLXBlcm1pc3NpdmUgYWRkaXRpb25hbCB0ZXJtcyBhcmUgY29uc2lkZXJlZCAiZnVydGhlcgpyZXN0cmljdGlvbnMiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiBzZWN0aW9uIDEwLiAgSWYgdGhlIFByb2dyYW0gYXMgeW91CnJlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCmdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgpyZXN0cmljdGlvbiwgeW91IG1heSByZW1vdmUgdGhhdCB0ZXJtLiAgSWYgYSBsaWNlbnNlIGRvY3VtZW50IGNvbnRhaW5zCmEgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcwpMaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKb2YgdGhhdCBsaWNlbnNlIGRvY3VtZW50LCBwcm92aWRlZCB0aGF0IHRoZSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGRvZXMKbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCgogIElmIHlvdSBhZGQgdGVybXMgdG8gYSBjb3ZlcmVkIHdvcmsgaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uLCB5b3UKbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCmFkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZwp3aGVyZSB0byBmaW5kIHRoZSBhcHBsaWNhYmxlIHRlcm1zLgoKICBBZGRpdGlvbmFsIHRlcm1zLCBwZXJtaXNzaXZlIG9yIG5vbi1wZXJtaXNzaXZlLCBtYXkgYmUgc3RhdGVkIGluIHRoZQpmb3JtIG9mIGEgc2VwYXJhdGVseSB3cml0dGVuIGxpY2Vuc2UsIG9yIHN0YXRlZCBhcyBleGNlcHRpb25zOwp0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCgogIDguIFRlcm1pbmF0aW9uLgoKICBZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcgptb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKdGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIHVuZGVyIHRoZSB0aGlyZApwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuCgogIEhvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyCmxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKQpwcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kCmZpbmFsbHkgdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQKaG9sZGVyIGZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMKcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgoKICBNb3Jlb3ZlciwgeW91ciBsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMKcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCnZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKcmVjZWl2ZWQgbm90aWNlIG9mIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UgKGZvciBhbnkgd29yaykgZnJvbSB0aGF0CmNvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKeW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCgogIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCmxpY2Vuc2VzIG9mIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9yIHJpZ2h0cyBmcm9tIHlvdSB1bmRlcgp0aGlzIExpY2Vuc2UuICBJZiB5b3VyIHJpZ2h0cyBoYXZlIGJlZW4gdGVybWluYXRlZCBhbmQgbm90IHBlcm1hbmVudGx5CnJlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KCiAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCgogIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gcmVjZWl2ZSBvcgpydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCm9jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCnRvIHJlY2VpdmUgYSBjb3B5IGxpa2V3aXNlIGRvZXMgbm90IHJlcXVpcmUgYWNjZXB0YW5jZS4gIEhvd2V2ZXIsCm5vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcgptb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbwpub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIHByb3BhZ2F0aW5nIGEKY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KCiAgMTAuIEF1dG9tYXRpYyBMaWNlbnNpbmcgb2YgRG93bnN0cmVhbSBSZWNpcGllbnRzLgoKICBFYWNoIHRpbWUgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5CnJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvcnMsIHRvIHJ1biwgbW9kaWZ5IGFuZApwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCmZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgoKICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCm9yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4Kb3JnYW5pemF0aW9uLCBvciBtZXJnaW5nIG9yZ2FuaXphdGlvbnMuICBJZiBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQKd29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKdHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCmxpY2Vuc2VzIHRvIHRoZSB3b3JrIHRoZSBwYXJ0eSdzIHByZWRlY2Vzc29yIGluIGludGVyZXN0IGhhZCBvciBjb3VsZApnaXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQpDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKdGhlIHByZWRlY2Vzc29yIGhhcyBpdCBvciBjYW4gZ2V0IGl0IHdpdGggcmVhc29uYWJsZSBlZmZvcnRzLgoKICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkKbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCnJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCnNhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KCiAgMTEuIFBhdGVudHMuCgogIEEgImNvbnRyaWJ1dG9yIiBpcyBhIGNvcHlyaWdodCBob2xkZXIgd2hvIGF1dGhvcml6ZXMgdXNlIHVuZGVyIHRoaXMKTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUKd29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCgogIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcwpvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBjb250cmlidXRvciwgd2hldGhlciBhbHJlYWR5IGFjcXVpcmVkIG9yCmhlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZApieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCmJ1dCBkbyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhCmNvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiAgRm9yCnB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudApwYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKdGhpcyBMaWNlbnNlLgoKICBFYWNoIGNvbnRyaWJ1dG9yIGdyYW50cyB5b3UgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZQpwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8KbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCnByb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24uCgogIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzCmFncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAooc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvCnN1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCnBhcnR5IG1lYW5zIHRvIG1ha2Ugc3VjaCBhbiBhZ3JlZW1lbnQgb3IgY29tbWl0bWVudCBub3QgdG8gZW5mb3JjZSBhCnBhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4KCiAgSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUKdG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQpwdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAp0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvCmF2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUKcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudApsaWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKYWN0dWFsIGtub3dsZWRnZSB0aGF0LCBidXQgZm9yIHRoZSBwYXRlbnQgbGljZW5zZSwgeW91ciBjb252ZXlpbmcgdGhlCmNvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsKaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0CmNvdW50cnkgdGhhdCB5b3UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSBhcmUgdmFsaWQuCgogIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKYXJyYW5nZW1lbnQsIHlvdSBjb252ZXksIG9yIHByb3BhZ2F0ZSBieSBwcm9jdXJpbmcgY29udmV5YW5jZSBvZiwgYQpjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMKcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5Cm9yIGNvbnZleSBhIHNwZWNpZmljIGNvcHkgb2YgdGhlIGNvdmVyZWQgd29yaywgdGhlbiB0aGUgcGF0ZW50IGxpY2Vuc2UKeW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQKd29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCgogIEEgcGF0ZW50IGxpY2Vuc2UgaXMgImRpc2NyaW1pbmF0b3J5IiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHdpdGhpbgp0aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcwpjb25kaXRpb25lZCBvbiB0aGUgbm9uLWV4ZXJjaXNlIG9mIG9uZSBvciBtb3JlIG9mIHRoZSByaWdodHMgdGhhdCBhcmUKc3BlY2lmaWNhbGx5IGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZAp3b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcwppbiB0aGUgYnVzaW5lc3Mgb2YgZGlzdHJpYnV0aW5nIHNvZnR3YXJlLCB1bmRlciB3aGljaCB5b3UgbWFrZSBwYXltZW50CnRvIHRoZSB0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nCnRoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQpwYXJ0aWVzIHdobyB3b3VsZCByZWNlaXZlIHRoZSBjb3ZlcmVkIHdvcmsgZnJvbSB5b3UsIGEgZGlzY3JpbWluYXRvcnkKcGF0ZW50IGxpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yawpjb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQpmb3IgYW5kIGluIGNvbm5lY3Rpb24gd2l0aCBzcGVjaWZpYyBwcm9kdWN0cyBvciBjb21waWxhdGlvbnMgdGhhdApjb250YWluIHRoZSBjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsCm9yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCgogIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBleGNsdWRpbmcgb3IgbGltaXRpbmcKYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKb3RoZXJ3aXNlIGJlIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYXBwbGljYWJsZSBwYXRlbnQgbGF3LgoKICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KCiAgSWYgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgpvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CmV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGNvbnZleSBhCmNvdmVyZWQgd29yayBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQpub3QgY29udmV5IGl0IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8gdGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UKdG8gY29sbGVjdCBhIHJveWFsdHkgZm9yIGZ1cnRoZXIgY29udmV5aW5nIGZyb20gdGhvc2UgdG8gd2hvbSB5b3UgY29udmV5CnRoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcwpMaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCgogIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgoKICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIHlvdSBoYXZlCnBlcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKdW5kZXIgdmVyc2lvbiAzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW50byBhIHNpbmdsZQpjb21iaW5lZCB3b3JrLCBhbmQgdG8gY29udmV5IHRoZSByZXN1bHRpbmcgd29yay4gIFRoZSB0ZXJtcyBvZiB0aGlzCkxpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLApidXQgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCnNlY3Rpb24gMTMsIGNvbmNlcm5pbmcgaW50ZXJhY3Rpb24gdGhyb3VnaCBhIG5ldHdvcmsgd2lsbCBhcHBseSB0byB0aGUKY29tYmluYXRpb24gYXMgc3VjaC4KCiAgMTQuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlLgoKICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZgp0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCmJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwphZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCiAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgR05VIEdlbmVyYWwKUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIiBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUKb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCmJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCgogIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKdmVyc2lvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MKcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGEgdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdQp0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KCiAgTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQKcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQphdXRob3Igb3IgY29weXJpZ2h0IGhvbGRlciBhcyBhIHJlc3VsdCBvZiB5b3VyIGNob29zaW5nIHRvIGZvbGxvdyBhCmxhdGVyIHZlcnNpb24uCgogIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgoKICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCkFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWQpPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgpQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTQpJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgoKICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCgogIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwpXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTClRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQpHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUKVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgpEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRApQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwKRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgpTVUNIIERBTUFHRVMuCgogIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCgogIElmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZAphYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKcmV2aWV3aW5nIGNvdXJ0cyBzaGFsbCBhcHBseSBsb2NhbCBsYXcgdGhhdCBtb3N0IGNsb3NlbHkgYXBwcm94aW1hdGVzCmFuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQpjb3B5IG9mIHRoZSBQcm9ncmFtIGluIHJldHVybiBmb3IgYSBmZWUuCgogICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKCiAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwoKICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0CnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCgogIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0CnRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKc3RhdGUgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAp0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KCiAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgogICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCgogIElmIHRoZSBwcm9ncmFtIGRvZXMgdGVybWluYWwgaW50ZXJhY3Rpb24sIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQKbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgoKICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KICAgIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCiAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CiAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCgpUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHlvdXIgcHJvZ3JhbSdzIGNvbW1hbmRzCm1pZ2h0IGJlIGRpZmZlcmVudDsgZm9yIGEgR1VJIGludGVyZmFjZSwgeW91IHdvdWxkIHVzZSBhbiAiYWJvdXQgYm94Ii4KCiAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHNjaG9vbCwKaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4KRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCmludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQptYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGgKdGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsClB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiAgQnV0IGZpcnN0LCBwbGVhc2UgcmVhZAo8aHR0cDovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvd2h5LW5vdC1sZ3BsLmh0bWw+Lgo=]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdVcFV0aWxzJzsKCiRsYW5nWydoZWxwJ10gPSA8PDxFT1QKCjxoMj5Eb2N1bWVudGF0aW9uPC9oMj4KPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgc29tZSB1dGlsaXR5IG1ldGhvZHMgaGFuZHkgd2hlbiBwcm9ncmFtbWluZyBtb2R1bGVzLjwvcD4KCjxoMj5TdXBwb3J0PC9oMj4KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgdGhlIGNtcyBkZXZlbG9wbWVudCBmb3JnZSBhdCA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnIj5kZXYuY21zbWFkZXNpbXBsZS5vcmc8L2E+LjwvbGk+CjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9XCJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmdcIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi48L2xpPgo8bGk+VGhlIGF1dGhvcihzKSwgYXJub3VkIGV0IGFsbCBjYW4gc29tZXRpbWVzIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0LyNjbXNcIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvcihzKSBkaXJlY3RseS48L2xpPiAgCjwvdWw+CjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dApvZiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5saWNlbnNlPC9hPiBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+Cgo8aDI+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMj4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDExLCBBcm5vdWQgdmFuIFN1c3RlcmVuIDxhIGhyZWY9Im1haWx0bzphcm5vdWRAdXBzZXJ2aWNlLm5sIj4mbHQ7YXJub3VkQHVwc2VydmljZS5ubCZndDs8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+Cgo8c3Ryb25nPlN1cHBvcnQgbW9yZSBtb2RzIGxpa2UgdGhpczo8L3N0cm9uZz4KCjxwPgo8Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImVuY3J5cHRlZCIgdmFsdWU9Ii0tLS0tQkVHSU4gUEtDUzctLS0tLU1JSUhUd1lKS29aSWh2Y05BUWNFb0lJSFFEQ0NCendDQVFFeGdnRXdNSUlCTEFJQkFEQ0JsRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjBDQVFBd0RRWUpLb1pJaHZjTkFRRUJCUUFFZ1lBbkxXdmpZaTJjUVlDNFR4WWxTaG1iOEw4bVRmM3h3VmlKVTVreXphSlZSa0JuVy9KQkZUMFJDbzdSRkdXUVlMT0s2QkI2bmc5Nm5jMUhPYUN4bUg2aXEyTUpxU3YrRTgxMWhDTWVBOHhaN3F6SnR3Qzg2TmhGc255WW5tb3hZdFRZcS8wTmdwZC9qM1Q5TjdFOVhVMzBDRUl2Vm82QzBmeE92ZUFuS0orallqRUxNQWtHQlNzT0F3SWFCUUF3Z2N3R0NTcUdTSWIzRFFFSEFUQVVCZ2dxaGtpRzl3MERCd1FJRW1aVm9UaDZJVVdBZ2FneHl6WDlTendveU9hNGZkejkyczdacm13MTVHYnRlTGl6QW1ockNCYVVPczNTMWlWM2VOU04rMEhrVHFBdm9ESmJ2aDBrMXltalphUGswNWJVYVkxNGpzdFk4SytqcTFpU1ZUaUljSFlzeWNqVkFKT0Y3RnZOdmRQaHZmckxjdzBkV0QyWmk2bnJDQmZ1UXdqcHZiUzlCdyt6dXdqay8rVUR1QmwzUHNLbVFMVDFNN2tCSWlSU3AxbVRYdXlEK3YzYWM2Sy9FSHpvbnBaZ3JPalB0L3BmaUxmNkd0WHhIVzJnZ2dPSE1JSURnekNDQXV5Z0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjB3SGhjTk1EUXdNakV6TVRBeE16RTFXaGNOTXpVd01qRXpNVEF4TXpFMVdqQ0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMHdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTUZIVHQzOFJNeExYSnlPMlNtUytOZGw3MlQ3b0tKNHU0dXcrNmF3bnRBTFdoMDNQZXdtSUp1emJBTFNjc1RTNHNab1MxZktjaUJHb2gxMWdJZkh6eWx2a2ROZS9oSmw2Ni9SR3FyajVyRmIwOHNBQUJOVHpEVGlxcU5wSmVCc1lzL2MyYWlHb3pwdFgyUmxuQmt0SCtTVU5wQWFqVzcyNE52Mld2aGlmNnNGQWdNQkFBR2pnZTR3Z2Vzd0hRWURWUjBPQkJZRUZKYWZmTHZHYnhlOVdUOVMxd29iN0JEV1pKUnJNSUc3QmdOVkhTTUVnYk13Z2JDQUZKYWZmTHZHYnhlOVdUOVMxd29iN0JEV1pKUnJvWUdVcElHUk1JR09NUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVTF2ZFc1MFlXbHVJRlpwWlhjeEZEQVNCZ05WQkFvVEMxQmhlVkJoYkNCSmJtTXVNUk13RVFZRFZRUUxGQXBzYVhabFgyTmxjblJ6TVJFd0R3WURWUVFERkFoc2FYWmxYMkZ3YVRFY01Cb0dDU3FHU0liM0RRRUpBUllOY21WQWNHRjVjR0ZzTG1OdmJZSUJBREFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFJRmZPbGFhZ0ZybDcxK2pxNk9LaWRiV0ZTRStRNEZxUk92ZGdJT050aCs4a1NLLy9ZLzRpaHVFNFltdnpuNWNlRTNTL2lCU1FRTWp5dmIrczJUV2JRWUR3Y3AxMjlPUEliRDllcGRyNHRKT1VOaVNvanc3Qkh3WVJpUGg1OFMxeEdsRmdIRlh3ckVCYjNkZ05iTVVhK3U0cWVjdHNNQVhwVkhuRDl3SXlmbUhNWUlCbWpDQ0FaWUNBUUV3Z1pRd2dZNHhDekFKQmdOVkJBWVRBbFZUTVFzd0NRWURWUVFJRXdKRFFURVdNQlFHQTFVRUJ4TU5UVzkxYm5SaGFXNGdWbWxsZHpFVU1CSUdBMVVFQ2hNTFVHRjVVR0ZzSUVsdVl5NHhFekFSQmdOVkJBc1VDbXhwZG1WZlkyVnlkSE14RVRBUEJnTlZCQU1VQ0d4cGRtVmZZWEJwTVJ3d0dnWUpLb1pJaHZjTkFRa0JGZzF5WlVCd1lYbHdZV3d1WTI5dEFnRUFNQWtHQlNzT0F3SWFCUUNnWFRBWUJna3Foa2lHOXcwQkNRTXhDd1lKS29aSWh2Y05BUWNCTUJ3R0NTcUdTSWIzRFFFSkJURVBGdzB4TVRFd01qSXhNVEl3TXpSYU1DTUdDU3FHU0liM0RRRUpCREVXQkJSbEY3dlZYNUxYMlg1SXRZN2Ntd0EvUlpUQXRUQU5CZ2txaGtpRzl3MEJBUUVGQUFTQmdJcnlZZWtIaFNyK2ZXSGVtVS9YNnNZcWZkQnVZNDlkNytrQ0lwbWRidEtSWlMrekMvODFXaHo5UExoaHVObFdTcnhTY3ltUWV4K1ZuRmdTZ2ZyR1AxNzROendLSXM4cmRLWXlIcENoTlpsVlA3cEplQXJidHVuZFVpc3ZycGM4d1B4bHJqTkNNeFJFL3JOWEhlUG1HdXVLYnZSamkzajBuSVdma0Y2dUJ6Y08tLS0tLUVORCBQS0NTNy0tLS0tCiI+CjxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9lbl9VUy9pL2J0bi9idG5fZG9uYXRlQ0NfTEcuZ2lmIiBib3JkZXI9IjAiIG5hbWU9InN1Ym1pdCIgYWx0PSJQYXlQYWwgLSBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZSEiPgo8aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vbmxfTkwvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KPC9mb3JtPjxici8+PGJyLz4KCjxwPlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uPC9wPgo8cD5Ib3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCmluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIApzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLjwvcD4KPHA+VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKT3IgcmVhZCBpdCA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPm9ubGluZTwvYT48L3A+CgpFT1Q7CgokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gJ1V0aWxpdHkgbW9kdWxlIHRvIHN0b3JlIGdlbmVyaWMgY2xhc3NlcyBhbmQgY29kZS4nOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdVcFV0aWxzIGlzIG5vdyBpbnN0YWxsZWQnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1VwVXRpbHMgaGFzIGJlZW4gcmVtb3ZlZCc7CgoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1VwVXRpbHMnOwokbGFuZ1snaGVscCddID0gJzxoMj5Eb2N1bWVudGF0aW9uPC9oMj4NCjxwPkNlIG1vZHVsZSBmb3VybmkgZGVzIG0mZWFjdXRlO3Rob2RlcyB1dGlsaXRhaXJlcyBhcHByJmVhY3V0ZTtjaWFibGVzIHBvdXIgcHJvZ3JhbW1lciBkZXMgbW9kdWxlcy48L3A+DQoNCjxoMj5TdXBwb3J0PC9oMj4NCjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IGluY2x1ZGUgY29tbWVyY2lhbCBzdXBwb3J0LiBIb3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIGl0OjwvcD4NCjx1bD4NCjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgdGhlIGNtcyBkZXZlbG9wbWVudCBmb3JnZSBhdCA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnIj5kZXYuY21zbWFkZXNpbXBsZS5vcmc8L2E+LjwvbGk+DQo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPVwiaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnXCI+Q01TIE1hZGUgU2ltcGxlIEZvcnVtczwvYT4uPC9saT4NCjxsaT5UaGUgYXV0aG9yKHMpLCBhcm5vdWQgZXQgYWxsIGNhbiBzb21ldGltZXMgYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2Ntc1wiPkNNUyBJUkMgQ2hhbm5lbDwvYT4uPC9saT4NCjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvcihzKSBkaXJlY3RseS48L2xpPiAgDQo8L3VsPg0KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0DQpvZiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5saWNlbnNlPC9hPiBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+DQoNCjxoMj5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gyPg0KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDExLCBBcm5vdWQgdmFuIFN1c3RlcmVuIDxhIGhyZWY9Im1haWx0bzphcm5vdWRAdXBzZXJ2aWNlLm5sIj48YXJub3VkQHVwc2VydmljZS5ubD48L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+DQo8cD5UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLjwvcD4NCjxwPkhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZA0KYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlDQppbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TDQpNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4gDQpzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLjwvcD4NCjxwPlRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQpPciByZWFkIGl0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+b25saW5lPC9hPjwvcD4NCic7CiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAnTW9kdWxlIHV0aWxpdGFpcmUgcG91ciBzdG9ja2VyIGRlcyBjbGFzc2VzIGV0IGR1IGNvZGUgZyZlYWN1dGU7biZlYWN1dGU7cmlxdWUuJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnVXBVdGlscyBlc3QgbWFpbnRlbmFudCBpbnN0YWxsJmVhY3V0ZTsnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1VwVXRpbHMgYSAmZWFjdXRlO3QmZWFjdXRlOyBkJmVhY3V0ZTtzaW5zdGFsbCZlYWN1dGU7JzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1VwVXRpbHMgJzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDI+RG9jdW1lbnRhdGllPC9oMj4NCjxwPkRlemUgbW9kdWxlIGxldmVydCBlZW4gYWFudGFsICYjMDM5O3V0aWxpdHkgbWV0aG9kcyYjMDM5OyBoYW5kaWcgdm9vciBoZXQgcHJvZ3JhbW1lcmVuIHZhbiBtb2R1bGVzLjwvcD4NCg0KPGgyPlN1cHBvcnQ8L2gyPg0KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPg0KPHVsPg0KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUsIEZBUXMsIG9yIHRvIGZpbGUgYSBCdWcgUmVwb3J0IG9yIGJ1eSBjb21tZXJjaWFsIHN1cHBvcnQsIHBsZWFzZSB2aXNpdCB0aGUgY21zIGRldmVsb3BtZW50IGZvcmdlIGF0IDxhIGhyZWY9Imh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmciPmRldi5jbXNtYWRlc2ltcGxlLm9yZzwvYT4uPC9saT4NCjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9XCJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmdcIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi48L2xpPg0KPGxpPlRoZSBhdXRob3IocyksIGFybm91ZCBldCBhbGwgY2FuIHNvbWV0aW1lcyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zXCI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPg0KPGxpPkxhc3RseSwgeW91IG1heSBoYXZlIHNvbWUgc3VjY2VzcyBlbWFpbGluZyB0aGUgYXV0aG9yKHMpIGRpcmVjdGx5LjwvbGk+ICANCjwvdWw+DQo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQNCm9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPmxpY2Vuc2U8L2E+IGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4NCg0KPGgyPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDI+DQo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTEsIEFybm91ZCB2YW4gU3VzdGVyZW4gPGEgaHJlZj0ibWFpbHRvOmFybm91ZEB1cHNlcnZpY2UubmwiPjxhcm5vdWRAdXBzZXJ2aWNlLm5sPjwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4NCjxwPlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uPC9wPg0KPHA+SG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkDQphcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUNCmluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMNCk1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiANCnNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuPC9wPg0KPHA+VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQpidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCk9yIHJlYWQgaXQgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5vbmxpbmU8L2E+PC9wPg0KJzsKJGxhbmdbJ2FkbWluZGVzY3JpcHRpb24nXSA9ICdVdGlsaXR5IG1vZHVsZSB2b29yIGhldCBvcHNsYWFuIHZhbiBnZW5lcmlla2UgY2xhc3NlcyBlbiBjb2RlLic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ1VwVXRpbHMgbW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnVXBVdGlscyBpcyB2ZXJ3aWpkZXJkJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuNzM0Njg1MDUxLjEzMDg1ODIyMjMuMTMwODU4MjIyMy4xMzA4NTgyMjIzLjEnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMDg1NTU0MjUuMS4xLnV0bWNjbj0ob3JnYW5pYyl8dXRtY3NyPWdvb2dsZXx1dG1jdHI9dHJhbnNsYXRpb24gY2VudGVyIGNtc21zfHV0bWNtZD1vcmdhbmljJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/classes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/classes/baseDAO.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAgCgojICRJZDogYmFzZURBTy5jbGFzcy5waHAgMjMgMjAxMS0wOC0yOCAxNjozNTowMVogYXJub3VkICQgCgojQkVHSU5fTElDRU5TRQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENsYXNzOiBiYXNlREFPIChjKSAyMDExIGJ5IEFybm91ZCB2YW4gU3VzdGVyZW4gKGFybm91ZEB1cHNlcnZpY2UubmwpCiMKIyBUaGUgYmFzZURBTyBjbGFzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGUgdGFibGVuYW1lREFPIGNsYXNzIGV4dGVuZHMuIAojIGJhc2VEQU8gaGFzIGEgcHJpdmF0ZSBtZXRob2QgdG8gY29ubmVjdCB0aGUgZGF0YSBzb3VyY2UgbmFtZWQgY29ubmVjdFRvREIsCiMgdGhpcyBzdG9yZXMgdGhlIGNvbm5lY3Rpb24gaW4gYSBwcml2YXRlIGluc3RhbmNlIHZhcmlhYmxlICRfX2Nvbm5lY3Rpb24KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKCmFic3RyYWN0IGNsYXNzIGJhc2VEQU8gewoKICAgIHByb3RlY3RlZCAkX19jb25uZWN0aW9uOwogICAgc3RhdGljICRkZWJ1ZyA9ICcwJzsKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewogICAgICAgICR0aGlzLT5fX2Nvbm5lY3RUb0RCKCk7ICAgICAgICAKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29ubmVjdFRvREIoKSB7CiAgICAgICAgJHRoaXMtPl9fY29ubmVjdGlvbiA9IGNtc21zKCktPkdldERiKCk7ICAKICAgIH0KICAgIAogICAgLyoqIGRiX3RpbWVfc3RhbXAKICAgICAqICAKICAgICAqIEBwYXJhbSAkdW5peF90cyBzdHJpbmcgb3B0aW9uYWwgLSB1bml4IHRpbWVzdGFtcAogICAgICogQHJldHVybiAkZGJfdHMgc3RyaW5nIC0gdW5peCB0aW1lc3RhbXAgY29udmVydGVkIHRvIGRiIHRpbWVzdGFtcAogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZGJfdGltZV9zdGFtcCgkdW5peF90cyA9IE5VTEwpIHsKICAgICAgICAKICAgICAgICAkZGJfdHMgPSAnJzsKCiAgICAgICAgaWYgKCEgaXNfbnVsbCgkdW5peF90cykpIHsgICAgICAgIAogICAgICAgICAgICAkdW5peF90cyA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW14wLTktXHM6XS8nLCAnJywgJHVuaXhfdHMpKTsKICAgICAgICB9CgogICAgICAgIGlmICggaXNfbnVsbCgkdW5peF90cykgKSB7CiAgICAgICAgICAgICRkYl90cyA9IHRyaW0oJHRoaXMtPl9fY29ubmVjdGlvbi0+REJUaW1lU3RhbXAodGltZSgpKSwgIiciKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZGJfdHMgPSB0cmltKCR0aGlzLT5fX2Nvbm5lY3Rpb24tPkRCVGltZVN0YW1wKCR1bml4X3RzKSwgIiciKTsgCiAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuICRkYl90czsKICAgICAgICAKICAgIH0KICAgIAogICAgLyoqIHVuaXhfdGltZV9zdGFtcAogICAgICogIAogICAgICogQHBhcmFtICRkYl90cyBzdHJpbmcgb3B0aW9uYWwgLSBkYiB0aW1lc3RhbXAKICAgICAqIEByZXR1cm4gJHVuaXhfdHMgc3RyaW5nIC0gZGJfdHMgY29udmVydGVkIHRvIHVuaXhfdHMKICAgICAqCiAgICAgKi8KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIHVuaXhfdGltZV9zdGFtcCgkZGJfdHMgPSBOVUxMKSB7CiAgICAgICAgCiAgICAgICAgJHVuaXhfdHMgPSAnJzsKICAgICAgICAKICAgICAgICBpZiAoISBpc19udWxsKCRkYl90cykpIHsKICAgICAgICAgICAgJGRiX3RzID0gdHJpbShwcmVnX3JlcGxhY2UoJy9bXjAtOV0vJywgJycsICRkYl90cykpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIGlzX251bGwoJGRiX3RzKSApIHsKICAgICAgICAgICAgJHVuaXhfdHMgPSB0aW1lKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHVuaXhfdHMgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5Vbml4VGltZVN0YW1wKCRkYl90cyk7IAogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gJHVuaXhfdHM7CiAgICAgICAgCiAgICB9CiAgICAKICAgIC8qKiBmZXRjaAogICAgICoKICAgICAqICBAcGFyYW0gJHZhbHVlIHN0cmluZyAtIAogICAgICogIEBwYXJhbSAkZGJfa2V5IHN0cmluZyAtIAogICAgICogIEByZXR1cm4gJHJvd3MgYXJyYXkgLSByZXN1bHQgc2V0CiAgICAgKgogICAgICovCiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBmZXRjaCgkdmFsdWUsICRkYl9rZXkgPSBOVUxMKSB7CiAgICAKICAgICAgICBpZiAoaXNfbnVsbCgkZGJfa2V5KSkgewogICAgICAgICAgICAkZGJfa2V5ID0gJHRoaXMtPl9wcmltYXJ5a2V5OyAgICAgICAgICAgIAogICAgICAgIH0KICAgIAogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIHskdGhpcy0+X3RhYmxlbmFtZX0gV0hFUkUgeyRkYl9rZXl9ID0gPyI7IAogICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5IFxuIjsKICAgICAgICB9CiAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJHZhbHVlKSk7CiAgICAKICAgICAgICAkcm93cyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKCRkYnJlc3VsdCAmJiAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgICAgICRyb3dzW10gPSAkcm93OwogICAgICAgIH0KICAgIAogICAgICAgIHJldHVybiAkcm93czsKICAgIAogICAgfQoKICAgIC8qKiBmZXRjaF9hbGwKICAgICAqCiAgICAgKiAgQHBhcmFtICRvcmRlcl90eXBlIHN0cmluZyAtIEFTQyB8IERFU0MgCiAgICAgKiAgQHBhcmFtICRkYl9rZXkgc3RyaW5nIC0gCiAgICAgKiAgQHJldHVybiAkcm93cyBhcnJheSAtIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKi8KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGZldGNoX2FsbCgkb3JkZXJfdHlwZSA9IE5VTEwsICRkYl9rZXkgPSBOVUxMKSB7ICAKICAgICAgICAKICAgICAgICAkYXNjX2Rlc2MgPSBhcnJheSgnQVNDJywgJ0RFU0MnKTsKICAgICAgICAKICAgICAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IjsgCiAgICAKICAgICAgICBpZiAoIWlzX251bGwoJGRiX2tleSkpIHsKICAgICAgICAgICAgJG9yZGVyX3R5cGUgPSBpbl9hcnJheSgkb3JkZXJfdHlwZSwgJGFzY19kZXNjKSA/ICRvcmRlcl90eXBlIDogJ0RFU0MnOwogICAgICAgICAgICAkZGJfa2V5ID0gdHJpbShwcmVnX3JlcGxhY2UoJy9bXmEtel9dLycsICcnLCAkZGJfa2V5KSk7CiAgICAgICAgICAgICRxdWVyeSAuPSAiIE9SREVSIEJZIHskZGJfa2V5fSB7JG9yZGVyX3R5cGV9IjsgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeSBcbiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgICAKICAgICAgICAkcm93cyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKCRkYnJlc3VsdCAmJiAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgICAgICRyb3dzW10gPSAkcm93OwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gJHJvd3M7CiAgICB9CiAgICAgICAgCiAgICAvKiogZmV0Y2hfYWxsX3doZXJlCiAgICAgKgogICAgICogIEBwYXJhbSAkb3JkZXJfdHlwZSBzdHJpbmcgLSBBU0MgfCBERVNDIAogICAgICogIEBwYXJhbSAkb3JkZXJfa2V5IHN0cmluZyAtIGtleSB0byBzb3J0IG9uCiAgICAgKiAgQHBhcmFtICR3aGVyZV9rZXkgc3RyaW5nIC0ga2V5IHRvIG1hdGNoIG9uCiAgICAgKiAgQHBhcmFtICR3aGVyZV92YWx1ZSBzdHJpbmcgLSB2YWx1ZSB0byBtYXRjaCBvbgogICAgICogIEByZXR1cm4gJHJvd3MgYXJyYXkgLSByZXN1bHQgc2V0CiAgICAgKgogICAgICovCiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBmZXRjaF9hbGxfd2hlcmUoJG9yZGVyX3R5cGUgPSBOVUxMLCAkb3JkZXJfa2V5ID0gTlVMTCwgJHdoZXJlX2tleSA9IE5VTEwsICR3aGVyZV92YWx1ZSA9IE5VTEwpIHsgIAogICAgICAgIAogICAgICAgICRhc2NfZGVzYyA9IGFycmF5KCdBU0MnLCAnREVTQycpOwogICAgICAgIAogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIHskdGhpcy0+X3RhYmxlbmFtZX0iOwogICAgICAgIAogICAgICAgIGlmICghaXNfbnVsbCgkd2hlcmVfa2V5KSAmJiAhaXNfbnVsbCgkd2hlcmVfdmFsdWUpKSB7CiAgICAgICAgICAgICR3aGVyZV9rZXkgPSB0cmltKHByZWdfcmVwbGFjZSgnL1teYS16X10vJywgJycsICR3aGVyZV9rZXkpKTsKICAgICAgICAgICAgJHF1ZXJ5IC49ICIgV0hFUkUgeyR3aGVyZV9rZXl9ID0gPyI7ICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICghaXNfbnVsbCgkb3JkZXJfa2V5KSkgewogICAgICAgICAgICAkb3JkZXJfdHlwZSA9IGluX2FycmF5KCRvcmRlcl90eXBlLCAkYXNjX2Rlc2MpID8gJG9yZGVyX3R5cGUgOiAnREVTQyc7CiAgICAgICAgICAgICRvcmRlcl9rZXkgPSB0cmltKHByZWdfcmVwbGFjZSgnL1teYS16X10vJywgJycsICRvcmRlcl9rZXkpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkb3JkZXJfa2V5ICE9ICcnKSB7CiAgICAgICAgICAgICAgICAkcXVlcnkgLj0gIiBPUkRFUiBCWSB7JG9yZGVyX2tleX0geyRvcmRlcl90eXBlfSI7IAogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnkgXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIWlzX251bGwoJHdoZXJlX2tleSkgJiYgIWlzX251bGwoJHdoZXJlX3ZhbHVlKSkgewogICAgICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJHdoZXJlX3ZhbHVlKSk7ICAgIAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHJvd3MgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIHdoaWxlICgkZGJyZXN1bHQgJiYgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewogICAgICAgICAgICAkcm93c1tdID0gJHJvdzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuICRyb3dzOwogICAgfQoKICAgIC8qKiBmZXRjaCB0aGUgdmFsdWUgb2YgdGhlIG5leHQgcHJpbWFyeV9rZXkKICAgICAqCiAgICAgKiBAcmV0dXJuICRuZXh0X3BrIC0gaW50CiAgICAgKgogICAgICovCiAgICAgCiAgICAgcHVibGljIGZ1bmN0aW9uIG5leHRfcHJpbWFyeV9rZXkoKSB7CiAgICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgTUFYKHskdGhpcy0+X3ByaW1hcnlrZXl9KSBGUk9NIHskdGhpcy0+X3RhYmxlbmFtZX0iOwogICAgICAgICAKICAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICAgcHJpbnQgIiRxdWVyeSBcbiI7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgICRuZXh0X3BrID0gICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkdldE9uZSgkcXVlcnkpOwogICAgICAgICAKICAgICAgICAgJG5leHRfcGsgPSAhaXNfbnVsbCgkbmV4dF9waykgPyAoJG5leHRfcGsgKzEpIDogMTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiAkbmV4dF9wazsKICAgICB9CiAgICAgICAgCiAgICAvKiogY291bnQKICAgICAqCiAgICAgKiBAcmV0dXJuICRjb3VudCAtIG51bWJlciBvZiByZWNvcmRzCiAgICAgKgogICAgICovCiAgICAgCiAgICAgcHVibGljIGZ1bmN0aW9uIGNvdW50KCkgewogICAgICAgICAkcXVlcnkgPSAiU0VMRUNUIENPVU5UKDEpIEZST00geyR0aGlzLT5fdGFibGVuYW1lfSI7CiAgICAgICAgIAogICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgICBwcmludCAiJHF1ZXJ5IFxuIjsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgJGNvdW50ID0gICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkdldE9uZSgkcXVlcnkpOwogICAgICAgICByZXR1cm4gJGNvdW50OwogICAgIH0KCiAgICAvKiogZGVsZXRlCiAgICAgKgogICAgICogIEBwYXJhbSAkdmFsdWUgc3RyaW5nIC0gCiAgICAgKiAgQHBhcmFtICRkYl9rZXkgc3RyaW5nIC0gCiAgICAgKiAgQHJldHVybiAkcm93cyBhcnJheSAtIHJlc3VsdCBzZXQKICAgICAqCiAgICAgKi8KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGRlbGV0ZSgkdmFsdWUsICRkYl9rZXkgPSBOVUxMKSB7CiAgICAKICAgICAgICBpZiAoaXNfbnVsbCgkZGJfa2V5KSkgewogICAgICAgICAgICAkZGJfa2V5ID0gJHRoaXMtPl9wcmltYXJ5a2V5OyAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZGJfa2V5ID0gdHJpbShwcmVnX3JlcGxhY2UoJy9bXmEtel9dLycsICcnLCAkZGJfa2V5KSk7CiAgICAKICAgICAgICAkcXVlcnkgPSAiREVMRVRFIEZST00geyR0aGlzLT5fdGFibGVuYW1lfSBXSEVSRSB7JGRiX2tleX0gPSA/IjsgCiAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnkgXG4iOwogICAgICAgIH0KICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkdmFsdWUpKTsKICAgICAgICAKICAgICAgICBpZiAoISRkYnJlc3VsdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdRdWVyeSBGYWlsZWQgJy4kdGhpcy0+X19jb25uZWN0aW9uLT5zcWwpOwogICAgICAgIH0KICAgICAgICAKICAgIH0KICAgIAogICAgLyoqIHVwZGF0ZSB3aGVyZSAKICAgICAqCiAgICAgKiAgQHBhcmFtICRrZXllZF9hcnJheSAtIGFycmF5IHdpdGgga2V5LCB2YWx1ZSBwYWlycwogICAgICogIEBwYXJhbSAkd2hlcmVfa2V5IHN0cmluZyAtIGtleSB0byBtYXRjaCBvbgogICAgICogIEBwYXJhbSAkd2hlcmVfdmFsdWUgc3RyaW5nIC0gdmFsdWUgdG8gbWF0Y2ggb24KICAgICAqICBAcmV0dXJuIE5VTEwKICAgICAqCiAgICAgKi8KICAgICAgICAgCiAgICAgcHVibGljIGZ1bmN0aW9uIHVwZGF0ZV93aGVyZSgka2V5ZWRfYXJyYXksICR3aGVyZV9rZXkgPSBOVUxMLCAkd2hlcmVfdmFsdWUgPSBOVUxMKSB7CiAgICAgICAgIAogICAgICAgICRxdWVyeSA9ICJVUERBVEUgeyR0aGlzLT5fdGFibGVuYW1lfSBTRVQgIjsKICAgICAgICAKICAgICAgICAkY29sdW1ucyA9IGFycmF5KCk7CiAgICAgICAgJHZhbHVlcyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCAoJGtleWVkX2FycmF5IGFzICRjb2x1bW4gPT4gJHZhbHVlKSB7CiAgICAgICAgCiAgICAgICAgICAgIGlmICgkY29sdW1uICE9ICR0aGlzLT5fcHJpbWFyeWtleSkgewogICAgICAgICAgICAgICAgJGNvbHVtbiA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW15hLXpfXS8nLCAnJywgJGNvbHVtbikpOwogICAgICAgICAgICAgICAgJGNvbHVtbnNbXSA9ICJ7JGNvbHVtbn0gPSA/IjsKICAgICAgICAgICAgICAgICR2YWx1ZXNbXSA9ICJ7JHZhbHVlfSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICBpZiAoIWlzX251bGwoJHdoZXJlX2tleSkgJiYgIWlzX251bGwoJHdoZXJlX3ZhbHVlKSkgewogICAgICAgICAgICAkcXVlcnkgLj0gaW1wbG9kZSgnLCAnLCAkY29sdW1ucyk7CiAgICAgICAgICAgICR3aGVyZV9rZXkgPSB0cmltKHByZWdfcmVwbGFjZSgnL1teYS16X10vJywgJycsICR3aGVyZV9rZXkpKTsKICAgICAgICAgICAgJHF1ZXJ5IC49ICIgV0hFUkUgeyR3aGVyZV9rZXl9ID0gPyI7CiAgICAgICAgICAgICR2YWx1ZXNbXSA9ICR3aGVyZV92YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcXVlcnkgLj0gaW1wbG9kZSgnLCAnLCAkY29sdW1ucyk7CiAgICAgICAgICAgICRxdWVyeSAuPSAiIFdIRVJFIHskdGhpcy0+X3ByaW1hcnlrZXl9ID0gPyI7CiAgICAgICAgICAgICR2YWx1ZXNbXSA9ICRrZXllZF9hcnJheVskdGhpcy0+X3ByaW1hcnlrZXldOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnkgXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgJHZhbHVlcyk7CiAgICAgICAgCiAgICAgICAgaWYgKCEkZGJyZXN1bHQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignUXVlcnkgRmFpbGVkICcuJHRoaXMtPl9fY29ubmVjdGlvbi0+c3FsKTsKICAgICAgICB9CiAgICAgICAgIAogICAgIH0KICAgICAgICAgICAgIAogICAgIC8qKiB1cGRhdGUKICAgICAqCiAgICAgKiAgQHBhcmFtICRrZXllZF9hcnJheSAtIGFycmF5IHdpdGgga2V5LCB2YWx1ZSBwYWlycyAKICAgICAqICBAcmV0dXJuIE5VTEwKICAgICAqCiAgICAgKi8KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIHVwZGF0ZSgka2V5ZWRfYXJyYXkpIHsKCiAgICAgICAgJHF1ZXJ5ID0gIlVQREFURSB7JHRoaXMtPl90YWJsZW5hbWV9IFNFVCAiOwogICAgICAgICAgICAgICAgCiAgICAgICAgJGNvbHVtbnMgPSBhcnJheSgpOwogICAgICAgICR2YWx1ZXMgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIGZvcmVhY2ggKCRrZXllZF9hcnJheSBhcyAkY29sdW1uID0+ICR2YWx1ZSkgewogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCRjb2x1bW4gIT0gJHRoaXMtPl9wcmltYXJ5a2V5KSB7CiAgICAgICAgICAgICAgICAkY29sdW1uID0gdHJpbShwcmVnX3JlcGxhY2UoJy9bXmEtel9dLycsICcnLCAkY29sdW1uKSk7CiAgICAgICAgICAgICAgICAkY29sdW1uc1tdID0gInskY29sdW1ufSA9ID8iOwogICAgICAgICAgICAgICAgJHZhbHVlc1tdID0gInskdmFsdWV9IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAkdmFsdWVzW10gPSAka2V5ZWRfYXJyYXlbJHRoaXMtPl9wcmltYXJ5a2V5XTsKICAgICAgICAKICAgICAgICAkcXVlcnkgLj0gaW1wbG9kZSgnLCAnLCAkY29sdW1ucyk7CiAgICAgICAgJHF1ZXJ5IC49ICIgV0hFUkUgeyR0aGlzLT5fcHJpbWFyeWtleX0gPSA/IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnkgXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgJHZhbHVlcyk7CiAgICAgICAgCiAgICAgICAgaWYgKCEkZGJyZXN1bHQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignUXVlcnkgRmFpbGVkICcuJHRoaXMtPl9fY29ubmVjdGlvbi0+c3FsKTsKICAgICAgICB9CiAgICAgICAgCiAgICB9CiAgICAKICAgIC8qKiBpbnNlcnQKICAgICAqCiAgICAgKiAgQHBhcmFtICRrZXllZF9hcnJheSAtIGFycmF5IHdpdGgga2V5LCB2YWx1ZSBwYWlycyAKICAgICAqICBAcmV0dXJuIE5VTEwKICAgICAqCiAgICAgKi8KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGluc2VydCgka2V5ZWRfYXJyYXkpIHsKICAgICAgICAKICAgICAgICAkcXVlcnkgPSAiSU5TRVJUIElOVE8geyR0aGlzLT5fdGFibGVuYW1lfSAoIjsKICAgICAgICAKICAgICAgICAkY29sdW1ucyA9IGFycmF5KCk7CiAgICAgICAgJHBsYWNlaG9sZGVycyA9IGFycmF5KCk7CiAgICAgICAgJHZhbHVlcyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgJGtleWVkX2FycmF5WyR0aGlzLT5fcHJpbWFyeWtleV0gPSAnJzsKICAgICAgICAKICAgICAgICBmb3JlYWNoICgka2V5ZWRfYXJyYXkgYXMgJGNvbHVtbiA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgaWYgKCRjb2x1bW4gIT0gJHRoaXMtPl9wcmltYXJ5a2V5KSB7CiAgICAgICAgICAgICAgICAkY29sdW1uID0gdHJpbShwcmVnX3JlcGxhY2UoJy9bXmEtel9dLycsICcnLCAkY29sdW1uKSk7CiAgICAgICAgICAgICAgICAkY29sdW1uc1tdID0gInskY29sdW1ufSI7CiAgICAgICAgICAgICAgICAkcGxhY2Vob2xkZXJzW10gPSAiPyI7CiAgICAgICAgICAgICAgICAkdmFsdWVzW10gPSAieyR2YWx1ZX0iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRxdWVyeSAuPSBpbXBsb2RlKCcsICcsICRjb2x1bW5zKTsKICAgICAgICAkcXVlcnkgLj0gIikgVkFMVUVTICgiOwogICAgICAgICRxdWVyeSAuPSBpbXBsb2RlKCcsICcsICRwbGFjZWhvbGRlcnMpLiAiKSI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5IFxuIjsKICAgICAgICAgICAgcHJpbnRfcigkdmFsdWVzKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnksICR2YWx1ZXMpOyAKCiAgICAgICAgaWYgKCEkZGJyZXN1bHQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignUXVlcnkgRmFpbGVkICcuJHRoaXMtPl9fY29ubmVjdGlvbi0+c3FsKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGluc2VydF9pZCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkluc2VydF9JRCgpOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgImluc2VydF9pZDogJGluc2VydF9pZCBcbiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiAkaW5zZXJ0X2lkOwogICAgICAgIAogICAgfQogICAgCiAgICAKfSAvLyBiYXNlREFPCgojCiMgRU9GCiMKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/classes/UpCookie.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMgJElkOiBVcENvb2tpZS5jbGFzcy5waHAgOCAyMDExLTA2LTEyIDE1OjI2OjE3WiBhcm5vdWQgJCAKCiNCRUdJTl9MSUNFTlNFCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ2xhc3M6IFVwQ29va2llIChjKSAyMDExIGJ5IEFybm91ZCB2YW4gU3VzdGVyZW4gKGFybm91ZEB1cHNlcnZpY2UubmwpCiMgQSBjbGFzcyB0byB3b3JrIHdpdGggQ29va2llcwojIAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAojIGFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKIyBNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4gCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQoKY2xhc3MgVXBDb29raWUgewoKICAgIC8qKgogICAgICogQ2xhc3MgY29uc3RydWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRleHBpcmVzIE51bWJlciBvZiBzZWNvbmRzIHVudGlsIGNvb2tpZSBleHBpcmVzCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHBhdGgKICAgICAqIEBwYXJhbSBib29sICRzZWN1cmUKICAgICAqIEBwYXJhbSBib29sICRodHRwb25seQogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGV4cGlyZXMsICRwYXRoID0gJy8nLCAkc2VjdXJlID0gRkFMU0UsICRodHRwb25seSA9IEZBTFNFKSB7CiAgICAgICAgJHRoaXMtPmV4cGlyYXRpb24gPSAkZXhwaXJlczsKICAgICAgICAkdGhpcy0+cGF0aCA9ICRwYXRoOwogICAgICAgICR0aGlzLT5kb21haW4gPSAnLicgLiAkX1NFUlZFUlsiU0VSVkVSX05BTUUiXTsKICAgICAgICAkdGhpcy0+c2VjdXJlID0gJHNlY3VyZTsKICAgICAgICAkdGhpcy0+aHR0cG9ubHkgPSAkaHR0cG9ubHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgY29va2llCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRuYW1lCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGRhdGEKICAgICAqIEBwYXJhbSBpbnQgJGV4cGlyZQogICAgICogQHJldHVybiBib29sCiAgICAgKgogICAgICovCiAgICAgCiAgICBwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZUNvb2tpZSgkbmFtZSwgJGRhdGEsICRleHBpcmUpIHsKICAgIAogICAgICAgIGlmIChoZWFkZXJzX3NlbnQoKSA9PT0gVFJVRSkgewogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfSAgICAKICAgIAogICAgICAgICRyZXQgPSBzZXRjb29raWUoJG5hbWUsICRkYXRhLCRleHBpcmUsICR0aGlzLT5wYXRoLCAkdGhpcy0+ZG9tYWluLCAkdGhpcy0+c2VjdXJlLCAkdGhpcy0+aHR0cG9ubHkpOwogICAgCiAgICAgICAgaWYgKCRyZXQgPT09IFRSVUUpIHsKICAgICAgICAgICAgaWYgKGlzX251bGwoJGRhdGEpKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkX0NPT0tJRVskbmFtZV0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJF9DT09LSUVbJG5hbWVdID0gJGRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICByZXR1cm4gJHJldDsKICAgIH0KCiAgICAvKioKICAgICAqIERlbGV0ZXMgYSBjb29raWUKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG5hbWUKICAgICAqIEByZXR1cm4gYm9vbAogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqCiAgICAgKi8KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGRlbGV0ZSgkbmFtZSkgewogICAgICAgIHJldHVybiAkdGhpcy0+dXBkYXRlQ29va2llKCRuYW1lLG51bGwsdGltZSgpIC0gMzYwMCAqIDI1KTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBjb29raWUKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG5hbWUKICAgICAqIEBwYXJhbSBtaXhlZCAkZGF0YQogICAgICogQHJldHVybiBib29sCiAgICAgKgogICAgICovCiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoJG5hbWUsICRkYXRhID0gJycpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVwZGF0ZUNvb2tpZSgkbmFtZSwgc2VyaWFsaXplKCRkYXRhKSwgdGltZSgpICsgJHRoaXMtPmV4cGlyYXRpb24pOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIGNvb2tpZQogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkbmFtZQogICAgICogQHJldHVybiBtaXhlZAogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCRuYW1lKSB7CiAgICAgICAgaWYgKCR0aGlzLT5jaGVjaygkbmFtZSkgPT09IFRSVUUpIHsKICAgICAgICAgICAgcmV0dXJuIHVuc2VyaWFsaXplKCRfQ09PS0lFWyRuYW1lXSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIHRoZSBleGlzdGFuY2Ugb2YgYSBjb29raWUKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG5hbWUKICAgICAqIEByZXR1cm4gYm9vbAogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gY2hlY2soJG5hbWUpIHsKICAgICAgICByZXR1cm4gaXNzZXQoJF9DT09LSUVbJG5hbWVdKTsKICAgIH0KICAgIAp9IC8vIFVwQ29va2llCgojCiMgRU9GCiMKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/classes/UpHelper.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMgJElkOiBVcEhlbHBlci5jbGFzcy5waHAgMjUgMjAxMS0wOS0yMSAxNjo1NTowN1ogYXJub3VkICQgCgojQkVHSU5fTElDRU5TRQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENsYXNzOiBVcEhlbHBlciAoYykgMjAxMSBieSBBcm5vdWQgdmFuIFN1c3RlcmVuIChhcm5vdWRAdXBzZXJ2aWNlLm5sKQojCiMgU29tZSBoZWxwZXIgbWV0aG9kcwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCgpjbGFzcyBVcEhlbHBlciB7CiAgICAKICAgIC8qKiAKICAgICAqIGZpbHRlciBhbiAkYXNzb2NfYXJyYXkgYnkgJGtleQogICAgICoKICAgICAqIGFsdGVybmF0aXZlIHRvOiAKICAgICAqICRmaWx0ZXJlZF9hcnJheSA9IGFycmF5X21hcCggZnVuY3Rpb24oJGl0ZW0pIHsgcmV0dXJuICRpdGVtWyduYW1lJ107IH0sICRhc3NvY19hcnJheSk7CiAgICAgKiB3aGljaCBkb2VzIG5vdCB3b3JrIG9uIHBocCA8IDUuMyAKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRrZXkKICAgICAqIEBwYXJhbSBhcnJheSAkYXNzb2NfYXJyYXkKICAgICAqIEByZXR1cm4gYXJyYXkgJGZpbHRlcmVkX2FycmF5CiAgICAgKgogICAgICovCiAgICAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXJyYXlfcGx1Y2soJGtleSwgJGFzc29jX2FycmF5KSB7CgogICAgICAgIGlmIChpc19hcnJheSgka2V5KSB8fCAhaXNfYXJyYXkoJGFzc29jX2FycmF5KSkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICB9ICAgCiAgICAKICAgICAgICAkZmlsdGVyZWRfYXJyYXkgPSBhcnJheSgpOwogICAgCiAgICAgICAgZm9yZWFjaCgkYXNzb2NfYXJyYXkgYXMgJHYpIHsKICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGtleSwgJHYpKSB7CiAgICAgICAgICAgICAgICAkZmlsdGVyZWRfYXJyYXlbXSA9ICR2WyRrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCiAgICAgICAgcmV0dXJuICRmaWx0ZXJlZF9hcnJheTsKCiAgICB9IAogICAgICAgIAogICAgLyoqIAogICAgICogY29udmVydHMgJGlucHV0IHRvIGEgbG93ZXJjYXNlIGFscGhhIG51bWVyaWMgb25seSB2YXJpYW50IAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGlucHV0IAogICAgICogQHJldHVybiBzdHJpbmcgJGxjX2FscGhhX251bQogICAgICoKICAgICAqLwogICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhbHBoYV9udW1lcmljX2xvd2VyKCRpbnB1dCkgewogICAgICAgICRpbnB1dCA9IHRyaW0oJGlucHV0KTsKICAgICAgICAkaW5wdXQgPSBwcmVnX3JlcGxhY2UoIi9bXmEtekEtWjAtOVxzX10vIiwgIiIsICRpbnB1dCk7IAogICAgICAgICRpbnB1dCA9IHByZWdfcmVwbGFjZSgnL1xzKy8nLCAnXycsICRpbnB1dCk7CiAgICAgICAgJGlucHV0ID0gcHJlZ19yZXBsYWNlKCcvX3syLH0vJywgJ18nLCAkaW5wdXQpOwogICAgICAgICRpbnB1dCA9IHN0cnRvbG93ZXIoJGlucHV0KTsKICAgICAgICAKICAgICAgICByZXR1cm4gJGlucHV0OwogICAgICAgIAogICAgfQogICAgCiAgICAgLyoqIAogICAgICogZ2VuZXJhdGUgYSByYW5kb20gcGFzc3dvcmQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAkcGFzcwogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJhbmRvbV9wYXNzd29yZCgpIHsKICAgIAogICAgICAgICRjaGFycyA9ICJhYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6MDIzNDU2Nzg5IjsKICAgICAgICBzcmFuZCgoZG91YmxlKW1pY3JvdGltZSgpKjEwMDAwMDApOwogICAgICAgICRpID0gMDsKICAgICAgICAkcGFzcyA9ICcnIDsKICAgICAgICAKICAgICAgICB3aGlsZSAoJGkgPD0gNykgewogICAgICAgICAgICAkbnVtID0gcmFuZCgpICUgMzM7CiAgICAgICAgICAgICR0bXAgPSBzdWJzdHIoJGNoYXJzLCAkbnVtLCAxKTsKICAgICAgICAgICAgJHBhc3MgPSAkcGFzcyAuICR0bXA7CiAgICAgICAgICAgICRpKys7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiAkcGFzczsKICAgIAogICAgfQogICAgCiAgICAvKiogCiAgICAgKiBnZXQgdGhlIGNsaWVudCBpcCBhZGRyZXNzIAogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZyAkaXAKICAgICAqCiAgICAgKi8KICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfaXAoICkgewogICAgICAgIAogICAgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9DTElFTlRfSVAnXSkpIHsKICAgICAgICAgICAgJGlwID0gc3RyaXBzbGFzaGVzKCRfU0VSVkVSWydIVFRQX0NMSUVOVF9JUCddKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfRk9SJ10pKSB7CiAgICAgICAgICAgICAgICAkaXAgPSBzdHJpcHNsYXNoZXMoJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfRk9SJ10pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGlwID0gc3RyaXBzbGFzaGVzKCRfU0VSVkVSWydSRU1PVEVfQUREUiddKTsgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuICRpcDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKgogICAgICogQ01TTVMgQ3JlYXRlSW5wdXREcm93ZG93biBjYW4gZ2l2ZSB0aGUgd3Jvbmcgb3B0aW9uIChrZXksIHZhbHVlKSBvcmRlcgogICAgICogVGhpcyBtZXRob2QgZG9lcyB0aGUgc2FtZSBidXQgaW4gYSByZXZlcnNlIHdheSAodmFsdWUsIGtleSkgCiAgICAgKgogICAgICogQHBhcmFtICRpbnB1dCBzdHJpbmcgLSBlbXB0eSA8c2VsZWN0Pjwvc2VsZWN0PiBib3gKICAgICAqIEBwYXJhbSAkZHJvcGRvd24gYXJyYXkgLSBhcnJheSB3aXRoIGtleSwgdmFsdWUgcGFpcnMKICAgICAqIEBwYXJhbSAkc2VsZWN0ZWQgc3RyaW5nIC0gc2VsZWN0ZWQgb3B0aW9uIAogICAgICoKICAgICAqIEByZXR1cm4gJGlucHV0IHN0cmluZyAtIG1vZGlmaWVkIGRyb3Bkb3duICAKICAgICAqCiAgICAgKi8KICAgICAgICAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbW9kaWZ5X2lucHV0X2Ryb3Bkb3duKCRpbnB1dCwgJGRyb3Bkb3duLCAkc2VsZWN0ZWQpIHsKICAgIAogICAgICAgICRkcm9wZG93bl9vcHRpb25zID0gJyc7CiAgICAgICAgJGlucHV0X3NlbGVjdGVkID0gJyc7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCAoJGRyb3Bkb3duIGFzICRrID0+ICR2KSB7CiAgICAgICAgCiAgICAgICAgICAgIGlmICgkayA9PSAkc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICRpbnB1dF9zZWxlY3RlZCA9ICcgJy4gJ3NlbGVjdGVkPSJzZWxlY3RlZCInOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGlucHV0X3NlbGVjdGVkID0gJyc7ICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICAkZHJvcGRvd25fb3B0aW9ucyAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4gY21zX2h0bWxlbnRpdGllcygkaykuICciJy4gJGlucHV0X3NlbGVjdGVkLiAnPicuIGNtc19odG1sZW50aXRpZXMoJHYpLiAnPC9vcHRpb24+JzsgICAKICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGlucHV0ID0gc3RyX3JlcGxhY2UoIjwvc2VsZWN0PiIsICRkcm9wZG93bl9vcHRpb25zLCAkaW5wdXQpLiAiPC9zZWxlY3Q+IjsKICAgICAgICAKICAgICAgICByZXR1cm4gJGlucHV0OwogICAgCiAgICB9CiAgICAKICAgIC8qKgogICAgICoKICAgICAqIENNU01TIENyZWF0ZUlucHV0U2VsZWN0TGlzdCBjYW4gZ2l2ZSB0aGUgd3Jvbmcgb3B0aW9uIChrZXksIHZhbHVlKSBvcmRlcgogICAgICogVGhpcyBtZXRob2QgZG9lcyB0aGUgc2FtZSBidXQgaW4gYSByZXZlcnNlIHdheSAodmFsdWUsIGtleSkgCiAgICAgKgogICAgICogQHBhcmFtICRpbnB1dCBzdHJpbmcgLSBlbXB0eSA8c2VsZWN0Pjwvc2VsZWN0PiBib3gKICAgICAqIEBwYXJhbSAkc2VsZWN0bGlzdCBhcnJheSAtIGFycmF5IHdpdGgga2V5LCB2YWx1ZSBwYWlycwogICAgICogQHBhcmFtICRzZWxlY3RlZCBhcnJheSAtIHNlbGVjdGVkIG9wdGlvbiAKICAgICAqCiAgICAgKiBAcmV0dXJuICRpbnB1dCBzdHJpbmcgLSBtb2RpZmllZCBzZWxlY3RsaXN0ICAKICAgICAqCiAgICAgKi8KICAgICAgICAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbW9kaWZ5X2lucHV0X3NlbGVjdGxpc3QoJGlucHV0LCAkc2VsZWN0bGlzdCwgJHNlbGVjdGVkKSB7CiAgICAKICAgICAgICAkc2VsZWN0bGlzdF9vcHRpb25zID0gJyc7CiAgICAgICAgJGlucHV0X3NlbGVjdGVkID0gJyc7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCAoJHNlbGVjdGxpc3QgYXMgJGsgPT4gJHYpIHsKICAgICAgICAKICAgICAgICAgICAgaWYgKGluX2FycmF5KCRrLCAkc2VsZWN0ZWQpKSB7CiAgICAgICAgICAgICAgICAkaW5wdXRfc2VsZWN0ZWQgPSAnICcuICdzZWxlY3RlZD0ic2VsZWN0ZWQiJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRpbnB1dF9zZWxlY3RlZCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgICRzZWxlY3RsaXN0X29wdGlvbnMgLj0gJzxvcHRpb24gdmFsdWU9IicuIGNtc19odG1sZW50aXRpZXMoJGspLiAnIicuICRpbnB1dF9zZWxlY3RlZC4gJz4nLiBjbXNfaHRtbGVudGl0aWVzKCR2KS4gJzwvb3B0aW9uPic7ICAgCiAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgICRpbnB1dCA9IHN0cl9yZXBsYWNlKCI8L3NlbGVjdD4iLCAkc2VsZWN0bGlzdF9vcHRpb25zLCAkaW5wdXQpLiAiPC9zZWxlY3Q+IjsKICAgICAgICAKICAgICAgICByZXR1cm4gJGlucHV0OwogICAgCiAgICB9CiAgICAKICAgIC8qKgogICAgICogVHVybiBhbiBhcnJheV9vZl9hcnJheSB0byBqc29uIGRhdGEgdG8gYmUgdXNlZCBpbiBkcm9wZG93bnMKICAgICAqCiAgICAgKiBAcGFyYW0gJGFfb2ZfYSBhcnJheSAtIGFycmF5X29mX2FycmF5IHdpdGggbmVzdGVkIGtleSBwYWlycwogICAgICogQHJldHVybiAkanNvbiBzdHJpbmcgLSBqYXZhc2NyaXB0IGVuY29kZWQgIAogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5X29mX2FycmF5X3RvX2pzb24oJGFfb2ZfYSA9IGFycmF5KCkpIHsKICAgICAKICAgICAgICAkanNvbiA9ICcnOwogICAgICAgIAogICAgICAgIGZvcmVhY2ggKCRhX29mX2EgYXMgJGsgPT4gJHYpIHsKICAgICAgICAgICAgJGpzb24gLj0gJ3sgcGtleTonLiAkay4gJywgJzsKICAgICAgICAKICAgICAgICAgICAgJGxlbiA9IGNvdW50KGFycmF5X2tleXMoJHYpKTsKICAgICAgICAgICAgJGNvdW50ID0gJzAnOwogICAgICAgIAogICAgICAgICAgICBmb3JlYWNoICgkdiBhcyAkc19rID0+ICRzX3YpIHsKICAgICAgICAgICAgICAgIC8vJHNfdiA9IHByZWdfcmVwbGFjZSgiL1teYS16QS1aMC05XHNdLyIsICIiLCAkc192KTsKICAgICAgICAgICAgICAgICRzX3YgPSBwcmVnX3JlcGxhY2UoIi9cJy8iLCAiIiwgJHNfdik7CiAgICAgICAgICAgICAgICAvLyRzX3YgPSBodG1sZW50aXRpZXMoJHNfdik7CiAgICAgICAgCiAgICAgICAgICAgICAgICAkanNvbiAuPSAiJHNfayIuICI6JyIuICIkc192Ii4gIicsIjsKICAgICAgICAKICAgICAgICAgICAgICAgICRjb3VudCsrOwogICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCRjb3VudCA9PSAkbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgJGpzb24gPSBzdWJzdHIoJGpzb24sIDAsIC0xKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICAkanNvbiAuPSAnfSwnOwogICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICAkanNvbiA9IHN1YnN0cigkanNvbiwgMCwgLTEpOwogICAgICAgIAogICAgICAgIHJldHVybiAkanNvbjsKICAgICAgICAKICAgIH0KICAgIAogICAgCiAgICAvKioKICAgICAqIGZsYXR0ZW4gYW4gYXJyYXkKICAgICAqCiAgICAgKiBAcGFyYW0gJGFycmF5X2luIGFycmF5CiAgICAgKiBAcmV0dXJuICRhcnJheV9vdXQgYXJyYXkKICAgICAqCiAgICAgKi8KCiAgICBmdW5jdGlvbiBhcnJheV9mbGF0KCRhcnJheV9pbikgewoKICAgICAgICAkYXJyYXlfb3V0ID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICAgZm9yZWFjaCgkYXJyYXlfaW4gYXMgJGEpIHsKICAgICAgICAgICAgIGlmIChpc19hcnJheSgkYSkpIHsKICAgICAgICAgICAgICAgICAkYXJyYXlfb3V0ID0gYXJyYXlfbWVyZ2UoJGFycmF5X291dCwgc2VsZjo6YXJyYXlfZmxhdCgkYSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoJGEpIHsKICAgICAgICAgICAgICAgICAgICAgJGFycmF5X291dFtdID0gJGE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICByZXR1cm4gJGFycmF5X291dDsKICAgIH0gCiAgICAKICAgIC8qKgogICAgICogZ2V0IGFsbCB0aGUgZmlsZXMgKHJlY3Vyc2l2ZWx5KSBvZiBhbiB1cGxvYWRzIGRpcmVjdG9yeQogICAgICogJHNvdXJjZSBzaG91bGQgYmUgaW5zaWRlIHRoZSBjb25maWd1cmVkIHVwbG9hZHNfZGlyZWN0b3J5CiAgICAgKgogICAgICogQHBhcmFtICRzb3VyY2UgLSBmdWxsX3BhdGgsIHNvdXJjZSBkaXJlY3RvcnkKICAgICAqIEByZXR1cm4gQGZpbGVzIGFycmF5IHx8IGZhbHNlIG9uIGZhaWx1cmUKICAgICAqCiAgICAgKi8KICAgICAKICAgIGZ1bmN0aW9uIGdldF91cGxvYWRzX2ZpbGVzX3JlY3Vyc2l2ZSgkc291cmNlKSB7CiAgICAKICAgICAgICAkZmlsZXMgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgICR1cGxvYWRzX3BhdGggPSBjbXNtcygpLT5jb25maWdbJ3VwbG9hZHNfcGF0aCddOwogICAgICAgIAogICAgICAgIGlmICghcHJlZ19tYXRjaCgifF4kdXBsb2Fkc19wYXRofCIsICRzb3VyY2UpICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICgkaGFuZGxlID0gb3BlbmRpcigkc291cmNlKSkgewogICAgICAgICAgICB3aGlsZSAoZmFsc2UgIT09ICgkZmlsZSA9IHJlYWRkaXIoJGhhbmRsZSkpKSB7CiAgICAgICAgICAgICAgICBpZiAoJGZpbGUgIT0gIi4iICYmICRmaWxlICE9ICIuLiIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRzb3VyY2UuJy8nLiRmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc291cmNlX3N1YiA9ICRzb3VyY2UuJy8nLiRmaWxlOwogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZXNbXSA9IHNlbGY6OmdldF91cGxvYWRzX2ZpbGVzX3JlY3Vyc2l2ZSgkc291cmNlX3N1Yik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVzW10gPSAkc291cmNlLicvJy4kZmlsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IAogICAgICAgIAogICAgICAgIGNsb3NlZGlyKCRoYW5kbGUpOwogICAgICAgIAogICAgICAgIHJldHVybiBzZWxmOjphcnJheV9mbGF0KCRmaWxlcyk7CiAgICAgICAgCiAgICB9CiAgICAgCiAgICAvKioKICAgICAqIG1ha2UgYSBkaXJlY3RvcnkgCiAgICAgKiAkZGVzdCBzaG91bGQgYmUgaW5zaWRlIHRoZSBjb25maWd1cmVkIHVwbG9hZHNfZGlyZWN0b3J5CiAgICAgKgogICAgICogQHBhcmFtICRkZXN0IC0gZnVsbF9wYXRoLCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKICAgICAqIEByZXR1cm4gdHJ1ZSB8IGZhbHNlCiAgICAgKgogICAgICovCiAgICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1ha2VfdXBsb2Fkc19kaXJlY3RvcnkoJGRlc3QpIHsKICAgIAogICAgICAgIC8vJGRlc3QgPSBwcmVnX3JlcGxhY2UoJy9bXmEtelwvXS8nLCAnJywgJGRlc3QpOwogICAgICAgIAogICAgICAgICR1cGxvYWRzX3BhdGggPSBjbXNtcygpLT5jb25maWdbJ3VwbG9hZHNfcGF0aCddOwogICAgICAgIAogICAgICAgIGlmICghcHJlZ19tYXRjaCgifF4kdXBsb2Fkc19wYXRofCIsICRkZXN0KSApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgIGlmICghaXNfZGlyKCRkZXN0KSkgewogICAgICAgICAgICAkcmVzID0gQG1rZGlyKCRkZXN0LCAwNzc3LCB0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkcmVzID09PSBmYWxzZSkgeyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiByZW5hbWUgYSBkaXJlY3RvcnkgCiAgICAgKiAkc291cmNlIGFuZCAkZGVzdCBzaG91bGQgYmUgaW5zaWRlIHRoZSBjb25maWd1cmVkIHVwbG9hZHNfZGlyZWN0b3J5CiAgICAgKgogICAgICogQHBhcmFtICRzb3VyY2UgLSBmdWxsX3BhdGgsIHNvdXJjZSBkaXJlY3RvcnkKICAgICAqIEBwYXJhbSAkZGVzdCAtIGZ1bGxfcGF0aCwgZGVzdGluYXRpb24gZGlyZWN0b3J5CiAgICAgKiBAcmV0dXJuIHRydWUgfCBmYWxzZQogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbmFtZV91cGxvYWRzX2RpcmVjdG9yeSgkc291cmNlLCAkZGVzdCkgewogICAgCiAgICAgICAgLy8kc291cmNlID0gcHJlZ19yZXBsYWNlKCcvW15hLXpcL10vJywgJycsICRzb3VyY2UpOwogICAgICAgIC8vJGRlc3QgPSBwcmVnX3JlcGxhY2UoJy9bXmEtelwvXS8nLCAnJywgJGRlc3QpOwogICAgICAgIAogICAgICAgICR1cGxvYWRzX3BhdGggPSBjbXNtcygpLT5jb25maWdbJ3VwbG9hZHNfcGF0aCddOwogICAgICAgIAogICAgICAgIGlmICghcHJlZ19tYXRjaCgifF4kdXBsb2Fkc19wYXRofCIsICRzb3VyY2UpICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICghcHJlZ19tYXRjaCgifF4kdXBsb2Fkc19wYXRofCIsICRkZXN0KSApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIWlzX2Rpcigkc291cmNlKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICghaXNfZGlyKCRkZXN0KSkgewogICAgICAgICAgICAkcmVzID0gQGNoZGlyKCRzb3VyY2UsICRkZXN0KTsKICAgICAgICAKICAgICAgICAgICAgaWYgKCRyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgIAogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgfQogICAgCiAgICB9CiAgICAKICAgIC8qKgogICAgICogcmVtb3ZlIGEgZGlyZWN0b3J5IGFuZCBpdCdzIGNvbnRlbnRzIChyZWN1cnNpdmVseSkgCiAgICAgKiAkc291cmNlIGFuZCAkZGVzdCBzaG91bGQgYmUgaW5zaWRlIHRoZSBjb25maWd1cmVkIHVwbG9hZHNfZGlyZWN0b3J5CiAgICAgKgogICAgICogQHBhcmFtICRzb3VyY2UgLSBmdWxsX3BhdGgsIHNvdXJjZSBkaXJlY3RvcnkKICAgICAqIEBwYXJhbSAkZGVzdCAtIGZ1bGxfcGF0aCwgZGVzdGluYXRpb24gZGlyZWN0b3J5CiAgICAgKiBAcmV0dXJuIHRydWUgfCBmYWxzZQogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbW92ZV91cGxvYWRzX3JlY3Vyc2l2ZSgkc291cmNlKSB7CiAgICAgICAgCiAgICAgICAgJHVwbG9hZHNfcGF0aCA9IGNtc21zKCktPmNvbmZpZ1sndXBsb2Fkc19wYXRoJ107CiAgICAgICAgCiAgICAgICAgaWYgKCFwcmVnX21hdGNoKCJ8XiR1cGxvYWRzX3BhdGh8IiwgJHNvdXJjZSkgKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGZpbGVzID0gZ2xvYigkc291cmNlIC4gJyonLCBHTE9CX01BUkspOwogICAgICAgIAogICAgICAgIGZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKICAgICAgICAgICAgaWYgKHN1YnN0ciggJGZpbGUsIC0xKSA9PSAnLycpIHsKICAgICAgICAgICAgICAgIHNlbGY6OnJlbW92ZV91cGxvYWRzX3JlY3Vyc2l2ZSgkZmlsZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChpc19kaXIoJHNvdXJjZSkpIHsKICAgICAgICAgICAgcm1kaXIoJHNvdXJjZSk7CiAgICAgICAgfQogICAKICAgIH0gCiAgICAKICAgIC8qKgogICAgICogY29weSBhIGRpcmVjdG9yeSBhbmQgaXQncyBjb250ZW50cyAocmVjdXJzaXZlbHkpIAogICAgICogJHNvdXJjZSBhbmQgJGRlc3Qgc2hvdWxkIGJlIGluc2lkZSB0aGUgY29uZmlndXJlZCB1cGxvYWRzX2RpcmVjdG9yeQogICAgICoKICAgICAqIEBwYXJhbSAkc291cmNlIC0gZnVsbF9wYXRoLCBzb3VyY2UgZGlyZWN0b3J5CiAgICAgKiBAcGFyYW0gJGRlc3QgLSBmdWxsX3BhdGgsIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQogICAgICogQHJldHVybiB0cnVlIHwgZmFsc2UKICAgICAqCiAgICAgKi8KICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb3B5X3VwbG9hZHNfcmVjdXJzaXZlKCRzb3VyY2UsICRkZXN0KSB7CiAgICAgICAgCiAgICAgICAgJHVwbG9hZHNfcGF0aCA9IGNtc21zKCktPmNvbmZpZ1sndXBsb2Fkc19wYXRoJ107CiAgICAgICAgCiAgICAgICAgaWYgKCFwcmVnX21hdGNoKCJ8XiR1cGxvYWRzX3BhdGh8IiwgJHNvdXJjZSkgKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCFwcmVnX21hdGNoKCJ8XiR1cGxvYWRzX3BhdGh8IiwgJGRlc3QpICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChpc19saW5rKCRzb3VyY2UpKSB7CiAgICAgICAgICAgIHJldHVybiBzeW1saW5rKHJlYWRsaW5rKCRzb3VyY2UpLCAkZGVzdCk7CiAgICAgICAgfQogICAgCiAgICAgICAgaWYgKGlzX2ZpbGUoJHNvdXJjZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGNvcHkoJHNvdXJjZSwgJGRlc3QpOwogICAgICAgIH0KICAgIAogICAgICAgIGlmICghaXNfZGlyKCRkZXN0KSkgewogICAgICAgICAgICBta2RpcigkZGVzdCk7CiAgICAgICAgfQogICAgCiAgICAgICAgJGRpciA9IGRpcigkc291cmNlKTsKICAgICAgICB3aGlsZSAoZmFsc2UgIT09ICRlbnRyeSA9ICRkaXItPnJlYWQoKSkgewogICAgICAgICAgICBpZiAoJGVudHJ5ID09ICcuJyB8fCAkZW50cnkgPT0gJy4uJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBzZWxmOjpjb3B5X3VwbG9hZHNfcmVjdXJzaXZlKCIkc291cmNlLyRlbnRyeSIsICIkZGVzdC8kZW50cnkiKTsKICAgICAgICB9CiAgICAKICAgICAgICAkZGlyLT5jbG9zZSgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIAogICAgfQogICAgCn0gLy8gVXBIZWxwZXIKCiMKIyBFT0YKIwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/classes/UpLogger.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMgJElkOiBVcExvZ2dlci5jbGFzcy5waHAgMjMgMjAxMS0wOC0yOCAxNjozNTowMVogYXJub3VkICQKCiNCRUdJTl9MSUNFTlNFCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ2xhc3M6IFVwTG9nZ2VyIChjKSAyMDExIGJ5IEFybm91ZCB2YW4gU3VzdGVyZW4gKGFybm91ZEB1cHNlcnZpY2UubmwpCiMgQSBjbGFzcyBmb3IgbG9nZ2luZyBzdHJpbmdzIHRvIGEgLmxvZyBmaWxlIGhhbmR5IGZvciBkZWJ1ZyBwdXJwb3NlcwojIAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAojIGFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKIyBNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4gCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQoKLyoqIAogKgogKiBAZXhhbXBsZQogKiAkbG9nID0gbmV3IFVwTG9nZ2VyKCcvbW50L3dlYi9sb2cudHh0Jyk7CiAqICRsb2ctPm1zZygkbXNnKTsKICogJGxvZy0+bXNnX3ZhbHVlKCRtc2csICR2YWx1ZSk7CiAqCiAqLwoKY2xhc3MgVXBMb2dnZXIgewogICAgICAKICAgIHByaXZhdGUgJGxvZ19maWxlOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbG9nX2ZpbGUpIHsKICAgICAgICAkdGhpcy0+bG9nX2ZpbGUgPSAkbG9nX2ZpbGU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldExvZ0ZpbGUoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sb2dfZmlsZTsKICAgIH0KCiAgICAvKioKICAgICAqIGxvZyBtc2cgdG8gZXJyb3JfbG9nCiAgICAgKgogICAgICogQHBhcmFtICRtc2cgLSBtZXNzYWdlIHRvIGxvZwogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gbXNnKCRtc2cgPSAnJykgewogICAgICAgICRkYXRlID0gZGF0ZSgnZC5tLlkgaDppOnMnKTsKICAgICAgICAkbG9nID0gImRhdGU6Ii4gJGRhdGUuICItLW1zZzoiLiAkbXNnLiJcbiI7ICAgICAgCiAgICAgICAgZXJyb3JfbG9nKCRsb2csIDMsICR0aGlzLT5sb2dfZmlsZSk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogbG9nIG1zZyBhbmQgdmFsdWUgdG8gZXJyb3JfbG9nCiAgICAgKgogICAgICogQHBhcmFtICRtc2cgLSBtZXNzYWdlIHRvIGxvZwogICAgICogQHBhcmFtICR2YWx1ZSAtIHZhbHVlIHRvIGxvZwogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gbXNnX3ZhbHVlKCRtc2cgPSAnJywgJHZhbHVlID0gJycpIHsKICAgICAgICAkZGF0ZSA9IGRhdGUoJ2QubS5ZIGg6aTpzJyk7CiAgICAgICAgJGxvZyA9ICJkYXRlOiIuICRkYXRlLiAiLS1tc2c6Ii4gJG1zZy4gIi0tdmFsdWU6Ii4gJHZhbHVlLiJcbiI7CiAgICAgICAgZXJyb3JfbG9nKCRsb2csIDMsICR0aGlzLT5sb2dfZmlsZSk7CiAgICB9CiAgICAKfSAvLyBVcExvZ2dlcgoKIwojIEVPRgojCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/classes/UpNestedTree.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAgCgojICRJZDogVXBOZXN0ZWRUcmVlLmNsYXNzLnBocCAxOSAyMDExLTA4LTA5IDA4OjIxOjI5WiBhcm5vdWQgJAoKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDbGFzczogVXBOZXN0ZWRUcmVlIChjKSAyMDExIGJ5IEFybm91ZCB2YW4gU3VzdGVyZW4gKGFybm91ZEB1cHNlcnZpY2UubmwpCiMKIyBUaGUgVXBOZXN0ZWRUcmVlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdG8gaW5zZXJ0LCBkZWxldGUsIGZldGNoIGRhdGEKIyBmcm9tIGEgdGFibGUgaG9sZGluZyBoaWVyYXJjaHkgZGF0YQojIAojIFRoZSBoaWVyYWNoeSB0YWJsZSBzaG91bGQgY29udGFpbjogaGllcmFyY2h5X2lkICh1bmlxdWUgcHJpbWFyeSBrZXkpLAojIG5hbWUsIGxmdCAoaGllcmFyY2h5IGxlZnQgdmFsdWUpLCByZ3QgKGhpZXJhcmNoeSByaWdodCB2YWx1ZSkuIAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCgpjbGFzcyBVcE5lc3RlZFRyZWUgewoKICAgIHByb3RlY3RlZCAkX19jb25uZWN0aW9uOwogICAgcHJvdGVjdGVkICRfdGFibGVuYW1lOwogICAgcHJvdGVjdGVkICRfcHJpbWFyeWtleTsKICAgIAogICAgc3RhdGljICRkZWJ1ZyA9ICcwJzsKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0YWJsZW5hbWUsICRwcmltYXJ5a2V5KSB7CiAgICAgICAgCiAgICAgICAgJHRoaXMtPl90YWJsZW5hbWUgPSAkdGFibGVuYW1lOwogICAgICAgICR0aGlzLT5fcHJpbWFyeWtleSA9ICRwcmltYXJ5a2V5OwogICAgICAgIAogICAgICAgICR0aGlzLT5fX2Nvbm5lY3RUb0RCKCk7ICAgICAgICAKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29ubmVjdFRvREIoKSB7CiAgICAgICAgJHRoaXMtPl9fY29ubmVjdGlvbiA9IGNtc21zKCktPkdldERiKCk7ICAKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBzd2FwICdvbGRfaWQnIG5vZGUgd2l0aCAnbmV3X2lkJyBub2RlCiAgICAgKgogICAgICogQHBhcmFtICRvbGRfaWQgaW50CiAgICAgKiBAcGFyYW0gJG5ld19pZCBpbnQKICAgICAqCiAgICAgKi8KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIHN3YXBfbm9kZXMoJG9sZF9pZCwgJG5ld19pZCkgewogICAgICAgIAogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIHskdGhpcy0+X3RhYmxlbmFtZX0gV0hFUkUgeyR0aGlzLT5fcHJpbWFyeWtleX0gPSA/IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRvbGRfcm93ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+R2V0Um93KCRxdWVyeSwgYXJyYXkoJG9sZF9pZCkpOwogICAgICAgICRuZXdfcm93ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+R2V0Um93KCRxdWVyeSwgYXJyYXkoJG5ld19pZCkpOwogICAgICAgIAogICAgICAgICRxdWVyeSA9ICJVUERBVEUgeyR0aGlzLT5fdGFibGVuYW1lfSBTRVQgbGZ0ID0gPywgcmd0ID0gPyBXSEVSRSB7JHRoaXMtPl9wcmltYXJ5a2V5fSA9ID8iOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeVxuIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KCRvbGRfcm93WydsZnQnXSwgJG9sZF9yb3dbJ3JndCddLCAkbmV3X2lkKSk7CiAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KCRuZXdfcm93WydsZnQnXSwgJG5ld19yb3dbJ3JndCddLCAkb2xkX2lkKSk7CiAgICAgICAgCiAgICB9CiAgICAKICAgIC8qKgogICAgICogbW92ZSAnb2xkX2lkJyBub2RlIHVuZGVyICduZXdfaWQnIG5vZGUKICAgICAqCiAgICAgKiBAcGFyYW0gJG9sZF9pZCBpbnQKICAgICAqIEBwYXJhbSAkbmV3X2lkIGludAogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gbW92ZV9vbGRfdG9fbmV3KCRvbGRfaWQsICRuZXdfaWQpIHsKICAgICAgICAKICAgICAgICAvLyAkbmV3X2lkIC0+IGxmdCArIDEgaXMgdGhlIGRlc3RpbmF0aW9uCiAgICAgICAgCiAgICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCAobGZ0ICsgMSkgQVMgZGVzdGluYXRpb24gRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IFdIRVJFIHskdGhpcy0+X3ByaW1hcnlrZXl9ID0gPyI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkcm93ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+R2V0Um93KCRxdWVyeSwgYXJyYXkoJG5ld19pZCkpOwogICAgICAgIAogICAgICAgICRkZXN0aW5hdGlvbiA9ICRyb3dbJ2Rlc3RpbmF0aW9uJ107IAogICAgICAgIAogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgKChyZ3QgLSBsZnQpICsgMSkgQVMgb2xkX3dpZHRoIEZST00geyR0aGlzLT5fdGFibGVuYW1lfSBXSEVSRSB7JHRoaXMtPl9wcmltYXJ5a2V5fSA9ID8iOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeVxuIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHJvdyA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkdldFJvdygkcXVlcnksIGFycmF5KCRvbGRfaWQpKTsKICAgICAgICAKICAgICAgICAkb2xkX3dpZHRoID0gJHJvd1snb2xkX3dpZHRoJ107CiAgICAgICAgCiAgICAgICAgLy8gUmlwIHRoaXMgdGFibGUgYSBuZXcgb2xkIHNpemVkIGhvbGUgaW5zaWRlIGNhdF9uZXcgCiAgICAgICAgCiAgICAgICAgJHF1ZXJ5ID0gIlVQREFURSB7JHRoaXMtPl90YWJsZW5hbWV9IFNFVCByZ3QgPSByZ3QgKyAkb2xkX3dpZHRoIFdIRVJFIHJndCA+PSAkZGVzdGluYXRpb24iOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeVxuIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgICAgIAogICAgICAgICRxdWVyeSA9ICJVUERBVEUgeyR0aGlzLT5fdGFibGVuYW1lfSBTRVQgbGZ0ID0gbGZ0ICsgJG9sZF93aWR0aCBXSEVSRSBsZnQgPj0gJGRlc3RpbmF0aW9uIjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgbGZ0IEFTIG9sZF9sZnQsIHJndCBBUyBvbGRfcmd0IEZST00geyR0aGlzLT5fdGFibGVuYW1lfSBXSEVSRSB7JHRoaXMtPl9wcmltYXJ5a2V5fSA9ID8iOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeVxuIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHJvdyA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkdldFJvdygkcXVlcnksIGFycmF5KCRvbGRfaWQpKTsKICAgICAgICAgIAogICAgICAgICRvbGRfbGZ0ID0gJHJvd1snb2xkX2xmdCddOwogICAgICAgICRvbGRfcmd0ID0gJHJvd1snb2xkX3JndCddOwogICAgICAgICRkaWZmID0gJGRlc3RpbmF0aW9uIC0gJG9sZF9sZnQ7CiAgICAgICAgCiAgICAgICAgLy8gTW92ZSBvbGQgYW5kIGFsbCBpbmhhYml0YW50cyB0byBuZXcgaG9sZQogICAgICAgICRxdWVyeSA9ICJVUERBVEUgeyR0aGlzLT5fdGFibGVuYW1lfSBTRVQgcmd0ID0gcmd0ICsgJGRpZmYgV0hFUkUgcmd0IEJFVFdFRU4gJG9sZF9sZnQgQU5EICRvbGRfcmd0IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgICAKICAgICAgICAkcXVlcnkgPSAiVVBEQVRFIHskdGhpcy0+X3RhYmxlbmFtZX0gU0VUIGxmdCA9IGxmdCArICRkaWZmIFdIRVJFIGxmdCBCRVRXRUVOICRvbGRfbGZ0IEFORCAkb2xkX3JndCI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSk7CiAgICAgICAgCiAgICAgICAgLy8gQ2xvc2UgdGhlIGdhcCBjcmVhdGVkIHdoZW4gd2UgbW92ZWQgb2xkCiAgICAgICAgJHF1ZXJ5ID0gIlVQREFURSB7JHRoaXMtPl90YWJsZW5hbWV9IFNFVCByZ3QgPSByZ3QgLSAkb2xkX3dpZHRoIFdIRVJFIHJndCA+PSAkb2xkX2xmdCI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSk7CiAgICAgICAgCiAgICAgICAgJHF1ZXJ5ID0gIlVQREFURSB7JHRoaXMtPl90YWJsZW5hbWV9IFNFVCBsZnQgPSBsZnQgLSAkb2xkX3dpZHRoIFdIRVJFIGxmdCA+PSAkb2xkX2xmdCI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSk7CiAgICAgICAgICAgICAKICAgIH0KICAgICAKICAgIC8qKiBkZWxldGUgcGFyZW50IG5vZGUgbm90IGl0J3MgY2hpbGRlcmVuCiAgICAgKgogICAgICogQHBhcmFtICRpZCBpbnQgLSBpZCBvZiB0aGUgbm9kZSB0byBkZWxldGUKICAgICAqIEByZXR1cm4gbm9uZQogICAgICoKICAgICAqLwogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZGVsZXRlX25vZGUoJGlkKSB7CiAgICAgICAgICAgIAogICAgICAgIC8vIGdldCBsZnQsIHJndCB2YWx1ZQogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgbGZ0LCByZ3QgRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IFdIRVJFIHskdGhpcy0+X3ByaW1hcnlrZXl9ID0gPyI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4geyR0aGlzLT5fcHJpbWFyeWtleX0gPSAkaWQgXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkcm93ID0gICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkdldFJvdygkcXVlcnksIGFycmF5KCRpZCkpOwogICAgICAgIAogICAgICAgICRsZnQgPSAkcm93WydsZnQnXTsKICAgICAgICAkcmd0ID0gJHJvd1sncmd0J107CiAgICAgICAgJHdpZHRoID0gJHJndCAtICgkbGZ0ICsgMSk7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAibGZ0OiAkbGZ0IFxuIjsKICAgICAgICAgICAgcHJpbnQgInJndDogJHJndCBcbiI7CiAgICAgICAgICAgIHByaW50ICJ3aWR0aDogJHdpZHRoIFxuIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gZGVsZXRlIHNpbmdsZSBub2RlICAKICAgICAgICAkcXVlcnkgPSAiREVMRVRFIEZST00geyR0aGlzLT5fdGFibGVuYW1lfSBXSEVSRSBsZnQgPSA/IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiBsZnQgPSAkbGZ0XG4iOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KCRsZnQpKTsKICAgICAgICAKICAgICAgICAkbmV3X3JndCA9ICgkcmd0IC0gMSk7CiAgICAgICAgJG5ld19sZnQgPSAoJGxmdCAtIDEpOwogICAgICAgIAogICAgICAgIC8vIHVwZGF0ZSByZ3QsIGxmdCBoaWVyYXJoY3kgCiAgICAgICAgJHF1ZXJ5ID0gIlVQREFURSB7JHRoaXMtPl90YWJsZW5hbWV9IFNFVCByZ3QgPSA/LCBsZnQgPSA/IFdIRVJFIGxmdCBCRVRXRUVOID8gQU5EID8iOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeVxuIG5ld19yZ3Q9ICRuZXdfcmd0LCBuZXdfbGZ0ID0gJG5ld19sZnQsIGxmdCA9ICRsZnQsIHJndCA9ICRyZ3QgXG4iOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KCRuZXdfcmd0LCAkbmV3X2xmdCwgJGxmdCwgJHJndCkpOyAgCiAgICAgICAgCiAgICAgICAgJG5ld19yZ3QgPSAoJHJndCAtIDIpOwogICAgICAgICRuZXdfbGZ0ID0gKCRsZnQgLSAyKTsKICAgICAgICAKICAgICAgICAvLyB1cGRhdGUgcmd0IGhpZXJhcmNoeQogICAgICAgICRxdWVyeSA9ICJVUERBVEUgeyR0aGlzLT5fdGFibGVuYW1lfSBTRVQgcmd0ID0gPyBXSEVSRSByZ3QgPiA/IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiBuZXdfcmd0ID0gJG5ld19yZ3QsIHJndCA9ICRyZ3RcbiI7CiAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJG5ld19yZ3QsICRyZ3QpKTsKICAgICAgICAKICAgICAgICAvLyB1cGRhdGUgbGZ0IGhpZXJhcmNoeQogICAgICAgICRxdWVyeSA9ICJVUERBVEUgeyR0aGlzLT5fdGFibGVuYW1lfSBTRVQgbGZ0ID0gPyBXSEVSRSBsZnQgPiA/IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiBuZXdfbGZ0ID0gJG5ld19sZnQsIHJndCA9ICRyZ3RcbiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkbmV3X2xmdCwgJHJndCkpOwogICAgICAgIAogICAgfQoKICAgIC8qKiAKICAgICAgKiBkZWxldGUgbGVhZiBub2RlcyBhbmQgbm9kZXMgd2l0aCBjaGlsZGVyZW4KICAgICAgKgogICAgICAqIEBwYXJhbSAkaWQgaW50IC0gbm9kZSB0byBkZWxldGUgCiAgICAgICogQHJldHVybiBub25lCiAgICAgICoKICAgICAgKi8KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGRlbGV0ZV9ub2RlX3dpdGhfY2hpbGRlcmVuKCRpZCkgewogICAgICAgIAogICAgICAgIC8vIGdldCBsZnQsIHJndCB2YWx1ZQogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgbGZ0LCByZ3QKICAgICAgICAgICAgICAgICAgICBGUk9NIHskdGhpcy0+X3RhYmxlbmFtZX0KICAgICAgICAgICAgICAgICAgICBXSEVSRSB7JHRoaXMtPl9wcmltYXJ5a2V5fSA9ID8iOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiggJHRoaXMtPl9wcmltYXJ5a2V5ID0gJGlkICkgXG4iOyAgICAgICAgICAgICAgICAKICAgICAgICB9ICAgIAogICAgICAgICAgICAKICAgICAgICAkcm93ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+R2V0Um93KCRxdWVyeSwgYXJyYXkoJGlkKSk7CiAgICAgICAgICAgIAogICAgICAgICRsZnQgPSAkcm93WydsZnQnXTsKICAgICAgICAkcmd0ID0gJHJvd1sncmd0J107CiAgICAgICAgJHdpZHRoID0gJHJndCAtICgkbGZ0ICsgMSk7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAibGZ0OiAkbGZ0IFxuIjsKICAgICAgICAgICAgcHJpbnQgInJndDogJHJndCBcbiI7CiAgICAgICAgICAgIHByaW50ICJ3aWR0aDogJHdpZHRoIFxuIjsKICAgICAgICB9ICAgIAogICAgICAgIAogICAgICAgIC8vIGRlbGV0ZSBub2RlcyAKICAgICAgICAkcXVlcnkgPSAiREVMRVRFIEZST00geyR0aGlzLT5fdGFibGVuYW1lfSBXSEVSRSBsZnQgQkVUV0VFTiA/IEFORCA/IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiBsZnQgPSAkbGZ0LCByZ3QgPSAkcmd0IFxuIjsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkbGZ0LCAkcmd0KSk7CiAgICAgICAgCiAgICAgICAgJG5ld19yZ3QgPSAoJHJndCAtICR3aWR0aCk7CiAgICAgICAgCiAgICAgICAgLy8gdXBkYXRlIHJndCB2YWx1ZSBvZiBoaWVyYXJjaHkgCiAgICAgICAgJHF1ZXJ5ID0gIlVQREFURSB7JHRoaXMtPl90YWJsZW5hbWV9IFNFVCByZ3QgPSA/IFdIRVJFIHJndCA+ID8iOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeVxuIG5ld19yZ3QgPSAkbmV3X3JndCwgcmd0ID0gJHJndFxuIjsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkbmV3X3JndCwgJHJndCkpOwogICAgICAgIAogICAgICAgICRuZXdfbGZ0ID0gKCRsZnQgLSAkd2lkdGgpOwogICAgICAgIAogICAgICAgIC8vIHVwZGF0ZSBsZnQgdmFsdWUgb2YgaGllcmFyY2h5CiAgICAgICAgJHF1ZXJ5ID0gIlVQREFURSB7JHRoaXMtPl90YWJsZW5hbWV9IFNFVCBsZnQgPSA/IFdIRVJFIGxmdCA+ID8iOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeVxuIG5ld19sZnQgPSAkbmV3X2xmdCwgcmd0ID0gJHJndFxuIjsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkbmV3X2xmdCwgJHJndCkpOwogICAgICAgICAgICAgICAKICAgIH0KCiAgICAvKiogaW5zZXJ0ICduZXcnIG5vZGUgYXMgY2hpbGQgb2YgJ29sZCcgbm9kZQogICAgICoKICAgICAqIEBwYXJhbSAkb2xkX2lkIGludCAtIGlkIG9mIHRoZSBvbGQgbm9kZQogICAgICogQHJldHVybiBub25lCiAgICAgKgogICAgICovCiAgICAKICAgIGZ1bmN0aW9uIGluc2VydF9hc19jaGlsZCgkb2xkX2lkKSB7CiAgICAgICAgICAgIAogICAgICAgIC8vIGdldCBsZnQgdmFsdWUKICAgICAKICAgICAgICAkcXVlcnkgPSAiU0VMRUNUIGxmdCBGUk9NIHskdGhpcy0+X3RhYmxlbmFtZX0gV0hFUkUgeyR0aGlzLT5fcHJpbWFyeWtleX0gPSA/IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbiggeyR0aGlzLT5fcHJpbWFyeWtleX0gPSAkb2xkX2lkICkgXG4iOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgJGxmdCA9ICAkdGhpcy0+X19jb25uZWN0aW9uLT5HZXRPbmUoJHF1ZXJ5LCBhcnJheSgkb2xkX2lkKSk7CiAgICAgICAgCiAgICAgICAgLy8gdXBkYXRlIHJndCB2YWx1ZSBvZiBoaWVyYXJjaHkKICAgICAgICAKICAgICAgICAkcXVlcnkgPSAiVVBEQVRFIHskdGhpcy0+X3RhYmxlbmFtZX0gU0VUIHJndCA9IHJndCArIDIgV0hFUkUgcmd0ID4gPyI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4obGZ0ID0gJGxmdCkgXG4iOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KCRsZnQpKTsKICAgIAogICAgICAgIC8vIHVwZGF0ZSBsZnQgdmFsdWUgb2YgaGllcmFyY2h5CiAgICAKICAgICAgICAkcXVlcnkgPSAiVVBEQVRFIHskdGhpcy0+X3RhYmxlbmFtZX0gU0VUIGxmdCA9IGxmdCArIDIgV0hFUkUgbGZ0ID4gPyI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4obGZ0ID0gJGxmdCkgXG4iOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KCRsZnQpKTsKICAgIAogICAgICAgIC8vIGluc2VydCB0aGUgbmV3IG9uZQogICAgICAgIAogICAgICAgICRuZXdfbGZ0ID0gKCRsZnQgKyAxKTsKICAgICAgICAkbmV3X3JndCA9ICgkbGZ0ICsgMik7CiAgICAKICAgICAgICAkcXVlcnkgPSAiSU5TRVJUIElOVE8geyR0aGlzLT5fdGFibGVuYW1lfShsZnQsIHJndCkgVkFMVUVTKD8sID8pIjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbigkbmV3X2xmdCwgJG5ld19yZ3QpIFxuIjsgICAgCiAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJG5ld19sZnQsICRuZXdfcmd0KSk7CiAgICAgICAgCiAgICAgICAgJGlkID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+SW5zZXJ0X0lEKCk7CiAgICAgICAgcmV0dXJuICRpZDsKICAgICAgICAKICAgICAgICAKICAgIH0KCiAgICAvKiogaW5zZXJ0IG5ldyAnbmFtZScgYWZ0ZXIgb2xkICdpZCcKICAgICAqCiAgICAgKiBAcGFyYW0gJG5ld19uYW1lIHN0cmluZwogICAgICogQHBhcmFtICRuZXdfZGVzY3JpcHRpb24gc3RyaW5nCiAgICAgKiBAcGFyYW0gJG9sZF9pZCBpbnQKICAgICAqIEByZXR1cm4gbm9uZQogICAgICoKICAgICAqLwogICAgCiAgICBmdW5jdGlvbiBpbnNlcnRfbmV3X2FmdGVyX29sZCgkb2xkX2lkKSB7CiAgICAgICAgICAgIAogICAgICAgIC8vIGdldCByZ3QgdmFsdWUgCiAgICAgICAgCiAgICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCByZ3QgRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IFdIRVJFIHskdGhpcy0+X3ByaW1hcnlrZXl9ID0gPyI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4oIHskdGhpcy0+X3ByaW1hcnlrZXl9ID0gJG9sZF9pZCkgXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkcmd0ID0gICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkdldE9uZSgkcXVlcnksIGFycmF5KCRvbGRfaWQpKTsKICAgICAgICAgICAgCiAgICAgICAgLy8gdXBkYXRlIHRoZSByZ3QgdmFsdWUgb2YgdGhlIGhpZXJhcmNoeQogICAgICAgIAogICAgICAgICRxdWVyeSA9ICJVUERBVEUgeyR0aGlzLT5fdGFibGVuYW1lfSBTRVQgcmd0ID0gcmd0ICsgMiBXSEVSRSByZ3QgPiA/IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7CiAgICAgICAgICAgIHByaW50ICIkcXVlcnlcbigkcmd0KSBcbiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkcmd0KSk7CiAgICAgICAgCiAgICAgICAgLy8gdXBkYXRlIHRoZSBsZnQgdmFsdWUgb2YgdGhlIGhpZXJhcmNoeQogICAgICAgIAogICAgICAgICRxdWVyeSA9ICJVUERBVEUgeyR0aGlzLT5fdGFibGVuYW1lfSBTRVQgbGZ0ID0gbGZ0ICsgMiBXSEVSRSBsZnQgPiA/IjsKICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7ICAgIAogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4oJHJndCkgXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJHJndCkpOwogICAgICAgIAogICAgICAgIC8vIGluc2VydCB0aGUgbmV3IG9uZQogICAgICAgIAogICAgICAgICRuZXdfbGZ0ID0gKCRyZ3QgKyAxKTsKICAgICAgICAkbmV3X3JndCA9ICgkcmd0ICsgMik7CiAgICAgICAgCiAgICAgICAgJHF1ZXJ5ID0gIklOU0VSVCBJTlRPIHskdGhpcy0+X3RhYmxlbmFtZX0obGZ0LCByZ3QpIFZBTFVFUyg/LCA/KSI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgeyAgICAKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeVxuKCRuZXdfbGZ0LCAkbmV3X3JndCkgXG4iOyAgICAKICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJG5ld19sZnQsICRuZXdfcmd0KSk7CiAgICAgICAgCiAgICAgICAgJGlkID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+SW5zZXJ0X0lEKCk7CiAgICAgICAgcmV0dXJuICRpZDsKICAgICAgICAKICAgIH0KCiAgICAvKiogZmV0Y2ggc3ViIHRyZWUgZGVwdGgKICAgICAqIAogICAgICogQHBhcmFtICRpZCBzdHJpbmcgLSBpZCBvZiB0aGUgbm9kZXMgdG8gZmV0Y2gKICAgICAqIEBwYXJhbSAkZGVwdGggaW50IC0gZnJvbSB3aGljaCBkZXB0aAogICAgICoKICAgICAqLwogICAgCiAgICBmdW5jdGlvbiBmZXRjaF9zdWJfdHJlZV9kZXB0aCgkaWQgPSBOVUxMLCAkZGVwdGggPSBOVUxMKSB7CiAgICAgICAgICAgCiAgICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCBub2RlLiosIAogICAgICAgICAgICAgICAgICAgICAgICAoQ09VTlQocGFyZW50Lm5hbWUpIC0gKHN1Yl90cmVlLmRlcHRoICsgMSkpIEFTIGRlcHRoCiAgICAgICAgICAgICAgICAgICAgRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IEFTIG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHskdGhpcy0+X3RhYmxlbmFtZX0gQVMgcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICB7JHRoaXMtPl90YWJsZW5hbWV9IEFTIHN1Yl9wYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIChTRUxFQ1Qgbm9kZS5uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ09VTlQocGFyZW50Lm5hbWUpIC0gMSkgQVMgZGVwdGgKICAgICAgICAgICAgICAgICAgICAgICAgIEZST00geyR0aGlzLT5fdGFibGVuYW1lfSBBUyBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JHRoaXMtPl90YWJsZW5hbWV9IEFTIHBhcmVudAogICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgbm9kZS5sZnQgQkVUV0VFTiBwYXJlbnQubGZ0IEFORCBwYXJlbnQucmd0CiAgICAgICAgICAgICAgICAgICAgICAgICBBTkQgbm9kZS57JHRoaXMtPl9wcmltYXJ5a2V5fSA9ID8KICAgICAgICAgICAgICAgICAgICAgICAgIEdST1VQIEJZIG5vZGUubmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgbm9kZS5sZnQKICAgICAgICAgICAgICAgICAgICAgICAgIClBUyBzdWJfdHJlZQogICAgICAgICAgICAgICAgICAgIFdIRVJFIG5vZGUubGZ0IEJFVFdFRU4gcGFyZW50LmxmdCBBTkQgcGFyZW50LnJndAogICAgICAgICAgICAgICAgICAgIEFORCBub2RlLmxmdCBCRVRXRUVOIHN1Yl9wYXJlbnQubGZ0IEFORCBzdWJfcGFyZW50LnJndAogICAgICAgICAgICAgICAgICAgIEFORCBzdWJfcGFyZW50Lm5hbWUgPSBzdWJfdHJlZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgR1JPVVAgQlkgbm9kZS57JHRoaXMtPl9wcmltYXJ5a2V5fSI7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgaWYgKCFpc19udWxsKCRkZXB0aCkpIHsKICAgICAgICAgICAgJHF1ZXJ5IC49ICIgSEFWSU5HIGRlcHRoID0gJGRlcHRoIjsKICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgJHF1ZXJ5IC49ICIgT1JERVIgQlkgbm9kZS5sZnQiOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsgICAgICAKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeSBcbiI7CiAgICAgICAgICAgIHByaW50ICJ7JHRoaXMtPl9wcmltYXJ5a2V5fTogJGlkIFxuIjsKICAgICAgICAgICAgcHJpbnQgImRlcHRoOiAkZGVwdGggXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJGlkKSk7ICAKICAgICAgICAgICAKICAgICAgICAkcm93cyA9IGFycmF5KCk7CiAgICAgICAgICAgIAogICAgICAgIHdoaWxlICgkZGJyZXN1bHQgJiYgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewogICAgICAgICAgICAkcm93c1tdID0gJHJvdzsgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgIHJldHVybiAkcm93czsKICAgICAgICAgCiAgICB9CgogICAgLyoqIGZldGNoIHRoZSBsZWFmIG5vZGVzCiAgICAgKgogICAgICogQHBhcmFtIG5vbmUKICAgICAqIEByZXR1cm4gJHJvd3MgYXJyYXkgLSBhcnJheSBjb250YWluaW5nIHRoZSBsZWFmIG5vZGVzCiAgICAgKgogICAgICovCiAgICAKICAgIGZ1bmN0aW9uIGZldGNoX2xlYWZfbm9kZXMoKSB7CiAgICAgICAgICAgIAogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgKgogICAgICAgICAgICAgICAgICAgIEZST00geyR0aGlzLT5fdGFibGVuYW1lfSAKICAgICAgICAgICAgICAgICAgICBXSEVSRSByZ3QgPSBsZnQgKyAxIjsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7IAogICAgICAgICAgICBwcmludCAiJHF1ZXJ5IFxuIjsgICAgICAgIAogICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgICAgIAogICAgICAgICRyb3dzID0gYXJyYXkoKTsKICAgICAgICAgICAgCiAgICAgICAgd2hpbGUgKCRkYnJlc3VsdCAmJiAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgICAgICRyb3dzW10gPSAkcm93OyAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgcmV0dXJuICRyb3dzOwogICAgICAgIAogICAgfQogICAgCiAgICAvKiogZmV0Y2ggdGhlIHBhcmVudF9pZCBieSBwcm92aWRpbmcgdGhlIGNoaWxkX2lkCiAgICAgKgogICAgICogQHBhcmFtICRjaGlsZF9pZCBpbnQgCiAgICAgKiBAcmV0dXJuICRpZCBpbnQgCiAgICAgKgogICAgICovCiAgICAgCiAgICAgZnVuY3Rpb24gZmV0Y2hfcGFyZW50X2lkX2J5X2NoaWxkX2lkKCRjaGlsZF9pZCkgewogICAgIAogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgKAogICAgICAgICAgICAgICAgICAgIFNFTEVDVCB7JHRoaXMtPl9wcmltYXJ5a2V5fSAKICAgICAgICAgICAgICAgICAgICBGUk9NIHskdGhpcy0+X3RhYmxlbmFtZX0gdDIgCiAgICAgICAgICAgICAgICAgICAgV0hFUkUgdDIubGZ0IDwgdDEubGZ0IEFORCB0Mi5yZ3QgPiB0MS5yZ3QgICAgCiAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgdDIucmd0LXQxLnJndCBBU0MKICAgICAgICAgICAgICAgICAgICBMSU1JVCAxCiAgICAgICAgICAgICAgICAgICAgKSBBUyBwYXJlbnRfeyR0aGlzLT5fcHJpbWFyeWtleX0KICAgICAgICAgICAgICAgIEZST00geyR0aGlzLT5fdGFibGVuYW1lfSB0MSAKICAgICAgICAgICAgICAgIFdIRVJFIHskdGhpcy0+X3ByaW1hcnlrZXl9ID0gPwogICAgICAgICAgICAgICAgT1JERVIgQlkgKHJndC1sZnQpIERFU0MiOyAKCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgewogICAgICAgICAgICBwcmludCAiJHF1ZXJ5XG4oIHskdGhpcy0+X3ByaW1hcnlrZXl9ID0gJGNoaWxkX2lkICkgXG4iOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgJGlkID0gICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkdldE9uZSgkcXVlcnksIGFycmF5KCRjaGlsZF9pZCkpOwogICAgICAgIAogICAgICAgICRpZCA9IGlzc2V0KCRpZCkgPyAkaWQgOiAnMCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuICRpZDsKCiAgICAgICAgIAogICAgIH0KICAgICAKICAgIC8qKiBmZXRjaCBmdWxsIHRyZWUgd2l0aCBwYXJlbnRfbmFtZSBhbmQgcGFyZW50X3twcmltYXJ5a2V5fQogICAgICoKICAgICAqIEBwYXJhbSBub25lCiAgICAgKiBAcmV0dXJuICRyb3dzIGFycmF5IAogICAgICogCiAgICAgKi8KICAgIAogICAgZnVuY3Rpb24gZmV0Y2hfZnVsbF90cmVlX3dpdGhfcGFyZW50KCkgewogICAgCiAgICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCAqLCAoCiAgICAgICAgICAgICAgICAgICAgU0VMRUNUIG5hbWUgCiAgICAgICAgICAgICAgICAgICAgRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IHQyIAogICAgICAgICAgICAgICAgICAgIFdIRVJFIHQyLmxmdCA8IHQxLmxmdCBBTkQgdDIucmd0ID4gdDEucmd0ICAgIAogICAgICAgICAgICAgICAgICAgIE9SREVSIEJZIHQyLnJndC10MS5yZ3QgQVNDCiAgICAgICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgICAgICkgQVMgcGFyZW50X25hbWUsCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIFNFTEVDVCBoaWVyYXJjaHlfaWQgCiAgICAgICAgICAgICAgICAgICAgRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IHQyIAogICAgICAgICAgICAgICAgICAgIFdIRVJFIHQyLmxmdCA8IHQxLmxmdCBBTkQgdDIucmd0ID4gdDEucmd0ICAgIAogICAgICAgICAgICAgICAgICAgIE9SREVSIEJZIHQyLnJndC10MS5yZ3QgQVNDCiAgICAgICAgICAgICAgICAgICAgTElNSVQgMQogICAgICAgICAgICAgICAgICAgICkgQVMgcGFyZW50X3skdGhpcy0+X3ByaW1hcnlrZXl9CiAgICAgICAgICAgICAgICAgICAgRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IHQxIAogICAgICAgICAgICAgICAgT1JERVIgQlkgKHJndC1sZnQpIERFU0MiOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsgICAgIAogICAgICAgICAgICBwcmludCAiJHF1ZXJ5IFxuIjsgICAgICAgICAgICAgICAgCiAgICAgICAgfSAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgICAKICAgICAgICAkcm93cyA9IGFycmF5KCk7CiAgICAgICAgICAgIAogICAgICAgIHdoaWxlICgkZGJyZXN1bHQgJiYgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewogICAgICAgICAgICAkcm93c1tdID0gJHJvdzsgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgIHJldHVybiAkcm93czsKICAgICAgICAKICAgIH0KCiAgICAvKiogZmV0Y2ggdGhlIGZ1bGwgdHJlZSBkcm9wZG93bgogICAgICoKICAgICAqIEBwYXJhbSBub25lCiAgICAgKiBAcmV0dXJuICRyb3dzIGFycmF5IAogICAgICogCiAgICAgKi8KICAgIAogICAgZnVuY3Rpb24gZmV0Y2hfZnVsbF90cmVlX2Ryb3Bkb3duKCkgewogICAgICAgICAgICAKICAgICAgICAkcXVlcnkgPSAiU0VMRUNUIG5vZGUuKiwKICAgICAgICAgICAgICAgICAgICAgICAgKENPVU5UKHBhcmVudC5uYW1lKSAtIDEpIEFTIGRlcHRoLAogICAgICAgICAgICAgICAgICAgICAgICBDT05DQVQoIFJFUEVBVCgnLScsIENPVU5UKHBhcmVudC5uYW1lKSAtIDEpKSBBUyBpbmRlbnQKICAgICAgICAgICAgICAgICAgRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IEFTIG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHskdGhpcy0+X3RhYmxlbmFtZX0gQVMgcGFyZW50CiAgICAgICAgICAgICAgICAgIFdIRVJFIG5vZGUubGZ0IEJFVFdFRU4gcGFyZW50LmxmdCBBTkQgcGFyZW50LnJndAogICAgICAgICAgICAgICAgICBHUk9VUCBCWSBub2RlLm5hbWUKICAgICAgICAgICAgICAgICAgT1JERVIgQlkgbm9kZS5sZnQiOwogICAgICAgIAogICAgICAgIGlmIChzZWxmOjokZGVidWcpIHsgICAgIAogICAgICAgICAgICBwcmludCAiJHF1ZXJ5IFxuIjsgICAgICAgICAgICAgICAgCiAgICAgICAgfSAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICRkYnJlc3VsdCA9ICR0aGlzLT5fX2Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgICAKICAgICAgICAkcm93cyA9IGFycmF5KCk7CiAgICAgICAgICAgIAogICAgICAgIHdoaWxlICgkZGJyZXN1bHQgJiYgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewogICAgICAgICAgICAkcm93c1skcm93WydoaWVyYXJjaHlfaWQnXV0gPSAkcm93WydpbmRlbnQnXS4gJyAnLiRyb3dbJ25hbWUnXTsgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgIHJldHVybiAkcm93czsKICAgICAgICAKICAgIH0KICAgIAoKICAgIC8qKiBmZXRjaCB0aGUgZnVsbCB0cmVlIHdpdGggYSAnZGVwdGgnIGtleQogICAgICoKICAgICAqIEBwYXJhbSBub25lCiAgICAgKiBAcmV0dXJuICRyb3dzIGFycmF5IAogICAgICogCiAgICAgKi8KICAgIAogICAgZnVuY3Rpb24gZmV0Y2hfZnVsbF90cmVlX3dpdGhfZGVwdGgoKSB7CiAgICAgICAgICAgIAogICAgICAgICRxdWVyeSA9ICJTRUxFQ1Qgbm9kZS4qLAogICAgICAgICAgICAgICAgICAgICAgICAoQ09VTlQocGFyZW50Lm5hbWUpIC0gMSkgQVMgZGVwdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIENPTkNBVCggUkVQRUFUKCctJywgQ09VTlQocGFyZW50Lm5hbWUpIC0gMSkpIEFTIGluZGVudAogICAgICAgICAgICAgICAgICBGUk9NIHskdGhpcy0+X3RhYmxlbmFtZX0gQVMgbm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgeyR0aGlzLT5fdGFibGVuYW1lfSBBUyBwYXJlbnQKICAgICAgICAgICAgICAgICAgV0hFUkUgbm9kZS5sZnQgQkVUV0VFTiBwYXJlbnQubGZ0IEFORCBwYXJlbnQucmd0CiAgICAgICAgICAgICAgICAgIEdST1VQIEJZIG5vZGUubmFtZQogICAgICAgICAgICAgICAgICBPUkRFUiBCWSBub2RlLmxmdCI7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgeyAgICAgCiAgICAgICAgICAgIHByaW50ICIkcXVlcnkgXG4iOyAgICAgICAgICAgICAgICAKICAgICAgICB9ICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgICAgIAogICAgICAgICRyb3dzID0gYXJyYXkoKTsKICAgICAgICAgICAgCiAgICAgICAgd2hpbGUgKCRkYnJlc3VsdCAmJiAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgICAgICRyb3dzW10gPSAkcm93OyAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgcmV0dXJuICRyb3dzOwogICAgICAgIAogICAgfQogICAgCiAgICAvKiogZmV0Y2ggdHJlZSBmcm9tIHN0YXJ0bm9kZSB0byBsZWFmbm9kZQogICAgICoKICAgICAqIEBwYXJhbSAkaWQgaW50IC0gaWQgb2YgdGhlIG5vZGUgIAogICAgICogQHJldHVybiAkcm93cyBhcnJheSAtIG5vZGUgcGF0aCBpdGVtcwogICAgICoKICAgICAqLwogICAgCiAgICBmdW5jdGlvbiBmZXRjaF90cmVlX2Zyb21fc3RhcnRub2RlKCRpZCA9IE5VTEwpIHsKICAgICAgICAKICAgICAgICAkcXVlcnkgPSAiU0VMRUNUIHBhcmVudC4qCiAgICAgICAgICAgICAgICAgICAgRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IEFTIG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHskdGhpcy0+X3RhYmxlbmFtZX0gQVMgcGFyZW50CiAgICAgICAgICAgICAgICAgICAgV0hFUkUgbm9kZS5sZnQgQkVUV0VFTiBwYXJlbnQubGZ0IEFORCBwYXJlbnQucmd0CiAgICAgICAgICAgICAgICAgICAgQU5EIG5vZGUueyR0aGlzLT5fcHJpbWFyeWtleX0gPSA/CiAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgcGFyZW50LmxmdCI7CiAgICAgICAgICAgCiAgICAgICAgaWYgKHNlbGY6OiRkZWJ1ZykgeyAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgcHJpbnQgIiRxdWVyeSBcbiI7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICBwcmludCAiJHRoaXMtPl9wcmltYXJ5a2V5OiAkaWQgXG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZGJyZXN1bHQgPSAkdGhpcy0+X19jb25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJGlkKSk7CiAgICAgICAgCiAgICAgICAgJHJvd3MgPSBhcnJheSgpOwogICAgICAgICAgICAKICAgICAgICB3aGlsZSAoJGRicmVzdWx0ICYmICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkpIHsKICAgICAgICAgICAgJHJvd3NbXSA9ICRyb3c7ICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICByZXR1cm4gJHJvd3M7CiAgICAgICAgCiAgICB9CiAgICAgICAgCiAgICAvKiogZmV0Y2ggdHJlZSBmcm9tIGxlYWZub2RlIHRvIHN0YXJ0bm9kZQogICAgICoKICAgICAqIEBwYXJhbSAkaWQgaW50IC0gaWQgb2YgdGhlIG5vZGUKICAgICAqIEByZXR1cm4gJHJvdyBhcnJheSAgLSBub2RlIHBhdGggaXRlbXMKICAgICAqCiAgICAgKi8KICAgIAogICAgZnVuY3Rpb24gZmV0Y2hfdHJlZV9mcm9tX2xlYWZub2RlKCRpZCA9IE5VTEwpIHsKICAgICAgICAKICAgICAgICAkZGIgPSBjbXNtcygpLT5HZXREYigpOwogICAgICAgIAogICAgICAgICRxdWVyeSA9ICJTRUxFQ1Qgbm9kZS4qCiAgICAgICAgICAgICAgICAgICAgRlJPTSB7JHRoaXMtPl90YWJsZW5hbWV9IEFTIG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHskdGhpcy0+X3RhYmxlbmFtZX0gQVMgcGFyZW50CiAgICAgICAgICAgICAgICAgICBXSEVSRSBub2RlLmxmdCBCRVRXRUVOIHBhcmVudC5sZnQgQU5EIHBhcmVudC5yZ3QKICAgICAgICAgICAgICAgICAgIEFORCBwYXJlbnQueyR0aGlzLT5fcHJpbWFyeWtleX0gPSA/CiAgICAgICAgICAgICAgICAgICBPUkRFUiBCWSBub2RlLmxmdCI7CiAgICAKICAgICAgICBpZiAoc2VsZjo6JGRlYnVnKSB7ICAgCiAgICAgICAgICAgIHByaW50ICIkcXVlcnkgXG4iOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgcHJpbnQgIiR0aGlzLT5fcHJpbWFyeWtleTogJGlkIFxuIjsKICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgJGRicmVzdWx0ID0gJHRoaXMtPl9fY29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KCRpZCkpOyAgICAgICAgICAgICAgICAKICAgICAgICAKICAgICAgICAkcm93cyA9IGFycmF5KCk7CiAgICAgICAgICAgIAogICAgICAgIHdoaWxlICgkZGJyZXN1bHQgJiYgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewogICAgICAgICAgICAkcm93c1tdID0gJHJvdzsgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgIHJldHVybiAkcm93czsKICAgICAgICAKICAgIH0gIAoKICAgIC8qKiByZW5kZXIgaGllcmFyY2h5IHRyZWUgdG8gaHRtbCBsaXN0cyAobGkgd2lsbCBiZSBjbG9zZWQgYWZ0ZXIgZXZlcnkgaXRlbSkKICAgICAqIAogICAgICogQHBhcmFtICR0cmVlIGFycmF5IC0gdHJlZSB0byByZW5kZXIKICAgICAqIEByZXR1cm4gJHJlc3VsdCBzdHJpbmcgLSBodG1sIHdpdGggcmVuZGVyZWQgdWwsIGxpCiAgICAgKgogICAgICovCiAgICAKICAgIGZ1bmN0aW9uIHJlbmRlcl90cmVlX2Nsb3NlZF9saSgkdHJlZSwgJGN1cnJlbnRfZGVwdGggPSAtMSwgJGNvdW50ZXIgPSAxKSB7CiAgICAgICAgCiAgICAgICAgJG5vZGUgPSBhcnJheV9zaGlmdCgkdHJlZSk7CiAgICAgICAgICAgIAogICAgICAgICRub2RlX2hpZXJhcmNoeV9pZCAgPSAkbm9kZVsnaGllcmFyY2h5X2lkJ107CiAgICAgICAgJG5vZGVfbGZ0ICAgICAgICAgICA9ICRub2RlWydsZnQnXTsKICAgICAgICAkbm9kZV9yZ3QgICAgICAgICAgID0gJG5vZGVbJ3JndCddOwogICAgICAgICRub2RlX25hbWUgICAgICAgICAgPSAkbm9kZVsnbmFtZSddOwogICAgICAgICRub2RlX2RlcHRoICAgICAgICAgPSAkbm9kZVsnZGVwdGgnXTsKICAgICAgICAkbm9kZV9pbmRlbnQgICAgICAgID0gJG5vZGVbJ2luZGVudCddOwogICAgICAgIAogICAgICAgICRyZXN1bHQgPSAnJzsKICAgICAgICAKICAgICAgICBpZiAoJG5vZGVfZGVwdGggPiAkY3VycmVudF9kZXB0aCkgewogICAgICAgICAgICBpZiAoJGNvdW50ZXIgPT0gMSkgewogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAiPHVsIGNsYXNzPVwic29ydGFibGVMaXN0IHNvcnRhYmxlXCI+XG4iOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAiPHVsPlxuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoJG5vZGVfZGVwdGggPCAkY3VycmVudF9kZXB0aCkgewogICAgICAgICAgICAkcmVzdWx0IC49IHN0cl9yZXBlYXQoIjwvdWw+XG4iLCAkY3VycmVudF9kZXB0aCAtICRub2RlX2RlcHRoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHJlc3VsdCAuPSAiXG4gPGxpIGlkPVwibGlzdF8kbm9kZV9oaWVyYXJjaHlfaWRcIj48ZGl2IGNsYXNzPVwibGFiZWxcIj48c3Bhbj4mbmJzcDs8L3NwYW4+JGNvdW50ZXIoJG5vZGVfaGllcmFyY2h5X2lkKTombmJzcDskbm9kZV9uYW1lIDxlbT4oJG5vZGVfbmFtZSk8L2VtPjwvZGl2PjwvbGk+XG4iOwogICAgICAgICAgICAKICAgICAgICAkY291bnRlcisrOwogICAgICAgIAogICAgICAgIGlmICghZW1wdHkoJHRyZWUpKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gIHNlbGY6OnJlbmRlcl90cmVlX2Nsb3NlZF9saSgkdHJlZSwgJG5vZGVfZGVwdGgsICRjb3VudGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0IC49IHN0cl9yZXBlYXQoIjwvdWw+XG4iLCAkbm9kZV9kZXB0aCk7CiAgICAgICAgICAgICRyZXN1bHQgLj0gIjwvdWw+XG4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICAKICAgIH0KICAgIAogICAgLyoqIHJlbmRlciBoaWVyYXJjaHkgdHJlZSB0byBodG1sIGxpc3RzIChsaSB3aWxsIG5vdCBiZSBjbG9zZWQgZGlyZWN0bHkgLi4uCiAgICAgKiB3aWxsIHN0YXkgb3BlbiB0aWxsIGN1cnJlbnQgbGV2ZWwgaXMgY2xvc2VkKSAKICAgICAqCiAgICAgKiBAcGFyYW0gJHRyZWUgYXJyYXkgLSB0cmVlIHRvIHJlbmRlcgogICAgICogQHJldHVybiAkcmVzdWx0IHN0cmluZyAtIGh0bWwgd2l0aCByZW5kZXJlZCB1bCwgbGkKICAgICAqCiAgICAgKi8KICAgIAogICAgZnVuY3Rpb24gcmVuZGVyX3RyZWVfb3Blbl9saSgkdHJlZSkgewogICAgCiAgICAgICAgJGN1cnJlbnRfZGVwdGggPSAwOwogICAgICAgICRjb3VudGVyID0gMDsKICAgICAgICAKICAgICAgICAkcmVzdWx0ID0gJzx1bCBjbGFzcz0ic29ydGFibGVMaXN0IHNvcnRhYmxlIj4nOwogICAgICAgIAogICAgICAgIGZvcmVhY2ggKCR0cmVlIGFzICRub2RlKSB7IAogICAgICAgICAgICAKICAgICAgICAgICAgJG5vZGVfaGllcmFyY2h5X2lkICA9ICRub2RlWydoaWVyYXJjaHlfaWQnXTsKICAgICAgICAgICAgJG5vZGVfbGZ0ICAgICAgICAgICA9ICRub2RlWydsZnQnXTsKICAgICAgICAgICAgJG5vZGVfcmd0ICAgICAgICAgICA9ICRub2RlWydyZ3QnXTsKICAgICAgICAgICAgJG5vZGVfbmFtZSAgICAgICAgICA9ICRub2RlWyduYW1lJ107CiAgICAgICAgICAgICRub2RlX2RlcHRoICAgICAgICAgPSAkbm9kZVsnZGVwdGgnXTsKICAgICAgICAgICAgJG5vZGVfaW5kZW50ICAgICAgICA9ICRub2RlWydpbmRlbnQnXTsKICAgIAogICAgICAgICAgICBpZiAoJG5vZGVfZGVwdGggPT0gJGN1cnJlbnRfZGVwdGgpIHsKICAgICAgICAgICAgICAgIGlmICgkY291bnRlciA+IDApIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICI8L2xpPlxuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlaWYgKCRub2RlX2RlcHRoID4gJGN1cnJlbnRfZGVwdGgpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gIlxuPHVsPlxuIjsgICAKICAgICAgICAgICAgICAgICRjdXJyZW50X2RlcHRoID0gJGN1cnJlbnRfZGVwdGggKyAoJG5vZGVfZGVwdGggLSAkY3VycmVudF9kZXB0aCk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkbm9kZV9kZXB0aCA8ICRjdXJyZW50X2RlcHRoKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49IHN0cl9yZXBlYXQoJzwvbGk+PC91bD4nLCRjdXJyZW50X2RlcHRoIC0gJG5vZGVfZGVwdGgpLiI8L2xpPlxuIjsKICAgICAgICAgICAgICAgICRjdXJyZW50X2RlcHRoID0gJGN1cnJlbnRfZGVwdGggLSAoJGN1cnJlbnRfZGVwdGggLSAkbm9kZV9kZXB0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgICRyZXN1bHQgLj0gIlxuIDxsaSBpZD1cImxpc3RfJG5vZGVfaGllcmFyY2h5X2lkIi4gIlwiPjxkaXYgY2xhc3M9XCJsYWJlbFwiPjxzcGFuPiZuYnNwOzwvc3Bhbj4kY291bnRlcigkbm9kZV9oaWVyYXJjaHlfaWQpOiZuYnNwOyRub2RlX25hbWUgPGVtPigkbm9kZV9uYW1lKTwvZW0+PC9kaXY+IjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICArKyRjb3VudGVyOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkcmVzdWx0IC49IHN0cl9yZXBlYXQoIjwvbGk+XG48L3VsPlxuIiwkbm9kZV9kZXB0aCkuIjwvbGk+XG4iOwogICAgCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAKICAgIH0gICAgCiAgICAKICAgIC8qKgogICAgICogbWFrZSBuZXN0ZWQgYXJyYXkgZnJvbSB1bm5lc3RlZCBoaWVyYXJjaHkgYXJyYXkKICAgICAqCiAgICAgKiBAcGFyYW0gJGhpZXJhcmNoeV9hcnJheSBhcnJheSAtIHVubmVzdGVkIGFycmF5IHdpdGggaGllcmFyY2h5IGl0ZW1zCiAgICAgKiBAcGFyYW0gJGRlcHRoX2tleSBzdHJpbmcgLSB0aGUgbmFtZSBvZiB0aGUga2V5IGNvbnRhaW5pbmcgdGhlIGRlcHRoIGludAogICAgICogQHJldHVybiAkbmVzdGVkIGFycmF5IC0gbmVzdGVkIGFycmF5IHdpdGggaGllcmFyY2h5IGl0ZW1zIAogICAgICoKICAgICAqLwogICAgCiAgICBmdW5jdGlvbiBuZXN0aWZ5KCRoaWVyYXJjaHlfYXJyYXksICRkZXB0aF9rZXkgPSAnZGVwdGgnKSB7CiAgICAgICAgCiAgICAgICAgJG5lc3RlZCA9IGFycmF5KCk7CiAgICAgICAgJGRlcHRocyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCggJGhpZXJhcmNoeV9hcnJheSBhcyAkayA9PiAkdiApIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKCAkdlskZGVwdGhfa2V5XSA9PSAwICkgewogICAgICAgICAgICAgICAgJG5lc3RlZFska10gPSAkdjsKICAgICAgICAgICAgICAgICRkZXB0aHNbJHZbJGRlcHRoX2tleV0gKyAxXSA9ICRrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHBhcmVudCA9JiAkbmVzdGVkOwogICAgICAgICAgICAgICAgZm9yKCAkaSA9IDE7ICRpIDw9ICggJHZbJGRlcHRoX2tleV0gKTsgJGkrKyApIHsKICAgICAgICAgICAgICAgICAgICAkcGFyZW50ID0mICRwYXJlbnRbJGRlcHRoc1skaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICAgICAgJHBhcmVudFska10gPSAkdjsKICAgICAgICAgICAgICAgICRkZXB0aHNbJHZbJGRlcHRoX2tleV0gKyAxXSA9ICRrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiAkbmVzdGVkOwogICAgICAgIAogICAgfQoKfSAvLyBVcE5lc3RlZFRyZWUKCiMKIyBFT0YKIwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/classes/UpSmarty.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMgJElkOiBVcFNtYXJ0eS5jbGFzcy5waHAgMTggMjAxMS0wOC0wOCAxNToyNTo1M1ogYXJub3VkICQgCgojQkVHSU5fTElDRU5TRQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENsYXNzOiBVcFNtYXJ0eSAoYykgMjAxMSBieSBBcm5vdWQgdmFuIFN1c3RlcmVuIChhcm5vdWRAdXBzZXJ2aWNlLm5sKQojCiMgU29tZSBtZXRob2RzIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSBTbWFydHkgdGVtcGxhdGUgZW5naW5lCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKCmNsYXNzIFVwU21hcnR5IHsKCiAgICB2YXIgJF9tb2R1bGU7CgogICAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1vZHVsZSkgewogICAgICAgICR0aGlzLT5fbW9kdWxlID0gJG1vZHVsZTsKICAgIH0KICAgIAogICAgLyoqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNhbGwgbGFuZyBzdHJpbmcgZnJvbSB3aXRoaW4gU21hcnR5CiAgICAgKgogICAgICogQHBhcmFtICRuYW1lIHN0cmluZyAtIGxhbmcgYWxpYXMKICAgICAqIEBwYXJhbSAkcGFyYW1zIHN0cmluZyAtIGNvbW1hIGRlbGltaXRlZCBsYW5nIGFsaWFzCiAgICAgKiBAcmV0dXJuICRsYW5nIHN0cmluZyAtIGludGVybmF0aW9uYWxpemVkIGxhbmcgCiAgICAgKgogICAgICogQGV4YW1wbGUgeyR1cHNtYXJ0eS0+bGFuZygnc19zX2FscmVhZHlnaXZlbicsICdmaXJzdF9uYW1lICwgbGFzdF9uYW1lJyl9IAogICAgICoKICAgICAqLwoKICAgIHB1YmxpYyBmdW5jdGlvbiBsYW5nKCRuYW1lLCAkcGFyYW1zPScnKSB7CiAgICAgICAgCiAgICAgICAgJHBhcmFtcyA9IHByZWdfcmVwbGFjZSgnL1xzKy8nLCAnJywgJHBhcmFtcyk7CiAgICAgICAgJHBhcmFtcyA9IGV4cGxvZGUoIiwiLCAkcGFyYW1zKTsKICAgICAgICAKICAgICAgICAkc21hcnR5ID0gY21zbXMoKS0+R2V0U21hcnR5KCk7CiAgICAgICAgCiAgICAgICAgJHN1YnN0aXR1dGUgPSBhcnJheSgpOwogICAgICAgICRfc3Vic3RpdHV0ZSA9ICcnOwogICAgICAgIAogICAgICAgIGZvcmVhY2ggKCRwYXJhbXMgYXMgJGsgPT4gJHYpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvXnY6LycsICR2KSkgewogICAgICAgICAgICAgICAgJHZfYXJyYXkgPSBleHBsb2RlKCc6JywgJHYpOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICR2ID0gJHNtYXJ0eS0+Z2V0X3RlbXBsYXRlX3ZhcnMoJHZfYXJyYXlbMV0pOwogICAgICAgICAgICAgICAgJF9zdWJzdGl0dXRlID0gIiR2IjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJHN1YnN0aXR1dGUsICR0aGlzLT5fbW9kdWxlLT5MYW5nKCR2KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCFlbXB0eSgkX3N1YnN0aXR1dGUpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+X21vZHVsZS0+TGFuZygkbmFtZSwgJF9zdWJzdGl0dXRlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPl9tb2R1bGUtPkxhbmcoJG5hbWUsICRzdWJzdGl0dXRlKTsgICAKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKfSAvLyBVcFNtYXJ0eQoKIwojIEVPRgojCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/classes/UpUpload.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KIyAkSWQ6IFVwVXBsb2FkLmNsYXNzLnBocCAxOSAyMDExLTA4LTA5IDA4OjIxOjI5WiBhcm5vdWQgJA0KDQojQkVHSU5fTElDRU5TRQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ2xhc3M6IFVwVXBsb2FkIChjKSAyMDExIGJ5IEFybm91ZCB2YW4gU3VzdGVyZW4gKGFybm91ZEB1cHNlcnZpY2UubmwpDQojIEEgY2xhc3MgZm9yIHVwbG9hZGluZyBmaWxlcw0KIyANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQNCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlDQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMNCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIA0KIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMDQojDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KI0VORF9MSUNFTlNFDQoNCmNsYXNzIFVwVXBsb2FkIHsNCiAgICANCiAgICBzdGF0aWMgJGRlYnVnID0gJzAnOw0KCQ0KCXByaXZhdGUgJHVwbG9hZF9ob29rID0gYXJyYXkoKTsNCgkNCiAgICBwcml2YXRlICRhcmdzID0gYXJyYXkgKA0KICAgICAgICAndXBsb2FkX2ZpbGUnCQk9PglOVUxMLA0KICAgICAgICAndXBsb2FkX2RpcmVjdG9yeScJPT4JTlVMTCwNCiAgICAgICAgJ2FsbG93ZWRfc2l6ZScJCT0+CTUxMjAwMCwJCQkJCQkNCiAgICAgICAgJ2V4dGVuc2lvbl9jaGVjaycJPT4JVFJVRSwNCiAgICAgICAgJ3VwbG9hZF9vdmVyd3JpdGUnCT0+CUZBTFNFLA0KICAgICk7DQoJDQogICAgcHJpdmF0ZSAkYWxsb3dlZF9leHRlbnNpb25zID0gYXJyYXkgKA0KICAgICk7DQoJDQoNCiAgICAvKioNCiAgICAgKiBjb25zdHJ1Y3Rvcg0KICAgICAqDQogICAgICogQHBhcmFtIGFycmF5ICRhcmdzDQogICAgICogQHBhcmFtIGFycmF5ICRhbGxvd2VkX2V4dGVuc2lvbnMNCiAgICAgKg0KICAgICAqLw0KCQ0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsNCgl9DQoJDQogICAgLyoqDQogICAgICogcHJpbnQgdmFyaWFibGUgaW4gcmVhZGFibGUgZm9ybWF0DQogICAgICoNCiAgICAgKiBAcGFyYW0gc3RyaW5nfGFycmF5fG9iamVjdCAkdmFyDQogICAgICoNCiAgICAgKi8NCgkNCglwdWJsaWMgZnVuY3Rpb24gcHJpbnRfdmFyKCR2YXIpIHsgCQ0KCQllY2hvICI8cHJlPiI7DQogICAgCXByaW50X3IoJHZhcik7DQogICAJIAllY2hvICI8L3ByZT4iOw0KCX0NCgkNCiAgICAvKioNCiAgICAgKiB1cGRhdGUgZGVmYXVsdCBhcmd1bWVudHMNCiAgICAgKiBpdCB3aWxsIHVwZGF0ZSBkZWZhdWx0IGFycmF5IG9mIGNsYXNzIGkuZSAkYXJncw0KICAgICAqDQogICAgICogQHBhcmFtIGFycmF5ICRhcmdzIC0gaW5wdXQgYXJndW1lbnRzDQogICAgICogQHBhcmFtIGFycmF5ICRkZWZhdHVscyAtIGRlZmF1bHQgYXJndW1lbnRzIA0KICAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAgKg0KICAgICAqLw0KCQ0KCXByaXZhdGUgZnVuY3Rpb24gcGFyc2VfYXJncyggJGFyZ3MgPSBhcnJheSgpLCAkZGVmYXVsdHMgPSBhcnJheSgpICkgeyANCgkJcmV0dXJuIGFycmF5X21lcmdlKCAkZGVmYXVsdHMsICRhcmdzICk7CSANCgl9DQoJDQogICAgLyoqDQogICAgICogZ2V0IGV4dGVuc2lvbiBhbmQgbmFtZSBvZiBmaWxlDQogICAgICoNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlX25hbWUgDQogICAgICogQHJldHVybiBhcnJheSAtIGhhdmluZyBmaWxlX25hbWUgYW5kIGZpbGVfZXh0DQogICAgICoNCiAgICAgKi8NCgkNCglwcml2YXRlIGZ1bmN0aW9uIGdldF9leHRlbnNpb24oJGZpbGVfbmFtZSkgew0KCQkkdGVtcCA9IGFycmF5KCk7DQoJCSR0ZW1wWydmaWxlX25hbWUnXSA9IHN0cnRvbG93ZXIoIHN1YnN0ciggJGZpbGVfbmFtZSwgMCwgc3Rycmlwb3MoICRmaWxlX25hbWUsICcuJyApICkgKTsNCgkgICAgJHRlbXBbJ2ZpbGVfZXh0ZW5zaW9uJ10gPSBzdHJ0b2xvd2VyKCBzdWJzdHIoICRmaWxlX25hbWUsIHN0cnJpcG9zKCAkZmlsZV9uYW1lLCAnLicgKSArIDEgKSApOw0KCQlyZXR1cm4gJHRlbXA7DQoJfQ0KCQ0KICAgIC8qKg0KICAgICAqIGdldCBzYWZlIHN0cmluZw0KICAgICAqDQogICAgICogQHBhcmFtIHN0cmluZyAkdmFyIA0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICoNCiAgICAgKi8NCiAgICAgICAgDQoJcHVibGljIGZ1bmN0aW9uIHNhZmVfc3RyaW5nKCAkdmFyID0gIiIsICRzZXBhcmF0b3IgPSAiIiApIHsNCgkJcmV0dXJuIHByZWdfcmVwbGFjZSgnfFteYS16QS1aMC05X118Jywkc2VwYXJhdG9yLCR2YXIpOw0KCX0NCgkNCiAgICAvKioNCiAgICAgKiBnZXQgZXJyb3Igc3RhdHVzIG9mIHVwbG9hZGVkIGZpbGUNCiAgICAgKg0KICAgICAqIEBwYXJhbSBpbnRlZ2VyICRlcnJvcl9jb2RlDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKg0KICAgICAqLw0KCQ0KCXByaXZhdGUgZnVuY3Rpb24gdXBsb2FkX2Vycm9yKCAkZXJyb3JfY29kZSApIHsNCgkJDQoJCXN3aXRjaCAoICRlcnJvcl9jb2RlICkgew0KCQkgICANCgkJICAgY2FzZSBVUExPQURfRVJSX09LOg0KCQkJICAgCSRlcnJvciA9ICJBbGwgT0siOw0KCQkJICAgCWJyZWFrOw0KCQkgICANCgkJICAgY2FzZSBVUExPQURfRVJSX0lOSV9TSVpFOg0KCQkJICAgCSRlcnJvciA9ICJUaGUgdXBsb2FkZWQgZmlsZSBleGNlZWRzIHRoZSB1cGxvYWRfbWF4X2ZpbGVzaXplIGRpcmVjdGl2ZSAoIi5pbmlfZ2V0KCJ1cGxvYWRfbWF4X2ZpbGVzaXplIikuIikgaW4gcGhwLmluaS4iOw0KCQkJICAgCWJyZWFrOw0KCQkgICANCgkJICAgY2FzZSBVUExPQURfRVJSX0ZPUk1fU0laRToNCgkJCSAgIAkkZXJyb3IgPSAiVGhlIHVwbG9hZGVkIGZpbGUgZXhjZWVkcyB0aGUgTUFYX0ZJTEVfU0laRSBkaXJlY3RpdmUgdGhhdCB3YXMgc3BlY2lmaWVkIGluIHRoZSBIVE1MIGZvcm0uIjsNCgkJCSAgIAlicmVhazsNCgkJICAgDQoJCSAgIGNhc2UgVVBMT0FEX0VSUl9QQVJUSUFMOg0KCQkJCSRlcnJvciA9ICJUaGUgdXBsb2FkZWQgZmlsZSB3YXMgb25seSBwYXJ0aWFsbHkgdXBsb2FkZWQuIjsNCgkJCSAgIAlicmVhazsNCgkJICAgDQoJCSAgIGNhc2UgVVBMT0FEX0VSUl9OT19GSUxFOg0KCQkJCSRlcnJvciA9ICJObyBmaWxlIHdhcyB1cGxvYWRlZC4iOw0KCQkJICAgCWJyZWFrOw0KCQkgICANCgkJICAgY2FzZSBVUExPQURfRVJSX05PX1RNUF9ESVI6DQoJCQkJJGVycm9yID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyLiI7DQoJCQkgICAJYnJlYWs7DQoJCSAgIA0KCQkgICBjYXNlIFVQTE9BRF9FUlJfQ0FOVF9XUklURToNCgkJCQkkZXJyb3IgPSAiRmFpbGVkIHRvIHdyaXRlIGZpbGUgdG8gZGlzay4iOw0KCQkJICAgCWJyZWFrOw0KCQkgICANCgkJICAgZGVmYXVsdDoNCgkJCQkkZXJyb3IgPSAiVW5rbm93biBFcnJvci4iOw0KCQkNCgkJfQ0KCQkNCgkJcmV0dXJuICRlcnJvcjsNCgkJDQoJfQ0KCQ0KCS8qKg0KCSAqIHNldCBkZWZhdWx0IGFyZ3VtZW50cw0KCSAqIGl0IHdpbGwgc2V0IGRlZmF1bHQgYXJyYXkgb2YgY2xhc3MgaS5lICRhcmdzDQoJICoNCgkgKiBAcGFyYW0gYXJyYXkgJGFyZ3MNCgkgKiBAcmV0dXJuIDANCgkgKg0KCSAqLw0KCQ0KCXByaXZhdGUgZnVuY3Rpb24gc2V0X2FyZ3MoICRhcmdzID0gYXJyYXkoKSApIHsgDQoJCQ0KCQkkZGVmYXVsdHMgPSAkdGhpcy0+Z2V0X2FyZ3MoKTsNCgkJJGFyZ3MgPSAkdGhpcy0+cGFyc2VfYXJncyggJGFyZ3MsICRkZWZhdWx0cyApOw0KCQkkdGhpcy0+YXJncyA9ICRhcmdzOwkgDQoJfQ0KCQ0KICAgIC8qKg0KICAgICAqIGdldCBkZWZhdWx0IGFyZ3VtZW50cw0KICAgICAqIGl0IHdpbGwgZ2V0IGRlZmF1bHQgYXJyYXkgb2YgY2xhc3MgaS5lICRhcmdzDQogICAgICoNCiAgICAgKiBAcmV0dXJuIGFycmF5DQogICAgICoNCiAgICAgKi8NCgkNCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2FyZ3MoKSB7IA0KCQlyZXR1cm4gJHRoaXMtPmFyZ3M7CSANCgl9DQoJDQogICAgLyoqDQogICAgICogc2V0IGRlZmF1bHQgYWxsb3dlZCBleHRlbnNpb25zDQogICAgICogaXQgd2lsbCBzZXQgZGVmYXVsdCBhcnJheSBvZiBjbGFzcyBpLmUgJGFsbG93ZWRfZXh0ZW5zaW9ucw0KICAgICAqDQogICAgICogQHBhcmFtIGFycmF5ICRhbGxvd2VkX2V4dGVuc2lvbnMNCiAgICAgKiBAcmV0dXJuIDANCiAgICAgKg0KICAgICAqLw0KCQ0KCXByaXZhdGUgZnVuY3Rpb24gc2V0X2FsbG93ZWRfZXh0ZW5zaW9ucyggJGFsbG93ZWRfZXh0ZW5zaW9ucyA9IGFycmF5KCkgKSB7IA0KCQkNCgkJJGRlZmF1bHRzID0gJHRoaXMtPmdldF9hbGxvd2VkX2V4dGVuc2lvbnMoKTsNCgkJJGFsbG93ZWRfZXh0ZW5zaW9ucyA9ICR0aGlzLT5wYXJzZV9hcmdzKCAkYWxsb3dlZF9leHRlbnNpb25zLCAkZGVmYXVsdHMgKTsNCgkJJHRoaXMtPmFsbG93ZWRfZXh0ZW5zaW9ucyA9ICRhbGxvd2VkX2V4dGVuc2lvbnM7CSANCgkNCgl9DQoJDQogICAgLyoqDQogICAgICogZ2V0IGRlZmF1bHQgYWxsb3dlZCBleHRlbnNpb25zDQogICAgICogaXQgd2lsbCBnZXQgZGVmYXVsdCBhcnJheSBvZiBjbGFzcyBpLmUgJGFsbG93ZWRfZXh0ZW5zaW9ucw0KICAgICAqDQogICAgICogQHJldHVybiBhcnJheQ0KICAgICAqDQogICAgICovDQogICAgICAgIA0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfYWxsb3dlZF9leHRlbnNpb25zKCkgeyANCgkJcmV0dXJuICR0aGlzLT5hbGxvd2VkX2V4dGVuc2lvbnM7CSANCgl9DQoJDQogICAgLyoqDQogICAgICogc2V0IHVwbG9hZCB2YXINCiAgICAgKiBpdCB3aWxsIHNldCB1cGxvYWQgdmFyaWFibGUNCiAgICAgKg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHVwbG9hZF9kaXJlY3RvcnkNCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICAgKg0KICAgICAqLw0KCQ0KCXByaXZhdGUgZnVuY3Rpb24gc2V0X3VwbG9hZF92YXIoICRmaWxlcyApIHsgDQoJCQ0KCQkkdGVtcCA9IGFycmF5KCk7DQoJCSRmaWxlc191cGxvYWRfYXR0cmlidXRlcyA9IGFycmF5KCAnbmFtZScsICd0eXBlJywgJ3RtcF9uYW1lJywgJ2Vycm9yJywgJ3NpemUnICk7DQoJCQ0KCQlpZiAoc2VsZjo6JGRlYnVnKSB7DQoJCSAgICAkdGhpcy0+cHJpbnRfdmFyKCRmaWxlcyk7DQoJCX0gDQoJCQ0KCQkkdXBsb2FkX2ZpbGVzID0gY291bnQoICRmaWxlc1snbmFtZSddICk7DQoJCSR1cGxvYWRfZmlsZXMgPSAoICFlbXB0eSggJHVwbG9hZF9maWxlcyApICkgPyAkdXBsb2FkX2ZpbGVzIDogMCA7IA0KCQkNCgkJJGZvcmVhY2hpbmRleCA9IDA7DQoJCWZvciggJGkgPSAxOyAkaSA8PSAkdXBsb2FkX2ZpbGVzOyAkaSsrICkgew0KCQkJCQkNCgkJICAgIC8vIHVwbG9hZFtdIGFzIGFycmF5DQoJCSAgICANCgkJICAgIGlmIChpc19hcnJheSgkZmlsZXNbJ25hbWUnXSkpIHsNCgkJICAgIA0KICAgICAgICAgICAgICAgIGZvcmVhY2goICRmaWxlc191cGxvYWRfYXR0cmlidXRlcyBhcyAkdmFsICkgewkJCQkNCiAgICAgICAgICAgICAgICAgICAgJHRlbXBbJGldWyR2YWxdID0gICRmaWxlc1skdmFsXVskZm9yZWFjaGluZGV4XTsJDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmKCAkdmFsID09ICJlcnJvciIgKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGVtcFskaV1bJ2Vycm9yX3N0YXR1cyddID0gJHRoaXMtPnVwbG9hZF9lcnJvciggJGZpbGVzWyR2YWxdWyRmb3JlYWNoaW5kZXhdICk7DQogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIH0NCgkJCQ0KCQkJfSBlbHNlaWYgKGlzX3N0cmluZygkZmlsZXNbJ25hbWUnXSkpIHsNCgkJCSAgICANCgkJCSAgICAvLyB1cGxvYWQgYXMgc3RyaW5nDQoJCQkgICAgDQogICAgICAgICAgICAgICAgZm9yZWFjaCggJGZpbGVzX3VwbG9hZF9hdHRyaWJ1dGVzIGFzICR2YWwgKSB7CQkJCQ0KICAgICAgICAgICAgICAgICAgICAkdGVtcFskaV1bJHZhbF0gPSAgJGZpbGVzWyR2YWxdOwkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgaWYoICR2YWwgPT0gImVycm9yIiApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wWyRpXVsnZXJyb3Jfc3RhdHVzJ10gPSAkdGhpcy0+dXBsb2FkX2Vycm9yKCAkZmlsZXNbJHZhbF0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB9DQoJCQkgICAgDQoJCQl9DQoJCQkNCgkJCSsrJGZvcmVhY2hpbmRleDsNCgkJCQ0KCQl9DQoJCQ0KCQlyZXR1cm4gJHRlbXA7DQoJCQkJIA0KCX0NCgkNCiAgICAvKioNCiAgICAgKiBnZXQgdXBsb2FkIHZhciAoZ2V0dGVyIGFuZCBzZXR0ZXI/KQ0KICAgICAqDQogICAgICogQHBhcmFtIGFycmF5ICRmaWxlcw0KICAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAgKg0KICAgICAqLw0KCQ0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfdXBsb2FkX3ZhciggJGZpbGVzID0gYXJyYXkoKSApIHsgDQoJCXJldHVybiAkdGhpcy0+c2V0X3VwbG9hZF92YXIoICRmaWxlcyApOw0KCX0NCgkNCiAgICAvKioNCiAgICAgKiBjaGVjayBpZiAkdXBsb2FkX2RpcmVjdG9yeSBpcyBkaXJlY3RvcnkNCiAgICAgKg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHVwbG9hZF9kaXJlY3RvcnkNCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICAgKg0KICAgICAqLw0KCQ0KCXByaXZhdGUgZnVuY3Rpb24gaXNfZGlyZWN0b3J5X3BhdGgoICR1cGxvYWRfZGlyZWN0b3J5ICkgeyANCgkJDQoJCWlmKCBpc19kaXIoICR1cGxvYWRfZGlyZWN0b3J5ICkgKSB7DQoJCQlyZXR1cm4gMTsNCgkJfQ0KCQkNCgkJcmV0dXJuIDA7DQoJCQkgDQoJfQ0KCQ0KICAgIC8qKg0KICAgICAqDQogICAgICogY2hlY2sgaWYgJHVwbG9hZF9kaXJlY3RvcnkgaXMgd3JpdGFibGUNCiAgICAgKiAgICANCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1cGxvYWRfZGlyZWN0b3J5DQogICAgICogQHJldHVybiBib29sZWFuDQogICAgICoNCiAgICAgKi8NCgkNCglwcml2YXRlIGZ1bmN0aW9uIGlzX2RpcmVjdG9yeV93cml0YWJsZSggJHVwbG9hZF9kaXJlY3RvcnkgKSB7IA0KCQkNCgkJaWYoIGlzX3dyaXRhYmxlKCAkdXBsb2FkX2RpcmVjdG9yeSApICkgew0KCQkJcmV0dXJuIDE7DQoJCX0NCgkJDQoJCXJldHVybiAwOw0KCQkJIA0KCX0NCgkNCgkvKioNCgkgKiBzZXQgdXBsb2FkIGhvb2sNCgkgKg0KCSAqIEBwYXJhbSBhcnJheSAkdmFyDQoJICoNCgkgKi8NCgkNCglwcml2YXRlIGZ1bmN0aW9uIHNldF91cGxvYWRfaG9vayggJHZhciA9IGFycmF5KCkgKSB7IAkJDQoJCSR0aGlzLT51cGxvYWRfaG9vayA9ICR2YXI7CQkJIA0KCX0NCgkNCiAgICAvKioNCiAgICAgKiBnZXQgdXBsb2FkIGhvb2sNCiAgICAgKg0KICAgICAqIEBwYXJhbSBhcnJheSAkdmFyDQogICAgICoNCiAgICAgKi8NCgkNCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3VwbG9hZF9ob29rKCkgeyAJCQ0KCQlyZXR1cm4gJHRoaXMtPnVwbG9hZF9ob29rOwkJCSANCgl9DQoJDQogICAgLyoqDQogICAgICoNCiAgICAgKiBzZXQgdXBsb2FkDQogICAgICogaXQgd2lsbCB1cGxvYWQgZmlsZS4NCiAgICAgKg0KICAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAgKg0KICAgICAqLw0KCQ0KCXB1YmxpYyBmdW5jdGlvbiBzZXRfdXBsb2FkKCAkYXJncywgJGFsbG93ZWRfZXh0ZW5zaW9ucyApIHsgDQoJCQ0KCQkkdGhpcy0+c2V0X2FyZ3MoICRhcmdzICk7DQoJCSRhcmdzID0gJHRoaXMtPmdldF9hcmdzKCk7DQoJCQ0KCQlpZiAoc2VsZjo6JGRlYnVnKSB7DQoJCSAgICAkdGhpcy0+cHJpbnRfdmFyKCRhcmdzKTsNCgkJfQ0KCQkNCgkJZXh0cmFjdCggJGFyZ3MgKTsNCgkJDQoJCSR0aGlzLT5zZXRfYWxsb3dlZF9leHRlbnNpb25zKCAkYWxsb3dlZF9leHRlbnNpb25zICk7DQoJCSRhbGxvd2VkX2V4dGVuc2lvbnMgPSAkdGhpcy0+Z2V0X2FsbG93ZWRfZXh0ZW5zaW9ucygpOw0KCQkNCgkJaWYgKHNlbGY6OiRkZWJ1Zykgew0KCQkgICAgJHRoaXMtPnByaW50X3ZhcigkYWxsb3dlZF9leHRlbnNpb25zKTsNCgkJfSANCgkJDQoJCSR0ZW1wID0gYXJyYXkoKTsNCgkJJHRlbXBbJ3VwbG9hZF9kaXJlY3RvcnknXSA9ICJJbnZhbGlkIC0gIiAuICR1cGxvYWRfZGlyZWN0b3J5Ow0KCQkkdGVtcFsndXBsb2FkX2RpcmVjdG9yeV93cml0YWJsZSddID0gIkludmFsaWQgLSBEaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlIjsNCgkJJHRlbXBbJ3VwbG9hZF9maWxlX2V4dGVuc2lvbiddID0gIkludmFsaWQgLSBFeHRlbnNpb24gaXMgbm90IGFsbG93ZWQiOw0KCQkkdGVtcFsndXBsb2FkX2ZpbGVfc2l6ZSddID0gIkludmFsaWQgLSBTaXplICIgLiAkdXBsb2FkX2ZpbGVbJ3NpemUnXSAuICIgYnl0ZXMiOw0KCQkkdGVtcFsndXBsb2FkX3Byb2Nlc3MnXSA9IDA7DQoJCSR0ZW1wWyd1cGxvYWRfbW92ZSddID0gRkFMU0U7DQoJCSR0ZW1wWyd1cGxvYWRfb3ZlcndyaXRlJ10gPSAkdXBsb2FkX292ZXJ3cml0ZTsNCgkJCQkNCgkJJHRlbXBbJ3VwbG9hZF9maWxlJ11bJ25hbWUnXSA9ICR1cGxvYWRfZmlsZVsnbmFtZSddOw0KCQkkdGVtcFsndXBsb2FkX2ZpbGUnXVsndHlwZSddID0gJHVwbG9hZF9maWxlWyd0eXBlJ107DQoJCSR0ZW1wWyd1cGxvYWRfZmlsZSddWyd0bXBfbmFtZSddID0gJHVwbG9hZF9maWxlWyd0bXBfbmFtZSddOw0KCQkkdGVtcFsndXBsb2FkX2ZpbGUnXVsnZXJyb3InXSA9ICR1cGxvYWRfZmlsZVsnZXJyb3InXTsNCgkJJHRlbXBbJ3VwbG9hZF9maWxlJ11bJ2Vycm9yX3N0YXR1cyddID0gJHVwbG9hZF9maWxlWydlcnJvcl9zdGF0dXMnXTsNCgkJJHRlbXBbJ3VwbG9hZF9maWxlJ11bJ3NpemUnXSA9ICR1cGxvYWRfZmlsZVsnc2l6ZSddOw0KCQkNCgkJLy8gZGlyZWN0b3J5IHBhdGggdmFsaWRhdGlvbg0KCQkNCgkJaWYoICFlbXB0eSgkdXBsb2FkX2RpcmVjdG9yeSkgKSB7DQoJCQ0KCQkJLy8gdXBsb2FkIGRpcmVjdG9yeSBwYXRoIHZhbGlkYXRpb24gDQoJCQlpZiAoICR0aGlzLT5pc19kaXJlY3RvcnlfcGF0aCggJHVwbG9hZF9kaXJlY3RvcnkgKSApIHsNCgkJCQkNCgkJCQkkdGVtcFsndXBsb2FkX2RpcmVjdG9yeSddID0gIlZhbGlkIC0gIiAuICR1cGxvYWRfZGlyZWN0b3J5Ow0KCQkJCSR0ZW1wWyd1cGxvYWRfcHJvY2VzcyddKys7DQoJCQkJDQoJCQkJLy8gZGlyZWN0b3J5IHdyaXRlIHBlcm1pc3Npb25zDQoJCQkJaWYgKCAkdGhpcy0+aXNfZGlyZWN0b3J5X3dyaXRhYmxlKCAkdXBsb2FkX2RpcmVjdG9yeSApICkgew0KCQkJCQkkdGVtcFsndXBsb2FkX2RpcmVjdG9yeV93cml0YWJsZSddID0gIlZhbGlkIC0gRGlyZWN0b3J5IGlzIHdyaXRhYmxlIjsNCgkJCQkJJHRlbXBbJ3VwbG9hZF9wcm9jZXNzJ10rKzsNCgkJCQkJJHRlbXBbJ3VwbG9hZF9maWxlJ11bJ2RpcmVjdG9yeSddID0gJHVwbG9hZF9kaXJlY3Rvcnk7DQoJCQkJfQ0KCQkJDQoJCQl9DQoJCQ0KCQl9DQoJCQkNCgkJaWYgKCAhZW1wdHkoICR1cGxvYWRfZmlsZVsnbmFtZSddICkgKSB7DQoNCgkJCS8vIGZpbGVuYW1lIGFuZCBleHRlbnNpb24NCgkJCSRuYW1lZXh0ID0gJHRoaXMtPmdldF9leHRlbnNpb24oICR1cGxvYWRfZmlsZVsnbmFtZSddICk7DQoJCQkkZmlsZV9uYW1lID0gJG5hbWVleHRbJ2ZpbGVfbmFtZSddOw0KCQkJJGZpbGVfZXh0ZW5zaW9uID0gJG5hbWVleHRbJ2ZpbGVfZXh0ZW5zaW9uJ107DQoJCQkNCgkJCSR0ZW1wWyd1cGxvYWRfZmlsZSddWyduYW1lb25seSddID0gJGZpbGVfbmFtZTsNCgkJCSR0ZW1wWyd1cGxvYWRfZmlsZSddWydleHRlbnNpb24nXSA9ICRmaWxlX2V4dGVuc2lvbjsNCgkJCQ0KCQkJLy8gYWxsb3dlZCBleHRlbnNpb25zDQoJCQlpZiAoICRleHRlbnNpb25fY2hlY2sgPT0gRkFMU0UgKSB7DQoJCQkJJHRlbXBbJ3VwbG9hZF9maWxlX2V4dGVuc2lvbiddID0gIlZhbGlkIC0gRXh0ZW5zaW9uIGlzIGFsbG93ZWQiOw0KCQkJCSR0ZW1wWyd1cGxvYWRfcHJvY2VzcyddKys7DQoJCQl9IA0KCQkJDQoJCQllbHNlIGlmICggYXJyYXlfa2V5X2V4aXN0cyggJGZpbGVfZXh0ZW5zaW9uLCAkYWxsb3dlZF9leHRlbnNpb25zICkgJiYgJGFsbG93ZWRfZXh0ZW5zaW9uc1skZmlsZV9leHRlbnNpb25dID09IFRSVUUgKSB7DQoJCQkJJHRlbXBbJ3VwbG9hZF9maWxlX2V4dGVuc2lvbiddID0gIlZhbGlkIC0gRXh0ZW5zaW9uIGlzIGFsbG93ZWQiOw0KCQkJCSR0ZW1wWyd1cGxvYWRfcHJvY2VzcyddKys7CQkNCgkJCX0NCgkJCQ0KCQkJLy8gc2l6ZSB2YWxpZGF0aW9uDQoJCQlpZiAoICRhbGxvd2VkX3NpemUgPj0gJHVwbG9hZF9maWxlWydzaXplJ10gKSB7DQoJCQkJJHRlbXBbJ3VwbG9hZF9maWxlX3NpemUnXSA9ICJWYWxpZCAtIFNpemUgIiAuICR1cGxvYWRfZmlsZVsnc2l6ZSddIC4gIiBieXRlcyI7DQoJCQkJJHRlbXBbJ3VwbG9hZF9wcm9jZXNzJ10rKzsNCgkJCX0JCQ0KCQkNCgkJfQ0KCQkNCgkJLy8gdXBsb2FkIG1vdmUgc3RhdHVzDQoJCQ0KCQlpZiAoICR0ZW1wWyd1cGxvYWRfcHJvY2VzcyddID09IDQgJiYgaXNfdXBsb2FkZWRfZmlsZSggJHVwbG9hZF9maWxlWyd0bXBfbmFtZSddICkgJiYgJHVwbG9hZF9maWxlWydlcnJvciddID09IFVQTE9BRF9FUlJfT0sgKSB7CQkNCgkJCSR0ZW1wWyd1cGxvYWRfbW92ZSddID0gVFJVRTsNCgkJfQ0KCQkNCgkJLy8gdXBsb2FkIGhvb2sNCgkJJHRoaXMtPnNldF91cGxvYWRfaG9vayggJHRlbXAgKTsNCgkJCQkNCgkJaWYgKHNlbGY6OiRkZWJ1Zykgew0KCQkgICAgJHRoaXMtPnByaW50X3ZhcigkdGVtcCk7DQoJCX0gDQoJCQ0KCQlyZXR1cm4gJHRlbXA7DQoJCQkgDQoJfQ0KCQ0KICAgIC8qKg0KICAgICAqDQogICAgICogZ2V0IHVwbG9hZA0KICAgICAqIGl0IHdpbGwgdXBsb2FkIGZpbGUuDQogICAgICoNCiAgICAgKiBAcGFyYW0gJGFyZ3MgLSBhcnJheQ0KICAgICAqIEBwYXJhbSAkYWxsb3dlZF9leHRlbnNpb25zIC0gYXJyYXkNCiAgICAgKiBAcmV0dXJuIGFycmF5DQogICAgICoNCiAgICAgKi8NCgkNCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3VwbG9hZCggJGFyZ3MgPSBhcnJheSgpLCAkYWxsb3dlZF9leHRlbnNpb25zID0gYXJyYXkoKSApIHsgDQoJCXJldHVybiAkdGhpcy0+c2V0X3VwbG9hZCggJGFyZ3MsICRhbGxvd2VkX2V4dGVuc2lvbnMgKTsJIA0KCX0NCgkNCiAgICAvKioNCiAgICAgKg0KICAgICAqIHNldCBVcGxvYWQgTW92ZQ0KICAgICAqIGl0IHdpbGwgdXBsb2FkIGZpbGUuDQogICAgICoNCiAgICAgKiBAcmV0dXJuIGFycmF5DQogICAgICoNCiAgICAgKi8NCgkNCglwdWJsaWMgZnVuY3Rpb24gc2V0X3VwbG9hZF9tb3ZlKCAkbmFtZSApIHsgDQoJCQ0KCQkkdGVtcCA9IGFycmF5KCk7CQkNCgkJDQoJCSR1cGxvYWRfaG9vayA9ICR0aGlzLT5nZXRfdXBsb2FkX2hvb2soKTsNCgkJDQoJCWlmICggJHVwbG9hZF9ob29rWyd1cGxvYWRfbW92ZSddID09IFRSVUUgKSB7DQoJCQkJCQkJCQkNCiAgICAgICAgCSRuYW1lID0gKCAhZW1wdHkoICRuYW1lICkgKSA/ICRuYW1lIDogJHVwbG9hZF9ob29rWyd1cGxvYWRfZmlsZSddWyduYW1lb25seSddOw0KCQkJJG5hbWUgPSAkdGhpcy0+c2FmZV9zdHJpbmcoICRuYW1lICk7DQoJCQkNCgkJCSRleHRlbnNpb24gPSAkdXBsb2FkX2hvb2tbJ3VwbG9hZF9maWxlJ11bJ2V4dGVuc2lvbiddOw0KICAgICAgICAJDQoJCQkkdGVtcF9uYW1lID0gJHVwbG9hZF9ob29rWyd1cGxvYWRfZmlsZSddWyd0bXBfbmFtZSddOw0KCQkJJGRlc3RfbmFtZSA9ICR1cGxvYWRfaG9va1sndXBsb2FkX2ZpbGUnXVsnZGlyZWN0b3J5J10gLiAkbmFtZSAuICIuIiAuICRleHRlbnNpb247DQoJCQkNCgkJCWlmICggJHVwbG9hZF9ob29rWyd1cGxvYWRfb3ZlcndyaXRlJ10gPT0gRkFMU0UgKSB7DQoJCQkJDQoJCQkJaWYgKCBmaWxlX2V4aXN0cyggJGRlc3RfbmFtZSApICkgew0KCQkJCQkNCgkJCQkJJGkgPSAxOw0KCQkJCQkkbWF4X2xvb3BzID0gMTAwOw0KCQkJCQl3aGlsZSAoIGZpbGVfZXhpc3RzKCAkZGVzdF9uYW1lICkgJiYgJGkgPD0gJG1heF9sb29wcyApIHsNCgkJCQkJCQ0KCQkJCQkJJG5hbWVfbmV3ID0gJG5hbWUgLiAiXyIgLiAkaTsNCgkJCQkJCSRuYW1lX25ldyA9ICR0aGlzLT5zYWZlX3N0cmluZyggJG5hbWVfbmV3ICk7DQoJCQkJCQkNCgkJCQkJCSRkZXN0X25hbWUgPSAkdXBsb2FkX2hvb2tbJ3VwbG9hZF9maWxlJ11bJ2RpcmVjdG9yeSddIC4gJG5hbWVfbmV3IC4gIi4iIC4gJGV4dGVuc2lvbjsNCgkJCQkJCQ0KCQkJCQkJJGkrKzsgDQoJCQkJCQkNCgkJCQkJfQ0KCQkJCQkNCgkJCQl9IA0KCQkJCQ0KCQkJfQ0KCQkJDQoJCQkkbmFtZSA9ICggZW1wdHkoJG5hbWVfbmV3KSApID8gJG5hbWUgOiAkbmFtZV9uZXcgOwkJCQ0KCQkJDQoJCQlpZiAoIG1vdmVfdXBsb2FkZWRfZmlsZSggJHRlbXBfbmFtZSwgJGRlc3RfbmFtZSApICkgewkJCQkNCgkJCQkkdGVtcFsndXBsb2FkZWRfc3RhdHVzJ10gPSBUUlVFOw0KCQkJCSR0ZW1wWyd1cGxvYWRlZF9maWxlJ10gPSAkbmFtZTsNCgkJCQkkdGVtcFsndXBsb2FkZWRfZXh0ZW5zaW9uJ10gPSAkZXh0ZW5zaW9uOw0KCQkJCSR0ZW1wWyd1cGxvYWRlZF9kaXJlY3RvcnknXSA9ICRkZXN0X25hbWU7DQoJCQl9IGVsc2Ugew0KCQkJCSR0ZW1wWyd1cGxvYWRlZF9zdGF0dXMnXSA9IEZBTFNFOw0KCQkJCSR0ZW1wWyd1cGxvYWRlZF9maWxlJ10gPSAkbmFtZTsNCgkJCQkkdGVtcFsndXBsb2FkZWRfZXh0ZW5zaW9uJ10gPSAkZXh0ZW5zaW9uOw0KCQkJCSR0ZW1wWyd1cGxvYWRlZF9kaXJlY3RvcnknXSA9ICRkZXN0X25hbWU7DQoJCQkNCgkJCX0NCgkJCQ0KCQl9DQoJCQ0KCQlyZXR1cm4gJHRlbXA7DQoJCSANCgl9DQoJDQogICAgLyoqDQogICAgICogZ2V0IFVwbG9hZCBNb3ZlDQogICAgICogaXQgd2lsbCB1cGxvYWQgZmlsZS4NCiAgICAgKiANCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lDQogICAgICogQHJldHVybiBhcnJheQ0KICAgICAqDQogICAgICovDQoJDQoJcHVibGljIGZ1bmN0aW9uIGdldF91cGxvYWRfbW92ZSggJG5hbWUgPSBGQUxTRSApIHsgDQoJCXJldHVybiAkdGhpcy0+c2V0X3VwbG9hZF9tb3ZlKCAkbmFtZSApOwkgDQoJfQ0KDQoJLyoqDQoJICogZGVzdHJ1Y3Rvcg0KCSAqDQoJICovDQoJDQoJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7DQoJfQ0KDQp9IC8vIFVwVXBsb2FkDQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/UpUtils.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMgJElkOiBVcFV0aWxzLm1vZHVsZS5waHAgMjIgMjAxMS0wOC0wOSAxMzo1MzoyMFogYXJub3VkICQgCgojQkVHSU5fTElDRU5TRQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZHVsZTogVXBVdGlscyAoYykgMjAxMSBieSBBcm5vdWQgdmFuIFN1c3RlcmVuIChhcm5vdWRAdXBzZXJ2aWNlLm5sKQojCiMgQW4gYWRkb24gbW9kdWxlIGZvciBDTVMgTWFkZSBTaW1wbGUgdG8gbG9hZCBnZW5lcmljIGNsYXNzZXMgLyB1dGlsaXRpZXMKIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKCmNsYXNzIFVwVXRpbHMgZXh0ZW5kcyBDTVNNb2R1bGUgewogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CiAgICAgICAgCiAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCdhdXRvbG9hZCcpKTsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7ICAgCiAgICAgICAgCiAgICB9CiAgICAKICAgIC8qKgogICAgICogYXV0b2xvYWQgbWV0aG9kCiAgICAgKiBAcGFyYW0gJGNsYXNzbmFtZSAtIHN0cmluZwogICAgICogQHJldHVybiB0cnVlfGZhbHNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdXRvbG9hZCgkY2xhc3NuYW1lKSB7CiAgICAgCiAgICAgICAgaWYgKCAhaXNfb2JqZWN0KCR0aGlzKSApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBVcFV0aWxzIGxpYnMKICAgICAgICAKICAgICAgICBpZiAocHJlZ19tYXRjaCgnL0RBTyQvJywkY2xhc3NuYW1lKSApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkZm4gPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpLiIvbGliL2NsYXNzZXMveyRjbGFzc25hbWV9LmNsYXNzLnBocCI7CiAgICAgICAgCiAgICAgICAgaWYgKCBmaWxlX2V4aXN0cygkZm4pICkgewogICAgICAgICAgICByZXF1aXJlX29uY2UoJGZuKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogIAogICAgfQogICAgCgogICAgLyoqCiAgICAgKiBAbGluayBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnL2FwaWRvYy9DTVMvQ01TTW9kdWxlLmh0bWwjR2V0TmFtZQogICAgICogQGlnbm9yZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0TmFtZSgpIHsgcmV0dXJuICdVcFV0aWxzJzsgfQogICAgCiAgICAvKioKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcvYXBpZG9jL0NNUy9DTVNNb2R1bGUuaHRtbCNHZXRGcmllbmRseU5hbWUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsgfQogICAgCiAgICAvKioKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcvYXBpZG9jL0NNUy9DTVNNb2R1bGUuaHRtbCNHZXRWZXJzaW9uCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRWZXJzaW9uKCkgeyByZXR1cm4gJzAuMC40JzsgfQogICAgCiAgICAvKioKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcvYXBpZG9jL0NNUy9DTVNNb2R1bGUuaHRtbCNNaW5pbXVtQ01TVmVyc2lvbgogICAgICogQGlnbm9yZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7IHJldHVybiAnMS45LjEnOyB9CiAgICAKICAgIC8qKgogICAgICogQGxpbmsgaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZy9hcGlkb2MvQ01TL0NNU01vZHVsZS5odG1sI01heGltdW1DTVNWZXJzaW9uCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBNYXhpbXVtQ01TVmVyc2lvbigpIHsgcmV0dXJuICIxLjEwLjkiOyB9CgogICAgLyoqCiAgICAgKiBAbGluayBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnL2FwaWRvYy9DTVMvQ01TTW9kdWxlLmh0bWwjR2V0SGVscAogICAgICogQGlnbm9yZQogICAgICovCiAgICAgcHVibGljIGZ1bmN0aW9uIEdldEhlbHAoKSB7IHJldHVybiAkdGhpcy0+bGFuZygnaGVscCcpOyB9CiAgICAKICAgIC8qKgogICAgICogQGxpbmsgaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZy9hcGlkb2MvQ01TL0NNU01vZHVsZS5odG1sI0dldEF1dGhvcgogICAgICogQGlnbm9yZQogICAgICovICAKICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3IoKSB7IHJldHVybiAnQXJub3VkIHZhbiBTdXN0ZXJlbic7IH0KICAgIAogICAgLyoqCiAgICAgKiBAbGluayBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnL2FwaWRvYy9DTVMvQ01TTW9kdWxlLmh0bWwjR2V0QXV0aG9yRW1haWwKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgeyByZXR1cm4gJ2Fybm91ZEB1cHNlcnZpY2UubmwnOyB9CiAgICAKICAgIC8qKgogICAgICogQGxpbmsgaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZy9hcGlkb2MvQ01TL0NNU01vZHVsZS5odG1sI0dldENoYW5nZUxvZwogICAgICogQGlnbm9yZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkgeyByZXR1cm4gZmlsZV9nZXRfY29udGVudHMoZGlybmFtZShfX0ZJTEVfXykuJy9jaGFuZ2Vsb2cuaW5jJyk7IH0KICAgIAogICAgLyoqCiAgICAgKiBAbGluayBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnL2FwaWRvYy9DTVMvQ01TTW9kdWxlLmh0bWwjSGFuZGxlc0V2ZW50cwogICAgICogQGlnbm9yZQogICAgICovCiAgICBmdW5jdGlvbiBIYW5kbGVzRXZlbnRzKCkgeyByZXR1cm4gZmFsc2U7fQogICAgCiAgICAvLyBwdWJsaWMgZnVuY3Rpb24gR2V0RXZlbkRlc2NyaXB0aW9uKCkge30KICAgIAogICAgLy8gcHVibGljIGZ1bmN0aW9uIEdldEV2ZW50SGVscCgpIHt9CiAgICAKICAgIC8qKgogICAgICogQGxpbmsgaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZy9hcGlkb2MvQ01TL0NNU01vZHVsZS5odG1sI0lzUGx1Z2luTW9kdWxlCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAKICAgIC8qKgogICAgICogQGxpbmsgaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZy9hcGlkb2MvQ01TL0NNU01vZHVsZS5odG1sI0hhc0FkbWluCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBIYXNBZG1pbigpIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAKICAgIC8vIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7fQogICAgICAgIAogICAgLyoqCiAgICAgKiBAbGluayBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnL2FwaWRvYy9DTVMvQ01TTW9kdWxlLmh0bWwjR2V0QWRtaW5EZXNjcmlwdGlvbgogICAgICogQGlnbm9yZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbigpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdhZG1pbmRlc2NyaXB0aW9uJyk7IH0KICAgIAogICAgLy8gcHVibGljIGZ1bmN0aW9uIFZpc2liaWxlVG9BZG1pblVzZXIoKSB7fQogICAgCiAgICAvLyBwdWJsaWMgZnVuY3Rpb24gQ2hlY2tBY2Nlc3MoKSB7fQogICAgCiAgICAvLyBwdWJsaWMgZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkgeyB9CiAgICAKICAgIC8vIHB1YmxpYyBmdW5jdGlvbiBJbnN0YWxsKCkge30KICAgIAogICAgLyoqCiAgICAgKiBAbGluayBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnL2FwaWRvYy9DTVMvQ01TTW9kdWxlLmh0bWwjSW5zdGFsbFBvc3RNZXNzYWdlCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKSB7IHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsgfQogICAgCiAgICAvL3B1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGwoKSB7fQoKICAgIC8qKgogICAgICogQGxpbmsgaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZy9hcGlkb2MvQ01TL0NNU01vZHVsZS5odG1sI1VuaW5zdGFsbFBvc3RNZXNzYWdlCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7IH0KICAgIAogICAgLy9wdWJsaWMgZnVuY3Rpb24gVXBncmFkZSgkb2xkdmVyc2lvbiwgJG5ld3ZlcnNpb24pIHt9Cgp9IC8vIFVwVXRpbHMKCj8+Cg==]]></data>
	</file>
</module>
