<?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>MediaCenter</name>
	<version>0.5</version>
  <mincmsversion>1.8</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+DQo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIGRpc3BsYXkgZGF0YSBmcm9tIG90aGVyIHBhZ2VzIG9uIHlvdXIgc2l0ZS4gDQpDdXJyZW50bHkgeW91IGNhbiBkaXNwbGF5IGRhdGEgZnJvbSBCaW5nLmNvbSAod2ViIHBhZ2VzLCBwaWN0dXJlcywgdmlkZW9zKSwgWW91VHViZS5jb20gPC9wPg0KPGg0PlVzaW5nIEJpbmc8L2g0Pg0KPHA+R2VuZXJhdGUgQXBpIGtleSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmluZy5jb20vZGV2ZWxvcGVycy8iPnd3dy5iaW5nLmNvbS9kZXZlbG9wZXJzPC9hPi4gVGhpcyBLZXkgcGFzdGUgaW4gdGhlIHNldHRpbmdzIHRhYiAgTWVkaWEgQ2VudGVyIG1vZHVsZS48L3A+DQo8cD5Vc2UgdGFnPGJyIC8+DQp7Y21zX21vZHVsZSBtb2R1bGU9JnF1b3Q7TWVkaWFDZW50ZXImcXVvdDsgc291cmNlPSZxdW90O2JpbmcmcXVvdDsgdHlwZT0mcXVvdDtXZWImcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0JpbmdXZWImcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O0ltYWdlJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nSW1hZ2UmcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O1ZpZGVvJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nVmlkZW8mcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O30uDQo8L3A+DQo8aDQ+VXNpbmcgWW91dHViZTwvaDQ+DQo8cD5Vc2UgdGFnIDxiciAvPntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7eW91dHViZSZxdW90OyBkaXNwbGF5dGVtcGxhdGU9JnF1b3Q7WW91dHViZSZxdW90OyBrZXl3b3JkPSZxdW90O0vEviZ1YWN1dGU7xI1vdiZlYWN1dGU7IHNsb3YmYWFjdXRlOyBwcmUgdnloxL5hZCZhYWN1dGU7dmFuaWUmcXVvdDt9PC9wPiANCjxoMz5aJmFhY3V0ZTt2aXNsb3N0aTwvaDM+PHVsPjxsaT5DR0V4dGVuc2lvbnMgPSZndDsgMS4xODwvbGk+PGxpPkNvbnRlbnRDYWNoZSA9Jmd0OyAxLjI8L2xpPjwvdWw+PGgzPlBhcmFtZXRyZTwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRlciAmc2Nhcm9uO3BlY2lmaWt1amUsIGFrJnlhY3V0ZTsgamF6eWsgc2EgbSZhYWN1dGU7IHBvdcW+acWlIHByZSB6b2JyYXplbmllLiBOaWUgdiZzY2Fyb247ZXRreSBtb2R1bHkgdG8gcG9kcG9ydWomdWFjdXRlOywgYWxlYm8gcG90cmVidWomdWFjdXRlOy48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxpbWl0PSIyMCIgLSBQb8SNZXQgcG9sb8W+aWVrPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBrZXl3b3JkPSIiIC0gS8S+JnVhY3V0ZTvEjW92JmVhY3V0ZTsgc2xvdiZhYWN1dGU7PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBzb3VyY2U9IiIgLSBTb3VyY2UgKHlvdXR1YmUsIGJpbmcsIHR3aXR0ZXIsIGxhc3RmbSk8L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IHR5cGU9IiIgLSB0eXAgem9icmF6ZW5pYS4gUGFyYW1ldHJlIFdlYiwgSW1hZ2UsIFZpZGVvLiBJYmEgcHJpIHNvdXJjZT0mcXVvdDtiaW5nJnF1b3Q7PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBkaXNwbGF5dGVtcGxhdGU9IiIgLSAmU2Nhcm9uO2FibCZvYWN1dGU7bmEgem9icmF6ZW5pYTwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0b3I6IEt1em1hbnkuYml6ICZsdDt6ZGVub0BrdXptYW55LmJpeiZndDs8YnIgLz48YnIgLz5WZXJ6aWE6IDAuNTxiciAvPjxiciAvPkhpc3Qmb2FjdXRlO3JpYSB6bWllbjo8YnIgLz48dWw+DQo8bGk+VmVyc2lvbiAwLjksIE9jdCAyMDA5IC0gcHJ2JmVhY3V0ZTsgdnlkYW5pZTwvbGk+PC91bD48YnIgLz4=]]></about>
	<description><![CDATA[Zobrazenie d&aacute;t z YouTube a Bingu]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.18</requiredversion>
	</requires>
	<requires>
	  <requiredname>ContentCache</requiredname>
	  <requiredversion>1.2</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.admin_saveprefs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmKCAhaXNzZXQoICRnQ21zICkgKSByZXR1cm47DQoNCiR0aGlzLT5TZXRDdXJyZW50VGFiKCdwcmVmcycpOw0KDQppZiAoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpDQp7DQoJZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbm9fcGVybWlzaW9uJykpOw0KCXJldHVybjsNCn0NCg0KaWYoICFpc3NldCggJHBhcmFtc1snc3VibWl0J10gKSApDQp7DQoJJHRoaXMtPlJlZGlyZWN0VG9UYWIoJGlkKTsNCn0NCg0KaWYoIGlzc2V0KCRwYXJhbXNbJ2NhY2hlX3RpbWVvdXQnXSkgKQ0Kew0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjYWNoZV90aW1lb3V0JywkcGFyYW1zWydjYWNoZV90aW1lb3V0J10pOw0KfQ0KDQppZiggaXNzZXQoJHBhcmFtc1sneW91dHViZV9tYXgnXSkgKQ0Kew0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCd5b3V0dWJlX21heCcsJHBhcmFtc1sneW91dHViZV9tYXgnXSk7DQp9DQoNCg0KaWYoIGlzc2V0KCRwYXJhbXNbJ2JpbmdfbWF4J10pICkNCnsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnYmluZ19tYXgnLCRwYXJhbXNbJ2JpbmdfbWF4J10pOw0KfQ0KDQppZiggaXNzZXQoJHBhcmFtc1snYmluZ19hcGlfa2V5J10pICkNCnsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnYmluZ19hcGlfa2V5JywkcGFyYW1zWydiaW5nX2FwaV9rZXknXSk7DQp9DQoNCmlmKCBpc3NldCgkcGFyYW1zWydsYXN0X2ZtX21heCddKSApDQp7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xhc3RfZm1fbWF4JywkcGFyYW1zWydsYXN0X2ZtX21heCddKTsNCn0NCg0KaWYoIGlzc2V0KCRwYXJhbXNbJ2xhc3RfZm1fYXBpX2tleSddKSApDQp7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xhc3RfZm1fYXBpX2tleScsJHBhcmFtc1snbGFzdF9mbV9hcGlfa2V5J10pOw0KfQ0KDQokdGhpcy0+UmVkaXJlY3RUb1RhYigkaWQpOw0KPz4=]]></data>
	</file>
	<file>
	  <filename>/action.bing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTW9kdWxlOiBNZWRpYUNlbnRlcg0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL21lZGlhY2VudGVyLw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc3NldCgkZ0NtcykpDQogICAgZXhpdDsNCg0KJHRoaXMtPmxpbWl0ID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2JpbmdfbWF4JywgMjApOw0KaWYgKCRwYXJhbXNbImxpbWl0Il0pICAgICR0aGlzLT5saW1pdCA9ICRwYXJhbXNbImxpbWl0Il07DQoNCiRiaW5nX2FwaV9rZXkgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnYmluZ19hcGlfa2V5Jyk7DQoNCmlmICghJGNhY2hlX3RpbWVvdXQgfHwgISRiaW5nX2FwaV9rZXkpIHsNCiAgICBlY2hvICR0aGlzLT5EaXNwbGF5RXJyb3JNZXNzYWdlKCR0aGlzLT5MYW5nKCdlcnJvcl9taXNzX3BhcicpKTsNCiAgICByZXR1cm47DQp9DQoNCg0KJHRoaXMtPnR5cGUgPSAkcGFyYW1zWyJ0eXBlIl0gPyAkcGFyYW1zWyJ0eXBlIl0gOiAiV2ViIjsNCi8vIGluaXQgY2FjaGUNCiRjYWNoZV9rZXl3b3JkID0gJ2JpbmcnIC4gJHRoaXMtPnR5cGUgLiAka2V5d29yZCAuICR0aGlzLT5saW1pdDsNCg0KICAgICRyZXN1bHRzID0gJHRoaXMtPmxvYWRCaW5nKCRrZXl3b3JkKTsNCiRzbWFydHktPmFzc2lnbl9ieV9yZWYoJ2l0ZW1zJywgJGl0ZW1zKTsNCiRzbWFydHktPmFzc2lnbigncmVzdWx0cycsIGNvdW50KCRpdGVtcykpOw0KJHNtYXJ0eS0+YXNzaWduKCdrZXl3b3JkJywgJGtleXdvcmQpOw0KDQoNCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgkdGhldGVtcGxhdGUpOw0KDQpyZXR1cm47DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBNZWRpYUNlbnRlcgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7CgovLyBjYWNoZSB0aW1vdXQKJGNhY2hlX3RpbWVvdXQgPSBpc1NldCgkcGFyYW1zWyJ0aW1lb3V0Il0pID8gJHBhcmFtc1sidGltZW91dCJdIDogJHRoaXMtPkdldFByZWZlcmVuY2UoJ2NhY2hlX3RpbWVvdXQnLCAzNjAwICogMjQgKiAyKTsKCi8vIGNoZWNrIHJlcXVpcmVkIHBhcmFtcwokc291cmNlID0gdHJpbSgkcGFyYW1zWyJzb3VyY2UiXSk7CiRrZXl3b3JkID0gdHJpbSgkcGFyYW1zWyJrZXl3b3JkIl0pOwppZiAoISRzb3VyY2UgfHwgISRrZXl3b3JkKSB7CiAgICBlY2hvICR0aGlzLT5EaXNwbGF5RXJyb3JNZXNzYWdlKCR0aGlzLT5MYW5nKCdlcnJvcl9taXNzX3BhcicpKTsKICAgIHJldHVybjsKfQoKLy8gbG9hZCB0ZW1wbGF0ZQokdGhldGVtcGxhdGUgPSAnZGlzcGxheV8nIC4gJHRoaXMtPkdldFByZWZlcmVuY2UoTUVESUFDRU5URVJfUFJFRl9ORVdNRURJQUNFTlRFUl9URU1QTEFURSk7CmlmIChpc3NldCgkcGFyYW1zWydkaXNwbGF5dGVtcGxhdGUnXSkpIHsKICAgICR0aGV0ZW1wbGF0ZSA9ICdkaXNwbGF5XycgLiAkcGFyYW1zWydkaXNwbGF5dGVtcGxhdGUnXTsKfQoKJGVudHJ5YXJyYXkgPSBhcnJheSgpOwoKZ2xvYmFsICRnQ21zOwokY29uZmlnID0gJiAkZ0Ntcy0+R2V0Q29uZmlnKCk7Cgpzd2l0Y2ggKCRzb3VyY2UpIHsKICAgIGNhc2UgInlvdXR1YmUiOgogICAgICAgIGluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykgLiAnL2FjdGlvbi55b3V0dWJlLnBocCcpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAiYmluZyI6CiAgICAgICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKSAuICcvYWN0aW9uLmJpbmcucGhwJyk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICJ0d2l0dGVyIjoKICAgICAgICBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pIC4gJy9hY3Rpb24udHdpdHRlci5waHAnKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgImxhc3RmbSI6CiAgICAgICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKSAuICcvYWN0aW9uLmxhc3RmbS5waHAnKTsKICAgICAgICBicmVhazsKfQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KDQppZiAoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBNZWRpYSBDZW50ZXInKSl7DQoJZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbm9fcGVybWlzaW9uJykpOw0KCXJldHVybjsNCn0NCg0KDQojVGhlIHRhYnMNCmVjaG8gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpOw0KDQppZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKQ0Kew0KCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignZGlzcGxheV90ZW1wbGF0ZScsJHRoaXMtPkxhbmcoJ2Rpc3BsYXl0ZW1wbGF0ZXMnKSk7DQp9DQoNCmlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKQ0Kew0KCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigncHJlZnMnLCR0aGlzLT5MYW5nKCdzZXR0aW5ncycpKTsNCn0NCg0KZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOw0KDQojVGhlIGNvbnRlbnQgb2YgdGhlIHRhYnMNCmVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOw0KDQppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBUZW1wbGF0ZXMnICkgKQ0Kew0KCWluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuJy9mdW5jdGlvbi5hZG1pbl90ZW1wbGF0ZXN0YWJzLnBocCcpOw0KfQ0KDQppZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkNCnsNCgllY2hvICR0aGlzLT5TdGFydFRhYigncHJlZnMnLCAkcGFyYW1zKTsNCglpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fcHJlZnNfdGFiLnBocCcpOw0KCWVjaG8gJHRoaXMtPkVuZFRhYigpOw0KfQ0KDQplY2hvICR0aGlzLT5FbmRUYWJDb250ZW50KCk7DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.google.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTW9kdWxlOiBNZWRpYUNlbnRlcg0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL21lZGlhY2VudGVyLw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc3NldCgkZ0NtcykpDQogICAgZXhpdDsNCg0KJHRoaXMtPmxpbWl0ID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2dvb2dsZV9tYXgnLCAyMCk7DQppZiAoJHBhcmFtc1sibGltaXQiXSkgICAgJHRoaXMtPmxpbWl0ID0gJHBhcmFtc1sibGltaXQiXTsNCg0KJGdvb2dsZV9hcGlfa2V5ID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2dvb2dsZV9hcGlfa2V5Jyk7DQokc2VhcmNoX3F1ZXJ5ID0gJ2h0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2N1c3RvbXNlYXJjaC92MT9rZXk9QUl6YVN5RFFORHJ5WGdXZVRIVGo3dE5Vb1gyam81OTBOTzA3clBvJmN4PTAxNzU3NjY2MjUxMjQ2ODIzOTE0NjpvbXVhdWZfbGZ2ZSZxPWxlY3R1cmVzJmNhbGxiYWNrPWhhbmRsZVJlc3BvbnNlJnByZXR0eXByaW50PXRydWUnOw0KJGdzID0gbmV3IGdvb2dsZVNlYXJjaCgnQUl6YVN5RFFORHJ5WGdXZVRIVGo3dE5Vb1gyam81OTBOTzA3clBvJywndGVzdCcpOw0KcHJpbnRfUigkZ3MtPnNlYXJjaCgpKTsNCnJldHVybjsNCmVjaG8gJHRoaXMtPmxvYWRHb29nbGUoJ3Rlc3QnKTsNCnJldHVybjsNCmlmICghJGNhY2hlX3RpbWVvdXQgfHwgISRnb29nbGVfYXBpX2tleSkgew0KICAgIGVjaG8gJHRoaXMtPkRpc3BsYXlFcnJvck1lc3NhZ2UoJHRoaXMtPkxhbmcoJ2Vycm9yX21pc3NfcGFyJykpOw0KICAgIHJldHVybjsNCn0NCg0KLy8gaW5pdCBjYWNoZQ0KJGNhY2hlX2tleXdvcmQgPSAnZ29vZ2xlJyAuICRrZXl3b3JkIC4gJHRoaXMtPmxpbWl0Ow0KJGNhY2hlID0gJHRoaXMtPm5ldHRlQ2FjaGUoKTsNCg0KaWYgKGlzU2V0KCRjYWNoZVskY2FjaGVfa2V5d29yZF0pKSB7DQogICAgLy8gbG9hZCBjYWNoZQ0KICAgICRpdGVtcyA9ICRjYWNoZVskY2FjaGVfa2V5d29yZF07DQp9IGVsc2Ugew0KICAgICRyZXN1bHRzID0gJHRoaXMtPmxvYWRnb29nbGUoJGtleXdvcmQpOw0KICAgICRpdGVtcyA9ICRyZXN1bHRzOw0KICAgICRjYWNoZS0+c2F2ZSgkY2FjaGVfa2V5d29yZCwgJGl0ZW1zLCBhcnJheSgnZXhwaXJlJyA9PiAkY2FjaGVfdGltZW91dCkpOw0KfQ0KJHNtYXJ0eS0+YXNzaWduX2J5X3JlZignaXRlbXMnLCAkaXRlbXMpOw0KJHNtYXJ0eS0+YXNzaWduKCdyZXN1bHRzJywgY291bnQoJGl0ZW1zKSk7DQokc21hcnR5LT5hc3NpZ24oJ2tleXdvcmQnLCAka2V5d29yZCk7DQoNCg0KZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlKCR0aGV0ZW1wbGF0ZSk7DQoNCnJldHVybjsNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.lastfm.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KDQokdGhpcy0+bGltaXQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGFzdF9mbV9tYXgnLCAyMCk7DQppZiAoJHBhcmFtc1sibGltaXQiXSkgICAgJHRoaXMtPmxpbWl0ID0gJHBhcmFtc1sibGltaXQiXTsNCg0KJGxhc3RfZm1fYXBpX2tleSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsYXN0X2ZtX2FwaV9rZXknKTsNCg0KaWYgKCEkbGFzdF9mbV9hcGlfa2V5KSB7DQogICAgZWNobyAkdGhpcy0+RGlzcGxheUVycm9yTWVzc2FnZSgkdGhpcy0+TGFuZygnZXJyb3JfbWlzc19wYXInKSk7DQogICAgcmV0dXJuOw0KfQ0KDQokdGhpcy0+dHlwZSA9ICRwYXJhbXNbInR5cGUiXSA/ICRwYXJhbXNbInR5cGUiXSA6ICJ0cmFjayI7DQoNCi8vIGluaXQgY2FjaGUNCiRjYWNoZV9rZXl3b3JkID0gJ2xhc3RmbScgLiAkdGhpcy0+dHlwZSAuICRrZXl3b3JkIC4gJHRoaXMtPmxpbWl0Ow0KDQoNCiRpdGVtcyA9ICR0aGlzLT5sb2FkTGFzdEZtKCRrZXl3b3JkKTsNCg0KJHNtYXJ0eS0+YXNzaWduX2J5X3JlZignaXRlbXMnLCAkaXRlbXMpOw0KJHNtYXJ0eS0+YXNzaWduKCdyZXN1bHRzJyxjb3VudCgkaXRlbXMpKTsNCiRzbWFydHktPmFzc2lnbigna2V5d29yZCcsJGtleXdvcmQpOw0KDQplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJHRoZXRlbXBsYXRlKTsNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/action.twitter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KDQovLyBpbml0IGNhY2hlDQokY2FjaGVfa2V5d29yZCA9ICd0d2l0dGVyJyAuICRrZXl3b3JkOw0KDQokaXRlbXMgPSAkdGhpcy0+bG9hZFR3aXR0ZXIoJGtleXdvcmQpOw0KDQokc21hcnR5LT5hc3NpZ25fYnlfcmVmKCdpdGVtcycsICRpdGVtcyk7DQokc21hcnR5LT5hc3NpZ24oJ3Jlc3VsdHMnLGNvdW50KCRpdGVtcykpOw0KJHNtYXJ0eS0+YXNzaWduKCdrZXl3b3JkJywka2V5d29yZCk7DQoNCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgkdGhldGVtcGxhdGUpOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.youtube.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTW9kdWxlOiBNZWRpYUNlbnRlcg0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL21lZGlhY2VudGVyLw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmlmICghaXNzZXQoJGdDbXMpKQ0KICAgIGV4aXQ7DQoNCiR0aGlzLT5saW1pdCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd5b3V0dWJlX21heCcsIDIwKTsNCmlmICgkcGFyYW1zWyJsaW1pdCJdKSAgICAkdGhpcy0+bGltaXQgPSAkcGFyYW1zWyJsaW1pdCJdOw0KDQovLyBpbml0IGNhY2hlDQokY2FjaGVfa2V5d29yZCA9ICd5b3V0dWJlJyAuICRrZXl3b3JkIC4gJHRoaXMtPmxpbWl0Ow0KDQokaXRlbXMgPSAkdGhpcy0+bG9hZFlvdXR1YmUoJGtleXdvcmQpOw0KDQppZighJGl0ZW1zKSByZXR1cm47DQoNCmZvcmVhY2ggKCRpdGVtcyBhcyAka2V5ID0+ICRpdGVtKSB7DQoNCiAgICAkb25lcm93ID0gbmV3IHN0ZENsYXNzKCk7DQoNCiAgICAkbm9lbWJlZCA9ICRpdGVtLT5nZXRfaXRlbV90YWdzKCdodHRwOi8vZ2RhdGEueW91dHViZS5jb20vc2NoZW1hcy8yMDA3JywgJ25vZW1iZWQnKTsNCiAgICBpZiAoJG5vZW1iZWQpDQogICAgICAgIGNvbnRpbnVlOw0KDQogICAgJG1lZGlhX2dyb3VwID0gJGl0ZW0tPmdldF9pdGVtX3RhZ3MoJ2h0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvJywgJ2dyb3VwJyk7DQogICAgJG1lZGlhX3RodW1ibmFpbCA9ICRtZWRpYV9ncm91cFswXVsnY2hpbGQnXVsnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy8nXVsndGh1bWJuYWlsJ107DQogICAgJHRodW1ibmFpbCA9ICRtZWRpYV90aHVtYm5haWxbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddOw0KDQogICAgaWYgKCRlbmMgPSAkaXRlbS0+Z2V0X2VuY2xvc3VyZSgpKSB7DQogICAgICAgICR0aHVtYnMgPSAkZW5jLT5nZXRfdGh1bWJuYWlscygpOw0KICAgICAgICAkdGh1bWJuYWlsID0gJHRodW1ic1swXTsNCiAgICAgICAgJGR1cmF0aW9uID0gJGVuYy0+Z2V0X2R1cmF0aW9uKCk7DQogICAgICAgICRkZXNjcmlwdGlvbiA9ICRlbmMtPmdldF9kZXNjcmlwdGlvbigpOw0KICAgIH0NCiAgICAkcmVzdWx0MiA9IHByZWdfbWF0Y2goIi92PShbXiZdKykvIiwgJGl0ZW0tPmdldF9saW5rKCksICR2aWRlb19pZCk7DQoNCiAgICAkb25lcm93LT50aHVtYm5haWwgPSAkdGh1bWJuYWlsOw0KICAgICRvbmVyb3ctPmxpbmsgPSAkaXRlbS0+Z2V0X2xpbmsoKTsNCiAgICAkb25lcm93LT52aWRlb19pZCA9ICR2aWRlb19pZFsxXTsNCiAgICAkb25lcm93LT50aXRsZSA9ICRpdGVtLT5nZXRfdGl0bGUoKTsNCiAgICAkb25lcm93LT5sZW5naHQgPSAkbGVuZ2h0Ow0KICAgICRvbmVyb3ctPmRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uOw0KDQogICAgJGVudHJ5YXJyYXlbXSA9ICRvbmVyb3c7DQogICAgLy8kb25lcm93ID0gJHRoaXMtPkFycmF5VG9PYmplY3QoJHJvdyk7DQp9DQoNCiRzbWFydHktPmFzc2lnbl9ieV9yZWYoJ2l0ZW1zJywgJGVudHJ5YXJyYXkpOw0KJHNtYXJ0eS0+YXNzaWduKCdyZXN1bHRzJywgJGxpbWl0KTsNCiRzbWFydHktPmFzc2lnbigna2V5d29yZCcsICRrZXl3b3JkKTsNCg0KZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlKCR0aGV0ZW1wbGF0ZSk7DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_prefs_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KJHRoaXMtPlNldEN1cnJlbnRUYWIoJ3ByZWZzJyk7DQoNCiR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdhZG1pbl9zYXZlcHJlZnMnLCAkcmV0dXJuaWQsICdwb3N0JywgJ211bHRpcGFydC9mb3JtLWRhdGEnKSk7DQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsNCg0KDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhY2hlJywgJHRoaXMtPkxhbmcoJ2NhY2hlJykpOw0KDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9jYWNoZV90aW1lb3V0JywgJHRoaXMtPkxhbmcoJ2NhY2hlX3RpbWVvdXQnKSk7DQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2NhY2hlX3RpbWVvdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2NhY2hlX3RpbWVvdXQnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY2FjaGVfdGltZW91dCcpLDgsMTYpKTsNCg0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV95b3V0dWJlJywgJHRoaXMtPkxhbmcoInlvdXR1YmUiKSk7DQoNCiR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3lvdXR1YmVfbWF4JywgJHRoaXMtPkxhbmcoJ3lvdXR1YmVfbWF4JykpOw0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF95b3V0dWJlX21heCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAneW91dHViZV9tYXgnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgneW91dHViZV9tYXgnKSwgOCwgMTIpKTsNCg0KDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2JpbmcnLCAkdGhpcy0+TGFuZygiYmluZyIpKTsNCg0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfYmluZ19tYXgnLCAkdGhpcy0+TGFuZygnYmluZ19tYXgnKSk7DQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2JpbmdfbWF4JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdiaW5nX21heCcsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdiaW5nX21heCcpLCA4LCAxMikpOw0KDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9iaW5nX2FwaV9rZXknLCAkdGhpcy0+TGFuZygnYmluZ19hcGlfa2V5JykpOw0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9iaW5nX2FwaV9rZXknLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2JpbmdfYXBpX2tleScsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdiaW5nX2FwaV9rZXknKSwgNDApKTsNCg0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9sYXN0X2ZtX2FwaV9rZXknLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2xhc3RfZm1fYXBpX2tleScsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsYXN0X2ZtX2FwaV9rZXknKSwgNDApKTsNCiR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbGFzdF9mbV9tYXgnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2xhc3RfZm1fbWF4JywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xhc3RfZm1fbWF4JyksIDgsIDEyKSk7DQoNCiR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywgJycpOw0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywgbGFuZygnc3VibWl0JykpKTsNCiR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ2NhbmNlbCcsIGxhbmcoJ2NhbmNlbCcpKSk7DQoNCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgncHJlZnMudHBsJyk7DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/function.admin_templatestabs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdCgpOw0KDQppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBUZW1wbGF0ZXMnICkgKQ0Kew0KICBlY2hvICR0aGlzLT5TdGFydFRhYignZGlzcGxheV90ZW1wbGF0ZScsICRwYXJhbXMpOw0KICB7DQogICAgDQogICAgZWNobyAkdGhpcy0+U2hvd1RlbXBsYXRlTGlzdCgkaWQsJHJldHVybmlkLCdkaXNwbGF5XycsDQoJCQkgICAgIE1FRElBQ0VOVEVSX1BSRUZfTkVXTUVESUFDRU5URVJfVEVNUExBVEUsDQoJCQkgICAgICdhZG1pbl9kaXNwbGF5X3RlbXBsYXRlJywNCgkJCSAgICAgTUVESUFDRU5URVJfUFJFRl9ORVdNRURJQUNFTlRFUl9URU1QTEFURSwNCgkJCSAgICAgJHRoaXMtPkxhbmcoJ2Rpc3BsYXlfYWRkZWRpdCcpKTsNCiAgfQ0KICBlY2hvICR0aGlzLT5FbmRUYWIoKTsNCg0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMgAXANUAAJWVlaWlpbW1tfj4+BcXF+rq6pmZmcHBweLi4vr6+o2Nja2trSsrKzMzMyIiIsXFxZGRkfLy8m1tbc7OzomJieXl5UVFRf39/WFhYdXV1XZ2dtnZ2VxcXNHR0Xl5eWlpaWVlZX5+fk1NTYSEhFlZWe7u7pycnAcHB1JSUlVVVYGBgUlJSUBAQLm5uaqqqsrKyt7e3r6+vj09PaCgoHJycqKiojk5OaioqLCwsLy8vJ6ensjIyPX19fb29gAAAP///yH5BAAAAAAALAAAAAAyABcAAAb/wJ/wl7j8bjIRZhSIZDgYEE1FgQAAppnOpJvNarfAbRwIuM6LBQ4naLeGQiOAZSGFcJcFRmN6TR4xgQeBMQeDhQ87L4uLExOLDweAgXBDHhYWIh4xESESNSUFDwEzBgYmBhAmVwZYM1cAChQUV1YABgELLjiVQiF0Fh8HFSAhMAM3KCsiKRgSNBoe0h4hIxQKClZeN205hgcTOw+9PwoyKxYpAjAcFDw7GB4QBjVnLrouAgstLWz6Ai0WxJjQIcOLXQJwHCBXI4mIFSYmrDDAY4aJBTdaufJiYhWFalQM4HixAcaBVfVeZEBQgtwDOiIs0HjAYEYBATWymagBwBMH/xQiWKxAIUEBjgkIJghQ8OEDgAcICpSIUKEDuQE0ZFhYwSIHgxAIcBpQ4EFEAwcOGDSwAMJohgIIAkhgYcOChBwF8kY4KIEBuR8CuFqwMQKEjA0CANBocOJE2gYsPhjIsaFAi74ECDAIFkPvAAoETjTwS66EBhEyWKTQcELAAQUnfGhWa0FBi7cbMMQ+obkBihpRQ42ILVvG3x8xMChjoYEBidc+fDy2YKJDBQQqHET3wdtBAw1QCwww4YB3aAfHP//MJIHAKgLSISvIUCKGjejEuXuHsDICAhIMoIUWAcf9AAMNP7EAwjIuoCCbDSBM0IML8DWW34MmbFBBBHMw4P/hhz9cYAQ5AnyAAQl2aQIAYw3MMEAAu+G3XXQOAJBBBRmkMFgDPNpgg4hA9pKACRKAgIIFGnwwgwIOELBDBQzwZuGUxIFwowA2NICaDKlZIGICRQQ5RAkKSPBBCiiEoMINTJrAZIBNEhBnZhbWUMACFjhgQ0yYrADmAGCCCeSIFZT5AQkpSDDCKx9IIEOWH8I54HkTHMABC1qmIMKmA3TqaaeCivgDAhSYSYIIHGgQwBYSLMdlljzy6CEBJGSgwYkpcKArBp/2CiqYP1QAAQ0mkkACBiFkUSoHaG4qAgoo5IrBiTqMIAII007LQac9dDtAtz34ekEJLiT5AbZQ0ECCiwIjeKBBNNKEcA0E2RiAKAYcYGvAt93ywAO44faawAAPGPoMNCEAkE9CLpAChhlt4NDCDRqAIAEHACTQg78c+wswv98OcEEBOCiggZoKmHADGy0c4AdJUklFVQk8dFADBS4k8EPHPPfcMaAldHAADvu4vJJUPPDbb7+A8rCBzj8EAQA7]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aWYoISRwYXJhbXNbInZpZGVvcyJdKSByZXR1cm47DQokdmlkZW9zX2FycmF5ID0gZXhwbG9kZSgiXG4iLCRwYXJhbXNbInZpZGVvcyJdKTsNCiRmaXJzdCA9dHJ1ZTsNCmZvcmVhY2goJHZpZGVvc19hcnJheSBhcyAkdmlkZW8pew0KJHYgPSBwcmVnX21hdGNoKCIvdj0oW14mXSspLyIsJHZpZGVvLCR2aWRlb19pZCk7DQplY2hvICd7JzsNCiAgICBpZigkZmlyc3QgPT0gZmFsc2UpIGVjaG8gJywnOw0KICAgIGVjaG8gJ2lkOiBcJycudHJpbSgkdmlkZW9faWRbMV0pLidcJyc7DQogICAgJGZpcnN0ID0gZmFsc2U7DQogICAgZWNobyAnfSc7DQp9DQo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdNZWRpYUNlbnRlcic7DQokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdNb2R1bCBpbnN0YWxsZWQnOw0KJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdNb2R1bCB1bmlpbnN0YWxsZWQnOw0KJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdSZW1vdmluZyB0aGlzIG1vZHVsZSB3aWxsIGFsc28gcmVtb3ZlIGFsbCBhc3NvY2lhdGVkIGRhdGEsIGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkPyc7DQokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bCB1bmluc3RhbGxlZCc7DQokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWwgaW5zdGFsbGVkJzsNCiRsYW5nWydwcmVmc3VwZGF0ZWQnXSA9ICdTZXR0aW5ncyB1cGRhdGVkJzsNCiRsYW5nWydzdWJtaXQnXSA9ICdTYXZlJzsNCg0KJGxhbmdbJ2NhY2hlJ10gPSAnQ2FjaGUnOw0KJGxhbmdbJ2NhY2hlX2RpciddID0gJ0NhY2hlIGRpcic7DQokbGFuZ1snY2FjaGVfdGltZW91dCddID0gJ0NhY2hlIHRpbWUnOw0KDQokbGFuZ1sneW91dHViZSddID0gJ1lvdXR1YmUnOw0KJGxhbmdbJ3lvdXR1YmVfbWF4J10gPSAnTGltaXQnOw0KDQokbGFuZ1snbGFzdF9mbSddID0gJ0xhc3QuRk0nOw0KJGxhbmdbJ2xhc3RfZm1fbWF4J10gPSAnTGFzdC5GTSBsaW1pdCBwZXIgcGFnZSc7DQoNCg0KDQokbGFuZ1snYmluZyddID0gJ0JpbmcnOw0KJGxhbmdbJ2JpbmdfbWF4J10gPSAnTGltaXQnOw0KJGxhbmdbJ2JpbmdfYXBpX2tleSddID0gJ0FwaSBrZXknOw0KDQokbGFuZ1snZGlzcGxheXRlbXBsYXRlcyddID0gJ1ZpZXcgdGVtcGxhdGVzJzsNCiRsYW5nWydkZWZhdWx0dGVtcGxhdGVzJ10gPSAnRGVmYXVsdCB0ZW1wbGF0ZXMnOw0KDQokbGFuZ1snZGlzcGxheV9hZGRlZGl0J10gPSAnQWRkL0VkaXQgdmlldyB0ZW1wbGF0ZSc7DQokbGFuZ1snZXJyb3JfbWlzc19wYXInXSA9ICdTZWxlY3RlZCBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nJzsNCg0KJGxhbmdbJ3NldHRpbmdzJ10gPSAnU2V0dGluZ3MnOw0KDQojaGVscA0KJGxhbmdbJ2hlbHBfbGltaXQnXSA9ICdOdW1iZXIgb2YgaXRlbXMnIDsNCiRsYW5nWydoZWxwX2tleXdvcmQnXSA9ICdLZXl3b3JkcyBmb3Igc2VhcmNoICcgOw0KJGxhbmdbJ2hlbHBfc291cmNlJ10gPSAnU291cmNlICh5b3V0dWJlLCBiaW5nLCB0d2l0dGVyLCBsYXN0Zm0pJyA7DQokbGFuZ1snaGVscF90eXBlJ10gPSAnVHlwZXMgZGlzcGxheS4gUG9zc2libGUgcGFyYW1ldHJlczogIFdlYiwgSW1hZ2UsIFZpZGVvIGlmIHNvdXJjZT0iYmluZyIsIGFydGlzdCBvciB0cmFjayBpZiBzb3VyY2U9Imxhc3RmbSInOw0KJGxhbmdbJ2hlbHBfZGlzcGxheXRlbXBsYXRlJ10gPSAnVmlldyB0ZW1wbGF0ZScgOw0KDQokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdEaXNwbGF5aW5nIGRhdGEgZnJvbSBZb3VUdWJlLCBCaW5ndSc7DQokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPHVsPg0KPGxpPlZlcnNpb24gMC40LCBTZXB0IDIwMTAgLSBBZGQgTGFzdC5GTSBhcnRpc3RzJnRyYWNrcyBzZWFyY2g8L2xpPg0KPGxpPlZlcnNpb24gMC4zLCBTZXB0IDIwMTAgLSBBZGQgVHdpdHRlciwgbmV3IEJpbmcgUEhQIFNESywgbmV3IE5ldHRlIGNhY2hlLiBCZXR0ZXIsIGJldHRlciwgYmV0dGVyLjwvbGk+DQo8bGk+VmVyc2lvbiAwLjEsIE9jdCAyMDA5IC0gaW5pdGlhbCByZWxlYXNlPC9saT48L3VsPic7DQokbGFuZ1snaGVscCddID0gJw0KPGgzPkxpa2UgaXQ/IERvbmF0ZSA6KTwvaDM+DQogICAgPHA+PGZvcm0gYWN0aW9uPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRob2Q9InBvc3QiPg0KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY21kIiB2YWx1ZT0iX3MteGNsaWNrIj4NCjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImVuY3J5cHRlZCIgdmFsdWU9Ii0tLS0tQkVHSU4gUEtDUzctLS0tLU1JSUhQd1lKS29aSWh2Y05BUWNFb0lJSE1EQ0NCeXdDQVFFeGdnRXdNSUlCTEFJQkFEQ0JsRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjBDQVFBd0RRWUpLb1pJaHZjTkFRRUJCUUFFZ1lBZDhMZ0h1bHkwSEFkZkVRWHZZeUNXWVBsc0ZONjJoZS9URVdNS0xNUTh3cE5JNks3Y1RnT1NPcmFLQ0o0a0orVHBCZi8xak93K1B4YXdBVkpGTDd2Ulp0cGxmejFHaUdSUFhRNkd2amhkemVXQW0zdDRYckJuQVVnSUtYZTg2aTRDVkpJUy9PeXBSZUNyQTFTeXk0NGVHbGxHSnExQzRYbmdHSnErVXRXQWx6RUxNQWtHQlNzT0F3SWFCUUF3Z2J3R0NTcUdTSWIzRFFFSEFUQVVCZ2dxaGtpRzl3MERCd1FJT2tNdXBXMlJ5bmVBZ1pnYVdtUDN3OHhEMVBZQU1GcjBqbmJDRE5HbUtLaE9VNm1WMVZHWUtyOWxZSnFOaHczZDdlcXltK210QnphSHBuZ0RaUVFCTjI5YngwV2JRaldSL2MraHNPKzZnUXlrdGQ2WVNDWThqd1l0K29oTlExUjUvNFluVlpYazhzbTF3VjVhdUg1SnlJVHVNcVJRbHJWRWl2bHhMYXJ6dSsxaDVackpuWlZpbUYvK0hnUk5HWEJkWTBBcHpQeSt3TmZZbGhkcGI2V0xRM3Q1UDZDQ0E0Y3dnZ09ETUlJQzdLQURBZ0VDQWdFQU1BMEdDU3FHU0liM0RRRUJCUVVBTUlHT01Rc3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQk1DUTBFeEZqQVVCZ05WQkFjVERVMXZkVzUwWVdsdUlGWnBaWGN4RkRBU0JnTlZCQW9UQzFCaGVWQmhiQ0JKYm1NdU1STXdFUVlEVlFRTEZBcHNhWFpsWDJObGNuUnpNUkV3RHdZRFZRUURGQWhzYVhabFgyRndhVEVjTUJvR0NTcUdTSWIzRFFFSkFSWU5jbVZBY0dGNWNHRnNMbU52YlRBZUZ3MHdOREF5TVRNeE1ERXpNVFZhRncwek5UQXlNVE14TURFek1UVmFNSUdPTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZCQWNURFUxdmRXNTBZV2x1SUZacFpYY3hGREFTQmdOVkJBb1RDMUJoZVZCaGJDQkpibU11TVJNd0VRWURWUVFMRkFwc2FYWmxYMk5sY25Sek1SRXdEd1lEVlFRREZBaHNhWFpsWDJGd2FURWNNQm9HQ1NxR1NJYjNEUUVKQVJZTmNtVkFjR0Y1Y0dGc0xtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBd1VkTzNmeEV6RXRjbkk3WktaTDQxMlh2WlB1Z29uaTdpN0Q3cHJDZTBBdGFIVGM5N0NZZ203TnNBdEp5eE5MaXhtaExWOHB5SUVhaUhYV0FoOGZQS1crUjAxNytFbVhycjlFYXF1UG1zVnZUeXdBQUUxUE1OT0txbzJrbDRHeGl6OXpacUlhak9tMWZaR1djR1MwZjVKUTJrQnFOYnZiZzIvWmErR0ovcXdVQ0F3RUFBYU9CN2pDQjZ6QWRCZ05WSFE0RUZnUVVscDk4dThadkY3MVpQMUxYQ2h2c0VOWmtsR3N3Z2JzR0ExVWRJd1NCc3pDQnNJQVVscDk4dThadkY3MVpQMUxYQ2h2c0VOWmtsR3VoZ1pTa2daRXdnWTR4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVCeE1OVFc5MWJuUmhhVzRnVm1sbGR6RVVNQklHQTFVRUNoTUxVR0Y1VUdGc0lFbHVZeTR4RXpBUkJnTlZCQXNVQ214cGRtVmZZMlZ5ZEhNeEVUQVBCZ05WQkFNVUNHeHBkbVZmWVhCcE1Sd3dHZ1lKS29aSWh2Y05BUWtCRmcxeVpVQndZWGx3WVd3dVkyOXRnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFnVjg2VnBxQVd1WHZYNk9ybzRxSjF0WVZJVDVEZ1dwRTY5MkFnNDIySDd5UklyLzlqL2lLRzRUaGlhL09mbHg0VGRMK0lGSkJBeVBLOXY2elpOWnRCZ1BCeW5YYjA0OGhzUDE2bDJ2aTBrNVEySktpUERzRWZCaEdJK0hueExYRWFVV0FjVmZDc1FGdmQyQTFzeFJyNjdpcDV5Mnd3QmVsVWVjUDNBakorWWN4Z2dHYU1JSUJsZ0lCQVRDQmxEQ0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMENBUUF3Q1FZRkt3NERBaG9GQUtCZE1CZ0dDU3FHU0liM0RRRUpBekVMQmdrcWhraUc5dzBCQndFd0hBWUpLb1pJaHZjTkFRa0ZNUThYRFRFd01Ea3dOREl3TVRBeE5Gb3dJd1lKS29aSWh2Y05BUWtFTVJZRUZPMklCeHVNbDZGOXBZSkNZYzRGTjZqa1NJWjFNQTBHQ1NxR1NJYjNEUUVCQVFVQUJJR0FaYVp0K1Vla0wvMFNoOUcySXZWb1E4ZmZGb2pCaCt2MUFxWS9oOFhzUzJFdURiSkNYeHRsT25QT3J4VUZLdDVKUGJOZndjRVlJN3FXeTZRTHp1cUdITHJMQUxVM3JXUERySjdRYTVXWEVKVjJQYkFzUTJoRjlXNXAweXA2WXg5c1ZXVkFTTWgwaUlBRXhMMDJpTHoyckF0SWJZOGZlbDFjNjY5T3hUNjNwV3M9LS0tLS1FTkQgUEtDUzctLS0tLQ0KIj4NCjxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvYnRuL2J0bl9kb25hdGVfTEcuZ2lmIiBib3JkZXI9IjAiIG5hbWU9InN1Ym1pdCIgYWx0PSJQYXlQYWwgLSBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZSEiPg0KPGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vZW5fVVMvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4NCjwvZm9ybT4NCjwvcD4gICAgICANCjxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPg0KPHA+VGhpcyBtb2R1bGUgYWxsb3dzIHlvdSB0byBkaXNwbGF5IGRhdGEgZnJvbSBvdGhlciBwYWdlcyBvbiB5b3VyIHNpdGUuIA0KQ3VycmVudGx5IHlvdSBjYW4gZGlzcGxheSBkYXRhIGZyb20gQmluZy5jb20gKHdlYiBwYWdlcywgcGljdHVyZXMsIHZpZGVvcyksIFlvdVR1YmUuY29tIGFuZCBUd2l0dGVyLmNvbSA8L3A+DQo8aDQ+VXNpbmcgQmluZzwvaDQ+DQo8cD5HZW5lcmF0ZSBBcGkga2V5IGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5iaW5nLmNvbS9kZXZlbG9wZXJzLyI+d3d3LmJpbmcuY29tL2RldmVsb3BlcnM8L2E+LiBUaGlzIEtleSBwYXN0ZSBpbiB0aGUgc2V0dGluZ3MgdGFiICBNZWRpYSBDZW50ZXIgbW9kdWxlLjwvcD4NCjxwPlVzZSB0YWc8YnIgLz4NCntjbXNfbW9kdWxlIG1vZHVsZT0iTWVkaWFDZW50ZXIiIHNvdXJjZT0iYmluZyIgdHlwZT0iV2ViIiBkaXNwbGF5dGVtcGxhdGU9IkJpbmdXZWIiIGtleXdvcmQ9ImtleXdvcmRzIn08YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0iTWVkaWFDZW50ZXIiIHNvdXJjZT0iYmluZyIgdHlwZT0iSW1hZ2UiIGRpc3BsYXl0ZW1wbGF0ZT0iQmluZ0ltYWdlIiBrZXl3b3JkPSJrZXl3b3JkcyJ9PGJyIC8+DQpvciB7Y21zX21vZHVsZSBtb2R1bGU9Ik1lZGlhQ2VudGVyIiBzb3VyY2U9ImJpbmciIHR5cGU9IlZpZGVvIiBkaXNwbGF5dGVtcGxhdGU9IkJpbmdWaWRlbyIga2V5d29yZD0ia2V5d29yZHMifS4NCjwvcD4NCjxoND5Vc2luZyBZb3V0dWJlPC9oND4NCjxwPlVzZSB0YWcgPGJyIC8+e2Ntc19tb2R1bGUgbW9kdWxlPSJNZWRpYUNlbnRlciIgc291cmNlPSJ5b3V0dWJlIiBkaXNwbGF5dGVtcGxhdGU9IllvdXR1YmUiIGtleXdvcmQ9ImtleXdvcmRzIn08L3A+DQo8aDQ+VXNpbmcgVHdpdHRlcjwvaDQ+DQo8cD5Vc2UgdGFnIDxiciAvPntjbXNfbW9kdWxlIG1vZHVsZT0iTWVkaWFDZW50ZXIiIHNvdXJjZT0idHdpdHRlciIgZGlzcGxheXRlbXBsYXRlPSJUd2l0dGVyIiBrZXl3b3JkPSJrZXl3b3JkcyJ9PC9wPg0KPHA+VXNlIHRhZyBmb3IgdHdlZWV0IDxiciAvPntnZXRfdHdlZXQgdXJsPSJodHRwOi8vdHdpdHRlci5jb20vIyEvbWF4Y2FsaWJyZS9zdGF0dXMvNzgzODgzNjM5OTYwNDEyMTYiIGRpc3BsYXl0ZW1wbGF0ZT0iVHdlZXQiIGV4cGlyZT0zNjAwfSBvciBwYXJhbSBpZD0iNzgzODgzNjM5OTYwNDEyMTYiPC9wPg0KPGg0PlVzaW5nIExhc3QuRk08L2g0Pg0KPHA+VXNlIHRhZyA8YnIgLz57Y21zX21vZHVsZSBtb2R1bGU9Ik1lZGlhQ2VudGVyIiB0eXBlPSJhcnRpc3QiIHNvdXJjZT0ibGFzdGZtIiBrZXl3b3JkPSJFbWluZW0iIGRpc3BsYXl0ZW1wbGF0ZT0iTGFzdEZNQXJ0aXN0In08YnIgLz4NCntjbXNfbW9kdWxlIG1vZHVsZT0iTWVkaWFDZW50ZXIiIHNvdXJjZT0ibGFzdGZtIiAgdHlwZT0idHJhY2siIGtleXdvcmQ9IkVtaW5lbSIgZGlzcGxheXRlbXBsYXRlPSJMYXN0Rk1UcmFjayJ9PC9wPg0KPHA+R2VuZXJhdGUgQXBpIGtleSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFzdC5mbS9hcGkvYWNjb3VudCI+d3d3Lmxhc3QuZm0vYXBpL2FjY291bnQ8L2E+LiBUaGlzIEtleSBwYXN0ZSBpbiB0aGUgc2V0dGluZ3MgdGFiICBNZWRpYSBDZW50ZXIgbW9kdWxlLjwvcD4NCjxwPg0KPC9wPg0KDQonOw0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ01lZGlhQ2VudGVyICc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0xlIG1vZHVsZSBNZWRpYUNlbnRlciBhICZlYWN1dGU7dCZlYWN1dGU7IGluc3RhbGwmZWFjdXRlOyc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnTGUgbW9kdWxlIE1lZGlhQ2VudGVyIGEgJmVhY3V0ZTt0JmVhY3V0ZTsgZCZlYWN1dGU7c2luc3RhbGwmZWFjdXRlOyc7CiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnU3VwcHJpbWVyIGNlIG1vZHVsZSB2YSAmZWFjdXRlO2dhbGVtZW50IHN1cHByaW1lciB0b3V0ZXMgbGVzIGRvbm4mZWFjdXRlO2VzIGFzc29jaSZlYWN1dGU7ZXMuICZFY2lyYzt0ZXMtdm91cyBzJnVjaXJjO3IgZGUgdm91bG9pciBjb250aW51ZXIgPyc7CiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBNZWRpYUNlbnRlciBkJmVhY3V0ZTtzaW5zdGFsbCZlYWN1dGU7JzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSBNZWRpYUNlbnRlciBpbnN0YWxsJmVhY3V0ZTsnOwokbGFuZ1sncHJlZnN1cGRhdGVkJ10gPSAnUGFyYW0mZWdyYXZlO3RyZXMgbWlzICZhZ3JhdmU7IGpvdXInOwokbGFuZ1snc3VibWl0J10gPSAnRW5yZWdpc3RyZXInOwokbGFuZ1snY2FjaGUnXSA9ICdDYWNoZSAnOwokbGFuZ1snY2FjaGVfZGlyJ10gPSAnUiZlYWN1dGU7cGVydG9pcmUgZGUgY2FjaGUnOwokbGFuZ1snY2FjaGVfdGltZW91dCddID0gJ0R1ciZlYWN1dGU7ZSBkZSBjYWNoZSc7CiRsYW5nWyd5b3V0dWJlJ10gPSAnWW91dHViZSAnOwokbGFuZ1sneW91dHViZV9tYXgnXSA9ICdMaW1pdGUnOwokbGFuZ1snaW1lZW0nXSA9ICdJbWVlbSAnOwokbGFuZ1snaW1lZW1fbWF4J10gPSAnTGltaXRlJzsKJGxhbmdbJ2ltZWVtX2FwaV9rZXknXSA9ICdDbGVmIGQmIzAzOTtBcGknOwokbGFuZ1snaW1lZW1fc2VjcmV0X2tleSddID0gJ0NsZWYgc2VjciZlZ3JhdmU7dGUnOwokbGFuZ1snYmluZyddID0gJ0JpbmcgJzsKJGxhbmdbJ2JpbmdfbWF4J10gPSAnTGltaXRlJzsKJGxhbmdbJ2JpbmdfYXBpX2tleSddID0gJ0NsZWYgZCYjMDM5O0FwaSc7CiRsYW5nWydkaXNwbGF5dGVtcGxhdGVzJ10gPSAnR2FiYXJpdHMgZCYjMDM5O2FmZmljaGFnZSc7CiRsYW5nWydkZWZhdWx0dGVtcGxhdGVzJ10gPSAnR2FiYXJpdHMgcGFyIGQmZWFjdXRlO2ZhdXQnOwokbGFuZ1snZGlzcGxheV9hZGRlZGl0J10gPSAnQWpvdXRlci9FZGl0ZXIgdW4gZ2FiYXJpdCBkJiMwMzk7YWZmaWNoYWdlJzsKJGxhbmdbJ2Vycm9yX21pc3NfcGFyJ10gPSAnTGVzIHBhcmFtJmVncmF2ZTt0cmVzIGQmIzAzOTtlbnRyJmVhY3V0ZTtlIHMmZWFjdXRlO2xlY3Rpb25uJmVhY3V0ZTtzIHNvbnQgbWFucXVhbnQnOwokbGFuZ1snc2V0dGluZ3MnXSA9ICdQYXJhbSZlZ3JhdmU7dHJlcyc7CiRsYW5nWydoZWxwX2xpbWl0J10gPSAnTm9tYnJlIGQmIzAzOTtpdGVtcyc7CiRsYW5nWydoZWxwX2tleXdvcmQnXSA9ICdNb3RzIGNsZWZzJzsKJGxhbmdbJ2hlbHBfc291cmNlJ10gPSAnU291cmNlJm5ic3A7LSZuYnNwO3lvdXR1YmUsIGJpbmcsIGltZWVtJzsKJGxhbmdbJ2hlbHBfdHlwZSddID0gJ3R5cGVzIGQmIzAzOTthZmZpY2hhZ2UuIFBhcmFtZXRyZXMgIFdlYiwgSW1hZ2UsIFZpZGVvLiBPbmx5IGlmIHNvdXJjZT0mcXVvdDtiaW5nJnF1b3Q7JzsKJGxhbmdbJ2hlbHBfZGlzcGxheXRlbXBsYXRlJ10gPSAnR2FiYXJpdCBkJiMwMzk7YWZmaWNoYWdlJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQWZmaWNoZSBkZXMgZG9ubiZlYWN1dGU7ZXMgZGUgWW91VHViZSwgQmluZ3UsIEltZWVtLic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+DQo8bGk+VmVyc2lvbiAwLjksIE9jdCAyMDA5IC0gdmVyc2lvbiBpbml0aWFsZTwvbGk+PC91bD4nOwokbGFuZ1snaGVscCddID0gJzxoMz5RdWUgZmFpdCBjZSBtb2R1bGUgPzwvaDM+DQo8cD5DZSBtb2R1bGUgcGVybWV0IGQmIzAzOTthZmZpY2hlciBzdXIgdm90cmUgc2l0ZSBkZXMgZG9ubiZlYWN1dGU7ZXMgaXNzdWVzIGQmIzAzOTthdXRyZXMgcGFnZXMgZXh0ZXJuZXMuIA0KQWN0dWVsbGVtZW50LCB2b3VzIHBvdXZleiBhZmZpY2hlciBkZXMgZG9ubiZlYWN1dGU7ZXMgZGUgQmluZy5jb20gKHBhZ2VzIHdlYiwgaW1hZ2VzLCB2aWRlb3MpLCBZb3VUdWJlLmNvbSBldCBJbWVlbS5jb208L3A+DQo8aDQ+UG91ciBwb3V2b2lyIHV0aWxpc2VyIEJpbmc8L2g0Pg0KPHA+RyZlYWN1dGU7biZlYWN1dGU7cmVyIGxhIGNsZWYgZCYjMDM5O0FwaSBkZXB1aXMgPGEgaHJlZj0iaHR0cDovL3d3dy5iaW5nLmNvbS9kZXZlbG9wZXJzLyI+d3d3LmJpbmcuY29tL2RldmVsb3BlcnM8L2E+LiBDb3BpZXIgY2V0dGUgY2xlZiBkYW5zIGwmIzAzOTtvbmdsZXQgUGFyYW0mZWdyYXZlO3RyZXMgZHUgbW9kdWxlIE1lZGlhQ2VudGVyLjwvcD4NCjxwPlV0aWxpc2F0aW9uIGRlcyBiYWxpc2VzIDo8YnIgLz4NCntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O1dlYiZxdW90OyBkaXNwbGF5dGVtcGxhdGU9JnF1b3Q7QmluZ1dlYiZxdW90OyBrZXl3b3JkPSZxdW90O2tleXdvcmRzJnF1b3Q7fTxiciAvPg0Kb3Uge2Ntc19tb2R1bGUgbW9kdWxlPSZxdW90O01lZGlhQ2VudGVyJnF1b3Q7IHNvdXJjZT0mcXVvdDtiaW5nJnF1b3Q7IHR5cGU9JnF1b3Q7SW1hZ2UmcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0JpbmdJbWFnZSZxdW90OyBrZXl3b3JkPSZxdW90O2tleXdvcmRzJnF1b3Q7fTxiciAvPg0Kb3Uge2Ntc19tb2R1bGUgbW9kdWxlPSZxdW90O01lZGlhQ2VudGVyJnF1b3Q7IHNvdXJjZT0mcXVvdDtiaW5nJnF1b3Q7IHR5cGU9JnF1b3Q7VmlkZW8mcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0JpbmdWaWRlbyZxdW90OyBrZXl3b3JkPSZxdW90O2tleXdvcmRzJnF1b3Q7fS4NCjwvcD4NCjxoND5Qb3VyIHV0aWxpc2VyIEltZWVtPC9oND4NCjxwPkcmZWFjdXRlO24mZWFjdXRlO3JlciB1bmUgY2xlZiBkJiMwMzk7QXBpIGV0IHVuZSBjbGVmIHNlY3ImZWdyYXZlO3RlIGRlcHVpcyA8YSBocmVmPSJodHRwOi8vd3d3LmltZWVtLmNvbS9kZXZlbG9wZXJzLyI+d3d3LmltZWVtLmNvbS9kZXZlbG9wZXJzPC9hPi4gQ29waWVyIGNlcyBjbGVmcyBkYW5zIGwmIzAzOTtvbmdsZXQgUGFyYW0mZWdyYXZlO3RyZXMgZHUgbW9kdWxlIE1lZGlhQ2VudGVyLjwvcD4NCjxwPlV0aWxpc2F0aW9uIGRlcyBiYWxpc2VzIDo8YnIgLz4NCntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7aW1lZW0mcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0ltZWVtJnF1b3Q7IGtleXdvcmQ9JnF1b3Q7a2V5d29yZHMmcXVvdDt9PC9wPiANCjxoND5Qb3VyIHV0aWxpc2VyIFlvdXR1YmU8L2g0Pg0KPHA+VXRpbGlzYXRpb24gZGVzIGJhbGlzZXMgOjxiciAvPntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7eW91dHViZSZxdW90OyBkaXNwbGF5dGVtcGxhdGU9JnF1b3Q7WW91dHViZSZxdW90OyBrZXl3b3JkPSZxdW90O0vEviZ1YWN1dGU7xI1vdiZlYWN1dGU7IHNsb3YmYWFjdXRlOyBwcmUgdnloxL5hZCZhYWN1dGU7dmFuaWUmcXVvdDt9PC9wPiANCic7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ01lZGlhIENlbnRlcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ01vZHVsZSBnZSZpdW1sO25zdGFsbGVlcmQnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsZSBnZWRlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnVmVyd2lqZGVyZW4gdmFuIGRlemUgbW9kdWxlIHJlc3VsdGVlcmQgb29rIGluIGhldCB2ZXJ3aWpkZXJlbiB2YW4gYWxsZSBnZWFzc29jaWVlcmRlIGRhdGEuIFdlZXQgdSB6ZWtlciBkYXQgdSB3aWx0IHZlcmRlciBnYWFuPyc7CiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBnZWRlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWydpbnN0YWxsZWQnXSA9ICdNb2R1bGUgZ2UmaXVtbDtuc3RhbGxlZXJkJzsKJGxhbmdbJ3ByZWZzdXBkYXRlZCddID0gJ0luc3RlbGxpbmdlbiBvcHNsYWFuJzsKJGxhbmdbJ3N1Ym1pdCddID0gJ09wc2xhYW4nOwokbGFuZ1snY2FjaGUnXSA9ICdCdWZmZXInOwokbGFuZ1snY2FjaGVfZGlyJ10gPSAnQnVmZmVyIG1hcCc7CiRsYW5nWydjYWNoZV90aW1lb3V0J10gPSAnQnVmZmVyIHRpamQnOwokbGFuZ1sneW91dHViZSddID0gJ1lvdVR1YmUgJzsKJGxhbmdbJ3lvdXR1YmVfbWF4J10gPSAnTGltaWV0JzsKJGxhbmdbJ2ltZWVtJ10gPSAnSW1lZW0gJzsKJGxhbmdbJ2ltZWVtX21heCddID0gJ0xpbWlldCc7CiRsYW5nWydpbWVlbV9hcGlfa2V5J10gPSAnQXBpIHNsZXV0ZWwnOwokbGFuZ1snaW1lZW1fc2VjcmV0X2tleSddID0gJ0dlaGVpbWUgc2xldXRlbCc7CiRsYW5nWydiaW5nJ10gPSAnQmluZyAnOwokbGFuZ1snYmluZ19tYXgnXSA9ICdMaW1pZXQnOwokbGFuZ1snYmluZ19hcGlfa2V5J10gPSAnQXBpIHNsZXV0ZWwnOwokbGFuZ1snZGlzcGxheXRlbXBsYXRlcyddID0gJ092ZXJ6aWNodCBzamFibG9uZW4nOwokbGFuZ1snZGVmYXVsdHRlbXBsYXRlcyddID0gJ1N0YW5kYWFyZCBzamFibG9vbic7CiRsYW5nWydkaXNwbGF5X2FkZGVkaXQnXSA9ICdUb2V2b2VnZW4vd2lqemlnZW4gT3ZlcnppY2h0IFNqYWJsb25lbic7CiRsYW5nWydlcnJvcl9taXNzX3BhciddID0gJ0RlIGdlc2VsZWN0ZWVyZGUgaW5wdXQgcGFyYW1ldGVycyB6aWpuIG5pZXQgYWFud2V6aWcnOwokbGFuZ1snc2V0dGluZ3MnXSA9ICdJbnN0ZWxsaW5nZW4nOwokbGFuZ1snaGVscF9saW1pdCddID0gJ0FhbnRhbCBpdGVtcyc7CiRsYW5nWydoZWxwX2tleXdvcmQnXSA9ICdTbGV1dGVsd29vcmRlbic7CiRsYW5nWydoZWxwX3NvdXJjZSddID0gJ0Jyb24gLSBZb3VUdWJlLCBCaW5nLCBJbWVlbSc7CiRsYW5nWydoZWxwX3R5cGUnXSA9ICdkaXNwbGF5IHR5cGVzLiBQYXJhbWV0cmVzICBXZWIsIEltYWdlLCBWaWRlby4gT25seSBpZiBzb3VyY2U9JnF1b3Q7YmluZyZxdW90Oyc7CiRsYW5nWydoZWxwX2Rpc3BsYXl0ZW1wbGF0ZSddID0gJ092ZXJ6aWNodCBzamFibG9vbic7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ1Rvb24gZGF0YSB2YW4gWW91VHViZSwgQmluZ3UsIEltZWVtLic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+DQo8bGk+VmVyc2lvbiAwLjksIE9jdCAyMDA5IC0gaW5pdGlhbCByZWxlYXNlIDwvbGk+PC91bD4nOwokbGFuZ1snaGVscCddID0gJzxoMz5XaGF0IERvZXMgVGhpcyBEbz8gPC9oMz4NCjxwPlRoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gZGlzcGxheSBkYXRhIGZyb20gb3RoZXIgcGFnZXMgb24geW91ciBzaXRlLiANCkN1cnJlbnRseSB5b3UgY2FuIGRpc3BsYXkgZGF0YSBmcm9tIEJpbmcuY29tICh3ZWIgcGFnZXMsIHBpY3R1cmVzLCB2aWRlb3MpLCBZb3VUdWJlLmNvbSBhbmQgSW1lZW0uY29tPC9wPg0KPGg0PlVzaW5nIEJpbmc8L2g0Pg0KPHA+R2VuZXJhdGUgQXBpIGtleSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmluZy5jb20vZGV2ZWxvcGVycy8iPnd3dy5iaW5nLmNvbS9kZXZlbG9wZXJzPC9hPi4gVGhpcyBLZXkgcGFzdGUgaW4gdGhlIHNldHRpbmdzIHRhYiAgTWVkaWEgQ2VudGVyIG1vZHVsZS48L3A+DQo8cD5Vc2UgdGFnPGJyIC8+DQp7Y21zX21vZHVsZSBtb2R1bGU9JnF1b3Q7TWVkaWFDZW50ZXImcXVvdDsgc291cmNlPSZxdW90O2JpbmcmcXVvdDsgdHlwZT0mcXVvdDtXZWImcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0JpbmdXZWImcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O0ltYWdlJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nSW1hZ2UmcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O1ZpZGVvJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nVmlkZW8mcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O30uDQo8L3A+DQo8aDQ+VXNpbmcgSW1lZW08L2g0Pg0KPHA+R2VuZXJhdGUgQXBpIGtleSBhIFNlY3JldCBrZXkgb24gPGEgaHJlZj0iaHR0cDovL3d3dy5pbWVlbS5jb20vZGV2ZWxvcGVycy8iPnd3dy5pbWVlbS5jb20vZGV2ZWxvcGVyczwvYT4uIFRoZXNlIGtleXMgcGFzdGUgaW4gdGhlIHNldHRpbmdzIHRhYiAgTWVkaWEgQ2VudGVyIG1vZHVsZS48L3A+DQo8cD5Vc2UgdGFnIDxiciAvPntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7aW1lZW0mcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0ltZWVtJnF1b3Q7IGtleXdvcmQ9JnF1b3Q7a2V5d29yZHMmcXVvdDt9PC9wPiANCjxoND5Vc2luZyBZb3V0dWJlPC9oND4NCjxwPlVzZSB0YWcgPGJyIC8+e2Ntc19tb2R1bGUgbW9kdWxlPSZxdW90O01lZGlhQ2VudGVyJnF1b3Q7IHNvdXJjZT0mcXVvdDt5b3V0dWJlJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtZb3V0dWJlJnF1b3Q7IGtleXdvcmQ9JnF1b3Q7S8S+JnVhY3V0ZTvEjW92JmVhY3V0ZTsgc2xvdiZhYWN1dGU7IHByZSB2eWjEvmFkJmFhY3V0ZTt2YW5pZSZxdW90O308L3A+IA0KJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMTk0NTIzNzUwMy4xMjU3NDI3NjU0LjEyNTgwNDg1NjcuMTI1ODA0ODYxNi4zOCc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNTgwMjI0MTIuMzMuMi51dG1jY249KHJlZmVycmFsKXx1dG1jc3I9Zm9ydW0uY21zbWFkZXNpbXBsZS5vcmd8dXRtY2N0PS9pbmRleC5waHAvdG9waWMsMzkwMDUuMC5odG1sfHV0bWNtZD1yZWZlcnJhbCc7CiRsYW5nWydxY2EnXSA9ICdQMC0xMjk0NDAyNzYwLTEyNTc0Mjc2NTQ0MDgnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEyNTgwNDg2MTYnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sk_SK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NlbnRydW0gbSZlYWN1dGU7ZGlpJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnTW9kdWwgbmFpbiZzY2Fyb247dGFsb3ZhbiZ5YWN1dGU7JzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdNb2R1bCBvZGluJnNjYXJvbjt0YWxvdmFuJnlhY3V0ZTsnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ09kc3RyJmFhY3V0ZTtuZW4maWFjdXRlO20gbW9kdWx1IHZ5bWHFvmV0ZSB2JnNjYXJvbjtldGt5IHByaXNsdWNoJmFhY3V0ZTtqJnVhY3V0ZTtjZSBkJmFhY3V0ZTt0YS4gQ2hjZXRlIHBva3JhxI1vdmHFpT8nOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bCBvZGluJnNjYXJvbjt0YWxvdmFuJnlhY3V0ZTsnOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWwgbmFpbiZzY2Fyb247dGFsb3ZhbiZ5YWN1dGU7JzsKJGxhbmdbJ3ByZWZzdXBkYXRlZCddID0gJ05hc3RhdmVuaWEgdXByYXZlbiZlYWN1dGU7JzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1Vsb8W+acWlJzsKJGxhbmdbJ2NhY2hlJ10gPSAnS2Umc2Nhcm9uOyc7CiRsYW5nWydjYWNoZV9kaXInXSA9ICdBZHJlcyZhYWN1dGU7ciBwcmUga2Umc2Nhcm9uO292YW5pZSc7CiRsYW5nWydjYWNoZV90aW1lb3V0J10gPSAnxIxhcyBrZSZzY2Fyb247b3ZhbmlhJzsKJGxhbmdbJ3lvdXR1YmUnXSA9ICdZb3V0dWJlJzsKJGxhbmdbJ3lvdXR1YmVfbWF4J10gPSAnTGltaXQnOwokbGFuZ1snYmluZyddID0gJ0JpbmcnOwokbGFuZ1snYmluZ19tYXgnXSA9ICdMaW1pdCc7CiRsYW5nWydiaW5nX2FwaV9rZXknXSA9ICdBcGkga8S+JnVhY3V0ZTvEjSc7CiRsYW5nWydkaXNwbGF5dGVtcGxhdGVzJ10gPSAnJlNjYXJvbjthYmwmb2FjdXRlO25hIHpvYnJhemVuaWEnOwokbGFuZ1snZGVmYXVsdHRlbXBsYXRlcyddID0gJ1ByZWRuYXN0YXZlbiZlYWN1dGU7ICZzY2Fyb247YWJsJm9hY3V0ZTtueSc7CiRsYW5nWydkaXNwbGF5X2FkZGVkaXQnXSA9ICdQcmlkYcWlL1VwcmF2acWlICZzY2Fyb247YWJsJm9hY3V0ZTtudSB6b2JyYXplbmlhJzsKJGxhbmdbJ2Vycm9yX21pc3NfcGFyJ10gPSAnVnlicmFuJmVhY3V0ZTsgdnN0dXBuJmVhY3V0ZTsgcGFyYW1ldHJlIG5lYm9saSB6YWRhbiZlYWN1dGU7JzsKJGxhbmdbJ3NldHRpbmdzJ10gPSAnTmFzdGF2ZW5pYSc7CiRsYW5nWydoZWxwX2xpbWl0J10gPSAnUG/EjWV0IHBvbG/Fvmllayc7CiRsYW5nWydoZWxwX2tleXdvcmQnXSA9ICdLxL4mdWFjdXRlO8SNb3YmZWFjdXRlOyBzbG92JmFhY3V0ZTsnOwokbGFuZ1snaGVscF90eXBlJ10gPSAndHlwIHpvYnJhemVuaWEuIFBhcmFtZXRyZSBXZWIsIEltYWdlLCBWaWRlby4gSWJhIHByaSBzb3VyY2U9JnF1b3Q7YmluZyZxdW90Oyc7CiRsYW5nWydoZWxwX2Rpc3BsYXl0ZW1wbGF0ZSddID0gJyZTY2Fyb247YWJsJm9hY3V0ZTtuYSB6b2JyYXplbmlhJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnWm9icmF6ZW5pZSBkJmFhY3V0ZTt0IHogWW91VHViZSBhIEJpbmd1JzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD4NCjxsaT5WZXJzaW9uIDAuOSwgT2N0IDIwMDkgLSBwcnYmZWFjdXRlOyB2eWRhbmllPC9saT48L3VsPic7CiRsYW5nWydoZWxwJ10gPSAnPGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+DQo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIGRpc3BsYXkgZGF0YSBmcm9tIG90aGVyIHBhZ2VzIG9uIHlvdXIgc2l0ZS4gDQpDdXJyZW50bHkgeW91IGNhbiBkaXNwbGF5IGRhdGEgZnJvbSBCaW5nLmNvbSAod2ViIHBhZ2VzLCBwaWN0dXJlcywgdmlkZW9zKSwgWW91VHViZS5jb20gPC9wPg0KPGg0PlVzaW5nIEJpbmc8L2g0Pg0KPHA+R2VuZXJhdGUgQXBpIGtleSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmluZy5jb20vZGV2ZWxvcGVycy8iPnd3dy5iaW5nLmNvbS9kZXZlbG9wZXJzPC9hPi4gVGhpcyBLZXkgcGFzdGUgaW4gdGhlIHNldHRpbmdzIHRhYiAgTWVkaWEgQ2VudGVyIG1vZHVsZS48L3A+DQo8cD5Vc2UgdGFnPGJyIC8+DQp7Y21zX21vZHVsZSBtb2R1bGU9JnF1b3Q7TWVkaWFDZW50ZXImcXVvdDsgc291cmNlPSZxdW90O2JpbmcmcXVvdDsgdHlwZT0mcXVvdDtXZWImcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0JpbmdXZWImcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O0ltYWdlJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nSW1hZ2UmcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O1ZpZGVvJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nVmlkZW8mcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O30uDQo8L3A+DQo8aDQ+VXNpbmcgWW91dHViZTwvaDQ+DQo8cD5Vc2UgdGFnIDxiciAvPntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7eW91dHViZSZxdW90OyBkaXNwbGF5dGVtcGxhdGU9JnF1b3Q7WW91dHViZSZxdW90OyBrZXl3b3JkPSZxdW90O0vEviZ1YWN1dGU7xI1vdiZlYWN1dGU7IHNsb3YmYWFjdXRlOyBwcmUgdnloxL5hZCZhYWN1dGU7dmFuaWUmcXVvdDt9PC9wPiANCic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjE0MjMxMDk3MjUuMTI4MDI1OTAxNi4xMjgzODgzMzk1LjEyODQxNDc5OTUuMzInOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjg0MTQ3OTk1LjMyLjMwLnV0bWNzcj1kZXYuY21zbWFkZXNpbXBsZS5vcmd8dXRtY2NuPShyZWZlcnJhbCl8dXRtY21kPXJlZmVycmFsfHV0bWNjdD0vcHJvamVjdC9maWxlcy84NzMnOwokbGFuZ1sncWNhJ10gPSAnUDAtNzQ4NDM5MTMxLTEyODAyNTkwMTc1MjQnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4yLjEwLjEyODQxNDc5OTUnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Bing/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Bing/Search/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.facebook.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewogIHRocm93IG5ldyBFeGNlcHRpb24oJ0ZhY2Vib29rIG5lZWRzIHRoZSBDVVJMIFBIUCBleHRlbnNpb24uJyk7Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb25fZGVjb2RlJykpIHsKICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdGYWNlYm9vayBuZWVkcyB0aGUgSlNPTiBQSFAgZXh0ZW5zaW9uLicpOwp9CgovKioKICogVGhyb3duIHdoZW4gYW4gQVBJIGNhbGwgcmV0dXJucyBhbiBleGNlcHRpb24uCiAqCiAqIEBhdXRob3IgTmFpdGlrIFNoYWggPG5haXRpa0BmYWNlYm9vay5jb20+CiAqLwpjbGFzcyBGYWNlYm9va0FwaUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgLyoqCiAgICogVGhlIHJlc3VsdCBmcm9tIHRoZSBBUEkgc2VydmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLgogICAqLwogIHByb3RlY3RlZCAkcmVzdWx0OwoKICAvKioKICAgKiBNYWtlIGEgbmV3IEFQSSBFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gcmVzdWx0LgogICAqCiAgICogQHBhcmFtIEFycmF5ICRyZXN1bHQgdGhlIHJlc3VsdCBmcm9tIHRoZSBBUEkgc2VydmVyCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRyZXN1bHQpIHsKICAgICR0aGlzLT5yZXN1bHQgPSAkcmVzdWx0OwoKICAgICRjb2RlID0gaXNzZXQoJHJlc3VsdFsnZXJyb3JfY29kZSddKSA/ICRyZXN1bHRbJ2Vycm9yX2NvZGUnXSA6IDA7CiAgICAkbXNnICA9IGlzc2V0KCRyZXN1bHRbJ2Vycm9yJ10pCiAgICAgICAgICAgICAgPyAkcmVzdWx0WydlcnJvciddWydtZXNzYWdlJ10gOiAkcmVzdWx0WydlcnJvcl9tc2cnXTsKICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1zZywgJGNvZGUpOwogIH0KCiAgLyoqCiAgICogUmV0dXJuIHRoZSBhc3NvY2lhdGVkIHJlc3VsdCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIEFQSSBzZXJ2ZXIuCiAgICoKICAgKiBAcmV0dXJucyBBcnJheSB0aGUgcmVzdWx0IGZyb20gdGhlIEFQSSBzZXJ2ZXIKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzdWx0KCkgewogICAgcmV0dXJuICR0aGlzLT5yZXN1bHQ7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIHR5cGUgZm9yIHRoZSBlcnJvci4gVGhpcyB3aWxsIGRlZmF1bHQgdG8KICAgKiAnRXhjZXB0aW9uJyB3aGVuIGEgdHlwZSBpcyBub3QgYXZhaWxhYmxlLgogICAqCiAgICogQHJldHVybiBTdHJpbmcKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpIHsKICAgIHJldHVybgogICAgICBpc3NldCgkdGhpcy0+cmVzdWx0WydlcnJvciddKSAmJiBpc3NldCgkdGhpcy0+cmVzdWx0WydlcnJvciddWyd0eXBlJ10pCiAgICAgID8gJHRoaXMtPnJlc3VsdFsnZXJyb3InXVsndHlwZSddCiAgICAgIDogJ0V4Y2VwdGlvbic7CiAgfQoKICAvKioKICAgKiBUbyBtYWtlIGRlYnVnZ2luZyBlYXNpZXIuCiAgICoKICAgKiBAcmV0dXJucyBTdHJpbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpIHsKICAgICRzdHIgPSAkdGhpcy0+Z2V0VHlwZSgpIC4gJzogJzsKICAgIGlmICgkdGhpcy0+Y29kZSAhPSAwKSB7CiAgICAgICRzdHIgLj0gJHRoaXMtPmNvZGUgLiAnOiAnOwogICAgfQogICAgcmV0dXJuICRzdHIgLiAkdGhpcy0+bWVzc2FnZTsKICB9Cn0KCi8qKgogKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIEZhY2Vib29rIFBsYXRmb3JtLgogKgogKiBAYXV0aG9yIE5haXRpayBTaGFoIDxuYWl0aWtAZmFjZWJvb2suY29tPgogKi8KY2xhc3MgRmFjZWJvb2sKewogIC8qKgogICAqIFZlcnNpb24uCiAgICovCiAgY29uc3QgVkVSU0lPTiA9ICcyLjEuMSc7CgogIC8qKgogICAqIERlZmF1bHQgb3B0aW9ucyBmb3IgY3VybC4KICAgKi8KICBwdWJsaWMgc3RhdGljICRDVVJMX09QVFMgPSBhcnJheSgKICAgIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgPT4gMTAsCiAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCiAgICBDVVJMT1BUX1RJTUVPVVQgICAgICAgID0+IDYwLAogICAgQ1VSTE9QVF9VU0VSQUdFTlQgICAgICA9PiAnZmFjZWJvb2stcGhwLTIuMCcsCiAgKTsKCiAgLyoqCiAgICogTGlzdCBvZiBxdWVyeSBwYXJhbWV0ZXJzIHRoYXQgZ2V0IGF1dG9tYXRpY2FsbHkgZHJvcHBlZCB3aGVuIHJlYnVpbGRpbmcKICAgKiB0aGUgY3VycmVudCBVUkwuCiAgICovCiAgcHJvdGVjdGVkIHN0YXRpYyAkRFJPUF9RVUVSWV9QQVJBTVMgPSBhcnJheSgKICAgICdzZXNzaW9uJywKICAgICdzaWduZWRfcmVxdWVzdCcsCiAgKTsKCiAgLyoqCiAgICogTWFwcyBhbGlhc2VzIHRvIEZhY2Vib29rIGRvbWFpbnMuCiAgICovCiAgcHVibGljIHN0YXRpYyAkRE9NQUlOX01BUCA9IGFycmF5KAogICAgJ2FwaScgICAgICA9PiAnaHR0cHM6Ly9hcGkuZmFjZWJvb2suY29tLycsCiAgICAnYXBpX3JlYWQnID0+ICdodHRwczovL2FwaS1yZWFkLmZhY2Vib29rLmNvbS8nLAogICAgJ2dyYXBoJyAgICA9PiAnaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vJywKICAgICd3d3cnICAgICAgPT4gJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS8nLAogICk7CgogIC8qKgogICAqIFRoZSBBcHBsaWNhdGlvbiBJRC4KICAgKi8KICBwcm90ZWN0ZWQgJGFwcElkOwoKICAvKioKICAgKiBUaGUgQXBwbGljYXRpb24gQVBJIFNlY3JldC4KICAgKi8KICBwcm90ZWN0ZWQgJGFwaVNlY3JldDsKCiAgLyoqCiAgICogVGhlIGFjdGl2ZSB1c2VyIHNlc3Npb24sIGlmIG9uZSBpcyBhdmFpbGFibGUuCiAgICovCiAgcHJvdGVjdGVkICRzZXNzaW9uOwoKICAvKioKICAgKiBUaGUgZGF0YSBmcm9tIHRoZSBzaWduZWRfcmVxdWVzdCB0b2tlbi4KICAgKi8KICBwcm90ZWN0ZWQgJHNpZ25lZFJlcXVlc3Q7CgogIC8qKgogICAqIEluZGljYXRlcyB0aGF0IHdlIGFscmVhZHkgbG9hZGVkIHRoZSBzZXNzaW9uIGFzIGJlc3QgYXMgd2UgY291bGQuCiAgICovCiAgcHJvdGVjdGVkICRzZXNzaW9uTG9hZGVkID0gZmFsc2U7CgogIC8qKgogICAqIEluZGljYXRlcyBpZiBDb29raWUgc3VwcG9ydCBzaG91bGQgYmUgZW5hYmxlZC4KICAgKi8KICBwcm90ZWN0ZWQgJGNvb2tpZVN1cHBvcnQgPSBmYWxzZTsKCiAgLyoqCiAgICogQmFzZSBkb21haW4gZm9yIHRoZSBDb29raWUuCiAgICovCiAgcHJvdGVjdGVkICRiYXNlRG9tYWluID0gJyc7CgogIC8qKgogICAqIEluZGljYXRlcyBpZiB0aGUgQ1VSTCBiYXNlZCBAIHN5bnRheCBmb3IgZmlsZSB1cGxvYWRzIGlzIGVuYWJsZWQuCiAgICovCiAgcHJvdGVjdGVkICRmaWxlVXBsb2FkU3VwcG9ydCA9IGZhbHNlOwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgRmFjZWJvb2sgQXBwbGljYXRpb24uCiAgICoKICAgKiBUaGUgY29uZmlndXJhdGlvbjoKICAgKiAtIGFwcElkOiB0aGUgYXBwbGljYXRpb24gSUQKICAgKiAtIHNlY3JldDogdGhlIGFwcGxpY2F0aW9uIHNlY3JldAogICAqIC0gY29va2llOiAob3B0aW9uYWwpIGJvb2xlYW4gdHJ1ZSB0byBlbmFibGUgY29va2llIHN1cHBvcnQKICAgKiAtIGRvbWFpbjogKG9wdGlvbmFsKSBkb21haW4gZm9yIHRoZSBjb29raWUKICAgKiAtIGZpbGVVcGxvYWQ6IChvcHRpb25hbCkgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGZpbGUgdXBsb2FkcyBhcmUgZW5hYmxlZAogICAqCiAgICogQHBhcmFtIEFycmF5ICRjb25maWcgdGhlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGNvbmZpZykgewogICAgJHRoaXMtPnNldEFwcElkKCRjb25maWdbJ2FwcElkJ10pOwogICAgJHRoaXMtPnNldEFwaVNlY3JldCgkY29uZmlnWydzZWNyZXQnXSk7CiAgICBpZiAoaXNzZXQoJGNvbmZpZ1snY29va2llJ10pKSB7CiAgICAgICR0aGlzLT5zZXRDb29raWVTdXBwb3J0KCRjb25maWdbJ2Nvb2tpZSddKTsKICAgIH0KICAgIGlmIChpc3NldCgkY29uZmlnWydkb21haW4nXSkpIHsKICAgICAgJHRoaXMtPnNldEJhc2VEb21haW4oJGNvbmZpZ1snZG9tYWluJ10pOwogICAgfQogICAgaWYgKGlzc2V0KCRjb25maWdbJ2ZpbGVVcGxvYWQnXSkpIHsKICAgICAgJHRoaXMtPnNldEZpbGVVcGxvYWRTdXBwb3J0KCRjb25maWdbJ2ZpbGVVcGxvYWQnXSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBTZXQgdGhlIEFwcGxpY2F0aW9uIElELgogICAqCiAgICogQHBhcmFtIFN0cmluZyAkYXBwSWQgdGhlIEFwcGxpY2F0aW9uIElECiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHNldEFwcElkKCRhcHBJZCkgewogICAgJHRoaXMtPmFwcElkID0gJGFwcElkOwogICAgcmV0dXJuICR0aGlzOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBBcHBsaWNhdGlvbiBJRC4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBBcHBsaWNhdGlvbiBJRAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRBcHBJZCgpIHsKICAgIHJldHVybiAkdGhpcy0+YXBwSWQ7CiAgfQoKICAvKioKICAgKiBTZXQgdGhlIEFQSSBTZWNyZXQuCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nICRhcHBJZCB0aGUgQVBJIFNlY3JldAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzZXRBcGlTZWNyZXQoJGFwaVNlY3JldCkgewogICAgJHRoaXMtPmFwaVNlY3JldCA9ICRhcGlTZWNyZXQ7CiAgICByZXR1cm4gJHRoaXM7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIEFQSSBTZWNyZXQuCiAgICoKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgQVBJIFNlY3JldAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRBcGlTZWNyZXQoKSB7CiAgICByZXR1cm4gJHRoaXMtPmFwaVNlY3JldDsKICB9CgogIC8qKgogICAqIFNldCB0aGUgQ29va2llIFN1cHBvcnQgc3RhdHVzLgogICAqCiAgICogQHBhcmFtIEJvb2xlYW4gJGNvb2tpZVN1cHBvcnQgdGhlIENvb2tpZSBTdXBwb3J0IHN0YXR1cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzZXRDb29raWVTdXBwb3J0KCRjb29raWVTdXBwb3J0KSB7CiAgICAkdGhpcy0+Y29va2llU3VwcG9ydCA9ICRjb29raWVTdXBwb3J0OwogICAgcmV0dXJuICR0aGlzOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBDb29raWUgU3VwcG9ydCBzdGF0dXMuCiAgICoKICAgKiBAcmV0dXJuIEJvb2xlYW4gdGhlIENvb2tpZSBTdXBwb3J0IHN0YXR1cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiB1c2VDb29raWVTdXBwb3J0KCkgewogICAgcmV0dXJuICR0aGlzLT5jb29raWVTdXBwb3J0OwogIH0KCiAgLyoqCiAgICogU2V0IHRoZSBiYXNlIGRvbWFpbiBmb3IgdGhlIENvb2tpZS4KICAgKgogICAqIEBwYXJhbSBTdHJpbmcgJGRvbWFpbiB0aGUgYmFzZSBkb21haW4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc2V0QmFzZURvbWFpbigkZG9tYWluKSB7CiAgICAkdGhpcy0+YmFzZURvbWFpbiA9ICRkb21haW47CiAgICByZXR1cm4gJHRoaXM7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIGJhc2UgZG9tYWluIGZvciB0aGUgQ29va2llLgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGJhc2UgZG9tYWluCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldEJhc2VEb21haW4oKSB7CiAgICByZXR1cm4gJHRoaXMtPmJhc2VEb21haW47CiAgfQoKICAvKioKICAgKiBTZXQgdGhlIGZpbGUgdXBsb2FkIHN1cHBvcnQgc3RhdHVzLgogICAqCiAgICogQHBhcmFtIFN0cmluZyAkZG9tYWluIHRoZSBiYXNlIGRvbWFpbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzZXRGaWxlVXBsb2FkU3VwcG9ydCgkZmlsZVVwbG9hZFN1cHBvcnQpIHsKICAgICR0aGlzLT5maWxlVXBsb2FkU3VwcG9ydCA9ICRmaWxlVXBsb2FkU3VwcG9ydDsKICAgIHJldHVybiAkdGhpczsKICB9CgogIC8qKgogICAqIEdldCB0aGUgZmlsZSB1cGxvYWQgc3VwcG9ydCBzdGF0dXMuCiAgICoKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYmFzZSBkb21haW4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gdXNlRmlsZVVwbG9hZFN1cHBvcnQoKSB7CiAgICByZXR1cm4gJHRoaXMtPmZpbGVVcGxvYWRTdXBwb3J0OwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBkYXRhIGZyb20gYSBzaWduZWRfcmVxdWVzdCB0b2tlbgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGJhc2UgZG9tYWluCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldFNpZ25lZFJlcXVlc3QoKSB7CiAgICBpZiAoISR0aGlzLT5zaWduZWRSZXF1ZXN0KSB7CiAgICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3NpZ25lZF9yZXF1ZXN0J10pKSB7CiAgICAgICAgJHRoaXMtPnNpZ25lZFJlcXVlc3QgPSAkdGhpcy0+cGFyc2VTaWduZWRSZXF1ZXN0KAogICAgICAgICAgJF9SRVFVRVNUWydzaWduZWRfcmVxdWVzdCddKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICR0aGlzLT5zaWduZWRSZXF1ZXN0OwogIH0KCiAgLyoqCiAgICogU2V0IHRoZSBTZXNzaW9uLgogICAqCiAgICogQHBhcmFtIEFycmF5ICRzZXNzaW9uIHRoZSBzZXNzaW9uCiAgICogQHBhcmFtIEJvb2xlYW4gJHdyaXRlX2Nvb2tpZSBpbmRpY2F0ZSBpZiBhIGNvb2tpZSBzaG91bGQgYmUgd3JpdHRlbi4gdGhpcwogICAqIHZhbHVlIGlzIGlnbm9yZWQgaWYgY29va2llIHN1cHBvcnQgaGFzIGJlZW4gZGlzYWJsZWQuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHNldFNlc3Npb24oJHNlc3Npb249bnVsbCwgJHdyaXRlX2Nvb2tpZT10cnVlKSB7CiAgICAkc2Vzc2lvbiA9ICR0aGlzLT52YWxpZGF0ZVNlc3Npb25PYmplY3QoJHNlc3Npb24pOwogICAgJHRoaXMtPnNlc3Npb25Mb2FkZWQgPSB0cnVlOwogICAgJHRoaXMtPnNlc3Npb24gPSAkc2Vzc2lvbjsKICAgIGlmICgkd3JpdGVfY29va2llKSB7CiAgICAgICR0aGlzLT5zZXRDb29raWVGcm9tU2Vzc2lvbigkc2Vzc2lvbik7CiAgICB9CiAgICByZXR1cm4gJHRoaXM7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIHNlc3Npb24gb2JqZWN0LiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBsb29rIGZvciBhIHNpZ25lZCBzZXNzaW9uCiAgICogc2VudCB2aWEgdGhlIHNpZ25lZF9yZXF1ZXN0LCBDb29raWUgb3IgUXVlcnkgUGFyYW1ldGVycyBpZiBuZWVkZWQuCiAgICoKICAgKiBAcmV0dXJuIEFycmF5IHRoZSBzZXNzaW9uCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldFNlc3Npb24oKSB7CiAgICBpZiAoISR0aGlzLT5zZXNzaW9uTG9hZGVkKSB7CiAgICAgICRzZXNzaW9uID0gbnVsbDsKICAgICAgJHdyaXRlX2Nvb2tpZSA9IHRydWU7CgogICAgICAvLyB0cnkgbG9hZGluZyBzZXNzaW9uIGZyb20gc2lnbmVkX3JlcXVlc3QgaW4gJF9SRVFVRVNUCiAgICAgICRzaWduZWRSZXF1ZXN0ID0gJHRoaXMtPmdldFNpZ25lZFJlcXVlc3QoKTsKICAgICAgaWYgKCRzaWduZWRSZXF1ZXN0KSB7CiAgICAgICAgLy8gc2lnIGlzIGdvb2QsIHVzZSB0aGUgc2lnbmVkUmVxdWVzdAogICAgICAgICRzZXNzaW9uID0gJHRoaXMtPmNyZWF0ZVNlc3Npb25Gcm9tU2lnbmVkUmVxdWVzdCgkc2lnbmVkUmVxdWVzdCk7CiAgICAgIH0KCiAgICAgIC8vIHRyeSBsb2FkaW5nIHNlc3Npb24gZnJvbSAkX1JFUVVFU1QKICAgICAgaWYgKCEkc2Vzc2lvbiAmJiBpc3NldCgkX1JFUVVFU1RbJ3Nlc3Npb24nXSkpIHsKICAgICAgICAkc2Vzc2lvbiA9IGpzb25fZGVjb2RlKAogICAgICAgICAgZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKQogICAgICAgICAgICA/IHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbJ3Nlc3Npb24nXSkKICAgICAgICAgICAgOiAkX1JFUVVFU1RbJ3Nlc3Npb24nXSwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICAgICRzZXNzaW9uID0gJHRoaXMtPnZhbGlkYXRlU2Vzc2lvbk9iamVjdCgkc2Vzc2lvbik7CiAgICAgIH0KCiAgICAgIC8vIHRyeSBsb2FkaW5nIHNlc3Npb24gZnJvbSBjb29raWUgaWYgbmVjZXNzYXJ5CiAgICAgIGlmICghJHNlc3Npb24gJiYgJHRoaXMtPnVzZUNvb2tpZVN1cHBvcnQoKSkgewogICAgICAgICRjb29raWVOYW1lID0gJHRoaXMtPmdldFNlc3Npb25Db29raWVOYW1lKCk7CiAgICAgICAgaWYgKGlzc2V0KCRfQ09PS0lFWyRjb29raWVOYW1lXSkpIHsKICAgICAgICAgICRzZXNzaW9uID0gYXJyYXkoKTsKICAgICAgICAgIHBhcnNlX3N0cih0cmltKAogICAgICAgICAgICBnZXRfbWFnaWNfcXVvdGVzX2dwYygpCiAgICAgICAgICAgICAgPyBzdHJpcHNsYXNoZXMoJF9DT09LSUVbJGNvb2tpZU5hbWVdKQogICAgICAgICAgICAgIDogJF9DT09LSUVbJGNvb2tpZU5hbWVdLAogICAgICAgICAgICAnIicKICAgICAgICAgICksICRzZXNzaW9uKTsKICAgICAgICAgICRzZXNzaW9uID0gJHRoaXMtPnZhbGlkYXRlU2Vzc2lvbk9iamVjdCgkc2Vzc2lvbik7CiAgICAgICAgICAvLyB3cml0ZSBvbmx5IGlmIHdlIG5lZWQgdG8gZGVsZXRlIGEgaW52YWxpZCBzZXNzaW9uIGNvb2tpZQogICAgICAgICAgJHdyaXRlX2Nvb2tpZSA9IGVtcHR5KCRzZXNzaW9uKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICR0aGlzLT5zZXRTZXNzaW9uKCRzZXNzaW9uLCAkd3JpdGVfY29va2llKTsKICAgIH0KCiAgICByZXR1cm4gJHRoaXMtPnNlc3Npb247CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIFVJRCBmcm9tIHRoZSBzZXNzaW9uLgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIFVJRCBpZiBhdmFpbGFibGUKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlcigpIHsKICAgICRzZXNzaW9uID0gJHRoaXMtPmdldFNlc3Npb24oKTsKICAgIHJldHVybiAkc2Vzc2lvbiA/ICRzZXNzaW9uWyd1aWQnXSA6IG51bGw7CiAgfQoKICAvKioKICAgKiBHZXRzIGEgT0F1dGggYWNjZXNzIHRva2VuLgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGFjY2VzcyB0b2tlbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbigpIHsKICAgICRzZXNzaW9uID0gJHRoaXMtPmdldFNlc3Npb24oKTsKICAgIC8vIGVpdGhlciB1c2VyIHNlc3Npb24gc2lnbmVkLCBvciBhcHAgc2lnbmVkCiAgICBpZiAoJHNlc3Npb24pIHsKICAgICAgcmV0dXJuICRzZXNzaW9uWydhY2Nlc3NfdG9rZW4nXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+Z2V0QXBwSWQoKSAuJ3wnLiAkdGhpcy0+Z2V0QXBpU2VjcmV0KCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBHZXQgYSBMb2dpbiBVUkwgZm9yIHVzZSB3aXRoIHJlZGlyZWN0cy4gQnkgZGVmYXVsdCwgZnVsbCBwYWdlIHJlZGlyZWN0IGlzCiAgICogYXNzdW1lZC4gSWYgeW91IGFyZSB1c2luZyB0aGUgZ2VuZXJhdGVkIFVSTCB3aXRoIGEgd2luZG93Lm9wZW4oKSBjYWxsIGluCiAgICogSmF2YVNjcmlwdCwgeW91IGNhbiBwYXNzIGluIGRpc3BsYXk9cG9wdXAgYXMgcGFydCBvZiB0aGUgJHBhcmFtcy4KICAgKgogICAqIFRoZSBwYXJhbWV0ZXJzOgogICAqIC0gbmV4dDogdGhlIHVybCB0byBnbyB0byBhZnRlciBhIHN1Y2Nlc3NmdWwgbG9naW4KICAgKiAtIGNhbmNlbF91cmw6IHRoZSB1cmwgdG8gZ28gdG8gYWZ0ZXIgdGhlIHVzZXIgY2FuY2VscwogICAqIC0gcmVxX3Blcm1zOiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZXF1ZXN0ZWQgZXh0ZW5kZWQgcGVybXMKICAgKiAtIGRpc3BsYXk6IGNhbiBiZSAicGFnZSIgKGRlZmF1bHQsIGZ1bGwgcGFnZSkgb3IgInBvcHVwIgogICAqCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgcHJvdmlkZSBjdXN0b20gcGFyYW1ldGVycwogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBVUkwgZm9yIHRoZSBsb2dpbiBmbG93CiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldExvZ2luVXJsKCRwYXJhbXM9YXJyYXkoKSkgewogICAgJGN1cnJlbnRVcmwgPSAkdGhpcy0+Z2V0Q3VycmVudFVybCgpOwogICAgcmV0dXJuICR0aGlzLT5nZXRVcmwoCiAgICAgICd3d3cnLAogICAgICAnbG9naW4ucGhwJywKICAgICAgYXJyYXlfbWVyZ2UoYXJyYXkoCiAgICAgICAgJ2FwaV9rZXknICAgICAgICAgPT4gJHRoaXMtPmdldEFwcElkKCksCiAgICAgICAgJ2NhbmNlbF91cmwnICAgICAgPT4gJGN1cnJlbnRVcmwsCiAgICAgICAgJ2Rpc3BsYXknICAgICAgICAgPT4gJ3BhZ2UnLAogICAgICAgICdmYmNvbm5lY3QnICAgICAgID0+IDEsCiAgICAgICAgJ25leHQnICAgICAgICAgICAgPT4gJGN1cnJlbnRVcmwsCiAgICAgICAgJ3JldHVybl9zZXNzaW9uJyAgPT4gMSwKICAgICAgICAnc2Vzc2lvbl92ZXJzaW9uJyA9PiAzLAogICAgICAgICd2JyAgICAgICAgICAgICAgID0+ICcxLjAnLAogICAgICApLCAkcGFyYW1zKQogICAgKTsKICB9CgogIC8qKgogICAqIEdldCBhIExvZ291dCBVUkwgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHJlZGlyZWN0cy4KICAgKgogICAqIFRoZSBwYXJhbWV0ZXJzOgogICAqIC0gbmV4dDogdGhlIHVybCB0byBnbyB0byBhZnRlciBhIHN1Y2Nlc3NmdWwgbG9nb3V0CiAgICoKICAgKiBAcGFyYW0gQXJyYXkgJHBhcmFtcyBwcm92aWRlIGN1c3RvbSBwYXJhbWV0ZXJzCiAgICogQHJldHVybiBTdHJpbmcgdGhlIFVSTCBmb3IgdGhlIGxvZ291dCBmbG93CiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldExvZ291dFVybCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Z2V0VXJsKAogICAgICAnd3d3JywKICAgICAgJ2xvZ291dC5waHAnLAogICAgICBhcnJheV9tZXJnZShhcnJheSgKICAgICAgICAnbmV4dCcgICAgICAgICA9PiAkdGhpcy0+Z2V0Q3VycmVudFVybCgpLAogICAgICAgICdhY2Nlc3NfdG9rZW4nID0+ICR0aGlzLT5nZXRBY2Nlc3NUb2tlbigpLAogICAgICApLCAkcGFyYW1zKQogICAgKTsKICB9CgogIC8qKgogICAqIEdldCBhIGxvZ2luIHN0YXR1cyBVUkwgdG8gZmV0Y2ggdGhlIHN0YXR1cyBmcm9tIGZhY2Vib29rLgogICAqCiAgICogVGhlIHBhcmFtZXRlcnM6CiAgICogLSBva19zZXNzaW9uOiB0aGUgVVJMIHRvIGdvIHRvIGlmIGEgc2Vzc2lvbiBpcyBmb3VuZAogICAqIC0gbm9fc2Vzc2lvbjogdGhlIFVSTCB0byBnbyB0byBpZiB0aGUgdXNlciBpcyBub3QgY29ubmVjdGVkCiAgICogLSBub191c2VyOiB0aGUgVVJMIHRvIGdvIHRvIGlmIHRoZSB1c2VyIGlzIG5vdCBzaWduZWQgaW50byBmYWNlYm9vawogICAqCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgcHJvdmlkZSBjdXN0b20gcGFyYW1ldGVycwogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBVUkwgZm9yIHRoZSBsb2dvdXQgZmxvdwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2dpblN0YXR1c1VybCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Z2V0VXJsKAogICAgICAnd3d3JywKICAgICAgJ2V4dGVybi9sb2dpbl9zdGF0dXMucGhwJywKICAgICAgYXJyYXlfbWVyZ2UoYXJyYXkoCiAgICAgICAgJ2FwaV9rZXknICAgICAgICAgPT4gJHRoaXMtPmdldEFwcElkKCksCiAgICAgICAgJ25vX3Nlc3Npb24nICAgICAgPT4gJHRoaXMtPmdldEN1cnJlbnRVcmwoKSwKICAgICAgICAnbm9fdXNlcicgICAgICAgICA9PiAkdGhpcy0+Z2V0Q3VycmVudFVybCgpLAogICAgICAgICdva19zZXNzaW9uJyAgICAgID0+ICR0aGlzLT5nZXRDdXJyZW50VXJsKCksCiAgICAgICAgJ3Nlc3Npb25fdmVyc2lvbicgPT4gMywKICAgICAgKSwgJHBhcmFtcykKICAgICk7CiAgfQoKICAvKioKICAgKiBNYWtlIGFuIEFQSSBjYWxsLgogICAqCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgdGhlIEFQSSBjYWxsIHBhcmFtZXRlcnMKICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHJlc3BvbnNlCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGFwaSgvKiBwb2x5bW9ycGhpYyAqLykgewogICAgJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiAgICBpZiAoaXNfYXJyYXkoJGFyZ3NbMF0pKSB7CiAgICAgIHJldHVybiAkdGhpcy0+X3Jlc3RzZXJ2ZXIoJGFyZ3NbMF0pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnX2dyYXBoJyksICRhcmdzKTsKICAgIH0KICB9CgogIC8qKgogICAqIEludm9rZSB0aGUgb2xkIHJlc3RzZXJ2ZXIucGhwIGVuZHBvaW50LgogICAqCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgbWV0aG9kIGNhbGwgb2JqZWN0CiAgICogQHJldHVybiB0aGUgZGVjb2RlZCByZXNwb25zZSBvYmplY3QKICAgKiBAdGhyb3dzIEZhY2Vib29rQXBpRXhjZXB0aW9uCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZXN0c2VydmVyKCRwYXJhbXMpIHsKICAgIC8vIGdlbmVyaWMgYXBwbGljYXRpb24gbGV2ZWwgcGFyYW1ldGVycwogICAgJHBhcmFtc1snYXBpX2tleSddID0gJHRoaXMtPmdldEFwcElkKCk7CiAgICAkcGFyYW1zWydmb3JtYXQnXSA9ICdqc29uLXN0cmluZ3MnOwoKICAgICRyZXN1bHQgPSBqc29uX2RlY29kZSgkdGhpcy0+X29hdXRoUmVxdWVzdCgKICAgICAgJHRoaXMtPmdldEFwaVVybCgkcGFyYW1zWydtZXRob2QnXSksCiAgICAgICRwYXJhbXMKICAgICksIHRydWUpOwoKICAgIC8vIHJlc3VsdHMgYXJlIHJldHVybmVkLCBlcnJvcnMgYXJlIHRocm93bgogICAgaWYgKGlzX2FycmF5KCRyZXN1bHQpICYmIGlzc2V0KCRyZXN1bHRbJ2Vycm9yX2NvZGUnXSkpIHsKICAgICAgdGhyb3cgbmV3IEZhY2Vib29rQXBpRXhjZXB0aW9uKCRyZXN1bHQpOwogICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICAvKioKICAgKiBJbnZva2UgdGhlIEdyYXBoIEFQSS4KICAgKgogICAqIEBwYXJhbSBTdHJpbmcgJHBhdGggdGhlIHBhdGggKHJlcXVpcmVkKQogICAqIEBwYXJhbSBTdHJpbmcgJG1ldGhvZCB0aGUgaHR0cCBtZXRob2QgKGRlZmF1bHQgJ0dFVCcpCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgdGhlIHF1ZXJ5L3Bvc3QgZGF0YQogICAqIEByZXR1cm4gdGhlIGRlY29kZWQgcmVzcG9uc2Ugb2JqZWN0CiAgICogQHRocm93cyBGYWNlYm9va0FwaUV4Y2VwdGlvbgogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBfZ3JhcGgoJHBhdGgsICRtZXRob2Q9J0dFVCcsICRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzX2FycmF5KCRtZXRob2QpICYmIGVtcHR5KCRwYXJhbXMpKSB7CiAgICAgICRwYXJhbXMgPSAkbWV0aG9kOwogICAgICAkbWV0aG9kID0gJ0dFVCc7CiAgICB9CiAgICAkcGFyYW1zWydtZXRob2QnXSA9ICRtZXRob2Q7IC8vIG1ldGhvZCBvdmVycmlkZSBhcyB3ZSBhbHdheXMgZG8gYSBQT1NUCgogICAgJHJlc3VsdCA9IGpzb25fZGVjb2RlKCR0aGlzLT5fb2F1dGhSZXF1ZXN0KAogICAgICAkdGhpcy0+Z2V0VXJsKCdncmFwaCcsICRwYXRoKSwKICAgICAgJHBhcmFtcwogICAgKSwgdHJ1ZSk7CgogICAgLy8gcmVzdWx0cyBhcmUgcmV0dXJuZWQsIGVycm9ycyBhcmUgdGhyb3duCiAgICBpZiAoaXNfYXJyYXkoJHJlc3VsdCkgJiYgaXNzZXQoJHJlc3VsdFsnZXJyb3InXSkpIHsKICAgICAgJGUgPSBuZXcgRmFjZWJvb2tBcGlFeGNlcHRpb24oJHJlc3VsdCk7CiAgICAgIGlmICgkZS0+Z2V0VHlwZSgpID09PSAnT0F1dGhFeGNlcHRpb24nKSB7CiAgICAgICAgJHRoaXMtPnNldFNlc3Npb24obnVsbCk7CiAgICAgIH0KICAgICAgdGhyb3cgJGU7CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIC8qKgogICAqIE1ha2UgYSBPQXV0aCBSZXF1ZXN0CiAgICoKICAgKiBAcGFyYW0gU3RyaW5nICRwYXRoIHRoZSBwYXRoIChyZXF1aXJlZCkKICAgKiBAcGFyYW0gQXJyYXkgJHBhcmFtcyB0aGUgcXVlcnkvcG9zdCBkYXRhCiAgICogQHJldHVybiB0aGUgZGVjb2RlZCByZXNwb25zZSBvYmplY3QKICAgKiBAdGhyb3dzIEZhY2Vib29rQXBpRXhjZXB0aW9uCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9vYXV0aFJlcXVlc3QoJHVybCwgJHBhcmFtcykgewogICAgaWYgKCFpc3NldCgkcGFyYW1zWydhY2Nlc3NfdG9rZW4nXSkpIHsKICAgICAgJHBhcmFtc1snYWNjZXNzX3Rva2VuJ10gPSAkdGhpcy0+Z2V0QWNjZXNzVG9rZW4oKTsKICAgIH0KCiAgICAvLyBqc29uX2VuY29kZSBhbGwgcGFyYW1zIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3RyaW5ncwogICAgZm9yZWFjaCAoJHBhcmFtcyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICBpZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CiAgICAgICAgJHBhcmFtc1ska2V5XSA9IGpzb25fZW5jb2RlKCR2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkdGhpcy0+bWFrZVJlcXVlc3QoJHVybCwgJHBhcmFtcyk7CiAgfQoKICAvKioKICAgKiBNYWtlcyBhbiBIVFRQIHJlcXVlc3QuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyBpZgogICAqIGRldmVsb3BlcnMgd2FudCB0byBkbyBmYW5jaWVyIHRoaW5ncyBvciB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gY3VybCB0bwogICAqIG1ha2UgdGhlIHJlcXVlc3QuCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nICR1cmwgdGhlIFVSTCB0byBtYWtlIHRoZSByZXF1ZXN0IHRvCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgdGhlIHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgUE9TVCBib2R5CiAgICogQHBhcmFtIEN1cmxIYW5kbGVyICRjaCBvcHRpb25hbCBpbml0aWFsaXplZCBjdXJsIGhhbmRsZQogICAqIEByZXR1cm4gU3RyaW5nIHRoZSByZXNwb25zZSB0ZXh0CiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0KCR1cmwsICRwYXJhbXMsICRjaD1udWxsKSB7CiAgICBpZiAoISRjaCkgewogICAgICAkY2ggPSBjdXJsX2luaXQoKTsKICAgIH0KCiAgICAkb3B0cyA9IHNlbGY6OiRDVVJMX09QVFM7CiAgICBpZiAoJHRoaXMtPnVzZUZpbGVVcGxvYWRTdXBwb3J0KCkpIHsKICAgICAgJG9wdHNbQ1VSTE9QVF9QT1NURklFTERTXSA9ICRwYXJhbXM7CiAgICB9IGVsc2UgewogICAgICAkb3B0c1tDVVJMT1BUX1BPU1RGSUVMRFNdID0gaHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zLCBudWxsLCAnJicpOwogICAgfQogICAgJG9wdHNbQ1VSTE9QVF9VUkxdID0gJHVybDsKCiAgICAvLyBkaXNhYmxlIHRoZSAnRXhwZWN0OiAxMDAtY29udGludWUnIGJlaGF2aW91ci4gVGhpcyBjYXVzZXMgQ1VSTCB0byB3YWl0CiAgICAvLyBmb3IgMiBzZWNvbmRzIGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGhlYWRlci4KICAgIGlmIChpc3NldCgkb3B0c1tDVVJMT1BUX0hUVFBIRUFERVJdKSkgewogICAgICAkZXhpc3RpbmdfaGVhZGVycyA9ICRvcHRzW0NVUkxPUFRfSFRUUEhFQURFUl07CiAgICAgICRleGlzdGluZ19oZWFkZXJzW10gPSAnRXhwZWN0Oic7CiAgICAgICRvcHRzW0NVUkxPUFRfSFRUUEhFQURFUl0gPSAkZXhpc3RpbmdfaGVhZGVyczsKICAgIH0gZWxzZSB7CiAgICAgICRvcHRzW0NVUkxPUFRfSFRUUEhFQURFUl0gPSBhcnJheSgnRXhwZWN0OicpOwogICAgfQoKICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjaCwgJG9wdHMpOwogICAgJHJlc3VsdCA9IGN1cmxfZXhlYygkY2gpOwogICAgaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICRlID0gbmV3IEZhY2Vib29rQXBpRXhjZXB0aW9uKGFycmF5KAogICAgICAgICdlcnJvcl9jb2RlJyA9PiBjdXJsX2Vycm5vKCRjaCksCiAgICAgICAgJ2Vycm9yJyAgICAgID0+IGFycmF5KAogICAgICAgICAgJ21lc3NhZ2UnID0+IGN1cmxfZXJyb3IoJGNoKSwKICAgICAgICAgICd0eXBlJyAgICA9PiAnQ3VybEV4Y2VwdGlvbicsCiAgICAgICAgKSwKICAgICAgKSk7CiAgICAgIGN1cmxfY2xvc2UoJGNoKTsKICAgICAgdGhyb3cgJGU7CiAgICB9CiAgICBjdXJsX2Nsb3NlKCRjaCk7CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIC8qKgogICAqIFRoZSBuYW1lIG9mIHRoZSBDb29raWUgdGhhdCBjb250YWlucyB0aGUgc2Vzc2lvbi4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb29raWUgbmFtZQogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRTZXNzaW9uQ29va2llTmFtZSgpIHsKICAgIHJldHVybiAnZmJzXycgLiAkdGhpcy0+Z2V0QXBwSWQoKTsKICB9CgogIC8qKgogICAqIFNldCBhIEpTIENvb2tpZSBiYXNlZCBvbiB0aGUgX3Bhc3NlZCBpbl8gc2Vzc2lvbi4gSXQgZG9lcyBub3QgdXNlIHRoZQogICAqIGN1cnJlbnRseSBzdG9yZWQgc2Vzc2lvbiAtLSB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHBhc3MgaXQgaW4uCiAgICoKICAgKiBAcGFyYW0gQXJyYXkgJHNlc3Npb24gdGhlIHNlc3Npb24gdG8gdXNlIGZvciBzZXR0aW5nIHRoZSBjb29raWUKICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0Q29va2llRnJvbVNlc3Npb24oJHNlc3Npb249bnVsbCkgewogICAgaWYgKCEkdGhpcy0+dXNlQ29va2llU3VwcG9ydCgpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAkY29va2llTmFtZSA9ICR0aGlzLT5nZXRTZXNzaW9uQ29va2llTmFtZSgpOwogICAgJHZhbHVlID0gJ2RlbGV0ZWQnOwogICAgJGV4cGlyZXMgPSB0aW1lKCkgLSAzNjAwOwogICAgJGRvbWFpbiA9ICR0aGlzLT5nZXRCYXNlRG9tYWluKCk7CiAgICBpZiAoJHNlc3Npb24pIHsKICAgICAgJHZhbHVlID0gJyInIC4gaHR0cF9idWlsZF9xdWVyeSgkc2Vzc2lvbiwgbnVsbCwgJyYnKSAuICciJzsKICAgICAgaWYgKGlzc2V0KCRzZXNzaW9uWydiYXNlX2RvbWFpbiddKSkgewogICAgICAgICRkb21haW4gPSAkc2Vzc2lvblsnYmFzZV9kb21haW4nXTsKICAgICAgfQogICAgICAkZXhwaXJlcyA9ICRzZXNzaW9uWydleHBpcmVzJ107CiAgICB9CgogICAgLy8gcHJlcGVuZCBkb3QgaWYgYSBkb21haW4gaXMgZm91bmQKICAgIGlmICgkZG9tYWluKSB7CiAgICAgICRkb21haW4gPSAnLicgLiAkZG9tYWluOwogICAgfQoKICAgIC8vIGlmIGFuIGV4aXN0aW5nIGNvb2tpZSBpcyBub3Qgc2V0LCB3ZSBkb250IG5lZWQgdG8gZGVsZXRlIGl0CiAgICBpZiAoJHZhbHVlID09ICdkZWxldGVkJyAmJiBlbXB0eSgkX0NPT0tJRVskY29va2llTmFtZV0pKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoaGVhZGVyc19zZW50KCkpIHsKICAgICAgc2VsZjo6ZXJyb3JMb2coJ0NvdWxkIG5vdCBzZXQgY29va2llLiBIZWFkZXJzIGFscmVhZHkgc2VudC4nKTsKCiAgICAvLyBpZ25vcmUgZm9yIGNvZGUgY292ZXJhZ2UgYXMgd2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHNldGNvb2tpZSBpbiBhIENMSQogICAgLy8gZW52aXJvbm1lbnQKICAgIC8vIEBjb2RlQ292ZXJhZ2VJZ25vcmVTdGFydAogICAgfSBlbHNlIHsKICAgICAgc2V0Y29va2llKCRjb29raWVOYW1lLCAkdmFsdWUsICRleHBpcmVzLCAnLycsICRkb21haW4pOwogICAgfQogICAgLy8gQGNvZGVDb3ZlcmFnZUlnbm9yZUVuZAogIH0KCiAgLyoqCiAgICogVmFsaWRhdGVzIGEgc2Vzc2lvbl92ZXJzaW9uPTMgc3R5bGUgc2Vzc2lvbiBvYmplY3QuCiAgICoKICAgKiBAcGFyYW0gQXJyYXkgJHNlc3Npb24gdGhlIHNlc3Npb24gb2JqZWN0CiAgICogQHJldHVybiBBcnJheSB0aGUgc2Vzc2lvbiBvYmplY3QgaWYgaXQgdmFsaWRhdGVzLCBudWxsIG90aGVyd2lzZQogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVNlc3Npb25PYmplY3QoJHNlc3Npb24pIHsKICAgIC8vIG1ha2Ugc3VyZSBzb21lIGVzc2VudGlhbCBmaWVsZHMgZXhpc3QKICAgIGlmIChpc19hcnJheSgkc2Vzc2lvbikgJiYKICAgICAgICBpc3NldCgkc2Vzc2lvblsndWlkJ10pICYmCiAgICAgICAgaXNzZXQoJHNlc3Npb25bJ2FjY2Vzc190b2tlbiddKSAmJgogICAgICAgIGlzc2V0KCRzZXNzaW9uWydzaWcnXSkpIHsKICAgICAgLy8gdmFsaWRhdGUgdGhlIHNpZ25hdHVyZQogICAgICAkc2Vzc2lvbl93aXRob3V0X3NpZyA9ICRzZXNzaW9uOwogICAgICB1bnNldCgkc2Vzc2lvbl93aXRob3V0X3NpZ1snc2lnJ10pOwogICAgICAkZXhwZWN0ZWRfc2lnID0gc2VsZjo6Z2VuZXJhdGVTaWduYXR1cmUoCiAgICAgICAgJHNlc3Npb25fd2l0aG91dF9zaWcsCiAgICAgICAgJHRoaXMtPmdldEFwaVNlY3JldCgpCiAgICAgICk7CiAgICAgIGlmICgkc2Vzc2lvblsnc2lnJ10gIT0gJGV4cGVjdGVkX3NpZykgewogICAgICAgIHNlbGY6OmVycm9yTG9nKCdHb3QgaW52YWxpZCBzZXNzaW9uIHNpZ25hdHVyZSBpbiBjb29raWUuJyk7CiAgICAgICAgJHNlc3Npb24gPSBudWxsOwogICAgICB9CiAgICAgIC8vIGNoZWNrIGV4cGlyeSB0aW1lCiAgICB9IGVsc2UgewogICAgICAkc2Vzc2lvbiA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gJHNlc3Npb247CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2Ugb3VyIEpTIHNlc3Npb24gb2JqZWN0IGZyb20gdGhlCiAgICogc2lnbmVkIHRva2VuJ3MgZGF0YQogICAqCiAgICogVE9ETzogTnVrZSB0aGlzIG9uY2UgdGhlIGxvZ2luIGZsb3cgdXNlcyBPQXV0aDIKICAgKgogICAqIEBwYXJhbSBBcnJheSB0aGUgb3V0cHV0IG9mIGdldFNpZ25lZFJlcXVlc3QKICAgKiBAcmV0dXJuIEFycmF5IFNvbWV0aGluZyB0aGF0IHdpbGwgd29yayBhcyBhIHNlc3Npb24KICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlU2Vzc2lvbkZyb21TaWduZWRSZXF1ZXN0KCRkYXRhKSB7CiAgICBpZiAoIWlzc2V0KCRkYXRhWydvYXV0aF90b2tlbiddKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAkc2Vzc2lvbiA9IGFycmF5KAogICAgICAndWlkJyAgICAgICAgICA9PiAkZGF0YVsndXNlcl9pZCddLAogICAgICAnYWNjZXNzX3Rva2VuJyA9PiAkZGF0YVsnb2F1dGhfdG9rZW4nXSwKICAgICAgJ2V4cGlyZXMnICAgICAgPT4gJGRhdGFbJ2V4cGlyZXMnXSwKICAgICk7CgogICAgLy8gcHV0IGEgcmVhbCBzaWcsIHNvIHRoYXQgdmFsaWRhdGVTaWduYXR1cmUgd29ya3MKICAgICRzZXNzaW9uWydzaWcnXSA9IHNlbGY6OmdlbmVyYXRlU2lnbmF0dXJlKAogICAgICAkc2Vzc2lvbiwKICAgICAgJHRoaXMtPmdldEFwaVNlY3JldCgpCiAgICApOwoKICAgIHJldHVybiAkc2Vzc2lvbjsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhIHNpZ25lZF9yZXF1ZXN0IGFuZCB2YWxpZGF0ZXMgdGhlIHNpZ25hdHVyZS4KICAgKiBUaGVuIHNhdmVzIGl0IGluICR0aGlzLT5zaWduZWRfZGF0YQogICAqCiAgICogQHBhcmFtIFN0cmluZyBBIHNpZ25lZCB0b2tlbgogICAqIEBwYXJhbSBCb29sZWFuIFNob3VsZCB3ZSByZW1vdmUgdGhlIHBhcnRzIG9mIHRoZSBwYXlsb2FkIHRoYXQKICAgKiAgICAgICAgICAgICAgICBhcmUgdXNlZCBieSB0aGUgYWxnb3JpdGhtPwogICAqIEByZXR1cm4gQXJyYXkgdGhlIHBheWxvYWQgaW5zaWRlIGl0IG9yIG51bGwgaWYgdGhlIHNpZyBpcyB3cm9uZwogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZVNpZ25lZFJlcXVlc3QoJHNpZ25lZF9yZXF1ZXN0KSB7CiAgICBsaXN0KCRlbmNvZGVkX3NpZywgJHBheWxvYWQpID0gZXhwbG9kZSgnLicsICRzaWduZWRfcmVxdWVzdCwgMik7CgogICAgLy8gZGVjb2RlIHRoZSBkYXRhCiAgICAkc2lnID0gc2VsZjo6YmFzZTY0VXJsRGVjb2RlKCRlbmNvZGVkX3NpZyk7CiAgICAkZGF0YSA9IGpzb25fZGVjb2RlKHNlbGY6OmJhc2U2NFVybERlY29kZSgkcGF5bG9hZCksIHRydWUpOwoKICAgIGlmIChzdHJ0b3VwcGVyKCRkYXRhWydhbGdvcml0aG0nXSkgIT09ICdITUFDLVNIQTI1NicpIHsKICAgICAgc2VsZjo6ZXJyb3JMb2coJ1Vua25vd24gYWxnb3JpdGhtLiBFeHBlY3RlZCBITUFDLVNIQTI1NicpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyBjaGVjayBzaWcKICAgICRleHBlY3RlZF9zaWcgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRwYXlsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0QXBpU2VjcmV0KCksICRyYXcgPSB0cnVlKTsKICAgIGlmICgkc2lnICE9PSAkZXhwZWN0ZWRfc2lnKSB7CiAgICAgIHNlbGY6OmVycm9yTG9nKCdCYWQgU2lnbmVkIEpTT04gc2lnbmF0dXJlIScpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICByZXR1cm4gJGRhdGE7CiAgfQoKICAvKioKICAgKiBCdWlsZCB0aGUgVVJMIGZvciBhcGkgZ2l2ZW4gcGFyYW1ldGVycy4KICAgKgogICAqIEBwYXJhbSAkbWV0aG9kIFN0cmluZyB0aGUgbWV0aG9kIG5hbWUuCiAgICogQHJldHVybiBTdHJpbmcgdGhlIFVSTCBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMKICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXBpVXJsKCRtZXRob2QpIHsKICAgIHN0YXRpYyAkUkVBRF9PTkxZX0NBTExTID0KICAgICAgYXJyYXkoJ2FkbWluLmdldGFsbG9jYXRpb24nID0+IDEsCiAgICAgICAgICAgICdhZG1pbi5nZXRhcHBwcm9wZXJ0aWVzJyA9PiAxLAogICAgICAgICAgICAnYWRtaW4uZ2V0YmFubmVkdXNlcnMnID0+IDEsCiAgICAgICAgICAgICdhZG1pbi5nZXRsaXZlc3RyZWFtdmlhbGluaycgPT4gMSwKICAgICAgICAgICAgJ2FkbWluLmdldG1ldHJpY3MnID0+IDEsCiAgICAgICAgICAgICdhZG1pbi5nZXRyZXN0cmljdGlvbmluZm8nID0+IDEsCiAgICAgICAgICAgICdhcHBsaWNhdGlvbi5nZXRwdWJsaWNpbmZvJyA9PiAxLAogICAgICAgICAgICAnYXV0aC5nZXRhcHBwdWJsaWNrZXknID0+IDEsCiAgICAgICAgICAgICdhdXRoLmdldHNlc3Npb24nID0+IDEsCiAgICAgICAgICAgICdhdXRoLmdldHNpZ25lZHB1YmxpY3Nlc3Npb25kYXRhJyA9PiAxLAogICAgICAgICAgICAnY29tbWVudHMuZ2V0JyA9PiAxLAogICAgICAgICAgICAnY29ubmVjdC5nZXR1bmNvbm5lY3RlZGZyaWVuZHNjb3VudCcgPT4gMSwKICAgICAgICAgICAgJ2Rhc2hib2FyZC5nZXRhY3Rpdml0eScgPT4gMSwKICAgICAgICAgICAgJ2Rhc2hib2FyZC5nZXRjb3VudCcgPT4gMSwKICAgICAgICAgICAgJ2Rhc2hib2FyZC5nZXRnbG9iYWxuZXdzJyA9PiAxLAogICAgICAgICAgICAnZGFzaGJvYXJkLmdldG5ld3MnID0+IDEsCiAgICAgICAgICAgICdkYXNoYm9hcmQubXVsdGlnZXRjb3VudCcgPT4gMSwKICAgICAgICAgICAgJ2Rhc2hib2FyZC5tdWx0aWdldG5ld3MnID0+IDEsCiAgICAgICAgICAgICdkYXRhLmdldGNvb2tpZXMnID0+IDEsCiAgICAgICAgICAgICdldmVudHMuZ2V0JyA9PiAxLAogICAgICAgICAgICAnZXZlbnRzLmdldG1lbWJlcnMnID0+IDEsCiAgICAgICAgICAgICdmYm1sLmdldGN1c3RvbXRhZ3MnID0+IDEsCiAgICAgICAgICAgICdmZWVkLmdldGFwcGZyaWVuZHN0b3JpZXMnID0+IDEsCiAgICAgICAgICAgICdmZWVkLmdldHJlZ2lzdGVyZWR0ZW1wbGF0ZWJ1bmRsZWJ5aWQnID0+IDEsCiAgICAgICAgICAgICdmZWVkLmdldHJlZ2lzdGVyZWR0ZW1wbGF0ZWJ1bmRsZXMnID0+IDEsCiAgICAgICAgICAgICdmcWwubXVsdGlxdWVyeScgPT4gMSwKICAgICAgICAgICAgJ2ZxbC5xdWVyeScgPT4gMSwKICAgICAgICAgICAgJ2ZyaWVuZHMuYXJlZnJpZW5kcycgPT4gMSwKICAgICAgICAgICAgJ2ZyaWVuZHMuZ2V0JyA9PiAxLAogICAgICAgICAgICAnZnJpZW5kcy5nZXRhcHB1c2VycycgPT4gMSwKICAgICAgICAgICAgJ2ZyaWVuZHMuZ2V0bGlzdHMnID0+IDEsCiAgICAgICAgICAgICdmcmllbmRzLmdldG11dHVhbGZyaWVuZHMnID0+IDEsCiAgICAgICAgICAgICdnaWZ0cy5nZXQnID0+IDEsCiAgICAgICAgICAgICdncm91cHMuZ2V0JyA9PiAxLAogICAgICAgICAgICAnZ3JvdXBzLmdldG1lbWJlcnMnID0+IDEsCiAgICAgICAgICAgICdpbnRsLmdldHRyYW5zbGF0aW9ucycgPT4gMSwKICAgICAgICAgICAgJ2xpbmtzLmdldCcgPT4gMSwKICAgICAgICAgICAgJ25vdGVzLmdldCcgPT4gMSwKICAgICAgICAgICAgJ25vdGlmaWNhdGlvbnMuZ2V0JyA9PiAxLAogICAgICAgICAgICAncGFnZXMuZ2V0aW5mbycgPT4gMSwKICAgICAgICAgICAgJ3BhZ2VzLmlzYWRtaW4nID0+IDEsCiAgICAgICAgICAgICdwYWdlcy5pc2FwcGFkZGVkJyA9PiAxLAogICAgICAgICAgICAncGFnZXMuaXNmYW4nID0+IDEsCiAgICAgICAgICAgICdwZXJtaXNzaW9ucy5jaGVja2F2YWlsYWJsZWFwaWFjY2VzcycgPT4gMSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25zLmNoZWNrZ3JhbnRlZGFwaWFjY2VzcycgPT4gMSwKICAgICAgICAgICAgJ3Bob3Rvcy5nZXQnID0+IDEsCiAgICAgICAgICAgICdwaG90b3MuZ2V0YWxidW1zJyA9PiAxLAogICAgICAgICAgICAncGhvdG9zLmdldHRhZ3MnID0+IDEsCiAgICAgICAgICAgICdwcm9maWxlLmdldGluZm8nID0+IDEsCiAgICAgICAgICAgICdwcm9maWxlLmdldGluZm9vcHRpb25zJyA9PiAxLAogICAgICAgICAgICAnc3RyZWFtLmdldCcgPT4gMSwKICAgICAgICAgICAgJ3N0cmVhbS5nZXRjb21tZW50cycgPT4gMSwKICAgICAgICAgICAgJ3N0cmVhbS5nZXRmaWx0ZXJzJyA9PiAxLAogICAgICAgICAgICAndXNlcnMuZ2V0aW5mbycgPT4gMSwKICAgICAgICAgICAgJ3VzZXJzLmdldGxvZ2dlZGludXNlcicgPT4gMSwKICAgICAgICAgICAgJ3VzZXJzLmdldHN0YW5kYXJkaW5mbycgPT4gMSwKICAgICAgICAgICAgJ3VzZXJzLmhhc2FwcHBlcm1pc3Npb24nID0+IDEsCiAgICAgICAgICAgICd1c2Vycy5pc2FwcHVzZXInID0+IDEsCiAgICAgICAgICAgICd1c2Vycy5pc3ZlcmlmaWVkJyA9PiAxLAogICAgICAgICAgICAndmlkZW8uZ2V0dXBsb2FkbGltaXRzJyA9PiAxKTsKICAgICRuYW1lID0gJ2FwaSc7CiAgICBpZiAoaXNzZXQoJFJFQURfT05MWV9DQUxMU1tzdHJ0b2xvd2VyKCRtZXRob2QpXSkpIHsKICAgICAgJG5hbWUgPSAnYXBpX3JlYWQnOwogICAgfQogICAgcmV0dXJuIHNlbGY6OmdldFVybCgkbmFtZSwgJ3Jlc3RzZXJ2ZXIucGhwJyk7CiAgfQoKICAvKioKICAgKiBCdWlsZCB0aGUgVVJMIGZvciBnaXZlbiBkb21haW4gYWxpYXMsIHBhdGggYW5kIHBhcmFtZXRlcnMuCiAgICoKICAgKiBAcGFyYW0gJG5hbWUgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBkb21haW4KICAgKiBAcGFyYW0gJHBhdGggU3RyaW5nIG9wdGlvbmFsIHBhdGggKHdpdGhvdXQgYSBsZWFkaW5nIHNsYXNoKQogICAqIEBwYXJhbSAkcGFyYW1zIEFycmF5IG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgVVJMIGZvciB0aGUgZ2l2ZW4gcGFyYW1ldGVycwogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRVcmwoJG5hbWUsICRwYXRoPScnLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR1cmwgPSBzZWxmOjokRE9NQUlOX01BUFskbmFtZV07CiAgICBpZiAoJHBhdGgpIHsKICAgICAgaWYgKCRwYXRoWzBdID09PSAnLycpIHsKICAgICAgICAkcGF0aCA9IHN1YnN0cigkcGF0aCwgMSk7CiAgICAgIH0KICAgICAgJHVybCAuPSAkcGF0aDsKICAgIH0KICAgIGlmICgkcGFyYW1zKSB7CiAgICAgICR1cmwgLj0gJz8nIC4gaHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zLCBudWxsLCAnJicpOwogICAgfQogICAgcmV0dXJuICR1cmw7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBDdXJyZW50IFVSTCwgc3RyaXBwaW5nIGl0IG9mIGtub3duIEZCIHBhcmFtZXRlcnMgdGhhdCBzaG91bGQKICAgKiBub3QgcGVyc2lzdC4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjdXJyZW50IFVSTAogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRDdXJyZW50VXJsKCkgewogICAgJHByb3RvY29sID0gaXNzZXQoJF9TRVJWRVJbJ0hUVFBTJ10pICYmICRfU0VSVkVSWydIVFRQUyddID09ICdvbicKICAgICAgPyAnaHR0cHM6Ly8nCiAgICAgIDogJ2h0dHA6Ly8nOwogICAgJGN1cnJlbnRVcmwgPSAkcHJvdG9jb2wgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsKICAgICRwYXJ0cyA9IHBhcnNlX3VybCgkY3VycmVudFVybCk7CgogICAgLy8gZHJvcCBrbm93biBmYiBwYXJhbXMKICAgICRxdWVyeSA9ICcnOwogICAgaWYgKCFlbXB0eSgkcGFydHNbJ3F1ZXJ5J10pKSB7CiAgICAgICRwYXJhbXMgPSBhcnJheSgpOwogICAgICBwYXJzZV9zdHIoJHBhcnRzWydxdWVyeSddLCAkcGFyYW1zKTsKICAgICAgZm9yZWFjaChzZWxmOjokRFJPUF9RVUVSWV9QQVJBTVMgYXMgJGtleSkgewogICAgICAgIHVuc2V0KCRwYXJhbXNbJGtleV0pOwogICAgICB9CiAgICAgIGlmICghZW1wdHkoJHBhcmFtcykpIHsKICAgICAgICAkcXVlcnkgPSAnPycgLiBodHRwX2J1aWxkX3F1ZXJ5KCRwYXJhbXMsIG51bGwsICcmJyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB1c2UgcG9ydCBpZiBub24gZGVmYXVsdAogICAgJHBvcnQgPQogICAgICBpc3NldCgkcGFydHNbJ3BvcnQnXSkgJiYKICAgICAgKCgkcHJvdG9jb2wgPT09ICdodHRwOi8vJyAmJiAkcGFydHNbJ3BvcnQnXSAhPT0gODApIHx8CiAgICAgICAoJHByb3RvY29sID09PSAnaHR0cHM6Ly8nICYmICRwYXJ0c1sncG9ydCddICE9PSA0NDMpKQogICAgICA/ICc6JyAuICRwYXJ0c1sncG9ydCddIDogJyc7CgogICAgLy8gcmVidWlsZAogICAgcmV0dXJuICRwcm90b2NvbCAuICRwYXJ0c1snaG9zdCddIC4gJHBvcnQgLiAkcGFydHNbJ3BhdGgnXSAuICRxdWVyeTsKICB9CgogIC8qKgogICAqIEdlbmVyYXRlIGEgc2lnbmF0dXJlIGZvciB0aGUgZ2l2ZW4gcGFyYW1zIGFuZCBzZWNyZXQuCiAgICoKICAgKiBAcGFyYW0gQXJyYXkgJHBhcmFtcyB0aGUgcGFyYW1ldGVycyB0byBzaWduCiAgICogQHBhcmFtIFN0cmluZyAkc2VjcmV0IHRoZSBzZWNyZXQgdG8gc2lnbiB3aXRoCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGdlbmVyYXRlZCBzaWduYXR1cmUKICAgKi8KICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlU2lnbmF0dXJlKCRwYXJhbXMsICRzZWNyZXQpIHsKICAgIC8vIHdvcmsgd2l0aCBzb3J0ZWQgZGF0YQogICAga3NvcnQoJHBhcmFtcyk7CgogICAgLy8gZ2VuZXJhdGUgdGhlIGJhc2Ugc3RyaW5nCiAgICAkYmFzZV9zdHJpbmcgPSAnJzsKICAgIGZvcmVhY2goJHBhcmFtcyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAkYmFzZV9zdHJpbmcgLj0gJGtleSAuICc9JyAuICR2YWx1ZTsKICAgIH0KICAgICRiYXNlX3N0cmluZyAuPSAkc2VjcmV0OwoKICAgIHJldHVybiBtZDUoJGJhc2Vfc3RyaW5nKTsKICB9CgogIC8qKgogICAqIFByaW50cyB0byB0aGUgZXJyb3IgbG9nIGlmIHlvdSBhcmVuJ3QgaW4gY29tbWFuZCBsaW5lIG1vZGUuCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nIGxvZyBtZXNzYWdlCiAgICovCiAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBlcnJvckxvZygkbXNnKSB7CiAgICAvLyBkaXNhYmxlIGVycm9yIGxvZyBpZiB3ZSBhcmUgcnVubmluZyBpbiBhIENMSSBlbnZpcm9ubWVudAogICAgLy8gQGNvZGVDb3ZlcmFnZUlnbm9yZVN0YXJ0CiAgICBpZiAocGhwX3NhcGlfbmFtZSgpICE9ICdjbGknKSB7CiAgICAgIGVycm9yX2xvZygkbXNnKTsKICAgIH0KICAgIC8vIHVuY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgZXJyb3JzIG9uIHRoZSBwYWdlCiAgICAvLyBwcmludCAnZXJyb3JfbG9nOiAnLiRtc2cuIlxuIjsKICAgIC8vIEBjb2RlQ292ZXJhZ2VJZ25vcmVFbmQKICB9CgogIC8qKgogICAqIEJhc2U2NCBlbmNvZGluZyB0aGF0IGRvZXNuJ3QgbmVlZCB0byBiZSB1cmxlbmNvZGUoKWVkLgogICAqIEV4YWN0bHkgdGhlIHNhbWUgYXMgYmFzZTY0X2VuY29kZSBleGNlcHQgaXQgdXNlcwogICAqICAgLSBpbnN0ZWFkIG9mICsKICAgKiAgIF8gaW5zdGVhZCBvZiAvCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nIGJhc2U2NFVybEVuY29kZWRlZCBzdHJpbmcKICAgKi8KICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGJhc2U2NFVybERlY29kZSgkaW5wdXQpIHsKICAgIHJldHVybiBiYXNlNjRfZGVjb2RlKHN0cnRyKCRpbnB1dCwgJy1fJywgJysvJykpOwogIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.googleSearch.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqIFRvIGNoYW5nZSB0aGlzIHRlbXBsYXRlLCBjaG9vc2UgVG9vbHMgfCBUZW1wbGF0ZXMKICogYW5kIG9wZW4gdGhlIHRlbXBsYXRlIGluIHRoZSBlZGl0b3IuCiAqLwoKLyoqCiAqIERlc2NyaXB0aW9uIG9mIGNsYXNzCiAqCiAqIEBhdXRob3IgWmRlbm8KICovCmNsYXNzIGdvb2dsZVNlYXJjaCB7CgovL3B1dCB5b3VyIGNvZGUgaGVyZQogICAgcHVibGljICRsaW1pdDsKICAgIHB1YmxpYyAkYXBpX2tleTsKICAgIHB1YmxpYyAkc2VhcmNoX3N0cmluZzsKICAgIHB1YmxpYyAkc2VhcmNfZW5naW5lX3VuaXF1ZV9zdHJpbmcgPSAnMDE3NTc2NjYyNTEyNDY4MjM5MTQ2Om9tdWF1Zl9sZnZlJzsKCiAgICBwdWJsaWMgZnVuY3Rpb24gIF9fY29uc3RydWN0KCRhcGlfa2V5LCRzZWFyY2hfc3RyaW5nLCRsaW1pdCA9IDEwKSB7CiAgICAgICAgJHRoaXMtPmFwaV9rZXkgPSAkYXBpX2tleTsKICAgICAgICAkdGhpcy0+c2VhcmNoX3N0cmluZyA9ICRzZWFyY2hfc3RyaW5nOwogICAgICAgICR0aGlzLT5saW1pdCA9ICRsaW1pdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0X2FwaV9rZXkoJGtleSkgewogICAgICAgICR0aGlzLT5hcGlfa2V5ID0gJGtleTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0X3NlYXJjaF9zdHJpbmcoJHNlYXJjaF9zdHJpbmcpIHsKICAgICAgICAkdGhpcy0+c2VhcmNoX3N0cmluZyA9ICRzZWFyY2hfc3RyaW5nOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfYXBpX2tleSgka2V5KSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hcGlfa2V5OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2VhcmNoX3N0cmluZygkc2VhcmNoX3N0cmluZykgewogICAgICAgIHJldHVybiAkdGhpcy0+c2VhcmNoX3N0cmluZzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VhcmNoKCkgewoKICAgICAgICAkdXJsID0gImh0dHA6Ly93d3cuZ29vZ2xlYXBpcy5jb20vY3VzdG9tc2VhcmNoL3YxP2tleT0iIC4gJHRoaXMtPmFwaV9rZXkgLiAiJmN4PSIgLiAkdGhpcy0+c2VhcmNfZW5naW5lX3VuaXF1ZV9zdHJpbmcgLiAiJnE9IiAuIHVybGVuY29kZSgkdGhpcy0+c2VhcmNoX3N0cmluZykgLiAiJmNhbGxiYWNrPWhhbmRsZVJlc3BvbnNlJnByZXR0eXByaW50PXRydWUmbnVtPSIuJHRoaXMtPmxpbWl0OwogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Z2V0X3dlYl9wYWdlKCR1cmwpOwovLyBFeGNlcHRpb24gaGFuZGxpbmcKICAgICAgICBpZiAoJHJlc3VsdFsnaHR0cF9jb2RlJ10gPT0gNDAzKQogICAgICAgICAgICBlY2hvICIuLi4gZXJyb3I6IGRhaWx5IGxpbWl0IGV4Y2VlZGVkIC4uLiI7CiAgICAgICAgaWYgKCRyZXN1bHRbJ2Vycm5vJ10gIT0gMCkKICAgICAgICAgICAgZWNobyAiLi4uIGVycm9yOiBiYWQgdXJsLCB0aW1lb3V0LCByZWRpcmVjdCBsb29wIC4uLiI7CiAgICAgICAgaWYgKCRyZXN1bHRbJ2h0dHBfY29kZSddICE9IDIwMCkKICAgICAgICAgICAgZWNobyAiLi4uIGVycm9yOiBubyBwYWdlLCBubyBwZXJtaXNzaW9ucywgbm8gc2VydmljZSAuLi4iOwovLyBHZXQgYW5kIHBhcnNlIEpTT04gb3V0cHV0CiAgICAgICAgJHBhZ2UgPSAkcmVzdWx0Wydjb250ZW50J107CiAgICAgICAgJHBhZ2UgPSBzdHJfcmVwbGFjZSgiaGFuZGxlUmVzcG9uc2UoIiwgIiIsICRwYWdlKTsKICAgICAgICAkcGFnZSA9IHN0cl9yZXBsYWNlKCIpOyIsICIiLCAkcGFnZSk7CiAgICAgICAgJHBhZ2UgPSBqc29uX2RlY29kZSgkcGFnZSk7CgovLyBQcmludCByZXN1bHRzCiAgICAgICAgJGl0ZW1zID0gJHBhZ2UtPml0ZW1zOwoKICAgICAgICByZXR1cm4gJGl0ZW1zOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X3dlYl9wYWdlKCR1cmwpIHsKICAgICAgICAkb3B0aW9ucyA9IGFycmF5KAogICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsIC8vIHJldHVybiB3ZWIgcGFnZQogICAgICAgICAgICBDVVJMT1BUX0hFQURFUiA9PiBmYWxzZSwgLy8gZG9uJ3QgcmV0dXJuIGhlYWRlcnMKICAgICAgICAgICAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiA9PiB0cnVlLCAvLyBmb2xsb3cgcmVkaXJlY3RzCiAgICAgICAgICAgIENVUkxPUFRfRU5DT0RJTkcgPT4gIiIsIC8vIGhhbmRsZSBhbGwgZW5jb2RpbmdzCiAgICAgICAgICAgIENVUkxPUFRfVVNFUkFHRU5UID0+ICJzcGlkZXIiLCAvLyB3aG8gYW0gaQogICAgICAgICAgICBDVVJMT1BUX0FVVE9SRUZFUkVSID0+IHRydWUsIC8vIHNldCByZWZlcmVyIG9uIHJlZGlyZWN0CiAgICAgICAgICAgIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgPT4gMTIwLCAvLyB0aW1lb3V0IG9uIGNvbm5lY3QKICAgICAgICAgICAgQ1VSTE9QVF9USU1FT1VUID0+IDEyMCwgLy8gdGltZW91dCBvbiByZXNwb25zZQogICAgICAgICAgICBDVVJMT1BUX01BWFJFRElSUyA9PiAxMCwgLy8gc3RvcCBhZnRlciAxMCByZWRpcmVjdHMKICAgICAgICApOwoKICAgICAgICAkY2ggPSBjdXJsX2luaXQoJHVybCk7CiAgICAgICAgY3VybF9zZXRvcHRfYXJyYXkoJGNoLCAkb3B0aW9ucyk7CiAgICAgICAgJGNvbnRlbnQgPSBjdXJsX2V4ZWMoJGNoKTsKICAgICAgICAkZXJyID0gY3VybF9lcnJubygkY2gpOwogICAgICAgICRlcnJtc2cgPSBjdXJsX2Vycm9yKCRjaCk7CiAgICAgICAgJGhlYWRlciA9IGN1cmxfZ2V0aW5mbygkY2gpOwogICAgICAgIGN1cmxfY2xvc2UoJGNoKTsKCiAgICAgICAgJGhlYWRlclsnZXJybm8nXSA9ICRlcnI7CiAgICAgICAgJGhlYWRlclsnZXJybXNnJ10gPSAkZXJybXNnOwogICAgICAgICRoZWFkZXJbJ2NvbnRlbnQnXSA9ICRjb250ZW50OwogICAgICAgIHJldHVybiAkaGVhZGVyOwogICAgfQoKfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.lastfmapi_inc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KY2xhc3MgbGFzdGZtYXBpX2luYyB7DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7DQoNCi8vIEluY2x1ZGUgaGVscGVyIGNsYXNzZXMNCiAgICAgICAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLicvbGFzdGZtYXBpL2NsYXNzL2FwaWJhc2UucGhwJzsNCiAgICAgICAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLicvbGFzdGZtYXBpL2NsYXNzL3NvY2tldC5waHAnOw0KICAgICAgICByZXF1aXJlX29uY2UgZGlybmFtZShfX0ZJTEVfXykuJy9sYXN0Zm1hcGkvY2xhc3MvY2FjaGUucGhwJzsNCg0KLy8gSW5jbHVkZSBhbGwgZmlsZXMgb2YgdGhlIEFQSQ0KLy8gVE9ETzogQWxsb3cgc29tZSB0byBiZSBtaXNzaW5nDQogICAgICAgIHJlcXVpcmVfb25jZSBkaXJuYW1lKF9fRklMRV9fKS4nL2xhc3RmbWFwaS9hcGkvYWxidW0ucGhwJzsNCiAgICAgICAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLicvbGFzdGZtYXBpL2FwaS9hcnRpc3QucGhwJzsNCiAgICAgICAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLicvbGFzdGZtYXBpL2FwaS9hdXRoLnBocCc7DQogICAgICAgIHJlcXVpcmVfb25jZSBkaXJuYW1lKF9fRklMRV9fKS4nL2xhc3RmbWFwaS9hcGkvZXZlbnQucGhwJzsNCiAgICAgICAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLicvbGFzdGZtYXBpL2FwaS9nZW8ucGhwJzsNCiAgICAgICAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLicvbGFzdGZtYXBpL2FwaS9ncm91cC5waHAnOw0KICAgICAgICByZXF1aXJlX29uY2UgZGlybmFtZShfX0ZJTEVfXykuJy9sYXN0Zm1hcGkvYXBpL2xpYnJhcnkucGhwJzsNCiAgICAgICAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLicvbGFzdGZtYXBpL2FwaS9wbGF5bGlzdC5waHAnOw0KICAgICAgICByZXF1aXJlX29uY2UgZGlybmFtZShfX0ZJTEVfXykuJy9sYXN0Zm1hcGkvYXBpL3JhZGlvLnBocCc7DQogICAgICAgIHJlcXVpcmVfb25jZSBkaXJuYW1lKF9fRklMRV9fKS4nL2xhc3RmbWFwaS9hcGkvdGFnLnBocCc7DQogICAgICAgIHJlcXVpcmVfb25jZSBkaXJuYW1lKF9fRklMRV9fKS4nL2xhc3RmbWFwaS9hcGkvdGFzdGVvbWV0ZXIucGhwJzsNCiAgICAgICAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLicvbGFzdGZtYXBpL2FwaS90cmFjay5waHAnOw0KICAgICAgICByZXF1aXJlX29uY2UgZGlybmFtZShfX0ZJTEVfXykuJy9sYXN0Zm1hcGkvYXBpL3VzZXIucGhwJzsNCiAgICAgICAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLicvbGFzdGZtYXBpL2FwaS92ZW51ZS5waHAnOw0KICAgIH0NCg0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.mediacenter_utils.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogCiAqIFRvIGNoYW5nZSB0aGlzIHRlbXBsYXRlLCBjaG9vc2UgVG9vbHMgfCBUZW1wbGF0ZXMKICogYW5kIG9wZW4gdGhlIHRlbXBsYXRlIGluIHRoZSBlZGl0b3IuCiAqLwoKLyoqCiAqIERlc2NyaXB0aW9uIG9mIGNsYXNzCiAqCiAqIEBhdXRob3IgWmRlbm8KICovCmNsYXNzIG1lZGlhY2VudGVyX3V0aWxzIHsKCn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.media_center_tools_opts.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqIFRvIGNoYW5nZSB0aGlzIHRlbXBsYXRlLCBjaG9vc2UgVG9vbHMgfCBUZW1wbGF0ZXMKICogYW5kIG9wZW4gdGhlIHRlbXBsYXRlIGluIHRoZSBlZGl0b3IuCiAqLwoKLyoqCiAqIERlc2NyaXB0aW9uIG9mIGNsYXNzCiAqCiAqIEBhdXRob3IgQGt1em1hbnkKICovCmNsYXNzIG1lZGlhX2NlbnRlcl90b29sc19vcHRzIHsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CgovLyBjb25zdHJ1Y3QKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF90d2VldF9pZF9mcm9tX3VybCgkdXJsKSB7CiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCdzdGF0dXMvJywgJycsIHN0cnN0cigkdXJsLCAnc3RhdHVzLycpKTsKICAgIH0KCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.media_center_tools_smarty.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiNCRUdJTl9MSUNFTlNFCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBNZWRpYUNlbnRlciAoYykgMjAxMCBieSBAa3V6bWFueQojIAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAojIGFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKIyBNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4gCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQoKLyoqCiAqCiAqLwpjbGFzcyBtZWRpYV9jZW50ZXJfdG9vbHNfc21hcnR5IHsKCiAgICAvKioKICAgICAqIEluaXRpYWxpemUgdGhlIHNtYXJ0eSBwbHVnaW5zLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGluaXQoKSB7CgogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsKICAgICAgICAkc21hcnR5LT5yZWdpc3Rlcl9mdW5jdGlvbignZ2V0X3R3ZWV0JywgYXJyYXkoJ21lZGlhX2NlbnRlcl90b29sc19zbWFydHknLCAnbWVkaWFfZ2V0X3R3ZWV0JykpOwogICAgICAgICRzbWFydHktPnJlZ2lzdGVyX21vZGlmaWVyKCd1cmx0d2VldCcsIGFycmF5KCdtZWRpYV9jZW50ZXJfdG9vbHNfc21hcnR5JywgJ3VybHR3ZWV0X2Zyb21fdGV4dCcpKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1lZGlhX2dldF90d2VldCgkcGFyYW1zLCAmJHNtYXJ0eSkgewoKICAgICAgICAkZXhwaXJlID0gMDsKICAgICAgICAkdGhldGVtcGxhdGUgPSAnVHdlZXQnOwoKICAgICAgICBpZiAoIWlzU2V0KCRwYXJhbXNbInVybCJdKSAmJiAhaXNTZXQoJHBhcmFtc1siaWQiXSkpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgaWYgKGlzU2V0KCRwYXJhbXNbImV4cGlyZSJdKSkKICAgICAgICAgICAgJGV4cGlyZSA9ICRwYXJhbXNbImV4cGlyZSJdOwoKICAgICAgICBpZiAoaXNTZXQoJHBhcmFtc1siZGlzcGxheXRlbXBsYXRlIl0pKQogICAgICAgICAgICAkdGhldGVtcGxhdGUgPSAkcGFyYW1zWyJkaXNwbGF5dGVtcGxhdGUiXTsKCiAgICAgICAgCiAgICAgICAgaWYoaXNzZXQoJHBhcmFtc1sidXJsIl0pKQogICAgICAgICRzdGF0dXNfaWQgPSBtZWRpYV9jZW50ZXJfdG9vbHNfb3B0czo6Z2V0X3R3ZWV0X2lkX2Zyb21fdXJsKCRwYXJhbXNbInVybCJdKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRzdGF0dXNfaWQgPSAkcGFyYW1zWyJpZCJdOwogICAgICAgIAogICAgICAgIGlmICghJHN0YXR1c19pZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAkb3V0cHV0ID0gc2VsZjo6X3JlcXVlc3QoJ3N0YXR1c2VzL3Nob3cvJyAuICRzdGF0dXNfaWQsIE5VTEwsICdHRVQnLCAkZXhwaXJlKTsKCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCd0d2VldCcsICRvdXRwdXQpOwoKICAgICAgICAkbW9kdWxlID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdNZWRpYUNlbnRlcicpOyAgICAgICAgCiAgICAgICAgcmV0dXJuICRtb2R1bGUtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnZGlzcGxheV8nIC4gJHRoZXRlbXBsYXRlKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfcmVxdWVzdCgkcmVxdWVzdCwgJGRhdGEgPSBOVUxMLCAkZm9ybWF0ID0gJ1BPU1QnLCAkZXhwaXJlID0gbnVsbCkgewoKICAgICAgICAkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgICAgICAgJHR3aXR0ZXIgPSBuZXcgdHdpdHRlcl9mb3JfcGhwOwoKICAgICAgICBpZiAoISRleHBpcmUpCiAgICAgICAgICAgIHJldHVybiAkdHdpdHRlci0+cmVxdWVzdCgkcmVxdWVzdCwgJGRhdGEsICRtZXRob2QpOwoKICAgICAgICAkcmV0ID0gY2FjaGVfY21zOjpnZXRLZXkoJHJlcXVlc3QpOwogICAgICAgIGlmICgkcmV0KQogICAgICAgICAgICByZXR1cm4gJHJldDsKCiAgICAgICAgcmV0dXJuIGNhY2hlX2Ntczo6Z2V0S2V5KCRyZXF1ZXN0LCAkdHdpdHRlci0+cmVxdWVzdCgkcmVxdWVzdCwgJGRhdGEsICRtZXRob2QpLCBhcnJheSgnZXhwaXJlJyA9PiAkZXhwaXJlKSwgZ2V0X2NsYXNzKCkpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdXJsdHdlZXRfZnJvbV90ZXh0KCRzdHJpbmcpIHsKICAgICAgICAkdHdpdHRlciA9IG5ldyB0d2l0dGVyX2Zvcl9waHA7CiAgICAgICAgcmV0dXJuICR0d2l0dGVyLT5jbGlja2FibGUoJHN0cmluZyk7CiAgICB9Cgp9CgovLyBlbmQgb2YgY2xhc3MKIwojIEVPRgojCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.Msft_Bing_Search.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9QSFAKLyoqCiAqIE1pY3Jvc29mdCBCaW5nIFNlYXJjaAogKiAKICogUEhQIGxpYnJhcnkgdG8gc3VwcG9ydCB0aGUgTWljcm9zb2Z0IEJpbmcgU2VhcmNoIEFQSS4KICoKICogUEhQIFZlcnNpb24gNQogKiAgCiAqIEBjYXRlZ29yeSAgTXNmdAogKiBAcGFja2FnZSAgIE1zZnQKICogQGF1dGhvciAgICBDYWwgRXZhbnMgCiAqIEBjb3B5cmlnaHQgMjAxMCBNaWNyb3NvZnQKICogQGxpY2Vuc2UgICBOZXcgQlNEIExpY2Vuc2UgKEJTRCkgaHR0cDovL2JpbmdwaHAuY29kZXBsZXguY29tL2xpY2Vuc2UKICogQHZlcnNpb24gICBTVk46ICRJZDogU2VhcmNoLnBocCA0OSAyMDEwLTAzLTIzIDE5OjMyOjMxWiBjYWwgJAogKiBAbGluayAgICAgIGh0dHA6Ly9iaW5ncGhwLmNvZGVwbGV4LmNvbQogKi8KCi8qKgogKiBTZWFyY2ggY2xhc3MgZm9yIHRoZSBCaW5nIFNlYXJjaCBBUEkuCiAqIAogKiBAY2F0ZWdvcnkgICBNc2Z0CiAqIEBwYWNrYWdlICAgIE1zZnQKICogQHN1YnBhY2thZ2UgQmluZwogKiBAYXV0aG9yICAgICBDYWwgRXZhbnMgCiAqIEBsaWNlbnNlICAgIE5ldyBCU0QgTGljZW5zZSAoQlNEKSBodHRwOi8vYmluZ3BocC5jb2RlcGxleC5jb20vbGljZW5zZQogKiBAbGluayAgICAgICBodHRwOi8vYmluZ3BocC5jb2RlcGxleC5jb20KICovCmNsYXNzIE1zZnRfQmluZ19TZWFyY2gKewogICAgLyoqCiAgICAgKiBBZHVsdCBmaWx0ZXIgc2V0dGluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJGFkdWx0ID0gJ01vZGVyYXRlJzsKCiAgICAvKioKICAgICAqIEJpbmcgQXBwbGljYXRpb24gSUQgLSBodHRwOi8vd3d3LmJpbmcuY29tL2RldmVsb3BlcnMvY3JlYXRlYXBwLmFzcHgKICAgICAqLwogICAgcHJvdGVjdGVkICRhcHBpZCA9ICcnOwoKICAgIC8qKgogICAgICogQmFzZSBiaW5nIFVSTAogICAgICovCiAgICBwcm90ZWN0ZWQgJGJhc2VVcmwgPSAnaHR0cDovL2FwaS5iaW5nLm5ldC8nOwoKICAgIC8qKgogICAgICogRmxhZ3MgdGhhdCBoYXZlIGJlZW4gc2V0LgogICAgICovCiAgICBwcm90ZWN0ZWQgJGZsYWdzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIExpc3Qgb2YgcHJlZmVycmVkIGZpbGUgdHlwZXMgdG8gcmV0dXJuCiAgICAgKi8KICAgIHByb3RlY3RlZCAkZmlsZXR5cGUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogT3V0cHV0IGZvcm1hdCAoanNvbnx4bWwpCiAgICAgKi8KICAgIHByb3RlY3RlZCAkZm9ybWF0ID0gJ2pzb24nOwoKICAgIC8qKgogICAgICogTnVtYmVyIG9mIGltYWdlIHJlc3VsdHMgdG8gcmV0dXJuICgxLTEwMCkKICAgICAqLwogICAgcHJvdGVjdGVkICRpbWFnZWNvdW50ID0gMTA7CgogICAgLyoqCiAgICAgKiBKU09OIGZvcm1hdCBvcHRpb24gKHJhd3xjYWxsYmFjaykKICAgICAqLwogICAgcHJvdGVjdGVkICRqc29udHlwZSA9ICdyYXcnOwoKICAgIC8qKgogICAgICogTGFuZ3VhZ2UgKHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQyNTEwNjQuYXNweCkKICAgICAqLwogICAgcHJvdGVjdGVkICRtYXJrZXQgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBxdWVyeSBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkICRxdWVyeSA9ICcnOwoKICAgIC8qKgogICAgICogU2l0ZSB0byBsaW1pdCB0aGUgc2VhcmNoIHRvCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2l0ZSA9ICcnOwoKICAgIC8qKgogICAgICogU291cmNlcyB0byBkcmF3IGZyb20gd2hlbiBzZWFyY2hpbmcgW3dlYnxpbWFnZXxzcGVsbF0KICAgICAqLwogICAgcHJvdGVjdGVkICRzb3VyY2VzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFZhbGlkIGZpbGUgdHlwZXMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLgogICAgICovCiAgICBwcm90ZWN0ZWQgJHZhbGlkRmlsZVR5cGVzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFZhbGlkIGZsYWdzIHRoYXQgY2FuIGJlIHNwZWNpZmllZC4KICAgICAqLwogICAgcHJvdGVjdGVkICR2YWxpZEZsYWdzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFZhbGlkIGZvcm1hdHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLgogICAgICovCiAgICBwcm90ZWN0ZWQgJHZhbGlkRm9ybWF0cyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBWYWxpZCBmb3JtYXRzIG9wdGlvbnMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLgogICAgICovCiAgICBwcm90ZWN0ZWQgJHZhbGlkRm9ybWF0T3B0aW9ucyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBWYWxpZCBzb3VyY2VzIHRoYXQgY2FuIGJlIHNwZWNpZmllZC4KICAgICAqLwogICAgcHJvdGVjdGVkICR2YWxpZFNvdXJjZXMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQVBJIHZlcnNpb24gKDIuMHwyLjIpCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdmVyc2lvbiA9IDIuMjsKCiAgICAvKioKICAgICAqIFVSTCB1c2VkIGluIHRoZSBsYXN0IHNlYXJjaCBwZXJmb3JtZWQgYnkgdGhlIGNsYXNzCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdXJsID0gbnVsbDsKCiAgICAvKioKICAgICAqIE51bWJlciBvZiB3ZWIgcmVzdWx0cyB0byByZXR1cm4gKDEtMTAwKQogICAgICovCiAgICBwcm90ZWN0ZWQgJHdlYmNvdW50ID0gMTA7CgogICAgLyoqCiAgICAgKiBPZmZzZXQgZnJvbSAwIHRvIGJlZ2luIHRoZSBsaXN0IG9mIHVybHMgcmV0dXJuZWQuICgwLTEwMCkKICAgICAqLwogICAgcHJvdGVjdGVkICR3ZWJvZmZzZXQgPSBudWxsOwoKICAgIC8qKgogICAgICogWE1MIG91dHB1dCB0eXBlIHNwZWNpZmllZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHhtbHR5cGUgPSAnJzsKICAgIAogICAgLyoqCiAgICAgKiBjb25zdHJ1Y3RvcgogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhcHBJZCBUaGUgQmluZyBBUFAgSUQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRhcHBJZD0nJykKICAgIHsKICAgICAgICAkdGhpcy0+dmFsaWRGaWxlVHlwZXMgICAgID0gYXJyYXkoJ0RPQycsJ0RXRicsJ0ZFRUQnLCdIVE0nLCdIVE1MJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BERicsJ1BQVCcsJ1BTJywnUlRGJywnVEVYVCcsJ1RYVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYTFMnKTsKICAgICAgICAkdGhpcy0+dmFsaWRGbGFncyAgICAgICAgID0gYXJyYXkoJ0Rpc2FibGVIb3N0Q29sbGFwc2luZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEaXNhYmxlUXVlcnlBbHRlcmF0aW9ucycpOwogICAgICAgICR0aGlzLT52YWxpZFNvdXJjZXMgICAgICAgPSBhcnJheSgnSW1hZ2UnLCdJbnN0YW50QW5zd2VyJywnTW9iaWxlV2ViJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05ld3MnLCdQaG9uZUJvb2snLCdSZWxhdGVkU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3BlbGwnLCdUcmFuc2xhdGlvbicsJ1ZpZGVvJywnV2ViJyk7CiAgICAgICAgJHRoaXMtPnZhbGlkRm9ybWF0cyAgICAgICA9IGFycmF5KCdqc29uJywneG1sJyk7CiAgICAgICAgJHRoaXMtPnZhbGlkRm9ybWF0T3B0aW9ucyA9IGFycmF5KCdqc29uJyA9PiBhcnJheSgncmF3JywnY2FsbGJhY2snKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4bWwnICA9PiBhcnJheSgnZWxlbWVudGJhc2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlYmFzZWQnKSk7CiAgICAgICAgaWYgKCFlbXB0eSgkYXBwSWQpKSB7CiAgICAgICAgICAgICR0aGlzLT5hcHBpZCA9ICRhcHBJZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfSAvLyBmdW5jdGlvbiBfX2NvbnN0cnVjdAoKICAgIC8qKgogICAgICogQXR0ZW1wdHMgdG8gZXhlY3V0ZSB0aGUgY3VycmVudGx5LXNwZWNpZmllZCBzZWFyY2gKICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcgVGhlIHJlc3VsdHMgZnJvbSB0aGUgcXVlcnkKICAgICAqIEB0aHJvd3MgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlYXJjaCgpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5hcHBpZCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1zZnRfQmluZ19TZWFyY2hfRXhjZXB0aW9uKCdFbXB0eSBBcHBJZCcpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPnNvdXJjZXMpKSB7CiAgICAgICAgICAgICR0aGlzLT5zb3VyY2VzW109J3dlYic7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgJHRoaXMtPnVybCA9ICR0aGlzLT5idWlsZFVybCgpOwogICAgICAgIAogICAgICAgIGlmICgkc3RyZWFtID0gQGZvcGVuKCR0aGlzLT51cmwsICdyJykpIHsKICAgICAgICAgICAgJG91dHB1dCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHN0cmVhbSk7CiAgICAgICAgICAgIGZDbG9zZSgkc3RyZWFtKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24oJ1Byb2JsZW0gb3BlbmluZyBzdHJlYW0nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZWFyY2goKQoKICAgIC8qKgogICAgICogQ29uc3RydWN0IHRoZSBVUkwgdXNlZCBpbiB0aGUgc2VhcmNoCiAgICAgKiAKICAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSB1cmwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJ1aWxkVXJsKCkKICAgIHsKICAgICAgICAkdXJsID0gJHRoaXMtPmJhc2VVcmwgLiAkdGhpcy0+Z2V0Rm9ybWF0KCkgLiAnLmFzcHgnOwogICAgICAgICR1cmwgLj0gIj8iCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ0FwcElkJywgdHJ1ZSkKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignQWR1bHQnKQogICAgICAgICAgICAgLiAkdGhpcy0+Z2V0UGFyYW1ldGVyKCdWZXJzaW9uJykKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignTWFya2V0JykKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignU291cmNlcycpCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ1dlYi5Db3VudCcpCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ0ltYWdlLkNvdW50JykKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignV2ViLk9mZnNldCcpCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ0ZpbGVUeXBlJykKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignRmxhZ3MnKQogICAgICAgICAgICAgLiAkdGhpcy0+Z2V0UGFyYW1ldGVyKCdKc29uVHlwZScpCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ1htbFR5cGUnKSAgICAgICAgICAgIAogICAgICAgICAgICAgLiAnJlF1ZXJ5PScuJHRoaXMtPmdldFF1ZXJ5KHRydWUpOwogICAgICAgICAgICAgcmV0dXJuICR1cmw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaW4gaWYgaXQncyBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCBvciB0aGUKICAgICAqIG1pbiBvciBtYXguCiAgICAgKgogICAgICogQHBhcmFtIG51bWJlciAkdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gbnVtYmVyICRtaW4gICBUaGUgbWluaW11bSBhbGxvd2FibGUgdmFsdWUKICAgICAqIEBwYXJhbSBudW1iZXIgJG1heCAgIFRoZSBtYXhpbXVtIGFsbG93YWJsZSB2YWx1ZQogICAgICogCiAgICAgKiBAcmV0dXJuIG51bWJlcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmV0d2VlbigkdmFsdWUsICRtaW4sICRtYXgpCiAgICB7CiAgICAgICAgJHZhbHVlID0gKGludCkkdmFsdWU7CiAgICAgICAgJHZhbHVlID0gbWF4KCRtaW4sICR2YWx1ZSk7CiAgICAgICAgJHZhbHVlID0gbWluKCRtYXgsICR2YWx1ZSk7CiAgICAgICAgcmV0dXJuICR2YWx1ZTsgICAgICAgIAogICAgfQoKICAgIC8qKgogICAgICogUHJvcGVybHkgZm9ybWF0IGFuZCB1cmxlbmNvZGUgdGhlIGtleT12YWx1ZSBwYWlyIHJlcXVlc3RlZC4KICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAgJG5hbWUgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaWdub3JlQW1wZXJzYW5kIElmIHRydWUsIGRvZXMgbm90IHByZXBlbmQgdGhlIG91dHB1dCB3aXRoCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFtcGVyc2FuZC4gRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCB0aGUgYW1wZXJzYW5kLgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqIAogICAgICogQHRocm93cyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGFyYW1ldGVyKCRuYW1lLCAkaWdub3JlQW1wZXJzYW5kPWZhbHNlKQogICAgewogICAgICAgIAogICAgICAgICRwYXJhbU5hbWUgICAgPSBzdHJfcmVwbGFjZSgnLicsICcnLCBzdHJ0b2xvd2VyKCRuYW1lKSk7ICAgICAgICAKICAgICAgICAkcmV0dXJuVmFsdWUgPSAnJzsKICAgICAgICAKICAgICAgICBpZiAoIXByb3BlcnR5X2V4aXN0cygkdGhpcywgJHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1zZnRfQmluZ19TZWFyY2hfRXhjZXB0aW9uKCRwYXJhbU5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGlzIGFuIGludmxhaWQgcGFyYW1ldGVyJyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIElmIChpc19hcnJheSgkdGhpcy0+JHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgJGFsbFZhbHVlcyA9IGltcGxvZGUoJyAnLCAkdGhpcy0+JHBhcmFtTmFtZSk7CiAgICAgICAgICAgICRyZXR1cm5WYWx1ZSAuPSAoIWVtcHR5KCRhbGxWYWx1ZXMpPygkbmFtZS4nPScpOicnKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGVuY29kZSh0cmltKCRhbGxWYWx1ZXMpKTsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT4kcGFyYW1OYW1lKSBhbmQgIWVtcHR5KCR0aGlzLT4kcGFyYW1OYW1lKSkgewogICAgICAgICAgICAgICAgJHJldHVyblZhbHVlIC49ICRuYW1lLic9Jy51cmxlbmNvZGUoJHRoaXMtPiRwYXJhbU5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHJldHVyblZhbHVlKSkgewogICAgICAgICAgICAkcmV0dXJuVmFsdWUgID0gKChib29sZWFuKSRpZ25vcmVBbXBlcnNhbmQ/Jyc6JyYnKS4kcmV0dXJuVmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmV0dXJuVmFsdWU7CiAgICB9IC8vIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYXJhbWV0ZXIoJG5hbWUpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYWR1bHQgZmlsdGVyCiAgICAgKiAKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBZHVsdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZHVsdDsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIGdldEFkdWx0KCkKICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGFkdWx0IGZpbHRlcgogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBUaGUgbmV3IHZhbHVlIChPZmZ8TW9kZXJhdGV8U3RyaWN0KQogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEFkdWx0KCR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+YWR1bHQgPSAkdmFsdWU7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gc2V0QWR1bHQoJHZhbHVlKQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIEFwcElEIGN1cnJlbnRseSBzZXQgaW4gdGhlIG9iamVjdAogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXBwSWQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YXBwaWQ7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRBcHBJZCgpCiAgICAKICAgIC8qKgogICAgICogU2V0IHRoZSBBcHBJRCBmb3IgdGhpcyBvYmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgVGhlIEJpbmcgYXBwbGljYXRpb24gaWQKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBcHBJZCgkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCFpc19udWxsKCR2YWx1ZSkpIHsKICAgICAgICAgICAgJHRoaXMtPmFwcGlkID0gJHZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZXRBcHBJZCgkdmFsdWUpCiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGJhc2UgQmluZyBVUkwKICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJhc2VVcmwoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YmFzZVVybDsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIGdldEJhc2VVcmwoKQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBiYXNlIEJpbmcgVVJMCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSBuZXcgYmFzZSB1cmwKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRCYXNlVXJsKCR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoIWlzX251bGwoJHZhbHVlKSkgewogICAgICAgICAgICAkdGhpcy0+YmFzZVVybCA9ICR2YWx1ZSAuIChzdWJzdHIoJHZhbHVlLCAtMSwgMSkhPScvJz8nLyc6JycpOwogICAgICAgIH0gLy8gaWYgKCFpc19udWxsKCR2YWx1ZSkpCiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gc2V0QmFzZVVybCgkdmFsdWUpCiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygd2ViIHJlc3VsdHMgdG8gYmUgcmVxdWVzdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0V2ViQ291bnQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d2ViY291bnQ7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRDb3VudCgpCiAgICAKICAgIC8qKgogICAgICogc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB3ZWIgcmVzdWx0cyB0byBiZSByZXF1ZXN0ZWQKICAgICAqIAogICAgICogQHBhcmFtIGludCAkdmFsdWUgMS0xMDAgVGhlIG5ldyB2YWx1ZSBvZiBXZWJTb3VyY2UuY291bnQKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXZWJDb3VudCgkdmFsdWUpCiAgICB7CiAgICAgICAgJHRoaXMtPndlYmNvdW50ID0gJHRoaXMtPmJldHdlZW4oJHZhbHVlLCAxLCAxMDApOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIHNldENvdW50KCR2YWx1ZSkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIHJlc3VsdHMgdG8gYmUgcmVxdWVzdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW1hZ2VDb3VudCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5pbWFnZWNvdW50OwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gZ2V0SW1hZ2VDb3VudCgpCiAgICAKICAgIC8qKgogICAgICogU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW1hZ2UgcmVzdWx0cyB0byBiZSByZXF1ZXN0ZWQKICAgICAqIAogICAgICogQHBhcmFtIGludCAkdmFsdWUgMS0xMDAgVGhlIG5ldyB2YWx1ZSBvZiBJbWFnZVNvdXJjZS5jb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEltYWdlQ291bnQoJHZhbHVlKQogICAgewogICAgICAgICR0aGlzLT5pbWFnZWNvdW50ID0gJHRoaXMtPmJldHdlZW4oJHZhbHVlLCAxLCAxMDApOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIHNldEltYWdlQ291bnQoJHZhbHVlKQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIHJlc3VsdCBmb3JtYXQKICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZvcm1hdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5mb3JtYXQ7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXQoKQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0ZWQgcmVzdWx0IGZvcm1hdC4gZm9ybWF0IGlzIHZhbGlkYXRlZAogICAgICogYWdhaW5zdCB2YWxpZEZvcm1hdHMuIGZvcm1hdE9wdGlvbiBpcyByZXNldCB0byB0aGUgZmlyc3QgbGlzdGVkCiAgICAgKiB2YWxpZEZvcm1hdE9wdGlvbi4gT3RoZXIgb3B0aW9ucyBhcmUgY2xlYXJlZC4KICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgVGhlIG5ldyB2YWx1ZQogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqIAogICAgICogQHRocm93cyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0KCR2YWx1ZSkKICAgIHsKICAgICAgICAkdmFsdWUgPSBzdHJ0b2xvd2VyKCR2YWx1ZSk7CiAgICAgICAgaWYgKGluX2FycmF5KCR2YWx1ZSwgJHRoaXMtPnZhbGlkRm9ybWF0cykpIHsKICAgICAgICAgICAgJHRoaXMtPmZvcm1hdCA9ICR2YWx1ZTsKICAgICAgICAgICAgJHRoaXMtPl9mcm9tYXRPcHRpb24gPSAkdGhpcy0+dmFsaWRGb3JtYXRPcHRpb25zWyR2YWx1ZV1bMF07CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT52YWxpZEZvcm1hdHMgYXMgJGtleSkgewogICAgICAgICAgICAgICAgJHByb3BlcnR5ID0gJ18nLiRrZXkuJ3R5cGUnOwogICAgICAgICAgICAgICAgJHRoaXMtPiRwcm9wZXJ0eSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1zZnRfQmluZ19TZWFyY2hfRXhjZXB0aW9uKCR2YWx1ZS4nIGlzIGFuIGludmFsaWQgZm9ybWF0LicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXQoJHZhbHVlKQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmb3JtYXQgb3B0aW9ucy4KICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZvcm1hdE9wdGlvbigpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5mb3JtYXRPcHRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgZm9ybWF0IG9wdGlvbi4gb3B0aW9uIGlzIHZhbGlkYXRlZCBhZ2FpbnN0CiAgICAgKiB0aGUgdmFsaWRGb3JtYXRzIGFycmF5CiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSBuZXcgdmFsdWUKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXRPcHRpb24oJHZhbHVlKQogICAgewogICAgICAgICR2YWx1ZSA9IHN0cnRvbG93ZXIoJHZhbHVlKTsKICAgICAgICBpZiAoaW5fYXJyYXkoJHZhbHVlLCAkdGhpcy0+dmFsaWRGb3JtYXRPcHRpb25zWyR0aGlzLT5mb3JtYXRdKSkgewogICAgICAgICAgICAkdGhpcy0+Zm9ybWF0b3B0aW9uID0gJHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbigkdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBub3QgYSB2YWxpZCBvcHRpb24gZm9yIHRoZSBmb3JtYXQgJy4kdGhpcy0+Zm9ybWF0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzOyAgICAgICAgCiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXRPcHRpb24oJGtleSkKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBvZiB0aGUgcmVzdWx0cwogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TWFya2V0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm1hcmtldDsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIGdldE1hcmtldCgpCgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBsYW5ndWFnZSBvZiB0aGUgcmVzdWx0cwogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBUaGUgbmV3IHZhbHVlCiAgICAgKiAKICAgICAqIEByZXR1cm4gTXNmdF9CaW5nX1NlYXJjaAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TWFya2V0KCR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+bWFya2V0ID0gJHZhbHVlOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIHNldE1hcmtldCgkdmFsdWUpCiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCByZXN1bHQgb2Zmc2V0CiAgICAgKiAKICAgICAqIEByZXR1cm4gaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0V2ViT2Zmc2V0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPndlYm9mZnNldDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIHJlc3VsdCBvZmZzZXQKICAgICAqIAogICAgICogQHBhcmFtIGludGVnZXIgJHZhbHVlIFRoZSBuZXcgdmFsdWUKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXZWJPZmZzZXQoJHZhbHVlKQogICAgewogICAgICAgICR0aGlzLT53ZWJvZmZzZXQgPSAkdGhpcy0+YmV0d2VlbigkdmFsdWUsIDAsIDEwMDApOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBCaW5nIEFQSSB2ZXJzaW9uIHVzZWQgYnkgdGhlIG9iamVjdAogICAgICogCiAgICAgKiBAcmV0dXJuIGZsb2F0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZlcnNpb247ICAgICAgICAKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgQmluZyBBUEkgdmVyc2lvbiB0byB1c2UKICAgICAqIAogICAgICogQHBhcmFtIGZsb2F0ICR2YWx1ZSBUaGUgbmV3IHZhbHVlCiAgICAgKiAKICAgICAqIEByZXR1cm4gTXNmdF9CaW5nX1NlYXJjaAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VmVyc2lvbigkdmFsdWUpCiAgICB7CiAgICAgICAgJHRoaXMtPnZlcnNpb24gPSAoZmxvYXQpJHZhbHVlOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcmVmZXJyZWQgZmlsZSB0eXBlcyBmb3IgdGhlIG9iamVjdAogICAgICogCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlVHlwZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmlsZXR5cGU7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlVHlwZSgpCiAgICAKICAgIC8qKgogICAgICogVG9nZ2xlcyBhIHZhbHVlIGluIHRoZSBsaXN0IG9mIHByZWZlcnJlZCBmaWxlIHR5cGVzLiAKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHRvZ2dsZWQKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKiAKICAgICAqIEB0aHJvd3MgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEZpbGVUeXBlKCR2YWx1ZSkKICAgIHsKICAgICAgICAkdmFsdWUgICA9IHN0cnRvdXBwZXIoJHZhbHVlKTsKICAgICAgICAkdGVzdEtleSA9IGFycmF5X3NlYXJjaCgkdmFsdWUsICR0aGlzLT52YWxpZEZpbGVUeXBlcyk7CiAgICAgICAgCiAgICAgICAgaWYgKCR0ZXN0S2V5IT09ZmFsc2UpIHsKICAgICAgICAgICAgJGtleSA9IGFycmF5X3NlYXJjaCgkdmFsdWUsICR0aGlzLT5maWxldHlwZSk7CiAgICAgICAgICAgIGlmICgka2V5PT09ZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZXR5cGVbXSA9ICR2YWx1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5maWxldHlwZVska2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24oJHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBub3QgYSB2YWxpZCBGaWxlIFR5cGUnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gc2V0RmlsZVR5cGUoJGtleSkKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBmbGFncyBzcGVjaWZpZWQgZm9yIHRoZSBvYmplY3QKICAgICAqIAogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RmxhZ3MoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmxhZ3M7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRGbGFnc3MoKQogICAgCiAgICAvKioKICAgICAqIFRvZ2dsZXMgYSB2YWx1ZSBpbiB0aGUgbGlzdCBvZiBhY2NlcHRhYmxlIGZsYWdzLgogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgdG9nZ2xlZAogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqIAogICAgICogQHRocm93cyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RmxhZygkdmFsdWUpCiAgICB7CiAgICAgICAgJHRlc3RLZXkgPSBhcnJheV9zZWFyY2goJHZhbHVlLCAkdGhpcy0+dmFsaWRGbGFncyk7CiAgICAgICAgCiAgICAgICAgaWYgKCR0ZXN0S2V5IT09ZmFsc2UpIHsKICAgICAgICAgICAgJGtleSA9IGFycmF5X3NlYXJjaCgkdmFsdWUsICR0aGlzLT5mbGFncyk7CiAgICAgICAgICAgIGlmICgka2V5PT09ZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmxhZ3NbXSA9ICR2YWx1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5mbGFnc1ska2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24oJHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBub3QgYSB2YWxpZCBGbGFnLicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb24oJGtleSwgJHZhbHVlKQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc291cmNlcyBzcGVjaWZpZWQgZm9yIHRoZSBvYmplY3QKICAgICAqIAogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zb3VyY2VzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKCRrZXkpCiAgICAKICAgIC8qKgogICAgICogVG9nZ2xlcyBhIHZhbHVlIGluIHRoZSBsaXN0IG9mIHJlcXVlc3RlZCBzb3VyY2VzCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSB2YWx1ZSB0byBiZSB0b2dnbGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gTXNmdF9CaW5nX1NlYXJjaAogICAgICogCiAgICAgKiBAdGhyb3dzIE1zZnRfQmluZ19TZWFyY2hfRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2UoJHZhbHVlKQogICAgewogICAgICAgICR0ZXN0S2V5ID0gYXJyYXlfc2VhcmNoKCR2YWx1ZSwgJHRoaXMtPnZhbGlkU291cmNlcyk7CiAgICAgICAgCiAgICAgICAgaWYgKCR0ZXN0S2V5IT09ZmFsc2UpIHsKICAgICAgICAgICAgJGtleSA9IGFycmF5X3NlYXJjaCgkdmFsdWUsICR0aGlzLT5zb3VyY2VzKTsKICAgICAgICAgICAgaWYgKCRrZXk9PT1mYWxzZSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zb3VyY2VzW10gPSAkdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1bnNldCgkdGhpcy0+c291cmNlc1ska2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24oJHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBub3QgYSB2YWxpZCBTb3VyY2UuJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZSgka2V5LCAkdmFsdWUpCiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNlYXJjaCBxdWVyeQogICAgICogCiAgICAgKiBAcGFyYW0gYm9vbCAkZW5jb2RlIHRydWUgaWYgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgdXJsZW5jb2RlZC4KICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFF1ZXJ5KCRlbmNvZGU9ZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5pc1NpdGVTcGVjaWZpYygpKSB7CiAgICAgICAgICAgICRyZXR1cm5WYWx1ZSA9ICdzaXRlOicuJHRoaXMtPmdldFNpdGUoKS4iICI7CiAgICAgICAgfQoKICAgICAgICAkcmV0dXJuVmFsdWUgLj0gJHRoaXMtPnF1ZXJ5OyAgICAKICAgICAgICAKICAgICAgICBpZiAoJGVuY29kZSkgewogICAgICAgICAgICAkcmV0dXJuVmFsdWUgPSB1cmxlbmNvZGUoJHJldHVyblZhbHVlKTsKICAgICAgICB9IC8vIGlmICgkZW5jb2RlKQogICAgICAgIAogICAgICAgIHJldHVybiAkcmV0dXJuVmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzZWFyY2ggcXVlcnkKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgdGhlIG5ldyB2YWx1ZQogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFF1ZXJ5KCR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+cXVlcnkgPSAkdmFsdWU7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlKCRrZXksICR2YWx1ZSkKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNpdGUgc3BlY2lmaWVkIGZvciBhIHNpdGUtc3BlY2lmaWMgc2VhcmNoLgogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2l0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zaXRlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyB0aGUgc2l0ZSBhZGRyZXNzIGZvciBhIHNpdGUtc3BlY2lmaWMgc2VhcmNoCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSBzaXRlIGFkZHJlc3MgKG5vIGh0dHA6Ly8gb3IgaHR0cHM6Ly8pCiAgICAgKiAKICAgICAqIEByZXR1cm4gTXNmdF9CaW5nX1NlYXJjaAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U2l0ZSgkdmFsdWUpCiAgICB7CiAgICAgICAgJHRoaXMtPnNpdGUgPSAkdmFsdWU7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VhcmNoIGlzIHNpdGUgc3BlY2lmaWMKICAgICAqIAogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc1NpdGVTcGVjaWZpYygpCiAgICB7CiAgICAgICAgcmV0dXJuIChpc3NldCgkdGhpcy0+c2l0ZSkgYW5kCiAgICAgICAgICAgICAgICAhZW1wdHkoJHRoaXMtPnNpdGUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGUgbGFzdCBzZWFyY2ggZXhlY3V0ZWQgYnkgdGhlIG9iamVjdAogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVybDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.Msft_Bing_Search_Exception.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9QSFAKLyoqCiAqIE1pY3Jvc29mdCBCaW5nIFNlYXJjaAogKiAKICogUEhQIGxpYnJhcnkgdG8gc3VwcG9ydCB0aGUgTWljcm9zb2Z0IEJpbmcgU2VhcmNoIEFQSS4KICoKICogUEhQIFZlcnNpb24gNQogKiAgCiAqIEBjYXRlZ29yeSAgTXNmdAogKiBAcGFja2FnZSAgIE1zZnQKICogQGF1dGhvciAgICBDYWwgRXZhbnMgCiAqIEBjb3B5cmlnaHQgMjAxMCBNaWNyb3NvZnQKICogQGxpY2Vuc2UgICBOZXcgQlNEIExpY2Vuc2UgKEJTRCkgaHR0cDovL2JpbmdwaHAuY29kZXBsZXguY29tL2xpY2Vuc2UKICogQHZlcnNpb24gICBTVk46ICRJZDogRXhjZXB0aW9uLnBocCA0OCAyMDEwLTAzLTIwIDE0OjIzOjQxWiBjYWwgJAogKiBAbGluayAgICAgIGh0dHA6Ly9iaW5ncGhwLmNvZGVwbGV4LmNvbQogKgogKi8KCi8qKgogKiBFeGNlcHRpb24gY2xhc3MgZm9yIHRoZSBNaWNyb3NvZnQgQmluZyBTZWFyY2ggTGlicmFyeQogKiAKICogQGNhdGVnb3J5ICAgTXNmdAogKiBAcGFja2FnZSAgICBNc2Z0CiAqIEBzdWJwYWNrYWdlIEJpbmcKICogQGF1dGhvciAgICAgQ2FsIEV2YW5zIAogKiBAbGljZW5zZSAgICBOZXcgQlNEIExpY2Vuc2UgKEJTRCkgaHR0cDovL2JpbmdwaHAuY29kZXBsZXguY29tL2xpY2Vuc2UKICogQGxpbmsgICAgICAgaHR0cDovL2JpbmdwaHAuY29kZXBsZXguY29tCiAqLwpjbGFzcyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgICAKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.SimplePie.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNpbXBsZVBpZQogKgogKiBBIFBIUC1CYXNlZCBSU1MgYW5kIEF0b20gRmVlZCBGcmFtZXdvcmsuCiAqIFRha2VzIHRoZSBoYXJkIHdvcmsgb3V0IG9mIG1hbmFnaW5nIGEgY29tcGxldGUgUlNTL0F0b20gc29sdXRpb24uCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4LCBSeWFuIFBhcm1hbiBhbmQgR2VvZmZyZXkgU25lZGRvbgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIAkqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCiAqIAkgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogCSogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3QKICogCSAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKICogCSAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAJKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTaW1wbGVQaWUgVGVhbSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKICogCSAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKICogCSAgd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTCiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTCiAqIEFORCBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCiAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAdmVyc2lvbiAxLjEuMwogKiBAY29weXJpZ2h0IDIwMDQtMjAwOCBSeWFuIFBhcm1hbiwgR2VvZmZyZXkgU25lZGRvbgogKiBAYXV0aG9yIFJ5YW4gUGFybWFuCiAqIEBhdXRob3IgR2VvZmZyZXkgU25lZGRvbgogKiBAbGluayBodHRwOi8vc2ltcGxlcGllLm9yZy8gU2ltcGxlUGllCiAqIEBsaW5rIGh0dHA6Ly9zaW1wbGVwaWUub3JnL3N1cHBvcnQvIFBsZWFzZSBzdWJtaXQgYWxsIGJ1ZyByZXBvcnRzIGFuZCBmZWF0dXJlIHJlcXVlc3RzIHRvIHRoZSBTaW1wbGVQaWUgZm9ydW1zCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwIEJTRCBMaWNlbnNlCiAqIEB0b2RvIHBocERvYyBjb21tZW50cwogKi8KCi8qKgogKiBTaW1wbGVQaWUgTmFtZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRScsICdTaW1wbGVQaWUnKTsKCi8qKgogKiBTaW1wbGVQaWUgVmVyc2lvbgogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVkVSU0lPTicsICcxLjEuMycpOwoKLyoqCiAqIFNpbXBsZVBpZSBCdWlsZAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQlVJTEQnLCAyMDA4MTIxOSk7CgovKioKICogU2ltcGxlUGllIFdlYnNpdGUgVVJMCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9VUkwnLCAnaHR0cDovL3NpbXBsZXBpZS5vcmcnKTsKCi8qKgogKiBTaW1wbGVQaWUgVXNlcmFnZW50CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfdXNlcmFnZW50KCkKICovCmRlZmluZSgnU0lNUExFUElFX1VTRVJBR0VOVCcsIFNJTVBMRVBJRV9OQU1FIC4gJy8nIC4gU0lNUExFUElFX1ZFUlNJT04gLiAnIChGZWVkIFBhcnNlcjsgJyAuIFNJTVBMRVBJRV9VUkwgLiAnOyBBbGxvdyBsaWtlIEdlY2tvKSBCdWlsZC8nIC4gU0lNUExFUElFX0JVSUxEKTsKCi8qKgogKiBTaW1wbGVQaWUgTGlua2JhY2sKICovCmRlZmluZSgnU0lNUExFUElFX0xJTktCQUNLJywgJzxhIGhyZWY9IicgLiBTSU1QTEVQSUVfVVJMIC4gJyIgdGl0bGU9IicgLiBTSU1QTEVQSUVfTkFNRSAuICcgJyAuIFNJTVBMRVBJRV9WRVJTSU9OIC4gJyI+JyAuIFNJTVBMRVBJRV9OQU1FIC4gJzwvYT4nKTsKCi8qKgogKiBObyBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX05PTkUnLCAwKTsKCi8qKgogKiBGZWVkIExpbmsgRWxlbWVudCBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX0FVVE9ESVNDT1ZFUlknLCAxKTsKCi8qKgogKiBMb2NhbCBGZWVkIEV4dGVuc2lvbiBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0VYVEVOU0lPTicsIDIpOwoKLyoqCiAqIExvY2FsIEZlZWQgQm9keSBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0JPRFknLCA0KTsKCi8qKgogKiBSZW1vdGUgRmVlZCBFeHRlbnNpb24gQXV0b2Rpc2NvdmVyeQogKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2F1dG9kaXNjb3ZlcnlfbGV2ZWwoKQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfRVhURU5TSU9OJywgOCk7CgovKioKICogUmVtb3RlIEZlZWQgQm9keSBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX1JFTU9URV9CT0RZJywgMTYpOwoKLyoqCiAqIEFsbCBGZWVkIEF1dG9kaXNjb3ZlcnkKICogQHNlZSBTaW1wbGVQaWU6OnNldF9hdXRvZGlzY292ZXJ5X2xldmVsKCkKICovCmRlZmluZSgnU0lNUExFUElFX0xPQ0FUT1JfQUxMJywgMzEpOwoKLyoqCiAqIE5vIGtub3duIGZlZWQgdHlwZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9OT05FJywgMCk7CgovKioKICogUlNTIDAuOTAKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MCcsIDEpOwoKLyoqCiAqIFJTUyAwLjkxIChOZXRzY2FwZSkKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MV9ORVRTQ0FQRScsIDIpOwoKLyoqCiAqIFJTUyAwLjkxIChVc2VybGFuZCkKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MV9VU0VSTEFORCcsIDQpOwoKLyoqCiAqIFJTUyAwLjkxIChib3RoIE5ldHNjYXBlIGFuZCBVc2VybGFuZCkKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MScsIDYpOwoKLyoqCiAqIFJTUyAwLjkyCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9UWVBFX1JTU18wOTInLCA4KTsKCi8qKgogKiBSU1MgMC45MwogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfMDkzJywgMTYpOwoKLyoqCiAqIFJTUyAwLjk0CiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9UWVBFX1JTU18wOTQnLCAzMik7CgovKioKICogUlNTIDEuMAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfMTAnLCA2NCk7CgovKioKICogUlNTIDIuMAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfMjAnLCAxMjgpOwoKLyoqCiAqIFJERi1iYXNlZCBSU1MKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTX1JERicsIDY1KTsKCi8qKgogKiBOb24tUkRGLWJhc2VkIFJTUyAodHJ1bHkgaW50ZW5kZWQgYXMgc3luZGljYXRpb24gZm9ybWF0KQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfU1lORElDQVRJT04nLCAxOTApOwoKLyoqCiAqIEFsbCBSU1MKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTX0FMTCcsIDI1NSk7CgovKioKICogQXRvbSAwLjMKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfQVRPTV8wMycsIDI1Nik7CgovKioKICogQXRvbSAxLjAKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfQVRPTV8xMCcsIDUxMik7CgovKioKICogQWxsIEF0b20KICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfQVRPTV9BTEwnLCA3NjgpOwoKLyoqCiAqIEFsbCBmZWVkIHR5cGVzCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9UWVBFX0FMTCcsIDEwMjMpOwoKLyoqCiAqIE5vIGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkUnLCAwKTsKCi8qKgogKiBUZXh0IGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQnLCAxKTsKCi8qKgogKiBIVE1MIGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUwnLCAyKTsKCi8qKgogKiBYSFRNTCBjb25zdHJ1Y3QKICovCmRlZmluZSgnU0lNUExFUElFX0NPTlNUUlVDVF9YSFRNTCcsIDQpOwoKLyoqCiAqIGJhc2U2NC1lbmNvZGVkIGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX0JBU0U2NCcsIDgpOwoKLyoqCiAqIElSSSBjb25zdHJ1Y3QKICovCmRlZmluZSgnU0lNUExFUElFX0NPTlNUUlVDVF9JUkknLCAxNik7CgovKioKICogQSBjb25zdHJ1Y3QgdGhhdCBtaWdodCBiZSBIVE1MCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCcsIDMyKTsKCi8qKgogKiBBbGwgY29uc3RydWN0cwogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX0FMTCcsIDYzKTsKCi8qKgogKiBQQ1JFIGZvciBIVE1MIGF0dHJpYnV0ZXMKICovCmRlZmluZSgnU0lNUExFUElFX1BDUkVfSFRNTF9BVFRSSUJVVEUnLCAnKCg/OltceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBdK1teXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyRlx4M0VdW15ceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceDJGXHgzRFx4M0VdKig/OltceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBdKj1bXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXSooPzoiKD86W14iXSopInxcJyg/OlteXCddKilcJ3woPzpbXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4MjJceDI3XHgzRV1bXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4M0VdKik/KSk/KSopW1x4MDlceDBBXHgwQlx4MENceDBEXHgyMF0qJyk7CgovKioKICogUENSRSBmb3IgWE1MIGF0dHJpYnV0ZXMKICovCmRlZmluZSgnU0lNUExFUElFX1BDUkVfWE1MX0FUVFJJQlVURScsICcoKD86XHMrKD86KD86W15cczpdKzopP1teXHM6XSspXHMqPVxzKig/OiIoPzpbXiJdKikifFwnKD86W15cJ10qKVwnKSkqKVxzKicpOwoKLyoqCiAqIFhNTCBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9YTUwnLCAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJyk7CgovKioKICogQXRvbSAxLjAgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCcsICdodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20nKTsKCi8qKgogKiBBdG9tIDAuMyBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzJywgJ2h0dHA6Ly9wdXJsLm9yZy9hdG9tL25zIycpOwoKLyoqCiAqIFJERiBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9SREYnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIycpOwoKLyoqCiAqIFJTUyAwLjkwIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAnLCAnaHR0cDovL215Lm5ldHNjYXBlLmNvbS9yZGYvc2ltcGxlLzAuOS8nKTsKCi8qKgogKiBSU1MgMS4wIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCcsICdodHRwOi8vcHVybC5vcmcvcnNzLzEuMC8nKTsKCi8qKgogKiBSU1MgMS4wIENvbnRlbnQgTW9kdWxlIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF9NT0RVTEVTX0NPTlRFTlQnLCAnaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvbW9kdWxlcy9jb250ZW50LycpOwoKLyoqCiAqIFJTUyAyLjAgTmFtZXNwYWNlCiAqIChTdHVwaWQsIEkga25vdywgYnV0IEknbSBjZXJ0YWluIGl0IHdpbGwgY29uZnVzZSBwZW9wbGUgbGVzcyB3aXRoIHN1cHBvcnQuKQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCcsICcnKTsKCi8qKgogKiBEQyAxLjAgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAnLCAnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMC8nKTsKCi8qKgogKiBEQyAxLjEgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEnLCAnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nKTsKCi8qKgogKiBXM0MgQmFzaWMgR2VvIChXR1M4NCBsYXQvbG9uZykgVm9jYWJ1bGFyeSBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9XM0NfQkFTSUNfR0VPJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsKCi8qKgogKiBHZW9SU1MgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfR0VPUlNTJywgJ2h0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MnKTsKCi8qKgogKiBNZWRpYSBSU1MgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MnLCAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy8nKTsKCi8qKgogKiBXcm9uZyBNZWRpYSBSU1MgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NfV1JPTkcnLCAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcycpOwoKLyoqCiAqIGlUdW5lcyBSU1MgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTJywgJ2h0dHA6Ly93d3cuaXR1bmVzLmNvbS9kdGRzL3BvZGNhc3QtMS4wLmR0ZCcpOwoKLyoqCiAqIFhIVE1MIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1hIVE1MJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnKTsKCi8qKgogKiBJQU5BIExpbmsgUmVsYXRpb25zIFJlZ2lzdHJ5CiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZJywgJ2h0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvcmVsYXRpb24vJyk7CgovKioKICogV2hldGhlciB3ZSdyZSBydW5uaW5nIG9uIFBIUDUKICovCmRlZmluZSgnU0lNUExFUElFX1BIUDUnLCB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjAuMCcsICc+PScpKTsKCi8qKgogKiBObyBmaWxlIHNvdXJjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfRklMRV9TT1VSQ0VfTk9ORScsIDApOwoKLyoqCiAqIFJlbW90ZSBmaWxlIHNvdXJjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfRklMRV9TT1VSQ0VfUkVNT1RFJywgMSk7CgovKioKICogTG9jYWwgZmlsZSBzb3VyY2UKICovCmRlZmluZSgnU0lNUExFUElFX0ZJTEVfU09VUkNFX0xPQ0FMJywgMik7CgovKioKICogZnNvY2tvcGVuKCkgZmlsZSBzb3VyY2UKICovCmRlZmluZSgnU0lNUExFUElFX0ZJTEVfU09VUkNFX0ZTT0NLT1BFTicsIDQpOwoKLyoqCiAqIGNVUkwgZmlsZSBzb3VyY2UKICovCmRlZmluZSgnU0lNUExFUElFX0ZJTEVfU09VUkNFX0NVUkwnLCA4KTsKCi8qKgogKiBmaWxlX2dldF9jb250ZW50cygpIGZpbGUgc291cmNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9GSUxFX1NPVVJDRV9GSUxFX0dFVF9DT05URU5UUycsIDE2KTsKCi8qKgogKiBTaW1wbGVQaWUKICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEB2ZXJzaW9uICJSYXp6bGViZXJyeSIKICogQGNvcHlyaWdodCAyMDA0LTIwMDcgUnlhbiBQYXJtYW4sIEdlb2ZmcmV5IFNuZWRkb24KICogQGF1dGhvciBSeWFuIFBhcm1hbgogKiBAYXV0aG9yIEdlb2ZmcmV5IFNuZWRkb24KICogQHRvZG8gT3B0aW9uIGZvciB0eXBlIG9mIGZldGNoaW5nIChjYWNoZSwgbm90IG1vZGlmaWVkIGhlYWRlciwgZmV0Y2gsIGV0Yy4pCiAqLwpjbGFzcyBTaW1wbGVQaWUKewoJLyoqCgkgKiBAdmFyIGFycmF5IFJhdyBkYXRhCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRkYXRhID0gYXJyYXkoKTsKCgkvKioKCSAqIEB2YXIgbWl4ZWQgRXJyb3Igc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRlcnJvcjsKCgkvKioKCSAqIEB2YXIgb2JqZWN0IEluc3RhbmNlIG9mIFNpbXBsZVBpZV9TYW5pdGl6ZSAob3Igb3RoZXIgY2xhc3MpCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X3Nhbml0aXplX2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHNhbml0aXplOwoKCS8qKgoJICogQHZhciBzdHJpbmcgU2ltcGxlUGllIFVzZXJhZ2VudAoJICogQHNlZSBTaW1wbGVQaWU6OnNldF91c2VyYWdlbnQoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkdXNlcmFnZW50ID0gU0lNUExFUElFX1VTRVJBR0VOVDsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIEZlZWQgVVJMCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2ZlZWRfdXJsKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZlZWRfdXJsOwoKCS8qKgoJICogQHZhciBvYmplY3QgSW5zdGFuY2Ugb2YgU2ltcGxlUGllX0ZpbGUgdG8gdXNlIGFzIGEgZmVlZAoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9maWxlKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZpbGU7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBSYXcgZmVlZCBkYXRhCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X3Jhd19kYXRhKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHJhd19kYXRhOwoKCS8qKgoJICogQHZhciBpbnQgVGltZW91dCBmb3IgZmV0Y2hpbmcgcmVtb3RlIGZpbGVzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X3RpbWVvdXQoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkdGltZW91dCA9IDEwOwoKCS8qKgoJICogQHZhciBib29sIEZvcmNlcyBmc29ja29wZW4oKSB0byBiZSB1c2VkIGZvciByZW1vdGUgZmlsZXMgaW5zdGVhZAoJICogb2YgY1VSTCwgZXZlbiBpZiBhIG5ldyBlbm91Z2ggdmVyc2lvbiBpcyBpbnN0YWxsZWQKCSAqIEBzZWUgU2ltcGxlUGllOjpmb3JjZV9mc29ja29wZW4oKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZm9yY2VfZnNvY2tvcGVuID0gZmFsc2U7CgoJLyoqCgkgKiBAdmFyIGJvb2wgRm9yY2UgdGhlIGdpdmVuIGRhdGEvVVJMIHRvIGJlIHRyZWF0ZWQgYXMgYSBmZWVkIG5vIG1hdHRlciB3aGF0CgkgKiBpdCBhcHBlYXJzIGxpa2UKCSAqIEBzZWUgU2ltcGxlUGllOjpmb3JjZV9mZWVkKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZvcmNlX2ZlZWQgPSBmYWxzZTsKCgkvKioKCSAqIEB2YXIgYm9vbCBFbmFibGUvRGlzYWJsZSBYTUwgZHVtcAoJICogQHNlZSBTaW1wbGVQaWU6OmVuYWJsZV94bWxfZHVtcCgpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICR4bWxfZHVtcCA9IGZhbHNlOwoKCS8qKgoJICogQHZhciBib29sIEVuYWJsZS9EaXNhYmxlIENhY2hpbmcKCSAqIEBzZWUgU2ltcGxlUGllOjplbmFibGVfY2FjaGUoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkY2FjaGUgPSB0cnVlOwoKCS8qKgoJICogQHZhciBpbnQgQ2FjaGUgZHVyYXRpb24gKGluIHNlY29uZHMpCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2NhY2hlX2R1cmF0aW9uKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNhY2hlX2R1cmF0aW9uID0gMzYwMDsKCgkvKioKCSAqIEB2YXIgaW50IEF1dG8tZGlzY292ZXJ5IGNhY2hlIGR1cmF0aW9uIChpbiBzZWNvbmRzKQoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9hdXRvZGlzY292ZXJ5X2NhY2hlX2R1cmF0aW9uKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGF1dG9kaXNjb3ZlcnlfY2FjaGVfZHVyYXRpb24gPSA2MDQ4MDA7IC8vIDcgRGF5cy4KCgkvKioKCSAqIEB2YXIgc3RyaW5nIENhY2hlIGxvY2F0aW9uIChyZWxhdGl2ZSB0byBleGVjdXRpbmcgc2NyaXB0KQoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9jYWNoZV9sb2NhdGlvbigpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRjYWNoZV9sb2NhdGlvbiA9ICcuL2NhY2hlJzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIEZ1bmN0aW9uIHRoYXQgY3JlYXRlcyB0aGUgY2FjaGUgZmlsZW5hbWUKCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfY2FjaGVfbmFtZV9mdW5jdGlvbigpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRjYWNoZV9uYW1lX2Z1bmN0aW9uID0gJ21kNSc7CgoJLyoqCgkgKiBAdmFyIGJvb2wgUmVvcmRlciBmZWVkIGJ5IGRhdGUgZGVzY2VuZGluZwoJICogQHNlZSBTaW1wbGVQaWU6OmVuYWJsZV9vcmRlcl9ieV9kYXRlKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG9yZGVyX2J5X2RhdGUgPSB0cnVlOwoKCS8qKgoJICogQHZhciBtaXhlZCBGb3JjZSBpbnB1dCBlbmNvZGluZyB0byBiZSBzZXQgdG8gdGhlIGZvbGxvdyB2YWx1ZQoJICogKGZhbHNlLCBvciBhbnl0aGluZyB0eXBlLWNhc3QgdG8gZmFsc2UsIGRpc2FibGVzIHRoaXMgZmVhdHVyZSkKCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfaW5wdXRfZW5jb2RpbmcoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkaW5wdXRfZW5jb2RpbmcgPSBmYWxzZTsKCgkvKioKCSAqIEB2YXIgaW50IEZlZWQgQXV0b2Rpc2NvdmVyeSBMZXZlbAoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9hdXRvZGlzY292ZXJ5X2xldmVsKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGF1dG9kaXNjb3ZlcnkgPSBTSU1QTEVQSUVfTE9DQVRPUl9BTEw7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBjYWNoaW5nIGZlZWRzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2NhY2hlX2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNhY2hlX2NsYXNzID0gJ1NpbXBsZVBpZV9DYWNoZSc7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBsb2NhdGluZyBmZWVkcwoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9sb2NhdG9yX2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGxvY2F0b3JfY2xhc3MgPSAnU2ltcGxlUGllX0xvY2F0b3InOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgcGFyc2luZyBmZWVkcwoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9wYXJzZXJfY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcGFyc2VyX2NsYXNzID0gJ1NpbXBsZVBpZV9QYXJzZXInOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgZmV0Y2hpbmcgZmVlZHMKCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfZmlsZV9jbGFzcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmaWxlX2NsYXNzID0gJ1NpbXBsZVBpZV9GaWxlJzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIENsYXNzIHVzZWQgZm9yIGl0ZW1zCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2l0ZW1fY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkaXRlbV9jbGFzcyA9ICdTaW1wbGVQaWVfSXRlbSc7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBhdXRob3JzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2F1dGhvcl9jbGFzcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRhdXRob3JfY2xhc3MgPSAnU2ltcGxlUGllX0F1dGhvcic7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBjYXRlZ29yaWVzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2NhdGVnb3J5X2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNhdGVnb3J5X2NsYXNzID0gJ1NpbXBsZVBpZV9DYXRlZ29yeSc7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBlbmNsb3N1cmVzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2VuY2xvc3VyZXNfY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZW5jbG9zdXJlX2NsYXNzID0gJ1NpbXBsZVBpZV9FbmNsb3N1cmUnOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgTWVkaWEgUlNTIDxtZWRpYTp0ZXh0PiBjYXB0aW9ucwoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9jYXB0aW9uX2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNhcHRpb25fY2xhc3MgPSAnU2ltcGxlUGllX0NhcHRpb24nOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgTWVkaWEgUlNTIDxtZWRpYTpjb3B5cmlnaHQ+CgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2NvcHlyaWdodF9jbGFzcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRjb3B5cmlnaHRfY2xhc3MgPSAnU2ltcGxlUGllX0NvcHlyaWdodCc7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBNZWRpYSBSU1MgPG1lZGlhOmNyZWRpdD4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfY3JlZGl0X2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNyZWRpdF9jbGFzcyA9ICdTaW1wbGVQaWVfQ3JlZGl0JzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIENsYXNzIHVzZWQgZm9yIE1lZGlhIFJTUyA8bWVkaWE6cmF0aW5nPgoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9yYXRpbmdfY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmF0aW5nX2NsYXNzID0gJ1NpbXBsZVBpZV9SYXRpbmcnOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgTWVkaWEgUlNTIDxtZWRpYTpyZXN0cmljdGlvbj4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfcmVzdHJpY3Rpb25fY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmVzdHJpY3Rpb25fY2xhc3MgPSAnU2ltcGxlUGllX1Jlc3RyaWN0aW9uJzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIENsYXNzIHVzZWQgZm9yIGNvbnRlbnQtdHlwZSBzbmlmZmluZwoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9jb250ZW50X3R5cGVfc25pZmZlcl9jbGFzcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRjb250ZW50X3R5cGVfc25pZmZlcl9jbGFzcyA9ICdTaW1wbGVQaWVfQ29udGVudF9UeXBlX1NuaWZmZXInOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgaXRlbSBzb3VyY2VzLgoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9zb3VyY2VfY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkc291cmNlX2NsYXNzID0gJ1NpbXBsZVBpZV9Tb3VyY2UnOwoKCS8qKgoJICogQHZhciBtaXhlZCBTZXQgamF2YXNjcmlwdCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyIChmYWxzZSwgb3IKCSAqIGFueXRoaW5nIHR5cGUtY2FzdCB0byBmYWxzZSwgZGlzYWJsZXMgdGhpcyBmZWF0dXJlKQoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9qYXZhc2NyaXB0KCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGphdmFzY3JpcHQgPSAnanMnOwoKCS8qKgoJICogQHZhciBpbnQgTWF4aW11bSBudW1iZXIgb2YgZmVlZHMgdG8gY2hlY2sgd2l0aCBhdXRvZGlzY292ZXJ5CgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X21heF9jaGVja2VkX2ZlZWRzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG1heF9jaGVja2VkX2ZlZWRzID0gMTA7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBXZWItYWNjZXNzaWJsZSBwYXRoIHRvIHRoZSBoYW5kbGVyX2Zhdmljb24ucGhwIGZpbGUuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2Zhdmljb25faGFuZGxlcigpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmYXZpY29uX2hhbmRsZXIgPSAnJzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIFdlYi1hY2Nlc3NpYmxlIHBhdGggdG8gdGhlIGhhbmRsZXJfaW1hZ2UucGhwIGZpbGUuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2ltYWdlX2hhbmRsZXIoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkaW1hZ2VfaGFuZGxlciA9ICcnOwoKCS8qKgoJICogQHZhciBhcnJheSBTdG9yZXMgdGhlIFVSTHMgd2hlbiBtdWx0aXBsZSBmZWVkcyBhcmUgYmVpbmcgaW5pdGlhbGl6ZWQuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2ZlZWRfdXJsKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG11bHRpZmVlZF91cmwgPSBhcnJheSgpOwoKCS8qKgoJICogQHZhciBhcnJheSBTdG9yZXMgU2ltcGxlUGllIG9iamVjdHMgd2hlbiBtdWx0aXBsZSBmZWVkcyBpbml0aWFsaXplZC4KCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG11bHRpZmVlZF9vYmplY3RzID0gYXJyYXkoKTsKCgkvKioKCSAqIEB2YXIgYXJyYXkgU3RvcmVzIHRoZSBnZXRfb2JqZWN0X3ZhcnMoKSBhcnJheSBmb3IgdXNlIHdpdGggbXVsdGlmZWVkcy4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfZmVlZF91cmwoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkY29uZmlnX3NldHRpbmdzID0gbnVsbDsKCgkvKioKCSAqIEB2YXIgaW50ZWdlciBTdG9yZXMgdGhlIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4gcGVyLWZlZWQgd2l0aCBtdWx0aWZlZWRzLgoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9pdGVtX2xpbWl0KCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGl0ZW1fbGltaXQgPSAwOwoKCS8qKgoJICogQHZhciBhcnJheSBTdG9yZXMgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyB0byBiZSBzdHJpcHBlZCBieSBzdHJpcF9hdHRyaWJ1dGVzKCkuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c3RyaXBfYXR0cmlidXRlcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRzdHJpcF9hdHRyaWJ1dGVzID0gYXJyYXkoJ2Jnc291bmQnLCAnY2xhc3MnLCAnZXhwcicsICdpZCcsICdzdHlsZScsICdvbmNsaWNrJywgJ29uZXJyb3InLCAnb25maW5pc2gnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbmZvY3VzJywgJ29uYmx1cicsICdsb3dzcmMnLCAnZHluc3JjJyk7CgoJLyoqCgkgKiBAdmFyIGFycmF5IFN0b3JlcyB0aGUgZGVmYXVsdCB0YWdzIHRvIGJlIHN0cmlwcGVkIGJ5IHN0cmlwX2h0bWx0YWdzKCkuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c3RyaXBfaHRtbHRhZ3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkc3RyaXBfaHRtbHRhZ3MgPSBhcnJheSgnYmFzZScsICdibGluaycsICdib2R5JywgJ2RvY3R5cGUnLCAnZW1iZWQnLCAnZm9udCcsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2h0bWwnLCAnaWZyYW1lJywgJ2lucHV0JywgJ21hcnF1ZWUnLCAnbWV0YScsICdub3NjcmlwdCcsICdvYmplY3QnLCAncGFyYW0nLCAnc2NyaXB0JywgJ3N0eWxlJyk7CgoJLyoqCgkgKiBUaGUgU2ltcGxlUGllIGNsYXNzIGNvbnRhaW5zIGZlZWQgbGV2ZWwgZGF0YSBhbmQgb3B0aW9ucwoJICoKCSAqIFRoZXJlIGFyZSB0d28gd2F5cyB0aGF0IHlvdSBjYW4gY3JlYXRlIGEgbmV3IFNpbXBsZVBpZSBvYmplY3QuIFRoZSBmaXJzdAoJICogaXMgYnkgcGFzc2luZyBhIGZlZWQgVVJMIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBTaW1wbGVQaWUgY29uc3RydWN0b3IKCSAqIChhcyB3ZWxsIGFzIG9wdGlvbmFsbHkgc2V0dGluZyB0aGUgY2FjaGUgbG9jYXRpb24gYW5kIGNhY2hlIGV4cGlyeSkuIFRoaXMKCSAqIHdpbGwgaW5pdGlhbGlzZSB0aGUgd2hvbGUgZmVlZCB3aXRoIGFsbCBvZiB0aGUgZGVmYXVsdCBzZXR0aW5ncywgYW5kIHlvdQoJICogY2FuIGJlZ2luIGFjY2Vzc2luZyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGltbWVkaWF0ZWx5LgoJICoKCSAqIFRoZSBzZWNvbmQgd2F5IGlzIHRvIGNyZWF0ZSB0aGUgU2ltcGxlUGllIG9iamVjdCB3aXRoIG5vIHBhcmFtZXRlcnMKCSAqIGF0IGFsbC4gVGhpcyB3aWxsIGVuYWJsZSB5b3UgdG8gc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gQWZ0ZXIgc2V0dGluZwoJICogdGhlbSwgeW91IG11c3QgaW5pdGlhbGlzZSB0aGUgZmVlZCB1c2luZyAkZmVlZC0+aW5pdCgpLiBBdCB0aGF0IHBvaW50IHRoZQoJICogb2JqZWN0J3MgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB3aWxsIGJlIGF2YWlsYWJsZSB0byB5b3UuIFRoaXMgZm9ybWF0IGlzCgkgKiB3aGF0IGlzIHVzZWQgdGhyb3VnaG91dCB0aGlzIGRvY3VtZW50YXRpb24uCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzaW5jZSAxLjAgUHJldmlldyBSZWxlYXNlCgkgKiBAcGFyYW0gc3RyaW5nICRmZWVkX3VybCBUaGlzIGlzIHRoZSBVUkwgeW91IHdhbnQgdG8gcGFyc2UuCgkgKiBAcGFyYW0gc3RyaW5nICRjYWNoZV9sb2NhdGlvbiBUaGlzIGlzIHdoZXJlIHlvdSB3YW50IHRoZSBjYWNoZSB0byBiZSBzdG9yZWQuCgkgKiBAcGFyYW0gaW50ICRjYWNoZV9kdXJhdGlvbiBUaGlzIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHlvdSB3YW50IHRvIHN0b3JlIHRoZSBjYWNoZSBmaWxlIGZvci4KCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllKCRmZWVkX3VybCA9IG51bGwsICRjYWNoZV9sb2NhdGlvbiA9IG51bGwsICRjYWNoZV9kdXJhdGlvbiA9IG51bGwpCgl7CgkJLy8gT3RoZXIgb2JqZWN0cywgaW5zdGFuY2VzIGNyZWF0ZWQgaGVyZSBzbyB3ZSBjYW4gc2V0IG9wdGlvbnMgb24gdGhlbQoJCSR0aGlzLT5zYW5pdGl6ZSA9JiBuZXcgU2ltcGxlUGllX1Nhbml0aXplOwoKCQkvLyBTZXQgb3B0aW9ucyBpZiB0aGV5J3JlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IKCQlpZiAoJGNhY2hlX2xvY2F0aW9uICE9PSBudWxsKQoJCXsKCQkJJHRoaXMtPnNldF9jYWNoZV9sb2NhdGlvbigkY2FjaGVfbG9jYXRpb24pOwoJCX0KCgkJaWYgKCRjYWNoZV9kdXJhdGlvbiAhPT0gbnVsbCkKCQl7CgkJCSR0aGlzLT5zZXRfY2FjaGVfZHVyYXRpb24oJGNhY2hlX2R1cmF0aW9uKTsKCQl9CgoJCS8vIE9ubHkgaW5pdCB0aGUgc2NyaXB0IGlmIHdlJ3JlIHBhc3NlZCBhIGZlZWQgVVJMCgkJaWYgKCRmZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCSR0aGlzLT5zZXRfZmVlZF91cmwoJGZlZWRfdXJsKTsKCQkJJHRoaXMtPmluaXQoKTsKCQl9Cgl9CgoJLyoqCgkgKiBVc2VkIGZvciBjb252ZXJ0aW5nIG9iamVjdCB0byBhIHN0cmluZwoJICovCglmdW5jdGlvbiBfX3RvU3RyaW5nKCkKCXsKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcy0+ZGF0YSkpOwoJfQoKCS8qKgoJICogUmVtb3ZlIGl0ZW1zIHRoYXQgbGluayBiYWNrIHRvIHRoaXMgYmVmb3JlIGRlc3Ryb3lpbmcgdGhpcyBvYmplY3QKCSAqLwoJZnVuY3Rpb24gX19kZXN0cnVjdCgpCgl7CgkJaWYgKCFlbXB0eSgkdGhpcy0+ZGF0YVsnaXRlbXMnXSkpCgkJewoJCQlmb3JlYWNoICgkdGhpcy0+ZGF0YVsnaXRlbXMnXSBhcyAkaXRlbSkKCQkJewoJCQkJJGl0ZW0tPl9fZGVzdHJ1Y3QoKTsKCQkJfQoJCQl1bnNldCgkdGhpcy0+ZGF0YVsnaXRlbXMnXSk7CgkJfQoJCWlmICghZW1wdHkoJHRoaXMtPmRhdGFbJ29yZGVyZWRfaXRlbXMnXSkpCgkJewoJCQlmb3JlYWNoICgkdGhpcy0+ZGF0YVsnb3JkZXJlZF9pdGVtcyddIGFzICRpdGVtKQoJCQl7CgkJCQkkaXRlbS0+X19kZXN0cnVjdCgpOwoJCQl9CgkJCXVuc2V0KCR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ10pOwoJCX0KCX0KCgkvKioKCSAqIEZvcmNlIHRoZSBnaXZlbiBkYXRhL1VSTCB0byBiZSB0cmVhdGVkIGFzIGEgZmVlZCBubyBtYXR0ZXIgd2hhdCBpdAoJICogYXBwZWFycyBsaWtlCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzaW5jZSAxLjEKCSAqIEBwYXJhbSBib29sICRlbmFibGUgRm9yY2UgdGhlIGdpdmVuIGRhdGEvVVJMIHRvIGJlIHRyZWF0ZWQgYXMgYSBmZWVkCgkgKi8KCWZ1bmN0aW9uIGZvcmNlX2ZlZWQoJGVuYWJsZSA9IGZhbHNlKQoJewoJCSR0aGlzLT5mb3JjZV9mZWVkID0gKGJvb2wpICRlbmFibGU7Cgl9CgoJLyoqCgkgKiBUaGlzIGlzIHRoZSBVUkwgb2YgdGhlIGZlZWQgeW91IHdhbnQgdG8gcGFyc2UuCgkgKgoJICogVGhpcyBhbGxvd3MgeW91IHRvIGVudGVyIHRoZSBVUkwgb2YgdGhlIGZlZWQgeW91IHdhbnQgdG8gcGFyc2UsIG9yIHRoZQoJICogd2Vic2l0ZSB5b3Ugd2FudCB0byB0cnkgdG8gdXNlIGF1dG8tZGlzY292ZXJ5IG9uLiBUaGlzIHRha2VzIHByaW9yaXR5CgkgKiBvdmVyIGFueSBzZXQgcmF3IGRhdGEuCgkgKgoJICogWW91IGNhbiBzZXQgbXVsdGlwbGUgZmVlZHMgdG8gbWFzaCB0b2dldGhlciBieSBwYXNzaW5nIGFuIGFycmF5IGluc3RlYWQKCSAqIG9mIGEgc3RyaW5nIGZvciB0aGUgJHVybC4gUmVtZW1iZXIgdGhhdCB3aXRoIGVhY2ggYWRkaXRpb25hbCBmZWVkIGNvbWVzCgkgKiBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgYW5kIHJlc291cmNlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNpbmNlIDEuMCBQcmV2aWV3IFJlbGVhc2UKCSAqIEBwYXJhbSBtaXhlZCAkdXJsIFRoaXMgaXMgdGhlIFVSTCAob3IgYXJyYXkgb2YgVVJMcykgdGhhdCB5b3Ugd2FudCB0byBwYXJzZS4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfcmF3X2RhdGEoKQoJICovCglmdW5jdGlvbiBzZXRfZmVlZF91cmwoJHVybCkKCXsKCQlpZiAoaXNfYXJyYXkoJHVybCkpCgkJewoJCQkkdGhpcy0+bXVsdGlmZWVkX3VybCA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCR1cmwgYXMgJHZhbHVlKQoJCQl7CgkJCQkkdGhpcy0+bXVsdGlmZWVkX3VybFtdID0gU2ltcGxlUGllX01pc2M6OmZpeF9wcm90b2NvbCgkdmFsdWUsIDEpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5mZWVkX3VybCA9IFNpbXBsZVBpZV9NaXNjOjpmaXhfcHJvdG9jb2woJHVybCwgMSk7CgkJfQoJfQoKCS8qKgoJICogUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgU2ltcGxlUGllX0ZpbGUgdG8gdXNlIGFzIGEgZmVlZAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gb2JqZWN0ICYkZmlsZSBJbnN0YW5jZSBvZiBTaW1wbGVQaWVfRmlsZSAob3Igc3ViY2xhc3MpCgkgKiBAcmV0dXJuIGJvb2wgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCgkgKi8KCWZ1bmN0aW9uIHNldF9maWxlKCYkZmlsZSkKCXsKCQlpZiAoaXNfYSgkZmlsZSwgJ1NpbXBsZVBpZV9GaWxlJykpCgkJewoJCQkkdGhpcy0+ZmVlZF91cmwgPSAkZmlsZS0+dXJsOwoJCQkkdGhpcy0+ZmlsZSA9JiAkZmlsZTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gdXNlIGEgc3RyaW5nIG9mIFJTUy9BdG9tIGRhdGEgaW5zdGVhZCBvZiBhIHJlbW90ZSBmZWVkLgoJICoKCSAqIElmIHlvdSBoYXZlIGEgZmVlZCBhdmFpbGFibGUgYXMgYSBzdHJpbmcgaW4gUEhQLCB5b3UgY2FuIHRlbGwgU2ltcGxlUGllCgkgKiB0byBwYXJzZSB0aGF0IGRhdGEgc3RyaW5nIGluc3RlYWQgb2YgYSByZW1vdGUgZmVlZC4gQW55IHNldCBmZWVkIFVSTAoJICogdGFrZXMgcHJlY2VkZW5jZS4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNpbmNlIDEuMCBCZXRhIDMKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgUlNTIG9yIEF0b20gZGF0YSBhcyBhIHN0cmluZy4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfZmVlZF91cmwoKQoJICovCglmdW5jdGlvbiBzZXRfcmF3X2RhdGEoJGRhdGEpCgl7CgkJJHRoaXMtPnJhd19kYXRhID0gJGRhdGE7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIGZldGNoaW5nIHJlbW90ZSBmZWVkcy4KCSAqCgkgKiBUaGlzIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBtYXhpbXVtIHRpbWUgdGhlIGZlZWQncyBzZXJ2ZXIgdG8gcmVzcG9uZAoJICogYW5kIHNlbmQgdGhlIGZlZWQgYmFjay4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNpbmNlIDEuMCBCZXRhIDMKCSAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY29uZHMgdG8gc3BlbmQgd2FpdGluZyB0byByZXRyaWV2ZSBhIGZlZWQuCgkgKi8KCWZ1bmN0aW9uIHNldF90aW1lb3V0KCR0aW1lb3V0ID0gMTApCgl7CgkJJHRoaXMtPnRpbWVvdXQgPSAoaW50KSAkdGltZW91dDsKCX0KCgkvKioKCSAqIEZvcmNlcyBTaW1wbGVQaWUgdG8gdXNlIGZzb2Nrb3BlbigpIGluc3RlYWQgb2YgdGhlIHByZWZlcnJlZCBjVVJMCgkgKiBmdW5jdGlvbnMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzaW5jZSAxLjAgQmV0YSAzCgkgKiBAcGFyYW0gYm9vbCAkZW5hYmxlIEZvcmNlIGZzb2Nrb3BlbigpIHRvIGJlIHVzZWQKCSAqLwoJZnVuY3Rpb24gZm9yY2VfZnNvY2tvcGVuKCRlbmFibGUgPSBmYWxzZSkKCXsKCQkkdGhpcy0+Zm9yY2VfZnNvY2tvcGVuID0gKGJvb2wpICRlbmFibGU7Cgl9CgoJLyoqCgkgKiBPdXRwdXRzIHRoZSByYXcgWE1MIGNvbnRlbnQgb2YgdGhlIGZlZWQsIGFmdGVyIGl0IGhhcyBnb25lIHRocm91Z2gKCSAqIFNpbXBsZVBpZSdzIGZpbHRlcnMuCgkgKgoJICogVXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcsIHRoaXMgZnVuY3Rpb24gd2lsbCBvdXRwdXQgdGhlIFhNTCBjb250ZW50IGFzCgkgKiB0ZXh0L3htbC4gV2hlbiBTaW1wbGVQaWUgcmVhZHMgaW4gYSBmZWVkLCBpdCBkb2VzIGEgYml0IG9mIGNsZWFuaW5nIHVwCgkgKiBiZWZvcmUgdHJ5aW5nIHRvIHBhcnNlIGl0LiBNYW55IHBhcnRzIG9mIHRoZSBmZWVkIGFyZSByZS13cml0dGVuIGluCgkgKiBtZW1vcnksIGFuZCBpbiB0aGUgZW5kLCB5b3UgaGF2ZSBhIHBhcnNhYmxlIGZlZWQuIFhNTCBkdW1wIHNob3dzIHlvdSB0aGUKCSAqIGFjdHVhbCBYTUwgdGhhdCBTaW1wbGVQaWUgdHJpZXMgdG8gcGFyc2UsIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHZlcnkKCSAqIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBmZWVkLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2luY2UgMS4wIFByZXZpZXcgUmVsZWFzZQoJICogQHBhcmFtIGJvb2wgJGVuYWJsZSBFbmFibGUgWE1MIGR1bXAKCSAqLwoJZnVuY3Rpb24gZW5hYmxlX3htbF9kdW1wKCRlbmFibGUgPSBmYWxzZSkKCXsKCQkkdGhpcy0+eG1sX2R1bXAgPSAoYm9vbCkgJGVuYWJsZTsKCX0KCgkvKioKCSAqIEVuYWJsZXMvZGlzYWJsZXMgY2FjaGluZyBpbiBTaW1wbGVQaWUuCgkgKgoJICogVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBkaXNhYmxlIGNhY2hpbmcgYWxsLXRvZ2V0aGVyIGluIFNpbXBsZVBpZS4KCSAqIEhvd2V2ZXIsIGRpc2FibGluZyB0aGUgY2FjaGUgY2FuIGxlYWQgdG8gbG9uZ2VyIGxvYWQgdGltZXMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzaW5jZSAxLjAgUHJldmlldyBSZWxlYXNlCgkgKiBAcGFyYW0gYm9vbCAkZW5hYmxlIEVuYWJsZSBjYWNoaW5nCgkgKi8KCWZ1bmN0aW9uIGVuYWJsZV9jYWNoZSgkZW5hYmxlID0gdHJ1ZSkKCXsKCQkkdGhpcy0+Y2FjaGUgPSAoYm9vbCkgJGVuYWJsZTsKCX0KCgkvKioKCSAqIFNldCB0aGUgbGVuZ3RoIG9mIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgdGhlIGNvbnRlbnRzIG9mIGEgZmVlZAoJICogd2lsbCBiZSBjYWNoZWQuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBpbnQgJHNlY29uZHMgVGhlIGZlZWQgY29udGVudCBjYWNoZSBkdXJhdGlvbi4KCSAqLwoJZnVuY3Rpb24gc2V0X2NhY2hlX2R1cmF0aW9uKCRzZWNvbmRzID0gMzYwMCkKCXsKCQkkdGhpcy0+Y2FjaGVfZHVyYXRpb24gPSAoaW50KSAkc2Vjb25kczsKCX0KCgkvKioKCSAqIFNldCB0aGUgbGVuZ3RoIG9mIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgdGhlIGF1dG9kaXNjb3ZlcmVkIGZlZWQKCSAqIFVSTCB3aWxsIGJlIGNhY2hlZC4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludCAkc2Vjb25kcyBUaGUgYXV0b2Rpc2NvdmVyZWQgZmVlZCBVUkwgY2FjaGUgZHVyYXRpb24uCgkgKi8KCWZ1bmN0aW9uIHNldF9hdXRvZGlzY292ZXJ5X2NhY2hlX2R1cmF0aW9uKCRzZWNvbmRzID0gNjA0ODAwKQoJewoJCSR0aGlzLT5hdXRvZGlzY292ZXJ5X2NhY2hlX2R1cmF0aW9uID0gKGludCkgJHNlY29uZHM7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIHdoZXJlIHRoZSBjYWNoZWQgZmlsZXMgc2hvdWxkIGJlIHN0b3JlZC4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gVGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uLgoJICovCglmdW5jdGlvbiBzZXRfY2FjaGVfbG9jYXRpb24oJGxvY2F0aW9uID0gJy4vY2FjaGUnKQoJewoJCSR0aGlzLT5jYWNoZV9sb2NhdGlvbiA9IChzdHJpbmcpICRsb2NhdGlvbjsKCX0KCgkvKioKCSAqIERldGVybWluZXMgd2hldGhlciBmZWVkIGl0ZW1zIHNob3VsZCBiZSBzb3J0ZWQgaW50byByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBib29sICRlbmFibGUgU29ydCBhcyByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCgkgKi8KCWZ1bmN0aW9uIGVuYWJsZV9vcmRlcl9ieV9kYXRlKCRlbmFibGUgPSB0cnVlKQoJewoJCSR0aGlzLT5vcmRlcl9ieV9kYXRlID0gKGJvb2wpICRlbmFibGU7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgcmVwb3J0ZWQgYnkgdGhlIGZlZWQuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIENoYXJhY3RlciBlbmNvZGluZy4KCSAqLwoJZnVuY3Rpb24gc2V0X2lucHV0X2VuY29kaW5nKCRlbmNvZGluZyA9IGZhbHNlKQoJewoJCWlmICgkZW5jb2RpbmcpCgkJewoJCQkkdGhpcy0+aW5wdXRfZW5jb2RpbmcgPSAoc3RyaW5nKSAkZW5jb2Rpbmc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5pbnB1dF9lbmNvZGluZyA9IGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFNldCBob3cgbXVjaCBmZWVkIGF1dG9kaXNjb3ZlcnkgdG8gZG8KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNlZSBTSU1QTEVQSUVfTE9DQVRPUl9OT05FCgkgKiBAc2VlIFNJTVBMRVBJRV9MT0NBVE9SX0FVVE9ESVNDT1ZFUlkKCSAqIEBzZWUgU0lNUExFUElFX0xPQ0FUT1JfTE9DQUxfRVhURU5TSU9OCgkgKiBAc2VlIFNJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0JPRFkKCSAqIEBzZWUgU0lNUExFUElFX0xPQ0FUT1JfUkVNT1RFX0VYVEVOU0lPTgoJICogQHNlZSBTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfQk9EWQoJICogQHNlZSBTSU1QTEVQSUVfTE9DQVRPUl9BTEwKCSAqIEBwYXJhbSBpbnQgJGxldmVsIEZlZWQgQXV0b2Rpc2NvdmVyeSBMZXZlbCAobGV2ZWwgY2FuIGJlIGEKCSAqIGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSBjb25zdGFudHMsIHNlZSBiaXR3aXNlIE9SIG9wZXJhdG9yKQoJICovCglmdW5jdGlvbiBzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgkbGV2ZWwgPSBTSU1QTEVQSUVfTE9DQVRPUl9BTEwpCgl7CgkJJHRoaXMtPmF1dG9kaXNjb3ZlcnkgPSAoaW50KSAkbGV2ZWw7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIGNoYW5nZSB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgY2FjaGluZy4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfY2FjaGVfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9DYWNoZScpCgl7CgkJaWYgKFNpbXBsZVBpZV9NaXNjOjppc19zdWJjbGFzc19vZigkY2xhc3MsICdTaW1wbGVQaWVfQ2FjaGUnKSkKCQl7CgkJCSR0aGlzLT5jYWNoZV9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciBhdXRvLWRpc2NvdmVyeS4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfbG9jYXRvcl9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0xvY2F0b3InKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0xvY2F0b3InKSkKCQl7CgkJCSR0aGlzLT5sb2NhdG9yX2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIFhNTCBwYXJzaW5nLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9wYXJzZXJfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9QYXJzZXInKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX1BhcnNlcicpKQoJCXsKCQkJJHRoaXMtPnBhcnNlcl9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciByZW1vdGUgZmlsZSBmZXRjaGluZy4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfZmlsZV9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0ZpbGUnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0ZpbGUnKSkKCQl7CgkJCSR0aGlzLT5maWxlX2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGRhdGEgc2FuaXRpemF0aW9uLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9zYW5pdGl6ZV9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX1Nhbml0aXplJykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9TYW5pdGl6ZScpKQoJCXsKCQkJJHRoaXMtPnNhbml0aXplID0mIG5ldyAkY2xhc3M7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIGNoYW5nZSB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgaGFuZGxpbmcgZmVlZCBpdGVtcy4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfaXRlbV9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0l0ZW0nKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0l0ZW0nKSkKCQl7CgkJCSR0aGlzLT5pdGVtX2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGhhbmRsaW5nIGF1dGhvciBkYXRhLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9hdXRob3JfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9BdXRob3InKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0F1dGhvcicpKQoJCXsKCQkJJHRoaXMtPmF1dGhvcl9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciBoYW5kbGluZyBjYXRlZ29yeSBkYXRhLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9jYXRlZ29yeV9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0NhdGVnb3J5JykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9DYXRlZ29yeScpKQoJCXsKCQkJJHRoaXMtPmNhdGVnb3J5X2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGZlZWQgZW5jbG9zdXJlcy4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfZW5jbG9zdXJlX2NsYXNzKCRjbGFzcyA9ICdTaW1wbGVQaWVfRW5jbG9zdXJlJykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9FbmNsb3N1cmUnKSkKCQl7CgkJCSR0aGlzLT5lbmNsb3N1cmVfY2xhc3MgPSAkY2xhc3M7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIGNoYW5nZSB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgPG1lZGlhOnRleHQ+IGNhcHRpb25zCgkgKiBVc2VmdWwgd2hlbiB5b3UgYXJlIG92ZXJsb2FkaW5nIG9yIGV4dGVuZGluZyBTaW1wbGVQaWUncyBkZWZhdWx0IGNsYXNzZXMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIE5hbWUgb2YgY3VzdG9tIGNsYXNzLgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2tleXdvcmQuZXh0ZW5kcy5waHAgUEhQNCBleHRlbmRzIGRvY3VtZW50YXRpb24KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9sYW5ndWFnZS5vb3A1LmJhc2ljLnBocCNsYW5ndWFnZS5vb3A1LmJhc2ljLmV4dGVuZHMgUEhQNSBleHRlbmRzIGRvY3VtZW50YXRpb24KCSAqLwoJZnVuY3Rpb24gc2V0X2NhcHRpb25fY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9DYXB0aW9uJykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9DYXB0aW9uJykpCgkJewoJCQkkdGhpcy0+Y2FwdGlvbl9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciA8bWVkaWE6Y29weXJpZ2h0PgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9jb3B5cmlnaHRfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9Db3B5cmlnaHQnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0NvcHlyaWdodCcpKQoJCXsKCQkJJHRoaXMtPmNvcHlyaWdodF9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciA8bWVkaWE6Y3JlZGl0PgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9jcmVkaXRfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9DcmVkaXQnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0NyZWRpdCcpKQoJCXsKCQkJJHRoaXMtPmNyZWRpdF9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciA8bWVkaWE6cmF0aW5nPgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9yYXRpbmdfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9SYXRpbmcnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX1JhdGluZycpKQoJCXsKCQkJJHRoaXMtPnJhdGluZ19jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciA8bWVkaWE6cmVzdHJpY3Rpb24+CgkgKiBVc2VmdWwgd2hlbiB5b3UgYXJlIG92ZXJsb2FkaW5nIG9yIGV4dGVuZGluZyBTaW1wbGVQaWUncyBkZWZhdWx0IGNsYXNzZXMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIE5hbWUgb2YgY3VzdG9tIGNsYXNzLgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2tleXdvcmQuZXh0ZW5kcy5waHAgUEhQNCBleHRlbmRzIGRvY3VtZW50YXRpb24KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9sYW5ndWFnZS5vb3A1LmJhc2ljLnBocCNsYW5ndWFnZS5vb3A1LmJhc2ljLmV4dGVuZHMgUEhQNSBleHRlbmRzIGRvY3VtZW50YXRpb24KCSAqLwoJZnVuY3Rpb24gc2V0X3Jlc3RyaWN0aW9uX2NsYXNzKCRjbGFzcyA9ICdTaW1wbGVQaWVfUmVzdHJpY3Rpb24nKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX1Jlc3RyaWN0aW9uJykpCgkJewoJCQkkdGhpcy0+cmVzdHJpY3Rpb25fY2xhc3MgPSAkY2xhc3M7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIGNoYW5nZSB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgY29udGVudC10eXBlIHNuaWZmaW5nLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9jb250ZW50X3R5cGVfc25pZmZlcl9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0NvbnRlbnRfVHlwZV9TbmlmZmVyJykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9Db250ZW50X1R5cGVfU25pZmZlcicpKQoJCXsKCQkJJHRoaXMtPmNvbnRlbnRfdHlwZV9zbmlmZmVyX2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgaXRlbSBzb3VyY2VzLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9zb3VyY2VfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9Tb3VyY2UnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX1NvdXJjZScpKQoJCXsKCQkJJHRoaXMtPnNvdXJjZV9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdXNlciBhZ2VudCBzdHJpbmcuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJHVhIE5ldyB1c2VyIGFnZW50IHN0cmluZy4KCSAqLwoJZnVuY3Rpb24gc2V0X3VzZXJhZ2VudCgkdWEgPSBTSU1QTEVQSUVfVVNFUkFHRU5UKQoJewoJCSR0aGlzLT51c2VyYWdlbnQgPSAoc3RyaW5nKSAkdWE7Cgl9CgoJLyoqCgkgKiBTZXQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY3JlYXRlIGNhY2hlIGZpbGVuYW1lIHdpdGgKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIG1peGVkICRmdW5jdGlvbiBDYWxsYmFjayBmdW5jdGlvbgoJICovCglmdW5jdGlvbiBzZXRfY2FjaGVfbmFtZV9mdW5jdGlvbigkZnVuY3Rpb24gPSAnbWQ1JykKCXsKCQlpZiAoaXNfY2FsbGFibGUoJGZ1bmN0aW9uKSkKCQl7CgkJCSR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uID0gJGZ1bmN0aW9uOwoJCX0KCX0KCgkvKioKCSAqIFNldCBqYXZhc2NyaXB0IHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXIKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIG1peGVkICRnZXQgSmF2YXNjcmlwdCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyCgkgKi8KCWZ1bmN0aW9uIHNldF9qYXZhc2NyaXB0KCRnZXQgPSAnanMnKQoJewoJCWlmICgkZ2V0KQoJCXsKCQkJJHRoaXMtPmphdmFzY3JpcHQgPSAoc3RyaW5nKSAkZ2V0OwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+amF2YXNjcmlwdCA9IGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFNldCBvcHRpb25zIHRvIG1ha2UgU1AgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIEZvcmdvZXMgYQoJICogc3Vic3RhbnRpYWwgYW1vdW50IG9mIGRhdGEgc2FuaXRpemF0aW9uIGluIGZhdm9yIG9mIHNwZWVkLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gYm9vbCAkc2V0IFdoZXRoZXIgdG8gc2V0IHRoZW0gb3Igbm90CgkgKi8KCWZ1bmN0aW9uIHNldF9zdHVwaWRseV9mYXN0KCRzZXQgPSBmYWxzZSkKCXsKCQlpZiAoJHNldCkKCQl7CgkJCSR0aGlzLT5lbmFibGVfb3JkZXJfYnlfZGF0ZShmYWxzZSk7CgkJCSR0aGlzLT5yZW1vdmVfZGl2KGZhbHNlKTsKCQkJJHRoaXMtPnN0cmlwX2NvbW1lbnRzKGZhbHNlKTsKCQkJJHRoaXMtPnN0cmlwX2h0bWx0YWdzKGZhbHNlKTsKCQkJJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXMoZmFsc2UpOwoJCQkkdGhpcy0+c2V0X2ltYWdlX2hhbmRsZXIoZmFsc2UpOwoJCX0KCX0KCgkvKioKCSAqIFNldCBtYXhpbXVtIG51bWJlciBvZiBmZWVkcyB0byBjaGVjayB3aXRoIGF1dG9kaXNjb3ZlcnkKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludCAkbWF4IE1heGltdW0gbnVtYmVyIG9mIGZlZWRzIHRvIGNoZWNrCgkgKi8KCWZ1bmN0aW9uIHNldF9tYXhfY2hlY2tlZF9mZWVkcygkbWF4ID0gMTApCgl7CgkJJHRoaXMtPm1heF9jaGVja2VkX2ZlZWRzID0gKGludCkgJG1heDsKCX0KCglmdW5jdGlvbiByZW1vdmVfZGl2KCRlbmFibGUgPSB0cnVlKQoJewoJCSR0aGlzLT5zYW5pdGl6ZS0+cmVtb3ZlX2RpdigkZW5hYmxlKTsKCX0KCglmdW5jdGlvbiBzdHJpcF9odG1sdGFncygkdGFncyA9ICcnLCAkZW5jb2RlID0gbnVsbCkKCXsKCQlpZiAoJHRhZ3MgPT09ICcnKQoJCXsKCQkJJHRhZ3MgPSAkdGhpcy0+c3RyaXBfaHRtbHRhZ3M7CgkJfQoJCSR0aGlzLT5zYW5pdGl6ZS0+c3RyaXBfaHRtbHRhZ3MoJHRhZ3MpOwoJCWlmICgkZW5jb2RlICE9PSBudWxsKQoJCXsKCQkJJHRoaXMtPnNhbml0aXplLT5lbmNvZGVfaW5zdGVhZF9vZl9zdHJpcCgkdGFncyk7CgkJfQoJfQoKCWZ1bmN0aW9uIGVuY29kZV9pbnN0ZWFkX29mX3N0cmlwKCRlbmFibGUgPSB0cnVlKQoJewoJCSR0aGlzLT5zYW5pdGl6ZS0+ZW5jb2RlX2luc3RlYWRfb2Zfc3RyaXAoJGVuYWJsZSk7Cgl9CgoJZnVuY3Rpb24gc3RyaXBfYXR0cmlidXRlcygkYXR0cmlicyA9ICcnKQoJewoJCWlmICgkYXR0cmlicyA9PT0gJycpCgkJewoJCQkkYXR0cmlicyA9ICR0aGlzLT5zdHJpcF9hdHRyaWJ1dGVzOwoJCX0KCQkkdGhpcy0+c2FuaXRpemUtPnN0cmlwX2F0dHJpYnV0ZXMoJGF0dHJpYnMpOwoJfQoKCWZ1bmN0aW9uIHNldF9vdXRwdXRfZW5jb2RpbmcoJGVuY29kaW5nID0gJ1VURi04JykKCXsKCQkkdGhpcy0+c2FuaXRpemUtPnNldF9vdXRwdXRfZW5jb2RpbmcoJGVuY29kaW5nKTsKCX0KCglmdW5jdGlvbiBzdHJpcF9jb21tZW50cygkc3RyaXAgPSBmYWxzZSkKCXsKCQkkdGhpcy0+c2FuaXRpemUtPnN0cmlwX2NvbW1lbnRzKCRzdHJpcCk7Cgl9CgoJLyoqCgkgKiBTZXQgZWxlbWVudC9hdHRyaWJ1dGUga2V5L3ZhbHVlIHBhaXJzIG9mIEhUTUwgYXR0cmlidXRlcwoJICogY29udGFpbmluZyBVUkxzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgZmVlZAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2luY2UgMS4wCgkgKiBAcGFyYW0gYXJyYXkgJGVsZW1lbnRfYXR0cmlidXRlIEVsZW1lbnQvYXR0cmlidXRlIGtleS92YWx1ZSBwYWlycwoJICovCglmdW5jdGlvbiBzZXRfdXJsX3JlcGxhY2VtZW50cygkZWxlbWVudF9hdHRyaWJ1dGUgPSBhcnJheSgnYScgPT4gJ2hyZWYnLCAnYXJlYScgPT4gJ2hyZWYnLCAnYmxvY2txdW90ZScgPT4gJ2NpdGUnLCAnZGVsJyA9PiAnY2l0ZScsICdmb3JtJyA9PiAnYWN0aW9uJywgJ2ltZycgPT4gYXJyYXkoJ2xvbmdkZXNjJywgJ3NyYycpLCAnaW5wdXQnID0+ICdzcmMnLCAnaW5zJyA9PiAnY2l0ZScsICdxJyA9PiAnY2l0ZScpKQoJewoJCSR0aGlzLT5zYW5pdGl6ZS0+c2V0X3VybF9yZXBsYWNlbWVudHMoJGVsZW1lbnRfYXR0cmlidXRlKTsKCX0KCgkvKioKCSAqIFNldCB0aGUgaGFuZGxlciB0byBlbmFibGUgdGhlIGRpc3BsYXkgb2YgY2FjaGVkIGZhdmljb25zLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyICRwYWdlIFdlYi1hY2Nlc3NpYmxlIHBhdGggdG8gdGhlIGhhbmRsZXJfZmF2aWNvbi5waHAgZmlsZS4KCSAqIEBwYXJhbSBzdHIgJHFzIFRoZSBxdWVyeSBzdHJpbmcgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCB0by4KCSAqLwoJZnVuY3Rpb24gc2V0X2Zhdmljb25faGFuZGxlcigkcGFnZSA9IGZhbHNlLCAkcXMgPSAnaScpCgl7CgkJaWYgKCRwYWdlICE9IGZhbHNlKQoJCXsKCQkJJHRoaXMtPmZhdmljb25faGFuZGxlciA9ICRwYWdlIC4gJz8nIC4gJHFzIC4gJz0nOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+ZmF2aWNvbl9oYW5kbGVyID0gJyc7CgkJfQoJfQoKCS8qKgoJICogU2V0IHRoZSBoYW5kbGVyIHRvIGVuYWJsZSB0aGUgZGlzcGxheSBvZiBjYWNoZWQgaW1hZ2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyICRwYWdlIFdlYi1hY2Nlc3NpYmxlIHBhdGggdG8gdGhlIGhhbmRsZXJfaW1hZ2UucGhwIGZpbGUuCgkgKiBAcGFyYW0gc3RyICRxcyBUaGUgcXVlcnkgc3RyaW5nIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSBwYXNzZWQgdG8uCgkgKi8KCWZ1bmN0aW9uIHNldF9pbWFnZV9oYW5kbGVyKCRwYWdlID0gZmFsc2UsICRxcyA9ICdpJykKCXsKCQlpZiAoJHBhZ2UgIT0gZmFsc2UpCgkJewoJCQkkdGhpcy0+c2FuaXRpemUtPnNldF9pbWFnZV9oYW5kbGVyKCRwYWdlIC4gJz8nIC4gJHFzIC4gJz0nKTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmltYWdlX2hhbmRsZXIgPSAnJzsKCQl9Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGxpbWl0IGZvciBpdGVtcyByZXR1cm5lZCBwZXItZmVlZCB3aXRoIG11bHRpZmVlZHMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBpbnRlZ2VyICRsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuLgoJICovCglmdW5jdGlvbiBzZXRfaXRlbV9saW1pdCgkbGltaXQgPSAwKQoJewoJCSR0aGlzLT5pdGVtX2xpbWl0ID0gKGludCkgJGxpbWl0OwoJfQoKCWZ1bmN0aW9uIGluaXQoKQoJewoJCWlmICgoZnVuY3Rpb25fZXhpc3RzKCd2ZXJzaW9uX2NvbXBhcmUnKSAmJiB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc0LjMuMCcsICc8JykpIHx8ICFleHRlbnNpb25fbG9hZGVkKCd4bWwnKSB8fCAhZXh0ZW5zaW9uX2xvYWRlZCgncGNyZScpKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAoaXNzZXQoJF9HRVRbJHRoaXMtPmphdmFzY3JpcHRdKSkKCQl7CgkJCWlmIChmdW5jdGlvbl9leGlzdHMoJ29iX2d6aGFuZGxlcicpKQoJCQl7CgkJCQlvYl9zdGFydCgnb2JfZ3poYW5kbGVyJyk7CgkJCX0KCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IHRleHQvamF2YXNjcmlwdDsgY2hhcnNldDogVVRGLTgnKTsKCQkJaGVhZGVyKCdDYWNoZS1Db250cm9sOiBtdXN0LXJldmFsaWRhdGUnKTsKCQkJaGVhZGVyKCdFeHBpcmVzOiAnIC4gZ21kYXRlKCdELCBkIE0gWSBIOmk6cycsIHRpbWUoKSArIDYwNDgwMCkgLiAnIEdNVCcpOyAvLyA3IGRheXMKCQkJPz4KZnVuY3Rpb24gZW1iZWRfb2RlbyhsaW5rKSB7Cglkb2N1bWVudC53cml0ZWxuKCc8ZW1iZWQgc3JjPSJodHRwOi8vb2Rlby5jb20vZmxhc2gvYXVkaW9fcGxheWVyX2Z1bGxzaXplLnN3ZiIgcGx1Z2luc3BhZ2U9Imh0dHA6Ly93d3cubWFjcm9tZWRpYS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXIiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiBxdWFsaXR5PSJoaWdoIiB3aWR0aD0iNDQwIiBoZWlnaHQ9IjgwIiB3bW9kZT0idHJhbnNwYXJlbnQiIGFsbG93U2NyaXB0QWNjZXNzPSJhbnkiIGZsYXNodmFycz0idmFsaWRfc2FtcGxlX3JhdGU9dHJ1ZSZleHRlcm5hbF91cmw9JytsaW5rKyciPjwvZW1iZWQ+Jyk7Cn0KCmZ1bmN0aW9uIGVtYmVkX3F1aWNrdGltZSh0eXBlLCBiZ2NvbG9yLCB3aWR0aCwgaGVpZ2h0LCBsaW5rLCBwbGFjZWhvbGRlciwgbG9vcCkgewoJaWYgKHBsYWNlaG9sZGVyICE9ICcnKSB7CgkJZG9jdW1lbnQud3JpdGVsbignPGVtYmVkIHR5cGU9IicrdHlwZSsnIiBzdHlsZT0iY3Vyc29yOmhhbmQ7IGN1cnNvcjpwb2ludGVyOyIgaHJlZj0iJytsaW5rKyciIHNyYz0iJytwbGFjZWhvbGRlcisnIiB3aWR0aD0iJyt3aWR0aCsnIiBoZWlnaHQ9IicraGVpZ2h0KyciIGF1dG9wbGF5PSJmYWxzZSIgdGFyZ2V0PSJteXNlbGYiIGNvbnRyb2xsZXI9ImZhbHNlIiBsb29wPSInK2xvb3ArJyIgc2NhbGU9ImFzcGVjdCIgYmdjb2xvcj0iJytiZ2NvbG9yKyciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvZG93bmxvYWQvIj48L2VtYmVkPicpOwoJfQoJZWxzZSB7CgkJZG9jdW1lbnQud3JpdGVsbignPGVtYmVkIHR5cGU9IicrdHlwZSsnIiBzdHlsZT0iY3Vyc29yOmhhbmQ7IGN1cnNvcjpwb2ludGVyOyIgc3JjPSInK2xpbmsrJyIgd2lkdGg9Iicrd2lkdGgrJyIgaGVpZ2h0PSInK2hlaWdodCsnIiBhdXRvcGxheT0iZmFsc2UiIHRhcmdldD0ibXlzZWxmIiBjb250cm9sbGVyPSJ0cnVlIiBsb29wPSInK2xvb3ArJyIgc2NhbGU9ImFzcGVjdCIgYmdjb2xvcj0iJytiZ2NvbG9yKyciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvZG93bmxvYWQvIj48L2VtYmVkPicpOwoJfQp9CgpmdW5jdGlvbiBlbWJlZF9mbGFzaChiZ2NvbG9yLCB3aWR0aCwgaGVpZ2h0LCBsaW5rLCBsb29wLCB0eXBlKSB7Cglkb2N1bWVudC53cml0ZWxuKCc8ZW1iZWQgc3JjPSInK2xpbmsrJyIgcGx1Z2luc3BhZ2U9Imh0dHA6Ly93d3cubWFjcm9tZWRpYS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXIiIHR5cGU9IicrdHlwZSsnIiBxdWFsaXR5PSJoaWdoIiB3aWR0aD0iJyt3aWR0aCsnIiBoZWlnaHQ9IicraGVpZ2h0KyciIGJnY29sb3I9IicrYmdjb2xvcisnIiBsb29wPSInK2xvb3ArJyI+PC9lbWJlZD4nKTsKfQoKZnVuY3Rpb24gZW1iZWRfZmx2KHdpZHRoLCBoZWlnaHQsIGxpbmssIHBsYWNlaG9sZGVyLCBsb29wLCBwbGF5ZXIpIHsKCWRvY3VtZW50LndyaXRlbG4oJzxlbWJlZCBzcmM9IicrcGxheWVyKyciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyIiB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIgcXVhbGl0eT0iaGlnaCIgd2lkdGg9Iicrd2lkdGgrJyIgaGVpZ2h0PSInK2hlaWdodCsnIiB3bW9kZT0idHJhbnNwYXJlbnQiIGZsYXNodmFycz0iZmlsZT0nK2xpbmsrJyZhdXRvc3RhcnQ9ZmFsc2UmcmVwZWF0PScrbG9vcCsnJnNob3dkaWdpdHM9dHJ1ZSZzaG93ZnNidXR0b249ZmFsc2UiPjwvZW1iZWQ+Jyk7Cn0KCmZ1bmN0aW9uIGVtYmVkX3dtZWRpYSh3aWR0aCwgaGVpZ2h0LCBsaW5rKSB7Cglkb2N1bWVudC53cml0ZWxuKCc8ZW1iZWQgdHlwZT0iYXBwbGljYXRpb24veC1tcGxheWVyMiIgc3JjPSInK2xpbmsrJyIgYXV0b3NpemU9IjEiIHdpZHRoPSInK3dpZHRoKyciIGhlaWdodD0iJytoZWlnaHQrJyIgc2hvd2NvbnRyb2xzPSIxIiBzaG93c3RhdHVzYmFyPSIwIiBzaG93ZGlzcGxheT0iMCIgYXV0b3N0YXJ0PSIwIj48L2VtYmVkPicpOwp9CgkJCTw/cGhwCgkJCWV4aXQ7CgkJfQoKCQkvLyBQYXNzIHdoYXRldmVyIHdhcyBzZXQgd2l0aCBjb25maWcgb3B0aW9ucyBvdmVyIHRvIHRoZSBzYW5pdGl6ZXIuCgkJJHRoaXMtPnNhbml0aXplLT5wYXNzX2NhY2hlX2RhdGEoJHRoaXMtPmNhY2hlLCAkdGhpcy0+Y2FjaGVfbG9jYXRpb24sICR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkdGhpcy0+Y2FjaGVfY2xhc3MpOwoJCSR0aGlzLT5zYW5pdGl6ZS0+cGFzc19maWxlX2RhdGEoJHRoaXMtPmZpbGVfY2xhc3MsICR0aGlzLT50aW1lb3V0LCAkdGhpcy0+dXNlcmFnZW50LCAkdGhpcy0+Zm9yY2VfZnNvY2tvcGVuKTsKCgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCB8fCAkdGhpcy0+cmF3X2RhdGEgIT09IG51bGwpCgkJewoJCQkkdGhpcy0+ZGF0YSA9IGFycmF5KCk7CgkJCSR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0cyA9IGFycmF5KCk7CgkJCSRjYWNoZSA9IGZhbHNlOwoKCQkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQkJewoJCQkJJHBhcnNlZF9mZWVkX3VybCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJHRoaXMtPmZlZWRfdXJsKTsKCQkJCS8vIERlY2lkZSB3aGV0aGVyIHRvIGVuYWJsZSBjYWNoaW5nCgkJCQlpZiAoJHRoaXMtPmNhY2hlICYmICRwYXJzZWRfZmVlZF91cmxbJ3NjaGVtZSddICE9PSAnJykKCQkJCXsKCQkJCQkkY2FjaGUgPSBjYWxsX3VzZXJfZnVuYyhhcnJheSgkdGhpcy0+Y2FjaGVfY2xhc3MsICdjcmVhdGUnKSwgJHRoaXMtPmNhY2hlX2xvY2F0aW9uLCBjYWxsX3VzZXJfZnVuYygkdGhpcy0+Y2FjaGVfbmFtZV9mdW5jdGlvbiwgJHRoaXMtPmZlZWRfdXJsKSwgJ3NwYycpOwoJCQkJfQoJCQkJLy8gSWYgaXQncyBlbmFibGVkIGFuZCB3ZSBkb24ndCB3YW50IGFuIFhNTCBkdW1wLCB1c2UgdGhlIGNhY2hlCgkJCQlpZiAoJGNhY2hlICYmICEkdGhpcy0+eG1sX2R1bXApCgkJCQl7CgkJCQkJLy8gTG9hZCB0aGUgQ2FjaGUKCQkJCQkkdGhpcy0+ZGF0YSA9ICRjYWNoZS0+bG9hZCgpOwoJCQkJCWlmICghZW1wdHkoJHRoaXMtPmRhdGEpKQoJCQkJCXsKCQkJCQkJLy8gSWYgdGhlIGNhY2hlIGlzIGZvciBhbiBvdXRkYXRlZCBidWlsZCBvZiBTaW1wbGVQaWUKCQkJCQkJaWYgKCFpc3NldCgkdGhpcy0+ZGF0YVsnYnVpbGQnXSkgfHwgJHRoaXMtPmRhdGFbJ2J1aWxkJ10gIT0gU0lNUExFUElFX0JVSUxEKQoJCQkJCQl7CgkJCQkJCQkkY2FjaGUtPnVubGluaygpOwoJCQkJCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgpOwoJCQkJCQl9CgkJCQkJCS8vIElmIHdlJ3ZlIGhpdCBhIGNvbGxpc2lvbiBqdXN0IHJlcnVuIGl0IHdpdGggY2FjaGluZyBkaXNhYmxlZAoJCQkJCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5kYXRhWyd1cmwnXSkgJiYgJHRoaXMtPmRhdGFbJ3VybCddICE9ICR0aGlzLT5mZWVkX3VybCkKCQkJCQkJewoJCQkJCQkJJGNhY2hlID0gZmFsc2U7CgkJCQkJCQkkdGhpcy0+ZGF0YSA9IGFycmF5KCk7CgkJCQkJCX0KCQkJCQkJLy8gSWYgd2UndmUgZ290IGEgbm9uIGZlZWRfdXJsIHN0b3JlZCAoaWYgdGhlIHBhZ2UgaXNuJ3QgYWN0dWFsbHkgYSBmZWVkLCBvciBpcyBhIHJlZGlyZWN0KSB1c2UgdGhhdCBVUkwuCgkJCQkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2ZlZWRfdXJsJ10pKQoJCQkJCQl7CgkJCQkJCQkvLyBJZiB0aGUgYXV0b2Rpc2NvdmVyeSBjYWNoZSBpcyBzdGlsbCB2YWxpZCB1c2UgaXQuCgkJCQkJCQlpZiAoJGNhY2hlLT5tdGltZSgpICsgJHRoaXMtPmF1dG9kaXNjb3ZlcnlfY2FjaGVfZHVyYXRpb24gPiB0aW1lKCkpCgkJCQkJCQl7CgkJCQkJCQkJLy8gRG8gbm90IG5lZWQgdG8gZG8gZmVlZCBhdXRvZGlzY292ZXJ5IHlldC4KCQkJCQkJCQlpZiAoJHRoaXMtPmRhdGFbJ2ZlZWRfdXJsJ10gPT0gJHRoaXMtPmRhdGFbJ3VybCddKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhY2hlLT51bmxpbmsoKTsKCQkJCQkJCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkdGhpcy0+c2V0X2ZlZWRfdXJsKCR0aGlzLT5kYXRhWydmZWVkX3VybCddKTsKCQkJCQkJCQkJcmV0dXJuICR0aGlzLT5pbml0KCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCS8vIENoZWNrIGlmIHRoZSBjYWNoZSBoYXMgYmVlbiB1cGRhdGVkCgkJCQkJCWVsc2VpZiAoJGNhY2hlLT5tdGltZSgpICsgJHRoaXMtPmNhY2hlX2R1cmF0aW9uIDwgdGltZSgpKQoJCQkJCQl7CgkJCQkJCQkvLyBJZiB3ZSBoYXZlIGxhc3QtbW9kaWZpZWQgYW5kL29yIGV0YWcgc2V0CgkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnbGFzdC1tb2RpZmllZCddKSB8fCBpc3NldCgkdGhpcy0+ZGF0YVsnaGVhZGVycyddWydldGFnJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRoZWFkZXJzID0gYXJyYXkoKTsKCQkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnbGFzdC1tb2RpZmllZCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRoZWFkZXJzWydpZi1tb2RpZmllZC1zaW5jZSddID0gJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnbGFzdC1tb2RpZmllZCddOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnZXRhZyddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRoZWFkZXJzWydpZi1ub25lLW1hdGNoJ10gPSAnIicgLiAkdGhpcy0+ZGF0YVsnaGVhZGVycyddWydldGFnJ10gLiAnIic7CgkJCQkJCQkJfQoJCQkJCQkJCSRmaWxlID0mIG5ldyAkdGhpcy0+ZmlsZV9jbGFzcygkdGhpcy0+ZmVlZF91cmwsICR0aGlzLT50aW1lb3V0LzEwLCA1LCAkaGVhZGVycywgJHRoaXMtPnVzZXJhZ2VudCwgJHRoaXMtPmZvcmNlX2Zzb2Nrb3Blbik7CgkJCQkJCQkJaWYgKCRmaWxlLT5zdWNjZXNzKQoJCQkJCQkJCXsKCQkJCQkJCQkJaWYgKCRmaWxlLT5zdGF0dXNfY29kZSA9PSAzMDQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjYWNoZS0+dG91Y2goKTsKCQkJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGhlYWRlcnMgPSAkZmlsZS0+aGVhZGVyczsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQl1bnNldCgkZmlsZSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCS8vIElmIHRoZSBjYWNoZSBpcyBzdGlsbCB2YWxpZCwganVzdCByZXR1cm4gdHJ1ZQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCS8vIElmIHRoZSBjYWNoZSBpcyBlbXB0eSwgZGVsZXRlIGl0CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJGNhY2hlLT51bmxpbmsoKTsKCQkJCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgpOwoJCQkJCX0KCQkJCX0KCQkJCS8vIElmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSB0aGUgZmlsZSAoaXQnbGwgb25seSBleGlzdCBpZiB3ZSd2ZSBvcGVuZWQgaXQgdG8gY2hlY2sgaWYgdGhlIGNhY2hlIGhhcyBiZWVuIG1vZGlmaWVkKSwgb3BlbiBpdC4KCQkJCWlmICghaXNzZXQoJGZpbGUpKQoJCQkJewoJCQkJCWlmIChpc19hKCR0aGlzLT5maWxlLCAnU2ltcGxlUGllX0ZpbGUnKSAmJiAkdGhpcy0+ZmlsZS0+dXJsID09ICR0aGlzLT5mZWVkX3VybCkKCQkJCQl7CgkJCQkJCSRmaWxlID0mICR0aGlzLT5maWxlOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkZmlsZSA9JiBuZXcgJHRoaXMtPmZpbGVfY2xhc3MoJHRoaXMtPmZlZWRfdXJsLCAkdGhpcy0+dGltZW91dCwgNSwgbnVsbCwgJHRoaXMtPnVzZXJhZ2VudCwgJHRoaXMtPmZvcmNlX2Zzb2Nrb3Blbik7CgkJCQkJfQoJCQkJfQoJCQkJLy8gSWYgdGhlIGZpbGUgY29ubmVjdGlvbiBoYXMgYW4gZXJyb3IsIHNldCBTaW1wbGVQaWU6OmVycm9yIHRvIHRoYXQgYW5kIHF1aXQKCQkJCWlmICghJGZpbGUtPnN1Y2Nlc3MpCgkJCQl7CgkJCQkJJHRoaXMtPmVycm9yID0gJGZpbGUtPmVycm9yOwoJCQkJCWlmICghZW1wdHkoJHRoaXMtPmRhdGEpKQoJCQkJCXsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCEkdGhpcy0+Zm9yY2VfZmVlZCkKCQkJCXsKCQkJCQkvLyBDaGVjayBpZiB0aGUgc3VwcGxpZWQgVVJMIGlzIGEgZmVlZCwgaWYgaXQgaXNuJ3QsIGxvb2sgZm9yIGl0LgoJCQkJCSRsb2NhdGUgPSYgbmV3ICR0aGlzLT5sb2NhdG9yX2NsYXNzKCRmaWxlLCAkdGhpcy0+dGltZW91dCwgJHRoaXMtPnVzZXJhZ2VudCwgJHRoaXMtPmZpbGVfY2xhc3MsICR0aGlzLT5tYXhfY2hlY2tlZF9mZWVkcywgJHRoaXMtPmNvbnRlbnRfdHlwZV9zbmlmZmVyX2NsYXNzKTsKCQkJCQlpZiAoISRsb2NhdGUtPmlzX2ZlZWQoJGZpbGUpKQoJCQkJCXsKCQkJCQkJLy8gV2UgbmVlZCB0byB1bnNldCB0aGlzIHNvIHRoYXQgaWYgU2ltcGxlUGllOjpzZXRfZmlsZSgpIGhhcyBiZWVuIGNhbGxlZCB0aGF0IG9iamVjdCBpcyB1bnRvdWNoZWQKCQkJCQkJdW5zZXQoJGZpbGUpOwoJCQkJCQlpZiAoJGZpbGUgPSAkbG9jYXRlLT5maW5kKCR0aGlzLT5hdXRvZGlzY292ZXJ5KSkKCQkJCQkJewoJCQkJCQkJaWYgKCRjYWNoZSkKCQkJCQkJCXsKCQkJCQkJCQkkdGhpcy0+ZGF0YSA9IGFycmF5KCd1cmwnID0+ICR0aGlzLT5mZWVkX3VybCwgJ2ZlZWRfdXJsJyA9PiAkZmlsZS0+dXJsLCAnYnVpbGQnID0+IFNJTVBMRVBJRV9CVUlMRCk7CgkJCQkJCQkJaWYgKCEkY2FjaGUtPnNhdmUoJHRoaXMpKQoJCQkJCQkJCXsKCQkJCQkJCQkJdHJpZ2dlcl9lcnJvcigiJGNhY2hlLT5uYW1lIGlzIG5vdCB3cml0ZWFibGUiLCBFX1VTRVJfV0FSTklORyk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjYWNoZSA9IGNhbGxfdXNlcl9mdW5jKGFycmF5KCR0aGlzLT5jYWNoZV9jbGFzcywgJ2NyZWF0ZScpLCAkdGhpcy0+Y2FjaGVfbG9jYXRpb24sIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkZmlsZS0+dXJsKSwgJ3NwYycpOwoJCQkJCQkJfQoJCQkJCQkJJHRoaXMtPmZlZWRfdXJsID0gJGZpbGUtPnVybDsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSR0aGlzLT5lcnJvciA9ICJBIGZlZWQgY291bGQgbm90IGJlIGZvdW5kIGF0ICR0aGlzLT5mZWVkX3VybCI7CgkJCQkJCQlTaW1wbGVQaWVfTWlzYzo6ZXJyb3IoJHRoaXMtPmVycm9yLCBFX1VTRVJfTk9USUNFLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSRsb2NhdGUgPSBudWxsOwoJCQkJfQoKCQkJCSRoZWFkZXJzID0gJGZpbGUtPmhlYWRlcnM7CgkJCQkkZGF0YSA9ICRmaWxlLT5ib2R5OwoJCQkJJHNuaWZmZXIgPSBuZXcgJHRoaXMtPmNvbnRlbnRfdHlwZV9zbmlmZmVyX2NsYXNzKCRmaWxlKTsKCQkJCSRzbmlmZmVkID0gJHNuaWZmZXItPmdldF90eXBlKCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZGF0YSA9ICR0aGlzLT5yYXdfZGF0YTsKCQkJfQoKCQkJLy8gU2V0IHVwIGFycmF5IG9mIHBvc3NpYmxlIGVuY29kaW5ncwoJCQkkZW5jb2RpbmdzID0gYXJyYXkoKTsKCgkJCS8vIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBpbnB1dCBoYXMgYmVlbiBvdmVycmlkZGVuLgoJCQlpZiAoJHRoaXMtPmlucHV0X2VuY29kaW5nICE9PSBmYWxzZSkKCQkJewoJCQkJJGVuY29kaW5nc1tdID0gJHRoaXMtPmlucHV0X2VuY29kaW5nOwoJCQl9CgoJCQkkYXBwbGljYXRpb25fdHlwZXMgPSBhcnJheSgnYXBwbGljYXRpb24veG1sJywgJ2FwcGxpY2F0aW9uL3htbC1kdGQnLCAnYXBwbGljYXRpb24veG1sLWV4dGVybmFsLXBhcnNlZC1lbnRpdHknKTsKCQkJJHRleHRfdHlwZXMgPSBhcnJheSgndGV4dC94bWwnLCAndGV4dC94bWwtZXh0ZXJuYWwtcGFyc2VkLWVudGl0eScpOwoKCQkJLy8gUkZDIDMwMjMgKG9ubHkgYXBwbGllcyB0byBzbmlmZmVkIGNvbnRlbnQpCgkJCWlmIChpc3NldCgkc25pZmZlZCkpCgkJCXsKCQkJCWlmIChpbl9hcnJheSgkc25pZmZlZCwgJGFwcGxpY2F0aW9uX3R5cGVzKSB8fCBzdWJzdHIoJHNuaWZmZWQsIDAsIDEyKSA9PT0gJ2FwcGxpY2F0aW9uLycgJiYgc3Vic3RyKCRzbmlmZmVkLCAtNCkgPT09ICcreG1sJykKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSAmJiBwcmVnX21hdGNoKCcvO1x4MjA/Y2hhcnNldD0oW147XSopL2knLCAkaGVhZGVyc1snY29udGVudC10eXBlJ10sICRjaGFyc2V0KSkKCQkJCQl7CgkJCQkJCSRlbmNvZGluZ3NbXSA9IHN0cnRvdXBwZXIoJGNoYXJzZXRbMV0pOwoJCQkJCX0KCQkJCQkkZW5jb2RpbmdzID0gYXJyYXlfbWVyZ2UoJGVuY29kaW5ncywgU2ltcGxlUGllX01pc2M6OnhtbF9lbmNvZGluZygkZGF0YSkpOwoJCQkJCSRlbmNvZGluZ3NbXSA9ICdVVEYtOCc7CgkJCQl9CgkJCQllbHNlaWYgKGluX2FycmF5KCRzbmlmZmVkLCAkdGV4dF90eXBlcykgfHwgc3Vic3RyKCRzbmlmZmVkLCAwLCA1KSA9PT0gJ3RleHQvJyAmJiBzdWJzdHIoJHNuaWZmZWQsIC00KSA9PT0gJyt4bWwnKQoJCQkJewoJCQkJCWlmIChpc3NldCgkaGVhZGVyc1snY29udGVudC10eXBlJ10pICYmIHByZWdfbWF0Y2goJy87XHgyMD9jaGFyc2V0PShbXjtdKikvaScsICRoZWFkZXJzWydjb250ZW50LXR5cGUnXSwgJGNoYXJzZXQpKQoJCQkJCXsKCQkJCQkJJGVuY29kaW5nc1tdID0gJGNoYXJzZXRbMV07CgkJCQkJfQoJCQkJCSRlbmNvZGluZ3NbXSA9ICdVUy1BU0NJSSc7CgkJCQl9CgkJCQkvLyBUZXh0IE1JTUUtdHlwZSBkZWZhdWx0CgkJCQllbHNlaWYgKHN1YnN0cigkc25pZmZlZCwgMCwgNSkgPT09ICd0ZXh0LycpCgkJCQl7CgkJCQkJJGVuY29kaW5nc1tdID0gJ1VTLUFTQ0lJJzsKCQkJCX0KCQkJfQoKCQkJLy8gRmFsbGJhY2sgdG8gWE1MIDEuMCBBcHBlbmRpeCBGLjEvVVRGLTgvSVNPLTg4NTktMQoJCQkkZW5jb2RpbmdzID0gYXJyYXlfbWVyZ2UoJGVuY29kaW5ncywgU2ltcGxlUGllX01pc2M6OnhtbF9lbmNvZGluZygkZGF0YSkpOwoJCQkkZW5jb2RpbmdzW10gPSAnVVRGLTgnOwoJCQkkZW5jb2RpbmdzW10gPSAnSVNPLTg4NTktMSc7CgoJCQkvLyBUaGVyZSdzIG5vIHBvaW50IGluIHRyeWluZyBhbiBlbmNvZGluZyB0d2ljZQoJCQkkZW5jb2RpbmdzID0gYXJyYXlfdW5pcXVlKCRlbmNvZGluZ3MpOwoKCQkJLy8gSWYgd2Ugd2FudCB0aGUgWE1MLCBqdXN0IG91dHB1dCB0aGF0IHdpdGggdGhlIG1vc3QgbGlrZWx5IGVuY29kaW5nIGFuZCBxdWl0CgkJCWlmICgkdGhpcy0+eG1sX2R1bXApCgkJCXsKCQkJCWhlYWRlcignQ29udGVudC10eXBlOiB0ZXh0L3htbDsgY2hhcnNldD0nIC4gJGVuY29kaW5nc1swXSk7CgkJCQllY2hvICRkYXRhOwoJCQkJZXhpdDsKCQkJfQoKCQkJLy8gTG9vcCB0aHJvdWdoIGVhY2ggcG9zc2libGUgZW5jb2RpbmcsIHRpbGwgd2UgcmV0dXJuIHNvbWV0aGluZywgb3IgcnVuIG91dCBvZiBwb3NzaWJpbGl0aWVzCgkJCWZvcmVhY2ggKCRlbmNvZGluZ3MgYXMgJGVuY29kaW5nKQoJCQl7CgkJCQkvLyBDaGFuZ2UgdGhlIGVuY29kaW5nIHRvIFVURi04IChhcyB3ZSBhbHdheXMgdXNlIFVURi04IGludGVybmFsbHkpCgkJCQlpZiAoJHV0ZjhfZGF0YSA9IFNpbXBsZVBpZV9NaXNjOjpjaGFuZ2VfZW5jb2RpbmcoJGRhdGEsICRlbmNvZGluZywgJ1VURi04JykpCgkJCQl7CgkJCQkJLy8gQ3JlYXRlIG5ldyBwYXJzZXIKCQkJCQkkcGFyc2VyID0mIG5ldyAkdGhpcy0+cGFyc2VyX2NsYXNzKCk7CgoJCQkJCS8vIElmIGl0J3MgcGFyc2VkIGZpbmUKCQkJCQlpZiAoJHBhcnNlci0+cGFyc2UoJHV0ZjhfZGF0YSwgJ1VURi04JykpCgkJCQkJewoJCQkJCQkkdGhpcy0+ZGF0YSA9ICRwYXJzZXItPmdldF9kYXRhKCk7CgkJCQkJCWlmICgkdGhpcy0+Z2V0X3R5cGUoKSAmIH5TSU1QTEVQSUVfVFlQRV9OT05FKQoJCQkJCQl7CgkJCQkJCQlpZiAoaXNzZXQoJGhlYWRlcnMpKQoJCQkJCQkJewoJCQkJCQkJCSR0aGlzLT5kYXRhWydoZWFkZXJzJ10gPSAkaGVhZGVyczsKCQkJCQkJCX0KCQkJCQkJCSR0aGlzLT5kYXRhWydidWlsZCddID0gU0lNUExFUElFX0JVSUxEOwoKCQkJCQkJCS8vIENhY2hlIHRoZSBmaWxlIGlmIGNhY2hpbmcgaXMgZW5hYmxlZAoJCQkJCQkJaWYgKCRjYWNoZSAmJiAhJGNhY2hlLT5zYXZlKCR0aGlzKSkKCQkJCQkJCXsKCQkJCQkJCQl0cmlnZ2VyX2Vycm9yKCIkY2FjaGUtPm5hbWUgaXMgbm90IHdyaXRlYWJsZSIsIEVfVVNFUl9XQVJOSU5HKTsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHRoaXMtPmVycm9yID0gIkEgZmVlZCBjb3VsZCBub3QgYmUgZm91bmQgYXQgJHRoaXMtPmZlZWRfdXJsIjsKCQkJCQkJCVNpbXBsZVBpZV9NaXNjOjplcnJvcigkdGhpcy0+ZXJyb3IsIEVfVVNFUl9OT1RJQ0UsIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJLy8gV2UgaGF2ZSBhbiBlcnJvciwganVzdCBzZXQgU2ltcGxlUGllOjplcnJvciB0byBpdCBhbmQgcXVpdAoJCQkkdGhpcy0+ZXJyb3IgPSBzcHJpbnRmKCdYTUwgZXJyb3I6ICVzIGF0IGxpbmUgJWQsIGNvbHVtbiAlZCcsICRwYXJzZXItPmdldF9lcnJvcl9zdHJpbmcoKSwgJHBhcnNlci0+Z2V0X2N1cnJlbnRfbGluZSgpLCAkcGFyc2VyLT5nZXRfY3VycmVudF9jb2x1bW4oKSk7CgkJCVNpbXBsZVBpZV9NaXNjOjplcnJvcigkdGhpcy0+ZXJyb3IsIEVfVVNFUl9OT1RJQ0UsIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZWxzZWlmICghZW1wdHkoJHRoaXMtPm11bHRpZmVlZF91cmwpKQoJCXsKCQkJJGkgPSAwOwoJCQkkc3VjY2VzcyA9IDA7CgkJCSR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0cyA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCR0aGlzLT5tdWx0aWZlZWRfdXJsIGFzICR1cmwpCgkJCXsKCQkJCWlmIChTSU1QTEVQSUVfUEhQNSkKCQkJCXsKCQkJCQkvLyBUaGlzIGtleXdvcmQgbmVlZHMgdG8gZGVmeSBjb2Rpbmcgc3RhbmRhcmRzIGZvciBQSFA0IGNvbXBhdGliaWxpdHkKCQkJCQkkdGhpcy0+bXVsdGlmZWVkX29iamVjdHNbJGldID0gY2xvbmUoJHRoaXMpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0c1skaV0gPSAkdGhpczsKCQkJCX0KCQkJCSR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0c1skaV0tPnNldF9mZWVkX3VybCgkdXJsKTsKCQkJCSRzdWNjZXNzIHw9ICR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0c1skaV0tPmluaXQoKTsKCQkJCSRpKys7CgkJCX0KCQkJcmV0dXJuIChib29sKSAkc3VjY2VzczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIG9jY3VyZWQgZXJyb3IKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHJldHVybiBzdHJpbmcgRXJyb3IgbWVzc2FnZQoJICovCglmdW5jdGlvbiBlcnJvcigpCgl7CgkJcmV0dXJuICR0aGlzLT5lcnJvcjsKCX0KCglmdW5jdGlvbiBnZXRfZW5jb2RpbmcoKQoJewoJCXJldHVybiAkdGhpcy0+c2FuaXRpemUtPm91dHB1dF9lbmNvZGluZzsKCX0KCglmdW5jdGlvbiBoYW5kbGVfY29udGVudF90eXBlKCRtaW1lID0gJ3RleHQvaHRtbCcpCgl7CgkJaWYgKCFoZWFkZXJzX3NlbnQoKSkKCQl7CgkJCSRoZWFkZXIgPSAiQ29udGVudC10eXBlOiAkbWltZTsiOwoJCQlpZiAoJHRoaXMtPmdldF9lbmNvZGluZygpKQoJCQl7CgkJCQkkaGVhZGVyIC49ICcgY2hhcnNldD0nIC4gJHRoaXMtPmdldF9lbmNvZGluZygpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJGhlYWRlciAuPSAnIGNoYXJzZXQ9VVRGLTgnOwoJCQl9CgkJCWhlYWRlcigkaGVhZGVyKTsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3R5cGUoKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ3R5cGUnXSkpCgkJewoJCQkkdGhpcy0+ZGF0YVsndHlwZSddID0gU0lNUExFUElFX1RZUEVfQUxMOwoJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZmVlZCddKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9BVE9NXzEwOwoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9BVE9NXzAzOwoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXSkpCgkJCXsKCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwXVsnY2hhbm5lbCddKQoJCQkJfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF1bJ2ltYWdlJ10pCgkJCQl8fCBpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwXVsnaXRlbSddKQoJCQkJfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF1bJ3RleHRpbnB1dCddKSkKCQkJCXsKCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18xMDsKCQkJCX0KCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MF1bJ2NoYW5uZWwnXSkKCQkJCXx8IGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwXVsnaW1hZ2UnXSkKCQkJCXx8IGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwXVsnaXRlbSddKQoJCQkJfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTBdWyd0ZXh0aW5wdXQnXSkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9SU1NfMDkwOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJyddWydyc3MnXSkpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTX0FMTDsKCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVsnJ11bJ3JzcyddWzBdWydhdHRyaWJzJ11bJyddWyd2ZXJzaW9uJ10pKQoJCQkJewoJCQkJCXN3aXRjaCAodHJpbSgkdGhpcy0+ZGF0YVsnY2hpbGQnXVsnJ11bJ3JzcyddWzBdWydhdHRyaWJzJ11bJyddWyd2ZXJzaW9uJ10pKQoJCQkJCXsKCQkJCQkJY2FzZSAnMC45MSc6CgkJCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18wOTE7CgkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJyddWydyc3MnXVswXVsnY2hpbGQnXVsnJ11bJ3NraXBob3VycyddWydob3VyJ11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJc3dpdGNoICh0cmltKCR0aGlzLT5kYXRhWydjaGlsZCddWycnXVsncnNzJ11bMF1bJ2NoaWxkJ11bJyddWydza2lwaG91cnMnXVsnaG91ciddWzBdWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJY2FzZSAnMCc6CgkJCQkJCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18wOTFfTkVUU0NBUEU7CgkJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJCWNhc2UgJzI0JzoKCQkJCQkJCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTXzA5MV9VU0VSTEFORDsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnMC45Mic6CgkJCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18wOTI7CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJzAuOTMnOgoJCQkJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9SU1NfMDkzOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICcwLjk0JzoKCQkJCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTXzA5NDsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnMi4wJzoKCQkJCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTXzIwOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSA9IFNJTVBMRVBJRV9UWVBFX05PTkU7CgkJCX0KCQl9CgkJcmV0dXJuICR0aGlzLT5kYXRhWyd0eXBlJ107Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIHRoZSBmYXZpY29uIG9mIHRoZSBmZWVkJ3Mgd2Vic2l0ZS4KCSAqCgkgKiBAdG9kbyBDYWNoZSBhdG9tOmljb24KCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2luY2UgMS4wCgkgKi8KCWZ1bmN0aW9uIGdldF9mYXZpY29uKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2ljb24nKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgoJHVybCA9ICR0aGlzLT5nZXRfbGluaygpKSAhPT0gbnVsbCAmJiBwcmVnX21hdGNoKCcvXmh0dHAocyk/OlwvXC8vaScsICR1cmwpKQoJCXsKCQkJJGZhdmljb24gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJy9mYXZpY29uLmljbycsICR1cmwpOwoKCQkJaWYgKCR0aGlzLT5jYWNoZSAmJiAkdGhpcy0+ZmF2aWNvbl9oYW5kbGVyKQoJCQl7CgkJCQkkZmF2aWNvbl9maWxlbmFtZSA9IGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkZmF2aWNvbik7CgkJCQkkY2FjaGUgPSBjYWxsX3VzZXJfZnVuYyhhcnJheSgkdGhpcy0+Y2FjaGVfY2xhc3MsICdjcmVhdGUnKSwgJHRoaXMtPmNhY2hlX2xvY2F0aW9uLCAkZmF2aWNvbl9maWxlbmFtZSwgJ3NwaScpOwoKCQkJCWlmICgkY2FjaGUtPmxvYWQoKSkKCQkJCXsKCQkJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5mYXZpY29uX2hhbmRsZXIgLiAkZmF2aWNvbl9maWxlbmFtZSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRmaWxlID0mIG5ldyAkdGhpcy0+ZmlsZV9jbGFzcygkZmF2aWNvbiwgJHRoaXMtPnRpbWVvdXQgLyAxMCwgNSwgYXJyYXkoJ1gtRk9SV0FSREVELUZPUicgPT4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pLCAkdGhpcy0+dXNlcmFnZW50LCAkdGhpcy0+Zm9yY2VfZnNvY2tvcGVuKTsKCgkJCQkJaWYgKCRmaWxlLT5zdWNjZXNzICYmICgkZmlsZS0+c3RhdHVzX2NvZGUgPT0gMjAwIHx8ICgkZmlsZS0+c3RhdHVzX2NvZGUgPiAyMDYgJiYgJGZpbGUtPnN0YXR1c19jb2RlIDwgMzAwKSkgJiYgc3RybGVuKCRmaWxlLT5ib2R5KSA+IDApCgkJCQkJewoJCQkJCQkkc25pZmZlciA9IG5ldyAkdGhpcy0+Y29udGVudF90eXBlX3NuaWZmZXJfY2xhc3MoJGZpbGUpOwoJCQkJCQlpZiAoc3Vic3RyKCRzbmlmZmVyLT5nZXRfdHlwZSgpLCAwLCA2KSA9PT0gJ2ltYWdlLycpCgkJCQkJCXsKCQkJCQkJCWlmICgkY2FjaGUtPnNhdmUoYXJyYXkoJ2hlYWRlcnMnID0+ICRmaWxlLT5oZWFkZXJzLCAnYm9keScgPT4gJGZpbGUtPmJvZHkpKSkKCQkJCQkJCXsKCQkJCQkJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5mYXZpY29uX2hhbmRsZXIgLiAkZmF2aWNvbl9maWxlbmFtZSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCXRyaWdnZXJfZXJyb3IoIiRjYWNoZS0+bmFtZSBpcyBub3Qgd3JpdGVhYmxlIiwgRV9VU0VSX1dBUk5JTkcpOwoJCQkJCQkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJGZhdmljb24sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJGZhdmljb24sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBAdG9kbyBJZiB3ZSBoYXZlIGEgcGVybSByZWRpcmVjdCB3ZSBzaG91bGQgcmV0dXJuIHRoZSBuZXcgVVJMCgkgKiBAdG9kbyBXaGVuIHdlIG1ha2UgdGhlIGFib3ZlIGNoYW5nZSwgbGV0J3Mgc3VwcG9ydCA8aXR1bmVzOm5ldy1mZWVkLXVybD4gYXMgd2VsbAoJICogQHRvZG8gQWxzbywgfGF0b206bGlua3xAcmVsPXNlbGYKCSAqLwoJZnVuY3Rpb24gc3Vic2NyaWJlX3VybCgpCgl7CgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmZlZWRfdXJsLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfZmVlZCgpCgl7CgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoU2ltcGxlUGllX01pc2M6OmZpeF9wcm90b2NvbCgkdGhpcy0+ZmVlZF91cmwsIDIpLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfb3V0bG9vaygpCgl7CgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAnb3V0bG9vaycgLiAkdGhpcy0+c2FuaXRpemUoU2ltcGxlUGllX01pc2M6OmZpeF9wcm90b2NvbCgkdGhpcy0+ZmVlZF91cmwsIDIpLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfcG9kY2FzdCgpCgl7CgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoU2ltcGxlUGllX01pc2M6OmZpeF9wcm90b2NvbCgkdGhpcy0+ZmVlZF91cmwsIDMpLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfaXR1bmVzKCkKCXsKCQlpZiAoJHRoaXMtPmZlZWRfdXJsICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZShTaW1wbGVQaWVfTWlzYzo6Zml4X3Byb3RvY29sKCR0aGlzLT5mZWVkX3VybCwgNCksIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogQ3JlYXRlcyB0aGUgc3Vic2NyaWJlXyogbWV0aG9kcycgcmV0dXJuIGRhdGEKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJGZlZWRfdXJsIFN0cmluZyB0byBwcmVmaXggdG8gdGhlIGZlZWQgVVJMCgkgKiBAcGFyYW0gc3RyaW5nICRzaXRlX3VybCBTdHJpbmcgdG8gcHJlZml4IHRvIHRoZSBzaXRlIFVSTCAoYW5kCgkgKiBzdWZmaXggdG8gdGhlIGZlZWQgVVJMKQoJICogQHJldHVybiBtaXhlZCBVUkwgaWYgZmVlZCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZQoJICovCglmdW5jdGlvbiBzdWJzY3JpYmVfc2VydmljZSgkZmVlZF91cmwsICRzaXRlX3VybCA9IG51bGwpCgl7CgkJaWYgKCR0aGlzLT5zdWJzY3JpYmVfdXJsKCkpCgkJewoJCQkkcmV0dXJuID0gJHRoaXMtPnNhbml0aXplKCRmZWVkX3VybCwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpIC4gcmF3dXJsZW5jb2RlKCR0aGlzLT5mZWVkX3VybCk7CgkJCWlmICgkc2l0ZV91cmwgIT09IG51bGwgJiYgJHRoaXMtPmdldF9saW5rKCkgIT09IG51bGwpCgkJCXsKCQkJCSRyZXR1cm4gLj0gJHRoaXMtPnNhbml0aXplKCRzaXRlX3VybCwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpIC4gcmF3dXJsZW5jb2RlKCR0aGlzLT5nZXRfbGluaygpKTsKCQkJfQoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9hb2woKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly9mZWVkcy5teS5hb2wuY29tL2FkZC5qc3A/dXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9ibG9nbGluZXMoKQoJewoJCXJldHVybiB1cmxkZWNvZGUoJHRoaXMtPnN1YnNjcmliZV9zZXJ2aWNlKCdodHRwOi8vd3d3LmJsb2dsaW5lcy5jb20vc3ViLycpKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfZXNrb2JvKCkKCXsKCQlyZXR1cm4gJHRoaXMtPnN1YnNjcmliZV9zZXJ2aWNlKCdodHRwOi8vd3d3LmVza29iby5jb20vP0FkZFRvTXlQYWdlPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9mZWVkZmVlZHMoKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly93d3cuZmVlZGZlZWRzLmNvbS9hZGQ/ZmVlZD0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfZmVlZHN0ZXIoKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly93d3cuZmVlZHN0ZXIuY29tL215ZmVlZHN0ZXIucGhwP2FjdGlvbj1hZGRyc3MmY29uZmlybT1ubyZyc3N1cmw9Jyk7Cgl9CgoJZnVuY3Rpb24gc3Vic2NyaWJlX2dvb2dsZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL2Z1c2lvbi5nb29nbGUuY29tL2FkZD9mZWVkdXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9ncml0d2lyZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL215LmdyaXR3aXJlLmNvbS9mZWVkcy9hZGRFeHRlcm5hbEZlZWQuYXNweD9GZWVkVXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9tc24oKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly9teS5tc24uY29tL2FkZHRvbXltc24uYXJteD9pZD1yc3MmdXQ9JywgJyZydT0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfbmV0dmliZXMoKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly93d3cubmV0dmliZXMuY29tL3N1YnNjcmliZS5waHA/dXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9uZXdzYnVyc3QoKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly93d3cubmV3c2J1cnN0LmNvbS9Tb3VyY2UvP2FkZD0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfbmV3c2dhdG9yKCkKCXsKCQlyZXR1cm4gJHRoaXMtPnN1YnNjcmliZV9zZXJ2aWNlKCdodHRwOi8vd3d3Lm5ld3NnYXRvci5jb20vbmdzL3N1YnNjcmliZXIvc3ViZXh0LmFzcHg/dXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9vZGVvKCkKCXsKCQlyZXR1cm4gJHRoaXMtPnN1YnNjcmliZV9zZXJ2aWNlKCdodHRwOi8vd3d3Lm9kZW8uY29tL2xpc3Rlbi9zdWJzY3JpYmU/ZmVlZD0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfcG9kbm92YSgpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL3d3dy5wb2Rub3ZhLmNvbS9pbmRleF95b3VyX3BvZGNhc3RzLnNyZj9hY3Rpb249YWRkJnVybD0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfcm9qbygpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL3d3dy5yb2pvLmNvbS9hZGQtc3Vic2NyaXB0aW9uP3Jlc291cmNlPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV95YWhvbygpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL2FkZC5teS55YWhvby5jb20vcnNzP3VybD0nKTsKCX0KCglmdW5jdGlvbiBnZXRfZmVlZF90YWdzKCRuYW1lc3BhY2UsICR0YWcpCgl7CgkJJHR5cGUgPSAkdGhpcy0+Z2V0X3R5cGUoKTsKCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfVFlQRV9BVE9NXzEwKQoJCXsKCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2ZlZWQnXVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydmZWVkJ11bMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfQVRPTV8wMykKCQl7CgkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydmZWVkJ11bMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQl9CgkJfQoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU19SREYpCgkJewoJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQl9CgkJfQoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU19TWU5ESUNBVElPTikKCQl7CgkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVsnJ11bJ3JzcyddWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5kYXRhWydjaGlsZCddWycnXVsncnNzJ11bMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJZnVuY3Rpb24gZ2V0X2NoYW5uZWxfdGFncygkbmFtZXNwYWNlLCAkdGFnKQoJewoJCSR0eXBlID0gJHRoaXMtPmdldF90eXBlKCk7CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfQVRPTV9BTEwpCgkJewoJCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKCRuYW1lc3BhY2UsICR0YWcpKQoJCQl7CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfQoJCX0KCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfVFlQRV9SU1NfMTApCgkJewoJCQlpZiAoJGNoYW5uZWwgPSAkdGhpcy0+Z2V0X2ZlZWRfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2NoYW5uZWwnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRjaGFubmVsWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGNoYW5uZWxbMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCQl9CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfUlNTXzA5MCkKCQl7CgkJCWlmICgkY2hhbm5lbCA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ2NoYW5uZWwnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRjaGFubmVsWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGNoYW5uZWxbMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCQl9CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfUlNTX1NZTkRJQ0FUSU9OKQoJCXsKCQkJaWYgKCRjaGFubmVsID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoJycsICdjaGFubmVsJykpCgkJCXsKCQkJCWlmIChpc3NldCgkY2hhbm5lbFswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCQl7CgkJCQkJcmV0dXJuICRjaGFubmVsWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCWZ1bmN0aW9uIGdldF9pbWFnZV90YWdzKCRuYW1lc3BhY2UsICR0YWcpCgl7CgkJJHR5cGUgPSAkdGhpcy0+Z2V0X3R5cGUoKTsKCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfVFlQRV9SU1NfMTApCgkJewoJCQlpZiAoJGltYWdlID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdpbWFnZScpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQkJfQoJCQl9CgkJfQoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU18wOTApCgkJewoJCQlpZiAoJGltYWdlID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnaW1hZ2UnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRpbWFnZVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCQl7CgkJCQkJcmV0dXJuICRpbWFnZVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXTsKCQkJCX0KCQkJfQoJCX0KCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfVFlQRV9SU1NfU1lORElDQVRJT04pCgkJewoJCQlpZiAoJGltYWdlID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoJycsICdpbWFnZScpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCWZ1bmN0aW9uIGdldF9iYXNlKCRlbGVtZW50ID0gYXJyYXkoKSkKCXsKCQlpZiAoISgkdGhpcy0+Z2V0X3R5cGUoKSAmIFNJTVBMRVBJRV9UWVBFX1JTU19TWU5ESUNBVElPTikgJiYgIWVtcHR5KCRlbGVtZW50Wyd4bWxfYmFzZV9leHBsaWNpdCddKSAmJiBpc3NldCgkZWxlbWVudFsneG1sX2Jhc2UnXSkpCgkJewoJCQlyZXR1cm4gJGVsZW1lbnRbJ3htbF9iYXNlJ107CgkJfQoJCWVsc2VpZiAoJHRoaXMtPmdldF9saW5rKCkgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmdldF9saW5rKCk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3VybCgpOwoJCX0KCX0KCglmdW5jdGlvbiBzYW5pdGl6ZSgkZGF0YSwgJHR5cGUsICRiYXNlID0gJycpCgl7CgkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZS0+c2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X3RpdGxlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU2ltcGxlUGllX01pc2M6OmF0b21fMTBfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8wM19jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoJycsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jYXRlZ29yeSgka2V5ID0gMCkKCXsKCQkkY2F0ZWdvcmllcyA9ICR0aGlzLT5nZXRfY2F0ZWdvcmllcygpOwoJCWlmIChpc3NldCgkY2F0ZWdvcmllc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhdGVnb3JpZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY2F0ZWdvcmllcygpCgl7CgkJJGNhdGVnb3JpZXMgPSBhcnJheSgpOwoKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2NhdGVnb3J5JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJHRlcm0gPSBudWxsOwoJCQkkc2NoZW1lID0gbnVsbDsKCQkJJGxhYmVsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGVybSddKSkKCQkJewoJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWyd0ZXJtJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQl7CgkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCXsKCQkJCSRsYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmNhdGVnb3J5X2NsYXNzKCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKCcnLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkY2F0ZWdvcmllc1tdID0mIG5ldyAkdGhpcy0+Y2F0ZWdvcnlfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAnc3ViamVjdCcpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5jYXRlZ29yeV9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdzdWJqZWN0JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmNhdGVnb3J5X2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoKCQlpZiAoIWVtcHR5KCRjYXRlZ29yaWVzKSkKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXRlZ29yaWVzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9hdXRob3IoJGtleSA9IDApCgl7CgkJJGF1dGhvcnMgPSAkdGhpcy0+Z2V0X2F1dGhvcnMoKTsKCQlpZiAoaXNzZXQoJGF1dGhvcnNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRhdXRob3JzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2F1dGhvcnMoKQoJewoJCSRhdXRob3JzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2F1dGhvcicpIGFzICRhdXRob3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmkgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmkgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+YXV0aG9yX2NsYXNzKCRuYW1lLCAkdXJpLCAkZW1haWwpOwoJCQl9CgkJfQoJCWlmICgkYXV0aG9yID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnYXV0aG9yJykpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmwgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJsICE9PSBudWxsKQoJCQl7CgkJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+YXV0aG9yX2NsYXNzKCRuYW1lLCAkdXJsLCAkZW1haWwpOwoJCQl9CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2NyZWF0b3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPmF1dGhvcl9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnY3JlYXRvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+YXV0aG9yX2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTLCAnYXV0aG9yJykgYXMgJGF1dGhvcikKCQl7CgkJCSRhdXRob3JzW10gPSYgbmV3ICR0aGlzLT5hdXRob3JfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoKCQlpZiAoIWVtcHR5KCRhdXRob3JzKSkKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRhdXRob3JzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jb250cmlidXRvcigka2V5ID0gMCkKCXsKCQkkY29udHJpYnV0b3JzID0gJHRoaXMtPmdldF9jb250cmlidXRvcnMoKTsKCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNvbnRyaWJ1dG9yc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jb250cmlidXRvcnMoKQoJewoJCSRjb250cmlidXRvcnMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnY29udHJpYnV0b3InKSBhcyAkY29udHJpYnV0b3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmkgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmkgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmkgIT09IG51bGwpCgkJCXsKCQkJCSRjb250cmlidXRvcnNbXSA9JiBuZXcgJHRoaXMtPmF1dGhvcl9jbGFzcygkbmFtZSwgJHVyaSwgJGVtYWlsKTsKCQkJfQoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NvbnRyaWJ1dG9yJykgYXMgJGNvbnRyaWJ1dG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJsID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJsICE9PSBudWxsKQoJCQl7CgkJCQkkY29udHJpYnV0b3JzW10gPSYgbmV3ICR0aGlzLT5hdXRob3JfY2xhc3MoJG5hbWUsICR1cmwsICRlbWFpbCk7CgkJCX0KCQl9CgoJCWlmICghZW1wdHkoJGNvbnRyaWJ1dG9ycykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY29udHJpYnV0b3JzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9saW5rKCRrZXkgPSAwLCAkcmVsID0gJ2FsdGVybmF0ZScpCgl7CgkJJGxpbmtzID0gJHRoaXMtPmdldF9saW5rcygkcmVsKTsKCQlpZiAoaXNzZXQoJGxpbmtzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkbGlua3NbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEFkZGVkIGZvciBwYXJpdHkgYmV0d2VlbiB0aGUgcGFyZW50LWxldmVsIGFuZCB0aGUgaXRlbS9lbnRyeS1sZXZlbC4KCSAqLwoJZnVuY3Rpb24gZ2V0X3Blcm1hbGluaygpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRfbGluaygwKTsKCX0KCglmdW5jdGlvbiBnZXRfbGlua3MoJHJlbCA9ICdhbHRlcm5hdGUnKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ10pKQoJCXsKCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ10gPSBhcnJheSgpOwoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnbGluaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pKQoJCQkJCXsKCQkJCQkJJGxpbmtfcmVsID0gKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSkpID8gJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddIDogJ2FsdGVybmF0ZSc7CgkJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRsaW5rX3JlbF1bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmICgkbGlua3MgPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdsaW5rJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSkpCgkJCQkJewoJCQkJCQkkbGlua19yZWwgPSAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddKSkgPyAkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10gOiAnYWx0ZXJuYXRlJzsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGxpbmtfcmVsXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmspKTsKCgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmICgkbGlua3MgPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKCcnLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoKCQkJJGtleXMgPSBhcnJheV9rZXlzKCR0aGlzLT5kYXRhWydsaW5rcyddKTsKCQkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkKCQkJewoJCQkJaWYgKFNpbXBsZVBpZV9NaXNjOjppc19pc2VnbWVudF9uel9uYygka2V5KSkKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSkpCgkJCQkJewoJCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0sICR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0pOwoJCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldID0mICR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2VpZiAoc3Vic3RyKCRrZXksIDAsIDQxKSA9PSBTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSkKCQkJCXsKCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVtzdWJzdHIoJGtleSwgNDEpXSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XTsKCQkJCX0KCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldID0gYXJyYXlfdW5pcXVlKCR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldKTsKCQkJfQoJCX0KCgkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddWyRyZWxdKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZGF0YVsnbGlua3MnXVskcmVsXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9kZXNjcmlwdGlvbigpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdzdWJ0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzEwX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ3RhZ2xpbmUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8wM19jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoJycsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdzdW1tYXJ5JykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ3N1YnRpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvcHlyaWdodCgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdjb3B5cmlnaHQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8wM19jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncygnJywgJ2NvcHlyaWdodCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAncmlnaHRzJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9sYW5ndWFnZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncygnJywgJ2xhbmd1YWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2xhbmd1YWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2xhbmd1YWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydmZWVkJ11bMF1bJ3htbF9sYW5nJ10pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydmZWVkJ11bMF1bJ3htbF9sYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddWzBdWyd4bWxfbGFuZyddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddWzBdWyd4bWxfbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ3htbF9sYW5nJ10pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWyd4bWxfbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydoZWFkZXJzJ11bJ2NvbnRlbnQtbGFuZ3VhZ2UnXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5kYXRhWydoZWFkZXJzJ11bJ2NvbnRlbnQtbGFuZ3VhZ2UnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9sYXRpdHVkZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1czQ19CQVNJQ19HRU8sICdsYXQnKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQl9CgkJZWxzZWlmICgoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfR0VPUlNTLCAncG9pbnQnKSkgJiYgcHJlZ19tYXRjaCgnL14oKD86LSk/WzAtOV0rKD86XC5bMC05XSspKSAoKD86LSk/WzAtOV0rKD86XC5bMC05XSspKSQvJywgJHJldHVyblswXVsnZGF0YSddLCAkbWF0Y2gpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJG1hdGNoWzFdOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xvbmdpdHVkZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1czQ19CQVNJQ19HRU8sICdsb25nJykpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkcmV0dXJuWzBdWydkYXRhJ107CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xvbicpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9HRU9SU1MsICdwb2ludCcpKSAmJiBwcmVnX21hdGNoKCcvXigoPzotKT9bMC05XSsoPzpcLlswLTldKykpICgoPzotKT9bMC05XSsoPzpcLlswLTldKykpJC8nLCAkcmV0dXJuWzBdWydkYXRhJ10sICRtYXRjaCkpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkbWF0Y2hbMl07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfaW1hZ2VfdGl0bGUoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pbWFnZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoJycsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9pbWFnZV91cmwoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdpbWFnZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydhdHRyaWJzJ11bJyddWydocmVmJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnbG9nbycpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdpY29uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ3VybCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAndXJsJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncygnJywgJ3VybCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2ltYWdlX2xpbmsoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pbWFnZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAnbGluaycpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnbGluaycpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoJycsICdsaW5rJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfaW1hZ2Vfd2lkdGgoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pbWFnZV90YWdzKCcnLCAnd2lkdGgnKSkKCQl7CgkJCXJldHVybiByb3VuZCgkcmV0dXJuWzBdWydkYXRhJ10pOwoJCX0KCQllbHNlaWYgKCR0aGlzLT5nZXRfdHlwZSgpICYgU0lNUExFUElFX1RZUEVfUlNTX1NZTkRJQ0FUSU9OICYmICR0aGlzLT5nZXRfaW1hZ2VfdGFncygnJywgJ3VybCcpKQoJCXsKCQkJcmV0dXJuIDg4LjA7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfaW1hZ2VfaGVpZ2h0KCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncygnJywgJ2hlaWdodCcpKQoJCXsKCQkJcmV0dXJuIHJvdW5kKCRyZXR1cm5bMF1bJ2RhdGEnXSk7CgkJfQoJCWVsc2VpZiAoJHRoaXMtPmdldF90eXBlKCkgJiBTSU1QTEVQSUVfVFlQRV9SU1NfU1lORElDQVRJT04gJiYgJHRoaXMtPmdldF9pbWFnZV90YWdzKCcnLCAndXJsJykpCgkJewoJCQlyZXR1cm4gMzEuMDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9pdGVtX3F1YW50aXR5KCRtYXggPSAwKQoJewoJCSRxdHkgPSBjb3VudCgkdGhpcy0+Z2V0X2l0ZW1zKCkpOwoJCWlmICgkbWF4ID09IDApCgkJewoJCQlyZXR1cm4gJHF0eTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICgkcXR5ID4gJG1heCkgPyAkbWF4IDogJHF0eTsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2l0ZW0oJGtleSA9IDApCgl7CgkJJGl0ZW1zID0gJHRoaXMtPmdldF9pdGVtcygpOwoJCWlmIChpc3NldCgkaXRlbXNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRpdGVtc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9pdGVtcygkc3RhcnQgPSAwLCAkZW5kID0gMCkKCXsKCQlpZiAoIWVtcHR5KCR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0cykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllOjptZXJnZV9pdGVtcygkdGhpcy0+bXVsdGlmZWVkX29iamVjdHMsICRzdGFydCwgJGVuZCwgJHRoaXMtPml0ZW1fbGltaXQpOwoJCX0KCQllbHNlaWYgKCFpc3NldCgkdGhpcy0+ZGF0YVsnaXRlbXMnXSkpCgkJewoJCQlpZiAoJGl0ZW1zID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnZW50cnknKSkKCQkJewoJCQkJJGtleXMgPSBhcnJheV9rZXlzKCRpdGVtcyk7CgkJCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhWydpdGVtcyddW10gPSYgbmV3ICR0aGlzLT5pdGVtX2NsYXNzKCR0aGlzLCAkaXRlbXNbJGtleV0pOwoJCQkJfQoJCQl9CgkJCWlmICgkaXRlbXMgPSAkdGhpcy0+Z2V0X2ZlZWRfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdlbnRyeScpKQoJCQl7CgkJCQkka2V5cyA9IGFycmF5X2tleXMoJGl0ZW1zKTsKCQkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2l0ZW1zJ11bXSA9JiBuZXcgJHRoaXMtPml0ZW1fY2xhc3MoJHRoaXMsICRpdGVtc1ska2V5XSk7CgkJCQl9CgkJCX0KCQkJaWYgKCRpdGVtcyA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAnaXRlbScpKQoJCQl7CgkJCQkka2V5cyA9IGFycmF5X2tleXMoJGl0ZW1zKTsKCQkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2l0ZW1zJ11bXSA9JiBuZXcgJHRoaXMtPml0ZW1fY2xhc3MoJHRoaXMsICRpdGVtc1ska2V5XSk7CgkJCQl9CgkJCX0KCQkJaWYgKCRpdGVtcyA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ2l0ZW0nKSkKCQkJewoJCQkJJGtleXMgPSBhcnJheV9rZXlzKCRpdGVtcyk7CgkJCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhWydpdGVtcyddW10gPSYgbmV3ICR0aGlzLT5pdGVtX2NsYXNzKCR0aGlzLCAkaXRlbXNbJGtleV0pOwoJCQkJfQoJCQl9CgkJCWlmICgkaXRlbXMgPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncygnJywgJ2l0ZW0nKSkKCQkJewoJCQkJJGtleXMgPSBhcnJheV9rZXlzKCRpdGVtcyk7CgkJCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhWydpdGVtcyddW10gPSYgbmV3ICR0aGlzLT5pdGVtX2NsYXNzKCR0aGlzLCAkaXRlbXNbJGtleV0pOwoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoIWVtcHR5KCR0aGlzLT5kYXRhWydpdGVtcyddKSkKCQl7CgkJCS8vIElmIHdlIHdhbnQgdG8gb3JkZXIgaXQgYnkgZGF0ZSwgY2hlY2sgaWYgYWxsIGl0ZW1zIGhhdmUgYSBkYXRlLCBhbmQgdGhlbiBzb3J0IGl0CgkJCWlmICgkdGhpcy0+b3JkZXJfYnlfZGF0ZSkKCQkJewoJCQkJaWYgKCFpc3NldCgkdGhpcy0+ZGF0YVsnb3JkZXJlZF9pdGVtcyddKSkKCQkJCXsKCQkJCQkkZG9fc29ydCA9IHRydWU7CgkJCQkJZm9yZWFjaCAoJHRoaXMtPmRhdGFbJ2l0ZW1zJ10gYXMgJGl0ZW0pCgkJCQkJewoJCQkJCQlpZiAoISRpdGVtLT5nZXRfZGF0ZSgnVScpKQoJCQkJCQl7CgkJCQkJCQkkZG9fc29ydCA9IGZhbHNlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJJGl0ZW0gPSBudWxsOwoJCQkJCSR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ10gPSAkdGhpcy0+ZGF0YVsnaXRlbXMnXTsKCQkJCQlpZiAoJGRvX3NvcnQpCgkJCQkJewoJCQkJCQl1c29ydCgkdGhpcy0+ZGF0YVsnb3JkZXJlZF9pdGVtcyddLCBhcnJheSgmJHRoaXMsICdzb3J0X2l0ZW1zJykpOwoJCQkJCX0KCQkJCX0KCQkJCSRpdGVtcyA9ICR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ107CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkaXRlbXMgPSAkdGhpcy0+ZGF0YVsnaXRlbXMnXTsKCQkJfQoKCQkJLy8gU2xpY2UgdGhlIGRhdGEgYXMgZGVzaXJlZAoJCQlpZiAoJGVuZCA9PSAwKQoJCQl7CgkJCQlyZXR1cm4gYXJyYXlfc2xpY2UoJGl0ZW1zLCAkc3RhcnQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIGFycmF5X3NsaWNlKCRpdGVtcywgJHN0YXJ0LCAkZW5kKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9Cgl9CgoJZnVuY3Rpb24gc29ydF9pdGVtcygkYSwgJGIpCgl7CgkJcmV0dXJuICRhLT5nZXRfZGF0ZSgnVScpIDw9ICRiLT5nZXRfZGF0ZSgnVScpOwoJfQoKCWZ1bmN0aW9uIG1lcmdlX2l0ZW1zKCR1cmxzLCAkc3RhcnQgPSAwLCAkZW5kID0gMCwgJGxpbWl0ID0gMCkKCXsKCQlpZiAoaXNfYXJyYXkoJHVybHMpICYmIHNpemVvZigkdXJscykgPiAwKQoJCXsKCQkJJGl0ZW1zID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJHVybHMgYXMgJGFyZykKCQkJewoJCQkJaWYgKGlzX2EoJGFyZywgJ1NpbXBsZVBpZScpKQoJCQkJewoJCQkJCSRpdGVtcyA9IGFycmF5X21lcmdlKCRpdGVtcywgJGFyZy0+Z2V0X2l0ZW1zKDAsICRsaW1pdCkpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXRyaWdnZXJfZXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIFNpbXBsZVBpZSBvYmplY3RzJywgRV9VU0VSX1dBUk5JTkcpOwoJCQkJfQoJCQl9CgoJCQkkZG9fc29ydCA9IHRydWU7CgkJCWZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkKCQkJewoJCQkJaWYgKCEkaXRlbS0+Z2V0X2RhdGUoJ1UnKSkKCQkJCXsKCQkJCQkkZG9fc29ydCA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCSRpdGVtID0gbnVsbDsKCQkJaWYgKCRkb19zb3J0KQoJCQl7CgkJCQl1c29ydCgkaXRlbXMsIGFycmF5KCdTaW1wbGVQaWUnLCAnc29ydF9pdGVtcycpKTsKCQkJfQoKCQkJaWYgKCRlbmQgPT0gMCkKCQkJewoJCQkJcmV0dXJuIGFycmF5X3NsaWNlKCRpdGVtcywgJHN0YXJ0KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBhcnJheV9zbGljZSgkaXRlbXMsICRzdGFydCwgJGVuZCk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJdHJpZ2dlcl9lcnJvcignQ2Fubm90IG1lcmdlIHplcm8gU2ltcGxlUGllIG9iamVjdHMnLCBFX1VTRVJfV0FSTklORyk7CgkJCXJldHVybiBhcnJheSgpOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0l0ZW0KewoJdmFyICRmZWVkOwoJdmFyICRkYXRhID0gYXJyYXkoKTsKCglmdW5jdGlvbiBTaW1wbGVQaWVfSXRlbSgkZmVlZCwgJGRhdGEpCgl7CgkJJHRoaXMtPmZlZWQgPSAkZmVlZDsKCQkkdGhpcy0+ZGF0YSA9ICRkYXRhOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzLT5kYXRhKSk7Cgl9CgoJLyoqCgkgKiBSZW1vdmUgaXRlbXMgdGhhdCBsaW5rIGJhY2sgdG8gdGhpcyBiZWZvcmUgZGVzdHJveWluZyB0aGlzIG9iamVjdAoJICovCglmdW5jdGlvbiBfX2Rlc3RydWN0KCkKCXsKCQl1bnNldCgkdGhpcy0+ZmVlZCk7Cgl9CgoJZnVuY3Rpb24gZ2V0X2l0ZW1fdGFncygkbmFtZXNwYWNlLCAkdGFnKQoJewoJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfYmFzZSgkZWxlbWVudCA9IGFycmF5KCkpCgl7CgkJcmV0dXJuICR0aGlzLT5mZWVkLT5nZXRfYmFzZSgkZWxlbWVudCk7Cgl9CgoJZnVuY3Rpb24gc2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSA9ICcnKQoJewoJCXJldHVybiAkdGhpcy0+ZmVlZC0+c2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X2ZlZWQoKQoJewoJCXJldHVybiAkdGhpcy0+ZmVlZDsKCX0KCglmdW5jdGlvbiBnZXRfaWQoJGhhc2ggPSBmYWxzZSkKCXsKCQlpZiAoISRoYXNoKQoJCXsKCQkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdpZCcpKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdpZCcpKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncygnJywgJ2d1aWQnKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2lkZW50aWZpZXInKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2lkZW50aWZpZXInKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZWlmICgoJHJldHVybiA9ICR0aGlzLT5nZXRfcGVybWFsaW5rKCkpICE9PSBudWxsKQoJCQl7CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfQoJCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF90aXRsZSgpKSAhPT0gbnVsbCkKCQkJewoJCQkJcmV0dXJuICRyZXR1cm47CgkJCX0KCQl9CgkJaWYgKCR0aGlzLT5nZXRfcGVybWFsaW5rKCkgIT09IG51bGwgfHwgJHRoaXMtPmdldF90aXRsZSgpICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuIG1kNSgkdGhpcy0+Z2V0X3Blcm1hbGluaygpIC4gJHRoaXMtPmdldF90aXRsZSgpKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMtPmRhdGEpKTsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3RpdGxlKCkKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWyd0aXRsZSddKSkKCQl7CgkJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAndGl0bGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3RpdGxlJ10gPSAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU2ltcGxlUGllX01pc2M6OmF0b21fMDNfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKCcnLCAndGl0bGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3RpdGxlJ10gPSAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX01BWUJFX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAndGl0bGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3RpdGxlJ10gPSAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3RpdGxlJ10gPSBudWxsOwoJCQl9CgkJfQoJCXJldHVybiAkdGhpcy0+ZGF0YVsndGl0bGUnXTsKCX0KCglmdW5jdGlvbiBnZXRfZGVzY3JpcHRpb24oJGRlc2NyaXB0aW9uX29ubHkgPSBmYWxzZSkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3N1bW1hcnknKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdzdW1tYXJ5JykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU2ltcGxlUGllX01pc2M6OmF0b21fMDNfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoJycsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdzdW1tYXJ5JykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ3N1YnRpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICghJGRlc2NyaXB0aW9uX29ubHkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmdldF9jb250ZW50KHRydWUpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRlbnQoJGNvbnRlbnRfb25seSA9IGZhbHNlKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnY29udGVudCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzEwX2NvbnRlbnRfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnY29udGVudCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzAzX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwX01PRFVMRVNfQ09OVEVOVCwgJ2VuY29kZWQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoISRjb250ZW50X29ubHkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmdldF9kZXNjcmlwdGlvbih0cnVlKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jYXRlZ29yeSgka2V5ID0gMCkKCXsKCQkkY2F0ZWdvcmllcyA9ICR0aGlzLT5nZXRfY2F0ZWdvcmllcygpOwoJCWlmIChpc3NldCgkY2F0ZWdvcmllc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhdGVnb3JpZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY2F0ZWdvcmllcygpCgl7CgkJJGNhdGVnb3JpZXMgPSBhcnJheSgpOwoKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2NhdGVnb3J5JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJHRlcm0gPSBudWxsOwoJCQkkc2NoZW1lID0gbnVsbDsKCQkJJGxhYmVsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGVybSddKSkKCQkJewoJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWyd0ZXJtJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQl7CgkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCXsKCQkJCSRsYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKCcnLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkY2F0ZWdvcmllc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y2F0ZWdvcnlfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAnc3ViamVjdCcpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdzdWJqZWN0JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoKCQlpZiAoIWVtcHR5KCRjYXRlZ29yaWVzKSkKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXRlZ29yaWVzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9hdXRob3IoJGtleSA9IDApCgl7CgkJJGF1dGhvcnMgPSAkdGhpcy0+Z2V0X2F1dGhvcnMoKTsKCQlpZiAoaXNzZXQoJGF1dGhvcnNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRhdXRob3JzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRyaWJ1dG9yKCRrZXkgPSAwKQoJewoJCSRjb250cmlidXRvcnMgPSAkdGhpcy0+Z2V0X2NvbnRyaWJ1dG9ycygpOwoJCWlmIChpc3NldCgkY29udHJpYnV0b3JzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY29udHJpYnV0b3JzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRyaWJ1dG9ycygpCgl7CgkJJGNvbnRyaWJ1dG9ycyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdjb250cmlidXRvcicpIGFzICRjb250cmlidXRvcikKCQl7CgkJCSRuYW1lID0gbnVsbDsKCQkJJHVyaSA9IG51bGw7CgkJCSRlbWFpbCA9IG51bGw7CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJHVyaSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2VtYWlsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRlbWFpbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmICgkbmFtZSAhPT0gbnVsbCB8fCAkZW1haWwgIT09IG51bGwgfHwgJHVyaSAhPT0gbnVsbCkKCQkJewoJCQkJJGNvbnRyaWJ1dG9yc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+YXV0aG9yX2NsYXNzKCRuYW1lLCAkdXJpLCAkZW1haWwpOwoJCQl9CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnY29udHJpYnV0b3InKSBhcyAkY29udHJpYnV0b3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmwgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmwgIT09IG51bGwpCgkJCXsKCQkJCSRjb250cmlidXRvcnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmF1dGhvcl9jbGFzcygkbmFtZSwgJHVybCwgJGVtYWlsKTsKCQkJfQoJCX0KCgkJaWYgKCFlbXB0eSgkY29udHJpYnV0b3JzKSkKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjb250cmlidXRvcnMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBAdG9kbyBBdG9tIGluaGVyaXRhbmNlIChpdGVtIGF1dGhvciwgc291cmNlIGF1dGhvciwgZmVlZCBhdXRob3IpCgkgKi8KCWZ1bmN0aW9uIGdldF9hdXRob3JzKCkKCXsKCQkkYXV0aG9ycyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdhdXRob3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJpID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJpID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmICgkbmFtZSAhPT0gbnVsbCB8fCAkZW1haWwgIT09IG51bGwgfHwgJHVyaSAhPT0gbnVsbCkKCQkJewoJCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmF1dGhvcl9jbGFzcygkbmFtZSwgJHVyaSwgJGVtYWlsKTsKCQkJfQoJCX0KCQlpZiAoJGF1dGhvciA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2F1dGhvcicpKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJsID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnbmFtZSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmICgkbmFtZSAhPT0gbnVsbCB8fCAkZW1haWwgIT09IG51bGwgfHwgJHVybCAhPT0gbnVsbCkKCQkJewoJCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmF1dGhvcl9jbGFzcygkbmFtZSwgJHVybCwgJGVtYWlsKTsKCQkJfQoJCX0KCQlpZiAoJGF1dGhvciA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKCcnLCAnYXV0aG9yJykpCgkJewoJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+YXV0aG9yX2NsYXNzKG51bGwsIG51bGwsICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdjcmVhdG9yJykgYXMgJGF1dGhvcikKCQl7CgkJCSRhdXRob3JzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5hdXRob3JfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2NyZWF0b3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmF1dGhvcl9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2F1dGhvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+YXV0aG9yX2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCgkJaWYgKCFlbXB0eSgkYXV0aG9ycykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkYXV0aG9ycyk7CgkJfQoJCWVsc2VpZiAoKCRzb3VyY2UgPSAkdGhpcy0+Z2V0X3NvdXJjZSgpKSAmJiAoJGF1dGhvcnMgPSAkc291cmNlLT5nZXRfYXV0aG9ycygpKSkKCQl7CgkJCXJldHVybiAkYXV0aG9yczsKCQl9CgkJZWxzZWlmICgkYXV0aG9ycyA9ICR0aGlzLT5mZWVkLT5nZXRfYXV0aG9ycygpKQoJCXsKCQkJcmV0dXJuICRhdXRob3JzOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvcHlyaWdodCgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAncmlnaHRzJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3JpZ2h0cycpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfZGF0ZSgkZGF0ZV9mb3JtYXQgPSAnaiBGIFksIGc6aSBhJykKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWydkYXRlJ10pKQoJCXsKCQkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdwdWJsaXNoZWQnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAndXBkYXRlZCcpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSA9ICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdpc3N1ZWQnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnY3JlYXRlZCcpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSA9ICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdtb2RpZmllZCcpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSA9ICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncygnJywgJ3B1YkRhdGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2RhdGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2RhdGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCgkJCWlmICghZW1wdHkoJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10pKQoJCQl7CgkJCQkkcGFyc2VyID0gU2ltcGxlUGllX1BhcnNlX0RhdGU6OmdldCgpOwoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncGFyc2VkJ10gPSAkcGFyc2VyLT5wYXJzZSgkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnZGF0ZSddID0gbnVsbDsKCQkJfQoJCX0KCQlpZiAoJHRoaXMtPmRhdGFbJ2RhdGUnXSkKCQl7CgkJCSRkYXRlX2Zvcm1hdCA9IChzdHJpbmcpICRkYXRlX2Zvcm1hdDsKCQkJc3dpdGNoICgkZGF0ZV9mb3JtYXQpCgkJCXsKCQkJCWNhc2UgJyc6CgkJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCgkJCQljYXNlICdVJzoKCQkJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ2RhdGUnXVsncGFyc2VkJ107CgoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gZGF0ZSgkZGF0ZV9mb3JtYXQsICR0aGlzLT5kYXRhWydkYXRlJ11bJ3BhcnNlZCddKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xvY2FsX2RhdGUoJGRhdGVfZm9ybWF0ID0gJyVjJykKCXsKCQlpZiAoISRkYXRlX2Zvcm1hdCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmdldF9kYXRlKCcnKSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgoJGRhdGUgPSAkdGhpcy0+Z2V0X2RhdGUoJ1UnKSkgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gc3RyZnRpbWUoJGRhdGVfZm9ybWF0LCAkZGF0ZSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfcGVybWFsaW5rKCkKCXsKCQkkbGluayA9ICR0aGlzLT5nZXRfbGluaygpOwoJCSRlbmNsb3N1cmUgPSAkdGhpcy0+Z2V0X2VuY2xvc3VyZSgwKTsKCQlpZiAoJGxpbmsgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJGxpbms7CgkJfQoJCWVsc2VpZiAoJGVuY2xvc3VyZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkZW5jbG9zdXJlLT5nZXRfbGluaygpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xpbmsoJGtleSA9IDAsICRyZWwgPSAnYWx0ZXJuYXRlJykKCXsKCQkkbGlua3MgPSAkdGhpcy0+Z2V0X2xpbmtzKCRyZWwpOwoJCWlmICgkbGlua3NbJGtleV0gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJGxpbmtzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xpbmtzKCRyZWwgPSAnYWx0ZXJuYXRlJykKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddKSkKCQl7CgkJCSR0aGlzLT5kYXRhWydsaW5rcyddID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdsaW5rJykgYXMgJGxpbmspCgkJCXsKCQkJCWlmIChpc3NldCgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddKSkKCQkJCXsKCQkJCQkkbGlua19yZWwgPSAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddKSkgPyAkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10gOiAnYWx0ZXJuYXRlJzsKCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVskbGlua19yZWxdW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGluaykpOwoKCQkJCX0KCQkJfQoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2xpbmsnKSBhcyAkbGluaykKCQkJewoJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pKQoJCQkJewoJCQkJCSRsaW5rX3JlbCA9IChpc3NldCgkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10pKSA/ICRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSA6ICdhbHRlcm5hdGUnOwoJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRsaW5rX3JlbF1bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQl9CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoJycsICdsaW5rJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWydhbHRlcm5hdGUnXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rc1swXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rc1swXSkpOwoJCQl9CgkJCWlmICgkbGlua3MgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncygnJywgJ2d1aWQnKSkKCQkJewoJCQkJaWYgKCFpc3NldCgkbGlua3NbMF1bJ2F0dHJpYnMnXVsnJ11bJ2lzUGVybWFMaW5rJ10pIHx8IHN0cnRvbG93ZXIodHJpbSgkbGlua3NbMF1bJ2F0dHJpYnMnXVsnJ11bJ2lzUGVybWFMaW5rJ10pKSA9PSAndHJ1ZScpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCQl9CgkJCX0KCgkJCSRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+ZGF0YVsnbGlua3MnXSk7CgkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCXsKCQkJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfaXNlZ21lbnRfbnpfbmMoJGtleSkpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0pKQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldLCAkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldKTsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlaWYgKHN1YnN0cigka2V5LCAwLCA0MSkgPT0gU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bc3Vic3RyKCRrZXksIDQxKV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV07CgkJCQl9CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSA9IGFycmF5X3VuaXF1ZSgkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSk7CgkJCX0KCQl9CgkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddWyRyZWxdKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZGF0YVsnbGlua3MnXVskcmVsXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogQHRvZG8gQWRkIGFiaWxpdHkgdG8gcHJlZmVyIG9uZSB0eXBlIG9mIGNvbnRlbnQgb3ZlciBhbm90aGVyIChpbiBhIG1lZGlhIGdyb3VwKS4KCSAqLwoJZnVuY3Rpb24gZ2V0X2VuY2xvc3VyZSgka2V5ID0gMCwgJHByZWZlciA9IG51bGwpCgl7CgkJJGVuY2xvc3VyZXMgPSAkdGhpcy0+Z2V0X2VuY2xvc3VyZXMoKTsKCQlpZiAoaXNzZXQoJGVuY2xvc3VyZXNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRlbmNsb3N1cmVzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHcmFicyBhbGwgYXZhaWxhYmxlIGVuY2xvc3VyZXMgKHBvZGNhc3RzLCBldGMuKQoJICoKCSAqIFN1cHBvcnRzIHRoZSA8ZW5jbG9zdXJlPiBSU1MgdGFnLCBhcyB3ZWxsIGFzIE1lZGlhIFJTUyBhbmQgaVR1bmVzIFJTUy4KCSAqCgkgKiBBdCB0aGlzIHBvaW50LCB3ZSdyZSBwcmV0dHkgbXVjaCBhc3N1bWluZyB0aGF0IGFsbCBlbmNsb3N1cmVzIGZvciBhbiBpdGVtIGFyZSB0aGUgc2FtZSBjb250ZW50LiAgQW55dGhpbmcgZWxzZSBpcyB0b28gY29tcGxpY2F0ZWQgdG8gcHJvcGVybHkgc3VwcG9ydC4KCSAqCgkgKiBAdG9kbyBBZGQgc3VwcG9ydCBmb3IgZW5kLXVzZXIgZGVmaW5lZCBzb3J0aW5nIG9mIGVuY2xvc3VyZXMgYnkgdHlwZS9oYW5kbGVyIChzbyB3ZSBjYW4gcHJlZmVyIHRoZSBmYXN0ZXItbG9hZGluZyBGTFYgb3ZlciBNUDQpLgoJICogQHRvZG8gSWYgYW4gZWxlbWVudCBleGlzdHMgYXQgYSBsZXZlbCwgYnV0IGl0J3MgdmFsdWUgaXMgZW1wdHksIHdlIHNob3VsZCBmYWxsIGJhY2sgdG8gdGhlIHZhbHVlIGZyb20gdGhlIHBhcmVudCAoaWYgaXQgZXhpc3RzKS4KCSAqLwoJZnVuY3Rpb24gZ2V0X2VuY2xvc3VyZXMoKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ2VuY2xvc3VyZXMnXSkpCgkJewoJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddID0gYXJyYXkoKTsKCgkJCS8vIEVsZW1lbnRzCgkJCSRjYXB0aW9uc19wYXJlbnQgPSBudWxsOwoJCQkkY2F0ZWdvcmllc19wYXJlbnQgPSBudWxsOwoJCQkkY29weXJpZ2h0c19wYXJlbnQgPSBudWxsOwoJCQkkY3JlZGl0c19wYXJlbnQgPSBudWxsOwoJCQkkZGVzY3JpcHRpb25fcGFyZW50ID0gbnVsbDsKCQkJJGR1cmF0aW9uX3BhcmVudCA9IG51bGw7CgkJCSRoYXNoZXNfcGFyZW50ID0gbnVsbDsKCQkJJGtleXdvcmRzX3BhcmVudCA9IG51bGw7CgkJCSRwbGF5ZXJfcGFyZW50ID0gbnVsbDsKCQkJJHJhdGluZ3NfcGFyZW50ID0gbnVsbDsKCQkJJHJlc3RyaWN0aW9uc19wYXJlbnQgPSBudWxsOwoJCQkkdGh1bWJuYWlsc19wYXJlbnQgPSBudWxsOwoJCQkkdGl0bGVfcGFyZW50ID0gbnVsbDsKCgkJCS8vIExldCdzIGRvIHRoZSBjaGFubmVsIGFuZCBpdGVtLWxldmVsIG9uZXMgZmlyc3QsIGFuZCBqdXN0IHJlLXVzZSB0aGVtIGlmIHdlIG5lZWQgdG8uCgkJCSRwYXJlbnQgPSAkdGhpcy0+Z2V0X2ZlZWQoKTsKCgkJCS8vIENBUFRJT05TCgkJCWlmICgkY2FwdGlvbnMgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGV4dCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkY2FwdGlvbnMgYXMgJGNhcHRpb24pCgkJCQl7CgkJCQkJJGNhcHRpb25fdHlwZSA9IG51bGw7CgkJCQkJJGNhcHRpb25fbGFuZyA9IG51bGw7CgkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9lbmRUaW1lID0gbnVsbDsKCQkJCQkkY2FwdGlvbl90ZXh0ID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJewoJCQkJCQkkY2FwdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX2xhbmcgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX3N0YXJ0VGltZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnc3RhcnQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSkpCgkJCQkJewoJCQkJCQkkY2FwdGlvbl9lbmRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fdGV4dCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQkkY2FwdGlvbnNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXB0aW9uX2NsYXNzKCRjYXB0aW9uX3R5cGUsICRjYXB0aW9uX2xhbmcsICRjYXB0aW9uX3N0YXJ0VGltZSwgJGNhcHRpb25fZW5kVGltZSwgJGNhcHRpb25fdGV4dCk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkY2FwdGlvbnMgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICd0ZXh0JykpCgkJCXsKCQkJCWZvcmVhY2ggKCRjYXB0aW9ucyBhcyAkY2FwdGlvbikKCQkJCXsKCQkJCQkkY2FwdGlvbl90eXBlID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9sYW5nID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSBudWxsOwoJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSBudWxsOwoJCQkJCSRjYXB0aW9uX3RleHQgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fbGFuZyA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkY2FwdGlvbl90ZXh0ID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRjYXB0aW9uc19wYXJlbnRbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhcHRpb25fY2xhc3MoJGNhcHRpb25fdHlwZSwgJGNhcHRpb25fbGFuZywgJGNhcHRpb25fc3RhcnRUaW1lLCAkY2FwdGlvbl9lbmRUaW1lLCAkY2FwdGlvbl90ZXh0KTsKCQkJCX0KCQkJfQoJCQlpZiAoaXNfYXJyYXkoJGNhcHRpb25zX3BhcmVudCkpCgkJCXsKCQkJCSRjYXB0aW9uc19wYXJlbnQgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY2FwdGlvbnNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIENBVEVHT1JJRVMKCQkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJCXsKCQkJCSR0ZXJtID0gbnVsbDsKCQkJCSRzY2hlbWUgPSBudWxsOwoJCQkJJGxhYmVsID0gbnVsbDsKCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQl7CgkJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRzY2hlbWUgPSAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy9jYXRlZ29yeV9zY2hlbWEnOwoJCQkJfQoJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCQl7CgkJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJCSRjYXRlZ29yaWVzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y2F0ZWdvcnlfY2xhc3MoJHRlcm0sICRzY2hlbWUsICRsYWJlbCk7CgkJCX0KCQkJZm9yZWFjaCAoKGFycmF5KSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdjYXRlZ29yeScpIGFzICRjYXRlZ29yeSkKCQkJewoJCQkJJHRlcm0gPSBudWxsOwoJCQkJJHNjaGVtZSA9IG51bGw7CgkJCQkkbGFiZWwgPSBudWxsOwoJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkdGVybSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCXsKCQkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJHNjaGVtZSA9ICdodHRwOi8vc2VhcmNoLnlhaG9vLmNvbS9tcnNzL2NhdGVnb3J5X3NjaGVtYSc7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddKSkKCQkJCXsKCQkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJJGNhdGVnb3JpZXNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGVybSwgJHNjaGVtZSwgJGxhYmVsKTsKCQkJfQoJCQlmb3JlYWNoICgoYXJyYXkpICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdjYXRlZ29yeScpIGFzICRjYXRlZ29yeSkKCQkJewoJCQkJJHRlcm0gPSBudWxsOwoJCQkJJHNjaGVtZSA9ICdodHRwOi8vd3d3Lml0dW5lcy5jb20vZHRkcy9wb2RjYXN0LTEuMC5kdGQnOwoJCQkJJGxhYmVsID0gbnVsbDsKCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3RleHQnXSkpCgkJCQl7CgkJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGV4dCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJJGNhdGVnb3JpZXNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGVybSwgJHNjaGVtZSwgJGxhYmVsKTsKCgkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTXVsnY2F0ZWdvcnknXSkpCgkJCQl7CgkJCQkJZm9yZWFjaCAoKGFycmF5KSAkY2F0ZWdvcnlbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVNdWydjYXRlZ29yeSddIGFzICRzdWJjYXRlZ29yeSkKCQkJCQl7CgkJCQkJCWlmIChpc3NldCgkc3ViY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3RleHQnXSkpCgkJCQkJCXsKCQkJCQkJCSRsYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkc3ViY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3RleHQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQkkY2F0ZWdvcmllc19wYXJlbnRbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoaXNfYXJyYXkoJGNhdGVnb3JpZXNfcGFyZW50KSkKCQkJewoJCQkJJGNhdGVnb3JpZXNfcGFyZW50ID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGNhdGVnb3JpZXNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIENPUFlSSUdIVAoJCQlpZiAoJGNvcHlyaWdodCA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdjb3B5cmlnaHQnKSkKCQkJewoJCQkJJGNvcHlyaWdodF91cmwgPSBudWxsOwoJCQkJJGNvcHlyaWdodF9sYWJlbCA9IG51bGw7CgkJCQlpZiAoaXNzZXQoJGNvcHlyaWdodFswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJewoJCQkJCSRjb3B5cmlnaHRfdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb3B5cmlnaHRbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJaWYgKGlzc2V0KCRjb3B5cmlnaHRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJGNvcHlyaWdodF9sYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29weXJpZ2h0WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQkkY29weXJpZ2h0c19wYXJlbnQgPSYgbmV3ICR0aGlzLT5mZWVkLT5jb3B5cmlnaHRfY2xhc3MoJGNvcHlyaWdodF91cmwsICRjb3B5cmlnaHRfbGFiZWwpOwoJCQl9CgkJCWVsc2VpZiAoJGNvcHlyaWdodCA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2NvcHlyaWdodCcpKQoJCQl7CgkJCQkkY29weXJpZ2h0X3VybCA9IG51bGw7CgkJCQkkY29weXJpZ2h0X2xhYmVsID0gbnVsbDsKCQkJCWlmIChpc3NldCgkY29weXJpZ2h0WzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQl7CgkJCQkJJGNvcHlyaWdodF91cmwgPSAkdGhpcy0+c2FuaXRpemUoJGNvcHlyaWdodFswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJGNvcHlyaWdodFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkY29weXJpZ2h0X2xhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjb3B5cmlnaHRbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJCSRjb3B5cmlnaHRzX3BhcmVudCA9JiBuZXcgJHRoaXMtPmZlZWQtPmNvcHlyaWdodF9jbGFzcygkY29weXJpZ2h0X3VybCwgJGNvcHlyaWdodF9sYWJlbCk7CgkJCX0KCgkJCS8vIENSRURJVFMKCQkJaWYgKCRjcmVkaXRzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2NyZWRpdCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkY3JlZGl0cyBhcyAkY3JlZGl0KQoJCQkJewoJCQkJCSRjcmVkaXRfcm9sZSA9IG51bGw7CgkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSkpCgkJCQkJewoJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCXsKCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRjcmVkaXRzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y3JlZGl0X2NsYXNzKCRjcmVkaXRfcm9sZSwgJGNyZWRpdF9zY2hlbWUsICRjcmVkaXRfbmFtZSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkY3JlZGl0cyA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2NyZWRpdCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkY3JlZGl0cyBhcyAkY3JlZGl0KQoJCQkJewoJCQkJCSRjcmVkaXRfcm9sZSA9IG51bGw7CgkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSkpCgkJCQkJewoJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCXsKCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRjcmVkaXRzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y3JlZGl0X2NsYXNzKCRjcmVkaXRfcm9sZSwgJGNyZWRpdF9zY2hlbWUsICRjcmVkaXRfbmFtZSk7CgkJCQl9CgkJCX0KCQkJaWYgKGlzX2FycmF5KCRjcmVkaXRzX3BhcmVudCkpCgkJCXsKCQkJCSRjcmVkaXRzX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjcmVkaXRzX3BhcmVudCkpOwoJCQl9CgoJCQkvLyBERVNDUklQVElPTgoJCQlpZiAoJGRlc2NyaXB0aW9uX3BhcmVudCA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdkZXNjcmlwdGlvbicpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGRlc2NyaXB0aW9uX3BhcmVudFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkZGVzY3JpcHRpb25fcGFyZW50ID0gJHRoaXMtPnNhbml0aXplKCRkZXNjcmlwdGlvbl9wYXJlbnRbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRkZXNjcmlwdGlvbl9wYXJlbnQgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdkZXNjcmlwdGlvbicpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGRlc2NyaXB0aW9uX3BhcmVudFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkZGVzY3JpcHRpb25fcGFyZW50ID0gJHRoaXMtPnNhbml0aXplKCRkZXNjcmlwdGlvbl9wYXJlbnRbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJfQoKCQkJLy8gRFVSQVRJT04KCQkJaWYgKCRkdXJhdGlvbl9wYXJlbnQgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2R1cmF0aW9uJykpCgkJCXsKCQkJCSRzZWNvbmRzID0gbnVsbDsKCQkJCSRtaW51dGVzID0gbnVsbDsKCQkJCSRob3VycyA9IG51bGw7CgkJCQlpZiAoaXNzZXQoJGR1cmF0aW9uX3BhcmVudFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkdGVtcCA9IGV4cGxvZGUoJzonLCAkdGhpcy0+c2FuaXRpemUoJGR1cmF0aW9uX3BhcmVudFswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpKTsKCQkJCQlpZiAoc2l6ZW9mKCR0ZW1wKSA+IDApCgkJCQkJewoJCQkJCQkoaW50KSAkc2Vjb25kcyA9IGFycmF5X3BvcCgkdGVtcCk7CgkJCQkJfQoJCQkJCWlmIChzaXplb2YoJHRlbXApID4gMCkKCQkJCQl7CgkJCQkJCShpbnQpICRtaW51dGVzID0gYXJyYXlfcG9wKCR0ZW1wKTsKCQkJCQkJJHNlY29uZHMgKz0gJG1pbnV0ZXMgKiA2MDsKCQkJCQl9CgkJCQkJaWYgKHNpemVvZigkdGVtcCkgPiAwKQoJCQkJCXsKCQkJCQkJKGludCkgJGhvdXJzID0gYXJyYXlfcG9wKCR0ZW1wKTsKCQkJCQkJJHNlY29uZHMgKz0gJGhvdXJzICogMzYwMDsKCQkJCQl9CgkJCQkJdW5zZXQoJHRlbXApOwoJCQkJCSRkdXJhdGlvbl9wYXJlbnQgPSAkc2Vjb25kczsKCQkJCX0KCQkJfQoKCQkJLy8gSEFTSEVTCgkJCWlmICgkaGFzaGVzX2l0ZXJhdG9yID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2hhc2gnKSkKCQkJewoJCQkJZm9yZWFjaCAoJGhhc2hlc19pdGVyYXRvciBhcyAkaGFzaCkKCQkJCXsKCQkJCQkkdmFsdWUgPSBudWxsOwoJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10pKQoJCQkJCXsKCQkJCQkJJGFsZ28gPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJGFsZ28gPSAnbWQ1JzsKCQkJCQl9CgkJCQkJJGhhc2hlc19wYXJlbnRbXSA9ICRhbGdvLic6Jy4kdmFsdWU7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkaGFzaGVzX2l0ZXJhdG9yID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAnaGFzaCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkaGFzaGVzX2l0ZXJhdG9yIGFzICRoYXNoKQoJCQkJewoJCQkJCSR2YWx1ZSA9IG51bGw7CgkJCQkJJGFsZ28gPSBudWxsOwoJCQkJCWlmIChpc3NldCgkaGFzaFsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSR2YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkaGFzaFsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSkpCgkJCQkJewoJCQkJCQkkYWxnbyA9ICR0aGlzLT5zYW5pdGl6ZSgkaGFzaFsnYXR0cmlicyddWycnXVsnYWxnbyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkYWxnbyA9ICdtZDUnOwoJCQkJCX0KCQkJCQkkaGFzaGVzX3BhcmVudFtdID0gJGFsZ28uJzonLiR2YWx1ZTsKCQkJCX0KCQkJfQoJCQlpZiAoaXNfYXJyYXkoJGhhc2hlc19wYXJlbnQpKQoJCQl7CgkJCQkkaGFzaGVzX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRoYXNoZXNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIEtFWVdPUkRTCgkJCWlmICgka2V5d29yZHMgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAna2V5d29yZHMnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRrZXl3b3Jkc1swXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkdGVtcCA9IGV4cGxvZGUoJywnLCAkdGhpcy0+c2FuaXRpemUoJGtleXdvcmRzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCWZvcmVhY2ggKCR0ZW1wIGFzICR3b3JkKQoJCQkJCXsKCQkJCQkJJGtleXdvcmRzX3BhcmVudFtdID0gdHJpbSgkd29yZCk7CgkJCQkJfQoJCQkJfQoJCQkJdW5zZXQoJHRlbXApOwoJCQl9CgkJCWVsc2VpZiAoJGtleXdvcmRzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdrZXl3b3JkcycpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGtleXdvcmRzWzBdWydkYXRhJ10pKQoJCQkJewoJCQkJCSR0ZW1wID0gZXhwbG9kZSgnLCcsICR0aGlzLT5zYW5pdGl6ZSgka2V5d29yZHNbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSk7CgkJCQkJZm9yZWFjaCAoJHRlbXAgYXMgJHdvcmQpCgkJCQkJewoJCQkJCQkka2V5d29yZHNfcGFyZW50W10gPSB0cmltKCR3b3JkKTsKCQkJCQl9CgkJCQl9CgkJCQl1bnNldCgkdGVtcCk7CgkJCX0KCQkJZWxzZWlmICgka2V5d29yZHMgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdrZXl3b3JkcycpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGtleXdvcmRzWzBdWydkYXRhJ10pKQoJCQkJewoJCQkJCSR0ZW1wID0gZXhwbG9kZSgnLCcsICR0aGlzLT5zYW5pdGl6ZSgka2V5d29yZHNbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSk7CgkJCQkJZm9yZWFjaCAoJHRlbXAgYXMgJHdvcmQpCgkJCQkJewoJCQkJCQkka2V5d29yZHNfcGFyZW50W10gPSB0cmltKCR3b3JkKTsKCQkJCQl9CgkJCQl9CgkJCQl1bnNldCgkdGVtcCk7CgkJCX0KCQkJZWxzZWlmICgka2V5d29yZHMgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTLCAna2V5d29yZHMnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRrZXl3b3Jkc1swXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkdGVtcCA9IGV4cGxvZGUoJywnLCAkdGhpcy0+c2FuaXRpemUoJGtleXdvcmRzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCWZvcmVhY2ggKCR0ZW1wIGFzICR3b3JkKQoJCQkJCXsKCQkJCQkJJGtleXdvcmRzX3BhcmVudFtdID0gdHJpbSgkd29yZCk7CgkJCQkJfQoJCQkJfQoJCQkJdW5zZXQoJHRlbXApOwoJCQl9CgkJCWlmIChpc19hcnJheSgka2V5d29yZHNfcGFyZW50KSkKCQkJewoJCQkJJGtleXdvcmRzX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRrZXl3b3Jkc19wYXJlbnQpKTsKCQkJfQoKCQkJLy8gUExBWUVSCgkJCWlmICgkcGxheWVyX3BhcmVudCA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdwbGF5ZXInKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRwbGF5ZXJfcGFyZW50WzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQl7CgkJCQkJJHBsYXllcl9wYXJlbnQgPSAkdGhpcy0+c2FuaXRpemUoJHBsYXllcl9wYXJlbnRbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkcGxheWVyX3BhcmVudCA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ3BsYXllcicpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJHBsYXllcl9wYXJlbnRbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCXsKCQkJCQkkcGxheWVyX3BhcmVudCA9ICR0aGlzLT5zYW5pdGl6ZSgkcGxheWVyX3BhcmVudFswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJCX0KCQkJfQoKCQkJLy8gUkFUSU5HUwoJCQlpZiAoJHJhdGluZ3MgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAncmF0aW5nJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyYXRpbmdzIGFzICRyYXRpbmcpCgkJCQl7CgkJCQkJJHJhdGluZ19zY2hlbWUgPSBudWxsOwoJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJewoJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOnNpbXBsZSc7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRyYXRpbmdzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmF0aW5nX2NsYXNzKCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyYXRpbmdzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdleHBsaWNpdCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmF0aW5ncyBhcyAkcmF0aW5nKQoJCQkJewoJCQkJCSRyYXRpbmdfc2NoZW1lID0gJ3VybjppdHVuZXMnOwoJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRyYXRpbmdzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmF0aW5nX2NsYXNzKCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyYXRpbmdzID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAncmF0aW5nJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyYXRpbmdzIGFzICRyYXRpbmcpCgkJCQl7CgkJCQkJJHJhdGluZ19zY2hlbWUgPSBudWxsOwoJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJewoJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOnNpbXBsZSc7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRyYXRpbmdzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmF0aW5nX2NsYXNzKCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyYXRpbmdzID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2V4cGxpY2l0JykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyYXRpbmdzIGFzICRyYXRpbmcpCgkJCQl7CgkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOml0dW5lcyc7CgkJCQkJJHJhdGluZ192YWx1ZSA9IG51bGw7CgkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkcmF0aW5nX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJJHJhdGluZ3NfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yYXRpbmdfY2xhc3MoJHJhdGluZ19zY2hlbWUsICRyYXRpbmdfdmFsdWUpOwoJCQkJfQoJCQl9CgkJCWlmIChpc19hcnJheSgkcmF0aW5nc19wYXJlbnQpKQoJCQl7CgkJCQkkcmF0aW5nc19wYXJlbnQgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkcmF0aW5nc19wYXJlbnQpKTsKCQkJfQoKCQkJLy8gUkVTVFJJQ1RJT05TCgkJCWlmICgkcmVzdHJpY3Rpb25zID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ3Jlc3RyaWN0aW9uJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyZXN0cmljdGlvbnMgYXMgJHJlc3RyaWN0aW9uKQoJCQkJewoJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSBudWxsOwoJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gbnVsbDsKCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddKSkKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWydyZWxhdGlvbnNoaXAnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQkkcmVzdHJpY3Rpb25zX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmVzdHJpY3Rpb25fY2xhc3MoJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCwgJHJlc3RyaWN0aW9uX3R5cGUsICRyZXN0cmljdGlvbl92YWx1ZSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkcmVzdHJpY3Rpb25zID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdibG9jaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmVzdHJpY3Rpb25zIGFzICRyZXN0cmljdGlvbikKCQkJCXsKCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gJ2FsbG93JzsKCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gJ2l0dW5lcyc7CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnZGF0YSddKSAmJiBzdHJ0b2xvd2VyKCRyZXN0cmljdGlvblsnZGF0YSddKSA9PSAneWVzJykKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAnZGVueSc7CgkJCQkJfQoJCQkJCSRyZXN0cmljdGlvbnNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yZXN0cmljdGlvbl9jbGFzcygkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyZXN0cmljdGlvbnMgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdyZXN0cmljdGlvbicpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmVzdHJpY3Rpb25zIGFzICRyZXN0cmljdGlvbikKCQkJCXsKCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gbnVsbDsKCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWydyZWxhdGlvbnNoaXAnXSkpCgkJCQkJewoJCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsncmVsYXRpb25zaGlwJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJewoJCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJJHJlc3RyaWN0aW9uc19wYXJlbnRbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPnJlc3RyaWN0aW9uX2NsYXNzKCRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAsICRyZXN0cmljdGlvbl90eXBlLCAkcmVzdHJpY3Rpb25fdmFsdWUpOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoJHJlc3RyaWN0aW9ucyA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdibG9jaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmVzdHJpY3Rpb25zIGFzICRyZXN0cmljdGlvbikKCQkJCXsKCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gJ2FsbG93JzsKCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gJ2l0dW5lcyc7CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnZGF0YSddKSAmJiBzdHJ0b2xvd2VyKCRyZXN0cmljdGlvblsnZGF0YSddKSA9PSAneWVzJykKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAnZGVueSc7CgkJCQkJfQoJCQkJCSRyZXN0cmljdGlvbnNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yZXN0cmljdGlvbl9jbGFzcygkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQlpZiAoaXNfYXJyYXkoJHJlc3RyaWN0aW9uc19wYXJlbnQpKQoJCQl7CgkJCQkkcmVzdHJpY3Rpb25zX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRyZXN0cmljdGlvbnNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIFRIVU1CTkFJTFMKCQkJaWYgKCR0aHVtYm5haWxzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ3RodW1ibmFpbCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkdGh1bWJuYWlscyBhcyAkdGh1bWJuYWlsKQoJCQkJewoJCQkJCWlmIChpc3NldCgkdGh1bWJuYWlsWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQkJewoJCQkJCQkkdGh1bWJuYWlsc19wYXJlbnRbXSA9ICR0aGlzLT5zYW5pdGl6ZSgkdGh1bWJuYWlsWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlaWYgKCR0aHVtYm5haWxzID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGh1bWJuYWlsJykpCgkJCXsKCQkJCWZvcmVhY2ggKCR0aHVtYm5haWxzIGFzICR0aHVtYm5haWwpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQl7CgkJCQkJCSR0aHVtYm5haWxzX3BhcmVudFtdID0gJHRoaXMtPnNhbml0aXplKCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBUSVRMRVMKCQkJaWYgKCR0aXRsZV9wYXJlbnQgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGl0bGUnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCR0aXRsZV9wYXJlbnRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRpdGxlX3BhcmVudCA9ICR0aGlzLT5zYW5pdGl6ZSgkdGl0bGVfcGFyZW50WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkdGl0bGVfcGFyZW50ID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGl0bGUnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCR0aXRsZV9wYXJlbnRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRpdGxlX3BhcmVudCA9ICR0aGlzLT5zYW5pdGl6ZSgkdGl0bGVfcGFyZW50WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCX0KCgkJCS8vIENsZWFyIHRoZSBtZW1vcnkKCQkJdW5zZXQoJHBhcmVudCk7CgoJCQkvLyBBdHRyaWJ1dGVzCgkJCSRiaXRyYXRlID0gbnVsbDsKCQkJJGNoYW5uZWxzID0gbnVsbDsKCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJJGV4cHJlc3Npb24gPSBudWxsOwoJCQkkZnJhbWVyYXRlID0gbnVsbDsKCQkJJGhlaWdodCA9IG51bGw7CgkJCSRqYXZhc2NyaXB0ID0gbnVsbDsKCQkJJGxhbmcgPSBudWxsOwoJCQkkbGVuZ3RoID0gbnVsbDsKCQkJJG1lZGl1bSA9IG51bGw7CgkJCSRzYW1wbGluZ3JhdGUgPSBudWxsOwoJCQkkdHlwZSA9IG51bGw7CgkJCSR1cmwgPSBudWxsOwoJCQkkd2lkdGggPSBudWxsOwoKCQkJLy8gRWxlbWVudHMKCQkJJGNhcHRpb25zID0gbnVsbDsKCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkkY29weXJpZ2h0cyA9IG51bGw7CgkJCSRjcmVkaXRzID0gbnVsbDsKCQkJJGRlc2NyaXB0aW9uID0gbnVsbDsKCQkJJGhhc2hlcyA9IG51bGw7CgkJCSRrZXl3b3JkcyA9IG51bGw7CgkJCSRwbGF5ZXIgPSBudWxsOwoJCQkkcmF0aW5ncyA9IG51bGw7CgkJCSRyZXN0cmljdGlvbnMgPSBudWxsOwoJCQkkdGh1bWJuYWlscyA9IG51bGw7CgkJCSR0aXRsZSA9IG51bGw7CgoJCQkvLyBJZiB3ZSBoYXZlIG1lZGlhOmdyb3VwIHRhZ3MsIGxvb3AgdGhyb3VnaCB0aGVtLgoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdncm91cCcpIGFzICRncm91cCkKCQkJewoJCQkJLy8gSWYgd2UgaGF2ZSBtZWRpYTpjb250ZW50IHRhZ3MsIGxvb3AgdGhyb3VnaCB0aGVtLgoJCQkJZm9yZWFjaCAoKGFycmF5KSAkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvbnRlbnQnXSBhcyAkY29udGVudCkKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQl7CgkJCQkJCS8vIEF0dHJpYnV0ZXMKCQkJCQkJJGJpdHJhdGUgPSBudWxsOwoJCQkJCQkkY2hhbm5lbHMgPSBudWxsOwoJCQkJCQkkZHVyYXRpb24gPSBudWxsOwoJCQkJCQkkZXhwcmVzc2lvbiA9IG51bGw7CgkJCQkJCSRmcmFtZXJhdGUgPSBudWxsOwoJCQkJCQkkaGVpZ2h0ID0gbnVsbDsKCQkJCQkJJGphdmFzY3JpcHQgPSBudWxsOwoJCQkJCQkkbGFuZyA9IG51bGw7CgkJCQkJCSRsZW5ndGggPSBudWxsOwoJCQkJCQkkbWVkaXVtID0gbnVsbDsKCQkJCQkJJHNhbXBsaW5ncmF0ZSA9IG51bGw7CgkJCQkJCSR0eXBlID0gbnVsbDsKCQkJCQkJJHVybCA9IG51bGw7CgkJCQkJCSR3aWR0aCA9IG51bGw7CgoJCQkJCQkvLyBFbGVtZW50cwoJCQkJCQkkY2FwdGlvbnMgPSBudWxsOwoJCQkJCQkkY2F0ZWdvcmllcyA9IG51bGw7CgkJCQkJCSRjb3B5cmlnaHRzID0gbnVsbDsKCQkJCQkJJGNyZWRpdHMgPSBudWxsOwoJCQkJCQkkZGVzY3JpcHRpb24gPSBudWxsOwoJCQkJCQkkaGFzaGVzID0gbnVsbDsKCQkJCQkJJGtleXdvcmRzID0gbnVsbDsKCQkJCQkJJHBsYXllciA9IG51bGw7CgkJCQkJCSRyYXRpbmdzID0gbnVsbDsKCQkJCQkJJHJlc3RyaWN0aW9ucyA9IG51bGw7CgkJCQkJCSR0aHVtYm5haWxzID0gbnVsbDsKCQkJCQkJJHRpdGxlID0gbnVsbDsKCgkJCQkJCS8vIFN0YXJ0IGNoZWNraW5nIHRoZSBhdHRyaWJ1dGVzIG9mIG1lZGlhOmNvbnRlbnQKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydiaXRyYXRlJ10pKQoJCQkJCQl7CgkJCQkJCQkkYml0cmF0ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnYml0cmF0ZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnY2hhbm5lbHMnXSkpCgkJCQkJCXsKCQkJCQkJCSRjaGFubmVscyA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnY2hhbm5lbHMnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2R1cmF0aW9uJ10pKQoJCQkJCQl7CgkJCQkJCQkkZHVyYXRpb24gPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2R1cmF0aW9uJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkZHVyYXRpb24gPSAkZHVyYXRpb25fcGFyZW50OwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnZXhwcmVzc2lvbiddKSkKCQkJCQkJewoJCQkJCQkJJGV4cHJlc3Npb24gPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2V4cHJlc3Npb24nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZyYW1lcmF0ZSddKSkKCQkJCQkJewoJCQkJCQkJJGZyYW1lcmF0ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnZnJhbWVyYXRlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydoZWlnaHQnXSkpCgkJCQkJCXsKCQkJCQkJCSRoZWlnaHQgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2hlaWdodCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnbGFuZyddKSkKCQkJCQkJewoJCQkJCQkJJGxhbmcgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZpbGVTaXplJ10pKQoJCQkJCQl7CgkJCQkJCQkkbGVuZ3RoID0gY2VpbCgkY29udGVudFsnYXR0cmlicyddWycnXVsnZmlsZVNpemUnXSk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydtZWRpdW0nXSkpCgkJCQkJCXsKCQkJCQkJCSRtZWRpdW0gPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ21lZGl1bSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnc2FtcGxpbmdyYXRlJ10pKQoJCQkJCQl7CgkJCQkJCQkkc2FtcGxpbmdyYXRlID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydzYW1wbGluZ3JhdGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCXsKCQkJCQkJCSR0eXBlID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd3aWR0aCddKSkKCQkJCQkJewoJCQkJCQkJJHdpZHRoID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd3aWR0aCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgoJCQkJCQkvLyBDaGVja2luZyB0aGUgb3RoZXIgb3B0aW9uYWwgbWVkaWE6IGVsZW1lbnRzLiBQcmlvcml0eTogbWVkaWE6Y29udGVudCwgbWVkaWE6Z3JvdXAsIGl0ZW0sIGNoYW5uZWwKCgkJCQkJCS8vIENBUFRJT05TCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGV4dCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RleHQnXSBhcyAkY2FwdGlvbikKCQkJCQkJCXsKCQkJCQkJCQkkY2FwdGlvbl90eXBlID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl9sYW5nID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX3RleHQgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fbGFuZyA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl90ZXh0ID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjYXB0aW9uc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y2FwdGlvbl9jbGFzcygkY2FwdGlvbl90eXBlLCAkY2FwdGlvbl9sYW5nLCAkY2FwdGlvbl9zdGFydFRpbWUsICRjYXB0aW9uX2VuZFRpbWUsICRjYXB0aW9uX3RleHQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRjYXB0aW9ucykpCgkJCQkJCQl7CgkJCQkJCQkJJGNhcHRpb25zID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGNhcHRpb25zKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RleHQnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGV4dCddIGFzICRjYXB0aW9uKQoJCQkJCQkJewoJCQkJCQkJCSRjYXB0aW9uX3R5cGUgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX2xhbmcgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX3N0YXJ0VGltZSA9IG51bGw7CgkJCQkJCQkJJGNhcHRpb25fZW5kVGltZSA9IG51bGw7CgkJCQkJCQkJJGNhcHRpb25fdGV4dCA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl9sYW5nID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnc3RhcnQnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnZW5kJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fZW5kVGltZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnZW5kJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX3RleHQgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJGNhcHRpb25zW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXB0aW9uX2NsYXNzKCRjYXB0aW9uX3R5cGUsICRjYXB0aW9uX2xhbmcsICRjYXB0aW9uX3N0YXJ0VGltZSwgJGNhcHRpb25fZW5kVGltZSwgJGNhcHRpb25fdGV4dCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJGNhcHRpb25zKSkKCQkJCQkJCXsKCQkJCQkJCQkkY2FwdGlvbnMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY2FwdGlvbnMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRjYXB0aW9ucyA9ICRjYXB0aW9uc19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIENBVEVHT1JJRVMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjYXRlZ29yeSddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoKGFycmF5KSAkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY2F0ZWdvcnknXSBhcyAkY2F0ZWdvcnkpCgkJCQkJCQl7CgkJCQkJCQkJJHRlcm0gPSBudWxsOwoJCQkJCQkJCSRzY2hlbWUgPSBudWxsOwoJCQkJCQkJCSRsYWJlbCA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSR0ZXJtID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCSRzY2hlbWUgPSAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy9jYXRlZ29yeV9zY2hlbWEnOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRsYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGVybSwgJHNjaGVtZSwgJGxhYmVsKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjYXRlZ29yeSddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoKGFycmF5KSAkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NhdGVnb3J5J10gYXMgJGNhdGVnb3J5KQoJCQkJCQkJewoJCQkJCQkJCSR0ZXJtID0gbnVsbDsKCQkJCQkJCQkkc2NoZW1lID0gbnVsbDsKCQkJCQkJCQkkbGFiZWwgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdGVybSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkc2NoZW1lID0gJ2h0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvY2F0ZWdvcnlfc2NoZW1hJzsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQkkY2F0ZWdvcmllc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y2F0ZWdvcnlfY2xhc3MoJHRlcm0sICRzY2hlbWUsICRsYWJlbCk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJaWYgKGlzX2FycmF5KCRjYXRlZ29yaWVzKSAmJiBpc19hcnJheSgkY2F0ZWdvcmllc19wYXJlbnQpKQoJCQkJCQl7CgkJCQkJCQkkY2F0ZWdvcmllcyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCRjYXRlZ29yaWVzLCAkY2F0ZWdvcmllc19wYXJlbnQpKSk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc19hcnJheSgkY2F0ZWdvcmllcykpCgkJCQkJCXsKCQkJCQkJCSRjYXRlZ29yaWVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGNhdGVnb3JpZXMpKTsKCQkJCQkJfQoJCQkJCQllbHNlaWYgKGlzX2FycmF5KCRjYXRlZ29yaWVzX3BhcmVudCkpCgkJCQkJCXsKCQkJCQkJCSRjYXRlZ29yaWVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGNhdGVnb3JpZXNfcGFyZW50KSk7CgkJCQkJCX0KCgkJCQkJCS8vIENPUFlSSUdIVFMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXSkpCgkJCQkJCXsKCQkJCQkJCSRjb3B5cmlnaHRfdXJsID0gbnVsbDsKCQkJCQkJCSRjb3B5cmlnaHRfbGFiZWwgPSBudWxsOwoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRjb3B5cmlnaHRfdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydkYXRhJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRjb3B5cmlnaHRfbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQkkY29weXJpZ2h0cyA9JiBuZXcgJHRoaXMtPmZlZWQtPmNvcHlyaWdodF9jbGFzcygkY29weXJpZ2h0X3VybCwgJGNvcHlyaWdodF9sYWJlbCk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddKSkKCQkJCQkJewoJCQkJCQkJJGNvcHlyaWdodF91cmwgPSBudWxsOwoJCQkJCQkJJGNvcHlyaWdodF9sYWJlbCA9IG51bGw7CgkJCQkJCQlpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRjb3B5cmlnaHRfdXJsID0gJHRoaXMtPnNhbml0aXplKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJGNvcHlyaWdodF9sYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQkkY29weXJpZ2h0cyA9JiBuZXcgJHRoaXMtPmZlZWQtPmNvcHlyaWdodF9jbGFzcygkY29weXJpZ2h0X3VybCwgJGNvcHlyaWdodF9sYWJlbCk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkY29weXJpZ2h0cyA9ICRjb3B5cmlnaHRzX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gQ1JFRElUUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NyZWRpdCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NyZWRpdCddIGFzICRjcmVkaXQpCgkJCQkJCQl7CgkJCQkJCQkJJGNyZWRpdF9yb2xlID0gbnVsbDsKCQkJCQkJCQkkY3JlZGl0X3NjaGVtZSA9IG51bGw7CgkJCQkJCQkJJGNyZWRpdF9uYW1lID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfcm9sZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydyb2xlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0X3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAndXJuOmVidSc7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY3JlZGl0WydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9uYW1lID0gJHRoaXMtPnNhbml0aXplKCRjcmVkaXRbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJGNyZWRpdHNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNyZWRpdF9jbGFzcygkY3JlZGl0X3JvbGUsICRjcmVkaXRfc2NoZW1lLCAkY3JlZGl0X25hbWUpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRjcmVkaXRzKSkKCQkJCQkJCXsKCQkJCQkJCQkkY3JlZGl0cyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjcmVkaXRzKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NyZWRpdCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjcmVkaXQnXSBhcyAkY3JlZGl0KQoJCQkJCQkJewoJCQkJCQkJCSRjcmVkaXRfcm9sZSA9IG51bGw7CgkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjcmVkaXRzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jcmVkaXRfY2xhc3MoJGNyZWRpdF9yb2xlLCAkY3JlZGl0X3NjaGVtZSwgJGNyZWRpdF9uYW1lKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkY3JlZGl0cykpCgkJCQkJCQl7CgkJCQkJCQkJJGNyZWRpdHMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY3JlZGl0cykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNyZWRpdHMgPSAkY3JlZGl0c19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIERFU0NSSVBUSU9OCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXSkpCgkJCQkJCXsKCQkJCQkJCSRkZXNjcmlwdGlvbiA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydkZXNjcmlwdGlvbiddKSkKCQkJCQkJewoJCQkJCQkJJGRlc2NyaXB0aW9uID0gJHRoaXMtPnNhbml0aXplKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gSEFTSEVTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnaGFzaCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSBhcyAkaGFzaCkKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSBudWxsOwoJCQkJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAnbWQ1JzsKCQkJCQkJCQl9CgkJCQkJCQkJJGhhc2hlc1tdID0gJGFsZ28uJzonLiR2YWx1ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkaGFzaGVzKSkKCQkJCQkJCXsKCQkJCQkJCQkkaGFzaGVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGhhc2hlcykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydoYXNoJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSBhcyAkaGFzaCkKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSBudWxsOwoJCQkJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAnbWQ1JzsKCQkJCQkJCQl9CgkJCQkJCQkJJGhhc2hlc1tdID0gJGFsZ28uJzonLiR2YWx1ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkaGFzaGVzKSkKCQkJCQkJCXsKCQkJCQkJCQkkaGFzaGVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGhhc2hlcykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGhhc2hlcyA9ICRoYXNoZXNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBLRVlXT1JEUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ10pKQoJCQkJCQl7CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJHRlbXAgPSBleHBsb2RlKCcsJywgJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydrZXl3b3JkcyddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCQkJCWZvcmVhY2ggKCR0ZW1wIGFzICR3b3JkKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGtleXdvcmRzW10gPSB0cmltKCR3b3JkKTsKCQkJCQkJCQl9CgkJCQkJCQkJdW5zZXQoJHRlbXApOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRrZXl3b3JkcykpCgkJCQkJCQl7CgkJCQkJCQkJJGtleXdvcmRzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGtleXdvcmRzKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ10pKQoJCQkJCQl7CgkJCQkJCQlpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydrZXl3b3JkcyddWzBdWydkYXRhJ10pKQoJCQkJCQkJewoJCQkJCQkJCSR0ZW1wID0gZXhwbG9kZSgnLCcsICR0aGlzLT5zYW5pdGl6ZSgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSk7CgkJCQkJCQkJZm9yZWFjaCAoJHRlbXAgYXMgJHdvcmQpCgkJCQkJCQkJewoJCQkJCQkJCQkka2V5d29yZHNbXSA9IHRyaW0oJHdvcmQpOwoJCQkJCQkJCX0KCQkJCQkJCQl1bnNldCgkdGVtcCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJGtleXdvcmRzKSkKCQkJCQkJCXsKCQkJCQkJCQkka2V5d29yZHMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgka2V5d29yZHMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRrZXl3b3JkcyA9ICRrZXl3b3Jkc19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIFBMQVlFUgoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddKSkKCQkJCQkJewoJCQkJCQkJJHBsYXllciA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncGxheWVyJ11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddKSkKCQkJCQkJewoJCQkJCQkJJHBsYXllciA9ICR0aGlzLT5zYW5pdGl6ZSgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddWzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHBsYXllciA9ICRwbGF5ZXJfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBSQVRJTkdTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10gYXMgJHJhdGluZykKCQkJCQkJCXsKCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9IG51bGw7CgkJCQkJCQkJJHJhdGluZ192YWx1ZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyYXRpbmdfc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICd1cm46c2ltcGxlJzsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJHJhdGluZ3NbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPnJhdGluZ19jbGFzcygkcmF0aW5nX3NjaGVtZSwgJHJhdGluZ192YWx1ZSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHJhdGluZ3MpKQoJCQkJCQkJewoJCQkJCQkJCSRyYXRpbmdzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHJhdGluZ3MpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3JhdGluZyddIGFzICRyYXRpbmcpCgkJCQkJCQl7CgkJCQkJCQkJJHJhdGluZ19zY2hlbWUgPSBudWxsOwoJCQkJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOnNpbXBsZSc7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRyYXRpbmdzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yYXRpbmdfY2xhc3MoJHJhdGluZ19zY2hlbWUsICRyYXRpbmdfdmFsdWUpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRyYXRpbmdzKSkKCQkJCQkJCXsKCQkJCQkJCQkkcmF0aW5ncyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRyYXRpbmdzKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkcmF0aW5ncyA9ICRyYXRpbmdzX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gUkVTVFJJQ1RJT05TCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmVzdHJpY3Rpb24nXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydyZXN0cmljdGlvbiddIGFzICRyZXN0cmljdGlvbikKCQkJCQkJCXsKCQkJCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gbnVsbDsKCQkJCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWydyZWxhdGlvbnNoaXAnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsncmVsYXRpb25zaGlwJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJHJlc3RyaWN0aW9uc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmVzdHJpY3Rpb25fY2xhc3MoJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCwgJHJlc3RyaWN0aW9uX3R5cGUsICRyZXN0cmljdGlvbl92YWx1ZSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHJlc3RyaWN0aW9ucykpCgkJCQkJCQl7CgkJCQkJCQkJJHJlc3RyaWN0aW9ucyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRyZXN0cmljdGlvbnMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmVzdHJpY3Rpb24nXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmVzdHJpY3Rpb24nXSBhcyAkcmVzdHJpY3Rpb24pCgkJCQkJCQl7CgkJCQkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9IG51bGw7CgkJCQkJCQkJJHJlc3RyaWN0aW9uX3R5cGUgPSBudWxsOwoJCQkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsncmVsYXRpb25zaGlwJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRyZXN0cmljdGlvbnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPnJlc3RyaWN0aW9uX2NsYXNzKCRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAsICRyZXN0cmljdGlvbl90eXBlLCAkcmVzdHJpY3Rpb25fdmFsdWUpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRyZXN0cmljdGlvbnMpKQoJCQkJCQkJewoJCQkJCQkJCSRyZXN0cmljdGlvbnMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkcmVzdHJpY3Rpb25zKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkcmVzdHJpY3Rpb25zID0gJHJlc3RyaWN0aW9uc19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIFRIVU1CTkFJTFMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aHVtYm5haWwnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aHVtYm5haWwnXSBhcyAkdGh1bWJuYWlsKQoJCQkJCQkJewoJCQkJCQkJCSR0aHVtYm5haWxzW10gPSAkdGhpcy0+c2FuaXRpemUoJHRodW1ibmFpbFsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkdGh1bWJuYWlscykpCgkJCQkJCQl7CgkJCQkJCQkJJHRodW1ibmFpbHMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkdGh1bWJuYWlscykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aHVtYm5haWwnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGh1bWJuYWlsJ10gYXMgJHRodW1ibmFpbCkKCQkJCQkJCXsKCQkJCQkJCQkkdGh1bWJuYWlsc1tdID0gJHRoaXMtPnNhbml0aXplKCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHRodW1ibmFpbHMpKQoJCQkJCQkJewoJCQkJCQkJCSR0aHVtYm5haWxzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHRodW1ibmFpbHMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSR0aHVtYm5haWxzID0gJHRodW1ibmFpbHNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBUSVRMRVMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddKSkKCQkJCQkJewoJCQkJCQkJJHRpdGxlID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RpdGxlJ10pKQoJCQkJCQl7CgkJCQkJCQkkdGl0bGUgPSAkdGhpcy0+c2FuaXRpemUoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkdGl0bGUgPSAkdGl0bGVfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zLCAkY2F0ZWdvcmllcywgJGNoYW5uZWxzLCAkY29weXJpZ2h0cywgJGNyZWRpdHMsICRkZXNjcmlwdGlvbiwgJGR1cmF0aW9uLCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlcywgJGhlaWdodCwgJGtleXdvcmRzLCAkbGFuZywgJG1lZGl1bSwgJHBsYXllciwgJHJhdGluZ3MsICRyZXN0cmljdGlvbnMsICRzYW1wbGluZ3JhdGUsICR0aHVtYm5haWxzLCAkdGl0bGUsICR3aWR0aCk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBJZiB3ZSBoYXZlIHN0YW5kYWxvbmUgbWVkaWE6Y29udGVudCB0YWdzLCBsb29wIHRocm91Z2ggdGhlbS4KCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb250ZW50J10pKQoJCQl7CgkJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb250ZW50J10gYXMgJGNvbnRlbnQpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQkJewoJCQkJCQkvLyBBdHRyaWJ1dGVzCgkJCQkJCSRiaXRyYXRlID0gbnVsbDsKCQkJCQkJJGNoYW5uZWxzID0gbnVsbDsKCQkJCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJCQkJJGV4cHJlc3Npb24gPSBudWxsOwoJCQkJCQkkZnJhbWVyYXRlID0gbnVsbDsKCQkJCQkJJGhlaWdodCA9IG51bGw7CgkJCQkJCSRqYXZhc2NyaXB0ID0gbnVsbDsKCQkJCQkJJGxhbmcgPSBudWxsOwoJCQkJCQkkbGVuZ3RoID0gbnVsbDsKCQkJCQkJJG1lZGl1bSA9IG51bGw7CgkJCQkJCSRzYW1wbGluZ3JhdGUgPSBudWxsOwoJCQkJCQkkdHlwZSA9IG51bGw7CgkJCQkJCSR1cmwgPSBudWxsOwoJCQkJCQkkd2lkdGggPSBudWxsOwoKCQkJCQkJLy8gRWxlbWVudHMKCQkJCQkJJGNhcHRpb25zID0gbnVsbDsKCQkJCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkJCQkkY29weXJpZ2h0cyA9IG51bGw7CgkJCQkJCSRjcmVkaXRzID0gbnVsbDsKCQkJCQkJJGRlc2NyaXB0aW9uID0gbnVsbDsKCQkJCQkJJGhhc2hlcyA9IG51bGw7CgkJCQkJCSRrZXl3b3JkcyA9IG51bGw7CgkJCQkJCSRwbGF5ZXIgPSBudWxsOwoJCQkJCQkkcmF0aW5ncyA9IG51bGw7CgkJCQkJCSRyZXN0cmljdGlvbnMgPSBudWxsOwoJCQkJCQkkdGh1bWJuYWlscyA9IG51bGw7CgkJCQkJCSR0aXRsZSA9IG51bGw7CgoJCQkJCQkvLyBTdGFydCBjaGVja2luZyB0aGUgYXR0cmlidXRlcyBvZiBtZWRpYTpjb250ZW50CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnYml0cmF0ZSddKSkKCQkJCQkJewoJCQkJCQkJJGJpdHJhdGUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2JpdHJhdGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2NoYW5uZWxzJ10pKQoJCQkJCQl7CgkJCQkJCQkkY2hhbm5lbHMgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2NoYW5uZWxzJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydkdXJhdGlvbiddKSkKCQkJCQkJewoJCQkJCQkJJGR1cmF0aW9uID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydkdXJhdGlvbiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGR1cmF0aW9uID0gJGR1cmF0aW9uX3BhcmVudDsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2V4cHJlc3Npb24nXSkpCgkJCQkJCXsKCQkJCQkJCSRleHByZXNzaW9uID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydleHByZXNzaW9uJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydmcmFtZXJhdGUnXSkpCgkJCQkJCXsKCQkJCQkJCSRmcmFtZXJhdGUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZyYW1lcmF0ZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnaGVpZ2h0J10pKQoJCQkJCQl7CgkJCQkJCQkkaGVpZ2h0ID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydoZWlnaHQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSkpCgkJCQkJCXsKCQkJCQkJCSRsYW5nID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydsYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydmaWxlU2l6ZSddKSkKCQkJCQkJewoJCQkJCQkJJGxlbmd0aCA9IGNlaWwoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZpbGVTaXplJ10pOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnbWVkaXVtJ10pKQoJCQkJCQl7CgkJCQkJCQkkbWVkaXVtID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydtZWRpdW0nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3NhbXBsaW5ncmF0ZSddKSkKCQkJCQkJewoJCQkJCQkJJHNhbXBsaW5ncmF0ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnc2FtcGxpbmdyYXRlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCQl7CgkJCQkJCQkkdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnd2lkdGgnXSkpCgkJCQkJCXsKCQkJCQkJCSR3aWR0aCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnd2lkdGgnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoKCQkJCQkJLy8gQ2hlY2tpbmcgdGhlIG90aGVyIG9wdGlvbmFsIG1lZGlhOiBlbGVtZW50cy4gUHJpb3JpdHk6IG1lZGlhOmNvbnRlbnQsIG1lZGlhOmdyb3VwLCBpdGVtLCBjaGFubmVsCgoJCQkJCQkvLyBDQVBUSU9OUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RleHQnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0ZXh0J10gYXMgJGNhcHRpb24pCgkJCQkJCQl7CgkJCQkJCQkJJGNhcHRpb25fdHlwZSA9IG51bGw7CgkJCQkJCQkJJGNhcHRpb25fbGFuZyA9IG51bGw7CgkJCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl9lbmRUaW1lID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl90ZXh0ID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX2xhbmcgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX3N0YXJ0VGltZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnc3RhcnQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl9lbmRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fdGV4dCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQkkY2FwdGlvbnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhcHRpb25fY2xhc3MoJGNhcHRpb25fdHlwZSwgJGNhcHRpb25fbGFuZywgJGNhcHRpb25fc3RhcnRUaW1lLCAkY2FwdGlvbl9lbmRUaW1lLCAkY2FwdGlvbl90ZXh0KTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkY2FwdGlvbnMpKQoJCQkJCQkJewoJCQkJCQkJCSRjYXB0aW9ucyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXB0aW9ucykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNhcHRpb25zID0gJGNhcHRpb25zX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gQ0FURUdPUklFUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NhdGVnb3J5J10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgoYXJyYXkpICRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjYXRlZ29yeSddIGFzICRjYXRlZ29yeSkKCQkJCQkJCXsKCQkJCQkJCQkkdGVybSA9IG51bGw7CgkJCQkJCQkJJHNjaGVtZSA9IG51bGw7CgkJCQkJCQkJJGxhYmVsID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRzY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJHNjaGVtZSA9ICdodHRwOi8vc2VhcmNoLnlhaG9vLmNvbS9tcnNzL2NhdGVnb3J5X3NjaGVtYSc7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmIChpc19hcnJheSgkY2F0ZWdvcmllcykgJiYgaXNfYXJyYXkoJGNhdGVnb3JpZXNfcGFyZW50KSkKCQkJCQkJewoJCQkJCQkJJGNhdGVnb3JpZXMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZShhcnJheV9tZXJnZSgkY2F0ZWdvcmllcywgJGNhdGVnb3JpZXNfcGFyZW50KSkpOwoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoaXNfYXJyYXkoJGNhdGVnb3JpZXMpKQoJCQkJCQl7CgkJCQkJCQkkY2F0ZWdvcmllcyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXRlZ29yaWVzKSk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc19hcnJheSgkY2F0ZWdvcmllc19wYXJlbnQpKQoJCQkJCQl7CgkJCQkJCQkkY2F0ZWdvcmllcyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXRlZ29yaWVzX3BhcmVudCkpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkJCQl9CgoJCQkJCQkvLyBDT1BZUklHSFRTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J10pKQoJCQkJCQl7CgkJCQkJCQkkY29weXJpZ2h0X3VybCA9IG51bGw7CgkJCQkJCQkkY29weXJpZ2h0X2xhYmVsID0gbnVsbDsKCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQkJCXsKCQkJCQkJCQkkY29weXJpZ2h0X3VybCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnZGF0YSddKSkKCQkJCQkJCXsKCQkJCQkJCQkkY29weXJpZ2h0X2xhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJJGNvcHlyaWdodHMgPSYgbmV3ICR0aGlzLT5mZWVkLT5jb3B5cmlnaHRfY2xhc3MoJGNvcHlyaWdodF91cmwsICRjb3B5cmlnaHRfbGFiZWwpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNvcHlyaWdodHMgPSAkY29weXJpZ2h0c19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIENSRURJVFMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjcmVkaXQnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjcmVkaXQnXSBhcyAkY3JlZGl0KQoJCQkJCQkJewoJCQkJCQkJCSRjcmVkaXRfcm9sZSA9IG51bGw7CgkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjcmVkaXRzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jcmVkaXRfY2xhc3MoJGNyZWRpdF9yb2xlLCAkY3JlZGl0X3NjaGVtZSwgJGNyZWRpdF9uYW1lKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkY3JlZGl0cykpCgkJCQkJCQl7CgkJCQkJCQkJJGNyZWRpdHMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY3JlZGl0cykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNyZWRpdHMgPSAkY3JlZGl0c19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIERFU0NSSVBUSU9OCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXSkpCgkJCQkJCXsKCQkJCQkJCSRkZXNjcmlwdGlvbiA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gSEFTSEVTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnaGFzaCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSBhcyAkaGFzaCkKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSBudWxsOwoJCQkJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAnbWQ1JzsKCQkJCQkJCQl9CgkJCQkJCQkJJGhhc2hlc1tdID0gJGFsZ28uJzonLiR2YWx1ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkaGFzaGVzKSkKCQkJCQkJCXsKCQkJCQkJCQkkaGFzaGVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGhhc2hlcykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGhhc2hlcyA9ICRoYXNoZXNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBLRVlXT1JEUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ10pKQoJCQkJCQl7CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJHRlbXAgPSBleHBsb2RlKCcsJywgJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydrZXl3b3JkcyddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCQkJCWZvcmVhY2ggKCR0ZW1wIGFzICR3b3JkKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGtleXdvcmRzW10gPSB0cmltKCR3b3JkKTsKCQkJCQkJCQl9CgkJCQkJCQkJdW5zZXQoJHRlbXApOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRrZXl3b3JkcykpCgkJCQkJCQl7CgkJCQkJCQkJJGtleXdvcmRzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGtleXdvcmRzKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkka2V5d29yZHMgPSAka2V5d29yZHNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBQTEFZRVIKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydwbGF5ZXInXSkpCgkJCQkJCXsKCQkJCQkJCSRwbGF5ZXIgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddWzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHBsYXllciA9ICRwbGF5ZXJfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBSQVRJTkdTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10gYXMgJHJhdGluZykKCQkJCQkJCXsKCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9IG51bGw7CgkJCQkJCQkJJHJhdGluZ192YWx1ZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyYXRpbmdfc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICd1cm46c2ltcGxlJzsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJHJhdGluZ3NbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPnJhdGluZ19jbGFzcygkcmF0aW5nX3NjaGVtZSwgJHJhdGluZ192YWx1ZSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHJhdGluZ3MpKQoJCQkJCQkJewoJCQkJCQkJCSRyYXRpbmdzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHJhdGluZ3MpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRyYXRpbmdzID0gJHJhdGluZ3NfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBSRVNUUklDVElPTlMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydyZXN0cmljdGlvbiddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3Jlc3RyaWN0aW9uJ10gYXMgJHJlc3RyaWN0aW9uKQoJCQkJCQkJewoJCQkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSBudWxsOwoJCQkJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gbnVsbDsKCQkJCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWydyZWxhdGlvbnNoaXAnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQkkcmVzdHJpY3Rpb25zW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yZXN0cmljdGlvbl9jbGFzcygkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkcmVzdHJpY3Rpb25zKSkKCQkJCQkJCXsKCQkJCQkJCQkkcmVzdHJpY3Rpb25zID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHJlc3RyaWN0aW9ucykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHJlc3RyaWN0aW9ucyA9ICRyZXN0cmljdGlvbnNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBUSFVNQk5BSUxTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGh1bWJuYWlsJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGh1bWJuYWlsJ10gYXMgJHRodW1ibmFpbCkKCQkJCQkJCXsKCQkJCQkJCQkkdGh1bWJuYWlsc1tdID0gJHRoaXMtPnNhbml0aXplKCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHRodW1ibmFpbHMpKQoJCQkJCQkJewoJCQkJCQkJCSR0aHVtYm5haWxzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHRodW1ibmFpbHMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSR0aHVtYm5haWxzID0gJHRodW1ibmFpbHNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBUSVRMRVMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddKSkKCQkJCQkJewoJCQkJCQkJJHRpdGxlID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkdGl0bGUgPSAkdGl0bGVfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zLCAkY2F0ZWdvcmllcywgJGNoYW5uZWxzLCAkY29weXJpZ2h0cywgJGNyZWRpdHMsICRkZXNjcmlwdGlvbiwgJGR1cmF0aW9uLCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlcywgJGhlaWdodCwgJGtleXdvcmRzLCAkbGFuZywgJG1lZGl1bSwgJHBsYXllciwgJHJhdGluZ3MsICRyZXN0cmljdGlvbnMsICRzYW1wbGluZ3JhdGUsICR0aHVtYm5haWxzLCAkdGl0bGUsICR3aWR0aCk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2xpbmsnKSBhcyAkbGluaykKCQkJewoJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pICYmICFlbXB0eSgkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10pICYmICRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSA9PSAnZW5jbG9zdXJlJykKCQkJCXsKCQkJCQkvLyBBdHRyaWJ1dGVzCgkJCQkJJGJpdHJhdGUgPSBudWxsOwoJCQkJCSRjaGFubmVscyA9IG51bGw7CgkJCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJCQkkZXhwcmVzc2lvbiA9IG51bGw7CgkJCQkJJGZyYW1lcmF0ZSA9IG51bGw7CgkJCQkJJGhlaWdodCA9IG51bGw7CgkJCQkJJGphdmFzY3JpcHQgPSBudWxsOwoJCQkJCSRsYW5nID0gbnVsbDsKCQkJCQkkbGVuZ3RoID0gbnVsbDsKCQkJCQkkbWVkaXVtID0gbnVsbDsKCQkJCQkkc2FtcGxpbmdyYXRlID0gbnVsbDsKCQkJCQkkdHlwZSA9IG51bGw7CgkJCQkJJHVybCA9IG51bGw7CgkJCQkJJHdpZHRoID0gbnVsbDsKCgkJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCXsKCQkJCQkJJHR5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydsZW5ndGgnXSkpCgkJCQkJewoJCQkJCQkkbGVuZ3RoID0gY2VpbCgkbGlua1snYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pOwoJCQkJCX0KCgkJCQkJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBncm91cCBvciBjb250ZW50IGZvciB0aGVzZSwgd2UnbGwganVzdCBwYXNzIHRoZSAnKl9wYXJlbnQnIHZhcmlhYmxlcyBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zX3BhcmVudCwgJGNhdGVnb3JpZXNfcGFyZW50LCAkY2hhbm5lbHMsICRjb3B5cmlnaHRzX3BhcmVudCwgJGNyZWRpdHNfcGFyZW50LCAkZGVzY3JpcHRpb25fcGFyZW50LCAkZHVyYXRpb25fcGFyZW50LCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlc19wYXJlbnQsICRoZWlnaHQsICRrZXl3b3Jkc19wYXJlbnQsICRsYW5nLCAkbWVkaXVtLCAkcGxheWVyX3BhcmVudCwgJHJhdGluZ3NfcGFyZW50LCAkcmVzdHJpY3Rpb25zX3BhcmVudCwgJHNhbXBsaW5ncmF0ZSwgJHRodW1ibmFpbHNfcGFyZW50LCAkdGl0bGVfcGFyZW50LCAkd2lkdGgpOwoJCQkJfQoJCQl9CgoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2xpbmsnKSBhcyAkbGluaykKCQkJewoJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pICYmICFlbXB0eSgkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10pICYmICRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSA9PSAnZW5jbG9zdXJlJykKCQkJCXsKCQkJCQkvLyBBdHRyaWJ1dGVzCgkJCQkJJGJpdHJhdGUgPSBudWxsOwoJCQkJCSRjaGFubmVscyA9IG51bGw7CgkJCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJCQkkZXhwcmVzc2lvbiA9IG51bGw7CgkJCQkJJGZyYW1lcmF0ZSA9IG51bGw7CgkJCQkJJGhlaWdodCA9IG51bGw7CgkJCQkJJGphdmFzY3JpcHQgPSBudWxsOwoJCQkJCSRsYW5nID0gbnVsbDsKCQkJCQkkbGVuZ3RoID0gbnVsbDsKCQkJCQkkbWVkaXVtID0gbnVsbDsKCQkJCQkkc2FtcGxpbmdyYXRlID0gbnVsbDsKCQkJCQkkdHlwZSA9IG51bGw7CgkJCQkJJHVybCA9IG51bGw7CgkJCQkJJHdpZHRoID0gbnVsbDsKCgkJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCXsKCQkJCQkJJHR5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydsZW5ndGgnXSkpCgkJCQkJewoJCQkJCQkkbGVuZ3RoID0gY2VpbCgkbGlua1snYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pOwoJCQkJCX0KCgkJCQkJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBncm91cCBvciBjb250ZW50IGZvciB0aGVzZSwgd2UnbGwganVzdCBwYXNzIHRoZSAnKl9wYXJlbnQnIHZhcmlhYmxlcyBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zX3BhcmVudCwgJGNhdGVnb3JpZXNfcGFyZW50LCAkY2hhbm5lbHMsICRjb3B5cmlnaHRzX3BhcmVudCwgJGNyZWRpdHNfcGFyZW50LCAkZGVzY3JpcHRpb25fcGFyZW50LCAkZHVyYXRpb25fcGFyZW50LCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlc19wYXJlbnQsICRoZWlnaHQsICRrZXl3b3Jkc19wYXJlbnQsICRsYW5nLCAkbWVkaXVtLCAkcGxheWVyX3BhcmVudCwgJHJhdGluZ3NfcGFyZW50LCAkcmVzdHJpY3Rpb25zX3BhcmVudCwgJHNhbXBsaW5ncmF0ZSwgJHRodW1ibmFpbHNfcGFyZW50LCAkdGl0bGVfcGFyZW50LCAkd2lkdGgpOwoJCQkJfQoJCQl9CgoJCQlpZiAoJGVuY2xvc3VyZSA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKCcnLCAnZW5jbG9zdXJlJykpCgkJCXsKCQkJCWlmIChpc3NldCgkZW5jbG9zdXJlWzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQl7CgkJCQkJLy8gQXR0cmlidXRlcwoJCQkJCSRiaXRyYXRlID0gbnVsbDsKCQkJCQkkY2hhbm5lbHMgPSBudWxsOwoJCQkJCSRkdXJhdGlvbiA9IG51bGw7CgkJCQkJJGV4cHJlc3Npb24gPSBudWxsOwoJCQkJCSRmcmFtZXJhdGUgPSBudWxsOwoJCQkJCSRoZWlnaHQgPSBudWxsOwoJCQkJCSRqYXZhc2NyaXB0ID0gbnVsbDsKCQkJCQkkbGFuZyA9IG51bGw7CgkJCQkJJGxlbmd0aCA9IG51bGw7CgkJCQkJJG1lZGl1bSA9IG51bGw7CgkJCQkJJHNhbXBsaW5ncmF0ZSA9IG51bGw7CgkJCQkJJHR5cGUgPSBudWxsOwoJCQkJCSR1cmwgPSBudWxsOwoJCQkJCSR3aWR0aCA9IG51bGw7CgoJCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGVuY2xvc3VyZVswXSkpOwoJCQkJCWlmIChpc3NldCgkZW5jbG9zdXJlWzBdWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCXsKCQkJCQkJJHR5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pKQoJCQkJCXsKCQkJCQkJJGxlbmd0aCA9IGNlaWwoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pOwoJCQkJCX0KCgkJCQkJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBncm91cCBvciBjb250ZW50IGZvciB0aGVzZSwgd2UnbGwganVzdCBwYXNzIHRoZSAnKl9wYXJlbnQnIHZhcmlhYmxlcyBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zX3BhcmVudCwgJGNhdGVnb3JpZXNfcGFyZW50LCAkY2hhbm5lbHMsICRjb3B5cmlnaHRzX3BhcmVudCwgJGNyZWRpdHNfcGFyZW50LCAkZGVzY3JpcHRpb25fcGFyZW50LCAkZHVyYXRpb25fcGFyZW50LCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlc19wYXJlbnQsICRoZWlnaHQsICRrZXl3b3Jkc19wYXJlbnQsICRsYW5nLCAkbWVkaXVtLCAkcGxheWVyX3BhcmVudCwgJHJhdGluZ3NfcGFyZW50LCAkcmVzdHJpY3Rpb25zX3BhcmVudCwgJHNhbXBsaW5ncmF0ZSwgJHRodW1ibmFpbHNfcGFyZW50LCAkdGl0bGVfcGFyZW50LCAkd2lkdGgpOwoJCQkJfQoJCQl9CgoJCQlpZiAoc2l6ZW9mKCR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ10pID09IDAgJiYgKCR1cmwgfHwgJHR5cGUgfHwgJGxlbmd0aCB8fCAkYml0cmF0ZSB8fCAkY2FwdGlvbnNfcGFyZW50IHx8ICRjYXRlZ29yaWVzX3BhcmVudCB8fCAkY2hhbm5lbHMgfHwgJGNvcHlyaWdodHNfcGFyZW50IHx8ICRjcmVkaXRzX3BhcmVudCB8fCAkZGVzY3JpcHRpb25fcGFyZW50IHx8ICRkdXJhdGlvbl9wYXJlbnQgfHwgJGV4cHJlc3Npb24gfHwgJGZyYW1lcmF0ZSB8fCAkaGFzaGVzX3BhcmVudCB8fCAkaGVpZ2h0IHx8ICRrZXl3b3Jkc19wYXJlbnQgfHwgJGxhbmcgfHwgJG1lZGl1bSB8fCAkcGxheWVyX3BhcmVudCB8fCAkcmF0aW5nc19wYXJlbnQgfHwgJHJlc3RyaWN0aW9uc19wYXJlbnQgfHwgJHNhbXBsaW5ncmF0ZSB8fCAkdGh1bWJuYWlsc19wYXJlbnQgfHwgJHRpdGxlX3BhcmVudCB8fCAkd2lkdGgpKQoJCQl7CgkJCQkvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGdyb3VwIG9yIGNvbnRlbnQgZm9yIHRoZXNlLCB3ZSdsbCBqdXN0IHBhc3MgdGhlICcqX3BhcmVudCcgdmFyaWFibGVzIGRpcmVjdGx5IHRvIHRoZSBjb25zdHJ1Y3RvcgoJCQkJJHRoaXMtPmRhdGFbJ2VuY2xvc3VyZXMnXVtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+ZW5jbG9zdXJlX2NsYXNzKCR1cmwsICR0eXBlLCAkbGVuZ3RoLCAkdGhpcy0+ZmVlZC0+amF2YXNjcmlwdCwgJGJpdHJhdGUsICRjYXB0aW9uc19wYXJlbnQsICRjYXRlZ29yaWVzX3BhcmVudCwgJGNoYW5uZWxzLCAkY29weXJpZ2h0c19wYXJlbnQsICRjcmVkaXRzX3BhcmVudCwgJGRlc2NyaXB0aW9uX3BhcmVudCwgJGR1cmF0aW9uX3BhcmVudCwgJGV4cHJlc3Npb24sICRmcmFtZXJhdGUsICRoYXNoZXNfcGFyZW50LCAkaGVpZ2h0LCAka2V5d29yZHNfcGFyZW50LCAkbGFuZywgJG1lZGl1bSwgJHBsYXllcl9wYXJlbnQsICRyYXRpbmdzX3BhcmVudCwgJHJlc3RyaWN0aW9uc19wYXJlbnQsICRzYW1wbGluZ3JhdGUsICR0aHVtYm5haWxzX3BhcmVudCwgJHRpdGxlX3BhcmVudCwgJHdpZHRoKTsKCQkJfQoKCQkJJHRoaXMtPmRhdGFbJ2VuY2xvc3VyZXMnXSA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ10pKTsKCQl9CgkJaWYgKCFlbXB0eSgkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xhdGl0dWRlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xhdCcpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9HRU9SU1MsICdwb2ludCcpKSAmJiBwcmVnX21hdGNoKCcvXigoPzotKT9bMC05XSsoPzpcLlswLTldKykpICgoPzotKT9bMC05XSsoPzpcLlswLTldKykpJC8nLCAkcmV0dXJuWzBdWydkYXRhJ10sICRtYXRjaCkpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkbWF0Y2hbMV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfbG9uZ2l0dWRlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xvbmcnKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9XM0NfQkFTSUNfR0VPLCAnbG9uJykpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkcmV0dXJuWzBdWydkYXRhJ107CgkJfQoJCWVsc2VpZiAoKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0dFT1JTUywgJ3BvaW50JykpICYmIHByZWdfbWF0Y2goJy9eKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkgKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkkLycsICRyZXR1cm5bMF1bJ2RhdGEnXSwgJG1hdGNoKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRtYXRjaFsyXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9zb3VyY2UoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnc291cmNlJykpCgkJewoJCQlyZXR1cm4gbmV3ICR0aGlzLT5mZWVkLT5zb3VyY2VfY2xhc3MoJHRoaXMsICRyZXR1cm5bMF0pOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBDcmVhdGVzIHRoZSBhZGRfdG9fKiBtZXRob2RzJyByZXR1cm4gZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHBhcmFtIHN0cmluZyAkaXRlbV91cmwgU3RyaW5nIHRvIHByZWZpeCB0byB0aGUgaXRlbSBwZXJtYWxpbmsKCSAqIEBwYXJhbSBzdHJpbmcgJHRpdGxlX3VybCBTdHJpbmcgdG8gcHJlZml4IHRvIHRoZSBpdGVtIHRpdGxlCgkgKiAoYW5kIHN1ZmZpeCB0byB0aGUgaXRlbSBwZXJtYWxpbmspCgkgKiBAcmV0dXJuIG1peGVkIFVSTCBpZiBmZWVkIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlCgkgKi8KCWZ1bmN0aW9uIGFkZF90b19zZXJ2aWNlKCRpdGVtX3VybCwgJHRpdGxlX3VybCA9IG51bGwsICRzdW1tYXJ5X3VybCA9IG51bGwpCgl7CgkJaWYgKCR0aGlzLT5nZXRfcGVybWFsaW5rKCkgIT09IG51bGwpCgkJewoJCQkkcmV0dXJuID0gJHRoaXMtPnNhbml0aXplKCRpdGVtX3VybCwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpIC4gcmF3dXJsZW5jb2RlKCR0aGlzLT5nZXRfcGVybWFsaW5rKCkpOwoJCQlpZiAoJHRpdGxlX3VybCAhPT0gbnVsbCAmJiAkdGhpcy0+Z2V0X3RpdGxlKCkgIT09IG51bGwpCgkJCXsKCQkJCSRyZXR1cm4gLj0gJHRoaXMtPnNhbml0aXplKCR0aXRsZV91cmwsIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKSAuIHJhd3VybGVuY29kZSgkdGhpcy0+Z2V0X3RpdGxlKCkpOwoJCQl9CgkJCWlmICgkc3VtbWFyeV91cmwgIT09IG51bGwgJiYgJHRoaXMtPmdldF9kZXNjcmlwdGlvbigpICE9PSBudWxsKQoJCQl7CgkJCQkkcmV0dXJuIC49ICR0aGlzLT5zYW5pdGl6ZSgkc3VtbWFyeV91cmwsIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKSAuIHJhd3VybGVuY29kZSgkdGhpcy0+Z2V0X2Rlc2NyaXB0aW9uKCkpOwoJCQl9CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX2JsaW5rbGlzdCgpCgl7CgkJcmV0dXJuICR0aGlzLT5hZGRfdG9fc2VydmljZSgnaHR0cDovL3d3dy5ibGlua2xpc3QuY29tL2luZGV4LnBocD9BY3Rpb249QmxpbmsvYWRkYmxpbmsucGhwJkRlc2NyaXB0aW9uPSZVcmw9JywgJyZUaXRsZT0nKTsKCX0KCglmdW5jdGlvbiBhZGRfdG9fYmxvZ21hcmtzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vYmxvZ21hcmtzLm5ldC9teS9uZXcucGhwP21pbmk9MSZzaW1wbGU9MSZ1cmw9JywgJyZ0aXRsZT0nKTsKCX0KCglmdW5jdGlvbiBhZGRfdG9fZGVsaWNpb3VzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vZGVsLmljaW8udXMvcG9zdC8/dj00JnVybD0nLCAnJnRpdGxlPScpOwoJfQoKCWZ1bmN0aW9uIGFkZF90b19kaWdnKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vZGlnZy5jb20vc3VibWl0P3VybD0nLCAnJnRpdGxlPScsICcmYm9keXRleHQ9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX2Z1cmwoKQoJewoJCXJldHVybiAkdGhpcy0+YWRkX3RvX3NlcnZpY2UoJ2h0dHA6Ly93d3cuZnVybC5uZXQvc3RvcmVJdC5qc3A/dT0nLCAnJnQ9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX21hZ25vbGlhKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vbWEuZ25vbGlhLmNvbS9ib29rbWFya2xldC9hZGQ/dXJsPScsICcmdGl0bGU9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX215d2ViMjAoKQoJewoJCXJldHVybiAkdGhpcy0+YWRkX3RvX3NlcnZpY2UoJ2h0dHA6Ly9teXdlYjIuc2VhcmNoLnlhaG9vLmNvbS9teXJlc3VsdHMvYm9va21hcmtsZXQ/dT0nLCAnJnQ9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX25ld3N2aW5lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vd3d3Lm5ld3N2aW5lLmNvbS9fd2luZS9zYXZlP3U9JywgJyZoPScpOwoJfQoKCWZ1bmN0aW9uIGFkZF90b19yZWRkaXQoKQoJewoJCXJldHVybiAkdGhpcy0+YWRkX3RvX3NlcnZpY2UoJ2h0dHA6Ly9yZWRkaXQuY29tL3N1Ym1pdD91cmw9JywgJyZ0aXRsZT0nKTsKCX0KCglmdW5jdGlvbiBhZGRfdG9fc2VnbmFsbygpCgl7CgkJcmV0dXJuICR0aGlzLT5hZGRfdG9fc2VydmljZSgnaHR0cDovL3NlZ25hbG8uY29tL3Bvc3QuaHRtbC5waHA/dXJsPScsICcmdGl0bGU9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX3NpbXB5KCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vd3d3LnNpbXB5LmNvbS9zaW1weS9MaW5rQWRkLmRvP2hyZWY9JywgJyZ0aXRsZT0nKTsKCX0KCglmdW5jdGlvbiBhZGRfdG9fc3B1cmwoKQoJewoJCXJldHVybiAkdGhpcy0+YWRkX3RvX3NlcnZpY2UoJ2h0dHA6Ly93d3cuc3B1cmwubmV0L3NwdXJsLnBocD92PTMmdXJsPScsICcmdGl0bGU9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX3dpc3RzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vd2lzdHMuY29tL3IucGhwP2M9JnI9JywgJyZ0aXRsZT0nKTsKCX0KCglmdW5jdGlvbiBzZWFyY2hfdGVjaG5vcmF0aSgpCgl7CgkJcmV0dXJuICR0aGlzLT5hZGRfdG9fc2VydmljZSgnaHR0cDovL3d3dy50ZWNobm9yYXRpLmNvbS9zZWFyY2gvJyk7Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9Tb3VyY2UKewoJdmFyICRpdGVtOwoJdmFyICRkYXRhID0gYXJyYXkoKTsKCglmdW5jdGlvbiBTaW1wbGVQaWVfU291cmNlKCRpdGVtLCAkZGF0YSkKCXsKCQkkdGhpcy0+aXRlbSA9ICRpdGVtOwoJCSR0aGlzLT5kYXRhID0gJGRhdGE7Cgl9CgoJZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMtPmRhdGEpKTsKCX0KCgkvKioKCSAqIFJlbW92ZSBpdGVtcyB0aGF0IGxpbmsgYmFjayB0byB0aGlzIGJlZm9yZSBkZXN0cm95aW5nIHRoaXMgb2JqZWN0CgkgKi8KCWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQoJewoJCXVuc2V0KCR0aGlzLT5pdGVtKTsKCX0KCglmdW5jdGlvbiBnZXRfc291cmNlX3RhZ3MoJG5hbWVzcGFjZSwgJHRhZykKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5kYXRhWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2Jhc2UoJGVsZW1lbnQgPSBhcnJheSgpKQoJewoJCXJldHVybiAkdGhpcy0+aXRlbS0+Z2V0X2Jhc2UoJGVsZW1lbnQpOwoJfQoKCWZ1bmN0aW9uIHNhbml0aXplKCRkYXRhLCAkdHlwZSwgJGJhc2UgPSAnJykKCXsKCQlyZXR1cm4gJHRoaXMtPml0ZW0tPnNhbml0aXplKCRkYXRhLCAkdHlwZSwgJGJhc2UpOwoJfQoKCWZ1bmN0aW9uIGdldF9pdGVtKCkKCXsKCQlyZXR1cm4gJHRoaXMtPml0ZW07Cgl9CgoJZnVuY3Rpb24gZ2V0X3RpdGxlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU2ltcGxlUGllX01pc2M6OmF0b21fMDNfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKCcnLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX01BWUJFX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NhdGVnb3J5KCRrZXkgPSAwKQoJewoJCSRjYXRlZ29yaWVzID0gJHRoaXMtPmdldF9jYXRlZ29yaWVzKCk7CgkJaWYgKGlzc2V0KCRjYXRlZ29yaWVzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY2F0ZWdvcmllc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jYXRlZ29yaWVzKCkKCXsKCQkkY2F0ZWdvcmllcyA9IGFycmF5KCk7CgoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdjYXRlZ29yeScpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSR0ZXJtID0gbnVsbDsKCQkJJHNjaGVtZSA9IG51bGw7CgkJCSRsYWJlbCA9IG51bGw7CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3Rlcm0nXSkpCgkJCXsKCQkJCSR0ZXJtID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGVybSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJewoJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10pKQoJCQl7CgkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGVybSwgJHNjaGVtZSwgJGxhYmVsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKCcnLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkY2F0ZWdvcmllc1tdID0mIG5ldyAkdGhpcy0+aXRlbS0+ZmVlZC0+Y2F0ZWdvcnlfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdzdWJqZWN0JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPml0ZW0tPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnc3ViamVjdCcpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCgkJaWYgKCFlbXB0eSgkY2F0ZWdvcmllcykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY2F0ZWdvcmllcyk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfYXV0aG9yKCRrZXkgPSAwKQoJewoJCSRhdXRob3JzID0gJHRoaXMtPmdldF9hdXRob3JzKCk7CgkJaWYgKGlzc2V0KCRhdXRob3JzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkYXV0aG9yc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9hdXRob3JzKCkKCXsKCQkkYXV0aG9ycyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2F1dGhvcicpIGFzICRhdXRob3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmkgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmkgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+aXRlbS0+ZmVlZC0+YXV0aG9yX2NsYXNzKCRuYW1lLCAkdXJpLCAkZW1haWwpOwoJCQl9CgkJfQoJCWlmICgkYXV0aG9yID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdhdXRob3InKSkKCQl7CgkJCSRuYW1lID0gbnVsbDsKCQkJJHVybCA9IG51bGw7CgkJCSRlbWFpbCA9IG51bGw7CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRlbWFpbCA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmwgIT09IG51bGwpCgkJCXsKCQkJCSRhdXRob3JzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5hdXRob3JfY2xhc3MoJG5hbWUsICR1cmwsICRlbWFpbCk7CgkJCX0KCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdjcmVhdG9yJykgYXMgJGF1dGhvcikKCQl7CgkJCSRhdXRob3JzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5hdXRob3JfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnY3JlYXRvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+aXRlbS0+ZmVlZC0+YXV0aG9yX2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdhdXRob3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPml0ZW0tPmZlZWQtPmF1dGhvcl9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgoJCWlmICghZW1wdHkoJGF1dGhvcnMpKQoJCXsKCQkJcmV0dXJuIFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGF1dGhvcnMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRyaWJ1dG9yKCRrZXkgPSAwKQoJewoJCSRjb250cmlidXRvcnMgPSAkdGhpcy0+Z2V0X2NvbnRyaWJ1dG9ycygpOwoJCWlmIChpc3NldCgkY29udHJpYnV0b3JzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY29udHJpYnV0b3JzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRyaWJ1dG9ycygpCgl7CgkJJGNvbnRyaWJ1dG9ycyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2NvbnRyaWJ1dG9yJykgYXMgJGNvbnRyaWJ1dG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJpID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJpID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkY29udHJpYnV0b3JzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5hdXRob3JfY2xhc3MoJG5hbWUsICR1cmksICRlbWFpbCk7CgkJCX0KCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NvbnRyaWJ1dG9yJykgYXMgJGNvbnRyaWJ1dG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJsID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJsICE9PSBudWxsKQoJCQl7CgkJCQkkY29udHJpYnV0b3JzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5hdXRob3JfY2xhc3MoJG5hbWUsICR1cmwsICRlbWFpbCk7CgkJCX0KCQl9CgoJCWlmICghZW1wdHkoJGNvbnRyaWJ1dG9ycykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY29udHJpYnV0b3JzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9saW5rKCRrZXkgPSAwLCAkcmVsID0gJ2FsdGVybmF0ZScpCgl7CgkJJGxpbmtzID0gJHRoaXMtPmdldF9saW5rcygkcmVsKTsKCQlpZiAoaXNzZXQoJGxpbmtzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkbGlua3NbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEFkZGVkIGZvciBwYXJpdHkgYmV0d2VlbiB0aGUgcGFyZW50LWxldmVsIGFuZCB0aGUgaXRlbS9lbnRyeS1sZXZlbC4KCSAqLwoJZnVuY3Rpb24gZ2V0X3Blcm1hbGluaygpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRfbGluaygwKTsKCX0KCglmdW5jdGlvbiBnZXRfbGlua3MoJHJlbCA9ICdhbHRlcm5hdGUnKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ10pKQoJCXsKCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ10gPSBhcnJheSgpOwoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdsaW5rJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSkpCgkJCQkJewoJCQkJCQkkbGlua19yZWwgPSAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddKSkgPyAkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10gOiAnYWx0ZXJuYXRlJzsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGxpbmtfcmVsXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmspKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnbGluaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pKQoJCQkJCXsKCQkJCQkJJGxpbmtfcmVsID0gKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSkpID8gJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddIDogJ2FsdGVybmF0ZSc7CgkJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRsaW5rX3JlbF1bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncygnJywgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCgkJCSRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+ZGF0YVsnbGlua3MnXSk7CgkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCXsKCQkJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfaXNlZ21lbnRfbnpfbmMoJGtleSkpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0pKQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldLCAkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldKTsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlaWYgKHN1YnN0cigka2V5LCAwLCA0MSkgPT0gU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bc3Vic3RyKCRrZXksIDQxKV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV07CgkJCQl9CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSA9IGFycmF5X3VuaXF1ZSgkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSk7CgkJCX0KCQl9CgoJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnbGlua3MnXVskcmVsXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJHJlbF07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfZGVzY3JpcHRpb24oKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdzdWJ0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzEwX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAndGFnbGluZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzAzX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncygnJywgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ3N1bW1hcnknKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdzdWJ0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jb3B5cmlnaHQoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NvcHlyaWdodCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzAzX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoJycsICdjb3B5cmlnaHQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xhbmd1YWdlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoJycsICdsYW5ndWFnZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2xhbmd1YWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnbGFuZ3VhZ2UnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5kYXRhWyd4bWxfbGFuZyddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmRhdGFbJ3htbF9sYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfbGF0aXR1ZGUoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1czQ19CQVNJQ19HRU8sICdsYXQnKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQl9CgkJZWxzZWlmICgoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9HRU9SU1MsICdwb2ludCcpKSAmJiBwcmVnX21hdGNoKCcvXigoPzotKT9bMC05XSsoPzpcLlswLTldKykpICgoPzotKT9bMC05XSsoPzpcLlswLTldKykpJC8nLCAkcmV0dXJuWzBdWydkYXRhJ10sICRtYXRjaCkpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkbWF0Y2hbMV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfbG9uZ2l0dWRlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9XM0NfQkFTSUNfR0VPLCAnbG9uZycpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xvbicpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0dFT1JTUywgJ3BvaW50JykpICYmIHByZWdfbWF0Y2goJy9eKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkgKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkkLycsICRyZXR1cm5bMF1bJ2RhdGEnXSwgJG1hdGNoKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRtYXRjaFsyXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9pbWFnZV91cmwoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2ltYWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2xvZ28nKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdpY29uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0F1dGhvcgp7Cgl2YXIgJG5hbWU7Cgl2YXIgJGxpbms7Cgl2YXIgJGVtYWlsOwoKCS8vIENvbnN0cnVjdG9yLCB1c2VkIHRvIGlucHV0IHRoZSBkYXRhCglmdW5jdGlvbiBTaW1wbGVQaWVfQXV0aG9yKCRuYW1lID0gbnVsbCwgJGxpbmsgPSBudWxsLCAkZW1haWwgPSBudWxsKQoJewoJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPmxpbmsgPSAkbGluazsKCQkkdGhpcy0+ZW1haWwgPSAkZW1haWw7Cgl9CgoJZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJLy8gVGhlcmUgaXMgbm8gJHRoaXMtPmRhdGEgaGVyZQoJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzKSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X25hbWUoKQoJewoJCWlmICgkdGhpcy0+bmFtZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bmFtZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9saW5rKCkKCXsKCQlpZiAoJHRoaXMtPmxpbmsgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmxpbms7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfZW1haWwoKQoJewoJCWlmICgkdGhpcy0+ZW1haWwgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmVtYWlsOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9DYXRlZ29yeQp7Cgl2YXIgJHRlcm07Cgl2YXIgJHNjaGVtZTsKCXZhciAkbGFiZWw7CgoJLy8gQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCWZ1bmN0aW9uIFNpbXBsZVBpZV9DYXRlZ29yeSgkdGVybSA9IG51bGwsICRzY2hlbWUgPSBudWxsLCAkbGFiZWwgPSBudWxsKQoJewoJCSR0aGlzLT50ZXJtID0gJHRlcm07CgkJJHRoaXMtPnNjaGVtZSA9ICRzY2hlbWU7CgkJJHRoaXMtPmxhYmVsID0gJGxhYmVsOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF90ZXJtKCkKCXsKCQlpZiAoJHRoaXMtPnRlcm0gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnRlcm07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfc2NoZW1lKCkKCXsKCQlpZiAoJHRoaXMtPnNjaGVtZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2NoZW1lOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xhYmVsKCkKCXsKCQlpZiAoJHRoaXMtPmxhYmVsICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5sYWJlbDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICR0aGlzLT5nZXRfdGVybSgpOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0VuY2xvc3VyZQp7Cgl2YXIgJGJpdHJhdGU7Cgl2YXIgJGNhcHRpb25zOwoJdmFyICRjYXRlZ29yaWVzOwoJdmFyICRjaGFubmVsczsKCXZhciAkY29weXJpZ2h0OwoJdmFyICRjcmVkaXRzOwoJdmFyICRkZXNjcmlwdGlvbjsKCXZhciAkZHVyYXRpb247Cgl2YXIgJGV4cHJlc3Npb247Cgl2YXIgJGZyYW1lcmF0ZTsKCXZhciAkaGFuZGxlcjsKCXZhciAkaGFzaGVzOwoJdmFyICRoZWlnaHQ7Cgl2YXIgJGphdmFzY3JpcHQ7Cgl2YXIgJGtleXdvcmRzOwoJdmFyICRsYW5nOwoJdmFyICRsZW5ndGg7Cgl2YXIgJGxpbms7Cgl2YXIgJG1lZGl1bTsKCXZhciAkcGxheWVyOwoJdmFyICRyYXRpbmdzOwoJdmFyICRyZXN0cmljdGlvbnM7Cgl2YXIgJHNhbXBsaW5ncmF0ZTsKCXZhciAkdGh1bWJuYWlsczsKCXZhciAkdGl0bGU7Cgl2YXIgJHR5cGU7Cgl2YXIgJHdpZHRoOwoKCS8vIENvbnN0cnVjdG9yLCB1c2VkIHRvIGlucHV0IHRoZSBkYXRhCglmdW5jdGlvbiBTaW1wbGVQaWVfRW5jbG9zdXJlKCRsaW5rID0gbnVsbCwgJHR5cGUgPSBudWxsLCAkbGVuZ3RoID0gbnVsbCwgJGphdmFzY3JpcHQgPSBudWxsLCAkYml0cmF0ZSA9IG51bGwsICRjYXB0aW9ucyA9IG51bGwsICRjYXRlZ29yaWVzID0gbnVsbCwgJGNoYW5uZWxzID0gbnVsbCwgJGNvcHlyaWdodCA9IG51bGwsICRjcmVkaXRzID0gbnVsbCwgJGRlc2NyaXB0aW9uID0gbnVsbCwgJGR1cmF0aW9uID0gbnVsbCwgJGV4cHJlc3Npb24gPSBudWxsLCAkZnJhbWVyYXRlID0gbnVsbCwgJGhhc2hlcyA9IG51bGwsICRoZWlnaHQgPSBudWxsLCAka2V5d29yZHMgPSBudWxsLCAkbGFuZyA9IG51bGwsICRtZWRpdW0gPSBudWxsLCAkcGxheWVyID0gbnVsbCwgJHJhdGluZ3MgPSBudWxsLCAkcmVzdHJpY3Rpb25zID0gbnVsbCwgJHNhbXBsaW5ncmF0ZSA9IG51bGwsICR0aHVtYm5haWxzID0gbnVsbCwgJHRpdGxlID0gbnVsbCwgJHdpZHRoID0gbnVsbCkKCXsKCQkkdGhpcy0+Yml0cmF0ZSA9ICRiaXRyYXRlOwoJCSR0aGlzLT5jYXB0aW9ucyA9ICRjYXB0aW9uczsKCQkkdGhpcy0+Y2F0ZWdvcmllcyA9ICRjYXRlZ29yaWVzOwoJCSR0aGlzLT5jaGFubmVscyA9ICRjaGFubmVsczsKCQkkdGhpcy0+Y29weXJpZ2h0ID0gJGNvcHlyaWdodDsKCQkkdGhpcy0+Y3JlZGl0cyA9ICRjcmVkaXRzOwoJCSR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKCQkkdGhpcy0+ZHVyYXRpb24gPSAkZHVyYXRpb247CgkJJHRoaXMtPmV4cHJlc3Npb24gPSAkZXhwcmVzc2lvbjsKCQkkdGhpcy0+ZnJhbWVyYXRlID0gJGZyYW1lcmF0ZTsKCQkkdGhpcy0+aGFzaGVzID0gJGhhc2hlczsKCQkkdGhpcy0+aGVpZ2h0ID0gJGhlaWdodDsKCQkkdGhpcy0+amF2YXNjcmlwdCA9ICRqYXZhc2NyaXB0OwoJCSR0aGlzLT5rZXl3b3JkcyA9ICRrZXl3b3JkczsKCQkkdGhpcy0+bGFuZyA9ICRsYW5nOwoJCSR0aGlzLT5sZW5ndGggPSAkbGVuZ3RoOwoJCSR0aGlzLT5saW5rID0gJGxpbms7CgkJJHRoaXMtPm1lZGl1bSA9ICRtZWRpdW07CgkJJHRoaXMtPnBsYXllciA9ICRwbGF5ZXI7CgkJJHRoaXMtPnJhdGluZ3MgPSAkcmF0aW5nczsKCQkkdGhpcy0+cmVzdHJpY3Rpb25zID0gJHJlc3RyaWN0aW9uczsKCQkkdGhpcy0+c2FtcGxpbmdyYXRlID0gJHNhbXBsaW5ncmF0ZTsKCQkkdGhpcy0+dGh1bWJuYWlscyA9ICR0aHVtYm5haWxzOwoJCSR0aGlzLT50aXRsZSA9ICR0aXRsZTsKCQkkdGhpcy0+dHlwZSA9ICR0eXBlOwoJCSR0aGlzLT53aWR0aCA9ICR3aWR0aDsKCQlpZiAoY2xhc3NfZXhpc3RzKCdpZG5hX2NvbnZlcnQnKSkKCQl7CgkJCSRpZG4gPSYgbmV3IGlkbmFfY29udmVydDsKCQkJJHBhcnNlZCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJGxpbmspOwoJCQkkdGhpcy0+bGluayA9IFNpbXBsZVBpZV9NaXNjOjpjb21wcmVzc19wYXJzZV91cmwoJHBhcnNlZFsnc2NoZW1lJ10sICRpZG4tPmVuY29kZSgkcGFyc2VkWydhdXRob3JpdHknXSksICRwYXJzZWRbJ3BhdGgnXSwgJHBhcnNlZFsncXVlcnknXSwgJHBhcnNlZFsnZnJhZ21lbnQnXSk7CgkJfQoJCSR0aGlzLT5oYW5kbGVyID0gJHRoaXMtPmdldF9oYW5kbGVyKCk7IC8vIE5lZWRzIHRvIGxvYWQgbGFzdAoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF9iaXRyYXRlKCkKCXsKCQlpZiAoJHRoaXMtPmJpdHJhdGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmJpdHJhdGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY2FwdGlvbigka2V5ID0gMCkKCXsKCQkkY2FwdGlvbnMgPSAkdGhpcy0+Z2V0X2NhcHRpb25zKCk7CgkJaWYgKGlzc2V0KCRjYXB0aW9uc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhcHRpb25zWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NhcHRpb25zKCkKCXsKCQlpZiAoJHRoaXMtPmNhcHRpb25zICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jYXB0aW9uczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jYXRlZ29yeSgka2V5ID0gMCkKCXsKCQkkY2F0ZWdvcmllcyA9ICR0aGlzLT5nZXRfY2F0ZWdvcmllcygpOwoJCWlmIChpc3NldCgkY2F0ZWdvcmllc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhdGVnb3JpZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY2F0ZWdvcmllcygpCgl7CgkJaWYgKCR0aGlzLT5jYXRlZ29yaWVzICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jYXRlZ29yaWVzOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NoYW5uZWxzKCkKCXsKCQlpZiAoJHRoaXMtPmNoYW5uZWxzICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jaGFubmVsczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jb3B5cmlnaHQoKQoJewoJCWlmICgkdGhpcy0+Y29weXJpZ2h0ICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jb3B5cmlnaHQ7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY3JlZGl0KCRrZXkgPSAwKQoJewoJCSRjcmVkaXRzID0gJHRoaXMtPmdldF9jcmVkaXRzKCk7CgkJaWYgKGlzc2V0KCRjcmVkaXRzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY3JlZGl0c1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jcmVkaXRzKCkKCXsKCQlpZiAoJHRoaXMtPmNyZWRpdHMgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmNyZWRpdHM7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfZGVzY3JpcHRpb24oKQoJewoJCWlmICgkdGhpcy0+ZGVzY3JpcHRpb24gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmRlc2NyaXB0aW9uOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2R1cmF0aW9uKCRjb252ZXJ0ID0gZmFsc2UpCgl7CgkJaWYgKCR0aGlzLT5kdXJhdGlvbiAhPT0gbnVsbCkKCQl7CgkJCWlmICgkY29udmVydCkKCQkJewoJCQkJJHRpbWUgPSBTaW1wbGVQaWVfTWlzYzo6dGltZV9obXMoJHRoaXMtPmR1cmF0aW9uKTsKCQkJCXJldHVybiAkdGltZTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZHVyYXRpb247CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9leHByZXNzaW9uKCkKCXsKCQlpZiAoJHRoaXMtPmV4cHJlc3Npb24gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmV4cHJlc3Npb247CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAnZnVsbCc7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9leHRlbnNpb24oKQoJewoJCWlmICgkdGhpcy0+bGluayAhPT0gbnVsbCkKCQl7CgkJCSR1cmwgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCR0aGlzLT5saW5rKTsKCQkJaWYgKCR1cmxbJ3BhdGgnXSAhPT0gJycpCgkJCXsKCQkJCXJldHVybiBwYXRoaW5mbygkdXJsWydwYXRoJ10sIFBBVEhJTkZPX0VYVEVOU0lPTik7CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJZnVuY3Rpb24gZ2V0X2ZyYW1lcmF0ZSgpCgl7CgkJaWYgKCR0aGlzLT5mcmFtZXJhdGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmZyYW1lcmF0ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9oYW5kbGVyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldF9yZWFsX3R5cGUodHJ1ZSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X2hhc2goJGtleSA9IDApCgl7CgkJJGhhc2hlcyA9ICR0aGlzLT5nZXRfaGFzaGVzKCk7CgkJaWYgKGlzc2V0KCRoYXNoZXNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRoYXNoZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfaGFzaGVzKCkKCXsKCQlpZiAoJHRoaXMtPmhhc2hlcyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+aGFzaGVzOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2hlaWdodCgpCgl7CgkJaWYgKCR0aGlzLT5oZWlnaHQgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmhlaWdodDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9sYW5ndWFnZSgpCgl7CgkJaWYgKCR0aGlzLT5sYW5nICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5sYW5nOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2tleXdvcmQoJGtleSA9IDApCgl7CgkJJGtleXdvcmRzID0gJHRoaXMtPmdldF9rZXl3b3JkcygpOwoJCWlmIChpc3NldCgka2V5d29yZHNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRrZXl3b3Jkc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9rZXl3b3JkcygpCgl7CgkJaWYgKCR0aGlzLT5rZXl3b3JkcyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+a2V5d29yZHM7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfbGVuZ3RoKCkKCXsKCQlpZiAoJHRoaXMtPmxlbmd0aCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bGVuZ3RoOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xpbmsoKQoJewoJCWlmICgkdGhpcy0+bGluayAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiB1cmxkZWNvZGUoJHRoaXMtPmxpbmspOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X21lZGl1bSgpCgl7CgkJaWYgKCR0aGlzLT5tZWRpdW0gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPm1lZGl1bTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9wbGF5ZXIoKQoJewoJCWlmICgkdGhpcy0+cGxheWVyICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5wbGF5ZXI7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfcmF0aW5nKCRrZXkgPSAwKQoJewoJCSRyYXRpbmdzID0gJHRoaXMtPmdldF9yYXRpbmdzKCk7CgkJaWYgKGlzc2V0KCRyYXRpbmdzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkcmF0aW5nc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9yYXRpbmdzKCkKCXsKCQlpZiAoJHRoaXMtPnJhdGluZ3MgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnJhdGluZ3M7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfcmVzdHJpY3Rpb24oJGtleSA9IDApCgl7CgkJJHJlc3RyaWN0aW9ucyA9ICR0aGlzLT5nZXRfcmVzdHJpY3Rpb25zKCk7CgkJaWYgKGlzc2V0KCRyZXN0cmljdGlvbnNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRyZXN0cmljdGlvbnNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfcmVzdHJpY3Rpb25zKCkKCXsKCQlpZiAoJHRoaXMtPnJlc3RyaWN0aW9ucyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+cmVzdHJpY3Rpb25zOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3NhbXBsaW5nX3JhdGUoKQoJewoJCWlmICgkdGhpcy0+c2FtcGxpbmdyYXRlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW1wbGluZ3JhdGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfc2l6ZSgpCgl7CgkJJGxlbmd0aCA9ICR0aGlzLT5nZXRfbGVuZ3RoKCk7CgkJaWYgKCRsZW5ndGggIT09IG51bGwpCgkJewoJCQlyZXR1cm4gcm91bmQoJGxlbmd0aC8xMDQ4NTc2LCAyKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF90aHVtYm5haWwoJGtleSA9IDApCgl7CgkJJHRodW1ibmFpbHMgPSAkdGhpcy0+Z2V0X3RodW1ibmFpbHMoKTsKCQlpZiAoaXNzZXQoJHRodW1ibmFpbHNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICR0aHVtYm5haWxzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3RodW1ibmFpbHMoKQoJewoJCWlmICgkdGhpcy0+dGh1bWJuYWlscyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dGh1bWJuYWlsczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF90aXRsZSgpCgl7CgkJaWYgKCR0aGlzLT50aXRsZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dGl0bGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfdHlwZSgpCgl7CgkJaWYgKCR0aGlzLT50eXBlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT50eXBlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3dpZHRoKCkKCXsKCQlpZiAoJHRoaXMtPndpZHRoICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT53aWR0aDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIG5hdGl2ZV9lbWJlZCgkb3B0aW9ucz0nJykKCXsKCQlyZXR1cm4gJHRoaXMtPmVtYmVkKCRvcHRpb25zLCB0cnVlKTsKCX0KCgkvKioKCSAqIEB0b2RvIElmIHRoZSBkaW1lbnNpb25zIGZvciBtZWRpYTpjb250ZW50IGFyZSBkZWZpbmVkLCB1c2UgdGhlbSB3aGVuIHdpZHRoL2hlaWdodCBhcmUgc2V0IHRvICdhdXRvJy4KCSAqLwoJZnVuY3Rpb24gZW1iZWQoJG9wdGlvbnMgPSAnJywgJG5hdGl2ZSA9IGZhbHNlKQoJewoJCS8vIFNldCB1cCBkZWZhdWx0cwoJCSRhdWRpbyA9ICcnOwoJCSR2aWRlbyA9ICcnOwoJCSRhbHQgPSAnJzsKCQkkYWx0Y2xhc3MgPSAnJzsKCQkkbG9vcCA9ICdmYWxzZSc7CgkJJHdpZHRoID0gJ2F1dG8nOwoJCSRoZWlnaHQgPSAnYXV0byc7CgkJJGJnY29sb3IgPSAnI2ZmZmZmZic7CgkJJG1lZGlhcGxheWVyID0gJyc7CgkJJHdpZGVzY3JlZW4gPSBmYWxzZTsKCQkkaGFuZGxlciA9ICR0aGlzLT5nZXRfaGFuZGxlcigpOwoJCSR0eXBlID0gJHRoaXMtPmdldF9yZWFsX3R5cGUoKTsKCgkJLy8gUHJvY2VzcyBvcHRpb25zIGFuZCByZWFzc2lnbiB2YWx1ZXMgYXMgbmVjZXNzYXJ5CgkJaWYgKGlzX2FycmF5KCRvcHRpb25zKSkKCQl7CgkJCWV4dHJhY3QoJG9wdGlvbnMpOwoJCX0KCQllbHNlCgkJewoJCQkkb3B0aW9ucyA9IGV4cGxvZGUoJywnLCAkb3B0aW9ucyk7CgkJCWZvcmVhY2goJG9wdGlvbnMgYXMgJG9wdGlvbikKCQkJewoJCQkJJG9wdCA9IGV4cGxvZGUoJzonLCAkb3B0aW9uLCAyKTsKCQkJCWlmIChpc3NldCgkb3B0WzBdLCAkb3B0WzFdKSkKCQkJCXsKCQkJCQkkb3B0WzBdID0gdHJpbSgkb3B0WzBdKTsKCQkJCQkkb3B0WzFdID0gdHJpbSgkb3B0WzFdKTsKCQkJCQlzd2l0Y2ggKCRvcHRbMF0pCgkJCQkJewoJCQkJCQljYXNlICdhdWRpbyc6CgkJCQkJCQkkYXVkaW8gPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICd2aWRlbyc6CgkJCQkJCQkkdmlkZW8gPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdhbHQnOgoJCQkJCQkJJGFsdCA9ICRvcHRbMV07CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJ2FsdGNsYXNzJzoKCQkJCQkJCSRhbHRjbGFzcyA9ICRvcHRbMV07CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJ2xvb3AnOgoJCQkJCQkJJGxvb3AgPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICd3aWR0aCc6CgkJCQkJCQkkd2lkdGggPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdoZWlnaHQnOgoJCQkJCQkJJGhlaWdodCA9ICRvcHRbMV07CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJ2JnY29sb3InOgoJCQkJCQkJJGJnY29sb3IgPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdtZWRpYXBsYXllcic6CgkJCQkJCQkkbWVkaWFwbGF5ZXIgPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICd3aWRlc2NyZWVuJzoKCQkJCQkJCSR3aWRlc2NyZWVuID0gJG9wdFsxXTsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJJG1pbWUgPSBleHBsb2RlKCcvJywgJHR5cGUsIDIpOwoJCSRtaW1lID0gJG1pbWVbMF07CgoJCS8vIFByb2Nlc3MgdmFsdWVzIGZvciAnYXV0bycKCQlpZiAoJHdpZHRoID09ICdhdXRvJykKCQl7CgkJCWlmICgkbWltZSA9PSAndmlkZW8nKQoJCQl7CgkJCQlpZiAoJGhlaWdodCA9PSAnYXV0bycpCgkJCQl7CgkJCQkJJHdpZHRoID0gNDgwOwoJCQkJfQoJCQkJZWxzZWlmICgkd2lkZXNjcmVlbikKCQkJCXsKCQkJCQkkd2lkdGggPSByb3VuZCgoaW50dmFsKCRoZWlnaHQpLzkpKjE2KTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkd2lkdGggPSByb3VuZCgoaW50dmFsKCRoZWlnaHQpLzMpKjQpOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHdpZHRoID0gJzEwMCUnOwoJCQl9CgkJfQoKCQlpZiAoJGhlaWdodCA9PSAnYXV0bycpCgkJewoJCQlpZiAoJG1pbWUgPT0gJ2F1ZGlvJykKCQkJewoJCQkJJGhlaWdodCA9IDA7CgkJCX0KCQkJZWxzZWlmICgkbWltZSA9PSAndmlkZW8nKQoJCQl7CgkJCQlpZiAoJHdpZHRoID09ICdhdXRvJykKCQkJCXsKCQkJCQlpZiAoJHdpZGVzY3JlZW4pCgkJCQkJewoJCQkJCQkkaGVpZ2h0ID0gMjcwOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkaGVpZ2h0ID0gMzYwOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2VpZiAoJHdpZGVzY3JlZW4pCgkJCQl7CgkJCQkJJGhlaWdodCA9IHJvdW5kKChpbnR2YWwoJHdpZHRoKS8xNikqOSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJGhlaWdodCA9IHJvdW5kKChpbnR2YWwoJHdpZHRoKS80KSozKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRoZWlnaHQgPSAzNzY7CgkJCX0KCQl9CgkJZWxzZWlmICgkbWltZSA9PSAnYXVkaW8nKQoJCXsKCQkJJGhlaWdodCA9IDA7CgkJfQoKCQkvLyBTZXQgcHJvcGVyIHBsYWNlaG9sZGVyIHZhbHVlCgkJaWYgKCRtaW1lID09ICdhdWRpbycpCgkJewoJCQkkcGxhY2Vob2xkZXIgPSAkYXVkaW87CgkJfQoJCWVsc2VpZiAoJG1pbWUgPT0gJ3ZpZGVvJykKCQl7CgkJCSRwbGFjZWhvbGRlciA9ICR2aWRlbzsKCQl9CgoJCSRlbWJlZCA9ICcnOwoKCQkvLyBNYWtlIHN1cmUgdGhlIEpTIGxpYnJhcnkgaXMgaW5jbHVkZWQKCQlpZiAoISRuYXRpdmUpCgkJewoJCQlzdGF0aWMgJGphdmFzY3JpcHRfb3V0cHV0dGVkID0gbnVsbDsKCQkJaWYgKCEkamF2YXNjcmlwdF9vdXRwdXR0ZWQgJiYgJHRoaXMtPmphdmFzY3JpcHQpCgkJCXsKCQkJCSRlbWJlZCAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iPycgLiBodG1sc3BlY2lhbGNoYXJzKCR0aGlzLT5qYXZhc2NyaXB0KSAuICciPjwvc2NyaXB0Pic7CgkJCQkkamF2YXNjcmlwdF9vdXRwdXR0ZWQgPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBPZGVvIEZlZWQgTVAzJ3MKCQlpZiAoJGhhbmRsZXIgPT0gJ29kZW8nKQoJCXsKCQkJaWYgKCRuYXRpdmUpCgkJCXsKCQkJCSRlbWJlZCAuPSAnPGVtYmVkIHNyYz0iaHR0cDovL29kZW8uY29tL2ZsYXNoL2F1ZGlvX3BsYXllcl9mdWxsc2l6ZS5zd2YiIHBsdWdpbnNwYWdlPSJodHRwOi8vYWRvYmUuY29tL2dvL2dldGZsYXNocGxheWVyIiB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIgcXVhbGl0eT0iaGlnaCIgd2lkdGg9IjQ0MCIgaGVpZ2h0PSI4MCIgd21vZGU9InRyYW5zcGFyZW50IiBhbGxvd1NjcmlwdEFjY2Vzcz0iYW55IiBmbGFzaHZhcnM9InZhbGlkX3NhbXBsZV9yYXRlPXRydWUmZXh0ZXJuYWxfdXJsPScgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICciPjwvZW1iZWQ+JzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRlbWJlZCAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmVtYmVkX29kZW8oIicgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICciKTs8L3NjcmlwdD4nOwoJCQl9CgkJfQoKCQkvLyBGbGFzaAoJCWVsc2VpZiAoJGhhbmRsZXIgPT0gJ2ZsYXNoJykKCQl7CgkJCWlmICgkbmF0aXZlKQoJCQl7CgkJCQkkZW1iZWQgLj0gIjxlbWJlZCBzcmM9XCIiIC4gJHRoaXMtPmdldF9saW5rKCkgLiAiXCIgcGx1Z2luc3BhZ2U9XCJodHRwOi8vYWRvYmUuY29tL2dvL2dldGZsYXNocGxheWVyXCIgdHlwZT1cIiR0eXBlXCIgcXVhbGl0eT1cImhpZ2hcIiB3aWR0aD1cIiR3aWR0aFwiIGhlaWdodD1cIiRoZWlnaHRcIiBiZ2NvbG9yPVwiJGJnY29sb3JcIiBsb29wPVwiJGxvb3BcIj48L2VtYmVkPiI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZW1iZWQgLj0gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz5lbWJlZF9mbGFzaCgnJGJnY29sb3InLCAnJHdpZHRoJywgJyRoZWlnaHQnLCAnIiAuICR0aGlzLT5nZXRfbGluaygpIC4gIicsICckbG9vcCcsICckdHlwZScpOzwvc2NyaXB0PiI7CgkJCX0KCQl9CgoJCS8vIEZsYXNoIE1lZGlhIFBsYXllciBmaWxlIHR5cGVzLgoJCS8vIFByZWZlcnJlZCBoYW5kbGVyIGZvciBNUDMgZmlsZSB0eXBlcy4KCQllbHNlaWYgKCRoYW5kbGVyID09ICdmbWVkaWEnIHx8ICgkaGFuZGxlciA9PSAnbXAzJyAmJiAkbWVkaWFwbGF5ZXIgIT0gJycpKQoJCXsKCQkJJGhlaWdodCArPSAyMDsKCQkJaWYgKCRuYXRpdmUpCgkJCXsKCQkJCSRlbWJlZCAuPSAiPGVtYmVkIHNyYz1cIiRtZWRpYXBsYXllclwiIHBsdWdpbnNwYWdlPVwiaHR0cDovL2Fkb2JlLmNvbS9nby9nZXRmbGFzaHBsYXllclwiIHR5cGU9XCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaFwiIHF1YWxpdHk9XCJoaWdoXCIgd2lkdGg9XCIkd2lkdGhcIiBoZWlnaHQ9XCIkaGVpZ2h0XCIgd21vZGU9XCJ0cmFuc3BhcmVudFwiIGZsYXNodmFycz1cImZpbGU9IiAuIHJhd3VybGVuY29kZSgkdGhpcy0+Z2V0X2xpbmsoKS4nP2ZpbGVfZXh0ZW5zaW9uPS4nLiR0aGlzLT5nZXRfZXh0ZW5zaW9uKCkpIC4gIiZhdXRvc3RhcnQ9ZmFsc2UmcmVwZWF0PSRsb29wJnNob3dkaWdpdHM9dHJ1ZSZzaG93ZnNidXR0b249ZmFsc2VcIj48L2VtYmVkPiI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZW1iZWQgLj0gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz5lbWJlZF9mbHYoJyR3aWR0aCcsICckaGVpZ2h0JywgJyIgLiByYXd1cmxlbmNvZGUoJHRoaXMtPmdldF9saW5rKCkuJz9maWxlX2V4dGVuc2lvbj0uJy4kdGhpcy0+Z2V0X2V4dGVuc2lvbigpKSAuICInLCAnJHBsYWNlaG9sZGVyJywgJyRsb29wJywgJyRtZWRpYXBsYXllcicpOzwvc2NyaXB0PiI7CgkJCX0KCQl9CgoJCS8vIFF1aWNrVGltZSA3IGZpbGUgdHlwZXMuICBOZWVkIHRvIHRlc3Qgd2l0aCBRdWlja1RpbWUgNi4KCQkvLyBPbmx5IGhhbmRsZSBNUDMncyBpZiB0aGUgRmxhc2ggTWVkaWEgUGxheWVyIGlzIG5vdCBwcmVzZW50LgoJCWVsc2VpZiAoJGhhbmRsZXIgPT0gJ3F1aWNrdGltZScgfHwgKCRoYW5kbGVyID09ICdtcDMnICYmICRtZWRpYXBsYXllciA9PSAnJykpCgkJewoJCQkkaGVpZ2h0ICs9IDE2OwoJCQlpZiAoJG5hdGl2ZSkKCQkJewoJCQkJaWYgKCRwbGFjZWhvbGRlciAhPSAiIil7CgkJCQkJJGVtYmVkIC49ICI8ZW1iZWQgdHlwZT1cIiR0eXBlXCIgc3R5bGU9XCJjdXJzb3I6aGFuZDsgY3Vyc29yOnBvaW50ZXI7XCIgaHJlZj1cIiIgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICJcIiBzcmM9XCIkcGxhY2Vob2xkZXJcIiB3aWR0aD1cIiR3aWR0aFwiIGhlaWdodD1cIiRoZWlnaHRcIiBhdXRvcGxheT1cImZhbHNlXCIgdGFyZ2V0PVwibXlzZWxmXCIgY29udHJvbGxlcj1cImZhbHNlXCIgbG9vcD1cIiRsb29wXCIgc2NhbGU9XCJhc3BlY3RcIiBiZ2NvbG9yPVwiJGJnY29sb3JcIiBwbHVnaW5zcGFnZT1cImh0dHA6Ly9hcHBsZS5jb20vcXVpY2t0aW1lL2Rvd25sb2FkL1wiPjwvZW1iZWQ+IjsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCSRlbWJlZCAuPSAiPGVtYmVkIHR5cGU9XCIkdHlwZVwiIHN0eWxlPVwiY3Vyc29yOmhhbmQ7IGN1cnNvcjpwb2ludGVyO1wiIHNyYz1cIiIgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICJcIiB3aWR0aD1cIiR3aWR0aFwiIGhlaWdodD1cIiRoZWlnaHRcIiBhdXRvcGxheT1cImZhbHNlXCIgdGFyZ2V0PVwibXlzZWxmXCIgY29udHJvbGxlcj1cInRydWVcIiBsb29wPVwiJGxvb3BcIiBzY2FsZT1cImFzcGVjdFwiIGJnY29sb3I9XCIkYmdjb2xvclwiIHBsdWdpbnNwYWdlPVwiaHR0cDovL2FwcGxlLmNvbS9xdWlja3RpbWUvZG93bmxvYWQvXCI+PC9lbWJlZD4iOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJGVtYmVkIC49ICI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+ZW1iZWRfcXVpY2t0aW1lKCckdHlwZScsICckYmdjb2xvcicsICckd2lkdGgnLCAnJGhlaWdodCcsICciIC4gJHRoaXMtPmdldF9saW5rKCkgLiAiJywgJyRwbGFjZWhvbGRlcicsICckbG9vcCcpOzwvc2NyaXB0PiI7CgkJCX0KCQl9CgoJCS8vIFdpbmRvd3MgTWVkaWEKCQllbHNlaWYgKCRoYW5kbGVyID09ICd3bWVkaWEnKQoJCXsKCQkJJGhlaWdodCArPSA0NTsKCQkJaWYgKCRuYXRpdmUpCgkJCXsKCQkJCSRlbWJlZCAuPSAiPGVtYmVkIHR5cGU9XCJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyXCIgc3JjPVwiIiAuICR0aGlzLT5nZXRfbGluaygpIC4gIlwiIGF1dG9zaXplPVwiMVwiIHdpZHRoPVwiJHdpZHRoXCIgaGVpZ2h0PVwiJGhlaWdodFwiIHNob3djb250cm9scz1cIjFcIiBzaG93c3RhdHVzYmFyPVwiMFwiIHNob3dkaXNwbGF5PVwiMFwiIGF1dG9zdGFydD1cIjBcIj48L2VtYmVkPiI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZW1iZWQgLj0gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz5lbWJlZF93bWVkaWEoJyR3aWR0aCcsICckaGVpZ2h0JywgJyIgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICInKTs8L3NjcmlwdD4iOwoJCQl9CgkJfQoKCQkvLyBFdmVyeXRoaW5nIGVsc2UKCQllbHNlICRlbWJlZCAuPSAnPGEgaHJlZj0iJyAuICR0aGlzLT5nZXRfbGluaygpIC4gJyIgY2xhc3M9IicgLiAkYWx0Y2xhc3MgLiAnIj4nIC4gJGFsdCAuICc8L2E+JzsKCgkJcmV0dXJuICRlbWJlZDsKCX0KCglmdW5jdGlvbiBnZXRfcmVhbF90eXBlKCRmaW5kX2hhbmRsZXIgPSBmYWxzZSkKCXsKCQkvLyBJZiBpdCdzIE9kZW8sIGxldCdzIGdldCBpdCBvdXQgb2YgdGhlIHdheS4KCQlpZiAoc3Vic3RyKHN0cnRvbG93ZXIoJHRoaXMtPmdldF9saW5rKCkpLCAwLCAxNSkgPT0gJ2h0dHA6Ly9vZGVvLmNvbScpCgkJewoJCQlyZXR1cm4gJ29kZW8nOwoJCX0KCgkJLy8gTWltZS10eXBlcyBieSBoYW5kbGVyLgoJCSR0eXBlc19mbGFzaCA9IGFycmF5KCdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsICdhcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2gnKTsgLy8gRmxhc2gKCQkkdHlwZXNfZm1lZGlhID0gYXJyYXkoJ3ZpZGVvL2ZsdicsICd2aWRlby94LWZsdicsJ2Zsdi1hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsgLy8gRmxhc2ggTWVkaWEgUGxheWVyCgkJJHR5cGVzX3F1aWNrdGltZSA9IGFycmF5KCdhdWRpby8zZ3BwJywgJ2F1ZGlvLzNncHAyJywgJ2F1ZGlvL2FhYycsICdhdWRpby94LWFhYycsICdhdWRpby9haWZmJywgJ2F1ZGlvL3gtYWlmZicsICdhdWRpby9taWQnLCAnYXVkaW8vbWlkaScsICdhdWRpby94LW1pZGknLCAnYXVkaW8vbXA0JywgJ2F1ZGlvL200YScsICdhdWRpby94LW00YScsICdhdWRpby93YXYnLCAnYXVkaW8veC13YXYnLCAndmlkZW8vM2dwcCcsICd2aWRlby8zZ3BwMicsICd2aWRlby9tNHYnLCAndmlkZW8veC1tNHYnLCAndmlkZW8vbXA0JywgJ3ZpZGVvL21wZWcnLCAndmlkZW8veC1tcGVnJywgJ3ZpZGVvL3F1aWNrdGltZScsICd2aWRlby9zZC12aWRlbycpOyAvLyBRdWlja1RpbWUKCQkkdHlwZXNfd21lZGlhID0gYXJyYXkoJ2FwcGxpY2F0aW9uL2FzeCcsICdhcHBsaWNhdGlvbi94LW1wbGF5ZXIyJywgJ2F1ZGlvL3gtbXMtd21hJywgJ2F1ZGlvL3gtbXMtd2F4JywgJ3ZpZGVvL3gtbXMtYXNmLXBsdWdpbicsICd2aWRlby94LW1zLWFzZicsICd2aWRlby94LW1zLXdtJywgJ3ZpZGVvL3gtbXMtd212JywgJ3ZpZGVvL3gtbXMtd3Z4Jyk7IC8vIFdpbmRvd3MgTWVkaWEKCQkkdHlwZXNfbXAzID0gYXJyYXkoJ2F1ZGlvL21wMycsICdhdWRpby94LW1wMycsICdhdWRpby9tcGVnJywgJ2F1ZGlvL3gtbXBlZycpOyAvLyBNUDMKCgkJaWYgKCR0aGlzLT5nZXRfdHlwZSgpICE9PSBudWxsKQoJCXsKCQkJJHR5cGUgPSBzdHJ0b2xvd2VyKCR0aGlzLT50eXBlKTsKCQl9CgkJZWxzZQoJCXsKCQkJJHR5cGUgPSBudWxsOwoJCX0KCgkJLy8gSWYgd2UgZW5jb3VudGVyIGFuIHVuc3VwcG9ydGVkIG1pbWUtdHlwZSwgY2hlY2sgdGhlIGZpbGUgZXh0ZW5zaW9uIGFuZCBndWVzcyBpbnRlbGxpZ2VudGx5LgoJCWlmICghaW5fYXJyYXkoJHR5cGUsIGFycmF5X21lcmdlKCR0eXBlc19mbGFzaCwgJHR5cGVzX2ZtZWRpYSwgJHR5cGVzX3F1aWNrdGltZSwgJHR5cGVzX3dtZWRpYSwgJHR5cGVzX21wMykpKQoJCXsKCQkJc3dpdGNoIChzdHJ0b2xvd2VyKCR0aGlzLT5nZXRfZXh0ZW5zaW9uKCkpKQoJCQl7CgkJCQkvLyBBdWRpbyBtaW1lLXR5cGVzCgkJCQljYXNlICdhYWMnOgoJCQkJY2FzZSAnYWR0cyc6CgkJCQkJJHR5cGUgPSAnYXVkaW8vYWNjJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdhaWYnOgoJCQkJY2FzZSAnYWlmYyc6CgkJCQljYXNlICdhaWZmJzoKCQkJCWNhc2UgJ2NkZGEnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL2FpZmYnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ2J3Zic6CgkJCQkJJHR5cGUgPSAnYXVkaW8vd2F2JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdrYXInOgoJCQkJY2FzZSAnbWlkJzoKCQkJCWNhc2UgJ21pZGknOgoJCQkJY2FzZSAnc21mJzoKCQkJCQkkdHlwZSA9ICdhdWRpby9taWRpJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdtNGEnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL3gtbTRhJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdtcDMnOgoJCQkJY2FzZSAnc3dhJzoKCQkJCQkkdHlwZSA9ICdhdWRpby9tcDMnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ3dhdic6CgkJCQkJJHR5cGUgPSAnYXVkaW8vd2F2JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3YXgnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL3gtbXMtd2F4JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3bWEnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL3gtbXMtd21hJzsKCQkJCQlicmVhazsKCgkJCQkvLyBWaWRlbyBtaW1lLXR5cGVzCgkJCQljYXNlICczZ3AnOgoJCQkJY2FzZSAnM2dwcCc6CgkJCQkJJHR5cGUgPSAndmlkZW8vM2dwcCc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnM2cyJzoKCQkJCWNhc2UgJzNncDInOgoJCQkJCSR0eXBlID0gJ3ZpZGVvLzNncHAyJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdhc2YnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtbXMtYXNmJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdmbHYnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtZmx2JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdtMWEnOgoJCQkJY2FzZSAnbTFzJzoKCQkJCWNhc2UgJ20xdic6CgkJCQljYXNlICdtMTUnOgoJCQkJY2FzZSAnbTc1JzoKCQkJCWNhc2UgJ21wMic6CgkJCQljYXNlICdtcGEnOgoJCQkJY2FzZSAnbXBlZyc6CgkJCQljYXNlICdtcGcnOgoJCQkJY2FzZSAnbXBtJzoKCQkJCWNhc2UgJ21wdic6CgkJCQkJJHR5cGUgPSAndmlkZW8vbXBlZyc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnbTR2JzoKCQkJCQkkdHlwZSA9ICd2aWRlby94LW00dic7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnbW92JzoKCQkJCWNhc2UgJ3F0JzoKCQkJCQkkdHlwZSA9ICd2aWRlby9xdWlja3RpbWUnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ21wNCc6CgkJCQljYXNlICdtcGc0JzoKCQkJCQkkdHlwZSA9ICd2aWRlby9tcDQnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ3Nkdic6CgkJCQkJJHR5cGUgPSAndmlkZW8vc2QtdmlkZW8nOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ3dtJzoKCQkJCQkkdHlwZSA9ICd2aWRlby94LW1zLXdtJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3bXYnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtbXMtd212JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3dngnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtbXMtd3Z4JzsKCQkJCQlicmVhazsKCgkJCQkvLyBGbGFzaCBtaW1lLXR5cGVzCgkJCQljYXNlICdzcGwnOgoJCQkJCSR0eXBlID0gJ2FwcGxpY2F0aW9uL2Z1dHVyZXNwbGFzaCc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnc3dmJzoKCQkJCQkkdHlwZSA9ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCc7CgkJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWlmICgkZmluZF9oYW5kbGVyKQoJCXsKCQkJaWYgKGluX2FycmF5KCR0eXBlLCAkdHlwZXNfZmxhc2gpKQoJCQl7CgkJCQlyZXR1cm4gJ2ZsYXNoJzsKCQkJfQoJCQllbHNlaWYgKGluX2FycmF5KCR0eXBlLCAkdHlwZXNfZm1lZGlhKSkKCQkJewoJCQkJcmV0dXJuICdmbWVkaWEnOwoJCQl9CgkJCWVsc2VpZiAoaW5fYXJyYXkoJHR5cGUsICR0eXBlc19xdWlja3RpbWUpKQoJCQl7CgkJCQlyZXR1cm4gJ3F1aWNrdGltZSc7CgkJCX0KCQkJZWxzZWlmIChpbl9hcnJheSgkdHlwZSwgJHR5cGVzX3dtZWRpYSkpCgkJCXsKCQkJCXJldHVybiAnd21lZGlhJzsKCQkJfQoJCQllbHNlaWYgKGluX2FycmF5KCR0eXBlLCAkdHlwZXNfbXAzKSkKCQkJewoJCQkJcmV0dXJuICdtcDMnOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIG51bGw7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICR0eXBlOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0NhcHRpb24KewoJdmFyICR0eXBlOwoJdmFyICRsYW5nOwoJdmFyICRzdGFydFRpbWU7Cgl2YXIgJGVuZFRpbWU7Cgl2YXIgJHRleHQ7CgoJLy8gQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCWZ1bmN0aW9uIFNpbXBsZVBpZV9DYXB0aW9uKCR0eXBlID0gbnVsbCwgJGxhbmcgPSBudWxsLCAkc3RhcnRUaW1lID0gbnVsbCwgJGVuZFRpbWUgPSBudWxsLCAkdGV4dCA9IG51bGwpCgl7CgkJJHRoaXMtPnR5cGUgPSAkdHlwZTsKCQkkdGhpcy0+bGFuZyA9ICRsYW5nOwoJCSR0aGlzLT5zdGFydFRpbWUgPSAkc3RhcnRUaW1lOwoJCSR0aGlzLT5lbmRUaW1lID0gJGVuZFRpbWU7CgkJJHRoaXMtPnRleHQgPSAkdGV4dDsKCX0KCglmdW5jdGlvbiBfX3RvU3RyaW5nKCkKCXsKCQkvLyBUaGVyZSBpcyBubyAkdGhpcy0+ZGF0YSBoZXJlCgkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMpKTsKCX0KCglmdW5jdGlvbiBnZXRfZW5kdGltZSgpCgl7CgkJaWYgKCR0aGlzLT5lbmRUaW1lICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5lbmRUaW1lOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xhbmd1YWdlKCkKCXsKCQlpZiAoJHRoaXMtPmxhbmcgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmxhbmc7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfc3RhcnR0aW1lKCkKCXsKCQlpZiAoJHRoaXMtPnN0YXJ0VGltZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c3RhcnRUaW1lOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3RleHQoKQoJewoJCWlmICgkdGhpcy0+dGV4dCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dGV4dDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF90eXBlKCkKCXsKCQlpZiAoJHRoaXMtPnR5cGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnR5cGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0NyZWRpdAp7Cgl2YXIgJHJvbGU7Cgl2YXIgJHNjaGVtZTsKCXZhciAkbmFtZTsKCgkvLyBDb25zdHJ1Y3RvciwgdXNlZCB0byBpbnB1dCB0aGUgZGF0YQoJZnVuY3Rpb24gU2ltcGxlUGllX0NyZWRpdCgkcm9sZSA9IG51bGwsICRzY2hlbWUgPSBudWxsLCAkbmFtZSA9IG51bGwpCgl7CgkJJHRoaXMtPnJvbGUgPSAkcm9sZTsKCQkkdGhpcy0+c2NoZW1lID0gJHNjaGVtZTsKCQkkdGhpcy0+bmFtZSA9ICRuYW1lOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF9yb2xlKCkKCXsKCQlpZiAoJHRoaXMtPnJvbGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnJvbGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfc2NoZW1lKCkKCXsKCQlpZiAoJHRoaXMtPnNjaGVtZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2NoZW1lOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X25hbWUoKQoJewoJCWlmICgkdGhpcy0+bmFtZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bmFtZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQp9CgpjbGFzcyBTaW1wbGVQaWVfQ29weXJpZ2h0CnsKCXZhciAkdXJsOwoJdmFyICRsYWJlbDsKCgkvLyBDb25zdHJ1Y3RvciwgdXNlZCB0byBpbnB1dCB0aGUgZGF0YQoJZnVuY3Rpb24gU2ltcGxlUGllX0NvcHlyaWdodCgkdXJsID0gbnVsbCwgJGxhYmVsID0gbnVsbCkKCXsKCQkkdGhpcy0+dXJsID0gJHVybDsKCQkkdGhpcy0+bGFiZWwgPSAkbGFiZWw7Cgl9CgoJZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJLy8gVGhlcmUgaXMgbm8gJHRoaXMtPmRhdGEgaGVyZQoJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzKSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X3VybCgpCgl7CgkJaWYgKCR0aGlzLT51cmwgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnVybDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9hdHRyaWJ1dGlvbigpCgl7CgkJaWYgKCR0aGlzLT5sYWJlbCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bGFiZWw7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX1JhdGluZwp7Cgl2YXIgJHNjaGVtZTsKCXZhciAkdmFsdWU7CgoJLy8gQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCWZ1bmN0aW9uIFNpbXBsZVBpZV9SYXRpbmcoJHNjaGVtZSA9IG51bGwsICR2YWx1ZSA9IG51bGwpCgl7CgkJJHRoaXMtPnNjaGVtZSA9ICRzY2hlbWU7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF9zY2hlbWUoKQoJewoJCWlmICgkdGhpcy0+c2NoZW1lICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zY2hlbWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfdmFsdWUoKQoJewoJCWlmICgkdGhpcy0+dmFsdWUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnZhbHVlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9SZXN0cmljdGlvbgp7Cgl2YXIgJHJlbGF0aW9uc2hpcDsKCXZhciAkdHlwZTsKCXZhciAkdmFsdWU7CgoJLy8gQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCWZ1bmN0aW9uIFNpbXBsZVBpZV9SZXN0cmljdGlvbigkcmVsYXRpb25zaGlwID0gbnVsbCwgJHR5cGUgPSBudWxsLCAkdmFsdWUgPSBudWxsKQoJewoJCSR0aGlzLT5yZWxhdGlvbnNoaXAgPSAkcmVsYXRpb25zaGlwOwoJCSR0aGlzLT50eXBlID0gJHR5cGU7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF9yZWxhdGlvbnNoaXAoKQoJewoJCWlmICgkdGhpcy0+cmVsYXRpb25zaGlwICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5yZWxhdGlvbnNoaXA7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfdHlwZSgpCgl7CgkJaWYgKCR0aGlzLT50eXBlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT50eXBlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3ZhbHVlKCkKCXsKCQlpZiAoJHRoaXMtPnZhbHVlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT52YWx1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQp9CgovKioKICogQHRvZG8gTW92ZSB0byBwcm9wZXJseSBzdXBwb3J0aW5nIFJGQzI2MTYgKEhUVFAvMS4xKQogKi8KY2xhc3MgU2ltcGxlUGllX0ZpbGUKewoJdmFyICR1cmw7Cgl2YXIgJHVzZXJhZ2VudDsKCXZhciAkc3VjY2VzcyA9IHRydWU7Cgl2YXIgJGhlYWRlcnMgPSBhcnJheSgpOwoJdmFyICRib2R5OwoJdmFyICRzdGF0dXNfY29kZTsKCXZhciAkcmVkaXJlY3RzID0gMDsKCXZhciAkZXJyb3I7Cgl2YXIgJG1ldGhvZCA9IFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9OT05FOwoKCWZ1bmN0aW9uIFNpbXBsZVBpZV9GaWxlKCR1cmwsICR0aW1lb3V0ID0gMTAsICRyZWRpcmVjdHMgPSA1LCAkaGVhZGVycyA9IG51bGwsICR1c2VyYWdlbnQgPSBudWxsLCAkZm9yY2VfZnNvY2tvcGVuID0gZmFsc2UpCgl7CgkJaWYgKGNsYXNzX2V4aXN0cygnaWRuYV9jb252ZXJ0JykpCgkJewoJCQkkaWRuID0mIG5ldyBpZG5hX2NvbnZlcnQ7CgkJCSRwYXJzZWQgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCR1cmwpOwoJCQkkdXJsID0gU2ltcGxlUGllX01pc2M6OmNvbXByZXNzX3BhcnNlX3VybCgkcGFyc2VkWydzY2hlbWUnXSwgJGlkbi0+ZW5jb2RlKCRwYXJzZWRbJ2F1dGhvcml0eSddKSwgJHBhcnNlZFsncGF0aCddLCAkcGFyc2VkWydxdWVyeSddLCAkcGFyc2VkWydmcmFnbWVudCddKTsKCQl9CgkJJHRoaXMtPnVybCA9ICR1cmw7CgkJJHRoaXMtPnVzZXJhZ2VudCA9ICR1c2VyYWdlbnQ7CgkJaWYgKHByZWdfbWF0Y2goJy9eaHR0cChzKT86XC9cLy9pJywgJHVybCkpCgkJewoJCQlpZiAoJHVzZXJhZ2VudCA9PT0gbnVsbCkKCQkJewoJCQkJJHVzZXJhZ2VudCA9IGluaV9nZXQoJ3VzZXJfYWdlbnQnKTsKCQkJCSR0aGlzLT51c2VyYWdlbnQgPSAkdXNlcmFnZW50OwoJCQl9CgkJCWlmICghaXNfYXJyYXkoJGhlYWRlcnMpKQoJCQl7CgkJCQkkaGVhZGVycyA9IGFycmF5KCk7CgkJCX0KCQkJaWYgKCEkZm9yY2VfZnNvY2tvcGVuICYmIGZ1bmN0aW9uX2V4aXN0cygnY3VybF9leGVjJykpCgkJCXsKCQkJCSR0aGlzLT5tZXRob2QgPSBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfUkVNT1RFIHwgU0lNUExFUElFX0ZJTEVfU09VUkNFX0NVUkw7CgkJCQkkZnAgPSBjdXJsX2luaXQoKTsKCQkJCSRoZWFkZXJzMiA9IGFycmF5KCk7CgkJCQlmb3JlYWNoICgkaGVhZGVycyBhcyAka2V5ID0+ICR2YWx1ZSkKCQkJCXsKCQkJCQkkaGVhZGVyczJbXSA9ICIka2V5OiAkdmFsdWUiOwoJCQkJfQoJCQkJaWYgKHZlcnNpb25fY29tcGFyZShTaW1wbGVQaWVfTWlzYzo6Z2V0X2N1cmxfdmVyc2lvbigpLCAnNy4xMC41JywgJz49JykpCgkJCQl7CgkJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX0VOQ09ESU5HLCAnJyk7CgkJCQl9CgkJCQljdXJsX3NldG9wdCgkZnAsIENVUkxPUFRfVVJMLCAkdXJsKTsKCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9IRUFERVIsIDEpOwoJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9USU1FT1VULCAkdGltZW91dCk7CgkJCQljdXJsX3NldG9wdCgkZnAsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsICR0aW1lb3V0KTsKCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9SRUZFUkVSLCAkdXJsKTsKCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9VU0VSQUdFTlQsICR1c2VyYWdlbnQpOwoJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzMik7CgkJCQlpZiAoIWluaV9nZXQoJ29wZW5fYmFzZWRpcicpICYmICFpbmlfZ2V0KCdzYWZlX21vZGUnKSAmJiB2ZXJzaW9uX2NvbXBhcmUoU2ltcGxlUGllX01pc2M6OmdldF9jdXJsX3ZlcnNpb24oKSwgJzcuMTUuMicsICc+PScpKQoJCQkJewoJCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgMSk7CgkJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX01BWFJFRElSUywgJHJlZGlyZWN0cyk7CgkJCQl9CgoJCQkJJHRoaXMtPmhlYWRlcnMgPSBjdXJsX2V4ZWMoJGZwKTsKCQkJCWlmIChjdXJsX2Vycm5vKCRmcCkgPT0gMjMgfHwgY3VybF9lcnJubygkZnApID09IDYxKQoJCQkJewoJCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9FTkNPRElORywgJ25vbmUnKTsKCQkJCQkkdGhpcy0+aGVhZGVycyA9IGN1cmxfZXhlYygkZnApOwoJCQkJfQoJCQkJaWYgKGN1cmxfZXJybm8oJGZwKSkKCQkJCXsKCQkJCQkkdGhpcy0+ZXJyb3IgPSAnY1VSTCBlcnJvciAnIC4gY3VybF9lcnJubygkZnApIC4gJzogJyAuIGN1cmxfZXJyb3IoJGZwKTsKCQkJCQkkdGhpcy0+c3VjY2VzcyA9IGZhbHNlOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRpbmZvID0gY3VybF9nZXRpbmZvKCRmcCk7CgkJCQkJY3VybF9jbG9zZSgkZnApOwoJCQkJCSR0aGlzLT5oZWFkZXJzID0gZXhwbG9kZSgiXHJcblxyXG4iLCAkdGhpcy0+aGVhZGVycywgJGluZm9bJ3JlZGlyZWN0X2NvdW50J10gKyAxKTsKCQkJCQkkdGhpcy0+aGVhZGVycyA9IGFycmF5X3BvcCgkdGhpcy0+aGVhZGVycyk7CgkJCQkJJHBhcnNlciA9JiBuZXcgU2ltcGxlUGllX0hUVFBfUGFyc2VyKCR0aGlzLT5oZWFkZXJzKTsKCQkJCQlpZiAoJHBhcnNlci0+cGFyc2UoKSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5oZWFkZXJzID0gJHBhcnNlci0+aGVhZGVyczsKCQkJCQkJJHRoaXMtPmJvZHkgPSAkcGFyc2VyLT5ib2R5OwoJCQkJCQkkdGhpcy0+c3RhdHVzX2NvZGUgPSAkcGFyc2VyLT5zdGF0dXNfY29kZTsKCQkJCQkJaWYgKCgkdGhpcy0+c3RhdHVzX2NvZGUgPT0gMzAwIHx8ICR0aGlzLT5zdGF0dXNfY29kZSA9PSAzMDEgfHwgJHRoaXMtPnN0YXR1c19jb2RlID09IDMwMiB8fCAkdGhpcy0+c3RhdHVzX2NvZGUgPT0gMzAzIHx8ICR0aGlzLT5zdGF0dXNfY29kZSA9PSAzMDcgfHwgJHRoaXMtPnN0YXR1c19jb2RlID4gMzA3ICYmICR0aGlzLT5zdGF0dXNfY29kZSA8IDQwMCkgJiYgaXNzZXQoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10pICYmICR0aGlzLT5yZWRpcmVjdHMgPCAkcmVkaXJlY3RzKQoJCQkJCQl7CgkJCQkJCQkkdGhpcy0+cmVkaXJlY3RzKys7CgkJCQkJCQkkbG9jYXRpb24gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10sICR1cmwpOwoJCQkJCQkJcmV0dXJuICR0aGlzLT5TaW1wbGVQaWVfRmlsZSgkbG9jYXRpb24sICR0aW1lb3V0LCAkcmVkaXJlY3RzLCAkaGVhZGVycywgJHVzZXJhZ2VudCwgJGZvcmNlX2Zzb2Nrb3Blbik7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+bWV0aG9kID0gU0lNUExFUElFX0ZJTEVfU09VUkNFX1JFTU9URSB8IFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9GU09DS09QRU47CgkJCQkkdXJsX3BhcnRzID0gcGFyc2VfdXJsKCR1cmwpOwoJCQkJaWYgKGlzc2V0KCR1cmxfcGFydHNbJ3NjaGVtZSddKSAmJiBzdHJ0b2xvd2VyKCR1cmxfcGFydHNbJ3NjaGVtZSddKSA9PSAnaHR0cHMnKQoJCQkJewoJCQkJCSR1cmxfcGFydHNbJ2hvc3QnXSA9ICJzc2w6Ly8kdXJsX3BhcnRzW2hvc3RdIjsKCQkJCQkkdXJsX3BhcnRzWydwb3J0J10gPSA0NDM7CgkJCQl9CgkJCQlpZiAoIWlzc2V0KCR1cmxfcGFydHNbJ3BvcnQnXSkpCgkJCQl7CgkJCQkJJHVybF9wYXJ0c1sncG9ydCddID0gODA7CgkJCQl9CgkJCQkkZnAgPSBAZnNvY2tvcGVuKCR1cmxfcGFydHNbJ2hvc3QnXSwgJHVybF9wYXJ0c1sncG9ydCddLCAkZXJybm8sICRlcnJzdHIsICR0aW1lb3V0KTsKCQkJCWlmICghJGZwKQoJCQkJewoJCQkJCSR0aGlzLT5lcnJvciA9ICdmc29ja29wZW4gZXJyb3I6ICcgLiAkZXJyc3RyOwoJCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJc3RyZWFtX3NldF90aW1lb3V0KCRmcCwgJHRpbWVvdXQpOwoJCQkJCWlmIChpc3NldCgkdXJsX3BhcnRzWydwYXRoJ10pKQoJCQkJCXsKCQkJCQkJaWYgKGlzc2V0KCR1cmxfcGFydHNbJ3F1ZXJ5J10pKQoJCQkJCQl7CgkJCQkJCQkkZ2V0ID0gIiR1cmxfcGFydHNbcGF0aF0/JHVybF9wYXJ0c1txdWVyeV0iOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGdldCA9ICR1cmxfcGFydHNbJ3BhdGgnXTsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkZ2V0ID0gJy8nOwoJCQkJCX0KCQkJCQkkb3V0ID0gIkdFVCAkZ2V0IEhUVFAvMS4wXHJcbiI7CgkJCQkJJG91dCAuPSAiSG9zdDogJHVybF9wYXJ0c1tob3N0XVxyXG4iOwoJCQkJCSRvdXQgLj0gIlVzZXItQWdlbnQ6ICR1c2VyYWdlbnRcclxuIjsKCQkJCQlpZiAoZXh0ZW5zaW9uX2xvYWRlZCgnemxpYicpKQoJCQkJCXsKCQkJCQkJJG91dCAuPSAiQWNjZXB0LUVuY29kaW5nOiB4LWd6aXAsZ3ppcCxkZWZsYXRlXHJcbiI7CgkJCQkJfQoKCQkJCQlpZiAoaXNzZXQoJHVybF9wYXJ0c1sndXNlciddKSAmJiBpc3NldCgkdXJsX3BhcnRzWydwYXNzJ10pKQoJCQkJCXsKCQkJCQkJJG91dCAuPSAiQXV0aG9yaXphdGlvbjogQmFzaWMgIiAuIGJhc2U2NF9lbmNvZGUoIiR1cmxfcGFydHNbdXNlcl06JHVybF9wYXJ0c1twYXNzXSIpIC4gIlxyXG4iOwoJCQkJCX0KCQkJCQlmb3JlYWNoICgkaGVhZGVycyBhcyAka2V5ID0+ICR2YWx1ZSkKCQkJCQl7CgkJCQkJCSRvdXQgLj0gIiRrZXk6ICR2YWx1ZVxyXG4iOwoJCQkJCX0KCQkJCQkkb3V0IC49ICJDb25uZWN0aW9uOiBDbG9zZVxyXG5cclxuIjsKCQkJCQlmd3JpdGUoJGZwLCAkb3V0KTsKCgkJCQkJJGluZm8gPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkZnApOwoKCQkJCQkkdGhpcy0+aGVhZGVycyA9ICcnOwoJCQkJCXdoaWxlICghJGluZm9bJ2VvZiddICYmICEkaW5mb1sndGltZWRfb3V0J10pCgkJCQkJewoJCQkJCQkkdGhpcy0+aGVhZGVycyAuPSBmcmVhZCgkZnAsIDExNjApOwoJCQkJCQkkaW5mbyA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCRmcCk7CgkJCQkJfQoJCQkJCWlmICghJGluZm9bJ3RpbWVkX291dCddKQoJCQkJCXsKCQkJCQkJJHBhcnNlciA9JiBuZXcgU2ltcGxlUGllX0hUVFBfUGFyc2VyKCR0aGlzLT5oZWFkZXJzKTsKCQkJCQkJaWYgKCRwYXJzZXItPnBhcnNlKCkpCgkJCQkJCXsKCQkJCQkJCSR0aGlzLT5oZWFkZXJzID0gJHBhcnNlci0+aGVhZGVyczsKCQkJCQkJCSR0aGlzLT5ib2R5ID0gJHBhcnNlci0+Ym9keTsKCQkJCQkJCSR0aGlzLT5zdGF0dXNfY29kZSA9ICRwYXJzZXItPnN0YXR1c19jb2RlOwoJCQkJCQkJaWYgKCgkdGhpcy0+c3RhdHVzX2NvZGUgPT0gMzAwIHx8ICR0aGlzLT5zdGF0dXNfY29kZSA9PSAzMDEgfHwgJHRoaXMtPnN0YXR1c19jb2RlID09IDMwMiB8fCAkdGhpcy0+c3RhdHVzX2NvZGUgPT0gMzAzIHx8ICR0aGlzLT5zdGF0dXNfY29kZSA9PSAzMDcgfHwgJHRoaXMtPnN0YXR1c19jb2RlID4gMzA3ICYmICR0aGlzLT5zdGF0dXNfY29kZSA8IDQwMCkgJiYgaXNzZXQoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10pICYmICR0aGlzLT5yZWRpcmVjdHMgPCAkcmVkaXJlY3RzKQoJCQkJCQkJewoJCQkJCQkJCSR0aGlzLT5yZWRpcmVjdHMrKzsKCQkJCQkJCQkkbG9jYXRpb24gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10sICR1cmwpOwoJCQkJCQkJCXJldHVybiAkdGhpcy0+U2ltcGxlUGllX0ZpbGUoJGxvY2F0aW9uLCAkdGltZW91dCwgJHJlZGlyZWN0cywgJGhlYWRlcnMsICR1c2VyYWdlbnQsICRmb3JjZV9mc29ja29wZW4pOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pKQoJCQkJCQkJewoJCQkJCQkJCS8vIEhleSwgd2UgYWN0IGR1bWIgZWxzZXdoZXJlLCBzbyBsZXQncyBkbyB0aGF0IGhlcmUgdG9vCgkJCQkJCQkJc3dpdGNoIChzdHJ0b2xvd2VyKHRyaW0oJHRoaXMtPmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSwgIlx4MDlceDBBXHgwRFx4MjAiKSkpCgkJCQkJCQkJewoJCQkJCQkJCQljYXNlICdnemlwJzoKCQkJCQkJCQkJY2FzZSAneC1nemlwJzoKCQkJCQkJCQkJCSRkZWNvZGVyID0gbmV3IFNpbXBsZVBpZV9nemRlY29kZSgkdGhpcy0+Ym9keSk7CgkJCQkJCQkJCQlpZiAoISRkZWNvZGVyLT5wYXJzZSgpKQoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCSR0aGlzLT5lcnJvciA9ICdVbmFibGUgdG8gZGVjb2RlIEhUVFAgImd6aXAiIHN0cmVhbSc7CgkJCQkJCQkJCQkJJHRoaXMtPnN1Y2Nlc3MgPSBmYWxzZTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQkkdGhpcy0+Ym9keSA9ICRkZWNvZGVyLT5kYXRhOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCQljYXNlICdkZWZsYXRlJzoKCQkJCQkJCQkJCWlmICgoJGJvZHkgPSBnenVuY29tcHJlc3MoJHRoaXMtPmJvZHkpKSA9PT0gZmFsc2UpCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJaWYgKCgkYm9keSA9IGd6aW5mbGF0ZSgkdGhpcy0+Ym9keSkpID09PSBmYWxzZSkKCQkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJCSR0aGlzLT5lcnJvciA9ICdVbmFibGUgdG8gZGVjb2RlIEhUVFAgImRlZmxhdGUiIHN0cmVhbSc7CgkJCQkJCQkJCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJJHRoaXMtPmJvZHkgPSAkYm9keTsKCQkJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkJCSR0aGlzLT5lcnJvciA9ICdVbmtub3duIGNvbnRlbnQgY29kaW5nJzsKCQkJCQkJCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSR0aGlzLT5lcnJvciA9ICdmc29ja2V0IHRpbWVkIG91dCc7CgkJCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCQkJfQoJCQkJCWZjbG9zZSgkZnApOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5tZXRob2QgPSBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfTE9DQUwgfCBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfRklMRV9HRVRfQ09OVEVOVFM7CgkJCWlmICghJHRoaXMtPmJvZHkgPSBmaWxlX2dldF9jb250ZW50cygkdXJsKSkKCQkJewoJCQkJJHRoaXMtPmVycm9yID0gJ2ZpbGVfZ2V0X2NvbnRlbnRzIGNvdWxkIG5vdCByZWFkIHRoZSBmaWxlJzsKCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCX0KCQl9Cgl9Cn0KCi8qKgogKiBIVFRQIFJlc3BvbnNlIFBhcnNlcgogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICovCmNsYXNzIFNpbXBsZVBpZV9IVFRQX1BhcnNlcgp7CgkvKioKCSAqIEhUVFAgVmVyc2lvbgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGZsb2F0CgkgKi8KCXZhciAkaHR0cF92ZXJzaW9uID0gMC4wOwoKCS8qKgoJICogU3RhdHVzIGNvZGUKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJdmFyICRzdGF0dXNfY29kZSA9IDA7CgoJLyoqCgkgKiBSZWFzb24gcGhyYXNlCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkcmVhc29uID0gJyc7CgoJLyoqCgkgKiBLZXkvdmFsdWUgcGFpcnMgb2YgdGhlIGhlYWRlcnMKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGhlYWRlcnMgPSBhcnJheSgpOwoKCS8qKgoJICogQm9keSBvZiB0aGUgcmVzcG9uc2UKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRib2R5ID0gJyc7CgoJLyoqCgkgKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBzdGF0ZSBtYWNoaW5lCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJHN0YXRlID0gJ2h0dHBfdmVyc2lvbic7CgoJLyoqCgkgKiBJbnB1dCBkYXRhCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGRhdGEgPSAnJzsKCgkvKioKCSAqIElucHV0IGRhdGEgbGVuZ3RoICh0byBhdm9pZCBjYWxsaW5nIHN0cmxlbigpIGV2ZXJ5dGltZSB0aGlzIGlzIG5lZWRlZCkKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgaW50CgkgKi8KCXZhciAkZGF0YV9sZW5ndGggPSAwOwoKCS8qKgoJICogQ3VycmVudCBwb3NpdGlvbiBvZiB0aGUgcG9pbnRlcgoJICoKCSAqIEB2YXIgaW50CgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRwb3NpdGlvbiA9IDA7CgoJLyoqCgkgKiBOYW1lIG9mIHRoZSBoZWRhZXIgY3VycmVudGx5IGJlaW5nIHBhcnNlZAoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRuYW1lID0gJyc7CgoJLyoqCgkgKiBWYWx1ZSBvZiB0aGUgaGVkYWVyIGN1cnJlbnRseSBiZWluZyBwYXJzZWQKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkdmFsdWUgPSAnJzsKCgkvKioKCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgaW5wdXQgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIElucHV0IGRhdGEKCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllX0hUVFBfUGFyc2VyKCRkYXRhKQoJewoJCSR0aGlzLT5kYXRhID0gJGRhdGE7CgkJJHRoaXMtPmRhdGFfbGVuZ3RoID0gc3RybGVuKCR0aGlzLT5kYXRhKTsKCX0KCgkvKioKCSAqIFBhcnNlIHRoZSBpbnB1dCBkYXRhCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEByZXR1cm4gYm9vbCB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKCSAqLwoJZnVuY3Rpb24gcGFyc2UoKQoJewoJCXdoaWxlICgkdGhpcy0+c3RhdGUgJiYgJHRoaXMtPnN0YXRlICE9PSAnZW1pdCcgJiYgJHRoaXMtPmhhc19kYXRhKCkpCgkJewoJCQkkc3RhdGUgPSAkdGhpcy0+c3RhdGU7CgkJCSR0aGlzLT4kc3RhdGUoKTsKCQl9CgkJJHRoaXMtPmRhdGEgPSAnJzsKCQlpZiAoJHRoaXMtPnN0YXRlID09PSAnZW1pdCcgfHwgJHRoaXMtPnN0YXRlID09PSAnYm9keScpCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmh0dHBfdmVyc2lvbiA9ICcnOwoJCQkkdGhpcy0+c3RhdHVzX2NvZGUgPSAnJzsKCQkJJHRoaXMtPnJlYXNvbiA9ICcnOwoJCQkkdGhpcy0+aGVhZGVycyA9IGFycmF5KCk7CgkJCSR0aGlzLT5ib2R5ID0gJyc7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGRhdGEgYmV5b25kIHRoZSBwb2ludGVyCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGVyZSBpcyBmdXJ0aGVyIGRhdGEsIGZhbHNlIGlmIG5vdAoJICovCglmdW5jdGlvbiBoYXNfZGF0YSgpCgl7CgkJcmV0dXJuIChib29sKSAoJHRoaXMtPnBvc2l0aW9uIDwgJHRoaXMtPmRhdGFfbGVuZ3RoKTsKCX0KCgkvKioKCSAqIFNlZSBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgTFdTCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgTFdTLCBmYWxzZSBpZiBub3QKCSAqLwoJZnVuY3Rpb24gaXNfbGluZWFyX3doaXRlc3BhY2UoKQoJewoJCXJldHVybiAoYm9vbCkgKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0gPT09ICJceDA5IgoJCQl8fCAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dID09PSAiXHgyMCIKCQkJfHwgKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0gPT09ICJceDBBIgoJCQkJJiYgaXNzZXQoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uICsgMV0pCgkJCQkmJiAoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uICsgMV0gPT09ICJceDA5IiB8fCAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb24gKyAxXSA9PT0gIlx4MjAiKSkpOwoJfQoKCS8qKgoJICogUGFyc2UgdGhlIEhUVFAgdmVyc2lvbgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBodHRwX3ZlcnNpb24oKQoJewoJCWlmIChzdHJwb3MoJHRoaXMtPmRhdGEsICJceDBBIikgIT09IGZhbHNlICYmIHN0cnRvdXBwZXIoc3Vic3RyKCR0aGlzLT5kYXRhLCAwLCA1KSkgPT09ICdIVFRQLycpCgkJewoJCQkkbGVuID0gc3Ryc3BuKCR0aGlzLT5kYXRhLCAnMDEyMzQ1Njc4OS4nLCA1KTsKCQkJJHRoaXMtPmh0dHBfdmVyc2lvbiA9IHN1YnN0cigkdGhpcy0+ZGF0YSwgNSwgJGxlbik7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSA1ICsgJGxlbjsKCQkJaWYgKHN1YnN0cl9jb3VudCgkdGhpcy0+aHR0cF92ZXJzaW9uLCAnLicpIDw9IDEpCgkJCXsKCQkJCSR0aGlzLT5odHRwX3ZlcnNpb24gPSAoZmxvYXQpICR0aGlzLT5odHRwX3ZlcnNpb247CgkJCQkkdGhpcy0+cG9zaXRpb24gKz0gc3Ryc3BuKCR0aGlzLT5kYXRhLCAiXHgwOVx4MjAiLCAkdGhpcy0+cG9zaXRpb24pOwoJCQkJJHRoaXMtPnN0YXRlID0gJ3N0YXR1cyc7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSB0aGUgc3RhdHVzIGNvZGUKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gc3RhdHVzKCkKCXsKCQlpZiAoJGxlbiA9IHN0cnNwbigkdGhpcy0+ZGF0YSwgJzAxMjM0NTY3ODknLCAkdGhpcy0+cG9zaXRpb24pKQoJCXsKCQkJJHRoaXMtPnN0YXR1c19jb2RlID0gKGludCkgc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sICRsZW4pOwoJCQkkdGhpcy0+cG9zaXRpb24gKz0gJGxlbjsKCQkJJHRoaXMtPnN0YXRlID0gJ3JlYXNvbic7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIHRoZSByZWFzb24gcGhyYXNlCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHJlYXNvbigpCgl7CgkJJGxlbiA9IHN0cmNzcG4oJHRoaXMtPmRhdGEsICJceDBBIiwgJHRoaXMtPnBvc2l0aW9uKTsKCQkkdGhpcy0+cmVhc29uID0gdHJpbShzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbiksICJceDA5XHgwRFx4MjAiKTsKCQkkdGhpcy0+cG9zaXRpb24gKz0gJGxlbiArIDE7CgkJJHRoaXMtPnN0YXRlID0gJ25ld19saW5lJzsKCX0KCgkvKioKCSAqIERlYWwgd2l0aCBhIG5ldyBsaW5lLCBzaGlmdGluZyBkYXRhIGFyb3VuZCBhcyBuZWVkZWQKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gbmV3X2xpbmUoKQoJewoJCSR0aGlzLT52YWx1ZSA9IHRyaW0oJHRoaXMtPnZhbHVlLCAiXHgwRFx4MjAiKTsKCQlpZiAoJHRoaXMtPm5hbWUgIT09ICcnICYmICR0aGlzLT52YWx1ZSAhPT0gJycpCgkJewoJCQkkdGhpcy0+bmFtZSA9IHN0cnRvbG93ZXIoJHRoaXMtPm5hbWUpOwoJCQlpZiAoaXNzZXQoJHRoaXMtPmhlYWRlcnNbJHRoaXMtPm5hbWVdKSkKCQkJewoJCQkJJHRoaXMtPmhlYWRlcnNbJHRoaXMtPm5hbWVdIC49ICcsICcgLiAkdGhpcy0+dmFsdWU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+aGVhZGVyc1skdGhpcy0+bmFtZV0gPSAkdGhpcy0+dmFsdWU7CgkJCX0KCQl9CgkJJHRoaXMtPm5hbWUgPSAnJzsKCQkkdGhpcy0+dmFsdWUgPSAnJzsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0sIDAsIDIpID09PSAiXHgwRFx4MEEiKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDI7CgkJCSR0aGlzLT5zdGF0ZSA9ICdib2R5JzsKCQl9CgkJZWxzZWlmICgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dID09PSAiXHgwQSIpCgkJewoJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJJHRoaXMtPnN0YXRlID0gJ2JvZHknOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSAnbmFtZSc7CgkJfQoJfQoKCS8qKgoJICogUGFyc2UgYSBoZWFkZXIgbmFtZQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBuYW1lKCkKCXsKCQkkbGVuID0gc3RyY3NwbigkdGhpcy0+ZGF0YSwgIlx4MEE6IiwgJHRoaXMtPnBvc2l0aW9uKTsKCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uICsgJGxlbl0pKQoJCXsKCQkJaWYgKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbiArICRsZW5dID09PSAiXHgwQSIpCgkJCXsKCQkJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuOwoJCQkJJHRoaXMtPnN0YXRlID0gJ25ld19saW5lJzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5uYW1lID0gc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sICRsZW4pOwoJCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW4gKyAxOwoJCQkJJHRoaXMtPnN0YXRlID0gJ3ZhbHVlJzsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBMV1MsIHJlcGxhY2luZyBjb25zZWN1dGl2ZSBMV1MgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIGxpbmVhcl93aGl0ZXNwYWNlKCkKCXsKCQlkbwoJCXsKCQkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAyKSA9PT0gIlx4MERceDBBIikKCQkJewoJCQkJJHRoaXMtPnBvc2l0aW9uICs9IDI7CgkJCX0KCQkJZWxzZWlmICgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dID09PSAiXHgwQSIpCgkJCXsKCQkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQl9CgkJCSR0aGlzLT5wb3NpdGlvbiArPSBzdHJzcG4oJHRoaXMtPmRhdGEsICJceDA5XHgyMCIsICR0aGlzLT5wb3NpdGlvbik7CgkJfSB3aGlsZSAoJHRoaXMtPmhhc19kYXRhKCkgJiYgJHRoaXMtPmlzX2xpbmVhcl93aGl0ZXNwYWNlKCkpOwoJCSR0aGlzLT52YWx1ZSAuPSAiXHgyMCI7Cgl9CgoJLyoqCgkgKiBTZWUgd2hhdCBzdGF0ZSB0byBtb3ZlIHRvIHdoaWxlIHdpdGhpbiBub24tcXVvdGVkIGhlYWRlciB2YWx1ZXMKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gdmFsdWUoKQoJewoJCWlmICgkdGhpcy0+aXNfbGluZWFyX3doaXRlc3BhY2UoKSkKCQl7CgkJCSR0aGlzLT5saW5lYXJfd2hpdGVzcGFjZSgpOwoJCX0KCQllbHNlCgkJewoJCQlzd2l0Y2ggKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0pCgkJCXsKCQkJCWNhc2UgJyInOgoJCQkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkJCSR0aGlzLT5zdGF0ZSA9ICdxdW90ZSc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAiXHgwQSI6CgkJCQkJJHRoaXMtPnBvc2l0aW9uKys7CgkJCQkJJHRoaXMtPnN0YXRlID0gJ25ld19saW5lJzsKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCSR0aGlzLT5zdGF0ZSA9ICd2YWx1ZV9jaGFyJzsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIGEgaGVhZGVyIHZhbHVlIHdoaWxlIG91dHNpZGUgcXVvdGVzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHZhbHVlX2NoYXIoKQoJewoJCSRsZW4gPSBzdHJjc3BuKCR0aGlzLT5kYXRhLCAiXHgwOVx4MjBceDBBXCIiLCAkdGhpcy0+cG9zaXRpb24pOwoJCSR0aGlzLT52YWx1ZSAuPSBzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW47CgkJJHRoaXMtPnN0YXRlID0gJ3ZhbHVlJzsKCX0KCgkvKioKCSAqIFNlZSB3aGF0IHN0YXRlIHRvIG1vdmUgdG8gd2hpbGUgd2l0aGluIHF1b3RlZCBoZWFkZXIgdmFsdWVzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHF1b3RlKCkKCXsKCQlpZiAoJHRoaXMtPmlzX2xpbmVhcl93aGl0ZXNwYWNlKCkpCgkJewoJCQkkdGhpcy0+bGluZWFyX3doaXRlc3BhY2UoKTsKCQl9CgkJZWxzZQoJCXsKCQkJc3dpdGNoICgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dKQoJCQl7CgkJCQljYXNlICciJzoKCQkJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJCQkkdGhpcy0+c3RhdGUgPSAndmFsdWUnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgIlx4MEEiOgoJCQkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkJCSR0aGlzLT5zdGF0ZSA9ICduZXdfbGluZSc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnXFwnOgoJCQkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkJCSR0aGlzLT5zdGF0ZSA9ICdxdW90ZV9lc2NhcGVkJzsKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCSR0aGlzLT5zdGF0ZSA9ICdxdW90ZV9jaGFyJzsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIGEgaGVhZGVyIHZhbHVlIHdoaWxlIHdpdGhpbiBxdW90ZXMKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gcXVvdGVfY2hhcigpCgl7CgkJJGxlbiA9IHN0cmNzcG4oJHRoaXMtPmRhdGEsICJceDA5XHgyMFx4MEFcIlxcIiwgJHRoaXMtPnBvc2l0aW9uKTsKCQkkdGhpcy0+dmFsdWUgLj0gc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sICRsZW4pOwoJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuOwoJCSR0aGlzLT5zdGF0ZSA9ICd2YWx1ZSc7Cgl9CgoJLyoqCgkgKiBQYXJzZSBhbiBlc2NhcGVkIGNoYXJhY3RlciB3aXRoaW4gcXVvdGVzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHF1b3RlX2VzY2FwZWQoKQoJewoJCSR0aGlzLT52YWx1ZSAuPSAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dOwoJCSR0aGlzLT5wb3NpdGlvbisrOwoJCSR0aGlzLT5zdGF0ZSA9ICdxdW90ZSc7Cgl9CgoJLyoqCgkgKiBQYXJzZSB0aGUgYm9keQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBib2R5KCkKCXsKCQkkdGhpcy0+Ym9keSA9IHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uKTsKCQkkdGhpcy0+c3RhdGUgPSAnZW1pdCc7Cgl9Cn0KCi8qKgogKiBnemRlY29kZQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICovCmNsYXNzIFNpbXBsZVBpZV9nemRlY29kZQp7CgkvKioKCSAqIENvbXByZXNzZWQgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNlZSBnemRlY29kZTo6JGRhdGEKCSAqLwoJdmFyICRjb21wcmVzc2VkX2RhdGE7CgoJLyoqCgkgKiBTaXplIG9mIGNvbXByZXNzZWQgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNvbXByZXNzZWRfc2l6ZTsKCgkvKioKCSAqIE1pbmltdW0gc2l6ZSBvZiBhIHZhbGlkIGd6aXAgc3RyaW5nCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkbWluX2NvbXByZXNzZWRfc2l6ZSA9IDE4OwoKCS8qKgoJICogQ3VycmVudCBwb3NpdGlvbiBvZiBwb2ludGVyCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcG9zaXRpb24gPSAwOwoKCS8qKgoJICogRmxhZ3MgKEZMRykKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmbGFnczsKCgkvKioKCSAqIFVuY29tcHJlc3NlZCBkYXRhCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzZWUgZ3pkZWNvZGU6OiRjb21wcmVzc2VkX2RhdGEKCSAqLwoJdmFyICRkYXRhOwoKCS8qKgoJICogTW9kaWZpZWQgdGltZQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkTVRJTUU7CgoJLyoqCgkgKiBFeHRyYSBGbGFncwoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkWEZMOwoKCS8qKgoJICogT3BlcmF0aW5nIFN5c3RlbQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkT1M7CgoJLyoqCgkgKiBTdWJmaWVsZCBJRCAxCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzZWUgZ3pkZWNvZGU6OiRleHRyYV9maWVsZAoJICogQHNlZSBnemRlY29kZTo6JFNJMgoJICovCgl2YXIgJFNJMTsKCgkvKioKCSAqIFN1YmZpZWxkIElEIDIKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNlZSBnemRlY29kZTo6JGV4dHJhX2ZpZWxkCgkgKiBAc2VlIGd6ZGVjb2RlOjokU0kxCgkgKi8KCXZhciAkU0kyOwoKCS8qKgoJICogRXh0cmEgZmllbGQgY29udGVudAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2VlIGd6ZGVjb2RlOjokU0kxCgkgKiBAc2VlIGd6ZGVjb2RlOjokU0kyCgkgKi8KCXZhciAkZXh0cmFfZmllbGQ7CgoJLyoqCgkgKiBPcmlnaW5hbCBmaWxlbmFtZQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkZmlsZW5hbWU7CgoJLyoqCgkgKiBIdW1hbiByZWFkYWJsZSBjb21tZW50CgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJdmFyICRjb21tZW50OwoKCS8qKgoJICogRG9uJ3QgYWxsb3cgYW55dGhpbmcgdG8gYmUgc2V0CgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJZnVuY3Rpb24gX19zZXQoJG5hbWUsICR2YWx1ZSkKCXsKCQl0cmlnZ2VyX2Vycm9yKCJDYW5ub3Qgd3JpdGUgcHJvcGVydHkgJG5hbWUiLCBFX1VTRVJfRVJST1IpOwoJfQoKCS8qKgoJICogU2V0IHRoZSBjb21wcmVzc2VkIHN0cmluZyBhbmQgcmVsYXRlZCBwcm9wZXJ0aWVzCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllX2d6ZGVjb2RlKCRkYXRhKQoJewoJCSR0aGlzLT5jb21wcmVzc2VkX2RhdGEgPSAkZGF0YTsKCQkkdGhpcy0+Y29tcHJlc3NlZF9zaXplID0gc3RybGVuKCRkYXRhKTsKCX0KCgkvKioKCSAqIERlY29kZSB0aGUgR1pJUCBzdHJlYW0KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCglmdW5jdGlvbiBwYXJzZSgpCgl7CgkJaWYgKCR0aGlzLT5jb21wcmVzc2VkX3NpemUgPj0gJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUpCgkJewoJCQkvLyBDaGVjayBJRDEsIElEMiwgYW5kIENNCgkJCWlmIChzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgMCwgMykgIT09ICJceDFGXHg4Qlx4MDgiKQoJCQl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCS8vIEdldCB0aGUgRkxHIChGTGFHcykKCQkJJHRoaXMtPmZsYWdzID0gb3JkKCR0aGlzLT5jb21wcmVzc2VkX2RhdGFbM10pOwoKCQkJLy8gRkxHIGJpdHMgYWJvdmUgKDEgPDwgNCkgYXJlIHJlc2VydmVkCgkJCWlmICgkdGhpcy0+ZmxhZ3MgPiAweDFGKQoJCQl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCS8vIEFkdmFuY2UgdGhlIHBvaW50ZXIgYWZ0ZXIgdGhlIGFib3ZlCgkJCSR0aGlzLT5wb3NpdGlvbiArPSA0OwoKCQkJLy8gTVRJTUUKCQkJJG10aW1lID0gc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgNCk7CgkJCS8vIFJldmVyc2UgdGhlIHN0cmluZyBpZiB3ZSdyZSBvbiBhIGJpZy1lbmRpYW4gYXJjaCBiZWNhdXNlIGwgaXMgdGhlIG9ubHkgc2lnbmVkIGxvbmcgYW5kIGlzIG1hY2hpbmUgZW5kaWFubmVzcwoJCQlpZiAoY3VycmVudCh1bnBhY2soJ1MnLCAiXHgwMFx4MDEiKSkgPT09IDEpCgkJCXsKCQkJCSRtdGltZSA9IHN0cnJldigkbXRpbWUpOwoJCQl9CgkJCSR0aGlzLT5NVElNRSA9IGN1cnJlbnQodW5wYWNrKCdsJywgJG10aW1lKSk7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSA0OwoKCQkJLy8gR2V0IHRoZSBYRkwgKGVYdHJhIEZMYWdzKQoJCQkkdGhpcy0+WEZMID0gb3JkKCR0aGlzLT5jb21wcmVzc2VkX2RhdGFbJHRoaXMtPnBvc2l0aW9uKytdKTsKCgkJCS8vIEdldCB0aGUgT1MgKE9wZXJhdGluZyBTeXN0ZW0pCgkJCSR0aGlzLT5PUyA9IG9yZCgkdGhpcy0+Y29tcHJlc3NlZF9kYXRhWyR0aGlzLT5wb3NpdGlvbisrXSk7CgoJCQkvLyBQYXJzZSB0aGUgRkVYVFJBCgkJCWlmICgkdGhpcy0+ZmxhZ3MgJiA0KQoJCQl7CgkJCQkvLyBSZWFkIHN1YmZpZWxkIElEcwoJCQkJJHRoaXMtPlNJMSA9ICR0aGlzLT5jb21wcmVzc2VkX2RhdGFbJHRoaXMtPnBvc2l0aW9uKytdOwoJCQkJJHRoaXMtPlNJMiA9ICR0aGlzLT5jb21wcmVzc2VkX2RhdGFbJHRoaXMtPnBvc2l0aW9uKytdOwoKCQkJCS8vIFNJMiBzZXQgdG8gemVybyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQoJCQkJaWYgKCR0aGlzLT5TSTIgPT09ICJceDAwIikKCQkJCXsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgoJCQkJLy8gR2V0IHRoZSBsZW5ndGggb2YgdGhlIGV4dHJhIGZpZWxkCgkJCQkkbGVuID0gY3VycmVudCh1bnBhY2soJ3YnLCBzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAyKSkpOwoJCQkJJHBvc2l0aW9uICs9IDI7CgoJCQkJLy8gQ2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIHN0aWxsIHZhbGlkCgkJCQkkdGhpcy0+bWluX2NvbXByZXNzZWRfc2l6ZSArPSAkbGVuICsgNDsKCQkJCWlmICgkdGhpcy0+Y29tcHJlc3NlZF9zaXplID49ICR0aGlzLT5taW5fY29tcHJlc3NlZF9zaXplKQoJCQkJewoJCQkJCS8vIFNldCB0aGUgZXh0cmEgZmllbGQgdG8gdGhlIGdpdmVuIGRhdGEKCQkJCQkkdGhpcy0+ZXh0cmFfZmllbGQgPSBzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAkbGVuKTsKCQkJCQkkdGhpcy0+cG9zaXRpb24gKz0gJGxlbjsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCgkJCS8vIFBhcnNlIHRoZSBGTkFNRQoJCQlpZiAoJHRoaXMtPmZsYWdzICYgOCkKCQkJewoJCQkJLy8gR2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpbGVuYW1lCgkJCQkkbGVuID0gc3Ryc3BuKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICJceDAwIiwgJHRoaXMtPnBvc2l0aW9uKTsKCgkJCQkvLyBDaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgc3RpbGwgdmFsaWQKCQkJCSR0aGlzLT5taW5fY29tcHJlc3NlZF9zaXplICs9ICRsZW4gKyAxOwoJCQkJaWYgKCR0aGlzLT5jb21wcmVzc2VkX3NpemUgPj0gJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUpCgkJCQl7CgkJCQkJLy8gU2V0IHRoZSBvcmlnaW5hbCBmaWxlbmFtZSB0byB0aGUgZ2l2ZW4gc3RyaW5nCgkJCQkJJHRoaXMtPmZpbGVuYW1lID0gc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW4gKyAxOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoKCQkJLy8gUGFyc2UgdGhlIEZDT01NRU5UCgkJCWlmICgkdGhpcy0+ZmxhZ3MgJiAxNikKCQkJewoJCQkJLy8gR2V0IHRoZSBsZW5ndGggb2YgdGhlIGNvbW1lbnQKCQkJCSRsZW4gPSBzdHJzcG4oJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgIlx4MDAiLCAkdGhpcy0+cG9zaXRpb24pOwoKCQkJCS8vIENoZWNrIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBzdGlsbCB2YWxpZAoJCQkJJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUgKz0gJGxlbiArIDE7CgkJCQlpZiAoJHRoaXMtPmNvbXByZXNzZWRfc2l6ZSA+PSAkdGhpcy0+bWluX2NvbXByZXNzZWRfc2l6ZSkKCQkJCXsKCQkJCQkvLyBTZXQgdGhlIG9yaWdpbmFsIGNvbW1lbnQgdG8gdGhlIGdpdmVuIHN0cmluZwoJCQkJCSR0aGlzLT5jb21tZW50ID0gc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW4gKyAxOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoKCQkJLy8gUGFyc2UgdGhlIEZIQ1JDCgkJCWlmICgkdGhpcy0+ZmxhZ3MgJiAyKQoJCQl7CgkJCQkvLyBDaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgc3RpbGwgdmFsaWQKCQkJCSR0aGlzLT5taW5fY29tcHJlc3NlZF9zaXplICs9ICRsZW4gKyAyOwoJCQkJaWYgKCR0aGlzLT5jb21wcmVzc2VkX3NpemUgPj0gJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUpCgkJCQl7CgkJCQkJLy8gUmVhZCB0aGUgQ1JDCgkJCQkJJGNyYyA9IGN1cnJlbnQodW5wYWNrKCd2Jywgc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgMikpKTsKCgkJCQkJLy8gQ2hlY2sgdGhlIENSQyBtYXRjaGVzCgkJCQkJaWYgKChjcmMzMihzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgMCwgJHRoaXMtPnBvc2l0aW9uKSkgJiAweEZGRkYpID09PSAkY3JjKQoJCQkJCXsKCQkJCQkJJHRoaXMtPnBvc2l0aW9uICs9IDI7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQkvLyBEZWNvbXByZXNzIHRoZSBhY3R1YWwgZGF0YQoJCQlpZiAoKCR0aGlzLT5kYXRhID0gZ3ppbmZsYXRlKHN1YnN0cigkdGhpcy0+Y29tcHJlc3NlZF9kYXRhLCAkdGhpcy0+cG9zaXRpb24sIC04KSkpID09PSBmYWxzZSkKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPnBvc2l0aW9uID0gJHRoaXMtPmNvbXByZXNzZWRfc2l6ZSAtIDg7CgkJCX0KCgkJCS8vIENoZWNrIENSQyBvZiBkYXRhCgkJCSRjcmMgPSBjdXJyZW50KHVucGFjaygnVicsIHN1YnN0cigkdGhpcy0+Y29tcHJlc3NlZF9kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDQpKSk7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSA0OwoJCQkvKmlmIChleHRlbnNpb25fbG9hZGVkKCdoYXNoJykgJiYgc3ByaW50ZignJXUnLCBjdXJyZW50KHVucGFjaygnVicsIGhhc2goJ2NyYzMyYicsICR0aGlzLT5kYXRhKSkpKSAhPT0gc3ByaW50ZignJXUnLCAkY3JjKSkKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9Ki8KCgkJCS8vIENoZWNrIElTSVpFIG9mIGRhdGEKCQkJJGlzaXplID0gY3VycmVudCh1bnBhY2soJ1YnLCBzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCA0KSkpOwoJCQkkdGhpcy0+cG9zaXRpb24gKz0gNDsKCQkJaWYgKHNwcmludGYoJyV1Jywgc3RybGVuKCR0aGlzLT5kYXRhKSAmIDB4RkZGRkZGRkYpICE9PSBzcHJpbnRmKCcldScsICRpc2l6ZSkpCgkJCXsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJLy8gV293LCBhZ2FpbnN0IGFsbCBvZGRzLCB3ZSd2ZSBhY3R1YWxseSBnb3QgYSB2YWxpZCBnemlwIHN0cmluZwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0NhY2hlCnsKCS8qKgoJICogRG9uJ3QgY2FsbCB0aGUgY29uc3RydWN0b3IuIFBsZWFzZS4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllX0NhY2hlKCkKCXsKCQl0cmlnZ2VyX2Vycm9yKCdQbGVhc2UgY2FsbCBTaW1wbGVQaWVfQ2FjaGU6OmNyZWF0ZSgpIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yJywgRV9VU0VSX0VSUk9SKTsKCX0KCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBTaW1wbGVQaWVfQ2FjaGUgb2JqZWN0CgkgKgoJICogQHN0YXRpYwoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJZnVuY3Rpb24gY3JlYXRlKCRsb2NhdGlvbiwgJGZpbGVuYW1lLCAkZXh0ZW5zaW9uKQoJewoJCXJldHVybiBuZXcgU2ltcGxlUGllX0NhY2hlX0ZpbGUoJGxvY2F0aW9uLCAkZmlsZW5hbWUsICRleHRlbnNpb24pOwoJfQp9CgpjbGFzcyBTaW1wbGVQaWVfQ2FjaGVfRmlsZQp7Cgl2YXIgJGxvY2F0aW9uOwoJdmFyICRmaWxlbmFtZTsKCXZhciAkZXh0ZW5zaW9uOwoJdmFyICRuYW1lOwoKCWZ1bmN0aW9uIFNpbXBsZVBpZV9DYWNoZV9GaWxlKCRsb2NhdGlvbiwgJGZpbGVuYW1lLCAkZXh0ZW5zaW9uKQoJewoJCSR0aGlzLT5sb2NhdGlvbiA9ICRsb2NhdGlvbjsKCQkkdGhpcy0+ZmlsZW5hbWUgPSByYXd1cmxlbmNvZGUoJGZpbGVuYW1lKTsKCQkkdGhpcy0+ZXh0ZW5zaW9uID0gcmF3dXJsZW5jb2RlKCRleHRlbnNpb24pOwoJCSR0aGlzLT5uYW1lID0gIiRsb2NhdGlvbi8kdGhpcy0+ZmlsZW5hbWUuJHRoaXMtPmV4dGVuc2lvbiI7Cgl9CgoJZnVuY3Rpb24gc2F2ZSgkZGF0YSkKCXsKCQlpZiAoZmlsZV9leGlzdHMoJHRoaXMtPm5hbWUpICYmIGlzX3dyaXRlYWJsZSgkdGhpcy0+bmFtZSkgfHwgZmlsZV9leGlzdHMoJHRoaXMtPmxvY2F0aW9uKSAmJiBpc193cml0ZWFibGUoJHRoaXMtPmxvY2F0aW9uKSkKCQl7CgkJCWlmIChpc19hKCRkYXRhLCAnU2ltcGxlUGllJykpCgkJCXsKCQkJCSRkYXRhID0gJGRhdGEtPmRhdGE7CgkJCX0KCgkJCSRkYXRhID0gc2VyaWFsaXplKCRkYXRhKTsKCgkJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2ZpbGVfcHV0X2NvbnRlbnRzJykpCgkJCXsKCQkJCXJldHVybiAoYm9vbCkgZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPm5hbWUsICRkYXRhKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRmcCA9IGZvcGVuKCR0aGlzLT5uYW1lLCAnd2InKTsKCQkJCWlmICgkZnApCgkJCQl7CgkJCQkJZndyaXRlKCRmcCwgJGRhdGEpOwoJCQkJCWZjbG9zZSgkZnApOwoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBsb2FkKCkKCXsKCQlpZiAoZmlsZV9leGlzdHMoJHRoaXMtPm5hbWUpICYmIGlzX3JlYWRhYmxlKCR0aGlzLT5uYW1lKSkKCQl7CgkJCXJldHVybiB1bnNlcmlhbGl6ZShmaWxlX2dldF9jb250ZW50cygkdGhpcy0+bmFtZSkpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gbXRpbWUoKQoJewoJCWlmIChmaWxlX2V4aXN0cygkdGhpcy0+bmFtZSkpCgkJewoJCQlyZXR1cm4gZmlsZW10aW1lKCR0aGlzLT5uYW1lKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIHRvdWNoKCkKCXsKCQlpZiAoZmlsZV9leGlzdHMoJHRoaXMtPm5hbWUpKQoJCXsKCQkJcmV0dXJuIHRvdWNoKCR0aGlzLT5uYW1lKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIHVubGluaygpCgl7CgkJaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5uYW1lKSkKCQl7CgkJCXJldHVybiB1bmxpbmsoJHRoaXMtPm5hbWUpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9NaXNjCnsKCWZ1bmN0aW9uIHRpbWVfaG1zKCRzZWNvbmRzKQoJewoJCSR0aW1lID0gJyc7CgoJCSRob3VycyA9IGZsb29yKCRzZWNvbmRzIC8gMzYwMCk7CgkJJHJlbWFpbmRlciA9ICRzZWNvbmRzICUgMzYwMDsKCQlpZiAoJGhvdXJzID4gMCkKCQl7CgkJCSR0aW1lIC49ICRob3Vycy4nOic7CgkJfQoKCQkkbWludXRlcyA9IGZsb29yKCRyZW1haW5kZXIgLyA2MCk7CgkJJHNlY29uZHMgPSAkcmVtYWluZGVyICUgNjA7CgkJaWYgKCRtaW51dGVzIDwgMTAgJiYgJGhvdXJzID4gMCkKCQl7CgkJCSRtaW51dGVzID0gJzAnIC4gJG1pbnV0ZXM7CgkJfQoJCWlmICgkc2Vjb25kcyA8IDEwKQoJCXsKCQkJJHNlY29uZHMgPSAnMCcgLiAkc2Vjb25kczsKCQl9CgoJCSR0aW1lIC49ICRtaW51dGVzLic6JzsKCQkkdGltZSAuPSAkc2Vjb25kczsKCgkJcmV0dXJuICR0aW1lOwoJfQoKCWZ1bmN0aW9uIGFic29sdXRpemVfdXJsKCRyZWxhdGl2ZSwgJGJhc2UpCgl7CgkJaWYgKCRyZWxhdGl2ZSAhPT0gJycpCgkJewoJCQkkcmVsYXRpdmUgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCRyZWxhdGl2ZSk7CgkJCWlmICgkcmVsYXRpdmVbJ3NjaGVtZSddICE9PSAnJykKCQkJewoJCQkJJHRhcmdldCA9ICRyZWxhdGl2ZTsKCQkJfQoJCQllbHNlaWYgKCRiYXNlICE9PSAnJykKCQkJewoJCQkJJGJhc2UgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCRiYXNlKTsKCQkJCSR0YXJnZXQgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCcnKTsKCQkJCWlmICgkcmVsYXRpdmVbJ2F1dGhvcml0eSddICE9PSAnJykKCQkJCXsKCQkJCQkkdGFyZ2V0ID0gJHJlbGF0aXZlOwoJCQkJCSR0YXJnZXRbJ3NjaGVtZSddID0gJGJhc2VbJ3NjaGVtZSddOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSR0YXJnZXRbJ3NjaGVtZSddID0gJGJhc2VbJ3NjaGVtZSddOwoJCQkJCSR0YXJnZXRbJ2F1dGhvcml0eSddID0gJGJhc2VbJ2F1dGhvcml0eSddOwoJCQkJCWlmICgkcmVsYXRpdmVbJ3BhdGgnXSAhPT0gJycpCgkJCQkJewoJCQkJCQlpZiAoc3RycG9zKCRyZWxhdGl2ZVsncGF0aCddLCAnLycpID09PSAwKQoJCQkJCQl7CgkJCQkJCQkkdGFyZ2V0WydwYXRoJ10gPSAkcmVsYXRpdmVbJ3BhdGgnXTsKCQkJCQkJfQoJCQkJCQllbHNlaWYgKCRiYXNlWydhdXRob3JpdHknXSAhPT0gJycgJiYgJGJhc2VbJ3BhdGgnXSA9PT0gJycpCgkJCQkJCXsKCQkJCQkJCSR0YXJnZXRbJ3BhdGgnXSA9ICcvJyAuICRyZWxhdGl2ZVsncGF0aCddOwoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoKCRsYXN0X3NlZ21lbnQgPSBzdHJycG9zKCRiYXNlWydwYXRoJ10sICcvJykpICE9PSBmYWxzZSkKCQkJCQkJewoJCQkJCQkJJHRhcmdldFsncGF0aCddID0gc3Vic3RyKCRiYXNlWydwYXRoJ10sIDAsICRsYXN0X3NlZ21lbnQgKyAxKSAuICRyZWxhdGl2ZVsncGF0aCddOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHRhcmdldFsncGF0aCddID0gJHJlbGF0aXZlWydwYXRoJ107CgkJCQkJCX0KCQkJCQkJJHRhcmdldFsncXVlcnknXSA9ICRyZWxhdGl2ZVsncXVlcnknXTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHRhcmdldFsncGF0aCddID0gJGJhc2VbJ3BhdGgnXTsKCQkJCQkJaWYgKCRyZWxhdGl2ZVsncXVlcnknXSAhPT0gJycpCgkJCQkJCXsKCQkJCQkJCSR0YXJnZXRbJ3F1ZXJ5J10gPSAkcmVsYXRpdmVbJ3F1ZXJ5J107CgkJCQkJCX0KCQkJCQkJZWxzZWlmICgkYmFzZVsncXVlcnknXSAhPT0gJycpCgkJCQkJCXsKCQkJCQkJCSR0YXJnZXRbJ3F1ZXJ5J10gPSAkYmFzZVsncXVlcnknXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCSR0YXJnZXRbJ2ZyYWdtZW50J10gPSAkcmVsYXRpdmVbJ2ZyYWdtZW50J107CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvLyBObyBiYXNlIFVSTCwganVzdCByZXR1cm4gdGhlIHJlbGF0aXZlIFVSTAoJCQkJJHRhcmdldCA9ICRyZWxhdGl2ZTsKCQkJfQoJCQkkcmV0dXJuID0gU2ltcGxlUGllX01pc2M6OmNvbXByZXNzX3BhcnNlX3VybCgkdGFyZ2V0WydzY2hlbWUnXSwgJHRhcmdldFsnYXV0aG9yaXR5J10sICR0YXJnZXRbJ3BhdGgnXSwgJHRhcmdldFsncXVlcnknXSwgJHRhcmdldFsnZnJhZ21lbnQnXSk7CgkJfQoJCWVsc2UKCQl7CgkJCSRyZXR1cm4gPSAkYmFzZTsKCQl9CgkJJHJldHVybiA9IFNpbXBsZVBpZV9NaXNjOjpub3JtYWxpemVfdXJsKCRyZXR1cm4pOwoJCXJldHVybiAkcmV0dXJuOwoJfQoKCWZ1bmN0aW9uIHJlbW92ZV9kb3Rfc2VnbWVudHMoJGlucHV0KQoJewoJCSRvdXRwdXQgPSAnJzsKCQl3aGlsZSAoc3RycG9zKCRpbnB1dCwgJy4vJykgIT09IGZhbHNlIHx8IHN0cnBvcygkaW5wdXQsICcvLicpICE9PSBmYWxzZSB8fCAkaW5wdXQgPT0gJy4nIHx8ICRpbnB1dCA9PSAnLi4nKQoJCXsKCQkJLy8gQTogSWYgdGhlIGlucHV0IGJ1ZmZlciBiZWdpbnMgd2l0aCBhIHByZWZpeCBvZiAiLi4vIiBvciAiLi8iLCB0aGVuIHJlbW92ZSB0aGF0IHByZWZpeCBmcm9tIHRoZSBpbnB1dCBidWZmZXI7IG90aGVyd2lzZSwKCQkJaWYgKHN0cnBvcygkaW5wdXQsICcuLi8nKSA9PT0gMCkKCQkJewoJCQkJJGlucHV0ID0gc3Vic3RyKCRpbnB1dCwgMyk7CgkJCX0KCQkJZWxzZWlmIChzdHJwb3MoJGlucHV0LCAnLi8nKSA9PT0gMCkKCQkJewoJCQkJJGlucHV0ID0gc3Vic3RyKCRpbnB1dCwgMik7CgkJCX0KCQkJLy8gQjogaWYgdGhlIGlucHV0IGJ1ZmZlciBiZWdpbnMgd2l0aCBhIHByZWZpeCBvZiAiLy4vIiBvciAiLy4iLCB3aGVyZSAiLiIgaXMgYSBjb21wbGV0ZSBwYXRoIHNlZ21lbnQsIHRoZW4gcmVwbGFjZSB0aGF0IHByZWZpeCB3aXRoICIvIiBpbiB0aGUgaW5wdXQgYnVmZmVyOyBvdGhlcndpc2UsCgkJCWVsc2VpZiAoc3RycG9zKCRpbnB1dCwgJy8uLycpID09PSAwKQoJCQl7CgkJCQkkaW5wdXQgPSBzdWJzdHJfcmVwbGFjZSgkaW5wdXQsICcvJywgMCwgMyk7CgkJCX0KCQkJZWxzZWlmICgkaW5wdXQgPT0gJy8uJykKCQkJewoJCQkJJGlucHV0ID0gJy8nOwoJCQl9CgkJCS8vIEM6IGlmIHRoZSBpbnB1dCBidWZmZXIgYmVnaW5zIHdpdGggYSBwcmVmaXggb2YgIi8uLi8iIG9yICIvLi4iLCB3aGVyZSAiLi4iIGlzIGEgY29tcGxldGUgcGF0aCBzZWdtZW50LCB0aGVuIHJlcGxhY2UgdGhhdCBwcmVmaXggd2l0aCAiLyIgaW4gdGhlIGlucHV0IGJ1ZmZlciBhbmQgcmVtb3ZlIHRoZSBsYXN0IHNlZ21lbnQgYW5kIGl0cyBwcmVjZWRpbmcgIi8iIChpZiBhbnkpIGZyb20gdGhlIG91dHB1dCBidWZmZXI7IG90aGVyd2lzZSwKCQkJZWxzZWlmIChzdHJwb3MoJGlucHV0LCAnLy4uLycpID09PSAwKQoJCQl7CgkJCQkkaW5wdXQgPSBzdWJzdHJfcmVwbGFjZSgkaW5wdXQsICcvJywgMCwgNCk7CgkJCQkkb3V0cHV0ID0gc3Vic3RyX3JlcGxhY2UoJG91dHB1dCwgJycsIHN0cnJwb3MoJG91dHB1dCwgJy8nKSk7CgkJCX0KCQkJZWxzZWlmICgkaW5wdXQgPT0gJy8uLicpCgkJCXsKCQkJCSRpbnB1dCA9ICcvJzsKCQkJCSRvdXRwdXQgPSBzdWJzdHJfcmVwbGFjZSgkb3V0cHV0LCAnJywgc3RycnBvcygkb3V0cHV0LCAnLycpKTsKCQkJfQoJCQkvLyBEOiBpZiB0aGUgaW5wdXQgYnVmZmVyIGNvbnNpc3RzIG9ubHkgb2YgIi4iIG9yICIuLiIsIHRoZW4gcmVtb3ZlIHRoYXQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyOyBvdGhlcndpc2UsCgkJCWVsc2VpZiAoJGlucHV0ID09ICcuJyB8fCAkaW5wdXQgPT0gJy4uJykKCQkJewoJCQkJJGlucHV0ID0gJyc7CgkJCX0KCQkJLy8gRTogbW92ZSB0aGUgZmlyc3QgcGF0aCBzZWdtZW50IGluIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgb3V0cHV0IGJ1ZmZlciwgaW5jbHVkaW5nIHRoZSBpbml0aWFsICIvIiBjaGFyYWN0ZXIgKGlmIGFueSkgYW5kIGFueSBzdWJzZXF1ZW50IGNoYXJhY3RlcnMgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgbmV4dCAiLyIgY2hhcmFjdGVyIG9yIHRoZSBlbmQgb2YgdGhlIGlucHV0IGJ1ZmZlcgoJCQllbHNlaWYgKCgkcG9zID0gc3RycG9zKCRpbnB1dCwgJy8nLCAxKSkgIT09IGZhbHNlKQoJCQl7CgkJCQkkb3V0cHV0IC49IHN1YnN0cigkaW5wdXQsIDAsICRwb3MpOwoJCQkJJGlucHV0ID0gc3Vic3RyX3JlcGxhY2UoJGlucHV0LCAnJywgMCwgJHBvcyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkb3V0cHV0IC49ICRpbnB1dDsKCQkJCSRpbnB1dCA9ICcnOwoJCQl9CgkJfQoJCXJldHVybiAkb3V0cHV0IC4gJGlucHV0OwoJfQoKCWZ1bmN0aW9uIGdldF9lbGVtZW50KCRyZWFsbmFtZSwgJHN0cmluZykKCXsKCQkkcmV0dXJuID0gYXJyYXkoKTsKCQkkbmFtZSA9IHByZWdfcXVvdGUoJHJlYWxuYW1lLCAnLycpOwoJCWlmIChwcmVnX21hdGNoX2FsbCgiLzwoJG5hbWUpIiAuIFNJTVBMRVBJRV9QQ1JFX0hUTUxfQVRUUklCVVRFIC4gIig+KC4qKTxcLyRuYW1lPnwoXC8pPz4pL3NpVSIsICRzdHJpbmcsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUiB8IFBSRUdfT0ZGU0VUX0NBUFRVUkUpKQoJCXsKCQkJZm9yICgkaSA9IDAsICR0b3RhbF9tYXRjaGVzID0gY291bnQoJG1hdGNoZXMpOyAkaSA8ICR0b3RhbF9tYXRjaGVzOyAkaSsrKQoJCQl7CgkJCQkkcmV0dXJuWyRpXVsndGFnJ10gPSAkcmVhbG5hbWU7CgkJCQkkcmV0dXJuWyRpXVsnZnVsbCddID0gJG1hdGNoZXNbJGldWzBdWzBdOwoJCQkJJHJldHVyblskaV1bJ29mZnNldCddID0gJG1hdGNoZXNbJGldWzBdWzFdOwoJCQkJaWYgKHN0cmxlbigkbWF0Y2hlc1skaV1bM11bMF0pIDw9IDIpCgkJCQl7CgkJCQkJJHJldHVyblskaV1bJ3NlbGZfY2xvc2luZyddID0gdHJ1ZTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkcmV0dXJuWyRpXVsnc2VsZl9jbG9zaW5nJ10gPSBmYWxzZTsKCQkJCQkkcmV0dXJuWyRpXVsnY29udGVudCddID0gJG1hdGNoZXNbJGldWzRdWzBdOwoJCQkJfQoJCQkJJHJldHVyblskaV1bJ2F0dHJpYnMnXSA9IGFycmF5KCk7CgkJCQlpZiAoaXNzZXQoJG1hdGNoZXNbJGldWzJdWzBdKSAmJiBwcmVnX21hdGNoX2FsbCgnL1tceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBdKyhbXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4MkZceDNFXVteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyRlx4M0RceDNFXSopKD86W1x4MDlceDBBXHgwQlx4MENceDBEXHgyMF0qPVtceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBdKig/OiIoW14iXSopInxcJyhbXlwnXSopXCd8KFteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyMlx4MjdceDNFXVteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgzRV0qKT8pKT8vJywgJyAnIC4gJG1hdGNoZXNbJGldWzJdWzBdIC4gJyAnLCAkYXR0cmlicywgUFJFR19TRVRfT1JERVIpKQoJCQkJewoJCQkJCWZvciAoJGogPSAwLCAkdG90YWxfYXR0cmlicyA9IGNvdW50KCRhdHRyaWJzKTsgJGogPCAkdG90YWxfYXR0cmliczsgJGorKykKCQkJCQl7CgkJCQkJCWlmIChjb3VudCgkYXR0cmlic1skal0pID09IDIpCgkJCQkJCXsKCQkJCQkJCSRhdHRyaWJzWyRqXVsyXSA9ICRhdHRyaWJzWyRqXVsxXTsKCQkJCQkJfQoJCQkJCQkkcmV0dXJuWyRpXVsnYXR0cmlicyddW3N0cnRvbG93ZXIoJGF0dHJpYnNbJGpdWzFdKV1bJ2RhdGEnXSA9IFNpbXBsZVBpZV9NaXNjOjplbnRpdGllc19kZWNvZGUoZW5kKCRhdHRyaWJzWyRqXSksICdVVEYtOCcpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gJHJldHVybjsKCX0KCglmdW5jdGlvbiBlbGVtZW50X2ltcGxvZGUoJGVsZW1lbnQpCgl7CgkJJGZ1bGwgPSAiPCRlbGVtZW50W3RhZ10iOwoJCWZvcmVhY2ggKCRlbGVtZW50WydhdHRyaWJzJ10gYXMgJGtleSA9PiAkdmFsdWUpCgkJewoJCQkka2V5ID0gc3RydG9sb3dlcigka2V5KTsKCQkJJGZ1bGwgLj0gIiAka2V5PVwiIiAuIGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlWydkYXRhJ10pIC4gJyInOwoJCX0KCQlpZiAoJGVsZW1lbnRbJ3NlbGZfY2xvc2luZyddKQoJCXsKCQkJJGZ1bGwgLj0gJyAvPic7CgkJfQoJCWVsc2UKCQl7CgkJCSRmdWxsIC49ICI+JGVsZW1lbnRbY29udGVudF08LyRlbGVtZW50W3RhZ10+IjsKCQl9CgkJcmV0dXJuICRmdWxsOwoJfQoKCWZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlLCAkbGV2ZWwsICRmaWxlLCAkbGluZSkKCXsKCQlzd2l0Y2ggKCRsZXZlbCkKCQl7CgkJCWNhc2UgRV9VU0VSX0VSUk9SOgoJCQkJJG5vdGUgPSAnUEhQIEVycm9yJzsKCQkJCWJyZWFrOwoJCQljYXNlIEVfVVNFUl9XQVJOSU5HOgoJCQkJJG5vdGUgPSAnUEhQIFdhcm5pbmcnOwoJCQkJYnJlYWs7CgkJCWNhc2UgRV9VU0VSX05PVElDRToKCQkJCSRub3RlID0gJ1BIUCBOb3RpY2UnOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQkkbm90ZSA9ICdVbmtub3duIEVycm9yJzsKCQkJCWJyZWFrOwoJCX0KCQllcnJvcl9sb2coIiRub3RlOiAkbWVzc2FnZSBpbiAkZmlsZSBvbiBsaW5lICRsaW5lIiwgMCk7CgkJcmV0dXJuICRtZXNzYWdlOwoJfQoKCS8qKgoJICogSWYgYSBmaWxlIGhhcyBiZWVuIGNhY2hlZCwgcmV0cmlldmUgYW5kIGRpc3BsYXkgaXQuCgkgKgoJICogVGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgY2FjaGluZyBpbWFnZXMgKGdldF9mYXZpY29uKCksIGV0Yy4pLAoJICogaG93ZXZlciBpdCB3b3JrcyBmb3IgYWxsIGNhY2hlZCBmaWxlcy4gIFRoaXMgV0lMTCBOT1QgZGlzcGxheSBBTlkKCSAqIGZpbGUvaW1hZ2UvcGFnZS93aGF0ZXZlciwgYnV0IHJhdGhlciBvbmx5IGRpc3BsYXkgd2hhdCBoYXMgYWxyZWFkeQoJICogYmVlbiBjYWNoZWQgYnkgU2ltcGxlUGllLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2VlIFNpbXBsZVBpZTo6Z2V0X2Zhdmljb24oKQoJICogQHBhcmFtIHN0ciAkaWRlbnRpZmllcl91cmwgVVJMIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgY29udGVudC4KCSAqIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgdGhlIGFjdHVhbCBVUkwgb2YgdGhlIGxpdmUgY29udGVudC4KCSAqIEBwYXJhbSBzdHIgJGNhY2hlX2xvY2F0aW9uIExvY2F0aW9uIG9mIFNpbXBsZVBpZSdzIGNhY2hlLiAgRGVmYXVsdHMKCSAqIHRvICcuL2NhY2hlJy4KCSAqIEBwYXJhbSBzdHIgJGNhY2hlX2V4dGVuc2lvbiBUaGUgZmlsZSBleHRlbnNpb24gdGhhdCB0aGUgZmlsZSB3YXMKCSAqIGNhY2hlZCB3aXRoLiAgRGVmYXVsdHMgdG8gJ3NwYycuCgkgKiBAcGFyYW0gc3RyICRjYWNoZV9jbGFzcyBOYW1lIG9mIHRoZSBjYWNoZS1oYW5kbGluZyBjbGFzcyBiZWluZyB1c2VkCgkgKiBpbiBTaW1wbGVQaWUuICBEZWZhdWx0cyB0byAnU2ltcGxlUGllX0NhY2hlJywgYW5kIHNob3VsZCBiZSBsZWZ0CgkgKiBhcy1pcyB1bmxlc3MgeW91J3ZlIG92ZXJsb2FkZWQgdGhlIGNsYXNzLgoJICogQHBhcmFtIHN0ciAkY2FjaGVfbmFtZV9mdW5jdGlvbiBPYnNvbGV0ZS4gRXhpc3RzIGZvciBiYWNrd2FyZHMKCSAqIGNvbXBhdGliaWxpdHkgcmVhc29ucyBvbmx5LgoJICovCglmdW5jdGlvbiBkaXNwbGF5X2NhY2hlZF9maWxlKCRpZGVudGlmaWVyX3VybCwgJGNhY2hlX2xvY2F0aW9uID0gJy4vY2FjaGUnLCAkY2FjaGVfZXh0ZW5zaW9uID0gJ3NwYycsICRjYWNoZV9jbGFzcyA9ICdTaW1wbGVQaWVfQ2FjaGUnLCAkY2FjaGVfbmFtZV9mdW5jdGlvbiA9ICdtZDUnKQoJewoJCSRjYWNoZSA9IGNhbGxfdXNlcl9mdW5jKGFycmF5KCRjYWNoZV9jbGFzcywgJ2NyZWF0ZScpLCAkY2FjaGVfbG9jYXRpb24sICRpZGVudGlmaWVyX3VybCwgJGNhY2hlX2V4dGVuc2lvbik7CgoJCWlmICgkZmlsZSA9ICRjYWNoZS0+bG9hZCgpKQoJCXsKCQkJaWYgKGlzc2V0KCRmaWxlWydoZWFkZXJzJ11bJ2NvbnRlbnQtdHlwZSddKSkKCQkJewoJCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6JyAuICRmaWxlWydoZWFkZXJzJ11bJ2NvbnRlbnQtdHlwZSddKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsKCQkJfQoJCQloZWFkZXIoJ0V4cGlyZXM6ICcgLiBnbWRhdGUoJ0QsIGQgTSBZIEg6aTpzJywgdGltZSgpICsgNjA0ODAwKSAuICcgR01UJyk7IC8vIDcgZGF5cwoJCQllY2hvICRmaWxlWydib2R5J107CgkJCWV4aXQ7CgkJfQoKCQlkaWUoJ0NhY2hlZCBmaWxlIGZvciAnIC4gJGlkZW50aWZpZXJfdXJsIC4gJyBjYW5ub3QgYmUgZm91bmQuJyk7Cgl9CgoJZnVuY3Rpb24gZml4X3Byb3RvY29sKCR1cmwsICRodHRwID0gMSkKCXsKCQkkdXJsID0gU2ltcGxlUGllX01pc2M6Om5vcm1hbGl6ZV91cmwoJHVybCk7CgkJJHBhcnNlZCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJHVybCk7CgkJaWYgKCRwYXJzZWRbJ3NjaGVtZSddICE9PSAnJyAmJiAkcGFyc2VkWydzY2hlbWUnXSAhPSAnaHR0cCcgJiYgJHBhcnNlZFsnc2NoZW1lJ10gIT0gJ2h0dHBzJykKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6Zml4X3Byb3RvY29sKFNpbXBsZVBpZV9NaXNjOjpjb21wcmVzc19wYXJzZV91cmwoJ2h0dHAnLCAkcGFyc2VkWydhdXRob3JpdHknXSwgJHBhcnNlZFsncGF0aCddLCAkcGFyc2VkWydxdWVyeSddLCAkcGFyc2VkWydmcmFnbWVudCddKSwgJGh0dHApOwoJCX0KCgkJaWYgKCRwYXJzZWRbJ3NjaGVtZSddID09PSAnJyAmJiAkcGFyc2VkWydhdXRob3JpdHknXSA9PT0gJycgJiYgIWZpbGVfZXhpc3RzKCR1cmwpKQoJCXsKCQkJcmV0dXJuIFNpbXBsZVBpZV9NaXNjOjpmaXhfcHJvdG9jb2woU2ltcGxlUGllX01pc2M6OmNvbXByZXNzX3BhcnNlX3VybCgnaHR0cCcsICRwYXJzZWRbJ3BhdGgnXSwgJycsICRwYXJzZWRbJ3F1ZXJ5J10sICRwYXJzZWRbJ2ZyYWdtZW50J10pLCAkaHR0cCk7CgkJfQoKCQlpZiAoJGh0dHAgPT0gMiAmJiAkcGFyc2VkWydzY2hlbWUnXSAhPT0gJycpCgkJewoJCQlyZXR1cm4gImZlZWQ6JHVybCI7CgkJfQoJCWVsc2VpZiAoJGh0dHAgPT0gMyAmJiBzdHJ0b2xvd2VyKCRwYXJzZWRbJ3NjaGVtZSddKSA9PSAnaHR0cCcpCgkJewoJCQlyZXR1cm4gc3Vic3RyX3JlcGxhY2UoJHVybCwgJ3BvZGNhc3QnLCAwLCA0KTsKCQl9CgkJZWxzZWlmICgkaHR0cCA9PSA0ICYmIHN0cnRvbG93ZXIoJHBhcnNlZFsnc2NoZW1lJ10pID09ICdodHRwJykKCQl7CgkJCXJldHVybiBzdWJzdHJfcmVwbGFjZSgkdXJsLCAnaXRwYycsIDAsIDQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gJHVybDsKCQl9Cgl9CgoJZnVuY3Rpb24gcGFyc2VfdXJsKCR1cmwpCgl7CgkJc3RhdGljICRjYWNoZSA9IGFycmF5KCk7CgkJaWYgKGlzc2V0KCRjYWNoZVskdXJsXSkpCgkJewoJCQlyZXR1cm4gJGNhY2hlWyR1cmxdOwoJCX0KCQllbHNlaWYgKHByZWdfbWF0Y2goJy9eKChbXjpcLz8jXSspOik/KFwvXC8oW15cLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/JC8nLCAkdXJsLCAkbWF0Y2gpKQoJCXsKCQkJZm9yICgkaSA9IGNvdW50KCRtYXRjaCk7ICRpIDw9IDk7ICRpKyspCgkJCXsKCQkJCSRtYXRjaFskaV0gPSAnJzsKCQkJfQoJCQlyZXR1cm4gJGNhY2hlWyR1cmxdID0gYXJyYXkoJ3NjaGVtZScgPT4gJG1hdGNoWzJdLCAnYXV0aG9yaXR5JyA9PiAkbWF0Y2hbNF0sICdwYXRoJyA9PiAkbWF0Y2hbNV0sICdxdWVyeScgPT4gJG1hdGNoWzddLCAnZnJhZ21lbnQnID0+ICRtYXRjaFs5XSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAkY2FjaGVbJHVybF0gPSBhcnJheSgnc2NoZW1lJyA9PiAnJywgJ2F1dGhvcml0eScgPT4gJycsICdwYXRoJyA9PiAnJywgJ3F1ZXJ5JyA9PiAnJywgJ2ZyYWdtZW50JyA9PiAnJyk7CgkJfQoJfQoKCWZ1bmN0aW9uIGNvbXByZXNzX3BhcnNlX3VybCgkc2NoZW1lID0gJycsICRhdXRob3JpdHkgPSAnJywgJHBhdGggPSAnJywgJHF1ZXJ5ID0gJycsICRmcmFnbWVudCA9ICcnKQoJewoJCSRyZXR1cm4gPSAnJzsKCQlpZiAoJHNjaGVtZSAhPT0gJycpCgkJewoJCQkkcmV0dXJuIC49ICIkc2NoZW1lOiI7CgkJfQoJCWlmICgkYXV0aG9yaXR5ICE9PSAnJykKCQl7CgkJCSRyZXR1cm4gLj0gIi8vJGF1dGhvcml0eSI7CgkJfQoJCWlmICgkcGF0aCAhPT0gJycpCgkJewoJCQkkcmV0dXJuIC49ICRwYXRoOwoJCX0KCQlpZiAoJHF1ZXJ5ICE9PSAnJykKCQl7CgkJCSRyZXR1cm4gLj0gIj8kcXVlcnkiOwoJCX0KCQlpZiAoJGZyYWdtZW50ICE9PSAnJykKCQl7CgkJCSRyZXR1cm4gLj0gIiMkZnJhZ21lbnQiOwoJCX0KCQlyZXR1cm4gJHJldHVybjsKCX0KCglmdW5jdGlvbiBub3JtYWxpemVfdXJsKCR1cmwpCgl7CgkJJHVybCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLyUoWzAtOUEtRmEtZl17Mn0pLycsIGFycmF5KCdTaW1wbGVQaWVfTWlzYycsICdwZXJjZW50X2VuY29kaW5nX25vcm1hbGl6YXRpb24nKSwgJHVybCk7CgkJJHVybCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJHVybCk7CgkJJHVybFsnc2NoZW1lJ10gPSBzdHJ0b2xvd2VyKCR1cmxbJ3NjaGVtZSddKTsKCQlpZiAoJHVybFsnYXV0aG9yaXR5J10gIT09ICcnKQoJCXsKCQkJJHVybFsnYXV0aG9yaXR5J10gPSBzdHJ0b2xvd2VyKCR1cmxbJ2F1dGhvcml0eSddKTsKCQkJJHVybFsncGF0aCddID0gU2ltcGxlUGllX01pc2M6OnJlbW92ZV9kb3Rfc2VnbWVudHMoJHVybFsncGF0aCddKTsKCQl9CgkJcmV0dXJuIFNpbXBsZVBpZV9NaXNjOjpjb21wcmVzc19wYXJzZV91cmwoJHVybFsnc2NoZW1lJ10sICR1cmxbJ2F1dGhvcml0eSddLCAkdXJsWydwYXRoJ10sICR1cmxbJ3F1ZXJ5J10sICR1cmxbJ2ZyYWdtZW50J10pOwoJfQoKCWZ1bmN0aW9uIHBlcmNlbnRfZW5jb2Rpbmdfbm9ybWFsaXphdGlvbigkbWF0Y2gpCgl7CgkJJGludGVnZXIgPSBoZXhkZWMoJG1hdGNoWzFdKTsKCQlpZiAoJGludGVnZXIgPj0gMHg0MSAmJiAkaW50ZWdlciA8PSAweDVBIHx8ICRpbnRlZ2VyID49IDB4NjEgJiYgJGludGVnZXIgPD0gMHg3QSB8fCAkaW50ZWdlciA+PSAweDMwICYmICRpbnRlZ2VyIDw9IDB4MzkgfHwgJGludGVnZXIgPT0gMHgyRCB8fCAkaW50ZWdlciA9PSAweDJFIHx8ICRpbnRlZ2VyID09IDB4NUYgfHwgJGludGVnZXIgPT0gMHg3RSkKCQl7CgkJCXJldHVybiBjaHIoJGludGVnZXIpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gc3RydG91cHBlcigkbWF0Y2hbMF0pOwoJCX0KCX0KCgkvKioKCSAqIFJlbW92ZSBiYWQgVVRGLTggYnl0ZXMKCSAqCgkgKiBQQ1JFIFBhdHRlcm4gdG8gbG9jYXRlIGJhZCBieXRlcyBpbiBhIFVURi04IHN0cmluZyBjb21lcyBmcm9tIFczQwoJICogRkFROiBNdWx0aWxpbmd1YWwgRm9ybXMgKG1vZGlmaWVkIHRvIGluY2x1ZGUgZnVsbCBBU0NJSSByYW5nZSkKCSAqCgkgKiBAYXV0aG9yIEdlb2ZmcmV5IFNuZWRkb24KCSAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvSW50ZXJuYXRpb25hbC9xdWVzdGlvbnMvcWEtZm9ybXMtdXRmLTgKCSAqIEBwYXJhbSBzdHJpbmcgJHN0ciBTdHJpbmcgdG8gcmVtb3ZlIGJhZCBVVEYtOCBieXRlcyBmcm9tCgkgKiBAcmV0dXJuIHN0cmluZyBVVEYtOCBzdHJpbmcKCSAqLwoJZnVuY3Rpb24gdXRmOF9iYWRfcmVwbGFjZSgkc3RyKQoJewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2ljb252JykgJiYgKCRyZXR1cm4gPSBAaWNvbnYoJ1VURi04JywgJ1VURi04Ly9JR05PUkUnLCAkc3RyKSkpCgkJewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfZW5jb2RpbmcnKSAmJiAoJHJldHVybiA9IEBtYl9jb252ZXJ0X2VuY29kaW5nKCRzdHIsICdVVEYtOCcsICdVVEYtOCcpKSkKCQl7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCQllbHNlaWYgKHByZWdfbWF0Y2hfYWxsKCcvKD86W1x4MDAtXHg3Rl18W1x4QzItXHhERl1bXHg4MC1ceEJGXXxceEUwW1x4QTAtXHhCRl1bXHg4MC1ceEJGXXxbXHhFMS1ceEVDXHhFRVx4RUZdW1x4ODAtXHhCRl17Mn18XHhFRFtceDgwLVx4OUZdW1x4ODAtXHhCRl18XHhGMFtceDkwLVx4QkZdW1x4ODAtXHhCRl17Mn18W1x4RjEtXHhGM11bXHg4MC1ceEJGXXszfXxceEY0W1x4ODAtXHg4Rl1bXHg4MC1ceEJGXXsyfSkrLycsICRzdHIsICRtYXRjaGVzKSkKCQl7CgkJCXJldHVybiBpbXBsb2RlKCJceEVGXHhCRlx4QkQiLCAkbWF0Y2hlc1swXSk7CgkJfQoJCWVsc2VpZiAoJHN0ciAhPT0gJycpCgkJewoJCQlyZXR1cm4gIlx4RUZceEJGXHhCRCI7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAnJzsKCQl9Cgl9CgoJLyoqCgkgKiBDb252ZXJ0cyBhIFdpbmRvd3MtMTI1MiBlbmNvZGVkIHN0cmluZyB0byBhIFVURi04IGVuY29kZWQgc3RyaW5nCgkgKgoJICogQHN0YXRpYwoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZyBXaW5kb3dzLTEyNTIgZW5jb2RlZCBzdHJpbmcKCSAqIEByZXR1cm4gc3RyaW5nIFVURi04IGVuY29kZWQgc3RyaW5nCgkgKi8KCWZ1bmN0aW9uIHdpbmRvd3NfMTI1Ml90b191dGY4KCRzdHJpbmcpCgl7CgkJc3RhdGljICRjb252ZXJ0X3RhYmxlID0gYXJyYXkoIlx4ODAiID0+ICJceEUyXHg4Mlx4QUMiLCAiXHg4MSIgPT4gIlx4RUZceEJGXHhCRCIsICJceDgyIiA9PiAiXHhFMlx4ODBceDlBIiwgIlx4ODMiID0+ICJceEM2XHg5MiIsICJceDg0IiA9PiAiXHhFMlx4ODBceDlFIiwgIlx4ODUiID0+ICJceEUyXHg4MFx4QTYiLCAiXHg4NiIgPT4gIlx4RTJceDgwXHhBMCIsICJceDg3IiA9PiAiXHhFMlx4ODBceEExIiwgIlx4ODgiID0+ICJceENCXHg4NiIsICJceDg5IiA9PiAiXHhFMlx4ODBceEIwIiwgIlx4OEEiID0+ICJceEM1XHhBMCIsICJceDhCIiA9PiAiXHhFMlx4ODBceEI5IiwgIlx4OEMiID0+ICJceEM1XHg5MiIsICJceDhEIiA9PiAiXHhFRlx4QkZceEJEIiwgIlx4OEUiID0+ICJceEM1XHhCRCIsICJceDhGIiA9PiAiXHhFRlx4QkZceEJEIiwgIlx4OTAiID0+ICJceEVGXHhCRlx4QkQiLCAiXHg5MSIgPT4gIlx4RTJceDgwXHg5OCIsICJceDkyIiA9PiAiXHhFMlx4ODBceDk5IiwgIlx4OTMiID0+ICJceEUyXHg4MFx4OUMiLCAiXHg5NCIgPT4gIlx4RTJceDgwXHg5RCIsICJceDk1IiA9PiAiXHhFMlx4ODBceEEyIiwgIlx4OTYiID0+ICJceEUyXHg4MFx4OTMiLCAiXHg5NyIgPT4gIlx4RTJceDgwXHg5NCIsICJceDk4IiA9PiAiXHhDQlx4OUMiLCAiXHg5OSIgPT4gIlx4RTJceDg0XHhBMiIsICJceDlBIiA9PiAiXHhDNVx4QTEiLCAiXHg5QiIgPT4gIlx4RTJceDgwXHhCQSIsICJceDlDIiA9PiAiXHhDNVx4OTMiLCAiXHg5RCIgPT4gIlx4RUZceEJGXHhCRCIsICJceDlFIiA9PiAiXHhDNVx4QkUiLCAiXHg5RiIgPT4gIlx4QzVceEI4IiwgIlx4QTAiID0+ICJceEMyXHhBMCIsICJceEExIiA9PiAiXHhDMlx4QTEiLCAiXHhBMiIgPT4gIlx4QzJceEEyIiwgIlx4QTMiID0+ICJceEMyXHhBMyIsICJceEE0IiA9PiAiXHhDMlx4QTQiLCAiXHhBNSIgPT4gIlx4QzJceEE1IiwgIlx4QTYiID0+ICJceEMyXHhBNiIsICJceEE3IiA9PiAiXHhDMlx4QTciLCAiXHhBOCIgPT4gIlx4QzJceEE4IiwgIlx4QTkiID0+ICJceEMyXHhBOSIsICJceEFBIiA9PiAiXHhDMlx4QUEiLCAiXHhBQiIgPT4gIlx4QzJceEFCIiwgIlx4QUMiID0+ICJceEMyXHhBQyIsICJceEFEIiA9PiAiXHhDMlx4QUQiLCAiXHhBRSIgPT4gIlx4QzJceEFFIiwgIlx4QUYiID0+ICJceEMyXHhBRiIsICJceEIwIiA9PiAiXHhDMlx4QjAiLCAiXHhCMSIgPT4gIlx4QzJceEIxIiwgIlx4QjIiID0+ICJceEMyXHhCMiIsICJceEIzIiA9PiAiXHhDMlx4QjMiLCAiXHhCNCIgPT4gIlx4QzJceEI0IiwgIlx4QjUiID0+ICJceEMyXHhCNSIsICJceEI2IiA9PiAiXHhDMlx4QjYiLCAiXHhCNyIgPT4gIlx4QzJceEI3IiwgIlx4QjgiID0+ICJceEMyXHhCOCIsICJceEI5IiA9PiAiXHhDMlx4QjkiLCAiXHhCQSIgPT4gIlx4QzJceEJBIiwgIlx4QkIiID0+ICJceEMyXHhCQiIsICJceEJDIiA9PiAiXHhDMlx4QkMiLCAiXHhCRCIgPT4gIlx4QzJceEJEIiwgIlx4QkUiID0+ICJceEMyXHhCRSIsICJceEJGIiA9PiAiXHhDMlx4QkYiLCAiXHhDMCIgPT4gIlx4QzNceDgwIiwgIlx4QzEiID0+ICJceEMzXHg4MSIsICJceEMyIiA9PiAiXHhDM1x4ODIiLCAiXHhDMyIgPT4gIlx4QzNceDgzIiwgIlx4QzQiID0+ICJceEMzXHg4NCIsICJceEM1IiA9PiAiXHhDM1x4ODUiLCAiXHhDNiIgPT4gIlx4QzNceDg2IiwgIlx4QzciID0+ICJceEMzXHg4NyIsICJceEM4IiA9PiAiXHhDM1x4ODgiLCAiXHhDOSIgPT4gIlx4QzNceDg5IiwgIlx4Q0EiID0+ICJceEMzXHg4QSIsICJceENCIiA9PiAiXHhDM1x4OEIiLCAiXHhDQyIgPT4gIlx4QzNceDhDIiwgIlx4Q0QiID0+ICJceEMzXHg4RCIsICJceENFIiA9PiAiXHhDM1x4OEUiLCAiXHhDRiIgPT4gIlx4QzNceDhGIiwgIlx4RDAiID0+ICJceEMzXHg5MCIsICJceEQxIiA9PiAiXHhDM1x4OTEiLCAiXHhEMiIgPT4gIlx4QzNceDkyIiwgIlx4RDMiID0+ICJceEMzXHg5MyIsICJceEQ0IiA9PiAiXHhDM1x4OTQiLCAiXHhENSIgPT4gIlx4QzNceDk1IiwgIlx4RDYiID0+ICJceEMzXHg5NiIsICJceEQ3IiA9PiAiXHhDM1x4OTciLCAiXHhEOCIgPT4gIlx4QzNceDk4IiwgIlx4RDkiID0+ICJceEMzXHg5OSIsICJceERBIiA9PiAiXHhDM1x4OUEiLCAiXHhEQiIgPT4gIlx4QzNceDlCIiwgIlx4REMiID0+ICJceEMzXHg5QyIsICJceEREIiA9PiAiXHhDM1x4OUQiLCAiXHhERSIgPT4gIlx4QzNceDlFIiwgIlx4REYiID0+ICJceEMzXHg5RiIsICJceEUwIiA9PiAiXHhDM1x4QTAiLCAiXHhFMSIgPT4gIlx4QzNceEExIiwgIlx4RTIiID0+ICJceEMzXHhBMiIsICJceEUzIiA9PiAiXHhDM1x4QTMiLCAiXHhFNCIgPT4gIlx4QzNceEE0IiwgIlx4RTUiID0+ICJceEMzXHhBNSIsICJceEU2IiA9PiAiXHhDM1x4QTYiLCAiXHhFNyIgPT4gIlx4QzNceEE3IiwgIlx4RTgiID0+ICJceEMzXHhBOCIsICJceEU5IiA9PiAiXHhDM1x4QTkiLCAiXHhFQSIgPT4gIlx4QzNceEFBIiwgIlx4RUIiID0+ICJceEMzXHhBQiIsICJceEVDIiA9PiAiXHhDM1x4QUMiLCAiXHhFRCIgPT4gIlx4QzNceEFEIiwgIlx4RUUiID0+ICJceEMzXHhBRSIsICJceEVGIiA9PiAiXHhDM1x4QUYiLCAiXHhGMCIgPT4gIlx4QzNceEIwIiwgIlx4RjEiID0+ICJceEMzXHhCMSIsICJceEYyIiA9PiAiXHhDM1x4QjIiLCAiXHhGMyIgPT4gIlx4QzNceEIzIiwgIlx4RjQiID0+ICJceEMzXHhCNCIsICJceEY1IiA9PiAiXHhDM1x4QjUiLCAiXHhGNiIgPT4gIlx4QzNceEI2IiwgIlx4RjciID0+ICJceEMzXHhCNyIsICJceEY4IiA9PiAiXHhDM1x4QjgiLCAiXHhGOSIgPT4gIlx4QzNceEI5IiwgIlx4RkEiID0+ICJceEMzXHhCQSIsICJceEZCIiA9PiAiXHhDM1x4QkIiLCAiXHhGQyIgPT4gIlx4QzNceEJDIiwgIlx4RkQiID0+ICJceEMzXHhCRCIsICJceEZFIiA9PiAiXHhDM1x4QkUiLCAiXHhGRiIgPT4gIlx4QzNceEJGIik7CgoJCXJldHVybiBzdHJ0cigkc3RyaW5nLCAkY29udmVydF90YWJsZSk7Cgl9CgoJZnVuY3Rpb24gY2hhbmdlX2VuY29kaW5nKCRkYXRhLCAkaW5wdXQsICRvdXRwdXQpCgl7CgkJJGlucHV0ID0gU2ltcGxlUGllX01pc2M6OmVuY29kaW5nKCRpbnB1dCk7CgkJJG91dHB1dCA9IFNpbXBsZVBpZV9NaXNjOjplbmNvZGluZygkb3V0cHV0KTsKCgkJLy8gV2UgZmFpbCB0byBmYWlsIG9uIG5vbiBVUy1BU0NJSSBieXRlcwoJCWlmICgkaW5wdXQgPT09ICdVUy1BU0NJSScpCgkJewoJCQlzdGF0aWMgJG5vbl9hc2NpaV9vY3RlY3RzID0gJyc7CgkJCWlmICghJG5vbl9hc2NpaV9vY3RlY3RzKQoJCQl7CgkJCQlmb3IgKCRpID0gMHg4MDsgJGkgPD0gMHhGRjsgJGkrKykKCQkJCXsKCQkJCQkkbm9uX2FzY2lpX29jdGVjdHMgLj0gY2hyKCRpKTsKCQkJCX0KCQkJfQoJCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgMCwgc3RyY3NwbigkZGF0YSwgJG5vbl9hc2NpaV9vY3RlY3RzKSk7CgkJfQoKCQkvLyBUaGlzIGlzIGZpcnN0LCBhcyBiZWhhdmlvdXIgb2YgdGhpcyBpcyBjb21wbGV0ZWx5IHByZWRpY3RhYmxlCgkJaWYgKCRpbnB1dCA9PT0gJ1dpbmRvd3MtMTI1MicgJiYgJG91dHB1dCA9PT0gJ1VURi04JykKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6d2luZG93c18xMjUyX3RvX3V0ZjgoJGRhdGEpOwoJCX0KCQkvLyBUaGlzIGlzIHNlY29uZCwgYXMgYmVoYXZpb3VyIG9mIHRoaXMgdmFyaWVzIG9ubHkgd2l0aCBQSFAgdmVyc2lvbgoJCWVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJykgJiYgKCRyZXR1cm4gPSBAbWJfY29udmVydF9lbmNvZGluZygkZGF0YSwgJG91dHB1dCwgJGlucHV0KSkpCgkJewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJLy8gVGhpcyBpcyBsYXN0LCBhcyBiZWhhdmlvdXIgb2YgdGhpcyB2YXJpZXMgd2l0aCBPUyB1c2VybGFuZCBhbmQgUEhQIHZlcnNpb24KCQllbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnaWNvbnYnKSAmJiAoJHJldHVybiA9IEBpY29udigkaW5wdXQsICRvdXRwdXQsICRkYXRhKSkpCgkJewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJLy8gSWYgd2UgY2FuJ3QgZG8gYW55dGhpbmcsIGp1c3QgZmFpbAoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gZW5jb2RpbmcoJGNoYXJzZXQpCgl7CgkJLyogQ2hhcmFjdGVyIHNldHMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBhbHNvIG5lZWQgc29tZSBmdXJ0aGVyCgkJbm9ybWFsaXphdGlvbiBpbiB0aGUgcmVhbCB3b3JsZCAodGhvdWdoIHdlJ2xsIHJldHVybiB0aGVtIGluIHRoZSBmb3JtIGdpdmVuCgkJaW4gdGhlaXIgcmVnaXN0cmF0aW9uKS4gKi8KCQlzd2l0Y2ggKHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKCcvW1x4MDktXHgwRFx4MjAtXHgyRlx4M0EtXHg0MFx4NUItXHg2MFx4N0ItXHg3RV0vJywgJycsICRjaGFyc2V0KSkpCgkJewoJCQljYXNlICdhZG9iZXN0YW5kYXJkZW5jb2RpbmcnOgoJCQljYXNlICdjc2Fkb2Jlc3RhbmRhcmRlbmNvZGluZyc6CgkJCQlyZXR1cm4gJ0Fkb2JlLVN0YW5kYXJkLUVuY29kaW5nJzsKCgkJCWNhc2UgJ2Fkb2Jlc3ltYm9sZW5jb2RpbmcnOgoJCQljYXNlICdjc2hwcHNtYXRoJzoKCQkJCXJldHVybiAnQWRvYmUtU3ltYm9sLUVuY29kaW5nJzsKCgkJCWNhc2UgJ2FtaTEyNTEnOgoJCQljYXNlICdhbWkxMjUxJzoKCQkJY2FzZSAnYW1pZ2ExMjUxJzoKCQkJY2FzZSAnYW1pZ2ExMjUxJzoKCQkJCXJldHVybiAnQW1pZ2EtMTI1MSc7CgoJCQljYXNlICdhbnNpeDMxMTAxOTgzJzoKCQkJY2FzZSAnY3NhdDUwMDE5ODMnOgoJCQljYXNlICdjc2lzbzk5bmFwbHBzJzoKCQkJY2FzZSAnaXNvaXI5OSc6CgkJCWNhc2UgJ25hcGxwcyc6CgkJCQlyZXR1cm4gJ0FOU0lfWDMuMTEwLTE5ODMnOwoKCQkJY2FzZSAnYXJhYmljNyc6CgkJCWNhc2UgJ2FzbW80NDknOgoJCQljYXNlICdjc2lzbzg5YXNtbzQ0OSc6CgkJCWNhc2UgJ2lzb2lyODknOgoJCQljYXNlICdpc285MDM2JzoKCQkJCXJldHVybiAnQVNNT180NDknOwoKCQkJY2FzZSAnYmlnNSc6CgkJCWNhc2UgJ2NzYmlnNSc6CgkJCWNhc2UgJ3h4YmlnNSc6CgkJCQlyZXR1cm4gJ0JpZzUnOwoKCQkJY2FzZSAnYmlnNWhrc2NzJzoKCQkJCXJldHVybiAnQmlnNS1IS1NDUyc7CgoJCQljYXNlICdib2N1MSc6CgkJCWNhc2UgJ2NzYm9jdTEnOgoJCQkJcmV0dXJuICdCT0NVLTEnOwoKCQkJY2FzZSAnYnJmJzoKCQkJY2FzZSAnY3NicmYnOgoJCQkJcmV0dXJuICdCUkYnOwoKCQkJY2FzZSAnYnM0NzMwJzoKCQkJY2FzZSAnY3Npc280dW5pdGVka2luZ2RvbSc6CgkJCWNhc2UgJ2diJzoKCQkJY2FzZSAnaXNvaXI0JzoKCQkJY2FzZSAnaXNvNjQ2Z2InOgoJCQljYXNlICd1ayc6CgkJCQlyZXR1cm4gJ0JTXzQ3MzAnOwoKCQkJY2FzZSAnYnN2aWV3ZGF0YSc6CgkJCWNhc2UgJ2NzaXNvNDdic3ZpZXdkYXRhJzoKCQkJY2FzZSAnaXNvaXI0Nyc6CgkJCQlyZXR1cm4gJ0JTX3ZpZXdkYXRhJzsKCgkJCWNhc2UgJ2Nlc3U4JzoKCQkJY2FzZSAnY3NjZXN1OCc6CgkJCQlyZXR1cm4gJ0NFU1UtOCc7CgoJCQljYXNlICdjYSc6CgkJCWNhc2UgJ2NzYTcxJzoKCQkJY2FzZSAnY3NhejI0MzQxOTg1MSc6CgkJCWNhc2UgJ2NzaXNvMTIxY2FuYWRpYW4xJzoKCQkJY2FzZSAnaXNvaXIxMjEnOgoJCQljYXNlICdpc282NDZjYSc6CgkJCQlyZXR1cm4gJ0NTQV9aMjQzLjQtMTk4NS0xJzsKCgkJCWNhc2UgJ2NzYTcyJzoKCQkJY2FzZSAnY3NhejI0MzQxOTg1Mic6CgkJCWNhc2UgJ2NzaXNvMTIyY2FuYWRpYW4yJzoKCQkJY2FzZSAnaXNvaXIxMjInOgoJCQljYXNlICdpc282NDZjYTInOgoJCQkJcmV0dXJuICdDU0FfWjI0My40LTE5ODUtMic7CgoJCQljYXNlICdjc2F6MjQzNDE5ODVncic6CgkJCWNhc2UgJ2NzaXNvMTIzY3NhejI0MzQxOTg1Z3InOgoJCQljYXNlICdpc29pcjEyMyc6CgkJCQlyZXR1cm4gJ0NTQV9aMjQzLjQtMTk4NS1ncic7CgoJCQljYXNlICdjc2lzbzEzOWNzbjM2OTEwMyc6CgkJCWNhc2UgJ2NzbjM2OTEwMyc6CgkJCWNhc2UgJ2lzb2lyMTM5JzoKCQkJCXJldHVybiAnQ1NOXzM2OTEwMyc7CgoJCQljYXNlICdjc2RlY21jcyc6CgkJCWNhc2UgJ2RlYyc6CgkJCWNhc2UgJ2RlY21jcyc6CgkJCQlyZXR1cm4gJ0RFQy1NQ1MnOwoKCQkJY2FzZSAnY3Npc28yMWdlcm1hbic6CgkJCWNhc2UgJ2RlJzoKCQkJY2FzZSAnZGluNjYwMDMnOgoJCQljYXNlICdpc29pcjIxJzoKCQkJY2FzZSAnaXNvNjQ2ZGUnOgoJCQkJcmV0dXJuICdESU5fNjYwMDMnOwoKCQkJY2FzZSAnY3Nka3VzJzoKCQkJY2FzZSAnZGt1cyc6CgkJCQlyZXR1cm4gJ2RrLXVzJzsKCgkJCWNhc2UgJ2NzaXNvNjQ2ZGFuaXNoJzoKCQkJY2FzZSAnZGsnOgoJCQljYXNlICdkczIwODknOgoJCQljYXNlICdkczIwODknOgoJCQljYXNlICdpc282NDZkayc6CgkJCQlyZXR1cm4gJ0RTXzIwODknOwoKCQkJY2FzZSAnY3NpYm1lYmNkaWNhdGRlJzoKCQkJY2FzZSAnZWJjZGljYXRkZSc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1BVC1ERSc7CgoJCQljYXNlICdjc2ViY2RpY2F0ZGVhJzoKCQkJY2FzZSAnZWJjZGljYXRkZWEnOgoJCQkJcmV0dXJuICdFQkNESUMtQVQtREUtQSc7CgoJCQljYXNlICdjc2ViY2RpY2NhZnInOgoJCQljYXNlICdlYmNkaWNjYWZyJzoKCQkJCXJldHVybiAnRUJDRElDLUNBLUZSJzsKCgkJCWNhc2UgJ2NzZWJjZGljZGtubyc6CgkJCWNhc2UgJ2ViY2RpY2Rrbm8nOgoJCQkJcmV0dXJuICdFQkNESUMtREstTk8nOwoKCQkJY2FzZSAnY3NlYmNkaWNka25vYSc6CgkJCWNhc2UgJ2ViY2RpY2Rrbm9hJzoKCQkJCXJldHVybiAnRUJDRElDLURLLU5PLUEnOwoKCQkJY2FzZSAnY3NlYmNkaWNlcyc6CgkJCWNhc2UgJ2ViY2RpY2VzJzoKCQkJCXJldHVybiAnRUJDRElDLUVTJzsKCgkJCWNhc2UgJ2NzZWJjZGljZXNhJzoKCQkJY2FzZSAnZWJjZGljZXNhJzoKCQkJCXJldHVybiAnRUJDRElDLUVTLUEnOwoKCQkJY2FzZSAnY3NlYmNkaWNlc3MnOgoJCQljYXNlICdlYmNkaWNlc3MnOgoJCQkJcmV0dXJuICdFQkNESUMtRVMtUyc7CgoJCQljYXNlICdjc2ViY2RpY2Zpc2UnOgoJCQljYXNlICdlYmNkaWNmaXNlJzoKCQkJCXJldHVybiAnRUJDRElDLUZJLVNFJzsKCgkJCWNhc2UgJ2NzZWJjZGljZmlzZWEnOgoJCQljYXNlICdlYmNkaWNmaXNlYSc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1GSS1TRS1BJzsKCgkJCWNhc2UgJ2NzZWJjZGljZnInOgoJCQljYXNlICdlYmNkaWNmcic6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1GUic7CgoJCQljYXNlICdjc2ViY2RpY2l0JzoKCQkJY2FzZSAnZWJjZGljaXQnOgoJCQkJcmV0dXJuICdFQkNESUMtSVQnOwoKCQkJY2FzZSAnY3NlYmNkaWNwdCc6CgkJCWNhc2UgJ2ViY2RpY3B0JzoKCQkJCXJldHVybiAnRUJDRElDLVBUJzsKCgkJCWNhc2UgJ2NzZWJjZGljdWsnOgoJCQljYXNlICdlYmNkaWN1ayc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1VSyc7CgoJCQljYXNlICdjc2ViY2RpY3VzJzoKCQkJY2FzZSAnZWJjZGljdXMnOgoJCQkJcmV0dXJuICdFQkNESUMtVVMnOwoKCQkJY2FzZSAnY3Npc28xMTFlY21hY3lyaWxsaWMnOgoJCQljYXNlICdlY21hY3lyaWxsaWMnOgoJCQljYXNlICdpc29pcjExMSc6CgkJCWNhc2UgJ2tvaThlJzoKCQkJCXJldHVybiAnRUNNQS1jeXJpbGxpYyc7CgoJCQljYXNlICdjc2lzbzE3c3BhbmlzaCc6CgkJCWNhc2UgJ2VzJzoKCQkJY2FzZSAnaXNvaXIxNyc6CgkJCWNhc2UgJ2lzbzY0NmVzJzoKCQkJCXJldHVybiAnRVMnOwoKCQkJY2FzZSAnY3Npc284NXNwYW5pc2gyJzoKCQkJY2FzZSAnZXMyJzoKCQkJY2FzZSAnaXNvaXI4NSc6CgkJCWNhc2UgJ2lzbzY0NmVzMic6CgkJCQlyZXR1cm4gJ0VTMic7CgoJCQljYXNlICdjc2V1Y2ZpeHdpZGphcGFuZXNlJzoKCQkJY2FzZSAnZXh0ZW5kZWR1bml4Y29kZWZpeGVkd2lkdGhmb3JqYXBhbmVzZSc6CgkJCQlyZXR1cm4gJ0V4dGVuZGVkX1VOSVhfQ29kZV9GaXhlZF9XaWR0aF9mb3JfSmFwYW5lc2UnOwoKCQkJY2FzZSAnY3NldWNwa2RmbXRqYXBhbmVzZSc6CgkJCWNhc2UgJ2V1Y2pwJzoKCQkJY2FzZSAnZXh0ZW5kZWR1bml4Y29kZXBhY2tlZGZvcm1hdGZvcmphcGFuZXNlJzoKCQkJCXJldHVybiAnRXh0ZW5kZWRfVU5JWF9Db2RlX1BhY2tlZF9Gb3JtYXRfZm9yX0phcGFuZXNlJzsKCgkJCWNhc2UgJ2diMTgwMzAnOgoJCQkJcmV0dXJuICdHQjE4MDMwJzsKCgkJCWNhc2UgJ2NwOTM2JzoKCQkJY2FzZSAnZ2JrJzoKCQkJY2FzZSAnbXM5MzYnOgoJCQljYXNlICd3aW5kb3dzOTM2JzoKCQkJY2FzZSAnY3NnYjIzMTInOgoJCQljYXNlICdnYjIzMTInOgoJCQljYXNlICdjaGluZXNlJzoKCQkJY2FzZSAnY3Npc281OGdiMjMxMjgwJzoKCQkJY2FzZSAnZ2IyMzEyODAnOgoJCQljYXNlICdpc29pcjU4JzoKCQkJCXJldHVybiAnR0JLJzsKCgkJCWNhc2UgJ2NuJzoKCQkJY2FzZSAnY3Npc281N2diMTk4OCc6CgkJCWNhc2UgJ2diMTk4ODgwJzoKCQkJY2FzZSAnaXNvaXI1Nyc6CgkJCWNhc2UgJ2lzbzY0NmNuJzoKCQkJCXJldHVybiAnR0JfMTk4OC04MCc7CgoJCQljYXNlICdjc2lzbzE1M2dvc3QxOTc2ODc0JzoKCQkJY2FzZSAnZ29zdDE5NzY4NzQnOgoJCQljYXNlICdpc29pcjE1Myc6CgkJCWNhc2UgJ3N0c2V2MzU4ODgnOgoJCQkJcmV0dXJuICdHT1NUXzE5NzY4LTc0JzsKCgkJCWNhc2UgJ2NzaXNvMTUwJzoKCQkJY2FzZSAnY3Npc28xNTBncmVla2NjaXR0JzoKCQkJY2FzZSAnZ3JlZWtjY2l0dCc6CgkJCWNhc2UgJ2lzb2lyMTUwJzoKCQkJCXJldHVybiAnZ3JlZWstY2NpdHQnOwoKCQkJY2FzZSAnY3Npc284OGdyZWVrNyc6CgkJCWNhc2UgJ2dyZWVrNyc6CgkJCWNhc2UgJ2lzb2lyODgnOgoJCQkJcmV0dXJuICdncmVlazcnOwoKCQkJY2FzZSAnY3Npc28xOGdyZWVrN29sZCc6CgkJCWNhc2UgJ2dyZWVrN29sZCc6CgkJCWNhc2UgJ2lzb2lyMTgnOgoJCQkJcmV0dXJuICdncmVlazctb2xkJzsKCgkJCWNhc2UgJ2NzaHBkZXNrdG9wJzoKCQkJY2FzZSAnaHBkZXNrdG9wJzoKCQkJCXJldHVybiAnSFAtRGVza1RvcCc7CgoJCQljYXNlICdjc2hwbGVnYWwnOgoJCQljYXNlICdocGxlZ2FsJzoKCQkJCXJldHVybiAnSFAtTGVnYWwnOwoKCQkJY2FzZSAnY3NocG1hdGg4JzoKCQkJY2FzZSAnaHBtYXRoOCc6CgkJCQlyZXR1cm4gJ0hQLU1hdGg4JzsKCgkJCWNhc2UgJ2NzaHBwaWZvbnQnOgoJCQljYXNlICdocHBpZm9udCc6CgkJCQlyZXR1cm4gJ0hQLVBpLWZvbnQnOwoKCQkJY2FzZSAnY3NocHJvbWFuOCc6CgkJCWNhc2UgJ2hwcm9tYW44JzoKCQkJY2FzZSAncjgnOgoJCQljYXNlICdyb21hbjgnOgoJCQkJcmV0dXJuICdocC1yb21hbjgnOwoKCQkJY2FzZSAnaHpnYjIzMTInOgoJCQkJcmV0dXJuICdIWi1HQi0yMzEyJzsKCgkJCWNhc2UgJ2NzaWJtc3ltYm9scyc6CgkJCWNhc2UgJ2libXN5bWJvbHMnOgoJCQkJcmV0dXJuICdJQk0tU3ltYm9scyc7CgoJCQljYXNlICdjc2libXRoYWknOgoJCQljYXNlICdpYm10aGFpJzoKCQkJCXJldHVybiAnSUJNLVRoYWknOwoKCQkJY2FzZSAnY2NzaWQwMDg1OCc6CgkJCWNhc2UgJ2NwMDA4NTgnOgoJCQljYXNlICdpYm0wMDg1OCc6CgkJCWNhc2UgJ3BjbXVsdGlsaW5ndWFsODUwZXVybyc6CgkJCQlyZXR1cm4gJ0lCTTAwODU4JzsKCgkJCWNhc2UgJ2Njc2lkMDA5MjQnOgoJCQljYXNlICdjcDAwOTI0JzoKCQkJY2FzZSAnZWJjZGljbGF0aW45ZXVybyc6CgkJCWNhc2UgJ2libTAwOTI0JzoKCQkJCXJldHVybiAnSUJNMDA5MjQnOwoKCQkJY2FzZSAnY2NzaWQwMTE0MCc6CgkJCWNhc2UgJ2NwMDExNDAnOgoJCQljYXNlICdlYmNkaWN1czM3ZXVybyc6CgkJCWNhc2UgJ2libTAxMTQwJzoKCQkJCXJldHVybiAnSUJNMDExNDAnOwoKCQkJY2FzZSAnY2NzaWQwMTE0MSc6CgkJCWNhc2UgJ2NwMDExNDEnOgoJCQljYXNlICdlYmNkaWNkZTI3M2V1cm8nOgoJCQljYXNlICdpYm0wMTE0MSc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQxJzsKCgkJCWNhc2UgJ2Njc2lkMDExNDInOgoJCQljYXNlICdjcDAxMTQyJzoKCQkJY2FzZSAnZWJjZGljZGsyNzdldXJvJzoKCQkJY2FzZSAnZWJjZGljbm8yNzdldXJvJzoKCQkJY2FzZSAnaWJtMDExNDInOgoJCQkJcmV0dXJuICdJQk0wMTE0Mic7CgoJCQljYXNlICdjY3NpZDAxMTQzJzoKCQkJY2FzZSAnY3AwMTE0Myc6CgkJCWNhc2UgJ2ViY2RpY2ZpMjc4ZXVybyc6CgkJCWNhc2UgJ2ViY2RpY3NlMjc4ZXVybyc6CgkJCWNhc2UgJ2libTAxMTQzJzoKCQkJCXJldHVybiAnSUJNMDExNDMnOwoKCQkJY2FzZSAnY2NzaWQwMTE0NCc6CgkJCWNhc2UgJ2NwMDExNDQnOgoJCQljYXNlICdlYmNkaWNpdDI4MGV1cm8nOgoJCQljYXNlICdpYm0wMTE0NCc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQ0JzsKCgkJCWNhc2UgJ2Njc2lkMDExNDUnOgoJCQljYXNlICdjcDAxMTQ1JzoKCQkJY2FzZSAnZWJjZGljZXMyODRldXJvJzoKCQkJY2FzZSAnaWJtMDExNDUnOgoJCQkJcmV0dXJuICdJQk0wMTE0NSc7CgoJCQljYXNlICdjY3NpZDAxMTQ2JzoKCQkJY2FzZSAnY3AwMTE0Nic6CgkJCWNhc2UgJ2ViY2RpY2diMjg1ZXVybyc6CgkJCWNhc2UgJ2libTAxMTQ2JzoKCQkJCXJldHVybiAnSUJNMDExNDYnOwoKCQkJY2FzZSAnY2NzaWQwMTE0Nyc6CgkJCWNhc2UgJ2NwMDExNDcnOgoJCQljYXNlICdlYmNkaWNmcjI5N2V1cm8nOgoJCQljYXNlICdpYm0wMTE0Nyc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQ3JzsKCgkJCWNhc2UgJ2Njc2lkMDExNDgnOgoJCQljYXNlICdjcDAxMTQ4JzoKCQkJY2FzZSAnZWJjZGljaW50ZXJuYXRpb25hbDUwMGV1cm8nOgoJCQljYXNlICdpYm0wMTE0OCc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQ4JzsKCgkJCWNhc2UgJ2Njc2lkMDExNDknOgoJCQljYXNlICdjcDAxMTQ5JzoKCQkJY2FzZSAnZWJjZGljaXM4NzFldXJvJzoKCQkJY2FzZSAnaWJtMDExNDknOgoJCQkJcmV0dXJuICdJQk0wMTE0OSc7CgoJCQljYXNlICdjcDAzNyc6CgkJCWNhc2UgJ2NzaWJtMDM3JzoKCQkJY2FzZSAnZWJjZGljY3BjYSc6CgkJCWNhc2UgJ2ViY2RpY2NwbmwnOgoJCQljYXNlICdlYmNkaWNjcHVzJzoKCQkJY2FzZSAnZWJjZGljY3B3dCc6CgkJCWNhc2UgJ2libTAzNyc6CgkJCQlyZXR1cm4gJ0lCTTAzNyc7CgoJCQljYXNlICdjcDAzOCc6CgkJCWNhc2UgJ2NzaWJtMDM4JzoKCQkJY2FzZSAnZWJjZGljaW50JzoKCQkJY2FzZSAnaWJtMDM4JzoKCQkJCXJldHVybiAnSUJNMDM4JzsKCgkJCWNhc2UgJ2NwMjczJzoKCQkJY2FzZSAnY3NpYm0yNzMnOgoJCQljYXNlICdpYm0yNzMnOgoJCQkJcmV0dXJuICdJQk0yNzMnOwoKCQkJY2FzZSAnY3AyNzQnOgoJCQljYXNlICdjc2libTI3NCc6CgkJCWNhc2UgJ2ViY2RpY2JlJzoKCQkJY2FzZSAnaWJtMjc0JzoKCQkJCXJldHVybiAnSUJNMjc0JzsKCgkJCWNhc2UgJ2NwMjc1JzoKCQkJY2FzZSAnY3NpYm0yNzUnOgoJCQljYXNlICdlYmNkaWNicic6CgkJCWNhc2UgJ2libTI3NSc6CgkJCQlyZXR1cm4gJ0lCTTI3NSc7CgoJCQljYXNlICdjc2libTI3Nyc6CgkJCWNhc2UgJ2ViY2RpY2NwZGsnOgoJCQljYXNlICdlYmNkaWNjcG5vJzoKCQkJY2FzZSAnaWJtMjc3JzoKCQkJCXJldHVybiAnSUJNMjc3JzsKCgkJCWNhc2UgJ2NwMjc4JzoKCQkJY2FzZSAnY3NpYm0yNzgnOgoJCQljYXNlICdlYmNkaWNjcGZpJzoKCQkJY2FzZSAnZWJjZGljY3BzZSc6CgkJCWNhc2UgJ2libTI3OCc6CgkJCQlyZXR1cm4gJ0lCTTI3OCc7CgoJCQljYXNlICdjcDI4MCc6CgkJCWNhc2UgJ2NzaWJtMjgwJzoKCQkJY2FzZSAnZWJjZGljY3BpdCc6CgkJCWNhc2UgJ2libTI4MCc6CgkJCQlyZXR1cm4gJ0lCTTI4MCc7CgoJCQljYXNlICdjcDI4MSc6CgkJCWNhc2UgJ2NzaWJtMjgxJzoKCQkJY2FzZSAnZWJjZGljanBlJzoKCQkJY2FzZSAnaWJtMjgxJzoKCQkJCXJldHVybiAnSUJNMjgxJzsKCgkJCWNhc2UgJ2NwMjg0JzoKCQkJY2FzZSAnY3NpYm0yODQnOgoJCQljYXNlICdlYmNkaWNjcGVzJzoKCQkJY2FzZSAnaWJtMjg0JzoKCQkJCXJldHVybiAnSUJNMjg0JzsKCgkJCWNhc2UgJ2NwMjg1JzoKCQkJY2FzZSAnY3NpYm0yODUnOgoJCQljYXNlICdlYmNkaWNjcGdiJzoKCQkJY2FzZSAnaWJtMjg1JzoKCQkJCXJldHVybiAnSUJNMjg1JzsKCgkJCWNhc2UgJ2NwMjkwJzoKCQkJY2FzZSAnY3NpYm0yOTAnOgoJCQljYXNlICdlYmNkaWNqcGthbmEnOgoJCQljYXNlICdpYm0yOTAnOgoJCQkJcmV0dXJuICdJQk0yOTAnOwoKCQkJY2FzZSAnY3AyOTcnOgoJCQljYXNlICdjc2libTI5Nyc6CgkJCWNhc2UgJ2ViY2RpY2NwZnInOgoJCQljYXNlICdpYm0yOTcnOgoJCQkJcmV0dXJuICdJQk0yOTcnOwoKCQkJY2FzZSAnY3A0MjAnOgoJCQljYXNlICdjc2libTQyMCc6CgkJCWNhc2UgJ2ViY2RpY2NwYXIxJzoKCQkJY2FzZSAnaWJtNDIwJzoKCQkJCXJldHVybiAnSUJNNDIwJzsKCgkJCWNhc2UgJ2NwNDIzJzoKCQkJY2FzZSAnY3NpYm00MjMnOgoJCQljYXNlICdlYmNkaWNjcGdyJzoKCQkJY2FzZSAnaWJtNDIzJzoKCQkJCXJldHVybiAnSUJNNDIzJzsKCgkJCWNhc2UgJ2NwNDI0JzoKCQkJY2FzZSAnY3NpYm00MjQnOgoJCQljYXNlICdlYmNkaWNjcGhlJzoKCQkJY2FzZSAnaWJtNDI0JzoKCQkJCXJldHVybiAnSUJNNDI0JzsKCgkJCWNhc2UgJzQzNyc6CgkJCWNhc2UgJ2NwNDM3JzoKCQkJY2FzZSAnY3NwYzhjb2RlcGFnZTQzNyc6CgkJCWNhc2UgJ2libTQzNyc6CgkJCQlyZXR1cm4gJ0lCTTQzNyc7CgoJCQljYXNlICdjcDUwMCc6CgkJCWNhc2UgJ2NzaWJtNTAwJzoKCQkJY2FzZSAnZWJjZGljY3BiZSc6CgkJCWNhc2UgJ2ViY2RpY2NwY2gnOgoJCQljYXNlICdpYm01MDAnOgoJCQkJcmV0dXJuICdJQk01MDAnOwoKCQkJY2FzZSAnY3A3NzUnOgoJCQljYXNlICdjc3BjNzc1YmFsdGljJzoKCQkJY2FzZSAnaWJtNzc1JzoKCQkJCXJldHVybiAnSUJNNzc1JzsKCgkJCWNhc2UgJzg1MCc6CgkJCWNhc2UgJ2NwODUwJzoKCQkJY2FzZSAnY3NwYzg1MG11bHRpbGluZ3VhbCc6CgkJCWNhc2UgJ2libTg1MCc6CgkJCQlyZXR1cm4gJ0lCTTg1MCc7CgoJCQljYXNlICc4NTEnOgoJCQljYXNlICdjcDg1MSc6CgkJCWNhc2UgJ2NzaWJtODUxJzoKCQkJY2FzZSAnaWJtODUxJzoKCQkJCXJldHVybiAnSUJNODUxJzsKCgkJCWNhc2UgJzg1Mic6CgkJCWNhc2UgJ2NwODUyJzoKCQkJY2FzZSAnY3NwY3A4NTInOgoJCQljYXNlICdpYm04NTInOgoJCQkJcmV0dXJuICdJQk04NTInOwoKCQkJY2FzZSAnODU1JzoKCQkJY2FzZSAnY3A4NTUnOgoJCQljYXNlICdjc2libTg1NSc6CgkJCWNhc2UgJ2libTg1NSc6CgkJCQlyZXR1cm4gJ0lCTTg1NSc7CgoJCQljYXNlICc4NTcnOgoJCQljYXNlICdjcDg1Nyc6CgkJCWNhc2UgJ2NzaWJtODU3JzoKCQkJY2FzZSAnaWJtODU3JzoKCQkJCXJldHVybiAnSUJNODU3JzsKCgkJCWNhc2UgJzg2MCc6CgkJCWNhc2UgJ2NwODYwJzoKCQkJY2FzZSAnY3NpYm04NjAnOgoJCQljYXNlICdpYm04NjAnOgoJCQkJcmV0dXJuICdJQk04NjAnOwoKCQkJY2FzZSAnODYxJzoKCQkJY2FzZSAnY3Bpcyc6CgkJCWNhc2UgJ2NwODYxJzoKCQkJY2FzZSAnY3NpYm04NjEnOgoJCQljYXNlICdpYm04NjEnOgoJCQkJcmV0dXJuICdJQk04NjEnOwoKCQkJY2FzZSAnODYyJzoKCQkJY2FzZSAnY3A4NjInOgoJCQljYXNlICdjc3BjODYybGF0aW5oZWJyZXcnOgoJCQljYXNlICdpYm04NjInOgoJCQkJcmV0dXJuICdJQk04NjInOwoKCQkJY2FzZSAnODYzJzoKCQkJY2FzZSAnY3A4NjMnOgoJCQljYXNlICdjc2libTg2Myc6CgkJCWNhc2UgJ2libTg2Myc6CgkJCQlyZXR1cm4gJ0lCTTg2Myc7CgoJCQljYXNlICdjcDg2NCc6CgkJCWNhc2UgJ2NzaWJtODY0JzoKCQkJY2FzZSAnaWJtODY0JzoKCQkJCXJldHVybiAnSUJNODY0JzsKCgkJCWNhc2UgJzg2NSc6CgkJCWNhc2UgJ2NwODY1JzoKCQkJY2FzZSAnY3NpYm04NjUnOgoJCQljYXNlICdpYm04NjUnOgoJCQkJcmV0dXJuICdJQk04NjUnOwoKCQkJY2FzZSAnODY2JzoKCQkJY2FzZSAnY3A4NjYnOgoJCQljYXNlICdjc2libTg2Nic6CgkJCWNhc2UgJ2libTg2Nic6CgkJCQlyZXR1cm4gJ0lCTTg2Nic7CgoJCQljYXNlICdjcGFyJzoKCQkJY2FzZSAnY3A4NjgnOgoJCQljYXNlICdjc2libTg2OCc6CgkJCWNhc2UgJ2libTg2OCc6CgkJCQlyZXR1cm4gJ0lCTTg2OCc7CgoJCQljYXNlICc4NjknOgoJCQljYXNlICdjcGdyJzoKCQkJY2FzZSAnY3A4NjknOgoJCQljYXNlICdjc2libTg2OSc6CgkJCWNhc2UgJ2libTg2OSc6CgkJCQlyZXR1cm4gJ0lCTTg2OSc7CgoJCQljYXNlICdjcDg3MCc6CgkJCWNhc2UgJ2NzaWJtODcwJzoKCQkJY2FzZSAnZWJjZGljY3Byb2VjZSc6CgkJCWNhc2UgJ2ViY2RpY2NweXUnOgoJCQljYXNlICdpYm04NzAnOgoJCQkJcmV0dXJuICdJQk04NzAnOwoKCQkJY2FzZSAnY3A4NzEnOgoJCQljYXNlICdjc2libTg3MSc6CgkJCWNhc2UgJ2ViY2RpY2NwaXMnOgoJCQljYXNlICdpYm04NzEnOgoJCQkJcmV0dXJuICdJQk04NzEnOwoKCQkJY2FzZSAnY3A4ODAnOgoJCQljYXNlICdjc2libTg4MCc6CgkJCWNhc2UgJ2ViY2RpY2N5cmlsbGljJzoKCQkJY2FzZSAnaWJtODgwJzoKCQkJCXJldHVybiAnSUJNODgwJzsKCgkJCWNhc2UgJ2NwODkxJzoKCQkJY2FzZSAnY3NpYm04OTEnOgoJCQljYXNlICdpYm04OTEnOgoJCQkJcmV0dXJuICdJQk04OTEnOwoKCQkJY2FzZSAnY3A5MDMnOgoJCQljYXNlICdjc2libTkwMyc6CgkJCWNhc2UgJ2libTkwMyc6CgkJCQlyZXR1cm4gJ0lCTTkwMyc7CgoJCQljYXNlICc5MDQnOgoJCQljYXNlICdjcDkwNCc6CgkJCWNhc2UgJ2NzaWJibTkwNCc6CgkJCWNhc2UgJ2libTkwNCc6CgkJCQlyZXR1cm4gJ0lCTTkwNCc7CgoJCQljYXNlICdjcDkwNSc6CgkJCWNhc2UgJ2NzaWJtOTA1JzoKCQkJY2FzZSAnZWJjZGljY3B0cic6CgkJCWNhc2UgJ2libTkwNSc6CgkJCQlyZXR1cm4gJ0lCTTkwNSc7CgoJCQljYXNlICdjcDkxOCc6CgkJCWNhc2UgJ2NzaWJtOTE4JzoKCQkJY2FzZSAnZWJjZGljY3BhcjInOgoJCQljYXNlICdpYm05MTgnOgoJCQkJcmV0dXJuICdJQk05MTgnOwoKCQkJY2FzZSAnY3AxMDI2JzoKCQkJY2FzZSAnY3NpYm0xMDI2JzoKCQkJY2FzZSAnaWJtMTAyNic6CgkJCQlyZXR1cm4gJ0lCTTEwMjYnOwoKCQkJY2FzZSAnaWJtMTA0Nyc6CgkJCWNhc2UgJ2libTEwNDcnOgoJCQkJcmV0dXJuICdJQk0xMDQ3JzsKCgkJCWNhc2UgJ2NzaXNvMTQzaWVjcDI3MSc6CgkJCWNhc2UgJ2llY3AyNzEnOgoJCQljYXNlICdpc29pcjE0Myc6CgkJCQlyZXR1cm4gJ0lFQ19QMjctMSc7CgoJCQljYXNlICdjc2lzbzQ5aW5pcyc6CgkJCWNhc2UgJ2luaXMnOgoJCQljYXNlICdpc29pcjQ5JzoKCQkJCXJldHVybiAnSU5JUyc7CgoJCQljYXNlICdjc2lzbzUwaW5pczgnOgoJCQljYXNlICdpbmlzOCc6CgkJCWNhc2UgJ2lzb2lyNTAnOgoJCQkJcmV0dXJuICdJTklTLTgnOwoKCQkJY2FzZSAnY3Npc281MWluaXNjeXJpbGxpYyc6CgkJCWNhc2UgJ2luaXNjeXJpbGxpYyc6CgkJCWNhc2UgJ2lzb2lyNTEnOgoJCQkJcmV0dXJuICdJTklTLWN5cmlsbGljJzsKCgkJCWNhc2UgJ2NzaW52YXJpYW50JzoKCQkJY2FzZSAnaW52YXJpYW50JzoKCQkJCXJldHVybiAnSU5WQVJJQU5UJzsKCgkJCWNhc2UgJ2lzbzIwMjJjbic6CgkJCQlyZXR1cm4gJ0lTTy0yMDIyLUNOJzsKCgkJCWNhc2UgJ2lzbzIwMjJjbmV4dCc6CgkJCQlyZXR1cm4gJ0lTTy0yMDIyLUNOLUVYVCc7CgoJCQljYXNlICdjc2lzbzIwMjJqcCc6CgkJCWNhc2UgJ2lzbzIwMjJqcCc6CgkJCQlyZXR1cm4gJ0lTTy0yMDIyLUpQJzsKCgkJCWNhc2UgJ2NzaXNvMjAyMmpwMic6CgkJCWNhc2UgJ2lzbzIwMjJqcDInOgoJCQkJcmV0dXJuICdJU08tMjAyMi1KUC0yJzsKCgkJCWNhc2UgJ2NzaXNvMjAyMmtyJzoKCQkJY2FzZSAnaXNvMjAyMmtyJzoKCQkJCXJldHVybiAnSVNPLTIwMjItS1InOwoKCQkJY2FzZSAnY3N3aW5kb3dzMzBsYXRpbjEnOgoJCQljYXNlICdpc284ODU5MXdpbmRvd3MzMGxhdGluMSc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTEtV2luZG93cy0zLjAtTGF0aW4tMSc7CgoJCQljYXNlICdjc3dpbmRvd3MzMWxhdGluMSc6CgkJCWNhc2UgJ2lzbzg4NTkxd2luZG93czMxbGF0aW4xJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMS1XaW5kb3dzLTMuMS1MYXRpbi0xJzsKCgkJCWNhc2UgJ2NzaXNvbGF0aW4yJzoKCQkJY2FzZSAnaXNvODg1OTInOgoJCQljYXNlICdpc29pcjEwMSc6CgkJCWNhc2UgJ2lzbzg4NTkyJzoKCQkJY2FzZSAnaXNvODg1OTIxOTg3JzoKCQkJY2FzZSAnbDInOgoJCQljYXNlICdsYXRpbjInOgoJCQkJcmV0dXJuICdJU08tODg1OS0yJzsKCgkJCWNhc2UgJ2Nzd2luZG93czMxbGF0aW4yJzoKCQkJY2FzZSAnaXNvODg1OTJ3aW5kb3dzbGF0aW4yJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMi1XaW5kb3dzLUxhdGluLTInOwoKCQkJY2FzZSAnY3Npc29sYXRpbjMnOgoJCQljYXNlICdpc284ODU5Myc6CgkJCWNhc2UgJ2lzb2lyMTA5JzoKCQkJY2FzZSAnaXNvODg1OTMnOgoJCQljYXNlICdpc284ODU5MzE5ODgnOgoJCQljYXNlICdsMyc6CgkJCWNhc2UgJ2xhdGluMyc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTMnOwoKCQkJY2FzZSAnY3Npc29sYXRpbjQnOgoJCQljYXNlICdpc284ODU5NCc6CgkJCWNhc2UgJ2lzb2lyMTEwJzoKCQkJY2FzZSAnaXNvODg1OTQnOgoJCQljYXNlICdpc284ODU5NDE5ODgnOgoJCQljYXNlICdsNCc6CgkJCWNhc2UgJ2xhdGluNCc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTQnOwoKCQkJY2FzZSAnY3Npc29sYXRpbmN5cmlsbGljJzoKCQkJY2FzZSAnY3lyaWxsaWMnOgoJCQljYXNlICdpc284ODU5NSc6CgkJCWNhc2UgJ2lzb2lyMTQ0JzoKCQkJY2FzZSAnaXNvODg1OTUnOgoJCQljYXNlICdpc284ODU5NTE5ODgnOgoJCQkJcmV0dXJuICdJU08tODg1OS01JzsKCgkJCWNhc2UgJ2FyYWJpYyc6CgkJCWNhc2UgJ2FzbW83MDgnOgoJCQljYXNlICdjc2lzb2xhdGluYXJhYmljJzoKCQkJY2FzZSAnZWNtYTExNCc6CgkJCWNhc2UgJ2lzbzg4NTk2JzoKCQkJY2FzZSAnaXNvaXIxMjcnOgoJCQljYXNlICdpc284ODU5Nic6CgkJCWNhc2UgJ2lzbzg4NTk2MTk4Nyc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTYnOwoKCQkJY2FzZSAnY3Npc284ODU5NmUnOgoJCQljYXNlICdpc284ODU5NmUnOgoJCQljYXNlICdpc284ODU5NmUnOgoJCQkJcmV0dXJuICdJU08tODg1OS02LUUnOwoKCQkJY2FzZSAnY3Npc284ODU5NmknOgoJCQljYXNlICdpc284ODU5NmknOgoJCQljYXNlICdpc284ODU5NmknOgoJCQkJcmV0dXJuICdJU08tODg1OS02LUknOwoKCQkJY2FzZSAnY3Npc29sYXRpbmdyZWVrJzoKCQkJY2FzZSAnZWNtYTExOCc6CgkJCWNhc2UgJ2Vsb3Q5MjgnOgoJCQljYXNlICdncmVlayc6CgkJCWNhc2UgJ2dyZWVrOCc6CgkJCWNhc2UgJ2lzbzg4NTk3JzoKCQkJY2FzZSAnaXNvaXIxMjYnOgoJCQljYXNlICdpc284ODU5Nyc6CgkJCWNhc2UgJ2lzbzg4NTk3MTk4Nyc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTcnOwoKCQkJY2FzZSAnY3Npc29sYXRpbmhlYnJldyc6CgkJCWNhc2UgJ2hlYnJldyc6CgkJCWNhc2UgJ2lzbzg4NTk4JzoKCQkJY2FzZSAnaXNvaXIxMzgnOgoJCQljYXNlICdpc284ODU5OCc6CgkJCWNhc2UgJ2lzbzg4NTk4MTk4OCc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTgnOwoKCQkJY2FzZSAnY3Npc284ODU5OGUnOgoJCQljYXNlICdpc284ODU5OGUnOgoJCQljYXNlICdpc284ODU5OGUnOgoJCQkJcmV0dXJuICdJU08tODg1OS04LUUnOwoKCQkJY2FzZSAnY3Npc284ODU5OGknOgoJCQljYXNlICdpc284ODU5OGknOgoJCQljYXNlICdpc284ODU5OGknOgoJCQkJcmV0dXJuICdJU08tODg1OS04LUknOwoKCQkJY2FzZSAnY3N3aW5kb3dzMzFsYXRpbjUnOgoJCQljYXNlICdpc284ODU5OXdpbmRvd3NsYXRpbjUnOgoJCQkJcmV0dXJuICdJU08tODg1OS05LVdpbmRvd3MtTGF0aW4tNSc7CgoJCQljYXNlICdjc2lzb2xhdGluNic6CgkJCWNhc2UgJ2lzbzg4NTkxMCc6CgkJCWNhc2UgJ2lzb2lyMTU3JzoKCQkJY2FzZSAnaXNvODg1OTEwMTk5Mic6CgkJCWNhc2UgJ2w2JzoKCQkJY2FzZSAnbGF0aW42JzoKCQkJCXJldHVybiAnSVNPLTg4NTktMTAnOwoKCQkJY2FzZSAnaXNvODg1OTEzJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMTMnOwoKCQkJY2FzZSAnaXNvODg1OTE0JzoKCQkJY2FzZSAnaXNvY2VsdGljJzoKCQkJY2FzZSAnaXNvaXIxOTknOgoJCQljYXNlICdpc284ODU5MTQnOgoJCQljYXNlICdpc284ODU5MTQxOTk4JzoKCQkJY2FzZSAnbDgnOgoJCQljYXNlICdsYXRpbjgnOgoJCQkJcmV0dXJuICdJU08tODg1OS0xNCc7CgoJCQljYXNlICdpc284ODU5MTUnOgoJCQljYXNlICdpc284ODU5MTUnOgoJCQljYXNlICdsYXRpbjknOgoJCQkJcmV0dXJuICdJU08tODg1OS0xNSc7CgoJCQljYXNlICdpc284ODU5MTYnOgoJCQljYXNlICdpc29pcjIyNic6CgkJCWNhc2UgJ2lzbzg4NTkxNic6CgkJCWNhc2UgJ2lzbzg4NTkxNjIwMDEnOgoJCQljYXNlICdsMTAnOgoJCQljYXNlICdsYXRpbjEwJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMTYnOwoKCQkJY2FzZSAnaXNvMTA2NDZqMSc6CgkJCQlyZXR1cm4gJ0lTTy0xMDY0Ni1KLTEnOwoKCQkJY2FzZSAnY3N1bmljb2RlJzoKCQkJY2FzZSAnaXNvMTA2NDZ1Y3MyJzoKCQkJCXJldHVybiAnSVNPLTEwNjQ2LVVDUy0yJzsKCgkJCWNhc2UgJ2NzdWNzNCc6CgkJCWNhc2UgJ2lzbzEwNjQ2dWNzNCc6CgkJCQlyZXR1cm4gJ0lTTy0xMDY0Ni1VQ1MtNCc7CgoJCQljYXNlICdjc3VuaWNvZGVhc2NpaSc6CgkJCWNhc2UgJ2lzbzEwNjQ2dWNzYmFzaWMnOgoJCQkJcmV0dXJuICdJU08tMTA2NDYtVUNTLUJhc2ljJzsKCgkJCWNhc2UgJ2NzdW5pY29kZWxhdGluMSc6CgkJCWNhc2UgJ2lzbzEwNjQ2JzoKCQkJY2FzZSAnaXNvMTA2NDZ1bmljb2RlbGF0aW4xJzoKCQkJCXJldHVybiAnSVNPLTEwNjQ2LVVuaWNvZGUtTGF0aW4xJzsKCgkJCWNhc2UgJ2NzaXNvMTA2NDZ1dGYxJzoKCQkJY2FzZSAnaXNvMTA2NDZ1dGYxJzoKCQkJCXJldHVybiAnSVNPLTEwNjQ2LVVURi0xJzsKCgkJCWNhc2UgJ2NzaXNvMTE1NDgxJzoKCQkJY2FzZSAnaXNvMTE1NDgxJzoKCQkJY2FzZSAnaXNvMTE1NDgxJzoKCQkJY2FzZSAnaXNvdHIxMTU0ODEnOgoJCQkJcmV0dXJuICdJU08tMTE1NDgtMSc7CgoJCQljYXNlICdjc2lzbzkwJzoKCQkJY2FzZSAnaXNvaXI5MCc6CgkJCQlyZXR1cm4gJ2lzby1pci05MCc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjYxJzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNjEnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI2MSc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjY0JzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNjQnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI2NCc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjY1JzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNjUnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI2NSc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjY4JzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNjgnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI2OCc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjc2JzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNzYnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI3Nic7CgoJCQljYXNlICdjc2lzbzY0NmJhc2ljMTk4Myc6CgkJCWNhc2UgJ2lzbzY0NmJhc2ljMTk4Myc6CgkJCWNhc2UgJ3JlZic6CgkJCQlyZXR1cm4gJ0lTT182NDYuYmFzaWM6MTk4Myc7CgoJCQljYXNlICdjc2lzbzJpbnRscmVmdmVyc2lvbic6CgkJCWNhc2UgJ2lydic6CgkJCWNhc2UgJ2lzb2lyMic6CgkJCWNhc2UgJ2lzbzY0NmlydjE5ODMnOgoJCQkJcmV0dXJuICdJU09fNjQ2LmlydjoxOTgzJzsKCgkJCWNhc2UgJ2NzaXNvMjAzMyc6CgkJCWNhc2UgJ2UxM2InOgoJCQljYXNlICdpc29pcjk4JzoKCQkJY2FzZSAnaXNvMjAzMzE5ODMnOgoJCQkJcmV0dXJuICdJU09fMjAzMy0xOTgzJzsKCgkJCWNhc2UgJ2NzaXNvNTQyN2N5cmlsbGljJzoKCQkJY2FzZSAnaXNvaXIzNyc6CgkJCWNhc2UgJ2lzbzU0MjcnOgoJCQkJcmV0dXJuICdJU09fNTQyNyc7CgoJCQljYXNlICdpc29pcjU0JzoKCQkJY2FzZSAnaXNvNTQyN2N5cmlsbGljMTk4MSc6CgkJCWNhc2UgJ2lzbzU0MjcxOTgxJzoKCQkJCXJldHVybiAnSVNPXzU0Mjc6MTk4MSc7CgoJCQljYXNlICdjc2lzbzU0MjhncmVlayc6CgkJCWNhc2UgJ2lzb2lyNTUnOgoJCQljYXNlICdpc281NDI4MTk4MCc6CgkJCQlyZXR1cm4gJ0lTT181NDI4OjE5ODAnOwoKCQkJY2FzZSAnY3Npc282OTM3YWRkJzoKCQkJY2FzZSAnaXNvaXIxNTInOgoJCQljYXNlICdpc282OTM3MjI1JzoKCQkJCXJldHVybiAnSVNPXzY5MzctMi0yNSc7CgoJCQljYXNlICdjc2lzb3RleHRjb21tJzoKCQkJY2FzZSAnaXNvaXIxNDInOgoJCQljYXNlICdpc282OTM3MmFkZCc6CgkJCQlyZXR1cm4gJ0lTT182OTM3LTItYWRkJzsKCgkJCWNhc2UgJ2NzaXNvODg1OXN1cHAnOgoJCQljYXNlICdpc29pcjE1NCc6CgkJCWNhc2UgJ2lzbzg4NTlzdXBwJzoKCQkJY2FzZSAnbGF0aW4xMjUnOgoJCQkJcmV0dXJuICdJU09fODg1OS1zdXBwJzsKCgkJCWNhc2UgJ2NzaXNvMTAzNjdib3gnOgoJCQljYXNlICdpc29pcjE1NSc6CgkJCWNhc2UgJ2lzbzEwMzY3Ym94JzoKCQkJCXJldHVybiAnSVNPXzEwMzY3LWJveCc7CgoJCQljYXNlICdjc2lzbzE1aXRhbGlhbic6CgkJCWNhc2UgJ2lzb2lyMTUnOgoJCQljYXNlICdpc282NDZpdCc6CgkJCWNhc2UgJ2l0JzoKCQkJCXJldHVybiAnSVQnOwoKCQkJY2FzZSAnY3Npc28xM2ppc2M2MjIwanAnOgoJCQljYXNlICdpc29pcjEzJzoKCQkJY2FzZSAnamlzYzYyMjAxOTY5JzoKCQkJY2FzZSAnamlzYzYyMjAxOTY5anAnOgoJCQljYXNlICdrYXRha2FuYSc6CgkJCWNhc2UgJ3gwMjAxNyc6CgkJCQlyZXR1cm4gJ0pJU19DNjIyMC0xOTY5LWpwJzsKCgkJCWNhc2UgJ2NzaXNvMTRqaXNjNjIyMHJvJzoKCQkJY2FzZSAnaXNvaXIxNCc6CgkJCWNhc2UgJ2lzbzY0NmpwJzoKCQkJY2FzZSAnamlzYzYyMjAxOTY5cm8nOgoJCQljYXNlICdqcCc6CgkJCQlyZXR1cm4gJ0pJU19DNjIyMC0xOTY5LXJvJzsKCgkJCWNhc2UgJ2NzaXNvNDJqaXNjNjIyNjE5NzgnOgoJCQljYXNlICdpc29pcjQyJzoKCQkJY2FzZSAnamlzYzYyMjYxOTc4JzoKCQkJCXJldHVybiAnSklTX0M2MjI2LTE5NzgnOwoKCQkJY2FzZSAnY3Npc284N2ppc3gwMjA4JzoKCQkJY2FzZSAnaXNvaXI4Nyc6CgkJCWNhc2UgJ2ppc2M2MjI2MTk4Myc6CgkJCWNhc2UgJ2ppc3gwMjA4MTk4Myc6CgkJCWNhc2UgJ3gwMjA4JzoKCQkJCXJldHVybiAnSklTX0M2MjI2LTE5ODMnOwoKCQkJY2FzZSAnY3Npc285MWppc2M2MjI5MTk4NGEnOgoJCQljYXNlICdpc29pcjkxJzoKCQkJY2FzZSAnamlzYzYyMjkxOTg0YSc6CgkJCWNhc2UgJ2pwb2NyYSc6CgkJCQlyZXR1cm4gJ0pJU19DNjIyOS0xOTg0LWEnOwoKCQkJY2FzZSAnY3Npc285Mmppc2M2Mjk5MTk4NGInOgoJCQljYXNlICdpc29pcjkyJzoKCQkJY2FzZSAnaXNvNjQ2anBvY3JiJzoKCQkJY2FzZSAnamlzYzYyMjkxOTg0Yic6CgkJCWNhc2UgJ2pwb2NyYic6CgkJCQlyZXR1cm4gJ0pJU19DNjIyOS0xOTg0LWInOwoKCQkJY2FzZSAnY3Npc285M2ppczYyMjkxOTg0YmFkZCc6CgkJCWNhc2UgJ2lzb2lyOTMnOgoJCQljYXNlICdqaXNjNjIyOTE5ODRiYWRkJzoKCQkJY2FzZSAnanBvY3JiYWRkJzoKCQkJCXJldHVybiAnSklTX0M2MjI5LTE5ODQtYi1hZGQnOwoKCQkJY2FzZSAnY3Npc285NGppczYyMjkxOTg0aGFuZCc6CgkJCWNhc2UgJ2lzb2lyOTQnOgoJCQljYXNlICdqaXNjNjIyOTE5ODRoYW5kJzoKCQkJY2FzZSAnanBvY3JoYW5kJzoKCQkJCXJldHVybiAnSklTX0M2MjI5LTE5ODQtaGFuZCc7CgoJCQljYXNlICdjc2lzbzk1amlzNjIyOTE5ODRoYW5kYWRkJzoKCQkJY2FzZSAnaXNvaXI5NSc6CgkJCWNhc2UgJ2ppc2M2MjI5MTk4NGhhbmRhZGQnOgoJCQljYXNlICdqcG9jcmhhbmRhZGQnOgoJCQkJcmV0dXJuICdKSVNfQzYyMjktMTk4NC1oYW5kLWFkZCc7CgoJCQljYXNlICdjc2lzbzk2amlzYzYyMjkxOTg0a2FuYSc6CgkJCWNhc2UgJ2lzb2lyOTYnOgoJCQljYXNlICdqaXNjNjIyOTE5ODRrYW5hJzoKCQkJCXJldHVybiAnSklTX0M2MjI5LTE5ODQta2FuYSc7CgoJCQljYXNlICdjc2ppc2VuY29kaW5nJzoKCQkJY2FzZSAnamlzZW5jb2RpbmcnOgoJCQkJcmV0dXJuICdKSVNfRW5jb2RpbmcnOwoKCQkJY2FzZSAnY3NoYWxmd2lkdGhrYXRha2FuYSc6CgkJCWNhc2UgJ2ppc3gwMjAxJzoKCQkJY2FzZSAneDAyMDEnOgoJCQkJcmV0dXJuICdKSVNfWDAyMDEnOwoKCQkJY2FzZSAnY3Npc28xNTlqaXN4MDIxMjE5OTAnOgoJCQljYXNlICdpc29pcjE1OSc6CgkJCWNhc2UgJ2ppc3gwMjEyMTk5MCc6CgkJCWNhc2UgJ3gwMjEyJzoKCQkJCXJldHVybiAnSklTX1gwMjEyLTE5OTAnOwoKCQkJY2FzZSAnY3Npc28xNDFqdXNpYjEwMDInOgoJCQljYXNlICdpc29pcjE0MSc6CgkJCWNhc2UgJ2lzbzY0Nnl1JzoKCQkJY2FzZSAnanMnOgoJCQljYXNlICdqdXNpYjEwMDInOgoJCQljYXNlICd5dSc6CgkJCQlyZXR1cm4gJ0pVU19JLkIxLjAwMic7CgoJCQljYXNlICdjc2lzbzE0N21hY2Vkb25pYW4nOgoJCQljYXNlICdpc29pcjE0Nyc6CgkJCWNhc2UgJ2p1c2liMTAwM21hYyc6CgkJCWNhc2UgJ21hY2Vkb25pYW4nOgoJCQkJcmV0dXJuICdKVVNfSS5CMS4wMDMtbWFjJzsKCgkJCWNhc2UgJ2NzaXNvMTQ2c2VyYmlhbic6CgkJCWNhc2UgJ2lzb2lyMTQ2JzoKCQkJY2FzZSAnanVzaWIxMDAzc2VyYic6CgkJCWNhc2UgJ3NlcmJpYW4nOgoJCQkJcmV0dXJuICdKVVNfSS5CMS4wMDMtc2VyYic7CgoJCQljYXNlICdrb2k3c3dpdGNoZWQnOgoJCQkJcmV0dXJuICdLT0k3LXN3aXRjaGVkJzsKCgkJCWNhc2UgJ2Nza29pOHInOgoJCQljYXNlICdrb2k4cic6CgkJCQlyZXR1cm4gJ0tPSTgtUic7CgoJCQljYXNlICdrb2k4dSc6CgkJCQlyZXR1cm4gJ0tPSTgtVSc7CgoJCQljYXNlICdjc2tzYzU2MzYnOgoJCQljYXNlICdpc282NDZrcic6CgkJCWNhc2UgJ2tzYzU2MzYnOgoJCQkJcmV0dXJuICdLU0M1NjM2JzsKCgkJCWNhc2UgJ2Nza3oxMDQ4JzoKCQkJY2FzZSAna3oxMDQ4JzoKCQkJY2FzZSAncmsxMDQ4JzoKCQkJY2FzZSAnc3RyazEwNDgyMDAyJzoKCQkJCXJldHVybiAnS1otMTA0OCc7CgoJCQljYXNlICdjc2lzbzE5bGF0aW5ncmVlayc6CgkJCWNhc2UgJ2lzb2lyMTknOgoJCQljYXNlICdsYXRpbmdyZWVrJzoKCQkJCXJldHVybiAnbGF0aW4tZ3JlZWsnOwoKCQkJY2FzZSAnY3Npc28yN2xhdGluZ3JlZWsxJzoKCQkJY2FzZSAnaXNvaXIyNyc6CgkJCWNhc2UgJ2xhdGluZ3JlZWsxJzoKCQkJCXJldHVybiAnTGF0aW4tZ3JlZWstMSc7CgoJCQljYXNlICdjc2lzbzE1OGxhcCc6CgkJCWNhc2UgJ2lzb2lyMTU4JzoKCQkJY2FzZSAnbGFwJzoKCQkJY2FzZSAnbGF0aW5sYXAnOgoJCQkJcmV0dXJuICdsYXRpbi1sYXAnOwoKCQkJY2FzZSAnY3NtYWNpbnRvc2gnOgoJCQljYXNlICdtYWMnOgoJCQljYXNlICdtYWNpbnRvc2gnOgoJCQkJcmV0dXJuICdtYWNpbnRvc2gnOwoKCQkJY2FzZSAnY3NtaWNyb3NvZnRwdWJsaXNoaW5nJzoKCQkJY2FzZSAnbWljcm9zb2Z0cHVibGlzaGluZyc6CgkJCQlyZXR1cm4gJ01pY3Jvc29mdC1QdWJsaXNoaW5nJzsKCgkJCWNhc2UgJ2NzbW5lbSc6CgkJCWNhc2UgJ21uZW0nOgoJCQkJcmV0dXJuICdNTkVNJzsKCgkJCWNhc2UgJ2NzbW5lbW9uaWMnOgoJCQljYXNlICdtbmVtb25pYyc6CgkJCQlyZXR1cm4gJ01ORU1PTklDJzsKCgkJCWNhc2UgJ2NzaXNvODZodW5nYXJpYW4nOgoJCQljYXNlICdodSc6CgkJCWNhc2UgJ2lzb2lyODYnOgoJCQljYXNlICdpc282NDZodSc6CgkJCWNhc2UgJ21zejc3OTUzJzoKCQkJCXJldHVybiAnTVNaXzc3OTUuMyc7CgoJCQljYXNlICdjc25hdHNkYW5vJzoKCQkJY2FzZSAnaXNvaXI5MSc6CgkJCWNhc2UgJ25hdHNkYW5vJzoKCQkJCXJldHVybiAnTkFUUy1EQU5PJzsKCgkJCWNhc2UgJ2NzbmF0c2Rhbm9hZGQnOgoJCQljYXNlICdpc29pcjkyJzoKCQkJY2FzZSAnbmF0c2Rhbm9hZGQnOgoJCQkJcmV0dXJuICdOQVRTLURBTk8tQUREJzsKCgkJCWNhc2UgJ2NzbmF0c3NlZmknOgoJCQljYXNlICdpc29pcjgxJzoKCQkJY2FzZSAnbmF0c3NlZmknOgoJCQkJcmV0dXJuICdOQVRTLVNFRkknOwoKCQkJY2FzZSAnY3NuYXRzc2VmaWFkZCc6CgkJCWNhc2UgJ2lzb2lyODInOgoJCQljYXNlICduYXRzc2VmaWFkZCc6CgkJCQlyZXR1cm4gJ05BVFMtU0VGSS1BREQnOwoKCQkJY2FzZSAnY3Npc28xNTFjdWJhJzoKCQkJY2FzZSAnY3ViYSc6CgkJCWNhc2UgJ2lzb2lyMTUxJzoKCQkJY2FzZSAnaXNvNjQ2Y3UnOgoJCQljYXNlICduY25jMDAxMDgxJzoKCQkJCXJldHVybiAnTkNfTkMwMC0xMDo4MSc7CgoJCQljYXNlICdjc2lzbzY5ZnJlbmNoJzoKCQkJY2FzZSAnZnInOgoJCQljYXNlICdpc29pcjY5JzoKCQkJY2FzZSAnaXNvNjQ2ZnInOgoJCQljYXNlICduZno2MjAxMCc6CgkJCQlyZXR1cm4gJ05GX1pfNjItMDEwJzsKCgkJCWNhc2UgJ2NzaXNvMjVmcmVuY2gnOgoJCQljYXNlICdpc29pcjI1JzoKCQkJY2FzZSAnaXNvNjQ2ZnIxJzoKCQkJY2FzZSAnbmZ6NjIwMTAxOTczJzoKCQkJCXJldHVybiAnTkZfWl82Mi0wMTBfKDE5NzMpJzsKCgkJCWNhc2UgJ2NzaXNvNjBkYW5pc2hub3J3ZWdpYW4nOgoJCQljYXNlICdjc2lzbzYwbm9yd2VnaWFuMSc6CgkJCWNhc2UgJ2lzb2lyNjAnOgoJCQljYXNlICdpc282NDZubyc6CgkJCWNhc2UgJ25vJzoKCQkJY2FzZSAnbnM0NTUxMSc6CgkJCQlyZXR1cm4gJ05TXzQ1NTEtMSc7CgoJCQljYXNlICdjc2lzbzYxbm9yd2VnaWFuMic6CgkJCWNhc2UgJ2lzb2lyNjEnOgoJCQljYXNlICdpc282NDZubzInOgoJCQljYXNlICdubzInOgoJCQljYXNlICduczQ1NTEyJzoKCQkJCXJldHVybiAnTlNfNDU1MS0yJzsKCgkJCWNhc2UgJ29zZGViY2RpY2RmMDNpcnYnOgoJCQkJcmV0dXJuICdPU0RfRUJDRElDX0RGMDNfSVJWJzsKCgkJCWNhc2UgJ29zZGViY2RpY2RmMDQxJzoKCQkJCXJldHVybiAnT1NEX0VCQ0RJQ19ERjA0XzEnOwoKCQkJY2FzZSAnb3NkZWJjZGljZGYwNDE1JzoKCQkJCXJldHVybiAnT1NEX0VCQ0RJQ19ERjA0XzE1JzsKCgkJCWNhc2UgJ2NzcGM4ZGFuaXNobm9yd2VnaWFuJzoKCQkJY2FzZSAncGM4ZGFuaXNobm9yd2VnaWFuJzoKCQkJCXJldHVybiAnUEM4LURhbmlzaC1Ob3J3ZWdpYW4nOwoKCQkJY2FzZSAnY3NwYzh0dXJraXNoJzoKCQkJY2FzZSAncGM4dHVya2lzaCc6CgkJCQlyZXR1cm4gJ1BDOC1UdXJraXNoJzsKCgkJCWNhc2UgJ2NzaXNvMTZwb3J0dWd1ZXNlJzoKCQkJY2FzZSAnaXNvaXIxNic6CgkJCWNhc2UgJ2lzbzY0NnB0JzoKCQkJY2FzZSAncHQnOgoJCQkJcmV0dXJuICdQVCc7CgoJCQljYXNlICdjc2lzbzg0cG9ydHVndWVzZTInOgoJCQljYXNlICdpc29pcjg0JzoKCQkJY2FzZSAnaXNvNjQ2cHQyJzoKCQkJY2FzZSAncHQyJzoKCQkJCXJldHVybiAnUFQyJzsKCgkJCWNhc2UgJ2NwMTU0JzoKCQkJY2FzZSAnY3NwdGNwMTU0JzoKCQkJY2FzZSAnY3lyaWxsaWNhc2lhbic6CgkJCWNhc2UgJ3B0MTU0JzoKCQkJY2FzZSAncHRjcDE1NCc6CgkJCQlyZXR1cm4gJ1BUQ1AxNTQnOwoKCQkJY2FzZSAnc2NzdSc6CgkJCQlyZXR1cm4gJ1NDU1UnOwoKCQkJY2FzZSAnY3Npc28xMHN3ZWRpc2gnOgoJCQljYXNlICdmaSc6CgkJCWNhc2UgJ2lzb2lyMTAnOgoJCQljYXNlICdpc282NDZmaSc6CgkJCWNhc2UgJ2lzbzY0NnNlJzoKCQkJY2FzZSAnc2UnOgoJCQljYXNlICdzZW44NTAyMDBiJzoKCQkJCXJldHVybiAnU0VOXzg1MDIwMF9CJzsKCgkJCWNhc2UgJ2NzaXNvMTFzd2VkaXNoZm9ybmFtZXMnOgoJCQljYXNlICdpc29pcjExJzoKCQkJY2FzZSAnaXNvNjQ2c2UyJzoKCQkJY2FzZSAnc2UyJzoKCQkJY2FzZSAnc2VuODUwMjAwYyc6CgkJCQlyZXR1cm4gJ1NFTl84NTAyMDBfQyc7CgoJCQljYXNlICdjc3NoaWZ0amlzJzoKCQkJY2FzZSAnbXNrYW5qaSc6CgkJCWNhc2UgJ3NoaWZ0amlzJzoKCQkJCXJldHVybiAnU2hpZnRfSklTJzsKCgkJCWNhc2UgJ2NzaXNvMTAydDYxN2JpdCc6CgkJCWNhc2UgJ2lzb2lyMTAyJzoKCQkJY2FzZSAndDYxN2JpdCc6CgkJCQlyZXR1cm4gJ1QuNjEtN2JpdCc7CgoJCQljYXNlICdjc2lzbzEwM3Q2MThiaXQnOgoJCQljYXNlICdpc29pcjEwMyc6CgkJCWNhc2UgJ3Q2MSc6CgkJCWNhc2UgJ3Q2MThiaXQnOgoJCQkJcmV0dXJuICdULjYxLThiaXQnOwoKCQkJY2FzZSAnY3Npc28xMjh0MTAxZzInOgoJCQljYXNlICdpc29pcjEyOCc6CgkJCWNhc2UgJ3QxMDFnMic6CgkJCQlyZXR1cm4gJ1QuMTAxLUcyJzsKCgkJCWNhc2UgJ2NzdHNjaWknOgoJCQljYXNlICd0c2NpaSc6CgkJCQlyZXR1cm4gJ1RTQ0lJJzsKCgkJCWNhc2UgJ2NzdW5pY29kZTExJzoKCQkJY2FzZSAndW5pY29kZTExJzoKCQkJCXJldHVybiAnVU5JQ09ERS0xLTEnOwoKCQkJY2FzZSAnY3N1bmljb2RlMTF1dGY3JzoKCQkJY2FzZSAndW5pY29kZTExdXRmNyc6CgkJCQlyZXR1cm4gJ1VOSUNPREUtMS0xLVVURi03JzsKCgkJCWNhc2UgJ2NzdW5rbm93bjhiaXQnOgoJCQljYXNlICd1bmtub3duOGJpdCc6CgkJCQlyZXR1cm4gJ1VOS05PV04tOEJJVCc7CgoJCQljYXNlICdhbnNpeDM0MTk2OCc6CgkJCWNhc2UgJ2Fuc2l4MzQxOTg2JzoKCQkJY2FzZSAnYXNjaWknOgoJCQljYXNlICdjcDM2Nyc6CgkJCWNhc2UgJ2NzYXNjaWknOgoJCQljYXNlICdpYm0zNjcnOgoJCQljYXNlICdpc29pcjYnOgoJCQljYXNlICdpc282NDZ1cyc6CgkJCWNhc2UgJ2lzbzY0NmlydjE5OTEnOgoJCQljYXNlICd1cyc6CgkJCWNhc2UgJ3VzYXNjaWknOgoJCQkJcmV0dXJuICdVUy1BU0NJSSc7CgoJCQljYXNlICdjc3VzZGsnOgoJCQljYXNlICd1c2RrJzoKCQkJCXJldHVybiAndXMtZGsnOwoKCQkJY2FzZSAndXRmNyc6CgkJCQlyZXR1cm4gJ1VURi03JzsKCgkJCWNhc2UgJ3V0ZjgnOgoJCQkJcmV0dXJuICdVVEYtOCc7CgoJCQljYXNlICd1dGYxNic6CgkJCQlyZXR1cm4gJ1VURi0xNic7CgoJCQljYXNlICd1dGYxNmJlJzoKCQkJCXJldHVybiAnVVRGLTE2QkUnOwoKCQkJY2FzZSAndXRmMTZsZSc6CgkJCQlyZXR1cm4gJ1VURi0xNkxFJzsKCgkJCWNhc2UgJ3V0ZjMyJzoKCQkJCXJldHVybiAnVVRGLTMyJzsKCgkJCWNhc2UgJ3V0ZjMyYmUnOgoJCQkJcmV0dXJuICdVVEYtMzJCRSc7CgoJCQljYXNlICd1dGYzMmxlJzoKCQkJCXJldHVybiAnVVRGLTMyTEUnOwoKCQkJY2FzZSAnY3N2ZW50dXJhaW50ZXJuYXRpb25hbCc6CgkJCWNhc2UgJ3ZlbnR1cmFpbnRlcm5hdGlvbmFsJzoKCQkJCXJldHVybiAnVmVudHVyYS1JbnRlcm5hdGlvbmFsJzsKCgkJCWNhc2UgJ2NzdmVudHVyYW1hdGgnOgoJCQljYXNlICd2ZW50dXJhbWF0aCc6CgkJCQlyZXR1cm4gJ1ZlbnR1cmEtTWF0aCc7CgoJCQljYXNlICdjc3ZlbnR1cmF1cyc6CgkJCWNhc2UgJ3ZlbnR1cmF1cyc6CgkJCQlyZXR1cm4gJ1ZlbnR1cmEtVVMnOwoKCQkJY2FzZSAnY3Npc283MHZpZGVvdGV4c3VwcDEnOgoJCQljYXNlICdpc29pcjcwJzoKCQkJY2FzZSAndmlkZW90ZXhzdXBwbCc6CgkJCQlyZXR1cm4gJ3ZpZGVvdGV4LXN1cHBsJzsKCgkJCWNhc2UgJ2Nzdmlxcic6CgkJCWNhc2UgJ3ZpcXInOgoJCQkJcmV0dXJuICdWSVFSJzsKCgkJCWNhc2UgJ2NzdmlzY2lpJzoKCQkJY2FzZSAndmlzY2lpJzoKCQkJCXJldHVybiAnVklTQ0lJJzsKCgkJCWNhc2UgJ2Nzd2luZG93czMxaic6CgkJCWNhc2UgJ3dpbmRvd3MzMWonOgoJCQkJcmV0dXJuICdXaW5kb3dzLTMxSic7CgoJCQljYXNlICdpc284ODU5MTEnOgoJCQljYXNlICd0aXM2MjAnOgoJCQkJcmV0dXJuICdXaW5kb3dzLTg3NCc7CgoJCQljYXNlICdjc2V1Y2tyJzoKCQkJY2FzZSAnZXVja3InOgoJCQljYXNlICd3aW5kb3dzOTQ5JzoKCQkJY2FzZSAnY3Nrc2M1NjAxMTk4Nyc6CgkJCWNhc2UgJ2lzb2lyMTQ5JzoKCQkJY2FzZSAna29yZWFuJzoKCQkJY2FzZSAna3NjNTYwMSc6CgkJCWNhc2UgJ2tzYzU2MDExOTg3JzoKCQkJY2FzZSAna3NjNTYwMTE5ODknOgoJCQkJcmV0dXJuICdXaW5kb3dzLTk0OSc7CgoJCQljYXNlICd3aW5kb3dzMTI1MCc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1MCc7CgoJCQljYXNlICd3aW5kb3dzMTI1MSc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1MSc7CgoJCQljYXNlICdjcDgxOSc6CgkJCWNhc2UgJ2NzaXNvbGF0aW4xJzoKCQkJY2FzZSAnaWJtODE5JzoKCQkJY2FzZSAnaXNvODg1OTEnOgoJCQljYXNlICdpc29pcjEwMCc6CgkJCWNhc2UgJ2lzbzg4NTkxMTk4Nyc6CgkJCWNhc2UgJ2wxJzoKCQkJY2FzZSAnbGF0aW4xJzoKCQkJY2FzZSAnd2luZG93czEyNTInOgoJCQkJcmV0dXJuICdXaW5kb3dzLTEyNTInOwoKCQkJY2FzZSAnd2luZG93czEyNTInOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTInOwoKCQkJY2FzZSAnd2luZG93czEyNTMnOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTMnOwoKCQkJY2FzZSAnY3Npc29sYXRpbjUnOgoJCQljYXNlICdpc284ODU5OSc6CgkJCWNhc2UgJ2lzb2lyMTQ4JzoKCQkJY2FzZSAnaXNvODg1OTkxOTg5JzoKCQkJY2FzZSAnbDUnOgoJCQljYXNlICdsYXRpbjUnOgoJCQljYXNlICd3aW5kb3dzMTI1NCc6CgkJCQlyZXR1cm4gJ1dpbmRvd3MtMTI1NCc7CgoJCQljYXNlICd3aW5kb3dzMTI1NCc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1NCc7CgoJCQljYXNlICd3aW5kb3dzMTI1NSc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1NSc7CgoJCQljYXNlICd3aW5kb3dzMTI1Nic6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1Nic7CgoJCQljYXNlICd3aW5kb3dzMTI1Nyc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1Nyc7CgoJCQljYXNlICd3aW5kb3dzMTI1OCc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1OCc7CgoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuICRjaGFyc2V0OwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY3VybF92ZXJzaW9uKCkKCXsKCQlpZiAoaXNfYXJyYXkoJGN1cmwgPSBjdXJsX3ZlcnNpb24oKSkpCgkJewoJCQkkY3VybCA9ICRjdXJsWyd2ZXJzaW9uJ107CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCRjdXJsLCAwLCA1KSA9PSAnY3VybC8nKQoJCXsKCQkJJGN1cmwgPSBzdWJzdHIoJGN1cmwsIDUsIHN0cmNzcG4oJGN1cmwsICJceDA5XHgwQVx4MEJceDBDXHgwRCIsIDUpKTsKCQl9CgkJZWxzZWlmIChzdWJzdHIoJGN1cmwsIDAsIDgpID09ICdsaWJjdXJsLycpCgkJewoJCQkkY3VybCA9IHN1YnN0cigkY3VybCwgOCwgc3RyY3NwbigkY3VybCwgIlx4MDlceDBBXHgwQlx4MENceDBEIiwgOCkpOwoJCX0KCQllbHNlCgkJewoJCQkkY3VybCA9IDA7CgkJfQoJCXJldHVybiAkY3VybDsKCX0KCglmdW5jdGlvbiBpc19zdWJjbGFzc19vZigkY2xhc3MxLCAkY2xhc3MyKQoJewoJCWlmIChmdW5jX251bV9hcmdzKCkgIT0gMikKCQl7CgkJCXRyaWdnZXJfZXJyb3IoJ1dyb25nIHBhcmFtZXRlciBjb3VudCBmb3IgU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCknLCBFX1VTRVJfV0FSTklORyk7CgkJfQoJCWVsc2VpZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4wLjMnLCAnPj0nKSB8fCBpc19vYmplY3QoJGNsYXNzMSkpCgkJewoJCQlyZXR1cm4gaXNfc3ViY2xhc3Nfb2YoJGNsYXNzMSwgJGNsYXNzMik7CgkJfQoJCWVsc2VpZiAoaXNfc3RyaW5nKCRjbGFzczEpICYmIGlzX3N0cmluZygkY2xhc3MyKSkKCQl7CgkJCWlmIChjbGFzc19leGlzdHMoJGNsYXNzMSkpCgkJCXsKCQkJCWlmIChjbGFzc19leGlzdHMoJGNsYXNzMikpCgkJCQl7CgkJCQkJJGNsYXNzMiA9IHN0cnRvbG93ZXIoJGNsYXNzMik7CgkJCQkJd2hpbGUgKCRjbGFzczEgPSBzdHJ0b2xvd2VyKGdldF9wYXJlbnRfY2xhc3MoJGNsYXNzMSkpKQoJCQkJCXsKCQkJCQkJaWYgKCRjbGFzczEgPT0gJGNsYXNzMikKCQkJCQkJewoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl0cmlnZ2VyX2Vycm9yKCdVbmtub3duIGNsYXNzIHBhc3NlZCBhcyBwYXJhbWV0ZXInLCBFX1VTRVJfV0FSTk5HKTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBTdHJpcCBIVE1MIGNvbW1lbnRzCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgRGF0YSB0byBzdHJpcCBjb21tZW50cyBmcm9tCgkgKiBAcmV0dXJuIHN0cmluZyBDb21tZW50IHN0cmlwcGVkIHN0cmluZwoJICovCglmdW5jdGlvbiBzdHJpcF9jb21tZW50cygkZGF0YSkKCXsKCQkkb3V0cHV0ID0gJyc7CgkJd2hpbGUgKCgkc3RhcnQgPSBzdHJwb3MoJGRhdGEsICc8IS0tJykpICE9PSBmYWxzZSkKCQl7CgkJCSRvdXRwdXQgLj0gc3Vic3RyKCRkYXRhLCAwLCAkc3RhcnQpOwoJCQlpZiAoKCRlbmQgPSBzdHJwb3MoJGRhdGEsICctLT4nLCAkc3RhcnQpKSAhPT0gZmFsc2UpCgkJCXsKCQkJCSRkYXRhID0gc3Vic3RyX3JlcGxhY2UoJGRhdGEsICcnLCAwLCAkZW5kICsgMyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZGF0YSA9ICcnOwoJCQl9CgkJfQoJCXJldHVybiAkb3V0cHV0IC4gJGRhdGE7Cgl9CgoJZnVuY3Rpb24gcGFyc2VfZGF0ZSgkZHQpCgl7CgkJJHBhcnNlciA9IFNpbXBsZVBpZV9QYXJzZV9EYXRlOjpnZXQoKTsKCQlyZXR1cm4gJHBhcnNlci0+cGFyc2UoJGR0KTsKCX0KCgkvKioKCSAqIERlY29kZSBIVE1MIGVudGl0aWVzCgkgKgoJICogQHN0YXRpYwoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgSW5wdXQgZGF0YQoJICogQHJldHVybiBzdHJpbmcgT3V0cHV0IGRhdGEKCSAqLwoJZnVuY3Rpb24gZW50aXRpZXNfZGVjb2RlKCRkYXRhKQoJewoJCSRkZWNvZGVyID0gbmV3IFNpbXBsZVBpZV9EZWNvZGVfSFRNTF9FbnRpdGllcygkZGF0YSk7CgkJcmV0dXJuICRkZWNvZGVyLT5wYXJzZSgpOwoJfQoKCS8qKgoJICogUmVtb3ZlIFJGQzgyMiBjb21tZW50cwoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIERhdGEgdG8gc3RyaXAgY29tbWVudHMgZnJvbQoJICogQHJldHVybiBzdHJpbmcgQ29tbWVudCBzdHJpcHBlZCBzdHJpbmcKCSAqLwoJZnVuY3Rpb24gdW5jb21tZW50X3JmYzgyMigkc3RyaW5nKQoJewoJCSRzdHJpbmcgPSAoc3RyaW5nKSAkc3RyaW5nOwoJCSRwb3NpdGlvbiA9IDA7CgkJJGxlbmd0aCA9IHN0cmxlbigkc3RyaW5nKTsKCQkkZGVwdGggPSAwOwoKCQkkb3V0cHV0ID0gJyc7CgoJCXdoaWxlICgkcG9zaXRpb24gPCAkbGVuZ3RoICYmICgkcG9zID0gc3RycG9zKCRzdHJpbmcsICcoJywgJHBvc2l0aW9uKSkgIT09IGZhbHNlKQoJCXsKCQkJJG91dHB1dCAuPSBzdWJzdHIoJHN0cmluZywgJHBvc2l0aW9uLCAkcG9zIC0gJHBvc2l0aW9uKTsKCQkJJHBvc2l0aW9uID0gJHBvcyArIDE7CgkJCWlmICgkc3RyaW5nWyRwb3MgLSAxXSAhPT0gJ1xcJykKCQkJewoJCQkJJGRlcHRoKys7CgkJCQl3aGlsZSAoJGRlcHRoICYmICRwb3NpdGlvbiA8ICRsZW5ndGgpCgkJCQl7CgkJCQkJJHBvc2l0aW9uICs9IHN0cmNzcG4oJHN0cmluZywgJygpJywgJHBvc2l0aW9uKTsKCQkJCQlpZiAoJHN0cmluZ1skcG9zaXRpb24gLSAxXSA9PT0gJ1xcJykKCQkJCQl7CgkJCQkJCSRwb3NpdGlvbisrOwoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJZWxzZWlmIChpc3NldCgkc3RyaW5nWyRwb3NpdGlvbl0pKQoJCQkJCXsKCQkJCQkJc3dpdGNoICgkc3RyaW5nWyRwb3NpdGlvbl0pCgkJCQkJCXsKCQkJCQkJCWNhc2UgJygnOgoJCQkJCQkJCSRkZXB0aCsrOwoJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCWNhc2UgJyknOgoJCQkJCQkJCSRkZXB0aC0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCSRwb3NpdGlvbisrOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkb3V0cHV0IC49ICcoJzsKCQkJfQoJCX0KCQkkb3V0cHV0IC49IHN1YnN0cigkc3RyaW5nLCAkcG9zaXRpb24pOwoKCQlyZXR1cm4gJG91dHB1dDsKCX0KCglmdW5jdGlvbiBwYXJzZV9taW1lKCRtaW1lKQoJewoJCWlmICgoJHBvcyA9IHN0cnBvcygkbWltZSwgJzsnKSkgPT09IGZhbHNlKQoJCXsKCQkJcmV0dXJuIHRyaW0oJG1pbWUpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gdHJpbShzdWJzdHIoJG1pbWUsIDAsICRwb3MpKTsKCQl9Cgl9CgoJZnVuY3Rpb24gaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUoJHN0cmluZywgJHF1b3RlX3N0eWxlKQoJewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2h0bWxzcGVjaWFsY2hhcnNfZGVjb2RlJykpCgkJewoJCQlyZXR1cm4gaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUoJHN0cmluZywgJHF1b3RlX3N0eWxlKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIHN0cnRyKCRzdHJpbmcsIGFycmF5X2ZsaXAoZ2V0X2h0bWxfdHJhbnNsYXRpb25fdGFibGUoSFRNTF9TUEVDSUFMQ0hBUlMsICRxdW90ZV9zdHlsZSkpKTsKCQl9Cgl9CgoJZnVuY3Rpb24gYXRvbV8wM19jb25zdHJ1Y3RfdHlwZSgkYXR0cmlicykKCXsKCQlpZiAoaXNzZXQoJGF0dHJpYnNbJyddWydtb2RlJ10pICYmIHN0cnRvbG93ZXIodHJpbSgkYXR0cmlic1snJ11bJ21vZGUnXSkgPT0gJ2Jhc2U2NCcpKQoJCXsKCQkJJG1vZGUgPSBTSU1QTEVQSUVfQ09OU1RSVUNUX0JBU0U2NDsKCQl9CgkJZWxzZQoJCXsKCQkJJG1vZGUgPSBTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkU7CgkJfQoJCWlmIChpc3NldCgkYXR0cmlic1snJ11bJ3R5cGUnXSkpCgkJewoJCQlzd2l0Y2ggKHN0cnRvbG93ZXIodHJpbSgkYXR0cmlic1snJ11bJ3R5cGUnXSkpKQoJCQl7CgkJCQljYXNlICd0ZXh0JzoKCQkJCWNhc2UgJ3RleHQvcGxhaW4nOgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQgfCAkbW9kZTsKCgkJCQljYXNlICdodG1sJzoKCQkJCWNhc2UgJ3RleHQvaHRtbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCB8ICRtb2RlOwoKCQkJCWNhc2UgJ3hodG1sJzoKCQkJCWNhc2UgJ2FwcGxpY2F0aW9uL3hodG1sK3htbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfWEhUTUwgfCAkbW9kZTsKCgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkUgfCAkbW9kZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9URVhUIHwgJG1vZGU7CgkJfQoJfQoKCWZ1bmN0aW9uIGF0b21fMTBfY29uc3RydWN0X3R5cGUoJGF0dHJpYnMpCgl7CgkJaWYgKGlzc2V0KCRhdHRyaWJzWycnXVsndHlwZSddKSkKCQl7CgkJCXN3aXRjaCAoc3RydG9sb3dlcih0cmltKCRhdHRyaWJzWycnXVsndHlwZSddKSkpCgkJCXsKCQkJCWNhc2UgJ3RleHQnOgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQ7CgoJCQkJY2FzZSAnaHRtbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTDsKCgkJCQljYXNlICd4aHRtbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfWEhUTUw7CgoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9OT05FOwoJCQl9CgkJfQoJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQ7Cgl9CgoJZnVuY3Rpb24gYXRvbV8xMF9jb250ZW50X2NvbnN0cnVjdF90eXBlKCRhdHRyaWJzKQoJewoJCWlmIChpc3NldCgkYXR0cmlic1snJ11bJ3R5cGUnXSkpCgkJewoJCQkkdHlwZSA9IHN0cnRvbG93ZXIodHJpbSgkYXR0cmlic1snJ11bJ3R5cGUnXSkpOwoJCQlzd2l0Y2ggKCR0eXBlKQoJCQl7CgkJCQljYXNlICd0ZXh0JzoKCQkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9URVhUOwoKCQkJCWNhc2UgJ2h0bWwnOgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUw7CgoJCQkJY2FzZSAneGh0bWwnOgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX1hIVE1MOwoJCQl9CgkJCWlmIChpbl9hcnJheShzdWJzdHIoJHR5cGUsIC00KSwgYXJyYXkoJyt4bWwnLCAnL3htbCcpKSB8fCBzdWJzdHIoJHR5cGUsIDAsIDUpID09ICd0ZXh0LycpCgkJCXsKCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9CQVNFNjQ7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVDsKCQl9Cgl9CgoJZnVuY3Rpb24gaXNfaXNlZ21lbnRfbnpfbmMoJHN0cmluZykKCXsKCQlyZXR1cm4gKGJvb2wpIHByZWdfbWF0Y2goJy9eKFtBLVphLXowLTlcLS5fflx4e0EwfS1ceHtEN0ZGfVx4e0Y5MDB9LVx4e0ZEQ0Z9XHh7RkRGMH0tXHh7RkZFRn1ceHsxMDAwMH0tXHh7MUZGRkR9XHh7MjAwMDB9LVx4ezJGRkZEfVx4ezMwMDAwfS1ceHszRkZGRH1ceHs0MDAwMH0tXHh7NEZGRkR9XHh7NTAwMDB9LVx4ezVGRkZEfVx4ezYwMDAwfS1ceHs2RkZGRH1ceHs3MDAwMH0tXHh7N0ZGRkR9XHh7ODAwMDB9LVx4ezhGRkZEfVx4ezkwMDAwfS1ceHs5RkZGRH1ceHtBMDAwMH0tXHh7QUZGRkR9XHh7QjAwMDB9LVx4e0JGRkZEfVx4e0MwMDAwfS1ceHtDRkZGRH1ceHtEMDAwMH0tXHh7REZGRkR9XHh7RTEwMDB9LVx4e0VGRkZEfSEkJlwnKCkqKyw7PUBdfCglWzAtOUFCQ0RFRl17Mn0pKSskL3UnLCAkc3RyaW5nKTsKCX0KCglmdW5jdGlvbiBzcGFjZV9zZXBlcmF0ZWRfdG9rZW5zKCRzdHJpbmcpCgl7CgkJJHNwYWNlX2NoYXJhY3RlcnMgPSAiXHgyMFx4MDlceDBBXHgwQlx4MENceDBEIjsKCQkkc3RyaW5nX2xlbmd0aCA9IHN0cmxlbigkc3RyaW5nKTsKCgkJJHBvc2l0aW9uID0gc3Ryc3BuKCRzdHJpbmcsICRzcGFjZV9jaGFyYWN0ZXJzKTsKCQkkdG9rZW5zID0gYXJyYXkoKTsKCgkJd2hpbGUgKCRwb3NpdGlvbiA8ICRzdHJpbmdfbGVuZ3RoKQoJCXsKCQkJJGxlbiA9IHN0cmNzcG4oJHN0cmluZywgJHNwYWNlX2NoYXJhY3RlcnMsICRwb3NpdGlvbik7CgkJCSR0b2tlbnNbXSA9IHN1YnN0cigkc3RyaW5nLCAkcG9zaXRpb24sICRsZW4pOwoJCQkkcG9zaXRpb24gKz0gJGxlbjsKCQkJJHBvc2l0aW9uICs9IHN0cnNwbigkc3RyaW5nLCAkc3BhY2VfY2hhcmFjdGVycywgJHBvc2l0aW9uKTsKCQl9CgoJCXJldHVybiAkdG9rZW5zOwoJfQoKCWZ1bmN0aW9uIGFycmF5X3VuaXF1ZSgkYXJyYXkpCgl7CgkJaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMicsICc+PScpKQoJCXsKCQkJcmV0dXJuIGFycmF5X3VuaXF1ZSgkYXJyYXkpOwoJCX0KCQllbHNlCgkJewoJCQkkYXJyYXkgPSAoYXJyYXkpICRhcnJheTsKCQkJJG5ld19hcnJheSA9IGFycmF5KCk7CgkJCSRuZXdfYXJyYXlfc3RyaW5ncyA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkKCQkJewoJCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKQoJCQkJewoJCQkJCWlmIChtZXRob2RfZXhpc3RzKCR2YWx1ZSwgJ19fdG9TdHJpbmcnKSkKCQkJCQl7CgkJCQkJCSRjbXAgPSAkdmFsdWUtPl9fdG9TdHJpbmcoKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJdHJpZ2dlcl9lcnJvcignT2JqZWN0IG9mIGNsYXNzICcgLiBnZXRfY2xhc3MoJHZhbHVlKSAuICcgY291bGQgbm90IGJlIGNvbnZlcnRlZCB0byBzdHJpbmcnLCBFX1VTRVJfRVJST1IpOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2VpZiAoaXNfYXJyYXkoJHZhbHVlKSkKCQkJCXsKCQkJCQkkY21wID0gKHN0cmluZykgcmVzZXQoJHZhbHVlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkY21wID0gKHN0cmluZykgJHZhbHVlOwoJCQkJfQoJCQkJaWYgKCFpbl9hcnJheSgkY21wLCAkbmV3X2FycmF5X3N0cmluZ3MpKQoJCQkJewoJCQkJCSRuZXdfYXJyYXlbJGtleV0gPSAkdmFsdWU7CgkJCQkJJG5ld19hcnJheV9zdHJpbmdzW10gPSAkY21wOwoJCQkJfQoJCQl9CgkJCXJldHVybiAkbmV3X2FycmF5OwoJCX0KCX0KCgkvKioKCSAqIENvbnZlcnRzIGEgdW5pY29kZSBjb2RlcG9pbnQgdG8gYSBVVEYtOCBjaGFyYWN0ZXIKCSAqCgkgKiBAc3RhdGljCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludCAkY29kZXBvaW50IFVuaWNvZGUgY29kZXBvaW50CgkgKiBAcmV0dXJuIHN0cmluZyBVVEYtOCBjaGFyYWN0ZXIKCSAqLwoJZnVuY3Rpb24gY29kZXBvaW50X3RvX3V0ZjgoJGNvZGVwb2ludCkKCXsKCQlzdGF0aWMgJGNhY2hlID0gYXJyYXkoKTsKCQkkY29kZXBvaW50ID0gKGludCkgJGNvZGVwb2ludDsKCQlpZiAoaXNzZXQoJGNhY2hlWyRjb2RlcG9pbnRdKSkKCQl7CgkJCXJldHVybiAkY2FjaGVbJGNvZGVwb2ludF07CgkJfQoJCWVsc2VpZiAoJGNvZGVwb2ludCA8IDApCgkJewoJCQlyZXR1cm4gJGNhY2hlWyRjb2RlcG9pbnRdID0gZmFsc2U7CgkJfQoJCWVsc2UgaWYgKCRjb2RlcG9pbnQgPD0gMHg3ZikKCQl7CgkJCXJldHVybiAkY2FjaGVbJGNvZGVwb2ludF0gPSBjaHIoJGNvZGVwb2ludCk7CgkJfQoJCWVsc2UgaWYgKCRjb2RlcG9pbnQgPD0gMHg3ZmYpCgkJewoJCQlyZXR1cm4gJGNhY2hlWyRjb2RlcG9pbnRdID0gY2hyKDB4YzAgfCAoJGNvZGVwb2ludCA+PiA2KSkgLiBjaHIoMHg4MCB8ICgkY29kZXBvaW50ICYgMHgzZikpOwoJCX0KCQllbHNlIGlmICgkY29kZXBvaW50IDw9IDB4ZmZmZikKCQl7CgkJCXJldHVybiAkY2FjaGVbJGNvZGVwb2ludF0gPSBjaHIoMHhlMCB8ICgkY29kZXBvaW50ID4+IDEyKSkgLiBjaHIoMHg4MCB8ICgoJGNvZGVwb2ludCA+PiA2KSAmIDB4M2YpKSAuIGNocigweDgwIHwgKCRjb2RlcG9pbnQgJiAweDNmKSk7CgkJfQoJCWVsc2UgaWYgKCRjb2RlcG9pbnQgPD0gMHgxMGZmZmYpCgkJewoJCQlyZXR1cm4gJGNhY2hlWyRjb2RlcG9pbnRdID0gY2hyKDB4ZjAgfCAoJGNvZGVwb2ludCA+PiAxOCkpIC4gY2hyKDB4ODAgfCAoKCRjb2RlcG9pbnQgPj4gMTIpICYgMHgzZikpIC4gY2hyKDB4ODAgfCAoKCRjb2RlcG9pbnQgPj4gNikgJiAweDNmKSkgLiBjaHIoMHg4MCB8ICgkY29kZXBvaW50ICYgMHgzZikpOwoJCX0KCQllbHNlCgkJewoJCQkvLyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSCgkJCXJldHVybiAkY2FjaGVbJGNvZGVwb2ludF0gPSAiXHhFRlx4QkZceEJEIjsKCQl9Cgl9CgoJLyoqCgkgKiBSZS1pbXBsZW1lbnRhdGlvbiBvZiBQSFAgNSdzIHN0cmlwb3MoKQoJICoKCSAqIFJldHVybnMgdGhlIG51bWVyaWMgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgbmVlZGxlIGluIHRoZQoJICogaGF5c3RhY2sgc3RyaW5nLgoJICoKCSAqIEBzdGF0aWMKCSAqIEBhY2Nlc3Mgc3RyaW5nCgkgKiBAcGFyYW0gb2JqZWN0ICRoYXlzdGFjawoJICogQHBhcmFtIHN0cmluZyAkbmVlZGxlIE5vdGUgdGhhdCB0aGUgbmVlZGxlIG1heSBiZSBhIHN0cmluZyBvZiBvbmUgb3IgbW9yZQoJICogICAgIGNoYXJhY3RlcnMuIElmIG5lZWRsZSBpcyBub3QgYSBzdHJpbmcsIGl0IGlzIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyCgkgKiAgICAgYW5kIGFwcGxpZWQgYXMgdGhlIG9yZGluYWwgdmFsdWUgb2YgYSBjaGFyYWN0ZXIuCgkgKiBAcGFyYW0gaW50ICRvZmZzZXQgVGhlIG9wdGlvbmFsIG9mZnNldCBwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoaWNoCgkgKiAgICAgY2hhcmFjdGVyIGluIGhheXN0YWNrIHRvIHN0YXJ0IHNlYXJjaGluZy4gVGhlIHBvc2l0aW9uIHJldHVybmVkIGlzIHN0aWxsCgkgKiAgICAgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBoYXlzdGFjay4KCSAqIEByZXR1cm4gYm9vbCBJZiBuZWVkbGUgaXMgbm90IGZvdW5kLCBzdHJpcG9zKCkgd2lsbCByZXR1cm4gYm9vbGVhbiBmYWxzZS4KCSAqLwoJZnVuY3Rpb24gc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwKQoJewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ3N0cmlwb3MnKSkKCQl7CgkJCXJldHVybiBzdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmIChpc19zdHJpbmcoJG5lZWRsZSkpCgkJCXsKCQkJCSRuZWVkbGUgPSBzdHJ0b2xvd2VyKCRuZWVkbGUpOwoJCQl9CgkJCWVsc2VpZiAoaXNfaW50KCRuZWVkbGUpIHx8IGlzX2Jvb2woJG5lZWRsZSkgfHwgaXNfZG91YmxlKCRuZWVkbGUpKQoJCQl7CgkJCQkkbmVlZGxlID0gc3RydG9sb3dlcihjaHIoJG5lZWRsZSkpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJdHJpZ2dlcl9lcnJvcignbmVlZGxlIGlzIG5vdCBhIHN0cmluZyBvciBhbiBpbnRlZ2VyJywgRV9VU0VSX1dBUk5JTkcpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQlyZXR1cm4gc3RycG9zKHN0cnRvbG93ZXIoJGhheXN0YWNrKSwgJG5lZWRsZSwgJG9mZnNldCk7CgkJfQoJfQoKCS8qKgoJICogU2ltaWxhciB0byBwYXJzZV9zdHIoKQoJICoKCSAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgb2YgbmFtZS92YWx1ZSBwYWlycywgd2hlcmUgdGhlIHZhbHVlIGlzIGFuCgkgKiBhcnJheSBvZiB2YWx1ZXMgdGhhdCBoYXZlIHVzZWQgdGhlIHNhbWUgbmFtZQoJICoKCSAqIEBzdGF0aWMKCSAqIEBhY2Nlc3Mgc3RyaW5nCgkgKiBAcGFyYW0gc3RyaW5nICRzdHIgVGhlIGlucHV0IHN0cmluZy4KCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJZnVuY3Rpb24gcGFyc2Vfc3RyKCRzdHIpCgl7CgkJJHJldHVybiA9IGFycmF5KCk7CgkJJHN0ciA9IGV4cGxvZGUoJyYnLCAkc3RyKTsKCgkJZm9yZWFjaCAoJHN0ciBhcyAkc2VjdGlvbikKCQl7CgkJCWlmIChzdHJwb3MoJHNlY3Rpb24sICc9JykgIT09IGZhbHNlKQoJCQl7CgkJCQlsaXN0KCRuYW1lLCAkdmFsdWUpID0gZXhwbG9kZSgnPScsICRzZWN0aW9uLCAyKTsKCQkJCSRyZXR1cm5bdXJsZGVjb2RlKCRuYW1lKV1bXSA9IHVybGRlY29kZSgkdmFsdWUpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHJldHVyblt1cmxkZWNvZGUoJHNlY3Rpb24pXVtdID0gbnVsbDsKCQkJfQoJCX0KCgkJcmV0dXJuICRyZXR1cm47Cgl9CgoJLyoqCgkgKiBEZXRlY3QgWE1MIGVuY29kaW5nLCBhcyBwZXIgWE1MIDEuMCBBcHBlbmRpeCBGLjEKCSAqCgkgKiBAdG9kbyBBZGQgc3VwcG9ydCBmb3IgRUJDRElDCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIFhNTCBkYXRhCgkgKiBAcmV0dXJuIGFycmF5IFBvc3NpYmxlIGVuY29kaW5ncwoJICovCglmdW5jdGlvbiB4bWxfZW5jb2RpbmcoJGRhdGEpCgl7CgkJLy8gVVRGLTMyIEJpZyBFbmRpYW4gQk9NCgkJaWYgKHN1YnN0cigkZGF0YSwgMCwgNCkgPT09ICJceDAwXHgwMFx4RkVceEZGIikKCQl7CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0zMkJFJzsKCQl9CgkJLy8gVVRGLTMyIExpdHRsZSBFbmRpYW4gQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDQpID09PSAiXHhGRlx4RkVceDAwXHgwMCIpCgkJewoJCQkkZW5jb2RpbmdbXSA9ICdVVEYtMzJMRSc7CgkJfQoJCS8vIFVURi0xNiBCaWcgRW5kaWFuIEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCAyKSA9PT0gIlx4RkVceEZGIikKCQl7CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0xNkJFJzsKCQl9CgkJLy8gVVRGLTE2IExpdHRsZSBFbmRpYW4gQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDIpID09PSAiXHhGRlx4RkUiKQoJCXsKCQkJJGVuY29kaW5nW10gPSAnVVRGLTE2TEUnOwoJCX0KCQkvLyBVVEYtOCBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMykgPT09ICJceEVGXHhCQlx4QkYiKQoJCXsKCQkJJGVuY29kaW5nW10gPSAnVVRGLTgnOwoJCX0KCQkvLyBVVEYtMzIgQmlnIEVuZGlhbiBXaXRob3V0IEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCAyMCkgPT09ICJceDAwXHgwMFx4MDBceDNDXHgwMFx4MDBceDAwXHgzRlx4MDBceDAwXHgwMFx4NzhceDAwXHgwMFx4MDBceDZEXHgwMFx4MDBceDAwXHg2QyIpCgkJewoJCQlpZiAoJHBvcyA9IHN0cnBvcygkZGF0YSwgIlx4MDBceDAwXHgwMFx4M0ZceDAwXHgwMFx4MDBceDNFIikpCgkJCXsKCQkJCSRwYXJzZXIgPSBuZXcgU2ltcGxlUGllX1hNTF9EZWNsYXJhdGlvbl9QYXJzZXIoU2ltcGxlUGllX01pc2M6OmNoYW5nZV9lbmNvZGluZyhzdWJzdHIoJGRhdGEsIDIwLCAkcG9zIC0gMjApLCAnVVRGLTMyQkUnLCAnVVRGLTgnKSk7CgkJCQlpZiAoJHBhcnNlci0+cGFyc2UoKSkKCQkJCXsKCQkJCQkkZW5jb2RpbmdbXSA9ICRwYXJzZXItPmVuY29kaW5nOwoJCQkJfQoJCQl9CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0zMkJFJzsKCQl9CgkJLy8gVVRGLTMyIExpdHRsZSBFbmRpYW4gV2l0aG91dCBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMjApID09PSAiXHgzQ1x4MDBceDAwXHgwMFx4M0ZceDAwXHgwMFx4MDBceDc4XHgwMFx4MDBceDAwXHg2RFx4MDBceDAwXHgwMFx4NkNceDAwXHgwMFx4MDAiKQoJCXsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJGRhdGEsICJceDNGXHgwMFx4MDBceDAwXHgzRVx4MDBceDAwXHgwMCIpKQoJCQl7CgkJCQkkcGFyc2VyID0gbmV3IFNpbXBsZVBpZV9YTUxfRGVjbGFyYXRpb25fUGFyc2VyKFNpbXBsZVBpZV9NaXNjOjpjaGFuZ2VfZW5jb2Rpbmcoc3Vic3RyKCRkYXRhLCAyMCwgJHBvcyAtIDIwKSwgJ1VURi0zMkxFJywgJ1VURi04JykpOwoJCQkJaWYgKCRwYXJzZXItPnBhcnNlKCkpCgkJCQl7CgkJCQkJJGVuY29kaW5nW10gPSAkcGFyc2VyLT5lbmNvZGluZzsKCQkJCX0KCQkJfQoJCQkkZW5jb2RpbmdbXSA9ICdVVEYtMzJMRSc7CgkJfQoJCS8vIFVURi0xNiBCaWcgRW5kaWFuIFdpdGhvdXQgQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDEwKSA9PT0gIlx4MDBceDNDXHgwMFx4M0ZceDAwXHg3OFx4MDBceDZEXHgwMFx4NkMiKQoJCXsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJGRhdGEsICJceDAwXHgzRlx4MDBceDNFIikpCgkJCXsKCQkJCSRwYXJzZXIgPSBuZXcgU2ltcGxlUGllX1hNTF9EZWNsYXJhdGlvbl9QYXJzZXIoU2ltcGxlUGllX01pc2M6OmNoYW5nZV9lbmNvZGluZyhzdWJzdHIoJGRhdGEsIDIwLCAkcG9zIC0gMTApLCAnVVRGLTE2QkUnLCAnVVRGLTgnKSk7CgkJCQlpZiAoJHBhcnNlci0+cGFyc2UoKSkKCQkJCXsKCQkJCQkkZW5jb2RpbmdbXSA9ICRwYXJzZXItPmVuY29kaW5nOwoJCQkJfQoJCQl9CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0xNkJFJzsKCQl9CgkJLy8gVVRGLTE2IExpdHRsZSBFbmRpYW4gV2l0aG91dCBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMTApID09PSAiXHgzQ1x4MDBceDNGXHgwMFx4NzhceDAwXHg2RFx4MDBceDZDXHgwMCIpCgkJewoJCQlpZiAoJHBvcyA9IHN0cnBvcygkZGF0YSwgIlx4M0ZceDAwXHgzRVx4MDAiKSkKCQkJewoJCQkJJHBhcnNlciA9IG5ldyBTaW1wbGVQaWVfWE1MX0RlY2xhcmF0aW9uX1BhcnNlcihTaW1wbGVQaWVfTWlzYzo6Y2hhbmdlX2VuY29kaW5nKHN1YnN0cigkZGF0YSwgMjAsICRwb3MgLSAxMCksICdVVEYtMTZMRScsICdVVEYtOCcpKTsKCQkJCWlmICgkcGFyc2VyLT5wYXJzZSgpKQoJCQkJewoJCQkJCSRlbmNvZGluZ1tdID0gJHBhcnNlci0+ZW5jb2Rpbmc7CgkJCQl9CgkJCX0KCQkJJGVuY29kaW5nW10gPSAnVVRGLTE2TEUnOwoJCX0KCQkvLyBVUy1BU0NJSSAob3Igc3VwZXJzZXQpCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDUpID09PSAiXHgzQ1x4M0ZceDc4XHg2RFx4NkMiKQoJCXsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJGRhdGEsICJceDNGXHgzRSIpKQoJCQl7CgkJCQkkcGFyc2VyID0gbmV3IFNpbXBsZVBpZV9YTUxfRGVjbGFyYXRpb25fUGFyc2VyKHN1YnN0cigkZGF0YSwgNSwgJHBvcyAtIDUpKTsKCQkJCWlmICgkcGFyc2VyLT5wYXJzZSgpKQoJCQkJewoJCQkJCSRlbmNvZGluZ1tdID0gJHBhcnNlci0+ZW5jb2Rpbmc7CgkJCQl9CgkJCX0KCQkJJGVuY29kaW5nW10gPSAnVVRGLTgnOwoJCX0KCQkvLyBGYWxsYmFjayB0byBVVEYtOAoJCWVsc2UKCQl7CgkJCSRlbmNvZGluZ1tdID0gJ1VURi04JzsKCQl9CgkJcmV0dXJuICRlbmNvZGluZzsKCX0KfQoKLyoqCiAqIERlY29kZSBIVE1MIEVudGl0aWVzCiAqCiAqIFRoaXMgaW1wbGVtZW50cyBIVE1MNSBhcyBvZiByZXZpc2lvbiA5NjcgKDIwMDctMDYtMjgpCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKi8KY2xhc3MgU2ltcGxlUGllX0RlY29kZV9IVE1MX0VudGl0aWVzCnsKCS8qKgoJICogRGF0YSB0byBiZSBwYXJzZWQKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZGF0YSA9ICcnOwoKCS8qKgoJICogQ3VycmVudGx5IGNvbnN1bWVkIGJ5dGVzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGNvbnN1bWVkID0gJyc7CgoJLyoqCgkgKiBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBieXRlIGJlaW5nIHBhcnNlZAoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBpbnQKCSAqLwoJdmFyICRwb3NpdGlvbiA9IDA7CgoJLyoqCgkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIGlucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkZGF0YSBJbnB1dCBkYXRhCgkgKi8KCWZ1bmN0aW9uIFNpbXBsZVBpZV9EZWNvZGVfSFRNTF9FbnRpdGllcygkZGF0YSkKCXsKCQkkdGhpcy0+ZGF0YSA9ICRkYXRhOwoJfQoKCS8qKgoJICogUGFyc2UgdGhlIGlucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHJldHVybiBzdHJpbmcgT3V0cHV0IGRhdGEKCSAqLwoJZnVuY3Rpb24gcGFyc2UoKQoJewoJCXdoaWxlICgoJHRoaXMtPnBvc2l0aW9uID0gc3RycG9zKCR0aGlzLT5kYXRhLCAnJicsICR0aGlzLT5wb3NpdGlvbikpICE9PSBmYWxzZSkKCQl7CgkJCSR0aGlzLT5jb25zdW1lKCk7CgkJCSR0aGlzLT5lbnRpdHkoKTsKCQkJJHRoaXMtPmNvbnN1bWVkID0gJyc7CgkJfQoJCXJldHVybiAkdGhpcy0+ZGF0YTsKCX0KCgkvKioKCSAqIENvbnN1bWUgdGhlIG5leHQgYnl0ZQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHJldHVybiBtaXhlZCBUaGUgbmV4dCBieXRlLCBvciBmYWxzZSwgaWYgdGhlcmUgaXMgbm8gbW9yZSBkYXRhCgkgKi8KCWZ1bmN0aW9uIGNvbnN1bWUoKQoJewoJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dKSkKCQl7CgkJCSR0aGlzLT5jb25zdW1lZCAuPSAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dOwoJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uKytdOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+Y29uc3VtZWQgPSBmYWxzZTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIENvbnN1bWUgYSByYW5nZSBvZiBjaGFyYWN0ZXJzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcGFyYW0gc3RyaW5nICRjaGFycyBDaGFyYWN0ZXJzIHRvIGNvbnN1bWUKCSAqIEByZXR1cm4gbWl4ZWQgQSBzZXJpZXMgb2YgY2hhcmFjdGVycyB0aGF0IG1hdGNoIHRoZSByYW5nZSwgb3IgZmFsc2UKCSAqLwoJZnVuY3Rpb24gY29uc3VtZV9yYW5nZSgkY2hhcnMpCgl7CgkJaWYgKCRsZW4gPSBzdHJzcG4oJHRoaXMtPmRhdGEsICRjaGFycywgJHRoaXMtPnBvc2l0aW9uKSkKCQl7CgkJCSRkYXRhID0gc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sICRsZW4pOwoJCQkkdGhpcy0+Y29uc3VtZWQgLj0gJGRhdGE7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuOwoJCQlyZXR1cm4gJGRhdGE7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5jb25zdW1lZCA9IGZhbHNlOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCS8qKgoJICogVW5jb25zdW1lIG9uZSBieXRlCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHVuY29uc3VtZSgpCgl7CgkJJHRoaXMtPmNvbnN1bWVkID0gc3Vic3RyKCR0aGlzLT5jb25zdW1lZCwgMCwgLTEpOwoJCSR0aGlzLT5wb3NpdGlvbi0tOwoJfQoKCS8qKgoJICogRGVjb2RlIGFuIGVudGl0eQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBlbnRpdHkoKQoJewoJCXN3aXRjaCAoJHRoaXMtPmNvbnN1bWUoKSkKCQl7CgkJCWNhc2UgIlx4MDkiOgoJCQljYXNlICJceDBBIjoKCQkJY2FzZSAiXHgwQiI6CgkJCWNhc2UgIlx4MEIiOgoJCQljYXNlICJceDBDIjoKCQkJY2FzZSAiXHgyMCI6CgkJCWNhc2UgIlx4M0MiOgoJCQljYXNlICJceDI2IjoKCQkJY2FzZSBmYWxzZToKCQkJCWJyZWFrOwoKCQkJY2FzZSAiXHgyMyI6CgkJCQlzd2l0Y2ggKCR0aGlzLT5jb25zdW1lKCkpCgkJCQl7CgkJCQkJY2FzZSAiXHg3OCI6CgkJCQkJY2FzZSAiXHg1OCI6CgkJCQkJCSRyYW5nZSA9ICcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJzsKCQkJCQkJJGhleCA9IHRydWU7CgkJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0OgoJCQkJCQkkcmFuZ2UgPSAnMDEyMzQ1Njc4OSc7CgkJCQkJCSRoZXggPSBmYWxzZTsKCQkJCQkJJHRoaXMtPnVuY29uc3VtZSgpOwoJCQkJCQlicmVhazsKCQkJCX0KCgkJCQlpZiAoJGNvZGVwb2ludCA9ICR0aGlzLT5jb25zdW1lX3JhbmdlKCRyYW5nZSkpCgkJCQl7CgkJCQkJc3RhdGljICR3aW5kb3dzXzEyNTJfc3BlY2lhbHMgPSBhcnJheSgweDBEID0+ICJceDBBIiwgMHg4MCA9PiAiXHhFMlx4ODJceEFDIiwgMHg4MSA9PiAiXHhFRlx4QkZceEJEIiwgMHg4MiA9PiAiXHhFMlx4ODBceDlBIiwgMHg4MyA9PiAiXHhDNlx4OTIiLCAweDg0ID0+ICJceEUyXHg4MFx4OUUiLCAweDg1ID0+ICJceEUyXHg4MFx4QTYiLCAweDg2ID0+ICJceEUyXHg4MFx4QTAiLCAweDg3ID0+ICJceEUyXHg4MFx4QTEiLCAweDg4ID0+ICJceENCXHg4NiIsIDB4ODkgPT4gIlx4RTJceDgwXHhCMCIsIDB4OEEgPT4gIlx4QzVceEEwIiwgMHg4QiA9PiAiXHhFMlx4ODBceEI5IiwgMHg4QyA9PiAiXHhDNVx4OTIiLCAweDhEID0+ICJceEVGXHhCRlx4QkQiLCAweDhFID0+ICJceEM1XHhCRCIsIDB4OEYgPT4gIlx4RUZceEJGXHhCRCIsIDB4OTAgPT4gIlx4RUZceEJGXHhCRCIsIDB4OTEgPT4gIlx4RTJceDgwXHg5OCIsIDB4OTIgPT4gIlx4RTJceDgwXHg5OSIsIDB4OTMgPT4gIlx4RTJceDgwXHg5QyIsIDB4OTQgPT4gIlx4RTJceDgwXHg5RCIsIDB4OTUgPT4gIlx4RTJceDgwXHhBMiIsIDB4OTYgPT4gIlx4RTJceDgwXHg5MyIsIDB4OTcgPT4gIlx4RTJceDgwXHg5NCIsIDB4OTggPT4gIlx4Q0JceDlDIiwgMHg5OSA9PiAiXHhFMlx4ODRceEEyIiwgMHg5QSA9PiAiXHhDNVx4QTEiLCAweDlCID0+ICJceEUyXHg4MFx4QkEiLCAweDlDID0+ICJceEM1XHg5MyIsIDB4OUQgPT4gIlx4RUZceEJGXHhCRCIsIDB4OUUgPT4gIlx4QzVceEJFIiwgMHg5RiA9PiAiXHhDNVx4QjgiKTsKCgkJCQkJaWYgKCRoZXgpCgkJCQkJewoJCQkJCQkkY29kZXBvaW50ID0gaGV4ZGVjKCRjb2RlcG9pbnQpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkY29kZXBvaW50ID0gaW50dmFsKCRjb2RlcG9pbnQpOwoJCQkJCX0KCgkJCQkJaWYgKGlzc2V0KCR3aW5kb3dzXzEyNTJfc3BlY2lhbHNbJGNvZGVwb2ludF0pKQoJCQkJCXsKCQkJCQkJJHJlcGxhY2VtZW50ID0gJHdpbmRvd3NfMTI1Ml9zcGVjaWFsc1skY29kZXBvaW50XTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHJlcGxhY2VtZW50ID0gU2ltcGxlUGllX01pc2M6OmNvZGVwb2ludF90b191dGY4KCRjb2RlcG9pbnQpOwoJCQkJCX0KCgkJCQkJaWYgKCR0aGlzLT5jb25zdW1lKCkgIT0gJzsnKQoJCQkJCXsKCQkJCQkJJHRoaXMtPnVuY29uc3VtZSgpOwoJCQkJCX0KCgkJCQkJJGNvbnN1bWVkX2xlbmd0aCA9IHN0cmxlbigkdGhpcy0+Y29uc3VtZWQpOwoJCQkJCSR0aGlzLT5kYXRhID0gc3Vic3RyX3JlcGxhY2UoJHRoaXMtPmRhdGEsICRyZXBsYWNlbWVudCwgJHRoaXMtPnBvc2l0aW9uIC0gJGNvbnN1bWVkX2xlbmd0aCwgJGNvbnN1bWVkX2xlbmd0aCk7CgkJCQkJJHRoaXMtPnBvc2l0aW9uICs9IHN0cmxlbigkcmVwbGFjZW1lbnQpIC0gJGNvbnN1bWVkX2xlbmd0aDsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCXN0YXRpYyAkZW50aXRpZXMgPSBhcnJheSgnQWFjdXRlJyA9PiAiXHhDM1x4ODEiLCAnYWFjdXRlJyA9PiAiXHhDM1x4QTEiLCAnQWFjdXRlOycgPT4gIlx4QzNceDgxIiwgJ2FhY3V0ZTsnID0+ICJceEMzXHhBMSIsICdBY2lyYycgPT4gIlx4QzNceDgyIiwgJ2FjaXJjJyA9PiAiXHhDM1x4QTIiLCAnQWNpcmM7JyA9PiAiXHhDM1x4ODIiLCAnYWNpcmM7JyA9PiAiXHhDM1x4QTIiLCAnYWN1dGUnID0+ICJceEMyXHhCNCIsICdhY3V0ZTsnID0+ICJceEMyXHhCNCIsICdBRWxpZycgPT4gIlx4QzNceDg2IiwgJ2FlbGlnJyA9PiAiXHhDM1x4QTYiLCAnQUVsaWc7JyA9PiAiXHhDM1x4ODYiLCAnYWVsaWc7JyA9PiAiXHhDM1x4QTYiLCAnQWdyYXZlJyA9PiAiXHhDM1x4ODAiLCAnYWdyYXZlJyA9PiAiXHhDM1x4QTAiLCAnQWdyYXZlOycgPT4gIlx4QzNceDgwIiwgJ2FncmF2ZTsnID0+ICJceEMzXHhBMCIsICdhbGVmc3ltOycgPT4gIlx4RTJceDg0XHhCNSIsICdBbHBoYTsnID0+ICJceENFXHg5MSIsICdhbHBoYTsnID0+ICJceENFXHhCMSIsICdBTVAnID0+ICJceDI2IiwgJ2FtcCcgPT4gIlx4MjYiLCAnQU1QOycgPT4gIlx4MjYiLCAnYW1wOycgPT4gIlx4MjYiLCAnYW5kOycgPT4gIlx4RTJceDg4XHhBNyIsICdhbmc7JyA9PiAiXHhFMlx4ODhceEEwIiwgJ2Fwb3M7JyA9PiAiXHgyNyIsICdBcmluZycgPT4gIlx4QzNceDg1IiwgJ2FyaW5nJyA9PiAiXHhDM1x4QTUiLCAnQXJpbmc7JyA9PiAiXHhDM1x4ODUiLCAnYXJpbmc7JyA9PiAiXHhDM1x4QTUiLCAnYXN5bXA7JyA9PiAiXHhFMlx4ODlceDg4IiwgJ0F0aWxkZScgPT4gIlx4QzNceDgzIiwgJ2F0aWxkZScgPT4gIlx4QzNceEEzIiwgJ0F0aWxkZTsnID0+ICJceEMzXHg4MyIsICdhdGlsZGU7JyA9PiAiXHhDM1x4QTMiLCAnQXVtbCcgPT4gIlx4QzNceDg0IiwgJ2F1bWwnID0+ICJceEMzXHhBNCIsICdBdW1sOycgPT4gIlx4QzNceDg0IiwgJ2F1bWw7JyA9PiAiXHhDM1x4QTQiLCAnYmRxdW87JyA9PiAiXHhFMlx4ODBceDlFIiwgJ0JldGE7JyA9PiAiXHhDRVx4OTIiLCAnYmV0YTsnID0+ICJceENFXHhCMiIsICdicnZiYXInID0+ICJceEMyXHhBNiIsICdicnZiYXI7JyA9PiAiXHhDMlx4QTYiLCAnYnVsbDsnID0+ICJceEUyXHg4MFx4QTIiLCAnY2FwOycgPT4gIlx4RTJceDg4XHhBOSIsICdDY2VkaWwnID0+ICJceEMzXHg4NyIsICdjY2VkaWwnID0+ICJceEMzXHhBNyIsICdDY2VkaWw7JyA9PiAiXHhDM1x4ODciLCAnY2NlZGlsOycgPT4gIlx4QzNceEE3IiwgJ2NlZGlsJyA9PiAiXHhDMlx4QjgiLCAnY2VkaWw7JyA9PiAiXHhDMlx4QjgiLCAnY2VudCcgPT4gIlx4QzJceEEyIiwgJ2NlbnQ7JyA9PiAiXHhDMlx4QTIiLCAnQ2hpOycgPT4gIlx4Q0VceEE3IiwgJ2NoaTsnID0+ICJceENGXHg4NyIsICdjaXJjOycgPT4gIlx4Q0JceDg2IiwgJ2NsdWJzOycgPT4gIlx4RTJceDk5XHhBMyIsICdjb25nOycgPT4gIlx4RTJceDg5XHg4NSIsICdDT1BZJyA9PiAiXHhDMlx4QTkiLCAnY29weScgPT4gIlx4QzJceEE5IiwgJ0NPUFk7JyA9PiAiXHhDMlx4QTkiLCAnY29weTsnID0+ICJceEMyXHhBOSIsICdjcmFycjsnID0+ICJceEUyXHg4Nlx4QjUiLCAnY3VwOycgPT4gIlx4RTJceDg4XHhBQSIsICdjdXJyZW4nID0+ICJceEMyXHhBNCIsICdjdXJyZW47JyA9PiAiXHhDMlx4QTQiLCAnRGFnZ2VyOycgPT4gIlx4RTJceDgwXHhBMSIsICdkYWdnZXI7JyA9PiAiXHhFMlx4ODBceEEwIiwgJ2RBcnI7JyA9PiAiXHhFMlx4ODdceDkzIiwgJ2RhcnI7JyA9PiAiXHhFMlx4ODZceDkzIiwgJ2RlZycgPT4gIlx4QzJceEIwIiwgJ2RlZzsnID0+ICJceEMyXHhCMCIsICdEZWx0YTsnID0+ICJceENFXHg5NCIsICdkZWx0YTsnID0+ICJceENFXHhCNCIsICdkaWFtczsnID0+ICJceEUyXHg5OVx4QTYiLCAnZGl2aWRlJyA9PiAiXHhDM1x4QjciLCAnZGl2aWRlOycgPT4gIlx4QzNceEI3IiwgJ0VhY3V0ZScgPT4gIlx4QzNceDg5IiwgJ2VhY3V0ZScgPT4gIlx4QzNceEE5IiwgJ0VhY3V0ZTsnID0+ICJceEMzXHg4OSIsICdlYWN1dGU7JyA9PiAiXHhDM1x4QTkiLCAnRWNpcmMnID0+ICJceEMzXHg4QSIsICdlY2lyYycgPT4gIlx4QzNceEFBIiwgJ0VjaXJjOycgPT4gIlx4QzNceDhBIiwgJ2VjaXJjOycgPT4gIlx4QzNceEFBIiwgJ0VncmF2ZScgPT4gIlx4QzNceDg4IiwgJ2VncmF2ZScgPT4gIlx4QzNceEE4IiwgJ0VncmF2ZTsnID0+ICJceEMzXHg4OCIsICdlZ3JhdmU7JyA9PiAiXHhDM1x4QTgiLCAnZW1wdHk7JyA9PiAiXHhFMlx4ODhceDg1IiwgJ2Vtc3A7JyA9PiAiXHhFMlx4ODBceDgzIiwgJ2Vuc3A7JyA9PiAiXHhFMlx4ODBceDgyIiwgJ0Vwc2lsb247JyA9PiAiXHhDRVx4OTUiLCAnZXBzaWxvbjsnID0+ICJceENFXHhCNSIsICdlcXVpdjsnID0+ICJceEUyXHg4OVx4QTEiLCAnRXRhOycgPT4gIlx4Q0VceDk3IiwgJ2V0YTsnID0+ICJceENFXHhCNyIsICdFVEgnID0+ICJceEMzXHg5MCIsICdldGgnID0+ICJceEMzXHhCMCIsICdFVEg7JyA9PiAiXHhDM1x4OTAiLCAnZXRoOycgPT4gIlx4QzNceEIwIiwgJ0V1bWwnID0+ICJceEMzXHg4QiIsICdldW1sJyA9PiAiXHhDM1x4QUIiLCAnRXVtbDsnID0+ICJceEMzXHg4QiIsICdldW1sOycgPT4gIlx4QzNceEFCIiwgJ2V1cm87JyA9PiAiXHhFMlx4ODJceEFDIiwgJ2V4aXN0OycgPT4gIlx4RTJceDg4XHg4MyIsICdmbm9mOycgPT4gIlx4QzZceDkyIiwgJ2ZvcmFsbDsnID0+ICJceEUyXHg4OFx4ODAiLCAnZnJhYzEyJyA9PiAiXHhDMlx4QkQiLCAnZnJhYzEyOycgPT4gIlx4QzJceEJEIiwgJ2ZyYWMxNCcgPT4gIlx4QzJceEJDIiwgJ2ZyYWMxNDsnID0+ICJceEMyXHhCQyIsICdmcmFjMzQnID0+ICJceEMyXHhCRSIsICdmcmFjMzQ7JyA9PiAiXHhDMlx4QkUiLCAnZnJhc2w7JyA9PiAiXHhFMlx4ODFceDg0IiwgJ0dhbW1hOycgPT4gIlx4Q0VceDkzIiwgJ2dhbW1hOycgPT4gIlx4Q0VceEIzIiwgJ2dlOycgPT4gIlx4RTJceDg5XHhBNSIsICdHVCcgPT4gIlx4M0UiLCAnZ3QnID0+ICJceDNFIiwgJ0dUOycgPT4gIlx4M0UiLCAnZ3Q7JyA9PiAiXHgzRSIsICdoQXJyOycgPT4gIlx4RTJceDg3XHg5NCIsICdoYXJyOycgPT4gIlx4RTJceDg2XHg5NCIsICdoZWFydHM7JyA9PiAiXHhFMlx4OTlceEE1IiwgJ2hlbGxpcDsnID0+ICJceEUyXHg4MFx4QTYiLCAnSWFjdXRlJyA9PiAiXHhDM1x4OEQiLCAnaWFjdXRlJyA9PiAiXHhDM1x4QUQiLCAnSWFjdXRlOycgPT4gIlx4QzNceDhEIiwgJ2lhY3V0ZTsnID0+ICJceEMzXHhBRCIsICdJY2lyYycgPT4gIlx4QzNceDhFIiwgJ2ljaXJjJyA9PiAiXHhDM1x4QUUiLCAnSWNpcmM7JyA9PiAiXHhDM1x4OEUiLCAnaWNpcmM7JyA9PiAiXHhDM1x4QUUiLCAnaWV4Y2wnID0+ICJceEMyXHhBMSIsICdpZXhjbDsnID0+ICJceEMyXHhBMSIsICdJZ3JhdmUnID0+ICJceEMzXHg4QyIsICdpZ3JhdmUnID0+ICJceEMzXHhBQyIsICdJZ3JhdmU7JyA9PiAiXHhDM1x4OEMiLCAnaWdyYXZlOycgPT4gIlx4QzNceEFDIiwgJ2ltYWdlOycgPT4gIlx4RTJceDg0XHg5MSIsICdpbmZpbjsnID0+ICJceEUyXHg4OFx4OUUiLCAnaW50OycgPT4gIlx4RTJceDg4XHhBQiIsICdJb3RhOycgPT4gIlx4Q0VceDk5IiwgJ2lvdGE7JyA9PiAiXHhDRVx4QjkiLCAnaXF1ZXN0JyA9PiAiXHhDMlx4QkYiLCAnaXF1ZXN0OycgPT4gIlx4QzJceEJGIiwgJ2lzaW47JyA9PiAiXHhFMlx4ODhceDg4IiwgJ0l1bWwnID0+ICJceEMzXHg4RiIsICdpdW1sJyA9PiAiXHhDM1x4QUYiLCAnSXVtbDsnID0+ICJceEMzXHg4RiIsICdpdW1sOycgPT4gIlx4QzNceEFGIiwgJ0thcHBhOycgPT4gIlx4Q0VceDlBIiwgJ2thcHBhOycgPT4gIlx4Q0VceEJBIiwgJ0xhbWJkYTsnID0+ICJceENFXHg5QiIsICdsYW1iZGE7JyA9PiAiXHhDRVx4QkIiLCAnbGFuZzsnID0+ICJceEUzXHg4MFx4ODgiLCAnbGFxdW8nID0+ICJceEMyXHhBQiIsICdsYXF1bzsnID0+ICJceEMyXHhBQiIsICdsQXJyOycgPT4gIlx4RTJceDg3XHg5MCIsICdsYXJyOycgPT4gIlx4RTJceDg2XHg5MCIsICdsY2VpbDsnID0+ICJceEUyXHg4Q1x4ODgiLCAnbGRxdW87JyA9PiAiXHhFMlx4ODBceDlDIiwgJ2xlOycgPT4gIlx4RTJceDg5XHhBNCIsICdsZmxvb3I7JyA9PiAiXHhFMlx4OENceDhBIiwgJ2xvd2FzdDsnID0+ICJceEUyXHg4OFx4OTciLCAnbG96OycgPT4gIlx4RTJceDk3XHg4QSIsICdscm07JyA9PiAiXHhFMlx4ODBceDhFIiwgJ2xzYXF1bzsnID0+ICJceEUyXHg4MFx4QjkiLCAnbHNxdW87JyA9PiAiXHhFMlx4ODBceDk4IiwgJ0xUJyA9PiAiXHgzQyIsICdsdCcgPT4gIlx4M0MiLCAnTFQ7JyA9PiAiXHgzQyIsICdsdDsnID0+ICJceDNDIiwgJ21hY3InID0+ICJceEMyXHhBRiIsICdtYWNyOycgPT4gIlx4QzJceEFGIiwgJ21kYXNoOycgPT4gIlx4RTJceDgwXHg5NCIsICdtaWNybycgPT4gIlx4QzJceEI1IiwgJ21pY3JvOycgPT4gIlx4QzJceEI1IiwgJ21pZGRvdCcgPT4gIlx4QzJceEI3IiwgJ21pZGRvdDsnID0+ICJceEMyXHhCNyIsICdtaW51czsnID0+ICJceEUyXHg4OFx4OTIiLCAnTXU7JyA9PiAiXHhDRVx4OUMiLCAnbXU7JyA9PiAiXHhDRVx4QkMiLCAnbmFibGE7JyA9PiAiXHhFMlx4ODhceDg3IiwgJ25ic3AnID0+ICJceEMyXHhBMCIsICduYnNwOycgPT4gIlx4QzJceEEwIiwgJ25kYXNoOycgPT4gIlx4RTJceDgwXHg5MyIsICduZTsnID0+ICJceEUyXHg4OVx4QTAiLCAnbmk7JyA9PiAiXHhFMlx4ODhceDhCIiwgJ25vdCcgPT4gIlx4QzJceEFDIiwgJ25vdDsnID0+ICJceEMyXHhBQyIsICdub3RpbjsnID0+ICJceEUyXHg4OFx4ODkiLCAnbnN1YjsnID0+ICJceEUyXHg4QVx4ODQiLCAnTnRpbGRlJyA9PiAiXHhDM1x4OTEiLCAnbnRpbGRlJyA9PiAiXHhDM1x4QjEiLCAnTnRpbGRlOycgPT4gIlx4QzNceDkxIiwgJ250aWxkZTsnID0+ICJceEMzXHhCMSIsICdOdTsnID0+ICJceENFXHg5RCIsICdudTsnID0+ICJceENFXHhCRCIsICdPYWN1dGUnID0+ICJceEMzXHg5MyIsICdvYWN1dGUnID0+ICJceEMzXHhCMyIsICdPYWN1dGU7JyA9PiAiXHhDM1x4OTMiLCAnb2FjdXRlOycgPT4gIlx4QzNceEIzIiwgJ09jaXJjJyA9PiAiXHhDM1x4OTQiLCAnb2NpcmMnID0+ICJceEMzXHhCNCIsICdPY2lyYzsnID0+ICJceEMzXHg5NCIsICdvY2lyYzsnID0+ICJceEMzXHhCNCIsICdPRWxpZzsnID0+ICJceEM1XHg5MiIsICdvZWxpZzsnID0+ICJceEM1XHg5MyIsICdPZ3JhdmUnID0+ICJceEMzXHg5MiIsICdvZ3JhdmUnID0+ICJceEMzXHhCMiIsICdPZ3JhdmU7JyA9PiAiXHhDM1x4OTIiLCAnb2dyYXZlOycgPT4gIlx4QzNceEIyIiwgJ29saW5lOycgPT4gIlx4RTJceDgwXHhCRSIsICdPbWVnYTsnID0+ICJceENFXHhBOSIsICdvbWVnYTsnID0+ICJceENGXHg4OSIsICdPbWljcm9uOycgPT4gIlx4Q0VceDlGIiwgJ29taWNyb247JyA9PiAiXHhDRVx4QkYiLCAnb3BsdXM7JyA9PiAiXHhFMlx4OEFceDk1IiwgJ29yOycgPT4gIlx4RTJceDg4XHhBOCIsICdvcmRmJyA9PiAiXHhDMlx4QUEiLCAnb3JkZjsnID0+ICJceEMyXHhBQSIsICdvcmRtJyA9PiAiXHhDMlx4QkEiLCAnb3JkbTsnID0+ICJceEMyXHhCQSIsICdPc2xhc2gnID0+ICJceEMzXHg5OCIsICdvc2xhc2gnID0+ICJceEMzXHhCOCIsICdPc2xhc2g7JyA9PiAiXHhDM1x4OTgiLCAnb3NsYXNoOycgPT4gIlx4QzNceEI4IiwgJ090aWxkZScgPT4gIlx4QzNceDk1IiwgJ290aWxkZScgPT4gIlx4QzNceEI1IiwgJ090aWxkZTsnID0+ICJceEMzXHg5NSIsICdvdGlsZGU7JyA9PiAiXHhDM1x4QjUiLCAnb3RpbWVzOycgPT4gIlx4RTJceDhBXHg5NyIsICdPdW1sJyA9PiAiXHhDM1x4OTYiLCAnb3VtbCcgPT4gIlx4QzNceEI2IiwgJ091bWw7JyA9PiAiXHhDM1x4OTYiLCAnb3VtbDsnID0+ICJceEMzXHhCNiIsICdwYXJhJyA9PiAiXHhDMlx4QjYiLCAncGFyYTsnID0+ICJceEMyXHhCNiIsICdwYXJ0OycgPT4gIlx4RTJceDg4XHg4MiIsICdwZXJtaWw7JyA9PiAiXHhFMlx4ODBceEIwIiwgJ3BlcnA7JyA9PiAiXHhFMlx4OEFceEE1IiwgJ1BoaTsnID0+ICJceENFXHhBNiIsICdwaGk7JyA9PiAiXHhDRlx4ODYiLCAnUGk7JyA9PiAiXHhDRVx4QTAiLCAncGk7JyA9PiAiXHhDRlx4ODAiLCAncGl2OycgPT4gIlx4Q0ZceDk2IiwgJ3BsdXNtbicgPT4gIlx4QzJceEIxIiwgJ3BsdXNtbjsnID0+ICJceEMyXHhCMSIsICdwb3VuZCcgPT4gIlx4QzJceEEzIiwgJ3BvdW5kOycgPT4gIlx4QzJceEEzIiwgJ1ByaW1lOycgPT4gIlx4RTJceDgwXHhCMyIsICdwcmltZTsnID0+ICJceEUyXHg4MFx4QjIiLCAncHJvZDsnID0+ICJceEUyXHg4OFx4OEYiLCAncHJvcDsnID0+ICJceEUyXHg4OFx4OUQiLCAnUHNpOycgPT4gIlx4Q0VceEE4IiwgJ3BzaTsnID0+ICJceENGXHg4OCIsICdRVU9UJyA9PiAiXHgyMiIsICdxdW90JyA9PiAiXHgyMiIsICdRVU9UOycgPT4gIlx4MjIiLCAncXVvdDsnID0+ICJceDIyIiwgJ3JhZGljOycgPT4gIlx4RTJceDg4XHg5QSIsICdyYW5nOycgPT4gIlx4RTNceDgwXHg4OSIsICdyYXF1bycgPT4gIlx4QzJceEJCIiwgJ3JhcXVvOycgPT4gIlx4QzJceEJCIiwgJ3JBcnI7JyA9PiAiXHhFMlx4ODdceDkyIiwgJ3JhcnI7JyA9PiAiXHhFMlx4ODZceDkyIiwgJ3JjZWlsOycgPT4gIlx4RTJceDhDXHg4OSIsICdyZHF1bzsnID0+ICJceEUyXHg4MFx4OUQiLCAncmVhbDsnID0+ICJceEUyXHg4NFx4OUMiLCAnUkVHJyA9PiAiXHhDMlx4QUUiLCAncmVnJyA9PiAiXHhDMlx4QUUiLCAnUkVHOycgPT4gIlx4QzJceEFFIiwgJ3JlZzsnID0+ICJceEMyXHhBRSIsICdyZmxvb3I7JyA9PiAiXHhFMlx4OENceDhCIiwgJ1JobzsnID0+ICJceENFXHhBMSIsICdyaG87JyA9PiAiXHhDRlx4ODEiLCAncmxtOycgPT4gIlx4RTJceDgwXHg4RiIsICdyc2FxdW87JyA9PiAiXHhFMlx4ODBceEJBIiwgJ3JzcXVvOycgPT4gIlx4RTJceDgwXHg5OSIsICdzYnF1bzsnID0+ICJceEUyXHg4MFx4OUEiLCAnU2Nhcm9uOycgPT4gIlx4QzVceEEwIiwgJ3NjYXJvbjsnID0+ICJceEM1XHhBMSIsICdzZG90OycgPT4gIlx4RTJceDhCXHg4NSIsICdzZWN0JyA9PiAiXHhDMlx4QTciLCAnc2VjdDsnID0+ICJceEMyXHhBNyIsICdzaHknID0+ICJceEMyXHhBRCIsICdzaHk7JyA9PiAiXHhDMlx4QUQiLCAnU2lnbWE7JyA9PiAiXHhDRVx4QTMiLCAnc2lnbWE7JyA9PiAiXHhDRlx4ODMiLCAnc2lnbWFmOycgPT4gIlx4Q0ZceDgyIiwgJ3NpbTsnID0+ICJceEUyXHg4OFx4QkMiLCAnc3BhZGVzOycgPT4gIlx4RTJceDk5XHhBMCIsICdzdWI7JyA9PiAiXHhFMlx4OEFceDgyIiwgJ3N1YmU7JyA9PiAiXHhFMlx4OEFceDg2IiwgJ3N1bTsnID0+ICJceEUyXHg4OFx4OTEiLCAnc3VwOycgPT4gIlx4RTJceDhBXHg4MyIsICdzdXAxJyA9PiAiXHhDMlx4QjkiLCAnc3VwMTsnID0+ICJceEMyXHhCOSIsICdzdXAyJyA9PiAiXHhDMlx4QjIiLCAnc3VwMjsnID0+ICJceEMyXHhCMiIsICdzdXAzJyA9PiAiXHhDMlx4QjMiLCAnc3VwMzsnID0+ICJceEMyXHhCMyIsICdzdXBlOycgPT4gIlx4RTJceDhBXHg4NyIsICdzemxpZycgPT4gIlx4QzNceDlGIiwgJ3N6bGlnOycgPT4gIlx4QzNceDlGIiwgJ1RhdTsnID0+ICJceENFXHhBNCIsICd0YXU7JyA9PiAiXHhDRlx4ODQiLCAndGhlcmU0OycgPT4gIlx4RTJceDg4XHhCNCIsICdUaGV0YTsnID0+ICJceENFXHg5OCIsICd0aGV0YTsnID0+ICJceENFXHhCOCIsICd0aGV0YXN5bTsnID0+ICJceENGXHg5MSIsICd0aGluc3A7JyA9PiAiXHhFMlx4ODBceDg5IiwgJ1RIT1JOJyA9PiAiXHhDM1x4OUUiLCAndGhvcm4nID0+ICJceEMzXHhCRSIsICdUSE9STjsnID0+ICJceEMzXHg5RSIsICd0aG9ybjsnID0+ICJceEMzXHhCRSIsICd0aWxkZTsnID0+ICJceENCXHg5QyIsICd0aW1lcycgPT4gIlx4QzNceDk3IiwgJ3RpbWVzOycgPT4gIlx4QzNceDk3IiwgJ1RSQURFOycgPT4gIlx4RTJceDg0XHhBMiIsICd0cmFkZTsnID0+ICJceEUyXHg4NFx4QTIiLCAnVWFjdXRlJyA9PiAiXHhDM1x4OUEiLCAndWFjdXRlJyA9PiAiXHhDM1x4QkEiLCAnVWFjdXRlOycgPT4gIlx4QzNceDlBIiwgJ3VhY3V0ZTsnID0+ICJceEMzXHhCQSIsICd1QXJyOycgPT4gIlx4RTJceDg3XHg5MSIsICd1YXJyOycgPT4gIlx4RTJceDg2XHg5MSIsICdVY2lyYycgPT4gIlx4QzNceDlCIiwgJ3VjaXJjJyA9PiAiXHhDM1x4QkIiLCAnVWNpcmM7JyA9PiAiXHhDM1x4OUIiLCAndWNpcmM7JyA9PiAiXHhDM1x4QkIiLCAnVWdyYXZlJyA9PiAiXHhDM1x4OTkiLCAndWdyYXZlJyA9PiAiXHhDM1x4QjkiLCAnVWdyYXZlOycgPT4gIlx4QzNceDk5IiwgJ3VncmF2ZTsnID0+ICJceEMzXHhCOSIsICd1bWwnID0+ICJceEMyXHhBOCIsICd1bWw7JyA9PiAiXHhDMlx4QTgiLCAndXBzaWg7JyA9PiAiXHhDRlx4OTIiLCAnVXBzaWxvbjsnID0+ICJceENFXHhBNSIsICd1cHNpbG9uOycgPT4gIlx4Q0ZceDg1IiwgJ1V1bWwnID0+ICJceEMzXHg5QyIsICd1dW1sJyA9PiAiXHhDM1x4QkMiLCAnVXVtbDsnID0+ICJceEMzXHg5QyIsICd1dW1sOycgPT4gIlx4QzNceEJDIiwgJ3dlaWVycDsnID0+ICJceEUyXHg4NFx4OTgiLCAnWGk7JyA9PiAiXHhDRVx4OUUiLCAneGk7JyA9PiAiXHhDRVx4QkUiLCAnWWFjdXRlJyA9PiAiXHhDM1x4OUQiLCAneWFjdXRlJyA9PiAiXHhDM1x4QkQiLCAnWWFjdXRlOycgPT4gIlx4QzNceDlEIiwgJ3lhY3V0ZTsnID0+ICJceEMzXHhCRCIsICd5ZW4nID0+ICJceEMyXHhBNSIsICd5ZW47JyA9PiAiXHhDMlx4QTUiLCAneXVtbCcgPT4gIlx4QzNceEJGIiwgJ1l1bWw7JyA9PiAiXHhDNVx4QjgiLCAneXVtbDsnID0+ICJceEMzXHhCRiIsICdaZXRhOycgPT4gIlx4Q0VceDk2IiwgJ3pldGE7JyA9PiAiXHhDRVx4QjYiLCAnendqOycgPT4gIlx4RTJceDgwXHg4RCIsICd6d25qOycgPT4gIlx4RTJceDgwXHg4QyIpOwoKCQkJCWZvciAoJGkgPSAwLCAkbWF0Y2ggPSBudWxsOyAkaSA8IDkgJiYgJHRoaXMtPmNvbnN1bWUoKSAhPT0gZmFsc2U7ICRpKyspCgkJCQl7CgkJCQkJJGNvbnN1bWVkID0gc3Vic3RyKCR0aGlzLT5jb25zdW1lZCwgMSk7CgkJCQkJaWYgKGlzc2V0KCRlbnRpdGllc1skY29uc3VtZWRdKSkKCQkJCQl7CgkJCQkJCSRtYXRjaCA9ICRjb25zdW1lZDsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCRtYXRjaCAhPT0gbnVsbCkKCQkJCXsKIAkJCQkJJHRoaXMtPmRhdGEgPSBzdWJzdHJfcmVwbGFjZSgkdGhpcy0+ZGF0YSwgJGVudGl0aWVzWyRtYXRjaF0sICR0aGlzLT5wb3NpdGlvbiAtIHN0cmxlbigkY29uc3VtZWQpIC0gMSwgc3RybGVuKCRtYXRjaCkgKyAxKTsKCQkJCQkkdGhpcy0+cG9zaXRpb24gKz0gc3RybGVuKCRlbnRpdGllc1skbWF0Y2hdKSAtIHN0cmxlbigkY29uc3VtZWQpIC0gMTsKCQkJCX0KCQkJCWJyZWFrOwoJCX0KCX0KfQoKLyoqCiAqIERhdGUgUGFyc2VyCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKi8KY2xhc3MgU2ltcGxlUGllX1BhcnNlX0RhdGUKewoJLyoqCgkgKiBJbnB1dCBkYXRhCgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZGF0ZTsKCgkvKioKCSAqIExpc3Qgb2YgZGF5cywgY2FsZW5kYXIgZGF5IG5hbWUgPT4gb3JkaW5hbCBkYXkgbnVtYmVyIGluIHRoZSB3ZWVrCgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRkYXkgPSBhcnJheSgKCQkvLyBFbmdsaXNoCgkJJ21vbicgPT4gMSwKCQknbW9uZGF5JyA9PiAxLAoJCSd0dWUnID0+IDIsCgkJJ3R1ZXNkYXknID0+IDIsCgkJJ3dlZCcgPT4gMywKCQknd2VkbmVzZGF5JyA9PiAzLAoJCSd0aHUnID0+IDQsCgkJJ3RodXJzZGF5JyA9PiA0LAoJCSdmcmknID0+IDUsCgkJJ2ZyaWRheScgPT4gNSwKCQknc2F0JyA9PiA2LAoJCSdzYXR1cmRheScgPT4gNiwKCQknc3VuJyA9PiA3LAoJCSdzdW5kYXknID0+IDcsCgkJLy8gRHV0Y2gKCQknbWFhbmRhZycgPT4gMSwKCQknZGluc2RhZycgPT4gMiwKCQknd29lbnNkYWcnID0+IDMsCgkJJ2RvbmRlcmRhZycgPT4gNCwKCQkndnJpamRhZycgPT4gNSwKCQknemF0ZXJkYWcnID0+IDYsCgkJJ3pvbmRhZycgPT4gNywKCQkvLyBGcmVuY2gKCQknbHVuZGknID0+IDEsCgkJJ21hcmRpJyA9PiAyLAoJCSdtZXJjcmVkaScgPT4gMywKCQknamV1ZGknID0+IDQsCgkJJ3ZlbmRyZWRpJyA9PiA1LAoJCSdzYW1lZGknID0+IDYsCgkJJ2RpbWFuY2hlJyA9PiA3LAoJCS8vIEdlcm1hbgoJCSdtb250YWcnID0+IDEsCgkJJ2RpZW5zdGFnJyA9PiAyLAoJCSdtaXR0d29jaCcgPT4gMywKCQknZG9ubmVyc3RhZycgPT4gNCwKCQknZnJlaXRhZycgPT4gNSwKCQknc2Ftc3RhZycgPT4gNiwKCQknc29ubmFiZW5kJyA9PiA2LAoJCSdzb25udGFnJyA9PiA3LAoJCS8vIEl0YWxpYW4KCQknbHVuZWTDrCcgPT4gMSwKCQknbWFydGVkw6wnID0+IDIsCgkJJ21lcmNvbGVkw6wnID0+IDMsCgkJJ2dpb3ZlZMOsJyA9PiA0LAoJCSd2ZW5lcmTDrCcgPT4gNSwKCQknc2FiYXRvJyA9PiA2LAoJCSdkb21lbmljYScgPT4gNywKCQkvLyBTcGFuaXNoCgkJJ2x1bmVzJyA9PiAxLAoJCSdtYXJ0ZXMnID0+IDIsCgkJJ21pw6lyY29sZXMnID0+IDMsCgkJJ2p1ZXZlcycgPT4gNCwKCQkndmllcm5lcycgPT4gNSwKCQknc8OhYmFkbycgPT4gNiwKCQknZG9taW5nbycgPT4gNywKCQkvLyBGaW5uaXNoCgkJJ21hYW5hbnRhaScgPT4gMSwKCQkndGlpc3RhaScgPT4gMiwKCQkna2Vza2l2aWlra28nID0+IDMsCgkJJ3RvcnN0YWknID0+IDQsCgkJJ3BlcmphbnRhaScgPT4gNSwKCQknbGF1YW50YWknID0+IDYsCgkJJ3N1bm51bnRhaScgPT4gNywKCQkvLyBIdW5nYXJpYW4KCQknaMOpdGbFkScgPT4gMSwKCQkna2VkZCcgPT4gMiwKCQknc3plcmRhJyA9PiAzLAoJCSdjc8O8dMO2cnRvaycgPT4gNCwKCQkncMOpbnRlaycgPT4gNSwKCQknc3pvbWJhdCcgPT4gNiwKCQkndmFzw6FybmFwJyA9PiA3LAoJCS8vIEdyZWVrCgkJJ86UzrXPhScgPT4gMSwKCQknzqTPgc65JyA9PiAyLAoJCSfOpM61z4QnID0+IDMsCgkJJ86gzrXOvCcgPT4gNCwKCQknzqDOsc+BJyA9PiA1LAoJCSfOo86xzrInID0+IDYsCgkJJ86az4XPgScgPT4gNywKCSk7CgoJLyoqCgkgKiBMaXN0IG9mIG1vbnRocywgY2FsZW5kYXIgbW9udGggbmFtZSA9PiBjYWxlbmRhciBtb250aCBudW1iZXIKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBhcnJheQoJICovCgl2YXIgJG1vbnRoID0gYXJyYXkoCgkJLy8gRW5nbGlzaAoJCSdqYW4nID0+IDEsCgkJJ2phbnVhcnknID0+IDEsCgkJJ2ZlYicgPT4gMiwKCQknZmVicnVhcnknID0+IDIsCgkJJ21hcicgPT4gMywKCQknbWFyY2gnID0+IDMsCgkJJ2FwcicgPT4gNCwKCQknYXByaWwnID0+IDQsCgkJJ21heScgPT4gNSwKCQkvLyBObyBsb25nIGZvcm0gb2YgTWF5CgkJJ2p1bicgPT4gNiwKCQknanVuZScgPT4gNiwKCQknanVsJyA9PiA3LAoJCSdqdWx5JyA9PiA3LAoJCSdhdWcnID0+IDgsCgkJJ2F1Z3VzdCcgPT4gOCwKCQknc2VwJyA9PiA5LAoJCSdzZXB0ZW1iZXInID0+IDgsCgkJJ29jdCcgPT4gMTAsCgkJJ29jdG9iZXInID0+IDEwLAoJCSdub3YnID0+IDExLAoJCSdub3ZlbWJlcicgPT4gMTEsCgkJJ2RlYycgPT4gMTIsCgkJJ2RlY2VtYmVyJyA9PiAxMiwKCQkvLyBEdXRjaAoJCSdqYW51YXJpJyA9PiAxLAoJCSdmZWJydWFyaScgPT4gMiwKCQknbWFhcnQnID0+IDMsCgkJJ2FwcmlsJyA9PiA0LAoJCSdtZWknID0+IDUsCgkJJ2p1bmknID0+IDYsCgkJJ2p1bGknID0+IDcsCgkJJ2F1Z3VzdHVzJyA9PiA4LAoJCSdzZXB0ZW1iZXInID0+IDksCgkJJ29rdG9iZXInID0+IDEwLAoJCSdub3ZlbWJlcicgPT4gMTEsCgkJJ2RlY2VtYmVyJyA9PiAxMiwKCQkvLyBGcmVuY2gKCQknamFudmllcicgPT4gMSwKCQknZsOpdnJpZXInID0+IDIsCgkJJ21hcnMnID0+IDMsCgkJJ2F2cmlsJyA9PiA0LAoJCSdtYWknID0+IDUsCgkJJ2p1aW4nID0+IDYsCgkJJ2p1aWxsZXQnID0+IDcsCgkJJ2Fvw7t0JyA9PiA4LAoJCSdzZXB0ZW1icmUnID0+IDksCgkJJ29jdG9icmUnID0+IDEwLAoJCSdub3ZlbWJyZScgPT4gMTEsCgkJJ2TDqWNlbWJyZScgPT4gMTIsCgkJLy8gR2VybWFuCgkJJ2phbnVhcicgPT4gMSwKCQknZmVicnVhcicgPT4gMiwKCQknbcOkcnonID0+IDMsCgkJJ2FwcmlsJyA9PiA0LAoJCSdtYWknID0+IDUsCgkJJ2p1bmknID0+IDYsCgkJJ2p1bGknID0+IDcsCgkJJ2F1Z3VzdCcgPT4gOCwKCQknc2VwdGVtYmVyJyA9PiA5LAoJCSdva3RvYmVyJyA9PiAxMCwKCQknbm92ZW1iZXInID0+IDExLAoJCSdkZXplbWJlcicgPT4gMTIsCgkJLy8gSXRhbGlhbgoJCSdnZW5uYWlvJyA9PiAxLAoJCSdmZWJicmFpbycgPT4gMiwKCQknbWFyem8nID0+IDMsCgkJJ2FwcmlsZScgPT4gNCwKCQknbWFnZ2lvJyA9PiA1LAoJCSdnaXVnbm8nID0+IDYsCgkJJ2x1Z2xpbycgPT4gNywKCQknYWdvc3RvJyA9PiA4LAoJCSdzZXR0ZW1icmUnID0+IDksCgkJJ290dG9icmUnID0+IDEwLAoJCSdub3ZlbWJyZScgPT4gMTEsCgkJJ2RpY2VtYnJlJyA9PiAxMiwKCQkvLyBTcGFuaXNoCgkJJ2VuZXJvJyA9PiAxLAoJCSdmZWJyZXJvJyA9PiAyLAoJCSdtYXJ6bycgPT4gMywKCQknYWJyaWwnID0+IDQsCgkJJ21heW8nID0+IDUsCgkJJ2p1bmlvJyA9PiA2LAoJCSdqdWxpbycgPT4gNywKCQknYWdvc3RvJyA9PiA4LAoJCSdzZXB0aWVtYnJlJyA9PiA5LAoJCSdzZXRpZW1icmUnID0+IDksCgkJJ29jdHVicmUnID0+IDEwLAoJCSdub3ZpZW1icmUnID0+IDExLAoJCSdkaWNpZW1icmUnID0+IDEyLAoJCS8vIEZpbm5pc2gKCQkndGFtbWlrdXUnID0+IDEsCgkJJ2hlbG1pa3V1JyA9PiAyLAoJCSdtYWFsaXNrdXUnID0+IDMsCgkJJ2h1aHRpa3V1JyA9PiA0LAoJCSd0b3Vrb2t1dScgPT4gNSwKCQkna2Vzw6RrdXUnID0+IDYsCgkJJ2hlaW7DpGt1dScgPT4gNywKCQknZWxva3V1JyA9PiA4LAoJCSdzdXVza3V1JyA9PiA5LAoJCSdsb2tha3V1JyA9PiAxMCwKCQknbWFycmFzJyA9PiAxMSwKCQknam91bHVrdXUnID0+IDEyLAoJCS8vIEh1bmdhcmlhbgoJCSdqYW51w6FyJyA9PiAxLAoJCSdmZWJydcOhcicgPT4gMiwKCQknbcOhcmNpdXMnID0+IDMsCgkJJ8OhcHJpbGlzJyA9PiA0LAoJCSdtw6FqdXMnID0+IDUsCgkJJ2rDum5pdXMnID0+IDYsCgkJJ2rDumxpdXMnID0+IDcsCgkJJ2F1Z3VzenR1cycgPT4gOCwKCQknc3plcHRlbWJlcicgPT4gOSwKCQknb2t0w7NiZXInID0+IDEwLAoJCSdub3ZlbWJlcicgPT4gMTEsCgkJJ2RlY2VtYmVyJyA9PiAxMiwKCQkvLyBHcmVlawoJCSfOmc6xzr0nID0+IDEsCgkJJ86mzrXOsicgPT4gMiwKCQknzpzOrM+OJyA9PiAzLAoJCSfOnM6xz44nID0+IDMsCgkJJ86Rz4DPgScgPT4gNCwKCQknzpzOrM65JyA9PiA1LAoJCSfOnM6xz4onID0+IDUsCgkJJ86czrHOuScgPT4gNSwKCQknzpnOv8+Nzr0nID0+IDYsCgkJJ86Zzr/OvScgPT4gNiwKCQknzpnOv8+NzrsnID0+IDcsCgkJJ86Zzr/OuycgPT4gNywKCQknzpHPjc6zJyA9PiA4LAoJCSfOkc+FzrMnID0+IDgsCgkJJ86jzrXPgCcgPT4gOSwKCQknzp/Ous+EJyA9PiAxMCwKCQknzp3Ov86tJyA9PiAxMSwKCQknzpTOtc66JyA9PiAxMiwKCSk7CgoJLyoqCgkgKiBMaXN0IG9mIHRpbWV6b25lcywgYWJicmV2aWF0aW9uID0+IG9mZnNldCBmcm9tIFVUQwoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkdGltZXpvbmUgPSBhcnJheSgKCQknQUNEVCcgPT4gMzc4MDAsCgkJJ0FDSVQnID0+IDI4ODAwLAoJCSdBQ1NUJyA9PiAzNDIwMCwKCQknQUNUJyA9PiAtMTgwMDAsCgkJJ0FDV0RUJyA9PiAzNTEwMCwKCQknQUNXU1QnID0+IDMxNTAwLAoJCSdBRURUJyA9PiAzOTYwMCwKCQknQUVTVCcgPT4gMzYwMDAsCgkJJ0FGVCcgPT4gMTYyMDAsCgkJJ0FLRFQnID0+IC0yODgwMCwKCQknQUtTVCcgPT4gLTMyNDAwLAoJCSdBTURUJyA9PiAxODAwMCwKCQknQU1UJyA9PiAtMTQ0MDAsCgkJJ0FOQVNUJyA9PiA0NjgwMCwKCQknQU5BVCcgPT4gNDMyMDAsCgkJJ0FSVCcgPT4gLTEwODAwLAoJCSdBWk9TVCcgPT4gLTM2MDAsCgkJJ0FaU1QnID0+IDE4MDAwLAoJCSdBWlQnID0+IDE0NDAwLAoJCSdCSU9UJyA9PiAyMTYwMCwKCQknQklUJyA9PiAtNDMyMDAsCgkJJ0JPVCcgPT4gLTE0NDAwLAoJCSdCUlNUJyA9PiAtNzIwMCwKCQknQlJUJyA9PiAtMTA4MDAsCgkJJ0JTVCcgPT4gMzYwMCwKCQknQlRUJyA9PiAyMTYwMCwKCQknQ0FTVCcgPT4gMTgwMDAsCgkJJ0NBVCcgPT4gNzIwMCwKCQknQ0NUJyA9PiAyMzQwMCwKCQknQ0RUJyA9PiAtMTgwMDAsCgkJJ0NFRFQnID0+IDcyMDAsCgkJJ0NFVCcgPT4gMzYwMCwKCQknQ0dTVCcgPT4gLTcyMDAsCgkJJ0NHVCcgPT4gLTEwODAwLAoJCSdDSEFEVCcgPT4gNDk1MDAsCgkJJ0NIQVNUJyA9PiA0NTkwMCwKCQknQ0lTVCcgPT4gLTI4ODAwLAoJCSdDS1QnID0+IC0zNjAwMCwKCQknQ0xEVCcgPT4gLTEwODAwLAoJCSdDTFNUJyA9PiAtMTQ0MDAsCgkJJ0NPVCcgPT4gLTE4MDAwLAoJCSdDU1QnID0+IC0yMTYwMCwKCQknQ1ZUJyA9PiAtMzYwMCwKCQknQ1hUJyA9PiAyNTIwMCwKCQknREFWVCcgPT4gMjUyMDAsCgkJJ0RUQVQnID0+IDM2MDAwLAoJCSdFQURUJyA9PiAtMTgwMDAsCgkJJ0VBU1QnID0+IC0yMTYwMCwKCQknRUFUJyA9PiAxMDgwMCwKCQknRUNUJyA9PiAtMTgwMDAsCgkJJ0VEVCcgPT4gLTE0NDAwLAoJCSdFRVNUJyA9PiAxMDgwMCwKCQknRUVUJyA9PiA3MjAwLAoJCSdFR1QnID0+IC0zNjAwLAoJCSdFS1NUJyA9PiAyMTYwMCwKCQknRVNUJyA9PiAtMTgwMDAsCgkJJ0ZKVCcgPT4gNDMyMDAsCgkJJ0ZLRFQnID0+IC0xMDgwMCwKCQknRktTVCcgPT4gLTE0NDAwLAoJCSdGTlQnID0+IC03MjAwLAoJCSdHQUxUJyA9PiAtMjE2MDAsCgkJJ0dFRFQnID0+IDE0NDAwLAoJCSdHRVNUJyA9PiAxMDgwMCwKCQknR0ZUJyA9PiAtMTA4MDAsCgkJJ0dJTFQnID0+IDQzMjAwLAoJCSdHSVQnID0+IC0zMjQwMCwKCQknR1NUJyA9PiAxNDQwMCwKCQknR1NUJyA9PiAtNzIwMCwKCQknR1lUJyA9PiAtMTQ0MDAsCgkJJ0hBQScgPT4gLTEwODAwLAoJCSdIQUMnID0+IC0xODAwMCwKCQknSEFEVCcgPT4gLTMyNDAwLAoJCSdIQUUnID0+IC0xNDQwMCwKCQknSEFQJyA9PiAtMjUyMDAsCgkJJ0hBUicgPT4gLTIxNjAwLAoJCSdIQVNUJyA9PiAtMzYwMDAsCgkJJ0hBVCcgPT4gLTkwMDAsCgkJJ0hBWScgPT4gLTI4ODAwLAoJCSdIS1NUJyA9PiAyODgwMCwKCQknSE1UJyA9PiAxODAwMCwKCQknSE5BJyA9PiAtMTQ0MDAsCgkJJ0hOQycgPT4gLTIxNjAwLAoJCSdITkUnID0+IC0xODAwMCwKCQknSE5QJyA9PiAtMjg4MDAsCgkJJ0hOUicgPT4gLTI1MjAwLAoJCSdITlQnID0+IC0xMjYwMCwKCQknSE5ZJyA9PiAtMzI0MDAsCgkJJ0lSRFQnID0+IDE2MjAwLAoJCSdJUktTVCcgPT4gMzI0MDAsCgkJJ0lSS1QnID0+IDI4ODAwLAoJCSdJUlNUJyA9PiAxMjYwMCwKCQknSkZEVCcgPT4gLTEwODAwLAoJCSdKRlNUJyA9PiAtMTQ0MDAsCgkJJ0pTVCcgPT4gMzI0MDAsCgkJJ0tHU1QnID0+IDIxNjAwLAoJCSdLR1QnID0+IDE4MDAwLAoJCSdLT1NUJyA9PiAzOTYwMCwKCQknS09WU1QnID0+IDI4ODAwLAoJCSdLT1ZUJyA9PiAyNTIwMCwKCQknS1JBU1QnID0+IDI4ODAwLAoJCSdLUkFUJyA9PiAyNTIwMCwKCQknS1NUJyA9PiAzMjQwMCwKCQknTEhEVCcgPT4gMzk2MDAsCgkJJ0xIU1QnID0+IDM3ODAwLAoJCSdMSU5UJyA9PiA1MDQwMCwKCQknTEtUJyA9PiAyMTYwMCwKCQknTUFHU1QnID0+IDQzMjAwLAoJCSdNQUdUJyA9PiAzOTYwMCwKCQknTUFXVCcgPT4gMjE2MDAsCgkJJ01EVCcgPT4gLTIxNjAwLAoJCSdNRVNaJyA9PiA3MjAwLAoJCSdNRVonID0+IDM2MDAsCgkJJ01IVCcgPT4gNDMyMDAsCgkJJ01JVCcgPT4gLTM0MjAwLAoJCSdNTlNUJyA9PiAzMjQwMCwKCQknTVNEVCcgPT4gMTQ0MDAsCgkJJ01TU1QnID0+IDEwODAwLAoJCSdNU1QnID0+IC0yNTIwMCwKCQknTVVUJyA9PiAxNDQwMCwKCQknTVZUJyA9PiAxODAwMCwKCQknTVlUJyA9PiAyODgwMCwKCQknTkNUJyA9PiAzOTYwMCwKCQknTkRUJyA9PiAtOTAwMCwKCQknTkZUJyA9PiA0MTQwMCwKCQknTk1JVCcgPT4gMzYwMDAsCgkJJ05PVlNUJyA9PiAyNTIwMCwKCQknTk9WVCcgPT4gMjE2MDAsCgkJJ05QVCcgPT4gMjA3MDAsCgkJJ05SVCcgPT4gNDMyMDAsCgkJJ05TVCcgPT4gLTEyNjAwLAoJCSdOVVQnID0+IC0zOTYwMCwKCQknTlpEVCcgPT4gNDY4MDAsCgkJJ05aU1QnID0+IDQzMjAwLAoJCSdPTVNTVCcgPT4gMjUyMDAsCgkJJ09NU1QnID0+IDIxNjAwLAoJCSdQRFQnID0+IC0yNTIwMCwKCQknUEVUJyA9PiAtMTgwMDAsCgkJJ1BFVFNUJyA9PiA0NjgwMCwKCQknUEVUVCcgPT4gNDMyMDAsCgkJJ1BHVCcgPT4gMzYwMDAsCgkJJ1BIT1QnID0+IDQ2ODAwLAoJCSdQSFQnID0+IDI4ODAwLAoJCSdQS1QnID0+IDE4MDAwLAoJCSdQTURUJyA9PiAtNzIwMCwKCQknUE1TVCcgPT4gLTEwODAwLAoJCSdQT05UJyA9PiAzOTYwMCwKCQknUFNUJyA9PiAtMjg4MDAsCgkJJ1BXVCcgPT4gMzI0MDAsCgkJJ1BZU1QnID0+IC0xMDgwMCwKCQknUFlUJyA9PiAtMTQ0MDAsCgkJJ1JFVCcgPT4gMTQ0MDAsCgkJJ1JPVFQnID0+IC0xMDgwMCwKCQknU0FNU1QnID0+IDE4MDAwLAoJCSdTQU1UJyA9PiAxNDQwMCwKCQknU0FTVCcgPT4gNzIwMCwKCQknU0JUJyA9PiAzOTYwMCwKCQknU0NEVCcgPT4gNDY4MDAsCgkJJ1NDU1QnID0+IDQzMjAwLAoJCSdTQ1QnID0+IDE0NDAwLAoJCSdTRVNUJyA9PiAzNjAwLAoJCSdTR1QnID0+IDI4ODAwLAoJCSdTSVQnID0+IDI4ODAwLAoJCSdTUlQnID0+IC0xMDgwMCwKCQknU1NUJyA9PiAtMzk2MDAsCgkJJ1NZU1QnID0+IDEwODAwLAoJCSdTWVQnID0+IDcyMDAsCgkJJ1RGVCcgPT4gMTgwMDAsCgkJJ1RIQVQnID0+IC0zNjAwMCwKCQknVEpUJyA9PiAxODAwMCwKCQknVEtUJyA9PiAtMzYwMDAsCgkJJ1RNVCcgPT4gMTgwMDAsCgkJJ1RPVCcgPT4gNDY4MDAsCgkJJ1RQVCcgPT4gMzI0MDAsCgkJJ1RSVVQnID0+IDM2MDAwLAoJCSdUVlQnID0+IDQzMjAwLAoJCSdUV1QnID0+IDI4ODAwLAoJCSdVWVNUJyA9PiAtNzIwMCwKCQknVVlUJyA9PiAtMTA4MDAsCgkJJ1VaVCcgPT4gMTgwMDAsCgkJJ1ZFVCcgPT4gLTE0NDAwLAoJCSdWTEFTVCcgPT4gMzk2MDAsCgkJJ1ZMQVQnID0+IDM2MDAwLAoJCSdWT1NUJyA9PiAyMTYwMCwKCQknVlVUJyA9PiAzOTYwMCwKCQknV0FTVCcgPT4gNzIwMCwKCQknV0FUJyA9PiAzNjAwLAoJCSdXRFQnID0+IDMyNDAwLAoJCSdXRVNUJyA9PiAzNjAwLAoJCSdXRlQnID0+IDQzMjAwLAoJCSdXSUInID0+IDI1MjAwLAoJCSdXSVQnID0+IDMyNDAwLAoJCSdXSVRBJyA9PiAyODgwMCwKCQknV0tTVCcgPT4gMTgwMDAsCgkJJ1dTVCcgPT4gMjg4MDAsCgkJJ1lBS1NUJyA9PiAzNjAwMCwKCQknWUFLVCcgPT4gMzI0MDAsCgkJJ1lBUFQnID0+IDM2MDAwLAoJCSdZRUtTVCcgPT4gMjE2MDAsCgkJJ1lFS1QnID0+IDE4MDAwLAoJKTsKCgkvKioKCSAqIENhY2hlZCBQQ1JFIGZvciBTaW1wbGVQaWVfUGFyc2VfRGF0ZTo6JGRheQoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGRheV9wY3JlOwoKCS8qKgoJICogQ2FjaGVkIFBDUkUgZm9yIFNpbXBsZVBpZV9QYXJzZV9EYXRlOjokbW9udGgKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRtb250aF9wY3JlOwoKCS8qKgoJICogQXJyYXkgb2YgdXNlci1hZGRlZCBjYWxsYmFjayBtZXRob2RzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkYnVpbHRfaW4gPSBhcnJheSgpOwoKCS8qKgoJICogQXJyYXkgb2YgdXNlci1hZGRlZCBjYWxsYmFjayBtZXRob2RzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkdXNlciA9IGFycmF5KCk7CgoJLyoqCgkgKiBDcmVhdGUgbmV3IFNpbXBsZVBpZV9QYXJzZV9EYXRlIG9iamVjdCwgYW5kIHNldCBzZWxmOjpkYXlfcGNyZSwKCSAqIHNlbGY6Om1vbnRoX3BjcmUsIGFuZCBzZWxmOjpidWlsdF9pbgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBTaW1wbGVQaWVfUGFyc2VfRGF0ZSgpCgl7CgkJJHRoaXMtPmRheV9wY3JlID0gJygnIC4gaW1wbG9kZShhcnJheV9rZXlzKCR0aGlzLT5kYXkpLCAnfCcpIC4gJyknOwoJCSR0aGlzLT5tb250aF9wY3JlID0gJygnIC4gaW1wbG9kZShhcnJheV9rZXlzKCR0aGlzLT5tb250aCksICd8JykgLiAnKSc7CgoJCXN0YXRpYyAkY2FjaGU7CgkJaWYgKCFpc3NldCgkY2FjaGVbZ2V0X2NsYXNzKCR0aGlzKV0pKQoJCXsKCQkJaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ1JlZmxlY3Rpb24nKSkKCQkJewoJCQkJJGNsYXNzID0gbmV3IFJlZmxlY3Rpb25DbGFzcyhnZXRfY2xhc3MoJHRoaXMpKTsKCQkJCSRtZXRob2RzID0gJGNsYXNzLT5nZXRNZXRob2RzKCk7CgkJCQkkYWxsX21ldGhvZHMgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCAoJG1ldGhvZHMgYXMgJG1ldGhvZCkKCQkJCXsKCQkJCQkkYWxsX21ldGhvZHNbXSA9ICRtZXRob2QtPmdldE5hbWUoKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRhbGxfbWV0aG9kcyA9IGdldF9jbGFzc19tZXRob2RzKCR0aGlzKTsKCQkJfQoKCQkJZm9yZWFjaCAoJGFsbF9tZXRob2RzIGFzICRtZXRob2QpCgkJCXsKCQkJCWlmIChzdHJ0b2xvd2VyKHN1YnN0cigkbWV0aG9kLCAwLCA1KSkgPT09ICdkYXRlXycpCgkJCQl7CgkJCQkJJGNhY2hlW2dldF9jbGFzcygkdGhpcyldW10gPSAkbWV0aG9kOwoJCQkJfQoJCQl9CgkJfQoKCQlmb3JlYWNoICgkY2FjaGVbZ2V0X2NsYXNzKCR0aGlzKV0gYXMgJG1ldGhvZCkKCQl7CgkJCSR0aGlzLT5idWlsdF9pbltdID0gJG1ldGhvZDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIG9iamVjdAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCWZ1bmN0aW9uIGdldCgpCgl7CgkJc3RhdGljICRvYmplY3Q7CgkJaWYgKCEkb2JqZWN0KQoJCXsKCQkJJG9iamVjdCA9IG5ldyBTaW1wbGVQaWVfUGFyc2VfRGF0ZTsKCQl9CgkJcmV0dXJuICRvYmplY3Q7Cgl9CgoJLyoqCgkgKiBQYXJzZSBhIGRhdGUKCSAqCgkgKiBAZmluYWwKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRlIERhdGUgdG8gcGFyc2UKCSAqIEByZXR1cm4gaW50IFRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIGRhdGUgc3RyaW5nLCBvciBmYWxzZSBvbiBmYWlsdXJlCgkgKi8KCWZ1bmN0aW9uIHBhcnNlKCRkYXRlKQoJewoJCWZvcmVhY2ggKCR0aGlzLT51c2VyIGFzICRtZXRob2QpCgkJewoJCQlpZiAoKCRyZXR1cm5lZCA9IGNhbGxfdXNlcl9mdW5jKCRtZXRob2QsICRkYXRlKSkgIT09IGZhbHNlKQoJCQl7CgkJCQlyZXR1cm4gJHJldHVybmVkOwoJCQl9CgkJfQoKCQlmb3JlYWNoICgkdGhpcy0+YnVpbHRfaW4gYXMgJG1ldGhvZCkKCQl7CgkJCWlmICgoJHJldHVybmVkID0gY2FsbF91c2VyX2Z1bmMoYXJyYXkoJiR0aGlzLCAkbWV0aG9kKSwgJGRhdGUpKSAhPT0gZmFsc2UpCgkJCXsKCQkJCXJldHVybiAkcmV0dXJuZWQ7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFkZCBhIGNhbGxiYWNrIG1ldGhvZCB0byBwYXJzZSBhIGRhdGUKCSAqCgkgKiBAZmluYWwKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gY2FsbGJhY2sgJGNhbGxiYWNrCgkgKi8KCWZ1bmN0aW9uIGFkZF9jYWxsYmFjaygkY2FsbGJhY2spCgl7CgkJaWYgKGlzX2NhbGxhYmxlKCRjYWxsYmFjaykpCgkJewoJCQkkdGhpcy0+dXNlcltdID0gJGNhbGxiYWNrOwoJCX0KCQllbHNlCgkJewoJCQl0cmlnZ2VyX2Vycm9yKCdVc2VyLXN1cHBsaWVkIGZ1bmN0aW9uIG11c3QgYmUgYSB2YWxpZCBjYWxsYmFjaycsIEVfVVNFUl9XQVJOSU5HKTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBhIHN1cGVyc2V0IG9mIFczQy1EVEYgKGFsbG93cyBoeXBoZW5zIGFuZCBjb2xvbnMgdG8gYmUgb21pdHRlZCwgYXMKCSAqIHdlbGwgYXMgYWxsb3dpbmcgYW55IG9mIHVwcGVyIG9yIGxvd2VyIGNhc2UgIlQiLCBob3Jpem9udGFsIHRhYnMsIG9yCgkgKiBzcGFjZXMgdG8gYmUgdXNlZCBhcyB0aGUgdGltZSBzZXBlcmF0b3IgKGluY2x1ZGluZyBtb3JlIHRoYW4gb25lKSkKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHJldHVybiBpbnQgVGltZXN0YW1wCgkgKi8KCWZ1bmN0aW9uIGRhdGVfdzNjZHRmKCRkYXRlKQoJewoJCXN0YXRpYyAkcGNyZTsKCQlpZiAoISRwY3JlKQoJCXsKCQkJJHllYXIgPSAnKFswLTldezR9KSc7CgkJCSRtb250aCA9ICRkYXkgPSAkaG91ciA9ICRtaW51dGUgPSAkc2Vjb25kID0gJyhbMC05XXsyfSknOwoJCQkkZGVjaW1hbCA9ICcoWzAtOV0qKSc7CgkJCSR6b25lID0gJyg/OihaKXwoWytcLV0pKFswLTldezEsMn0pOj8oWzAtOV17MSwyfSkpJzsKCQkJJHBjcmUgPSAnL14nIC4gJHllYXIgLiAnKD86LT8nIC4gJG1vbnRoIC4gJyg/Oi0/JyAuICRkYXkgLiAnKD86W1R0XHgwOVx4MjBdKycgLiAkaG91ciAuICcoPzo6PycgLiAkbWludXRlIC4gJyg/Ojo/JyAuICRzZWNvbmQgLiAnKD86LicgLiAkZGVjaW1hbCAuICcpPyk/KT8nIC4gJHpvbmUgLiAnKT8pPyk/JC8nOwoJCX0KCQlpZiAocHJlZ19tYXRjaCgkcGNyZSwgJGRhdGUsICRtYXRjaCkpCgkJewoJCQkvKgoJCQlDYXB0dXJpbmcgc3VicGF0dGVybnM6CgkJCTE6IFllYXIKCQkJMjogTW9udGgKCQkJMzogRGF5CgkJCTQ6IEhvdXIKCQkJNTogTWludXRlCgkJCTY6IFNlY29uZAoJCQk3OiBEZWNpbWFsIGZyYWN0aW9uIG9mIGEgc2Vjb25kCgkJCTg6IFp1bHUKCQkJOTogVGltZXpvbmUgwrEKCQkJMTA6IFRpbWV6b25lIGhvdXJzCgkJCTExOiBUaW1lem9uZSBtaW51dGVzCgkJCSovCgoJCQkvLyBGaWxsIGluIGVtcHR5IG1hdGNoZXMKCQkJZm9yICgkaSA9IGNvdW50KCRtYXRjaCk7ICRpIDw9IDM7ICRpKyspCgkJCXsKCQkJCSRtYXRjaFskaV0gPSAnMSc7CgkJCX0KCgkJCWZvciAoJGkgPSBjb3VudCgkbWF0Y2gpOyAkaSA8PSA3OyAkaSsrKQoJCQl7CgkJCQkkbWF0Y2hbJGldID0gJzAnOwoJCQl9CgoJCQkvLyBOdW1lcmljIHRpbWV6b25lCgkJCWlmIChpc3NldCgkbWF0Y2hbOV0pICYmICRtYXRjaFs5XSAhPT0gJycpCgkJCXsKCQkJCSR0aW1lem9uZSA9ICRtYXRjaFsxMF0gKiAzNjAwOwoJCQkJJHRpbWV6b25lICs9ICRtYXRjaFsxMV0gKiA2MDsKCQkJCWlmICgkbWF0Y2hbOV0gPT09ICctJykKCQkJCXsKCQkJCQkkdGltZXpvbmUgPSAwIC0gJHRpbWV6b25lOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRpbWV6b25lID0gMDsKCQkJfQoKCQkJLy8gQ29udmVydCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gYW4gaW50ZWdlciwgdGFraW5nIGRlY2ltYWxzIGludG8gYWNjb3VudAoJCQkkc2Vjb25kID0gcm91bmQoJG1hdGNoWzZdICsgJG1hdGNoWzddIC8gcG93KDEwLCBzdHJsZW4oJG1hdGNoWzddKSkpOwoKCQkJcmV0dXJuIGdtbWt0aW1lKCRtYXRjaFs0XSwgJG1hdGNoWzVdLCAkc2Vjb25kLCAkbWF0Y2hbMl0sICRtYXRjaFszXSwgJG1hdGNoWzFdKSAtICR0aW1lem9uZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFJlbW92ZSBSRkM4MjIgY29tbWVudHMKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHBhcmFtIHN0cmluZyAkZGF0YSBEYXRhIHRvIHN0cmlwIGNvbW1lbnRzIGZyb20KCSAqIEByZXR1cm4gc3RyaW5nIENvbW1lbnQgc3RyaXBwZWQgc3RyaW5nCgkgKi8KCWZ1bmN0aW9uIHJlbW92ZV9yZmMyODIyX2NvbW1lbnRzKCRzdHJpbmcpCgl7CgkJJHN0cmluZyA9IChzdHJpbmcpICRzdHJpbmc7CgkJJHBvc2l0aW9uID0gMDsKCQkkbGVuZ3RoID0gc3RybGVuKCRzdHJpbmcpOwoJCSRkZXB0aCA9IDA7CgoJCSRvdXRwdXQgPSAnJzsKCgkJd2hpbGUgKCRwb3NpdGlvbiA8ICRsZW5ndGggJiYgKCRwb3MgPSBzdHJwb3MoJHN0cmluZywgJygnLCAkcG9zaXRpb24pKSAhPT0gZmFsc2UpCgkJewoJCQkkb3V0cHV0IC49IHN1YnN0cigkc3RyaW5nLCAkcG9zaXRpb24sICRwb3MgLSAkcG9zaXRpb24pOwoJCQkkcG9zaXRpb24gPSAkcG9zICsgMTsKCQkJaWYgKCRzdHJpbmdbJHBvcyAtIDFdICE9PSAnXFwnKQoJCQl7CgkJCQkkZGVwdGgrKzsKCQkJCXdoaWxlICgkZGVwdGggJiYgJHBvc2l0aW9uIDwgJGxlbmd0aCkKCQkJCXsKCQkJCQkkcG9zaXRpb24gKz0gc3RyY3Nwbigkc3RyaW5nLCAnKCknLCAkcG9zaXRpb24pOwoJCQkJCWlmICgkc3RyaW5nWyRwb3NpdGlvbiAtIDFdID09PSAnXFwnKQoJCQkJCXsKCQkJCQkJJHBvc2l0aW9uKys7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCQllbHNlaWYgKGlzc2V0KCRzdHJpbmdbJHBvc2l0aW9uXSkpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKCRzdHJpbmdbJHBvc2l0aW9uXSkKCQkJCQkJewoJCQkJCQkJY2FzZSAnKCc6CgkJCQkJCQkJJGRlcHRoKys7CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAnKSc6CgkJCQkJCQkJJGRlcHRoLS07CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJJHBvc2l0aW9uKys7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRvdXRwdXQgLj0gJygnOwoJCQl9CgkJfQoJCSRvdXRwdXQgLj0gc3Vic3RyKCRzdHJpbmcsICRwb3NpdGlvbik7CgoJCXJldHVybiAkb3V0cHV0OwoJfQoKCS8qKgoJICogUGFyc2UgUkZDMjgyMidzIGRhdGUgZm9ybWF0CgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEByZXR1cm4gaW50IFRpbWVzdGFtcAoJICovCglmdW5jdGlvbiBkYXRlX3JmYzI4MjIoJGRhdGUpCgl7CgkJc3RhdGljICRwY3JlOwoJCWlmICghJHBjcmUpCgkJewoJCQkkd3NwID0gJ1tceDA5XHgyMF0nOwoJCQkkZndzID0gJyg/OicgLiAkd3NwIC4gJyt8JyAuICR3c3AgLiAnKig/Olx4MERceDBBJyAuICR3c3AgLiAnKykrKSc7CgkJCSRvcHRpb25hbF9md3MgPSAkZndzIC4gJz8nOwoJCQkkZGF5X25hbWUgPSAkdGhpcy0+ZGF5X3BjcmU7CgkJCSRtb250aCA9ICR0aGlzLT5tb250aF9wY3JlOwoJCQkkZGF5ID0gJyhbMC05XXsxLDJ9KSc7CgkJCSRob3VyID0gJG1pbnV0ZSA9ICRzZWNvbmQgPSAnKFswLTldezJ9KSc7CgkJCSR5ZWFyID0gJyhbMC05XXsyLDR9KSc7CgkJCSRudW1fem9uZSA9ICcoWytcLV0pKFswLTldezJ9KShbMC05XXsyfSknOwoJCQkkY2hhcmFjdGVyX3pvbmUgPSAnKFtBLVpdezEsNX0pJzsKCQkJJHpvbmUgPSAnKD86JyAuICRudW1fem9uZSAuICd8JyAuICRjaGFyYWN0ZXJfem9uZSAuICcpJzsKCQkJJHBjcmUgPSAnLyg/OicgLiAkb3B0aW9uYWxfZndzIC4gJGRheV9uYW1lIC4gJG9wdGlvbmFsX2Z3cyAuICcsKT8nIC4gJG9wdGlvbmFsX2Z3cyAuICRkYXkgLiAkZndzIC4gJG1vbnRoIC4gJGZ3cyAuICR5ZWFyIC4gJGZ3cyAuICRob3VyIC4gJG9wdGlvbmFsX2Z3cyAuICc6JyAuICRvcHRpb25hbF9md3MgLiAkbWludXRlIC4gJyg/OicgLiAkb3B0aW9uYWxfZndzIC4gJzonIC4gJG9wdGlvbmFsX2Z3cyAuICRzZWNvbmQgLiAnKT8nIC4gJGZ3cyAuICR6b25lIC4gJy9pJzsKCQl9CgkJaWYgKHByZWdfbWF0Y2goJHBjcmUsICR0aGlzLT5yZW1vdmVfcmZjMjgyMl9jb21tZW50cygkZGF0ZSksICRtYXRjaCkpCgkJewoJCQkvKgoJCQlDYXB0dXJpbmcgc3VicGF0dGVybnM6CgkJCTE6IERheSBuYW1lCgkJCTI6IERheQoJCQkzOiBNb250aAoJCQk0OiBZZWFyCgkJCTU6IEhvdXIKCQkJNjogTWludXRlCgkJCTc6IFNlY29uZAoJCQk4OiBUaW1lem9uZSDCsQoJCQk5OiBUaW1lem9uZSBob3VycwoJCQkxMDogVGltZXpvbmUgbWludXRlcwoJCQkxMTogQWxwaGFiZXRpYyB0aW1lem9uZQoJCQkqLwoKCQkJLy8gRmluZCB0aGUgbW9udGggbnVtYmVyCgkJCSRtb250aCA9ICR0aGlzLT5tb250aFtzdHJ0b2xvd2VyKCRtYXRjaFszXSldOwoKCQkJLy8gTnVtZXJpYyB0aW1lem9uZQoJCQlpZiAoJG1hdGNoWzhdICE9PSAnJykKCQkJewoJCQkJJHRpbWV6b25lID0gJG1hdGNoWzldICogMzYwMDsKCQkJCSR0aW1lem9uZSArPSAkbWF0Y2hbMTBdICogNjA7CgkJCQlpZiAoJG1hdGNoWzhdID09PSAnLScpCgkJCQl7CgkJCQkJJHRpbWV6b25lID0gMCAtICR0aW1lem9uZTsKCQkJCX0KCQkJfQoJCQkvLyBDaGFyYWN0ZXIgdGltZXpvbmUKCQkJZWxzZWlmIChpc3NldCgkdGhpcy0+dGltZXpvbmVbc3RydG91cHBlcigkbWF0Y2hbMTFdKV0pKQoJCQl7CgkJCQkkdGltZXpvbmUgPSAkdGhpcy0+dGltZXpvbmVbc3RydG91cHBlcigkbWF0Y2hbMTFdKV07CgkJCX0KCQkJLy8gQXNzdW1lIGV2ZXJ5dGhpbmcgZWxzZSB0byBiZSAtMDAwMAoJCQllbHNlCgkJCXsKCQkJCSR0aW1lem9uZSA9IDA7CgkJCX0KCgkJCS8vIERlYWwgd2l0aCAyLzMgZGlnaXQgeWVhcnMKCQkJaWYgKCRtYXRjaFs0XSA8IDUwKQoJCQl7CgkJCQkkbWF0Y2hbNF0gKz0gMjAwMDsKCQkJfQoJCQllbHNlaWYgKCRtYXRjaFs0XSA8IDEwMDApCgkJCXsKCQkJCSRtYXRjaFs0XSArPSAxOTAwOwoJCQl9CgoJCQkvLyBTZWNvbmQgaXMgb3B0aW9uYWwsIGlmIGl0IGlzIGVtcHR5IHNldCBpdCB0byB6ZXJvCgkJCWlmICgkbWF0Y2hbN10gIT09ICcnKQoJCQl7CgkJCQkkc2Vjb25kID0gJG1hdGNoWzddOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHNlY29uZCA9IDA7CgkJCX0KCgkJCXJldHVybiBnbW1rdGltZSgkbWF0Y2hbNV0sICRtYXRjaFs2XSwgJHNlY29uZCwgJG1vbnRoLCAkbWF0Y2hbMl0sICRtYXRjaFs0XSkgLSAkdGltZXpvbmU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBSRkM4NTAncyBkYXRlIGZvcm1hdAoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAcmV0dXJuIGludCBUaW1lc3RhbXAKCSAqLwoJZnVuY3Rpb24gZGF0ZV9yZmM4NTAoJGRhdGUpCgl7CgkJc3RhdGljICRwY3JlOwoJCWlmICghJHBjcmUpCgkJewoJCQkkc3BhY2UgPSAnW1x4MDlceDIwXSsnOwoJCQkkZGF5X25hbWUgPSAkdGhpcy0+ZGF5X3BjcmU7CgkJCSRtb250aCA9ICR0aGlzLT5tb250aF9wY3JlOwoJCQkkZGF5ID0gJyhbMC05XXsxLDJ9KSc7CgkJCSR5ZWFyID0gJGhvdXIgPSAkbWludXRlID0gJHNlY29uZCA9ICcoWzAtOV17Mn0pJzsKCQkJJHpvbmUgPSAnKFtBLVpdezEsNX0pJzsKCQkJJHBjcmUgPSAnL14nIC4gJGRheV9uYW1lIC4gJywnIC4gJHNwYWNlIC4gJGRheSAuICctJyAuICRtb250aCAuICctJyAuICR5ZWFyIC4gJHNwYWNlIC4gJGhvdXIgLiAnOicgLiAkbWludXRlIC4gJzonIC4gJHNlY29uZCAuICRzcGFjZSAuICR6b25lIC4gJyQvaSc7CgkJfQoJCWlmIChwcmVnX21hdGNoKCRwY3JlLCAkZGF0ZSwgJG1hdGNoKSkKCQl7CgkJCS8qCgkJCUNhcHR1cmluZyBzdWJwYXR0ZXJuczoKCQkJMTogRGF5IG5hbWUKCQkJMjogRGF5CgkJCTM6IE1vbnRoCgkJCTQ6IFllYXIKCQkJNTogSG91cgoJCQk2OiBNaW51dGUKCQkJNzogU2Vjb25kCgkJCTg6IFRpbWV6b25lCgkJCSovCgoJCQkvLyBNb250aAoJCQkkbW9udGggPSAkdGhpcy0+bW9udGhbc3RydG9sb3dlcigkbWF0Y2hbM10pXTsKCgkJCS8vIENoYXJhY3RlciB0aW1lem9uZQoJCQlpZiAoaXNzZXQoJHRoaXMtPnRpbWV6b25lW3N0cnRvdXBwZXIoJG1hdGNoWzhdKV0pKQoJCQl7CgkJCQkkdGltZXpvbmUgPSAkdGhpcy0+dGltZXpvbmVbc3RydG91cHBlcigkbWF0Y2hbOF0pXTsKCQkJfQoJCQkvLyBBc3N1bWUgZXZlcnl0aGluZyBlbHNlIHRvIGJlIC0wMDAwCgkJCWVsc2UKCQkJewoJCQkJJHRpbWV6b25lID0gMDsKCQkJfQoKCQkJLy8gRGVhbCB3aXRoIDIgZGlnaXQgeWVhcgoJCQlpZiAoJG1hdGNoWzRdIDwgNTApCgkJCXsKCQkJCSRtYXRjaFs0XSArPSAyMDAwOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJG1hdGNoWzRdICs9IDE5MDA7CgkJCX0KCgkJCXJldHVybiBnbW1rdGltZSgkbWF0Y2hbNV0sICRtYXRjaFs2XSwgJG1hdGNoWzddLCAkbW9udGgsICRtYXRjaFsyXSwgJG1hdGNoWzRdKSAtICR0aW1lem9uZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIEM5OSdzIGFzY3RpbWUoKSdzIGRhdGUgZm9ybWF0CgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEByZXR1cm4gaW50IFRpbWVzdGFtcAoJICovCglmdW5jdGlvbiBkYXRlX2FzY3RpbWUoJGRhdGUpCgl7CgkJc3RhdGljICRwY3JlOwoJCWlmICghJHBjcmUpCgkJewoJCQkkc3BhY2UgPSAnW1x4MDlceDIwXSsnOwoJCQkkd2RheV9uYW1lID0gJHRoaXMtPmRheV9wY3JlOwoJCQkkbW9uX25hbWUgPSAkdGhpcy0+bW9udGhfcGNyZTsKCQkJJGRheSA9ICcoWzAtOV17MSwyfSknOwoJCQkkaG91ciA9ICRzZWMgPSAkbWluID0gJyhbMC05XXsyfSknOwoJCQkkeWVhciA9ICcoWzAtOV17NH0pJzsKCQkJJHRlcm1pbmF0b3IgPSAnXHgwQT9ceDAwPyc7CgkJCSRwY3JlID0gJy9eJyAuICR3ZGF5X25hbWUgLiAkc3BhY2UgLiAkbW9uX25hbWUgLiAkc3BhY2UgLiAkZGF5IC4gJHNwYWNlIC4gJGhvdXIgLiAnOicgLiAkbWluIC4gJzonIC4gJHNlYyAuICRzcGFjZSAuICR5ZWFyIC4gJHRlcm1pbmF0b3IgLiAnJC9pJzsKCQl9CgkJaWYgKHByZWdfbWF0Y2goJHBjcmUsICRkYXRlLCAkbWF0Y2gpKQoJCXsKCQkJLyoKCQkJQ2FwdHVyaW5nIHN1YnBhdHRlcm5zOgoJCQkxOiBEYXkgbmFtZQoJCQkyOiBNb250aAoJCQkzOiBEYXkKCQkJNDogSG91cgoJCQk1OiBNaW51dGUKCQkJNjogU2Vjb25kCgkJCTc6IFllYXIKCQkJKi8KCgkJCSRtb250aCA9ICR0aGlzLT5tb250aFtzdHJ0b2xvd2VyKCRtYXRjaFsyXSldOwoJCQlyZXR1cm4gZ21ta3RpbWUoJG1hdGNoWzRdLCAkbWF0Y2hbNV0sICRtYXRjaFs2XSwgJG1vbnRoLCAkbWF0Y2hbM10sICRtYXRjaFs3XSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBkYXRlcyB1c2luZyBzdHJ0b3RpbWUoKQoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAcmV0dXJuIGludCBUaW1lc3RhbXAKCSAqLwoJZnVuY3Rpb24gZGF0ZV9zdHJ0b3RpbWUoJGRhdGUpCgl7CgkJJHN0cnRvdGltZSA9IHN0cnRvdGltZSgkZGF0ZSk7CgkJaWYgKCRzdHJ0b3RpbWUgPT09IC0xIHx8ICRzdHJ0b3RpbWUgPT09IGZhbHNlKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gJHN0cnRvdGltZTsKCQl9Cgl9Cn0KCi8qKgogKiBDb250ZW50LXR5cGUgc25pZmZpbmcKICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqLwpjbGFzcyBTaW1wbGVQaWVfQ29udGVudF9UeXBlX1NuaWZmZXIKewoJLyoqCgkgKiBGaWxlIG9iamVjdAoJICoKCSAqIEB2YXIgU2ltcGxlUGllX0ZpbGUKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZpbGU7CgoJLyoqCgkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIGlucHV0IGZpbGUKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIFNpbXBsZVBpZV9Db250ZW50X1R5cGVfU25pZmZlciAkZmlsZSBJbnB1dCBmaWxlCgkgKi8KCWZ1bmN0aW9uIFNpbXBsZVBpZV9Db250ZW50X1R5cGVfU25pZmZlcigkZmlsZSkKCXsKCQkkdGhpcy0+ZmlsZSA9ICRmaWxlOwoJfQoKCS8qKgoJICogR2V0IHRoZSBDb250ZW50LVR5cGUgb2YgdGhlIHNwZWNpZmllZCBmaWxlCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEByZXR1cm4gc3RyaW5nIEFjdHVhbCBDb250ZW50LVR5cGUKCSAqLwoJZnVuY3Rpb24gZ2V0X3R5cGUoKQoJewoJCWlmIChpc3NldCgkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ10pKQoJCXsKCQkJaWYgKCFpc3NldCgkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC1lbmNvZGluZyddKQoJCQkJJiYgKCR0aGlzLT5maWxlLT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ3RleHQvcGxhaW4nCgkJCQkJfHwgJHRoaXMtPmZpbGUtPmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAndGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xJwoJCQkJCXx8ICR0aGlzLT5maWxlLT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4NTktMScpKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnRleHRfb3JfYmluYXJ5KCk7CgkJCX0KCgkJCWlmICgoJHBvcyA9IHN0cnBvcygkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ10sICc7JykpICE9PSBmYWxzZSkKCQkJewoJCQkJJG9mZmljaWFsID0gc3Vic3RyKCR0aGlzLT5maWxlLT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSwgMCwgJHBvcyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkb2ZmaWNpYWwgPSAkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ107CgkJCX0KCQkJJG9mZmljaWFsID0gc3RydG9sb3dlcigkb2ZmaWNpYWwpOwoKCQkJaWYgKCRvZmZpY2lhbCA9PT0gJ3Vua25vd24vdW5rbm93bicKCQkJCXx8ICRvZmZpY2lhbCA9PT0gJ2FwcGxpY2F0aW9uL3Vua25vd24nKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnVua25vd24oKTsKCQkJfQoJCQllbHNlaWYgKHN1YnN0cigkb2ZmaWNpYWwsIC00KSA9PT0gJyt4bWwnCgkJCQl8fCAkb2ZmaWNpYWwgPT09ICd0ZXh0L3htbCcKCQkJCXx8ICRvZmZpY2lhbCA9PT0gJ2FwcGxpY2F0aW9uL3htbCcpCgkJCXsKCQkJCXJldHVybiAkb2ZmaWNpYWw7CgkJCX0KCQkJZWxzZWlmIChzdWJzdHIoJG9mZmljaWFsLCAwLCA2KSA9PT0gJ2ltYWdlLycpCgkJCXsKCQkJCWlmICgkcmV0dXJuID0gJHRoaXMtPmltYWdlKCkpCgkJCQl7CgkJCQkJcmV0dXJuICRyZXR1cm47CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuICRvZmZpY2lhbDsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRvZmZpY2lhbCA9PT0gJ3RleHQvaHRtbCcpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZmVlZF9vcl9odG1sKCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gJG9mZmljaWFsOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAkdGhpcy0+dW5rbm93bigpOwoJCX0KCX0KCgkvKioKCSAqIFNuaWZmIHRleHQgb3IgYmluYXJ5CgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIHN0cmluZyBBY3R1YWwgQ29udGVudC1UeXBlCgkgKi8KCWZ1bmN0aW9uIHRleHRfb3JfYmluYXJ5KCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCAyKSA9PT0gIlx4RkVceEZGIgoJCQl8fCBzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDIpID09PSAiXHhGRlx4RkUiCgkJCXx8IHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNCkgPT09ICJceDAwXHgwMFx4RkVceEZGIgoJCQl8fCBzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDMpID09PSAiXHhFRlx4QkJceEJGIikKCQl7CgkJCXJldHVybiAndGV4dC9wbGFpbic7CgkJfQoJCWVsc2VpZiAocHJlZ19tYXRjaCgnL1tceDAwLVx4MDhceDBFLVx4MUFceDFDLVx4MUZdLycsICR0aGlzLT5maWxlLT5ib2R5KSkKCQl7CgkJCXJldHVybiAnYXBwbGljYXRpb24vb2N0ZWN0LXN0cmVhbSc7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAndGV4dC9wbGFpbic7CgkJfQoJfQoKCS8qKgoJICogU25pZmYgdW5rbm93bgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHJldHVybiBzdHJpbmcgQWN0dWFsIENvbnRlbnQtVHlwZQoJICovCglmdW5jdGlvbiB1bmtub3duKCkKCXsKCQkkd3MgPSBzdHJzcG4oJHRoaXMtPmZpbGUtPmJvZHksICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjAiKTsKCQlpZiAoc3RydG9sb3dlcihzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICR3cywgMTQpKSA9PT0gJzwhZG9jdHlwZSBodG1sJwoJCQl8fCBzdHJ0b2xvd2VyKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgJHdzLCA1KSkgPT09ICc8aHRtbCcKCQkJfHwgc3RydG9sb3dlcihzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICR3cywgNykpID09PSAnPHNjcmlwdCcpCgkJewoJCQlyZXR1cm4gJ3RleHQvaHRtbCc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA1KSA9PT0gJyVQREYtJykKCQl7CgkJCXJldHVybiAnYXBwbGljYXRpb24vcGRmJzsKCQl9CgkJZWxzZWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDExKSA9PT0gJyUhUFMtQWRvYmUtJykKCQl7CgkJCXJldHVybiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA2KSA9PT0gJ0dJRjg3YScKCQkJfHwgc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA2KSA9PT0gJ0dJRjg5YScpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL2dpZic7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA4KSA9PT0gIlx4ODlceDUwXHg0RVx4NDdceDBEXHgwQVx4MUFceDBBIikKCQl7CgkJCXJldHVybiAnaW1hZ2UvcG5nJzsKCQl9CgkJZWxzZWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDMpID09PSAiXHhGRlx4RDhceEZGIikKCQl7CgkJCXJldHVybiAnaW1hZ2UvanBlZyc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCAyKSA9PT0gIlx4NDJceDREIikKCQl7CgkJCXJldHVybiAnaW1hZ2UvYm1wJzsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICR0aGlzLT50ZXh0X29yX2JpbmFyeSgpOwoJCX0KCX0KCgkvKioKCSAqIFNuaWZmIGltYWdlcwoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHJldHVybiBzdHJpbmcgQWN0dWFsIENvbnRlbnQtVHlwZQoJICovCglmdW5jdGlvbiBpbWFnZSgpCgl7CgkJaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNikgPT09ICdHSUY4N2EnCgkJCXx8IHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNikgPT09ICdHSUY4OWEnKQoJCXsKCQkJcmV0dXJuICdpbWFnZS9naWYnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgOCkgPT09ICJceDg5XHg1MFx4NEVceDQ3XHgwRFx4MEFceDFBXHgwQSIpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL3BuZyc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCAzKSA9PT0gIlx4RkZceEQ4XHhGRiIpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL2pwZWcnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgMikgPT09ICJceDQyXHg0RCIpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL2JtcCc7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBTbmlmZiBIVE1MCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIHN0cmluZyBBY3R1YWwgQ29udGVudC1UeXBlCgkgKi8KCWZ1bmN0aW9uIGZlZWRfb3JfaHRtbCgpCgl7CgkJJGxlbiA9IHN0cmxlbigkdGhpcy0+ZmlsZS0+Ym9keSk7CgkJJHBvcyA9IHN0cnNwbigkdGhpcy0+ZmlsZS0+Ym9keSwgIlx4MDlceDBBXHgwRFx4MjAiKTsKCgkJd2hpbGUgKCRwb3MgPCAkbGVuKQoJCXsKCQkJc3dpdGNoICgkdGhpcy0+ZmlsZS0+Ym9keVskcG9zXSkKCQkJewoJCQkJY2FzZSAiXHgwOSI6CgkJCQljYXNlICJceDBBIjoKCQkJCWNhc2UgIlx4MEQiOgoJCQkJY2FzZSAiXHgyMCI6CgkJCQkJJHBvcyArPSBzdHJzcG4oJHRoaXMtPmZpbGUtPmJvZHksICJceDA5XHgwQVx4MERceDIwIiwgJHBvcyk7CgkJCQkJY29udGludWUgMjsKCgkJCQljYXNlICc8JzoKCQkJCQkkcG9zKys7CgkJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gJ3RleHQvaHRtbCc7CgkJCX0KCgkJCWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICRwb3MsIDMpID09PSAnIS0tJykKCQkJewoJCQkJJHBvcyArPSAzOwoJCQkJaWYgKCRwb3MgPCAkbGVuICYmICgkcG9zID0gc3RycG9zKCR0aGlzLT5maWxlLT5ib2R5LCAnLS0+JywgJHBvcykpICE9PSBmYWxzZSkKCQkJCXsKCQkJCQkkcG9zICs9IDM7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuICd0ZXh0L2h0bWwnOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAkcG9zLCAxKSA9PT0gJyEnKQoJCQl7CgkJCQlpZiAoJHBvcyA8ICRsZW4gJiYgKCRwb3MgPSBzdHJwb3MoJHRoaXMtPmZpbGUtPmJvZHksICc+JywgJHBvcykpICE9PSBmYWxzZSkKCQkJCXsKCQkJCQkkcG9zKys7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuICd0ZXh0L2h0bWwnOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAkcG9zLCAxKSA9PT0gJz8nKQoJCQl7CgkJCQlpZiAoJHBvcyA8ICRsZW4gJiYgKCRwb3MgPSBzdHJwb3MoJHRoaXMtPmZpbGUtPmJvZHksICc/PicsICRwb3MpKSAhPT0gZmFsc2UpCgkJCQl7CgkJCQkJJHBvcyArPSAyOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiAndGV4dC9odG1sJzsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgJHBvcywgMykgPT09ICdyc3MnCgkJCQl8fCBzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICRwb3MsIDcpID09PSAncmRmOlJERicpCgkJCXsKCQkJCXJldHVybiAnYXBwbGljYXRpb24vcnNzK3htbCc7CgkJCX0KCQkJZWxzZWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICRwb3MsIDQpID09PSAnZmVlZCcpCgkJCXsKCQkJCXJldHVybiAnYXBwbGljYXRpb24vYXRvbSt4bWwnOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuICd0ZXh0L2h0bWwnOwoJCQl9CgkJfQoKCQlyZXR1cm4gJ3RleHQvaHRtbCc7Cgl9Cn0KCi8qKgogKiBQYXJzZXMgdGhlIFhNTCBEZWNsYXJhdGlvbgogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICovCmNsYXNzIFNpbXBsZVBpZV9YTUxfRGVjbGFyYXRpb25fUGFyc2VyCnsKCS8qKgoJICogWE1MIFZlcnNpb24KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICR2ZXJzaW9uID0gJzEuMCc7CgoJLyoqCgkgKiBFbmNvZGluZwoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGVuY29kaW5nID0gJ1VURi04JzsKCgkvKioKCSAqIFN0YW5kYWxvbmUKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBib29sCgkgKi8KCXZhciAkc3RhbmRhbG9uZSA9IGZhbHNlOwoKCS8qKgoJICogQ3VycmVudCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRzdGF0ZSA9ICdiZWZvcmVfdmVyc2lvbl9uYW1lJzsKCgkvKioKCSAqIElucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZGF0YSA9ICcnOwoKCS8qKgoJICogSW5wdXQgZGF0YSBsZW5ndGggKHRvIGF2b2lkIGNhbGxpbmcgc3RybGVuKCkgZXZlcnl0aW1lIHRoaXMgaXMgbmVlZGVkKQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBpbnQKCSAqLwoJdmFyICRkYXRhX2xlbmd0aCA9IDA7CgoJLyoqCgkgKiBDdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyCgkgKgoJICogQHZhciBpbnQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHBvc2l0aW9uID0gMDsKCgkvKioKCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgaW5wdXQgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIElucHV0IGRhdGEKCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllX1hNTF9EZWNsYXJhdGlvbl9QYXJzZXIoJGRhdGEpCgl7CgkJJHRoaXMtPmRhdGEgPSAkZGF0YTsKCQkkdGhpcy0+ZGF0YV9sZW5ndGggPSBzdHJsZW4oJHRoaXMtPmRhdGEpOwoJfQoKCS8qKgoJICogUGFyc2UgdGhlIGlucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHJldHVybiBib29sIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoJICovCglmdW5jdGlvbiBwYXJzZSgpCgl7CgkJd2hpbGUgKCR0aGlzLT5zdGF0ZSAmJiAkdGhpcy0+c3RhdGUgIT09ICdlbWl0JyAmJiAkdGhpcy0+aGFzX2RhdGEoKSkKCQl7CgkJCSRzdGF0ZSA9ICR0aGlzLT5zdGF0ZTsKCQkJJHRoaXMtPiRzdGF0ZSgpOwoJCX0KCQkkdGhpcy0+ZGF0YSA9ICcnOwoJCWlmICgkdGhpcy0+c3RhdGUgPT09ICdlbWl0JykKCQl7CgkJCXJldHVybiB0cnVlOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+dmVyc2lvbiA9ICcnOwoJCQkkdGhpcy0+ZW5jb2RpbmcgPSAnJzsKCQkJJHRoaXMtPnN0YW5kYWxvbmUgPSAnJzsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZGF0YSBiZXlvbmQgdGhlIHBvaW50ZXIKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZXJlIGlzIGZ1cnRoZXIgZGF0YSwgZmFsc2UgaWYgbm90CgkgKi8KCWZ1bmN0aW9uIGhhc19kYXRhKCkKCXsKCQlyZXR1cm4gKGJvb2wpICgkdGhpcy0+cG9zaXRpb24gPCAkdGhpcy0+ZGF0YV9sZW5ndGgpOwoJfQoKCS8qKgoJICogQWR2YW5jZSBwYXN0IGFueSB3aGl0ZXNwYWNlCgkgKgoJICogQHJldHVybiBpbnQgTnVtYmVyIG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBwYXNzZWQKCSAqLwoJZnVuY3Rpb24gc2tpcF93aGl0ZXNwYWNlKCkKCXsKCQkkd2hpdGVzcGFjZSA9IHN0cnNwbigkdGhpcy0+ZGF0YSwgIlx4MDlceDBBXHgwRFx4MjAiLCAkdGhpcy0+cG9zaXRpb24pOwoJCSR0aGlzLT5wb3NpdGlvbiArPSAkd2hpdGVzcGFjZTsKCQlyZXR1cm4gJHdoaXRlc3BhY2U7Cgl9CgoJLyoqCgkgKiBSZWFkIHZhbHVlCgkgKi8KCWZ1bmN0aW9uIGdldF92YWx1ZSgpCgl7CgkJJHF1b3RlID0gc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDEpOwoJCWlmICgkcXVvdGUgPT09ICciJyB8fCAkcXVvdGUgPT09ICInIikKCQl7CgkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkkbGVuID0gc3RyY3NwbigkdGhpcy0+ZGF0YSwgJHF1b3RlLCAkdGhpcy0+cG9zaXRpb24pOwoJCQlpZiAoJHRoaXMtPmhhc19kYXRhKCkpCgkJCXsKCQkJCSR2YWx1ZSA9IHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAkbGVuKTsKCQkJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuICsgMTsKCQkJCXJldHVybiAkdmFsdWU7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIGJlZm9yZV92ZXJzaW9uX25hbWUoKQoJewoJCWlmICgkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCkpCgkJewoJCQkkdGhpcy0+c3RhdGUgPSAndmVyc2lvbl9uYW1lJzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0YXRlID0gZmFsc2U7CgkJfQoJfQoKCWZ1bmN0aW9uIHZlcnNpb25fbmFtZSgpCgl7CgkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCA3KSA9PT0gJ3ZlcnNpb24nKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDc7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJJHRoaXMtPnN0YXRlID0gJ3ZlcnNpb25fZXF1YWxzJzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0YXRlID0gZmFsc2U7CgkJfQoJfQoKCWZ1bmN0aW9uIHZlcnNpb25fZXF1YWxzKCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDEpID09PSAnPScpCgkJewoJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJJHRoaXMtPnNraXBfd2hpdGVzcGFjZSgpOwoJCQkkdGhpcy0+c3RhdGUgPSAndmVyc2lvbl92YWx1ZSc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiB2ZXJzaW9uX3ZhbHVlKCkKCXsKCQlpZiAoJHRoaXMtPnZlcnNpb24gPSAkdGhpcy0+Z2V0X3ZhbHVlKCkpCgkJewoJCQkkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCk7CgkJCWlmICgkdGhpcy0+aGFzX2RhdGEoKSkKCQkJewoJCQkJJHRoaXMtPnN0YXRlID0gJ2VuY29kaW5nX25hbWUnOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPnN0YXRlID0gJ2VtaXQnOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9ICdzdGFuZGFsb25lX25hbWUnOwoJCX0KCX0KCglmdW5jdGlvbiBlbmNvZGluZ19uYW1lKCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDgpID09PSAnZW5jb2RpbmcnKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDg7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJJHRoaXMtPnN0YXRlID0gJ2VuY29kaW5nX2VxdWFscyc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiBlbmNvZGluZ19lcXVhbHMoKQoJewoJCWlmIChzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgMSkgPT09ICc9JykKCQl7CgkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCk7CgkJCSR0aGlzLT5zdGF0ZSA9ICdlbmNvZGluZ192YWx1ZSc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiBlbmNvZGluZ192YWx1ZSgpCgl7CgkJaWYgKCR0aGlzLT5lbmNvZGluZyA9ICR0aGlzLT5nZXRfdmFsdWUoKSkKCQl7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJaWYgKCR0aGlzLT5oYXNfZGF0YSgpKQoJCQl7CgkJCQkkdGhpcy0+c3RhdGUgPSAnc3RhbmRhbG9uZV9uYW1lJzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5zdGF0ZSA9ICdlbWl0JzsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gc3RhbmRhbG9uZV9uYW1lKCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDEwKSA9PT0gJ3N0YW5kYWxvbmUnKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDEwOwoJCQkkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCk7CgkJCSR0aGlzLT5zdGF0ZSA9ICdzdGFuZGFsb25lX2VxdWFscyc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiBzdGFuZGFsb25lX2VxdWFscygpCgl7CgkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAxKSA9PT0gJz0nKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uKys7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJJHRoaXMtPnN0YXRlID0gJ3N0YW5kYWxvbmVfdmFsdWUnOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gc3RhbmRhbG9uZV92YWx1ZSgpCgl7CgkJaWYgKCRzdGFuZGFsb25lID0gJHRoaXMtPmdldF92YWx1ZSgpKQoJCXsKCQkJc3dpdGNoICgkc3RhbmRhbG9uZSkKCQkJewoJCQkJY2FzZSAneWVzJzoKCQkJCQkkdGhpcy0+c3RhbmRhbG9uZSA9IHRydWU7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnbm8nOgoJCQkJCSR0aGlzLT5zdGFuZGFsb25lID0gZmFsc2U7CgkJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQkJCQlyZXR1cm47CgkJCX0KCgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJaWYgKCR0aGlzLT5oYXNfZGF0YSgpKQoJCQl7CgkJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5zdGF0ZSA9ICdlbWl0JzsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9Mb2NhdG9yCnsKCXZhciAkdXNlcmFnZW50OwoJdmFyICR0aW1lb3V0OwoJdmFyICRmaWxlOwoJdmFyICRsb2NhbCA9IGFycmF5KCk7Cgl2YXIgJGVsc2V3aGVyZSA9IGFycmF5KCk7Cgl2YXIgJGZpbGVfY2xhc3MgPSAnU2ltcGxlUGllX0ZpbGUnOwoJdmFyICRjYWNoZWRfZW50aXRpZXMgPSBhcnJheSgpOwoJdmFyICRodHRwX2Jhc2U7Cgl2YXIgJGJhc2U7Cgl2YXIgJGJhc2VfbG9jYXRpb24gPSAwOwoJdmFyICRjaGVja2VkX2ZlZWRzID0gMDsKCXZhciAkbWF4X2NoZWNrZWRfZmVlZHMgPSAxMDsKCXZhciAkY29udGVudF90eXBlX3NuaWZmZXJfY2xhc3MgPSAnU2ltcGxlUGllX0NvbnRlbnRfVHlwZV9TbmlmZmVyJzsKCglmdW5jdGlvbiBTaW1wbGVQaWVfTG9jYXRvcigmJGZpbGUsICR0aW1lb3V0ID0gMTAsICR1c2VyYWdlbnQgPSBudWxsLCAkZmlsZV9jbGFzcyA9ICdTaW1wbGVQaWVfRmlsZScsICRtYXhfY2hlY2tlZF9mZWVkcyA9IDEwLCAkY29udGVudF90eXBlX3NuaWZmZXJfY2xhc3MgPSAnU2ltcGxlUGllX0NvbnRlbnRfVHlwZV9TbmlmZmVyJykKCXsKCQkkdGhpcy0+ZmlsZSA9JiAkZmlsZTsKCQkkdGhpcy0+ZmlsZV9jbGFzcyA9ICRmaWxlX2NsYXNzOwoJCSR0aGlzLT51c2VyYWdlbnQgPSAkdXNlcmFnZW50OwoJCSR0aGlzLT50aW1lb3V0ID0gJHRpbWVvdXQ7CgkJJHRoaXMtPm1heF9jaGVja2VkX2ZlZWRzID0gJG1heF9jaGVja2VkX2ZlZWRzOwoJCSR0aGlzLT5jb250ZW50X3R5cGVfc25pZmZlcl9jbGFzcyA9ICRjb250ZW50X3R5cGVfc25pZmZlcl9jbGFzczsKCX0KCglmdW5jdGlvbiBmaW5kKCR0eXBlID0gU0lNUExFUElFX0xPQ0FUT1JfQUxMKQoJewoJCWlmICgkdGhpcy0+aXNfZmVlZCgkdGhpcy0+ZmlsZSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmZpbGU7CgkJfQoKCQlpZiAoJHRoaXMtPmZpbGUtPm1ldGhvZCAmIFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9SRU1PVEUpCgkJewoJCQkkc25pZmZlciA9IG5ldyAkdGhpcy0+Y29udGVudF90eXBlX3NuaWZmZXJfY2xhc3MoJHRoaXMtPmZpbGUpOwoJCQlpZiAoJHNuaWZmZXItPmdldF90eXBlKCkgIT09ICd0ZXh0L2h0bWwnKQoJCQl7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoJCX0KCgkJaWYgKCR0eXBlICYgflNJTVBMRVBJRV9MT0NBVE9SX05PTkUpCgkJewoJCQkkdGhpcy0+Z2V0X2Jhc2UoKTsKCQl9CgoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9MT0NBVE9SX0FVVE9ESVNDT1ZFUlkgJiYgJHdvcmtpbmcgPSAkdGhpcy0+YXV0b2Rpc2NvdmVyeSgpKQoJCXsKCQkJcmV0dXJuICR3b3JraW5nOwoJCX0KCgkJaWYgKCR0eXBlICYgKFNJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0VYVEVOU0lPTiB8IFNJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0JPRFkgfCBTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfRVhURU5TSU9OIHwgU0lNUExFUElFX0xPQ0FUT1JfUkVNT1RFX0JPRFkpICYmICR0aGlzLT5nZXRfbGlua3MoKSkKCQl7CgkJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0VYVEVOU0lPTiAmJiAkd29ya2luZyA9ICR0aGlzLT5leHRlbnNpb24oJHRoaXMtPmxvY2FsKSkKCQkJewoJCQkJcmV0dXJuICR3b3JraW5nOwoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfTE9DQVRPUl9MT0NBTF9CT0RZICYmICR3b3JraW5nID0gJHRoaXMtPmJvZHkoJHRoaXMtPmxvY2FsKSkKCQkJewoJCQkJcmV0dXJuICR3b3JraW5nOwoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfRVhURU5TSU9OICYmICR3b3JraW5nID0gJHRoaXMtPmV4dGVuc2lvbigkdGhpcy0+ZWxzZXdoZXJlKSkKCQkJewoJCQkJcmV0dXJuICR3b3JraW5nOwoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfQk9EWSAmJiAkd29ya2luZyA9ICR0aGlzLT5ib2R5KCR0aGlzLT5lbHNld2hlcmUpKQoJCQl7CgkJCQlyZXR1cm4gJHdvcmtpbmc7CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJZnVuY3Rpb24gaXNfZmVlZCgmJGZpbGUpCgl7CgkJaWYgKCRmaWxlLT5tZXRob2QgJiBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfUkVNT1RFKQoJCXsKCQkJJHNuaWZmZXIgPSBuZXcgJHRoaXMtPmNvbnRlbnRfdHlwZV9zbmlmZmVyX2NsYXNzKCRmaWxlKTsKCQkJJHNuaWZmZWQgPSAkc25pZmZlci0+Z2V0X3R5cGUoKTsKCQkJaWYgKGluX2FycmF5KCRzbmlmZmVkLCBhcnJheSgnYXBwbGljYXRpb24vcnNzK3htbCcsICdhcHBsaWNhdGlvbi9yZGYreG1sJywgJ3RleHQvcmRmJywgJ2FwcGxpY2F0aW9uL2F0b20reG1sJywgJ3RleHQveG1sJywgJ2FwcGxpY2F0aW9uL3htbCcpKSkKCQkJewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJZWxzZWlmICgkZmlsZS0+bWV0aG9kICYgU0lNUExFUElFX0ZJTEVfU09VUkNFX0xPQ0FMKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2Jhc2UoKQoJewoJCSR0aGlzLT5odHRwX2Jhc2UgPSAkdGhpcy0+ZmlsZS0+dXJsOwoJCSR0aGlzLT5iYXNlID0gJHRoaXMtPmh0dHBfYmFzZTsKCQkkZWxlbWVudHMgPSBTaW1wbGVQaWVfTWlzYzo6Z2V0X2VsZW1lbnQoJ2Jhc2UnLCAkdGhpcy0+ZmlsZS0+Ym9keSk7CgkJZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRlbGVtZW50KQoJCXsKCQkJaWYgKCRlbGVtZW50WydhdHRyaWJzJ11bJ2hyZWYnXVsnZGF0YSddICE9PSAnJykKCQkJewoJCQkJJHRoaXMtPmJhc2UgPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwodHJpbSgkZWxlbWVudFsnYXR0cmlicyddWydocmVmJ11bJ2RhdGEnXSksICR0aGlzLT5odHRwX2Jhc2UpOwoJCQkJJHRoaXMtPmJhc2VfbG9jYXRpb24gPSAkZWxlbWVudFsnb2Zmc2V0J107CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBhdXRvZGlzY292ZXJ5KCkKCXsKCQkkbGlua3MgPSBhcnJheV9tZXJnZShTaW1wbGVQaWVfTWlzYzo6Z2V0X2VsZW1lbnQoJ2xpbmsnLCAkdGhpcy0+ZmlsZS0+Ym9keSksIFNpbXBsZVBpZV9NaXNjOjpnZXRfZWxlbWVudCgnYScsICR0aGlzLT5maWxlLT5ib2R5KSwgU2ltcGxlUGllX01pc2M6OmdldF9lbGVtZW50KCdhcmVhJywgJHRoaXMtPmZpbGUtPmJvZHkpKTsKCQkkZG9uZSA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKQoJCXsKCQkJaWYgKCR0aGlzLT5jaGVja2VkX2ZlZWRzID09ICR0aGlzLT5tYXhfY2hlY2tlZF9mZWVkcykKCQkJewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJ2hyZWYnXVsnZGF0YSddKSAmJiBpc3NldCgkbGlua1snYXR0cmlicyddWydyZWwnXVsnZGF0YSddKSkKCQkJewoJCQkJJHJlbCA9IGFycmF5X3VuaXF1ZShTaW1wbGVQaWVfTWlzYzo6c3BhY2Vfc2VwZXJhdGVkX3Rva2VucyhzdHJ0b2xvd2VyKCRsaW5rWydhdHRyaWJzJ11bJ3JlbCddWydkYXRhJ10pKSk7CgoJCQkJaWYgKCR0aGlzLT5iYXNlX2xvY2F0aW9uIDwgJGxpbmtbJ29mZnNldCddKQoJCQkJewoJCQkJCSRocmVmID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKHRyaW0oJGxpbmtbJ2F0dHJpYnMnXVsnaHJlZiddWydkYXRhJ10pLCAkdGhpcy0+YmFzZSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJGhyZWYgPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwodHJpbSgkbGlua1snYXR0cmlicyddWydocmVmJ11bJ2RhdGEnXSksICR0aGlzLT5odHRwX2Jhc2UpOwoJCQkJfQoKCQkJCWlmICghaW5fYXJyYXkoJGhyZWYsICRkb25lKSAmJiBpbl9hcnJheSgnZmVlZCcsICRyZWwpIHx8IChpbl9hcnJheSgnYWx0ZXJuYXRlJywgJHJlbCkgJiYgIWVtcHR5KCRsaW5rWydhdHRyaWJzJ11bJ3R5cGUnXVsnZGF0YSddKSAmJiBpbl9hcnJheShzdHJ0b2xvd2VyKFNpbXBsZVBpZV9NaXNjOjpwYXJzZV9taW1lKCRsaW5rWydhdHRyaWJzJ11bJ3R5cGUnXVsnZGF0YSddKSksIGFycmF5KCdhcHBsaWNhdGlvbi9yc3MreG1sJywgJ2FwcGxpY2F0aW9uL2F0b20reG1sJykpKSkKCQkJCXsKCQkJCQkkdGhpcy0+Y2hlY2tlZF9mZWVkcysrOwoJCQkJCSRmZWVkID0mIG5ldyAkdGhpcy0+ZmlsZV9jbGFzcygkaHJlZiwgJHRoaXMtPnRpbWVvdXQsIDUsIG51bGwsICR0aGlzLT51c2VyYWdlbnQpOwoJCQkJCWlmICgkdGhpcy0+aXNfZmVlZCgkZmVlZCkpCgkJCQkJewoJCQkJCQlyZXR1cm4gJGZlZWQ7CgkJCQkJfQoJCQkJfQoJCQkJJGRvbmVbXSA9ICRocmVmOwoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCWZ1bmN0aW9uIGdldF9saW5rcygpCgl7CgkJJGxpbmtzID0gU2ltcGxlUGllX01pc2M6OmdldF9lbGVtZW50KCdhJywgJHRoaXMtPmZpbGUtPmJvZHkpOwoJCWZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykKCQl7CgkJCWlmIChpc3NldCgkbGlua1snYXR0cmlicyddWydocmVmJ11bJ2RhdGEnXSkpCgkJCXsKCQkJCSRocmVmID0gdHJpbSgkbGlua1snYXR0cmlicyddWydocmVmJ11bJ2RhdGEnXSk7CgkJCQkkcGFyc2VkID0gU2ltcGxlUGllX01pc2M6OnBhcnNlX3VybCgkaHJlZik7CgkJCQlpZiAoJHBhcnNlZFsnc2NoZW1lJ10gPT09ICcnIHx8IHByZWdfbWF0Y2goJy9eKGh0dHAocyl8ZmVlZCk/JC9pJywgJHBhcnNlZFsnc2NoZW1lJ10pKQoJCQkJewoJCQkJCWlmICgkdGhpcy0+YmFzZV9sb2NhdGlvbiA8ICRsaW5rWydvZmZzZXQnXSkKCQkJCQl7CgkJCQkJCSRocmVmID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKHRyaW0oJGxpbmtbJ2F0dHJpYnMnXVsnaHJlZiddWydkYXRhJ10pLCAkdGhpcy0+YmFzZSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRocmVmID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKHRyaW0oJGxpbmtbJ2F0dHJpYnMnXVsnaHJlZiddWydkYXRhJ10pLCAkdGhpcy0+aHR0cF9iYXNlKTsKCQkJCQl9CgoJCQkJCSRjdXJyZW50ID0gU2ltcGxlUGllX01pc2M6OnBhcnNlX3VybCgkdGhpcy0+ZmlsZS0+dXJsKTsKCgkJCQkJaWYgKCRwYXJzZWRbJ2F1dGhvcml0eSddID09PSAnJyB8fCAkcGFyc2VkWydhdXRob3JpdHknXSA9PSAkY3VycmVudFsnYXV0aG9yaXR5J10pCgkJCQkJewoJCQkJCQkkdGhpcy0+bG9jYWxbXSA9ICRocmVmOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkdGhpcy0+ZWxzZXdoZXJlW10gPSAkaHJlZjsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJJHRoaXMtPmxvY2FsID0gYXJyYXlfdW5pcXVlKCR0aGlzLT5sb2NhbCk7CgkJJHRoaXMtPmVsc2V3aGVyZSA9IGFycmF5X3VuaXF1ZSgkdGhpcy0+ZWxzZXdoZXJlKTsKCQlpZiAoIWVtcHR5KCR0aGlzLT5sb2NhbCkgfHwgIWVtcHR5KCR0aGlzLT5lbHNld2hlcmUpKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCWZ1bmN0aW9uIGV4dGVuc2lvbigmJGFycmF5KQoJewoJCWZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkKCQl7CgkJCWlmICgkdGhpcy0+Y2hlY2tlZF9mZWVkcyA9PSAkdGhpcy0+bWF4X2NoZWNrZWRfZmVlZHMpCgkJCXsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmIChpbl9hcnJheShzdHJ0b2xvd2VyKHN0cnJjaHIoJHZhbHVlLCAnLicpKSwgYXJyYXkoJy5yc3MnLCAnLnJkZicsICcuYXRvbScsICcueG1sJykpKQoJCQl7CgkJCQkkdGhpcy0+Y2hlY2tlZF9mZWVkcysrOwoJCQkJJGZlZWQgPSYgbmV3ICR0aGlzLT5maWxlX2NsYXNzKCR2YWx1ZSwgJHRoaXMtPnRpbWVvdXQsIDUsIG51bGwsICR0aGlzLT51c2VyYWdlbnQpOwoJCQkJaWYgKCR0aGlzLT5pc19mZWVkKCRmZWVkKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGZlZWQ7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJdW5zZXQoJGFycmF5WyRrZXldKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCglmdW5jdGlvbiBib2R5KCYkYXJyYXkpCgl7CgkJZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKQoJCXsKCQkJaWYgKCR0aGlzLT5jaGVja2VkX2ZlZWRzID09ICR0aGlzLT5tYXhfY2hlY2tlZF9mZWVkcykKCQkJewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKHByZWdfbWF0Y2goJy8ocnNzfHJkZnxhdG9tfHhtbCkvaScsICR2YWx1ZSkpCgkJCXsKCQkJCSR0aGlzLT5jaGVja2VkX2ZlZWRzKys7CgkJCQkkZmVlZCA9JiBuZXcgJHRoaXMtPmZpbGVfY2xhc3MoJHZhbHVlLCAkdGhpcy0+dGltZW91dCwgNSwgbnVsbCwgJHRoaXMtPnVzZXJhZ2VudCk7CgkJCQlpZiAoJHRoaXMtPmlzX2ZlZWQoJGZlZWQpKQoJCQkJewoJCQkJCXJldHVybiAkZmVlZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQl1bnNldCgkYXJyYXlbJGtleV0pOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQp9CgpjbGFzcyBTaW1wbGVQaWVfUGFyc2VyCnsKCXZhciAkZXJyb3JfY29kZTsKCXZhciAkZXJyb3Jfc3RyaW5nOwoJdmFyICRjdXJyZW50X2xpbmU7Cgl2YXIgJGN1cnJlbnRfY29sdW1uOwoJdmFyICRjdXJyZW50X2J5dGU7Cgl2YXIgJHNlcGFyYXRvciA9ICcgJzsKCXZhciAkZmVlZCA9IGZhbHNlOwoJdmFyICRuYW1lc3BhY2UgPSBhcnJheSgnJyk7Cgl2YXIgJGVsZW1lbnQgPSBhcnJheSgnJyk7Cgl2YXIgJHhtbF9iYXNlID0gYXJyYXkoJycpOwoJdmFyICR4bWxfYmFzZV9leHBsaWNpdCA9IGFycmF5KGZhbHNlKTsKCXZhciAkeG1sX2xhbmcgPSBhcnJheSgnJyk7Cgl2YXIgJGRhdGEgPSBhcnJheSgpOwoJdmFyICRkYXRhcyA9IGFycmF5KGFycmF5KCkpOwoJdmFyICRjdXJyZW50X3hodG1sX2NvbnN0cnVjdCA9IC0xOwoJdmFyICRlbmNvZGluZzsKCglmdW5jdGlvbiBwYXJzZSgmJGRhdGEsICRlbmNvZGluZykKCXsKCQkvLyBVc2UgVVRGLTggaWYgd2UgZ2V0IHBhc3NlZCBVUy1BU0NJSSwgYXMgZXZlcnkgVVMtQVNDSUkgY2hhcmFjdGVyIGlzIGEgVVRGLTggY2hhcmFjdGVyCgkJaWYgKHN0cnRvdXBwZXIoJGVuY29kaW5nKSA9PSAnVVMtQVNDSUknKQoJCXsKCQkJJHRoaXMtPmVuY29kaW5nID0gJ1VURi04JzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmVuY29kaW5nID0gJGVuY29kaW5nOwoJCX0KCgkJLy8gU3RyaXAgQk9NOgoJCS8vIFVURi0zMiBCaWcgRW5kaWFuIEJPTQoJCWlmIChzdWJzdHIoJGRhdGEsIDAsIDQpID09PSAiXHgwMFx4MDBceEZFXHhGRiIpCgkJewoJCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgNCk7CgkJfQoJCS8vIFVURi0zMiBMaXR0bGUgRW5kaWFuIEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCA0KSA9PT0gIlx4RkZceEZFXHgwMFx4MDAiKQoJCXsKCQkJJGRhdGEgPSBzdWJzdHIoJGRhdGEsIDQpOwoJCX0KCQkvLyBVVEYtMTYgQmlnIEVuZGlhbiBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMikgPT09ICJceEZFXHhGRiIpCgkJewoJCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgMik7CgkJfQoJCS8vIFVURi0xNiBMaXR0bGUgRW5kaWFuIEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCAyKSA9PT0gIlx4RkZceEZFIikKCQl7CgkJCSRkYXRhID0gc3Vic3RyKCRkYXRhLCAyKTsKCQl9CgkJLy8gVVRGLTggQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDMpID09PSAiXHhFRlx4QkJceEJGIikKCQl7CgkJCSRkYXRhID0gc3Vic3RyKCRkYXRhLCAzKTsKCQl9CgoJCWlmIChzdWJzdHIoJGRhdGEsIDAsIDUpID09PSAnPD94bWwnICYmIHN0cnNwbihzdWJzdHIoJGRhdGEsIDUsIDEpLCAiXHgwOVx4MEFceDBEXHgyMCIpICYmICgkcG9zID0gc3RycG9zKCRkYXRhLCAnPz4nKSkgIT09IGZhbHNlKQoJCXsKCQkJJGRlY2xhcmF0aW9uID0gbmV3IFNpbXBsZVBpZV9YTUxfRGVjbGFyYXRpb25fUGFyc2VyKHN1YnN0cigkZGF0YSwgNSwgJHBvcyAtIDUpKTsKCQkJaWYgKCRkZWNsYXJhdGlvbi0+cGFyc2UoKSkKCQkJewoJCQkJJGRhdGEgPSBzdWJzdHIoJGRhdGEsICRwb3MgKyAyKTsKCQkJCSRkYXRhID0gJzw/eG1sIHZlcnNpb249IicgLiAkZGVjbGFyYXRpb24tPnZlcnNpb24gLiAnIiBlbmNvZGluZz0iJyAuICRlbmNvZGluZyAuICciIHN0YW5kYWxvbmU9IicgLiAoKCRkZWNsYXJhdGlvbi0+c3RhbmRhbG9uZSkgPyAneWVzJyA6ICdubycpIC4gJyI/PicgLiAkZGF0YTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5lcnJvcl9zdHJpbmcgPSAnU2ltcGxlUGllIGJ1ZyEgUGxlYXNlIHJlcG9ydCB0aGlzISc7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCS8vIFdvcmsgYXJvdW5kIGxpYnhtbCBidWcKCQkkZGF0YSA9IHN0cl9yZXBsYWNlKCcmbHQ7JywgJyYjNjA7JywgJGRhdGEpOwoJCSRkYXRhID0gc3RyX3JlcGxhY2UoJyZndDsnLCAnJiM2MjsnLCAkZGF0YSk7CgkJJGRhdGEgPSBzdHJfcmVwbGFjZSgnJmFtcDsnLCAnJiMzODsnLCAkZGF0YSk7CgkJJGRhdGEgPSBzdHJfcmVwbGFjZSgnJmFwb3M7JywgJyYjMzk7JywgJGRhdGEpOwoJCSRkYXRhID0gc3RyX3JlcGxhY2UoJyZxdW90OycsICcmIzM0OycsICRkYXRhKTsKCgkJJHJldHVybiA9IHRydWU7CgoJCS8vIENyZWF0ZSB0aGUgcGFyc2VyCgkJJHhtbCA9IHhtbF9wYXJzZXJfY3JlYXRlX25zKCR0aGlzLT5lbmNvZGluZywgJHRoaXMtPnNlcGFyYXRvcik7CgkJeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCR4bWwsIFhNTF9PUFRJT05fU0tJUF9XSElURSwgMSk7CgkJeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCR4bWwsIFhNTF9PUFRJT05fQ0FTRV9GT0xESU5HLCAwKTsKCQl4bWxfc2V0X29iamVjdCgkeG1sLCAkdGhpcyk7CgkJeG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKCR4bWwsICdjZGF0YScpOwoJCXhtbF9zZXRfZWxlbWVudF9oYW5kbGVyKCR4bWwsICd0YWdfb3BlbicsICd0YWdfY2xvc2UnKTsKCgkJLy8gUGFyc2UhCgkJaWYgKCF4bWxfcGFyc2UoJHhtbCwgJGRhdGEsIHRydWUpKQoJCXsKCQkJJHRoaXMtPmVycm9yX2NvZGUgPSB4bWxfZ2V0X2Vycm9yX2NvZGUoJHhtbCk7CgkJCSR0aGlzLT5lcnJvcl9zdHJpbmcgPSB4bWxfZXJyb3Jfc3RyaW5nKCR0aGlzLT5lcnJvcl9jb2RlKTsKCQkJJHJldHVybiA9IGZhbHNlOwoJCX0KCQkkdGhpcy0+Y3VycmVudF9saW5lID0geG1sX2dldF9jdXJyZW50X2xpbmVfbnVtYmVyKCR4bWwpOwoJCSR0aGlzLT5jdXJyZW50X2NvbHVtbiA9IHhtbF9nZXRfY3VycmVudF9jb2x1bW5fbnVtYmVyKCR4bWwpOwoJCSR0aGlzLT5jdXJyZW50X2J5dGUgPSB4bWxfZ2V0X2N1cnJlbnRfYnl0ZV9pbmRleCgkeG1sKTsKCQl4bWxfcGFyc2VyX2ZyZWUoJHhtbCk7CgkJcmV0dXJuICRyZXR1cm47Cgl9CgoJZnVuY3Rpb24gZ2V0X2Vycm9yX2NvZGUoKQoJewoJCXJldHVybiAkdGhpcy0+ZXJyb3JfY29kZTsKCX0KCglmdW5jdGlvbiBnZXRfZXJyb3Jfc3RyaW5nKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmVycm9yX3N0cmluZzsKCX0KCglmdW5jdGlvbiBnZXRfY3VycmVudF9saW5lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmN1cnJlbnRfbGluZTsKCX0KCglmdW5jdGlvbiBnZXRfY3VycmVudF9jb2x1bW4oKQoJewoJCXJldHVybiAkdGhpcy0+Y3VycmVudF9jb2x1bW47Cgl9CgoJZnVuY3Rpb24gZ2V0X2N1cnJlbnRfYnl0ZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5jdXJyZW50X2J5dGU7Cgl9CgoJZnVuY3Rpb24gZ2V0X2RhdGEoKQoJewoJCXJldHVybiAkdGhpcy0+ZGF0YTsKCX0KCglmdW5jdGlvbiB0YWdfb3BlbigkcGFyc2VyLCAkdGFnLCAkYXR0cmlidXRlcykKCXsKCQlpZiAoJHRoaXMtPmZlZWQgPT09IDApCgkJewoJCQlyZXR1cm47CgkJfQoJCWVsc2VpZiAoJHRoaXMtPmZlZWQgPT0gZmFsc2UpCgkJewoJCQlpZiAoaW5fYXJyYXkoJHRhZywgYXJyYXkoCgkJCQlTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAgLiAkdGhpcy0+c2VwYXJhdG9yIC4gJ2ZlZWQnLAoJCQkJU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzIC4gJHRoaXMtPnNlcGFyYXRvciAuICdmZWVkJywKCQkJCSdyc3MnLAoJCQkJU0lNUExFUElFX05BTUVTUEFDRV9SREYgLiAkdGhpcy0+c2VwYXJhdG9yIC4gJ1JERicKCQkJKSkpCgkJCXsKCQkJCQkkdGhpcy0+ZmVlZCA9IDE7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmZlZWQrKzsKCQl9CgoJCWxpc3QoJHRoaXMtPm5hbWVzcGFjZVtdLCAkdGhpcy0+ZWxlbWVudFtdKSA9ICR0aGlzLT5zcGxpdF9ucygkdGFnKTsKCgkJJGF0dHJpYnMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCRhdHRyaWJ1dGVzIGFzICRuYW1lID0+ICR2YWx1ZSkKCQl7CgkJCWxpc3QoJGF0dHJpYl9uYW1lc3BhY2UsICRhdHRyaWJ1dGUpID0gJHRoaXMtPnNwbGl0X25zKCRuYW1lKTsKCQkJJGF0dHJpYnNbJGF0dHJpYl9uYW1lc3BhY2VdWyRhdHRyaWJ1dGVdID0gJHZhbHVlOwoJCX0KCgkJaWYgKGlzc2V0KCRhdHRyaWJzW1NJTVBMRVBJRV9OQU1FU1BBQ0VfWE1MXVsnYmFzZSddKSkKCQl7CgkJCSR0aGlzLT54bWxfYmFzZVtdID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKCRhdHRyaWJzW1NJTVBMRVBJRV9OQU1FU1BBQ0VfWE1MXVsnYmFzZSddLCBlbmQoJHRoaXMtPnhtbF9iYXNlKSk7CgkJCSR0aGlzLT54bWxfYmFzZV9leHBsaWNpdFtdID0gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnhtbF9iYXNlW10gPSBlbmQoJHRoaXMtPnhtbF9iYXNlKTsKCQkJJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0W10gPSBlbmQoJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0KTsKCQl9CgoJCWlmIChpc3NldCgkYXR0cmlic1tTSU1QTEVQSUVfTkFNRVNQQUNFX1hNTF1bJ2xhbmcnXSkpCgkJewoJCQkkdGhpcy0+eG1sX2xhbmdbXSA9ICRhdHRyaWJzW1NJTVBMRVBJRV9OQU1FU1BBQ0VfWE1MXVsnbGFuZyddOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+eG1sX2xhbmdbXSA9IGVuZCgkdGhpcy0+eG1sX2xhbmcpOwoJCX0KCgkJaWYgKCR0aGlzLT5jdXJyZW50X3hodG1sX2NvbnN0cnVjdCA+PSAwKQoJCXsKCQkJJHRoaXMtPmN1cnJlbnRfeGh0bWxfY29uc3RydWN0Kys7CgkJCWlmIChlbmQoJHRoaXMtPm5hbWVzcGFjZSkgPT0gU0lNUExFUElFX05BTUVTUEFDRV9YSFRNTCkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSAnPCcgLiBlbmQoJHRoaXMtPmVsZW1lbnQpOwoJCQkJaWYgKGlzc2V0KCRhdHRyaWJzWycnXSkpCgkJCQl7CgkJCQkJZm9yZWFjaCAoJGF0dHJpYnNbJyddIGFzICRuYW1lID0+ICR2YWx1ZSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5kYXRhWydkYXRhJ10gLj0gJyAnIC4gJG5hbWUgLiAnPSInIC4gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUsIEVOVF9DT01QQVQsICR0aGlzLT5lbmNvZGluZykgLiAnIic7CgkJCQkJfQoJCQkJfQoJCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSAnPic7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmRhdGFzW10gPSYgJHRoaXMtPmRhdGE7CgkJCSR0aGlzLT5kYXRhID0mICR0aGlzLT5kYXRhWydjaGlsZCddW2VuZCgkdGhpcy0+bmFtZXNwYWNlKV1bZW5kKCR0aGlzLT5lbGVtZW50KV1bXTsKCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgnZGF0YScgPT4gJycsICdhdHRyaWJzJyA9PiAkYXR0cmlicywgJ3htbF9iYXNlJyA9PiBlbmQoJHRoaXMtPnhtbF9iYXNlKSwgJ3htbF9iYXNlX2V4cGxpY2l0JyA9PiBlbmQoJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0KSwgJ3htbF9sYW5nJyA9PiBlbmQoJHRoaXMtPnhtbF9sYW5nKSk7CgkJCWlmICgoZW5kKCR0aGlzLT5uYW1lc3BhY2UpID09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMyAmJiBpbl9hcnJheShlbmQoJHRoaXMtPmVsZW1lbnQpLCBhcnJheSgndGl0bGUnLCAndGFnbGluZScsICdjb3B5cmlnaHQnLCAnaW5mbycsICdzdW1tYXJ5JywgJ2NvbnRlbnQnKSkgJiYgaXNzZXQoJGF0dHJpYnNbJyddWydtb2RlJ10pICYmICRhdHRyaWJzWycnXVsnbW9kZSddID09ICd4bWwnKQoJCQl8fCAoZW5kKCR0aGlzLT5uYW1lc3BhY2UpID09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCAmJiBpbl9hcnJheShlbmQoJHRoaXMtPmVsZW1lbnQpLCBhcnJheSgncmlnaHRzJywgJ3N1YnRpdGxlJywgJ3N1bW1hcnknLCAnaW5mbycsICd0aXRsZScsICdjb250ZW50JykpICYmIGlzc2V0KCRhdHRyaWJzWycnXVsndHlwZSddKSAmJiAkYXR0cmlic1snJ11bJ3R5cGUnXSA9PSAneGh0bWwnKSkKCQkJewoJCQkJJHRoaXMtPmN1cnJlbnRfeGh0bWxfY29uc3RydWN0ID0gMDsKCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBjZGF0YSgkcGFyc2VyLCAkY2RhdGEpCgl7CgkJaWYgKCR0aGlzLT5jdXJyZW50X3hodG1sX2NvbnN0cnVjdCA+PSAwKQoJCXsKCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSBodG1sc3BlY2lhbGNoYXJzKCRjZGF0YSwgRU5UX1FVT1RFUywgJHRoaXMtPmVuY29kaW5nKTsKCQl9CgkJZWxzZWlmICgkdGhpcy0+ZmVlZCA+IDEpCgkJewoJCQkkdGhpcy0+ZGF0YVsnZGF0YSddIC49ICRjZGF0YTsKCQl9Cgl9CgoJZnVuY3Rpb24gdGFnX2Nsb3NlKCRwYXJzZXIsICR0YWcpCgl7CgkJaWYgKCEkdGhpcy0+ZmVlZCkKCQl7CgkJCXJldHVybjsKCQl9CgoJCWlmICgkdGhpcy0+Y3VycmVudF94aHRtbF9jb25zdHJ1Y3QgPj0gMCkKCQl7CgkJCSR0aGlzLT5jdXJyZW50X3hodG1sX2NvbnN0cnVjdC0tOwoJCQlpZiAoZW5kKCR0aGlzLT5uYW1lc3BhY2UpID09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfWEhUTUwgJiYgIWluX2FycmF5KGVuZCgkdGhpcy0+ZWxlbWVudCksIGFycmF5KCdhcmVhJywgJ2Jhc2UnLCAnYmFzZWZvbnQnLCAnYnInLCAnY29sJywgJ2ZyYW1lJywgJ2hyJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2xpbmsnLCAnbWV0YScsICdwYXJhbScpKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSAnPC8nIC4gZW5kKCR0aGlzLT5lbGVtZW50KSAuICc+JzsKCQkJfQoJCX0KCQlpZiAoJHRoaXMtPmN1cnJlbnRfeGh0bWxfY29uc3RydWN0ID09IC0xKQoJCXsKCQkJJHRoaXMtPmRhdGEgPSYgJHRoaXMtPmRhdGFzWyR0aGlzLT5mZWVkXTsKCQkJYXJyYXlfcG9wKCR0aGlzLT5kYXRhcyk7CgkJfQoKCQlhcnJheV9wb3AoJHRoaXMtPmVsZW1lbnQpOwoJCWFycmF5X3BvcCgkdGhpcy0+bmFtZXNwYWNlKTsKCQlhcnJheV9wb3AoJHRoaXMtPnhtbF9iYXNlKTsKCQlhcnJheV9wb3AoJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0KTsKCQlhcnJheV9wb3AoJHRoaXMtPnhtbF9sYW5nKTsKCQkkdGhpcy0+ZmVlZC0tOwoJfQoKCWZ1bmN0aW9uIHNwbGl0X25zKCRzdHJpbmcpCgl7CgkJc3RhdGljICRjYWNoZSA9IGFycmF5KCk7CgkJaWYgKCFpc3NldCgkY2FjaGVbJHN0cmluZ10pKQoJCXsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJHN0cmluZywgJHRoaXMtPnNlcGFyYXRvcikpCgkJCXsKCQkJCXN0YXRpYyAkc2VwYXJhdG9yX2xlbmd0aDsKCQkJCWlmICghJHNlcGFyYXRvcl9sZW5ndGgpCgkJCQl7CgkJCQkJJHNlcGFyYXRvcl9sZW5ndGggPSBzdHJsZW4oJHRoaXMtPnNlcGFyYXRvcik7CgkJCQl9CgkJCQkkbmFtZXNwYWNlID0gc3Vic3RyKCRzdHJpbmcsIDAsICRwb3MpOwoJCQkJJGxvY2FsX25hbWUgPSBzdWJzdHIoJHN0cmluZywgJHBvcyArICRzZXBhcmF0b3JfbGVuZ3RoKTsKCQkJCWlmIChzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpID09PSBTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUykKCQkJCXsKCQkJCQkkbmFtZXNwYWNlID0gU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVM7CgkJCQl9CgoJCQkJLy8gTm9ybWFsaXplIHRoZSBNZWRpYSBSU1MgbmFtZXNwYWNlcwoJCQkJaWYgKCRuYW1lc3BhY2UgPT09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NfV1JPTkcpCgkJCQl7CgkJCQkJJG5hbWVzcGFjZSA9IFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1M7CgkJCQl9CgkJCQkkY2FjaGVbJHN0cmluZ10gPSBhcnJheSgkbmFtZXNwYWNlLCAkbG9jYWxfbmFtZSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkY2FjaGVbJHN0cmluZ10gPSBhcnJheSgnJywgJHN0cmluZyk7CgkJCX0KCQl9CgkJcmV0dXJuICRjYWNoZVskc3RyaW5nXTsKCX0KfQoKLyoqCiAqIEB0b2RvIE1vdmUgdG8gdXNpbmcgYW4gYWN0dWFsIEhUTUwgcGFyc2VyICh0aGlzIHdpbGwgYWxsb3cgdGFncyB0byBiZSBwcm9wZXJseSBzdHJpcHBlZCwgYW5kIHRvIHN3aXRjaCBiZXR3ZWVuIEhUTUwgYW5kIFhIVE1MKSwgdGhpcyB3aWxsIGFsc28gbWFrZSBpdCBlYXNpZXIgdG8gc2hvcnRlbiBhIHN0cmluZyB3aGlsZSBwcmVzZXJ2aW5nIEhUTUwgdGFncwogKi8KY2xhc3MgU2ltcGxlUGllX1Nhbml0aXplCnsKCS8vIFByaXZhdGUgdmFycwoJdmFyICRiYXNlOwoKCS8vIE9wdGlvbnMKCXZhciAkcmVtb3ZlX2RpdiA9IHRydWU7Cgl2YXIgJGltYWdlX2hhbmRsZXIgPSAnJzsKCXZhciAkc3RyaXBfaHRtbHRhZ3MgPSBhcnJheSgnYmFzZScsICdibGluaycsICdib2R5JywgJ2RvY3R5cGUnLCAnZW1iZWQnLCAnZm9udCcsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2h0bWwnLCAnaWZyYW1lJywgJ2lucHV0JywgJ21hcnF1ZWUnLCAnbWV0YScsICdub3NjcmlwdCcsICdvYmplY3QnLCAncGFyYW0nLCAnc2NyaXB0JywgJ3N0eWxlJyk7Cgl2YXIgJGVuY29kZV9pbnN0ZWFkX29mX3N0cmlwID0gZmFsc2U7Cgl2YXIgJHN0cmlwX2F0dHJpYnV0ZXMgPSBhcnJheSgnYmdzb3VuZCcsICdjbGFzcycsICdleHByJywgJ2lkJywgJ3N0eWxlJywgJ29uY2xpY2snLCAnb25lcnJvcicsICdvbmZpbmlzaCcsICdvbm1vdXNlb3ZlcicsICdvbm1vdXNlb3V0JywgJ29uZm9jdXMnLCAnb25ibHVyJywgJ2xvd3NyYycsICdkeW5zcmMnKTsKCXZhciAkc3RyaXBfY29tbWVudHMgPSBmYWxzZTsKCXZhciAkb3V0cHV0X2VuY29kaW5nID0gJ1VURi04JzsKCXZhciAkZW5hYmxlX2NhY2hlID0gdHJ1ZTsKCXZhciAkY2FjaGVfbG9jYXRpb24gPSAnLi9jYWNoZSc7Cgl2YXIgJGNhY2hlX25hbWVfZnVuY3Rpb24gPSAnbWQ1JzsKCXZhciAkY2FjaGVfY2xhc3MgPSAnU2ltcGxlUGllX0NhY2hlJzsKCXZhciAkZmlsZV9jbGFzcyA9ICdTaW1wbGVQaWVfRmlsZSc7Cgl2YXIgJHRpbWVvdXQgPSAxMDsKCXZhciAkdXNlcmFnZW50ID0gJyc7Cgl2YXIgJGZvcmNlX2Zzb2Nrb3BlbiA9IGZhbHNlOwoKCXZhciAkcmVwbGFjZV91cmxfYXR0cmlidXRlcyA9IGFycmF5KAoJCSdhJyA9PiAnaHJlZicsCgkJJ2FyZWEnID0+ICdocmVmJywKCQknYmxvY2txdW90ZScgPT4gJ2NpdGUnLAoJCSdkZWwnID0+ICdjaXRlJywKCQknZm9ybScgPT4gJ2FjdGlvbicsCgkJJ2ltZycgPT4gYXJyYXkoJ2xvbmdkZXNjJywgJ3NyYycpLAoJCSdpbnB1dCcgPT4gJ3NyYycsCgkJJ2lucycgPT4gJ2NpdGUnLAoJCSdxJyA9PiAnY2l0ZScKCSk7CgoJZnVuY3Rpb24gcmVtb3ZlX2RpdigkZW5hYmxlID0gdHJ1ZSkKCXsKCQkkdGhpcy0+cmVtb3ZlX2RpdiA9IChib29sKSAkZW5hYmxlOwoJfQoKCWZ1bmN0aW9uIHNldF9pbWFnZV9oYW5kbGVyKCRwYWdlID0gZmFsc2UpCgl7CgkJaWYgKCRwYWdlKQoJCXsKCQkJJHRoaXMtPmltYWdlX2hhbmRsZXIgPSAoc3RyaW5nKSAkcGFnZTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmltYWdlX2hhbmRsZXIgPSBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gcGFzc19jYWNoZV9kYXRhKCRlbmFibGVfY2FjaGUgPSB0cnVlLCAkY2FjaGVfbG9jYXRpb24gPSAnLi9jYWNoZScsICRjYWNoZV9uYW1lX2Z1bmN0aW9uID0gJ21kNScsICRjYWNoZV9jbGFzcyA9ICdTaW1wbGVQaWVfQ2FjaGUnKQoJewoJCWlmIChpc3NldCgkZW5hYmxlX2NhY2hlKSkKCQl7CgkJCSR0aGlzLT5lbmFibGVfY2FjaGUgPSAoYm9vbCkgJGVuYWJsZV9jYWNoZTsKCQl9CgoJCWlmICgkY2FjaGVfbG9jYXRpb24pCgkJewoJCQkkdGhpcy0+Y2FjaGVfbG9jYXRpb24gPSAoc3RyaW5nKSAkY2FjaGVfbG9jYXRpb247CgkJfQoKCQlpZiAoJGNhY2hlX25hbWVfZnVuY3Rpb24pCgkJewoJCQkkdGhpcy0+Y2FjaGVfbmFtZV9mdW5jdGlvbiA9IChzdHJpbmcpICRjYWNoZV9uYW1lX2Z1bmN0aW9uOwoJCX0KCgkJaWYgKCRjYWNoZV9jbGFzcykKCQl7CgkJCSR0aGlzLT5jYWNoZV9jbGFzcyA9IChzdHJpbmcpICRjYWNoZV9jbGFzczsKCQl9Cgl9CgoJZnVuY3Rpb24gcGFzc19maWxlX2RhdGEoJGZpbGVfY2xhc3MgPSAnU2ltcGxlUGllX0ZpbGUnLCAkdGltZW91dCA9IDEwLCAkdXNlcmFnZW50ID0gJycsICRmb3JjZV9mc29ja29wZW4gPSBmYWxzZSkKCXsKCQlpZiAoJGZpbGVfY2xhc3MpCgkJewoJCQkkdGhpcy0+ZmlsZV9jbGFzcyA9IChzdHJpbmcpICRmaWxlX2NsYXNzOwoJCX0KCgkJaWYgKCR0aW1lb3V0KQoJCXsKCQkJJHRoaXMtPnRpbWVvdXQgPSAoc3RyaW5nKSAkdGltZW91dDsKCQl9CgoJCWlmICgkdXNlcmFnZW50KQoJCXsKCQkJJHRoaXMtPnVzZXJhZ2VudCA9IChzdHJpbmcpICR1c2VyYWdlbnQ7CgkJfQoKCQlpZiAoJGZvcmNlX2Zzb2Nrb3BlbikKCQl7CgkJCSR0aGlzLT5mb3JjZV9mc29ja29wZW4gPSAoc3RyaW5nKSAkZm9yY2VfZnNvY2tvcGVuOwoJCX0KCX0KCglmdW5jdGlvbiBzdHJpcF9odG1sdGFncygkdGFncyA9IGFycmF5KCdiYXNlJywgJ2JsaW5rJywgJ2JvZHknLCAnZG9jdHlwZScsICdlbWJlZCcsICdmb250JywgJ2Zvcm0nLCAnZnJhbWUnLCAnZnJhbWVzZXQnLCAnaHRtbCcsICdpZnJhbWUnLCAnaW5wdXQnLCAnbWFycXVlZScsICdtZXRhJywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdwYXJhbScsICdzY3JpcHQnLCAnc3R5bGUnKSkKCXsKCQlpZiAoJHRhZ3MpCgkJewoJCQlpZiAoaXNfYXJyYXkoJHRhZ3MpKQoJCQl7CgkJCQkkdGhpcy0+c3RyaXBfaHRtbHRhZ3MgPSAkdGFnczsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5zdHJpcF9odG1sdGFncyA9IGV4cGxvZGUoJywnLCAkdGFncyk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0cmlwX2h0bWx0YWdzID0gZmFsc2U7CgkJfQoJfQoKCWZ1bmN0aW9uIGVuY29kZV9pbnN0ZWFkX29mX3N0cmlwKCRlbmNvZGUgPSBmYWxzZSkKCXsKCQkkdGhpcy0+ZW5jb2RlX2luc3RlYWRfb2Zfc3RyaXAgPSAoYm9vbCkgJGVuY29kZTsKCX0KCglmdW5jdGlvbiBzdHJpcF9hdHRyaWJ1dGVzKCRhdHRyaWJzID0gYXJyYXkoJ2Jnc291bmQnLCAnY2xhc3MnLCAnZXhwcicsICdpZCcsICdzdHlsZScsICdvbmNsaWNrJywgJ29uZXJyb3InLCAnb25maW5pc2gnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbmZvY3VzJywgJ29uYmx1cicsICdsb3dzcmMnLCAnZHluc3JjJykpCgl7CgkJaWYgKCRhdHRyaWJzKQoJCXsKCQkJaWYgKGlzX2FycmF5KCRhdHRyaWJzKSkKCQkJewoJCQkJJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXMgPSAkYXR0cmliczsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5zdHJpcF9hdHRyaWJ1dGVzID0gZXhwbG9kZSgnLCcsICRhdHRyaWJzKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RyaXBfYXR0cmlidXRlcyA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiBzdHJpcF9jb21tZW50cygkc3RyaXAgPSBmYWxzZSkKCXsKCQkkdGhpcy0+c3RyaXBfY29tbWVudHMgPSAoYm9vbCkgJHN0cmlwOwoJfQoKCWZ1bmN0aW9uIHNldF9vdXRwdXRfZW5jb2RpbmcoJGVuY29kaW5nID0gJ1VURi04JykKCXsKCQkkdGhpcy0+b3V0cHV0X2VuY29kaW5nID0gKHN0cmluZykgJGVuY29kaW5nOwoJfQoKCS8qKgoJICogU2V0IGVsZW1lbnQvYXR0cmlidXRlIGtleS92YWx1ZSBwYWlycyBvZiBIVE1MIGF0dHJpYnV0ZXMKCSAqIGNvbnRhaW5pbmcgVVJMcyB0aGF0IG5lZWQgdG8gYmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIGZlZWQKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNpbmNlIDEuMAoJICogQHBhcmFtIGFycmF5ICRlbGVtZW50X2F0dHJpYnV0ZSBFbGVtZW50L2F0dHJpYnV0ZSBrZXkvdmFsdWUgcGFpcnMKCSAqLwoJZnVuY3Rpb24gc2V0X3VybF9yZXBsYWNlbWVudHMoJGVsZW1lbnRfYXR0cmlidXRlID0gYXJyYXkoJ2EnID0+ICdocmVmJywgJ2FyZWEnID0+ICdocmVmJywgJ2Jsb2NrcXVvdGUnID0+ICdjaXRlJywgJ2RlbCcgPT4gJ2NpdGUnLCAnZm9ybScgPT4gJ2FjdGlvbicsICdpbWcnID0+IGFycmF5KCdsb25nZGVzYycsICdzcmMnKSwgJ2lucHV0JyA9PiAnc3JjJywgJ2lucycgPT4gJ2NpdGUnLCAncScgPT4gJ2NpdGUnKSkKCXsKCQkkdGhpcy0+cmVwbGFjZV91cmxfYXR0cmlidXRlcyA9IChhcnJheSkgJGVsZW1lbnRfYXR0cmlidXRlOwoJfQoKCWZ1bmN0aW9uIHNhbml0aXplKCRkYXRhLCAkdHlwZSwgJGJhc2UgPSAnJykKCXsKCQkkZGF0YSA9IHRyaW0oJGRhdGEpOwoJCWlmICgkZGF0YSAhPT0gJycgfHwgJHR5cGUgJiBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSkKCQl7CgkJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCkKCQkJewoJCQkJaWYgKHByZWdfbWF0Y2goJy8oJigjKHhbMC05YS1mQS1GXSt8WzAtOV0rKXxbYS16QS1aMC05XSspfDxcL1tBLVphLXpdW15ceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceDJGXHgzRV0qJyAuIFNJTVBMRVBJRV9QQ1JFX0hUTUxfQVRUUklCVVRFIC4gJz4pLycsICRkYXRhKSkKCQkJCXsKCQkJCQkkdHlwZSB8PSBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUw7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJHR5cGUgfD0gU0lNUExFUElFX0NPTlNUUlVDVF9URVhUOwoJCQkJfQoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfQ09OU1RSVUNUX0JBU0U2NCkKCQkJewoJCQkJJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKCQkJfQoKCQkJaWYgKCR0eXBlICYgU0lNUExFUElFX0NPTlNUUlVDVF9YSFRNTCkKCQkJewoJCQkJaWYgKCR0aGlzLT5yZW1vdmVfZGl2KQoJCQkJewoJCQkJCSRkYXRhID0gcHJlZ19yZXBsYWNlKCcvXjxkaXYnIC4gU0lNUExFUElFX1BDUkVfWE1MX0FUVFJJQlVURSAuICc+LycsICcnLCAkZGF0YSk7CgkJCQkJJGRhdGEgPSBwcmVnX3JlcGxhY2UoJy88XC9kaXY+JC8nLCAnJywgJGRhdGEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRkYXRhID0gcHJlZ19yZXBsYWNlKCcvXjxkaXYnIC4gU0lNUExFUElFX1BDUkVfWE1MX0FUVFJJQlVURSAuICc+LycsICc8ZGl2PicsICRkYXRhKTsKCQkJCX0KCQkJfQoKCQkJaWYgKCR0eXBlICYgKFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCB8IFNJTVBMRVBJRV9DT05TVFJVQ1RfWEhUTUwpKQoJCQl7CgkJCQkvLyBTdHJpcCBjb21tZW50cwoJCQkJaWYgKCR0aGlzLT5zdHJpcF9jb21tZW50cykKCQkJCXsKCQkJCQkkZGF0YSA9IFNpbXBsZVBpZV9NaXNjOjpzdHJpcF9jb21tZW50cygkZGF0YSk7CgkJCQl9CgoJCQkJLy8gU3RyaXAgb3V0IEhUTUwgdGFncyBhbmQgYXR0cmlidXRlcyB0aGF0IG1pZ2h0IGNhdXNlIHZhcmlvdXMgc2VjdXJpdHkgcHJvYmxlbXMuCgkJCQkvLyBCYXNlZCBvbiByZWNvbW1lbmRhdGlvbnMgYnkgTWFyayBQaWxncmltIGF0OgoJCQkJLy8gaHR0cDovL2RpdmVpbnRvbWFyay5vcmcvYXJjaGl2ZXMvMjAwMy8wNi8xMi9ob3dfdG9fY29uc3VtZV9yc3Nfc2FmZWx5CgkJCQlpZiAoJHRoaXMtPnN0cmlwX2h0bWx0YWdzKQoJCQkJewoJCQkJCWZvcmVhY2ggKCR0aGlzLT5zdHJpcF9odG1sdGFncyBhcyAkdGFnKQoJCQkJCXsKCQkJCQkJJHBjcmUgPSAiLzwoJHRhZykiIC4gU0lNUExFUElFX1BDUkVfSFRNTF9BVFRSSUJVVEUgLiAiKD4oLiopPFwvJHRhZyIgLiBTSU1QTEVQSUVfUENSRV9IVE1MX0FUVFJJQlVURSAuICc+fChcLyk/Pikvc2lVJzsKCQkJCQkJd2hpbGUgKHByZWdfbWF0Y2goJHBjcmUsICRkYXRhKSkKCQkJCQkJewoJCQkJCQkJJGRhdGEgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHBjcmUsIGFycmF5KCYkdGhpcywgJ2RvX3N0cmlwX2h0bWx0YWdzJyksICRkYXRhKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXMpCgkJCQl7CgkJCQkJZm9yZWFjaCAoJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXMgYXMgJGF0dHJpYikKCQkJCQl7CgkJCQkJCSRkYXRhID0gcHJlZ19yZXBsYWNlKCcvKDxbQS1aYS16XVteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyRlx4M0VdKiknIC4gU0lNUExFUElFX1BDUkVfSFRNTF9BVFRSSUJVVEUgLiB0cmltKCRhdHRyaWIpIC4gJyg/OlxzKj1ccyooPzoiKD86W14iXSopInxcJyg/OlteXCddKilcJ3woPzpbXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4MjJceDI3XHgzRV1bXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4M0VdKik/KSk/JyAuIFNJTVBMRVBJRV9QQ1JFX0hUTUxfQVRUUklCVVRFIC4gJz4vJywgJ1wxXDJcMz4nLCAkZGF0YSk7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFJlcGxhY2UgcmVsYXRpdmUgVVJMcwoJCQkJJHRoaXMtPmJhc2UgPSAkYmFzZTsKCQkJCWZvcmVhY2ggKCR0aGlzLT5yZXBsYWNlX3VybF9hdHRyaWJ1dGVzIGFzICRlbGVtZW50ID0+ICRhdHRyaWJ1dGVzKQoJCQkJewoJCQkJCSRkYXRhID0gJHRoaXMtPnJlcGxhY2VfdXJscygkZGF0YSwgJGVsZW1lbnQsICRhdHRyaWJ1dGVzKTsKCQkJCX0KCgkJCQkvLyBJZiBpbWFnZSBoYW5kbGluZyAoY2FjaGluZywgZXRjLikgaXMgZW5hYmxlZCwgY2FjaGUgYW5kIHJld3JpdGUgYWxsIHRoZSBpbWFnZSB0YWdzLgoJCQkJaWYgKGlzc2V0KCR0aGlzLT5pbWFnZV9oYW5kbGVyKSAmJiAoKHN0cmluZykgJHRoaXMtPmltYWdlX2hhbmRsZXIpICE9PSAnJyAmJiAkdGhpcy0+ZW5hYmxlX2NhY2hlKQoJCQkJewoJCQkJCSRpbWFnZXMgPSBTaW1wbGVQaWVfTWlzYzo6Z2V0X2VsZW1lbnQoJ2ltZycsICRkYXRhKTsKCQkJCQlmb3JlYWNoICgkaW1hZ2VzIGFzICRpbWcpCgkJCQkJewoJCQkJCQlpZiAoaXNzZXQoJGltZ1snYXR0cmlicyddWydzcmMnXVsnZGF0YSddKSkKCQkJCQkJewoJCQkJCQkJJGltYWdlX3VybCA9IGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkaW1nWydhdHRyaWJzJ11bJ3NyYyddWydkYXRhJ10pOwoJCQkJCQkJJGNhY2hlID0gY2FsbF91c2VyX2Z1bmMoYXJyYXkoJHRoaXMtPmNhY2hlX2NsYXNzLCAnY3JlYXRlJyksICR0aGlzLT5jYWNoZV9sb2NhdGlvbiwgJGltYWdlX3VybCwgJ3NwaScpOwoKCQkJCQkJCWlmICgkY2FjaGUtPmxvYWQoKSkKCQkJCQkJCXsKCQkJCQkJCQkkaW1nWydhdHRyaWJzJ11bJ3NyYyddWydkYXRhJ10gPSAkdGhpcy0+aW1hZ2VfaGFuZGxlciAuICRpbWFnZV91cmw7CgkJCQkJCQkJJGRhdGEgPSBzdHJfcmVwbGFjZSgkaW1nWydmdWxsJ10sIFNpbXBsZVBpZV9NaXNjOjplbGVtZW50X2ltcGxvZGUoJGltZyksICRkYXRhKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQkkZmlsZSA9JiBuZXcgJHRoaXMtPmZpbGVfY2xhc3MoJGltZ1snYXR0cmlicyddWydzcmMnXVsnZGF0YSddLCAkdGhpcy0+dGltZW91dCwgNSwgYXJyYXkoJ1gtRk9SV0FSREVELUZPUicgPT4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pLCAkdGhpcy0+dXNlcmFnZW50LCAkdGhpcy0+Zm9yY2VfZnNvY2tvcGVuKTsKCQkJCQkJCQkkaGVhZGVycyA9ICRmaWxlLT5oZWFkZXJzOwoKCQkJCQkJCQlpZiAoJGZpbGUtPnN1Y2Nlc3MgJiYgKCRmaWxlLT5zdGF0dXNfY29kZSA9PSAyMDAgfHwgKCRmaWxlLT5zdGF0dXNfY29kZSA+IDIwNiAmJiAkZmlsZS0+c3RhdHVzX2NvZGUgPCAzMDApKSkKCQkJCQkJCQl7CgkJCQkJCQkJCWlmICgkY2FjaGUtPnNhdmUoYXJyYXkoJ2hlYWRlcnMnID0+ICRmaWxlLT5oZWFkZXJzLCAnYm9keScgPT4gJGZpbGUtPmJvZHkpKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGltZ1snYXR0cmlicyddWydzcmMnXVsnZGF0YSddID0gJHRoaXMtPmltYWdlX2hhbmRsZXIgLiAkaW1hZ2VfdXJsOwoJCQkJCQkJCQkJJGRhdGEgPSBzdHJfcmVwbGFjZSgkaW1nWydmdWxsJ10sIFNpbXBsZVBpZV9NaXNjOjplbGVtZW50X2ltcGxvZGUoJGltZyksICRkYXRhKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXRyaWdnZXJfZXJyb3IoIiRjYWNoZS0+bmFtZSBpcyBub3Qgd3JpdGVhYmxlIiwgRV9VU0VSX1dBUk5JTkcpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCS8vIEhhdmluZyAocG9zc2libHkpIHRha2VuIHN0dWZmIG91dCwgdGhlcmUgbWF5IG5vdyBiZSB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRoZSBkYXRhCgkJCQkkZGF0YSA9IHRyaW0oJGRhdGEpOwoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSkKCQkJewoJCQkJJGRhdGEgPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJGRhdGEsICRiYXNlKTsKCQkJfQoKCQkJaWYgKCR0eXBlICYgKFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCB8IFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKSkKCQkJewoJCQkJJGRhdGEgPSBodG1sc3BlY2lhbGNoYXJzKCRkYXRhLCBFTlRfQ09NUEFULCAnVVRGLTgnKTsKCQkJfQoKCQkJaWYgKCR0aGlzLT5vdXRwdXRfZW5jb2RpbmcgIT0gJ1VURi04JykKCQkJewoJCQkJJGRhdGEgPSBTaW1wbGVQaWVfTWlzYzo6Y2hhbmdlX2VuY29kaW5nKCRkYXRhLCAnVVRGLTgnLCAkdGhpcy0+b3V0cHV0X2VuY29kaW5nKTsKCQkJfQoJCX0KCQlyZXR1cm4gJGRhdGE7Cgl9CgoJZnVuY3Rpb24gcmVwbGFjZV91cmxzKCRkYXRhLCAkdGFnLCAkYXR0cmlidXRlcykKCXsKCQlpZiAoIWlzX2FycmF5KCR0aGlzLT5zdHJpcF9odG1sdGFncykgfHwgIWluX2FycmF5KCR0YWcsICR0aGlzLT5zdHJpcF9odG1sdGFncykpCgkJewoJCQkkZWxlbWVudHMgPSBTaW1wbGVQaWVfTWlzYzo6Z2V0X2VsZW1lbnQoJHRhZywgJGRhdGEpOwoJCQlmb3JlYWNoICgkZWxlbWVudHMgYXMgJGVsZW1lbnQpCgkJCXsKCQkJCWlmIChpc19hcnJheSgkYXR0cmlidXRlcykpCgkJCQl7CgkJCQkJZm9yZWFjaCAoJGF0dHJpYnV0ZXMgYXMgJGF0dHJpYnV0ZSkKCQkJCQl7CgkJCQkJCWlmIChpc3NldCgkZWxlbWVudFsnYXR0cmlicyddWyRhdHRyaWJ1dGVdWydkYXRhJ10pKQoJCQkJCQl7CgkJCQkJCQkkZWxlbWVudFsnYXR0cmlicyddWyRhdHRyaWJ1dGVdWydkYXRhJ10gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJGVsZW1lbnRbJ2F0dHJpYnMnXVskYXR0cmlidXRlXVsnZGF0YSddLCAkdGhpcy0+YmFzZSk7CgkJCQkJCQkkbmV3X2VsZW1lbnQgPSBTaW1wbGVQaWVfTWlzYzo6ZWxlbWVudF9pbXBsb2RlKCRlbGVtZW50KTsKCQkJCQkJCSRkYXRhID0gc3RyX3JlcGxhY2UoJGVsZW1lbnRbJ2Z1bGwnXSwgJG5ld19lbGVtZW50LCAkZGF0YSk7CgkJCQkJCQkkZWxlbWVudFsnZnVsbCddID0gJG5ld19lbGVtZW50OwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJZWxzZWlmIChpc3NldCgkZWxlbWVudFsnYXR0cmlicyddWyRhdHRyaWJ1dGVzXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkZWxlbWVudFsnYXR0cmlicyddWyRhdHRyaWJ1dGVzXVsnZGF0YSddID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKCRlbGVtZW50WydhdHRyaWJzJ11bJGF0dHJpYnV0ZXNdWydkYXRhJ10sICR0aGlzLT5iYXNlKTsKCQkJCQkkZGF0YSA9IHN0cl9yZXBsYWNlKCRlbGVtZW50WydmdWxsJ10sIFNpbXBsZVBpZV9NaXNjOjplbGVtZW50X2ltcGxvZGUoJGVsZW1lbnQpLCAkZGF0YSk7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICRkYXRhOwoJfQoKCWZ1bmN0aW9uIGRvX3N0cmlwX2h0bWx0YWdzKCRtYXRjaCkKCXsKCQlpZiAoJHRoaXMtPmVuY29kZV9pbnN0ZWFkX29mX3N0cmlwKQoJCXsKCQkJaWYgKGlzc2V0KCRtYXRjaFs0XSkgJiYgIWluX2FycmF5KHN0cnRvbG93ZXIoJG1hdGNoWzFdKSwgYXJyYXkoJ3NjcmlwdCcsICdzdHlsZScpKSkKCQkJewoJCQkJJG1hdGNoWzFdID0gaHRtbHNwZWNpYWxjaGFycygkbWF0Y2hbMV0sIEVOVF9DT01QQVQsICdVVEYtOCcpOwoJCQkJJG1hdGNoWzJdID0gaHRtbHNwZWNpYWxjaGFycygkbWF0Y2hbMl0sIEVOVF9DT01QQVQsICdVVEYtOCcpOwoJCQkJcmV0dXJuICImbHQ7JG1hdGNoWzFdJG1hdGNoWzJdJmd0OyRtYXRjaFszXSZsdDsvJG1hdGNoWzFdJmd0OyI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gaHRtbHNwZWNpYWxjaGFycygkbWF0Y2hbMF0sIEVOVF9DT01QQVQsICdVVEYtOCcpOwoJCQl9CgkJfQoJCWVsc2VpZiAoaXNzZXQoJG1hdGNoWzRdKSAmJiAhaW5fYXJyYXkoc3RydG9sb3dlcigkbWF0Y2hbMV0pLCBhcnJheSgnc2NyaXB0JywgJ3N0eWxlJykpKQoJCXsKCQkJcmV0dXJuICRtYXRjaFs0XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICcnOwoJCX0KCX0KfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/class.twitter_for_php.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pIC4gJy9PQXV0aC5waHAnOw0KDQoNCi8qKg0KICogVHdpdHRlciBmb3IgUEhQIC0gbGlicmFyeSBmb3Igc2VuZGluZyBtZXNzYWdlcyB0byBUd2l0dGVyIGFuZCByZWNlaXZpbmcgc3RhdHVzIHVwZGF0ZXMuDQogKg0KICogQGF1dGhvciAgICAgRGF2aWQgR3J1ZGwNCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwOCBEYXZpZCBHcnVkbA0KICogQGxpY2Vuc2UgICAgTmV3IEJTRCBMaWNlbnNlDQogKiBAbGluayAgICAgICBodHRwOi8vcGhwZmFzaGlvbi5jb20vDQogKiBAc2VlICAgICAgICBodHRwOi8vZGV2LnR3aXR0ZXIuY29tL2RvYw0KICogQHZlcnNpb24gICAgMi4yDQogKi8NCmNsYXNzIHR3aXR0ZXJfZm9yX3BocA0Kew0KCS8qKiNAKyBUaW1lbGluZSB7QGxpbmsgVHdpdHRlcjo6bG9hZCgpfSAqLw0KCWNvbnN0IE1FID0gMTsNCgljb25zdCBNRV9BTkRfRlJJRU5EUyA9IDI7DQoJY29uc3QgUkVQTElFUyA9IDM7DQoJY29uc3QgQUxMID0gNDsNCgljb25zdCBSRVRXRUVUUyA9IDEyODsgLy8gaW5jbHVkZSByZXR3ZWV0cz8NCgkvKiojQC0qLw0KDQoJLyoqI0ArIE91dHB1dCBmb3JtYXQge0BsaW5rIFR3aXR0ZXI6OmxvYWQoKX0gKi8NCgljb25zdCBYTUwgPSAwOw0KCWNvbnN0IEpTT04gPSAxNjsNCgljb25zdCBSU1MgPSAzMjsNCgljb25zdCBBVE9NID0gNDg7DQoJLyoqI0AtKi8NCg0KCS8qKiBAdmFyIGludCAqLw0KCXB1YmxpYyBzdGF0aWMgJGNhY2hlRXhwaXJlID0gMTgwMDsgLy8gMzAgbWluDQoNCgkvKiogQHZhciBzdHJpbmcgKi8NCglwdWJsaWMgc3RhdGljICRjYWNoZURpcjsNCg0KCS8qKiBAdmFyIE9BdXRoU2lnbmF0dXJlTWV0aG9kICovDQoJcHJpdmF0ZSAkc2lnbmF0dXJlTWV0aG9kOw0KDQoJLyoqIEB2YXIgT0F1dGhDb25zdW1lciAqLw0KCXByaXZhdGUgJGNvbnN1bWVyOw0KDQoJLyoqIEB2YXIgT0F1dGhDb25zdW1lciAqLw0KCXByaXZhdGUgJHRva2VuOw0KDQoNCg0KCS8qKg0KCSAqIENyZWF0ZXMgb2JqZWN0IHVzaW5nIGNvbnN1bWVyIGFuZCBhY2Nlc3Mga2V5cy4NCgkgKiBAcGFyYW0gIHN0cmluZyAgY29uc3VtZXIga2V5DQoJICogQHBhcmFtICBzdHJpbmcgIGFwcCBzZWNyZXQNCgkgKiBAcGFyYW0gIHN0cmluZyAgb3B0aW9uYWwgYWNjZXNzIHRva2VuDQoJICogQHBhcmFtICBzdHJpbmcgIG9wdGluYWwgYWNjZXNzIHRva2VuIHNlY3JldA0KCSAqIEB0aHJvd3MgVHdpdHRlckV4Y2VwdGlvbiB3aGVuIGFsbG93X3VybF9mb3BlbiBpcyBub3QgZW5hYmxlZA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkY29uc3VtZXJLZXkgPSBOVUxMLCAkY29uc3VtZXJTZWNyZXQgPSBOVUxMLCAkYWNjZXNzVG9rZW4gPSBOVUxMLCAkYWNjZXNzVG9rZW5TZWNyZXQgPSBOVUxMKQ0KCXsNCgkJaWYgKCFpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSkgew0KCQkJdGhyb3cgbmV3IFR3aXR0ZXJFeGNlcHRpb24oJ1BIUCBkaXJlY3RpdmUgYWxsb3dfdXJsX2ZvcGVuIGlzIG5vdCBlbmFibGVkLicpOw0KCQl9DQoJCSR0aGlzLT5zaWduYXR1cmVNZXRob2QgPSBuZXcgT0F1dGhTaWduYXR1cmVNZXRob2RfSE1BQ19TSEExKCk7DQoJCSR0aGlzLT5jb25zdW1lciA9IG5ldyBPQXV0aENvbnN1bWVyKCRjb25zdW1lcktleSwgJGNvbnN1bWVyU2VjcmV0KTsNCgkJJHRoaXMtPnRva2VuID0gbmV3IE9BdXRoQ29uc3VtZXIoJGFjY2Vzc1Rva2VuLCAkYWNjZXNzVG9rZW5TZWNyZXQpOw0KCX0NCg0KDQoNCgkvKioNCgkgKiBUZXN0cyBpZiB1c2VyIGNyZWRlbnRpYWxzIGFyZSB2YWxpZC4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKiBAdGhyb3dzIFR3aXR0ZXJFeGNlcHRpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gYXV0aGVudGljYXRlKCkNCgl7DQoJCXRyeSB7DQoJCQkkeG1sID0gJHRoaXMtPnJlcXVlc3QoJ2FjY291bnQvdmVyaWZ5X2NyZWRlbnRpYWxzJywgTlVMTCwgJ0dFVCcpOw0KCQkJcmV0dXJuICFlbXB0eSgkeG1sLT5pZCk7DQoNCgkJfSBjYXRjaCAoVHdpdHRlckV4Y2VwdGlvbiAkZSkgew0KCQkJaWYgKCRlLT5nZXRDb2RlKCkgPT09IDQwMSkgew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJCXRocm93ICRlOw0KCQl9DQoJfQ0KDQoNCg0KCS8qKg0KCSAqIFNlbmRzIG1lc3NhZ2UgdG8gdGhlIFR3aXR0ZXIuDQoJICogQHBhcmFtIHN0cmluZyAgIG1lc3NhZ2UgZW5jb2RlZCBpbiBVVEYtOA0KCSAqIEByZXR1cm4gbWl4ZWQgICBJRCBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGZhaWx1cmUNCgkgKiBAdGhyb3dzIFR3aXR0ZXJFeGNlcHRpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2VuZCgkbWVzc2FnZSkNCgl7DQoJCWlmIChpY29udl9zdHJsZW4oJG1lc3NhZ2UsICdVVEYtOCcpID4gMTQwKSB7DQoJCQkkbWVzc2FnZSA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnI2h0dHBzPzovL1xTK1teOik7LC4hP1xzXSMnLCBhcnJheSgkdGhpcywgJ3Nob3J0ZW5VcmwnKSwgJG1lc3NhZ2UpOw0KCQl9DQoNCgkJJHhtbCA9ICR0aGlzLT5yZXF1ZXN0KCdzdGF0dXNlcy91cGRhdGUnLCBhcnJheSgnc3RhdHVzJyA9PiAkbWVzc2FnZSkpOw0KCQlyZXR1cm4gJHhtbC0+aWQgPyAoc3RyaW5nKSAkeG1sLT5pZCA6IEZBTFNFOw0KCX0NCg0KDQoNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBzdGF0dXNlcy4NCgkgKiBAcGFyYW0gIGludCAgICB0aW1lbGluZSAoTUUgfCBNRV9BTkRfRlJJRU5EUyB8IFJFUExJRVMgfCBBTEwpIGFuZCBvcHRpb25hbCAoUkVUV0VFVFMpIG9yIGZvcm1hdCAoWE1MIHwgSlNPTiB8IFJTUyB8IEFUT00pDQoJICogQHBhcmFtICBpbnQgICAgbnVtYmVyIG9mIHN0YXR1c2VzIHRvIHJldHJpZXZlDQoJICogQHBhcmFtICBpbnQgICAgcGFnZSBvZiByZXN1bHRzIHRvIHJldHJpZXZlDQoJICogQHJldHVybiBtaXhlZA0KCSAqIEB0aHJvd3MgVHdpdHRlckV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBsb2FkKCRmbGFncyA9IHNlbGY6Ok1FLCAkY291bnQgPSAyMCwgJHBhZ2UgPSAxKQ0KCXsNCgkJc3RhdGljICR0aW1lbGluZXMgPSBhcnJheShzZWxmOjpNRSA9PiAndXNlcl90aW1lbGluZScsIHNlbGY6Ok1FX0FORF9GUklFTkRTID0+ICdmcmllbmRzX3RpbWVsaW5lJywgc2VsZjo6UkVQTElFUyA9PiAnbWVudGlvbnMnLCBzZWxmOjpBTEwgPT4gJ3B1YmxpY190aW1lbGluZScpOw0KDQoJCWlmICghaXNfaW50KCRmbGFncykpIHsgLy8gYmFjayBjb21wYXRpYmlsaXR5DQoJCQkkZmxhZ3MgPSAkZmxhZ3MgPyBzZWxmOjpNRV9BTkRfRlJJRU5EUyA6IHNlbGY6Ok1FOw0KDQoJCX0gZWxzZWlmICghaXNzZXQoJHRpbWVsaW5lc1skZmxhZ3MgJiAweDBGXSkpIHsNCgkJCXRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247DQoJCX0NCg0KCQlyZXR1cm4gJHRoaXMtPmNhY2hlZFJlcXVlc3QoJ3N0YXR1c2VzLycgLiAkdGltZWxpbmVzWyRmbGFncyAmIDB4MEZdIC4gJy4nIC4gc2VsZjo6Z2V0Rm9ybWF0KCRmbGFncyksIGFycmF5KA0KCQkJJ2NvdW50JyA9PiAkY291bnQsDQoJCQkncGFnZScgPT4gJHBhZ2UsDQoJCQknaW5jbHVkZV9ydHMnID0+ICRmbGFncyAmIHNlbGY6OlJFVFdFRVRTID8gMSA6IDAsDQoJCSkpOw0KCX0NCg0KDQoNCgkvKioNCgkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIG9mIGEgZ2l2ZW4gdXNlci4NCgkgKiBAcGFyYW0gIHN0cmluZyBuYW1lDQoJICogQHBhcmFtICBpbnQgICAgZm9ybWF0IChYTUwgfCBKU09OKQ0KCSAqIEByZXR1cm4gbWl4ZWQNCgkgKiBAdGhyb3dzIFR3aXR0ZXJFeGNlcHRpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gbG9hZFVzZXJJbmZvKCR1c2VyLCAkZmxhZ3MgPSBzZWxmOjpYTUwpDQoJew0KCQlyZXR1cm4gJHRoaXMtPmNhY2hlZFJlcXVlc3QoJ3VzZXJzL3Nob3cuJyAuIHNlbGY6OmdldEZvcm1hdCgkZmxhZ3MpLCBhcnJheSgnc2NyZWVuX25hbWUnID0+ICR1c2VyKSk7DQoJfQ0KDQoNCg0KCS8qKg0KCSAqIERlc3Ryb3lzIHN0YXR1cy4NCgkgKiBAcGFyYW0gIGludCAgICBpZCBvZiBzdGF0dXMgdG8gYmUgZGVzdHJveWVkDQoJICogQHJldHVybiBtaXhlZA0KCSAqIEB0aHJvd3MgVHdpdHRlckV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBkZXN0cm95KCRpZCkNCgl7DQoJCSR4bWwgPSAkdGhpcy0+cmVxdWVzdCgic3RhdHVzZXMvZGVzdHJveS8kaWQiKTsNCgkJcmV0dXJuICR4bWwtPmlkID8gKHN0cmluZykgJHhtbC0+aWQgOiBGQUxTRTsNCgl9DQoNCg0KDQoJLyoqDQoJICogUmV0dXJucyB0d2VldHMgdGhhdCBtYXRjaCBhIHNwZWNpZmllZCBxdWVyeS4NCgkgKiBAcGFyYW0gIHN0cmluZ3xhcnJheSAgIHF1ZXJ5DQoJICogQHBhcmFtICBpbnQgICAgICBmb3JtYXQgKEpTT04gfCBBVE9NKQ0KCSAqIEByZXR1cm4gbWl4ZWQNCgkgKiBAdGhyb3dzIFR3aXR0ZXJFeGNlcHRpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2VhcmNoKCRxdWVyeSwgJGZsYWdzID0gc2VsZjo6SlNPTikNCgl7DQoJCXJldHVybiAkdGhpcy0+cmVxdWVzdCgNCgkJCSdodHRwOi8vc2VhcmNoLnR3aXR0ZXIuY29tL3NlYXJjaC4nIC4gc2VsZjo6Z2V0Rm9ybWF0KCRmbGFncyksDQoJCQlpc19hcnJheSgkcXVlcnkpID8gJHF1ZXJ5IDogYXJyYXkoJ3EnID0+ICRxdWVyeSksDQoJCQknR0VUJw0KCQkpLT5yZXN1bHRzOw0KCX0NCg0KDQoNCgkvKioNCgkgKiBQcm9jZXNzIEhUVFAgcmVxdWVzdC4NCgkgKiBAcGFyYW0gIHN0cmluZyAgVVJMIG9yIHR3aXR0ZXIgY29tbWFuZA0KCSAqIEBwYXJhbSAgc3RyaW5nICBIVFRQIG1ldGhvZA0KCSAqIEBwYXJhbSAgYXJyYXkgICBkYXRhDQoJICogQHJldHVybiBtaXhlZA0KCSAqIEB0aHJvd3MgVHdpdHRlckV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiByZXF1ZXN0KCRyZXF1ZXN0LCAkZGF0YSA9IE5VTEwsICRtZXRob2QgPSAnUE9TVCcpDQoJew0KCQlpZiAoIXN0cnBvcygkcmVxdWVzdCwgJzovLycpKSB7DQoJCQlpZiAoIXN0cnBvcygkcmVxdWVzdCwgJy4nKSkgew0KCQkJCSRyZXF1ZXN0IC49ICcuanNvbic7DQoJCQl9DQoJCQkkcmVxdWVzdCA9ICdodHRwOi8vYXBpLnR3aXR0ZXIuY29tLzEvJyAuICRyZXF1ZXN0Ow0KCQl9DQoNCgkJJHJlcXVlc3QgPSBPQXV0aFJlcXVlc3Q6OmZyb21fY29uc3VtZXJfYW5kX3Rva2VuKCR0aGlzLT5jb25zdW1lciwgJHRoaXMtPnRva2VuLCAkbWV0aG9kLCAkcmVxdWVzdCwgJGRhdGEpOw0KCQkkcmVxdWVzdC0+c2lnbl9yZXF1ZXN0KCR0aGlzLT5zaWduYXR1cmVNZXRob2QsICR0aGlzLT5jb25zdW1lciwgJHRoaXMtPnRva2VuKTsNCg0KCQkkb3B0aW9ucyA9IGFycmF5KA0KCQkJJ21ldGhvZCcgPT4gJG1ldGhvZCwNCgkJCSd0aW1lb3V0JyA9PiAyMCwNCgkJCSdjb250ZW50JyA9PiAkbWV0aG9kID09PSAnUE9TVCcgPyAkcmVxdWVzdC0+dG9fcG9zdGRhdGEoKSA6IE5VTEwsDQoJCQkndXNlcl9hZ2VudCcgPT4gJ1R3aXR0ZXIgZm9yIFBIUCcsDQoJCSk7DQoNCgkJJGYgPSBAZm9wZW4oJG1ldGhvZCA9PT0gJ1BPU1QnID8gJHJlcXVlc3QtPmdldF9ub3JtYWxpemVkX2h0dHBfdXJsKCkgOiAkcmVxdWVzdC0+dG9fdXJsKCksDQoJCQkncicsIEZBTFNFLCBzdHJlYW1fY29udGV4dF9jcmVhdGUoYXJyYXkoJ2h0dHAnID0+ICRvcHRpb25zKSkpOw0KCQlpZiAoISRmKSB7DQoJCQl0aHJvdyBuZXcgVHdpdHRlckV4Y2VwdGlvbignU2VydmVyIGVycm9yJyk7DQoJCX0NCg0KCQkkcmVzdWx0ID0gc3RyZWFtX2dldF9jb250ZW50cygkZik7DQoJCSRwYXlsb2FkID0gQHNpbXBsZXhtbF9sb2FkX3N0cmluZygkcmVzdWx0KTsgLy8gaW50ZW50aW9uYWxseSBADQoJCWlmIChlbXB0eSgkcGF5bG9hZCkpIHsNCgkJCSRwYXlsb2FkID0gQGpzb25fZGVjb2RlKCRyZXN1bHQpOyAvLyBpbnRlbnRpb25hbGx5IEANCgkJCWlmIChlbXB0eSgkcGF5bG9hZCkpIHsNCgkJCQl0aHJvdyBuZXcgVHdpdHRlckV4Y2VwdGlvbignSW52YWxpZCBzZXJ2ZXIgcmVzcG9uc2UnKTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJHBheWxvYWQ7DQoJfQ0KDQoNCg0KCS8qKg0KCSAqIENhY2hlZCBIVFRQIHJlcXVlc3QuDQoJICogQHBhcmFtICBzdHJpbmcgIFVSTCBvciB0d2l0dGVyIGNvbW1hbmQNCgkgKiBAcmV0dXJuIG1peGVkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGNhY2hlZFJlcXVlc3QoJHJlcXVlc3QsICRkYXRhKQ0KCXsNCgkJaWYgKCFzZWxmOjokY2FjaGVEaXIpIHsNCgkJCXJldHVybiAkdGhpcy0+cmVxdWVzdCgkcmVxdWVzdCwgJGRhdGEsICdHRVQnKTsNCgkJfQ0KDQoJCSRjYWNoZUZpbGUgPSBzZWxmOjokY2FjaGVEaXIgLiAnL3R3aXR0ZXIuJyAuIG1kNSgkcmVxdWVzdCk7DQoJCSRjYWNoZSA9IEBmaWxlX2dldF9jb250ZW50cygkY2FjaGVGaWxlKTsgLy8gaW50ZW50aW9uYWxseSBADQoJCSRjYWNoZSA9IHN0cm5jbXAoJGNhY2hlLCAnPCcsIDEpID8gQGpzb25fZGVjb2RlKCRjYWNoZSkgOiBAc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRjYWNoZSk7IC8vIGludGVudGlvbmFsbHkgQA0KCQlpZiAoJGNhY2hlICYmIEBmaWxlbXRpbWUoJGNhY2hlRmlsZSkgKyBzZWxmOjokY2FjaGVFeHBpcmUgPiB0aW1lKCkpIHsgLy8gaW50ZW50aW9uYWxseSBADQoJCQlyZXR1cm4gJGNhY2hlOw0KCQl9DQoNCgkJdHJ5IHsNCgkJCSRwYXlsb2FkID0gJHRoaXMtPnJlcXVlc3QoJHJlcXVlc3QsICRkYXRhLCAnR0VUJyk7DQoJCQlmaWxlX3B1dF9jb250ZW50cygkY2FjaGVGaWxlLCAkcGF5bG9hZCBpbnN0YW5jZW9mIFNpbXBsZVhNTEVsZW1lbnQgPyAkcGF5bG9hZC0+YXNYbWwoKSA6IGpzb25fZW5jb2RlKCRwYXlsb2FkKSk7DQoJCQlyZXR1cm4gJHBheWxvYWQ7DQoNCgkJfSBjYXRjaCAoVHdpdHRlckV4Y2VwdGlvbiAkZSkgew0KCQkJaWYgKCRjYWNoZSkgew0KCQkJCXJldHVybiAkY2FjaGU7DQoJCQl9DQoJCQl0aHJvdyAkZTsNCgkJfQ0KCX0NCg0KDQoNCgkvKioNCgkgKiBNYWtlcyB0d2l0dGVyIGxpbmtzLCBAdXNlcm5hbWVzIGFuZCAjaGFzaHRhZ3MgY2xpY2thYmxlLg0KCSAqIEBwYXJhbSAgc3RyaW5nDQoJICogQHJldHVybiBzdHJpbmcNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsaWNrYWJsZSgkcykNCgl7DQoJCXJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soDQoJCQknfig/PCFcdykoaHR0cHM/Oi8vXFMrXHd8d3d3XC5cUytcd3xAXHcrfCNcdyt8PD4mKX51JywNCgkJCWFycmF5KF9fQ0xBU1NfXywgJ2NsaWNrYWJsZUNhbGxiYWNrJyksDQoJCQlodG1sX2VudGl0eV9kZWNvZGUoJHMsIEVOVF9RVU9URVMsICdVVEYtOCcpDQoJCSk7DQoJfQ0KDQoNCg0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNsaWNrYWJsZUNhbGxiYWNrKCRtKQ0KCXsNCgkJJG0gPSBodG1sc3BlY2lhbGNoYXJzKCRtWzFdKTsNCgkJaWYgKCRtWzBdID09PSAnIycpIHsNCgkJCSRtID0gc3Vic3RyKCRtLCAxKTsNCgkJCXJldHVybiAiPGEgaHJlZj0naHR0cDovL3R3aXR0ZXIuY29tL3NlYXJjaD9xPSUyMyRtJz4jJG08L2E+IjsNCgkJfSBlbHNlaWYgKCRtWzBdID09PSAnQCcpIHsNCgkJCSRtID0gc3Vic3RyKCRtLCAxKTsNCgkJCXJldHVybiAiQDxhIGhyZWY9J2h0dHA6Ly93d3cudHdpdHRlci5jb20vJG0nPiRtPC9hPiI7DQoJCX0gZWxzZWlmICgkbVswXSA9PT0gJ3cnKSB7DQoJCQlyZXR1cm4gIjxhIGhyZWY9J2h0dHA6Ly8kbSc+JG08L2E+IjsNCgkJfSBlbHNlaWYgKCRtWzBdID09PSAnaCcpIHsNCgkJCXJldHVybiAiPGEgaHJlZj0nJG0nPiRtPC9hPiI7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gJG07DQoJCX0NCgl9DQoNCg0KDQoJLyoqDQoJICogU2hvcnRlbnMgVVJMIHVzaW5nIGh0dHA6Ly9pcy5nZCBBUEkuDQoJICogQHBhcmFtICBhcnJheQ0KCSAqIEByZXR1cm4gc3RyaW5nDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBzaG9ydGVuVXJsKCRtKQ0KCXsNCgkJJGYgPSBAZm9wZW4oJ2h0dHA6Ly9pcy5nZC9hcGkucGhwP2xvbmd1cmw9JyAuIHVybGVuY29kZSgkbVswXSksICdyJyk7DQoJCXJldHVybiAkZiA/IHN0cmVhbV9nZXRfY29udGVudHMoJGYpIDogJG1bMF07DQoJfQ0KDQoNCg0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEZvcm1hdCgkZmxhZykNCgl7DQoJCXN0YXRpYyAkZm9ybWF0cyA9IGFycmF5KHNlbGY6OlhNTCA9PiAneG1sJywgc2VsZjo6SlNPTiA9PiAnanNvbicsIHNlbGY6OlJTUyA9PiAncnNzJywgc2VsZjo6QVRPTSA9PiAnYXRvbScpOw0KCQkkZmxhZyA9ICRmbGFnICYgMHgzMDsNCgkJaWYgKGlzc2V0KCRmb3JtYXRzWyRmbGFnXSkpIHsNCgkJCXJldHVybiAkZm9ybWF0c1skZmxhZ107DQoJCX0gZWxzZSB7DQoJCQl0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIGZvcm1hdCcpOw0KCQl9DQoJfQ0KDQp9DQoNCg0KDQovKioNCiAqIEFuIGV4Y2VwdGlvbiBnZW5lcmF0ZWQgYnkgVHdpdHRlci4NCiAqLw0KY2xhc3MgVHdpdHRlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbg0Kew0KfQ0K]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lastfmapi/.htaccess</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PEZpbGVzIHBocGxhc3RmbWFwaT4NCglvcmRlciBhbGxvdyxkZW55DQoJZGVueSBmcm9tIGFsbA0KPC9GaWxlcz4=]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/album.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGFsYnVtIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gYWxidW1zDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlBbGJ1bSBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBUYWcgYW4gYWxidW0gdXNpbmcgYSBsaXN0IG9mIHVzZXIgc3VwcGxpZWQgdGFncy4gKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YWxidW08L2k+LCA8aT5hcnRpc3Q8L2k+LCA8aT50YWdzPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRUYWdzKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhbGJ1bSddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZ3MnXSkgKSB7DQoJCQkJLy8gSWYgdGhlIHRhZ3MgdmFyaWFibGVzIGlzIGFuIGFycmF5IGJ1aWxkIGEgQ1MgbGlzdA0KCQkJCWlmICggaXNfYXJyYXkoJG1ldGhvZFZhcnNbJ3RhZ3MnXSkgKSB7DQoJCQkJCSR0YWdzID0gJyc7DQoJCQkJCWZvcmVhY2ggKCAkbWV0aG9kVmFyc1sndGFncyddIGFzICR0YWcgKSB7DQoJCQkJCQkkdGFncyAuPSAkdGFnLicsJzsNCgkJCQkJfQ0KCQkJCQkkdGFncyA9IHN1YnN0cigkdGFncywgMCwgLTEpOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRhZ3MgPSAkbWV0aG9kVmFyc1sndGFncyddOw0KCQkJCX0NCgkJCQkkbWV0aG9kVmFyc1sndGFncyddID0gJHRhZ3M7DQoJCQkJDQoJCQkJLy8gU2V0IHRoZSBjYWxsIHZhcmlhYmxlcw0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdhbGJ1bS5hZGR0YWdzJywNCgkJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCQkpOw0KCQkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQkNCgkJCQkvLyBHZW5lcmF0ZSBhIGNhbGwgc2lnbml0dXJlDQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCS8vIERvIHRoZSBjYWxsIGFuZCBjaGVjayBmb3IgZXJyb3JzDQoJCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlQb3N0Q2FsbCgkdmFycykgKSB7DQoJCQkJCS8vIElmIG5vbmUgcmV0dXJuIHRydWUNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBJZiB0aGVyZSBpcyByZXR1cm4gZmFsc2UNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhbGJ1bSwgYXJ0aXN0IGFuZCB0YWdzIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgbWV0YWRhdGEgZm9yIGFuIGFsYnVtIG9uIExhc3QuZm0gdXNpbmcgdGhlIGFsYnVtIG5hbWUgb3IgYSBtdXNpY2JyYWlueiBpZA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hbGJ1bTwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+bWJpZDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEluZm8oJG1ldGhvZFZhcnMpIHsNCgkJLy8gU2V0IHRoZSBjYWxsIHZhcmlhYmxlcw0KCQkkdmFycyA9IGFycmF5KA0KCQkJJ21ldGhvZCcgPT4gJ2FsYnVtLmdldGluZm8nLA0KCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJKTsNCgkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkNCgkJJGluZm8gPSBhcnJheSgpOw0KCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJJGluZm9bJ25hbWUnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+bmFtZTsNCgkJCSRpbmZvWydhcnRpc3QnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+YXJ0aXN0Ow0KCQkJJGluZm9bJ2xhc3RmbWlkJ10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW0tPmlkOw0KCQkJJGluZm9bJ21iaWQnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+bWJpZDsNCgkJCSRpbmZvWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+dXJsOw0KCQkJJGluZm9bJ3JlbGVhc2VkYXRlJ10gPSBzdHJ0b3RpbWUodHJpbSgoc3RyaW5nKSAkY2FsbC0+YWxidW0tPnJlbGVhc2VkYXRlKSk7DQoJCQkkaW5mb1snaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+aW1hZ2U7DQoJCQkkaW5mb1snaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW0tPmltYWdlWzFdOw0KCQkJJGluZm9bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW0tPmltYWdlWzJdOw0KCQkJJGluZm9bJ2xpc3RlbmVycyddID0gKHN0cmluZykgJGNhbGwtPmFsYnVtLT5saXN0ZW5lcnM7DQoJCQkkaW5mb1sncGxheWNvdW50J10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW0tPnBsYXljb3VudDsNCgkJCSRpID0gMDsNCgkJCWZvcmVhY2ggKCAkY2FsbC0+YWxidW0tPnRvcHRhZ3MtPnRhZyBhcyAkdGFncyApIHsNCgkJCQkkaW5mb1sndG9wdGFncyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZ3MtPm5hbWU7DQoJCQkJJGluZm9bJ3RvcHRhZ3MnXVskaV1bJ3VybCddID0gKHN0cmluZykgJHRhZ3MtPnVybDsNCgkJCQkkaSsrOw0KCQkJfQ0KCQkJDQoJCQlyZXR1cm4gJGluZm87DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSB0YWdzIGFwcGxpZWQgYnkgYW4gaW5kaXZpZHVhbCB1c2VyIHRvIGFuIGFsYnVtIG9uIExhc3QuZm0NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YWxidW08L2k+LCA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhbGJ1bSddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSApIHsNCgkJCQkvLyBTZXQgdGhlIHZhcmlhYmxlcw0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdhbGJ1bS5nZXR0YWdzJywNCgkJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCQkpOw0KCQkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQkNCgkJCQkvLyBHZW5lcmF0ZSBhIGNhbGwgc2lnbml0dXJlDQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCSR0YWdzID0gYXJyYXkoKTsNCgkJCQkvLyBNYWtlIHRoZSBjYWxsDQoJCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkJaWYgKCBjb3VudCgkY2FsbC0+dGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJCQkkaSA9IDA7DQoJCQkJCQlmb3JlYWNoICggJGNhbGwtPnRhZ3MtPnRhZyBhcyAkdGFnICkgew0KCQkJCQkJCSR0YWdzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCQkkdGFnc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRhZy0+dXJsOw0KCQkJCQkJCSRpKys7DQoJCQkJCQl9DQoJCQkJCQkNCgkJCQkJCXJldHVybiAkdGFnczsNCgkJCQkJfQ0KCQkJCQllbHNlIHsNCgkJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1VzZXIgaGFzIG5vIHRhZ3MgZm9yIHRoaXMgYXJ0aXN0Jyk7DQoJCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYWxidW0gYW5kIGFydGlzdCB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBSZW1vdmUgYSB1c2VyJ3MgdGFnIGZyb20gYW4gYWxidW0uIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFsYnVtPC9pPiwgPGk+YXJ0aXN0PC9pPiwgPGk+dGFnPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVUYWcoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FsYnVtJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndGFnJ10pICkgew0KCQkJCS8vIFNldCB0aGUgdmFyaWFibGVzDQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2FsYnVtLnJlbW92ZXRhZycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJDQoJCQkJLy8gR2VuZXJhdGUgYSBjYWxsIHNpZ25hdHVyZQ0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQkvLyBEbyB0aGUgY2FsbA0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYWxidW0sIGFydGlzdCBhbmQgdGFnIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNlYXJjaCBmb3IgYW4gYWxidW0gYnkgbmFtZS4gUmV0dXJucyBhbGJ1bSBtYXRjaGVzIHNvcnRlZCBieSByZWxldmFuY2UNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YWxidW08L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzZWFyY2goJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYWxidW0nXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdhbGJ1bS5zZWFyY2gnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQkkc2VhcmNocmVzdWx0cyA9IGFycmF5KCk7DQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRvcGVuc2VhcmNoID0gJGNhbGwtPnJlc3VsdHMtPmNoaWxkcmVuKCdodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8nKTsNCgkJCQlpZiAoICRvcGVuc2VhcmNoLT50b3RhbFJlc3VsdHMgPiAwICkgew0KCQkJCQkkc2VhcmNocmVzdWx0c1sndG90YWxSZXN1bHRzJ10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+dG90YWxSZXN1bHRzOw0KCQkJCQkkc2VhcmNocmVzdWx0c1snc3RhcnRJbmRleCddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPnN0YXJ0SW5kZXg7DQoJCQkJCSRzZWFyY2hyZXN1bHRzWydpdGVtc1BlclBhZ2UnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT5pdGVtc1BlclBhZ2U7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5yZXN1bHRzLT5hbGJ1bW1hdGNoZXMtPmFsYnVtIGFzICRhbGJ1bSApIHsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYWxidW0tPm5hbWU7DQoJCQkJCQkkc2VhcmNocmVzdWx0c1sncmVzdWx0cyddWyRpXVsnYXJ0aXN0J10gPSAoc3RyaW5nKSAkYWxidW0tPmFydGlzdDsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWydpZCddID0gKHN0cmluZykgJGFsYnVtLT5pZDsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+dXJsOw0KCQkJCQkJJHNlYXJjaHJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhbGJ1bS0+c3RyZWFtYWJsZTsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJGFsYnVtLT5pbWFnZVswXTsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMV07DQoJCQkJCQkkc2VhcmNocmVzdWx0c1sncmVzdWx0cyddWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMl07DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQlyZXR1cm4gJHNlYXJjaHJlc3VsdHM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyB0YWdzYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ05vIHJlc3VsdHMnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFsYnVtIHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/artist.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGFydGlzdCBhcGkgY2FsbHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgYXBpIHJlcXVlc3RzIHJlbGF0aW5nIHRvIGFydGlzdHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCmNsYXNzIGxhc3RmbUFwaUFydGlzdCBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBUYWcgYW4gYXJ0aXN0IHVzaW5nIGEgbGlzdCBvZiB1c2VyIHN1cHBsaWVkIHRhZ3MuIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRhZ3M8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZFRhZ3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZ3MnXSkgKSB7DQoJCQkJLy8gSWYgdGhlIHRhZ3MgdmFyaWFibGVzIGlzIGFuIGFycmF5IGJ1aWxkIGEgQ1MgbGlzdA0KCQkJCWlmICggaXNfYXJyYXkoJG1ldGhvZFZhcnNbJ3RhZ3MnXSkgKSB7DQoJCQkJCSR0YWdzID0gJyc7DQoJCQkJCWZvcmVhY2ggKCAkbWV0aG9kVmFyc1sndGFncyddIGFzICR0YWcgKSB7DQoJCQkJCQkkdGFncyAuPSAkdGFnLicsJzsNCgkJCQkJfQ0KCQkJCQkkdGFncyA9IHN1YnN0cigkdGFncywgMCwgLTEpOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRhZ3MgPSAkbWV0aG9kVmFyc1sndGFncyddOw0KCQkJCX0NCgkJCQkkbWV0aG9kVmFyc1sndGFncyddID0gJHRhZ3M7DQoJCQkJDQoJCQkJLy8gU2V0IHRoZSBjYWxsIHZhcmlhYmxlcw0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdhcnRpc3QuYWRkdGFncycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0YWdzIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIGxpc3Qgb2YgdXBjb21pbmcgZXZlbnRzIGZvciB0aGlzIGFydGlzdC4NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0RXZlbnRzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5nZXRldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggJGNhbGwtPmV2ZW50c1sndG90YWwnXSAhPSAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+ZXZlbnRzLT5ldmVudCBhcyAkZXZlbnQgKSB7DQoJCQkJCQkkZXZlbnRzWyRpXVsnaWQnXSA9IChzdHJpbmcpICRldmVudC0+aWQ7DQoJCQkJCQkkZXZlbnRzWyRpXVsndGl0bGUnXSA9IChzdHJpbmcpICRldmVudC0+dGl0bGU7DQoJCQkJCQkkaWkgPSAwOw0KCQkJCQkJZm9yZWFjaCAoICRldmVudC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkJJGV2ZW50c1skaV1bJ2FydGlzdHMnXVskaWldID0gKHN0cmluZykgJGFydGlzdDsNCgkJCQkJCQkkaWkrKzsNCgkJCQkJCX0NCgkJCQkJCSRldmVudHNbJGldWydoZWFkbGluZXInXSA9IChzdHJpbmcpICRldmVudC0+YXJ0aXN0cy0+aGVhZGxpbmVyOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ25hbWUnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPm5hbWU7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY2l0eSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNpdHk7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY291bnRyeSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnc3RyZWV0J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+c3RyZWV0Ow0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3Bvc3Rjb2RlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+cG9zdGFsY29kZTsNCgkJCQkJCSRnZW9wb2ludCA9ICAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2hpbGRyZW4oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsYXQnXSA9IChzdHJpbmcpICRnZW9wb2ludC0+cG9pbnQtPmxhdDsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsb25nJ10gPSAoc3RyaW5nKSAkZ2VvcG9pbnQtPnBvaW50LT5sb25nOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3RpbWV6b25lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+dGltZXpvbmU7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsndXJsJ10gPSAoc3RyaW5nKSAkY2FsbC0+dmVudWUtPnVybDsNCgkJCQkJCSRldmVudHNbJGldWydzdGFydGRhdGUnXSA9IHN0cnRvdGltZSh0cmltKChzdHJpbmcpICRldmVudC0+c3RhcnREYXRlKSk7DQoJCQkJCQkkZXZlbnRzWyRpXVsnZGVzY3JpcHRpb24nXSA9IChzdHJpbmcpICRldmVudC0+ZGVzY3JpcHRpb247DQoJCQkJCQkkZXZlbnRzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRldmVudC0+aW1hZ2VbMF07DQoJCQkJCQkkZXZlbnRzWyRpXVsnaW1hZ2UnXVsnbWVuZGl1bSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsxXTsNCgkJCQkJCSRldmVudHNbJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsyXTsNCgkJCQkJCSRldmVudHNbJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkZXZlbnRzWyRpXVsncmV2aWV3cyddID0gKHN0cmluZykgJGV2ZW50LT5yZXZpZXdzOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3RhZyddID0gKHN0cmluZykgJGV2ZW50LT50YWc7DQoJCQkJCQkkZXZlbnRzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCQ0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRldmVudHM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyBldmVudHMgYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gZXZlbnRzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IEltYWdlcyBmb3IgdGhpcyBhcnRpc3QgaW4gYSB2YXJpZXR5IG9mIHNpemVzLg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPnBhZ2U8L2k+LCA8aT5saW1pdDwvaT4sIDxpPm9yZGVyPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0SW1hZ2VzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5nZXRpbWFnZXMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpbWFnZXMgPSBhcnJheSgpOw0KCQkJCSRpID0gMDsNCgkJCQkkaW1hZ2VzWydhcnRpc3QnXSA9IChzdHJpbmcpJGNhbGwtPmltYWdlc1snYXJ0aXN0J107DQoJCQkJJGltYWdlc1sncGFnZSddID0gKHN0cmluZykkY2FsbC0+aW1hZ2VzWydwYWdlJ107DQoJCQkJJGltYWdlc1sndG90YWxwYWdlcyddID0gKHN0cmluZykkY2FsbC0+aW1hZ2VzWyd0b3RhbHBhZ2VzJ107DQoJCQkJJGltYWdlc1sndG90YWwnXSA9IChzdHJpbmcpJGNhbGwtPmltYWdlc1sndG90YWwnXTsNCgkJCQkNCgkJCQlmb3JlYWNoICggJGNhbGwtPmltYWdlcy0+aW1hZ2UgYXMgJGltYWdlICkgew0KCQkJCQkkaW1hZ2VzWydpbWFnZXMnXVskaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkaW1hZ2UtPnRpdGxlOw0KCQkJCQkkaW1hZ2VzWydpbWFnZXMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGltYWdlLT51cmw7DQoJCQkJCSRpbWFnZXNbJ2ltYWdlcyddWyRpXVsnZGF0ZWFkZGVkJ10gPSAoc3RyaW5nKSAkaW1hZ2UtPmRhdGVhZGRlZDsNCgkJCQkJJGltYWdlc1snaW1hZ2VzJ11bJGldWydmb3JtYXQnXSA9IChzdHJpbmcpICRpbWFnZS0+Zm9ybWF0Ow0KCQkJCQkkaW1hZ2VzWydpbWFnZXMnXVskaV1bJ3NpemVzJ10gPSBhcnJheSgpOw0KCQkJCQkkb2ZmaWNpYWwgPSBpc3NldCgkaW1hZ2VbJ29mZmljaWFsJ10pID8gKHN0cmluZykgJGltYWdlWydvZmZpY2lhbCddIDogZmFsc2U7DQoJCQkJCSRpbWFnZXNbJ2ltYWdlcyddWyRpXVsnb2ZmaWNpYWwnXSA9ICRvZmZpY2lhbCA9PSAneWVzJzsNCgkJCQkJZm9yZWFjaCggJGltYWdlLT5zaXplcy0+c2l6ZSBhcyAkc2l6ZSApIHsNCgkJCQkJCSRpbWFnZXNbJ2ltYWdlcyddWyRpXVsnc2l6ZXMnXVsoc3RyaW5nKSRzaXplWyduYW1lJ11dID0gYXJyYXkoDQoJCQkJCQkJJ3dpZHRoJyA9PiAoc3RyaW5nKSAkc2l6ZVsnd2lkdGgnXSwNCgkJCQkJCQknaGVpZ2h0JyA9PiAoc3RyaW5nKSAkc2l6ZVsnaGVpZ2h0J10sDQoJCQkJCQkJJ3VybCcgPT4gKHN0cmluZykgJHNpemUsDQoJCQkJCQkpOw0KCQkJCQl9DQoJCQkJCSRpbWFnZXNbJ2ltYWdlcyddWyRpXVsndm90ZXMnXSA9IGFycmF5KA0KCQkJCQkJJ3RodW1ic3VwJyA9PiAoc3RyaW5nKSAkaW1hZ2UtPnZvdGVzLT50aHVtYnN1cCwNCgkJCQkJCSd0aHVtYnNkb3duJyA9PiAoc3RyaW5nKSAkaW1hZ2UtPnZvdGVzLT50aHVtYnNkb3duLA0KCQkJCQkpOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGltYWdlczsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIG1ldGFkYXRhIGZvciBhbiBhcnRpc3Qgb24gTGFzdC5mbS4gSW5jbHVkZXMgYmlvZ3JhcGh5Lg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+IG9yIDxpPm1iaWQ8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbmZvKCRtZXRob2RWYXJzKSB7DQoJCSR2YXJzID0gYXJyYXkoDQoJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldGluZm8nLA0KCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJKTsNCgkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkNCgkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCSRpbmZvWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+YXJ0aXN0LT5uYW1lOw0KCQkJJGluZm9bJ21iaWQnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPm1iaWQ7DQoJCQkkaW5mb1sndXJsJ10gPSAoc3RyaW5nKSAkY2FsbC0+YXJ0aXN0LT51cmw7DQoJCQkkaW5mb1snaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPmltYWdlOw0KCQkJJGluZm9bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGNhbGwtPmFydGlzdC0+aW1hZ2VbMV07DQoJCQkkaW5mb1snaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPmltYWdlWzJdOw0KCQkJJGluZm9bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkkaW5mb1snc3RhdHMnXVsnbGlzdGVuZXJzJ10gPSAoc3RyaW5nKSAkY2FsbC0+YXJ0aXN0LT5zdGF0cy0+bGlzdGVuZXJzOw0KCQkJJGluZm9bJ3N0YXRzJ11bJ3BsYXljb3VudCddID0gKHN0cmluZykgJGNhbGwtPmFydGlzdC0+c3RhdHMtPnBsYXlzOw0KCQkJJGkgPSAwOw0KCQkJZm9yZWFjaCAoICRjYWxsLT5hcnRpc3QtPnNpbWlsYXItPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCSRpbmZvWydzaW1pbGFyJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCSRpbmZvWydzaW1pbGFyJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICRhcnRpc3QtPnVybDsNCgkJCQkkaW5mb1snc2ltaWxhciddWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlOw0KCQkJCSRpbmZvWydzaW1pbGFyJ11bJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzFdOw0KCQkJCSRpbmZvWydzaW1pbGFyJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMl07DQoJCQkJJGkrKzsNCgkJCX0NCgkJCWlmICggY291bnQoJGNhbGwtPmFydGlzdC0+dGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+YXJ0aXN0LT50YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkJJGluZm9bJ3RhZ3MnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0YWctPm5hbWU7DQoJCQkJCSRpbmZvWyd0YWdzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR0YWctPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkaW5mb1sndGFncyddID0gRkFMU0U7DQoJCQl9DQoJCQkkaW5mb1snYmlvJ11bJ3B1Ymxpc2hlZCddID0gKHN0cmluZykgJGNhbGwtPmFydGlzdC0+YmlvLT5wdWJsaXNoZWQ7DQoJCQkkaW5mb1snYmlvJ11bJ3N1bW1hcnknXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPmJpby0+c3VtbWFyeTsNCgkJCSRpbmZvWydiaW8nXVsnY29udGVudCddID0gKHN0cmluZykgJGNhbGwtPmFydGlzdC0+YmlvLT5jb250ZW50Ow0KCQkJDQoJCQlyZXR1cm4gJGluZm87DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHNob3V0cyBmb3IgdGhpcyBhcnRpc3QuDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFNob3V0cygkbWV0aG9kVmFycykgew0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldHNob3V0cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJHNob3V0c1snYXJ0aXN0J10gPSAoc3RyaW5nKSRjYWxsLT5zaG91dHNbJ2FydGlzdCddOw0KCQkJCSRzaG91dHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSRjYWxsLT5zaG91dHNbJ3RvdGFsJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+c2hvdXRzLT5zaG91dCBhcyAkc2hvdXQgKSB7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYm9keSddID0gKHN0cmluZykkc2hvdXQtPmJvZHk7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYXV0aG9yJ10gPSAoc3RyaW5nKSRzaG91dC0+YXV0aG9yOw0KCQkJCQkkc2hvdXRzWydzaG91dHMnXVskaV1bJ2RhdGUnXSA9IHN0cnRvdGltZSgoc3RyaW5nKSRzaG91dC0+ZGF0ZSk7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkc2hvdXRzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhbGwgdGhlIGFydGlzdHMgc2ltaWxhciB0byB0aGlzIGFydGlzdA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWU6IDxpPmFydGlzdDwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlOiA8aT5saW1pdDwvaT4sIDxpPjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFNpbWlsYXIoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldHNpbWlsYXInLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRzaW1pbGFyID0gJyc7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+c2ltaWxhcmFydGlzdHMtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkkc2ltaWxhclskaV1bJ25hbWUnXSA9IChzdHJpbmcpICRhcnRpc3QtPm5hbWU7DQoJCQkJCSRzaW1pbGFyWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJJHNpbWlsYXJbJGldWydtYXRjaCddID0gKHN0cmluZykgJGFydGlzdC0+bWF0Y2g7DQoJCQkJCSRzaW1pbGFyWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT51cmw7DQoJCQkJCSRzaW1pbGFyWyRpXVsnaW1hZ2UnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQkNCgkJCQlyZXR1cm4gJHNpbWlsYXI7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSB0YWdzIGFwcGxpZWQgYnkgYW4gaW5kaXZpZHVhbCB1c2VyIHRvIGFuIGFydGlzdCBvbiBMYXN0LmZtLiAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5nZXR0YWdzJywNCgkJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCQkpOw0KCQkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQkkc2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkJJHZhcnNbJ2FwaV9zaWcnXSA9ICRzaWc7DQoJCQkJDQoJCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkJaWYgKCBjb3VudCgkY2FsbC0+dGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJCQkkaSA9IDA7DQoJCQkJCQlmb3JlYWNoICggJGNhbGwtPnRhZ3NbMF0tPnRhZyBhcyAkdGFnICkgew0KCQkJCQkJCSR0YWdzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCQkkdGFnc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRhZy0+dXJsOw0KCQkJCQkJCSRpKys7DQoJCQkJCQl9DQoJCQkJCQkNCgkJCQkJCXJldHVybiAkdGFnczsNCgkJCQkJfQ0KCQkJCQllbHNlIHsNCgkJCQkJCS8vIE5vIHRhZ3NhcmUgZm91bmQNCgkJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gdGFncyBmcm9tIHRoaXMgdXNlcicpOw0KCQkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWxiZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIGFsYnVtcyBmb3IgYW4gYXJ0aXN0IG9uIExhc3QuZm0sIG9yZGVyZWQgYnkgcG9wdWxhcml0eQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BBbGJ1bXMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldHRvcGFsYnVtcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wYWxidW1zLT5hbGJ1bSkgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wYWxidW1zLT5hbGJ1bSBhcyAkYWxidW0gKSB7DQoJCQkJCQkkdG9wQWxidW1zWyRpXVsncmFuayddID0gKHN0cmluZykgJGFsYnVtWydyYW5rJ107DQoJCQkJCQkkdG9wQWxidW1zWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5uYW1lOw0KCQkJCQkJJHRvcEFsYnVtc1skaV1bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+bWJpZDsNCgkJCQkJCSR0b3BBbGJ1bXNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhbGJ1bS0+cGxheWNvdW50Ow0KCQkJCQkJJHRvcEFsYnVtc1skaV1bJ3VybCddID0gKHN0cmluZykgJGFsYnVtLT51cmw7DQoJCQkJCQkkdG9wQWxidW1zWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMF07DQoJCQkJCQkkdG9wQWxidW1zWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzFdOw0KCQkJCQkJJHRvcEFsYnVtc1skaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BBbGJ1bXM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyB0YWdzYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gdG9wIGFsYnVtcycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIGZhbnMgZm9yIGFuIGFydGlzdCBvbiBMYXN0LmZtLCBiYXNlZCBvbiBsaXN0ZW5pbmcgZGF0YQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BGYW5zKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5nZXR0b3BmYW5zJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT50b3BmYW5zLT51c2VyKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BmYW5zLT51c2VyIGFzICR1c2VyICkgew0KCQkJCQkJJHRvcEZhbnNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+bmFtZTsNCgkJCQkJCSR0b3BGYW5zWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdXNlci0+dXJsOw0KCQkJCQkJJHRvcEZhbnNbJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzBdOw0KCQkJCQkJJHRvcEZhbnNbJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICR1c2VyLT5pbWFnZVsxXTsNCgkJCQkJCSR0b3BGYW5zWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICR1c2VyLT5pbWFnZVsyXTsNCgkJCQkJCSR0b3BGYW5zWyRpXVsnd2VpZ2h0J10gPSAoc3RyaW5nKSAkdXNlci0+d2VpZ2h0Ow0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BGYW5zOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJLy8gTm8gdGFnc2FyZSBmb3VuZA0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdBcnRpc3QgaGFzIG5vIHRvcCB1c2VycycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIHRhZ3MgZm9yIGFuIGFydGlzdCBvbiBMYXN0LmZtLCBvcmRlcmVkIGJ5IHBvcHVsYXJpdHkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wVGFncygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdhcnRpc3QuZ2V0dG9wdGFncycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wdGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3B0YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkJCSR0b3BUYWdzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCSR0b3BUYWdzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdGFnLT51cmw7DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQlyZXR1cm4gJHRvcFRhZ3M7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyB0YWdzYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gdG9wIHRhZ3MnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWxiZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCB0cmFja3MgYnkgYW4gYXJ0aXN0IG9uIExhc3QuZm0sIG9yZGVyZWQgYnkgcG9wdWxhcml0eQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BUcmFja3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldHRvcHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wdHJhY2tzLT50cmFjaykgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdHJhY2tzLT50cmFjayBhcyAkdHJhY2tzICkgew0KCQkJCQkJJHRvcFRyYWNrc1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICR0cmFja3NbJ3JhbmsnXTsNCgkJCQkJCSR0b3BUcmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2tzLT5uYW1lOw0KCQkJCQkJJHRvcFRyYWNrc1skaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJHRyYWNrcy0+cGxheWNvdW50Ow0KCQkJCQkJJHRvcFRyYWNrc1skaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICR0cmFja3MtPnN0cmVhbWFibGU7DQoJCQkJCQkkdG9wVHJhY2tzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2tzLT51cmw7DQoJCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICR0cmFja3MtPmltYWdlWzBdOw0KCQkJCQkJJHRvcFRyYWNrc1skaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJHRyYWNrcy0+aW1hZ2VbMV07DQoJCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICR0cmFja3MtPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BUcmFja3M7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyB0YWdzYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gdG9wIHRyYWNrcycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFJlbW92ZSBhIHVzZXIncyB0YWcgZnJvbSBhbiBhcnRpc3QuIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRhZzwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlVGFnKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0YWcnXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5yZW1vdmV0YWcnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCBhbmQgdGFnIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNlYXJjaCBmb3IgYW4gYXJ0aXN0IGJ5IG5hbWUuIFJldHVybnMgYXJ0aXN0IG1hdGNoZXMgc29ydGVkIGJ5IHJlbGV2YW5jZQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWU6IDxpPmFydGlzdDwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+bGltaXRlPC9pPiwgPGk+cGFnZTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNlYXJjaCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdhcnRpc3Quc2VhcmNoJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkb3BlbnNlYXJjaCA9ICRjYWxsLT5yZXN1bHRzLT5jaGlsZHJlbignaHR0cDovL2E5LmNvbS8tL3NwZWMvb3BlbnNlYXJjaC8xLjEvJyk7DQoJCQkJaWYgKCAkb3BlbnNlYXJjaC0+dG90YWxSZXN1bHRzID4gMCApIHsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ3RvdGFsUmVzdWx0cyddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPnRvdGFsUmVzdWx0czsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ3N0YXJ0SW5kZXgnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT5zdGFydEluZGV4Ow0KCQkJCQkkc2VhcmNoUmVzdWx0c1snaXRlbXNQZXJQYWdlJ10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+aXRlbXNQZXJQYWdlOw0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+cmVzdWx0cy0+YXJ0aXN0bWF0Y2hlcy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFydGlzdC0+bmFtZTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5tYmlkOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlX3NtYWxsOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5pbWFnZTsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkc2VhcmNoUmVzdWx0czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCS8vIE5vIHRhZ3NhcmUgZm91bmQNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnTm8gcmVzdWx0cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNoYXJlIGFuIGFydGlzdCB3aXRoIExhc3QuZm0gdXNlcnMgb3Igb3RoZXIgZnJpZW5kcy4gKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+cmVjaXBpZW50PC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT5tZXNzYWdlPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzaGFyZSgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sncmVjaXBpZW50J10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdhcnRpc3Quc2hhcmUnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCBhbmQgcmVjaXBpZW50IHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNob3V0IGluIHRoaXMgYXJ0aXN0J3Mgc2hvdXRib3gNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+bWVzc2FnZTwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2hvdXQoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ21lc3NhZ2UnXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5zaG91dCcsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCBtZXNzYWdlIHZhcmlhYmxlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/auth.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGdldHRpbmcgYXV0aGVudGljYXRpb24gdmFsdWVzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQovKioNCiAqIEFsbG93cyBhY2Nlc3MgdG8gdGhlIGFwaSByZXF1ZXN0cyByZWxhdGluZyB0byBhdXRoZW50aWNhdGlvbg0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KY2xhc3MgbGFzdGZtQXBpQXV0aCBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBhcGkga2V5DQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXB1YmxpYyAkYXBpS2V5Ow0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgc2VjcmV0DQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXB1YmxpYyAkc2VjcmV0Ow0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aGVudGljYXRlZCB1c2VybmFtZQ0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwdWJsaWMgJHVzZXJuYW1lOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgc2Vzc2lvbiBrZXkNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHVibGljICRzZXNzaW9uS2V5Ow0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgdXNlcnMgc3Vic2NyaWJlciBzdGF0dXMNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyAkc3Vic2NyaWJlcjsNCgkNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICR0b2tlbjsNCgkNCgkvKioNCgkgKiBSdW4gd2hlbiB0aGUgY2xhc3MgaXMgY3JlYXRlZA0KCSAqIEBwYXJhbSBzdHJpbmcgJG1ldGhvZCA8aT5nZXRzZXNzaW9uPC9pPiB0byBnZXQgYSBuZXcgc2Vzc2lvbiwgPGk+c2V0c2Vzc2lvbjwvaT4gdG8gc2V0IGEgY3VycmVudCBzZXNzaW9uDQoJICogQHBhcmFtIGFycmF5ICR2YXJzIEFuIGFycmF5IG9mIHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBjbGFzcw0KCSAqIEByZXR1cm4gdm9pZA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXRob2QsICR2YXJzKSB7DQoJCWlmICggJG1ldGhvZCA9PSAnZ2V0c2Vzc2lvbicgKSB7DQoJCQlpZiAoICFlbXB0eSgkdmFyc1snYXBpS2V5J10pICYmICFlbXB0eSgkdmFyc1snc2VjcmV0J10pICYmICFlbXB0eSgkdmFyc1sndG9rZW4nXSkgKSB7DQoJCQkJJHRoaXMtPmFwaUtleSA9ICR2YXJzWydhcGlLZXknXTsNCgkJCQkkdGhpcy0+c2VjcmV0ID0gJHZhcnNbJ3NlY3JldCddOw0KCQkJCSR0aGlzLT50b2tlbiA9ICR2YXJzWyd0b2tlbiddOw0KCQkJCSR0aGlzLT5nZXRTZXNzaW9uKCk7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdNdXN0IHNlbmQgYW4gYXBpS2V5LCB0b2tlbiBhbmQgYSBzZWNyZXQgaW4gdGhlIGNhbGwgZm9yIGdldHNlc3Npb24nKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZWlmICggJG1ldGhvZCA9PSAnc2V0c2Vzc2lvbicgKSB7DQoJCQlpZiAoICFlbXB0eSgkdmFyc1snYXBpS2V5J10pICkgew0KCQkJCSR0aGlzLT5hcGlLZXkgPSAkdmFyc1snYXBpS2V5J107DQoJCQkJaWYgKCAhZW1wdHkoJHZhcnNbJ3NlY3JldCddKSAmJiAhZW1wdHkoJHZhcnNbJ3VzZXJuYW1lJ10pICYmICFlbXB0eSgkdmFyc1snc2Vzc2lvbktleSddKSAmJiBpc3NldCgkdmFyc1snc3Vic2NyaWJlciddKSApIHsNCgkJCQkJJHRoaXMtPnNlY3JldCA9ICR2YXJzWydzZWNyZXQnXTsNCgkJCQkJJHRoaXMtPnVzZXJuYW1lID0gJHZhcnNbJ3VzZXJuYW1lJ107DQoJCQkJCSR0aGlzLT5zZXNzaW9uS2V5ID0gJHZhcnNbJ3Nlc3Npb25LZXknXTsNCgkJCQkJJHRoaXMtPnN1YnNjcmliZXIgPSAkdmFyc1snc3Vic2NyaWJlciddOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ011c3Qgc2VuZCBhbiBhcGlLZXksIHNlY3JldCwgdXNlcm5hbW5lLCBzdWJjcmliZXIgYW5kIHNlc3Npb25LZXkgaW4gdGhlIGNhbGwgZm9yIHNldHNlc3Npb24nKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdJbmNvcnJlY3QgdXNlIG9mIG1ldGhvZCB2YXJpYWJsZSAoImdldHNlc3Npb24iIG9yICJzZXRzZXNzaW9uIiknKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBtZXRob2QgdXNlcyB0byBnZXQgYSBuZXcgc2Vzc2lvbiB2aWEgYW4gYXBpIGNhbGwNCgkgKiBAcmV0dXJuIHZvaWQNCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIGdldFNlc3Npb24oKSB7DQoJCSR2YXJzID0gYXJyYXkoDQoJCQknbWV0aG9kJyA9PiAnYXV0aC5nZXRzZXNzaW9uJywNCgkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXBpS2V5LA0KCQkJJ3Rva2VuJyA9PiAkdGhpcy0+dG9rZW4NCgkJKTsNCgkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPnNlY3JldCwgJHZhcnMpOw0KCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJDQoJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkkdGhpcy0+dXNlcm5hbWUgPSAoc3RyaW5nKSAkY2FsbC0+c2Vzc2lvbi0+bmFtZTsNCgkJCSR0aGlzLT5zZXNzaW9uS2V5ID0gKHN0cmluZykgJGNhbGwtPnNlc3Npb24tPmtleTsNCgkJCSR0aGlzLT5zdWJzY3JpYmVyID0gKHN0cmluZykgJGNhbGwtPnNlc3Npb24tPnN1YnNjcmliZXI7DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/event.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGV2ZW50IGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gZXZlbnRzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlFdmVudCBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBTZXQgYSB1c2VyJ3MgYXR0ZW5kYW5jZSBzdGF0dXMgZm9yIGFuIGV2ZW50LiAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5ldmVudElkPC9pPiwgPGk+c3RhdHVzICgwPUF0dGVuZGluZywgMT1NYXliZSBhdHRlbmRpbmcsIDI9Tm90IGF0dGVuZGluZyk8L2k+IA0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhdHRlbmQoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2V2ZW50J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1snc3RhdHVzJ10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdldmVudC5hdHRlbmQnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGV2ZW50SWQgYW5kIHN0YXR1cyB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIGF0dGVuZGVlcyBmb3IgYW4gZXZlbnQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+ZXZlbnRJZDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEF0dGVuZGVlcygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydldmVudCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2V2ZW50LmdldGF0dGVuZGVlcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGF0dGVuZGVlc1snaWQnXSA9IChzdHJpbmcpICRjYWxsLT5hdHRlbmRlZXNbJ2V2ZW50J107DQoJCQkJJGF0dGVuZGVlc1sndG90YWwnXSA9IChzdHJpbmcpICRjYWxsLT5hdHRlbmRlZXNbJ3RvdGFsJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+YXR0ZW5kZWVzLT51c2VyIGFzICR1c2VyICkgew0KCQkJCQkkYXR0ZW5kZWVzWydhdHRlbmRlZXMnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR1c2VyLT5uYW1lOw0KCQkJCQkkYXR0ZW5kZWVzWydhdHRlbmRlZXMnXVskaV1bJ3JlYWxuYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVhbG5hbWU7DQoJCQkJCSRhdHRlbmRlZXNbJ2F0dGVuZGVlcyddWyRpXVsnaW1hZ2VzJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMF07DQoJCQkJCSRhdHRlbmRlZXNbJ2F0dGVuZGVlcyddWyRpXVsnaW1hZ2VzJ11bJ21lZGl1bSddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzFdOw0KCQkJCQkkYXR0ZW5kZWVzWydhdHRlbmRlZXMnXVskaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzJdOw0KCQkJCQkkYXR0ZW5kZWVzWydhdHRlbmRlZXMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJHVzZXItPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJDQoJCQkJcmV0dXJuICRhdHRlbmRlZXM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBldmVudElkIGFuZCBzdGF0dXMgdmFyaWFsYmVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgbWV0YWRhdGEgZm9yIGFuIGV2ZW50IG9uIExhc3QuZm0uIEluY2x1ZGVzIGF0dGVuZGFuY2UgYW5kIGxpbmV1cCBpbmZvcm1hdGlvbg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5ldmVudElkPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0SW5mbygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydldmVudCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2V2ZW50LmdldGluZm8nLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpbmZvWydpZCddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50LT5pZDsNCgkJCQkkaW5mb1sndGl0bGUnXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+dGl0bGU7DQoJCQkJJGlpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPmV2ZW50LT5hcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJJGluZm9bJ2FydGlzdHMnXVskaWldID0gKHN0cmluZykgJGFydGlzdDsNCgkJCQkJJGlpKys7DQoJCQkJfQ0KCQkJCSRpbmZvWydoZWFkbGluZXInXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+YXJ0aXN0cy0+aGVhZGxpbmVyOw0KCQkJCSRpbmZvWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCSRpbmZvWyd2ZW51ZSddWydsb2NhdGlvbiddWydjaXR5J10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2l0eTsNCgkJCQkkaW5mb1sndmVudWUnXVsnbG9jYXRpb24nXVsnY291bnRyeSddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJJGluZm9bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkkaW5mb1sndmVudWUnXVsnbG9jYXRpb24nXVsncG9zdGNvZGUnXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+dmVudWUtPmxvY2F0aW9uLT5wb3N0YWxjb2RlOw0KCQkJCSRnZW9wb2ludCA9ICAkY2FsbC0+ZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2hpbGRyZW4oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsNCgkJCQkkaW5mb1sndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbGF0J10gPSAoc3RyaW5nKSAkZ2VvcG9pbnQtPnBvaW50LT5sYXQ7DQoJCQkJJGluZm9bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xvbmcnXSA9IChzdHJpbmcpICRnZW9wb2ludC0+cG9pbnQtPmxvbmc7DQoJCQkJJGluZm9bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3RpbWV6b25lJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+dGltZXpvbmU7DQoJCQkJJGluZm9bJ3ZlbnVlJ11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnZlbnVlLT51cmw7DQoJCQkJJGluZm9bJ3N0YXJ0ZGF0ZSddID0gc3RydG90aW1lKHRyaW0oKHN0cmluZykgJGNhbGwtPmV2ZW50LT5zdGFydERhdGUpKTsNCgkJCQkkaW5mb1snZGVzY3JpcHRpb24nXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+ZGVzY3JpcHRpb247DQoJCQkJJGluZm9bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPmltYWdlWzBdOw0KCQkJCSRpbmZvWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+aW1hZ2VbMV07DQoJCQkJJGluZm9bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPmltYWdlWzJdOw0KCQkJCSRpbmZvWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJJGluZm9bJ3Jldmlld3MnXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+cmV2aWV3czsNCgkJCQkkaW5mb1sndGFnJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnRhZzsNCgkJCQkkaW5mb1sndXJsJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnVybDsNCgkJCQkNCgkJCQlyZXR1cm4gJGluZm87DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBldmVudElkIGFuZCBzdGF0dXMgdmFyaWFsYmVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBzaG91dHMgZm9yIHRoaXMgZXZlbnQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+ZXZlbnRJZDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFNob3V0cygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydldmVudCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2V2ZW50LmdldHNob3V0cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJHNob3V0c1snaWQnXSA9IChzdHJpbmcpICRjYWxsLT5zaG91dHNbJ2V2ZW50J107DQoJCQkJJHNob3V0c1sndG90YWwnXSA9IChzdHJpbmcpICRjYWxsLT5zaG91dHNbJ3RvdGFsJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+c2hvdXRzLT5zaG91dCBhcyAkc2hvdXQgKSB7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYm9keSddID0gKHN0cmluZykgJHNob3V0LT5ib2R5Ow0KCQkJCQkkc2hvdXRzWydzaG91dHMnXVskaV1bJ2F1dGhvciddID0gKHN0cmluZykgJHNob3V0LT5hdXRob3I7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnZGF0ZSddID0gc3RydG90aW1lKChzdHJpbmcpICRzaG91dC0+ZGF0ZSk7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkc2hvdXRzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgZXZlbnRJZCBhbmQgc3RhdHVzIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBTaGFyZSBhbiBldmVudCB3aXRoIG9uZSBvciBtb3JlIExhc3QuZm0gdXNlcnMgb3Igb3RoZXIgZnJpZW5kcy4gKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+ZXZlbnRJZDwvaT4sIDxpPnJlY2lwaWVudDwvaT4gYW5kIG9wdGlvbiB2YWx1ZTogPGk+bWVzc2FnZTwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2hhcmUoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2V2ZW50J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sncmVjaXBpZW50J10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdldmVudC5zaGFyZScsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgZXZlbnRJZCBhbmQgcmVjaXBpZW50IHZhcmlhYmxlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNob3V0IGluIHRoaXMgZXZlbnQncyBzaG91dGJveCAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5ldmVudElkPC9pPiwgPGk+bWVzc2FnZTwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2hvdXQoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2V2ZW50J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1snbWVzc2FnZSddKSApIHsNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAnZXZlbnQuc2hvdXQnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGV2ZW50SWQgYW5kIG1lc3NhZ2UgdmFyaWFibGVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/geo.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGdlb2dyYXBoaWNhbCBhcGkgY2FsbHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgYXBpIHJlcXVlc3RzIHJlbGF0aW5nIHRvIGdlb2dyYXBoaWNhbCBkYXRlDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlHZW8gZXh0ZW5kcyBsYXN0Zm1BcGkgew0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgY29uZmlnIHZhbHVlcyBzZXQgaW4gdGhlIGNhbGwNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwdWJsaWMgJGNvbmZpZzsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGF1dGggdmFyaWFibGVzIHVzZWQgaW4gYWxsIGFwaSBjYWxscw0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRhdXRoOw0KCS8qKg0KCSAqIFN0YXRlcyBpZiB0aGUgdXNlciBoYXMgZnVsbCBhdXRoZW50aWNhdGlvbiB0byB1c2UgYXBpIHJlcXVlc3RzIHRoYXQgbW9kaWZ5IGRhdGENCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIGJvb2xlYW4NCgkgKi8NCglwcml2YXRlICRmdWxsQXV0aDsNCgkNCgkvKioNCgkgKiBAcGFyYW0gYXJyYXkgJGF1dGggUGFzc2VzIHRoZSBhdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gYXJyYXkgJGZ1bGxBdXRoIEEgYm9vbGVhbiB2YWx1ZSBzdGF0aW5nIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIG9yIG5vdA0KCSAqIEBwYXJhbSBhcnJheSAkY29uZmlnIEFuIGFycmF5IG9mIGNvbmZpZyB2YXJpYWJsZXMgcmVsYXRlZCB0byBjYWNoaW5nIGFuZCBvdGhlciBmZWF0dXJlcw0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRhdXRoLCAkZnVsbEF1dGgsICRjb25maWcpIHsNCgkJJHRoaXMtPmF1dGggPSAkYXV0aDsNCgkJJHRoaXMtPmZ1bGxBdXRoID0gJGZ1bGxBdXRoOw0KCQkkdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsNCgl9DQoJDQoJLyoqDQoJICogR2V0IGFsbCBldmVudHMgaW4gYSBzcGVjaWZpYyBsb2NhdGlvbiBieSBjb3VudHJ5IG9yIGNpdHkgbmFtZS4NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+bG9jYXRpb248L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPmRpc3RhbmNlPC9pPiwgPGk+cGFnZTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEV2ZW50cygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydsb2NhdGlvbiddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2dlby5nZXRldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRldmVudHNbJ2xvY2F0aW9uJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWydsb2NhdGlvbiddOw0KCQkJCSRldmVudHNbJ2N1cnJlbnRQYWdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWydwYWdlJ107DQoJCQkJJGV2ZW50c1sndG90YWxQYWdlcyddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndG90YWxwYWdlcyddOw0KCQkJCSRldmVudHNbJ3RvdGFsUmVzdWx0cyddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndG90YWwnXTsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT5ldmVudHMtPmV2ZW50IGFzICRldmVudCApIHsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWydpZCddID0gKHN0cmluZykgJGV2ZW50LT5pZDsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd0aXRsZSddID0gKHN0cmluZykgJGV2ZW50LT50aXRsZTsNCgkJCQkJJGlpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRldmVudC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ2FydGlzdHMnXVskaWldID0gKHN0cmluZykgJGFydGlzdDsNCgkJCQkJCSRpaSsrOw0KCQkJCQl9DQoJCQkJCSRldmVudHNbJ2V2ZW50cyddWyRpXVsnaGVhZGxpbmVyJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmFydGlzdHMtPmhlYWRsaW5lcjsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NpdHknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jaXR5Ow0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NvdW50cnknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jb3VudHJ5Ow0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydwb3N0YWxjb2RlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+cG9zdGFsY29kZTsNCgkJCQkJJGdlb1RhZ3MgPSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2hpbGRyZW4oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydwb2ludCddWydsYXQnXSA9IChzdHJpbmcpICRnZW9UYWdzLT5wb2ludC0+bGF0Ow0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3BvaW50J11bJ2xvbmcnXSA9IChzdHJpbmcpICRnZW9UYWdzLT5wb2ludC0+bG9uZzsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWyd0aW1lem9uZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnRpbWV6b25lOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ3VybCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+dXJsOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3N0YXJ0RGF0ZSddID0gc3RydG90aW1lKHRyaW0oKHN0cmluZykgJGV2ZW50LT5zdGFydERhdGUpKTsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWydzdGFydFRpbWUnXSA9IChzdHJpbmcpICRldmVudC0+c3RhcnRUaW1lOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ2Rlc2NyaXB0aW9uJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmRlc2NyaXB0aW9uOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ2F0dGVuZGFuY2UnXSA9IChzdHJpbmcpICRldmVudC0+YXR0ZW5kYW5jZTsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWydyZXZpZXdzJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnJldmlld3M7DQoJCQkJCSRldmVudHNbJ2V2ZW50cyddWyRpXVsndGFnJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRhZzsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICRldmVudC0+dXJsOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGV2ZW50czsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgbG9jYXRpb24gdmFyaWFsYmUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSBtb3N0IHBvcHVsYXIgYXJ0aXN0cyBvbiBMYXN0LmZtIGJ5IGNvdW50cnkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+Y291bnRyeTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcEFydGlzdHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snY291bnRyeSddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2dlby5nZXR0b3BhcnRpc3RzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BhcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJJHRvcEFydGlzdHNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICRhcnRpc3RbJ3JhbmsnXTsNCgkJCQkJJHRvcEFydGlzdHNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhcnRpc3QtPnBsYXljb3VudDsNCgkJCQkJJHRvcEFydGlzdHNbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5tYmlkOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkJCSR0b3BBcnRpc3RzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzBdOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCSR0b3BBcnRpc3RzWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzJdOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQkNCgkJCQlyZXR1cm4gJHRvcEFydGlzdHM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhIGNvdW50cnkgdmFyaWFsYmUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSBtb3N0IHBvcHVsYXIgdHJhY2tzIG9uIExhc3QuZm0gbGFzdCB3ZWVrIGJ5IGNvdW50cnkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+Y291bnRyeTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcFRyYWNrcygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydjb3VudHJ5J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnZ2VvLmdldHRvcHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCSR0b3BUcmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCSR0b3BUcmFja3NbJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkdHJhY2tbJ3JhbmsnXTsNCgkJCQkJJHRvcFRyYWNrc1skaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJHRyYWNrLT5wbGF5Y291bnQ7DQoJCQkJCSR0b3BUcmFja3NbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPm1iaWQ7DQoJCQkJCSR0b3BUcmFja3NbJGldWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+dXJsOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnZnVsbHRyYWNrJ10gPSAoc3RyaW5nKSAkdHJhY2stPnN0cmVhbWFibGVbJ2Z1bGx0cmFjayddOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5uYW1lOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnYXJ0aXN0J11bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT5hcnRpc3QtPnVybDsNCgkJCQkJJHRvcFRyYWNrc1skaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzBdOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzFdOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMl07DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkdG9wVHJhY2tzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYSBjb3VudHJ5IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/group.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGdyb3VwIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gZ3JvdXBzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlHcm91cCBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIG1lbWJlcnMgZm9yIHRoaXMgZ3JvdXANCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+Z3JvdXA8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRNZW1iZXJzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2dyb3VwJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnZ3JvdXAuZ2V0bWVtYmVycycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCSRtZW1iZXJzWydmb3InXSA9IChzdHJpbmcpICRjYWxsLT5tZW1iZXJzWydmb3InXTsNCgkJCQkkbWVtYmVyc1sncGFnZSddID0gKHN0cmluZykgJGNhbGwtPm1lbWJlcnNbJ3BhZ2UnXTsNCgkJCQkkbWVtYmVyc1sncGVyUGFnZSddID0gKHN0cmluZykgJGNhbGwtPm1lbWJlcnNbJ3BlclBhZ2UnXTsNCgkJCQkkbWVtYmVyc1sndG90YWxQYWdlcyddID0gKHN0cmluZykgJGNhbGwtPm1lbWJlcnNbJ3RvdGFsUGFnZXMnXTsNCgkJCQlmb3JlYWNoICggJGNhbGwtPm1lbWJlcnMtPnVzZXIgYXMgJHVzZXIgKSB7DQoJCQkJCSRtZW1iZXJzWydtZW1iZXJzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+bmFtZTsNCgkJCQkJJG1lbWJlcnNbJ21lbWJlcnMnXVskaV1bJ3JlYWxuYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVhbG5hbWU7DQoJCQkJCSRtZW1iZXJzWydtZW1iZXJzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR1c2VyLT51cmw7DQoJCQkJCSRtZW1iZXJzWydtZW1iZXJzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzBdOw0KCQkJCQkkbWVtYmVyc1snbWVtYmVycyddWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMV07DQoJCQkJCSRtZW1iZXJzWydtZW1iZXJzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzJdOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJG1lbWJlcnM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhIGdyb3VwIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhbiBhbGJ1bSBjaGFydCBmb3IgYSBncm91cCwgZm9yIGEgZ2l2ZW4gZGF0ZSByYW5nZS4gSWYgbm8gZGF0ZSByYW5nZSBpcyBzdXBwbGllZCwgaXQgd2lsbCByZXR1cm4gdGhlIG1vc3QgcmVjZW50IGFsYnVtIGNoYXJ0IGZvciB0aGlzIGdyb3VwDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmdyb3VwPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT5mcm9tPC9pPiwgPGk+dG88L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlBbGJ1bUNoYXJ0KCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2dyb3VwJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnZ3JvdXAuZ2V0d2Vla2x5YWxidW1jaGFydCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+d2Vla2x5YWxidW1jaGFydC0+YWxidW0gYXMgJGFsYnVtICkgew0KCQkJCQkkYWxidW1zWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5uYW1lOw0KCQkJCQkkYWxidW1zWyRpXVsncmFuayddID0gKHN0cmluZykgJGFsYnVtWydyYW5rJ107DQoJCQkJCSRhbGJ1bXNbJGldWydhcnRpc3QnXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3Q7DQoJCQkJCSRhbGJ1bXNbJGldWydhcnRpc3QnXVsnbWJpZCddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3RbJ21iaWQnXTsNCgkJCQkJJGFsYnVtc1skaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJGFsYnVtLT5wbGF5Y291bnQ7DQoJCQkJCSRhbGJ1bXNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+dXJsOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGFsYnVtczsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgZ3JvdXAgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGFuIGFydGlzdCBjaGFydCBmb3IgYSBncm91cCwgZm9yIGEgZ2l2ZW4gZGF0ZSByYW5nZS4gSWYgbm8gZGF0ZSByYW5nZSBpcyBzdXBwbGllZCwgaXQgd2lsbCByZXR1cm4gdGhlIG1vc3QgcmVjZW50IGFsYnVtIGNoYXJ0IGZvciB0aGlzIGdyb3VwDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmdyb3VwPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT5mcm9tPC9pPiwgPGk+dG88L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlBcnRpc3RDaGFydCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydncm91cCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2dyb3VwLmdldHdlZWtseWFydGlzdGNoYXJ0JywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT53ZWVrbHlhcnRpc3RjaGFydC0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCSRhcnRpc3RzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFydGlzdC0+bmFtZTsNCgkJCQkJJGFydGlzdHNbJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkYXJ0aXN0WydyYW5rJ107DQoJCQkJCSRhcnRpc3RzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJJGFydGlzdHNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhcnRpc3QtPnBsYXljb3VudDsNCgkJCQkJJGFydGlzdHNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhcnRpc3QtPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICRhcnRpc3RzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYSBncm91cCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGFydHMgZm9yIHRoaXMgZ3JvdXAsIGV4cHJlc3NlZCBhcyBkYXRlIHJhbmdlcyB3aGljaCBjYW4gYmUgc2VudCB0byB0aGUgY2hhcnQgc2VydmljZXMNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+Z3JvdXA8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlDaGFydExpc3QoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snZ3JvdXAnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdncm91cC5nZXR3ZWVrbHljaGFydGxpc3QnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPndlZWtseWNoYXJ0bGlzdC0+Y2hhcnQgYXMgJGNoYXJ0ICkgew0KCQkJCQkkY2hhcnRMaXN0WyRpXVsnZnJvbSddID0gKHN0cmluZykgJGNoYXJ0Wydmcm9tJ107DQoJCQkJCSRjaGFydExpc3RbJGldWyd0byddID0gKHN0cmluZykgJGNoYXJ0Wyd0byddOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGNoYXJ0TGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgZ3JvdXAgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgdHJhY2sgY2hhcnQgZm9yIGEgZ3JvdXAsIGZvciBhIGdpdmVuIGRhdGUgcmFuZ2UuIElmIG5vIGRhdGUgcmFuZ2UgaXMgc3VwcGxpZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBhbGJ1bSBjaGFydCBmb3IgdGhpcyBncm91cA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5ncm91cDwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+ZnJvbTwvaT4sIDxpPnRvPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5VHJhY2tDaGFydCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydncm91cCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2dyb3VwLmdldHdlZWtseXRyYWNrY2hhcnQnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPndlZWtseXRyYWNrY2hhcnQtPnRyYWNrIGFzICR0cmFjayApIHsNCgkJCQkJJHRyYWNrc1skaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+bmFtZTsNCgkJCQkJJHRyYWNrc1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICR0cmFja1sncmFuayddOw0KCQkJCQkkdHJhY2tzWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0Ow0KCQkJCQkkdHJhY2tzWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0WydtYmlkJ107DQoJCQkJCSR0cmFja3NbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICR0cmFjay0+cGxheWNvdW50Ow0KCQkJCQkkdHJhY2tzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICR0cmFja3M7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhIGdyb3VwIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/library.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHVzZXIgbGlicmFyeSBhcGkgY2FsbHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgYXBpIHJlcXVlc3RzIHJlbGF0aW5nIHRvIHVzZXIgbGlicmFyaWVzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlMaWJyYXJ5IGV4dGVuZHMgbGFzdGZtQXBpIHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGNvbmZpZyB2YWx1ZXMgc2V0IGluIHRoZSBjYWxsDQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHVibGljICRjb25maWc7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBhdXRoIHZhcmlhYmxlcyB1c2VkIGluIGFsbCBhcGkgY2FsbHMNCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkYXV0aDsNCgkvKioNCgkgKiBTdGF0ZXMgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gdG8gdXNlIGFwaSByZXF1ZXN0cyB0aGF0IG1vZGlmeSBkYXRhDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHJpdmF0ZSAkZnVsbEF1dGg7DQoJDQoJLyoqDQoJICogQHBhcmFtIGFycmF5ICRhdXRoIFBhc3NlcyB0aGUgYXV0aGVudGljYXRpb24gdmFyaWFibGVzDQoJICogQHBhcmFtIGFycmF5ICRmdWxsQXV0aCBBIGJvb2xlYW4gdmFsdWUgc3RhdGluZyBpZiB0aGUgdXNlciBoYXMgZnVsbCBhdXRoZW50aWNhdGlvbiBvciBub3QNCgkgKiBAcGFyYW0gYXJyYXkgJGNvbmZpZyBBbiBhcnJheSBvZiBjb25maWcgdmFyaWFibGVzIHJlbGF0ZWQgdG8gY2FjaGluZyBhbmQgb3RoZXIgZmVhdHVyZXMNCgkgKi8NCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYXV0aCwgJGZ1bGxBdXRoLCAkY29uZmlnKSB7DQoJCSR0aGlzLT5hdXRoID0gJGF1dGg7DQoJCSR0aGlzLT5mdWxsQXV0aCA9ICRmdWxsQXV0aDsNCgkJJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7DQoJfQ0KCQ0KCS8qKg0KCSAqIEFkZCBhbiBhbGJ1bSB0byBhIHVzZXIncyBMYXN0LmZtIGxpYnJhcnkgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+YWxidW08L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZEFsYnVtKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWydhbGJ1bSddKSApIHsNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAnbGlicmFyeS5hZGRhbGJ1bScsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCBhbGJ1bSB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBBZGQgYW4gYXJ0aXN0IHRvIGEgdXNlcidzIExhc3QuZm0gbGlicmFyeSAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZEFydGlzdCgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdsaWJyYXJ5LmFkZGFydGlzdCcsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogQWRkIGEgdHJhY2sgdG8gYSB1c2VyJ3MgTGFzdC5mbSBsaWJyYXJ5IChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRUcmFjaygkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndHJhY2snXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2xpYnJhcnkuYWRkdHJhY2snLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCBhbmQgdHJhY2sgdmFyaWFsYmVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogQSBwYWdpbmF0ZWQgbGlzdCBvZiBhbGwgdGhlIGFsYnVtcyBpbiBhIHVzZXIncyBsaWJyYXJ5LCB3aXRoIHBsYXkgY291bnRzIGFuZCB0YWcgY291bnRzDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPnBhZ2U8L2k+LCA8aT5saW1pdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEFsYnVtcygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnbGlicmFyeS5nZXRhbGJ1bXMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRhbGJ1bXNbJ3BhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bXNbJ3BhZ2UnXTsNCgkJCQkkYWxidW1zWydwZXJQYWdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW1zWydwZXJQYWdlJ107DQoJCQkJJGFsYnVtc1sndG90YWxQYWdlcyddID0gKHN0cmluZykgJGNhbGwtPmFsYnVtc1sndG90YWxQYWdlcyddOw0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPmFsYnVtcy0+YWxidW0gYXMgJGFsYnVtICkgew0KCQkJCQkkYWxidW1zWydyZXN1bHRzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYWxidW0tPm5hbWU7DQoJCQkJCS8vIFRISVMgRE9FU04nVCBXT1JLIEFTIERPQ1VNRU5URUQgIC0tLSAkYWxidW1zWydyZXN1bHRzJ11bJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkYWxidW1bJ3JhbmsnXTsNCgkJCQkJJGFsYnVtc1sncmVzdWx0cyddWyRpXVsncGxheWNvdW50J10gPSAoc3RyaW5nKSAkYWxidW0tPnBsYXljb3VudDsNCgkJCQkJJGFsYnVtc1sncmVzdWx0cyddWyRpXVsndGFnY291bnQnXSA9IChzdHJpbmcpICRhbGJ1bS0+dGFnY291bnQ7DQoJCQkJCSRhbGJ1bXNbJ3Jlc3VsdHMnXVskaV1bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+bWJpZDsNCgkJCQkJJGFsYnVtc1sncmVzdWx0cyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYWxidW0tPnVybDsNCgkJCQkJJGFsYnVtc1sncmVzdWx0cyddWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT5uYW1lOw0KCQkJCQkkYWxidW1zWydyZXN1bHRzJ11bJGldWydhcnRpc3QnXVsnbWJpZCddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3QtPm1iaWQ7DQoJCQkJCSRhbGJ1bXNbJ3Jlc3VsdHMnXVskaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT51cmw7DQoJCQkJCSRhbGJ1bXNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzBdOw0KCQkJCQkkYWxidW1zWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMV07DQoJCQkJCSRhbGJ1bXNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzJdOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGFsYnVtczsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgdXNlciB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBBIHBhZ2luYXRlZCBsaXN0IG9mIGFsbCB0aGUgYXJ0aXN0cyBpbiBhIHVzZXIncyBsaWJyYXJ5LCB3aXRoIHBsYXkgY291bnRzIGFuZCB0YWcgY291bnRzDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPnBhZ2U8L2k+LCA8aT5saW1pdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEFydGlzdHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2xpYnJhcnkuZ2V0YXJ0aXN0cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGFydGlzdHNbJ3BhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3RzWydwYWdlJ107DQoJCQkJJGFydGlzdHNbJ3BlclBhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3RzWydwZXJQYWdlJ107DQoJCQkJJGFydGlzdHNbJ3RvdGFsUGFnZXMnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3RzWyd0b3RhbFBhZ2VzJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCSRhcnRpc3RzWydyZXN1bHRzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCQkvLyBUSElTIERPRVNOJ1QgV09SSyBBUyBET0NVTUVOVEVEICAtLS0gJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ3JhbmsnXSA9IChzdHJpbmcpICRhcnRpc3RbJ3JhbmsnXTsNCgkJCQkJJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJGFydGlzdC0+cGxheWNvdW50Ow0KCQkJCQkkYXJ0aXN0c1sncmVzdWx0cyddWyRpXVsndGFnY291bnQnXSA9IChzdHJpbmcpICRhcnRpc3QtPnRhZ2NvdW50Ow0KCQkJCQkkYXJ0aXN0c1sncmVzdWx0cyddWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkkYXJ0aXN0c1sncmVzdWx0cyddWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJGFydGlzdC0+c3RyZWFtYWJsZTsNCgkJCQkJJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5pbWFnZVswXTsNCgkJCQkJJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCSRhcnRpc3RzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMl07DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCXJldHVybiAkYXJ0aXN0czsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgdXNlciB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBBIHBhZ2luYXRlZCBsaXN0IG9mIGFsbCB0aGUgdHJhY2tzIGluIGEgdXNlcidzIGxpYnJhcnksIHdpdGggcGxheSBjb3VudHMgYW5kIHRhZyBjb3VudHMNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+cGFnZTwvaT4sIDxpPmxpbWl0PC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhY2tzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdsaWJyYXJ5LmdldHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJHRyYWNrc1sncGFnZSddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrc1sncGFnZSddOw0KCQkJCSR0cmFja3NbJ3BlclBhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT50cmFja3NbJ3BlclBhZ2UnXTsNCgkJCQkkdHJhY2tzWyd0b3RhbFBhZ2VzJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2tzWyd0b3RhbFBhZ2VzJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+dHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCSR0cmFja3NbJ3Jlc3VsdHMnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+bmFtZTsNCgkJCQkJLy8gVEhJUyBET0VTTidUIFdPUksgQVMgRE9DVU1FTlRFRCAgLS0tICR0cmFja3NbJ3Jlc3VsdHMnXVskaV1bJ3JhbmsnXSA9IChzdHJpbmcpICR0cmFja1sncmFuayddOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICR0cmFjay0+cGxheWNvdW50Ow0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWyd0YWdjb3VudCddID0gKHN0cmluZykgJHRyYWNrLT50YWdjb3VudDsNCgkJCQkJJHRyYWNrc1sncmVzdWx0cyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPnVybDsNCgkJCQkJJHRyYWNrc1sncmVzdWx0cyddWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkJCSR0cmFja3NbJ3Jlc3VsdHMnXVskaV1bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCQkJJHRyYWNrc1sncmVzdWx0cyddWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydhcnRpc3QnXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+dXJsOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVswXTsNCgkJCQkJJHRyYWNrc1sncmVzdWx0cyddWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzFdOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVsyXTsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICR0cmFja3M7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhIHVzZXIgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/playlist.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHVzZXIgcGxheWxpc3RzIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdXNlciBwbGF5bGlzdHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCmNsYXNzIGxhc3RmbUFwaVBsYXlsaXN0IGV4dGVuZHMgbGFzdGZtQXBpIHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGNvbmZpZyB2YWx1ZXMgc2V0IGluIHRoZSBjYWxsDQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHVibGljICRjb25maWc7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBhdXRoIHZhcmlhYmxlcyB1c2VkIGluIGFsbCBhcGkgY2FsbHMNCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkYXV0aDsNCgkvKioNCgkgKiBTdGF0ZXMgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gdG8gdXNlIGFwaSByZXF1ZXN0cyB0aGF0IG1vZGlmeSBkYXRhDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHJpdmF0ZSAkZnVsbEF1dGg7DQoJDQoJLyoqDQoJICogQHBhcmFtIGFycmF5ICRhdXRoIFBhc3NlcyB0aGUgYXV0aGVudGljYXRpb24gdmFyaWFibGVzDQoJICogQHBhcmFtIGFycmF5ICRmdWxsQXV0aCBBIGJvb2xlYW4gdmFsdWUgc3RhdGluZyBpZiB0aGUgdXNlciBoYXMgZnVsbCBhdXRoZW50aWNhdGlvbiBvciBub3QNCgkgKiBAcGFyYW0gYXJyYXkgJGNvbmZpZyBBbiBhcnJheSBvZiBjb25maWcgdmFyaWFibGVzIHJlbGF0ZWQgdG8gY2FjaGluZyBhbmQgb3RoZXIgZmVhdHVyZXMNCgkgKi8NCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYXV0aCwgJGZ1bGxBdXRoLCAkY29uZmlnKSB7DQoJCSR0aGlzLT5hdXRoID0gJGF1dGg7DQoJCSR0aGlzLT5mdWxsQXV0aCA9ICRmdWxsQXV0aDsNCgkJJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7DQoJfQ0KCQ0KCS8qKg0KCSAqIEFkZCBhIHRyYWNrIHRvIGEgTGFzdC5mbSB1c2VyJ3MgcGxheWxpc3QgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+cGxheWxpc3RJZDwvaT4sIDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRUcmFjaygkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sncGxheWxpc3RJRCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdwbGF5bGlzdC5hZGR0cmFjaycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgcGxheWxpc3RJZCwgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBDcmVhdGUgYSBMYXN0LmZtIHBsYXlsaXN0IG9uIGJlaGFsZiBvZiBhIHVzZXIgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHZhbHVlczogPGk+dGl0bGU8L2k+LCA8aT5kZXNjcmlwdGlvbjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGNyZWF0ZSgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdwbGF5bGlzdC5jcmVhdGUnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkkc2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlQb3N0Q2FsbCgkdmFycywgJ3htbCcpICkgew0KCQkJCSRwbGF5bGlzdFsndXNlciddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0c1sndXNlciddOw0KCQkJCSRwbGF5bGlzdFsnaWQnXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdHMtPnBsYXlsaXN0LT5pZDsNCgkJCQkkcGxheWxpc3RbJ3RpdGxlJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+dGl0bGU7DQoJCQkJJHBsYXlsaXN0WydkZXNjcmlwdGlvbiddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0cy0+cGxheWxpc3QtPmRlc2NyaXB0aW9uOw0KCQkJCSRwbGF5bGlzdFsnZGF0ZSddID0gc3RydG90aW1lKHRyaW0oKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0cy0+cGxheWxpc3QtPmRhdGUpKTs7DQoJCQkJJHBsYXlsaXN0WydzaXplJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+c2l6ZTsNCgkJCQkkcGxheWxpc3RbJ2R1cmF0aW9uJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+ZHVyYXRpb247DQoJCQkJJHBsYXlsaXN0WydjcmVhdG9yJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+Y3JlYXRvcjsNCgkJCQkkcGxheWxpc3RbJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0cy0+cGxheWxpc3QtPnVybDsNCgkJCQkkcGxheWxpc3RbJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+aW1hZ2VbMF07DQoJCQkJJHBsYXlsaXN0WydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdHMtPnBsYXlsaXN0LT5pbWFnZVsxXTsNCgkJCQkkcGxheWxpc3RbJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+aW1hZ2VbMl07DQoJCQkJDQoJCQkJcmV0dXJuICRwbGF5bGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogRmV0Y2ggWFNQRiBwbGF5bGlzdHMgdXNpbmcgYSBsYXN0Zm0gcGxheWxpc3QgdXJsDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnBsYXlsaXN0VXJsPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZmV0Y2goJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sncGxheWxpc3RVUkwnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdwbGF5bGlzdC5mZXRjaCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJHBsYXlsaXN0Wyd0aXRsZSddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0LT50aXRsZTsNCgkJCQkkcGxheWxpc3RbJ2Fubm90YXRpb24nXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdC0+YW5ub3RhdGlvbjsNCgkJCQkkcGxheWxpc3RbJ2NyZWF0b3InXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdC0+Y3JlYXRvcjsNCgkJCQkkcGxheWxpc3RbJ2RhdGUnXSA9IHN0cnRvdGltZSh0cmltKChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdC0+ZGF0ZSkpOw0KCQkJCSRwbGF5bGlzdFsndmVyc2lvbiddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0Wyd2ZXJzaW9uJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+cGxheWxpc3QtPnRyYWNrTGlzdC0+dHJhY2sgYXMgJHRyYWNrICkgew0KCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdGluZyddWyRpXVsndGl0bGUnXSA9IChzdHJpbmcpICR0cmFjay0+dGl0bGU7DQoJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0aW5nJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT50cmFja3BhZ2U7DQoJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0aW5nJ11bJGldWydkdXJhdGlvbiddID0gKHN0cmluZykgJHRyYWNrLT5kdXJhdGlvbjsNCgkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3RpbmcnXVskaV1bJ2luZm8nXSA9IChzdHJpbmcpICR0cmFjay0+aW5mbzsNCgkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3RpbmcnXVskaV1bJ2ltYWdlJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlOw0KCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdGluZyddWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+Y3JlYXRvcjsNCgkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3RpbmcnXVskaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT5hcnRpc3RwYWdlOw0KCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdGluZyddWyRpXVsnYWxidW0nXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5hbGJ1bTsNCgkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3RpbmcnXVskaV1bJ2FsYnVtJ11bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT5leHRlbnNpb24tPmFsYnVtcGFnZTsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICRwbGF5bGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIHBsYXlsaXN0VXJsIHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/radio.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHJhZGlvIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdGhlIGxhc3RmbSByYWRpbw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KY2xhc3MgbGFzdGZtQXBpUmFkaW8gZXh0ZW5kcyBsYXN0Zm1BcGkgew0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgY29uZmlnIHZhbHVlcyBzZXQgaW4gdGhlIGNhbGwNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwdWJsaWMgJGNvbmZpZzsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGF1dGggdmFyaWFibGVzIHVzZWQgaW4gYWxsIGFwaSBjYWxscw0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRhdXRoOw0KCS8qKg0KCSAqIFN0YXRlcyBpZiB0aGUgdXNlciBoYXMgZnVsbCBhdXRoZW50aWNhdGlvbiB0byB1c2UgYXBpIHJlcXVlc3RzIHRoYXQgbW9kaWZ5IGRhdGENCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIGJvb2xlYW4NCgkgKi8NCglwcml2YXRlICRmdWxsQXV0aDsNCgkNCgkvKioNCgkgKiBAcGFyYW0gYXJyYXkgJGF1dGggUGFzc2VzIHRoZSBhdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gYXJyYXkgJGZ1bGxBdXRoIEEgYm9vbGVhbiB2YWx1ZSBzdGF0aW5nIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIG9yIG5vdA0KCSAqIEBwYXJhbSBhcnJheSAkY29uZmlnIEFuIGFycmF5IG9mIGNvbmZpZyB2YXJpYWJsZXMgcmVsYXRlZCB0byBjYWNoaW5nIGFuZCBvdGhlciBmZWF0dXJlcw0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRhdXRoLCAkZnVsbEF1dGgsICRjb25maWcpIHsNCgkJJHRoaXMtPmF1dGggPSAkYXV0aDsNCgkJJHRoaXMtPmZ1bGxBdXRoID0gJGZ1bGxBdXRoOw0KCQkkdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsNCgl9DQoJDQoJLyoqDQoJICogVHVuZSBpbnRvIGEgcmFkaW8gc3RhdGlvbiB1c2luZyBhIGxhc3RmbSByYWRpbyB1cmwuIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZTogPGk+c3RhdGlvbjwvaT4gYW5kIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgdmFsdWU6IDxpPmxhbmc8L2k+IA0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gdHVuZSgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snc3RhdGlvbiddKSApIHsNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAncmFkaW8udHVuZScsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJDQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQkkdHVuZVsndHlwZSddID0gKHN0cmluZykgJGNhbGwtPnN0YXRpb24tPnR5cGU7DQoJCQkJCSR0dW5lWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+c3RhdGlvbi0+bmFtZTsNCgkJCQkJJHR1bmVbJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnN0YXRpb24tPnVybDsNCgkJCQkJJHR1bmVbJ3N1cHBvcnRzZGlzY292ZXJ5J10gPSAoc3RyaW5nKSAkY2FsbC0+c3RhdGlvbi0+c3VwcG9ydHNkaXNjb3Zlcnk7DQoJCQkJCQ0KCQkJCQlyZXR1cm4gJHR1bmU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGV2ZW50SWQgYW5kIHN0YXR1cyB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBwbGF5bGlzdCBvZiBzb25ncyB0byBwbGF5IHVzaW5nIHRoZSByYWRpbyBBUEkuIE11c3QgcnVuIHJhZGlvLnR1bmUgZmlyc3QuIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25hbCB2YWx1ZXM6IDxpPmRpc2NvdmVyeTwvaT4gYW5kIDxpPnJ0cDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFBsYXlsaXN0KCRtZXRob2RWYXJzID0gQXJyYXkoKSkgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdyYWRpby5nZXRQbGF5bGlzdCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJJHZhcnNbJ2FwaV9zaWcnXSA9ICRzaWc7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCSRwbGF5bGlzdFsndmVyc2lvbiddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0Wyd2ZXJzaW9uJ107DQoJCQkJJHBsYXlsaXN0Wyd0aXRsZSddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0LT50aXRsZTsNCgkJCQkkcGxheWxpc3RbJ2NyZWF0b3InXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdC0+Y3JlYXRvcjsNCgkJCQkkcGxheWxpc3RbJ2RhdGUnXSA9IHN0cnRvdGltZSgoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3QtPmRhdGUpOw0KCQkJCSRwbGF5bGlzdFsnZXhwaXJlJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3QtPmxpbms7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+cGxheWxpc3QtPnRyYWNrTGlzdCkgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+cGxheWxpc3QtPnRyYWNrTGlzdC0+dHJhY2sgYXMgJHRyYWNrICkgew0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2xvY2F0aW9uJ10gPSAoc3RyaW5nKSAkdHJhY2stPmxvY2F0aW9uOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkdHJhY2stPnRpdGxlOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2lkZW50aWZpZXInXSA9IChzdHJpbmcpICR0cmFjay0+aWRlbnRpZmllcjsNCgkJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0J11bJGldWydhbGJ1bSddID0gKHN0cmluZykgJHRyYWNrLT5hbGJ1bTsNCgkJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0J11bJGldWydjcmVhdG9yJ10gPSAoc3RyaW5nKSAkdHJhY2stPmNyZWF0b3I7DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsnZHVyYXRpb24nXSA9IChzdHJpbmcpICR0cmFjay0+ZHVyYXRpb247DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsnaW1hZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2U7DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsndHJhY2thdXRoJ10gPSAoc3RyaW5nKSAkdHJhY2stPmV4dGVuc2lvbi0+dHJhY2thdXRoOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2FsYnVtaWQnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT5hbGJ1bWlkOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2FydGlzdGlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPmV4dGVuc2lvbi0+YXJ0aXN0aWQ7DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsncmVjb3JkaW5nJ10gPSAoc3RyaW5nKSAkdHJhY2stPmV4dGVuc2lvbi0+cmVjb3JkaW5nOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2FydGlzdHBhZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT5hcnRpc3RwYWdlOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2FsYnVtcGFnZSddID0gKHN0cmluZykgJHRyYWNrLT5leHRlbnNpb24tPmFsYnVtcGFnZTsNCgkJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0J11bJGldWyd0cmFja3BhZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT50cmFja3BhZ2U7DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsnYnV5VHJhY2tVUkwnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT5idXlUcmFja1VSTDsNCgkJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0J11bJGldWydidXlBbGJ1bVVSTCddID0gKHN0cmluZykgJHRyYWNrLT5leHRlbnNpb24tPmJ1dEFsYnVtVVJMOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2ZyZWVUcmFja1VSTCddID0gKHN0cmluZykgJHRyYWNrLT5leHRlbnNpb24tPmZyZWVUcmFja1VSTDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQl9DQoJCQkJDQoJCQkJcmV0dXJuICRwbGF5bGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/tag.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHRhZyBhcGkgY2FsbHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgYXBpIHJlcXVlc3RzIHJlbGF0aW5nIHRvIHRhZ3MNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCmNsYXNzIGxhc3RmbUFwaVRhZyBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBTZWFyY2ggZm9yIHRhZ3Mgc2ltaWxhciB0byB0aGlzIG9uZS4gUmV0dXJucyB0YWdzIHJhbmtlZCBieSBzaW1pbGFyaXR5LCBiYXNlZCBvbiBsaXN0ZW5pbmcgZGF0YQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT50YWc8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaW1pbGFyKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZyddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RhZy5nZXRzaW1pbGFyJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT5zaW1pbGFydGFncy0+dGFnIGFzICR0YWcgKSB7DQoJCQkJCSRzaW1pbGFyWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJJHNpbWlsYXJbJGldWyd1cmwnXSA9IChzdHJpbmcpICR0YWctPnVybDsNCgkJCQkJJHNpbWlsYXJbJGldWydzdHJlYW1hYmxlJ10gPSAoc3RyaW5nKSAkdGFnLT5zdHJlYW1hYmxlOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJHNpbWlsYXI7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSB0YWcgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSB0b3AgYWxidW1zIHRhZ2dlZCBieSB0aGlzIHRhZywgb3JkZXJlZCBieSB0YWcgY291bnQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dGFnPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wQWxidW1zKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZyddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RhZy5nZXR0b3BhbGJ1bXMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPnRvcGFsYnVtcy0+YWxidW0gYXMgJGFsYnVtICkgew0KCQkJCQkkdG9wQWxidW1zWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5uYW1lOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsndGFnY291bnQnXSA9IChzdHJpbmcpICRhbGJ1bS0+dGFnY291bnQ7DQoJCQkJCSR0b3BBbGJ1bXNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+dXJsOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT5uYW1lOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnYXJ0aXN0J11bJ3VybCddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3QtPnVybDsNCgkJCQkJJHRvcEFsYnVtc1skaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzBdOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzFdOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMl07DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCXJldHVybiAkdG9wQWxidW1zOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgdGFnIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIGFydGlzdHMgdGFnZ2VkIGJ5IHRoaXMgdGFnLCBvcmRlcmVkIGJ5IHRhZyBjb3VudA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT50YWc8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BBcnRpc3RzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZyddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RhZy5nZXR0b3BhcnRpc3RzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BhcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJJHRvcEFydGlzdHNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3RhZ2NvdW50J10gPSAoc3RyaW5nKSAkYXJ0aXN0LT50YWdjb3VudDsNCgkJCQkJJHRvcEFydGlzdHNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhcnRpc3QtPnVybDsNCgkJCQkJJHRvcEFydGlzdHNbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5tYmlkOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkJCSR0b3BBcnRpc3RzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzBdOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCSR0b3BBcnRpc3RzWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzJdOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJHRvcEFydGlzdHM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSB0YWcgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyB0aGUgdG9wIGdsb2JhbCB0YWdzIG9uIExhc3QuZm0sIHNvcnRlZCBieSBwb3B1bGFyaXR5IChudW1iZXIgb2YgdGltZXMgdXNlZCkNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcFRhZ3MoJG1ldGhvZFZhcnMgPSBBcnJheSgpKSB7DQoJCSR2YXJzID0gYXJyYXkoDQoJCQknbWV0aG9kJyA9PiAndGFnLmdldHRvcHRhZ3MnLA0KCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJKTsNCgkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkNCgkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCSRpID0gMDsNCgkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdGFncy0+dGFnIGFzICR0YWcgKSB7DQoJCQkJJHRvcFRhZ3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdGFnLT5uYW1lOw0KCQkJCSR0b3BUYWdzWyRpXVsnY291bnQnXSA9IChzdHJpbmcpICR0YWctPmNvdW50Ow0KCQkJCSR0b3BUYWdzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdGFnLT51cmw7DQoJCQkJJGkrKzsNCgkJCX0NCgkJCXJldHVybiAkdG9wVGFnczsNCgkJfQ0KCQllbHNlIHsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCB0cmFja3MgdGFnZ2VkIGJ5IHRoaXMgdGFnLCBvcmRlcmVkIGJ5IHRhZyBjb3VudA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT50YWc8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BUcmFja3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndGFnJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndGFnLmdldHRvcHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCSR0b3BUcmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCSR0b3BUcmFja3NbJGldWyd0YWdjb3VudCddID0gKHN0cmluZykgJHRyYWNrLT50YWdjb3VudDsNCgkJCQkJJHRvcFRyYWNrc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT51cmw7DQoJCQkJCSR0b3BUcmFja3NbJGldWydzdHJlYW1hYmxlJ10gPSAoc3RyaW5nKSAkdHJhY2stPnN0cmVhbWFibGU7DQoJCQkJCSR0b3BUcmFja3NbJGldWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkJCSR0b3BUcmFja3NbJGldWydhcnRpc3QnXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5hcnRpc3QtPm5hbWU7DQoJCQkJCSR0b3BUcmFja3NbJGldWydhcnRpc3QnXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5hcnRpc3QtPm1iaWQ7DQoJCQkJCSR0b3BUcmFja3NbJGldWydhcnRpc3QnXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+dXJsOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMF07DQoJCQkJCSR0b3BUcmFja3NbJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMV07DQoJCQkJCSR0b3BUcmFja3NbJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVsyXTsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICR0b3BUcmFja3M7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSB0YWcgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGFuIGFydGlzdCBjaGFydCBmb3IgYSB0YWcsIGZvciBhIGdpdmVuIGRhdGUgcmFuZ2UuIElmIG5vIGRhdGUgcmFuZ2UgaXMgc3VwcGxpZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBhcnRpc3QgY2hhcnQgZm9yIHRoaXMgdGFnDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnRhZzwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+dG88L2k+LCA8aT5mcm9tPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5QXJ0aXN0Q2hhcnQoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndGFnJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndGFnLmdldHdlZWtseWFydGlzdGNoYXJ0JywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT53ZWVrbHlhcnRpc3RjaGFydC0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCSR3ZWVrbHlBcnRpc3RzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFydGlzdC0+bmFtZTsNCgkJCQkJJHdlZWtseUFydGlzdHNbJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkYXJ0aXN0WydyYW5rJ107DQoJCQkJCSR3ZWVrbHlBcnRpc3RzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJJHdlZWtseUFydGlzdHNbJGldWyd3ZWlnaHQnXSA9IChzdHJpbmcpICRhcnRpc3QtPndlaWdodDsNCgkJCQkJJHdlZWtseUFydGlzdHNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhcnRpc3QtPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJDQoJCQkJcmV0dXJuICR3ZWVrbHlBcnRpc3RzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoYXJ0cyBmb3IgdGhpcyB0YWcsIGV4cHJlc3NlZCBhcyBkYXRlIHJhbmdlcyB3aGljaCBjYW4gYmUgc2VudCB0byB0aGUgY2hhcnQgc2VydmljZXMNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dGFnPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5Q2hhcnRMaXN0KCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZyddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RhZy5nZXR3ZWVrbHljaGFydGxpc3QnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPndlZWtseWNoYXJ0bGlzdC0+Y2hhcnQgYXMgJGNoYXJ0ICkgew0KCQkJCQkkd2Vla2x5Q2hhcnRMaXN0WyRpXVsnZnJvbSddID0gKHN0cmluZykgJGNoYXJ0Wydmcm9tJ107DQoJCQkJCSR3ZWVrbHlDaGFydExpc3RbJGldWyd0byddID0gKHN0cmluZykgJGNoYXJ0Wyd0byddOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQkNCgkJCQlyZXR1cm4gJHdlZWtseUNoYXJ0TGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBTZWFyY2ggZm9yIGEgdGFnIGJ5IG5hbWUuIFJldHVybnMgbWF0Y2hlcyBzb3J0ZWQgYnkgcmVsZXZhbmNlDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnRhZzwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNlYXJjaCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd0YWcnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd0YWcuc2VhcmNoJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkb3BlbnNlYXJjaCA9ICRjYWxsLT5yZXN1bHRzLT5jaGlsZHJlbignaHR0cDovL2E5LmNvbS8tL3NwZWMvb3BlbnNlYXJjaC8xLjEvJyk7DQoJCQkJaWYgKCAkb3BlbnNlYXJjaC0+dG90YWxSZXN1bHRzID4gMCApIHsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ3RvdGFsUmVzdWx0cyddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPnRvdGFsUmVzdWx0czsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ3N0YXJ0SW5kZXgnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT5zdGFydEluZGV4Ow0KCQkJCQkkc2VhcmNoUmVzdWx0c1snaXRlbXNQZXJQYWdlJ10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+aXRlbXNQZXJQYWdlOw0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+cmVzdWx0cy0+dGFnbWF0Y2hlcy0+dGFnIGFzICR0YWcgKSB7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydjb3VudCddID0gKHN0cmluZykgJHRhZy0+Y291bnQ7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdGFnLT51cmw7DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJCXJldHVybiAkc2VhcmNoUmVzdWx0czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCS8vIE5vIHRhZ3NhcmUgZm91bmQNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnTm8gcmVzdWx0cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgdGFnIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/tasteometer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHRhc3Rlb21ldGVyIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdGhlIHRhc3Rlb21ldGVyDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlUYXN0ZW9tZXRlciBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBUYXN0ZW9tZXRlciBzY29yZSBmcm9tIHR3byBpbnB1dHMsIGFsb25nIHdpdGggYSBsaXN0IG9mIHNoYXJlZCBhcnRpc3RzLiBJZiB0aGUgaW5wdXQgaXMgYSBVc2VyIG9yIGEgTXlzcGFjZSBVUkwsIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHR3byBzdWIgYXJyYXlzIDxpPigxIGFuZCAyKSBib3RoIGNvbnRhaW5pbmcgdGhlIHJlcXVpcmVkIHZhcmlhYmxlczogPGk+dHlwZSAoJ3VzZXInIHwgJ2FydGlzdHMnIHwgJ215c3BhY2UnKTwvaT4gYW5kIDxpPnZhbHVlIChbTGFzdC5mbSB1c2VybmFtZV0gfCBbQ29tbWEtc2VwYXJhdGVkIGFydGlzdCBuYW1lc10gfCBbTXlTcGFjZSBwcm9maWxlIFVSTF0pPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gY29tcGFyZSgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWzFdWyd0eXBlJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sxXVsndmFsdWUnXSkgJiYgICFlbXB0eSgkbWV0aG9kVmFyc1syXVsndHlwZSddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbMl1bJ3ZhbHVlJ10pICkgewkNCgkJCWlmICggJG1ldGhvZFZhcnNbMV1bJ3R5cGUnXSA9PSAnYXJ0aXN0cycgJiYgaXNfYXJyYXkoJG1ldGhvZFZhcnNbMV1bJ3ZhbHVlJ10pICkgew0KCQkJCSR2YWx1ZTEgPSAnJzsNCgkJCQlmb3JlYWNoICggJG1ldGhvZFZhcnNbMV1bJ3ZhbHVlJ10gYXMgJGFydGlzdCApIHsNCgkJCQkJJHZhbHVlMSAuPSAkYXJ0aXN0LicsJzsNCgkJCQl9DQoJCQkJJHZhbHVlMSA9IHN1YnN0cigkdmFsdWUxLCAwLCAtMSk7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkdmFsdWUxID0gJG1ldGhvZFZhcnNbMV1bJ3ZhbHVlJ107DQoJCQl9DQoJCQkNCgkJCWlmICggJG1ldGhvZFZhcnNbMl1bJ3R5cGUnXSA9PSAnYXJ0aXN0cycgJiYgaXNfYXJyYXkoJG1ldGhvZFZhcnNbMl1bJ3ZhbHVlJ10pICkgew0KCQkJCSR2YWx1ZTIgPSAnJzsNCgkJCQlmb3JlYWNoICggJG1ldGhvZFZhcnNbMl1bJ3ZhbHVlJ10gYXMgJGFydGlzdCApIHsNCgkJCQkJJHZhbHVlMiAuPSAkYXJ0aXN0LicsJzsNCgkJCQl9DQoJCQkJJHZhbHVlMiA9IHN1YnN0cigkdmFsdWUyLCAwLCAtMSk7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkdmFsdWUyID0gJG1ldGhvZFZhcnNbMl1bJ3ZhbHVlJ107DQoJCQl9DQoJCQkNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3Rhc3Rlb21ldGVyLmNvbXBhcmUnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSd0eXBlMScgPT4gJG1ldGhvZFZhcnNbMV1bJ3R5cGUnXSwNCgkJCQkndmFsdWUxJyA9PiAkdmFsdWUxLA0KCQkJCSd0eXBlMicgPT4gJG1ldGhvZFZhcnNbMl1bJ3R5cGUnXSwNCgkJCQkndmFsdWUyJyA9PiAkdmFsdWUyDQoJCQkpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRyZXN1bHQgPSAnJzsNCgkJCQkNCgkJCQkkcmVzdWx0WydzY29yZSddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPnJlc3VsdC0+c2NvcmU7DQoJCQkJJHJlc3VsdFsnbWF0Y2hlcyddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPnJlc3VsdC0+YXJ0aXN0c1snbWF0Y2hlcyddOw0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPmNvbXBhcmlzb24tPnJlc3VsdC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCSRyZXN1bHRbJ2FydGlzdHMnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICRhcnRpc3QtPm5hbWU7DQoJCQkJCSRyZXN1bHRbJ2FydGlzdHMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkkcmVzdWx0WydhcnRpc3RzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMl07DQoJCQkJCSRyZXN1bHRbJ2FydGlzdHMnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCSRyZXN1bHRbJ2FydGlzdHMnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5pbWFnZVswXTsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJDQoJCQkJJGNvdW50VXNlciA9IDA7DQoJCQkJJGNvdW50TXlzcGFjZSA9IDA7DQoJCQkJc3dpdGNoICggJG1ldGhvZFZhcnNbMV1bJ3R5cGUnXSApIHsNCgkJCQkJY2FzZSAndXNlcic6DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyd0eXBlJ10gPSAndXNlcic7DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+Y29tcGFyaXNvbi0+aW5wdXQtPnVzZXJbJGNvdW50VXNlcl0tPm5hbWU7DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+dXNlclskY291bnRVc2VyXS0+dXJsOw0KCQkJCQkJJHJlc3VsdFsnaW5wdXRPbmUnXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+dXNlclskY291bnRVc2VyXS0+aW1hZ2VbMl07DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+dXNlclskY291bnRVc2VyXS0+aW1hZ2VbMV07DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT51c2VyWyRjb3VudFVzZXJdLT5pbWFnZVswXTsNCgkJCQkJCSRjb3VudFVzZXIrKzsNCgkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgJ2FydGlzdHMnOg0KCQkJCQkJJHJlc3VsdFsnaW5wdXRPbmUnXVsndHlwZSddID0gJ2FydGlzdHMnOw0KCQkJCQlicmVhazsNCgkJCQkJY2FzZSAnbXlzcGFjZSc6DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyd0eXBlJ10gPSAnbXlzcGFjZSc7DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+bXlzcGFjZVskY291bnRNeXNwYWNlXS0+dXJsOw0KCQkJCQkJJHJlc3VsdFsnaW5wdXRPbmUnXVsnaW1hZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+bXlzcGFjZVskY291bnRNeXNwYWNlXS0+aW1hZ2U7DQoJCQkJCQkkY291bnRNeXNwYWNlKys7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQkNCgkJCQlzd2l0Y2ggKCAkbWV0aG9kVmFyc1syXVsndHlwZSddICkgew0KCQkJCQljYXNlICd1c2VyJzoNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ3R5cGUnXSA9ICd1c2VyJzsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ25hbWUnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+dXNlclskY291bnRVc2VyXS0+bmFtZTsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT51c2VyWyRjb3VudFVzZXJdLT51cmw7DQoJCQkJCQkkcmVzdWx0WydpbnB1dFR3byddWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT51c2VyWyRjb3VudFVzZXJdLT5pbWFnZVsyXTsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT51c2VyWyRjb3VudFVzZXJdLT5pbWFnZVsxXTsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+Y29tcGFyaXNvbi0+aW5wdXQtPnVzZXJbJGNvdW50VXNlcl0tPmltYWdlWzBdOw0KCQkJCQkJJGNvdW50VXNlcisrOw0KCQkJCQlicmVhazsNCgkJCQkJY2FzZSAnYXJ0aXN0cyc6DQoJCQkJCQkkcmVzdWx0WydpbnB1dFR3byddWyd0eXBlJ10gPSAnYXJ0aXN0cyc7DQoJCQkJCWJyZWFrOw0KCQkJCQljYXNlICdteXNwYWNlJzoNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ3R5cGUnXSA9ICdteXNwYWNlJzsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT5teXNwYWNlWyRjb3VudE15c3BhY2VdLT51cmw7DQoJCQkJCQkkcmVzdWx0WydpbnB1dFR3byddWydpbWFnZSddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT5teXNwYWNlWyRjb3VudE15c3BhY2VdLT5pbWFnZTsNCgkJCQkJCSRjb3VudE15c3BhY2UrKzsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkcmVzdWx0Ow0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgMiBzZXRzIG9mIHR5cGUgYW5kIHZhbHVlIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCn0NCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/track.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHRyYWNrIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdHJhY2tzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlUcmFjayBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBUYWcgYW4gYWxidW0gdXNpbmcgYSBsaXN0IG9mIHVzZXIgc3VwcGxpZWQgdGFncyAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+LCA8aT50cmFjazwvaT4sIDxpPnRhZ3M8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZFRhZ3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndGFncyddKSApIHsNCgkJCQkvLyBJZiB0aGUgdGFncyB2YXJpYWJsZXMgaXMgYW4gYXJyYXkgYnVpbGQgYSBDUyBsaXN0DQoJCQkJaWYgKCBpc19hcnJheSgkbWV0aG9kVmFyc1sndGFncyddKSApIHsNCgkJCQkJJHRhZ3MgPSAnJzsNCgkJCQkJZm9yZWFjaCAoICRtZXRob2RWYXJzWyd0YWdzJ10gYXMgJHRhZyApIHsNCgkJCQkJCSR0YWdzIC49ICR0YWcuJywnOw0KCQkJCQl9DQoJCQkJCSR0YWdzID0gc3Vic3RyKCR0YWdzLCAwLCAtMSk7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGFncyA9ICRtZXRob2RWYXJzWyd0YWdzJ107DQoJCQkJfQ0KCQkJCSRtZXRob2RWYXJzWyd0YWdzJ10gPSAkdGFnczsNCgkJCQkNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAndHJhY2suYWRkdGFncycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0LCB0cmFjayBhbmQgdGFncyB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBCYW4gYSB0cmFjayBmb3IgYSBnaXZlbiB1c2VyIHByb2ZpbGUuIFRoaXMgbmVlZHMgdG8gYmUgc3VwcGxlbWVudGVkIHdpdGggYSBzY3JvYmJsaW5nIHN1Ym1pc3Npb24gY29udGFpbmluZyB0aGUgJ2JhbicgcmF0aW5nIChzZWUgdGhlIGF1ZGlvc2Nyb2JibGVyIEFQSSkgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+dHJhY2s8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGJhbigkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndHJhY2snXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ3RyYWNrLmJhbicsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIG1ldGFkYXRhIGZvciBhIHRyYWNrIG9uIExhc3QuZm0gdXNpbmcgdGhlIGFydGlzdC90cmFjayBuYW1lIG9yIGEgbXVzaWNicmFpbnogaWQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0IG9yIG1iaWQ8L2k+LCA8aT50cmFjazwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEluZm8oJG1ldGhvZFZhcnMpIHsNCgkJJHZhcnMgPSBhcnJheSgNCgkJCSdtZXRob2QnID0+ICd0cmFjay5nZXRpbmZvJywNCgkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCSk7DQoJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJDQoJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkkaW5mb1snaWQnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+aWQ7DQoJCQkkaW5mb1snbmFtZSddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5uYW1lOw0KCQkJJGluZm9bJ21iaWQnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+bWJpZDsNCgkJCSRpbmZvWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+dXJsOw0KCQkJJGluZm9bJ2R1cmF0aW9uJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPmR1cmF0aW9uOw0KCQkJJGluZm9bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+c3RyZWFtYWJsZTsNCgkJCSRpbmZvWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkkaW5mb1snbGlzdGVuZXJzJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPmxpc3RlbmVyczsNCgkJCSRpbmZvWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+cGxheWNvdW50Ow0KCQkJJGluZm9bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCSRpbmZvWydhcnRpc3QnXVsnbWJpZCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hcnRpc3QtPm1iaWQ7DQoJCQkkaW5mb1snYXJ0aXN0J11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hcnRpc3QtPnVybDsNCgkJCSRpbmZvWydhbGJ1bSddWydwb3NpdGlvbiddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bVsncG9zaXRpb24nXTsNCgkJCSRpbmZvWydhbGJ1bSddWydhcnRpc3QnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+YWxidW0tPmFydGlzdDsNCgkJCSRpbmZvWydhbGJ1bSddWyd0aXRsZSddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bS0+dGl0bGU7DQoJCQkkaW5mb1snYWxidW0nXVsnbWJpZCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bS0+bWJpZDsNCgkJCSRpbmZvWydhbGJ1bSddWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+YWxidW0tPnVybDsNCgkJCSRpbmZvWydhbGJ1bSddWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bS0+aW1hZ2VbMF07DQoJCQkkaW5mb1snYWxidW0nXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPmFsYnVtLT5pbWFnZVsxXTsNCgkJCSRpbmZvWydhbGJ1bSddWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bS0+aW1hZ2VbMl07DQoJCQkkaSA9IDA7DQoJCQlmb3JlYWNoICggJGNhbGwtPnRyYWNrLT50b3B0YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkkaW5mb1sndG9wdGFncyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkkaW5mb1sndG9wdGFncyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdGFnLT51cmw7DQoJCQkJJGkrKzsNCgkJCX0NCgkJCSRpbmZvWyd3aWtpJ11bJ3B1Ymxpc2hlZCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT53aWtpLT5wdWJsaXNoZWQ7DQoJCQkkaW5mb1snd2lraSddWydzdW1tYXJ5J10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPndpa2ktPnN1bW1hcnk7DQoJCQkkaW5mb1snd2lraSddWydjb250ZW50J10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPndpa2ktPmNvbnRlbnQ7DQoJCQkNCgkJCXJldHVybiAkaW5mbzsNCgkJfQ0KCQllbHNlIHsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHNpbWlsYXIgdHJhY2tzIGZvciB0aGlzIHRyYWNrIG9uIExhc3QuZm0sIGJhc2VkIG9uIGxpc3RlbmluZyBkYXRhDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2ltaWxhcigkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0cmFjayddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RyYWNrLmdldHNpbWlsYXInLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggY291bnQoJGNhbGwtPnNpbWlsYXJ0cmFja3MtPnRyYWNrKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5zaW1pbGFydHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCQkkc2ltaWxhclskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+bmFtZTsNCgkJCQkJCSRzaW1pbGFyWyRpXVsnbWF0Y2gnXSA9IChzdHJpbmcpICR0cmFjay0+bWF0Y2g7DQoJCQkJCQkkc2ltaWxhclskaV1bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+bWJpZDsNCgkJCQkJCSRzaW1pbGFyWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPnVybDsNCgkJCQkJCSRzaW1pbGFyWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlOw0KCQkJCQkJJHNpbWlsYXJbJGldWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkJCQkkc2ltaWxhclskaV1bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCQkJCSRzaW1pbGFyWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkJJHNpbWlsYXJbJGldWydhcnRpc3QnXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+dXJsOw0KCQkJCQkJJHNpbWlsYXJbJGldWydpbWFnZXMnXVsnc21hbGwnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMF07DQoJCQkJCQkkc2ltaWxhclskaV1bJ2ltYWdlcyddWydtZWRpdW0nXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMV07DQoJCQkJCQkkc2ltaWxhclskaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVsyXTsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJcmV0dXJuICRzaW1pbGFyOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB0cmFjayBoYXMgbm8gc2ltaWxhciB0cmFja3MnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCBhbmQgdHJhY2sgdmFyaWFsYmVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdGFncyBhcHBsaWVkIGJ5IGFuIGluZGl2aWR1YWwgdXNlciB0byBhIHRyYWNrIG9uIExhc3QuZm0gKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+dHJhY2s8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0cmFjayddKSApIHsNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAndHJhY2suZ2V0dGFncycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJCWlmICggY291bnQoJGNhbGwtPnRhZ3MtPnRhZykgPiAwICkgew0KCQkJCQkJJHRhZ3NbJ2FydGlzdCddID0gKHN0cmluZykgJGNhbGwtPnRhZ3NbJ2FydGlzdCddOw0KCQkJCQkJJHRhZ3NbJ3RyYWNrJ10gPSAoc3RyaW5nKSAkY2FsbC0+dGFnc1sndHJhY2snXTsNCgkJCQkJCSRpID0gMDsNCgkJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dGFncy0+dGFnIGFzICR0YWcgKSB7DQoJCQkJCQkJJHRhZ3NbJ3RhZ3MnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0YWctPm5hbWU7DQoJCQkJCQkJJHRhZ3NbJ3RhZ3MnXVskaV1bJ3VybCddID0gKHN0cmluZykgJHRhZy0+dXJsOw0KCQkJCQkJCSRpKys7DQoJCQkJCQl9DQoJCQkJCQlyZXR1cm4gJHRhZ3M7DQoJCQkJCX0NCgkJCQkJZWxzZSB7DQoJCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGUgdXNlciBoYXMgbm8gdGFncyBvbiB0aGlzIHRyYWNrJyk7DQoJCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCBmYW5zIGZvciB0aGlzIHRyYWNrIG9uIExhc3QuZm0sIGJhc2VkIG9uIGxpc3RlbmluZyBkYXRhDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wRmFucygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0cmFjayddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RyYWNrLmdldHRvcGZhbnMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggY291bnQoJGNhbGwtPnRvcGZhbnMtPnVzZXIpID4gMCApIHsNCgkJCQkJJHRvcEZhbnNbJ2FydGlzdCddID0gKHN0cmluZykgJGNhbGwtPnRvcGZhbnNbJ2FydGlzdCddOw0KCQkJCQkkdG9wRmFuc1sndHJhY2snXSA9IChzdHJpbmcpICRjYWxsLT50b3BmYW5zWyd0cmFjayddOw0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wZmFucy0+dXNlciBhcyAkdXNlciApIHsNCgkJCQkJCSR0b3BGYW5zWyd1c2VycyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHVzZXItPm5hbWU7DQoJCQkJCQkkdG9wRmFuc1sndXNlcnMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJHVzZXItPnVybDsNCgkJCQkJCSR0b3BGYW5zWyd1c2VycyddWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICR1c2VyLT5pbWFnZVswXTsNCgkJCQkJCSR0b3BGYW5zWyd1c2VycyddWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMV07DQoJCQkJCQkkdG9wRmFuc1sndXNlcnMnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMl07DQoJCQkJCQkkdG9wRmFuc1sndXNlcnMnXVskaV1bJ3dlaWdodCddID0gKHN0cmluZykgJHVzZXItPndlaWdodDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJcmV0dXJuICR0b3BGYW5zOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB0cmFjayBoYXMgbm8gZmFucycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCg0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCB0YWdzIGZvciB0aGlzIHRyYWNrIG9uIExhc3QuZm0sIG9yZGVyZWQgYnkgdGFnIGNvdW50DQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wVGFncygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0cmFjayddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RyYWNrLmdldHRvcHRhZ3MnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggY291bnQoJGNhbGwtPnRvcHRhZ3MtPnRhZykgPiAwICkgew0KCQkJCQkkdG9wVGFnc1snYXJ0aXN0J10gPSAoc3RyaW5nKSAkY2FsbC0+dG9wdGFnc1snYXJ0aXN0J107DQoJCQkJCSR0b3BUYWdzWyd0cmFjayddID0gKHN0cmluZykgJGNhbGwtPnRvcHRhZ3NbJ3RyYWNrJ107DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3B0YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkJCSR0b3BUYWdzWyd0YWdzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdGFnLT5uYW1lOw0KCQkJCQkJJHRvcFRhZ3NbJ3RhZ3MnXVskaV1bJ2NvdW50J10gPSAoc3RyaW5nKSAkdGFnLT5jb3VudDsNCgkJCQkJCSR0b3BUYWdzWyd0YWdzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR0YWctPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJcmV0dXJuICR0b3BUYWdzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB0cmFjayBoYXMgbm8gdGFncycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogTG92ZSBhIHRyYWNrIGZvciBhIHVzZXIgcHJvZmlsZS4gVGhpcyBuZWVkcyB0byBiZSBzdXBwbGVtZW50ZWQgd2l0aCBhIHNjcm9iYmxpbmcgc3VibWlzc2lvbiBjb250YWluaW5nIHRoZSAnbG92ZScgcmF0aW5nIChzZWUgdGhlIGF1ZGlvc2Nyb2JibGVyIEFQSSkgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+dHJhY2s8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGxvdmUoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICd0cmFjay5sb3ZlJywNCgkJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCQkpOw0KCQkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQkkc2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkJJHZhcnNbJ2FwaV9zaWcnXSA9ICRzaWc7DQoJCQkJDQoJCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlQb3N0Q2FsbCgkdmFycykgKSB7DQoJCQkJCXJldHVybiBUUlVFOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgYW5kIHRyYWNrIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFJlbW92ZSBhIHVzZXIncyB0YWcgZnJvbSBhIHRyYWNrIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPiwgPGk+dGFnPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVUYWcoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndGFnJ10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICd0cmFjay5yZW1vdmV0YWcnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIHRhZywgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBTZWFyY2ggZm9yIGEgdHJhY2sgYnkgdHJhY2sgbmFtZS4gUmV0dXJucyB0cmFjayBtYXRjaGVzIHNvcnRlZCBieSByZWxldmFuY2UNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dHJhY2s8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzZWFyY2goJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndHJhY2snXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd0cmFjay5zZWFyY2gnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRvcGVuc2VhcmNoID0gJGNhbGwtPnJlc3VsdHMtPmNoaWxkcmVuKCdodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8nKTsNCgkJCQlpZiAoICRvcGVuc2VhcmNoLT50b3RhbFJlc3VsdHMgPiAwICkgew0KCQkJCQkkc2VhcmNoUmVzdWx0c1sndG90YWxSZXN1bHRzJ10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+dG90YWxSZXN1bHRzOw0KCQkJCQkkc2VhcmNoUmVzdWx0c1snc3RhcnRJbmRleCddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPnN0YXJ0SW5kZXg7DQoJCQkJCSRzZWFyY2hSZXN1bHRzWydpdGVtc1BlclBhZ2UnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT5pdGVtc1BlclBhZ2U7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5yZXN1bHRzLT50cmFja21hdGNoZXMtPnRyYWNrIGFzICR0cmFjayApIHsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnYXJ0aXN0J10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdDsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+dXJsOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbGlzdGVuZXJzJ10gPSAoc3RyaW5nKSAkdHJhY2stPmxpc3RlbmVyczsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVswXTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMV07DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMl07DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJCXJldHVybiAkc2VhcmNoUmVzdWx0czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCS8vIE5vIHRhZ3NhcmUgZm91bmQNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnTm8gcmVzdWx0cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgdHJhY2sgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogU2hhcmUgYSB0cmFjayB0d2l0aCBvbmUgb3IgbW9yZSBMYXN0LmZtIHVzZXJzIG9yIG90aGVyIGZyaWVuZHMgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+dHJhY2s8L2k+LCA8aT5yZWNpcGllbnQ8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZTogPGk+bWVzc2FnZTwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2hhcmUoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sncmVjaXBpZW50J10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICd0cmFjay5zaGFyZScsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgcmVjaXBpZW50LCBhcnRpc3QgYW5kIHRyYWNrIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/user.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHVzZXIgYXBpIGNhbGxzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQovKioNCiAqIEFsbG93cyBhY2Nlc3MgdG8gdGhlIGFwaSByZXF1ZXN0cyByZWxhdGluZyB0byB1c2Vycw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KY2xhc3MgbGFzdGZtQXBpVXNlciBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIHVwY29taW5nIGV2ZW50cyB0aGF0IHRoaXMgdXNlciBpcyBhdHRlbmRpbmcNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEV2ZW50cygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXRldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggJGNhbGwtPmV2ZW50c1sndG90YWwnXSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5ldmVudHMtPmV2ZW50IGFzICRldmVudCApIHsNCgkJCQkJCSRldmVudHNbJGldWydpZCddID0gKHN0cmluZykgJGV2ZW50LT5pZDsNCgkJCQkJCSRldmVudHNbJGldWyd0aXRsZSddID0gKHN0cmluZykgJGV2ZW50LT50aXRsZTsNCgkJCQkJCSRpaSA9IDA7DQoJCQkJCQlmb3JlYWNoICggJGV2ZW50LT5hcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJCQkkZXZlbnRzWyRpXVsnYXJ0aXN0cyddWyRpaV0gPSAoc3RyaW5nKSAkYXJ0aXN0Ow0KCQkJCQkJCSRpaSsrOw0KCQkJCQkJfQ0KCQkJCQkJJGV2ZW50c1skaV1bJ2hlYWRsaW5lciddID0gKHN0cmluZykgJGV2ZW50LT5hcnRpc3RzLT5oZWFkbGluZXI7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbmFtZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bmFtZTsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydjaXR5J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2l0eTsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydjb3VudHJ5J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y291bnRyeTsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydzdHJlZXQnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5zdHJlZXQ7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsncG9zdGFsY29kZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnBvc3RhbGNvZGU7DQoJCQkJCQkkZ2VvUG9pbnRzID0gJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNoaWxkcmVuKCdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby93Z3M4NF9wb3MjJyk7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbGF0J10gPSAoc3RyaW5nKSAkZ2VvUG9pbnRzLT5wb2ludC0+bGF0Ow0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xvbmcnXSA9IChzdHJpbmcpICRnZW9Qb2ludHMtPnBvaW50LT5sb25nOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ3RpbWV6b25lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+dGltZXpvbmU7DQoJCQkJCQkkZXZlbnRzWyRpXVsnc3RhcnREYXRlJ10gPSBzdHJ0b3RpbWUodHJpbSgoc3RyaW5nKSAkZXZlbnQtPnN0YXJ0RGF0ZSkpOw0KCQkJCQkJJGV2ZW50c1skaV1bJ2Rlc2NyaXB0aW9uJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmRlc2NyaXB0aW9uOw0KCQkJCQkJJGV2ZW50c1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVswXTsNCgkJCQkJCSRldmVudHNbJGldWydpbWFnZXMnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzFdOw0KCQkJCQkJJGV2ZW50c1skaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsyXTsNCgkJCQkJCSRldmVudHNbJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkZXZlbnRzWyRpXVsncmV2aWV3cyddID0gKHN0cmluZykgJGV2ZW50LT5yZXZpZXdzOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3RhZyddID0gKHN0cmluZykgJGV2ZW50LT50YWc7DQoJCQkJCQkkZXZlbnRzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJcmV0dXJuICRldmVudHM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGlzIHVzZXIgaGFzIG5vIGV2ZW50cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIGxpc3Qgb2YgdGhlIHVzZXIncyBmcmllbmRzIG9uIExhc3QuZm0NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEZyaWVuZHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0ZnJpZW5kcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+ZnJpZW5kcy0+dXNlcikgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+ZnJpZW5kcy0+dXNlciBhcyAkdXNlciApIHsNCgkJCQkJCSRmcmllbmRzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHVzZXItPm5hbWU7DQoJCQkJCQkkZnJpZW5kc1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzBdOw0KCQkJCQkJJGZyaWVuZHNbJGldWydpbWFnZXMnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMV07DQoJCQkJCQkkZnJpZW5kc1skaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzJdOw0KCQkJCQkJJGZyaWVuZHNbJGldWyd1cmwnXSA9IChzdHJpbmcpICR1c2VyLT51cmw7DQoJCQkJCQlpZiAoICFlbXB0eSgkcmVjZW50VHJhY2tzKSApIHsNCgkJCQkJCQkkZnJpZW5kc1skaV1bJ3JlY2VudHRyYWNrJ11bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVjZW50dHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCQkJCQkkZnJpZW5kc1skaV1bJ3JlY2VudHRyYWNrJ11bJ2FydGlzdCddWydtYmlkJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVjZW50dHJhY2stPmFydGlzdC0+bWJpZDsNCgkJCQkJCQkkZnJpZW5kc1skaV1bJ3JlY2VudHRyYWNrJ11bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICR1c2VyLT5yZWNlbnR0cmFjay0+YXJ0aXN0LT51cmw7DQoJCQkJCQkJJGZyaWVuZHNbJGldWydyZWNlbnR0cmFjayddWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVjZW50dHJhY2stPm5hbWU7DQoJCQkJCQkJJGZyaWVuZHNbJGldWydyZWNlbnR0cmFjayddWydtYmlkJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVjZW50dHJhY2stPm1iaWQ7DQoJCQkJCQkJJGZyaWVuZHNbJGldWydyZWNlbnR0cmFjayddWyd1cmwnXSA9IChzdHJpbmcpICR1c2VyLT5yZWNlbnR0cmFjay0+dXJsOw0KCQkJCQkJfQ0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRmcmllbmRzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyBmcmllbmRzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdXNlciBwcm9maWxlIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbmZvKCRtZXRob2RWYXJzID0gQXJyYXkoKSkgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldGluZm8nLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkkYXBpU2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkkdmFyc1snYXBpX3NpZyddID0gJGFwaVNpZzsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaW5mb1snbmFtZSddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPm5hbWU7DQoJCQkJJGluZm9bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPnVybDsNCgkJCQkkaW5mb1snaW1hZ2UnXSA9IChzdHJpbmcpICRjYWxsLT51c2VyLT5pbWFnZTsNCgkJCQkkaW5mb1snbGFuZyddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPmxhbmc7DQoJCQkJJGluZm9bJ2NvdW50cnknXSA9IChzdHJpbmcpICRjYWxsLT51c2VyLT5jb3VudHJ5Ow0KCQkJCSRpbmZvWydhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT51c2VyLT5hZ2U7DQoJCQkJJGluZm9bJ2dlbmRlciddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPmdlbmRlcjsNCgkJCQkkaW5mb1snc3Vic2NyaWJlciddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPnN1YnNjcmliZXI7DQoJCQkJJGluZm9bJ3BsYXljb3VudCddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPnBsYXljb3VudDsNCgkJCQkkaW5mb1sncGxheWxpc3RzJ10gPSAoc3RyaW5nKSAkY2FsbC0+dXNlci0+cGxheWxpc3RzOw0KCQkJCQ0KCQkJCXJldHVybiAkaW5mbzsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSBsYXN0IDUwIHRyYWNrcyBsb3ZlZCBieSBhIHVzZXINCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldExvdmVkVHJhY2tzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldGxvdmVkdHJhY2tzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5sb3ZlZHRyYWNrcy0+dHJhY2spID4gMCApIHsNCgkJCQkJJGkgPSAwOw0KCQkJCQlmb3JlYWNoICggJGNhbGwtPmxvdmVkdHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPm1iaWQ7DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+dXJsOw0KCQkJCQkJJGxvdmVkVHJhY2tzWyRpXVsnZGF0ZSddID0gKHN0cmluZykgJHRyYWNrLT5kYXRlWyd1dHMnXTsNCgkJCQkJCSRsb3ZlZFRyYWNrc1skaV1bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCQkJCSRsb3ZlZFRyYWNrc1skaV1bJ2FydGlzdCddWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+bWJpZDsNCgkJCQkJCSRsb3ZlZFRyYWNrc1skaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT51cmw7DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWydpbWFnZXMnXVsnc21hbGwnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMF07DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWydpbWFnZXMnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzFdOw0KCQkJCQkJJGxvdmVkVHJhY2tzWyRpXVsnaW1hZ2VzJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRsb3ZlZFRyYWNrczsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1RoaXMgdXNlciBoYXMgbm8gbG92ZWQgdHJhY2tzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgbGlzdCBvZiBhIHVzZXIncyBuZWlnaGJvdXJzIG9uIExhc3QuZm0NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldE5laWdoYm91cnMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0bmVpZ2hib3VycycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snbGltaXQnXSkgKSB7DQoJCQkJJHZhcnNbJ2xpbWl0J10gPSAkbWV0aG9kVmFyc1snbGltaXQnXTsNCgkJCX0NCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5uZWlnaGJvdXJzLT51c2VyKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5uZWlnaGJvdXJzLT51c2VyIGFzICR1c2VyICkgew0KCQkJCQkJJG5laWdoYm91cnNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+bmFtZTsNCgkJCQkJCSRuZWlnaGJvdXJzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdXNlci0+dXJsOw0KCQkJCQkJJG5laWdoYm91cnNbJGldWydpbWFnZSddID0gKHN0cmluZykgJHVzZXItPmltYWdlOw0KCQkJCQkJJG5laWdoYm91cnNbJGldWydtYXRjaCddID0gKHN0cmluZykgJHVzZXItPm1hdGNoOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRuZWlnaGJvdXJzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyBuZWlnaGJvdXJzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgcGFnaW5hdGVkIGxpc3Qgb2YgYWxsIGV2ZW50cyBhIHVzZXIgaGFzIGF0dGVuZGVkIGluIHRoZSBwYXN0DQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRQYXN0RXZlbnRzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHBhc3RldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggJGNhbGwtPmV2ZW50c1sndG90YWwnXSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5ldmVudHMtPmV2ZW50IGFzICRldmVudCApIHsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnaWQnXSA9IChzdHJpbmcpICRldmVudC0+aWQ7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRpdGxlOw0KCQkJCQkJJGlpID0gMDsNCgkJCQkJCWZvcmVhY2ggKCAkZXZlbnQtPmFydGlzdHMtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnYXJ0aXN0cyddWyRpaV0gPSAoc3RyaW5nKSAkYXJ0aXN0Ow0KCQkJCQkJCSRpaSsrOw0KCQkJCQkJfQ0KCQkJCQkJJHBhc3RFdmVudHNbJGldWydoZWFkbGluZXInXSA9IChzdHJpbmcpICRldmVudC0+YXJ0aXN0cy0+aGVhZGxpbmVyOw0KCQkJCQkJJHBhc3RFdmVudHNbJGldWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCQkJJHBhc3RFdmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydjaXR5J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2l0eTsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY291bnRyeSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsncG9zdGFsY29kZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnBvc3RhbGNvZGU7DQoJCQkJCQkkZ2VvUG9pbnRzID0gJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNoaWxkcmVuKCdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby93Z3M4NF9wb3MjJyk7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xhdCddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxhdDsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbG9uZyddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxvbmc7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3N0YXJ0RGF0ZSddID0gc3RydG90aW1lKHRyaW0oKHN0cmluZykgJGV2ZW50LT5zdGFydERhdGUpKTsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnZGVzY3JpcHRpb24nXSA9IChzdHJpbmcpICRldmVudC0+ZGVzY3JpcHRpb247DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVswXTsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnaW1hZ2VzJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsxXTsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnaW1hZ2VzJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzJdOw0KCQkJCQkJJHBhc3RFdmVudHNbJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3Jldmlld3MnXSA9IChzdHJpbmcpICRldmVudC0+cmV2aWV3czsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndGFnJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRhZzsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkcGFzdEV2ZW50czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1RoaXMgdXNlciBoYXMgbm8gcGFzdCBldmVudHMnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIGEgdXNlcidzIHBsYXlsaXN0cyBvbiBMYXN0LmZtDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRQbGF5bGlzdHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0cGxheWxpc3RzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5wbGF5bGlzdHMtPnBsYXlsaXN0KSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5wbGF5bGlzdHMtPnBsYXlsaXN0IGFzICRwbGF5bGlzdCApIHsNCgkJCQkJCSRwbGF5bGlzdHNbJGldWydpZCddID0gKHN0cmluZykgJHBsYXlsaXN0LT5pZDsNCgkJCQkJCSRwbGF5bGlzdHNbJGldWyd0aXRsZSddID0gKHN0cmluZykgJHBsYXlsaXN0LT50aXRsZTsNCgkJCQkJCSRwbGF5bGlzdHNbJGldWydkYXRlJ10gPSBzdHJ0b3RpbWUodHJpbSgoc3RyaW5nKSAkcGxheWxpc3QtPmRhdGUpKTsNCgkJCQkJCSRwbGF5bGlzdHNbJGldWydzaXplJ10gPSAoc3RyaW5nKSAkcGxheWxpc3QtPnNpemU7DQoJCQkJCQkkcGxheWxpc3RzWyRpXVsnc3RyZWFtYWxiZSddID0gKHN0cmluZykgJHBsYXlsaXN0LT5zdHJlYW1hYmxlOw0KCQkJCQkJJHBsYXlsaXN0c1skaV1bJ2NyZWF0b3InXSA9IChzdHJpbmcpICRwbGF5bGlzdC0+Y3JlYXRvcjsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkcGxheWxpc3RzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyBwYXN0IGV2ZW50cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIGxpc3Qgb2YgdGhlIHJlY2VudCB0cmFja3MgbGlzdGVuZWQgdG8gYnkgdGhpcyB1c2VyLiBJbmRpY2F0ZXMgbm93IHBsYXlpbmcgdHJhY2sgaWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IGxpc3RlbmluZw0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0UmVjZW50VHJhY2tzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHJlY2VudHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+cmVjZW50dHJhY2tzLT50cmFjaykgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+cmVjZW50dHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5uYW1lOw0KCQkJCQkJaWYgKCBpc3NldCgkdHJhY2tbJ25vd3BsYXlpbmcnXSkgKSB7DQoJCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ25vd3BsYXlpbmcnXSA9IFRSVUU7DQoJCQkJCQl9DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5tYmlkOw0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT51cmw7DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnZGF0ZSddID0gKHN0cmluZykgJHRyYWNrLT5kYXRlWyd1dHMnXTsNCgkJCQkJCSRyZWNlbnRUcmFja3NbJGldWydzdHJlYW1hYmxlJ10gPSAoc3RyaW5nKSAkdHJhY2stPnN0cmVhbWFibGU7DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0Ow0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ2FydGlzdCddWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdFsnbWJpZCddOw0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ2FsYnVtJ11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+YWxidW07DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnYWxidW0nXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5hbGJ1bVsnbWJpZCddOw0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVswXTsNCgkJCQkJCSRyZWNlbnRUcmFja3NbJGldWydpbWFnZXMnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzFdOw0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVsyXTsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkcmVjZW50VHJhY2tzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyByZWNlbnQgdHJhY2tzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IExhc3QuZm0gYXJ0aXN0IHJlY29tbWVuZGF0aW9ucyBmb3IgYSB1c2VyIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25hbCB2YWx1ZXM6IDxpPmxpbWl0PC9pPiwgPGk+cGFnZTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFJlY29tbWVuZGVkQXJ0aXN0cygkbWV0aG9kVmFycyA9IEFycmF5KCkpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXRyZWNvbW1lbmRlZGFydGlzdHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkkYXBpU2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkkdmFyc1snYXBpX3NpZyddID0gJGFwaVNpZzsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5yZWNvbW1lbmRhdGlvbnMtPmFydGlzdCkgPiAwICkgew0KCQkJCQkkcmVjY29tZW5kZWRBcnRpc3RzWyd1c2VyJ10gPSAoc3RyaW5nKSAkY2FsbC0+cmVjb21tZW5kYXRpb25zWyd1c2VyJ107DQoJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ3BhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5yZWNvbW1lbmRhdGlvbnNbJ3BhZ2UnXTsNCgkJCQkJJHJlY2NvbWVuZGVkQXJ0aXN0c1sncGVyUGFnZSddID0gKHN0cmluZykgJGNhbGwtPnJlY29tbWVuZGF0aW9uc1sncGVyUGFnZSddOw0KCQkJCQkkcmVjY29tZW5kZWRBcnRpc3RzWyd0b3RhbFBhZ2VzJ10gPSAoc3RyaW5nKSAkY2FsbC0+cmVjb21tZW5kYXRpb25zWyd0b3RhbFBhZ2VzJ107DQoJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSAkY2FsbC0+cmVjb21tZW5kYXRpb25zWyd0b3RhbCddOw0KCQkJCQkNCgkJCQkJJGkgPSAwOw0KCQkJCQlmb3JlYWNoICggJGNhbGwtPnJlY29tbWVuZGF0aW9ucy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkkcmVjY29tZW5kZWRBcnRpc3RzWydhcnRpc3RzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCQkJJHJlY2NvbWVuZGVkQXJ0aXN0c1snYXJ0aXN0cyddWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ2FydGlzdHMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkJJHJlY2NvbWVuZGVkQXJ0aXN0c1snYXJ0aXN0cyddWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJGFydGlzdC0+c3RyZWFtYWJsZTsNCgkJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ2FydGlzdHMnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5pbWFnZVswXTsNCgkJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ2FydGlzdHMnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCQkkcmVjY29tZW5kZWRBcnRpc3RzWydhcnRpc3RzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMl07DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJDQoJCQkJCXJldHVybiAkcmVjY29tZW5kZWRBcnRpc3RzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyByZWNvbW1lbmRhdGlvbnMnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgcGFnaW5hdGVkIGxpc3Qgb2YgYWxsIGV2ZW50cyByZWNvbW1lbmRlZCB0byBhIHVzZXIgYnkgTGFzdC5mbSwgYmFzZWQgb24gdGhlaXIgbGlzdGVuaW5nIHByb2ZpbGUgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHZhbHVlczogPGk+cGFnZTwvaT4sIDxpPmxpbWl0PC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRFdmVudHMoJG1ldGhvZFZhcnMgPSBBcnJheSgpKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0cmVjb21tZW5kZWRldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkkYXBpU2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkkdmFyc1snYXBpX3NpZyddID0gJGFwaVNpZzsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5ldmVudHMtPmV2ZW50KSA+IDAgKSB7DQoJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1sndXNlciddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndXNlciddOw0KCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ3BhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudHNbJ3BhZ2UnXTsNCgkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydwZXJQYWdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWydwZXJQYWdlJ107DQoJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1sndG90YWxQYWdlcyddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndG90YWxQYWdlcyddOw0KCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWyd0b3RhbCddOw0KCQkJCQkNCgkJCQkJJGkgPSAwOw0KCQkJCQlmb3JlYWNoICggJGNhbGwtPmV2ZW50cy0+ZXZlbnQgYXMgJGV2ZW50ICkgew0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ2lkJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmlkOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRpdGxlOw0KCQkJCQkJJGlpID0gMDsNCgkJCQkJCWZvcmVhY2ggKCAkZXZlbnQtPmFydGlzdHMtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWydhcnRpc3RzJ11bJGlpXSA9IChzdHJpbmcpICRhcnRpc3Q7DQoJCQkJCQkJJGlpKys7DQoJCQkJCQl9DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsnaGVhZGxpbmVyJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmFydGlzdHMtPmhlYWRsaW5lcjsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NpdHknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jaXR5Ow0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NvdW50cnknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jb3VudHJ5Ow0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydwb3N0Y29kZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnBvc3RhbGNvZGU7DQoJCQkJCQkkZ2VvcG9pbnQgPSAgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNoaWxkcmVuKCdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby93Z3M4NF9wb3MjJyk7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbGF0J10gPSAoc3RyaW5nKSAkZ2VvcG9pbnQtPnBvaW50LT5sYXQ7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbG9uZyddID0gKHN0cmluZykgJGdlb3BvaW50LT5wb2ludC0+bG9uZzsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWyd0aW1lem9uZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnRpbWV6b25lOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnZlbnVlLT51cmw7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsnc3RhcnRkYXRlJ10gPSBzdHJ0b3RpbWUodHJpbSgoc3RyaW5nKSAkZXZlbnQtPnN0YXJ0RGF0ZSkpOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ2Rlc2NyaXB0aW9uJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmRlc2NyaXB0aW9uOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzBdOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsxXTsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsyXTsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsncmV2aWV3cyddID0gKHN0cmluZykgJGV2ZW50LT5yZXZpZXdzOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3RhZyddID0gKHN0cmluZykgJGV2ZW50LT50YWc7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkNCgkJCQkJcmV0dXJuICRyZWNjb21lbmRlZEV2ZW50czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1RoaXMgdXNlciBoYXMgbm8gcmVjb21tZW5kYXRpb25zJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBzaG91dHMgZm9yIHRoaXMgdXNlcg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hvdXRzKCRtZXRob2RWYXJzKSB7DQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXRzaG91dHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRzaG91dHNbJ3VzZXInXSA9IChzdHJpbmcpJGNhbGwtPnNob3V0c1sndXNlciddOw0KCQkJCSRzaG91dHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSRjYWxsLT5zaG91dHNbJ3RvdGFsJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+c2hvdXRzLT5zaG91dCBhcyAkc2hvdXQgKSB7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYm9keSddID0gKHN0cmluZykkc2hvdXQtPmJvZHk7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYXV0aG9yJ10gPSAoc3RyaW5nKSRzaG91dC0+YXV0aG9yOw0KCQkJCQkkc2hvdXRzWydzaG91dHMnXVskaV1bJ2RhdGUnXSA9IHN0cnRvdGltZSgoc3RyaW5nKSRzaG91dC0+ZGF0ZSk7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkc2hvdXRzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIGFsYnVtcyBsaXN0ZW5lZCB0byBieSBhIHVzZXIuIFlvdSBjYW4gc3RpcHVsYXRlIGEgdGltZSBwZXJpb2QuIFNlbmRzIHRoZSBvdmVyYWxsIGNoYXJ0IGJ5IGRlZmF1bHQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlOiA8aT5wZXJpb2Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BBbGJ1bXMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0dG9wYWxidW1zJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT50b3BhbGJ1bXMtPmFsYnVtKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BhbGJ1bXMtPmFsYnVtIGFzICRhbGJ1bSApIHsNCgkJCQkJCSR0b3BhbGJ1bXNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYWxidW0tPm5hbWU7DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsncGxheWNvdW50J10gPSAoc3RyaW5nKSAkYWxidW0tPnBsYXljb3VudDsNCgkJCQkJCSR0b3BhbGJ1bXNbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYWxidW0tPm1iaWQ7DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYWxidW0tPnVybDsNCgkJCQkJCSR0b3BhbGJ1bXNbJGldWydhcnRpc3QnXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3QtPm5hbWU7DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkJJHRvcGFsYnVtc1skaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT51cmw7DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsnaW1hZ2VzJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzBdOw0KCQkJCQkJJHRvcGFsYnVtc1skaV1bJ2ltYWdlcyddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMV07DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsnaW1hZ2VzJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BhbGJ1bXM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGlzIHVzZXIgaGFzIG5vIHRvcCBhbGJ1bXMnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCBhcnRpc3RzIGxpc3RlbmVkIHRvIGJ5IGEgdXNlci4gWW91IGNhbiBzdGlwdWxhdGUgYSB0aW1lIHBlcmlvZC4gU2VuZHMgdGhlIG92ZXJhbGwgY2hhcnQgYnkgZGVmYXVsdA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWU6IDxpPnBlcmlvZDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcEFydGlzdHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0dG9wYXJ0aXN0cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wYXJ0aXN0cy0+YXJ0aXN0KSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BhcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJCSR0b3BhcnRpc3RzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFydGlzdC0+bmFtZTsNCgkJCQkJCSR0b3BhcnRpc3RzWyRpXVsncmFuayddID0gKHN0cmluZykgJGFydGlzdFsncmFuayddOw0KCQkJCQkJJHRvcGFydGlzdHNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhcnRpc3QtPnBsYXljb3VudDsNCgkJCQkJCSR0b3BhcnRpc3RzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJCSR0b3BhcnRpc3RzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT51cmw7DQoJCQkJCQkkdG9wYXJ0aXN0c1skaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkJCQkkdG9wYXJ0aXN0c1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMF07DQoJCQkJCQkkdG9wYXJ0aXN0c1skaV1bJ2ltYWdlcyddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzFdOw0KCQkJCQkJJHRvcGFydGlzdHNbJGldWydpbWFnZXMnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BhcnRpc3RzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyB0b3AgYXJ0aXN0cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIHRhZ3MgdXNlZCBieSB0aGlzIHVzZXINCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlOiA8aT5saW1pdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcFRhZ3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0dG9wdGFncycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wdGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3B0YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkJCSR0b3B0YWdzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCSR0b3B0YWdzWyRpXVsnY291bnQnXSA9IChzdHJpbmcpICR0YWctPmNvdW50Ow0KCQkJCQkJJHRvcHRhZ3NbJGldWyd1cmwnXSA9IChzdHJpbmcpICR0YWctPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkdG9wdGFnczsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1RoaXMgdXNlciBoYXMgbm8gdG9wIHRhZ3MnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCB0cmFja3MgbGlzdGVuZWQgdG8gYnkgYSB1c2VyLiBZb3UgY2FuIHN0aXB1bGF0ZSBhIHRpbWUgcGVyaW9kLiBTZW5kcyB0aGUgb3ZlcmFsbCBjaGFydCBieSBkZWZhdWx0DQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZTogPGk+cGVyaW9kPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wVHJhY2tzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHRvcHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wdHJhY2tzLT50cmFjaykgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5uYW1lOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICR0cmFja1sncmFuayddOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJHRyYWNrLT5wbGF5Y291bnQ7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5tYmlkOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT51cmw7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ2Z1bGx0cmFjayddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlWydmdWxsdHJhY2snXTsNCgkJCQkJCSR0b3B0cmFja3NbJGldWydhcnRpc3QnXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5hcnRpc3QtPm5hbWU7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT51cmw7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnaW1hZ2VzJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzBdOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ2ltYWdlcyddWydtZWRpdW0nXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMV07DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnaW1hZ2VzJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3B0cmFja3M7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGlzIHVzZXIgaGFzIG5vIHRvcCB0cmFja3MnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYW4gYWxidW0gY2hhcnQgZm9yIGEgdXNlciBwcm9maWxlLCBmb3IgYSBnaXZlbiBkYXRlIHJhbmdlLiBJZiBubyBkYXRlIHJhbmdlIGlzIHN1cHBsaWVkLCBpdCB3aWxsIHJldHVybiB0aGUgbW9zdCByZWNlbnQgYWxidW0gY2hhcnQgZm9yIHRoaXMgdXNlcg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT50bzwvaT4sIDxpPmZyb208L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlBbGJ1bUNoYXJ0KCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHdlZWtseWFsYnVtY2hhcnQnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPndlZWtseWFsYnVtY2hhcnQtPmFsYnVtIGFzICRhbGJ1bSApIHsNCgkJCQkJJHdlZWtseWFsYnVtc1skaV1bJ25hbWUnXSA9IChzdHJpbmcpICRhbGJ1bS0+bmFtZTsNCgkJCQkJJHdlZWtseWFsYnVtc1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICRhbGJ1bVsncmFuayddOw0KCQkJCQkkd2Vla2x5YWxidW1zWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0Ow0KCQkJCQkkd2Vla2x5YWxidW1zWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0WydtYmlkJ107DQoJCQkJCSR3ZWVrbHlhbGJ1bXNbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYWxidW0tPm1iaWQ7DQoJCQkJCSR3ZWVrbHlhbGJ1bXNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhbGJ1bS0+cGxheWNvdW50Ow0KCQkJCQkkd2Vla2x5YWxidW1zWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYWxidW0tPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJDQoJCQkJcmV0dXJuICR3ZWVrbHlhbGJ1bXM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGFuIGFydGlzdCBjaGFydCBmb3IgYSB1c2VyIHByb2ZpbGUsIGZvciBhIGdpdmVuIGRhdGUgcmFuZ2UuIElmIG5vIGRhdGUgcmFuZ2UgaXMgc3VwcGxpZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBhcnRpc3QgY2hhcnQgZm9yIHRoaXMgdXNlcg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT50bzwvaT4sIDxpPmZyb208L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlBcnRpc3RDaGFydCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXR3ZWVrbHlhcnRpc3RjaGFydCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+d2Vla2x5YXJ0aXN0Y2hhcnQtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkkd2Vla2x5YXJ0aXN0c1skaV1bJ25hbWUnXSA9IChzdHJpbmcpICRhcnRpc3QtPm5hbWU7DQoJCQkJCSR3ZWVrbHlhcnRpc3RzWyRpXVsncmFuayddID0gKHN0cmluZykgJGFydGlzdFsncmFuayddOw0KCQkJCQkkd2Vla2x5YXJ0aXN0c1skaV1bJ21iaWQnXSA9IChzdHJpbmcpICRhcnRpc3QtPm1iaWQ7DQoJCQkJCSR3ZWVrbHlhcnRpc3RzWyRpXVsncGxheWNvdW50J10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5wbGF5Y291bnQ7DQoJCQkJCSR3ZWVrbHlhcnRpc3RzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT51cmw7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkd2Vla2x5YXJ0aXN0czsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGFydHMgZm9yIHRoaXMgdXNlciwgZXhwcmVzc2VkIGFzIGRhdGUgcmFuZ2VzIHdoaWNoIGNhbiBiZSBzZW50IHRvIHRoZSBjaGFydCBzZXJ2aWNlcw0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5Q2hhcnRMaXN0KCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHdlZWtseWNoYXJ0bGlzdCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+d2Vla2x5Y2hhcnRsaXN0LT5jaGFydCBhcyAkY2hhcnQgKSB7DQoJCQkJCSR3ZWVrbHljaGFydGxpc3RbJGldWydmcm9tJ10gPSAoc3RyaW5nKSAkY2hhcnRbJ2Zyb20nXTsNCgkJCQkJJHdlZWtseWNoYXJ0bGlzdFskaV1bJ3RvJ10gPSAoc3RyaW5nKSAkY2hhcnRbJ3RvJ107DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkd2Vla2x5Y2hhcnRsaXN0Ow0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIHRyYWNrIGNoYXJ0IGZvciBhIHVzZXIgcHJvZmlsZSwgZm9yIGEgZ2l2ZW4gZGF0ZSByYW5nZS4gSWYgbm8gZGF0ZSByYW5nZSBpcyBzdXBwbGllZCwgaXQgd2lsbCByZXR1cm4gdGhlIG1vc3QgcmVjZW50IHRyYWNrIGNoYXJ0IGZvciB0aGlzIHVzZXINCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+dG88L2k+LCA8aT5mcm9tPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5VHJhY2tDaGFydCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXR3ZWVrbHl0cmFja2NoYXJ0JywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT53ZWVrbHl0cmFja2NoYXJ0LT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCSR3ZWVrbHl0cmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCSR3ZWVrbHl0cmFja3NbJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkdHJhY2tbJ3JhbmsnXTsNCgkJCQkJJHdlZWtseXRyYWNrc1skaV1bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdDsNCgkJCQkJJHdlZWtseXRyYWNrc1skaV1bJ2FydGlzdCddWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdFsnbWJpZCddOw0KCQkJCQkkd2Vla2x5dHJhY2tzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5tYmlkOw0KCQkJCQkkd2Vla2x5dHJhY2tzWyRpXVsncGxheWNvdW50J10gPSAoc3RyaW5nKSAkdHJhY2stPnBsYXljb3VudDsNCgkJCQkJJHdlZWtseXRyYWNrc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT51cmw7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkd2Vla2x5dHJhY2tzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNob3V0IG9uIHRoaXMgdXNlcidzIHNob3V0Ym94IChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+LCA8aT5tZXNzYWdlPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzaG91dCgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ21lc3NhZ2UnXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuc2hvdXQnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIHVzZXIgYW5kIG1lc3NhZ2UgdmFyaWFibGVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/venue.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHZlbnVlIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdmVudWVzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlWZW51ZSBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIHVwY29taW5nIGV2ZW50cyBhdCB0aGlzIHZlbnVlDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZTogPGk+dmVudWU8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRFdmVudHMoJG1ldGhvZFZhcnMpIHsNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3ZlbnVlJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndmVudWUuZ2V0RXZlbnRzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5ldmVudHMtPmV2ZW50KSA+IDAgKSB7DQoJCQkJCSRldmVudHMgPSBhcnJheSgpOw0KCQkJCQkkZXZlbnRzWyd2ZW51ZV9uYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWyd2ZW51ZSddOw0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+ZXZlbnRzLT5ldmVudCBhcyAkZXZlbnQgKSB7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnaWQnXSA9IChzdHJpbmcpICRldmVudC0+aWQ7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnc3RhdHVzJ10gPSAoc3RyaW5nKSAkZXZlbnRbJ3N0YXR1cyddOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRpdGxlOw0KCQkJCQkJaWYgKCBjb3VudCgkZXZlbnQtPmFydGlzdHMtPmFydGlzdCkgPiAwICkgew0KCQkJCQkJCWZvcmVhY2ggKCAkZXZlbnQtPmFydGlzdHMtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnYXJ0aXN0cyddW10gPSAoc3RyaW5nKSAkYXJ0aXN0Ow0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydoZWFkbGluZXInXSA9IChzdHJpbmcpICRldmVudC0+YXJ0aXN0cy0+aGVhZGxpbmVyOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2lkJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5pZDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NpdHknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jaXR5Ow0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NvdW50cnknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jb3VudHJ5Ow0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydwb3N0YWxjb2RlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+cG9zdGFsY29kZTsNCgkJCQkJCSRnZW9Qb2ludHMgPSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2hpbGRyZW4oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsYXQnXSA9IChzdHJpbmcpICRnZW9Qb2ludHMtPnBvaW50LT5sYXQ7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbG9uZyddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxvbmc7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT51cmw7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnc3RhcnREYXRlJ10gPSAoc3RyaW5nKSBzdHJ0b3RpbWUoJGV2ZW50LT5zdGFydERhdGUpOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2Rlc2NyaXB0aW9uJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmRlc2NyaXB0aW9uOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzBdOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsxXTsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsyXTsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsncmV2aWV3cyddID0gKHN0cmluZykgJGV2ZW50LT5yZXZpZXdzOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3RhZyddID0gKHN0cmluZykgJGV2ZW50LT50YWc7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkZXZlbnRzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhlcmUgaXMgbm8gZXZlbnRzIGZvciB0aGlzIHZlbnVlJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSB0aGUgdmVudWUgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgcGFnaW5hdGVkIGxpc3Qgb2YgYWxsIHRoZSBldmVudHMgaGVsZCBhdCB0aGlzIHZlbnVlIGluIHRoZSBwYXN0DQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZTogPGk+dmVudWU8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPnBhZ2U8L2k+LCA8aT5saW1pdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFBhc3RFdmVudHMoJG1ldGhvZFZhcnMpIHsNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3ZlbnVlJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndmVudWUuZ2V0UGFzdEV2ZW50cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+ZXZlbnRzLT5ldmVudCkgPiAwICkgew0KCQkJCQkkZXZlbnRzID0gYXJyYXkoKTsNCgkJCQkJJGV2ZW50c1sndmVudWVfbmFtZSddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndmVudWUnXTsNCgkJCQkJJGV2ZW50c1sncGFnZSddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sncGFnZSddOw0KCQkJCQkkZXZlbnRzWydwZXJQYWdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWydwZXJQYWdlJ107DQoJCQkJCSRldmVudHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWyd0b3RhbCddOw0KCQkJCQkkZXZlbnRzWyd0b3RhbFBhZ2VzJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWyd0b3RhbFBhZ2VzJ107DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5ldmVudHMtPmV2ZW50IGFzICRldmVudCApIHsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydpZCddID0gKHN0cmluZykgJGV2ZW50LT5pZDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydzdGF0dXMnXSA9IChzdHJpbmcpICRldmVudFsnc3RhdHVzJ107DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndGl0bGUnXSA9IChzdHJpbmcpICRldmVudC0+dGl0bGU7DQoJCQkJCQlpZiAoIGNvdW50KCRldmVudC0+YXJ0aXN0cy0+YXJ0aXN0KSA+IDAgKSB7DQoJCQkJCQkJZm9yZWFjaCAoICRldmVudC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydhcnRpc3RzJ11bXSA9IChzdHJpbmcpICRhcnRpc3Q7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2hlYWRsaW5lciddID0gKHN0cmluZykgJGV2ZW50LT5hcnRpc3RzLT5oZWFkbGluZXI7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnaWQnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmlkOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ25hbWUnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPm5hbWU7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY2l0eSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNpdHk7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY291bnRyeSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnc3RyZWV0J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+c3RyZWV0Ow0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3Bvc3RhbGNvZGUnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5wb3N0YWxjb2RlOw0KCQkJCQkJJGdlb1BvaW50cyA9ICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jaGlsZHJlbignaHR0cDovL3d3dy53My5vcmcvMjAwMy8wMS9nZW8vd2dzODRfcG9zIycpOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xhdCddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxhdDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsb25nJ10gPSAoc3RyaW5nKSAkZ2VvUG9pbnRzLT5wb2ludC0+bG9uZzsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWyd1cmwnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPnVybDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydzdGFydERhdGUnXSA9IChzdHJpbmcpIHN0cnRvdGltZSgkZXZlbnQtPnN0YXJ0RGF0ZSk7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnZGVzY3JpcHRpb24nXSA9IChzdHJpbmcpICRldmVudC0+ZGVzY3JpcHRpb247DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRldmVudC0+aW1hZ2VbMF07DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzFdOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzJdOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2F0dGVuZGFuY2UnXSA9IChzdHJpbmcpICRldmVudC0+YXR0ZW5kYW5jZTsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydyZXZpZXdzJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnJldmlld3M7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndGFnJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRhZzsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd1cmwnXSA9IChzdHJpbmcpICRldmVudC0+dXJsOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRldmVudHM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGVyZSBpcyBubyBwYXN0IGV2ZW50cyBmb3IgdGhpcyB2ZW51ZScpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgdGhlIHZlbnVlIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNlYXJjaCBmb3IgYSB2ZW51ZSBieSB2ZW51ZSBuYW1lDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZTogPGk+dmVudWU8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPmxpbWl0PC9pPiwgPGk+cGFnZTwvaT4sIDxpPmNvdW50eTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNlYXJjaCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd2ZW51ZSddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3ZlbnVlLnNlYXJjaCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJG9wZW5zZWFyY2ggPSAkY2FsbC0+cmVzdWx0cy0+Y2hpbGRyZW4oJ2h0dHA6Ly9hOS5jb20vLS9zcGVjL29wZW5zZWFyY2gvMS4xLycpOw0KCQkJCWlmICggJG9wZW5zZWFyY2gtPnRvdGFsUmVzdWx0cyA+IDAgKSB7DQoJCQkJCSRzZWFyY2hSZXN1bHRzWyd0b3RhbFJlc3VsdHMnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT50b3RhbFJlc3VsdHM7DQoJCQkJCSRzZWFyY2hSZXN1bHRzWydzdGFydEluZGV4J10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+c3RhcnRJbmRleDsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ2l0ZW1zUGVyUGFnZSddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPml0ZW1zUGVyUGFnZTsNCgkJCQkJJGkgPSAwOw0KCQkJCQlmb3JlYWNoICggJGNhbGwtPnJlc3VsdHMtPnZlbnVlbWF0Y2hlcy0+dmVudWUgYXMgJHZlbnVlICkgew0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ2lkJ10gPSAoc3RyaW5nKSAkdmVudWUtPmlkOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR2ZW51ZS0+bmFtZTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydsb2NhdGlvbiddWydjaXR5J10gPSAoc3RyaW5nKSAkdmVudWUtPmxvY2F0aW9uLT5jaXR5Ow0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ2xvY2F0aW9uJ11bJ2NvdW50cnknXSA9IChzdHJpbmcpICR2ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbG9jYXRpb24nXVsnc3RyZWV0J10gPSAoc3RyaW5nKSAkdmVudWUtPmxvY2F0aW9uLT5zdHJlZXQ7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbG9jYXRpb24nXVsncG9zdGFsY29kZSddID0gKHN0cmluZykgJHZlbnVlLT5sb2NhdGlvbi0+cG9zdGFsY29kZTsNCgkJCQkJCSRnZW9Qb2ludHMgPSAkdmVudWUtPmxvY2F0aW9uLT5jaGlsZHJlbignaHR0cDovL3d3dy53My5vcmcvMjAwMy8wMS9nZW8vd2dzODRfcG9zIycpOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xhdCddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxhdDsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsb25nJ10gPSAoc3RyaW5nKSAkZ2VvUG9pbnRzLT5wb2ludC0+bG9uZzsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR2ZW51ZS0+dXJsOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRzZWFyY2hSZXN1bHRzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJLy8gTm8gdGFnc2FyZSBmb3VuZA0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdObyByZXN1bHRzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFsYmUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/apibase.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IGNvbnRhaW5zIGFsbCBiYXNlIG1ldGhvZHMgdXNlZCBieSBhbGwgYXBpIGNhbGxzDQogKiBAcGFja2FnZSBiYXNlDQogKi8NCi8qKg0KICogU3RvcmVzIHRoZSBtZXRob2RzIHVzZWQgYnkgYWxsIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYmFzZQ0KICovDQpjbGFzcyBsYXN0Zm1BcGkgew0KDQoJLyoNCgkgKiBTdG9yZXMgZXJyb3IgZGV0YWlscw0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheSBoYXMgdHdvIGVsZW1lbnRzOiA8aT5jb2RlPC9pPiBhbmQgPGk+ZGVzYzwvaT4gd2hpY2ggc3RvcmVzIHRoZSBlcnJvciBjb2RlIGFuZCBkZXNjcmlwdGlvbiByZXNwZWN0aXZseQ0KCSAqLw0KCXB1YmxpYyAkZXJyb3I7DQoJLyoNCgkgKiBTdG9yZXMgdGhlIGNvbm5lY3Rpb24gc3RhdHVzDQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAdmFyIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgJGNvbm5lY3RlZDsNCgkNCgkvKg0KCSAqIFN0b3JlcyB0aGUgaG9zdCBuYW1lDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICRob3N0Ow0KCS8qDQoJICogU3RvcmVzIHRoZSBwb3J0IG51bWJlcg0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkcG9ydDsNCgkvKg0KCSAqIFN0b3JlcyB0aGUgcmF3IGFwaSBjYWxsIHJlc3BvbnNlDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICRyZXNwb25zZTsNCgkvKg0KCSAqIFN0b3JlcyB0aGUgc29ja2V0IGNsYXNzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBjbGFzcw0KCSAqLw0KCXByaXZhdGUgJHNvY2tldDsNCgkvKg0KCSAqIFN0b3JlcyB0aGUgY2FjaGUgY2xhc3MNCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIGNsYXNzDQoJICovDQoJcHJpdmF0ZSAkY2FjaGU7DQoJDQoJLyoNCgkgKiBTZXR1cCB0aGUgc29ja2V0IHRvIGdldCB0aGUgcmF3IGFwaSBjYWxsIHJldHVybg0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gc2V0dXAoKSB7DQoJCSR0aGlzLT5ob3N0ID0gJ3dzLmF1ZGlvc2Nyb2JibGVyLmNvbSc7DQoJCSR0aGlzLT5wb3J0ID0gODA7DQoJCSR0aGlzLT5jb25uZWN0ZWQgPSAwOw0KCQkNCgkJaWYgKCAkdGhpcy0+c29ja2V0ID0gbmV3IGxhc3RmbUFwaVNvY2tldCgkdGhpcy0+aG9zdCwgJHRoaXMtPnBvcnQpICkgew0KCQkJJHRoaXMtPmNvbm5lY3RlZCA9IDE7DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCQllbHNlIHsNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5OSwgJHRoaXMtPnNvY2tldC0+ZXJyb3Jfc3RyaW5nKTsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKg0KCSAqIFR1cm5zIHRoZSByYXcgcmVzcG9uc2UgaW50byBhbiB4bWwgb2JqZWN0DQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHJldHVybiBvYmplY3QNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIHByb2Nlc3NfcmVzcG9uc2UoKSB7DQoJCSR4bWxzdHIgPSAnJzsNCgkJJHJlY29yZCA9IDA7DQoJCWZvcmVhY2ggKCAkdGhpcy0+cmVzcG9uc2UgYXMgJGxpbmUgKSB7DQoJCQlpZiAoICRyZWNvcmQgPT0gMSApIHsNCgkJCQkkeG1sc3RyIC49ICRsaW5lOw0KCQkJfQ0KCQkJZWxzZWlmKCBzdWJzdHIoJGxpbmUsIDAsIDEpID09ICc8JyApIHsNCgkJCQkkcmVjb3JkID0gMTsNCgkJCX0NCgkJfQ0KCQkNCgkJdHJ5IHsNCgkJCWxpYnhtbF91c2VfaW50ZXJuYWxfZXJyb3JzKHRydWUpOw0KCQkJJHhtbCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCR4bWxzdHIpOw0KCQl9IA0KCQljYXRjaCAoRXhjZXB0aW9uICRlKSB7DQoJCQkvLyBDcmFwISBXZSBnb3QgZXJyb3JzISEhDQoJCQkkZXJyb3JzID0gbGlieG1sX2dldF9lcnJvcnMoKTsNCgkJCSRlcnJvciA9ICRlcnJvcnNbMF07DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTUsICdTaW1wbGVYTUxFbGVtZW50IGVycm9yOiAnLiRlLT5nZXRNZXNzYWdlKCkuJzogJy4kZXJyb3ItPm1lc3NhZ2UpOw0KCQl9DQoJCQ0KCQlpZiAoICFpc3NldCgkZSkgKSB7DQoJCQkvLyBBbGwgaXMgd2VsbCA6KQ0KCQkJcmV0dXJuICR4bWw7DQoJCQkvKiByZXR1cm4gZmlsdGVyX3Zhcl9hcnJheSgNCgkJCQkoYXJyYXkpICR4bWwsDQoJCQkJYXJyYXkoDQoJCQkJCSdmaWx0ZXInID0+IEZJTFRFUl9TQU5JVElaRV9TVFJJTkcsDQoJCQkJCSdmbGFncycgPT4gRklMVEVSX0ZMQUdfU1RSSVBfSElHSA0KCQkJCSkNCgkJCSk7ICovDQoJCX0NCgl9DQoJDQoJLyoNCgkgKiBVc2VkIGluIGFwaSBjYWxscyB0aGF0IGRvIG5vdCByZXF1aXJlIHdyaXRlIGFjY2Vzcy4gUmV0dXJucyBhbiB4bWwgb2JqZWN0DQoJICogQGFjY2VzcyBwcm90ZWN0ZWQNCgkgKiBAcmV0dXJuIG9iamVjdA0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBhcGlHZXRDYWxsKCR2YXJzKSB7DQoJCSR0aGlzLT5zZXR1cCgpOw0KCQlpZiAoICR0aGlzLT5jb25uZWN0ZWQgPT0gMSApIHsNCgkJCSR0aGlzLT5jYWNoZSA9IG5ldyBsYXN0Zm1BcGlDYWNoZSgkdGhpcy0+Y29uZmlnKTsNCgkJCWlmICggIWVtcHR5KCR0aGlzLT5jYWNoZS0+ZXJyb3IpICkgew0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5NiwgJHRoaXMtPmNhY2hlLT5lcnJvcik7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJaWYgKCAkY2FjaGUgPSAkdGhpcy0+Y2FjaGUtPmdldCgkdmFycykgKSB7DQoJCQkJCS8vIENhY2hlIGV4aXN0cw0KCQkJCQkkdGhpcy0+cmVzcG9uc2UgPSAkY2FjaGU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBDYWNoZSBkb2VzbnQgZXhpc3QNCgkJCQkJJHVybCA9ICcvMi4wLz8nOw0KCQkJCQlmb3JlYWNoICggJHZhcnMgYXMgJG5hbWUgPT4gJHZhbHVlICkgew0KCQkJCQkJJHVybCAuPSB0cmltKHVybGVuY29kZSgkbmFtZSkpLic9Jy50cmltKHVybGVuY29kZSgkdmFsdWUpKS4nJic7DQoJCQkJCX0NCgkJCQkJJHVybCA9IHN1YnN0cigkdXJsLCAwLCAtMSk7DQoJCQkJCSR1cmwgPSBzdHJfcmVwbGFjZSgnICcsICclMjAnLCAkdXJsKTsNCgkJCQkJDQoJCQkJCSRvdXQgPSAiR0VUICIuJHVybC4iIEhUVFAvMS4wXHJcbiI7DQoJCQkJCSRvdXQgLj0gIkhvc3Q6ICIuJHRoaXMtPmhvc3QuIlxyXG4iOw0KCQkJCQkkb3V0IC49ICJcclxuIjsNCgkJCQkJJHRoaXMtPnJlc3BvbnNlID0gJHRoaXMtPnNvY2tldC0+c2VuZCgkb3V0LCAnYXJyYXknKTsNCgkJCQkJJHRoaXMtPmNhY2hlLT5zZXQoJHZhcnMsICR0aGlzLT5yZXNwb25zZSk7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkdGhpcy0+cHJvY2Vzc19yZXNwb25zZSgpOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KCQ0KCS8qDQoJICogVXNlZCBpbiBhcGkgY2FsbHMgdGhhdCByZXF1aXJlIHdyaXRlIGFjY2Vzcy4gUmV0dXJucyBhbiB4bWwgb2JqZWN0DQoJICogQGFjY2VzcyBwcm90ZWN0ZWQNCgkgKiBAcmV0dXJuIG9iamVjdA0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBhcGlQb3N0Q2FsbCgkdmFycywgJHJldHVybiA9ICdib29sJykgew0KCQkkdGhpcy0+c2V0dXAoKTsNCgkJaWYgKCAkdGhpcy0+Y29ubmVjdGVkID09IDEgKSB7DQoJCQkkdXJsID0gJy8yLjAvJzsNCgkJCQ0KCQkJJGRhdGEgPSAnJzsNCgkJCWZvcmVhY2ggKCAkdmFycyBhcyAkbmFtZSA9PiAkdmFsdWUgKSB7DQoJCQkJJGRhdGEgLj0gdHJpbSgkbmFtZSkuJz0nLnRyaW0oJHZhbHVlKS4nJic7DQoJCQl9DQoJCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgMCwgLTEpOw0KCQkJJGRhdGEgPSBzdHJfcmVwbGFjZSgnICcsICclMjAnLCAkZGF0YSk7DQoJCQkNCgkJCSRvdXQgPSAiUE9TVCAiLiR1cmwuIiBIVFRQLzEuMVxyXG4iOw0KCQkJJG91dCAuPSAiSG9zdDogIi4kdGhpcy0+aG9zdC4iXHJcbiI7DQoJCQkkb3V0IC49ICJDb250ZW50LUxlbmd0aDogIi5zdHJsZW4oJGRhdGEpLiJcclxuIjsNCgkJCSRvdXQgLj0gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiI7DQoJCQkkb3V0IC49ICJcclxuIjsNCgkJCSRvdXQgLj0gJGRhdGEuIlxyXG4iOw0KCQkJJHRoaXMtPnJlc3BvbnNlID0gJHRoaXMtPnNvY2tldC0+c2VuZCgkb3V0LCAnYXJyYXknKTsNCgkJCQ0KCQkJcmV0dXJuICR0aGlzLT5wcm9jZXNzX3Jlc3BvbnNlKCk7DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoJDQoJLyoNCgkgKiBQcm9jZXNzZXMgYW5kIGVycm9yIGFuZCB3cml0ZXMgdG8gdGhlIHB1YmxpYyB2YXJpYWJsZSAkZXJyb3INCgkgKiBAYWNjZXNzIHByb3RlY3RlZA0KCSAqIEByZXR1cm4gdm9pZA0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBoYW5kbGVFcnJvcigkZXJyb3IgPSAnJywgJGN1c3RvbURlc2MgPSAnJykgew0KCQlpZiAoICFlbXB0eSgkZXJyb3IpICYmIGlzX29iamVjdCgkZXJyb3IpICkgew0KCQkJLy8gRmFpbCB3aXRoIGVycm9yIGNvZGUNCgkJCSR0aGlzLT5lcnJvclsnY29kZSddID0gJGVycm9yWydjb2RlJ107DQoJCQkkdGhpcy0+ZXJyb3JbJ2Rlc2MnXSA9ICRlcnJvcjsNCgkJfQ0KCQllbHNlaWYoICFlbXB0eSgkZXJyb3IpICYmIGlzX251bWVyaWMoJGVycm9yKSApIHsNCgkJCS8vIEZhaWwgd2l0aCBjdXN0b20gZXJyb3IgY29kZQ0KCQkJJHRoaXMtPmVycm9yWydjb2RlJ10gPSAkZXJyb3I7DQoJCQkkdGhpcy0+ZXJyb3JbJ2Rlc2MnXSA9ICRjdXN0b21EZXNjOw0KCQl9DQoJCWVsc2Ugew0KCQkJLy9IYXJkIGZhaWx1cmUNCgkJCSR0aGlzLT5lcnJvclsnY29kZSddID0gMDsNCgkJCSR0aGlzLT5lcnJvclsnZGVzYyddID0gJ1Vua25vd24gZXJyb3InOw0KCQl9DQoJfQ0KCQ0KCS8qDQoJICogR2VuZXJhdGVzIHRoZSBhcGkgc2lnbmF0dXJlIGZvciB1c2UgaW4gYXBpIGNhbGxzIHRoYXQgcmVxdWlyZSB3cml0ZSBhY2Nlc3MNCgkgKiBAYWNjZXNzIHByb3RlY3RlZA0KCSAqIEByZXR1cm4gc3RyaW5nDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIGFwaVNpZygkc2VjcmV0LCAkdmFycykgew0KCQlrc29ydCgkdmFycyk7DQoJCQ0KCQkkc2lnID0gJyc7DQoJCWZvcmVhY2ggKCAkdmFycyBhcyAkbmFtZSA9PiAkdmFsdWUgKSB7DQoJCQkkc2lnIC49ICRuYW1lLiR2YWx1ZTsNCgkJfQ0KCQkkc2lnIC49ICRzZWNyZXQ7DQoJCSRzaWcgPSBtZDUoJHNpZyk7DQoJCQ0KCQlyZXR1cm4gJHNpZzsNCgl9DQoJDQoJLyoNCgkgKiBVc2VkIHRvIHJldHVybiB0aGUgY29ycmVjdCBwYWNrYWdlIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgYXBpIGNhbGxzIGZvciB0aGF0IHBhY2thZ2UNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEByZXR1cm4gY2xhc3MNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgkYXV0aCwgJHBhY2thZ2UsICRjb25maWcgPSAnJykgew0KCQlpZiAoICRjb25maWcgPT0gJycgKSB7DQoJCQkkY29uZmlnID0gYXJyYXkoDQoJCQkJJ2VuYWJsZWQnID0+IGZhbHNlDQoJCQkpOw0KCQl9DQoJCQ0KCQlpZiAoIGlzX29iamVjdCgkYXV0aCkgKSB7DQoJCQlpZiAoICFlbXB0eSgkYXV0aC0+YXBpS2V5KSAmJiAhZW1wdHkoJGF1dGgtPnNlY3JldCkgJiYgIWVtcHR5KCRhdXRoLT51c2VybmFtZSkgJiYgIWVtcHR5KCRhdXRoLT5zZXNzaW9uS2V5KSAmJiAoJGF1dGgtPnN1YnNjcmliZXIgPT0gMCB8fCAkYXV0aC0+c3Vic2NyaWJlciA9PSAxKSApIHsNCgkJCQkkZnVsbEF1dGggPSAxOw0KCQkJfQ0KCQkJZWxzZWlmICggIWVtcHR5KCRhdXRoLT5hcGlLZXkpICkgew0KCQkJCSRmdWxsQXV0aCA9IDA7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdJbnZhbGlkIGF1dGggY2xhc3Mgd2FzIHBhc3NlZCB0byBsYXN0Zm1BcGkuIFlvdSBuZWVkIHRvIGhhdmUgYXQgbGVhc3QgYW4gYXBpS2V5IHNldCcpOw0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBuZWVkIHRvIHBhc3MgYSBsYXN0Zm1BcGlBdXRoIGNsYXNzIGFzIHRoZSBmaXJzdCB2YXJpYWJsZSB0byB0aGlzIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgkJDQoJCWlmICggJHBhY2thZ2UgPT0gJ2FsYnVtJyB8fCAkcGFja2FnZSA9PSAnYXJ0aXN0JyB8fCAkcGFja2FnZSA9PSAnZXZlbnQnIHx8ICRwYWNrYWdlID09ICdnZW8nIHx8ICRwYWNrYWdlID09ICdncm91cCcgfHwgJHBhY2thZ2UgPT0gJ2xpYnJhcnknIHx8ICRwYWNrYWdlID09ICdwbGF5bGlzdCcgfHwgJHBhY2thZ2UgPT0gJ3JhZGlvJyB8fCAkcGFja2FnZSA9PSAndGFnJyB8fCAkcGFja2FnZSA9PSAndGFzdGVvbWV0ZXInIHx8ICRwYWNrYWdlID09ICd0cmFjaycgfHwgJHBhY2thZ2UgPT0gJ3VzZXInIHx8ICRwYWNrYWdlID09ICd2ZW51ZScgKSB7DQoJCQkkY2xhc3NOYW1lID0gJ2xhc3RmbUFwaScudWNmaXJzdCgkcGFja2FnZSk7DQoJCQlyZXR1cm4gbmV3ICRjbGFzc05hbWUoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZyk7DQoJCX0NCgkJZWxzZSB7DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdUaGUgcGFja2FnZSBuYW1lIHlvdSBwYXN0IHdhcyBpbnZhbGlkJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/cache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogU3RvcmVzIHRoZSBjYWNoaW5nIG1ldGhvZHMNCiAqIEBwYWNrYWdlIGJhc2UNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBjYWNoaW5nIG1ldGhvZHMgdG8gY2FjaGUgZGF0YSB3aGVuIGFwaSBjYWxscyBhcmUgbWFkZQ0KICogQHBhY2thZ2UgYmFzZQ0KICovDQpjbGFzcyBsYXN0Zm1BcGlDYWNoZSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBiYXRhYmFzZSBjbGFzcw0KCSAqIEB2YXIgY2xhc3MNCgkgKi8NCglwcml2YXRlICRkYjsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGJhdGFiYXNlIHR5cGUNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJHR5cGU7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBlcnJvciBkZXRhaWxzDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkZXJyb3I7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBwYXRoIHRvIHRoZSBzcWxpdGUgZGF0YWJhc2UNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJHBhdGg7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBhbW91bnQgb2YgdGltZSB0byBjYWhjZSBmb3INCgkgKiBAdmFyIGludGVnZXINCgkgKi8NCglwcml2YXRlICRjYWNoZV9sZW5ndGg7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgYXJyYXkNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkY29uZmlnOw0KCS8qKg0KCSAqIFN0YXRlcyBpZiBjYWNoaW5nIGlzIGVuYWJsZWQgb3Igbm90DQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHJpdmF0ZSAkZW5hYmxlZDsNCgkNCgkvKioNCgkgKiBSdW4gd2hlbiB0aGUgY2xhc3MgaXMgY3JlYXRlZA0KCSAqIEBwYXJhbSBhcnJheSAkY29uZmlnIFRoZSBjb25maWcgYXJyYXkNCgkgKiBAdXNlcyBsYXN0Zm1BcGlEYXRhYmFzZQ0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRjb25maWcpIHsNCgkJJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7DQoJCQ0KCQlpZiAoIGlzc2V0KCR0aGlzLT5jb25maWdbJ2NhY2hlX3R5cGUnXSkgKSB7DQoJCQkkdGhpcy0+dHlwZSA9ICR0aGlzLT5jb25maWdbJ2NhY2hlX3R5cGUnXTsNCgkJfQ0KCQllbHNlIHsNCgkJCSR0aGlzLT50eXBlID0gJ3NxbGl0ZSc7DQoJCX0NCgkJDQoJCSR0aGlzLT5jaGVja19pZl9lbmFibGVkKCk7DQoJCQ0KCQlpZiAoICR0aGlzLT5lbmFibGVkID09IHRydWUgKSB7DQoJCQlpZiAoICR0aGlzLT50eXBlID09ICdzcWxpdGUnICkgew0KCQkJCXJlcXVpcmVfb25jZSAnc3FsaXRlLnBocCc7CQkJCQ0KCQkJCSR0aGlzLT5kYiA9IG5ldyBsYXN0Zm1BcGlEYXRhYmFzZSgkdGhpcy0+Y29uZmlnWydwYXRoJ10uJ3BocGxhc3RmbWFwaScpOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJaWYgKCBpc3NldCgkdGhpcy0+Y29uZmlnWydkYXRhYmFzZSddWydob3N0J10pICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ3VzZXJuYW1lJ10pICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ3Bhc3N3b3JkJ10pICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ25hbWUnXSkgKSB7DQoJCQkJCXJlcXVpcmVfb25jZSAnbXlzcWwucGhwJzsJCQkJDQoJCQkJCSR0aGlzLT5kYiA9IG5ldyBsYXN0Zm1BcGlEYXRhYmFzZSgkdGhpcy0+Y29uZmlnWydkYXRhYmFzZSddWydob3N0J10sICR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ3VzZXJuYW1lJ10sICR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ3Bhc3N3b3JkJ10sICR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ25hbWUnXSk7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+ZXJyb3IgPSAnTm90IGFsbCBteXNxbCBkYXRhYmFzZSB2YXJpYWJsZXMgd2VyZSBzdXBwbGllZCc7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoICFlbXB0eSgkdGhpcy0+ZGItPmVycm9yKSApIHsNCgkJCQkkdGhpcy0+ZXJyb3IgPSAkdGhpcy0+ZGItPmVycm9yOw0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCSR0aGlzLT5jaGVja190YWJsZV9leGlzdHMoKTsNCgkJCX0NCgkJCS8vJHRoaXMtPnNob3dfYWxsKCk7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogSW50ZXJuYWwgbWV0aG9kIHRvIGNoYWNrIGlmIGNhY2hpbmcgaXMgZW5hYmxlZA0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEByZXR1cm4gdm9pZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gY2hlY2tfaWZfZW5hYmxlZCgpIHsNCgkJaWYgKCAkdGhpcy0+Y29uZmlnWydlbmFibGVkJ10gPT0gdHJ1ZSAmJiBmdW5jdGlvbl9leGlzdHMoJ3NxbGl0ZV9vcGVuJykgKSB7DQoJCQkkdGhpcy0+ZW5hYmxlZCA9IHRydWU7DQoJCX0NCgkJZWxzZSB7DQoJCQkkdGhpcy0+ZW5hYmxlZCA9IGZhbHNlOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEludGVybmFsIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgdGFibGUgZXhpc3RzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHJldHVybiB2b2lkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBjaGVja190YWJsZV9leGlzdHMoKSB7DQoJCWlmICggJHRoaXMtPnR5cGUgPT0gJ3NxbGl0ZScgKSB7DQoJCQkkcXVlcnkgPSAiU0VMRUNUIGNvdW50KCopIEZST00gc3FsaXRlX21hc3RlciBXSEVSRSBuYW1lPSdjYWNoZSciOw0KCQkJJHJlc3VsdCA9ICR0aGlzLT5kYi0+cXVlcnkoJHF1ZXJ5KTsNCgkJCSRudW1iZXJzID0gJHJlc3VsdC0+ZmV0Y2hBbGwoKTsNCgkJCWlmICggJG51bWJlcnNbMF1bJ2NvdW50KCopJ10gPiAwICkgew0KCQkJCS8vIE9rDQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkdGhpcy0+Y3JlYXRlX3RhYmxlKCk7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkkcXVlcnkgPSAic2hvdyB0YWJsZXMgbGlrZSAnY2FjaGUnIjsNCgkJCSRyZXN1bHQgPSAkdGhpcy0+ZGItPnF1ZXJ5KCRxdWVyeSk7DQoJCQlpZiAoICRyZXN1bHQtPnNpemUoKSA+IDAgKSB7DQoJCQkJLy8gT2sNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCSR0aGlzLT5jcmVhdGVfdGFibGUoKTsNCgkJCX0NCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBtZXRob2QgdG8gY3JlYXRlIHRoZSB0YWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0DQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHJldHVybiB2b2lkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVfdGFibGUoKSB7DQoJCWlmICggJHRoaXMtPnR5cGUgPT0gJ3NxbGl0ZScgKSB7DQoJCQkkYXV0b19pbmNyZWFzZSA9ICcnOw0KCQl9DQoJCWVsc2Ugew0KCQkJJGF1dG9faW5jcmVhc2UgPSAnIEFVVE9fSU5DUkVNRU5UJzsNCgkJfQ0KCQkkcXVlcnkgPSAiQ1JFQVRFIFRBQkxFIGNhY2hlIChjYWNoZV9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZIi4kYXV0b19pbmNyZWFzZS4iLCB1bmlxdWVfdmFycyBURVhULCBleHBpcmVzIElOVCwgYm9keSBURVhUKSI7DQoJCWlmICggJHRoaXMtPmRiLT5xdWVyeSgkcXVlcnkpICkgew0KCQkJLy8gT2sNCgkJfQ0KCQllbHNlIHsNCgkJCS8vIFRPRE86IEhhbmRsZSBlcnJvcg0KCQkJZWNobyAkdGhpcy0+ZGItPmVycm9yOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNlYXJjaGVzIHRoZSBkYXRhYmFzZSBmb3IgdGhlIGNhaGNlIGRhdGUuIFJldHVybnMgYW4gYXJyYXkgaWYgaXQgZXhpc3RzIG9yIGZhbHNlIGlmIGl0IGRvZXNuJ3QgDQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAcGFyYW0gYXJyYXkgJHVuaXF1ZV92YXJzIEFycmF5IG9mIHZhcmlhYmxlcyB0aGF0IGFyZSB1bmlxdWUgdG8gdGhpcyBwaWVjZSBvZiBjYWNoZWQgZGF0YQ0KCSAqIEByZXR1cm4gc3RyaW5nDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldCgkdW5pcXVlX3ZhcnMpIHsNCgkJaWYgKCAkdGhpcy0+ZW5hYmxlZCA9PSB0cnVlICkgew0KCQkJJHF1ZXJ5ID0gIlNFTEVDVCBleHBpcmVzLCBib2R5IEZST00gY2FjaGUgV0hFUkUgdW5pcXVlX3ZhcnM9JyIuaHRtbGVudGl0aWVzKHNlcmlhbGl6ZSgkdW5pcXVlX3ZhcnMpKS4iJyBMSU1JVCAxIjsNCgkJCWlmICggJHJlc3VsdCA9ICR0aGlzLT5kYi0+cXVlcnkoJHF1ZXJ5KSApIHsNCgkJCQlpZiAoICRyZXN1bHQtPnNpemUoKSA+IDAgKSB7DQoJCQkJCSRyb3cgPSAkcmVzdWx0LT5mZXRjaCgpOw0KCQkJCQlpZiAoICRyb3dbJ2V4cGlyZXMnXSA8IHRpbWUoKSApIHsNCgkJCQkJCSR0aGlzLT5kZWwoJHVuaXF1ZV92YXJzKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfQ0KCQkJCQllbHNlIHsNCgkJCQkJCS8vcHJpbnRfcih1bnNlcmlhbGl6ZShodG1sX2VudGl0eV9kZWNvZGUoJHJvd1snYm9keSddKSkpOw0KCQkJCQkJcmV0dXJuIHVuc2VyaWFsaXplKGh0bWxfZW50aXR5X2RlY29kZSgkcm93Wydib2R5J10pKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCS8vIFRPRE86IEhhbmRsZSBlcnJvcg0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBBZGRzIG5ldyBjYWNoZSBkYXRhIHRvIHRoZSBkYXRhYmFzZQ0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHBhcmFtIGFycmF5ICR1bmlxdWVfdmFycyBBcnJheSBvZiB2YXJpYWJsZXMgdGhhdCBhcmUgdW5pcXVlIHRvIHRoaXMgcGllY2Ugb2YgY2FjaGVkIGRhdGENCgkgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBjb250ZW50cyBvZiB0aGUgY2FjaGUgdG8gcHV0IGludG8gdGhlIGRhdGFiYXNlDQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNldCgkdW5pcXVlX3ZhcnMsICAkYm9keSkgew0KCQlpZiAoICR0aGlzLT5lbmFibGVkID09IHRydWUgKSB7DQoJCQkkZXhwaXJlID0gdGltZSgpICsgJHRoaXMtPmNvbmZpZ1snY2FjaGVfbGVuZ3RoJ107DQoJCQkkcXVlcnkgPSAiSU5TRVJUIElOVE8gY2FjaGUgKHVuaXF1ZV92YXJzLCBleHBpcmVzLCBib2R5KSBWQUxVRVMgKCciLmh0bWxlbnRpdGllcyhzZXJpYWxpemUoJHVuaXF1ZV92YXJzKSkuIicsICciLiRleHBpcmUuIicsIFwiIi5odG1sZW50aXRpZXMoc2VyaWFsaXplKCRib2R5KSkuIlwiKSI7DQoJCQlpZiAoICR0aGlzLT5kYi0+cXVlcnkoJHF1ZXJ5KSApIHsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCS8vIFRPRE86IEhhbmRsZSBlcnJvcg0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIHVubmVlZGVkIGNhY2hlIGRhdGENCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAcGFyYW0gYXJyYXkgJHVuaXF1ZV92YXJzIEFycmF5IG9mIHZhcmlhYmxlcyB0aGF0IGFyZSB1bmlxdWUgdG8gdGhpcyBwaWVjZSBvZiBjYWNoZWQgZGF0YQ0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gZGVsKCR1bmlxdWVfdmFycykgew0KCQkkcXVlcnkgPSAiREVMRVRFIEZST00gY2FjaGUgV0hFUkUgdW5pcXVlX3ZhcnM9JyIuaHRtbGVudGl0aWVzKHNlcmlhbGl6ZSgkdW5pcXVlX3ZhcnMpKS4iJyI7DQoJCWlmICggJHRoaXMtPmRiLT5xdWVyeSgkcXVlcnkpICkgew0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBUT0RPOiBIYW5kbGUgZXJyb3INCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBtZXRob2QgdG8gc2hvdyBhbGwgY2FjaGVkIGRhdGEgKHVzZWQgZm9yIGRlYnVnZ2luZykNCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIHNob3dfYWxsKCkgew0KCQkkcXVlcnkgPSAiU0VMRUNUIGV4cGlyZXMsIGJvZHkgRlJPTSBjYWNoZSI7DQoJCWlmICggJHJlc3VsdCA9ICR0aGlzLT5kYi0+cXVlcnkoJHF1ZXJ5KSApIHsNCgkJCWlmICggJHJlc3VsdC0+c2l6ZSgpID4gMCApIHsNCgkJCQkkcmVzdWx0cyA9ICRyZXN1bHQtPmZldGNoQWxsKCk7DQoJCQkJZWNobyAnPHByZT4nOw0KCQkJCXByaW50X3IoJHJlc3VsdHMpOw0KCQkJCWVjaG8gJzwvcHJlPic7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBUT0RPOiBIYW5kbGUgZXJyb3INCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCn0NCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/mysql.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogU3RvcmVzIHRoZSBteXNxbCBkYXRhYmFzZSBtZXRob2RzDQogKiBAcGFja2FnZSBiYXNlDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgbXlzcWwgZGF0YWJhc2UgdXNpbmcgYSBzdGFuZGFyZCBkYXRhYmFzZSBjbGFzcw0KICogQHBhY2thZ2UgYmFzZQ0KICovDQpjbGFzcyBsYXN0Zm1BcGlEYXRhYmFzZSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBob3N0IG5hbWUNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJGhvc3Q7DQoJLyoqDQoJICogU3RvcmVzIHRoZSB1c2VybmFtZQ0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkZGJVc2VyOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgcGFzc3dvcmQNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJGRiUGFzczsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGRhdGFiYXNlIG5hbWUNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJGRiTmFtZTsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGNvbm5lY3Rpb24gc3RhdHVzDQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHVibGljICRkYkNvbm47DQoJLyoqDQoJICogU3RvcmVzIHRoZSBlcnJvciBkZXRhaWxzDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkZXJyb3I7DQoJDQoJLyoqDQoJICogUnVuIHdoZW4gdGhlIGNsYXNzIGlzIGNyZWF0ZWQuIFNldHMgdXAgdGhlIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgRGF0YWJhc2UgaG9zdCBhZGRyZXNzDQoJICogQHBhcmFtIHN0cmluZyAkZGJVc2VyIERhdGFiYXNlIHVzZXJuYW1lDQoJICogQHBhcmFtIHN0cmluZyAkZGJQYXNzIERhdGFiYXNlIHBhc3N3b3JkDQoJICogQHBhcmFtIHN0cmluZyAkZGJOYW1lIERhdGFiYXNlIG5hbWUNCgkgKiBAcmV0dXJuIHZvaWQNCgkgKi8NCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCwkZGJVc2VyLCRkYlBhc3MsJGRiTmFtZSkgew0KCQkkdGhpcy0+aG9zdCA9ICRob3N0Ow0KCQkkdGhpcy0+ZGJVc2VyID0gJGRiVXNlcjsNCgkJJHRoaXMtPmRiUGFzcyA9ICRkYlBhc3M7DQoJCSR0aGlzLT5kYk5hbWUgPSAkZGJOYW1lOw0KCQkNCgkJJHRoaXMtPmNvbm5lY3RUb0RiKCk7DQoJfQ0KCQ0KCS8qKg0KCSAqIEludGVybmFsIGNvbW1hbmQgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UNCgkgKiBAcmV0dXJuIHZvaWQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIGNvbm5lY3RUb0RiICgpIHsNCgkJaWYgKCEkdGhpcy0+ZGJDb25uID0gQG15c3FsX2Nvbm5lY3QoJHRoaXMtPmhvc3QsICR0aGlzLT5kYlVzZXIsICR0aGlzLT5kYlBhc3MpKSB7DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoKTsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQllbHNlIGlmICggIUBteXNxbF9zZWxlY3RfZGIoJHRoaXMtPmRiTmFtZSwgJHRoaXMtPmRiQ29ubikgKSB7DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoKTsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBjb21tYW5kIHRvIGhhbmRsZSBlcnJvcnMgYW5kIHBvcHVsYXRlIHRoZSBlcnJvciB2YXJpYWJsZQ0KCSAqIEByZXR1cm4gdm9pZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gaGFuZGxlRXJyb3IgKCkgew0KCQkkdGhpcy0+ZXJyb3IgPSBteXNxbF9lcnJvcigkdGhpcy0+ZGJDb25uKTsNCgl9DQoJDQoJLyoqDQoJICogQ29tbWFuZCB3aGljaCBydW5zIHF1ZXJpZXMuIFJldHVybnMgYSBjbGFzcyBvbiBzdWNjZXNzIGFuZCBmbGFzZSBvbiBlcnJvcg0KCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCBUaGUgU1FMIHF1ZXJ5IHRvIHJ1bg0KCSAqIEByZXR1cm4gY2xhc3MNCgkgKiBAdXNlcyBsYXN0Zm1BcGlEYXRhYmFzZV9yZXN1bHQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gcXVlcnkoJHNxbCkgew0KCQlpZiAoICEkcXVlcnlSZXNvdXJjZSA9IG15c3FsX3F1ZXJ5KCRzcWwsICR0aGlzLT5kYkNvbm4pICkgew0KCQkJZWNobyBteXNxbF9lcnJvcigpOw0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKCk7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZWxzZSB7DQoJCQkkcmV0dXJuID0gbmV3IGxhc3RmbUFwaURhdGFiYXNlX3Jlc3VsdCgkdGhpcywgJHF1ZXJ5UmVzb3VyY2UpOw0KCQkJcmV0dXJuICRyZXR1cm47DQoJCX0NCgl9DQp9DQoNCi8qKg0KICogQSBjbGFzcyB3aGljaCBhbGxvd3MgaW50ZXJhY3Rpb24gd2l0aCByZXN1bHRzIHdoZW4gYSBxdWVyeSBpcyBydW4gYnkgbGFzdGZtQXBpRGF0YWJhc2UNCiAqIEBwYWNrYWdlIGJhc2UNCiAqLw0KY2xhc3MgbGFzdGZtQXBpRGF0YWJhc2VfcmVzdWx0IHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIG15c3FsIGNsYXNzDQoJICogQHZhciBjbGFzcw0KCSAqLw0KCXZhciAkbXlzcWw7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBxdWVyeQ0KCSAqIEB2YXIgY2xhc3MNCgkgKi8NCgl2YXIgJHF1ZXJ5Ow0KCQ0KCS8qKg0KCSAqIFJ1biB3aGVuIHRoZSBjbGFzcyBpcyBjcmVhdGVkLiBTZXRzIHVwIHRoZSB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gY2xhc3MgJG15c3FsIFRoZSBteXNxbCBjbGFzcw0KCSAqIEBwYXJhbSBjbGFzcyAkcXVlcnkgVGhlIHF1ZXJ5DQoJICogQHJldHVybiB2b2lkDQoJICovDQoJZnVuY3Rpb24gbGFzdGZtQXBpRGF0YWJhc2VfcmVzdWx0KCYkbXlzcWwsJHF1ZXJ5KSB7DQoJCSR0aGlzLT5teXNxbCA9ICYkbXlzcWw7DQoJCSR0aGlzLT5xdWVyeSA9ICRxdWVyeTsNCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyB0aGUgbmV4dCByZXN1bHQNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGZldGNoICgpIHsNCgkJaWYgKCAkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHRoaXMtPnF1ZXJ5KSApIHsNCgkJCXJldHVybiAkcm93Ow0KCQl9DQoJCWVsc2UgaWYgKCAkdGhpcy0+c2l6ZSgpID4gMCApIHsNCgkJCW15c3FsX2RhdGFfc2VlaygkdGhpcy0+cXVlcnksMCk7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyBhbGwgdGhlIHJlc3VsdHMNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJZnVuY3Rpb24gZmV0Y2hBbGwoKSB7DQoJCSRyZXN1bHQgPSBhcnJheSgpOw0KCQl3aGlsZSAoICRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkdGhpcy0+cXVlcnkpICkgew0KCQkJJHJlc3VsdFtdID0kcm93Ow0KCQl9DQoJCXJldHVybiAkcmVzdWx0Ow0KCX0NCgkNCgkvKioNCgkgKiBTaG93cyB0aGUgbnVtYmVyIG9mIHJlc3VsdHMNCgkgKiBAcmV0dXJuIGludGVnZXINCgkgKi8NCglmdW5jdGlvbiBzaXplICgpIHsNCgkJcmV0dXJuIG15c3FsX251bV9yb3dzKCR0aGlzLT5xdWVyeSk7DQoJfQ0KfQ0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/socket.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogU3RvcmVzIHRoZSBzb2NrZXQgbWV0aG9kcw0KICogQHBhY2thZ2UgYmFzZQ0KICovDQovKioNCiAqIEFsbG93cyBhY2Nlc3MgdG8gdGhlIHNvY2tldCBtZXRob2RzIHVzaW5nIGEgc3RhbmRhcmQgY2xhc3MNCiAqIEBwYWNrYWdlIGJhc2UNCiAqLw0KY2xhc3MgbGFzdGZtQXBpU29ja2V0IHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIHNvY2tldCBoYW5kbGVyDQoJICogQHZhciBjbGFzcw0KCSAqLw0KCXByaXZhdGUgJGhhbmRsZTsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGhvc3QgbmFtZQ0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkaG9zdDsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIHBvcnQgbnVtYmVyDQoJICogQHZhciBpbnRlZ2VyDQoJICovDQoJcHJpdmF0ZSAkcG9ydDsNCgkNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGVycm9yIHN0cmluZw0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHVibGljICRlcnJvcl9zdHJpbmc7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBlcnJvciBudW1iZXINCgkgKiBAdmFyIGludGVnZXINCgkgKi8NCglwdWJsaWMgJGVycm9yX251bWJlcjsNCgkNCgkvKioNCgkgKiBSdW4gd2hlbiB0aGUgY2xhc3MgaXMgY3JlYXRlZC4gU2V0cyB0aGUgdmFyaWFibGVzDQoJICogQHBhcmFtIHN0cmluZyAkaG9zdCBUaGUgaG9zdCBuYW1lDQoJICogQHBhcmFtIGludGVnZXIgJHBvcnQgVGhlIHBvcnQgbnVtYmVyDQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJZnVuY3Rpb24gbGFzdGZtQXBpU29ja2V0ICgkaG9zdCwgJHBvcnQpIHsNCgkJLy8gU2V0IGNsYXNzIHZhcmlhYmxlcw0KCQkkdGhpcy0+aG9zdCA9ICRob3N0Ow0KCQkkdGhpcy0+cG9ydCA9ICRwb3J0Ow0KCQkNCgkJLy8gT3BlbiBhIGNvbm5lY3Rpb24gaW4gdGhlIGNsYXNzIHZhcmlhYmxlDQoJCSR0aGlzLT5oYW5kbGUgPSBmc29ja29wZW4oJHRoaXMtPmhvc3QsICR0aGlzLT5wb3J0LCAkdGhpcy0+ZXJyb3JfbnVtYmVyLCAkdGhpcy0+ZXJyb3Jfc3RyaW5nKTsNCgkJaWYgKCAkdGhpcy0+aGFuZGxlICkgew0KCQkJcmV0dXJuIFRSVUU7DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBJZiBmYWlsZWQgcmV0dXJuIGZhbHNlDQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogU2VuZCBkYXRhIHRocm91Z2ggdGhlIHNvY2tldCBhbmQgbGlzdGVuIGZvciBhIHJldHVybg0KCSAqIEBwYXJhbSBzdHJpbmcgJG1zZyBEYXRhIHRvIHNlbmQNCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlIFRoZSB0eXBlIG9mIGRhdGEgdG8gcmV0dXJuIChhcnJheSBvciBzdHJpbmcpDQoJICogQHJldHVybiBzdHJpbmd8YXJyYXkNCgkgKi8NCglmdW5jdGlvbiBzZW5kICgkbXNnLCAkdHlwZSA9ICcnKSB7DQoJCS8vIFNlbmQgbWVzc2FnZSBvdmVyIGNvbm5lY3Rpb24NCgkJZndyaXRlKCR0aGlzLT5oYW5kbGUsICRtc2cpOw0KCQkNCgkJLy8gQ2hlY2sgd2hhdCB0eXBlIGlzIHJlcXVpcmVkDQoJCWlmICggJHR5cGUgPT0gJ2FycmF5JyApIHsNCgkJCS8vIElmIGFycmF5IGxvb3AgYW5kIGNyZWF0ZSBhcnJheQ0KCQkJJHJlc3BvbnNlID0gYXJyYXkoKTsNCgkJCSRsaW5lX251bSA9IDA7DQoJCQl3aGlsZSAoICFmZW9mKCR0aGlzLT5oYW5kbGUpICkgew0KCSAgICAgICAJCQkkcmVzcG9uc2VbJGxpbmVfbnVtXSA9IGZnZXRzKCR0aGlzLT5oYW5kbGUsIDQwOTYpOw0KCQkJCSRsaW5lX251bSsrOw0KCSAgIAkJfQ0KCQkJLy8gUmV0dXJuIHJlc3BvbnNlIGFzIGFycmF5DQoJCQlyZXR1cm4gJHJlc3BvbnNlOw0KCQl9DQoJCWVsc2VpZiAoICR0eXBlID09ICdzdHJpbmcnICkgew0KCQkJLy8gSWYgc3RyaW5nLCBsb29wIGFuZCBjcmVhdGUgc3RyaW5nDQoJCQkkcmVzcG9uc2UgPSAnJzsNCgkgICAJCXdoaWxlICggIWZlb2YoJHRoaXMtPmhhbmRsZSkgKSB7DQoJICAgICAgIAkJCSRyZXNwb25zZSAuPSBmZ2V0cygkdGhpcy0+aGFuZGxlLCA0MDk2KTsNCgkgICAJCX0NCgkJCS8vIFJldHVybiByZXNwb25zZSBhcyBzdHJpbmcNCgkJCXJldHVybiAkcmVzcG9uc2U7DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBJZiBhbnl0aGluZyBlbHNlLCByZXR1cm4gbm90aGluZyBidXQgYSBUUlVFDQoJCQlyZXR1cm4gVFJVRTsNCgkJfQ0KCQkNCgl9DQoJDQoJLyoqDQoJICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uDQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJZnVuY3Rpb24gY2xvc2UgKCkgew0KCQkvLyBDbG9zZSBjb25uZWN0aW9uDQoJCWZjbG9zZSgkdGhpcy0+aGFuZGxlKTsNCgkJcmV0dXJuIFRSVUU7DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/sqlite.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogU3RvcmVzIHRoZSBzcWxpdGUgZGF0YWJhc2UgbWV0aG9kcw0KICogQHBhY2thZ2UgYmFzZQ0KICovDQovKioNCiAqIEFsbG93cyBhY2Nlc3MgdG8gdGhlIHNxbGl0ZSBkYXRhYmFzZSB1c2luZyBhIHN0YW5kYXJkIGRhdGFiYXNlIGNsYXNzDQogKiBAcGFja2FnZSBiYXNlDQogKi8NCmNsYXNzIGxhc3RmbUFwaURhdGFiYXNlIHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIHBhdGggdG8gdGhlIGRhdGFiYXNlDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCgl2YXIgJHBhdGg7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25uZWN0aW9uIHN0YXR1cw0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyAkZGJDb25uOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgZXJyb3IgZGV0YWlscw0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwdWJsaWMgJGVycm9yOw0KCQ0KCS8qKg0KCSAqIFJ1biB3aGVuIHRoZSBjbGFzcyBpcyBjcmVhdGVkLiBTZXRzIHVwIHRoZSB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBwYXRoIHRvIHRoZSBkYXRhYmFzZQ0KCSAqIEByZXR1cm4gdm9pZA0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRwYXRoKSB7DQoJCSR0aGlzLT5wYXRoID0gJHBhdGg7DQoJCSR0aGlzLT5jb25uZWN0VG9EYigpOw0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBjb21tYW5kIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlDQoJICogQHJldHVybiB2b2lkDQoJICovDQoJZnVuY3Rpb24gY29ubmVjdFRvRGIgKCkgew0KCQlpZiAoISR0aGlzLT5kYkNvbm4gPSBAc3FsaXRlX29wZW4oJHRoaXMtPnBhdGgsIDA2NjYsICR0aGlzLT5lcnJvcikpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBNZXRob2Qgd2hpY2ggcnVucyBxdWVyaWVzLiBSZXR1cm5zIGEgY2xhc3Mgb24gc3VjY2VzcyBhbmQgZmFsc2Ugb24gZXJyb3INCgkgKiBAcGFyYW0gc3RyaW5nICRzcWwgVGhlIFNRTCBxdWVyeSB0byBydW4NCgkgKiBAcmV0dXJuIGNsYXNzDQoJICogQHVzZXMgbGFzdGZtQXBpRGF0YWJhc2VfcmVzdWx0DQoJICovDQoJZnVuY3Rpb24gJiBxdWVyeSgkc3FsKSB7DQoJCWlmICggISRxdWVyeVJlc291cmNlID0gc3FsaXRlX3F1ZXJ5KCR0aGlzLT5kYkNvbm4sICRzcWwsIFNRTElURV9CT1RILCAkdGhpcy0+ZXJyb3IpICkgew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWVsc2Ugew0KCQkJJHJldHVybiA9IG5ldyBsYXN0Zm1BcGlEYXRhYmFzZV9yZXN1bHQoJHRoaXMsICRxdWVyeVJlc291cmNlKTsNCgkJCXJldHVybiAkcmV0dXJuOw0KCQl9DQoJfQ0KfQ0KDQovKioNCiAqIEEgY2xhc3Mgd2hpY2ggYWxsb3dzIGludGVyYWN0aW9uIHdpdGggcmVzdWx0cyB3aGVuIGEgcXVlcnkgaXMgcnVuIGJ5IGxhc3RmbUFwaURhdGFiYXNlDQogKiBAcGFja2FnZSBiYXNlDQogKi8NCmNsYXNzIGxhc3RmbUFwaURhdGFiYXNlX3Jlc3VsdCB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBzcWxpdGUgY2xhc3MNCgkgKiBAdmFyIGNsYXNzDQoJICovDQoJdmFyICRzcWxpdGU7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBxdWVyeQ0KCSAqIEB2YXIgY2xhc3MNCgkgKi8NCgl2YXIgJHF1ZXJ5Ow0KCQ0KCS8qKg0KCSAqIFJ1biB3aGVuIHRoZSBjbGFzcyBpcyBjcmVhdGVkLiBTZXRzIHVwIHRoZSB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gY2xhc3MgJHNxbGl0ZSBUaGUgc3FsaXRlIGNsYXNzDQoJICogQHBhcmFtIGNsYXNzICRxdWVyeSBUaGUgcXVlcnkNCgkgKiBAcmV0dXJuIHZvaWQNCgkgKi8NCglmdW5jdGlvbiBsYXN0Zm1BcGlEYXRhYmFzZV9yZXN1bHQoJiRzcWxpdGUsICRxdWVyeSkgew0KCQkkdGhpcy0+c3FsaXRlID0gJiRzcWxpdGU7DQoJCSR0aGlzLT5xdWVyeSA9ICRxdWVyeTsNCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyB0aGUgbmV4dCByZXN1bHQNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJZnVuY3Rpb24gZmV0Y2ggKCkgew0KCQlpZiAoICRyb3cgPSBzcWxpdGVfZmV0Y2hfYXJyYXkoJHRoaXMtPnF1ZXJ5KSApIHsNCgkJCXJldHVybiAkcm93Ow0KCQl9DQoJCWVsc2UgaWYgKCAkdGhpcy0+c2l6ZSgpID4gMCApIHsNCgkJCXNxbGl0ZV9zZWVrKCR0aGlzLT5xdWVyeSwgMCk7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyBhbGwgdGhlIHJlc3VsdHMNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJZnVuY3Rpb24gZmV0Y2hBbGwoKSB7DQoJCSRyZXN1bHQgPSBhcnJheSgpOw0KCQl3aGlsZSAoICRyb3cgPSBzcWxpdGVfZmV0Y2hfYXJyYXkoJHRoaXMtPnF1ZXJ5KSApIHsNCgkJCSRyZXN1bHRbXSA9ICRyb3c7DQoJCX0NCgkJcmV0dXJuICRyZXN1bHQ7DQoJfQ0KCQ0KCS8qKg0KCSAqIFNob3dzIHRoZSBudW1iZXIgb2YgcmVzdWx0cw0KCSAqIEByZXR1cm4gaW50ZWdlcg0KCSAqLw0KCWZ1bmN0aW9uIHNpemUgKCkgew0KCQlyZXR1cm4gc3FsaXRlX251bV9yb3dzKCR0aGlzLT5xdWVyeSk7DQoJfQ0KfQ0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/OAuth.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KLyoNClRoZSBNSVQgTGljZW5zZQ0KDQpDb3B5cmlnaHQgKGMpIDIwMDcgQW5keSBTbWl0aA0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KDQpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQoNClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4NClRIRSBTT0ZUV0FSRS4NCiovDQoNCi8qIEdlbmVyaWMgZXhjZXB0aW9uIGNsYXNzDQogKi8NCmNsYXNzIE9BdXRoRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uDQp7DQoJLy8gcGFzcw0KfQ0KDQpjbGFzcyBPQXV0aENvbnN1bWVyDQp7DQoJcHVibGljICRrZXk7DQoJcHVibGljICRzZWNyZXQ7DQoNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgka2V5LCAkc2VjcmV0LCAkY2FsbGJhY2tfdXJsPU5VTEwpIHsNCgkJJHRoaXMtPmtleSA9ICRrZXk7DQoJCSR0aGlzLT5zZWNyZXQgPSAkc2VjcmV0Ow0KCQkkdGhpcy0+Y2FsbGJhY2tfdXJsID0gJGNhbGxiYWNrX3VybDsNCgl9DQoNCglmdW5jdGlvbiBfX3RvU3RyaW5nKCkgew0KCQlyZXR1cm4gIk9BdXRoQ29uc3VtZXJba2V5PSR0aGlzLT5rZXksc2VjcmV0PSR0aGlzLT5zZWNyZXRdIjsNCgl9DQp9DQoNCmNsYXNzIE9BdXRoVG9rZW4NCnsNCgkvLyBhY2Nlc3MgdG9rZW5zIGFuZCByZXF1ZXN0IHRva2Vucw0KCXB1YmxpYyAka2V5Ow0KCXB1YmxpYyAkc2VjcmV0Ow0KDQoJLyoqDQoJICoga2V5ID0gdGhlIHRva2VuDQoJICogc2VjcmV0ID0gdGhlIHRva2VuIHNlY3JldA0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRrZXksICRzZWNyZXQpIHsNCgkJJHRoaXMtPmtleSA9ICRrZXk7DQoJCSR0aGlzLT5zZWNyZXQgPSAkc2VjcmV0Ow0KCX0NCg0KCS8qKg0KCSAqIGdlbmVyYXRlcyB0aGUgYmFzaWMgc3RyaW5nIHNlcmlhbGl6YXRpb24gb2YgYSB0b2tlbiB0aGF0IGEgc2VydmVyDQoJICogd291bGQgcmVzcG9uZCB0byByZXF1ZXN0X3Rva2VuIGFuZCBhY2Nlc3NfdG9rZW4gY2FsbHMgd2l0aA0KCSAqLw0KCWZ1bmN0aW9uIHRvX3N0cmluZygpIHsNCgkJcmV0dXJuICJvYXV0aF90b2tlbj0iIC4NCgkJCQkJT0F1dGhVdGlsOjp1cmxlbmNvZGVfcmZjMzk4NigkdGhpcy0+a2V5KSAuDQoJCQkJCSImb2F1dGhfdG9rZW5fc2VjcmV0PSIgLg0KCQkJCQlPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCR0aGlzLT5zZWNyZXQpOw0KCX0NCg0KCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKSB7DQoJCXJldHVybiAkdGhpcy0+dG9fc3RyaW5nKCk7DQoJfQ0KfQ0KDQovKioNCiAqIEEgY2xhc3MgZm9yIGltcGxlbWVudGluZyBhIFNpZ25hdHVyZSBNZXRob2QNCiAqIFNlZSBzZWN0aW9uIDkgKCJTaWduaW5nIFJlcXVlc3RzIikgaW4gdGhlIHNwZWMNCiAqLw0KYWJzdHJhY3QgY2xhc3MgT0F1dGhTaWduYXR1cmVNZXRob2QNCnsNCgkvKioNCgkgKiBOZWVkcyB0byByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIFNpZ25hdHVyZSBNZXRob2QgKGllIEhNQUMtU0hBMSkNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRfbmFtZSgpOw0KDQoJLyoqDQoJICogQnVpbGQgdXAgdGhlIHNpZ25hdHVyZQ0KCSAqIE5PVEU6IFRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiBNVVNUIE5PVCBiZSB1cmxlbmNvZGVkLg0KCSAqIHRoZSBlbmNvZGluZyBpcyBoYW5kbGVkIGluIE9BdXRoUmVxdWVzdCB3aGVuIHRoZSBmaW5hbA0KCSAqIHJlcXVlc3QgaXMgc2VyaWFsaXplZA0KCSAqIEBwYXJhbSBPQXV0aFJlcXVlc3QgJHJlcXVlc3QNCgkgKiBAcGFyYW0gT0F1dGhDb25zdW1lciAkY29uc3VtZXINCgkgKiBAcGFyYW0gT0F1dGhUb2tlbiAkdG9rZW4NCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBidWlsZF9zaWduYXR1cmUoJHJlcXVlc3QsICRjb25zdW1lciwgJHRva2VuKTsNCg0KCS8qKg0KCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBzaWduYXR1cmUgaXMgY29ycmVjdA0KCSAqIEBwYXJhbSBPQXV0aFJlcXVlc3QgJHJlcXVlc3QNCgkgKiBAcGFyYW0gT0F1dGhDb25zdW1lciAkY29uc3VtZXINCgkgKiBAcGFyYW0gT0F1dGhUb2tlbiAkdG9rZW4NCgkgKiBAcGFyYW0gc3RyaW5nICRzaWduYXR1cmUNCgkgKiBAcmV0dXJuIGJvb2wNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gY2hlY2tfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbiwgJHNpZ25hdHVyZSkgew0KCQkkYnVpbHQgPSAkdGhpcy0+YnVpbGRfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbik7DQoJCXJldHVybiAkYnVpbHQgPT0gJHNpZ25hdHVyZTsNCgl9DQp9DQoNCi8qKg0KICogVGhlIEhNQUMtU0hBMSBzaWduYXR1cmUgbWV0aG9kIHVzZXMgdGhlIEhNQUMtU0hBMSBzaWduYXR1cmUgYWxnb3JpdGhtIGFzIGRlZmluZWQgaW4gW1JGQzIxMDRdDQogKiB3aGVyZSB0aGUgU2lnbmF0dXJlIEJhc2UgU3RyaW5nIGlzIHRoZSB0ZXh0IGFuZCB0aGUga2V5IGlzIHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIChlYWNoIGZpcnN0DQogKiBlbmNvZGVkIHBlciBQYXJhbWV0ZXIgRW5jb2RpbmcpIG9mIHRoZSBDb25zdW1lciBTZWNyZXQgYW5kIFRva2VuIFNlY3JldCwgc2VwYXJhdGVkIGJ5IGFuICcmJw0KICogY2hhcmFjdGVyIChBU0NJSSBjb2RlIDM4KSBldmVuIGlmIGVtcHR5Lg0KICogICAtIENoYXB0ZXIgOS4yICgiSE1BQy1TSEExIikNCiAqLw0KY2xhc3MgT0F1dGhTaWduYXR1cmVNZXRob2RfSE1BQ19TSEExIGV4dGVuZHMgT0F1dGhTaWduYXR1cmVNZXRob2QNCnsNCglmdW5jdGlvbiBnZXRfbmFtZSgpIHsNCgkJcmV0dXJuICJITUFDLVNIQTEiOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBidWlsZF9zaWduYXR1cmUoJHJlcXVlc3QsICRjb25zdW1lciwgJHRva2VuKSB7DQoJCSRiYXNlX3N0cmluZyA9ICRyZXF1ZXN0LT5nZXRfc2lnbmF0dXJlX2Jhc2Vfc3RyaW5nKCk7DQoJCSRyZXF1ZXN0LT5iYXNlX3N0cmluZyA9ICRiYXNlX3N0cmluZzsNCg0KCQkka2V5X3BhcnRzID0gYXJyYXkoDQoJCQkkY29uc3VtZXItPnNlY3JldCwNCgkJCSgkdG9rZW4pID8gJHRva2VuLT5zZWNyZXQgOiAiIg0KCQkpOw0KDQoJCSRrZXlfcGFydHMgPSBPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCRrZXlfcGFydHMpOw0KCQkka2V5ID0gaW1wbG9kZSgnJicsICRrZXlfcGFydHMpOw0KDQoJCXJldHVybiBiYXNlNjRfZW5jb2RlKGhhc2hfaG1hYygnc2hhMScsICRiYXNlX3N0cmluZywgJGtleSwgdHJ1ZSkpOw0KCX0NCn0NCg0KLyoqDQogKiBUaGUgUExBSU5URVhUIG1ldGhvZCBkb2VzIG5vdCBwcm92aWRlIGFueSBzZWN1cml0eSBwcm90ZWN0aW9uIGFuZCBTSE9VTEQgb25seSBiZSB1c2VkDQogKiBvdmVyIGEgc2VjdXJlIGNoYW5uZWwgc3VjaCBhcyBIVFRQUy4gSXQgZG9lcyBub3QgdXNlIHRoZSBTaWduYXR1cmUgQmFzZSBTdHJpbmcuDQogKiAgIC0gQ2hhcHRlciA5LjQgKCJQTEFJTlRFWFQiKQ0KICovDQpjbGFzcyBPQXV0aFNpZ25hdHVyZU1ldGhvZF9QTEFJTlRFWFQgZXh0ZW5kcyBPQXV0aFNpZ25hdHVyZU1ldGhvZA0Kew0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbmFtZSgpIHsNCgkJcmV0dXJuICJQTEFJTlRFWFQiOw0KCX0NCg0KCS8qKg0KCSAqIG9hdXRoX3NpZ25hdHVyZSBpcyBzZXQgdG8gdGhlIGNvbmNhdGVuYXRlZCBlbmNvZGVkIHZhbHVlcyBvZiB0aGUgQ29uc3VtZXIgU2VjcmV0IGFuZA0KCSAqIFRva2VuIFNlY3JldCwgc2VwYXJhdGVkIGJ5IGEgJyYnIGNoYXJhY3RlciAoQVNDSUkgY29kZSAzOCksIGV2ZW4gaWYgZWl0aGVyIHNlY3JldCBpcw0KCSAqIGVtcHR5LiBUaGUgcmVzdWx0IE1VU1QgYmUgZW5jb2RlZCBhZ2Fpbi4NCgkgKiAgIC0gQ2hhcHRlciA5LjQuMSAoIkdlbmVyYXRpbmcgU2lnbmF0dXJlcyIpDQoJICoNCgkgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzZWNvbmQgZW5jb2RpbmcgTVVTVCBOT1QgaGFwcGVuIGluIHRoZSBTaWduYXR1cmVNZXRob2QsIGFzDQoJICogT0F1dGhSZXF1ZXN0IGhhbmRsZXMgdGhpcyENCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gYnVpbGRfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbikgew0KCQkka2V5X3BhcnRzID0gYXJyYXkoDQoJCQkkY29uc3VtZXItPnNlY3JldCwNCgkJCSgkdG9rZW4pID8gJHRva2VuLT5zZWNyZXQgOiAiIg0KCQkpOw0KDQoJCSRrZXlfcGFydHMgPSBPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCRrZXlfcGFydHMpOw0KCQkka2V5ID0gaW1wbG9kZSgnJicsICRrZXlfcGFydHMpOw0KCQkkcmVxdWVzdC0+YmFzZV9zdHJpbmcgPSAka2V5Ow0KDQoJCXJldHVybiAka2V5Ow0KCX0NCn0NCg0KLyoqDQogKiBUaGUgUlNBLVNIQTEgc2lnbmF0dXJlIG1ldGhvZCB1c2VzIHRoZSBSU0FTU0EtUEtDUzEtdjFfNSBzaWduYXR1cmUgYWxnb3JpdGhtIGFzIGRlZmluZWQgaW4NCiAqIFtSRkMzNDQ3XSBzZWN0aW9uIDguMiAobW9yZSBzaW1wbHkga25vd24gYXMgUEtDUyMxKSwgdXNpbmcgU0hBLTEgYXMgdGhlIGhhc2ggZnVuY3Rpb24gZm9yDQogKiBFTVNBLVBLQ1MxLXYxXzUuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgQ29uc3VtZXIgaGFzIHByb3ZpZGVkIGl0cyBSU0EgcHVibGljIGtleSBpbiBhDQogKiB2ZXJpZmllZCB3YXkgdG8gdGhlIFNlcnZpY2UgUHJvdmlkZXIsIGluIGEgbWFubmVyIHdoaWNoIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcw0KICogc3BlY2lmaWNhdGlvbi4NCiAqICAgLSBDaGFwdGVyIDkuMyAoIlJTQS1TSEExIikNCiAqLw0KYWJzdHJhY3QgY2xhc3MgT0F1dGhTaWduYXR1cmVNZXRob2RfUlNBX1NIQTEgZXh0ZW5kcyBPQXV0aFNpZ25hdHVyZU1ldGhvZA0Kew0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbmFtZSgpIHsNCgkJcmV0dXJuICJSU0EtU0hBMSI7DQoJfQ0KDQoJLy8gVXAgdG8gdGhlIFNQIHRvIGltcGxlbWVudCB0aGlzIGxvb2t1cCBvZiBrZXlzLiBQb3NzaWJsZSBpZGVhcyBhcmU6DQoJLy8gKDEpIGRvIGEgbG9va3VwIGluIGEgdGFibGUgb2YgdHJ1c3RlZCBjZXJ0cyBrZXllZCBvZmYgb2YgY29uc3VtZXINCgkvLyAoMikgZmV0Y2ggdmlhIGh0dHAgdXNpbmcgYSB1cmwgcHJvdmlkZWQgYnkgdGhlIHJlcXVlc3Rlcg0KCS8vICgzKSBzb21lIHNvcnQgb2Ygc3BlY2lmaWMgZGlzY292ZXJ5IGNvZGUgYmFzZWQgb24gcmVxdWVzdA0KCS8vDQoJLy8gRWl0aGVyIHdheSBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0ZQ0KCXByb3RlY3RlZCBhYnN0cmFjdCBmdW5jdGlvbiBmZXRjaF9wdWJsaWNfY2VydCgmJHJlcXVlc3QpOw0KDQoJLy8gVXAgdG8gdGhlIFNQIHRvIGltcGxlbWVudCB0aGlzIGxvb2t1cCBvZiBrZXlzLiBQb3NzaWJsZSBpZGVhcyBhcmU6DQoJLy8gKDEpIGRvIGEgbG9va3VwIGluIGEgdGFibGUgb2YgdHJ1c3RlZCBjZXJ0cyBrZXllZCBvZmYgb2YgY29uc3VtZXINCgkvLw0KCS8vIEVpdGhlciB3YXkgc2hvdWxkIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2VydGlmaWNhdGUNCglwcm90ZWN0ZWQgYWJzdHJhY3QgZnVuY3Rpb24gZmV0Y2hfcHJpdmF0ZV9jZXJ0KCYkcmVxdWVzdCk7DQoNCglwdWJsaWMgZnVuY3Rpb24gYnVpbGRfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbikgew0KCQkkYmFzZV9zdHJpbmcgPSAkcmVxdWVzdC0+Z2V0X3NpZ25hdHVyZV9iYXNlX3N0cmluZygpOw0KCQkkcmVxdWVzdC0+YmFzZV9zdHJpbmcgPSAkYmFzZV9zdHJpbmc7DQoNCgkJLy8gRmV0Y2ggdGhlIHByaXZhdGUga2V5IGNlcnQgYmFzZWQgb24gdGhlIHJlcXVlc3QNCgkJJGNlcnQgPSAkdGhpcy0+ZmV0Y2hfcHJpdmF0ZV9jZXJ0KCRyZXF1ZXN0KTsNCg0KCQkvLyBQdWxsIHRoZSBwcml2YXRlIGtleSBJRCBmcm9tIHRoZSBjZXJ0aWZpY2F0ZQ0KCQkkcHJpdmF0ZWtleWlkID0gb3BlbnNzbF9nZXRfcHJpdmF0ZWtleSgkY2VydCk7DQoNCgkJLy8gU2lnbiB1c2luZyB0aGUga2V5DQoJCSRvayA9IG9wZW5zc2xfc2lnbigkYmFzZV9zdHJpbmcsICRzaWduYXR1cmUsICRwcml2YXRla2V5aWQpOw0KDQoJCS8vIFJlbGVhc2UgdGhlIGtleSByZXNvdXJjZQ0KCQlvcGVuc3NsX2ZyZWVfa2V5KCRwcml2YXRla2V5aWQpOw0KDQoJCXJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBjaGVja19zaWduYXR1cmUoJHJlcXVlc3QsICRjb25zdW1lciwgJHRva2VuLCAkc2lnbmF0dXJlKSB7DQoJCSRkZWNvZGVkX3NpZyA9IGJhc2U2NF9kZWNvZGUoJHNpZ25hdHVyZSk7DQoNCgkJJGJhc2Vfc3RyaW5nID0gJHJlcXVlc3QtPmdldF9zaWduYXR1cmVfYmFzZV9zdHJpbmcoKTsNCg0KCQkvLyBGZXRjaCB0aGUgcHVibGljIGtleSBjZXJ0IGJhc2VkIG9uIHRoZSByZXF1ZXN0DQoJCSRjZXJ0ID0gJHRoaXMtPmZldGNoX3B1YmxpY19jZXJ0KCRyZXF1ZXN0KTsNCg0KCQkvLyBQdWxsIHRoZSBwdWJsaWMga2V5IElEIGZyb20gdGhlIGNlcnRpZmljYXRlDQoJCSRwdWJsaWNrZXlpZCA9IG9wZW5zc2xfZ2V0X3B1YmxpY2tleSgkY2VydCk7DQoNCgkJLy8gQ2hlY2sgdGhlIGNvbXB1dGVkIHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSBvbmUgcGFzc2VkIGluIHRoZSBxdWVyeQ0KCQkkb2sgPSBvcGVuc3NsX3ZlcmlmeSgkYmFzZV9zdHJpbmcsICRkZWNvZGVkX3NpZywgJHB1YmxpY2tleWlkKTsNCg0KCQkvLyBSZWxlYXNlIHRoZSBrZXkgcmVzb3VyY2UNCgkJb3BlbnNzbF9mcmVlX2tleSgkcHVibGlja2V5aWQpOw0KDQoJCXJldHVybiAkb2sgPT0gMTsNCgl9DQp9DQoNCmNsYXNzIE9BdXRoUmVxdWVzdA0Kew0KCXByb3RlY3RlZCAkcGFyYW1ldGVyczsNCglwcm90ZWN0ZWQgJGh0dHBfbWV0aG9kOw0KCXByb3RlY3RlZCAkaHR0cF91cmw7DQoJLy8gZm9yIGRlYnVnIHB1cnBvc2VzDQoJcHVibGljICRiYXNlX3N0cmluZzsNCglwdWJsaWMgc3RhdGljICR2ZXJzaW9uID0gJzEuMCc7DQoJcHVibGljIHN0YXRpYyAkUE9TVF9JTlBVVCA9ICdwaHA6Ly9pbnB1dCc7DQoNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaHR0cF9tZXRob2QsICRodHRwX3VybCwgJHBhcmFtZXRlcnM9TlVMTCkgew0KCQkkcGFyYW1ldGVycyA9ICgkcGFyYW1ldGVycykgPyAkcGFyYW1ldGVycyA6IGFycmF5KCk7DQoJCSRwYXJhbWV0ZXJzID0gYXJyYXlfbWVyZ2UoIE9BdXRoVXRpbDo6cGFyc2VfcGFyYW1ldGVycyhwYXJzZV91cmwoJGh0dHBfdXJsLCBQSFBfVVJMX1FVRVJZKSksICRwYXJhbWV0ZXJzKTsNCgkJJHRoaXMtPnBhcmFtZXRlcnMgPSAkcGFyYW1ldGVyczsNCgkJJHRoaXMtPmh0dHBfbWV0aG9kID0gJGh0dHBfbWV0aG9kOw0KCQkkdGhpcy0+aHR0cF91cmwgPSAkaHR0cF91cmw7DQoJfQ0KDQoNCgkvKioNCgkgKiBhdHRlbXB0IHRvIGJ1aWxkIHVwIGEgcmVxdWVzdCBmcm9tIHdoYXQgd2FzIHBhc3NlZCB0byB0aGUgc2VydmVyDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tX3JlcXVlc3QoJGh0dHBfbWV0aG9kPU5VTEwsICRodHRwX3VybD1OVUxMLCAkcGFyYW1ldGVycz1OVUxMKSB7DQoJCSRzY2hlbWUgPSAoIWlzc2V0KCRfU0VSVkVSWydIVFRQUyddKSB8fCAkX1NFUlZFUlsnSFRUUFMnXSAhPSAib24iKQ0KCQkJCQkJCT8gJ2h0dHAnDQoJCQkJCQkJOiAnaHR0cHMnOw0KCQkkaHR0cF91cmwgPSAoJGh0dHBfdXJsKSA/ICRodHRwX3VybCA6ICRzY2hlbWUgLg0KCQkJCQkJCQkJCQkJCQkJJzovLycgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLg0KCQkJCQkJCQkJCQkJCQkJJzonIC4NCgkJCQkJCQkJCQkJCQkJCSRfU0VSVkVSWydTRVJWRVJfUE9SVCddIC4NCgkJCQkJCQkJCQkJCQkJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddOw0KCQkkaHR0cF9tZXRob2QgPSAoJGh0dHBfbWV0aG9kKSA/ICRodHRwX21ldGhvZCA6ICRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddOw0KDQoJCS8vIFdlIHdlcmVuJ3QgaGFuZGVkIGFueSBwYXJhbWV0ZXJzLCBzbyBsZXQncyBmaW5kIHRoZSBvbmVzIHJlbGV2YW50IHRvDQoJCS8vIHRoaXMgcmVxdWVzdC4NCgkJLy8gSWYgeW91IHJ1biBYTUwtUlBDIG9yIHNpbWlsYXIgeW91IHNob3VsZCB1c2UgdGhpcyB0byBwcm92aWRlIHlvdXIgb3duDQoJCS8vIHBhcnNlZCBwYXJhbWV0ZXItbGlzdA0KCQlpZiAoISRwYXJhbWV0ZXJzKSB7DQoJCQkvLyBGaW5kIHJlcXVlc3QgaGVhZGVycw0KCQkJJHJlcXVlc3RfaGVhZGVycyA9IE9BdXRoVXRpbDo6Z2V0X2hlYWRlcnMoKTsNCg0KCQkJLy8gUGFyc2UgdGhlIHF1ZXJ5LXN0cmluZyB0byBmaW5kIEdFVCBwYXJhbWV0ZXJzDQoJCQkkcGFyYW1ldGVycyA9IE9BdXRoVXRpbDo6cGFyc2VfcGFyYW1ldGVycygkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10pOw0KDQoJCQkvLyBJdCdzIGEgUE9TVCByZXF1ZXN0IG9mIHRoZSBwcm9wZXIgY29udGVudC10eXBlLCBzbyBwYXJzZSBQT1NUDQoJCQkvLyBwYXJhbWV0ZXJzIGFuZCBhZGQgdGhvc2Ugb3ZlcnJpZGluZyBhbnkgZHVwbGljYXRlcyBmcm9tIEdFVA0KCQkJaWYgKCRodHRwX21ldGhvZCA9PSAiUE9TVCINCgkJCQkJJiYgIGlzc2V0KCRyZXF1ZXN0X2hlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKQ0KCQkJCQkmJiBzdHJzdHIoJHJlcXVlc3RfaGVhZGVyc1snQ29udGVudC1UeXBlJ10sDQoJCQkJCQkJCQkJJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpDQoJCQkJCSkgew0KCQkJCSRwb3N0X2RhdGEgPSBPQXV0aFV0aWw6OnBhcnNlX3BhcmFtZXRlcnMoDQoJCQkJCWZpbGVfZ2V0X2NvbnRlbnRzKHNlbGY6OiRQT1NUX0lOUFVUKQ0KCQkJCSk7DQoJCQkJJHBhcmFtZXRlcnMgPSBhcnJheV9tZXJnZSgkcGFyYW1ldGVycywgJHBvc3RfZGF0YSk7DQoJCQl9DQoNCgkJCS8vIFdlIGhhdmUgYSBBdXRob3JpemF0aW9uLWhlYWRlciB3aXRoIE9BdXRoIGRhdGEuIFBhcnNlIHRoZSBoZWFkZXINCgkJCS8vIGFuZCBhZGQgdGhvc2Ugb3ZlcnJpZGluZyBhbnkgZHVwbGljYXRlcyBmcm9tIEdFVCBvciBQT1NUDQoJCQlpZiAoaXNzZXQoJHJlcXVlc3RfaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKSAmJiBzdWJzdHIoJHJlcXVlc3RfaGVhZGVyc1snQXV0aG9yaXphdGlvbiddLCAwLCA2KSA9PSAnT0F1dGggJykgew0KCQkJCSRoZWFkZXJfcGFyYW1ldGVycyA9IE9BdXRoVXRpbDo6c3BsaXRfaGVhZGVyKA0KCQkJCQkkcmVxdWVzdF9oZWFkZXJzWydBdXRob3JpemF0aW9uJ10NCgkJCQkpOw0KCQkJCSRwYXJhbWV0ZXJzID0gYXJyYXlfbWVyZ2UoJHBhcmFtZXRlcnMsICRoZWFkZXJfcGFyYW1ldGVycyk7DQoJCQl9DQoNCgkJfQ0KDQoJCXJldHVybiBuZXcgT0F1dGhSZXF1ZXN0KCRodHRwX21ldGhvZCwgJGh0dHBfdXJsLCAkcGFyYW1ldGVycyk7DQoJfQ0KDQoJLyoqDQoJICogcHJldHR5IG11Y2ggYSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHVwIHRoZSByZXF1ZXN0DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tX2NvbnN1bWVyX2FuZF90b2tlbigkY29uc3VtZXIsICR0b2tlbiwgJGh0dHBfbWV0aG9kLCAkaHR0cF91cmwsICRwYXJhbWV0ZXJzPU5VTEwpIHsNCgkJJHBhcmFtZXRlcnMgPSAoJHBhcmFtZXRlcnMpID8gICRwYXJhbWV0ZXJzIDogYXJyYXkoKTsNCgkJJGRlZmF1bHRzID0gYXJyYXkoIm9hdXRoX3ZlcnNpb24iID0+IE9BdXRoUmVxdWVzdDo6JHZlcnNpb24sDQoJCQkJCQkJCQkJCSJvYXV0aF9ub25jZSIgPT4gT0F1dGhSZXF1ZXN0OjpnZW5lcmF0ZV9ub25jZSgpLA0KCQkJCQkJCQkJCQkib2F1dGhfdGltZXN0YW1wIiA9PiBPQXV0aFJlcXVlc3Q6OmdlbmVyYXRlX3RpbWVzdGFtcCgpLA0KCQkJCQkJCQkJCQkib2F1dGhfY29uc3VtZXJfa2V5IiA9PiAkY29uc3VtZXItPmtleSk7DQoJCWlmICgkdG9rZW4pDQoJCQkkZGVmYXVsdHNbJ29hdXRoX3Rva2VuJ10gPSAkdG9rZW4tPmtleTsNCg0KCQkkcGFyYW1ldGVycyA9IGFycmF5X21lcmdlKCRkZWZhdWx0cywgJHBhcmFtZXRlcnMpOw0KDQoJCXJldHVybiBuZXcgT0F1dGhSZXF1ZXN0KCRodHRwX21ldGhvZCwgJGh0dHBfdXJsLCAkcGFyYW1ldGVycyk7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIHNldF9wYXJhbWV0ZXIoJG5hbWUsICR2YWx1ZSwgJGFsbG93X2R1cGxpY2F0ZXMgPSB0cnVlKSB7DQoJCWlmICgkYWxsb3dfZHVwbGljYXRlcyAmJiBpc3NldCgkdGhpcy0+cGFyYW1ldGVyc1skbmFtZV0pKSB7DQoJCQkvLyBXZSBoYXZlIGFscmVhZHkgYWRkZWQgcGFyYW1ldGVyKHMpIHdpdGggdGhpcyBuYW1lLCBzbyBhZGQgdG8gdGhlIGxpc3QNCgkJCWlmIChpc19zY2FsYXIoJHRoaXMtPnBhcmFtZXRlcnNbJG5hbWVdKSkgew0KCQkJCS8vIFRoaXMgaXMgdGhlIGZpcnN0IGR1cGxpY2F0ZSwgc28gdHJhbnNmb3JtIHNjYWxhciAoc3RyaW5nKQ0KCQkJCS8vIGludG8gYW4gYXJyYXkgc28gd2UgY2FuIGFkZCB0aGUgZHVwbGljYXRlcw0KCQkJCSR0aGlzLT5wYXJhbWV0ZXJzWyRuYW1lXSA9IGFycmF5KCR0aGlzLT5wYXJhbWV0ZXJzWyRuYW1lXSk7DQoJCQl9DQoNCgkJCSR0aGlzLT5wYXJhbWV0ZXJzWyRuYW1lXVtdID0gJHZhbHVlOw0KCQl9IGVsc2Ugew0KCQkJJHRoaXMtPnBhcmFtZXRlcnNbJG5hbWVdID0gJHZhbHVlOw0KCQl9DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGdldF9wYXJhbWV0ZXIoJG5hbWUpIHsNCgkJcmV0dXJuIGlzc2V0KCR0aGlzLT5wYXJhbWV0ZXJzWyRuYW1lXSkgPyAkdGhpcy0+cGFyYW1ldGVyc1skbmFtZV0gOiBudWxsOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcGFyYW1ldGVycygpIHsNCgkJcmV0dXJuICR0aGlzLT5wYXJhbWV0ZXJzOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiB1bnNldF9wYXJhbWV0ZXIoJG5hbWUpIHsNCgkJdW5zZXQoJHRoaXMtPnBhcmFtZXRlcnNbJG5hbWVdKTsNCgl9DQoNCgkvKioNCgkgKiBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzLCBzb3J0ZWQgYW5kIGNvbmNhdGVuYXRlZCBpbnRvIGEgbm9ybWFsaXplZCBzdHJpbmcuDQoJICogQHJldHVybiBzdHJpbmcNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3NpZ25hYmxlX3BhcmFtZXRlcnMoKSB7DQoJCS8vIEdyYWIgYWxsIHBhcmFtZXRlcnMNCgkJJHBhcmFtcyA9ICR0aGlzLT5wYXJhbWV0ZXJzOw0KDQoJCS8vIFJlbW92ZSBvYXV0aF9zaWduYXR1cmUgaWYgcHJlc2VudA0KCQkvLyBSZWY6IFNwZWM6IDkuMS4xICgiVGhlIG9hdXRoX3NpZ25hdHVyZSBwYXJhbWV0ZXIgTVVTVCBiZSBleGNsdWRlZC4iKQ0KCQlpZiAoaXNzZXQoJHBhcmFtc1snb2F1dGhfc2lnbmF0dXJlJ10pKSB7DQoJCQl1bnNldCgkcGFyYW1zWydvYXV0aF9zaWduYXR1cmUnXSk7DQoJCX0NCg0KCQlyZXR1cm4gT0F1dGhVdGlsOjpidWlsZF9odHRwX3F1ZXJ5KCRwYXJhbXMpOw0KCX0NCg0KCS8qKg0KCSAqIFJldHVybnMgdGhlIGJhc2Ugc3RyaW5nIG9mIHRoaXMgcmVxdWVzdA0KCSAqDQoJICogVGhlIGJhc2Ugc3RyaW5nIGRlZmluZWQgYXMgdGhlIG1ldGhvZCwgdGhlIHVybA0KCSAqIGFuZCB0aGUgcGFyYW1ldGVycyAobm9ybWFsaXplZCksIGVhY2ggdXJsZW5jb2RlZA0KCSAqIGFuZCB0aGUgY29uY2F0ZWQgd2l0aCAmLg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfc2lnbmF0dXJlX2Jhc2Vfc3RyaW5nKCkgew0KCQkkcGFydHMgPSBhcnJheSgNCgkJCSR0aGlzLT5nZXRfbm9ybWFsaXplZF9odHRwX21ldGhvZCgpLA0KCQkJJHRoaXMtPmdldF9ub3JtYWxpemVkX2h0dHBfdXJsKCksDQoJCQkkdGhpcy0+Z2V0X3NpZ25hYmxlX3BhcmFtZXRlcnMoKQ0KCQkpOw0KDQoJCSRwYXJ0cyA9IE9BdXRoVXRpbDo6dXJsZW5jb2RlX3JmYzM5ODYoJHBhcnRzKTsNCg0KCQlyZXR1cm4gaW1wbG9kZSgnJicsICRwYXJ0cyk7DQoJfQ0KDQoJLyoqDQoJICoganVzdCB1cHBlcmNhc2VzIHRoZSBodHRwIG1ldGhvZA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbm9ybWFsaXplZF9odHRwX21ldGhvZCgpIHsNCgkJcmV0dXJuIHN0cnRvdXBwZXIoJHRoaXMtPmh0dHBfbWV0aG9kKTsNCgl9DQoNCgkvKioNCgkgKiBwYXJzZXMgdGhlIHVybCBhbmQgcmVidWlsZHMgaXQgdG8gYmUNCgkgKiBzY2hlbWU6Ly9ob3N0L3BhdGgNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0X25vcm1hbGl6ZWRfaHR0cF91cmwoKSB7DQoJCSRwYXJ0cyA9IHBhcnNlX3VybCgkdGhpcy0+aHR0cF91cmwpOw0KDQoJCSRzY2hlbWUgPSAoaXNzZXQoJHBhcnRzWydzY2hlbWUnXSkpID8gJHBhcnRzWydzY2hlbWUnXSA6ICdodHRwJzsNCgkJJHBvcnQgPSAoaXNzZXQoJHBhcnRzWydwb3J0J10pKSA/ICRwYXJ0c1sncG9ydCddIDogKCgkc2NoZW1lID09ICdodHRwcycpID8gJzQ0MycgOiAnODAnKTsNCgkJJGhvc3QgPSAoaXNzZXQoJHBhcnRzWydob3N0J10pKSA/ICRwYXJ0c1snaG9zdCddIDogJyc7DQoJCSRwYXRoID0gKGlzc2V0KCRwYXJ0c1sncGF0aCddKSkgPyAkcGFydHNbJ3BhdGgnXSA6ICcnOw0KDQoJCWlmICgoJHNjaGVtZSA9PSAnaHR0cHMnICYmICRwb3J0ICE9ICc0NDMnKQ0KCQkJCXx8ICgkc2NoZW1lID09ICdodHRwJyAmJiAkcG9ydCAhPSAnODAnKSkgew0KCQkJJGhvc3QgPSAiJGhvc3Q6JHBvcnQiOw0KCQl9DQoJCXJldHVybiAiJHNjaGVtZTovLyRob3N0JHBhdGgiOw0KCX0NCg0KCS8qKg0KCSAqIGJ1aWxkcyBhIHVybCB1c2FibGUgZm9yIGEgR0VUIHJlcXVlc3QNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gdG9fdXJsKCkgew0KCQkkcG9zdF9kYXRhID0gJHRoaXMtPnRvX3Bvc3RkYXRhKCk7DQoJCSRvdXQgPSAkdGhpcy0+Z2V0X25vcm1hbGl6ZWRfaHR0cF91cmwoKTsNCgkJaWYgKCRwb3N0X2RhdGEpIHsNCgkJCSRvdXQgLj0gJz8nLiRwb3N0X2RhdGE7DQoJCX0NCgkJcmV0dXJuICRvdXQ7DQoJfQ0KDQoJLyoqDQoJICogYnVpbGRzIHRoZSBkYXRhIG9uZSB3b3VsZCBzZW5kIGluIGEgUE9TVCByZXF1ZXN0DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHRvX3Bvc3RkYXRhKCkgew0KCQlyZXR1cm4gT0F1dGhVdGlsOjpidWlsZF9odHRwX3F1ZXJ5KCR0aGlzLT5wYXJhbWV0ZXJzKTsNCgl9DQoNCgkvKioNCgkgKiBidWlsZHMgdGhlIEF1dGhvcml6YXRpb246IGhlYWRlcg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiB0b19oZWFkZXIoJHJlYWxtPW51bGwpIHsNCgkJJGZpcnN0ID0gdHJ1ZTsNCglpZigkcmVhbG0pIHsNCgkJCSRvdXQgPSAnQXV0aG9yaXphdGlvbjogT0F1dGggcmVhbG09IicgLiBPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCRyZWFsbSkgLiAnIic7DQoJCQkkZmlyc3QgPSBmYWxzZTsNCgkJfSBlbHNlDQoJCQkkb3V0ID0gJ0F1dGhvcml6YXRpb246IE9BdXRoJzsNCg0KCQkkdG90YWwgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAkayA9PiAkdikgew0KCQkJaWYgKHN1YnN0cigkaywgMCwgNSkgIT0gIm9hdXRoIikgY29udGludWU7DQoJCQlpZiAoaXNfYXJyYXkoJHYpKSB7DQoJCQkJdGhyb3cgbmV3IE9BdXRoRXhjZXB0aW9uKCdBcnJheXMgbm90IHN1cHBvcnRlZCBpbiBoZWFkZXJzJyk7DQoJCQl9DQoJCQkkb3V0IC49ICgkZmlyc3QpID8gJyAnIDogJywnOw0KCQkJJG91dCAuPSBPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCRrKSAuDQoJCQkJCQkJJz0iJyAuDQoJCQkJCQkJT0F1dGhVdGlsOjp1cmxlbmNvZGVfcmZjMzk4NigkdikgLg0KCQkJCQkJCSciJzsNCgkJCSRmaXJzdCA9IGZhbHNlOw0KCQl9DQoJCXJldHVybiAkb3V0Ow0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkgew0KCQlyZXR1cm4gJHRoaXMtPnRvX3VybCgpOw0KCX0NCg0KDQoJcHVibGljIGZ1bmN0aW9uIHNpZ25fcmVxdWVzdCgkc2lnbmF0dXJlX21ldGhvZCwgJGNvbnN1bWVyLCAkdG9rZW4pIHsNCgkJJHRoaXMtPnNldF9wYXJhbWV0ZXIoDQoJCQkib2F1dGhfc2lnbmF0dXJlX21ldGhvZCIsDQoJCQkkc2lnbmF0dXJlX21ldGhvZC0+Z2V0X25hbWUoKSwNCgkJCWZhbHNlDQoJCSk7DQoJCSRzaWduYXR1cmUgPSAkdGhpcy0+YnVpbGRfc2lnbmF0dXJlKCRzaWduYXR1cmVfbWV0aG9kLCAkY29uc3VtZXIsICR0b2tlbik7DQoJCSR0aGlzLT5zZXRfcGFyYW1ldGVyKCJvYXV0aF9zaWduYXR1cmUiLCAkc2lnbmF0dXJlLCBmYWxzZSk7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGJ1aWxkX3NpZ25hdHVyZSgkc2lnbmF0dXJlX21ldGhvZCwgJGNvbnN1bWVyLCAkdG9rZW4pIHsNCgkJJHNpZ25hdHVyZSA9ICRzaWduYXR1cmVfbWV0aG9kLT5idWlsZF9zaWduYXR1cmUoJHRoaXMsICRjb25zdW1lciwgJHRva2VuKTsNCgkJcmV0dXJuICRzaWduYXR1cmU7DQoJfQ0KDQoJLyoqDQoJICogdXRpbCBmdW5jdGlvbjogY3VycmVudCB0aW1lc3RhbXANCgkgKi8NCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZV90aW1lc3RhbXAoKSB7DQoJCXJldHVybiB0aW1lKCk7DQoJfQ0KDQoJLyoqDQoJICogdXRpbCBmdW5jdGlvbjogY3VycmVudCBub25jZQ0KCSAqLw0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlX25vbmNlKCkgew0KCQkkbXQgPSBtaWNyb3RpbWUoKTsNCgkJJHJhbmQgPSBtdF9yYW5kKCk7DQoNCgkJcmV0dXJuIG1kNSgkbXQgLiAkcmFuZCk7IC8vIG1kNXMgbG9vayBuaWNlciB0aGFuIG51bWJlcnMNCgl9DQp9DQoNCmNsYXNzIE9BdXRoU2VydmVyDQp7DQoJcHJvdGVjdGVkICR0aW1lc3RhbXBfdGhyZXNob2xkID0gMzAwOyAvLyBpbiBzZWNvbmRzLCBmaXZlIG1pbnV0ZXMNCglwcm90ZWN0ZWQgJHZlcnNpb24gPSAnMS4wJzsgICAgICAgICAgICAgLy8gaGkgYmxhaW5lDQoJcHJvdGVjdGVkICRzaWduYXR1cmVfbWV0aG9kcyA9IGFycmF5KCk7DQoNCglwcm90ZWN0ZWQgJGRhdGFfc3RvcmU7DQoNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZGF0YV9zdG9yZSkgew0KCQkkdGhpcy0+ZGF0YV9zdG9yZSA9ICRkYXRhX3N0b3JlOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBhZGRfc2lnbmF0dXJlX21ldGhvZCgkc2lnbmF0dXJlX21ldGhvZCkgew0KCQkkdGhpcy0+c2lnbmF0dXJlX21ldGhvZHNbJHNpZ25hdHVyZV9tZXRob2QtPmdldF9uYW1lKCldID0NCgkJCSRzaWduYXR1cmVfbWV0aG9kOw0KCX0NCg0KCS8vIGhpZ2ggbGV2ZWwgZnVuY3Rpb25zDQoNCgkvKioNCgkgKiBwcm9jZXNzIGEgcmVxdWVzdF90b2tlbiByZXF1ZXN0DQoJICogcmV0dXJucyB0aGUgcmVxdWVzdCB0b2tlbiBvbiBzdWNjZXNzDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGZldGNoX3JlcXVlc3RfdG9rZW4oJiRyZXF1ZXN0KSB7DQoJCSR0aGlzLT5nZXRfdmVyc2lvbigkcmVxdWVzdCk7DQoNCgkJJGNvbnN1bWVyID0gJHRoaXMtPmdldF9jb25zdW1lcigkcmVxdWVzdCk7DQoNCgkJLy8gbm8gdG9rZW4gcmVxdWlyZWQgZm9yIHRoZSBpbml0aWFsIHRva2VuIHJlcXVlc3QNCgkJJHRva2VuID0gTlVMTDsNCg0KCQkkdGhpcy0+Y2hlY2tfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbik7DQoNCgkJLy8gUmV2IEEgY2hhbmdlDQoJCSRjYWxsYmFjayA9ICRyZXF1ZXN0LT5nZXRfcGFyYW1ldGVyKCdvYXV0aF9jYWxsYmFjaycpOw0KCQkkbmV3X3Rva2VuID0gJHRoaXMtPmRhdGFfc3RvcmUtPm5ld19yZXF1ZXN0X3Rva2VuKCRjb25zdW1lciwgJGNhbGxiYWNrKTsNCg0KCQlyZXR1cm4gJG5ld190b2tlbjsNCgl9DQoNCgkvKioNCgkgKiBwcm9jZXNzIGFuIGFjY2Vzc190b2tlbiByZXF1ZXN0DQoJICogcmV0dXJucyB0aGUgYWNjZXNzIHRva2VuIG9uIHN1Y2Nlc3MNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZmV0Y2hfYWNjZXNzX3Rva2VuKCYkcmVxdWVzdCkgew0KCQkkdGhpcy0+Z2V0X3ZlcnNpb24oJHJlcXVlc3QpOw0KDQoJCSRjb25zdW1lciA9ICR0aGlzLT5nZXRfY29uc3VtZXIoJHJlcXVlc3QpOw0KDQoJCS8vIHJlcXVpcmVzIGF1dGhvcml6ZWQgcmVxdWVzdCB0b2tlbg0KCQkkdG9rZW4gPSAkdGhpcy0+Z2V0X3Rva2VuKCRyZXF1ZXN0LCAkY29uc3VtZXIsICJyZXF1ZXN0Iik7DQoNCgkJJHRoaXMtPmNoZWNrX3NpZ25hdHVyZSgkcmVxdWVzdCwgJGNvbnN1bWVyLCAkdG9rZW4pOw0KDQoJCS8vIFJldiBBIGNoYW5nZQ0KCQkkdmVyaWZpZXIgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcignb2F1dGhfdmVyaWZpZXInKTsNCgkJJG5ld190b2tlbiA9ICR0aGlzLT5kYXRhX3N0b3JlLT5uZXdfYWNjZXNzX3Rva2VuKCR0b2tlbiwgJGNvbnN1bWVyLCAkdmVyaWZpZXIpOw0KDQoJCXJldHVybiAkbmV3X3Rva2VuOw0KCX0NCg0KCS8qKg0KCSAqIHZlcmlmeSBhbiBhcGkgY2FsbCwgY2hlY2tzIGFsbCB0aGUgcGFyYW1ldGVycw0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiB2ZXJpZnlfcmVxdWVzdCgmJHJlcXVlc3QpIHsNCgkJJHRoaXMtPmdldF92ZXJzaW9uKCRyZXF1ZXN0KTsNCgkJJGNvbnN1bWVyID0gJHRoaXMtPmdldF9jb25zdW1lcigkcmVxdWVzdCk7DQoJCSR0b2tlbiA9ICR0aGlzLT5nZXRfdG9rZW4oJHJlcXVlc3QsICRjb25zdW1lciwgImFjY2VzcyIpOw0KCQkkdGhpcy0+Y2hlY2tfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbik7DQoJCXJldHVybiBhcnJheSgkY29uc3VtZXIsICR0b2tlbik7DQoJfQ0KDQoJLy8gSW50ZXJuYWxzIGZyb20gaGVyZQ0KCS8qKg0KCSAqIHZlcnNpb24gMQ0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gZ2V0X3ZlcnNpb24oJiRyZXF1ZXN0KSB7DQoJCSR2ZXJzaW9uID0gJHJlcXVlc3QtPmdldF9wYXJhbWV0ZXIoIm9hdXRoX3ZlcnNpb24iKTsNCgkJaWYgKCEkdmVyc2lvbikgew0KCQkJLy8gU2VydmljZSBQcm92aWRlcnMgTVVTVCBhc3N1bWUgdGhlIHByb3RvY29sIHZlcnNpb24gdG8gYmUgMS4wIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwcmVzZW50Lg0KCQkJLy8gQ2hhcHRlciA3LjAgKCJBY2Nlc3NpbmcgUHJvdGVjdGVkIFJlc3NvdXJjZXMiKQ0KCQkJJHZlcnNpb24gPSAnMS4wJzsNCgkJfQ0KCQlpZiAoJHZlcnNpb24gIT09ICR0aGlzLT52ZXJzaW9uKSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oIk9BdXRoIHZlcnNpb24gJyR2ZXJzaW9uJyBub3Qgc3VwcG9ydGVkIik7DQoJCX0NCgkJcmV0dXJuICR2ZXJzaW9uOw0KCX0NCg0KCS8qKg0KCSAqIGZpZ3VyZSBvdXQgdGhlIHNpZ25hdHVyZSB3aXRoIHNvbWUgZGVmYXVsdHMNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIGdldF9zaWduYXR1cmVfbWV0aG9kKCRyZXF1ZXN0KSB7DQoJCSRzaWduYXR1cmVfbWV0aG9kID0gJHJlcXVlc3QgaW5zdGFuY2VvZiBPQXV0aFJlcXVlc3QNCgkJCQk/ICRyZXF1ZXN0LT5nZXRfcGFyYW1ldGVyKCJvYXV0aF9zaWduYXR1cmVfbWV0aG9kIikNCgkJCQk6IE5VTEw7DQoNCgkJaWYgKCEkc2lnbmF0dXJlX21ldGhvZCkgew0KCQkJLy8gQWNjb3JkaW5nIHRvIGNoYXB0ZXIgNyAoIkFjY2Vzc2luZyBQcm90ZWN0ZWQgUmVzc291cmNlcyIpIHRoZSBzaWduYXR1cmUtbWV0aG9kDQoJCQkvLyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIGFuZCB3ZSBjYW4ndCBqdXN0IGZhbGxiYWNrIHRvIFBMQUlOVEVYVA0KCQkJdGhyb3cgbmV3IE9BdXRoRXhjZXB0aW9uKCdObyBzaWduYXR1cmUgbWV0aG9kIHBhcmFtZXRlci4gVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnKTsNCgkJfQ0KDQoJCWlmICghaW5fYXJyYXkoJHNpZ25hdHVyZV9tZXRob2QsDQoJCQkJCQkJCQlhcnJheV9rZXlzKCR0aGlzLT5zaWduYXR1cmVfbWV0aG9kcykpKSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oDQoJCQkJIlNpZ25hdHVyZSBtZXRob2QgJyRzaWduYXR1cmVfbWV0aG9kJyBub3Qgc3VwcG9ydGVkICIgLg0KCQkJCSJ0cnkgb25lIG9mIHRoZSBmb2xsb3dpbmc6ICIgLg0KCQkJCWltcGxvZGUoIiwgIiwgYXJyYXlfa2V5cygkdGhpcy0+c2lnbmF0dXJlX21ldGhvZHMpKQ0KCQkJKTsNCgkJfQ0KCQlyZXR1cm4gJHRoaXMtPnNpZ25hdHVyZV9tZXRob2RzWyRzaWduYXR1cmVfbWV0aG9kXTsNCgl9DQoNCgkvKioNCgkgKiB0cnkgdG8gZmluZCB0aGUgY29uc3VtZXIgZm9yIHRoZSBwcm92aWRlZCByZXF1ZXN0J3MgY29uc3VtZXIga2V5DQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBnZXRfY29uc3VtZXIoJHJlcXVlc3QpIHsNCgkJJGNvbnN1bWVyX2tleSA9ICRyZXF1ZXN0IGluc3RhbmNlb2YgT0F1dGhSZXF1ZXN0DQoJCQkJPyAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcigib2F1dGhfY29uc3VtZXJfa2V5IikNCgkJCQk6IE5VTEw7DQoNCgkJaWYgKCEkY29uc3VtZXJfa2V5KSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oIkludmFsaWQgY29uc3VtZXIga2V5Iik7DQoJCX0NCg0KCQkkY29uc3VtZXIgPSAkdGhpcy0+ZGF0YV9zdG9yZS0+bG9va3VwX2NvbnN1bWVyKCRjb25zdW1lcl9rZXkpOw0KCQlpZiAoISRjb25zdW1lcikgew0KCQkJdGhyb3cgbmV3IE9BdXRoRXhjZXB0aW9uKCJJbnZhbGlkIGNvbnN1bWVyIik7DQoJCX0NCg0KCQlyZXR1cm4gJGNvbnN1bWVyOw0KCX0NCg0KCS8qKg0KCSAqIHRyeSB0byBmaW5kIHRoZSB0b2tlbiBmb3IgdGhlIHByb3ZpZGVkIHJlcXVlc3QncyB0b2tlbiBrZXkNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIGdldF90b2tlbigkcmVxdWVzdCwgJGNvbnN1bWVyLCAkdG9rZW5fdHlwZT0iYWNjZXNzIikgew0KCQkkdG9rZW5fZmllbGQgPSAkcmVxdWVzdCBpbnN0YW5jZW9mIE9BdXRoUmVxdWVzdA0KCQkJCT8gJHJlcXVlc3QtPmdldF9wYXJhbWV0ZXIoJ29hdXRoX3Rva2VuJykNCgkJCQk6IE5VTEw7DQoNCgkJJHRva2VuID0gJHRoaXMtPmRhdGFfc3RvcmUtPmxvb2t1cF90b2tlbigNCgkJCSRjb25zdW1lciwgJHRva2VuX3R5cGUsICR0b2tlbl9maWVsZA0KCQkpOw0KCQlpZiAoISR0b2tlbikgew0KCQkJdGhyb3cgbmV3IE9BdXRoRXhjZXB0aW9uKCJJbnZhbGlkICR0b2tlbl90eXBlIHRva2VuOiAkdG9rZW5fZmllbGQiKTsNCgkJfQ0KCQlyZXR1cm4gJHRva2VuOw0KCX0NCg0KCS8qKg0KCSAqIGFsbC1pbi1vbmUgZnVuY3Rpb24gdG8gY2hlY2sgdGhlIHNpZ25hdHVyZSBvbiBhIHJlcXVlc3QNCgkgKiBzaG91bGQgZ3Vlc3MgdGhlIHNpZ25hdHVyZSBtZXRob2QgYXBwcm9wcmlhdGVseQ0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gY2hlY2tfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbikgew0KCQkvLyB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIGRpZmZlcmVudCBtZXRob2QNCgkJJHRpbWVzdGFtcCA9ICRyZXF1ZXN0IGluc3RhbmNlb2YgT0F1dGhSZXF1ZXN0DQoJCQkJPyAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcignb2F1dGhfdGltZXN0YW1wJykNCgkJCQk6IE5VTEw7DQoJCSRub25jZSA9ICRyZXF1ZXN0IGluc3RhbmNlb2YgT0F1dGhSZXF1ZXN0DQoJCQkJPyAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcignb2F1dGhfbm9uY2UnKQ0KCQkJCTogTlVMTDsNCg0KCQkkdGhpcy0+Y2hlY2tfdGltZXN0YW1wKCR0aW1lc3RhbXApOw0KCQkkdGhpcy0+Y2hlY2tfbm9uY2UoJGNvbnN1bWVyLCAkdG9rZW4sICRub25jZSwgJHRpbWVzdGFtcCk7DQoNCgkJJHNpZ25hdHVyZV9tZXRob2QgPSAkdGhpcy0+Z2V0X3NpZ25hdHVyZV9tZXRob2QoJHJlcXVlc3QpOw0KDQoJCSRzaWduYXR1cmUgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcignb2F1dGhfc2lnbmF0dXJlJyk7DQoJCSR2YWxpZF9zaWcgPSAkc2lnbmF0dXJlX21ldGhvZC0+Y2hlY2tfc2lnbmF0dXJlKA0KCQkJJHJlcXVlc3QsDQoJCQkkY29uc3VtZXIsDQoJCQkkdG9rZW4sDQoJCQkkc2lnbmF0dXJlDQoJCSk7DQoNCgkJaWYgKCEkdmFsaWRfc2lnKSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oIkludmFsaWQgc2lnbmF0dXJlIik7DQoJCX0NCgl9DQoNCgkvKioNCgkgKiBjaGVjayB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgbmV3IGVub3VnaA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gY2hlY2tfdGltZXN0YW1wKCR0aW1lc3RhbXApIHsNCgkJaWYoICEgJHRpbWVzdGFtcCApDQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oDQoJCQkJJ01pc3NpbmcgdGltZXN0YW1wIHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyByZXF1aXJlZCcNCgkJCSk7DQoNCgkJLy8gdmVyaWZ5IHRoYXQgdGltZXN0YW1wIGlzIHJlY2VudGlzaA0KCQkkbm93ID0gdGltZSgpOw0KCQlpZiAoYWJzKCRub3cgLSAkdGltZXN0YW1wKSA+ICR0aGlzLT50aW1lc3RhbXBfdGhyZXNob2xkKSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oDQoJCQkJIkV4cGlyZWQgdGltZXN0YW1wLCB5b3VycyAkdGltZXN0YW1wLCBvdXJzICRub3ciDQoJCQkpOw0KCQl9DQoJfQ0KDQoJLyoqDQoJICogY2hlY2sgdGhhdCB0aGUgbm9uY2UgaXMgbm90IHJlcGVhdGVkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBjaGVja19ub25jZSgkY29uc3VtZXIsICR0b2tlbiwgJG5vbmNlLCAkdGltZXN0YW1wKSB7DQoJCWlmKCAhICRub25jZSApDQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oDQoJCQkJJ01pc3Npbmcgbm9uY2UgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkJw0KCQkJKTsNCg0KCQkvLyB2ZXJpZnkgdGhhdCB0aGUgbm9uY2UgaXMgdW5pcXVlaXNoDQoJCSRmb3VuZCA9ICR0aGlzLT5kYXRhX3N0b3JlLT5sb29rdXBfbm9uY2UoDQoJCQkkY29uc3VtZXIsDQoJCQkkdG9rZW4sDQoJCQkkbm9uY2UsDQoJCQkkdGltZXN0YW1wDQoJCSk7DQoJCWlmICgkZm91bmQpIHsNCgkJCXRocm93IG5ldyBPQXV0aEV4Y2VwdGlvbigiTm9uY2UgYWxyZWFkeSB1c2VkOiAkbm9uY2UiKTsNCgkJfQ0KCX0NCg0KfQ0KDQpjbGFzcyBPQXV0aERhdGFTdG9yZQ0Kew0KCWZ1bmN0aW9uIGxvb2t1cF9jb25zdW1lcigkY29uc3VtZXJfa2V5KSB7DQoJCS8vIGltcGxlbWVudCBtZQ0KCX0NCg0KCWZ1bmN0aW9uIGxvb2t1cF90b2tlbigkY29uc3VtZXIsICR0b2tlbl90eXBlLCAkdG9rZW4pIHsNCgkJLy8gaW1wbGVtZW50IG1lDQoJfQ0KDQoJZnVuY3Rpb24gbG9va3VwX25vbmNlKCRjb25zdW1lciwgJHRva2VuLCAkbm9uY2UsICR0aW1lc3RhbXApIHsNCgkJLy8gaW1wbGVtZW50IG1lDQoJfQ0KDQoJZnVuY3Rpb24gbmV3X3JlcXVlc3RfdG9rZW4oJGNvbnN1bWVyLCAkY2FsbGJhY2sgPSBudWxsKSB7DQoJCS8vIHJldHVybiBhIG5ldyB0b2tlbiBhdHRhY2hlZCB0byB0aGlzIGNvbnN1bWVyDQoJfQ0KDQoJZnVuY3Rpb24gbmV3X2FjY2Vzc190b2tlbigkdG9rZW4sICRjb25zdW1lciwgJHZlcmlmaWVyID0gbnVsbCkgew0KCQkvLyByZXR1cm4gYSBuZXcgYWNjZXNzIHRva2VuIGF0dGFjaGVkIHRvIHRoaXMgY29uc3VtZXINCgkJLy8gZm9yIHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRva2VuIGlmIHRoZSByZXF1ZXN0IHRva2VuDQoJCS8vIGlzIGF1dGhvcml6ZWQNCgkJLy8gc2hvdWxkIGFsc28gaW52YWxpZGF0ZSB0aGUgcmVxdWVzdCB0b2tlbg0KCX0NCg0KfQ0KDQpjbGFzcyBPQXV0aFV0aWwNCnsNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVybGVuY29kZV9yZmMzOTg2KCRpbnB1dCkgew0KCQlpZiAoaXNfYXJyYXkoJGlucHV0KSkgew0KCQkJcmV0dXJuIGFycmF5X21hcChhcnJheSgnT0F1dGhVdGlsJywgJ3VybGVuY29kZV9yZmMzOTg2JyksICRpbnB1dCk7DQoJCX0gZWxzZSBpZiAoaXNfc2NhbGFyKCRpbnB1dCkpIHsNCgkJCXJldHVybiBzdHJfcmVwbGFjZSgNCgkJCQknKycsDQoJCQkJJyAnLA0KCQkJCXN0cl9yZXBsYWNlKCclN0UnLCAnficsIHJhd3VybGVuY29kZSgkaW5wdXQpKQ0KCQkJKTsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiAnJzsNCgkJfQ0KCX0NCg0KDQoJLy8gVGhpcyBkZWNvZGUgZnVuY3Rpb24gaXNuJ3QgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiB0aGUgYWJvdmUNCgkvLyBtb2RpZmljYXRpb25zIHRvIHRoZSBlbmNvZGluZyBwcm9jZXNzLiBIb3dldmVyLCB0aGlzIG1ldGhvZCBkb2Vzbid0DQoJLy8gc2VlbSB0byBiZSB1c2VkIGFueXdoZXJlIHNvIGxlYXZpbmcgaXQgYXMgaXMuDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1cmxkZWNvZGVfcmZjMzk4Nigkc3RyaW5nKSB7DQoJCXJldHVybiB1cmxkZWNvZGUoJHN0cmluZyk7DQoJfQ0KDQoJLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgdHVybmluZyB0aGUgQXV0aG9yaXphdGlvbjogaGVhZGVyIGludG8NCgkvLyBwYXJhbWV0ZXJzLCBoYXMgdG8gZG8gc29tZSB1bmVzY2FwaW5nDQoJLy8gQ2FuIGZpbHRlciBvdXQgYW55IG5vbi1vYXV0aCBwYXJhbWV0ZXJzIGlmIG5lZWRlZCAoZGVmYXVsdCBiZWhhdmlvdXIpDQoJLy8gTWF5IDI4dGgsIDIwMTAgLSBtZXRob2QgdXBkYXRlZCB0byB0amVyay5tZWVzdGVycyBmb3IgYSBzcGVlZCBpbXByb3ZlbWVudC4NCgkvLyAgICAgICAgICAgICAgICAgIHNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3Avb2F1dGgvaXNzdWVzL2RldGFpbD9pZD0xNjMNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNwbGl0X2hlYWRlcigkaGVhZGVyLCAkb25seV9hbGxvd19vYXV0aF9wYXJhbWV0ZXJzID0gdHJ1ZSkgew0KCQkkcGFyYW1zID0gYXJyYXkoKTsNCgkJaWYgKHByZWdfbWF0Y2hfYWxsKCcvKCcuKCRvbmx5X2FsbG93X29hdXRoX3BhcmFtZXRlcnMgPyAnb2F1dGhfJyA6ICcnKS4nW2Etel8tXSopPSg6PyIoW14iXSopInwoW14sXSopKS8nLCAkaGVhZGVyLCAkbWF0Y2hlcykpIHsNCgkJCWZvcmVhY2ggKCRtYXRjaGVzWzFdIGFzICRpID0+ICRoKSB7DQoJCQkJJHBhcmFtc1skaF0gPSBPQXV0aFV0aWw6OnVybGRlY29kZV9yZmMzOTg2KGVtcHR5KCRtYXRjaGVzWzNdWyRpXSkgPyAkbWF0Y2hlc1s0XVskaV0gOiAkbWF0Y2hlc1szXVskaV0pOw0KCQkJfQ0KCQkJaWYgKGlzc2V0KCRwYXJhbXNbJ3JlYWxtJ10pKSB7DQoJCQkJdW5zZXQoJHBhcmFtc1sncmVhbG0nXSk7DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRwYXJhbXM7DQoJfQ0KDQoJLy8gaGVscGVyIHRvIHRyeSB0byBzb3J0IG91dCBoZWFkZXJzIGZvciBwZW9wbGUgd2hvIGFyZW4ndCBydW5uaW5nIGFwYWNoZQ0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2hlYWRlcnMoKSB7DQoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2FwYWNoZV9yZXF1ZXN0X2hlYWRlcnMnKSkgew0KCQkJLy8gd2UgbmVlZCB0aGlzIHRvIGdldCB0aGUgYWN0dWFsIEF1dGhvcml6YXRpb246IGhlYWRlcg0KCQkJLy8gYmVjYXVzZSBhcGFjaGUgdGVuZHMgdG8gdGVsbCB1cyBpdCBkb2Vzbid0IGV4aXN0DQoJCQkkaGVhZGVycyA9IGFwYWNoZV9yZXF1ZXN0X2hlYWRlcnMoKTsNCg0KCQkJLy8gc2FuaXRpemUgdGhlIG91dHB1dCBvZiBhcGFjaGVfcmVxdWVzdF9oZWFkZXJzIGJlY2F1c2UNCgkJCS8vIHdlIGFsd2F5cyB3YW50IHRoZSBrZXlzIHRvIGJlIENhc2VkLUxpa2UtVGhpcyBhbmQgYXJoKCkNCgkJCS8vIHJldHVybnMgdGhlIGhlYWRlcnMgaW4gdGhlIHNhbWUgY2FzZSBhcyB0aGV5IGFyZSBpbiB0aGUNCgkJCS8vIHJlcXVlc3QNCgkJCSRvdXQgPSBhcnJheSgpOw0KCQkJZm9yZWFjaCAoJGhlYWRlcnMgQVMgJGtleSA9PiAkdmFsdWUpIHsNCgkJCQkka2V5ID0gc3RyX3JlcGxhY2UoDQoJCQkJCQkiICIsDQoJCQkJCQkiLSIsDQoJCQkJCQl1Y3dvcmRzKHN0cnRvbG93ZXIoc3RyX3JlcGxhY2UoIi0iLCAiICIsICRrZXkpKSkNCgkJCQkJKTsNCgkJCQkkb3V0WyRrZXldID0gJHZhbHVlOw0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJLy8gb3RoZXJ3aXNlIHdlIGRvbid0IGhhdmUgYXBhY2hlIGFuZCBhcmUganVzdCBnb2luZyB0byBoYXZlIHRvIGhvcGUNCgkJCS8vIHRoYXQgJF9TRVJWRVIgYWN0dWFsbHkgY29udGFpbnMgd2hhdCB3ZSBuZWVkDQoJCQkkb3V0ID0gYXJyYXkoKTsNCgkJCWlmKCBpc3NldCgkX1NFUlZFUlsnQ09OVEVOVF9UWVBFJ10pICkNCgkJCQkkb3V0WydDb250ZW50LVR5cGUnXSA9ICRfU0VSVkVSWydDT05URU5UX1RZUEUnXTsNCgkJCWlmKCBpc3NldCgkX0VOVlsnQ09OVEVOVF9UWVBFJ10pICkNCgkJCQkkb3V0WydDb250ZW50LVR5cGUnXSA9ICRfRU5WWydDT05URU5UX1RZUEUnXTsNCg0KCQkJZm9yZWFjaCAoJF9TRVJWRVIgYXMgJGtleSA9PiAkdmFsdWUpIHsNCgkJCQlpZiAoc3Vic3RyKCRrZXksIDAsIDUpID09ICJIVFRQXyIpIHsNCgkJCQkJLy8gdGhpcyBpcyBjaGFvcywgYmFzaWNhbGx5IGl0IGlzIGp1c3QgdGhlcmUgdG8gY2FwaXRhbGl6ZSB0aGUgZmlyc3QNCgkJCQkJLy8gbGV0dGVyIG9mIGV2ZXJ5IHdvcmQgdGhhdCBpcyBub3QgYW4gaW5pdGlhbCBIVFRQIGFuZCBzdHJpcCBIVFRQDQoJCQkJCS8vIGNvZGUgZnJvbSBwcnplbWVrDQoJCQkJCSRrZXkgPSBzdHJfcmVwbGFjZSgNCgkJCQkJCSIgIiwNCgkJCQkJCSItIiwNCgkJCQkJCXVjd29yZHMoc3RydG9sb3dlcihzdHJfcmVwbGFjZSgiXyIsICIgIiwgc3Vic3RyKCRrZXksIDUpKSkpDQoJCQkJCSk7DQoJCQkJCSRvdXRbJGtleV0gPSAkdmFsdWU7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXJldHVybiAkb3V0Ow0KCX0NCg0KCS8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBpbnB1dCBsaWtlIGE9YiZhPWMmZD1lIGFuZCByZXR1cm5zIHRoZSBwYXJzZWQNCgkvLyBwYXJhbWV0ZXJzIGxpa2UgdGhpcw0KCS8vIGFycmF5KCdhJyA9PiBhcnJheSgnYicsJ2MnKSwgJ2QnID0+ICdlJykNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlX3BhcmFtZXRlcnMoICRpbnB1dCApIHsNCgkJaWYgKCFpc3NldCgkaW5wdXQpIHx8ICEkaW5wdXQpIHJldHVybiBhcnJheSgpOw0KDQoJCSRwYWlycyA9IGV4cGxvZGUoJyYnLCAkaW5wdXQpOw0KDQoJCSRwYXJzZWRfcGFyYW1ldGVycyA9IGFycmF5KCk7DQoJCWZvcmVhY2ggKCRwYWlycyBhcyAkcGFpcikgew0KCQkJJHNwbGl0ID0gZXhwbG9kZSgnPScsICRwYWlyLCAyKTsNCgkJCSRwYXJhbWV0ZXIgPSBPQXV0aFV0aWw6OnVybGRlY29kZV9yZmMzOTg2KCRzcGxpdFswXSk7DQoJCQkkdmFsdWUgPSBpc3NldCgkc3BsaXRbMV0pID8gT0F1dGhVdGlsOjp1cmxkZWNvZGVfcmZjMzk4Nigkc3BsaXRbMV0pIDogJyc7DQoNCgkJCWlmIChpc3NldCgkcGFyc2VkX3BhcmFtZXRlcnNbJHBhcmFtZXRlcl0pKSB7DQoJCQkJLy8gV2UgaGF2ZSBhbHJlYWR5IHJlY2lldmVkIHBhcmFtZXRlcihzKSB3aXRoIHRoaXMgbmFtZSwgc28gYWRkIHRvIHRoZSBsaXN0DQoJCQkJLy8gb2YgcGFyYW1ldGVycyB3aXRoIHRoaXMgbmFtZQ0KDQoJCQkJaWYgKGlzX3NjYWxhcigkcGFyc2VkX3BhcmFtZXRlcnNbJHBhcmFtZXRlcl0pKSB7DQoJCQkJCS8vIFRoaXMgaXMgdGhlIGZpcnN0IGR1cGxpY2F0ZSwgc28gdHJhbnNmb3JtIHNjYWxhciAoc3RyaW5nKSBpbnRvIGFuIGFycmF5DQoJCQkJCS8vIHNvIHdlIGNhbiBhZGQgdGhlIGR1cGxpY2F0ZXMNCgkJCQkJJHBhcnNlZF9wYXJhbWV0ZXJzWyRwYXJhbWV0ZXJdID0gYXJyYXkoJHBhcnNlZF9wYXJhbWV0ZXJzWyRwYXJhbWV0ZXJdKTsNCgkJCQl9DQoNCgkJCQkkcGFyc2VkX3BhcmFtZXRlcnNbJHBhcmFtZXRlcl1bXSA9ICR2YWx1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJJHBhcnNlZF9wYXJhbWV0ZXJzWyRwYXJhbWV0ZXJdID0gJHZhbHVlOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkcGFyc2VkX3BhcmFtZXRlcnM7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBidWlsZF9odHRwX3F1ZXJ5KCRwYXJhbXMpIHsNCgkJaWYgKCEkcGFyYW1zKSByZXR1cm4gJyc7DQoNCgkJLy8gVXJsZW5jb2RlIGJvdGgga2V5cyBhbmQgdmFsdWVzDQoJCSRrZXlzID0gT0F1dGhVdGlsOjp1cmxlbmNvZGVfcmZjMzk4NihhcnJheV9rZXlzKCRwYXJhbXMpKTsNCgkJJHZhbHVlcyA9IE9BdXRoVXRpbDo6dXJsZW5jb2RlX3JmYzM5ODYoYXJyYXlfdmFsdWVzKCRwYXJhbXMpKTsNCgkJJHBhcmFtcyA9IGFycmF5X2NvbWJpbmUoJGtleXMsICR2YWx1ZXMpOw0KDQoJCS8vIFBhcmFtZXRlcnMgYXJlIHNvcnRlZCBieSBuYW1lLCB1c2luZyBsZXhpY29ncmFwaGljYWwgYnl0ZSB2YWx1ZSBvcmRlcmluZy4NCgkJLy8gUmVmOiBTcGVjOiA5LjEuMSAoMSkNCgkJdWtzb3J0KCRwYXJhbXMsICdzdHJjbXAnKTsNCg0KCQkkcGFpcnMgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkcGFyYW1zIGFzICRwYXJhbWV0ZXIgPT4gJHZhbHVlKSB7DQoJCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgew0KCQkJCS8vIElmIHR3byBvciBtb3JlIHBhcmFtZXRlcnMgc2hhcmUgdGhlIHNhbWUgbmFtZSwgdGhleSBhcmUgc29ydGVkIGJ5IHRoZWlyIHZhbHVlDQoJCQkJLy8gUmVmOiBTcGVjOiA5LjEuMSAoMSkNCgkJCQkvLyBKdW5lIDEydGgsIDIwMTAgLSBjaGFuZ2VkIHRvIHNvcnQgYmVjYXVzZSBvZiBpc3N1ZSAxNjQgYnkgaGlkZXRha2ENCgkJCQlzb3J0KCR2YWx1ZSwgU09SVF9TVFJJTkcpOw0KCQkJCWZvcmVhY2ggKCR2YWx1ZSBhcyAkZHVwbGljYXRlX3ZhbHVlKSB7DQoJCQkJCSRwYWlyc1tdID0gJHBhcmFtZXRlciAuICc9JyAuICRkdXBsaWNhdGVfdmFsdWU7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkcGFpcnNbXSA9ICRwYXJhbWV0ZXIgLiAnPScgLiAkdmFsdWU7DQoJCQl9DQoJCX0NCgkJLy8gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgbmFtZSBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBieSBhbiAnPScgY2hhcmFjdGVyIChBU0NJSSBjb2RlIDYxKQ0KCQkvLyBFYWNoIG5hbWUtdmFsdWUgcGFpciBpcyBzZXBhcmF0ZWQgYnkgYW4gJyYnIGNoYXJhY3RlciAoQVNDSUkgY29kZSAzOCkNCgkJcmV0dXJuIGltcGxvZGUoJyYnLCAkcGFpcnMpOw0KCX0NCn0NCg==]]></data>
	</file>
	<file>
	  <filename>/MediaCenter.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBNZWRpYUNlbnRlcgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmICghaXNzZXQoJGdDbXMpKQogICAgZXhpdDsKCiRjZ2V4dGVuc2lvbnMgPSBjbXNfam9pbl9wYXRoKCRnQ21zLT5jb25maWdbJ3Jvb3RfcGF0aCddLCAnbW9kdWxlcycsCiAgICAgICAgICAgICAgICAnQ0dFeHRlbnNpb25zJywgJ0NHRXh0ZW5zaW9ucy5tb2R1bGUucGhwJyk7CmlmICghaXNfcmVhZGFibGUoJGNnZXh0ZW5zaW9ucykpIHsKICAgIGVjaG8gJzxoMT48Zm9udCBjb2xvcj0icmVkIj5FUlJPUjogVGhlIENHRXh0ZW5zaW9ucyBtb2R1bGUgY291bGQgbm90IGJlIGZvdW5kLjwvZm9udD48L2gxPic7CiAgICByZXR1cm47Cn0KcmVxdWlyZV9vbmNlKCRjZ2V4dGVuc2lvbnMpOwoKZGVmaW5lKCdNRURJQUNFTlRFUl9QUkVGX05FV01FRElBQ0VOVEVSX1RFTVBMQVRFJywgJ21lZGlhY2VudGVyX3ByZWZfbmV3bWVkaWFjZW50ZXJfdGVtcGxhdGUnKTsKZGVmaW5lKCdNRURJQUNFTlRFUl9QUkVGX05FV01FRElBQ0VOVEVSX1RFTVBMQVRFJywgJ21lZGlhY2VudGVyX3ByZWZfZGZsdG1lZGlhY2VudGVyX3RlbXBsYXRlJyk7CgpjbGFzcyBNZWRpYUNlbnRlciBleHRlbmRzIENHRXh0ZW5zaW9ucyB7CgogICAgdmFyICR0eXBlOwogICAgdmFyICRsaW1pdDsKICAgIHZhciAkX2luaXRfY2FjaGUgPSBmYWxzZTsKCiAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgpOwogICAgICAgIG1lZGlhX2NlbnRlcl90b29sc19zbWFydHk6OmluaXQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXROYW1lKCkgewogICAgICAgIHJldHVybiAnTWVkaWFDZW50ZXInOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7CiAgICAgICAgcmV0dXJuICcwLjUnOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEhlbHAoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0QXV0aG9yKCkgewogICAgICAgIHJldHVybiAnS3V6bWFueS5iaXonOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgewogICAgICAgIHJldHVybiAnemRlbm9Aa3V6bWFueS5iaXonOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwogICAgfQoKICAgIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIEhhc0FkbWluKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpIHsKICAgICAgICByZXR1cm4gJ2V4dGVuc2lvbnMnOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdtb2RkZXNjcmlwdGlvbicpOwogICAgfQoKICAgIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignVXNlIE1lZGlhIENlbnRlcicpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpIHsKICAgICAgICByZXR1cm4gYXJyYXkoJ0NHRXh0ZW5zaW9ucycgPT4gJzEuMTgnLCdDb250ZW50Q2FjaGUnID0+ICcxLjInKTsKICAgIH0KCiAgICBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsKICAgICAgICByZXR1cm4gIjEuOCI7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0UGFyYW1ldGVycygpIHsKICAgICAgICAKCiAgICAgICAgJHRoaXMtPlJlc3RyaWN0VW5rbm93blBhcmFtcygpOwoKICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdsaW1pdCcsIDIwLCAkdGhpcy0+TGFuZygnaGVscF9saW1pdCcpKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbGltaXQnLCBDTEVBTl9JTlQpOwoKICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdrZXl3b3JkJywgJycsICR0aGlzLT5MYW5nKCdoZWxwX2tleXdvcmQnKSk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2tleXdvcmQnLCBDTEVBTl9TVFJJTkcpOwoKICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdzb3VyY2UnLCAnJywgJHRoaXMtPkxhbmcoJ2hlbHBfc291cmNlJykpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdzb3VyY2UnLCBDTEVBTl9TVFJJTkcpOwoKICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCd0eXBlJywgJycsICR0aGlzLT5MYW5nKCdoZWxwX3R5cGUnKSk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3R5cGUnLCBDTEVBTl9TVFJJTkcpOwoKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnYXJ0aXN0JywgQ0xFQU5fU1RSSU5HKTsKCiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3NvbmcnLCBDTEVBTl9TVFJJTkcpOwoKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgndGltZW91dCcsIENMRUFOX0lOVCk7CgogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2Rpc3BsYXl0ZW1wbGF0ZScsICcnLCAkdGhpcy0+TGFuZygnaGVscF9kaXNwbGF5dGVtcGxhdGUnKSk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2Rpc3BsYXl0ZW1wbGF0ZScsIENMRUFOX1NUUklORyk7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0RXZlbnREZXNjcmlwdGlvbigkZXZlbnRuYW1lKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdldmVudF9pbmZvXycgLiAkZXZlbnRuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRFdmVudEhlbHAoJGV2ZW50bmFtZSkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnZXZlbnRfaGVscF8nIC4gJGV2ZW50bmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncmVhbGx5X3VuaW5zdGFsbCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvYWRCaW5nKCRrZXl3b3JkKSB7CiAgICAgICAgLy8gaW5jbHVkZSBzaW1wbGUgcGllCiAgICAgICAgJGJpbmdfYXBpX2tleSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdiaW5nX2FwaV9rZXknKTsKICAgICAgICAkbyA9IG5ldyBNc2Z0X0JpbmdfU2VhcmNoKCRiaW5nX2FwaV9rZXkpOwogICAgICAgICRvLT5zZXRRdWVyeSgka2V5d29yZCkKICAgICAgICAgICAgICAgIC0+c2V0V2ViQ291bnQoJHRoaXMtPmNvdW50KQogICAgICAgICAgICAgICAgLT5zZXRTb3VyY2UoJycgLiAkdGhpcy0+dHlwZSAuICcnKTsKICAgICAgICAkcmF3ID0gJG8tPnNlYXJjaCgpOwogICAgICAgICRyZXN1bHQgPSBqc29uX2RlY29kZSgkcmF3KTsKICAgICAgICAkdHlwZSA9ICR0aGlzLT50eXBlOwogICAgICAgIHJldHVybiAkcmVzdWx0LT5TZWFyY2hSZXNwb25zZS0+JHR5cGUtPlJlc3VsdHM7CiAgICB9CgogICAgZnVuY3Rpb24gbG9hZFR3aXR0ZXIoJGtleXdvcmQpIHsKICAgICAgICAkdHdpdHRlciA9IG5ldyB0d2l0dGVyX2Zvcl9waHA7CiAgICAgICAgcmV0dXJuICR0d2l0dGVyLT5zZWFyY2goJGtleXdvcmQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvYWRMYXN0Rk0oJGtleXdvcmQpIHsKICAgICAgICAvLyBpbml0CiAgICAgICAgJGxmX2luaXQgPSBuZXcgbGFzdGZtYXBpX2luYygpOwogICAgICAgICRhdXRoVmFycyA9IGFycmF5KAogICAgICAgICAgICAnYXBpS2V5JyA9PiAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGFzdF9mbV9hcGlfa2V5JykKICAgICAgICApOwogICAgICAgICRjb25maWcgPSBhcnJheSgKICAgICAgICAgICAgJ2VuYWJsZWQnID0+IGZhbHNlCiAgICAgICAgKTsKICAgICAgICAvLyBQYXNzIHRoZSBhcnJheSB0byB0aGUgYXV0aCBjbGFzcyB0byBldHVybiBhIHZhbGlkIGF1dGgKICAgICAgICAkYXV0aCA9IG5ldyBsYXN0Zm1BcGlBdXRoKCdzZXRzZXNzaW9uJywgJGF1dGhWYXJzKTsKCiAgICAgICAgLy8gQ2FsbCBmb3IgdGhlIGFsYnVtIHBhY2thZ2UgY2xhc3Mgd2l0aCBhdXRoIGRhdGEKICAgICAgICAkYXBpQ2xhc3MgPSBuZXcgbGFzdGZtQXBpKCk7CiAgICAgICAgJGFydGlzdENsYXNzID0gJGFwaUNsYXNzLT5nZXRQYWNrYWdlKCRhdXRoLCAkdGhpcy0+dHlwZSwgJGNvbmZpZyk7CiAgICAgICAgLy8gU2V0dXAgdGhlIHZhcmlhYmxlcwogICAgICAgICRtZXRob2RWYXJzID0gYXJyYXkoCiAgICAgICAgICAgICR0aGlzLT50eXBlID0+ICRrZXl3b3JkLAogICAgICAgICAgICAncGFnZScgPT4gMSwKICAgICAgICAgICAgJ2xpbWl0JyA9PiAkdGhpcy0+bGltaXQKICAgICAgICApOwogICAgICAgIGlmICgkcmVzdWx0cyA9ICRhcnRpc3RDbGFzcy0+c2VhcmNoKCRtZXRob2RWYXJzKSkgeyAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJHJlc3VsdHNbInJlc3VsdHMiXTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbG9hZFlvdXR1YmUoJGtleXdvcmQpIHsKICAgICAgICAvLyBmZWVkIHVybAogICAgICAgICRmZWVkdXJsID0gJ2h0dHA6Ly9nZGF0YS55b3V0dWJlLmNvbS9mZWVkcy92aWRlb3M/dnE9JyAuIHVybGVuY29kZSgka2V5d29yZCkgLiAnJm1heC1yZXN1bHRzPScgLiAkdGhpcy0+bGltaXQgLiAnJnN0YXJ0LWluZGV4PTEnOwogICAgICAgICRyZXNwb25zZSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmZWVkdXJsKTsKCiAgICAgICAgLy8gZmVlZAogICAgICAgICRmZWVkID0gbmV3IFNpbXBsZVBpZSgpOwogICAgICAgICRmZWVkLT5zZXRfcmF3X2RhdGEoJHJlc3BvbnNlKTsKICAgICAgICAkZmVlZC0+ZW5hYmxlX2NhY2hlKGZhbHNlKTsKICAgICAgICAkZmVlZC0+ZW5hYmxlX29yZGVyX2J5X2RhdGUoZmFsc2UpOwogICAgICAgICRmZWVkLT5mb3JjZV9mZWVkKHRydWUpOwogICAgICAgICRmZWVkLT5zZXRfaXRlbV9saW1pdCgkdGhpcy0+bGltaXQpOwogICAgICAgICRmZWVkLT5pbml0KCk7CiAgICAgICAgJGZlZWQtPmhhbmRsZV9jb250ZW50X3R5cGUoJ3RleHQvcGxhaW4nKTsKICAgICAgICByZXR1cm4gJGZlZWQtPmdldF9pdGVtcygpOwogICAgfQoKfQoKLy9lbmQgY2xhc3MKPz4K]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IE1lZGlhQ2VudGVyCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL21lZGlhY2VudGVyLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgoKJGRiID0mICRnQ21zLT5HZXREYigpOwoKLy8gY3JlYXRlIGEgcGVybWlzc2lvbgokdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTW9kaWZ5IE1lZGlhIENlbnRlcicsICdNb2RpZnkgTWVkaWEgQ2VudGVyJyk7CgovLyBjcmVhdGUgYSBwcmVmZXJlbmNlCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCJjYWNoZV90aW1lb3V0IiwgMzYwMCoyNCk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ5b3V0dWJlX21heCIsIDIwKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoImJpbmdfbWF4IiwgMjApOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgibGFzdF9mbV9tYXgiLCAyMCk7CgoKIyBTZXR1cCB0ZW1wbGF0ZXMKJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ19uZXdfc2FtcGxlLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoTUVESUFDRU5URVJfUFJFRl9ORVdNRURJQUNFTlRFUl9URU1QTEFURSwkdGVtcGxhdGUpOwp9CgokZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCd0ZW1wbGF0ZXMnLCdvcmlnX3lvdXR1YmVfc2FtcGxlLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X1lvdXR1YmUnLCR0ZW1wbGF0ZSk7Cn0KCiRmbiA9IGNtc19qb2luX3BhdGgoZGlybmFtZShfX0ZJTEVfXyksJ3RlbXBsYXRlcycsJ29yaWdfYmluZ193ZWIudHBsJyk7CmlmKCBmaWxlX2V4aXN0cyggJGZuICkgKQp7CgkkdGVtcGxhdGUgPSBmaWxlX2dldF9jb250ZW50cyggJGZuICk7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2Rpc3BsYXlfQmluZ1dlYicsJHRlbXBsYXRlKTsKfQoKJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ19iaW5nX2ltYWdlLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X0JpbmdJbWFnZScsJHRlbXBsYXRlKTsKfQoKJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ19iaW5nX3ZpZGVvLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X0JpbmdWaWRlbycsJHRlbXBsYXRlKTsKfQokZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCd0ZW1wbGF0ZXMnLCdvcmlnX3R3aXR0ZXJfc2VhcmNoLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X1R3aXR0ZXInLCR0ZW1wbGF0ZSk7Cn0KJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ190d2l0dGVyX3R3ZWV0LnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X1R3ZWV0JywkdGVtcGxhdGUpOwp9CgokZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCd0ZW1wbGF0ZXMnLCdvcmlnX2xhc3RfZm1fYXJ0aXN0LnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X0xhc3RGTUFydGlzdCcsJHRlbXBsYXRlKTsKfQoKJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ19sYXN0X2ZtX3RyYWNrLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X0xhc3RGTVRyYWNrJywkdGVtcGxhdGUpOwp9CgovLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKJHRoaXMtPkF1ZGl0KCAwLAokdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksCiR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSApOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IE1lZGlhQ2VudGVyCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL21lZGlhY2VudGVyLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKJGRiID0mICRnQ21zLT5HZXREYigpOwoKLy8gcmVtb3ZlIHRoZSBwZXJtaXNzaW9ucwokdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignVXNlIE1lZGlhIENlbnRlcicpOwoKLy8gcmVtb3ZlIHRoZSBwcmVmZXJlbmNlDQoNCiR0aGlzLT5EZWxldGVUZW1wbGF0ZSgpOw0KJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoKTsNCgoKLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndW5pbnN0YWxsZWQnKSk7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghaXNzZXQoJGdDbXMpKQogICAgZXhpdDsKCiRjdXJyZW50X3ZlcnNpb24gPSAkb2xkdmVyc2lvbjsKJGRiID0gJiAkdGhpcy0+Y21zLT5HZXREYigpOwpzd2l0Y2ggKCRjdXJyZW50X3ZlcnNpb24pIHsKICAgIGNhc2UgIjAuMSI6CiAgICAgICAgJGN1cnJlbnRfdmVyc2lvbiA9ICIwLjIiOwogICAgY2FzZSAiMC4yIjoKICAgICAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgiY2FjaGVfZGlyIik7CiAgICAgICAgJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwgJ3RlbXBsYXRlcycsICdvcmlnX3R3aXR0ZXJfc2VhcmNoLnRwbCcpOwogICAgICAgIGlmIChmaWxlX2V4aXN0cygkZm4pKSB7CiAgICAgICAgICAgICR0ZW1wbGF0ZSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmbik7CiAgICAgICAgICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZGlzcGxheV9Ud2l0dGVyJywgJHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgICAgJGN1cnJlbnRfdmVyc2lvbiA9ICIwLjMiOwogICAgY2FzZSAiMC4zIjoKICAgICAgICAkZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCAndGVtcGxhdGVzJywgJ29yaWdfbGFzdF9mbV9hcnRpc3QudHBsJyk7CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmbikpIHsKICAgICAgICAgICAgJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoJGZuKTsKICAgICAgICAgICAgJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X0xhc3RGTUFydGlzdCcsICR0ZW1wbGF0ZSk7CiAgICAgICAgfQoKICAgICAgICAkZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCAndGVtcGxhdGVzJywgJ29yaWdfbGFzdF9mbV90cmFjay50cGwnKTsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZuKSkgewogICAgICAgICAgICAkdGVtcGxhdGUgPSBmaWxlX2dldF9jb250ZW50cygkZm4pOwogICAgICAgICAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2Rpc3BsYXlfTGFzdEZNVHJhY2snLCAkdGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgibGFzdF9mbV9tYXgiLCAyMCk7CiAgICAgICAgJGN1cnJlbnRfdmVyc2lvbiA9ICIwLjQiOwogICAgY2FzZSAiMC40IjoKICAgICAgICAkZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCAndGVtcGxhdGVzJywgJ29yaWdfdHdpdHRlcl90d2VldC50cGwnKTsKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZuKSkgewogICAgICAgICAgICAkdGVtcGxhdGUgPSBmaWxlX2dldF9jb250ZW50cygkZm4pOwogICAgICAgICAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2Rpc3BsYXlfVHdlZXQnLCAkdGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICAkY3VycmVudF92ZXJzaW9uID0gIjAuNSI7CiAgICAgICAgYnJlYWs7Cn0KPz4=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/add_edit.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydF9mb3JtfQo8ZGl2IGNsYXNzPSJmb3JtX3JvdyI+CiAgIDxzcGFuIGNsYXNzPSJmaWVsZF90aXRsZSI+eyR0aXRsZV9kZXNjcmlwdGlvbn08L3NwYW4+CiAgIDxzcGFuIGNsYXNzPSJmaWVsZF9pbnB1dCI+eyRpbnB1dF9kZXNjcmlwdGlvbn08L3NwYW4+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJmb3JtX3JvdyI+CiAgIDxzcGFuIGNsYXNzPSJmaWVsZF90aXRsZSI+PC9zcGFuPgogICA8c3BhbiBjbGFzcz0iZmllbGRfaW5wdXQiPnskc3VibWl0fTwvc3Bhbj4KPC9kaXY+CnskZW5kX2Zvcm19]]></data>
	</file>
	<file>
	  <filename>/templates/orig_bing_image.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0iYmluZ2ltYWdlIj4NCiAgICA8aDM+QmluZyBJbWFnZXM6IHska2V5d29yZH0gKHskcmVzdWx0c314KTwvaDM+DQp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPSdtZWRpYSd9DQogICAgPGg0PjxhIGhyZWY9InskbWVkaWEtPk1lZGlhVXJsfSI+eyRtZWRpYS0+VGl0bGV9PC9hPiAoPGEgaHJlZj0ieyRtZWRpYS0+VXJsfSI+eyRtZWRpYS0+RGlzcGxheVVybH08L2E+KTwvaDQ+DQogICAgPHA+DQogICAgICAgIDxhIGhyZWY9InskbWVkaWEtPk1lZGlhVXJsfSI+PGltZyBzcmM9InskbWVkaWEtPlRodW1ibmFpbC0+VXJsfSIgc3R5bGU9IndpZHRoOnskbWVkaWEtPlRodW1ibmFpbC0+V2lkdGh9cHg7aGVpZ2h0OnskbWVkaWEtPlRodW1ibmFpbC0+SGVpZ2h0fXB4OyIgYWx0PSJ7JG1lZGlhLT5UaXRsZX0iIC8+PC9hPg0KICAgICAgICA8YnIgLz4NCnskbWVkaWEtPlRodW1ibmFpbC0+RmlsZVNpemV9Jm5ic3A7a0INCiAgICA8L3A+DQp7L2ZvcmVhY2h9DQo8L2Rpdj4NCg0KeyoNCnBhcmFtcw0KDQpbVGl0bGVdDQpbTWVkaWFVcmxdDQpbVXJsXQ0KW0Rpc3BsYXlVcmxdDQpbV2lkdGhdDQpbSGVpZ2h0XQ0KW0ZpbGVTaXplXQ0KW0NvbnRlbnRUeXBlXQ0KW1RodW1ibmFpbF0gPT4gc3RkQ2xhc3MgT2JqZWN0DQogICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICBbVXJsXQ0KICAgICAgICAgICAgICAgICAgICBbQ29udGVudFR5cGVdDQogICAgICAgICAgICAgICAgICAgIFtXaWR0aF0NCiAgICAgICAgICAgICAgICAgICAgW0hlaWdodF0NCiAgICAgICAgICAgICAgICAgICAgW0ZpbGVTaXplXQ0KICAgICAgICAgICAgICAgICkNCg0KDQoqfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/orig_bing_video.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0iYmluZ3ZpZGVvIj4NCiAgICA8aDM+QmluZyBWaWRlbzogeyRrZXl3b3JkfSAoeyRyZXN1bHRzfXgpPC9oMz4NCntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09J21lZGlhJ30NCiAgICA8aDQ+PGEgaHJlZj0ieyRtZWRpYS0+Q2xpY2tUaHJvdWdoUGFnZVVybH0iPnskbWVkaWEtPlRpdGxlfTwvYT4gKDxhIGhyZWY9InskbWVkaWEtPlBsYXlVcmx9Ij57JG1lZGlhLT5Tb3VyY2VUaXRsZX08L2E+KTwvaDQ+DQogICAgPHA+DQogICAgICAgIDxhIGhyZWY9InskbWVkaWEtPkNsaWNrVGhyb3VnaFBhZ2VVcmx9Ij48aW1nIHNyYz0ieyRtZWRpYS0+U3RhdGljVGh1bWJuYWlsLT5Vcmx9IiBzdHlsZT0id2lkdGg6eyRtZWRpYS0+U3RhdGljVGh1bWJuYWlsLT5XaWR0aH1weDtoZWlnaHQ6eyRtZWRpYS0+U3RhdGljVGh1bWJuYWlsLT5oZWlnaHR9cHg7IiBhbHQ9InskbWVkaWEtPlRpdGxlfSIgLz48L2E+DQogICAgICAgIDxiciAvPg0KeyRtZWRpYS0+UnVuVGltZX0mbmJzcDtzDQogICAgPC9wPg0Key9mb3JlYWNofQ0KPC9kaXY+DQp7Kg0KcGFyYW1zDQoNClRpdGxlDQpQbGF5VXJsDQpTb3VyY2VUaXRsZQ0KUnVuVGltZQ0KQ2xpY2tUaHJvdWdoUGFnZVVybA0KU3RhdGljVGh1bWJuYWlsDQooDQpVcmwNCkNvbnRlbnRUeXBlDQpXaWR0aA0KSGVpZ2h0DQpGaWxlU2l6ZQ0KKQ0KKn0=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_bing_web.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0iYmluZ3dlYiI+DQo8aDM+QmluZyBXZWI6IHska2V5d29yZH0gKHskcmVzdWx0c314KTwvaDM+DQp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPSdtZWRpYSd9DQo8aDQ+PGEgaHJlZj0ieyRtZWRpYS0+VXJsfSI+eyRtZWRpYS0+VGl0bGV9PC9hPiAoPGEgaHJlZj0ieyRtZWRpYS0+VXJsfSI+eyRtZWRpYS0+RGlzcGxheVVybH08L2E+KTwvaDQ+DQo8cD4NCgl7JG1lZGlhLT5EZXNjcmlwdGlvbn0NCjwvcD4NCnsvZm9yZWFjaH0NCjwvZGl2Pg0KDQp7Kg0KcGFyYW1zDQpUaXRsZQ0KRGVzY3JpcHRpb24NClVybA0KQ2FjaGVVcmwNCkRpc3BsYXlVcmwNCkRhdGVUaW1lDQoqfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/orig_last_fm_artist.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0ibGFzdGZtIj4NCiAgICA8aDM+TGFzdC5GTSBhcnRpc3RzOiB7JGtleXdvcmR9ICh7JHJlc3VsdHN9eCk8L2gzPg0Ke2ZvcmVhY2ggZnJvbT0kaXRlbXMgaXRlbT0nbWVkaWEnfQ0KICAgIDxoND48YSBocmVmPSJ7JG1lZGlhLnVybH0iPnskbWVkaWEubmFtZX08L2E+PC9oND4NCiAgICB7aWYgJG1lZGlhLmltYWdlLmxhcmdlfQ0KICAgICAgICA8cD4NCiAgICAgICAgICAgIDxpbWcgc3JjPSJ7JG1lZGlhLmltYWdlLmxhcmdlfSIgYWx0PSJ7JG1lZGlhLm5hbWV9IiAvPg0KICAgICAgICA8L3A+DQogICAgey9pZn0NCnsvZm9yZWFjaH0NCjwvZGl2Pg0KDQp7Kg0KW25hbWVdDQpbbWJpZF0gPT4gN2YzOTE5OWItNTlhYy00ZWJmLTljMDAtZWY1NDJiN2IyOTA3DQpbdXJsXQ0KW3N0cmVhbWFibGVdDQpbaW1hZ2VdDQogICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICBbc21hbGxdDQogICAgICAgICAgICAgICAgICAgIFtsYXJnZV0NCiAgICAgICAgICAgICAgICApDQoNCg0KKn0=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_last_fm_track.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0ibGFzdGZtIj4NCiAgICA8aDM+TGFzdC5GTSB0cmFja3M6IHska2V5d29yZH0gKHskcmVzdWx0c314KTwvaDM+DQp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPSdtZWRpYSd9DQogICAgPGg0PjxhIGhyZWY9InskbWVkaWEudXJsfSI+eyRtZWRpYS5hcnRpc3R9IC0geyRtZWRpYS5uYW1lfTwvYT48L2g0Pg0KICAgIHtpZiAkbWVkaWEuaW1hZ2UubGFyZ2V9DQogICAgPHA+DQogICAgICAgIDxpbWcgc3JjPSJ7JG1lZGlhLmltYWdlLmxhcmdlfSIgYWx0PSJ7JG1lZGlhLm5hbWV9IiAvPg0KICAgIDwvcD4NCiAgICB7L2lmfQ0Key9mb3JlYWNofQ0KPC9kaXY+DQoNCnsqDQpbbmFtZV0NClthcnRpc3RdDQpbdXJsXSA9PiBodHRwOi8vd3d3Lmxhc3QuZm0vbXVzaWMvRW1pbmVtL18vTG9zZStZb3Vyc2VsZg0KW3N0cmVhbWFibGVdDQpbZnVsbHRyYWNrXQ0KW2xpc3RlbmVyc10NCltpbWFnZV0gPT4gQXJyYXkNCiAgICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgICAgIFtzbWFsbF0NCiAgICAgICAgICAgICAgICAgICAgW21lZGl1bV0NCiAgICAgICAgICAgICAgICAgICAgW2xhcmdlXSANCiAgICAgICAgICAgICAgICApDQoNCip9]]></data>
	</file>
	<file>
	  <filename>/templates/orig_new_sample.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyoNCnska2V5d29yZH0NCnskcmVzdWx0c30NCg0Ke2ZvcmVhY2ggZnJvbT0kaXRlbXMgaXRlbT0nbWVkaWEnfQ0KDQp7JG1lZGlhLT50aXRsZX0NCnskbWVkaWEtPnVybH0NCg0Key9mb3JlYWNofQ0KDQpldGMuDQoNCnskaXRlbXN8cHJpbnRfcn0gdG8gc2VlIHRoZSBhdmFpbGFibGUgcGFyYW1ldGVycw0KDQoqfQ0KDQo=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_twitter_search.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0idHdpdHRlciI+DQo8aDM+VHdpdHRlcjogeyRrZXl3b3JkfSAoeyRyZXN1bHRzfXgpPC9oMz4NCntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09J21lZGlhJ30NCjxwPnskbWVkaWEtPnRleHR9PC9wPg0KPGEgaHJlZj0iaHR0cDovL3R3aXR0ZXIuY29tL3skbWVkaWEtPmZyb21fdXNlcn0vc3RhdHVzL3skbWVkaWEtPmlkfSI+eyRtZWRpYS0+Y3JlYXRlZF9hdHxjbXNfZGF0ZV9mb3JtYXR9PC9hPiB7JG1lZGlhLT5zb3VyY2V8aHRtbHNwZWNpYWxjaGFyc308L2g0Pg0Key9mb3JlYWNofQ0KPC9kaXY+DQoNCnsqDQpwcm9maWxlX2ltYWdlX3VybA0KY3JlYXRlZF9hdA0KZnJvbV91c2VyXQ0KbWV0YWRhdGEgPT4gc3RkQ2xhc3MgT2JqZWN0IFtyZXN1bHRfdHlwZV0NCnRvX3VzZXJfaWQNCnRleHQNCmlkDQpmcm9tX3VzZXJfaWQNCmdlbw0KaXNvX2xhbmd1YWdlX2NvZGUNCnNvdXJjZQ0KKn0=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_twitter_tweet.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0idHdlZXQiPg0KeyR0d2VldC0+dGV4dHx1cmx0d2VldH0NCjxwPg0KPGEgcmVsPSJub2ZvbGxvdyIgaHJlZj0iaHR0cDovL3R3aXR0ZXIuY29tL3skdHdlZXQtPnVzZXItPnNjcmVlbl9uYW1lfSI+PHN0cm9uZz5AeyR0d2VldC0+dXNlci0+c2NyZWVuX25hbWV9PC9zdHJvbmc+PC9hPiANCi8gPGEgcmVsPSJub2ZvbGxvdyIgaHJlZj0iaHR0cDovL3R3aXR0ZXIuY29tL3skdHdlZXQtPnVzZXItPnNjcmVlbl9uYW1lfS9zdGF0dXMveyR0d2VldC0+aWRfc3RyfSI+eyR0d2VldC0+Y3JlYXRlZF9hdHxjbXNfZGF0ZV9mb3JtYXR9IHskdHdlZXQtPmNyZWF0ZWRfYXR8ZGF0ZV9mb3JtYXQ6IiVIOiVNIn0gdmlhIFR3aXR0ZXI8L2E+PC9wPg0KDQp7Kg0KJHR3ZWV0fHByaW50X3INCip9DQo8L2Rpdj4NCg==]]></data>
	</file>
	<file>
	  <filename>/templates/orig_youtube_sample.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPllvdXR1YmU6IHska2V5d29yZH0gKHskcmVzdWx0c314KTwvaDM+DQp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPSdtZWRpYSd9DQo8ZGl2IGNsYXNzPSJ5b3V0dWJlIj4NCntpZiAkbWVkaWEtPnRodW1ibmFpbH0NCjxwPjxhIGhyZWY9InskbWVkaWEtPmxpbmt9Ij48aW1nIHNyYz0ieyRtZWRpYS0+dGh1bWJuYWlsfSINCglhbHQ9InskbWVkaWEtPnRpdGxlfSIgLz48L2E+IDxiciAvPg0KeyRtZWRpYS0+bGVuZ2h0fGRhdGVfZm9ybWF0OiclbTpzJ308L3A+DQp7L2lmfQ0KPGg0PjxhIGhyZWY9InskbWVkaWEtPmxpbmt9IiByZWw9Im5vZm9sbG93Ij57JG1lZGlhLT50aXRsZX08L2E+PC9oND4NCjxvYmplY3QgaGVpZ2h0PSIzNDQiIHdpZHRoPSI0MjUiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIg0KCWlkPSJteXl0cGxheWVyIg0KCWRhdGE9Imh0dHA6Ly93d3cueW91dHViZS5jb20vdi97JG1lZGlhLT52aWRlb19pZH0iPg0KCTxwYXJhbSBuYW1lPSJhbGxvd1NjcmlwdEFjY2VzcyIgdmFsdWU9ImFsd2F5cyIgLz4NCgk8cGFyYW0gdmFsdWU9Imh0dHA6Ly93d3cueW91dHViZS5jb20vdi97JG1lZGlhLT52aWRlb19pZH0iDQoJCW5hbWU9Im1vdmllIiAvPg0KPC9vYmplY3Q+DQp7L2ZvcmVhY2h9DQo8L2Rpdj4=]]></data>
	</file>
	<file>
	  <filename>/templates/prefs.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19DQo8ZmllbGRzZXQ+DQo8bGVnZW5kPnskY2FjaGV9PC9sZWdlbmQ+DQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9jYWNoZV90aW1lb3V0fTwvcD4NCiAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfY2FjaGVfdGltZW91dH08L3A+DQo8L2Rpdj4NCjwvZmllbGRzZXQ+DQo8ZmllbGRzZXQ+DQo8bGVnZW5kPnskdGl0bGVfeW91dHViZX08L2xlZ2VuZD4NCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3lvdXR1YmVfbWF4fTwvcD4NCiAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfeW91dHViZV9tYXh9PC9wPg0KPC9kaXY+DQo8L2ZpZWxkc2V0Pg0KPGZpZWxkc2V0Pg0KPGxlZ2VuZD57JHRpdGxlX2Jpbmd9PC9sZWdlbmQ+DQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9iaW5nX2FwaV9rZXl9PC9wPg0KICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9iaW5nX2FwaV9rZXl9PC9wPg0KPC9kaXY+DQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9iaW5nX21heH08L3A+DQogICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2JpbmdfbWF4fTwvcD4NCjwvZGl2Pg0KPC9maWVsZHNldD4NCg0KPGZpZWxkc2V0Pg0KPGxlZ2VuZD57JG1vZC0+TGFuZygnbGFzdF9mbScpfTwvbGVnZW5kPg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRtb2QtPkxhbmcoJ2JpbmdfYXBpX2tleScpfTwvcD4NCiAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbGFzdF9mbV9hcGlfa2V5fTwvcD4NCjwvZGl2Pg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRtb2QtPkxhbmcoJ2xhc3RfZm1fbWF4Jyl9PC9wPg0KICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9sYXN0X2ZtX21heH08L3A+DQo8L2Rpdj4NCjwvZmllbGRzZXQ+DQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij48L3A+DQogICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JHN1Ym1pdH08L3A+DQo8L2Rpdj4NCnskZW5kZm9ybX0=]]></data>
	</file>
</module>
