<?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>CMSForms</name>
	<version>0.0.3</version>
  <mincmsversion>1.8.2</mincmsversion>
	<help><![CDATA[PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgJmx0O2N5YmVydG90b3BoZUBnbWFpbC5jb20mZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4wLjM8YnIgLz4=]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/CMSForms.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCglNb2R1bGU6IENNUyBGb3JtcyAtIFRoaXMgbW9kdWxlIGhlbHBzIGRldmVsb3BlcnMgdG8gaGFuZGxlIGZvcm1zIGZvciB0aGVpciBmcm9udGVuZCBvciBiYWNrZW5kIGFwcGxpY2F0aW9ucwoJCglDb3B5cmlnaHRzOiBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgLSBNb3JyaXMgJiBDaGFwbWFuIEJlbGdpdW0gLSAyMDEwIMKpCiovCgpyZXF1aXJlX29uY2UgZGlybmFtZShfX0ZJTEVfXykgLiAnL2xpYi9jbGFzc2VzL0NNU0Zvcm0uY2xhc3MucGhwJzsKCmNsYXNzIENNU0Zvcm1zIGV4dGVuZHMgQ01TTW9kdWxlCnsKCXB1YmxpYyBmdW5jdGlvbiBHZXROYW1lKCkJCQkJewlyZXR1cm4gJ0NNU0Zvcm1zJzsJIH0KCXB1YmxpYyBmdW5jdGlvbiBHZXRWZXJzaW9uKCkgICAgICAgICAgIAl7IHJldHVybiAnMC4wLjMnOyB9CglwdWJsaWMgZnVuY3Rpb24gR2V0QXV0aG9yKCkgICAgICAgICAgICAJeyByZXR1cm4gJ0plYW4tQ2hyaXN0b3BoZSBDdXZlbGllcic7IH0KCXB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpICAgICAgIAl7IHJldHVybiAnY3liZXJ0b3RvcGhlQGdtYWlsLmNvbSc7IH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRsYW5nID0gYXJyYXkoCgkKCQoJCgkKCQovLyBFeGNlcHRpb25zCgonZmllbGRfaXNfZW1wdHknID0+ICdUaGUgZmllbGQgJXMgaXMgZW1wdHkuJywJCidmaWVsZF9jYW5ub3RfYmVfZW1wdHknID0+ICdUaGUgZmllbGQgJXMgY2Fubm90IGJlIGVtcHR5LicsCQondW5rbm93biBmaWVsZCcgPT4gJ1Vua25vd24gZmllbGQgIiVzIicsCidmaWVsZHMgbm90IGVxdWFsJyA9PiAnVGhlICVzIGFuZCAlcyBoYXZlIHRvIGJlIHRoZSBzYW1lLicsCidpbnZhbGlkIGVtYWlsJyA9PiAnVGhlIGVtYWlsICZsYXF1bzslcyZyYXF1bzsgaXMgbm90IHZhbGlkLicsCidmaWVsZCBub3QgdW5pcXVlJyA9PiAnJXMgYWxyZWFkeSBleGlzdHMuJwoJCgkKCQoJCgkKCQopOw==]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/classes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/classes/CMSForm.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCgkvKgoJCVRoaXMgY2xhc3MgYWltIHRvIGhhbmRsZSBDTVMgRm9ybXMgdmVyeSBkaWZmZXJlbnRseS4KCQkKCQlBdXRob3I6IEplYW4tQ2hyaXN0b3BoZSBDdXZlbGllciA8Y3liZXJ0b3RvcGhlQGdtYWlsLmNvbT4KCQlDb3B5cmlnaHRzOiBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgLSBNb3JyaXMgJiBDaGFwbWFuIEJlbGdpdW0gLSAyMDEwCgkJTGljZW5jZTogR1BMCQkKCQoJKi8KCmNsYXNzIENNU0Zvcm0JZXh0ZW5kcwlDbXNPYmplY3QKewoJY29uc3QgVkVSU0lPTiA9ICcwLjAuNic7CgkKCXByb3RlY3RlZCAkbW9kdWxlX25hbWU7Cglwcm90ZWN0ZWQgJGlkOyAvLyBUaGUgZm9ybSBJRAoJcHJvdGVjdGVkICRyZXR1cm5pZDsKCXByb3RlY3RlZCAkYWN0aW9uOwkKCXByb3RlY3RlZCAkbWV0aG9kID0gJ2dldCc7Cglwcm90ZWN0ZWQgJGVuY3R5cGU7CgkKCXByb3RlY3RlZCAkd2lkZ2V0cyA9IGFycmF5KCk7IC8vIFRoZSBmb3JtIHdpZGdldHMKCXByb3RlY3RlZCAkaGlkZGVuX3dpZGdldHMgPSBhcnJheSgpOyAvLyBTcGVjaWZpYyB3aWRnZXRzIHNob3duIG9uIHRoZSBiZWdpbjsKCQoJcHJvdGVjdGVkICRsYWJlbHMgPSBhcnJheSgKCQknc3VibWl0JyA9PiAnU3VibWl0JywKCQknYXBwbHknID0+ICdBcHBseScsCgkJJ2NhbmNlbCcgPT4gJ0NhbmNlbCcsCgkJJ25leHQnID0+ICdOZXh0JywKCQkncHJldmlvdXMnID0+ICdQcmV2aW91cycKCQkpOwoJCQoJcHJvdGVjdGVkICRhY3RpdmVfYnV0dG9ucyA9IGFycmF5KCdjYW5jZWwnLCdzdWJtaXQnKTsKCXByb3RlY3RlZCAkZm9ybV9lcnJvcnMgPSBhcnJheSgpOyAKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtb2R1bGVfbmFtZSwgJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQpCgl7CgkJJHRoaXMtPm1vZHVsZV9uYW1lID0gJG1vZHVsZV9uYW1lOwoJCSR0aGlzLT5pZCA9ICRpZDsKCQkkdGhpcy0+cmV0dXJuaWQgPSAkcmV0dXJuaWQ7CgkJJHRoaXMtPmFjdGlvbiA9ICRhY3Rpb247Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRNdWx0aXBhcnRGb3JtKCkKCXsKCQkkdGhpcy0+bWV0aG9kID0gJ3Bvc3QnOwoJCSR0aGlzLT5lbmN0eXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGEnOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcygpCgl7CgkJZm9yZWFjaCgkdGhpcy0+d2lkZ2V0cyBhcyAkd2lkZ2V0KQoJCXsKCQkJJHdpZGdldC0+cHJvY2VzcygpOwoJCX0KCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcnMoKQoJewoJCWdsb2JhbCAkZ0NtczsKCQlpZiAoaXNzZXQoJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10pKQoJCXsJCQkKCQkJJGh0bWwgPSAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+Q3JlYXRlRm9ybVN0YXJ0KCR0aGlzLT5pZCwgJHRoaXMtPmFjdGlvbiwgJHRoaXMtPnJldHVybmlkLCAkdGhpcy0+bWV0aG9kLCAkdGhpcy0+ZW5jdHlwZSk7CgkJCWZvcmVhY2goJHRoaXMtPmhpZGRlbl93aWRnZXRzIGFzICR3aWRnZXQpCgkJCXsKCQkJCSRodG1sIC49ICR3aWRnZXQ7CgkJCX0JCQkKCQkJcmV0dXJuICRodG1sOwoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldEZvb3RlcnMoKQoJewoJCWdsb2JhbCAkZ0NtczsKCQlpZiAoaXNzZXQoJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10pKQoJCXsJCQkKCQkJJGh0bWwgPSAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+Q3JlYXRlRm9ybUVuZCgpOwoJCQlyZXR1cm4gJGh0bWw7CgkJfQoJCXJldHVybiBudWxsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gc2V0TGFiZWwoJGxhYmVsLCAkdGl0bGUpCgl7CgkJJHRoaXMtPmxhYmVsc1skbGFiZWxdID0gJHRpdGxlOwoJfQoJCgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRCdXR0b25zKCRidXR0b25zID0gYXJyYXkoKSkKCXsKCQlpZiAoaXNfYXJyYXkoJGJ1dHRvbnMpKQkkdGhpcy0+YWN0aXZlX2J1dHRvbnMgPSAkYnV0dG9uczsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldEJ1dHRvbnMoKQoJewoJCWdsb2JhbCAkZ0NtczsKCQkkaHRtbCA9ICcnOwoJCWZvcmVhY2goJHRoaXMtPmFjdGl2ZV9idXR0b25zIGFzICRidXR0b24pCgkJewoJCQkkaHRtbCAuPSAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+Q3JlYXRlSW5wdXRTdWJtaXQoJHRoaXMtPmlkLCAkYnV0dG9uLCAkdGhpcy0+bGFiZWxzWyRidXR0b25dKTsKCQl9CgkJCgkJcmV0dXJuICRodG1sOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gc2V0V2lkZ2V0KCRuYW1lLCR0eXBlLCRzZXR0aW5ncyA9IGFycmF5KCkpCgl7CgkJJHdpZGdldCA9IG5ldyBDTVNGb3JtV2lkZ2V0KCYkdGhpcywkdGhpcy0+aWQsJHRoaXMtPm1vZHVsZV9uYW1lLCRuYW1lLCR0eXBlLCRzZXR0aW5ncyk7CgkJaWYgKCR0eXBlID09ICdoaWRkZW4nKQoJCXsKCQkJJHRoaXMtPmhpZGRlbl93aWRnZXRzWyRuYW1lXSA9ICR3aWRnZXQ7CgkJfQoJCWVsc2VpZiAoJHR5cGUgPT0gJ2ZpbGUnKQoJCXsKCQkJJHRoaXMtPnNldE11bHRpcGFydEZvcm0oKTsgLy8gSWYgd2UgYWRkIGZpbGVzLCB3ZSBoYXZlIHRvIGJlIHBvc3RlZCBtdWx0aXBhcnQgZm9ybXMuLi4KCQkJJHRoaXMtPndpZGdldHNbJG5hbWVdID0gJHdpZGdldDsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPndpZGdldHNbJG5hbWVdID0gJHdpZGdldDsKCQl9Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRXaWRnZXRzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPndpZGdldHM7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRXaWRnZXQoJG5hbWUpCgl7CgkJaWYgKGlzc2V0KCR0aGlzLT53aWRnZXRzWyRuYW1lXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPndpZGdldHNbJG5hbWVdOwoJCX0KCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5oaWRkZW5fd2lkZ2V0c1skbmFtZV0pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5oaWRkZW5fd2lkZ2V0c1skbmFtZV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCQoJcHVibGljIGZ1bmN0aW9uIHNob3dXaWRnZXRzKCR0ZW1wbGF0ZT1udWxsKQoJewoJCSRodG1sID0gJyc7CgkJZm9yZWFjaCgkdGhpcy0+d2lkZ2V0cyBhcyAkd2lkZ2V0KQoJCXsKCQkJJGh0bWwgLj0gJHdpZGdldC0+c2hvdygkdGVtcGxhdGUpOwoJCX0KCQlyZXR1cm4gJGh0bWw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBoYXNFcnJvcnMoKQoJewoJCSRoYXNfZXJyb3JzID0gZmFsc2U7CgkJCgkJZm9yZWFjaCgkdGhpcy0+d2lkZ2V0cyBhcyAkd2lkZ2V0KQoJCXsKCQkJaWYoJHdpZGdldC0+aGFzRXJyb3JzKCkpCgkJCXsKCQkJCSRoYXNfZXJyb3JzID0gdHJ1ZTsKCQkJfQoJCX0KCQkKCQkKCQlmb3JlYWNoKCR0aGlzLT5oaWRkZW5fd2lkZ2V0cyBhcyAkd2lkZ2V0KQoJCXsKCQkJaWYoJHdpZGdldC0+aGFzRXJyb3JzKCkpCgkJCXsKCQkJCSRoYXNfZXJyb3JzID0gdHJ1ZTsKCQkJfQoJCX0KCQkKCQlpZiAoY291bnQoJHRoaXMtPmZvcm1fZXJyb3JzKSAhPSAwKQoJCXsKCQkJJGhhc19lcnJvcnMgPSB0cnVlOwoJCX0KCQkKCQlyZXR1cm4gJGhhc19lcnJvcnM7IAoJfQoJCglwdWJsaWMgZnVuY3Rpb24gbm9FcnJvcigpCgl7CgkJcmV0dXJuICEkdGhpcy0+aGFzRXJyb3JzKCk7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKQoJewoJCXJldHVybiAkdGhpcy0+Zm9ybV9lcnJvcnM7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzaG93RXJyb3JzKCkKCXsKCQkkaHRtbCA9ICcnOwoJCWlmKGNvdW50KCR0aGlzLT5mb3JtX2Vycm9ycykgPiAwKQoJCXsKCQkJJGh0bWwgLj0gJzx1bCBjbGFzcz0iZXJyb3JzIj4nOwoJCQlmb3JlYWNoKCR0aGlzLT5mb3JtX2Vycm9ycyBhcyAkcHJpb3JpdHkgPT4gJGVycm9ycykKCQkJewoJCQkJJGh0bWwgLj0gJzxsaT48ZW0gY2xhc3M9ImZvcm1fZXJyb3JfcHJpb3JpdHkiPicuJHByaW9yaXR5Lic8L2VtPjx1bD4nOwoJCQkJZm9yZWFjaCgkZXJyb3JzIGFzICRlcnJvcikKCQkJCXsKCQkJCQkkaHRtbCAuPSAnPGxpPicuJGVycm9yLic8L2xpPic7CgkJCQl9CQkJCQoJCQkJJGh0bWwgLj0gJzwvdWw+PC9saT4nOwoJCQl9CgkJCSRodG1sIC49ICc8L3VsPic7CgkJfQoJCXJldHVybiAkaHRtbDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIHNldEVycm9yKCRtZXNzYWdlLCRwcmlvcml0eT0nZGVmYXVsdCcpCgl7CgkJJHRoaXMtPmZvcm1fZXJyb3JzWyRwcmlvcml0eV1bXSA9ICRtZXNzYWdlOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gaXNTdWJtaXR0ZWQoKQoJewoJCWlmIChpc3NldCgkX1JFUVVFU1RbJHRoaXMtPmlkLidzdWJtaXQnXSkpCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gaXNBcHBsaWVkKCkKCXsKCQlpZiAoaXNzZXQoJF9SRVFVRVNUWyR0aGlzLT5pZC4nYXBwbHknXSkpCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQkKCQoJcHVibGljIGZ1bmN0aW9uIGlzQ2FuY2VsbGVkKCkKCXsKCQlpZiAoaXNzZXQoJF9SRVFVRVNUWyR0aGlzLT5pZC4nY2FuY2VsJ10pKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gaXNQb3N0ZWQoKQoJewoJCS8vIEFkZCBjaGVjayBmb3IgbmV4dCBhbmQgcHJldmlvdXMKCQlpZiAoJHRoaXMtPmlzU3VibWl0dGVkKCkgfHwgJHRoaXMtPmlzQXBwbGllZCgpKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KfQoKY2xhc3MgQ01TRm9ybVdpZGdldAlleHRlbmRzIENtc09iamVjdAp7Cglwcm90ZWN0ZWQgJGlkOyAvLyBUaGUgZm9ybSBJRAoJcHJvdGVjdGVkICRtb2R1bGVfbmFtZTsKCXByb3RlY3RlZCAkbmFtZTsgLy8gVGhlIGlucHV0IG5hbWUKCXByb3RlY3RlZCAkdHlwZTsKCXByb3RlY3RlZCAkaW5wdXQ7Cglwcm90ZWN0ZWQgJHZhbHVlcyA9IGFycmF5KCk7Cglwcm90ZWN0ZWQgJHNldHRpbmdzID0gYXJyYXkoKTsKCXByb3RlY3RlZCAkZm9ybV9lcnJvcnM7Cglwcm90ZWN0ZWQgJHZhbGlkYXRpb25zID0gYXJyYXkoKTsKCXByb3RlY3RlZCAkc2hvd25lZCA9IGZhbHNlOwoJcHJvdGVjdGVkICRmb3JtOwoJCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJiRmb3JtLCAkaWQsICRtb2R1bGVfbmFtZSwgJG5hbWUsICR0eXBlLCRzZXR0aW5ncz1hcnJheSgpKQoJewoJCSR0aGlzLT5mb3JtID0gJiRmb3JtOwoJCSR0aGlzLT5pZCA9ICRpZDsKCQkkdGhpcy0+bW9kdWxlX25hbWUgPSAkbW9kdWxlX25hbWU7CgkJJHRoaXMtPm5hbWUgPSAkbmFtZTsKCQkkdGhpcy0+dHlwZSA9ICR0eXBlOwoJCSR0aGlzLT5zZXR0aW5ncyA9ICRzZXR0aW5nczsKCQkkdGhpcy0+aW5pdFZhbHVlcygpOwoJfQoJCQoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoKQoJewoJCS8vIFZhbGlkYXRlCgkJJHZhbGlkID0gdHJ1ZTsKCQlpZiAoaXNzZXQoJHRoaXMtPnNldHRpbmdzWyd2YWxpZGF0b3JzJ10pKQoJCXsKCQkJZm9yZWFjaCAoJHRoaXMtPnNldHRpbmdzWyd2YWxpZGF0b3JzJ10gYXMgJHZhbGlkYXRvciA9PiAkdmFsdWUpCgkJCXsKCQkJCSR2YWxpZGF0ZSA9IG5ldyBDTVNGb3JtVmFsaWRhdG9yKCYkdGhpcywkdmFsaWRhdG9yLCR2YWx1ZSk7CgkJCQl0cnkKCQkJCXsKCQkJCQlpZigkdmFsaWRhdGUtPmNoZWNrKCkgPT09IGZhbHNlKSAkdmFsaWQgPSBmYWxzZTsKCQkJCX0KCQkJCWNhdGNoKEV4Y2VwdGlvbiAkZSkKCQkJCXsKCQkJCQkkdGhpcy0+c2V0RXJyb3IoJGUtPmdldE1lc3NhZ2UoKSwgJ2Zvcm0gZXJyb3InKTsKCQkJCX0KCQkJCQoJCQl9CgkJfQoJCQoJCS8vIFNhdmUgdmFsdWUKCQlpZiggJHZhbGlkID09IHRydWUKCQkJJiYKCQkJKChpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddKSkKCQkJfHwKCQkJKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1sncHJlZmVyZW5jZSddKSkpCgkJKQoJCXsKCQkJJHRoaXMtPnNhdmVWYWx1ZXMoKTsKCQl9Cgl9CgkJCglwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJaWYgKCR0aGlzLT50eXBlID09ICdoaWRkZW4nKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5nZXRJbnB1dCgpOwoJCX0KCQllbHNlCgkJewoJCQkkaHRtbCA9ICcKCQkJPGRpdiBjbGFzcz0iZm9ybV93aWRnZXQiPgoJCQkJPGRpdiBjbGFzcz0iZm9ybV9sYWJlbCI+PGxhYmVsIGZvcj0iJy4kdGhpcy0+aWQuJHRoaXMtPm5hbWUuJyI+Jy4kdGhpcy0+Z2V0TGFiZWwoKS4nPC9sYWJlbD48L2Rpdj4nOwkJCQkJCQoJCQlpZiAoY291bnQoJHRoaXMtPmZvcm1fZXJyb3JzKSkKCQkJewoJCQkJJGh0bWwgLj0gJzxkaXYgY2xhc3M9ImZvcm1fZXJyb3JzIj4nIC4gJHRoaXMtPnNob3dFcnJvcnMoKSAuICc8L2Rpdj4nOwoJCQl9CQkJCQoJCQkkaHRtbCAuPSAnCgkJCQk8ZGl2IGNsYXNzPSJmb3JtX2lucHV0Ij4nLiR0aGlzLT5nZXRJbnB1dCgpLic8L2Rpdj4KCQkJPC9kaXY+JzsKCQkJcmV0dXJuICRodG1sOwoJCX0KCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQoJewoJCXJldHVybiAkdGhpcy0+bmFtZTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldEZvcm0oKQoJewoJCWlmKCFpc19vYmplY3QoJHRoaXMtPmZvcm0pKQoJCXsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQW4gZXJyb3Igb2NjdXJlZCByZXRyaWV2aW5nIHRoZSBmb3JtIG9iamVjdC4nKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5mb3JtOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gc2hvdygkdGVtcGxhdGUgPSBudWxsLCAkZm9yY2UgPSBmYWxzZSkKCXsKCQlpZiAoISR0aGlzLT5zaG93bmVkIHx8ICRmb3JjZSkKCQl7CgkJCSRodG1sID0gJyc7CgkJCWlmICghaXNfbnVsbCgkdGVtcGxhdGUpKQoJCQl7CgkJCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCclTEFCRUwlJywgJHRoaXMtPmdldExhYmVsKCksICR0ZW1wbGF0ZSk7CgkJCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCclSU5QVVQlJywgJHRoaXMtPmdldElucHV0KCksICR0ZXh0KTsKCQkJCSR0ZXh0ID0gc3RyX3JlcGxhY2UoJyVFUlJPUlMlJywgJHRoaXMtPnNob3dFcnJvcnMoKSwgJHRleHQpOwoJCQkJJHRleHQgPSBzdHJfcmVwbGFjZSgnJVRJUFMlJywgJHRoaXMtPmdldFRpcHMoKSwgJHRleHQpOwoJCQkJJGh0bWwgLj0gJHRleHQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkaHRtbCAuPSAkdGhpczsJCQkJCgkJCX0JCQoJCQkkdGhpcy0+c2hvd25lZCA9IHRydWU7CgkJCXJldHVybiAkaHRtbDsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBpbml0VmFsdWVzKCkKCXsJCgkJZ2xvYmFsICRnQ21zOwoJCXN3aXRjaCgkdGhpcy0+dHlwZSkKCQl7CgkJCWNhc2UgJ2NoZWNrYm94JzoKCQkJCWlmKAoJCQkJCSFpc3NldCgkX1JFUVVFU1RbJHRoaXMtPmlkLiR0aGlzLT5uYW1lXSkKCQkJCQkmJgoJCQkJCSgKCQkJCQkJaXNzZXQoJF9SRVFVRVNUWyR0aGlzLT5pZC4nc3VibWl0J10pCgkJCQkJCXx8CgkJCQkJCWlzc2V0KCRfUkVRVUVTVFskdGhpcy0+aWQuJ2FwcGx5J10pCgkJCQkJKQoJCQkJCQoJCQkJKQoJCQkJewoJCQkJCS8vIENhc2Ugd2hlbiBjaGVja2JveCBpcyB1bmNoZWNrZWQgYW5kIGZvcm0gaXMgc3VibWl0dGVkLCB3ZSBzaG91bGQgZW1wdHkgdGhlIHZhbHVlCgkJCQkJJHRoaXMtPnZhbHVlc1tdPWFycmF5KCk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCWRlZmF1bHQ6CgkJCQlpZiAoaXNzZXQoJF9SRVFVRVNUWyR0aGlzLT5pZC4kdGhpcy0+bmFtZV0pKQoJCQkJewoJCQkJCSR2YWx1ZXMgPSBodG1sX2VudGl0eV9kZWNvZGUoJF9SRVFVRVNUWyR0aGlzLT5pZC4kdGhpcy0+bmFtZV0pOwoJCQkJfQoJCQkJZWxzZWlmKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1sndmFsdWUnXSkpCgkJCQl7CgkJCQkJJHZhbHVlcyA9ICR0aGlzLT5zZXR0aW5nc1sndmFsdWUnXTsKCQkJCX0KCQkJCWVsc2VpZigKCQkJCQlpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddKSAmJiAhaXNzZXQoJF9SRVFVRVNUWyR0aGlzLT5pZC4nc3VibWl0J10pICYmICFpc3NldCgkX1JFUVVFU1RbJHRoaXMtPmlkLidhcHBseSddKSkKCQkJCXsKCQkJCQkkdmFsdWVzID0gJHRoaXMtPmZldGNoVmFsdWVzKCk7CgkJCQl9CgkJCQllbHNlaWYoaXNzZXQoJHRoaXMtPnNldHRpbmdzWydwcmVmZXJlbmNlJ10pICYmICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5nZXRQcmVmZXJlbmNlKCR0aGlzLT5zZXR0aW5nc1sncHJlZmVyZW5jZSddKSAhPSAnJykKCQkJCXsKCQkJCQkJCSR2YWx1ZXMgPSBleHBsb2RlKCd8JywkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+Z2V0UHJlZmVyZW5jZSgkdGhpcy0+c2V0dGluZ3NbJ3ByZWZlcmVuY2UnXSkpOwoJCQkJfQoJCQkJCgkJCQlpZihpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ2RlZmF1bHRfdmFsdWUnXSkgJiYgISR0aGlzLT5mb3JtLT5pc1N1Ym1pdHRlZCgpKSAKCQkJCXsKCQkJCQlpZiAoCgkJCQkJCShpc19hcnJheSgkdmFsdWVzKSAmJiBjb3VudCgkdmFsdWVzKSA9PSAwKQoJCQkJCQl8fAoJCQkJCQkoZW1wdHkoJHZhbHVlcykpCgkJCQkJCSkKCQkJCQl7CgkJCQkJCSR2YWx1ZXMgPSAkdGhpcy0+c2V0dGluZ3NbJ2RlZmF1bHRfdmFsdWUnXTsKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCWlmICghZW1wdHkoJHZhbHVlcykpCgkJCQl7CgkJCQkJaWYgKGlzX2FycmF5KCR2YWx1ZXMpKSAKCQkJCQl7CgkJCQkJCSR0aGlzLT52YWx1ZXMgPSAkdmFsdWVzOwoJCQkJCX0JCgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkkdGhpcy0+dmFsdWVzW10gPSAkdmFsdWVzOwoJCQkJCX0KCQkJCX0KCQkJCWJyZWFrOwoJCX0KCQkKCX0KCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNhdmVWYWx1ZXMoKQoJewoJCWlmKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snb2JqZWN0J10pICYmIGlzX29iamVjdCgkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddKSAmJiAkdGhpcy0+dHlwZSAhPSAnZmlsZScpCgkJewoJCQkvLyBUaGlzIGRvIG5vdCBzYXZlIHRoZSBvYmplY3Qgc3RhdGUsIHNvIHdlIGhhdmUgdG8gZG8gaXQgb3V0c2lkZSB0aGUgZm9ybQoJCQkKCQkJaWYgKCR0aGlzLT50eXBlID09ICdkYXRlJykKCQkJewoJCQkJJHZhbHVlcyA9ICR0aGlzLT52YWx1ZXM7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdmFsdWVzID0gaW1wbG9kZSgnfCcsICR0aGlzLT52YWx1ZXMpOwoJCQl9CQkKCQkKCQkJaWYgKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snc2V0X21ldGhvZCddKSkKCQkJewoJCQkJJHRoaXMtPnNldHRpbmdzWydvYmplY3QnXS0+eyR0aGlzLT5zZXR0aW5nc1snc2V0X21ldGhvZCddfSgkdmFsdWVzKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWlmIChpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ2ZpZWxkX25hbWUnXSkpCgkJCQl7CgkJCQkJJG5hbWUgPSAkdGhpcy0+c2V0dGluZ3NbJ2ZpZWxkX25hbWUnXTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkbmFtZSA9ICR0aGlzLT5uYW1lOwoJCQkJfQoJCQkJCgkJCQlpZihtZXRob2RfZXhpc3RzKCR0aGlzLT5zZXR0aW5nc1snb2JqZWN0J10sICdzZXQnKSkKCQkJCXsJCQoJCQkJCSR0aGlzLT5zZXR0aW5nc1snb2JqZWN0J10tPnNldCgkbmFtZSwgJHZhbHVlcyk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJdHJ5CgkJCQkJewoJCQkJCQkkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddLT4kbmFtZSA9ICR2YWx1ZXM7CgkJCQkJfQoJCQkJCWNhdGNoKEV4Y2VwdGlvbiAkZSkKCQkJCQl7CgkJCQkJCWRpZSgndW5hYmxlIHRvIGRvJyk7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQkKCQkJfQoJCX0KCQkKCQlpZihpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ3ByZWZlcmVuY2UnXSkgJiYgIWlzc2V0KCRfUkVRVUVTVFskdGhpcy0+aWQuJ2NhbmNlbCddKSkKCQl7CgkJCS8vIENoZWNrIGlmIHRoZXJlIGlzIG5vIGNhbmNlbCBidXR0b24gZmlyc3QgYmVjYXVzZSB3ZSBzYXZlIHRoZSB2YWx1ZSBkaXJlY3RseSAhCgkJCWdsb2JhbCAkZ0NtczsKCQkJJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPnNldFByZWZlcmVuY2UoJHRoaXMtPnNldHRpbmdzWydwcmVmZXJlbmNlJ10sIGltcGxvZGUoJ3wnLCAkdGhpcy0+dmFsdWVzKSk7CgkJfQoJfQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gZmV0Y2hWYWx1ZXMoKQoJewoJCWlmKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snb2JqZWN0J10pICYmIGlzX29iamVjdCgkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddKSkKCQl7CgkJCWlmIChpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ2dldF9tZXRob2QnXSkpCgkJCXsKCQkJCXJldHVybiBleHBsb2RlKCd8JywkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddLT57JHRoaXMtPnNldHRpbmdzWydnZXRfbWV0aG9kJ119KCkpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaWYgKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snZmllbGRfbmFtZSddKSkKCQkJCXsKCQkJCQkkbmFtZSA9ICR0aGlzLT5zZXR0aW5nc1snZmllbGRfbmFtZSddOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRuYW1lID0gJHRoaXMtPm5hbWU7CgkJCQl9CgkJCQkKCQkJCWlmKG1ldGhvZF9leGlzdHMoJHRoaXMtPnNldHRpbmdzWydvYmplY3QnXSwgJ2dldCcpKQoJCQkJewoJCQkJCXJldHVybiBleHBsb2RlKCd8JywkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddLT5nZXQoJG5hbWUpKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkJdHJ5CgkJCQkJCXsKCQkJCQkJCXJldHVybiBleHBsb2RlKCd8JywgJHRoaXMtPnNldHRpbmdzWydvYmplY3QnXS0+JG5hbWUpOwoJCQkJCQl9CgkJCQkJCWNhdGNoKEV4Y2VwdGlvbiAkZSkKCQkJCQkJewoJCQkJCQkvLwlkaWUoJ3VuYWJsZSB0byBkbycpOwoJCQkJCQl9CgkJCQl9CgkJCX0JCQkKCQl9Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRWYWx1ZXMoJHZhbHVlcykKCXsKCQlpZiAoaXNfYXJyYXkoJHZhbHVlcykpCgkJewoJCQkkdGhpcy0+dmFsdWVzID0gJHZhbHVlczsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnZhbHVlcyA9IGFycmF5KCR2YWx1ZXMpOwoJCX0KCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlcygpCgl7CgkJcmV0dXJuICR0aGlzLT52YWx1ZXM7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRTdHJpbmdWYWx1ZSgpCgl7CgkJcmV0dXJuIGltcGxvZGUoJ3wnLCR0aGlzLT52YWx1ZXMpOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eVZhbHVlcygpCgl7CgkJaWYgKGlzX2FycmF5KCR0aGlzLT52YWx1ZXMpICYmIGNvdW50KCR0aGlzLT52YWx1ZXMpID09IDApCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZWlmIChpc19hcnJheSgkdGhpcy0+dmFsdWVzKSAmJiBjb3VudCgkdGhpcy0+dmFsdWVzKSA9PSAxICYmIGVtcHR5KCR0aGlzLT52YWx1ZXNbMF0pKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2VpZihlbXB0eSgkdGhpcy0+dmFsdWVzKSkKCQl7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZXNUb1N0cmluZygpCgl7CgkJaWYgKGlzX2FycmF5KCR0aGlzLT52YWx1ZXMpKQoJCXsKCQkJcmV0dXJuIChzdHJpbmcpaW1wbG9kZSgnfCcsICR0aGlzLT52YWx1ZXMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gKHN0cmluZykkdGhpcy0+dmFsdWVzOwoJCX0KCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldExhYmVsKCkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPnNldHRpbmdzWydsYWJlbCddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2V0dGluZ3NbJ2xhYmVsJ107CgkJfQoJCS8vIFRyeSB0byBnZXQgaXQgZnJvbSBsYW5ndWFnZSBmaWxlCgkJZ2xvYmFsICRnQ21zOwoJCWlmIChpc3NldCgkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXSkpCgkJewoJCQlyZXR1cm4gJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPmxhbmcoJ2Zvcm1fJy4kdGhpcy0+bmFtZSk7CgkJfQoJCXJldHVybiBudWxsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0VGlwcygpCgl7CgkJaWYgKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1sndGlwcyddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2V0dGluZ3NbJ3RpcHMnXTsKCQl9CgkJLy8gVHJ5IHRvIGdldCBpdCBmcm9tIGxhbmd1YWdlIGZpbGUKCQlnbG9iYWwgJGdDbXM7CgkJaWYgKGlzc2V0KCRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddKSkKCQl7CgkJCS8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIHNob3duIG9ubHkgaXQgdGhlIGxhbmcga2V5IGV4aXN0cy4uLgoJCQkvL3JldHVybiAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+bGFuZygndGlwc18nLiR0aGlzLT5uYW1lKTsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dCgpCgl7CQoJCWlmICghZW1wdHkoJHRoaXMtPmlucHV0KSkKCQl7CgkJCXJldHVybiAkdGhpcy0+aW5wdXQ7CgkJfQoJCQoJCWdsb2JhbCAkZ0NtczsKCQlpZiAoaXNzZXQoJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10pKQoJCXsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQoJCQl7CgkJCQljYXNlICd0ZXh0JzoKCQkJCQlyZXR1cm4gJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPkNyZWF0ZUlucHV0VGV4dCgkdGhpcy0+aWQsICR0aGlzLT5uYW1lLCBpbXBsb2RlKCd8JywkdGhpcy0+dmFsdWVzKSwgaXNzZXQoJHRoaXMtPnNldHRpbmdzWydzaXplJ10pPyR0aGlzLT5zZXR0aW5nc1snc2l6ZSddOjgwKTsJCQkJCgkJCQljYXNlICdoaWRkZW4nOgoJCQkJCXJldHVybiAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+Q3JlYXRlSW5wdXRIaWRkZW4oJHRoaXMtPmlkLCAkdGhpcy0+bmFtZSwgaW1wbG9kZSgnfCcsJHRoaXMtPnZhbHVlcykpOwoJCQkJY2FzZSAnc2VsZWN0JzoKCQkJCQlyZXR1cm4gc2VsZjo6Q3JlYXRlSW5wdXRTZWxlY3RMaXN0KCR0aGlzLT5pZCwgJHRoaXMtPm5hbWUsIGlzc2V0KCR0aGlzLT5zZXR0aW5nc1sndmFsdWVzJ10pPyR0aGlzLT5zZXR0aW5nc1sndmFsdWVzJ106YXJyYXkoKSwgJHRoaXMtPnZhbHVlcywgMSwgJycsIGZhbHNlKTsKCQkJCWNhc2UgJ2NoZWNrYm94JzoKCQkJCQlyZXR1cm4gJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPkNyZWF0ZUlucHV0Q2hlY2tib3goJHRoaXMtPmlkLCAkdGhpcy0+bmFtZSwgJzEnLCAoaW50ZWdlcilpbXBsb2RlKCd8JywkdGhpcy0+dmFsdWVzKSk7CgkJCQljYXNlICd0ZXh0YXJlYSc6CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snc2hvd193eXNpd3lnJ10pICYmICR0aGlzLT5zZXR0aW5nc1snc2hvd193eXNpd3lnJ10gPT0gdHJ1ZSkKCQkJCQl7CgkJCQkJCXJldHVybiAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+Q3JlYXRlVGV4dEFyZWEodHJ1ZSwgJHRoaXMtPmlkLCBpbXBsb2RlKCd8JywkdGhpcy0+dmFsdWVzKSwgJHRoaXMtPm5hbWUpOwkJCQkJCQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlyZXR1cm4gJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPkNyZWF0ZVRleHRBcmVhKGZhbHNlLCAkdGhpcy0+aWQsIGltcGxvZGUoJ3wnLCR0aGlzLT52YWx1ZXMpLCAkdGhpcy0+bmFtZSk7CgkJCQkJfQoJCQkJY2FzZSAndGltZSc6CgkJCQkJcmV0dXJuIHNlbGY6OkNyZWF0ZVRpbWVTZWxlY3QoJHRoaXMtPmlkLCR0aGlzLT5uYW1lLCR0aGlzLT52YWx1ZXMpOwoJCQkJY2FzZSAnZGF0ZSc6CgkJCQkJcmV0dXJuIHNlbGY6OkNyZWF0ZURhdGVTZWxlY3QoJHRoaXMtPmlkLCR0aGlzLT5uYW1lLCR0aGlzLT52YWx1ZXMsICR0aGlzLT5zZXR0aW5ncyk7CgkJCQljYXNlICdwYWdlcyc6CgkJCQkJcmV0dXJuICRnQ21zLT5HZXRDb250ZW50T3BlcmF0aW9ucygpLT5DcmVhdGVIaWVyYXJjaHlEcm9wZG93bignJywgaW1wbG9kZSgnfCcsJHRoaXMtPnZhbHVlcyksICR0aGlzLT5pZCAuICR0aGlzLT5uYW1lKTsKCQkJCQkJLy8kdGhpcy0+Z2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9wYWdlJywpCgkJCQljYXNlICdzdGF0aWMnOgoJCQkJCXJldHVybiBpbXBsb2RlKCd8JywkdGhpcy0+dmFsdWVzKTsKCQkJCWNhc2UgJ2ZpbGUnOgoJCQkJCXJldHVybiAkdGhpcy0+Z2V0VXBsb2FkRmllbGQoKTsKCQkJCWNhc2UgJ3Bhc3N3b3JkJzoKCQkJCQlyZXR1cm4gJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPkNyZWF0ZUlucHV0UGFzc3dvcmQoJHRoaXMtPmlkLCAkdGhpcy0+bmFtZSwgaW1wbG9kZSgnfCcsJHRoaXMtPnZhbHVlcykpOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gbnVsbDsKCQkJfQoJCX0KCQlyZXR1cm4gbnVsbDsKCQkKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldFVwbG9hZEZpZWxkKCkKCXsKCQlnbG9iYWwgJGdDbXM7CgkJJGZpZWxkID0gJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPkNyZWF0ZUlucHV0RmlsZSgkdGhpcy0+aWQsICR0aGlzLT5uYW1lLCAnJywgaXNzZXQoJHRoaXMtPnNldHRpbmdzWydzaXplJ10pPyR0aGlzLT5zZXR0aW5nc1snc2l6ZSddOjMwKTsKCQkkaG1sID0gJzxzcGFuPic7CgkJaWYgKGNvdW50KCR0aGlzLT52YWx1ZXMpKQoJCXsKCQkJJGZpbGVfdXJsID0gaXNzZXQoJHRoaXMtPnNldHRpbmdzWydiYXNlX3VybCddKT8kdGhpcy0+c2V0dGluZ3NbJ2Jhc2VfdXJsJ106Jyc7CgkJCWlmICgoc3Vic3RyKCRmaWxlX3VybCwgLTEpICE9ICcvJykgJiYgKHN1YnN0cigkdGhpcy0+dmFsdWVzWzBdLDAsMSkgIT0gJy8nKSkgJGZpbGVfdXJsIC4nLyc7CgkJCSRmaWxlX3VybCAuPSAkdGhpcy0+dmFsdWVzWzBdOwoJCQkKCQkJaWYgKHNlbGY6OmlzSW1hZ2UoJHRoaXMtPnZhbHVlc1swXSkpCgkJCXsKCQkJCSR0ZXh0ID0gJzxpbWcgc3JjPSInLiRmaWxlX3VybC4nIiAvPic7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGV4dCA9IGJhc2VuYW1lKCR0aGlzLT52YWx1ZXNbMF0pOwoJCQl9CgkJCQoJCQkkaHRtbCAuPSAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6YmxvY2s7IG1hcmdpbi1ib3R0b206IDdweDsiPjxhIGhyZWY9IicuJGZpbGVfdXJsLiAnIiByZWw9ImV4dGVybmFsIiA+Jy4gJHRleHQgLic8L2E+PC9zcGFuPiAnOwoJCX0KCQkKCQlpZiAoaXNzZXQoJHRoaXMtPnNldHRpbmdzWydkZWxldGVfY2hlY2tib3gnXSkpCgkJewoJCQkkZmllbGQgLj0gJyAnIC4gICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5DcmVhdGVJbnB1dENoZWNrYm94KCR0aGlzLT5pZCwgJHRoaXMtPnNldHRpbmdzWydkZWxldGVfY2hlY2tib3gnXSwgJzEnKSAuICcgJyAuICAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+bGFuZygnZGVsZXRlJyk7CgkJfQoJCQoJCSRodG1sIC49ICRmaWVsZCAuICc8L3NwYW4+JzsKCQlyZXR1cm4gJGh0bWw7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNJbWFnZSgkZmlsZW5hbWUpCgl7CgkJJHZhbGlkX2V4dGVuc2lvbnMgPSBhcnJheSgnanBlZycsJ2pwZycsJ2dpZicsJ3BuZycpOwoJCWlmIChpbl9hcnJheShzZWxmOjpnZXRGaWxlRXh0ZW5zaW9uKCRmaWxlbmFtZSksJHZhbGlkX2V4dGVuc2lvbnMpKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRGaWxlRXh0ZW5zaW9uKCRmaWxlbmFtZSkKCXsKCQkkZmlsZSA9IGV4cGxvZGUoJy4nLCAkZmlsZW5hbWUpOwogIAkJaWYgKGNvdW50KCRmaWxlKSA+IDEpCgkgIAl7CgkgIAkJcmV0dXJuIGVuZCgkZmlsZSk7CgkgIAl9CgkgIAllbHNlIAoJICAJewoJICAJCXJldHVybiBudWxsOwoJICAJfQoJfQoJCgoJLy8gVG9vbHMKCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVEYXRlU2VsZWN0KCRpZCwkbmFtZSwkdmFsdWVzLCRzZXR0aW5ncykKCXsKCQlpZiAoY291bnQoJHZhbHVlcykgPT0gMSkKCQl7CgkJCWlmIChzdHJwb3MoJHZhbHVlc1swXSwgJy0nKSAhPT0gZmFsc2UpICR2YWx1ZXMgPSBleHBsb2RlKCctJywkdmFsdWVzWzBdKTsKCQl9CgkJJHN0YXJ0X3llYXIgPSBpc3NldCgkc2V0dGluZ3NbJ3N0YXJ0X3llYXInXSk/JHNldHRpbmdzWydzdGFydF95ZWFyJ106ZGF0ZSgnWScpOwoJCSRudW1iZXJfeWVhcnMgPSBpc3NldCgkc2V0dGluZ3NbJ251bWJlcl95ZWFycyddKT8kc2V0dGluZ3NbJ251bWJlcl95ZWFycyddOjIwOwoJCSRlbmRfeWVhciA9ICRzdGFydF95ZWFyICsgJG51bWJlcl95ZWFyczsKCQkKCQkkeWVhciA9IHNlbGY6OkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgkaWQsJG5hbWUuJ1swXScsc2VsZjo6Q3JlYXRlTnVtYmVyTGlzdCgkZW5kX3llYXIsJHN0YXJ0X3llYXIpLGFycmF5KCR2YWx1ZXNbMF0pLDEsJycsZmFsc2UpOwoJCSRtb250aCA9IHNlbGY6OkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgkaWQsJG5hbWUuJ1sxXScsc2VsZjo6Q3JlYXRlTW9udGhzTGlzdCgpLGFycmF5KCR2YWx1ZXNbMV0pLDEsJycsZmFsc2UpOwoJCSRkYXkgPSBzZWxmOjpDcmVhdGVJbnB1dFNlbGVjdExpc3QoJGlkLCRuYW1lLidbMl0nLHNlbGY6OkNyZWF0ZU51bWJlckxpc3QoMzEsMSksYXJyYXkoJHZhbHVlc1syXSksMSwnJyxmYWxzZSk7CgkJaWYgKGlzc2V0KCRzZXR0aW5nc1snZXVyb3BlYW5fZGF0ZSddKSkKCQl7CgkJCXJldHVybiAkZGF5IC4gJG1vbnRoIC4gJHllYXI7CgkJfQoJCXJldHVybiAkeWVhciAuICRtb250aCAuICRkYXk7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ3JlYXRlVGltZVNlbGVjdCgkaWQsJG5hbWUsJHZhbHVlcykKCXsKCQkkaG91cnMgPSBzZWxmOjpDcmVhdGVJbnB1dFNlbGVjdExpc3QoJGlkLCRuYW1lLidbMF0nLHNlbGY6OkNyZWF0ZU51bWJlckxpc3QoMjMpLGFycmF5KCR2YWx1ZXNbMF0pLDEsJycsZmFsc2UpOwoJCSRtaW51dGVzID0gc2VsZjo6Q3JlYXRlSW5wdXRTZWxlY3RMaXN0KCRpZCwkbmFtZS4nWzFdJyxzZWxmOjpDcmVhdGVOdW1iZXJMaXN0KDU5KSxhcnJheSgkdmFsdWVzWzFdKSwxLCcnLGZhbHNlKTsKCQkkc2Vjb25kcyA9IHNlbGY6OkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgkaWQsJG5hbWUuJ1syXScsc2VsZjo6Q3JlYXRlTnVtYmVyTGlzdCg1OSksYXJyYXkoJHZhbHVlc1syXSksMSwnJyxmYWxzZSk7CgkJcmV0dXJuICRob3VycyAuICcgOiAnIC4gJG1pbnV0ZXMgLiAnIDogJyAuICRzZWNvbmRzOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ3JlYXRlTW9udGhzTGlzdCgpCgl7CgkJJG1vbnRocyA9IGFycmF5KCk7CgkJZm9yICgkaSA9IDE7ICRpIDw9IDEyOyArKyRpKSB7CgkJCSR0ID0gbWt0aW1lKDAsIDAsIDAsICRpLCAxLCAyMDAwKTsKCQkJJG1vbnRoc1skaV0gPSBkYXRlKCdNJywgJHQpOwoJCX0KCQlyZXR1cm4gJG1vbnRoczsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENyZWF0ZU51bWJlckxpc3QoJGVuZCwgJHN0YXJ0PTApCgl7CgkJaWYgKCgkZW5kIDwgMCl8fCghaXNfbnVtZXJpYygkZW5kKSkpICRlbmQgPSAxOwoJCSRsaXN0ID0gYXJyYXkoKTsKCQlmb3IgKCRpID0gJHN0YXJ0OyAkaSA8PSAkZW5kOyAkaSsrKQoJCXsKCQkJJGxpc3RbJGldID0gKHN0cmluZykkaTsKCQl9CgkJcmV0dXJuICRsaXN0OwoJfQoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENyZWF0ZUlucHV0U2VsZWN0TGlzdCgkaWQsICRuYW1lLCAkaXRlbXMsICRzZWxlY3RlZGl0ZW1zPWFycmF5KCksICRzaXplPTMsICRhZGR0dGV4dD0nJywgJG11bHRpcGxlID0gdHJ1ZSkKCXsKCSAgJGlkID0gY21zX2h0bWxlbnRpdGllcygkaWQpOwoJICAkbmFtZSA9IGNtc19odG1sZW50aXRpZXMoJG5hbWUpOwoJICAkc2l6ZSA9IGNtc19odG1sZW50aXRpZXMoJHNpemUpOwoJICAkbXVsdGlwbGUgPSBjbXNfaHRtbGVudGl0aWVzKCRtdWx0aXBsZSk7CgkKCQkkdGV4dCA9ICc8c2VsZWN0IG5hbWU9IicuJGlkLiRuYW1lLiciJzsKCQlpZiAoJGFkZHR0ZXh0ICE9ICcnKQoJCXsKCQkJJHRleHQgLj0gJyAnIC4gJGFkZHR0ZXh0OwoJCX0KCQlpZiggJG11bHRpcGxlICkKCQkgIHsKCQkJJHRleHQgLj0gJyBtdWx0aXBsZT0ibXVsdGlwbGUiICc7CgkJICB9CgkJICAKCQkgIGlmICgkc2l6ZSA+IDEpCgkJICB7CgkJICAJJHRleHQgLj0gJyBzaXplPSInLiRzaXplLiciJzsKCQkgIH0KCQkKCQkkdGV4dCAuPSAnPic7CgkJCgkJJGNvdW50ID0gMDsKCQlmb3JlYWNoICgkaXRlbXMgYXMgJGtleT0+JHZhbHVlKQoJCXsKCQkgIAlpZiAoaXNfYXJyYXkoJHZhbHVlKSkKCQkgCXsKCQkJCSRhcnJheSA9IGFycmF5X3NoaWZ0KCR2YWx1ZSk7CgkJCQkka2V5ID0gaW1wbG9kZSgnfCcsYXJyYXlfa2V5cygkYXJyYXkpKTsKCQkJCSR2YWx1ZSA9IGltcGxvZGUoJ3wnLCAkYXJyYXkpOwoJCQl9CgkJCQoJCQkvLyR2YWx1ZSA9IGNtc19odG1sZW50aXRpZXMoJHZhbHVlKTsKCQkJJHZhbHVlID0gJHZhbHVlOwoJCgkJCSR0ZXh0IC49ICc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyInOwoJCQlpZiAoaW5fYXJyYXkoJGtleSwgJHNlbGVjdGVkaXRlbXMpKQoJCQl7CgkJCQkkdGV4dCAuPSAnICcgLiAnc2VsZWN0ZWQ9InNlbGVjdGVkIic7CgkJCX0KCQkJJHRleHQgLj0gJz4nOwoJCQkkdGV4dCAuPSAkdmFsdWU7CgkJCSR0ZXh0IC49ICc8L29wdGlvbj4nOwoJCQkkY291bnQrKzsKCQl9CgkJJHRleHQgLj0gJzwvc2VsZWN0PicuIlxuIjsKCQoJCXJldHVybiAkdGV4dDsKCX0KCQoJZnVuY3Rpb24gdGVtcCgpCgl7CgkJJHdpZGdldFsnbGFiZWwnXSA9ICR0aGlzLT5sYW5nKCdmb3JtXycuJG5hbWUpOwoJCSR3aWRnZXRbJ3ZhbHVlJ10gPSAnJzsKCQkKCQlzd2l0Y2goJHR5cGUpCgkJewoJCQljYXNlICd0ZXh0JzoKCQkJCSR3aWRnZXRbJ3ZhbHVlJ10gPSBpc3NldCgkcGFyYW1zWyRuYW1lXSk/JHBhcmFtc1skbmFtZV06aXNzZXQoJHNldHRpbmdzWydkZWZhdWx0X3ZhbHVlJ10pPyRzZXR0aW5nc1snZGVmYXVsdF92YWx1ZSddOicnOwoJCQkJJHdpZGdldFsnaW5wdXQnXSA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGZvcm1faWQsICRuYW1lLCAkd2lkZ2V0Wyd2YWx1ZSddLCBpc3NldCgkc2V0dGluZ3NbJ3NpemUnXSk/JHNldHRpbmdzWydzaXplJ106ODApOwoJCQkJYnJlYWs7CgkJfQoJCQoJCSRmb3JtWyRuYW1lXSA9ICR3aWRnZXQ7CgkJcmV0dXJuICRmb3JtOwoJfQoJCQoJcHVibGljIGZ1bmN0aW9uIGhhc0Vycm9ycygpCgl7CgkJaWYgKGNvdW50KCR0aGlzLT5mb3JtX2Vycm9ycykgPT0gMCkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBub0Vycm9yKCkKCXsKCQlyZXR1cm4gISR0aGlzLT5oYXNFcnJvcnMoKTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldEVycm9ycygpCgl7CgkJcmV0dXJuICR0aGlzLT5mb3JtX2Vycm9yczsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIHNob3dFcnJvcnMoKQoJewoJCSRodG1sID0gJyc7CgkJaWYoY291bnQoJHRoaXMtPmZvcm1fZXJyb3JzKSA+IDApCgkJewoJCQkkaHRtbCAuPSAnPHVsIGNsYXNzPSJmb3JtX3dpZGdldF9lcnJvcnMiPic7CgkJCWZvcmVhY2goJHRoaXMtPmZvcm1fZXJyb3JzIGFzICRwcmlvcml0eSA9PiAkZXJyb3JzKQoJCQl7CgkJCQkkaHRtbCAuPSAnPGxpPjxlbSBjbGFzcz0iZm9ybV93aWRnZXRfZXJyb3JfcHJpb3JpdHkiPicuJHByaW9yaXR5Lic8L2VtPjx1bD4nOwoJCQkJZm9yZWFjaCgkZXJyb3JzIGFzICRlcnJvcikKCQkJCXsKCQkJCQkkaHRtbCAuPSAnPGxpIGNsYXNzPSJmb3JtX3dpZGdldF9lcnJvcl9tZXNzYWdlIj4nLiRlcnJvci4nPC9saT4nOwoJCQkJfQkJCQkKCQkJCSRodG1sIC49ICc8L3VsPjwvbGk+JzsKCQkJfQoJCQkkaHRtbCAuPSAnPC91bD4nOwoJCX0KCQlyZXR1cm4gJGh0bWw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvcigkbWVzc2FnZSwkcHJpb3JpdHk9J2RlZmF1bHQnKQoJewoJCSR0aGlzLT5mb3JtX2Vycm9yc1skcHJpb3JpdHldW10gPSAkbWVzc2FnZTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGFkZFZhbGlkYXRvcigkdmFsaWRhdG9yLCAkcGFyYW1zID0gYXJyYXkoKSkKCXsKCQkkdGhpcy0+c2V0dGluZ3NbJ3ZhbGlkYXRvcnMnXVskdmFsaWRhdG9yXSA9ICRwYXJhbXM7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVWYWxpZGF0b3IoJHZhbGlkYXRvcikKCXsKCQl1bnNldCgkdGhpcy0+c2V0dGluZ3NbJ3ZhbGlkYXRvcnMnXVskdmFsaWRhdG9yXSk7Cgl9CgkKfQoKY2xhc3MgQ01TRm9ybVZhbGlkYXRvcgp7Cglwcm90ZWN0ZWQgJHdpZGdldDsKCXByb3RlY3RlZCAkdmFsaWRhdG9yOwoJcHJvdGVjdGVkICRwYXJhbXM7CgkKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkd2lkZ2V0LCR2YWxpZGF0b3IsJHBhcmFtcykKCXsKCQkkdGhpcy0+d2lkZ2V0ID0gJHdpZGdldDsKCQkkdGhpcy0+dmFsaWRhdG9yID0gJHZhbGlkYXRvcjsKCQkkdGhpcy0+cGFyYW1zID0gJHBhcmFtczsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGNoZWNrKCkKCXsKCQlzd2l0Y2goJHRoaXMtPnZhbGlkYXRvcikKCQl7CgkJCWNhc2UgJ25vdF9lbXB0eSc6CgkJCQlyZXR1cm4gJHRoaXMtPkNoZWNrTm90RW1wdHkoKTsKCQkJY2FzZSAnZXF1YWxfZmllbGQnOgoJCQkJcmV0dXJuICR0aGlzLT5DaGVja0VxdWFsRmllbGQoKTsKCQkJY2FzZSAnZW1haWwnOgoJCQkJcmV0dXJuICR0aGlzLT5DaGVja0VtYWlsKCk7CgkJCWNhc2UgJ3VuaXF1ZSc6CgkJCQlyZXR1cm4gJHRoaXMtPkNoZWNrVW5pcXVlKCk7CgkJCWRlZmF1bHQ6CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbmtub3duIGZvcm0gdmFsaWRhdG9yICInLiR0aGlzLT52YWxpZGF0b3IgLiciLicpOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIENoZWNrVW5pcXVlKCkKCXsKCQkkdmFsdWUgPSBpbXBsb2RlKCd8JywkdGhpcy0+d2lkZ2V0LT5nZXRWYWx1ZXMoKSk7CgkJaWYgKGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5wYXJhbXMsICR2YWx1ZSkgIT09IG51bGwpCgkJewoJCQlnbG9iYWwgJGdDbXM7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJGdDbXMtPm1vZHVsZXNbJ0NNU0Zvcm1zJ11bJ29iamVjdCddLT5sYW5nKCdmaWVsZCBub3QgdW5pcXVlJywgJHZhbHVlKSk7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gQ2hlY2tOb3RFbXB0eSgpCgl7CQoJCWdsb2JhbCAkZ0NtczsKCQkkdmFsdWVzID0gJHRoaXMtPndpZGdldC0+Z2V0VmFsdWVzKCk7CgkJaWYgKGlzX2FycmF5KCR2YWx1ZXMpICYmIGNvdW50KCR2YWx1ZXMpID09IDApCgkJewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCRnQ21zLT5tb2R1bGVzWydDTVNGb3JtcyddWydvYmplY3QnXS0+bGFuZygnZmllbGRfY2Fubm90X2JlX2VtcHR5JywgJHRoaXMtPndpZGdldC0+Z2V0TmFtZSgpKSk7CgkJfQoJCWVsc2VpZihlbXB0eSgkdmFsdWVzKSkKCQl7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJGdDbXMtPm1vZHVsZXNbJ0NNU0Zvcm1zJ11bJ29iamVjdCddLT5sYW5nKCdmaWVsZF9jYW5ub3RfYmVfZW1wdHknLCAkdGhpcy0+d2lkZ2V0LT5nZXROYW1lKCkpKTsKCQl9CgkJCgkJcmV0dXJuIHRydWU7Cgl9CgkKCXByb3RlY3RlZCBmdW5jdGlvbiBDaGVja0VxdWFsRmllbGQoKQoJewoJCWdsb2JhbCAkZ0NtczsKCQkJJHZhbHVlMSA9IHNlcmlhbGl6ZSgkdGhpcy0+d2lkZ2V0LT5nZXRWYWx1ZXMoKSk7CgkJCQoJCQl0cnkKCQkJewoJCQkJJHZhbHVlMiA9IHNlcmlhbGl6ZSgkdGhpcy0+d2lkZ2V0LT5nZXRGb3JtKCktPmdldFdpZGdldCgkdGhpcy0+cGFyYW1zKS0+Z2V0VmFsdWVzKCkpOwoJCQl9CgkJCWNhdGNoKEV4Y2VwdGlvbiAkZSkKCQkJewoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigkZ0Ntcy0+bW9kdWxlc1snQ01TRm9ybXMnXVsnb2JqZWN0J10tPmxhbmcoJ3Vua25vd24gZmllbGQnLCAkdGhpcy0+cGFyYW1zKSk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJCgkJCWlmICgkdmFsdWUxICE9ICR2YWx1ZTIpCgkJCXsKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJGdDbXMtPm1vZHVsZXNbJ0NNU0Zvcm1zJ11bJ29iamVjdCddLT5sYW5nKCdmaWVsZHMgbm90IGVxdWFsJywgJHRoaXMtPndpZGdldC0+Z2V0TmFtZSgpLCAkdGhpcy0+cGFyYW1zKSk7CgkJCX0KCQkJCgkJCXJldHVybiB0cnVlOwoJCQoJfQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gQ2hlY2tFbWFpbCgpCgl7CgkJJGVtYWlsID0gaW1wbG9kZSgnfCcsICR0aGlzLT53aWRnZXQtPmdldFZhbHVlcygpKTsKCQlpZiAoIXNlbGY6OnZhbGlkRW1haWwoJGVtYWlsKSkKCQl7CgkJCWdsb2JhbCAkZ0NtczsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigkZ0Ntcy0+bW9kdWxlc1snQ01TRm9ybXMnXVsnb2JqZWN0J10tPmxhbmcoJ2ludmFsaWQgZW1haWwnLCAkZW1haWwpKTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgkvLyBFeHRlcm5hbCBmdW5jdGlvbnMKCS8qKgoJVmFsaWRhdGUgYW4gZW1haWwgYWRkcmVzcy4KCVByb3ZpZGUgZW1haWwgYWRkcmVzcyAocmF3IGlucHV0KQoJUmV0dXJucyB0cnVlIGlmIHRoZSBlbWFpbCBhZGRyZXNzIGhhcyB0aGUgZW1haWwgCglhZGRyZXNzIGZvcm1hdCBhbmQgdGhlIGRvbWFpbiBleGlzdHMuCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZEVtYWlsKCRlbWFpbCkKCXsKCSAgICRpc1ZhbGlkID0gdHJ1ZTsKCSAgICRhdEluZGV4ID0gc3RycnBvcygkZW1haWwsICJAIik7CgkgICBpZiAoaXNfYm9vbCgkYXRJbmRleCkgJiYgISRhdEluZGV4KQoJICAgewoJICAgICAgJGlzVmFsaWQgPSBmYWxzZTsKCSAgIH0KCSAgIGVsc2UKCSAgIHsKCSAgICAgICRkb21haW4gPSBzdWJzdHIoJGVtYWlsLCAkYXRJbmRleCsxKTsKCSAgICAgICRsb2NhbCA9IHN1YnN0cigkZW1haWwsIDAsICRhdEluZGV4KTsKCSAgICAgICRsb2NhbExlbiA9IHN0cmxlbigkbG9jYWwpOwoJICAgICAgJGRvbWFpbkxlbiA9IHN0cmxlbigkZG9tYWluKTsKCSAgICAgIGlmICgkbG9jYWxMZW4gPCAxIHx8ICRsb2NhbExlbiA+IDY0KQoJICAgICAgewoJICAgICAgICAgLy8gbG9jYWwgcGFydCBsZW5ndGggZXhjZWVkZWQKCSAgICAgICAgICRpc1ZhbGlkID0gZmFsc2U7CgkgICAgICB9CgkgICAgICBlbHNlIGlmICgkZG9tYWluTGVuIDwgMSB8fCAkZG9tYWluTGVuID4gMjU1KQoJICAgICAgewoJICAgICAgICAgLy8gZG9tYWluIHBhcnQgbGVuZ3RoIGV4Y2VlZGVkCgkgICAgICAgICAkaXNWYWxpZCA9IGZhbHNlOwoJICAgICAgfQoJICAgICAgZWxzZSBpZiAoJGxvY2FsWzBdID09ICcuJyB8fCAkbG9jYWxbJGxvY2FsTGVuLTFdID09ICcuJykKCSAgICAgIHsKCSAgICAgICAgIC8vIGxvY2FsIHBhcnQgc3RhcnRzIG9yIGVuZHMgd2l0aCAnLicKCSAgICAgICAgICRpc1ZhbGlkID0gZmFsc2U7CgkgICAgICB9CgkgICAgICBlbHNlIGlmIChwcmVnX21hdGNoKCcvXFwuXFwuLycsICRsb2NhbCkpCgkgICAgICB7CgkgICAgICAgICAvLyBsb2NhbCBwYXJ0IGhhcyB0d28gY29uc2VjdXRpdmUgZG90cwoJICAgICAgICAgJGlzVmFsaWQgPSBmYWxzZTsKCSAgICAgIH0KCSAgICAgIGVsc2UgaWYgKCFwcmVnX21hdGNoKCcvXltBLVphLXowLTlcXC1cXC5dKyQvJywgJGRvbWFpbikpCgkgICAgICB7CgkgICAgICAgICAvLyBjaGFyYWN0ZXIgbm90IHZhbGlkIGluIGRvbWFpbiBwYXJ0CgkgICAgICAgICAkaXNWYWxpZCA9IGZhbHNlOwoJICAgICAgfQoJICAgICAgZWxzZSBpZiAocHJlZ19tYXRjaCgnL1xcLlxcLi8nLCAkZG9tYWluKSkKCSAgICAgIHsKCSAgICAgICAgIC8vIGRvbWFpbiBwYXJ0IGhhcyB0d28gY29uc2VjdXRpdmUgZG90cwoJICAgICAgICAgJGlzVmFsaWQgPSBmYWxzZTsKCSAgICAgIH0KCSAgICAgIGVsc2UgaWYKCSghcHJlZ19tYXRjaCgnL14oXFxcXC58W0EtWmEtejAtOSEjJSZgXz1cXC8kXCcqKz9ee318fi4tXSkrJC8nLAoJICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXFxcXCIsIiIsJGxvY2FsKSkpCgkgICAgICB7CgkgICAgICAgICAvLyBjaGFyYWN0ZXIgbm90IHZhbGlkIGluIGxvY2FsIHBhcnQgdW5sZXNzIAoJICAgICAgICAgLy8gbG9jYWwgcGFydCBpcyBxdW90ZWQKCSAgICAgICAgIGlmICghcHJlZ19tYXRjaCgnL14iKFxcXFwifFteIl0pKyIkLycsCgkgICAgICAgICAgICAgc3RyX3JlcGxhY2UoIlxcXFwiLCIiLCRsb2NhbCkpKQoJICAgICAgICAgewoJICAgICAgICAgICAgJGlzVmFsaWQgPSBmYWxzZTsKCSAgICAgICAgIH0KCSAgICAgIH0KCSAgICAgIGlmICgkaXNWYWxpZCAmJiAhKGNoZWNrZG5zcnIoJGRvbWFpbiwiTVgiKSB8fCAKCSDihqpjaGVja2Ruc3JyKCRkb21haW4sIkEiKSkpCgkgICAgICB7CgkgICAgICAgICAvLyBkb21haW4gbm90IGZvdW5kIGluIEROUwoJICAgICAgICAgJGlzVmFsaWQgPSBmYWxzZTsKCSAgICAgIH0KCSAgIH0KCSAgIHJldHVybiAkaXNWYWxpZDsKCX0KfQ==]]></data>
	</file>
</module>
