<?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>CodeMirror</name>
	<version>3.0.0</version>
  <mincmsversion>1.11</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+Cjxici8+ClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykKPGJyLz48YnIvPgo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuCnNlbGVjdCBDb2RlTWlycm9yIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldHJldCBhbmdpdmVyIGh2aWxrZXQgc3Byb2cgZGVyIHNrYWwgYnJ1Z2VzIHRpbCB2aXNuaW5nIGZvciBiZXMmb3NsYXNoO2dlbmRlLiBJa2tlIGFsbGUgbW9kdWxlciB1bmRlcnN0Jm9zbGFzaDt0dGVyIGVsbGVyIGJlaCZvc2xhc2g7dmVyIGRldHRlLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBNb3J0ZW4gUG91bHNlbiAmbHQ7Jmx0O21vcnRlbkBwb3Vsc2VuLm9yZyZndDsmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMy4wLjA8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz48dWw+CiAgPGxpPjMuMC4wIC0gVXBkYXRlZCB0byBDTVMgMy4wLWZpbmFsLiBQb3NzaWJsZSBmaXggdG8gYWRtaW5zIG9uIGh0dHBzLiBGaXhlZCBzbyB0aGF0IGVkaXRpbmcgVURUJ3MgYXJlIGdldHRpbmcgaGlnaGxpZ2h0ZWQ8L2xpPgogIDxsaT4yLjMuMiAtIFVwZGF0ZWQgdG8gQ00gMi4zMSg8L2xpPgogIDxsaT4yLjMuMSAtIEFwcGx5LWJ1dHRvbiBpbiBlZGl0IGNzcyBhcmUgZml4ZWQsIHRlbXBsYXRlcyBzdGlsbCBoYXZlIGNvcmUgYnVnIDooPC9saT4KICA8bGk+Mi4zLjAgLSBSZWltcGxlbWVudGVkIGxpbmV3cmFwcGluZywgYXV0b21hdGVkIHRoZW1lIGRldGVjdGlvbjwvbGk+CiAgPGxpPjIuMi4zIC0gVXBkYXRlZCB0byBDTSAyLjIuMzwvbGk+CiAgPGxpPjIuMi4yIC0gVXBkYXRlZCB0byBDTSAyLjIuMTwvbGk+CiAgPGxpPjIuMi4xIC0gVXBkYXRlZCB0byBDTSAyLjIuMCwgYWRkZWQgdGFiLXdpZHRoIHNldHRpbmc8L2xpPgogIDxsaT4yLjIuMCAtIFVwZGF0ZWQgdG8gQ00gMi4xNSwgYWRkZWQgb3B0aW9uYWwgZnVsbHNjcmVlbiBtb2RlPC9saT4KICA8bGk+Mi4xLjIgLSBVcGRhdGVkIHRvIENNIDIuMTIsIGNsZWFuZXIgd2F5IG9mIHNhdmluZyBlZGl0b3IgY29udGVudCB0byB0ZXh0YXJlYTwvbGk+CiAgPGxpPjIuMS4wIC0gVXBkYXRlZCB0byBDTSAyLjEuMSwgb25jZSBhZ2FpbiBjaGFuZ2UgdGVzdG1vZGUuLi4gPC9saT4KICA8bGk+Mi4wLjEgLSBVcGRhdGVkIHRvIENNIDIuMC4xPC9saT4KICA8bGk+Mi4wIC0gVXBkYXRlZCB0byBDTSAyLjAgYW5kIHJld29ya2VkIGp1c3QgYWJvdXQgZXZlcnl0aGluZyB0byBtYWtlIHRoaXMgd29yazwvbGk+CiAgPGxpPjAuMS45IC0gVXBkYXRlZCB0byBDTSAwLjkzPC9saT4KICA8bGk+MC4xLjggLSBVcGRhdGVkIHRvIENNIDAuOSwgYWRkZWQgb3B0aW9uIG9uIGhvdyB0byBoYW5kbGUgVEFCPC9saT4KICA8bGk+MC4xLjcgLSBVcGRhdGVkIHRvIENNIDAuODA8L2xpPgogIDxsaT4wLjEuNiAtIFVwZGF0ZWQgdG8gQ00gMC43MCwgQWRkZWQgb3B0aW9uIHRvIG1hdGNoIHBhcmVudGhlc2lzPC9saT4KICA8bGk+MC4xLjUgLSBVcGRhdGVkIHRvIENNIDAuNjYsIHJlbW92ZWQgYSBzdHJhbmdlIFxuIGNoYXIgZnJvbSBoZWFkZXJvdXRwdXQsIG1hZGUgdGFiYmluZyB3b3JrPC9saT4KICA8bGk+MC4xLjQgLSBGaXhlZCBDUFUgaG9nZ2luZyBwcm9ibGVtcyBieSByZXdyaXRpbmcgdGVzdGFyZWEtY29kZTwvbGk+CiAgPGxpPjAuMS4zIC0gVXBkYXRlZCB0byBDTSAwLjY1LCBhZGRlZCBvcHRpb24gdG8gdG9nZ2xlIHdvcmR3cmFwPC9saT4KICA8bGk+MC4xLjIgLSBVcGRhdGVkIHRvIENNIDAuNjM8L2xpPgogIDxsaT4wLjEuMSAtIFVwZGF0ZWQgdG8gQ00gMC42MiwgZml4ZWQgZXhhbXBsZXMgYW5kIHByb2JhYmx5IGZ1bmN0aW9uYWxpdHkgYXMgd2VsbDwvbGk+CiAgPGxpPjAuMS4wIC0gSW5pdGlhbCByZWxlYXNlIDwvbGk+CjwvdWw+PGJyIC8+]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKaWYgKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CiAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOwogIHJldHVybjsKfQovKiRjb25mPWNtc21zKCktPkdldENvbmZpZygpOwplY2hvICRjb25mWyJzc2xfdXJsIl07Ki8KaWYgKGlzc2V0KCRwYXJhbXNbImV4YW1wbGVzeW50YXgiXSkpIHsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiZXhhbXBsZXN5bnRheCIsJHBhcmFtc1siZXhhbXBsZXN5bnRheCJdKTsKfQoKZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigic2V0dGluZ3MiLCR0aGlzLT5MYW5nKCJzZXR0aW5nc3RhYiIpKTsKZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCJodG1sIiwkdGhpcy0+TGFuZygiaHRtbHRlc3QiKSk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigicGhwIiwkdGhpcy0+TGFuZygicGhwdGVzdCIpKTsKZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCJjc3MiLCR0aGlzLT5MYW5nKCJjc3N0ZXN0IikpOwplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoImpzIiwkdGhpcy0+TGFuZygianN0ZXN0IikpOwoKZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwplY2hvICR0aGlzLT5TdGFydFRhYkNvbnRlbnQoKTsKCgplY2hvICR0aGlzLT5TdGFydFRhYigic2V0dGluZ3MiKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwgJ3NhdmVzZXR0aW5ncycsICRyZXR1cm5pZCkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKCiR0aGlzLT5zbWFydHktPmFzc2lnbignc2hvd2xpbmVudW1iZXJzdGV4dCcsICR0aGlzLT5MYW5nKCJzaG93bGluZW51bWJlcnMiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc2hvd2xpbmVudW1iZXJzaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsInNob3dsaW5lbnVtYmVycyIsMSwkdGhpcy0+R2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwxKSkpOwoKLyokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2FsbG93ZnVsbHNjcmVlbnRleHQnLCAkdGhpcy0+TGFuZygiYWxsb3dmdWxsc2NyZWVuIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2FsbG93ZnVsbHNjcmVlbmlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCJhbGxvd2Z1bGxzY3JlZW4iLDEsJHRoaXMtPkdldFByZWZlcmVuY2UoImFsbG93ZnVsbHNjcmVlbiIsMSkpKTsKKi8KLyokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Nzc2FkZGl0aW9uc3RleHQnLCAkdGhpcy0+TGFuZygiY3NzYWRkaXRpb25zIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Nzc2FkZGl0aW9uc2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsImNzc2FkZGl0aW9ucyIsJHRoaXMtPkdldFByZWZlcmVuY2UoImNzc2FkZGl0aW9ucyIsJHRoaXMtPl9kZWZhdWx0Y3NzYWRkaXRpb25zKSwiNjAiKSk7CiovCiR0aGlzLT5zbWFydHktPmFzc2lnbigndGFic2l6ZXRleHQnLCAkdGhpcy0+TGFuZygidGFic2l6ZSIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0YWJzaXplaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwidGFic2l6ZSIsJHRoaXMtPkdldFByZWZlcmVuY2UoInRhYnNpemUiLDIpLCI4IikpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aGVtZXRleHQnLCAkdGhpcy0+TGFuZygidGhlbWUiKSk7CgokZmlsZXM9c2NhbmRpcihkaXJuYW1lKF9fRklMRV9fKS5ESVJFQ1RPUllfU0VQQVJBVE9SLiJjb2RlbWlycm9yMyIuRElSRUNUT1JZX1NFUEFSQVRPUi4idGhlbWUiKTsKCiR0aGVtZXM9YXJyYXkoKTsKZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlKSB7CiAgaWYgKCRmaWxlWzBdPT0iLiIpIGNvbnRpbnVlOwogICR0aGVtZT1zdHJfcmVwbGFjZSgiLmNzcyIsIiIsJGZpbGUpOwogICR0aGVtZXNbJHRoZW1lXT0kdGhlbWU7Cn0KCiR0aGlzLT5zbWFydHktPmFzc2lnbigndGhlbWVpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwidGhlbWUiLCR0aGVtZXMsLTEsJHRoaXMtPkdldFByZWZlcmVuY2UoInRoZW1lIiwiZGVmYXVsdCIpKSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZ3RleHQnLCAkdGhpcy0+TGFuZygidGV4dHdyYXBwaW5nIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZ2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCJ0ZXh0d3JhcHBpbmciLDEsJHRoaXMtPkdldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIsMSkpKTsKCi8qJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhdXRvbWF0Y2hwYXJlbnN0ZXh0JywgJHRoaXMtPkxhbmcoImF1dG9tYXRjaHBhcmVucyIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhdXRvbWF0Y2hwYXJlbnNpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwiYXV0b21hdGNocGFyZW5zIiwiMSIsJHRoaXMtPkdldFByZWZlcmVuY2UoImF1dG9tYXRjaHBhcmVucyIsIjAiKSkpOwoqLwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RhYmhhbmRsaW5ndGV4dCcsICR0aGlzLT5MYW5nKCJ0YWJoYW5kbGluZyIpKTsKJHRhYmZ1bmN0aW9ucz1hcnJheSgKICAkdGhpcy0+TGFuZygidGFiZGVmYXVsdCIpPT4iZGVmYXVsdCIsCiAgJHRoaXMtPkxhbmcoInRhYmluZGVudCIpPT4iaW5kZW50IiwKICAkdGhpcy0+TGFuZygidGFic3BhY2VzIik9PiJjbGFzc2ljIiwKICAkdGhpcy0+TGFuZygidGFic2hpZnQiKT0+InNoaWZ0IgopOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RhYmhhbmRsaW5naW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsInRhYmhhbmRsaW5nIiwkdGFiZnVuY3Rpb25zLC0xLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0YWJoYW5kbGluZyIsImluZGVudCIpKSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCAkdGhpcy0+TGFuZygnc2F2ZXNldHRpbmdzJykpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnc2V0dGluZ3MudHBsJyk7CgplY2hvICR0aGlzLT5FbmRUYWIoKTsKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiKCJodG1sIik7CgokY29udGVudD0iCjx0YWJsZT4KICA8dHI+PHRkPlRlc3RpbmcgSFRNTC1zeW50YXg8L3RkPjwvdHI+CiAgPHRyPjx0ZD5BbmQgZG9pbmcgYWJzb2x1dGVseSBub3RoaW5nIGVsc2U8L3RkPjwvdHI+CjwvdGFibGU+CiI7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsImRlZmF1bHRhZG1pbiIpOwplY2hvICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJGNvbnRlbnQsInRlc3RodG1sIiwnJywnJywnJywnJywnJywnJywnQ29kZU1pcnJvcicsImh0bWwiKTsKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwoKZWNobyAkdGhpcy0+RW5kVGFiKCk7CgplY2hvICR0aGlzLT5TdGFydFRhYigicGhwIik7CiRjb250ZW50PSIKPD9waHAKICBmdW5jdGlvbiB0ZXN0UEhQKFwkc29tZXBhcmFtKSB7CiAgZWNobyAnRG8geW91IHRoaW5rIHRoaXMgbG9va3MgbmljZT8nOwp9Cj8+CiI7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsImRlZmF1bHRhZG1pbiIpOwplY2hvICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJGNvbnRlbnQsInRlc3RwaHAiLCcnLCcnLCcnLCcnLCcnLCcnLCdDb2RlTWlycm9yJywicGhwIik7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKTsKCmVjaG8gJHRoaXMtPkVuZFRhYigpOwoKZWNobyAkdGhpcy0+U3RhcnRUYWIoImNzcyIpOwokY29udGVudD0iCi50ZXN0Y3NzIHsKICBmb250LXdlaWdodDpib2xkOwogIGhlaWdodDogMTBweDsKfQoiOwplY2hvICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCJkZWZhdWx0YWRtaW4iKTsKZWNobyAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsJGlkLCRjb250ZW50LCJ0ZXN0Y3NzIiwnJywnJywnJywnJywnJywnJywnQ29kZU1pcnJvcicsImNzcyIpOwplY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7CmVjaG8gJHRoaXMtPkVuZFRhYigpOwoKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiKCJqcyIpOwogICAgJGNvbnRlbnQ9JwpmdW5jdGlvbiBteWpzZnVuY3Rpb24ocGFyYW1zKSB7CiAgdmFyIG1zZyA9ICJUaGlzIGphdmFzY3JpcHQgaXMgZmFudGFzdGljISIKICBmb3IgKHZhciBpPTA7IGk8OTk5OTsgaSsrKSB7CiAgICBhbGVydChtc2cpOwogICAgLypUaGlzIG11c3QgYmUgdGhlIG1vc3QgYW5ub3lpbmcgZnVuY3Rpb24gZXZlciEqLwogIH0KICByZXR1cm4gdHJ1ZQp9Cic7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsImRlZmF1bHRhZG1pbiIpOwplY2hvICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJGNvbnRlbnQsInRlc3RqcyIsJycsJycsJycsJycsJycsJycsJ0NvZGVNaXJyb3InLCJqcyIpOwplY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7CmVjaG8gJHRoaXMtPkVuZFRhYigpOwoKCmVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsKLyoKJGNvbnRlbnQ9IiI7CnN3aXRjaCAoJHRoaXMtPkdldFByZWZlcmVuY2UoImV4YW1wbGVzeW50YXgiLCJodG1sIikpIHsKICBjYXNlICJodG1sIiA6IHsKICAgICRjb250ZW50PSIKPGh0bWw+CiAgPGhlYWQ+CiAgICA8dGl0bGU+VGVzdGluZyBodG1sLXN5bnRheDwvdGl0bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgQW5kIGRvaW5nIGFic29sdXRlbHkgbm90aGluZyBlbHNlCiAgPC9ib2R5Pgo8L2h0bWw+CiI7CiAgYnJlYWs7CiAgfQogIGNhc2UgImNzcyIgOiB7CiAgICAkY29udGVudD0iCi50ZXN0Y3NzIHsKICBmb250LXdlaWdodDpib2xkOwogIGhlaWdodDogMTBweDsKfQoiOwogIGJyZWFrOwogIH0KICBjYXNlICJwaHAiIDogewogICAgJGNvbnRlbnQ9Igo8P3BocAogIGZ1bmN0aW9uIHRlc3RQSFAoXCRzb21lcGFyYW0pIHsKICAgIGVjaG8gJ0RvIHlvdSB0aGluayB0aGlzIGxvb2tzIG5pY2U/JzsKICB9Cj8+CiI7CiAgYnJlYWs7CiAgfQogIGNhc2UgImpzIiA6IHsKICAgICRjb250ZW50PScKZnVuY3Rpb24gbXlqc2Z1bnRpb24ocGFyYW1zKSB7CiAgdmFyIG1zZyA9ICJUaGlzIGphdmFzY3JpcHQgaXMgZmFudGFzdGljISIKICBmb3IgKHZhciBpPTA7IGk8OTk5OTsgaSsrKSB7CiAgICBhbGVydChtc2cpOwoKICB9CiAgcmV0dXJuIHRydWUKfQonOwogIGJyZWFrOwogIH0KfSovCi8qCmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsImRlZmF1bHRhZG1pbiIpOwplY2hvICR0aGlzLT5MYW5nKCJleGFtcGxlc3ludGF4IikuIjogIjsKJHN5bnRheGVzPWFycmF5KCR0aGlzLT5MYW5nKCJodG1sdGVzdCIpPT4iaHRtbCIsJHRoaXMtPkxhbmcoImNzc3Rlc3QiKT0+ImNzcyIsJHRoaXMtPkxhbmcoInBocHRlc3QiKT0+InBocCIsJHRoaXMtPkxhbmcoImpzdGVzdCIpPT4ianMiKTsKZWNobyAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsImV4YW1wbGVzeW50YXgiLCRzeW50YXhlcywtMSwkdGhpcy0+R2V0UHJlZmVyZW5jZSgiZXhhbXBsZXN5bnRheCIsImh0bWwiKSwib25jaGFuZ2U9J3RoaXMuZm9ybS5zdWJtaXQoKSciKTsKLy9lY2hvICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsImV4YW1wbGVzdWJtaXQiLCR0aGlzLT5MYW5nKCJjaGFuZ2UiKSk7CmVjaG8gIjxici8+IjsKZWNobyAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsJGlkLCRjb250ZW50LCJ0ZXN0YXJlYTEiLCcnLCcnLCcnLCcnLCcnLCcnLCdDb2RlTWlycm9yJywkdGhpcy0+R2V0UHJlZmVyZW5jZSgiZXhhbXBsZXN5bnRheCIsImh0bWwiKSk7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKTsKKi8KPz4=]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKaWYgKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CiAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOwogIHJldHVybjsKfQoKaWYoaXNzZXQoJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pKSAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwgJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsICcwJyk7CgovKmlmKGlzc2V0KCRwYXJhbXNbImFsbG93ZnVsbHNjcmVlbiJdKSkKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiYWxsb3dmdWxsc2NyZWVuIiwgJHBhcmFtc1siYWxsb3dmdWxsc2NyZWVuIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoImFsbG93ZnVsbHNjcmVlbiIsICcwJyk7CiovCmlmKGlzc2V0KCRwYXJhbXNbInRleHR3cmFwcGluZyJdKSkKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidGV4dHdyYXBwaW5nIiwgJHBhcmFtc1sidGV4dHdyYXBwaW5nIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIsICcwJyk7CiAgCi8qaWYoaXNzZXQoJHBhcmFtc1siYXV0b21hdGNocGFyZW5zIl0pKQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJhdXRvbWF0Y2hwYXJlbnMiLCAkcGFyYW1zWyJhdXRvbWF0Y2hwYXJlbnMiXSk7CmVsc2UKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiYXV0b21hdGNocGFyZW5zIiwgJzAnKTsqLwoKaWYoaXNzZXQoJHBhcmFtc1sidGFiaGFuZGxpbmciXSkpCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRhYmhhbmRsaW5nIiwgJHBhcmFtc1sidGFiaGFuZGxpbmciXSk7CgppZihpc3NldCgkcGFyYW1zWyJ0YWJzaXplIl0pKQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0YWJzaXplIiwgJHBhcmFtc1sidGFic2l6ZSJdKTsKCmlmKGlzc2V0KCRwYXJhbXNbImNzc2FkZGl0aW9ucyJdKSkKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiY3NzYWRkaXRpb25zIiwgJHBhcmFtc1siY3NzYWRkaXRpb25zIl0pOwoKaWYoaXNzZXQoJHBhcmFtc1sidGhlbWUiXSkpCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRoZW1lIiwgJHBhcmFtc1sidGhlbWUiXSk7CgoKJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCxhcnJheSgibW9kdWxlX21lc3NhZ2UiPT4kdGhpcy0+TGFuZygic2V0dGluZ3NzYXZlZCIpLCJ0YWIiPT4ic2V0dGluZ3MiKSk7Cj8+]]></data>
	</file>
	<file>
	  <filename>/CodeMirror.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiNDTVMgLSBDTVMgTWFkZSBTaW1wbGUNCiMoYykyMDA1LTA2IGJ5IE1vcnRlbiBQb3Vsc2VuIChtb3J0ZW5AcG91bHNlbi5vcmcpDQojVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMNCiNUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KI2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KI2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiNhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCg0KDQpjbGFzcyBDb2RlTWlycm9yIGV4dGVuZHMgQ01TTW9kdWxlIHsNCgl2YXIgJG5vZWRpdG9ycz0wOw0KCXZhciAkaGVhZGVyaW5mb3NlbnQ9ZmFsc2U7DQogIHZhciAkX2h0bWxhY3RpdmUgPSBmYWxzZTsNCiAgdmFyICRfamF2YXNjcmlwdGFjdGl2ZSA9IGZhbHNlOw0KICB2YXIgJF9jc3NhY3RpdmUgPSBmYWxzZTsNCiAgdmFyICRfcGhwYWN0aXZlID0gZmFsc2U7DQogIHZhciAkX2RlZmF1bHRjc3NhZGRpdGlvbnMgPSAiLkNvZGVNaXJyb3Ige2xpbmUtaGVpZ2h0OiAxLjNlbTsgZm9udC1zaXplOjExcHh9IjsNCg0KDQoJZnVuY3Rpb24gR2V0TmFtZSgpIHsNCgkJcmV0dXJuICdDb2RlTWlycm9yJzsNCgl9DQoNCglmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWZ1bmN0aW9uIEhhc0FkbWluKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglmdW5jdGlvbiBHZXRIZWxwKCkgew0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoImhlbHAiKTsNCgl9DQoNCglmdW5jdGlvbiBHZXRBdXRob3IoKSB7DQoJCXJldHVybiAnTW9ydGVuIFBvdWxzZW4nOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgew0KCQlyZXR1cm4gJyZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7JzsNCgl9DQoNCglmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKSB7DQoJCXJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdjaGFuZ2Vsb2cudHBsJyk7DQoJfQ0KDQoJZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsNCgkJcmV0dXJuICczLjAuMCc7DQoJfQ0KCQ0KCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgew0KCQlyZXR1cm4gIjEuMTEiOw0KCX0NCg0KICBmdW5jdGlvbiBJbml0aWFsaXplQWRtaW4oKSB7DQogICAkdGhpcy0+c3ludGF4YWN0aXZlPXRydWU7DQogIH0NCg0KICBmdW5jdGlvbiBIYXNDYXBhYmlsaXR5KCRjYXBhYmlsaXR5LCAkcGFyYW1zPWFycmF5KCkpIHsNCiAgICBpZiAoJGNhcGFiaWxpdHk9PSJ3eXNpd3lnIikgcmV0dXJuIHRydWU7DQogICAgaWYgKCRjYXBhYmlsaXR5PT0ic3ludGF4aGlnaGxpZ2h0aW5nIikgcmV0dXJuIHRydWU7DQogICAgcmV0dXJuIGZhbHNlOw0KICB9DQoNCglmdW5jdGlvbiBJc1dZU0lXWUcoKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCWZ1bmN0aW9uIElzU3ludGF4SGlnaGxpZ2h0ZXIoKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsNCgkJcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJyk7DQoJfQ0KDQoJZnVuY3Rpb24gU3ludGF4UGFnZUZvcm1TdWJtaXQoKSB7DQoJCXJldHVybiAiZm9yICh2YXIgY250RWRpdG9yID0gMDsgY250RWRpdG9yIDwgbnVtQ29kZU1pcnJvckFyZWFzOyBjbnRFZGl0b3IrKykge1xuIg0KCQkuICJcdFx0dmFyIGVkaXRvciA9IGV2YWwoJ2NvZGVtaXJyb3JlZGl0b3InICsgY250RWRpdG9yKTtcbiINCiAgICAuIlx0XHRlZGl0b3Iuc2F2ZSgpIg0KICAgIC8qLiAiXHRcdHZhciB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlbWlycm9yYXJlYScgKyBjbnRFZGl0b3IpO1xuIg0KICAgICAgLy8uImFsZXJ0KGVkaXRvci5nZXRDb2RlKCkpOyINCgkJLy8uICJcdFx0ZWRpdG9yLnRleHRhcmVhLnZhbHVlID0gZWRpdG9yLmdldENvZGUoKTtcbiINCiAgICAgIC4gIlx0XHR0ZXh0YXJlYS52YWx1ZSA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuIiovDQoJCS4gIlx0fVxuIjsNCgl9DQoJDQoJZnVuY3Rpb24gV1lTSVdZR1BhZ2VGb3JtU3VibWl0KCkgew0KCQlyZXR1cm4gJHRoaXMtPlN5bnRheFBhZ2VGb3JtU3VibWl0KCk7DQoJfQ0KDQoJZnVuY3Rpb24gV1lTSVdZR1RleHRBcmVhKCRuYW1lPSd0ZXh0YXJlYScsJGNvbHVtbnM9JzgwJywkcm93cz0nMTUnLCRlbmNvZGluZz0nJywkY29udGVudD0nJywkc3R5bGVzaGVldD0nJywkYWRkdGV4dD0nJykgew0KCQkkdGhpcy0+d3lzaXd5Z2FjdGl2ZT10cnVlOw0KCQlyZXR1cm4gJHRoaXMtPlN5bnRheFRleHRhcmVhKCRuYW1lLCJodG1sIiwkY29sdW1ucywkcm93cywkZW5jb2RpbmcsJGNvbnRlbnQpOw0KCX0NCg0KCWZ1bmN0aW9uIFN5bnRheFRleHRhcmVhKCRuYW1lPSd0ZXh0YXJlYScsJHN5bnRheD0iaHRtbCIsJGNvbHVtbnM9JzgwJywkcm93cz0nMTUnLCRlbmNvZGluZz0nJywkY29udGVudD0nJywkc3R5bGVzaGVldD0nJywkYWRkdGV4dD0nJykgew0KCQkvLyR0ZXh0YXJlYT0iIjsNCg0KCQkkdGhpcy0+c3ludGF4YWN0aXZlPXRydWU7CQ0KCQkvKmlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgidXNlYXV0b2NvbXBsZXRlIiwiMSIpPT0iMCIpICRjbGFzcy49IiBhdXRvY29tcGxldGUtb2ZmIjsNCgkJaWYgKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJzaG93bGluZW51bWJlcnMiLCIxIik9PSIwIikgJGNsYXNzLj0iIGxpbmVudW1iZXJzLW9mZiI7DQoJCSovDQogICAgICAvKmlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgic2hvd3RvZ2dsZXN5bnRheCIsIjEiKT09IjEiKSB7DQogICAgIA0KCQkJJHRleHRhcmVhLj0iPGJyLz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIGNoZWNrZWQ9JzEnIG9uY2xpY2s9J2NvZGVwcmVzcyIuJHRoaXMtPm5vZWRpdG9ycy4iLnRvZ2dsZUVkaXRvcigpOycgY2hlY2tlZD0nY2hlY2tlZCcgaWQ9J2NvZGVwcmVzc2NoZWNrIi4kdGhpcy0+bm9lZGl0b3JzLiInPjxsYWJlbCBmb3I9J2NvZGVwcmVzc2NoZWNrIi4kdGhpcy0+bm9lZGl0b3JzLiInPiIuJHRoaXMtPkxhbmcoInRvZ2dsZXN5bnRheCIpLiI8L2xhYmVsPiI7DQoJCX0qLw0KICAgICRzbWFydHk9JHRoaXMtPnNtYXJ0eTsNCiAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsIjEiKT09IjEiKXsNCiAgICAgICRzbWFydHktPmFzc2lnbignbGluZW51bWJlcnMnLCAidHJ1ZSIpOw0KICAgIH0gZWxzZSB7DQogICAgICAkc21hcnR5LT5hc3NpZ24oJ2xpbmVudW1iZXJzJywgImZhbHNlIik7DQogICAgfQ0KICAgIGlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgidGV4dHdyYXBwaW5nIiwiMSIpPT0iMSIpew0KICAgICAgJHNtYXJ0eS0+YXNzaWduKCd0ZXh0d3JhcHBpbmcnLCAidHJ1ZSIpOw0KICAgIH0gZWxzZSB7DQogICAgICAkc21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZycsICJmYWxzZSIpOw0KICAgIH0NCiAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoImF1dG9tYXRjaHBhcmVucyIsIjAiKT09IjEiKXsNCiAgICAgICRzbWFydHktPmFzc2lnbignYXV0b21hdGNocGFyZW5zJywgInRydWUiKTsNCiAgICB9IGVsc2Ugew0KICAgICAgJHNtYXJ0eS0+YXNzaWduKCdhdXRvbWF0Y2hwYXJlbnMnLCAiZmFsc2UiKTsNCiAgICB9DQoNCiAgICAkdGhlbWU9JHRoaXMtPkdldFByZWZlcmVuY2UoInRoZW1lIiwiZGVmYXVsdCIpOw0KICAgICRzbWFydHktPmFzc2lnbigndGhlbWUnLCAkdGhlbWUpOw0KICAgICR0YWJzaXplPSR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0YWJzaXplIiwiMiIpOw0KICAgICRzbWFydHktPmFzc2lnbigndGFic2l6ZScsICR0YWJzaXplKTsNCg0KDQogICAgLy9saW5lTnVtYmVyczogdHJ1ZSwNCiAgICAvLyRjb25maWc9JHRoaXMtPkdldENvbmZpZygpOw0KICAgICRjb25maWc9Y21zbXMoKS0+R2V0Q29uZmlnKCk7DQoNCiAgICAkc21hcnR5LT5hc3NpZ24oJ3RleHRhcmVhaWQnLCAiY29kZW1pcnJvcmFyZWEiLiR0aGlzLT5ub2VkaXRvcnMpOw0KICAgICRzbWFydHktPmFzc2lnbigndGV4dGFyZWFuYW1lJywgJG5hbWUpOw0KICAgICRzbWFydHktPmFzc2lnbignY29udGVudCcsICRjb250ZW50KTsNCiAgICAkc21hcnR5LT5hc3NpZ24oJ2lkJywgJHRoaXMtPm5vZWRpdG9ycyk7DQogICAgLy8kcGFyc2VyZmlsZT0iIjsgJGNzc2ZpbGU9IiI7DQogICAgLyokY21kaXI9JGNvbmZpZ1sicm9vdF91cmwiXS4nL21vZHVsZXMvQ29kZU1pcnJvci9jb2RlbWlycm9yJzsNCiAgICBzd2l0Y2goJHN5bnRheCkgew0KICAgICAgDQogICAgICBjYXNlICJodG1sIiA6IA0KICAgICAgICAkcGFyc2VyZmlsZT0nInBhcnNleG1sLmpzIic7IA0KICAgICAgICAkY3NzZmlsZT0nIicuJGNtZGlyLicvbW9kZS94bWwveG1sLmNzcyInOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgImNzcyIgOg0KICAgICAgICAkcGFyc2VyZmlsZT0nInBhcnNlY3NzLmpzIic7DQogICAgICAgICRjc3NmaWxlPSciJy4kY21kaXIuJy9jc3MvY3NzLmNzcyInOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgImphdmFzY3JpcHQiIDoNCiAgICAgIGNhc2UgImpzIiA6DQogICAgICAgICRwYXJzZXJmaWxlPSdbInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiXSc7DQogICAgICAgICRjc3NmaWxlPSciJy4kY21kaXIuJy9jc3MvanNjb2xvcnMuY3NzIic7DQogICAgICAgIGJyZWFrOw0KICAgICAgY2FzZSAicGhwIiA6DQogICAgICAgICRwYXJzZXJmaWxlPSdbInBhcnNleG1sLmpzIiwgInBhcnNlY3NzLmpzIiwgInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiLCAicGFyc2VodG1sbWl4ZWQuanMiLCIuLi9jb250cmliL3BocC9qcy90b2tlbml6ZXBocC5qcyIsICIuLi9jb250cmliL3BocC9qcy9wYXJzZXBocC5qcyIsICAgICAgICAgICAgICAgICAgICAgIi4uL2NvbnRyaWIvcGhwL2pzL3BhcnNlcGhwaHRtbG1peGVkLmpzIl0nOw0KICAgICAgICAkY3NzZmlsZT0nWyInLiRjbWRpci4nL2Nzcy94bWxjb2xvcnMuY3NzIiwiJy4kY21kaXIuJy9jc3MvanNjb2xvcnMuY3NzIiwiJy4kY21kaXIuJy9jc3MvY3NzY29sb3JzLmNzcyIsIicuJGNtZGlyLicvY29udHJpYi9waHAvY3NzL3BocGNvbG9ycy5jc3MiXSc7DQogICAgICAgIGJyZWFrOw0KICAgIH0qLw0KICAgIC8vJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwYXJzZXJmaWxlJywgJHBhcnNlcmZpbGUpOw0KICAgIC8vJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjc3NmaWxlJywgJGNzc2ZpbGUpOw0KDQogICAgJHNtYXJ0eS0+YXNzaWduKCd0YWJoYW5kbGluZycsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0YWJoYW5kbGluZyIsImluZGVudCIpKTsNCiAgICAkc21hcnR5LT5hc3NpZ24oJ2FsbG93ZnVsbHNjcmVlbicsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCJhbGxvd2Z1bGxzY3JlZW4iLCIwIikpOw0KICAgIA0KICAgICRzbWFydHktPmFzc2lnbigncm9vdF91cmwnLCAkY29uZmlnWyJyb290X3VybCJdKTsNCg0KICAgIHN3aXRjaCAoJHN5bnRheCkgew0KICAgICAgY2FzZSAiaHRtbCIgOiAkc21hcnR5LT5hc3NpZ24oJ21vZGUnLCAidGV4dC9odG1sIik7ICR0aGlzLT5faHRtbGFjdGl2ZT10cnVlOyBicmVhazsNCiAgICAgIGNhc2UgImpzIjoNCiAgICAgIGNhc2UgImphdmFzY3JpcHQiIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywgInRleHQvamF2YXNjcmlwdCIpOyR0aGlzLT5famF2YXNjcmlwdGFjdGl2ZT10cnVlOyAgYnJlYWs7DQogICAgICBjYXNlICJjc3MiIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywgInRleHQvY3NzIik7ICR0aGlzLT5fY3NzYWN0aXZlPXRydWU7IGJyZWFrOw0KICAgICAgLy9jYXNlICJwaHAiIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywgImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwIik7ICR0aGlzLT5fcGhwYWN0aXZlPXRydWU7IGJyZWFrOw0KICAgICAgY2FzZSAicGhwIiA6ICRzbWFydHktPmFzc2lnbignbW9kZScsICJ0ZXh0L3gtcGhwIik7ICR0aGlzLT5fcGhwYWN0aXZlPXRydWU7IGJyZWFrOw0KICAgIH0NCg0KDQogICAgJHRleHRhcmVhPSR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2NvZGVtaXJyb3IzYXJlYS50cGwnKTsNCg0KCQkkdGhpcy0+bm9lZGl0b3JzKys7DQoNCgkJcmV0dXJuICR0ZXh0YXJlYTsNCgl9DQoNCglmdW5jdGlvbiBXWVNJV1lHR2VuZXJhdGVIZWFkZXIoJGh0bWxyZXN1bHQ9JycpIHsNCgkJcmV0dXJuICR0aGlzLT5TeW50YXhHZW5lcmF0ZUhlYWRlcigpOw0KCX0NCg0KCWZ1bmN0aW9uIFN5bnRheEdlbmVyYXRlSGVhZGVyKCRodG1scmVzdWx0PScnKSB7DQoJCWlmICgkdGhpcy0+aGVhZGVyaW5mb3NlbnQpIHJldHVybiAiIjsNCgkJaWYgKCR0aGlzLT5ub2VkaXRvcnM9PTApIHJldHVybiAnJzsNCgkJLy8kR0xPQkFMU1siY29uZmlnIl1bInJvb3RfcGF0aCJdLg0KICAgICRjb25maWc9Y21zbXMoKS0+R2V0Q29uZmlnKCk7DQogICAgJGFscmVhZHlpbj1hcnJheSgpOw0KDQogICAgJHRoZW1lPSR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0aGVtZSIsImVsZWdhbnQiKTsNCg0KDQoJCSRzY3JpcHRwYXRoPWRpcm5hbWUoJGNvbmZpZ1siYWRtaW5fdXJsIl0pLiIvbW9kdWxlcy9Db2RlTWlycm9yL2NvZGVtaXJyb3IzIjsNCiAgICAvL2VjaG8gJHNjcmlwdHBhdGg7DQoNCgkJJGhlYWRlcj0iIjsNCiAgICAkaGVhZGVyLj0nDQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy4kc2NyaXB0cGF0aC4nL2xpYi9jb2RlbWlycm9yLmNzcyIvPic7DQoJCSRoZWFkZXIuPScNCgkgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLicvbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pic7DQoNCiAgICAgICRoZWFkZXIuPScNCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInLiRzY3JpcHRwYXRoLicvdGhlbWUvJy4kdGhlbWUuJy5jc3MiLz4nOw0KICAgICAgLyokaGVhZGVyLj0nDQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy4kc2NyaXB0cGF0aC4nL3RoZW1lL2RlZmF1bHQuY3NzIi8+JzsqLw0KDQogICAgaWYgKCR0aGlzLT5faHRtbGFjdGl2ZSkgew0KDQogICAgICAkaGVhZGVyLj0nDQogICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+JzsNCiAgICAgICRhbHJlYWR5aW5bXT0iY3NzLmpzIjsNCiAgICAgICRoZWFkZXIuPScNCiAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLicvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pic7DQogICAgICAkYWxyZWFkeWluW109ImphdmFzY3JpcHQuanMiOw0KICAgICAgJGhlYWRlci49Jw0KICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuJHNjcmlwdHBhdGguJy9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pic7DQogICAgICAkYWxyZWFkeWluW109InhtbC5qcyI7DQogICAgICAkaGVhZGVyLj0nDQogICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+JzsNCiAgICAgICRhbHJlYWR5aW5bXT0iaHRtbG1peGVkLmpzIjsNCiAgICB9DQogICAgaWYgKCR0aGlzLT5famF2YXNjcmlwdGFjdGl2ZSkgew0KICAgICAgaWYgKCFpbl9hcnJheSgiamF2YXNjcmlwdC5qcyIsJGFscmVhZHlpbikpIHsNCiAgICAgICAgJGhlYWRlci49Jw0KICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuJHNjcmlwdHBhdGguJy9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+JzsNCiAgICAgICAgJGFscmVhZHlpbltdPSJqYXZhc2NyaXB0LmpzIjsNCiAgICAgIH0NCiAgICAgICAgICAgIA0KDQogICAgfQ0KICAgIGlmICgkdGhpcy0+X2Nzc2FjdGl2ZSkgew0KICAgICAgaWYgKCFpbl9hcnJheSgiY3NzLmpzIiwkYWxyZWFkeWluKSkgew0KICAgICAgICAkaGVhZGVyLj0nDQogICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+JzsNCiAgICAgICAgJGFscmVhZHlpbltdPSJjc3MuanMiOw0KICAgICAgfQ0KDQogICAgfQ0KICAgIGlmICgkdGhpcy0+X3BocGFjdGl2ZSkgew0KICAgICAgLyppZiAoIWluX2FycmF5KCJjc3MuanMiLCRhbHJlYWR5aW4pKSB7DQogICAgICAgICRoZWFkZXIuPScNCiAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuJHNjcmlwdHBhdGguJy9tb2RlL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pic7DQogICAgICAgICRhbHJlYWR5aW5bXT0iY3NzLmpzIjsNCiAgICAgIH0NCiAgICAgIGlmICghaW5fYXJyYXkoImphdmFzY3JpcHQuanMiLCRhbHJlYWR5aW4pKSB7DQogICAgICAgICRoZWFkZXIuPScNCiAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuJHNjcmlwdHBhdGguJy9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+JzsNCiAgICAgICAgJGFscmVhZHlpbltdPSJqYXZhc2NyaXB0LmpzIjsNCiAgICAgIH0NCiAgICAgIGlmICghaW5fYXJyYXkoInhtbC5qcyIsJGFscmVhZHlpbikpIHsNCiAgICAgICAgJGhlYWRlci49Jw0KICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+JzsNCiAgICAgICAgJGFscmVhZHlpbltdPSJ4bWwuanMiOw0KICAgICAgfSovDQogICAgICBpZiAoIWluX2FycmF5KCJjbGlrZS5qcyIsJGFscmVhZHlpbikpIHsNCiAgICAgICAgJGhlYWRlci49Jw0KICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUvY2xpa2UvY2xpa2UuanMiPjwvc2NyaXB0Pic7DQogICAgICAgICRhbHJlYWR5aW5bXT0iY2xpa2UuanMiOw0KICAgICAgfQ0KICAgICAgLyppZiAoIWluX2FycmF5KCJjbGlrZS5jc3MiLCRhbHJlYWR5aW4pKSB7DQogICAgICAgICRoZWFkZXIuPScNCiAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy4kc2NyaXB0cGF0aC4nL21vZGUvY2xpa2UvY2xpa2UuY3NzIiAvPic7DQogICAgICAgICRhbHJlYWR5aW5bXT0iY2xpa2UuY3NzIjsNCiAgICAgIH0qLw0KICAgICAgaWYgKCFpbl9hcnJheSgicGhwLmpzIiwkYWxyZWFkeWluKSkgew0KICAgICAgICAkaGVhZGVyLj0nDQogICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLicvbW9kZS9waHAvcGhwLmpzIj48L3NjcmlwdD4nOw0KICAgICAgICAkYWxyZWFkeWluW109InBocC5qcyI7DQogICAgICB9DQogICAgfQ0KICAgIC8qaWYgKCR0aGVtZSE9ImRlZmF1bHQiKSB7DQogICAgICAkaGVhZGVyLj0nDQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy4kc2NyaXB0cGF0aC4nL3RoZW1lL2RlZmF1bHQuY3NzIi8+JzsNCiAgICB9Ki8NCg0KICAgICRoZWFkZXIuPScNCg0KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCiAgdmFyIG51bUNvZGVNaXJyb3JBcmVhcz0nLiR0aGlzLT5ub2VkaXRvcnMuJzsNCjwvc2NyaXB0Pg0KDQonOw0KDQogICAgJGhlYWRlci49Jw0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgJy4kdGhpcy0+R2V0UHJlZmVyZW5jZSgiY3NzYWRkaXRpb25zIiwkdGhpcy0+X2RlZmF1bHRjc3NhZGRpdGlvbnMpLicNCjwvc3R5bGU+DQogICAgJzsNCg0KICAgIC8qaWYgKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJhbGxvd2Z1bGxzY3JlZW4iLDApPT0iMSIpIHsNCiAgICAkYmdjb2xvcj0id2hpdGUiOw0KICAgIGlmICgkdGhlbWU9PSJuaWdodCIpICRiZ2NvbG9yPSJibGFjayI7DQogICAgICAkaGVhZGVyLj0nDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgICAgLmZ1bGxzY3JlZW4gew0KICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7DQogICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQogICAgICAgICAgICAgICAgICB0b3A6IDA7DQogICAgICAgICAgICAgICAgICBsZWZ0OiAwOw0KICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7DQogICAgICAgICAgICAgICAgICB6LWluZGV4OiA5OTk5Ow0KICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwOw0KICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDsNCiAgICAgICAgICAgICAgICAgIGJvcmRlcjogMHB4IHNvbGlkICNCQkJCQkI7DQogICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxOw0KICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjonLiRiZ2NvbG9yLic7DQogICAgICAgICAgICAgIH0NCjwvc3R5bGU+DQo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICBmdW5jdGlvbiB0b2dnbGVGdWxsc2NyZWVuRWRpdGluZygpDQogICAgICB7DQogICAgICAgICAgdmFyIGVkaXRvckRpdiA9ICQoIi5Db2RlTWlycm9yLXNjcm9sbCIpOw0KICAgICAgICAgIGlmICghZWRpdG9yRGl2Lmhhc0NsYXNzKCJmdWxsc2NyZWVuIikpIHsNCiAgICAgICAgICAgICAgdG9nZ2xlRnVsbHNjcmVlbkVkaXRpbmcuYmVmb3JlRnVsbHNjcmVlbiA9IHsgaGVpZ2h0OiBlZGl0b3JEaXYuaGVpZ2h0KCksIHdpZHRoOiBlZGl0b3JEaXYud2lkdGgoKSB9DQogICAgICAgICAgICAgIGVkaXRvckRpdi5hZGRDbGFzcygiZnVsbHNjcmVlbiIpOw0KICAgICAgICAgICAgICBlZGl0b3JEaXYuaGVpZ2h0KCIxMDAlIik7DQogICAgICAgICAgICAgIGVkaXRvckRpdi53aWR0aCgiMTAwJSIpOw0KICAgICAgICAgICAgICBlZGl0b3IucmVmcmVzaCgpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgZWRpdG9yRGl2LnJlbW92ZUNsYXNzKCJmdWxsc2NyZWVuIik7DQogICAgICAgICAgICAgIGVkaXRvckRpdi5oZWlnaHQodG9nZ2xlRnVsbHNjcmVlbkVkaXRpbmcuYmVmb3JlRnVsbHNjcmVlbi5oZWlnaHQpOw0KICAgICAgICAgICAgICBlZGl0b3JEaXYud2lkdGgodG9nZ2xlRnVsbHNjcmVlbkVkaXRpbmcuYmVmb3JlRnVsbHNjcmVlbi53aWR0aCk7DQogICAgICAgICAgICAgIGVkaXRvci5yZWZyZXNoKCk7DQogICAgICAgICAgfQ0KICAgICAgfQ0KICANCjwvc2NyaXB0Pg0KDQogICAgICAnOw0KICAgIH0qLw0KDQoNCg0KCQkkdGhpcy0+aGVhZGVyaW5mb3NlbnQ9dHJ1ZTsNCgkJcmV0dXJuICRoZWFkZXI7DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/.gitattributes</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ki50eHQgICB0ZXh0CiouanMgICAgdGV4dAoqLmh0bWwgIHRleHQKKi5tZCAgICB0ZXh0CiouanNvbiAgdGV4dAoqLnltbCAgIHRleHQKKi5jc3MgICB0ZXh0Ciouc3ZnICAgdGV4dAo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/.gitignore</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[L25vZGVfbW9kdWxlcwovbnBtLWRlYnVnLmxvZwp0ZXN0Lmh0bWwK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/.travis.yml</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[bGFuZ3VhZ2U6IG5vZGVfanMKbm9kZV9qczoKICAtIDAuOAo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/bin/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/bin/compress</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKLy8gQ29tcHJlc3Npb24gaGVscGVyIGZvciBDb2RlTWlycm9yCi8vCi8vIEV4YW1wbGU6Ci8vCi8vICAgYmluL2NvbXByZXNzIGNvZGVtaXJyb3IgcnVubW9kZSBqYXZhc2NyaXB0IHhtbAovLwovLyBXaWxsIHRha2UgbGliL2NvZGVtaXJyb3IuanMsIGxpYi91dGlsL3J1bm1vZGUuanMsCi8vIG1vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzLCBhbmQgbW9kZS94bWwveG1sLmpzLCBydW4gdGhlbSB0aG91Z2gKLy8gdGhlIG9ubGluZSBtaW5pZmllciBhdCBodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL3VnbGlmeWpzLCBhbmQgc3BpdAovLyBvdXQgdGhlIHJlc3VsdC4KLy8KLy8gICBiaW4vY29tcHJlc3MgY29kZW1pcnJvciAtLWxvY2FsIC9wYXRoL3RvL2Jpbi9VZ2xpZnlKUwovLwovLyBXaWxsIHVzZSBhIGxvY2FsIG1pbmlmaWVyIGluc3RlYWQgb2YgdGhlIG9ubGluZSBkZWZhdWx0IG9uZS4KLy8KLy8gU2NyaXB0IGZpbGVzIGFyZSBzcGVjaWZpZWQgd2l0aG91dCAuanMgZW5kaW5nLiBQcmVmaXhpbmcgdGhlbSB3aXRoCi8vIHRoZWlyIGZ1bGwgKGxvY2FsKSBwYXRoIGlzIG9wdGlvbmFsLiBTbyB5b3UgbWF5IHNheSBsaWIvY29kZW1pcnJvcgovLyBvciBtb2RlL3htbC94bWwgdG8gYmUgbW9yZSBwcmVjaXNlLiBJbiBmYWN0LCBldmVuIHRoZSAuanMgc3VmZml4Ci8vIG1heSBiZSBzcGVmaWNpZWQsIGlmIHdhbnRlZC4KCiJ1c2Ugc3RyaWN0IjsKCnZhciBmcyA9IHJlcXVpcmUoImZzIik7CgpmdW5jdGlvbiBoZWxwKG9rKSB7CiAgY29uc29sZS5sb2coInVzYWdlOiAiICsgcHJvY2Vzcy5hcmd2WzFdICsgIiBbLS1sb2NhbCAvcGF0aC90by91Z2xpZnlqc10gZmlsZXMuLi4iKTsKICBwcm9jZXNzLmV4aXQob2sgPyAwIDogMSk7Cn0KCnZhciBsb2NhbCA9IG51bGwsIGFyZ3MgPSBudWxsLCBmaWxlcyA9IFtdLCBibG9iID0gIiI7Cgpmb3IgKHZhciBpID0gMjsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7ICsraSkgewogIHZhciBhcmcgPSBwcm9jZXNzLmFyZ3ZbaV07CiAgaWYgKGFyZyA9PSAiLS1sb2NhbCIgJiYgaSArIDEgPCBwcm9jZXNzLmFyZ3YubGVuZ3RoKSB7CiAgICB2YXIgcGFydHMgPSBwcm9jZXNzLmFyZ3ZbKytpXS5zcGxpdCgvXHMrLyk7CiAgICBsb2NhbCA9IHBhcnRzWzBdOwogICAgYXJncyA9IHBhcnRzLnNsaWNlKDEpOwogIH0gZWxzZSBpZiAoYXJnID09ICItLWhlbHAiKSB7CiAgICBoZWxwKHRydWUpOwogIH0gZWxzZSBpZiAoYXJnWzBdICE9ICItIikgewogICAgZmlsZXMucHVzaCh7bmFtZTogYXJnLCByZTogbmV3IFJlZ0V4cCgiKD86XFwvfF4pIiArIGFyZyArICgvXC5qcyQvLnRlc3QoYXJnKSA/ICIkIiA6ICJcXC5qcyQiKSl9KTsKICB9IGVsc2UgaGVscChmYWxzZSk7Cn0KCmZ1bmN0aW9uIHdhbGsoZGlyKSB7CiAgZnMucmVhZGRpclN5bmMoZGlyKS5mb3JFYWNoKGZ1bmN0aW9uKGZuYW1lKSB7CiAgICBpZiAoL15bX1wuXS8udGVzdChmbmFtZSkpIHJldHVybjsKICAgIHZhciBmaWxlID0gZGlyICsgZm5hbWU7CiAgICBpZiAoZnMuc3RhdFN5bmMoZmlsZSkuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHdhbGsoZmlsZSArICIvIik7CiAgICBpZiAoZmlsZXMuc29tZShmdW5jdGlvbihzcGVjLCBpKSB7CiAgICAgIHZhciBtYXRjaCA9IHNwZWMucmUudGVzdChmaWxlKTsKICAgICAgaWYgKG1hdGNoKSBmaWxlcy5zcGxpY2UoaSwgMSk7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0pKSB7CiAgICAgIGlmIChsb2NhbCkgYXJncy5wdXNoKGZpbGUpOwogICAgICBlbHNlIGJsb2IgKz0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICJ1dGY4Iik7CiAgICB9CiAgfSk7Cn0KCndhbGsoImxpYi8iKTsKd2FsaygibW9kZS8iKTsKCmlmICghYmxvYikgaGVscChmYWxzZSk7CgppZiAoZmlsZXMubGVuZ3RoKSB7CiAgY29uc29sZS5sb2coIlNvbWUgc3BlZmljaWVkIGZpbGVzIHdlcmUgbm90IGZvdW5kOiAiICsKICAgICAgICAgICAgICBmaWxlcy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZTt9KS5qb2luKCIsICIpKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KICAKaWYgKGxvY2FsKSB7CiAgcmVxdWlyZSgiY2hpbGRfcHJvY2VzcyIpLnNwYXduKGxvY2FsLCBhcmdzLCB7c3RkaW86IFsiaWdub3JlIiwgcHJvY2Vzcy5zdGRvdXQsIHByb2Nlc3Muc3RkZXJyXX0pOwp9IGVsc2UgewogIHZhciBkYXRhID0gbmV3IEJ1ZmZlcigianNfY29kZT0iICsgcmVxdWlyZSgicXVlcnlzdHJpbmciKS5lc2NhcGUoYmxvYiksICJ1dGY4Iik7CiAgdmFyIHJlcSA9IHJlcXVpcmUoImh0dHAiKS5yZXF1ZXN0KHsKICAgIGhvc3Q6ICJtYXJpam5oYXZlcmJla2UubmwiLAogICAgcG9ydDogODAsCiAgICBtZXRob2Q6ICJQT1NUIiwKICAgIHBhdGg6ICIvdWdsaWZ5anMiLAogICAgaGVhZGVyczogeyJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKICAgICAgICAgICAgICAiY29udGVudC1sZW5ndGgiOiBkYXRhLmxlbmd0aH0KICB9KTsKICByZXEub24oInJlc3BvbnNlIiwgZnVuY3Rpb24ocmVzcCkgewogICAgcmVzcC5vbigiZGF0YSIsIGZ1bmN0aW9uIChjaHVuaykgeyBwcm9jZXNzLnN0ZG91dC53cml0ZShjaHVuayk7IH0pOwogIH0pOwogIHJlcS5lbmQoZGF0YSk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/CONTRIBUTING.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBIb3cgdG8gY29udHJpYnV0ZQoKLSBbR2V0dGluZyBoZWxwXSgjZ2V0dGluZy1oZWxwLSkKLSBbU3VibWl0dGluZyBidWcgcmVwb3J0c10oI3N1Ym1pdHRpbmctYnVnLXJlcG9ydHMtKQotIFtDb250cmlidXRpbmcgY29kZV0oI2NvbnRyaWJ1dGluZy1jb2RlLSkKCiMjIEdldHRpbmcgaGVscCBbXl0oI2hvdy10by1jb250cmlidXRlKQoKQ29tbXVuaXR5IGRpc2N1c3Npb24sIHF1ZXN0aW9ucywgYW5kIGluZm9ybWFsIGJ1ZyByZXBvcnRpbmcgaXMgZG9uZSBvbiB0aGUKW0NvZGVNaXJyb3IgR29vZ2xlIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvY29kZW1pcnJvcikuCgojIyBTdWJtaXR0aW5nIGJ1ZyByZXBvcnRzIFteXSgjaG93LXRvLWNvbnRyaWJ1dGUpCgpUaGUgcHJlZmVycmVkIHdheSB0byByZXBvcnQgYnVncyBpcyB0byB1c2UgdGhlCltHaXRIdWIgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2lzc3VlcykuIEJlZm9yZQpyZXBvcnRpbmcgYSBidWcsIHJlYWQgdGhlc2UgcG9pbnRlcnMuCgoqKk5vdGU6KiogVGhlIGlzc3VlIHRyYWNrZXIgaXMgZm9yICpidWdzKiwgbm90IHJlcXVlc3RzIGZvciBoZWxwLiBRdWVzdGlvbnMKc2hvdWxkIGJlIGFza2VkIG9uIHRoZQpbQ29kZU1pcnJvciBHb29nbGUgZ3JvdXBdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9jb2RlbWlycm9yKSBpbnN0ZWFkLgoKIyMjIFJlcG9ydGluZyBidWdzIGVmZmVjdGl2ZWx5CgotIENvZGVNaXJyb3IgaXMgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXJzLiBUaGV5IGRvbid0IG93ZSB5b3UgYW55dGhpbmcsIHNvIGJlCiAgcG9saXRlLiBSZXBvcnRzIHdpdGggYW4gaW5kaWduYW50IG9yIGJlbGxpZ2VyZW50IHRvbmUgdGVuZCB0byBiZSBtb3ZlZCB0byB0aGUKICBib3R0b20gb2YgdGhlIHBpbGUuCgotIEluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgKip0aGUgYnJvd3NlciBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnJlZCoqLiBFdmVuCiAgaWYgeW91IHRlc3RlZCBzZXZlcmFsIGJyb3dzZXJzLCBhbmQgdGhlIHByb2JsZW0gb2NjdXJyZWQgaW4gYWxsIG9mIHRoZW0sCiAgbWVudGlvbiB0aGlzIGZhY3QgaW4gdGhlIGJ1ZyByZXBvcnQuIEFsc28gaW5jbHVkZSBicm93c2VyIHZlcnNpb24gbnVtYmVycyBhbmQKICB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdSdyZSBvbi4KCi0gTWVudGlvbiB3aGljaCByZWxlYXNlIG9mIENvZGVNaXJyb3IgeW91J3JlIHVzaW5nLiBQcmVmZXJhYmx5LCB0cnkgYWxzbyB3aXRoCiAgdGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgc25hcHNob3QsIHRvIGVuc3VyZSB0aGUgcHJvYmxlbSBoYXMgbm90IGFscmVhZHkgYmVlbgogIGZpeGVkLgoKLSBNZW50aW9uIHZlcnkgcHJlY2lzZWx5IHdoYXQgd2VudCB3cm9uZy4gIlggaXMgYnJva2VuIiBpcyBub3QgYSBnb29kIGJ1ZwogIHJlcG9ydC4gV2hhdCBkaWQgeW91IGV4cGVjdCB0byBoYXBwZW4/IFdoYXQgaGFwcGVuZWQgaW5zdGVhZD8gRGVzY3JpYmUgdGhlCiAgZXhhY3Qgc3RlcHMgYSBtYWludGFpbmVyIGhhcyB0byB0YWtlIHRvIG1ha2UgdGhlIHByb2JsZW0gb2NjdXIuIFdlIGNhbiBub3QKICBmaXggc29tZXRoaW5nIHRoYXQgd2UgY2FuIG5vdCBvYnNlcnZlLgoKLSBJZiB0aGUgcHJvYmxlbSBjYW4gbm90IGJlIHJlcHJvZHVjZWQgaW4gYW55IG9mIHRoZSBkZW1vcyBpbmNsdWRlZCBpbiB0aGUKICBDb2RlTWlycm9yIGRpc3RyaWJ1dGlvbiwgcGxlYXNlIHByb3ZpZGUgYW4gSFRNTCBkb2N1bWVudCB0aGF0IGRlbW9uc3RyYXRlcwogIHRoZSBwcm9ibGVtLiBUaGUgYmVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBnbyB0bwogIFtqc2Jpbi5jb21dKGh0dHA6Ly9qc2Jpbi5jb20vaWh1bmluL2VkaXQpLCBlbnRlciBpdCB0aGVyZSwgcHJlc3Mgc2F2ZSwgYW5kCiAgaW5jbHVkZSB0aGUgcmVzdWx0aW5nIGxpbmsgaW4geW91ciBidWcgcmVwb3J0LgoKIyMgQ29udHJpYnV0aW5nIGNvZGUgW15dKCNob3ctdG8tY29udHJpYnV0ZSkKCi0gTWFrZSBzdXJlIHlvdSBoYXZlIGEgW0dpdEh1YiBBY2NvdW50XShodHRwczovL2dpdGh1Yi5jb20vc2lnbnVwL2ZyZWUpCi0gRm9yayBbQ29kZU1pcnJvcl0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci8pCiAgKFtob3cgdG8gZm9yayBhIHJlcG9dKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2ZvcmstYS1yZXBvKSkKLSBNYWtlIHlvdXIgY2hhbmdlcwotIElmIHlvdXIgY2hhbmdlcyBhcmUgZWFzeSB0byB0ZXN0IG9yIGxpa2VseSB0byByZWdyZXNzLCBhZGQgdGVzdHMuCiAgVGVzdHMgZm9yIHRoZSBjb3JlIGdvIGludG8gYHRlc3QvdGVzdC5qc2AsIHNvbWUgbW9kZXMgaGF2ZSB0aGVpciBvd24KICB0ZXN0IHN1aXRlIHVuZGVyIGBtb2RlL1hYWC90ZXN0LmpzYC4gRmVlbCBmcmVlIHRvIGFkZCBuZXcgdGVzdAogIHN1aXRlcyB0byBtb2RlcyB0aGF0IGRvbid0IGhhdmUgb25lIHlldCAoYmUgc3VyZSB0byBsaW5rIHRoZSBuZXcKICB0ZXN0cyBpbnRvIGB0ZXN0L2luZGV4Lmh0bWxgKS4KLSBNYWtlIHN1cmUgYWxsIHRlc3RzIHBhc3MuIFZpc2l0IGB0ZXN0L2luZGV4Lmh0bWxgIGluIHlvdXIgYnJvd3NlciB0bwogIHJ1biB0aGVtLgotIFN1Ym1pdCBhIHB1bGwgcmVxdWVzdAooW2hvdyB0byBjcmVhdGUgYSBwdWxsIHJlcXVlc3RdKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2ZvcmstYS1yZXBvKSkKCiMjIyBDb2Rpbmcgc3RhbmRhcmRzCgotIDIgc3BhY2VzIHBlciBpbmRlbnRhdGlvbiBsZXZlbCwgbm8gdGFicy4KLSBJbmNsdWRlIHNlbWljb2xvbnMgYWZ0ZXIgc3RhdGVtZW50cy4KLSBOb3RlIHRoYXQgdGhlIGxpbnRlciAoYHRlc3QvbGludC9saW50LmpzYCkgd2hpY2ggaXMgcnVuIGFmdGVyIGVhY2gKICBjb21taXQgY29tcGxhaW5zIGFib3V0IHVudXNlZCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucy4gUHJlZml4IHRoZWlyCiAgbmFtZXMgd2l0aCBhbiB1bmRlcnNjb3JlIHRvIG11ZmZsZSBpdC4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/demo/activeline.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEFjdGl2ZSBMaW5lIERlbW88L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5hY3RpdmVsaW5lIHtiYWNrZ3JvdW5kOiAjZThmMmZmICFpbXBvcnRhbnQ7fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogQWN0aXZlIExpbmUgRGVtbzwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJzcyB4bWxuczphdG9tPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iIHZlcnNpb249IjIuMCIKICAgICB4bWxuczpnZW9yc3M9Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiCiAgICAgeG1sbnM6dHdpdHRlcj0iaHR0cDovL2FwaS50d2l0dGVyLmNvbSI+CiAgPGNoYW5uZWw+CiAgICA8dGl0bGU+VHdpdHRlciAvIGNvZGVtaXJyb3I8L3RpdGxlPgogICAgPGxpbms+aHR0cDovL3R3aXR0ZXIuY29tL2NvZGVtaXJyb3I8L2xpbms+CiAgICA8YXRvbTpsaW5rIHR5cGU9ImFwcGxpY2F0aW9uL3Jzcyt4bWwiCiAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly90d2l0dGVyLmNvbS9zdGF0dXNlcy91c2VyX3RpbWVsaW5lLzI0MjI4MzI4OC5yc3MiIHJlbD0ic2VsZiIvPgogICAgPGRlc2NyaXB0aW9uPlR3aXR0ZXIgdXBkYXRlcyBmcm9tIENvZGVNaXJyb3IgLyBjb2RlbWlycm9yLjwvZGVzY3JpcHRpb24+CiAgICA8bGFuZ3VhZ2U+ZW4tdXM8L2xhbmd1YWdlPgogICAgPHR0bD40MDwvdHRsPgogIDxpdGVtPgogICAgPHRpdGxlPmNvZGVtaXJyb3I6IGh0dHA6Ly9jbG91ZC1pZGUuY29tICYjODIxMjsgdGhleSdyZSBzcHJpbmdpbmcgdXAgbGlrZSBtdXNocm9vbXMuIFRoaXMgb25lCiAgICAgIHVzZXMgQ29kZU1pcnJvciBhcyBpdHMgZWRpdG9yLjwvdGl0bGU+CiAgICA8ZGVzY3JpcHRpb24+Y29kZW1pcnJvcjogaHR0cDovL2Nsb3VkLWlkZS5jb20gJiM4MjEyOyB0aGV5J3JlIHNwcmluZ2luZyB1cCBsaWtlIG11c2hyb29tcy4gVGhpcwogICAgICBvbmUgdXNlcyBDb2RlTWlycm9yIGFzIGl0cyBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KICAgIDxwdWJEYXRlPlRodSwgMTcgTWFyIDIwMTEgMjM6MzQ6NDcgKzAwMDA8L3B1YkRhdGU+CiAgICA8Z3VpZD5odHRwOi8vdHdpdHRlci5jb20vY29kZW1pcnJvci9zdGF0dXNlcy80ODUyNzczMzcyMjA1ODc1MjwvZ3VpZD4KICAgIDxsaW5rPmh0dHA6Ly90d2l0dGVyLmNvbS9jb2RlbWlycm9yL3N0YXR1c2VzLzQ4NTI3NzMzNzIyMDU4NzUyPC9saW5rPgogICAgPHR3aXR0ZXI6c291cmNlPndlYjwvdHdpdHRlcjpzb3VyY2U+CiAgICA8dHdpdHRlcjpwbGFjZS8+CiAgPC9pdGVtPgogIDxpdGVtPgogICAgPHRpdGxlPmNvZGVtaXJyb3I6IFBvc3RlZCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBDb2RlTWlycm9yIDIgaW50ZXJuYWxzIGF0CiAgICAgIGh0dHA6Ly9jb2RlbWlycm9yLm5ldC8yL2ludGVybmFscy5odG1sPC90aXRsZT4KICAgIDxkZXNjcmlwdGlvbj5jb2RlbWlycm9yOiBQb3N0ZWQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgQ29kZU1pcnJvciAyIGludGVybmFscyBhdAogICAgICBodHRwOi8vY29kZW1pcnJvci5uZXQvMi9pbnRlcm5hbHMuaHRtbDwvZGVzY3JpcHRpb24+CiAgICA8cHViRGF0ZT5XZWQsIDAyIE1hciAyMDExIDEyOjE1OjA5ICswMDAwPC9wdWJEYXRlPgogICAgPGd1aWQ+aHR0cDovL3R3aXR0ZXIuY29tL2NvZGVtaXJyb3Ivc3RhdHVzZXMvNDI5MjA4Nzk3ODg3ODk3NjA8L2d1aWQ+CiAgICA8bGluaz5odHRwOi8vdHdpdHRlci5jb20vY29kZW1pcnJvci9zdGF0dXNlcy80MjkyMDg3OTc4ODc4OTc2MDwvbGluaz4KICAgIDx0d2l0dGVyOnNvdXJjZT53ZWI8L3R3aXR0ZXI6c291cmNlPgogICAgPHR3aXR0ZXI6cGxhY2UvPgogIDwvaXRlbT4KICA8L2NoYW5uZWw+CjwvcnNzPjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbW9kZTogImFwcGxpY2F0aW9uL3htbCIsCiAgbGluZU51bWJlcnM6IHRydWUsCiAgbGluZVdyYXBwaW5nOiB0cnVlCn0pOwp2YXIgaGxMaW5lID0gZWRpdG9yLmFkZExpbmVDbGFzcygwLCAiYmFja2dyb3VuZCIsICJhY3RpdmVsaW5lIik7CmVkaXRvci5vbigiY3Vyc29yQWN0aXZpdHkiLCBmdW5jdGlvbigpIHsKICB2YXIgY3VyID0gZWRpdG9yLmdldExpbmVIYW5kbGUoZWRpdG9yLmdldEN1cnNvcigpLmxpbmUpOwogIGlmIChjdXIgIT0gaGxMaW5lKSB7CiAgICBlZGl0b3IucmVtb3ZlTGluZUNsYXNzKGhsTGluZSwgImJhY2tncm91bmQiLCAiYWN0aXZlbGluZSIpOwogICAgaGxMaW5lID0gZWRpdG9yLmFkZExpbmVDbGFzcyhjdXIsICJiYWNrZ3JvdW5kIiwgImFjdGl2ZWxpbmUiKTsKICB9Cn0pOwo8L3NjcmlwdD4KCiAgICA8cD5TdHlsaW5nIHRoZSBjdXJyZW50IGN1cnNvciBsaW5lLjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/btree.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEItVHJlZSB2aXN1YWxpemF0aW9uPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+CgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLmxpbmVibG9jayB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luOiAxcHg7IGhlaWdodDogNXB4OyB9CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCAjYWFhOyBoZWlnaHQ6IDQwMHB4fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogQi1UcmVlIHZpc3VhbGl6YXRpb248L2gxPgoKICAgIDxwPlNob3dzIGEgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiLXRyZWUgdGhhdCBDb2RlTWlycm9yCiAgICB1c2VzIHRvIHN0b3JlIGl0cyBkb2N1bWVudC4gU2VlCiAgICB0aGUgPGEgaHJlZj0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9ibG9nL2NvZGVtaXJyb3ItbGluZS10cmVlLmh0bWwiPmNvcnJlc3BvbmRpbmcKICAgIGJsb2cgcG9zdDwvYT4gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBmb3JtYXQuIFRoZSBncmF5IGJsb2NrcwogICAgdW5kZXIgZWFjaCBsZWFmIHNob3cgdGhlIGxpbmVzIGl0IGhvbGRzICh3aXRoIHRoZWlyIHdpZHRoCiAgICByZXByZXNlbnRpbmcgdGhlIGxpbmUgaGVpZ2h0KS4gQWRkIGFuZCByZW1vdmUgY29udGVudCB0byBzZWUgaG93CiAgICB0aGUgbm9kZXMgYXJlIHNwbGl0IGFuZCBtZXJnZWQgdG8ga2VlcCB0aGUgdHJlZSBiYWxhbmNlZC48L3A+CgogICAgPGRpdiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDYwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wIj4KICAgICAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPnR5cGUgaGVyZSwgc2VlIGEgc3VtbWFyeSBvZiB0aGUgZG9jdW1lbnQgYi10cmVlIHRvIHRoZSByaWdodDwvdGV4dGFyZWE+PC9mb3JtPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBoZWlnaHQ6IDQwMnB4OyBvdmVyZmxvdy15OiBhdXRvIiBpZD0ib3V0cHV0Ij48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgaWQ9Im1lIj4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBsaW5lV3JhcHBpbmc6IHRydWUKfSk7CnZhciB1cGRhdGVUaW1lb3V0OwplZGl0b3Iub24oImNoYW5nZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY2xlYXJUaW1lb3V0KHVwZGF0ZVRpbWVvdXQpOwogIHVwZGF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KHVwZGF0ZVZpc3VhbCwgMjAwKTsKfSk7CnVwZGF0ZVZpc3VhbCgpOwoKZnVuY3Rpb24gdXBkYXRlVmlzdWFsKCkgewogIHZhciBvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0cHV0Iik7CiAgb3V0LmlubmVySFRNTCA9ICIiOwoKICBmdW5jdGlvbiBkcmF3VHJlZShvdXQsIG5vZGUpIHsKICAgIGlmIChub2RlLmxpbmVzKSB7CiAgICAgIG91dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MID0KICAgICAgICAiPGI+bGVhZjwvYj46ICIgKyBub2RlLmxpbmVzLmxlbmd0aCArICIgbGluZXMsICIgKyBNYXRoLnJvdW5kKG5vZGUuaGVpZ2h0KSArICIgcHgiOwogICAgICB2YXIgbGluZXMgPSBvdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwogICAgICBsaW5lcy5zdHlsZS5saW5lSGVpZ2h0ID0gIjZweCI7IGxpbmVzLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5saW5lcy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBsaW5lID0gbm9kZS5saW5lc1tpXSwgbGluZUVsdCA9IGxpbmVzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTsKICAgICAgICBsaW5lRWx0LmNsYXNzTmFtZSA9ICJsaW5lYmxvY2siOwogICAgICAgIHZhciBncmF5ID0gTWF0aC5taW4obGluZS50ZXh0Lmxlbmd0aCAqIDMsIDIzMCksIGNvbCA9IGdyYXkudG9TdHJpbmcoMTYpOwogICAgICAgIGlmIChjb2wubGVuZ3RoID09IDEpIGNvbCA9ICIwIiArIGNvbDsKICAgICAgICBsaW5lRWx0LnN0eWxlLmJhY2tncm91bmQgPSAiIyIgKyBjb2wgKyBjb2wgKyBjb2w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobGluZS5oZWlnaHQsIGxpbmUpOwogICAgICAgIGxpbmVFbHQuc3R5bGUud2lkdGggPSBNYXRoLm1heChNYXRoLnJvdW5kKGxpbmUuaGVpZ2h0IC8gMyksIDEpICsgInB4IjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgb3V0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5pbm5lckhUTUwgPQogICAgICAgICI8Yj5ub2RlPC9iPjogIiArIG5vZGUuc2l6ZSArICIgbGluZXMsICIgKyBNYXRoLnJvdW5kKG5vZGUuaGVpZ2h0KSArICIgcHgiOwogICAgICB2YXIgc3ViID0gb3V0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTsKICAgICAgc3ViLnN0eWxlLnBhZGRpbmdMZWZ0ID0gIjIwcHgiOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2kpCiAgICAgICAgZHJhd1RyZWUoc3ViLCBub2RlLmNoaWxkcmVuW2ldKTsKICAgIH0KICB9CiAgZHJhd1RyZWUob3V0LCBlZGl0b3Iudmlldy5kb2MpOwp9CgpmdW5jdGlvbiBmaWxsRWRpdG9yKCkgewogIHZhciBzYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZSIpOwogIHZhciBkb2MgPSAoc2MudGV4dENvbnRlbnQgfHwgc2MuaW5uZXJUZXh0IHx8IHNjLmlubmVySFRNTCkucmVwbGFjZSgvXlxzKi8sICIiKSArICJcbiI7CiAgZG9jICs9IGRvYzsgZG9jICs9IGRvYzsgZG9jICs9IGRvYzsgZG9jICs9IGRvYzsgZG9jICs9IGRvYzsgZG9jICs9IGRvYzsKICBlZGl0b3Iuc2V0VmFsdWUoZG9jKTsKfQogICAgPC9zY3JpcHQ+Cgo8cD48YnV0dG9uIG9uY2xpY2s9ImZpbGxFZGl0b3IoKSI+QWRkIGEgbG90IG9mIGNvbnRlbnQ8L2J1dHRvbj48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/changemode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IE1vZGUtQ2hhbmdpbmcgRGVtbzwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3NjaGVtZS9zY2hlbWUuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBNb2RlLUNoYW5naW5nIGRlbW88L2gxPgoKICAgIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Cjs7IElmIHRoZXJlIGlzIFNjaGVtZSBjb2RlIGluIGhlcmUsIHRoZSBlZGl0b3Igd2lsbCBiZSBpbiBTY2hlbWUgbW9kZS4KOzsgSWYgeW91IHB1dCBpbiBKUyBpbnN0ZWFkLCBpdCdsbCBzd2l0Y2ggdG8gSlMgbW9kZS4KCihkZWZpbmUgKGRvdWJsZSB4KQogICgqIHggeCkpCjwvdGV4dGFyZWE+PC9mb3JtPgoKPHA+T24gY2hhbmdlcyB0byB0aGUgY29udGVudCBvZiB0aGUgYWJvdmUgZWRpdG9yLCBhIChjcnVkZSkgc2NyaXB0CnRyaWVzIHRvIGF1dG8tZGV0ZWN0IHRoZSBsYW5ndWFnZSB1c2VkLCBhbmQgc3dpdGNoZXMgdGhlIGVkaXRvciB0bwplaXRoZXIgSmF2YVNjcmlwdCBvciBTY2hlbWUgbW9kZSBiYXNlZCBvbiB0aGF0LjwvcD4KCjxzY3JpcHQ+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgIG1vZGU6ICJzY2hlbWUiLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICB0YWJNb2RlOiAiaW5kZW50IgogIH0pOwogIGVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICBjbGVhclRpbWVvdXQocGVuZGluZyk7CiAgICBzZXRUaW1lb3V0KHVwZGF0ZSwgNDAwKTsKICB9KTsKICB2YXIgcGVuZGluZzsKICBmdW5jdGlvbiBsb29rc0xpa2VTY2hlbWUoY29kZSkgewogICAgcmV0dXJuICEvXlxzKlwoXHMqZnVuY3Rpb25cYi8udGVzdChjb2RlKSAmJiAvXlxzKls7XChdLy50ZXN0KGNvZGUpOwogIH0KICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICBlZGl0b3Iuc2V0T3B0aW9uKCJtb2RlIiwgbG9va3NMaWtlU2NoZW1lKGVkaXRvci5nZXRWYWx1ZSgpKSA/ICJzY2hlbWUiIDogImphdmFzY3JpcHQiKTsKICB9Cjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/closetag.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IENsb3NlLVRhZyBEZW1vPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL3V0aWwvY2xvc2V0YWcuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgIzg4ODsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4ODg7fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICAKICAgIDxoMT5DbG9zZS1UYWcgRGVtbzwvaDE+CiAgICA8dWw+CiAgICAgIDxsaT5UeXBlIGFuIGh0bWwgdGFnLiAgV2hlbiB5b3UgdHlwZSAnPicgb3IgJy8nLCB0aGUgdGFnIHdpbGwgYXV0by1jbG9zZS9jb21wbGV0ZS4gIEJsb2NrLWxldmVsIHRhZ3Mgd2lsbCBpbmRlbnQuPC9saT4KICAgICAgPGxpPlRoZXJlIGFyZSBvcHRpb25zIGZvciBkaXNhYmxpbmcgdGFnIGNsb3Npbmcgb3IgY3VzdG9taXppbmcgdGhlIGxpc3Qgb2YgdGFncyB0byBpbmRlbnQuPC9saT4KICAgICAgPGxpPldvcmtzIHdpdGggInRleHQvaHRtbCIgKGJhc2VkIG9uIGh0bWxtaXhlZC5qcyBvciB4bWwuanMpIG1vZGUuPC9saT4KICAgICAgPGxpPlZpZXcgc291cmNlIGZvciBrZXkgYmluZGluZyBkZXRhaWxzLjwvbGk+CiAgICA8L3VsPgoKICAgIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+PGh0bWw8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogJ3RleHQvaHRtbCcsCiAgICAgICAgYXV0b0Nsb3NlVGFnczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/complete.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEF1dG9jb21wbGV0ZSBEZW1vPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL3V0aWwvc2ltcGxlLWhpbnQuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvdXRpbC9zaW1wbGUtaGludC5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi91dGlsL2phdmFzY3JpcHQtaGludC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBBdXRvY29tcGxldGUgZGVtbzwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KZnVuY3Rpb24gZ2V0Q29tcGxldGlvbnModG9rZW4sIGNvbnRleHQpIHsKICB2YXIgZm91bmQgPSBbXSwgc3RhcnQgPSB0b2tlbi5zdHJpbmc7CiAgZnVuY3Rpb24gbWF5YmVBZGQoc3RyKSB7CiAgICBpZiAoc3RyLmluZGV4T2Yoc3RhcnQpID09IDApIGZvdW5kLnB1c2goc3RyKTsKICB9CiAgZnVuY3Rpb24gZ2F0aGVyQ29tcGxldGlvbnMob2JqKSB7CiAgICBpZiAodHlwZW9mIG9iaiA9PSAic3RyaW5nIikgZm9yRWFjaChzdHJpbmdQcm9wcywgbWF5YmVBZGQpOwogICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIGZvckVhY2goYXJyYXlQcm9wcywgbWF5YmVBZGQpOwogICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRnVuY3Rpb24pIGZvckVhY2goZnVuY1Byb3BzLCBtYXliZUFkZCk7CiAgICBmb3IgKHZhciBuYW1lIGluIG9iaikgbWF5YmVBZGQobmFtZSk7CiAgfQoKICBpZiAoY29udGV4dCkgewogICAgLy8gSWYgdGhpcyBpcyBhIHByb3BlcnR5LCBzZWUgaWYgaXQgYmVsb25ncyB0byBzb21lIG9iamVjdCB3ZSBjYW4KICAgIC8vIGZpbmQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCiAgICB2YXIgb2JqID0gY29udGV4dC5wb3AoKSwgYmFzZTsKICAgIGlmIChvYmouY2xhc3NOYW1lID09ICJqcy12YXJpYWJsZSIpCiAgICAgIGJhc2UgPSB3aW5kb3dbb2JqLnN0cmluZ107CiAgICBlbHNlIGlmIChvYmouY2xhc3NOYW1lID09ICJqcy1zdHJpbmciKQogICAgICBiYXNlID0gIiI7CiAgICBlbHNlIGlmIChvYmouY2xhc3NOYW1lID09ICJqcy1hdG9tIikKICAgICAgYmFzZSA9IDE7CiAgICB3aGlsZSAoYmFzZSAhPSBudWxsICYmIGNvbnRleHQubGVuZ3RoKQogICAgICBiYXNlID0gYmFzZVtjb250ZXh0LnBvcCgpLnN0cmluZ107CiAgICBpZiAoYmFzZSAhPSBudWxsKSBnYXRoZXJDb21wbGV0aW9ucyhiYXNlKTsKICB9CiAgZWxzZSB7CiAgICAvLyBJZiBub3QsIGp1c3QgbG9vayBpbiB0aGUgd2luZG93IG9iamVjdCBhbmQgYW55IGxvY2FsIHNjb3BlCiAgICAvLyAocmVhZGluZyBpbnRvIEpTIG1vZGUgaW50ZXJuYWxzIHRvIGdldCBhdCB0aGUgbG9jYWwgdmFyaWFibGVzKQogICAgZm9yICh2YXIgdiA9IHRva2VuLnN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkgbWF5YmVBZGQodi5uYW1lKTsKICAgIGdhdGhlckNvbXBsZXRpb25zKHdpbmRvdyk7CiAgICBmb3JFYWNoKGtleXdvcmRzLCBtYXliZUFkZCk7CiAgfQogIHJldHVybiBmb3VuZDsKfQo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPlByZXNzIDxzdHJvbmc+Y3RybC1zcGFjZTwvc3Ryb25nPiB0byBhY3RpdmF0ZSBhdXRvY29tcGxldGlvbi4gU2VlCnRoZSBjb2RlICg8YSBocmVmPSIuLi9saWIvdXRpbC9zaW1wbGUtaGludC5qcyI+aGVyZTwvYT4KYW5kIDxhIGhyZWY9Ii4uL2xpYi91dGlsL2phdmFzY3JpcHQtaGludC5qcyI+aGVyZTwvYT4pIHRvIGZpZ3VyZSBvdXQKaG93IGl0IHdvcmtzLjwvcD4KCiAgICA8c2NyaXB0PgogICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLmF1dG9jb21wbGV0ZSA9IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgQ29kZU1pcnJvci5zaW1wbGVIaW50KGNtLCBDb2RlTWlycm9yLmphdmFzY3JpcHRIaW50KTsKICAgICAgfQogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGV4dHJhS2V5czogeyJDdHJsLVNwYWNlIjogImF1dG9jb21wbGV0ZSJ9CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/emacs.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEVtYWNzIGJpbmRpbmdzIGRlbW88L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2NsaWtlL2NsaWtlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9rZXltYXAvZW1hY3MuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgI2VlZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogRW1hY3MgYmluZGluZ3MgZGVtbzwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KI2luY2x1ZGUgInN5c2NhbGxzLmgiCi8qIGdldGNoYXI6ICBzaW1wbGUgYnVmZmVyZWQgdmVyc2lvbiAqLwppbnQgZ2V0Y2hhcih2b2lkKQp7CiAgc3RhdGljIGNoYXIgYnVmW0JVRlNJWl07CiAgc3RhdGljIGNoYXIgKmJ1ZnAgPSBidWY7CiAgc3RhdGljIGludCBuID0gMDsKICBpZiAobiA9PSAwKSB7ICAvKiBidWZmZXIgaXMgZW1wdHkgKi8KICAgIG4gPSByZWFkKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CiAgICBidWZwID0gYnVmOwogIH0KICByZXR1cm4gKC0tbiA+PSAwKSA/ICh1bnNpZ25lZCBjaGFyKSAqYnVmcCsrIDogRU9GOwp9CjwvdGV4dGFyZWE+PC9mb3JtPgoKPHA+VGhlIGVtYWNzIGtleWJpbmRpbmdzIGFyZSBlbmFibGVkIGJ5CmluY2x1ZGluZyA8YSBocmVmPSIuLi9rZXltYXAvZW1hY3MuanMiPmtleW1hcC9lbWFjcy5qczwvYT4gYW5kIHNldHRpbmcKdGhlIDxjb2RlPmtleU1hcDwvY29kZT4gb3B0aW9uIHRvIDxjb2RlPiJlbWFjcyI8L2NvZGU+LiBCZWNhdXNlCkNvZGVNaXJyb3IncyBpbnRlcm5hbCBBUEkgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gRW1hY3MsIHRoZXkgYXJlIG9ubHkKYSBsb29zZSBhcHByb3hpbWF0aW9uIG9mIGFjdHVhbCBlbWFjcyBiaW5kaW5ncywgdGhvdWdoLjwvcD4KCjxwPkFsc28gbm90ZSB0aGF0IGEgbG90IG9mIGJyb3dzZXJzIGRpc2FsbG93IGNlcnRhaW4ga2V5cyBmcm9tIGJlaW5nCmNhcHR1cmVkLiBGb3IgZXhhbXBsZSwgQ2hyb21lIGJsb2NrcyBib3RoIEN0cmwtVyBhbmQgQ3RybC1OLCB3aXRoIHRoZQpyZXN1bHQgdGhhdCBpZGlvbWF0aWMgdXNlIG9mIEVtYWNzIGtleXMgd2lsbCBjb25zdGFudGx5IGNsb3NlIHlvdXIgdGFiCm9yIG9wZW4gYSBuZXcgd2luZG93LjwvcD4KCiAgICA8c2NyaXB0PgogICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZWx0ID0gZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCk7CiAgICAgICAgZWx0LnN0eWxlLmJhY2tncm91bmQgPSAiI2RlZiI7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZWx0LnN0eWxlLmJhY2tncm91bmQgPSAiIjsgfSwgMzAwKTsKICAgICAgfTsKICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWNzcmMiLAogICAgICAgIGtleU1hcDogImVtYWNzIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/folding.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IENvZGUgRm9sZGluZyBEZW1vPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL3V0aWwvZm9sZGNvZGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5Db2RlTWlycm9yLWZvbGRtYXJrZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHRleHQtc2hhZG93OiAjYjlmIDFweCAxcHggMnB4LCAjYjlmIC0xcHggLTFweCAycHgsICNiOWYgMXB4IC0xcHggMnB4LCAjYjlmIC0xcHggMXB4IDJweDsKICAgICAgICBmb250LWZhbWlseTogYXJpYWw7CiAgICAgICAgbGluZS1oZWlnaHQ6IC4zOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogQ29kZSBGb2xkaW5nIERlbW88L2gxPgoKICAgIDxwPkRlbW9uc3RyYXRpb24gb2YgY29kZSBmb2xkaW5nIHVzaW5nIHRoZSBjb2RlCiAgICBpbiA8YSBocmVmPSIuLi9saWIvdXRpbC9mb2xkY29kZS5qcyI+PGNvZGU+Zm9sZGNvZGUuanM8L2NvZGU+PC9hPi4KICAgIFByZXNzIGN0cmwtcSBvciBjbGljayBvbiB0aGUgZ3V0dGVyIHRvIGZvbGQgYSBibG9jaywgYWdhaW4KICAgIHRvIHVuZm9sZC48L3A+CiAgICA8Zm9ybT4KICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1MGVtOyBtYXJnaW4tYm90dG9tOiAxZW0iPkphdmFTY3JpcHQ6PGJyPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+PC90ZXh0YXJlYT48L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1MGVtIj5IVE1MOjxicj48dGV4dGFyZWEgaWQ9ImNvZGUtaHRtbCIgbmFtZT0iY29kZS1odG1sIj48L3RleHRhcmVhPjwvZGl2PgogICAgPC9mb3JtPgogICAgPHNjcmlwdCBpZD0ic2NyaXB0Ij4Kd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogIHZhciB0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIik7CiAgdmFyIHNjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNjcmlwdCIpOwogIHRlLnZhbHVlID0gKHNjLnRleHRDb250ZW50IHx8IHNjLmlubmVyVGV4dCB8fCBzYy5pbm5lckhUTUwpLnJlcGxhY2UoL15ccyovLCAiIik7CiAgc2MuaW5uZXJIVE1MID0gIiI7CiAgdmFyIHRlX2h0bWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZS1odG1sIik7CiAgdGVfaHRtbC52YWx1ZSA9ICI8aHRtbD5cbiAgIiArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgKyAiXG48L2h0bWw+IjsKCiAgdmFyIGZvbGRGdW5jID0gQ29kZU1pcnJvci5uZXdGb2xkRnVuY3Rpb24oQ29kZU1pcnJvci5icmFjZVJhbmdlRmluZGVyKTsKICB3aW5kb3cuZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEodGUsIHsKICAgIG1vZGU6ICJqYXZhc2NyaXB0IiwKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbGluZVdyYXBwaW5nOiB0cnVlLAogICAgZXh0cmFLZXlzOiB7IkN0cmwtUSI6IGZ1bmN0aW9uKGNtKXtmb2xkRnVuYyhjbSwgY20uZ2V0Q3Vyc29yKCkubGluZSk7fX0KICB9KTsKICBlZGl0b3Iub24oImd1dHRlckNsaWNrIiwgZm9sZEZ1bmMpOwogIGZvbGRGdW5jKGVkaXRvciwgOSk7CgogIHZhciBmb2xkRnVuY19odG1sID0gQ29kZU1pcnJvci5uZXdGb2xkRnVuY3Rpb24oQ29kZU1pcnJvci50YWdSYW5nZUZpbmRlcik7CiAgd2luZG93LmVkaXRvcl9odG1sID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEodGVfaHRtbCwgewogICAgbW9kZTogInRleHQvaHRtbCIsCiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIGxpbmVXcmFwcGluZzogdHJ1ZSwKICAgIGV4dHJhS2V5czogeyJDdHJsLVEiOiBmdW5jdGlvbihjbSl7Zm9sZEZ1bmNfaHRtbChjbSwgY20uZ2V0Q3Vyc29yKCkubGluZSk7fX0KICB9KTsKICBlZGl0b3JfaHRtbC5vbigiZ3V0dGVyQ2xpY2siLCBmb2xkRnVuY19odG1sKTsKICBmb2xkRnVuY19odG1sKGVkaXRvcl9odG1sLCAxMSk7CiAgZm9sZEZ1bmNfaHRtbChlZGl0b3JfaHRtbCwgMSk7Cn07Cjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/formatting.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEZvcm1hdHRpbmcgRGVtbzwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi91dGlsL2Zvcm1hdHRpbmcuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2VlZTsKICAgICAgfQogICAgICB0ZCB7CiAgICAgICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogRm9ybWF0dGluZyBkZW1vPC9oMT4KCiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPjxzY3JpcHQ+IGZ1bmN0aW9uIChzLGUpeyBmb3IodmFyIGk9MDsgaSA8IDE7IGkrKykgdGVzdCgidGVzdCgpO2E9MSIpO30gPC9zY3JpcHQ+CjxzY3JpcHQ+CmZ1bmN0aW9uIHRlc3QoYyl7ICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspewkgICAgICAgICAgcHJvY2VzcygiYS5iKCk7YyA9IG51bGw7IiwgMzAwKTt9Cn0KPC9zY3JpcHQ+Cjx0YWJsZT48dHI+PHRkPnRlc3QgMTwvdGQ+PC90cj48dHI+PHRkPnRlc3QgMjwvdGQ+PC90cj48L3RhYmxlPgo8c2NyaXB0PiBmdW5jdGlvbiB0ZXN0KCkgeyByZXR1cm4gMTt9IDwvc2NyaXB0Pgo8c3R5bGU+IC50ZXN0IHsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IH0KPC9zdHlsZT48L3RleHRhcmVhPjwvZm9ybT4KCjxwPlNlbGVjdCBhIHBpZWNlIG9mIGNvZGUgYW5kIGNsaWNrIG9uZSBvZiB0aGUgbGlua3MgYmVsb3cgdG8gYXBwbHkgYXV0b21hdGljIGZvcm1hdHRpbmcgdG8gdGhlIHNlbGVjdGVkIHRleHQgb3IgY29tbWVudC91bmNvbW1lbnQgdGhlIHNlbGVjdGVkIHRleHQuIE5vdGUgdGhhdCB0aGUgZm9ybWF0dGluZyBiZWhhdmlvciBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGJsb2NrJ3MgbW9kZS4KICAgIDx0YWJsZT4KICAgICAgPHRyPgogICAgICAgIDx0ZD4KICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6YXV0b0Zvcm1hdFNlbGVjdGlvbigpIj4KICAgICAgICAgICAgQXV0b2Zvcm1hdCBTZWxlY3RlZAogICAgICAgICAgPC9hPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkPgogICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjb21tZW50U2VsZWN0aW9uKHRydWUpIj4KICAgICAgICAgICAgQ29tbWVudCBTZWxlY3RlZAogICAgICAgICAgPC9hPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkPgogICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjb21tZW50U2VsZWN0aW9uKGZhbHNlKSI+CiAgICAgICAgICAgIFVuY29tbWVudCBTZWxlY3RlZAogICAgICAgICAgPC9hPgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICA8L3RhYmxlPgo8L3A+ICAgIAogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAiaHRtbG1peGVkIgogICAgICB9KTsKICAgICAgQ29kZU1pcnJvci5jb21tYW5kc1sic2VsZWN0QWxsIl0oZWRpdG9yKTsKICAgICAgCiAgICAgIGZ1bmN0aW9uIGdldFNlbGVjdGVkUmFuZ2UoKSB7CiAgICAgICAgcmV0dXJuIHsgZnJvbTogZWRpdG9yLmdldEN1cnNvcih0cnVlKSwgdG86IGVkaXRvci5nZXRDdXJzb3IoZmFsc2UpIH07CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGF1dG9Gb3JtYXRTZWxlY3Rpb24oKSB7CiAgICAgICAgdmFyIHJhbmdlID0gZ2V0U2VsZWN0ZWRSYW5nZSgpOwogICAgICAgIGVkaXRvci5hdXRvRm9ybWF0UmFuZ2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pOwogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb21tZW50U2VsZWN0aW9uKGlzQ29tbWVudCkgewogICAgICAgIHZhciByYW5nZSA9IGdldFNlbGVjdGVkUmFuZ2UoKTsKICAgICAgICBlZGl0b3IuY29tbWVudFJhbmdlKGlzQ29tbWVudCwgcmFuZ2UuZnJvbSwgcmFuZ2UudG8pOwogICAgICB9ICAgICAgCiAgICA8L3NjcmlwdD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/fullscreen.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEZ1bGwgU2NyZWVuIEVkaXRpbmc8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbmlnaHQuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yLWZ1bGxzY3JlZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7IGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogOTk5OTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogRnVsbCBTY3JlZW4gRWRpdGluZzwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIiByb3dzPSI1Ij4KICA8ZHQgaWQ9Im9wdGlvbl9pbmRlbnRXaXRoVGFicyI+PGNvZGU+aW5kZW50V2l0aFRhYnMgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgPGRkPldoZXRoZXIsIHdoZW4gaW5kZW50aW5nLCB0aGUgZmlyc3QgTio4IHNwYWNlcyBzaG91bGQgYmUKICByZXBsYWNlZCBieSBOIHRhYnMuIERlZmF1bHQgaXMgZmFsc2UuPC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fdGFiTW9kZSI+PGNvZGU+dGFiTW9kZSAoc3RyaW5nKTwvY29kZT48L2R0PgogIDxkZD5EZXRlcm1pbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIHRhYiBrZXkuCiAgTXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKICAgIDxkbD4KICAgICAgPGR0Pjxjb2RlPiJjbGFzc2ljIiAodGhlIGRlZmF1bHQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIGluc2VydCBhIHRhYi4gT3RoZXJ3aXNlLAogICAgICBiZWhhdmUgbGlrZSB0aGUgPGNvZGU+InNoaWZ0IjwvY29kZT4gbW9kZS4gKFdoZW4gc2hpZnQgaXMKICAgICAgaGVsZCwgdGhpcyBiZWhhdmVzIGxpa2UgdGhlIDxjb2RlPiJpbmRlbnQiPC9jb2RlPiBtb2RlLik8L2RkPgogICAgICA8ZHQ+PGNvZGU+InNoaWZ0IjwvY29kZT48L2R0PgogICAgICA8ZGQ+SW5kZW50IGFsbCBzZWxlY3RlZCBsaW5lcyBieQogICAgICBvbmUgPGEgaHJlZj0iI29wdGlvbl9pbmRlbnRVbml0Ij48Y29kZT5pbmRlbnRVbml0PC9jb2RlPjwvYT4uCiAgICAgIElmIHNoaWZ0IHdhcyBoZWxkIHdoaWxlIHByZXNzaW5nIHRhYiwgdW4taW5kZW50IGFsbCBzZWxlY3RlZAogICAgICBsaW5lcyBvbmUgdW5pdC48L2RkPgogICAgICA8ZHQ+PGNvZGU+ImluZGVudCI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkluZGVudCB0aGUgbGluZSB0aGUgJ2NvcnJlY3RseScsIGJhc2VkIG9uIGl0cyBzeW50YWN0aWMKICAgICAgY29udGV4dC4gT25seSB3b3JrcyBpZiB0aGUKICAgICAgbW9kZSA8YSBocmVmPSIjaW5kZW50Ij5zdXBwb3J0czwvYT4gaXQuPC9kZD4KICAgICAgPGR0Pjxjb2RlPiJkZWZhdWx0IjwvY29kZT48L2R0PgogICAgICA8ZGQ+RG8gbm90IGNhcHR1cmUgdGFiIHByZXNzZXMsIGxldCB0aGUgYnJvd3NlciBhcHBseSBpdHMKICAgICAgZGVmYXVsdCBiZWhhdmlvdXIgKHdoaWNoIHVzdWFsbHkgbWVhbnMgaXQgc2tpcHMgdG8gdGhlIG5leHQKICAgICAgY29udHJvbCkuPC9kZD4KICAgIDwvZGw+PC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fZW50ZXJNb2RlIj48Y29kZT5lbnRlck1vZGUgKHN0cmluZyk8L2NvZGU+PC9kdD4KICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGFuZCBob3cgbmV3IGxpbmVzIGFyZSBpbmRlbnRlZCB3aGVuIHRoZQogIGVudGVyIGtleSBpcyBwcmVzc2VkLiBUaGUgZm9sbG93aW5nIG1vZGVzIGFyZSBzdXBwb3J0ZWQ6CiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT4iaW5kZW50IiAodGhlIGRlZmF1bHQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Vc2UgdGhlIG1vZGUncyBpbmRlbnRhdGlvbiBydWxlcyB0byBnaXZlIHRoZSBuZXcgbGluZQogICAgICB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbi48L2RkPgogICAgICA8ZHQ+PGNvZGU+ImtlZXAiPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JbmRlbnQgdGhlIGxpbmUgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPiJmbGF0IjwvY29kZT48L2R0PgogICAgICA8ZGQ+RG8gbm90IGluZGVudCB0aGUgbmV3IGxpbmUuPC9kZD4KICAgIDwvZGw+PC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fZW50ZXJNb2RlIj48Y29kZT5lbnRlck1vZGUgKHN0cmluZyk8L2NvZGU+PC9kdD4KICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGFuZCBob3cgbmV3IGxpbmVzIGFyZSBpbmRlbnRlZCB3aGVuIHRoZQogIGVudGVyIGtleSBpcyBwcmVzc2VkLiBUaGUgZm9sbG93aW5nIG1vZGVzIGFyZSBzdXBwb3J0ZWQ6CiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT4iaW5kZW50IiAodGhlIGRlZmF1bHQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Vc2UgdGhlIG1vZGUncyBpbmRlbnRhdGlvbiBydWxlcyB0byBnaXZlIHRoZSBuZXcgbGluZQogICAgICB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbi48L2RkPgogICAgICA8ZHQ+PGNvZGU+ImtlZXAiPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JbmRlbnQgdGhlIGxpbmUgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPiJmbGF0IjwvY29kZT48L2R0PgogICAgICA8ZGQ+RG8gbm90IGluZGVudCB0aGUgbmV3IGxpbmUuPC9kZD4KICAgIDwvZGw+PC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fZW50ZXJNb2RlIj48Y29kZT5lbnRlck1vZGUgKHN0cmluZyk8L2NvZGU+PC9kdD4KICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGFuZCBob3cgbmV3IGxpbmVzIGFyZSBpbmRlbnRlZCB3aGVuIHRoZQogIGVudGVyIGtleSBpcyBwcmVzc2VkLiBUaGUgZm9sbG93aW5nIG1vZGVzIGFyZSBzdXBwb3J0ZWQ6CiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT4iaW5kZW50IiAodGhlIGRlZmF1bHQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Vc2UgdGhlIG1vZGUncyBpbmRlbnRhdGlvbiBydWxlcyB0byBnaXZlIHRoZSBuZXcgbGluZQogICAgICB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbi48L2RkPgogICAgICA8ZHQ+PGNvZGU+ImtlZXAiPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JbmRlbnQgdGhlIGxpbmUgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPiJmbGF0IjwvY29kZT48L2R0PgogICAgICA8ZGQ+RG8gbm90IGluZGVudCB0aGUgbmV3IGxpbmUuPC9kZD4KICAgIDwvZGw+PC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fZW50ZXJNb2RlIj48Y29kZT5lbnRlck1vZGUgKHN0cmluZyk8L2NvZGU+PC9kdD4KICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGFuZCBob3cgbmV3IGxpbmVzIGFyZSBpbmRlbnRlZCB3aGVuIHRoZQogIGVudGVyIGtleSBpcyBwcmVzc2VkLiBUaGUgZm9sbG93aW5nIG1vZGVzIGFyZSBzdXBwb3J0ZWQ6CiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT4iaW5kZW50IiAodGhlIGRlZmF1bHQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Vc2UgdGhlIG1vZGUncyBpbmRlbnRhdGlvbiBydWxlcyB0byBnaXZlIHRoZSBuZXcgbGluZQogICAgICB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbi48L2RkPgogICAgICA8ZHQ+PGNvZGU+ImtlZXAiPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JbmRlbnQgdGhlIGxpbmUgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPiJmbGF0IjwvY29kZT48L2R0PgogICAgICA8ZGQ+RG8gbm90IGluZGVudCB0aGUgbmV3IGxpbmUuPC9kZD4KICAgIDwvZGw+PC9kZD4KCjwvdGV4dGFyZWE+PC9mb3JtPgogIDxzY3JpcHQ+CiAgICBmdW5jdGlvbiBpc0Z1bGxTY3JlZW4oY20pIHsKICAgICAgcmV0dXJuIC9cYkNvZGVNaXJyb3ItZnVsbHNjcmVlblxiLy50ZXN0KGNtLmdldFdyYXBwZXJFbGVtZW50KCkuY2xhc3NOYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIHdpbkhlaWdodCgpIHsKICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCB8fCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLmNsaWVudEhlaWdodDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldEZ1bGxTY3JlZW4oY20sIGZ1bGwpIHsKICAgICAgdmFyIHdyYXAgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpOwogICAgICBpZiAoZnVsbCkgewogICAgICAgIHdyYXAuY2xhc3NOYW1lICs9ICIgQ29kZU1pcnJvci1mdWxsc2NyZWVuIjsKICAgICAgICB3cmFwLnN0eWxlLmhlaWdodCA9IHdpbkhlaWdodCgpICsgInB4IjsKICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cmFwLmNsYXNzTmFtZSA9IHdyYXAuY2xhc3NOYW1lLnJlcGxhY2UoIiBDb2RlTWlycm9yLWZ1bGxzY3JlZW4iLCAiIik7CiAgICAgICAgd3JhcC5zdHlsZS5oZWlnaHQgPSAiIjsKICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAiIjsKICAgICAgfQogICAgICBjbS5yZWZyZXNoKCk7CiAgICB9CiAgICBDb2RlTWlycm9yLm9uKHdpbmRvdywgInJlc2l6ZSIsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgc2hvd2luZyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiQ29kZU1pcnJvci1mdWxsc2NyZWVuIilbMF07CiAgICAgIGlmICghc2hvd2luZykgcmV0dXJuOwogICAgICBzaG93aW5nLkNvZGVNaXJyb3IuZ2V0V3JhcHBlckVsZW1lbnQoKS5zdHlsZS5oZWlnaHQgPSB3aW5IZWlnaHQoKSArICJweCI7CiAgICB9KTsKICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICB0aGVtZTogIm5pZ2h0IiwKICAgICAgZXh0cmFLZXlzOiB7CiAgICAgICAgIkYxMSI6IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgICBzZXRGdWxsU2NyZWVuKGNtLCAhaXNGdWxsU2NyZWVuKGNtKSk7CiAgICAgICAgfSwKICAgICAgICAiRXNjIjogZnVuY3Rpb24oY20pIHsKICAgICAgICAgIGlmIChpc0Z1bGxTY3JlZW4oY20pKSBzZXRGdWxsU2NyZWVuKGNtLCBmYWxzZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICA8L3NjcmlwdD4KCiAgICA8cD5QcmVzcyA8c3Ryb25nPkYxMTwvc3Ryb25nPiB3aGVuIGN1cnNvciBpcyBpbiB0aGUgZWRpdG9yIHRvIHRvZ2dsZSBmdWxsIHNjcmVlbiBlZGl0aW5nLiA8c3Ryb25nPkVzYzwvc3Ryb25nPiBjYW4gYWxzbyBiZSB1c2VkIHRvIDxpPmV4aXQ8L2k+IGZ1bGwgc2NyZWVuIGVkaXRpbmcuPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/loadmode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IExhenkgTW9kZSBMb2FkaW5nIERlbW88L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvdXRpbC9sb2FkbW9kZS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+CgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IExhenkgTW9kZSBMb2FkaW5nPC9oMT4KCiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPlRoaXMgaXMgdGhlIGVkaXRvci4KLy8gSXQgc3RhcnRzIG91dCBpbiBwbGFpbiB0ZXh0IG1vZGUsCiMgIHVzZSB0aGUgY29udHJvbCBiZWxvdyB0byBsb2FkIGFuZCBhcHBseSBhIG1vZGUKICAieW91J2xsIHNlZSB0aGUgaGlnaGxpZ2h0aW5nIG9mIiB0aGlzIHRleHQgLypjaGFuZ2UqLy4KPC90ZXh0YXJlYT48L2Zvcm0+CjxwPjxpbnB1dCB0eXBlPXRleHQgdmFsdWU9amF2YXNjcmlwdCBpZD1tb2RlPiA8YnV0dG9uIHR5cGU9YnV0dG9uIG9uY2xpY2s9ImNoYW5nZSgpIj5jaGFuZ2UgbW9kZTwvYnV0dG9uPjwvcD4KCiAgICA8c2NyaXB0PgpDb2RlTWlycm9yLm1vZGVVUkwgPSAiLi4vbW9kZS8lTi8lTi5qcyI7CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbGluZU51bWJlcnM6IHRydWUKfSk7CnZhciBtb2RlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW9kZSIpOwpDb2RlTWlycm9yLm9uKG1vZGVJbnB1dCwgImtleXByZXNzIiwgZnVuY3Rpb24oZSkgewogIGlmIChlLmtleUNvZGUgPT0gMTMpIGNoYW5nZSgpOwp9KTsKZnVuY3Rpb24gY2hhbmdlKCkgewogICBlZGl0b3Iuc2V0T3B0aW9uKCJtb2RlIiwgbW9kZUlucHV0LnZhbHVlKTsKICAgQ29kZU1pcnJvci5hdXRvTG9hZE1vZGUoZWRpdG9yLCBtb2RlSW5wdXQudmFsdWUpOwp9Cjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/marker.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEJyZWFrcG9pbnQgRGVtbzwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuYnJlYWtwb2ludHMge3dpZHRoOiAuOGVtO30KICAgICAgLmJyZWFrcG9pbnQgeyBjb2xvcjogIzgyMjsgfQogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgI2FhYTt9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBCcmVha3BvaW50IGRlbW88L2gxPgoKICAgIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbGluZU51bWJlcnM6IHRydWUsCiAgZ3V0dGVyczogWyJDb2RlTWlycm9yLWxpbmVudW1iZXJzIiwgImJyZWFrcG9pbnRzIl0KfSk7CmVkaXRvci5vbigiZ3V0dGVyQ2xpY2siLCBmdW5jdGlvbihjbSwgbikgewogIHZhciBpbmZvID0gY20ubGluZUluZm8obik7CiAgY20uc2V0R3V0dGVyTWFya2VyKG4sICJicmVha3BvaW50cyIsIGluZm8ubWFya2VycyA/IG51bGwgOiBtYWtlTWFya2VyKCkpOwp9KTsKCmZ1bmN0aW9uIG1ha2VNYXJrZXIoKSB7CiAgdmFyIG1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogIG1hcmtlci5pbm5lckhUTUwgPSAi4pePIjsKICBtYXJrZXIuY2xhc3NOYW1lID0gImJyZWFrcG9pbnQiOwogIHJldHVybiBtYXJrZXI7Cn0KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5DbGljayB0aGUgbGluZS1udW1iZXIgZ3V0dGVyIHRvIGFkZCBvciByZW1vdmUgJ2JyZWFrcG9pbnRzJy48L3A+CgogICAgPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBndXR0ZXJzOiBbIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiLCAiYnJlYWtwb2ludHMiXQp9KTsKZWRpdG9yLm9uKCJndXR0ZXJDbGljayIsIGZ1bmN0aW9uKGNtLCBuKSB7CiAgdmFyIGluZm8gPSBjbS5saW5lSW5mbyhuKTsKICBjbS5zZXRHdXR0ZXJNYXJrZXIobiwgImJyZWFrcG9pbnRzIiwgaW5mby5ndXR0ZXJNYXJrZXJzID8gbnVsbCA6IG1ha2VNYXJrZXIoKSk7Cn0pOwoKZnVuY3Rpb24gbWFrZU1hcmtlcigpIHsKICB2YXIgbWFya2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgbWFya2VyLnN0eWxlLmNvbG9yID0gIiM4MjIiOwogIG1hcmtlci5pbm5lckhUTUwgPSAi4pePIjsKICByZXR1cm4gbWFya2VyOwp9CiAgICA8L3NjcmlwdD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/matchhighlighter.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IE1hdGNoIEhpZ2hsaWdodGVyIERlbW88L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvdXRpbC9zZWFyY2hjdXJzb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi91dGlsL21hdGNoLWhpZ2hsaWdodGVyLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fQoJICAKICAgICAgc3Bhbi5Db2RlTWlycm9yLW1hdGNoaGlnaGxpZ2h0IHsgYmFja2dyb3VuZDogI2U5ZTllOSB9CiAgICAgIC5Db2RlTWlycm9yLWZvY3VzZWQgc3Bhbi5Db2RlTWlycm9yLW1hdGNoaGlnaGxpZ2h0IHsgYmFja2dyb3VuZDogI2U3ZTRmZjsgIWltcG9ydGFudCB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBNYXRjaCBIaWdobGlnaHRlciBEZW1vPC9oMT4KCiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPlNlbGVjdCB0aGlzIHRleHQ6IGhhcmRUb1Nwb3RWYXIKCUFuZCBldmVyeXdoZXJlIGVsc2UgaW4geW91ciBjb2RlIHdoZXJlIGhhcmRUb1Nwb3RWYXIgYXBwZWFycyB3aWxsIGF1dG9tYXRpY2FsbHkgaWxsdW1pbmF0ZS4KR2l2ZSBpdCBhIHRyeSEgIE5vIG1vcmUgaGFyZFRvU3BvdFZhcnMuPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHtsaW5lTnVtYmVycyA6IHRydWV9KTsKZWRpdG9yLm9uKCJjdXJzb3JBY3Rpdml0eSIsIGZ1bmN0aW9uKCkgewogIGVkaXRvci5tYXRjaEhpZ2hsaWdodCgiQ29kZU1pcnJvci1tYXRjaGhpZ2hsaWdodCIpOwp9KTsKPC9zY3JpcHQ+CgogICAgPHA+SGlnaGxpZ2h0IG1hdGNoZXMgb2Ygc2VsZWN0ZWQgdGV4dCBvbiBzZWxlY3Q8L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/multiplex.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IE11bHRpcGxleGluZyBQYXJzZXIgRGVtbzwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi91dGlsL211bHRpcGxleC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7fQogICAgICAuY20tZGVsaW1pdCB7Y29sb3I6ICNmYTQ7fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogTXVsdGlwbGV4aW5nIFBhcnNlciBEZW1vPC9oMT4KCiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo8aHRtbD4KICA8Ym9keSBzdHlsZT0iPDxtYWdpYz4+Ij4KICAgIDxoMT48PCB0aGlzIGlzIG5vdCA8aHRtbCA+PjwvaDE+CiAgICA8PAogICAgICAgIG11bHRpbGluZQogICAgICAgIG5vdCBodG1sCiAgICAgICAgYXQgYWxsIDogJmFtcDthbXA7IDxsaW5rLz4KICAgID4+CiAgICA8cD50aGlzIGlzIGh0bWwgYWdhaW48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgiZGVtbyIsIGZ1bmN0aW9uKGNvbmZpZykgewogIHJldHVybiBDb2RlTWlycm9yLm11bHRpcGxleGluZ01vZGUoCiAgICBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAidGV4dC9odG1sIiksCiAgICB7b3BlbjogIjw8IiwgY2xvc2U6ICI+PiIsCiAgICAgbW9kZTogQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgInRleHQvcGxhaW4iKSwKICAgICBkZWxpbVN0eWxlOiAiZGVsaW1pdCJ9CiAgICAvLyAuLiBtb3JlIG11bHRpcGxleGVkIHN0eWxlcyBjYW4gZm9sbG93IGhlcmUKICApOwp9KTsKdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBtb2RlOiAiZGVtbyIsCiAgbGluZU51bWJlcnM6IHRydWUsCiAgbGluZVdyYXBwaW5nOiB0cnVlCn0pOwo8L3NjcmlwdD4KCiAgICA8cD5EZW1vbnN0cmF0aW9uIG9mIGEgbXVsdGlwbGV4aW5nIG1vZGUsIHdoaWNoLCBhdCBjZXJ0YWluCiAgICBib3VuZGFyeSBzdHJpbmdzLCBzd2l0Y2hlcyB0byBvbmUgb3IgbW9yZSBpbm5lciBtb2Rlcy4gVGhlIG91dAogICAgKEhUTUwpIG1vZGUgZG9lcyBub3QgZ2V0IGZlZCB0aGUgY29udGVudCBvZiB0aGUgPGNvZGU+Jmx0OyZsdDsKICAgID4+PC9jb2RlPiBibG9ja3MuIFNlZQogICAgdGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCN1dGlsX211bHRpcGxleCI+bWFudWFsPC9hPiBhbmQKICAgIHRoZSA8YSBocmVmPSIuLi9saWIvdXRpbC9tdWx0aXBsZXguanMiPnNvdXJjZTwvYT4gZm9yIG1vcmUKICAgIGluZm9ybWF0aW9uLjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/mustache.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IE92ZXJsYXkgUGFyc2VyIERlbW88L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvdXRpbC9vdmVybGF5LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5jbS1tdXN0YWNoZSB7Y29sb3I6ICMwY2E7fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogT3ZlcmxheSBQYXJzZXIgRGVtbzwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPGh0bWw+CiAgPGJvZHk+CiAgICA8aDE+e3t0aXRsZX19PC9oMT4KICAgIDxwPlRoZXNlIGFyZSBsaW5rcyB0byB7e3RoaW5nc319OjwvcD4KICAgIDx1bD57eyNsaW5rc319CiAgICAgIDxsaT48YSBocmVmPSJ7e3VybH19Ij57e3RleHR9fTwvYT48L2xpPgogICAge3svbGlua3N9fTwvdWw+CiAgPC9ib2R5Pgo8L2h0bWw+CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgibXVzdGFjaGUiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIHZhciBtdXN0YWNoZU92ZXJsYXkgPSB7CiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2g7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goInt7IikpIHsKICAgICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkKICAgICAgICAgIGlmIChjaCA9PSAifSIgJiYgc3RyZWFtLm5leHQoKSA9PSAifSIpIGJyZWFrOwogICAgICAgIHN0cmVhbS5lYXQoIn0iKTsKICAgICAgICByZXR1cm4gIm11c3RhY2hlIjsKICAgICAgfQogICAgICB3aGlsZSAoc3RyZWFtLm5leHQoKSAhPSBudWxsICYmICFzdHJlYW0ubWF0Y2goInt7IiwgZmFsc2UpKSB7fQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwogIHJldHVybiBDb2RlTWlycm9yLm92ZXJsYXlNb2RlKENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHBhcnNlckNvbmZpZy5iYWNrZHJvcCB8fCAidGV4dC9odG1sIiksIG11c3RhY2hlT3ZlcmxheSk7Cn0pOwp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge21vZGU6ICJtdXN0YWNoZSJ9KTsKPC9zY3JpcHQ+CgogICAgPHA+RGVtb25zdHJhdGlvbiBvZiBhIG1vZGUgdGhhdCBwYXJzZXMgSFRNTCwgaGlnaGxpZ2h0aW5nCiAgICB0aGUgPGEgaHJlZj0iaHR0cDovL211c3RhY2hlLmdpdGh1Yi5jb20vIj5NdXN0YWNoZTwvYT4gdGVtcGxhdGluZwogICAgZGlyZWN0aXZlcyBpbnNpZGUgb2YgaXQgYnkgdXNpbmcgdGhlIGNvZGUKICAgIGluIDxhIGhyZWY9Ii4uL2xpYi91dGlsL292ZXJsYXkuanMiPjxjb2RlPm92ZXJsYXkuanM8L2NvZGU+PC9hPi4gVmlldwogICAgc291cmNlIHRvIHNlZSB0aGUgMTUgbGluZXMgb2YgY29kZSBuZWVkZWQgdG8gYWNjb21wbGlzaCB0aGlzLjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/preview.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEhUTUw1IHByZXZpZXc8L3RpdGxlPgogICAgPHNjcmlwdCBzcmM9Li4vbGliL2NvZGVtaXJyb3IuanM+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0uLi9tb2RlL3htbC94bWwuanM+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0uLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcz48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPS4uL21vZGUvY3NzL2Nzcy5qcz48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPS4uL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qcz48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Li4vbGliL2NvZGVtaXJyb3IuY3NzPgogICAgPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0uLi9kb2MvZG9jcy5jc3M+CiAgICA8c3R5bGUgdHlwZT10ZXh0L2Nzcz4KICAgICAgLkNvZGVNaXJyb3IgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgIH0KICAgICAgaWZyYW1lIHsKICAgICAgICB3aWR0aDogNDklOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogSFRNTDUgcHJldmlldzwvaDE+CiAgICA8dGV4dGFyZWEgaWQ9Y29kZSBuYW1lPWNvZGU+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9dXRmLTg+CiAgICA8dGl0bGU+SFRNTDUgY2FudmFzIGRlbW88L3RpdGxlPgogICAgPHN0eWxlPnAge2ZvbnQtZmFtaWx5OiBtb25vc3BhY2U7fTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+Q2FudmFzIHBhbmUgZ29lcyBoZXJlOjwvcD4KICAgIDxjYW52YXMgaWQ9cGFuZSB3aWR0aD0zMDAgaGVpZ2h0PTIwMD48L2NhbnZhcz4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFuZScpOwogICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwoKICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiKDI1MCwwLDApJzsKICAgICAgY29udGV4dC5maWxsUmVjdCgxMCwgMTAsIDU1LCA1MCk7CgogICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDAsIDAsIDI1MCwgMC41KSc7CiAgICAgIGNvbnRleHQuZmlsbFJlY3QoMzAsIDMwLCA1NSwgNTApOwogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+PC90ZXh0YXJlYT4KICAgIDxpZnJhbWUgaWQ9cHJldmlldz48L2lmcmFtZT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBkZWxheTsKICAgICAgLy8gSW5pdGlhbGl6ZSBDb2RlTWlycm9yIGVkaXRvciB3aXRoIGEgbmljZSBodG1sNSBjYW52YXMgZGVtby4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlJyksIHsKICAgICAgICBtb2RlOiAndGV4dC9odG1sJywKICAgICAgICB0YWJNb2RlOiAnaW5kZW50JwogICAgICB9KTsKICAgICAgZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgICBjbGVhclRpbWVvdXQoZGVsYXkpOwogICAgICAgIGRlbGF5ID0gc2V0VGltZW91dCh1cGRhdGVQcmV2aWV3LCAzMDApOwogICAgICB9KTsKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZVByZXZpZXcoKSB7CiAgICAgICAgdmFyIHByZXZpZXdGcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3Jyk7CiAgICAgICAgdmFyIHByZXZpZXcgPSAgcHJldmlld0ZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCAgcHJldmlld0ZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7CiAgICAgICAgcHJldmlldy5vcGVuKCk7CiAgICAgICAgcHJldmlldy53cml0ZShlZGl0b3IuZ2V0VmFsdWUoKSk7CiAgICAgICAgcHJldmlldy5jbG9zZSgpOwogICAgICB9CiAgICAgIHNldFRpbWVvdXQodXBkYXRlUHJldmlldywgMzAwKTsKICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/resize.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEF1dG9yZXNpemUgRGVtbzwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+CgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3IgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlZWU7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICB9CiAgICAgIC5Db2RlTWlycm9yLXNjcm9sbCB7CiAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IEF1dG9yZXNpemUgZGVtbzwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLkNvZGVNaXJyb3IgewogIGJvcmRlcjogMXB4IHNvbGlkICNlZWU7CiAgaGVpZ2h0OiBhdXRvOwp9Ci5Db2RlTWlycm9yLXNjcm9sbCB7CiAgb3ZlcmZsb3cteTogaGlkZGVuOwogIG92ZXJmbG93LXg6IGF1dG87Cn0KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5CeSBzZXR0aW5nIGEgZmV3IENTUyBwcm9wZXJ0aWVzLCBDb2RlTWlycm9yIGNhbiBiZSBtYWRlIHRvCmF1dG9tYXRpY2FsbHkgcmVzaXplIHRvIGZpdCBpdHMgY29udGVudC48L3A+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/runmode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IE1vZGUgUnVubmVyIERlbW88L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvdXRpbC9ydW5tb2RlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBNb2RlIFJ1bm5lciBEZW1vPC9oMT4KCiAgICA8dGV4dGFyZWEgaWQ9ImNvZGUiIHN0eWxlPSJ3aWR0aDogOTAlOyBoZWlnaHQ6IDdlbTsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmc6IC4yZW0gLjRlbTsiPgo8Zm9vYmFyPgogIDxibGFoPkVudGVyIHlvdXIgeG1sIGhlcmUgYW5kIHByZXNzIHRoZSBidXR0b24gYmVsb3cgdG8gZGlzcGxheQogICAgaXQgYXMgaGlnaGxpZ2h0ZWQgYnkgdGhlIENvZGVNaXJyb3IgWE1MIG1vZGU8L2JsYWg+CiAgPHRhZzIgZm9vPSIyIiBiYXI9IiZhbXA7cXVvdDtiYXImYW1wO3F1b3Q7Ii8+CjwvZm9vYmFyPjwvdGV4dGFyZWE+PGJyPgogICAgPGJ1dHRvbiBvbmNsaWNrPSJkb0hpZ2hsaWdodCgpOyI+SGlnaGxpZ2h0ITwvYnV0dG9uPgogICAgPHByZSBpZD0ib3V0cHV0IiBjbGFzcz0iY20tcy1kZWZhdWx0Ij48L3ByZT4KCiAgICA8c2NyaXB0PgpmdW5jdGlvbiBkb0hpZ2hsaWdodCgpIHsKICBDb2RlTWlycm9yLnJ1bk1vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKS52YWx1ZSwgImFwcGxpY2F0aW9uL3htbCIsCiAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKSk7Cn0KPC9zY3JpcHQ+CgogICAgPHA+UnVubmluZyBhIENvZGVNaXJyb3IgbW9kZSBvdXRzaWRlIG9mIHRoZSBlZGl0b3IuCiAgICBUaGUgPGNvZGU+Q29kZU1pcnJvci5ydW5Nb2RlPC9jb2RlPiBmdW5jdGlvbiwgZGVmaW5lZAogICAgaW4gPGNvZGU+PGEgaHJlZj0iLi4vbGliL3V0aWwvcnVubW9kZS5qcyI+bGliL3J1bm1vZGUuanM8L2E+PC9jb2RlPiB0YWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czo8L3A+CgogICAgPGRsPgogICAgICA8ZHQ+PGNvZGU+dGV4dCAoc3RyaW5nKTwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIGRvY3VtZW50IHRvIHJ1biB0aHJvdWdoIHRoZSBoaWdobGlnaHRlci48L2RkPgogICAgICA8ZHQ+PGNvZGU+bW9kZSAoPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI29wdGlvbl9tb2RlIj5tb2RlIHNwZWM8L2E+KTwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIG1vZGUgdG8gdXNlIChtdXN0IGJlIGxvYWRlZCBhcyBub3JtYWwpLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5vdXRwdXQgKGZ1bmN0aW9uIG9yIERPTSBub2RlKTwvY29kZT48L2R0PgogICAgICA8ZGQ+SWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCB0b2tlbiB3aXRoCiAgICAgIHR3byBhcmd1bWVudHMsIHRoZSB0b2tlbidzIHRleHQgYW5kIHRoZSB0b2tlbidzIHN0eWxlIGNsYXNzIChtYXkKICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHVuc3R5bGVkIHRva2VucykuIElmIGl0IGlzIGEgRE9NIG5vZGUsCiAgICAgIHRoZSB0b2tlbnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gPGNvZGU+c3BhbjwvY29kZT4gZWxlbWVudHMgYXMgaW4KICAgICAgYW4gZWRpdG9yLCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgbm9kZQogICAgICAodGhyb3VnaCA8Y29kZT5pbm5lckhUTUw8L2NvZGU+KS48L2RkPgogICAgPC9kbD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/search.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFNlYXJjaC9SZXBsYWNlIERlbW88L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi91dGlsL2RpYWxvZy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi91dGlsL2RpYWxvZy5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi91dGlsL3NlYXJjaGN1cnNvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL3V0aWwvc2VhcmNoLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fQogICAgICBkdCB7Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6ICM2NjY7fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogU2VhcmNoL1JlcGxhY2UgRGVtbzwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KICA8ZHQgaWQ9Im9wdGlvbl9pbmRlbnRXaXRoVGFicyI+PGNvZGU+aW5kZW50V2l0aFRhYnMgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgPGRkPldoZXRoZXIsIHdoZW4gaW5kZW50aW5nLCB0aGUgZmlyc3QgTio4IHNwYWNlcyBzaG91bGQgYmUKICByZXBsYWNlZCBieSBOIHRhYnMuIERlZmF1bHQgaXMgZmFsc2UuPC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fdGFiTW9kZSI+PGNvZGU+dGFiTW9kZSAoc3RyaW5nKTwvY29kZT48L2R0PgogIDxkZD5EZXRlcm1pbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIHRhYiBrZXkuCiAgTXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKICAgIDxkbD4KICAgICAgPGR0Pjxjb2RlPiJjbGFzc2ljIiAodGhlIGRlZmF1bHQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIGluc2VydCBhIHRhYi4gT3RoZXJ3aXNlLAogICAgICBiZWhhdmUgbGlrZSB0aGUgPGNvZGU+InNoaWZ0IjwvY29kZT4gbW9kZS4gKFdoZW4gc2hpZnQgaXMKICAgICAgaGVsZCwgdGhpcyBiZWhhdmVzIGxpa2UgdGhlIDxjb2RlPiJpbmRlbnQiPC9jb2RlPiBtb2RlLik8L2RkPgogICAgICA8ZHQ+PGNvZGU+InNoaWZ0IjwvY29kZT48L2R0PgogICAgICA8ZGQ+SW5kZW50IGFsbCBzZWxlY3RlZCBsaW5lcyBieQogICAgICBvbmUgPGEgaHJlZj0iI29wdGlvbl9pbmRlbnRVbml0Ij48Y29kZT5pbmRlbnRVbml0PC9jb2RlPjwvYT4uCiAgICAgIElmIHNoaWZ0IHdhcyBoZWxkIHdoaWxlIHByZXNzaW5nIHRhYiwgdW4taW5kZW50IGFsbCBzZWxlY3RlZAogICAgICBsaW5lcyBvbmUgdW5pdC48L2RkPgogICAgICA8ZHQ+PGNvZGU+ImluZGVudCI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkluZGVudCB0aGUgbGluZSB0aGUgJ2NvcnJlY3RseScsIGJhc2VkIG9uIGl0cyBzeW50YWN0aWMKICAgICAgY29udGV4dC4gT25seSB3b3JrcyBpZiB0aGUKICAgICAgbW9kZSA8YSBocmVmPSIjaW5kZW50Ij5zdXBwb3J0czwvYT4gaXQuPC9kZD4KICAgICAgPGR0Pjxjb2RlPiJkZWZhdWx0IjwvY29kZT48L2R0PgogICAgICA8ZGQ+RG8gbm90IGNhcHR1cmUgdGFiIHByZXNzZXMsIGxldCB0aGUgYnJvd3NlciBhcHBseSBpdHMKICAgICAgZGVmYXVsdCBiZWhhdmlvdXIgKHdoaWNoIHVzdWFsbHkgbWVhbnMgaXQgc2tpcHMgdG8gdGhlIG5leHQKICAgICAgY29udHJvbCkuPC9kZD4KICAgIDwvZGw+PC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fZW50ZXJNb2RlIj48Y29kZT5lbnRlck1vZGUgKHN0cmluZyk8L2NvZGU+PC9kdD4KICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGFuZCBob3cgbmV3IGxpbmVzIGFyZSBpbmRlbnRlZCB3aGVuIHRoZQogIGVudGVyIGtleSBpcyBwcmVzc2VkLiBUaGUgZm9sbG93aW5nIG1vZGVzIGFyZSBzdXBwb3J0ZWQ6CiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT4iaW5kZW50IiAodGhlIGRlZmF1bHQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Vc2UgdGhlIG1vZGUncyBpbmRlbnRhdGlvbiBydWxlcyB0byBnaXZlIHRoZSBuZXcgbGluZQogICAgICB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbi48L2RkPgogICAgICA8ZHQ+PGNvZGU+ImtlZXAiPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JbmRlbnQgdGhlIGxpbmUgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPiJmbGF0IjwvY29kZT48L2R0PgogICAgICA8ZGQ+RG8gbm90IGluZGVudCB0aGUgbmV3IGxpbmUuPC9kZD4KICAgIDwvZGw+PC9kZD4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHttb2RlOiAidGV4dC9odG1sIiwgbGluZU51bWJlcnM6IHRydWV9KTsKPC9zY3JpcHQ+CgogICAgPHA+RGVtb25zdHJhdGlvbiBvZiBwcmltaXRpdmUgc2VhcmNoL3JlcGxhY2UgZnVuY3Rpb25hbGl0eS4gVGhlCiAgICBrZXliaW5kaW5ncyAod2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYnkgY3VzdG9tIGtleW1hcHMpIGFyZTo8L3A+CiAgICA8ZGw+CiAgICAgIDxkdD5DdHJsLUYgLyBDbWQtRjwvZHQ+PGRkPlN0YXJ0IHNlYXJjaGluZzwvZGQ+CiAgICAgIDxkdD5DdHJsLUcgLyBDbWQtRzwvZHQ+PGRkPkZpbmQgbmV4dDwvZGQ+CiAgICAgIDxkdD5TaGlmdC1DdHJsLUcgLyBTaGlmdC1DbWQtRzwvZHQ+PGRkPkZpbmQgcHJldmlvdXM8L2RkPgogICAgICA8ZHQ+U2hpZnQtQ3RybC1GIC8gQ21kLU9wdGlvbi1GPC9kdD48ZGQ+UmVwbGFjZTwvZGQ+CiAgICAgIDxkdD5TaGlmdC1DdHJsLVIgLyBTaGlmdC1DbWQtT3B0aW9uLUY8L2R0PjxkZD5SZXBsYWNlIGFsbDwvZGQ+CiAgICA8L2RsPgogICAgPHA+U2VhcmNoaW5nIGlzIGVuYWJsZWQgYnkKICAgIGluY2x1ZGluZyA8YSBocmVmPSIuLi9saWIvdXRpbC9zZWFyY2guanMiPmxpYi91dGlsL3NlYXJjaC5qczwvYT4KICAgIGFuZCA8YSBocmVmPSIuLi9saWIvdXRpbC9zZWFyY2hjdXJzb3IuanMiPmxpYi91dGlsL3NlYXJjaGN1cnNvci5qczwvYT4uCiAgICBGb3IgZ29vZC1sb29raW5nIGlucHV0IGRpYWxvZ3MsIHlvdSBhbHNvIHdhbnQgdG8gaW5jbHVkZQogICAgPGEgaHJlZj0iLi4vbGliL3V0aWwvZGlhbG9nLmpzIj5saWIvdXRpbC9kaWFsb2cuanM8L2E+CiAgICBhbmQgPGEgaHJlZj0iLi4vbGliL3V0aWwvZGlhbG9nLmNzcyI+bGliL3V0aWwvZGlhbG9nLmNzczwvYT4uPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/theme.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFRoZW1lIERlbW88L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbmVhdC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9lbGVnYW50LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2VybGFuZy1kYXJrLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL25pZ2h0LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL21vbm9rYWkuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvY29iYWx0LmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2VjbGlwc2UuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvcnVieWJsdWUuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbGVzc2VyLWRhcmsuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUveHEtZGFyay5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9hbWJpYW5jZS5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9ibGFja2JvYXJkLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3ZpYnJhbnQtaW5rLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3NvbGFyaXplZC5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS90d2lsaWdodC5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQtc2l6ZToxM3B4fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogVGhlbWUgZGVtbzwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KZnVuY3Rpb24gZmluZFNlcXVlbmNlKGdvYWwpIHsKICBmdW5jdGlvbiBmaW5kKHN0YXJ0LCBoaXN0b3J5KSB7CiAgICBpZiAoc3RhcnQgPT0gZ29hbCkKICAgICAgcmV0dXJuIGhpc3Rvcnk7CiAgICBlbHNlIGlmIChzdGFydCA+IGdvYWwpCiAgICAgIHJldHVybiBudWxsOwogICAgZWxzZQogICAgICByZXR1cm4gZmluZChzdGFydCArIDUsICIoIiArIGhpc3RvcnkgKyAiICsgNSkiKSB8fAogICAgICAgICAgICAgZmluZChzdGFydCAqIDMsICIoIiArIGhpc3RvcnkgKyAiICogMykiKTsKICB9CiAgcmV0dXJuIGZpbmQoMSwgIjEiKTsKfTwvdGV4dGFyZWE+PC9mb3JtPgoKPHA+U2VsZWN0IGEgdGhlbWU6IDxzZWxlY3Qgb25jaGFuZ2U9InNlbGVjdFRoZW1lKCkiIGlkPXNlbGVjdD4KICAgIDxvcHRpb24gc2VsZWN0ZWQ+ZGVmYXVsdDwvb3B0aW9uPgogICAgPG9wdGlvbj5hbWJpYW5jZTwvb3B0aW9uPgogICAgPG9wdGlvbj5ibGFja2JvYXJkPC9vcHRpb24+CiAgICA8b3B0aW9uPmNvYmFsdDwvb3B0aW9uPgogICAgPG9wdGlvbj5lY2xpcHNlPC9vcHRpb24+CiAgICA8b3B0aW9uPmVsZWdhbnQ8L29wdGlvbj4KICAgIDxvcHRpb24+ZXJsYW5nLWRhcms8L29wdGlvbj4KICAgIDxvcHRpb24+bGVzc2VyLWRhcms8L29wdGlvbj4KICAgIDxvcHRpb24+bW9ub2thaTwvb3B0aW9uPgogICAgPG9wdGlvbj5uZWF0PC9vcHRpb24+CiAgICA8b3B0aW9uPm5pZ2h0PC9vcHRpb24+CiAgICA8b3B0aW9uPnJ1YnlibHVlPC9vcHRpb24+CiAgICA8b3B0aW9uPnNvbGFyaXplZCBkYXJrPC9vcHRpb24+CiAgICA8b3B0aW9uPnNvbGFyaXplZCBsaWdodDwvb3B0aW9uPgogICAgPG9wdGlvbj50d2lsaWdodDwvb3B0aW9uPgogICAgPG9wdGlvbj52aWJyYW50LWluazwvb3B0aW9uPgogICAgPG9wdGlvbj54cS1kYXJrPC9vcHRpb24+Cjwvc2VsZWN0Pgo8L3A+Cgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICBsaW5lTnVtYmVyczogdHJ1ZQogIH0pOwogIHZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3QiKTsKICBmdW5jdGlvbiBzZWxlY3RUaGVtZSgpIHsKICAgIHZhciB0aGVtZSA9IGlucHV0Lm9wdGlvbnNbaW5wdXQuc2VsZWN0ZWRJbmRleF0uaW5uZXJIVE1MOwogICAgZWRpdG9yLnNldE9wdGlvbigidGhlbWUiLCB0aGVtZSk7CiAgfQogIHZhciBjaG9pY2UgPSBkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2ggJiYKICAgICAgICAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7CiAgaWYgKGNob2ljZSkgewogICAgaW5wdXQudmFsdWUgPSBjaG9pY2U7CiAgICBlZGl0b3Iuc2V0T3B0aW9uKCJ0aGVtZSIsIGNob2ljZSk7CiAgfQo8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/variableheight.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFZhcmlhYmxlIEhlaWdodCBEZW1vPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgc2lsdmVyOyBib3JkZXItd2lkdGg6IDFweCAycHg7IH0KICAgICAgLmNtLWhlYWRlciB7IGZvbnQtc2l6ZTogMTUwJTsgZm9udC1mYW1pbHk6IGFyaWFsOyB9CiAgICAgIC5jbS1zdHJvbmcgeyBmb250LXNpemU6IDE0MCU7IH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFZhcmlhYmxlIEhlaWdodCBEZW1vPC9oMT4KCiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPiMjIyBBIEZpcnN0IExldmVsIEhlYWRlcgoKKipCb2xkKiogdGV4dCBpbiBhIG5vcm1hbC1zaXplIHBhcmFncmFwaC4KCkFuZCBhIHZlcnkgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZywgd3JhcHBlZCBsaW5lIHdpdGggYSBwaWVjZSBvZiAqKmJpZyoqIHRleHQgaW5zaWRlIG9mIGl0LgoKIyMgQSBTZWNvbmQgTGV2ZWwgSGVhZGVyCgpOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvCnRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4gVGhpcyBpcyBqdXN0IGEKcmVndWxhciBwYXJhZ3JhcGguCgpUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5CmRvZydzIGJhY2suCgojIyMgSGVhZGVyIDMKCj4gVGhpcyBpcyBhIGJsb2NrcXVvdGUuCj4gCj4gVGhpcyBpcyB0aGUgc2Vjb25kIHBhcmFncmFwaCBpbiB0aGUgYmxvY2txdW90ZS4KPgo+ICMjIFRoaXMgaXMgYW4gSDIgaW4gYSBibG9ja3F1b3RlICAgICAgIAo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQgaWQ9InNjcmlwdCI+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbGluZVdyYXBwaW5nOiB0cnVlLAogICAgICAgIG1vZGU6ICJtYXJrZG93biIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/vim.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFZpbSBiaW5kaW5ncyBkZW1vPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL3V0aWwvZGlhbG9nLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvdXRpbC9zZWFyY2hjdXJzb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvY2xpa2UvY2xpa2UuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL2tleW1hcC92aW0uanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvdXRpbC9kaWFsb2cuY3NzIj4KCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlO30KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFZpbSBiaW5kaW5ncyBkZW1vPC9oMT4KCiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojaW5jbHVkZSAic3lzY2FsbHMuaCIKLyogZ2V0Y2hhcjogIHNpbXBsZSBidWZmZXJlZCB2ZXJzaW9uICovCmludCBnZXRjaGFyKHZvaWQpCnsKICBzdGF0aWMgY2hhciBidWZbQlVGU0laXTsKICBzdGF0aWMgY2hhciAqYnVmcCA9IGJ1ZjsKICBzdGF0aWMgaW50IG4gPSAwOwogIGlmIChuID09IDApIHsgIC8qIGJ1ZmZlciBpcyBlbXB0eSAqLwogICAgbiA9IHJlYWQoMCwgYnVmLCBzaXplb2YgYnVmKTsKICAgIGJ1ZnAgPSBidWY7CiAgfQogIHJldHVybiAoLS1uID49IDApID8gKHVuc2lnbmVkIGNoYXIpICpidWZwKysgOiBFT0Y7Cn0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlMiIgbmFtZT0iY29kZTIiPgogICAgICAgIEkgYW0gYW5vdGhlciBmaWxlISBZb3UgY2FuIHlhbmsgZnJvbSBteSBuZWlnaGJvciBhbmQgcGFzdGUgaGVyZS4KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5UaGUgdmltIGtleWJpbmRpbmdzIGFyZSBlbmFibGVkIGJ5CmluY2x1ZGluZyA8YSBocmVmPSIuLi9rZXltYXAvdmltLmpzIj5rZXltYXAvdmltLmpzPC9hPiBhbmQgc2V0dGluZwp0aGUgPGNvZGU+a2V5TWFwPC9jb2RlPiBvcHRpb24gdG8gPGNvZGU+InZpbSI8L2NvZGU+LiBCZWNhdXNlCkNvZGVNaXJyb3IncyBpbnRlcm5hbCBBUEkgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gVmltLCB0aGV5IGFyZSBvbmx5CmEgbG9vc2UgYXBwcm94aW1hdGlvbiBvZiBhY3R1YWwgdmltIGJpbmRpbmdzLCB0aG91Z2guPC9wPgoKICAgIDxzY3JpcHQ+CiAgICAgIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IGZ1bmN0aW9uKCl7IGFsZXJ0KCJTYXZpbmciKTsgfTsKICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWNzcmMiLAogICAgICAgIGtleU1hcDogInZpbSIsCiAgICAgICAgc2hvd0N1cnNvcldoZW5TZWxlY3Rpbmc6IHRydWUKICAgICAgfSk7CiAgICAgIHZhciBlZGl0b3IyID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUyIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWNzcmMiLAogICAgICAgIGtleU1hcDogInZpbSIsCiAgICAgICAgc2hvd0N1cnNvcldoZW5TZWxlY3Rpbmc6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/visibletabs.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFZpc2libGUgdGFicyBkZW1vPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9jbGlrZS9jbGlrZS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+CgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjZWVlOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTt9CiAgICAgIC5jbS10YWIgewogICAgICAgICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUFNQ0FZQUFBQWt1ajVSQUFBQUFYTlNSMElBcnM0YzZRQUFBR0ZKUkVGVVNNZnQxTHNSUUZBUWhlSFBvd0FLb0FDeDNJZ0VLdGFFSHVqRGpPUlNnV1RIL1pPZG5aT2NNL3Nnay9rRkZXWTBxVjhmb1F3UzRNS0JDUzNxUjZpeEJKdkVsT29iWUF0aXZzZUlFMTIwRmFvd0pQTjc1R011OGovTGZNd05qaDRIVXB3ZzRMVUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQ7CiAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFZpc2libGUgdGFicyBkZW1vPC9oMT4KCiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojaW5jbHVkZSAic3lzY2FsbHMuaCIKLyogZ2V0Y2hhcjogIHNpbXBsZSBidWZmZXJlZCB2ZXJzaW9uICovCmludCBnZXRjaGFyKHZvaWQpCnsKCXN0YXRpYyBjaGFyIGJ1ZltCVUZTSVpdOwoJc3RhdGljIGNoYXIgKmJ1ZnAgPSBidWY7CglzdGF0aWMgaW50IG4gPSAwOwoJaWYgKG4gPT0gMCkgeyAgLyogYnVmZmVyIGlzIGVtcHR5ICovCgkJbiA9IHJlYWQoMCwgYnVmLCBzaXplb2YgYnVmKTsKCQlidWZwID0gYnVmOwoJfQoJcmV0dXJuICgtLW4gPj0gMCkgPyAodW5zaWduZWQgY2hhcikgKmJ1ZnArKyA6IEVPRjsKfQo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPlRhYnMgaW5zaWRlIHRoZSBlZGl0b3IgYXJlIHNwYW5zIHdpdGggdGhlCmNsYXNzIDxjb2RlPmNtLXRhYjwvY29kZT4sIGFuZCBjYW4gYmUgc3R5bGVkLgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgdGFiU2l6ZTogNCwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtY3NyYyIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/widget.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IElubGluZSBXaWRnZXQgRGVtbzwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwOi8vYWpheC5hc3BuZXRjZG4uY29tL2FqYXgvanNoaW50L3IwNy9qc2hpbnQuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5saW50LWVycm9yIHtmb250LWZhbWlseTogYXJpYWw7IGZvbnQtc2l6ZTogNzAlOyBiYWNrZ3JvdW5kOiAjZmZhOyBjb2xvcjogI2EwMDsgcGFkZGluZzogMnB4IDVweCAzcHg7IH0KICAgICAgLmxpbnQtZXJyb3ItaWNvbiB7Y29sb3I6IHdoaXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOyBib3JkZXItcmFkaXVzOiA1MCU7IHBhZGRpbmc6IDAgM3B4OyBtYXJnaW4tcmlnaHQ6IDdweDt9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBJbmxpbmUgV2lkZ2V0IERlbW88L2gxPgoKICAgIDxkaXYgaWQ9Y29kZT48L2Rpdj4KICAgIDxzY3JpcHQgaWQ9InNjcmlwdCI+dmFyIHdpZGdldHMgPSBbXQpmdW5jdGlvbiB1cGRhdGVIaW50cygpIHsKICBlZGl0b3Iub3BlcmF0aW9uKGZ1bmN0aW9uKCl7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyArK2kpCiAgICAgIGVkaXRvci5yZW1vdmVMaW5lV2lkZ2V0KHdpZGdldHNbaV0pOwogICAgd2lkZ2V0cy5sZW5ndGggPSAwOwoKICAgIEpTSElOVChlZGl0b3IuZ2V0VmFsdWUoKSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IEpTSElOVC5lcnJvcnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGVyciA9IEpTSElOVC5lcnJvcnNbaV07CiAgICAgIGlmICghZXJyKSBjb250aW51ZTsKICAgICAgdmFyIG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB2YXIgaWNvbiA9IG1zZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikpOwogICAgICBpY29uLmlubmVySFRNTCA9ICIhISI7CiAgICAgIGljb24uY2xhc3NOYW1lID0gImxpbnQtZXJyb3ItaWNvbiI7CiAgICAgIG1zZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlcnIucmVhc29uKSk7CiAgICAgIG1zZy5jbGFzc05hbWUgPSAibGludC1lcnJvciI7CiAgICAgIHdpZGdldHMucHVzaChlZGl0b3IuYWRkTGluZVdpZGdldChlcnIubGluZSAtIDEsIG1zZywge2NvdmVyR3V0dGVyOiBmYWxzZSwgbm9IU2Nyb2xsOiB0cnVlfSkpOwogICAgfQogIH0pOwogIHZhciBpbmZvID0gZWRpdG9yLmdldFNjcm9sbEluZm8oKTsKICB2YXIgYWZ0ZXIgPSBlZGl0b3IuY2hhckNvb3Jkcyh7bGluZTogZWRpdG9yLmdldEN1cnNvcigpLmxpbmUgKyAxLCBjaDogMH0sICJsb2NhbCIpLnRvcDsKICBpZiAoaW5mby50b3AgKyBpbmZvLmNsaWVudEhlaWdodCA8IGFmdGVyKQogICAgZWRpdG9yLnNjcm9sbFRvKG51bGwsIGFmdGVyIC0gaW5mby5jbGllbnRIZWlnaHQgKyAzKTsKfQoKd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogIHZhciBzYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY3JpcHQiKTsKICB2YXIgY29udGVudCA9IHNjLnRleHRDb250ZW50IHx8IHNjLmlubmVyVGV4dCB8fCBzYy5pbm5lckhUTUw7CgogIHdpbmRvdy5lZGl0b3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbW9kZTogImphdmFzY3JpcHQiLAogICAgdmFsdWU6IGNvbnRlbnQKICB9KTsKCiAgdmFyIHdhaXRpbmc7CiAgZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgIGNsZWFyVGltZW91dCh3YWl0aW5nKTsKICAgIHdhaXRpbmcgPSBzZXRUaW1lb3V0KHVwZGF0ZUhpbnRzLCA1MDApOwogIH0pOwoKICBzZXRUaW1lb3V0KHVwZGF0ZUhpbnRzLCAxMDApOwp9OwoKImxvbmcgbGluZSB0byBjcmVhdGUgYSBob3Jpem9udGFsIHNjcm9sbGJhciwgaW4gb3JkZXIgdG8gdGVzdCB3aGV0aGVyIHRoZSAobm9uLWlubGluZSkgd2lkZ2V0cyBzdGF5IGluIHBsYWNlIHdoZW4gc2Nyb2xsaW5nIHRvIHRoZSByaWdodCI7Cjwvc2NyaXB0Pgo8cD5UaGlzIGRlbW8gcnVucyA8YSBocmVmPSJodHRwOi8vanNoaW50LmNvbSI+SlNIaW50PC9hPiBvdmVyIHRoZSBjb2RlCmluIHRoZSBlZGl0b3IgKHdoaWNoIGlzIHRoZSBzY3JpcHQgdXNlZCBvbiB0aGlzIHBhZ2UpLCBhbmQKaW5zZXJ0cyA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkTGluZVdpZGdldCI+bGluZSB3aWRnZXRzPC9hPiB0bwpkaXNwbGF5IHRoZSB3YXJuaW5ncyB0aGF0IEpTSGludCBjb21lcyB1cCB3aXRoLjwvcD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/demo/xmlcomplete.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFhNTCBBdXRvY29tcGxldGUgRGVtbzwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi91dGlsL3NpbXBsZS1oaW50LmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL3V0aWwvc2ltcGxlLWhpbnQuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvdXRpbC9jbG9zZXRhZy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL3V0aWwveG1sLWhpbnQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7IGJvcmRlcjogMXB4IHNvbGlkICNlZWU7IGhlaWdodDogYXV0bzsgfQogICAgICAuQ29kZU1pcnJvci1zY3JvbGwgeyBvdmVyZmxvdy15OiBoaWRkZW47IG92ZXJmbG93LXg6IGF1dG87IH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFhNTCBBdXRvY29tcGxldGUgZGVtbzwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj48L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8cD5UeXBlICcmbHQ7JyBvciBzcGFjZSBpbnNpZGUgdGFnIG9yCiAgICBwcmVzcyA8c3Ryb25nPmN0cmwtc3BhY2U8L3N0cm9uZz4gdG8gYWN0aXZhdGUgYXV0b2NvbXBsZXRpb24uIFNlZQogICAgdGhlIGNvZGUgKDxhIGhyZWY9Ii4uL2xpYi91dGlsL3NpbXBsZS1oaW50LmpzIj5oZXJlPC9hPgogICAgYW5kIDxhIGhyZWY9Ii4uL2xpYi91dGlsL3htbC1oaW50LmpzIj5oZXJlPC9hPikgdG8gZmlndXJlIG91dCBob3cKICAgIGl0IHdvcmtzLjwvcD4KCiAgICA8c2NyaXB0PgogICAgICBDb2RlTWlycm9yLnhtbEhpbnRzWyc8J10gPSBbCiAgICAgICAgICAnbGV2ZWxUb3AnLAogICAgICAgICAgJ2xldmVsUm9vdCcsCiAgICAgICAgICAnbWFpbkxldmVsJwogICAgICBdOwoKICAgICAgQ29kZU1pcnJvci54bWxIaW50c1snPGxldmVsVG9wICddID0gCiAgICAgIENvZGVNaXJyb3IueG1sSGludHNbJzxsZXZlbFJvb3QgJ10gPSAKICAgICAgQ29kZU1pcnJvci54bWxIaW50c1snPG1haW5MZXZlbCAnXSA9IFsKICAgICAgICAgICdwcm9wZXJ0eTExMTEnLAogICAgICAgICAgJ3Byb3BlcnR5MjIyMicKICAgICAgXTsKCiAgICAgIENvZGVNaXJyb3IueG1sSGludHNbJzxsZXZlbFRvcD48J10gPSAKICAgICAgQ29kZU1pcnJvci54bWxIaW50c1snPGxldmVsUm9vdD48J10gPSAKICAgICAgQ29kZU1pcnJvci54bWxIaW50c1snPG1haW5MZXZlbD48J10gPSBbCiAgICAgICAgICAnc2Vjb25kJywKICAgICAgICAgICd0d28nCiAgICAgIF07CgogICAgICBDb2RlTWlycm9yLnhtbEhpbnRzWyc8bGV2ZWxUb3A+PHNlY29uZCAnXSA9IFsKICAgICAgICAnc2Vjb25kUHJvcGVydHknCiAgICAgIF07CgogICAgICBDb2RlTWlycm9yLnhtbEhpbnRzWyc8bGV2ZWxUb3A+PHNlY29uZD48J10gPSBbCiAgICAgICAgJ3RocmVlJywKICAgICAgICAneC10aHJlZScKICAgICAgXTsKCiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgbW9kZTogJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgICAgICBleHRyYUtleXM6IHsKICAgICAgICAgICAgICAgICInPiciOiBmdW5jdGlvbihjbSkgeyBjbS5jbG9zZVRhZyhjbSwgJz4nKTsgfSwKICAgICAgICAgICAgICAgICInLyciOiBmdW5jdGlvbihjbSkgeyBjbS5jbG9zZVRhZyhjbSwgJy8nKTsgfSwKICAgICAgICAgICAgICAgICInICciOiBmdW5jdGlvbihjbSkgeyBDb2RlTWlycm9yLnhtbEhpbnQoY20sICcgJyk7IH0sCiAgICAgICAgICAgICAgICAiJzwnIjogZnVuY3Rpb24oY20pIHsgQ29kZU1pcnJvci54bWxIaW50KGNtLCAnPCcpOyB9LAogICAgICAgICAgICAgICAgIkN0cmwtU3BhY2UiOiBmdW5jdGlvbihjbSkgeyBDb2RlTWlycm9yLnhtbEhpbnQoY20sICcnKTsgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/doc/baboon.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAXsAAADcCAYAAACRUAHpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADVAAAA1QBkANg0QAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7J13fBRV18d/d9MTkpBASKEkQCKhBpBAhFAEjKAgJXREelFRAUUExcKj74M8gkp/lEeKSBdQIkWQEjpSAgKhh04CIY20TbI57x+TXbJkd2dmd3Znk8z38zkSd285M3Pv2Tvn3nsuIyIoGIcxxgBUA+ALoKoZ0pyIrthecwUFBYWnOMqtgJwwxtwB1AQQVPLvs3/XBBAIwNmCapoCUIy9goKCrFRoY88YcwQQCqBhiYRB36BXtYEaTQH8aoN6FBQUFIxSIYw9Y8wDQAM8NepaCQXgJKNqANBE5voVSsEYqw7gZQBRRPSO3PooKNiKcmXsGWO+ABqhrFGvA4DJqJopmsqtQGWmZM7leQCvlEgkABWAI3LqpaBga+za2DPG/AF0BNCpRBrKqY+ZhDLG3IgoT25FKguMsaoAYsAZ924A/A0ku2xTpRQUZMaujD1jLAD6xj1cTn0kQgXubeSU3IpUZBhjEXg6en8BgANPFsXYK1QqZDX2jLFA6Bv3BnLqYy4uLi5Qq9WmkjSFYuwlhTHmBaArOOPeHdykuxgUY69QqbCpsS9xy3TGU+P+nC3rtxRfX1+0aNECnTp1QqtWrfDcc88hMDAQjo6OCA4OxoMHD4xlVfz2EsAYawzOsL8CIBqWTb5flUQpBYVygtWNPWOsDoC+AGIBtAXn1rBr/P39ERkZiY4dO6Jly5YICwtDjRo14OLiYjRPy5Yt8ccffxj7WjH2ZlCyyqoznrpn6khY/AnG2GkAx7VCRLclLF9Bwa6wirFnjIWCM+6x4FY/2CW1a9dGVFQUOnTogObNm6N+/fqoXr06nJzEDxg7depkytgryy9FwBjzBDAfwGAAxn9hLcMd3NtBdKl6kwGcwNMfgL+JKMtK9Sso2BTJjD1jrAk4494XQDOpyrUUlUqFkJAQREdHIzo6GhEREQgJCUG1atXg4MA3hyecli1bmvo6kDFWjYgeS1ZhBYUx1hLAOnAb4GxNAIDXSgQAiDF2CU+N/wkA54ioSAbdFBQsglkSG4cx9jyejuBl9b87OjoiLCwMHTp0QNu2bdG0aVPUqVMHPj4+UKnEeY6Kiopw7do1/PPPP7hw4QIuXryIwsJCzJ07F/Xq1TOY586dO6hTx6SX4UUi2i9KkUoGY+xdAP+BZeEprE0eAK375wQ4989NWTVSUBCAaGPPGAsHMBLAQADB1lCKj+DgYLz22mto164dGjdujNq1a8PLywvc/hnhqNVqXLlyRWfQL168iNzcXDRv3hxBQUHIyclBRkaGTlQqFWbPno3atWuXKaugoMCkTx/Au0S0QNyVVg5KNsstx9MRdXkjBcB4IvpNbkUUFIwhyNiXLHMbCM7Iv2BtpUqjUqnQokULDBo0CF27dkWDBg3g5uYmqoz8/HxcvnxZz6hfuHAB169fh0ajKZPe2dkZUVFReOmllzBmzBgEBAQIqsfPzw+pqanGvv6RiMaJUrwSwBiLBrAGQNlf0PLBbQBjiGi33IooKJjCqLEv2WbeCcAocH54d1so5O7ujhdffBEDBgxAdHQ0goODBfvW8/LykJiYqGfQL168iBs3bqC4uNgsfVxcXPD666/jgw8+QHi46T1eXbt2xV9//WXs62NEZNMfSnuGMaYCMB3AF+DfAGWPEIAfAEwloidyK6OgwEcZY88YCwYwAsBwAHWtrYC/vz969eqFXr16oVWrVvD29oazszOvS+bq1as4duwYLly4oDPqN2/eNNuo88EYw+uvv44FCxbA29vbYJp//etf+PTTT40V8QSAN8l4gECJgd0EoI9cOlQg1ADqEpHRzRUKCvYEIyIwxtzAjd5HglvXbLWgYg0bNsSAAQPQpUsXBAcHw8fHB56enibzFBUVISEhAYcOHdJJSkqKtVQ0SUhICFavXo127dqV+W7nzp3o3r27qex15Z7MK3nW+wG0llOPCsI8InpfbiUUFITAACwAMAyA4eGqBTg7O+OFF17Aq6++imbNmqFOnTqoU6cOPDw8TObLycnBsWPHdIb92LFjyM7Ollo9XhhjOtdNeno60tPToVar4eDggI8//hgzZ86Eo+PT1as3btxA/fr1TRX5GhFts67W/DDGagA4Bhu8uVVwcgCEEJHRiRoFBXvBEUAEJDL03t7eiIqKQnR0NBo1aoSwsDA0aNAAzs6mV9I9fPhQb9R+5swZFBXJv5Q5NDQUn3/+Ofr3769zK+Xm5iI9PR1paWlIS0tDjRo1dOkDAwP5imwKQHZjD24XsxKF03I8AEwG8LHciigo8MEAfApukkw0fn5+iIyMRIsWLdCoUSM8//zzaNCAP5bZ1atX9Yz7lSvCT+1zdHSEv78/cnNzkZ2djcLCQnNUF0Xnzp2xfPlyvnX0AICqVasiMzPT2NfriGiwpMqJpCR8xV/gDnZRsJwsAMFElCG3IgoKpmAA2gE4xJdQpVLBz88PERERaNasGV544QW0a9cO/v6GQoU/xRJ/u6+vL2JiYtCoUSM0atQIDRs2RFhYmF44g4KCAmRnZyMzMxMXL17EmTNnkJCQgISEBNy4cQNSzYd6eXlh3rx5GD16tMl00dHROHz4sLGvLxCRbKETSsJY/AVpY8woAJ8S0b/kVkJBgQ9HcKMTMiVfffUV5eTkEB/Z2dm0Z88e+vzzz6lr165UpUoVk+UakqioKFq5ciXl5eXx1meKzMxM2rFjB40ePZqqVasmWg9D0rdvXyooKDBa58cff2wqfyEAZyKCrQVAYwAPpLgHipSRVABV5HiuiigiVLj/cH5kkw168uTJZIiUlBT69ddfafLkyRQZGUmOjo5md5ohQ4ZQQkKCwXospbCwkHbt2kVjxowhX19fizr3oEGDSKPRGKxn69atfPmbGXsY1hJwx/Kl2oFRrMjyga2fqyKKiBHuP8B7fI05IiKCtOTl5dGoUaPoueeek6SjhISE0M6dO8lWZGZm0qRJkyz6YXrzzTcNln358mW+vEPIlg+Yc9Nl2IExrOjyAICrLZ+tIoqIEe4/XAhek42ZMUapqamkJTg42OIOolKp6L333qPs7GySg3/++Yc6duxotv4zZ84sU2Z2djZfvn+TrR4u0AVAth0YwsoiEw08AwcAL4ML2fwVgIng9rREgYstJYtbT5HKJ0//EODP3bhxI2kZMWKERR3D0dGRVq9eTfbA5MmTzb6O77//vkx57u7upvLEkS0eLNADQL4dGMDKJLcBOJXc/9YAvgeQLCBfKoBzAHaBCwhX+kfhBSg/CopIIE//AFbzNcrSrouVK1ea3SlcXFxo69atZC/k5eVReHi4Wdfi6OhIiYmJeuW1atXKVJ5bZO2HCgwAUGAHxq8yyq/gjjy0RtnP/ij8H7gfhVg8/VFwsXb7UqR8ytM/uHg4JhtbeHg4abl9+7bZjTYuLo7sjSNHjpBKpTLrel555RW9sqZMmcKXx5us9UC551hkB0ZPEfkkFTaeG1LE/uXpH1yIWd6GdO/ePdISGhoquiF6eHhQcXEx2SNjx441u4Pt2rVLV8769ev50rcjazxM4G0AxXZgbBSRV+4CcLNGG1Ok/IruCCciugOAdyvrvn37dH+/+OKLfMnLkJubi5ycHNH5bMGnn37KdwCJUebOnav7u3HjxnzJJT+AnDE2DcBCWDGInUK5YRYRKeEwFPR49ry+PXwZ9u7dq/vbHGNPRDh79qzofLagVq1aePPNNwWnDwsLQ1gYd1Tq3r17UVBQAAAGT7J6Bkl30TLGOgKYLWWZClw4kKpVq8qthliuAvhJbiUU7A+bG3sA+P33383KZwtmzJiBKlWqCEqrVqvxzz//4IcffkBAQAD++ecfAICnpydf8DepR/ZyHM5doXBxcUFUVBTee+89TJs2Df3794erqysyMspdyJuZpByIrmCI0j4dAFUBaMDjE7xx4wZpMWcVS/369cme4Ql5oCe///47EXErekqvymnSpImpfGkkoS8OXCA7uf3E5Urq1atHQ4YMoe+//56OHz9OiYmJ9OWXX1KjRo1k180C0R6QI7t/WBH7k7IfACf4GtWyZctIy1tvvWVWwzxz5gzZK+np6eTt7S3oOp5diaPlzTff5Mtbk6R6iNxru9yGxm7F29ubunbtSp988glt27aNHj58SEREycnJNH/+fIqKipJdRwnlBABfqdqWIhVHyn7Ard012aCGDBlCWjZu3GhWo/z444/JnpkxY4ag63BycqLMzMwy+X/++We+vN1IqocI7LYDI2MX4uDgQBERETRu3Dj66aef6MKFC3qrvzIzM2nFihUUExNDDg4OsutrJTkHwF+q9qVIxRBDZ9B2BhcG1yiBgYG4f/8+ACA1NRU1atTAs+XwERYWJiqOva1JTU1FcHAwcnNzedOuX78eAwYM0PssISEBLVq0MJXtQyL6j2VacjDGLgHgP0hAZlQqFVxcXKwirq6uqFWrFlq1aqV3ElpmZiYOHz6M+Ph4xMfH4+TJkzY5A8EOuAKgK3Gr7BQUDBp7FwDpANxMZbx48SIaNmwIAGjWrJluclIMe/bsQZcuXUTnE8uDBw+wf/9+HDhwAAcPHsSTJ0/g7OysMxTjxo3DhAkTyuSbMmUKvv32W97yhw4ditWrV+t9lp6eDl9fX1PZfiaiN0ReikEYYzkA3KUoy1xatGiB+fPnw9PT06AhdnFx0TvC0Vo8fPgQBw8eRHx8PA4ePIizZ89a7RD6csAtAF2I6LrciijIT5neR0RqxthhAF1NZdy7d6/O2L/44otmGfuFCxda3dgvWbIEb731lsk0R48eNWjsP/jgAyxevBhqtdpk/v3795f5rGrVqnBwcIBGozGWTZLll4yxapDZ0L/22mtYs2YNPDw8MG/ePKSnp0Oj0aC4uNjgv6a+syRNVlYWrl27JuetsDeCARxkjHUlootyK6MgM4Z8OwCmgccv2LdvX9IiIIa7Uf/qrVu3SEqK1foHi/z1119l6g0JCaEWLVpQ27ZtqWvXribnDyZMmCDoWkpHBNXCEwI6H4ADWeiHA9DcnHsvlbz//vt6sf0jIiLk9lcrUlYeAWhpaVtTpHyL4Q+5wy5MNiBfX1/dxFdaWprZcWWmT59OQsnMzKRDhw7R4sWLae7cuWW+f7JiPd2p1ZIKzl/SfZaRkUFeXl7Uq1cvWrJkCSUlJQmuj4goKSlJUNz7v/76q0xeAZFBww3dfzECoKccBsTR0ZF++OGHMtccExMjt2FTxLBkwEphOhQpH2L4Q26z1WO+BnT69GnS0rJlS7MaoZ+fH+Xn55MxMjMzacqUKRQSEqKXz8nJiTIyMoiIqDgvn1LfnkFJCKQkBNJt/2ZUcPGKrozCwkKj5QshNjaW9zrmzZtXJt+yZcv48vUX8pBMCYC3bG04qlatSnFxcXT9+nU6dOgQHTlyRHfNw4YNk9uoKWJcssFN2spueBSxvTy7gxYAQETFAPYZ+q40UuymffToETZs2GDwuzVr1iA8PBzz5s3DzZs39b4rLCzEjh07AAD5B4/jyaLluu80KY/waMhTP72lE4Nt2rThTXP+/PkynzVr1owvmxQ7aXljM0hNdnY2evTogfr16+Odd95BnTrc+eXHjx/Htm3bbK2OgnA8AMQxxnrKrYiC7TFo7EsQFTqhc+fOZiuhNdpaLl68iBdffBFDhw7FgwcP9L6rXbs2JkyYgLi4OPTq1QsA4BQeWqbMgoQLKLp9z2ydStO8eXPeNHfulF3hFhISwpetXBr7oiJuN37Pnj1x8OBB1KxZE/v370fXrl3LY3iByoYLgM2MsUFyK6JgY4wN+QGEgue10NPTU+ciycrKMvtM1/79+1Np+vXrVybN6NGj6ezZs2SQ4mK66VFf58bRStbiFQaTHz58mNasWWPSfVSahw8f8l5Do0aNyuQrKioixpipfNcsfTUDcMCce26pvPfee7qJ2e3bt5Orq6vcLgpFxIkGwChL258i5UdMfwnc5Gs0R48eJS1t2rQxq+HFxsZSaXbs2KH7rmbNmrRjxw7i416Ll8oY++RXXi+Tbu7cubqyo6KieMvVEhQUZPIaqlatajBf3bp1+Tqcu7H7L0QA3LClkXBwcKCFCxfqrm/Tpk3k5OQkt+FSxDwpBtDWkvanSPkRU24cgGcnLSCN3/7ZTS8xMTGoU6cOhg8fjvPnz6Nbt268ZRhy5eTvPQTK1Q/rXXrz07Fjx8rMBRiDz5WTkZFhcLdt69atTWVTAeANfm8MxhgDUMvc/GLx9PTEtm3b8PbbbwMAVq1ahYEDB1aWHakVEQZgntxKKNgGPmNvk5DHxI1QnyqlUuHw4cNYsWKF4Hjihow95auR99chvc+GDx+OTz75BN9++y0mTJggJPY8AGF+e20IidK0b9+eL5slfvsAAE4W5BdM7dq1cejQIXTv3h0At1ltxIgRpjaNKZQP2ij++0qCqWE/gBrgOebO1dVV5/vOyckx65X+tddeI7Fol11qyV7/Wxk3ThICKXX8h6LLNsS2bdt4r2P//v1l8h06dIgv37dk5msZgNZi77U58vzzz9P9+/d11zRnzhy53Q+KSCtJUA4qr/BicmRPRA8BmIyDkJ+fj6NHjwIA3N3dBS1TfBYxsUvy8vLQpUsX+Pj4oFOnTsjOzgYAOIUbPr8jN263YB20q0wM0a5dO3BeE+MYGtnXq1ePr2pLRvZWX4nTrVs3xMfHIzAwEADw2Wef4cMPP7R2tQq2JQTAe3IroWBd+Nw4gA1cOWKM/dq1a7F3714QEQ4cOIC1a9cCAJzC6gKqspejuZeMgoQLJsvMzs5G7969sXPnTqNpfHx8eM+WvXev7FJPPz8/k3lgx8Y+IiICGzduhLs7F3pnypQpmDVrljWrrDQ4ODjIrcKzzGCMVZdbCQXrIcTYW32SVoyxZ4whICAA0dHRCAoK0m2YYm6ucKxT02Ce1M1/aN0eZdizZw9atmyJbdu2Yf369Sbrjo6ONvm9oZG9o6MjatY0rFcJNRhjNUwWbByrGfuAgABs27YNVapUQXFxMcaPHy8oAqiCMBo0aCBkIGBLvAF8LrcSClaEz88DbtddAUz4/JycnCg7O5uIuOP5xK65fnadvbkkdxti0G8fH9KSQkNDafTo0TR9+nT69ttv6f/+7/+oRYsWenp4enpSXl6e0fJXr15t8jratWtnMN9rr73Gdw868z0HI89mg5j7LFTc3NzoxIkTRMSFmhg6dKjcPuUKKd988429HaBSCAniNSlinyLUqMTzNZTSa+FffPFFUY1s4sSJJAWPJ31q0NgnIZDCa9cRpMuvv/5qtPybN2/y5r9w4UKZfN988w1fvveEPAcDz+Wo1B2eMUYbN24kIiK1Wk29e/eWrFw7MGZ2JQMHDqSZM2fKrscz8rs5bVER+xchbhzAyn57f39/UemN4dSgvtHvXnbwMPpdaUy5coKDg3mXav7www9lPmvZsiVfteb67auZmc8oX375Jfr164fc3Fz07NkTW7dutbjM6Ohoe/RRy86mTZswaNAghIeHy6kGAfgZgPaAk56MMfPWUCvYNUKNvVX99gEBAbxpHjx4YHK1DAAUhBjfX9T55iNBusTFxSEnJ8fo93x++59//hn5+fl6n4WFGV4pVApzjX04gIbgQiZYzBtvvIEZM2bgyZMn6NatG/7880+LylOpVPj8889x9+5d3mdXGdFoNFiwYAGWLVvGu9JLCFWqVDEnGwPwGxGFgpsDGgagkcXKKNgfQob/4E60yoKJ1z+VSkXp6elERFRQUEDu7u6CXx1///134uPgwYMUExNDd+7cKfNdamoq/e9//6PQunXpKjPsxrmBQAp0ryJIn7Vr1xrVY9GiRbz5x44dq5dHrVbz5clGyRGR5giAmULvtTGJjo4mtVpNjx8/psjISIvdAW5ubrR582Yh8xWVWlxdXSk5OZnefPNNScrq0qWLOXnjrOE2UMS+RHhCYBtfo9myZQtpEXOIxfHjx4mPpKQkArhDM3r37k1TpkyhTz/9lDp16qQ3ybWlbgujfvs3HDxN6uHi4kIAqHfv3kb1OHfunKBrGjduHKnVal0+Pz8/vjz1zX6IQA9LjES9evXo0aNHlJycTE2bNrXY6Hh7e9ORI0do3rx5VjGQFU0++ugjun79uiRldezYkfr27Ss2XxGAQLmNkSLWFeEJuU0XJhvNO++8Q1r+/e9/C25sQo4mLCgoEHQa1rTW7Y0a+9XwLZO+dJm1atUigDP6mZmZBvXQaDTk61u2HEMyZswYXT4BP369zX6IQE1zjUPVqlUpMTGRbt++zXeMouDyTpw4QdeuXSM3NzfJDGJFFm9vb0pLS9MNNiyVRYsWiV4kAWCq3MZIEeuKUJ89YCW/vYODgyCfvZOTE2rU4F+OfjDrsdHv2sAFXioHXXkAt+vX1dUVAJCSkoKIiAio1WqjE5MqlQqxsbG8egDAkSNHdH+HhpaN3fMMZh9ATkT3wJ0zKgpHR0ds3LgRTk5OaN++Pa5cuYIaNWrAx8fHLD18fHywZ88eREZGYty4ccjLy+PPpIDMzEz8+OOPqF/f+AIDMXzyySdYunQpWrRoISbbSEkqV7BfxPwyAHgAnhFCSkoKEXHrsz09TbtNAFBERAQJRYgv2cHBgU7D3+jovje40SZjjKpWrUoAqGHDhrr8PXr0IAD0yiuvGNXjwIEDgkZLzs7Ounj/8+fP50u/3pJfbQC7hOhUWpYuXUpERPHx8XTq1CnKysqiwsJCqlmzpujRpIuLi25tvoDjGBV5RgIDA6l79+6SlTds2DC6d+8eBQYGisnXxpYjTUVsK2JG9oCA0f2+ffsAcKNGAREf+UIA61GrlvHVNtrVDBqNBvsDvY2miwE3iicieHl5AdAPaaDRaBAYGIjdu3fj8WPDbwnt27dHcHAwr74FBQW4fp1b0fb888/zJbf01KozYhJPmjQJ48ePB8BdT8uWLeHp6YmNGzcaDPvAx7x58xAZGYnk5GR88MEHovNXdh48eICTJ09KVt7q1avx4MEDbN68Gc7OzkKzKaP7CoxYYy/5UYVijL12jbuqVAwc7XIzX1/fp0q6kNEyOsIFLuB+GDw9PQFwHa1pU87W7tu3D4MGDUJhYSE+/vhjg2UwxjB8+HBefV1dXXUhmgWstX+OMebCW6hxBBv7Hj16YO7cuQCgCySnxZyQCAMGDMBbb3Fn/k6cOFE5mtBMHj0S7YkzChHh/fffR1RUFJYsWSI02yDGmKtkSijYF2JeA8CtwzX5KhgaGkpaTp06ZTItY4xu375NRNzySUPLKkujDa1bemVLSEgIAaAGDRroPnN3caFEBBh15QwEtyy0du3auhOoxo8fr8s/d+5ccnBwIMYYHThwwKAuGRkZVL16dd5X41WrVunyaN1GJqS5ua9oAJ7j0wUANW3alPbu3UszZ86kiIgImj9/vk6/w4cPm+UySEhIICKiY8eOye4OUURftCvk3n77baF5BtvCpaCI7UV8BuAyX4PRGnCNRkM+Pj5G03Xu3JmIiFauXEnVq1enM2fOkCl++eUXAkDPPfecLm5+q1atCAA1adKEvL29dWX/CB+jxv5P+BErSffSSy8RAJo8eTJ5eHgQABowYAD16dOHAO5HxNhZtQL88PT660+PRmzfvj1f+mFmP0huc8wTPn1Kr/ioUqWK3qojQ2f/8knVqlV1Z9F+8sknshs3RfQlLCyMCgoKKC8vj+rVqyckz59yGyVFrCNi3TiACFeOSqVChw4djKZr06YNOnfujOHDhyM1NZXXD6512WRlZel2pVavzkVlvXr1Kl544QVd2r+8jB/gFAZHdATnMdG6cvbs2YNBg7gDe7Zv344vvvgCXl5euHz5Mv71r38ZLGfChAlo1qyZSZ0TExN1f3fs2NFkWljgtyciApDAl06tVuv+HjZsmG7e4tatW9iyZYvoetu2batzq+3YsUN0fgXrcvXqVSxevBiurq6YP3++kCxdGGNWPydBwfZY1dgDpv32s2fP1k3oenp68i758/Dg4ts8fvwYDRs21OVzdnaGWq3Wm8DdXfAEpgInjwFXVn5ODqpVq4Z//vlHp2t2djZmz56NpUuXAgDmzJmDc+fOlSnDyckJv//+u8kloZcuXdKOvIUsMTV7+WUJoiZptWfJAsCCBQvMOmJQ+wObkpKC06dPi86vYH1mzZqF9PR0vPrqq+jZsydfchWAN2ygloKNMcfY7wNM2lHB6+21RhCAoDXG2kM0CgsLdZO1KSkpukNFtKN8AHicn4fTKDBaVju4oBGccHD/AQwePBgAcPr0ad1KkjVr1uDy5csYO3YsCgsLMWbMGINx94ODg7FlyxbdWv1nycnJwZ07dwBY/dQqQISx79Spk+6+ZWdnY9myZWZVqI3Vf+DAAb3nqWA/pKWlYeXKlQCA6dOnC8kywpr6KMiDaGNPRBkATplKc/fuXVy9ehUA0KRJEz0jbAxT7h4tWmMPQDeavnPnju4wcEdHR70Dyv+AfkCyZxkLDzxR5+PWlato164d5s6dC39/f/Tr1w8A8MUXX6B169Zo2LAh/v77b6xatcpgOW3btsX+/fuNRu+8ePEiAKBRI974UrUYY+btaOIQbOxLj+p/+uknZGZmmlWh9jmcOSPqpULBxvz1F7dqmu+0tRJCGWP866YVyhXmjOwBEa4cxhg6derEW2BMTAxvGq0bB3gaFvnevXuIiIgAwPnHS6/t/81BjUIYH232gBsC4IBtf+5Chw4dUK1aNUydOhWRkZE698T06dN1vvxFixYZLatNmzY4ceKEQR++1m9fp04dvWswgiWunLMAlvMlqlmzJnr37g2AOyVMoC/XINrnkJDAO12gICMHDhxAUVERvLy8EBQUJCTLCCurpGBjrG7sAf7QCU5OTkImL/VG9tqJxYKCAt1h2ImJiWjXrp0uTbqmCHughjEcAYwAV+a38+ZhypQpYIxh2rRpGDJkCAAg3H5yLgAAIABJREFUNTUVhYWFAICTJ0/i77//NlpenTp1cPjw4TJ+Ua2xZ4wJiV1u6STtWACbTKUbP3687jjHbdu26TZ+mYN2ZK8Ye/vmyZMnuk1bderUEZJlAGNM2CEQCuUCc439YQAmA5/s27dP58Pl21zVoUMHQbG4Sxt7R0dH3a5Zbd4bN26UiUGzAbkmyxwMd3iCIV+txurVq3W7Sg8ePKgbAV29elVXN98GlSpVqmDr1q348MMPdZ+VXpGj3bxlAov89kSkATAUgMHT052dnTFu3Djd/1t6rqyPjw9SUlKQnJxsUTkK1kfrynFxEbR3rwqAftbUR8G2mGXsiUgNzuAb5dGjRzh//jwAIDw83ORKlEmTJgmqt/QPglqt1v2/9t/8/PwyE6UHoUYyjK8y8YIKb4PLn5iYCCcnJ4SEhCAuLk7nktm+fbsuqNS6deuQnp5uUk+VSoWvv/4aK1asgLOzs85nD3AHTfNg6SQtiKgAQF8AB5/9LjY2Vud6OXPmDA4csOzcExcXF4MrlRTsD+3btkBjDyjhEyoU5o7sAYlcOc2aNUOPHj0EVejo6KhbF5+bm6ubjFWr1bpwCc+uCNEA+NX0SwhGwAM1wUXDXL58OVq0aIHc3FxdbJwnT57gyZMnAIC8vDysWLFCkL7Dhw/Hn3/+ifz8fDx8+BAAdEtGTWDp8ksAABHlgYtzrzeZPnHiRN3f3333ncX1ODs748qVK4LSCliNpGBFjhw5gvz8fDGxcjowxpSHVkGQ3djPmDFDVKXVqnHHrubm5sLbmwt4lpGRoVtjn5KSohfYDAA28hh7FzBMBfcjkp2drXO7aJdMAsD9+/d1fy9dulTwMsOOHTtiy5YtuHz5MgBBK3K8pdrUQkRZALoBuAgALVq0QNu2bQEAycnJWLdunUXla0eIQox9+/btERUVZVF9CpaRn5+PkydPilkiywAMt6JKCjbEEmN/BkCaqQTx8fG6jTqGjH1YWBiioqIQFxcnePemdgRfemSfnp6uM/bXr18vs2b/FopwwsSaewB4DW5oAW7XrdYwp6Sk6L4vHQHzypUrRiNiaklPT9ety4+JidHpV69ePSGv0Ra7crQQUSqAlxwdHe+UXm65ePFiFBSYvid8iDH2s2fP1t1XBfk4c+aMyTOWDTCcSXFAroLsmG3siagY3AYro2RkZOjWX4eGhuo2Qmm5fv06QkJC0LNnT723AFOUNvaGRvbXrl0zuEHrZ56JWgZgI6pjBXzRg1zhAqY3Air9t7Ozs+4NwxhpaWlo1qwZNm/eDCJC3bp1AXCHtTz33HN8lymZsQcAIrofGhr60pAhQ54A3AhPuzvYErTuAD5jX6dOHURFReHSpUsW16lgGadPny4T6ZSHYADCTiJSsGssGdkDFrpySu9IHTZsmKAK+Yz9+fPnDS7j3IE83C+ZqNWUyLM4gAuBPB9VcQI1MBFV4I6yg5qgoCDwDXbq168PFxcXxMbGIjIyEidOnNB9J8CVI6mxB4DExMTLbm5ucwEu1rkU4XRTU1Nx9OhR3Lp1y2S6AQMG4M6dO2JHlApW4MyZM2KNPaBM1FYIZDX2WhwcHIQc7gFA32df2o2jXTmTmJgINzc3vZj3AGfcpyETI5GGZkjGc3iA6chEnpFNV15Q4X14Yj9q4BXor/DhG9VrGTBgAADg1KlT6Nu3r+5zAbHtJTf2JcwloodSTMxqGTVqFG9MnYEDB+otP1WQj4sXL/K6IA0QyxjzsoY+CrbDImNPRNcAmBzWHTp0SLcpyZix9/f3h4ODg6A6tSP7rKwshISEAODWD3ft2lVn/H/88UeDk4GHoMZ+qOEFFZbAB/+GN9wMjNxL4wcV5sNHz+AnJCTg9u3bvLr2799f9wZw7949ZGVlARC0/DKcMebIW4F4svv163f8woULkhXI55oJCQlBq1at9JafKshHYWGhOW91bgAGWkEdBRti6cge4DmqMCcnB8ePHwfABQ0ztPxOG0xLCFpjv3XrVrz22mtwc3PD1atXsW7dOt1B4PHx8QZH3ypwyyz3wE93PKEh0lGMw1DjQYmzxwHA9/CBb8nt0mg0gnze9erV043ugaeGUcDh487gDiORFMZY2y1btrwidbmmaNWqFQAoI/vyzwi5FVCwDCmMvcWuHIGxOgBAN2LPysrC8uXLdb7+WbNm6Yw9AN2GLi2N4YStqI7P4AUPE6P5kyhAd6TidaShDx4jtSTApyOA+ng62F62bJlebHhjfPXVV3By4lb5aEe3YWFhunAFJpDUlVMSYG0tEQl7hZIIbeAtxdiXe9oyxnhfSRXsF6lG9iYX7vIZe60xFELbtm11IQcWLFiAQYMGgTGG27dv4/Lly7ofjqSkJJ0LJQrO2IJqaArT9WxFHgbjMWpAhcnwxH/grRvNA0C1Un8/evQI69ev59W3fv36mDBhAoCnBs/Z2VnI6F5qv/1PAAQFRZESrbFX3DgVAsNhXRXKBRYbeyJ6COAfU2mOHTuGvDxuY5MhY19UVCSqTq3xzM3NxZYtW9CtWzcA3Fru0hOhRARvqPBf+MCJxzd/GxosQTZWoRp+R3W8iypoDxe9G/QPCvXyLFy4UJC+M2fOhLe3t97oVsBOWsmMPWNsMIDeUpUnhiZNmiA/P583xISC3fMYPCFSFOwbKUb2AI/fXq1W4/Bhrp0EBQWVWWeuncAVyuuvv64LFfzf//4XQ4cOhaOjI1JSUrBr1y69lTj94Qavksu8Bw3eQwbeQjpmIBMbkYv8kpeSKmD4DdXxAgxvJU+GBveeWbD5999/C4oY6efnh6VLl+oZe1stvyzZEPOxFGWZg7e3t3KoScUgriTInkI5RSpjb9FRhWKNvZeXl85XX1BQgPfff18Xn/3q1at66/cH4GmkzK/xBHtKDjSpC0c8AeEauLcKX6jgamL0vxBl1yY3a9ZM0AlbADBo0CB06tRJ5+cXYOxDGGP8oUD56Q1A0IkV1uDgwYOKsa8YbJVbAQXLkMrYxwMwabFN+e3FGnuAc9loDa12RP9sgCc/qBBWalL1DbjjBPyxGD4YCw+Mggea8PjxAeAsCrHWwA7cadOmidL5+++/121AEuDGYZAmKJpso3qAe+6KsS/35AH4U24lFCxDEmNPRNkAjplKc/LkSd0682dPrhLrswc498CmTZt0IY2fPHlSJtZLG+jHoGkFZ5MrcQzxt1Mxxnvklzl0t27duhg4UNzSY3d3d93EbHh4eJmNXwawyNgzxroBELZbzUooxr5CsJuITMcbUbB7pBrZAzyuHI1Gg/j4eADc6Ualz8LMzzd9VqwxmjdvbvKowGsoMhHJ3jQPWDEWNqmJIcWPkZJT1oUzdepUwRvBdu3apXMtaQ28m5ubblOYCSz128s6qge4WEXKSpxyj+LCqQBIaexNTtICxl05fLFVTDFq1CiMGjXK4HeXUIifITwey0MUYyVyMLBqIdrhIeaeP4kiTdm3jpo1a2LkSOHhQl5++eUyo/hbt27xhhmABcaeMdYOQLS5+aVk5cqVcqugYD7FAOLkVkJBAohIEgG37ygL3Jp7gxIREUFaNm/erPddRkYGmUteXh41b97cYJ3uYDQVnnQBAZSEwDJyCv70JbwpCs6kAjOqOwByd3en6dOnU3p6utm63rhxg4YPH06Mma6rRB6JeQak/zx+FlC+TcTX11d2HRQxW+LNbYOK2JdIWxiwzVTDYYxRamoqERE9fvxYz+D9/fffZAnXrl0jb29v4wYHKhoAd5oBL/offGk2vCkaLuQgoME7OjrS+PHj6f79+2brl5KSQm+99RY5OTmJ7WwBYp4Bcc/BF9ykmtyGQpHyL++LbX+K2KdIWxjwHl/j2bRpE2kpPRr/5ZdfyFK2bNkiaUNXqVQ0cOBAunLlitk6FRQU0Pfff08eHh7m6JAJoAFZ4TkooohAqS+2/SlinyKlzx6wwG9/9epViyvv3bs3pk6danE5rq6uGD9+PBITE7Fu3TqEhYWJLqO4uBhr165FQEAA3nvvPXNiua8DEE5E5hzvNM6MPAoKz3KeiPh3DSqUD6T+9QDwACZGCuHh4aRl27Ztus+7dOlCUlBYWEjTpk2j6tWrix7FVKtWjT799FNKSUkxu/7i4mLauXMn1axZ09yR1GUAXcn8+x9tZr0VVkJDQ2XXoZzKl+a2Q0XsT6QvEFjN14ju3btHREQZGRnk4OBAAMjJycmiSdpnUavVtGbNGurXrx8FBAQY1aV69eo0cuRI+u233ygvL8+iOo8fP04NGzY0t2PlAZgJwIUsu/8mJ2bNdCeVa3n//fdl16GcSitL2qIi9iXSF8jFvTbZiFavXk1aIiMjdZ+vXbuWrMX169cpLi6O1q9fTz/99BMtXLiQDhw4QEVFRRaXfenSJXrhhRcs6VQ7IIFvFAImZjt06CC3AbG5HDhwQHYdyqHcAcAsbZOK2I9IXyBQm68hjRo1irR8+OGHus8HDRpE5Ym7d+9Sjx49LOlQdwH0I+nuPe/E7NSpU+U2IjaXvLw8k293ihiURVK1S0XsQ6SeoAUR3QFwxVQaY5O0O3bsMCtOjq1JT0/HqFGjUKtWLcTFmbXfpAjAPHATsJskVI13YrZ169YSVmf/ODo6wtXVtUzwPQVelF2zFQzJjX0JJkMn3Lx5E0lJSQCA9u3b6w4vyczMxKZNUto+acnJycG0adPg5+eH5cuXm1vMEQDPE9H7xMUUkgTGWDQAk6E0XV1ddQezVxbc3NwAAK+++qrMmpQrMgHsl1sJBWmRxdgDT0f3Hh4eiIyM1H0+d+5cK6lkPgUFBfjmm29QvXp1zJkzR0iYA0M8BjAWQDQRnZNWQwDAeL4E/v7+qFWrlhWqtl+0z6pnz55wcXHhSV154DkpbTsR2f8rtoIorGXs9wFlAkXqYcyVc+rUKezfv99KaolDo9FgxYoVqFGjBqZOnWpuwDYCdyRgOBEtoxLnupQwxmoA6MeXLj09He7u7vDx8ZFaBbtF6xb09PTUnWimALzxxhumvlZcOBURa00GADgBExNAgYGBpGXPnj163/Xo0YPkpLi4mLZt20b+/v6WTnKdA9COrDzxAuA/QnVKTU2lJk2ayD35Z1PRsnr1atl1sQdxc3OjS5cuGfteDcDT2m1WEdvL05M9pGcPgEhjXyYnJyMxMRENGzZE27Zt8fnnn8PX1xc+Pj7w9fVFbm4u3N3djWW3GkeOHMEbb7wh6LhBE+QA+BzAd0QkPli/CBhjfgDeEpo+KSkJtWrVwvnz562olX1RWFgIJycnnStHe1pYZcXDwwMNGjRA7dq1cefOnWe/PkpET+TQS8G6WNvYTzf2JRFh7969aNiwIdzc3PDZZ59ZUZWydRcWFkKtViM3NxfZ2dm4d+8epkyZglOnTlla/GYAk4hblWQLpgIQ/KuYlJSEmjVrSqqAj4+PXR8ofuvWLYSGhsLLywsxMTHYtm2b3CrJivb85kaNGhky9srERgXFmsb+MIB8AK7GEuzduxdvv/222RUUFRWhoKAAeXl5yM7OxpMnT5Ceno60tDQ8evQIKSkpuH//Pu7cuYO7d+8iNTUV6enpyM6WbBFMaZIATCSi7dYo3BBiR/XA05G9lIwcORLz588368QxW3D69GndhGT//v3t1tgPGzYMa9eutfp9LG3sd+3a9ezX0o4EFOwGqxl7IlIzxg4B6Goszf79+5GXl4eMjAydkdb+m5aWhuzsbLi5uSE5ORn37t3D7du38ejRI6SlpSEjI8PcVTFSUwDOZ/4VEeXZuO4PAHiIyZCUlITnn5f2pEJ/f3/ExsZi/fr1kpYrFadPn8aAAQMAAH369EGtWrVw9+5dmbUqS2RkJBo2bIgZM2ZYtZ4qVbhz7I2cgxzAGGNE3GSQQgXCmhMCAKbBDiakrCh/wYwQxBLd2+oAssXqHBMTQ9u3b5f0PkyaNImOHj0q97MwKuHh4ZSbm0taSgfgsyf59ttvSaPRUKtWraxaj3anelxcnLE0NeSeTFREerHW0kstvOvtyynJAIYSURcyLwSxFIge1QP6bpyQkBCTZ/gK5f79+4iKikJUVJTFZVmDS5cuYeLEibr/79GjBwYPHiyjRobRaDRQqVSYNWuWVetp1Ijbe/ftt98aSxJkVQUU5MGavyTg1vE/hh2MmiQSDYCFALzl/IUGN6p/Ys41ODs706NHj8jLy4vOnz9PhYWF1LRpU4vui7e3N924cYPWrVsn9/MxKcuXLyctDx8+NCsMtjXl66+/1ulnYWA9k7Jx40b67bffTKV5Ve5RqI37UxUAzQD0BjAFXB/fDm75+BkAF8CFgEkCF8/qIYB0cG/WqQBOAtgE4BsAEwG8CqAxAA+5r03vOm1wIzfJ3Ykkkr/BhTmQ/6EBSy25ljt37tDu3btpx44dtGHDBtq4caPF9ycyMpJycnKodu3aBr/38fGR+/mRm5sbnTt3jrRIcd1SyldffaXT7c8//7RaPfHx8RQcHGwqzVi527iV+08ggFEAfgWQYuXn+rCknhEA/GS9bhvc2AlydyIJJA+As9yNtOR+Pg/uDcOizl5YWEiNGjWinj17UnFxsSQbrSZNmkRff/21we969epl8RuEFBIaGkp3794lLRMnTpRdJ63MmjVLp9eNGzesUodKpaJOnTrxpftM7nZuhX4TCeBLAKfB7e6X4xlrwMXGGg/Azeb3wAY3OVTuTiSRtLGDBssAHLX0WlauXEkLFiwggDtM/eHDh5KNcmfNmmXwgJRu3brZzUg6JCSErl69SkTcITelz1SQUz777DPSsm/fPlvXnw0uGisB+K/cbV3CPtMdQLzcz9aAPAIwC0CAre6FNdfZAwCI6BpjbDM4v1ghuAZV+Iw8+5mQNJaUpQFwFYCYIDFdABwXfwcshzHWEEBHAK8AsHgW9NSpU1i9ejUAbq/CunXrMHHiRDRp0sTinbWfffYZ/Pz8ypy5e/PmTcTGxkpSh6XcvHkT7du3x65du9CsWTNs2LABLVu2lH1jWOn19bdu3bJ19ffAGZ+VKOdr7RljKgD9AXwEoLnM6hijOriT6T5kjH0H4Auy9tJtuX95ZfzF3wBxv8R/2VC3EABvl+gouU/R0dFR7/9btWpFREQbNmyw2kjGycmJCgsLrVqHWPHx8aGjR48SEfFNWNpEPvroI9Lyxhtv2Lr+eyVtbyiAv+Xunxb0nToADsn9LM2QGwC6WfXeyP1wZGwUo0U+jDwArlbUJwRc6AOTAeSsJYmJiZL57o3J5cuXqbi4mBo3bix3x9KJh4cH/fnnn0RENH36dFl1mTp1KhERFRQUWDyh7eXlJTZPZqm2GCN3/zSzD/UDt0pG9nZlgawDUNXAtflYfH/kfkAyNoxaZjyI9hLrEAIZDXxpmTFjBhFZd3Tfq1cv0mg0tH79erk7lJ44OTnR4sWLSaPR0KuvviqbHpMnTyYiop07d1pcVsuWLalu3bpi8hTJ3Sct6EcMwCK525GEkohSZ1KDm3dYaPF9kvtBydxILgh9AN26dbtbWFi46+OPP65rYZ0hsBMDX1rq1KlDxcXFVh/dT5kyxe5G91oZN24cPXr0iMLDw2Wp/9133yUiolGjRllcVoMGDfTOdxYoVntztXI/FhziuxxJKoCOJdd3AFzo6RCL7pPcD0rmRjJPyI0fOnQoFRUV0eXLl8nT0/MRgBdF1hMCOzTwz8q+ffuIyLqjewC0ZMkSu92AFR0dTQcPHqSqVavavO63336bsrKyDK5mEiu1atWikydPis1XTe4+aUYfflfuNmNFKYC+jVpu0b2S+2HJ3FBeNnajVSoVRUVF0Zw5c6ioqIiIyvh0twLoBANLpwA4AGgFbnVDgh00GkEycuRIIiKrj7xVKhUtWbKEGjVqJPs1G5LatWvTV199RSqVyqb1jh8/npYsWSLZNRARBQUFickXLHefFNl/W8PCPSflTIrAnXinGHszGosbuIlXAkBeXl4F/fr1oxUrVtDDhw9Jy507d+iTTz4xNemVBeAUgD/BbasusIOGIVo8PT11AcNs4Vdv3ry57NdsTNzc3Khly5Y2rXPMmDGS3ZOwsDAiIho8eLCYfI3l7pMi+2+cjZ6NBsB1cCfPnQJwDMBBcGESMmzcNjeYfb/kfmByy8SJE3/ZsGFDyq1bt6g0+fn59Mcff1CfPn3IwcHBpp1eTlmzZg0RSTe6r1WrluzXVF5Eyreppk2bEhHR0qVLxeRrLXd/FGy4gBZWeg654Nyt/wXwJrh9Le48ulQH0AbA6wCWA0izYjspBtDcrHsm90OzA/mLSrh//z79/PPP1K9fP6pSpYrsnV8OiYqKuqi9H1KM7keMGCH7NVVGiYyMJCKiw4cPi8nX2Q76o1Bj/4FE9+oJgJ/A7S9oBMBBAt2cwK2g+R+ssxQ0ziy95H5oMjYWdwCvxMbG7u3RowcFBgbK3kHtQLIBNCGib4iINBqNRaNNBwcHWrVqldzXVCmlQ4cORER08eJFMfl6yt0vRfRfS1bgaMCFXx8GnlG7BHr6gHtLkDoeT1vRusj90GRoJAzcYeC5cndIO5R+JfdJRUR/EJFFq2bq1q1Lx48fl/uaKqyY+iHW7sa9cuWKmDIHy90/RfTjOWbcs6sAZgCoLYO+UZB2scY+0TrI/dBkuOmvyN1J7VS+Kn2fGjRo8HJiYmKmRqMxe9VMQEAAPXjwQO7rqrBy7NgxcnJyMvjd6dOniYjo008/FVNmuQltDCAcwkfL18D501Uy6+wA7vQ+qVYQvSSqfrkfmgw3fIXcndQOZaO2IwAYCeAyAOrVq5eGyLLR/e7duyvt/Ic1pUuXLkREBjfAhYaGEhFRXl4e+fn5iSl3ktz9U2Rf/oHneu4AGAfAUW5dn9F7CLiAjJa2g+Oi6pX7wmW40dfl7qh2JpvBHTzvD2Bb6e8YY5SQkECWjO5Hjhxp1R25lVXi4uKIiCgqKqrMd9OnTycioo8++khsuZ/I3T/N6M8zUXaEnwJgEux4RzC406ykcCX3Elyn3Bctw022612sNpat4FYO1AUX4rZMmj59+hARN7p3cHCgbt260S+//ELx8fFGXQilxdvbm2JiYuS+zgol4eHhVFxcTERk8CCSM2fO0JEjR8xZMjxb7v5pZp/uC+70tqXgdqrb1XGAJvTuACDTwvbwDwS6p2S/YBlu8G9yd1Y7kQ3gDL0/OJ+mwXSMMTp79ixpNBpKTk6m0nz11VeC6lLW2ksnXl5elJCQQEREubm51LBhQ73vGzduTE+ePKGwsDBzyl8gd/+sbAJup322he1iCLj5gNEw8XYm+8XKcHOXyN1h7UD+BW5VkjcErBCIjY0lLWlpaTRv3jzKz88njUZD0dHRcl9LpRFnZ2fas2cPEXH++JdeeqlMmgULFlC/fv3MrWO53P2zMgq4NxNLlmbeBHC+5O81RuuR+0JluLEz5e60MkoegCGl7sUWIfkYY3T69GlauHAhVatWjQBQTEwM5eTkUFJSkjmx0xURKYwx+uWXX4iIaP/+/QbnUKpUqUIzZsywpB6zt+IrYjd2abvROuS+SBlu6mtyd1yZ5AFKnaML4B0x+Z2dnct81qFDB8rKyqKVK1fKfW0VXubMmUPXrl2jYcOGGU1Tr149S4O3GTUUitjENq2ToK0cMVq+3Bcoww31l7vjyiBnUGojCbi4IvlSlN2mTRtKT0+n/v37i8rn5uYm9z0pN9KlSxcaMmSItWM0ZaEcrbOviAIuMOPfFj7HC0bLl/sCZbqpSXJ3YBvKZpRanQDAE1xkTsnqaN68OV26dIlq1qwpOE+1atXMnURURFopBhe8q0yobkVksU01wR1cYu7zvGesbBUqJ4flVsAGZAAYTUR9iSin1OefAgiTsqKEhAT07dsX//73v8EYE5Tn8ePHiImJkVINBfEcBxBFRCOJKFluZRQAIroHYLIFRVQ1VXilEwDRkH9EZS0pAuf7CzRw3X6wfJmXUQkNDaW+ffsKTt+5c2caOnSo3PerUsrrr79+HwCTuy8qYtRG7bDg+ToZKpOVFFzpYIwdAfCCFGXVrl376p07d74FF9faz4BUB7em3ZrcBBeq9X9EdN9QAsbY1wA+tKYS/v7+yMrKQl5eHm9axhj279+Pnj17Iisry5pqKZSiffv22L59e0aVKlV85NZFwTCMsWBwyymrmJE9kAy8qVVmY98b3NJDs6lSpQq+/vprvPnmm5sYY/156qsK4z8EHuAmZ9xL/i0tpT8rAOfP08o1cBM6fxP3+meq/urgfhA8zLlWazFlyhTUqVMHkyZNkluVSkFQUBBOnz6NmTNnpvz444/1Sd/Fp2BHMMbeATDfjKxvEtHSMp/K/boi42sSA/ALzHxV6tatG2lPt7p+/fotSHDogZWvd4y512pNqVatGmVnZ1NERITsulQkqVu3Lrm7u+t95uzsTEeOHKF9+/YRY4wAhMrdLhUx2WdV4OYXxT7/BIPlyX1BMt9MBu5QcME3Mjo6mnbv3k1E3OEe3333HTk6OuYD6CT39fBc67/lNkDGZNWqVXTo0CGtASIA5OLiIrte5VWcnJzoxIkTNHnyZL3PlyxZQpmZmRQcHKz9rL3c7VIR3n7bENw8nNh20KZMWXJfjD0IgD7gDhM22nleeuklnZEnIjpz5gy1bt26dLqFcl8HzzWul9sIGZO2bdsSEekdYXjq1CkaO3as3g+AIsJk9uzZRET04MEDcnV1JYCLPkpENHz48NJpB8jdLhUR1HdXmdEOlpcpR+4LsScBF3Z0XXR09P1evXrR6NGjaePGjZSZmUlazp07R7GxsYaM0D3Y8eoGWL5Zw6py7tw5evjwIfn4+JC7u7suqmN8fHyZYF+KGJeuXbvq7l1+fj69++679Pzzz1NeXh5t3rz52fTlKn59ZRVwB7WIPfAkF0BVvXLkvhA7lXfpGUwY+dLSzg50N9ZgHsttiEzJW2+9RUREixcvplatWukF5X2OAAAaaElEQVTde7VaTZ9//rni2uERPz8/un//PhER/ec//6F+/frRvXv36ObNm5ScnEzVq1d/Ns/XcrdLRQT3X3NCKbyrV4bcF2GPEhkZ2aJatWqpzz//fOHLL79MXbt2FepOmCe37kYairfchohPvLy8KDs7mzQaDS1YsIC05Obm6v5OTEykDh06yK6rvYr2QJMffvhB99ny5cuJiKhHjx6G8qySu20qIrgPN4X4yJh6oRNkvwh7FHCz4OlmdLhbcutu5HrKRTygH374gZ6lT58+tGjRItJoNEREVFxcTD/++CP5+PhIWrc2mmd5lXff5V5G169frxcMzdPTkz7++GNj+fbI3TYVEdWPN5vRNlrp8st9AfYqeOaIPhESKbfuBq7FRW5jJETCwsIoKSmJSjN48GACQK1ataKTJ0/qPk9OTqZBgwZJVnerVq2oS5cust8DcyQiIoLy8/Np+/btgk4PKyVGg2YpYn8CoKUZ7eNTXX65L8BeBdzxZuZ0vi/k1t3I9UgS5dLa4uPjQ7/99htpKb18UKVS0dtvv00ZGRm677dv3156KSGvODs7GwzAplKp6OzZs1S1alXZ74EYcXd3p4sXL1J8fLw5kUTT5G6Xiojux3+JfMbHtHkrayA0IRwUkfYSgDkA2gH4wjrqWEyG3AoIIT09Hb169cIHH3yA4uJiBAYG6r4rLi7GokWL0KBBA/zyyy8AgO7du+PChQv46KOPUKUK/87ygoICeHt7Y/Xq1ejevbsucFtxcTGuXbuGRYsWWefCrEDbtm3x+++/Iy8vDz169BAUouIZfBhjrtbQTcFqbBKZPpIx5gcAsv9S2auAi2WTA8O/lkUA4gF8ACBMbl0FXs8lI9dil6Jdfrlq1SqjaV588UVKTEwkLWlpafTFF18I8r8HBwfThQsX6MKFCzRmzBhycXGhCRMmEBHRgAEDZL9+Y+Lg4ED9+/enffv20eXLl2nr1q3k5+dnSZl15W6biojqx4EQP1H7OhEpxp7nxu4pdcOyAfwKYDiA6nLrZsa1HJPbUImRiIgIIiJatmyZyXTOzs40Y8YMvVU72dnZ1LhxY946PD09datVUlJSdH8/fvyYgoKCZL8HhqRmzZoUFBQk5WaztnK3TUVE9+UjIp/xWiJSjD3PTZ0IYCmAVwC4yK2PhdeyU25DJUYGDBhARFRmy78xCQkJoW3btpGW1atXC64rNjaWUlNTqTQ7d+6U/R7YSPrJ3TYVEd2XPxD5jB8TVeIQx5UNxth6AAPk1kMoM2fOxKxZsxATE4Pdu3cLzvfOO+9g/vz50Gg0aNCgAa5fvy4oX1BQEJYvX653oEpqaiqSkpKQlJSEmzdv6v1769Yt5Ofni74uO+RdIlogtxIKwmGM1QcX8VYMQbL/Silis9HAfyHBSFDk0j6z5ZdffiEiosDAQNF5v/76ayIi+u9//ysqH2OM+vfvTwsXLqQTJ06QWq0mYxQXF9P9+/fpyJEjtGbNGpo+fToFBATIPUo3R/5P7rapiFn9+azI59xRGdlXEhhj/wbwkaXlNGjQAH5+fjh06JAEWhnn5MmTqFu3LqpVqyY6L2MMa9euRZ8+fVCvXj3cu2cy1L9RXFxcEBERgdatW+O5556Dq6sr3Nzc4OrqqpNbt25h69at2LNnT3kd6a8kohFyK6EgDsbYvwB8IiLLWNl/oRSx2UjgDUg0GoyPjxd1uLg5kpWVRfHx8Wbnd3Fxofj4eJo3b57cI2d7l11yt01FzOrPg0U+56+VdfaVh3+kKmjnzp349ddf4eLiIlWRegQFBcHT0xPnz583uwy1Wo3evXujY8eOqF69uoTaVTgC+ZMo2CFJItM/pxj7ysNFcGFSLWbOnDkoKirC4sWLpSiuDA0aNAAAi4w9AKSlpaFfv34YNGiQFGpVVILkVkDBLMQa+1DF2FcSiEgN4IoUZRUVFWHw4MHo1asX3nzzTSmK1ENr7C9cuGBxWUlJSdi1axccHR0tLquC4ssYc5ZbCQVxEFEKuJj1QvFUjH3lQjJXzp07dzBixAh89913iI6OlqpYAE+N/blz5yQp7+rVqygqKpKkrAoIAxAgtxIKZnFTRFqVYuwrF9JYzxLi4uIwf/58bNq0CTVr1pSs3AYNGiApKQnp6emSlalgEsWVUz65ISItU4x95UKykb2WGTNmICkpCZs3b5ZswjYgIABnzpyRpCwFQSiTtOUTMX57xdhXMiQd2QNAYWEhBg0ahLCwMMkmbG/fvi1456uCJCjGvnyiFpFWceNUMm4BeCJ5obduYeTIkRg1ahTeeusti8tTDL3NUdw45RMxz00Z2VcmiNuNccQaZf/222/47rvvJJmwvXHjBhwcHCTSTEEAWXIroGAWYoz9I8XYVz5WWavgadOmISEhweIJ2xs3bkClvHTaEmWCpHwixtjfUHpU5WMLgExrFFxQUICBAwfC1dXVognb69evKyN726IY+/KJYuwVjENEeQA2WKv8pKQkjB49Gq1btzZ7wvbmzZvSKqVgirtElCq3EgriYIx5AuA/h/Mp1xVjXzn5BtzRilbh119/xcKFC82esC0oKMD9+/etoJmCAZRRfflE7KS6MrKvjBDRFQA/WLOODz74AKdPnzZ7wlYZ3duMBLkVUDCL+iLTKyP7SswX4M7VtQpqtRoDBgxAXl6eWRO2irG3GcrIvnzyqoi0yQCuKsa+kkJEDwF8bs06rl+/jrFjx8Lf31/0hK1i7G2GYuzLGYwxBqCXiCx/EhEpxr5yMw/AX9asYMOGDVi6dKnoCduUlBQraqVQQjoR3ZRbCQXRtAIg5lV5FwAoxr4SU7LJ6g0AVl2NMXnyZJw9e1bUhG3JaTwK1kXx15dPxolISwB2A4qxr/QQ0X0Ao61ZR35+PgYMGIDs7Gx89913aN++vTWrUxCO4sIpZzDGggEMF5HlNBE9AhRjrwCAiH4HsMSadVy5cgXjx4+Hk5MTNm7cKGlI5MoOYwwxMTFwcnISm1UZ2Zc/ZgAQ86C3av9QjL2ClvfBHV1oNdasWYNly5aZNWGrYBwiwo0bN3Do0CEMHjwY3PydIJSRfTmCMVYfwAgRWQoBLNP9n9ynpCtiPwKgGYB8iDu1XpS4ubnRuXPniIjop59+slo9lVFat25Nt2/fplOnTtFLL71kMq2Tk1MhAEe525wigvumCkC8yDaxtnQZrKQgBQUAAGPsPQDfWbOO8PBwnDx5Eh4eHujZsyfi4uKsWV2lwtfXF0uXLkVsbCzy8vKQnJysk5SUFN3farX6zsqVK+vIra+CMBhjUwDMFZktmogO68pQjL1CaUrW8P4OoIc165k9ezamTZuGadOmYc6cOdasqlLi5+eHV155BV26dEFoaCjq1q2LgAC9o2YfAaghk3oKImCMhYNzubmKyJZARC1Kf+AoqVYK5R4iIsbYcHCTd7WtVc+tW7cAALVq1bJWFZWaR48eYeXKlVi5cqXuM3d3d4SEhKBu3bqoV6+e36+//jrz/v37G4josoyqKpiAMeYAYAXEGXoAWPDsB4qxVygDEaUxxgaC8xFapY1oA50pxt525Obm4uLFi7h4UTcPPwvALMbYaQBrAKwjonuyKahgiA8BtBGZ5wKAlc9+qKzGUTAIER0Ft8zLKjx48ACAYuzthJbgIqHeZoztY4yNZIwpS6VkhjHWFOaFNJlMRJpnP1SMvYIpvgHwhzUKVkb2dokKQCcAPwG4yRj7iDFWVV6VKieMsWoANgJwFpl1GxHtNlimMkGrYIqSRpcAQFKr7OTkBLVaDSKCi4sLioqsFl5fwTKegAuH/R0R3ZVbmcoAY8wdXMyqKJFZCwE0JqKrBstVjL0CH4yxdgD2Q2L/fUpKCmrUqIHg4GDcvn1byqIlxcPDAy+88AKCgoIQEBCAwMBABAQEICAgAK6urnrLG5OTk3Hr1i3s378f+fn5cqsuJYUA/gdgFhE9kFuZikrJhOwWAD3NyP4NEU01+q3cmwUUKR8CYBok3gSUkJBARERt27aVfUPSs+Lt7U1Dhw6lzZs3U25uLhmkqIiK89UGv3ry5AmtXbuWYmNjyd3dXfbrkVByAHwJwFvuNlkRBcCPZj6XfwC4mipbGdkrCKJk/f0fALpLVeb27dvRvXt3DBw4EBs2WO1YXMGoVCoMHjwYQ4YMQdeuXeHszLlLC85fQt5vu1B4/SY0yY+geZDC/fvoMaDRQOXlCQf/6nDw94PK3w8uLZrAvV+P/2/v3KOrKq8E/tvJDUmgEIjII7yuCAjIQysYooFZGPGxYIHOEKbYaWGYqQrRglQHLAGhESmDDFOGmqKCdWx1SRxQGJ1iwTorgTCRCvhMIEASwg15kYQANtwke/74LpQQIMm9JzlJOL+19rrcnHO+b9/Lvft+Z3/7QchtppnQ2bNnWbp0KevXr6e2ttbOl2glpcBLwK9VtcpuZdoDIrICWObHpd8BY1T1+uVO7P4lc6TtCNAdyMeiVeKmTZtUVfWZZ56xe7Wq0dHRmpGRoRep+vMXevr5lzR/yL16nN5+yckRE7Vs+ctaXVSiqqp79+7VYcOG2f5aLZZcTBXGILs/n21ZMGWL/f0/+Elj5nCicRwajaqWADOBemFd/tBawi+XLVtGeno6Y8eO5VzKDk4OvgfPXQ9Sseo/8B4+5ve4F77KpHz5Wk4Om8DZN7cQExPDgQMHWLJkCS5Xu0lx6Y9J+jkkIs2add1eEZEF+F91NkVVX2vMiY6xd2gSqpoKLLViLLvDL0NCQti8eTMrVqygJr+AU/fFUzzjCbzZOVe/IDiY0OjvE7FkPl2X/4yw2LuRRhjt2tIySmYv4FTcDIJOFPDiiy+yb98+evbsWe/cIUOGkJ6ezsyZMwN8dS3OCGCHiKSKyD12K9MWEBGXiCQD6/DPFh+hKY1M7L59caTtCSDADgJ0ATz66KOqqrpnzx5bXBDJycmqqlq1/5Dm9b7jqq6YnDC3Fv/TQj237X+0prxCr6TmTKWW/3KD5nYb2ijXTk6YW8++876qqmZmZmqfPn0u6TN69GgtLCy8NPYnn3yiI0aMsNtN469sB8ba/VltrQJEAB8H8P4WALc0aU67X7QjbVOArpiVhd8GITo6WlVVS0tLtXv37i1qjKZPn66qqlVffqs5nW6tZ5RzI27T04tXavWpIr2SmsqzWvnbd7X4H57SvF6jm+7PlyiteNn80Bw7dkzdbrfGxMRoWVmZ1lZd0KL4x7Xy9bcvzZeRkaELFy7Uvn372m3A/ZE/AhPt/ry2JgEGYnpH+PueVgB3NHVeJxrHwW986dz7gI7+XB8ZGcm3335Ljx49yMjIYOLEiZw/f95aJa9CREQEOTk5RHQIxTP2YbzfHK5zvNPMR7jpN6sJ6tK5zt/V6+Xsq7+j/BfrqCkKvG1vl4VPELn2BTweDxEREXQKD6f475/k3Hum5HNYXCzdX12Da+AAM78q6enp7N+/n8zMTLKyssjMzLzkDmvl7MNE7/y33sBGx5ez8j4m2MEfLgAPq+onTZ77Bn7fHSxARGZiimj5xciRI/n000+JjIzko48+Ytq0ac2eTZuQkMCGDRsoX7aG8qR19Y5HfbGbDiOH1fnbuZQdlP981bX9+X7S7V8TiXjONGEv/cmzVL5e960Ul4uwSRPoNPMROj7yEEGdv1dvjMrKSrKysjh69Ci5ubn1pLKy0lKdA+RLYBWwRa9Sv6W9IiIuTDe4FYC/dYdqgcdU9V2/dHCMvUOgiMg6YIG/148ZM4bdu3fTpUsX3njjDebMmWOhdvU5dOgQI4cPJ7/fGGpOFdU51mHUMKIO7b703JudQ8lj86j6rJnatQYF0XP7b/Eey+P0TxOve6qEh9FxyiQ6/WAaHe4cQXC/qEZtEGdmZpKWlsaePXtIS0sjOzvbKu0DIRtYDfynql6wW5nmRETGARsxneD8pQr4kaqm+K2HY+wdAsXX8f4LoIu/Y8TGxrJz5046duzIypUrSUy8vuHzl8GDB3P48GHOb/+Yommz6x3vtmYpEc/OBUAveCkYN5kLB75qFl0uEtSlM4hQW3GmaRcGB+OK6onL3Q/XgL643P0I9j26BvTF1b8PElq/jtapU6dISUlh8+bNHDxoe8/xk5iCe6+qavP78FoQEemCcV3NJbDIxwpgmqr+b0D6OMbewV98FREXAfOB8EDHi4uL48MPPyQ0NJSEhAReeeWVgHW8kunTp5OSkkLZkl9S8dL6ugeDguh34s8ER5mQyNM/W8GZf9touQ4tRlAQrj69cA26hZBB7kuPoTF3EdzbvMaDBw+ycuXKw++9995NwE02alsC/Ar4jZp8jjaNiPwdsB6ICnCokxgf/ZcB6+QYe4emIiJhwFPA80CklWNPmTKFrVu3EhwcTHx8PFu3brVyeJKSkkhMTKTo0Tmcf/8PdY6Fxd5Nr9T3Afhu56cUPvxDaKffj5DhQwi/fzxh908gbPzdB4K7dR0HTAX+EXgQCLZJtWrgD8DvgO2q+p1NeviFiNyFqUFvRYLZNxhDb0mVQMfYOzQaX0W+H2M2mZqtZWF8fDzvvPMOXq+XBx54gNTUVMvG/uCDD5g6dSonh9yL98jxOsfC4mLptWsLNUUleEbFUVNYbNm8rRqXq8Ttzbv54lMRiQJ+hDH8t9mmlymv/F8Yw/8nVW2VhYV8m69/i7nDtSqh7F1MGQTLdtedDFqHRiEi0zB++c00o6EHSElJYc6cOYSGhrJ9+3Zuv/12y8YePnw4+pcqvEdz6x3TikpQpWT2ghvH0ANUV9dxwamqR1VXq+pQYCImVt4OOgOzgV3ACRFZIyL3+Iyr7YjITSLyPHAcY5ytMPRVwDxV/YGVhh6clb1DA4hILCZqosVT4J988kmSk5PJz88nJiaG/PzAe2cUFhYS+Rcv+QPG1jsWMvgWOs+bzelnXgh4njaGutVz3YWfiIwFlmBcPdIiWl2bM5j+Cn8EdqlqZktNLCIdMD1hZwE/pOmNwK/HUWCGqn5u4ZiXcIy9w1URkRGYSAJ/mihYxsKFC1m7di1ff/0148ePp6ysLKDxzpw5Q8fK85zoc2e9YxIeBrW1aFW7jgS8Fh3d6mnQP+77XPwcmIF9fv0ryces/ndhjH+hVQP79qfGAX/jk3FYEIxwFX6PWdE3MSSr8TjG3qEOItIf+AXGZ9sq3HyJiYkkJSWRlpbGpEmTAuoAVV1dDSWnOdFrtIUatgvC3OppdF16ERkELMbs4YQ0m1b+cRzIuYacvDyZy7dS7wp0u+Lxdoxxvxv/k6AaQzYwV1V3NeMcgGPsHXyIyEAgwSfN+eH2i1WrVrF48WK2bdvG9OnT/WoC4nK58Hq91JaWkdfdun2AdkCJWz03N3xafUSkH/Ac8M80z4rXaryAB/MD1RU/S31YwAWMe/QlVW2R/pWOsb9BEZHuwH3A/T65xV6NGmb9+vU8/fTTJCcnM2/ePL/GqKiooHOHUHK/Nwhqbphs/YY46FZPfb9WExCRHsBCYB5mY9Xh2uwGElQ1qyUnbRW36Q4tg4j0F5HVIvI5UIQvvIs2YOgB5s+fz6ZNm5g7d67fGbZ5eXlIWCgdRg61WLs2TcBx3KpapKqLMZFaizGrZ4e6pAL3qer9LW3owTH2NwQi0kNEfgUcBv4FuBP7IyqajKry+OOP8/bbb5OUlORXDZ28PGPXQmPGWK1eW6bJFRSvhapWqOpqwI0Jmww487MdsBeYpKoTVPVPdinhGPt2jIh0FZEXgWPAT2mFvvimUltby6xZs9i2bRsbN25k8uTJTbo+N9fE14fe4xj7y9hh9YCq6lXVN1V1FPAQJlLmRkIxzUkeUtV7W2IDtiEcY98OEZFQEVmMMfJLgE42q2Qp1dXVxMfH16SmpmZs2bKlNjo6utHXXszGDY+LRUJaWxCJLXztVo//jXYbgaruVNVJwCAgCQvcRq2YAmAlcKuqPqiqO+1W6CLOBm07xJdh+Blwh926NCMHgBhV7Z2dnT1/ypQpT2VlZTWYWRkZGUlxcTFBQUGUzF7A2Te3tICqrZofu9XzVktOKCJBmOCA2ZgyA20hiud6XMAkeL2Oac7SvA0Z/MQx9u0UERkKpGFfJcNSTCXD/lj/Zf4ciFfVOivSRYsWxZWWlsYXFBTEHjt2bOCRI0fCa64ScbN3715iYmK48FUmnlFx7bbYWSP4ErjDrR7bas74ygDPACZjSjNE2KVLEykGPsS4wD5W1bM269MgjrFvx4hINKYC38XN2BpMEscXwHngEcyXLFA3TyVmk28nJuLguKqe8+kgQB/MLfzgKx5vpWlxzkcxTSDWNWb1tGzZsh7l5eWPFRcXP3zixInRmZmZN5eWlgYtX76cF14wJRGKps7i/A67Sr/YSg3woFs9uxs8s4XwFdobgwkFngTEAPUL8tvDaWA/8H+Yqpz7WmthtmvhGPsbHBEJx9xSjwW+75M+17mkFijEuIlSffK5qnr9nL83pgHzRelF3UihGsxKfpeq1q9e1kQWLVoU179//9iEhIQewLiagsJRnrsectUUWJZh31Z42q2eDXYrcT1EpCMwARgPDMEsEAYB9XszWkclpoZ8PmZR9BnwmaoebcY5WwTH2DvUw+fz74apVR+JKfZUjInNL2lrK5oGCD/97IpZZ/79tQ3U1LaWWi/Nzctu9TxntxL+IiK9+Ovd4cU7xa6A6zIJueK5CxOQUoTJATjpkzr/trrSZGvCMfYODkCORM0BXqVli3t9A7wBTAPupflzHyqBuW71/L6Z53FohTjG3sHBR45ETcRUH+zdzFNVA2uAFReLj+VI1ADgMUzZXKsL99RiNhKfdaunVXQbd2h5HGPv4HAZORLVE3gLs0FoNZXAa8B6t3quuf+QI1GDMCv9WN/jUPxb9R8HtgK/dqvneEMnO7RvHGPv4HAVciRqHPAEJiwwkMqIhcAeTLTSW271NLleeY5ERWJKXPTGbGD3vOyxK1CBCXU9jdlbOQiku9VzKgC9HdoZjrF3cLgOORLVFeNTH8ZfNwQHYsJVzwPlV5FSTNLXHsdt4tBa+H8nqYHN7SVqRQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/baboon_vector.svg</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpZD0ic3ZnMzE4MSIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ4LjAgcjk2NTQiCiAgIHdpZHRoPSIxNzUwIgogICBoZWlnaHQ9Ijk2MCIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iYmFib29uX3ZlY3Rvci5zdmciPjxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTMxODciPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlPjwvZGM6dGl0bGU+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgICAgaWQ9ImRlZnMzMTg1Ij48Y2xpcFBhdGgKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImNsaXBQYXRoMzE5NSI+PHBhdGgKICAgICAgICAgZD0iTSAwLDc2OCAxNDAwLDc2OCAxNDAwLDAgMCwwIDAsNzY4IHoiCiAgICAgICAgIGlkPSJwYXRoMzE5NyIgLz48L2NsaXBQYXRoPjxjbGlwUGF0aAogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0iY2xpcFBhdGgzMjE1Ij48cGF0aAogICAgICAgICBkPSJNIDAsNzY4IDE0MDAsNzY4IDE0MDAsMCAwLDAgMCw3NjggeiIKICAgICAgICAgaWQ9InBhdGgzMjE3IiAvPjwvY2xpcFBhdGg+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTQ0MCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NTEiCiAgICAgaWQ9Im5hbWVkdmlldzMxODMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuMjA1NTAyOTEiCiAgICAgaW5rc2NhcGU6Y3g9IjE1MzQuMTY2NyIKICAgICBpbmtzY2FwZTpjeT0iNzk1Ljc4MTU2IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iZzMxODkiIC8+PGcKICAgICBpZD0iZzMxODkiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpbmtzY2FwZTpsYWJlbD0iYmFib29uX3ZlY3RvciIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjI1LDAsMCwtMS4yNSwwLDk2MCkiPjxnCiAgICAgICBpZD0iZzMxOTEiPjxnCiAgICAgICAgIGlkPSJnMzE5MyIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMzE5NSkiPjxnCiAgICAgICAgICAgaWQ9ImczMTk5IgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ1OC45NTYxLDU2OS45Njc4KSI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMCwwIDU5LjgzNSw2OS4zNTUgODcuMDM0LDI2LjUxOCAxMzMuOTQ5LC03LjQ3OSBjIDAsMCA3NC4xMTYsLTMyLjYzOSA3NC43OTUsLTM0LjY3OCAwLjY4LC0yLjA0IDg0LjMxNCwtNTkuMTU1IDg0LjMxNCwtNTkuMTU1IGwgMTIuMjM4LC03NC43OTUgNS40MzksLTk3LjkxMiAtMTMuNTk4LC0yNS4xNTkgLTQuNzYsLTQwLjc5NyAtMTguMzU4LC0yMy4xMTggMjQuMzksLTUuNTYxIDAuNTAxLC01LjE5MiAtMTQuMDEyLC02MC42NDEgMTYuNDc3LC05My4zNjggNy4yMjMsLTQ5Ljk3MiAtMjA4LjI5NSwtNTEuNzU0IC0xOC41NTIsNC4wMDUgLTM3LjQ2OCw4LjMyNSAtMTAuMDM2LDQuMDM2IC02Ni44ODUsMTAuMTAxIGMgMCwwIC0xNC45NTksNzQuNzkzIC0xNi45OTksNzMuNDMzIC0yLjAzOSwtMS4zNTkgLTQyLjgzNiw1Ni40MzcgLTQyLjgzNiw1Ni40MzcgbCAtMTkuNzE5LDY1LjI3NCAxMi40OCw3NC41NzEgLTcuOTYxLDkuNjQzIC0yNi40NzksMTYuMTg3IC0xMi43MTYsMzguMzA5IDQuMDgsNDguMjc3IDguNzY5LDM4Ljk4NSBMIDYuNjA4LC03NC4zMDggMCwwIHoiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgaWQ9InBhdGgzMjAxIiAvPjwvZz48ZwogICAgICAgICAgIGlkPSJnMzIwMyIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3OC44NjU3LDY4Mi4xNTgyKSI+PHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMCwwIDE0Mi43ODksNDAuNzk3IDI1OS43NCw1Mi4zNTUgMzEzLjQ1NywtMjMyLjU0MyAyMDQuNjY1LC0yOTEuNjk4IDc4LjE5NCwtMjkzLjczOCAwLDAgeiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBpZD0icGF0aDMyMDUiIC8+PC9nPjxnCiAgICAgICAgICAgaWQ9ImczMjA3IgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2OS41MTIyLDM0NS4yMzQ0KSI+PHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMCwwIDE4LjgwMSwtNzQuNDI1IDQwLjcyOCwtODUuNDA4IDU5LjUzOSwtNTkuNTQxIDQwLjI1OSwxMy41MDMgMzYuODIxLDE1LjY2OSAwLDAgeiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBpZD0icGF0aDMyMDkiIC8+PC9nPjwvZz48L2c+PGcKICAgICAgIGlkPSJnMzIyMyIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc0MS45MTgsMTA5LjAzMzIpIj48cGF0aAogICAgICAgICBkPSJtIDAsMCAtMTcuMjM2LC05LjQwMSAtMTYuNDUyLC0yMi43MjEgLTAuNzgzLDEyLjUzNyA2LjI2OCwxNy4yMzQgMTMuMzE3LDYuMjY4IEwgMCw3LjgzMyAxNC44ODQsMy45MTcgMCwwIHogbSAxNzIuNjIyLC0yMS44MjQgYyAtMC4wMzEsMC4yNzEgLTAuMDgxLDAuNTM1IC0wLjExNywwLjgwNCAtMjAuODUsNy42NTMgLTQ5LjU5LDcuMzI3IC02Ni44NzQsMTAuOTI3IC0xMy44NDksMi44ODYgLTIzLjA0Nyw5LjExOSAtMjcuMDMyLDEyLjI5OCAtOS44NjMsLTguNDk0IC0xMi4wMjUsLTE0LjM3NyAtMTIuMDI1LC0xNC4zNzcgMCwwIC05LjgxNiwxNS4zMDkgLTMwLjE3LDI1Ljc2IC03LjA1LDMuNjIxIC0xNy43NjcsNS42OTEgLTI5LjM0MSw1LjY5MSAtMjQuMjk3LDAgLTUyLjM4NCwtOS4xNTUgLTU4LjMzOSwtMzIuMjIzIC0xMC40NTgsLTQwLjUxMSA5LjY5NywtNzYuNTk0IDQ5LjgxNCwtNzcuNjIzIDEuMzI1LC0wLjAzNCAyLjYyMywtMC4xMiAzLjg5NCwtMC4xMiAzNi4xMzEsMCA0OC44NTUsOC41NzIgNTguMzIzLDE1LjQ3OCAwLjAyNywwLjAyMSAwLjEwNCwwIDAuMTA0LDAgMCwwIDI1LjEyNiwtMTEuNTA2IDUzLjUyOSwtMTEuNTA2IDQuNDE5LDAgOS4xNTYsMC40MTUgMTQuMjQ5LDEuMDYzIDMxLjY0MSw0LjAxOCA0Ny45ODksMjguMTI0IDQzLjk4NSw2My44MjgiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNkZjAwMTk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGlkPSJwYXRoMzIyNSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz48L2c+PGcKICAgICAgIGlkPSJnMzIyNyIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMwMC44NDgxLDI3MC4wMjU0KSI+PHBhdGgKICAgICAgICAgZD0ibSAwLDAgYyAtMy4wNjMsLTAuNjkxIC0xMi41MzUsMC43ODQgLTEyLjUzNSwwLjc4NCBsIDYuMjY3LC0yNS44NTMgNDMuNDgxLDEzLjMxOSAtOS4wMSwyNy40MTggQyAyOC4yMDMsMTUuNjY4IDcuODY3LDEuNzc3IDAsMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgaWQ9InBhdGgzMjI5IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPjwvZz48ZwogICAgICAgaWQ9ImczMjMxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjExLjY2MDUyLDYxNS44NTk4NCkiPjxwYXRoCiAgICAgICAgIGQ9Im0gMCwwIC0xNi4yNDMsLTIuODcxIC0xNS40NjIsLTkuNCA0LjMyMywtMTAuOTM4IDE0LjU2OCw5Ljg5IEwgMi43NSwtOC43NzEgMCwwIHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGlkPSJwYXRoMzIzMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz48L2c+PGcKICAgICAgIGlkPSJnMzIzNSIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI3NC4xNTczMiw2MjYuNDA4NCkiPjxwYXRoCiAgICAgICAgIGQ9Im0gMCwwIC0xNS42NCwwLjQwNyAtMTQuMjc5LC0zLjYwOCAyLjAwOCwtOS43NDcgMTQuNzU2LDQuMjA4IEwgMS4xMTEsLTguMjE1IDAsMCB6IgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBpZD0icGF0aDMyMzciCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PC9nPjxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgZD0iTSA0MzYuNjU2MjUgMjIuMjgxMjUgQyA0MzYuNjU2MjUgMjIuMjgxMjUgMzM4LjE4Mzc1IDI1LjM4NSAyNTEgNDIuODEyNSBDIDE2My4yNDg3NSA2MC4zNTM3NSA3MC40MDYyNSA5OS42NTYyNSA3MC40MDYyNSA5OS42NTYyNSBMIDE3NS4xODc1IDQ5NS4yODEyNSBMIDMyNy45Njg3NSA0OTIuMzQzNzUgTCAzMzcuNzUgNTI3LjU5Mzc1IEMgMzM3Ljc1IDUyNy41OTM3NSAzNjUuMDk1IDUyMy4yNTg3NSAzNzMgNTE4Ljc4MTI1IEMgMzc2LjMxMzc1IDUxNi45MDM3NSAzODMuNzgxMjUgNTA4IDM4My43ODEyNSA1MDggTCAzNzcuNzUgNDg0LjY1NjI1IEwgNTA0LjIxODc1IDQwNy4xNTYyNSBMIDQzNi42NTYyNSAyMi4yODEyNSB6IE0gNDEwLjUzMTI1IDU1LjE4NzUgTCA0NjUuNjg3NSAzOTMuMzEyNSBMIDM0Ni41OTM3NSA0NTYuNjI1IEwgMjAyLjc1IDQ2Ni40Njg3NSBMIDExMiAxMTQuNDA2MjUgTCAyNjMgNzkuMTg3NSBMIDQxMC41MzEyNSA1NS4xODc1IHogIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44LDAsMCwtMC44LDAsNzY4KSIKICAgICAgIGlkPSJwYXRoMzI1MyIgLz48ZwogICAgICAgaWQ9ImczMjQ3IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4xOTkyMzgsLTAuMDI4NzkzMzEsMC4wMjY3MzA4NCwxLjA1MjA3NTYsMTcyLjQxOTM1LDQ5OC4zNzMzOSkiPjxwYXRoCiAgICAgICAgIGQ9Im0gMCwwIGMgMCwwIC0xLjg2MSwxLjQ4MSAtOS4xNDMsLTEuNDU3IDkuNzEyLDE4Ljg2NyA5LjQzOSwzOS45ODkgOS40MzksMzkuOTg5IDAsMCAtMy4xMDYsLTIuNDY1IC0xMS4zMTEsLTguNDcgOS4yNDEsMjMuMDQ0IDUuMzM4LDcyLjUyNSA1LjMzOCw3Mi41MjUgMCwwIC0xNy40OTMsNDAuNzQ2IC0xMy42NTcsNDUuNzk5IDguODQxLDExLjY1IDIzLjgzNCwyMy45NjggNDQuMjk1LDI1LjU5NCAxNy45MzUsMS40MjQgNDQuNjA2LC00Ljk1MyA1NS44NjUsLTE1LjI4NCA0LjUzNiwtNC4xNjEgMjMuMzY3LC00Ny40OTMgMjMuMzY3LC00Ny40OTMgMCwwIDYuMTA0LC0zNS4yNzEgMTEuNjE5LC01NC4xMDggNS41MTMsLTE4LjgzOSAxMS4wNTQsLTI2LjY3NCAyMS4yODQsLTM0LjgyNSAxNy44MzEsLTE0LjIwNyAyNy4wNzYsLTI5LjkzOCAyNy4wNzYsLTI5LjkzOCBMIDE0My4zOTksMy45NDUgYyAzLjY1NSwtMTcuMzU2IDE0Ljg3NSwtMzQuMjggMjcuMzksLTQ3LjY3MiAtMTIuODYzLDEuNTA3IC0xOS42MSw4Ljc4MyAtMTkuNjEsOC43ODMgMCwwIDIuMTUxLC0xMi42NjQgOS4xMDksLTI2LjU1NCBsIDI4LjcxMiwxNS4yNjQgLTEuNzYyLDEwLjgwNSBjIC01LjEyOCw5LjMwNCAtOS4zMzYsMTUuNTM0IC05LjMzNiwxNS41MzQgMCwwIDIuMDg5LDAuOTU2IDcuMzg1LC0zLjU3MiBsIC0yLjAwNSwxMi4yOTYgYyAtNC44MTQsOS4zOTEgLTExLjc3MywxNi43NTIgLTI1LjExNSwzMS4xMTMgNS45NDQsLTYuMDg3IDE1LjQzOCwtNS4zNzkgMjAuNzUxLC00LjM1NiBsIC0wLjU3MiwzLjUxMiBjIC0yLjIzMSwxLjI3OCAtNS40OTQsMy4xNzEgLTEwLjI0MSw1Ljk1NyAtMTIuNDMsNy4yOTkgLTIyLjMyNiwyMS4wNDkgLTIyLjMyNiwyMS4wNDkgMCwwIDEyLjg1LDEuODE1IDIwLjUxMywxMS4wMjIgLTcuMzE2LC0yLjY0MSAtMTguNTg1LDAuNzk5IC0xOC41ODUsMC43OTkgLTE3LjA4Niw2Ljc3MiAtMTUuMDIyLDMwLjIxNyAtMTcuNjg3LDUwLjU4NyAtMi42NjcsMjAuMzcgLTkuMjk5LDM0LjEyNSAtOS4yOTksMzQuMTI1IDAsMCAtMC4yNDMsMi4xNDkgMTEuOTEsLTUuOTA2IC03Ljc0NCwzMy4yMTUgLTM1LjU0NSw0NC45NCAtMzUuNTQ1LDQ0Ljk0IDAsMCAyLjIyMywyLjc5IDIyLjg0MywwLjA0NCAtMTYuNDY5LDE1LjgxNyAtMzIuMzAzLDE2Ljg5NiAtMzIuMzAzLDE2Ljg5NiAwLDAgMTAuMDc3LDIuMjUgMjMuNjExLDAuMjQgMCwwIC0zLjMyNywzLjUwOCAtNy41NDksNi40NTMgTCAzNS45ODUsMTk0LjI5MSAtNzcuNTQzLDE2Ny44MTUgLTguMjExLC0xMDEuMTcgMTcuNDgxLC05OS40MTMgQyA4LjYwMiwtODUuMTE0IC0wLjM3MSwtNjMuODM3IC0yLjE1LC00MC44NTcgLTQuOTExLC01LjIwOCAwLDAgMCwwIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBpZD0icGF0aDMyNDkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PC9nPjxnCiAgICAgICBpZD0iZzMyNTUiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDQuMjIxMzQsNTgwLjg4MzUzKSI+PHBhdGgKICAgICAgICAgZD0ibSAwLDAgYyAwLC0xLjQxOCAwLjQzLC0yLjczNiAxLjE2OCwtMy44MyAxLjUyMywwLjY3NyAzLjU1MSwxLjA5NCA1Ljc4NiwxLjA5NCAyLjE2NCwwIDQuMTMzLC0wLjM5IDUuNjM5LC0xLjAyOSAwLjcxMSwxLjA4MSAxLjEyOSwyLjM3NCAxLjEyOSwzLjc2NSAwLDMuNzkgLTMuMDcyLDYuODYxIC02Ljg2MSw2Ljg2MSBDIDMuMDcxLDYuODYxIDAsMy43OSAwLDAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGlkPSJwYXRoMzI1NyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz48L2c+PGcKICAgICAgIGlkPSJnMzI1OSIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1Ni4zMzExLDU5NS4zMTY0NikiPjxwYXRoCiAgICAgICAgIGQ9Im0gMCwwIGMgMCwtMS40MTggMC40MywtMi43MzYgMS4xNjgsLTMuODMgMS41MjQsMC42NzcgMy41NTIsMS4wOTQgNS43ODcsMS4wOTQgMi4xNjMsMCA0LjEzMiwtMC4zOSA1LjYzOCwtMS4wMjkgMC43MTIsMS4wODEgMS4xMjksMi4zNzMgMS4xMjksMy43NjUgMCwzLjc5IC0zLjA3Miw2Ljg2MSAtNi44NjEsNi44NjEgQyAzLjA3MSw2Ljg2MSAwLDMuNzkgMCwwIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBpZD0icGF0aDMyNjEiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PC9nPjxnCiAgICAgICBpZD0iZzQxNzQiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5Njk0NTA5LDAuMDc4MTA1NjMsLTAuMDc4MTA1NjMsMC45OTY5NDUwOSw0Ny4zNDg3NDgsLTE1LjM0ODI5OSkiPjxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIyMi41MDk4LDYxMC4xNTU4KSIKICAgICAgICAgaWQ9ImczMjE5Ij48cGF0aAogICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgaWQ9InBhdGgzMjIxIgogICAgICAgICAgIHN0eWxlPSJmaWxsOiNkZjAwMTk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgZD0ibSAwLDAgNC40NSwyLjc1MiA1LjM0LDMuNzg1IDcuMDUsLTguMjI2IDcuMDkzLC0zMy4zNTkgMTcuODAxLC01MS4yNTkgMTMuODYsLTMwLjIxNSAyNi4yNjEsLTEuNTUgLTYuNjg1LC0zNS42NTMgYyAwLDAgLTQ5Ljk4LC0yMS44NzEgLTQ5LjU0NSwtMjEuOTExIC00Mi42NTcsNC4wMDEgLTEyLjU1Myw0My4wNjYgLTguNjMxLDQ3LjMwMSBMIDMuNjY2LC00Ny44NjkgMCwwIHoiIC8+PC9nPjxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0Ny42MjYsNDY3LjM1NDUpIgogICAgICAgICBpZD0iZzMyMzkiPjxwYXRoCiAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICBpZD0icGF0aDMyNDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICBkPSJNIDAsMCBDIC0zLjA0NCwtMC4zNDUgLTUuMjMyLC0zLjA5MiAtNC44ODgsLTYuMTM2IC00LjU0MywtOS4xOCAxLjU3NiwtMi4yNTQgMTMuMzA4LC00Ljk2MSAxMy45NzEsLTEuOTcgMy4wNDQsMC4zNDQgMCwwIiAvPjwvZz48ZwogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNzkuNDQxOSw0NzYuNTc2MikiCiAgICAgICAgIGlkPSJnMzI0MyI+PHBhdGgKICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgIGlkPSJwYXRoMzI0NSIKICAgICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgIGQ9Ik0gMCwwIEMgMy4yNzEsMS4wOCA2Ljc5OCwtMC42OTcgNy44OCwtMy45NjkgOC45NiwtNy4yNCAtMC41NSwtMy4wNDQgLTExLjI1OCwtMTEuMzI5IC0xMy4zNDUsLTguNTg2IC0zLjI3MiwtMS4wODEgMCwwIiAvPjwvZz48ZwogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyODQuMTkyOSw1MjUuOTA4MikiCiAgICAgICAgIGlkPSJnMzI2MyI+PHBhdGgKICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgIGlkPSJwYXRoMzI2NSIKICAgICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgIGQ9Ik0gMCwwIEMgMCwwIC02Ljk3MiwyOC42NzEgLTYuOTcyLDI5LjM1NSBMIDEuNTg1LDIuODY0IDkuOTk5LC0xMC41NjQgMTMuNjM0LC0zMi42OTcgNy45MjIsLTExLjA5OCAwLDAgeiBNIC0wLjYzMywtMTUuMDM2IC05LjE5LC00Ljg2IC0xNi40NzgsMjUuNzc2IGMgLTAuMjAyLDAuNjg0IDkuMTA2LC0yOC44MTEgOS4xMDYsLTI4LjgxMSBsIDguNjQsLTExLjY0MiAyLjQ2OSwtMTcuMzM2IC00LjM3LDE2Ljk3NyB6IG0gLTYuMzM5LC02LjA4NSAtMTAuNDU3LDE2LjgyNiAtNS40NDQsMjguNjQ2IDYuNjE0LC0yNy44NDIgMTEuMzExLC0xOC4wMjYgMS40MTMsLTkuNTgzIC0zLjQzNyw5Ljk3OSB6IG0gLTUzLjQ2MiwtMTMuMjQ2IC0xLjQzNywyNC45NDQgLTIuNjgyLDI4Ljc1NCA1LjEwNiwtMjkuODk1IDEuMjEyLC0yMS42NzcgNC4xMzksLTE4LjIzNiAtNi4zMzgsMTYuMTEgeiBtIC00LjI2NSwtMTkuNTUgLTYuNjY1LDE1LjUxNiAwLjQwNCwyOS4yMDUgLTAuODgyLDI4LjE2OSAzLjEwNCwtMjguMzk2IDAuODA4LC0yNi42OTcgNC4yNDIsLTE1Ljk3MiAyLjQyMywtNi42MTcgLTMuNDM0LDQuNzkyIHogbSAtOS42OTUsLTIuOTY3IC03LjExNywxNi44ODUgMS4zMTgsMzIuMDEgMCwyNS4yMjMgMi4xMTUsLTI1LjA2MSAtMC41ODEsLTMxLjI1OSA1Ljg2OSwtMTYuNDI5IDUuMDU2LC04LjY3MSAtNi42Niw3LjMwMiB6IG0gMTAzLjE0NCwtNy45NyAtNi42NzYsMjAuMzggMi4xNDEsMTEuNTQgTCAxNi40OTksLTkuMzc2IDQuNTU3LDEzLjEwNCAtNS44NzksNTMuOTcgYyAwLDAgLTguMzI1LC03LjQxIC0xNi43ODEsLTguMDggLTguNDU1LC0wLjY3MSAtMTUuMDksNC4wMTggLTE1LjA5LDQuMDE4IDAsMCAzLjU5MiwtMTcuNzYxIDguNjU5LC0zNy41OTcgNS4wNjksLTE5LjgzNiAxNy41MjgsLTQ0Ljg2NiAxNy41MjgsLTQ0Ljg2NiAwLDAgMjEuNTc4LC04LjE5NyAyNC4zMDIsLTE2LjU4NyAyLjcyNCwtOC4zOTEgLTMuNTA4LC0yMi45MTEgLTE0LjEwMiwtMjYuNTUxIC0xMC41OTMsLTMuNjQgLTMyLjI4NCwtOC4yNjIgLTMyLjI4NCwtOC4yNjIgMCwwIC0xOSwxLjUxMiAtMjAuNDM4LDE0LjI2IDAsMCA0LjEzMSwxNi40MDYgMTAuNDE4LDE5LjIyNSA2LjI4NSwyLjgxOSAyMS4zNjIsMTEuMTc0IDIxLjM2MiwxMS4xNzQgbCAtOC4yNTQsMS4zMzIgLTcuNjY0LC0xLjMzMiBjIDAsMCAtNC43ODQsMTEuMjk1IC0xMC45NzMsMzUuMDg2IC02LjE5LDIzLjc5IC04Ljk2Nyw0Mi40ODUgLTguOTY3LDQyLjQ4NSAwLDAgLTMuOTEyLC00LjM5MSAtMTQuMTk5LC00Ljg4NSAtMTAuMjg2LC0wLjQ5NCAtMTYuMDMxLDcuOTg4IC0xNi4wMzEsNy45ODggbCAxLjAyNywtMzAuMTg1IC0xLjA0OSwtMjUuODMgLTAuMTUsLTI5LjIyIDUuMTAyLC0xNS45OSAxOS44MTgsLTMwLjQ0OCBjIDAsMCAxNC4xMDIsLTkuMjkzIDMxLjcyOCwtOS4yOTMgMTYuNDUzLDEuMzI4IDUxLjEzMSwxOC4wNDcgNTEuMTMxLDE4LjA0NyBsIDkuNTM2LDE2LjY4NyB6IiAvPjwvZz48L2c+PGcKICAgICAgIGlkPSJnMzI2NyIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDg0Ny4yNjM3LDMyMS41MDU5KSI+PHBhdGgKICAgICAgICAgZD0ibSAwLDAgYyAyLjI1MiwzLjUxNiA2LjY5MywxNS4zIDYuNjkzLDE1LjMgMCwwIDMuNzc4LC0xMy4zMDYgMS45MTIsLTE3LjIxMyAtMy4wNTYsLTYuNDA0IC0yMy45MDUsLTE1LjMgLTIzLjkwNSwtMTUuMyAwLDAgMTIuMTk2LDEyLjM2NCAxNS4zLDE3LjIxMyBtIC0zMy41MTQsMjMuMTYgLTAuNzU3LDU2LjM1MiBjIDAsMCAxMS4xMzYsLTE0LjAyOCAxMS44NDMsLTE5LjczOSAxLjE3NiwtOS40OTEgLTExLjA4NiwtMzYuNjEzIC0xMS4wODYsLTM2LjYxMyBtIC0xNy41NzUsMjM2LjkyMSBjIDAsMCAxMi40NTMsLTE1LjMzOCAxNC44NTQsLTIxLjM5IDEuNDI0LC0zLjU5MSAyLjI4NiwtMTUuMjg3IDIuMjg2LC0xNS4yODcgbCAtMTcuMTQsMzYuNjc3IHogTSAtOTguNTc0LC04Ni4xMzYgYyAtOS43NTcsLTAuOTA2IC0yOS44MzYsMS4wMTYgLTM4LjkxMiw0LjcwOCAtNy40OTksMy4wNSAtMjUuNzM0LDE5LjY1NiAtMjUuNzM0LDE5LjY1NiBsIDI0LjE4NywtMTAuODYgLTQuNzAxLDE3LjYyNyAxNS4yNzIsLTIyLjAwOSA0MS44MTMsLTUuMzU2IGMgMCwwIC04LjgxMiwtMy40NzcgLTExLjkyNSwtMy43NjYgbSAtNzQuNDI4LDE1Ny45NDEgYyAtNC41MTgsMTAuMDU3IC0xLjc2Myw0NC4wNjUgLTEuNzYzLDQ0LjA2NSAwLDAgNy41NDQsLTMxLjA5MyAxMi4zMzgsLTQwLjU0MSA2Ljk3OCwtMTMuNzU0IDM3LjAxNSwtNDkuMzUyIDM3LjAxNSwtNDkuMzUyIDAsMCAtNDAuODI0LDMwLjc1OSAtNDcuNTksNDUuODI4IG0gLTE3LjgzMywtMTQ5LjQ3IC00MC40MDcsMjQuNzI0IDEuNjM2LC0xNy41NzUgMC4wMjYsLTAuMDM1IC01LjE3OCwtMjkuODExIC0yLjA1NiwtMTAuNzAxIDAuMzgzLC0zMy4zNCAtNC45ODIsMzYuNDA2IDYuNDEsNDEuNDUgLTExLjA2Myw4LjMzOCAtMTcuNTMyLDQzLjE1OSAyMy41MDIsLTM4Ljc3OSAyLjM1MSwxNC4xMDEgNDAuNjM0LC0yNS42OTUgMTEuOTI0LC01LjY1MSAxMy44MDksLTI4Ljg3MSAtMTkuNDU3LDIyLjI4IHogbSAtODUuNTIyLDEzOC44NjMgMTcuMjEyLC0zNC40MjQgYyAwLDAgLTEyLjk3MiwxMS4xODUgLTE1LjI5OSwxNi4yNTcgLTEuOTA1LDQuMTUyIC0xLjkxMywxOC4xNjcgLTEuOTEzLDE4LjE2NyBtIC0yLjM2Nyw2Ni4wNDIgYyAwLDAgLTYuMjA2LDE1LjU4MSAtNi4zMjMsMjEuMDgyIC0wLjE2OCw3LjgxNyA0LjU2OCwyMy4xNDggNy42OTUsMzAuMzE1IDAuNzU1LDEuNzMgNC4xMDMsNi4zNDEgNC4xMDMsNi4zNDEgMCwwIC00LjY1NCwtMjQuNTQyIC01LjM0NywtMzIuODI5IC0wLjUxOCwtNi4yMDUgLTAuMTI4LC0yNC45MDkgLTAuMTI4LC0yNC45MDkgbSAtNy4xOTUsLTExNC44MDkgYyAtMC4zMzQsMy4zNjMgMS45MTIsMTMuMzg3IDEuOTEyLDEzLjM4NyBsIDMuODI1LC0yOS42NDMgYyAwLDAgLTUuMzEzLDExLjk2NyAtNS43MzcsMTYuMjU2IG0gLTIwLjA4Miw1My41NDkgYyAtMS4zOTQsMy41NzEgLTAuOTU2LDE1LjMwMSAtMC45NTYsMTUuMzAxIGwgMTMuMzg4LC0zMC42IGMgMCwwIC0xMC42MzksMTAuNzEgLTEyLjQzMiwxNS4yOTkgbSAtNi4wMywxMDYuNzk1IGMgMCwwIC0wLjMxNSwzNS44MzEgNC42MzcsNDYuMzc5IDQuNTMxLDkuNjQ3IDI5LjkzNiwzMC4zNTYgMjkuOTM2LDMwLjM1NiAwLDAgLTE3LjgyNCwtMjIuNDcgLTIxLjUwMywtMzEuMiAtNS4wODksLTEyLjA3NyAtMTAuMTE5LC01MS40MzcgLTEwLjExOSwtNTEuNDM3IGwgLTIuOTUxLDUuOTAyIHogTSA1MC4xMjEsMjA1LjAxIGMgMy4zMzUsLTkuMTU1IDEuMTY4LC0zOC45NTYgMS4xNjgsLTM4Ljk1NiAwLDAgLTUuNDUxLDI5Ljk4NyAtOS4yMjEsMzkuMzY2IC00LjIxNCwxMC40ODcgLTIzLjAxNCwzOC45MDcgLTIzLjAxNCwzOC45MDcgMCwwIDI2Ljc4LC0yNy41NDYgMzEuMDY3LC0zOS4zMTcgTSA1NC41MDYsOTUuNjI0IGMgMCwwIDYuODg0LC0xOC41ODYgNS43MzgsLTI0Ljg2MSAtMC43NzMsLTQuMjQxIC05LjU2MiwtMTQuMzQ1IC05LjU2MiwtMTQuMzQ1IDAsMCAyLjQxNCwxMi44NzQgMi44NjgsMTcuMjEyIDAuNTczLDUuNDc0IDAuOTU2LDIxLjk5NCAwLjk1NiwyMS45OTQgTSAxOS4xMjUsLTEzLjM4OSBjIDAsMCA5LjY1NiwyMi4xODMgMTEuMDYyLDMwLjA2OCAxLjIzNSw2Ljk0MSAwLDI4LjIwMyAwLDI4LjIwMyAwLDAgOC40NzcsLTIyLjgxOSA3LjEwNiwtMzAuNTM4IEMgMzUuODQ1LDYuMTgzIDE5LjEyNSwtMTMuMzg5IDE5LjEyNSwtMTMuMzg5IG0gNDQxLjQ4NywtNDAuOTY1IGMgLTMuMjQ5LDguOTM1IC02LjU4NywxNy4yMyAtMTAuMDEsMjQuOTI4IGwgLTEuODYyLDI4Ljg3MyAtOC44NTcsLTQuODc2IC0yNS44NjIsNDkuNDU3IC00LjgyOCwtMTAuMzQgYyAtMzIuNjksMzEuNDggLTcwLjQ1NywzNC4yODQgLTExMS45ODIsMzEuNjQ2IC02NS41NjgsLTQuMTYzIC05MS41ODcsLTQxLjYzIC03OS4wOTgsLTU3LjI0MSAxMi40OSwtMTUuNjEzIDE4LjczMywtNS4yMDUgNDAuNTg5LDUuMjAzIDIxLjg1OCwxMC40MDcgNzQuOTM3LDI2LjAxNyAxMTAuMzIzLC0yLjA4MiAzNS4zODYsLTI4LjEgODYuMzgzLC0xMDkuMjgxIDUwLjk5NywtMTY5LjY0NiAtMzUuMzg2LC02MC4zNjUgLTEwNS42MjYsLTEwNS4zODUgLTE4Mi4xMzUsLTg4LjQ2NSAtODYuNDIyLDE5LjExMiAtMTI2LjA3OCw2MC4wODIgLTE3Ny42NzUsNzQuODExIC04LjMxMSwxLjMzNCAtMTguMzQ3LDIuNzg5IC0yNC43OTEsMy4xOTEgLTEyLjY3MSwwLjc5MiAtMjEuNiwxNC43MjcgLTIxLjYsMTQuNzI3IGwgMTcuMTgxLC05LjMyNyAyNS43NjMsLTIuMzYgYyAyLjMzMSwxNCA5LjM5NSw0OS4wNTQgOS4zOTUsNDkuMDU0IGwgLTguNjg4LDg3LjI5IC0xOC42NjgsLTI3LjA2IC03LjI0NiwxMC4xODQgLTIxLjM0OSwtMjIuOTE1IC0xNS40NzMsLTEuOTU5IDE0LjY3LDYuNTk2IDIxLjM4LDI5LjQwOSA2LjcsLTEzLjc1NCAxOS40ODUsMjQuNjkxIDAuMDA0LC0wLjAxMSAxNi40Nyw5LjUyNSAtMy4xMjMsNjguNjkgMTAuNDA3LC0xMC40MDcgLTQuMTYzLDQwLjU5IDIyLjE3Myw3MS41MDIgLTM0LjY2Miw5MS44OTkgMTYuNjUyLC00LjE2MiAtMTkuNzczLDM1LjM4NiAtNDAuNTkxLDM4LjUwOSA5LjM2OCwxNy42OTMgLTkzLjY3MSw5LjM2OCAtMjAuMjI5LC03LjE2NSAtMTguNDM3LDM4LjI5MiAxMy4yMiw4LjgxMyAtNjkuMDM5LDE0LjY5IDIuOTM4LDE5LjA5NSAtODAuNzkxLC0yMy4zMDMgLTI2LjE0NywtMTkuMTkxIC0xMTYuMzM5LDAgOC44MTQsLTEwLjE4OCAtNDIuNTAxLC00MC42NDEgLTguOTExLC03OC40OTEgNy4zNDQsLTEuNDk0IDguODE0LC00NS41NDggMjMuNTAyLC0yNC45NzggMTkuMDk2LDQ1LjUzMyAtMTQuNjg5LC00LjQwOSA0MS4xMyw0OC40NzQgMzAuODQ4LDI2LjQ0IC0xNC42OSwtMS40NjkgMTkuMDk2LDE2LjE1OCAxMDUuNzYzLDIuOTM4IDcyLjkxNywxNS43OTkgLTQxLjYyMywtMTQuNzQyIC0zMC4xODEsLTcuMjg1IC0xMDQuMDc5LC0xLjA0MyAxLjA0LC0xMS40NDkgLTY0LjUyNiwtNjEuNDAzIDE0LjU3MSwyLjA4MSAtMjcuODQ0LC02My4yOCBjIC0xNS4wMTcsLTEzLjcxOSAtMjguMDYsLTU1LjAxNiAtMzYuNjg3LC03NS4xNDUgLTkuMzY3LC0yMS44NTYgLTIwLjgxNiwtMzkuNTUgLTIwLjgxNiwtMzkuNTUgMCwwIC0zMC4xODIsLTYuMjQ0IC02MS40MDUsLTE4LjczNCAtMzEuMjI0LC0xMi40ODkgLTQzLjcxMyw0LjE2MyAtNDMuNzEzLDQuMTYzIGwgLTMuMTIyLC04LjMyNiBjIDAsMCAtMTguMjgsLTkuMDU3IC0zOS4zMDMsLTExLjgyNSAtMTYuNDMsLTIuMTYyIC05Ljk2NywtMjAuOTQ2IC05LjYxMywtMjYuNjg0IDAuNDA1LC02LjU3IDQuMjk0LC0xOS43NzQgOC4zMjUsLTI0Ljk3OCAzLjIyNywtNC4xNjUgMTIuNTI1LC0xMC40MjUgMTcuNjk0LC0xMS40NDggMTIuMDM5LC0yLjM4NSAyOC4xMDEsNS4yMDQgNDUuNzk0LDE3LjY5MyA3NC45MzYsLTYuMjQ1IDEwMy4yNDEsLTEwLjMyMSAxMjYuOTc0LDguMzI2IDE0LjU3MiwxMS40NDggMjkuMTQyLDIyLjg5NyA0MS42MzEsNDAuNTkgbCAtMTUuNjExLDQyLjY3MSAtOC4zMjcsLTE0LjU2OSAtNS44MDcsNDQuOTMxIDEuODQxLDE3Ljg2MyA1LjU0NywtNTEuMjM0IDcuNzg5LDkuMjU3IDM1LjM4NywtNzAuNzcyIDExLjQ0OCw0LjE2NCBjIDAsMCAxMy41MTUsLTE4LjU4MyAyMy4wNTcsLTMyLjg4MSBsIC0yNi4wMiwyNS4wMDYgLTEwLjIyNCwtNS45NjQgLTExLjA3NiwyMi4xNTIgYyAwLDAgLTEzLjM4MywtMi4zNTMgLTI0LjcyNywtMTguMDI3IC0xNS44NjIsLTIxLjkxNSAtMjMuNTAzLC0yNC42NzggLTE3LjYyNywtNzguNzM1IDUuODc2LC01NC4wNTUgMTYuNDUyLC01NC4wNTUgNjQuNjMyLC0xMjEuMDM5IDExLjc1MiwtMTYuNDUyIDE0LjYwMSwtMTguNDY1IDE0LjYwMSwtMTguNDY1IGwgLTUxLjAzLC0yNy4zNjUgLTIyLjMyNywtNS44NzYgLTIxLjM4NCwtMTEuMjggYyAwLDAgNC43NDQsLTguMTc0IDcuNDk1LC05LjM2OSA0LjczOSwtMi4wNjIgMjAuNjEzLDEuNTYgMjAuNjEzLDEuNTYgMCwwIDE1LjYwMywtNi43NjMgMzYuNzU2LC02Ljc2MyAyMS4xNTIsMCAzMi45MDMsOC4yMjUgNDcuMDA1LDguMjI1IDE0LjEwMSwwIDM4Ljc4LC04LjIyNSA1Ny41ODIsLTUuODc2IDE4LjgwMiwyLjM1MSAyMi4zMjgsMTIuOTI3IDIyLjMyOCwxMi45MjcgbCAtNTEuNzA2LDU0LjA1NyAtNC42NzUsNDcuMDk2IC01Ni42MDUsNzUuNzY5IC0zLjAzOCw5LjQzNyA2NS43OTEsLTgyLjI0IDUuMTA3LC00Ni43NSA1NS4xNjEsLTYxLjQwNSAzNy40NjgsLTguMzI1IGMgMCwwIC0wLjI1NywxLjIyNiAtMC42MjUsMy4xMTQgLTYuMTQ2LDE1LjY2NCAtNi45ODYsMzQuODk0IC0xLjk5OSw1NC4yMTQgNi45NzUsMjcuMDEyIDM4Ljg1LDM2LjU5NiA2NC4wMjksMzYuNTk2IDEyLjUwNiwwIDI0LjE3OSwtMi4zMTIgMzIuMDI1LC02LjM0MSAxMi45MTIsLTYuNjMgMjEuODUxLC0xNS4wNzYgMjcuMDI5LC0yMC45MTcgMy42NzMsNC41MTYgNy4xMzMsNy4xOTQgMTEuODMzLDExLjExIDAsMCAxMi4xNDMsLTExLjc1MSA0NS4wNDcsLTE0LjEwMSAyNy4xNCwtMS45MzkgNDUuMDQ4LC04LjIyNiA3MC45MDEsLTE5LjU4NSA1My42NzYsLTIzLjU4NCAxMDIuNSwtNjEuNzg1IDIwNy42MTgsLTQ1LjEzMiAxMDUuMTE5LDE2LjY1MSAyMDYuMDczLDExMy40NDQgMTY0LjQ0MiwyMjcuOTI5IgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBpZD0icGF0aDMyNjkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PC9nPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMzI5LjI2Mzk4LDcyMy4zMDgyIC0xMTguMDI1LC0xOS4yIC0xMjAuODAwMDAzLC0yOC4xNzUgNzIuNjAwMDAzLC0yODEuNjUgMTE1LjA3NSw3Ljg3NSA5NS4yNzUsNTAuNjUgLTQ0LjEyNSwyNzAuNSB6IG0gLTYuNTUsLTEwLjU3NSA0MC42NzUsLTI1Mi40IC04Ny44NSwtNDcuMjc1IC0xMDYuMTI1LC03LjMyNSAtNjYuOTUsMjYyLjggMTExLjQsMjYuMjc1IDEwOC44NSwxNy45MjUgeiIKICAgICAgIGlkPSJwYXRoMzI1My0zIiAvPjwvZz48L3N2Zz4=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/compress.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBDb21wcmVzc2lvbiBIZWxwZXI8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2Fuc3xEcm9pZCtTYW5zOmJvbGQiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImRvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5PgoKPGgxPjxzcGFuIGNsYXNzPSJsb2dvLWJyYWNlcyI+eyB9PC9zcGFuPiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvIj5Db2RlTWlycm9yPC9hPjwvaDE+Cgo8ZGl2IGNsYXNzPSJncmV5Ij4KPGltZyBzcmM9ImJhYm9vbi5wbmciIGNsYXNzPSJsb2dvIiBhbHQ9ImxvZ28iLz4KPHByZT4KLyogU2NyaXB0IGNvbXByZXNzaW9uCiAgIGhlbHBlciAqLwo8L3ByZT4KPC9kaXY+CgogICAgPHA+VG8gb3B0aW1pemUgbG9hZGluZyBDb2RlTWlycm9yLCBlc3BlY2lhbGx5IHdoZW4gaW5jbHVkaW5nIGEKICAgIGJ1bmNoIG9mIGRpZmZlcmVudCBtb2RlcywgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgY29tYmluZSBhbmQKICAgIG1pbmlmeSAoYW5kIHByZWZlcmFibHkgYWxzbyBnemlwKSB0aGUgc2NyaXB0cy4gVGhpcyBwYWdlIG1ha2VzCiAgICB0aG9zZSBmaXJzdCB0d28gc3RlcHMgdmVyeSBlYXN5LiBTaW1wbHkgc2VsZWN0IHRoZSB2ZXJzaW9uIGFuZAogICAgc2NyaXB0cyB5b3UgbmVlZCBpbiB0aGUgZm9ybSBiZWxvdywgYW5kCiAgICBjbGljayA8c3Ryb25nPkNvbXByZXNzPC9zdHJvbmc+IHRvIGRvd25sb2FkIHRoZSBtaW5pZmllZCBzY3JpcHQKICAgIGZpbGUuPC9wPgoKICAgIDxmb3JtIGlkPSJmb3JtIiBhY3Rpb249Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvdWdsaWZ5anMiIG1ldGhvZD0icG9zdCI+CiAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJkb3dubG9hZCIgbmFtZT0iZG93bmxvYWQiIHZhbHVlPSJjb2RlbWlycm9yLWNvbXByZXNzZWQuanMiLz4KICAgICAgPHA+VmVyc2lvbjogPHNlbGVjdCBpZD0idmVyc2lvbiIgb25jaGFuZ2U9InNldFZlcnNpb24odGhpcyk7IiBzdHlsZT0icGFkZGluZzogMXB4Ij4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvIj5IRUFEPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djMuMDtmPSI+My4wPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djMuMHJjMjtmPSI+My4wcmMyPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djMuMHJjMTtmPSI+My4wcmMxPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djMuMGJldGEyO2Y9Ij4zLjBiZXRhMjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYzLjBiZXRhMTtmPSI+My4wYmV0YTE8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4zNjtmPSI+Mi4zNjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjM1O2Y9Ij4yLjM1PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMzQ7Zj0iPjIuMzQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4zMztmPSI+Mi4zMzwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjMyO2Y9Ij4yLjMyPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMzE7Zj0iPjIuMzE8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4zO2Y9Ij4yLjM8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4yNTtmPSI+Mi4yNTwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjI0O2Y9Ij4yLjI0PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMjM7Zj0iPjIuMjM8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4yMjtmPSI+Mi4yMjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjIxO2Y9Ij4yLjIxPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMjtmPSI+Mi4yPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMTg7Zj0iPjIuMTg8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4xNjtmPSI+Mi4xNjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjE1O2Y9Ij4yLjE1PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMTM7Zj0iPjIuMTM8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4xMjtmPSI+Mi4xMjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjExO2Y9Ij4yLjExPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMTtmPSI+Mi4xPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMDI7Zj0iPjIuMDI8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4wMTtmPSI+Mi4wMTwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjA7Zj0iPjIuMDwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPWJldGEyO2Y9Ij5iZXRhMjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPWJldGExO2Y9Ij5iZXRhMTwvb3B0aW9uPgogICAgICA8L3NlbGVjdD48L3A+CgogICAgICA8c2VsZWN0IG11bHRpcGxlPSJtdWx0aXBsZSIgc2l6ZT0iMjAiIG5hbWU9ImNvZGVfdXJsIiBzdHlsZT0id2lkdGg6IDQwZW07IiBjbGFzcz0iZmllbGQiIGlkPSJmaWxlcyI+CiAgICAgICAgPG9wdGdyb3VwIGxhYmVsPSJDb2RlTWlycm9yIExpYnJhcnkiPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2xpYi9jb2RlbWlycm9yLmpzIiBzZWxlY3RlZD5jb2RlbWlycm9yLmpzPC9vcHRpb24+CiAgICAgICAgPC9vcHRncm91cD4KICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9Ik1vZGVzIj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NsaWtlL2NsaWtlLmpzIj5jbGlrZS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY2xvanVyZS9jbG9qdXJlLmpzIj5jbG9qdXJlLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jb2ZmZWVzY3JpcHQvY29mZmVlc2NyaXB0LmpzIj5jb2ZmZWVzY3JpcHQuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NvbW1vbmxpc3AvY29tbW9ubGlzcC5qcyI+Y29tbW9ubGlzcC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY3NzL2Nzcy5qcyI+Y3NzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9kaWZmL2RpZmYuanMiPmRpZmYuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2VjbC9lY2wuanMiPmVjbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZXJsYW5nL2VybGFuZy5qcyI+ZXJsYW5nLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9nZm0vZ2ZtLmpzIj5nZm0uanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2dvL2dvLmpzIj5nby5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZ3Jvb3Z5L2dyb292eS5qcyI+Z3Jvb3Z5LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9oYXNrZWxsL2hhc2tlbGwuanMiPmhhc2tlbGwuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2hheGUvaGF4ZS5qcyI+aGF4ZS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvaHRtbGVtYmVkZGVkL2h0bWxlbWJlZGRlZC5qcyI+aHRtbGVtYmVkZGVkLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj5odG1sbWl4ZWQuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2h0dHAvaHR0cC5qcyI+aHR0cC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj5qYXZhc2NyaXB0LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9qaW5qYTIvamluamEyLmpzIj5qaW5qYTIuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2xlc3MvbGVzcy5qcyI+bGVzcy5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbHVhL2x1YS5qcyI+bHVhLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcyI+bWFya2Rvd24uanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL215c3FsL215c3FsLmpzIj5teXNxbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbnRyaXBsZXMvbnRyaXBsZXMuanMiPm50cmlwbGVzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9vY2FtbC9vY2FtbC5qcyI+b2NhbWwuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Bhc2NhbC9wYXNjYWwuanMiPnBhc2NhbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcGVybC9wZXJsLmpzIj5wZXJsLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9waHAvcGhwLmpzIj5waHAuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3BpZy9waWcuanMiPnBpZy5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcGxzcWwvcGxzcWwuanMiPnBsc3FsLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuanMiPnByb3BlcnRpZXMuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3B5dGhvbi9weXRob24uanMiPnB5dGhvbi5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvci9yLmpzIj5yLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9ycG0vY2hhbmdlcy9jaGFuZ2VzLmpzIj5ycG0vY2hhbmdlcy5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcnBtL3NwZWMvc3BlYy5qcyI+cnBtL3NwZWMuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3JzdC9yc3QuanMiPnJzdC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcnVieS9ydWJ5LmpzIj5ydWJ5LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9ydXN0L3J1c3QuanMiPnJ1c3QuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NjaGVtZS9zY2hlbWUuanMiPnNjaGVtZS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc2hlbGwvc2hlbGwuanMiPnNoZWxsLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zaWV2ZS9zaWV2ZS5qcyI+c2lldmUuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NtYWxsdGFsay9zbWFsbHRhbGsuanMiPnNtYWxsdGFsay5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc21hcnR5L3NtYXJ0eS5qcyI+c21hcnR5LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zcGFycWwvc3BhcnFsLmpzIj5zcGFycWwuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3N0ZXgvc3RleC5qcyI+c3RleC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdGlkZGx5d2lraS90aWRkbHl3aWtpLmpzIj50aWRkbHl3aWtpLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS90aWtpL3Rpa2kuanMiPnRpa2kuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3ZiL3ZiLmpzIj52Yi5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdmJzY3JpcHQvdmJzY3JpcHQuanMiPnZic2NyaXB0LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS92ZWxvY2l0eS92ZWxvY2l0eS5qcyI+dmVsb2NpdHkuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Zlcmlsb2cvdmVyaWxvZy5qcyI+dmVyaWxvZy5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUveG1sL3htbC5qcyI+eG1sLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS94cXVlcnkveHF1ZXJ5LmpzIj54cXVlcnkuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3lhbWwveWFtbC5qcyI+eWFtbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvejgwL3o4MC5qcyI+ejgwLmpzPC9vcHRpb24+CiAgICAgICAgPC9vcHRncm91cD4KICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9IlV0aWxpdGllcyBhbmQgYWRkLW9ucyI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbGliL3V0aWwvb3ZlcmxheS5qcyI+b3ZlcmxheS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2xpYi91dGlsL211bHRpcGxleC5qcyI+bXVsdGlwbGV4LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbGliL3V0aWwvcnVubW9kZS5qcyI+cnVubW9kZS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2xpYi91dGlsL3NpbXBsZS1oaW50LmpzIj5zaW1wbGUtaGludC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2xpYi91dGlsL2phdmFzY3JpcHQtaGludC5qcyI+amF2YXNjcmlwdC1oaW50LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbGliL3V0aWwveG1sLWhpbnQuanMiPnhtbC1oaW50LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbGliL3V0aWwvZm9sZGNvZGUuanMiPmZvbGRjb2RlLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbGliL3V0aWwvZGlhbG9nLmpzIj5kaWFsb2cuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9saWIvdXRpbC9zZWFyY2guanMiPnNlYXJjaC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2xpYi91dGlsL3NlYXJjaGN1cnNvci5qcyI+c2VhcmNoY3Vyc29yLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+bWF0Y2hicmFja2V0cy5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2xpYi91dGlsL2Zvcm1hdHRpbmcuanMiPmZvcm1hdHRpbmcuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9saWIvdXRpbC9tYXRjaC1oaWdobGlnaHRlci5qcyI+bWF0Y2gtaGlnaGxpZ2h0ZXIuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9saWIvdXRpbC9jbG9zZXRhZy5qcyI+Y2xvc2V0YWcuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9saWIvdXRpbC9sb2FkbW9kZS5qcyI+bG9hZG1vZGUuanM8L29wdGlvbj4KICAgICAgICA8L29wdGdyb3VwPgogICAgICAgIDxvcHRncm91cCBsYWJlbD0iS2V5bWFwcyI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQva2V5bWFwL2VtYWNzLmpzIj5lbWFjcy5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2tleW1hcC92aW0uanMiPnZpbS5qczwvb3B0aW9uPgogICAgICAgIDwvb3B0Z3JvdXA+CiAgICAgIDwvc2VsZWN0PjwvcD4KCiAgICAgIDxwPgogICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0Ij5Db21wcmVzczwvYnV0dG9uPiB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL21pc2hvby9VZ2xpZnlKUy8iPlVnbGlmeUpTPC9hPgogICAgICA8L3A+CgogICAgICA8cD5DdXN0b20gY29kZSB0byBhZGQgdG8gdGhlIGNvbXByZXNzZWQgZmlsZTo8dGV4dGFyZWEgbmFtZT0ianNfY29kZSIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDE1ZW07IiBjbGFzcz0iZmllbGQiPjwvdGV4dGFyZWE+PC9wPgogICAgPC9mb3JtPgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgZnVuY3Rpb24gc2V0VmVyc2lvbih2ZXIpIHsKICAgICAgICB2YXIgdXJscHJlZml4ID0gdmVyLm9wdGlvbnNbdmVyLnNlbGVjdGVkSW5kZXhdLnZhbHVlOwogICAgICAgIHZhciBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmlsZXMiKSwgbTsKICAgICAgICBmb3IgKHZhciBvcHRnciA9IHNlbGVjdC5maXJzdENoaWxkOyBvcHRncjsgb3B0Z3IgPSBvcHRnci5uZXh0U2libGluZykKICAgICAgICAgIGZvciAodmFyIG9wdCA9IG9wdGdyLmZpcnN0Q2hpbGQ7IG9wdDsgb3B0ID0gb3B0Lm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIGlmIChvcHQubm9kZU5hbWUgIT0gIk9QVElPTiIpCiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGVsc2UgaWYgKG0gPSBvcHQudmFsdWUubWF0Y2goL15odHRwOlwvXC9jb2RlbWlycm9yLm5ldFwvKC4qKSQvKSkKICAgICAgICAgICAgICBvcHQudmFsdWUgPSB1cmxwcmVmaXggKyBtWzFdOwogICAgICAgICAgICBlbHNlIGlmIChtID0gb3B0LnZhbHVlLm1hdGNoKC9odHRwOlwvXC9tYXJpam5oYXZlcmJla2UubmxcL2dpdFwvY29kZW1pcnJvclw/YT1ibG9iX3BsYWluO2hiPVteO10rO2Y9KC4qKSQvKSkKICAgICAgICAgICAgICBvcHQudmFsdWUgPSB1cmxwcmVmaXggKyBtWzFdOwogICAgICAgICAgfQogICAgICAgfQogICAgPC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/docs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ym9keSB7CiAgZm9udC1mYW1pbHk6IERyb2lkIFNhbnMsIEFyaWFsLCBzYW5zLXNlcmlmOwogIGxpbmUtaGVpZ2h0OiAxLjU7CiAgbWF4LXdpZHRoOiA2NC4zZW07CiAgbWFyZ2luOiAzZW0gYXV0bzsKICBwYWRkaW5nOiAwIDFlbTsKfQoKaDEgewogIGxldHRlci1zcGFjaW5nOiAtM3B4OwogIGZvbnQtc2l6ZTogMy4yM2VtOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIG1hcmdpbjogMDsKfQoKaDIgewogIGZvbnQtc2l6ZTogMS4yM2VtOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIG1hcmdpbjogLjVlbSAwOwogIGxldHRlci1zcGFjaW5nOiAtMXB4Owp9CgpoMyB7CiAgZm9udC1zaXplOiAxZW07CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbWFyZ2luOiAuNGVtIDA7Cn0KCnByZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKICAtbW96LWJvcmRlci1yYWRpdXM6IDZweDsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDZweDsKICBib3JkZXItcmFkaXVzOiA2cHg7CiAgcGFkZGluZzogMWVtOwp9CgpwcmUuY29kZSB7CiAgbWFyZ2luOiAwIDFlbTsKfQoKLmdyZXkgewogIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIG1hcmdpbi1ib3R0b206IDEuNjVlbTsKICBtYXJnaW4tdG9wOiAwLjgyNWVtOwogIHBhZGRpbmc6IDAuODI1ZW0gMS42NWVtOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKaW1nLmxvZ28gewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogLTFlbTsKICBib3R0b206IDRweDsKICBtYXgtd2lkdGg6IDIzLjY4NzVlbTsgLyogU2NhbGUgaW1hZ2UgZG93biB3aXRoIHRleHQgdG8gcHJldmVudCBjbGlwcGluZyAqLwp9CgouZ3JleSA+IHByZSB7CiAgYmFja2dyb3VuZDpub25lOwogIGJvcmRlci1yYWRpdXM6MDsKICBwYWRkaW5nOjA7CiAgbWFyZ2luOjA7CiAgZm9udC1zaXplOjIuMmVtOwogIGxpbmUtaGVpZ2h0OjEuMmVtOwp9CgphOmxpbmssIGE6dmlzaXRlZCwgLnF1YXNpbGluayB7CiAgY29sb3I6ICNkZjAwMTk7CiAgY3Vyc29yOiBwb2ludGVyOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKYTpob3ZlciwgLnF1YXNpbGluazpob3ZlciB7CiAgY29sb3I6ICM4MDAwMDQ7Cn0KCmgxIGE6bGluaywgaDEgYTp2aXNpdGVkLCBoMSBhOmhvdmVyIHsKICBjb2xvcjogYmxhY2s7Cn0KCnVsIHsKICBtYXJnaW46IDA7CiAgcGFkZGluZy1sZWZ0OiAxLjJlbTsKfQoKYS5kb3dubG9hZCB7CiAgY29sb3I6IHdoaXRlOwogIGJhY2tncm91bmQtY29sb3I6ICNkZjAwMTk7CiAgd2lkdGg6IDEwMCU7CiAgZGlzcGxheTogYmxvY2s7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGZvbnQtc2l6ZTogMS4yM2VtOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAtbW96LWJvcmRlci1yYWRpdXM6IDZweDsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDZweDsKICBib3JkZXItcmFkaXVzOiA2cHg7CiAgcGFkZGluZzogLjVlbSAwOwogIG1hcmdpbi1ib3R0b206IDFlbTsKfQoKYS5kb3dubG9hZDpob3ZlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2JiMDAxMDsKfQoKLnJlbCB7CiAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLnJlbC1ub3RlIHsKICBjb2xvcjogIzc3NzsKICBmb250LXNpemU6IC45ZW07CiAgbWFyZ2luLXRvcDogLjFlbTsKfQoKLmxvZ28tYnJhY2VzIHsKICBjb2xvcjogI2RmMDAxOTsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdG9wOiAtNHB4Owp9CgouYmxrIHsKICBmbG9hdDogbGVmdDsKfQoKLmxlZnQgewogIG1hcmdpbi1yaWdodDogMjAuNjhlbTsKICBtYXgtd2lkdGg6IDM3ZW07CiAgcGFkZGluZy1yaWdodDogNi41M2VtOwogIHBhZGRpbmctYm90dG9tOiAxZW07Cn0KCi5sZWZ0MSB7CiAgd2lkdGg6IDE1LjI0ZW07CiAgcGFkZGluZy1yaWdodDogNi40NWVtOwp9CgoubGVmdDIgewogIG1heC13aWR0aDogMTUuMjRlbTsKfQoKLnJpZ2h0IHsKICB3aWR0aDogMjAuNjhlbTsKICBtYXJnaW4tbGVmdDogLTIwLjY4ZW07Cn0KCi5sZWZ0YmlnIHsKICB3aWR0aDogNDIuNDRlbTsKICBwYWRkaW5nLXJpZ2h0OiA2LjUzZW07Cn0KCi5yaWdodHNtYWxsIHsKICB3aWR0aDogMTUuMjRlbTsKfQoKLmNsZWFyOmFmdGVyIHsKICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgZGlzcGxheTogYmxvY2s7CiAgZm9udC1zaXplOiAwOwogIGNvbnRlbnQ6ICIgIjsKICBjbGVhcjogYm90aDsKICBoZWlnaHQ6IDA7Cn0KLmNsZWFyIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9Ci8qIHN0YXJ0IGNvbW1lbnRlZCBiYWNrc2xhc2ggaGFjayBcKi8KKiBodG1sIC5jbGVhciB7IGhlaWdodDogMSU7IH0KLmNsZWFyIHsgZGlzcGxheTogYmxvY2s7IH0KLyogY2xvc2UgY29tbWVudGVkIGJhY2tzbGFzaCBoYWNrICovCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/internals.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBJbnRlcm5hbHM8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2Fuc3xEcm9pZCtTYW5zOmJvbGQiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImRvY3MuY3NzIi8+CiAgICA8c3R5bGU+ZGwgZGwge21hcmdpbjogMDt9IC51cGRhdGUge2NvbG9yOiAjZDQwICFpbXBvcnRhbnR9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+Cgo8aDE+PHNwYW4gY2xhc3M9ImxvZ28tYnJhY2VzIj57IH08L3NwYW4+IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC8iPkNvZGVNaXJyb3I8L2E+PC9oMT4KCjxkaXYgY2xhc3M9ImdyZXkiPgo8aW1nIHNyYz0iYmFib29uLnBuZyIgY2xhc3M9ImxvZ28iIGFsdD0ibG9nbyIvPgo8cHJlPgovKiAoUmUtKSBJbXBsZW1lbnRpbmcgQSBTeW50YXgtCiAgIEhpZ2hsaWdodGluZyBFZGl0b3IgaW4gSmF2YVNjcmlwdCAqLwo8L3ByZT4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJjbGVhciI+PGRpdiBjbGFzcz0ibGVmdGJpZyBibGsiPgoKPHAgc3R5bGU9ImZvbnQtc2l6ZTogODUlIiBpZD0iaW50cm8iPgogIDxzdHJvbmc+VG9waWM6PC9zdHJvbmc+IEphdmFTY3JpcHQsIGNvZGUgZWRpdG9yIGltcGxlbWVudGF0aW9uPGJyPgogIDxzdHJvbmc+QXV0aG9yOjwvc3Ryb25nPiBNYXJpam4gSGF2ZXJiZWtlPGJyPgogIDxzdHJvbmc+RGF0ZTo8L3N0cm9uZz4gTWFyY2ggMm5kIDIwMTEgKHVwZGF0ZWQgTm92ZW1iZXIgMTN0aCAyMDExKQo8L3A+Cgo8cCBzdHlsZT0icGFkZGluZzogMCAzZW0gMCAyZW0iPjxzdHJvbmc+Q2F1dGlvbjwvc3Ryb25nPjogdGhpcyB0ZXh0IHdhcyB3cml0dGVuIGJyaWVmbHkgYWZ0ZXIKdmVyc2lvbiAyIHdhcyBpbml0aWFsbHkgd3JpdHRlbi4gSXQgbm8gbG9uZ2VyIChldmVuIGluY2x1ZGluZyB0aGUKdXBkYXRlIGF0IHRoZSBib3R0b20pIGZ1bGx5IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uIEknbQpsZWF2aW5nIGl0IGhlcmUgYXMgYSBoaXN0b3JpYyBkb2N1bWVudC4gRm9yIG1vcmUgdXAtdG8tZGF0ZQppbmZvcm1hdGlvbiwgbG9vayBhdCB0aGUgZW50cmllcwp0YWdnZWQgPGEgaHJlZj0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9ibG9nLyNjbS1pbnRlcm5hbHMiPmNtLWludGVybmFsczwvYT4Kb24gbXkgYmxvZy48L3A+Cgo8cD5UaGlzIGlzIGEgZm9sbG93dXAgdG8KbXkgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L3N0b3J5Lmh0bWwiPkJydXRhbCBPZHlzc2V5IHRvIHRoZQpEYXJrIFNpZGUgb2YgdGhlIERPTSBUcmVlPC9hPiBzdG9yeS4gVGhhdCBvbmUgZGVzY3JpYmVzIHRoZQptaW5kLWJlbmRpbmcgcHJvY2VzcyBvZiBpbXBsZW1lbnRpbmcgKHdoYXQgd291bGQgYmVjb21lKSBDb2RlTWlycm9yIDEuClRoaXMgb25lIGRlc2NyaWJlcyB0aGUgaW50ZXJuYWxzIG9mIENvZGVNaXJyb3IgMiwgYSBjb21wbGV0ZSByZXdyaXRlCmFuZCByZXRoaW5rIG9mIHRoZSBvbGQgY29kZSBiYXNlLiBJIHdhbnRlZCB0byBnaXZlIHRoaXMgcGllY2UgYW5vdGhlcgpIdW50ZXIgVGhvbXBzb24gY29weWNhdCBzdWJ0aXRsZSwgYnV0IHNvbWVob3cgdGhhdCB3b3VsZCBiZSBvdXQgb2YKcGxhY2XigJR0aGUgcHJvY2VzcyB0aGlzIHRpbWUgYXJvdW5kIHdhcyBvbmUgb2Ygc3RyYWlnaHRmb3J3YXJkCmVuZ2luZWVyaW5nLCByZXF1aXJpbmcgbm8gc2VyaW91cyBtaW5kLWJlbmRpbmcgd2hhdHNvZXZlci48L3A+Cgo8cD5Tbywgd2hhdCBpcyB3cm9uZyB3aXRoIENvZGVNaXJyb3IgMT8gSSdkIGVzdGltYXRlLCBieSBtYWlsaW5nIGxpc3QKYWN0aXZpdHkgYW5kIGdlbmVyYWwgc2VhcmNoLWVuZ2luZSBwcmVzZW5jZSwgdGhhdCBpdCBoYXMgYmVlbgppbnRlZ3JhdGVkIGludG8gYWJvdXQgYSB0aG91c2FuZCBzeXN0ZW1zIGJ5IG5vdy4gVGhlIG1vc3QgcHJvbWluZW50Cm9uZSwgc2luY2UgYSBmZXcgd2Vla3MsCmJlaW5nIDxhIGhyZWY9Imh0dHA6Ly9nb29nbGVjb2RlLmJsb2dzcG90LmNvbS8yMDExLzAxL21ha2UtcXVpY2stZml4ZXMtcXVpY2tlci1vbi1nb29nbGUuaHRtbCI+R29vZ2xlCmNvZGUncyBwcm9qZWN0IGhvc3Rpbmc8L2E+LiBJdCB3b3JrcywgYW5kIGl0J3MgYmVpbmcgdXNlZCB3aWRlbHkuPC9hPgoKPHA+U3RpbGwsIEkgZGlkIG5vdCBzdGFydCByZXBsYWNpbmcgaXQgYmVjYXVzZSBJIHdhcyBib3JlZC4gQ29kZU1pcnJvcgoxIHdhcyBoZWF2aWx5IHJlbGlhbnQgb24gPGNvZGU+ZGVzaWduTW9kZTwvY29kZT4Kb3IgPGNvZGU+Y29udGVudEVkaXRhYmxlPC9jb2RlPiAoZGVwZW5kaW5nIG9uIHRoZSBicm93c2VyKS4gTmVpdGhlciBvZgp0aGVzZSBhcmUgd2VsbCBzcGVjaWZpZWQgKEhUTUw1IHRyaWVzCnRvIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VkaXRpbmcuaHRtbCNjb250ZW50ZWRpdGFibGUiPnNwZWNpZnk8L2E+CnRoZWlyIGJhc2ljcyksIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgdGhleSB0ZW5kIHRvIGJlIG9uZSBvZiB0aGUgbW9yZQpvYnNjdXJlIGFuZCBidWdneSBhcmVhcyBvZiBicm93c2VyIGZ1bmN0aW9uYWxpdHnigJRDb2RlTWlycm9yLCBieSB1c2luZwp0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYSBub24tdHlwaWNhbCB3YXksIHdhcyBjb25zdGFudGx5IHJ1bm5pbmcgdXAKYWdhaW5zdCBicm93c2VyIGJ1Z3MuIFdlYktpdCB3b3VsZG4ndCBzaG93IGFuIGVtcHR5IGxpbmUgYXQgdGhlIGVuZCBvZgp0aGUgZG9jdW1lbnQsIGFuZCBpbiBzb21lIHJlbGVhc2VzIHdvdWxkIHN1ZGRlbmx5IGdldCB1bmJlYXJhYmx5IHNsb3cuCkZpcmVmb3ggd291bGQgc2hvdyB0aGUgY3Vyc29yIGluIHRoZSB3cm9uZyBwbGFjZS4gSW50ZXJuZXQgRXhwbG9yZXIKd291bGQgaW5zaXN0IG9uIGxpbmtpZnlpbmcgZXZlcnl0aGluZyB0aGF0IGxvb2tlZCBsaWtlIGEgVVJMIG9yIGVtYWlsCmFkZHJlc3MsIGEgYmVoYXZpb3VyIHRoYXQgY2FuJ3QgYmUgdHVybmVkIG9mZi4gU29tZSBidWdzIEkgbWFuYWdlZCB0bwp3b3JrIGFyb3VuZCAod2hpY2ggd2FzIG9mdGVuIGEgZnJ1c3RyYXRpbmcsIHBhaW5mdWwgcHJvY2VzcyksIG90aGVycywKc3VjaCBhcyB0aGUgRmlyZWZveCBjdXJzb3IgcGxhY2VtZW50LCBJIGdhdmUgdXAgb24sIGFuZCBoYWQgdG8gdGVsbAp1c2VyIGFmdGVyIHVzZXIgdGhhdCB0aGV5IHdlcmUga25vd24gcHJvYmxlbXMsIGJ1dCBub3Qgc29tZXRoaW5nIEkKY291bGQgaGVscC48L3A+Cgo8cD5BbHNvLCB0aGVyZSBpcyB0aGUgZmFjdCB0aGF0IDxjb2RlPmRlc2lnbk1vZGU8L2NvZGU+ICh3aGljaCBzZWVtZWQKdG8gYmUgbGVzcyBidWdneSB0aGFuIDxjb2RlPmNvbnRlbnRFZGl0YWJsZTwvY29kZT4gaW4gV2Via2l0IGFuZApGaXJlZm94LCBhbmQgd2FzIHRodXMgdXNlZCBieSBDb2RlTWlycm9yIDEgaW4gdGhvc2UgYnJvd3NlcnMpIHJlcXVpcmVzCmEgZnJhbWUuIEZyYW1lcyBhcmUgYW5vdGhlciB0cmlja3kgYXJlYS4gSXQgdGFrZXMgc29tZSBlZmZvcnQgdG8KcHJldmVudCBnZXR0aW5nIHRyaXBwZWQgdXAgYnkgZG9tYWluIHJlc3RyaWN0aW9ucywgdGhleSBkb24ndAppbml0aWFsaXplIHN5bmNocm9ub3VzbHksIGJlaGF2ZSBzdHJhbmdlbHkgaW4gcmVzcG9uc2UgdG8gdGhlIGJhY2sKYnV0dG9uLCBhbmQsIG9uIHNldmVyYWwgYnJvd3NlcnMsIGNhbid0IGJlIG1vdmVkIGFyb3VuZCB0aGUgRE9NCndpdGhvdXQgaGF2aW5nIHRoZW0gcmUtaW5pdGlhbGl6ZS4gVGhleSBkaWQgcHJvdmlkZSBhIHZlcnkgbmljZSB3YXkgdG8KbmFtZXNwYWNlIHRoZSBsaWJyYXJ5LCB0aG91Z2jigJRDb2RlTWlycm9yIDEgY291bGQgZnJlZWx5IHBvbGx1dGUgdGhlCm5hbWVzcGFjZSBpbnNpZGUgdGhlIGZyYW1lLjwvcD4KCjxwPkZpbmFsbHksIHdvcmtpbmcgd2l0aCBhbiBlZGl0YWJsZSBkb2N1bWVudCBtZWFucyB3b3JraW5nIHdpdGgKc2VsZWN0aW9uIGluIGFyYml0cmFyeSBET00gc3RydWN0dXJlcy4gSW50ZXJuZXQgRXhwbG9yZXIgKDggYW5kCmJlZm9yZSkgaGFzIGFuIHV0dGVybHkgZGlmZmVyZW50IChhbmQgYXdrd2FyZCkgc2VsZWN0aW9uIEFQSSB0aGFuIGFsbApvZiB0aGUgb3RoZXIgYnJvd3NlcnMsIGFuZCBldmVuIGFtb25nIHRoZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mCjxjb2RlPmRvY3VtZW50LnNlbGVjdGlvbjwvY29kZT4sIGRldGFpbHMgYWJvdXQgaG93IGV4YWN0bHkgYSBzZWxlY3Rpb24KaXMgcmVwcmVzZW50ZWQgdmFyeSBxdWl0ZSBhIGJpdC4gQWRkIHRvIHRoYXQgdGhlIGZhY3QgdGhhdCBPcGVyYSdzCnNlbGVjdGlvbiBzdXBwb3J0IHRlbmRlZCB0byBiZSB2ZXJ5IGJ1Z2d5IHVudGlsIHJlY2VudGx5LCBhbmQgeW91IGNhbgppbWFnaW5lIHdoeSBDb2RlTWlycm9yIDEgY29udGFpbnMgNzAwIGxpbmVzIG9mIHNlbGVjdGlvbi1oYW5kbGluZwpjb2RlLjwvcD4KCjxwPkFuZCB0aGF0IGJyaW5ncyB1cyB0byB0aGUgbWFpbiBpc3N1ZSB3aXRoIHRoZSBDb2RlTWlycm9yIDEKY29kZSBiYXNlOiBUaGUgcHJvcG9ydGlvbiBvZiBicm93c2VyLWJ1Zy13b3JrYXJvdW5kcyB0byByZWFsCmFwcGxpY2F0aW9uIGNvZGUgd2FzIGdldHRpbmcgZGFuZ2Vyb3VzbHkgaGlnaC4gQnkgYnVpbGRpbmcgb24gdG9wIG9mIGEKZmV3IGRvZGd5IGZlYXR1cmVzLCBJIHB1dCB0aGUgc3lzdGVtIGluIGEgdnVsbmVyYWJsZSBwb3NpdGlvbuKAlGFueQppbmNvbXBhdGliaWxpdHkgYW5kIGJ1Z2dpbmVzcyBpbiB0aGVzZSBmZWF0dXJlcywgSSBoYWQgdG8gcGFwZXIgb3Zlcgp3aXRoIG15IG93biBjb2RlLiBOb3Qgb25seSBkaWQgSSBoYXZlIHRvIGRvIHNvbWUgc2VyaW91cyBzdHVudC13b3JrIHRvCmdldCBpdCB0byB3b3JrIG9uIG9sZGVyIGJyb3dzZXJzIChhcyBkZXRhaWxlZCBpbiB0aGUKcHJldmlvdXMgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L3N0b3J5Lmh0bWwiPnN0b3J5PC9hPiksIHRoaW5ncwphbHNvIGtlcHQgYnJlYWtpbmcgaW4gbmV3bHkgcmVsZWFzZWQgdmVyc2lvbnMsIHJlcXVpcmluZyBtZSB0byBjb21lIHVwCndpdGggPGVtPm5ldzwvZW0+IHNjYXJ5IGhhY2tzIGluIG9yZGVyIHRvIGtlZXAgdXAuIFRoaXMgd2FzIHN0YXJ0aW5nCnRvIGxvc2UgaXRzIGFwcGVhbC48L3A+Cgo8aDIgaWQ9ImFwcHJvYWNoIj5HZW5lcmFsIEFwcHJvYWNoPC9oMj4KCjxwPldoYXQgQ29kZU1pcnJvciAyIGRvZXMgaXMgdHJ5IHRvIHNpZGVzdGVwIG1vc3Qgb2YgdGhlIGhhaXJ5IGhhY2tzCnRoYXQgY2FtZSB1cCBpbiB2ZXJzaW9uIDEuIEkgb3dlIGEgbG90IHRvIHRoZQo8YSBocmVmPSJodHRwOi8vYWNlLmFqYXgub3JnIj5BQ0U8L2E+IGVkaXRvciBmb3IgaW5zcGlyYXRpb24gb24gaG93IHRvCmFwcHJvYWNoIHRoaXMuPC9wPgoKPHA+SSBhYnNvbHV0ZWx5IGRpZCBub3Qgd2FudCB0byBiZSBjb21wbGV0ZWx5IHJlbGlhbnQgb24ga2V5IGV2ZW50cyB0bwpnZW5lcmF0ZSBteSBpbnB1dC4gRXZlcnkgSmF2YVNjcmlwdCBwcm9ncmFtbWVyIGtub3dzIHRoYXQga2V5IGV2ZW50CmluZm9ybWF0aW9uIGlzIGhvcnJpYmxlIGFuZCBpbmNvbXBsZXRlLiBTb21lIHBlb3BsZSAobW9zdCBhd2Vzb21lbHkKTWloYWkgQmF6b24gd2l0aCA8YSBocmVmPSJodHRwOi8veW1hY3Mub3JnIj5ZbWFjczwvYT4pIGhhdmUgYmVlbiBhYmxlCnRvIGJ1aWxkIG1vcmUgb3IgbGVzcyBmdW5jdGlvbmluZyBlZGl0b3JzIGJ5IGRpcmVjdGx5IHJlYWRpbmcga2V5CmV2ZW50cywgYnV0IGl0IHRha2VzIGEgbG90IG9mIHdvcmsgKHRoZSBraW5kIG9mIG5ldmVyLWVuZGluZywgZnJhZ2lsZQp3b3JrIEkgZGVzY3JpYmVkIGVhcmxpZXIpLCBhbmQgd2lsbCBuZXZlciBiZSBhYmxlIHRvIHByb3Blcmx5IHN1cHBvcnQKdGhpbmdzIGxpa2UgbXVsdGkta2V5c3Rva2UgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIKaW5wdXQuIDxhIGhyZWY9IiNrZXltYXAiIGNsYXNzPSJ1cGRhdGUiPltzZWUgYmVsb3cgZm9yIGNhdmVhdF08L2E+PC9wPgoKPHA+U28gd2hhdCBJIGRvIGlzIGZvY3VzIGEgaGlkZGVuIHRleHRhcmVhLCBhbmQgbGV0IHRoZSBicm93c2VyCmJlbGlldmUgdGhhdCB0aGUgdXNlciBpcyB0eXBpbmcgaW50byB0aGF0LiBXaGF0IHdlIHNob3cgdG8gdGhlIHVzZXIgaXMKYSBET00gc3RydWN0dXJlIHdlIGJ1aWx0IHRvIHJlcHJlc2VudCBoaXMgZG9jdW1lbnQuIElmIHRoaXMgaXMgdXBkYXRlZApxdWlja2x5IGVub3VnaCwgYW5kIHNob3dzIHNvbWUga2luZCBvZiBiZWxpZXZhYmxlIGN1cnNvciwgaXQgZmVlbHMKbGlrZSBhIHJlYWwgdGV4dC1pbnB1dCBjb250cm9sLjwvcD4KCjxwPkFub3RoZXIgYmlnIHdpbiBpcyB0aGF0IHRoaXMgRE9NIHJlcHJlc2VudGF0aW9uIGRvZXMgbm90IGhhdmUgdG8Kc3BhbiB0aGUgd2hvbGUgZG9jdW1lbnQuIFNvbWUgQ29kZU1pcnJvciAxIHVzZXJzIGluc2lzdGVkIHRoYXQgdGhleQpuZWVkZWQgdG8gcHV0IGEgMzAgdGhvdXNhbmQgbGluZSBYTUwgZG9jdW1lbnQgaW50byBDb2RlTWlycm9yLiBQdXR0aW5nCmFsbCB0aGF0IGludG8gdGhlIERPTSB0YWtlcyBhIHdoaWxlLCBlc3BlY2lhbGx5IHNpbmNlLCBmb3Igc29tZQpyZWFzb24sIGFuIGVkaXRhYmxlIERPTSB0cmVlIGlzIHNsb3dlciB0aGFuIGEgbm9ybWFsIG9uZSBvbiBtb3N0CmJyb3dzZXJzLiBJZiB3ZSBoYXZlIGZ1bGwgY29udHJvbCBvdmVyIHdoYXQgd2Ugc2hvdywgd2UgbXVzdCBvbmx5CmVuc3VyZSB0aGF0IHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGFkZGVkLCBhbmQgY2FuCmRvIHRoZSByZXN0IG9ubHkgd2hlbiBuZWVkZWQuIChGb3J0dW5hdGVseSwgdGhlIDxjb2RlPm9uc2Nyb2xsPC9jb2RlPgpldmVudCB3b3JrcyBhbG1vc3QgdGhlIHNhbWUgb24gYWxsIGJyb3dzZXJzLCBhbmQgbGVuZHMgaXRzZWxmIHdlbGwgdG8KZGlzcGxheWluZyB0aGluZ3Mgb25seSBhcyB0aGV5IGFyZSBzY3JvbGxlZCBpbnRvIHZpZXcuKTwvcD4KCjxoMiBpZD0iaW5wdXQiPklucHV0PC9oMj4KCjxwPkFDRSB1c2VzIGl0cyBoaWRkZW4gdGV4dGFyZWEgb25seSBhcyBhIHRleHQgaW5wdXQgc2hpbSwgYW5kIGRvZXMKYWxsIGN1cnNvciBtb3ZlbWVudCBhbmQgdGhpbmdzIGxpa2UgdGV4dCBkZWxldGlvbiBpdHNlbGYgYnkgZGlyZWN0bHkKaGFuZGxpbmcga2V5IGV2ZW50cy4gQ29kZU1pcnJvcidzIHdheSBpcyB0byBsZXQgdGhlIGJyb3dzZXIgZG8gaXRzCnRoaW5nIGFzIG11Y2ggYXMgcG9zc2libGUsIGFuZCBub3QsIGZvciBleGFtcGxlLCBkZWZpbmUgaXRzIG93biBzZXQgb2YKa2V5IGJpbmRpbmdzLiBPbmUgd2F5IHRvIGRvIHRoaXMgd291bGQgaGF2ZSBiZWVuIHRvIGhhdmUgdGhlIHdob2xlCmRvY3VtZW50IGluc2lkZSB0aGUgaGlkZGVuIHRleHRhcmVhLCBhbmQgYWZ0ZXIgZWFjaCBrZXkgZXZlbnQgdXBkYXRlCnRoZSBkaXNwbGF5IERPTSB0byByZWZsZWN0IHdoYXQncyBpbiB0aGF0IHRleHRhcmVhLjwvcD4KCjxwPlRoYXQnZCBiZSBzaW1wbGUsIGJ1dCBpdCBpcyBub3QgcmVhbGlzdGljLiBGb3IgZXZlbiBtZWRpdW0tc2l6ZWQKZG9jdW1lbnQgdGhlIGVkaXRvciB3b3VsZCBiZSBjb25zdGFudGx5IG11bmdpbmcgaHVnZSBzdHJpbmdzLCBhbmQgZ2V0CnRlcnJpYmx5IHNsb3cuIFdoYXQgQ29kZU1pcnJvciAyIGRvZXMgaXMgcHV0IHRoZSBjdXJyZW50IHNlbGVjdGlvbiwKYWxvbmcgd2l0aCBhbiBleHRyYSBsaW5lIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20sIGludG8gdGhlCnRleHRhcmVhLjwvcD4KCjxwPlRoaXMgbWVhbnMgdGhhdCB0aGUgYXJyb3cga2V5cyAoYW5kIHRoZWlyIGN0cmwtdmFyaWF0aW9ucyksIGhvbWUsCmVuZCwgZXRjZXRlcmEsIGRvIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgc3BlY2lhbGx5LiBXZSBqdXN0IHJlYWQgdGhlCmN1cnNvciBwb3NpdGlvbiBpbiB0aGUgdGV4dGFyZWEsIGFuZCB1cGRhdGUgb3VyIGN1cnNvciB0byBtYXRjaCBpdC4KQWxzbywgY29weSBhbmQgcGFzdGUgd29yayBwcmV0dHkgbXVjaCBmb3IgZnJlZSwgYW5kIHBlb3BsZSBnZXQgdGhlaXIKbmF0aXZlIGtleSBiaW5kaW5ncywgd2l0aG91dCBhbnkgc3BlY2lhbCB3b3JrIG9uIG15IHBhcnQuIEZvciBleGFtcGxlLApJIGhhdmUgZW1hY3Mga2V5IGJpbmRpbmdzIGNvbmZpZ3VyZWQgZm9yIENocm9tZSBhbmQgRmlyZWZveC4gVGhlcmUgaXMKbm8gd2F5IGZvciBhIHNjcmlwdCB0byBkZXRlY3QgdGhpcy4gPGEgY2xhc3M9InVwZGF0ZSIKaHJlZj0iI2tleW1hcCI+W25vIGxvbmdlciB0aGUgY2FzZV08L2E+PC9wPgoKPHA+T2YgY291cnNlLCBzaW5jZSBvbmx5IGEgc21hbGwgcGFydCBvZiB0aGUgZG9jdW1lbnQgc2l0cyBpbiB0aGUKdGV4dGFyZWEsIGtleXMgbGlrZSBwYWdlIHVwIGFuZCBjdHJsLWVuZCB3b24ndCBkbyB0aGUgcmlnaHQgdGhpbmcuCkNvZGVNaXJyb3IgaXMgY2F0Y2hpbmcgdGhvc2UgZXZlbnRzIGFuZCBoYW5kbGluZyB0aGVtIGl0c2VsZi48L3A+Cgo8aDIgaWQ9InNlbGVjdGlvbiI+U2VsZWN0aW9uPC9oMj4KCjxwPkdldHRpbmcgYW5kIHNldHRpbmcgdGhlIHNlbGVjdGlvbiByYW5nZSBvZiBhIHRleHRhcmVhIGluIG1vZGVybgpicm93c2VycyBpcyB0cml2aWFs4oCUeW91IGp1c3QgdXNlIHRoZSA8Y29kZT5zZWxlY3Rpb25TdGFydDwvY29kZT4KYW5kIDxjb2RlPnNlbGVjdGlvbkVuZDwvY29kZT4gcHJvcGVydGllcy4gT24gSUUgeW91IGhhdmUgdG8gZG8gc29tZQppbnNhbmUgc3R1ZmYgd2l0aCB0ZW1wb3JhcnkgcmFuZ2VzIGFuZCBjb21wZW5zYXRpbmcgZm9yIHRoZSBmYWN0IHRoYXQKbW92aW5nIHRoZSBzZWxlY3Rpb24gYnkgYSAnY2hhcmFjdGVyJyB3aWxsIHRyZWF0IFxyXG4gYXMgYSBzaW5nbGUKY2hhcmFjdGVyLCBidXQgZXZlbiB0aGVyZSBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCBmdW5jdGlvbnMgdGhhdApyZWxpYWJseSBzZXQgYW5kIGdldCB0aGUgc2VsZWN0aW9uIHJhbmdlLjwvcD4KCjxwPkJ1dCBjb25zaWRlciB0aGlzIHR5cGljYWwgY2FzZTogV2hlbiBJJ20gc29tZXdoZXJlIGluIG15IGRvY3VtZW50LApwcmVzcyBzaGlmdCwgYW5kIHByZXNzIHRoZSB1cCBhcnJvdywgc29tZXRoaW5nIGdldHMgc2VsZWN0ZWQuIFRoZW4sIGlmCkksIHN0aWxsIGhvbGRpbmcgc2hpZnQsIHByZXNzIHRoZSB1cCBhcnJvdyBhZ2FpbiwgdGhlIHRvcCBvZiBteQpzZWxlY3Rpb24gaXMgYWRqdXN0ZWQuIFRoZSBzZWxlY3Rpb24gcmVtZW1iZXJzIHdoZXJlIGl0cyA8ZW0+aGVhZDwvZW0+CmFuZCBpdHMgPGVtPmFuY2hvcjwvZW0+IGFyZSwgYW5kIG1vdmVzIHRoZSBoZWFkIHdoZW4gd2Ugc2hpZnQtbW92ZS4KVGhpcyBpcyBhIGdlbmVyYWxseSBhY2NlcHRlZCBwcm9wZXJ0eSBvZiBzZWxlY3Rpb25zLCBhbmQgZG9uZSByaWdodCBieQpldmVyeSBlZGl0aW5nIGNvbXBvbmVudCBidWlsdCBpbiB0aGUgcGFzdCB0d2VudHkgeWVhcnMuPC9wPgoKPHA+QnV0IG5vdCBzb21ldGhpbmcgdGhhdCB0aGUgYnJvd3NlciBzZWxlY3Rpb24gQVBJcyBleHBvc2UuPC9wPgoKPHA+R3JlYXQuIFNvIHdoZW4gc29tZW9uZSBjcmVhdGVzIGFuICd1cHNpZGUtZG93bicgc2VsZWN0aW9uLCB0aGUgbmV4dAp0aW1lIENvZGVNaXJyb3IgaGFzIHRvIHVwZGF0ZSB0aGUgdGV4dGFyZWEsIGl0J2xsIHJlLWNyZWF0ZSB0aGUKc2VsZWN0aW9uIGFzIGFuICd1cHNpZGUtdXAnIHNlbGVjdGlvbiwgd2l0aCB0aGUgYW5jaG9yIGF0IHRoZSB0b3AsIGFuZAp0aGUgbmV4dCBjdXJzb3IgbW90aW9uIHdpbGwgYmVoYXZlIGluIGFuIHVuZXhwZWN0ZWQgd2F54oCUb3VyIHNlY29uZAp1cC1hcnJvdyBwcmVzcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSB3aWxsIG5vdCBkbyBhbnl0aGluZywgc2luY2UgaXQgaXMKaW50ZXJwcmV0ZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhlIGZpcnN0LjwvcD4KCjxwPk5vIHByb2JsZW0uIFdlJ2xsIGp1c3QsIGVobSwgZGV0ZWN0IHRoYXQgdGhlIHNlbGVjdGlvbiBpcwp1cHNpZGUtZG93biAoeW91IGNhbiB0ZWxsIGJ5IHRoZSB3YXkgaXQgd2FzIGNyZWF0ZWQpLCBhbmQgdGhlbiwgd2hlbgphbiB1cHNpZGUtZG93biBzZWxlY3Rpb24gaXMgcHJlc2VudCwgYW5kIGEgY3Vyc29yLW1vdmluZyBrZXkgaXMKcHJlc3NlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHNoaWZ0LCB3ZSBxdWlja2x5IGNvbGxhcHNlIHRoZSBzZWxlY3Rpb24KaW4gdGhlIHRleHRhcmVhIHRvIGl0cyBzdGFydCwgYWxsb3cgdGhlIGtleSB0byB0YWtlIGVmZmVjdCwgYW5kIHRoZW4KY29tYmluZSBpdHMgbmV3IGhlYWQgd2l0aCBpdHMgb2xkIGFuY2hvciB0byBnZXQgdGhlIDxlbT5yZWFsPC9lbT4Kc2VsZWN0aW9uLjwvcD4KCjxwPkluIHNob3J0LCBzY2FyeSBoYWNrcyBjb3VsZCBub3QgYmUgYXZvaWRlZCBlbnRpcmVseSBpbiBDb2RlTWlycm9yCjIuPC9wPgoKPHA+QW5kLCB0aGUgb2JzZXJ2YW50IHJlYWRlciBtaWdodCBhc2ssIGhvdyBkbyB5b3UgZXZlbiBrbm93IHRoYXQgYQprZXkgY29tYm8gaXMgYSBjdXJzb3ItbW92aW5nIGNvbWJvLCBpZiB5b3UgY2xhaW0geW91IHN1cHBvcnQgYW55Cm5hdGl2ZSBrZXkgYmluZGluZ3M/IFdlbGwsIHdlIGRvbid0LCBidXQgd2UgY2FuIGxlYXJuLiBUaGUgZWRpdG9yCmtlZXBzIGEgc2V0IGtub3duIGN1cnNvci1tb3ZlbWVudCBjb21ib3MgKGluaXRpYWxpemVkIHRvIHRoZQpwcmVkaWN0YWJsZSBkZWZhdWx0cyksIGFuZCB1cGRhdGVzIHRoaXMgc2V0IHdoZW4gaXQgb2JzZXJ2ZXMgdGhhdApwcmVzc2luZyBhIGNlcnRhaW4ga2V5IGhhZCAob25seSkgdGhlIGVmZmVjdCBvZiBtb3ZpbmcgdGhlIGN1cnNvci4KVGhpcywgb2YgY291cnNlLCBkb2Vzbid0IHdvcmsgaWYgdGhlIGZpcnN0IHRpbWUgdGhlIGtleSBpcyB1c2VkIHdhcwpmb3IgZXh0ZW5kaW5nIGFuIGludmVydGVkIHNlbGVjdGlvbiwgYnV0IGl0IHdvcmtzIG1vc3Qgb2YgdGhlCnRpbWUuPC9wPgoKPGgyIGlkPSJ1cGRhdGUiPkludGVsbGlnZW50IFVwZGF0aW5nPC9oMj4KCjxwPk9uZSB0aGluZyB0aGF0IGFsd2F5cyBjb21lcyB1cCB3aGVuIHlvdSBoYXZlIGEgY29tcGxpY2F0ZWQgaW50ZXJuYWwKc3RhdGUgdGhhdCdzIHJlZmxlY3RlZCBpbiBzb21lIHVzZXItdmlzaWJsZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbgooaW4gdGhpcyBjYXNlLCB0aGUgZGlzcGxheWVkIGNvZGUgYW5kIHRoZSB0ZXh0YXJlYSdzIGNvbnRlbnQpIGlzCmtlZXBpbmcgdGhlIHR3byBpbiBzeW5jLiBUaGUgbmFpdmUgd2F5IGlzIHRvIGp1c3QgdXBkYXRlIHRoZSBkaXNwbGF5CmV2ZXJ5IHRpbWUgeW91IGNoYW5nZSB5b3VyIHN0YXRlLCBidXQgdGhpcyBpcyBub3Qgb25seSBlcnJvciBwcm9uZQooeW91J2xsIGZvcmdldCksIGl0IGFsc28gZWFzaWx5IGxlYWRzIHRvIGR1cGxpY2F0ZSB3b3JrIG9uIGJpZywKY29tcG9zaXRlIG9wZXJhdGlvbnMuIFRoZW4geW91IHN0YXJ0IHBhc3NpbmcgYXJvdW5kIGZsYWdzIGluZGljYXRpbmcKd2hldGhlciB0aGUgZGlzcGxheSBzaG91bGQgYmUgdXBkYXRlZCBpbiBhbiBhdHRlbXB0IHRvIGJlIGVmZmljaWVudAphZ2FpbiBhbmQsIHdlbGwsIGF0IHRoYXQgcG9pbnQgeW91IG1pZ2h0IGFzIHdlbGwgZ2l2ZSB1cCBjb21wbGV0ZWx5LjwvcD4KCjxwPkkgZGlkIGdvIGRvd24gdGhhdCByb2FkLCBidXQgdGhlbiBzd2l0Y2hlZCB0byBhIG11Y2ggc2ltcGxlciBtb2RlbDoKc2ltcGx5IGtlZXAgdHJhY2sgb2YgYWxsIHRoZSB0aGluZ3MgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBkdXJpbmcgYW4KYWN0aW9uLCBhbmQgdGhlbiwgb25seSBhdCB0aGUgZW5kLCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byB1cGRhdGUgdGhlCnVzZXItdmlzaWJsZSBkaXNwbGF5LjwvcD4KCjxwPkNvZGVNaXJyb3IgdXNlcyBhIGNvbmNlcHQgb2YgPGVtPm9wZXJhdGlvbnM8L2VtPiwgd2hpY2ggc3RhcnQgYnkKY2FsbGluZyBhIHNwZWNpZmljIHNldC11cCBmdW5jdGlvbiB0aGF0IGNsZWFycyB0aGUgc3RhdGUgYW5kIGVuZCBieQpjYWxsaW5nIGFub3RoZXIgZnVuY3Rpb24gdGhhdCByZWFkcyB0aGlzIHN0YXRlIGFuZCBkb2VzIHRoZSByZXF1aXJlZAp1cGRhdGluZy4gTW9zdCBldmVudCBoYW5kbGVycywgYW5kIGFsbCB0aGUgdXNlci12aXNpYmxlIG1ldGhvZHMgdGhhdApjaGFuZ2Ugc3RhdGUgYXJlIHdyYXBwZWQgbGlrZSB0aGlzLiBUaGVyZSdzIGEgbWV0aG9kCmNhbGxlZCA8Y29kZT5vcGVyYXRpb248L2NvZGU+IHRoYXQgYWNjZXB0cyBhIGZ1bmN0aW9uLCBhbmQgcmV0dXJucwphbm90aGVyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFzIGFuIG9wZXJhdGlvbi48L3A+Cgo8cD5JdCdzIHRyaXZpYWwgdG8gZXh0ZW5kIHRoaXMgKGFzIENvZGVNaXJyb3IgZG9lcykgdG8gZGV0ZWN0IG5lc3RpbmcsCmFuZCwgd2hlbiBhbiBvcGVyYXRpb24gaXMgc3RhcnRlZCBpbnNpZGUgYW4gb3BlcmF0aW9uLCBzaW1wbHkKaW5jcmVtZW50IHRoZSBuZXN0aW5nIGNvdW50LCBhbmQgb25seSBkbyB0aGUgdXBkYXRpbmcgd2hlbiB0aGlzIGNvdW50CnJlYWNoZXMgemVybyBhZ2Fpbi48L3A+Cgo8cD5JZiB3ZSBoYXZlIGEgc2V0IG9mIGNoYW5nZWQgcmFuZ2VzIGFuZCBrbm93IHRoZSBjdXJyZW50bHkgc2hvd24KcmFuZ2UsIHdlIGNhbiAod2l0aCBzb21lIGF3a3dhcmQgY29kZSB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdApjaGFuZ2VzIGNhbiBhZGQgYW5kIHJlbW92ZSBsaW5lcywgc28gd2UncmUgZGVhbGluZyB3aXRoIGEgY2hhbmdpbmcKY29vcmRpbmF0ZSBzeXN0ZW0pIGNvbnN0cnVjdCBhIG1hcCBvZiB0aGUgcmFuZ2VzIHRoYXQgd2VyZSBsZWZ0CmludGFjdC4gV2UgY2FuIHRoZW4gY29tcGFyZSB0aGlzIG1hcCB3aXRoIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudAp0aGF0J3MgY3VycmVudGx5IHZpc2libGUgKGJhc2VkIG9uIHNjcm9sbCBvZmZzZXQgYW5kIGVkaXRvciBoZWlnaHQpIHRvCmRldGVybWluZSB3aGV0aGVyIHNvbWV0aGluZyBuZWVkcyB0byBiZSB1cGRhdGVkLjwvcD4KCjxwPkNvZGVNaXJyb3IgdXNlcyB0d28gdXBkYXRlIGFsZ29yaXRobXPigJRhIGZ1bGwgcmVmcmVzaCwgd2hlcmUgaXQganVzdApkaXNjYXJkcyB0aGUgd2hvbGUgcGFydCBvZiB0aGUgRE9NIHRoYXQgY29udGFpbnMgdGhlIGVkaXRlZCB0ZXh0IGFuZApyZWJ1aWxkcyBpdCwgYW5kIGEgcGF0Y2ggYWxnb3JpdGhtLCB3aGVyZSBpdCB1c2VzIHRoZSBpbmZvcm1hdGlvbgphYm91dCBjaGFuZ2VkIGFuZCBpbnRhY3QgcmFuZ2VzIHRvIHVwZGF0ZSBvbmx5IHRoZSBvdXQtb2YtZGF0ZSBwYXJ0cwpvZiB0aGUgRE9NLiBXaGVuIG1vcmUgdGhhbiAzMCBwZXJjZW50ICh3aGljaCBpcyB0aGUgY3VycmVudCBoZXVyaXN0aWMsCm1pZ2h0IGNoYW5nZSkgb2YgdGhlIGxpbmVzIG5lZWQgdG8gYmUgdXBkYXRlZCwgdGhlIGZ1bGwgcmVmcmVzaCBpcwpjaG9zZW4gKHNpbmNlIGl0J3MgZmFzdGVyIHRvIGRvIHRoYW4gcGFpbnN0YWtpbmdseSBmaW5kaW5nIGFuZAp1cGRhdGluZyBhbGwgdGhlIGNoYW5nZWQgbGluZXMpLCBpbiB0aGUgb3RoZXIgY2FzZSBpdCBkb2VzIHRoZQpwYXRjaGluZyAoc28gdGhhdCwgaWYgeW91IHNjcm9sbCBhIGxpbmUgb3Igc2VsZWN0IGFub3RoZXIgY2hhcmFjdGVyLAp0aGUgd2hvbGUgc2NyZWVuIGRvZXNuJ3QgaGF2ZSB0byBiZQpyZS1yZW5kZXJlZCkuIDxzcGFuIGNsYXNzPSJ1cGRhdGUiPlt0aGUgZnVsbC1yZWZyZXNoCmFsZ29yaXRobSB3YXMgZHJvcHBlZCwgaXQgd2Fzbid0IHJlYWxseSBmYXN0ZXIgdGhhbiB0aGUgcGF0Y2hpbmcKb25lXTwvc3Bhbj48L3A+Cgo8cD5BbGwgdXBkYXRpbmcgdXNlcyA8Y29kZT5pbm5lckhUTUw8L2NvZGU+IHJhdGhlciB0aGFuIGRpcmVjdCBET00KbWFuaXB1bGF0aW9uLCBzaW5jZSB0aGF0IHN0aWxsIHNlZW1zIHRvIGJlIGJ5IGZhciB0aGUgZmFzdGVzdCB3YXkgdG8KYnVpbGQgZG9jdW1lbnRzLiBUaGVyZSdzIGEgcGVyLWxpbmUgZnVuY3Rpb24gdGhhdCBjb21iaW5lcyB0aGUKaGlnaGxpZ2h0aW5nLCA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+bWFya2luZzwvYT4sIGFuZApzZWxlY3Rpb24gaW5mbyBmb3IgdGhhdCBsaW5lIGludG8gYSBzbmlwcGV0IG9mIEhUTUwuIFRoZSBwYXRjaCB1cGRhdGVyCnVzZXMgdGhpcyB0byByZXNldCBpbmRpdmlkdWFsIGxpbmVzLCB0aGUgcmVmcmVzaCB1cGRhdGVyIGJ1aWxkcyBhbgpIVE1MIGNodW5rIGZvciB0aGUgd2hvbGUgdmlzaWJsZSBkb2N1bWVudCBhdCBvbmNlLCBhbmQgdGhlbiB1c2VzIGEKc2luZ2xlIDxjb2RlPmlubmVySFRNTDwvY29kZT4gdXBkYXRlIHRvIGRvIHRoZSByZWZyZXNoLjwvcD4KCjxoMiBpZD0icGFyc2UiPlBhcnNlcnMgY2FuIGJlIFNpbXBsZTwvaDI+Cgo8cD5XaGVuIEkgd3JvdGUgQ29kZU1pcnJvciAxLCBJCnRob3VnaHQgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L3N0b3J5Lmh0bWwjcGFyc2VyIj5pbnRlcnJ1cHRhYmxlCnBhcnNlcnM8L2E+IHdlcmUgYSBodWdlbHkgc2NhcnkgYW5kIGNvbXBsaWNhdGVkIHRoaW5nLCBhbmQgSSB1c2VkIGEKYnVuY2ggb2YgaGVhdnl3ZWlnaHQgYWJzdHJhY3Rpb25zIHRvIGtlZXAgdGhpcyBzdXBwb3NlZCBjb21wbGV4aXR5CnVuZGVyIGNvbnRyb2w6IHBhcnNlcnMKd2VyZSA8YSBocmVmPSJodHRwOi8vYm9iLnB5dGhvbm1hYy5vcmcvYXJjaGl2ZXMvMjAwNS8wNy8wNi9pdGVyYXRpb24taW4tamF2YXNjcmlwdC8iPml0ZXJhdG9yczwvYT4KdGhhdCBjb25zdW1lZCBpbnB1dCBmcm9tIGFub3RoZXIgaXRlcmF0b3IsIGFuZCB1c2VkIGZ1bm55CmNsb3N1cmUtcmVzZXR0aW5nIHRyaWNrcyB0byBjb3B5IGFuZCByZXN1bWUgdGhlbXNlbHZlcy48L3A+Cgo8cD5UaGlzIG1hZGUgZm9yIGEgcmF0aGVyIG5pY2Ugc3lzdGVtLCBpbiB0aGF0IHBhcnNlcnMgZm9ybWVkIHN0cmljdGx5CnNlcGFyYXRlIG1vZHVsZXMsIGFuZCBjb3VsZCBiZSBjb21wb3NlZCBpbiBwcmVkaWN0YWJsZSB3YXlzLgpVbmZvcnR1bmF0ZWx5LCBpdCB3YXMgcXVpdGUgc2xvdyAoc3RhY2tpbmcgdGhyZWUgb3IgZm91ciBpdGVyYXRvcnMgb24KdG9wIG9mIGVhY2ggb3RoZXIpLCBhbmQgZXh0cmVtZWx5IGludGltaWRhdGluZyB0byBwZW9wbGUgbm90IHVzZWQgdG8gYQpmdW5jdGlvbmFsIHByb2dyYW1taW5nIHN0eWxlLjwvcD4KCjxwPldpdGggYSBmZXcgc21hbGwgY2hhbmdlcywgaG93ZXZlciwgd2UgY2FuIGtlZXAgYWxsIHRob3NlCmFkdmFudGFnZXMsIGJ1dCBzaW1wbGlmeSB0aGUgQVBJIGFuZCBtYWtlIHRoZSB3aG9sZSB0aGluZyBsZXNzCmluZGlyZWN0IGFuZCBpbmVmZmljaWVudC4gQ29kZU1pcnJvcgoyJ3MgPGEgaHJlZj0ibWFudWFsLmh0bWwjbW9kZWFwaSI+bW9kZSBBUEk8L2E+IHVzZXMgZXhwbGljaXQgc3RhdGUKb2JqZWN0cywgYW5kIG1ha2VzIHRoZSBwYXJzZXIvdG9rZW5pemVyIGEgZnVuY3Rpb24gdGhhdCBzaW1wbHkgdGFrZXMgYQpzdGF0ZSBhbmQgYSBjaGFyYWN0ZXIgc3RyZWFtIGFic3RyYWN0aW9uLCBhZHZhbmNlcyB0aGUgc3RyZWFtIG9uZQp0b2tlbiwgYW5kIHJldHVybnMgdGhlIHdheSB0aGUgdG9rZW4gc2hvdWxkIGJlIHN0eWxlZC4gVGhpcyBzdGF0ZSBtYXkKYmUgY29waWVkLCBvcHRpb25hbGx5IGluIGEgbW9kZS1kZWZpbmVkIHdheSwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0bwpjb250aW51ZSBhIHBhcnNlIGF0IGEgZ2l2ZW4gcG9pbnQuIEV2ZW4gc29tZW9uZSB3aG8ncyBuZXZlciB0b3VjaGVkIGEKbGFtYmRhIGluIGhpcyBsaWZlIGNhbiB1bmRlcnN0YW5kIHRoaXMgYXBwcm9hY2guIEFkZGl0aW9uYWxseSwgZmFyCmZld2VyIG9iamVjdHMgYXJlIGFsbG9jYXRlZCBpbiB0aGUgY291cnNlIG9mIHBhcnNpbmcgbm93LjwvcD4KCjxwPlRoZSBiaWdnZXN0IHNwZWVkdXAgY29tZXMgZnJvbSB0aGUgZmFjdCB0aGF0IHRoZSBwYXJzaW5nIG5vIGxvbmdlcgpoYXMgdG8gdG91Y2ggdGhlIERPTSB0aG91Z2guIEluIENvZGVNaXJyb3IgMSwgb24gYW4gb2xkZXIgYnJvd3NlciwgeW91CmNvdWxkIDxlbT5zZWU8L2VtPiB0aGUgcGFyc2VyIHdvcmsgaXRzIHdheSB0aHJvdWdoIHRoZSBkb2N1bWVudCwKbWFuYWdpbmcgc29tZSB0d2VudHkgbGluZXMgaW4gZWFjaCA1MC1taWxsaXNlY29uZCB0aW1lIHNsaWNlIGl0IGdvdC4gSXQKd2FzIHJlYWRpbmcgaXRzIGlucHV0IGZyb20gdGhlIERPTSwgYW5kIHVwZGF0aW5nIHRoZSBET00gYXMgaXQgd2VudAphbG9uZywgd2hpY2ggYW55IGV4cGVyaWVuY2VkIEphdmFTY3JpcHQgcHJvZ3JhbW1lciB3aWxsIGltbWVkaWF0ZWx5CnNwb3QgYXMgYSByZWNpcGUgZm9yIHNsb3duZXNzLiBJbiBDb2RlTWlycm9yIDIsIHRoZSBwYXJzZXIgdXN1YWxseQpmaW5pc2hlcyB0aGUgd2hvbGUgZG9jdW1lbnQgaW4gYSBzaW5nbGUgMTAwLW1pbGxpc2Vjb25kIHRpbWUgc2xpY2XigJRpdAptYW5hZ2VzIHNvbWUgMTUwMCBsaW5lcyBkdXJpbmcgdGhhdCB0aW1lIG9uIENocm9tZS4gQWxsIGl0IGhhcyB0byBkbwppcyBtdW5nZSBzdHJpbmdzLCBzbyB0aGVyZSBpcyBubyByZWFsIHJlYXNvbiBmb3IgaXQgdG8gYmUgc2xvdwphbnltb3JlLjwvcD4KCjxoMiBpZD0ic3VtbWFyeSI+V2hhdCBHaXZlcz88L2gyPgoKPHA+R2l2ZW4gYWxsIHRoaXMsIHdoYXQgY2FuIHlvdSBleHBlY3QgZnJvbSBDb2RlTWlycm9yIDI/PC9wPgoKPHVsPgoKPGxpPjxzdHJvbmc+U21hbGwuPC9zdHJvbmc+IHRoZSBiYXNlIGxpYnJhcnkgaXMKc29tZSA8c3BhbiBjbGFzcz0idXBkYXRlIj40NWs8L3NwYW4+IHdoZW4gbWluaWZpZWQKbm93LCA8c3BhbiBjbGFzcz0idXBkYXRlIj4xN2s8L3NwYW4+IHdoZW4gZ3ppcHBlZC4gSXQncyBzbWFsbGVyIHRoYW4KaXRzIG93biBsb2dvLjwvbGk+Cgo8bGk+PHN0cm9uZz5MaWdodHdlaWdodC48L3N0cm9uZz4gQ29kZU1pcnJvciAyIGluaXRpYWxpemVzIHZlcnkKcXVpY2tseSwgYW5kIGRvZXMgYWxtb3N0IG5vIHdvcmsgd2hlbiBpdCBpcyBub3QgZm9jdXNlZC4gVGhpcyBtZWFucwp5b3UgY2FuIHRyZWF0IGl0IGFsbW9zdCBsaWtlIGEgdGV4dGFyZWEsIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9uIGEKcGFnZSB3aXRob3V0IHRyb3VibGUuPC9saT4KCjxsaT48c3Ryb25nPkh1Z2UgZG9jdW1lbnQgc3VwcG9ydC48L3N0cm9uZz4gU2luY2UgaGlnaGxpZ2h0aW5nIGlzCnJlYWxseSBmYXN0LCBhbmQgbm8gRE9NIHN0cnVjdHVyZSBpcyBiZWluZyBidWlsdCBmb3Igbm9uLXZpc2libGUKY29udGVudCwgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbG9ja2luZyB1cCB5b3VyIGJyb3dzZXIgd2hlbiBhCnVzZXIgZW50ZXJzIGEgbWVnYWJ5dGUtc2l6ZWQgZG9jdW1lbnQuPC9saT4KCjxsaT48c3Ryb25nPkV4dGVuZGVkIEFQSS48L3N0cm9uZz4gU29tZSB0aGluZ3Mga2VwdCBjb21pbmcgdXAgaW4gdGhlCm1haWxpbmcgbGlzdCwgc3VjaCBhcyBtYXJraW5nIHBpZWNlcyBvZiB0ZXh0IG9yIGxpbmVzLCB3aGljaCB3ZXJlCmV4dHJlbWVseSBoYXJkIHRvIGRvIHdpdGggQ29kZU1pcnJvciAxLiBUaGUgbmV3IHZlcnNpb24gaGFzIHByb3BlcgpzdXBwb3J0IGZvciB0aGVzZSBidWlsdCBpbi48L2xpPgoKPGxpPjxzdHJvbmc+VGFiIHN1cHBvcnQuPC9zdHJvbmc+IFRhYnMgaW5zaWRlIGVkaXRhYmxlIGRvY3VtZW50cyB3ZXJlLApmb3Igc29tZSByZWFzb24sIGEgbm8tZ28uIEF0IGxlYXN0IHNpeCBkaWZmZXJlbnQgcGVvcGxlIGFubm91bmNlZCB0aGV5CndlcmUgZ29pbmcgdG8gYWRkIHRhYiBzdXBwb3J0IHRvIENvZGVNaXJyb3IgMSwgbm9uZSBzdXJ2aXZlZCAoSSBtZWFuLApub25lIGRlbGl2ZXJlZCBhIHdvcmtpbmcgdmVyc2lvbikuIENvZGVNaXJyb3IgMiBubyBsb25nZXIgcmVtb3ZlcyB0YWJzCmZyb20geW91ciBkb2N1bWVudC48L2xpPgoKPGxpPjxzdHJvbmc+U2FuZSBzdHlsaW5nLjwvc3Ryb25nPiA8Y29kZT5pZnJhbWU8L2NvZGU+IG5vZGVzIGFyZW4ndApyZWFsbHkga25vd24gZm9yIHJlc3BlY3RpbmcgZG9jdW1lbnQgZmxvdy4gTm93IHRoYXQgYW4gZWRpdG9yIGluc3RhbmNlCmlzIGEgcGxhaW4gPGNvZGU+ZGl2PC9jb2RlPiBlbGVtZW50LCBpdCBpcyBtdWNoIGVhc2llciB0byBzaXplIGl0IHRvCmZpdCB0aGUgc3Vycm91bmRpbmcgZWxlbWVudHMuIFlvdSBkb24ndCBldmVuIGhhdmUgdG8gbWFrZSBpdCBzY3JvbGwgaWYKeW91IGRvIG5vdCA8YSBocmVmPSIuLi9kZW1vL3Jlc2l6ZS5odG1sIj53YW50IHRvPC9hPi48L2xpPgoKPC91bD4KCjxwPk9uIHRoZSBkb3duc2lkZSwgYSBDb2RlTWlycm9yIDIgaW5zdGFuY2UgaXMgPGVtPm5vdDwvZW0+IGEgbmF0aXZlCmVkaXRhYmxlIGNvbXBvbmVudC4gVGhvdWdoIGl0IGRvZXMgaXRzIGJlc3QgdG8gZW11bGF0ZSBzdWNoIGEKY29tcG9uZW50IGFzIG11Y2ggYXMgcG9zc2libGUsIHRoZXJlIGlzIGZ1bmN0aW9uYWxpdHkgdGhhdCBicm93c2VycwpqdXN0IGRvIG5vdCBhbGxvdyB1cyB0byBob29rIGludG8uIERvaW5nIHNlbGVjdC1hbGwgZnJvbSB0aGUgY29udGV4dAptZW51LCBmb3IgZXhhbXBsZSwgaXMgbm90IGN1cnJlbnRseSBkZXRlY3RlZCBieSBDb2RlTWlycm9yLjwvcD4KCjxwIGlkPSJjaGFuZ2VzIiBzdHlsZT0ibWFyZ2luLXRvcDogMmVtOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0Ogpib2xkIj5bVXBkYXRlcyBmcm9tIE5vdmVtYmVyIDEzdGggMjAxMV08L3NwYW4+IFJlY2VudGx5LCBJJ3ZlIG1hZGUKc29tZSBjaGFuZ2VzIHRvIHRoZSBjb2RlYmFzZSB0aGF0IGNhdXNlIHNvbWUgb2YgdGhlIHRleHQgYWJvdmUgdG8gbm8KbG9uZ2VyIGJlIGN1cnJlbnQuIEkndmUgbGVmdCB0aGUgdGV4dCBpbnRhY3QsIGJ1dCBhZGRlZCBtYXJrZXJzIGF0IHRoZQpwYXNzYWdlcyB0aGF0IGFyZSBub3cgaW5hY2N1cmF0ZS4gVGhlIG5ldyBzaXR1YXRpb24gaXMgZGVzY3JpYmVkCmJlbG93LjwvcD4KCjxoMiBpZD0iYnRyZWUiPkNvbnRlbnQgUmVwcmVzZW50YXRpb248L2gyPgoKPHA+VGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIG9mIENvZGVNaXJyb3IgMiByZXByZXNlbnRlZCB0aGUKZG9jdW1lbnQgYXMgYSBmbGF0IGFycmF5IG9mIGxpbmUgb2JqZWN0cy4gVGhpcyB3b3JrZWQgd2VsbOKAlHNwbGljaW5nCmFycmF5cyB3aWxsIHJlcXVpcmUgdGhlIHBhcnQgb2YgdGhlIGFycmF5IGFmdGVyIHRoZSBzcGxpY2UgdG8gYmUKbW92ZWQsIGJ1dCB0aGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgc2ltcGxlIDxjb2RlPm1lbW1vdmU8L2NvZGU+IG9mIGEKYnVuY2ggb2YgcG9pbnRlcnMsIHNvIGl0IGlzIGNoZWFwIGV2ZW4gZm9yIGh1Z2UgZG9jdW1lbnRzLjwvcD4KCjxwPkhvd2V2ZXIsIEkgcmVjZW50bHkgYWRkZWQgbGluZSB3cmFwcGluZyBhbmQgY29kZSBmb2xkaW5nIChsaW5lCmNvbGxhcHNpbmcsIGJhc2ljYWxseSkuIE9uY2UgbGluZXMgc3RhcnQgdGFraW5nIHVwIGEgbm9uLWNvbnN0YW50CmFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSwgbG9va2luZyB1cCBhIGxpbmUgYnkgdmVydGljYWwgcG9zaXRpb24KKHdoaWNoIGlzIG5lZWRlZCB3aGVuIHNvbWVvbmUgY2xpY2tzIHRoZSBkb2N1bWVudCwgYW5kIHRvIGRldGVybWluZQp0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBkdXJpbmcgc2Nyb2xsaW5nKSBjYW4gb25seSBiZSBkb25lCndpdGggYSBsaW5lYXIgc2NhbiB0aHJvdWdoIHRoZSB3aG9sZSBhcnJheSwgc3VtbWluZyB1cCBsaW5lIGhlaWdodHMgYXMKeW91IGdvLiBTZWVpbmcgaG93IEkndmUgYmVlbiBnb2luZyBvdXQgb2YgbXkgd2F5IHRvIG1ha2UgYmlnIGRvY3VtZW50cwpmYXN0LCB0aGlzIGlzIG5vdCBhY2NlcHRhYmxlLjwvcD4KCjxwPlRoZSBuZXcgcmVwcmVzZW50YXRpb24gaXMgYmFzZWQgb24gYSBCLXRyZWUuIFRoZSBsZWF2ZXMgb2YgdGhlIHRyZWUKY29udGFpbiBhcnJheXMgb2YgbGluZSBvYmplY3RzLCB3aXRoIGEgZml4ZWQgbWluaW11bSBhbmQgbWF4aW11bSBzaXplLAphbmQgdGhlIG5vbi1sZWFmIG5vZGVzIHNpbXBseSBob2xkIGFycmF5cyBvZiBjaGlsZCBub2Rlcy4gRWFjaCBub2RlCnN0b3JlcyBib3RoIHRoZSBhbW91bnQgb2YgbGluZXMgdGhhdCBsaXZlIGJlbG93IHRoZW0gYW5kIHRoZSB2ZXJ0aWNhbApzcGFjZSB0YWtlbiB1cCBieSB0aGVzZSBsaW5lcy4gVGhpcyBhbGxvd3MgdGhlIHRyZWUgdG8gYmUgaW5kZXhlZCBib3RoCmJ5IGxpbmUgbnVtYmVyIGFuZCBieSB2ZXJ0aWNhbCBwb3NpdGlvbiwgYW5kIGFsbCBhY2Nlc3MgaGFzCmxvZ2FyaXRobWljIGNvbXBsZXhpdHkgaW4gcmVsYXRpb24gdG8gdGhlIGRvY3VtZW50IHNpemUuPC9wPgoKPHA+SSBnYXZlIGxpbmUgb2JqZWN0cyBhbmQgdHJlZSBub2RlcyBwYXJlbnQgcG9pbnRlcnMsIHRvIHRoZSBub2RlCmFib3ZlIHRoZW0uIFdoZW4gYSBsaW5lIGhhcyB0byB1cGRhdGUgaXRzIGhlaWdodCwgaXQgY2FuIHNpbXBseSB3YWxrCnRoZXNlIHBvaW50ZXJzIHRvIHRoZSB0b3Agb2YgdGhlIHRyZWUsIGFkZGluZyBvciBzdWJ0cmFjdGluZyB0aGUKZGlmZmVyZW5jZSBpbiBoZWlnaHQgZnJvbSBlYWNoIG5vZGUgaXQgZW5jb3VudGVycy4gVGhlIHBhcmVudCBwb2ludGVycwphbHNvIG1ha2UgaXQgY2hlYXBlciAoaW4gY29tcGxleGl0eSB0ZXJtcywgdGhlIGRpZmZlcmVuY2UgaXMgcHJvYmFibHkKdGlueSBpbiBub3JtYWwtc2l6ZWQgZG9jdW1lbnRzKSB0byBmaW5kIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIHdoZW4KZ2l2ZW4gYSBsaW5lIG9iamVjdC4gSW4gdGhlIG9sZCBhcHByb2FjaCwgdGhlIHdob2xlIGRvY3VtZW50IGFycmF5IGhhZAp0byBiZSBzZWFyY2hlZC4gTm93LCB3ZSBjYW4ganVzdCB3YWxrIHVwIHRoZSB0cmVlIGFuZCBjb3VudCB0aGUgc2l6ZXMKb2YgdGhlIG5vZGVzIGNvbWluZyBiZWZvcmUgdXMgYXQgZWFjaCBsZXZlbC48L3A+Cgo8cD5JIGNob3NlIEItdHJlZXMsIG5vdCByZWd1bGFyIGJpbmFyeSB0cmVlcywgbW9zdGx5IGJlY2F1c2UgdGhleQphbGxvdyBmb3IgdmVyeSBmYXN0IGJ1bGsgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLiBXaGVuIHRoZXJlIGlzIGEgYmlnCmNoYW5nZSB0byBhIGRvY3VtZW50LCBpdCB0eXBpY2FsbHkgaW52b2x2ZXMgYWRkaW5nLCBkZWxldGluZywgb3IKcmVwbGFjaW5nIGEgY2h1bmsgb2Ygc3Vic2VxdWVudCBsaW5lcy4gSW4gYSByZWd1bGFyIGJhbGFuY2VkIHRyZWUsIGFsbAp0aGVzZSBpbnNlcnRzIG9yIGRlbGV0ZXMgd291bGQgaGF2ZSB0byBiZSBkb25lIHNlcGFyYXRlbHksIHdoaWNoIGNvdWxkCmJlIHJlYWxseSBleHBlbnNpdmUuIEluIGEgQi10cmVlLCB0byBpbnNlcnQgYSBjaHVuaywgeW91IGp1c3Qgd2Fsawpkb3duIHRoZSB0cmVlIG9uY2UgdG8gZmluZCB3aGVyZSBpdCBzaG91bGQgZ28sIGluc2VydCB0aGVtIGFsbCBpbiBvbmUKc2hvdCwgYW5kIHRoZW4gYnJlYWsgdXAgdGhlIG5vZGUgaWYgbmVlZGVkLiBUaGlzIGJyZWFraW5nIHVwIG1pZ2h0Cmludm9sdmUgYnJlYWtpbmcgdXAgbm9kZXMgZnVydGhlciB1cCwgYnV0IG9ubHkgcmVxdWlyZXMgYSBzaW5nbGUgcGFzcwpiYWNrIHVwIHRoZSB0cmVlLiBGb3IgZGVsZXRpb24sIEknbSBzb21ld2hhdCBsYXggaW4ga2VlcGluZyB0aGluZ3MKYmFsYW5jZWTigJRJIGp1c3QgY29sbGFwc2Ugbm9kZXMgaW50byBhIGxlYWYgd2hlbiB0aGVpciBjaGlsZCBjb3VudCBnb2VzCmJlbG93IGEgZ2l2ZW4gbnVtYmVyLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIHNvbWUgd2VpcmQgZWRpdGluZwpwYXR0ZXJucyB0aGF0IG1heSByZXN1bHQgaW4gYSBzZXJpb3VzbHkgdW5iYWxhbmNlZCB0cmVlLCBidXQgZXZlbiBzdWNoCmFuIHVuYmFsYW5jZWQgdHJlZSB3aWxsIHBlcmZvcm0gd2VsbCwgdW5sZXNzIHlvdSBzcGVuZCBhIGRheSBtYWtpbmcKc3RyYW5nZWx5IHJlcGVhdGluZyBlZGl0cyB0byBhIHJlYWxseSBiaWcgZG9jdW1lbnQuPC9wPgoKPGgyIGlkPSJrZXltYXAiPktleW1hcHM8L2gyPgoKPHA+PGEgaHJlZj0iI2FwcHJvYWNoIj5BYm92ZTwvYT4sIEkgY2xhaW1lZCB0aGF0IGRpcmVjdGx5IGNhdGNoaW5nIGtleQpldmVudHMgZm9yIHRoaW5ncyBsaWtlIGN1cnNvciBtb3ZlbWVudCBpcyBpbXByYWN0aWNhbCBiZWNhdXNlIGl0CnJlcXVpcmVzIHNvbWUgYnJvd3Nlci1zcGVjaWZpYyBrbHVkZ2VzLiBJIHRoZW4gcHJvY2VlZGVkIHRvIGV4cGxhaW4Kc29tZSBhd2Z1bCA8YSBocmVmPSIjc2VsZWN0aW9uIj5oYWNrczwvYT4gdGhhdCB3ZXJlIG5lZWRlZCB0byBtYWtlIGl0CnBvc3NpYmxlIGZvciB0aGUgc2VsZWN0aW9uIGNoYW5nZXMgdG8gYmUgZGV0ZWN0ZWQgdGhyb3VnaCB0aGUKdGV4dGFyZWEuIEluIGZhY3QsIHRoZSBzZWNvbmQgaGFjayBpcyBhYm91dCBhcyBiYWQgYXMgdGhlIGZpcnN0LjwvcD4KCjxwPk9uIHRvcCBvZiB0aGF0LCBpbiB0aGUgcHJlc2VuY2Ugb2YgdXNlci1jb25maWd1cmFibGUgdGFiIHNpemVzIGFuZApjb2xsYXBzZWQgYW5kIHdyYXBwZWQgbGluZXMsIGxpbmluZyB1cCBjdXJzb3IgbW92ZW1lbnQgaW4gdGhlIHRleHRhcmVhCndpdGggd2hhdCdzIHZpc2libGUgb24gdGhlIHNjcmVlbiBiZWNvbWVzIGEgbmlnaHRtYXJlLiBUaHVzLCBJJ3ZlCmRlY2lkZWQgdG8gbW92ZSB0byBhIG1vZGVsIHdoZXJlIHRoZSB0ZXh0YXJlYSdzIHNlbGVjdGlvbiBpcyBubyBsb25nZXIKZGVwZW5kZWQgb24uPC9wPgoKPHA+U28gSSBtb3ZlZCB0byBhIG1vZGVsIHdoZXJlIGFsbCBjdXJzb3IgbW92ZW1lbnQgaXMgaGFuZGxlZCBieSBteQpvd24gY29kZS4gVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGEgZ29hbCBjb2x1bW4sIHByb3BlciBpbnRlcmFjdGlvbiBvZgpjdXJzb3IgbW92ZW1lbnQgd2l0aCBjb2xsYXBzZWQgbGluZXMsIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IKdmVydGljYWwgbW92ZW1lbnQgdG8gbW92ZSB0aHJvdWdoIHdyYXBwZWQgbGluZXMgcHJvcGVybHksIGluc3RlYWQgb2YKanVzdCB0cmVhdGluZyB0aGVtIGxpa2Ugbm9uLXdyYXBwZWQgbGluZXMuPC9wPgoKPHA+VGhlIGtleSBldmVudCBoYW5kbGVycyBub3cgdHJhbnNsYXRlIHRoZSBrZXkgZXZlbnQgaW50byBhIHN0cmluZywKc29tZXRoaW5nIGxpa2UgPGNvZGU+Q3RybC1Ib21lPC9jb2RlPiBvciA8Y29kZT5TaGlmdC1DbWQtUjwvY29kZT4sIGFuZAp1c2UgdGhhdCBzdHJpbmcgdG8gbG9vayB1cCBhbiBhY3Rpb24gdG8gcGVyZm9ybS4gVG8gbWFrZSBrZXliaW5kaW5nCmN1c3RvbWl6YWJsZSwgdGhpcyBsb29rdXAgZ29lcyB0aHJvdWdoCmEgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2tleU1hcCI+dGFibGU8L2E+LCB1c2luZyBhIHNjaGVtZSB0aGF0CmFsbG93cyBzdWNoIHRhYmxlcyB0byBiZSBjaGFpbmVkIHRvZ2V0aGVyIChmb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQKTWFjIGJpbmRpbmdzIGZhbGwgdGhyb3VnaCB0byBhIHRhYmxlIG5hbWVkICdlbWFjc3knLCB3aGljaCBkZWZpbmVzCmJhc2ljIEVtYWNzLXN0eWxlIGJpbmRpbmdzIGxpa2UgPGNvZGU+Q3RybC1GPC9jb2RlPiwgYW5kIHdoaWNoIGlzIGFsc28KdXNlZCBieSB0aGUgY3VzdG9tIEVtYWNzIGJpbmRpbmdzKS48L3A+Cgo8cD5BIG5ldwpvcHRpb24gPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2V4dHJhS2V5cyI+PGNvZGU+ZXh0cmFLZXlzPC9jb2RlPjwvYT4KYWxsb3dzIGFkLWhvYyBrZXliaW5kaW5ncyB0byBiZSBkZWZpbmVkIGluIGEgbXVjaCBuaWNlciB3YXkgdGhhbiB3aGF0CndhcyBwb3NzaWJsZSB3aXRoIHRoZQpvbGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX29uS2V5RXZlbnQiPjxjb2RlPm9uS2V5RXZlbnQ8L2NvZGU+PC9hPgpjYWxsYmFjay4gWW91IHNpbXBseSBwcm92aWRlIGFuIG9iamVjdCBtYXBwaW5nIGtleSBpZGVudGlmaWVycyB0bwpmdW5jdGlvbnMsIGluc3RlYWQgb2YgcGFpbnN0YWtpbmdseSBsb29raW5nIGF0IHJhdyBrZXkgZXZlbnRzLjwvcD4KCjxwPkJ1aWx0LWluIGNvbW1hbmRzIG1hcCB0byBzdHJpbmdzLCByYXRoZXIgdGhhbiBmdW5jdGlvbnMsIGZvcgpleGFtcGxlIDxjb2RlPiJnb0xpbmVVcCI8L2NvZGU+IGlzIHRoZSBkZWZhdWx0IGFjdGlvbiBib3VuZCB0byB0aGUgdXAKYXJyb3cga2V5LiBUaGlzIGFsbG93cyBuZXcga2V5bWFwcyB0byByZWZlciB0byB0aGVtIHdpdGhvdXQKZHVwbGljYXRpbmcgYW55IGNvZGUuIE5ldyBjb21tYW5kcyBjYW4gYmUgZGVmaW5lZCBieSBhc3NpZ25pbmcgdG8KdGhlIDxjb2RlPkNvZGVNaXJyb3IuY29tbWFuZHM8L2NvZGU+IG9iamVjdCwgd2hpY2ggbWFwcyBzdWNoIGNvbW1hbmRzCnRvIGZ1bmN0aW9ucy48L3A+Cgo8cD5UaGUgaGlkZGVuIHRleHRhcmVhIG5vdyBvbmx5IGhvbGRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgd2l0aCBubwpleHRyYSBjaGFyYWN0ZXJzIGFyb3VuZCBpdC4gVGhpcyBoYXMgYSBuaWNlIGFkdmFudGFnZTogcG9sbGluZyBmb3IKaW5wdXQgYmVjb21lcyBtdWNoLCBtdWNoIGZhc3Rlci4gSWYgdGhlcmUncyBhIGJpZyBzZWxlY3Rpb24sIHRoaXMgdGV4dApkb2VzIG5vdCBoYXZlIHRvIGJlIHJlYWQgZnJvbSB0aGUgdGV4dGFyZWEgZXZlcnkgdGltZeKAlHdoZW4gd2UgcG9sbCwKanVzdCBub3RpY2luZyB0aGF0IHNvbWV0aGluZyBpcyBzdGlsbCBzZWxlY3RlZCBpcyBlbm91Z2ggdG8gdGVsbCB1cwp0aGF0IG5vIG5ldyB0ZXh0IHdhcyB0eXBlZC48L3A+Cgo8cD5UaGUgcmVhc29uIHRoYXQgY2hlYXAgcG9sbGluZyBpcyBpbXBvcnRhbnQgaXMgdGhhdCBtYW55IGJyb3dzZXJzIGRvCm5vdCBmaXJlIHVzZWZ1bCBldmVudHMgb24gSU1FIChpbnB1dCBtZXRob2QgZW5naW5lKSBpbnB1dCwgd2hpY2ggaXMKdGhlIHRoaW5nIHdoZXJlIHBlb3BsZSBpbnB1dHRpbmcgYSBsYW5ndWFnZSBsaWtlIEphcGFuZXNlIG9yIENoaW5lc2UKdXNlIG11bHRpcGxlIGtleXN0cm9rZXMgdG8gY3JlYXRlIGEgY2hhcmFjdGVyIG9yIHNlcXVlbmNlIG9mCmNoYXJhY3RlcnMuIE1vc3QgbW9kZXJuIGJyb3dzZXJzIGZpcmUgPGNvZGU+aW5wdXQ8L2NvZGU+IHdoZW4gdGhlCmNvbXBvc2luZyBpcyBmaW5pc2hlZCwgYnV0IG1hbnkgZG9uJ3QgZmlyZSBhbnl0aGluZyB3aGVuIHRoZSBjaGFyYWN0ZXIKaXMgdXBkYXRlZCA8ZW0+ZHVyaW5nPC9lbT4gY29tcG9zaXRpb24uIFNvIHdlIHBvbGwsIHdoZW5ldmVyIHRoZQplZGl0b3IgaXMgZm9jdXNlZCwgdG8gcHJvdmlkZSBpbW1lZGlhdGUgdXBkYXRlcyBvZiB0aGUgZGlzcGxheS48L3A+Cgo8L2Rpdj48ZGl2IGNsYXNzPSJyaWdodHNtYWxsIGJsayI+CgogICAgPGgyPkNvbnRlbnRzPC9oMj4KCiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI2FwcHJvYWNoIj5HZW5lcmFsIEFwcHJvYWNoPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjaW5wdXQiPklucHV0PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjc2VsZWN0aW9uIj5TZWxlY3Rpb248L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiN1cGRhdGUiPkludGVsbGlnZW50IFVwZGF0aW5nPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjcGFyc2UiPlBhcnNpbmc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNzdW1tYXJ5Ij5XaGF0IEdpdmVzPzwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI2J0cmVlIj5Db250ZW50IFJlcHJlc2VudGF0aW9uPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIja2V5bWFwIj5LZXkgTWFwczwvYT48L2xpPgogICAgPC91bD4KCjwvZGl2PjwvZGl2PgoKPGRpdiBzdHlsZT0iaGVpZ2h0OiAyZW0iPiZuYnNwOzwvZGl2PgoKPC9ib2R5PjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/manual.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBVc2VyIE1hbnVhbDwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Ecm9pZCtTYW5zfERyb2lkK1NhbnM6Ym9sZCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iZG9jcy5jc3MiLz4KICAgIDxzdHlsZT5kbCBkbCB7bWFyZ2luOiAwO308L3N0eWxlPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvdXRpbC9ydW5tb2RlLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvdXRpbC9jb2xvcml6ZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3MvY3NzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0PgogIDwvaGVhZD4KICA8Ym9keT4KCjxoMT48c3BhbiBjbGFzcz0ibG9nby1icmFjZXMiPnsgfTwvc3Bhbj4gPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0LyI+Q29kZU1pcnJvcjwvYT48L2gxPgoKPGRpdiBjbGFzcz0iZ3JleSI+CjxpbWcgc3JjPSJiYWJvb24ucG5nIiBjbGFzcz0ibG9nbyIgYWx0PSJsb2dvIi8+CjxwcmU+Ci8qIFVzZXIgbWFudWFsIGFuZAogICByZWZlcmVuY2UgZ3VpZGUgKi8KPC9wcmU+CjwvZGl2PgoKPGRpdiBjbGFzcz0iY2xlYXIiPjxkaXYgY2xhc3M9ImxlZnRiaWcgYmxrIj4KCiAgICA8aDIgaWQ9Im92ZXJ2aWV3Ij5PdmVydmlldzwvaDI+CgogICAgPHA+Q29kZU1pcnJvciBpcyBhIGNvZGUtZWRpdG9yIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBlbWJlZGRlZCBpbgogICAgV2ViIHBhZ2VzLiBUaGUgY29yZSBsaWJyYXJ5IHByb3ZpZGVzIDxlbT5vbmx5PC9lbT4gdGhlIGVkaXRvcgogICAgY29tcG9uZW50LCBubyBhY2NvbXBhbnlpbmcgYnV0dG9ucywgYXV0by1jb21wbGV0aW9uLCBvciBvdGhlciBJREUKICAgIGZ1bmN0aW9uYWxpdHkuIEl0IGRvZXMgcHJvdmlkZSBhIHJpY2ggQVBJIG9uIHRvcCBvZiB3aGljaCBzdWNoCiAgICBmdW5jdGlvbmFsaXR5IGNhbiBiZSBzdHJhaWdodGZvcndhcmRseSBpbXBsZW1lbnRlZC4gU2VlCiAgICB0aGUgPGEgaHJlZj0iI2FkZG9ucyI+YWRkLW9uczwvYT4gaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiwKICAgIGFuZAogICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYWd0aGVkcnVtbWVyL2NvZGVtaXJyb3ItdWkiPkNvZGVNaXJyb3IKICAgIFVJPC9hPiBwcm9qZWN0LCBmb3IgcmV1c2FibGUgaW1wbGVtZW50YXRpb25zIG9mIGV4dHJhIGZlYXR1cmVzLjwvcD4KCiAgICA8cD5Db2RlTWlycm9yIHdvcmtzIHdpdGggbGFuZ3VhZ2Utc3BlY2lmaWMgbW9kZXMuIE1vZGVzIGFyZQogICAgSmF2YVNjcmlwdCBwcm9ncmFtcyB0aGF0IGhlbHAgY29sb3IgKGFuZCBvcHRpb25hbGx5IGluZGVudCkgdGV4dAogICAgd3JpdHRlbiBpbiBhIGdpdmVuIGxhbmd1YWdlLiBUaGUgZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggYSBudW1iZXIKICAgIG9mIG1vZGVzIChzZWUgdGhlIDxhIGhyZWY9Ii4uL21vZGUvIj48Y29kZT5tb2RlLzwvY29kZT48L2E+CiAgICBkaXJlY3RvcnkpLCBhbmQgaXQgaXNuJ3QgaGFyZCB0byA8YSBocmVmPSIjbW9kZWFwaSI+d3JpdGUgbmV3CiAgICBvbmVzPC9hPiBmb3Igb3RoZXIgbGFuZ3VhZ2VzLjwvcD4KCiAgICA8aDIgaWQ9InVzYWdlIj5CYXNpYyBVc2FnZTwvaDI+CgogICAgPHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSBDb2RlTWlycm9yIGlzIHRvIHNpbXBseSBsb2FkIHRoZSBzY3JpcHQKICAgIGFuZCBzdHlsZSBzaGVldCBmb3VuZCB1bmRlciA8Y29kZT5saWIvPC9jb2RlPiBpbiB0aGUgZGlzdHJpYnV0aW9uLAogICAgcGx1cyBhIG1vZGUgc2NyaXB0IGZyb20gb25lIG9mIHRoZSA8Y29kZT5tb2RlLzwvY29kZT4gZGlyZWN0b3JpZXMuCiAgICAoU2VlIDxhIGhyZWY9ImNvbXByZXNzLmh0bWwiPnRoZSBjb21wcmVzc2lvbiBoZWxwZXI8L2E+IGZvciBhbgogICAgZWFzeSB3YXkgdG8gY29tYmluZSBzY3JpcHRzLikgRm9yIGV4YW1wbGU6PC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPSJ0ZXh0L2h0bWwiPiZsdDtzY3JpcHQgc3JjPSJsaWIvY29kZW1pcnJvci5qcyI+Jmx0Oy9zY3JpcHQ+CiZsdDtsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KJmx0O3NjcmlwdCBzcmM9Im1vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj4mbHQ7L3NjcmlwdD48L3ByZT4KCiAgICA8cD5IYXZpbmcgZG9uZSB0aGlzLCBhbiBlZGl0b3IgaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgbGlrZQogICAgdGhpczo8L3A+CgogICAgPHByZSBkYXRhLWxhbmc9ImphdmFzY3JpcHQiPnZhciBteUNvZGVNaXJyb3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmJvZHkpOzwvcHJlPgoKICAgIDxwPlRoZSBlZGl0b3Igd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZG9jdW1lbnQgYm9keSwgd2lsbCBzdGFydAogICAgZW1wdHksIGFuZCB3aWxsIHVzZSB0aGUgbW9kZSB0aGF0IHdlIGxvYWRlZC4gVG8gaGF2ZSBtb3JlIGNvbnRyb2wKICAgIG92ZXIgdGhlIG5ldyBlZGl0b3IsIGEgY29uZmlndXJhdGlvbiBvYmplY3QgY2FuIGJlIHBhc3NlZAogICAgdG8gPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4gYXMgYSBzZWNvbmQgYXJndW1lbnQ6PC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij52YXIgbXlDb2RlTWlycm9yID0gQ29kZU1pcnJvcihkb2N1bWVudC5ib2R5LCB7CiAgdmFsdWU6ICJmdW5jdGlvbiBteVNjcmlwdCgpe3JldHVybiAxMDA7fVxuIiwKICBtb2RlOiAgImphdmFzY3JpcHQiCn0pOzwvcHJlPgoKICAgIDxwPlRoaXMgd2lsbCBpbml0aWFsaXplIHRoZSBlZGl0b3Igd2l0aCBhIHBpZWNlIG9mIGNvZGUgYWxyZWFkeSBpbgogICAgaXQsIGFuZCBleHBsaWNpdGx5IHRlbGwgaXQgdG8gdXNlIHRoZSBKYXZhU2NyaXB0IG1vZGUgKHdoaWNoIGlzCiAgICB1c2VmdWwgd2hlbiBtdWx0aXBsZSBtb2RlcyBhcmUgbG9hZGVkKS4KICAgIFNlZSA8YSBocmVmPSIjY29uZmlnIj5iZWxvdzwvYT4gZm9yIGEgZnVsbCBkaXNjdXNzaW9uIG9mIHRoZQogICAgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgQ29kZU1pcnJvciBhY2NlcHRzLjwvcD4KCiAgICA8cD5JbiBjYXNlcyB3aGVyZSB5b3UgZG9uJ3Qgd2FudCB0byBhcHBlbmQgdGhlIGVkaXRvciB0byBhbgogICAgZWxlbWVudCwgYW5kIG5lZWQgbW9yZSBjb250cm9sIG92ZXIgdGhlIHdheSBpdCBpcyBpbnNlcnRlZCwgdGhlCiAgICBmaXJzdCBhcmd1bWVudCB0byB0aGUgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4gZnVuY3Rpb24gY2FuIGFsc28KICAgIGJlIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBnaXZlbiBhIERPTSBlbGVtZW50LCBpbnNlcnRzIGl0IGludG8gdGhlCiAgICBkb2N1bWVudCBzb21ld2hlcmUuIFRoaXMgY291bGQgYmUgdXNlZCB0bywgZm9yIGV4YW1wbGUsIHJlcGxhY2UgYQogICAgdGV4dGFyZWEgd2l0aCBhIHJlYWwgZWRpdG9yOjwvcD4KCiAgICA8cHJlIGRhdGEtbGFuZz0iamF2YXNjcmlwdCI+dmFyIG15Q29kZU1pcnJvciA9IENvZGVNaXJyb3IoZnVuY3Rpb24oZWx0KSB7CiAgbXlUZXh0QXJlYS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlbHQsIG15VGV4dEFyZWEpOwp9LCB7dmFsdWU6IG15VGV4dEFyZWEudmFsdWV9KTs8L3ByZT4KCiAgICA8cD5Ib3dldmVyLCBmb3IgdGhpcyB1c2UgY2FzZSwgd2hpY2ggaXMgYSBjb21tb24gd2F5IHRvIHVzZQogICAgQ29kZU1pcnJvciwgdGhlIGxpYnJhcnkgcHJvdmlkZXMgYSBtdWNoIG1vcmUgcG93ZXJmdWwKICAgIHNob3J0Y3V0OjwvcD4KCiAgICA8cHJlIGRhdGEtbGFuZz0iamF2YXNjcmlwdCI+dmFyIG15Q29kZU1pcnJvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKG15VGV4dEFyZWEpOzwvcHJlPgoKICAgIDxwPlRoaXMgd2lsbCwgYW1vbmcgb3RoZXIgdGhpbmdzLCBlbnN1cmUgdGhhdCB0aGUgdGV4dGFyZWEncyB2YWx1ZQogICAgaXMgdXBkYXRlZCB3aXRoIHRoZSBlZGl0b3IncyBjb250ZW50cyB3aGVuIHRoZSBmb3JtIChpZiBpdCBpcyBwYXJ0CiAgICBvZiBhIGZvcm0pIGlzIHN1Ym1pdHRlZC4gU2VlIHRoZSA8YSBocmVmPSIjZnJvbVRleHRBcmVhIj5BUEkKICAgIHJlZmVyZW5jZTwvYT4gZm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGlzIG1ldGhvZC48L3A+CgogICAgPGgyIGlkPSJjb25maWciPkNvbmZpZ3VyYXRpb248L2gyPgoKICAgIDxwPkJvdGggdGhlIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IGZ1bmN0aW9uIGFuZAogICAgaXRzIDxjb2RlPmZyb21UZXh0QXJlYTwvY29kZT4gbWV0aG9kIHRha2UgYXMgc2Vjb25kIChvcHRpb25hbCkKICAgIGFyZ3VtZW50IGFuIG9iamVjdCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gQW55IG9wdGlvbgogICAgbm90IHN1cHBsaWVkIGxpa2UgdGhpcyB3aWxsIGJlIHRha2VuCiAgICBmcm9tIDxjb2RlPkNvZGVNaXJyb3IuZGVmYXVsdHM8L2NvZGU+LCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUKICAgIGRlZmF1bHQgb3B0aW9ucy4gWW91IGNhbiB1cGRhdGUgdGhpcyBvYmplY3QgdG8gY2hhbmdlIHRoZSBkZWZhdWx0cwogICAgb24geW91ciBwYWdlLjwvcD4KCiAgICA8cD5PcHRpb25zIGFyZSBub3QgY2hlY2tlZCBpbiBhbnkgd2F5LCBzbyBzZXR0aW5nIGJvZ3VzIG9wdGlvbgogICAgdmFsdWVzIGlzIGJvdW5kIHRvIGxlYWQgdG8gb2RkIGVycm9ycy48L3A+CgogICAgPHA+VGhlc2UgYXJlIHRoZSBzdXBwb3J0ZWQgb3B0aW9uczo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9Im9wdGlvbl92YWx1ZSI+PGNvZGU+dmFsdWUgKHN0cmluZyk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9tb2RlIj48Y29kZT5tb2RlIChzdHJpbmcgb3Igb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIG1vZGUgdG8gdXNlLiBXaGVuIG5vdCBnaXZlbiwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlCiAgICAgIGZpcnN0IG1vZGUgdGhhdCB3YXMgbG9hZGVkLiBJdCBtYXkgYmUgYSBzdHJpbmcsIHdoaWNoIGVpdGhlcgogICAgICBzaW1wbHkgbmFtZXMgdGhlIG1vZGUgb3IgaXMKICAgICAgYSA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01JTUUiPk1JTUU8L2E+IHR5cGUKICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlLiBBbHRlcm5hdGl2ZWx5LCBpdCBtYXkgYmUgYW4gb2JqZWN0CiAgICAgIGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbW9kZSwgd2l0aAogICAgICBhIDxjb2RlPm5hbWU8L2NvZGU+IHByb3BlcnR5IHRoYXQgbmFtZXMgdGhlIG1vZGUgKGZvcgogICAgICBleGFtcGxlIDxjb2RlPntuYW1lOiAiamF2YXNjcmlwdCIsIGpzb246IHRydWV9PC9jb2RlPikuIFRoZSBkZW1vCiAgICAgIHBhZ2VzIGZvciBlYWNoIG1vZGUgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGNvbmZpZ3VyYXRpb24KICAgICAgcGFyYW1ldGVycyB0aGUgbW9kZSBzdXBwb3J0cy4gWW91IGNhbiBhc2sgQ29kZU1pcnJvciB3aGljaCBtb2RlcwogICAgICBhbmQgTUlNRSB0eXBlcyBoYXZlIGJlZW4gZGVmaW5lZCBieSBpbnNwZWN0aW5nCiAgICAgIHRoZSA8Y29kZT5Db2RlTWlycm9yLm1vZGVzPC9jb2RlPgogICAgICBhbmQgPGNvZGU+Q29kZU1pcnJvci5taW1lTW9kZXM8L2NvZGU+IG9iamVjdHMuIFRoZSBmaXJzdCBtYXBzCiAgICAgIG1vZGUgbmFtZXMgdG8gdGhlaXIgY29uc3RydWN0b3JzLCBhbmQgdGhlIHNlY29uZCBtYXBzIE1JTUUgdHlwZXMKICAgICAgdG8gbW9kZSBzcGVjcy48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fdGhlbWUiPjxjb2RlPnRoZW1lIChzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgdGhlbWUgdG8gc3R5bGUgdGhlIGVkaXRvciB3aXRoLiBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlCiAgICAgIENTUyBmaWxlIGRlZmluaW5nIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPi5jbS1zLVtuYW1lXTwvY29kZT4KICAgICAgc3R5bGVzIGlzIGxvYWRlZCAoc2VlCiAgICAgIHRoZSA8YSBocmVmPSIuLi90aGVtZS8iPjxjb2RlPnRoZW1lPC9jb2RlPjwvYT4gZGlyZWN0b3J5IGluIHRoZQogICAgICBkaXN0cmlidXRpb24pLiBUaGUgZGVmYXVsdCBpcyA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+LCBmb3Igd2hpY2gKICAgICAgY29sb3JzIGFyZSBpbmNsdWRlZCBpbiA8Y29kZT5jb2RlbWlycm9yLmNzczwvY29kZT4uIEl0IGlzCiAgICAgIHBvc3NpYmxlIHRvIHVzZSBtdWx0aXBsZSB0aGVtaW5nIGNsYXNzZXMgYXQgb25jZeKAlGZvcgogICAgICBleGFtcGxlIDxjb2RlPiJmb28gYmFyIjwvY29kZT4gd2lsbCBhc3NpZ24gYm90aAogICAgICB0aGUgPGNvZGU+Y20tcy1mb288L2NvZGU+IGFuZCB0aGUgPGNvZGU+Y20tcy1iYXI8L2NvZGU+IGNsYXNzZXMKICAgICAgdG8gdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25faW5kZW50VW5pdCI+PGNvZGU+aW5kZW50VW5pdCAoaW50ZWdlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkhvdyBtYW55IHNwYWNlcyBhIGJsb2NrICh3aGF0ZXZlciB0aGF0IG1lYW5zIGluIHRoZSBlZGl0ZWQKICAgICAgbGFuZ3VhZ2UpIHNob3VsZCBiZSBpbmRlbnRlZC4gVGhlIGRlZmF1bHQgaXMgMi48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fc21hcnRJbmRlbnQiPjxjb2RlPnNtYXJ0SW5kZW50IChib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hldGhlciB0byB1c2UgdGhlIGNvbnRleHQtc2Vuc2l0aXZlIGluZGVudGF0aW9uIHRoYXQgdGhlCiAgICAgIG1vZGUgcHJvdmlkZXMgKG9yIGp1c3QgaW5kZW50IHRoZSBzYW1lIGFzIHRoZSBsaW5lIGJlZm9yZSkuCiAgICAgIERlZmF1bHRzIHRvIHRydWUuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX3RhYlNpemUiPjxjb2RlPnRhYlNpemUgKGludGVnZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgd2lkdGggb2YgYSB0YWIgY2hhcmFjdGVyLiBEZWZhdWx0cyB0byA0LjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9pbmRlbnRXaXRoVGFicyI+PGNvZGU+aW5kZW50V2l0aFRhYnMgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGV0aGVyLCB3aGVuIGluZGVudGluZywgdGhlIGZpcnN0IE4qPGNvZGU+dGFiU2l6ZTwvY29kZT4KICAgICAgc3BhY2VzIHNob3VsZCBiZSByZXBsYWNlZCBieSBOIHRhYnMuIERlZmF1bHQgaXMgZmFsc2UuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2VsZWN0cmljQ2hhcnMiPjxjb2RlPmVsZWN0cmljQ2hhcnMgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Db25maWd1cmVzIHdoZXRoZXIgdGhlIGVkaXRvciBzaG91bGQgcmUtaW5kZW50IHRoZSBjdXJyZW50CiAgICAgIGxpbmUgd2hlbiBhIGNoYXJhY3RlciBpcyB0eXBlZCB0aGF0IG1pZ2h0IGNoYW5nZSBpdHMgcHJvcGVyCiAgICAgIGluZGVudGF0aW9uIChvbmx5IHdvcmtzIGlmIHRoZSBtb2RlIHN1cHBvcnRzIGluZGVudGF0aW9uKS4KICAgICAgRGVmYXVsdCBpcyB0cnVlLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9rZXlNYXAiPjxjb2RlPmtleU1hcCAoc3RyaW5nKTwvY29kZT48L2R0PgogICAgICA8ZGQ+Q29uZmlndXJlcyB0aGUga2V5bWFwIHRvIHVzZS4gVGhlIGRlZmF1bHQKICAgICAgaXMgPGNvZGU+ImRlZmF1bHQiPC9jb2RlPiwgd2hpY2ggaXMgdGhlIG9ubHkga2V5bWFwIGRlZmluZWQKICAgICAgaW4gPGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT4gaXRzZWxmLiBFeHRyYSBrZXltYXBzIGFyZSBmb3VuZCBpbgogICAgICB0aGUgPGEgaHJlZj0iLi4va2V5bWFwLyI+PGNvZGU+a2V5bWFwPC9jb2RlPjwvYT4gZGlyZWN0b3J5LiBTZWUKICAgICAgdGhlIDxhIGhyZWY9IiNrZXltYXBzIj5zZWN0aW9uIG9uIGtleW1hcHM8L2E+IGZvciBtb3JlCiAgICAgIGluZm9ybWF0aW9uLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9leHRyYUtleXMiPjxjb2RlPmV4dHJhS2V5cyAob2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+Q2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBleHRyYSBrZXliaW5kaW5ncyBmb3IgdGhlIGVkaXRvciwKICAgICAgYWxvbmdzaWRlIHRoZSBvbmVzIGRlZmluZWQKICAgICAgYnkgPGEgaHJlZj0iI29wdGlvbl9rZXlNYXAiPjxjb2RlPmtleU1hcDwvY29kZT48L2E+LiBTaG91bGQgYmUKICAgICAgZWl0aGVyIG51bGwsIG9yIGEgdmFsaWQgPGEgaHJlZj0iI2tleW1hcHMiPmtleW1hcDwvYT4gdmFsdWUuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2xpbmVXcmFwcGluZyI+PGNvZGU+bGluZVdyYXBwaW5nIChib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hldGhlciBDb2RlTWlycm9yIHNob3VsZCBzY3JvbGwgb3Igd3JhcCBmb3IgbG9uZyBsaW5lcy4KICAgICAgRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IChzY3JvbGwpLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9saW5lTnVtYmVycyI+PGNvZGU+bGluZU51bWJlcnMgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGV0aGVyIHRvIHNob3cgbGluZSBudW1iZXJzIHRvIHRoZSBsZWZ0IG9mIHRoZSBlZGl0b3IuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2ZpcnN0TGluZU51bWJlciI+PGNvZGU+Zmlyc3RMaW5lTnVtYmVyIChpbnRlZ2VyKTwvY29kZT48L2R0PgogICAgICA8ZGQ+QXQgd2hpY2ggbnVtYmVyIHRvIHN0YXJ0IGNvdW50aW5nIGxpbmVzLiBEZWZhdWx0IGlzIDEuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2xpbmVOdW1iZXJGb3JtYXR0ZXIiPjxjb2RlPmxpbmVOdW1iZXJGb3JtYXR0ZXIgKGZ1bmN0aW9uKTwvY29kZT48L2R0PgogICAgICA8ZGQ+QSBmdW5jdGlvbiB1c2VkIHRvIGZvcm1hdCBsaW5lIG51bWJlcnMuIFRoZSBmdW5jdGlvbiBpcwogICAgICBwYXNzZWQgdGhlIGxpbmUgbnVtYmVyLCBhbmQgc2hvdWxkIHJldHVybiBhIHN0cmluZyB0aGF0IHdpbGwgYmUKICAgICAgc2hvd24gaW4gdGhlIGd1dHRlci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fZ3V0dGVycyI+PGNvZGU+Z3V0dGVycyAoYXJyYXkpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DYW4gYmUgdXNlZCB0byBhZGQgZXh0cmEgZ3V0dGVycyAoYmV5b25kIG9yIGluc3RlYWQgb2YgdGhlCiAgICAgIGxpbmUgbnVtYmVyIGd1dHRlcikuIFNob3VsZCBiZSBhbiBhcnJheSBvZiBDU1MgY2xhc3MgbmFtZXMsIGVhY2gKICAgICAgb2Ygd2hpY2ggZGVmaW5lcyBhIDxjb2RlPndpZHRoPC9jb2RlPiAoYW5kIG9wdGlvbmFsbHkgYQogICAgICBiYWNrZ3JvdW5kKSwgYW5kIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBkcmF3IHRoZSBiYWNrZ3JvdW5kIG9mCiAgICAgIHRoZSBndXR0ZXJzLiA8ZW0+TWF5PC9lbT4gaW5jbHVkZQogICAgICB0aGUgPGNvZGU+Q29kZU1pcnJvci1saW5lbnVtYmVyczwvY29kZT4gY2xhc3MsIGluIG9yZGVyIHRvCiAgICAgIGV4cGxpY2l0bHkgc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbGluZSBudW1iZXIgZ3V0dGVyIChpdCB3aWxsCiAgICAgIGRlZmF1bHQgdG8gYmUgdG8gdGhlIHJpZ2h0IG9mIGFsbCBvdGhlciBndXR0ZXJzKS4gVGhlc2UgY2xhc3MKICAgICAgbmFtZXMgYXJlIHRoZSBrZXlzIHBhc3NlZAogICAgICB0byA8YSBocmVmPSIjc2V0R3V0dGVyTWFya2VyIj48Y29kZT5zZXRHdXR0ZXJNYXJrZXI8L2NvZGU+PC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fcmVhZE9ubHkiPjxjb2RlPnJlYWRPbmx5IChib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhpcyBkaXNhYmxlcyBlZGl0aW5nIG9mIHRoZSBlZGl0b3IgY29udGVudCBieSB0aGUgdXNlci4gSWYKICAgICAgdGhlIHNwZWNpYWwgdmFsdWUgPGNvZGU+Im5vY3Vyc29yIjwvY29kZT4gaXMgZ2l2ZW4gKGluc3RlYWQgb2YKICAgICAgc2ltcGx5IDxjb2RlPnRydWU8L2NvZGU+KSwgZm9jdXNpbmcgb2YgdGhlIGVkaXRvciBpcyBhbHNvCiAgICAgIGRpc2FsbG93ZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX3Nob3dDdXJzb3JXaGVuU2VsZWN0aW5nIj48Y29kZT5zaG93Q3Vyc29yV2hlblNlbGVjdGluZyAoYm9vbGVhbik8L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZXRoZXIgdGhlIGN1cnNvciBzaG91bGQgYmUgZHJhd24gd2hlbiBhIHNlbGVjdGlvbiBpcwogICAgICBhY3RpdmUuIERlZmF1bHRzIHRvIGZhbHNlLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl91bmRvRGVwdGgiPjxjb2RlPnVuZG9EZXB0aCAoaW50ZWdlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSBtYXhpbXVtIG51bWJlciBvZiB1bmRvIGxldmVscyB0aGF0IHRoZSBlZGl0b3Igc3RvcmVzLgogICAgICBEZWZhdWx0cyB0byA0MC48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fdGFiaW5kZXgiPjxjb2RlPnRhYmluZGV4IChpbnRlZ2VyKTwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEvaW50ZXJhY3QvZm9ybXMuaHRtbCNhZGVmLXRhYmluZGV4Ij50YWIKICAgICAgaW5kZXg8L2E+IHRvIGFzc2lnbiB0byB0aGUgZWRpdG9yLiBJZiBub3QgZ2l2ZW4sIG5vIHRhYiBpbmRleAogICAgICB3aWxsIGJlIGFzc2lnbmVkLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9hdXRvZm9jdXMiPjxjb2RlPmF1dG9mb2N1cyAoYm9vbGVhbik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNhbiBiZSB1c2VkIHRvIG1ha2UgQ29kZU1pcnJvciBmb2N1cyBpdHNlbGYgb24KICAgICAgaW5pdGlhbGl6YXRpb24uIERlZmF1bHRzIHRvIG9mZi4KICAgICAgV2hlbiA8YSBocmVmPSIjZnJvbVRleHRBcmVhIj48Y29kZT5mcm9tVGV4dEFyZWE8L2NvZGU+PC9hPiBpcwogICAgICB1c2VkLCBhbmQgbm8gZXhwbGljaXQgdmFsdWUgaXMgZ2l2ZW4gZm9yIHRoaXMgb3B0aW9uLCBpdCB3aWxsIGJlCiAgICAgIHNldCB0byB0cnVlIHdoZW4gZWl0aGVyIHRoZSBzb3VyY2UgdGV4dGFyZWEgaXMgZm9jdXNlZCwgb3IgaXQKICAgICAgaGFzIGFuIDxjb2RlPmF1dG9mb2N1czwvY29kZT4gYXR0cmlidXRlIGFuZCBubyBvdGhlciBlbGVtZW50IGlzCiAgICAgIGZvY3VzZWQuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+QmVsb3cgdGhpcyBhIGZldyBtb3JlIHNwZWNpYWxpemVkLCBsb3ctbGV2ZWwgb3B0aW9ucyBhcmUKICAgIGxpc3RlZC4gVGhlc2UgYXJlIG9ubHkgdXNlZnVsIGluIHZlcnkgc3BlY2lmaWMgc2l0dWF0aW9ucywgeW91CiAgICBtaWdodCB3YW50IHRvIHNraXAgdGhlbSB0aGUgZmlyc3QgdGltZSB5b3UgcmVhZCB0aGlzIG1hbnVhbC48L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9Im9wdGlvbl9kcmFnRHJvcCI+PGNvZGU+ZHJhZ0Ryb3AgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Db250cm9scyB3aGV0aGVyIGRyYWctYW5kLWRyb3AgaXMgZW5hYmxlZC4gT24gYnkgZGVmYXVsdC48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fb25EcmFnRXZlbnQiPjxjb2RlPm9uRHJhZ0V2ZW50IChmdW5jdGlvbik8L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZW4gZ2l2ZW4sIHRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGhhbmRsaW5nCiAgICAgIGEgPGNvZGU+ZHJhZ2VudGVyPC9jb2RlPiwgPGNvZGU+ZHJhZ292ZXI8L2NvZGU+LAogICAgICBvciA8Y29kZT5kcm9wPC9jb2RlPiBldmVudC4gSXQgd2lsbCBiZSBwYXNzZWQgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICBhbmQgdGhlIGV2ZW50IG9iamVjdCBhcyBhcmd1bWVudHMuIFRoZSBjYWxsYmFjayBjYW4gY2hvb3NlIHRvCiAgICAgIGhhbmRsZSB0aGUgZXZlbnQgaXRzZWxmLCBpbiB3aGljaCBjYXNlIGl0IHNob3VsZAogICAgICByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5kaWNhdGUgdGhhdCBDb2RlTWlycm9yIHNob3VsZCBub3QKICAgICAgZG8gYW55dGhpbmcgZnVydGhlci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fb25LZXlFdmVudCI+PGNvZGU+b25LZXlFdmVudCAoZnVuY3Rpb24pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGlzIHByb3ZpZGVzIGEgcmF0aGVyIGxvdy1sZXZlbCBob29rIGludG8gQ29kZU1pcnJvcidzIGtleQogICAgICBoYW5kbGluZy4gSWYgcHJvdmlkZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24KICAgICAgZXZlcnkgPGNvZGU+a2V5ZG93bjwvY29kZT4sIDxjb2RlPmtleXVwPC9jb2RlPiwKICAgICAgYW5kIDxjb2RlPmtleXByZXNzPC9jb2RlPiBldmVudCB0aGF0IENvZGVNaXJyb3IgY2FwdHVyZXMuIEl0CiAgICAgIHdpbGwgYmUgcGFzc2VkIHR3byBhcmd1bWVudHMsIHRoZSBlZGl0b3IgaW5zdGFuY2UgYW5kIHRoZSBrZXkKICAgICAgZXZlbnQuIFRoaXMga2V5IGV2ZW50IGlzIHByZXR0eSBtdWNoIHRoZSByYXcga2V5IGV2ZW50LCBleGNlcHQKICAgICAgdGhhdCBhIDxjb2RlPnN0b3AoKTwvY29kZT4gbWV0aG9kIGlzIGFsd2F5cyBhZGRlZCB0byBpdC4gWW91CiAgICAgIGNvdWxkIGZlZWQgaXQgdG8sIGZvciBleGFtcGxlLCA8Y29kZT5qUXVlcnkuRXZlbnQ8L2NvZGU+IHRvCiAgICAgIGZ1cnRoZXIgbm9ybWFsaXplIGl0Ljxicj5UaGlzIGZ1bmN0aW9uIGNhbiBpbnNwZWN0IHRoZSBrZXkKICAgICAgZXZlbnQsIGFuZCBoYW5kbGUgaXQgaWYgaXQgd2FudHMgdG8uIEl0IG1heSByZXR1cm4gdHJ1ZSB0byB0ZWxsCiAgICAgIENvZGVNaXJyb3IgdG8gaWdub3JlIHRoZSBldmVudC4gQmUgd2FyeSB0aGF0LCBvbiBzb21lIGJyb3dzZXJzLAogICAgICBzdG9wcGluZyBhIDxjb2RlPmtleWRvd248L2NvZGU+IGRvZXMgbm90IHN0b3AKICAgICAgdGhlIDxjb2RlPmtleXByZXNzPC9jb2RlPiBmcm9tIGZpcmluZywgd2hlcmVhcyBvbiBvdGhlcnMgaXQKICAgICAgZG9lcy4gSWYgeW91IHJlc3BvbmQgdG8gYW4gZXZlbnQsIHlvdSBzaG91bGQgcHJvYmFibHkgaW5zcGVjdAogICAgICBpdHMgPGNvZGU+dHlwZTwvY29kZT4gcHJvcGVydHkgYW5kIG9ubHkgZG8gc29tZXRoaW5nIHdoZW4gaXQKICAgICAgaXMgPGNvZGU+a2V5ZG93bjwvY29kZT4gKG9yIDxjb2RlPmtleXByZXNzPC9jb2RlPiBmb3IgYWN0aW9ucwogICAgICB0aGF0IG5lZWQgY2hhcmFjdGVyIGRhdGEpLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9jdXJzb3JCbGlua1JhdGUiPjxjb2RlPmN1cnNvckJsaW5rUmF0ZSAobnVtYmVyKTwvY29kZT48L2R0PgogICAgICA8ZGQ+SGFsZi1wZXJpb2QgaW4gbWlsbGlzZWNvbmRzIHVzZWQgZm9yIGN1cnNvciBibGlua2luZy4gVGhlIGRlZmF1bHQgYmxpbmsKICAgICAgcmF0ZSBpcyA1MzBtcy48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fY3Vyc29ySGVpZ2h0Ij48Y29kZT5jdXJzb3JIZWlnaHQgKG51bWJlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkRldGVybWluZXMgdGhlIGhlaWdodCBvZiB0aGUgY3Vyc29yLiBEZWZhdWx0IGlzIDEsIG1lYW5pbmcKICAgICAgaXQgc3BhbnMgdGhlIHdob2xlIGhlaWdodCBvZiB0aGUgbGluZS4gRm9yIHNvbWUgZm9udHMgKGFuZCBieQogICAgICBzb21lIHRhc3RlcykgYSBzbWFsbGVyIGhlaWdodCAoZm9yIGV4YW1wbGUgPGNvZGU+MC44NTwvY29kZT4pLAogICAgICB3aGljaCBjYXVzZXMgdGhlIGN1cnNvciB0byBub3QgcmVhY2ggYWxsIHRoZSB3YXkgdG8gdGhlIGJvdHRvbQogICAgICBvZiB0aGUgbGluZSwgbG9va3MgYmV0dGVyPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX3dvcmtUaW1lIj48Y29kZT53b3JrVGltZSwgd29ya0RlbGF5IChudW1iZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5IaWdobGlnaHRpbmcgaXMgZG9uZSBieSBhIHBzZXVkbyBiYWNrZ3JvdW5kLXRocmVhZCB0aGF0IHdpbGwKICAgICAgd29yayBmb3IgPGNvZGU+d29ya1RpbWU8L2NvZGU+IG1pbGxpc2Vjb25kcywgYW5kIHRoZW4gdXNlCiAgICAgIHRpbWVvdXQgdG8gc2xlZXAgZm9yIDxjb2RlPndvcmtEZWxheTwvY29kZT4gbWlsbGlzZWNvbmRzLiBUaGUKICAgICAgZGVmYXVsdHMgYXJlIDIwMCBhbmQgMzAwLCB5b3UgY2FuIGNoYW5nZSB0aGVzZSBvcHRpb25zIHRvIG1ha2UKICAgICAgdGhlIGhpZ2hsaWdodGluZyBtb3JlIG9yIGxlc3MgYWdncmVzc2l2ZS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fcG9sbEludGVydmFsIj48Y29kZT5wb2xsSW50ZXJ2YWwgKG51bWJlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkluZGljYXRlcyBob3cgcXVpY2tseSBDb2RlTWlycm9yIHNob3VsZCBwb2xsIGl0cyBpbnB1dAogICAgICB0ZXh0YXJlYSBmb3IgY2hhbmdlcyAod2hlbiBmb2N1c2VkKS4gTW9zdCBpbnB1dCBpcyBjYXB0dXJlZCBieQogICAgICBldmVudHMsIGJ1dCBzb21lIHRoaW5ncywgbGlrZSBJTUUgaW5wdXQgb24gc29tZSBicm93c2VycywgZG9uJ3QKICAgICAgZ2VuZXJhdGUgZXZlbnRzIHRoYXQgYWxsb3cgQ29kZU1pcnJvciB0byBwcm9wZXJseSBkZXRlY3QgaXQuCiAgICAgIFRodXMsIGl0IHBvbGxzLiBEZWZhdWx0IGlzIDEwMCBtaWxsaXNlY29uZHMuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2ZsYXR0ZW5TcGFucyI+PGNvZGU+ZmxhdHRlblNwYW5zIChib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+QnkgZGVmYXVsdCwgQ29kZU1pcnJvciB3aWxsIGNvbWJpbmUgYWRqYWNlbnQgdG9rZW5zIGludG8gYQogICAgICBzaW5nbGUgc3BhbiBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgY2xhc3MuIFRoaXMgd2lsbCByZXN1bHQgaW4gYQogICAgICBzaW1wbGVyIERPTSB0cmVlLCBhbmQgdGh1cyBwZXJmb3JtIGJldHRlci4gV2l0aCBzb21lIGtpbmRzIG9mCiAgICAgIHN0eWxpbmcgKHN1Y2ggYXMgcm91bmRlZCBjb3JuZXJzKSwgdGhpcyB3aWxsIGNoYW5nZSB0aGUgd2F5IHRoZQogICAgICBkb2N1bWVudCBsb29rcy4gWW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGlzCiAgICAgIGJlaGF2aW9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl92aWV3cG9ydE1hcmdpbiI+PGNvZGU+dmlld3BvcnRNYXJnaW4gKGludGVnZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TcGVjaWZpZXMgdGhlIGFtb3VudCBvZiBsaW5lcyB0aGF0IGFyZSByZW5kZXJlZCBhYm92ZSBhbmQKICAgICAgYmVsb3cgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRoYXQncyBjdXJyZW50bHkgc2Nyb2xsZWQgaW50bwogICAgICB2aWV3LiBUaGlzIGFmZmVjdHMgdGhlIGFtb3VudCBvZiB1cGRhdGVzIG5lZWRlZCB3aGVuIHNjcm9sbGluZywKICAgICAgYW5kIHRoZSBhbW91bnQgb2Ygd29yayB0aGF0IHN1Y2ggYW4gdXBkYXRlIGRvZXMuIFlvdSBzaG91bGQKICAgICAgdXN1YWxseSBsZWF2ZSBpdCBhdCBpdHMgZGVmYXVsdCwgMTAwLiBDYW4gYmUgc2V0CiAgICAgIHRvIDxjb2RlPkluZmluaXR5PC9jb2RlPiB0byBtYWtlIHN1cmUgdGhlIHdob2xlIGRvY3VtZW50IGlzCiAgICAgIGFsd2F5cyByZW5kZXJlZCwgYW5kIHRodXMgdGhlIGJyb3dzZXIncyB0ZXh0IHNlYXJjaCB3b3JrcyBvbiBpdC4KICAgICAgVGhpcyA8ZW0+d2lsbDwvZW0+IGhhdmUgYmFkIGVmZmVjdHMgb24gcGVyZm9ybWFuY2Ugb2YgYmlnCiAgICAgIGRvY3VtZW50cy48L2RkPgogICAgPC9kbD4KCiAgICA8aDIgaWQ9ImV2ZW50cyI+RXZlbnRzPC9oMj4KCiAgICA8cD5BIENvZGVNaXJyb3IgaW5zdGFuY2UgZW1pdHMgYSBudW1iZXIgb2YgZXZlbnRzLCB3aGljaCBhbGxvdwogICAgY2xpZW50IGNvZGUgdG8gcmVhY3QgdG8gdmFyaW91cyBzaXR1YXRpb25zLiBUaGVzZSBhcmUgcmVnaXN0ZXJlZAogICAgd2l0aCB0aGUgPGEgaHJlZj0iI29uIj48Y29kZT5vbjwvY29kZT48L2E+IG1ldGhvZCAoYW5kCiAgICByZW1vdmVkIHdpdGggdGhlIDxhIGhyZWY9IiNvZmYiPjxjb2RlPm9mZjwvY29kZT48L2E+CiAgICBtZXRob2QpLiBUaGVzZSBhcmUgdGhlIGV2ZW50cyB0aGF0IGZpcmUgb24gdGhlIGluc3RhbmNlIG9iamVjdC4KICAgIFRoZSBuYW1lIG9mIHRoZSBldmVudCBpcyBmb2xsb3dlZCBieSB0aGUgYXJndW1lbnRzIHRoYXQgd2lsbCBiZQogICAgcGFzc2VkIHRvIHRoZSBoYW5kbGVyLiBUaGUgPGNvZGU+aW5zdGFuY2U8L2NvZGU+IGFyZ3VtZW50IGFsd2F5cwogICAgcmVmZXJzIHRvIHRoZSBlZGl0b3IgaW5zdGFuY2UuPC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJldmVudF9jaGFuZ2UiPjxjb2RlPiJjaGFuZ2UiIChpbnN0YW5jZSwgY2hhbmdlT2JqKTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZXMgZXZlcnkgdGltZSB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yIGlzIGNoYW5nZWQuCiAgICAgIFRoZSA8Y29kZT5jaGFuZ2VPYmo8L2NvZGU+IGlzIGEgPGNvZGU+e2Zyb20sIHRvLCB0ZXh0LAogICAgICBuZXh0fTwvY29kZT4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5nZXMKICAgICAgdGhhdCBvY2N1cnJlZCBhcyBzZWNvbmQgYXJndW1lbnQuIDxjb2RlPmZyb208L2NvZGU+CiAgICAgIGFuZCA8Y29kZT50bzwvY29kZT4gYXJlIHRoZSBwb3NpdGlvbnMgKGluIHRoZSBwcmUtY2hhbmdlCiAgICAgIGNvb3JkaW5hdGUgc3lzdGVtKSB3aGVyZSB0aGUgY2hhbmdlIHN0YXJ0ZWQgYW5kIGVuZGVkIChmb3IKICAgICAgZXhhbXBsZSwgaXQgbWlnaHQgYmUgPGNvZGU+e2NoOjAsIGxpbmU6MTh9PC9jb2RlPiBpZiB0aGUKICAgICAgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBsaW5lICMxOSkuIDxjb2RlPnRleHQ8L2NvZGU+IGlzCiAgICAgIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IHRoYXQgcmVwbGFjZWQgdGhlCiAgICAgIGNoYW5nZWQgcmFuZ2UgKHNwbGl0IGJ5IGxpbmUpLiBJZiBtdWx0aXBsZSBjaGFuZ2VzIGhhcHBlbmVkCiAgICAgIGR1cmluZyBhIHNpbmdsZSBvcGVyYXRpb24sIHRoZSBvYmplY3Qgd2lsbCBoYXZlCiAgICAgIGEgPGNvZGU+bmV4dDwvY29kZT4gcHJvcGVydHkgcG9pbnRpbmcgdG8gYW5vdGhlciBjaGFuZ2Ugb2JqZWN0CiAgICAgICh3aGljaCBtYXkgcG9pbnQgdG8gYW5vdGhlciwgZXRjKS48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9jdXJzb3JBY3Rpdml0eSI+PGNvZGU+ImN1cnNvckFjdGl2aXR5IiAoaW5zdGFuY2UpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaWxsIGJlIGZpcmVkIHdoZW4gdGhlIGN1cnNvciBvciBzZWxlY3Rpb24gbW92ZXMsIG9yIGFueQogICAgICBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgZWRpdG9yIGNvbnRlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfdmlld3BvcnRDaGFuZ2UiPjxjb2RlPiJ2aWV3cG9ydENoYW5nZSIgKGluc3RhbmNlLCBmcm9tLCB0byk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIHdoZW5ldmVyIHRoZSA8YSBocmVmPSIjZ2V0Vmlld3BvcnQiPnZpZXcgcG9ydDwvYT4gb2YKICAgICAgdGhlIGVkaXRvciBjaGFuZ2VzIChkdWUgdG8gc2Nyb2xsaW5nLCBlZGl0aW5nLCBvciBhbnkgb3RoZXIKICAgICAgZmFjdG9yKS4gVGhlIDxjb2RlPmZyb208L2NvZGU+IGFuZCA8Y29kZT50bzwvY29kZT4gYXJndW1lbnRzCiAgICAgIGdpdmUgdGhlIG5ldyBzdGFydCBhbmQgZW5kIG9mIHRoZSB2aWV3cG9ydC48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9ndXR0ZXJDbGljayI+PGNvZGU+Imd1dHRlckNsaWNrIiAoaW5zdGFuY2UsIGxpbmUsIGd1dHRlciwgY2xpY2tFdmVudCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIHdoZW4gdGhlIGVkaXRvciBndXR0ZXIgKHRoZSBsaW5lLW51bWJlciBhcmVhKSBpcwogICAgICBjbGlja2VkLiBXaWxsIHBhc3MgdGhlIGVkaXRvciBpbnN0YW5jZSBhcyBmaXJzdCBhcmd1bWVudCwgdGhlCiAgICAgICh6ZXJvLWJhc2VkKSBudW1iZXIgb2YgdGhlIGxpbmUgdGhhdCB3YXMgY2xpY2tlZCBhcyBzZWNvbmQKICAgICAgYXJndW1lbnQsIHRoZSBDU1MgY2xhc3Mgb2YgdGhlIGd1dHRlciB0aGF0IHdhcyBjbGlja2VkIGFzIHRoaXJkCiAgICAgIGFyZ3VtZW50LCBhbmQgdGhlIHJhdyA8Y29kZT5tb3VzZWRvd248L2NvZGU+IGV2ZW50IG9iamVjdCBhcwogICAgICBmb3VydGggYXJndW1lbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfZm9jdXMiPjxjb2RlPiJmb2N1cyIsICJibHVyIiAoaW5zdGFuY2UpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGVzZSBmaXJlIHdoZW5ldmVyIHRoZSBlZGl0b3IgaXMgZm9jdXNlZCBvciB1bmZvY3VzZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfc2Nyb2xsIj48Y29kZT4ic2Nyb2xsIiAoaW5zdGFuY2UpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlcyB3aGVuIHRoZSBlZGl0b3IgaXMgc2Nyb2xsZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfdXBkYXRlIj48Y29kZT4idXBkYXRlIiAoaW5zdGFuY2UpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaWxsIGJlIGZpcmVkIHdoZW5ldmVyIENvZGVNaXJyb3IgdXBkYXRlcyBpdHMgRE9NIGRpc3BsYXkuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+SXQgaXMgYWxzbyBwb3NzaWJsZSB0byA8YSBocmVmPSIjb24iPnJlZ2lzdGVyPC9hPiBldmVudHMKICAgIG9uIG90aGVyIG9iamVjdHMuIExpbmUgaGFuZGxlcyAoYXMgcmV0dXJuZWQgYnksIGZvcgogICAgZXhhbXBsZSwgPGEgaHJlZj0iI2dldExpbmVIYW5kbGUiPjxjb2RlPmdldExpbmVIYW5kbGU8L2NvZGU+PC9hPikKICAgIGNhbiBiZSBsaXN0ZW5lZCBvbiB3aXRoIDxjb2RlPkNvZGVNaXJyb3Iub24oaGFuZGxlLCAiZGVsZXRlIiwKICAgIG15RnVuYyk8L2NvZGU+LiBUaGV5IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBldmVudHM6PC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJldmVudF9kZWxldGUiPjxjb2RlPiJkZWxldGUiICgpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaWxsIGJlIGZpcmVkIHdoZW4gdGhlIGxpbmUgb2JqZWN0IGlzIGRlbGV0ZWQuIEEgbGluZSBvYmplY3QKICAgICAgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSA8ZW0+c3RhcnQ8L2VtPiBvZiB0aGUgbGluZS4gTW9zdGx5IHVzZWZ1bAogICAgICB3aGVuIHlvdSBuZWVkIHRvIGZpbmQgb3V0IHdoZW4geW91ciA8YSBocmVmPSIjc2V0R3V0dGVyTWFya2VyIj5ndXR0ZXIKICAgICAgbWFya2VyczwvYT4gb24gYSBnaXZlbiBsaW5lIGFyZSByZW1vdmVkLjwvZGQ+CiAgICAgIDxkdCBpZD0iZXZlbnRfbGluZV9jaGFuZ2UiPjxjb2RlPiJjaGFuZ2UiICgpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlcyB3aGVuIHRoZSBsaW5lJ3MgdGV4dCBjb250ZW50IGlzIGNoYW5nZWQgaW4gYW55IHdheQogICAgICAoYnV0IHRoZSBsaW5lIGlzIG5vdCBkZWxldGVkIG91dHJpZ2h0KS48L2RkPgogICAgPC9kbD4KCiAgICA8cD5NYXJrZWQgcmFuZ2UgaGFuZGxlcywgYXMgcmV0dXJuZWQKICAgIGJ5IDxhIGhyZWY9IiNtYXJrVGV4dCI+PGNvZGU+bWFya1RleHQ8L2NvZGU+PC9hPiwgZW1pdCB0aGUKICAgIGZvbGxvd2luZyBldmVudDo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImV2ZW50X2NsZWFyIj48Y29kZT4iY2xlYXIiICgpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCB3aGVuIHRoZSByYW5nZSBpcyBjbGVhcmVkLCBlaXRoZXIgdGhyb3VnaCBjdXJzb3IKICAgICAgbW92ZW1lbnQgaW4gY29tYmluYXRpb24KICAgICAgd2l0aCA8YSBocmVmPSIjbWFya19jbGVhck9uRW50ZXIiPjxjb2RlPmNsZWFyT25FbnRlcjwvY29kZT48L2E+CiAgICAgIG9yIHRocm91Z2ggYSBjYWxsIHRvIGl0cyA8Y29kZT5jbGVhcigpPC9jb2RlPiBtZXRob2QuIFdpbGwgb25seQogICAgICBiZSBmaXJlZCBvbmNlIHBlciBoYW5kbGUuIE5vdGUgdGhhdCBkZWxldGluZyB0aGUgcmFuZ2UgdGhyb3VnaAogICAgICB0ZXh0IGVkaXRpbmcgZG9lcyBub3QgZmlyZSB0aGlzIGV2ZW50LCBiZWNhdXNlIGFuIHVuZG8KICAgICAgYWN0aW9uIG1pZ2h0IGJyaW5nIHRoZSByYW5nZSBiYWNrIGludG8gZXhpc3RlbmNlLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMiBpZD0ia2V5bWFwcyI+S2V5bWFwczwvaDI+CgogICAgPHA+S2V5bWFwcyBhcmUgd2F5cyB0byBhc3NvY2lhdGUga2V5cyB3aXRoIGZ1bmN0aW9uYWxpdHkuIEEga2V5bWFwCiAgICBpcyBhbiBvYmplY3QgbWFwcGluZyBzdHJpbmdzIHRoYXQgaWRlbnRpZnkgdGhlIGtleXMgdG8gZnVuY3Rpb25zCiAgICB0aGF0IGltcGxlbWVudCB0aGVpciBmdW5jdGlvbmFsaXR5LjwvcD4KCiAgICA8cD5LZXlzIGFyZSBpZGVudGlmaWVkIGVpdGhlciBieSBuYW1lIG9yIGJ5IGNoYXJhY3Rlci4KICAgIFRoZSA8Y29kZT5Db2RlTWlycm9yLmtleU5hbWVzPC9jb2RlPiBvYmplY3QgZGVmaW5lcyBuYW1lcyBmb3IKICAgIGNvbW1vbiBrZXlzIGFuZCBhc3NvY2lhdGVzIHRoZW0gd2l0aCB0aGVpciBrZXkgY29kZXMuIEV4YW1wbGVzIG9mCiAgICBuYW1lcyBkZWZpbmVkIGhlcmUgYXJlIDxjb2RlPkVudGVyPC9jb2RlPiwgPGNvZGU+RjU8L2NvZGU+LAogICAgYW5kIDxjb2RlPlE8L2NvZGU+LiBUaGVzZSBjYW4gYmUgcHJlZml4ZWQKICAgIHdpdGggPGNvZGU+U2hpZnQtPC9jb2RlPiwgPGNvZGU+Q21kLTwvY29kZT4sIDxjb2RlPkN0cmwtPC9jb2RlPiwKICAgIGFuZCA8Y29kZT5BbHQtPC9jb2RlPiAoaW4gdGhhdCBvcmRlciEpIHRvIHNwZWNpZnkgYSBtb2RpZmllci4gU28KICAgIGZvciBleGFtcGxlLCA8Y29kZT5TaGlmdC1DdHJsLVNwYWNlPC9jb2RlPiB3b3VsZCBiZSBhIHZhbGlkIGtleQogICAgaWRlbnRpZmllci48L3A+CgogICAgPHA+QWx0ZXJuYXRpdmVseSwgYSBjaGFyYWN0ZXIgY2FuIGJlIHNwZWNpZmllZCBkaXJlY3RseSBieQogICAgc3Vycm91bmRpbmcgaXQgaW4gc2luZ2xlIHF1b3RlcywgZm9yIGV4YW1wbGUgPGNvZGU+JyQnPC9jb2RlPgogICAgb3IgPGNvZGU+J3EnPC9jb2RlPi4gRHVlIHRvIGxpbWl0YXRpb25zIGluIHRoZSB3YXkgYnJvd3NlcnMgZmlyZQogICAga2V5IGV2ZW50cywgdGhlc2UgbWF5IG5vdCBiZSBwcmVmaXhlZCB3aXRoIG1vZGlmaWVycy48L3A+CgogICAgPHA+VGhlIDxjb2RlPkNvZGVNaXJyb3Iua2V5TWFwPC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlcyBrZXltYXBzCiAgICB3aXRoIG5hbWVzLiBVc2VyIGNvZGUgYW5kIGtleW1hcCBkZWZpbml0aW9ucyBjYW4gYXNzaWduIGV4dHJhCiAgICBwcm9wZXJ0aWVzIHRvIHRoaXMgb2JqZWN0LiBBbnl3aGVyZSB3aGVyZSBhIGtleW1hcCBpcyBleHBlY3RlZCwgYQogICAgc3RyaW5nIGNhbiBiZSBnaXZlbiwgd2hpY2ggd2lsbCBiZSBsb29rZWQgdXAgaW4gdGhpcyBvYmplY3QuIEl0CiAgICBhbHNvIGNvbnRhaW5zIHRoZSA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+IGtleW1hcCBob2xkaW5nIHRoZQogICAgZGVmYXVsdCBiaW5kaW5ncy48L3A+CgogICAgPHAgaWQ9ImNvbW1hbmRzIj5UaGUgdmFsdWVzIG9mIHByb3BlcnRpZXMgaW4ga2V5bWFwcyBjYW4gYmUgZWl0aGVyIGZ1bmN0aW9ucyBvZgogICAgYSBzaW5nbGUgYXJndW1lbnQgKHRoZSBDb2RlTWlycm9yIGluc3RhbmNlKSwgc3RyaW5ncywgb3IKICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4gU3VjaCBzdHJpbmdzIHJlZmVyIHRvIHByb3BlcnRpZXMgb2YgdGhlCiAgICA8Y29kZT5Db2RlTWlycm9yLmNvbW1hbmRzPC9jb2RlPiBvYmplY3QsIHdoaWNoIGRlZmluZXMgYSBudW1iZXIgb2YKICAgIGNvbW1vbiBjb21tYW5kcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBkZWZhdWx0IGtleWJpbmRpbmdzLCBhbmQgbWFwcwogICAgdGhlbSB0byBmdW5jdGlvbnMuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LAogICAgQ29kZU1pcnJvciBsZWF2ZXMgaGFuZGxpbmcgb2YgdGhlIGtleSB1cCB0byB0aGUgYnJvd3Nlci4gQSBrZXkKICAgIGhhbmRsZXIgZnVuY3Rpb24gbWF5IHRocm93IDxjb2RlPkNvZGVNaXJyb3IuUGFzczwvY29kZT4gdG8gaW5kaWNhdGUKICAgIHRoYXQgaXQgaGFzIGRlY2lkZWQgbm90IHRvIGhhbmRsZSB0aGUga2V5LCBhbmQgb3RoZXIgaGFuZGxlcnMgKG9yCiAgICB0aGUgZGVmYXVsdCBiZWhhdmlvcikgc2hvdWxkIGJlIGdpdmVuIGEgdHVybi48L3A+CgogICAgPHA+S2V5cyBtYXBwZWQgdG8gY29tbWFuZCBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggdGhlCiAgICBjaGFyYWN0ZXJzIDxjb2RlPiJnbyI8L2NvZGU+ICh3aGljaCBzaG91bGQgYmUgdXNlZCBmb3IKICAgIGN1cnNvci1tb3ZlbWVudCBhY3Rpb25zKSB3aWxsIGJlIGZpcmVkIGV2ZW4gd2hlbiBhbgogICAgZXh0cmEgPGNvZGU+U2hpZnQ8L2NvZGU+IG1vZGlmaWVyIGlzIHByZXNlbnQgKGkuZS4gPGNvZGU+IlVwIjoKICAgICJnb0xpbmVVcCI8L2NvZGU+IG1hdGNoZXMgYm90aCB1cCBhbmQgc2hpZnQtdXApLiBUaGlzIGlzIHVzZWQgdG8KICAgIGVhc2lseSBpbXBsZW1lbnQgc2hpZnQtc2VsZWN0aW9uLjwvcD4KCiAgICA8cD5LZXltYXBzIGNhbiBkZWZlciB0byBlYWNoIG90aGVyIGJ5IGRlZmluaW5nCiAgICBhIDxjb2RlPmZhbGx0aHJvdWdoPC9jb2RlPiBwcm9wZXJ0eS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB3aGVuIGEKICAgIGtleSBpcyBub3QgZm91bmQgaW4gdGhlIG1hcCBpdHNlbGYsIG9uZSBvciBtb3JlIG90aGVyIG1hcHMgc2hvdWxkCiAgICBiZSBzZWFyY2hlZC4gSXQgY2FuIGhvbGQgZWl0aGVyIGEgc2luZ2xlIGtleW1hcCBvciBhbiBhcnJheSBvZgogICAga2V5bWFwcy48L3A+CgogICAgPHA+V2hlbiBhIGtleW1hcCBjb250YWlucyBhIDxjb2RlPm5vZmFsbHRocm91Z2g8L2NvZGU+IHByb3BlcnR5CiAgICBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIGtleXMgbWF0Y2hlZCBhZ2FpbnN0IHRoYXQgbWFwIHdpbGwgYmUKICAgIGlnbm9yZWQgaWYgdGhleSBkb24ndCBtYXRjaCBhbnkgb2YgdGhlIGJpbmRpbmdzIGluIHRoZSBtYXAgKG5vCiAgICBmdXJ0aGVyIGNoaWxkIG1hcHMgd2lsbCBiZSB0cmllZCwgYW5kIHRoZSBkZWZhdWx0IGVmZmVjdCBvZgogICAgaW5zZXJ0aW5nIGEgY2hhcmFjdGVyIHdpbGwgbm90IG9jY3VyKS48L3A+CgogICAgPGgyIGlkPSJzdHlsaW5nIj5DdXN0b21pemVkIFN0eWxpbmc8L2gyPgoKICAgIDxwPlVwIHRvIGEgY2VydGFpbiBleHRlbnQsIENvZGVNaXJyb3IncyBsb29rIGNhbiBiZSBjaGFuZ2VkIGJ5CiAgICBtb2RpZnlpbmcgc3R5bGUgc2hlZXQgZmlsZXMuIFRoZSBzdHlsZSBzaGVldHMgc3VwcGxpZWQgYnkgbW9kZXMKICAgIHNpbXBseSBwcm92aWRlIHRoZSBjb2xvcnMgZm9yIHRoYXQgbW9kZSwgYW5kIGNhbiBiZSBhZGFwdGVkIGluIGEKICAgIHZlcnkgc3RyYWlnaHRmb3J3YXJkIHdheS4gVG8gc3R5bGUgdGhlIGVkaXRvciBpdHNlbGYsIGl0IGlzCiAgICBwb3NzaWJsZSB0byBhbHRlciBvciBvdmVycmlkZSB0aGUgc3R5bGVzIGRlZmluZWQKICAgIGluIDxhIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+PGNvZGU+Y29kZW1pcnJvci5jc3M8L2NvZGU+PC9hPi48L3A+CgogICAgPHA+U29tZSBjYXJlIG11c3QgYmUgdGFrZW4gdGhlcmUsIHNpbmNlIGEgbG90IG9mIHRoZSBydWxlcyBpbiB0aGlzCiAgICBmaWxlIGFyZSBuZWNlc3NhcnkgdG8gaGF2ZSBDb2RlTWlycm9yIGZ1bmN0aW9uIHByb3Blcmx5LiBBZGp1c3RpbmcKICAgIGNvbG9ycyBzaG91bGQgYmUgc2FmZSwgb2YgY291cnNlLCBhbmQgd2l0aCBzb21lIGNhcmUgYSBsb3Qgb2YKICAgIG90aGVyIHRoaW5ncyBjYW4gYmUgY2hhbmdlZCBhcyB3ZWxsLiBUaGUgQ1NTIGNsYXNzZXMgZGVmaW5lZCBpbgogICAgdGhpcyBmaWxlIHNlcnZlIHRoZSBmb2xsb3dpbmcgcm9sZXM6PC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yIj48Y29kZT5Db2RlTWlycm9yPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgb3V0ZXIgZWxlbWVudCBvZiB0aGUgZWRpdG9yLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUKICAgICAgZWRpdG9yIHdpZHRoLCBoZWlnaHQsIGJvcmRlcnMgYW5kIHBvc2l0aW9uaW5nLiBDYW4gYWxzbyBiZSB1c2VkCiAgICAgIHRvIHNldCBzdHlsZXMgdGhhdCBzaG91bGQgaG9sZCBmb3IgZXZlcnl0aGluZyBpbnNpZGUgdGhlIGVkaXRvcgogICAgICAoc3VjaCBhcyBmb250IGFuZCBmb250IHNpemUpLCBvciB0byBzZXQgYSBiYWNrZ3JvdW5kLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNsYXNzX0NvZGVNaXJyb3Jfc2Nyb2xsIj48Y29kZT5Db2RlTWlycm9yLXNjcm9sbDwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hldGhlciB0aGUgZWRpdG9yIHNjcm9sbHMgKDxjb2RlPm92ZXJmbG93OiBhdXRvPC9jb2RlPiArCiAgICAgIGZpeGVkIGhlaWdodCkuIEJ5IGRlZmF1bHQsIGl0IGRvZXMuIFNldHRpbmcKICAgICAgdGhlIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IGNsYXNzIHRvIGhhdmUgPGNvZGU+aGVpZ2h0OgogICAgICBhdXRvPC9jb2RlPiBhbmQgZ2l2aW5nIHRoaXMgY2xhc3MgPGNvZGU+b3ZlcmZsb3cteDogYXV0bzsKICAgICAgb3ZlcmZsb3cteTogaGlkZGVuOzwvY29kZT4gd2lsbCBjYXVzZSB0aGUgZWRpdG9yCiAgICAgIHRvIDxhIGhyZWY9Ii4uL2RlbW8vcmVzaXplLmh0bWwiPnJlc2l6ZSB0byBmaXQgaXRzCiAgICAgIGNvbnRlbnQ8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNsYXNzX0NvZGVNaXJyb3JfZm9jdXNlZCI+PGNvZGU+Q29kZU1pcnJvci1mb2N1c2VkPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGVuZXZlciB0aGUgZWRpdG9yIGlzIGZvY3VzZWQsIHRoZSB0b3AgZWxlbWVudCBnZXRzIHRoaXMKICAgICAgY2xhc3MuIFRoaXMgaXMgdXNlZCB0byBoaWRlIHRoZSBjdXJzb3IgYW5kIGdpdmUgdGhlIHNlbGVjdGlvbiBhCiAgICAgIGRpZmZlcmVudCBjb2xvciB3aGVuIHRoZSBlZGl0b3IgaXMgbm90IGZvY3VzZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvcl9ndXR0ZXJzIj48Y29kZT5Db2RlTWlycm9yLWd1dHRlcnM8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoaXMgaXMgdGhlIGJhY2tkcm9wIGZvciBhbGwgZ3V0dGVycy4gVXNlIGl0IHRvIHNldCB0aGUKICAgICAgZGVmYXVsdCBndXR0ZXIgYmFja2dyb3VuZCBjb2xvciwgYW5kIG9wdGlvbmFsbHkgYWRkIGEgYm9yZGVyIG9uCiAgICAgIHRoZSByaWdodCBvZiB0aGUgZ3V0dGVycy48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX2xpbmVudW1iZXJzIj48Y29kZT5Db2RlTWlycm9yLWxpbmVudW1iZXJzPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Vc2UgdGhpcyBmb3IgZ2l2aW5nIGEgYmFja2dyb3VuZCBvciB3aWR0aCB0byB0aGUgbGluZSBudW1iZXIKICAgICAgZ3V0dGVyLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNsYXNzX0NvZGVNaXJyb3JfbGluZW51bWJlciI+PGNvZGU+Q29kZU1pcnJvci1saW5lbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Vc2VkIHRvIHN0eWxlIHRoZSBhY3R1YWwgaW5kaXZpZHVhbCBsaW5lIG51bWJlcnMuIFRoZXNlCiAgICAgIHdvbid0IGJlIGNoaWxkcmVuIG9mIHRoZSA8Y29kZT5Db2RlTWlycm9yLWxpbmVudW1iZXJzPC9jb2RlPgogICAgICAocGx1cmFsKSBlbGVtZW50LCBidXQgcmF0aGVyIHdpbGwgYmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIHRvCiAgICAgIG92ZXJsYXkgaXQuIFVzZSB0aGlzIHRvIHNldCBhbGlnbm1lbnQgYW5kIHRleHQgcHJvcGVydGllcyBmb3IKICAgICAgdGhlIGxpbmUgbnVtYmVycy48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX2xpbmVzIj48Y29kZT5Db2RlTWlycm9yLWxpbmVzPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgdmlzaWJsZSBsaW5lcy4gVGhpcyBpcyB3aGVyZSB5b3Ugc3BlY2lmeSB2ZXJ0aWNhbAogICAgICBwYWRkaW5nIGZvciB0aGUgZWRpdG9yIGNvbnRlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvcl9jdXJzb3IiPjxjb2RlPkNvZGVNaXJyb3ItY3Vyc29yPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgY3Vyc29yIGlzIGEgYmxvY2sgZWxlbWVudCB0aGF0IGlzIGFic29sdXRlbHkgcG9zaXRpb25lZC4KICAgICAgWW91IGNhbiBtYWtlIGl0IGxvb2sgd2hpY2hldmVyIHdheSB5b3Ugd2FudC48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX3NlbGVjdGVkIj48Y29kZT5Db2RlTWlycm9yLXNlbGVjdGVkPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgc2VsZWN0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IDxjb2RlPnNwYW48L2NvZGU+IGVsZW1lbnRzCiAgICAgIHdpdGggdGhpcyBjbGFzcy48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX21hdGNoaW5nYnJhY2tldCI+PGNvZGU+Q29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQ8L2NvZGU+LAogICAgICAgIDxjb2RlPkNvZGVNaXJyb3Itbm9ubWF0Y2hpbmdicmFja2V0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGVzZSBhcmUgdXNlZCB0byBzdHlsZSBtYXRjaGVkIChvciB1bm1hdGNoZWQpIGJyYWNrZXRzLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPklmIHlvdXIgcGFnZSdzIHN0eWxlIHNoZWV0cyBkbyBmdW5reSB0aGluZ3MgdG8KICAgIGFsbCA8Y29kZT5kaXY8L2NvZGU+IG9yIDxjb2RlPnByZTwvY29kZT4gZWxlbWVudHMgKHlvdSBwcm9iYWJseQogICAgc2hvdWxkbid0IGRvIHRoYXQpLCB5b3UnbGwgaGF2ZSB0byBkZWZpbmUgcnVsZXMgdG8gY2FuY2VsIHRoZXNlCiAgICBlZmZlY3RzIG91dCBhZ2FpbiBmb3IgZWxlbWVudHMgdW5kZXIgdGhlIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+CiAgICBjbGFzcy48L3A+CgogICAgPHA+VGhlbWVzIGFyZSBhbHNvIHNpbXBseSBDU1MgZmlsZXMsIHdoaWNoIGRlZmluZSBjb2xvcnMgZm9yCiAgICB2YXJpb3VzIHN5bnRhY3RpYyBlbGVtZW50cy4gU2VlIHRoZSBmaWxlcyBpbgogICAgdGhlIDxhIGhyZWY9Ii4uL3RoZW1lLyI+PGNvZGU+dGhlbWU8L2NvZGU+PC9hPiBkaXJlY3RvcnkuPC9wPgoKICAgIDxoMiBpZD0iYXBpIj5Qcm9ncmFtbWluZyBBUEk8L2gyPgoKICAgIDxwPkEgbG90IG9mIENvZGVNaXJyb3IgZmVhdHVyZXMgYXJlIG9ubHkgYXZhaWxhYmxlIHRocm91Z2ggaXRzCiAgICBBUEkuIFRodXMsIHlvdSBuZWVkIHRvIHdyaXRlIGNvZGUgKG9yCiAgICB1c2UgPGEgaHJlZj0iI2FkZG9ucyI+YWRkLW9uczwvYT4pIGlmIHlvdSB3YW50IHRvIGV4cG9zZSB0aGVtIHRvCiAgICB5b3VyIHVzZXJzLjwvcD4KCiAgICA8cD5XaGVuZXZlciBwb2ludHMgaW4gdGhlIGRvY3VtZW50IGFyZSByZXByZXNlbnRlZCwgdGhlIEFQSSB1c2VzCiAgICBvYmplY3RzIHdpdGggPGNvZGU+bGluZTwvY29kZT4gYW5kIDxjb2RlPmNoPC9jb2RlPiBwcm9wZXJ0aWVzLgogICAgQm90aCBhcmUgemVyby1iYXNlZC4gQ29kZU1pcnJvciBtYWtlcyBzdXJlIHRvICdjbGlwJyBhbnkgcG9zaXRpb25zCiAgICBwYXNzZWQgYnkgY2xpZW50IGNvZGUgc28gdGhhdCB0aGV5IGZpdCBpbnNpZGUgdGhlIGRvY3VtZW50LCBzbyB5b3UKICAgIHNob3VsZG4ndCB3b3JyeSB0b28gbXVjaCBhYm91dCBzYW5pdGl6aW5nIHlvdXIgY29vcmRpbmF0ZXMuIElmIHlvdQogICAgZ2l2ZSA8Y29kZT5jaDwvY29kZT4gYSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiwgb3IgZG9uJ3QKICAgIHNwZWNpZnkgaXQsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZSBzcGVjaWZpZWQKICAgIGxpbmUuPC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJnZXRWYWx1ZSI+PGNvZGU+Z2V0VmFsdWUoKSDihpIgc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXQgdGhlIGN1cnJlbnQgZWRpdG9yIGNvbnRlbnQuIFlvdSBjYW4gcGFzcyBpdCBhbiBvcHRpb25hbAogICAgICBhcmd1bWVudCB0byBzcGVjaWZ5IHRoZSBzdHJpbmcgdG8gYmUgdXNlZCB0byBzZXBhcmF0ZSBsaW5lcwogICAgICAoZGVmYXVsdHMgdG8gPGNvZGU+IlxuIjwvY29kZT4pLjwvZGQ+CiAgICAgIDxkdCBpZD0ic2V0VmFsdWUiPjxjb2RlPnNldFZhbHVlKHN0cmluZyk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNldCB0aGUgZWRpdG9yIGNvbnRlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0ibGluZUNvdW50Ij48Y29kZT5saW5lQ291bnQoKSDihpIgbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldFJhbmdlIj48Y29kZT5nZXRSYW5nZShmcm9tLCB0bykg4oaSIHN0cmluZzwvY29kZT48L3RkPgogICAgICA8ZGQ+R2V0IHRoZSB0ZXh0IGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cyBpbiB0aGUgZWRpdG9yLCB3aGljaAogICAgICBzaG91bGQgYmUgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0cy4gQW4gb3B0aW9uYWwgdGhpcmQKICAgICAgYXJndW1lbnQgY2FuIGJlIGdpdmVuIHRvIGluZGljYXRlIHRoZSBsaW5lIHNlcGFyYXRvciBzdHJpbmcgdG8KICAgICAgdXNlIChkZWZhdWx0cyB0byA8Y29kZT4iXG4iPC9jb2RlPikuPC9kZD4KICAgICAgPGR0IGlkPSJyZXBsYWNlUmFuZ2UiPjxjb2RlPnJlcGxhY2VSYW5nZShzdHJpbmcsIGZyb20sIHRvKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVwbGFjZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiA8Y29kZT5mcm9tPC9jb2RlPgogICAgICBhbmQgPGNvZGU+dG88L2NvZGU+IHdpdGggdGhlIGdpdmVuIHN0cmluZy4gPGNvZGU+ZnJvbTwvY29kZT4KICAgICAgYW5kIDxjb2RlPnRvPC9jb2RlPiBtdXN0IGJlIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+CiAgICAgIG9iamVjdHMuIDxjb2RlPnRvPC9jb2RlPiBjYW4gYmUgbGVmdCBvZmYgdG8gc2ltcGx5IGluc2VydCB0aGUKICAgICAgc3RyaW5nIGF0IHBvc2l0aW9uIDxjb2RlPmZyb208L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldFNlbGVjdGlvbiI+PGNvZGU+Z2V0U2VsZWN0aW9uKCkg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29kZS48L2RkPgogICAgICA8ZHQgaWQ9InJlcGxhY2VTZWxlY3Rpb24iPjxjb2RlPnJlcGxhY2VTZWxlY3Rpb24oc3RyaW5nKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIHN0cmluZy48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRDdXJzb3IiPjxjb2RlPmdldEN1cnNvcihzdGFydCkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+PGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHN0YXJ0CiAgICAgIG9yIHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiBtdXN0IGJlIHJldHJpZXZlZC4gSWYgaXQgaXMgbm90CiAgICAgIGdpdmVuLCB0aGUgY3VycmVudCBjdXJzb3IgcG9zLCBpLmUuIHRoZSBzaWRlIG9mIHRoZSBzZWxlY3Rpb24KICAgICAgdGhhdCB3b3VsZCBtb3ZlIGlmIHlvdSBwcmVzc2VkIGFuIGFycm93IGtleSwgaXMgY2hvc2VuLgogICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHBhc3Mgb25lIG9mIHRoZQogICAgICBzdHJpbmdzIDxjb2RlPiJzdGFydCI8L2NvZGU+LCA8Y29kZT4iZW5kIjwvY29kZT4sIDxjb2RlPiJoZWFkIjwvY29kZT4KICAgICAgKHNhbWUgYXMgbm90IHBhc3NpbmcgYW55dGhpbmcpLCBvciA8Y29kZT4iYW5jaG9yIjwvY29kZT4gKHRoZQogICAgICBvcHBvc2l0ZSkuIEEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0IHdpbGwgYmUKICAgICAgcmV0dXJuZWQuPC9kZD4KICAgICAgPGR0IGlkPSJzb21ldGhpbmdTZWxlY3RlZCI+PGNvZGU+c29tZXRoaW5nU2VsZWN0ZWQoKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJuIHRydWUgaWYgYW55IHRleHQgaXMgc2VsZWN0ZWQuPC9kZD4KICAgICAgPGR0IGlkPSJzZXRDdXJzb3IiPjxjb2RlPnNldEN1cnNvcihwb3MpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TZXQgdGhlIGN1cnNvciBwb3NpdGlvbi4gWW91IGNhbiBlaXRoZXIgcGFzcyBhCiAgICAgIHNpbmdsZSA8Y29kZT57bGluZSwgY2h9PC9jb2RlPiBvYmplY3QsIG9yIHRoZSBsaW5lIGFuZCB0aGUKICAgICAgY2hhcmFjdGVyIGFzIHR3byBzZXBhcmF0ZSBwYXJhbWV0ZXJzLjwvZGQ+CiAgICAgIDxkdCBpZD0ic2V0U2VsZWN0aW9uIj48Y29kZT5zZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0IHRoZSBzZWxlY3Rpb24gcmFuZ2UuIDxjb2RlPmFuY2hvcjwvY29kZT4KICAgICAgYW5kIDxjb2RlPmhlYWQ8L2NvZGU+IHNob3VsZCBiZSA8Y29kZT57bGluZSwgY2h9PC9jb2RlPgogICAgICBvYmplY3RzLiA8Y29kZT5oZWFkPC9jb2RlPiBkZWZhdWx0cyB0byA8Y29kZT5hbmNob3I8L2NvZGU+IHdoZW4KICAgICAgbm90IGdpdm5lLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldExpbmUiPjxjb2RlPmdldExpbmUobikg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0IHRoZSBjb250ZW50IG9mIGxpbmUgPGNvZGU+bjwvY29kZT4uPC9kZD4KICAgICAgPGR0IGlkPSJzZXRMaW5lIj48Y29kZT5zZXRMaW5lKG4sIHRleHQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TZXQgdGhlIGNvbnRlbnQgb2YgbGluZSA8Y29kZT5uPC9jb2RlPi48L2RkPgogICAgICA8ZHQgaWQ9InJlbW92ZUxpbmUiPjxjb2RlPnJlbW92ZUxpbmUobik8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlbW92ZSB0aGUgZ2l2ZW4gbGluZSBmcm9tIHRoZSBkb2N1bWVudC48L2RkPgoKICAgICAgPGR0IGlkPSJzZXRTaXplIj48Y29kZT5zZXRTaXplKHdpZHRoLCBoZWlnaHQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Qcm9ncmFtYXRpY2FsbHkgc2V0IHRoZSBzaXplIG9mIHRoZSBlZGl0b3IgKG92ZXJyaWRpbmcgdGhlCiAgICAgIGFwcGxpY2FibGUgPGEgaHJlZj0iI2Nzcy1yZXNpemUiPkNTUwogICAgICBydWxlczwvYT4pLiA8Y29kZT53aWR0aDwvY29kZT4gYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gaGVpZ2h0CiAgICAgIGNhbiBiZSBlaXRoZXIgbnVtYmVycyAoaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzKSBvciBDU1MgdW5pdHMKICAgICAgKDxjb2RlPiIxMDAlIjwvY29kZT4sIGZvciBleGFtcGxlKS4gWW91IGNhbgogICAgICBwYXNzIDxjb2RlPm51bGw8L2NvZGU+IGZvciBlaXRoZXIgb2YgdGhlbSB0byBpbmRpY2F0ZSB0aGF0IHRoYXQKICAgICAgZGltZW5zaW9uIHNob3VsZCBub3QgYmUgY2hhbmdlZC48L2RkPgogICAgICA8ZHQgaWQ9ImZvY3VzIj48Y29kZT5mb2N1cygpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HaXZlIHRoZSBlZGl0b3IgZm9jdXMuPC9kZD4KICAgICAgPGR0IGlkPSJzY3JvbGxUbyI+PGNvZGU+c2Nyb2xsVG8oeCwgeSk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNjcm9sbCB0aGUgZWRpdG9yIHRvIGEgZ2l2ZW4gKHBpeGVsKSBwb3NpdGlvbi4gQm90aAogICAgICBhcmd1bWVudHMgbWF5IGJlIGxlZnQgYXMgPGNvZGU+bnVsbDwvY29kZT4KICAgICAgb3IgPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiB0byBoYXZlIG5vIGVmZmVjdC48L2RkPgogICAgICA8ZHQgaWQ9ImdldFNjcm9sbEluZm8iPjxjb2RlPmdldFNjcm9sbEluZm8oKTwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0IGFuIDxjb2RlPntsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIGNsaWVudFdpZHRoLAogICAgICBjbGllbnRIZWlnaHR9PC9jb2RlPiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHNjcm9sbAogICAgICBwb3NpdGlvbiwgdGhlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgYXJlYSwgYW5kIHRoZSBzaXplIG9mIHRoZQogICAgICB2aXNpYmxlIGFyZWEgKG1pbnVzIHNjcm9sbGJhcnMpLjwvZGQ+CiAgICAgIDxkdCBpZD0ic2Nyb2xsSW50b1ZpZXciPjxjb2RlPnNjcm9sbEludG9WaWV3KHBvcyk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNjcm9sbHMgdGhlIGdpdmVuIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IHBvc2l0aW9uIGludG8KICAgICAgdmlldy4gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoaXMgd2lsbCBzY3JvbGwgdGhlIGN1cnNvciBpbnRvCiAgICAgIHZpZXcuPC9kZD4KCiAgICAgIDxkdCBpZD0ic2V0T3B0aW9uIj48Y29kZT5zZXRPcHRpb24ob3B0aW9uLCB2YWx1ZSk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLiA8Y29kZT5vcHRpb248L2NvZGU+CiAgICAgIHNob3VsZCB0aGUgbmFtZSBvZiBhbiA8YSBocmVmPSIjY29uZmlnIj5vcHRpb248L2E+LAogICAgICBhbmQgPGNvZGU+dmFsdWU8L2NvZGU+IHNob3VsZCBiZSBhIHZhbGlkIHZhbHVlIGZvciB0aGF0CiAgICAgIG9wdGlvbi48L2RkPgogICAgICA8ZHQgaWQ9ImdldE9wdGlvbiI+PGNvZGU+Z2V0T3B0aW9uKG9wdGlvbikg4oaSIHZhbHVlPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdpdmVuIG9wdGlvbiBmb3IgdGhpcwogICAgICBlZGl0b3IgaW5zdGFuY2UuPC9kZD4KICAgICAgPGR0IGlkPSJnZXRNb2RlIj48Y29kZT5nZXRNb2RlKCkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0cyB0aGUgbW9kZSBvYmplY3QgZm9yIHRoZSBlZGl0b3IuIE5vdGUgdGhhdCB0aGlzIGlzCiAgICAgIGRpc3RpbmN0IGZyb20gPGNvZGU+Z2V0T3B0aW9uKCJtb2RlIik8L2NvZGU+LCB3aGljaCBnaXZlcyB5b3UKICAgICAgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiwgcmF0aGVyIHRoYW4gdGhlIHJlc29sdmVkLCBpbnN0YW50aWF0ZWQKICAgICAgPGEgaHJlZj0iI2RlZmluZU1vZGUiPm1vZGUgb2JqZWN0PC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRLZXlNYXAiPjxjb2RlPmFkZEtleU1hcChtYXApPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5BdHRhY2ggYW4gYWRkaXRpb25hbCA8YSBocmVmPSIja2V5bWFwcyI+a2V5bWFwPC9hPiB0byB0aGUgZWRpdG9yLiBUaGlzIGlzIG1vc3RseQogICAgICB1c2VmdWwgZm9yIGFkZC1vbnMgdGhhdCBuZWVkIHRvIHJlZ2lzdGVyIHNvbWUga2V5IGhhbmRsZXJzCiAgICAgIHdpdGhvdXQgdHJhbXBsaW5nIG9uCiAgICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX2V4dHJhS2V5cyI+PGNvZGU+ZXh0cmFLZXlzPC9jb2RlPjwvYT4KICAgICAgb3B0aW9uLiBNYXBzIGFkZGVkIGluIHRoaXMgd2F5IGhhdmUgYSBsb3dlciBwcmVjZWRlbmNlCiAgICAgIHRoYW4gPGNvZGU+ZXh0cmFLZXlzPC9jb2RlPiwgYSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHRoZQogICAgICBiYXNlIDxhIGhyZWY9IiNvcHRpb25fa2V5TWFwIj48Y29kZT5rZXlNYXA8L2NvZGU+PC9hPiwgYW5kCiAgICAgIGJldHdlZW4gdGhlbSwgdGhlIG1hcHMgYWRkZWQgZWFybGllciBoYXZlIGEgaGlnaGVyIHByZWNlZGVuY2UKICAgICAgdGhhbiB0aG9zZSBhZGRlZCBsYXRlci48L2RkPgogICAgICA8ZHQgaWQ9InJlbW92ZUtleU1hcCI+PGNvZGU+cmVtb3ZlS2V5TWFwKG1hcCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkRpc2FibGUgYSBrZXltYXAgYWRkZWQKICAgICAgd2l0aCA8YSBocmVmPSIjYWRkS2V5TWFwIj48Y29kZT5hZGRLZXlNYXA8L2NvZGU+PC9hPi4gRWl0aGVyCiAgICAgIHBhc3MgaW4gdGhlIGtleW1hcCBvYmplY3QgaXRzZWxmLCBvciBhIHN0cmluZywgd2hpY2ggd2lsbCBiZQogICAgICBjb21wYXJlZCBhZ2FpbnN0IHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgYWN0aXZlCiAgICAgIGtleW1hcHMuPC9kZD4KCiAgICAgIDxkdCBpZD0ib24iPjxjb2RlPm9uKHR5cGUsIGZ1bmMpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZWdpc3RlciBhbiBldmVudCBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZSAoYQogICAgICBzdHJpbmcpIG9uIHRoZSBlZGl0b3IgaW5zdGFuY2UuIFRoZXJlIGlzIGFsc28KICAgICAgYSA8Y29kZT5Db2RlTWlycm9yLm9uKG9iamVjdCwgdHlwZSwgZnVuYyk8L2NvZGU+IHZlcnNpb24KICAgICAgdGhhdCBhbGxvd3MgcmVnaXN0ZXJpbmcgb2YgZXZlbnRzIG9uIGFueSBvYmplY3QuPC9kZD4KICAgICAgPGR0IGlkPSJvZmYiPjxjb2RlPm9mZih0eXBlLCBmdW5jKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVtb3ZlIGFuIGV2ZW50IGhhbmRsZXIgb24gdGhlIGVkaXRvciBpbnN0YW5jZS4gQW4KICAgICAgZXF1aXZhbGVudCA8Y29kZT5Db2RlTWlycm9yLm9mZihvYmplY3QsIHR5cGUsCiAgICAgIGZ1bmMpPC9jb2RlPiBhbHNvIGV4aXN0cy48L2RkPgoKICAgICAgPGR0IGlkPSJjdXJzb3JDb29yZHMiPjxjb2RlPmN1cnNvckNvb3Jkcyh3aGVyZSwgbW9kZSkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyBhbiA8Y29kZT57bGVmdCwgdG9wLCBib3R0b219PC9jb2RlPiBvYmplY3QKICAgICAgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvciBwb3NpdGlvbi4KICAgICAgSWYgPGNvZGU+bW9kZTwvY29kZT4gaXMgPGNvZGU+ImxvY2FsIjwvY29kZT4sIHRoZXkgd2lsbCBiZQogICAgICByZWxhdGl2ZSB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudC4gSWYgaXQKICAgICAgaXMgPGNvZGU+InBhZ2UiPC9jb2RlPiBvciBub3QgZ2l2ZW4sIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZQogICAgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBhZ2UuIDxjb2RlPndoZXJlPC9jb2RlPiBjYW4gYmUgYSBib29sZWFuCiAgICAgIGluZGljYXRpbmcgd2hldGhlciB5b3Ugd2FudCB0aGUgc3RhcnQgKDxjb2RlPnRydWU8L2NvZGU+KSBvciB0aGUKICAgICAgZW5kICg8Y29kZT5mYWxzZTwvY29kZT4pIG9mIHRoZSBzZWxlY3Rpb24sIG9yLCBpZiBhIDxjb2RlPntsaW5lLAogICAgICBjaH08L2NvZGU+IG9iamVjdCBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBwcmVjaXNlIHBvc2l0aW9uIGF0CiAgICAgIHdoaWNoIHlvdSB3YW50IHRvIG1lYXN1cmUuPC9kZD4KICAgICAgPGR0IGlkPSJjaGFyQ29vcmRzIj48Y29kZT5jaGFyQ29vcmRzKHBvcywgbW9kZSkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgb2YgYW4gYXJiaXRyYXJ5CiAgICAgIGNoYXJhY3Rlci4gPGNvZGU+cG9zPC9jb2RlPiBzaG91bGQgYmUgYSA8Y29kZT57bGluZSwgY2h9PC9jb2RlPgogICAgICBvYmplY3QuIFRoaXMgZGlmZmVycyBmcm9tIDxjb2RlPmN1cnNvckNvb3JkczwvY29kZT4gaW4gdGhhdAogICAgICBpdCdsbCBnaXZlIHRoZSBzaXplIG9mIHRoZSB3aG9sZSBjaGFyYWN0ZXIsIHJhdGhlciB0aGFuIGp1c3QgdGhlCiAgICAgIHBvc2l0aW9uIHRoYXQgdGhlIGN1cnNvciB3b3VsZCBoYXZlIHdoZW4gaXQgd291bGQgc2l0IGF0IHRoYXQKICAgICAgcG9zaXRpb24uPC9kZD4KICAgICAgPGR0IGlkPSJjb29yZHNDaGFyIj48Y29kZT5jb29yZHNDaGFyKG9iamVjdCkg4oaSIHBvczwvY29kZT48L2R0PgogICAgICA8ZGQ+R2l2ZW4gYW4gPGNvZGU+e2xlZnQsIHRvcH08L2NvZGU+IG9iamVjdCAoaW4gcGFnZSBjb29yZGluYXRlcyksCiAgICAgIHJldHVybnMgdGhlIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IHBvc2l0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8KICAgICAgaXQuPC9kZD4KICAgICAgPGR0IGlkPSJkZWZhdWx0VGV4dEhlaWdodCI+PGNvZGU+ZGVmYXVsdFRleHRIZWlnaHQoKSDihpIgbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRoZSBsaW5lIGhlaWdodCBvZiB0aGUgZGVmYXVsdCBmb250IGZvciB0aGUgZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im1hcmtDbGVhbiI+PGNvZGU+bWFya0NsZWFuKCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNldCB0aGUgZWRpdG9yIGNvbnRlbnQgYXMgJ2NsZWFuJywgYSBmbGFnIHRoYXQgaXQgd2lsbAogICAgICByZXRhaW4gdW50aWwgaXQgaXMgZWRpdGVkLCBhbmQgd2hpY2ggd2lsbCBiZSBzZXQgYWdhaW4gd2hlbiBzdWNoCiAgICAgIGFuIGVkaXQgaXMgdW5kb25lIGFnYWluLiBVc2VmdWwgdG8gdHJhY2sgd2hldGhlciB0aGUgY29udGVudAogICAgICBuZWVkcyB0byBiZSBzYXZlZC48L2RkPgogICAgICA8ZHQgaWQ9ImlzQ2xlYW4iPjxjb2RlPmlzQ2xlYW4oKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBjdXJyZW50bHkgY2xlYW4gKG5vdAogICAgICBtb2RpZmllZCBzaW5jZSBpbml0aWFsaXphdGlvbiBvciB0aGUgbGFzdCBjYWxsCiAgICAgIHRvIDxhIGhyZWY9IiNtYXJrQ2xlYW4iPjxjb2RlPm1hcmtDbGVhbjwvY29kZT48L2E+KS48L2RkPgoKICAgICAgPGR0IGlkPSJ1bmRvIj48Y29kZT51bmRvKCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlVuZG8gb25lIGVkaXQgKGlmIGFueSB1bmRvIGV2ZW50cyBhcmUgc3RvcmVkKS48L2RkPgogICAgICA8ZHQgaWQ9InJlZG8iPjxjb2RlPnJlZG8oKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVkbyBvbmUgdW5kb25lIGVkaXQuPC9kZD4KICAgICAgPGR0IGlkPSJoaXN0b3J5U2l6ZSI+PGNvZGU+aGlzdG9yeVNpemUoKSDihpIgb2JqZWN0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIGFuIG9iamVjdCB3aXRoIDxjb2RlPnt1bmRvLCByZWRvfTwvY29kZT4gcHJvcGVydGllcywKICAgICAgYm90aCBvZiB3aGljaCBob2xkIGludGVnZXJzLCBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2Ygc3RvcmVkCiAgICAgIHVuZG8gYW5kIHJlZG8gb3BlcmF0aW9ucy48L2RkPgogICAgICA8ZHQgaWQ9ImNsZWFySGlzdG9yeSI+PGNvZGU+Y2xlYXJIaXN0b3J5KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNsZWFycyB0aGUgZWRpdG9yJ3MgdW5kbyBoaXN0b3J5LjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0SGlzdG9yeSI+PGNvZGU+Z2V0SGlzdG9yeSgpIOKGkiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCBhIChKU09OLXNlcmlhbGl6ZWFibGUpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bmRvIGhpc3RvcnkuPC9kZD4KICAgICAgPGR0IGlkPSJzZXRIaXN0b3J5Ij48Y29kZT5zZXRIaXN0b3J5KG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlcGxhY2UgdGhlIGVkaXRvcidzIHVuZG8gaGlzdG9yeSB3aXRoIHRoZSBvbmUgcHJvdmlkZWQsCiAgICAgIHdoaWNoIG11c3QgYmUgYSB2YWx1ZSBhcyByZXR1cm5lZAogICAgICBieSA8YSBocmVmPSIjZ2V0SGlzdG9yeSI+PGNvZGU+Z2V0SGlzdG9yeTwvY29kZT48L2E+LiBOb3RlIHRoYXQKICAgICAgdGhpcyB3aWxsIGhhdmUgZW50aXJlbHkgdW5kZWZpbmVkIHJlc3VsdHMgaWYgdGhlIGVkaXRvciBjb250ZW50CiAgICAgIGlzbid0IGFsc28gdGhlIHNhbWUgYXMgaXQgd2FzIHdoZW4gPGNvZGU+Z2V0SGlzdG9yeTwvY29kZT4gd2FzCiAgICAgIGNhbGxlZC48L2RkPgoKICAgICAgPGR0IGlkPSJpbmRlbnRMaW5lIj48Y29kZT5pbmRlbnRMaW5lKGxpbmUsIGRpcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkFkanVzdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGdpdmVuIGxpbmUuIFRoZSBzZWNvbmQKICAgICAgYXJndW1lbnQgKHdoaWNoIGRlZmF1bHRzIHRvIDxjb2RlPiJzbWFydCI8L2NvZGU+KSBtYXkgYmUgb25lIG9mOgogICAgICAgIDxkbD4KICAgICAgICAgIDxkdD48Y29kZT4icHJldiI8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5CYXNlIGluZGVudGF0aW9uIG9uIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGluZS48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPiJzbWFydCI8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5Vc2UgdGhlIG1vZGUncyBzbWFydCBpbmRlbnRhdGlvbiBpZiBhdmFpbGFibGUsIGJlaGF2ZQogICAgICAgICAgbGlrZSA8Y29kZT4icHJldiI8L2NvZGU+IG90aGVyd2lzZS48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPiJhZGQiPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+SW5jcmVhc2UgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBsaW5lIGJ5CiAgICAgICAgICBvbmUgPGEgaHJlZj0iI29wdGlvbl9pbmRlbnRVbml0Ij5pbmRlbnQgdW5pdDwvYT4uPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT4ic3VidHJhY3QiPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+UmVkdWNlIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgbGluZS48L2RkPgogICAgICAgIDwvZGw+PC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0VG9rZW5BdCI+PGNvZGU+Z2V0VG9rZW5BdChwb3MpIOKGkiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHJpZXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdG9rZW4gdGhlIGN1cnJlbnQgbW9kZSBmb3VuZAogICAgICBiZWZvcmUgdGhlIGdpdmVuIHBvc2l0aW9uIChhIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IG9iamVjdCkuIFRoZQogICAgICByZXR1cm5lZCBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAgICAgPGRsPgogICAgICAgIDxkdD48Y29kZT5zdGFydDwvY29kZT48L2R0PjxkZD5UaGUgY2hhcmFjdGVyIChvbiB0aGUgZ2l2ZW4gbGluZSkgYXQgd2hpY2ggdGhlIHRva2VuIHN0YXJ0cy48L2RkPgogICAgICAgIDxkdD48Y29kZT5lbmQ8L2NvZGU+PC9kdD48ZGQ+VGhlIGNoYXJhY3RlciBhdCB3aGljaCB0aGUgdG9rZW4gZW5kcy48L2RkPgogICAgICAgIDxkdD48Y29kZT5zdHJpbmc8L2NvZGU+PC9kdD48ZGQ+VGhlIHRva2VuJ3Mgc3RyaW5nLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPnR5cGU8L2NvZGU+PC9kdD48ZGQ+VGhlIHRva2VuIHR5cGUgdGhlIG1vZGUgYXNzaWduZWQKICAgICAgICB0byB0aGUgdG9rZW4sIHN1Y2ggYXMgPGNvZGU+ImtleXdvcmQiPC9jb2RlPgogICAgICAgIG9yIDxjb2RlPiJjb21tZW50IjwvY29kZT4gKG1heSBhbHNvIGJlIG51bGwpLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPnN0YXRlPC9jb2RlPjwvZHQ+PGRkPlRoZSBtb2RlJ3Mgc3RhdGUgYXQgdGhlIGVuZCBvZiB0aGlzIHRva2VuLjwvZGQ+CiAgICAgIDwvZGw+PC9kZD4KCiAgICAgIDxkdCBpZD0ibWFya1RleHQiPjxjb2RlPm1hcmtUZXh0KGZyb20sIHRvLCBvcHRpb25zKSDihpIgb2JqZWN0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DYW4gYmUgdXNlZCB0byBtYXJrIGEgcmFuZ2Ugb2YgdGV4dCB3aXRoIGEgc3BlY2lmaWMgQ1NTCiAgICAgIGNsYXNzIG5hbWUuIDxjb2RlPmZyb208L2NvZGU+IGFuZCA8Y29kZT50bzwvY29kZT4gc2hvdWxkCiAgICAgIGJlIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IG9iamVjdHMuIFRoZSA8Y29kZT5vcHRpb25zPC9jb2RlPgogICAgICBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuIFdoZW4gZ2l2ZW4sIGl0IHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdAogICAgICBtYXkgY29udGFpbiB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9uczoKICAgICAgPGRsPgogICAgICAgIDxkdCBpZD0ibWFya19jbGFzc05hbWUiPjxjb2RlPmNsYXNzTmFtZSAoc3RyaW5nKTwvY29kZT48L2R0PgogICAgICAgIDxkZD5Bc3NpZ25zIGEgQ1NTIGNsYXNzIHRvIHRoZSBtYXJrZWQgc3RyZXRjaCBvZiB0ZXh0LjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2luY2x1c2l2ZUxlZnQiPjxjb2RlPmluY2x1c2l2ZUxlZnQgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+PGRkPkRldGVybWluZXMgd2hldGhlcgogICAgICAgIHRleHQgaW5zZXJ0ZWQgb24gdGhlIGxlZnQgb2YgdGhlIG1hcmtlciB3aWxsIGVuZCB1cCBpbnNpZGUKICAgICAgICBvciBvdXRzaWRlIG9mIGl0LjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2luY2x1c2l2ZVJpZ2h0Ij48Y29kZT5pbmNsdXNpdmVSaWdodDwvY29kZT4gKGJvb2xlYW4pPC9kdD48ZGQ+TGlrZSA8Y29kZT5pbmNsdXNpdmVMZWZ0PC9jb2RlPiwKICAgICAgICBidXQgZm9yIHRoZSByaWdodCBzaWRlLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2F0b21pYyI+PGNvZGU+YXRvbWljIChib29sZWFuKTwvY29kZT48L2R0PgogICAgICAgIDxkZD5BdG9taWMgcmFuZ2VzIGFjdCBhcyBhIHNpbmdsZSB1bml0IHdoZW4gY3Vyc29yIG1vdmVtZW50IGlzCiAgICAgICAgY29uY2VybmVk4oCUaS5lLiBpdCBpcyBpbXBvc3NpYmxlIHRvIHBsYWNlIHRoZSBjdXJzb3IgaW5zaWRlIG9mCiAgICAgICAgdGhlbS4gSW4gYXRvbWljIHJhbmdlcywgPGNvZGU+aW5jbHVzaXZlTGVmdDwvY29kZT4KICAgICAgICBhbmQgPGNvZGU+aW5jbHVzaXZlUmlnaHQ8L2NvZGU+IGhhdmUgYSBkaWZmZXJlbnQgbWVhbmluZ+KAlHRoZXkKICAgICAgICB3aWxsIHByZXZlbnQgdGhlIGN1cnNvciBmcm9tIGJlaW5nIHBsYWNlZCByZXNwZWN0aXZlbHkKICAgICAgICBkaXJlY3RseSBiZWZvcmUgYW5kIGRpcmVjdGx5IGFmdGVyIHRoZSByYW5nZS48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19jb2xsYXBzZWQiPjxjb2RlPmNvbGxhcHNlZCAoYm9vbGVhbik8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+Q29sbGFwc2VkIHJhbmdlcyBkbyBub3Qgc2hvdyB1cCBpbiB0aGUgZGlzcGxheS4gU2V0dGluZyBhCiAgICAgICAgcmFuZ2UgdG8gYmUgY29sbGFwc2VkIHdpbGwgYXV0b21hdGljYWxseSBtYWtlIGl0IGF0b21pYy48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19jbGVhck9uRW50ZXIiPjxjb2RlPmNsZWFyT25FbnRlciAoYm9vbGVhbik8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+V2hlbiBlbmFibGVkLCB3aWxsIGNhdXNlIHRoZSBtYXJrIHRvIGNsZWFyIGl0c2VsZiB3aGVuZXZlcgogICAgICAgIHRoZSBjdXJzb3IgZW50ZXJzIGl0cyByYW5nZS4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvcgogICAgICAgIHRleHQtcmVwbGFjZW1lbnQgd2lkZ2V0cyB0aGF0IG5lZWQgdG8gJ3NuYXAgb3Blbicgd2hlbiB0aGUKICAgICAgICB1c2VyIHRyaWVzIHRvIGVkaXQgdGhlbS4gQQogICAgICAgIHRoZSA8YSBocmVmPSIjZXZlbnRfY2xlYXIiPjxjb2RlPiJjbGVhciI8L2NvZGU+PC9hPiBldmVudAogICAgICAgIGZpcmVkIG9uIHRoZSByYW5nZSBoYW5kbGUgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGlzCiAgICAgICAgaGFwcGVucy48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19yZXBsYWNlZFdpdGgiPjxjb2RlPnJlcGxhY2VkV2l0aCAoZG9tIG5vZGUpPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPlVzZSBhIGdpdmVuIG5vZGUgdG8gZGlzcGxheSB0aGlzIHJhbmdlLiBJbXBsaWVzIGJvdGgKICAgICAgICBjb2xsYXBzZWQgYW5kIGF0b21pYy48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19yZWFkT25seSI+PGNvZGU+cmVhZE9ubHk8L2NvZGU+PC90ZD4KICAgICAgICA8ZGQ+QSByZWFkLW9ubHkgc3BhbiBjYW4sIGFzIGxvbmcgYXMgaXQgaXMgbm90IGNsZWFyZWQsIG5vdCBiZQogICAgICAgIG1vZGlmaWVkIGV4Y2VwdCBieQogICAgICAgIGNhbGxpbmcgPGEgaHJlZj0iI3NldFZhbHVlIj48Y29kZT5zZXRWYWx1ZTwvY29kZT48L2E+IHRvIHJlc2V0CiAgICAgICAgdGhlIHdob2xlIGRvY3VtZW50LiA8ZW0+Tm90ZTo8L2VtPiBhZGRpbmcgYSByZWFkLW9ubHkgc3BhbgogICAgICAgIGN1cnJlbnRseSBjbGVhcnMgdGhlIHVuZG8gaGlzdG9yeSBvZiB0aGUgZWRpdG9yLCBiZWNhdXNlCiAgICAgICAgZXhpc3RpbmcgdW5kbyBldmVudHMgYmVpbmcgcGFydGlhbGx5IG51bGxpZmllZCBieSByZWFkLW9ubHkKICAgICAgICBzcGFucyB3b3VsZCBjb3JydXB0IHRoZSBoaXN0b3J5IChpbiB0aGUgY3VycmVudAogICAgICAgIGltcGxlbWVudGF0aW9uKS48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19zdGFydFN0eWxlIj48Y29kZT5zdGFydFN0eWxlPC9jb2RlPjwvZHQ+PGRkPkNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKICAgICAgICBhbiBleHRyYSBDU1MgY2xhc3MgdG8gYmUgYXBwbGllZCB0byB0aGUgbGVmdG1vc3Qgc3BhbiB0aGF0CiAgICAgICAgaXMgcGFydCBvZiB0aGUgbWFya2VyLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2VuZFN0eWxlIj48Y29kZT5lbmRTdHlsZTwvY29kZT48L2R0PjxkZD5FcXVpdmFsZW50CiAgICAgICAgdG8gPGNvZGU+c3RhcnRTdHlsZTwvY29kZT4sIGJ1dCBmb3IgdGhlIHJpZ2h0bW9zdCBzcGFuLjwvZGQ+CiAgICAgIDwvZGw+CiAgICAgIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gYW4gb2JqZWN0IHdpdGggdHdvIG1ldGhvZHMsCiAgICAgIDxjb2RlPmNsZWFyKCk8L2NvZGU+LCB3aGljaCByZW1vdmVzIHRoZSBtYXJrLAogICAgICBhbmQgPGNvZGU+ZmluZCgpPC9jb2RlPiwgd2hpY2ggcmV0dXJucyBhIDxjb2RlPntmcm9tLCB0b308L2NvZGU+CiAgICAgIChib3RoIGRvY3VtZW50IHBvc2l0aW9ucyksIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YKICAgICAgdGhlIG1hcmtlZCByYW5nZSwgb3IgPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBpZiB0aGUgbWFya2VyIGlzIG5vCiAgICAgIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0ic2V0Qm9va21hcmsiPjxjb2RlPnNldEJvb2ttYXJrKHBvcywgd2lkZ2V0KSDihpIgb2JqZWN0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JbnNlcnRzIGEgYm9va21hcmssIGEgaGFuZGxlIHRoYXQgZm9sbG93cyB0aGUgdGV4dCBhcm91bmQgaXQKICAgICAgYXMgaXQgaXMgYmVpbmcgZWRpdGVkLCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uIEEgYm9va21hcmsgaGFzIHR3bwogICAgICBtZXRob2RzIDxjb2RlPmZpbmQoKTwvY29kZT4gYW5kIDxjb2RlPmNsZWFyKCk8L2NvZGU+LiBUaGUgZmlyc3QKICAgICAgcmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYm9va21hcmssIGlmIGl0IGlzIHN0aWxsIGluCiAgICAgIHRoZSBkb2N1bWVudCwgYW5kIHRoZSBzZWNvbmQgZXhwbGljaXRseSByZW1vdmVzIHRoZSBib29rbWFyay4KICAgICAgVGhlIHdpZGdldCBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYQogICAgICBET00gbm9kZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgYm9va21hcmsgKGFuYWxvZ291cyB0bwogICAgICB0aGUgPGEgaHJlZj0iI21hcmtfcmVwbGFjZWRXaXRoIj48Y29kZT5yZXBsYWNlZFdpdGg8L2NvZGU+PC9hPgogICAgICBvcHRpb24gdG8gPGNvZGU+bWFya1RleHQ8L2NvZGU+KS48L2RkPgoKICAgICAgPGR0IGlkPSJmaW5kTWFya3NBdCI+PGNvZGU+ZmluZE1hcmtzQXQocG9zKSDihpIgYXJyYXk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBib29rbWFya3MgYW5kIG1hcmtlZCByYW5nZXMKICAgICAgcHJlc2VudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uPC9kZD4KCiAgICAgIDxkdCBpZD0ic2V0R3V0dGVyTWFya2VyIj48Y29kZT5zZXRHdXR0ZXJNYXJrZXIobGluZSwgZ3V0dGVySUQsIHZhbHVlKSDihpIgbGluZUhhbmRsZTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0cyB0aGUgZ3V0dGVyIG1hcmtlciBmb3IgdGhlIGdpdmVuIGd1dHRlciAoaWRlbnRpZmllZCBieQogICAgICBpdHMgQ1NTIGNsYXNzLCBzZWUKICAgICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fZ3V0dGVycyI+PGNvZGU+Z3V0dGVyczwvY29kZT48L2E+IG9wdGlvbikKICAgICAgdG8gdGhlIGdpdmVuIHZhbHVlLiBWYWx1ZSBjYW4gYmUgZWl0aGVyIDxjb2RlPm51bGw8L2NvZGU+LCB0bwogICAgICBjbGVhciB0aGUgbWFya2VyLCBvciBhIERPTSBlbGVtZW50LCB0byBzZXQgaXQuIFRoZSBET00gZWxlbWVudAogICAgICB3aWxsIGJlIHNob3duIGluIHRoZSBzcGVjaWZpZWQgZ3V0dGVyIG5leHQgdG8gdGhlIHNwZWNpZmllZAogICAgICBsaW5lLjwvZGQ+CiAgICAgIAogICAgICA8ZHQgaWQ9ImNsZWFyR3V0dGVyIj48Y29kZT5jbGVhckd1dHRlcihndXR0ZXJJRCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlbW92ZSBhbGwgZ3V0dGVyIG1hcmtlcnMgaW4KICAgICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fZ3V0dGVycyI+Z3V0dGVyPC9hPiB3aXRoIHRoZSBnaXZlbiBJRC48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRMaW5lQ2xhc3MiPjxjb2RlPmFkZExpbmVDbGFzcyhsaW5lLCB3aGVyZSwgY2xhc3MpIOKGkiBsaW5lSGFuZGxlPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TZXQgYSBDU1MgY2xhc3MgbmFtZSBmb3IgdGhlIGdpdmVuIGxpbmUuIDxjb2RlPmxpbmU8L2NvZGU+CiAgICAgIGNhbiBiZSBhIG51bWJlciBvciBhIGxpbmUgaGFuZGxlLiA8Y29kZT53aGVyZTwvY29kZT4gZGV0ZXJtaW5lcwogICAgICB0byB3aGljaCBlbGVtZW50IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGFwcGxpZWQsIGNhbiBjYW4gYmUgb25lCiAgICAgIG9mIDxjb2RlPiJ0ZXh0IjwvY29kZT4gKHRoZSB0ZXh0IGVsZW1lbnQsIHdoaWNoIGxpZXMgaW4gZnJvbnQgb2YKICAgICAgdGhlIHNlbGVjdGlvbiksIDxjb2RlPiJiYWNrZ3JvdW5kIjwvY29kZT4gKGEgYmFja2dyb3VuZCBlbGVtZW50CiAgICAgIHRoYXQgd2lsbCBiZSBiZWhpbmQgdGhlIHNlbGVjdGlvbiksIG9yIDxjb2RlPiJ3cmFwIjwvY29kZT4gKHRoZQogICAgICB3cmFwcGVyIG5vZGUgdGhhdCB3cmFwcyBhbGwgb2YgdGhlIGxpbmUncyBlbGVtZW50cywgaW5jbHVkaW5nCiAgICAgIGd1dHRlciBlbGVtZW50cykuIDxjb2RlPmNsYXNzPC9jb2RlPiBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlCiAgICAgIGNsYXNzIHRvIGFwcGx5LjwvZGQ+CgogICAgICA8ZHQgaWQ9InJlbW92ZUxpbmVDbGFzcyI+PGNvZGU+cmVtb3ZlTGluZUNsYXNzKGxpbmUsIHdoZXJlLCBjbGFzcykg4oaSIGxpbmVIYW5kbGU8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlbW92ZSBhIENTUyBjbGFzcyBmcm9tIGEgbGluZS4gPGNvZGU+bGluZTwvY29kZT4gY2FuIGJlIGEKICAgICAgbGluZSBoYW5kbGUgb3IgbnVtYmVyLiA8Y29kZT53aGVyZTwvY29kZT4gc2hvdWxkIGJlIG9uZQogICAgICBvZiA8Y29kZT4idGV4dCI8L2NvZGU+LCA8Y29kZT4iYmFja2dyb3VuZCI8L2NvZGU+LAogICAgICBvciA8Y29kZT4id3JhcCI8L2NvZGU+CiAgICAgIChzZWUgPGEgaHJlZj0iI2FkZExpbmVDbGFzcyI+PGNvZGU+YWRkTGluZUNsYXNzPC9jb2RlPjwvYT4pLiA8Y29kZT5jbGFzczwvY29kZT4KICAgICAgY2FuIGJlIGxlZnQgb2ZmIHRvIHJlbW92ZSBhbGwgY2xhc3NlcyBmb3IgdGhlIHNwZWNpZmllZCBub2RlLCBvcgogICAgICBiZSBhIHN0cmluZyB0byByZW1vdmUgb25seSBhIHNwZWNpZmljIGNsYXNzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImxpbmVJbmZvIj48Y29kZT5saW5lSW5mbyhsaW5lKSDihpIgb2JqZWN0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRoZSBsaW5lIG51bWJlciwgdGV4dCBjb250ZW50LCBhbmQgbWFya2VyIHN0YXR1cyBvZgogICAgICB0aGUgZ2l2ZW4gbGluZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIG51bWJlciBvciBhIGxpbmUgaGFuZGxlLgogICAgICBUaGUgcmV0dXJuZWQgb2JqZWN0IGhhcyB0aGUgc3RydWN0dXJlIDxjb2RlPntsaW5lLCBoYW5kbGUsIHRleHQsCiAgICAgIGd1dHRlck1hcmtlcnMsIHRleHRDbGFzcywgYmdDbGFzcywgd3JhcENsYXNzLCB3aWRnZXRzfTwvY29kZT4sCiAgICAgIHdoZXJlIDxjb2RlPmd1dHRlck1hcmtlcnM8L2NvZGU+IGlzIGFuIG9iamVjdCBtYXBwaW5nIGd1dHRlciBJRHMKICAgICAgdG8gbWFya2VyIGVsZW1lbnRzLCBhbmQgPGNvZGU+d2lkZ2V0czwvY29kZT4gaXMgYW4gYXJyYXkKICAgICAgb2YgPGEgaHJlZj0iI2FkZExpbmVXaWRnZXQiPmxpbmUgd2lkZ2V0czwvYT4gYXR0YWNoZWQgdG8gdGhpcwogICAgICBsaW5lLCBhbmQgdGhlIHZhcmlvdXMgY2xhc3MgcHJvcGVydGllcyByZWZlciB0byBjbGFzc2VzIGFkZGVkCiAgICAgIHdpdGggPGEgaHJlZj0iI2FkZExpbmVDbGFzcyI+PGNvZGU+YWRkTGluZUNsYXNzPC9jb2RlPjwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0TGluZUhhbmRsZSI+PGNvZGU+Z2V0TGluZUhhbmRsZShudW0pIOKGkiBsaW5lSGFuZGxlPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GZXRjaGVzIHRoZSBsaW5lIGhhbmRsZSBmb3IgdGhlIGdpdmVuIGxpbmUgbnVtYmVyLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldExpbmVOdW1iZXIiPjxjb2RlPmdldExpbmVOdW1iZXIoaGFuZGxlKSDihpIgaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+R2l2ZW4gYSBsaW5lIGhhbmRsZSwgcmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGF0CiAgICAgIGxpbmUgKG9yIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIGluIHRoZQogICAgICBkb2N1bWVudCkuPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0Vmlld3BvcnQiPjxjb2RlPmdldFZpZXdwb3J0KCkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyBhIDxjb2RlPntmcm9tLCB0b308L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZQogICAgICBzdGFydCAoaW5jbHVzaXZlKSBhbmQgZW5kIChleGNsdXNpdmUpIG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkCiAgICAgIHBhcnQgb2YgdGhlIGRvY3VtZW50LiBJbiBiaWcgZG9jdW1lbnRzLCB3aGVuIG1vc3QgY29udGVudCBpcwogICAgICBzY3JvbGxlZCBvdXQgb2YgdmlldywgQ29kZU1pcnJvciB3aWxsIG9ubHkgcmVuZGVyIHRoZSB2aXNpYmxlCiAgICAgIHBhcnQsIGFuZCBhIG1hcmdpbiBhcm91bmQgaXQuIFNlZSBhbHNvCiAgICAgIHRoZSA8YSBocmVmPSIjZXZlbnRfdmlld3BvcnRDaGFuZ2UiPjxjb2RlPnZpZXdwb3J0Q2hhbmdlPC9jb2RlPjwvYT4KICAgICAgZXZlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkV2lkZ2V0Ij48Y29kZT5hZGRXaWRnZXQocG9zLCBub2RlLCBzY3JvbGxJbnRvVmlldyk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlB1dHMgPGNvZGU+bm9kZTwvY29kZT4sIHdoaWNoIHNob3VsZCBiZSBhbiBhYnNvbHV0ZWx5CiAgICAgIHBvc2l0aW9uZWQgRE9NIG5vZGUsIGludG8gdGhlIGVkaXRvciwgcG9zaXRpb25lZCByaWdodCBiZWxvdyB0aGUKICAgICAgZ2l2ZW4gPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gcG9zaXRpb24uCiAgICAgIFdoZW4gPGNvZGU+c2Nyb2xsSW50b1ZpZXc8L2NvZGU+IGlzIHRydWUsIHRoZSBlZGl0b3Igd2lsbCBlbnN1cmUKICAgICAgdGhhdCB0aGUgZW50aXJlIG5vZGUgaXMgdmlzaWJsZSAoaWYgcG9zc2libGUpLiBUbyByZW1vdmUgdGhlCiAgICAgIHdpZGdldCBhZ2Fpbiwgc2ltcGx5IHVzZSBET00gbWV0aG9kcyAobW92ZSBpdCBzb21ld2hlcmUgZWxzZSwgb3IKICAgICAgY2FsbCA8Y29kZT5yZW1vdmVDaGlsZDwvY29kZT4gb24gaXRzIHBhcmVudCkuPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkTGluZVdpZGdldCI+PGNvZGU+YWRkTGluZVdpZGdldChsaW5lLCBub2RlLCBvcHRpb25zKSDihpIgb2JqZWN0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5BZGRzIGEgbGluZSB3aWRnZXQsIGFuIGVsZW1lbnQgc2hvd24gYmVsb3cgYSBsaW5lLCBzcGFubmluZwogICAgICB0aGUgd2hvbGUgb2YgdGhlIGVkaXRvcidzIHdpZHRoLCBhbmQgbW92aW5nIHRoZSBsaW5lcyBiZWxvdyBpdAogICAgICBkb3dud2FyZHMuIDxjb2RlPmxpbmU8L2NvZGU+IHNob3VsZCBiZSBlaXRoZXIgYW4gaW50ZWdlciBvciBhCiAgICAgIGxpbmUgaGFuZGxlLCBhbmQgPGNvZGU+bm9kZTwvY29kZT4gc2hvdWxkIGJlIGEgRE9NIG5vZGUsIHdoaWNoCiAgICAgIHdpbGwgYmUgZGlzcGxheWVkIGJlbG93IHRoZSBnaXZlbiBsaW5lLiA8Y29kZT5vcHRpb25zPC9jb2RlPiwKICAgICAgd2hlbiBnaXZlbiwgc2hvdWxkIGJlIGFuIG9iamVjdCB0aGF0IGNvbmZpZ3VyZXMgdGhlIGJlaGF2aW9yIG9mCiAgICAgIHRoZSB3aWRnZXQuIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkIChhbGwgZGVmYXVsdCB0bwogICAgICBmYWxzZSk6CiAgICAgICAgPGRsPgogICAgICAgICAgPGR0Pjxjb2RlPmNvdmVyR3V0dGVyIChib29sZWFuKTwvY29kZT48L2R0PgogICAgICAgICAgPGRkPldoZXRoZXIgdGhlIHdpZGdldCBzaG91bGQgY292ZXIgdGhlIGd1dHRlci48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPm5vSFNjcm9sbCAoYm9vbGVhbik8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5XaGV0aGVyIHRoZSB3aWRnZXQgc2hvdWxkIHN0YXkgZml4ZWQgaW4gdGhlIGZhY2Ugb2YKICAgICAgICAgIGhvcml6b250YWwgc2Nyb2xsaW5nLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+YWJvdmUgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+Q2F1c2VzIHRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIGFib3ZlIGluc3RlYWQgb2YgYmVsb3cKICAgICAgICAgIHRoZSB0ZXh0IG9mIHRoZSBsaW5lLjwvZGQ+CiAgICAgICAgPC9kbD4KICAgICAgTm90ZSB0aGF0IHRoZSB3aWRnZXQgbm9kZSB3aWxsIGJlY29tZSBhIGRlc2NlbmRhbnQgb2Ygbm9kZXMgd2l0aAogICAgICBDb2RlTWlycm9yLXNwZWNpZmljIENTUyBjbGFzc2VzLCBhbmQgdGhvc2UgY2xhc3NlcyBtaWdodCBpbiBzb21lCiAgICAgIGNhc2VzIGFmZmVjdCBpdC4gVGhpcyBtZXRob2QgcmV0dXJucyBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzCiAgICAgIHRoZSB3aWRnZXQgcGxhY2VtZW50LiBJdCdsbCBoYXZlIGEgPGNvZGU+bGluZTwvY29kZT4gcHJvcGVydHkKICAgICAgcG9pbnRpbmcgYXQgdGhlIGxpbmUgaGFuZGxlIHRoYXQgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLCBhbmQgaXQKICAgICAgY2FuIGJlIHBhc3NlZCB0byA8Y29kZT5yZW1vdmVMaW5lV2lkZ2V0PC9jb2RlPiB0byByZW1vdmUgdGhlCiAgICAgIHdpZGdldC48L2RkPgoKICAgICAgPGR0IGlkPSJyZW1vdmVMaW5lV2lkZ2V0Ij48Y29kZT5yZW1vdmVMaW5lV2lkZ2V0KHdpZGdldCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlbW92ZXMgdGhlIGdpdmVuIGxpbmUgd2lkZ2V0LjwvZGQ+CgogICAgICA8ZHQgaWQ9InBvc0Zyb21JbmRleCI+PGNvZGU+cG9zRnJvbUluZGV4KGluZGV4KSDihpIgb2JqZWN0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DYWxjdWxhdGVzIGFuZCByZXR1cm5zIGEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0IGZvciBhCiAgICAgIHplcm8tYmFzZWQgPGNvZGU+aW5kZXg8L2NvZGU+IHdobydzIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKICAgICAgZWRpdG9yJ3MgdGV4dC4gSWYgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBvdXQgb2YgcmFuZ2Ugb2YgdGhlIHRleHQgdGhlbgogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIGNsaXBwZWQgdG8gc3RhcnQgb3IgZW5kIG9mIHRoZSB0ZXh0CiAgICAgIHJlc3BlY3RpdmVseS48L2RkPgogICAgICA8ZHQgaWQ9ImluZGV4RnJvbVBvcyI+PGNvZGU+aW5kZXhGcm9tUG9zKG9iamVjdCkg4oaSIG51bWJlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIHJldmVyc2Ugb2YgPGEgaHJlZj0iI3Bvc0Zyb21JbmRleCI+PGNvZGU+cG9zRnJvbUluZGV4PC9jb2RlPjwvYT4uPC9kZD4KICAgIDwvZGw+CgogICAgPHA+VGhlIGZvbGxvd2luZyBhcmUgbW9yZSBsb3ctbGV2ZWwgbWV0aG9kczo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9Im9wZXJhdGlvbiI+PGNvZGU+b3BlcmF0aW9uKGZ1bmMpIOKGkiByZXN1bHQ8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNvZGVNaXJyb3IgaW50ZXJuYWxseSBidWZmZXJzIGNoYW5nZXMgYW5kIG9ubHkgdXBkYXRlcyBpdHMKICAgICAgRE9NIHN0cnVjdHVyZSBhZnRlciBpdCBoYXMgZmluaXNoZWQgcGVyZm9ybWluZyBzb21lIG9wZXJhdGlvbi4KICAgICAgSWYgeW91IG5lZWQgdG8gcGVyZm9ybSBhIGxvdCBvZiBvcGVyYXRpb25zIG9uIGEgQ29kZU1pcnJvcgogICAgICBpbnN0YW5jZSwgeW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYSBmdW5jdGlvbiBhcmd1bWVudC4gSXQKICAgICAgd2lsbCBjYWxsIHRoZSBmdW5jdGlvbiwgYnVmZmVyaW5nIHVwIGFsbCBjaGFuZ2VzLCBhbmQgb25seSBkb2luZwogICAgICB0aGUgZXhwZW5zaXZlIHVwZGF0ZSBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJucy4gVGhpcyBjYW4gYmUgYQogICAgICBsb3QgZmFzdGVyLiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBtZXRob2Qgd2lsbCBiZSB0aGUgcmV0dXJuCiAgICAgIHZhbHVlIG9mIHlvdXIgZnVuY3Rpb24uPC9kZD4KCiAgICAgIDxkdCBpZD0icmVmcmVzaCI+PGNvZGU+cmVmcmVzaCgpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JZiB5b3VyIGNvZGUgZG9lcyBzb21ldGhpbmcgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBlZGl0b3IKICAgICAgZWxlbWVudCAod2luZG93IHJlc2l6ZXMgYXJlIGFscmVhZHkgbGlzdGVuZWQgZm9yKSwgb3IgdW5oaWRlcwogICAgICBpdCwgeW91IHNob3VsZCBwcm9iYWJseSBmb2xsb3cgdXAgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCB0bwogICAgICBlbnN1cmUgQ29kZU1pcnJvciBpcyBzdGlsbCBsb29raW5nIGFzIGludGVuZGVkLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV4dGVuZFNlbGVjdGlvbiI+PGNvZGU+ZXh0ZW5kU2VsZWN0aW9uKHBvcywgcG9zMik8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNpbWlsYXIKICAgICAgdG8gPGEgaHJlZj0iI3NldFNlbGVjdGlvbiI+PGNvZGU+c2V0U2VsZWN0aW9uPC9jb2RlPjwvYT4sIGJ1dAogICAgICB3aWxsLCBpZiBzaGlmdCBpcyBoZWxkIG9yCiAgICAgIHRoZSA8YSBocmVmPSIjc2V0RXh0ZW5kaW5nIj5leHRlbmRpbmc8L2E+IGZsYWcgaXMgc2V0LCBtb3ZlIHRoZQogICAgICBoZWFkIG9mIHRoZSBzZWxlY3Rpb24gd2hpbGUgbGVhdmluZyB0aGUgYW5jaG9yIGF0IGl0cyBjdXJyZW50CiAgICAgIHBsYWNlLiA8Y29kZT5wb3MyPC9jb2RlPiBpcyBvcHRpb25hbCwgYW5kIGNhbiBiZSBwYXNzZWQgdG8KICAgICAgZW5zdXJlIGEgcmVnaW9uIChmb3IgZXhhbXBsZSBhIHdvcmQgb3IgcGFyYWdyYXBoKSB3aWxsIGVuZCB1cAogICAgICBzZWxlY3RlZCAoaW4gYWRkaXRpb24gdG8gd2hhdGV2ZXIgbGllcyBiZXR3ZWVuIHRoYXQgcmVnaW9uIGFuZAogICAgICB0aGUgY3VycmVudCBhbmNob3IpLjwvZGQ+CiAgICAgIDxkdCBpZD0ic2V0RXh0ZW5kaW5nIj48Y29kZT5zZXRFeHRlbmRpbmcoYm9vbCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNldHMgb3IgY2xlYXJzIHRoZSAnZXh0ZW5kaW5nJyBmbGFnLCB3aGljaCBhY3RzIHNpbWlsYXIgdG8KICAgICAgdGhlIHNoaWZ0IGtleSwgaW4gdGhhdCBpdCB3aWxsIGNhdXNlIGN1cnNvciBtb3ZlbWVudCBhbmQgY2FsbHMKICAgICAgdG8gPGEgaHJlZj0iI2V4dGVuZFNlbGVjdGlvbiI+PGNvZGU+ZXh0ZW5kU2VsZWN0aW9uPC9jb2RlPjwvYT4KICAgICAgdG8gbGVhdmUgdGhlIHNlbGVjdGlvbiBhbmNob3IgaW4gcGxhY2UuPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0SW5wdXRGaWVsZCI+PGNvZGU+Z2V0SW5wdXRGaWVsZCgpIOKGkiB0ZXh0YXJlYTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgaGlkZGVuIHRleHRhcmVhIHVzZWQgdG8gcmVhZCBpbnB1dC48L2RkPgogICAgICA8ZHQgaWQ9ImdldFdyYXBwZXJFbGVtZW50Ij48Y29kZT5nZXRXcmFwcGVyRWxlbWVudCgpIOKGkiBub2RlPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRoZSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGVkaXRvciwgYW5kCiAgICAgIGNvbnRyb2xzIGl0cyBzaXplLiBSZW1vdmUgdGhpcyBmcm9tIHlvdXIgdHJlZSB0byBkZWxldGUgYW4KICAgICAgZWRpdG9yIGluc3RhbmNlLjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0U2Nyb2xsZXJFbGVtZW50Ij48Y29kZT5nZXRTY3JvbGxlckVsZW1lbnQoKSDihpIgbm9kZTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgRE9NIG5vZGUgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHNjcm9sbGluZwogICAgICBvZiB0aGUgZWRpdG9yLjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0R3V0dGVyRWxlbWVudCI+PGNvZGU+Z2V0R3V0dGVyRWxlbWVudCgpIOKGkiBub2RlPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GZXRjaGVzIHRoZSBET00gbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBlZGl0b3IgZ3V0dGVycy48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRTdGF0ZUFmdGVyIj48Y29kZT5nZXRTdGF0ZUFmdGVyKGxpbmUpIOKGkiBzdGF0ZTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgbW9kZSdzIHBhcnNlciBzdGF0ZSwgaWYgYW55LCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICBnaXZlbiBsaW5lIG51bWJlci4gSWYgbm8gbGluZSBudW1iZXIgaXMgZ2l2ZW4sIHRoZSBzdGF0ZSBhdCB0aGUKICAgICAgZW5kIG9mIHRoZSBkb2N1bWVudCBpcyByZXR1cm5lZC4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBzdG9yaW5nCiAgICAgIHBhcnNpbmcgZXJyb3JzIGluIHRoZSBzdGF0ZSwgb3IgZ2V0dGluZyBvdGhlciBraW5kcyBvZgogICAgICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGZvciBhIGxpbmUuPC9kZD4KICAgIDwvZGw+CgogICAgPHAgaWQ9InZlcnNpb24iPlRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBvYmplY3QgaXRzZWxmIHByb3ZpZGVzCiAgICBzZXZlcmFsIHVzZWZ1bCBwcm9wZXJ0aWVzLiBGaXJzdGx5LCBpdHMgPGNvZGU+dmVyc2lvbjwvY29kZT4KICAgIHByb3BlcnR5IGNvbnRhaW5zIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZQogICAgbGlicmFyeS4gRm9yIHJlbGVhc2VzLCB0aGlzIHNpbXBseQogICAgY29udGFpbnMgPGNvZGU+Im1ham9yLm1pbm9yIjwvY29kZT4gKGZvcgogICAgZXhhbXBsZSA8Y29kZT4iMi4zMyI8L2NvZGU+LiBGb3IgYmV0YSB2ZXJzaW9ucywgPGNvZGU+IiBCIjwvY29kZT4KICAgIChzcGFjZSwgY2FwaXRhbCBCKSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIGZvcgogICAgZGV2ZWxvcG1lbnQgc25hcHNob3RzLCA8Y29kZT4iICsiPC9jb2RlPiAoc3BhY2UsIHBsdXMpIGlzCiAgICBhZGRlZC48L3A+CgogICAgPHAgaWQ9ImZyb21UZXh0QXJlYSI+VGhlIDxjb2RlPkNvZGVNaXJyb3IuZnJvbVRleHRBcmVhPC9jb2RlPgogICAgbWV0aG9kIHByb3ZpZGVzIGFub3RoZXIgd2F5IHRvIGluaXRpYWxpemUgYW4gZWRpdG9yLiBJdCB0YWtlcyBhCiAgICB0ZXh0YXJlYSBET00gbm9kZSBhcyBmaXJzdCBhcmd1bWVudCBhbmQgYW4gb3B0aW9uYWwgY29uZmlndXJhdGlvbgogICAgb2JqZWN0IGFzIHNlY29uZC4gSXQgd2lsbCByZXBsYWNlIHRoZSB0ZXh0YXJlYSB3aXRoIGEgQ29kZU1pcnJvcgogICAgaW5zdGFuY2UsIGFuZCB3aXJlIHVwIHRoZSBmb3JtIG9mIHRoYXQgdGV4dGFyZWEgKGlmIGFueSkgdG8gbWFrZQogICAgc3VyZSB0aGUgZWRpdG9yIGNvbnRlbnRzIGFyZSBwdXQgaW50byB0aGUgdGV4dGFyZWEgd2hlbiB0aGUgZm9ybQogICAgaXMgc3VibWl0dGVkLiBBIENvZGVNaXJyb3IgaW5zdGFuY2UgY3JlYXRlZCB0aGlzIHdheSBoYXMgdGhyZWUKICAgIGFkZGl0aW9uYWwgbWV0aG9kczo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9InNhdmUiPjxjb2RlPnNhdmUoKTwvY29kZT48L2R0PgogICAgICA8ZGQ+Q29weSB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yIGludG8gdGhlIHRleHRhcmVhLjwvZGQ+CgogICAgICA8ZHQgaWQ9InRvVGV4dEFyZWEiPjxjb2RlPnRvVGV4dEFyZWEoKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVtb3ZlIHRoZSBlZGl0b3IsIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCB0ZXh0YXJlYSAod2l0aAogICAgICB0aGUgZWRpdG9yJ3MgY3VycmVudCBjb250ZW50KS48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRUZXh0QXJlYSI+PGNvZGU+Z2V0VGV4dEFyZWEoKSDihpIgdGV4dGFyZWE8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIHRleHRhcmVhIHRoYXQgdGhlIGluc3RhbmNlIHdhcyBiYXNlZCBvbi48L2RkPgogICAgPC9kbD4KCiAgICA8cCBpZD0iZGVmaW5lRXh0ZW5zaW9uIj5JZiB5b3Ugd2FudCB0byBkZWZpbmUgZXh0cmEgbWV0aG9kcyBpbiB0ZXJtcwogICAgb2YgdGhlIENvZGVNaXJyb3IgQVBJLCBpdCBpcyBwb3NzaWJsZSB0bwogICAgdXNlIDxjb2RlPkNvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIHZhbHVlKTwvY29kZT4uIFRoaXMKICAgIHdpbGwgY2F1c2UgdGhlIGdpdmVuIHZhbHVlICh1c3VhbGx5IGEgbWV0aG9kKSB0byBiZSBhZGRlZCB0byBhbGwKICAgIENvZGVNaXJyb3IgaW5zdGFuY2VzIGNyZWF0ZWQgZnJvbSB0aGVuIG9uLjwvcD4KCiAgICA8cCBpZD0iZGVmaW5lT3B0aW9uIj5TaW1pbGFybHksIDxjb2RlPkNvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKG5hbWUsCiAgICBkZWZhdWx0LCB1cGRhdGVGdW5jKTwvY29kZT4gY2FuIGJlIHVzZWQgdG8gZGVmaW5lIG5ldyBvcHRpb25zIGZvcgogICAgQ29kZU1pcnJvci4gVGhlIDxjb2RlPnVwZGF0ZUZ1bmM8L2NvZGU+IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlCiAgICBlZGl0b3IgaW5zdGFuY2UgYW5kIHRoZSBuZXcgdmFsdWUgd2hlbiBhbiBlZGl0b3IgaXMgaW5pdGlhbGl6ZWQsCiAgICBhbmQgd2hlbmV2ZXIgdGhlIG9wdGlvbiBpcyBtb2RpZmllZAogICAgdGhyb3VnaCA8YSBocmVmPSIjc2V0T3B0aW9uIj48Y29kZT5zZXRPcHRpb248L2NvZGU+PC9hPi48L3A+CgogICAgPHAgaWQ9ImRlZmluZUluaXRIb29rIj5JZiB5b3VyIGV4dGVudGlvbiBqdXN0IG5lZWRzIHRvIHJ1biBzb21lCiAgICBjb2RlIHdoZW5ldmVyIGEgQ29kZU1pcnJvciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCwKICAgIHVzZSA8Y29kZT5Db2RlTWlycm9yLmRlZmluZUluaXRIb29rPC9jb2RlPi4gR2l2ZSBpdCBhIGZ1bmN0aW9uIGFzCiAgICBpdHMgb25seSBhcmd1bWVudCwgYW5kIGZyb20gdGhlbiBvbiwgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAogICAgKHdpdGggdGhlIGluc3RhbmNlIGFzIGFyZ3VtZW50KSB3aGVuZXZlciBhIG5ldyBDb2RlTWlycm9yIGluc3RhbmNlCiAgICBpcyBpbml0aWFsaXplZC48L3A+CgogICAgPGgyIGlkPSJhZGRvbnMiPkFkZC1vbnM8L2gyPgoKICAgIDxwPlRoZSA8Y29kZT5saWIvdXRpbDwvY29kZT4gZGlyZWN0b3J5IGluIHRoZSBkaXN0cmlidXRpb24KICAgIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHJldXNhYmxlIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgZXh0cmEKICAgIGVkaXRvciBmdW5jdGlvbmFsaXR5LiBJbiBicmllZiwgdGhleSBhcmU6PC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJ1dGlsX2RpYWxvZyI+PGEgaHJlZj0iLi4vbGliL3V0aWwvZGlhbG9nLmpzIj48Y29kZT5kaWFsb2cuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5Qcm92aWRlcyBhIHZlcnkgc2ltcGxlIHdheSB0byBxdWVyeSB1c2VycyBmb3IgdGV4dCBpbnB1dC4KICAgICAgQWRkcyBhbiA8Y29kZT5vcGVuRGlhbG9nPC9jb2RlPiBtZXRob2QgdG8gQ29kZU1pcnJvciBpbnN0YW5jZXMsCiAgICAgIHdoaWNoIGNhbiBiZSBjYWxsZWQgd2l0aCBhbiBIVE1MIGZyYWdtZW50IHRoYXQgcHJvdmlkZXMgdGhlCiAgICAgIHByb21wdCAoc2hvdWxkIGluY2x1ZGUgYW4gPGNvZGU+aW5wdXQ8L2NvZGU+IHRhZyksIGFuZCBhCiAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGV4dCBoYXMgYmVlbiBlbnRlcmVkLgogICAgICBEZXBlbmRzIG9uIDxjb2RlPmxpYi91dGlsL2RpYWxvZy5jc3M8L2NvZGU+LjwvZGQ+CiAgICAgIDxkdCBpZD0idXRpbF9zZWFyY2hjdXJzb3IiPjxhIGhyZWY9Ii4uL2xpYi91dGlsL3NlYXJjaGN1cnNvci5qcyI+PGNvZGU+c2VhcmNoY3Vyc29yLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+QWRkcyB0aGUgPGNvZGU+Z2V0U2VhcmNoQ3Vyc29yKHF1ZXJ5LCBzdGFydCwgY2FzZUZvbGQpIOKGkgogICAgICBjdXJzb3I8L2NvZGU+IG1ldGhvZCB0byBDb2RlTWlycm9yIGluc3RhbmNlcywgd2hpY2ggY2FuIGJlIHVzZWQKICAgICAgdG8gaW1wbGVtZW50IHNlYXJjaC9yZXBsYWNlIGZ1bmN0aW9uYWxpdHkuIDxjb2RlPnF1ZXJ5PC9jb2RlPgogICAgICBjYW4gYmUgYSByZWd1bGFyIGV4cHJlc3Npb24gb3IgYSBzdHJpbmcgKG9ubHkgc3RyaW5ncyB3aWxsIG1hdGNoCiAgICAgIGFjcm9zcyBsaW5lc+KAlGlmIHRoZXkgY29udGFpbiBuZXdsaW5lcykuIDxjb2RlPnN0YXJ0PC9jb2RlPgogICAgICBwcm92aWRlcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIHNlYXJjaC4gSXQgY2FuIGJlCiAgICAgIGEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0LCBvciBjYW4gYmUgbGVmdCBvZmYgdG8gZGVmYXVsdAogICAgICB0byB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LiA8Y29kZT5jYXNlRm9sZDwvY29kZT4gaXMgb25seQogICAgICByZWxldmFudCB3aGVuIG1hdGNoaW5nIGEgc3RyaW5nLiBJdCB3aWxsIGNhdXNlIHRoZSBzZWFyY2ggdG8gYmUKICAgICAgY2FzZS1pbnNlbnNpdGl2ZS4gQSBzZWFyY2ggY3Vyc29yIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CiAgICAgICAgPGRsPgogICAgICAgICAgPGR0Pjxjb2RlPmZpbmROZXh0KCksIGZpbmRQcmV2aW91cygpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+U2VhcmNoIGZvcndhcmQgb3IgYmFja3dhcmQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgYSBtYXRjaCB3YXMgZm91bmQuIElmCiAgICAgICAgICBtYXRjaGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZQogICAgICAgICAgYXJyYXkgcmV0dXJuZWQgYnkgdGhlIDxjb2RlPm1hdGNoPC9jb2RlPiBtZXRob2QsIGluIGNhc2UgeW91CiAgICAgICAgICB3YW50IHRvIGV4dHJhY3QgbWF0Y2hlZCBncm91cHMuPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT5mcm9tKCksIHRvKCkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICAgICAgPGRkPlRoZXNlIGFyZSBvbmx5IHZhbGlkIHdoZW4gdGhlIGxhc3QgY2FsbAogICAgICAgICAgdG8gPGNvZGU+ZmluZE5leHQ8L2NvZGU+IG9yIDxjb2RlPmZpbmRQcmV2aW91czwvY29kZT4gZGlkCiAgICAgICAgICBub3QgcmV0dXJuIGZhbHNlLiBUaGV5IHdpbGwgcmV0dXJuIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+CiAgICAgICAgICBvYmplY3RzIHBvaW50aW5nIGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBtYXRjaC48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPnJlcGxhY2UodGV4dCk8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5SZXBsYWNlcyB0aGUgY3VycmVudGx5IGZvdW5kIG1hdGNoIHdpdGggdGhlIGdpdmVuIHRleHQKICAgICAgICAgIGFuZCBhZGp1c3RzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gcmVmbGVjdCB0aGUKICAgICAgICAgIHJlcGxhY2VtZW50LjwvZGQ+CiAgICAgICAgPC9kbD48L2RkPgoKICAgICAgPGR0IGlkPSJ1dGlsX3NlYXJjaCI+PGEgaHJlZj0iLi4vbGliL3V0aWwvc2VhcmNoLmpzIj48Y29kZT5zZWFyY2guanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5JbXBsZW1lbnRzIHRoZSBzZWFyY2ggY29tbWFuZHMuIENvZGVNaXJyb3IgaGFzIGtleXMgYm91bmQgdG8KICAgICAgdGhlc2UgYnkgZGVmYXVsdCwgYnV0IHdpbGwgbm90IGRvIGFueXRoaW5nIHdpdGggdGhlbSB1bmxlc3MgYW4KICAgICAgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQuIERlcGVuZHMKICAgICAgb24gPGNvZGU+c2VhcmNoY3Vyc29yLmpzPC9jb2RlPiwgYW5kIHdpbGwgbWFrZSB1c2UKICAgICAgb2YgPGEgaHJlZj0iI3V0aWxfZGlhbG9nIj48Y29kZT5vcGVuRGlhbG9nPC9jb2RlPjwvYT4gd2hlbgogICAgICBhdmFpbGFibGUgdG8gbWFrZSBwcm9tcHRpbmcgZm9yIHNlYXJjaCBxdWVyaWVzIGxlc3MgdWdseS48L2RkPgogICAgICA8ZHQgaWQ9InV0aWxfbWF0Y2hicmFja2V0cyI+PGEgaHJlZj0iLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+PGNvZGU+bWF0Y2hicmFja2V0cy5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYW4gb3B0aW9uIDxjb2RlPm1hdGNoQnJhY2tldHM8L2NvZGU+IHdoaWNoLCB3aGVuIHNldAogICAgICB0byB0cnVlLCBjYXVzZXMgbWF0Y2hpbmcgYnJhY2tldHMgdG8gYmUgaGlnaGxpZ2h0ZWQgd2hlbmV2ZXIgdGhlCiAgICAgIGN1cnNvciBpcyBuZXh0IHRvIHRoZW0uIEl0IGFsc28gYWRkcyBhCiAgICAgIG1ldGhvZCA8Y29kZT5tYXRjaEJyYWNrZXRzPC9jb2RlPiB0aGF0IGZvcmNlcyB0aGlzIHRvIGhhcHBlbgogICAgICBvbmNlLCBhbmQgYSBtZXRob2QgPGNvZGU+ZmluZE1hdGNoaW5nQnJhY2tldDwvY29kZT4gdGhhdCBjYW4gYmUKICAgICAgdXNlZCB0byBydW4gdGhlIGJyYWNrZXQtZmluZGluZyBhbGdvcml0aG0gdGhhdCB0aGlzIHVzZXMKICAgICAgaW50ZXJuYWxseS48L2RkPgogICAgICA8ZHQgaWQ9InV0aWxfZm9sZGNvZGUiPjxhIGhyZWY9Ii4uL2xpYi91dGlsL2ZvbGRjb2RlLmpzIj48Y29kZT5mb2xkY29kZS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkhlbHBzIHdpdGggY29kZSBmb2xkaW5nLgogICAgICBTZWUgPGEgaHJlZj0iLi4vZGVtby9mb2xkaW5nLmh0bWwiPnRoZSBkZW1vPC9hPiBmb3IgYW4gZXhhbXBsZS4KICAgICAgQ2FsbCA8Y29kZT5Db2RlTWlycm9yLm5ld0ZvbGRGdW5jdGlvbjwvY29kZT4gd2l0aCBhIHJhbmdlLWZpbmRlcgogICAgICBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCB3aWxsLCB3aGVuIGFwcGxpZWQgdG8KICAgICAgYSBDb2RlTWlycm9yIGluc3RhbmNlIGFuZCBhIGxpbmUgbnVtYmVyLCBhdHRlbXB0IHRvIGZvbGQgb3IKICAgICAgdW5mb2xkIHRoZSBibG9jayBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gbGluZS4gQSByYW5nZS1maW5kZXIgaXMgYQogICAgICBsYW5ndWFnZS1zcGVjaWZpYyBmdW5jdGlvbiB0aGF0IGFsc28gdGFrZXMgYW4gaW5zdGFuY2UgYW5kIGEKICAgICAgbGluZSBudW1iZXIsIGFuZCByZXR1cm5zIGFuIHJhbmdlIHRvIGJlIGZvbGRlZCwgb3IgbnVsbCBpZgogICAgICBubyBibG9jayBpcyBzdGFydGVkIG9uIHRoYXQgbGluZS4gVGhpcyBmaWxlCiAgICAgIHByb3ZpZGVzIDxjb2RlPkNvZGVNaXJyb3IuYnJhY2VSYW5nZUZpbmRlcjwvY29kZT4sIHdoaWNoIGZpbmRzCiAgICAgIGJsb2NrcyBpbiBicmFjZSBsYW5ndWFnZXMgKEphdmFTY3JpcHQsIEMsIEphdmEsCiAgICAgIGV0YyksIDxjb2RlPkNvZGVNaXJyb3IuaW5kZW50UmFuZ2VGaW5kZXI8L2NvZGU+LCBmb3IgbGFuZ3VhZ2VzCiAgICAgIHdoZXJlIGluZGVudGF0aW9uIGRldGVybWluZXMgYmxvY2sgc3RydWN0dXJlIChQeXRob24sIEhhc2tlbGwpLAogICAgICBhbmQgPGNvZGU+Q29kZU1pcnJvci50YWdSYW5nZUZpbmRlcjwvY29kZT4sIGZvciBYTUwtc3R5bGUKICAgICAgbGFuZ3VhZ2VzLjwvZGQ+CiAgICAgIDxkdCBpZD0idXRpbF9ydW5tb2RlIj48YSBocmVmPSIuLi9saWIvdXRpbC9ydW5tb2RlLmpzIj48Y29kZT5ydW5tb2RlLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+Q2FuIGJlIHVzZWQgdG8gcnVuIGEgQ29kZU1pcnJvciBtb2RlIG92ZXIgdGV4dCB3aXRob3V0CiAgICAgIGFjdHVhbGx5IG9wZW5pbmcgYW4gZWRpdG9yIGluc3RhbmNlLgogICAgICBTZWUgPGEgaHJlZj0iLi4vZGVtby9ydW5tb2RlLmh0bWwiPnRoZSBkZW1vPC9hPiBmb3IgYW4KICAgICAgZXhhbXBsZS48L2RkPgogICAgICA8ZHQgaWQ9InV0aWxfb3ZlcmxheSI+PGEgaHJlZj0iLi4vbGliL3V0aWwvb3ZlcmxheS5qcyI+PGNvZGU+b3ZlcmxheS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk1vZGUgY29tYmluYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4dGVuZCBhIG1vZGUgd2l0aCBhbgogICAgICAnb3ZlcmxheScg4oCUIGEgc2Vjb25kYXJ5IG1vZGUgaXMgcnVuIG92ZXIgdGhlIHN0cmVhbSwgYWxvbmcgd2l0aAogICAgICB0aGUgYmFzZSBtb2RlLCBhbmQgY2FuIGNvbG9yIHNwZWNpZmljIHBpZWNlcyBvZiB0ZXh0IHdpdGhvdXQKICAgICAgaW50ZXJmZXJpbmcgd2l0aCB0aGUgYmFzZSBtb2RlLgogICAgICBEZWZpbmVzIDxjb2RlPkNvZGVNaXJyb3Iub3ZlcmxheU1vZGU8L2NvZGU+LCB3aGljaCBpcyB1c2VkIHRvCiAgICAgIGNyZWF0ZSBzdWNoIGEgbW9kZS4gU2VlIDxhIGhyZWY9Ii4uL2RlbW8vbXVzdGFjaGUuaHRtbCI+dGhpcwogICAgICBkZW1vPC9hPiBmb3IgYSBkZXRhaWxlZCBleGFtcGxlLjwvZGQ+CiAgICAgIDxkdCBpZD0idXRpbF9tdWx0aXBsZXgiPjxhIGhyZWY9Ii4uL2xpYi91dGlsL211bHRpcGxleC5qcyI+PGNvZGU+bXVsdGlwbGV4LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+TW9kZSBjb21iaW5hdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gZWFzaWx5ICdtdWx0aXBsZXgnCiAgICAgIGJldHdlZW4gc2V2ZXJhbCBtb2Rlcy4KICAgICAgRGVmaW5lcyA8Y29kZT5Db2RlTWlycm9yLm11bHRpcGxleGluZ01vZGU8L2NvZGU+IHdoaWNoLCB3aGVuCiAgICAgIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50IGEgbW9kZSBvYmplY3QsIGFuZCBhcyBvdGhlciBhcmd1bWVudHMKICAgICAgYW55IG51bWJlciBvZiA8Y29kZT57b3BlbiwgY2xvc2UsIG1vZGUgWywgZGVsaW1TdHlsZV19PC9jb2RlPgogICAgICBvYmplY3RzLCB3aWxsIHJldHVybiBhIG1vZGUgb2JqZWN0IHRoYXQgc3RhcnRzIHBhcnNpbmcgdXNpbmcgdGhlCiAgICAgIG1vZGUgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LCBidXQgd2lsbCBzd2l0Y2ggdG8gYW5vdGhlciBtb2RlCiAgICAgIGFzIHNvb24gYXMgaXQgZW5jb3VudGVycyBhIHN0cmluZyB0aGF0IG9jY3VycyBpbiBvbmUgb2YKICAgICAgdGhlIDxjb2RlPm9wZW48L2NvZGU+IGZpZWxkcyBvZiB0aGUgcGFzc2VkIG9iamVjdHMuIFdoZW4gaW4gYQogICAgICBzdWItbW9kZSwgaXQgd2lsbCBnbyBiYWNrIHRvIHRoZSB0b3AgbW9kZSBhZ2FpbiB3aGVuCiAgICAgIHRoZSA8Y29kZT5jbG9zZTwvY29kZT4gc3RyaW5nIGlzIGVuY291bnRlcmVkLgogICAgICBQYXNzIDxjb2RlPiJcbiI8L2NvZGU+IGZvciA8Y29kZT5vcGVuPC9jb2RlPiBvciA8Y29kZT5jbG9zZTwvY29kZT4KICAgICAgaWYgeW91IHdhbnQgdG8gc3dpdGNoIG9uIGEgYmxhbmsgbGluZS4KICAgICAgV2hlbiA8Y29kZT5kZWxpbVN0eWxlPC9jb2RlPiBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGhlIHRva2VuCiAgICAgIHN0eWxlIHJldHVybmVkIGZvciB0aGUgZGVsaW1pdGVyIHRva2Vucy4gVGhlIG91dGVyIG1vZGUgd2lsbCBub3QKICAgICAgc2VlIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIGRlbGltaXRlcnMuCiAgICAgIFNlZSA8YSBocmVmPSIuLi9kZW1vL211bHRpcGxleC5odG1sIj50aGlzIGRlbW88L2E+IGZvciBhbgogICAgICBleGFtcGxlLjwvZGQ+CiAgICAgIDxkdCBpZD0idXRpbF9zaW1wbGUtaGludCI+PGEgaHJlZj0iLi4vbGliL3V0aWwvc2ltcGxlLWhpbnQuanMiPjxjb2RlPnNpbXBsZS1oaW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+UHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIHNob3dpbmcgYXV0b2NvbXBsZXRpb24gaGludHMuCiAgICAgIERlZmluZXMgPGNvZGU+Q29kZU1pcnJvci5zaW1wbGVIaW50PC9jb2RlPiwgd2hpY2ggdGFrZXMgYQogICAgICBDb2RlTWlycm9yIGluc3RhbmNlIGFuZCBhIGhpbnRpbmcgZnVuY3Rpb24sIGFuZCBwb3BzIHVwIGEgd2lkZ2V0CiAgICAgIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGNvbXBsZXRpb24uIEhpbnRpbmcgZnVuY3Rpb25zCiAgICAgIGFyZSBmdW5jdGlvbiB0aGF0IHRha2UgYW4gZWRpdG9yIGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgIGEgPGNvZGU+e2xpc3QsIGZyb20sIHRvfTwvY29kZT4gb2JqZWN0LCB3aGVyZSA8Y29kZT5saXN0PC9jb2RlPgogICAgICBpcyBhbiBhcnJheSBvZiBzdHJpbmdzICh0aGUgY29tcGxldGlvbnMpLCBhbmQgPGNvZGU+ZnJvbTwvY29kZT4KICAgICAgYW5kIDxjb2RlPnRvPC9jb2RlPiBnaXZlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSB0b2tlbiB0aGF0IGlzCiAgICAgIGJlaW5nIGNvbXBsZXRlZC4gRGVwZW5kcwogICAgICBvbiA8Y29kZT5saWIvdXRpbC9zaW1wbGUtaGludC5jc3M8L2NvZGU+LjwvZGQ+CiAgICAgIDxkdCBpZD0idXRpbF9qYXZhc2NyaXB0LWhpbnQiPjxhIGhyZWY9Ii4uL2xpYi91dGlsL2phdmFzY3JpcHQtaGludC5qcyI+PGNvZGU+amF2YXNjcmlwdC1oaW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyA8Y29kZT5Db2RlTWlycm9yLmphdmFzY3JpcHRIaW50PC9jb2RlPgogICAgICBhbmQgPGNvZGU+Q29kZU1pcnJvci5jb2ZmZWVzY3JpcHRIaW50PC9jb2RlPiwgd2hpY2ggYXJlIHNpbXBsZQogICAgICBoaW50aW5nIGZ1bmN0aW9ucyBmb3IgdGhlIEphdmFTY3JpcHQgYW5kIENvZmZlZVNjcmlwdAogICAgICBtb2Rlcy48L2RkPgogICAgICA8ZHQgaWQ9InV0aWxfbWF0Y2gtaGlnaGxpZ2h0ZXIiPjxhIGhyZWY9Ii4uL2xpYi91dGlsL21hdGNoLWhpZ2hsaWdodGVyLmpzIj48Y29kZT5tYXRjaC1oaWdobGlnaHRlci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZHMgYSA8Y29kZT5tYXRjaEhpZ2hsaWdodDwvY29kZT4gbWV0aG9kIHRvIENvZGVNaXJyb3IKICAgICAgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIGNhbGxlZCAodHlwaWNhbGx5IGZyb20KICAgICAgYSA8YSBocmVmPSIjZXZlbnRfY3Vyc29yQWN0aXZpdHkiPjxjb2RlPmN1cnNvckFjdGl2aXR5PC9jb2RlPjwvYT4KICAgICAgaGFuZGxlcikgdG8gaGlnaGxpZ2h0IGFsbCBpbnN0YW5jZXMgb2YgYSBjdXJyZW50bHkgc2VsZWN0ZWQgd29yZAogICAgICB3aXRoIHRoZSBhIGNsYXNzbmFtZSBnaXZlbiBhcyBhIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBtZXRob2QuCiAgICAgIERlcGVuZHMgb24KICAgICAgdGhlIDxhIGhyZWY9IiN1dGlsX3NlYXJjaGN1cnNvciI+PGNvZGU+c2VhcmNoY3Vyc29yPC9jb2RlPjwvYT4KICAgICAgYWRkLW9uLiBEZW1vIDxhIGhyZWY9Ii4uL2RlbW8vbWF0Y2hoaWdobGlnaHRlci5odG1sIj5oZXJlPC9hPi48L2RkPgogICAgICA8ZHQgaWQ9InV0aWxfZm9ybWF0dGluZyI+PGEgaHJlZj0iLi4vbGliL3V0aWwvZm9ybWF0dGluZy5qcyI+PGNvZGU+Zm9ybWF0dGluZy5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZHMgPGNvZGU+Y29tbWVudFJhbmdlPC9jb2RlPiwgPGNvZGU+YXV0b0luZGVudFJhbmdlPC9jb2RlPiwKICAgICAgYW5kIDxjb2RlPmF1dG9Gb3JtYXRSYW5nZTwvY29kZT4gbWV0aG9kcyB0aGF0LCByZXNwZWN0aXZlbHksCiAgICAgIGNvbW1lbnQgKG9yIHVuY29tbWVudCksIGluZGVudCwgb3IgZm9ybWF0IChhZGQgbGluZSBicmVha3MpIGEKICAgICAgcmFuZ2Ugb2YgY29kZS4gPGEgaHJlZj0iLi4vZGVtby9mb3JtYXR0aW5nLmh0bWwiPkRlbW8gaGVyZS48L2E+PC9kZD4KICAgICAgPGR0IGlkPSJ1dGlsX2Nsb3NldGFnIj48YSBocmVmPSIuLi9saWIvdXRpbC9jbG9zZXRhZy5qcyI+PGNvZGU+Y2xvc2V0YWcuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5Qcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYWRkaW5nIGF1dG9tYXRpYyB0YWcgY2xvc2luZwogICAgICB0byBYTUwgbW9kZXMuIFNlZQogICAgICB0aGUgPGEgaHJlZj0iLi4vZGVtby9jbG9zZXRhZy5odG1sIj5kZW1vPC9hPi48L2RkPgogICAgICA8ZHQgaWQ9InV0aWxfbG9hZG1vZGUiPjxhIGhyZWY9Ii4uL2xpYi91dGlsL2xvYWRtb2RlLmpzIj48Y29kZT5sb2FkbW9kZS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYSA8Y29kZT5Db2RlTWlycm9yLnJlcXVpcmVNb2RlKG1vZGVuYW1lLAogICAgICBjYWxsYmFjayk8L2NvZGU+IGZ1bmN0aW9uIHRoYXQgd2lsbCB0cnkgdG8gbG9hZCBhIGdpdmVuIG1vZGUgYW5kCiAgICAgIGNhbGwgdGhlIGNhbGxiYWNrIHdoZW4gaXQgc3VjY2VlZGVkLiBZb3UnbGwgaGF2ZSB0bwogICAgICBzZXQgPGNvZGU+Q29kZU1pcnJvci5tb2RlVVJMPC9jb2RlPiB0byBhIHN0cmluZyB0aGF0IG1vZGUgcGF0aHMKICAgICAgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20sIGZvcgogICAgICBleGFtcGxlIDxjb2RlPiJtb2RlLyVOLyVOLmpzIjwvY29kZT7igJR0aGUgPGNvZGU+JU48L2NvZGU+J3Mgd2lsbAogICAgICBiZSByZXBsYWNlZCB3aXRoIHRoZSBtb2RlIG5hbWUuIEFsc28KICAgICAgZGVmaW5lcyA8Y29kZT5Db2RlTWlycm9yLmF1dG9Mb2FkTW9kZShpbnN0YW5jZSwgbW9kZSk8L2NvZGU+LAogICAgICB3aGljaCB3aWxsIGVuc3VyZSB0aGUgZ2l2ZW4gbW9kZSBpcyBsb2FkZWQgYW5kIGNhdXNlIHRoZSBnaXZlbgogICAgICBlZGl0b3IgaW5zdGFuY2UgdG8gcmVmcmVzaCBpdHMgbW9kZSB3aGVuIHRoZSBsb2FkaW5nCiAgICAgIHN1Y2NlZWRlZC4gU2VlIHRoZSA8YSBocmVmPSIuLi9kZW1vL2xvYWRtb2RlLmh0bWwiPmRlbW88L2E+LjwvZGQ+CiAgICAgIDxkdCBpZD0idXRpbF9jb250aW51ZWNvbW1lbnQiPjxhIGhyZWY9Ii4uL2xpYi91dGlsL2NvbnRpbnVlY29tbWVudC5qcyI+PGNvZGU+Y29udGludWVjb21tZW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+QWRkcyBhIDxhIGhyZWY9IiNjb21tYW5kcyI+Y29tbWFuZDwvYT4KICAgICAgY2FsbGVkIDxjb2RlPm5ld2xpbmVBbmRJbmRlbnRDb250aW51ZUNvbW1lbnQ8L2NvZGU+IHRoYXQgeW91IGNhbgogICAgICBiaW5kIDxjb2RlPkVudGVyPC9jb2RlPiB0byBpbiBvcmRlciB0byBoYXZlIHRoZSBlZGl0b3IgcHJlZml4CiAgICAgIG5ldyBsaW5lcyBpbnNpZGUgQy1saWtlIGJsb2NrIGNvbW1lbnRzIHdpdGggYW4gYXN0ZXJpc2suPC9kZD4KICAgIDwvZGw+CgogICAgPGgyIGlkPSJtb2RlYXBpIj5Xcml0aW5nIENvZGVNaXJyb3IgTW9kZXM8L2gyPgoKICAgIDxwPk1vZGVzIHR5cGljYWxseSBjb25zaXN0IG9mIGEgc2luZ2xlIEphdmFTY3JpcHQgZmlsZS4gVGhpcyBmaWxlCiAgICBkZWZpbmVzLCBpbiB0aGUgc2ltcGxlc3QgY2FzZSwgYSBsZXhlciAodG9rZW5pemVyKSBmb3IgeW91cgogICAgbGFuZ3VhZ2XigJRhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjaGFyYWN0ZXIgc3RyZWFtIGFzIGlucHV0LAogICAgYWR2YW5jZXMgaXQgcGFzdCBhIHRva2VuLCBhbmQgcmV0dXJucyBhIHN0eWxlIGZvciB0aGF0IHRva2VuLiBNb3JlCiAgICBhZHZhbmNlZCBtb2RlcyBjYW4gYWxzbyBoYW5kbGUgaW5kZW50YXRpb24gZm9yIHRoZSBsYW5ndWFnZS48L3A+CgogICAgPHAgaWQ9ImRlZmluZU1vZGUiPlRoZSBtb2RlIHNjcmlwdCBzaG91bGQKICAgIGNhbGwgPGNvZGU+Q29kZU1pcnJvci5kZWZpbmVNb2RlPC9jb2RlPiB0byByZWdpc3RlciBpdHNlbGYgd2l0aAogICAgQ29kZU1pcnJvci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0d28gYXJndW1lbnRzLiBUaGUgZmlyc3Qgc2hvdWxkIGJlCiAgICB0aGUgbmFtZSBvZiB0aGUgbW9kZSwgZm9yIHdoaWNoIHlvdSBzaG91bGQgdXNlIGEgbG93ZXJjYXNlIHN0cmluZywKICAgIHByZWZlcmFibHkgb25lIHRoYXQgaXMgYWxzbyB0aGUgbmFtZSBvZiB0aGUgZmlsZXMgdGhhdCBkZWZpbmUgdGhlCiAgICBtb2RlIChpLmUuIDxjb2RlPiJ4bWwiPC9jb2RlPiBpcyBkZWZpbmVkIGluIDxjb2RlPnhtbC5qczwvY29kZT4pLiBUaGUKICAgIHNlY29uZCBhcmd1bWVudCBzaG91bGQgYmUgYSBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIENvZGVNaXJyb3IKICAgIGNvbmZpZ3VyYXRpb24gb2JqZWN0ICh0aGUgdGhpbmcgcGFzc2VkIHRvCiAgICB0aGUgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4gZnVuY3Rpb24pIGFuZCBhbiBvcHRpb25hbCBtb2RlCiAgICBjb25maWd1cmF0aW9uIG9iamVjdCAoYXMgaW4KICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX21vZGUiPjxjb2RlPm1vZGU8L2NvZGU+PC9hPiBvcHRpb24pLCByZXR1cm5zCiAgICBhIG1vZGUgb2JqZWN0LjwvcD4KCiAgICA8cD5UeXBpY2FsbHksIHlvdSBzaG91bGQgdXNlIHRoaXMgc2Vjb25kIGFyZ3VtZW50CiAgICB0byA8Y29kZT5kZWZpbmVNb2RlPC9jb2RlPiBhcyB5b3VyIG1vZHVsZSBzY29wZSBmdW5jdGlvbiAobW9kZXMKICAgIHNob3VsZCBub3QgbGVhayBhbnl0aGluZyBpbnRvIHRoZSBnbG9iYWwgc2NvcGUhKSwgaS5lLiB3cml0ZSB5b3VyCiAgICB3aG9sZSBtb2RlIGluc2lkZSB0aGlzIGZ1bmN0aW9uLjwvcD4KCiAgICA8cD5UaGUgbWFpbiByZXNwb25zaWJpbGl0eSBvZiBhIG1vZGUgc2NyaXB0IGlzIDxlbT5wYXJzaW5nPC9lbT4KICAgIHRoZSBjb250ZW50IG9mIHRoZSBlZGl0b3IuIERlcGVuZGluZyBvbiB0aGUgbGFuZ3VhZ2UgYW5kIHRoZQogICAgYW1vdW50IG9mIGZ1bmN0aW9uYWxpdHkgZGVzaXJlZCwgdGhpcyBjYW4gYmUgZG9uZSBpbiByZWFsbHkgZWFzeQogICAgb3IgZXh0cmVtZWx5IGNvbXBsaWNhdGVkIHdheXMuIFNvbWUgcGFyc2VycyBjYW4gYmUgc3RhdGVsZXNzLAogICAgbWVhbmluZyB0aGF0IHRoZXkgbG9vayBhdCBvbmUgZWxlbWVudCAoPGVtPnRva2VuPC9lbT4pIG9mIHRoZSBjb2RlCiAgICBhdCBhIHRpbWUsIHdpdGggbm8gbWVtb3J5IG9mIHdoYXQgY2FtZSBiZWZvcmUuIE1vc3QsIGhvd2V2ZXIsIHdpbGwKICAgIG5lZWQgdG8gcmVtZW1iZXIgc29tZXRoaW5nLiBUaGlzIGlzIGRvbmUgYnkgdXNpbmcgYSA8ZW0+c3RhdGUKICAgIG9iamVjdDwvZW0+LCB3aGljaCBpcyBhbiBvYmplY3QgdGhhdCBpcyBhbHdheXMgcGFzc2VkIHdoZW4KICAgIHJlYWRpbmcgYSB0b2tlbiwgYW5kIHdoaWNoIGNhbiBiZSBtdXRhdGVkIGJ5IHRoZSB0b2tlbml6ZXIuPC9wPgoKICAgIDxwIGlkPSJzdGFydFN0YXRlIj5Nb2RlcyB0aGF0IHVzZSBhIHN0YXRlIG11c3QgZGVmaW5lCiAgICBhIDxjb2RlPnN0YXJ0U3RhdGU8L2NvZGU+IG1ldGhvZCBvbiB0aGVpciBtb2RlIG9iamVjdC4gVGhpcyBpcyBhCiAgICBmdW5jdGlvbiBvZiBubyBhcmd1bWVudHMgdGhhdCBwcm9kdWNlcyBhIHN0YXRlIG9iamVjdCB0byBiZSB1c2VkCiAgICBhdCB0aGUgc3RhcnQgb2YgYSBkb2N1bWVudC48L3A+CgogICAgPHAgaWQ9InRva2VuIj5UaGUgbW9zdCBpbXBvcnRhbnQgcGFydCBvZiBhIG1vZGUgb2JqZWN0IGlzCiAgICBpdHMgPGNvZGU+dG9rZW4oc3RyZWFtLCBzdGF0ZSk8L2NvZGU+IG1ldGhvZC4gQWxsIG1vZGVzIG11c3QKICAgIGRlZmluZSB0aGlzIG1ldGhvZC4gSXQgc2hvdWxkIHJlYWQgb25lIHRva2VuIGZyb20gdGhlIHN0cmVhbSBpdCBpcwogICAgZ2l2ZW4gYXMgYW4gYXJndW1lbnQsIG9wdGlvbmFsbHkgdXBkYXRlIGl0cyBzdGF0ZSwgYW5kIHJldHVybiBhCiAgICBzdHlsZSBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciB0b2tlbnMgdGhhdCBkbyBub3QgaGF2ZSB0bwogICAgYmUgc3R5bGVkLiBGb3IgeW91ciBzdHlsZXMsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlCiAgICAnc3RhbmRhcmQnIG5hbWVzIGRlZmluZWQgaW4gdGhlIHRoZW1lcyAod2l0aG91dAogICAgdGhlIDxjb2RlPmNtLTwvY29kZT4gcHJlZml4KS4gSWYgdGhhdCBmYWlscywgaXQgaXMgYWxzbyBwb3NzaWJsZQogICAgdG8gY29tZSB1cCB3aXRoIHlvdXIgb3duIGFuZCB3cml0ZSB5b3VyIG93biBDU1MgdGhlbWUgZmlsZS48cD4KCiAgICA8cCBpZD0iU3RyaW5nU3RyZWFtIj5UaGUgc3RyZWFtIG9iamVjdCB0aGF0J3MgcGFzc2VkCiAgICB0byA8Y29kZT50b2tlbjwvY29kZT4gZW5jYXBzdWxhdGVzIGEgbGluZSBvZiBjb2RlICh0b2tlbnMgbWF5CiAgICBuZXZlciBzcGFuIGxpbmVzKSBhbmQgb3VyIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhhdCBsaW5lLiBJdCBoYXMKICAgIHRoZSBmb2xsb3dpbmcgQVBJOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT5lb2woKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0cnVlIG9ubHkgaWYgdGhlIHN0cmVhbSBpcyBhdCB0aGUgZW5kIG9mIHRoZQogICAgICBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5zb2woKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0cnVlIG9ubHkgaWYgdGhlIHN0cmVhbSBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlCiAgICAgIGxpbmUuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5wZWVrKCkg4oaSIGNoYXJhY3RlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZwogICAgICBpdC4gV2lsbCByZXR1cm4gYW4gPGNvZGU+bnVsbDwvY29kZT4gYXQgdGhlIGVuZCBvZiB0aGUKICAgICAgbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+bmV4dCgpIOKGkiBjaGFyYWN0ZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJlYW0gYW5kIGFkdmFuY2VzIGl0LgogICAgICBBbHNvIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBubyBtb3JlIGNoYXJhY3RlcnMgYXJlCiAgICAgIGF2YWlsYWJsZS48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmVhdChtYXRjaCkg4oaSIGNoYXJhY3RlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+PGNvZGU+bWF0Y2g8L2NvZGU+IGNhbiBiZSBhIGNoYXJhY3RlciwgYSByZWd1bGFyIGV4cHJlc3Npb24sCiAgICAgIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGNoYXJhY3RlciBhbmQgcmV0dXJucyBhIGJvb2xlYW4uIElmCiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgc3RyZWFtICdtYXRjaGVzJyB0aGUgZ2l2ZW4gYXJndW1lbnQsCiAgICAgIGl0IGlzIGNvbnN1bWVkIGFuZCByZXR1cm5lZC4gT3RoZXJ3aXNlLCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+CiAgICAgIGlzIHJldHVybmVkLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5lYXRXaGlsZShtYXRjaCkg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlcGVhdGVkbHkgY2FsbHMgPGNvZGU+ZWF0PC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudCwKICAgICAgdW50aWwgaXQgZmFpbHMuIFJldHVybnMgdHJ1ZSBpZiBhbnkgY2hhcmFjdGVycyB3ZXJlIGVhdGVuLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5lYXRTcGFjZSgpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TaG9ydGN1dCBmb3IgPGNvZGU+ZWF0V2hpbGU8L2NvZGU+IHdoZW4gbWF0Y2hpbmcKICAgICAgd2hpdGUtc3BhY2UuPC9kZD4KICAgICAgPGR0Pjxjb2RlPnNraXBUb0VuZCgpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlcyB0aGUgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+c2tpcFRvKGNoKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+U2tpcHMgdG8gdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyLCBpZgogICAgICBmb3VuZCBvbiB0aGUgY3VycmVudCBsaW5lIChkb2Vzbid0IGFkdmFuY2UgdGhlIHN0cmVhbSBpZiB0aGUKICAgICAgY2hhcmFjdGVyIGRvZXMgbm90IG9jY3VyIG9uIHRoZSBsaW5lKS4gUmV0dXJucyB0cnVlIGlmIHRoZQogICAgICBjaGFyYWN0ZXIgd2FzIGZvdW5kLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5tYXRjaChwYXR0ZXJuLCBjb25zdW1lLCBjYXNlRm9sZCkg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPkFjdCBsaWtlIGEKICAgICAgbXVsdGktY2hhcmFjdGVyIDxjb2RlPmVhdDwvY29kZT7igJRpZiA8Y29kZT5jb25zdW1lPC9jb2RlPiBpcyB0cnVlCiAgICAgIG9yIG5vdCBnaXZlbuKAlG9yIGEgbG9vay1haGVhZCB0aGF0IGRvZXNuJ3QgdXBkYXRlIHRoZSBzdHJlYW0KICAgICAgcG9zaXRpb27igJRpZiBpdCBpcyBmYWxzZS4gPGNvZGU+cGF0dGVybjwvY29kZT4gY2FuIGJlIGVpdGhlciBhCiAgICAgIHN0cmluZyBvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdGFydGluZyB3aXRoIDxjb2RlPl48L2NvZGU+LgogICAgICBXaGVuIGl0IGlzIGEgc3RyaW5nLCA8Y29kZT5jYXNlRm9sZDwvY29kZT4gY2FuIGJlIHNldCB0byB0cnVlIHRvCiAgICAgIG1ha2UgdGhlIG1hdGNoIGNhc2UtaW5zZW5zaXRpdmUuIFdoZW4gc3VjY2Vzc2Z1bGx5IG1hdGNoaW5nIGEKICAgICAgcmVndWxhciBleHByZXNzaW9uLCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB0aGUgYXJyYXkKICAgICAgcmV0dXJuZWQgYnkgPGNvZGU+bWF0Y2g8L2NvZGU+LCBpbiBjYXNlIHlvdSBuZWVkIHRvIGV4dHJhY3QKICAgICAgbWF0Y2hlZCBncm91cHMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5iYWNrVXAobik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkJhY2tzIHVwIHRoZSBzdHJlYW0gPGNvZGU+bjwvY29kZT4gY2hhcmFjdGVycy4gQmFja2luZyBpdCB1cAogICAgICBmdXJ0aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRva2VuIHdpbGwgY2F1c2UgdGhpbmdzIHRvCiAgICAgIGJyZWFrLCBzbyBiZSBjYXJlZnVsLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5jb2x1bW4oKSDihpIgaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgY29sdW1uICh0YWtpbmcgaW50byBhY2NvdW50IHRhYnMpIGF0IHdoaWNoIHRoZQogICAgICBjdXJyZW50IHRva2VuIHN0YXJ0cy48L2RkPgogICAgICA8ZHQ+PGNvZGU+aW5kZW50YXRpb24oKSDihpIgaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGVsbHMgeW91IGhvdyBmYXIgdGhlIGN1cnJlbnQgbGluZSBoYXMgYmVlbiBpbmRlbnRlZCwgaW4KICAgICAgc3BhY2VzLiBDb3JyZWN0cyBmb3IgdGFiIGNoYXJhY3RlcnMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5jdXJyZW50KCkg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0IHRoZSBzdHJpbmcgYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdG9rZW4gYW5kCiAgICAgIHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbi48L2RkPgogICAgPC9kbD4KCiAgICA8cCBpZD0iYmxhbmtMaW5lIj5CeSBkZWZhdWx0LCBibGFuayBsaW5lcyBhcmUgc2ltcGx5IHNraXBwZWQgd2hlbgogICAgdG9rZW5pemluZyBhIGRvY3VtZW50LiBGb3IgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBzaWduaWZpY2FudCBibGFuawogICAgbGluZXMsIHlvdSBjYW4gZGVmaW5lIGEgPGNvZGU+YmxhbmtMaW5lKHN0YXRlKTwvY29kZT4gbWV0aG9kIG9uCiAgICB5b3VyIG1vZGUgdGhhdCB3aWxsIGdldCBjYWxsZWQgd2hlbmV2ZXIgYSBibGFuayBsaW5lIGlzIHBhc3NlZAogICAgb3Zlciwgc28gdGhhdCBpdCBjYW4gdXBkYXRlIHRoZSBwYXJzZXIgc3RhdGUuPC9wPgoKICAgIDxwIGlkPSJjb3B5U3RhdGUiPkJlY2F1c2Ugc3RhdGUgb2JqZWN0IGFyZSBtdXRhdGVkLCBhbmQgQ29kZU1pcnJvcgogICAgbmVlZHMgdG8ga2VlcCB2YWxpZCB2ZXJzaW9ucyBvZiBhIHN0YXRlIGFyb3VuZCBzbyB0aGF0IGl0IGNhbgogICAgcmVzdGFydCBhIHBhcnNlIGF0IGFueSBsaW5lLCBjb3BpZXMgbXVzdCBiZSBtYWRlIG9mIHN0YXRlIG9iamVjdHMuCiAgICBUaGUgZGVmYXVsdCBhbGdvcml0aG0gdXNlZCBpcyB0aGF0IGEgbmV3IHN0YXRlIG9iamVjdCBpcyBjcmVhdGVkLAogICAgd2hpY2ggZ2V0cyBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9sZCBvYmplY3QuIEFueSBwcm9wZXJ0aWVzCiAgICB3aGljaCBob2xkIGFycmF5cyBnZXQgYSBjb3B5IG9mIHRoZXNlIGFycmF5cyAoc2luY2UgYXJyYXlzIHRlbmQgdG8KICAgIGJlIHVzZWQgYXMgbXV0YWJsZSBzdGFja3MpLiBXaGVuIHRoaXMgaXMgbm90IGNvcnJlY3QsIGZvciBleGFtcGxlCiAgICBiZWNhdXNlIGEgbW9kZSBtdXRhdGVzIG5vbi1hcnJheSBwcm9wZXJ0aWVzIG9mIGl0cyBzdGF0ZSBvYmplY3QsIGEKICAgIG1vZGUgb2JqZWN0IHNob3VsZCBkZWZpbmUgYSA8Y29kZT5jb3B5U3RhdGU8L2NvZGU+IG1ldGhvZCwKICAgIHdoaWNoIGlzIGdpdmVuIGEgc3RhdGUgYW5kIHNob3VsZCByZXR1cm4gYSBzYWZlIGNvcHkgb2YgdGhhdAogICAgc3RhdGUuPC9wPgoKICAgIDxwIGlkPSJpbmRlbnQiPklmIHlvdSB3YW50IHlvdXIgbW9kZSB0byBwcm92aWRlIHNtYXJ0IGluZGVudGF0aW9uCiAgICAodGhyb3VnaCB0aGUgPGEgaHJlZj0iI2luZGVudExpbmUiPjxjb2RlPmluZGVudExpbmU8L2NvZGU+PC9hPgogICAgbWV0aG9kIGFuZCB0aGUgPGNvZGU+aW5kZW50QXV0bzwvY29kZT4KICAgIGFuZCA8Y29kZT5uZXdsaW5lQW5kSW5kZW50PC9jb2RlPiBjb21tYW5kcywgd2hpY2gga2V5cyBjYW4gYmUKICAgIDxhIGhyZWY9IiNvcHRpb25fZXh0cmFLZXlzIj5ib3VuZDwvYT4gdG8pLCB5b3UgbXVzdCBkZWZpbmUKICAgIGFuIDxjb2RlPmluZGVudChzdGF0ZSwgdGV4dEFmdGVyKTwvY29kZT4gbWV0aG9kIG9uIHlvdXIgbW9kZQogICAgb2JqZWN0LjwvcD4KCiAgICA8cD5UaGUgaW5kZW50YXRpb24gbWV0aG9kIHNob3VsZCBpbnNwZWN0IHRoZSBnaXZlbiBzdGF0ZSBvYmplY3QsCiAgICBhbmQgb3B0aW9uYWxseSB0aGUgPGNvZGU+dGV4dEFmdGVyPC9jb2RlPiBzdHJpbmcsIHdoaWNoIGNvbnRhaW5zCiAgICB0aGUgdGV4dCBvbiB0aGUgbGluZSB0aGF0IGlzIGJlaW5nIGluZGVudGVkLCBhbmQgcmV0dXJuIGFuCiAgICBpbnRlZ2VyLCB0aGUgYW1vdW50IG9mIHNwYWNlcyB0byBpbmRlbnQuIEl0IHNob3VsZCB1c3VhbGx5IHRha2UKICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX2luZGVudFVuaXQiPjxjb2RlPmluZGVudFVuaXQ8L2NvZGU+PC9hPgogICAgb3B0aW9uIGludG8gYWNjb3VudC48L3A+CgogICAgPHAgaWQ9ImVsZWN0cmljQ2hhcnMiPkZpbmFsbHksIGEgbW9kZSBtYXkgZGVmaW5lCiAgICBhbiA8Y29kZT5lbGVjdHJpY0NoYXJzPC9jb2RlPiBwcm9wZXJ0eSwgd2hpY2ggc2hvdWxkIGhvbGQgYSBzdHJpbmcKICAgIGNvbnRhaW5pbmcgYWxsIHRoZSBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGJlaGF2aW91cgogICAgZGVzY3JpYmVkIGZvcgogICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fZWxlY3RyaWNDaGFycyI+PGNvZGU+ZWxlY3RyaWNDaGFyczwvY29kZT48L2E+CiAgICBvcHRpb24uPC9wPgoKICAgIDxwPlNvLCB0byBzdW1tYXJpemUsIGEgbW9kZSA8ZW0+bXVzdDwvZW0+IHByb3ZpZGUKICAgIGEgPGNvZGU+dG9rZW48L2NvZGU+IG1ldGhvZCwgYW5kIGl0IDxlbT5tYXk8L2VtPgogICAgcHJvdmlkZSA8Y29kZT5zdGFydFN0YXRlPC9jb2RlPiwgPGNvZGU+Y29weVN0YXRlPC9jb2RlPiwKICAgIGFuZCA8Y29kZT5pbmRlbnQ8L2NvZGU+IG1ldGhvZHMuIEZvciBhbiBleGFtcGxlIG9mIGEgdHJpdmlhbCBtb2RlLAogICAgc2VlIHRoZSA8YSBocmVmPSIuLi9tb2RlL2RpZmYvZGlmZi5qcyI+ZGlmZiBtb2RlPC9hPiwgZm9yIGEgbW9yZQogICAgaW52b2x2ZWQgZXhhbXBsZSwgc2VlIHRoZSA8YSBocmVmPSIuLi9tb2RlL2NsaWtlL2NsaWtlLmpzIj5DLWxpa2UKICAgIG1vZGU8L2E+LjwvcD4KCiAgICA8cD5Tb21ldGltZXMsIGl0IGlzIHVzZWZ1bCBmb3IgbW9kZXMgdG8gPGVtPm5lc3Q8L2VtPuKAlHRvIGhhdmUgb25lCiAgICBtb2RlIGRlbGVnYXRlIHdvcmsgdG8gYW5vdGhlciBtb2RlLiBBbiBleGFtcGxlIG9mIHRoaXMga2luZCBvZgogICAgbW9kZSBpcyB0aGUgPGEgaHJlZj0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj5taXhlZC1tb2RlIEhUTUwKICAgIG1vZGU8L2E+LiBUbyBpbXBsZW1lbnQgc3VjaCBuZXN0aW5nLCBpdCBpcyB1c3VhbGx5IG5lY2Vzc2FyeSB0bwogICAgY3JlYXRlIG1vZGUgb2JqZWN0cyBhbmQgY29weSBzdGF0ZXMgeW91cnNlbGYuIFRvIGNyZWF0ZSBhIG1vZGUKICAgIG9iamVjdCwgdGhlcmUgYXJlIDxjb2RlPkNvZGVNaXJyb3IuZ2V0TW9kZShvcHRpb25zLAogICAgcGFyc2VyQ29uZmlnKTwvY29kZT4sIHdoZXJlIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGNvbmZpZ3VyYXRpb24KICAgIG9iamVjdCBhcyBwYXNzZWQgdG8gdGhlIG1vZGUgY29uc3RydWN0b3IgZnVuY3Rpb24sIGFuZCB0aGUgc2Vjb25kCiAgICBhcmd1bWVudCBpcyBhIG1vZGUgc3BlY2lmaWNhdGlvbiBhcyBpbgogICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fbW9kZSI+PGNvZGU+bW9kZTwvY29kZT48L2E+IG9wdGlvbi4gVG8gY29weSBhCiAgICBzdGF0ZSBvYmplY3QsIGNhbGwgPGNvZGU+Q29kZU1pcnJvci5jb3B5U3RhdGUobW9kZSwgc3RhdGUpPC9jb2RlPiwKICAgIHdoZXJlIDxjb2RlPm1vZGU8L2NvZGU+IGlzIHRoZSBtb2RlIHRoYXQgY3JlYXRlZCB0aGUgZ2l2ZW4KICAgIHN0YXRlLjwvcD4KCiAgICA8cCBpZD0iaW5uZXJNb2RlIj5JbiBhIG5lc3RlZCBtb2RlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhZGQgYW4KICAgIGV4dHJhIG1ldGhvZHMsIDxjb2RlPmlubmVyTW9kZTwvY29kZT4gd2hpY2gsIGdpdmVuIGEgc3RhdGUgb2JqZWN0LAogICAgcmV0dXJucyBhIDxjb2RlPntzdGF0ZSwgbW9kZX08L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBpbm5lciBtb2RlCiAgICBhbmQgaXRzIHN0YXRlIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbi4gVGhlc2UgYXJlIHVzZWQgYnkgdXRpbGl0eQogICAgc2NyaXB0cyBzdWNoIGFzIHRoZSA8YSBocmVmPSIjdXRpbF9mb3JtYXR0aW5nIj5hdXRvZm9ybWF0dGVyPC9hPgogICAgYW5kIHRoZSA8YSBocmVmPSIjdXRpbF9jbG9zZXRhZyI+dGFnIGNsb3NlcjwvYT4gdG8gZ2V0IGNvbnRleHQKICAgIGluZm9ybWF0aW9uLiBVc2UgdGhlIDxjb2RlPkNvZGVNaXJyb3IuaW5uZXJNb2RlPC9jb2RlPiBoZWxwZXIKICAgIGZ1bmN0aW9uIHRvLCBzdGFydGluZyBmcm9tIGEgbW9kZSBhbmQgYSBzdGF0ZSwgcmVjdXJzaXZlbHkgd2FsawogICAgZG93biB0byB0aGUgaW5uZXJtb3N0IG1vZGUgYW5kIHN0YXRlLjwvcD4KCiAgICA8cD5UbyBtYWtlIGluZGVudGF0aW9uIHdvcmsgcHJvcGVybHkgaW4gYSBuZXN0ZWQgcGFyc2VyLCBpdCBpcwogICAgYWR2aXNhYmxlIHRvIGdpdmUgdGhlIDxjb2RlPnN0YXJ0U3RhdGU8L2NvZGU+IG1ldGhvZCBvZiBtb2RlcyB0aGF0CiAgICBhcmUgaW50ZW5kZWQgdG8gYmUgbmVzdGVkIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgcHJvdmlkZXMgdGhlCiAgICBiYXNlIGluZGVudGF0aW9uIGZvciB0aGUgYmxvY2sgb2YgY29kZS4gVGhlIEphdmFTY3JpcHQgYW5kIENTUwogICAgcGFyc2VyIGRvIHRoaXMsIGZvciBleGFtcGxlLCB0byBhbGxvdyBKYXZhU2NyaXB0IGFuZCBDU1MgY29kZQogICAgaW5zaWRlIHRoZSBtaXhlZC1tb2RlIEhUTUwgbW9kZSB0byBiZSBwcm9wZXJseSBpbmRlbnRlZC48L3A+CgogICAgPHA+SXQgaXMgcG9zc2libGUsIGFuZCBlbmNvdXJhZ2VkLCB0byBhc3NvY2lhdGUgeW91ciBtb2RlLCBvciBhCiAgICBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gb2YgeW91ciBtb2RlLCB3aXRoCiAgICBhIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlNRSI+TUlNRTwvYT4gdHlwZS4gRm9yCiAgICBleGFtcGxlLCB0aGUgSmF2YVNjcmlwdCBtb2RlIGFzc29jaWF0ZXMgaXRzZWxmCiAgICB3aXRoIDxjb2RlPnRleHQvamF2YXNjcmlwdDwvY29kZT4sIGFuZCBpdHMgSlNPTiB2YXJpYW50CiAgICB3aXRoIDxjb2RlPmFwcGxpY2F0aW9uL2pzb248L2NvZGU+LiBUbyBkbyB0aGlzLAogICAgY2FsbCA8Y29kZT5Db2RlTWlycm9yLmRlZmluZU1JTUUobWltZSwgbW9kZVNwZWMpPC9jb2RlPiwKICAgIHdoZXJlIDxjb2RlPm1vZGVTcGVjPC9jb2RlPiBjYW4gYmUgYSBzdHJpbmcgb3Igb2JqZWN0IHNwZWNpZnlpbmcgYQogICAgbW9kZSwgYXMgaW4gdGhlIDxhIGhyZWY9IiNvcHRpb25fbW9kZSI+PGNvZGU+bW9kZTwvY29kZT48L2E+CiAgICBvcHRpb24uPC9wPgoKICAgIDxwIGlkPSJleHRlbmRNb2RlIj5Tb21ldGltZXMsIGl0IGlzIHVzZWZ1bCB0byBhZGQgb3Igb3ZlcnJpZGUgbW9kZQogICAgb2JqZWN0IHByb3BlcnRpZXMgZnJvbSBleHRlcm5hbCBjb2RlLgogICAgVGhlIDxjb2RlPkNvZGVNaXJyb3IuZXh0ZW5kTW9kZTwvY29kZT4gY2FuIGJlIHVzZWQgdG8gYWRkCiAgICBwcm9wZXJ0aWVzIHRvIG1vZGUgb2JqZWN0cyBwcm9kdWNlZCBmb3IgYSBzcGVjaWZpYyBtb2RlLiBJdHMgZmlyc3QKICAgIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBtb2RlLCBpdHMgc2Vjb25kIGFuIG9iamVjdCB0aGF0CiAgICBzcGVjaWZpZXMgdGhlIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgYWRkZWQuIFRoaXMgaXMgbW9zdGx5CiAgICB1c2VmdWwgdG8gYWRkIHV0aWxpdGllcyB0aGF0IGNhbiBsYXRlciBiZSBsb29rZWQKICAgIHVwIHRocm91Z2ggPGEgaHJlZj0iI2dldE1vZGUiPjxjb2RlPmdldE1vZGU8L2NvZGU+PC9hPi48L3A+Cgo8L2Rpdj48ZGl2IGNsYXNzPSJyaWdodHNtYWxsIGJsayI+CgogICAgPGgyPkNvbnRlbnRzPC9oMj4KCiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSIjb3ZlcnZpZXciPk92ZXJ2aWV3PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjdXNhZ2UiPkJhc2ljIFVzYWdlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjY29uZmlnIj5Db25maWd1cmF0aW9uPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjZXZlbnRzIj5FdmVudHM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNrZXltYXBzIj5LZXltYXBzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjc3R5bGluZyI+Q3VzdG9taXplZCBTdHlsaW5nPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjYXBpIj5Qcm9ncmFtbWluZyBBUEk8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNhZGRvbnMiPkFkZC1vbnM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNtb2RlYXBpIj5Xcml0aW5nIENvZGVNaXJyb3IgTW9kZXM8L2E+PC9saT4KICAgIDwvdWw+Cgo8L2Rpdj48L2Rpdj4KCjxkaXYgc3R5bGU9ImhlaWdodDogMmVtIj4mbmJzcDs8L2Rpdj4KCjxzY3JpcHQ+c2V0VGltZW91dChmdW5jdGlvbigpe0NvZGVNaXJyb3IuY29sb3JpemUoKTt9LCAyMCk7PC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/oldrelease.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KICAgIDx0aXRsZT5Db2RlTWlycm9yPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NhbnN8RHJvaWQrU2Fuczpib2xkIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJkb2NzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJhbHRlcm5hdGUiIGhyZWY9Imh0dHA6Ly90d2l0dGVyLmNvbS9zdGF0dXNlcy91c2VyX3RpbWVsaW5lLzI0MjI4MzI4OC5yc3MiIHR5cGU9ImFwcGxpY2F0aW9uL3Jzcyt4bWwiLz4KICA8L2hlYWQ+CiAgPGJvZHk+Cgo8aDE+PHNwYW4gY2xhc3M9ImxvZ28tYnJhY2VzIj57IH08L3NwYW4+IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC8iPkNvZGVNaXJyb3I8L2E+PC9oMT4KCjxkaXYgY2xhc3M9ImdyZXkiPgo8aW1nIHNyYz0iYmFib29uLnBuZyIgY2xhc3M9ImxvZ28iIGFsdD0ibG9nbyIvPgo8cHJlPgovKiBPbGQgcmVsZWFzZQogICBoaXN0b3J5ICovCjwvcHJlPgo8L2Rpdj4KCiAgPHAgY2xhc3M9InJlbCI+MjMtMDQtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4yNC56aXAiPlZlcnNpb24gMi4yNDwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT48c3Ryb25nPkRyb3Agc3VwcG9ydCBmb3IgSW50ZXJuZXQgRXhwbG9yZXIgNjwvc3Ryb25nPi48L2xpPgogICAgPGxpPk5ldwogICAgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvc2hlbGwvaW5kZXguaHRtbCI+U2hlbGw8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3Rpa2kvaW5kZXguaHRtbCI+VGlraQogICAgd2lraTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvcGlnL2luZGV4Lmh0bWwiPlBpZyBMYXRpbjwvYT4uPC9saT4KICAgIDxsaT5OZXcgdGhlbWVzOiA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWw/YW1iaWFuY2UiPkFtYmlhbmNlPC9hPiwgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sP2JsYWNrYm9hcmQiPkJsYWNrYm9hcmQ8L2E+LjwvbGk+CiAgICA8bGk+TW9yZSBjb250cm9sIG92ZXIgZHJhZy9kcm9wCiAgICB3aXRoIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9kcmFnRHJvcCI+PGNvZGU+ZHJhZ0Ryb3A8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9vbkRyYWdFdmVudCI+PGNvZGU+b25EcmFnRXZlbnQ8L2NvZGU+PC9hPgogICAgb3B0aW9ucy48L2xpPgogICAgPGxpPk1ha2UgSFRNTCBtb2RlIGEgYml0IGxlc3MgcGVkYW50aWMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjY29tcG91bmRDaGFuZ2UiPjxjb2RlPmNvbXBvdW5kQ2hhbmdlPC9jb2RlPjwvYT4gQVBJIG1ldGhvZC48L2xpPgogICAgPGxpPlNldmVyYWwgZml4ZXMgaW4gdW5kbyBoaXN0b3J5IGFuZCBsaW5lIGhpZGluZy48L2xpPgogICAgPGxpPlJlbW92ZSAoYnJva2VuKSBzdXBwb3J0IGZvciA8Y29kZT5jYXRjaGFsbDwvY29kZT4gaW4ga2V5IG1hcHMsCiAgICBhZGQgPGNvZGU+bm9mYWxsdGhyb3VnaDwvY29kZT4gYm9vbGVhbiBmaWVsZCBpbnN0ZWFkLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjYtMDMtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4yMy56aXAiPlZlcnNpb24gMi4yMzwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5DaGFuZ2UgPHN0cm9uZz5kZWZhdWx0IGJpbmRpbmcgZm9yIHRhYjwvc3Ryb25nPiA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmJpbmRpbmcnKS5zdHlsZS5kaXNwbGF5PScnKSI+W21vcmVdPC9hPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBub25lIiBpZD10YWJiaW5kaW5nPgogICAgICAgIFN0YXJ0aW5nIGluIDIuMjMsIHRoZXNlIGJpbmRpbmdzIGFyZSBkZWZhdWx0OgogICAgICAgIDx1bD48bGk+VGFiOiBJbnNlcnQgdGFiIGNoYXJhY3RlcjwvbGk+CiAgICAgICAgICA8bGk+U2hpZnQtdGFiOiBSZXNldCBsaW5lIGluZGVudGF0aW9uIHRvIGRlZmF1bHQ8L2xpPgogICAgICAgICAgPGxpPkN0cmwvQ21kLVs6IFJlZHVjZSBsaW5lIGluZGVudGF0aW9uIChvbGQgdGFiIGJlaGF2aW91cik8L2xpPgogICAgICAgICAgPGxpPkN0cmwvQ21kLV06IEluY3JlYXNlIGxpbmUgaW5kZW50YXRpb24gKG9sZCBzaGlmdC10YWIgYmVoYXZpb3VyKTwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L2xpPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS94cXVlcnkvaW5kZXguaHRtbCI+WFF1ZXJ5PC9hPiBhbmQgPGEgaHJlZj0iLi4vbW9kZS92YnNjcmlwdC9pbmRleC5odG1sIj5WQlNjcmlwdDwvYT4uPC9saT4KICAgIDxsaT5Ud28gbmV3IHRoZW1lczogPGEgaHJlZj0iLi4vbW9kZS9sZXNzL2luZGV4Lmh0bWwiPmxlc3Nlci1kYXJrPC9hPiBhbmQgPGEgaHJlZj0iLi4vbW9kZS94cXVlcnkvaW5kZXguaHRtbCI+eHEtZGFyazwvYT4uPC9saT4KICAgIDxsaT5EaWZmZXJlbnRpYXRlIGJldHdlZW4gYmFja2dyb3VuZCBhbmQgdGV4dCBzdHlsZXMgaW4gPGEgaHJlZj0ibWFudWFsLmh0bWwjc2V0TGluZUNsYXNzIj48Y29kZT5zZXRMaW5lQ2xhc3M8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPkZpeCBkcmFnLWFuZC1kcm9wIGluIElFOSsuPC9saT4KICAgIDxsaT5FeHRlbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjY2hhckNvb3JkcyI+PGNvZGU+Y2hhckNvb3JkczwvY29kZT48L2E+CiAgICBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjY3Vyc29yQ29vcmRzIj48Y29kZT5jdXJzb3JDb29yZHM8L2NvZGU+PC9hPiB3aXRoIGEgPGNvZGU+bW9kZTwvY29kZT4gYXJndW1lbnQuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2F1dG9mb2N1cyI+PGNvZGU+YXV0b2ZvY3VzPC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2ZpbmRNYXJrc0F0Ij48Y29kZT5maW5kTWFya3NBdDwvY29kZT48L2E+IG1ldGhvZC48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI3LTAyLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMjIuemlwIj5WZXJzaW9uIDIuMjI8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWxsb3cgPGEgaHJlZj0ibWFudWFsLmh0bWwja2V5bWFwcyI+a2V5IGhhbmRsZXJzPC9hPiB0byBwYXNzIHVwIGV2ZW50cywgYWxsb3cgYmluZGluZyBjaGFyYWN0ZXJzLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9hdXRvQ2xlYXJFbXB0eUxpbmVzIj48Y29kZT5hdXRvQ2xlYXJFbXB0eUxpbmVzPC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+UHJvcGVybHkgdXNlIHRhYiBzdG9wcyB3aGVuIHJlbmRlcmluZyB0YWJzLjwvbGk+CiAgICA8bGk+TWFrZSBQSFAgbW9kZSBtb3JlIHJvYnVzdC48L2xpPgogICAgPGxpPlN1cHBvcnQgaW5kZW50YXRpb24gYmxvY2tzIGluIDxhIGhyZWY9Im1hbnVhbC5odG1sI3V0aWxfZm9sZGNvZGUiPmNvZGUgZm9sZGVyPC9hPi48L2xpPgogICAgPGxpPkFkZCBhIHNjcmlwdCBmb3IgPGEgaHJlZj0ibWFudWFsLmh0bWwjdXRpbF9tYXRjaC1oaWdobGlnaHRlciI+aGlnaGxpZ2h0aW5nIGluc3RhbmNlcyBvZiB0aGUgc2VsZWN0aW9uPC9hPi48L2xpPgogICAgPGxpPk5ldyA8YSBocmVmPSIuLi9tb2RlL3Byb3BlcnRpZXMvaW5kZXguaHRtbCI+LnByb3BlcnRpZXM8L2E+IG1vZGUuPC9saT4KICAgIDxsaT5GaXggbWFueSBidWdzLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjctMDEtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4yMS56aXAiPlZlcnNpb24gMi4yMTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGRlZCA8YSBocmVmPSIuLi9tb2RlL2xlc3MvaW5kZXguaHRtbCI+TEVTUzwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvbXlzcWwvaW5kZXguaHRtbCI+TXlTUUw8L2E+LAogICAgPGEgaHJlZj0iLi4vbW9kZS9nby9pbmRleC5odG1sIj5HbzwvYT4sIGFuZCA8YSBocmVmPSIuLi9tb2RlL3Zlcmlsb2cvaW5kZXguaHRtbCI+VmVyaWxvZzwvYT4gbW9kZXMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3NtYXJ0SW5kZW50Ij48Y29kZT5zbWFydEluZGVudDwvY29kZT48L2E+CiAgICBvcHRpb24uPC9saT4KICAgIDxsaT5TdXBwb3J0IGEgY3Vyc29yIGluIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9yZWFkT25seSI+PGNvZGU+cmVhZE9ubHk8L2NvZGU+PC9hPi1tb2RlLjwvbGk+CiAgICA8bGk+U3VwcG9ydCBhc3NpZ25pbmcgbXVsdGlwbGUgc3R5bGVzIHRvIGEgdG9rZW4uPC9saT4KICAgIDxsaT5Vc2UgYSBuZXcgYXBwcm9hY2ggdG8gZHJhd2luZyB0aGUgc2VsZWN0aW9uLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI3Njcm9sbFRvIj48Y29kZT5zY3JvbGxUbzwvY29kZT48L2E+IG1ldGhvZC48L2xpPgogICAgPGxpPkFsbG93IHVuZG8vcmVkbyBldmVudHMgdG8gc3BhbiBub24tYWRqYWNlbnQgbGluZXMuPC9saT4KICAgIDxsaT5Mb3RzIGFuZCBsb3RzIG9mIGJ1Z2ZpeGVzLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMTItMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4yLnppcCI+VmVyc2lvbiAyLjI8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+U2xpZ2h0bHkgaW5jb21wYXRpYmxlIEFQSSBjaGFuZ2VzLiBSZWFkIDxhIGhyZWY9InVwZ3JhZGVfdjIuMi5odG1sIj50aGlzPC9hPi48L2xpPgogICAgPGxpPk5ldyBhcHByb2FjaAogICAgdG8gPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2V4dHJhS2V5cyI+YmluZGluZzwvYT4ga2V5cywKICAgIHN1cHBvcnQgZm9yIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9rZXlNYXAiPmN1c3RvbQogICAgYmluZGluZ3M8L2E+LjwvbGk+CiAgICA8bGk+U3VwcG9ydCBmb3Igb3ZlcndyaXRlIChpbnNlcnQpLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3RhYlNpemUiPkN1c3RvbS13aWR0aDwvYT4KICAgIGFuZCA8YSBocmVmPSIuLi9kZW1vL3Zpc2libGV0YWJzLmh0bWwiPnN0eWxhYmxlPC9hPiB0YWJzLjwvbGk+CiAgICA8bGk+TW92ZWQgbW9yZSBjb2RlIGludG8gPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25zIj5hZGQtb24gc2NyaXB0czwvYT4uPC9saT4KICAgIDxsaT5TdXBwb3J0IGZvciBzYW5lIHZlcnRpY2FsIGN1cnNvciBtb3ZlbWVudCBpbiB3cmFwcGVkIGxpbmVzLjwvbGk+CiAgICA8bGk+TW9yZSByZWxpYWJsZSBoYW5kbGluZyBvZgogICAgZWRpdGluZyA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+bWFya2VkIHRleHQ8L2E+LjwvbGk+CiAgICA8bGk+QWRkIG1pbmltYWwgPGEgaHJlZj0iLi4vZGVtby9lbWFjcy5odG1sIj5lbWFjczwvYT4KICAgIGFuZCA8YSBocmVmPSIuLi9kZW1vL3ZpbS5odG1sIj52aW08L2E+IGJpbmRpbmdzLjwvbGk+CiAgICA8bGk+UmVuYW1lIDxjb2RlPmNvb3Jkc0Zyb21JbmRleDwvY29kZT4KICAgIHRvIDxhIGhyZWY9Im1hbnVhbC5odG1sI3Bvc0Zyb21JbmRleCI+PGNvZGU+cG9zRnJvbUluZGV4PC9jb2RlPjwvYT4sCiAgICBhZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjaW5kZXhGcm9tUG9zIj48Y29kZT5pbmRleEZyb21Qb3M8L2NvZGU+PC9hPgogICAgbWV0aG9kLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMTEtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xOC56aXAiPlZlcnNpb24gMi4xODwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+Rml4ZXMgPGNvZGU+VGV4dE1hcmtlci5jbGVhcjwvY29kZT4sIHdoaWNoIGlzIGJyb2tlbiBpbiAyLjE3LjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMTEtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xNy56aXAiPlZlcnNpb24gMi4xNzwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZCBzdXBwb3J0IGZvciA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fbGluZVdyYXBwaW5nIj5saW5lCiAgICB3cmFwcGluZzwvYT4gYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2hpZGVMaW5lIj5jb2RlCiAgICBmb2xkaW5nPC9hPi48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi9tb2RlL2dmbS9pbmRleC5odG1sIj5HaXRodWItc3R5bGUgTWFya2Rvd248L2E+IG1vZGUuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iLi4vdGhlbWUvbW9ub2thaS5jc3MiPk1vbm9rYWk8L2E+CiAgICBhbmQgPGEgaHJlZj0iLi4vdGhlbWUvcnVieWJsdWUuY3NzIj5SdWJ5Ymx1ZTwvYT4gdGhlbWVzLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI3NldEJvb2ttYXJrIj48Y29kZT5zZXRCb29rbWFyazwvY29kZT48L2E+IG1ldGhvZC48L2xpPgogICAgPGxpPk1vdmUgc29tZSBvZiB0aGUgZGVtbyBjb2RlIGludG8gcmV1c2FibGUgY29tcG9uZW50cwogICAgdW5kZXIgPGEgaHJlZj0iLi4vbGliL3V0aWwvIj48Y29kZT5saWIvdXRpbDwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+TWFrZSBzY3JlZW4tY29vcmQtZmluZGluZyBjb2RlIGZhc3RlciBhbmQgbW9yZSByZWxpYWJsZS48L2xpPgogICAgPGxpPkZpeCBkcmFnLWFuZC1kcm9wIGluIEZpcmVmb3guPC9saT4KICAgIDxsaT5JbXByb3ZlIHN1cHBvcnQgZm9yIElNRS48L2xpPgogICAgPGxpPlNwZWVkIHVwIGNvbnRlbnQgcmVuZGVyaW5nLjwvbGk+CiAgICA8bGk+Rml4IGJyb3dzZXIncyBidWlsdC1pbiBzZWFyY2ggaW4gV2Via2l0LjwvbGk+CiAgICA8bGk+TWFrZSBkb3VibGUtIGFuZCB0cmlwbGUtY2xpY2sgd29yayBpbiBJRS48L2xpPgogICAgPGxpPlZhcmlvdXMgZml4ZXMgdG8gbW9kZXMuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yNy0xMC0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjE2LnppcCI+VmVyc2lvbiAyLjE2PC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIDxhIGhyZWY9Ii4uL21vZGUvcGVybC9pbmRleC5odG1sIj5QZXJsPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9ydXN0L2luZGV4Lmh0bWwiPlJ1c3Q8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3RpZGRseXdpa2kvaW5kZXguaHRtbCI+VGlkZGx5V2lraTwvYT4sIGFuZCA8YSBocmVmPSIuLi9tb2RlL2dyb292eS9pbmRleC5odG1sIj5Hcm9vdnk8L2E+IG1vZGVzLjwvbGk+CiAgICA8bGk+RHJhZ2dpbmcgdGV4dCBpbnNpZGUgdGhlIGVkaXRvciBub3cgbW92ZXMsIHJhdGhlciB0aGFuIGNvcGllcy48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Im1hbnVhbC5odG1sI2Nvb3Jkc0Zyb21JbmRleCI+PGNvZGU+Y29vcmRzRnJvbUluZGV4PC9jb2RlPjwvYT4gbWV0aG9kLjwvbGk+CiAgICA8bGk+PHN0cm9uZz5BUEkgY2hhbmdlPC9zdHJvbmc+OiA8Y29kZT5zZXRWYWx1ZTwvY29kZT4gbm93IG5vIGxvbmdlciBjbGVhcnMgaGlzdG9yeS4gVXNlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2NsZWFySGlzdG9yeSI+PGNvZGU+Y2xlYXJIaXN0b3J5PC9jb2RlPjwvYT4gZm9yIHRoYXQuPC9saT4KICAgIDxsaT48c3Ryb25nPkFQSSBjaGFuZ2U8L3N0cm9uZz46IDxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtUZXh0Ij48Y29kZT5tYXJrVGV4dDwvY29kZT48L2E+IG5vdwogICAgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCA8Y29kZT5jbGVhcjwvY29kZT4gYW5kIDxjb2RlPmZpbmQ8L2NvZGU+CiAgICBtZXRob2RzLiBNYXJrZWQgdGV4dCBpcyBub3cgbW9yZSByb2J1c3Qgd2hlbiBlZGl0ZWQuPC9saT4KICAgIDxsaT5GaXggZWRpdGluZyBjb2RlIHdpdGggdGFicyBpbiBJbnRlcm5ldCBFeHBsb3Jlci48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI2LTA5LTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMTUuemlwIj5WZXJzaW9uIDIuMTU8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPkZpeCBidWcgdGhhdCBzbnVjayBpbnRvIDIuMTQ6IENsaWNraW5nIHRoZQogIGNoYXJhY3RlciB0aGF0IGN1cnJlbnRseSBoYXMgdGhlIGN1cnNvciBkaWRuJ3QgcmUtZm9jdXMgdGhlCiAgZWRpdG9yLjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MjYtMDktMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xNC56aXAiPlZlcnNpb24gMi4xNDwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi9tb2RlL2Nsb2p1cmUvaW5kZXguaHRtbCI+Q2xvanVyZTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvcGFzY2FsL2luZGV4Lmh0bWwiPlBhc2NhbDwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvbnRyaXBsZXMvaW5kZXguaHRtbCI+TlRyaXBsZXM8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2ppbmphMi9pbmRleC5odG1sIj5KaW5qYTI8L2E+LCBhbmQgPGEgaHJlZj0iLi4vbW9kZS9tYXJrZG93bi9pbmRleC5odG1sIj5NYXJrZG93bjwvYT4gbW9kZXMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iLi4vdGhlbWUvY29iYWx0LmNzcyI+Q29iYWx0PC9hPiBhbmQgPGEgaHJlZj0iLi4vdGhlbWUvZWNsaXBzZS5jc3MiPkVjbGlwc2U8L2E+IHRoZW1lcy48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9maXhlZEd1dHRlciI+PGNvZGU+Zml4ZWRHdXR0ZXI8L2NvZGU+PC9hPiBvcHRpb24uPC9saT4KICAgIDxsaT5GaXggYnVnIHdpdGggPGNvZGU+c2V0VmFsdWU8L2NvZGU+IGJyZWFraW5nIGN1cnNvciBtb3ZlbWVudC48L2xpPgogICAgPGxpPk1ha2UgZ3V0dGVyIHVwZGF0ZXMgbXVjaCBtb3JlIGVmZmljaWVudC48L2xpPgogICAgPGxpPkFsbG93IGRyYWdnaW5nIG9mIHRleHQgb3V0IG9mIHRoZSBlZGl0b3IgKG9uIG1vZGVybiBicm93c2VycykuPC9saT4KICA8L3VsPgoKCiAgPHAgY2xhc3M9InJlbCI+MjMtMDgtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xMy56aXAiPlZlcnNpb24gMi4xMzwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi9tb2RlL3J1YnkvaW5kZXguaHRtbCI+UnVieTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvci9pbmRleC5odG1sIj5SPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9jb2ZmZWVzY3JpcHQvaW5kZXguaHRtbCI+Q29mZmVlU2NyaXB0PC9hPiwgYW5kIDxhIGhyZWY9Ii4uL21vZGUvdmVsb2NpdHkvaW5kZXguaHRtbCI+VmVsb2NpdHk8L2E+IG1vZGVzLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldEd1dHRlckVsZW1lbnQiPjxjb2RlPmdldEd1dHRlckVsZW1lbnQ8L2NvZGU+PC9hPiB0byBBUEkuPC9saT4KICAgIDxsaT5TZXZlcmFsIGZpeGVzIHRvIHNjcm9sbGluZyBhbmQgcG9zaXRpb25pbmcuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3NtYXJ0SG9tZSI+PGNvZGU+c21hcnRIb21lPC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+QWRkIGFuIGV4cGVyaW1lbnRhbCA8YSBocmVmPSIuLi9tb2RlL3htbHB1cmUvaW5kZXguaHRtbCI+cHVyZSBYTUw8L2E+IG1vZGUuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yNS0wNy0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjEyLnppcCI+VmVyc2lvbiAyLjEyPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iLi4vbW9kZS9zcGFycWwvaW5kZXguaHRtbCI+U1BBUlFMPC9hPiBtb2RlLjwvbGk+CiAgICA8bGk+Rml4IGJ1ZyB3aXRoIGN1cnNvciBqdW1waW5nIGFyb3VuZCBpbiBhbiB1bmZvY3VzZWQgZWRpdG9yIGluIElFLjwvbGk+CiAgICA8bGk+QWxsb3cga2V5IGFuZCBtb3VzZSBldmVudHMgdG8gYnViYmxlIG91dCBvZiB0aGUgZWRpdG9yLiBJZ25vcmUgd2lkZ2V0IGNsaWNrcy48L2xpPgogICAgPGxpPlNvbHZlIGN1cnNvciBmbGFraW5lc3MgYWZ0ZXIgdW5kby9yZWRvLjwvbGk+CiAgICA8bGk+Rml4IGJsb2NrLXJlaW5kZW50IGlnbm9yaW5nIHRoZSBsYXN0IGZldyBsaW5lcy48L2xpPgogICAgPGxpPkZpeCBwYXJzaW5nIG9mIG11bHRpLWxpbmUgYXR0cnMgaW4gWE1MIG1vZGUuPC9saT4KICAgIDxsaT5Vc2UgPGNvZGU+aW5uZXJIVE1MPC9jb2RlPiBmb3IgSFRNTC1lc2NhcGluZy48L2xpPgogICAgPGxpPlNvbWUgZml4ZXMgdG8gaW5kZW50YXRpb24gaW4gQy1saWtlIG1vZGUuPC9saT4KICAgIDxsaT5TaHJpbmsgaG9yaXogc2Nyb2xsYmFycyB3aGVuIGxvbmcgbGluZXMgcmVtb3ZlZC48L2xpPgogICAgPGxpPkZpeCB3aWR0aCBmZWVkYmFjayBsb29wIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgd2lkdGggb2YgYW4gaW5uZXIgRElWIHRvIHNocmluay48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjA0LTA3LTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMTEuemlwIj5WZXJzaW9uIDIuMTE8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGQgYSA8YSBocmVmPSIuLi9tb2RlL3NjaGVtZS9pbmRleC5odG1sIj5TY2hlbWUgbW9kZTwvYT4uPC9saT4KICAgIDxsaT5BZGQgYSA8Y29kZT5yZXBsYWNlPC9jb2RlPiBtZXRob2QgdG8gc2VhcmNoIGN1cnNvcnMsIGZvciBjdXJzb3ItcHJlc2VydmluZyByZXBsYWNlbWVudHMuPC9saT4KICAgIDxsaT5NYWtlIHRoZSA8YSBocmVmPSIuLi9tb2RlL2NsaWtlL2luZGV4Lmh0bWwiPkMtbGlrZSBtb2RlPC9hPiBtb2RlIG1vcmUgY3VzdG9taXphYmxlLjwvbGk+CiAgICA8bGk+VXBkYXRlIFhNTCBtb2RlIHRvIHNwb3QgbWlzbWF0Y2hlZCB0YWdzLjwvbGk+CiAgICA8bGk+QWRkIDxjb2RlPmdldFN0YXRlQWZ0ZXI8L2NvZGU+IEFQSSBhbmQgPGNvZGU+Y29tcGFyZVN0YXRlPC9jb2RlPiBtb2RlIEFQSSBtZXRob2RzIGZvciBmaW5lci1ncmFpbmVkIG1vZGUgbWFnaWMuPC9saT4KICAgIDxsaT5BZGQgYSA8Y29kZT5nZXRTY3JvbGxlckVsZW1lbnQ8L2NvZGU+IEFQSSBtZXRob2QgdG8gbWFuaXB1bGF0ZSB0aGUgc2Nyb2xsaW5nIERJVi48L2xpPgogICAgPGxpPkZpeCBkcmFnLWFuZC1kcm9wIGZvciBGaXJlZm94LjwvbGk+CiAgICA8bGk+QWRkIGEgQyMgY29uZmlndXJhdGlvbiBmb3IgdGhlIDxhIGhyZWY9Ii4uL21vZGUvY2xpa2UvaW5kZXguaHRtbCI+Qy1saWtlIG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Ii4uL2RlbW8vZnVsbHNjcmVlbi5odG1sIj5mdWxsLXNjcmVlbiBlZGl0aW5nPC9hPiBhbmQgPGEgaHJlZj0iLi4vZGVtby9jaGFuZ2Vtb2RlLmh0bWwiPm1vZGUtY2hhbmdpbmc8L2E+IGRlbW9zLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MDctMDYtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xLnppcCI+VmVyc2lvbiAyLjE8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPkFkZAogIGEgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3RoZW1lIj50aGVtZTwvYT4gc3lzdGVtCiAgKDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCI+ZGVtbzwvYT4pLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QKICBiYWNrd2FyZHMtY29tcGF0aWJsZeKAlHlvdSdsbCBoYXZlIHRvIHVwZGF0ZSB5b3VyIHN0eWxlcyBhbmQKICBtb2RlcyE8L3A+CgogIDxwIGNsYXNzPSJyZWwiPjA3LTA2LTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMDIuemlwIj5WZXJzaW9uIDIuMDI8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGQgYSA8YSBocmVmPSIuLi9tb2RlL2x1YS9pbmRleC5odG1sIj5MdWEgbW9kZTwvYT4uPC9saT4KICAgIDxsaT5GaXggcmV2ZXJzZS1zZWFyY2hpbmcgZm9yIGEgcmVnZXhwLjwvbGk+CiAgICA8bGk+RW1wdHkgbGluZXMgY2FuIG5vIGxvbmdlciBicmVhayBoaWdobGlnaHRpbmcuPC9saT4KICAgIDxsaT5SZXdvcmsgc2Nyb2xsaW5nIG1vZGVsICh0aGUgb3V0ZXIgd3JhcHBlciBubyBsb25nZXIgZG9lcyB0aGUgc2Nyb2xsaW5nKS48L2xpPgogICAgPGxpPlNvbHZlIGhvcml6b250YWwgaml0dGVyaW5nIG9uIGxvbmcgbGluZXMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iLi4vZGVtby9ydW5tb2RlLmh0bWwiPnJ1bm1vZGUuanM8L2E+LjwvbGk+CiAgICA8bGk+SW1tZWRpYXRlbHkgcmUtaGlnaGxpZ2h0IHRleHQgd2hlbiB0eXBpbmcuPC9saT4KICAgIDxsaT5GaXggcHJvYmxlbSB3aXRoICdzdGlja2luZycgaG9yaXpvbnRhbCBzY3JvbGxiYXIuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yNi0wNS0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjAxLnppcCI+VmVyc2lvbiAyLjAxPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iLi4vbW9kZS9zbWFsbHRhbGsvaW5kZXguaHRtbCI+U21hbGx0YWxrIG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iLi4vbW9kZS9yc3QvaW5kZXguaHRtbCI+cmVTdHJ1Y3R1cmVkVGV4dCBtb2RlPC9hPi48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Ii4uL21vZGUvcHl0aG9uL2luZGV4Lmh0bWwiPlB5dGhvbiBtb2RlPC9hPi48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Ii4uL21vZGUvcGxzcWwvaW5kZXguaHRtbCI+UEwvU1FMIG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+PGNvZGU+Y29vcmRzQ2hhcjwvY29kZT4gbm93IHdvcmtzPC9saT4KICAgIDxsaT5GaXggYSBwcm9ibGVtIHdoZXJlIDxjb2RlPm9uQ3Vyc29yQWN0aXZpdHk8L2NvZGU+IGludGVyZmVyZWQgd2l0aCA8Y29kZT5vbkNoYW5nZTwvY29kZT4uPC9saT4KICAgIDxsaT5GaXggYSBudW1iZXIgb2Ygc2Nyb2xsaW5nIGFuZCBtb3VzZS1jbGljay1wb3NpdGlvbiBnbGl0Y2hlcy48L2xpPgogICAgPGxpPlBhc3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5nZWQgbGluZXMgdG8gPGNvZGU+b25DaGFuZ2U8L2NvZGU+LjwvbGk+CiAgICA8bGk+U3VwcG9ydCBjbWQtdXAvZG93biBvbiBPUyBYLjwvbGk+CiAgICA8bGk+QWRkIHRyaXBsZS1jbGljayBsaW5lIHNlbGVjdGlvbi48L2xpPgogICAgPGxpPkRvbid0IGhhbmRsZSBzaGlmdCB3aGVuIGNoYW5naW5nIHRoZSBzZWxlY3Rpb24gdGhyb3VnaCB0aGUgQVBJLjwvbGk+CiAgICA8bGk+U3VwcG9ydCA8Y29kZT4ibm9jdXJzb3IiPC9jb2RlPiBtb2RlIGZvciA8Y29kZT5yZWFkT25seTwvY29kZT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+QWRkIGFuIDxjb2RlPm9uSGlnaGxpZ2h0Q29tcGxldGU8L2NvZGU+IG9wdGlvbi48L2xpPgogICAgPGxpPkZpeCB0aGUgY29udGV4dCBtZW51IGZvciBGaXJlZm94LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjgtMDMtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4wLnppcCI+VmVyc2lvbiAyLjA8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPkNvZGVNaXJyb3IgMiBpcyBhIGNvbXBsZXRlIHJld3JpdGUgdGhhdCdzCiAgZmFzdGVyLCBzbWFsbGVyLCBzaW1wbGVyIHRvIHVzZSwgYW5kIGxlc3MgZGVwZW5kZW50IG9uIGJyb3dzZXIKICBxdWlya3MuIFNlZSA8YSBocmVmPSJpbnRlcm5hbHMuaHRtbCI+dGhpczwvYT4KICBhbmQgPGEgaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2NvZGVtaXJyb3IvYnJvd3NlX3RocmVhZC90aHJlYWQvNWE4ZTg5NDAyNGE5ZjU4MCI+dGhpczwvYT4KICBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L2E+CgogIDxwIGNsYXNzPSJyZWwiPjI4LTAzLTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTEuMC56aXAiPlZlcnNpb24gMS4wPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+Rml4IGVycm9yIHdoZW4gZGVidWcgaGlzdG9yeSBvdmVyZmxvd3MuPC9saT4KICAgIDxsaT5SZWZpbmUgaGFuZGxpbmcgb2YgQyMgdmVyYmF0aW0gc3RyaW5ncy48L2xpPgogICAgPGxpPkZpeCBzb21lIGlzc3VlcyB3aXRoIEphdmFTY3JpcHQgaW5kZW50YXRpb24uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMi0wMi0yMDExOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yL3RyZWUvYmV0YTIiPlZlcnNpb24gMi4wIGJldGEgMjwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+U29tZXdoYXQgbW9yZSBtYXR1cmUgQVBJLCBsb3RzIG9mIGJ1Z3Mgc2hha2VuIG91dC48L2E+CgogIDxwIGNsYXNzPSJyZWwiPjE3LTAyLTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuOTQuemlwIj5WZXJzaW9uIDAuOTQ8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT48Y29kZT50YWJNb2RlOiAic3BhY2VzIjwvY29kZT4gd2FzIG1vZGlmaWVkIHNsaWdodGx5IChub3cgaW5kZW50cyB3aGVuIHNvbWV0aGluZyBpcyBzZWxlY3RlZCkuPC9saT4KICAgIDxsaT5GaXhlcyBhIGJ1ZyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBzZWxlY3Rpb24gY29kZSB0byBicmVhayBvbiBzb21lIElFIHZlcnNpb25zLjwvbGk+CiAgICA8bGk+RGlzYWJsaW5nIHNwZWxsLWNoZWNrIG9uIFdlYktpdCBicm93c2VycyBub3cgd29ya3MuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4wOC0wMi0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvIj5WZXJzaW9uIDIuMCBiZXRhIDE8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPkNvZGVNaXJyb3IgMiBpcyBhIGNvbXBsZXRlIHJld3JpdGUgb2YKICBDb2RlTWlycm9yLCBubyBsb25nZXIgZGVwZW5kaW5nIG9uIGFuIGVkaXRhYmxlIGZyYW1lLjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MTktMDEtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC45My56aXAiPlZlcnNpb24gMC45MzwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZGVkIGEgPGEgaHJlZj0iY29udHJpYi9yZWdleC9pbmRleC5odG1sIj5SZWd1bGFyIEV4cHJlc3Npb248L2E+IHBhcnNlci48L2xpPgogICAgPGxpPkZpeGVzIHRvIHRoZSBQSFAgcGFyc2VyLjwvbGk+CiAgICA8bGk+U3VwcG9ydCBmb3IgcmVndWxhciBleHByZXNzaW9uIGluIHNlYXJjaC9yZXBsYWNlLjwvbGk+CiAgICA8bGk+QWRkIDxjb2RlPnNhdmU8L2NvZGU+IG1ldGhvZCB0byBpbnN0YW5jZXMgY3JlYXRlZCB3aXRoIDxjb2RlPmZyb21UZXh0QXJlYTwvY29kZT4uPC9saT4KICAgIDxsaT5BZGQgc3VwcG9ydCBmb3IgTVMgVC1TUUwgaW4gdGhlIFNRTCBwYXJzZXIuPC9saT4KICAgIDxsaT5TdXBwb3J0IHVzZSBvZiBDU1MgY2xhc3NlcyBmb3IgaGlnaGxpZ2h0aW5nIGJyYWNrZXRzLjwvbGk+CiAgICA8bGk+Rml4IHlldCBhbm90aGVyIGhhbmcgd2l0aCBsaW5lLW51bWJlcmluZyBpbiBoaWRkZW4gZWRpdG9ycy48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjE3LTEyLTIwMTA6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuOTIuemlwIj5WZXJzaW9uIDAuOTI8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5NYWtlIENvZGVNaXJyb3Igd29yayBpbiBYSFRNTCBkb2N1bWVudHMuPC9saT4KICAgIDxsaT5GaXggYnVnIGluIGhhbmRsaW5nIG9mIGJhY2tzbGFzaGVzIGluIFB5dGhvbiBzdHJpbmdzLjwvbGk+CiAgICA8bGk+VGhlIDxjb2RlPnN0eWxlTnVtYmVyczwvY29kZT4gb3B0aW9uIGlzIG5vdyBvZmZpY2lhbGx5CiAgICBzdXBwb3J0ZWQgYW5kIGRvY3VtZW50ZWQuPC9saT4KICAgIDxsaT48Y29kZT5vbkxpbmVOdW1iZXJDbGljazwvY29kZT4gb3B0aW9uIGFkZGVkLjwvbGk+CiAgICA8bGk+TW9yZSBjb25zaXN0ZW50IG5hbWVzIDxjb2RlPm9uTG9hZDwvY29kZT4gYW5kCiAgICA8Y29kZT5vbkN1cnNvckFjdGl2aXR5PC9jb2RlPiBjYWxsYmFja3MuIE9sZCBuYW1lcyBzdGlsbCB3b3JrLCBidXQKICAgIGFyZSBkZXByZWNhdGVkLjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iY29udHJpYi9mcmVlbWFya2VyL2luZGV4Lmh0bWwiPkZyZWVtYXJrZXI8L2E+IG1vZGUuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4xMS0xMS0yMDEwOiA8YQogIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuOTEuemlwIj5WZXJzaW9uIDAuOTE8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGRzIHN1cHBvcnQgZm9yIDxhIGhyZWY9ImNvbnRyaWIvamF2YSI+SmF2YTwvYT4uPC9saT4KICAgIDxsaT5TbWFsbCBhZGRpdGlvbnMgdG8gdGhlIDxhIGhyZWY9ImNvbnRyaWIvcGhwIj5QSFA8L2E+IGFuZCA8YSBocmVmPSJjb250cmliL3NxbCI+U1FMPC9hPiBwYXJzZXJzLjwvbGk+CiAgICA8bGk+V29yayBhcm91bmQgdmFyaW91cyA8YSBocmVmPSJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDc4MDYiPldlYmtpdDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzNDc0Ij5pc3N1ZXM8L2E+LjwvbGk+CiAgICA8bGk+Rml4IDxjb2RlPnRvVGV4dEFyZWE8L2NvZGU+IHRvIHVwZGF0ZSB0aGUgY29kZSBpbiB0aGUgdGV4dGFyZWEuPC9saT4KICAgIDxsaT5BZGQgYSA8Y29kZT5ub1NjcmlwdENhY2hpbmc8L2NvZGU+IG9wdGlvbiAoaGFjayB0byBlYXNlIGRldmVsb3BtZW50KS48L2xpPgogICAgPGxpPk1ha2Ugc3ViLW1vZGVzIG9mIDxhIGhyZWY9Im1peGVkdGVzdC5odG1sIj5IVE1MIG1peGVkPC9hPiBtb2RlIGNvbmZpZ3VyYWJsZS48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjAyLTEwLTIwMTA6IDxhCiAgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC45LnppcCI+VmVyc2lvbiAwLjk8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGQgc3VwcG9ydCBmb3Igc2VhcmNoaW5nIGJhY2t3YXJkcy48L2xpPgogICAgPGxpPlRoZXJlIGFyZSBub3cgcGFyc2VycyBmb3IgPGEgaHJlZj0iY29udHJpYi9zY2hlbWUvaW5kZXguaHRtbCI+U2NoZW1lPC9hPiwgPGEgaHJlZj0iY29udHJpYi94cXVlcnkvaW5kZXguaHRtbCI+WFF1ZXJ5PC9hPiwgYW5kIDxhIGhyZWY9ImNvbnRyaWIvb21ldGEvaW5kZXguaHRtbCI+T21ldGFKUzwvYT4uPC9saT4KICAgIDxsaT5NYWtlcyA8Y29kZT5oZWlnaHQ6ICJkeW5hbWljIjwvY29kZT4gbW9yZSByb2J1c3QuPC9saT4KICAgIDxsaT5GaXhlcyBidWcgd2hlcmUgcGFzdGUgZGlkIG5vdCB3b3JrIG9uIE9TIFguPC9saT4KICAgIDxsaT5BZGQgYSA8Y29kZT5lbnRlck1vZGU8L2NvZGU+IGFuZCA8Y29kZT5lbGVjdHJpY0NoYXJzPC9jb2RlPiBvcHRpb25zIHRvIG1ha2UgaW5kZW50YXRpb24gZXZlbiBtb3JlIGN1c3RvbWl6YWJsZS48L2xpPgogICAgPGxpPkFkZCA8Y29kZT5maXJzdExpbmVOdW1iZXI8L2NvZGU+IG9wdGlvbi48L2xpPgogICAgPGxpPkZpeCBiYWQgaGFuZGxpbmcgb2YgPGNvZGU+QG1lZGlhPC9jb2RlPiBydWxlcyBieSB0aGUgQ1NTIHBhcnNlci48L2xpPgogICAgPGxpPlRha2UgYSBuZXcsIG1vcmUgcm9idXN0IGFwcHJvYWNoIHRvIHdvcmtpbmcgYXJvdW5kIHRoZSBpbnZpc2libGUtbGFzdC1saW5lIGJ1ZyBpbiBXZWJLaXQuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMi0wNy0yMDEwOiA8YQogIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuOC56aXAiPlZlcnNpb24gMC44PC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIGEgPGNvZGU+Y3Vyc29yQ29vcmRzPC9jb2RlPiBtZXRob2QgdG8gZmluZCB0aGUgc2NyZWVuCiAgICBjb29yZGluYXRlcyBvZiB0aGUgY3Vyc29yLjwvbGk+CiAgICA8bGk+QSBudW1iZXIgb2YgZml4ZXMgYW5kIHN1cHBvcnQgZm9yIG1vcmUgc3ludGF4IGluIHRoZSBQSFAgcGFyc2VyLjwvbGk+CiAgICA8bGk+Rml4IGluZGVudGF0aW9uIHByb2JsZW0gd2l0aCBKU09OLW1vZGUgSlMgcGFyc2VyIGluIFdlYmtpdC48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9ImNvbXByZXNzLmh0bWwiPm1pbmlmaWNhdGlvbjwvYT4gVUkuPC9saT4KICAgIDxsaT5TdXBwb3J0IGEgPGNvZGU+aGVpZ2h0OiBkeW5hbWljPC9jb2RlPiBtb2RlLCB3aGVyZSB0aGUgZWRpdG9yJ3MKICAgIGhlaWdodCB3aWxsIGFkanVzdCB0byB0aGUgc2l6ZSBvZiBpdHMgY29udGVudC48L2xpPgogICAgPGxpPkJldHRlciBzdXBwb3J0IGZvciBJTUUgaW5wdXQgbW9kZS48L2xpPgogICAgPGxpPkZpeCBKYXZhU2NyaXB0IHBhcnNlciBnZXR0aW5nIGNvbmZ1c2VkIHdoZW4gc2VlaW5nIGEgbm8tYXJndW1lbnQKICAgIGZ1bmN0aW9uIGNhbGwuPC9saT4KICAgIDxsaT5IYXZlIENTUyBwYXJzZXIgc2VlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc2VsZWN0b3JzIGFuZCBvdGhlcgogICAgaWRlbnRpZmllcnMuPC9saT4KICAgIDxsaT5GaXggc2Nyb2xsaW5nIGJ1ZyB3aGVuIHBhc3RpbmcgaW4gYSBob3Jpem9udGFsbHktc2Nyb2xsZWQKICAgIGVkaXRvci48L2xpPgogICAgPGxpPlN1cHBvcnQgPGNvZGU+dG9UZXh0QXJlYTwvY29kZT4gbWV0aG9kIGluIGluc3RhbmNlcyBjcmVhdGVkIHdpdGgKICAgIDxjb2RlPmZyb21UZXh0QXJlYTwvY29kZT4uPC9saT4KICAgIDxsaT5Xb3JrIGFyb3VuZCBuZXcgT3BlcmEgY3Vyc29yIGJ1ZyB0aGF0IGNhdXNlcyB0aGUgY3Vyc29yIHRvIGp1bXAKICAgIHdoZW4gcHJlc3NpbmcgYmFja3NwYWNlIGF0IHRoZSBlbmQgb2YgYSBsaW5lLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjctMDQtMjAxMDogPGEKICBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjY3LnppcCI+VmVyc2lvbgogIDAuNjc8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPk1vcmUgY29uc2lzdGVudCBwYWdlLXVwL3BhZ2UtZG93biBiZWhhdmlvdXIKICBhY3Jvc3MgYnJvd3NlcnMuIEZpeCBzb21lIGlzc3VlcyB3aXRoIGhpZGRlbiBlZGl0b3JzIGxvb3BpbmcgZm9yZXZlcgogIHdoZW4gbGluZS1udW1iZXJzIHdlcmUgZW5hYmxlZC4gTWFrZSBQSFAgcGFyc2VyIHBhcnNlCiAgPGNvZGU+IlxcIjwvY29kZT4gY29ycmVjdGx5LiBIYXZlIDxjb2RlPmp1bXBUb0xpbmU8L2NvZGU+IHdvcmsgb24KICBsaW5lIGhhbmRsZXMsIGFuZCBhZGQgPGNvZGU+Y3Vyc29yTGluZTwvY29kZT4gZnVuY3Rpb24gdG8gZmV0Y2ggdGhlCiAgbGluZSBoYW5kbGUgd2hlcmUgdGhlIGN1cnNvciBjdXJyZW50bHkgaXMuIEFkZCBuZXcKICA8Y29kZT5zZXRTdHlsZXNoZWV0PC9jb2RlPiBmdW5jdGlvbiB0byBzd2l0Y2ggc3R5bGUtc2hlZXRzIGluIGEKICBydW5uaW5nIGVkaXRvci48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjAxLTAzLTIwMTA6IDxhCiAgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC42Ni56aXAiPlZlcnNpb24KICAwLjY2PC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5BZGRzIDxjb2RlPnJlbW92ZUxpbmU8L2NvZGU+IG1ldGhvZCB0byBBUEkuCiAgSW50cm9kdWNlcyB0aGUgPGEgaHJlZj0iY29udHJpYi9wbHNxbC9pbmRleC5odG1sIj5QTFNRTCBwYXJzZXI8L2E+LgogIE1hcmtzIFhNTCBlcnJvcnMgYnkgYWRkaW5nIChyYXRoZXIgdGhhbiByZXBsYWNpbmcpIGEgQ1NTIGNsYXNzLCBzbwogIHRoYXQgdGhleSBjYW4gYmUgZGlzYWJsZWQgYnkgbW9kaWZ5aW5nIHRoZWlyIHN0eWxlLiBGaXhlcyBzZXZlcmFsCiAgc2VsZWN0aW9uIGJ1Z3MsIGFuZCBhIG51bWJlciBvZiBzbWFsbCBnbGl0Y2hlcy48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjEyLTExLTIwMDk6IDxhCiAgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC42NS56aXAiPlZlcnNpb24KICAwLjY1PC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5BZGQgc3VwcG9ydCBmb3IgaGF2aW5nIGJvdGggbGluZS13cmFwcGluZyBhbmQKICBsaW5lLW51bWJlcnMgdHVybmVkIG9uLCBtYWtlIHBhcmVuLWhpZ2hsaWdodGluZyBzdHlsZSBjdXN0b21pc2FibGUKICAoPGNvZGU+bWFya1BhcmVuPC9jb2RlPiBhbmQgPGNvZGU+dW5tYXJrUGFyZW48L2NvZGU+IGNvbmZpZwogIG9wdGlvbnMpLCB3b3JrIGFyb3VuZCBhIHNlbGVjdGlvbiBidWcgdGhhdCBPcGVyYQogIDxlbT5yZTwvZW0+aW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEwLjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MjMtMTAtMjAwOTogPGEKICBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjY0LnppcCI+VmVyc2lvbgogIDAuNjQ8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPlNvbHZlcyBzb21lIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZQogIHBhc3RlLWhhbmRsaW5nIGNoYW5nZXMgZnJvbSB0aGUgcHJldmlvdXMgcmVsZWFzZS4gQWRkcwogIDxjb2RlPnNldFNwZWxsY2hlY2s8L2NvZGU+LCA8Y29kZT5zZXRUZXh0V3JhcHBpbmc8L2NvZGU+LAogIDxjb2RlPnNldEluZGVudFVuaXQ8L2NvZGU+LCA8Y29kZT5zZXRVbmRvRGVwdGg8L2NvZGU+LAogIDxjb2RlPnNldFRhYk1vZGU8L2NvZGU+LCBhbmQgPGNvZGU+c2V0TGluZU51bWJlcnM8L2NvZGU+IHRvCiAgY3VzdG9taXNlIGEgcnVubmluZyBlZGl0b3IuIEludHJvZHVjZXMgYW4gPGEKICBocmVmPSJjb250cmliL3NxbC9pbmRleC5odG1sIj5TUUw8L2E+IHBhcnNlci4gRml4ZXMgYSBmZXcgc21hbGwKICBwcm9ibGVtcyBpbiB0aGUgPGEgaHJlZj0iY29udHJpYi9weXRob24vaW5kZXguaHRtbCI+UHl0aG9uPC9hPgogIHBhcnNlci4gQW5kLCBhcyB1c3VhbCwgYWRkIHdvcmthcm91bmRzIGZvciB2YXJpb3VzIG5ld2x5IGRpc2NvdmVyZWQKICBicm93c2VyIGluY29tcGF0aWJpbGl0aWVzLjwvcD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4zMS0wOC0yMDA5PC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuNjMuemlwIj5WZXJzaW9uCjAuNjM8L2E+OjwvcD4KPHAgY2xhc3M9InJlbC1ub3RlIj4gT3ZlcmhhdWwgb2YgcGFzdGUtaGFuZGxpbmcgKGxlc3MgZnJhZ2lsZSksIGZpeGVzIGZvciBzZXZlcmFsCnNlcmlvdXMgSUU4IGlzc3VlcyAoY3Vyc29yIGp1bXBpbmcsIGVuZC1vZi1kb2N1bWVudCBidWdzKSBhbmQgYSBudW1iZXIKb2Ygc21hbGwgcHJvYmxlbXMuPC9wPgoKPHAgY2xhc3M9InJlbCI+PGVtPjMwLTA1LTIwMDk8L2VtPjogPGEKaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC42Mi56aXAiPlZlcnNpb24KMC42MjwvYT46PC9wPgo8cCBjbGFzcz0icmVsLW5vdGUiPkludHJvZHVjZXMgPGEgaHJlZj0iY29udHJpYi9weXRob24vaW5kZXguaHRtbCI+UHl0aG9uPC9hPgphbmQgPGEgaHJlZj0iY29udHJpYi9sdWEvaW5kZXguaHRtbCI+THVhPC9hPiBwYXJzZXJzLiBBZGQKPGNvZGU+c2V0UGFyc2VyPC9jb2RlPiAob24tdGhlLWZseSBtb2RlIGNoYW5naW5nKSBhbmQKPGNvZGU+Y2xlYXJIaXN0b3J5PC9jb2RlPiBtZXRob2RzLiBNYWtlIHBhcnNpbmcgcGFzc2VzIHRpbWUtYmFzZWQKaW5zdGVhZCBvZiBsaW5lcy1iYXNlZCAoc2VlIHRoZSA8Y29kZT5wYXNzVGltZTwvY29kZT4gb3B0aW9uKS48L3A+Cgo8L2JvZHk+PC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/realworld.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBSZWFsLXdvcmxkIHVzZXM8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2Fuc3xEcm9pZCtTYW5zOmJvbGQiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImRvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5PgoKPGgxPjxzcGFuIGNsYXNzPSJsb2dvLWJyYWNlcyI+eyB9PC9zcGFuPiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvIj5Db2RlTWlycm9yPC9hPjwvaDE+Cgo8ZGl2IGNsYXNzPSJncmV5Ij4KPGltZyBzcmM9ImJhYm9vbi5wbmciIGNsYXNzPSJsb2dvIiBhbHQ9ImxvZ28iLz4KPHByZT4KLyogUmVhbCB3b3JsZCB1c2VzLAogICBmdWxsIGxpc3QgKi8KPC9wcmU+CjwvZGl2PgoKICAgIDxwPjxhIGhyZWY9Im1haWx0bzptYXJpam5oQGdtYWlsLmNvbSI+Q29udGFjdCBtZTwvYT4gaWYgeW91J2QgbGlrZQogICAgeW91ciBwcm9qZWN0IHRvIGJlIGFkZGVkIHRvIHRoaXMgbGlzdC48L3A+CgogICAgPHVsPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2JyYWNrZXRzLmlvIj5BZG9iZSBCcmFja2V0czwvYT4gKGNvZGUgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYmx1ZWdyaWZmb24ub3JnLyI+Qmx1ZUdyaWZmb248L2E+IChIVE1MIGVkaXRvcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NhcmdvY29sbGVjdGl2ZS5jb20vIj5DYXJnbyBDb2xsZWN0aXZlPC9hPiAoY3JlYXRpdmUgcHVibGlzaGluZyBwbGF0Zm9ybSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jb2RlYnVnYXBwLmNvbS8iPkNvZGVidWc8L2E+IChQSFAgWGRlYnVnIGZyb250LWVuZCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NvZGVtaXJyb3IyLWd3dC8iPkNvZGVNaXJyb3IyLUdXVDwvYT4gKEdvb2dsZSBXZWIgVG9vbGtpdCB3cmFwcGVyKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZXBlbi5pbyI+Q29kZXBlbjwvYT4gKGdhbGxlcnkgb2YgYW5pbWF0aW9ucyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGV2Lml0LyI+Q29kZXY8L2E+IChjb2xsYWJvcmF0aXZlIElERSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL290LnN1YnN0YW5jZS5pby9kZW1vLyI+Q29sbGFib3JhdGl2ZSBDb2RlTWlycm9yIGRlbW88L2E+IChDb2RlTWlycm9yICsgb3BlcmF0aW9uYWwgdHJhbnNmb3Jtcyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5ja3duYy5jb20vIj5DS1dOQzwvYT4gKFVNTCBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jc3NkZWNrLmNvbS8iPkNTU0RlY2s8L2E+IChDU1Mgc2hvd2Nhc2UpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9pcmVuZXJvcy5jb20vZGVjay9kZWNrLmpzLWNvZGVtaXJyb3IvaW50cm9kdWN0aW9uLyN0ZXh0YXJlYS1jb2RlIj5EZWNrLmpzIGludGVncmF0aW9uPC9hPiAoc2xpZGVzIHdpdGggZWRpdG9ycyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5kYm5pbmphLmNvbSI+RGJOaW5qYTwvYT4gKE15U1FMIGFjY2VzcyBpbnRlcmZhY2UpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9lbG0tbGFuZy5vcmcvRXhhbXBsZXMuZWxtIj5FbG0gbGFuZ3VhZ2UgZXhhbXBsZXM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9lbG9xdWVudGphdmFzY3JpcHQubmV0L2NoYXB0ZXIxLmh0bWwiPkVsb3F1ZW50IEphdmFTY3JpcHQ8L2E+IChib29rKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmZhc3RmaWcuY29tLyI+RmFzdGZpZzwvYT4gKG9ubGluZSBjb21wdXRhdGlvbi9tYXRoIHRvb2wpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vbWV0YWNwYW4ub3JnL21vZHVsZS9GYXJhYmkiPkZhcmFiaTwvYT4gKFBlcmwgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYmxvZy5wYW1lbGFmb3gub3JnLzIwMTIvMDIvaW50ZXJhY3RpdmUtaHRtbDUtc2xpZGVzLXdpdGgtZmF0aG9tanMuaHRtbCI+RmF0aG9tSlMgaW50ZWdyYXRpb248L2E+IChzbGlkZXMgd2l0aCBlZGl0b3JzLCBhZ2Fpbik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3RvdXIuZ29sYW5nLm9yZyI+R28gbGFuZ3VhZ2UgdG91cjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi9hbmRyb2lkIj5HaXRIdWIncyBBbmRyb2lkIGFwcDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9zY3JpcHQuZ29vZ2xlLmNvbS8iPkdvb2dsZSBBcHBzIFNjcmlwdDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3dlYi51dmljLmNhL35zaWVma2Vuai9ncmFwaGl0L2dyYXBoaXQuaHRtbCI+R3JhcGhpdDwvYT4gKGZ1bmN0aW9uIGdyYXBoaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdHJ5LmhheGUub3JnIj5IYXhlPC9hPiAoSGF4ZSBQbGF5Z3JvdW5kKSA8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2hheHBhZC5jb20vIj5IYXhQYWQ8L2E+IChlZGl0b3IgZm9yIFdpbiBSVCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL21lZ2Fmb253ZWJsYWIuZ2l0aHViLmNvbS9oaXN0b25lLWphdmFzY3JpcHQvIj5IaXN0b25lIHRlbXBsYXRlIGVuZ2luZSBwbGF5Z3JvdW5kPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vaWNlY29kZXIubmV0Ij5JQ0Vjb2RlcjwvYT4gKHdlYiBJREUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9leHRlbnNpb25zLmpvb21sYS5vcmcvZXh0ZW5zaW9ucy9lZGl0aW9uL2VkaXRvcnMvODcyMyI+Sm9vbWxhIHBsdWdpbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2pxZnVuZGFtZW50YWxzLmNvbS8iPmpRdWVyeSBmdW5kYW1lbnRhbHM8L2E+IChpbnRlcmFjdGl2ZSB0dXRvcmlhbCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2pzYmluLmNvbSI+anNiaW4uY29tPC9hPiAoSlMgcGxheWdyb3VuZCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5qc2hpbnQuY29tLyI+SlNIaW50PC9hPiAoSlMgbGludGVyKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vanVtcHNlbGxlci5jb20vIj5KdW1wc2VsbGVyPC9hPiAob25saW5lIHN0b3JlIGJ1aWxkZXIpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9rbDFwLmNvbS9jbXRlc3QvMSI+a2wxcDwvYT4gKHBhc3RlIHNlcnZpY2UpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuY2hyaXMtZ3Jhbmdlci5jb20vMjAxMi8wNC8xMi9saWdodC10YWJsZS0tLWEtbmV3LWlkZS1jb25jZXB0LyI+TGlnaHQgVGFibGU8L2E+IChleHBlcmltZW50YWwgSURFKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm1lcmdlbHkuY29tLyI+TWVyZ2VseTwvYT4gKGludGVyYWN0aXZlIGRpZmZpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vbm90ZXguY2giPk5vVGV4PC9hPiAoclNUIGF1dGhvcmluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NscmhvbWUub3JnL2FzbS8iPk9SRzwvYT4gKHo4MCBhc3NlbWJseSBJREUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYW1hY2Rvbi9vcmlvbi1jb2RlbWlycm9yIj5Pcmlvbi1Db2RlTWlycm9yIGludGVncmF0aW9uPC9hPiAocnVubmluZyBDb2RlTWlycm9yIG1vZGVzIGluIE9yaW9uKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vcGFwZXJqcy5vcmcvIj5QYXBlci5qczwvYT4gKGdyYXBoaWNzIHNjcmlwdGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3Byb3NlLmlvLyI+UHJvc2UuaW88L2E+IChnaXRodWIgY29udGVudCBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9xbC5pby8iPnFsLmlvPC9hPiAoaHR0cCBBUEkgcXVlcnkgaGVscGVyKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vcXlhcHAuY29tIj5RaVl1biB3ZWIgYXBwIHBsYXRmb3JtPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYXJpeWEub2ZpbGFicy5jb20vMjAxMS8wOS9oeWJyaWQtd2VibmF0aXZlLWRlc2t0b3AtY29kZW1pcnJvci5odG1sIj5RdCtXZWJraXQgaW50ZWdyYXRpb248L2E+IChidWlsZGluZyBhIGRlc2t0b3AgQ29kZU1pcnJvciBhcHApPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuc2tldGNocGF0Y2gubmV0L2xhYnMvbGl2ZWNvZGVsYWJJbnRyby5odG1sIj5za2V0Y2hQYXRjaCBMaXZlY29kZWxhYjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5za3VscHQub3JnLyI+U2t1bHB0PC9hPiAoaW4tYnJvd3NlciBQeXRob24gZW52aXJvbm1lbnQpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuc29saWRzaG9wcy5jb20vIj5Tb2xpZFNob3BzPC9hPiAoaG9zdGVkIGUtY29tbWVyY2UgcGxhdGZvcm0pPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zcWxmaWRkbGUuY29tIj5TUUxGaWRkbGU8L2E+IChTUUwgcGxheWdyb3VuZCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aGVmaWxldHJlZS5jb20iPlRoZSBGaWxlIFRyZWU8L2E+IChjb2xsYWIgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZW5qYWxvdC5jb20vdHJpYnV0YXJ5LzI2MzYyOTYvc2lud2F2ZXMuanMiPlRyaWJ1dGFyeTwvYT4gKGF1Z21lbnRlZCBlZGl0aW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdHVyYm9weS5jb20vIj5UdXJib1BZPC9hPiAod2ViIHB1Ymxpc2hpbmcgZnJhbWV3b3JrKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd2ViZ2xwbGF5Z3JvdW5kLm5ldC8iPldlYkdMIHBsYXlncm91bmQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cud2VzY2hlbWUub3JnLyI+V2VTY2hlbWU8L2E+IChsZWFybmluZyB0b29sKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd29yZHByZXNzLm9yZy9leHRlbmQvcGx1Z2lucy9jb2RlbWlycm9yLWZvci1jb2RlZWRpdG9yLyI+V29yZFByZXNzIHBsdWdpbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy54b3N5c3RlbS5vcmcvaG9tZS9hcHBsaWNhdGlvbnNfd2Vic2l0ZXMveG9zeXN0ZW1fd2Vic2l0ZS94b3NpZGVfRU4ucGhwIj5YT1NpZGU8L2E+IChvbmxpbmUgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWVkaWEuY2hpa3V5b25vay5ydS9jb2RlbWlycm9yMi8iPlplbiBDb2Rpbmc8L2E+IChmYXN0IFhNTCBlZGl0aW5nKTwvbGk+CiAgICA8L3VsPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/reporting.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBSZXBvcnRpbmcgQnVnczwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Ecm9pZCtTYW5zfERyb2lkK1NhbnM6Ym9sZCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iZG9jcy5jc3MiLz4KICAgIDxzdHlsZT5saSB7IG1hcmdpbi10b3A6IDFlbTsgfTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgoKPGgxPjxzcGFuIGNsYXNzPSJsb2dvLWJyYWNlcyI+eyB9PC9zcGFuPiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvIj5Db2RlTWlycm9yPC9hPjwvaDE+Cgo8ZGl2IGNsYXNzPSJncmV5Ij4KPGltZyBzcmM9ImJhYm9vbi5wbmciIGNsYXNzPSJsb2dvIiBhbHQ9ImxvZ28iLz4KPHByZT4KLyogUmVwb3J0aW5nIGJ1Z3MKICAgZWZmZWN0aXZlbHkgKi8KPC9wcmU+CjwvZGl2PgoKPGRpdiBjbGFzcz0ibGVmdCI+Cgo8cD5TbyB5b3UgZm91bmQgYSBwcm9ibGVtIGluIENvZGVNaXJyb3IuIEJ5IGFsbCBtZWFucywgcmVwb3J0IGl0ISBCdWcKcmVwb3J0cyBmcm9tIHVzZXJzIGFyZSB0aGUgbWFpbiBkcml2ZSBiZWhpbmQgaW1wcm92ZW1lbnRzIHRvCkNvZGVNaXJyb3IuIEJ1dCBmaXJzdCwgcGxlYXNlIHJlYWQgb3ZlciB0aGVzZSBwb2ludHM6PC9wPgoKPG9sPgogIDxsaT5Db2RlTWlycm9yIGlzIG1haW50YWluZWQgYnkgdm9sdW50ZWVycy4gVGhleSBkb24ndCBvd2UgeW91CiAgYW55dGhpbmcsIHNvIGJlIHBvbGl0ZS4gUmVwb3J0cyB3aXRoIGFuIGluZGlnbmFudCBvciBiZWxsaWdlcmVudAogIHRvbmUgdGVuZCB0byBiZSBtb3ZlZCB0byB0aGUgYm90dG9tIG9mIHRoZSBwaWxlLjwvbGk+CgogIDxsaT5JbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0IDxzdHJvbmc+dGhlIGJyb3dzZXIgaW4gd2hpY2ggdGhlCiAgcHJvYmxlbSBvY2N1cnJlZDwvc3Ryb25nPi4gRXZlbiBpZiB5b3UgdGVzdGVkIHNldmVyYWwgYnJvd3NlcnMsIGFuZAogIHRoZSBwcm9ibGVtIG9jY3VycmVkIGluIGFsbCBvZiB0aGVtLCBtZW50aW9uIHRoaXMgZmFjdCBpbiB0aGUgYnVnCiAgcmVwb3J0LiBBbHNvIGluY2x1ZGUgYnJvd3NlciB2ZXJzaW9uIG51bWJlcnMgYW5kIHRoZSBvcGVyYXRpbmcKICBzeXN0ZW0gdGhhdCB5b3UncmUgb24uPC9saT4KCiAgPGxpPk1lbnRpb24gd2hpY2ggcmVsZWFzZSBvZiBDb2RlTWlycm9yIHlvdSdyZSB1c2luZy4gUHJlZmVyYWJseSwKICB0cnkgYWxzbyB3aXRoIHRoZSBjdXJyZW50IGRldmVsb3BtZW50IHNuYXBzaG90LCB0byBlbnN1cmUgdGhlCiAgcHJvYmxlbSBoYXMgbm90IGFscmVhZHkgYmVlbiBmaXhlZC48L2xpPgoKICA8bGk+TWVudGlvbiB2ZXJ5IHByZWNpc2VseSB3aGF0IHdlbnQgd3JvbmcuICJYIGlzIGJyb2tlbiIgaXMgbm90IGEKICBnb29kIGJ1ZyByZXBvcnQuIFdoYXQgZGlkIHlvdSBleHBlY3QgdG8gaGFwcGVuPyBXaGF0IGhhcHBlbmVkCiAgaW5zdGVhZD8gRGVzY3JpYmUgdGhlIGV4YWN0IHN0ZXBzIGEgbWFpbnRhaW5lciBoYXMgdG8gdGFrZSB0byBtYWtlCiAgdGhlIHByb2JsZW0gb2NjdXIuIFdlIGNhbiBub3QgZml4IHNvbWV0aGluZyB0aGF0IHdlIGNhbiBub3QKICBvYnNlcnZlLjwvbGk+CgogIDxsaT5JZiB0aGUgcHJvYmxlbSBjYW4gbm90IGJlIHJlcHJvZHVjZWQgaW4gYW55IG9mIHRoZSBkZW1vcwogIGluY2x1ZGVkIGluIHRoZSBDb2RlTWlycm9yIGRpc3RyaWJ1dGlvbiwgcGxlYXNlIHByb3ZpZGUgYW4gSFRNTAogIGRvY3VtZW50IHRoYXQgZGVtb25zdHJhdGVzIHRoZSBwcm9ibGVtLiBUaGUgYmVzdCB3YXkgdG8gZG8gdGhpcyBpcwogIHRvIGdvIHRvIDxhIGhyZWY9Imh0dHA6Ly9qc2Jpbi5jb20vaWh1bmluL2VkaXQiPmpzYmluLmNvbTwvYT4sIGVudGVyCiAgaXQgdGhlcmUsIHByZXNzIHNhdmUsIGFuZCBpbmNsdWRlIHRoZSByZXN1bHRpbmcgbGluayBpbiB5b3VyIGJ1ZwogIHJlcG9ydC48L2xpPgo8L29sPgoKPC9kaXY+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/upgrade_v2.2.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBVcGdyYWRpbmcgdG8gdjIuMjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Ecm9pZCtTYW5zfERyb2lkK1NhbnM6Ym9sZCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iZG9jcy5jc3MiLz4KICA8L2hlYWQ+CiAgPGJvZHk+Cgo8aDE+PHNwYW4gY2xhc3M9ImxvZ28tYnJhY2VzIj57IH08L3NwYW4+IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC8iPkNvZGVNaXJyb3I8L2E+PC9oMT4KCjxkaXYgY2xhc3M9ImdyZXkiPgo8aW1nIHNyYz0iYmFib29uLnBuZyIgY2xhc3M9ImxvZ28iIGFsdD0ibG9nbyIvPgo8cHJlPgovKiBVcGdyYWRpbmcgdG8KICAgdjIuMiAqLwo8L3ByZT4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJsZWZ0Ij4KCjxwPlRoZXJlIGFyZSBhIGZldyB0aGluZ3MgaW4gdGhlIDIuMiByZWxlYXNlIHRoYXQgcmVxdWlyZSBzb21lIGNhcmUKd2hlbiB1cGdyYWRpbmcuPC9wPgoKPGgyPk5vIG1vcmUgZGVmYXVsdC5jc3M8L2gyPgoKPHA+VGhlIGRlZmF1bHQgdGhlbWUgaXMgbm93IGluY2x1ZGVkCmluIDxhIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+PGNvZGU+Y29kZW1pcnJvci5jc3M8L2NvZGU+PC9hPiwgc28KeW91IGRvIG5vdCBoYXZlIHRvIGluY2x1ZGVkIGl0IHNlcGFyYXRlbHkgYW55bW9yZS4gKEl0IHdhcyB0aW55LCBzbwpldmVuIGlmIHlvdSdyZSBub3QgdXNpbmcgaXQsIHRoZSBleHRyYSBkYXRhIG92ZXJoZWFkIGlzIG5lZ2xpZ2libGUuKQoKPGgyPkRpZmZlcmVudCBrZXkgY3VzdG9taXphdGlvbjwvaDI+Cgo8cD5Db2RlTWlycm9yIGhhcyBtb3ZlZCB0byBhIHN5c3RlbQp3aGVyZSA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fa2V5TWFwIj5rZXltYXBzPC9hPiBhcmUgdXNlZCB0bwpiaW5kIGJlaGF2aW9yIHRvIGtleXMuIFRoaXMgbWVhbnMgPGEgaHJlZj0iLi4vZGVtby9lbWFjcy5odG1sIj5jdXN0b20KYmluZGluZ3M8L2E+IGFyZSBub3cgcG9zc2libGUuPC9wPgoKPHA+VGhyZWUgb3B0aW9ucyB0aGF0IGluZmx1ZW5jZWQga2V5CmJlaGF2aW9yLCA8Y29kZT50YWJNb2RlPC9jb2RlPiwgPGNvZGU+ZW50ZXJNb2RlPC9jb2RlPiwKYW5kIDxjb2RlPnNtYXJ0SG9tZTwvY29kZT4sIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLiBJbnN0ZWFkLCB5b3UgY2FuCnByb3ZpZGUgY3VzdG9tIGJpbmRpbmdzIHRvIGluZmx1ZW5jZSB0aGUgd2F5IHRoZXNlIGtleXMgYWN0LiBUaGlzIGlzCmRvbmUgdGhyb3VnaCB0aGUKbmV3IDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9leHRyYUtleXMiPjxjb2RlPmV4dHJhS2V5czwvY29kZT48L2E+Cm9wdGlvbiwgd2hpY2ggY2FuIGhvbGQgYW4gb2JqZWN0IG1hcHBpbmcga2V5IG5hbWVzIHRvIGZ1bmN0aW9uYWxpdHkuIEEKc2ltcGxlIGV4YW1wbGUgd291bGQgYmU6PC9wPgoKPHByZT4gIGV4dHJhS2V5czogewogICAgIkN0cmwtUyI6IGZ1bmN0aW9uKGluc3RhbmNlKSB7IHNhdmVUZXh0KGluc3RhbmNlLmdldFZhbHVlKCkpOyB9LAogICAgIkN0cmwtLyI6ICJ1bmRvIgogIH08L3ByZT4KCjxwPktleXMgY2FuIGJlIG1hcHBlZCBlaXRoZXIgdG8gZnVuY3Rpb25zLCB3aGljaCB3aWxsIGJlIGdpdmVuIHRoZQplZGl0b3IgaW5zdGFuY2UgYXMgYXJndW1lbnQsIG9yIHRvIHN0cmluZ3MsIHdoaWNoIGFyZSBtYXBwZWQgdGhyb3VnaApmdW5jdGlvbnMgdGhyb3VnaCB0aGUgPGNvZGU+Q29kZU1pcnJvci5jb21tYW5kczwvY29kZT4gdGFibGUsIHdoaWNoCmNvbnRhaW5zIGFsbCB0aGUgYnVpbHQtaW4gZWRpdGluZyBjb21tYW5kcywgYW5kIGNhbiBiZSBpbnNwZWN0ZWQgYW5kCmV4dGVuZGVkIGJ5IGV4dGVybmFsIGNvZGUuPC9wPgoKPHA+QnkgZGVmYXVsdCwgdGhlIDxjb2RlPkhvbWU8L2NvZGU+IGtleSBpcyBib3VuZCB0bwp0aGUgPGNvZGU+ImdvTGluZVN0YXJ0U21hcnQiPC9jb2RlPiBjb21tYW5kLCB3aGljaCBtb3ZlcyB0aGUgY3Vyc29yIHRvCnRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb24gdGhlIGxpbmUuIFlvdSBjYW4gc2V0IGRvIHRoaXMgdG8KbWFrZSBpdCBhbHdheXMgZ28gdG8gdGhlIHZlcnkgc3RhcnQgaW5zdGVhZDo8L3A+Cgo8cHJlPiAgZXh0cmFLZXlzOiB7IkhvbWUiOiAiZ29MaW5lU3RhcnQifTwvcHJlPgoKPHA+U2ltaWxhcmx5LCA8Y29kZT5FbnRlcjwvY29kZT4gaXMgYm91bmQKdG8gPGNvZGU+Im5ld2xpbmVBbmRJbmRlbnQiPC9jb2RlPiBieSBkZWZhdWx0LiBZb3UgY2FuIGJpbmQgaXQgdG8Kc29tZXRoaW5nIGVsc2UgdG8gZ2V0IGRpZmZlcmVudCBiZWhhdmlvci4gVG8gZGlzYWJsZSBzcGVjaWFsIGhhbmRsaW5nCmNvbXBsZXRlbHkgYW5kIG9ubHkgZ2V0IGEgbmV3bGluZSBjaGFyYWN0ZXIgaW5zZXJ0ZWQsIHlvdSBjYW4gYmluZCBpdAp0byA8Y29kZT5mYWxzZTwvY29kZT46PC9wPgoKPHByZT4gIGV4dHJhS2V5czogeyJFbnRlciI6IGZhbHNlfTwvcHJlPgoKPHA+VGhlIHNhbWUgd29ya3MgZm9yIDxjb2RlPlRhYjwvY29kZT4uIElmIHlvdSBkb24ndCB3YW50IENvZGVNaXJyb3IKdG8gaGFuZGxlIGl0LCBiaW5kIGl0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzCnRvIGluZGVudCB0aGUgY3VycmVudCBsaW5lIG1vcmUgKDxjb2RlPiJpbmRlbnRNb3JlIjwvY29kZT4gY29tbWFuZCksCmFuZCBpbmRlbnQgaXQgbGVzcyB3aGVuIHNoaWZ0IGlzIGhlbGQgKDxjb2RlPiJpbmRlbnRMZXNzIjwvY29kZT4pLgpUaGVyZSBhcmUgYWxzbyA8Y29kZT4iaW5kZW50QXV0byI8L2NvZGU+IChzbWFydCBpbmRlbnQpCmFuZCA8Y29kZT4iaW5zZXJ0VGFiIjwvY29kZT4gY29tbWFuZHMgcHJvdmlkZWQgZm9yIGFsdGVybmF0ZQpiZWhhdmlvcnMuIE9yIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gaGFuZGxlciBmdW5jdGlvbiB0byBkbyBzb21ldGhpbmcKZGlmZmVyZW50IGFsdG9nZXRoZXIuPC9wPgoKPGgyPlRhYnM8L2gyPgoKPHA+SGFuZGxpbmcgb2YgdGFicyBjaGFuZ2VkIGNvbXBsZXRlbHkuIFRoZSBkaXNwbGF5IHdpZHRoIG9mIHRhYnMgY2FuCm5vdyBiZSBzZXQgd2l0aCB0aGUgPGNvZGU+dGFiU2l6ZTwvY29kZT4gb3B0aW9uLCBhbmQgdGFicyBjYW4KYmUgPGEgaHJlZj0iLi4vZGVtby92aXNpYmxldGFicy5odG1sIj5zdHlsZWQ8L2E+IGJ5IHNldHRpbmcgQ1NTIHJ1bGVzCmZvciB0aGUgPGNvZGU+Y20tdGFiPC9jb2RlPiBjbGFzcy48L3A+Cgo8cD5UaGUgZGVmYXVsdCB3aWR0aCBmb3IgdGFicyBpcyBub3cgNCwgYXMgb3Bwb3NlZCB0byB0aGUgOCB0aGF0IGlzCmhhcmQtd2lyZWQgaW50byBicm93c2Vycy4gSWYgeW91IGFyZSByZWx5aW5nIG9uIDgtc3BhY2UgdGFicywgbWFrZQpzdXJlIHlvdSBleHBsaWNpdGx5IHNldCA8Y29kZT50YWJTaXplOiA4PC9jb2RlPiBpbiB5b3VyIG9wdGlvbnMuPC9wPgoKPC9kaXY+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/doc/upgrade_v3.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBVcGdyYWRpbmcgdG8gdjM8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2Fuc3xEcm9pZCtTYW5zOmJvbGQiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImRvY3MuY3NzIi8+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi91dGlsL3J1bm1vZGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL2xpYi91dGlsL2NvbG9yaXplLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2Nzcy9jc3MuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+CiAgPC9oZWFkPgogIDxib2R5PgoKPGgxPjxzcGFuIGNsYXNzPSJsb2dvLWJyYWNlcyI+eyB9PC9zcGFuPiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvIj5Db2RlTWlycm9yPC9hPjwvaDE+Cgo8ZGl2IGNsYXNzPSJncmV5Ij4KPGltZyBzcmM9ImJhYm9vbi5wbmciIGNsYXNzPSJsb2dvIiBhbHQ9ImxvZ28iLz4KPHByZT4KLyogVXBncmFkaW5nIHRvCiAgIHZlcnNpb24gMyAqLwo8L3ByZT4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJjbGVhciI+PGRpdiBjbGFzcz0ibGVmdGJpZyBibGsiPgoKPHA+VmVyc2lvbiAzIGRvZXMgbm90IGRlcGFydCB0b28gbXVjaCBmcm9tIDIueCBBUEksIGFuZCBzaXRlcyB0aGF0IHVzZQpDb2RlTWlycm9yIGluIGEgdmVyeSBzaW1wbGUgd2F5IG1pZ2h0IGJlIGFibGUgdG8gdXBncmFkZSB3aXRob3V0CnRyb3VibGUuIEJ1dCBpdCBkb2VzIGludHJvZHVjZSBhIG51bWJlciBvZiBpbmNvbXBhdGliaWxpdGllcy4gUGxlYXNlCmF0IGxlYXN0IHNraW0gdGhpcyB0ZXh0IGJlZm9yZSB1cGdyYWRpbmcuPC9wPgoKPHA+Tm90ZSB0aGF0IDxzdHJvbmc+dmVyc2lvbiAzIGRyb3BzIGZ1bGwgc3VwcG9ydCBmb3IgSW50ZXJuZXQKRXhwbG9yZXIgNzwvc3Ryb25nPi4gVGhlIGVkaXRvciB3aWxsIG1vc3RseSB3b3JrIG9uIHRoYXQgYnJvd3NlciwgYnV0Cml0J2xsIGJlIHNpZ25pZmljYW50bHkgZ2xpdGNoeS48L3A+Cgo8aDIgaWQ9ZG9tPkRPTSBzdHJ1Y3R1cmU8L2gyPgoKPHA+VGhpcyBvbmUgaXMgdGhlIG1vc3QgbGlrZWx5IHRvIGNhdXNlIHByb2JsZW1zLiBUaGUgaW50ZXJuYWwKc3RydWN0dXJlIG9mIHRoZSBlZGl0b3IgaGFzIGNoYW5nZWQgcXVpdGUgYSBsb3QsIG1vc3RseSB0byBpbXBsZW1lbnQgYQpuZXcgc2Nyb2xsaW5nIG1vZGVsLjwvcD4KCjxwPkVkaXRvciBoZWlnaHQgaXMgbm93IHNldCBvbiB0aGUgb3V0ZXIgd3JhcHBlciBlbGVtZW50IChDU1MKY2xhc3MgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4pLCBub3Qgb24gdGhlIHNjcm9sbGVyIGVsZW1lbnQKKDxjb2RlPkNvZGVNaXJyb3Itc2Nyb2xsPC9jb2RlPikuPC9wPgoKPHA+T3RoZXIgbm9kZXMgd2VyZSBtb3ZlZCwgZHJvcHBlZCwgYW5kIGFkZGVkLiBJZiB5b3UgaGF2ZSBhbnkgY29kZQp0aGF0IG1ha2VzIGFzc3VtcHRpb25zIGFib3V0IHRoZSBpbnRlcm5hbCBET00gc3RydWN0dXJlIG9mIHRoZSBlZGl0b3IsCnlvdSdsbCBoYXZlIHRvIHJlLXRlc3QgaXQgYW5kIHByb2JhYmx5IHVwZGF0ZSBpdCB0byB3b3JrIHdpdGggdjMuPC9wPgoKPHA+U2VlIHRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNzdHlsaW5nIj5zdHlsaW5nIHNlY3Rpb248L2E+IG9mIHRoZQptYW51YWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgoKPGgyIGlkPWd1dHRlcnM+R3V0dGVyIG1vZGVsPC9oMj4KCjxwPkluIENvZGVNaXJyb3IgMi54LCB0aGVyZSB3YXMgYSBzaW5nbGUgZ3V0dGVyLCBhbmQgbGluZSBtYXJrZXJzCmNyZWF0ZWQgd2l0aCA8Y29kZT5zZXRNYXJrZXI8L2NvZGU+IHdvdWxkIGhhdmUgdG8gc29tZWhvdyBjb2V4aXN0IHdpdGgKdGhlIGxpbmUgbnVtYmVycyAoaWYgcHJlc2VudCkuIFZlcnNpb24gMyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYW4KYXJyYXkgb2YgZ3V0dGVycywgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2d1dHRlcnMiPmJ5IGNsYXNzCm5hbWU8L2E+LAp1c2UgPGEgaHJlZj0ibWFudWFsLmh0bWwjc2V0R3V0dGVyTWFya2VyIj48Y29kZT5zZXRHdXR0ZXJNYXJrZXI8L2NvZGU+PC9hPgp0byBhZGQgb3IgcmVtb3ZlIG1hcmtlcnMgaW4gaW5kaXZpZHVhbCBndXR0ZXJzLCBhbmQgY2xlYXIgd2hvbGUKZ3V0dGVycwp3aXRoIDxhIGhyZWY9Im1hbnVhbC5odG1sI2NsZWFyR3V0dGVyIj48Y29kZT5jbGVhckd1dHRlcjwvY29kZT48L2E+LgpHdXR0ZXIgbWFya2VycyBhcmUgbm93IHNwZWNpZmllZCBhcyBET00gbm9kZXMsIHJhdGhlciB0aGFuIEhUTUwKc25pcHBldHMuPC9wPgoKPHA+VGhlIGd1dHRlcnMgbm8gbG9uZ2VyIGhvcml6b250YWxseSBzY3JvbGxzIGFsb25nIHdpdGggdGhlIGNvbnRlbnQuClRoZSA8Y29kZT5maXhlZEd1dHRlcjwvY29kZT4gb3B0aW9uIHdhcyByZW1vdmVkIChzaW5jZSBpdCBpcyBub3cgdGhlCm9ubHkgYmVoYXZpb3IpLjwvcD4KCjxwcmUgZGF0YS1sYW5nPSJ0ZXh0L2h0bWwiPgombHQ7c3R5bGU+CiAgLyogRGVmaW5lIGEgZ3V0dGVyIHN0eWxlICovCiAgLm5vdGUtZ3V0dGVyIHsgd2lkdGg6IDNlbTsgYmFja2dyb3VuZDogY3lhbjsgfQombHQ7L3N0eWxlPgombHQ7c2NyaXB0PgogIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSB3aXRoIHR3byBndXR0ZXJzIC0tIGxpbmUgbnVtYmVycyBhbmQgbm90ZXMKICB2YXIgY20gPSBuZXcgQ29kZU1pcnJvcihkb2N1bWVudC5ib2R5LCB7CiAgICBndXR0ZXJzOiBbIm5vdGUtZ3V0dGVyIiwgIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiXSwKICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgfSk7CiAgLy8gQWRkIGEgbm90ZSB0byBsaW5lIDAKICBjbS5zZXRHdXR0ZXJNYXJrZXIoMCwgIm5vdGUtZ3V0dGVyIiwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoImhpIikpOwombHQ7L3NjcmlwdD4KPC9wcmU+Cgo8aDIgaWQ9ZXZlbnRzPkV2ZW50IGhhbmRsaW5nPC9oMj4KCjxwPk1vc3Qgb2YgdGhlIDxjb2RlPm9uWFlaPC9jb2RlPiBvcHRpb25zIGhhdmUgYmVlbiByZW1vdmVkLiBUaGUgc2FtZQplZmZlY3QgaXMgbm93IG9idGFpbmVkIGJ5IGNhbGxpbmcKdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI29uIj48Y29kZT5vbjwvY29kZT48L2E+IG1ldGhvZCB3aXRoIGEgc3RyaW5nCmlkZW50aWZ5aW5nIHRoZSBldmVudCB0eXBlLiBNdWx0aXBsZSBoYW5kbGVycyBjYW4gbm93IGJlIHJlZ2lzdGVyZWQKKGFuZCBpbmRpdmlkdWFsbHkgdW5yZWdpc3RlcmVkKSBmb3IgYW4gZXZlbnQsIGFuZCBvYmplY3RzIHN1Y2ggYXMgbGluZQpoYW5kbGVycyBub3cgYWxzbyBleHBvc2UgZXZlbnRzLiBTZWUgPGEgaHJlZj0ibWFudWFsLmh0bWwjZXZlbnRzIj50aGUKZnVsbCBsaXN0IGhlcmU8L2E+LjwvcD4KCjxwPihUaGUgPGNvZGU+b25LZXlFdmVudDwvY29kZT4gYW5kIDxjb2RlPm9uRHJhZ0V2ZW50PC9jb2RlPiBvcHRpb25zLAp3aGljaCBhY3QgbW9yZSBhcyBob29rcyB0aGFuIGFzIGV2ZW50IGhhbmRsZXJzLCBhcmUgc3RpbGwgdGhlcmUgaW4KdGhlaXIgb2xkIGZvcm0uKTwvcD4KCjxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij4KY20ub24oImNoYW5nZSIsIGZ1bmN0aW9uKGNtLCBjaGFuZ2UpIHsKICBjb25zb2xlLmxvZygic29tZXRoaW5nIGNoYW5nZWQhICgiICsgY2hhbmdlLm9yaWdpbiArICIpIik7Cn0pOwo8L3ByZT4KCjxoMiBpZD1tYXJrdGV4dD5tYXJrVGV4dCBtZXRob2QgYXJndW1lbnRzPC9oMj4KCjxwPlRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+PGNvZGU+bWFya1RleHQ8L2NvZGU+PC9hPiBtZXRob2QKKHdoaWNoIGhhcyBnYWluZWQgc29tZSBpbnRlcmVzdGluZyBuZXcgZmVhdHVyZXMsIHN1Y2ggYXMgY3JlYXRpbmcKYXRvbWljIGFuZCByZWFkLW9ubHkgc3BhbnMsIG9yIHJlcGxhY2luZyBzcGFucyB3aXRoIHdpZGdldHMpIG5vIGxvbmdlcgp0YWtlcyB0aGUgQ1NTIGNsYXNzIG5hbWUgYXMgYSBzZXBhcmF0ZSBhcmd1bWVudCwgYnV0IG1ha2VzIGl0IGFuCm9wdGlvbmFsIGZpZWxkIGluIHRoZSBvcHRpb25zIG9iamVjdCBpbnN0ZWFkLjwvcD4KCjxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij4KLy8gU3R5bGUgZmlyc3QgdGVuIGxpbmVzLCBhbmQgZm9yYmlkIHRoZSBjdXJzb3IgZnJvbSBlbnRlcmluZyB0aGVtCmNtLm1hcmtUZXh0KHtsaW5lOiAwLCBjaDogMH0sIHtsaW5lOiAxMCwgY2g6IDB9LCB7CiAgY2xhc3NOYW1lOiAibWFnaWMtdGV4dCIsCiAgaW5jbHVzaXZlTGVmdDogdHJ1ZSwKICBhdG9taWM6IHRydWUKfSk7CjwvcHJlPgoKPGgyIGlkPWZvbGRpbmc+TGluZSBmb2xkaW5nPC9oMj4KCjxwPlRoZSBpbnRlcmZhY2UgZm9yIGhpZGluZyBsaW5lcyBoYXMgYmVlbgpyZW1vdmVkLiA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+PGNvZGU+bWFya1RleHQ8L2NvZGU+PC9hPiBjYW4Kbm93IGJlIHVzZWQgdG8gZG8gdGhlIHNhbWUgaW4gYSBtb3JlIGZsZXhpYmxlIGFuZCBwb3dlcmZ1bCB3YXkuPC9wPgoKPHA+VGhlIDxhIGhyZWY9Ii4uL2RlbW8vZm9sZGluZy5odG1sIj5mb2xkaW5nIHNjcmlwdDwvYT4gaGFzIGJlZW4KdXBkYXRlZCB0byB1c2UgdGhlIG5ldyBpbnRlcmZhY2UsIGFuZCBzaG91bGQgbm93IGJlIG1vcmUgcm9idXN0LjwvcD4KCjxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij4KLy8gRm9sZCBhIHJhbmdlLCByZXBsYWNpbmcgaXQgd2l0aCB0aGUgdGV4dCAiPz8iCnZhciByYW5nZSA9IGNtLm1hcmtUZXh0KHtsaW5lOiA0LCBjaDogMn0sIHtsaW5lOiA4LCBjaDogMX0sIHsKICByZXBsYWNlZFdpdGg6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI/PyIpLAogIC8vIEF1dG8tdW5mb2xkIHdoZW4gY3Vyc29yIG1vdmVzIGludG8gdGhlIHJhbmdlCiAgY2xlYXJPbkVudGVyOiB0cnVlCn0pOwovLyBHZXQgbm90aWZpZWQgd2hlbiBhdXRvLXVuZm9sZGluZwpDb2RlTWlycm9yLm9uKHJhbmdlLCAiY2xlYXIiLCBmdW5jdGlvbigpIHsKICBjb25zb2xlLmxvZygiYm9vbSIpOwp9KTsKPC9wcmU+Cgo8aDIgaWQ9bGluZWNsYXNzPkxpbmUgQ1NTIGNsYXNzZXM8L2gyPgoKPHA+VGhlIDxjb2RlPnNldExpbmVDbGFzczwvY29kZT4gbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkCmJ5IDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZExpbmVDbGFzcyI+PGNvZGU+YWRkTGluZUNsYXNzPC9jb2RlPjwvYT4KYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI3JlbW92ZUxpbmVDbGFzcyI+PGNvZGU+cmVtb3ZlTGluZUNsYXNzPC9jb2RlPjwvYT4sCndoaWNoIGFsbG93IG1vcmUgbW9kdWxhciBjb250cm9sIG92ZXIgdGhlIGNsYXNzZXMgYXR0YWNoZWQgdG8gYSBsaW5lLjwvcD4KCjxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij4KdmFyIG1hcmtlZCA9IGNtLmFkZExpbmVDbGFzcygxMCwgImJhY2tncm91bmQiLCAiaGlnaGxpZ2h0ZWQtbGluZSIpOwpzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogIGNtLnJlbW92ZUxpbmVDbGFzcyhtYXJrZWQsICJiYWNrZ3JvdW5kIiwgImhpZ2hsaWdodGVkLWxpbmUiKTsKfSk7CjwvcHJlPgoKPGgyIGlkPXBvc2l0aW9ucz5Qb3NpdGlvbiBwcm9wZXJ0aWVzPC9oMj4KCjxwPkFsbCBtZXRob2RzIHRoYXQgdGFrZSBvciByZXR1cm4gb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBzY3JlZW4KcG9zaXRpb25zIG5vdyB1c2UgPGNvZGU+e2xlZnQsIHRvcCwgYm90dG9tLCByaWdodH08L2NvZGU+IHByb3BlcnRpZXMKKG5vdCBhbHdheXMgYWxsIG9mIHRoZW0pIGluc3RlYWQgb2YgdGhlIDxjb2RlPnt4LCB5LCB5Qm90fTwvY29kZT4gdXNlZApieSBzb21lIG1ldGhvZHMgaW4gdjIueC48L3A+Cgo8cD5BZmZlY3RlZCBtZXRob2RzCmFyZSA8YSBocmVmPSJtYW51YWwuaHRtbCNjdXJzb3JDb29yZHMiPjxjb2RlPmN1cnNvckNvb3JkczwvY29kZT48L2E+LCA8YSBocmVmPSJtYW51YWwuaHRtbCNjaGFyQ29vcmRzIj48Y29kZT5jaGFyQ29vcmRzPC9jb2RlPjwvYT4sIDxhIGhyZWY9Im1hbnVhbC5odG1sI2Nvb3Jkc0NoYXIiPjxjb2RlPmNvb3Jkc0NoYXI8L2NvZGU+PC9hPiwKYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldFNjcm9sbEluZm8iPjxjb2RlPmdldFNjcm9sbEluZm88L2NvZGU+PC9hPi48L3A+Cgo8aDIgaWQ9bWF0Y2hicmFja2V0cz5CcmFja2V0IG1hdGNoaW5nIG5vIGxvbmdlciBpbiBjb3JlPC9oMj4KCjxwPlRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCN1dGlsX21hdGNoYnJhY2tldHMiPjxjb2RlPm1hdGNoQnJhY2tldHM8L2NvZGU+PC9hPgpvcHRpb24gaXMgbm8gbG9uZ2VyIGRlZmluZWQgaW4gdGhlIGNvcmUgZWRpdG9yLgpMb2FkIDxjb2RlPmxpYi91dGlsL21hdGNoYnJhY2tldHMuanM8L2NvZGU+IHRvIGVuYWJsZSBpdC48L3A+Cgo8aDIgaWQ9bW9kZXM+TW9kZSBtYW5hZ2VtZW50PC9oMj4KCjxwPlRoZSA8Y29kZT5Db2RlTWlycm9yLmxpc3RNb2RlczwvY29kZT4KYW5kIDxjb2RlPkNvZGVNaXJyb3IubGlzdE1JTUVzPC9jb2RlPiBmdW5jdGlvbnMsIHVzZWQgZm9yIGxpc3RpbmcKZGVmaW5lZCBtb2RlcywgYXJlIGdvbmUuIFlvdSBhcmUgbm93IGVuY291cmFnZWQgdG8gc2ltcGx5Cmluc3BlY3QgPGNvZGU+Q29kZU1pcnJvci5tb2RlczwvY29kZT4gKG1hcHBpbmcgbW9kZSBuYW1lcyB0byBtb2RlCmNvbnN0cnVjdG9ycykgYW5kIDxjb2RlPkNvZGVNaXJyb3IubWltZU1vZGVzPC9jb2RlPiAobWFwcGluZyBNSU1FCnN0cmluZ3MgdG8gbW9kZSBzcGVjcykuPC9wPgoKPGgyIGlkPW5ldz5OZXcgZmVhdHVyZXM8L2gyPgoKPHA+U29tZSBtb3JlIHJlYXNvbnMgdG8gdXBncmFkZSB0byB2ZXJzaW9uIDMuPC9wPgoKPHVsPgogIDxsaT5CaS1kaXJlY3Rpb25hbCB0ZXh0IHN1cHBvcnQuIENvZGVNaXJyb3Igd2lsbCBub3cgbW9zdGx5IGRvIHRoZQogIHJpZ2h0IHRoaW5nIHdoZW4gZWRpdGluZyBBcmFiaWMgb3IgSGVicmV3IHRleHQuPC9saT4KICA8bGk+QXJiaXRyYXJ5IGxpbmUgaGVpZ2h0cy4gVXNpbmcgZm9udHMgd2l0aCBkaWZmZXJlbnQgaGVpZ2h0cwogIGluc2lkZSB0aGUgZWRpdG9yICh3aGV0aGVyIG9mZiBieSBvbmUgcGl4ZWwgb3IgZmlmdHkpIGlzIG5vdwogIHN1cHBvcnRlZCBhbmQgaGFuZGxlZCBncmFjZWZ1bGx5LjwvbGk+CiAgPGxpPkluLWxpbmUgd2lkZ2V0cy4gU2VlIDxhIGhyZWY9Ii4uL2RlbW8vd2lkZ2V0Lmh0bWwiPnRoZSBkZW1vPC9hPgogIGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRMaW5lV2lkZ2V0Ij50aGUgZG9jczwvYT4uPC9saT4KICA8bGk+RGVmaW5pbmcgY3VzdG9tIG9wdGlvbnMKICB3aXRoIDxhIGhyZWY9Im1hbnVhbC5odG1sI2RlZmluZU9wdGlvbiI+PGNvZGU+Q29kZU1pcnJvci5kZWZpbmVPcHRpb248L2NvZGU+PC9hPi48L2xpPgo8L3VsPgoKPC9kaXY+PGRpdiBjbGFzcz0icmlnaHRzbWFsbCBibGsiPgoKPGgyPkNvbnRlbnRzPC9oMj4KCjx1bD4KICA8bGk+PGEgaHJlZj0iI2RvbSI+RE9NIHN0cnVjdHVyZTwvYT48L2xpPgogIDxsaT48YSBocmVmPSIjZ3V0dGVycyI+R3V0dGVyIG1vZGVsPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9IiNldmVudHMiPkV2ZW50IGhhbmRsaW5nPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9IiNmb2xkaW5nIj5MaW5lIGZvbGRpbmc8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iI21hcmt0ZXh0Ij5tYXJrVGV4dCBtZXRob2QgYXJndW1lbnRzPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9IiNsaW5lY2xhc3MiPkxpbmUgQ1NTIGNsYXNzZXM8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iI3Bvc2l0aW9ucyI+UG9zaXRpb24gcHJvcGVydGllczwvYT48L2xpPgogIDxsaT48YSBocmVmPSIjbWF0Y2hicmFja2V0cyI+QnJhY2tldCBtYXRjaGluZzwvYT48L2xpPgogIDxsaT48YSBocmVmPSIjbW9kZXMiPk1vZGUgbWFuYWdlbWVudDwvYT48L2xpPgogIDxsaT48YSBocmVmPSIjbmV3Ij5OZXcgZmVhdHVyZXM8L2E+PC9saT4KPC91bD4KCjwvZGl2PjwvZGl2PgoKPHNjcmlwdD5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Q29kZU1pcnJvci5jb2xvcml6ZSgpO30sIDIwKTs8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KICAgIDx0aXRsZT5Db2RlTWlycm9yPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NhbnN8RHJvaWQrU2Fuczpib2xkIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJkb2MvZG9jcy5jc3MiLz4KICAgIDxsaW5rIHJlbD0iYWx0ZXJuYXRlIiBocmVmPSJodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2NvZGVtaXJyb3ItYW5ub3VuY2UvZmVlZC9hdG9tX3YxXzBfdG9waWNzLnhtbCIgdHlwZT0iYXBwbGljYXRpb24vYXRvbSt4bWwiLz4KICA8L2hlYWQ+CiAgPGJvZHk+Cgo8aDE+PHNwYW4gY2xhc3M9ImxvZ28tYnJhY2VzIj57IH08L3NwYW4+IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC8iPkNvZGVNaXJyb3I8L2E+PC9oMT4KCjxkaXYgY2xhc3M9ImdyZXkiPgo8aW1nIHNyYz0iZG9jL2JhYm9vbi5wbmciIGNsYXNzPSJsb2dvIiBhbHQ9ImxvZ28iLz4KPHByZT4KLyogSW4tYnJvd3NlciBjb2RlIGVkaXRpbmcKICAgbWFkZSBiZWFyYWJsZSAqLwo8L3ByZT4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJjbGVhciI+PGRpdiBjbGFzcz0ibGVmdCBibGsiPgoKICA8cCBzdHlsZT0ibWFyZ2luLXRvcDogMCI+Q29kZU1pcnJvciBpcyBhIEphdmFTY3JpcHQgY29tcG9uZW50IHRoYXQKICBwcm92aWRlcyBhIGNvZGUgZWRpdG9yIGluIHRoZSBicm93c2VyLiBXaGVuIGEgbW9kZSBpcyBhdmFpbGFibGUgZm9yCiAgdGhlIGxhbmd1YWdlIHlvdSBhcmUgY29kaW5nIGluLCBpdCB3aWxsIGNvbG9yIHlvdXIgY29kZSwgYW5kCiAgb3B0aW9uYWxseSBoZWxwIHdpdGggaW5kZW50YXRpb24uPC9wPgoKICA8cD5BIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCI+cmljaCBwcm9ncmFtbWluZyBBUEk8L2E+IGFuZCBhIENTUwogIHRoZW1pbmcgc3lzdGVtIGFyZSBhdmFpbGFibGUgZm9yIGN1c3RvbWl6aW5nIENvZGVNaXJyb3IgdG8gZml0IHlvdXIKICBhcHBsaWNhdGlvbiwgYW5kIGV4dGVuZGluZyBpdCB3aXRoIG5ldyBmdW5jdGlvbmFsaXR5LjwvcD4KCiAgPGRpdiBjbGFzcz0iY2xlYXIiPjxkaXYgY2xhc3M9ImxlZnQxIGJsayI+CgogICAgPGgyIHN0eWxlPSJtYXJnaW4tdG9wOiAwIj5TdXBwb3J0ZWQgbW9kZXM6PC9oMj4KCiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL2NsaWtlL2luZGV4Lmh0bWwiPkMsIEMrKywgQyM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvY2xvanVyZS9pbmRleC5odG1sIj5DbG9qdXJlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL2NvZmZlZXNjcmlwdC9pbmRleC5odG1sIj5Db2ZmZWVTY3JpcHQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvY29tbW9ubGlzcC9pbmRleC5odG1sIj5Db21tb24gTGlzcDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9jc3MvaW5kZXguaHRtbCI+Q1NTPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL2RpZmYvaW5kZXguaHRtbCI+ZGlmZjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9lY2wvaW5kZXguaHRtbCI+RUNMPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL2VybGFuZy9pbmRleC5odG1sIj5Fcmxhbmc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvZ28vaW5kZXguaHRtbCI+R288L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvZ3Jvb3Z5L2luZGV4Lmh0bWwiPkdyb292eTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9oYXNrZWxsL2luZGV4Lmh0bWwiPkhhc2tlbGw8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvaGF4ZS9pbmRleC5odG1sIj5IYXhlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL2h0bWxlbWJlZGRlZC9pbmRleC5odG1sIj5IVE1MIGVtYmVkZGVkIHNjcmlwdHM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvaHRtbG1peGVkL2luZGV4Lmh0bWwiPkhUTUwgbWl4ZWQtbW9kZTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9odHRwL2luZGV4Lmh0bWwiPkhUVFA8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvY2xpa2UvaW5kZXguaHRtbCI+SmF2YTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9qYXZhc2NyaXB0L2luZGV4Lmh0bWwiPkphdmFTY3JpcHQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvamluamEyL2luZGV4Lmh0bWwiPkppbmphMjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9sZXNzL2luZGV4Lmh0bWwiPkxFU1M8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvbHVhL2luZGV4Lmh0bWwiPkx1YTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9tYXJrZG93bi9pbmRleC5odG1sIj5NYXJrZG93bjwvYT4gKDxhIGhyZWY9Im1vZGUvZ2ZtL2luZGV4Lmh0bWwiPkdpdEh1Yi1mbGF2b3VyPC9hPik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9teXNxbC9pbmRleC5odG1sIj5NeVNRTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9udHJpcGxlcy9pbmRleC5odG1sIj5OVHJpcGxlczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9vY2FtbC9pbmRleC5odG1sIj5PQ2FtbDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9wYXNjYWwvaW5kZXguaHRtbCI+UGFzY2FsPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3BlcmwvaW5kZXguaHRtbCI+UGVybDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9waHAvaW5kZXguaHRtbCI+UEhQPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3BpZy9pbmRleC5odG1sIj5QaWcgTGF0aW48L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvcGxzcWwvaW5kZXguaHRtbCI+UEwvU1FMPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3Byb3BlcnRpZXMvaW5kZXguaHRtbCI+UHJvcGVydGllcyBmaWxlczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9weXRob24vaW5kZXguaHRtbCI+UHl0aG9uPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3IvaW5kZXguaHRtbCI+UjwvYT48L2xpPgogICAgICA8bGk+UlBNIDxhIGhyZWY9Im1vZGUvcnBtL3NwZWMvaW5kZXguaHRtbCI+c3BlYzwvYT4gYW5kIDxhIGhyZWY9Im1vZGUvcnBtL2NoYW5nZXMvaW5kZXguaHRtbCI+Y2hhbmdlbG9nPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3JzdC9pbmRleC5odG1sIj5yZVN0cnVjdHVyZWRUZXh0PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3J1YnkvaW5kZXguaHRtbCI+UnVieTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9ydXN0L2luZGV4Lmh0bWwiPlJ1c3Q8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvY2xpa2Uvc2NhbGEuaHRtbCI+U2NhbGE8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvc2NoZW1lL2luZGV4Lmh0bWwiPlNjaGVtZTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9zaGVsbC9pbmRleC5odG1sIj5TaGVsbDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9zaWV2ZS9pbmRleC5odG1sIj5TaWV2ZTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9zbWFsbHRhbGsvaW5kZXguaHRtbCI+U21hbGx0YWxrPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3NtYXJ0eS9pbmRleC5odG1sIj5TbWFydHk8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvc3BhcnFsL2luZGV4Lmh0bWwiPlNQQVJRTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS9zdGV4L2luZGV4Lmh0bWwiPnNUZVgsIExhVGVYPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3RpZGRseXdpa2kvaW5kZXguaHRtbCI+VGlkZGx5d2lraTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS90aWtpL2luZGV4Lmh0bWwiPlRpa2kgd2lraTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS92Yi9pbmRleC5odG1sIj5WQi5ORVQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvdmJzY3JpcHQvaW5kZXguaHRtbCI+VkJTY3JpcHQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvdmVsb2NpdHkvaW5kZXguaHRtbCI+VmVsb2NpdHk8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1vZGUvdmVyaWxvZy9pbmRleC5odG1sIj5WZXJpbG9nPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3htbC9pbmRleC5odG1sIj5YTUwvSFRNTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS94cXVlcnkvaW5kZXguaHRtbCI+WFF1ZXJ5PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtb2RlL3lhbWwvaW5kZXguaHRtbCI+WUFNTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZS96ODAvaW5kZXguaHRtbCI+WjgwPC9hPjwvbGk+CiAgICA8L3VsPgoKICA8L2Rpdj48ZGl2IGNsYXNzPSJsZWZ0MiBibGsiPgoKICAgIDxoMiBzdHlsZT0ibWFyZ2luLXRvcDogMCI+VXNhZ2UgZGVtb3M6PC9oMj4KCiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSJkZW1vL2NvbXBsZXRlLmh0bWwiPkF1dG9jb21wbGV0aW9uPC9hPiAoPGEgaHJlZj0iZGVtby94bWxjb21wbGV0ZS5odG1sIj5YTUw8L2E+KTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkZW1vL3NlYXJjaC5odG1sIj5TZWFyY2gvcmVwbGFjZTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGVtby9mb2xkaW5nLmh0bWwiPkNvZGUgZm9sZGluZzwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGVtby93aWRnZXQuaHRtbCI+TGluZSB3aWRnZXRzPC9hPiAodmlhIEpTSGludCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGVtby9tdXN0YWNoZS5odG1sIj5Nb2RlIG92ZXJsYXlzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkZW1vL211bHRpcGxleC5odG1sIj5Nb2RlIG11bHRpcGxleGVyPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkZW1vL3ByZXZpZXcuaHRtbCI+SFRNTCBlZGl0b3Igd2l0aCBwcmV2aWV3PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkZW1vL3Jlc2l6ZS5odG1sIj5BdXRvLXJlc2l6aW5nIGVkaXRvcjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGVtby9tYXJrZXIuaHRtbCI+U2V0dGluZyBicmVha3BvaW50czwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGVtby9hY3RpdmVsaW5lLmh0bWwiPkhpZ2hsaWdodGluZyB0aGUgY3VycmVudCBsaW5lPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkZW1vL21hdGNoaGlnaGxpZ2h0ZXIuaHRtbCI+SGlnaGxpZ2h0aW5nIHNlbGVjdGlvbiBtYXRjaGVzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkZW1vL3RoZW1lLmh0bWwiPlRoZW1pbmc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImRlbW8vdmFyaWFibGVoZWlnaHQuaHRtbCI+TWl4ZWQgZm9udCBzaXplczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGVtby9ydW5tb2RlLmh0bWwiPlN0YW5kLWFsb25lIGhpZ2hsaWdodGluZzwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGVtby9mdWxsc2NyZWVuLmh0bWwiPkZ1bGwtc2NyZWVuIGVkaXRpbmc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImRlbW8vY2hhbmdlbW9kZS5odG1sIj5Nb2RlIGF1dG8tY2hhbmdpbmc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImRlbW8vdmlzaWJsZXRhYnMuaHRtbCI+VmlzaWJsZSB0YWJzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkZW1vL2Zvcm1hdHRpbmcuaHRtbCI+QXV0b2Zvcm1hdHRpbmcgb2YgY29kZTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGVtby9lbWFjcy5odG1sIj5FbWFjcyBrZXliaW5kaW5nczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGVtby92aW0uaHRtbCI+VmltIGtleWJpbmRpbmdzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkZW1vL2Nsb3NldGFnLmh0bWwiPkF1dG9tYXRpYyB4bWwgdGFnIGNsb3Npbmc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImRlbW8vbG9hZG1vZGUuaHRtbCI+TGF6eSBtb2RlIGxvYWRpbmc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImRlbW8vYnRyZWUuaHRtbCI+RG9jdW1lbnQgdHJlZSB2aXN1YWxpemF0aW9uPC9hPjwvbGk+CiAgICA8L3VsPgoKICAgIDxoMj5SZWFsLXdvcmxkIHVzZXM6PC9oMj4KCiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vanNiaW4uY29tIj5qc2Jpbi5jb208L2E+IChKUyBwbGF5Z3JvdW5kKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNocmlzLWdyYW5nZXIuY29tLzIwMTIvMDQvMTIvbGlnaHQtdGFibGUtLS1hLW5ldy1pZGUtY29uY2VwdC8iPkxpZ2h0IFRhYmxlPC9hPiAoZXhwZXJpbWVudGFsIElERSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2JyYWNrZXRzLmlvIj5BZG9iZSBCcmFja2V0czwvYT4gKGNvZGUgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm1lcmdlbHkuY29tLyI+TWVyZ2VseTwvYT4gKGludGVyYWN0aXZlIGRpZmZpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vc2NyaXB0Lmdvb2dsZS5jb20vIj5Hb29nbGUgQXBwcyBTY3JpcHQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvYW5kcm9pZCI+R2l0SHViJ3MgQW5kcm9pZCBhcHA8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9lbG9xdWVudGphdmFzY3JpcHQubmV0L2NoYXB0ZXIxLmh0bWwiPkVsb3F1ZW50IEphdmFTY3JpcHQ8L2E+IChib29rKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWVkaWEuY2hpa3V5b25vay5ydS9jb2RlbWlycm9yMi8iPlplbiBDb2Rpbmc8L2E+IChmYXN0IFhNTCBlZGl0aW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vcGFwZXJqcy5vcmcvIj5QYXBlci5qczwvYT4gKGdyYXBoaWNzIHNjcmlwdGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3RvdXIuZ29sYW5nLm9yZyI+R28gbGFuZ3VhZ2UgdG91cjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGV2Lml0LyI+Q29kZXY8L2E+IChjb2xsYWJvcmF0aXZlIElERSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2VuamFsb3QuY29tL3RyaWJ1dGFyeS8yNjM2Mjk2L3NpbndhdmVzLmpzIj5UcmlidXRhcnk8L2E+IChhdWdtZW50ZWQgZWRpdGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3Byb3NlLmlvLyI+UHJvc2UuaW88L2E+IChnaXRodWIgY29udGVudCBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cud2VzY2hlbWUub3JnLyI+V2VTY2hlbWU8L2E+IChsZWFybmluZyB0b29sKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd2ViZ2xwbGF5Z3JvdW5kLm5ldC8iPldlYkdMIHBsYXlncm91bmQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9xbC5pby8iPnFsLmlvPC9hPiAoaHR0cCBBUEkgcXVlcnkgaGVscGVyKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZWxtLWxhbmcub3JnL0V4YW1wbGVzLmVsbSI+RWxtIGxhbmd1YWdlIGV4YW1wbGVzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RoZWZpbGV0cmVlLmNvbSI+VGhlIEZpbGUgVHJlZTwvYT4gKGNvbGxhYiBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuanNoaW50LmNvbS8iPkpTSGludDwvYT4gKEpTIGxpbnRlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2tsMXAuY29tL2NtdGVzdC8xIj5rbDFwPC9hPiAocGFzdGUgc2VydmljZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3NxbGZpZGRsZS5jb20iPlNRTEZpZGRsZTwvYT4gKFNRTCBwbGF5Z3JvdW5kKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdHJ5LmhheGUub3JnIj5UcnkgSGF4ZTwvYT4gKEhheGUgUGxheWdyb3VuZCkgPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jc3NkZWNrLmNvbS8iPkNTU0RlY2s8L2E+IChDU1Mgc2hvd2Nhc2UpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuc2tldGNocGF0Y2gubmV0L2xhYnMvbGl2ZWNvZGVsYWJJbnRyby5odG1sIj5za2V0Y2hQYXRjaCBMaXZlY29kZWxhYjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9ub3RleC5jaCI+Tm9UZXg8L2E+IChyU1QgYXV0aG9yaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkb2MvcmVhbHdvcmxkLmh0bWwiPk1vcmUuLi48L2E+PC9saT4KICAgIDwvdWw+CgogIDwvZGl2PjwvZGl2PgoKICA8aDIgaWQ9ImNvZGUiPkdldHRpbmcgdGhlIGNvZGU8L2gyPgoKICA8cD5BbGwgb2YgQ29kZU1pcnJvciBpcyByZWxlYXNlZCB1bmRlciBhIDxhCiAgaHJlZj0iTElDRU5TRSI+TUlULXN0eWxlPC9hPiBsaWNlbnNlLiBUbyBnZXQgaXQsIHlvdSBjYW4gZG93bmxvYWQKICB0aGUgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3IuemlwIj5sYXRlc3QKICByZWxlYXNlPC9hPiBvciB0aGUgY3VycmVudCA8YQogIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLWxhdGVzdC56aXAiPmRldmVsb3BtZW50CiAgc25hcHNob3Q8L2E+IGFzIHppcCBmaWxlcy4gVG8gY3JlYXRlIGEgY3VzdG9tIG1pbmlmaWVkIHNjcmlwdCBmaWxlLAogIHlvdSBjYW4gdXNlIHRoZSA8YSBocmVmPSJkb2MvY29tcHJlc3MuaHRtbCI+Y29tcHJlc3Npb24gQVBJPC9hPi48L3A+CgogIDxwPldlIHVzZSA8YSBocmVmPSJodHRwOi8vZ2l0LXNjbS5jb20vIj5naXQ8L2E+IGZvciB2ZXJzaW9uIGNvbnRyb2wuCiAgVGhlIG1haW4gcmVwb3NpdG9yeSBjYW4gYmUgZmV0Y2hlZCBpbiB0aGlzIHdheTo8L3A+CgogIDxwcmUgY2xhc3M9ImNvZGUiPmdpdCBjbG9uZSBodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yPC9wcmU+CgogIDxwPkNvZGVNaXJyb3IgY2FuIGFsc28gYmUgZm91bmQgb24gR2l0SHViIGF0IDxhCiAgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yIj5tYXJpam5oL0NvZGVNaXJyb3I8L2E+LgogIElmIHlvdSBwbGFuIHRvIGhhY2sgb24gdGhlIGNvZGUgYW5kIGNvbnRyaWJ1dGUgcGF0Y2hlcywgdGhlIGJlc3Qgd2F5CiAgdG8gZG8gaXQgaXMgdG8gY3JlYXRlIGEgR2l0SHViIGZvcmssIGFuZCBzZW5kIHB1bGwgcmVxdWVzdHMuPC9wPgoKICA8aDIgaWQ9ImRvY3VtZW50aW9uIj5Eb2N1bWVudGF0aW9uPC9oMj4KCiAgPHA+VGhlIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCI+bWFudWFsPC9hPiBpcyB5b3VyIGZpcnN0IHN0b3AgZm9yCiAgbGVhcm5pbmcgaG93IHRvIHVzZSB0aGlzIGxpYnJhcnkuIEl0IHN0YXJ0cyB3aXRoIGEgcXVpY2sgZXhwbGFuYXRpb24KICBvZiBob3cgdG8gdXNlIHRoZSBlZGl0b3IsIGFuZCB0aGVuIGRlc2NyaWJlcyB0aGUgQVBJIGluIGRldGFpbC48L3A+CgogIDxwPkZvciB0aG9zZSB3aG8gd2FudCB0byBsZWFybiBtb3JlIGFib3V0IHRoZSBjb2RlLCB0aGVyZSBpcwogIGEgPGEgaHJlZj0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9ibG9nLyNjbS1pbnRlcm5hbHMiPnNlcmllcyBvZgogIHBvc3RzPC9hPiBvbiBDb2RlTWlycm9yIG9uIG15IGJsb2csIGFuZCB0aGUKICBvbGQgPGEgaHJlZj0iZG9jL2ludGVybmFscy5odG1sIj5vdmVydmlldyBvZiB0aGUgZWRpdG9yCiAgaW50ZXJuYWxzPC9hPi4KICBUaGUgPGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yIj5zb3VyY2UgY29kZTwvYT4KICBpdHNlbGYgaXMsIGZvciB0aGUgbW9zdCBwYXJ0LCBhbHNvIHZlcnkgcmVhZGFibGUuPC9wPgoKICA8aDIgaWQ9InN1cHBvcnQiPlN1cHBvcnQgYW5kIGJ1ZyByZXBvcnRzPC9oMj4KCiAgPHA+Q29tbXVuaXR5IGRpc2N1c3Npb24sIHF1ZXN0aW9ucywgYW5kIGluZm9ybWFsIGJ1ZyByZXBvcnRpbmcgaXMKICBkb25lIG9uCiAgdGhlIDxhIGhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9jb2RlbWlycm9yIj5Db2RlTWlycm9yCiAgR29vZ2xlIGdyb3VwPC9hPi4gVGhlcmUgaXMgYSBzZXBhcmF0ZQogIGdyb3VwLCA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvY29kZW1pcnJvci1hbm5vdW5jZSI+Q29kZU1pcnJvci1hbm5vdW5jZTwvYT4sCiAgd2hpY2ggaXMgbG93ZXItdm9sdW1lLCBhbmQgaXMgb25seSB1c2VkIGZvciBtYWpvciBhbm5vdW5jZW1lbnRz4oCUbmV3CiAgdmVyc2lvbnMgYW5kIHN1Y2guIFRoZXNlIHdpbGwgYmUgY3Jvc3MtcG9zdGVkIHRvIGJvdGggZ3JvdXBzLCBzbyB5b3UKICBkb24ndCBuZWVkIHRvIHN1YnNjcmliZSB0byBib3RoLjwvcD4KCiAgPHA+VGhvdWdoIGJ1ZyByZXBvcnRzIHRocm91Z2ggZS1tYWlsIGFyZSByZXNwb25kZWQgdG8sIHRoZSBwcmVmZXJyZWQKICB3YXkgdG8gcmVwb3J0IGJ1Z3MgaXMgdG8gdXNlCiAgdGhlIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9pc3N1ZXMiPkdpdEh1YgogIGlzc3VlIHRyYWNrZXI8L2E+LiBCZWZvcmUgcmVwb3J0aW5nIGEKICBidWcsIDxhIGhyZWY9ImRvYy9yZXBvcnRpbmcuaHRtbCI+cmVhZCB0aGVzZSBwb2ludGVyczwvYT4uIEFsc28sCiAgdGhlIGlzc3VlIHRyYWNrZXIgaXMgZm9yIDxlbT5idWdzPC9lbT4sIG5vdCByZXF1ZXN0cyBmb3IgaGVscC48L3A+CgogIDxwPldoZW4gbm9uZSBvZiB0aGVzZSBzZWVtIGZpdHRpbmcsIHlvdSBjYW4KICBzaW1wbHkgPGEgaHJlZj0ibWFpbHRvOm1hcmlqbmhAZ21haWwuY29tIj5lLW1haWwgdGhlIG1haW50YWluZXI8L2E+CiAgZGlyZWN0bHkuPC9wPgoKICA8aDIgaWQ9InN1cHBvcnRlZCI+U3VwcG9ydGVkIGJyb3dzZXJzPC9oMj4KCiAgPHA+VGhlIGZvbGxvd2luZyA8ZW0+ZGVza3RvcDwvZW0+IGJyb3dzZXJzIGFyZSBhYmxlIHRvIHJ1biBDb2RlTWlycm9yOjwvcD4KCiAgPHVsPgogICAgPGxpPkZpcmVmb3ggMyBvciBoaWdoZXI8L2xpPgogICAgPGxpPkNocm9tZSwgYW55IHZlcnNpb248L2xpPgogICAgPGxpPlNhZmFyaSA1LjIgb3IgaGlnaGVyPC9saT4KICAgIDxsaT5PcGVyYSA5IG9yIGhpZ2hlciAod2l0aCBzb21lIGtleS1oYW5kbGluZyBwcm9ibGVtcyBvbiBPUyBYKTwvbGk+CiAgICA8bGk+SW50ZXJuZXQgRXhwbG9yZXIgOCBvciBoaWdoZXIgaW4gc3RhbmRhcmRzIG1vZGU8YnI+CiAgICAgIDxlbT4oPHN0cm9uZz5Ob3Q8L3N0cm9uZz4gcXVpcmtzIG1vZGUuIEJ1dCBxdWFzaS1zdGFuZGFyZHMgbW9kZSB3aXRoIGEKICAgICAgdHJhbnNpdGlvbmFsIGRvY3R5cGUgaXMgYWxzbyBmbGFreS4gPGNvZGU+Jmx0OyFkb2N0eXBlCiAgICAgIGh0bWw+PC9jb2RlPiBpcyByZWNvbW1lbmRlZC4pPC9lbT48L2xpPgogICAgPGxpPkludGVybmV0IEV4cGxvcmVyIDcgKHN0YW5kYXJkcyBtb2RlKSBpcyB1c2FibGUsIGJ1dCBidWdneS4gSXQKICAgIGhhcyBhIDxhIGhyZWY9Imh0dHA6Ly90aGVyZWFsY3Jpc3AueHM0YWxsLm5sL21ldWsvSUUtemluZGV4YnVnLmh0bWwiPnotaW5kZXgKICAgIGJ1ZzwvYT4gdGhhdCBwcmV2ZW50cyBDb2RlTWlycm9yIGZyb20gd29ya2luZyBwcm9wZXJseS48L2xpPgogIDwvdWw+CgogIDxwPkkgYW0gbm90IGFjdGl2ZWx5IHRlc3RpbmcgYWdhaW5zdCBldmVyeSBuZXcgYnJvd3NlciByZWxlYXNlLCBhbmQKICB2ZW5kb3JzIGhhdmUgYSBoYWJpdCBvZiBpbnRyb2R1Y2luZyBidWdzIGFsbCB0aGUgdGltZSwgc28gSSBhbQogIHJlbHlpbmcgb24gdGhlIGNvbW11bml0eSB0byB0ZWxsIG1lIHdoZW4gc29tZXRoaW5nIGJyZWFrcy4KICBTZWUgPGEgaHJlZj0iI3N1cHBvcnQiPmhlcmU8L2E+IGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdAogIG1lLjwvcD4KCiAgPHA+TW9iaWxlIGJyb3dzZXJzIG1vc3RseSBraW5kIG9mIHdvcmssIGJ1dCwgYmVjYXVzZSBvZiBsaW1pdGF0aW9ucwogIGFuZCB0aGVpciBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCBVSSBhc3N1bXB0aW9ucywgc2hvdyBhIGxvdCBvZgogIHF1aXJrcyB0aGF0IGFyZSBoYXJkIHRvIHdvcmsgYXJvdW5kLjwvcD4KCiAgPGgyIGlkPSJjb21tZXJjaWFsIj5Db21tZXJjaWFsIHN1cHBvcnQ8L2gyPgoKICA8cD5Db2RlTWlycm9yIGlzIGRldmVsb3BlZCBhbmQgbWFpbnRhaW5lZCBieSBtZSwgTWFyaWpuIEhhdmVyYmVrZSwKICBpbiBteSBvd24gdGltZS4gSWYgeW91ciBjb21wYW55IGlzIGdldHRpbmcgdmFsdWUgb3V0IG9mIENvZGVNaXJyb3IsCiAgcGxlYXNlIGNvbnNpZGVyIHB1cmNoYXNpbmcgYSBzdXBwb3J0IGNvbnRyYWN0LjwvcD4KCiAgPHVsPgogICAgPGxpPllvdSdsbCBiZSBmdW5kaW5nIGZ1cnRoZXIgd29yayBvbiBDb2RlTWlycm9yLjwvbGk+CiAgICA8bGk+WW91IGVuc3VyZSB0aGF0IHlvdSBnZXQgYSBxdWljayByZXNwb25zZSB3aGVuIHlvdSBoYXZlIGEKICAgIHByb2JsZW0sIGV2ZW4gd2hlbiBJIGFtIG90aGVyd2lzZSBidXN5LjwvbGk+CiAgPC91bD4KCiAgPHA+Q29kZU1pcnJvciBzdXBwb3J0IGNvbnRyYWN0cyBleGlzdCBpbiB0d28KICBmb3Jtc+KAlDxzdHJvbmc+YmFzaWM8L3N0cm9uZz4gYXQg4oKsMTAwIHBlciBtb250aCwKICBhbmQgPHN0cm9uZz5wcmVtaXVtPC9zdHJvbmc+IGF0IOKCrDUwMCBwZXIKICBtb250aC4gPGEgaHJlZj0ibWFpbHRvOm1hcmlqbmhAZ21haWwuY29tIj5Db250YWN0IG1lPC9hPiBmb3IgZnVydGhlcgogIGluZm9ybWF0aW9uLjwvcD4KCjwvZGl2PgoKPGRpdiBjbGFzcz0icmlnaHQgYmxrIj4KCiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3IuemlwIiBjbGFzcz0iZG93bmxvYWQiPkRvd25sb2FkIHRoZSBsYXRlc3QgcmVsZWFzZTwvYT4KCiAgPGgyPlN1cHBvcnQgQ29kZU1pcnJvcjwvaDI+CgogIDx1bD4KICAgIDxsaT5Eb25hdGUKICAgICg8c3BhbiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF5cGFsJykuc3VibWl0KCk7IgogICAgY2xhc3M9InF1YXNpbGluayI+UGF5cGFsPC9zcGFuPiwKICAgIDxzcGFuIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYW5raW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyIKICAgICAgICAgICBjbGFzcz0icXVhc2lsaW5rIj5iYW5rPC9zcGFuPiwgb3IKICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmdpdHRpcC5jb20vbWFyaWpuaCI+R2l0dGlwPC9hPik8L2xpPgogICAgPGxpPlB1cmNoYXNlIDxhIGhyZWY9IiNjb21tZXJjaWFsIj5jb21tZXJjaWFsIHN1cHBvcnQ8L2E+PC9saT4KICA8L3VsPgoKICA8cCBpZD0iYmFua2luZm8iIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICBCYW5rOiA8aT5SYWJvYmFuazwvaT48YnIvPgogICAgQ291bnRyeTogPGk+TmV0aGVybGFuZHM8L2k+PGJyLz4KICAgIFNXSUZUOiA8aT5SQUJPTkwyVTwvaT48YnIvPgogICAgQWNjb3VudDogPGk+MTQ3ODUwNzcwPC9pPjxici8+CiAgICBOYW1lOiA8aT5NYXJpam4gSGF2ZXJiZWtlPC9pPjxici8+CiAgICBJQkFOOiA8aT5OTDI2IFJBQk8gMDE0NyA4NTA3IDcwPC9pPgogIDwvcD4KCiAgPGgyPlJlYWRpbmcgbWF0ZXJpYWw8L2gyPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iZG9jL21hbnVhbC5odG1sIj5Vc2VyIG1hbnVhbDwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvciI+QnJvd3NlIHRoZSBjb2RlPC9hPjwvbGk+CiAgPC91bD4KCiAgPGgyIGlkPXJlbGVhc2VzPlJlbGVhc2VzPC9oMj4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMTEtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4wLnppcCI+VmVyc2lvbiAzLjA8L2E+OjwvcD4KCiAgPHAgY2xhc3M9InJlbC1ub3RlIj48c3Ryb25nPk5ldyBtYWpvciB2ZXJzaW9uPC9zdHJvbmc+LiBPbmx5CiAgcGFydGlhbGx5IGJhY2t3YXJkcy1jb21wYXRpYmxlLiBTZWUKICB0aGUgPGEgaHJlZj0iZG9jL3VwZ3JhZGVfdjMuaHRtbCI+dXBncmFkaW5nIGd1aWRlPC9hPiBmb3IgbW9yZQogIGluZm9ybWF0aW9uLiBDaGFuZ2VzIHNpbmNlIHJlbGVhc2UgY2FuZGlkYXRlIDI6PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5SZXdyaXR0ZW4gVklNIG1vZGUuPC9saT4KICAgIDxsaT5GaXggYSBmZXcgbWlub3Igc2Nyb2xsaW5nIGFuZCBzaXppbmcgaXNzdWVzLjwvbGk+CiAgICA8bGk+V29yayBhcm91bmQgU2FmYXJpIHNlZ2ZhdWx0IHdoZW4gZHJhZ2dpbmcuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS92My4wcmMyLi4udjMuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CiAgCgogIDxwIGNsYXNzPSJyZWwiPjIwLTExLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMHJjMi56aXAiPlZlcnNpb24gMy4wLCByZWxlYXNlIGNhbmRpZGF0ZSAyPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSJtb2RlL2h0dHAvaW5kZXguaHRtbCI+SFRUUDwvYT4uPC9saT4KICAgIDxsaT5JbXByb3ZlZCBoYW5kbGluZyBvZiBzZWxlY3Rpb24gYW5jaG9yIHBvc2l0aW9uLjwvbGk+CiAgICA8bGk+SW1wcm92ZSBJRSBwZXJmb3JtYW5jZSBvbiBsb25nZXIgbGluZXMuPC9saT4KICAgIDxsaT5SZWR1Y2UgZ3V0dGVyIGdsaXRjaGVzIGR1cmluZyBob3Jpei4gc2Nyb2xsaW5nLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNhZGRLZXlNYXAiPjxjb2RlPmFkZEtleU1hcDwvY29kZT48L2E+IGFuZCA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjcmVtb3ZlS2V5TWFwIj48Y29kZT5yZW1vdmVLZXlNYXA8L2NvZGU+PC9hPiBtZXRob2RzLjwvbGk+CiAgICA8bGk+UmV3cml0ZSA8Y29kZT5mb3JtYXR0aW5nPC9jb2RlPiBhbmQgPGNvZGU+Y2xvc2V0YWc8L2NvZGU+IGFkZC1vbnMuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS92My4wcmMxLi4udjMuMHJjMiI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTExLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMzYuemlwIj5WZXJzaW9uIDIuMzY8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Im1vZGUvejgwL2luZGV4Lmh0bWwiPlo4MCBhc3NlbWJseTwvYT4uPC9saT4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9ImRlbW8vdGhlbWUuaHRtbD90d2lsaWdodCI+VHdpbGlnaHQ8L2E+LjwvbGk+CiAgICA8bGk+QWRkIGNvbW1hbmQtbGluZSBjb21wcmVzc2lvbiBoZWxwZXIuPC9saT4KICAgIDxsaT5NYWtlIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNzY3JvbGxJbnRvVmlldyI+PGNvZGU+c2Nyb2xsSW50b1ZpZXc8L2NvZGU+PC9hPiBwdWJsaWMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2RlZmF1bHRUZXh0SGVpZ2h0Ij48Y29kZT5kZWZhdWx0VGV4dEhlaWdodDwvY29kZT48L2E+IG1ldGhvZC48L2xpPgogICAgPGxpPlZhcmlvdXMgZXh0ZW5zaW9ucyB0byB0aGUgdmltIGtleW1hcC48L2xpPgogICAgPGxpPk1ha2UgPGEgaHJlZj0ibW9kZS9waHAvaW5kZXguaHRtbCI+UEhQIG1vZGU8L2E+IGJ1aWxkIG9uIDxhIGhyZWY9Im1vZGUvaHRtbG1peGVkL2luZGV4Lmh0bWwiPm1peGVkIEhUTUwgbW9kZTwvYT4uPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI3V0aWxfY29udGludWVjb21tZW50Ij5jb21tZW50LWNvbnRpbnVpbmc8L2E+IGFkZC1vbi48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlL3YyLjM1Li4udjIuMzYiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMC0xMS0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjByYzEuemlwIj5WZXJzaW9uIDMuMCwgcmVsZWFzZSBjYW5kaWRhdGUgMTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9ImRlbW8vdGhlbWUuaHRtbD9zb2xhcml6ZWQlMjBsaWdodCI+U29sYXJpemVkPC9hPi48L2xpPgogICAgPGxpPkludHJvZHVjZSA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjYWRkTGluZUNsYXNzIj48Y29kZT5hZGRMaW5lQ2xhc3M8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNyZW1vdmVMaW5lQ2xhc3MiPjxjb2RlPnJlbW92ZUxpbmVDbGFzczwvY29kZT48L2E+LAogICAgZHJvcCA8Y29kZT5zZXRMaW5lQ2xhc3M8L2NvZGU+LjwvbGk+CiAgICA8bGk+QWRkIGEgPGVtPmxvdDwvZW0+IG9mCiAgICBuZXcgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI21hcmtUZXh0Ij5vcHRpb25zIGZvciBtYXJrZWQgdGV4dDwvYT4KICAgIChyZWFkLW9ubHksIGF0b21pYywgY29sbGFwc2VkLCB3aWRnZXQgcmVwbGFjZW1lbnQpLjwvbGk+CiAgICA8bGk+UmVtb3ZlIHRoZSBvbGQgY29kZSBmb2xkaW5nIGludGVyZmFjZSBpbiBmYXZvdXIgb2YgdGhlc2UgbmV3IHJhbmdlcy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjaXNDbGVhbiI+PGNvZGU+aXNDbGVhbjwvY29kZT48L2E+LzxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNtYXJrQ2xlYW4iPjxjb2RlPm1hcmtDbGVhbjwvY29kZT48L2E+IG1ldGhvZHMuPC9saT4KICAgIDxsaT5SZW1vdmUgPGNvZGU+Y29tcG91bmRDaGFuZ2U8L2NvZGU+IG1ldGhvZCwgdXNlIGJldHRlciB1bmRvLWV2ZW50LWNvbWJpbmluZyBoZXVyaXN0aWMuPC9saT4KICAgIDxsaT5JbXByb3ZlIHNjcm9sbGluZyBwZXJmb3JtYW5jZSBzbW9vdGhuZXNzLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMGJldGEyLi4udjMuMHJjMSI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTEwLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMzUuemlwIj5WZXJzaW9uIDIuMzU8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IChzdWIpIG1vZGU6IDxhIGhyZWY9Im1vZGUvamF2YXNjcmlwdC90eXBlc2NyaXB0Lmh0bWwiPlR5cGVTY3JpcHQ8L2E+LjwvbGk+CiAgICA8bGk+RG9uJ3Qgb3ZlcndyaXRlIChpbnNlcnQga2V5KSB3aGVuIHBhc3RpbmcuPC9saT4KICAgIDxsaT5GaXggc2V2ZXJhbCBidWdzIGluIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNtYXJrVGV4dCI+PGNvZGU+bWFya1RleHQ8L2NvZGU+PC9hPi91bmRvIGludGVyYWN0aW9uLjwvbGk+CiAgICA8bGk+QmV0dGVyIGluZGVudGF0aW9uIG9mIEphdmFTY3JpcHQgY29kZSB3aXRob3V0IHNlbWljb2xvbnMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2RlZmluZUluaXRIb29rIj48Y29kZT5kZWZpbmVJbml0SG9vazwvY29kZT48L2E+IGZ1bmN0aW9uLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjIuMzQuLi52Mi4zNSI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTEwLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMGJldGEyLnppcCI+VmVyc2lvbiAzLjAsIGJldGEgMjwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5GaXggcGFnZS1iYXNlZCBjb29yZGluYXRlIGNvbXB1dGF0aW9uLjwvbGk+CiAgICA8bGk+Rml4IGZpcmluZyBvZiA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjZXZlbnRfZ3V0dGVyQ2xpY2siPjxjb2RlPmd1dHRlckNsaWNrPC9jb2RlPjwvYT4gZXZlbnQuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI29wdGlvbl9jdXJzb3JIZWlnaHQiPjxjb2RlPmN1cnNvckhlaWdodDwvY29kZT48L2E+IG9wdGlvbi48L2xpPgogICAgPGxpPkZpeCBiaS1kaXJlY3Rpb25hbCB0ZXh0IHJlZ3Jlc3Npb24uPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI29wdGlvbl92aWV3cG9ydE1hcmdpbiI+PGNvZGU+dmlld3BvcnRNYXJnaW48L2NvZGU+PC9hPiBvcHRpb24uPC9saT4KICAgIDxsaT5EaXJlY3RseSBoYW5kbGUgbW91c2V3aGVlbCBldmVudHMgKGFnYWluLCBob3BlZnVsbHkgYmV0dGVyKS48L2xpPgogICAgPGxpPk1ha2UgdmVydGljYWwgY3Vyc29yIG1vdmVtZW50IG1vcmUgcm9idXN0ICh0aHJvdWdoIHdpZGdldHMsIGJpZyBsaW5lIGdhcHMpLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNvcHRpb25fZmxhdHRlblNwYW5zIj48Y29kZT5mbGF0dGVuU3BhbnM8L2NvZGU+PC9hPiBvcHRpb24uPC9saT4KICAgIDxsaT5NYW55IG9wdGltaXphdGlvbnMuIFBvb3IgcmVzcG9uc2l2ZW5lc3Mgc2hvdWxkIGJlIGZpeGVkLjwvbGk+CiAgICA8bGk+SW5pdGlhbGl6YXRpb24gaW4gaGlkZGVuIHN0YXRlIHdvcmtzIGFnYWluLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMGJldGExLi4udjMuMGJldGEyIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MTktMDktMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4zNC56aXAiPlZlcnNpb24gMi4zNDwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgbW9kZTogPGEgaHJlZj0ibW9kZS9jb21tb25saXNwL2luZGV4Lmh0bWwiPkNvbW1vbiBMaXNwPC9hPi48L2xpPgogICAgPGxpPkZpeCByaWdodC1jbGljayBzZWxlY3QtYWxsIG9uIG1vc3QgYnJvd3NlcnMuPC9saT4KICAgIDxsaT5DaGFuZ2UgdGhlIHdheSBoaWdobGlnaHRpbmcgaGFwcGVuczo8YnI+Jm5ic3A7IFNhdmVzIG1lbW9yeSBhbmQgQ1BVIGN5Y2xlcy48YnI+Jm5ic3A7IDxjb2RlPmNvbXBhcmVTdGF0ZXM8L2NvZGU+IGlzIG5vIGxvbmdlciBuZWVkZWQuPGJyPiZuYnNwOyA8Y29kZT5vbkhpZ2hsaWdodENvbXBsZXRlPC9jb2RlPiBubyBsb25nZXIgd29ya3MuPC9saT4KICAgIDxsaT5JbnRlZ3JhdGUgbW9kZSAoTWFya2Rvd24sIFhRdWVyeSwgQ1NTLCBzVGV4KSB0ZXN0cyBpbiBjZW50cmFsIHRlc3RzdWl0ZS48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCN2ZXJzaW9uIj48Y29kZT5Db2RlTWlycm9yLnZlcnNpb248L2NvZGU+PC9hPiBwcm9wZXJ0eS48L2xpPgogICAgPGxpPk1vcmUgcm9idXN0IGhhbmRsaW5nIG9mIG5lc3RlZCBtb2RlcyBpbiA8YSBocmVmPSJkZW1vL2Zvcm1hdHRpbmcuaHRtbCI+Zm9ybWF0dGluZzwvYT4gYW5kIDxhIGhyZWY9ImRlbW8vY2xvc2V0YWcuaHRtbCI+Y2xvc2V0YWc8L2E+IHBsdWctaW5zLjwvbGk+CiAgICA8bGk+VW4vcmVkbyBub3cgcHJlc2VydmVzIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNtYXJrVGV4dCI+bWFya2VkIHRleHQ8L2E+IGFuZCBib29rbWFya3MuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjIuMzMuLi52Mi4zNCI+RnVsbCBsaXN0PC9hPiBvZiBwYXRjaGVzLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MTktMDktMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4wYmV0YTEuemlwIj5WZXJzaW9uIDMuMCwgYmV0YSAxPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkJpLWRpcmVjdGlvbmFsIHRleHQgc3VwcG9ydC48L2xpPgogICAgPGxpPk1vcmUgcG93ZXJmdWwgZ3V0dGVyIG1vZGVsLjwvbGk+CiAgICA8bGk+U3VwcG9ydCBmb3IgYXJiaXRyYXJ5IHRleHQvd2lkZ2V0IGhlaWdodC48L2xpPgogICAgPGxpPkluLWxpbmUgd2lkZ2V0cy48L2xpPgogICAgPGxpPkdlbmVyYWxpemVkIGV2ZW50IGhhbmRsaW5nLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjMtMDgtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4zMy56aXAiPlZlcnNpb24gMi4zMzwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgbW9kZTogPGEgaHJlZj0ibW9kZS9zaWV2ZS9pbmRleC5odG1sIj5TaWV2ZTwvYT4uPC9saT4KICAgIDxsaT5OZXcgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2dldFZpZXdwb3J0Ij48Y29kZT5nZXRWaWV3UG9ydDwvY29kZT48L2E+IGFuZCA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjb3B0aW9uX29uVmlld3BvcnRDaGFuZ2UiPjxjb2RlPm9uVmlld3BvcnRDaGFuZ2U8L2NvZGU+PC9hPiBBUEkuPC9saT4KICAgIDxsaT48YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjb3B0aW9uX2N1cnNvckJsaW5rUmF0ZSI+Q29uZmlndXJhYmxlPC9hPiBjdXJzb3IgYmxpbmsgcmF0ZS48L2xpPgogICAgPGxpPk1ha2UgYmluZGluZyBhIGtleSB0byA8Y29kZT5mYWxzZTwvY29kZT4gZGlzYWJsaW5nIGhhbmRsaW5nIChhZ2FpbikuPC9saT4KICAgIDxsaT5TaG93IG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIGFzIHJlZCBkb3RzLjwvbGk+CiAgICA8bGk+TW9yZSB0d2Vha3MgdG8gdGhlIHNjcm9sbGluZyBtb2RlbC48L2xpPgogICAgPGxpPkV4cGFuZGVkIHRlc3RzdWl0ZS4gQmFzaWMgbGludGVyIGFkZGVkLjwvbGk+CiAgICA8bGk+UmVtb3ZlIG1vc3QgdXNlcyBvZiA8Y29kZT5pbm5lckhUTUw8L2NvZGU+LiBSZW1vdmUgPGNvZGU+Q29kZU1pcnJvci5odG1sRXNjYXBlPC9jb2RlPi48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS92Mi4zMi4uLnYyLjMzIj5GdWxsIGxpc3Q8L2E+IG9mIHBhdGNoZXMuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMy0wNy0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjMyLnppcCI+VmVyc2lvbiAyLjMyPC9hPjo8L3A+CgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+RW1lcmdlbmN5IGZpeCBmb3IgYSBidWcgd2hlcmUgYW4gZWRpdG9yIHdpdGgKICBsaW5lIHdyYXBwaW5nIG9uIElFIHdpbGwgYnJlYWsgd2hlbiB0aGVyZSBpcyA8ZW0+bm88L2VtPgogIHNjcm9sbGJhci48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTA3LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMzEuemlwIj5WZXJzaW9uIDIuMzE8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGVzOiA8YSBocmVmPSJtb2RlL29jYW1sL2luZGV4Lmh0bWwiPk9DYW1sPC9hPiwgPGEgaHJlZj0ibW9kZS9oYXhlL2luZGV4Lmh0bWwiPkhheGU8L2E+LCBhbmQgPGEgaHJlZj0ibW9kZS92Yi9pbmRleC5odG1sIj5WQi5ORVQ8L2E+LjwvbGk+CiAgICA8bGk+U2V2ZXJhbCBmaXhlcyB0byB0aGUgbmV3IHNjcm9sbGluZyBtb2RlbC48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNzZXRTaXplIj48Y29kZT5zZXRTaXplPC9jb2RlPjwvYT4gbWV0aG9kIGZvciBwcm9ncmFtbWF0aWMgcmVzaXppbmcuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2dldEhpc3RvcnkiPjxjb2RlPmdldEhpc3Rvcnk8L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI3NldEhpc3RvcnkiPjxjb2RlPnNldEhpc3Rvcnk8L2NvZGU+PC9hPiBtZXRob2RzLjwvbGk+CiAgICA8bGk+QWxsb3cgY3VzdG9tIGxpbmUgc2VwYXJhdG9yIHN0cmluZyBpbiA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjZ2V0VmFsdWUiPjxjb2RlPmdldFZhbHVlPC9jb2RlPjwvYT4gYW5kIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNnZXRSYW5nZSI+PGNvZGU+Z2V0UmFuZ2U8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPlN1cHBvcnQgZG91YmxlLSBhbmQgdHJpcGxlLWNsaWNrIGRyYWcsIGRvdWJsZS1jbGlja2luZyB3aGl0ZXNwYWNlLjwvbGk+CiAgICA8bGk+QW5kIG1vcmUuLi4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlL3YyLjMuLi52Mi4zMSI+KGFsbCBwYXRjaGVzKTwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTA2LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMy56aXAiPlZlcnNpb24gMi4zPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPjxzdHJvbmc+TmV3IHNjcm9sbGJhciBpbXBsZW1lbnRhdGlvbjwvc3Ryb25nPi4gU2hvdWxkIGZsaWNrZXIgbGVzcy4gQ2hhbmdlcyBET00gc3RydWN0dXJlIG9mIHRoZSBlZGl0b3IuPC9saT4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9ImRlbW8vdGhlbWUuaHRtbD92aWJyYW50LWluayI+dmlicmFudC1pbms8L2E+LjwvbGk+CiAgICA8bGk+TWFueSBleHRlbnNpb25zIHRvIHRoZSBWSU0ga2V5bWFwIChpbmNsdWRpbmcgdGV4dCBvYmplY3RzKS48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJkZW1vL211bHRpcGxleC5odG1sIj5tb2RlLW11bHRpcGxleGluZzwvYT4gdXRpbGl0eSBzY3JpcHQuPC9saT4KICAgIDxsaT5GaXggYnVnIHdoZXJlIHJpZ2h0LWNsaWNrIHBhc3RlIHdvcmtzIGluIHJlYWQtb25seSBtb2RlLjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2dldFNjcm9sbEluZm8iPjxjb2RlPmdldFNjcm9sbEluZm88L2NvZGU+PC9hPiBtZXRob2QuPC9saT4KICAgIDxsaT5Mb3RzIG9mIG90aGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS92Mi4yNS4uLnYyLjMiPmZpeGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTA1LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMjUuemlwIj5WZXJzaW9uIDIuMjU8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Im1vZGUvZXJsYW5nL2luZGV4Lmh0bWwiPkVybGFuZzwvYT4uPC9saT4KICAgIDxsaT48c3Ryb25nPlJlbW92ZSB4bWxwdXJlIG1vZGU8L3N0cm9uZz4gKHVzZSA8YSBocmVmPSJtb2RlL3htbC9pbmRleC5odG1sIj54bWwuanM8L2E+KS48L2xpPgogICAgPGxpPkZpeCBsaW5lLXdyYXBwaW5nIGluIE9wZXJhLjwvbGk+CiAgICA8bGk+Rml4IFggV2luZG93cyBtaWRkbGUtY2xpY2sgcGFzdGUgaW4gQ2hyb21lLjwvbGk+CiAgICA8bGk+Rml4IGJ1ZyB0aGF0IGJyb2tlIHBhc3Rpbmcgb2YgaHVnZSBkb2N1bWVudHMuPC9saT4KICAgIDxsaT5GaXggYmFja3NwYWNlIGFuZCB0YWIga2V5IHJlcGVhdCBpbiBPcGVyYS48L2xpPgogIDwvdWw+CgogIDxwPjxhIGhyZWY9ImRvYy9vbGRyZWxlYXNlLmh0bWwiPk9sZGVyIHJlbGVhc2VzLi4uPC9hPjwvcD4KCjwvZGl2PjwvZGl2PgoKPGRpdiBzdHlsZT0iaGVpZ2h0OiAyZW0iPiZuYnNwOzwvZGl2PgoKICA8Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCIgaWQ9InBheXBhbCI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJfcy14Y2xpY2siLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhvc3RlZF9idXR0b25faWQiIHZhbHVlPSIzRlZIUzVGR1VZN0NDIi8+CiAgPC9mb3JtPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/keymap/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/keymap/emacs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gVE9ETyBudW1iZXIgcHJlZml4ZXMKKGZ1bmN0aW9uKCkgewogIC8vIFJlYWxseSBwcmltaXRpdmUga2lsbC1yaW5nIGltcGxlbWVudGF0aW9uLgogIHZhciBraWxsUmluZyA9IFtdOwogIGZ1bmN0aW9uIGFkZFRvUmluZyhzdHIpIHsKICAgIGtpbGxSaW5nLnB1c2goc3RyKTsKICAgIGlmIChraWxsUmluZy5sZW5ndGggPiA1MCkga2lsbFJpbmcuc2hpZnQoKTsKICB9CiAgZnVuY3Rpb24gZ2V0RnJvbVJpbmcoKSB7IHJldHVybiBraWxsUmluZ1traWxsUmluZy5sZW5ndGggLSAxXSB8fCAiIjsgfQogIGZ1bmN0aW9uIHBvcEZyb21SaW5nKCkgeyBpZiAoa2lsbFJpbmcubGVuZ3RoID4gMSkga2lsbFJpbmcucG9wKCk7IHJldHVybiBnZXRGcm9tUmluZygpOyB9CgogIENvZGVNaXJyb3Iua2V5TWFwLmVtYWNzID0gewogICAgIkN0cmwtWCI6IGZ1bmN0aW9uKGNtKSB7Y20uc2V0T3B0aW9uKCJrZXlNYXAiLCAiZW1hY3MtQ3RybC1YIik7fSwKICAgICJDdHJsLVciOiBmdW5jdGlvbihjbSkge2FkZFRvUmluZyhjbS5nZXRTZWxlY3Rpb24oKSk7IGNtLnJlcGxhY2VTZWxlY3Rpb24oIiIpO30sCiAgICAiQ3RybC1BbHQtVyI6IGZ1bmN0aW9uKGNtKSB7YWRkVG9SaW5nKGNtLmdldFNlbGVjdGlvbigpKTsgY20ucmVwbGFjZVNlbGVjdGlvbigiIik7fSwKICAgICJBbHQtVyI6IGZ1bmN0aW9uKGNtKSB7YWRkVG9SaW5nKGNtLmdldFNlbGVjdGlvbigpKTt9LAogICAgIkN0cmwtWSI6IGZ1bmN0aW9uKGNtKSB7Y20ucmVwbGFjZVNlbGVjdGlvbihnZXRGcm9tUmluZygpKTt9LAogICAgIkFsdC1ZIjogZnVuY3Rpb24oY20pIHtjbS5yZXBsYWNlU2VsZWN0aW9uKHBvcEZyb21SaW5nKCkpO30sCiAgICAiQ3RybC0vIjogInVuZG8iLCAiU2hpZnQtQ3RybC0tIjogInVuZG8iLCAiU2hpZnQtQWx0LSwiOiAiZ29Eb2NTdGFydCIsICJTaGlmdC1BbHQtLiI6ICJnb0RvY0VuZCIsCiAgICAiQ3RybC1TIjogImZpbmROZXh0IiwgIkN0cmwtUiI6ICJmaW5kUHJldiIsICJDdHJsLUciOiAiY2xlYXJTZWFyY2giLCAiU2hpZnQtQWx0LTUiOiAicmVwbGFjZSIsCiAgICAiQ3RybC1aIjogInVuZG8iLCAiQ21kLVoiOiAidW5kbyIsICJBbHQtLyI6ICJhdXRvY29tcGxldGUiLCAiQWx0LVYiOiAiZ29QYWdlVXAiLAogICAgIkN0cmwtSiI6ICJuZXdsaW5lQW5kSW5kZW50IiwgIkVudGVyIjogZmFsc2UsICJUYWIiOiAiaW5kZW50QXV0byIsCiAgICBmYWxsdGhyb3VnaDogWyJiYXNpYyIsICJlbWFjc3kiXQogIH07CgogIENvZGVNaXJyb3Iua2V5TWFwWyJlbWFjcy1DdHJsLVgiXSA9IHsKICAgICJDdHJsLVMiOiAic2F2ZSIsICJDdHJsLVciOiAic2F2ZSIsICJTIjogInNhdmVBbGwiLCAiRiI6ICJvcGVuIiwgIlUiOiAidW5kbyIsICJLIjogImNsb3NlIiwKICAgIGF1dG86ICJlbWFjcyIsIG5vZmFsbHRocm91Z2g6IHRydWUKICB9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/keymap/vim.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFN1cHBvcnRlZCBrZXliaW5kaW5nczoKICoKICogICBNb3Rpb246CiAqICAgaCwgaiwgaywgbAogKiAgIGUsIEUsIHcsIFcsIGIsIEIsIGdlLCBnRQogKiAgIGY8Y2hhcmFjdGVyPiwgRjxjaGFyYWN0ZXI+LCB0PGNoYXJhY3Rlcj4sIFQ8Y2hhcmFjdGVyPgogKiAgICQsIF4sIDAKICogICBnZywgRwogKiAgICUKICogICAnPGNoYXJhY3Rlcj4sIGA8Y2hhcmFjdGVyPgogKgogKiAgIE9wZXJhdG9yOgogKiAgIGQsIHksIGMKICogICBkZCwgeXksIGNjCiAqICAgZ34sIGd+Z34KICogICA+LCA8LCA+PiwgPDwKICoKICogICBPcGVyYXRvci1Nb3Rpb246CiAqICAgeCwgWCwgRCwgWSwgQywgfgogKgogKiAgIEFjdGlvbjoKICogICBhLCBpLCBzLCBBLCBJLCBTLCBvLCBPCiAqICAgSgogKiAgIHUsIEN0cmwtcgogKiAgIG08Y2hhcmFjdGVyPgogKiAgIHI8Y2hhcmFjdGVyPgogKgogKiAgIE1vZGVzOgogKiAgIEVTQyAtIGxlYXZlIGluc2VydCBtb2RlLCB2aXN1YWwgbW9kZSwgYW5kIGNsZWFyIGlucHV0IHN0YXRlLgogKiAgIEN0cmwtWywgQ3RybC1jIC0gc2FtZSBhcyBFU0MuCiAqCiAqIFJlZ2lzdGVyczogdW5hbWVkLCAtLCBhLXosIEEtWiwgMC05CiAqICAgKERvZXMgbm90IHJlc3BlY3QgdGhlIHNwZWNpYWwgY2FzZSBmb3IgbnVtYmVyIHJlZ2lzdGVycyB3aGVuIGRlbGV0ZQogKiAgICBvcGVyYXRvciBpcyBtYWRlIHdpdGggdGhlc2UgY29tbWFuZHM6ICUsICgsICksICAsIC8sID8sIG4sIE4sIHssIH0gKQogKiAgIFRPRE86IEltcGxlbWVudCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycy4KICogTWFya3M6IGEteiwgQS1aLCBhbmQgMC05CiAqICAgVE9ETzogSW1wbGVtZW50IHRoZSByZW1haW5pbmcgc3BlY2lhbCBtYXJrcy4gVGhleSBoYXZlIG1vcmUgY29tcGxleAogKiAgICAgICBiZWhhdmlvci4KICoKICogQ29kZSBzdHJ1Y3R1cmU6CiAqICAxLiBEZWZhdWx0IGtleW1hcAogKiAgMi4gVmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZCBzaG9ydCBiYXNpYyBoZWxwZXJzCiAqICAzLiBJbnN0YW5jZSAoRXh0ZXJuYWwgQVBJKSBpbXBsZW1lbnRhdGlvbgogKiAgNC4gSW50ZXJuYWwgc3RhdGUgdHJhY2tpbmcgb2JqZWN0cyAoaW5wdXQgc3RhdGUsIGNvdW50ZXIpIGltcGxlbWVudGF0aW9uCiAqICAgICBhbmQgaW5zdGFuc3RpYXRpb24KICogIDUuIEtleSBoYW5kbGVyICh0aGUgbWFpbiBjb21tYW5kIGRpc3BhdGNoZXIpIGltcGxlbWVudGF0aW9uCiAqICA2LiBNb3Rpb24sIG9wZXJhdG9yLCBhbmQgYWN0aW9uIGltcGxlbWVudGF0aW9ucwogKiAgNy4gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIGtleSBoYW5kbGVyLCBtb3Rpb25zLCBvcGVyYXRvcnMsIGFuZCBhY3Rpb25zCiAqICA4LiBTZXQgdXAgVmltIHRvIHdvcmsgYXMgYSBrZXltYXAgZm9yIENvZGVNaXJyb3IuCiAqLwoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIGRlZmF1bHRLZXltYXAgPSBbCiAgICAvLyBLZXkgdG8ga2V5IG1hcHBpbmcuIFRoaXMgZ29lcyBmaXJzdCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIG92ZXJyaWRlCiAgICAvLyBleGlzdGluZyBtYXBwaW5ncy4KICAgIHsga2V5czogWydMZWZ0J10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydoJ10gfSwKICAgIHsga2V5czogWydSaWdodCddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnbCddIH0sCiAgICB7IGtleXM6IFsnVXAnXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ2snXSB9LAogICAgeyBrZXlzOiBbJ0Rvd24nXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ2onXSB9LAogICAgeyBrZXlzOiBbJ1NwYWNlJ10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydsJ10gfSwKICAgIHsga2V5czogWydCYWNrc3BhY2UnXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ2gnXSB9LAogICAgeyBrZXlzOiBbJ0N0cmwtU3BhY2UnXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ1cnXSB9LAogICAgeyBrZXlzOiBbJ0N0cmwtQmFja3NwYWNlJ10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydCJ10gfSwKICAgIHsga2V5czogWydTaGlmdC1TcGFjZSddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsndyddIH0sCiAgICB7IGtleXM6IFsnU2hpZnQtQmFja3NwYWNlJ10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydiJ10gfSwKICAgIHsga2V5czogWydDdHJsLW4nXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ2onXSB9LAogICAgeyBrZXlzOiBbJ0N0cmwtcCddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnayddIH0sCiAgICB7IGtleXM6IFsnQ3RybC1bJ10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydFc2MnXSB9LAogICAgeyBrZXlzOiBbJ0N0cmwtYyddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnRXNjJ10gfSwKICAgIHsga2V5czogWydzJ10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydjJywgJ2wnXSB9LAogICAgeyBrZXlzOiBbJ1MnXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ2MnLCAnYyddIH0sCiAgICB7IGtleXM6IFsnSG9tZSddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnMCddIH0sCiAgICB7IGtleXM6IFsnRW5kJ10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWyckJ10gfSwKICAgIHsga2V5czogWydQYWdlVXAnXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ0N0cmwtYiddIH0sCiAgICB7IGtleXM6IFsnUGFnZURvd24nXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ0N0cmwtZiddIH0sCiAgICAvLyBNb3Rpb25zCiAgICB7IGtleXM6IFsnaCddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlDaGFyYWN0ZXJzJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlIH19LAogICAgeyBrZXlzOiBbJ2wnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5Q2hhcmFjdGVycycsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2onXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5TGluZXMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgbGluZXdpc2U6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnayddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlMaW5lcycsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgbGluZXdpc2U6IHRydWUgfX0sCiAgICB7IGtleXM6IFsndyddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlXb3JkcycsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCB3b3JkRW5kOiBmYWxzZSB9fSwKICAgIHsga2V5czogWydXJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVCeVdvcmRzJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIHdvcmRFbmQ6IGZhbHNlLCBiaWdXb3JkOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2UnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5V29yZHMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgd29yZEVuZDogdHJ1ZSwgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0UnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5V29yZHMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgd29yZEVuZDogdHJ1ZSwgYmlnV29yZDogdHJ1ZSwKICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2InXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5V29yZHMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHdvcmRFbmQ6IGZhbHNlIH19LAogICAgeyBrZXlzOiBbJ0InXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5V29yZHMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHdvcmRFbmQ6IGZhbHNlLCBiaWdXb3JkOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2cnLCAnZSddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlXb3JkcycsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgd29yZEVuZDogdHJ1ZSwgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2cnLCAnRSddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlXb3JkcycsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgd29yZEVuZDogdHJ1ZSwgYmlnV29yZDogdHJ1ZSwKICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0N0cmwtZiddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlQYWdlJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0N0cmwtYiddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlQYWdlJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSB9fSwKICAgIHsga2V5czogWydnJywgJ2cnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZVRvTGluZU9yRWRnZU9mRG9jdW1lbnQnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIGV4cGxpY2l0UmVwZWF0OiB0cnVlLCBsaW5ld2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWydHJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVUb0xpbmVPckVkZ2VPZkRvY3VtZW50JywKICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIGV4cGxpY2l0UmVwZWF0OiB0cnVlLCBsaW5ld2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWycwJ10sIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlVG9TdGFydE9mTGluZScgfSwKICAgIHsga2V5czogWydeJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVUb0ZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcicgfSwKICAgIHsga2V5czogWyckJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVUb0VvbCcsCiAgICAgICAgbW90aW9uQXJnczogeyBpbmNsdXNpdmU6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnJSddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlVG9NYXRjaGVkU3ltYm9sJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGluY2x1c2l2ZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWydmJywgJ2NoYXJhY3RlciddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlVG9DaGFyYWN0ZXInLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSAsIGluY2x1c2l2ZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWydGJywgJ2NoYXJhY3RlciddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlVG9DaGFyYWN0ZXInLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6IFsndCcsICdjaGFyYWN0ZXInXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZVRpbGxDaGFyYWN0ZXInLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ1QnLCAnY2hhcmFjdGVyJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVUaWxsQ2hhcmFjdGVyJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlIH19LAogICAgeyBrZXlzOiBbJ1wnJywgJ2NoYXJhY3RlciddLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnZ29Ub01hcmsnIH0sCiAgICB7IGtleXM6IFsnYCcsICdjaGFyYWN0ZXInXSwgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ2dvVG9NYXJrJyB9LAogICAgeyBrZXlzOiBbJ3wnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZVRvQ29sdW1uJywKICAgICAgICBtb3Rpb25BcmdzOiB7IH19LAogICAgLy8gT3BlcmF0b3JzCiAgICB7IGtleXM6IFsnZCddLCB0eXBlOiAnb3BlcmF0b3InLCBvcGVyYXRvcjogJ2RlbGV0ZScgfSwKICAgIHsga2V5czogWyd5J10sIHR5cGU6ICdvcGVyYXRvcicsIG9wZXJhdG9yOiAneWFuaycgfSwKICAgIHsga2V5czogWydjJ10sIHR5cGU6ICdvcGVyYXRvcicsIG9wZXJhdG9yOiAnY2hhbmdlJywKICAgICAgICBvcGVyYXRvckFyZ3M6IHsgZW50ZXJJbnNlcnRNb2RlOiB0cnVlIH0gfSwKICAgIHsga2V5czogWyc+J10sIHR5cGU6ICdvcGVyYXRvcicsIG9wZXJhdG9yOiAnaW5kZW50JywKICAgICAgICBvcGVyYXRvckFyZ3M6IHsgaW5kZW50UmlnaHQ6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnPCddLCB0eXBlOiAnb3BlcmF0b3InLCBvcGVyYXRvcjogJ2luZGVudCcsCiAgICAgICAgb3BlcmF0b3JBcmdzOiB7IGluZGVudFJpZ2h0OiBmYWxzZSB9fSwKICAgIHsga2V5czogWydnJywgJ34nXSwgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICdzd2FwY2FzZScgfSwKICAgIHsga2V5czogWyduJ10sIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdmaW5kTmV4dCcgfSwKICAgIHsga2V5czogWydOJ10sIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdmaW5kUHJldicgfSwKICAgIC8vIE9wZXJhdG9yLU1vdGlvbiBkdWFsIGNvbW1hbmRzCiAgICB7IGtleXM6IFsneCddLCB0eXBlOiAnb3BlcmF0b3JNb3Rpb24nLCBvcGVyYXRvcjogJ2RlbGV0ZScsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5Q2hhcmFjdGVycycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9LAogICAgICAgIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiBmYWxzZSB9fSwKICAgIHsga2V5czogWydYJ10sIHR5cGU6ICdvcGVyYXRvck1vdGlvbicsIG9wZXJhdG9yOiAnZGVsZXRlJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlDaGFyYWN0ZXJzJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSB9LAogICAgICAgIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0QnXSwgdHlwZTogJ29wZXJhdG9yTW90aW9uJywgb3BlcmF0b3I6ICdkZWxldGUnLAogICAgICBtb3Rpb246ICdtb3ZlVG9Fb2wnLCBtb3Rpb25BcmdzOiB7IGluY2x1c2l2ZTogdHJ1ZSB9LAogICAgICAgIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ1knXSwgdHlwZTogJ29wZXJhdG9yTW90aW9uJywgb3BlcmF0b3I6ICd5YW5rJywKICAgICAgICBtb3Rpb246ICdtb3ZlVG9Fb2wnLCBtb3Rpb25BcmdzOiB7IGluY2x1c2l2ZTogdHJ1ZSB9LAogICAgICAgIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0MnXSwgdHlwZTogJ29wZXJhdG9yTW90aW9uJywKICAgICAgICBvcGVyYXRvcjogJ2NoYW5nZScsIG9wZXJhdG9yQXJnczogeyBlbnRlckluc2VydE1vZGU6IHRydWUgfSwKICAgICAgICBtb3Rpb246ICdtb3ZlVG9Fb2wnLCBtb3Rpb25BcmdzOiB7IGluY2x1c2l2ZTogdHJ1ZSB9LAogICAgICAgIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ34nXSwgdHlwZTogJ29wZXJhdG9yTW90aW9uJywgb3BlcmF0b3I6ICdzd2FwY2FzZScsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5Q2hhcmFjdGVycycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9fSwKICAgIC8vIEFjdGlvbnMKICAgIHsga2V5czogWydhJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdlbnRlckluc2VydE1vZGUnLAogICAgICAgIGFjdGlvbkFyZ3M6IHsgaW5zZXJ0QXQ6ICdjaGFyQWZ0ZXInIH19LAogICAgeyBrZXlzOiBbJ0EnXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2VudGVySW5zZXJ0TW9kZScsCiAgICAgICAgYWN0aW9uQXJnczogeyBpbnNlcnRBdDogJ2VvbCcgfX0sCiAgICB7IGtleXM6IFsnaSddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnZW50ZXJJbnNlcnRNb2RlJyB9LAogICAgeyBrZXlzOiBbJ0knXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2VudGVySW5zZXJ0TW9kZScsCiAgICAgICAgbW90aW9uOiAnbW92ZVRvRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyJyB9LAogICAgeyBrZXlzOiBbJ28nXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ25ld0xpbmVBbmRFbnRlckluc2VydE1vZGUnLAogICAgICAgIGFjdGlvbkFyZ3M6IHsgYWZ0ZXI6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnTyddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnbmV3TGluZUFuZEVudGVySW5zZXJ0TW9kZScsCiAgICAgICAgYWN0aW9uQXJnczogeyBhZnRlcjogZmFsc2UgfX0sCiAgICB7IGtleXM6IFsndiddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAndG9nZ2xlVmlzdWFsTW9kZScgfSwKICAgIHsga2V5czogWydWJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICd0b2dnbGVWaXN1YWxNb2RlJywKICAgICAgICBhY3Rpb25BcmdzOiB7IGxpbmV3aXNlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0onXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2pvaW5MaW5lcycgfSwKICAgIHsga2V5czogWydwJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdwYXN0ZScsCiAgICAgICAgYWN0aW9uQXJnczogeyBhZnRlcjogdHJ1ZSB9fSwKICAgIHsga2V5czogWydQJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdwYXN0ZScsCiAgICAgICAgYWN0aW9uQXJnczogeyBhZnRlcjogZmFsc2UgfX0sCiAgICB7IGtleXM6IFsncicsICdjaGFyYWN0ZXInXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3JlcGxhY2UnIH0sCiAgICB7IGtleXM6IFsndSddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAndW5kbycgfSwKICAgIHsga2V5czogWydDdHJsLXInXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3JlZG8nIH0sCiAgICB7IGtleXM6IFsnbScsICdjaGFyYWN0ZXInXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3NldE1hcmsnIH0sCiAgICB7IGtleXM6IFsnXCInLCAnY2hhcmFjdGVyJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdzZXRSZWdpc3RlcicgfSwKICAgIHsga2V5czogWycsJywgJy8nXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2NsZWFyU2VhcmNoSGlnaGxpZ2h0JyB9LAogICAgLy8gVGV4dCBvYmplY3QgbW90aW9ucwogICAgeyBrZXlzOiBbJ2EnLCAnY2hhcmFjdGVyJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ3RleHRPYmplY3RNYW5pcHVsYXRpb24nIH0sCiAgICB7IGtleXM6IFsnaScsICdjaGFyYWN0ZXInXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAndGV4dE9iamVjdE1hbmlwdWxhdGlvbicsCiAgICAgICAgbW90aW9uQXJnczogeyB0ZXh0T2JqZWN0SW5uZXI6IHRydWUgfX0sCiAgICAvLyBTZWFyY2gKICAgIHsga2V5czogWycvJ10sIHR5cGU6ICdzZWFyY2gnLAogICAgICAgIHNlYXJjaEFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgcXVlcnlTcmM6ICdwcm9tcHQnIH19LAogICAgeyBrZXlzOiBbJz8nXSwgdHlwZTogJ3NlYXJjaCcsCiAgICAgICAgc2VhcmNoQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgcXVlcnlTcmM6ICdwcm9tcHQnIH19LAogICAgeyBrZXlzOiBbJyonXSwgdHlwZTogJ3NlYXJjaCcsCiAgICAgICAgc2VhcmNoQXJnczogeyBmb3J3YXJkOiB0cnVlLCBxdWVyeVNyYzogJ3dvcmRVbmRlckN1cnNvcicgfX0sCiAgICB7IGtleXM6IFsnIyddLCB0eXBlOiAnc2VhcmNoJywKICAgICAgICBzZWFyY2hBcmdzOiB7IGZvcndhcmQ6IGZhbHNlLCBxdWVyeVNyYzogJ3dvcmRVbmRlckN1cnNvcicgfX0sCiAgICAvLyBFeCBjb21tYW5kCiAgICB7IGtleXM6IFsnOiddLCB0eXBlOiAnZXgnIH0KICBdOwoKICB2YXIgVmltID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgYWxwaGFiZXRSZWdleCA9IC9bQS1aYS16XS87CiAgICB2YXIgbnVtYmVyUmVnZXggPSAvW1xkXS87CiAgICB2YXIgd2hpdGVTcGFjZVJlZ2V4ID0gL1xzLzsKICAgIHZhciB3b3JkUmVnZXhwID0gWygvXHcvKSwgKC9bXlx3XHNdLyldLCBiaWdXb3JkUmVnZXhwID0gWygvXFMvKV07CiAgICBmdW5jdGlvbiBtYWtlS2V5UmFuZ2Uoc3RhcnQsIHNpemUpIHsKICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBzaXplOyBpKyspIHsKICAgICAgICBrZXlzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShpKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGtleXM7CiAgICB9CiAgICB2YXIgdXBwZXJDYXNlQWxwaGFiZXQgPSBtYWtlS2V5UmFuZ2UoNjUsIDI2KTsKICAgIHZhciBsb3dlckNhc2VBbHBoYWJldCA9IG1ha2VLZXlSYW5nZSg5NywgMjYpOwogICAgdmFyIG51bWJlcnMgPSBtYWtlS2V5UmFuZ2UoNDgsIDEwKTsKICAgIHZhciBTUEVDSUFMX1NZTUJPTFMgPSAnfmAhQCMkJV4mKigpXy0rPVt7fV1cXHwvPy4sPD46O1wiXCcnOwogICAgdmFyIHNwZWNpYWxTeW1ib2xzID0gU1BFQ0lBTF9TWU1CT0xTLnNwbGl0KCcnKTsKICAgIHZhciBzcGVjaWFsS2V5cyA9IFsnTGVmdCcsICdSaWdodCcsICdVcCcsICdEb3duJywgJ1NwYWNlJywgJ0JhY2tzcGFjZScsCiAgICAgICAgJ0VzYycsICdIb21lJywgJ0VuZCcsICdQYWdlVXAnLCAnUGFnZURvd24nXTsKICAgIHZhciB2YWxpZE1hcmtzID0gdXBwZXJDYXNlQWxwaGFiZXQuY29uY2F0KGxvd2VyQ2FzZUFscGhhYmV0KS5jb25jYXQoCiAgICAgICAgbnVtYmVycyk7CiAgICB2YXIgdmFsaWRSZWdpc3RlcnMgPSB1cHBlckNhc2VBbHBoYWJldC5jb25jYXQobG93ZXJDYXNlQWxwaGFiZXQpLmNvbmNhdCgKICAgICAgICBudW1iZXJzKS5jb25jYXQoJy1cIicuc3BsaXQoJycpKTsKCiAgICBmdW5jdGlvbiBpc0FscGhhYmV0KGspIHsKICAgICAgcmV0dXJuIGFscGhhYmV0UmVnZXgudGVzdChrKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTGluZShjbSwgbGluZSkgewogICAgICByZXR1cm4gbGluZSA+PSAwICYmIGxpbmUgPCBjbS5saW5lQ291bnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTG93ZXJDYXNlKGspIHsKICAgICAgcmV0dXJuICgvXlthLXpdJC8pLnRlc3Qoayk7CiAgICB9CiAgICBmdW5jdGlvbiBpc01hdGNoYWJsZVN5bWJvbChrKSB7CiAgICAgIHJldHVybiAnKClbXXt9Jy5pbmRleE9mKGspICE9IC0xOwogICAgfQogICAgZnVuY3Rpb24gaXNOdW1iZXIoaykgewogICAgICByZXR1cm4gbnVtYmVyUmVnZXgudGVzdChrKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVXBwZXJDYXNlKGspIHsKICAgICAgcmV0dXJuICgvXltBLVpdJC8pLnRlc3Qoayk7CiAgICB9CiAgICBmdW5jdGlvbiBpc0FscGhhbnVtZXJpYyhrKSB7CiAgICAgIHJldHVybiAoL15bXHddJC8pLnRlc3Qoayk7CiAgICB9CiAgICBmdW5jdGlvbiBpc1doaXRlU3BhY2UoaykgewogICAgICByZXR1cm4gd2hpdGVTcGFjZVJlZ2V4LnRlc3Qoayk7CiAgICB9CiAgICBmdW5jdGlvbiBpc1doaXRlU3BhY2VTdHJpbmcoaykgewogICAgICByZXR1cm4gKC9eXHMqJC8pLnRlc3Qoayk7CiAgICB9CiAgICBmdW5jdGlvbiBpblJhbmdlSW5jbHVzaXZlKHgsIHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIHggPj0gc3RhcnQgJiYgeCA8PSBlbmQ7CiAgICB9CiAgICBmdW5jdGlvbiBpbkFycmF5KHZhbCwgYXJyKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGFycltpXSA9PSB2YWwpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gR2xvYmFsIFZpbSBzdGF0ZS4gQ2FsbCBnZXRWaW1HbG9iYWxTdGF0ZSB0byBnZXQgYW5kIGluaXRpYWxpemUuCiAgICB2YXIgdmltR2xvYmFsU3RhdGU7CiAgICBmdW5jdGlvbiBnZXRWaW1HbG9iYWxTdGF0ZSgpIHsKICAgICAgaWYgKCF2aW1HbG9iYWxTdGF0ZSkgewogICAgICAgIHZpbUdsb2JhbFN0YXRlID0gewogICAgICAgICAgLy8gVGhlIGN1cnJlbnQgc2VhcmNoIHF1ZXJ5LgogICAgICAgICAgc2VhcmNoUXVlcnk6IG51bGwsCiAgICAgICAgICAvLyBXaGV0aGVyIHdlIGFyZSBzZWFyY2hpbmcgYmFja3dhcmRzLgogICAgICAgICAgc2VhcmNoSXNSZXZlcnNlZDogZmFsc2UsCiAgICAgICAgICByZWdpc3RlckNvbnRyb2xsZXI6IG5ldyBSZWdpc3RlckNvbnRyb2xsZXIoe30pCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gdmltR2xvYmFsU3RhdGU7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRWaW1TdGF0ZShjbSkgewogICAgICBpZiAoIWNtLnZpbVN0YXRlKSB7CiAgICAgICAgLy8gU3RvcmUgaW5zdGFuY2Ugc3RhdGUgaW4gdGhlIENvZGVNaXJyb3Igb2JqZWN0LgogICAgICAgIGNtLnZpbVN0YXRlID0gewogICAgICAgICAgaW5wdXRTdGF0ZTogbmV3IElucHV0U3RhdGUoKSwKICAgICAgICAgIC8vIFdoZW4gdXNpbmcgamsgZm9yIG5hdmlnYXRpb24sIGlmIHlvdSBtb3ZlIGZyb20gYSBsb25nZXIgbGluZSB0byBhCiAgICAgICAgICAvLyBzaG9ydGVyIGxpbmUsIHRoZSBjdXJzb3IgbWF5IGNsaXAgdG8gdGhlIGVuZCBvZiB0aGUgc2hvcnRlciBsaW5lLgogICAgICAgICAgLy8gSWYgaiBpcyBwcmVzc2VkIGFnYWluIGFuZCBjdXJzb3IgZ29lcyB0byB0aGUgbmV4dCBsaW5lLCB0aGUKICAgICAgICAgIC8vIGN1cnNvciBzaG91bGQgZ28gYmFjayB0byBpdHMgaG9yaXpvbnRhbCBwb3NpdGlvbiBvbiB0aGUgbG9uZ2VyCiAgICAgICAgICAvLyBsaW5lIGlmIGl0IGNhbi4gVGhpcyBpcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBob3Jpem9udGFsIHBvc2l0aW9uLgogICAgICAgICAgbGFzdEhQb3M6IC0xLAogICAgICAgICAgLy8gVGhlIGxhc3QgbW90aW9uIGNvbW1hbmQgcnVuLiBDbGVhcmVkIGlmIGEgbm9uLW1vdGlvbiBjb21tYW5kIGdldHMKICAgICAgICAgIC8vIGV4ZWN1dGVkIGluIGJldHdlZW4uCiAgICAgICAgICBsYXN0TW90aW9uOiBudWxsLAogICAgICAgICAgbWFya3M6IHt9LAogICAgICAgICAgdmlzdWFsTW9kZTogZmFsc2UsCiAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gdmlzdWFsIGxpbmUgbW9kZS4gTm8gZWZmZWN0IGlmIHZpc3VhbE1vZGUgaXMgZmFsc2UuCiAgICAgICAgICB2aXN1YWxMaW5lOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNtLnZpbVN0YXRlOwogICAgfQoKICAgIHZhciB2aW1BcGk9IHsKICAgICAgYnVpbGRLZXlNYXA6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIFRPRE86IENvbnZlcnQga2V5bWFwIGludG8gZGljdGlvbmFyeSBmb3JtYXQgZm9yIGZhc3QgbG9va3VwLgogICAgICB9LAogICAgICAvLyBUZXN0aW5nIGhvb2ssIHRob3VnaCBpdCBtaWdodCBiZSB1c2VmdWwgdG8gZXhwb3NlIHRoZSByZWdpc3RlcgogICAgICAvLyBjb250cm9sbGVyIGFueXdheXMuCiAgICAgIGdldFJlZ2lzdGVyQ29udHJvbGxlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGdldFZpbUdsb2JhbFN0YXRlKCkucmVnaXN0ZXJDb250cm9sbGVyOwogICAgICB9LAogICAgICAvLyBUZXN0aW5nIGhvb2suCiAgICAgIGNsZWFyVmltR2xvYmFsU3RhdGVfOiBmdW5jdGlvbigpIHsKICAgICAgICB2aW1HbG9iYWxTdGF0ZSA9IG51bGw7CiAgICAgIH0sCiAgICAgIG1hcDogZnVuY3Rpb24obGhzLCByaHMpIHsKICAgICAgICAvLyBBZGQgdXNlciBkZWZpbmVkIGtleSBiaW5kaW5ncy4KICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLm1hcChsaHMsIHJocyk7CiAgICAgIH0sCiAgICAgIC8vIEluaXRpYWxpemVzIHZpbSBzdGF0ZSB2YXJpYWJsZSBvbiB0aGUgQ29kZU1pcnJvciBvYmplY3QuIFNob3VsZCBvbmx5IGJlCiAgICAgIC8vIGNhbGxlZCBsYXppbHkgYnkgaGFuZGxlS2V5IG9yIGZvciB0ZXN0aW5nLgogICAgICBtYXliZUluaXRTdGF0ZTogZnVuY3Rpb24oY20pIHsKICAgICAgICBnZXRWaW1TdGF0ZShjbSk7CiAgICAgIH0sCiAgICAgIC8vIFRoaXMgaXMgdGhlIG91dGVybW9zdCBmdW5jdGlvbiBjYWxsZWQgYnkgQ29kZU1pcnJvciwgYWZ0ZXIga2V5cyBoYXZlCiAgICAgIC8vIGJlZW4gbWFwcGVkIHRvIHRoZWlyIFZpbSBlcXVpdmFsZW50cy4KICAgICAgaGFuZGxlS2V5OiBmdW5jdGlvbihjbSwga2V5KSB7CiAgICAgICAgdmFyIGNvbW1hbmQ7CiAgICAgICAgdmFyIHZpbSA9IGdldFZpbVN0YXRlKGNtKTsKICAgICAgICBpZiAoa2V5ID09ICdFc2MnKSB7CiAgICAgICAgICAvLyBDbGVhciBpbnB1dCBzdGF0ZSBhbmQgZ2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUuCiAgICAgICAgICB2aW0uaW5wdXRTdGF0ZS5yZXNldCgpOwogICAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICAgIGV4aXRWaXN1YWxNb2RlKGNtLCB2aW0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUgJiYKICAgICAgICAgICAgY3Vyc29yRXF1YWwoY20uZ2V0Q3Vyc29yKCdoZWFkJyksIGNtLmdldEN1cnNvcignYW5jaG9yJykpKSB7CiAgICAgICAgICAvLyBUaGUgc2VsZWN0aW9uIHdhcyBjbGVhcmVkLiBFeGl0IHZpc3VhbCBtb2RlLgogICAgICAgICAgZXhpdFZpc3VhbE1vZGUoY20sIHZpbSk7CiAgICAgICAgfQogICAgICAgIGlmICghdmltLnZpc3VhbE1vZGUgJiYKICAgICAgICAgICAgIWN1cnNvckVxdWFsKGNtLmdldEN1cnNvcignaGVhZCcpLCBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKSkgewogICAgICAgICAgdmltLnZpc3VhbE1vZGUgPSB0cnVlOwogICAgICAgICAgdmltLnZpc3VhbExpbmUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGtleSAhPSAnMCcgfHwgKGtleSA9PSAnMCcgJiYgdmltLmlucHV0U3RhdGUuZ2V0UmVwZWF0KCkgPT09IDApKSB7CiAgICAgICAgICAvLyBIYXZlIHRvIHNwZWNpYWwgY2FzZSAwIHNpbmNlIGl0J3MgYm90aCBhIG1vdGlvbiBhbmQgYSBudW1iZXIuCiAgICAgICAgICBjb21tYW5kID0gY29tbWFuZERpc3BhdGNoZXIubWF0Y2hDb21tYW5kKGtleSwgZGVmYXVsdEtleW1hcCwgdmltKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFjb21tYW5kKSB7CiAgICAgICAgICBpZiAoaXNOdW1iZXIoa2V5KSkgewogICAgICAgICAgICAvLyBJbmNyZW1lbnQgY291bnQgdW5sZXNzIGNvdW50IGlzIDAgYW5kIGtleSBpcyAwLgogICAgICAgICAgICB2aW0uaW5wdXRTdGF0ZS5wdXNoUmVwZWF0RGlnaXQoa2V5KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PSAna2V5VG9LZXknKSB7CiAgICAgICAgICAvLyBUT0RPOiBwcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbi4KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWFuZC50b0tleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5oYW5kbGVLZXkoY20sIGNvbW1hbmQudG9LZXlzW2ldKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29tbWFuZERpc3BhdGNoZXIucHJvY2Vzc0NvbW1hbmQoY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIC8vIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgaW5wdXQgc3RhdGUuCiAgICBmdW5jdGlvbiBJbnB1dFN0YXRlKCkgewogICAgICB0aGlzLnJlc2V0KCk7CiAgICB9CiAgICBJbnB1dFN0YXRlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnByZWZpeFJlcGVhdCA9IFtdOwogICAgICB0aGlzLm1vdGlvblJlcGVhdCA9IFtdOwoKICAgICAgdGhpcy5vcGVyYXRvciA9IG51bGw7CiAgICAgIHRoaXMub3BlcmF0b3JBcmdzID0gbnVsbDsKICAgICAgdGhpcy5tb3Rpb24gPSBudWxsOwogICAgICB0aGlzLm1vdGlvbkFyZ3MgPSBudWxsOwogICAgICB0aGlzLmtleUJ1ZmZlciA9IFtdOyAvLyBGb3IgbWF0Y2hpbmcgbXVsdGkta2V5IGNvbW1hbmRzLgogICAgICB0aGlzLnJlZ2lzdGVyTmFtZSA9IG51bGw7IC8vIERlZmF1bHRzIHRvIHRoZSB1bmFtZWQgcmVnaXN0ZXIuCiAgICB9OwogICAgSW5wdXRTdGF0ZS5wcm90b3R5cGUucHVzaFJlcGVhdERpZ2l0ID0gZnVuY3Rpb24obikgewogICAgICBpZiAoIXRoaXMub3BlcmF0b3IpIHsKICAgICAgICB0aGlzLnByZWZpeFJlcGVhdCA9IHRoaXMucHJlZml4UmVwZWF0LmNvbmNhdChuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLm1vdGlvblJlcGVhdCA9IHRoaXMubW90aW9uUmVwZWF0LmNvbmNhdChuKTsKICAgICAgfQogICAgfTsKICAgIElucHV0U3RhdGUucHJvdG90eXBlLmdldFJlcGVhdCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgcmVwZWF0ID0gMDsKICAgICAgaWYgKHRoaXMucHJlZml4UmVwZWF0Lmxlbmd0aCA+IDAgfHwgdGhpcy5tb3Rpb25SZXBlYXQubGVuZ3RoID4gMCkgewogICAgICAgIHJlcGVhdCA9IDE7CiAgICAgICAgaWYgKHRoaXMucHJlZml4UmVwZWF0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHJlcGVhdCAqPSBwYXJzZUludCh0aGlzLnByZWZpeFJlcGVhdC5qb2luKCcnKSwgMTApOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5tb3Rpb25SZXBlYXQubGVuZ3RoID4gMCkgewogICAgICAgICAgcmVwZWF0ICo9IHBhcnNlSW50KHRoaXMubW90aW9uUmVwZWF0LmpvaW4oJycpLCAxMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXBlYXQ7CiAgICB9OwoKICAgIC8qCiAgICAgKiBSZWdpc3RlciBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgY29weSBhbmQgcGFzdGUgcmVnaXN0ZXJzLiAgQmVzaWRlcwogICAgICogdGV4dCwgYSByZWdpc3RlciBtdXN0IHN0b3JlIHdoZXRoZXIgaXQgaXMgbGluZXdpc2UgKGkuZS4sIHdoZW4gaXQgaXMKICAgICAqIHBhc3RlZCwgc2hvdWxkIGl0IGluc2VydCBpdHNlbGYgaW50byBhIG5ldyBsaW5lLCBvciBzaG91bGQgdGhlIHRleHQgYmUKICAgICAqIGluc2VydGVkIGF0IHRoZSBjdXJzb3IgcG9zaXRpb24uKQogICAgICovCiAgICBmdW5jdGlvbiBSZWdpc3Rlcih0ZXh0LCBsaW5ld2lzZSkgewogICAgICB0aGlzLmNsZWFyKCk7CiAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgdGhpcy5zZXQodGV4dCwgbGluZXdpc2UpOwogICAgICB9CiAgICB9CiAgICBSZWdpc3Rlci5wcm90b3R5cGUgPSB7CiAgICAgIHNldDogZnVuY3Rpb24odGV4dCwgbGluZXdpc2UpIHsKICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwogICAgICAgIHRoaXMubGluZXdpc2UgPSAhIWxpbmV3aXNlOwogICAgICB9LAogICAgICBhcHBlbmQ6IGZ1bmN0aW9uKHRleHQsIGxpbmV3aXNlKSB7CiAgICAgICAgLy8gaWYgdGhpcyByZWdpc3RlciBoYXMgZXZlciBiZWVuIHNldCB0byBsaW5ld2lzZSwgdXNlIGxpbmV3aXNlLgogICAgICAgIGlmIChsaW5ld2lzZSB8fCB0aGlzLmxpbmV3aXNlKSB7CiAgICAgICAgICB0aGlzLnRleHQgKz0gJ1xuJyArIHRleHQ7CiAgICAgICAgICB0aGlzLmxpbmV3aXNlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy50ZXh0ICs9IHRleHQ7CiAgICAgICAgfQogICAgICB9LAogICAgICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy50ZXh0ID0gJyc7CiAgICAgICAgdGhpcy5saW5ld2lzZSA9IGZhbHNlOwogICAgICB9LAogICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnRleHQ7IH0KICAgIH07CgogICAgLyoKICAgICAqIHZpbSByZWdpc3RlcnMgYWxsb3cgeW91IHRvIGtlZXAgbWFueSBpbmRlcGVuZGVudCBjb3B5IGFuZCBwYXN0ZSBidWZmZXJzLgogICAgICogU2VlIGh0dHA6Ly91c2V2aW0uY29tLzIwMTIvMDQvMTMvcmVnaXN0ZXJzLyBmb3IgYW4gaW50cm9kdWN0aW9uLgogICAgICoKICAgICAqIFJlZ2lzdGVyQ29udHJvbGxlciBrZWVwcyB0aGUgc3RhdGUgb2YgYWxsIHRoZSByZWdpc3RlcnMuICBBbiBpbml0aWFsCiAgICAgKiBzdGF0ZSBtYXkgYmUgcGFzc2VkIGluLiAgVGhlIHVubmFtZWQgcmVnaXN0ZXIgJyInIHdpbGwgYWx3YXlzIGJlCiAgICAgKiBvdmVycmlkZGVuLgogICAgICovCiAgICBmdW5jdGlvbiBSZWdpc3RlckNvbnRyb2xsZXIocmVnaXN0ZXJzKSB7CiAgICAgIHRoaXMucmVnaXN0ZXJzID0gcmVnaXN0ZXJzOwogICAgICB0aGlzLnVuYW1lZFJlZ2lzdGVyID0gcmVnaXN0ZXJzWydcIiddID0gbmV3IFJlZ2lzdGVyKCk7CiAgICB9CiAgICBSZWdpc3RlckNvbnRyb2xsZXIucHJvdG90eXBlID0gewogICAgICBwdXNoVGV4dDogZnVuY3Rpb24ocmVnaXN0ZXJOYW1lLCBvcGVyYXRvciwgdGV4dCwgbGluZXdpc2UpIHsKICAgICAgICAvLyBMb3dlcmNhc2UgYW5kIHVwcGVyY2FzZSByZWdpc3RlcnMgcmVmZXIgdG8gdGhlIHNhbWUgcmVnaXN0ZXIuCiAgICAgICAgLy8gVXBwZXJjYXNlIGp1c3QgbWVhbnMgYXBwZW5kLgogICAgICAgIHZhciByZWdpc3RlciA9IHRoaXMuaXNWYWxpZFJlZ2lzdGVyKHJlZ2lzdGVyTmFtZSkgPwogICAgICAgICAgICB0aGlzLmdldFJlZ2lzdGVyKHJlZ2lzdGVyTmFtZSkgOiBudWxsOwogICAgICAgIC8vIGlmIG5vIHJlZ2lzdGVyL2FuIGludmFsaWQgcmVnaXN0ZXIgd2FzIHNwZWNpZmllZCwgdGhpbmdzIGdvIHRvIHRoZQogICAgICAgIC8vIGRlZmF1bHQgcmVnaXN0ZXJzCiAgICAgICAgaWYgKCFyZWdpc3RlcikgewogICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikgewogICAgICAgICAgICBjYXNlICd5YW5rJzoKICAgICAgICAgICAgICAvLyBUaGUgMCByZWdpc3RlciBjb250YWlucyB0aGUgdGV4dCBmcm9tIHRoZSBtb3N0IHJlY2VudCB5YW5rLgogICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJzWycwJ10gPSBuZXcgUmVnaXN0ZXIodGV4dCwgbGluZXdpc2UpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkZWxldGUnOgogICAgICAgICAgICBjYXNlICdjaGFuZ2UnOgogICAgICAgICAgICAgIGlmICh0ZXh0LmluZGV4T2YoJ1xuJykgPT0gLTEpIHsKICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBsZXNzIHRoYW4gMSBsaW5lLiBVcGRhdGUgdGhlIHNtYWxsIGRlbGV0ZSByZWdpc3Rlci4KICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJzWyctJ10gPSBuZXcgUmVnaXN0ZXIodGV4dCwgbGluZXdpc2UpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBTaGlmdCBkb3duIHRoZSBjb250ZW50cyBvZiB0aGUgbnVtYmVyZWQgcmVnaXN0ZXJzIGFuZCBwdXQgdGhlCiAgICAgICAgICAgICAgICAvLyBkZWxldGVkIHRleHQgaW50byByZWdpc3RlciAxLgogICAgICAgICAgICAgICAgdGhpcy5zaGlmdE51bWVyaWNSZWdpc3RlcnNfKCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyc1snMSddID0gbmV3IFJlZ2lzdGVyKHRleHQsIGxpbmV3aXNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHVubmFtZWQgcmVnaXN0ZXIgaXMgc2V0IHRvIHdoYXQganVzdCBoYXBwZW5lZAogICAgICAgICAgdGhpcy51bmFtZWRSZWdpc3Rlci5zZXQodGV4dCwgbGluZXdpc2UpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgd2UndmUgZ290dGVuIHRvIHRoaXMgcG9pbnQsIHdlJ3ZlIGFjdHVhbGx5IHNwZWNpZmllZCBhIHJlZ2lzdGVyCiAgICAgICAgdmFyIGFwcGVuZCA9IGlzVXBwZXJDYXNlKHJlZ2lzdGVyTmFtZSk7CiAgICAgICAgaWYgKGFwcGVuZCkgewogICAgICAgICAgcmVnaXN0ZXIuYXBwZW5kKHRleHQsIGxpbmV3aXNlKTsKICAgICAgICAgIC8vIFRoZSB1bmFtZWQgcmVnaXN0ZXIgYWx3YXlzIGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgbGFzdCB1c2VkCiAgICAgICAgICAvLyByZWdpc3Rlci4KICAgICAgICAgIHRoaXMudW5hbWVkUmVnaXN0ZXIuYXBwZW5kKHRleHQsIGxpbmV3aXNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVnaXN0ZXIuc2V0KHRleHQsIGxpbmV3aXNlKTsKICAgICAgICAgIHRoaXMudW5hbWVkUmVnaXN0ZXIuc2V0KHRleHQsIGxpbmV3aXNlKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIEdldHMgdGhlIHJlZ2lzdGVyIG5hbWVkIEBuYW1lLiAgSWYgb25lIG9mIEBuYW1lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCwKICAgICAgLy8gY3JlYXRlIGl0LiAgSWYgQG5hbWUgaXMgaW52YWxpZCwgcmV0dXJuIHRoZSB1bmFtZWRSZWdpc3Rlci4KICAgICAgZ2V0UmVnaXN0ZXI6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZFJlZ2lzdGVyKG5hbWUpKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy51bmFtZWRSZWdpc3RlcjsKICAgICAgICB9CiAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoIXRoaXMucmVnaXN0ZXJzW25hbWVdKSB7CiAgICAgICAgICB0aGlzLnJlZ2lzdGVyc1tuYW1lXSA9IG5ldyBSZWdpc3RlcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlcnNbbmFtZV07CiAgICAgIH0sCiAgICAgIGlzVmFsaWRSZWdpc3RlcjogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHJldHVybiBuYW1lICYmIGluQXJyYXkobmFtZSwgdmFsaWRSZWdpc3RlcnMpOwogICAgICB9LAogICAgICBzaGlmdE51bWVyaWNSZWdpc3RlcnNfOiBmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKHZhciBpID0gOTsgaSA+PSAyOyBpLS0pIHsKICAgICAgICAgIHRoaXMucmVnaXN0ZXJzW2ldID0gdGhpcy5nZXRSZWdpc3RlcignJyArIChpIC0gMSkpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICB2YXIgY29tbWFuZERpc3BhdGNoZXIgPSB7CiAgICAgIG1hdGNoQ29tbWFuZDogZnVuY3Rpb24oa2V5LCBrZXlNYXAsIHZpbSkgewogICAgICAgIHZhciBpbnB1dFN0YXRlID0gdmltLmlucHV0U3RhdGU7CiAgICAgICAgdmFyIGtleXMgPSBpbnB1dFN0YXRlLmtleUJ1ZmZlci5jb25jYXQoa2V5KTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleU1hcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGNvbW1hbmQgPSBrZXlNYXBbaV07CiAgICAgICAgICBpZiAobWF0Y2hLZXlzUGFydGlhbChrZXlzLCBjb21tYW5kLmtleXMpKSB7CiAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA8IGNvbW1hbmQua2V5cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBNYXRjaGVzIHBhcnQgb2YgYSBtdWx0aS1rZXkgY29tbWFuZC4gQnVmZmVyIGFuZCB3YWl0IGZvciBuZXh0CiAgICAgICAgICAgICAgLy8gc3Ryb2tlLgogICAgICAgICAgICAgIGlucHV0U3RhdGUua2V5QnVmZmVyLnB1c2goa2V5KTsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoaW5wdXRTdGF0ZS5vcGVyYXRvciAmJiBjb21tYW5kLnR5cGUgPT0gJ2FjdGlvbicpIHsKICAgICAgICAgICAgICAgIC8vIElnbm9yZSBtYXRjaGVkIGFjdGlvbiBjb21tYW5kcyBhZnRlciBhbiBvcGVyYXRvci4gT3BlcmF0b3JzCiAgICAgICAgICAgICAgICAvLyBvbmx5IG9wZXJhdGUgb24gbW90aW9ucy4gVGhpcyBjaGVjayBpcyByZWFsbHkgZm9yIHRleHQKICAgICAgICAgICAgICAgIC8vIG9iamVjdHMgc2luY2UgYVcsIGFbIGV0Y3MgY29uZmxpY3RzIHdpdGggYS4KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBNYXRjaGVzIHdob2xlIGNvbWFuZC4gUmV0dXJuIHRoZSBjb21tYW5kLgogICAgICAgICAgICAgIGlmIChjb21tYW5kLmtleXNba2V5cy5sZW5ndGggLSAxXSA9PSAnY2hhcmFjdGVyJykgewogICAgICAgICAgICAgICAgaW5wdXRTdGF0ZS5zZWxlY3RlZENoYXJhY3RlciA9IGtleXNba2V5cy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaW5wdXRTdGF0ZS5rZXlCdWZmZXIgPSBbXTsKICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBDbGVhciB0aGUgYnVmZmVyIHNpbmNlIHRoZXJlIGFyZSBubyBwYXJ0aWFsIG1hdGNoZXMuCiAgICAgICAgaW5wdXRTdGF0ZS5rZXlCdWZmZXIgPSBbXTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSwKICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICBzd2l0Y2ggKGNvbW1hbmQudHlwZSkgewogICAgICAgICAgY2FzZSAnbW90aW9uJzoKICAgICAgICAgICAgdGhpcy5wcm9jZXNzTW90aW9uKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ29wZXJhdG9yJzoKICAgICAgICAgICAgdGhpcy5wcm9jZXNzT3BlcmF0b3IoY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnb3BlcmF0b3JNb3Rpb24nOgogICAgICAgICAgICB0aGlzLnByb2Nlc3NPcGVyYXRvck1vdGlvbihjbSwgdmltLCBjb21tYW5kKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdhY3Rpb24nOgogICAgICAgICAgICB0aGlzLnByb2Nlc3NBY3Rpb24oY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnc2VhcmNoJzoKICAgICAgICAgICAgdGhpcy5wcm9jZXNzU2VhcmNoKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2V4JzoKICAgICAgICAgIGNhc2UgJ2tleVRvRXgnOgogICAgICAgICAgICB0aGlzLnByb2Nlc3NFeChjbSwgdmltLCBjb21tYW5kKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHByb2Nlc3NNb3Rpb246IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICB2aW0uaW5wdXRTdGF0ZS5tb3Rpb24gPSBjb21tYW5kLm1vdGlvbjsKICAgICAgICB2aW0uaW5wdXRTdGF0ZS5tb3Rpb25BcmdzID0gY29weUFyZ3MoY29tbWFuZC5tb3Rpb25BcmdzKTsKICAgICAgICB0aGlzLmV2YWxJbnB1dChjbSwgdmltKTsKICAgICAgfSwKICAgICAgcHJvY2Vzc09wZXJhdG9yOiBmdW5jdGlvbihjbSwgdmltLCBjb21tYW5kKSB7CiAgICAgICAgdmFyIGlucHV0U3RhdGUgPSB2aW0uaW5wdXRTdGF0ZTsKICAgICAgICBpZiAoaW5wdXRTdGF0ZS5vcGVyYXRvcikgewogICAgICAgICAgaWYgKGlucHV0U3RhdGUub3BlcmF0b3IgPT0gY29tbWFuZC5vcGVyYXRvcikgewogICAgICAgICAgICAvLyBUeXBpbmcgYW4gb3BlcmF0b3IgdHdpY2UgbGlrZSAnZGQnIG1ha2VzIHRoZSBvcGVyYXRvciBvcGVyYXRlCiAgICAgICAgICAgIC8vIGxpbmV3aXNlCiAgICAgICAgICAgIGlucHV0U3RhdGUubW90aW9uID0gJ2V4cGFuZFRvTGluZSc7CiAgICAgICAgICAgIGlucHV0U3RhdGUubW90aW9uQXJncyA9IHsgbGluZXdpc2U6IHRydWUgfTsKICAgICAgICAgICAgdGhpcy5ldmFsSW5wdXQoY20sIHZpbSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIDIgZGlmZmVyZW50IG9wZXJhdG9ycyBpbiBhIHJvdyBkb2Vzbid0IG1ha2Ugc2Vuc2UuCiAgICAgICAgICAgIGlucHV0U3RhdGUucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW5wdXRTdGF0ZS5vcGVyYXRvciA9IGNvbW1hbmQub3BlcmF0b3I7CiAgICAgICAgaW5wdXRTdGF0ZS5vcGVyYXRvckFyZ3MgPSBjb3B5QXJncyhjb21tYW5kLm9wZXJhdG9yQXJncyk7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICAvLyBPcGVyYXRpbmcgb24gYSBzZWxlY3Rpb24gaW4gdmlzdWFsIG1vZGUuIFdlIGRvbid0IG5lZWQgYSBtb3Rpb24uCiAgICAgICAgICB0aGlzLmV2YWxJbnB1dChjbSwgdmltKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHByb2Nlc3NPcGVyYXRvck1vdGlvbjogZnVuY3Rpb24oY20sIHZpbSwgY29tbWFuZCkgewogICAgICAgIHZhciB2aXN1YWxNb2RlID0gdmltLnZpc3VhbE1vZGU7CiAgICAgICAgdmFyIG9wZXJhdG9yTW90aW9uQXJncyA9IGNvcHlBcmdzKGNvbW1hbmQub3BlcmF0b3JNb3Rpb25BcmdzKTsKICAgICAgICBpZiAob3BlcmF0b3JNb3Rpb25BcmdzKSB7CiAgICAgICAgICAvLyBPcGVyYXRvciBtb3Rpb25zIG1heSBoYXZlIHNwZWNpYWwgYmVoYXZpb3IgaW4gdmlzdWFsIG1vZGUuCiAgICAgICAgICBpZiAodmlzdWFsTW9kZSAmJiBvcGVyYXRvck1vdGlvbkFyZ3MudmlzdWFsTGluZSkgewogICAgICAgICAgICB2aW0udmlzdWFsTGluZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMucHJvY2Vzc09wZXJhdG9yKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgIGlmICghdmlzdWFsTW9kZSkgewogICAgICAgICAgdGhpcy5wcm9jZXNzTW90aW9uKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJvY2Vzc0FjdGlvbjogZnVuY3Rpb24oY20sIHZpbSwgY29tbWFuZCkgewogICAgICAgIHZhciBpbnB1dFN0YXRlID0gdmltLmlucHV0U3RhdGU7CiAgICAgICAgdmFyIHJlcGVhdCA9IGlucHV0U3RhdGUuZ2V0UmVwZWF0KCk7CiAgICAgICAgdmFyIHJlcGVhdElzRXhwbGljaXQgPSAhIXJlcGVhdDsKICAgICAgICB2YXIgYWN0aW9uQXJncyA9IGNvcHlBcmdzKGNvbW1hbmQuYWN0aW9uQXJncykgfHwge307CiAgICAgICAgaWYgKGlucHV0U3RhdGUuc2VsZWN0ZWRDaGFyYWN0ZXIpIHsKICAgICAgICAgIGFjdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXIgPSBpbnB1dFN0YXRlLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIH0KICAgICAgICAvLyBBY3Rpb25zIG1heSBvciBtYXkgbm90IGhhdmUgbW90aW9ucyBhbmQgb3BlcmF0b3JzLiBEbyB0aGVzZSBmaXJzdC4KICAgICAgICBpZiAoY29tbWFuZC5vcGVyYXRvcikgewogICAgICAgICAgdGhpcy5wcm9jZXNzT3BlcmF0b3IoY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgfQogICAgICAgIGlmIChjb21tYW5kLm1vdGlvbikgewogICAgICAgICAgdGhpcy5wcm9jZXNzTW90aW9uKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgIH0KICAgICAgICBpZiAoY29tbWFuZC5tb3Rpb24gfHwgY29tbWFuZC5vcGVyYXRvcikgewogICAgICAgICAgdGhpcy5ldmFsSW5wdXQoY20sIHZpbSk7CiAgICAgICAgfQogICAgICAgIGFjdGlvbkFyZ3MucmVwZWF0ID0gcmVwZWF0IHx8IDE7CiAgICAgICAgYWN0aW9uQXJncy5yZXBlYXRJc0V4cGxpY2l0ID0gcmVwZWF0SXNFeHBsaWNpdDsKICAgICAgICBhY3Rpb25BcmdzLnJlZ2lzdGVyTmFtZSA9IGlucHV0U3RhdGUucmVnaXN0ZXJOYW1lOwogICAgICAgIGlucHV0U3RhdGUucmVzZXQoKTsKICAgICAgICB2aW0ubGFzdE1vdGlvbiA9IG51bGwsCiAgICAgICAgYWN0aW9uc1tjb21tYW5kLmFjdGlvbl0oY20sIGFjdGlvbkFyZ3MsIHZpbSk7CiAgICAgIH0sCiAgICAgIHByb2Nlc3NTZWFyY2g6IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICBpZiAoIWNtLmdldFNlYXJjaEN1cnNvcikgewogICAgICAgICAgLy8gU2VhcmNoIGRlcGVuZHMgb24gU2VhcmNoQ3Vyc29yLgogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9yd2FyZCA9IGNvbW1hbmQuc2VhcmNoQXJncy5mb3J3YXJkOwogICAgICAgIGdldFNlYXJjaFN0YXRlKGNtKS5zZXRSZXZlcnNlZCghZm9yd2FyZCk7CiAgICAgICAgdmFyIHByb21wdFByZWZpeCA9IChmb3J3YXJkKSA/ICcvJyA6ICc/JzsKICAgICAgICBmdW5jdGlvbiBoYW5kbGVRdWVyeShxdWVyeSwgaWdub3JlQ2FzZSwgc21hcnRDYXNlKSB7CiAgICAgICAgICB1cGRhdGVTZWFyY2hRdWVyeShjbSwgcXVlcnksIGlnbm9yZUNhc2UsIHNtYXJ0Q2FzZSk7CiAgICAgICAgICBjb21tYW5kRGlzcGF0Y2hlci5wcm9jZXNzTW90aW9uKGNtLCB2aW0sIHsKICAgICAgICAgICAgdHlwZTogJ21vdGlvbicsCiAgICAgICAgICAgIG1vdGlvbjogJ2ZpbmROZXh0JwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG9uUHJvbXB0Q2xvc2UocXVlcnkpIHsKICAgICAgICAgIGhhbmRsZVF1ZXJ5KHF1ZXJ5LCB0cnVlIC8qKiBpZ25vcmVDYXNlICovLCB0cnVlIC8qKiBzbWFydENhc2UgKi8pOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGNvbW1hbmQuc2VhcmNoQXJncy5xdWVyeVNyYykgewogICAgICAgICAgY2FzZSAncHJvbXB0JzoKICAgICAgICAgICAgc2hvd1Byb21wdChjbSwgb25Qcm9tcHRDbG9zZSwgcHJvbXB0UHJlZml4LCBzZWFyY2hQcm9tcHREZXNjKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd3b3JkVW5kZXJDdXJzb3InOgogICAgICAgICAgICB2YXIgd29yZCA9IGV4cGFuZFdvcmRVbmRlckN1cnNvcihjbSwgZmFsc2UgLyoqIGluY2x1c2l2ZSAqLywKICAgICAgICAgICAgICAgIHRydWUgLyoqIGZvcndhcmQgKi8sIGZhbHNlIC8qKiBiaWdXb3JkICovLAogICAgICAgICAgICAgICAgdHJ1ZSAvKiogbm9TeW1ib2wgKi8pOwogICAgICAgICAgICB2YXIgaXNLZXl3b3JkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCF3b3JkKSB7CiAgICAgICAgICAgICAgd29yZCA9IGV4cGFuZFdvcmRVbmRlckN1cnNvcihjbSwgZmFsc2UgLyoqIGluY2x1c2l2ZSAqLywKICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiogZm9yd2FyZCAqLywgZmFsc2UgLyoqIGJpZ1dvcmQgKi8sCiAgICAgICAgICAgICAgICAgIGZhbHNlIC8qKiBub1N5bWJvbCAqLyk7CiAgICAgICAgICAgICAgaXNLZXl3b3JkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF3b3JkKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBxdWVyeSA9IGNtLmdldExpbmUod29yZC5zdGFydC5saW5lKS5zdWJzdHJpbmcod29yZC5zdGFydC5jaCwKICAgICAgICAgICAgICAgIHdvcmQuZW5kLmNoICsgMSk7CiAgICAgICAgICAgIGlmIChpc0tleXdvcmQpIHsKICAgICAgICAgICAgICBxdWVyeSA9ICdcXGInICsgcXVlcnkgKyAnXFxiJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBxdWVyeSA9IGVzY2FwZVJlZ2V4KHF1ZXJ5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbS5zZXRDdXJzb3Iod29yZC5zdGFydCk7CiAgICAgICAgICAgIGhhbmRsZVF1ZXJ5KHF1ZXJ5LCB0cnVlIC8qKiBpZ25vcmVDYXNlICovLCBmYWxzZSAvKiogc21hcnRDYXNlICovKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9LAogICAgICBwcm9jZXNzRXg6IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICBmdW5jdGlvbiBvblByb21wdENsb3NlKGlucHV0KSB7CiAgICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLnByb2Nlc3NDb21tYW5kKGNtLCBpbnB1dCk7CiAgICAgICAgfQogICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT0gJ2tleVRvRXgnKSB7CiAgICAgICAgICAvLyBIYW5kbGUgdXNlciBkZWZpbmVkIEV4IHRvIEV4IG1hcHBpbmdzCiAgICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLnByb2Nlc3NDb21tYW5kKGNtLCBjb21tYW5kLmV4QXJncy5pbnB1dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNob3dQcm9tcHQoY20sIG9uUHJvbXB0Q2xvc2UsICc6Jyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBldmFsSW5wdXQ6IGZ1bmN0aW9uKGNtLCB2aW0pIHsKICAgICAgICAvLyBJZiB0aGUgbW90aW9uIGNvbWFuZCBpcyBzZXQsIGV4ZWN1dGUgYm90aCB0aGUgb3BlcmF0b3IgYW5kIG1vdGlvbi4KICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuLgogICAgICAgIHZhciBpbnB1dFN0YXRlID0gdmltLmlucHV0U3RhdGU7CiAgICAgICAgdmFyIG1vdGlvbiA9IGlucHV0U3RhdGUubW90aW9uOwogICAgICAgIHZhciBtb3Rpb25BcmdzID0gaW5wdXRTdGF0ZS5tb3Rpb25BcmdzIHx8IHt9OwogICAgICAgIHZhciBvcGVyYXRvciA9IGlucHV0U3RhdGUub3BlcmF0b3I7CiAgICAgICAgdmFyIG9wZXJhdG9yQXJncyA9IGlucHV0U3RhdGUub3BlcmF0b3JBcmdzIHx8IHt9OwogICAgICAgIHZhciByZWdpc3Rlck5hbWUgPSBpbnB1dFN0YXRlLnJlZ2lzdGVyTmFtZTsKICAgICAgICB2YXIgc2VsZWN0aW9uRW5kID0gY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgICAgdmFyIHNlbGVjdGlvblN0YXJ0ID0gY20uZ2V0Q3Vyc29yKCdhbmNob3InKTsKICAgICAgICAvLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1ciBhbmQgc2VsZWN0aW9uIGN1cnNvcnMgYXJlIHRoYXQgY3VyIGlzCiAgICAgICAgLy8gYmVpbmcgb3BlcmF0ZWQgb24gYW5kIGlnbm9yZXMgdGhhdCB0aGVyZSBpcyBhIHNlbGVjdGlvbi4KICAgICAgICB2YXIgY3VyU3RhcnQgPSBjb3B5Q3Vyc29yKHNlbGVjdGlvbkVuZCk7CiAgICAgICAgdmFyIGN1ck9yaWdpbmFsID0gY29weUN1cnNvcihjdXJTdGFydCk7CiAgICAgICAgdmFyIGN1ckVuZDsKICAgICAgICB2YXIgcmVwZWF0OwogICAgICAgIGlmIChtb3Rpb25BcmdzLnJlcGVhdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAvLyBJZiBtb3Rpb25BcmdzIHNwZWNpZmllcyBhIHJlcGVhdCwgdGhhdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlCiAgICAgICAgICAvLyBpbnB1dCBzdGF0ZSdzIHJlcGVhdC4gVXNlZCBieSBFeCBtb2RlIGFuZCBjYW4gYmUgdXNlciBkZWZpbmVkLgogICAgICAgICAgcmVwZWF0ID0gaW5wdXRTdGF0ZS5tb3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwZWF0ID0gaW5wdXRTdGF0ZS5nZXRSZXBlYXQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlcGVhdCA+IDAgJiYgbW90aW9uQXJncy5leHBsaWNpdFJlcGVhdCkgewogICAgICAgICAgbW90aW9uQXJncy5yZXBlYXRJc0V4cGxpY2l0ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKG1vdGlvbkFyZ3Mubm9SZXBlYXQgfHwKICAgICAgICAgICAgKCFtb3Rpb25BcmdzLmV4cGxpY2l0UmVwZWF0ICYmIHJlcGVhdCA9PT0gMCkpIHsKICAgICAgICAgIHJlcGVhdCA9IDE7CiAgICAgICAgICBtb3Rpb25BcmdzLnJlcGVhdElzRXhwbGljaXQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGlucHV0U3RhdGUuc2VsZWN0ZWRDaGFyYWN0ZXIpIHsKICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY2hhcmFjdGVyIGlucHV0LCBzdGljayBpdCBpbiBhbGwgb2YgdGhlIGFyZyBhcnJheXMuCiAgICAgICAgICBtb3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyID0gb3BlcmF0b3JBcmdzLnNlbGVjdGVkQ2hhcmFjdGVyID0KICAgICAgICAgICAgICBpbnB1dFN0YXRlLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIH0KICAgICAgICBtb3Rpb25BcmdzLnJlcGVhdCA9IHJlcGVhdDsKICAgICAgICBpbnB1dFN0YXRlLnJlc2V0KCk7CiAgICAgICAgaWYgKG1vdGlvbikgewogICAgICAgICAgdmFyIG1vdGlvblJlc3VsdCA9IG1vdGlvbnNbbW90aW9uXShjbSwgbW90aW9uQXJncywgdmltKTsKICAgICAgICAgIHZpbS5sYXN0TW90aW9uID0gbW90aW9uc1ttb3Rpb25dOwogICAgICAgICAgaWYgKCFtb3Rpb25SZXN1bHQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1vdGlvblJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICAgIGN1clN0YXJ0ID0gbW90aW9uUmVzdWx0WzBdOwogICAgICAgICAgICBjdXJFbmQgPSBtb3Rpb25SZXN1bHRbMV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdXJFbmQgPSBtb3Rpb25SZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgbnVsbCByZXR1cm5zIGZyb20gbW90aW9uIGNvbW1hbmRzIGJldHRlci4KICAgICAgICAgIGlmICghY3VyRW5kKSB7CiAgICAgICAgICAgIGN1ckVuZCA9IHsgY2g6IGN1clN0YXJ0LmNoLCBsaW5lOiBjdXJTdGFydC5saW5lIH07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGlvbiBjcm9zc2VkIG92ZXIgaXRzZWxmLiBXaWxsIG5lZWQgdG8gc2hpZnQKICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IHBvaW50IGlmIHRoYXQgaGFwcGVuZWQuCiAgICAgICAgICAgIGlmIChjdXJzb3JJc0JlZm9yZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSAmJgogICAgICAgICAgICAgICAgKGN1cnNvckVxdWFsKHNlbGVjdGlvblN0YXJ0LCBjdXJFbmQpIHx8CiAgICAgICAgICAgICAgICAgICAgY3Vyc29ySXNCZWZvcmUoY3VyRW5kLCBzZWxlY3Rpb25TdGFydCkpKSB7CiAgICAgICAgICAgICAgLy8gVGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGhhcyBtb3ZlZCBmcm9tIGFmdGVyIHRoZSBzdGFydCB0bwogICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgc3RhcnQuIFdlIHdpbGwgc2hpZnQgdGhlIHN0YXJ0IHJpZ2h0IGJ5IDEuCiAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQuY2ggKz0gMTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3JJc0JlZm9yZShzZWxlY3Rpb25FbmQsIHNlbGVjdGlvblN0YXJ0KSAmJgogICAgICAgICAgICAgICAgKGN1cnNvckVxdWFsKHNlbGVjdGlvblN0YXJ0LCBjdXJFbmQpIHx8CiAgICAgICAgICAgICAgICAgICAgY3Vyc29ySXNCZWZvcmUoc2VsZWN0aW9uU3RhcnQsIGN1ckVuZCkpKSB7CiAgICAgICAgICAgICAgLy8gVGhlIG9wcG9zaXRlIGhhcHBlbmVkLiBXZSB3aWxsIHNoaWZ0IHRoZSBzdGFydCBsZWZ0IGJ5IDEuCiAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQuY2ggLT0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBjdXJFbmQ7CiAgICAgICAgICAgIGlmICh2aW0udmlzdWFsTGluZSkgewogICAgICAgICAgICAgIGlmIChjdXJzb3JJc0JlZm9yZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSkgewogICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQuY2ggPSAwOwogICAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kLmNoID0gbGluZUxlbmd0aChjbSwgc2VsZWN0aW9uRW5kLmxpbmUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQuY2ggPSAwOwogICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQuY2ggPSBsaW5lTGVuZ3RoKGNtLCBzZWxlY3Rpb25TdGFydC5saW5lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTmVlZCB0byBzZXQgdGhlIGN1cnNvciB0byBjbGVhciB0aGUgc2VsZWN0aW9uLiBPdGhlcndpc2UsCiAgICAgICAgICAgIC8vIENvZGVNaXJyb3IgY2FuJ3QgZmlndXJlIG91dCB0aGF0IHdlIGNoYW5nZWQgZGlyZWN0aW9ucy4uLgogICAgICAgICAgICBjbS5zZXRDdXJzb3Ioc2VsZWN0aW9uU3RhcnQpOwogICAgICAgICAgICBjbS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7CiAgICAgICAgICB9IGVsc2UgaWYgKCFvcGVyYXRvcikgewogICAgICAgICAgICBjdXJFbmQgPSBjbGlwQ3Vyc29yVG9Db250ZW50KGNtLCBjdXJFbmQpOwogICAgICAgICAgICBjbS5zZXRDdXJzb3IoY3VyRW5kLmxpbmUsIGN1ckVuZC5jaCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAob3BlcmF0b3IpIHsKICAgICAgICAgIHZhciBpbnZlcnRlZCA9IGZhbHNlOwogICAgICAgICAgdmltLmxhc3RNb3Rpb24gPSBudWxsOwogICAgICAgICAgb3BlcmF0b3JBcmdzLnJlcGVhdCA9IHJlcGVhdDsgLy8gSW5kZW50IGluIHZpc3VhbCBtb2RlIG5lZWRzIHRoaXMuCiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgY3VyU3RhcnQgPSBzZWxlY3Rpb25TdGFydDsKICAgICAgICAgICAgY3VyRW5kID0gc2VsZWN0aW9uRW5kOwogICAgICAgICAgICBtb3Rpb25BcmdzLmluY2x1c2l2ZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBTd2FwIHN0YXJ0IGFuZCBlbmQgaWYgbW90aW9uIHdhcyBiYWNrd2FyZC4KICAgICAgICAgIGlmIChjdXJzb3JJc0JlZm9yZShjdXJFbmQsIGN1clN0YXJ0KSkgewogICAgICAgICAgICB2YXIgdG1wID0gY3VyU3RhcnQ7CiAgICAgICAgICAgIGN1clN0YXJ0ID0gY3VyRW5kOwogICAgICAgICAgICBjdXJFbmQgPSB0bXA7CiAgICAgICAgICAgIGludmVydGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb3Rpb25BcmdzLmluY2x1c2l2ZSAmJiAhKHZpbS52aXN1YWxNb2RlICYmIGludmVydGVkKSkgewogICAgICAgICAgICAvLyBNb3ZlIHRoZSBzZWxlY3Rpb24gZW5kIG9uZSB0byB0aGUgcmlnaHQgdG8gaW5jbHVkZSB0aGUgbGFzdAogICAgICAgICAgICAvLyBjaGFyYWN0ZXIuCiAgICAgICAgICAgIGN1ckVuZC5jaCsrOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGxpbmV3aXNlID0gbW90aW9uQXJncy5saW5ld2lzZSB8fAogICAgICAgICAgICAgICh2aW0udmlzdWFsTW9kZSAmJiB2aW0udmlzdWFsTGluZSk7CiAgICAgICAgICBpZiAobGluZXdpc2UpIHsKICAgICAgICAgICAgLy8gRXhwYW5kIHNlbGVjdGlvbiB0byBlbnRpcmUgbGluZS4KICAgICAgICAgICAgZXhwYW5kU2VsZWN0aW9uVG9MaW5lKGNtLCBjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICAgIH0gZWxzZSBpZiAobW90aW9uQXJncy5mb3J3YXJkKSB7CiAgICAgICAgICAgIC8vIENsaXAgdG8gdHJhaWxpbmcgbmV3bGluZXMgb25seSBpZiB3ZSB0aGUgbW90aW9uIGdvZXMgZm9yd2FyZC4KICAgICAgICAgICAgY2xpcFRvTGluZShjbSwgY3VyU3RhcnQsIGN1ckVuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBvcGVyYXRvckFyZ3MucmVnaXN0ZXJOYW1lID0gcmVnaXN0ZXJOYW1lOwogICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBsaW5ld2lzZSBhcyBpdCBhZmZlY3RzIGhvdyBwYXN0ZSBhbmQgY2hhbmdlIGJlaGF2ZS4KICAgICAgICAgIG9wZXJhdG9yQXJncy5saW5ld2lzZSA9IGxpbmV3aXNlOwogICAgICAgICAgb3BlcmF0b3JzW29wZXJhdG9yXShjbSwgb3BlcmF0b3JBcmdzLCB2aW0sIGN1clN0YXJ0LAogICAgICAgICAgICAgIGN1ckVuZCwgY3VyT3JpZ2luYWwpOwogICAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICAgIGV4aXRWaXN1YWxNb2RlKGNtLCB2aW0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wZXJhdG9yQXJncy5lbnRlckluc2VydE1vZGUpIHsKICAgICAgICAgICAgYWN0aW9ucy5lbnRlckluc2VydE1vZGUoY20pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIHR5cGVkZWYge09iamVjdHtsaW5lOm51bWJlcixjaDpudW1iZXJ9fSBDdXJzb3IgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlCiAgICAgKiAgICAgcG9zaXRpb24gb2YgdGhlIGN1cnNvci4KICAgICAqLwogICAgLy8gQWxsIG9mIHRoZSBmdW5jdGlvbnMgYmVsb3cgcmV0dXJuIEN1cnNvciBvYmplY3RzLgogICAgdmFyIG1vdGlvbnMgPSB7CiAgICAgIGV4cGFuZFRvTGluZTogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICAvLyBFeHBhbmRzIGZvcndhcmQgdG8gZW5kIG9mIGxpbmUsIGFuZCB0aGVuIHRvIG5leHQgbGluZSBpZiByZXBlYXQgaXMKICAgICAgICAvLyA+MS4gRG9lcyBub3QgaGFuZGxlIGJhY2t3YXJkIG1vdGlvbiEKICAgICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgcmV0dXJuIHsgbGluZTogY3VyLmxpbmUgKyBtb3Rpb25BcmdzLnJlcGVhdCAtIDEsIGNoOiBJbmZpbml0eSB9OwogICAgICB9LAogICAgICBmaW5kTmV4dDogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHJldHVybiBmaW5kTmV4dChjbSwgZmFsc2UgLyoqIHByZXYgKi8sIG1vdGlvbkFyZ3MucmVwZWF0KTsKICAgICAgfSwKICAgICAgZmluZFByZXY6IGZ1bmN0aW9uKGNtLCBtb3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICByZXR1cm4gZmluZE5leHQoY20sIHRydWUgLyoqIHByZXYgKi8sIG1vdGlvbkFyZ3MucmVwZWF0KTsKICAgICAgfSwKICAgICAgZ29Ub01hcms6IGZ1bmN0aW9uKGNtLCBtb3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgbWFyayA9IHZpbS5tYXJrc1ttb3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyXTsKICAgICAgICBpZiAobWFyaykgewogICAgICAgICAgcmV0dXJuIG1hcmsuZmluZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSwKICAgICAgbW92ZUJ5Q2hhcmFjdGVyczogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmFyIHJlcGVhdCA9IG1vdGlvbkFyZ3MucmVwZWF0OwogICAgICAgIHZhciBjaCA9IG1vdGlvbkFyZ3MuZm9yd2FyZCA/IGN1ci5jaCArIHJlcGVhdCA6IGN1ci5jaCAtIHJlcGVhdDsKICAgICAgICByZXR1cm4geyBsaW5lOiBjdXIubGluZSwgY2g6IGNoIH07CiAgICAgIH0sCiAgICAgIG1vdmVCeUxpbmVzOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGVuZENoID0gY20uZ2V0Q3Vyc29yKCkuY2g7CiAgICAgICAgLy8gRGVwZW5kaW5nIHdoYXQgb3VyIGxhc3QgbW90aW9uIHdhcywgd2UgbWF5IHdhbnQgdG8gZG8gZGlmZmVyZW50CiAgICAgICAgLy8gdGhpbmdzLiBJZiBvdXIgbGFzdCBtb3Rpb24gd2FzIG1vdmluZyB2ZXJ0aWNhbGx5LCB3ZSB3YW50IHRvCiAgICAgICAgLy8gcHJlc2VydmUgdGhlIEhQb3MgZnJvbSBvdXIgbGFzdCBob3Jpem9udGFsIG1vdmUuICBJZiBvdXIgbGFzdCBtb3Rpb24KICAgICAgICAvLyB3YXMgZ29pbmcgdG8gdGhlIGVuZCBvZiBhIGxpbmUsIG1vdmluZyB2ZXJ0aWNhbGx5IHdlIHNob3VsZCBnbyB0bwogICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGV0Yy4KICAgICAgICBzd2l0Y2ggKHZpbS5sYXN0TW90aW9uKSB7CiAgICAgICAgICBjYXNlIHRoaXMubW92ZUJ5TGluZXM6CiAgICAgICAgICBjYXNlIHRoaXMubW92ZVRvQ29sdW1uOgogICAgICAgICAgY2FzZSB0aGlzLm1vdmVUb0VvbDoKICAgICAgICAgICAgZW5kQ2ggPSB2aW0ubGFzdEhQb3M7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdmltLmxhc3RIUG9zID0gZW5kQ2g7CiAgICAgICAgfQogICAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIGxpbmUgPSBtb3Rpb25BcmdzLmZvcndhcmQgPyBjdXIubGluZSArIHJlcGVhdCA6IGN1ci5saW5lIC0gcmVwZWF0OwogICAgICAgIGlmIChsaW5lIDwgMCB8fCBsaW5lID4gY20ubGluZUNvdW50KCkgLSAxKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgbGluZTogbGluZSwgY2g6IGVuZENoIH07CiAgICAgIH0sCiAgICAgIG1vdmVCeVBhZ2U6IGZ1bmN0aW9uKGNtLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgLy8gQ29kZU1pcnJvciBvbmx5IGV4cG9zZXMgZnVuY3Rpb25zIHRoYXQgbW92ZSB0aGUgY3Vyc29yIHBhZ2UgZG93biwgc28KICAgICAgICAvLyBkb2luZyB0aGlzIGJhZCBoYWNrIHRvIG1vdmUgdGhlIGN1cnNvciBhbmQgbW92ZSBpdCBiYWNrLiBldmFsSW5wdXQKICAgICAgICAvLyB3aWxsIG1vdmUgdGhlIGN1cnNvciB0byB3aGVyZSBpdCBzaG91bGQgYmUgaW4gdGhlIGVuZC4KICAgICAgICB2YXIgY3VyU3RhcnQgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgY20ubW92ZVYoKG1vdGlvbkFyZ3MuZm9yd2FyZCA/IHJlcGVhdCA6IC1yZXBlYXQpLCAncGFnZScpOwogICAgICAgIHZhciBjdXJFbmQgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogICAgICAgIHJldHVybiBjdXJFbmQ7CiAgICAgIH0sCiAgICAgIG1vdmVCeVdvcmRzOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncykgewogICAgICAgIHJldHVybiBtb3ZlVG9Xb3JkKGNtLCBtb3Rpb25BcmdzLnJlcGVhdCwgISFtb3Rpb25BcmdzLmZvcndhcmQsCiAgICAgICAgICAgICEhbW90aW9uQXJncy53b3JkRW5kLCAhIW1vdGlvbkFyZ3MuYmlnV29yZCk7CiAgICAgIH0sCiAgICAgIG1vdmVUaWxsQ2hhcmFjdGVyOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncykgewogICAgICAgIHZhciByZXBlYXQgPSBtb3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICB2YXIgY3VyRW5kID0gbW92ZVRvQ2hhcmFjdGVyKGNtLCByZXBlYXQsIG1vdGlvbkFyZ3MuZm9yd2FyZCwKICAgICAgICAgICAgbW90aW9uQXJncy5zZWxlY3RlZENoYXJhY3Rlcik7CiAgICAgICAgdmFyIGluY3JlbWVudCA9IG1vdGlvbkFyZ3MuZm9yd2FyZCA/IC0xIDogMTsKICAgICAgICBjdXJFbmQuY2ggKz0gaW5jcmVtZW50OwogICAgICAgIHJldHVybiBjdXJFbmQ7CiAgICAgIH0sCiAgICAgIG1vdmVUb0NoYXJhY3RlcjogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgcmV0dXJuIG1vdmVUb0NoYXJhY3RlcihjbSwgcmVwZWF0LCBtb3Rpb25BcmdzLmZvcndhcmQsCiAgICAgICAgICAgIG1vdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXIpOwogICAgICB9LAogICAgICBtb3ZlVG9Db2x1bW46IGZ1bmN0aW9uKGNtLCBtb3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgLy8gcmVwZWF0IGlzIGVxdWl2YWxlbnQgdG8gd2hpY2ggY29sdW1uIHdlIHdhbnQgdG8gbW92ZSB0byEKICAgICAgICB2aW0ubGFzdEhQb3MgPSByZXBlYXQgLSAxOwogICAgICAgIHJldHVybiBtb3ZlVG9Db2x1bW4oY20sIHJlcGVhdCk7CiAgICAgIH0sCiAgICAgIG1vdmVUb0VvbDogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2aW0ubGFzdEhQb3MgPSBJbmZpbml0eTsKICAgICAgICByZXR1cm4geyBsaW5lOiBjdXIubGluZSArIG1vdGlvbkFyZ3MucmVwZWF0IC0gMSwgY2g6IEluZmluaXR5IH07CiAgICAgIH0sCiAgICAgIG1vdmVUb0ZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcjogZnVuY3Rpb24oY20pIHsKICAgICAgICAvLyBHbyB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgd2hlcmUgdGhlIHRleHQgYmVnaW5zLCBvciB0aGUgZW5kIGZvcgogICAgICAgIC8vIHdoaXRlc3BhY2Utb25seSBsaW5lcwogICAgICAgIHZhciBjdXJzb3IgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUoY3Vyc29yLmxpbmUpOwogICAgICAgIHJldHVybiB7IGxpbmU6IGN1cnNvci5saW5lLAogICAgICAgICAgICBjaDogZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGN1cnNvci5saW5lKSkgfTsKICAgICAgfSwKICAgICAgbW92ZVRvTWF0Y2hlZFN5bWJvbDogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmFyIHN5bWJvbCA9IGNtLmdldExpbmUoY3Vyc29yLmxpbmUpLmNoYXJBdChjdXJzb3IuY2gpOwogICAgICAgIGlmIChpc01hdGNoYWJsZVN5bWJvbChzeW1ib2wpKSB7CiAgICAgICAgICByZXR1cm4gZmluZE1hdGNoZWRTeW1ib2woY20sIGNtLmdldEN1cnNvcigpLCBtb3Rpb25BcmdzLnN5bWJvbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBjdXJzb3I7CiAgICAgICAgfQogICAgICB9LAogICAgICBtb3ZlVG9TdGFydE9mTGluZTogZnVuY3Rpb24oY20pIHsKICAgICAgICB2YXIgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgcmV0dXJuIHsgbGluZTogY3Vyc29yLmxpbmUsIGNoOiAwIH07CiAgICAgIH0sCiAgICAgIG1vdmVUb0xpbmVPckVkZ2VPZkRvY3VtZW50OiBmdW5jdGlvbihjbSwgbW90aW9uQXJncykgewogICAgICAgIHZhciBsaW5lTnVtID0gbW90aW9uQXJncy5mb3J3YXJkID8gY20ubGluZUNvdW50KCkgLSAxIDogMDsKICAgICAgICBpZiAobW90aW9uQXJncy5yZXBlYXRJc0V4cGxpY2l0KSB7CiAgICAgICAgICBsaW5lTnVtID0gbW90aW9uQXJncy5yZXBlYXQgLSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBsaW5lOiBsaW5lTnVtLAogICAgICAgICAgICBjaDogZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGxpbmVOdW0pKSB9OwogICAgICB9LAogICAgICB0ZXh0T2JqZWN0TWFuaXB1bGF0aW9uOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncykgewogICAgICAgIHZhciBjaGFyYWN0ZXIgPSBtb3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIC8vIEluY2x1c2l2ZSBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgYW5kIGkKICAgICAgICAvLyBUT0RPOiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBhZGRpdGlvbmFsIHRleHQgb2JqZWN0IG1hcCB0byBwZXJmb3JtIHRleHQKICAgICAgICAvLyAgICAgb2JqZWN0IG9wZXJhdGlvbnMsIG1lcmdlIHRoZSBtYXAgaW50byB0aGUgZGVmYXVsdEtleU1hcCBhbmQgdXNlCiAgICAgICAgLy8gICAgIG1vdGlvbkFyZ3MgdG8gZGVmaW5lIGJlaGF2aW9yLiBEZWZpbmUgc2VwYXJhdGUgZW50cmllcyBmb3IgJ2F3JywKICAgICAgICAvLyAgICAgJ2l3JywgJ2FbJywgJ2lbJywgZXRjLgogICAgICAgIHZhciBpbmNsdXNpdmUgPSAhbW90aW9uQXJncy50ZXh0T2JqZWN0SW5uZXI7CiAgICAgICAgaWYgKCF0ZXh0T2JqZWN0c1tjaGFyYWN0ZXJdKSB7CiAgICAgICAgICAvLyBObyB0ZXh0IG9iamVjdCBkZWZpbmVkIGZvciB0aGlzLCBkb24ndCBtb3ZlLgogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHZhciB0bXAgPSB0ZXh0T2JqZWN0c1tjaGFyYWN0ZXJdKGNtLCBpbmNsdXNpdmUpOwogICAgICAgIHZhciBzdGFydCA9IHRtcC5zdGFydDsKICAgICAgICB2YXIgZW5kID0gdG1wLmVuZDsKICAgICAgICByZXR1cm4gW3N0YXJ0LCBlbmRdOwogICAgICB9CiAgICB9OwoKICAgIHZhciBvcGVyYXRvcnMgPSB7CiAgICAgIGNoYW5nZTogZnVuY3Rpb24oY20sIG9wZXJhdG9yQXJncywgdmltLCBjdXJTdGFydCwgY3VyRW5kKSB7CiAgICAgICAgZ2V0VmltR2xvYmFsU3RhdGUoKS5yZWdpc3RlckNvbnRyb2xsZXIucHVzaFRleHQoCiAgICAgICAgICAgIG9wZXJhdG9yQXJncy5yZWdpc3Rlck5hbWUsICdjaGFuZ2UnLCBjbS5nZXRSYW5nZShjdXJTdGFydCwgY3VyRW5kKSwKICAgICAgICAgICAgb3BlcmF0b3JBcmdzLmxpbmV3aXNlKTsKICAgICAgICBpZiAob3BlcmF0b3JBcmdzLmxpbmV3aXNlKSB7CiAgICAgICAgICAvLyBEZWxldGUgc3RhcnRpbmcgYXQgdGhlIGZpcnN0IG5vbndoaXRlc3BhY2UgY2hhcmFjdGVyIG9mIHRoZSBmaXJzdAogICAgICAgICAgLy8gbGluZSwgaW5zdGVhZCBvZiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgbGluZS4gVGhpcyB3YXkgd2UgZ2V0CiAgICAgICAgICAvLyBhbiBpbmRlbnQgd2hlbiB3ZSBnZXQgaW50byBpbnNlcnQgbW9kZS4gVGhpcyBiZWhhdmlvciBpc24ndCBxdWl0ZQogICAgICAgICAgLy8gY29ycmVjdCBiZWNhdXNlIHdlIHNob3VsZCB0cmVhdCB0aGlzIGFzIGEgY29tcGxldGVseSBuZXcgbGluZSwgYW5kCiAgICAgICAgICAvLyBpbmRlbnQgc2hvdWxkIGJlIHdoYXRldmVyIGNvZGVtaXJyb3IgdGhpbmtzIGlzIHRoZSByaWdodCBpbmRlbnQuCiAgICAgICAgICAvLyBCdXQgY20uaW5kZW50TGluZSBkb2Vzbid0IHNlZW0gd29yayBvbiBlbXB0eSBsaW5lcy4KICAgICAgICAgIC8vIFRPRE86IEZpeCB0aGUgYWJvdmUuCiAgICAgICAgICBjdXJTdGFydC5jaCA9CiAgICAgICAgICAgICAgZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGN1clN0YXJ0LmxpbmUpKTsKICAgICAgICAgIC8vIEluc2VydCBhbiBhZGRpdGlvbmFsIG5ld2xpbmUgc28gdGhhdCBpbnNlcnQgbW9kZSBjYW4gc3RhcnQgdGhlcmUuCiAgICAgICAgICAvLyBjdXJFbmQgc2hvdWxkIGJlIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5ldyBsaW5lLgogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKCdcbicsIGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoJycsIGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgIH0KICAgICAgICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogICAgICB9LAogICAgICAvLyBkZWxldGUgaXMgYSBqYXZhc2NyaXB0IGtleXdvcmQuCiAgICAgICdkZWxldGUnOiBmdW5jdGlvbihjbSwgb3BlcmF0b3JBcmdzLCB2aW0sIGN1clN0YXJ0LCBjdXJFbmQpIHsKICAgICAgICBnZXRWaW1HbG9iYWxTdGF0ZSgpLnJlZ2lzdGVyQ29udHJvbGxlci5wdXNoVGV4dCgKICAgICAgICAgICAgb3BlcmF0b3JBcmdzLnJlZ2lzdGVyTmFtZSwgJ2RlbGV0ZScsIGNtLmdldFJhbmdlKGN1clN0YXJ0LCBjdXJFbmQpLAogICAgICAgICAgICBvcGVyYXRvckFyZ3MubGluZXdpc2UpOwogICAgICAgIGNtLnJlcGxhY2VSYW5nZSgnJywgY3VyU3RhcnQsIGN1ckVuZCk7CiAgICAgICAgaWYgKG9wZXJhdG9yQXJncy5saW5ld2lzZSkgewogICAgICAgICAgY20uc2V0Q3Vyc29yKG1vdGlvbnMubW92ZVRvRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBpbmRlbnQ6IGZ1bmN0aW9uKGNtLCBvcGVyYXRvckFyZ3MsIHZpbSwgY3VyU3RhcnQsIGN1ckVuZCkgewogICAgICAgIHZhciBzdGFydExpbmUgPSBjdXJTdGFydC5saW5lOwogICAgICAgIHZhciBlbmRMaW5lID0gY3VyRW5kLmxpbmU7CiAgICAgICAgLy8gSW4gdmlzdWFsIG1vZGUsIG4+IHNoaWZ0cyB0aGUgc2VsZWN0aW9uIHJpZ2h0IG4gdGltZXMsIGluc3RlYWQgb2YKICAgICAgICAvLyBzaGlmdGluZyBuIGxpbmVzIHJpZ2h0IG9uY2UuCiAgICAgICAgdmFyIHJlcGVhdCA9ICh2aW0udmlzdWFsTW9kZSkgPyBvcGVyYXRvckFyZ3MucmVwZWF0IDogMTsKICAgICAgICBpZiAob3BlcmF0b3JBcmdzLmxpbmV3aXNlKSB7CiAgICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gZGVsZXRlIGEgbmV3bGluZSBpcyB0byBkZWxldGUgdW50aWwgdGhlIHN0YXJ0IG9mCiAgICAgICAgICAvLyB0aGUgbmV4dCBsaW5lLCBzbyBpbiBsaW5ld2lzZSBtb2RlIGV2YWxJbnB1dCB3aWxsIGluY2x1ZGUgdGhlIG5leHQKICAgICAgICAgIC8vIGxpbmUuIFdlIGRvbid0IHdhbnQgdGhpcyBpbiBpbmRlbnQsIHNvIHdlIGdvIGJhY2sgYSBsaW5lLgogICAgICAgICAgZW5kTGluZS0tOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRMaW5lOyBpIDw9IGVuZExpbmU7IGkrKykgewogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXBlYXQ7IGorKykgewogICAgICAgICAgICBjbS5pbmRlbnRMaW5lKGksIG9wZXJhdG9yQXJncy5pbmRlbnRSaWdodCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgICAgICAgY20uc2V0Q3Vyc29yKG1vdGlvbnMubW92ZVRvRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtKSk7CiAgICAgIH0sCiAgICAgIHN3YXBjYXNlOiBmdW5jdGlvbihjbSwgb3BlcmF0b3JBcmdzLCB2aW0sIGN1clN0YXJ0LCBjdXJFbmQsIGN1ck9yaWdpbmFsKSB7CiAgICAgICAgdmFyIHRvU3dhcCA9IGNtLmdldFJhbmdlKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgIHZhciBzd2FwcGVkID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b1N3YXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBjaGFyYWN0ZXIgPSB0b1N3YXAuY2hhckF0KGkpOwogICAgICAgICAgc3dhcHBlZCArPSBpc1VwcGVyQ2FzZShjaGFyYWN0ZXIpID8gY2hhcmFjdGVyLnRvTG93ZXJDYXNlKCkgOgogICAgICAgICAgICAgIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpOwogICAgICAgIH0KICAgICAgICBjbS5yZXBsYWNlUmFuZ2Uoc3dhcHBlZCwgY3VyU3RhcnQsIGN1ckVuZCk7CiAgICAgICAgY20uc2V0Q3Vyc29yKGN1ck9yaWdpbmFsKTsKICAgICAgfSwKICAgICAgeWFuazogZnVuY3Rpb24oY20sIG9wZXJhdG9yQXJncywgdmltLCBjdXJTdGFydCwgY3VyRW5kLCBjdXJPcmlnaW5hbCkgewogICAgICAgIGdldFZpbUdsb2JhbFN0YXRlKCkucmVnaXN0ZXJDb250cm9sbGVyLnB1c2hUZXh0KAogICAgICAgICAgICBvcGVyYXRvckFyZ3MucmVnaXN0ZXJOYW1lLCAneWFuaycsCiAgICAgICAgICAgIGNtLmdldFJhbmdlKGN1clN0YXJ0LCBjdXJFbmQpLCBvcGVyYXRvckFyZ3MubGluZXdpc2UpOwogICAgICAgIGNtLnNldEN1cnNvcihjdXJPcmlnaW5hbCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGFjdGlvbnMgPSB7CiAgICAgIGNsZWFyU2VhcmNoSGlnaGxpZ2h0OiBjbGVhclNlYXJjaEhpZ2hsaWdodCwKICAgICAgZW50ZXJJbnNlcnRNb2RlOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncykgewogICAgICAgIHZhciBpbnNlcnRBdCA9IChhY3Rpb25BcmdzKSA/IGFjdGlvbkFyZ3MuaW5zZXJ0QXQgOiBudWxsOwogICAgICAgIGlmIChpbnNlcnRBdCA9PSAnZW9sJykgewogICAgICAgICAgdmFyIGN1cnNvciA9IGNtLmdldEN1cnNvcigpOwogICAgICAgICAgY3Vyc29yID0geyBsaW5lOiBjdXJzb3IubGluZSwgY2g6IGxpbmVMZW5ndGgoY20sIGN1cnNvci5saW5lKSB9OwogICAgICAgICAgY20uc2V0Q3Vyc29yKGN1cnNvcik7CiAgICAgICAgfSBlbHNlIGlmIChpbnNlcnRBdCA9PSAnY2hhckFmdGVyJykgewogICAgICAgICAgY20uc2V0Q3Vyc29yKG9mZnNldEN1cnNvcihjbS5nZXRDdXJzb3IoKSwgMCwgMSkpOwogICAgICAgIH0KICAgICAgICBjbS5zZXRPcHRpb24oJ2tleU1hcCcsICd2aW0taW5zZXJ0Jyk7CiAgICAgIH0sCiAgICAgIHRvZ2dsZVZpc3VhbE1vZGU6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgcmVwZWF0ID0gYWN0aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIGN1clN0YXJ0ID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmFyIGN1ckVuZDsKICAgICAgICAvLyBUT0RPOiBUaGUgcmVwZWF0IHNob3VsZCBhY3R1YWxseSBzZWxlY3QgbnVtYmVyIG9mIGNoYXJhY3RlcnMvbGluZXMKICAgICAgICAvLyAgICAgZXF1YWwgdG8gdGhlIHJlcGVhdCB0aW1lcyB0aGUgc2l6ZSBvZiB0aGUgcHJldmlvdXMgdmlzdWFsCiAgICAgICAgLy8gICAgIG9wZXJhdGlvbi4KICAgICAgICBpZiAoIXZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICB2aW0udmlzdWFsTW9kZSA9IHRydWU7CiAgICAgICAgICB2aW0udmlzdWFsTGluZSA9ICEhYWN0aW9uQXJncy5saW5ld2lzZTsKICAgICAgICAgIGlmICh2aW0udmlzdWFsTGluZSkgewogICAgICAgICAgICBjdXJTdGFydC5jaCA9IDA7CiAgICAgICAgICAgIGN1ckVuZCA9IGNsaXBDdXJzb3JUb0NvbnRlbnQoY20sIHsKICAgICAgICAgICAgICBsaW5lOiBjdXJTdGFydC5saW5lICsgcmVwZWF0IC0gMSwKICAgICAgICAgICAgICBjaDogbGluZUxlbmd0aChjbSwgY3VyU3RhcnQubGluZSkKICAgICAgICAgICAgfSwgdHJ1ZSAvKiogaW5jbHVkZUxpbmVCcmVhayAqLyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdXJFbmQgPSBjbGlwQ3Vyc29yVG9Db250ZW50KGNtLCB7CiAgICAgICAgICAgICAgbGluZTogY3VyU3RhcnQubGluZSwKICAgICAgICAgICAgICBjaDogY3VyU3RhcnQuY2ggKyByZXBlYXQKICAgICAgICAgICAgfSwgdHJ1ZSAvKiogaW5jbHVkZUxpbmVCcmVhayAqLyk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBNYWtlIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4KICAgICAgICAgIGlmICghYWN0aW9uQXJncy5yZXBlYXRJc0V4cGxpY2l0ICYmICF2aW0udmlzdWFsTGluZSkgewogICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RyYW5nZSBjYXNlLiBIZXJlIHRoZSBpbXBsaWNpdCByZXBlYXQgaXMgMS4gVGhlCiAgICAgICAgICAgIC8vIGZvbGxvd2luZyBjb21tYW5kcyBsZXRzIHRoZSBjdXJzb3IgaG92ZXIgb3ZlciB0aGUgMSBjaGFyYWN0ZXIKICAgICAgICAgICAgLy8gc2VsZWN0aW9uLgogICAgICAgICAgICBjbS5zZXRDdXJzb3IoY3VyRW5kKTsKICAgICAgICAgICAgY20uc2V0U2VsZWN0aW9uKGN1ckVuZCwgY3VyU3RhcnQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY20uc2V0U2VsZWN0aW9uKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIXZpbS52aXN1YWxMaW5lICYmIGFjdGlvbkFyZ3MubGluZXdpc2UpIHsKICAgICAgICAgICAgLy8gU2hpZnQtViBwcmVzc2VkIGluIGNoYXJhY3Rlcndpc2UgdmlzdWFsIG1vZGUuIFN3aXRjaCB0byBsaW5ld2lzZQogICAgICAgICAgICAvLyB2aXN1YWwgbW9kZSBpbnN0ZWFkIG9mIGV4aXRpbmcgdmlzdWFsIG1vZGUuCiAgICAgICAgICAgIHZpbS52aXN1YWxMaW5lID0gdHJ1ZTsKICAgICAgICAgICAgY3VyU3RhcnQgPSBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpOwogICAgICAgICAgICBjdXJFbmQgPSBjbS5nZXRDdXJzb3IoJ2hlYWQnKTsKICAgICAgICAgICAgY3VyU3RhcnQuY2ggPSBjdXJzb3JJc0JlZm9yZShjdXJTdGFydCwgY3VyRW5kKSA/IDAgOgogICAgICAgICAgICAgICAgbGluZUxlbmd0aChjbSwgY3VyU3RhcnQubGluZSk7CiAgICAgICAgICAgIGN1ckVuZC5jaCA9IGN1cnNvcklzQmVmb3JlKGN1clN0YXJ0LCBjdXJFbmQpID8KICAgICAgICAgICAgICAgIGxpbmVMZW5ndGgoY20sIGN1ckVuZC5saW5lKSA6IDA7CiAgICAgICAgICAgIGNtLnNldFNlbGVjdGlvbihjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGV4aXRWaXN1YWxNb2RlKGNtLCB2aW0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgam9pbkxpbmVzOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGN1clN0YXJ0LCBjdXJFbmQ7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICBjdXJTdGFydCA9IGNtLmdldEN1cnNvcignYW5jaG9yJyk7CiAgICAgICAgICBjdXJFbmQgPSBjbS5nZXRDdXJzb3IoJ2hlYWQnKTsKICAgICAgICAgIGN1ckVuZC5jaCA9IGxpbmVMZW5ndGgoY20sIGN1ckVuZC5saW5lKSAtIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFJlcGVhdCBpcyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGpvaW4uIE1pbmltdW0gMiBsaW5lcy4KICAgICAgICAgIHZhciByZXBlYXQgPSBNYXRoLm1heChhY3Rpb25BcmdzLnJlcGVhdCwgMik7CiAgICAgICAgICBjdXJTdGFydCA9IGNtLmdldEN1cnNvcigpOwogICAgICAgICAgY3VyRW5kID0gY2xpcEN1cnNvclRvQ29udGVudChjbSwgeyBsaW5lOiBjdXJTdGFydC5saW5lICsgcmVwZWF0IC0gMSwKICAgICAgICAgICAgICBjaDogSW5maW5pdHkgfSk7CiAgICAgICAgfQogICAgICAgIHZhciBmaW5hbENoID0gMDsKICAgICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gY3VyU3RhcnQubGluZTsgaSA8IGN1ckVuZC5saW5lOyBpKyspIHsKICAgICAgICAgICAgZmluYWxDaCA9IGxpbmVMZW5ndGgoY20sIGN1clN0YXJ0LmxpbmUpOwogICAgICAgICAgICB2YXIgdG1wID0geyBsaW5lOiBjdXJTdGFydC5saW5lICsgMSwKICAgICAgICAgICAgICAgIGNoOiBsaW5lTGVuZ3RoKGNtLCBjdXJTdGFydC5saW5lICsgMSkgfTsKICAgICAgICAgICAgdmFyIHRleHQgPSBjbS5nZXRSYW5nZShjdXJTdGFydCwgdG1wKTsKICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXG5ccyovZywgJyAnKTsKICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKHRleHQsIGN1clN0YXJ0LCB0bXApOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGN1ckZpbmFsUG9zID0geyBsaW5lOiBjdXJTdGFydC5saW5lLCBjaDogZmluYWxDaCB9OwogICAgICAgICAgY20uc2V0Q3Vyc29yKGN1ckZpbmFsUG9zKTsKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgbmV3TGluZUFuZEVudGVySW5zZXJ0TW9kZTogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgaW5zZXJ0QXQgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICBpZiAoaW5zZXJ0QXQubGluZSA9PT0gMCAmJiAhYWN0aW9uQXJncy5hZnRlcikgewogICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBpbnNlcnRpbmcgbmV3bGluZSBiZWZvcmUgc3RhcnQgb2YgZG9jdW1lbnQuCiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoJ1xuJywgeyBsaW5lOiAwLCBjaDogMCB9KTsKICAgICAgICAgIGNtLnNldEN1cnNvcigwLCAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5zZXJ0QXQubGluZSA9IChhY3Rpb25BcmdzLmFmdGVyKSA/IGluc2VydEF0LmxpbmUgOgogICAgICAgICAgICAgIGluc2VydEF0LmxpbmUgLSAxOwogICAgICAgICAgaW5zZXJ0QXQuY2ggPSBsaW5lTGVuZ3RoKGNtLCBpbnNlcnRBdC5saW5lKTsKICAgICAgICAgIGNtLnNldEN1cnNvcihpbnNlcnRBdCk7CiAgICAgICAgICB2YXIgbmV3bGluZUZuID0gQ29kZU1pcnJvci5jb21tYW5kcy5uZXdsaW5lQW5kSW5kZW50Q29udGludWVDb21tZW50IHx8CiAgICAgICAgICAgICAgQ29kZU1pcnJvci5jb21tYW5kcy5uZXdsaW5lQW5kSW5kZW50OwogICAgICAgICAgbmV3bGluZUZuKGNtKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5lbnRlckluc2VydE1vZGUoY20pOwogICAgICB9LAogICAgICBwYXN0ZTogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgcmVnaXN0ZXIgPSBnZXRWaW1HbG9iYWxTdGF0ZSgpLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcigKICAgICAgICAgICAgYWN0aW9uQXJncy5yZWdpc3Rlck5hbWUpOwogICAgICAgIGlmICghcmVnaXN0ZXIudGV4dCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciB0ZXh0ID0gJycsIGkgPSAwOyBpIDwgYWN0aW9uQXJncy5yZXBlYXQ7IGkrKykgewogICAgICAgICAgdGV4dCArPSByZWdpc3Rlci50ZXh0OwogICAgICAgIH0KICAgICAgICB2YXIgbGluZXdpc2UgPSByZWdpc3Rlci5saW5ld2lzZTsKICAgICAgICBpZiAobGluZXdpc2UpIHsKICAgICAgICAgIGlmIChhY3Rpb25BcmdzLmFmdGVyKSB7CiAgICAgICAgICAgIC8vIE1vdmUgdGhlIG5ld2xpbmUgYXQgdGhlIGVuZCB0byB0aGUgc3RhcnQgaW5zdGVhZCwgYW5kIHBhc3RlIGp1c3QKICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBuZXdsaW5lIGNoYXJhY3RlciBvZiB0aGUgbGluZSB3ZSBhcmUgb24gcmlnaHQgbm93LgogICAgICAgICAgICB0ZXh0ID0gJ1xuJyArIHRleHQuc2xpY2UoMCwgdGV4dC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgY3VyLmNoID0gbGluZUxlbmd0aChjbSwgY3VyLmxpbmUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3VyLmNoID0gMDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VyLmNoICs9IGFjdGlvbkFyZ3MuYWZ0ZXIgPyAxIDogMDsKICAgICAgICB9CiAgICAgICAgY20ucmVwbGFjZVJhbmdlKHRleHQsIGN1cik7CiAgICAgICAgLy8gTm93IGZpbmUgdHVuZSB0aGUgY3Vyc29yIHRvIHdoZXJlIHdlIHdhbnQgaXQuCiAgICAgICAgdmFyIGN1clBvc0ZpbmFsOwogICAgICAgIHZhciBpZHg7CiAgICAgICAgaWYgKGxpbmV3aXNlICYmIGFjdGlvbkFyZ3MuYWZ0ZXIpIHsKICAgICAgICAgIGN1clBvc0ZpbmFsID0geyBsaW5lOiBjdXIubGluZSArIDEsCiAgICAgICAgICAgICAgY2g6IGZpbmRGaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIoY20uZ2V0TGluZShjdXIubGluZSArIDEpKSB9OwogICAgICAgIH0gZWxzZSBpZiAobGluZXdpc2UgJiYgIWFjdGlvbkFyZ3MuYWZ0ZXIpIHsKICAgICAgICAgIGN1clBvc0ZpbmFsID0geyBsaW5lOiBjdXIubGluZSwKICAgICAgICAgICAgICBjaDogZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGN1ci5saW5lKSkgfTsKICAgICAgICB9IGVsc2UgaWYgKCFsaW5ld2lzZSAmJiBhY3Rpb25BcmdzLmFmdGVyKSB7CiAgICAgICAgICBpZHggPSBjbS5pbmRleEZyb21Qb3MoY3VyKTsKICAgICAgICAgIGN1clBvc0ZpbmFsID0gY20ucG9zRnJvbUluZGV4KGlkeCArIHRleHQubGVuZ3RoIC0gMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlkeCA9IGNtLmluZGV4RnJvbVBvcyhjdXIpOwogICAgICAgICAgY3VyUG9zRmluYWwgPSBjbS5wb3NGcm9tSW5kZXgoaWR4ICsgdGV4dC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICBjbS5zZXRDdXJzb3IoY3VyUG9zRmluYWwpOwogICAgICB9LAogICAgICB1bmRvOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncykgewogICAgICAgIHJlcGVhdEZuKGNtLCBDb2RlTWlycm9yLmNvbW1hbmRzLnVuZG8sIGFjdGlvbkFyZ3MucmVwZWF0KSgpOwogICAgICB9LAogICAgICByZWRvOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncykgewogICAgICAgIHJlcGVhdEZuKGNtLCBDb2RlTWlycm9yLmNvbW1hbmRzLnJlZG8sIGFjdGlvbkFyZ3MucmVwZWF0KSgpOwogICAgICB9LAogICAgICBzZXRSZWdpc3RlcjogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZpbS5pbnB1dFN0YXRlLnJlZ2lzdGVyTmFtZSA9IGFjdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXI7CiAgICAgIH0sCiAgICAgIHNldE1hcms6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgbWFya05hbWUgPSBhY3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIGlmICghaW5BcnJheShtYXJrTmFtZSwgdmFsaWRNYXJrcykpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHZpbS5tYXJrc1ttYXJrTmFtZV0pIHsKICAgICAgICAgIHZpbS5tYXJrc1ttYXJrTmFtZV0uY2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgdmltLm1hcmtzW21hcmtOYW1lXSA9IGNtLnNldEJvb2ttYXJrKGNtLmdldEN1cnNvcigpKTsKICAgICAgfSwKICAgICAgcmVwbGFjZTogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgcmVwbGFjZVdpdGggPSBhY3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIHZhciBjdXJTdGFydCA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShjdXJTdGFydC5saW5lKTsKICAgICAgICB2YXIgcmVwbGFjZVRvID0gY3VyU3RhcnQuY2ggKyBhY3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICBpZiAocmVwbGFjZVRvID4gbGluZS5sZW5ndGgpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGN1ckVuZCA9IHsgbGluZTogY3VyU3RhcnQubGluZSwgY2g6IHJlcGxhY2VUbyB9OwogICAgICAgIHZhciByZXBsYWNlV2l0aFN0ciA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VyRW5kLmNoIC0gY3VyU3RhcnQuY2g7IGkrKykgewogICAgICAgICAgcmVwbGFjZVdpdGhTdHIgKz0gcmVwbGFjZVdpdGg7CiAgICAgICAgfQogICAgICAgIGNtLnJlcGxhY2VSYW5nZShyZXBsYWNlV2l0aFN0ciwgY3VyU3RhcnQsIGN1ckVuZCk7CiAgICAgICAgY20uc2V0Q3Vyc29yKG9mZnNldEN1cnNvcihjdXJFbmQsIDAsIC0xKSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIHRleHRPYmplY3RzID0gewogICAgICAvLyBUT0RPOiBsb3RzIG9mIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgdGhyb3duIGhlcmUuIFRyeSBkYSgKICAgICAgLy8gICAgIG91dHNpZGUgb2YgYSAoKSBibG9jay4KICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRleHQgb2JqZWN0cyBmb3IgdGhlIHJldmVyc2UgbGlrZSB9LiBTaG91bGQganVzdCBiZQogICAgICAvLyAgICAgYW4gYWRkaXRpb25hbCBtYXBwaW5nIGFmdGVyIG1vdmluZyB0byB0aGUgZGVmYXVsdEtleU1hcC4KICAgICAgJ3cnOiBmdW5jdGlvbihjbSwgaW5jbHVzaXZlKSB7CiAgICAgICAgcmV0dXJuIGV4cGFuZFdvcmRVbmRlckN1cnNvcihjbSwgaW5jbHVzaXZlLCB0cnVlIC8qKiBmb3J3YXJkICovLAogICAgICAgICAgICBmYWxzZSAvKiogYmlnV29yZCAqLyk7CiAgICAgIH0sCiAgICAgICdXJzogZnVuY3Rpb24oY20sIGluY2x1c2l2ZSkgewogICAgICAgIHJldHVybiBleHBhbmRXb3JkVW5kZXJDdXJzb3IoY20sIGluY2x1c2l2ZSwKICAgICAgICAgICAgdHJ1ZSAvKiogZm9yd2FyZCAqLywgdHJ1ZSAvKiogYmlnV29yZCAqLyk7CiAgICAgIH0sCiAgICAgICd7JzogZnVuY3Rpb24oY20sIGluY2x1c2l2ZSkgewogICAgICAgIHJldHVybiBzZWxlY3RDb21wYW5pb25PYmplY3QoY20sICd9JywgaW5jbHVzaXZlKTsKICAgICAgfSwKICAgICAgJygnOiBmdW5jdGlvbihjbSwgaW5jbHVzaXZlKSB7CiAgICAgICAgcmV0dXJuIHNlbGVjdENvbXBhbmlvbk9iamVjdChjbSwgJyknLCBpbmNsdXNpdmUpOwogICAgICB9LAogICAgICAnWyc6IGZ1bmN0aW9uKGNtLCBpbmNsdXNpdmUpIHsKICAgICAgICByZXR1cm4gc2VsZWN0Q29tcGFuaW9uT2JqZWN0KGNtLCAnXScsIGluY2x1c2l2ZSk7CiAgICAgIH0sCiAgICAgICdcJyc6IGZ1bmN0aW9uKGNtLCBpbmNsdXNpdmUpIHsKICAgICAgICByZXR1cm4gZmluZEJlZ2lubmluZ0FuZEVuZChjbSwgIiciLCBpbmNsdXNpdmUpOwogICAgICB9LAogICAgICAnXCInOiBmdW5jdGlvbihjbSwgaW5jbHVzaXZlKSB7CiAgICAgICAgcmV0dXJuIGZpbmRCZWdpbm5pbmdBbmRFbmQoY20sICciJywgaW5jbHVzaXZlKTsKICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogQmVsb3cgYXJlIG1pc2NlbGxhbmVvdXMgdXRpbGl0eSBmdW5jdGlvbnMgdXNlZCBieSB2aW0uanMKICAgICAqLwoKICAgIC8qKgogICAgICogQ2xpcHMgY3Vyc29yIHRvIGVuc3VyZSB0aGF0OgogICAgICogICAwIDw9IGN1ci5jaCA8IGxpbmVMZW5ndGgKICAgICAqICAgICAgIEFORAogICAgICogICAwIDw9IGN1ci5saW5lIDwgbGluZUNvdW50CiAgICAgKiBJZiBpbmNsdWRlTGluZUJyZWFrIGlzIHRydWUsIHRoZW4gYWxsb3cgY3VyLmNoID09IGxpbmVMZW5ndGguCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsaXBDdXJzb3JUb0NvbnRlbnQoY20sIGN1ciwgaW5jbHVkZUxpbmVCcmVhaykgewogICAgICB2YXIgbGluZSA9IE1hdGgubWluKE1hdGgubWF4KDAsIGN1ci5saW5lKSwgY20ubGluZUNvdW50KCkgLSAxKTsKICAgICAgdmFyIG1heENoID0gbGluZUxlbmd0aChjbSwgbGluZSkgLSAxOwogICAgICBtYXhDaCA9IChpbmNsdWRlTGluZUJyZWFrKSA/IG1heENoICsgMSA6IG1heENoOwogICAgICB2YXIgY2ggPSBNYXRoLm1pbihNYXRoLm1heCgwLCBjdXIuY2gpLCBtYXhDaCk7CiAgICAgIHJldHVybiB7IGxpbmU6IGxpbmUsIGNoOiBjaCB9OwogICAgfQogICAgLy8gTWVyZ2UgYXJndW1lbnRzIGluIHBsYWNlLCBmb3Igb3ZlcnJpZGluZyBhcmd1bWVudHMuCiAgICBmdW5jdGlvbiBtZXJnZUFyZ3ModG8sIGZyb20pIHsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBmcm9tKSB7CiAgICAgICAgaWYgKGZyb20uaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgIHRvW3Byb3BdID0gZnJvbVtwcm9wXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNvcHlBcmdzKGFyZ3MpIHsKICAgICAgdmFyIHJldCA9IHt9OwogICAgICBmb3IgKHZhciBwcm9wIGluIGFyZ3MpIHsKICAgICAgICBpZiAoYXJncy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgcmV0W3Byb3BdID0gYXJnc1twcm9wXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIGZ1bmN0aW9uIG9mZnNldEN1cnNvcihjdXIsIG9mZnNldExpbmUsIG9mZnNldENoKSB7CiAgICAgIHJldHVybiB7IGxpbmU6IGN1ci5saW5lICsgb2Zmc2V0TGluZSwgY2g6IGN1ci5jaCArIG9mZnNldENoIH07CiAgICB9CiAgICBmdW5jdGlvbiBhcnJheUVxKGExLCBhMikgewogICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGExW2ldICE9IGEyW2ldKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gbWF0Y2hLZXlzUGFydGlhbChwcmVzc2VkLCBtYXBwZWQpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVzc2VkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gJ2NoYXJhY3RlcicgbWVhbnMgYW55IGNoYXJhY3Rlci4gRm9yIG1hcmssIHJlZ2lzdGVyIGNvbW1hZHMsIGV0Yy4KICAgICAgICBpZiAocHJlc3NlZFtpXSAhPSBtYXBwZWRbaV0gJiYgbWFwcGVkW2ldICE9ICdjaGFyYWN0ZXInKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYXJyYXlJc1N1YnNldEZyb21CZWdpbm5pbmcoc21hbGwsIGJpZykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNtYWxsLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHNtYWxsW2ldICE9IGJpZ1tpXSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcGVhdEZuKGNtLCBmbiwgcmVwZWF0KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7CiAgICAgICAgICBmbihjbSk7CiAgICAgICAgfQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY29weUN1cnNvcihjdXIpIHsKICAgICAgcmV0dXJuIHsgbGluZTogY3VyLmxpbmUsIGNoOiBjdXIuY2ggfTsKICAgIH0KICAgIGZ1bmN0aW9uIGN1cnNvckVxdWFsKGN1cjEsIGN1cjIpIHsKICAgICAgcmV0dXJuIGN1cjEuY2ggPT0gY3VyMi5jaCAmJiBjdXIxLmxpbmUgPT0gY3VyMi5saW5lOwogICAgfQogICAgZnVuY3Rpb24gY3Vyc29ySXNCZWZvcmUoY3VyMSwgY3VyMikgewogICAgICBpZiAoY3VyMS5saW5lIDwgY3VyMi5saW5lKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAoY3VyMS5saW5lID09IGN1cjIubGluZSAmJiBjdXIxLmNoIDwgY3VyMi5jaCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGxpbmVMZW5ndGgoY20sIGxpbmVOdW0pIHsKICAgICAgcmV0dXJuIGNtLmdldExpbmUobGluZU51bSkubGVuZ3RoOwogICAgfQogICAgZnVuY3Rpb24gcmV2ZXJzZShzKXsKICAgICAgcmV0dXJuIHMuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRyaW0ocykgewogICAgICBpZiAocy50cmltKSB7CiAgICAgICAgcmV0dXJuIHMudHJpbSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBzLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAnJyk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ2V4KHMpIHsKICAgICAgcmV0dXJuIHMucmVwbGFjZSgvKFsuPyorJFxbXF1cL1xcKCl7fXxcLV0pL2csICJcXCQxIik7CiAgICB9CgogICAgZnVuY3Rpb24gZXhpdFZpc3VhbE1vZGUoY20sIHZpbSkgewogICAgICB2aW0udmlzdWFsTW9kZSA9IGZhbHNlOwogICAgICB2aW0udmlzdWFsTGluZSA9IGZhbHNlOwogICAgICB2YXIgc2VsZWN0aW9uU3RhcnQgPSBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpOwogICAgICB2YXIgc2VsZWN0aW9uRW5kID0gY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgIGlmICghY3Vyc29yRXF1YWwoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkpIHsKICAgICAgICAvLyBDbGVhciB0aGUgc2VsZWN0aW9uIGFuZCBzZXQgdGhlIGN1cnNvciBvbmx5IGlmIHRoZSBzZWxlY3Rpb24gaGFzIG5vdAogICAgICAgIC8vIGFscmVhZHkgYmVlbiBjbGVhcmVkLiBPdGhlcndpc2Ugd2UgcmlzayBtb3ZpbmcgdGhlIGN1cnNvciBzb21ld2hlcmUKICAgICAgICAvLyBpdCdzIG5vdCBzdXBwb3NlZCB0byBiZS4KICAgICAgICBjbS5zZXRDdXJzb3IoY2xpcEN1cnNvclRvQ29udGVudChjbSwgc2VsZWN0aW9uRW5kKSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZW1vdmUgYW55IHRyYWlsaW5nIG5ld2xpbmVzIGZyb20gdGhlIHNlbGVjdGlvbi4gRm9yCiAgICAvLyBleGFtcGxlLCB3aXRoIHRoZSBjYXJldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxhc3Qgd29yZCBvbiB0aGUgbGluZSwKICAgIC8vICdkdycgc2hvdWxkIHdvcmQsIGJ1dCBub3QgdGhlIG5ld2xpbmUsIHdoaWxlICd3JyBzaG91bGQgYWR2YW5jZSB0aGUKICAgIC8vIGNhcmV0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5leHQgbGluZS4KICAgIGZ1bmN0aW9uIGNsaXBUb0xpbmUoY20sIGN1clN0YXJ0LCBjdXJFbmQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNtLmdldFJhbmdlKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICB2YXIgbGluZXMgPSBzZWxlY3Rpb24uc3BsaXQoJ1xuJyk7CiAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAxICYmIGlzV2hpdGVTcGFjZVN0cmluZyhsaW5lcy5wb3AoKSkpIHsKICAgICAgICBjdXJFbmQubGluZS0tOwogICAgICAgIGN1ckVuZC5jaCA9IGxpbmVMZW5ndGgoY20sIGN1ckVuZC5saW5lKTsKICAgICAgfQogICAgfQoKICAgIC8vIEV4cGFuZCB0aGUgc2VsZWN0aW9uIHRvIGxpbmUgZW5kcy4KICAgIGZ1bmN0aW9uIGV4cGFuZFNlbGVjdGlvblRvTGluZShjbSwgY3VyU3RhcnQsIGN1ckVuZCkgewogICAgICBjdXJTdGFydC5jaCA9IDA7CiAgICAgIGN1ckVuZC5jaCA9IDA7CiAgICAgIGN1ckVuZC5saW5lKys7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3Rlcih0ZXh0KSB7CiAgICAgIGlmICghdGV4dCkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHZhciBmaXJzdE5vbldTID0gdGV4dC5zZWFyY2goL1xTLyk7CiAgICAgIHJldHVybiBmaXJzdE5vbldTID09IC0xID8gdGV4dC5sZW5ndGggOiBmaXJzdE5vbldTOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4cGFuZFdvcmRVbmRlckN1cnNvcihjbSwgaW5jbHVzaXZlLCBmb3J3YXJkLCBiaWdXb3JkLCBub1N5bWJvbCkgewogICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShjdXIubGluZSk7CiAgICAgIHZhciBpZHggPSBjdXIuY2g7CgogICAgICAvLyBTZWVrIHRvIGZpcnN0IHdvcmQgb3Igbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCBkZXBlbmRpbmcgb24gaWYKICAgICAgLy8gbm9TeW1ib2wgaXMgdHJ1ZS4KICAgICAgdmFyIHRleHRBZnRlcklkeCA9IGxpbmUuc3Vic3RyaW5nKGlkeCk7CiAgICAgIHZhciBmaXJzdE1hdGNoZWRDaGFyOwogICAgICBpZiAobm9TeW1ib2wpIHsKICAgICAgICBmaXJzdE1hdGNoZWRDaGFyID0gdGV4dEFmdGVySWR4LnNlYXJjaCgvXHcvKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmaXJzdE1hdGNoZWRDaGFyID0gdGV4dEFmdGVySWR4LnNlYXJjaCgvXFMvKTsKICAgICAgfQogICAgICBpZiAoZmlyc3RNYXRjaGVkQ2hhciA9PSAtMSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlkeCArPSBmaXJzdE1hdGNoZWRDaGFyOwogICAgICB0ZXh0QWZ0ZXJJZHggPSBsaW5lLnN1YnN0cmluZyhpZHgpOwogICAgICB2YXIgdGV4dEJlZm9yZUlkeCA9IGxpbmUuc3Vic3RyaW5nKDAsIGlkeCk7CgogICAgICB2YXIgbWF0Y2hSZWdleDsKICAgICAgLy8gR3JlZWR5IG1hdGNoZXJzIGZvciB0aGUgIndvcmQiIHdlIGFyZSB0cnlpbmcgdG8gZXhwYW5kLgogICAgICBpZiAoYmlnV29yZCkgewogICAgICAgIG1hdGNoUmVnZXggPSAvXlxTKy87CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCgvXHcvKS50ZXN0KGxpbmUuY2hhckF0KGlkeCkpKSB7CiAgICAgICAgICBtYXRjaFJlZ2V4ID0gL15cdysvOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXRjaFJlZ2V4ID0gL15bXlx3XHNdKy87CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgd29yZEFmdGVyUmVnZXggPSBtYXRjaFJlZ2V4LmV4ZWModGV4dEFmdGVySWR4KTsKICAgICAgdmFyIHdvcmRTdGFydCA9IGlkeDsKICAgICAgdmFyIHdvcmRFbmQgPSBpZHggKyB3b3JkQWZ0ZXJSZWdleFswXS5sZW5ndGggLSAxOwogICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLiBJdCB3aWxsIGJlIHNsb3cgb24gdmVyeSBsb25nIGxpbmVzLgogICAgICB2YXIgd29yZEJlZm9yZVJlZ2V4ID0gbWF0Y2hSZWdleC5leGVjKHJldmVyc2UodGV4dEJlZm9yZUlkeCkpOwogICAgICBpZiAod29yZEJlZm9yZVJlZ2V4KSB7CiAgICAgICAgd29yZFN0YXJ0IC09IHdvcmRCZWZvcmVSZWdleFswXS5sZW5ndGg7CiAgICAgIH0KCiAgICAgIGlmIChpbmNsdXNpdmUpIHsKICAgICAgICB3b3JkRW5kKys7CiAgICAgIH0KCiAgICAgIHJldHVybiB7IHN0YXJ0OiB7IGxpbmU6IGN1ci5saW5lLCBjaDogd29yZFN0YXJ0IH0sCiAgICAgICAgZW5kOiB7IGxpbmU6IGN1ci5saW5lLCBjaDogd29yZEVuZCB9fTsKICAgIH0KCiAgICAvKgogICAgICogUmV0dXJucyB0aGUgYm91bmRhcmllcyBvZiB0aGUgbmV4dCB3b3JkLiBJZiB0aGUgY3Vyc29yIGluIHRoZSBtaWRkbGUgb2YKICAgICAqIHRoZSB3b3JkLCB0aGVuIHJldHVybnMgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGN1cnJlbnQgd29yZCwgc3RhcnRpbmcgYXQKICAgICAqIHRoZSBjdXJzb3IuIElmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0L2VuZCBvZiBhIHdvcmQsIGFuZCB3ZSBhcmUgZ29pbmcKICAgICAqIGZvcndhcmQvYmFja3dhcmQsIHJlc3BlY3RpdmVseSwgZmluZCB0aGUgYm91bmRhcmllcyBvZiB0aGUgbmV4dCB3b3JkLgogICAgICoKICAgICAqIEBwYXJhbSB7Q29kZU1pcnJvcn0gY20gQ29kZU1pcnJvciBvYmplY3QuCiAgICAgKiBAcGFyYW0ge0N1cnNvcn0gY3VyIFRoZSBjdXJzb3IgcG9zaXRpb24uCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcndhcmQgVHJ1ZSB0byBzZWFyY2ggZm9yd2FyZC4gRmFsc2UgdG8gc2VhcmNoCiAgICAgKiAgICAgYmFja3dhcmQuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpZ1dvcmQgVHJ1ZSBpZiBwdW5jdHVhdGlvbiBjb3VudCBhcyBwYXJ0IG9mIHRoZSB3b3JkLgogICAgICogICAgIEZhbHNlIGlmIG9ubHkgW2EtekEtWjAtOV0gY2hhcmFjdGVycyBjb3VudCBhcyBwYXJ0IG9mIHRoZSB3b3JkLgogICAgICogQHJldHVybiB7T2JqZWN0e2Zyb206bnVtYmVyLCB0bzpudW1iZXIsIGxpbmU6IG51bWJlcn19IFRoZSBib3VuZGFyaWVzIG9mCiAgICAgKiAgICAgdGhlIHdvcmQsIG9yIG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgd29yZHMuCiAgICAgKi8KICAgIC8vIFRPRE86IFRyZWF0IGVtcHR5IGxpbmVzICh3aXRoIG5vIHdoaXRlc3BhY2UpIGFzIHdvcmRzLgogICAgZnVuY3Rpb24gZmluZFdvcmQoY20sIGN1ciwgZm9yd2FyZCwgYmlnV29yZCkgewogICAgICB2YXIgbGluZU51bSA9IGN1ci5saW5lOwogICAgICB2YXIgcG9zID0gY3VyLmNoOwogICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUobGluZU51bSk7CiAgICAgIHZhciBkaXIgPSBmb3J3YXJkID8gMSA6IC0xOwogICAgICB2YXIgcmVnZXhwcyA9IGJpZ1dvcmQgPyBiaWdXb3JkUmVnZXhwIDogd29yZFJlZ2V4cDsKCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIHN0b3AgPSAoZGlyID4gMCkgPyBsaW5lLmxlbmd0aCA6IC0xOwogICAgICAgIHZhciB3b3JkU3RhcnQgPSBzdG9wLCB3b3JkRW5kID0gc3RvcDsKICAgICAgICAvLyBGaW5kIGJvdW5kcyBvZiBuZXh0IHdvcmQuCiAgICAgICAgd2hpbGUgKHBvcyAhPSBzdG9wKSB7CiAgICAgICAgICB2YXIgZm91bmRXb3JkID0gZmFsc2U7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZ2V4cHMubGVuZ3RoICYmICFmb3VuZFdvcmQ7ICsraSkgewogICAgICAgICAgICBpZiAocmVnZXhwc1tpXS50ZXN0KGxpbmUuY2hhckF0KHBvcykpKSB7CiAgICAgICAgICAgICAgd29yZFN0YXJ0ID0gcG9zOwogICAgICAgICAgICAgIC8vIEFkdmFuY2UgdG8gZW5kIG9mIHdvcmQuCiAgICAgICAgICAgICAgd2hpbGUgKHBvcyAhPSBzdG9wICYmIHJlZ2V4cHNbaV0udGVzdChsaW5lLmNoYXJBdChwb3MpKSkgewogICAgICAgICAgICAgICAgcG9zICs9IGRpcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgd29yZEVuZCA9IHBvczsKICAgICAgICAgICAgICBmb3VuZFdvcmQgPSB3b3JkU3RhcnQgIT0gd29yZEVuZDsKICAgICAgICAgICAgICBpZiAod29yZFN0YXJ0ID09IGN1ci5jaCAmJiBsaW5lTnVtID09IGN1ci5saW5lICYmCiAgICAgICAgICAgICAgICAgIHdvcmRFbmQgPT0gd29yZFN0YXJ0ICsgZGlyKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBzdGFydGVkIGF0IHRoZSBlbmQgb2YgYSB3b3JkLiBGaW5kIHRoZSBuZXh0IG9uZS4KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICBmcm9tOiBNYXRoLm1pbih3b3JkU3RhcnQsIHdvcmRFbmQgKyAxKSwKICAgICAgICAgICAgICAgICAgdG86IE1hdGgubWF4KHdvcmRTdGFydCwgd29yZEVuZCksCiAgICAgICAgICAgICAgICAgIGxpbmU6IGxpbmVOdW0gfTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICghZm91bmRXb3JkKSB7CiAgICAgICAgICAgIHBvcyArPSBkaXI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFkdmFuY2UgdG8gbmV4dC9wcmV2IGxpbmUuCiAgICAgICAgbGluZU51bSArPSBkaXI7CiAgICAgICAgaWYgKCFpc0xpbmUoY20sIGxpbmVOdW0pKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgbGluZSA9IGNtLmdldExpbmUobGluZU51bSk7CiAgICAgICAgcG9zID0gKGRpciA+IDApID8gMCA6IGxpbmUubGVuZ3RoOwogICAgICB9CiAgICAgIC8vIFNob3VsZCBuZXZlciBnZXQgaGVyZS4KICAgICAgdGhyb3cgJ1RoZSBpbXBvc3NpYmxlIGhhcHBlbmVkLic7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0NvZGVNaXJyb3J9IGNtIENvZGVNaXJyb3Igb2JqZWN0LgogICAgICogQHBhcmFtIHtpbnR9IHJlcGVhdCBOdW1iZXIgb2Ygd29yZHMgdG8gbW92ZSBwYXN0LgogICAgICogQHBhcmFtIHtib29sZWFufSBmb3J3YXJkIFRydWUgdG8gc2VhcmNoIGZvcndhcmQuIEZhbHNlIHRvIHNlYXJjaAogICAgICogICAgIGJhY2t3YXJkLgogICAgICogQHBhcmFtIHtib29sZWFufSB3b3JkRW5kIFRydWUgdG8gbW92ZSB0byBlbmQgb2Ygd29yZC4gRmFsc2UgdG8gbW92ZSB0bwogICAgICogICAgIGJlZ2lubmluZyBvZiB3b3JkLgogICAgICogQHBhcmFtIHtib29sZWFufSBiaWdXb3JkIFRydWUgaWYgcHVuY3R1YXRpb24gY291bnQgYXMgcGFydCBvZiB0aGUgd29yZC4KICAgICAqICAgICBGYWxzZSBpZiBvbmx5IGFscGhhYmV0IGNoYXJhY3RlcnMgY291bnQgYXMgcGFydCBvZiB0aGUgd29yZC4KICAgICAqIEByZXR1cm4ge0N1cnNvcn0gVGhlIHBvc2l0aW9uIHRoZSBjdXJzb3Igc2hvdWxkIG1vdmUgdG8uCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1vdmVUb1dvcmQoY20sIHJlcGVhdCwgZm9yd2FyZCwgd29yZEVuZCwgYmlnV29yZCkgewogICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKICAgICAgICB2YXIgc3RhcnRDaCA9IGN1ci5jaCwgc3RhcnRMaW5lID0gY3VyLmxpbmUsIHdvcmQ7CiAgICAgICAgdmFyIG1vdmVkVG9OZXh0V29yZCA9IGZhbHNlOwogICAgICAgIHdoaWxlICghbW92ZWRUb05leHRXb3JkKSB7CiAgICAgICAgICAvLyBTZWFyY2ggYW5kIGFkdmFuY2UuCiAgICAgICAgICB3b3JkID0gZmluZFdvcmQoY20sIGN1ciwgZm9yd2FyZCwgYmlnV29yZCk7CiAgICAgICAgICBtb3ZlZFRvTmV4dFdvcmQgPSB0cnVlOwogICAgICAgICAgaWYgKHdvcmQpIHsKICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgd29yZCB3ZSBqdXN0IGZvdW5kLiBJZiBieSBtb3ZpbmcgdG8gdGhlIHdvcmQgd2UgZW5kCiAgICAgICAgICAgIC8vIHVwIGluIHRoZSBzYW1lIHNwb3QsIHRoZW4gbW92ZSBhbiBleHRyYSBjaGFyYWN0ZXIgYW5kIHNlYXJjaAogICAgICAgICAgICAvLyBhZ2Fpbi4KICAgICAgICAgICAgY3VyLmxpbmUgPSB3b3JkLmxpbmU7CiAgICAgICAgICAgIGlmIChmb3J3YXJkICYmIHdvcmRFbmQpIHsKICAgICAgICAgICAgICAvLyAnZScKICAgICAgICAgICAgICBjdXIuY2ggPSB3b3JkLnRvIC0gMTsKICAgICAgICAgICAgfSBlbHNlIGlmIChmb3J3YXJkICYmICF3b3JkRW5kKSB7CiAgICAgICAgICAgICAgLy8gJ3cnCiAgICAgICAgICAgICAgaWYgKGluUmFuZ2VJbmNsdXNpdmUoY3VyLmNoLCB3b3JkLmZyb20sIHdvcmQudG8pICYmCiAgICAgICAgICAgICAgICAgIHdvcmQubGluZSA9PSBzdGFydExpbmUpIHsKICAgICAgICAgICAgICAgIC8vIFN0aWxsIG9uIHRoZSBzYW1lIHdvcmQuIEdvIHRvIHRoZSBuZXh0IG9uZS4KICAgICAgICAgICAgICAgIG1vdmVkVG9OZXh0V29yZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY3VyLmNoID0gd29yZC50byAtIDE7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGN1ci5jaCA9IHdvcmQuZnJvbTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZvcndhcmQgJiYgd29yZEVuZCkgewogICAgICAgICAgICAgIC8vICdnZScKICAgICAgICAgICAgICBpZiAoaW5SYW5nZUluY2x1c2l2ZShjdXIuY2gsIHdvcmQuZnJvbSwgd29yZC50bykgJiYKICAgICAgICAgICAgICAgICAgd29yZC5saW5lID09IHN0YXJ0TGluZSkgewogICAgICAgICAgICAgICAgLy8gc3RpbGwgb24gdGhlIHNhbWUgd29yZC4gR28gdG8gdGhlIG5leHQgb25lLgogICAgICAgICAgICAgICAgbW92ZWRUb05leHRXb3JkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjdXIuY2ggPSB3b3JkLmZyb207CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGN1ci5jaCA9IHdvcmQudG87CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFmb3J3YXJkICYmICF3b3JkRW5kKSB7CiAgICAgICAgICAgICAgLy8gJ2InCiAgICAgICAgICAgICAgY3VyLmNoID0gd29yZC5mcm9tOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBObyBtb3JlIHdvcmRzIHRvIGJlIGZvdW5kLiBNb3ZlIHRvIHRoZSBlbmQuCiAgICAgICAgICAgIGlmIChmb3J3YXJkKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGluZTogY3VyLmxpbmUsIGNoOiBsaW5lTGVuZ3RoKGNtLCBjdXIubGluZSkgfTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4geyBsaW5lOiBjdXIubGluZSwgY2g6IDAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gY3VyOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdmVUb0NoYXJhY3RlcihjbSwgcmVwZWF0LCBmb3J3YXJkLCBjaGFyYWN0ZXIpIHsKICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpOwogICAgICB2YXIgc3RhcnQgPSBjdXIuY2g7CiAgICAgIHZhciBpZHg7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwZWF0OyBpICsrKSB7CiAgICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKGN1ci5saW5lKTsKICAgICAgICBpZHggPSBjaGFySWR4SW5MaW5lKHN0YXJ0LCBsaW5lLCBjaGFyYWN0ZXIsIGZvcndhcmQsIHRydWUpOwogICAgICAgIGlmIChpZHggPT0gLTEpIHsKICAgICAgICAgIHJldHVybiBjdXI7CiAgICAgICAgfQogICAgICAgIHN0YXJ0ID0gaWR4OwogICAgICB9CiAgICAgIHJldHVybiB7IGxpbmU6IGNtLmdldEN1cnNvcigpLmxpbmUsIGNoOiBpZHggfTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3ZlVG9Db2x1bW4oY20sIHJlcGVhdCkgewogICAgICAvLyByZXBlYXQgaXMgYWx3YXlzID49IDEsIHNvIHJlcGVhdCAtIDEgYWx3YXlzIGNvcnJlc3BvbmRzCiAgICAgIC8vIHRvIHRoZSBjb2x1bW4gd2Ugd2FudCB0byBnbyB0by4KICAgICAgdmFyIGxpbmUgPSBjbS5nZXRDdXJzb3IoKS5saW5lOwogICAgICByZXR1cm4gY2xpcEN1cnNvclRvQ29udGVudChjbSwgeyBsaW5lOiBsaW5lLCBjaDogcmVwZWF0IC0gMSB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjaGFySWR4SW5MaW5lKHN0YXJ0LCBsaW5lLCBjaGFyYWN0ZXIsIGZvcndhcmQsIGluY2x1ZGVDaGFyKSB7CiAgICAgIC8vIFNlYXJjaCBmb3IgY2hhciBpbiBsaW5lLgogICAgICAvLyBtb3Rpb25fb3B0aW9uczoge2ZvcndhcmQsIGluY2x1ZGVDaGFyfQogICAgICAvLyBJZiBpbmNsdWRlQ2hhciA9IHRydWUsIGluY2x1ZGUgaXQgdG9vLgogICAgICAvLyBJZiBmb3J3YXJkID0gdHJ1ZSwgc2VhcmNoIGZvcndhcmQsIGVsc2Ugc2VhcmNoIGJhY2t3YXJkcy4KICAgICAgLy8gSWYgY2hhciBpcyBub3QgZm91bmQgb24gdGhpcyBsaW5lLCBkbyBub3RoaW5nCiAgICAgIHZhciBpZHg7CiAgICAgIGlmIChmb3J3YXJkKSB7CiAgICAgICAgaWR4ID0gbGluZS5pbmRleE9mKGNoYXJhY3Rlciwgc3RhcnQgKyAxKTsKICAgICAgICBpZiAoaWR4ICE9IC0xICYmICFpbmNsdWRlQ2hhcikgewogICAgICAgICAgaWR4IC09IDE7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlkeCA9IGxpbmUubGFzdEluZGV4T2YoY2hhcmFjdGVyLCBzdGFydCAtIDEpOwogICAgICAgIGlmIChpZHggIT0gLTEgJiYgIWluY2x1ZGVDaGFyKSB7CiAgICAgICAgICBpZHggKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGlkeDsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kTWF0Y2hlZFN5bWJvbChjbSwgY3VyLCBzeW1iKSB7CiAgICAgIHZhciBsaW5lID0gY3VyLmxpbmU7CiAgICAgIHN5bWIgPSBzeW1iID8gc3ltYiA6IGNtLmdldExpbmUobGluZSkuY2hhckF0KGN1ci5jaCk7CgogICAgICAvLyBBcmUgd2UgYXQgdGhlIG9wZW5pbmcgb3IgY2xvc2luZyBjaGFyCiAgICAgIHZhciBmb3J3YXJkcyA9IGluQXJyYXkoc3ltYiwgWycoJywgJ1snLCAneyddKTsKCiAgICAgIHZhciByZXZlcnNlU3ltYiA9ICh7CiAgICAgICAgJygnOiAnKScsICcpJzogJygnLAogICAgICAgICdbJzogJ10nLCAnXSc6ICdbJywKICAgICAgICAneyc6ICd9JywgJ30nOiAneyd9KVtzeW1iXTsKCiAgICAgIC8vIENvdWxkbid0IGZpbmQgYSBtYXRjaGluZyBzeW1ib2wsIGFib3J0CiAgICAgIGlmICghcmV2ZXJzZVN5bWIpIHsKICAgICAgICByZXR1cm4gY3VyOwogICAgICB9CgogICAgICAvLyBzZXQgb3VyIGluY3JlbWVudCB0byBtb3ZlIGZvcndhcmQgKCsxKSBvciBiYWNrd2FyZHMgKC0xKQogICAgICAvLyBkZXBlbmRpbmcgb24gd2hpY2ggYnJhY2tldCB3ZSdyZSBtYXRjaGluZwogICAgICB2YXIgaW5jcmVtZW50ID0gKHsnKCc6IDEsICd7JzogMSwgJ1snOiAxfSlbc3ltYl0gfHwgLTE7CiAgICAgIHZhciBkZXB0aCA9IDEsIG5leHRDaCA9IHN5bWIsIGluZGV4ID0gY3VyLmNoLCBsaW5lVGV4dCA9IGNtLmdldExpbmUobGluZSk7CiAgICAgIC8vIFNpbXBsZSBzZWFyY2ggZm9yIGNsb3NpbmcgcGFyZW4tLWp1c3QgY291bnQgb3BlbmluZ3MgYW5kIGNsb3NpbmdzIHRpbGwKICAgICAgLy8gd2UgZmluZCBvdXIgbWF0Y2gKICAgICAgLy8gVE9ETzogdXNlIGluZm8gZnJvbSBDb2RlTWlycm9yIHRvIGlnbm9yZSBjbG9zaW5nIGJyYWNrZXRzIGluIGNvbW1lbnRzCiAgICAgIC8vIGFuZCBxdW90ZXMsIGV0Yy4KICAgICAgd2hpbGUgKG5leHRDaCAmJiBkZXB0aCA+IDApIHsKICAgICAgICBpbmRleCArPSBpbmNyZW1lbnQ7CiAgICAgICAgbmV4dENoID0gbGluZVRleHQuY2hhckF0KGluZGV4KTsKICAgICAgICBpZiAoIW5leHRDaCkgewogICAgICAgICAgbGluZSArPSBpbmNyZW1lbnQ7CiAgICAgICAgICBpbmRleCA9IDA7CiAgICAgICAgICBsaW5lVGV4dCA9IGNtLmdldExpbmUobGluZSkgfHwgJyc7CiAgICAgICAgICBuZXh0Q2ggPSBsaW5lVGV4dC5jaGFyQXQoaW5kZXgpOwogICAgICAgIH0KICAgICAgICBpZiAobmV4dENoID09PSBzeW1iKSB7CiAgICAgICAgICBkZXB0aCsrOwogICAgICAgIH0gZWxzZSBpZiAobmV4dENoID09PSByZXZlcnNlU3ltYikgewogICAgICAgICAgZGVwdGgtLTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChuZXh0Q2gpIHsKICAgICAgICByZXR1cm4geyBsaW5lOiBsaW5lLCBjaDogaW5kZXggfTsKICAgICAgfQogICAgICByZXR1cm4gY3VyOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdENvbXBhbmlvbk9iamVjdChjbSwgcmV2U3ltYiwgaW5jbHVzaXZlKSB7CiAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKCiAgICAgIHZhciBlbmQgPSBmaW5kTWF0Y2hlZFN5bWJvbChjbSwgY3VyLCByZXZTeW1iKTsKICAgICAgdmFyIHN0YXJ0ID0gZmluZE1hdGNoZWRTeW1ib2woY20sIGVuZCk7CiAgICAgIHN0YXJ0LmNoICs9IGluY2x1c2l2ZSA/IDEgOiAwOwogICAgICBlbmQuY2ggKz0gaW5jbHVzaXZlID8gMCA6IDE7CgogICAgICByZXR1cm4geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07CiAgICB9CgogICAgZnVuY3Rpb24gcmVnZXhMYXN0SW5kZXhPZihzdHJpbmcsIHBhdHRlcm4sIHN0YXJ0SW5kZXgpIHsKICAgICAgZm9yICh2YXIgaSA9ICFzdGFydEluZGV4ID8gc3RyaW5nLmxlbmd0aCA6IHN0YXJ0SW5kZXg7CiAgICAgICAgICBpID49IDA7IC0taSkgewogICAgICAgIGlmIChwYXR0ZXJuLnRlc3Qoc3RyaW5nLmNoYXJBdChpKSkpIHsKICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLy8gVGFrZXMgaW4gYSBzeW1ib2wgYW5kIGEgY3Vyc29yIGFuZCB0cmllcyB0byBzaW11bGF0ZSB0ZXh0IG9iamVjdHMgdGhhdAogICAgLy8gaGF2ZSBpZGVudGljYWwgb3BlbmluZyBhbmQgY2xvc2luZyBzeW1ib2xzCiAgICAvLyBUT0RPIHN1cHBvcnQgYWNyb3NzIG11bHRpcGxlIGxpbmVzCiAgICBmdW5jdGlvbiBmaW5kQmVnaW5uaW5nQW5kRW5kKGNtLCBzeW1iLCBpbmNsdXNpdmUpIHsKICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpOwogICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUoY3VyLmxpbmUpOwogICAgICB2YXIgY2hhcnMgPSBsaW5lLnNwbGl0KCcnKTsKICAgICAgdmFyIHN0YXJ0LCBlbmQsIGksIGxlbjsKICAgICAgdmFyIGZpcnN0SW5kZXggPSBjaGFycy5pbmRleE9mKHN5bWIpOwoKICAgICAgLy8gdGhlIGRlY2lzaW9uIHRyZWUgaXMgdG8gYWx3YXlzIGxvb2sgYmFja3dhcmRzIGZvciB0aGUgYmVnaW5uaW5nIGZpcnN0LAogICAgICAvLyBidXQgaWYgdGhlIGN1cnNvciBpcyBpbiBmcm9udCBvZiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIHN5bWIsCiAgICAgIC8vIHRoZW4gbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQKICAgICAgaWYgKGN1ci5jaCA8IGZpcnN0SW5kZXgpIHsKICAgICAgICBjdXIuY2ggPSBmaXJzdEluZGV4OwogICAgICAgIC8vIFdoeSBpcyB0aGlzIGxpbmUgZXZlbiBoZXJlPz8/CiAgICAgICAgLy8gY20uc2V0Q3Vyc29yKGN1ci5saW5lLCBmaXJzdEluZGV4KzEpOwogICAgICB9CiAgICAgIC8vIG90aGVyd2lzZSBpZiB0aGUgY3Vyc29yIGlzIGN1cnJlbnRseSBvbiB0aGUgY2xvc2luZyBzeW1ib2wKICAgICAgZWxzZSBpZiAoZmlyc3RJbmRleCA8IGN1ci5jaCAmJiBjaGFyc1tjdXIuY2hdID09IHN5bWIpIHsKICAgICAgICBlbmQgPSBjdXIuY2g7IC8vIGFzc2lnbiBlbmQgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCiAgICAgICAgLS1jdXIuY2g7IC8vIG1ha2Ugc3VyZSB0byBsb29rIGJhY2t3YXJkcwogICAgICB9CgogICAgICAvLyBpZiB3ZSdyZSBjdXJyZW50bHkgb24gdGhlIHN5bWJvbCwgd2UndmUgZ290IGEgc3RhcnQKICAgICAgaWYgKGNoYXJzW2N1ci5jaF0gPT0gc3ltYiAmJiAhZW5kKSB7CiAgICAgICAgc3RhcnQgPSBjdXIuY2ggKyAxOyAvLyBhc3NpZ24gc3RhcnQgdG8gYWhlYWQgb2YgdGhlIGN1cnNvcgogICAgICB9IGVsc2UgewogICAgICAgIC8vIGdvIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBzdGFydAogICAgICAgIGZvciAoaSA9IGN1ci5jaDsgaSA+IC0xICYmICFzdGFydDsgaS0tKSB7CiAgICAgICAgICBpZiAoY2hhcnNbaV0gPT0gc3ltYikgewogICAgICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gbG9vayBmb3J3YXJkcyBmb3IgdGhlIGVuZCBzeW1ib2wKICAgICAgaWYgKHN0YXJ0ICYmICFlbmQpIHsKICAgICAgICBmb3IgKGkgPSBzdGFydCwgbGVuID0gY2hhcnMubGVuZ3RoOyBpIDwgbGVuICYmICFlbmQ7IGkrKykgewogICAgICAgICAgaWYgKGNoYXJzW2ldID09IHN5bWIpIHsKICAgICAgICAgICAgZW5kID0gaTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIG5vdGhpbmcgZm91bmQKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSB7CiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IGN1ciwgZW5kOiBjdXIgfTsKICAgICAgfQoKICAgICAgLy8gaW5jbHVkZSB0aGUgc3ltYm9scwogICAgICBpZiAoaW5jbHVzaXZlKSB7CiAgICAgICAgLS1zdGFydDsgKytlbmQ7CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgc3RhcnQ6IHsgbGluZTogY3VyLmxpbmUsIGNoOiBzdGFydCB9LAogICAgICAgIGVuZDogeyBsaW5lOiBjdXIubGluZSwgY2g6IGVuZCB9CiAgICAgIH07CiAgICB9CgogICAgLy8gU2VhcmNoIGZ1bmN0aW9ucwogICAgZnVuY3Rpb24gU2VhcmNoU3RhdGUoKSB7CiAgICAgIC8vIEhpZ2hsaWdodGVkIHRleHQgdGhhdCBtYXRjaCB0aGUgcXVlcnkuCiAgICAgIHRoaXMubWFya2VkID0gbnVsbDsKICAgIH0KICAgIFNlYXJjaFN0YXRlLnByb3RvdHlwZSA9IHsKICAgICAgZ2V0UXVlcnk6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBnZXRWaW1HbG9iYWxTdGF0ZSgpLnF1ZXJ5OwogICAgICB9LAogICAgICBzZXRRdWVyeTogZnVuY3Rpb24ocXVlcnkpIHsKICAgICAgICBnZXRWaW1HbG9iYWxTdGF0ZSgpLnF1ZXJ5ID0gcXVlcnk7CiAgICAgIH0sCiAgICAgIGdldE1hcmtlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWFya2VkOwogICAgICB9LAogICAgICBzZXRNYXJrZWQ6IGZ1bmN0aW9uKG1hcmtlZCkgewogICAgICAgIHRoaXMubWFya2VkID0gbWFya2VkOwogICAgICB9LAogICAgICBpc1JldmVyc2VkOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZ2V0VmltR2xvYmFsU3RhdGUoKS5pc1JldmVyc2VkOwogICAgICB9LAogICAgICBzZXRSZXZlcnNlZDogZnVuY3Rpb24ocmV2ZXJzZWQpIHsKICAgICAgICBnZXRWaW1HbG9iYWxTdGF0ZSgpLmlzUmV2ZXJzZWQgPSByZXZlcnNlZDsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGdldFNlYXJjaFN0YXRlKGNtKSB7CiAgICAgIHZhciB2aW0gPSBnZXRWaW1TdGF0ZShjbSk7CiAgICAgIHJldHVybiB2aW0uc2VhcmNoU3RhdGVfIHx8ICh2aW0uc2VhcmNoU3RhdGVfID0gbmV3IFNlYXJjaFN0YXRlKCkpOwogICAgfQogICAgZnVuY3Rpb24gZGlhbG9nKGNtLCB0ZXh0LCBzaG9ydFRleHQsIGNhbGxiYWNrKSB7CiAgICAgIGlmIChjbS5vcGVuRGlhbG9nKSB7CiAgICAgICAgY20ub3BlbkRpYWxvZyh0ZXh0LCBjYWxsYmFjaywge2JvdHRvbTogdHJ1ZX0pOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGNhbGxiYWNrKHByb21wdChzaG9ydFRleHQsICIiKSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGZpbmRVbmVzY2FwZWRTbGFzaGVzKHN0cikgewogICAgICB2YXIgZXNjYXBlTmV4dENoYXIgPSBmYWxzZTsKICAgICAgdmFyIHNsYXNoZXMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgYyA9IHN0ci5jaGFyQXQoaSk7CiAgICAgICAgaWYgKCFlc2NhcGVOZXh0Q2hhciAmJiBjID09ICcvJykgewogICAgICAgICAgc2xhc2hlcy5wdXNoKGkpOwogICAgICAgIH0KICAgICAgICBlc2NhcGVOZXh0Q2hhciA9IChjID09ICdcXCcpOwogICAgICB9CiAgICAgIHJldHVybiBzbGFzaGVzOwogICAgfQogICAgLyoqCiAgICAgKiBFeHRyYWN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgcXVlcnkgYW5kIHJldHVybiBhIFJlZ2V4cCBvYmplY3QuCiAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHF1ZXJ5IGlzIGJsYW5rLgogICAgICogSWYgaWdub3JlQ2FzZSBpcyBwYXNzZWQgaW4sIHRoZSBSZWdleHAgb2JqZWN0IHdpbGwgaGF2ZSB0aGUgJ2knIGZsYWcgc2V0LgogICAgICogSWYgc21hcnRDYXNlIGlzIHBhc3NlZCBpbiwgYW5kIHRoZSBxdWVyeSBjb250YWlucyB1cHBlciBjYXNlIGxldHRlcnMsCiAgICAgKiAgIHRoZW4gaWdub3JlQ2FzZSBpcyBvdmVycmlkZGVuLCBhbmQgdGhlICdpJyBmbGFnIHdpbGwgbm90IGJlIHNldC4KICAgICAqIElmIHRoZSBxdWVyeSBjb250YWlucyB0aGUgL2kgaW4gdGhlIGZsYWcgcGFydCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLAogICAgICogICB0aGVuIGJvdGggaWdub3JlQ2FzZSBhbmQgc21hcnRDYXNlIGFyZSBpZ25vcmVkLCBhbmQgJ2knIHdpbGwgYmUgcGFzc2VkCiAgICAgKiAgIHRocm91Z2ggdG8gdGhlIFJlZ2V4IG9iamVjdC4KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VRdWVyeShjbSwgcXVlcnksIGlnbm9yZUNhc2UsIHNtYXJ0Q2FzZSkgewogICAgICAvLyBGaXJzdCB0cnkgdG8gZXh0cmFjdCByZWdleCArIGZsYWdzIGZyb20gdGhlIGlucHV0LiBJZiBubyBmbGFncyBmb3VuZCwKICAgICAgLy8gZXh0cmFjdCBqdXN0IHRoZSByZWdleC4gSUUgZG9lcyBub3QgYWNjZXB0IGZsYWdzIGRpcmVjdGx5IGRlZmluZWQgaW4KICAgICAgLy8gdGhlIHJlZ2V4IHN0cmluZyBpbiB0aGUgZm9ybSAvcmVnZXgvZmxhZ3MKICAgICAgdmFyIHNsYXNoZXMgPSBmaW5kVW5lc2NhcGVkU2xhc2hlcyhxdWVyeSk7CiAgICAgIHZhciByZWdleFBhcnQ7CiAgICAgIHZhciBmb3JjZUlnbm9yZUNhc2U7CiAgICAgIGlmICghc2xhc2hlcy5sZW5ndGgpIHsKICAgICAgICAvLyBRdWVyeSBsb29rcyBsaWtlICdyZWdleHAnCiAgICAgICAgcmVnZXhQYXJ0ID0gcXVlcnk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUXVlcnkgbG9va3MgbGlrZSAncmVnZXhwLy4uLicKICAgICAgICByZWdleFBhcnQgPSBxdWVyeS5zdWJzdHJpbmcoMCwgc2xhc2hlc1swXSk7CiAgICAgICAgdmFyIGZsYWdzUGFydCA9IHF1ZXJ5LnN1YnN0cmluZyhzbGFzaGVzWzBdKTsKICAgICAgICBmb3JjZUlnbm9yZUNhc2UgPSAoZmxhZ3NQYXJ0LmluZGV4T2YoJ2knKSAhPSAtMSk7CiAgICAgIH0KICAgICAgaWYgKCFyZWdleFBhcnQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoc21hcnRDYXNlKSB7CiAgICAgICAgaWdub3JlQ2FzZSA9ICgvXlteQS1aXSokLykudGVzdChyZWdleFBhcnQpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVnZXhQYXJ0LAogICAgICAgICAgICAoaWdub3JlQ2FzZSB8fCBmb3JjZUlnbm9yZUNhc2UpID8gJ2knIDogdW5kZWZpbmVkKTsKICAgICAgICByZXR1cm4gcmVnZXhwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgc2hvd0NvbmZpcm0oY20sICdJbnZhbGlkIHJlZ2V4OiAnICsgcmVnZXhQYXJ0KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2hvd0NvbmZpcm0oY20sIHRleHQpIHsKICAgICAgaWYgKGNtLm9wZW5Db25maXJtKSB7CiAgICAgICAgY20ub3BlbkNvbmZpcm0oJzxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj4nICsgdGV4dCArCiAgICAgICAgICAgICc8L3NwYW4+IDxidXR0b24gdHlwZT0iYnV0dG9uIj5PSzwvYnV0dG9uPicsIGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgIHtib3R0b206IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhbGVydCh0ZXh0KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbWFrZVByb21wdChwcmVmaXgsIGRlc2MpIHsKICAgICAgdmFyIHJhdyA9ICcnOwogICAgICBpZiAocHJlZml4KSB7CiAgICAgICAgcmF3ICs9ICc8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZSI+JyArIHByZWZpeCArICc8L3NwYW4+JzsKICAgICAgfQogICAgICByYXcgKz0gJzxpbnB1dCB0eXBlPSJ0ZXh0Ii8+ICcgKwogICAgICAgICAgJzxzcGFuIHN0eWxlPSJjb2xvcjogIzg4OCI+JzsKICAgICAgaWYgKGRlc2MpIHsKICAgICAgICByYXcgKz0gJzxzcGFuIHN0eWxlPSJjb2xvcjogIzg4OCI+JzsKICAgICAgICByYXcgKz0gZGVzYzsKICAgICAgICByYXcgKz0gJzwvc3Bhbj4nOwogICAgICB9CiAgICAgIHJldHVybiByYXc7CiAgICB9CiAgICB2YXIgc2VhcmNoUHJvbXB0RGVzYyA9ICcoSmF2YXNjcmlwdCByZWdleHApJzsKICAgIGZ1bmN0aW9uIHNob3dQcm9tcHQoY20sIG9uUHJvbXB0Q2xvc2UsIHByZWZpeCwgZGVzYykgewogICAgICB2YXIgc2hvcnRUZXh0ID0gKHByZWZpeCB8fCAnJykgKyAnICcgKyAoZGVzYyB8fCAnJyk7CiAgICAgIGRpYWxvZyhjbSwgbWFrZVByb21wdChwcmVmaXgsIGRlc2MpLCBzaG9ydFRleHQsIG9uUHJvbXB0Q2xvc2UpOwogICAgfQogICAgZnVuY3Rpb24gcmVnZXhFcXVhbChyMSwgcjIpIHsKICAgICAgaWYgKHIxIGluc3RhbmNlb2YgUmVnRXhwICYmIHIyIGluc3RhbmNlb2YgUmVnRXhwKSB7CiAgICAgICAgICB2YXIgcHJvcHMgPSBbImdsb2JhbCIsICJtdWx0aWxpbmUiLCAiaWdub3JlQ2FzZSIsICJzb3VyY2UiXTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2ldOwogICAgICAgICAgICAgIGlmIChyMVtwcm9wXSAhPT0gcjJbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuKGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZVNlYXJjaFF1ZXJ5KGNtLCByYXdRdWVyeSwgaWdub3JlQ2FzZSwgc21hcnRDYXNlKSB7CiAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RhdGUgPSBnZXRTZWFyY2hTdGF0ZShjbSk7CiAgICAgICAgaWYgKCFyYXdRdWVyeSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgcXVlcnkgPSBwYXJzZVF1ZXJ5KGNtLCByYXdRdWVyeSwgISFpZ25vcmVDYXNlLCAhIXNtYXJ0Q2FzZSk7CiAgICAgICAgaWYgKCFxdWVyeSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocmVnZXhFcXVhbChxdWVyeSwgc3RhdGUuZ2V0UXVlcnkoKSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY2xlYXJTZWFyY2hIaWdobGlnaHQoY20pOwogICAgICAgIGhpZ2hsaWdodFNlYXJjaE1hdGNoZXMoY20sIHF1ZXJ5KTsKICAgICAgICBzdGF0ZS5zZXRRdWVyeShxdWVyeSk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gaGlnaGxpZ2h0U2VhcmNoTWF0Y2hlcyhjbSwgcXVlcnkpIHsKICAgICAgLy8gVE9ETzogSGlnaGxpZ2h0IG9ubHkgdGV4dCBpbnNpZGUgdGhlIHZpZXdwb3J0LiBIaWdobGlnaHRpbmcgZXZlcnl0aGluZwogICAgICAvLyBpcyBpbmVmZmljaWVudCBhbmQgZXhwZW5zaXZlLgogICAgICBpZiAoY20ubGluZUNvdW50KCkgPCAyMDAwKSB7IC8vIFRoaXMgaXMgdG9vIGV4cGVuc2l2ZSBvbiBiaWcgZG9jdW1lbnRzLgogICAgICAgIHZhciBtYXJrZWQgPSBbXTsKICAgICAgICBmb3IgKHZhciBjdXJzb3IgPSBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnkpOwogICAgICAgICAgICBjdXJzb3IuZmluZE5leHQoKTspIHsKICAgICAgICAgIG1hcmtlZC5wdXNoKGNtLm1hcmtUZXh0KGN1cnNvci5mcm9tKCksIGN1cnNvci50bygpLAogICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnQ29kZU1pcnJvci1zZWFyY2hpbmcnIH0pKTsKICAgICAgICB9CiAgICAgICAgZ2V0U2VhcmNoU3RhdGUoY20pLnNldE1hcmtlZChtYXJrZWQpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTmV4dChjbSwgcHJldiwgcmVwZWF0KSB7CiAgICAgIHJldHVybiBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN0YXRlID0gZ2V0U2VhcmNoU3RhdGUoY20pOwogICAgICAgIHZhciBxdWVyeSA9IHN0YXRlLmdldFF1ZXJ5KCk7CiAgICAgICAgaWYgKCFxdWVyeSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0YXRlLmdldE1hcmtlZCgpKSB7CiAgICAgICAgICBoaWdobGlnaHRTZWFyY2hNYXRjaGVzKGNtLCBxdWVyeSk7CiAgICAgICAgfQogICAgICAgIHZhciBwb3MgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICAvLyBJZiBzZWFyY2ggaXMgaW5pdGlhdGVkIHdpdGggPyBpbnN0ZWFkIG9mIC8sIG5lZ2F0ZSBkaXJlY3Rpb24uCiAgICAgICAgcHJldiA9IChzdGF0ZS5pc1JldmVyc2VkKCkpID8gIXByZXYgOiBwcmV2OwogICAgICAgIGlmICghcHJldikgewogICAgICAgICAgcG9zLmNoICs9IDE7CiAgICAgICAgfQogICAgICAgIHZhciBjdXJzb3IgPSBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnksIHBvcyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewogICAgICAgICAgaWYgKCFjdXJzb3IuZmluZChwcmV2KSkgewogICAgICAgICAgICAvLyBTZWFyY2hDdXJzb3IgbWF5IGhhdmUgcmV0dXJuZWQgbnVsbCBiZWNhdXNlIGl0IGhpdCBFT0YsIHdyYXAKICAgICAgICAgICAgLy8gYXJvdW5kIGFuZCB0cnkgYWdhaW4uCiAgICAgICAgICAgIGN1cnNvciA9IGNtLmdldFNlYXJjaEN1cnNvcihxdWVyeSwKICAgICAgICAgICAgICAgIChwcmV2KSA/IHsgbGluZTogY20ubGluZUNvdW50KCkgLSAxfSA6IHtsaW5lOiAwLCBjaDogMH0gKTsKICAgICAgICAgICAgaWYgKCFjdXJzb3IuZmluZChwcmV2KSkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY3Vyc29yLmZyb20oKTsKICAgICAgfSk7fQogICAgZnVuY3Rpb24gY2xlYXJTZWFyY2hIaWdobGlnaHQoY20pIHsKICAgICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdGF0ZSA9IGdldFNlYXJjaFN0YXRlKGNtKTsKICAgICAgICBpZiAoIXN0YXRlLmdldFF1ZXJ5KCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIG1hcmtlZCA9IHN0YXRlLmdldE1hcmtlZCgpOwogICAgICAgIGlmICghbWFya2VkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2VkLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBtYXJrZWRbaV0uY2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgc3RhdGUuc2V0TWFya2VkKG51bGwpOwogICAgICB9KTt9CgogICAgLy8gRXggY29tbWFuZCBoYW5kbGluZwogICAgLy8gQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gYWRkaW5nIHRvIHRoZSBkZWZhdWx0IEV4IGNvbW1hbmQgbWFwLiBGb3IgYW55CiAgICAvLyBwYWlyIG9mIGNvbW1hbmRzIHRoYXQgaGF2ZSBhIHNoYXJlZCBwcmVmaXgsIGF0IGxlYXN0IG9uZSBvZiB0aGVpcgogICAgLy8gc2hvcnROYW1lcyBtdXN0IG5vdCBtYXRjaCB0aGUgcHJlZml4IG9mIHRoZSBvdGhlciBjb21tYW5kLgogICAgdmFyIGRlZmF1bHRFeENvbW1hbmRNYXAgPSBbCiAgICAgIHsgbmFtZTogJ21hcCcsIHR5cGU6ICdidWlsdEluJyB9LAogICAgICB7IG5hbWU6ICd3cml0ZScsIHNob3J0TmFtZTogJ3cnLCB0eXBlOiAnYnVpbHRJbicgfSwKICAgICAgeyBuYW1lOiAndW5kbycsIHNob3J0TmFtZTogJ3UnLCB0eXBlOiAnYnVpbHRJbicgfSwKICAgICAgeyBuYW1lOiAncmVkbycsIHNob3J0TmFtZTogJ3JlZCcsIHR5cGU6ICdidWlsdEluJyB9CiAgICBdOwogICAgdmFyIEV4Q29tbWFuZERpc3BhdGNoZXIgPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5idWlsZENvbW1hbmRNYXBfKCk7CiAgICB9OwogICAgRXhDb21tYW5kRGlzcGF0Y2hlci5wcm90b3R5cGUgPSB7CiAgICAgIHByb2Nlc3NDb21tYW5kOiBmdW5jdGlvbihjbSwgaW5wdXQpIHsKICAgICAgICB2YXIgcGFyYW1zID0gdGhpcy5wYXJzZUlucHV0XyhpbnB1dCk7CiAgICAgICAgdmFyIGNvbW1hbmROYW1lOwogICAgICAgIGlmICghcGFyYW1zLmNvbW1hbmROYW1lKSB7CiAgICAgICAgICAvLyBJZiBvbmx5IGEgbGluZSByYW5nZSBpcyBkZWZpbmVkLCBtb3ZlIHRvIHRoZSBsaW5lLgogICAgICAgICAgaWYgKHBhcmFtcy5saW5lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29tbWFuZE5hbWUgPSAnbW92ZSc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBjb21tYW5kID0gdGhpcy5tYXRjaENvbW1hbmRfKHBhcmFtcy5jb21tYW5kTmFtZSk7CiAgICAgICAgICBpZiAoY29tbWFuZCkgewogICAgICAgICAgICBjb21tYW5kTmFtZSA9IGNvbW1hbmQubmFtZTsKICAgICAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PSAnZXhUb0tleScpIHsKICAgICAgICAgICAgICAvLyBIYW5kbGUgRXggdG8gS2V5IG1hcHBpbmcuCiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tYW5kLnRvS2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmltLmhhbmRsZUtleShjbSwgY29tbWFuZC50b0tleXNbaV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC50eXBlID09ICdleFRvRXgnKSB7CiAgICAgICAgICAgICAgLy8gSGFuZGxlIEV4IHRvIEV4IG1hcHBpbmcuCiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29tbWFuZChjbSwgY29tbWFuZC50b0lucHV0KTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFjb21tYW5kTmFtZSkgewogICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdOb3QgYW4gZWRpdG9yIGNvbW1hbmQgIjonICsgaW5wdXQgKyAnIicpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBleENvbW1hbmRzW2NvbW1hbmROYW1lXShjbSwgcGFyYW1zKTsKICAgICAgfSwKICAgICAgcGFyc2VJbnB1dF86IGZ1bmN0aW9uKGlucHV0KSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgIHJlc3VsdC5pbnB1dCA9IGlucHV0OwogICAgICAgIHZhciBpZHggPSAwOwogICAgICAgIC8vIFRyaW0gcHJlY2VkaW5nICc6Jy4KICAgICAgICB2YXIgY29sb25zID0gKC9eOisvKS5leGVjKGlucHV0KTsKICAgICAgICBpZiAoY29sb25zKSB7CiAgICAgICAgICBpZHggKz0gY29sb25zWzBdLmxlbmd0aDsKICAgICAgICB9CgogICAgICAgIC8vIFBhcnNlIHJhbmdlLgogICAgICAgIHZhciBudW1iZXJNYXRjaCA9ICgvXihcZCspLykuZXhlYyhpbnB1dC5zdWJzdHJpbmcoaWR4KSk7CiAgICAgICAgaWYgKG51bWJlck1hdGNoKSB7CiAgICAgICAgICByZXN1bHQubGluZSA9IHBhcnNlSW50KG51bWJlck1hdGNoWzFdLCAxMCk7CiAgICAgICAgICBpZHggKz0gbnVtYmVyTWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgIH0KCiAgICAgICAgLy8gUGFyc2UgY29tbWFuZCBuYW1lLgogICAgICAgIHZhciBjb21tYW5kTWF0Y2ggPSAoL14oXHcrKS8pLmV4ZWMoaW5wdXQuc3Vic3RyaW5nKGlkeCkpOwogICAgICAgIGlmIChjb21tYW5kTWF0Y2gpIHsKICAgICAgICAgIHJlc3VsdC5jb21tYW5kTmFtZSA9IGNvbW1hbmRNYXRjaFsxXTsKICAgICAgICAgIGlkeCArPSBjb21tYW5kTWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgIH0KCiAgICAgICAgLy8gUGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cwogICAgICAgIHZhciBhcmdzID0gdHJpbShpbnB1dC5zdWJzdHJpbmcoaWR4KSkuc3BsaXQoL1xzKy8pOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCAmJiBhcmdzWzBdKSB7CiAgICAgICAgICByZXN1bHQuY29tbWFuZEFyZ3MgPSBhcmdzOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfSwKICAgICAgbWF0Y2hDb21tYW5kXzogZnVuY3Rpb24oY29tbWFuZE5hbWUpIHsKICAgICAgICAvLyBSZXR1cm4gdGhlIGNvbW1hbmQgaW4gdGhlIGNvbW1hbmQgbWFwIHRoYXQgbWF0Y2hlcyB0aGUgc2hvcnRlc3QKICAgICAgICAvLyBwcmVmaXggb2YgdGhlIHBhc3NlZCBpbiBjb21tYW5kIG5hbWUuIFRoZSBtYXRjaCBpcyBndWFyYW50ZWVkIHRvIGJlCiAgICAgICAgLy8gdW5hbWJpZ3VvdXMgaWYgdGhlIGRlZmF1bHRFeENvbW1hbmRNYXAncyBzaG9ydE5hbWVzIGFyZSBzZXQgdXAKICAgICAgICAvLyBjb3JyZWN0bHkuIChzZWUgQGNvZGV7ZGVmYXVsdEV4Q29tbWFuZE1hcH0pLgogICAgICAgIGZvciAodmFyIGkgPSBjb21tYW5kTmFtZS5sZW5ndGg7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgIHZhciBwcmVmaXggPSBjb21tYW5kTmFtZS5zdWJzdHJpbmcoMCwgaSk7CiAgICAgICAgICBpZiAodGhpcy5jb21tYW5kTWFwX1twcmVmaXhdKSB7CiAgICAgICAgICAgIHZhciBjb21tYW5kID0gdGhpcy5jb21tYW5kTWFwX1twcmVmaXhdOwogICAgICAgICAgICBpZiAoY29tbWFuZC5uYW1lLmluZGV4T2YoY29tbWFuZE5hbWUpID09PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0sCiAgICAgIGJ1aWxkQ29tbWFuZE1hcF86IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuY29tbWFuZE1hcF8gPSB7fTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlZmF1bHRFeENvbW1hbmRNYXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBjb21tYW5kID0gZGVmYXVsdEV4Q29tbWFuZE1hcFtpXTsKICAgICAgICAgIHZhciBrZXkgPSBjb21tYW5kLnNob3J0TmFtZSB8fCBjb21tYW5kLm5hbWU7CiAgICAgICAgICB0aGlzLmNvbW1hbmRNYXBfW2tleV0gPSBjb21tYW5kOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbWFwOiBmdW5jdGlvbihsaHMsIHJocykgewogICAgICAgIGlmIChsaHMuY2hhckF0KDApID09ICc6JykgewogICAgICAgICAgdmFyIGNvbW1hbmROYW1lID0gbGhzLnN1YnN0cmluZygxKTsKICAgICAgICAgIGlmIChyaHMuY2hhckF0KDApID09ICc6JykgewogICAgICAgICAgICAvLyBFeCB0byBFeCBtYXBwaW5nCiAgICAgICAgICAgIHRoaXMuY29tbWFuZE1hcF9bY29tbWFuZE5hbWVdID0gewogICAgICAgICAgICAgIG5hbWU6IGNvbW1hbmROYW1lLAogICAgICAgICAgICAgIHR5cGU6ICdleFRvRXgnLAogICAgICAgICAgICAgIHRvSW5wdXQ6IHJocy5zdWJzdHJpbmcoMSkKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEV4IHRvIGtleSBtYXBwaW5nCiAgICAgICAgICAgIHRoaXMuY29tbWFuZE1hcF9bY29tbWFuZE5hbWVdID0gewogICAgICAgICAgICAgIG5hbWU6IGNvbW1hbmROYW1lLAogICAgICAgICAgICAgIHR5cGU6ICdleFRvS2V5JywKICAgICAgICAgICAgICB0b0tleXM6IHBhcnNlS2V5U3RyaW5nKHJocykKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHJocy5jaGFyQXQoMCkgPT0gJzonKSB7CiAgICAgICAgICAgIC8vIEtleSB0byBFeCBtYXBwaW5nLgogICAgICAgICAgICBkZWZhdWx0S2V5bWFwLnVuc2hpZnQoewogICAgICAgICAgICAgIGtleXM6IHBhcnNlS2V5U3RyaW5nKGxocyksCiAgICAgICAgICAgICAgdHlwZTogJ2tleVRvRXgnLAogICAgICAgICAgICAgIGV4QXJnczogeyBpbnB1dDogcmhzLnN1YnN0cmluZygxKSB9fSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBLZXkgdG8ga2V5IG1hcHBpbmcKICAgICAgICAgICAgZGVmYXVsdEtleW1hcC51bnNoaWZ0KHsKICAgICAgICAgICAgICBrZXlzOiBwYXJzZUtleVN0cmluZyhsaHMpLAogICAgICAgICAgICAgIHR5cGU6ICdrZXlUb0tleScsCiAgICAgICAgICAgICAgdG9LZXlzOiBwYXJzZUtleVN0cmluZyhyaHMpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvLyBDb252ZXJ0cyBhIGtleSBzdHJpbmcgc2VxdWVuY2Ugb2YgdGhlIGZvcm0gYTxDLXc+YmQ8TGVmdD4gaW50byBWaW0ncwogICAgLy8ga2V5bWFwIHJlcHJlc2VudGF0aW9uLgogICAgZnVuY3Rpb24gcGFyc2VLZXlTdHJpbmcoc3RyKSB7CiAgICAgIHZhciBpZHggPSAwOwogICAgICB2YXIga2V5cyA9IFtdOwogICAgICB3aGlsZSAoaWR4IDwgc3RyLmxlbmd0aCkgewogICAgICAgIGlmIChzdHIuY2hhckF0KGlkeCkgIT0gJzwnKSB7CiAgICAgICAgICBrZXlzLnB1c2goc3RyLmNoYXJBdChpZHgpKTsKICAgICAgICAgIGlkeCsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8vIFZpbSBrZXkgbm90YXRpb24gaGVyZSBtZWFucyBkZXNrdG9wIFZpbSBrZXktbm90YXRpb24uCiAgICAgICAgLy8gU2VlIDpoZWxwIGtleS1ub3RhdGlvbiBpbiBkZXNrdG9wIFZpbS4KICAgICAgICB2YXIgdmltS2V5Tm90YXRpb25TdGFydCA9ICsraWR4OwogICAgICAgIHdoaWxlIChzdHIuY2hhckF0KGlkeCsrKSAhPSAnPicpIHt9CiAgICAgICAgdmFyIHZpbUtleU5vdGF0aW9uID0gc3RyLnN1YnN0cmluZyh2aW1LZXlOb3RhdGlvblN0YXJ0LCBpZHggLSAxKTsKICAgICAgICB2YXIgbWF0Y2ggPSAoL15DLSguKykkLykuZXhlYyh2aW1LZXlOb3RhdGlvbik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICB2YXIga2V5OwogICAgICAgICAgc3dpdGNoIChtYXRjaFsxXSkgewogICAgICAgICAgICBjYXNlICdCUyc6CiAgICAgICAgICAgICAga2V5ID0gJ0JhY2tzcGFjZSc7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ0NSJzoKICAgICAgICAgICAgICBrZXkgPSAnRW50ZXInOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdEZWwnOgogICAgICAgICAgICAgIGtleSA9ICdEZWxldGUnOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGtleSA9IG1hdGNoWzFdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAga2V5cy5wdXNoKCdDdHJsLScgKyBrZXkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4ga2V5czsKICAgIH0KCiAgICB2YXIgZXhDb21tYW5kcyA9IHsKICAgICAgbWFwOiBmdW5jdGlvbihjbSwgcGFyYW1zKSB7CiAgICAgICAgdmFyIG1hcEFyZ3MgPSBwYXJhbXMuY29tbWFuZEFyZ3M7CiAgICAgICAgaWYgKCFtYXBBcmdzIHx8IG1hcEFyZ3MubGVuZ3RoIDwgMikgewogICAgICAgICAgaWYgKGNtKSB7CiAgICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnSW52YWxpZCBtYXBwaW5nOiAnICsgcGFyYW1zLmlucHV0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZXhDb21tYW5kRGlzcGF0Y2hlci5tYXAobWFwQXJnc1swXSwgbWFwQXJnc1sxXSwgY20pOwogICAgICB9LAogICAgICBtb3ZlOiBmdW5jdGlvbihjbSwgcGFyYW1zKSB7CiAgICAgICAgY29tbWFuZERpc3BhdGNoZXIucHJvY2Vzc01vdGlvbihjbSwgZ2V0VmltU3RhdGUoY20pLCB7CiAgICAgICAgICAgIG1vdGlvbjogJ21vdmVUb0xpbmVPckVkZ2VPZkRvY3VtZW50JywKICAgICAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgZXhwbGljaXRSZXBlYXQ6IHRydWUsCiAgICAgICAgICAgICAgbGluZXdpc2U6IHRydWUsIHJlcGVhdDogcGFyYW1zLmxpbmUgfX0pOwogICAgICB9LAogICAgICByZWRvOiBDb2RlTWlycm9yLmNvbW1hbmRzLnJlZG8sCiAgICAgIHVuZG86IENvZGVNaXJyb3IuY29tbWFuZHMudW5kbywKICAgICAgd3JpdGU6IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgaWYgKENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSkgewogICAgICAgICAgLy8gSWYgYSBzYXZlIGNvbW1hbmQgaXMgZGVmaW5lZCwgY2FsbCBpdC4KICAgICAgICAgIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZShjbSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFNhdmVzIHRvIHRleHQgYXJlYSBpZiBubyBzYXZlIGNvbW1hbmQgaXMgZGVmaW5lZC4KICAgICAgICAgIGNtLnNhdmUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgdmFyIGV4Q29tbWFuZERpc3BhdGNoZXIgPSBuZXcgRXhDb21tYW5kRGlzcGF0Y2hlcigpOwoKICAgIC8vIFJlZ2lzdGVyIFZpbSB3aXRoIENvZGVNaXJyb3IKICAgIGZ1bmN0aW9uIGJ1aWxkVmltS2V5TWFwKCkgewogICAgICAvKioKICAgICAgICogSGFuZGxlIHRoZSByYXcga2V5IGV2ZW50IGZyb20gQ29kZU1pcnJvci4gVHJhbnNsYXRlIHRoZQogICAgICAgKiBTaGlmdCArIGtleSBtb2RpZmllciB0byB0aGUgcmVzdWx0aW5nIGxldHRlciwgd2hpbGUgcHJlc2VydmluZyBvdGhlcgogICAgICAgKiBtb2RpZmVycy4KICAgICAgICovCiAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgYSB3YXkgdG8gY2F0Y2ggY2Fwc2xvY2suCiAgICAgIGZ1bmN0aW9uIGhhbmRsZUtleUV2ZW50XyhjbSwga2V5LCBtb2RpZmllcikgewogICAgICAgIGlmIChpc1VwcGVyQ2FzZShrZXkpKSB7CiAgICAgICAgICAvLyBDb252ZXJ0IHRvIGxvd2VyIGNhc2UgaWYgc2hpZnQgaXMgbm90IHRoZSBtb2RpZmllciBzaW5jZSB0aGUga2V5CiAgICAgICAgICAvLyB3ZSBnZXQgZnJvbSBDb2RlTWlycm9yIGlzIGFsd2F5cyB1cHBlciBjYXNlLgogICAgICAgICAgaWYgKG1vZGlmaWVyID09ICdTaGlmdCcpIHsKICAgICAgICAgICAgbW9kaWZpZXIgPSBudWxsOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobW9kaWZpZXIpIHsKICAgICAgICAgIC8vIFZpbSB3aWxsIHBhcnNlIG1vZGlmaWVyK2tleSBjb21iaW5hdGlvbiBhcyBhIHNpbmdsZSBrZXkuCiAgICAgICAgICBrZXkgPSBtb2RpZmllciArICctJyArIGtleTsKICAgICAgICB9CiAgICAgICAgdmltLmhhbmRsZUtleShjbSwga2V5KTsKICAgICAgfQoKICAgICAgLy8gQ2xvc3VyZSB0byBiaW5kIENvZGVNaXJyb3IsIGtleSwgbW9kaWZpZXIuCiAgICAgIGZ1bmN0aW9uIGtleU1hcHBlcihrZXksIG1vZGlmaWVyKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgICBoYW5kbGVLZXlFdmVudF8oY20sIGtleSwgbW9kaWZpZXIpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHZhciBtb2RpZmllcnMgPSBbJ1NoaWZ0JywgJ0N0cmwnXTsKICAgICAgdmFyIGtleU1hcCA9IHsKICAgICAgICAnbm9mYWxsdGhyb3VnaCc6IHRydWUsCiAgICAgICAgJ3N0eWxlJzogJ2ZhdC1jdXJzb3InCiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIGJpbmRLZXlzKGtleXMsIG1vZGlmaWVyKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTsKICAgICAgICAgIGlmICghbW9kaWZpZXIgJiYgaW5BcnJheShrZXksIHNwZWNpYWxTeW1ib2xzKSkgewogICAgICAgICAgICAvLyBXcmFwIHNwZWNpYWwgc3ltYm9scyB3aXRoICcnIGJlY2F1c2UgdGhhdCdzIGhvdyBDb2RlTWlycm9yIGJpbmRzCiAgICAgICAgICAgIC8vIHRoZW0uCiAgICAgICAgICAgIGtleSA9ICInIiArIGtleSArICInIjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb2RpZmllcikgewogICAgICAgICAgICBrZXlNYXBbbW9kaWZpZXIgKyAnLScgKyBrZXldID0ga2V5TWFwcGVyKGtleXNbaV0sIG1vZGlmaWVyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGtleU1hcFtrZXldID0ga2V5TWFwcGVyKGtleXNbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBiaW5kS2V5cyh1cHBlckNhc2VBbHBoYWJldCk7CiAgICAgIGJpbmRLZXlzKHVwcGVyQ2FzZUFscGhhYmV0LCAnU2hpZnQnKTsKICAgICAgYmluZEtleXModXBwZXJDYXNlQWxwaGFiZXQsICdDdHJsJyk7CiAgICAgIGJpbmRLZXlzKHNwZWNpYWxTeW1ib2xzKTsKICAgICAgYmluZEtleXMoc3BlY2lhbFN5bWJvbHMsICdDdHJsJyk7CiAgICAgIGJpbmRLZXlzKG51bWJlcnMpOwogICAgICBiaW5kS2V5cyhudW1iZXJzLCAnQ3RybCcpOwogICAgICBiaW5kS2V5cyhzcGVjaWFsS2V5cyk7CiAgICAgIGJpbmRLZXlzKHNwZWNpYWxLZXlzLCAnQ3RybCcpOwogICAgICByZXR1cm4ga2V5TWFwOwogICAgfQogICAgQ29kZU1pcnJvci5rZXlNYXAudmltID0gYnVpbGRWaW1LZXlNYXAoKTsKCiAgICBmdW5jdGlvbiBleGl0SW5zZXJ0TW9kZShjbSkgewogICAgICBjbS5zZXRDdXJzb3IoY20uZ2V0Q3Vyc29yKCkubGluZSwgY20uZ2V0Q3Vyc29yKCkuY2gtMSwgdHJ1ZSk7CiAgICAgIGNtLnNldE9wdGlvbigna2V5TWFwJywgJ3ZpbScpOwogICAgfQoKICAgIENvZGVNaXJyb3Iua2V5TWFwWyd2aW0taW5zZXJ0J10gPSB7CiAgICAgIC8vIFRPRE86IG92ZXJyaWRlIG5hdmlnYXRpb24ga2V5cyBzbyB0aGF0IEVzYyB3aWxsIGNhbmNlbCBhdXRvbWF0aWMKICAgICAgLy8gaW5kZW50YXRpb24gZnJvbSBvLCBPLCBpXzxDUj4KICAgICAgJ0VzYyc6IGV4aXRJbnNlcnRNb2RlLAogICAgICAnQ3RybC1bJzogZXhpdEluc2VydE1vZGUsCiAgICAgICdDdHJsLUMnOiBleGl0SW5zZXJ0TW9kZSwKICAgICAgJ0N0cmwtTic6ICdhdXRvY29tcGxldGUnLAogICAgICAnQ3RybC1QJzogJ2F1dG9jb21wbGV0ZScsCiAgICAgICdFbnRlcic6IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgdmFyIGZuID0gQ29kZU1pcnJvci5jb21tYW5kcy5uZXdsaW5lQW5kSW5kZW50Q29udGludWVDb21tZW50IHx8CiAgICAgICAgICAgIENvZGVNaXJyb3IuY29tbWFuZHMubmV3bGluZUFuZEluZGVudDsKICAgICAgICBmbihjbSk7CiAgICAgIH0sCiAgICAgIGZhbGx0aHJvdWdoOiBbJ2RlZmF1bHQnXQogICAgfTsKCiAgICByZXR1cm4gdmltQXBpOwogIH07CiAgLy8gSW5pdGlhbGl6ZSBWaW0gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIGFzIGFuIEFQSS4KICB2YXIgdmltID0gVmltKCk7CiAgQ29kZU1pcnJvci5WaW0gPSB2aW07Cn0KKSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/lib/codemirror.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQkFTSUNTICovCgouQ29kZU1pcnJvciB7CiAgLyogU2V0IGhlaWdodCwgd2lkdGgsIGJvcmRlcnMsIGFuZCBnbG9iYWwgZm9udCBwcm9wZXJ0aWVzIGhlcmUgKi8KICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGhlaWdodDogMzAwcHg7Cn0KLkNvZGVNaXJyb3Itc2Nyb2xsIHsKICAvKiBTZXQgc2Nyb2xsaW5nIGJlaGF2aW91ciBoZXJlICovCiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi8qIFBBRERJTkcgKi8KCi5Db2RlTWlycm9yLWxpbmVzIHsKICBwYWRkaW5nOiA0cHggMDsgLyogVmVydGljYWwgcGFkZGluZyBhcm91bmQgY29udGVudCAqLwp9Ci5Db2RlTWlycm9yIHByZSB7CiAgcGFkZGluZzogMCA0cHg7IC8qIEhvcml6b250YWwgcGFkZGluZyBvZiBjb250ZW50ICovCn0KCi5Db2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXIgewogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyAvKiBUaGUgbGl0dGxlIHNxdWFyZSBiZXR3ZWVuIEggYW5kIFYgc2Nyb2xsYmFycyAqLwp9CgovKiBHVVRURVIgKi8KCi5Db2RlTWlycm9yLWd1dHRlcnMgewogIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKfQouQ29kZU1pcnJvci1saW5lbnVtYmVycyB7fQouQ29kZU1pcnJvci1saW5lbnVtYmVyIHsKICBwYWRkaW5nOiAwIDNweCAwIDVweDsKICBtaW4td2lkdGg6IDIwcHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgY29sb3I6ICM5OTk7Cn0KCi8qIENVUlNPUiAqLwoKLkNvZGVNaXJyb3IgcHJlLkNvZGVNaXJyb3ItY3Vyc29yIHsKICBib3JkZXItbGVmdDogMXB4IHNvbGlkIGJsYWNrOwp9Ci8qIFNob3duIHdoZW4gbW92aW5nIGluIGJpLWRpcmVjdGlvbmFsIHRleHQgKi8KLkNvZGVNaXJyb3IgcHJlLkNvZGVNaXJyb3Itc2Vjb25kYXJ5Y3Vyc29yIHsKICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHNpbHZlcjsKfQouY20ta2V5bWFwLWZhdC1jdXJzb3IgcHJlLkNvZGVNaXJyb3ItY3Vyc29yIHsKICB3aWR0aDogYXV0bzsKICBib3JkZXI6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgYmFja2dyb3VuZDogcmdiYSgwLCAyMDAsIDAsIC40KTsKICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSM2NjAwYzgwMCwgZW5kQ29sb3JzdHI9IzRjMDBjODAwKTsKfQovKiBLbHVkZ2UgdG8gdHVybiBvZmYgZmlsdGVyIGluIGllOSssIHdoaWNoIGFsc28gYWNjZXB0cyByZ2JhICovCi5jbS1rZXltYXAtZmF0LWN1cnNvciBwcmUuQ29kZU1pcnJvci1jdXJzb3I6bm90KCNub25zZW5zZV9pZCkgewogIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KGVuYWJsZWQ9ZmFsc2UpOwp9Ci8qIENhbiBzdHlsZSBjdXJzb3IgZGlmZmVyZW50IGluIG92ZXJ3cml0ZSAobm9uLWluc2VydCkgbW9kZSAqLwouQ29kZU1pcnJvciBwcmUuQ29kZU1pcnJvci1jdXJzb3IuQ29kZU1pcnJvci1vdmVyd3JpdGUge30KCi8qIERFRkFVTFQgVEhFTUUgKi8KCi5jbS1zLWRlZmF1bHQgLmNtLWtleXdvcmQge2NvbG9yOiAjNzA4O30KLmNtLXMtZGVmYXVsdCAuY20tYXRvbSB7Y29sb3I6ICMyMTk7fQouY20tcy1kZWZhdWx0IC5jbS1udW1iZXIge2NvbG9yOiAjMTY0O30KLmNtLXMtZGVmYXVsdCAuY20tZGVmIHtjb2xvcjogIzAwZjt9Ci5jbS1zLWRlZmF1bHQgLmNtLXZhcmlhYmxlIHtjb2xvcjogYmxhY2s7fQouY20tcy1kZWZhdWx0IC5jbS12YXJpYWJsZS0yIHtjb2xvcjogIzA1YTt9Ci5jbS1zLWRlZmF1bHQgLmNtLXZhcmlhYmxlLTMge2NvbG9yOiAjMDg1O30KLmNtLXMtZGVmYXVsdCAuY20tcHJvcGVydHkge2NvbG9yOiBibGFjazt9Ci5jbS1zLWRlZmF1bHQgLmNtLW9wZXJhdG9yIHtjb2xvcjogYmxhY2s7fQouY20tcy1kZWZhdWx0IC5jbS1jb21tZW50IHtjb2xvcjogI2E1MDt9Ci5jbS1zLWRlZmF1bHQgLmNtLXN0cmluZyB7Y29sb3I6ICNhMTE7fQouY20tcy1kZWZhdWx0IC5jbS1zdHJpbmctMiB7Y29sb3I6ICNmNTA7fQouY20tcy1kZWZhdWx0IC5jbS1tZXRhIHtjb2xvcjogIzU1NTt9Ci5jbS1zLWRlZmF1bHQgLmNtLWVycm9yIHtjb2xvcjogI2YwMDt9Ci5jbS1zLWRlZmF1bHQgLmNtLXF1YWxpZmllciB7Y29sb3I6ICM1NTU7fQouY20tcy1kZWZhdWx0IC5jbS1idWlsdGluIHtjb2xvcjogIzMwYTt9Ci5jbS1zLWRlZmF1bHQgLmNtLWJyYWNrZXQge2NvbG9yOiAjOTk3O30KLmNtLXMtZGVmYXVsdCAuY20tdGFnIHtjb2xvcjogIzE3MDt9Ci5jbS1zLWRlZmF1bHQgLmNtLWF0dHJpYnV0ZSB7Y29sb3I6ICMwMGM7fQouY20tcy1kZWZhdWx0IC5jbS1oZWFkZXIge2NvbG9yOiBibHVlO30KLmNtLXMtZGVmYXVsdCAuY20tcXVvdGUge2NvbG9yOiAjMDkwO30KLmNtLXMtZGVmYXVsdCAuY20taHIge2NvbG9yOiAjOTk5O30KLmNtLXMtZGVmYXVsdCAuY20tbGluayB7Y29sb3I6ICMwMGM7fQoKLmNtLW5lZ2F0aXZlIHtjb2xvcjogI2Q0NDt9Ci5jbS1wb3NpdGl2ZSB7Y29sb3I6ICMyOTI7fQouY20taGVhZGVyLCAuY20tc3Ryb25nIHtmb250LXdlaWdodDogYm9sZDt9Ci5jbS1lbSB7Zm9udC1zdHlsZTogaXRhbGljO30KLmNtLWVtc3Ryb25nIHtmb250LXN0eWxlOiBpdGFsaWM7IGZvbnQtd2VpZ2h0OiBib2xkO30KLmNtLWxpbmsge3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO30KCi5jbS1pbnZhbGlkY2hhciB7Y29sb3I6ICNmMDA7fQoKZGl2LkNvZGVNaXJyb3Igc3Bhbi5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7Y29sb3I6ICMwZjA7fQpkaXYuQ29kZU1pcnJvciBzcGFuLkNvZGVNaXJyb3Itbm9ubWF0Y2hpbmdicmFja2V0IHtjb2xvcjogI2YyMjt9CgovKiBTVE9QICovCgovKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgY29udGFpbnMgc3R5bGVzIHJlbGF0ZWQgdG8gdGhlIG1lY2hhbmljcyBvZgogICB0aGUgZWRpdG9yLiBZb3UgcHJvYmFibHkgc2hvdWxkbid0IHRvdWNoIHRoZW0uICovCgouQ29kZU1pcnJvciB7CiAgbGluZS1oZWlnaHQ6IDE7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5Db2RlTWlycm9yLXNjcm9sbCB7CiAgLyogMzBweCBpcyB0aGUgbWFnaWMgbWFyZ2luIHVzZWQgdG8gaGlkZSB0aGUgZWxlbWVudCdzIHJlYWwgc2Nyb2xsYmFycyAqLwogIC8qIFNlZSBvdmVyZmxvdzogaGlkZGVuIGluIC5Db2RlTWlycm9yLCBhbmQgdGhlIHBhZGRpbmdzIGluIC5Db2RlTWlycm9yLXNpemVyICovCiAgbWFyZ2luLWJvdHRvbTogLTMwcHg7IG1hcmdpbi1yaWdodDogLTMwcHg7CiAgcGFkZGluZy1ib3R0b206IDMwcHg7IHBhZGRpbmctcmlnaHQ6IDMwcHg7CiAgaGVpZ2h0OiAxMDAlOwogIG91dGxpbmU6IG5vbmU7IC8qIFByZXZlbnQgZHJhZ2dpbmcgZnJvbSBoaWdobGlnaHRpbmcgdGhlIGVsZW1lbnQgKi8KICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLkNvZGVNaXJyb3Itc2l6ZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLyogVGhlIGZha2UsIHZpc2libGUgc2Nyb2xsYmFycy4gVXNlZCB0byBmb3JjZSByZWRyYXcgZHVyaW5nIHNjcm9sbGluZwogICBiZWZvcmUgYWN0dWFsbCBzY3JvbGxpbmcgaGFwcGVucywgdGh1cyBwcmV2ZW50aW5nIHNoYWtpbmcgYW5kCiAgIGZsaWNrZXJpbmcgYXJ0aWZhY3RzLiAqLwouQ29kZU1pcnJvci12c2Nyb2xsYmFyLCAuQ29kZU1pcnJvci1oc2Nyb2xsYmFyLCAuQ29kZU1pcnJvci1zY3JvbGxiYXItZmlsbGVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgei1pbmRleDogNjsKICBkaXNwbGF5OiBub25lOwp9Ci5Db2RlTWlycm9yLXZzY3JvbGxiYXIgewogIHJpZ2h0OiAwOyB0b3A6IDA7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IHNjcm9sbDsKfQouQ29kZU1pcnJvci1oc2Nyb2xsYmFyIHsKICBib3R0b206IDA7IGxlZnQ6IDA7CiAgb3ZlcmZsb3cteTogaGlkZGVuOwogIG92ZXJmbG93LXg6IHNjcm9sbDsKfQouQ29kZU1pcnJvci1zY3JvbGxiYXItZmlsbGVyIHsKICByaWdodDogMDsgYm90dG9tOiAwOwogIHotaW5kZXg6IDY7Cn0KCi5Db2RlTWlycm9yLWd1dHRlcnMgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiAwOwogIGhlaWdodDogMTAwJTsKICB6LWluZGV4OiAzOwp9Ci5Db2RlTWlycm9yLWd1dHRlciB7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAvKiBIYWNrIHRvIG1ha2UgSUU3IGJlaGF2ZSAqLwogICp6b29tOjE7CiAgKmRpc3BsYXk6aW5saW5lOwp9Ci5Db2RlTWlycm9yLWd1dHRlci1lbHQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBjdXJzb3I6IGRlZmF1bHQ7CiAgei1pbmRleDogNDsKfQoKLkNvZGVNaXJyb3ItbGluZXMgewogIGN1cnNvcjogdGV4dDsKfQouQ29kZU1pcnJvciBwcmUgewogIC8qIFJlc2V0IHNvbWUgc3R5bGVzIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIHBhZ2UgbWlnaHQgaGF2ZSBzZXQgKi8KICAtbW96LWJvcmRlci1yYWRpdXM6IDA7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsgLW8tYm9yZGVyLXJhZGl1czogMDsgYm9yZGVyLXJhZGl1czogMDsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgZm9udC1zaXplOiBpbmhlcml0OwogIG1hcmdpbjogMDsKICB3aGl0ZS1zcGFjZTogcHJlOwogIHdvcmQtd3JhcDogbm9ybWFsOwogIGxpbmUtaGVpZ2h0OiBpbmhlcml0OwogIGNvbG9yOiBpbmhlcml0OwogIHotaW5kZXg6IDI7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG92ZXJmbG93OiB2aXNpYmxlOwp9Ci5Db2RlTWlycm9yLXdyYXAgcHJlIHsKICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogIHdvcmQtYnJlYWs6IG5vcm1hbDsKfQouQ29kZU1pcnJvci1saW5lYmFja2dyb3VuZCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDsKICB6LWluZGV4OiAwOwp9CgouQ29kZU1pcnJvci1saW5ld2lkZ2V0IHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogMjsKfQoKLkNvZGVNaXJyb3Itd3JhcCAuQ29kZU1pcnJvci1zY3JvbGwgewogIG92ZXJmbG93LXg6IGhpZGRlbjsKfQoKLkNvZGVNaXJyb3ItbWVhc3VyZSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDBweDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHZpc2liaWxpdHk6IGhpZGRlbjsKfQouQ29kZU1pcnJvci1tZWFzdXJlIHByZSB7IHBvc2l0aW9uOiBzdGF0aWM7IH0KCi5Db2RlTWlycm9yIHByZS5Db2RlTWlycm9yLWN1cnNvciB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHZpc2liaWxpdHk6IGhpZGRlbjsKICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgd2lkdGg6IDA7Cn0KLkNvZGVNaXJyb3ItZm9jdXNlZCBwcmUuQ29kZU1pcnJvci1jdXJzb3IgewogIHZpc2liaWxpdHk6IHZpc2libGU7Cn0KCi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2Q5ZDlkOTsgfQouQ29kZU1pcnJvci1mb2N1c2VkIC5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2Q3ZDRmMDsgfQoKLkNvZGVNaXJyb3Itc2VhcmNoaW5nIHsKICBiYWNrZ3JvdW5kOiAjZmZhOwogIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDAsIC40KTsKfQoKLyogSUU3IGhhY2sgdG8gcHJldmVudCBpdCBmcm9tIHJldHVybmluZyBmdW5ueSBvZmZzZXRUb3BzIG9uIHRoZSBzcGFucyAqLwouQ29kZU1pcnJvciBzcGFuIHsgKnZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTsgfQoKQG1lZGlhIHByaW50IHsKICAvKiBIaWRlIHRoZSBjdXJzb3Igd2hlbiBwcmludGluZyAqLwogIC5Db2RlTWlycm9yIHByZS5Db2RlTWlycm9yLWN1cnNvciB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/codemirror.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciB2ZXJzaW9uIDMuMAovLwovLyBDb2RlTWlycm9yIGlzIHRoZSBvbmx5IGdsb2JhbCB2YXIgd2UgY2xhaW0Kd2luZG93LkNvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICAvLyBCUk9XU0VSIFNOSUZGSU5HCgogIC8vIENydWRlLCBidXQgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhIG51bWJlciBvZiBoYXJkLXRvLWZlYXR1cmUtZGV0ZWN0CiAgLy8gYnVncyBhbmQgYmVoYXZpb3IgZGlmZmVyZW5jZXMuCiAgdmFyIGdlY2tvID0gL2dlY2tvXC9cZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgdmFyIGllID0gL01TSUUgXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgdmFyIGllX2x0OCA9IC9NU0lFIFsxLTddXGIvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgdmFyIGllX2x0OSA9IC9NU0lFIFsxLThdXGIvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgdmFyIHdlYmtpdCA9IC9XZWJLaXRcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgcXR3ZWJraXQgPSB3ZWJraXQgJiYgL1F0XC9cZCtcLlxkKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgY2hyb21lID0gL0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogIHZhciBvcGVyYSA9IC9PcGVyYVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogIHZhciBzYWZhcmkgPSAvQXBwbGUgQ29tcHV0ZXIvLnRlc3QobmF2aWdhdG9yLnZlbmRvcik7CiAgdmFyIGtodG1sID0gL0tIVE1MXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgdmFyIG1hY19nZUxpb24gPSAvTWFjIE9TIFggMVxkXEQoWzctOV18XGRcZClcRC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgbWFjX2dlTW91bnRhaW5MaW9uID0gL01hYyBPUyBYIDFcZFxEKFs4LTldfFxkXGQpXEQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgdmFyIHBoYW50b20gPSAvUGhhbnRvbUpTLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwoKICB2YXIgaW9zID0gL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIC9Nb2JpbGVcL1x3Ky8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICAvLyBUaGlzIGlzIHdvZWZ1bGx5IGluY29tcGxldGUuIFN1Z2dlc3Rpb25zIGZvciBhbHRlcm5hdGl2ZSBtZXRob2RzIHdlbGNvbWUuCiAgdmFyIG1vYmlsZSA9IGlvcyB8fCAvQW5kcm9pZHx3ZWJPU3xCbGFja0JlcnJ5fE9wZXJhIE1pbml8SUVNb2JpbGUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogIHZhciBtYWMgPSBpb3MgfHwgL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pOwoKICAvLyBPcHRpbWl6ZSBzb21lIGNvZGUgd2hlbiB0aGVzZSBmZWF0dXJlcyBhcmUgbm90IHVzZWQKICB2YXIgc2F3UmVhZE9ubHlTcGFucyA9IGZhbHNlLCBzYXdDb2xsYXBzZWRTcGFucyA9IGZhbHNlOwoKICAvLyBDT05TVFJVQ1RPUgoKICBmdW5jdGlvbiBDb2RlTWlycm9yKHBsYWNlLCBvcHRpb25zKSB7CiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29kZU1pcnJvcikpIHJldHVybiBuZXcgQ29kZU1pcnJvcihwbGFjZSwgb3B0aW9ucyk7CiAgICAKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgLy8gRGV0ZXJtaW5lIGVmZmVjdGl2ZSBvcHRpb25zIGJhc2VkIG9uIGdpdmVuIHZhbHVlcyBhbmQgZGVmYXVsdHMuCiAgICBmb3IgKHZhciBvcHQgaW4gZGVmYXVsdHMpIGlmICghb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHQpICYmIGRlZmF1bHRzLmhhc093blByb3BlcnR5KG9wdCkpCiAgICAgIG9wdGlvbnNbb3B0XSA9IGRlZmF1bHRzW29wdF07CiAgICBzZXRHdXR0ZXJzRm9yTGluZU51bWJlcnMob3B0aW9ucyk7CgogICAgdmFyIGRpc3BsYXkgPSB0aGlzLmRpc3BsYXkgPSBtYWtlRGlzcGxheShwbGFjZSk7CiAgICBkaXNwbGF5LndyYXBwZXIuQ29kZU1pcnJvciA9IHRoaXM7CiAgICB1cGRhdGVHdXR0ZXJzKHRoaXMpOwogICAgaWYgKG9wdGlvbnMuYXV0b2ZvY3VzICYmICFtb2JpbGUpIGZvY3VzSW5wdXQodGhpcyk7CgogICAgdGhpcy52aWV3ID0gbWFrZVZpZXcobmV3IEJyYW5jaENodW5rKFtuZXcgTGVhZkNodW5rKFttYWtlTGluZSgiIiwgbnVsbCwgdGV4dEhlaWdodChkaXNwbGF5KSldKV0pKTsKICAgIHRoaXMubmV4dE9wSWQgPSAwOwogICAgbG9hZE1vZGUodGhpcyk7CiAgICB0aGVtZUNoYW5nZWQodGhpcyk7CiAgICBpZiAob3B0aW9ucy5saW5lV3JhcHBpbmcpCiAgICAgIHRoaXMuZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZSArPSAiIENvZGVNaXJyb3Itd3JhcCI7CgogICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGVudC4KICAgIHRoaXMuc2V0VmFsdWUob3B0aW9ucy52YWx1ZSB8fCAiIik7CiAgICAvLyBPdmVycmlkZSBtYWdpYyB0ZXh0YXJlYSBjb250ZW50IHJlc3RvcmUgdGhhdCBJRSBzb21ldGltZXMgZG9lcwogICAgLy8gb24gb3VyIGhpZGRlbiB0ZXh0YXJlYSBvbiByZWxvYWQKICAgIGlmIChpZSkgc2V0VGltZW91dChiaW5kKHJlc2V0SW5wdXQsIHRoaXMsIHRydWUpLCAyMCk7CiAgICB0aGlzLnZpZXcuaGlzdG9yeSA9IG1ha2VIaXN0b3J5KCk7CgogICAgcmVnaXN0ZXJFdmVudEhhbmRsZXJzKHRoaXMpOwogICAgLy8gSUUgdGhyb3dzIHVuc3BlY2lmaWVkIGVycm9yIGluIGNlcnRhaW4gY2FzZXMsIHdoZW4KICAgIC8vIHRyeWluZyB0byBhY2Nlc3MgYWN0aXZlRWxlbWVudCBiZWZvcmUgb25sb2FkCiAgICB2YXIgaGFzRm9jdXM7IHRyeSB7IGhhc0ZvY3VzID0gKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT0gZGlzcGxheS5pbnB1dCk7IH0gY2F0Y2goZSkgeyB9CiAgICBpZiAoaGFzRm9jdXMgfHwgKG9wdGlvbnMuYXV0b2ZvY3VzICYmICFtb2JpbGUpKSBzZXRUaW1lb3V0KGJpbmQob25Gb2N1cywgdGhpcyksIDIwKTsKICAgIGVsc2Ugb25CbHVyKHRoaXMpOwoKICAgIG9wZXJhdGlvbih0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgb3B0IGluIG9wdGlvbkhhbmRsZXJzKQogICAgICAgIGlmIChvcHRpb25IYW5kbGVycy5wcm9wZXJ0eUlzRW51bWVyYWJsZShvcHQpKQogICAgICAgICAgb3B0aW9uSGFuZGxlcnNbb3B0XSh0aGlzLCBvcHRpb25zW29wdF0sIEluaXQpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRIb29rcy5sZW5ndGg7ICsraSkgaW5pdEhvb2tzW2ldKHRoaXMpOwogICAgfSkoKTsKICB9CgogIC8vIERJU1BMQVkgQ09OU1RSVUNUT1IKCiAgZnVuY3Rpb24gbWFrZURpc3BsYXkocGxhY2UpIHsKICAgIHZhciBkID0ge307CiAgICB2YXIgaW5wdXQgPSBkLmlucHV0ID0gZWx0KCJ0ZXh0YXJlYSIsIG51bGwsIG51bGwsICJwb3NpdGlvbjogYWJzb2x1dGU7IHBhZGRpbmc6IDA7IHdpZHRoOiAxcHg7IGhlaWdodDogMWVtOyBvdXRsaW5lOiBub25lOyIpOwogICAgaW5wdXQuc2V0QXR0cmlidXRlKCJ3cmFwIiwgIm9mZiIpOyBpbnB1dC5zZXRBdHRyaWJ1dGUoImF1dG9jb3JyZWN0IiwgIm9mZiIpOyBpbnB1dC5zZXRBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiwgIm9mZiIpOwogICAgLy8gV3JhcHMgYW5kIGhpZGVzIGlucHV0IHRleHRhcmVhCiAgICBkLmlucHV0RGl2ID0gZWx0KCJkaXYiLCBbaW5wdXRdLCBudWxsLCAib3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogM3B4OyBoZWlnaHQ6IDBweDsiKTsKICAgIC8vIFRoZSBhY3R1YWwgZmFrZSBzY3JvbGxiYXJzLgogICAgZC5zY3JvbGxiYXJIID0gZWx0KCJkaXYiLCBbZWx0KCJkaXYiLCBudWxsLCBudWxsLCAiaGVpZ2h0OiAxcHgiKV0sICJDb2RlTWlycm9yLWhzY3JvbGxiYXIiKTsKICAgIGQuc2Nyb2xsYmFyViA9IGVsdCgiZGl2IiwgW2VsdCgiZGl2IiwgbnVsbCwgbnVsbCwgIndpZHRoOiAxcHgiKV0sICJDb2RlTWlycm9yLXZzY3JvbGxiYXIiKTsKICAgIGQuc2Nyb2xsYmFyRmlsbGVyID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1zY3JvbGxiYXItZmlsbGVyIik7CiAgICAvLyBESVZzIGNvbnRhaW5pbmcgdGhlIHNlbGVjdGlvbiBhbmQgdGhlIGFjdHVhbCBjb2RlCiAgICBkLmxpbmVEaXYgPSBlbHQoImRpdiIpOwogICAgZC5zZWxlY3Rpb25EaXYgPSBlbHQoImRpdiIsIG51bGwsIG51bGwsICJwb3NpdGlvbjogcmVsYXRpdmU7IHotaW5kZXg6IDEiKTsKICAgIC8vIEJsaW5reSBjdXJzb3IsIGFuZCBlbGVtZW50IHVzZWQgdG8gZW5zdXJlIGN1cnNvciBmaXRzIGF0IHRoZSBlbmQgb2YgYSBsaW5lCiAgICBkLmN1cnNvciA9IGVsdCgicHJlIiwgIlx1MDBhMCIsICJDb2RlTWlycm9yLWN1cnNvciIpOwogICAgLy8gU2Vjb25kYXJ5IGN1cnNvciwgc2hvd24gd2hlbiBvbiBhICdqdW1wJyBpbiBiaS1kaXJlY3Rpb25hbCB0ZXh0CiAgICBkLm90aGVyQ3Vyc29yID0gZWx0KCJwcmUiLCAiXHUwMGEwIiwgIkNvZGVNaXJyb3ItY3Vyc29yIENvZGVNaXJyb3Itc2Vjb25kYXJ5Y3Vyc29yIik7CiAgICAvLyBVc2VkIHRvIG1lYXN1cmUgdGV4dCBzaXplCiAgICBkLm1lYXN1cmUgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLW1lYXN1cmUiKTsKICAgIC8vIFdyYXBzIGV2ZXJ5dGhpbmcgdGhhdCBuZWVkcyB0byBleGlzdCBpbnNpZGUgdGhlIHZlcnRpY2FsbHktcGFkZGVkIGNvb3JkaW5hdGUgc3lzdGVtCiAgICBkLmxpbmVTcGFjZSA9IGVsdCgiZGl2IiwgW2QubWVhc3VyZSwgZC5zZWxlY3Rpb25EaXYsIGQubGluZURpdiwgZC5jdXJzb3IsIGQub3RoZXJDdXJzb3JdLAogICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgInBvc2l0aW9uOiByZWxhdGl2ZTsgb3V0bGluZTogbm9uZSIpOwogICAgLy8gTW92ZWQgYXJvdW5kIGl0cyBwYXJlbnQgdG8gY292ZXIgdmlzaWJsZSB2aWV3CiAgICBkLm1vdmVyID0gZWx0KCJkaXYiLCBbZWx0KCJkaXYiLCBbZC5saW5lU3BhY2VdLCAiQ29kZU1pcnJvci1saW5lcyIpXSwgbnVsbCwgInBvc2l0aW9uOiByZWxhdGl2ZSIpOwogICAgLy8gU2V0IHRvIHRoZSBoZWlnaHQgb2YgdGhlIHRleHQsIGNhdXNlcyBzY3JvbGxpbmcKICAgIGQuc2l6ZXIgPSBlbHQoImRpdiIsIFtkLm1vdmVyXSwgIkNvZGVNaXJyb3Itc2l6ZXIiKTsKICAgIC8vIEQgaXMgbmVlZGVkIGJlY2F1c2UgYmVoYXZpb3Igb2YgZWx0cyB3aXRoIG92ZXJmbG93OiBhdXRvIGFuZCBwYWRkaW5nIGlzIGluY29uc2lzdGVudCBhY3Jvc3MgYnJvd3NlcnMKICAgIGQuaGVpZ2h0Rm9yY2VyID0gZWx0KCJkaXYiLCAiXHUwMGEwIiwgbnVsbCwgInBvc2l0aW9uOiBhYnNvbHV0ZTsgaGVpZ2h0OiAiICsgc2Nyb2xsZXJDdXRPZmYgKyAicHgiKTsKICAgIC8vIFdpbGwgY29udGFpbiB0aGUgZ3V0dGVycywgaWYgYW55CiAgICBkLmd1dHRlcnMgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWd1dHRlcnMiKTsKICAgIGQubGluZUd1dHRlciA9IG51bGw7CiAgICAvLyBIZWxwZXIgZWxlbWVudCB0byBwcm9wZXJseSBzaXplIHRoZSBndXR0ZXIgYmFja2dyb3VuZHMKICAgIHZhciBzY3JvbGxlcklubmVyID0gZWx0KCJkaXYiLCBbZC5zaXplciwgZC5oZWlnaHRGb3JjZXIsIGQuZ3V0dGVyc10sIG51bGwsICJwb3NpdGlvbjogcmVsYXRpdmU7IG1pbi1oZWlnaHQ6IDEwMCUiKTsKICAgIC8vIFByb3ZpZGVzIHNjcm9sbGluZwogICAgZC5zY3JvbGxlciA9IGVsdCgiZGl2IiwgW3Njcm9sbGVySW5uZXJdLCAiQ29kZU1pcnJvci1zY3JvbGwiKTsKICAgIGQuc2Nyb2xsZXIuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsICItMSIpOwogICAgLy8gVGhlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIGVkaXRvciBsaXZlcy4KICAgIGQud3JhcHBlciA9IGVsdCgiZGl2IiwgW2QuaW5wdXREaXYsIGQuc2Nyb2xsYmFySCwgZC5zY3JvbGxiYXJWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5zY3JvbGxiYXJGaWxsZXIsIGQuc2Nyb2xsZXJdLCAiQ29kZU1pcnJvciIpOwogICAgLy8gV29yayBhcm91bmQgSUU3IHotaW5kZXggYnVnCiAgICBpZiAoaWVfbHQ4KSB7IGQuZ3V0dGVycy5zdHlsZS56SW5kZXggPSAtMTsgZC5zY3JvbGxlci5zdHlsZS5wYWRkaW5nUmlnaHQgPSAwOyB9CiAgICBpZiAocGxhY2UuYXBwZW5kQ2hpbGQpIHBsYWNlLmFwcGVuZENoaWxkKGQud3JhcHBlcik7IGVsc2UgcGxhY2UoZC53cmFwcGVyKTsKCiAgICAvLyBOZWVkZWQgdG8gaGlkZSBiaWcgYmx1ZSBibGlua2luZyBjdXJzb3Igb24gTW9iaWxlIFNhZmFyaQogICAgaWYgKGlvcykgaW5wdXQuc3R5bGUud2lkdGggPSAiMHB4IjsKICAgIGlmICghd2Via2l0KSBkLnNjcm9sbGVyLmRyYWdnYWJsZSA9IHRydWU7CiAgICAvLyBOZWVkZWQgdG8gaGFuZGxlIFRhYiBrZXkgaW4gS0hUTUwKICAgIGlmIChraHRtbCkgeyBkLmlucHV0RGl2LnN0eWxlLmhlaWdodCA9ICIxcHgiOyBkLmlucHV0RGl2LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsgfQogICAgLy8gTmVlZCB0byBzZXQgYSBtaW5pbXVtIHdpZHRoIHRvIHNlZSB0aGUgc2Nyb2xsYmFyIG9uIElFNyAoYnV0IG11c3Qgbm90IHNldCBpdCBvbiBJRTgpLgogICAgZWxzZSBpZiAoaWVfbHQ4KSBkLnNjcm9sbGJhckguc3R5bGUubWluV2lkdGggPSBkLnNjcm9sbGJhclYuc3R5bGUubWluV2lkdGggPSAiMThweCI7CgogICAgLy8gQ3VycmVudCB2aXNpYmxlIHJhbmdlIChtYXkgYmUgYmlnZ2VyIHRoYW4gdGhlIHZpZXcgd2luZG93KS4KICAgIGQudmlld09mZnNldCA9IGQuc2hvd2luZ0Zyb20gPSBkLnNob3dpbmdUbyA9IGQubGFzdFNpemVDID0gMDsKCiAgICAvLyBVc2VkIHRvIG9ubHkgcmVzaXplIHRoZSBsaW5lIG51bWJlciBndXR0ZXIgd2hlbiBuZWNlc3NhcnkgKHdoZW4KICAgIC8vIHRoZSBhbW91bnQgb2YgbGluZXMgY3Jvc3NlcyBhIGJvdW5kYXJ5IHRoYXQgbWFrZXMgaXRzIHdpZHRoIGNoYW5nZSkKICAgIGQubGluZU51bVdpZHRoID0gZC5saW5lTnVtSW5uZXJXaWR0aCA9IGQubGluZU51bUNoYXJzID0gbnVsbDsKICAgIC8vIFNlZSByZWFkSW5wdXQgYW5kIHJlc2V0SW5wdXQKICAgIGQucHJldklucHV0ID0gIiI7CiAgICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIGEgbm9uLWhvcml6b250YWwtc2Nyb2xsaW5nIHdpZGdldCBpcyBhZGRlZC4gQXMKICAgIC8vIGFuIG9wdGltaXphdGlvbiwgd2lkZ2V0IGFsaWduaW5nIGlzIHNraXBwZWQgd2hlbiBkIGlzIGZhbHNlLgogICAgZC5hbGlnbldpZGdldHMgPSBmYWxzZTsKICAgIC8vIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB3ZSBjdXJyZW50bHkgZXhwZWN0IGlucHV0IHRvIGFwcGVhcgogICAgLy8gKGFmdGVyIHNvbWUgZXZlbnQgbGlrZSAna2V5cHJlc3MnIG9yICdpbnB1dCcpIGFuZCBhcmUgcG9sbGluZwogICAgLy8gaW50ZW5zaXZlbHkuCiAgICBkLnBvbGxpbmdGYXN0ID0gZmFsc2U7CiAgICAvLyBTZWxmLXJlc2V0dGluZyB0aW1lb3V0IGZvciB0aGUgcG9sbGVyCiAgICBkLnBvbGwgPSBuZXcgRGVsYXllZCgpOwogICAgLy8gVHJ1ZSB3aGVuIGEgZHJhZyBmcm9tIHRoZSBlZGl0b3IgaXMgYWN0aXZlCiAgICBkLmRyYWdnaW5nVGV4dCA9IGZhbHNlOwoKICAgIGQuY2FjaGVkQ2hhcldpZHRoID0gZC5jYWNoZWRUZXh0SGVpZ2h0ID0gbnVsbDsKICAgIGQubWVhc3VyZUxpbmVDYWNoZSA9IFtdOwogICAgZC5tZWFzdXJlTGluZUNhY2hlUG9zID0gMDsKCiAgICAvLyBUcmFja3Mgd2hlbiByZXNldElucHV0IGhhcyBwdW50ZWQgdG8ganVzdCBwdXR0aW5nIGEgc2hvcnQKICAgIC8vIHN0cmluZyBpbnN0ZWFkIG9mIHRoZSAobGFyZ2UpIHNlbGVjdGlvbi4KICAgIGQuaW5hY2N1cmF0ZVNlbGVjdGlvbiA9IGZhbHNlOwoKICAgIC8vIFVzZWQgdG8gYWRqdXN0IG92ZXJ3cml0ZSBiZWhhdmlvdXIgd2hlbiBhIHBhc3RlIGhhcyBiZWVuCiAgICAvLyBkZXRlY3RlZAogICAgZC5wYXN0ZUluY29taW5nID0gZmFsc2U7CgogICAgcmV0dXJuIGQ7CiAgfQoKICAvLyBWSUVXIENPTlNUUlVDVE9SCgogIGZ1bmN0aW9uIG1ha2VWaWV3KGRvYykgewogICAgdmFyIHNlbFBvcyA9IHtsaW5lOiAwLCBjaDogMH07CiAgICByZXR1cm4gewogICAgICBkb2M6IGRvYywKICAgICAgLy8gZnJvbnRpZXIgaXMgdGhlIHBvaW50IHVwIHRvIHdoaWNoIHRoZSBjb250ZW50IGhhcyBiZWVuIHBhcnNlZCwKICAgICAgZnJvbnRpZXI6IDAsIGhpZ2hsaWdodDogbmV3IERlbGF5ZWQoKSwKICAgICAgc2VsOiB7ZnJvbTogc2VsUG9zLCB0bzogc2VsUG9zLCBoZWFkOiBzZWxQb3MsIGFuY2hvcjogc2VsUG9zLCBzaGlmdDogZmFsc2UsIGV4dGVuZDogZmFsc2V9LAogICAgICBzY3JvbGxUb3A6IDAsIHNjcm9sbExlZnQ6IDAsCiAgICAgIG92ZXJ3cml0ZTogZmFsc2UsIGZvY3VzZWQ6IGZhbHNlLAogICAgICAvLyBUcmFja3MgdGhlIG1heGltdW0gbGluZSBsZW5ndGggc28gdGhhdAogICAgICAvLyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgY2FuIGJlIGtlcHQKICAgICAgLy8gc3RhdGljIHdoZW4gc2Nyb2xsaW5nLgogICAgICBtYXhMaW5lOiBnZXRMaW5lKGRvYywgMCksCiAgICAgIG1heExpbmVMZW5ndGg6IDAsCiAgICAgIG1heExpbmVDaGFuZ2VkOiBmYWxzZSwKICAgICAgc3VwcHJlc3NFZGl0czogZmFsc2UsCiAgICAgIGdvYWxDb2x1bW46IG51bGwsCiAgICAgIGNhbnRFZGl0OiBmYWxzZSwKICAgICAga2V5TWFwczogW10KICAgIH07CiAgfQoKICAvLyBTVEFURSBVUERBVEVTCgogIC8vIFVzZWQgdG8gZ2V0IHRoZSBlZGl0b3IgaW50byBhIGNvbnNpc3RlbnQgc3RhdGUgYWdhaW4gd2hlbiBvcHRpb25zIGNoYW5nZS4KCiAgZnVuY3Rpb24gbG9hZE1vZGUoY20pIHsKICAgIHZhciBkb2MgPSBjbS52aWV3LmRvYzsKICAgIGNtLnZpZXcubW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjbS5vcHRpb25zLCBjbS5vcHRpb25zLm1vZGUpOwogICAgZG9jLml0ZXIoMCwgZG9jLnNpemUsIGZ1bmN0aW9uKGxpbmUpIHsgbGluZS5zdGF0ZUFmdGVyID0gbnVsbDsgfSk7CiAgICBjbS52aWV3LmZyb250aWVyID0gMDsKICAgIHN0YXJ0V29ya2VyKGNtLCAxMDApOwogIH0KCiAgZnVuY3Rpb24gd3JhcHBpbmdDaGFuZ2VkKGNtKSB7CiAgICB2YXIgZG9jID0gY20udmlldy5kb2MsIHRoID0gdGV4dEhlaWdodChjbS5kaXNwbGF5KTsKICAgIGlmIChjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgewogICAgICBjbS5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lICs9ICIgQ29kZU1pcnJvci13cmFwIjsKICAgICAgdmFyIHBlckxpbmUgPSBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoIC8gY2hhcldpZHRoKGNtLmRpc3BsYXkpIC0gMzsKICAgICAgZG9jLml0ZXIoMCwgZG9jLnNpemUsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICBpZiAobGluZS5oZWlnaHQgPT0gMCkgcmV0dXJuOwogICAgICAgIHZhciBndWVzcyA9IE1hdGguY2VpbChsaW5lLnRleHQubGVuZ3RoIC8gcGVyTGluZSkgfHwgMTsKICAgICAgICBpZiAoZ3Vlc3MgIT0gMSkgdXBkYXRlTGluZUhlaWdodChsaW5lLCBndWVzcyAqIHRoKTsKICAgICAgfSk7CiAgICAgIGNtLmRpc3BsYXkuc2l6ZXIuc3R5bGUubWluV2lkdGggPSAiIjsKICAgIH0gZWxzZSB7CiAgICAgIGNtLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUgPSBjbS5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lLnJlcGxhY2UoIiBDb2RlTWlycm9yLXdyYXAiLCAiIik7CiAgICAgIGNvbXB1dGVNYXhMZW5ndGgoY20udmlldyk7CiAgICAgIGRvYy5pdGVyKDAsIGRvYy5zaXplLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgaWYgKGxpbmUuaGVpZ2h0ICE9IDApIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgdGgpOwogICAgICB9KTsKICAgIH0KICAgIHJlZ0NoYW5nZShjbSwgMCwgZG9jLnNpemUpOwogICAgY2xlYXJDYWNoZXMoY20pOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3VwZGF0ZVNjcm9sbGJhcnMoY20uZGlzcGxheSwgY20udmlldy5kb2MuaGVpZ2h0KTt9LCAxMDApOwogIH0KCiAgZnVuY3Rpb24ga2V5TWFwQ2hhbmdlZChjbSkgewogICAgdmFyIHN0eWxlID0ga2V5TWFwW2NtLm9wdGlvbnMua2V5TWFwXS5zdHlsZTsKICAgIGNtLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUgPSBjbS5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lLnJlcGxhY2UoL1xzKmNtLWtleW1hcC1cUysvZywgIiIpICsKICAgICAgKHN0eWxlID8gIiBjbS1rZXltYXAtIiArIHN0eWxlIDogIiIpOwogIH0KCiAgZnVuY3Rpb24gdGhlbWVDaGFuZ2VkKGNtKSB7CiAgICBjbS5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lID0gY20uZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZS5yZXBsYWNlKC9ccypjbS1zLVxTKy9nLCAiIikgKwogICAgICBjbS5vcHRpb25zLnRoZW1lLnJlcGxhY2UoLyhefFxzKVxzKi9nLCAiIGNtLXMtIik7CiAgICBjbGVhckNhY2hlcyhjbSk7CiAgfQoKICBmdW5jdGlvbiBndXR0ZXJzQ2hhbmdlZChjbSkgewogICAgdXBkYXRlR3V0dGVycyhjbSk7CiAgICB1cGRhdGVEaXNwbGF5KGNtLCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUd1dHRlcnMoY20pIHsKICAgIHZhciBndXR0ZXJzID0gY20uZGlzcGxheS5ndXR0ZXJzLCBzcGVjcyA9IGNtLm9wdGlvbnMuZ3V0dGVyczsKICAgIHJlbW92ZUNoaWxkcmVuKGd1dHRlcnMpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGVjcy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgZ3V0dGVyQ2xhc3MgPSBzcGVjc1tpXTsKICAgICAgdmFyIGdFbHQgPSBndXR0ZXJzLmFwcGVuZENoaWxkKGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItZ3V0dGVyICIgKyBndXR0ZXJDbGFzcykpOwogICAgICBpZiAoZ3V0dGVyQ2xhc3MgPT0gIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiKSB7CiAgICAgICAgY20uZGlzcGxheS5saW5lR3V0dGVyID0gZ0VsdDsKICAgICAgICBnRWx0LnN0eWxlLndpZHRoID0gKGNtLmRpc3BsYXkubGluZU51bVdpZHRoIHx8IDEpICsgInB4IjsKICAgICAgfQogICAgfQogICAgZ3V0dGVycy5zdHlsZS5kaXNwbGF5ID0gaSA/ICIiIDogIm5vbmUiOwogIH0KCiAgZnVuY3Rpb24gbGluZUxlbmd0aChkb2MsIGxpbmUpIHsKICAgIGlmIChsaW5lLmhlaWdodCA9PSAwKSByZXR1cm4gMDsKICAgIHZhciBsZW4gPSBsaW5lLnRleHQubGVuZ3RoLCBtZXJnZWQsIGN1ciA9IGxpbmU7CiAgICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0U3RhcnQoY3VyKSkgewogICAgICB2YXIgZm91bmQgPSBtZXJnZWQuZmluZCgpOwogICAgICBjdXIgPSBnZXRMaW5lKGRvYywgZm91bmQuZnJvbS5saW5lKTsKICAgICAgbGVuICs9IGZvdW5kLmZyb20uY2ggLSBmb3VuZC50by5jaDsKICAgIH0KICAgIGN1ciA9IGxpbmU7CiAgICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGN1cikpIHsKICAgICAgdmFyIGZvdW5kID0gbWVyZ2VkLmZpbmQoKTsKICAgICAgbGVuIC09IGN1ci50ZXh0Lmxlbmd0aCAtIGZvdW5kLmZyb20uY2g7CiAgICAgIGN1ciA9IGdldExpbmUoZG9jLCBmb3VuZC50by5saW5lKTsKICAgICAgbGVuICs9IGN1ci50ZXh0Lmxlbmd0aCAtIGZvdW5kLnRvLmNoOwogICAgfQogICAgcmV0dXJuIGxlbjsKICB9CgogIGZ1bmN0aW9uIGNvbXB1dGVNYXhMZW5ndGgodmlldykgewogICAgdmlldy5tYXhMaW5lID0gZ2V0TGluZSh2aWV3LmRvYywgMCk7CiAgICB2aWV3Lm1heExpbmVMZW5ndGggPSBsaW5lTGVuZ3RoKHZpZXcuZG9jLCB2aWV3Lm1heExpbmUpOwogICAgdmlldy5tYXhMaW5lQ2hhbmdlZCA9IHRydWU7CiAgICB2aWV3LmRvYy5pdGVyKDEsIHZpZXcuZG9jLnNpemUsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIGxlbiA9IGxpbmVMZW5ndGgodmlldy5kb2MsIGxpbmUpOwogICAgICBpZiAobGVuID4gdmlldy5tYXhMaW5lTGVuZ3RoKSB7CiAgICAgICAgdmlldy5tYXhMaW5lTGVuZ3RoID0gbGVuOwogICAgICAgIHZpZXcubWF4TGluZSA9IGxpbmU7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gTWFrZSBzdXJlIHRoZSBndXR0ZXJzIG9wdGlvbnMgY29udGFpbnMgdGhlIGVsZW1lbnQKICAvLyAiQ29kZU1pcnJvci1saW5lbnVtYmVycyIgd2hlbiB0aGUgbGluZU51bWJlcnMgb3B0aW9uIGlzIHRydWUuCiAgZnVuY3Rpb24gc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKG9wdGlvbnMpIHsKICAgIHZhciBmb3VuZCA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLmd1dHRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG9wdGlvbnMuZ3V0dGVyc1tpXSA9PSAiQ29kZU1pcnJvci1saW5lbnVtYmVycyIpIHsKICAgICAgICBpZiAob3B0aW9ucy5saW5lTnVtYmVycykgZm91bmQgPSB0cnVlOwogICAgICAgIGVsc2Ugb3B0aW9ucy5ndXR0ZXJzLnNwbGljZShpLS0sIDEpOwogICAgICB9CiAgICB9CiAgICBpZiAoIWZvdW5kICYmIG9wdGlvbnMubGluZU51bWJlcnMpCiAgICAgIG9wdGlvbnMuZ3V0dGVycy5wdXNoKCJDb2RlTWlycm9yLWxpbmVudW1iZXJzIik7CiAgfQoKICAvLyBTQ1JPTExCQVJTCgogIC8vIFJlLXN5bmNocm9uaXplIHRoZSBmYWtlIHNjcm9sbGJhcnMgd2l0aCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCiAgLy8gY29udGVudC4gT3B0aW9uYWxseSBmb3JjZSBhIHNjcm9sbFRvcC4KICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxiYXJzKGQgLyogZGlzcGxheSAqLywgZG9jSGVpZ2h0KSB7CiAgICB2YXIgdG90YWxIZWlnaHQgPSBkb2NIZWlnaHQgKyAyICogcGFkZGluZ1RvcChkKTsKICAgIGQuc2l6ZXIuc3R5bGUubWluSGVpZ2h0ID0gZC5oZWlnaHRGb3JjZXIuc3R5bGUudG9wID0gdG90YWxIZWlnaHQgKyAicHgiOwogICAgdmFyIHNjcm9sbEhlaWdodCA9IE1hdGgubWF4KHRvdGFsSGVpZ2h0LCBkLnNjcm9sbGVyLnNjcm9sbEhlaWdodCk7CiAgICB2YXIgbmVlZHNIID0gZC5zY3JvbGxlci5zY3JvbGxXaWR0aCA+IGQuc2Nyb2xsZXIuY2xpZW50V2lkdGg7CiAgICB2YXIgbmVlZHNWID0gc2Nyb2xsSGVpZ2h0ID4gZC5zY3JvbGxlci5jbGllbnRIZWlnaHQ7CiAgICBpZiAobmVlZHNWKSB7CiAgICAgIGQuc2Nyb2xsYmFyVi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgZC5zY3JvbGxiYXJWLnN0eWxlLmJvdHRvbSA9IG5lZWRzSCA/IHNjcm9sbGJhcldpZHRoKGQubWVhc3VyZSkgKyAicHgiIDogIjAiOwogICAgICBkLnNjcm9sbGJhclYuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQgPSAKICAgICAgICAoc2Nyb2xsSGVpZ2h0IC0gZC5zY3JvbGxlci5jbGllbnRIZWlnaHQgKyBkLnNjcm9sbGJhclYuY2xpZW50SGVpZ2h0KSArICJweCI7CiAgICB9IGVsc2UgZC5zY3JvbGxiYXJWLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgIGlmIChuZWVkc0gpIHsKICAgICAgZC5zY3JvbGxiYXJILnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgICBkLnNjcm9sbGJhckguc3R5bGUucmlnaHQgPSBuZWVkc1YgPyBzY3JvbGxiYXJXaWR0aChkLm1lYXN1cmUpICsgInB4IiA6ICIwIjsKICAgICAgZC5zY3JvbGxiYXJILmZpcnN0Q2hpbGQuc3R5bGUud2lkdGggPQogICAgICAgIChkLnNjcm9sbGVyLnNjcm9sbFdpZHRoIC0gZC5zY3JvbGxlci5jbGllbnRXaWR0aCArIGQuc2Nyb2xsYmFySC5jbGllbnRXaWR0aCkgKyAicHgiOwogICAgfSBlbHNlIGQuc2Nyb2xsYmFySC5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICBpZiAobmVlZHNIICYmIG5lZWRzVikgewogICAgICBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgZC5zY3JvbGxiYXJGaWxsZXIuc3R5bGUuaGVpZ2h0ID0gZC5zY3JvbGxiYXJGaWxsZXIuc3R5bGUud2lkdGggPSBzY3JvbGxiYXJXaWR0aChkLm1lYXN1cmUpICsgInB4IjsKICAgIH0gZWxzZSBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5kaXNwbGF5ID0gIiI7CgogICAgaWYgKG1hY19nZUxpb24gJiYgc2Nyb2xsYmFyV2lkdGgoZC5tZWFzdXJlKSA9PT0gMCkKICAgICAgZC5zY3JvbGxiYXJWLnN0eWxlLm1pbldpZHRoID0gZC5zY3JvbGxiYXJILnN0eWxlLm1pbkhlaWdodCA9IG1hY19nZU1vdW50YWluTGlvbiA/ICIxOHB4IiA6ICIxMnB4IjsKICB9CgogIGZ1bmN0aW9uIHZpc2libGVMaW5lcyhkaXNwbGF5LCBkb2MsIHZpZXdQb3J0KSB7CiAgICB2YXIgdG9wID0gZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AsIGhlaWdodCA9IGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQ7CiAgICBpZiAodHlwZW9mIHZpZXdQb3J0ID09ICJudW1iZXIiKSB0b3AgPSB2aWV3UG9ydDsKICAgIGVsc2UgaWYgKHZpZXdQb3J0KSB7dG9wID0gdmlld1BvcnQudG9wOyBoZWlnaHQgPSB2aWV3UG9ydC5ib3R0b20gLSB2aWV3UG9ydC50b3A7fQogICAgdG9wID0gTWF0aC5mbG9vcih0b3AgLSBwYWRkaW5nVG9wKGRpc3BsYXkpKTsKICAgIHZhciBib3R0b20gPSBNYXRoLmNlaWwodG9wICsgaGVpZ2h0KTsKICAgIHJldHVybiB7ZnJvbTogbGluZUF0SGVpZ2h0KGRvYywgdG9wKSwgdG86IGxpbmVBdEhlaWdodChkb2MsIGJvdHRvbSl9OwogIH0KCiAgLy8gTElORSBOVU1CRVJTCgogIGZ1bmN0aW9uIGFsaWduSG9yaXpvbnRhbGx5KGNtKSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7CiAgICBpZiAoIWRpc3BsYXkuYWxpZ25XaWRnZXRzICYmICFkaXNwbGF5Lmd1dHRlcnMuZmlyc3RDaGlsZCkgcmV0dXJuOwogICAgdmFyIGNvbXAgPSBjb21wZW5zYXRlRm9ySFNjcm9sbChkaXNwbGF5KSAtIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCArIGNtLnZpZXcuc2Nyb2xsTGVmdDsKICAgIHZhciBndXR0ZXJXID0gZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoLCBsID0gY29tcCArICJweCI7CiAgICBmb3IgKHZhciBuID0gZGlzcGxheS5saW5lRGl2LmZpcnN0Q2hpbGQ7IG47IG4gPSBuLm5leHRTaWJsaW5nKSBpZiAobi5hbGlnbmFibGUpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGEgPSBuLmFsaWduYWJsZTsgaSA8IGEubGVuZ3RoOyArK2kpIGFbaV0uc3R5bGUubGVmdCA9IGw7CiAgICB9CiAgICBkaXNwbGF5Lmd1dHRlcnMuc3R5bGUubGVmdCA9IChjb21wICsgZ3V0dGVyVykgKyAicHgiOwogIH0KCiAgZnVuY3Rpb24gbWF5YmVVcGRhdGVMaW5lTnVtYmVyV2lkdGgoY20pIHsKICAgIGlmICghY20ub3B0aW9ucy5saW5lTnVtYmVycykgcmV0dXJuIGZhbHNlOwogICAgdmFyIGRvYyA9IGNtLnZpZXcuZG9jLCBsYXN0ID0gbGluZU51bWJlckZvcihjbS5vcHRpb25zLCBkb2Muc2l6ZSAtIDEpLCBkaXNwbGF5ID0gY20uZGlzcGxheTsKICAgIGlmIChsYXN0Lmxlbmd0aCAhPSBkaXNwbGF5LmxpbmVOdW1DaGFycykgewogICAgICB2YXIgdGVzdCA9IGRpc3BsYXkubWVhc3VyZS5hcHBlbmRDaGlsZChlbHQoImRpdiIsIFtlbHQoImRpdiIsIGxhc3QpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2RlTWlycm9yLWxpbmVudW1iZXIgQ29kZU1pcnJvci1ndXR0ZXItZWx0IikpOwogICAgICB2YXIgaW5uZXJXID0gdGVzdC5maXJzdENoaWxkLm9mZnNldFdpZHRoLCBwYWRkaW5nID0gdGVzdC5vZmZzZXRXaWR0aCAtIGlubmVyVzsKICAgICAgZGlzcGxheS5saW5lR3V0dGVyLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIGRpc3BsYXkubGluZU51bUlubmVyV2lkdGggPSBNYXRoLm1heChpbm5lclcsIGRpc3BsYXkubGluZUd1dHRlci5vZmZzZXRXaWR0aCAtIHBhZGRpbmcpOwogICAgICBkaXNwbGF5LmxpbmVOdW1XaWR0aCA9IGRpc3BsYXkubGluZU51bUlubmVyV2lkdGggKyBwYWRkaW5nOwogICAgICBkaXNwbGF5LmxpbmVOdW1DaGFycyA9IGRpc3BsYXkubGluZU51bUlubmVyV2lkdGggPyBsYXN0Lmxlbmd0aCA6IC0xOwogICAgICBkaXNwbGF5LmxpbmVHdXR0ZXIuc3R5bGUud2lkdGggPSBkaXNwbGF5LmxpbmVOdW1XaWR0aCArICJweCI7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gbGluZU51bWJlckZvcihvcHRpb25zLCBpKSB7CiAgICByZXR1cm4gU3RyaW5nKG9wdGlvbnMubGluZU51bWJlckZvcm1hdHRlcihpICsgb3B0aW9ucy5maXJzdExpbmVOdW1iZXIpKTsKICB9CiAgZnVuY3Rpb24gY29tcGVuc2F0ZUZvckhTY3JvbGwoZGlzcGxheSkgewogICAgcmV0dXJuIGRpc3BsYXkuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDsKICB9CgogIC8vIERJU1BMQVkgRFJBV0lORwoKICBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5KGNtLCBjaGFuZ2VzLCB2aWV3UG9ydCkgewogICAgdmFyIG9sZEZyb20gPSBjbS5kaXNwbGF5LnNob3dpbmdGcm9tLCBvbGRUbyA9IGNtLmRpc3BsYXkuc2hvd2luZ1RvOwogICAgdmFyIHVwZGF0ZWQgPSB1cGRhdGVEaXNwbGF5SW5uZXIoY20sIGNoYW5nZXMsIHZpZXdQb3J0KTsKICAgIGlmICh1cGRhdGVkKSB7CiAgICAgIHNpZ25hbExhdGVyKGNtLCBjbSwgInVwZGF0ZSIsIGNtKTsKICAgICAgaWYgKGNtLmRpc3BsYXkuc2hvd2luZ0Zyb20gIT0gb2xkRnJvbSB8fCBjbS5kaXNwbGF5LnNob3dpbmdUbyAhPSBvbGRUbykKICAgICAgICBzaWduYWxMYXRlcihjbSwgY20sICJ2aWV3cG9ydENoYW5nZSIsIGNtLCBjbS5kaXNwbGF5LnNob3dpbmdGcm9tLCBjbS5kaXNwbGF5LnNob3dpbmdUbyk7CiAgICB9CiAgICB1cGRhdGVTZWxlY3Rpb24oY20pOwogICAgdXBkYXRlU2Nyb2xsYmFycyhjbS5kaXNwbGF5LCBjbS52aWV3LmRvYy5oZWlnaHQpOwoKICAgIHJldHVybiB1cGRhdGVkOwogIH0KCiAgLy8gVXNlcyBhIHNldCBvZiBjaGFuZ2VzIHBsdXMgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIHRvCiAgLy8gZGV0ZXJtaW5lIHdoaWNoIERPTSB1cGRhdGVzIGhhdmUgdG8gYmUgbWFkZSwgYW5kIG1ha2VzIHRoZQogIC8vIHVwZGF0ZXMuCiAgZnVuY3Rpb24gdXBkYXRlRGlzcGxheUlubmVyKGNtLCBjaGFuZ2VzLCB2aWV3UG9ydCkgewogICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS52aWV3LmRvYzsKICAgIGlmICghZGlzcGxheS53cmFwcGVyLmNsaWVudFdpZHRoKSB7CiAgICAgIGRpc3BsYXkuc2hvd2luZ0Zyb20gPSBkaXNwbGF5LnNob3dpbmdUbyA9IGRpc3BsYXkudmlld09mZnNldCA9IDA7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBDb21wdXRlIHRoZSBuZXcgdmlzaWJsZSB3aW5kb3cKICAgIC8vIElmIHNjcm9sbFRvcCBpcyBzcGVjaWZpZWQsIHVzZSB0aGF0IHRvIGRldGVybWluZSB3aGljaCBsaW5lcwogICAgLy8gdG8gcmVuZGVyIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgc2Nyb2xsYmFyIHBvc2l0aW9uLgogICAgdmFyIHZpc2libGUgPSB2aXNpYmxlTGluZXMoZGlzcGxheSwgZG9jLCB2aWV3UG9ydCk7CiAgICAvLyBCYWlsIG91dCBpZiB0aGUgdmlzaWJsZSBhcmVhIGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIG5vdGhpbmcgY2hhbmdlZC4KICAgIGlmIChjaGFuZ2VzICE9PSB0cnVlICYmIGNoYW5nZXMubGVuZ3RoID09IDAgJiYKICAgICAgICB2aXNpYmxlLmZyb20gPiBkaXNwbGF5LnNob3dpbmdGcm9tICYmIHZpc2libGUudG8gPCBkaXNwbGF5LnNob3dpbmdUbykKICAgICAgcmV0dXJuOwoKICAgIGlmIChjaGFuZ2VzICYmIG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKGNtKSkKICAgICAgY2hhbmdlcyA9IHRydWU7CiAgICBkaXNwbGF5LnNpemVyLnN0eWxlLm1hcmdpbkxlZnQgPSBkaXNwbGF5LnNjcm9sbGJhckguc3R5bGUubGVmdCA9IGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aCArICJweCI7CgogICAgLy8gV2hlbiBtZXJnZWQgbGluZXMgYXJlIHByZXNlbnQsIHRoZSBsaW5lIHRoYXQgbmVlZHMgdG8gYmUKICAgIC8vIHJlZHJhd24gbWlnaHQgbm90IGJlIHRoZSBvbmUgdGhhdCB3YXMgY2hhbmdlZC4KICAgIGlmIChjaGFuZ2VzICE9PSB0cnVlICYmIHNhd0NvbGxhcHNlZFNwYW5zKQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgY2ggPSBjaGFuZ2VzW2ldLCBtZXJnZWQ7CiAgICAgICAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdFN0YXJ0KGdldExpbmUoZG9jLCBjaC5mcm9tKSkpIHsKICAgICAgICAgIHZhciBmcm9tID0gbWVyZ2VkLmZpbmQoKS5mcm9tLmxpbmU7CiAgICAgICAgICBpZiAoY2guZGlmZikgY2guZGlmZiAtPSBjaC5mcm9tIC0gZnJvbTsKICAgICAgICAgIGNoLmZyb20gPSBmcm9tOwogICAgICAgIH0KICAgICAgfQoKICAgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGxpbmVzIG5lZWQgdGhlaXIgbGluZSBudW1iZXJzIHVwZGF0ZWQKICAgIHZhciBwb3NpdGlvbnNDaGFuZ2VkRnJvbSA9IGNoYW5nZXMgPT09IHRydWUgPyAwIDogSW5maW5pdHk7CiAgICBpZiAoY20ub3B0aW9ucy5saW5lTnVtYmVycyAmJiBjaGFuZ2VzICYmIGNoYW5nZXMgIT09IHRydWUpCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7ICsraSkKICAgICAgICBpZiAoY2hhbmdlc1tpXS5kaWZmKSB7IHBvc2l0aW9uc0NoYW5nZWRGcm9tID0gY2hhbmdlc1tpXS5mcm9tOyBicmVhazsgfQoKICAgIHZhciBmcm9tID0gTWF0aC5tYXgodmlzaWJsZS5mcm9tIC0gY20ub3B0aW9ucy52aWV3cG9ydE1hcmdpbiwgMCk7CiAgICB2YXIgdG8gPSBNYXRoLm1pbihkb2Muc2l6ZSwgdmlzaWJsZS50byArIGNtLm9wdGlvbnMudmlld3BvcnRNYXJnaW4pOwogICAgaWYgKGRpc3BsYXkuc2hvd2luZ0Zyb20gPCBmcm9tICYmIGZyb20gLSBkaXNwbGF5LnNob3dpbmdGcm9tIDwgMjApIGZyb20gPSBkaXNwbGF5LnNob3dpbmdGcm9tOwogICAgaWYgKGRpc3BsYXkuc2hvd2luZ1RvID4gdG8gJiYgZGlzcGxheS5zaG93aW5nVG8gLSB0byA8IDIwKSB0byA9IE1hdGgubWluKGRvYy5zaXplLCBkaXNwbGF5LnNob3dpbmdUbyk7CiAgICBpZiAoc2F3Q29sbGFwc2VkU3BhbnMpIHsKICAgICAgZnJvbSA9IGxpbmVObyh2aXN1YWxMaW5lKGRvYywgZ2V0TGluZShkb2MsIGZyb20pKSk7CiAgICAgIHdoaWxlICh0byA8IGRvYy5zaXplICYmIGxpbmVJc0hpZGRlbihnZXRMaW5lKGRvYywgdG8pKSkgKyt0bzsKICAgIH0KCiAgICAvLyBDcmVhdGUgYSByYW5nZSBvZiB0aGVvcmV0aWNhbGx5IGludGFjdCBsaW5lcywgYW5kIHB1bmNoIGhvbGVzCiAgICAvLyBpbiB0aGF0IHVzaW5nIHRoZSBjaGFuZ2UgaW5mby4KICAgIHZhciBpbnRhY3QgPSBjaGFuZ2VzID09PSB0cnVlID8gW10gOgogICAgICBjb21wdXRlSW50YWN0KFt7ZnJvbTogZGlzcGxheS5zaG93aW5nRnJvbSwgdG86IGRpc3BsYXkuc2hvd2luZ1RvfV0sIGNoYW5nZXMpOwogICAgLy8gQ2xpcCBvZmYgdGhlIHBhcnRzIHRoYXQgd29uJ3QgYmUgdmlzaWJsZQogICAgdmFyIGludGFjdExpbmVzID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW50YWN0Lmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciByYW5nZSA9IGludGFjdFtpXTsKICAgICAgaWYgKHJhbmdlLmZyb20gPCBmcm9tKSByYW5nZS5mcm9tID0gZnJvbTsKICAgICAgaWYgKHJhbmdlLnRvID4gdG8pIHJhbmdlLnRvID0gdG87CiAgICAgIGlmIChyYW5nZS5mcm9tID49IHJhbmdlLnRvKSBpbnRhY3Quc3BsaWNlKGktLSwgMSk7CiAgICAgIGVsc2UgaW50YWN0TGluZXMgKz0gcmFuZ2UudG8gLSByYW5nZS5mcm9tOwogICAgfQogICAgaWYgKGludGFjdExpbmVzID09IHRvIC0gZnJvbSAmJiBmcm9tID09IGRpc3BsYXkuc2hvd2luZ0Zyb20gJiYgdG8gPT0gZGlzcGxheS5zaG93aW5nVG8pCiAgICAgIHJldHVybjsKICAgIGludGFjdC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtyZXR1cm4gYS5mcm9tIC0gYi5mcm9tO30pOwoKICAgIGlmIChpbnRhY3RMaW5lcyA8ICh0byAtIGZyb20pICogLjcpIGRpc3BsYXkubGluZURpdi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgcGF0Y2hEaXNwbGF5KGNtLCBmcm9tLCB0bywgaW50YWN0LCBwb3NpdGlvbnNDaGFuZ2VkRnJvbSk7CiAgICBkaXNwbGF5LmxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICIiOwoKICAgIHZhciBkaWZmZXJlbnQgPSBmcm9tICE9IGRpc3BsYXkuc2hvd2luZ0Zyb20gfHwgdG8gIT0gZGlzcGxheS5zaG93aW5nVG8gfHwKICAgICAgZGlzcGxheS5sYXN0U2l6ZUMgIT0gZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodDsKICAgIC8vIFRoaXMgaXMganVzdCBhIGJvZ3VzIGZvcm11bGEgdGhhdCBkZXRlY3RzIHdoZW4gdGhlIGVkaXRvciBpcwogICAgLy8gcmVzaXplZCBvciB0aGUgZm9udCBzaXplIGNoYW5nZXMuCiAgICBpZiAoZGlmZmVyZW50KSBkaXNwbGF5Lmxhc3RTaXplQyA9IGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQ7CiAgICBkaXNwbGF5LnNob3dpbmdGcm9tID0gZnJvbTsgZGlzcGxheS5zaG93aW5nVG8gPSB0bzsKICAgIHN0YXJ0V29ya2VyKGNtLCAxMDApOwoKICAgIHZhciBwcmV2Qm90dG9tID0gZGlzcGxheS5saW5lRGl2Lm9mZnNldFRvcDsKICAgIGZvciAodmFyIG5vZGUgPSBkaXNwbGF5LmxpbmVEaXYuZmlyc3RDaGlsZCwgaGVpZ2h0OyBub2RlOyBub2RlID0gbm9kZS5uZXh0U2libGluZykgaWYgKG5vZGUubGluZU9iaikgewogICAgICBpZiAoaWVfbHQ4KSB7CiAgICAgICAgdmFyIGJvdCA9IG5vZGUub2Zmc2V0VG9wICsgbm9kZS5vZmZzZXRIZWlnaHQ7CiAgICAgICAgaGVpZ2h0ID0gYm90IC0gcHJldkJvdHRvbTsKICAgICAgICBwcmV2Qm90dG9tID0gYm90OwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBib3ggPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGhlaWdodCA9IGJveC5ib3R0b20gLSBib3gudG9wOwogICAgICB9CiAgICAgIHZhciBkaWZmID0gbm9kZS5saW5lT2JqLmhlaWdodCAtIGhlaWdodDsKICAgICAgaWYgKGhlaWdodCA8IDIpIGhlaWdodCA9IHRleHRIZWlnaHQoZGlzcGxheSk7CiAgICAgIGlmIChkaWZmID4gLjAwMSB8fCBkaWZmIDwgLS4wMDEpCiAgICAgICAgdXBkYXRlTGluZUhlaWdodChub2RlLmxpbmVPYmosIGhlaWdodCk7CiAgICB9CiAgICBkaXNwbGF5LnZpZXdPZmZzZXQgPSBoZWlnaHRBdExpbmUoY20sIGdldExpbmUoZG9jLCBmcm9tKSk7CiAgICAvLyBQb3NpdGlvbiB0aGUgbW92ZXIgZGl2IHRvIGFsaWduIHdpdGggdGhlIGN1cnJlbnQgdmlydHVhbCBzY3JvbGwgcG9zaXRpb24KICAgIGRpc3BsYXkubW92ZXIuc3R5bGUudG9wID0gZGlzcGxheS52aWV3T2Zmc2V0ICsgInB4IjsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gY29tcHV0ZUludGFjdChpbnRhY3QsIGNoYW5nZXMpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hhbmdlcy5sZW5ndGggfHwgMDsgaSA8IGw7ICsraSkgewogICAgICB2YXIgY2hhbmdlID0gY2hhbmdlc1tpXSwgaW50YWN0MiA9IFtdLCBkaWZmID0gY2hhbmdlLmRpZmYgfHwgMDsKICAgICAgZm9yICh2YXIgaiA9IDAsIGwyID0gaW50YWN0Lmxlbmd0aDsgaiA8IGwyOyArK2opIHsKICAgICAgICB2YXIgcmFuZ2UgPSBpbnRhY3Rbal07CiAgICAgICAgaWYgKGNoYW5nZS50byA8PSByYW5nZS5mcm9tICYmIGNoYW5nZS5kaWZmKSB7CiAgICAgICAgICBpbnRhY3QyLnB1c2goe2Zyb206IHJhbmdlLmZyb20gKyBkaWZmLCB0bzogcmFuZ2UudG8gKyBkaWZmfSk7CiAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2UudG8gPD0gcmFuZ2UuZnJvbSB8fCBjaGFuZ2UuZnJvbSA+PSByYW5nZS50bykgewogICAgICAgICAgaW50YWN0Mi5wdXNoKHJhbmdlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGNoYW5nZS5mcm9tID4gcmFuZ2UuZnJvbSkKICAgICAgICAgICAgaW50YWN0Mi5wdXNoKHtmcm9tOiByYW5nZS5mcm9tLCB0bzogY2hhbmdlLmZyb219KTsKICAgICAgICAgIGlmIChjaGFuZ2UudG8gPCByYW5nZS50bykKICAgICAgICAgICAgaW50YWN0Mi5wdXNoKHtmcm9tOiBjaGFuZ2UudG8gKyBkaWZmLCB0bzogcmFuZ2UudG8gKyBkaWZmfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGludGFjdCA9IGludGFjdDI7CiAgICB9CiAgICByZXR1cm4gaW50YWN0OwogIH0KCiAgZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhjbSkgewogICAgdmFyIGQgPSBjbS5kaXNwbGF5LCBsZWZ0ID0ge30sIHdpZHRoID0ge307CiAgICBmb3IgKHZhciBuID0gZC5ndXR0ZXJzLmZpcnN0Q2hpbGQsIGkgPSAwOyBuOyBuID0gbi5uZXh0U2libGluZywgKytpKSB7CiAgICAgIGxlZnRbY20ub3B0aW9ucy5ndXR0ZXJzW2ldXSA9IG4ub2Zmc2V0TGVmdDsKICAgICAgd2lkdGhbY20ub3B0aW9ucy5ndXR0ZXJzW2ldXSA9IG4ub2Zmc2V0V2lkdGg7CiAgICB9CiAgICByZXR1cm4ge2ZpeGVkUG9zOiBjb21wZW5zYXRlRm9ySFNjcm9sbChkKSwKICAgICAgICAgICAgZ3V0dGVyVG90YWxXaWR0aDogZC5ndXR0ZXJzLm9mZnNldFdpZHRoLAogICAgICAgICAgICBndXR0ZXJMZWZ0OiBsZWZ0LAogICAgICAgICAgICBndXR0ZXJXaWR0aDogd2lkdGgsCiAgICAgICAgICAgIHdyYXBwZXJXaWR0aDogZC53cmFwcGVyLmNsaWVudFdpZHRofTsKICB9CgogIGZ1bmN0aW9uIHBhdGNoRGlzcGxheShjbSwgZnJvbSwgdG8sIGludGFjdCwgdXBkYXRlTnVtYmVyc0Zyb20pIHsKICAgIHZhciBkaW1zID0gZ2V0RGltZW5zaW9ucyhjbSk7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGxpbmVOdW1iZXJzID0gY20ub3B0aW9ucy5saW5lTnVtYmVyczsKICAgIC8vIElFIGRvZXMgYmFkIHRoaW5ncyB0byBub2RlcyB3aGVuIC5pbm5lckhUTUwgPSAiIiBpcyB1c2VkIG9uIGEgcGFyZW50CiAgICAvLyB3ZSBzdGlsbCBuZWVkIHdpZGdldHMgYW5kIG1hcmtlcnMgaW50YWN0IHRvIGFkZCBiYWNrIHRvIHRoZSBuZXcgY29udGVudCBsYXRlcgogICAgaWYgKCFpbnRhY3QubGVuZ3RoICYmICFpZSAmJiAoIXdlYmtpdCB8fCAhY20uZGlzcGxheS5jdXJyZW50V2hlZWxUYXJnZXQpKQogICAgICByZW1vdmVDaGlsZHJlbihkaXNwbGF5LmxpbmVEaXYpOwogICAgdmFyIGNvbnRhaW5lciA9IGRpc3BsYXkubGluZURpdiwgY3VyID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CgogICAgZnVuY3Rpb24gcm0obm9kZSkgewogICAgICB2YXIgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgIGlmICh3ZWJraXQgJiYgbWFjICYmIGNtLmRpc3BsYXkuY3VycmVudFdoZWVsVGFyZ2V0ID09IG5vZGUpIHsKICAgICAgICBub2RlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgbm9kZS5saW5lT2JqID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgdmFyIG5leHRJbnRhY3QgPSBpbnRhY3Quc2hpZnQoKSwgbGluZU5vID0gZnJvbTsKICAgIGNtLnZpZXcuZG9jLml0ZXIoZnJvbSwgdG8sIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgaWYgKG5leHRJbnRhY3QgJiYgbmV4dEludGFjdC50byA9PSBsaW5lTm8pIG5leHRJbnRhY3QgPSBpbnRhY3Quc2hpZnQoKTsKICAgICAgaWYgKGxpbmVJc0hpZGRlbihsaW5lKSkgewogICAgICAgIGlmIChsaW5lLmhlaWdodCAhPSAwKSB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIDApOwogICAgICB9IGVsc2UgaWYgKG5leHRJbnRhY3QgJiYgbmV4dEludGFjdC5mcm9tIDw9IGxpbmVObyAmJiBuZXh0SW50YWN0LnRvID4gbGluZU5vKSB7CiAgICAgICAgLy8gVGhpcyBsaW5lIGlzIGludGFjdC4gU2tpcCB0byB0aGUgYWN0dWFsIG5vZGUuIFVwZGF0ZSBpdHMKICAgICAgICAvLyBsaW5lIG51bWJlciBpZiBuZWVkZWQuCiAgICAgICAgd2hpbGUgKGN1ci5saW5lT2JqICE9IGxpbmUpIGN1ciA9IHJtKGN1cik7CiAgICAgICAgaWYgKGxpbmVOdW1iZXJzICYmIHVwZGF0ZU51bWJlcnNGcm9tIDw9IGxpbmVObyAmJiBjdXIubGluZU51bWJlcikKICAgICAgICAgIHNldFRleHRDb250ZW50KGN1ci5saW5lTnVtYmVyLCBsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGxpbmVObykpOwogICAgICAgIGN1ciA9IGN1ci5uZXh0U2libGluZzsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIGxpbmUgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkLgogICAgICAgIHZhciBsaW5lTm9kZSA9IGJ1aWxkTGluZUVsZW1lbnQoY20sIGxpbmUsIGxpbmVObywgZGltcyk7CiAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShsaW5lTm9kZSwgY3VyKTsKICAgICAgICBsaW5lTm9kZS5saW5lT2JqID0gbGluZTsKICAgICAgfQogICAgICArK2xpbmVObzsKICAgIH0pOwogICAgd2hpbGUgKGN1cikgY3VyID0gcm0oY3VyKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkTGluZUVsZW1lbnQoY20sIGxpbmUsIGxpbmVObywgZGltcykgewogICAgdmFyIGxpbmVFbGVtZW50ID0gbGluZUNvbnRlbnQoY20sIGxpbmUpOwogICAgdmFyIG1hcmtlcnMgPSBsaW5lLmd1dHRlck1hcmtlcnMsIGRpc3BsYXkgPSBjbS5kaXNwbGF5OwoKICAgIGlmICghY20ub3B0aW9ucy5saW5lTnVtYmVycyAmJiAhbWFya2VycyAmJiAhbGluZS5iZ0NsYXNzICYmICFsaW5lLndyYXBDbGFzcyAmJgogICAgICAgICghbGluZS53aWRnZXRzIHx8ICFsaW5lLndpZGdldHMubGVuZ3RoKSkgcmV0dXJuIGxpbmVFbGVtZW50OwoKICAgIC8vIExpbmVzIHdpdGggZ3V0dGVyIGVsZW1lbnRzIG9yIGEgYmFja2dyb3VuZCBjbGFzcyBuZWVkCiAgICAvLyB0byBiZSB3cmFwcGVkIGFnYWluLCBhbmQgaGF2ZSB0aGUgZXh0cmEgZWxlbWVudHMgYWRkZWQKICAgIC8vIHRvIHRoZSB3cmFwcGVyIGRpdgoKICAgIHZhciB3cmFwID0gZWx0KCJkaXYiLCBudWxsLCBsaW5lLndyYXBDbGFzcywgInBvc2l0aW9uOiByZWxhdGl2ZSIpOwogICAgaWYgKGNtLm9wdGlvbnMubGluZU51bWJlcnMgfHwgbWFya2VycykgewogICAgICB2YXIgZ3V0dGVyV3JhcCA9IHdyYXAuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLCBudWxsLCBudWxsLCAicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1zLmZpeGVkUG9zICsgInB4IikpOwogICAgICB3cmFwLmFsaWduYWJsZSA9IFtndXR0ZXJXcmFwXTsKICAgICAgaWYgKGNtLm9wdGlvbnMubGluZU51bWJlcnMgJiYgKCFtYXJrZXJzIHx8ICFtYXJrZXJzWyJDb2RlTWlycm9yLWxpbmVudW1iZXJzIl0pKQogICAgICAgIHdyYXAubGluZU51bWJlciA9IGd1dHRlcldyYXAuYXBwZW5kQ2hpbGQoCiAgICAgICAgICBlbHQoImRpdiIsIGxpbmVOdW1iZXJGb3IoY20ub3B0aW9ucywgbGluZU5vKSwKICAgICAgICAgICAgICAiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdCIsCiAgICAgICAgICAgICAgImxlZnQ6ICIgKyBkaW1zLmd1dHRlckxlZnRbIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiXSArICJweDsgd2lkdGg6ICIKICAgICAgICAgICAgICArIGRpc3BsYXkubGluZU51bUlubmVyV2lkdGggKyAicHgiKSk7CiAgICAgIGlmIChtYXJrZXJzKQogICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgY20ub3B0aW9ucy5ndXR0ZXJzLmxlbmd0aDsgKytrKSB7CiAgICAgICAgICB2YXIgaWQgPSBjbS5vcHRpb25zLmd1dHRlcnNba10sIGZvdW5kID0gbWFya2Vycy5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgbWFya2Vyc1tpZF07CiAgICAgICAgICBpZiAoZm91bmQpCiAgICAgICAgICAgIGd1dHRlcldyYXAuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLCBbZm91bmRdLCAiQ29kZU1pcnJvci1ndXR0ZXItZWx0IiwgImxlZnQ6ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1zLmd1dHRlckxlZnRbaWRdICsgInB4OyB3aWR0aDogIiArIGRpbXMuZ3V0dGVyV2lkdGhbaWRdICsgInB4IikpOwogICAgICAgIH0KICAgIH0KICAgIC8vIEtsdWRnZSB0byBtYWtlIHN1cmUgdGhlIHN0eWxlZCBlbGVtZW50IGxpZXMgYmVoaW5kIHRoZSBzZWxlY3Rpb24gKGJ5IHotaW5kZXgpCiAgICBpZiAobGluZS5iZ0NsYXNzKQogICAgICB3cmFwLmFwcGVuZENoaWxkKGVsdCgiZGl2IiwgIlx1MDBhMCIsIGxpbmUuYmdDbGFzcyArICIgQ29kZU1pcnJvci1saW5lYmFja2dyb3VuZCIpKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQobGluZUVsZW1lbnQpOwogICAgaWYgKGxpbmUud2lkZ2V0cykKICAgICAgZm9yICh2YXIgaSA9IDAsIHdzID0gbGluZS53aWRnZXRzOyBpIDwgd3MubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgd2lkZ2V0ID0gd3NbaV0sIG5vZGUgPSBlbHQoImRpdiIsIFt3aWRnZXQubm9kZV0sICJDb2RlTWlycm9yLWxpbmV3aWRnZXQiKTsKICAgICAgICBub2RlLndpZGdldCA9IHdpZGdldDsKICAgICAgICBpZiAod2lkZ2V0Lm5vSFNjcm9sbCkgewogICAgICAgICAgKHdyYXAuYWxpZ25hYmxlIHx8ICh3cmFwLmFsaWduYWJsZSA9IFtdKSkucHVzaChub2RlKTsKICAgICAgICAgIHZhciB3aWR0aCA9IGRpbXMud3JhcHBlcldpZHRoOwogICAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gZGltcy5maXhlZFBvcyArICJweCI7CiAgICAgICAgICBpZiAoIXdpZGdldC5jb3Zlckd1dHRlcikgewogICAgICAgICAgICB3aWR0aCAtPSBkaW1zLmd1dHRlclRvdGFsV2lkdGg7CiAgICAgICAgICAgIG5vZGUuc3R5bGUucGFkZGluZ0xlZnQgPSBkaW1zLmd1dHRlclRvdGFsV2lkdGggKyAicHgiOwogICAgICAgICAgfQogICAgICAgICAgbm9kZS5zdHlsZS53aWR0aCA9IHdpZHRoICsgInB4IjsKICAgICAgICB9CiAgICAgICAgaWYgKHdpZGdldC5jb3Zlckd1dHRlcikgewogICAgICAgICAgbm9kZS5zdHlsZS56SW5kZXggPSA1OwogICAgICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CiAgICAgICAgICBpZiAoIXdpZGdldC5ub0hTY3JvbGwpIG5vZGUuc3R5bGUubWFyZ2luTGVmdCA9IC1kaW1zLmd1dHRlclRvdGFsV2lkdGggKyAicHgiOwogICAgICAgIH0KICAgICAgICBpZiAod2lkZ2V0LmFib3ZlKQogICAgICAgICAgd3JhcC5pbnNlcnRCZWZvcmUobm9kZSwgY20ub3B0aW9ucy5saW5lTnVtYmVycyAmJiBsaW5lLmhlaWdodCAhPSAwID8gZ3V0dGVyV3JhcCA6IGxpbmVFbGVtZW50KTsKICAgICAgICBlbHNlCiAgICAgICAgICB3cmFwLmFwcGVuZENoaWxkKG5vZGUpOwogICAgICB9CgogICAgaWYgKGllX2x0OCkgd3JhcC5zdHlsZS56SW5kZXggPSAyOwogICAgcmV0dXJuIHdyYXA7CiAgfQoKICAvLyBTRUxFQ1RJT04gLyBDVVJTT1IKCiAgZnVuY3Rpb24gdXBkYXRlU2VsZWN0aW9uKGNtKSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7CiAgICB2YXIgY29sbGFwc2VkID0gcG9zRXEoY20udmlldy5zZWwuZnJvbSwgY20udmlldy5zZWwudG8pOwogICAgaWYgKGNvbGxhcHNlZCB8fCBjbS5vcHRpb25zLnNob3dDdXJzb3JXaGVuU2VsZWN0aW5nKQogICAgICB1cGRhdGVTZWxlY3Rpb25DdXJzb3IoY20pOwogICAgZWxzZQogICAgICBkaXNwbGF5LmN1cnNvci5zdHlsZS5kaXNwbGF5ID0gZGlzcGxheS5vdGhlckN1cnNvci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgaWYgKCFjb2xsYXBzZWQpCiAgICAgIHVwZGF0ZVNlbGVjdGlvblJhbmdlKGNtKTsKICAgIGVsc2UKICAgICAgZGlzcGxheS5zZWxlY3Rpb25EaXYuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICAvLyBNb3ZlIHRoZSBoaWRkZW4gdGV4dGFyZWEgbmVhciB0aGUgY3Vyc29yIHRvIHByZXZlbnQgc2Nyb2xsaW5nIGFydGlmYWN0cwogICAgdmFyIGhlYWRQb3MgPSBjdXJzb3JDb29yZHMoY20sIGNtLnZpZXcuc2VsLmhlYWQsICJkaXYiKTsKICAgIHZhciB3cmFwT2ZmID0gZGlzcGxheS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBsaW5lT2ZmID0gZGlzcGxheS5saW5lRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgZGlzcGxheS5pbnB1dERpdi5zdHlsZS50b3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0IC0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRQb3MudG9wICsgbGluZU9mZi50b3AgLSB3cmFwT2ZmLnRvcCkpICsgInB4IjsKICAgIGRpc3BsYXkuaW5wdXREaXYuc3R5bGUubGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGRpc3BsYXkud3JhcHBlci5jbGllbnRXaWR0aCAtIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZFBvcy5sZWZ0ICsgbGluZU9mZi5sZWZ0IC0gd3JhcE9mZi5sZWZ0KSkgKyAicHgiOwogIH0KCiAgLy8gTm8gc2VsZWN0aW9uLCBwbGFpbiBjdXJzb3IKICBmdW5jdGlvbiB1cGRhdGVTZWxlY3Rpb25DdXJzb3IoY20pIHsKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgcG9zID0gY3Vyc29yQ29vcmRzKGNtLCBjbS52aWV3LnNlbC5oZWFkLCAiZGl2Iik7CiAgICBkaXNwbGF5LmN1cnNvci5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgKyAicHgiOwogICAgZGlzcGxheS5jdXJzb3Iuc3R5bGUudG9wID0gcG9zLnRvcCArICJweCI7CiAgICBkaXNwbGF5LmN1cnNvci5zdHlsZS5oZWlnaHQgPSBNYXRoLm1heCgwLCBwb3MuYm90dG9tIC0gcG9zLnRvcCkgKiBjbS5vcHRpb25zLmN1cnNvckhlaWdodCArICJweCI7CiAgICBkaXNwbGF5LmN1cnNvci5zdHlsZS5kaXNwbGF5ID0gIiI7CgogICAgaWYgKHBvcy5vdGhlcikgewogICAgICBkaXNwbGF5Lm90aGVyQ3Vyc29yLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgZGlzcGxheS5vdGhlckN1cnNvci5zdHlsZS5sZWZ0ID0gcG9zLm90aGVyLmxlZnQgKyAicHgiOwogICAgICBkaXNwbGF5Lm90aGVyQ3Vyc29yLnN0eWxlLnRvcCA9IHBvcy5vdGhlci50b3AgKyAicHgiOwogICAgICBkaXNwbGF5Lm90aGVyQ3Vyc29yLnN0eWxlLmhlaWdodCA9IChwb3Mub3RoZXIuYm90dG9tIC0gcG9zLm90aGVyLnRvcCkgKiAuODUgKyAicHgiOwogICAgfSBlbHNlIHsgZGlzcGxheS5vdGhlckN1cnNvci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOyB9CiAgfQoKICAvLyBIaWdobGlnaHQgc2VsZWN0aW9uCiAgZnVuY3Rpb24gdXBkYXRlU2VsZWN0aW9uUmFuZ2UoY20pIHsKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgZG9jID0gY20udmlldy5kb2MsIHNlbCA9IGNtLnZpZXcuc2VsOwogICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgdmFyIGNsaWVudFdpZHRoID0gZGlzcGxheS5saW5lU3BhY2Uub2Zmc2V0V2lkdGgsIHBsID0gcGFkZGluZ0xlZnQoY20uZGlzcGxheSk7CgogICAgZnVuY3Rpb24gYWRkKGxlZnQsIHRvcCwgd2lkdGgsIGJvdHRvbSkgewogICAgICBpZiAodG9wIDwgMCkgdG9wID0gMDsKICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1zZWxlY3RlZCIsICJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6ICIgKyBsZWZ0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweDsgdG9wOiAiICsgdG9wICsgInB4OyB3aWR0aDogIiArICh3aWR0aCA9PSBudWxsID8gY2xpZW50V2lkdGggLSBsZWZ0IDogd2lkdGgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweDsgaGVpZ2h0OiAiICsgKGJvdHRvbSAtIHRvcCkgKyAicHgiKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZHJhd0ZvckxpbmUobGluZSwgZnJvbUFyZywgdG9BcmcsIHJldFRvcCkgewogICAgICB2YXIgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lKTsKICAgICAgdmFyIGxpbmVMZW4gPSBsaW5lT2JqLnRleHQubGVuZ3RoLCByVmFsID0gcmV0VG9wID8gSW5maW5pdHkgOiAtSW5maW5pdHk7CiAgICAgIGZ1bmN0aW9uIGNvb3JkcyhjaCkgewogICAgICAgIHJldHVybiBjaGFyQ29vcmRzKGNtLCB7bGluZTogbGluZSwgY2g6IGNofSwgImRpdiIsIGxpbmVPYmopOwogICAgICB9CgogICAgICBpdGVyYXRlQmlkaVNlY3Rpb25zKGdldE9yZGVyKGxpbmVPYmopLCBmcm9tQXJnIHx8IDAsIHRvQXJnID09IG51bGwgPyBsaW5lTGVuIDogdG9BcmcsIGZ1bmN0aW9uKGZyb20sIHRvLCBkaXIpIHsKICAgICAgICB2YXIgbGVmdFBvcyA9IGNvb3JkcyhkaXIgPT0gInJ0bCIgPyB0byAtIDEgOiBmcm9tKTsKICAgICAgICB2YXIgcmlnaHRQb3MgPSBjb29yZHMoZGlyID09ICJydGwiID8gZnJvbSA6IHRvIC0gMSk7CiAgICAgICAgdmFyIGxlZnQgPSBsZWZ0UG9zLmxlZnQsIHJpZ2h0ID0gcmlnaHRQb3MucmlnaHQ7CiAgICAgICAgaWYgKHJpZ2h0UG9zLnRvcCAtIGxlZnRQb3MudG9wID4gMykgeyAvLyBEaWZmZXJlbnQgbGluZXMsIGRyYXcgdG9wIHBhcnQKICAgICAgICAgIGFkZChsZWZ0LCBsZWZ0UG9zLnRvcCwgbnVsbCwgbGVmdFBvcy5ib3R0b20pOwogICAgICAgICAgbGVmdCA9IHBsOwogICAgICAgICAgaWYgKGxlZnRQb3MuYm90dG9tIDwgcmlnaHRQb3MudG9wKSBhZGQobGVmdCwgbGVmdFBvcy5ib3R0b20sIG51bGwsIHJpZ2h0UG9zLnRvcCk7CiAgICAgICAgfQogICAgICAgIGlmICh0b0FyZyA9PSBudWxsICYmIHRvID09IGxpbmVMZW4pIHJpZ2h0ID0gY2xpZW50V2lkdGg7CiAgICAgICAgaWYgKGZyb21BcmcgPT0gbnVsbCAmJiBmcm9tID09IDApIGxlZnQgPSBwbDsKICAgICAgICByVmFsID0gcmV0VG9wID8gTWF0aC5taW4ocmlnaHRQb3MudG9wLCByVmFsKSA6IE1hdGgubWF4KHJpZ2h0UG9zLmJvdHRvbSwgclZhbCk7CiAgICAgICAgaWYgKGxlZnQgPCBwbCArIDEpIGxlZnQgPSBwbDsKICAgICAgICBhZGQobGVmdCwgcmlnaHRQb3MudG9wLCByaWdodCAtIGxlZnQsIHJpZ2h0UG9zLmJvdHRvbSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gclZhbDsKICAgIH0KCiAgICBpZiAoc2VsLmZyb20ubGluZSA9PSBzZWwudG8ubGluZSkgewogICAgICBkcmF3Rm9yTGluZShzZWwuZnJvbS5saW5lLCBzZWwuZnJvbS5jaCwgc2VsLnRvLmNoKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBmcm9tT2JqID0gZ2V0TGluZShkb2MsIHNlbC5mcm9tLmxpbmUpOwogICAgICB2YXIgY3VyID0gZnJvbU9iaiwgbWVyZ2VkLCBwYXRoID0gW3NlbC5mcm9tLmxpbmUsIHNlbC5mcm9tLmNoXSwgc2luZ2xlTGluZTsKICAgICAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChjdXIpKSB7CiAgICAgICAgdmFyIGZvdW5kID0gbWVyZ2VkLmZpbmQoKTsKICAgICAgICBwYXRoLnB1c2goZm91bmQuZnJvbS5jaCwgZm91bmQudG8ubGluZSwgZm91bmQudG8uY2gpOwogICAgICAgIGlmIChmb3VuZC50by5saW5lID09IHNlbC50by5saW5lKSB7CiAgICAgICAgICBwYXRoLnB1c2goc2VsLnRvLmNoKTsKICAgICAgICAgIHNpbmdsZUxpbmUgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGN1ciA9IGdldExpbmUoZG9jLCBmb3VuZC50by5saW5lKTsKICAgICAgfQoKICAgICAgLy8gVGhpcyBpcyBhIHNpbmdsZSwgbWVyZ2VkIGxpbmUKICAgICAgaWYgKHNpbmdsZUxpbmUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpICs9IDMpCiAgICAgICAgICBkcmF3Rm9yTGluZShwYXRoW2ldLCBwYXRoW2krMV0sIHBhdGhbaSsyXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG1pZGRsZVRvcCwgbWlkZGxlQm90LCB0b09iaiA9IGdldExpbmUoZG9jLCBzZWwudG8ubGluZSk7CiAgICAgICAgaWYgKHNlbC5mcm9tLmNoKQogICAgICAgICAgLy8gRHJhdyB0aGUgZmlyc3QgbGluZSBvZiBzZWxlY3Rpb24uCiAgICAgICAgICBtaWRkbGVUb3AgPSBkcmF3Rm9yTGluZShzZWwuZnJvbS5saW5lLCBzZWwuZnJvbS5jaCwgbnVsbCwgZmFsc2UpOwogICAgICAgIGVsc2UKICAgICAgICAgIC8vIFNpbXBseSBpbmNsdWRlIGl0IGluIHRoZSBtaWRkbGUgYmxvY2suCiAgICAgICAgICBtaWRkbGVUb3AgPSBoZWlnaHRBdExpbmUoY20sIGZyb21PYmopIC0gZGlzcGxheS52aWV3T2Zmc2V0OwoKICAgICAgICBpZiAoIXNlbC50by5jaCkKICAgICAgICAgIG1pZGRsZUJvdCA9IGhlaWdodEF0TGluZShjbSwgdG9PYmopIC0gZGlzcGxheS52aWV3T2Zmc2V0OwogICAgICAgIGVsc2UKICAgICAgICAgIG1pZGRsZUJvdCA9IGRyYXdGb3JMaW5lKHNlbC50by5saW5lLCBjb2xsYXBzZWRTcGFuQXRTdGFydCh0b09iaikgPyBudWxsIDogMCwgc2VsLnRvLmNoLCB0cnVlKTsKCiAgICAgICAgaWYgKG1pZGRsZVRvcCA8IG1pZGRsZUJvdCkgYWRkKHBsLCBtaWRkbGVUb3AsIG51bGwsIG1pZGRsZUJvdCk7CiAgICAgIH0KICAgIH0KCiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5LnNlbGVjdGlvbkRpdiwgZnJhZ21lbnQpOwogICAgZGlzcGxheS5zZWxlY3Rpb25EaXYuc3R5bGUuZGlzcGxheSA9ICIiOwogIH0KCiAgLy8gQ3Vyc29yLWJsaW5raW5nCiAgZnVuY3Rpb24gcmVzdGFydEJsaW5rKGNtKSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7CiAgICBjbGVhckludGVydmFsKGRpc3BsYXkuYmxpbmtlcik7CiAgICB2YXIgb24gPSB0cnVlOwogICAgZGlzcGxheS5jdXJzb3Iuc3R5bGUudmlzaWJpbGl0eSA9IGRpc3BsYXkub3RoZXJDdXJzb3Iuc3R5bGUudmlzaWJpbGl0eSA9ICIiOwogICAgZGlzcGxheS5ibGlua2VyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgIGlmICghZGlzcGxheS5jdXJzb3Iub2Zmc2V0SGVpZ2h0KSByZXR1cm47CiAgICAgIGRpc3BsYXkuY3Vyc29yLnN0eWxlLnZpc2liaWxpdHkgPSBkaXNwbGF5Lm90aGVyQ3Vyc29yLnN0eWxlLnZpc2liaWxpdHkgPSAob24gPSAhb24pID8gIiIgOiAiaGlkZGVuIjsKICAgIH0sIGNtLm9wdGlvbnMuY3Vyc29yQmxpbmtSYXRlKTsKICB9CgogIC8vIEhJR0hMSUdIVCBXT1JLRVIKCiAgZnVuY3Rpb24gc3RhcnRXb3JrZXIoY20sIHRpbWUpIHsKICAgIGlmIChjbS52aWV3LmZyb250aWVyIDwgY20uZGlzcGxheS5zaG93aW5nVG8pCiAgICAgIGNtLnZpZXcuaGlnaGxpZ2h0LnNldCh0aW1lLCBiaW5kKGhpZ2hsaWdodFdvcmtlciwgY20pKTsKICB9CgogIGZ1bmN0aW9uIGhpZ2hsaWdodFdvcmtlcihjbSkgewogICAgdmFyIHZpZXcgPSBjbS52aWV3LCBkb2MgPSB2aWV3LmRvYzsKICAgIGlmICh2aWV3LmZyb250aWVyID49IGNtLmRpc3BsYXkuc2hvd2luZ1RvKSByZXR1cm47CiAgICB2YXIgZW5kID0gK25ldyBEYXRlICsgY20ub3B0aW9ucy53b3JrVGltZTsKICAgIHZhciBzdGF0ZSA9IGNvcHlTdGF0ZSh2aWV3Lm1vZGUsIGdldFN0YXRlQmVmb3JlKGNtLCB2aWV3LmZyb250aWVyKSk7CiAgICB2YXIgY2hhbmdlZCA9IFtdLCBwcmV2Q2hhbmdlOwogICAgZG9jLml0ZXIodmlldy5mcm9udGllciwgTWF0aC5taW4oZG9jLnNpemUsIGNtLmRpc3BsYXkuc2hvd2luZ1RvICsgNTAwKSwgZnVuY3Rpb24obGluZSkgewogICAgICBpZiAodmlldy5mcm9udGllciA+PSBjbS5kaXNwbGF5LnNob3dpbmdGcm9tKSB7IC8vIFZpc2libGUKICAgICAgICBpZiAoaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgc3RhdGUpICYmIHZpZXcuZnJvbnRpZXIgPj0gY20uZGlzcGxheS5zaG93aW5nRnJvbSkgewogICAgICAgICAgaWYgKHByZXZDaGFuZ2UgJiYgcHJldkNoYW5nZS5lbmQgPT0gdmlldy5mcm9udGllcikgcHJldkNoYW5nZS5lbmQrKzsKICAgICAgICAgIGVsc2UgY2hhbmdlZC5wdXNoKHByZXZDaGFuZ2UgPSB7c3RhcnQ6IHZpZXcuZnJvbnRpZXIsIGVuZDogdmlldy5mcm9udGllciArIDF9KTsKICAgICAgICB9CiAgICAgICAgbGluZS5zdGF0ZUFmdGVyID0gY29weVN0YXRlKHZpZXcubW9kZSwgc3RhdGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHByb2Nlc3NMaW5lKGNtLCBsaW5lLCBzdGF0ZSk7CiAgICAgICAgbGluZS5zdGF0ZUFmdGVyID0gdmlldy5mcm9udGllciAlIDUgPT0gMCA/IGNvcHlTdGF0ZSh2aWV3Lm1vZGUsIHN0YXRlKSA6IG51bGw7CiAgICAgIH0KICAgICAgKyt2aWV3LmZyb250aWVyOwogICAgICBpZiAoK25ldyBEYXRlID4gZW5kKSB7CiAgICAgICAgc3RhcnRXb3JrZXIoY20sIGNtLm9wdGlvbnMud29ya0RlbGF5KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgICBpZiAoY2hhbmdlZC5sZW5ndGgpCiAgICAgIG9wZXJhdGlvbihjbSwgZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VkLmxlbmd0aDsgKytpKQogICAgICAgICAgcmVnQ2hhbmdlKHRoaXMsIGNoYW5nZWRbaV0uc3RhcnQsIGNoYW5nZWRbaV0uZW5kKTsKICAgICAgfSkoKTsKICB9CgogIC8vIEZpbmRzIHRoZSBsaW5lIHRvIHN0YXJ0IHdpdGggd2hlbiBzdGFydGluZyBhIHBhcnNlLiBUcmllcyB0bwogIC8vIGZpbmQgYSBsaW5lIHdpdGggYSBzdGF0ZUFmdGVyLCBzbyB0aGF0IGl0IGNhbiBzdGFydCB3aXRoIGEKICAvLyB2YWxpZCBzdGF0ZS4gSWYgdGhhdCBmYWlscywgaXQgcmV0dXJucyB0aGUgbGluZSB3aXRoIHRoZQogIC8vIHNtYWxsZXN0IGluZGVudGF0aW9uLCB3aGljaCB0ZW5kcyB0byBuZWVkIHRoZSBsZWFzdCBjb250ZXh0IHRvCiAgLy8gcGFyc2UgY29ycmVjdGx5LgogIGZ1bmN0aW9uIGZpbmRTdGFydExpbmUoY20sIG4pIHsKICAgIHZhciBtaW5pbmRlbnQsIG1pbmxpbmUsIGRvYyA9IGNtLnZpZXcuZG9jOwogICAgZm9yICh2YXIgc2VhcmNoID0gbiwgbGltID0gbiAtIDEwMDsgc2VhcmNoID4gbGltOyAtLXNlYXJjaCkgewogICAgICBpZiAoc2VhcmNoID09IDApIHJldHVybiAwOwogICAgICB2YXIgbGluZSA9IGdldExpbmUoZG9jLCBzZWFyY2gtMSk7CiAgICAgIGlmIChsaW5lLnN0YXRlQWZ0ZXIpIHJldHVybiBzZWFyY2g7CiAgICAgIHZhciBpbmRlbnRlZCA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgY20ub3B0aW9ucy50YWJTaXplKTsKICAgICAgaWYgKG1pbmxpbmUgPT0gbnVsbCB8fCBtaW5pbmRlbnQgPiBpbmRlbnRlZCkgewogICAgICAgIG1pbmxpbmUgPSBzZWFyY2ggLSAxOwogICAgICAgIG1pbmluZGVudCA9IGluZGVudGVkOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWlubGluZTsKICB9CgogIGZ1bmN0aW9uIGdldFN0YXRlQmVmb3JlKGNtLCBuKSB7CiAgICB2YXIgdmlldyA9IGNtLnZpZXc7CiAgICB2YXIgcG9zID0gZmluZFN0YXJ0TGluZShjbSwgbiksIHN0YXRlID0gcG9zICYmIGdldExpbmUodmlldy5kb2MsIHBvcy0xKS5zdGF0ZUFmdGVyOwogICAgaWYgKCFzdGF0ZSkgc3RhdGUgPSBzdGFydFN0YXRlKHZpZXcubW9kZSk7CiAgICBlbHNlIHN0YXRlID0gY29weVN0YXRlKHZpZXcubW9kZSwgc3RhdGUpOwogICAgdmlldy5kb2MuaXRlcihwb3MsIG4sIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgcHJvY2Vzc0xpbmUoY20sIGxpbmUsIHN0YXRlKTsKICAgICAgdmFyIHNhdmUgPSBwb3MgPT0gbiAtIDEgfHwgcG9zICUgNSA9PSAwIHx8IHBvcyA+PSB2aWV3LnNob3dpbmdGcm9tICYmIHBvcyA8IHZpZXcuc2hvd2luZ1RvOwogICAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBzYXZlID8gY29weVN0YXRlKHZpZXcubW9kZSwgc3RhdGUpIDogbnVsbDsKICAgICAgKytwb3M7CiAgICB9KTsKICAgIHJldHVybiBzdGF0ZTsKICB9CgogIC8vIFBPU0lUSU9OIE1FQVNVUkVNRU5UCiAgCiAgZnVuY3Rpb24gcGFkZGluZ1RvcChkaXNwbGF5KSB7cmV0dXJuIGRpc3BsYXkubGluZVNwYWNlLm9mZnNldFRvcDt9CiAgZnVuY3Rpb24gcGFkZGluZ0xlZnQoZGlzcGxheSkgewogICAgdmFyIGUgPSByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUsIGVsdCgicHJlIikpLmFwcGVuZENoaWxkKGVsdCgic3BhbiIsICJ4IikpOwogICAgcmV0dXJuIGUub2Zmc2V0TGVmdDsKICB9CgogIGZ1bmN0aW9uIG1lYXN1cmVDaGFyKGNtLCBsaW5lLCBjaCwgZGF0YSkgewogICAgdmFyIGRhdGEgPSBkYXRhIHx8IG1lYXN1cmVMaW5lKGNtLCBsaW5lKSwgZGlyID0gLTE7CiAgICBmb3IgKHZhciBwb3MgPSBjaDs7IHBvcyArPSBkaXIpIHsKICAgICAgdmFyIHIgPSBkYXRhW3Bvc107CiAgICAgIGlmIChyKSBicmVhazsKICAgICAgaWYgKGRpciA8IDAgJiYgcG9zID09IDApIGRpciA9IDE7CiAgICB9CiAgICByZXR1cm4ge2xlZnQ6IHBvcyA8IGNoID8gci5yaWdodCA6IHIubGVmdCwKICAgICAgICAgICAgcmlnaHQ6IHBvcyA+IGNoID8gci5sZWZ0IDogci5yaWdodCwKICAgICAgICAgICAgdG9wOiByLnRvcCwgYm90dG9tOiByLmJvdHRvbX07CiAgfQoKICBmdW5jdGlvbiBtZWFzdXJlTGluZShjbSwgbGluZSkgewogICAgLy8gRmlyc3QgbG9vayBpbiB0aGUgY2FjaGUKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgY2FjaGUgPSBjbS5kaXNwbGF5Lm1lYXN1cmVMaW5lQ2FjaGU7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBtZW1vID0gY2FjaGVbaV07CiAgICAgIGlmIChtZW1vLnRleHQgPT0gbGluZS50ZXh0ICYmIG1lbW8ubWFya2VkU3BhbnMgPT0gbGluZS5tYXJrZWRTcGFucyAmJgogICAgICAgICAgZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCA9PSBtZW1vLndpZHRoKQogICAgICAgIHJldHVybiBtZW1vLm1lYXN1cmU7CiAgICB9CiAgICAKICAgIHZhciBtZWFzdXJlID0gbWVhc3VyZUxpbmVJbm5lcihjbSwgbGluZSk7CiAgICAvLyBTdG9yZSByZXN1bHQgaW4gdGhlIGNhY2hlCiAgICB2YXIgbWVtbyA9IHt0ZXh0OiBsaW5lLnRleHQsIHdpZHRoOiBkaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoLAogICAgICAgICAgICAgICAgbWFya2VkU3BhbnM6IGxpbmUubWFya2VkU3BhbnMsIG1lYXN1cmU6IG1lYXN1cmV9OwogICAgaWYgKGNhY2hlLmxlbmd0aCA9PSAxNikgY2FjaGVbKytkaXNwbGF5Lm1lYXN1cmVMaW5lQ2FjaGVQb3MgJSAxNl0gPSBtZW1vOwogICAgZWxzZSBjYWNoZS5wdXNoKG1lbW8pOwogICAgcmV0dXJuIG1lYXN1cmU7CiAgfQoKICBmdW5jdGlvbiBtZWFzdXJlTGluZUlubmVyKGNtLCBsaW5lKSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIG1lYXN1cmUgPSBlbXB0eUFycmF5KGxpbmUudGV4dC5sZW5ndGgpOwogICAgdmFyIHByZSA9IGxpbmVDb250ZW50KGNtLCBsaW5lLCBtZWFzdXJlKTsKCiAgICAvLyBJRSBkb2VzIG5vdCBjYWNoZSBlbGVtZW50IHBvc2l0aW9ucyBvZiBpbmxpbmUgZWxlbWVudHMgYmV0d2VlbgogICAgLy8gY2FsbHMgdG8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0LiBUaGlzIG1ha2VzIHRoZSBsb29wIGJlbG93LAogICAgLy8gd2hpY2ggZ2F0aGVycyB0aGUgcG9zaXRpb25zIG9mIGFsbCB0aGUgY2hhcmFjdGVycyBvbiB0aGUgbGluZSwKICAgIC8vIGRvIGFuIGFtb3VudCBvZiBsYXlvdXQgd29yayBxdWFkcmF0aWMgdG8gdGhlIG51bWJlciBvZgogICAgLy8gY2hhcmFjdGVycy4gV2hlbiBsaW5lIHdyYXBwaW5nIGlzIG9mZiwgd2UgdHJ5IHRvIGltcHJvdmUgdGhpbmdzCiAgICAvLyBieSBmaXJzdCBzdWJkaXZpZGluZyB0aGUgbGluZSBpbnRvIGEgYnVuY2ggb2YgaW5saW5lIGJsb2Nrcywgc28KICAgIC8vIHRoYXQgSUUgY2FuIHJldXNlIG1vc3Qgb2YgdGhlIGxheW91dCBpbmZvcm1hdGlvbiBmcm9tIGNhY2hlcwogICAgLy8gZm9yIHRob3NlIGJsb2Nrcy4gVGhpcyBkb2VzIGludGVyZmVyZSB3aXRoIGxpbmUgd3JhcHBpbmcsIHNvIGl0CiAgICAvLyBkb2Vzbid0IHdvcmsgd2hlbiB3cmFwcGluZyBpcyBvbiwgYnV0IGluIHRoYXQgY2FzZSB0aGUKICAgIC8vIHNpdHVhdGlvbiBpcyBzbGlnaHRseSBiZXR0ZXIsIHNpbmNlIElFIGRvZXMgY2FjaGUgbGluZS13cmFwcGluZwogICAgLy8gaW5mb3JtYXRpb24gYW5kIG9ubHkgcmVjb21wdXRlcyBwZXItbGluZS4KICAgIGlmIChpZSAmJiAhaWVfbHQ4ICYmICFjbS5vcHRpb25zLmxpbmVXcmFwcGluZyAmJiBwcmUuY2hpbGROb2Rlcy5sZW5ndGggPiAxMDApIHsKICAgICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgICB2YXIgY2h1bmsgPSAxMCwgbiA9IHByZS5jaGlsZE5vZGVzLmxlbmd0aDsKICAgICAgZm9yICh2YXIgaSA9IDAsIGNodW5rcyA9IE1hdGguY2VpbChuIC8gY2h1bmspOyBpIDwgY2h1bmtzOyArK2kpIHsKICAgICAgICB2YXIgd3JhcCA9IGVsdCgiZGl2IiwgbnVsbCwgbnVsbCwgImRpc3BsYXk6IGlubGluZS1ibG9jayIpOwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmsgJiYgbjsgKytqKSB7CiAgICAgICAgICB3cmFwLmFwcGVuZENoaWxkKHByZS5maXJzdENoaWxkKTsKICAgICAgICAgIC0tbjsKICAgICAgICB9CiAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQod3JhcCk7CiAgICAgIH0KICAgICAgcHJlLmFwcGVuZENoaWxkKGZyYWdtZW50KTsKICAgIH0KCiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUsIHByZSk7CgogICAgdmFyIG91dGVyID0gZGlzcGxheS5saW5lRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIHZyYW5nZXMgPSBbXSwgZGF0YSA9IGVtcHR5QXJyYXkobGluZS50ZXh0Lmxlbmd0aCksIG1heEJvdCA9IHByZS5vZmZzZXRIZWlnaHQ7CiAgICBmb3IgKHZhciBpID0gMCwgY3VyOyBpIDwgbWVhc3VyZS5sZW5ndGg7ICsraSkgaWYgKGN1ciA9IG1lYXN1cmVbaV0pIHsKICAgICAgdmFyIHNpemUgPSBjdXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHZhciB0b3AgPSBNYXRoLm1heCgwLCBzaXplLnRvcCAtIG91dGVyLnRvcCksIGJvdCA9IE1hdGgubWluKHNpemUuYm90dG9tIC0gb3V0ZXIudG9wLCBtYXhCb3QpOwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZyYW5nZXMubGVuZ3RoOyBqICs9IDIpIHsKICAgICAgICB2YXIgcnRvcCA9IHZyYW5nZXNbal0sIHJib3QgPSB2cmFuZ2VzW2orMV07CiAgICAgICAgaWYgKHJ0b3AgPiBib3QgfHwgcmJvdCA8IHRvcCkgY29udGludWU7CiAgICAgICAgaWYgKHJ0b3AgPD0gdG9wICYmIHJib3QgPj0gYm90IHx8CiAgICAgICAgICAgIHRvcCA8PSBydG9wICYmIGJvdCA+PSByYm90IHx8CiAgICAgICAgICAgIE1hdGgubWluKGJvdCwgcmJvdCkgLSBNYXRoLm1heCh0b3AsIHJ0b3ApID49IChib3QgLSB0b3ApID4+IDEpIHsKICAgICAgICAgIHZyYW5nZXNbal0gPSBNYXRoLm1pbih0b3AsIHJ0b3ApOwogICAgICAgICAgdnJhbmdlc1tqKzFdID0gTWF0aC5tYXgoYm90LCByYm90KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaiA9PSB2cmFuZ2VzLmxlbmd0aCkgdnJhbmdlcy5wdXNoKHRvcCwgYm90KTsKICAgICAgZGF0YVtpXSA9IHtsZWZ0OiBzaXplLmxlZnQgLSBvdXRlci5sZWZ0LCByaWdodDogc2l6ZS5yaWdodCAtIG91dGVyLmxlZnQsIHRvcDogan07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMCwgY3VyOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkgaWYgKGN1ciA9IGRhdGFbaV0pIHsKICAgICAgdmFyIHZyID0gY3VyLnRvcDsKICAgICAgY3VyLnRvcCA9IHZyYW5nZXNbdnJdOyBjdXIuYm90dG9tID0gdnJhbmdlc1t2cisxXTsKICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KCiAgZnVuY3Rpb24gY2xlYXJDYWNoZXMoY20pIHsKICAgIGNtLmRpc3BsYXkubWVhc3VyZUxpbmVDYWNoZS5sZW5ndGggPSBjbS5kaXNwbGF5Lm1lYXN1cmVMaW5lQ2FjaGVQb3MgPSAwOwogICAgY20uZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggPSBjbS5kaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgPSBudWxsOwogICAgY20udmlldy5tYXhMaW5lQ2hhbmdlZCA9IHRydWU7CiAgfQoKICAvLyBDb250ZXh0IGlzIG9uZSBvZiAibGluZSIsICJkaXYiIChkaXNwbGF5LmxpbmVEaXYpLCAibG9jYWwiL251bGwgKGVkaXRvciksIG9yICJwYWdlIgogIGZ1bmN0aW9uIGludG9Db29yZFN5c3RlbShjbSwgbGluZU9iaiwgcmVjdCwgY29udGV4dCkgewogICAgaWYgKGxpbmVPYmoud2lkZ2V0cykgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lT2JqLndpZGdldHMubGVuZ3RoOyArK2kpIGlmIChsaW5lT2JqLndpZGdldHNbaV0uYWJvdmUpIHsKICAgICAgdmFyIHNpemUgPSBsaW5lT2JqLndpZGdldHNbaV0ubm9kZS5vZmZzZXRIZWlnaHQ7CiAgICAgIHJlY3QudG9wICs9IHNpemU7IHJlY3QuYm90dG9tICs9IHNpemU7CiAgICB9CiAgICBpZiAoY29udGV4dCA9PSAibGluZSIpIHJldHVybiByZWN0OwogICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gImxvY2FsIjsKICAgIHZhciB5T2ZmID0gaGVpZ2h0QXRMaW5lKGNtLCBsaW5lT2JqKTsKICAgIGlmIChjb250ZXh0ICE9ICJsb2NhbCIpIHlPZmYgLT0gY20uZGlzcGxheS52aWV3T2Zmc2V0OwogICAgaWYgKGNvbnRleHQgPT0gInBhZ2UiKSB7CiAgICAgIHZhciBsT2ZmID0gY20uZGlzcGxheS5saW5lU3BhY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHlPZmYgKz0gbE9mZi50b3AgKyAod2luZG93LnBhZ2VZT2Zmc2V0IHx8IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wKTsKICAgICAgdmFyIHhPZmYgPSBsT2ZmLmxlZnQgKyAod2luZG93LnBhZ2VYT2Zmc2V0IHx8IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCk7CiAgICAgIHJlY3QubGVmdCArPSB4T2ZmOyByZWN0LnJpZ2h0ICs9IHhPZmY7CiAgICB9CiAgICByZWN0LnRvcCArPSB5T2ZmOyByZWN0LmJvdHRvbSArPSB5T2ZmOwogICAgcmV0dXJuIHJlY3Q7CiAgfQoKICBmdW5jdGlvbiBjaGFyQ29vcmRzKGNtLCBwb3MsIGNvbnRleHQsIGxpbmVPYmopIHsKICAgIGlmICghbGluZU9iaikgbGluZU9iaiA9IGdldExpbmUoY20udmlldy5kb2MsIHBvcy5saW5lKTsKICAgIHJldHVybiBpbnRvQ29vcmRTeXN0ZW0oY20sIGxpbmVPYmosIG1lYXN1cmVDaGFyKGNtLCBsaW5lT2JqLCBwb3MuY2gpLCBjb250ZXh0KTsKICB9CgogIGZ1bmN0aW9uIGN1cnNvckNvb3JkcyhjbSwgcG9zLCBjb250ZXh0LCBsaW5lT2JqLCBtZWFzdXJlbWVudCkgewogICAgbGluZU9iaiA9IGxpbmVPYmogfHwgZ2V0TGluZShjbS52aWV3LmRvYywgcG9zLmxpbmUpOwogICAgaWYgKCFtZWFzdXJlbWVudCkgbWVhc3VyZW1lbnQgPSBtZWFzdXJlTGluZShjbSwgbGluZU9iaik7CiAgICBmdW5jdGlvbiBnZXQoY2gsIHJpZ2h0KSB7CiAgICAgIHZhciBtID0gbWVhc3VyZUNoYXIoY20sIGxpbmVPYmosIGNoLCBtZWFzdXJlbWVudCk7CiAgICAgIGlmIChyaWdodCkgbS5sZWZ0ID0gbS5yaWdodDsgZWxzZSBtLnJpZ2h0ID0gbS5sZWZ0OwogICAgICByZXR1cm4gaW50b0Nvb3JkU3lzdGVtKGNtLCBsaW5lT2JqLCBtLCBjb250ZXh0KTsKICAgIH0KICAgIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmVPYmopLCBjaCA9IHBvcy5jaDsKICAgIGlmICghb3JkZXIpIHJldHVybiBnZXQoY2gpOwogICAgdmFyIG1haW4sIG90aGVyLCBsaW5lZGlyID0gb3JkZXJbMF0ubGV2ZWw7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBwYXJ0ID0gb3JkZXJbaV0sIHJ0bCA9IHBhcnQubGV2ZWwgJSAyLCBuYiwgaGVyZTsKICAgICAgaWYgKHBhcnQuZnJvbSA8IGNoICYmIHBhcnQudG8gPiBjaCkgcmV0dXJuIGdldChjaCwgcnRsKTsKICAgICAgdmFyIGxlZnQgPSBydGwgPyBwYXJ0LnRvIDogcGFydC5mcm9tLCByaWdodCA9IHJ0bCA/IHBhcnQuZnJvbSA6IHBhcnQudG87CiAgICAgIGlmIChsZWZ0ID09IGNoKSB7CiAgICAgICAgLy8gT3BlcmEgYW5kIElFIHJldHVybiBib2d1cyBvZmZzZXRzIGFuZCB3aWR0aHMgZm9yIGVkZ2VzCiAgICAgICAgLy8gd2hlcmUgdGhlIGRpcmVjdGlvbiBmbGlwcywgYnV0IG9ubHkgZm9yIHRoZSBzaWRlIHdpdGggdGhlCiAgICAgICAgLy8gbG93ZXIgbGV2ZWwuIFNvIHdlIHRyeSB0byB1c2UgdGhlIHNpZGUgd2l0aCB0aGUgaGlnaGVyCiAgICAgICAgLy8gbGV2ZWwuCiAgICAgICAgaWYgKGkgJiYgcGFydC5sZXZlbCA8IChuYiA9IG9yZGVyW2ktMV0pLmxldmVsKSBoZXJlID0gZ2V0KG5iLmxldmVsICUgMiA/IG5iLmZyb20gOiBuYi50byAtIDEsIHRydWUpOwogICAgICAgIGVsc2UgaGVyZSA9IGdldChydGwgJiYgcGFydC5mcm9tICE9IHBhcnQudG8gPyBjaCAtIDEgOiBjaCk7CiAgICAgICAgaWYgKHJ0bCA9PSBsaW5lZGlyKSBtYWluID0gaGVyZTsgZWxzZSBvdGhlciA9IGhlcmU7CiAgICAgIH0gZWxzZSBpZiAocmlnaHQgPT0gY2gpIHsKICAgICAgICB2YXIgbmIgPSBpIDwgb3JkZXIubGVuZ3RoIC0gMSAmJiBvcmRlcltpKzFdOwogICAgICAgIGlmICghcnRsICYmIG5iICYmIG5iLmZyb20gPT0gbmIudG8pIGNvbnRpbnVlOwogICAgICAgIGlmIChuYiAmJiBwYXJ0LmxldmVsIDwgbmIubGV2ZWwpIGhlcmUgPSBnZXQobmIubGV2ZWwgJSAyID8gbmIudG8gLSAxIDogbmIuZnJvbSk7CiAgICAgICAgZWxzZSBoZXJlID0gZ2V0KHJ0bCA/IGNoIDogY2ggLSAxLCB0cnVlKTsKICAgICAgICBpZiAocnRsID09IGxpbmVkaXIpIG1haW4gPSBoZXJlOyBlbHNlIG90aGVyID0gaGVyZTsKICAgICAgfQogICAgfQogICAgaWYgKGxpbmVkaXIgJiYgIWNoKSBvdGhlciA9IGdldChvcmRlclswXS50byAtIDEpOwogICAgaWYgKCFtYWluKSByZXR1cm4gb3RoZXI7CiAgICBpZiAob3RoZXIpIG1haW4ub3RoZXIgPSBvdGhlcjsKICAgIHJldHVybiBtYWluOwogIH0KCiAgLy8gQ29vcmRzIG11c3QgYmUgbGluZVNwYWNlLWxvY2FsCiAgZnVuY3Rpb24gY29vcmRzQ2hhcihjbSwgeCwgeSkgewogICAgdmFyIGRvYyA9IGNtLnZpZXcuZG9jOwogICAgeSArPSBjbS5kaXNwbGF5LnZpZXdPZmZzZXQ7CiAgICBpZiAoeSA8IDApIHJldHVybiB7bGluZTogMCwgY2g6IDAsIG91dHNpZGU6IHRydWV9OwogICAgdmFyIGxpbmVObyA9IGxpbmVBdEhlaWdodChkb2MsIHkpOwogICAgaWYgKGxpbmVObyA+PSBkb2Muc2l6ZSkgcmV0dXJuIHtsaW5lOiBkb2Muc2l6ZSAtIDEsIGNoOiBnZXRMaW5lKGRvYywgZG9jLnNpemUgLSAxKS50ZXh0Lmxlbmd0aH07CiAgICBpZiAoeCA8IDApIHggPSAwOwoKICAgIGZvciAoOzspIHsKICAgICAgdmFyIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbGluZU5vKTsKICAgICAgdmFyIGZvdW5kID0gY29vcmRzQ2hhcklubmVyKGNtLCBsaW5lT2JqLCBsaW5lTm8sIHgsIHkpOwogICAgICB2YXIgbWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGxpbmVPYmopOwogICAgICBpZiAobWVyZ2VkICYmIGZvdW5kLmNoID09IGxpbmVSaWdodChsaW5lT2JqKSkKICAgICAgICBsaW5lTm8gPSBtZXJnZWQuZmluZCgpLnRvLmxpbmU7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gZm91bmQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb29yZHNDaGFySW5uZXIoY20sIGxpbmVPYmosIGxpbmVObywgeCwgeSkgewogICAgdmFyIGlubmVyT2ZmID0geSAtIGhlaWdodEF0TGluZShjbSwgbGluZU9iaik7CiAgICB2YXIgd3JvbmdMaW5lID0gZmFsc2UsIGNXaWR0aCA9IGNtLmRpc3BsYXkud3JhcHBlci5jbGllbnRXaWR0aDsKICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVMaW5lKGNtLCBsaW5lT2JqKTsKCiAgICBmdW5jdGlvbiBnZXRYKGNoKSB7CiAgICAgIHZhciBzcCA9IGN1cnNvckNvb3JkcyhjbSwge2xpbmU6IGxpbmVObywgY2g6IGNofSwgImxpbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9iaiwgbWVhc3VyZW1lbnQpOwogICAgICB3cm9uZ0xpbmUgPSB0cnVlOwogICAgICBpZiAoaW5uZXJPZmYgPiBzcC5ib3R0b20pIHJldHVybiBNYXRoLm1heCgwLCBzcC5sZWZ0IC0gY1dpZHRoKTsKICAgICAgZWxzZSBpZiAoaW5uZXJPZmYgPCBzcC50b3ApIHJldHVybiBzcC5sZWZ0ICsgY1dpZHRoOwogICAgICBlbHNlIHdyb25nTGluZSA9IGZhbHNlOwogICAgICByZXR1cm4gc3AubGVmdDsKICAgIH0KCiAgICB2YXIgYmlkaSA9IGdldE9yZGVyKGxpbmVPYmopLCBkaXN0ID0gbGluZU9iai50ZXh0Lmxlbmd0aDsKICAgIHZhciBmcm9tID0gbGluZUxlZnQobGluZU9iaiksIHRvID0gbGluZVJpZ2h0KGxpbmVPYmopOwogICAgdmFyIGZyb21YID0gcGFkZGluZ0xlZnQoY20uZGlzcGxheSksIHRvWCA9IGdldFgodG8pOwoKICAgIGlmICh4ID4gdG9YKSByZXR1cm4ge2xpbmU6IGxpbmVObywgY2g6IHRvLCBvdXRzaWRlOiB3cm9uZ0xpbmV9OwogICAgLy8gRG8gYSBiaW5hcnkgc2VhcmNoIGJldHdlZW4gdGhlc2UgYm91bmRzLgogICAgZm9yICg7OykgewogICAgICBpZiAoYmlkaSA/IHRvID09IGZyb20gfHwgdG8gPT0gbW92ZVZpc3VhbGx5KGxpbmVPYmosIGZyb20sIDEpIDogdG8gLSBmcm9tIDw9IDEpIHsKICAgICAgICB2YXIgYWZ0ZXIgPSB4IC0gZnJvbVggPCB0b1ggLSB4LCBjaCA9IGFmdGVyID8gZnJvbSA6IHRvOwogICAgICAgIHdoaWxlIChpc0V4dGVuZGluZ0NoYXIudGVzdChsaW5lT2JqLnRleHQuY2hhckF0KGNoKSkpICsrY2g7CiAgICAgICAgcmV0dXJuIHtsaW5lOiBsaW5lTm8sIGNoOiBjaCwgYWZ0ZXI6IGFmdGVyLCBvdXRzaWRlOiB3cm9uZ0xpbmV9OwogICAgICB9CiAgICAgIHZhciBzdGVwID0gTWF0aC5jZWlsKGRpc3QgLyAyKSwgbWlkZGxlID0gZnJvbSArIHN0ZXA7CiAgICAgIGlmIChiaWRpKSB7CiAgICAgICAgbWlkZGxlID0gZnJvbTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXA7ICsraSkgbWlkZGxlID0gbW92ZVZpc3VhbGx5KGxpbmVPYmosIG1pZGRsZSwgMSk7CiAgICAgIH0KICAgICAgdmFyIG1pZGRsZVggPSBnZXRYKG1pZGRsZSk7CiAgICAgIGlmIChtaWRkbGVYID4geCkge3RvID0gbWlkZGxlOyB0b1ggPSBtaWRkbGVYOyBpZiAod3JvbmdMaW5lKSB0b1ggKz0gMTAwMDsgZGlzdCAtPSBzdGVwO30KICAgICAgZWxzZSB7ZnJvbSA9IG1pZGRsZTsgZnJvbVggPSBtaWRkbGVYOyBkaXN0ID0gc3RlcDt9CiAgICB9CiAgfQoKICB2YXIgbWVhc3VyZVRleHQ7CiAgZnVuY3Rpb24gdGV4dEhlaWdodChkaXNwbGF5KSB7CiAgICBpZiAoZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0ICE9IG51bGwpIHJldHVybiBkaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQ7CiAgICBpZiAobWVhc3VyZVRleHQgPT0gbnVsbCkgewogICAgICBtZWFzdXJlVGV4dCA9IGVsdCgicHJlIik7CiAgICAgIC8vIE1lYXN1cmUgYSBidW5jaCBvZiBsaW5lcywgZm9yIGJyb3dzZXJzIHRoYXQgY29tcHV0ZQogICAgICAvLyBmcmFjdGlvbmFsIGhlaWdodHMuCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDk7ICsraSkgewogICAgICAgIG1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ4IikpOwogICAgICAgIG1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGVsdCgiYnIiKSk7CiAgICAgIH0KICAgICAgbWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIngiKSk7CiAgICB9CiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUsIG1lYXN1cmVUZXh0KTsKICAgIHZhciBoZWlnaHQgPSBtZWFzdXJlVGV4dC5vZmZzZXRIZWlnaHQgLyA1MDsKICAgIGlmIChoZWlnaHQgPiAzKSBkaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgPSBoZWlnaHQ7CiAgICByZW1vdmVDaGlsZHJlbihkaXNwbGF5Lm1lYXN1cmUpOwogICAgcmV0dXJuIGhlaWdodCB8fCAxOwogIH0KCiAgZnVuY3Rpb24gY2hhcldpZHRoKGRpc3BsYXkpIHsKICAgIGlmIChkaXNwbGF5LmNhY2hlZENoYXJXaWR0aCAhPSBudWxsKSByZXR1cm4gZGlzcGxheS5jYWNoZWRDaGFyV2lkdGg7CiAgICB2YXIgYW5jaG9yID0gZWx0KCJzcGFuIiwgIngiKTsKICAgIHZhciBwcmUgPSBlbHQoInByZSIsIFthbmNob3JdKTsKICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkubWVhc3VyZSwgcHJlKTsKICAgIHZhciB3aWR0aCA9IGFuY2hvci5vZmZzZXRXaWR0aDsKICAgIGlmICh3aWR0aCA+IDIpIGRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoID0gd2lkdGg7CiAgICByZXR1cm4gd2lkdGggfHwgMTA7CiAgfQoKICAvLyBPUEVSQVRJT05TCgogIC8vIE9wZXJhdGlvbnMgYXJlIHVzZWQgdG8gd3JhcCBjaGFuZ2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBlYWNoCiAgLy8gY2hhbmdlIHdvbid0IGhhdmUgdG8gdXBkYXRlIHRoZSBjdXJzb3IgYW5kIGRpc3BsYXkgKHdoaWNoIHdvdWxkCiAgLy8gYmUgYXdrd2FyZCwgc2xvdywgYW5kIGVycm9yLXByb25lKSwgYnV0IGluc3RlYWQgdXBkYXRlcyBhcmUKICAvLyBiYXRjaGVkIGFuZCB0aGVuIGFsbCBjb21iaW5lZCBhbmQgZXhlY3V0ZWQgYXQgb25jZS4KCiAgZnVuY3Rpb24gc3RhcnRPcGVyYXRpb24oY20pIHsKICAgIGlmIChjbS5jdXJPcCkgKytjbS5jdXJPcC5kZXB0aDsKICAgIGVsc2UgY20uY3VyT3AgPSB7CiAgICAgIC8vIE5lc3RlZCBvcGVyYXRpb25zIGRlbGF5IHVwZGF0ZSB1bnRpbCB0aGUgb3V0ZXJtb3N0IG9uZQogICAgICAvLyBmaW5pc2hlcy4KICAgICAgZGVwdGg6IDEsCiAgICAgIC8vIEFuIGFycmF5IG9mIHJhbmdlcyBvZiBsaW5lcyB0aGF0IGhhdmUgdG8gYmUgdXBkYXRlZC4gU2VlCiAgICAgIC8vIHVwZGF0ZURpc3BsYXkuCiAgICAgIGNoYW5nZXM6IFtdLAogICAgICBkZWxheWVkQ2FsbGJhY2tzOiBbXSwKICAgICAgdXBkYXRlSW5wdXQ6IG51bGwsCiAgICAgIHVzZXJTZWxDaGFuZ2U6IG51bGwsCiAgICAgIHRleHRDaGFuZ2VkOiBudWxsLAogICAgICBzZWxlY3Rpb25DaGFuZ2VkOiBmYWxzZSwKICAgICAgdXBkYXRlTWF4TGluZTogZmFsc2UsCiAgICAgIGlkOiArK2NtLm5leHRPcElkCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZW5kT3BlcmF0aW9uKGNtKSB7CiAgICB2YXIgb3AgPSBjbS5jdXJPcDsKICAgIGlmICgtLW9wLmRlcHRoKSByZXR1cm47CiAgICBjbS5jdXJPcCA9IG51bGw7CiAgICB2YXIgdmlldyA9IGNtLnZpZXcsIGRpc3BsYXkgPSBjbS5kaXNwbGF5OwogICAgaWYgKG9wLnVwZGF0ZU1heExpbmUpIGNvbXB1dGVNYXhMZW5ndGgodmlldyk7CiAgICBpZiAodmlldy5tYXhMaW5lQ2hhbmdlZCAmJiAhY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsKICAgICAgdmFyIHdpZHRoID0gbWVhc3VyZUNoYXIoY20sIHZpZXcubWF4TGluZSwgdmlldy5tYXhMaW5lLnRleHQubGVuZ3RoKS5yaWdodDsKICAgICAgZGlzcGxheS5zaXplci5zdHlsZS5taW5XaWR0aCA9ICh3aWR0aCArIDMgKyBzY3JvbGxlckN1dE9mZikgKyAicHgiOwogICAgICB2aWV3Lm1heExpbmVDaGFuZ2VkID0gZmFsc2U7CiAgICB9CiAgICB2YXIgbmV3U2Nyb2xsUG9zLCB1cGRhdGVkOwogICAgaWYgKG9wLnNlbGVjdGlvbkNoYW5nZWQpIHsKICAgICAgdmFyIGNvb3JkcyA9IGN1cnNvckNvb3JkcyhjbSwgdmlldy5zZWwuaGVhZCk7CiAgICAgIG5ld1Njcm9sbFBvcyA9IGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgY29vcmRzLmxlZnQsIGNvb3Jkcy50b3AsIGNvb3Jkcy5sZWZ0LCBjb29yZHMuYm90dG9tKTsKICAgIH0KICAgIGlmIChvcC5jaGFuZ2VzLmxlbmd0aCB8fCBuZXdTY3JvbGxQb3MgJiYgbmV3U2Nyb2xsUG9zLnNjcm9sbFRvcCAhPSBudWxsKQogICAgICB1cGRhdGVkID0gdXBkYXRlRGlzcGxheShjbSwgb3AuY2hhbmdlcywgbmV3U2Nyb2xsUG9zICYmIG5ld1Njcm9sbFBvcy5zY3JvbGxUb3ApOwogICAgaWYgKCF1cGRhdGVkICYmIG9wLnNlbGVjdGlvbkNoYW5nZWQpIHVwZGF0ZVNlbGVjdGlvbihjbSk7CiAgICBpZiAobmV3U2Nyb2xsUG9zKSBzY3JvbGxDdXJzb3JJbnRvVmlldyhjbSk7CiAgICBpZiAob3Auc2VsZWN0aW9uQ2hhbmdlZCkgcmVzdGFydEJsaW5rKGNtKTsKCiAgICBpZiAodmlldy5mb2N1c2VkICYmIG9wLnVwZGF0ZUlucHV0KQogICAgICByZXNldElucHV0KGNtLCBvcC51c2VyU2VsQ2hhbmdlKTsKCiAgICBpZiAob3AudGV4dENoYW5nZWQpCiAgICAgIHNpZ25hbChjbSwgImNoYW5nZSIsIGNtLCBvcC50ZXh0Q2hhbmdlZCk7CiAgICBpZiAob3Auc2VsZWN0aW9uQ2hhbmdlZCkgc2lnbmFsKGNtLCAiY3Vyc29yQWN0aXZpdHkiLCBjbSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wLmRlbGF5ZWRDYWxsYmFja3MubGVuZ3RoOyArK2kpIG9wLmRlbGF5ZWRDYWxsYmFja3NbaV0oY20pOwogIH0KCiAgLy8gV3JhcHMgYSBmdW5jdGlvbiBpbiBhbiBvcGVyYXRpb24uIFJldHVybnMgdGhlIHdyYXBwZWQgZnVuY3Rpb24uCiAgZnVuY3Rpb24gb3BlcmF0aW9uKGNtMSwgZikgewogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICB2YXIgY20gPSBjbTEgfHwgdGhpczsKICAgICAgc3RhcnRPcGVyYXRpb24oY20pOwogICAgICB0cnkge3ZhciByZXN1bHQgPSBmLmFwcGx5KGNtLCBhcmd1bWVudHMpO30KICAgICAgZmluYWxseSB7ZW5kT3BlcmF0aW9uKGNtKTt9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gcmVnQ2hhbmdlKGNtLCBmcm9tLCB0bywgbGVuZGlmZikgewogICAgY20uY3VyT3AuY2hhbmdlcy5wdXNoKHtmcm9tOiBmcm9tLCB0bzogdG8sIGRpZmY6IGxlbmRpZmZ9KTsKICB9CgogIC8vIElOUFVUIEhBTkRMSU5HCgogIGZ1bmN0aW9uIHNsb3dQb2xsKGNtKSB7CiAgICBpZiAoY20udmlldy5wb2xsaW5nRmFzdCkgcmV0dXJuOwogICAgY20uZGlzcGxheS5wb2xsLnNldChjbS5vcHRpb25zLnBvbGxJbnRlcnZhbCwgZnVuY3Rpb24oKSB7CiAgICAgIHJlYWRJbnB1dChjbSk7CiAgICAgIGlmIChjbS52aWV3LmZvY3VzZWQpIHNsb3dQb2xsKGNtKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmFzdFBvbGwoY20pIHsKICAgIHZhciBtaXNzZWQgPSBmYWxzZTsKICAgIGNtLmRpc3BsYXkucG9sbGluZ0Zhc3QgPSB0cnVlOwogICAgZnVuY3Rpb24gcCgpIHsKICAgICAgdmFyIGNoYW5nZWQgPSByZWFkSW5wdXQoY20pOwogICAgICBpZiAoIWNoYW5nZWQgJiYgIW1pc3NlZCkge21pc3NlZCA9IHRydWU7IGNtLmRpc3BsYXkucG9sbC5zZXQoNjAsIHApO30KICAgICAgZWxzZSB7Y20uZGlzcGxheS5wb2xsaW5nRmFzdCA9IGZhbHNlOyBzbG93UG9sbChjbSk7fQogICAgfQogICAgY20uZGlzcGxheS5wb2xsLnNldCgyMCwgcCk7CiAgfQoKICAvLyBwcmV2SW5wdXQgaXMgYSBoYWNrIHRvIHdvcmsgd2l0aCBJTUUuIElmIHdlIHJlc2V0IHRoZSB0ZXh0YXJlYQogIC8vIG9uIGV2ZXJ5IGNoYW5nZSwgdGhhdCBicmVha3MgSU1FLiBTbyB3ZSBsb29rIGZvciBjaGFuZ2VzCiAgLy8gY29tcGFyZWQgdG8gdGhlIHByZXZpb3VzIGNvbnRlbnQgaW5zdGVhZC4gKE1vZGVybiBicm93c2VycyBoYXZlCiAgLy8gZXZlbnRzIHRoYXQgaW5kaWNhdGUgSU1FIHRha2luZyBwbGFjZSwgYnV0IHRoZXNlIGFyZSBub3Qgd2lkZWx5CiAgLy8gc3VwcG9ydGVkIG9yIGNvbXBhdGlibGUgZW5vdWdoIHlldCB0byByZWx5IG9uLikKICBmdW5jdGlvbiByZWFkSW5wdXQoY20pIHsKICAgIHZhciBpbnB1dCA9IGNtLmRpc3BsYXkuaW5wdXQsIHByZXZJbnB1dCA9IGNtLmRpc3BsYXkucHJldklucHV0LCB2aWV3ID0gY20udmlldywgc2VsID0gdmlldy5zZWw7CiAgICBpZiAoIXZpZXcuZm9jdXNlZCB8fCBoYXNTZWxlY3Rpb24oaW5wdXQpIHx8IGlzUmVhZE9ubHkoY20pKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgdGV4dCA9IGlucHV0LnZhbHVlOwogICAgaWYgKHRleHQgPT0gcHJldklucHV0ICYmIHBvc0VxKHNlbC5mcm9tLCBzZWwudG8pKSByZXR1cm4gZmFsc2U7CiAgICBzdGFydE9wZXJhdGlvbihjbSk7CiAgICB2aWV3LnNlbC5zaGlmdCA9IGZhbHNlOwogICAgdmFyIHNhbWUgPSAwLCBsID0gTWF0aC5taW4ocHJldklucHV0Lmxlbmd0aCwgdGV4dC5sZW5ndGgpOwogICAgd2hpbGUgKHNhbWUgPCBsICYmIHByZXZJbnB1dFtzYW1lXSA9PSB0ZXh0W3NhbWVdKSArK3NhbWU7CiAgICB2YXIgZnJvbSA9IHNlbC5mcm9tLCB0byA9IHNlbC50bzsKICAgIGlmIChzYW1lIDwgcHJldklucHV0Lmxlbmd0aCkKICAgICAgZnJvbSA9IHtsaW5lOiBmcm9tLmxpbmUsIGNoOiBmcm9tLmNoIC0gKHByZXZJbnB1dC5sZW5ndGggLSBzYW1lKX07CiAgICBlbHNlIGlmICh2aWV3Lm92ZXJ3cml0ZSAmJiBwb3NFcShmcm9tLCB0bykgJiYgIWNtLmRpc3BsYXkucGFzdGVJbmNvbWluZykKICAgICAgdG8gPSB7bGluZTogdG8ubGluZSwgY2g6IE1hdGgubWluKGdldExpbmUoY20udmlldy5kb2MsIHRvLmxpbmUpLnRleHQubGVuZ3RoLCB0by5jaCArICh0ZXh0Lmxlbmd0aCAtIHNhbWUpKX07CiAgICB2YXIgdXBkYXRlSW5wdXQgPSBjbS5jdXJPcC51cGRhdGVJbnB1dDsKICAgIHVwZGF0ZURvYyhjbSwgZnJvbSwgdG8sIHNwbGl0TGluZXModGV4dC5zbGljZShzYW1lKSksICJlbmQiLAogICAgICAgICAgICAgIGNtLmRpc3BsYXkucGFzdGVJbmNvbWluZyA/ICJwYXN0ZSIgOiAiaW5wdXQiLCB7ZnJvbTogZnJvbSwgdG86IHRvfSk7CiAgICBjbS5jdXJPcC51cGRhdGVJbnB1dCA9IHVwZGF0ZUlucHV0OwogICAgaWYgKHRleHQubGVuZ3RoID4gMTAwMCkgaW5wdXQudmFsdWUgPSBjbS5kaXNwbGF5LnByZXZJbnB1dCA9ICIiOwogICAgZWxzZSBjbS5kaXNwbGF5LnByZXZJbnB1dCA9IHRleHQ7CiAgICBlbmRPcGVyYXRpb24oY20pOwogICAgY20uZGlzcGxheS5wYXN0ZUluY29taW5nID0gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0SW5wdXQoY20sIHVzZXIpIHsKICAgIHZhciB2aWV3ID0gY20udmlldywgbWluaW1hbCwgc2VsZWN0ZWQ7CiAgICBpZiAoIXBvc0VxKHZpZXcuc2VsLmZyb20sIHZpZXcuc2VsLnRvKSkgewogICAgICBjbS5kaXNwbGF5LnByZXZJbnB1dCA9ICIiOwogICAgICBtaW5pbWFsID0gaGFzQ29weUV2ZW50ICYmCiAgICAgICAgKHZpZXcuc2VsLnRvLmxpbmUgLSB2aWV3LnNlbC5mcm9tLmxpbmUgPiAxMDAgfHwgKHNlbGVjdGVkID0gY20uZ2V0U2VsZWN0aW9uKCkpLmxlbmd0aCA+IDEwMDApOwogICAgICBpZiAobWluaW1hbCkgY20uZGlzcGxheS5pbnB1dC52YWx1ZSA9ICItIjsKICAgICAgZWxzZSBjbS5kaXNwbGF5LmlucHV0LnZhbHVlID0gc2VsZWN0ZWQgfHwgY20uZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmICh2aWV3LmZvY3VzZWQpIHNlbGVjdElucHV0KGNtLmRpc3BsYXkuaW5wdXQpOwogICAgfSBlbHNlIGlmICh1c2VyKSBjbS5kaXNwbGF5LnByZXZJbnB1dCA9IGNtLmRpc3BsYXkuaW5wdXQudmFsdWUgPSAiIjsKICAgIGNtLmRpc3BsYXkuaW5hY2N1cmF0ZVNlbGVjdGlvbiA9IG1pbmltYWw7CiAgfQoKICBmdW5jdGlvbiBmb2N1c0lucHV0KGNtKSB7CiAgICBpZiAoY20ub3B0aW9ucy5yZWFkT25seSAhPSAibm9jdXJzb3IiICYmIChpZSB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IGNtLmRpc3BsYXkuaW5wdXQpKQogICAgICBjbS5kaXNwbGF5LmlucHV0LmZvY3VzKCk7CiAgfQoKICBmdW5jdGlvbiBpc1JlYWRPbmx5KGNtKSB7CiAgICByZXR1cm4gY20ub3B0aW9ucy5yZWFkT25seSB8fCBjbS52aWV3LmNhbnRFZGl0OwogIH0KCiAgLy8gRVZFTlQgSEFORExFUlMKCiAgZnVuY3Rpb24gcmVnaXN0ZXJFdmVudEhhbmRsZXJzKGNtKSB7CiAgICB2YXIgZCA9IGNtLmRpc3BsYXk7CiAgICBvbihkLnNjcm9sbGVyLCAibW91c2Vkb3duIiwgb3BlcmF0aW9uKGNtLCBvbk1vdXNlRG93bikpOwogICAgb24oZC5zY3JvbGxlciwgImRibGNsaWNrIiwgb3BlcmF0aW9uKGNtLCBlX3ByZXZlbnREZWZhdWx0KSk7CiAgICBvbihkLmxpbmVTcGFjZSwgInNlbGVjdHN0YXJ0IiwgZnVuY3Rpb24oZSkgewogICAgICBpZiAoIW1vdXNlRXZlbnRJbldpZGdldChkLCBlKSkgZV9wcmV2ZW50RGVmYXVsdChlKTsKICAgIH0pOwogICAgLy8gR2Vja28gYnJvd3NlcnMgZmlyZSBjb250ZXh0bWVudSAqYWZ0ZXIqIG9wZW5pbmcgdGhlIG1lbnUsIGF0CiAgICAvLyB3aGljaCBwb2ludCB3ZSBjYW4ndCBtZXNzIHdpdGggaXQgYW55bW9yZS4gQ29udGV4dCBtZW51IGlzCiAgICAvLyBoYW5kbGVkIGluIG9uTW91c2VEb3duIGZvciBHZWNrby4KICAgIGlmICghZ2Vja28pIG9uKGQuc2Nyb2xsZXIsICJjb250ZXh0bWVudSIsIGZ1bmN0aW9uKGUpIHtvbkNvbnRleHRNZW51KGNtLCBlKTt9KTsKCiAgICBvbihkLnNjcm9sbGVyLCAic2Nyb2xsIiwgZnVuY3Rpb24oKSB7CiAgICAgIHNldFNjcm9sbFRvcChjbSwgZC5zY3JvbGxlci5zY3JvbGxUb3ApOwogICAgICBzZXRTY3JvbGxMZWZ0KGNtLCBkLnNjcm9sbGVyLnNjcm9sbExlZnQsIHRydWUpOwogICAgICBzaWduYWwoY20sICJzY3JvbGwiLCBjbSk7CiAgICB9KTsKICAgIG9uKGQuc2Nyb2xsYmFyViwgInNjcm9sbCIsIGZ1bmN0aW9uKCkgewogICAgICBzZXRTY3JvbGxUb3AoY20sIGQuc2Nyb2xsYmFyVi5zY3JvbGxUb3ApOwogICAgfSk7CiAgICBvbihkLnNjcm9sbGJhckgsICJzY3JvbGwiLCBmdW5jdGlvbigpIHsKICAgICAgc2V0U2Nyb2xsTGVmdChjbSwgZC5zY3JvbGxiYXJILnNjcm9sbExlZnQpOwogICAgfSk7CgogICAgb24oZC5zY3JvbGxlciwgIm1vdXNld2hlZWwiLCBmdW5jdGlvbihlKXtvblNjcm9sbFdoZWVsKGNtLCBlKTt9KTsKICAgIG9uKGQuc2Nyb2xsZXIsICJET01Nb3VzZVNjcm9sbCIsIGZ1bmN0aW9uKGUpe29uU2Nyb2xsV2hlZWwoY20sIGUpO30pOwoKICAgIGZ1bmN0aW9uIHJlRm9jdXMoKSB7IGlmIChjbS52aWV3LmZvY3VzZWQpIHNldFRpbWVvdXQoYmluZChmb2N1c0lucHV0LCBjbSksIDApOyB9CiAgICBvbihkLnNjcm9sbGJhckgsICJtb3VzZWRvd24iLCByZUZvY3VzKTsKICAgIG9uKGQuc2Nyb2xsYmFyViwgIm1vdXNlZG93biIsIHJlRm9jdXMpOwogICAgLy8gUHJldmVudCB3cmFwcGVyIGZyb20gZXZlciBzY3JvbGxpbmcKICAgIG9uKGQud3JhcHBlciwgInNjcm9sbCIsIGZ1bmN0aW9uKCkgeyBkLndyYXBwZXIuc2Nyb2xsVG9wID0gZC53cmFwcGVyLnNjcm9sbExlZnQgPSAwOyB9KTsKICAgIG9uKHdpbmRvdywgInJlc2l6ZSIsIGZ1bmN0aW9uIHJlc2l6ZUhhbmRsZXIoKSB7CiAgICAgIC8vIE1pZ2h0IGJlIGEgdGV4dCBzY2FsaW5nIG9wZXJhdGlvbiwgY2xlYXIgc2l6ZSBjYWNoZXMuCiAgICAgIGQuY2FjaGVkQ2hhcldpZHRoID0gZC5jYWNoZWRUZXh0SGVpZ2h0ID0gbnVsbDsKICAgICAgY2xlYXJDYWNoZXMoY20pOwogICAgICBpZiAoZC53cmFwcGVyLnBhcmVudE5vZGUpIHVwZGF0ZURpc3BsYXkoY20sIHRydWUpOwogICAgICBlbHNlIG9mZih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKICAgIH0pOwoKICAgIG9uKGQuaW5wdXQsICJrZXl1cCIsIG9wZXJhdGlvbihjbSwgZnVuY3Rpb24oZSkgewogICAgICBpZiAoY20ub3B0aW9ucy5vbktleUV2ZW50ICYmIGNtLm9wdGlvbnMub25LZXlFdmVudChjbSwgYWRkU3RvcChlKSkpIHJldHVybjsKICAgICAgaWYgKGVfcHJvcChlLCAia2V5Q29kZSIpID09IDE2KSBjbS52aWV3LnNlbC5zaGlmdCA9IGZhbHNlOwogICAgfSkpOwogICAgb24oZC5pbnB1dCwgImlucHV0IiwgYmluZChmYXN0UG9sbCwgY20pKTsKICAgIG9uKGQuaW5wdXQsICJrZXlkb3duIiwgb3BlcmF0aW9uKGNtLCBvbktleURvd24pKTsKICAgIG9uKGQuaW5wdXQsICJrZXlwcmVzcyIsIG9wZXJhdGlvbihjbSwgb25LZXlQcmVzcykpOwogICAgb24oZC5pbnB1dCwgImZvY3VzIiwgYmluZChvbkZvY3VzLCBjbSkpOwogICAgb24oZC5pbnB1dCwgImJsdXIiLCBiaW5kKG9uQmx1ciwgY20pKTsKCiAgICBmdW5jdGlvbiBkcmFnXyhlKSB7CiAgICAgIGlmIChjbS5vcHRpb25zLm9uRHJhZ0V2ZW50ICYmIGNtLm9wdGlvbnMub25EcmFnRXZlbnQoY20sIGFkZFN0b3AoZSkpKSByZXR1cm47CiAgICAgIGVfc3RvcChlKTsKICAgIH0KICAgIGlmIChjbS5vcHRpb25zLmRyYWdEcm9wKSB7CiAgICAgIG9uKGQuc2Nyb2xsZXIsICJkcmFnc3RhcnQiLCBmdW5jdGlvbihlKXtvbkRyYWdTdGFydChjbSwgZSk7fSk7CiAgICAgIG9uKGQuc2Nyb2xsZXIsICJkcmFnZW50ZXIiLCBkcmFnXyk7CiAgICAgIG9uKGQuc2Nyb2xsZXIsICJkcmFnb3ZlciIsIGRyYWdfKTsKICAgICAgb24oZC5zY3JvbGxlciwgImRyb3AiLCBvcGVyYXRpb24oY20sIG9uRHJvcCkpOwogICAgfQogICAgb24oZC5zY3JvbGxlciwgInBhc3RlIiwgZnVuY3Rpb24oKXtmb2N1c0lucHV0KGNtKTsgZmFzdFBvbGwoY20pO30pOwogICAgb24oZC5pbnB1dCwgInBhc3RlIiwgZnVuY3Rpb24oKSB7CiAgICAgIGQucGFzdGVJbmNvbWluZyA9IHRydWU7CiAgICAgIGZhc3RQb2xsKGNtKTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIHByZXBhcmVDb3B5KCkgewogICAgICBpZiAoZC5pbmFjY3VyYXRlU2VsZWN0aW9uKSB7CiAgICAgICAgZC5wcmV2SW5wdXQgPSAiIjsKICAgICAgICBkLmluYWNjdXJhdGVTZWxlY3Rpb24gPSBmYWxzZTsKICAgICAgICBkLmlucHV0LnZhbHVlID0gY20uZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgc2VsZWN0SW5wdXQoZC5pbnB1dCk7CiAgICAgIH0KICAgIH0KICAgIG9uKGQuaW5wdXQsICJjdXQiLCBwcmVwYXJlQ29weSk7CiAgICBvbihkLmlucHV0LCAiY29weSIsIHByZXBhcmVDb3B5KTsKCiAgICAvLyBOZWVkZWQgdG8gaGFuZGxlIFRhYiBrZXkgaW4gS0hUTUwKICAgIGlmIChraHRtbCkgb24oZC5zaXplciwgIm1vdXNldXAiLCBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PSBkLmlucHV0KSBkLmlucHV0LmJsdXIoKTsKICAgICAgICBmb2N1c0lucHV0KGNtKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gbW91c2VFdmVudEluV2lkZ2V0KGRpc3BsYXksIGUpIHsKICAgIGZvciAodmFyIG4gPSBlX3RhcmdldChlKTsgbiAhPSBkaXNwbGF5LndyYXBwZXI7IG4gPSBuLnBhcmVudE5vZGUpCiAgICAgIGlmICgvXGJDb2RlTWlycm9yLSg/OmxpbmUpP3dpZGdldFxiLy50ZXN0KG4uY2xhc3NOYW1lKSB8fAogICAgICAgICAgbi5wYXJlbnROb2RlID09IGRpc3BsYXkuc2l6ZXIgJiYgbiAhPSBkaXNwbGF5Lm1vdmVyKSByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIHBvc0Zyb21Nb3VzZShjbSwgZSwgbGliZXJhbCkgewogICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5OwogICAgaWYgKCFsaWJlcmFsKSB7CiAgICAgIHZhciB0YXJnZXQgPSBlX3RhcmdldChlKTsKICAgICAgaWYgKHRhcmdldCA9PSBkaXNwbGF5LnNjcm9sbGJhckggfHwgdGFyZ2V0ID09IGRpc3BsYXkuc2Nyb2xsYmFySC5maXJzdENoaWxkIHx8CiAgICAgICAgICB0YXJnZXQgPT0gZGlzcGxheS5zY3JvbGxiYXJWIHx8IHRhcmdldCA9PSBkaXNwbGF5LnNjcm9sbGJhclYuZmlyc3RDaGlsZCB8fAogICAgICAgICAgdGFyZ2V0ID09IGRpc3BsYXkuc2Nyb2xsYmFyRmlsbGVyKSByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciB4LCB5LCBzcGFjZSA9IGRpc3BsYXkubGluZVNwYWNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgLy8gRmFpbHMgdW5wcmVkaWN0YWJseSBvbiBJRVs2N10gd2hlbiBtb3VzZSBpcyBkcmFnZ2VkIGFyb3VuZCBxdWlja2x5LgogICAgdHJ5IHsgeCA9IGUuY2xpZW50WDsgeSA9IGUuY2xpZW50WTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogICAgcmV0dXJuIGNvb3Jkc0NoYXIoY20sIHggLSBzcGFjZS5sZWZ0LCB5IC0gc3BhY2UudG9wKTsKICB9CgogIHZhciBsYXN0Q2xpY2ssIGxhc3REb3VibGVDbGljazsKICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7CiAgICB2YXIgY20gPSB0aGlzLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgdmlldyA9IGNtLnZpZXcsIHNlbCA9IHZpZXcuc2VsLCBkb2MgPSB2aWV3LmRvYzsKICAgIHNlbC5zaGlmdCA9IGVfcHJvcChlLCAic2hpZnRLZXkiKTsKCiAgICBpZiAobW91c2VFdmVudEluV2lkZ2V0KGRpc3BsYXksIGUpKSB7CiAgICAgIGlmICghd2Via2l0KSB7CiAgICAgICAgZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSBmYWxzZTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSB0cnVlO30sIDEwMCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGNsaWNrSW5HdXR0ZXIoY20sIGUpKSByZXR1cm47CiAgICB2YXIgc3RhcnQgPSBwb3NGcm9tTW91c2UoY20sIGUpOwoKICAgIHN3aXRjaCAoZV9idXR0b24oZSkpIHsKICAgIGNhc2UgMzoKICAgICAgaWYgKGdlY2tvKSBvbkNvbnRleHRNZW51LmNhbGwoY20sIGNtLCBlKTsKICAgICAgcmV0dXJuOwogICAgY2FzZSAyOgogICAgICBpZiAoc3RhcnQpIGV4dGVuZFNlbGVjdGlvbihjbSwgc3RhcnQpOwogICAgICBzZXRUaW1lb3V0KGJpbmQoZm9jdXNJbnB1dCwgY20pLCAyMCk7CiAgICAgIGVfcHJldmVudERlZmF1bHQoZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIEZvciBidXR0b24gMSwgaWYgaXQgd2FzIGNsaWNrZWQgaW5zaWRlIHRoZSBlZGl0b3IKICAgIC8vIChwb3NGcm9tTW91c2UgcmV0dXJuaW5nIG5vbi1udWxsKSwgd2UgaGF2ZSB0byBhZGp1c3QgdGhlCiAgICAvLyBzZWxlY3Rpb24uCiAgICBpZiAoIXN0YXJ0KSB7aWYgKGVfdGFyZ2V0KGUpID09IGRpc3BsYXkuc2Nyb2xsZXIpIGVfcHJldmVudERlZmF1bHQoZSk7IHJldHVybjt9CgogICAgaWYgKCF2aWV3LmZvY3VzZWQpIG9uRm9jdXMoY20pOwoKICAgIHZhciBub3cgPSArbmV3IERhdGUsIHR5cGUgPSAic2luZ2xlIjsKICAgIGlmIChsYXN0RG91YmxlQ2xpY2sgJiYgbGFzdERvdWJsZUNsaWNrLnRpbWUgPiBub3cgLSA0MDAgJiYgcG9zRXEobGFzdERvdWJsZUNsaWNrLnBvcywgc3RhcnQpKSB7CiAgICAgIHR5cGUgPSAidHJpcGxlIjsKICAgICAgZV9wcmV2ZW50RGVmYXVsdChlKTsKICAgICAgc2V0VGltZW91dChiaW5kKGZvY3VzSW5wdXQsIGNtKSwgMjApOwogICAgICBzZWxlY3RMaW5lKGNtLCBzdGFydC5saW5lKTsKICAgIH0gZWxzZSBpZiAobGFzdENsaWNrICYmIGxhc3RDbGljay50aW1lID4gbm93IC0gNDAwICYmIHBvc0VxKGxhc3RDbGljay5wb3MsIHN0YXJ0KSkgewogICAgICB0eXBlID0gImRvdWJsZSI7CiAgICAgIGxhc3REb3VibGVDbGljayA9IHt0aW1lOiBub3csIHBvczogc3RhcnR9OwogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICB2YXIgd29yZCA9IGZpbmRXb3JkQXQoZ2V0TGluZShkb2MsIHN0YXJ0LmxpbmUpLnRleHQsIHN0YXJ0KTsKICAgICAgZXh0ZW5kU2VsZWN0aW9uKGNtLCB3b3JkLmZyb20sIHdvcmQudG8pOwogICAgfSBlbHNlIHsgbGFzdENsaWNrID0ge3RpbWU6IG5vdywgcG9zOiBzdGFydH07IH0KCiAgICB2YXIgbGFzdCA9IHN0YXJ0OwogICAgaWYgKGNtLm9wdGlvbnMuZHJhZ0Ryb3AgJiYgZHJhZ0FuZERyb3AgJiYgIWlzUmVhZE9ubHkoY20pICYmICFwb3NFcShzZWwuZnJvbSwgc2VsLnRvKSAmJgogICAgICAgICFwb3NMZXNzKHN0YXJ0LCBzZWwuZnJvbSkgJiYgIXBvc0xlc3Moc2VsLnRvLCBzdGFydCkgJiYgdHlwZSA9PSAic2luZ2xlIikgewogICAgICB2YXIgZHJhZ0VuZCA9IG9wZXJhdGlvbihjbSwgZnVuY3Rpb24oZTIpIHsKICAgICAgICBpZiAod2Via2l0KSBkaXNwbGF5LnNjcm9sbGVyLmRyYWdnYWJsZSA9IGZhbHNlOwogICAgICAgIHZpZXcuZHJhZ2dpbmdUZXh0ID0gZmFsc2U7CiAgICAgICAgb2ZmKGRvY3VtZW50LCAibW91c2V1cCIsIGRyYWdFbmQpOwogICAgICAgIG9mZihkaXNwbGF5LnNjcm9sbGVyLCAiZHJvcCIsIGRyYWdFbmQpOwogICAgICAgIGlmIChNYXRoLmFicyhlLmNsaWVudFggLSBlMi5jbGllbnRYKSArIE1hdGguYWJzKGUuY2xpZW50WSAtIGUyLmNsaWVudFkpIDwgMTApIHsKICAgICAgICAgIGVfcHJldmVudERlZmF1bHQoZTIpOwogICAgICAgICAgZXh0ZW5kU2VsZWN0aW9uKGNtLCBzdGFydCk7CiAgICAgICAgICBmb2N1c0lucHV0KGNtKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICAvLyBMZXQgdGhlIGRyYWcgaGFuZGxlciBoYW5kbGUgdGhpcy4KICAgICAgaWYgKHdlYmtpdCkgZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSB0cnVlOwogICAgICB2aWV3LmRyYWdnaW5nVGV4dCA9IGRyYWdFbmQ7CiAgICAgIC8vIElFJ3MgYXBwcm9hY2ggdG8gZHJhZ2dhYmxlCiAgICAgIGlmIChkaXNwbGF5LnNjcm9sbGVyLmRyYWdEcm9wKSBkaXNwbGF5LnNjcm9sbGVyLmRyYWdEcm9wKCk7CiAgICAgIG9uKGRvY3VtZW50LCAibW91c2V1cCIsIGRyYWdFbmQpOwogICAgICBvbihkaXNwbGF5LnNjcm9sbGVyLCAiZHJvcCIsIGRyYWdFbmQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBlX3ByZXZlbnREZWZhdWx0KGUpOwogICAgaWYgKHR5cGUgPT0gInNpbmdsZSIpIGV4dGVuZFNlbGVjdGlvbihjbSwgY2xpcFBvcyhkb2MsIHN0YXJ0KSk7CgogICAgdmFyIHN0YXJ0c3RhcnQgPSBzZWwuZnJvbSwgc3RhcnRlbmQgPSBzZWwudG87CgogICAgZnVuY3Rpb24gZG9TZWxlY3QoY3VyKSB7CiAgICAgIGlmICh0eXBlID09ICJzaW5nbGUiKSB7CiAgICAgICAgZXh0ZW5kU2VsZWN0aW9uKGNtLCBjbGlwUG9zKGRvYywgc3RhcnQpLCBjdXIpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgc3RhcnRzdGFydCA9IGNsaXBQb3MoZG9jLCBzdGFydHN0YXJ0KTsKICAgICAgc3RhcnRlbmQgPSBjbGlwUG9zKGRvYywgc3RhcnRlbmQpOwogICAgICBpZiAodHlwZSA9PSAiZG91YmxlIikgewogICAgICAgIHZhciB3b3JkID0gZmluZFdvcmRBdChnZXRMaW5lKGRvYywgY3VyLmxpbmUpLnRleHQsIGN1cik7CiAgICAgICAgaWYgKHBvc0xlc3MoY3VyLCBzdGFydHN0YXJ0KSkgZXh0ZW5kU2VsZWN0aW9uKGNtLCB3b3JkLmZyb20sIHN0YXJ0ZW5kKTsKICAgICAgICBlbHNlIGV4dGVuZFNlbGVjdGlvbihjbSwgc3RhcnRzdGFydCwgd29yZC50byk7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAidHJpcGxlIikgewogICAgICAgIGlmIChwb3NMZXNzKGN1ciwgc3RhcnRzdGFydCkpIGV4dGVuZFNlbGVjdGlvbihjbSwgc3RhcnRlbmQsIGNsaXBQb3MoZG9jLCB7bGluZTogY3VyLmxpbmUsIGNoOiAwfSkpOwogICAgICAgIGVsc2UgZXh0ZW5kU2VsZWN0aW9uKGNtLCBzdGFydHN0YXJ0LCBjbGlwUG9zKGRvYywge2xpbmU6IGN1ci5saW5lICsgMSwgY2g6IDB9KSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgZWRpdG9yU2l6ZSA9IGRpc3BsYXkud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIC8vIFVzZWQgdG8gZW5zdXJlIHRpbWVvdXQgcmUtdHJpZXMgZG9uJ3QgZmlyZSB3aGVuIGFub3RoZXIgZXh0ZW5kCiAgICAvLyBoYXBwZW5lZCBpbiB0aGUgbWVhbnRpbWUgKGNsZWFyVGltZW91dCBpc24ndCByZWxpYWJsZSAtLSBhdAogICAgLy8gbGVhc3Qgb24gQ2hyb21lLCB0aGUgdGltZW91dHMgc3RpbGwgaGFwcGVuIGV2ZW4gd2hlbiBjbGVhcmVkLAogICAgLy8gaWYgdGhlIGNsZWFyIGhhcHBlbnMgYWZ0ZXIgdGhlaXIgc2NoZWR1bGVkIGZpcmluZyB0aW1lKS4KICAgIHZhciBjb3VudGVyID0gMDsKCiAgICBmdW5jdGlvbiBleHRlbmQoZSkgewogICAgICB2YXIgY3VyQ291bnQgPSArK2NvdW50ZXI7CiAgICAgIHZhciBjdXIgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUpOwogICAgICBpZiAoIWN1cikgcmV0dXJuOwogICAgICBpZiAoIXBvc0VxKGN1ciwgbGFzdCkpIHsKICAgICAgICBpZiAoIXZpZXcuZm9jdXNlZCkgb25Gb2N1cyhjbSk7CiAgICAgICAgbGFzdCA9IGN1cjsKICAgICAgICBkb1NlbGVjdChjdXIpOwogICAgICAgIHZhciB2aXNpYmxlID0gdmlzaWJsZUxpbmVzKGRpc3BsYXksIGRvYyk7CiAgICAgICAgaWYgKGN1ci5saW5lID49IHZpc2libGUudG8gfHwgY3VyLmxpbmUgPCB2aXNpYmxlLmZyb20pCiAgICAgICAgICBzZXRUaW1lb3V0KG9wZXJhdGlvbihjbSwgZnVuY3Rpb24oKXtpZiAoY291bnRlciA9PSBjdXJDb3VudCkgZXh0ZW5kKGUpO30pLCAxNTApOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBvdXRzaWRlID0gZS5jbGllbnRZIDwgZWRpdG9yU2l6ZS50b3AgPyAtMjAgOiBlLmNsaWVudFkgPiBlZGl0b3JTaXplLmJvdHRvbSA/IDIwIDogMDsKICAgICAgICBpZiAob3V0c2lkZSkgc2V0VGltZW91dChvcGVyYXRpb24oY20sIGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKGNvdW50ZXIgIT0gY3VyQ291bnQpIHJldHVybjsKICAgICAgICAgIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wICs9IG91dHNpZGU7CiAgICAgICAgICBleHRlbmQoZSk7CiAgICAgICAgfSksIDUwKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRvbmUoZSkgewogICAgICBjb3VudGVyID0gSW5maW5pdHk7CiAgICAgIHZhciBjdXIgPSBwb3NGcm9tTW91c2UoY20sIGUpOwogICAgICBpZiAoY3VyKSBkb1NlbGVjdChjdXIpOwogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICBmb2N1c0lucHV0KGNtKTsKICAgICAgb2ZmKGRvY3VtZW50LCAibW91c2Vtb3ZlIiwgbW92ZSk7CiAgICAgIG9mZihkb2N1bWVudCwgIm1vdXNldXAiLCB1cCk7CiAgICB9CgogICAgdmFyIG1vdmUgPSBvcGVyYXRpb24oY20sIGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFpZSAmJiAhZV9idXR0b24oZSkpIGRvbmUoZSk7CiAgICAgIGVsc2UgZXh0ZW5kKGUpOwogICAgfSk7CiAgICB2YXIgdXAgPSBvcGVyYXRpb24oY20sIGRvbmUpOwogICAgb24oZG9jdW1lbnQsICJtb3VzZW1vdmUiLCBtb3ZlKTsKICAgIG9uKGRvY3VtZW50LCAibW91c2V1cCIsIHVwKTsKICB9CgogIGZ1bmN0aW9uIG9uRHJvcChlKSB7CiAgICB2YXIgY20gPSB0aGlzOwogICAgaWYgKGNtLm9wdGlvbnMub25EcmFnRXZlbnQgJiYgY20ub3B0aW9ucy5vbkRyYWdFdmVudChjbSwgYWRkU3RvcChlKSkpIHJldHVybjsKICAgIGVfcHJldmVudERlZmF1bHQoZSk7CiAgICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlLCB0cnVlKSwgZmlsZXMgPSBlLmRhdGFUcmFuc2Zlci5maWxlczsKICAgIGlmICghcG9zIHx8IGlzUmVhZE9ubHkoY20pKSByZXR1cm47CiAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlKSB7CiAgICAgIHZhciBuID0gZmlsZXMubGVuZ3RoLCB0ZXh0ID0gQXJyYXkobiksIHJlYWQgPSAwOwogICAgICB2YXIgbG9hZEZpbGUgPSBmdW5jdGlvbihmaWxlLCBpKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyOwogICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHRleHRbaV0gPSByZWFkZXIucmVzdWx0OwogICAgICAgICAgaWYgKCsrcmVhZCA9PSBuKSB7CiAgICAgICAgICAgIHBvcyA9IGNsaXBQb3MoY20udmlldy5kb2MsIHBvcyk7CiAgICAgICAgICAgIG9wZXJhdGlvbihjbSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgdmFyIGVuZCA9IHJlcGxhY2VSYW5nZShjbSwgdGV4dC5qb2luKCIiKSwgcG9zLCBwb3MsICJwYXN0ZSIpOwogICAgICAgICAgICAgIHNldFNlbGVjdGlvbihjbSwgcG9zLCBlbmQpOwogICAgICAgICAgICB9KSgpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7CiAgICAgIH07CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBsb2FkRmlsZShmaWxlc1tpXSwgaSk7CiAgICB9IGVsc2UgewogICAgICAvLyBEb24ndCBkbyBhIHJlcGxhY2UgaWYgdGhlIGRyb3AgaGFwcGVuZWQgaW5zaWRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgogICAgICBpZiAoY20udmlldy5kcmFnZ2luZ1RleHQgJiYgIShwb3NMZXNzKHBvcywgY20udmlldy5zZWwuZnJvbSkgfHwgcG9zTGVzcyhjbS52aWV3LnNlbC50bywgcG9zKSkpIHsKICAgICAgICBjbS52aWV3LmRyYWdnaW5nVGV4dChlKTsKICAgICAgICBpZiAoaWUpIHNldFRpbWVvdXQoYmluZChmb2N1c0lucHV0LCBjbSksIDUwKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICB2YXIgdGV4dCA9IGUuZGF0YVRyYW5zZmVyLmdldERhdGEoIlRleHQiKTsKICAgICAgICBpZiAodGV4dCkgewogICAgICAgICAgdmFyIGN1ckZyb20gPSBjbS52aWV3LnNlbC5mcm9tLCBjdXJUbyA9IGNtLnZpZXcuc2VsLnRvOwogICAgICAgICAgc2V0U2VsZWN0aW9uKGNtLCBwb3MsIHBvcyk7CiAgICAgICAgICBpZiAoY20udmlldy5kcmFnZ2luZ1RleHQpIHJlcGxhY2VSYW5nZShjbSwgIiIsIGN1ckZyb20sIGN1clRvLCAicGFzdGUiKTsKICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24odGV4dCwgbnVsbCwgInBhc3RlIik7CiAgICAgICAgICBmb2N1c0lucHV0KGNtKTsKICAgICAgICAgIG9uRm9jdXMoY20pOwogICAgICAgIH0KICAgICAgfQogICAgICBjYXRjaChlKXt9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbGlja0luR3V0dGVyKGNtLCBlKSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7CiAgICB0cnkgeyB2YXIgbVggPSBlLmNsaWVudFgsIG1ZID0gZS5jbGllbnRZOyB9CiAgICBjYXRjaChlKSB7IHJldHVybiBmYWxzZTsgfQoKICAgIGlmIChtWCA+PSBNYXRoLmZsb29yKGRpc3BsYXkuZ3V0dGVycy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkpIHJldHVybiBmYWxzZTsKICAgIGVfcHJldmVudERlZmF1bHQoZSk7CiAgICBpZiAoIWhhc0hhbmRsZXIoY20sICJndXR0ZXJDbGljayIpKSByZXR1cm4gdHJ1ZTsKCiAgICB2YXIgbGluZUJveCA9IGRpc3BsYXkubGluZURpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmIChtWSA+IGxpbmVCb3guYm90dG9tKSByZXR1cm4gdHJ1ZTsKICAgIG1ZIC09IGxpbmVCb3gudG9wIC0gZGlzcGxheS52aWV3T2Zmc2V0OwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY20ub3B0aW9ucy5ndXR0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBnID0gZGlzcGxheS5ndXR0ZXJzLmNoaWxkTm9kZXNbaV07CiAgICAgIGlmIChnICYmIGcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgPj0gbVgpIHsKICAgICAgICB2YXIgbGluZSA9IGxpbmVBdEhlaWdodChjbS52aWV3LmRvYywgbVkpOwogICAgICAgIHZhciBndXR0ZXIgPSBjbS5vcHRpb25zLmd1dHRlcnNbaV07CiAgICAgICAgc2lnbmFsTGF0ZXIoY20sIGNtLCAiZ3V0dGVyQ2xpY2siLCBjbSwgbGluZSwgZ3V0dGVyLCBlKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBvbkRyYWdTdGFydChjbSwgZSkgewogICAgdmFyIHR4dCA9IGNtLmdldFNlbGVjdGlvbigpOwogICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgiVGV4dCIsIHR4dCk7CgogICAgLy8gVXNlIGR1bW15IGltYWdlIGluc3RlYWQgb2YgZGVmYXVsdCBicm93c2VycyBpbWFnZS4KICAgIC8vIFJlY2VudCBTYWZhcmkgKH42LjAuMikgaGF2ZSBhIHRlbmRlbmN5IHRvIHNlZ2ZhdWx0IHdoZW4gdGhpcyBoYXBwZW5zLCBzbyB3ZSBkb24ndCBkbyBpdCB0aGVyZS4KICAgIGlmIChlLmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UgJiYgIXNhZmFyaSkKICAgICAgZS5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGVsdCgnaW1nJyksIDAsIDApOwogIH0KCiAgZnVuY3Rpb24gc2V0U2Nyb2xsVG9wKGNtLCB2YWwpIHsKICAgIGlmIChNYXRoLmFicyhjbS52aWV3LnNjcm9sbFRvcCAtIHZhbCkgPCAyKSByZXR1cm47CiAgICBjbS52aWV3LnNjcm9sbFRvcCA9IHZhbDsKICAgIGlmICghZ2Vja28pIHVwZGF0ZURpc3BsYXkoY20sIFtdLCB2YWwpOwogICAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wICE9IHZhbCkgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgPSB2YWw7CiAgICBpZiAoY20uZGlzcGxheS5zY3JvbGxiYXJWLnNjcm9sbFRvcCAhPSB2YWwpIGNtLmRpc3BsYXkuc2Nyb2xsYmFyVi5zY3JvbGxUb3AgPSB2YWw7CiAgICBpZiAoZ2Vja28pIHVwZGF0ZURpc3BsYXkoY20sIFtdKTsKICB9CiAgZnVuY3Rpb24gc2V0U2Nyb2xsTGVmdChjbSwgdmFsLCBpc1Njcm9sbGVyKSB7CiAgICBpZiAoaXNTY3JvbGxlciA/IHZhbCA9PSBjbS52aWV3LnNjcm9sbExlZnQgOiBNYXRoLmFicyhjbS52aWV3LnNjcm9sbExlZnQgLSB2YWwpIDwgMikgcmV0dXJuOwogICAgY20udmlldy5zY3JvbGxMZWZ0ID0gdmFsOwogICAgYWxpZ25Ib3Jpem9udGFsbHkoY20pOwogICAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCAhPSB2YWwpIGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IHZhbDsKICAgIGlmIChjbS5kaXNwbGF5LnNjcm9sbGJhckguc2Nyb2xsTGVmdCAhPSB2YWwpIGNtLmRpc3BsYXkuc2Nyb2xsYmFySC5zY3JvbGxMZWZ0ID0gdmFsOwogIH0KCiAgLy8gU2luY2UgdGhlIGRlbHRhIHZhbHVlcyByZXBvcnRlZCBvbiBtb3VzZSB3aGVlbCBldmVudHMgYXJlCiAgLy8gdW5zdGFuZGFyZGl6ZWQgYmV0d2VlbiBicm93c2VycyBhbmQgZXZlbiBicm93c2VyIHZlcnNpb25zLCBhbmQKICAvLyBnZW5lcmFsbHkgaG9ycmlibHkgdW5wcmVkaWN0YWJsZSwgdGhpcyBjb2RlIHN0YXJ0cyBieSBtZWFzdXJpbmcKICAvLyB0aGUgc2Nyb2xsIGVmZmVjdCB0aGF0IHRoZSBmaXJzdCBmZXcgbW91c2Ugd2hlZWwgZXZlbnRzIGhhdmUsCiAgLy8gYW5kLCBmcm9tIHRoYXQsIGRldGVjdHMgdGhlIHdheSBpdCBjYW4gY29udmVydCBkZWx0YXMgdG8gcGl4ZWwKICAvLyBvZmZzZXRzIGFmdGVyd2FyZHMuCiAgLy8KICAvLyBUaGUgcmVhc29uIHdlIHdhbnQgdG8ga25vdyB0aGUgYW1vdW50IGEgd2hlZWwgZXZlbnQgd2lsbCBzY3JvbGwKICAvLyBpcyB0aGF0IGl0IGdpdmVzIHVzIGEgY2hhbmNlIHRvIHVwZGF0ZSB0aGUgZGlzcGxheSBiZWZvcmUgdGhlCiAgLy8gYWN0dWFsIHNjcm9sbGluZyBoYXBwZW5zLCByZWR1Y2luZyBmbGlja2VyaW5nLgoKICB2YXIgd2hlZWxTYW1wbGVzID0gMCwgd2hlZWxEWCwgd2hlZWxEWSwgd2hlZWxTdGFydFgsIHdoZWVsU3RhcnRZLCB3aGVlbFBpeGVsc1BlclVuaXQgPSBudWxsOwogIC8vIEZpbGwgaW4gYSBicm93c2VyLWRldGVjdGVkIHN0YXJ0aW5nIHZhbHVlIG9uIGJyb3dzZXJzIHdoZXJlIHdlCiAgLy8ga25vdyBvbmUuIFRoZXNlIGRvbid0IGhhdmUgdG8gYmUgYWNjdXJhdGUgLS0gdGhlIHJlc3VsdCBvZiB0aGVtCiAgLy8gYmVpbmcgd3Jvbmcgd291bGQganVzdCBiZSBhIHNsaWdodCBmbGlja2VyIG9uIHRoZSBmaXJzdCB3aGVlbAogIC8vIHNjcm9sbCAoaWYgaXQgaXMgbGFyZ2UgZW5vdWdoKS4KICBpZiAoaWUpIHdoZWVsUGl4ZWxzUGVyVW5pdCA9IC0uNTM7CiAgZWxzZSBpZiAoZ2Vja28pIHdoZWVsUGl4ZWxzUGVyVW5pdCA9IDE1OwogIGVsc2UgaWYgKGNocm9tZSkgd2hlZWxQaXhlbHNQZXJVbml0ID0gLS43OwogIGVsc2UgaWYgKHNhZmFyaSkgd2hlZWxQaXhlbHNQZXJVbml0ID0gLTEvMzsKCiAgZnVuY3Rpb24gb25TY3JvbGxXaGVlbChjbSwgZSkgewogICAgdmFyIGR4ID0gZS53aGVlbERlbHRhWCwgZHkgPSBlLndoZWVsRGVsdGFZOwogICAgaWYgKGR4ID09IG51bGwgJiYgZS5kZXRhaWwgJiYgZS5heGlzID09IGUuSE9SSVpPTlRBTF9BWElTKSBkeCA9IGUuZGV0YWlsOwogICAgaWYgKGR5ID09IG51bGwgJiYgZS5kZXRhaWwgJiYgZS5heGlzID09IGUuVkVSVElDQUxfQVhJUykgZHkgPSBlLmRldGFpbDsKICAgIGVsc2UgaWYgKGR5ID09IG51bGwpIGR5ID0gZS53aGVlbERlbHRhOwoKICAgIC8vIFdlYmtpdCBicm93c2VycyBvbiBPUyBYIGFib3J0IG1vbWVudHVtIHNjcm9sbHMgd2hlbiB0aGUgdGFyZ2V0CiAgICAvLyBvZiB0aGUgc2Nyb2xsIGV2ZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50LgogICAgLy8gVGhpcyBoYWNrIChzZWUgcmVsYXRlZCBjb2RlIGluIHBhdGNoRGlzcGxheSkgbWFrZXMgc3VyZSB0aGUKICAgIC8vIGVsZW1lbnQgaXMga2VwdCBhcm91bmQuCiAgICBpZiAoZHkgJiYgbWFjICYmIHdlYmtpdCkgewogICAgICBmb3IgKHZhciBjdXIgPSBlLnRhcmdldDsgY3VyICE9IHNjcm9sbDsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHsKICAgICAgICBpZiAoY3VyLmxpbmVPYmopIHsKICAgICAgICAgIGNtLmRpc3BsYXkuY3VycmVudFdoZWVsVGFyZ2V0ID0gY3VyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdmFyIHNjcm9sbCA9IGNtLmRpc3BsYXkuc2Nyb2xsZXI7CiAgICAvLyBPbiBzb21lIGJyb3dzZXJzLCBob3Jpem9udGFsIHNjcm9sbGluZyB3aWxsIGNhdXNlIHJlZHJhd3MgdG8KICAgIC8vIGhhcHBlbiBiZWZvcmUgdGhlIGd1dHRlciBoYXMgYmVlbiByZWFsaWduZWQsIGNhdXNpbmcgaXQgdG8KICAgIC8vIHdyaWdnbGUgYXJvdW5kIGluIGEgbW9zdCB1bnNlZW1seSB3YXkuIFdoZW4gd2UgaGF2ZSBhbgogICAgLy8gZXN0aW1hdGVkIHBpeGVscy9kZWx0YSB2YWx1ZSwgd2UganVzdCBoYW5kbGUgaG9yaXpvbnRhbAogICAgLy8gc2Nyb2xsaW5nIGVudGlyZWx5IGhlcmUuIEl0J2xsIGJlIHNsaWdodGx5IG9mZiBmcm9tIG5hdGl2ZSwgYnV0CiAgICAvLyBiZXR0ZXIgdGhhbiBnbGl0Y2hpbmcgb3V0LgogICAgaWYgKGR4ICYmICFnZWNrbyAmJiAhb3BlcmEgJiYgd2hlZWxQaXhlbHNQZXJVbml0ICE9IG51bGwpIHsKICAgICAgaWYgKGR5KQogICAgICAgIHNldFNjcm9sbFRvcChjbSwgTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsLnNjcm9sbFRvcCArIGR5ICogd2hlZWxQaXhlbHNQZXJVbml0LCBzY3JvbGwuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsLmNsaWVudEhlaWdodCkpKTsKICAgICAgc2V0U2Nyb2xsTGVmdChjbSwgTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsLnNjcm9sbExlZnQgKyBkeCAqIHdoZWVsUGl4ZWxzUGVyVW5pdCwgc2Nyb2xsLnNjcm9sbFdpZHRoIC0gc2Nyb2xsLmNsaWVudFdpZHRoKSkpOwogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICB3aGVlbFN0YXJ0WCA9IG51bGw7IC8vIEFib3J0IG1lYXN1cmVtZW50LCBpZiBpbiBwcm9ncmVzcwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGR5ICYmIHdoZWVsUGl4ZWxzUGVyVW5pdCAhPSBudWxsKSB7CiAgICAgIHZhciBwaXhlbHMgPSBkeSAqIHdoZWVsUGl4ZWxzUGVyVW5pdDsKICAgICAgdmFyIHRvcCA9IGNtLnZpZXcuc2Nyb2xsVG9wLCBib3QgPSB0b3AgKyBjbS5kaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0OwogICAgICBpZiAocGl4ZWxzIDwgMCkgdG9wID0gTWF0aC5tYXgoMCwgdG9wICsgcGl4ZWxzIC0gNTApOwogICAgICBlbHNlIGJvdCA9IE1hdGgubWluKGNtLnZpZXcuZG9jLmhlaWdodCwgYm90ICsgcGl4ZWxzICsgNTApOwogICAgICB1cGRhdGVEaXNwbGF5KGNtLCBbXSwge3RvcDogdG9wLCBib3R0b206IGJvdH0pOwogICAgfQoKICAgIGlmICh3aGVlbFNhbXBsZXMgPCAyMCkgewogICAgICBpZiAod2hlZWxTdGFydFggPT0gbnVsbCkgewogICAgICAgIHdoZWVsU3RhcnRYID0gc2Nyb2xsLnNjcm9sbExlZnQ7IHdoZWVsU3RhcnRZID0gc2Nyb2xsLnNjcm9sbFRvcDsKICAgICAgICB3aGVlbERYID0gZHg7IHdoZWVsRFkgPSBkeTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKHdoZWVsU3RhcnRYID09IG51bGwpIHJldHVybjsKICAgICAgICAgIHZhciBtb3ZlZFggPSBzY3JvbGwuc2Nyb2xsTGVmdCAtIHdoZWVsU3RhcnRYOwogICAgICAgICAgdmFyIG1vdmVkWSA9IHNjcm9sbC5zY3JvbGxUb3AgLSB3aGVlbFN0YXJ0WTsKICAgICAgICAgIHZhciBzYW1wbGUgPSAobW92ZWRZICYmIHdoZWVsRFkgJiYgbW92ZWRZIC8gd2hlZWxEWSkgfHwKICAgICAgICAgICAgKG1vdmVkWCAmJiB3aGVlbERYICYmIG1vdmVkWCAvIHdoZWVsRFgpOwogICAgICAgICAgd2hlZWxTdGFydFggPSB3aGVlbFN0YXJ0WSA9IG51bGw7CiAgICAgICAgICBpZiAoIXNhbXBsZSkgcmV0dXJuOwogICAgICAgICAgd2hlZWxQaXhlbHNQZXJVbml0ID0gKHdoZWVsUGl4ZWxzUGVyVW5pdCAqIHdoZWVsU2FtcGxlcyArIHNhbXBsZSkgLyAod2hlZWxTYW1wbGVzICsgMSk7CiAgICAgICAgICArK3doZWVsU2FtcGxlczsKICAgICAgICB9LCAyMDApOwogICAgICB9IGVsc2UgewogICAgICAgIHdoZWVsRFggKz0gZHg7IHdoZWVsRFkgKz0gZHk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGRvSGFuZGxlQmluZGluZyhjbSwgYm91bmQsIGRyb3BTaGlmdCkgewogICAgaWYgKHR5cGVvZiBib3VuZCA9PSAic3RyaW5nIikgewogICAgICBib3VuZCA9IGNvbW1hbmRzW2JvdW5kXTsKICAgICAgaWYgKCFib3VuZCkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gRW5zdXJlIHByZXZpb3VzIGlucHV0IGhhcyBiZWVuIHJlYWQsIHNvIHRoYXQgdGhlIGhhbmRsZXIgc2VlcyBhCiAgICAvLyBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGRvY3VtZW50CiAgICBpZiAoY20uZGlzcGxheS5wb2xsaW5nRmFzdCAmJiByZWFkSW5wdXQoY20pKSBjbS5kaXNwbGF5LnBvbGxpbmdGYXN0ID0gZmFsc2U7CiAgICB2YXIgdmlldyA9IGNtLnZpZXcsIHByZXZTaGlmdCA9IHZpZXcuc2VsLnNoaWZ0OwogICAgdHJ5IHsKICAgICAgaWYgKGlzUmVhZE9ubHkoY20pKSB2aWV3LnN1cHByZXNzRWRpdHMgPSB0cnVlOwogICAgICBpZiAoZHJvcFNoaWZ0KSB2aWV3LnNlbC5zaGlmdCA9IGZhbHNlOwogICAgICBib3VuZChjbSk7CiAgICB9IGNhdGNoKGUpIHsKICAgICAgaWYgKGUgIT0gUGFzcykgdGhyb3cgZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBmaW5hbGx5IHsKICAgICAgdmlldy5zZWwuc2hpZnQgPSBwcmV2U2hpZnQ7CiAgICAgIHZpZXcuc3VwcHJlc3NFZGl0cyA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBhbGxLZXlNYXBzKGNtKSB7CiAgICB2YXIgbWFwcyA9IGNtLnZpZXcua2V5TWFwcy5zbGljZSgwKTsKICAgIG1hcHMucHVzaChjbS5vcHRpb25zLmtleU1hcCk7CiAgICBpZiAoY20ub3B0aW9ucy5leHRyYUtleXMpIG1hcHMudW5zaGlmdChjbS5vcHRpb25zLmV4dHJhS2V5cyk7CiAgICByZXR1cm4gbWFwczsKICB9CgogIHZhciBtYXliZVRyYW5zaXRpb247CiAgZnVuY3Rpb24gaGFuZGxlS2V5QmluZGluZyhjbSwgZSkgewogICAgLy8gSGFuZGxlIGF1dG8ga2V5bWFwIHRyYW5zaXRpb25zCiAgICB2YXIgc3RhcnRNYXAgPSBnZXRLZXlNYXAoY20ub3B0aW9ucy5rZXlNYXApLCBuZXh0ID0gc3RhcnRNYXAuYXV0bzsKICAgIGNsZWFyVGltZW91dChtYXliZVRyYW5zaXRpb24pOwogICAgaWYgKG5leHQgJiYgIWlzTW9kaWZpZXJLZXkoZSkpIG1heWJlVHJhbnNpdGlvbiA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIGlmIChnZXRLZXlNYXAoY20ub3B0aW9ucy5rZXlNYXApID09IHN0YXJ0TWFwKQogICAgICAgIGNtLm9wdGlvbnMua2V5TWFwID0gKG5leHQuY2FsbCA/IG5leHQuY2FsbChudWxsLCBjbSkgOiBuZXh0KTsKICAgIH0sIDUwKTsKCiAgICB2YXIgbmFtZSA9IGtleU5hbWVzW2VfcHJvcChlLCAia2V5Q29kZSIpXSwgaGFuZGxlZCA9IGZhbHNlOwogICAgdmFyIGZsaXBDdHJsQ21kID0gbWFjICYmIChvcGVyYSB8fCBxdHdlYmtpdCk7CiAgICBpZiAobmFtZSA9PSBudWxsIHx8IGUuYWx0R3JhcGhLZXkpIHJldHVybiBmYWxzZTsKICAgIGlmIChlX3Byb3AoZSwgImFsdEtleSIpKSBuYW1lID0gIkFsdC0iICsgbmFtZTsKICAgIGlmIChlX3Byb3AoZSwgZmxpcEN0cmxDbWQgPyAibWV0YUtleSIgOiAiY3RybEtleSIpKSBuYW1lID0gIkN0cmwtIiArIG5hbWU7CiAgICBpZiAoZV9wcm9wKGUsIGZsaXBDdHJsQ21kID8gImN0cmxLZXkiIDogIm1ldGFLZXkiKSkgbmFtZSA9ICJDbWQtIiArIG5hbWU7CgogICAgdmFyIHN0b3BwZWQgPSBmYWxzZTsKICAgIGZ1bmN0aW9uIHN0b3AoKSB7IHN0b3BwZWQgPSB0cnVlOyB9CiAgICB2YXIga2V5bWFwcyA9IGFsbEtleU1hcHMoY20pOwoKICAgIGlmIChlX3Byb3AoZSwgInNoaWZ0S2V5IikpIHsKICAgICAgaGFuZGxlZCA9IGxvb2t1cEtleSgiU2hpZnQtIiArIG5hbWUsIGtleW1hcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oYikge3JldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIsIHRydWUpO30sIHN0b3ApCiAgICAgICAgfHwgbG9va3VwS2V5KG5hbWUsIGtleW1hcHMsIGZ1bmN0aW9uKGIpIHsKICAgICAgICAgIGlmICh0eXBlb2YgYiA9PSAic3RyaW5nIiAmJiAvXmdvW0EtWl0vLnRlc3QoYikpIHJldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIpOwogICAgICAgIH0sIHN0b3ApOwogICAgfSBlbHNlIHsKICAgICAgaGFuZGxlZCA9IGxvb2t1cEtleShuYW1lLCBrZXltYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGIpIHsgcmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYik7IH0sIHN0b3ApOwogICAgfQogICAgaWYgKHN0b3BwZWQpIGhhbmRsZWQgPSBmYWxzZTsKICAgIGlmIChoYW5kbGVkKSB7CiAgICAgIGVfcHJldmVudERlZmF1bHQoZSk7CiAgICAgIHJlc3RhcnRCbGluayhjbSk7CiAgICAgIGlmIChpZV9sdDkpIHsgZS5vbGRLZXlDb2RlID0gZS5rZXlDb2RlOyBlLmtleUNvZGUgPSAwOyB9CiAgICB9CiAgICByZXR1cm4gaGFuZGxlZDsKICB9CgogIGZ1bmN0aW9uIGhhbmRsZUNoYXJCaW5kaW5nKGNtLCBlLCBjaCkgewogICAgdmFyIGhhbmRsZWQgPSBsb29rdXBLZXkoIiciICsgY2ggKyAiJyIsIGFsbEtleU1hcHMoY20pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oYikgeyByZXR1cm4gZG9IYW5kbGVCaW5kaW5nKGNtLCBiLCB0cnVlKTsgfSk7CiAgICBpZiAoaGFuZGxlZCkgewogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICByZXN0YXJ0QmxpbmsoY20pOwogICAgfQogICAgcmV0dXJuIGhhbmRsZWQ7CiAgfQoKICB2YXIgbGFzdFN0b3BwZWRLZXkgPSBudWxsOwogIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7CiAgICB2YXIgY20gPSB0aGlzOwogICAgaWYgKCFjbS52aWV3LmZvY3VzZWQpIG9uRm9jdXMoY20pOwogICAgaWYgKGllICYmIGUua2V5Q29kZSA9PSAyNykgeyBlLnJldHVyblZhbHVlID0gZmFsc2U7IH0KICAgIGlmIChjbS5vcHRpb25zLm9uS2V5RXZlbnQgJiYgY20ub3B0aW9ucy5vbktleUV2ZW50KGNtLCBhZGRTdG9wKGUpKSkgcmV0dXJuOwogICAgdmFyIGNvZGUgPSBlX3Byb3AoZSwgImtleUNvZGUiKTsKICAgIC8vIElFIGRvZXMgc3RyYW5nZSB0aGluZ3Mgd2l0aCBlc2NhcGUuCiAgICBjbS52aWV3LnNlbC5zaGlmdCA9IGNvZGUgPT0gMTYgfHwgZV9wcm9wKGUsICJzaGlmdEtleSIpOwogICAgLy8gRmlyc3QgZ2l2ZSBvbktleUV2ZW50IG9wdGlvbiBhIGNoYW5jZSB0byBoYW5kbGUgdGhpcy4KICAgIHZhciBoYW5kbGVkID0gaGFuZGxlS2V5QmluZGluZyhjbSwgZSk7CiAgICBpZiAob3BlcmEpIHsKICAgICAgbGFzdFN0b3BwZWRLZXkgPSBoYW5kbGVkID8gY29kZSA6IG51bGw7CiAgICAgIC8vIE9wZXJhIGhhcyBubyBjdXQgZXZlbnQuLi4gd2UgdHJ5IHRvIGF0IGxlYXN0IGNhdGNoIHRoZSBrZXkgY29tYm8KICAgICAgaWYgKCFoYW5kbGVkICYmIGNvZGUgPT0gODggJiYgIWhhc0NvcHlFdmVudCAmJiBlX3Byb3AoZSwgbWFjID8gIm1ldGFLZXkiIDogImN0cmxLZXkiKSkKICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKCIiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG9uS2V5UHJlc3MoZSkgewogICAgdmFyIGNtID0gdGhpczsKICAgIGlmIChjbS5vcHRpb25zLm9uS2V5RXZlbnQgJiYgY20ub3B0aW9ucy5vbktleUV2ZW50KGNtLCBhZGRTdG9wKGUpKSkgcmV0dXJuOwogICAgdmFyIGtleUNvZGUgPSBlX3Byb3AoZSwgImtleUNvZGUiKSwgY2hhckNvZGUgPSBlX3Byb3AoZSwgImNoYXJDb2RlIik7CiAgICBpZiAob3BlcmEgJiYga2V5Q29kZSA9PSBsYXN0U3RvcHBlZEtleSkge2xhc3RTdG9wcGVkS2V5ID0gbnVsbDsgZV9wcmV2ZW50RGVmYXVsdChlKTsgcmV0dXJuO30KICAgIGlmICgoKG9wZXJhICYmICghZS53aGljaCB8fCBlLndoaWNoIDwgMTApKSB8fCBraHRtbCkgJiYgaGFuZGxlS2V5QmluZGluZyhjbSwgZSkpIHJldHVybjsKICAgIHZhciBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUgPT0gbnVsbCA/IGtleUNvZGUgOiBjaGFyQ29kZSk7CiAgICBpZiAodGhpcy5vcHRpb25zLmVsZWN0cmljQ2hhcnMgJiYgdGhpcy52aWV3Lm1vZGUuZWxlY3RyaWNDaGFycyAmJgogICAgICAgIHRoaXMub3B0aW9ucy5zbWFydEluZGVudCAmJiAhaXNSZWFkT25seSh0aGlzKSAmJgogICAgICAgIHRoaXMudmlldy5tb2RlLmVsZWN0cmljQ2hhcnMuaW5kZXhPZihjaCkgPiAtMSkKICAgICAgc2V0VGltZW91dChvcGVyYXRpb24oY20sIGZ1bmN0aW9uKCkge2luZGVudExpbmUoY20sIGNtLnZpZXcuc2VsLnRvLmxpbmUsICJzbWFydCIpO30pLCA3NSk7CiAgICBpZiAoaGFuZGxlQ2hhckJpbmRpbmcoY20sIGUsIGNoKSkgcmV0dXJuOwogICAgZmFzdFBvbGwoY20pOwogIH0KCiAgZnVuY3Rpb24gb25Gb2N1cyhjbSkgewogICAgaWYgKGNtLm9wdGlvbnMucmVhZE9ubHkgPT0gIm5vY3Vyc29yIikgcmV0dXJuOwogICAgaWYgKCFjbS52aWV3LmZvY3VzZWQpIHsKICAgICAgc2lnbmFsKGNtLCAiZm9jdXMiLCBjbSk7CiAgICAgIGNtLnZpZXcuZm9jdXNlZCA9IHRydWU7CiAgICAgIGlmIChjbS5kaXNwbGF5LnNjcm9sbGVyLmNsYXNzTmFtZS5zZWFyY2goL1xiQ29kZU1pcnJvci1mb2N1c2VkXGIvKSA9PSAtMSkKICAgICAgICBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsYXNzTmFtZSArPSAiIENvZGVNaXJyb3ItZm9jdXNlZCI7CiAgICAgIHJlc2V0SW5wdXQoY20sIHRydWUpOwogICAgfQogICAgc2xvd1BvbGwoY20pOwogICAgcmVzdGFydEJsaW5rKGNtKTsKICB9CiAgZnVuY3Rpb24gb25CbHVyKGNtKSB7CiAgICBpZiAoY20udmlldy5mb2N1c2VkKSB7CiAgICAgIHNpZ25hbChjbSwgImJsdXIiLCBjbSk7CiAgICAgIGNtLnZpZXcuZm9jdXNlZCA9IGZhbHNlOwogICAgICBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsYXNzTmFtZSA9IGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xhc3NOYW1lLnJlcGxhY2UoIiBDb2RlTWlycm9yLWZvY3VzZWQiLCAiIik7CiAgICB9CiAgICBjbGVhckludGVydmFsKGNtLmRpc3BsYXkuYmxpbmtlcik7CiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge2lmICghY20udmlldy5mb2N1c2VkKSBjbS52aWV3LnNlbC5zaGlmdCA9IGZhbHNlO30sIDE1MCk7CiAgfQoKICB2YXIgZGV0ZWN0aW5nU2VsZWN0QWxsOwogIGZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoY20sIGUpIHsKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgc2VsID0gY20udmlldy5zZWw7CiAgICB2YXIgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKSwgc2Nyb2xsUG9zID0gZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A7CiAgICBpZiAoIXBvcyB8fCBvcGVyYSkgcmV0dXJuOyAvLyBPcGVyYSBpcyBkaWZmaWN1bHQuCiAgICBpZiAocG9zRXEoc2VsLmZyb20sIHNlbC50bykgfHwgcG9zTGVzcyhwb3MsIHNlbC5mcm9tKSB8fCAhcG9zTGVzcyhwb3MsIHNlbC50bykpCiAgICAgIG9wZXJhdGlvbihjbSwgc2V0U2VsZWN0aW9uKShjbSwgcG9zLCBwb3MpOwoKICAgIHZhciBvbGRDU1MgPSBkaXNwbGF5LmlucHV0LnN0eWxlLmNzc1RleHQ7CiAgICBkaXNwbGF5LmlucHV0RGl2LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIGRpc3BsYXkuaW5wdXQuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjogZml4ZWQ7IHdpZHRoOiAzMHB4OyBoZWlnaHQ6IDMwcHg7IHRvcDogIiArIChlLmNsaWVudFkgLSA1KSArCiAgICAgICJweDsgbGVmdDogIiArIChlLmNsaWVudFggLSA1KSArICJweDsgei1pbmRleDogMTAwMDsgYmFja2dyb3VuZDogd2hpdGU7IG91dGxpbmU6IG5vbmU7IiArCiAgICAgICJib3JkZXItd2lkdGg6IDA7IG91dGxpbmU6IG5vbmU7IG92ZXJmbG93OiBoaWRkZW47IG9wYWNpdHk6IC4wNTsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUpOyI7CiAgICBmb2N1c0lucHV0KGNtKTsKICAgIHJlc2V0SW5wdXQoY20sIHRydWUpOwogICAgLy8gQWRkcyAiU2VsZWN0IGFsbCIgdG8gY29udGV4dCBtZW51IGluIEZGCiAgICBpZiAocG9zRXEoc2VsLmZyb20sIHNlbC50bykpIGRpc3BsYXkuaW5wdXQudmFsdWUgPSBkaXNwbGF5LnByZXZJbnB1dCA9ICIgIjsKCiAgICBmdW5jdGlvbiByZWhpZGUoKSB7CiAgICAgIGRpc3BsYXkuaW5wdXREaXYuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwogICAgICBkaXNwbGF5LmlucHV0LnN0eWxlLmNzc1RleHQgPSBvbGRDU1M7CiAgICAgIGlmIChpZV9sdDkpIGRpc3BsYXkuc2Nyb2xsYmFyVi5zY3JvbGxUb3AgPSBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCA9IHNjcm9sbFBvczsKICAgICAgc2xvd1BvbGwoY20pOwoKICAgICAgLy8gVHJ5IHRvIGRldGVjdCB0aGUgdXNlciBjaG9vc2luZyBzZWxlY3QtYWxsIAogICAgICBpZiAoZGlzcGxheS5pbnB1dC5zZWxlY3Rpb25TdGFydCAhPSBudWxsKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KGRldGVjdGluZ1NlbGVjdEFsbCk7CiAgICAgICAgdmFyIGV4dHZhbCA9IGRpc3BsYXkuaW5wdXQudmFsdWUgPSAiICIgKyAocG9zRXEoc2VsLmZyb20sIHNlbC50bykgPyAiIiA6IGRpc3BsYXkuaW5wdXQudmFsdWUpLCBpID0gMDsKICAgICAgICBkaXNwbGF5LnByZXZJbnB1dCA9ICIgIjsKICAgICAgICBkaXNwbGF5LmlucHV0LnNlbGVjdGlvblN0YXJ0ID0gMTsgZGlzcGxheS5pbnB1dC5zZWxlY3Rpb25FbmQgPSBleHR2YWwubGVuZ3RoOwogICAgICAgIGRldGVjdGluZ1NlbGVjdEFsbCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gcG9sbCgpewogICAgICAgICAgaWYgKGRpc3BsYXkucHJldklucHV0ID09ICIgIiAmJiBkaXNwbGF5LmlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDApCiAgICAgICAgICAgIG9wZXJhdGlvbihjbSwgY29tbWFuZHMuc2VsZWN0QWxsKShjbSk7CiAgICAgICAgICBlbHNlIGlmIChpKysgPCAxMCkgZGV0ZWN0aW5nU2VsZWN0QWxsID0gc2V0VGltZW91dChwb2xsLCA1MDApOwogICAgICAgICAgZWxzZSByZXNldElucHV0KGNtKTsKICAgICAgICB9LCAyMDApOwogICAgICB9CiAgICB9CgogICAgaWYgKGdlY2tvKSB7CiAgICAgIGVfc3RvcChlKTsKICAgICAgb24od2luZG93LCAibW91c2V1cCIsIGZ1bmN0aW9uIG1vdXNldXAoKSB7CiAgICAgICAgb2ZmKHdpbmRvdywgIm1vdXNldXAiLCBtb3VzZXVwKTsKICAgICAgICBzZXRUaW1lb3V0KHJlaGlkZSwgMjApOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHNldFRpbWVvdXQocmVoaWRlLCA1MCk7CiAgICB9CiAgfQoKICAvLyBVUERBVElORwoKICAvLyBSZXBsYWNlIHRoZSByYW5nZSBmcm9tIGZyb20gdG8gdG8gYnkgdGhlIHN0cmluZ3MgaW4gbmV3VGV4dC4KICAvLyBBZnRlcndhcmRzLCBzZXQgdGhlIHNlbGVjdGlvbiB0byBzZWxGcm9tLCBzZWxUby4KICBmdW5jdGlvbiB1cGRhdGVEb2MoY20sIGZyb20sIHRvLCBuZXdUZXh0LCBzZWxVcGRhdGUsIG9yaWdpbikgewogICAgLy8gUG9zc2libHkgc3BsaXQgb3Igc3VwcHJlc3MgdGhlIHVwZGF0ZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2UKICAgIC8vIG9mIHJlYWQtb25seSBzcGFucyBpbiBpdHMgcmFuZ2UuCiAgICB2YXIgc3BsaXQgPSBzYXdSZWFkT25seVNwYW5zICYmCiAgICAgIHJlbW92ZVJlYWRPbmx5UmFuZ2VzKGNtLnZpZXcuZG9jLCBmcm9tLCB0byk7CiAgICBpZiAoc3BsaXQpIHsKICAgICAgZm9yICh2YXIgaSA9IHNwbGl0Lmxlbmd0aCAtIDE7IGkgPj0gMTsgLS1pKQogICAgICAgIHVwZGF0ZURvY0lubmVyKGNtLCBzcGxpdFtpXS5mcm9tLCBzcGxpdFtpXS50bywgWyIiXSwgb3JpZ2luKTsKICAgICAgaWYgKHNwbGl0Lmxlbmd0aCkKICAgICAgICByZXR1cm4gdXBkYXRlRG9jSW5uZXIoY20sIHNwbGl0WzBdLmZyb20sIHNwbGl0WzBdLnRvLCBuZXdUZXh0LCBzZWxVcGRhdGUsIG9yaWdpbik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdXBkYXRlRG9jSW5uZXIoY20sIGZyb20sIHRvLCBuZXdUZXh0LCBzZWxVcGRhdGUsIG9yaWdpbik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVEb2NJbm5lcihjbSwgZnJvbSwgdG8sIG5ld1RleHQsIHNlbFVwZGF0ZSwgb3JpZ2luKSB7CiAgICBpZiAoY20udmlldy5zdXBwcmVzc0VkaXRzKSByZXR1cm47CgogICAgdmFyIHZpZXcgPSBjbS52aWV3LCBkb2MgPSB2aWV3LmRvYywgb2xkID0gW107CiAgICBkb2MuaXRlcihmcm9tLmxpbmUsIHRvLmxpbmUgKyAxLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgIG9sZC5wdXNoKG5ld0hMKGxpbmUudGV4dCwgbGluZS5tYXJrZWRTcGFucykpOwogICAgfSk7CiAgICB2YXIgc3RhcnRTZWxGcm9tID0gdmlldy5zZWwuZnJvbSwgc3RhcnRTZWxUbyA9IHZpZXcuc2VsLnRvOwogICAgdmFyIGxpbmVzID0gdXBkYXRlTWFya2VkU3BhbnMoaGxTcGFucyhvbGRbMF0pLCBobFNwYW5zKGxzdChvbGQpKSwgZnJvbS5jaCwgdG8uY2gsIG5ld1RleHQpOwogICAgdmFyIHJldHZhbCA9IHVwZGF0ZURvY05vVW5kbyhjbSwgZnJvbSwgdG8sIGxpbmVzLCBzZWxVcGRhdGUsIG9yaWdpbik7CiAgICBpZiAodmlldy5oaXN0b3J5KSBhZGRDaGFuZ2UoY20sIGZyb20ubGluZSwgbmV3VGV4dC5sZW5ndGgsIG9sZCwgb3JpZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsRnJvbSwgc3RhcnRTZWxUbywgdmlldy5zZWwuZnJvbSwgdmlldy5zZWwudG8pOwogICAgcmV0dXJuIHJldHZhbDsKICB9CgogIGZ1bmN0aW9uIHVucmVkb0hlbHBlcihjbSwgdHlwZSkgewogICAgdmFyIGRvYyA9IGNtLnZpZXcuZG9jLCBoaXN0ID0gY20udmlldy5oaXN0b3J5OwogICAgdmFyIHNldCA9ICh0eXBlID09ICJ1bmRvIiA/IGhpc3QuZG9uZSA6IGhpc3QudW5kb25lKS5wb3AoKTsKICAgIGlmICghc2V0KSByZXR1cm47CiAgICB2YXIgYW50aSA9IHtldmVudHM6IFtdLCBmcm9tQmVmb3JlOiBzZXQuZnJvbUFmdGVyLCB0b0JlZm9yZTogc2V0LnRvQWZ0ZXIsCiAgICAgICAgICAgICAgICBmcm9tQWZ0ZXI6IHNldC5mcm9tQmVmb3JlLCB0b0FmdGVyOiBzZXQudG9CZWZvcmV9OwogICAgZm9yICh2YXIgaSA9IHNldC5ldmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHsKICAgICAgaGlzdC5kaXJ0eUNvdW50ZXIgKz0gdHlwZSA9PSAidW5kbyIgPyAtMSA6IDE7CiAgICAgIHZhciBjaGFuZ2UgPSBzZXQuZXZlbnRzW2ldOwogICAgICB2YXIgcmVwbGFjZWQgPSBbXSwgZW5kID0gY2hhbmdlLnN0YXJ0ICsgY2hhbmdlLmFkZGVkOwogICAgICBkb2MuaXRlcihjaGFuZ2Uuc3RhcnQsIGVuZCwgZnVuY3Rpb24obGluZSkgeyByZXBsYWNlZC5wdXNoKG5ld0hMKGxpbmUudGV4dCwgbGluZS5tYXJrZWRTcGFucykpOyB9KTsKICAgICAgYW50aS5ldmVudHMucHVzaCh7c3RhcnQ6IGNoYW5nZS5zdGFydCwgYWRkZWQ6IGNoYW5nZS5vbGQubGVuZ3RoLCBvbGQ6IHJlcGxhY2VkfSk7CiAgICAgIHZhciBzZWxQb3MgPSBpID8gbnVsbCA6IHtmcm9tOiBzZXQuZnJvbUJlZm9yZSwgdG86IHNldC50b0JlZm9yZX07CiAgICAgIHVwZGF0ZURvY05vVW5kbyhjbSwge2xpbmU6IGNoYW5nZS5zdGFydCwgY2g6IDB9LCB7bGluZTogZW5kIC0gMSwgY2g6IGdldExpbmUoZG9jLCBlbmQtMSkudGV4dC5sZW5ndGh9LAogICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLm9sZCwgc2VsUG9zLCB0eXBlKTsKICAgIH0KICAgICh0eXBlID09ICJ1bmRvIiA/IGhpc3QudW5kb25lIDogaGlzdC5kb25lKS5wdXNoKGFudGkpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlRG9jTm9VbmRvKGNtLCBmcm9tLCB0bywgbGluZXMsIHNlbFVwZGF0ZSwgb3JpZ2luKSB7CiAgICB2YXIgdmlldyA9IGNtLnZpZXcsIGRvYyA9IHZpZXcuZG9jLCBkaXNwbGF5ID0gY20uZGlzcGxheTsKICAgIGlmICh2aWV3LnN1cHByZXNzRWRpdHMpIHJldHVybjsKCiAgICB2YXIgbmxpbmVzID0gdG8ubGluZSAtIGZyb20ubGluZSwgZmlyc3RMaW5lID0gZ2V0TGluZShkb2MsIGZyb20ubGluZSksIGxhc3RMaW5lID0gZ2V0TGluZShkb2MsIHRvLmxpbmUpOwogICAgdmFyIHJlY29tcHV0ZU1heExlbmd0aCA9IGZhbHNlLCBjaGVja1dpZHRoU3RhcnQgPSBmcm9tLmxpbmU7CiAgICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7CiAgICAgIGNoZWNrV2lkdGhTdGFydCA9IGxpbmVObyh2aXN1YWxMaW5lKGRvYywgZmlyc3RMaW5lKSk7CiAgICAgIGRvYy5pdGVyKGNoZWNrV2lkdGhTdGFydCwgdG8ubGluZSArIDEsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICBpZiAobGluZUxlbmd0aChkb2MsIGxpbmUpID09IHZpZXcubWF4TGluZUxlbmd0aCkgewogICAgICAgICAgcmVjb21wdXRlTWF4TGVuZ3RoID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgdmFyIGxhc3RITCA9IGxzdChsaW5lcyksIHRoID0gdGV4dEhlaWdodChkaXNwbGF5KTsKCiAgICAvLyBGaXJzdCBhZGp1c3QgdGhlIGxpbmUgc3RydWN0dXJlCiAgICBpZiAoZnJvbS5jaCA9PSAwICYmIHRvLmNoID09IDAgJiYgaGxUZXh0KGxhc3RITCkgPT0gIiIpIHsKICAgICAgLy8gVGhpcyBpcyBhIHdob2xlLWxpbmUgcmVwbGFjZS4gVHJlYXRlZCBzcGVjaWFsbHkgdG8gbWFrZQogICAgICAvLyBzdXJlIGxpbmUgb2JqZWN0cyBtb3ZlIHRoZSB3YXkgdGhleSBhcmUgc3VwcG9zZWQgdG8uCiAgICAgIHZhciBhZGRlZCA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMCwgZSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPCBlOyArK2kpCiAgICAgICAgYWRkZWQucHVzaChtYWtlTGluZShobFRleHQobGluZXNbaV0pLCBobFNwYW5zKGxpbmVzW2ldKSwgdGgpKTsKICAgICAgdXBkYXRlTGluZShjbSwgbGFzdExpbmUsIGxhc3RMaW5lLnRleHQsIGhsU3BhbnMobGFzdEhMKSk7CiAgICAgIGlmIChubGluZXMpIGRvYy5yZW1vdmUoZnJvbS5saW5lLCBubGluZXMsIGNtKTsKICAgICAgaWYgKGFkZGVkLmxlbmd0aCkgZG9jLmluc2VydChmcm9tLmxpbmUsIGFkZGVkKTsKICAgIH0gZWxzZSBpZiAoZmlyc3RMaW5lID09IGxhc3RMaW5lKSB7CiAgICAgIGlmIChsaW5lcy5sZW5ndGggPT0gMSkgewogICAgICAgIHVwZGF0ZUxpbmUoY20sIGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyBobFRleHQobGluZXNbMF0pICsKICAgICAgICAgICAgICAgICAgIGZpcnN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgaGxTcGFucyhsaW5lc1swXSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAodmFyIGFkZGVkID0gW10sIGkgPSAxLCBlID0gbGluZXMubGVuZ3RoIC0gMTsgaSA8IGU7ICsraSkKICAgICAgICAgIGFkZGVkLnB1c2gobWFrZUxpbmUoaGxUZXh0KGxpbmVzW2ldKSwgaGxTcGFucyhsaW5lc1tpXSksIHRoKSk7CiAgICAgICAgYWRkZWQucHVzaChtYWtlTGluZShobFRleHQobGFzdEhMKSArIGZpcnN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgaGxTcGFucyhsYXN0SEwpLCB0aCkpOwogICAgICAgIHVwZGF0ZUxpbmUoY20sIGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyBobFRleHQobGluZXNbMF0pLCBobFNwYW5zKGxpbmVzWzBdKSk7CiAgICAgICAgZG9jLmluc2VydChmcm9tLmxpbmUgKyAxLCBhZGRlZCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobGluZXMubGVuZ3RoID09IDEpIHsKICAgICAgdXBkYXRlTGluZShjbSwgZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIGhsVGV4dChsaW5lc1swXSkgKwogICAgICAgICAgICAgICAgIGxhc3RMaW5lLnRleHQuc2xpY2UodG8uY2gpLCBobFNwYW5zKGxpbmVzWzBdKSk7CiAgICAgIGRvYy5yZW1vdmUoZnJvbS5saW5lICsgMSwgbmxpbmVzLCBjbSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgYWRkZWQgPSBbXTsKICAgICAgdXBkYXRlTGluZShjbSwgZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIGhsVGV4dChsaW5lc1swXSksIGhsU3BhbnMobGluZXNbMF0pKTsKICAgICAgdXBkYXRlTGluZShjbSwgbGFzdExpbmUsIGhsVGV4dChsYXN0SEwpICsgbGFzdExpbmUudGV4dC5zbGljZSh0by5jaCksIGhsU3BhbnMobGFzdEhMKSk7CiAgICAgIGZvciAodmFyIGkgPSAxLCBlID0gbGluZXMubGVuZ3RoIC0gMTsgaSA8IGU7ICsraSkKICAgICAgICBhZGRlZC5wdXNoKG1ha2VMaW5lKGhsVGV4dChsaW5lc1tpXSksIGhsU3BhbnMobGluZXNbaV0pLCB0aCkpOwogICAgICBpZiAobmxpbmVzID4gMSkgZG9jLnJlbW92ZShmcm9tLmxpbmUgKyAxLCBubGluZXMgLSAxLCBjbSk7CiAgICAgIGRvYy5pbnNlcnQoZnJvbS5saW5lICsgMSwgYWRkZWQpOwogICAgfQoKICAgIGlmIChjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgewogICAgICB2YXIgcGVyTGluZSA9IE1hdGgubWF4KDUsIGRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGggLyBjaGFyV2lkdGgoZGlzcGxheSkgLSAzKTsKICAgICAgZG9jLml0ZXIoZnJvbS5saW5lLCBmcm9tLmxpbmUgKyBsaW5lcy5sZW5ndGgsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICBpZiAobGluZS5oZWlnaHQgPT0gMCkgcmV0dXJuOwogICAgICAgIHZhciBndWVzcyA9IChNYXRoLmNlaWwobGluZS50ZXh0Lmxlbmd0aCAvIHBlckxpbmUpIHx8IDEpICogdGg7CiAgICAgICAgaWYgKGd1ZXNzICE9IGxpbmUuaGVpZ2h0KSB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGd1ZXNzKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBkb2MuaXRlcihjaGVja1dpZHRoU3RhcnQsIGZyb20ubGluZSArIGxpbmVzLmxlbmd0aCwgZnVuY3Rpb24obGluZSkgewogICAgICAgIHZhciBsZW4gPSBsaW5lTGVuZ3RoKGRvYywgbGluZSk7CiAgICAgICAgaWYgKGxlbiA+IHZpZXcubWF4TGluZUxlbmd0aCkgewogICAgICAgICAgdmlldy5tYXhMaW5lID0gbGluZTsKICAgICAgICAgIHZpZXcubWF4TGluZUxlbmd0aCA9IGxlbjsKICAgICAgICAgIHZpZXcubWF4TGluZUNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgcmVjb21wdXRlTWF4TGVuZ3RoID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKHJlY29tcHV0ZU1heExlbmd0aCkgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWU7CiAgICB9CgogICAgLy8gQWRqdXN0IGZyb250aWVyLCBzY2hlZHVsZSB3b3JrZXIKICAgIHZpZXcuZnJvbnRpZXIgPSBNYXRoLm1pbih2aWV3LmZyb250aWVyLCBmcm9tLmxpbmUpOwogICAgc3RhcnRXb3JrZXIoY20sIDQwMCk7CgogICAgdmFyIGxlbmRpZmYgPSBsaW5lcy5sZW5ndGggLSBubGluZXMgLSAxOwogICAgLy8gUmVtZW1iZXIgdGhhdCB0aGVzZSBsaW5lcyBjaGFuZ2VkLCBmb3IgdXBkYXRpbmcgdGhlIGRpc3BsYXkKICAgIHJlZ0NoYW5nZShjbSwgZnJvbS5saW5lLCB0by5saW5lICsgMSwgbGVuZGlmZik7CiAgICBpZiAoaGFzSGFuZGxlcihjbSwgImNoYW5nZSIpKSB7CiAgICAgIC8vIE5vcm1hbGl6ZSBsaW5lcyB0byBjb250YWluIG9ubHkgc3RyaW5ncywgc2luY2UgdGhhdCdzIHdoYXQKICAgICAgLy8gdGhlIGNoYW5nZSBldmVudCBoYW5kbGVyIGV4cGVjdHMKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkKICAgICAgICBpZiAodHlwZW9mIGxpbmVzW2ldICE9ICJzdHJpbmciKSBsaW5lc1tpXSA9IGxpbmVzW2ldLnRleHQ7CiAgICAgIHZhciBjaGFuZ2VPYmogPSB7ZnJvbTogZnJvbSwgdG86IHRvLCB0ZXh0OiBsaW5lcywgb3JpZ2luOiBvcmlnaW59OwogICAgICBpZiAoY20uY3VyT3AudGV4dENoYW5nZWQpIHsKICAgICAgICBmb3IgKHZhciBjdXIgPSBjbS5jdXJPcC50ZXh0Q2hhbmdlZDsgY3VyLm5leHQ7IGN1ciA9IGN1ci5uZXh0KSB7fQogICAgICAgIGN1ci5uZXh0ID0gY2hhbmdlT2JqOwogICAgICB9IGVsc2UgY20uY3VyT3AudGV4dENoYW5nZWQgPSBjaGFuZ2VPYmo7CiAgICB9CgogICAgLy8gVXBkYXRlIHRoZSBzZWxlY3Rpb24KICAgIHZhciBuZXdTZWxGcm9tLCBuZXdTZWxUbywgZW5kID0ge2xpbmU6IGZyb20ubGluZSArIGxpbmVzLmxlbmd0aCAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaDogaGxUZXh0KGxhc3RITCkubGVuZ3RoICArIChsaW5lcy5sZW5ndGggPT0gMSA/IGZyb20uY2ggOiAwKX07CiAgICBpZiAoc2VsVXBkYXRlICYmIHR5cGVvZiBzZWxVcGRhdGUgIT0gInN0cmluZyIpIHsKICAgICAgaWYgKHNlbFVwZGF0ZS5mcm9tKSB7IG5ld1NlbEZyb20gPSBzZWxVcGRhdGUuZnJvbTsgbmV3U2VsVG8gPSBzZWxVcGRhdGUudG87IH0KICAgICAgZWxzZSBuZXdTZWxGcm9tID0gbmV3U2VsVG8gPSBzZWxVcGRhdGU7CiAgICB9IGVsc2UgaWYgKHNlbFVwZGF0ZSA9PSAiZW5kIikgewogICAgICBuZXdTZWxGcm9tID0gbmV3U2VsVG8gPSBlbmQ7CiAgICB9IGVsc2UgaWYgKHNlbFVwZGF0ZSA9PSAic3RhcnQiKSB7CiAgICAgIG5ld1NlbEZyb20gPSBuZXdTZWxUbyA9IGZyb207CiAgICB9IGVsc2UgaWYgKHNlbFVwZGF0ZSA9PSAiYXJvdW5kIikgewogICAgICBuZXdTZWxGcm9tID0gZnJvbTsgbmV3U2VsVG8gPSBlbmQ7CiAgICB9IGVsc2UgewogICAgICB2YXIgYWRqdXN0UG9zID0gZnVuY3Rpb24ocG9zKSB7CiAgICAgICAgaWYgKHBvc0xlc3MocG9zLCBmcm9tKSkgcmV0dXJuIHBvczsKICAgICAgICBpZiAoIXBvc0xlc3ModG8sIHBvcykpIHJldHVybiBlbmQ7CiAgICAgICAgdmFyIGxpbmUgPSBwb3MubGluZSArIGxlbmRpZmY7CiAgICAgICAgdmFyIGNoID0gcG9zLmNoOwogICAgICAgIGlmIChwb3MubGluZSA9PSB0by5saW5lKQogICAgICAgICAgY2ggKz0gaGxUZXh0KGxhc3RITCkubGVuZ3RoIC0gKHRvLmNoIC0gKHRvLmxpbmUgPT0gZnJvbS5saW5lID8gZnJvbS5jaCA6IDApKTsKICAgICAgICByZXR1cm4ge2xpbmU6IGxpbmUsIGNoOiBjaH07CiAgICAgIH07CiAgICAgIG5ld1NlbEZyb20gPSBhZGp1c3RQb3Modmlldy5zZWwuZnJvbSk7CiAgICAgIG5ld1NlbFRvID0gYWRqdXN0UG9zKHZpZXcuc2VsLnRvKTsKICAgIH0KICAgIHNldFNlbGVjdGlvbihjbSwgbmV3U2VsRnJvbSwgbmV3U2VsVG8sIG51bGwsIHRydWUpOwogICAgcmV0dXJuIGVuZDsKICB9CgogIGZ1bmN0aW9uIHJlcGxhY2VSYW5nZShjbSwgY29kZSwgZnJvbSwgdG8sIG9yaWdpbikgewogICAgaWYgKCF0bykgdG8gPSBmcm9tOwogICAgaWYgKHBvc0xlc3ModG8sIGZyb20pKSB7IHZhciB0bXAgPSB0bzsgdG8gPSBmcm9tOyBmcm9tID0gdG1wOyB9CiAgICByZXR1cm4gdXBkYXRlRG9jKGNtLCBmcm9tLCB0bywgc3BsaXRMaW5lcyhjb2RlKSwgbnVsbCwgb3JpZ2luKTsKICB9CgogIC8vIFNFTEVDVElPTgoKICBmdW5jdGlvbiBwb3NFcShhLCBiKSB7cmV0dXJuIGEubGluZSA9PSBiLmxpbmUgJiYgYS5jaCA9PSBiLmNoO30KICBmdW5jdGlvbiBwb3NMZXNzKGEsIGIpIHtyZXR1cm4gYS5saW5lIDwgYi5saW5lIHx8IChhLmxpbmUgPT0gYi5saW5lICYmIGEuY2ggPCBiLmNoKTt9CiAgZnVuY3Rpb24gY29weVBvcyh4KSB7cmV0dXJuIHtsaW5lOiB4LmxpbmUsIGNoOiB4LmNofTt9CgogIGZ1bmN0aW9uIGNsaXBMaW5lKGRvYywgbikge3JldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihuLCBkb2Muc2l6ZS0xKSk7fQogIGZ1bmN0aW9uIGNsaXBQb3MoZG9jLCBwb3MpIHsKICAgIGlmIChwb3MubGluZSA8IDApIHJldHVybiB7bGluZTogMCwgY2g6IDB9OwogICAgaWYgKHBvcy5saW5lID49IGRvYy5zaXplKSByZXR1cm4ge2xpbmU6IGRvYy5zaXplLTEsIGNoOiBnZXRMaW5lKGRvYywgZG9jLnNpemUtMSkudGV4dC5sZW5ndGh9OwogICAgdmFyIGNoID0gcG9zLmNoLCBsaW5lbGVuID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKS50ZXh0Lmxlbmd0aDsKICAgIGlmIChjaCA9PSBudWxsIHx8IGNoID4gbGluZWxlbikgcmV0dXJuIHtsaW5lOiBwb3MubGluZSwgY2g6IGxpbmVsZW59OwogICAgZWxzZSBpZiAoY2ggPCAwKSByZXR1cm4ge2xpbmU6IHBvcy5saW5lLCBjaDogMH07CiAgICBlbHNlIHJldHVybiBwb3M7CiAgfQogIGZ1bmN0aW9uIGlzTGluZShkb2MsIGwpIHtyZXR1cm4gbCA+PSAwICYmIGwgPCBkb2Muc2l6ZTt9CgogIC8vIElmIHNoaWZ0IGlzIGhlbGQsIHRoaXMgd2lsbCBtb3ZlIHRoZSBzZWxlY3Rpb24gYW5jaG9yLiBPdGhlcndpc2UsCiAgLy8gaXQnbGwgc2V0IHRoZSB3aG9sZSBzZWxlY3Rpb24uCiAgZnVuY3Rpb24gZXh0ZW5kU2VsZWN0aW9uKGNtLCBwb3MsIG90aGVyLCBiaWFzKSB7CiAgICB2YXIgc2VsID0gY20udmlldy5zZWw7CiAgICBpZiAoc2VsLnNoaWZ0IHx8IHNlbC5leHRlbmQpIHsKICAgICAgdmFyIGFuY2hvciA9IHNlbC5hbmNob3I7CiAgICAgIGlmIChvdGhlcikgewogICAgICAgIHZhciBwb3NCZWZvcmUgPSBwb3NMZXNzKHBvcywgYW5jaG9yKTsKICAgICAgICBpZiAocG9zQmVmb3JlICE9IHBvc0xlc3Mob3RoZXIsIGFuY2hvcikpIHsKICAgICAgICAgIGFuY2hvciA9IHBvczsKICAgICAgICAgIHBvcyA9IG90aGVyOwogICAgICAgIH0gZWxzZSBpZiAocG9zQmVmb3JlICE9IHBvc0xlc3MocG9zLCBvdGhlcikpIHsKICAgICAgICAgIHBvcyA9IG90aGVyOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXRTZWxlY3Rpb24oY20sIGFuY2hvciwgcG9zLCBiaWFzKTsKICAgIH0gZWxzZSB7CiAgICAgIHNldFNlbGVjdGlvbihjbSwgcG9zLCBvdGhlciB8fCBwb3MsIGJpYXMpOwogICAgfQogICAgY20uY3VyT3AudXNlclNlbENoYW5nZSA9IHRydWU7CiAgfQoKICAvLyBVcGRhdGUgdGhlIHNlbGVjdGlvbi4gTGFzdCB0d28gYXJncyBhcmUgb25seSB1c2VkIGJ5CiAgLy8gdXBkYXRlRG9jLCBzaW5jZSB0aGV5IGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRoZSBsaW5lCiAgLy8gbnVtYmVycyBiZWZvcmUgdGhlIHVwZGF0ZS4KICBmdW5jdGlvbiBzZXRTZWxlY3Rpb24oY20sIGFuY2hvciwgaGVhZCwgYmlhcywgY2hlY2tBdG9taWMpIHsKICAgIGNtLnZpZXcuZ29hbENvbHVtbiA9IG51bGw7CiAgICB2YXIgc2VsID0gY20udmlldy5zZWw7CiAgICAvLyBTa2lwIG92ZXIgYXRvbWljIHNwYW5zLgogICAgaWYgKGNoZWNrQXRvbWljIHx8ICFwb3NFcShhbmNob3IsIHNlbC5hbmNob3IpKQogICAgICBhbmNob3IgPSBza2lwQXRvbWljKGNtLCBhbmNob3IsIGJpYXMsIGNoZWNrQXRvbWljICE9ICJwdXNoIik7CiAgICBpZiAoY2hlY2tBdG9taWMgfHwgIXBvc0VxKGhlYWQsIHNlbC5oZWFkKSkKICAgICAgaGVhZCA9IHNraXBBdG9taWMoY20sIGhlYWQsIGJpYXMsIGNoZWNrQXRvbWljICE9ICJwdXNoIik7CgogICAgaWYgKHBvc0VxKHNlbC5hbmNob3IsIGFuY2hvcikgJiYgcG9zRXEoc2VsLmhlYWQsIGhlYWQpKSByZXR1cm47CgogICAgc2VsLmFuY2hvciA9IGFuY2hvcjsgc2VsLmhlYWQgPSBoZWFkOwogICAgdmFyIGludiA9IHBvc0xlc3MoaGVhZCwgYW5jaG9yKTsKICAgIHNlbC5mcm9tID0gaW52ID8gaGVhZCA6IGFuY2hvcjsKICAgIHNlbC50byA9IGludiA/IGFuY2hvciA6IGhlYWQ7CgogICAgY20uY3VyT3AudXBkYXRlSW5wdXQgPSB0cnVlOwogICAgY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiByZUNoZWNrU2VsZWN0aW9uKGNtKSB7CiAgICBzZXRTZWxlY3Rpb24oY20sIGNtLnZpZXcuc2VsLmZyb20sIGNtLnZpZXcuc2VsLnRvLCBudWxsLCAicHVzaCIpOwogIH0KCiAgZnVuY3Rpb24gc2tpcEF0b21pYyhjbSwgcG9zLCBiaWFzLCBtYXlDbGVhcikgewogICAgdmFyIGRvYyA9IGNtLnZpZXcuZG9jLCBmbGlwcGVkID0gZmFsc2UsIGN1clBvcyA9IHBvczsKICAgIHZhciBkaXIgPSBiaWFzIHx8IDE7CiAgICBjbS52aWV3LmNhbnRFZGl0ID0gZmFsc2U7CiAgICBzZWFyY2g6IGZvciAoOzspIHsKICAgICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgY3VyUG9zLmxpbmUpLCB0b0NsZWFyOwogICAgICBpZiAobGluZS5tYXJrZWRTcGFucykgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkgewogICAgICAgICAgdmFyIHNwID0gbGluZS5tYXJrZWRTcGFuc1tpXSwgbSA9IHNwLm1hcmtlcjsKICAgICAgICAgIGlmICgoc3AuZnJvbSA9PSBudWxsIHx8IChtLmluY2x1c2l2ZUxlZnQgPyBzcC5mcm9tIDw9IGN1clBvcy5jaCA6IHNwLmZyb20gPCBjdXJQb3MuY2gpKSAmJgogICAgICAgICAgICAgIChzcC50byA9PSBudWxsIHx8IChtLmluY2x1c2l2ZVJpZ2h0ID8gc3AudG8gPj0gY3VyUG9zLmNoIDogc3AudG8gPiBjdXJQb3MuY2gpKSkgewogICAgICAgICAgICBpZiAobWF5Q2xlYXIgJiYgbS5jbGVhck9uRW50ZXIpIHsKICAgICAgICAgICAgICAodG9DbGVhciB8fCAodG9DbGVhciA9IFtdKSkucHVzaChtKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSBlbHNlIGlmICghbS5hdG9taWMpIGNvbnRpbnVlOwogICAgICAgICAgICB2YXIgbmV3UG9zID0gbS5maW5kKClbZGlyIDwgMCA/ICJmcm9tIiA6ICJ0byJdOwogICAgICAgICAgICBpZiAocG9zRXEobmV3UG9zLCBjdXJQb3MpKSB7CiAgICAgICAgICAgICAgbmV3UG9zLmNoICs9IGRpcjsKICAgICAgICAgICAgICBpZiAobmV3UG9zLmNoIDwgMCkgewogICAgICAgICAgICAgICAgaWYgKG5ld1Bvcy5saW5lKSBuZXdQb3MgPSBjbGlwUG9zKGRvYywge2xpbmU6IG5ld1Bvcy5saW5lIC0gMX0pOwogICAgICAgICAgICAgICAgZWxzZSBuZXdQb3MgPSBudWxsOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3UG9zLmNoID4gbGluZS50ZXh0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgaWYgKG5ld1Bvcy5saW5lIDwgZG9jLnNpemUgLSAxKSBuZXdQb3MgPSB7bGluZTogbmV3UG9zLmxpbmUgKyAxLCBjaDogMH07CiAgICAgICAgICAgICAgICBlbHNlIG5ld1BvcyA9IG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghbmV3UG9zKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxpcHBlZCkgewogICAgICAgICAgICAgICAgICAvLyBEcml2ZW4gaW4gYSBjb3JuZXIgLS0gbm8gdmFsaWQgY3Vyc29yIHBvc2l0aW9uIGZvdW5kIGF0IGFsbAogICAgICAgICAgICAgICAgICAvLyAtLSB0cnkgYWdhaW4gKndpdGgqIGNsZWFyaW5nLCBpZiB3ZSBkaWRuJ3QgYWxyZWFkeQogICAgICAgICAgICAgICAgICBpZiAoIW1heUNsZWFyKSByZXR1cm4gc2tpcEF0b21pYyhjbSwgcG9zLCBiaWFzLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0dXJuIG9mZiBlZGl0aW5nIHVudGlsIGZ1cnRoZXIgbm90aWNlLCBhbmQgcmV0dXJuIHRoZSBzdGFydCBvZiB0aGUgZG9jCiAgICAgICAgICAgICAgICAgIGNtLnZpZXcuY2FudEVkaXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICByZXR1cm4ge2xpbmU6IDAsIGNoOiAwfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZsaXBwZWQgPSB0cnVlOyBuZXdQb3MgPSBwb3M7IGRpciA9IC1kaXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1clBvcyA9IG5ld1BvczsKICAgICAgICAgICAgY29udGludWUgc2VhcmNoOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodG9DbGVhcikgZm9yICh2YXIgaSA9IDA7IGkgPCB0b0NsZWFyLmxlbmd0aDsgKytpKSB0b0NsZWFyW2ldLmNsZWFyKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGN1clBvczsKICAgIH0KICB9CgogIC8vIFNDUk9MTElORwoKICBmdW5jdGlvbiBzY3JvbGxDdXJzb3JJbnRvVmlldyhjbSkgewogICAgdmFyIHZpZXcgPSBjbS52aWV3OwogICAgdmFyIGNvb3JkcyA9IHNjcm9sbFBvc0ludG9WaWV3KGNtLCB2aWV3LnNlbC5oZWFkKTsKICAgIGlmICghdmlldy5mb2N1c2VkKSByZXR1cm47CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGJveCA9IGRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvU2Nyb2xsID0gbnVsbDsKICAgIGlmIChjb29yZHMudG9wICsgYm94LnRvcCA8IDApIGRvU2Nyb2xsID0gdHJ1ZTsKICAgIGVsc2UgaWYgKGNvb3Jkcy5ib3R0b20gKyBib3gudG9wID4gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSkgZG9TY3JvbGwgPSBmYWxzZTsKICAgIGlmIChkb1Njcm9sbCAhPSBudWxsICYmICFwaGFudG9tKSB7CiAgICAgIHZhciBoaWRkZW4gPSBkaXNwbGF5LmN1cnNvci5zdHlsZS5kaXNwbGF5ID09ICJub25lIjsKICAgICAgaWYgKGhpZGRlbikgewogICAgICAgIGRpc3BsYXkuY3Vyc29yLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgICBkaXNwbGF5LmN1cnNvci5zdHlsZS5sZWZ0ID0gY29vcmRzLmxlZnQgKyAicHgiOwogICAgICAgIGRpc3BsYXkuY3Vyc29yLnN0eWxlLnRvcCA9IChjb29yZHMudG9wIC0gZGlzcGxheS52aWV3T2Zmc2V0KSArICJweCI7CiAgICAgIH0KICAgICAgZGlzcGxheS5jdXJzb3Iuc2Nyb2xsSW50b1ZpZXcoZG9TY3JvbGwpOwogICAgICBpZiAoaGlkZGVuKSBkaXNwbGF5LmN1cnNvci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2Nyb2xsUG9zSW50b1ZpZXcoY20sIHBvcykgewogICAgZm9yICg7OykgewogICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlLCBjb29yZHMgPSBjdXJzb3JDb29yZHMoY20sIHBvcyk7CiAgICAgIHZhciBzY3JvbGxQb3MgPSBjYWxjdWxhdGVTY3JvbGxQb3MoY20sIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wLCBjb29yZHMubGVmdCwgY29vcmRzLmJvdHRvbSk7CiAgICAgIHZhciBzdGFydFRvcCA9IGNtLnZpZXcuc2Nyb2xsVG9wLCBzdGFydExlZnQgPSBjbS52aWV3LnNjcm9sbExlZnQ7CiAgICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsVG9wICE9IG51bGwpIHsKICAgICAgICBzZXRTY3JvbGxUb3AoY20sIHNjcm9sbFBvcy5zY3JvbGxUb3ApOwogICAgICAgIGlmIChNYXRoLmFicyhjbS52aWV3LnNjcm9sbFRvcCAtIHN0YXJ0VG9wKSA+IDEpIGNoYW5nZWQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsTGVmdCAhPSBudWxsKSB7CiAgICAgICAgc2V0U2Nyb2xsTGVmdChjbSwgc2Nyb2xsUG9zLnNjcm9sbExlZnQpOwogICAgICAgIGlmIChNYXRoLmFicyhjbS52aWV3LnNjcm9sbExlZnQgLSBzdGFydExlZnQpID4gMSkgY2hhbmdlZCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFjaGFuZ2VkKSByZXR1cm4gY29vcmRzOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoY20sIHgxLCB5MSwgeDIsIHkyKSB7CiAgICB2YXIgc2Nyb2xsUG9zID0gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCB4MSwgeTEsIHgyLCB5Mik7CiAgICBpZiAoc2Nyb2xsUG9zLnNjcm9sbFRvcCAhPSBudWxsKSBzZXRTY3JvbGxUb3AoY20sIHNjcm9sbFBvcy5zY3JvbGxUb3ApOwogICAgaWYgKHNjcm9sbFBvcy5zY3JvbGxMZWZ0ICE9IG51bGwpIHNldFNjcm9sbExlZnQoY20sIHNjcm9sbFBvcy5zY3JvbGxMZWZ0KTsKICB9CgogIGZ1bmN0aW9uIGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgeDEsIHkxLCB4MiwgeTIpIHsKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgcHQgPSBwYWRkaW5nVG9wKGRpc3BsYXkpOwogICAgeTEgKz0gcHQ7IHkyICs9IHB0OwogICAgdmFyIHNjcmVlbiA9IGRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gc2Nyb2xsZXJDdXRPZmYsIHNjcmVlbnRvcCA9IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wLCByZXN1bHQgPSB7fTsKICAgIHZhciBkb2NCb3R0b20gPSBjbS52aWV3LmRvYy5oZWlnaHQgKyAyICogcHQ7CiAgICB2YXIgYXRUb3AgPSB5MSA8IHB0ICsgMTAsIGF0Qm90dG9tID0geTIgKyBwdCA+IGRvY0JvdHRvbSAtIDEwOwogICAgaWYgKHkxIDwgc2NyZWVudG9wKSByZXN1bHQuc2Nyb2xsVG9wID0gYXRUb3AgPyAwIDogTWF0aC5tYXgoMCwgeTEpOwogICAgZWxzZSBpZiAoeTIgPiBzY3JlZW50b3AgKyBzY3JlZW4pIHJlc3VsdC5zY3JvbGxUb3AgPSAoYXRCb3R0b20gPyBkb2NCb3R0b20gOiB5MikgLSBzY3JlZW47CgogICAgdmFyIHNjcmVlbncgPSBkaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoIC0gc2Nyb2xsZXJDdXRPZmYsIHNjcmVlbmxlZnQgPSBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQ7CiAgICB4MSArPSBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGg7IHgyICs9IGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aDsKICAgIHZhciBndXR0ZXJ3ID0gZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoOwogICAgdmFyIGF0TGVmdCA9IHgxIDwgZ3V0dGVydyArIDEwOwogICAgaWYgKHgxIDwgc2NyZWVubGVmdCArIGd1dHRlcncgfHwgYXRMZWZ0KSB7CiAgICAgIGlmIChhdExlZnQpIHgxID0gMDsKICAgICAgcmVzdWx0LnNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCB4MSAtIDEwIC0gZ3V0dGVydyk7CiAgICB9IGVsc2UgaWYgKHgyID4gc2NyZWVudyArIHNjcmVlbmxlZnQgLSAzKSB7CiAgICAgIHJlc3VsdC5zY3JvbGxMZWZ0ID0geDIgKyAxMCAtIHNjcmVlbnc7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gQVBJIFVUSUxJVElFUwoKICBmdW5jdGlvbiBpbmRlbnRMaW5lKGNtLCBuLCBob3csIGFnZ3Jlc3NpdmUpIHsKICAgIHZhciBkb2MgPSBjbS52aWV3LmRvYzsKICAgIGlmICghaG93KSBob3cgPSAiYWRkIjsKICAgIGlmIChob3cgPT0gInNtYXJ0IikgewogICAgICBpZiAoIWNtLnZpZXcubW9kZS5pbmRlbnQpIGhvdyA9ICJwcmV2IjsKICAgICAgZWxzZSB2YXIgc3RhdGUgPSBnZXRTdGF0ZUJlZm9yZShjbSwgbik7CiAgICB9CgogICAgdmFyIHRhYlNpemUgPSBjbS5vcHRpb25zLnRhYlNpemU7CiAgICB2YXIgbGluZSA9IGdldExpbmUoZG9jLCBuKSwgY3VyU3BhY2UgPSBjb3VudENvbHVtbihsaW5lLnRleHQsIG51bGwsIHRhYlNpemUpOwogICAgdmFyIGN1clNwYWNlU3RyaW5nID0gbGluZS50ZXh0Lm1hdGNoKC9eXHMqLylbMF0sIGluZGVudGF0aW9uOwogICAgaWYgKGhvdyA9PSAic21hcnQiKSB7CiAgICAgIGluZGVudGF0aW9uID0gY20udmlldy5tb2RlLmluZGVudChzdGF0ZSwgbGluZS50ZXh0LnNsaWNlKGN1clNwYWNlU3RyaW5nLmxlbmd0aCksIGxpbmUudGV4dCk7CiAgICAgIGlmIChpbmRlbnRhdGlvbiA9PSBQYXNzKSB7CiAgICAgICAgaWYgKCFhZ2dyZXNzaXZlKSByZXR1cm47CiAgICAgICAgaG93ID0gInByZXYiOwogICAgICB9CiAgICB9CiAgICBpZiAoaG93ID09ICJwcmV2IikgewogICAgICBpZiAobikgaW5kZW50YXRpb24gPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgbi0xKS50ZXh0LCBudWxsLCB0YWJTaXplKTsKICAgICAgZWxzZSBpbmRlbnRhdGlvbiA9IDA7CiAgICB9CiAgICBlbHNlIGlmIChob3cgPT0gImFkZCIpIGluZGVudGF0aW9uID0gY3VyU3BhY2UgKyBjbS5vcHRpb25zLmluZGVudFVuaXQ7CiAgICBlbHNlIGlmIChob3cgPT0gInN1YnRyYWN0IikgaW5kZW50YXRpb24gPSBjdXJTcGFjZSAtIGNtLm9wdGlvbnMuaW5kZW50VW5pdDsKICAgIGluZGVudGF0aW9uID0gTWF0aC5tYXgoMCwgaW5kZW50YXRpb24pOwoKICAgIHZhciBpbmRlbnRTdHJpbmcgPSAiIiwgcG9zID0gMDsKICAgIGlmIChjbS5vcHRpb25zLmluZGVudFdpdGhUYWJzKQogICAgICBmb3IgKHZhciBpID0gTWF0aC5mbG9vcihpbmRlbnRhdGlvbiAvIHRhYlNpemUpOyBpOyAtLWkpIHtwb3MgKz0gdGFiU2l6ZTsgaW5kZW50U3RyaW5nICs9ICJcdCI7fQogICAgaWYgKHBvcyA8IGluZGVudGF0aW9uKSBpbmRlbnRTdHJpbmcgKz0gc3BhY2VTdHIoaW5kZW50YXRpb24gLSBwb3MpOwoKICAgIGlmIChpbmRlbnRTdHJpbmcgIT0gY3VyU3BhY2VTdHJpbmcpCiAgICAgIHJlcGxhY2VSYW5nZShjbSwgaW5kZW50U3RyaW5nLCB7bGluZTogbiwgY2g6IDB9LCB7bGluZTogbiwgY2g6IGN1clNwYWNlU3RyaW5nLmxlbmd0aH0sICJpbnB1dCIpOwogICAgbGluZS5zdGF0ZUFmdGVyID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGNoYW5nZUxpbmUoY20sIGhhbmRsZSwgb3ApIHsKICAgIHZhciBubyA9IGhhbmRsZSwgbGluZSA9IGhhbmRsZSwgZG9jID0gY20udmlldy5kb2M7CiAgICBpZiAodHlwZW9mIGhhbmRsZSA9PSAibnVtYmVyIikgbGluZSA9IGdldExpbmUoZG9jLCBjbGlwTGluZShkb2MsIGhhbmRsZSkpOwogICAgZWxzZSBubyA9IGxpbmVObyhoYW5kbGUpOwogICAgaWYgKG5vID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKG9wKGxpbmUsIG5vKSkgcmVnQ2hhbmdlKGNtLCBubywgbm8gKyAxKTsKICAgIGVsc2UgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbGluZTsKICB9CgogIGZ1bmN0aW9uIGZpbmRQb3NIKGNtLCBkaXIsIHVuaXQsIHZpc3VhbGx5KSB7CiAgICB2YXIgZG9jID0gY20udmlldy5kb2MsIGVuZCA9IGNtLnZpZXcuc2VsLmhlYWQsIGxpbmUgPSBlbmQubGluZSwgY2ggPSBlbmQuY2g7CiAgICB2YXIgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lKTsKICAgIGZ1bmN0aW9uIGZpbmROZXh0TGluZSgpIHsKICAgICAgdmFyIGwgPSBsaW5lICsgZGlyOwogICAgICBpZiAobCA8IDAgfHwgbCA9PSBkb2Muc2l6ZSkgcmV0dXJuIGZhbHNlOwogICAgICBsaW5lID0gbDsKICAgICAgcmV0dXJuIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbCk7CiAgICB9CiAgICBmdW5jdGlvbiBtb3ZlT25jZShib3VuZFRvTGluZSkgewogICAgICB2YXIgbmV4dCA9ICh2aXN1YWxseSA/IG1vdmVWaXN1YWxseSA6IG1vdmVMb2dpY2FsbHkpKGxpbmVPYmosIGNoLCBkaXIsIHRydWUpOwogICAgICBpZiAobmV4dCA9PSBudWxsKSB7CiAgICAgICAgaWYgKCFib3VuZFRvTGluZSAmJiBmaW5kTmV4dExpbmUoKSkgewogICAgICAgICAgaWYgKHZpc3VhbGx5KSBjaCA9IChkaXIgPCAwID8gbGluZVJpZ2h0IDogbGluZUxlZnQpKGxpbmVPYmopOwogICAgICAgICAgZWxzZSBjaCA9IGRpciA8IDAgPyBsaW5lT2JqLnRleHQubGVuZ3RoIDogMDsKICAgICAgICB9IGVsc2UgcmV0dXJuIGZhbHNlOwogICAgICB9IGVsc2UgY2ggPSBuZXh0OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh1bml0ID09ICJjaGFyIikgbW92ZU9uY2UoKTsKICAgIGVsc2UgaWYgKHVuaXQgPT0gImNvbHVtbiIpIG1vdmVPbmNlKHRydWUpOwogICAgZWxzZSBpZiAodW5pdCA9PSAid29yZCIpIHsKICAgICAgdmFyIHNhd1dvcmQgPSBmYWxzZTsKICAgICAgZm9yICg7OykgewogICAgICAgIGlmIChkaXIgPCAwKSBpZiAoIW1vdmVPbmNlKCkpIGJyZWFrOwogICAgICAgIGlmIChpc1dvcmRDaGFyKGxpbmVPYmoudGV4dC5jaGFyQXQoY2gpKSkgc2F3V29yZCA9IHRydWU7CiAgICAgICAgZWxzZSBpZiAoc2F3V29yZCkge2lmIChkaXIgPCAwKSB7ZGlyID0gMTsgbW92ZU9uY2UoKTt9IGJyZWFrO30KICAgICAgICBpZiAoZGlyID4gMCkgaWYgKCFtb3ZlT25jZSgpKSBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNraXBBdG9taWMoY20sIHtsaW5lOiBsaW5lLCBjaDogY2h9LCBkaXIsIHRydWUpOwogIH0KCiAgZnVuY3Rpb24gZmluZFdvcmRBdChsaW5lLCBwb3MpIHsKICAgIHZhciBzdGFydCA9IHBvcy5jaCwgZW5kID0gcG9zLmNoOwogICAgaWYgKGxpbmUpIHsKICAgICAgaWYgKHBvcy5hZnRlciA9PT0gZmFsc2UgfHwgZW5kID09IGxpbmUubGVuZ3RoKSAtLXN0YXJ0OyBlbHNlICsrZW5kOwogICAgICB2YXIgc3RhcnRDaGFyID0gbGluZS5jaGFyQXQoc3RhcnQpOwogICAgICB2YXIgY2hlY2sgPSBpc1dvcmRDaGFyKHN0YXJ0Q2hhcikgPyBpc1dvcmRDaGFyIDoKICAgICAgICAvXHMvLnRlc3Qoc3RhcnRDaGFyKSA/IGZ1bmN0aW9uKGNoKSB7cmV0dXJuIC9ccy8udGVzdChjaCk7fSA6CiAgICAgIGZ1bmN0aW9uKGNoKSB7cmV0dXJuICEvXHMvLnRlc3QoY2gpICYmICFpc1dvcmRDaGFyKGNoKTt9OwogICAgICB3aGlsZSAoc3RhcnQgPiAwICYmIGNoZWNrKGxpbmUuY2hhckF0KHN0YXJ0IC0gMSkpKSAtLXN0YXJ0OwogICAgICB3aGlsZSAoZW5kIDwgbGluZS5sZW5ndGggJiYgY2hlY2sobGluZS5jaGFyQXQoZW5kKSkpICsrZW5kOwogICAgfQogICAgcmV0dXJuIHtmcm9tOiB7bGluZTogcG9zLmxpbmUsIGNoOiBzdGFydH0sIHRvOiB7bGluZTogcG9zLmxpbmUsIGNoOiBlbmR9fTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdExpbmUoY20sIGxpbmUpIHsKICAgIGV4dGVuZFNlbGVjdGlvbihjbSwge2xpbmU6IGxpbmUsIGNoOiAwfSwgY2xpcFBvcyhjbS52aWV3LmRvYywge2xpbmU6IGxpbmUgKyAxLCBjaDogMH0pKTsKICB9CgogIC8vIFBST1RPVFlQRQoKICAvLyBUaGUgcHVibGljbHkgdmlzaWJsZSBBUEkuIE5vdGUgdGhhdCBvcGVyYXRpb24obnVsbCwgZikgbWVhbnMKICAvLyAnd3JhcCBmIGluIGFuIG9wZXJhdGlvbiwgcGVyZm9ybWVkIG9uIGl0cyBgdGhpc2AgcGFyYW1ldGVyJwoKICBDb2RlTWlycm9yLnByb3RvdHlwZSA9IHsKICAgIGdldFZhbHVlOiBmdW5jdGlvbihsaW5lU2VwKSB7CiAgICAgIHZhciB0ZXh0ID0gW10sIGRvYyA9IHRoaXMudmlldy5kb2M7CiAgICAgIGRvYy5pdGVyKDAsIGRvYy5zaXplLCBmdW5jdGlvbihsaW5lKSB7IHRleHQucHVzaChsaW5lLnRleHQpOyB9KTsKICAgICAgcmV0dXJuIHRleHQuam9pbihsaW5lU2VwIHx8ICJcbiIpOwogICAgfSwKCiAgICBzZXRWYWx1ZTogb3BlcmF0aW9uKG51bGwsIGZ1bmN0aW9uKGNvZGUpIHsKICAgICAgdmFyIGRvYyA9IHRoaXMudmlldy5kb2MsIHRvcCA9IHtsaW5lOiAwLCBjaDogMH0sIGxhc3RMZW4gPSBnZXRMaW5lKGRvYywgZG9jLnNpemUtMSkudGV4dC5sZW5ndGg7CiAgICAgIHVwZGF0ZURvY0lubmVyKHRoaXMsIHRvcCwge2xpbmU6IGRvYy5zaXplIC0gMSwgY2g6IGxhc3RMZW59LCBzcGxpdExpbmVzKGNvZGUpLCB0b3AsIHRvcCwgInNldFZhbHVlIik7CiAgICB9KSwKCiAgICBnZXRTZWxlY3Rpb246IGZ1bmN0aW9uKGxpbmVTZXApIHsgcmV0dXJuIHRoaXMuZ2V0UmFuZ2UodGhpcy52aWV3LnNlbC5mcm9tLCB0aGlzLnZpZXcuc2VsLnRvLCBsaW5lU2VwKTsgfSwKCiAgICByZXBsYWNlU2VsZWN0aW9uOiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24oY29kZSwgY29sbGFwc2UsIG9yaWdpbikgewogICAgICB2YXIgc2VsID0gdGhpcy52aWV3LnNlbDsKICAgICAgdXBkYXRlRG9jKHRoaXMsIHNlbC5mcm9tLCBzZWwudG8sIHNwbGl0TGluZXMoY29kZSksIGNvbGxhcHNlIHx8ICJhcm91bmQiLCBvcmlnaW4pOwogICAgfSksCgogICAgZm9jdXM6IGZ1bmN0aW9uKCl7d2luZG93LmZvY3VzKCk7IGZvY3VzSW5wdXQodGhpcyk7IG9uRm9jdXModGhpcyk7IGZhc3RQb2xsKHRoaXMpO30sCgogICAgc2V0T3B0aW9uOiBmdW5jdGlvbihvcHRpb24sIHZhbHVlKSB7CiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLCBvbGQgPSBvcHRpb25zW29wdGlvbl07CiAgICAgIGlmIChvcHRpb25zW29wdGlvbl0gPT0gdmFsdWUgJiYgb3B0aW9uICE9ICJtb2RlIikgcmV0dXJuOwogICAgICBvcHRpb25zW29wdGlvbl0gPSB2YWx1ZTsKICAgICAgaWYgKG9wdGlvbkhhbmRsZXJzLmhhc093blByb3BlcnR5KG9wdGlvbikpCiAgICAgICAgb3BlcmF0aW9uKHRoaXMsIG9wdGlvbkhhbmRsZXJzW29wdGlvbl0pKHRoaXMsIHZhbHVlLCBvbGQpOwogICAgfSwKCiAgICBnZXRPcHRpb246IGZ1bmN0aW9uKG9wdGlvbikge3JldHVybiB0aGlzLm9wdGlvbnNbb3B0aW9uXTt9LAoKICAgIGdldE1vZGU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnZpZXcubW9kZTt9LAoKICAgIGFkZEtleU1hcDogZnVuY3Rpb24obWFwKSB7CiAgICAgIHRoaXMudmlldy5rZXlNYXBzLnB1c2gobWFwKTsKICAgIH0sCgogICAgcmVtb3ZlS2V5TWFwOiBmdW5jdGlvbihtYXApIHsKICAgICAgdmFyIG1hcHMgPSB0aGlzLnZpZXcua2V5TWFwczsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgKytpKQogICAgICAgIGlmICgodHlwZW9mIG1hcCA9PSAic3RyaW5nIiA/IG1hcHNbaV0ubmFtZSA6IG1hcHNbaV0pID09IG1hcCkgewogICAgICAgICAgbWFwcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9LAoKICAgIHVuZG86IG9wZXJhdGlvbihudWxsLCBmdW5jdGlvbigpIHt1bnJlZG9IZWxwZXIodGhpcywgInVuZG8iKTt9KSwKICAgIHJlZG86IG9wZXJhdGlvbihudWxsLCBmdW5jdGlvbigpIHt1bnJlZG9IZWxwZXIodGhpcywgInJlZG8iKTt9KSwKCiAgICBpbmRlbnRMaW5lOiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24obiwgZGlyLCBhZ2dyZXNzaXZlKSB7CiAgICAgIGlmICh0eXBlb2YgZGlyICE9ICJzdHJpbmciKSB7CiAgICAgICAgaWYgKGRpciA9PSBudWxsKSBkaXIgPSB0aGlzLm9wdGlvbnMuc21hcnRJbmRlbnQgPyAic21hcnQiIDogInByZXYiOwogICAgICAgIGVsc2UgZGlyID0gZGlyID8gImFkZCIgOiAic3VidHJhY3QiOwogICAgICB9CiAgICAgIGlmIChpc0xpbmUodGhpcy52aWV3LmRvYywgbikpIGluZGVudExpbmUodGhpcywgbiwgZGlyLCBhZ2dyZXNzaXZlKTsKICAgIH0pLAoKICAgIGluZGVudFNlbGVjdGlvbjogb3BlcmF0aW9uKG51bGwsIGZ1bmN0aW9uKGhvdykgewogICAgICB2YXIgc2VsID0gdGhpcy52aWV3LnNlbDsKICAgICAgaWYgKHBvc0VxKHNlbC5mcm9tLCBzZWwudG8pKSByZXR1cm4gaW5kZW50TGluZSh0aGlzLCBzZWwuZnJvbS5saW5lLCBob3cpOwogICAgICB2YXIgZSA9IHNlbC50by5saW5lIC0gKHNlbC50by5jaCA/IDAgOiAxKTsKICAgICAgZm9yICh2YXIgaSA9IHNlbC5mcm9tLmxpbmU7IGkgPD0gZTsgKytpKSBpbmRlbnRMaW5lKHRoaXMsIGksIGhvdyk7CiAgICB9KSwKCiAgICBoaXN0b3J5U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoaXN0ID0gdGhpcy52aWV3Lmhpc3Rvcnk7CiAgICAgIHJldHVybiB7dW5kbzogaGlzdC5kb25lLmxlbmd0aCwgcmVkbzogaGlzdC51bmRvbmUubGVuZ3RofTsKICAgIH0sCgogICAgY2xlYXJIaXN0b3J5OiBmdW5jdGlvbigpIHt0aGlzLnZpZXcuaGlzdG9yeSA9IG1ha2VIaXN0b3J5KCk7fSwKCiAgICBtYXJrQ2xlYW46IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnZpZXcuaGlzdG9yeS5kaXJ0eUNvdW50ZXIgPSAwOwogICAgICB0aGlzLnZpZXcuaGlzdG9yeS5sYXN0T3AgPSB0aGlzLnZpZXcuaGlzdG9yeS5sYXN0T3JpZ2luID0gbnVsbDsKICAgIH0sCgogICAgaXNDbGVhbjogZnVuY3Rpb24gKCkge3JldHVybiB0aGlzLnZpZXcuaGlzdG9yeS5kaXJ0eUNvdW50ZXIgPT0gMDt9LAogICAgICAKICAgIGdldEhpc3Rvcnk6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaGlzdCA9IHRoaXMudmlldy5oaXN0b3J5OwogICAgICBmdW5jdGlvbiBjcChhcnIpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbncgPSBbXSwgbndlbHQ7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHZhciBzZXQgPSBhcnJbaV07CiAgICAgICAgICBudy5wdXNoKHtldmVudHM6IG53ZWx0ID0gW10sIGZyb21CZWZvcmU6IHNldC5mcm9tQmVmb3JlLCB0b0JlZm9yZTogc2V0LnRvQmVmb3JlLAogICAgICAgICAgICAgICAgICAgZnJvbUFmdGVyOiBzZXQuZnJvbUFmdGVyLCB0b0FmdGVyOiBzZXQudG9BZnRlcn0pOwogICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGVsdCA9IHNldC5ldmVudHM7IGogPCBlbHQubGVuZ3RoOyArK2opIHsKICAgICAgICAgICAgdmFyIG9sZCA9IFtdLCBjdXIgPSBlbHRbal07CiAgICAgICAgICAgIG53ZWx0LnB1c2goe3N0YXJ0OiBjdXIuc3RhcnQsIGFkZGVkOiBjdXIuYWRkZWQsIG9sZDogb2xkfSk7CiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgY3VyLm9sZC5sZW5ndGg7ICsraykgb2xkLnB1c2goaGxUZXh0KGN1ci5vbGRba10pKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG53OwogICAgICB9CiAgICAgIHJldHVybiB7ZG9uZTogY3AoaGlzdC5kb25lKSwgdW5kb25lOiBjcChoaXN0LnVuZG9uZSl9OwogICAgfSwKCiAgICBzZXRIaXN0b3J5OiBmdW5jdGlvbihoaXN0RGF0YSkgewogICAgICB2YXIgaGlzdCA9IHRoaXMudmlldy5oaXN0b3J5ID0gbWFrZUhpc3RvcnkoKTsKICAgICAgaGlzdC5kb25lID0gaGlzdERhdGEuZG9uZTsKICAgICAgaGlzdC51bmRvbmUgPSBoaXN0RGF0YS51bmRvbmU7CiAgICB9LAoKICAgIC8vIEZldGNoIHRoZSBwYXJzZXIgdG9rZW4gZm9yIGEgZ2l2ZW4gY2hhcmFjdGVyLiBVc2VmdWwgZm9yIGhhY2tzCiAgICAvLyB0aGF0IHdhbnQgdG8gaW5zcGVjdCB0aGUgbW9kZSBzdGF0ZSAoc2F5LCBmb3IgY29tcGxldGlvbikuCiAgICBnZXRUb2tlbkF0OiBmdW5jdGlvbihwb3MpIHsKICAgICAgdmFyIGRvYyA9IHRoaXMudmlldy5kb2M7CiAgICAgIHBvcyA9IGNsaXBQb3MoZG9jLCBwb3MpOwogICAgICB2YXIgc3RhdGUgPSBnZXRTdGF0ZUJlZm9yZSh0aGlzLCBwb3MubGluZSksIG1vZGUgPSB0aGlzLnZpZXcubW9kZTsKICAgICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgcG9zLmxpbmUpOwogICAgICB2YXIgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShsaW5lLnRleHQsIHRoaXMub3B0aW9ucy50YWJTaXplKTsKICAgICAgd2hpbGUgKHN0cmVhbS5wb3MgPCBwb3MuY2ggJiYgIXN0cmVhbS5lb2woKSkgewogICAgICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7CiAgICAgICAgdmFyIHN0eWxlID0gbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICByZXR1cm4ge3N0YXJ0OiBzdHJlYW0uc3RhcnQsCiAgICAgICAgICAgICAgZW5kOiBzdHJlYW0ucG9zLAogICAgICAgICAgICAgIHN0cmluZzogc3RyZWFtLmN1cnJlbnQoKSwKICAgICAgICAgICAgICBjbGFzc05hbWU6IHN0eWxlIHx8IG51bGwsIC8vIERlcHJlY2F0ZWQsIHVzZSAndHlwZScgaW5zdGVhZAogICAgICAgICAgICAgIHR5cGU6IHN0eWxlIHx8IG51bGwsCiAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlfTsKICAgIH0sCgogICAgZ2V0U3RhdGVBZnRlcjogZnVuY3Rpb24obGluZSkgewogICAgICB2YXIgZG9jID0gdGhpcy52aWV3LmRvYzsKICAgICAgbGluZSA9IGNsaXBMaW5lKGRvYywgbGluZSA9PSBudWxsID8gZG9jLnNpemUgLSAxOiBsaW5lKTsKICAgICAgcmV0dXJuIGdldFN0YXRlQmVmb3JlKHRoaXMsIGxpbmUgKyAxKTsKICAgIH0sCgogICAgY3Vyc29yQ29vcmRzOiBmdW5jdGlvbihzdGFydCwgbW9kZSkgewogICAgICB2YXIgcG9zLCBzZWwgPSB0aGlzLnZpZXcuc2VsOwogICAgICBpZiAoc3RhcnQgPT0gbnVsbCkgcG9zID0gc2VsLmhlYWQ7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBzdGFydCA9PSAib2JqZWN0IikgcG9zID0gY2xpcFBvcyh0aGlzLnZpZXcuZG9jLCBzdGFydCk7CiAgICAgIGVsc2UgcG9zID0gc3RhcnQgPyBzZWwuZnJvbSA6IHNlbC50bzsKICAgICAgcmV0dXJuIGN1cnNvckNvb3Jkcyh0aGlzLCBwb3MsIG1vZGUgfHwgInBhZ2UiKTsKICAgIH0sCgogICAgY2hhckNvb3JkczogZnVuY3Rpb24ocG9zLCBtb2RlKSB7CiAgICAgIHJldHVybiBjaGFyQ29vcmRzKHRoaXMsIGNsaXBQb3ModGhpcy52aWV3LmRvYywgcG9zKSwgbW9kZSB8fCAicGFnZSIpOwogICAgfSwKCiAgICBjb29yZHNDaGFyOiBmdW5jdGlvbihjb29yZHMpIHsKICAgICAgdmFyIG9mZiA9IHRoaXMuZGlzcGxheS5saW5lU3BhY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHJldHVybiBjb29yZHNDaGFyKHRoaXMsIGNvb3Jkcy5sZWZ0IC0gb2ZmLmxlZnQsIGNvb3Jkcy50b3AgLSBvZmYudG9wKTsKICAgIH0sCgogICAgZGVmYXVsdFRleHRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGV4dEhlaWdodCh0aGlzLmRpc3BsYXkpOyB9LAoKICAgIG1hcmtUZXh0OiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIG1hcmtUZXh0KHRoaXMsIGNsaXBQb3ModGhpcy52aWV3LmRvYywgZnJvbSksIGNsaXBQb3ModGhpcy52aWV3LmRvYywgdG8pLAogICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgInJhbmdlIik7CiAgICB9KSwKCiAgICBzZXRCb29rbWFyazogb3BlcmF0aW9uKG51bGwsIGZ1bmN0aW9uKHBvcywgd2lkZ2V0KSB7CiAgICAgIHBvcyA9IGNsaXBQb3ModGhpcy52aWV3LmRvYywgcG9zKTsKICAgICAgcmV0dXJuIG1hcmtUZXh0KHRoaXMsIHBvcywgcG9zLCB3aWRnZXQgPyB7cmVwbGFjZWRXaXRoOiB3aWRnZXR9IDoge30sICJib29rbWFyayIpOwogICAgfSksCgogICAgZmluZE1hcmtzQXQ6IGZ1bmN0aW9uKHBvcykgewogICAgICB2YXIgZG9jID0gdGhpcy52aWV3LmRvYzsKICAgICAgcG9zID0gY2xpcFBvcyhkb2MsIHBvcyk7CiAgICAgIHZhciBtYXJrZXJzID0gW10sIHNwYW5zID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKS5tYXJrZWRTcGFuczsKICAgICAgaWYgKHNwYW5zKSBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTsKICAgICAgICBpZiAoKHNwYW4uZnJvbSA9PSBudWxsIHx8IHNwYW4uZnJvbSA8PSBwb3MuY2gpICYmCiAgICAgICAgICAgIChzcGFuLnRvID09IG51bGwgfHwgc3Bhbi50byA+PSBwb3MuY2gpKQogICAgICAgICAgbWFya2Vycy5wdXNoKHNwYW4ubWFya2VyKTsKICAgICAgfQogICAgICByZXR1cm4gbWFya2VyczsKICAgIH0sCgogICAgc2V0R3V0dGVyTWFya2VyOiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24obGluZSwgZ3V0dGVySUQsIHZhbHVlKSB7CiAgICAgIHJldHVybiBjaGFuZ2VMaW5lKHRoaXMsIGxpbmUsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgbWFya2VycyA9IGxpbmUuZ3V0dGVyTWFya2VycyB8fCAobGluZS5ndXR0ZXJNYXJrZXJzID0ge30pOwogICAgICAgIG1hcmtlcnNbZ3V0dGVySURdID0gdmFsdWU7CiAgICAgICAgaWYgKCF2YWx1ZSAmJiBpc0VtcHR5KG1hcmtlcnMpKSBsaW5lLmd1dHRlck1hcmtlcnMgPSBudWxsOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9KTsKICAgIH0pLAoKICAgIGNsZWFyR3V0dGVyOiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24oZ3V0dGVySUQpIHsKICAgICAgdmFyIGkgPSAwLCBjbSA9IHRoaXMsIGRvYyA9IGNtLnZpZXcuZG9jOwogICAgICBkb2MuaXRlcigwLCBkb2Muc2l6ZSwgZnVuY3Rpb24obGluZSkgewogICAgICAgIGlmIChsaW5lLmd1dHRlck1hcmtlcnMgJiYgbGluZS5ndXR0ZXJNYXJrZXJzW2d1dHRlcklEXSkgewogICAgICAgICAgbGluZS5ndXR0ZXJNYXJrZXJzW2d1dHRlcklEXSA9IG51bGw7CiAgICAgICAgICByZWdDaGFuZ2UoY20sIGksIGkgKyAxKTsKICAgICAgICAgIGlmIChpc0VtcHR5KGxpbmUuZ3V0dGVyTWFya2VycykpIGxpbmUuZ3V0dGVyTWFya2VycyA9IG51bGw7CiAgICAgICAgfQogICAgICAgICsraTsKICAgICAgfSk7CiAgICB9KSwKCiAgICBhZGRMaW5lQ2xhc3M6IG9wZXJhdGlvbihudWxsLCBmdW5jdGlvbihoYW5kbGUsIHdoZXJlLCBjbHMpIHsKICAgICAgcmV0dXJuIGNoYW5nZUxpbmUodGhpcywgaGFuZGxlLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIHByb3AgPSB3aGVyZSA9PSAidGV4dCIgPyAidGV4dENsYXNzIiA6IHdoZXJlID09ICJiYWNrZ3JvdW5kIiA/ICJiZ0NsYXNzIiA6ICJ3cmFwQ2xhc3MiOwogICAgICAgIGlmICghbGluZVtwcm9wXSkgbGluZVtwcm9wXSA9IGNsczsKICAgICAgICBlbHNlIGlmIChuZXcgUmVnRXhwKCJcXGIiICsgY2xzICsgIlxcYiIpLnRlc3QobGluZVtwcm9wXSkpIHJldHVybiBmYWxzZTsKICAgICAgICBlbHNlIGxpbmVbcHJvcF0gKz0gIiAiICsgY2xzOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9KTsKICAgIH0pLAoKICAgIHJlbW92ZUxpbmVDbGFzczogb3BlcmF0aW9uKG51bGwsIGZ1bmN0aW9uKGhhbmRsZSwgd2hlcmUsIGNscykgewogICAgICByZXR1cm4gY2hhbmdlTGluZSh0aGlzLCBoYW5kbGUsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgcHJvcCA9IHdoZXJlID09ICJ0ZXh0IiA/ICJ0ZXh0Q2xhc3MiIDogd2hlcmUgPT0gImJhY2tncm91bmQiID8gImJnQ2xhc3MiIDogIndyYXBDbGFzcyI7CiAgICAgICAgdmFyIGN1ciA9IGxpbmVbcHJvcF07CiAgICAgICAgaWYgKCFjdXIpIHJldHVybiBmYWxzZTsKICAgICAgICBlbHNlIGlmIChjbHMgPT0gbnVsbCkgbGluZVtwcm9wXSA9IG51bGw7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgdXBkID0gY3VyLnJlcGxhY2UobmV3IFJlZ0V4cCgiXiIgKyBjbHMgKyAiXFxiXFxzKnxcXHMqXFxiIiArIGNscyArICJcXGIiKSwgIiIpOwogICAgICAgICAgaWYgKHVwZCA9PSBjdXIpIHJldHVybiBmYWxzZTsKICAgICAgICAgIGxpbmVbcHJvcF0gPSB1cGQgfHwgbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0pOwogICAgfSksCgogICAgYWRkTGluZVdpZGdldDogb3BlcmF0aW9uKG51bGwsIGZ1bmN0aW9uKGhhbmRsZSwgbm9kZSwgb3B0aW9ucykgewogICAgICB2YXIgd2lkZ2V0ID0gb3B0aW9ucyB8fCB7fTsKICAgICAgd2lkZ2V0Lm5vZGUgPSBub2RlOwogICAgICBpZiAod2lkZ2V0Lm5vSFNjcm9sbCkgdGhpcy5kaXNwbGF5LmFsaWduV2lkZ2V0cyA9IHRydWU7CiAgICAgIGNoYW5nZUxpbmUodGhpcywgaGFuZGxlLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgKGxpbmUud2lkZ2V0cyB8fCAobGluZS53aWRnZXRzID0gW10pKS5wdXNoKHdpZGdldCk7CiAgICAgICAgd2lkZ2V0LmxpbmUgPSBsaW5lOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9KTsKICAgICAgcmV0dXJuIHdpZGdldDsKICAgIH0pLAoKICAgIHJlbW92ZUxpbmVXaWRnZXQ6IG9wZXJhdGlvbihudWxsLCBmdW5jdGlvbih3aWRnZXQpIHsKICAgICAgdmFyIHdzID0gd2lkZ2V0LmxpbmUud2lkZ2V0cywgbm8gPSBsaW5lTm8od2lkZ2V0LmxpbmUpOwogICAgICBpZiAobm8gPT0gbnVsbCkgcmV0dXJuOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdzLmxlbmd0aDsgKytpKSBpZiAod3NbaV0gPT0gd2lkZ2V0KSB3cy5zcGxpY2UoaS0tLCAxKTsKICAgICAgcmVnQ2hhbmdlKHRoaXMsIG5vLCBubyArIDEpOwogICAgfSksCgogICAgbGluZUluZm86IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgaWYgKHR5cGVvZiBsaW5lID09ICJudW1iZXIiKSB7CiAgICAgICAgaWYgKCFpc0xpbmUodGhpcy52aWV3LmRvYywgbGluZSkpIHJldHVybiBudWxsOwogICAgICAgIHZhciBuID0gbGluZTsKICAgICAgICBsaW5lID0gZ2V0TGluZSh0aGlzLnZpZXcuZG9jLCBsaW5lKTsKICAgICAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBuID0gbGluZU5vKGxpbmUpOwogICAgICAgIGlmIChuID09IG51bGwpIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB7bGluZTogbiwgaGFuZGxlOiBsaW5lLCB0ZXh0OiBsaW5lLnRleHQsIGd1dHRlck1hcmtlcnM6IGxpbmUuZ3V0dGVyTWFya2VycywKICAgICAgICAgICAgICB0ZXh0Q2xhc3M6IGxpbmUudGV4dENsYXNzLCBiZ0NsYXNzOiBsaW5lLmJnQ2xhc3MsIHdyYXBDbGFzczogbGluZS53cmFwQ2xhc3MsCiAgICAgICAgICAgICAgd2lkZ2V0czogbGluZS53aWRnZXRzfTsKICAgIH0sCgogICAgZ2V0Vmlld3BvcnQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4ge2Zyb206IHRoaXMuZGlzcGxheS5zaG93aW5nRnJvbSwgdG86IHRoaXMuZGlzcGxheS5zaG93aW5nVG99O30sCgogICAgYWRkV2lkZ2V0OiBmdW5jdGlvbihwb3MsIG5vZGUsIHNjcm9sbCwgdmVydCwgaG9yaXopIHsKICAgICAgdmFyIGRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7CiAgICAgIHBvcyA9IGN1cnNvckNvb3Jkcyh0aGlzLCBjbGlwUG9zKHRoaXMudmlldy5kb2MsIHBvcykpOwogICAgICB2YXIgdG9wID0gcG9zLnRvcCwgbGVmdCA9IHBvcy5sZWZ0OwogICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgICAgZGlzcGxheS5zaXplci5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgaWYgKHZlcnQgPT0gIm92ZXIiKSB0b3AgPSBwb3MudG9wOwogICAgICBlbHNlIGlmICh2ZXJ0ID09ICJuZWFyIikgewogICAgICAgIHZhciB2c3BhY2UgPSBNYXRoLm1heChkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0LCB0aGlzLnZpZXcuZG9jLmhlaWdodCksCiAgICAgICAgaHNwYWNlID0gTWF0aC5tYXgoZGlzcGxheS5zaXplci5jbGllbnRXaWR0aCwgZGlzcGxheS5saW5lU3BhY2UuY2xpZW50V2lkdGgpOwogICAgICAgIGlmIChwb3MuYm90dG9tICsgbm9kZS5vZmZzZXRIZWlnaHQgPiB2c3BhY2UgJiYgcG9zLnRvcCA+IG5vZGUub2Zmc2V0SGVpZ2h0KQogICAgICAgICAgdG9wID0gcG9zLnRvcCAtIG5vZGUub2Zmc2V0SGVpZ2h0OwogICAgICAgIGlmIChsZWZ0ICsgbm9kZS5vZmZzZXRXaWR0aCA+IGhzcGFjZSkKICAgICAgICAgIGxlZnQgPSBoc3BhY2UgLSBub2RlLm9mZnNldFdpZHRoOwogICAgICB9CiAgICAgIG5vZGUuc3R5bGUudG9wID0gKHRvcCArIHBhZGRpbmdUb3AoZGlzcGxheSkpICsgInB4IjsKICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gbm9kZS5zdHlsZS5yaWdodCA9ICIiOwogICAgICBpZiAoaG9yaXogPT0gInJpZ2h0IikgewogICAgICAgIGxlZnQgPSBkaXNwbGF5LnNpemVyLmNsaWVudFdpZHRoIC0gbm9kZS5vZmZzZXRXaWR0aDsKICAgICAgICBub2RlLnN0eWxlLnJpZ2h0ID0gIjBweCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGhvcml6ID09ICJsZWZ0IikgbGVmdCA9IDA7CiAgICAgICAgZWxzZSBpZiAoaG9yaXogPT0gIm1pZGRsZSIpIGxlZnQgPSAoZGlzcGxheS5zaXplci5jbGllbnRXaWR0aCAtIG5vZGUub2Zmc2V0V2lkdGgpIC8gMjsKICAgICAgICBub2RlLnN0eWxlLmxlZnQgPSBsZWZ0ICsgInB4IjsKICAgICAgfQogICAgICBpZiAoc2Nyb2xsKQogICAgICAgIHNjcm9sbEludG9WaWV3KHRoaXMsIGxlZnQsIHRvcCwgbGVmdCArIG5vZGUub2Zmc2V0V2lkdGgsIHRvcCArIG5vZGUub2Zmc2V0SGVpZ2h0KTsKICAgIH0sCgogICAgbGluZUNvdW50OiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy52aWV3LmRvYy5zaXplO30sCgogICAgY2xpcFBvczogZnVuY3Rpb24ocG9zKSB7cmV0dXJuIGNsaXBQb3ModGhpcy52aWV3LmRvYywgcG9zKTt9LAoKICAgIGdldEN1cnNvcjogZnVuY3Rpb24oc3RhcnQpIHsKICAgICAgdmFyIHNlbCA9IHRoaXMudmlldy5zZWwsIHBvczsKICAgICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPT0gImhlYWQiKSBwb3MgPSBzZWwuaGVhZDsKICAgICAgZWxzZSBpZiAoc3RhcnQgPT0gImFuY2hvciIpIHBvcyA9IHNlbC5hbmNob3I7CiAgICAgIGVsc2UgaWYgKHN0YXJ0ID09ICJlbmQiIHx8IHN0YXJ0ID09PSBmYWxzZSkgcG9zID0gc2VsLnRvOwogICAgICBlbHNlIHBvcyA9IHNlbC5mcm9tOwogICAgICByZXR1cm4gY29weVBvcyhwb3MpOwogICAgfSwKCiAgICBzb21ldGhpbmdTZWxlY3RlZDogZnVuY3Rpb24oKSB7cmV0dXJuICFwb3NFcSh0aGlzLnZpZXcuc2VsLmZyb20sIHRoaXMudmlldy5zZWwudG8pO30sCgogICAgc2V0Q3Vyc29yOiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24obGluZSwgY2gsIGV4dGVuZCkgewogICAgICB2YXIgcG9zID0gY2xpcFBvcyh0aGlzLnZpZXcuZG9jLCB0eXBlb2YgbGluZSA9PSAibnVtYmVyIiA/IHtsaW5lOiBsaW5lLCBjaDogY2ggfHwgMH0gOiBsaW5lKTsKICAgICAgaWYgKGV4dGVuZCkgZXh0ZW5kU2VsZWN0aW9uKHRoaXMsIHBvcyk7CiAgICAgIGVsc2Ugc2V0U2VsZWN0aW9uKHRoaXMsIHBvcywgcG9zKTsKICAgIH0pLAoKICAgIHNldFNlbGVjdGlvbjogb3BlcmF0aW9uKG51bGwsIGZ1bmN0aW9uKGFuY2hvciwgaGVhZCkgewogICAgICB2YXIgZG9jID0gdGhpcy52aWV3LmRvYzsKICAgICAgc2V0U2VsZWN0aW9uKHRoaXMsIGNsaXBQb3MoZG9jLCBhbmNob3IpLCBjbGlwUG9zKGRvYywgaGVhZCB8fCBhbmNob3IpKTsKICAgIH0pLAoKICAgIGV4dGVuZFNlbGVjdGlvbjogb3BlcmF0aW9uKG51bGwsIGZ1bmN0aW9uKGZyb20sIHRvKSB7CiAgICAgIHZhciBkb2MgPSB0aGlzLnZpZXcuZG9jOwogICAgICBleHRlbmRTZWxlY3Rpb24odGhpcywgY2xpcFBvcyhkb2MsIGZyb20pLCB0byAmJiBjbGlwUG9zKGRvYywgdG8pKTsKICAgIH0pLAoKICAgIHNldEV4dGVuZGluZzogZnVuY3Rpb24odmFsKSB7dGhpcy52aWV3LnNlbC5leHRlbmQgPSB2YWw7fSwKCiAgICBnZXRMaW5lOiBmdW5jdGlvbihsaW5lKSB7dmFyIGwgPSB0aGlzLmdldExpbmVIYW5kbGUobGluZSk7IHJldHVybiBsICYmIGwudGV4dDt9LAoKICAgIGdldExpbmVIYW5kbGU6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIGRvYyA9IHRoaXMudmlldy5kb2M7CiAgICAgIGlmIChpc0xpbmUoZG9jLCBsaW5lKSkgcmV0dXJuIGdldExpbmUoZG9jLCBsaW5lKTsKICAgIH0sCgogICAgZ2V0TGluZU51bWJlcjogZnVuY3Rpb24obGluZSkge3JldHVybiBsaW5lTm8obGluZSk7fSwKCiAgICBzZXRMaW5lOiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24obGluZSwgdGV4dCkgewogICAgICBpZiAoaXNMaW5lKHRoaXMudmlldy5kb2MsIGxpbmUpKQogICAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCB0ZXh0LCB7bGluZTogbGluZSwgY2g6IDB9LCB7bGluZTogbGluZSwgY2g6IGdldExpbmUodGhpcy52aWV3LmRvYywgbGluZSkudGV4dC5sZW5ndGh9KTsKICAgIH0pLAoKICAgIHJlbW92ZUxpbmU6IG9wZXJhdGlvbihudWxsLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgIGlmIChpc0xpbmUodGhpcy52aWV3LmRvYywgbGluZSkpCiAgICAgICAgcmVwbGFjZVJhbmdlKHRoaXMsICIiLCB7bGluZTogbGluZSwgY2g6IDB9LCBjbGlwUG9zKHRoaXMudmlldy5kb2MsIHtsaW5lOiBsaW5lKzEsIGNoOiAwfSkpOwogICAgfSksCgogICAgcmVwbGFjZVJhbmdlOiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24oY29kZSwgZnJvbSwgdG8pIHsKICAgICAgdmFyIGRvYyA9IHRoaXMudmlldy5kb2M7CiAgICAgIGZyb20gPSBjbGlwUG9zKGRvYywgZnJvbSk7CiAgICAgIHRvID0gdG8gPyBjbGlwUG9zKGRvYywgdG8pIDogZnJvbTsKICAgICAgcmV0dXJuIHJlcGxhY2VSYW5nZSh0aGlzLCBjb2RlLCBmcm9tLCB0byk7CiAgICB9KSwKCiAgICBnZXRSYW5nZTogZnVuY3Rpb24oZnJvbSwgdG8sIGxpbmVTZXApIHsKICAgICAgdmFyIGRvYyA9IHRoaXMudmlldy5kb2M7CiAgICAgIGZyb20gPSBjbGlwUG9zKGRvYywgZnJvbSk7IHRvID0gY2xpcFBvcyhkb2MsIHRvKTsKICAgICAgdmFyIGwxID0gZnJvbS5saW5lLCBsMiA9IHRvLmxpbmU7CiAgICAgIGlmIChsMSA9PSBsMikgcmV0dXJuIGdldExpbmUoZG9jLCBsMSkudGV4dC5zbGljZShmcm9tLmNoLCB0by5jaCk7CiAgICAgIHZhciBjb2RlID0gW2dldExpbmUoZG9jLCBsMSkudGV4dC5zbGljZShmcm9tLmNoKV07CiAgICAgIGRvYy5pdGVyKGwxICsgMSwgbDIsIGZ1bmN0aW9uKGxpbmUpIHsgY29kZS5wdXNoKGxpbmUudGV4dCk7IH0pOwogICAgICBjb2RlLnB1c2goZ2V0TGluZShkb2MsIGwyKS50ZXh0LnNsaWNlKDAsIHRvLmNoKSk7CiAgICAgIHJldHVybiBjb2RlLmpvaW4obGluZVNlcCB8fCAiXG4iKTsKICAgIH0sCgogICAgdHJpZ2dlck9uS2V5RG93bjogb3BlcmF0aW9uKG51bGwsIG9uS2V5RG93biksCgogICAgZXhlY0NvbW1hbmQ6IGZ1bmN0aW9uKGNtZCkge3JldHVybiBjb21tYW5kc1tjbWRdKHRoaXMpO30sCgogICAgLy8gU3R1ZmYgdXNlZCBieSBjb21tYW5kcywgcHJvYmFibHkgbm90IG11Y2ggdXNlIHRvIG91dHNpZGUgY29kZS4KICAgIG1vdmVIOiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24oZGlyLCB1bml0KSB7CiAgICAgIHZhciBzZWwgPSB0aGlzLnZpZXcuc2VsLCBwb3MgPSBkaXIgPCAwID8gc2VsLmZyb20gOiBzZWwudG87CiAgICAgIGlmIChzZWwuc2hpZnQgfHwgc2VsLmV4dGVuZCB8fCBwb3NFcShzZWwuZnJvbSwgc2VsLnRvKSkgcG9zID0gZmluZFBvc0godGhpcywgZGlyLCB1bml0LCB0cnVlKTsKICAgICAgZXh0ZW5kU2VsZWN0aW9uKHRoaXMsIHBvcywgcG9zLCBkaXIpOwogICAgfSksCgogICAgZGVsZXRlSDogb3BlcmF0aW9uKG51bGwsIGZ1bmN0aW9uKGRpciwgdW5pdCkgewogICAgICB2YXIgc2VsID0gdGhpcy52aWV3LnNlbDsKICAgICAgaWYgKCFwb3NFcShzZWwuZnJvbSwgc2VsLnRvKSkgcmVwbGFjZVJhbmdlKHRoaXMsICIiLCBzZWwuZnJvbSwgc2VsLnRvLCAiZGVsZXRlIik7CiAgICAgIGVsc2UgcmVwbGFjZVJhbmdlKHRoaXMsICIiLCBzZWwuZnJvbSwgZmluZFBvc0godGhpcywgZGlyLCB1bml0LCBmYWxzZSksICJkZWxldGUiKTsKICAgICAgdGhpcy5jdXJPcC51c2VyU2VsQ2hhbmdlID0gdHJ1ZTsKICAgIH0pLAoKICAgIG1vdmVWOiBvcGVyYXRpb24obnVsbCwgZnVuY3Rpb24oZGlyLCB1bml0KSB7CiAgICAgIHZhciB2aWV3ID0gdGhpcy52aWV3LCBkb2MgPSB2aWV3LmRvYywgZGlzcGxheSA9IHRoaXMuZGlzcGxheTsKICAgICAgdmFyIGN1ciA9IHZpZXcuc2VsLmhlYWQsIHBvcyA9IGN1cnNvckNvb3Jkcyh0aGlzLCBjdXIsICJkaXYiKTsKICAgICAgdmFyIHggPSBwb3MubGVmdCwgeTsKICAgICAgaWYgKHZpZXcuZ29hbENvbHVtbiAhPSBudWxsKSB4ID0gdmlldy5nb2FsQ29sdW1uOwogICAgICBpZiAodW5pdCA9PSAicGFnZSIpIHsKICAgICAgICB2YXIgcGFnZVNpemUgPSBNYXRoLm1pbihkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk7CiAgICAgICAgeSA9IHBvcy50b3AgKyBkaXIgKiBwYWdlU2l6ZTsKICAgICAgfSBlbHNlIGlmICh1bml0ID09ICJsaW5lIikgewogICAgICAgIHkgPSBkaXIgPiAwID8gcG9zLmJvdHRvbSArIDMgOiBwb3MudG9wIC0gMzsKICAgICAgfQogICAgICBkbyB7CiAgICAgICAgdmFyIHRhcmdldCA9IGNvb3Jkc0NoYXIodGhpcywgeCwgeSk7CiAgICAgICAgeSArPSBkaXIgKiA1OwogICAgICB9IHdoaWxlICh0YXJnZXQub3V0c2lkZSAmJiAoZGlyIDwgMCA/IHkgPiAwIDogeSA8IGRvYy5oZWlnaHQpKTsKCiAgICAgIGlmICh1bml0ID09ICJwYWdlIikgZGlzcGxheS5zY3JvbGxiYXJWLnNjcm9sbFRvcCArPSBjaGFyQ29vcmRzKHRoaXMsIHRhcmdldCwgImRpdiIpLnRvcCAtIHBvcy50b3A7CiAgICAgIGV4dGVuZFNlbGVjdGlvbih0aGlzLCB0YXJnZXQsIHRhcmdldCwgZGlyKTsKICAgICAgdmlldy5nb2FsQ29sdW1uID0geDsKICAgIH0pLAoKICAgIHRvZ2dsZU92ZXJ3cml0ZTogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLnZpZXcub3ZlcndyaXRlID0gIXRoaXMudmlldy5vdmVyd3JpdGUpCiAgICAgICAgdGhpcy5kaXNwbGF5LmN1cnNvci5jbGFzc05hbWUgKz0gIiBDb2RlTWlycm9yLW92ZXJ3cml0ZSI7CiAgICAgIGVsc2UKICAgICAgICB0aGlzLmRpc3BsYXkuY3Vyc29yLmNsYXNzTmFtZSA9IHRoaXMuZGlzcGxheS5jdXJzb3IuY2xhc3NOYW1lLnJlcGxhY2UoIiBDb2RlTWlycm9yLW92ZXJ3cml0ZSIsICIiKTsKICAgIH0sCgogICAgcG9zRnJvbUluZGV4OiBmdW5jdGlvbihvZmYpIHsKICAgICAgdmFyIGxpbmVObyA9IDAsIGNoLCBkb2MgPSB0aGlzLnZpZXcuZG9jOwogICAgICBkb2MuaXRlcigwLCBkb2Muc2l6ZSwgZnVuY3Rpb24obGluZSkgewogICAgICAgIHZhciBzeiA9IGxpbmUudGV4dC5sZW5ndGggKyAxOwogICAgICAgIGlmIChzeiA+IG9mZikgeyBjaCA9IG9mZjsgcmV0dXJuIHRydWU7IH0KICAgICAgICBvZmYgLT0gc3o7CiAgICAgICAgKytsaW5lTm87CiAgICAgIH0pOwogICAgICByZXR1cm4gY2xpcFBvcyhkb2MsIHtsaW5lOiBsaW5lTm8sIGNoOiBjaH0pOwogICAgfSwKICAgIGluZGV4RnJvbVBvczogZnVuY3Rpb24gKGNvb3JkcykgewogICAgICBpZiAoY29vcmRzLmxpbmUgPCAwIHx8IGNvb3Jkcy5jaCA8IDApIHJldHVybiAwOwogICAgICB2YXIgaW5kZXggPSBjb29yZHMuY2g7CiAgICAgIHRoaXMudmlldy5kb2MuaXRlcigwLCBjb29yZHMubGluZSwgZnVuY3Rpb24gKGxpbmUpIHsKICAgICAgICBpbmRleCArPSBsaW5lLnRleHQubGVuZ3RoICsgMTsKICAgICAgfSk7CiAgICAgIHJldHVybiBpbmRleDsKICAgIH0sCgogICAgc2Nyb2xsVG86IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgaWYgKHggIT0gbnVsbCkgdGhpcy5kaXNwbGF5LnNjcm9sbGJhckguc2Nyb2xsTGVmdCA9IHRoaXMuZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0ID0geDsKICAgICAgaWYgKHkgIT0gbnVsbCkgdGhpcy5kaXNwbGF5LnNjcm9sbGJhclYuc2Nyb2xsVG9wID0gdGhpcy5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCA9IHk7CiAgICAgIHVwZGF0ZURpc3BsYXkodGhpcywgW10pOwogICAgfSwKICAgIGdldFNjcm9sbEluZm86IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc2Nyb2xsZXIgPSB0aGlzLmRpc3BsYXkuc2Nyb2xsZXIsIGNvID0gc2Nyb2xsZXJDdXRPZmY7CiAgICAgIHJldHVybiB7bGVmdDogc2Nyb2xsZXIuc2Nyb2xsTGVmdCwgdG9wOiBzY3JvbGxlci5zY3JvbGxUb3AsCiAgICAgICAgICAgICAgaGVpZ2h0OiBzY3JvbGxlci5zY3JvbGxIZWlnaHQgLSBjbywgd2lkdGg6IHNjcm9sbGVyLnNjcm9sbFdpZHRoIC0gY28sCiAgICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBzY3JvbGxlci5jbGllbnRIZWlnaHQgLSBjbywgY2xpZW50V2lkdGg6IHNjcm9sbGVyLmNsaWVudFdpZHRoIC0gY299OwogICAgfSwKCiAgICBzY3JvbGxJbnRvVmlldzogZnVuY3Rpb24ocG9zKSB7CiAgICAgIGlmICh0eXBlb2YgcG9zID09ICJudW1iZXIiKSBwb3MgPSB7bGluZTogcG9zLCBjaDogMH07CiAgICAgIHBvcyA9IHBvcyA/IGNsaXBQb3ModGhpcy52aWV3LmRvYywgcG9zKSA6IHRoaXMudmlldy5zZWwuaGVhZDsKICAgICAgc2Nyb2xsUG9zSW50b1ZpZXcodGhpcywgcG9zKTsKICAgIH0sCgogICAgc2V0U2l6ZTogZnVuY3Rpb24od2lkdGgsIGhlaWdodCkgewogICAgICBmdW5jdGlvbiBpbnRlcnByZXQodmFsKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gIm51bWJlciIgfHwgL15cZCskLy50ZXN0KFN0cmluZyh2YWwpKSA/IHZhbCArICJweCIgOiB2YWw7CiAgICAgIH0KICAgICAgaWYgKHdpZHRoICE9IG51bGwpIHRoaXMuZGlzcGxheS53cmFwcGVyLnN0eWxlLndpZHRoID0gaW50ZXJwcmV0KHdpZHRoKTsKICAgICAgaWYgKGhlaWdodCAhPSBudWxsKSB0aGlzLmRpc3BsYXkud3JhcHBlci5zdHlsZS5oZWlnaHQgPSBpbnRlcnByZXQoaGVpZ2h0KTsKICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICB9LAoKICAgIG9uOiBmdW5jdGlvbih0eXBlLCBmKSB7b24odGhpcywgdHlwZSwgZik7fSwKICAgIG9mZjogZnVuY3Rpb24odHlwZSwgZikge29mZih0aGlzLCB0eXBlLCBmKTt9LAoKICAgIG9wZXJhdGlvbjogZnVuY3Rpb24oZil7cmV0dXJuIG9wZXJhdGlvbih0aGlzLCBmKSgpO30sCgogICAgcmVmcmVzaDogZnVuY3Rpb24oKSB7CiAgICAgIGNsZWFyQ2FjaGVzKHRoaXMpOwogICAgICBpZiAodGhpcy5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbEhlaWdodCA+IHRoaXMudmlldy5zY3JvbGxUb3ApCiAgICAgICAgdGhpcy5kaXNwbGF5LnNjcm9sbGJhclYuc2Nyb2xsVG9wID0gdGhpcy5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCA9IHRoaXMudmlldy5zY3JvbGxUb3A7CiAgICAgIHVwZGF0ZURpc3BsYXkodGhpcywgdHJ1ZSk7CiAgICB9LAoKICAgIGdldElucHV0RmllbGQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS5pbnB1dDt9LAogICAgZ2V0V3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS53cmFwcGVyO30sCiAgICBnZXRTY3JvbGxlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS5zY3JvbGxlcjt9LAogICAgZ2V0R3V0dGVyRWxlbWVudDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5Lmd1dHRlcnM7fQogIH07CgogIC8vIE9QVElPTiBERUZBVUxUUwoKICB2YXIgb3B0aW9uSGFuZGxlcnMgPSBDb2RlTWlycm9yLm9wdGlvbkhhbmRsZXJzID0ge307CgogIC8vIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KICB2YXIgZGVmYXVsdHMgPSBDb2RlTWlycm9yLmRlZmF1bHRzID0ge307CgogIGZ1bmN0aW9uIG9wdGlvbihuYW1lLCBkZWZsdCwgaGFuZGxlLCBub3RPbkluaXQpIHsKICAgIENvZGVNaXJyb3IuZGVmYXVsdHNbbmFtZV0gPSBkZWZsdDsKICAgIGlmIChoYW5kbGUpIG9wdGlvbkhhbmRsZXJzW25hbWVdID0KICAgICAgbm90T25Jbml0ID8gZnVuY3Rpb24oY20sIHZhbCwgb2xkKSB7aWYgKG9sZCAhPSBJbml0KSBoYW5kbGUoY20sIHZhbCwgb2xkKTt9IDogaGFuZGxlOwogIH0KCiAgdmFyIEluaXQgPSBDb2RlTWlycm9yLkluaXQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uKCl7cmV0dXJuICJDb2RlTWlycm9yLkluaXQiO319OwoKICAvLyBUaGVzZSB0d28gYXJlLCBvbiBpbml0LCBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSB0aGV5CiAgLy8gaGF2ZSB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGVkaXRvciBjYW4gc3RhcnQgYXQgYWxsLgogIG9wdGlvbigidmFsdWUiLCAiIiwgZnVuY3Rpb24oY20sIHZhbCkge2NtLnNldFZhbHVlKHZhbCk7fSwgdHJ1ZSk7CiAgb3B0aW9uKCJtb2RlIiwgbnVsbCwgbG9hZE1vZGUsIHRydWUpOwoKICBvcHRpb24oImluZGVudFVuaXQiLCAyLCBsb2FkTW9kZSwgdHJ1ZSk7CiAgb3B0aW9uKCJpbmRlbnRXaXRoVGFicyIsIGZhbHNlKTsKICBvcHRpb24oInNtYXJ0SW5kZW50IiwgdHJ1ZSk7CiAgb3B0aW9uKCJ0YWJTaXplIiwgNCwgZnVuY3Rpb24oY20pIHsKICAgIGxvYWRNb2RlKGNtKTsKICAgIGNsZWFyQ2FjaGVzKGNtKTsKICAgIHVwZGF0ZURpc3BsYXkoY20sIHRydWUpOwogIH0sIHRydWUpOwogIG9wdGlvbigiZWxlY3RyaWNDaGFycyIsIHRydWUpOwoKICBvcHRpb24oInRoZW1lIiwgImRlZmF1bHQiLCBmdW5jdGlvbihjbSkgewogICAgdGhlbWVDaGFuZ2VkKGNtKTsKICAgIGd1dHRlcnNDaGFuZ2VkKGNtKTsKICB9LCB0cnVlKTsKICBvcHRpb24oImtleU1hcCIsICJkZWZhdWx0Iiwga2V5TWFwQ2hhbmdlZCk7CiAgb3B0aW9uKCJleHRyYUtleXMiLCBudWxsKTsKCiAgb3B0aW9uKCJvbktleUV2ZW50IiwgbnVsbCk7CiAgb3B0aW9uKCJvbkRyYWdFdmVudCIsIG51bGwpOwoKICBvcHRpb24oImxpbmVXcmFwcGluZyIsIGZhbHNlLCB3cmFwcGluZ0NoYW5nZWQsIHRydWUpOwogIG9wdGlvbigiZ3V0dGVycyIsIFtdLCBmdW5jdGlvbihjbSkgewogICAgc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKGNtLm9wdGlvbnMpOwogICAgZ3V0dGVyc0NoYW5nZWQoY20pOwogIH0sIHRydWUpOwogIG9wdGlvbigibGluZU51bWJlcnMiLCBmYWxzZSwgZnVuY3Rpb24oY20pIHsKICAgIHNldEd1dHRlcnNGb3JMaW5lTnVtYmVycyhjbS5vcHRpb25zKTsKICAgIGd1dHRlcnNDaGFuZ2VkKGNtKTsKICB9LCB0cnVlKTsKICBvcHRpb24oImZpcnN0TGluZU51bWJlciIsIDEsIGd1dHRlcnNDaGFuZ2VkLCB0cnVlKTsKICBvcHRpb24oImxpbmVOdW1iZXJGb3JtYXR0ZXIiLCBmdW5jdGlvbihpbnRlZ2VyKSB7cmV0dXJuIGludGVnZXI7fSwgZ3V0dGVyc0NoYW5nZWQsIHRydWUpOwogIG9wdGlvbigic2hvd0N1cnNvcldoZW5TZWxlY3RpbmciLCBmYWxzZSwgdXBkYXRlU2VsZWN0aW9uLCB0cnVlKTsKICAKICBvcHRpb24oInJlYWRPbmx5IiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwpIHsKICAgIGlmICh2YWwgPT0gIm5vY3Vyc29yIikge29uQmx1cihjbSk7IGNtLmRpc3BsYXkuaW5wdXQuYmx1cigpO30KICAgIGVsc2UgaWYgKCF2YWwpIHJlc2V0SW5wdXQoY20sIHRydWUpOwogIH0pOwogIG9wdGlvbigiZHJhZ0Ryb3AiLCB0cnVlKTsKCiAgb3B0aW9uKCJjdXJzb3JCbGlua1JhdGUiLCA1MzApOwogIG9wdGlvbigiY3Vyc29ySGVpZ2h0IiwgMSk7CiAgb3B0aW9uKCJ3b3JrVGltZSIsIDEwMCk7CiAgb3B0aW9uKCJ3b3JrRGVsYXkiLCAxMDApOwogIG9wdGlvbigiZmxhdHRlblNwYW5zIiwgdHJ1ZSk7CiAgb3B0aW9uKCJwb2xsSW50ZXJ2YWwiLCAxMDApOwogIG9wdGlvbigidW5kb0RlcHRoIiwgNDApOwogIG9wdGlvbigidmlld3BvcnRNYXJnaW4iLCAxMCwgZnVuY3Rpb24oY20pe2NtLnJlZnJlc2goKTt9LCB0cnVlKTsKCiAgb3B0aW9uKCJ0YWJpbmRleCIsIG51bGwsIGZ1bmN0aW9uKGNtLCB2YWwpIHsKICAgIGNtLmRpc3BsYXkuaW5wdXQudGFiSW5kZXggPSB2YWwgfHwgIiI7CiAgfSk7CiAgb3B0aW9uKCJhdXRvZm9jdXMiLCBudWxsKTsKCiAgLy8gTU9ERSBERUZJTklUSU9OIEFORCBRVUVSWUlORwoKICAvLyBLbm93biBtb2RlcywgYnkgbmFtZSBhbmQgYnkgTUlNRQogIHZhciBtb2RlcyA9IENvZGVNaXJyb3IubW9kZXMgPSB7fSwgbWltZU1vZGVzID0gQ29kZU1pcnJvci5taW1lTW9kZXMgPSB7fTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlID0gZnVuY3Rpb24obmFtZSwgbW9kZSkgewogICAgaWYgKCFDb2RlTWlycm9yLmRlZmF1bHRzLm1vZGUgJiYgbmFtZSAhPSAibnVsbCIpIENvZGVNaXJyb3IuZGVmYXVsdHMubW9kZSA9IG5hbWU7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKICAgICAgbW9kZS5kZXBlbmRlbmNpZXMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIG1vZGUuZGVwZW5kZW5jaWVzLnB1c2goYXJndW1lbnRzW2ldKTsKICAgIH0KICAgIG1vZGVzW25hbWVdID0gbW9kZTsKICB9OwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUgPSBmdW5jdGlvbihtaW1lLCBzcGVjKSB7CiAgICBtaW1lTW9kZXNbbWltZV0gPSBzcGVjOwogIH07CgogIENvZGVNaXJyb3IucmVzb2x2ZU1vZGUgPSBmdW5jdGlvbihzcGVjKSB7CiAgICBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIgJiYgbWltZU1vZGVzLmhhc093blByb3BlcnR5KHNwZWMpKQogICAgICBzcGVjID0gbWltZU1vZGVzW3NwZWNdOwogICAgZWxzZSBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIgJiYgL15bXHdcLV0rXC9bXHdcLV0rXCt4bWwkLy50ZXN0KHNwZWMpKQogICAgICByZXR1cm4gQ29kZU1pcnJvci5yZXNvbHZlTW9kZSgiYXBwbGljYXRpb24veG1sIik7CiAgICBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIpIHJldHVybiB7bmFtZTogc3BlY307CiAgICBlbHNlIHJldHVybiBzcGVjIHx8IHtuYW1lOiAibnVsbCJ9OwogIH07CgogIENvZGVNaXJyb3IuZ2V0TW9kZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIHNwZWMpIHsKICAgIHZhciBzcGVjID0gQ29kZU1pcnJvci5yZXNvbHZlTW9kZShzcGVjKTsKICAgIHZhciBtZmFjdG9yeSA9IG1vZGVzW3NwZWMubmFtZV07CiAgICBpZiAoIW1mYWN0b3J5KSByZXR1cm4gQ29kZU1pcnJvci5nZXRNb2RlKG9wdGlvbnMsICJ0ZXh0L3BsYWluIik7CiAgICB2YXIgbW9kZU9iaiA9IG1mYWN0b3J5KG9wdGlvbnMsIHNwZWMpOwogICAgaWYgKG1vZGVFeHRlbnNpb25zLmhhc093blByb3BlcnR5KHNwZWMubmFtZSkpIHsKICAgICAgdmFyIGV4dHMgPSBtb2RlRXh0ZW5zaW9uc1tzcGVjLm5hbWVdOwogICAgICBmb3IgKHZhciBwcm9wIGluIGV4dHMpIHsKICAgICAgICBpZiAoIWV4dHMuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlOwogICAgICAgIGlmIChtb2RlT2JqLmhhc093blByb3BlcnR5KHByb3ApKSBtb2RlT2JqWyJfIiArIHByb3BdID0gbW9kZU9ialtwcm9wXTsKICAgICAgICBtb2RlT2JqW3Byb3BdID0gZXh0c1twcm9wXTsKICAgICAgfQogICAgfQogICAgbW9kZU9iai5uYW1lID0gc3BlYy5uYW1lOwogICAgcmV0dXJuIG1vZGVPYmo7CiAgfTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJudWxsIiwgZnVuY3Rpb24oKSB7CiAgICByZXR1cm4ge3Rva2VuOiBmdW5jdGlvbihzdHJlYW0pIHtzdHJlYW0uc2tpcFRvRW5kKCk7fX07CiAgfSk7CiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3BsYWluIiwgIm51bGwiKTsKCiAgdmFyIG1vZGVFeHRlbnNpb25zID0gQ29kZU1pcnJvci5tb2RlRXh0ZW5zaW9ucyA9IHt9OwogIENvZGVNaXJyb3IuZXh0ZW5kTW9kZSA9IGZ1bmN0aW9uKG1vZGUsIHByb3BlcnRpZXMpIHsKICAgIHZhciBleHRzID0gbW9kZUV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkobW9kZSkgPyBtb2RlRXh0ZW5zaW9uc1ttb2RlXSA6IChtb2RlRXh0ZW5zaW9uc1ttb2RlXSA9IHt9KTsKICAgIGZvciAodmFyIHByb3AgaW4gcHJvcGVydGllcykgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcCkpCiAgICAgIGV4dHNbcHJvcF0gPSBwcm9wZXJ0aWVzW3Byb3BdOwogIH07CgogIC8vIEVYVEVOU0lPTlMKCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24gPSBmdW5jdGlvbihuYW1lLCBmdW5jKSB7CiAgICBDb2RlTWlycm9yLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmM7CiAgfTsKCiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24gPSBvcHRpb247CgogIHZhciBpbml0SG9va3MgPSBbXTsKICBDb2RlTWlycm9yLmRlZmluZUluaXRIb29rID0gZnVuY3Rpb24oZikge2luaXRIb29rcy5wdXNoKGYpO307CgogIC8vIE1PREUgU1RBVEUgSEFORExJTkcKCiAgLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBzdGF0ZS4gRXhwb3J0ZWQgYmVjYXVzZSBtb2RlcwogIC8vIHNvbWV0aW1lcyBuZWVkIHRvIGRvIHRoaXMuCiAgZnVuY3Rpb24gY29weVN0YXRlKG1vZGUsIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUgPT09IHRydWUpIHJldHVybiBzdGF0ZTsKICAgIGlmIChtb2RlLmNvcHlTdGF0ZSkgcmV0dXJuIG1vZGUuY29weVN0YXRlKHN0YXRlKTsKICAgIHZhciBuc3RhdGUgPSB7fTsKICAgIGZvciAodmFyIG4gaW4gc3RhdGUpIHsKICAgICAgdmFyIHZhbCA9IHN0YXRlW25dOwogICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkpIHZhbCA9IHZhbC5jb25jYXQoW10pOwogICAgICBuc3RhdGVbbl0gPSB2YWw7CiAgICB9CiAgICByZXR1cm4gbnN0YXRlOwogIH0KICBDb2RlTWlycm9yLmNvcHlTdGF0ZSA9IGNvcHlTdGF0ZTsKCiAgZnVuY3Rpb24gc3RhcnRTdGF0ZShtb2RlLCBhMSwgYTIpIHsKICAgIHJldHVybiBtb2RlLnN0YXJ0U3RhdGUgPyBtb2RlLnN0YXJ0U3RhdGUoYTEsIGEyKSA6IHRydWU7CiAgfQogIENvZGVNaXJyb3Iuc3RhcnRTdGF0ZSA9IHN0YXJ0U3RhdGU7CgogIENvZGVNaXJyb3IuaW5uZXJNb2RlID0gZnVuY3Rpb24obW9kZSwgc3RhdGUpIHsKICAgIHdoaWxlIChtb2RlLmlubmVyTW9kZSkgewogICAgICB2YXIgaW5mbyA9IG1vZGUuaW5uZXJNb2RlKHN0YXRlKTsKICAgICAgc3RhdGUgPSBpbmZvLnN0YXRlOwogICAgICBtb2RlID0gaW5mby5tb2RlOwogICAgfQogICAgcmV0dXJuIGluZm8gfHwge21vZGU6IG1vZGUsIHN0YXRlOiBzdGF0ZX07CiAgfTsKCiAgLy8gU1RBTkRBUkQgQ09NTUFORFMKCiAgdmFyIGNvbW1hbmRzID0gQ29kZU1pcnJvci5jb21tYW5kcyA9IHsKICAgIHNlbGVjdEFsbDogZnVuY3Rpb24oY20pIHtjbS5zZXRTZWxlY3Rpb24oe2xpbmU6IDAsIGNoOiAwfSwge2xpbmU6IGNtLmxpbmVDb3VudCgpIC0gMX0pO30sCiAgICBraWxsTGluZTogZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIGZyb20gPSBjbS5nZXRDdXJzb3IodHJ1ZSksIHRvID0gY20uZ2V0Q3Vyc29yKGZhbHNlKSwgc2VsID0gIXBvc0VxKGZyb20sIHRvKTsKICAgICAgaWYgKCFzZWwgJiYgY20uZ2V0TGluZShmcm9tLmxpbmUpLmxlbmd0aCA9PSBmcm9tLmNoKQogICAgICAgIGNtLnJlcGxhY2VSYW5nZSgiIiwgZnJvbSwge2xpbmU6IGZyb20ubGluZSArIDEsIGNoOiAwfSwgImRlbGV0ZSIpOwogICAgICBlbHNlIGNtLnJlcGxhY2VSYW5nZSgiIiwgZnJvbSwgc2VsID8gdG8gOiB7bGluZTogZnJvbS5saW5lfSwgImRlbGV0ZSIpOwogICAgfSwKICAgIGRlbGV0ZUxpbmU6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIHZhciBsID0gY20uZ2V0Q3Vyc29yKCkubGluZTsKICAgICAgY20ucmVwbGFjZVJhbmdlKCIiLCB7bGluZTogbCwgY2g6IDB9LCB7bGluZTogbH0sICJkZWxldGUiKTsKICAgIH0sCiAgICB1bmRvOiBmdW5jdGlvbihjbSkge2NtLnVuZG8oKTt9LAogICAgcmVkbzogZnVuY3Rpb24oY20pIHtjbS5yZWRvKCk7fSwKICAgIGdvRG9jU3RhcnQ6IGZ1bmN0aW9uKGNtKSB7Y20uZXh0ZW5kU2VsZWN0aW9uKHtsaW5lOiAwLCBjaDogMH0pO30sCiAgICBnb0RvY0VuZDogZnVuY3Rpb24oY20pIHtjbS5leHRlbmRTZWxlY3Rpb24oe2xpbmU6IGNtLmxpbmVDb3VudCgpIC0gMX0pO30sCiAgICBnb0xpbmVTdGFydDogZnVuY3Rpb24oY20pIHsKICAgICAgY20uZXh0ZW5kU2VsZWN0aW9uKGxpbmVTdGFydChjbSwgY20uZ2V0Q3Vyc29yKCkubGluZSkpOwogICAgfSwKICAgIGdvTGluZVN0YXJ0U21hcnQ6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKSwgc3RhcnQgPSBsaW5lU3RhcnQoY20sIGN1ci5saW5lKTsKICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lSGFuZGxlKHN0YXJ0LmxpbmUpOwogICAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lKTsKICAgICAgaWYgKCFvcmRlciB8fCBvcmRlclswXS5sZXZlbCA9PSAwKSB7CiAgICAgICAgdmFyIGZpcnN0Tm9uV1MgPSBNYXRoLm1heCgwLCBsaW5lLnRleHQuc2VhcmNoKC9cUy8pKTsKICAgICAgICB2YXIgaW5XUyA9IGN1ci5saW5lID09IHN0YXJ0LmxpbmUgJiYgY3VyLmNoIDw9IGZpcnN0Tm9uV1MgJiYgY3VyLmNoOwogICAgICAgIGNtLmV4dGVuZFNlbGVjdGlvbih7bGluZTogc3RhcnQubGluZSwgY2g6IGluV1MgPyAwIDogZmlyc3ROb25XU30pOwogICAgICB9IGVsc2UgY20uZXh0ZW5kU2VsZWN0aW9uKHN0YXJ0KTsKICAgIH0sCiAgICBnb0xpbmVFbmQ6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGNtLmV4dGVuZFNlbGVjdGlvbihsaW5lRW5kKGNtLCBjbS5nZXRDdXJzb3IoKS5saW5lKSk7CiAgICB9LAogICAgZ29MaW5lVXA6IGZ1bmN0aW9uKGNtKSB7Y20ubW92ZVYoLTEsICJsaW5lIik7fSwKICAgIGdvTGluZURvd246IGZ1bmN0aW9uKGNtKSB7Y20ubW92ZVYoMSwgImxpbmUiKTt9LAogICAgZ29QYWdlVXA6IGZ1bmN0aW9uKGNtKSB7Y20ubW92ZVYoLTEsICJwYWdlIik7fSwKICAgIGdvUGFnZURvd246IGZ1bmN0aW9uKGNtKSB7Y20ubW92ZVYoMSwgInBhZ2UiKTt9LAogICAgZ29DaGFyTGVmdDogZnVuY3Rpb24oY20pIHtjbS5tb3ZlSCgtMSwgImNoYXIiKTt9LAogICAgZ29DaGFyUmlnaHQ6IGZ1bmN0aW9uKGNtKSB7Y20ubW92ZUgoMSwgImNoYXIiKTt9LAogICAgZ29Db2x1bW5MZWZ0OiBmdW5jdGlvbihjbSkge2NtLm1vdmVIKC0xLCAiY29sdW1uIik7fSwKICAgIGdvQ29sdW1uUmlnaHQ6IGZ1bmN0aW9uKGNtKSB7Y20ubW92ZUgoMSwgImNvbHVtbiIpO30sCiAgICBnb1dvcmRMZWZ0OiBmdW5jdGlvbihjbSkge2NtLm1vdmVIKC0xLCAid29yZCIpO30sCiAgICBnb1dvcmRSaWdodDogZnVuY3Rpb24oY20pIHtjbS5tb3ZlSCgxLCAid29yZCIpO30sCiAgICBkZWxDaGFyQmVmb3JlOiBmdW5jdGlvbihjbSkge2NtLmRlbGV0ZUgoLTEsICJjaGFyIik7fSwKICAgIGRlbENoYXJBZnRlcjogZnVuY3Rpb24oY20pIHtjbS5kZWxldGVIKDEsICJjaGFyIik7fSwKICAgIGRlbFdvcmRCZWZvcmU6IGZ1bmN0aW9uKGNtKSB7Y20uZGVsZXRlSCgtMSwgIndvcmQiKTt9LAogICAgZGVsV29yZEFmdGVyOiBmdW5jdGlvbihjbSkge2NtLmRlbGV0ZUgoMSwgIndvcmQiKTt9LAogICAgaW5kZW50QXV0bzogZnVuY3Rpb24oY20pIHtjbS5pbmRlbnRTZWxlY3Rpb24oInNtYXJ0Iik7fSwKICAgIGluZGVudE1vcmU6IGZ1bmN0aW9uKGNtKSB7Y20uaW5kZW50U2VsZWN0aW9uKCJhZGQiKTt9LAogICAgaW5kZW50TGVzczogZnVuY3Rpb24oY20pIHtjbS5pbmRlbnRTZWxlY3Rpb24oInN1YnRyYWN0Iik7fSwKICAgIGluc2VydFRhYjogZnVuY3Rpb24oY20pIHtjbS5yZXBsYWNlU2VsZWN0aW9uKCJcdCIsICJlbmQiLCAiaW5wdXQiKTt9LAogICAgZGVmYXVsdFRhYjogZnVuY3Rpb24oY20pIHsKICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIGNtLmluZGVudFNlbGVjdGlvbigiYWRkIik7CiAgICAgIGVsc2UgY20ucmVwbGFjZVNlbGVjdGlvbigiXHQiLCAiZW5kIiwgImlucHV0Iik7CiAgICB9LAogICAgdHJhbnNwb3NlQ2hhcnM6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKSwgbGluZSA9IGNtLmdldExpbmUoY3VyLmxpbmUpOwogICAgICBpZiAoY3VyLmNoID4gMCAmJiBjdXIuY2ggPCBsaW5lLmxlbmd0aCAtIDEpCiAgICAgICAgY20ucmVwbGFjZVJhbmdlKGxpbmUuY2hhckF0KGN1ci5jaCkgKyBsaW5lLmNoYXJBdChjdXIuY2ggLSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAge2xpbmU6IGN1ci5saW5lLCBjaDogY3VyLmNoIC0gMX0sIHtsaW5lOiBjdXIubGluZSwgY2g6IGN1ci5jaCArIDF9KTsKICAgIH0sCiAgICBuZXdsaW5lQW5kSW5kZW50OiBmdW5jdGlvbihjbSkgewogICAgICBvcGVyYXRpb24oY20sIGZ1bmN0aW9uKCkgewogICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oIlxuIiwgImVuZCIsICJpbnB1dCIpOwogICAgICAgIGNtLmluZGVudExpbmUoY20uZ2V0Q3Vyc29yKCkubGluZSwgbnVsbCwgdHJ1ZSk7CiAgICAgIH0pKCk7CiAgICB9LAogICAgdG9nZ2xlT3ZlcndyaXRlOiBmdW5jdGlvbihjbSkge2NtLnRvZ2dsZU92ZXJ3cml0ZSgpO30KICB9OwoKICAvLyBTVEFOREFSRCBLRVlNQVBTCgogIHZhciBrZXlNYXAgPSBDb2RlTWlycm9yLmtleU1hcCA9IHt9OwogIGtleU1hcC5iYXNpYyA9IHsKICAgICJMZWZ0IjogImdvQ2hhckxlZnQiLCAiUmlnaHQiOiAiZ29DaGFyUmlnaHQiLCAiVXAiOiAiZ29MaW5lVXAiLCAiRG93biI6ICJnb0xpbmVEb3duIiwKICAgICJFbmQiOiAiZ29MaW5lRW5kIiwgIkhvbWUiOiAiZ29MaW5lU3RhcnRTbWFydCIsICJQYWdlVXAiOiAiZ29QYWdlVXAiLCAiUGFnZURvd24iOiAiZ29QYWdlRG93biIsCiAgICAiRGVsZXRlIjogImRlbENoYXJBZnRlciIsICJCYWNrc3BhY2UiOiAiZGVsQ2hhckJlZm9yZSIsICJUYWIiOiAiZGVmYXVsdFRhYiIsICJTaGlmdC1UYWIiOiAiaW5kZW50QXV0byIsCiAgICAiRW50ZXIiOiAibmV3bGluZUFuZEluZGVudCIsICJJbnNlcnQiOiAidG9nZ2xlT3ZlcndyaXRlIgogIH07CiAgLy8gTm90ZSB0aGF0IHRoZSBzYXZlIGFuZCBmaW5kLXJlbGF0ZWQgY29tbWFuZHMgYXJlbid0IGRlZmluZWQgYnkKICAvLyBkZWZhdWx0LiBVbmtub3duIGNvbW1hbmRzIGFyZSBzaW1wbHkgaWdub3JlZC4KICBrZXlNYXAucGNEZWZhdWx0ID0gewogICAgIkN0cmwtQSI6ICJzZWxlY3RBbGwiLCAiQ3RybC1EIjogImRlbGV0ZUxpbmUiLCAiQ3RybC1aIjogInVuZG8iLCAiU2hpZnQtQ3RybC1aIjogInJlZG8iLCAiQ3RybC1ZIjogInJlZG8iLAogICAgIkN0cmwtSG9tZSI6ICJnb0RvY1N0YXJ0IiwgIkFsdC1VcCI6ICJnb0RvY1N0YXJ0IiwgIkN0cmwtRW5kIjogImdvRG9jRW5kIiwgIkN0cmwtRG93biI6ICJnb0RvY0VuZCIsCiAgICAiQ3RybC1MZWZ0IjogImdvV29yZExlZnQiLCAiQ3RybC1SaWdodCI6ICJnb1dvcmRSaWdodCIsICJBbHQtTGVmdCI6ICJnb0xpbmVTdGFydCIsICJBbHQtUmlnaHQiOiAiZ29MaW5lRW5kIiwKICAgICJDdHJsLUJhY2tzcGFjZSI6ICJkZWxXb3JkQmVmb3JlIiwgIkN0cmwtRGVsZXRlIjogImRlbFdvcmRBZnRlciIsICJDdHJsLVMiOiAic2F2ZSIsICJDdHJsLUYiOiAiZmluZCIsCiAgICAiQ3RybC1HIjogImZpbmROZXh0IiwgIlNoaWZ0LUN0cmwtRyI6ICJmaW5kUHJldiIsICJTaGlmdC1DdHJsLUYiOiAicmVwbGFjZSIsICJTaGlmdC1DdHJsLVIiOiAicmVwbGFjZUFsbCIsCiAgICAiQ3RybC1bIjogImluZGVudExlc3MiLCAiQ3RybC1dIjogImluZGVudE1vcmUiLAogICAgZmFsbHRocm91Z2g6ICJiYXNpYyIKICB9OwogIGtleU1hcC5tYWNEZWZhdWx0ID0gewogICAgIkNtZC1BIjogInNlbGVjdEFsbCIsICJDbWQtRCI6ICJkZWxldGVMaW5lIiwgIkNtZC1aIjogInVuZG8iLCAiU2hpZnQtQ21kLVoiOiAicmVkbyIsICJDbWQtWSI6ICJyZWRvIiwKICAgICJDbWQtVXAiOiAiZ29Eb2NTdGFydCIsICJDbWQtRW5kIjogImdvRG9jRW5kIiwgIkNtZC1Eb3duIjogImdvRG9jRW5kIiwgIkFsdC1MZWZ0IjogImdvV29yZExlZnQiLAogICAgIkFsdC1SaWdodCI6ICJnb1dvcmRSaWdodCIsICJDbWQtTGVmdCI6ICJnb0xpbmVTdGFydCIsICJDbWQtUmlnaHQiOiAiZ29MaW5lRW5kIiwgIkFsdC1CYWNrc3BhY2UiOiAiZGVsV29yZEJlZm9yZSIsCiAgICAiQ3RybC1BbHQtQmFja3NwYWNlIjogImRlbFdvcmRBZnRlciIsICJBbHQtRGVsZXRlIjogImRlbFdvcmRBZnRlciIsICJDbWQtUyI6ICJzYXZlIiwgIkNtZC1GIjogImZpbmQiLAogICAgIkNtZC1HIjogImZpbmROZXh0IiwgIlNoaWZ0LUNtZC1HIjogImZpbmRQcmV2IiwgIkNtZC1BbHQtRiI6ICJyZXBsYWNlIiwgIlNoaWZ0LUNtZC1BbHQtRiI6ICJyZXBsYWNlQWxsIiwKICAgICJDbWQtWyI6ICJpbmRlbnRMZXNzIiwgIkNtZC1dIjogImluZGVudE1vcmUiLAogICAgZmFsbHRocm91Z2g6IFsiYmFzaWMiLCAiZW1hY3N5Il0KICB9OwogIGtleU1hcFsiZGVmYXVsdCJdID0gbWFjID8ga2V5TWFwLm1hY0RlZmF1bHQgOiBrZXlNYXAucGNEZWZhdWx0OwogIGtleU1hcC5lbWFjc3kgPSB7CiAgICAiQ3RybC1GIjogImdvQ2hhclJpZ2h0IiwgIkN0cmwtQiI6ICJnb0NoYXJMZWZ0IiwgIkN0cmwtUCI6ICJnb0xpbmVVcCIsICJDdHJsLU4iOiAiZ29MaW5lRG93biIsCiAgICAiQWx0LUYiOiAiZ29Xb3JkUmlnaHQiLCAiQWx0LUIiOiAiZ29Xb3JkTGVmdCIsICJDdHJsLUEiOiAiZ29MaW5lU3RhcnQiLCAiQ3RybC1FIjogImdvTGluZUVuZCIsCiAgICAiQ3RybC1WIjogImdvUGFnZURvd24iLCAiU2hpZnQtQ3RybC1WIjogImdvUGFnZVVwIiwgIkN0cmwtRCI6ICJkZWxDaGFyQWZ0ZXIiLCAiQ3RybC1IIjogImRlbENoYXJCZWZvcmUiLAogICAgIkFsdC1EIjogImRlbFdvcmRBZnRlciIsICJBbHQtQmFja3NwYWNlIjogImRlbFdvcmRCZWZvcmUiLCAiQ3RybC1LIjogImtpbGxMaW5lIiwgIkN0cmwtVCI6ICJ0cmFuc3Bvc2VDaGFycyIKICB9OwoKICAvLyBLRVlNQVAgRElTUEFUQ0gKCiAgZnVuY3Rpb24gZ2V0S2V5TWFwKHZhbCkgewogICAgaWYgKHR5cGVvZiB2YWwgPT0gInN0cmluZyIpIHJldHVybiBrZXlNYXBbdmFsXTsKICAgIGVsc2UgcmV0dXJuIHZhbDsKICB9CgogIGZ1bmN0aW9uIGxvb2t1cEtleShuYW1lLCBtYXBzLCBoYW5kbGUsIHN0b3ApIHsKICAgIGZ1bmN0aW9uIGxvb2t1cChtYXApIHsKICAgICAgbWFwID0gZ2V0S2V5TWFwKG1hcCk7CiAgICAgIHZhciBmb3VuZCA9IG1hcFtuYW1lXTsKICAgICAgaWYgKGZvdW5kID09PSBmYWxzZSkgewogICAgICAgIGlmIChzdG9wKSBzdG9wKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGZvdW5kICE9IG51bGwgJiYgaGFuZGxlKGZvdW5kKSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChtYXAubm9mYWxsdGhyb3VnaCkgewogICAgICAgIGlmIChzdG9wKSBzdG9wKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgdmFyIGZhbGx0aHJvdWdoID0gbWFwLmZhbGx0aHJvdWdoOwogICAgICBpZiAoZmFsbHRocm91Z2ggPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZhbGx0aHJvdWdoKSAhPSAiW29iamVjdCBBcnJheV0iKQogICAgICAgIHJldHVybiBsb29rdXAoZmFsbHRocm91Z2gpOwogICAgICBmb3IgKHZhciBpID0gMCwgZSA9IGZhbGx0aHJvdWdoLmxlbmd0aDsgaSA8IGU7ICsraSkgewogICAgICAgIGlmIChsb29rdXAoZmFsbHRocm91Z2hbaV0pKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgKytpKQogICAgICBpZiAobG9va3VwKG1hcHNbaV0pKSByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gaXNNb2RpZmllcktleShldmVudCkgewogICAgdmFyIG5hbWUgPSBrZXlOYW1lc1tlX3Byb3AoZXZlbnQsICJrZXlDb2RlIildOwogICAgcmV0dXJuIG5hbWUgPT0gIkN0cmwiIHx8IG5hbWUgPT0gIkFsdCIgfHwgbmFtZSA9PSAiU2hpZnQiIHx8IG5hbWUgPT0gIk1vZCI7CiAgfQogIENvZGVNaXJyb3IuaXNNb2RpZmllcktleSA9IGlzTW9kaWZpZXJLZXk7CgogIC8vIEZST01URVhUQVJFQQoKICBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSA9IGZ1bmN0aW9uKHRleHRhcmVhLCBvcHRpb25zKSB7CiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTsKICAgIG9wdGlvbnMudmFsdWUgPSB0ZXh0YXJlYS52YWx1ZTsKICAgIGlmICghb3B0aW9ucy50YWJpbmRleCAmJiB0ZXh0YXJlYS50YWJpbmRleCkKICAgICAgb3B0aW9ucy50YWJpbmRleCA9IHRleHRhcmVhLnRhYmluZGV4OwogICAgLy8gU2V0IGF1dG9mb2N1cyB0byB0cnVlIGlmIHRoaXMgdGV4dGFyZWEgaXMgZm9jdXNlZCwgb3IgaWYgaXQgaGFzCiAgICAvLyBhdXRvZm9jdXMgYW5kIG5vIG90aGVyIGVsZW1lbnQgaXMgZm9jdXNlZC4KICAgIGlmIChvcHRpb25zLmF1dG9mb2N1cyA9PSBudWxsKSB7CiAgICAgIHZhciBoYXNGb2N1cyA9IGRvY3VtZW50LmJvZHk7CiAgICAgIC8vIGRvYy5hY3RpdmVFbGVtZW50IG9jY2FzaW9uYWxseSB0aHJvd3Mgb24gSUUKICAgICAgdHJ5IHsgaGFzRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OyB9IGNhdGNoKGUpIHt9CiAgICAgIG9wdGlvbnMuYXV0b2ZvY3VzID0gaGFzRm9jdXMgPT0gdGV4dGFyZWEgfHwKICAgICAgICB0ZXh0YXJlYS5nZXRBdHRyaWJ1dGUoImF1dG9mb2N1cyIpICE9IG51bGwgJiYgaGFzRm9jdXMgPT0gZG9jdW1lbnQuYm9keTsKICAgIH0KCiAgICBmdW5jdGlvbiBzYXZlKCkge3RleHRhcmVhLnZhbHVlID0gY20uZ2V0VmFsdWUoKTt9CiAgICBpZiAodGV4dGFyZWEuZm9ybSkgewogICAgICAvLyBEZXBsb3JhYmxlIGhhY2sgdG8gbWFrZSB0aGUgc3VibWl0IG1ldGhvZCBkbyB0aGUgcmlnaHQgdGhpbmcuCiAgICAgIG9uKHRleHRhcmVhLmZvcm0sICJzdWJtaXQiLCBzYXZlKTsKICAgICAgdmFyIGZvcm0gPSB0ZXh0YXJlYS5mb3JtLCByZWFsU3VibWl0ID0gZm9ybS5zdWJtaXQ7CiAgICAgIHRyeSB7CiAgICAgICAgZm9ybS5zdWJtaXQgPSBmdW5jdGlvbiB3cmFwcGVkU3VibWl0KCkgewogICAgICAgICAgc2F2ZSgpOwogICAgICAgICAgZm9ybS5zdWJtaXQgPSByZWFsU3VibWl0OwogICAgICAgICAgZm9ybS5zdWJtaXQoKTsKICAgICAgICAgIGZvcm0uc3VibWl0ID0gd3JhcHBlZFN1Ym1pdDsKICAgICAgICB9OwogICAgICB9IGNhdGNoKGUpIHt9CiAgICB9CgogICAgdGV4dGFyZWEuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIHZhciBjbSA9IENvZGVNaXJyb3IoZnVuY3Rpb24obm9kZSkgewogICAgICB0ZXh0YXJlYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCB0ZXh0YXJlYS5uZXh0U2libGluZyk7CiAgICB9LCBvcHRpb25zKTsKICAgIGNtLnNhdmUgPSBzYXZlOwogICAgY20uZ2V0VGV4dEFyZWEgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRleHRhcmVhOyB9OwogICAgY20udG9UZXh0QXJlYSA9IGZ1bmN0aW9uKCkgewogICAgICBzYXZlKCk7CiAgICAgIHRleHRhcmVhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSk7CiAgICAgIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgaWYgKHRleHRhcmVhLmZvcm0pIHsKICAgICAgICBvZmYodGV4dGFyZWEuZm9ybSwgInN1Ym1pdCIsIHNhdmUpOwogICAgICAgIGlmICh0eXBlb2YgdGV4dGFyZWEuZm9ybS5zdWJtaXQgPT0gImZ1bmN0aW9uIikKICAgICAgICAgIHRleHRhcmVhLmZvcm0uc3VibWl0ID0gcmVhbFN1Ym1pdDsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBjbTsKICB9OwoKICAvLyBTVFJJTkcgU1RSRUFNCgogIC8vIEZlZCB0byB0aGUgbW9kZSBwYXJzZXJzLCBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIG1ha2UKICAvLyBwYXJzZXJzIG1vcmUgc3VjY2luY3QuCgogIC8vIFRoZSBjaGFyYWN0ZXIgc3RyZWFtIHVzZWQgYnkgYSBtb2RlJ3MgcGFyc2VyLgogIGZ1bmN0aW9uIFN0cmluZ1N0cmVhbShzdHJpbmcsIHRhYlNpemUpIHsKICAgIHRoaXMucG9zID0gdGhpcy5zdGFydCA9IDA7CiAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKICAgIHRoaXMudGFiU2l6ZSA9IHRhYlNpemUgfHwgODsKICB9CgogIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUgPSB7CiAgICBlb2w6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGg7fSwKICAgIHNvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID09IDA7fSwKICAgIHBlZWs6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpIHx8IHVuZGVmaW5lZDt9LAogICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLnBvcyA8IHRoaXMuc3RyaW5nLmxlbmd0aCkKICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspOwogICAgfSwKICAgIGVhdDogZnVuY3Rpb24obWF0Y2gpIHsKICAgICAgdmFyIGNoID0gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTsKICAgICAgaWYgKHR5cGVvZiBtYXRjaCA9PSAic3RyaW5nIikgdmFyIG9rID0gY2ggPT0gbWF0Y2g7CiAgICAgIGVsc2UgdmFyIG9rID0gY2ggJiYgKG1hdGNoLnRlc3QgPyBtYXRjaC50ZXN0KGNoKSA6IG1hdGNoKGNoKSk7CiAgICAgIGlmIChvaykgeysrdGhpcy5wb3M7IHJldHVybiBjaDt9CiAgICB9LAogICAgZWF0V2hpbGU6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKXt9CiAgICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0OwogICAgfSwKICAgIGVhdFNwYWNlOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7CiAgICAgIHdoaWxlICgvW1xzXHUwMGEwXS8udGVzdCh0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpKSkgKyt0aGlzLnBvczsKICAgICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7CiAgICB9LAogICAgc2tpcFRvRW5kOiBmdW5jdGlvbigpIHt0aGlzLnBvcyA9IHRoaXMuc3RyaW5nLmxlbmd0aDt9LAogICAgc2tpcFRvOiBmdW5jdGlvbihjaCkgewogICAgICB2YXIgZm91bmQgPSB0aGlzLnN0cmluZy5pbmRleE9mKGNoLCB0aGlzLnBvcyk7CiAgICAgIGlmIChmb3VuZCA+IC0xKSB7dGhpcy5wb3MgPSBmb3VuZDsgcmV0dXJuIHRydWU7fQogICAgfSwKICAgIGJhY2tVcDogZnVuY3Rpb24obikge3RoaXMucG9zIC09IG47fSwKICAgIGNvbHVtbjogZnVuY3Rpb24oKSB7cmV0dXJuIGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLCB0aGlzLnN0YXJ0LCB0aGlzLnRhYlNpemUpO30sCiAgICBpbmRlbnRhdGlvbjogZnVuY3Rpb24oKSB7cmV0dXJuIGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLCBudWxsLCB0aGlzLnRhYlNpemUpO30sCiAgICBtYXRjaDogZnVuY3Rpb24ocGF0dGVybiwgY29uc3VtZSwgY2FzZUluc2Vuc2l0aXZlKSB7CiAgICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgewogICAgICAgIHZhciBjYXNlZCA9IGZ1bmN0aW9uKHN0cikge3JldHVybiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjt9OwogICAgICAgIGlmIChjYXNlZCh0aGlzLnN0cmluZykuaW5kZXhPZihjYXNlZChwYXR0ZXJuKSwgdGhpcy5wb3MpID09IHRoaXMucG9zKSB7CiAgICAgICAgICBpZiAoY29uc3VtZSAhPT0gZmFsc2UpIHRoaXMucG9zICs9IHBhdHRlcm4ubGVuZ3RoOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKTsKICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPiAwKSByZXR1cm4gbnVsbDsKICAgICAgICBpZiAobWF0Y2ggJiYgY29uc3VtZSAhPT0gZmFsc2UpIHRoaXMucG9zICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgIH0KICAgIH0sCiAgICBjdXJyZW50OiBmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLnBvcyk7fQogIH07CiAgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0gPSBTdHJpbmdTdHJlYW07CgogIC8vIFRFWFRNQVJLRVJTCgogIGZ1bmN0aW9uIFRleHRNYXJrZXIoY20sIHR5cGUpIHsKICAgIHRoaXMubGluZXMgPSBbXTsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmNtID0gY207CiAgfQoKICBUZXh0TWFya2VyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuZXhwbGljaXRseUNsZWFyZWQpIHJldHVybjsKICAgIHN0YXJ0T3BlcmF0aW9uKHRoaXMuY20pOwogICAgdmFyIG1pbiA9IG51bGwsIG1heCA9IG51bGw7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGxpbmUgPSB0aGlzLmxpbmVzW2ldOwogICAgICB2YXIgc3BhbiA9IGdldE1hcmtlZFNwYW5Gb3IobGluZS5tYXJrZWRTcGFucywgdGhpcyk7CiAgICAgIGlmIChzcGFuLnRvICE9IG51bGwpIG1heCA9IGxpbmVObyhsaW5lKTsKICAgICAgbGluZS5tYXJrZWRTcGFucyA9IHJlbW92ZU1hcmtlZFNwYW4obGluZS5tYXJrZWRTcGFucywgc3Bhbik7CiAgICAgIGlmIChzcGFuLmZyb20gIT0gbnVsbCkKICAgICAgICBtaW4gPSBsaW5lTm8obGluZSk7CiAgICAgIGVsc2UgaWYgKHRoaXMuY29sbGFwc2VkICYmICFsaW5lSXNIaWRkZW4obGluZSkpCiAgICAgICAgdXBkYXRlTGluZUhlaWdodChsaW5lLCB0ZXh0SGVpZ2h0KHRoaXMuY20uZGlzcGxheSkpOwogICAgfQogICAgaWYgKG1pbiAhPSBudWxsKSByZWdDaGFuZ2UodGhpcy5jbSwgbWluLCBtYXggKyAxKTsKICAgIHRoaXMubGluZXMubGVuZ3RoID0gMDsKICAgIHRoaXMuZXhwbGljaXRseUNsZWFyZWQgPSB0cnVlOwogICAgaWYgKHRoaXMuY29sbGFwc2VkICYmIHRoaXMuY20udmlldy5jYW50RWRpdCkgewogICAgICB0aGlzLmNtLnZpZXcuY2FudEVkaXQgPSBmYWxzZTsKICAgICAgcmVDaGVja1NlbGVjdGlvbih0aGlzLmNtKTsKICAgIH0KICAgIGVuZE9wZXJhdGlvbih0aGlzLmNtKTsKICAgIHNpZ25hbExhdGVyKHRoaXMuY20sIHRoaXMsICJjbGVhciIpOwogIH07CgogIFRleHRNYXJrZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBmcm9tLCB0bzsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgbGluZSA9IHRoaXMubGluZXNbaV07CiAgICAgIHZhciBzcGFuID0gZ2V0TWFya2VkU3BhbkZvcihsaW5lLm1hcmtlZFNwYW5zLCB0aGlzKTsKICAgICAgaWYgKHNwYW4uZnJvbSAhPSBudWxsIHx8IHNwYW4udG8gIT0gbnVsbCkgewogICAgICAgIHZhciBmb3VuZCA9IGxpbmVObyhsaW5lKTsKICAgICAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwpIGZyb20gPSB7bGluZTogZm91bmQsIGNoOiBzcGFuLmZyb219OwogICAgICAgIGlmIChzcGFuLnRvICE9IG51bGwpIHRvID0ge2xpbmU6IGZvdW5kLCBjaDogc3Bhbi50b307CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLnR5cGUgPT0gImJvb2ttYXJrIikgcmV0dXJuIGZyb207CiAgICByZXR1cm4gZnJvbSAmJiB7ZnJvbTogZnJvbSwgdG86IHRvfTsKICB9OwoKICBmdW5jdGlvbiBtYXJrVGV4dChjbSwgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpIHsKICAgIHZhciBkb2MgPSBjbS52aWV3LmRvYzsKICAgIHZhciBtYXJrZXIgPSBuZXcgVGV4dE1hcmtlcihjbSwgdHlwZSk7CiAgICBpZiAodHlwZSA9PSAicmFuZ2UiICYmICFwb3NMZXNzKGZyb20sIHRvKSkgcmV0dXJuIG1hcmtlcjsKICAgIGlmIChvcHRpb25zKSBmb3IgKHZhciBvcHQgaW4gb3B0aW9ucykgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0KSkKICAgICAgbWFya2VyW29wdF0gPSBvcHRpb25zW29wdF07CiAgICBpZiAobWFya2VyLnJlcGxhY2VkV2l0aCkgewogICAgICBtYXJrZXIuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgbWFya2VyLnJlcGxhY2VkV2l0aCA9IGVsdCgic3BhbiIsIFttYXJrZXIucmVwbGFjZWRXaXRoXSwgIkNvZGVNaXJyb3Itd2lkZ2V0Iik7CiAgICB9CiAgICBpZiAobWFya2VyLmNvbGxhcHNlZCkgc2F3Q29sbGFwc2VkU3BhbnMgPSB0cnVlOwoKICAgIHZhciBjdXJMaW5lID0gZnJvbS5saW5lLCBzaXplID0gMCwgY29sbGFwc2VkQXRTdGFydCwgY29sbGFwc2VkQXRFbmQ7CiAgICBkb2MuaXRlcihjdXJMaW5lLCB0by5saW5lICsgMSwgZnVuY3Rpb24obGluZSkgewogICAgICB2YXIgc3BhbiA9IHtmcm9tOiBudWxsLCB0bzogbnVsbCwgbWFya2VyOiBtYXJrZXJ9OwogICAgICBzaXplICs9IGxpbmUudGV4dC5sZW5ndGg7CiAgICAgIGlmIChjdXJMaW5lID09IGZyb20ubGluZSkge3NwYW4uZnJvbSA9IGZyb20uY2g7IHNpemUgLT0gZnJvbS5jaDt9CiAgICAgIGlmIChjdXJMaW5lID09IHRvLmxpbmUpIHtzcGFuLnRvID0gdG8uY2g7IHNpemUgLT0gbGluZS50ZXh0Lmxlbmd0aCAtIHRvLmNoO30KICAgICAgaWYgKG1hcmtlci5jb2xsYXBzZWQpIHsKICAgICAgICBpZiAoY3VyTGluZSA9PSB0by5saW5lKSBjb2xsYXBzZWRBdEVuZCA9IGNvbGxhcHNlZFNwYW5BdChsaW5lLCB0by5jaCk7CiAgICAgICAgaWYgKGN1ckxpbmUgPT0gZnJvbS5saW5lKSBjb2xsYXBzZWRBdFN0YXJ0ID0gY29sbGFwc2VkU3BhbkF0KGxpbmUsIGZyb20uY2gpOwogICAgICAgIGVsc2UgdXBkYXRlTGluZUhlaWdodChsaW5lLCAwKTsKICAgICAgfQogICAgICBhZGRNYXJrZWRTcGFuKGxpbmUsIHNwYW4pOwogICAgICBpZiAobWFya2VyLmNvbGxhcHNlZCAmJiBjdXJMaW5lID09IGZyb20ubGluZSAmJiBsaW5lSXNIaWRkZW4obGluZSkpCiAgICAgICAgdXBkYXRlTGluZUhlaWdodChsaW5lLCAwKTsKICAgICAgKytjdXJMaW5lOwogICAgfSk7CgogICAgaWYgKG1hcmtlci5yZWFkT25seSkgewogICAgICBzYXdSZWFkT25seVNwYW5zID0gdHJ1ZTsKICAgICAgaWYgKGNtLnZpZXcuaGlzdG9yeS5kb25lLmxlbmd0aCB8fCBjbS52aWV3Lmhpc3RvcnkudW5kb25lLmxlbmd0aCkKICAgICAgICBjbS5jbGVhckhpc3RvcnkoKTsKICAgIH0KICAgIGlmIChtYXJrZXIuY29sbGFwc2VkKSB7CiAgICAgIGlmIChjb2xsYXBzZWRBdFN0YXJ0ICE9IGNvbGxhcHNlZEF0RW5kKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiSW5zZXJ0aW5nIGNvbGxhcHNlZCBtYXJrZXIgb3ZlcmxhcHBpbmcgYW4gZXhpc3Rpbmcgb25lIik7CiAgICAgIG1hcmtlci5zaXplID0gc2l6ZTsKICAgICAgbWFya2VyLmF0b21pYyA9IHRydWU7CiAgICB9CiAgICBpZiAobWFya2VyLmNsYXNzTmFtZSB8fCBtYXJrZXIuc3RhcnRTdHlsZSB8fCBtYXJrZXIuZW5kU3R5bGUgfHwgbWFya2VyLmNvbGxhcHNlZCkKICAgICAgcmVnQ2hhbmdlKGNtLCBmcm9tLmxpbmUsIHRvLmxpbmUgKyAxKTsKICAgIGlmIChtYXJrZXIuYXRvbWljKSByZUNoZWNrU2VsZWN0aW9uKGNtKTsKICAgIHJldHVybiBtYXJrZXI7CiAgfQoKICAvLyBURVhUTUFSS0VSIFNQQU5TCgogIGZ1bmN0aW9uIGdldE1hcmtlZFNwYW5Gb3Ioc3BhbnMsIG1hcmtlcikgewogICAgaWYgKHNwYW5zKSBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzcGFuID0gc3BhbnNbaV07CiAgICAgIGlmIChzcGFuLm1hcmtlciA9PSBtYXJrZXIpIHJldHVybiBzcGFuOwogICAgfQogIH0KICBmdW5jdGlvbiByZW1vdmVNYXJrZWRTcGFuKHNwYW5zLCBzcGFuKSB7CiAgICBmb3IgKHZhciByLCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKQogICAgICBpZiAoc3BhbnNbaV0gIT0gc3BhbikgKHIgfHwgKHIgPSBbXSkpLnB1c2goc3BhbnNbaV0pOwogICAgcmV0dXJuIHI7CiAgfQogIGZ1bmN0aW9uIGFkZE1hcmtlZFNwYW4obGluZSwgc3BhbikgewogICAgbGluZS5tYXJrZWRTcGFucyA9IGxpbmUubWFya2VkU3BhbnMgPyBsaW5lLm1hcmtlZFNwYW5zLmNvbmNhdChbc3Bhbl0pIDogW3NwYW5dOwogICAgc3Bhbi5tYXJrZXIubGluZXMucHVzaChsaW5lKTsKICB9CgogIGZ1bmN0aW9uIG1hcmtlZFNwYW5zQmVmb3JlKG9sZCwgc3RhcnRDaCkgewogICAgaWYgKG9sZCkgZm9yICh2YXIgaSA9IDAsIG53OyBpIDwgb2xkLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzcGFuID0gb2xkW2ldLCBtYXJrZXIgPSBzcGFuLm1hcmtlcjsKICAgICAgdmFyIHN0YXJ0c0JlZm9yZSA9IHNwYW4uZnJvbSA9PSBudWxsIHx8IChtYXJrZXIuaW5jbHVzaXZlTGVmdCA/IHNwYW4uZnJvbSA8PSBzdGFydENoIDogc3Bhbi5mcm9tIDwgc3RhcnRDaCk7CiAgICAgIGlmIChzdGFydHNCZWZvcmUgfHwgbWFya2VyLnR5cGUgPT0gImJvb2ttYXJrIiAmJiBzcGFuLmZyb20gPT0gc3RhcnRDaCkgewogICAgICAgIHZhciBlbmRzQWZ0ZXIgPSBzcGFuLnRvID09IG51bGwgfHwgKG1hcmtlci5pbmNsdXNpdmVSaWdodCA/IHNwYW4udG8gPj0gc3RhcnRDaCA6IHNwYW4udG8gPiBzdGFydENoKTsKICAgICAgICAobncgfHwgKG53ID0gW10pKS5wdXNoKHtmcm9tOiBzcGFuLmZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG86IGVuZHNBZnRlciA/IG51bGwgOiBzcGFuLnRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcjogbWFya2VyfSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudzsKICB9CgogIGZ1bmN0aW9uIG1hcmtlZFNwYW5zQWZ0ZXIob2xkLCBzdGFydENoLCBlbmRDaCkgewogICAgaWYgKG9sZCkgZm9yICh2YXIgaSA9IDAsIG53OyBpIDwgb2xkLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzcGFuID0gb2xkW2ldLCBtYXJrZXIgPSBzcGFuLm1hcmtlcjsKICAgICAgdmFyIGVuZHNBZnRlciA9IHNwYW4udG8gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZVJpZ2h0ID8gc3Bhbi50byA+PSBlbmRDaCA6IHNwYW4udG8gPiBlbmRDaCk7CiAgICAgIGlmIChlbmRzQWZ0ZXIgfHwgbWFya2VyLnR5cGUgPT0gImJvb2ttYXJrIiAmJiBzcGFuLmZyb20gPT0gZW5kQ2ggJiYgc3Bhbi5mcm9tICE9IHN0YXJ0Q2gpIHsKICAgICAgICB2YXIgc3RhcnRzQmVmb3JlID0gc3Bhbi5mcm9tID09IG51bGwgfHwgKG1hcmtlci5pbmNsdXNpdmVMZWZ0ID8gc3Bhbi5mcm9tIDw9IGVuZENoIDogc3Bhbi5mcm9tIDwgZW5kQ2gpOwogICAgICAgIChudyB8fCAobncgPSBbXSkpLnB1c2goe2Zyb206IHN0YXJ0c0JlZm9yZSA/IG51bGwgOiBzcGFuLmZyb20gLSBlbmRDaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bzogc3Bhbi50byA9PSBudWxsID8gbnVsbCA6IHNwYW4udG8gLSBlbmRDaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXI6IG1hcmtlcn0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnc7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVNYXJrZWRTcGFucyhvbGRGaXJzdCwgb2xkTGFzdCwgc3RhcnRDaCwgZW5kQ2gsIG5ld1RleHQpIHsKICAgIGlmICghb2xkRmlyc3QgJiYgIW9sZExhc3QpIHJldHVybiBuZXdUZXh0OwogICAgLy8gR2V0IHRoZSBzcGFucyB0aGF0ICdzdGljayBvdXQnIG9uIGJvdGggc2lkZXMKICAgIHZhciBmaXJzdCA9IG1hcmtlZFNwYW5zQmVmb3JlKG9sZEZpcnN0LCBzdGFydENoKTsKICAgIHZhciBsYXN0ID0gbWFya2VkU3BhbnNBZnRlcihvbGRMYXN0LCBzdGFydENoLCBlbmRDaCk7CgogICAgLy8gTmV4dCwgbWVyZ2UgdGhvc2UgdHdvIGVuZHMKICAgIHZhciBzYW1lTGluZSA9IG5ld1RleHQubGVuZ3RoID09IDEsIG9mZnNldCA9IGxzdChuZXdUZXh0KS5sZW5ndGggKyAoc2FtZUxpbmUgPyBzdGFydENoIDogMCk7CiAgICBpZiAoZmlyc3QpIHsKICAgICAgLy8gRml4IHVwIC50byBwcm9wZXJ0aWVzIG9mIGZpcnN0CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlyc3QubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgc3BhbiA9IGZpcnN0W2ldOwogICAgICAgIGlmIChzcGFuLnRvID09IG51bGwpIHsKICAgICAgICAgIHZhciBmb3VuZCA9IGdldE1hcmtlZFNwYW5Gb3IobGFzdCwgc3Bhbi5tYXJrZXIpOwogICAgICAgICAgaWYgKCFmb3VuZCkgc3Bhbi50byA9IHN0YXJ0Q2g7CiAgICAgICAgICBlbHNlIGlmIChzYW1lTGluZSkgc3Bhbi50byA9IGZvdW5kLnRvID09IG51bGwgPyBudWxsIDogZm91bmQudG8gKyBvZmZzZXQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobGFzdCkgewogICAgICAvLyBGaXggdXAgLmZyb20gaW4gbGFzdCAob3IgbW92ZSB0aGVtIGludG8gZmlyc3QgaW4gY2FzZSBvZiBzYW1lTGluZSkKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIHNwYW4gPSBsYXN0W2ldOwogICAgICAgIGlmIChzcGFuLnRvICE9IG51bGwpIHNwYW4udG8gKz0gb2Zmc2V0OwogICAgICAgIGlmIChzcGFuLmZyb20gPT0gbnVsbCkgewogICAgICAgICAgdmFyIGZvdW5kID0gZ2V0TWFya2VkU3BhbkZvcihmaXJzdCwgc3Bhbi5tYXJrZXIpOwogICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICBzcGFuLmZyb20gPSBvZmZzZXQ7CiAgICAgICAgICAgIGlmIChzYW1lTGluZSkgKGZpcnN0IHx8IChmaXJzdCA9IFtdKSkucHVzaChzcGFuKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3Bhbi5mcm9tICs9IG9mZnNldDsKICAgICAgICAgIGlmIChzYW1lTGluZSkgKGZpcnN0IHx8IChmaXJzdCA9IFtdKSkucHVzaChzcGFuKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2YXIgbmV3TWFya2VycyA9IFtuZXdITChuZXdUZXh0WzBdLCBmaXJzdCldOwogICAgaWYgKCFzYW1lTGluZSkgewogICAgICAvLyBGaWxsIGdhcCB3aXRoIHdob2xlLWxpbmUtc3BhbnMKICAgICAgdmFyIGdhcCA9IG5ld1RleHQubGVuZ3RoIC0gMiwgZ2FwTWFya2VyczsKICAgICAgaWYgKGdhcCA+IDAgJiYgZmlyc3QpCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaXJzdC5sZW5ndGg7ICsraSkKICAgICAgICAgIGlmIChmaXJzdFtpXS50byA9PSBudWxsKQogICAgICAgICAgICAoZ2FwTWFya2VycyB8fCAoZ2FwTWFya2VycyA9IFtdKSkucHVzaCh7ZnJvbTogbnVsbCwgdG86IG51bGwsIG1hcmtlcjogZmlyc3RbaV0ubWFya2VyfSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2FwOyArK2kpCiAgICAgICAgbmV3TWFya2Vycy5wdXNoKG5ld0hMKG5ld1RleHRbaSsxXSwgZ2FwTWFya2VycykpOwogICAgICBuZXdNYXJrZXJzLnB1c2gobmV3SEwobHN0KG5ld1RleHQpLCBsYXN0KSk7CiAgICB9CiAgICByZXR1cm4gbmV3TWFya2VyczsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZVJlYWRPbmx5UmFuZ2VzKGRvYywgZnJvbSwgdG8pIHsKICAgIHZhciBtYXJrZXJzID0gbnVsbDsKICAgIGRvYy5pdGVyKGZyb20ubGluZSwgdG8ubGluZSArIDEsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgaWYgKGxpbmUubWFya2VkU3BhbnMpIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBtYXJrID0gbGluZS5tYXJrZWRTcGFuc1tpXS5tYXJrZXI7CiAgICAgICAgaWYgKG1hcmsucmVhZE9ubHkgJiYgKCFtYXJrZXJzIHx8IGluZGV4T2YobWFya2VycywgbWFyaykgPT0gLTEpKQogICAgICAgICAgKG1hcmtlcnMgfHwgKG1hcmtlcnMgPSBbXSkpLnB1c2gobWFyayk7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKCFtYXJrZXJzKSByZXR1cm4gbnVsbDsKICAgIHZhciBwYXJ0cyA9IFt7ZnJvbTogZnJvbSwgdG86IHRvfV07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIG0gPSBtYXJrZXJzW2ldLmZpbmQoKTsKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7ICsraikgewogICAgICAgIHZhciBwID0gcGFydHNbal07CiAgICAgICAgaWYgKCFwb3NMZXNzKG0uZnJvbSwgcC50bykgfHwgcG9zTGVzcyhtLnRvLCBwLmZyb20pKSBjb250aW51ZTsKICAgICAgICB2YXIgbmV3UGFydHMgPSBbaiwgMV07CiAgICAgICAgaWYgKHBvc0xlc3MocC5mcm9tLCBtLmZyb20pKSBuZXdQYXJ0cy5wdXNoKHtmcm9tOiBwLmZyb20sIHRvOiBtLmZyb219KTsKICAgICAgICBpZiAocG9zTGVzcyhtLnRvLCBwLnRvKSkgbmV3UGFydHMucHVzaCh7ZnJvbTogbS50bywgdG86IHAudG99KTsKICAgICAgICBwYXJ0cy5zcGxpY2UuYXBwbHkocGFydHMsIG5ld1BhcnRzKTsKICAgICAgICBqICs9IG5ld1BhcnRzLmxlbmd0aCAtIDE7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXJ0czsKICB9CgogIGZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdChsaW5lLCBjaCkgewogICAgdmFyIHNwcyA9IHNhd0NvbGxhcHNlZFNwYW5zICYmIGxpbmUubWFya2VkU3BhbnMsIGZvdW5kOwogICAgaWYgKHNwcykgZm9yICh2YXIgc3AsIGkgPSAwOyBpIDwgc3BzLmxlbmd0aDsgKytpKSB7CiAgICAgIHNwID0gc3BzW2ldOwogICAgICBpZiAoIXNwLm1hcmtlci5jb2xsYXBzZWQpIGNvbnRpbnVlOwogICAgICBpZiAoKHNwLmZyb20gPT0gbnVsbCB8fCBzcC5mcm9tIDwgY2gpICYmCiAgICAgICAgICAoc3AudG8gPT0gbnVsbCB8fCBzcC50byA+IGNoKSAmJgogICAgICAgICAgKCFmb3VuZCB8fCBmb3VuZC53aWR0aCA8IHNwLm1hcmtlci53aWR0aCkpCiAgICAgICAgZm91bmQgPSBzcC5tYXJrZXI7CiAgICB9CiAgICByZXR1cm4gZm91bmQ7CiAgfQogIGZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdFN0YXJ0KGxpbmUpIHsgcmV0dXJuIGNvbGxhcHNlZFNwYW5BdChsaW5lLCAtMSk7IH0KICBmdW5jdGlvbiBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkgeyByZXR1cm4gY29sbGFwc2VkU3BhbkF0KGxpbmUsIGxpbmUudGV4dC5sZW5ndGggKyAxKTsgfQoKICBmdW5jdGlvbiB2aXN1YWxMaW5lKGRvYywgbGluZSkgewogICAgdmFyIG1lcmdlZDsKICAgIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRTdGFydChsaW5lKSkKICAgICAgbGluZSA9IGdldExpbmUoZG9jLCBtZXJnZWQuZmluZCgpLmZyb20ubGluZSk7CiAgICByZXR1cm4gbGluZTsKICB9CgogIGZ1bmN0aW9uIGxpbmVJc0hpZGRlbihsaW5lKSB7CiAgICB2YXIgc3BzID0gc2F3Q29sbGFwc2VkU3BhbnMgJiYgbGluZS5tYXJrZWRTcGFuczsKICAgIGlmIChzcHMpIGZvciAodmFyIHNwLCBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkgewogICAgICBzcCA9IHNwc1tpXTsKICAgICAgaWYgKCFzcC5tYXJrZXIuY29sbGFwc2VkKSBjb250aW51ZTsKICAgICAgaWYgKHNwLmZyb20gPT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChzcC5mcm9tID09IDAgJiYgc3AubWFya2VyLmluY2x1c2l2ZUxlZnQgJiYgbGluZUlzSGlkZGVuSW5uZXIobGluZSwgc3ApKQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KICB3aW5kb3cubGluZUlzSGlkZGVuID0gbGluZUlzSGlkZGVuOwogIGZ1bmN0aW9uIGxpbmVJc0hpZGRlbklubmVyKGxpbmUsIHNwYW4pIHsKICAgIGlmIChzcGFuLnRvID09IG51bGwgfHwgc3Bhbi5tYXJrZXIuaW5jbHVzaXZlUmlnaHQgJiYgc3Bhbi50byA9PSBsaW5lLnRleHQubGVuZ3RoKQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGZvciAodmFyIHNwLCBpID0gMDsgaSA8IGxpbmUubWFya2VkU3BhbnMubGVuZ3RoOyArK2kpIHsKICAgICAgc3AgPSBsaW5lLm1hcmtlZFNwYW5zW2ldOwogICAgICBpZiAoc3AubWFya2VyLmNvbGxhcHNlZCAmJiBzcC5mcm9tID09IHNwYW4udG8gJiYKICAgICAgICAgIChzcC5tYXJrZXIuaW5jbHVzaXZlTGVmdCB8fCBzcGFuLm1hcmtlci5pbmNsdXNpdmVSaWdodCkgJiYKICAgICAgICAgIGxpbmVJc0hpZGRlbklubmVyKGxpbmUsIHNwKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgfQoKICAvLyBobCBzdGFuZHMgZm9yIGhpc3RvcnktbGluZSwgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSBlaXRoZXIgYQogIC8vIHN0cmluZyAobGluZSB3aXRob3V0IG1hcmtlcnMpIG9yIGEge3RleHQsIG1hcmtlZFNwYW5zfSBvYmplY3QuCiAgZnVuY3Rpb24gaGxUZXh0KHZhbCkgeyByZXR1cm4gdHlwZW9mIHZhbCA9PSAic3RyaW5nIiA/IHZhbCA6IHZhbC50ZXh0OyB9CiAgZnVuY3Rpb24gaGxTcGFucyh2YWwpIHsKICAgIGlmICh0eXBlb2YgdmFsID09ICJzdHJpbmciKSByZXR1cm4gbnVsbDsKICAgIHZhciBzcGFucyA9IHZhbC5tYXJrZWRTcGFucywgb3V0ID0gbnVsbDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKHNwYW5zW2ldLm1hcmtlci5leHBsaWNpdGx5Q2xlYXJlZCkgeyBpZiAoIW91dCkgb3V0ID0gc3BhbnMuc2xpY2UoMCwgaSk7IH0KICAgICAgZWxzZSBpZiAob3V0KSBvdXQucHVzaChzcGFuc1tpXSk7CiAgICB9CiAgICByZXR1cm4gIW91dCA/IHNwYW5zIDogb3V0Lmxlbmd0aCA/IG91dCA6IG51bGw7CiAgfQogIGZ1bmN0aW9uIG5ld0hMKHRleHQsIHNwYW5zKSB7IHJldHVybiBzcGFucyA/IHt0ZXh0OiB0ZXh0LCBtYXJrZWRTcGFuczogc3BhbnN9IDogdGV4dDsgfQoKICBmdW5jdGlvbiBkZXRhY2hNYXJrZWRTcGFucyhsaW5lKSB7CiAgICB2YXIgc3BhbnMgPSBsaW5lLm1hcmtlZFNwYW5zOwogICAgaWYgKCFzcGFucykgcmV0dXJuOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgbGluZXMgPSBzcGFuc1tpXS5tYXJrZXIubGluZXM7CiAgICAgIHZhciBpeCA9IGluZGV4T2YobGluZXMsIGxpbmUpOwogICAgICBsaW5lcy5zcGxpY2UoaXgsIDEpOwogICAgfQogICAgbGluZS5tYXJrZWRTcGFucyA9IG51bGw7CiAgfQoKICBmdW5jdGlvbiBhdHRhY2hNYXJrZWRTcGFucyhsaW5lLCBzcGFucykgewogICAgaWYgKCFzcGFucykgcmV0dXJuOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkKICAgICAgc3BhbnNbaV0ubWFya2VyLmxpbmVzLnB1c2gobGluZSk7CiAgICBsaW5lLm1hcmtlZFNwYW5zID0gc3BhbnM7CiAgfQoKICAvLyBMSU5FIERBVEEgU1RSVUNUVVJFCgogIC8vIExpbmUgb2JqZWN0cy4gVGhlc2UgaG9sZCBzdGF0ZSByZWxhdGVkIHRvIGEgbGluZSwgaW5jbHVkaW5nCiAgLy8gaGlnaGxpZ2h0aW5nIGluZm8gKHRoZSBzdHlsZXMgYXJyYXkpLgogIGZ1bmN0aW9uIG1ha2VMaW5lKHRleHQsIG1hcmtlZFNwYW5zLCBoZWlnaHQpIHsKICAgIHZhciBsaW5lID0ge3RleHQ6IHRleHQsIGhlaWdodDogaGVpZ2h0fTsKICAgIGF0dGFjaE1hcmtlZFNwYW5zKGxpbmUsIG1hcmtlZFNwYW5zKTsKICAgIGlmIChsaW5lSXNIaWRkZW4obGluZSkpIGxpbmUuaGVpZ2h0ID0gMDsKICAgIHJldHVybiBsaW5lOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlTGluZShjbSwgbGluZSwgdGV4dCwgbWFya2VkU3BhbnMpIHsKICAgIGxpbmUudGV4dCA9IHRleHQ7CiAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBsaW5lLnN0eWxlcyA9IG51bGw7CiAgICBpZiAobGluZS5vcmRlciAhPSBudWxsKSBsaW5lLm9yZGVyID0gbnVsbDsKICAgIGRldGFjaE1hcmtlZFNwYW5zKGxpbmUpOwogICAgYXR0YWNoTWFya2VkU3BhbnMobGluZSwgbWFya2VkU3BhbnMpOwogICAgaWYgKGxpbmVJc0hpZGRlbihsaW5lKSkgbGluZS5oZWlnaHQgPSAwOwogICAgZWxzZSBpZiAoIWxpbmUuaGVpZ2h0KSBsaW5lLmhlaWdodCA9IHRleHRIZWlnaHQoY20uZGlzcGxheSk7CiAgICBzaWduYWxMYXRlcihjbSwgbGluZSwgImNoYW5nZSIpOwogIH0KCiAgZnVuY3Rpb24gY2xlYW5VcExpbmUobGluZSkgewogICAgbGluZS5wYXJlbnQgPSBudWxsOwogICAgZGV0YWNoTWFya2VkU3BhbnMobGluZSk7CiAgfQoKICAvLyBSdW4gdGhlIGdpdmVuIG1vZGUncyBwYXJzZXIgb3ZlciBhIGxpbmUsIHVwZGF0ZSB0aGUgc3R5bGVzCiAgLy8gYXJyYXksIHdoaWNoIGNvbnRhaW5zIGFsdGVybmF0aW5nIGZyYWdtZW50cyBvZiB0ZXh0IGFuZCBDU1MKICAvLyBjbGFzc2VzLgogIGZ1bmN0aW9uIGhpZ2hsaWdodExpbmUoY20sIGxpbmUsIHN0YXRlKSB7CiAgICB2YXIgbW9kZSA9IGNtLnZpZXcubW9kZSwgZmxhdHRlblNwYW5zID0gY20ub3B0aW9ucy5mbGF0dGVuU3BhbnM7CiAgICB2YXIgY2hhbmdlZCA9ICFsaW5lLnN0eWxlcywgcG9zID0gMCwgY3VyVGV4dCA9ICIiLCBjdXJTdHlsZSA9IG51bGw7CiAgICB2YXIgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShsaW5lLnRleHQsIGNtLm9wdGlvbnMudGFiU2l6ZSksIHN0ID0gbGluZS5zdHlsZXMgfHwgKGxpbmUuc3R5bGVzID0gW10pOwogICAgaWYgKGxpbmUudGV4dCA9PSAiIiAmJiBtb2RlLmJsYW5rTGluZSkgbW9kZS5ibGFua0xpbmUoc3RhdGUpOwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgdmFyIHN0eWxlID0gbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKSwgc3Vic3RyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgICAgaWYgKCFmbGF0dGVuU3BhbnMgfHwgY3VyU3R5bGUgIT0gc3R5bGUpIHsKICAgICAgICBpZiAoY3VyVGV4dCkgewogICAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgcG9zID49IHN0Lmxlbmd0aCB8fCBjdXJUZXh0ICE9IHN0W3Bvc10gfHwgY3VyU3R5bGUgIT0gc3RbcG9zKzFdOwogICAgICAgICAgc3RbcG9zKytdID0gY3VyVGV4dDsgc3RbcG9zKytdID0gY3VyU3R5bGU7CiAgICAgICAgfQogICAgICAgIGN1clRleHQgPSBzdWJzdHI7IGN1clN0eWxlID0gc3R5bGU7CiAgICAgIH0gZWxzZSBjdXJUZXh0ID0gY3VyVGV4dCArIHN1YnN0cjsKICAgICAgLy8gR2l2ZSB1cCB3aGVuIGxpbmUgaXMgcmlkaWN1bG91c2x5IGxvbmcKICAgICAgaWYgKHN0cmVhbS5wb3MgPiA1MDAwKSBicmVhazsKICAgIH0KICAgIGlmIChjdXJUZXh0KSB7CiAgICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IHBvcyA+PSBzdC5sZW5ndGggfHwgY3VyVGV4dCAhPSBzdFtwb3NdIHx8IGN1clN0eWxlICE9IHN0W3BvcysxXTsKICAgICAgc3RbcG9zKytdID0gY3VyVGV4dDsgc3RbcG9zKytdID0gY3VyU3R5bGU7CiAgICB9CiAgICBpZiAoc3RyZWFtLnBvcyA+IDUwMDApIHsgc3RbcG9zKytdID0gbGluZS50ZXh0LnNsaWNlKHN0cmVhbS5wb3MpOyBzdFtwb3MrK10gPSBudWxsOyB9CiAgICBpZiAocG9zICE9IHN0Lmxlbmd0aCkgeyBzdC5sZW5ndGggPSBwb3M7IGNoYW5nZWQgPSB0cnVlOyB9CiAgICByZXR1cm4gY2hhbmdlZDsKICB9CgogIC8vIExpZ2h0d2VpZ2h0IGZvcm0gb2YgaGlnaGxpZ2h0IC0tIHByb2NlZWQgb3ZlciB0aGlzIGxpbmUgYW5kCiAgLy8gdXBkYXRlIHN0YXRlLCBidXQgZG9uJ3Qgc2F2ZSBhIHN0eWxlIGFycmF5LgogIGZ1bmN0aW9uIHByb2Nlc3NMaW5lKGNtLCBsaW5lLCBzdGF0ZSkgewogICAgdmFyIG1vZGUgPSBjbS52aWV3Lm1vZGU7CiAgICB2YXIgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShsaW5lLnRleHQsIGNtLm9wdGlvbnMudGFiU2l6ZSk7CiAgICBpZiAobGluZS50ZXh0ID09ICIiICYmIG1vZGUuYmxhbmtMaW5lKSBtb2RlLmJsYW5rTGluZShzdGF0ZSk7CiAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSAmJiBzdHJlYW0ucG9zIDw9IDUwMDApIHsKICAgICAgbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgIH0KICB9CgogIHZhciBzdHlsZVRvQ2xhc3NDYWNoZSA9IHt9OwogIGZ1bmN0aW9uIHN0eWxlVG9DbGFzcyhzdHlsZSkgewogICAgaWYgKCFzdHlsZSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gc3R5bGVUb0NsYXNzQ2FjaGVbc3R5bGVdIHx8CiAgICAgIChzdHlsZVRvQ2xhc3NDYWNoZVtzdHlsZV0gPSAiY20tIiArIHN0eWxlLnJlcGxhY2UoLyArL2csICIgY20tIikpOwogIH0KCiAgZnVuY3Rpb24gbGluZUNvbnRlbnQoY20sIHJlYWxMaW5lLCBtZWFzdXJlKSB7CiAgICB2YXIgbWVyZ2VkLCBsaW5lID0gcmVhbExpbmUsIGxpbmVCZWZvcmUsIHNhd0JlZm9yZSwgc2ltcGxlID0gdHJ1ZTsKICAgIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRTdGFydChsaW5lKSkgewogICAgICBzaW1wbGUgPSBmYWxzZTsKICAgICAgbGluZSA9IGdldExpbmUoY20udmlldy5kb2MsIG1lcmdlZC5maW5kKCkuZnJvbS5saW5lKTsKICAgICAgaWYgKCFsaW5lQmVmb3JlKSBsaW5lQmVmb3JlID0gbGluZTsKICAgIH0KCiAgICB2YXIgYnVpbGRlciA9IHtwcmU6IGVsdCgicHJlIiksIGNvbDogMCwgcG9zOiAwLCBkaXNwbGF5OiAhbWVhc3VyZSwKICAgICAgICAgICAgICAgICAgIG1lYXN1cmU6IG51bGwsIGFkZGVkT25lOiBmYWxzZSwgY206IGNtfTsKICAgIGlmIChsaW5lLnRleHRDbGFzcykgYnVpbGRlci5wcmUuY2xhc3NOYW1lID0gbGluZS50ZXh0Q2xhc3M7CgogICAgZG8gewogICAgICBpZiAoIWxpbmUuc3R5bGVzKQogICAgICAgIGhpZ2hsaWdodExpbmUoY20sIGxpbmUsIGxpbmUuc3RhdGVBZnRlciA9IGdldFN0YXRlQmVmb3JlKGNtLCBsaW5lTm8obGluZSkpKTsKICAgICAgYnVpbGRlci5tZWFzdXJlID0gbGluZSA9PSByZWFsTGluZSAmJiBtZWFzdXJlOwogICAgICBidWlsZGVyLnBvcyA9IDA7CiAgICAgIGJ1aWxkZXIuYWRkVG9rZW4gPSBidWlsZGVyLm1lYXN1cmUgPyBidWlsZFRva2VuTWVhc3VyZSA6IGJ1aWxkVG9rZW47CiAgICAgIGlmIChtZWFzdXJlICYmIHNhd0JlZm9yZSAmJiBsaW5lICE9IHJlYWxMaW5lICYmICFidWlsZGVyLmFkZGVkT25lKSB7CiAgICAgICAgbWVhc3VyZVswXSA9IGJ1aWxkZXIucHJlLmFwcGVuZENoaWxkKHplcm9XaWR0aEVsZW1lbnQoY20uZGlzcGxheS5tZWFzdXJlKSk7CiAgICAgICAgYnVpbGRlci5hZGRlZE9uZSA9IHRydWU7CiAgICAgIH0KICAgICAgdmFyIG5leHQgPSBpbnNlcnRMaW5lQ29udGVudChsaW5lLCBidWlsZGVyKTsKICAgICAgc2F3QmVmb3JlID0gbGluZSA9PSBsaW5lQmVmb3JlOwogICAgICBpZiAobmV4dCkgewogICAgICAgIGxpbmUgPSBnZXRMaW5lKGNtLnZpZXcuZG9jLCBuZXh0LnRvLmxpbmUpOwogICAgICAgIHNpbXBsZSA9IGZhbHNlOwogICAgICB9CiAgICB9IHdoaWxlIChuZXh0KTsKCiAgICBpZiAobWVhc3VyZSAmJiAhYnVpbGRlci5hZGRlZE9uZSkKICAgICAgbWVhc3VyZVswXSA9IGJ1aWxkZXIucHJlLmFwcGVuZENoaWxkKHNpbXBsZSA/IGVsdCgic3BhbiIsICJcdTAwYTAiKSA6IHplcm9XaWR0aEVsZW1lbnQoY20uZGlzcGxheS5tZWFzdXJlKSk7CiAgICBpZiAoIWJ1aWxkZXIucHJlLmZpcnN0Q2hpbGQgJiYgIWxpbmVJc0hpZGRlbihyZWFsTGluZSkpCiAgICAgIGJ1aWxkZXIucHJlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJcdTAwYTAiKSk7CgogICAgcmV0dXJuIGJ1aWxkZXIucHJlOwogIH0KCiAgdmFyIHRva2VuU3BlY2lhbENoYXJzID0gL1tcdFx1MDAwMC1cdTAwMTlcdTIwMGJcdTIwMjhcdTIwMjlcdUZFRkZdL2c7CiAgZnVuY3Rpb24gYnVpbGRUb2tlbihidWlsZGVyLCB0ZXh0LCBzdHlsZSwgc3RhcnRTdHlsZSwgZW5kU3R5bGUpIHsKICAgIGlmICghdGV4dCkgcmV0dXJuOwogICAgaWYgKCF0b2tlblNwZWNpYWxDaGFycy50ZXN0KHRleHQpKSB7CiAgICAgIGJ1aWxkZXIuY29sICs9IHRleHQubGVuZ3RoOwogICAgICB2YXIgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksIHBvcyA9IDA7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdG9rZW5TcGVjaWFsQ2hhcnMubGFzdEluZGV4ID0gcG9zOwogICAgICAgIHZhciBtID0gdG9rZW5TcGVjaWFsQ2hhcnMuZXhlYyh0ZXh0KTsKICAgICAgICB2YXIgc2tpcHBlZCA9IG0gPyBtLmluZGV4IC0gcG9zIDogdGV4dC5sZW5ndGggLSBwb3M7CiAgICAgICAgaWYgKHNraXBwZWQpIHsKICAgICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dC5zbGljZShwb3MsIHBvcyArIHNraXBwZWQpKSk7CiAgICAgICAgICBidWlsZGVyLmNvbCArPSBza2lwcGVkOwogICAgICAgIH0KICAgICAgICBpZiAoIW0pIGJyZWFrOwogICAgICAgIHBvcyArPSBza2lwcGVkICsgMTsKICAgICAgICBpZiAobVswXSA9PSAiXHQiKSB7CiAgICAgICAgICB2YXIgdGFiU2l6ZSA9IGJ1aWxkZXIuY20ub3B0aW9ucy50YWJTaXplLCB0YWJXaWR0aCA9IHRhYlNpemUgLSBidWlsZGVyLmNvbCAlIHRhYlNpemU7CiAgICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGVsdCgic3BhbiIsIHNwYWNlU3RyKHRhYldpZHRoKSwgImNtLXRhYiIpKTsKICAgICAgICAgIGJ1aWxkZXIuY29sICs9IHRhYldpZHRoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgdG9rZW4gPSBlbHQoInNwYW4iLCAiXHUyMDIyIiwgImNtLWludmFsaWRjaGFyIik7CiAgICAgICAgICB0b2tlbi50aXRsZSA9ICJcXHUiICsgbVswXS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTsKICAgICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodG9rZW4pOwogICAgICAgICAgYnVpbGRlci5jb2wgKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChzdHlsZSB8fCBzdGFydFN0eWxlIHx8IGVuZFN0eWxlIHx8IGJ1aWxkZXIubWVhc3VyZSkgewogICAgICB2YXIgZnVsbFN0eWxlID0gc3R5bGUgfHwgIiI7CiAgICAgIGlmIChzdGFydFN0eWxlKSBmdWxsU3R5bGUgKz0gc3RhcnRTdHlsZTsKICAgICAgaWYgKGVuZFN0eWxlKSBmdWxsU3R5bGUgKz0gZW5kU3R5bGU7CiAgICAgIHJldHVybiBidWlsZGVyLnByZS5hcHBlbmRDaGlsZChlbHQoInNwYW4iLCBbY29udGVudF0sIGZ1bGxTdHlsZSkpOwogICAgfQogICAgYnVpbGRlci5wcmUuYXBwZW5kQ2hpbGQoY29udGVudCk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFRva2VuTWVhc3VyZShidWlsZGVyLCB0ZXh0LCBzdHlsZSwgc3RhcnRTdHlsZSwgZW5kU3R5bGUpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7ICsraSkgewogICAgICBpZiAoaSAmJiBpIDwgdGV4dC5sZW5ndGggLSAxICYmCiAgICAgICAgICBidWlsZGVyLmNtLm9wdGlvbnMubGluZVdyYXBwaW5nICYmCiAgICAgICAgICBzcGFuQWZmZWN0c1dyYXBwaW5nLnRlc3QodGV4dC5zbGljZShpIC0gMSwgaSArIDEpKSkKICAgICAgICBidWlsZGVyLnByZS5hcHBlbmRDaGlsZChlbHQoIndiciIpKTsKICAgICAgYnVpbGRlci5tZWFzdXJlW2J1aWxkZXIucG9zKytdID0KICAgICAgICBidWlsZFRva2VuKGJ1aWxkZXIsIHRleHQuY2hhckF0KGkpLCBzdHlsZSwKICAgICAgICAgICAgICAgICAgIGkgPT0gMCAmJiBzdGFydFN0eWxlLCBpID09IHRleHQubGVuZ3RoIC0gMSAmJiBlbmRTdHlsZSk7CiAgICB9CiAgICBpZiAodGV4dC5sZW5ndGgpIGJ1aWxkZXIuYWRkZWRPbmUgPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRDb2xsYXBzZWRTcGFuKGJ1aWxkZXIsIHNpemUsIHdpZGdldCkgewogICAgaWYgKHdpZGdldCkgewogICAgICBpZiAoIWJ1aWxkZXIuZGlzcGxheSkgd2lkZ2V0ID0gd2lkZ2V0LmNsb25lTm9kZSh0cnVlKTsKICAgICAgYnVpbGRlci5wcmUuYXBwZW5kQ2hpbGQod2lkZ2V0KTsKICAgICAgaWYgKGJ1aWxkZXIubWVhc3VyZSAmJiBzaXplKSB7CiAgICAgICAgYnVpbGRlci5tZWFzdXJlW2J1aWxkZXIucG9zXSA9IHdpZGdldDsKICAgICAgICBidWlsZGVyLmFkZGVkT25lID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgYnVpbGRlci5wb3MgKz0gc2l6ZTsKICB9CgogIC8vIE91dHB1dHMgYSBudW1iZXIgb2Ygc3BhbnMgdG8gbWFrZSB1cCBhIGxpbmUsIHRha2luZyBoaWdobGlnaHRpbmcKICAvLyBhbmQgbWFya2VkIHRleHQgaW50byBhY2NvdW50LgogIGZ1bmN0aW9uIGluc2VydExpbmVDb250ZW50KGxpbmUsIGJ1aWxkZXIpIHsKICAgIHZhciBzdCA9IGxpbmUuc3R5bGVzLCBzcGFucyA9IGxpbmUubWFya2VkU3BhbnM7CiAgICBpZiAoIXNwYW5zKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3QubGVuZ3RoOyBpKz0yKQogICAgICAgIGJ1aWxkZXIuYWRkVG9rZW4oYnVpbGRlciwgc3RbaV0sIHN0eWxlVG9DbGFzcyhzdFtpKzFdKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgYWxsVGV4dCA9IGxpbmUudGV4dCwgbGVuID0gYWxsVGV4dC5sZW5ndGg7CiAgICB2YXIgcG9zID0gMCwgaSA9IDAsIHRleHQgPSAiIiwgc3R5bGU7CiAgICB2YXIgbmV4dENoYW5nZSA9IDAsIHNwYW5TdHlsZSwgc3BhbkVuZFN0eWxlLCBzcGFuU3RhcnRTdHlsZSwgY29sbGFwc2VkOwogICAgZm9yICg7OykgewogICAgICBpZiAobmV4dENoYW5nZSA9PSBwb3MpIHsgLy8gVXBkYXRlIGN1cnJlbnQgbWFya2VyIHNldAogICAgICAgIHNwYW5TdHlsZSA9IHNwYW5FbmRTdHlsZSA9IHNwYW5TdGFydFN0eWxlID0gIiI7CiAgICAgICAgY29sbGFwc2VkID0gbnVsbDsgbmV4dENoYW5nZSA9IEluZmluaXR5OwogICAgICAgIHZhciBmb3VuZEJvb2ttYXJrID0gbnVsbDsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgKytqKSB7CiAgICAgICAgICB2YXIgc3AgPSBzcGFuc1tqXSwgbSA9IHNwLm1hcmtlcjsKICAgICAgICAgIGlmIChzcC5mcm9tIDw9IHBvcyAmJiAoc3AudG8gPT0gbnVsbCB8fCBzcC50byA+IHBvcykpIHsKICAgICAgICAgICAgaWYgKHNwLnRvICE9IG51bGwgJiYgbmV4dENoYW5nZSA+IHNwLnRvKSB7IG5leHRDaGFuZ2UgPSBzcC50bzsgc3BhbkVuZFN0eWxlID0gIiI7IH0KICAgICAgICAgICAgaWYgKG0uY2xhc3NOYW1lKSBzcGFuU3R5bGUgKz0gIiAiICsgbS5jbGFzc05hbWU7CiAgICAgICAgICAgIGlmIChtLnN0YXJ0U3R5bGUgJiYgc3AuZnJvbSA9PSBwb3MpIHNwYW5TdGFydFN0eWxlICs9ICIgIiArIG0uc3RhcnRTdHlsZTsKICAgICAgICAgICAgaWYgKG0uZW5kU3R5bGUgJiYgc3AudG8gPT0gbmV4dENoYW5nZSkgc3BhbkVuZFN0eWxlICs9ICIgIiArIG0uZW5kU3R5bGU7CiAgICAgICAgICAgIGlmIChtLmNvbGxhcHNlZCAmJiAoIWNvbGxhcHNlZCB8fCBjb2xsYXBzZWQubWFya2VyLndpZHRoIDwgbS53aWR0aCkpCiAgICAgICAgICAgICAgY29sbGFwc2VkID0gc3A7CiAgICAgICAgICB9IGVsc2UgaWYgKHNwLmZyb20gPiBwb3MgJiYgbmV4dENoYW5nZSA+IHNwLmZyb20pIHsKICAgICAgICAgICAgbmV4dENoYW5nZSA9IHNwLmZyb207CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobS50eXBlID09ICJib29rbWFyayIgJiYgc3AuZnJvbSA9PSBwb3MgJiYgbS5yZXBsYWNlZFdpdGgpCiAgICAgICAgICAgIGZvdW5kQm9va21hcmsgPSBtLnJlcGxhY2VkV2l0aDsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbGxhcHNlZCAmJiAoY29sbGFwc2VkLmZyb20gfHwgMCkgPT0gcG9zKSB7CiAgICAgICAgICBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgKGNvbGxhcHNlZC50byA9PSBudWxsID8gbGVuIDogY29sbGFwc2VkLnRvKSAtIHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWQuZnJvbSAhPSBudWxsICYmIGNvbGxhcHNlZC5tYXJrZXIucmVwbGFjZWRXaXRoKTsKICAgICAgICAgIGlmIChjb2xsYXBzZWQudG8gPT0gbnVsbCkgcmV0dXJuIGNvbGxhcHNlZC5tYXJrZXIuZmluZCgpOwogICAgICAgIH0KICAgICAgICBpZiAoZm91bmRCb29rbWFyayAmJiAhY29sbGFwc2VkKSBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgMCwgZm91bmRCb29rbWFyayk7CiAgICAgIH0KICAgICAgaWYgKHBvcyA+PSBsZW4pIGJyZWFrOwoKICAgICAgdmFyIHVwdG8gPSBNYXRoLm1pbihsZW4sIG5leHRDaGFuZ2UpOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICB2YXIgZW5kID0gcG9zICsgdGV4dC5sZW5ndGg7CiAgICAgICAgICBpZiAoIWNvbGxhcHNlZCkgewogICAgICAgICAgICB2YXIgdG9rZW5UZXh0ID0gZW5kID4gdXB0byA/IHRleHQuc2xpY2UoMCwgdXB0byAtIHBvcykgOiB0ZXh0OwogICAgICAgICAgICBidWlsZGVyLmFkZFRva2VuKGJ1aWxkZXIsIHRva2VuVGV4dCwgc3R5bGUgKyBzcGFuU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhblN0YXJ0U3R5bGUsIHBvcyArIHRva2VuVGV4dC5sZW5ndGggPT0gbmV4dENoYW5nZSA/IHNwYW5FbmRTdHlsZSA6ICIiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChlbmQgPj0gdXB0bykge3RleHQgPSB0ZXh0LnNsaWNlKHVwdG8gLSBwb3MpOyBwb3MgPSB1cHRvOyBicmVhazt9CiAgICAgICAgICBwb3MgPSBlbmQ7CiAgICAgICAgICBzcGFuU3RhcnRTdHlsZSA9ICIiOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gc3RbaSsrXTsgc3R5bGUgPSBzdHlsZVRvQ2xhc3Moc3RbaSsrXSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIERPQ1VNRU5UIERBVEEgU1RSVUNUVVJFCgogIGZ1bmN0aW9uIExlYWZDaHVuayhsaW5lcykgewogICAgdGhpcy5saW5lcyA9IGxpbmVzOwogICAgdGhpcy5wYXJlbnQgPSBudWxsOwogICAgZm9yICh2YXIgaSA9IDAsIGUgPSBsaW5lcy5sZW5ndGgsIGhlaWdodCA9IDA7IGkgPCBlOyArK2kpIHsKICAgICAgbGluZXNbaV0ucGFyZW50ID0gdGhpczsKICAgICAgaGVpZ2h0ICs9IGxpbmVzW2ldLmhlaWdodDsKICAgIH0KICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwogIH0KCiAgTGVhZkNodW5rLnByb3RvdHlwZSA9IHsKICAgIGNodW5rU2l6ZTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmxpbmVzLmxlbmd0aDsgfSwKICAgIHJlbW92ZTogZnVuY3Rpb24oYXQsIG4sIGNtKSB7CiAgICAgIGZvciAodmFyIGkgPSBhdCwgZSA9IGF0ICsgbjsgaSA8IGU7ICsraSkgewogICAgICAgIHZhciBsaW5lID0gdGhpcy5saW5lc1tpXTsKICAgICAgICB0aGlzLmhlaWdodCAtPSBsaW5lLmhlaWdodDsKICAgICAgICBjbGVhblVwTGluZShsaW5lKTsKICAgICAgICBzaWduYWxMYXRlcihjbSwgbGluZSwgImRlbGV0ZSIpOwogICAgICB9CiAgICAgIHRoaXMubGluZXMuc3BsaWNlKGF0LCBuKTsKICAgIH0sCiAgICBjb2xsYXBzZTogZnVuY3Rpb24obGluZXMpIHsKICAgICAgbGluZXMuc3BsaWNlLmFwcGx5KGxpbmVzLCBbbGluZXMubGVuZ3RoLCAwXS5jb25jYXQodGhpcy5saW5lcykpOwogICAgfSwKICAgIGluc2VydEhlaWdodDogZnVuY3Rpb24oYXQsIGxpbmVzLCBoZWlnaHQpIHsKICAgICAgdGhpcy5oZWlnaHQgKz0gaGVpZ2h0OwogICAgICB0aGlzLmxpbmVzID0gdGhpcy5saW5lcy5zbGljZSgwLCBhdCkuY29uY2F0KGxpbmVzKS5jb25jYXQodGhpcy5saW5lcy5zbGljZShhdCkpOwogICAgICBmb3IgKHZhciBpID0gMCwgZSA9IGxpbmVzLmxlbmd0aDsgaSA8IGU7ICsraSkgbGluZXNbaV0ucGFyZW50ID0gdGhpczsKICAgIH0sCiAgICBpdGVyTjogZnVuY3Rpb24oYXQsIG4sIG9wKSB7CiAgICAgIGZvciAodmFyIGUgPSBhdCArIG47IGF0IDwgZTsgKythdCkKICAgICAgICBpZiAob3AodGhpcy5saW5lc1thdF0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBCcmFuY2hDaHVuayhjaGlsZHJlbikgewogICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwogICAgdmFyIHNpemUgPSAwLCBoZWlnaHQgPSAwOwogICAgZm9yICh2YXIgaSA9IDAsIGUgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBlOyArK2kpIHsKICAgICAgdmFyIGNoID0gY2hpbGRyZW5baV07CiAgICAgIHNpemUgKz0gY2guY2h1bmtTaXplKCk7IGhlaWdodCArPSBjaC5oZWlnaHQ7CiAgICAgIGNoLnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICB0aGlzLnNpemUgPSBzaXplOwogICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICB0aGlzLnBhcmVudCA9IG51bGw7CiAgfQoKICBCcmFuY2hDaHVuay5wcm90b3R5cGUgPSB7CiAgICBjaHVua1NpemU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5zaXplOyB9LAogICAgcmVtb3ZlOiBmdW5jdGlvbihhdCwgbiwgY2FsbGJhY2tzKSB7CiAgICAgIHRoaXMuc2l6ZSAtPSBuOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBzeiA9IGNoaWxkLmNodW5rU2l6ZSgpOwogICAgICAgIGlmIChhdCA8IHN6KSB7CiAgICAgICAgICB2YXIgcm0gPSBNYXRoLm1pbihuLCBzeiAtIGF0KSwgb2xkSGVpZ2h0ID0gY2hpbGQuaGVpZ2h0OwogICAgICAgICAgY2hpbGQucmVtb3ZlKGF0LCBybSwgY2FsbGJhY2tzKTsKICAgICAgICAgIHRoaXMuaGVpZ2h0IC09IG9sZEhlaWdodCAtIGNoaWxkLmhlaWdodDsKICAgICAgICAgIGlmIChzeiA9PSBybSkgeyB0aGlzLmNoaWxkcmVuLnNwbGljZShpLS0sIDEpOyBjaGlsZC5wYXJlbnQgPSBudWxsOyB9CiAgICAgICAgICBpZiAoKG4gLT0gcm0pID09IDApIGJyZWFrOwogICAgICAgICAgYXQgPSAwOwogICAgICAgIH0gZWxzZSBhdCAtPSBzejsKICAgICAgfQogICAgICBpZiAodGhpcy5zaXplIC0gbiA8IDI1KSB7CiAgICAgICAgdmFyIGxpbmVzID0gW107CiAgICAgICAgdGhpcy5jb2xsYXBzZShsaW5lcyk7CiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtuZXcgTGVhZkNodW5rKGxpbmVzKV07CiAgICAgICAgdGhpcy5jaGlsZHJlblswXS5wYXJlbnQgPSB0aGlzOwogICAgICB9CiAgICB9LAogICAgY29sbGFwc2U6IGZ1bmN0aW9uKGxpbmVzKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBlID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBlOyArK2kpIHRoaXMuY2hpbGRyZW5baV0uY29sbGFwc2UobGluZXMpOwogICAgfSwKICAgIGluc2VydDogZnVuY3Rpb24oYXQsIGxpbmVzKSB7CiAgICAgIHZhciBoZWlnaHQgPSAwOwogICAgICBmb3IgKHZhciBpID0gMCwgZSA9IGxpbmVzLmxlbmd0aDsgaSA8IGU7ICsraSkgaGVpZ2h0ICs9IGxpbmVzW2ldLmhlaWdodDsKICAgICAgdGhpcy5pbnNlcnRIZWlnaHQoYXQsIGxpbmVzLCBoZWlnaHQpOwogICAgfSwKICAgIGluc2VydEhlaWdodDogZnVuY3Rpb24oYXQsIGxpbmVzLCBoZWlnaHQpIHsKICAgICAgdGhpcy5zaXplICs9IGxpbmVzLmxlbmd0aDsKICAgICAgdGhpcy5oZWlnaHQgKz0gaGVpZ2h0OwogICAgICBmb3IgKHZhciBpID0gMCwgZSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgZTsgKytpKSB7CiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgc3ogPSBjaGlsZC5jaHVua1NpemUoKTsKICAgICAgICBpZiAoYXQgPD0gc3opIHsKICAgICAgICAgIGNoaWxkLmluc2VydEhlaWdodChhdCwgbGluZXMsIGhlaWdodCk7CiAgICAgICAgICBpZiAoY2hpbGQubGluZXMgJiYgY2hpbGQubGluZXMubGVuZ3RoID4gNTApIHsKICAgICAgICAgICAgd2hpbGUgKGNoaWxkLmxpbmVzLmxlbmd0aCA+IDUwKSB7CiAgICAgICAgICAgICAgdmFyIHNwaWxsZWQgPSBjaGlsZC5saW5lcy5zcGxpY2UoY2hpbGQubGluZXMubGVuZ3RoIC0gMjUsIDI1KTsKICAgICAgICAgICAgICB2YXIgbmV3bGVhZiA9IG5ldyBMZWFmQ2h1bmsoc3BpbGxlZCk7CiAgICAgICAgICAgICAgY2hpbGQuaGVpZ2h0IC09IG5ld2xlYWYuaGVpZ2h0OwogICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGkgKyAxLCAwLCBuZXdsZWFmKTsKICAgICAgICAgICAgICBuZXdsZWFmLnBhcmVudCA9IHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5tYXliZVNwaWxsKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgYXQgLT0gc3o7CiAgICAgIH0KICAgIH0sCiAgICBtYXliZVNwaWxsOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoIDw9IDEwKSByZXR1cm47CiAgICAgIHZhciBtZSA9IHRoaXM7CiAgICAgIGRvIHsKICAgICAgICB2YXIgc3BpbGxlZCA9IG1lLmNoaWxkcmVuLnNwbGljZShtZS5jaGlsZHJlbi5sZW5ndGggLSA1LCA1KTsKICAgICAgICB2YXIgc2libGluZyA9IG5ldyBCcmFuY2hDaHVuayhzcGlsbGVkKTsKICAgICAgICBpZiAoIW1lLnBhcmVudCkgeyAvLyBCZWNvbWUgdGhlIHBhcmVudCBub2RlCiAgICAgICAgICB2YXIgY29weSA9IG5ldyBCcmFuY2hDaHVuayhtZS5jaGlsZHJlbik7CiAgICAgICAgICBjb3B5LnBhcmVudCA9IG1lOwogICAgICAgICAgbWUuY2hpbGRyZW4gPSBbY29weSwgc2libGluZ107CiAgICAgICAgICBtZSA9IGNvcHk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lLnNpemUgLT0gc2libGluZy5zaXplOwogICAgICAgICAgbWUuaGVpZ2h0IC09IHNpYmxpbmcuaGVpZ2h0OwogICAgICAgICAgdmFyIG15SW5kZXggPSBpbmRleE9mKG1lLnBhcmVudC5jaGlsZHJlbiwgbWUpOwogICAgICAgICAgbWUucGFyZW50LmNoaWxkcmVuLnNwbGljZShteUluZGV4ICsgMSwgMCwgc2libGluZyk7CiAgICAgICAgfQogICAgICAgIHNpYmxpbmcucGFyZW50ID0gbWUucGFyZW50OwogICAgICB9IHdoaWxlIChtZS5jaGlsZHJlbi5sZW5ndGggPiAxMCk7CiAgICAgIG1lLnBhcmVudC5tYXliZVNwaWxsKCk7CiAgICB9LAogICAgaXRlcjogZnVuY3Rpb24oZnJvbSwgdG8sIG9wKSB7IHRoaXMuaXRlck4oZnJvbSwgdG8gLSBmcm9tLCBvcCk7IH0sCiAgICBpdGVyTjogZnVuY3Rpb24oYXQsIG4sIG9wKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBlID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBlOyArK2kpIHsKICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBzeiA9IGNoaWxkLmNodW5rU2l6ZSgpOwogICAgICAgIGlmIChhdCA8IHN6KSB7CiAgICAgICAgICB2YXIgdXNlZCA9IE1hdGgubWluKG4sIHN6IC0gYXQpOwogICAgICAgICAgaWYgKGNoaWxkLml0ZXJOKGF0LCB1c2VkLCBvcCkpIHJldHVybiB0cnVlOwogICAgICAgICAgaWYgKChuIC09IHVzZWQpID09IDApIGJyZWFrOwogICAgICAgICAgYXQgPSAwOwogICAgICAgIH0gZWxzZSBhdCAtPSBzejsKICAgICAgfQogICAgfQogIH07CgogIC8vIExJTkUgVVRJTElUSUVTCgogIGZ1bmN0aW9uIGdldExpbmUoY2h1bmssIG4pIHsKICAgIHdoaWxlICghY2h1bmsubGluZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7OyArK2kpIHsKICAgICAgICB2YXIgY2hpbGQgPSBjaHVuay5jaGlsZHJlbltpXSwgc3ogPSBjaGlsZC5jaHVua1NpemUoKTsKICAgICAgICBpZiAobiA8IHN6KSB7IGNodW5rID0gY2hpbGQ7IGJyZWFrOyB9CiAgICAgICAgbiAtPSBzejsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNodW5rLmxpbmVzW25dOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlTGluZUhlaWdodChsaW5lLCBoZWlnaHQpIHsKICAgIHZhciBkaWZmID0gaGVpZ2h0IC0gbGluZS5oZWlnaHQ7CiAgICBmb3IgKHZhciBuID0gbGluZTsgbjsgbiA9IG4ucGFyZW50KSBuLmhlaWdodCArPSBkaWZmOwogIH0KCiAgZnVuY3Rpb24gbGluZU5vKGxpbmUpIHsKICAgIGlmIChsaW5lLnBhcmVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHZhciBjdXIgPSBsaW5lLnBhcmVudCwgbm8gPSBpbmRleE9mKGN1ci5saW5lcywgbGluZSk7CiAgICBmb3IgKHZhciBjaHVuayA9IGN1ci5wYXJlbnQ7IGNodW5rOyBjdXIgPSBjaHVuaywgY2h1bmsgPSBjaHVuay5wYXJlbnQpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7OyArK2kpIHsKICAgICAgICBpZiAoY2h1bmsuY2hpbGRyZW5baV0gPT0gY3VyKSBicmVhazsKICAgICAgICBubyArPSBjaHVuay5jaGlsZHJlbltpXS5jaHVua1NpemUoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vOwogIH0KCiAgZnVuY3Rpb24gbGluZUF0SGVpZ2h0KGNodW5rLCBoKSB7CiAgICB2YXIgbiA9IDA7CiAgICBvdXRlcjogZG8gewogICAgICBmb3IgKHZhciBpID0gMCwgZSA9IGNodW5rLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGU7ICsraSkgewogICAgICAgIHZhciBjaGlsZCA9IGNodW5rLmNoaWxkcmVuW2ldLCBjaCA9IGNoaWxkLmhlaWdodDsKICAgICAgICBpZiAoaCA8IGNoKSB7IGNodW5rID0gY2hpbGQ7IGNvbnRpbnVlIG91dGVyOyB9CiAgICAgICAgaCAtPSBjaDsKICAgICAgICBuICs9IGNoaWxkLmNodW5rU2l6ZSgpOwogICAgICB9CiAgICAgIHJldHVybiBuOwogICAgfSB3aGlsZSAoIWNodW5rLmxpbmVzKTsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gY2h1bmsubGluZXMubGVuZ3RoOyBpIDwgZTsgKytpKSB7CiAgICAgIHZhciBsaW5lID0gY2h1bmsubGluZXNbaV0sIGxoID0gbGluZS5oZWlnaHQ7CiAgICAgIGlmIChoIDwgbGgpIGJyZWFrOwogICAgICBoIC09IGxoOwogICAgfQogICAgcmV0dXJuIG4gKyBpOwogIH0KCiAgZnVuY3Rpb24gaGVpZ2h0QXRMaW5lKGNtLCBsaW5lT2JqKSB7CiAgICBsaW5lT2JqID0gdmlzdWFsTGluZShjbS52aWV3LmRvYywgbGluZU9iaik7CgogICAgdmFyIGggPSAwLCBjaHVuayA9IGxpbmVPYmoucGFyZW50OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaHVuay5saW5lcy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgbGluZSA9IGNodW5rLmxpbmVzW2ldOwogICAgICBpZiAobGluZSA9PSBsaW5lT2JqKSBicmVhazsKICAgICAgZWxzZSBoICs9IGxpbmUuaGVpZ2h0OwogICAgfQogICAgZm9yICh2YXIgcCA9IGNodW5rLnBhcmVudDsgcDsgY2h1bmsgPSBwLCBwID0gY2h1bmsucGFyZW50KSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcC5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBjdXIgPSBwLmNoaWxkcmVuW2ldOwogICAgICAgIGlmIChjdXIgPT0gY2h1bmspIGJyZWFrOwogICAgICAgIGVsc2UgaCArPSBjdXIuaGVpZ2h0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaDsKICB9CgogIGZ1bmN0aW9uIGdldE9yZGVyKGxpbmUpIHsKICAgIHZhciBvcmRlciA9IGxpbmUub3JkZXI7CiAgICBpZiAob3JkZXIgPT0gbnVsbCkgb3JkZXIgPSBsaW5lLm9yZGVyID0gYmlkaU9yZGVyaW5nKGxpbmUudGV4dCk7CiAgICByZXR1cm4gb3JkZXI7CiAgfQoKICAvLyBISVNUT1JZCgogIGZ1bmN0aW9uIG1ha2VIaXN0b3J5KCkgewogICAgcmV0dXJuIHsKICAgICAgLy8gQXJyYXlzIG9mIGhpc3RvcnkgZXZlbnRzLiBEb2luZyBzb21ldGhpbmcgYWRkcyBhbiBldmVudCB0bwogICAgICAvLyBkb25lIGFuZCBjbGVhcnMgdW5kby4gVW5kb2luZyBtb3ZlcyBldmVudHMgZnJvbSBkb25lIHRvCiAgICAgIC8vIHVuZG9uZSwgcmVkb2luZyBtb3ZlcyB0aGVtIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uCiAgICAgIGRvbmU6IFtdLCB1bmRvbmU6IFtdLAogICAgICAvLyBVc2VkIHRvIHRyYWNrIHdoZW4gY2hhbmdlcyBjYW4gYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgdW5kbwogICAgICAvLyBldmVudAogICAgICBsYXN0VGltZTogMCwgbGFzdE9wOiBudWxsLCBsYXN0T3JpZ2luOiBudWxsLAogICAgICAvLyBVc2VkIGJ5IHRoZSBpc0NsZWFuKCkgbWV0aG9kCiAgICAgIGRpcnR5Q291bnRlcjogMAogICAgfTsKICB9CgogIGZ1bmN0aW9uIGFkZENoYW5nZShjbSwgc3RhcnQsIGFkZGVkLCBvbGQsIG9yaWdpbiwgZnJvbUJlZm9yZSwgdG9CZWZvcmUsIGZyb21BZnRlciwgdG9BZnRlcikgewogICAgdmFyIGhpc3RvcnkgPSBjbS52aWV3Lmhpc3Rvcnk7CiAgICBoaXN0b3J5LnVuZG9uZS5sZW5ndGggPSAwOwogICAgdmFyIHRpbWUgPSArbmV3IERhdGUsIGN1ciA9IGxzdChoaXN0b3J5LmRvbmUpOwogICAgCiAgICBpZiAoY3VyICYmCiAgICAgICAgKGhpc3RvcnkubGFzdE9wID09IGNtLmN1ck9wLmlkIHx8CiAgICAgICAgIGhpc3RvcnkubGFzdE9yaWdpbiA9PSBvcmlnaW4gJiYgKG9yaWdpbiA9PSAiaW5wdXQiIHx8IG9yaWdpbiA9PSAiZGVsZXRlIikgJiYKICAgICAgICAgaGlzdG9yeS5sYXN0VGltZSA+IHRpbWUgLSA2MDApKSB7CiAgICAgIC8vIE1lcmdlIHRoaXMgY2hhbmdlIGludG8gdGhlIGxhc3QgZXZlbnQKICAgICAgdmFyIGxhc3QgPSBsc3QoY3VyLmV2ZW50cyk7CiAgICAgIGlmIChsYXN0LnN0YXJ0ID4gc3RhcnQgKyBvbGQubGVuZ3RoIHx8IGxhc3Quc3RhcnQgKyBsYXN0LmFkZGVkIDwgc3RhcnQpIHsKICAgICAgICAvLyBEb2Vzbid0IGludGVyc2VjdCB3aXRoIGxhc3Qgc3ViLWV2ZW50LCBhZGQgbmV3IHN1Yi1ldmVudAogICAgICAgIGN1ci5ldmVudHMucHVzaCh7c3RhcnQ6IHN0YXJ0LCBhZGRlZDogYWRkZWQsIG9sZDogb2xkfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUGF0Y2ggdXAgdGhlIGxhc3Qgc3ViLWV2ZW50CiAgICAgICAgdmFyIHN0YXJ0QmVmb3JlID0gTWF0aC5tYXgoMCwgbGFzdC5zdGFydCAtIHN0YXJ0KSwKICAgICAgICBlbmRBZnRlciA9IE1hdGgubWF4KDAsIChzdGFydCArIG9sZC5sZW5ndGgpIC0gKGxhc3Quc3RhcnQgKyBsYXN0LmFkZGVkKSk7CiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0QmVmb3JlOyBpID4gMDsgLS1pKSBsYXN0Lm9sZC51bnNoaWZ0KG9sZFtpIC0gMV0pOwogICAgICAgIGZvciAodmFyIGkgPSBlbmRBZnRlcjsgaSA+IDA7IC0taSkgbGFzdC5vbGQucHVzaChvbGRbb2xkLmxlbmd0aCAtIGldKTsKICAgICAgICBpZiAoc3RhcnRCZWZvcmUpIGxhc3Quc3RhcnQgPSBzdGFydDsKICAgICAgICBsYXN0LmFkZGVkICs9IGFkZGVkIC0gKG9sZC5sZW5ndGggLSBzdGFydEJlZm9yZSAtIGVuZEFmdGVyKTsKICAgICAgfQogICAgICBjdXIuZnJvbUFmdGVyID0gZnJvbUFmdGVyOyBjdXIudG9BZnRlciA9IHRvQWZ0ZXI7CiAgICB9IGVsc2UgewogICAgICAvLyBDYW4gbm90IGJlIG1lcmdlZCwgc3RhcnQgYSBuZXcgZXZlbnQuCiAgICAgIGN1ciA9IHtldmVudHM6IFt7c3RhcnQ6IHN0YXJ0LCBhZGRlZDogYWRkZWQsIG9sZDogb2xkfV0sCiAgICAgICAgICAgICBmcm9tQmVmb3JlOiBmcm9tQmVmb3JlLCB0b0JlZm9yZTogdG9CZWZvcmUsIGZyb21BZnRlcjogZnJvbUFmdGVyLCB0b0FmdGVyOiB0b0FmdGVyfTsKICAgICAgaGlzdG9yeS5kb25lLnB1c2goY3VyKTsKICAgICAgd2hpbGUgKGhpc3RvcnkuZG9uZS5sZW5ndGggPiBjbS5vcHRpb25zLnVuZG9EZXB0aCkKICAgICAgICBoaXN0b3J5LmRvbmUuc2hpZnQoKTsKICAgICAgaWYgKGhpc3RvcnkuZGlydHlDb3VudGVyIDwgMCkKICAgICAgICAgIC8vIFRoZSB1c2VyIGhhcyBtYWRlIGEgY2hhbmdlIGFmdGVyIHVuZG9pbmcgcGFzdCB0aGUgbGFzdCBjbGVhbiBzdGF0ZS4gCiAgICAgICAgICAvLyBXZSBjYW4gbmV2ZXIgZ2V0IGJhY2sgdG8gYSBjbGVhbiBzdGF0ZSBub3cgdW50aWwgbWFya0NsZWFuKCkgaXMgY2FsbGVkLgogICAgICAgICAgaGlzdG9yeS5kaXJ0eUNvdW50ZXIgPSBOYU47CiAgICAgIGVsc2UKICAgICAgICBoaXN0b3J5LmRpcnR5Q291bnRlcisrOwogICAgfQogICAgaGlzdG9yeS5sYXN0VGltZSA9IHRpbWU7CiAgICBoaXN0b3J5Lmxhc3RPcCA9IGNtLmN1ck9wLmlkOwogICAgaGlzdG9yeS5sYXN0T3JpZ2luID0gb3JpZ2luOwogIH0KCiAgLy8gRVZFTlQgT1BFUkFUT1JTCgogIGZ1bmN0aW9uIHN0b3BNZXRob2QoKSB7ZV9zdG9wKHRoaXMpO30KICAvLyBFbnN1cmUgYW4gZXZlbnQgaGFzIGEgc3RvcCBtZXRob2QuCiAgZnVuY3Rpb24gYWRkU3RvcChldmVudCkgewogICAgaWYgKCFldmVudC5zdG9wKSBldmVudC5zdG9wID0gc3RvcE1ldGhvZDsKICAgIHJldHVybiBldmVudDsKICB9CgogIGZ1bmN0aW9uIGVfcHJldmVudERlZmF1bHQoZSkgewogICAgaWYgKGUucHJldmVudERlZmF1bHQpIGUucHJldmVudERlZmF1bHQoKTsKICAgIGVsc2UgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogIH0KICBmdW5jdGlvbiBlX3N0b3BQcm9wYWdhdGlvbihlKSB7CiAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBlbHNlIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gZV9zdG9wKGUpIHtlX3ByZXZlbnREZWZhdWx0KGUpOyBlX3N0b3BQcm9wYWdhdGlvbihlKTt9CiAgQ29kZU1pcnJvci5lX3N0b3AgPSBlX3N0b3A7CiAgQ29kZU1pcnJvci5lX3ByZXZlbnREZWZhdWx0ID0gZV9wcmV2ZW50RGVmYXVsdDsKICBDb2RlTWlycm9yLmVfc3RvcFByb3BhZ2F0aW9uID0gZV9zdG9wUHJvcGFnYXRpb247CgogIGZ1bmN0aW9uIGVfdGFyZ2V0KGUpIHtyZXR1cm4gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50O30KICBmdW5jdGlvbiBlX2J1dHRvbihlKSB7CiAgICB2YXIgYiA9IGUud2hpY2g7CiAgICBpZiAoYiA9PSBudWxsKSB7CiAgICAgIGlmIChlLmJ1dHRvbiAmIDEpIGIgPSAxOwogICAgICBlbHNlIGlmIChlLmJ1dHRvbiAmIDIpIGIgPSAzOwogICAgICBlbHNlIGlmIChlLmJ1dHRvbiAmIDQpIGIgPSAyOwogICAgfQogICAgaWYgKG1hYyAmJiBlLmN0cmxLZXkgJiYgYiA9PSAxKSBiID0gMzsKICAgIHJldHVybiBiOwogIH0KCiAgLy8gQWxsb3cgM3JkLXBhcnR5IGNvZGUgdG8gb3ZlcnJpZGUgZXZlbnQgcHJvcGVydGllcyBieSBhZGRpbmcgYW4gb3ZlcnJpZGUKICAvLyBvYmplY3QgdG8gYW4gZXZlbnQgb2JqZWN0LgogIGZ1bmN0aW9uIGVfcHJvcChlLCBwcm9wKSB7CiAgICB2YXIgb3ZlcnJpZGRlbiA9IGUub3ZlcnJpZGUgJiYgZS5vdmVycmlkZS5oYXNPd25Qcm9wZXJ0eShwcm9wKTsKICAgIHJldHVybiBvdmVycmlkZGVuID8gZS5vdmVycmlkZVtwcm9wXSA6IGVbcHJvcF07CiAgfQoKICAvLyBFVkVOVCBIQU5ETElORwoKICBmdW5jdGlvbiBvbihlbWl0dGVyLCB0eXBlLCBmKSB7CiAgICBpZiAoZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKQogICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpOwogICAgZWxzZSBpZiAoZW1pdHRlci5hdHRhY2hFdmVudCkKICAgICAgZW1pdHRlci5hdHRhY2hFdmVudCgib24iICsgdHlwZSwgZik7CiAgICBlbHNlIHsKICAgICAgdmFyIG1hcCA9IGVtaXR0ZXIuX2hhbmRsZXJzIHx8IChlbWl0dGVyLl9oYW5kbGVycyA9IHt9KTsKICAgICAgdmFyIGFyciA9IG1hcFt0eXBlXSB8fCAobWFwW3R5cGVdID0gW10pOwogICAgICBhcnIucHVzaChmKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG9mZihlbWl0dGVyLCB0eXBlLCBmKSB7CiAgICBpZiAoZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKQogICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpOwogICAgZWxzZSBpZiAoZW1pdHRlci5kZXRhY2hFdmVudCkKICAgICAgZW1pdHRlci5kZXRhY2hFdmVudCgib24iICsgdHlwZSwgZik7CiAgICBlbHNlIHsKICAgICAgdmFyIGFyciA9IGVtaXR0ZXIuX2hhbmRsZXJzICYmIGVtaXR0ZXIuX2hhbmRsZXJzW3R5cGVdOwogICAgICBpZiAoIWFycikgcmV0dXJuOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkKICAgICAgICBpZiAoYXJyW2ldID09IGYpIHsgYXJyLnNwbGljZShpLCAxKTsgYnJlYWs7IH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHNpZ25hbChlbWl0dGVyLCB0eXBlIC8qLCB2YWx1ZXMuLi4qLykgewogICAgdmFyIGFyciA9IGVtaXR0ZXIuX2hhbmRsZXJzICYmIGVtaXR0ZXIuX2hhbmRsZXJzW3R5cGVdOwogICAgaWYgKCFhcnIpIHJldHVybjsKICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSBhcnJbaV0uYXBwbHkobnVsbCwgYXJncyk7CiAgfQoKICBmdW5jdGlvbiBzaWduYWxMYXRlcihjbSwgZW1pdHRlciwgdHlwZSAvKiwgdmFsdWVzLi4uKi8pIHsKICAgIHZhciBhcnIgPSBlbWl0dGVyLl9oYW5kbGVycyAmJiBlbWl0dGVyLl9oYW5kbGVyc1t0eXBlXTsKICAgIGlmICghYXJyKSByZXR1cm47CiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyksIGZsaXN0ID0gY20uY3VyT3AgJiYgY20uY3VyT3AuZGVsYXllZENhbGxiYWNrczsKICAgIGZ1bmN0aW9uIGJuZChmKSB7cmV0dXJuIGZ1bmN0aW9uKCl7Zi5hcHBseShudWxsLCBhcmdzKTt9O307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkKICAgICAgaWYgKGZsaXN0KSBmbGlzdC5wdXNoKGJuZChhcnJbaV0pKTsKICAgICAgZWxzZSBhcnJbaV0uYXBwbHkobnVsbCwgYXJncyk7CiAgfQoKICBmdW5jdGlvbiBoYXNIYW5kbGVyKGVtaXR0ZXIsIHR5cGUpIHsKICAgIHZhciBhcnIgPSBlbWl0dGVyLl9oYW5kbGVycyAmJiBlbWl0dGVyLl9oYW5kbGVyc1t0eXBlXTsKICAgIHJldHVybiBhcnIgJiYgYXJyLmxlbmd0aCA+IDA7CiAgfQoKICBDb2RlTWlycm9yLm9uID0gb247IENvZGVNaXJyb3Iub2ZmID0gb2ZmOyBDb2RlTWlycm9yLnNpZ25hbCA9IHNpZ25hbDsKCiAgLy8gTUlTQyBVVElMSVRJRVMKCiAgLy8gTnVtYmVyIG9mIHBpeGVscyBhZGRlZCB0byBzY3JvbGxlciBhbmQgc2l6ZXIgdG8gaGlkZSBzY3JvbGxiYXIKICB2YXIgc2Nyb2xsZXJDdXRPZmYgPSAzMDsKCiAgLy8gUmV0dXJuZWQgb3IgdGhyb3duIGJ5IHZhcmlvdXMgcHJvdG9jb2xzIHRvIHNpZ25hbCAnSSdtIG5vdAogIC8vIGhhbmRsaW5nIHRoaXMnLgogIHZhciBQYXNzID0gQ29kZU1pcnJvci5QYXNzID0ge3RvU3RyaW5nOiBmdW5jdGlvbigpe3JldHVybiAiQ29kZU1pcnJvci5QYXNzIjt9fTsKCiAgZnVuY3Rpb24gRGVsYXllZCgpIHt0aGlzLmlkID0gbnVsbDt9CiAgRGVsYXllZC5wcm90b3R5cGUgPSB7c2V0OiBmdW5jdGlvbihtcywgZikge2NsZWFyVGltZW91dCh0aGlzLmlkKTsgdGhpcy5pZCA9IHNldFRpbWVvdXQoZiwgbXMpO319OwoKICAvLyBDb3VudHMgdGhlIGNvbHVtbiBvZmZzZXQgaW4gYSBzdHJpbmcsIHRha2luZyB0YWJzIGludG8gYWNjb3VudC4KICAvLyBVc2VkIG1vc3RseSB0byBmaW5kIGluZGVudGF0aW9uLgogIGZ1bmN0aW9uIGNvdW50Q29sdW1uKHN0cmluZywgZW5kLCB0YWJTaXplKSB7CiAgICBpZiAoZW5kID09IG51bGwpIHsKICAgICAgZW5kID0gc3RyaW5nLnNlYXJjaCgvW15cc1x1MDBhMF0vKTsKICAgICAgaWYgKGVuZCA9PSAtMSkgZW5kID0gc3RyaW5nLmxlbmd0aDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAwLCBuID0gMDsgaSA8IGVuZDsgKytpKSB7CiAgICAgIGlmIChzdHJpbmcuY2hhckF0KGkpID09ICJcdCIpIG4gKz0gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSk7CiAgICAgIGVsc2UgKytuOwogICAgfQogICAgcmV0dXJuIG47CiAgfQogIENvZGVNaXJyb3IuY291bnRDb2x1bW4gPSBjb3VudENvbHVtbjsKCiAgdmFyIHNwYWNlU3RycyA9IFsiIl07CiAgZnVuY3Rpb24gc3BhY2VTdHIobikgewogICAgd2hpbGUgKHNwYWNlU3Rycy5sZW5ndGggPD0gbikKICAgICAgc3BhY2VTdHJzLnB1c2gobHN0KHNwYWNlU3RycykgKyAiICIpOwogICAgcmV0dXJuIHNwYWNlU3Ryc1tuXTsKICB9CgogIGZ1bmN0aW9uIGxzdChhcnIpIHsgcmV0dXJuIGFyclthcnIubGVuZ3RoLTFdOyB9CgogIGZ1bmN0aW9uIHNlbGVjdElucHV0KG5vZGUpIHsKICAgIGlmIChpb3MpIHsgLy8gTW9iaWxlIFNhZmFyaSBhcHBhcmVudGx5IGhhcyBhIGJ1ZyB3aGVyZSBzZWxlY3QoKSBpcyBicm9rZW4uCiAgICAgIG5vZGUuc2VsZWN0aW9uU3RhcnQgPSAwOwogICAgICBub2RlLnNlbGVjdGlvbkVuZCA9IG5vZGUudmFsdWUubGVuZ3RoOwogICAgfSBlbHNlIG5vZGUuc2VsZWN0KCk7CiAgfQoKICBmdW5jdGlvbiBpbmRleE9mKGNvbGxlY3Rpb24sIGVsdCkgewogICAgaWYgKGNvbGxlY3Rpb24uaW5kZXhPZikgcmV0dXJuIGNvbGxlY3Rpb24uaW5kZXhPZihlbHQpOwogICAgZm9yICh2YXIgaSA9IDAsIGUgPSBjb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGU7ICsraSkKICAgICAgaWYgKGNvbGxlY3Rpb25baV0gPT0gZWx0KSByZXR1cm4gaTsKICAgIHJldHVybiAtMTsKICB9CgogIGZ1bmN0aW9uIGVtcHR5QXJyYXkoc2l6ZSkgewogICAgZm9yICh2YXIgYSA9IFtdLCBpID0gMDsgaSA8IHNpemU7ICsraSkgYS5wdXNoKHVuZGVmaW5lZCk7CiAgICByZXR1cm4gYTsKICB9CgogIGZ1bmN0aW9uIGJpbmQoZikgewogICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncyk7fTsKICB9CgogIHZhciBub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciA9IC9bXHUzMDQwLVx1MzA5Zlx1MzBhMC1cdTMwZmZcdTM0MDAtXHU0ZGI1XHU0ZTAwLVx1OWZjY10vOwogIGZ1bmN0aW9uIGlzV29yZENoYXIoY2gpIHsKICAgIHJldHVybiAvXHcvLnRlc3QoY2gpIHx8IGNoID4gIlx4ODAiICYmCiAgICAgIChjaC50b1VwcGVyQ2FzZSgpICE9IGNoLnRvTG93ZXJDYXNlKCkgfHwgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIudGVzdChjaCkpOwogIH0KCiAgZnVuY3Rpb24gaXNFbXB0eShvYmopIHsKICAgIHZhciBjID0gMDsKICAgIGZvciAodmFyIG4gaW4gb2JqKSBpZiAob2JqLmhhc093blByb3BlcnR5KG4pICYmIG9ialtuXSkgKytjOwogICAgcmV0dXJuICFjOwogIH0KCiAgdmFyIGlzRXh0ZW5kaW5nQ2hhciA9IC9bXHUwMzAwLVx1MDM2Rlx1MDQ4My1cdTA0ODdcdTA0ODgtXHUwNDg5XHUwNTkxLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzQtXHUwNUM1XHUwNUM3XHUwNjEwLVx1MDYxQVx1MDY0Qi1cdTA2NUZcdTA2NzBcdTA2RDYtXHUwNkRDXHUwNkRGLVx1MDZFNFx1MDZFNy1cdTA2RThcdTA2RUEtXHUwNkVEXHVBNjZGXHVBNjcwLVx1QTY3Mlx1QTY3NC1cdUE2N0RcdUE2OUZdLzsKCiAgLy8gRE9NIFVUSUxJVElFUwoKICBmdW5jdGlvbiBlbHQodGFnLCBjb250ZW50LCBjbGFzc05hbWUsIHN0eWxlKSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChjbGFzc05hbWUpIGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgaWYgKHN0eWxlKSBlLnN0eWxlLmNzc1RleHQgPSBzdHlsZTsKICAgIGlmICh0eXBlb2YgY29udGVudCA9PSAic3RyaW5nIikgc2V0VGV4dENvbnRlbnQoZSwgY29udGVudCk7CiAgICBlbHNlIGlmIChjb250ZW50KSBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyArK2kpIGUuYXBwZW5kQ2hpbGQoY29udGVudFtpXSk7CiAgICByZXR1cm4gZTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZUNoaWxkcmVuKGUpIHsKICAgIGUuaW5uZXJIVE1MID0gIiI7CiAgICByZXR1cm4gZTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZUNoaWxkcmVuQW5kQWRkKHBhcmVudCwgZSkgewogICAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKHBhcmVudCkuYXBwZW5kQ2hpbGQoZSk7CiAgfQoKICBmdW5jdGlvbiBzZXRUZXh0Q29udGVudChlLCBzdHIpIHsKICAgIGlmIChpZV9sdDkpIHsKICAgICAgZS5pbm5lckhUTUwgPSAiIjsKICAgICAgZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHIpKTsKICAgIH0gZWxzZSBlLnRleHRDb250ZW50ID0gc3RyOwogIH0KCiAgLy8gRkVBVFVSRSBERVRFQ1RJT04KCiAgLy8gRGV0ZWN0IGRyYWctYW5kLWRyb3AKICB2YXIgZHJhZ0FuZERyb3AgPSBmdW5jdGlvbigpIHsKICAgIC8vIFRoZXJlIGlzICpzb21lKiBraW5kIG9mIGRyYWctYW5kLWRyb3Agc3VwcG9ydCBpbiBJRTYtOCwgYnV0IEkKICAgIC8vIGNvdWxkbid0IGdldCBpdCB0byB3b3JrIHlldC4KICAgIGlmIChpZV9sdDkpIHJldHVybiBmYWxzZTsKICAgIHZhciBkaXYgPSBlbHQoJ2RpdicpOwogICAgcmV0dXJuICJkcmFnZ2FibGUiIGluIGRpdiB8fCAiZHJhZ0Ryb3AiIGluIGRpdjsKICB9KCk7CgogIC8vIEZvciBhIHJlYXNvbiBJIGhhdmUgeWV0IHRvIGZpZ3VyZSBvdXQsIHNvbWUgYnJvd3NlcnMgZGlzYWxsb3cKICAvLyB3b3JkIHdyYXBwaW5nIGJldHdlZW4gY2VydGFpbiBjaGFyYWN0ZXJzICpvbmx5KiBpZiBhIG5ldyBpbmxpbmUKICAvLyBlbGVtZW50IGlzIHN0YXJ0ZWQgYmV0d2VlbiB0aGVtLiBUaGlzIG1ha2VzIGl0IGhhcmQgdG8gcmVsaWFibHkKICAvLyBtZWFzdXJlIHRoZSBwb3NpdGlvbiBvZiB0aGluZ3MsIHNpbmNlIHRoYXQgcmVxdWlyZXMgaW5zZXJ0aW5nIGFuCiAgLy8gZXh0cmEgc3Bhbi4gVGhpcyB0ZXJyaWJseSBmcmFnaWxlIHNldCBvZiByZWdleHBzIG1hdGNoZXMgdGhlCiAgLy8gY2hhcmFjdGVyIGNvbWJpbmF0aW9ucyB0aGF0IHN1ZmZlciBmcm9tIHRoaXMgcGhlbm9tZW5vbiBvbiB0aGUKICAvLyB2YXJpb3VzIGJyb3dzZXJzLgogIHZhciBzcGFuQWZmZWN0c1dyYXBwaW5nID0gL14kLzsgLy8gV29uJ3QgbWF0Y2ggYW55IHR3by1jaGFyYWN0ZXIgc3RyaW5nCiAgaWYgKGdlY2tvKSBzcGFuQWZmZWN0c1dyYXBwaW5nID0gLyQnLzsKICBlbHNlIGlmIChzYWZhcmkpIHNwYW5BZmZlY3RzV3JhcHBpbmcgPSAvXC1bXiBcLT9dfFw/W14gISdcIlwpLC5cLVwvOjtcP1xdXH1dLzsKICBlbHNlIGlmIChjaHJvbWUpIHNwYW5BZmZlY3RzV3JhcHBpbmcgPSAvXC1bXiBcLVwuP118XD9bXiBcLVwuP1xdXH06OyEnXCJcKSxcL118W1wuIVwiIyYlXCkqKyw6Oz0+XF18XH1+XVtcKFx7XFs8XXxcJCcvOwoKICB2YXIga25vd25TY3JvbGxiYXJXaWR0aDsKICBmdW5jdGlvbiBzY3JvbGxiYXJXaWR0aChtZWFzdXJlKSB7CiAgICBpZiAoa25vd25TY3JvbGxiYXJXaWR0aCAhPSBudWxsKSByZXR1cm4ga25vd25TY3JvbGxiYXJXaWR0aDsKICAgIHZhciB0ZXN0ID0gZWx0KCJkaXYiLCBudWxsLCBudWxsLCAid2lkdGg6IDUwcHg7IGhlaWdodDogNTBweDsgb3ZlcmZsb3cteDogc2Nyb2xsIik7CiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChtZWFzdXJlLCB0ZXN0KTsKICAgIGlmICh0ZXN0Lm9mZnNldFdpZHRoKQogICAgICBrbm93blNjcm9sbGJhcldpZHRoID0gdGVzdC5vZmZzZXRIZWlnaHQgLSB0ZXN0LmNsaWVudEhlaWdodDsKICAgIHJldHVybiBrbm93blNjcm9sbGJhcldpZHRoIHx8IDA7CiAgfQoKICB2YXIgendzcFN1cHBvcnRlZDsKICBmdW5jdGlvbiB6ZXJvV2lkdGhFbGVtZW50KG1lYXN1cmUpIHsKICAgIGlmICh6d3NwU3VwcG9ydGVkID09IG51bGwpIHsKICAgICAgdmFyIHRlc3QgPSBlbHQoInNwYW4iLCAiXHUyMDBiIik7CiAgICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGVsdCgic3BhbiIsIFt0ZXN0LCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgieCIpXSkpOwogICAgICBpZiAobWVhc3VyZS5maXJzdENoaWxkLm9mZnNldEhlaWdodCAhPSAwKQogICAgICAgIHp3c3BTdXBwb3J0ZWQgPSB0ZXN0Lm9mZnNldFdpZHRoIDw9IDEgJiYgdGVzdC5vZmZzZXRIZWlnaHQgPiAyICYmICFpZV9sdDg7CiAgICB9CiAgICBpZiAoendzcFN1cHBvcnRlZCkgcmV0dXJuIGVsdCgic3BhbiIsICJcdTIwMGIiKTsKICAgIGVsc2UgcmV0dXJuIGVsdCgic3BhbiIsICJcdTAwYTAiLCBudWxsLCAiZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogMXB4OyBtYXJnaW4tcmlnaHQ6IC0xcHgiKTsKICB9CgogIC8vIFNlZSBpZiAiIi5zcGxpdCBpcyB0aGUgYnJva2VuIElFIHZlcnNpb24sIGlmIHNvLCBwcm92aWRlIGFuCiAgLy8gYWx0ZXJuYXRpdmUgd2F5IHRvIHNwbGl0IGxpbmVzLgogIHZhciBzcGxpdExpbmVzID0gIlxuXG5iIi5zcGxpdCgvXG4vKS5sZW5ndGggIT0gMyA/IGZ1bmN0aW9uKHN0cmluZykgewogICAgdmFyIHBvcyA9IDAsIHJlc3VsdCA9IFtdLCBsID0gc3RyaW5nLmxlbmd0aDsKICAgIHdoaWxlIChwb3MgPD0gbCkgewogICAgICB2YXIgbmwgPSBzdHJpbmcuaW5kZXhPZigiXG4iLCBwb3MpOwogICAgICBpZiAobmwgPT0gLTEpIG5sID0gc3RyaW5nLmxlbmd0aDsKICAgICAgdmFyIGxpbmUgPSBzdHJpbmcuc2xpY2UocG9zLCBzdHJpbmcuY2hhckF0KG5sIC0gMSkgPT0gIlxyIiA/IG5sIC0gMSA6IG5sKTsKICAgICAgdmFyIHJ0ID0gbGluZS5pbmRleE9mKCJcciIpOwogICAgICBpZiAocnQgIT0gLTEpIHsKICAgICAgICByZXN1bHQucHVzaChsaW5lLnNsaWNlKDAsIHJ0KSk7CiAgICAgICAgcG9zICs9IHJ0ICsgMTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQucHVzaChsaW5lKTsKICAgICAgICBwb3MgPSBubCArIDE7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfSA6IGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgvXHJcbj98XG4vKTt9OwogIENvZGVNaXJyb3Iuc3BsaXRMaW5lcyA9IHNwbGl0TGluZXM7CgogIHZhciBoYXNTZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uID8gZnVuY3Rpb24odGUpIHsKICAgIHRyeSB7IHJldHVybiB0ZS5zZWxlY3Rpb25TdGFydCAhPSB0ZS5zZWxlY3Rpb25FbmQ7IH0KICAgIGNhdGNoKGUpIHsgcmV0dXJuIGZhbHNlOyB9CiAgfSA6IGZ1bmN0aW9uKHRlKSB7CiAgICB0cnkge3ZhciByYW5nZSA9IHRlLm93bmVyRG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7fQogICAgY2F0Y2goZSkge30KICAgIGlmICghcmFuZ2UgfHwgcmFuZ2UucGFyZW50RWxlbWVudCgpICE9IHRlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gcmFuZ2UuY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb0VuZCIsIHJhbmdlKSAhPSAwOwogIH07CgogIHZhciBoYXNDb3B5RXZlbnQgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IGVsdCgiZGl2Iik7CiAgICBpZiAoIm9uY29weSIgaW4gZSkgcmV0dXJuIHRydWU7CiAgICBlLnNldEF0dHJpYnV0ZSgib25jb3B5IiwgInJldHVybjsiKTsKICAgIHJldHVybiB0eXBlb2YgZS5vbmNvcHkgPT0gJ2Z1bmN0aW9uJzsKICB9KSgpOwoKICAvLyBLRVkgTkFNSU5HCgogIHZhciBrZXlOYW1lcyA9IHszOiAiRW50ZXIiLCA4OiAiQmFja3NwYWNlIiwgOTogIlRhYiIsIDEzOiAiRW50ZXIiLCAxNjogIlNoaWZ0IiwgMTc6ICJDdHJsIiwgMTg6ICJBbHQiLAogICAgICAgICAgICAgICAgICAxOTogIlBhdXNlIiwgMjA6ICJDYXBzTG9jayIsIDI3OiAiRXNjIiwgMzI6ICJTcGFjZSIsIDMzOiAiUGFnZVVwIiwgMzQ6ICJQYWdlRG93biIsIDM1OiAiRW5kIiwKICAgICAgICAgICAgICAgICAgMzY6ICJIb21lIiwgMzc6ICJMZWZ0IiwgMzg6ICJVcCIsIDM5OiAiUmlnaHQiLCA0MDogIkRvd24iLCA0NDogIlByaW50U2NybiIsIDQ1OiAiSW5zZXJ0IiwKICAgICAgICAgICAgICAgICAgNDY6ICJEZWxldGUiLCA1OTogIjsiLCA5MTogIk1vZCIsIDkyOiAiTW9kIiwgOTM6ICJNb2QiLCAxMDk6ICItIiwgMTA3OiAiPSIsIDEyNzogIkRlbGV0ZSIsCiAgICAgICAgICAgICAgICAgIDE4NjogIjsiLCAxODc6ICI9IiwgMTg4OiAiLCIsIDE4OTogIi0iLCAxOTA6ICIuIiwgMTkxOiAiLyIsIDE5MjogImAiLCAyMTk6ICJbIiwgMjIwOiAiXFwiLAogICAgICAgICAgICAgICAgICAyMjE6ICJdIiwgMjIyOiAiJyIsIDYzMjc2OiAiUGFnZVVwIiwgNjMyNzc6ICJQYWdlRG93biIsIDYzMjc1OiAiRW5kIiwgNjMyNzM6ICJIb21lIiwKICAgICAgICAgICAgICAgICAgNjMyMzQ6ICJMZWZ0IiwgNjMyMzI6ICJVcCIsIDYzMjM1OiAiUmlnaHQiLCA2MzIzMzogIkRvd24iLCA2MzMwMjogIkluc2VydCIsIDYzMjcyOiAiRGVsZXRlIn07CiAgQ29kZU1pcnJvci5rZXlOYW1lcyA9IGtleU5hbWVzOwogIChmdW5jdGlvbigpIHsKICAgIC8vIE51bWJlciBrZXlzCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIGtleU5hbWVzW2kgKyA0OF0gPSBTdHJpbmcoaSk7CiAgICAvLyBBbHBoYWJldGljIGtleXMKICAgIGZvciAodmFyIGkgPSA2NTsgaSA8PSA5MDsgaSsrKSBrZXlOYW1lc1tpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSk7CiAgICAvLyBGdW5jdGlvbiBrZXlzCiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSAxMjsgaSsrKSBrZXlOYW1lc1tpICsgMTExXSA9IGtleU5hbWVzW2kgKyA2MzIzNV0gPSAiRiIgKyBpOwogIH0pKCk7CgogIC8vIEJJREkgSEVMUEVSUwoKICBmdW5jdGlvbiBpdGVyYXRlQmlkaVNlY3Rpb25zKG9yZGVyLCBmcm9tLCB0bywgZikgewogICAgaWYgKCFvcmRlcikgcmV0dXJuIGYoZnJvbSwgdG8sICJsdHIiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHBhcnQgPSBvcmRlcltpXTsKICAgICAgaWYgKHBhcnQuZnJvbSA8IHRvICYmIHBhcnQudG8gPiBmcm9tKQogICAgICAgIGYoTWF0aC5tYXgocGFydC5mcm9tLCBmcm9tKSwgTWF0aC5taW4ocGFydC50bywgdG8pLCBwYXJ0LmxldmVsID09IDEgPyAicnRsIiA6ICJsdHIiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJpZGlMZWZ0KHBhcnQpIHsgcmV0dXJuIHBhcnQubGV2ZWwgJSAyID8gcGFydC50byA6IHBhcnQuZnJvbTsgfQogIGZ1bmN0aW9uIGJpZGlSaWdodChwYXJ0KSB7IHJldHVybiBwYXJ0LmxldmVsICUgMiA/IHBhcnQuZnJvbSA6IHBhcnQudG87IH0KCiAgZnVuY3Rpb24gbGluZUxlZnQobGluZSkgeyB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lKTsgcmV0dXJuIG9yZGVyID8gYmlkaUxlZnQob3JkZXJbMF0pIDogMDsgfQogIGZ1bmN0aW9uIGxpbmVSaWdodChsaW5lKSB7CiAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lKTsKICAgIGlmICghb3JkZXIpIHJldHVybiBsaW5lLnRleHQubGVuZ3RoOwogICAgcmV0dXJuIGJpZGlSaWdodChsc3Qob3JkZXIpKTsKICB9CgogIGZ1bmN0aW9uIGxpbmVTdGFydChjbSwgbGluZU4pIHsKICAgIHZhciBsaW5lID0gZ2V0TGluZShjbS52aWV3LmRvYywgbGluZU4pOwogICAgdmFyIHZpc3VhbCA9IHZpc3VhbExpbmUoY20udmlldy5kb2MsIGxpbmUpOwogICAgaWYgKHZpc3VhbCAhPSBsaW5lKSBsaW5lTiA9IGxpbmVObyh2aXN1YWwpOwogICAgdmFyIG9yZGVyID0gZ2V0T3JkZXIodmlzdWFsKTsKICAgIHZhciBjaCA9ICFvcmRlciA/IDAgOiBvcmRlclswXS5sZXZlbCAlIDIgPyBsaW5lUmlnaHQodmlzdWFsKSA6IGxpbmVMZWZ0KHZpc3VhbCk7CiAgICByZXR1cm4ge2xpbmU6IGxpbmVOLCBjaDogY2h9OwogIH0KICBmdW5jdGlvbiBsaW5lRW5kKGNtLCBsaW5lTm8pIHsKICAgIHZhciBtZXJnZWQsIGxpbmU7CiAgICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGxpbmUgPSBnZXRMaW5lKGNtLnZpZXcuZG9jLCBsaW5lTm8pKSkKICAgICAgbGluZU5vID0gbWVyZ2VkLmZpbmQoKS50by5saW5lOwogICAgdmFyIG9yZGVyID0gZ2V0T3JkZXIobGluZSk7CiAgICB2YXIgY2ggPSAhb3JkZXIgPyBsaW5lLnRleHQubGVuZ3RoIDogb3JkZXJbMF0ubGV2ZWwgJSAyID8gbGluZUxlZnQobGluZSkgOiBsaW5lUmlnaHQobGluZSk7CiAgICByZXR1cm4ge2xpbmU6IGxpbmVObywgY2g6IGNofTsKICB9CgogIC8vIFRoaXMgaXMgc29tZXdoYXQgaW52b2x2ZWQuIEl0IGlzIG5lZWRlZCBpbiBvcmRlciB0byBtb3ZlCiAgLy8gJ3Zpc3VhbGx5JyB0aHJvdWdoIGJpLWRpcmVjdGlvbmFsIHRleHQgLS0gaS5lLiwgcHJlc3NpbmcgbGVmdAogIC8vIHNob3VsZCBtYWtlIHRoZSBjdXJzb3IgZ28gbGVmdCwgZXZlbiB3aGVuIGluIFJUTCB0ZXh0LiBUaGUKICAvLyB0cmlja3kgcGFydCBpcyB0aGUgJ2p1bXBzJywgd2hlcmUgUlRMIGFuZCBMVFIgdGV4dCB0b3VjaCBlYWNoCiAgLy8gb3RoZXIuIFRoaXMgb2Z0ZW4gcmVxdWlyZXMgdGhlIGN1cnNvciBvZmZzZXQgdG8gbW92ZSBtb3JlIHRoYW4KICAvLyBvbmUgdW5pdCwgaW4gb3JkZXIgdG8gdmlzdWFsbHkgbW92ZSBvbmUgdW5pdC4KICBmdW5jdGlvbiBtb3ZlVmlzdWFsbHkobGluZSwgc3RhcnQsIGRpciwgYnlVbml0KSB7CiAgICB2YXIgYmlkaSA9IGdldE9yZGVyKGxpbmUpOwogICAgaWYgKCFiaWRpKSByZXR1cm4gbW92ZUxvZ2ljYWxseShsaW5lLCBzdGFydCwgZGlyLCBieVVuaXQpOwogICAgdmFyIG1vdmVPbmVVbml0ID0gYnlVbml0ID8gZnVuY3Rpb24ocG9zLCBkaXIpIHsKICAgICAgZG8gcG9zICs9IGRpcjsKICAgICAgd2hpbGUgKHBvcyA+IDAgJiYgaXNFeHRlbmRpbmdDaGFyLnRlc3QobGluZS50ZXh0LmNoYXJBdChwb3MpKSk7CiAgICAgIHJldHVybiBwb3M7CiAgICB9IDogZnVuY3Rpb24ocG9zLCBkaXIpIHsgcmV0dXJuIHBvcyArIGRpcjsgfTsKICAgIHZhciBsaW5lZGlyID0gYmlkaVswXS5sZXZlbDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmlkaS5sZW5ndGg7ICsraSkgewogICAgICB2YXIgcGFydCA9IGJpZGlbaV0sIHN0aWNreSA9IHBhcnQubGV2ZWwgJSAyID09IGxpbmVkaXI7CiAgICAgIGlmICgocGFydC5mcm9tIDwgc3RhcnQgJiYgcGFydC50byA+IHN0YXJ0KSB8fAogICAgICAgICAgKHN0aWNreSAmJiAocGFydC5mcm9tID09IHN0YXJ0IHx8IHBhcnQudG8gPT0gc3RhcnQpKSkgYnJlYWs7CiAgICB9CiAgICB2YXIgdGFyZ2V0ID0gbW92ZU9uZVVuaXQoc3RhcnQsIHBhcnQubGV2ZWwgJSAyID8gLWRpciA6IGRpcik7CgogICAgd2hpbGUgKHRhcmdldCAhPSBudWxsKSB7CiAgICAgIGlmIChwYXJ0LmxldmVsICUgMiA9PSBsaW5lZGlyKSB7CiAgICAgICAgaWYgKHRhcmdldCA8IHBhcnQuZnJvbSB8fCB0YXJnZXQgPiBwYXJ0LnRvKSB7CiAgICAgICAgICBwYXJ0ID0gYmlkaVtpICs9IGRpcl07CiAgICAgICAgICB0YXJnZXQgPSBwYXJ0ICYmIChkaXIgPiAwID09IHBhcnQubGV2ZWwgJSAyID8gbW92ZU9uZVVuaXQocGFydC50bywgLTEpIDogbW92ZU9uZVVuaXQocGFydC5mcm9tLCAxKSk7CiAgICAgICAgfSBlbHNlIGJyZWFrOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0YXJnZXQgPT0gYmlkaUxlZnQocGFydCkpIHsKICAgICAgICAgIHBhcnQgPSBiaWRpWy0taV07CiAgICAgICAgICB0YXJnZXQgPSBwYXJ0ICYmIGJpZGlSaWdodChwYXJ0KTsKICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBiaWRpUmlnaHQocGFydCkpIHsKICAgICAgICAgIHBhcnQgPSBiaWRpWysraV07CiAgICAgICAgICB0YXJnZXQgPSBwYXJ0ICYmIGJpZGlMZWZ0KHBhcnQpOwogICAgICAgIH0gZWxzZSBicmVhazsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0YXJnZXQgPCAwIHx8IHRhcmdldCA+IGxpbmUudGV4dC5sZW5ndGggPyBudWxsIDogdGFyZ2V0OwogIH0KCiAgZnVuY3Rpb24gbW92ZUxvZ2ljYWxseShsaW5lLCBzdGFydCwgZGlyLCBieVVuaXQpIHsKICAgIHZhciB0YXJnZXQgPSBzdGFydCArIGRpcjsKICAgIGlmIChieVVuaXQpIHdoaWxlICh0YXJnZXQgPiAwICYmIGlzRXh0ZW5kaW5nQ2hhci50ZXN0KGxpbmUudGV4dC5jaGFyQXQodGFyZ2V0KSkpIHRhcmdldCArPSBkaXI7CiAgICByZXR1cm4gdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPiBsaW5lLnRleHQubGVuZ3RoID8gbnVsbCA6IHRhcmdldDsKICB9CgogIC8vIEJpZGlyZWN0aW9uYWwgb3JkZXJpbmcgYWxnb3JpdGhtCiAgLy8gU2VlIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyOS90cjktMTMuaHRtbCBmb3IgdGhlIGFsZ29yaXRobQogIC8vIHRoYXQgdGhpcyAocGFydGlhbGx5KSBpbXBsZW1lbnRzLgoKICAvLyBPbmUtY2hhciBjb2RlcyB1c2VkIGZvciBjaGFyYWN0ZXIgdHlwZXM6CiAgLy8gTCAoTCk6ICAgTGVmdC10by1SaWdodAogIC8vIFIgKFIpOiAgIFJpZ2h0LXRvLUxlZnQKICAvLyByIChBTCk6ICBSaWdodC10by1MZWZ0IEFyYWJpYwogIC8vIDEgKEVOKTogIEV1cm9wZWFuIE51bWJlcgogIC8vICsgKEVTKTogIEV1cm9wZWFuIE51bWJlciBTZXBhcmF0b3IKICAvLyAlIChFVCk6ICBFdXJvcGVhbiBOdW1iZXIgVGVybWluYXRvcgogIC8vIG4gKEFOKTogIEFyYWJpYyBOdW1iZXIKICAvLyAsIChDUyk6ICBDb21tb24gTnVtYmVyIFNlcGFyYXRvcgogIC8vIG0gKE5TTSk6IE5vbi1TcGFjaW5nIE1hcmsKICAvLyBiIChCTik6ICBCb3VuZGFyeSBOZXV0cmFsCiAgLy8gcyAoQik6ICAgUGFyYWdyYXBoIFNlcGFyYXRvcgogIC8vIHQgKFMpOiAgIFNlZ21lbnQgU2VwYXJhdG9yCiAgLy8gdyAoV1MpOiAgV2hpdGVzcGFjZQogIC8vIE4gKE9OKTogIE90aGVyIE5ldXRyYWxzCgogIC8vIFJldHVybnMgbnVsbCBpZiBjaGFyYWN0ZXJzIGFyZSBvcmRlcmVkIGFzIHRoZXkgYXBwZWFyCiAgLy8gKGxlZnQtdG8tcmlnaHQpLCBvciBhbiBhcnJheSBvZiBzZWN0aW9ucyAoe2Zyb20sIHRvLCBsZXZlbH0KICAvLyBvYmplY3RzKSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1ciB2aXN1YWxseS4KICB2YXIgYmlkaU9yZGVyaW5nID0gKGZ1bmN0aW9uKCkgewogICAgLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDAgdG8gMHhmZgogICAgdmFyIGxvd1R5cGVzID0gImJiYmJiYmJiYnRzdHdzYmJiYmJiYmJiYmJiYmJzc3N0d05OJSUlTk5OTk5OLE4sTjExMTExMTExMTFOTk5OTk5OTExMTExMTExMTExMTExMTExMTExMTExMTExOTk5OTk5MTExMTExMTExMTExMTExMTExMTExMTExMTE5OTk5iYmJiYmJzYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIsTiUlJSVOTk5OTE5OTk5OJSUxMU5MTk5OMUxOTk5OTkxMTExMTExMTExMTExMTExMTExMTExMTkxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExOTExMTExMTEwiOwogICAgLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDB4NjAwIHRvIDB4NmZmCiAgICB2YXIgYXJhYmljVHlwZXMgPSAicnJycnJycnJycnJyLHJOTm1tbW1tbXJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJybW1tbW1tbW1tbW1tbW1ycnJycnJybm5ubm5ubm5ubiVubnJycm1ycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycm1tbW1tbW1tbW1tbW1tbW1tbW1ObW1tbXJycnJycnJycnJycnJycnJyciI7CiAgICBmdW5jdGlvbiBjaGFyVHlwZShjb2RlKSB7CiAgICAgIGlmIChjb2RlIDw9IDB4ZmYpIHJldHVybiBsb3dUeXBlcy5jaGFyQXQoY29kZSk7CiAgICAgIGVsc2UgaWYgKDB4NTkwIDw9IGNvZGUgJiYgY29kZSA8PSAweDVmNCkgcmV0dXJuICJSIjsKICAgICAgZWxzZSBpZiAoMHg2MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4NmZmKSByZXR1cm4gYXJhYmljVHlwZXMuY2hhckF0KGNvZGUgLSAweDYwMCk7CiAgICAgIGVsc2UgaWYgKDB4NzAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDhhYykgcmV0dXJuICJyIjsKICAgICAgZWxzZSByZXR1cm4gIkwiOwogICAgfQoKICAgIHZhciBiaWRpUkUgPSAvW1x1MDU5MC1cdTA1ZjRcdTA2MDAtXHUwNmZmXHUwNzAwLVx1MDhhY10vOwogICAgdmFyIGlzTmV1dHJhbCA9IC9bc3R3Tl0vLCBpc1N0cm9uZyA9IC9bTFJyXS8sIGNvdW50c0FzTGVmdCA9IC9bTGIxbl0vLCBjb3VudHNBc051bSA9IC9bMW5dLzsKCiAgICByZXR1cm4gZnVuY3Rpb24gY2hhck9yZGVyaW5nKHN0cikgewogICAgICBpZiAoIWJpZGlSRS50ZXN0KHN0cikpIHJldHVybiBmYWxzZTsKICAgICAgdmFyIGxlbiA9IHN0ci5sZW5ndGgsIHR5cGVzID0gW10sIHN0YXJ0VHlwZSA9IG51bGw7CiAgICAgIGZvciAodmFyIGkgPSAwLCB0eXBlOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICB0eXBlcy5wdXNoKHR5cGUgPSBjaGFyVHlwZShzdHIuY2hhckNvZGVBdChpKSkpOwogICAgICAgIGlmIChzdGFydFR5cGUgPT0gbnVsbCkgewogICAgICAgICAgaWYgKHR5cGUgPT0gIkwiKSBzdGFydFR5cGUgPSAiTCI7CiAgICAgICAgICBlbHNlIGlmICh0eXBlID09ICJSIiB8fCB0eXBlID09ICJyIikgc3RhcnRUeXBlID0gIlIiOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RhcnRUeXBlID09IG51bGwpIHN0YXJ0VHlwZSA9ICJMIjsKCiAgICAgIC8vIFcxLiBFeGFtaW5lIGVhY2ggbm9uLXNwYWNpbmcgbWFyayAoTlNNKSBpbiB0aGUgbGV2ZWwgcnVuLCBhbmQKICAgICAgLy8gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBOU00gdG8gdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzCiAgICAgIC8vIGNoYXJhY3Rlci4gSWYgdGhlIE5TTSBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxldmVsIHJ1biwgaXQgd2lsbAogICAgICAvLyBnZXQgdGhlIHR5cGUgb2Ygc29yLgogICAgICBmb3IgKHZhciBpID0gMCwgcHJldiA9IHN0YXJ0VHlwZTsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpXTsKICAgICAgICBpZiAodHlwZSA9PSAibSIpIHR5cGVzW2ldID0gcHJldjsKICAgICAgICBlbHNlIHByZXYgPSB0eXBlOwogICAgICB9CgogICAgICAvLyBXMi4gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgYSBFdXJvcGVhbiBudW1iZXIKICAgICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBBTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW4KICAgICAgLy8gQUwgaXMgZm91bmQsIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgRXVyb3BlYW4gbnVtYmVyIHRvIEFyYWJpYwogICAgICAvLyBudW1iZXIuCiAgICAgIC8vIFczLiBDaGFuZ2UgYWxsIEFMcyB0byBSLgogICAgICBmb3IgKHZhciBpID0gMCwgY3VyID0gc3RhcnRUeXBlOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2ldOwogICAgICAgIGlmICh0eXBlID09ICIxIiAmJiBjdXIgPT0gInIiKSB0eXBlc1tpXSA9ICJuIjsKICAgICAgICBlbHNlIGlmIChpc1N0cm9uZy50ZXN0KHR5cGUpKSB7IGN1ciA9IHR5cGU7IGlmICh0eXBlID09ICJyIikgdHlwZXNbaV0gPSAiUiI7IH0KICAgICAgfQoKICAgICAgLy8gVzQuIEEgc2luZ2xlIEV1cm9wZWFuIHNlcGFyYXRvciBiZXR3ZWVuIHR3byBFdXJvcGVhbiBudW1iZXJzCiAgICAgIC8vIGNoYW5nZXMgdG8gYSBFdXJvcGVhbiBudW1iZXIuIEEgc2luZ2xlIGNvbW1vbiBzZXBhcmF0b3IgYmV0d2VlbgogICAgICAvLyB0d28gbnVtYmVycyBvZiB0aGUgc2FtZSB0eXBlIGNoYW5nZXMgdG8gdGhhdCB0eXBlLgogICAgICBmb3IgKHZhciBpID0gMSwgcHJldiA9IHR5cGVzWzBdOyBpIDwgbGVuIC0gMTsgKytpKSB7CiAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpXTsKICAgICAgICBpZiAodHlwZSA9PSAiKyIgJiYgcHJldiA9PSAiMSIgJiYgdHlwZXNbaSsxXSA9PSAiMSIpIHR5cGVzW2ldID0gIjEiOwogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIiwiICYmIHByZXYgPT0gdHlwZXNbaSsxXSAmJgogICAgICAgICAgICAgICAgIChwcmV2ID09ICIxIiB8fCBwcmV2ID09ICJuIikpIHR5cGVzW2ldID0gcHJldjsKICAgICAgICBwcmV2ID0gdHlwZTsKICAgICAgfQoKICAgICAgLy8gVzUuIEEgc2VxdWVuY2Ugb2YgRXVyb3BlYW4gdGVybWluYXRvcnMgYWRqYWNlbnQgdG8gRXVyb3BlYW4KICAgICAgLy8gbnVtYmVycyBjaGFuZ2VzIHRvIGFsbCBFdXJvcGVhbiBudW1iZXJzLgogICAgICAvLyBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXIKICAgICAgLy8gTmV1dHJhbC4KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICAgIHZhciB0eXBlID0gdHlwZXNbaV07CiAgICAgICAgaWYgKHR5cGUgPT0gIiwiKSB0eXBlc1tpXSA9ICJOIjsKICAgICAgICBlbHNlIGlmICh0eXBlID09ICIlIikgewogICAgICAgICAgZm9yICh2YXIgZW5kID0gaSArIDE7IGVuZCA8IGxlbiAmJiB0eXBlc1tlbmRdID09ICIlIjsgKytlbmQpIHt9CiAgICAgICAgICB2YXIgcmVwbGFjZSA9IChpICYmIHR5cGVzW2ktMV0gPT0gIiEiKSB8fCAoZW5kIDwgbGVuIC0gMSAmJiB0eXBlc1tlbmRdID09ICIxIikgPyAiMSIgOiAiTiI7CiAgICAgICAgICBmb3IgKHZhciBqID0gaTsgaiA8IGVuZDsgKytqKSB0eXBlc1tqXSA9IHJlcGxhY2U7CiAgICAgICAgICBpID0gZW5kIC0gMTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFc3LiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlcgogICAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIG9yIHNvcikgaXMgZm91bmQuIElmIGFuIEwgaXMKICAgICAgLy8gZm91bmQsIHRoZW4gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gTC4KICAgICAgZm9yICh2YXIgaSA9IDAsIGN1ciA9IHN0YXJ0VHlwZTsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpXTsKICAgICAgICBpZiAoY3VyID09ICJMIiAmJiB0eXBlID09ICIxIikgdHlwZXNbaV0gPSAiTCI7CiAgICAgICAgZWxzZSBpZiAoaXNTdHJvbmcudGVzdCh0eXBlKSkgY3VyID0gdHlwZTsKICAgICAgfQoKICAgICAgLy8gTjEuIEEgc2VxdWVuY2Ugb2YgbmV1dHJhbHMgdGFrZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUKICAgICAgLy8gc3Vycm91bmRpbmcgc3Ryb25nIHRleHQgaWYgdGhlIHRleHQgb24gYm90aCBzaWRlcyBoYXMgdGhlIHNhbWUKICAgICAgLy8gZGlyZWN0aW9uLiBFdXJvcGVhbiBhbmQgQXJhYmljIG51bWJlcnMgYWN0IGFzIGlmIHRoZXkgd2VyZSBSIGluCiAgICAgIC8vIHRlcm1zIG9mIHRoZWlyIGluZmx1ZW5jZSBvbiBuZXV0cmFscy4gU3RhcnQtb2YtbGV2ZWwtcnVuIChzb3IpCiAgICAgIC8vIGFuZCBlbmQtb2YtbGV2ZWwtcnVuIChlb3IpIGFyZSB1c2VkIGF0IGxldmVsIHJ1biBib3VuZGFyaWVzLgogICAgICAvLyBOMi4gQW55IHJlbWFpbmluZyBuZXV0cmFscyB0YWtlIHRoZSBlbWJlZGRpbmcgZGlyZWN0aW9uLgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgaWYgKGlzTmV1dHJhbC50ZXN0KHR5cGVzW2ldKSkgewogICAgICAgICAgZm9yICh2YXIgZW5kID0gaSArIDE7IGVuZCA8IGxlbiAmJiBpc05ldXRyYWwudGVzdCh0eXBlc1tlbmRdKTsgKytlbmQpIHt9CiAgICAgICAgICB2YXIgYmVmb3JlID0gKGkgPyB0eXBlc1tpLTFdIDogc3RhcnRUeXBlKSA9PSAiTCI7CiAgICAgICAgICB2YXIgYWZ0ZXIgPSAoZW5kIDwgbGVuIC0gMSA/IHR5cGVzW2VuZF0gOiBzdGFydFR5cGUpID09ICJMIjsKICAgICAgICAgIHZhciByZXBsYWNlID0gYmVmb3JlIHx8IGFmdGVyID8gIkwiIDogIlIiOwogICAgICAgICAgZm9yICh2YXIgaiA9IGk7IGogPCBlbmQ7ICsraikgdHlwZXNbal0gPSByZXBsYWNlOwogICAgICAgICAgaSA9IGVuZCAtIDE7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBIZXJlIHdlIGRlcGFydCBmcm9tIHRoZSBkb2N1bWVudGVkIGFsZ29yaXRobSwgaW4gb3JkZXIgdG8gYXZvaWQKICAgICAgLy8gYnVpbGRpbmcgdXAgYW4gYWN0dWFsIGxldmVscyBhcnJheS4gU2luY2UgdGhlcmUgYXJlIG9ubHkgdGhyZWUKICAgICAgLy8gbGV2ZWxzICgwLCAxLCAyKSBpbiBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXNuJ3QgdGFrZQogICAgICAvLyBleHBsaWNpdCBlbWJlZGRpbmcgaW50byBhY2NvdW50LCB3ZSBjYW4gYnVpbGQgdXAgdGhlIG9yZGVyIG9uCiAgICAgIC8vIHRoZSBmbHksIHdpdGhvdXQgZm9sbG93aW5nIHRoZSBsZXZlbC1iYXNlZCBhbGdvcml0aG0uCiAgICAgIHZhciBvcmRlciA9IFtdLCBtOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjspIHsKICAgICAgICBpZiAoY291bnRzQXNMZWZ0LnRlc3QodHlwZXNbaV0pKSB7CiAgICAgICAgICB2YXIgc3RhcnQgPSBpOwogICAgICAgICAgZm9yICgrK2k7IGkgPCBsZW4gJiYgY291bnRzQXNMZWZ0LnRlc3QodHlwZXNbaV0pOyArK2kpIHt9CiAgICAgICAgICBvcmRlci5wdXNoKHtmcm9tOiBzdGFydCwgdG86IGksIGxldmVsOiAwfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBwb3MgPSBpLCBhdCA9IG9yZGVyLmxlbmd0aDsKICAgICAgICAgIGZvciAoKytpOyBpIDwgbGVuICYmIHR5cGVzW2ldICE9ICJMIjsgKytpKSB7fQogICAgICAgICAgZm9yICh2YXIgaiA9IHBvczsgaiA8IGk7KSB7CiAgICAgICAgICAgIGlmIChjb3VudHNBc051bS50ZXN0KHR5cGVzW2pdKSkgewogICAgICAgICAgICAgIGlmIChwb3MgPCBqKSBvcmRlci5zcGxpY2UoYXQsIDAsIHtmcm9tOiBwb3MsIHRvOiBqLCBsZXZlbDogMX0pOwogICAgICAgICAgICAgIHZhciBuc3RhcnQgPSBqOwogICAgICAgICAgICAgIGZvciAoKytqOyBqIDwgaSAmJiBjb3VudHNBc051bS50ZXN0KHR5cGVzW2pdKTsgKytqKSB7fQogICAgICAgICAgICAgIG9yZGVyLnNwbGljZShhdCwgMCwge2Zyb206IG5zdGFydCwgdG86IGosIGxldmVsOiAyfSk7CiAgICAgICAgICAgICAgcG9zID0gajsKICAgICAgICAgICAgfSBlbHNlICsrajsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwb3MgPCBpKSBvcmRlci5zcGxpY2UoYXQsIDAsIHtmcm9tOiBwb3MsIHRvOiBpLCBsZXZlbDogMX0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAob3JkZXJbMF0ubGV2ZWwgPT0gMSAmJiAobSA9IHN0ci5tYXRjaCgvXlxzKy8pKSkgewogICAgICAgIG9yZGVyWzBdLmZyb20gPSBtWzBdLmxlbmd0aDsKICAgICAgICBvcmRlci51bnNoaWZ0KHtmcm9tOiAwLCB0bzogbVswXS5sZW5ndGgsIGxldmVsOiAwfSk7CiAgICAgIH0KICAgICAgaWYgKGxzdChvcmRlcikubGV2ZWwgPT0gMSAmJiAobSA9IHN0ci5tYXRjaCgvXHMrJC8pKSkgewogICAgICAgIGxzdChvcmRlcikudG8gLT0gbVswXS5sZW5ndGg7CiAgICAgICAgb3JkZXIucHVzaCh7ZnJvbTogbGVuIC0gbVswXS5sZW5ndGgsIHRvOiBsZW4sIGxldmVsOiAwfSk7CiAgICAgIH0KICAgICAgaWYgKG9yZGVyWzBdLmxldmVsICE9IGxzdChvcmRlcikubGV2ZWwpCiAgICAgICAgb3JkZXIucHVzaCh7ZnJvbTogbGVuLCB0bzogbGVuLCBsZXZlbDogb3JkZXJbMF0ubGV2ZWx9KTsKCiAgICAgIHJldHVybiBvcmRlcjsKICAgIH07CiAgfSkoKTsKCiAgLy8gVEhFIEVORAoKICBDb2RlTWlycm9yLnZlcnNpb24gPSAiMy4wIjsKCiAgcmV0dXJuIENvZGVNaXJyb3I7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/closetag.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFRhZy1jbG9zZXIgZXh0ZW5zaW9uIGZvciBDb2RlTWlycm9yLgogKgogKiBUaGlzIGV4dGVuc2lvbiBhZGRzIGFuICJhdXRvQ2xvc2VUYWdzIiBvcHRpb24gdGhhdCBjYW4gYmUgc2V0IHRvCiAqIGVpdGhlciB0cnVlIHRvIGdldCB0aGUgZGVmYXVsdCBiZWhhdmlvciwgb3IgYW4gb2JqZWN0IHRvIGZ1cnRoZXIKICogY29uZmlndXJlIGl0cyBiZWhhdmlvci4KICoKICogVGhlc2UgYXJlIHN1cHBvcnRlZCBvcHRpb25zOgogKgogKiBgd2hlbkNsb3NpbmdgIChkZWZhdWx0IHRydWUpCiAqICAgV2hldGhlciB0byBhdXRvY2xvc2Ugd2hlbiB0aGUgJy8nIG9mIGEgY2xvc2luZyB0YWcgaXMgdHlwZWQuCiAqIGB3aGVuT3BlbmluZ2AgKGRlZmF1bHQgdHJ1ZSkKICogICBXaGV0aGVyIHRvIGF1dG9jbG9zZSB0aGUgdGFnIHdoZW4gdGhlIGZpbmFsICc+JyBvZiBhbiBvcGVuaW5nCiAqICAgdGFnIGlzIHR5cGVkLgogKiBgZG9udENsb3NlVGFnc2AgKGRlZmF1bHQgaXMgZW1wdHkgdGFncyBmb3IgSFRNTCwgbm9uZSBmb3IgWE1MKQogKiAgIEFuIGFycmF5IG9mIHRhZyBuYW1lcyB0aGF0IHNob3VsZCBub3QgYmUgYXV0b2Nsb3NlZC4KICogYGluZGVudFRhZ3NgIChkZWZhdWx0IGlzIGJsb2NrIHRhZ3MgZm9yIEhUTUwsIG5vbmUgZm9yIFhNTCkKICogICBBbiBhcnJheSBvZiB0YWcgbmFtZXMgdGhhdCBzaG91bGQsIHdoZW4gb3BlbmVkLCBjYXVzZSBhCiAqICAgYmxhbmsgbGluZSB0byBiZSBhZGRlZCBpbnNpZGUgdGhlIHRhZywgYW5kIHRoZSBibGFuayBsaW5lIGFuZAogKiAgIGNsb3NpbmcgbGluZSB0byBiZSBpbmRlbnRlZC4KICoKICogU2VlIGRlbW9zL2Nsb3NldGFnLmh0bWwgZm9yIGEgdXNhZ2UgZXhhbXBsZS4KICovCgooZnVuY3Rpb24oKSB7CiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oImF1dG9DbG9zZVRhZ3MiLCBmYWxzZSwgZnVuY3Rpb24oY20sIHZhbCwgb2xkKSB7CiAgICBpZiAodmFsICYmIChvbGQgPT0gQ29kZU1pcnJvci5Jbml0IHx8ICFvbGQpKSB7CiAgICAgIHZhciBtYXAgPSB7bmFtZTogImF1dG9DbG9zZVRhZ3MifTsKICAgICAgaWYgKHR5cGVvZiB2YWwgIT0gIm9iamVjdCIgfHwgdmFsLndoZW5DbG9zaW5nKQogICAgICAgIG1hcFsiJy8nIl0gPSBmdW5jdGlvbihjbSkgeyBhdXRvQ2xvc2VUYWcoY20sICcvJyk7IH07CiAgICAgIGlmICh0eXBlb2YgdmFsICE9ICJvYmplY3QiIHx8IHZhbC53aGVuT3BlbmluZykKICAgICAgICBtYXBbIic+JyJdID0gZnVuY3Rpb24oY20pIHsgYXV0b0Nsb3NlVGFnKGNtLCAnPicpOyB9OwogICAgICBjbS5hZGRLZXlNYXAobWFwKTsKICAgIH0gZWxzZSBpZiAoIXZhbCAmJiAob2xkICE9IENvZGVNaXJyb3IuSW5pdCAmJiBvbGQpKSB7CiAgICAgIGNtLnJlbW92ZUtleU1hcCgiYXV0b0Nsb3NlVGFncyIpOwogICAgfQogIH0pOwoKICB2YXIgaHRtbERvbnRDbG9zZSA9IFsiYXJlYSIsICJiYXNlIiwgImJyIiwgImNvbCIsICJjb21tYW5kIiwgImVtYmVkIiwgImhyIiwgImltZyIsICJpbnB1dCIsICJrZXlnZW4iLCAibGluayIsICJtZXRhIiwgInBhcmFtIiwKICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIiwgInRyYWNrIiwgIndiciJdOwogIHZhciBodG1sSW5kZW50ID0gWyJhcHBsZXQiLCAiYmxvY2txdW90ZSIsICJib2R5IiwgImJ1dHRvbiIsICJkaXYiLCAiZGwiLCAiZmllbGRzZXQiLCAiZm9ybSIsICJmcmFtZXNldCIsICJoMSIsICJoMiIsICJoMyIsICJoNCIsCiAgICAgICAgICAgICAgICAgICAgImg1IiwgImg2IiwgImhlYWQiLCAiaHRtbCIsICJpZnJhbWUiLCAibGF5ZXIiLCAibGVnZW5kIiwgIm9iamVjdCIsICJvbCIsICJwIiwgInNlbGVjdCIsICJ0YWJsZSIsICJ1bCJdOwoKICBmdW5jdGlvbiBhdXRvQ2xvc2VUYWcoY20sIGNoKSB7CiAgICB2YXIgcG9zID0gY20uZ2V0Q3Vyc29yKCksIHRvayA9IGNtLmdldFRva2VuQXQocG9zKTsKICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rLnN0YXRlKSwgc3RhdGUgPSBpbm5lci5zdGF0ZTsKICAgIGlmIChpbm5lci5tb2RlLm5hbWUgIT0gInhtbCIpIHRocm93IENvZGVNaXJyb3IuUGFzczsKCiAgICB2YXIgb3B0ID0gY20uZ2V0T3B0aW9uKCJhdXRvQ2xvc2VUYWdzIiksIGh0bWwgPSBpbm5lci5tb2RlLmNvbmZpZ3VyYXRpb24gPT0gImh0bWwiOwogICAgdmFyIGRvbnRDbG9zZVRhZ3MgPSAodHlwZW9mIG9wdCA9PSAib2JqZWN0IiAmJiBvcHQuZG9udENsb3NlVGFncykgfHwgKGh0bWwgJiYgaHRtbERvbnRDbG9zZSk7CiAgICB2YXIgaW5kZW50VGFncyA9ICh0eXBlb2Ygb3B0ID09ICJvYmplY3QiICYmIG9wdC5pbmRlbnRUYWdzKSB8fCAoaHRtbCAmJiBodG1sSW5kZW50KTsKCiAgICBpZiAoY2ggPT0gIj4iICYmIHN0YXRlLnRhZ05hbWUpIHsKICAgICAgdmFyIHRhZ05hbWUgPSBzdGF0ZS50YWdOYW1lOwogICAgICBpZiAodG9rLmVuZCA+IHBvcy5jaCkgdGFnTmFtZSA9IHRhZ05hbWUuc2xpY2UoMCwgdGFnTmFtZS5sZW5ndGggLSB0b2suZW5kICsgcG9zLmNoKTsKICAgICAgdmFyIGxvd2VyVGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgLy8gRG9uJ3QgcHJvY2VzcyB0aGUgJz4nIGF0IHRoZSBlbmQgb2YgYW4gZW5kLXRhZyBvciBzZWxmLWNsb3NpbmcgdGFnCiAgICAgIGlmICh0b2sudHlwZSA9PSAidGFnIiAmJiBzdGF0ZS50eXBlID09ICJjbG9zZVRhZyIgfHwKICAgICAgICAgIC9cL1xzKiQvLnRlc3QodG9rLnN0cmluZykgfHwKICAgICAgICAgIGRvbnRDbG9zZVRhZ3MgJiYgaW5kZXhPZihkb250Q2xvc2VUYWdzLCBsb3dlclRhZ05hbWUpID4gLTEpCiAgICAgICAgdGhyb3cgQ29kZU1pcnJvci5QYXNzOwoKICAgICAgdmFyIGRvSW5kZW50ID0gaW5kZW50VGFncyAmJiBpbmRleE9mKGluZGVudFRhZ3MsIGxvd2VyVGFnTmFtZSkgPiAtMTsKICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbigiPiIgKyAoZG9JbmRlbnQgPyAiXG5cbiIgOiAiIikgKyAiPC8iICsgdGFnTmFtZSArICI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkb0luZGVudCA/IHtsaW5lOiBwb3MubGluZSArIDEsIGNoOiAwfSA6IHtsaW5lOiBwb3MubGluZSwgY2g6IHBvcy5jaCArIDF9KTsKICAgICAgaWYgKGRvSW5kZW50KSB7CiAgICAgICAgY20uaW5kZW50TGluZShwb3MubGluZSArIDEpOwogICAgICAgIGNtLmluZGVudExpbmUocG9zLmxpbmUgKyAyKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKGNoID09ICIvIiAmJiB0b2sudHlwZSA9PSAidGFnIiAmJiB0b2suc3RyaW5nID09ICI8IikgewogICAgICB2YXIgdGFnTmFtZSA9IHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC50YWdOYW1lOwogICAgICBpZiAodGFnTmFtZSkgY20ucmVwbGFjZVNlbGVjdGlvbigiLyIgKyB0YWdOYW1lICsgIj4iLCAiZW5kIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRocm93IENvZGVNaXJyb3IuUGFzczsKICB9CgogIGZ1bmN0aW9uIGluZGV4T2YoY29sbGVjdGlvbiwgZWx0KSB7CiAgICBpZiAoY29sbGVjdGlvbi5pbmRleE9mKSByZXR1cm4gY29sbGVjdGlvbi5pbmRleE9mKGVsdCk7CiAgICBmb3IgKHZhciBpID0gMCwgZSA9IGNvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgZTsgKytpKQogICAgICBpZiAoY29sbGVjdGlvbltpXSA9PSBlbHQpIHJldHVybiBpOwogICAgcmV0dXJuIC0xOwogIH0KfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/colorize.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5jb2xvcml6ZSA9IChmdW5jdGlvbigpIHsKCiAgdmFyIGlzQmxvY2sgPSAvXihwfGxpfGRpdnxoXFxkfHByZXxibG9ja3F1b3RlfHRkKSQvOwoKICBmdW5jdGlvbiB0ZXh0Q29udGVudChub2RlLCBvdXQpIHsKICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHJldHVybiBvdXQucHVzaChub2RlLm5vZGVWYWx1ZSk7CiAgICBmb3IgKHZhciBjaCA9IG5vZGUuZmlyc3RDaGlsZDsgY2g7IGNoID0gY2gubmV4dFNpYmxpbmcpIHsKICAgICAgdGV4dENvbnRlbnQoY2gsIG91dCk7CiAgICAgIGlmIChpc0Jsb2NrLnRlc3Qobm9kZS5ub2RlVHlwZSkpIG91dC5wdXNoKCJcbiIpOwogICAgfQogIH0KCiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGRlZmF1bHRNb2RlKSB7CiAgICBpZiAoIWNvbGxlY3Rpb24pIGNvbGxlY3Rpb24gPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcmUiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbGxlY3Rpb24ubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIG5vZGUgPSBjb2xsZWN0aW9uW2ldOwogICAgICB2YXIgbW9kZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJkYXRhLWxhbmciKSB8fCBkZWZhdWx0TW9kZTsKICAgICAgaWYgKCFtb2RlKSBjb250aW51ZTsKCiAgICAgIHZhciB0ZXh0ID0gW107CiAgICAgIHRleHRDb250ZW50KG5vZGUsIHRleHQpOwogICAgICBub2RlLmlubmVySFRNTCA9ICIiOwogICAgICBDb2RlTWlycm9yLnJ1bk1vZGUodGV4dC5qb2luKCIiKSwgbW9kZSwgbm9kZSk7CgogICAgICBub2RlLmNsYXNzTmFtZSArPSAiIGNtLXMtZGVmYXVsdCI7CiAgICB9CiAgfTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/continuecomment.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIHZhciBtb2RlcyA9IFsiY2xpa2UiLCAiY3NzIiwgImphdmFzY3JpcHQiXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVzLmxlbmd0aDsgKytpKQogICAgQ29kZU1pcnJvci5leHRlbmRNb2RlKG1vZGVzW2ldLCB7YmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0NvbW1lbnRFbmQ6ICIqLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0NvbW1lbnRDb250aW51ZTogIiAqICJ9KTsKCiAgQ29kZU1pcnJvci5jb21tYW5kcy5uZXdsaW5lQW5kSW5kZW50Q29udGludWVDb21tZW50ID0gZnVuY3Rpb24oY20pIHsKICAgIHZhciBwb3MgPSBjbS5nZXRDdXJzb3IoKSwgdG9rZW4gPSBjbS5nZXRUb2tlbkF0KHBvcyk7CiAgICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rZW4uc3RhdGUpLm1vZGU7CiAgICB2YXIgc3BhY2U7CgogICAgaWYgKHRva2VuLnR5cGUgPT0gImNvbW1lbnQiICYmIG1vZGUuYmxvY2tDb21tZW50U3RhcnQpIHsKICAgICAgdmFyIGVuZCA9IHRva2VuLnN0cmluZy5pbmRleE9mKG1vZGUuYmxvY2tDb21tZW50RW5kKTsKICAgICAgdmFyIGZ1bGwgPSBjbS5nZXRSYW5nZSh7bGluZTogcG9zLmxpbmUsIGNoOiAwfSwge2xpbmU6IHBvcy5saW5lLCBjaDogdG9rZW4uZW5kfSksIGZvdW5kOwogICAgICBpZiAoZW5kICE9IC0xICYmIGVuZCA9PSB0b2tlbi5zdHJpbmcubGVuZ3RoIC0gbW9kZS5ibG9ja0NvbW1lbnRFbmQubGVuZ3RoKSB7CiAgICAgICAgLy8gQ29tbWVudCBlbmRlZCwgZG9uJ3QgY29udGludWUgaXQKICAgICAgfSBlbHNlIGlmICh0b2tlbi5zdHJpbmcuaW5kZXhPZihtb2RlLmJsb2NrQ29tbWVudFN0YXJ0KSA9PSAwKSB7CiAgICAgICAgc3BhY2UgPSBmdWxsLnNsaWNlKDAsIHRva2VuLnN0YXJ0KTsKICAgICAgICBpZiAoIS9eXHMqJC8udGVzdChzcGFjZSkpIHsKICAgICAgICAgIHNwYWNlID0gIiI7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2VuLnN0YXJ0OyArK2kpIHNwYWNlICs9ICIgIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGZvdW5kID0gZnVsbC5pbmRleE9mKG1vZGUuYmxvY2tDb21tZW50Q29udGludWUpKSAhPSAtMSAmJgogICAgICAgICAgICAgICAgIGZvdW5kICsgbW9kZS5ibG9ja0NvbW1lbnRDb250aW51ZS5sZW5ndGggPiB0b2tlbi5zdGFydCAmJgogICAgICAgICAgICAgICAgIC9eXHMqJC8udGVzdChmdWxsLnNsaWNlKDAsIGZvdW5kKSkpIHsKICAgICAgICBzcGFjZSA9IGZ1bGwuc2xpY2UoMCwgZm91bmQpOwogICAgICB9CiAgICB9CgogICAgaWYgKHNwYWNlICE9IG51bGwpCiAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oIlxuIiArIHNwYWNlICsgbW9kZS5ibG9ja0NvbW1lbnRDb250aW51ZSwgImVuZCIpOwogICAgZWxzZQogICAgICBjbS5leGVjQ29tbWFuZCgibmV3bGluZUFuZEluZGVudCIpOwogIH07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/continuelist.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIENvZGVNaXJyb3IuY29tbWFuZHMubmV3bGluZUFuZEluZGVudENvbnRpbnVlTWFya2Rvd25MaXN0ID0gZnVuY3Rpb24oY20pIHsKICAgIHZhciBwb3MgPSBjbS5nZXRDdXJzb3IoKSwgdG9rZW4gPSBjbS5nZXRUb2tlbkF0KHBvcyk7CiAgICB2YXIgc3BhY2U7CiAgICBpZiAodG9rZW4uY2xhc3NOYW1lID09ICJzdHJpbmciKSB7CiAgICAgIHZhciBmdWxsID0gY20uZ2V0UmFuZ2Uoe2xpbmU6IHBvcy5saW5lLCBjaDogMH0sIHtsaW5lOiBwb3MubGluZSwgY2g6IHRva2VuLmVuZH0pOwogICAgICB2YXIgbGlzdFN0YXJ0ID0gL1wqfFxkK1wuLywgbGlzdENvbnRpbnVlOwogICAgICBpZiAodG9rZW4uc3RyaW5nLnNlYXJjaChsaXN0U3RhcnQpID09IDApIHsKICAgICAgICB2YXIgcmVnID0gL15bXFddKihcZCspXC4vZzsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlZy5leGVjKGZ1bGwpOwogICAgICAgIGlmKG1hdGNoZXMpCiAgICAgICAgICBsaXN0Q29udGludWUgPSAocGFyc2VJbnQobWF0Y2hlc1sxXSkgKyAxKSArICIuICAiOwogICAgICAgIGVsc2UKICAgICAgICAgIGxpc3RDb250aW51ZSA9ICIqICAgIjsKICAgICAgICBzcGFjZSA9IGZ1bGwuc2xpY2UoMCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGlmICghL15ccyokLy50ZXN0KHNwYWNlKSkgewogICAgICAgICAgc3BhY2UgPSAiIjsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW4uc3RhcnQ7ICsraSkgc3BhY2UgKz0gIiAiOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChzcGFjZSAhPSBudWxsKQogICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJcbiIgKyBzcGFjZSArIGxpc3RDb250aW51ZSwgImVuZCIpOwogICAgZWxzZQogICAgICBjbS5leGVjQ29tbWFuZCgibmV3bGluZUFuZEluZGVudCIpOwogIH07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/dialog.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItZGlhbG9nIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsgcmlnaHQ6IDA7CiAgYmFja2dyb3VuZDogd2hpdGU7CiAgei1pbmRleDogMTU7CiAgcGFkZGluZzogLjFlbSAuOGVtOwogIG92ZXJmbG93OiBoaWRkZW47CiAgY29sb3I6ICMzMzM7Cn0KCi5Db2RlTWlycm9yLWRpYWxvZy10b3AgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOwogIHRvcDogMDsKfQoKLkNvZGVNaXJyb3ItZGlhbG9nLWJvdHRvbSB7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7CiAgYm90dG9tOiAwOwp9CgouQ29kZU1pcnJvci1kaWFsb2cgaW5wdXQgewogIGJvcmRlcjogbm9uZTsKICBvdXRsaW5lOiBub25lOwogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIHdpZHRoOiAyMGVtOwogIGNvbG9yOiBpbmhlcml0OwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cn0KCi5Db2RlTWlycm9yLWRpYWxvZyBidXR0b24gewogIGZvbnQtc2l6ZTogNzAlOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/dialog.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gT3BlbiBzaW1wbGUgZGlhbG9ncyBvbiB0b3Agb2YgYW4gZWRpdG9yLiBSZWxpZXMgb24gZGlhbG9nLmNzcy4KCihmdW5jdGlvbigpIHsKICBmdW5jdGlvbiBkaWFsb2dEaXYoY20sIHRlbXBsYXRlLCBib3R0b20pIHsKICAgIHZhciB3cmFwID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKTsKICAgIHZhciBkaWFsb2c7CiAgICBkaWFsb2cgPSB3cmFwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTsKICAgIGlmIChib3R0b20pIHsKICAgICAgZGlhbG9nLmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLWRpYWxvZyBDb2RlTWlycm9yLWRpYWxvZy1ib3R0b20iOwogICAgfSBlbHNlIHsKICAgICAgZGlhbG9nLmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLWRpYWxvZyBDb2RlTWlycm9yLWRpYWxvZy10b3AiOwogICAgfQogICAgZGlhbG9nLmlubmVySFRNTCA9IHRlbXBsYXRlOwogICAgcmV0dXJuIGRpYWxvZzsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJvcGVuRGlhbG9nIiwgZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICB2YXIgZGlhbG9nID0gZGlhbG9nRGl2KHRoaXMsIHRlbXBsYXRlLCBvcHRpb25zICYmIG9wdGlvbnMuYm90dG9tKTsKICAgIHZhciBjbG9zZWQgPSBmYWxzZSwgbWUgPSB0aGlzOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7CiAgICAgIGlmIChjbG9zZWQpIHJldHVybjsKICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgICAgZGlhbG9nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGlhbG9nKTsKICAgIH0KICAgIHZhciBpbnAgPSBkaWFsb2cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sIGJ1dHRvbjsKICAgIGlmIChpbnApIHsKICAgICAgQ29kZU1pcnJvci5vbihpbnAsICJrZXlkb3duIiwgZnVuY3Rpb24oZSkgewogICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDI3KSB7CiAgICAgICAgICBDb2RlTWlycm9yLmVfc3RvcChlKTsKICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICBtZS5mb2N1cygpOwogICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykgY2FsbGJhY2soaW5wLnZhbHVlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpbnAuZm9jdXMoKTsKICAgICAgQ29kZU1pcnJvci5vbihpbnAsICJibHVyIiwgY2xvc2UpOwogICAgfSBlbHNlIGlmIChidXR0b24gPSBkaWFsb2cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJ1dHRvbiIpWzBdKSB7CiAgICAgIENvZGVNaXJyb3Iub24oYnV0dG9uLCAiY2xpY2siLCBmdW5jdGlvbigpIHsKICAgICAgICBjbG9zZSgpOwogICAgICAgIG1lLmZvY3VzKCk7CiAgICAgIH0pOwogICAgICBidXR0b24uZm9jdXMoKTsKICAgICAgQ29kZU1pcnJvci5vbihidXR0b24sICJibHVyIiwgY2xvc2UpOwogICAgfQogICAgcmV0dXJuIGNsb3NlOwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigib3BlbkNvbmZpcm0iLCBmdW5jdGlvbih0ZW1wbGF0ZSwgY2FsbGJhY2tzLCBvcHRpb25zKSB7CiAgICB2YXIgZGlhbG9nID0gZGlhbG9nRGl2KHRoaXMsIHRlbXBsYXRlLCBvcHRpb25zICYmIG9wdGlvbnMuYm90dG9tKTsKICAgIHZhciBidXR0b25zID0gZGlhbG9nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJidXR0b24iKTsKICAgIHZhciBjbG9zZWQgPSBmYWxzZSwgbWUgPSB0aGlzLCBibHVycmluZyA9IDE7CiAgICBmdW5jdGlvbiBjbG9zZSgpIHsKICAgICAgaWYgKGNsb3NlZCkgcmV0dXJuOwogICAgICBjbG9zZWQgPSB0cnVlOwogICAgICBkaWFsb2cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaWFsb2cpOwogICAgICBtZS5mb2N1cygpOwogICAgfQogICAgYnV0dG9uc1swXS5mb2N1cygpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBiID0gYnV0dG9uc1tpXTsKICAgICAgKGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgQ29kZU1pcnJvci5vbihiLCAiY2xpY2siLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICBDb2RlTWlycm9yLmVfcHJldmVudERlZmF1bHQoZSk7CiAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhtZSk7CiAgICAgICAgfSk7CiAgICAgIH0pKGNhbGxiYWNrc1tpXSk7CiAgICAgIENvZGVNaXJyb3Iub24oYiwgImJsdXIiLCBmdW5jdGlvbigpIHsKICAgICAgICAtLWJsdXJyaW5nOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGlmIChibHVycmluZyA8PSAwKSBjbG9zZSgpOyB9LCAyMDApOwogICAgICB9KTsKICAgICAgQ29kZU1pcnJvci5vbihiLCAiZm9jdXMiLCBmdW5jdGlvbigpIHsgKytibHVycmluZzsgfSk7CiAgICB9CiAgfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/foldcode.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gdGhlIHRhZ1JhbmdlRmluZGVyIGZ1bmN0aW9uIGlzCi8vICAgQ29weXJpZ2h0IChDKSAyMDExIGJ5IERhbmllbCBHbGF6bWFuIDxkYW5pZWxAZ2xhem1hbi5vcmc+Ci8vIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAoLi4vLi4vTElDRU5TRSkgbGlrZSB0aGUgcmVzdCBvZiBDb2RlTWlycm9yCkNvZGVNaXJyb3IudGFnUmFuZ2VGaW5kZXIgPSBmdW5jdGlvbihjbSwgc3RhcnQpIHsKICB2YXIgbmFtZVN0YXJ0Q2hhciA9ICJBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEIjsKICB2YXIgbmFtZUNoYXIgPSBuYW1lU3RhcnRDaGFyICsgIlwtXDpcLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDAiOwogIHZhciB4bWxOQU1FUmVnRXhwID0gbmV3IFJlZ0V4cCgiXlsiICsgbmFtZVN0YXJ0Q2hhciArICJdWyIgKyBuYW1lQ2hhciArICJdKiIpOwoKICB2YXIgbGluZVRleHQgPSBjbS5nZXRMaW5lKHN0YXJ0LmxpbmUpOwogIHZhciBmb3VuZCA9IGZhbHNlOwogIHZhciB0YWcgPSBudWxsOwogIHZhciBwb3MgPSBzdGFydC5jaDsKICB3aGlsZSAoIWZvdW5kKSB7CiAgICBwb3MgPSBsaW5lVGV4dC5pbmRleE9mKCI8IiwgcG9zKTsKICAgIGlmICgtMSA9PSBwb3MpIC8vIG5vIHRhZyBvbiBsaW5lCiAgICAgIHJldHVybjsKICAgIGlmIChwb3MgKyAxIDwgbGluZVRleHQubGVuZ3RoICYmIGxpbmVUZXh0W3BvcyArIDFdID09ICIvIikgeyAvLyBjbG9zaW5nIHRhZwogICAgICBwb3MrKzsKICAgICAgY29udGludWU7CiAgICB9CiAgICAvLyBvayB3ZSBzZWVtIHRvIGhhdmUgYSBzdGFydCB0YWcKICAgIGlmICghbGluZVRleHQuc3Vic3RyKHBvcyArIDEpLm1hdGNoKHhtbE5BTUVSZWdFeHApKSB7IC8vIG5vdCBhIHRhZyBuYW1lLi4uCiAgICAgIHBvcysrOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHZhciBndFBvcyA9IGxpbmVUZXh0LmluZGV4T2YoIj4iLCBwb3MgKyAxKTsKICAgIGlmICgtMSA9PSBndFBvcykgeyAvLyBlbmQgb2Ygc3RhcnQgdGFnIG5vdCBpbiBsaW5lCiAgICAgIHZhciBsID0gc3RhcnQubGluZSArIDE7CiAgICAgIHZhciBmb3VuZEd0ID0gZmFsc2U7CiAgICAgIHZhciBsYXN0TGluZSA9IGNtLmxpbmVDb3VudCgpOwogICAgICB3aGlsZSAobCA8IGxhc3RMaW5lICYmICFmb3VuZEd0KSB7CiAgICAgICAgdmFyIGx0ID0gY20uZ2V0TGluZShsKTsKICAgICAgICBndFBvcyA9IGx0LmluZGV4T2YoIj4iKTsKICAgICAgICBpZiAoLTEgIT0gZ3RQb3MpIHsgLy8gZm91bmQgYSA+CiAgICAgICAgICBmb3VuZEd0ID0gdHJ1ZTsKICAgICAgICAgIHZhciBzbGFzaCA9IGx0Lmxhc3RJbmRleE9mKCIvIiwgZ3RQb3MpOwogICAgICAgICAgaWYgKC0xICE9IHNsYXNoICYmIHNsYXNoIDwgZ3RQb3MpIHsKICAgICAgICAgICAgdmFyIHN0ciA9IGxpbmVUZXh0LnN1YnN0cihzbGFzaCwgZ3RQb3MgLSBzbGFzaCArIDEpOwogICAgICAgICAgICBpZiAoIXN0ci5tYXRjaCggL1wvXHMqXD4vICkpIC8vIHllcCwgdGhhdCdzIHRoZSBlbmQgb2YgZW1wdHkgdGFnCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsKys7CiAgICAgIH0KICAgICAgZm91bmQgPSB0cnVlOwogICAgfQogICAgZWxzZSB7CiAgICAgIHZhciBzbGFzaFBvcyA9IGxpbmVUZXh0Lmxhc3RJbmRleE9mKCIvIiwgZ3RQb3MpOwogICAgICBpZiAoLTEgPT0gc2xhc2hQb3MpIHsgLy8gY2Fubm90IGJlIGVtcHR5IHRhZwogICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAvLyBkb24ndCBjb250aW51ZQogICAgICB9CiAgICAgIGVsc2UgeyAvLyBlbXB0eSB0YWc/CiAgICAgICAgLy8gY2hlY2sgaWYgcmVhbGx5IGVtcHR5IHRhZwogICAgICAgIHZhciBzdHIgPSBsaW5lVGV4dC5zdWJzdHIoc2xhc2hQb3MsIGd0UG9zIC0gc2xhc2hQb3MgKyAxKTsKICAgICAgICBpZiAoIXN0ci5tYXRjaCggL1wvXHMqXD4vICkpIHsgLy8gZmluYWxseSBub3QgZW1wdHkKICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgIC8vIGRvbid0IGNvbnRpbnVlCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmQpIHsKICAgICAgdmFyIHN1YkxpbmUgPSBsaW5lVGV4dC5zdWJzdHIocG9zICsgMSk7CiAgICAgIHRhZyA9IHN1YkxpbmUubWF0Y2goeG1sTkFNRVJlZ0V4cCk7CiAgICAgIGlmICh0YWcpIHsKICAgICAgICAvLyB3ZSBoYXZlIGFuIGVsZW1lbnQgbmFtZSwgd29vb2hvb28gIQogICAgICAgIHRhZyA9IHRhZ1swXTsKICAgICAgICAvLyBkbyB3ZSBoYXZlIHRoZSBjbG9zZSB0YWcgb24gc2FtZSBsaW5lID8/PwogICAgICAgIGlmICgtMSAhPSBsaW5lVGV4dC5pbmRleE9mKCI8LyIgKyB0YWcgKyAiPiIsIHBvcykpIC8vIHllcAogICAgICAgIHsKICAgICAgICAgIGZvdW5kID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIHdlIGRvbid0LCBzbyB3ZSBoYXZlIGEgY2FuZGlkYXRlLi4uCiAgICAgIH0KICAgICAgZWxzZQogICAgICAgIGZvdW5kID0gZmFsc2U7CiAgICB9CiAgICBpZiAoIWZvdW5kKQogICAgICBwb3MrKzsKICB9CgogIGlmIChmb3VuZCkgewogICAgdmFyIHN0YXJ0VGFnID0gIihcXDxcXC8iICsgdGFnICsgIlxcPil8KFxcPCIgKyB0YWcgKyAiXFw+KXwoXFw8IiArIHRhZyArICJcXHMpfChcXDwiICsgdGFnICsgIiQpIjsKICAgIHZhciBzdGFydFRhZ1JlZ0V4cCA9IG5ldyBSZWdFeHAoc3RhcnRUYWcpOwogICAgdmFyIGVuZFRhZyA9ICI8LyIgKyB0YWcgKyAiPiI7CiAgICB2YXIgZGVwdGggPSAxOwogICAgdmFyIGwgPSBzdGFydC5saW5lICsgMTsKICAgIHZhciBsYXN0TGluZSA9IGNtLmxpbmVDb3VudCgpOwogICAgd2hpbGUgKGwgPCBsYXN0TGluZSkgewogICAgICBsaW5lVGV4dCA9IGNtLmdldExpbmUobCk7CiAgICAgIHZhciBtYXRjaCA9IGxpbmVUZXh0Lm1hdGNoKHN0YXJ0VGFnUmVnRXhwKTsKICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKG1hdGNoW2ldID09IGVuZFRhZykKICAgICAgICAgICAgZGVwdGgtLTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgZGVwdGgrKzsKICAgICAgICAgIGlmICghZGVwdGgpIHJldHVybiB7ZnJvbToge2xpbmU6IHN0YXJ0LmxpbmUsIGNoOiBndFBvcyArIDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bzoge2xpbmU6IGwsIGNoOiBtYXRjaC5pbmRleH19OwogICAgICAgIH0KICAgICAgfQogICAgICBsKys7CiAgICB9CiAgICByZXR1cm47CiAgfQp9OwoKQ29kZU1pcnJvci5icmFjZVJhbmdlRmluZGVyID0gZnVuY3Rpb24oY20sIHN0YXJ0KSB7CiAgdmFyIGxpbmUgPSBzdGFydC5saW5lLCBsaW5lVGV4dCA9IGNtLmdldExpbmUobGluZSk7CiAgdmFyIGF0ID0gbGluZVRleHQubGVuZ3RoLCBzdGFydENoYXIsIHRva2VuVHlwZTsKICBmb3IgKDs7KSB7CiAgICB2YXIgZm91bmQgPSBsaW5lVGV4dC5sYXN0SW5kZXhPZigieyIsIGF0KTsKICAgIGlmIChmb3VuZCA8IHN0YXJ0LmNoKSBicmVhazsKICAgIHRva2VuVHlwZSA9IGNtLmdldFRva2VuQXQoe2xpbmU6IGxpbmUsIGNoOiBmb3VuZH0pLnR5cGU7CiAgICBpZiAoIS9eKGNvbW1lbnR8c3RyaW5nKS8udGVzdCh0b2tlblR5cGUpKSB7IHN0YXJ0Q2hhciA9IGZvdW5kOyBicmVhazsgfQogICAgYXQgPSBmb3VuZCAtIDE7CiAgfQogIGlmIChzdGFydENoYXIgPT0gbnVsbCB8fCBsaW5lVGV4dC5sYXN0SW5kZXhPZigifSIpID4gc3RhcnRDaGFyKSByZXR1cm47CiAgdmFyIGNvdW50ID0gMSwgbGFzdExpbmUgPSBjbS5saW5lQ291bnQoKSwgZW5kLCBlbmRDaDsKICBvdXRlcjogZm9yICh2YXIgaSA9IGxpbmUgKyAxOyBpIDwgbGFzdExpbmU7ICsraSkgewogICAgdmFyIHRleHQgPSBjbS5nZXRMaW5lKGkpLCBwb3MgPSAwOwogICAgZm9yICg7OykgewogICAgICB2YXIgbmV4dE9wZW4gPSB0ZXh0LmluZGV4T2YoInsiLCBwb3MpLCBuZXh0Q2xvc2UgPSB0ZXh0LmluZGV4T2YoIn0iLCBwb3MpOwogICAgICBpZiAobmV4dE9wZW4gPCAwKSBuZXh0T3BlbiA9IHRleHQubGVuZ3RoOwogICAgICBpZiAobmV4dENsb3NlIDwgMCkgbmV4dENsb3NlID0gdGV4dC5sZW5ndGg7CiAgICAgIHBvcyA9IE1hdGgubWluKG5leHRPcGVuLCBuZXh0Q2xvc2UpOwogICAgICBpZiAocG9zID09IHRleHQubGVuZ3RoKSBicmVhazsKICAgICAgaWYgKGNtLmdldFRva2VuQXQoe2xpbmU6IGksIGNoOiBwb3MgKyAxfSkudHlwZSA9PSB0b2tlblR5cGUpIHsKICAgICAgICBpZiAocG9zID09IG5leHRPcGVuKSArK2NvdW50OwogICAgICAgIGVsc2UgaWYgKCEtLWNvdW50KSB7IGVuZCA9IGk7IGVuZENoID0gcG9zOyBicmVhayBvdXRlcjsgfQogICAgICB9CiAgICAgICsrcG9zOwogICAgfQogIH0KICBpZiAoZW5kID09IG51bGwgfHwgZW5kID09IGxpbmUgKyAxKSByZXR1cm47CiAgcmV0dXJuIHtmcm9tOiB7bGluZTogbGluZSwgY2g6IHN0YXJ0Q2hhciArIDF9LAogICAgICAgICAgdG86IHtsaW5lOiBlbmQsIGNoOiBlbmRDaH19Owp9OwoKQ29kZU1pcnJvci5pbmRlbnRSYW5nZUZpbmRlciA9IGZ1bmN0aW9uKGNtLCBzdGFydCkgewogIHZhciB0YWJTaXplID0gY20uZ2V0T3B0aW9uKCJ0YWJTaXplIiksIGZpcnN0TGluZSA9IGNtLmdldExpbmUoc3RhcnQubGluZSk7CiAgdmFyIG15SW5kZW50ID0gQ29kZU1pcnJvci5jb3VudENvbHVtbihmaXJzdExpbmUsIG51bGwsIHRhYlNpemUpOwogIGZvciAodmFyIGkgPSBzdGFydC5saW5lICsgMSwgZW5kID0gY20ubGluZUNvdW50KCk7IGkgPCBlbmQ7ICsraSkgewogICAgdmFyIGN1ckxpbmUgPSBjbS5nZXRMaW5lKGkpOwogICAgaWYgKENvZGVNaXJyb3IuY291bnRDb2x1bW4oY3VyTGluZSwgbnVsbCwgdGFiU2l6ZSkgPCBteUluZGVudCkKICAgICAgcmV0dXJuIHtmcm9tOiB7bGluZTogc3RhcnQubGluZSwgY2g6IGZpcnN0TGluZS5sZW5ndGh9LAogICAgICAgICAgICAgIHRvOiB7bGluZTogaSwgY2g6IGN1ckxpbmUubGVuZ3RofX07CiAgfQp9OwoKQ29kZU1pcnJvci5uZXdGb2xkRnVuY3Rpb24gPSBmdW5jdGlvbihyYW5nZUZpbmRlciwgd2lkZ2V0KSB7CiAgaWYgKHdpZGdldCA9PSBudWxsKSB3aWRnZXQgPSAiXHUyMTk0IjsKICBpZiAodHlwZW9mIHdpZGdldCA9PSAic3RyaW5nIikgewogICAgdmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh3aWRnZXQpOwogICAgd2lkZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgd2lkZ2V0LmFwcGVuZENoaWxkKHRleHQpOwogICAgd2lkZ2V0LmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLWZvbGRtYXJrZXIiOwogIH0KCiAgcmV0dXJuIGZ1bmN0aW9uKGNtLCBwb3MpIHsKICAgIGlmICh0eXBlb2YgcG9zID09ICJudW1iZXIiKSBwb3MgPSB7bGluZTogcG9zLCBjaDogMH07CiAgICB2YXIgcmFuZ2UgPSByYW5nZUZpbmRlcihjbSwgcG9zKTsKICAgIGlmICghcmFuZ2UpIHJldHVybjsKCiAgICB2YXIgcHJlc2VudCA9IGNtLmZpbmRNYXJrc0F0KHJhbmdlLmZyb20pLCBjbGVhcmVkID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlc2VudC5sZW5ndGg7ICsraSkgewogICAgICBpZiAocHJlc2VudFtpXS5fX2lzRm9sZCkgewogICAgICAgICsrY2xlYXJlZDsKICAgICAgICBwcmVzZW50W2ldLmNsZWFyKCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjbGVhcmVkKSByZXR1cm47CgogICAgdmFyIG15V2lkZ2V0ID0gd2lkZ2V0LmNsb25lTm9kZSh0cnVlKTsKICAgIENvZGVNaXJyb3Iub24obXlXaWRnZXQsICJtb3VzZWRvd24iLCBmdW5jdGlvbigpIHtteVJhbmdlLmNsZWFyKCk7fSk7CiAgICB2YXIgbXlSYW5nZSA9IGNtLm1hcmtUZXh0KHJhbmdlLmZyb20sIHJhbmdlLnRvLCB7CiAgICAgIHJlcGxhY2VkV2l0aDogbXlXaWRnZXQsCiAgICAgIGNsZWFyT25FbnRlcjogdHJ1ZSwKICAgICAgX19pc0ZvbGQ6IHRydWUKICAgIH0pOwogIH07Cn07Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/formatting.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewoKICBDb2RlTWlycm9yLmV4dGVuZE1vZGUoImNzcyIsIHsKICAgIGNvbW1lbnRTdGFydDogIi8qIiwKICAgIGNvbW1lbnRFbmQ6ICIqLyIsCiAgICBuZXdsaW5lQWZ0ZXJUb2tlbjogZnVuY3Rpb24oX3R5cGUsIGNvbnRlbnQpIHsKICAgICAgcmV0dXJuIC9eWzt7fV0kLy50ZXN0KGNvbnRlbnQpOwogICAgfQogIH0pOwoKICBDb2RlTWlycm9yLmV4dGVuZE1vZGUoImphdmFzY3JpcHQiLCB7CiAgICBjb21tZW50U3RhcnQ6ICIvKiIsCiAgICBjb21tZW50RW5kOiAiKi8iLAogICAgLy8gRklYTUUgc2VtaWNvbG9ucyBpbnNpZGUgb2YgZm9yCiAgICBuZXdsaW5lQWZ0ZXJUb2tlbjogZnVuY3Rpb24oX3R5cGUsIGNvbnRlbnQsIHRleHRBZnRlciwgc3RhdGUpIHsKICAgICAgaWYgKHRoaXMuanNvbk1vZGUpIHsKICAgICAgICByZXR1cm4gL15bXFsse10kLy50ZXN0KGNvbnRlbnQpIHx8IC9efS8udGVzdCh0ZXh0QWZ0ZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChjb250ZW50ID09ICI7IiAmJiBzdGF0ZS5sZXhpY2FsICYmIHN0YXRlLmxleGljYWwudHlwZSA9PSAiKSIpIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gL15bO3t9XSQvLnRlc3QoY29udGVudCkgJiYgIS9eOy8udGVzdCh0ZXh0QWZ0ZXIpOwogICAgICB9CiAgICB9CiAgfSk7CgogIENvZGVNaXJyb3IuZXh0ZW5kTW9kZSgieG1sIiwgewogICAgY29tbWVudFN0YXJ0OiAiPCEtLSIsCiAgICBjb21tZW50RW5kOiAiLS0+IiwKICAgIG5ld2xpbmVBZnRlclRva2VuOiBmdW5jdGlvbih0eXBlLCBjb250ZW50LCB0ZXh0QWZ0ZXIpIHsKICAgICAgcmV0dXJuIHR5cGUgPT0gInRhZyIgJiYgLz4kLy50ZXN0KGNvbnRlbnQpIHx8IC9ePC8udGVzdCh0ZXh0QWZ0ZXIpOwogICAgfQogIH0pOwoKICAvLyBDb21tZW50L3VuY29tbWVudCB0aGUgc3BlY2lmaWVkIHJhbmdlCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oImNvbW1lbnRSYW5nZSIsIGZ1bmN0aW9uIChpc0NvbW1lbnQsIGZyb20sIHRvKSB7CiAgICB2YXIgY20gPSB0aGlzLCBjdXJNb2RlID0gQ29kZU1pcnJvci5pbm5lck1vZGUoY20uZ2V0TW9kZSgpLCBjbS5nZXRUb2tlbkF0KGZyb20pLnN0YXRlKS5tb2RlOwogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBpZiAoaXNDb21tZW50KSB7IC8vIENvbW1lbnQgcmFuZ2UKICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoY3VyTW9kZS5jb21tZW50RW5kLCB0byk7CiAgICAgICAgY20ucmVwbGFjZVJhbmdlKGN1ck1vZGUuY29tbWVudFN0YXJ0LCBmcm9tKTsKICAgICAgICBpZiAoZnJvbS5saW5lID09IHRvLmxpbmUgJiYgZnJvbS5jaCA9PSB0by5jaCkgLy8gQW4gZW1wdHkgY29tbWVudCBpbnNlcnRlZCAtIHB1dCBjdXJzb3IgaW5zaWRlCiAgICAgICAgICBjbS5zZXRDdXJzb3IoZnJvbS5saW5lLCBmcm9tLmNoICsgY3VyTW9kZS5jb21tZW50U3RhcnQubGVuZ3RoKTsKICAgICAgfSBlbHNlIHsgLy8gVW5jb21tZW50IHJhbmdlCiAgICAgICAgdmFyIHNlbFRleHQgPSBjbS5nZXRSYW5nZShmcm9tLCB0byk7CiAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSBzZWxUZXh0LmluZGV4T2YoY3VyTW9kZS5jb21tZW50U3RhcnQpOwogICAgICAgIHZhciBlbmRJbmRleCA9IHNlbFRleHQubGFzdEluZGV4T2YoY3VyTW9kZS5jb21tZW50RW5kKTsKICAgICAgICBpZiAoc3RhcnRJbmRleCA+IC0xICYmIGVuZEluZGV4ID4gLTEgJiYgZW5kSW5kZXggPiBzdGFydEluZGV4KSB7CiAgICAgICAgICAvLyBUYWtlIHN0cmluZyB0aWxsIGNvbW1lbnQgc3RhcnQKICAgICAgICAgIHNlbFRleHQgPSBzZWxUZXh0LnN1YnN0cigwLCBzdGFydEluZGV4KQogICAgICAgICAgLy8gRnJvbSBjb21tZW50IHN0YXJ0IHRpbGwgY29tbWVudCBlbmQKICAgICAgICAgICAgKyBzZWxUZXh0LnN1YnN0cmluZyhzdGFydEluZGV4ICsgY3VyTW9kZS5jb21tZW50U3RhcnQubGVuZ3RoLCBlbmRJbmRleCkKICAgICAgICAgIC8vIEZyb20gY29tbWVudCBlbmQgdGlsbCBzdHJpbmcgZW5kCiAgICAgICAgICAgICsgc2VsVGV4dC5zdWJzdHIoZW5kSW5kZXggKyBjdXJNb2RlLmNvbW1lbnRFbmQubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgY20ucmVwbGFjZVJhbmdlKHNlbFRleHQsIGZyb20sIHRvKTsKICAgICAgfQogICAgfSk7CiAgfSk7CgogIC8vIEFwcGxpZXMgYXV0b21hdGljIG1vZGUtYXdhcmUgaW5kZW50YXRpb24gdG8gdGhlIHNwZWNpZmllZCByYW5nZQogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJhdXRvSW5kZW50UmFuZ2UiLCBmdW5jdGlvbiAoZnJvbSwgdG8pIHsKICAgIHZhciBjbUluc3RhbmNlID0gdGhpczsKICAgIHRoaXMub3BlcmF0aW9uKGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IGZyb20ubGluZTsgaSA8PSB0by5saW5lOyBpKyspIHsKICAgICAgICBjbUluc3RhbmNlLmluZGVudExpbmUoaSwgInNtYXJ0Iik7CiAgICAgIH0KICAgIH0pOwogIH0pOwoKICAvLyBBcHBsaWVzIGF1dG9tYXRpYyBmb3JtYXR0aW5nIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2UKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigiYXV0b0Zvcm1hdFJhbmdlIiwgZnVuY3Rpb24gKGZyb20sIHRvKSB7CiAgICB2YXIgY20gPSB0aGlzOwogICAgdmFyIG91dGVyID0gY20uZ2V0TW9kZSgpLCB0ZXh0ID0gY20uZ2V0UmFuZ2UoZnJvbSwgdG8pLnNwbGl0KCJcbiIpOwogICAgdmFyIHN0YXRlID0gQ29kZU1pcnJvci5jb3B5U3RhdGUob3V0ZXIsIGNtLmdldFRva2VuQXQoZnJvbSkuc3RhdGUpOwogICAgdmFyIHRhYlNpemUgPSBjbS5nZXRPcHRpb24oInRhYlNpemUiKTsKCiAgICB2YXIgb3V0ID0gIiIsIGxpbmVzID0gMCwgYXRTb2wgPSBmcm9tLmNoID09IDA7CiAgICBmdW5jdGlvbiBuZXdsaW5lKCkgewogICAgICBvdXQgKz0gIlxuIjsKICAgICAgYXRTb2wgPSB0cnVlOwogICAgICArK2xpbmVzOwogICAgfQoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7ICsraSkgewogICAgICB2YXIgc3RyZWFtID0gbmV3IENvZGVNaXJyb3IuU3RyaW5nU3RyZWFtKHRleHRbaV0sIHRhYlNpemUpOwogICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKG91dGVyLCBzdGF0ZSk7CiAgICAgICAgdmFyIHN0eWxlID0gb3V0ZXIudG9rZW4oc3RyZWFtLCBzdGF0ZSksIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgICAgICBpZiAoIWF0U29sIHx8IC9cUy8udGVzdChjdXIpKSB7CiAgICAgICAgICBvdXQgKz0gY3VyOwogICAgICAgICAgYXRTb2wgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFhdFNvbCAmJiBpbm5lci5tb2RlLm5ld2xpbmVBZnRlclRva2VuICYmCiAgICAgICAgICAgIGlubmVyLm1vZGUubmV3bGluZUFmdGVyVG9rZW4oc3R5bGUsIGN1ciwgc3RyZWFtLnN0cmluZy5zbGljZShzdHJlYW0ucG9zKSB8fCB0ZXh0W2krMV0gfHwgIiIsIGlubmVyLnN0YXRlKSkKICAgICAgICAgIG5ld2xpbmUoKTsKICAgICAgfQogICAgICBpZiAoIXN0cmVhbS5wb3MgJiYgb3V0ZXIuYmxhbmtMaW5lKSBvdXRlci5ibGFua0xpbmUoc3RhdGUpOwogICAgICBpZiAoIWF0U29sKSBuZXdsaW5lKCk7CiAgICB9CgogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uICgpIHsKICAgICAgY20ucmVwbGFjZVJhbmdlKG91dCwgZnJvbSwgdG8pOwogICAgICBmb3IgKHZhciBjdXIgPSBmcm9tLmxpbmUgKyAxLCBlbmQgPSBmcm9tLmxpbmUgKyBsaW5lczsgY3VyIDw9IGVuZDsgKytjdXIpCiAgICAgICAgY20uaW5kZW50TGluZShjdXIsICJzbWFydCIpOwogICAgICBjbS5zZXRTZWxlY3Rpb24oZnJvbSwgY20uZ2V0Q3Vyc29yKGZhbHNlKSk7CiAgICB9KTsKICB9KTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/javascript-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZikgewogICAgZm9yICh2YXIgaSA9IDAsIGUgPSBhcnIubGVuZ3RoOyBpIDwgZTsgKytpKSBmKGFycltpXSk7CiAgfQogIAogIGZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYXJyLCBpdGVtKSB7CiAgICBpZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CiAgICAgIHZhciBpID0gYXJyLmxlbmd0aDsKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gYXJyLmluZGV4T2YoaXRlbSkgIT0gLTE7CiAgfQoKICBmdW5jdGlvbiBzY3JpcHRIaW50KGVkaXRvciwga2V5d29yZHMsIGdldFRva2VuLCBvcHRpb25zKSB7CiAgICAvLyBGaW5kIHRoZSB0b2tlbiBhdCB0aGUgY3Vyc29yCiAgICB2YXIgY3VyID0gZWRpdG9yLmdldEN1cnNvcigpLCB0b2tlbiA9IGdldFRva2VuKGVkaXRvciwgY3VyKSwgdHByb3AgPSB0b2tlbjsKICAgIC8vIElmIGl0J3Mgbm90IGEgJ3dvcmQtc3R5bGUnIHRva2VuLCBpZ25vcmUgdGhlIHRva2VuLgoJCWlmICghL15bXHckX10qJC8udGVzdCh0b2tlbi5zdHJpbmcpKSB7CiAgICAgIHRva2VuID0gdHByb3AgPSB7c3RhcnQ6IGN1ci5jaCwgZW5kOiBjdXIuY2gsIHN0cmluZzogIiIsIHN0YXRlOiB0b2tlbi5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0b2tlbi5zdHJpbmcgPT0gIi4iID8gInByb3BlcnR5IiA6IG51bGx9OwogICAgfQogICAgLy8gSWYgaXQgaXMgYSBwcm9wZXJ0eSwgZmluZCBvdXQgd2hhdCBpdCBpcyBhIHByb3BlcnR5IG9mLgogICAgd2hpbGUgKHRwcm9wLnR5cGUgPT0gInByb3BlcnR5IikgewogICAgICB0cHJvcCA9IGdldFRva2VuKGVkaXRvciwge2xpbmU6IGN1ci5saW5lLCBjaDogdHByb3Auc3RhcnR9KTsKICAgICAgaWYgKHRwcm9wLnN0cmluZyAhPSAiLiIpIHJldHVybjsKICAgICAgdHByb3AgPSBnZXRUb2tlbihlZGl0b3IsIHtsaW5lOiBjdXIubGluZSwgY2g6IHRwcm9wLnN0YXJ0fSk7CiAgICAgIGlmICh0cHJvcC5zdHJpbmcgPT0gJyknKSB7CiAgICAgICAgdmFyIGxldmVsID0gMTsKICAgICAgICBkbyB7CiAgICAgICAgICB0cHJvcCA9IGdldFRva2VuKGVkaXRvciwge2xpbmU6IGN1ci5saW5lLCBjaDogdHByb3Auc3RhcnR9KTsKICAgICAgICAgIHN3aXRjaCAodHByb3Auc3RyaW5nKSB7CiAgICAgICAgICBjYXNlICcpJzogbGV2ZWwrKzsgYnJlYWs7CiAgICAgICAgICBjYXNlICcoJzogbGV2ZWwtLTsgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChsZXZlbCA+IDApOwogICAgICAgIHRwcm9wID0gZ2V0VG9rZW4oZWRpdG9yLCB7bGluZTogY3VyLmxpbmUsIGNoOiB0cHJvcC5zdGFydH0pOwoJaWYgKHRwcm9wLnR5cGUgPT0gJ3ZhcmlhYmxlJykKCSAgdHByb3AudHlwZSA9ICdmdW5jdGlvbic7CgllbHNlIHJldHVybjsgLy8gbm8gY2x1ZQogICAgICB9CiAgICAgIGlmICghY29udGV4dCkgdmFyIGNvbnRleHQgPSBbXTsKICAgICAgY29udGV4dC5wdXNoKHRwcm9wKTsKICAgIH0KICAgIHJldHVybiB7bGlzdDogZ2V0Q29tcGxldGlvbnModG9rZW4sIGNvbnRleHQsIGtleXdvcmRzLCBvcHRpb25zKSwKICAgICAgICAgICAgZnJvbToge2xpbmU6IGN1ci5saW5lLCBjaDogdG9rZW4uc3RhcnR9LAogICAgICAgICAgICB0bzoge2xpbmU6IGN1ci5saW5lLCBjaDogdG9rZW4uZW5kfX07CiAgfQoKICBDb2RlTWlycm9yLmphdmFzY3JpcHRIaW50ID0gZnVuY3Rpb24oZWRpdG9yLCBvcHRpb25zKSB7CiAgICByZXR1cm4gc2NyaXB0SGludChlZGl0b3IsIGphdmFzY3JpcHRLZXl3b3JkcywKICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBjdXIpIHtyZXR1cm4gZS5nZXRUb2tlbkF0KGN1cik7fSwKICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOwogIH07CgogIGZ1bmN0aW9uIGdldENvZmZlZVNjcmlwdFRva2VuKGVkaXRvciwgY3VyKSB7CiAgLy8gVGhpcyBnZXRUb2tlbiwgaXQgaXMgZm9yIGNvZmZlZXNjcmlwdCwgaW1pdGF0ZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8gZ2V0VG9rZW5BdCBtZXRob2QgaW4gamF2YXNjcmlwdC5qcywgdGhhdCBpcywgcmV0dXJuaW5nICJwcm9wZXJ0eSIKICAvLyB0eXBlIGFuZCB0cmVhdCAiLiIgYXMgaW5kZXBlbmVudCB0b2tlbi4KICAgIHZhciB0b2tlbiA9IGVkaXRvci5nZXRUb2tlbkF0KGN1cik7CiAgICBpZiAoY3VyLmNoID09IHRva2VuLnN0YXJ0ICsgMSAmJiB0b2tlbi5zdHJpbmcuY2hhckF0KDApID09ICcuJykgewogICAgICB0b2tlbi5lbmQgPSB0b2tlbi5zdGFydDsKICAgICAgdG9rZW4uc3RyaW5nID0gJy4nOwogICAgICB0b2tlbi50eXBlID0gInByb3BlcnR5IjsKICAgIH0KICAgIGVsc2UgaWYgKC9eXC5bXHckX10qJC8udGVzdCh0b2tlbi5zdHJpbmcpKSB7CiAgICAgIHRva2VuLnR5cGUgPSAicHJvcGVydHkiOwogICAgICB0b2tlbi5zdGFydCsrOwogICAgICB0b2tlbi5zdHJpbmcgPSB0b2tlbi5zdHJpbmcucmVwbGFjZSgvXC4vLCAnJyk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBDb2RlTWlycm9yLmNvZmZlZXNjcmlwdEhpbnQgPSBmdW5jdGlvbihlZGl0b3IsIG9wdGlvbnMpIHsKICAgIHJldHVybiBzY3JpcHRIaW50KGVkaXRvciwgY29mZmVlc2NyaXB0S2V5d29yZHMsIGdldENvZmZlZVNjcmlwdFRva2VuLCBvcHRpb25zKTsKICB9OwoKICB2YXIgc3RyaW5nUHJvcHMgPSAoImNoYXJBdCBjaGFyQ29kZUF0IGluZGV4T2YgbGFzdEluZGV4T2Ygc3Vic3RyaW5nIHN1YnN0ciBzbGljZSB0cmltIHRyaW1MZWZ0IHRyaW1SaWdodCAiICsKICAgICAgICAgICAgICAgICAgICAgInRvVXBwZXJDYXNlIHRvTG93ZXJDYXNlIHNwbGl0IGNvbmNhdCBtYXRjaCByZXBsYWNlIHNlYXJjaCIpLnNwbGl0KCIgIik7CiAgdmFyIGFycmF5UHJvcHMgPSAoImxlbmd0aCBjb25jYXQgam9pbiBzcGxpY2UgcHVzaCBwb3Agc2hpZnQgdW5zaGlmdCBzbGljZSByZXZlcnNlIHNvcnQgaW5kZXhPZiAiICsKICAgICAgICAgICAgICAgICAgICAibGFzdEluZGV4T2YgZXZlcnkgc29tZSBmaWx0ZXIgZm9yRWFjaCBtYXAgcmVkdWNlIHJlZHVjZVJpZ2h0ICIpLnNwbGl0KCIgIik7CiAgdmFyIGZ1bmNQcm9wcyA9ICJwcm90b3R5cGUgYXBwbHkgY2FsbCBiaW5kIi5zcGxpdCgiICIpOwogIHZhciBqYXZhc2NyaXB0S2V5d29yZHMgPSAoImJyZWFrIGNhc2UgY2F0Y2ggY29udGludWUgZGVidWdnZXIgZGVmYXVsdCBkZWxldGUgZG8gZWxzZSBmYWxzZSBmaW5hbGx5IGZvciBmdW5jdGlvbiAiICsKICAgICAgICAgICAgICAgICAgImlmIGluIGluc3RhbmNlb2YgbmV3IG51bGwgcmV0dXJuIHN3aXRjaCB0aHJvdyB0cnVlIHRyeSB0eXBlb2YgdmFyIHZvaWQgd2hpbGUgd2l0aCIpLnNwbGl0KCIgIik7CiAgdmFyIGNvZmZlZXNjcmlwdEtleXdvcmRzID0gKCJhbmQgYnJlYWsgY2F0Y2ggY2xhc3MgY29udGludWUgZGVsZXRlIGRvIGVsc2UgZXh0ZW5kcyBmYWxzZSBmaW5hbGx5IGZvciAiICsKICAgICAgICAgICAgICAgICAgImlmIGluIGluc3RhbmNlb2YgaXNudCBuZXcgbm8gbm90IG51bGwgb2Ygb2ZmIG9uIG9yIHJldHVybiBzd2l0Y2ggdGhlbiB0aHJvdyB0cnVlIHRyeSB0eXBlb2YgdW50aWwgdm9pZCB3aGlsZSB3aXRoIHllcyIpLnNwbGl0KCIgIik7CgogIGZ1bmN0aW9uIGdldENvbXBsZXRpb25zKHRva2VuLCBjb250ZXh0LCBrZXl3b3Jkcywgb3B0aW9ucykgewogICAgdmFyIGZvdW5kID0gW10sIHN0YXJ0ID0gdG9rZW4uc3RyaW5nOwogICAgZnVuY3Rpb24gbWF5YmVBZGQoc3RyKSB7CiAgICAgIGlmIChzdHIuaW5kZXhPZihzdGFydCkgPT0gMCAmJiAhYXJyYXlDb250YWlucyhmb3VuZCwgc3RyKSkgZm91bmQucHVzaChzdHIpOwogICAgfQogICAgZnVuY3Rpb24gZ2F0aGVyQ29tcGxldGlvbnMob2JqKSB7CiAgICAgIGlmICh0eXBlb2Ygb2JqID09ICJzdHJpbmciKSBmb3JFYWNoKHN0cmluZ1Byb3BzLCBtYXliZUFkZCk7CiAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KSBmb3JFYWNoKGFycmF5UHJvcHMsIG1heWJlQWRkKTsKICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRnVuY3Rpb24pIGZvckVhY2goZnVuY1Byb3BzLCBtYXliZUFkZCk7CiAgICAgIGZvciAodmFyIG5hbWUgaW4gb2JqKSBtYXliZUFkZChuYW1lKTsKICAgIH0KCiAgICBpZiAoY29udGV4dCkgewogICAgICAvLyBJZiB0aGlzIGlzIGEgcHJvcGVydHksIHNlZSBpZiBpdCBiZWxvbmdzIHRvIHNvbWUgb2JqZWN0IHdlIGNhbgogICAgICAvLyBmaW5kIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LgogICAgICB2YXIgb2JqID0gY29udGV4dC5wb3AoKSwgYmFzZTsKICAgICAgaWYgKG9iai50eXBlID09ICJ2YXJpYWJsZSIpIHsKICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFkZGl0aW9uYWxDb250ZXh0KQogICAgICAgICAgYmFzZSA9IG9wdGlvbnMuYWRkaXRpb25hbENvbnRleHRbb2JqLnN0cmluZ107CiAgICAgICAgYmFzZSA9IGJhc2UgfHwgd2luZG93W29iai5zdHJpbmddOwogICAgICB9IGVsc2UgaWYgKG9iai50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgYmFzZSA9ICIiOwogICAgICB9IGVsc2UgaWYgKG9iai50eXBlID09ICJhdG9tIikgewogICAgICAgIGJhc2UgPSAxOwogICAgICB9IGVsc2UgaWYgKG9iai50eXBlID09ICJmdW5jdGlvbiIpIHsKICAgICAgICBpZiAod2luZG93LmpRdWVyeSAhPSBudWxsICYmIChvYmouc3RyaW5nID09ICckJyB8fCBvYmouc3RyaW5nID09ICdqUXVlcnknKSAmJgogICAgICAgICAgICAodHlwZW9mIHdpbmRvdy5qUXVlcnkgPT0gJ2Z1bmN0aW9uJykpCiAgICAgICAgICBiYXNlID0gd2luZG93LmpRdWVyeSgpOwogICAgICAgIGVsc2UgaWYgKHdpbmRvdy5fICE9IG51bGwgJiYgKG9iai5zdHJpbmcgPT0gJ18nKSAmJiAodHlwZW9mIHdpbmRvdy5fID09ICdmdW5jdGlvbicpKQogICAgICAgICAgYmFzZSA9IHdpbmRvdy5fKCk7CiAgICAgIH0KICAgICAgd2hpbGUgKGJhc2UgIT0gbnVsbCAmJiBjb250ZXh0Lmxlbmd0aCkKICAgICAgICBiYXNlID0gYmFzZVtjb250ZXh0LnBvcCgpLnN0cmluZ107CiAgICAgIGlmIChiYXNlICE9IG51bGwpIGdhdGhlckNvbXBsZXRpb25zKGJhc2UpOwogICAgfQogICAgZWxzZSB7CiAgICAgIC8vIElmIG5vdCwganVzdCBsb29rIGluIHRoZSB3aW5kb3cgb2JqZWN0IGFuZCBhbnkgbG9jYWwgc2NvcGUKICAgICAgLy8gKHJlYWRpbmcgaW50byBKUyBtb2RlIGludGVybmFscyB0byBnZXQgYXQgdGhlIGxvY2FsIHZhcmlhYmxlcykKICAgICAgZm9yICh2YXIgdiA9IHRva2VuLnN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkgbWF5YmVBZGQodi5uYW1lKTsKICAgICAgZ2F0aGVyQ29tcGxldGlvbnMod2luZG93KTsKICAgICAgZm9yRWFjaChrZXl3b3JkcywgbWF5YmVBZGQpOwogICAgfQogICAgcmV0dXJuIGZvdW5kOwogIH0KfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/loadmode.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIGlmICghQ29kZU1pcnJvci5tb2RlVVJMKSBDb2RlTWlycm9yLm1vZGVVUkwgPSAiLi4vbW9kZS8lTi8lTi5qcyI7CgogIHZhciBsb2FkaW5nID0ge307CiAgZnVuY3Rpb24gc3BsaXRDYWxsYmFjayhjb250LCBuKSB7CiAgICB2YXIgY291bnREb3duID0gbjsKICAgIHJldHVybiBmdW5jdGlvbigpIHsgaWYgKC0tY291bnREb3duID09IDApIGNvbnQoKTsgfTsKICB9CiAgZnVuY3Rpb24gZW5zdXJlRGVwcyhtb2RlLCBjb250KSB7CiAgICB2YXIgZGVwcyA9IENvZGVNaXJyb3IubW9kZXNbbW9kZV0uZGVwZW5kZW5jaWVzOwogICAgaWYgKCFkZXBzKSByZXR1cm4gY29udCgpOwogICAgdmFyIG1pc3NpbmcgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwcy5sZW5ndGg7ICsraSkgewogICAgICBpZiAoIUNvZGVNaXJyb3IubW9kZXMuaGFzT3duUHJvcGVydHkoZGVwc1tpXSkpCiAgICAgICAgbWlzc2luZy5wdXNoKGRlcHNbaV0pOwogICAgfQogICAgaWYgKCFtaXNzaW5nLmxlbmd0aCkgcmV0dXJuIGNvbnQoKTsKICAgIHZhciBzcGxpdCA9IHNwbGl0Q2FsbGJhY2soY29udCwgbWlzc2luZy5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXNzaW5nLmxlbmd0aDsgKytpKQogICAgICBDb2RlTWlycm9yLnJlcXVpcmVNb2RlKG1pc3NpbmdbaV0sIHNwbGl0KTsKICB9CgogIENvZGVNaXJyb3IucmVxdWlyZU1vZGUgPSBmdW5jdGlvbihtb2RlLCBjb250KSB7CiAgICBpZiAodHlwZW9mIG1vZGUgIT0gInN0cmluZyIpIG1vZGUgPSBtb2RlLm5hbWU7CiAgICBpZiAoQ29kZU1pcnJvci5tb2Rlcy5oYXNPd25Qcm9wZXJ0eShtb2RlKSkgcmV0dXJuIGVuc3VyZURlcHMobW9kZSwgY29udCk7CiAgICBpZiAobG9hZGluZy5oYXNPd25Qcm9wZXJ0eShtb2RlKSkgcmV0dXJuIGxvYWRpbmdbbW9kZV0ucHVzaChjb250KTsKCiAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICBzY3JpcHQuc3JjID0gQ29kZU1pcnJvci5tb2RlVVJMLnJlcGxhY2UoLyVOL2csIG1vZGUpOwogICAgdmFyIG90aGVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXTsKICAgIG90aGVycy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHQsIG90aGVycyk7CiAgICB2YXIgbGlzdCA9IGxvYWRpbmdbbW9kZV0gPSBbY29udF07CiAgICB2YXIgY291bnQgPSAwLCBwb2xsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgIGlmICgrK2NvdW50ID4gMTAwKSByZXR1cm4gY2xlYXJJbnRlcnZhbChwb2xsKTsKICAgICAgaWYgKENvZGVNaXJyb3IubW9kZXMuaGFzT3duUHJvcGVydHkobW9kZSkpIHsKICAgICAgICBjbGVhckludGVydmFsKHBvbGwpOwogICAgICAgIGxvYWRpbmdbbW9kZV0gPSBudWxsOwogICAgICAgIGVuc3VyZURlcHMobW9kZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIGxpc3RbaV0oKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwgMjAwKTsKICB9OwoKICBDb2RlTWlycm9yLmF1dG9Mb2FkTW9kZSA9IGZ1bmN0aW9uKGluc3RhbmNlLCBtb2RlKSB7CiAgICBpZiAoIUNvZGVNaXJyb3IubW9kZXMuaGFzT3duUHJvcGVydHkobW9kZSkpCiAgICAgIENvZGVNaXJyb3IucmVxdWlyZU1vZGUobW9kZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgaW5zdGFuY2Uuc2V0T3B0aW9uKCJtb2RlIiwgaW5zdGFuY2UuZ2V0T3B0aW9uKCJtb2RlIikpOwogICAgICB9KTsKICB9Owp9KCkpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/match-highlighter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gRGVmaW5lIG1hdGNoLWhpZ2hsaWdodGVyIGNvbW1hbmRzLiBEZXBlbmRzIG9uIHNlYXJjaGN1cnNvci5qcwovLyBVc2UgYnkgYXR0YWNoaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCB0byB0aGUgY3Vyc29yQWN0aXZpdHkgZXZlbnQ6CgkvL215Q29kZU1pcnJvci5tYXRjaEhpZ2hsaWdodChtaW5DaGFycyk7Ci8vIEFuZCBpbmNsdWRpbmcgYSBzcGVjaWFsIHNwYW4uQ29kZU1pcnJvci1tYXRjaGhpZ2hsaWdodCBjc3MgY2xhc3MgKGFsc28gb3B0aW9uYWxseSBhIHNlcGFyYXRlIG9uZSBmb3IgLkNvZGVNaXJyb3ItZm9jdXNlZCAtLSBzZWUgZGVtbyBtYXRjaGhpZ2hsaWdodGVyLmh0bWwpCgooZnVuY3Rpb24oKSB7CiAgdmFyIERFRkFVTFRfTUlOX0NIQVJTID0gMjsKICAKICBmdW5jdGlvbiBNYXRjaEhpZ2hsaWdodFN0YXRlKCkgewoJdGhpcy5tYXJrZWQgPSBbXTsKICB9CiAgZnVuY3Rpb24gZ2V0TWF0Y2hIaWdobGlnaHRTdGF0ZShjbSkgewoJcmV0dXJuIGNtLl9tYXRjaEhpZ2hsaWdodFN0YXRlIHx8IChjbS5fbWF0Y2hIaWdobGlnaHRTdGF0ZSA9IG5ldyBNYXRjaEhpZ2hsaWdodFN0YXRlKCkpOwogIH0KICAKICBmdW5jdGlvbiBjbGVhck1hcmtzKGNtKSB7Cgl2YXIgc3RhdGUgPSBnZXRNYXRjaEhpZ2hsaWdodFN0YXRlKGNtKTsKCWZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUubWFya2VkLmxlbmd0aDsgKytpKQoJCXN0YXRlLm1hcmtlZFtpXS5jbGVhcigpOwoJc3RhdGUubWFya2VkID0gW107CiAgfQogIAogIGZ1bmN0aW9uIG1hcmtEb2N1bWVudChjbSwgY2xhc3NOYW1lLCBtaW5DaGFycykgewogICAgY2xlYXJNYXJrcyhjbSk7CgltaW5DaGFycyA9ICh0eXBlb2YgbWluQ2hhcnMgIT09ICd1bmRlZmluZWQnID8gbWluQ2hhcnMgOiBERUZBVUxUX01JTl9DSEFSUyk7CglpZiAoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSAmJiBjbS5nZXRTZWxlY3Rpb24oKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgIiIpLmxlbmd0aCA+PSBtaW5DaGFycykgewoJCXZhciBzdGF0ZSA9IGdldE1hdGNoSGlnaGxpZ2h0U3RhdGUoY20pOwoJCXZhciBxdWVyeSA9IGNtLmdldFNlbGVjdGlvbigpOwoJCWNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKCQkJaWYgKGNtLmxpbmVDb3VudCgpIDwgMjAwMCkgeyAvLyBUaGlzIGlzIHRvbyBleHBlbnNpdmUgb24gYmlnIGRvY3VtZW50cy4KCQkJICBmb3IgKHZhciBjdXJzb3IgPSBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnkpOyBjdXJzb3IuZmluZE5leHQoKTspIHsKCQkJCS8vT25seSBhcHBseSBtYXRjaGhpZ2hsaWdodCB0byB0aGUgbWF0Y2hlcyBvdGhlciB0aGFuIHRoZSBvbmUgYWN0dWFsbHkgc2VsZWN0ZWQKCQkJCWlmIChjdXJzb3IuZnJvbSgpLmxpbmUgIT09IGNtLmdldEN1cnNvcih0cnVlKS5saW5lIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5mcm9tKCkuY2ggIT09IGNtLmdldEN1cnNvcih0cnVlKS5jaCkKCQkJCQlzdGF0ZS5tYXJrZWQucHVzaChjbS5tYXJrVGV4dChjdXJzb3IuZnJvbSgpLCBjdXJzb3IudG8oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGNsYXNzTmFtZX0pKTsKCQkJICB9CgkJCX0KCQkgIH0pOwoJfQogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oIm1hdGNoSGlnaGxpZ2h0IiwgZnVuY3Rpb24oY2xhc3NOYW1lLCBtaW5DaGFycykgewogICAgbWFya0RvY3VtZW50KHRoaXMsIGNsYXNzTmFtZSwgbWluQ2hhcnMpOwogIH0pOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/matchbrackets.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIHZhciBtYXRjaGluZyA9IHsiKCI6ICIpPiIsICIpIjogIig8IiwgIlsiOiAiXT4iLCAiXSI6ICJbPCIsICJ7IjogIn0+IiwgIn0iOiAiezwifTsKICBmdW5jdGlvbiBmaW5kTWF0Y2hpbmdCcmFja2V0KGNtKSB7CiAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCksIGxpbmUgPSBjbS5nZXRMaW5lSGFuZGxlKGN1ci5saW5lKSwgcG9zID0gY3VyLmNoIC0gMTsKICAgIHZhciBtYXRjaCA9IChwb3MgPj0gMCAmJiBtYXRjaGluZ1tsaW5lLnRleHQuY2hhckF0KHBvcyldKSB8fCBtYXRjaGluZ1tsaW5lLnRleHQuY2hhckF0KCsrcG9zKV07CiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDsKICAgIHZhciBmb3J3YXJkID0gbWF0Y2guY2hhckF0KDEpID09ICI+IiwgZCA9IGZvcndhcmQgPyAxIDogLTE7CiAgICB2YXIgc3R5bGUgPSBjbS5nZXRUb2tlbkF0KHtsaW5lOiBjdXIubGluZSwgY2g6IHBvcyArIDF9KS50eXBlOwoKICAgIHZhciBzdGFjayA9IFtsaW5lLnRleHQuY2hhckF0KHBvcyldLCByZSA9IC9bKCl7fVtcXV0vOwogICAgZnVuY3Rpb24gc2NhbihsaW5lLCBsaW5lTm8sIHN0YXJ0KSB7CiAgICAgIGlmICghbGluZS50ZXh0KSByZXR1cm47CiAgICAgIHZhciBwb3MgPSBmb3J3YXJkID8gMCA6IGxpbmUudGV4dC5sZW5ndGggLSAxLCBlbmQgPSBmb3J3YXJkID8gbGluZS50ZXh0Lmxlbmd0aCA6IC0xOwogICAgICBpZiAoc3RhcnQgIT0gbnVsbCkgcG9zID0gc3RhcnQgKyBkOwogICAgICBmb3IgKDsgcG9zICE9IGVuZDsgcG9zICs9IGQpIHsKICAgICAgICB2YXIgY2ggPSBsaW5lLnRleHQuY2hhckF0KHBvcyk7CiAgICAgICAgaWYgKHJlLnRlc3QoY2gpICYmIGNtLmdldFRva2VuQXQoe2xpbmU6IGxpbmVObywgY2g6IHBvcyArIDF9KS50eXBlID09IHN0eWxlKSB7CiAgICAgICAgICB2YXIgbWF0Y2ggPSBtYXRjaGluZ1tjaF07CiAgICAgICAgICBpZiAobWF0Y2guY2hhckF0KDEpID09ICI+IiA9PSBmb3J3YXJkKSBzdGFjay5wdXNoKGNoKTsKICAgICAgICAgIGVsc2UgaWYgKHN0YWNrLnBvcCgpICE9IG1hdGNoLmNoYXJBdCgwKSkgcmV0dXJuIHtwb3M6IHBvcywgbWF0Y2g6IGZhbHNlfTsKICAgICAgICAgIGVsc2UgaWYgKCFzdGFjay5sZW5ndGgpIHJldHVybiB7cG9zOiBwb3MsIG1hdGNoOiB0cnVlfTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIGkgPSBjdXIubGluZSwgZm91bmQsIGUgPSBmb3J3YXJkID8gTWF0aC5taW4oaSArIDEwMCwgY20ubGluZUNvdW50KCkpIDogTWF0aC5tYXgoLTEsIGkgLSAxMDApOyBpICE9IGU7IGkrPWQpIHsKICAgICAgaWYgKGkgPT0gY3VyLmxpbmUpIGZvdW5kID0gc2NhbihsaW5lLCBpLCBwb3MpOwogICAgICBlbHNlIGZvdW5kID0gc2NhbihjbS5nZXRMaW5lSGFuZGxlKGkpLCBpKTsKICAgICAgaWYgKGZvdW5kKSBicmVhazsKICAgIH0KICAgIHJldHVybiB7ZnJvbToge2xpbmU6IGN1ci5saW5lLCBjaDogcG9zfSwgdG86IGZvdW5kICYmIHtsaW5lOiBpLCBjaDogZm91bmQucG9zfSwgbWF0Y2g6IGZvdW5kICYmIGZvdW5kLm1hdGNofTsKICB9CgogIGZ1bmN0aW9uIG1hdGNoQnJhY2tldHMoY20sIGF1dG9jbGVhcikgewogICAgdmFyIGZvdW5kID0gZmluZE1hdGNoaW5nQnJhY2tldChjbSk7CiAgICBpZiAoIWZvdW5kKSByZXR1cm47CiAgICB2YXIgc3R5bGUgPSBmb3VuZC5tYXRjaCA/ICJDb2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCIgOiAiQ29kZU1pcnJvci1ub25tYXRjaGluZ2JyYWNrZXQiOwogICAgdmFyIG9uZSA9IGNtLm1hcmtUZXh0KGZvdW5kLmZyb20sIHtsaW5lOiBmb3VuZC5mcm9tLmxpbmUsIGNoOiBmb3VuZC5mcm9tLmNoICsgMX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogc3R5bGV9KTsKICAgIHZhciB0d28gPSBmb3VuZC50byAmJiBjbS5tYXJrVGV4dChmb3VuZC50bywge2xpbmU6IGZvdW5kLnRvLmxpbmUsIGNoOiBmb3VuZC50by5jaCArIDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IHN0eWxlfSk7CiAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbigpIHsKICAgICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgeyBvbmUuY2xlYXIoKTsgdHdvICYmIHR3by5jbGVhcigpOyB9KTsKICAgIH07CiAgICBpZiAoYXV0b2NsZWFyKSBzZXRUaW1lb3V0KGNsZWFyLCA4MDApOwogICAgZWxzZSByZXR1cm4gY2xlYXI7CiAgfQoKICB2YXIgY3VycmVudGx5SGlnaGxpZ2h0ZWQgPSBudWxsOwogIGZ1bmN0aW9uIGRvTWF0Y2hCcmFja2V0cyhjbSkgewogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBpZiAoY3VycmVudGx5SGlnaGxpZ2h0ZWQpIHtjdXJyZW50bHlIaWdobGlnaHRlZCgpOyBjdXJyZW50bHlIaWdobGlnaHRlZCA9IG51bGw7fQogICAgICBpZiAoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIGN1cnJlbnRseUhpZ2hsaWdodGVkID0gbWF0Y2hCcmFja2V0cyhjbSwgZmFsc2UpOwogICAgfSk7CiAgfQoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigibWF0Y2hCcmFja2V0cyIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsKSB7CiAgICBpZiAodmFsKSBjbS5vbigiY3Vyc29yQWN0aXZpdHkiLCBkb01hdGNoQnJhY2tldHMpOwogICAgZWxzZSBjbS5vZmYoImN1cnNvckFjdGl2aXR5IiwgZG9NYXRjaEJyYWNrZXRzKTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oIm1hdGNoQnJhY2tldHMiLCBmdW5jdGlvbigpIHttYXRjaEJyYWNrZXRzKHRoaXMsIHRydWUpO30pOwogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJmaW5kTWF0Y2hpbmdCcmFja2V0IiwgZnVuY3Rpb24oKXtyZXR1cm4gZmluZE1hdGNoaW5nQnJhY2tldCh0aGlzKTt9KTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/multiplex.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5tdWx0aXBsZXhpbmdNb2RlID0gZnVuY3Rpb24ob3V0ZXIgLyosIG90aGVycyAqLykgewogIC8vIE90aGVycyBzaG91bGQgYmUge29wZW4sIGNsb3NlLCBtb2RlIFssIGRlbGltU3R5bGVdfSBvYmplY3RzCiAgdmFyIG90aGVycyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgdmFyIG5fb3RoZXJzID0gb3RoZXJzLmxlbmd0aDsKCiAgZnVuY3Rpb24gaW5kZXhPZihzdHJpbmcsIHBhdHRlcm4sIGZyb20pIHsKICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgcmV0dXJuIHN0cmluZy5pbmRleE9mKHBhdHRlcm4sIGZyb20pOwogICAgdmFyIG0gPSBwYXR0ZXJuLmV4ZWMoZnJvbSA/IHN0cmluZy5zbGljZShmcm9tKSA6IHN0cmluZyk7CiAgICByZXR1cm4gbSA/IG0uaW5kZXggKyBmcm9tIDogLTE7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgb3V0ZXI6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShvdXRlciksCiAgICAgICAgaW5uZXJBY3RpdmU6IG51bGwsCiAgICAgICAgaW5uZXI6IG51bGwKICAgICAgfTsKICAgIH0sCgogICAgY29weVN0YXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICByZXR1cm4gewogICAgICAgIG91dGVyOiBDb2RlTWlycm9yLmNvcHlTdGF0ZShvdXRlciwgc3RhdGUub3V0ZXIpLAogICAgICAgIGlubmVyQWN0aXZlOiBzdGF0ZS5pbm5lckFjdGl2ZSwKICAgICAgICBpbm5lcjogc3RhdGUuaW5uZXJBY3RpdmUgJiYgQ29kZU1pcnJvci5jb3B5U3RhdGUoc3RhdGUuaW5uZXJBY3RpdmUubW9kZSwgc3RhdGUuaW5uZXIpCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmICghc3RhdGUuaW5uZXJBY3RpdmUpIHsKICAgICAgICB2YXIgY3V0T2ZmID0gSW5maW5pdHksIG9sZENvbnRlbnQgPSBzdHJlYW0uc3RyaW5nOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbl9vdGhlcnM7ICsraSkgewogICAgICAgICAgdmFyIG90aGVyID0gb3RoZXJzW2ldOwogICAgICAgICAgdmFyIGZvdW5kID0gaW5kZXhPZihvbGRDb250ZW50LCBvdGhlci5vcGVuLCBzdHJlYW0ucG9zKTsKICAgICAgICAgIGlmIChmb3VuZCA9PSBzdHJlYW0ucG9zKSB7CiAgICAgICAgICAgIHN0cmVhbS5tYXRjaChvdGhlci5vcGVuKTsKICAgICAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBvdGhlcjsKICAgICAgICAgICAgc3RhdGUuaW5uZXIgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUob3RoZXIubW9kZSwgb3V0ZXIuaW5kZW50ID8gb3V0ZXIuaW5kZW50KHN0YXRlLm91dGVyLCAiIikgOiAwKTsKICAgICAgICAgICAgcmV0dXJuIG90aGVyLmRlbGltU3R5bGU7CiAgICAgICAgICB9IGVsc2UgaWYgKGZvdW5kICE9IC0xICYmIGZvdW5kIDwgY3V0T2ZmKSB7CiAgICAgICAgICAgIGN1dE9mZiA9IGZvdW5kOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY3V0T2ZmICE9IEluZmluaXR5KSBzdHJlYW0uc3RyaW5nID0gb2xkQ29udGVudC5zbGljZSgwLCBjdXRPZmYpOwogICAgICAgIHZhciBvdXRlclRva2VuID0gb3V0ZXIudG9rZW4oc3RyZWFtLCBzdGF0ZS5vdXRlcik7CiAgICAgICAgaWYgKGN1dE9mZiAhPSBJbmZpbml0eSkgc3RyZWFtLnN0cmluZyA9IG9sZENvbnRlbnQ7CiAgICAgICAgcmV0dXJuIG91dGVyVG9rZW47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGN1cklubmVyID0gc3RhdGUuaW5uZXJBY3RpdmUsIG9sZENvbnRlbnQgPSBzdHJlYW0uc3RyaW5nOwogICAgICAgIHZhciBmb3VuZCA9IGluZGV4T2Yob2xkQ29udGVudCwgY3VySW5uZXIuY2xvc2UsIHN0cmVhbS5wb3MpOwogICAgICAgIGlmIChmb3VuZCA9PSBzdHJlYW0ucG9zKSB7CiAgICAgICAgICBzdHJlYW0ubWF0Y2goY3VySW5uZXIuY2xvc2UpOwogICAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBzdGF0ZS5pbm5lciA9IG51bGw7CiAgICAgICAgICByZXR1cm4gY3VySW5uZXIuZGVsaW1TdHlsZTsKICAgICAgICB9CiAgICAgICAgaWYgKGZvdW5kID4gLTEpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50LnNsaWNlKDAsIGZvdW5kKTsKICAgICAgICB2YXIgaW5uZXJUb2tlbiA9IGN1cklubmVyLm1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5pbm5lcik7CiAgICAgICAgaWYgKGZvdW5kID4gLTEpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50OwogICAgICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpLCBmb3VuZCA9IGN1ci5pbmRleE9mKGN1cklubmVyLmNsb3NlKTsKICAgICAgICBpZiAoZm91bmQgPiAtMSkgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoIC0gZm91bmQpOwogICAgICAgIHJldHVybiBpbm5lclRva2VuOwogICAgICB9CiAgICB9LAogICAgCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIG1vZGUgPSBzdGF0ZS5pbm5lckFjdGl2ZSA/IHN0YXRlLmlubmVyQWN0aXZlLm1vZGUgOiBvdXRlcjsKICAgICAgaWYgKCFtb2RlLmluZGVudCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgcmV0dXJuIG1vZGUuaW5kZW50KHN0YXRlLmlubmVyQWN0aXZlID8gc3RhdGUuaW5uZXIgOiBzdGF0ZS5vdXRlciwgdGV4dEFmdGVyKTsKICAgIH0sCgogICAgYmxhbmtMaW5lOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICB2YXIgbW9kZSA9IHN0YXRlLmlubmVyQWN0aXZlID8gc3RhdGUuaW5uZXJBY3RpdmUubW9kZSA6IG91dGVyOwogICAgICBpZiAobW9kZS5ibGFua0xpbmUpIHsKICAgICAgICBtb2RlLmJsYW5rTGluZShzdGF0ZS5pbm5lckFjdGl2ZSA/IHN0YXRlLmlubmVyIDogc3RhdGUub3V0ZXIpOwogICAgICB9CiAgICAgIGlmICghc3RhdGUuaW5uZXJBY3RpdmUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5fb3RoZXJzOyArK2kpIHsKICAgICAgICAgIHZhciBvdGhlciA9IG90aGVyc1tpXTsKICAgICAgICAgIGlmIChvdGhlci5vcGVuID09PSAiXG4iKSB7CiAgICAgICAgICAgIHN0YXRlLmlubmVyQWN0aXZlID0gb3RoZXI7CiAgICAgICAgICAgIHN0YXRlLmlubmVyID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKG90aGVyLm1vZGUsIG1vZGUuaW5kZW50ID8gbW9kZS5pbmRlbnQoc3RhdGUub3V0ZXIsICIiKSA6IDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChtb2RlLmNsb3NlID09PSAiXG4iKSB7CiAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBzdGF0ZS5pbm5lciA9IG51bGw7CiAgICAgIH0KICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogb3V0ZXIuZWxlY3RyaWNDaGFycywKCiAgICBpbm5lck1vZGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5pbm5lciA/IHtzdGF0ZTogc3RhdGUuaW5uZXIsIG1vZGU6IHN0YXRlLmlubmVyQWN0aXZlLm1vZGV9IDoge3N0YXRlOiBzdGF0ZS5vdXRlciwgbW9kZTogb3V0ZXJ9OwogICAgfQogIH07Cn07Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/overlay.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gVXRpbGl0eSBmdW5jdGlvbiB0aGF0IGFsbG93cyBtb2RlcyB0byBiZSBjb21iaW5lZC4gVGhlIG1vZGUgZ2l2ZW4KLy8gYXMgdGhlIGJhc2UgYXJndW1lbnQgdGFrZXMgY2FyZSBvZiBtb3N0IG9mIHRoZSBub3JtYWwgbW9kZQovLyBmdW5jdGlvbmFsaXR5LCBidXQgYSBzZWNvbmQgKHR5cGljYWxseSBzaW1wbGUpIG1vZGUgaXMgdXNlZCwgd2hpY2gKLy8gY2FuIG92ZXJyaWRlIHRoZSBzdHlsZSBvZiB0ZXh0LiBCb3RoIG1vZGVzIGdldCB0byBwYXJzZSBhbGwgb2YgdGhlCi8vIHRleHQsIGJ1dCB3aGVuIGJvdGggYXNzaWduIGEgbm9uLW51bGwgc3R5bGUgdG8gYSBwaWVjZSBvZiBjb2RlLCB0aGUKLy8gb3ZlcmxheSB3aW5zLCB1bmxlc3MgdGhlIGNvbWJpbmUgYXJndW1lbnQgd2FzIHRydWUsIGluIHdoaWNoIGNhc2UKLy8gdGhlIHN0eWxlcyBhcmUgY29tYmluZWQuCgovLyBvdmVybGF5UGFyc2VyIGlzIHRoZSBvbGQsIGRlcHJlY2F0ZWQgbmFtZQpDb2RlTWlycm9yLm92ZXJsYXlNb2RlID0gQ29kZU1pcnJvci5vdmVybGF5UGFyc2VyID0gZnVuY3Rpb24oYmFzZSwgb3ZlcmxheSwgY29tYmluZSkgewogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBiYXNlOiBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoYmFzZSksCiAgICAgICAgb3ZlcmxheTogQ29kZU1pcnJvci5zdGFydFN0YXRlKG92ZXJsYXkpLAogICAgICAgIGJhc2VQb3M6IDAsIGJhc2VDdXI6IG51bGwsCiAgICAgICAgb3ZlcmxheVBvczogMCwgb3ZlcmxheUN1cjogbnVsbAogICAgICB9OwogICAgfSwKICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBiYXNlOiBDb2RlTWlycm9yLmNvcHlTdGF0ZShiYXNlLCBzdGF0ZS5iYXNlKSwKICAgICAgICBvdmVybGF5OiBDb2RlTWlycm9yLmNvcHlTdGF0ZShvdmVybGF5LCBzdGF0ZS5vdmVybGF5KSwKICAgICAgICBiYXNlUG9zOiBzdGF0ZS5iYXNlUG9zLCBiYXNlQ3VyOiBudWxsLAogICAgICAgIG92ZXJsYXlQb3M6IHN0YXRlLm92ZXJsYXlQb3MsIG92ZXJsYXlDdXI6IG51bGwKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zdGFydCA9PSBzdGF0ZS5iYXNlUG9zKSB7CiAgICAgICAgc3RhdGUuYmFzZUN1ciA9IGJhc2UudG9rZW4oc3RyZWFtLCBzdGF0ZS5iYXNlKTsKICAgICAgICBzdGF0ZS5iYXNlUG9zID0gc3RyZWFtLnBvczsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLnN0YXJ0ID09IHN0YXRlLm92ZXJsYXlQb3MpIHsKICAgICAgICBzdHJlYW0ucG9zID0gc3RyZWFtLnN0YXJ0OwogICAgICAgIHN0YXRlLm92ZXJsYXlDdXIgPSBvdmVybGF5LnRva2VuKHN0cmVhbSwgc3RhdGUub3ZlcmxheSk7CiAgICAgICAgc3RhdGUub3ZlcmxheVBvcyA9IHN0cmVhbS5wb3M7CiAgICAgIH0KICAgICAgc3RyZWFtLnBvcyA9IE1hdGgubWluKHN0YXRlLmJhc2VQb3MsIHN0YXRlLm92ZXJsYXlQb3MpOwogICAgICBpZiAoc3RyZWFtLmVvbCgpKSBzdGF0ZS5iYXNlUG9zID0gc3RhdGUub3ZlcmxheVBvcyA9IDA7CgogICAgICBpZiAoc3RhdGUub3ZlcmxheUN1ciA9PSBudWxsKSByZXR1cm4gc3RhdGUuYmFzZUN1cjsKICAgICAgaWYgKHN0YXRlLmJhc2VDdXIgIT0gbnVsbCAmJiBjb21iaW5lKSByZXR1cm4gc3RhdGUuYmFzZUN1ciArICIgIiArIHN0YXRlLm92ZXJsYXlDdXI7CiAgICAgIGVsc2UgcmV0dXJuIHN0YXRlLm92ZXJsYXlDdXI7CiAgICB9LAogICAgCiAgICBpbmRlbnQ6IGJhc2UuaW5kZW50ICYmIGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgcmV0dXJuIGJhc2UuaW5kZW50KHN0YXRlLmJhc2UsIHRleHRBZnRlcik7CiAgICB9LAogICAgZWxlY3RyaWNDaGFyczogYmFzZS5lbGVjdHJpY0NoYXJzLAoKICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsgcmV0dXJuIHtzdGF0ZTogc3RhdGUuYmFzZSwgbW9kZTogYmFzZX07IH0sCiAgICAKICAgIGJsYW5rTGluZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgaWYgKGJhc2UuYmxhbmtMaW5lKSBiYXNlLmJsYW5rTGluZShzdGF0ZS5iYXNlKTsKICAgICAgaWYgKG92ZXJsYXkuYmxhbmtMaW5lKSBvdmVybGF5LmJsYW5rTGluZShzdGF0ZS5vdmVybGF5KTsKICAgIH0KICB9Owp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/pig-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZikgewogICAgZm9yICh2YXIgaSA9IDAsIGUgPSBhcnIubGVuZ3RoOyBpIDwgZTsgKytpKSBmKGFycltpXSk7CiAgfQogIAogIGZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYXJyLCBpdGVtKSB7CiAgICBpZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CiAgICAgIHZhciBpID0gYXJyLmxlbmd0aDsKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gYXJyLmluZGV4T2YoaXRlbSkgIT0gLTE7CiAgfQoKICBmdW5jdGlvbiBzY3JpcHRIaW50KGVkaXRvciwgX2tleXdvcmRzLCBnZXRUb2tlbikgewogICAgLy8gRmluZCB0aGUgdG9rZW4gYXQgdGhlIGN1cnNvcgogICAgdmFyIGN1ciA9IGVkaXRvci5nZXRDdXJzb3IoKSwgdG9rZW4gPSBnZXRUb2tlbihlZGl0b3IsIGN1ciksIHRwcm9wID0gdG9rZW47CiAgICAvLyBJZiBpdCdzIG5vdCBhICd3b3JkLXN0eWxlJyB0b2tlbiwgaWdub3JlIHRoZSB0b2tlbi4KCiAgICBpZiAoIS9eW1x3JF9dKiQvLnRlc3QodG9rZW4uc3RyaW5nKSkgewogICAgICAgIHRva2VuID0gdHByb3AgPSB7c3RhcnQ6IGN1ci5jaCwgZW5kOiBjdXIuY2gsIHN0cmluZzogIiIsIHN0YXRlOiB0b2tlbi5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogdG9rZW4uc3RyaW5nID09ICI6IiA/ICJwaWctdHlwZSIgOiBudWxsfTsKICAgIH0KICAgICAgCiAgICBpZiAoIWNvbnRleHQpIHZhciBjb250ZXh0ID0gW107CiAgICBjb250ZXh0LnB1c2godHByb3ApOwogICAgCiAgICB2YXIgY29tcGxldGlvbkxpc3QgPSBnZXRDb21wbGV0aW9ucyh0b2tlbiwgY29udGV4dCk7IAogICAgY29tcGxldGlvbkxpc3QgPSBjb21wbGV0aW9uTGlzdC5zb3J0KCk7CiAgICAvL3ByZXZlbnQgYXV0b2NvbXBsZXRlIGZvciBsYXN0IHdvcmQsIGluc3RlYWQgc2hvdyBkcm9wZG93biB3aXRoIG9uZSB3b3JkCiAgICBpZihjb21wbGV0aW9uTGlzdC5sZW5ndGggPT0gMSkgewogICAgICBjb21wbGV0aW9uTGlzdC5wdXNoKCIgIik7CiAgICB9CgogICAgcmV0dXJuIHtsaXN0OiBjb21wbGV0aW9uTGlzdCwKICAgICAgICAgICAgICBmcm9tOiB7bGluZTogY3VyLmxpbmUsIGNoOiB0b2tlbi5zdGFydH0sCiAgICAgICAgICAgICAgdG86IHtsaW5lOiBjdXIubGluZSwgY2g6IHRva2VuLmVuZH19OwogIH0KICAKICBDb2RlTWlycm9yLnBpZ0hpbnQgPSBmdW5jdGlvbihlZGl0b3IpIHsKICAgIHJldHVybiBzY3JpcHRIaW50KGVkaXRvciwgcGlnS2V5d29yZHNVLCBmdW5jdGlvbiAoZSwgY3VyKSB7cmV0dXJuIGUuZ2V0VG9rZW5BdChjdXIpO30pOwogIH07CiAKICB2YXIgcGlnS2V5d29yZHMgPSAiVk9JRCBJTVBPUlQgUkVUVVJOUyBERUZJTkUgTE9BRCBGSUxURVIgRk9SRUFDSCBPUkRFUiBDVUJFIERJU1RJTkNUIENPR1JPVVAgIgogICsgIkpPSU4gQ1JPU1MgVU5JT04gU1BMSVQgSU5UTyBJRiBPVEhFUldJU0UgQUxMIEFTIEJZIFVTSU5HIElOTkVSIE9VVEVSIE9OU0NIRU1BIFBBUkFMTEVMICIKICArICJQQVJUSVRJT04gR1JPVVAgQU5EIE9SIE5PVCBHRU5FUkFURSBGTEFUVEVOIEFTQyBERVNDIElTIFNUUkVBTSBUSFJPVUdIIFNUT1JFIE1BUFJFRFVDRSAiCiAgKyAiU0hJUCBDQUNIRSBJTlBVVCBPVVRQVVQgU1RERVJST1IgU1RESU4gU1RET1VUIExJTUlUIFNBTVBMRSBMRUZUIFJJR0hUIEZVTEwgRVEgR1QgTFQgR1RFIExURSAiIAogICsgIk5FUSBNQVRDSEVTIFRSVUUgRkFMU0UiOwogIHZhciBwaWdLZXl3b3Jkc1UgPSBwaWdLZXl3b3Jkcy5zcGxpdCgiICIpOwogIHZhciBwaWdLZXl3b3Jkc0wgPSBwaWdLZXl3b3Jkcy50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CiAgCiAgdmFyIHBpZ1R5cGVzID0gIkJPT0xFQU4gSU5UIExPTkcgRkxPQVQgRE9VQkxFIENIQVJBUlJBWSBCWVRFQVJSQVkgQkFHIFRVUExFIE1BUCI7CiAgdmFyIHBpZ1R5cGVzVSA9IHBpZ1R5cGVzLnNwbGl0KCIgIik7CiAgdmFyIHBpZ1R5cGVzTCA9IHBpZ1R5cGVzLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiAiKTsKICAKICB2YXIgcGlnQnVpbHRpbnMgPSAiQUJTIEFDT1MgQVJJVFkgQVNJTiBBVEFOIEFWRyBCQUdTSVpFIEJJTlNUT1JBR0UgQkxPT00gQlVJTERCTE9PTSBDQlJUIENFSUwgIiAKICArICJDT05DQVQgQ09SIENPUyBDT1NIIENPVU5UIENPVU5UX1NUQVIgQ09WIENPTlNUQU5UU0laRSBDVUJFRElNRU5TSU9OUyBESUZGIERJU1RJTkNUIERPVUJMRUFCUyAiCiAgKyAiRE9VQkxFQVZHIERPVUJMRUJBU0UgRE9VQkxFTUFYIERPVUJMRU1JTiBET1VCTEVST1VORCBET1VCTEVTVU0gRVhQIEZMT09SIEZMT0FUQUJTIEZMT0FUQVZHICIKICArICJGTE9BVE1BWCBGTE9BVE1JTiBGTE9BVFJPVU5EIEZMT0FUU1VNIEdFTkVSSUNJTlZPS0VSIElOREVYT0YgSU5UQUJTIElOVEFWRyBJTlRNQVggSU5UTUlOICIKICArICJJTlRTVU0gSU5WT0tFRk9SRE9VQkxFIElOVk9LRUZPUkZMT0FUIElOVk9LRUZPUklOVCBJTlZPS0VGT1JMT05HIElOVk9LRUZPUlNUUklORyBJTlZPS0VSICIKICArICJJU0VNUFRZIEpTT05MT0FERVIgSlNPTk1FVEFEQVRBIEpTT05TVE9SQUdFIExBU1RfSU5ERVhfT0YgTENGSVJTVCBMT0cgTE9HMTAgTE9XRVIgTE9OR0FCUyAiCiAgKyAiTE9OR0FWRyBMT05HTUFYIExPTkdNSU4gTE9OR1NVTSBNQVggTUlOIE1BUFNJWkUgTU9OSVRPUkVEVURGIE5PTkRFVEVSTUlOSVNUSUMgT1VUUFVUU0NIRU1BICAiCiAgKyAiUElHU1RPUkFHRSBQSUdTVFJFQU1JTkcgUkFORE9NIFJFR0VYX0VYVFJBQ1QgUkVHRVhfRVhUUkFDVF9BTEwgUkVQTEFDRSBST1VORCBTSU4gU0lOSCBTSVpFICIKICArICJTUVJUIFNUUlNQTElUIFNVQlNUUklORyBTVU0gU1RSSU5HQ09OQ0FUIFNUUklOR01BWCBTVFJJTkdNSU4gU1RSSU5HU0laRSBUQU4gVEFOSCBUT0JBRyAiCiAgKyAiVE9LRU5JWkUgVE9NQVAgVE9QIFRPVFVQTEUgVFJJTSBURVhUTE9BREVSIFRVUExFU0laRSBVQ0ZJUlNUIFVQUEVSIFVURjhTVE9SQUdFQ09OVkVSVEVSIjsgIAogIHZhciBwaWdCdWlsdGluc1UgPSBwaWdCdWlsdGlucy5zcGxpdCgiICIpLmpvaW4oIigpICIpLnNwbGl0KCIgIik7ICAKICB2YXIgcGlnQnVpbHRpbnNMID0gcGlnQnVpbHRpbnMudG9Mb3dlckNhc2UoKS5zcGxpdCgiICIpLmpvaW4oIigpICIpLnNwbGl0KCIgIik7ICAgCiAgdmFyIHBpZ0J1aWx0aW5zQyA9ICgiQmFnU2l6ZSBCaW5TdG9yYWdlIEJsb29tIEJ1aWxkQmxvb20gQ29uc3RhbnRTaXplIEN1YmVEaW1lbnNpb25zIERvdWJsZUFicyAiCiAgKyAiRG91YmxlQXZnIERvdWJsZUJhc2UgRG91YmxlTWF4IERvdWJsZU1pbiBEb3VibGVSb3VuZCBEb3VibGVTdW0gRmxvYXRBYnMgRmxvYXRBdmcgRmxvYXRNYXggIgogICsgIkZsb2F0TWluIEZsb2F0Um91bmQgRmxvYXRTdW0gR2VuZXJpY0ludm9rZXIgSW50QWJzIEludEF2ZyBJbnRNYXggSW50TWluIEludFN1bSAiCiAgKyAiSW52b2tlRm9yRG91YmxlIEludm9rZUZvckZsb2F0IEludm9rZUZvckludCBJbnZva2VGb3JMb25nIEludm9rZUZvclN0cmluZyBJbnZva2VyICIKICArICJJc0VtcHR5IEpzb25Mb2FkZXIgSnNvbk1ldGFkYXRhIEpzb25TdG9yYWdlIExvbmdBYnMgTG9uZ0F2ZyBMb25nTWF4IExvbmdNaW4gTG9uZ1N1bSBNYXBTaXplICIKICArICJNb25pdG9yZWRVREYgTm9uZGV0ZXJtaW5pc3RpYyBPdXRwdXRTY2hlbWEgUGlnU3RvcmFnZSBQaWdTdHJlYW1pbmcgU3RyaW5nQ29uY2F0IFN0cmluZ01heCAiCiAgKyAiU3RyaW5nTWluIFN0cmluZ1NpemUgVGV4dExvYWRlciBUdXBsZVNpemUgVXRmOFN0b3JhZ2VDb252ZXJ0ZXIiKS5zcGxpdCgiICIpLmpvaW4oIigpICIpLnNwbGl0KCIgIik7CiAgICAgICAgICAgICAgICAgICAgCiAgZnVuY3Rpb24gZ2V0Q29tcGxldGlvbnModG9rZW4sIGNvbnRleHQpIHsKICAgIHZhciBmb3VuZCA9IFtdLCBzdGFydCA9IHRva2VuLnN0cmluZzsKICAgIGZ1bmN0aW9uIG1heWJlQWRkKHN0cikgewogICAgICBpZiAoc3RyLmluZGV4T2Yoc3RhcnQpID09IDAgJiYgIWFycmF5Q29udGFpbnMoZm91bmQsIHN0cikpIGZvdW5kLnB1c2goc3RyKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZ2F0aGVyQ29tcGxldGlvbnMob2JqKSB7CiAgICAgIGlmKG9iaiA9PSAiOiIpIHsKICAgICAgICBmb3JFYWNoKHBpZ1R5cGVzTCwgbWF5YmVBZGQpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGZvckVhY2gocGlnQnVpbHRpbnNVLCBtYXliZUFkZCk7CiAgICAgICAgZm9yRWFjaChwaWdCdWlsdGluc0wsIG1heWJlQWRkKTsKICAgICAgICBmb3JFYWNoKHBpZ0J1aWx0aW5zQywgbWF5YmVBZGQpOwogICAgICAgIGZvckVhY2gocGlnVHlwZXNVLCBtYXliZUFkZCk7CiAgICAgICAgZm9yRWFjaChwaWdUeXBlc0wsIG1heWJlQWRkKTsKICAgICAgICBmb3JFYWNoKHBpZ0tleXdvcmRzVSwgbWF5YmVBZGQpOwogICAgICAgIGZvckVhY2gocGlnS2V5d29yZHNMLCBtYXliZUFkZCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoY29udGV4dCkgewogICAgICAvLyBJZiB0aGlzIGlzIGEgcHJvcGVydHksIHNlZSBpZiBpdCBiZWxvbmdzIHRvIHNvbWUgb2JqZWN0IHdlIGNhbgogICAgICAvLyBmaW5kIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LgogICAgICB2YXIgb2JqID0gY29udGV4dC5wb3AoKSwgYmFzZTsKCiAgICAgIGlmIChvYmoudHlwZSA9PSAidmFyaWFibGUiKSAKICAgICAgICAgIGJhc2UgPSBvYmouc3RyaW5nOwogICAgICBlbHNlIGlmKG9iai50eXBlID09ICJ2YXJpYWJsZS0zIikKICAgICAgICAgIGJhc2UgPSAiOiIgKyBvYmouc3RyaW5nOwogICAgICAgIAogICAgICB3aGlsZSAoYmFzZSAhPSBudWxsICYmIGNvbnRleHQubGVuZ3RoKQogICAgICAgIGJhc2UgPSBiYXNlW2NvbnRleHQucG9wKCkuc3RyaW5nXTsKICAgICAgaWYgKGJhc2UgIT0gbnVsbCkgZ2F0aGVyQ29tcGxldGlvbnMoYmFzZSk7CiAgICB9CiAgICByZXR1cm4gZm91bmQ7CiAgfQp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/runmode-standalone.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogSnVzdCBlbm91Z2ggb2YgQ29kZU1pcnJvciB0byBydW4gcnVuTW9kZSB1bmRlciBub2RlLmpzICovCgpmdW5jdGlvbiBzcGxpdExpbmVzKHN0cmluZyl7IHJldHVybiBzdHJpbmcuc3BsaXQoL1xyP1xufFxyLyk7IH07CgpmdW5jdGlvbiBTdHJpbmdTdHJlYW0oc3RyaW5nKSB7CiAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0ID0gMDsKICB0aGlzLnN0cmluZyA9IHN0cmluZzsKfQpTdHJpbmdTdHJlYW0ucHJvdG90eXBlID0gewogIGVvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID49IHRoaXMuc3RyaW5nLmxlbmd0aDt9LAogIHNvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID09IDA7fSwKICBwZWVrOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSB8fCBudWxsO30sCiAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wb3MgPCB0aGlzLnN0cmluZy5sZW5ndGgpCiAgICAgIHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MrKyk7CiAgfSwKICBlYXQ6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICB2YXIgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpOwogICAgaWYgKHR5cGVvZiBtYXRjaCA9PSAic3RyaW5nIikgdmFyIG9rID0gY2ggPT0gbWF0Y2g7CiAgICBlbHNlIHZhciBvayA9IGNoICYmIChtYXRjaC50ZXN0ID8gbWF0Y2gudGVzdChjaCkgOiBtYXRjaChjaCkpOwogICAgaWYgKG9rKSB7Kyt0aGlzLnBvczsgcmV0dXJuIGNoO30KICB9LAogIGVhdFdoaWxlOiBmdW5jdGlvbihtYXRjaCkgewogICAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7CiAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKXt9CiAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydDsKICB9LAogIGVhdFNwYWNlOiBmdW5jdGlvbigpIHsKICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgd2hpbGUgKC9bXHNcdTAwYTBdLy50ZXN0KHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykpKSArK3RoaXMucG9zOwogICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7CiAgfSwKICBza2lwVG9FbmQ6IGZ1bmN0aW9uKCkge3RoaXMucG9zID0gdGhpcy5zdHJpbmcubGVuZ3RoO30sCiAgc2tpcFRvOiBmdW5jdGlvbihjaCkgewogICAgdmFyIGZvdW5kID0gdGhpcy5zdHJpbmcuaW5kZXhPZihjaCwgdGhpcy5wb3MpOwogICAgaWYgKGZvdW5kID4gLTEpIHt0aGlzLnBvcyA9IGZvdW5kOyByZXR1cm4gdHJ1ZTt9CiAgfSwKICBiYWNrVXA6IGZ1bmN0aW9uKG4pIHt0aGlzLnBvcyAtPSBuO30sCiAgY29sdW1uOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5zdGFydDt9LAogIGluZGVudGF0aW9uOiBmdW5jdGlvbigpIHtyZXR1cm4gMDt9LAogIG1hdGNoOiBmdW5jdGlvbihwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgewogICAgICBmdW5jdGlvbiBjYXNlZChzdHIpIHtyZXR1cm4gY2FzZUluc2Vuc2l0aXZlID8gc3RyLnRvTG93ZXJDYXNlKCkgOiBzdHI7fQogICAgICBpZiAoY2FzZWQodGhpcy5zdHJpbmcpLmluZGV4T2YoY2FzZWQocGF0dGVybiksIHRoaXMucG9zKSA9PSB0aGlzLnBvcykgewogICAgICAgIGlmIChjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gcGF0dGVybi5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICB2YXIgbWF0Y2ggPSB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnBvcykubWF0Y2gocGF0dGVybik7CiAgICAgIGlmIChtYXRjaCAmJiBjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICByZXR1cm4gbWF0Y2g7CiAgICB9CiAgfSwKICBjdXJyZW50OiBmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLnBvcyk7fQp9OwpleHBvcnRzLlN0cmluZ1N0cmVhbSA9IFN0cmluZ1N0cmVhbTsKCmV4cG9ydHMuc3RhcnRTdGF0ZSA9IGZ1bmN0aW9uKG1vZGUsIGExLCBhMikgewogIHJldHVybiBtb2RlLnN0YXJ0U3RhdGUgPyBtb2RlLnN0YXJ0U3RhdGUoYTEsIGEyKSA6IHRydWU7Cn07Cgp2YXIgbW9kZXMgPSBleHBvcnRzLm1vZGVzID0ge30sIG1pbWVNb2RlcyA9IGV4cG9ydHMubWltZU1vZGVzID0ge307CmV4cG9ydHMuZGVmaW5lTW9kZSA9IGZ1bmN0aW9uKG5hbWUsIG1vZGUpIHsgbW9kZXNbbmFtZV0gPSBtb2RlOyB9OwpleHBvcnRzLmRlZmluZU1JTUUgPSBmdW5jdGlvbihtaW1lLCBzcGVjKSB7IG1pbWVNb2Rlc1ttaW1lXSA9IHNwZWM7IH07CmV4cG9ydHMuZ2V0TW9kZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIHNwZWMpIHsKICBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIgJiYgbWltZU1vZGVzLmhhc093blByb3BlcnR5KHNwZWMpKQogICAgc3BlYyA9IG1pbWVNb2Rlc1tzcGVjXTsKICBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIpCiAgICB2YXIgbW5hbWUgPSBzcGVjLCBjb25maWcgPSB7fTsKICBlbHNlIGlmIChzcGVjICE9IG51bGwpCiAgICB2YXIgbW5hbWUgPSBzcGVjLm5hbWUsIGNvbmZpZyA9IHNwZWM7CiAgdmFyIG1mYWN0b3J5ID0gbW9kZXNbbW5hbWVdOwogIGlmICghbWZhY3RvcnkpIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBtb2RlOiAiICsgc3BlYyk7CiAgcmV0dXJuIG1mYWN0b3J5KG9wdGlvbnMsIGNvbmZpZyB8fCB7fSk7Cn07CgpleHBvcnRzLnJ1bk1vZGUgPSBmdW5jdGlvbihzdHJpbmcsIG1vZGVzcGVjLCBjYWxsYmFjaykgewogIHZhciBtb2RlID0gZXhwb3J0cy5nZXRNb2RlKHtpbmRlbnRVbml0OiAyfSwgbW9kZXNwZWMpOwogIHZhciBsaW5lcyA9IHNwbGl0TGluZXMoc3RyaW5nKSwgc3RhdGUgPSBleHBvcnRzLnN0YXJ0U3RhdGUobW9kZSk7CiAgZm9yICh2YXIgaSA9IDAsIGUgPSBsaW5lcy5sZW5ndGg7IGkgPCBlOyArK2kpIHsKICAgIGlmIChpKSBjYWxsYmFjaygiXG4iKTsKICAgIHZhciBzdHJlYW0gPSBuZXcgZXhwb3J0cy5TdHJpbmdTdHJlYW0obGluZXNbaV0pOwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgdmFyIHN0eWxlID0gbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgICAgY2FsbGJhY2soc3RyZWFtLmN1cnJlbnQoKSwgc3R5bGUsIGksIHN0cmVhbS5zdGFydCk7CiAgICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7CiAgICB9CiAgfQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/runmode.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5ydW5Nb2RlID0gZnVuY3Rpb24oc3RyaW5nLCBtb2Rlc3BlYywgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShDb2RlTWlycm9yLmRlZmF1bHRzLCBtb2Rlc3BlYyk7CgogIGlmIChjYWxsYmFjay5ub2RlVHlwZSA9PSAxKSB7CiAgICB2YXIgdGFiU2l6ZSA9IChvcHRpb25zICYmIG9wdGlvbnMudGFiU2l6ZSkgfHwgQ29kZU1pcnJvci5kZWZhdWx0cy50YWJTaXplOwogICAgdmFyIG5vZGUgPSBjYWxsYmFjaywgY29sID0gMDsKICAgIG5vZGUuaW5uZXJIVE1MID0gIiI7CiAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQsIHN0eWxlKSB7CiAgICAgIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpOwogICAgICAgIGNvbCA9IDA7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBjb250ZW50ID0gIiI7CiAgICAgIC8vIHJlcGxhY2UgdGFicwogICAgICBmb3IgKHZhciBwb3MgPSAwOzspIHsKICAgICAgICB2YXIgaWR4ID0gdGV4dC5pbmRleE9mKCJcdCIsIHBvcyk7CiAgICAgICAgaWYgKGlkeCA9PSAtMSkgewogICAgICAgICAgY29udGVudCArPSB0ZXh0LnNsaWNlKHBvcyk7CiAgICAgICAgICBjb2wgKz0gdGV4dC5sZW5ndGggLSBwb3M7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29sICs9IGlkeCAtIHBvczsKICAgICAgICAgIGNvbnRlbnQgKz0gdGV4dC5zbGljZShwb3MsIGlkeCk7CiAgICAgICAgICB2YXIgc2l6ZSA9IHRhYlNpemUgLSBjb2wgJSB0YWJTaXplOwogICAgICAgICAgY29sICs9IHNpemU7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkgY29udGVudCArPSAiICI7CiAgICAgICAgICBwb3MgPSBpZHggKyAxOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHN0eWxlKSB7CiAgICAgICAgdmFyIHNwID0gbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikpOwogICAgICAgIHNwLmNsYXNzTmFtZSA9ICJjbS0iICsgc3R5bGUucmVwbGFjZSgvICsvZywgIiBjbS0iKTsKICAgICAgICBzcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KSk7CiAgICAgIH0KICAgIH07CiAgfQoKICB2YXIgbGluZXMgPSBDb2RlTWlycm9yLnNwbGl0TGluZXMoc3RyaW5nKSwgc3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUobW9kZSk7CiAgZm9yICh2YXIgaSA9IDAsIGUgPSBsaW5lcy5sZW5ndGg7IGkgPCBlOyArK2kpIHsKICAgIGlmIChpKSBjYWxsYmFjaygiXG4iKTsKICAgIHZhciBzdHJlYW0gPSBuZXcgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0obGluZXNbaV0pOwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgdmFyIHN0eWxlID0gbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgICAgY2FsbGJhY2soc3RyZWFtLmN1cnJlbnQoKSwgc3R5bGUsIGksIHN0cmVhbS5zdGFydCk7CiAgICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7CiAgICB9CiAgfQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/search.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gRGVmaW5lIHNlYXJjaCBjb21tYW5kcy4gRGVwZW5kcyBvbiBkaWFsb2cuanMgb3IgYW5vdGhlcgovLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgb3BlbkRpYWxvZyBtZXRob2QuCgovLyBSZXBsYWNlIHdvcmtzIGEgbGl0dGxlIG9kZGx5IC0tIGl0IHdpbGwgZG8gdGhlIHJlcGxhY2Ugb24gdGhlIG5leHQKLy8gQ3RybC1HIChvciB3aGF0ZXZlciBpcyBib3VuZCB0byBmaW5kTmV4dCkgcHJlc3MuIFlvdSBwcmV2ZW50IGEKLy8gcmVwbGFjZSBieSBtYWtpbmcgc3VyZSB0aGUgbWF0Y2ggaXMgbm8gbG9uZ2VyIHNlbGVjdGVkIHdoZW4gaGl0dGluZwovLyBDdHJsLUcuCgooZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gU2VhcmNoU3RhdGUoKSB7CiAgICB0aGlzLnBvc0Zyb20gPSB0aGlzLnBvc1RvID0gdGhpcy5xdWVyeSA9IG51bGw7CiAgICB0aGlzLm1hcmtlZCA9IFtdOwogIH0KICBmdW5jdGlvbiBnZXRTZWFyY2hTdGF0ZShjbSkgewogICAgcmV0dXJuIGNtLl9zZWFyY2hTdGF0ZSB8fCAoY20uX3NlYXJjaFN0YXRlID0gbmV3IFNlYXJjaFN0YXRlKCkpOwogIH0KICBmdW5jdGlvbiBnZXRTZWFyY2hDdXJzb3IoY20sIHF1ZXJ5LCBwb3MpIHsKICAgIC8vIEhldXJpc3RpYzogaWYgdGhlIHF1ZXJ5IHN0cmluZyBpcyBhbGwgbG93ZXJjYXNlLCBkbyBhIGNhc2UgaW5zZW5zaXRpdmUgc2VhcmNoLgogICAgcmV0dXJuIGNtLmdldFNlYXJjaEN1cnNvcihxdWVyeSwgcG9zLCB0eXBlb2YgcXVlcnkgPT0gInN0cmluZyIgJiYgcXVlcnkgPT0gcXVlcnkudG9Mb3dlckNhc2UoKSk7CiAgfQogIGZ1bmN0aW9uIGRpYWxvZyhjbSwgdGV4dCwgc2hvcnRUZXh0LCBmKSB7CiAgICBpZiAoY20ub3BlbkRpYWxvZykgY20ub3BlbkRpYWxvZyh0ZXh0LCBmKTsKICAgIGVsc2UgZihwcm9tcHQoc2hvcnRUZXh0LCAiIikpOwogIH0KICBmdW5jdGlvbiBjb25maXJtRGlhbG9nKGNtLCB0ZXh0LCBzaG9ydFRleHQsIGZzKSB7CiAgICBpZiAoY20ub3BlbkNvbmZpcm0pIGNtLm9wZW5Db25maXJtKHRleHQsIGZzKTsKICAgIGVsc2UgaWYgKGNvbmZpcm0oc2hvcnRUZXh0KSkgZnNbMF0oKTsKICB9CiAgZnVuY3Rpb24gcGFyc2VRdWVyeShxdWVyeSkgewogICAgdmFyIGlzUkUgPSBxdWVyeS5tYXRjaCgvXlwvKC4qKVwvKFthLXpdKikkLyk7CiAgICByZXR1cm4gaXNSRSA/IG5ldyBSZWdFeHAoaXNSRVsxXSwgaXNSRVsyXS5pbmRleE9mKCJpIikgPT0gLTEgPyAiIiA6ICJpIikgOiBxdWVyeTsKICB9CiAgdmFyIHF1ZXJ5RGlhbG9nID0KICAgICdTZWFyY2g6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDEwZW0iLz4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjODg4Ij4oVXNlIC9yZS8gc3ludGF4IGZvciByZWdleHAgc2VhcmNoKTwvc3Bhbj4nOwogIGZ1bmN0aW9uIGRvU2VhcmNoKGNtLCByZXYpIHsKICAgIHZhciBzdGF0ZSA9IGdldFNlYXJjaFN0YXRlKGNtKTsKICAgIGlmIChzdGF0ZS5xdWVyeSkgcmV0dXJuIGZpbmROZXh0KGNtLCByZXYpOwogICAgZGlhbG9nKGNtLCBxdWVyeURpYWxvZywgIlNlYXJjaCBmb3I6IiwgZnVuY3Rpb24ocXVlcnkpIHsKICAgICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghcXVlcnkgfHwgc3RhdGUucXVlcnkpIHJldHVybjsKICAgICAgICBzdGF0ZS5xdWVyeSA9IHBhcnNlUXVlcnkocXVlcnkpOwogICAgICAgIGlmIChjbS5saW5lQ291bnQoKSA8IDIwMDApIHsgLy8gVGhpcyBpcyB0b28gZXhwZW5zaXZlIG9uIGJpZyBkb2N1bWVudHMuCiAgICAgICAgICBmb3IgKHZhciBjdXJzb3IgPSBnZXRTZWFyY2hDdXJzb3IoY20sIHN0YXRlLnF1ZXJ5KTsgY3Vyc29yLmZpbmROZXh0KCk7KQogICAgICAgICAgICBzdGF0ZS5tYXJrZWQucHVzaChjbS5tYXJrVGV4dChjdXJzb3IuZnJvbSgpLCBjdXJzb3IudG8oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogIkNvZGVNaXJyb3Itc2VhcmNoaW5nIn0pKTsKICAgICAgICB9CiAgICAgICAgc3RhdGUucG9zRnJvbSA9IHN0YXRlLnBvc1RvID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgZmluZE5leHQoY20sIHJldik7CiAgICAgIH0pOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGZpbmROZXh0KGNtLCByZXYpIHtjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICB2YXIgc3RhdGUgPSBnZXRTZWFyY2hTdGF0ZShjbSk7CiAgICB2YXIgY3Vyc29yID0gZ2V0U2VhcmNoQ3Vyc29yKGNtLCBzdGF0ZS5xdWVyeSwgcmV2ID8gc3RhdGUucG9zRnJvbSA6IHN0YXRlLnBvc1RvKTsKICAgIGlmICghY3Vyc29yLmZpbmQocmV2KSkgewogICAgICBjdXJzb3IgPSBnZXRTZWFyY2hDdXJzb3IoY20sIHN0YXRlLnF1ZXJ5LCByZXYgPyB7bGluZTogY20ubGluZUNvdW50KCkgLSAxfSA6IHtsaW5lOiAwLCBjaDogMH0pOwogICAgICBpZiAoIWN1cnNvci5maW5kKHJldikpIHJldHVybjsKICAgIH0KICAgIGNtLnNldFNlbGVjdGlvbihjdXJzb3IuZnJvbSgpLCBjdXJzb3IudG8oKSk7CiAgICBzdGF0ZS5wb3NGcm9tID0gY3Vyc29yLmZyb20oKTsgc3RhdGUucG9zVG8gPSBjdXJzb3IudG8oKTsKICB9KTt9CiAgZnVuY3Rpb24gY2xlYXJTZWFyY2goY20pIHtjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICB2YXIgc3RhdGUgPSBnZXRTZWFyY2hTdGF0ZShjbSk7CiAgICBpZiAoIXN0YXRlLnF1ZXJ5KSByZXR1cm47CiAgICBzdGF0ZS5xdWVyeSA9IG51bGw7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLm1hcmtlZC5sZW5ndGg7ICsraSkgc3RhdGUubWFya2VkW2ldLmNsZWFyKCk7CiAgICBzdGF0ZS5tYXJrZWQubGVuZ3RoID0gMDsKICB9KTt9CgogIHZhciByZXBsYWNlUXVlcnlEaWFsb2cgPQogICAgJ1JlcGxhY2U6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDEwZW0iLz4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjODg4Ij4oVXNlIC9yZS8gc3ludGF4IGZvciByZWdleHAgc2VhcmNoKTwvc3Bhbj4nOwogIHZhciByZXBsYWNlbWVudFF1ZXJ5RGlhbG9nID0gJ1dpdGg6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDEwZW0iLz4nOwogIHZhciBkb1JlcGxhY2VDb25maXJtID0gIlJlcGxhY2U/IDxidXR0b24+WWVzPC9idXR0b24+IDxidXR0b24+Tm88L2J1dHRvbj4gPGJ1dHRvbj5TdG9wPC9idXR0b24+IjsKICBmdW5jdGlvbiByZXBsYWNlKGNtLCBhbGwpIHsKICAgIGRpYWxvZyhjbSwgcmVwbGFjZVF1ZXJ5RGlhbG9nLCAiUmVwbGFjZToiLCBmdW5jdGlvbihxdWVyeSkgewogICAgICBpZiAoIXF1ZXJ5KSByZXR1cm47CiAgICAgIHF1ZXJ5ID0gcGFyc2VRdWVyeShxdWVyeSk7CiAgICAgIGRpYWxvZyhjbSwgcmVwbGFjZW1lbnRRdWVyeURpYWxvZywgIlJlcGxhY2Ugd2l0aDoiLCBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgaWYgKGFsbCkgewogICAgICAgICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBjdXJzb3IgPSBnZXRTZWFyY2hDdXJzb3IoY20sIHF1ZXJ5KTsgY3Vyc29yLmZpbmROZXh0KCk7KSB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSAhPSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gY20uZ2V0UmFuZ2UoY3Vyc29yLmZyb20oKSwgY3Vyc29yLnRvKCkpLm1hdGNoKHF1ZXJ5KTsKICAgICAgICAgICAgICAgIGN1cnNvci5yZXBsYWNlKHRleHQucmVwbGFjZSgvXCQoXGQpLywgZnVuY3Rpb24oXywgaSkge3JldHVybiBtYXRjaFtpXTt9KSk7CiAgICAgICAgICAgICAgfSBlbHNlIGN1cnNvci5yZXBsYWNlKHRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2xlYXJTZWFyY2goY20pOwogICAgICAgICAgdmFyIGN1cnNvciA9IGdldFNlYXJjaEN1cnNvcihjbSwgcXVlcnksIGNtLmdldEN1cnNvcigpKTsKICAgICAgICAgIGZ1bmN0aW9uIGFkdmFuY2UoKSB7CiAgICAgICAgICAgIHZhciBzdGFydCA9IGN1cnNvci5mcm9tKCksIG1hdGNoOwogICAgICAgICAgICBpZiAoIShtYXRjaCA9IGN1cnNvci5maW5kTmV4dCgpKSkgewogICAgICAgICAgICAgIGN1cnNvciA9IGdldFNlYXJjaEN1cnNvcihjbSwgcXVlcnkpOwogICAgICAgICAgICAgIGlmICghKG1hdGNoID0gY3Vyc29yLmZpbmROZXh0KCkpIHx8CiAgICAgICAgICAgICAgICAgIChzdGFydCAmJiBjdXJzb3IuZnJvbSgpLmxpbmUgPT0gc3RhcnQubGluZSAmJiBjdXJzb3IuZnJvbSgpLmNoID09IHN0YXJ0LmNoKSkgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNtLnNldFNlbGVjdGlvbihjdXJzb3IuZnJvbSgpLCBjdXJzb3IudG8oKSk7CiAgICAgICAgICAgIGNvbmZpcm1EaWFsb2coY20sIGRvUmVwbGFjZUNvbmZpcm0sICJSZXBsYWNlPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Z1bmN0aW9uKCkge2RvUmVwbGFjZShtYXRjaCk7fSwgYWR2YW5jZV0pOwogICAgICAgICAgfQogICAgICAgICAgZnVuY3Rpb24gZG9SZXBsYWNlKG1hdGNoKSB7CiAgICAgICAgICAgIGN1cnNvci5yZXBsYWNlKHR5cGVvZiBxdWVyeSA9PSAic3RyaW5nIiA/IHRleHQgOgogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnJlcGxhY2UoL1wkKFxkKS8sIGZ1bmN0aW9uKF8sIGkpIHtyZXR1cm4gbWF0Y2hbaV07fSkpOwogICAgICAgICAgICBhZHZhbmNlKCk7CiAgICAgICAgICB9CiAgICAgICAgICBhZHZhbmNlKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0KCiAgQ29kZU1pcnJvci5jb21tYW5kcy5maW5kID0gZnVuY3Rpb24oY20pIHtjbGVhclNlYXJjaChjbSk7IGRvU2VhcmNoKGNtKTt9OwogIENvZGVNaXJyb3IuY29tbWFuZHMuZmluZE5leHQgPSBkb1NlYXJjaDsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmZpbmRQcmV2ID0gZnVuY3Rpb24oY20pIHtkb1NlYXJjaChjbSwgdHJ1ZSk7fTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmNsZWFyU2VhcmNoID0gY2xlYXJTZWFyY2g7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5yZXBsYWNlID0gcmVwbGFjZTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnJlcGxhY2VBbGwgPSBmdW5jdGlvbihjbSkge3JlcGxhY2UoY20sIHRydWUpO307Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/searchcursor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7CiAgZnVuY3Rpb24gU2VhcmNoQ3Vyc29yKGNtLCBxdWVyeSwgcG9zLCBjYXNlRm9sZCkgewogICAgdGhpcy5hdE9jY3VycmVuY2UgPSBmYWxzZTsgdGhpcy5jbSA9IGNtOwogICAgaWYgKGNhc2VGb2xkID09IG51bGwgJiYgdHlwZW9mIHF1ZXJ5ID09ICJzdHJpbmciKSBjYXNlRm9sZCA9IGZhbHNlOwoKICAgIHBvcyA9IHBvcyA/IGNtLmNsaXBQb3MocG9zKSA6IHtsaW5lOiAwLCBjaDogMH07CiAgICB0aGlzLnBvcyA9IHtmcm9tOiBwb3MsIHRvOiBwb3N9OwoKICAgIC8vIFRoZSBtYXRjaGVzIG1ldGhvZCBpcyBmaWxsZWQgaW4gYmFzZWQgb24gdGhlIHR5cGUgb2YgcXVlcnkuCiAgICAvLyBJdCB0YWtlcyBhIHBvc2l0aW9uIGFuZCBhIGRpcmVjdGlvbiwgYW5kIHJldHVybnMgYW4gb2JqZWN0CiAgICAvLyBkZXNjcmliaW5nIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhlIHF1ZXJ5LCBvciBudWxsIGlmIG5vCiAgICAvLyBtb3JlIG1hdGNoZXMgd2VyZSBmb3VuZC4KICAgIGlmICh0eXBlb2YgcXVlcnkgIT0gInN0cmluZyIpIHsgLy8gUmVnZXhwIG1hdGNoCiAgICAgIGlmICghcXVlcnkuZ2xvYmFsKSBxdWVyeSA9IG5ldyBSZWdFeHAocXVlcnkuc291cmNlLCBxdWVyeS5pZ25vcmVDYXNlID8gImlnIiA6ICJnIik7CiAgICAgIHRoaXMubWF0Y2hlcyA9IGZ1bmN0aW9uKHJldmVyc2UsIHBvcykgewogICAgICAgIGlmIChyZXZlcnNlKSB7CiAgICAgICAgICBxdWVyeS5sYXN0SW5kZXggPSAwOwogICAgICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKHBvcy5saW5lKS5zbGljZSgwLCBwb3MuY2gpLCBtYXRjaCA9IHF1ZXJ5LmV4ZWMobGluZSksIHN0YXJ0ID0gMDsKICAgICAgICAgIHdoaWxlIChtYXRjaCkgewogICAgICAgICAgICBzdGFydCArPSBtYXRjaC5pbmRleCArIDE7CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKHN0YXJ0KTsKICAgICAgICAgICAgcXVlcnkubGFzdEluZGV4ID0gMDsKICAgICAgICAgICAgdmFyIG5ld21hdGNoID0gcXVlcnkuZXhlYyhsaW5lKTsKICAgICAgICAgICAgaWYgKG5ld21hdGNoKSBtYXRjaCA9IG5ld21hdGNoOwogICAgICAgICAgICBlbHNlIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgc3RhcnQtLTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcXVlcnkubGFzdEluZGV4ID0gcG9zLmNoOwogICAgICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKHBvcy5saW5lKSwgbWF0Y2ggPSBxdWVyeS5leGVjKGxpbmUpLAogICAgICAgICAgc3RhcnQgPSBtYXRjaCAmJiBtYXRjaC5pbmRleDsKICAgICAgICB9CiAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgcmV0dXJuIHtmcm9tOiB7bGluZTogcG9zLmxpbmUsIGNoOiBzdGFydH0sCiAgICAgICAgICAgICAgICAgIHRvOiB7bGluZTogcG9zLmxpbmUsIGNoOiBzdGFydCArIG1hdGNoWzBdLmxlbmd0aH0sCiAgICAgICAgICAgICAgICAgIG1hdGNoOiBtYXRjaH07CiAgICAgIH07CiAgICB9IGVsc2UgeyAvLyBTdHJpbmcgcXVlcnkKICAgICAgaWYgKGNhc2VGb2xkKSBxdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CiAgICAgIHZhciBmb2xkID0gY2FzZUZvbGQgPyBmdW5jdGlvbihzdHIpe3JldHVybiBzdHIudG9Mb3dlckNhc2UoKTt9IDogZnVuY3Rpb24oc3RyKXtyZXR1cm4gc3RyO307CiAgICAgIHZhciB0YXJnZXQgPSBxdWVyeS5zcGxpdCgiXG4iKTsKICAgICAgLy8gRGlmZmVyZW50IG1ldGhvZHMgZm9yIHNpbmdsZS1saW5lIGFuZCBtdWx0aS1saW5lIHF1ZXJpZXMKICAgICAgaWYgKHRhcmdldC5sZW5ndGggPT0gMSkKICAgICAgICB0aGlzLm1hdGNoZXMgPSBmdW5jdGlvbihyZXZlcnNlLCBwb3MpIHsKICAgICAgICAgIHZhciBsaW5lID0gZm9sZChjbS5nZXRMaW5lKHBvcy5saW5lKSksIGxlbiA9IHF1ZXJ5Lmxlbmd0aCwgbWF0Y2g7CiAgICAgICAgICBpZiAocmV2ZXJzZSA/IChwb3MuY2ggPj0gbGVuICYmIChtYXRjaCA9IGxpbmUubGFzdEluZGV4T2YocXVlcnksIHBvcy5jaCAtIGxlbikpICE9IC0xKQogICAgICAgICAgICAgIDogKG1hdGNoID0gbGluZS5pbmRleE9mKHF1ZXJ5LCBwb3MuY2gpKSAhPSAtMSkKICAgICAgICAgICAgcmV0dXJuIHtmcm9tOiB7bGluZTogcG9zLmxpbmUsIGNoOiBtYXRjaH0sCiAgICAgICAgICAgICAgICAgICAgdG86IHtsaW5lOiBwb3MubGluZSwgY2g6IG1hdGNoICsgbGVufX07CiAgICAgICAgfTsKICAgICAgZWxzZQogICAgICAgIHRoaXMubWF0Y2hlcyA9IGZ1bmN0aW9uKHJldmVyc2UsIHBvcykgewogICAgICAgICAgdmFyIGxuID0gcG9zLmxpbmUsIGlkeCA9IChyZXZlcnNlID8gdGFyZ2V0Lmxlbmd0aCAtIDEgOiAwKSwgbWF0Y2ggPSB0YXJnZXRbaWR4XSwgbGluZSA9IGZvbGQoY20uZ2V0TGluZShsbikpOwogICAgICAgICAgdmFyIG9mZnNldEEgPSAocmV2ZXJzZSA/IGxpbmUuaW5kZXhPZihtYXRjaCkgKyBtYXRjaC5sZW5ndGggOiBsaW5lLmxhc3RJbmRleE9mKG1hdGNoKSk7CiAgICAgICAgICBpZiAocmV2ZXJzZSA/IG9mZnNldEEgPj0gcG9zLmNoIHx8IG9mZnNldEEgIT0gbWF0Y2gubGVuZ3RoCiAgICAgICAgICAgICAgOiBvZmZzZXRBIDw9IHBvcy5jaCB8fCBvZmZzZXRBICE9IGxpbmUubGVuZ3RoIC0gbWF0Y2gubGVuZ3RoKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmIChyZXZlcnNlID8gIWxuIDogbG4gPT0gY20ubGluZUNvdW50KCkgLSAxKSByZXR1cm47CiAgICAgICAgICAgIGxpbmUgPSBmb2xkKGNtLmdldExpbmUobG4gKz0gcmV2ZXJzZSA/IC0xIDogMSkpOwogICAgICAgICAgICBtYXRjaCA9IHRhcmdldFtyZXZlcnNlID8gLS1pZHggOiArK2lkeF07CiAgICAgICAgICAgIGlmIChpZHggPiAwICYmIGlkeCA8IHRhcmdldC5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgaWYgKGxpbmUgIT0gbWF0Y2gpIHJldHVybjsKICAgICAgICAgICAgICBlbHNlIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBvZmZzZXRCID0gKHJldmVyc2UgPyBsaW5lLmxhc3RJbmRleE9mKG1hdGNoKSA6IGxpbmUuaW5kZXhPZihtYXRjaCkgKyBtYXRjaC5sZW5ndGgpOwogICAgICAgICAgICBpZiAocmV2ZXJzZSA/IG9mZnNldEIgIT0gbGluZS5sZW5ndGggLSBtYXRjaC5sZW5ndGggOiBvZmZzZXRCICE9IG1hdGNoLmxlbmd0aCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHZhciBzdGFydCA9IHtsaW5lOiBwb3MubGluZSwgY2g6IG9mZnNldEF9LCBlbmQgPSB7bGluZTogbG4sIGNoOiBvZmZzZXRCfTsKICAgICAgICAgICAgcmV0dXJuIHtmcm9tOiByZXZlcnNlID8gZW5kIDogc3RhcnQsIHRvOiByZXZlcnNlID8gc3RhcnQgOiBlbmR9OwogICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgfQoKICBTZWFyY2hDdXJzb3IucHJvdG90eXBlID0gewogICAgZmluZE5leHQ6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpbmQoZmFsc2UpO30sCiAgICBmaW5kUHJldmlvdXM6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpbmQodHJ1ZSk7fSwKCiAgICBmaW5kOiBmdW5jdGlvbihyZXZlcnNlKSB7CiAgICAgIHZhciBzZWxmID0gdGhpcywgcG9zID0gdGhpcy5jbS5jbGlwUG9zKHJldmVyc2UgPyB0aGlzLnBvcy5mcm9tIDogdGhpcy5wb3MudG8pOwogICAgICBmdW5jdGlvbiBzYXZlUG9zQW5kRmFpbChsaW5lKSB7CiAgICAgICAgdmFyIHBvcyA9IHtsaW5lOiBsaW5lLCBjaDogMH07CiAgICAgICAgc2VsZi5wb3MgPSB7ZnJvbTogcG9zLCB0bzogcG9zfTsKICAgICAgICBzZWxmLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgZm9yICg7OykgewogICAgICAgIGlmICh0aGlzLnBvcyA9IHRoaXMubWF0Y2hlcyhyZXZlcnNlLCBwb3MpKSB7CiAgICAgICAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gdGhpcy5wb3MubWF0Y2ggfHwgdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICAgIGlmICghcG9zLmxpbmUpIHJldHVybiBzYXZlUG9zQW5kRmFpbCgwKTsKICAgICAgICAgIHBvcyA9IHtsaW5lOiBwb3MubGluZS0xLCBjaDogdGhpcy5jbS5nZXRMaW5lKHBvcy5saW5lLTEpLmxlbmd0aH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIG1heExpbmUgPSB0aGlzLmNtLmxpbmVDb3VudCgpOwogICAgICAgICAgaWYgKHBvcy5saW5lID09IG1heExpbmUgLSAxKSByZXR1cm4gc2F2ZVBvc0FuZEZhaWwobWF4TGluZSk7CiAgICAgICAgICBwb3MgPSB7bGluZTogcG9zLmxpbmUrMSwgY2g6IDB9OwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBmcm9tOiBmdW5jdGlvbigpIHtpZiAodGhpcy5hdE9jY3VycmVuY2UpIHJldHVybiB0aGlzLnBvcy5mcm9tO30sCiAgICB0bzogZnVuY3Rpb24oKSB7aWYgKHRoaXMuYXRPY2N1cnJlbmNlKSByZXR1cm4gdGhpcy5wb3MudG87fSwKCiAgICByZXBsYWNlOiBmdW5jdGlvbihuZXdUZXh0KSB7CiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgaWYgKHRoaXMuYXRPY2N1cnJlbmNlKQogICAgICAgIHNlbGYucG9zLnRvID0gdGhpcy5jbS5yZXBsYWNlUmFuZ2UobmV3VGV4dCwgc2VsZi5wb3MuZnJvbSwgc2VsZi5wb3MudG8pOwogICAgfQogIH07CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJnZXRTZWFyY2hDdXJzb3IiLCBmdW5jdGlvbihxdWVyeSwgcG9zLCBjYXNlRm9sZCkgewogICAgcmV0dXJuIG5ldyBTZWFyY2hDdXJzb3IodGhpcywgcXVlcnksIHBvcywgY2FzZUZvbGQpOwogIH0pOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/simple-hint.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItY29tcGxldGlvbnMgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB6LWluZGV4OiAxMDsKICBvdmVyZmxvdzogaGlkZGVuOwogIC13ZWJraXQtYm94LXNoYWRvdzogMnB4IDNweCA1cHggcmdiYSgwLDAsMCwuMik7CiAgLW1vei1ib3gtc2hhZG93OiAycHggM3B4IDVweCByZ2JhKDAsMCwwLC4yKTsKICBib3gtc2hhZG93OiAycHggM3B4IDVweCByZ2JhKDAsMCwwLC4yKTsKfQouQ29kZU1pcnJvci1jb21wbGV0aW9ucyBzZWxlY3QgewogIGJhY2tncm91bmQ6ICNmYWZhZmE7CiAgb3V0bGluZTogbm9uZTsKICBib3JkZXI6IG5vbmU7CiAgcGFkZGluZzogMDsKICBtYXJnaW46IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/simple-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIENvZGVNaXJyb3Iuc2ltcGxlSGludCA9IGZ1bmN0aW9uKGVkaXRvciwgZ2V0SGludHMsIGdpdmVuT3B0aW9ucykgewogICAgLy8gRGV0ZXJtaW5lIGVmZmVjdGl2ZSBvcHRpb25zIGJhc2VkIG9uIGdpdmVuIHZhbHVlcyBhbmQgZGVmYXVsdHMuCiAgICB2YXIgb3B0aW9ucyA9IHt9LCBkZWZhdWx0cyA9IENvZGVNaXJyb3Iuc2ltcGxlSGludC5kZWZhdWx0czsKICAgIGZvciAodmFyIG9wdCBpbiBkZWZhdWx0cykKICAgICAgaWYgKGRlZmF1bHRzLmhhc093blByb3BlcnR5KG9wdCkpCiAgICAgICAgb3B0aW9uc1tvcHRdID0gKGdpdmVuT3B0aW9ucyAmJiBnaXZlbk9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0KSA/IGdpdmVuT3B0aW9ucyA6IGRlZmF1bHRzKVtvcHRdOwogICAgCiAgICBmdW5jdGlvbiBjb2xsZWN0SGludHMocHJldmlvdXNUb2tlbikgewogICAgICAvLyBXZSB3YW50IGEgc2luZ2xlIGN1cnNvciBwb3NpdGlvbi4KICAgICAgaWYgKGVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCgpKSByZXR1cm47CgogICAgICB2YXIgdGVtcFRva2VuID0gZWRpdG9yLmdldFRva2VuQXQoZWRpdG9yLmdldEN1cnNvcigpKTsKCiAgICAgIC8vIERvbid0IHNob3cgY29tcGxldGlvbnMgaWYgdG9rZW4gaGFzIGNoYW5nZWQgYW5kIHRoZSBvcHRpb24gaXMgc2V0LgogICAgICBpZiAob3B0aW9ucy5jbG9zZU9uVG9rZW5DaGFuZ2UgJiYgcHJldmlvdXNUb2tlbiAhPSBudWxsICYmCiAgICAgICAgICAodGVtcFRva2VuLnN0YXJ0ICE9IHByZXZpb3VzVG9rZW4uc3RhcnQgfHwgdGVtcFRva2VuLnR5cGUgIT0gcHJldmlvdXNUb2tlbi50eXBlKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIHJlc3VsdCA9IGdldEhpbnRzKGVkaXRvciwgZ2l2ZW5PcHRpb25zKTsKICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5saXN0Lmxlbmd0aCkgcmV0dXJuOwogICAgICB2YXIgY29tcGxldGlvbnMgPSByZXN1bHQubGlzdDsKICAgICAgZnVuY3Rpb24gaW5zZXJ0KHN0cikgewogICAgICAgIGVkaXRvci5yZXBsYWNlUmFuZ2Uoc3RyLCByZXN1bHQuZnJvbSwgcmVzdWx0LnRvKTsKICAgICAgfQogICAgICAvLyBXaGVuIHRoZXJlIGlzIG9ubHkgb25lIGNvbXBsZXRpb24sIHVzZSBpdCBkaXJlY3RseS4KICAgICAgaWYgKG9wdGlvbnMuY29tcGxldGVTaW5nbGUgJiYgY29tcGxldGlvbnMubGVuZ3RoID09IDEpIHsKICAgICAgICBpbnNlcnQoY29tcGxldGlvbnNbMF0pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvLyBCdWlsZCB0aGUgc2VsZWN0IHdpZGdldAogICAgICB2YXIgY29tcGxldGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgY29tcGxldGUuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItY29tcGxldGlvbnMiOwogICAgICB2YXIgc2VsID0gY29tcGxldGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0IikpOwogICAgICAvLyBPcGVyYSBkb2Vzbid0IG1vdmUgdGhlIHNlbGVjdGlvbiB3aGVuIHByZXNzaW5nIHVwL2Rvd24gaW4gYQogICAgICAvLyBtdWx0aS1zZWxlY3QsIGJ1dCBpdCBkb2VzIHByb3Blcmx5IHN1cHBvcnQgdGhlIHNpemUgcHJvcGVydHkgb24KICAgICAgLy8gc2luZ2xlLXNlbGVjdHMsIHNvIG5vIG11bHRpLXNlbGVjdCBpcyBuZWNlc3NhcnkuCiAgICAgIGlmICghd2luZG93Lm9wZXJhKSBzZWwubXVsdGlwbGUgPSB0cnVlOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBsZXRpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIG9wdCA9IHNlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7CiAgICAgICAgb3B0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbXBsZXRpb25zW2ldKSk7CiAgICAgIH0KICAgICAgc2VsLmZpcnN0Q2hpbGQuc2VsZWN0ZWQgPSB0cnVlOwogICAgICBzZWwuc2l6ZSA9IE1hdGgubWluKDEwLCBjb21wbGV0aW9ucy5sZW5ndGgpOwogICAgICB2YXIgcG9zID0gZWRpdG9yLmN1cnNvckNvb3JkcyhvcHRpb25zLmFsaWduV2l0aFdvcmQgPyByZXN1bHQuZnJvbSA6IG51bGwpOwogICAgICBjb21wbGV0ZS5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgKyAicHgiOwogICAgICBjb21wbGV0ZS5zdHlsZS50b3AgPSBwb3MuYm90dG9tICsgInB4IjsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb21wbGV0ZSk7CiAgICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4sIHRoZW4gd2Ugd2FudCB0aGUgbWVudSB0byBhcHBlYXIgb24gdGhlIGxlZnQgb2YgdGhlIGN1cnNvci4KICAgICAgdmFyIHdpblcgPSB3aW5kb3cuaW5uZXJXaWR0aCB8fCBNYXRoLm1heChkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGgpOwogICAgICBpZih3aW5XIC0gcG9zLmxlZnQgPCBzZWwuY2xpZW50V2lkdGgpCiAgICAgICAgY29tcGxldGUuc3R5bGUubGVmdCA9IChwb3MubGVmdCAtIHNlbC5jbGllbnRXaWR0aCkgKyAicHgiOwogICAgICAvLyBIYWNrIHRvIGhpZGUgdGhlIHNjcm9sbGJhci4KICAgICAgaWYgKGNvbXBsZXRpb25zLmxlbmd0aCA8PSAxMCkKICAgICAgICBjb21wbGV0ZS5zdHlsZS53aWR0aCA9IChzZWwuY2xpZW50V2lkdGggLSAxKSArICJweCI7CgogICAgICB2YXIgZG9uZSA9IGZhbHNlOwogICAgICBmdW5jdGlvbiBjbG9zZSgpIHsKICAgICAgICBpZiAoZG9uZSkgcmV0dXJuOwogICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgIGNvbXBsZXRlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29tcGxldGUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBpY2soKSB7CiAgICAgICAgaW5zZXJ0KGNvbXBsZXRpb25zW3NlbC5zZWxlY3RlZEluZGV4XSk7CiAgICAgICAgY2xvc2UoKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZWRpdG9yLmZvY3VzKCk7fSwgNTApOwogICAgICB9CiAgICAgIENvZGVNaXJyb3Iub24oc2VsLCAiYmx1ciIsIGNsb3NlKTsKICAgICAgQ29kZU1pcnJvci5vbihzZWwsICJrZXlkb3duIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgY29kZSA9IGV2ZW50LmtleUNvZGU7CiAgICAgICAgLy8gRW50ZXIKICAgICAgICBpZiAoY29kZSA9PSAxMykge0NvZGVNaXJyb3IuZV9zdG9wKGV2ZW50KTsgcGljaygpO30KICAgICAgICAvLyBFc2NhcGUKICAgICAgICBlbHNlIGlmIChjb2RlID09IDI3KSB7Q29kZU1pcnJvci5lX3N0b3AoZXZlbnQpOyBjbG9zZSgpOyBlZGl0b3IuZm9jdXMoKTt9CiAgICAgICAgZWxzZSBpZiAoY29kZSAhPSAzOCAmJiBjb2RlICE9IDQwICYmIGNvZGUgIT0gMzMgJiYgY29kZSAhPSAzNCAmJiAhQ29kZU1pcnJvci5pc01vZGlmaWVyS2V5KGV2ZW50KSkgewogICAgICAgICAgY2xvc2UoKTsgZWRpdG9yLmZvY3VzKCk7CiAgICAgICAgICAvLyBQYXNzIHRoZSBldmVudCB0byB0aGUgQ29kZU1pcnJvciBpbnN0YW5jZSBzbyB0aGF0IGl0IGNhbiBoYW5kbGUgdGhpbmdzIGxpa2UgYmFja3NwYWNlIHByb3Blcmx5LgogICAgICAgICAgZWRpdG9yLnRyaWdnZXJPbktleURvd24oZXZlbnQpOwogICAgICAgICAgLy8gRG9uJ3Qgc2hvdyBjb21wbGV0aW9ucyBpZiB0aGUgY29kZSBpcyBiYWNrc3BhY2UgYW5kIHRoZSBvcHRpb24gaXMgc2V0LgogICAgICAgICAgaWYgKCFvcHRpb25zLmNsb3NlT25CYWNrc3BhY2UgfHwgY29kZSAhPSA4KSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjb2xsZWN0SGludHModGVtcFRva2VuKTt9LCA1MCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgQ29kZU1pcnJvci5vbihzZWwsICJkYmxjbGljayIsIHBpY2spOwoKICAgICAgc2VsLmZvY3VzKCk7CiAgICAgIC8vIE9wZXJhIHNvbWV0aW1lcyBpZ25vcmVzIGZvY3VzaW5nIGEgZnJlc2hseSBjcmVhdGVkIG5vZGUKICAgICAgaWYgKHdpbmRvdy5vcGVyYSkgc2V0VGltZW91dChmdW5jdGlvbigpe2lmICghZG9uZSkgc2VsLmZvY3VzKCk7fSwgMTAwKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gY29sbGVjdEhpbnRzKCk7CiAgfTsKICBDb2RlTWlycm9yLnNpbXBsZUhpbnQuZGVmYXVsdHMgPSB7CiAgICBjbG9zZU9uQmFja3NwYWNlOiB0cnVlLAogICAgY2xvc2VPblRva2VuQ2hhbmdlOiBmYWxzZSwKICAgIGNvbXBsZXRlU2luZ2xlOiB0cnVlLAogICAgYWxpZ25XaXRoV29yZDogdHJ1ZQogIH07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/lib/util/xml-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CihmdW5jdGlvbigpIHsKCiAgICBDb2RlTWlycm9yLnhtbEhpbnRzID0gW107CgogICAgQ29kZU1pcnJvci54bWxIaW50ID0gZnVuY3Rpb24oY20sIHNpbWJvbCkgewoKICAgICAgICBpZihzaW1ib2wubGVuZ3RoID4gMCkgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oc2ltYm9sKTsKICAgICAgICAgICAgY3Vyc29yID0ge2xpbmU6IGN1cnNvci5saW5lLCBjaDogY3Vyc29yLmNoICsgMX07CiAgICAgICAgICAgIGNtLnNldEN1cnNvcihjdXJzb3IpOwogICAgICAgIH0KCiAgICAgICAgQ29kZU1pcnJvci5zaW1wbGVIaW50KGNtLCBnZXRIaW50KTsKICAgIH07CgogICAgdmFyIGdldEhpbnQgPSBmdW5jdGlvbihjbSkgewoKICAgICAgICB2YXIgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7CgogICAgICAgIGlmIChjdXJzb3IuY2ggPiAwKSB7CgogICAgICAgICAgICB2YXIgdGV4dCA9IGNtLmdldFJhbmdlKHtsaW5lOiAwLCBjaDogMH0sIGN1cnNvcik7CiAgICAgICAgICAgIHZhciB0eXBlZCA9ICcnOwogICAgICAgICAgICB2YXIgc2ltYm9sID0gJyc7CiAgICAgICAgICAgIGZvcih2YXIgaSA9IHRleHQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIGlmKHRleHRbaV0gPT0gJyAnIHx8IHRleHRbaV0gPT0gJzwnKSB7CiAgICAgICAgICAgICAgICAgICAgc2ltYm9sID0gdGV4dFtpXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHR5cGVkID0gdGV4dFtpXSArIHR5cGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCB0ZXh0Lmxlbmd0aCAtIHR5cGVkLmxlbmd0aCk7CgogICAgICAgICAgICB2YXIgcGF0aCA9IGdldEFjdGl2ZUVsZW1lbnQodGV4dCkgKyBzaW1ib2w7CiAgICAgICAgICAgIHZhciBoaW50cyA9IENvZGVNaXJyb3IueG1sSGludHNbcGF0aF07CgogICAgICAgICAgICBpZih0eXBlb2YgaGludHMgPT09ICd1bmRlZmluZWQnKQogICAgICAgICAgICAgICAgaGludHMgPSBbJyddOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGhpbnRzID0gaGludHMuc2xpY2UoMCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaGludHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICBpZihoaW50c1tpXS5pbmRleE9mKHR5cGVkKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICBoaW50cy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBsaXN0OiBoaW50cywKICAgICAgICAgICAgICAgIGZyb206IHsgbGluZTogY3Vyc29yLmxpbmUsIGNoOiBjdXJzb3IuY2ggLSB0eXBlZC5sZW5ndGggfSwKICAgICAgICAgICAgICAgIHRvOiBjdXJzb3IKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgfTsKCiAgICB2YXIgZ2V0QWN0aXZlRWxlbWVudCA9IGZ1bmN0aW9uKHRleHQpIHsKCiAgICAgICAgdmFyIGVsZW1lbnQgPSAnJzsKCiAgICAgICAgaWYodGV4dC5sZW5ndGggPj0gMCkgewoKICAgICAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnPChbXiE/XVteXFxzLz5dKikuKj8+JywgJ2cnKTsKCiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107CiAgICAgICAgICAgIHZhciBtYXRjaDsKICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWModGV4dCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgdGFnOiBtYXRjaFsxXSwKICAgICAgICAgICAgICAgICAgICBzZWxmY2xvc2U6IChtYXRjaFswXS5zbGljZShtYXRjaFswXS5sZW5ndGggLSAyKSA9PT0gJy8+JykKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gbWF0Y2hlcy5sZW5ndGggLSAxLCBza2lwID0gMDsgaSA+PSAwOyBpLS0pIHsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1hdGNoZXNbaV07CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0udGFnWzBdID09ICcvJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBza2lwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdGVtLnNlbGZjbG9zZSA9PSBmYWxzZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBza2lwLS07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAnPCcgKyBpdGVtLnRhZyArICc+JyArIGVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBlbGVtZW50ICs9IGdldE9wZW5UYWcodGV4dCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgIH07CgogICAgdmFyIGdldE9wZW5UYWcgPSBmdW5jdGlvbih0ZXh0KSB7CgogICAgICAgIHZhciBvcGVuID0gdGV4dC5sYXN0SW5kZXhPZignPCcpOwogICAgICAgIHZhciBjbG9zZSA9IHRleHQubGFzdEluZGV4T2YoJz4nKTsKCiAgICAgICAgaWYgKGNsb3NlIDwgb3BlbikKICAgICAgICB7CiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKG9wZW4pOwoKICAgICAgICAgICAgaWYodGV4dCAhPSAnPCcpIHsKCiAgICAgICAgICAgICAgICB2YXIgc3BhY2UgPSB0ZXh0LmluZGV4T2YoJyAnKTsKICAgICAgICAgICAgICAgIGlmKHNwYWNlIDwgMCkKICAgICAgICAgICAgICAgICAgICBzcGFjZSA9IHRleHQuaW5kZXhPZignXHQnKTsKICAgICAgICAgICAgICAgIGlmKHNwYWNlIDwgMCkKICAgICAgICAgICAgICAgICAgICBzcGFjZSA9IHRleHQuaW5kZXhPZignXG4nKTsKCiAgICAgICAgICAgICAgICBpZiAoc3BhY2UgPCAwKQogICAgICAgICAgICAgICAgICAgIHNwYWNlID0gdGV4dC5sZW5ndGg7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoMCwgc3BhY2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJyc7CiAgICB9OwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChDKSAyMDEyIGJ5IE1hcmlqbiBIYXZlcmJla2UgPG1hcmlqbmhAZ21haWwuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KClBsZWFzZSBub3RlIHRoYXQgc29tZSBzdWJkaXJlY3RvcmllcyBvZiB0aGUgQ29kZU1pcnJvciBkaXN0cmlidXRpb24KaW5jbHVkZSB0aGVpciBvd24gTElDRU5TRSBmaWxlcywgYW5kIGFyZSByZWxlYXNlZCB1bmRlciBkaWZmZXJlbnQKbGljZW5jZXMuCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/clike/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/clike/clike.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJjbGlrZSIsIGZ1bmN0aW9uKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7CiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCwKICAgICAgc3RhdGVtZW50SW5kZW50VW5pdCA9IHBhcnNlckNvbmZpZy5zdGF0ZW1lbnRJbmRlbnRVbml0IHx8IGluZGVudFVuaXQsCiAgICAgIGtleXdvcmRzID0gcGFyc2VyQ29uZmlnLmtleXdvcmRzIHx8IHt9LAogICAgICBidWlsdGluID0gcGFyc2VyQ29uZmlnLmJ1aWx0aW4gfHwge30sCiAgICAgIGJsb2NrS2V5d29yZHMgPSBwYXJzZXJDb25maWcuYmxvY2tLZXl3b3JkcyB8fCB7fSwKICAgICAgYXRvbXMgPSBwYXJzZXJDb25maWcuYXRvbXMgfHwge30sCiAgICAgIGhvb2tzID0gcGFyc2VyQ29uZmlnLmhvb2tzIHx8IHt9LAogICAgICBtdWx0aUxpbmVTdHJpbmdzID0gcGFyc2VyQ29uZmlnLm11bHRpTGluZVN0cmluZ3M7CiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hP3xcL10vOwoKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoaG9va3NbY2hdKSB7CiAgICAgIHZhciByZXN1bHQgPSBob29rc1tjaF0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICBpZiAoYnVpbHRpbi5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKICAgICAgcmV0dXJuICJidWlsdGluIjsKICAgIH0KICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImF0b20iOwogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIShlc2NhcGVkIHx8IG11bHRpTGluZVN0cmluZ3MpKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGFsaWduLCBwcmV2KSB7CiAgICB0aGlzLmluZGVudGVkID0gaW5kZW50ZWQ7CiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmFsaWduID0gYWxpZ247CiAgICB0aGlzLnByZXYgPSBwcmV2OwogIH0KICBmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSwgY29sLCB0eXBlKSB7CiAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50ZWQ7CiAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInN0YXRlbWVudCIpCiAgICAgIGluZGVudCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KGluZGVudCwgY29sLCB0eXBlLCBudWxsLCBzdGF0ZS5jb250ZXh0KTsKICB9CiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgdmFyIHQgPSBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICBpZiAodCA9PSAiKSIgfHwgdCA9PSAiXSIgfHwgdCA9PSAifSIpCiAgICAgIHN0YXRlLmluZGVudGVkID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgLy8gSW50ZXJmYWNlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IG51bGwsCiAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICBjdXJQdW5jID0gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTsKCiAgICAgIGlmICgoY3VyUHVuYyA9PSAiOyIgfHwgY3VyUHVuYyA9PSAiOiIgfHwgY3VyUHVuYyA9PSAiLCIpICYmIGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJ9Iik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiXSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIikiKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAifSIpIHsKICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGlmIChjdHgudHlwZSA9PSAifSIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBjdHgudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKCgoY3R4LnR5cGUgPT0gIn0iIHx8IGN0eC50eXBlID09ICJ0b3AiKSAmJiBjdXJQdW5jICE9ICc7JykgfHwgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmIGN1clB1bmMgPT0gIm5ld3N0YXRlbWVudCIpKQogICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJzdGF0ZW1lbnQiKTsKICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSBmYWxzZTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSAmJiBzdGF0ZS50b2tlbml6ZSAhPSBudWxsKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dCwgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7CiAgICAgIGlmIChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBmaXJzdENoYXIgPT0gIn0iKSBjdHggPSBjdHgucHJldjsKICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gY3R4LnR5cGU7CiAgICAgIGlmIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChmaXJzdENoYXIgPT0gInsiID8gMCA6IHN0YXRlbWVudEluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAie30iCiAgfTsKfSk7CgooZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQogIHZhciBjS2V5d29yZHMgPSAiYXV0byBpZiBicmVhayBpbnQgY2FzZSBsb25nIGNoYXIgcmVnaXN0ZXIgY29udGludWUgcmV0dXJuIGRlZmF1bHQgc2hvcnQgZG8gc2l6ZW9mICIgKwogICAgImRvdWJsZSBzdGF0aWMgZWxzZSBzdHJ1Y3QgZW50cnkgc3dpdGNoIGV4dGVybiB0eXBlZGVmIGZsb2F0IHVuaW9uIGZvciB1bnNpZ25lZCAiICsKICAgICJnb3RvIHdoaWxlIGVudW0gdm9pZCBjb25zdCBzaWduZWQgdm9sYXRpbGUiOwoKICBmdW5jdGlvbiBjcHBIb29rKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmICghc3RhdGUuc3RhcnRPZkxpbmUpIHJldHVybiBmYWxzZTsKICAgIGZvciAoOzspIHsKICAgICAgaWYgKHN0cmVhbS5za2lwVG8oIlxcIikpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gY3BwSG9vazsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gIm1ldGEiOwogIH0KCiAgLy8gQyMtc3R5bGUgc3RyaW5ncyB3aGVyZSAiIiBlc2NhcGVzIGEgcXVvdGUuCiAgZnVuY3Rpb24gdG9rZW5BdFN0cmluZyhzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbmV4dDsKICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKG5leHQgPT0gJyInICYmICFzdHJlYW0uZWF0KCciJykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIGZ1bmN0aW9uIG1pbWVzKG1zLCBtb2RlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zLmxlbmd0aDsgKytpKSBDb2RlTWlycm9yLmRlZmluZU1JTUUobXNbaV0sIG1vZGUpOwogIH0KCiAgbWltZXMoWyJ0ZXh0L3gtY3NyYyIsICJ0ZXh0L3gtYyIsICJ0ZXh0L3gtY2hkciJdLCB7CiAgICBuYW1lOiAiY2xpa2UiLAogICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyksCiAgICBibG9ja0tleXdvcmRzOiB3b3JkcygiY2FzZSBkbyBlbHNlIGZvciBpZiBzd2l0Y2ggd2hpbGUgc3RydWN0IiksCiAgICBhdG9tczogd29yZHMoIm51bGwiKSwKICAgIGhvb2tzOiB7IiMiOiBjcHBIb29rfQogIH0pOwogIG1pbWVzKFsidGV4dC94LWMrK3NyYyIsICJ0ZXh0L3gtYysraGRyIl0sIHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzICsgIiBhc20gZHluYW1pY19jYXN0IG5hbWVzcGFjZSByZWludGVycHJldF9jYXN0IHRyeSBib29sIGV4cGxpY2l0IG5ldyAiICsKICAgICAgICAgICAgICAgICAgICAic3RhdGljX2Nhc3QgdHlwZWlkIGNhdGNoIG9wZXJhdG9yIHRlbXBsYXRlIHR5cGVuYW1lIGNsYXNzIGZyaWVuZCBwcml2YXRlICIgKwogICAgICAgICAgICAgICAgICAgICJ0aGlzIHVzaW5nIGNvbnN0X2Nhc3QgaW5saW5lIHB1YmxpYyB0aHJvdyB2aXJ0dWFsIGRlbGV0ZSBtdXRhYmxlIHByb3RlY3RlZCAiICsKICAgICAgICAgICAgICAgICAgICAid2NoYXJfdCIpLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgaWYgc3RydWN0IHN3aXRjaCB0cnkgd2hpbGUiKSwKICAgIGF0b21zOiB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIiksCiAgICBob29rczogeyIjIjogY3BwSG9va30KICB9KTsKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1qYXZhIiwgewogICAgbmFtZTogImNsaWtlIiwKICAgIGtleXdvcmRzOiB3b3JkcygiYWJzdHJhY3QgYXNzZXJ0IGJvb2xlYW4gYnJlYWsgYnl0ZSBjYXNlIGNhdGNoIGNoYXIgY2xhc3MgY29uc3QgY29udGludWUgZGVmYXVsdCAiICsgCiAgICAgICAgICAgICAgICAgICAgImRvIGRvdWJsZSBlbHNlIGVudW0gZXh0ZW5kcyBmaW5hbCBmaW5hbGx5IGZsb2F0IGZvciBnb3RvIGlmIGltcGxlbWVudHMgaW1wb3J0ICIgKwogICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZW9mIGludCBpbnRlcmZhY2UgbG9uZyBuYXRpdmUgbmV3IHBhY2thZ2UgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljICIgKwogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gc2hvcnQgc3RhdGljIHN0cmljdGZwIHN1cGVyIHN3aXRjaCBzeW5jaHJvbml6ZWQgdGhpcyB0aHJvdyB0aHJvd3MgdHJhbnNpZW50ICIgKwogICAgICAgICAgICAgICAgICAgICJ0cnkgdm9pZCB2b2xhdGlsZSB3aGlsZSIpLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgaWYgc3dpdGNoIHRyeSB3aGlsZSIpLAogICAgYXRvbXM6IHdvcmRzKCJ0cnVlIGZhbHNlIG51bGwiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfQogICAgfQogIH0pOwogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWNzaGFycCIsIHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczogd29yZHMoImFic3RyYWN0IGFzIGJhc2UgYnJlYWsgY2FzZSBjYXRjaCBjaGVja2VkIGNsYXNzIGNvbnN0IGNvbnRpbnVlIiArIAogICAgICAgICAgICAgICAgICAgICIgZGVmYXVsdCBkZWxlZ2F0ZSBkbyBlbHNlIGVudW0gZXZlbnQgZXhwbGljaXQgZXh0ZXJuIGZpbmFsbHkgZml4ZWQgZm9yIiArIAogICAgICAgICAgICAgICAgICAgICIgZm9yZWFjaCBnb3RvIGlmIGltcGxpY2l0IGluIGludGVyZmFjZSBpbnRlcm5hbCBpcyBsb2NrIG5hbWVzcGFjZSBuZXciICsgCiAgICAgICAgICAgICAgICAgICAgIiBvcGVyYXRvciBvdXQgb3ZlcnJpZGUgcGFyYW1zIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyByZWFkb25seSByZWYgcmV0dXJuIHNlYWxlZCIgKyAKICAgICAgICAgICAgICAgICAgICAiIHNpemVvZiBzdGFja2FsbG9jIHN0YXRpYyBzdHJ1Y3Qgc3dpdGNoIHRoaXMgdGhyb3cgdHJ5IHR5cGVvZiB1bmNoZWNrZWQiICsgCiAgICAgICAgICAgICAgICAgICAgIiB1bnNhZmUgdXNpbmcgdmlydHVhbCB2b2lkIHZvbGF0aWxlIHdoaWxlIGFkZCBhbGlhcyBhc2NlbmRpbmcgZGVzY2VuZGluZyBkeW5hbWljIGZyb20gZ2V0IiArIAogICAgICAgICAgICAgICAgICAgICIgZ2xvYmFsIGdyb3VwIGludG8gam9pbiBsZXQgb3JkZXJieSBwYXJ0aWFsIHJlbW92ZSBzZWxlY3Qgc2V0IHZhbHVlIHZhciB5aWVsZCIpLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgZm9yZWFjaCBpZiBzdHJ1Y3Qgc3dpdGNoIHRyeSB3aGlsZSIpLAogICAgYnVpbHRpbjogd29yZHMoIkJvb2xlYW4gQnl0ZSBDaGFyIERhdGVUaW1lIERhdGVUaW1lT2Zmc2V0IERlY2ltYWwgRG91YmxlIiArCiAgICAgICAgICAgICAgICAgICAgIiBHdWlkIEludDE2IEludDMyIEludDY0IE9iamVjdCBTQnl0ZSBTaW5nbGUgU3RyaW5nIFRpbWVTcGFuIFVJbnQxNiBVSW50MzIiICsKICAgICAgICAgICAgICAgICAgICAiIFVJbnQ2NCBib29sIGJ5dGUgY2hhciBkZWNpbWFsIGRvdWJsZSBzaG9ydCBpbnQgbG9uZyBvYmplY3QiICArCiAgICAgICAgICAgICAgICAgICAgIiBzYnl0ZSBmbG9hdCBzdHJpbmcgdXNob3J0IHVpbnQgdWxvbmciKSwKICAgIGF0b21zOiB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIiksCiAgICBob29rczogewogICAgICAiQCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgnIicpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQXRTdHJpbmc7CiAgICAgICAgICByZXR1cm4gdG9rZW5BdFN0cmluZyhzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfQogICAgfQogIH0pOwogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXNjYWxhIiwgewogICAgbmFtZTogImNsaWtlIiwKICAgIGtleXdvcmRzOiB3b3JkcygKICAgICAgCiAgICAgIC8qIHNjYWxhICovCiAgICAgICJhYnN0cmFjdCBjYXNlIGNhdGNoIGNsYXNzIGRlZiBkbyBlbHNlIGV4dGVuZHMgZmFsc2UgZmluYWwgZmluYWxseSBmb3IgZm9yU29tZSBpZiAiICsKICAgICAgImltcGxpY2l0IGltcG9ydCBsYXp5IG1hdGNoIG5ldyBudWxsIG9iamVjdCBvdmVycmlkZSBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHJldHVybiAiICsKICAgICAgInNlYWxlZCBzdXBlciB0aGlzIHRocm93IHRyYWl0IHRyeSB0cnllIHR5cGUgdmFsIHZhciB3aGlsZSB3aXRoIHlpZWxkIF8gOiA9ID0+IDwtIDw6ICIgKwogICAgICAiPCUgPjogIyBAICIgKwogICAgICAgICAgICAgICAgICAgIAogICAgICAvKiBwYWNrYWdlIHNjYWxhICovCiAgICAgICJhc3NlcnQgYXNzdW1lIHJlcXVpcmUgcHJpbnQgcHJpbnRsbiBwcmludGYgcmVhZExpbmUgcmVhZEJvb2xlYW4gcmVhZEJ5dGUgcmVhZFNob3J0ICIgKwogICAgICAicmVhZENoYXIgcmVhZEludCByZWFkTG9uZyByZWFkRmxvYXQgcmVhZERvdWJsZSAiICsKICAgICAgCiAgICAgICJBbnlWYWwgQXBwIEFwcGxpY2F0aW9uIEFycmF5IEJ1ZmZlcmVkSXRlcmF0b3IgQmlnRGVjaW1hbCBCaWdJbnQgQ2hhciBDb25zb2xlIEVpdGhlciAiICsKICAgICAgIkVudW1lcmF0aW9uIEVxdWl2IEVycm9yIEV4Y2VwdGlvbiBGcmFjdGlvbmFsIEZ1bmN0aW9uIEluZGV4ZWRTZXEgSW50ZWdyYWwgSXRlcmFibGUgIiArCiAgICAgICJJdGVyYXRvciBMaXN0IE1hcCBOdW1lcmljIE5pbCBOb3ROdWxsIE9wdGlvbiBPcmRlcmVkIE9yZGVyaW5nIFBhcnRpYWxGdW5jdGlvbiBQYXJ0aWFsT3JkZXJpbmcgIiArCiAgICAgICJQcm9kdWN0IFByb3h5IFJhbmdlIFJlc3BvbmRlciBTZXEgU2VyaWFsaXphYmxlIFNldCBTcGVjaWFsaXphYmxlIFN0cmVhbSBTdHJpbmdCdWlsZGVyICIgKwogICAgICAiU3RyaW5nQ29udGV4dCBTeW1ib2wgVGhyb3dhYmxlIFRyYXZlcnNhYmxlIFRyYXZlcnNhYmxlT25jZSBUdXBsZSBVbml0IFZlY3RvciA6OiAjOjogIiArCiAgICAgIAogICAgICAvKiBwYWNrYWdlIGphdmEubGFuZyAqLyAgICAgICAgICAgIAogICAgICAiQm9vbGVhbiBCeXRlIENoYXJhY3RlciBDaGFyU2VxdWVuY2UgQ2xhc3MgQ2xhc3NMb2FkZXIgQ2xvbmVhYmxlIENvbXBhcmFibGUgIiArCiAgICAgICJDb21waWxlciBEb3VibGUgRXhjZXB0aW9uIEZsb2F0IEludGVnZXIgTG9uZyBNYXRoIE51bWJlciBPYmplY3QgUGFja2FnZSBQYWlyIFByb2Nlc3MgIiArCiAgICAgICJSdW50aW1lIFJ1bm5hYmxlIFNlY3VyaXR5TWFuYWdlciBTaG9ydCBTdGFja1RyYWNlRWxlbWVudCBTdHJpY3RNYXRoIFN0cmluZyAiICsKICAgICAgIlN0cmluZ0J1ZmZlciBTeXN0ZW0gVGhyZWFkIFRocmVhZEdyb3VwIFRocmVhZExvY2FsIFRocm93YWJsZSBUcmlwbGUgVm9pZCIKICAgICAgCiAgICAgIAogICAgKSwKICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKCJjYXRjaCBjbGFzcyBkbyBlbHNlIGZpbmFsbHkgZm9yIGZvclNvbWUgaWYgbWF0Y2ggc3dpdGNoIHRyeSB3aGlsZSIpLAogICAgYXRvbXM6IHdvcmRzKCJ0cnVlIGZhbHNlIG51bGwiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfQogICAgfQogIH0pOwp9KCkpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/clike/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEMtbGlrZSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iY2xpa2UuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDJweCBpbnNldCAjZGVlO308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBDLWxpa2UgbW9kZTwvaDE+Cgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovKiBDIGRlbW8gY29kZSAqLwoKI2luY2x1ZGUgPHptcS5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8c2VtYXBob3JlLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgoKdHlwZWRlZiBzdHJ1Y3QgewogIHZvaWQqIGFyZ19zb2NrZXQ7CiAgem1xX21zZ190KiBhcmdfbXNnOwogIGNoYXIqIGFyZ19zdHJpbmc7CiAgdW5zaWduZWQgbG9uZyBhcmdfbGVuOwogIGludCBhcmdfaW50LCBhcmdfY29tbWFuZDsKCiAgaW50IHNpZ25hbF9mZDsKICBpbnQgcGFkOwogIHZvaWQqIGNvbnRleHQ7CiAgc2VtX3Qgc2VtOwp9IGFjbF96bXFfY29udGV4dDsKCiNkZWZpbmUgcChYKSAoY29udGV4dC0+YXJnXyMjWCkKCnZvaWQqIHptcV90aHJlYWQodm9pZCogY29udGV4dF9wb2ludGVyKSB7CiAgYWNsX3ptcV9jb250ZXh0KiBjb250ZXh0ID0gKGFjbF96bXFfY29udGV4dCopY29udGV4dF9wb2ludGVyOwogIGNoYXIgb2sgPSAnSycsIGVyciA9ICdYJzsKICBpbnQgcmVzOwoKICB3aGlsZSAoMSkgewogICAgd2hpbGUgKChyZXMgPSBzZW1fd2FpdCgmYW1wO2NvbnRleHQtPnNlbSkpID09IEVJTlRSKTsKICAgIGlmIChyZXMpIHt3cml0ZShjb250ZXh0LT5zaWduYWxfZmQsICZhbXA7ZXJyLCAxKTsgZ290byBjbGVhbnVwO30KICAgIHN3aXRjaChwKGNvbW1hbmQpKSB7CiAgICBjYXNlIDA6IGdvdG8gY2xlYW51cDsKICAgIGNhc2UgMTogcChzb2NrZXQpID0gem1xX3NvY2tldChjb250ZXh0LT5jb250ZXh0LCBwKGludCkpOyBicmVhazsKICAgIGNhc2UgMjogcChpbnQpID0gem1xX2Nsb3NlKHAoc29ja2V0KSk7IGJyZWFrOwogICAgY2FzZSAzOiBwKGludCkgPSB6bXFfYmluZChwKHNvY2tldCksIHAoc3RyaW5nKSk7IGJyZWFrOwogICAgY2FzZSA0OiBwKGludCkgPSB6bXFfY29ubmVjdChwKHNvY2tldCksIHAoc3RyaW5nKSk7IGJyZWFrOwogICAgY2FzZSA1OiBwKGludCkgPSB6bXFfZ2V0c29ja29wdChwKHNvY2tldCksIHAoaW50KSwgKHZvaWQqKXAoc3RyaW5nKSwgJmFtcDtwKGxlbikpOyBicmVhazsKICAgIGNhc2UgNjogcChpbnQpID0gem1xX3NldHNvY2tvcHQocChzb2NrZXQpLCBwKGludCksICh2b2lkKilwKHN0cmluZyksIHAobGVuKSk7IGJyZWFrOwogICAgY2FzZSA3OiBwKGludCkgPSB6bXFfc2VuZChwKHNvY2tldCksIHAobXNnKSwgcChpbnQpKTsgYnJlYWs7CiAgICBjYXNlIDg6IHAoaW50KSA9IHptcV9yZWN2KHAoc29ja2V0KSwgcChtc2cpLCBwKGludCkpOyBicmVhazsKICAgIGNhc2UgOTogcChpbnQpID0gem1xX3BvbGwocChzb2NrZXQpLCBwKGludCksIHAobGVuKSk7IGJyZWFrOwogICAgfQogICAgcChjb21tYW5kKSA9IGVycm5vOwogICAgd3JpdGUoY29udGV4dC0+c2lnbmFsX2ZkLCAmYW1wO29rLCAxKTsKICB9CiBjbGVhbnVwOgogIGNsb3NlKGNvbnRleHQtPnNpZ25hbF9mZCk7CiAgZnJlZShjb250ZXh0X3BvaW50ZXIpOwogIHJldHVybiAwOwp9Cgp2b2lkKiB6bXFfdGhyZWFkX2luaXQodm9pZCogem1xX2NvbnRleHQsIGludCBzaWduYWxfZmQpIHsKICBhY2xfem1xX2NvbnRleHQqIGNvbnRleHQgPSBtYWxsb2Moc2l6ZW9mKGFjbF96bXFfY29udGV4dCkpOwogIHB0aHJlYWRfdCB0aHJlYWQ7CgogIGNvbnRleHQtPmNvbnRleHQgPSB6bXFfY29udGV4dDsKICBjb250ZXh0LT5zaWduYWxfZmQgPSBzaWduYWxfZmQ7CiAgc2VtX2luaXQoJmFtcDtjb250ZXh0LT5zZW0sIDEsIDApOwogIHB0aHJlYWRfY3JlYXRlKCZhbXA7dGhyZWFkLCAwLCAmYW1wO3ptcV90aHJlYWQsIGNvbnRleHQpOwogIHB0aHJlYWRfZGV0YWNoKHRocmVhZCk7CiAgcmV0dXJuIGNvbnRleHQ7Cn0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtY3NyYyIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5TaW1wbGUgbW9kZSB0aGF0IHRyaWVzIHRvIGhhbmRsZSBDLWxpa2UgbGFuZ3VhZ2VzIGFzIHdlbGwgYXMgaXQKICAgIGNhbi4gVGFrZXMgdHdvIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczogPGNvZGU+a2V5d29yZHM8L2NvZGU+LCBhbgogICAgb2JqZWN0IHdob3NlIHByb3BlcnR5IG5hbWVzIGFyZSB0aGUga2V5d29yZHMgaW4gdGhlIGxhbmd1YWdlLAogICAgYW5kIDxjb2RlPnVzZUNQUDwvY29kZT4sIHdoaWNoIGRldGVybWluZXMgd2hldGhlciBDIHByZXByb2Nlc3NvcgogICAgZGlyZWN0aXZlcyBhcmUgcmVjb2duaXplZC48L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1jc3JjPC9jb2RlPgogICAgKEMgY29kZSksIDxjb2RlPnRleHQveC1jKytzcmM8L2NvZGU+IChDKysKICAgIGNvZGUpLCA8Y29kZT50ZXh0L3gtamF2YTwvY29kZT4gKEphdmEKICAgIGNvZGUpLCA8Y29kZT50ZXh0L3gtY3NoYXJwPC9jb2RlPiAoQyMpLjwvcD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/clike/scala.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEMtbGlrZSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvYW1iaWFuY2UuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iY2xpa2UuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlPgogICAgICBib2R5CiAgICAgIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXgtd2lkdGg6aW5oZXJpdDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgaHRtbCwgZm9ybSwgLkNvZGVNaXJyb3IsIC5Db2RlTWlycm9yLXNjcm9sbAogICAgICB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOyAgICAgICAgCiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5Pgo8Zm9ybT4KPHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KCiAgLyogICAgICAgICAgICAgICAgICAgICBfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlwKICAqKiAgICAgX19fX19fX18gX19fICAgLyAvICBfX18gICAgIFNjYWxhIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgogICoqICAgIC8gX18vIF9fLy8gXyB8IC8gLyAgLyBfIHwgICAgKGMpIDIwMDMtMjAxMSwgTEFNUC9FUEZMICAgICAgICAgICAgICoqCiAgKiogIF9fXCBcLyAvX18vIF9fIHwvIC9fXy8gX18gfCAgICBodHRwOi8vc2NhbGEtbGFuZy5vcmcvICAgICAgICAgICAgICAgKioKICAqKiAvX19fXy9cX19fL18vIHxfL19fX18vXy8gfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgogICoqICAgICAgICAgICAgICAgICAgICAgICAgICB8LyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCiAgXCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgcGFja2FnZSBzY2FsYS5jb2xsZWN0aW9uCgogIGltcG9ydCBnZW5lcmljLl8KICBpbXBvcnQgbXV0YWJsZS57IEJ1aWxkZXIsIExpc3RCdWZmZXIgfQogIGltcG9ydCBhbm5vdGF0aW9uLnt0YWlscmVjLCBtaWdyYXRpb24sIGJyaWRnZX0KICBpbXBvcnQgYW5ub3RhdGlvbi51bmNoZWNrZWQueyB1bmNoZWNrZWRWYXJpYW5jZSA9PiB1ViB9CiAgaW1wb3J0IHBhcmFsbGVsLlBhckl0ZXJhYmxlCgogIC8qKiBBIHRlbXBsYXRlIHRyYWl0IGZvciB0cmF2ZXJzYWJsZSBjb2xsZWN0aW9ucyBvZiB0eXBlIGBUcmF2ZXJzYWJsZVtBXWAuCiAgICogIAogICAqICAkdHJhdmVyc2FibGVJbmZvCiAgICogIEBkZWZpbmUgbXV0YWJpbGl0eQogICAqICBAZGVmaW5lIHRyYXZlcnNhYmxlSW5mbwogICAqICBUaGlzIGlzIGEgYmFzZSB0cmFpdCBvZiBhbGwga2luZHMgb2YgJG11dGFiaWxpdHkgU2NhbGEgY29sbGVjdGlvbnMuIEl0CiAgICogIGltcGxlbWVudHMgdGhlIGJlaGF2aW9yIGNvbW1vbiB0byBhbGwgY29sbGVjdGlvbnMsIGluIHRlcm1zIG9mIGEgbWV0aG9kCiAgICogIGBmb3JlYWNoYCB3aXRoIHNpZ25hdHVyZToKICAgKiB7e3sKICAgKiAgICAgZGVmIGZvcmVhY2hbVV0oZjogRWxlbSA9PiBVKTogVW5pdAogICAqIH19fQogICAqICBDb2xsZWN0aW9uIGNsYXNzZXMgbWl4aW5nIGluIHRoaXMgdHJhaXQgcHJvdmlkZSBhIGNvbmNyZXRlIAogICAqICBgZm9yZWFjaGAgbWV0aG9kIHdoaWNoIHRyYXZlcnNlcyBhbGwgdGhlCiAgICogIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgY29sbGVjdGlvbiwgYXBwbHlpbmcgYSBnaXZlbiBmdW5jdGlvbiB0byBlYWNoLgogICAqICBUaGV5IGFsc28gbmVlZCB0byBwcm92aWRlIGEgbWV0aG9kIGBuZXdCdWlsZGVyYAogICAqICB3aGljaCBjcmVhdGVzIGEgYnVpbGRlciBmb3IgY29sbGVjdGlvbnMgb2YgdGhlIHNhbWUga2luZC4KICAgKiAgCiAgICogIEEgdHJhdmVyc2FibGUgY2xhc3MgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgdHdvIHByb3BlcnRpZXM6IHN0cmljdG5lc3MKICAgKiAgYW5kIG9yZGVyZWRuZXNzLiBOZWl0aGVyIGlzIHJlcHJlc2VudGVkIGFzIGEgdHlwZS4KICAgKiAgCiAgICogIFRoZSBpbnN0YW5jZXMgb2YgYSBzdHJpY3QgY29sbGVjdGlvbiBjbGFzcyBoYXZlIGFsbCB0aGVpciBlbGVtZW50cwogICAqICBjb21wdXRlZCBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZCBhcyB2YWx1ZXMuIEJ5IGNvbnRyYXN0LCBpbnN0YW5jZXMgb2YKICAgKiAgYSBub24tc3RyaWN0IGNvbGxlY3Rpb24gY2xhc3MgbWF5IGRlZmVyIGNvbXB1dGF0aW9uIG9mIHNvbWUgb2YgdGhlaXIKICAgKiAgZWxlbWVudHMgdW50aWwgYWZ0ZXIgdGhlIGluc3RhbmNlIGlzIGF2YWlsYWJsZSBhcyBhIHZhbHVlLgogICAqICBBIHR5cGljYWwgZXhhbXBsZSBvZiBhIG5vbi1zdHJpY3QgY29sbGVjdGlvbiBjbGFzcyBpcyBhCiAgICogIDxhIGhyZWY9Ii4uL2ltbXV0YWJsZS9TdHJlYW0uaHRtbCIgdGFyZ2V0PSJDb250ZW50RnJhbWUiPgogICAqICBgc2NhbGEuY29sbGVjdGlvbi5pbW11dGFibGUuU3RyZWFtYDwvYT4uCiAgICogIEEgbW9yZSBnZW5lcmFsIGNsYXNzIG9mIGV4YW1wbGVzIGFyZSBgVHJhdmVyc2FibGVWaWV3c2AuCiAgICogIAogICAqICBJZiBhIGNvbGxlY3Rpb24gaXMgYW4gaW5zdGFuY2Ugb2YgYW4gb3JkZXJlZCBjb2xsZWN0aW9uIGNsYXNzLCB0cmF2ZXJzaW5nCiAgICogIGl0cyBlbGVtZW50cyB3aXRoIGBmb3JlYWNoYCB3aWxsIGFsd2F5cyB2aXNpdCBlbGVtZW50cyBpbiB0aGUKICAgKiAgc2FtZSBvcmRlciwgZXZlbiBmb3IgZGlmZmVyZW50IHJ1bnMgb2YgdGhlIHByb2dyYW0uIElmIHRoZSBjbGFzcyBpcyBub3QKICAgKiAgb3JkZXJlZCwgYGZvcmVhY2hgIGNhbiB2aXNpdCBlbGVtZW50cyBpbiBkaWZmZXJlbnQgb3JkZXJzIGZvcgogICAqICBkaWZmZXJlbnQgcnVucyAoYnV0IGl0IHdpbGwga2VlcCB0aGUgc2FtZSBvcmRlciBpbiB0aGUgc2FtZSBydW4pLicKICAgKiAKICAgKiAgQSB0eXBpY2FsIGV4YW1wbGUgb2YgYSBjb2xsZWN0aW9uIGNsYXNzIHdoaWNoIGlzIG5vdCBvcmRlcmVkIGlzIGEKICAgKiAgYEhhc2hNYXBgIG9mIG9iamVjdHMuIFRoZSB0cmF2ZXJzYWwgb3JkZXIgZm9yIGhhc2ggbWFwcyB3aWxsCiAgICogIGRlcGVuZCBvbiB0aGUgaGFzaCBjb2RlcyBvZiBpdHMgZWxlbWVudHMsIGFuZCB0aGVzZSBoYXNoIGNvZGVzIG1pZ2h0CiAgICogIGRpZmZlciBmcm9tIG9uZSBydW4gdG8gdGhlIG5leHQuIEJ5IGNvbnRyYXN0LCBhIGBMaW5rZWRIYXNoTWFwYAogICAqICBpcyBvcmRlcmVkIGJlY2F1c2UgaXQncyBgZm9yZWFjaGAgbWV0aG9kIHZpc2l0cyBlbGVtZW50cyBpbiB0aGUKICAgKiAgb3JkZXIgdGhleSB3ZXJlIGluc2VydGVkIGludG8gdGhlIGBIYXNoTWFwYC4KICAgKgogICAqICBAYXV0aG9yIE1hcnRpbiBPZGVyc2t5CiAgICogIEB2ZXJzaW9uIDIuOAogICAqICBAc2luY2UgICAyLjgKICAgKiAgQHRwYXJhbSBBICAgIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24KICAgKiAgQHRwYXJhbSBSZXByIHRoZSB0eXBlIG9mIHRoZSBhY3R1YWwgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBlbGVtZW50cy4KICAgKgogICAqICBAZGVmaW5lIENvbGwgVHJhdmVyc2FibGUKICAgKiAgQGRlZmluZSBjb2xsIHRyYXZlcnNhYmxlIGNvbGxlY3Rpb24KICAgKi8KICB0cmFpdCBUcmF2ZXJzYWJsZUxpa2VbK0EsICtSZXByXSBleHRlbmRzIEhhc05ld0J1aWxkZXJbQSwgUmVwcl0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBGaWx0ZXJNb25hZGljW0EsIFJlcHJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBUcmF2ZXJzYWJsZU9uY2VbQV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIEdlblRyYXZlcnNhYmxlTGlrZVtBLCBSZXByXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggUGFyYWxsZWxpemFibGVbQSwgUGFySXRlcmFibGVbQV1dCiAgewogICAgc2VsZiA9PgoKICAgIGltcG9ydCBUcmF2ZXJzYWJsZS5icmVha3MuXwoKICAgIC8qKiBUaGUgdHlwZSBpbXBsZW1lbnRpbmcgdGhpcyB0cmF2ZXJzYWJsZSAqLwogICAgcHJvdGVjdGVkIHR5cGUgU2VsZiA9IFJlcHIKCiAgICAvKiogVGhlIGNvbGxlY3Rpb24gb2YgdHlwZSAkY29sbCB1bmRlcmx5aW5nIHRoaXMgYFRyYXZlcnNhYmxlTGlrZWAgb2JqZWN0LgogICAgICogIEJ5IGRlZmF1bHQgdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyB0aGUgYFRyYXZlcnNhYmxlTGlrZWAgb2JqZWN0IGl0c2VsZiwKICAgICAqICBidXQgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbi4KICAgICAqLwogICAgZGVmIHJlcHI6IFJlcHIgPSB0aGlzLmFzSW5zdGFuY2VPZltSZXByXQoKICAgIC8qKiBUaGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIHNlZW4gYXMgYW4gaW5zdGFuY2Ugb2YgYCRDb2xsYC4KICAgICAqICBCeSBkZWZhdWx0IHRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBvYmplY3QgaXRzZWxmLAogICAgICogIGJ1dCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuLgogICAgICovCiAgICBwcm90ZWN0ZWRbdGhpc10gZGVmIHRoaXNDb2xsZWN0aW9uOiBUcmF2ZXJzYWJsZVtBXSA9IHRoaXMuYXNJbnN0YW5jZU9mW1RyYXZlcnNhYmxlW0FdXQoKICAgIC8qKiBBIGNvbnZlcnNpb24gZnJvbSBjb2xsZWN0aW9ucyBvZiB0eXBlIGBSZXByYCB0byBgJENvbGxgIG9iamVjdHMuCiAgICAgKiAgQnkgZGVmYXVsdCB0aGlzIGlzIGltcGxlbWVudGVkIGFzIGp1c3QgYSBjYXN0LCBidXQgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbi4KICAgICAqLwogICAgcHJvdGVjdGVkW3RoaXNdIGRlZiB0b0NvbGxlY3Rpb24ocmVwcjogUmVwcik6IFRyYXZlcnNhYmxlW0FdID0gcmVwci5hc0luc3RhbmNlT2ZbVHJhdmVyc2FibGVbQV1dCgogICAgLyoqIENyZWF0ZXMgYSBuZXcgYnVpbGRlciBmb3IgdGhpcyBjb2xsZWN0aW9uIHR5cGUuCiAgICAgKi8KICAgIHByb3RlY3RlZFt0aGlzXSBkZWYgbmV3QnVpbGRlcjogQnVpbGRlcltBLCBSZXByXQoKICAgIHByb3RlY3RlZFt0aGlzXSBkZWYgcGFyQ29tYmluZXIgPSBQYXJJdGVyYWJsZS5uZXdDb21iaW5lcltBXQoKICAgIC8qKiBBcHBsaWVzIGEgZnVuY3Rpb24gYGZgIHRvIGFsbCBlbGVtZW50cyBvZiB0aGlzICRjb2xsLgogICAgICogIAogICAgICogICAgTm90ZTogdGhpcyBtZXRob2QgdW5kZXJsaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBtb3N0IG90aGVyIGJ1bGsgb3BlcmF0aW9ucy4KICAgICAqICAgIEl0J3MgaW1wb3J0YW50IHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZCBpbiBhbiBlZmZpY2llbnQgd2F5LgogICAgICogIAogICAgICoKICAgICAqICBAcGFyYW0gIGYgICB0aGUgZnVuY3Rpb24gdGhhdCBpcyBhcHBsaWVkIGZvciBpdHMgc2lkZS1lZmZlY3QgdG8gZXZlcnkgZWxlbWVudC4KICAgICAqICAgICAgICAgICAgICBUaGUgcmVzdWx0IG9mIGZ1bmN0aW9uIGBmYCBpcyBkaXNjYXJkZWQuCiAgICAgKiAgICAgICAgICAgICAgCiAgICAgKiAgQHRwYXJhbSAgVSAgdGhlIHR5cGUgcGFyYW1ldGVyIGRlc2NyaWJpbmcgdGhlIHJlc3VsdCBvZiBmdW5jdGlvbiBgZmAuIAogICAgICogICAgICAgICAgICAgIFRoaXMgcmVzdWx0IHdpbGwgYWx3YXlzIGJlIGlnbm9yZWQuIFR5cGljYWxseSBgVWAgaXMgYFVuaXRgLAogICAgICogICAgICAgICAgICAgIGJ1dCB0aGlzIGlzIG5vdCBuZWNlc3NhcnkuCiAgICAgKgogICAgICogIEB1c2VjYXNlIGRlZiBmb3JlYWNoKGY6IEEgPT4gVW5pdCk6IFVuaXQKICAgICAqLwogICAgZGVmIGZvcmVhY2hbVV0oZjogQSA9PiBVKTogVW5pdAoKICAgIC8qKiBUZXN0cyB3aGV0aGVyIHRoaXMgJGNvbGwgaXMgZW1wdHkuCiAgICAgKgogICAgICogIEByZXR1cm4gICAgYHRydWVgIGlmIHRoZSAkY29sbCBjb250YWluIG5vIGVsZW1lbnRzLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAqLwogICAgZGVmIGlzRW1wdHk6IEJvb2xlYW4gPSB7CiAgICAgIHZhciByZXN1bHQgPSB0cnVlCiAgICAgIGJyZWFrYWJsZSB7CiAgICAgICAgZm9yICh4IDwtIHRoaXMpIHsKICAgICAgICAgIHJlc3VsdCA9IGZhbHNlCiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgfQogICAgICByZXN1bHQKICAgIH0KCiAgICAvKiogVGVzdHMgd2hldGhlciB0aGlzICRjb2xsIGlzIGtub3duIHRvIGhhdmUgYSBmaW5pdGUgc2l6ZS4KICAgICAqICBBbGwgc3RyaWN0IGNvbGxlY3Rpb25zIGFyZSBrbm93biB0byBoYXZlIGZpbml0ZSBzaXplLiBGb3IgYSBub24tc3RyaWN0IGNvbGxlY3Rpb24KICAgICAqICBzdWNoIGFzIGBTdHJlYW1gLCB0aGUgcHJlZGljYXRlIHJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBoYXZlIGJlZW4gY29tcHV0ZWQuCiAgICAgKiAgSXQgcmV0dXJucyBgZmFsc2VgIGlmIHRoZSBzdHJlYW0gaXMgbm90IHlldCBldmFsdWF0ZWQgdG8gdGhlIGVuZC4KICAgICAqCiAgICAgKiAgTm90ZTogbWFueSBjb2xsZWN0aW9uIG1ldGhvZHMgd2lsbCBub3Qgd29yayBvbiBjb2xsZWN0aW9ucyBvZiBpbmZpbml0ZSBzaXplcy4gCiAgICAgKgogICAgICogIEByZXR1cm4gIGB0cnVlYCBpZiB0aGlzIGNvbGxlY3Rpb24gaXMga25vd24gdG8gaGF2ZSBmaW5pdGUgc2l6ZSwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgKi8KICAgIGRlZiBoYXNEZWZpbml0ZVNpemUgPSB0cnVlCgogICAgZGVmICsrW0IgPjogQSwgVGhhdF0odGhhdDogR2VuVHJhdmVyc2FibGVPbmNlW0JdKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICBpZiAodGhhdC5pc0luc3RhbmNlT2ZbSW5kZXhlZFNlcUxpa2VbXywgX11dKSBiLnNpemVIaW50KHRoaXMsIHRoYXQuc2VxLnNpemUpCiAgICAgIGIgKys9IHRoaXNDb2xsZWN0aW9uCiAgICAgIGIgKys9IHRoYXQuc2VxCiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgQGJyaWRnZQogICAgZGVmICsrW0IgPjogQSwgVGhhdF0odGhhdDogVHJhdmVyc2FibGVPbmNlW0JdKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9CiAgICAgICsrKHRoYXQ6IEdlblRyYXZlcnNhYmxlT25jZVtCXSkoYmYpCgogICAgLyoqIENvbmNhdGVuYXRlcyB0aGlzICRjb2xsIHdpdGggdGhlIGVsZW1lbnRzIG9mIGEgdHJhdmVyc2FibGUgY29sbGVjdGlvbi4KICAgICAqICBJdCBkaWZmZXJzIGZyb20gKysgaW4gdGhhdCB0aGUgcmlnaHQgb3BlcmFuZCBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHRoZQogICAgICogIHJlc3VsdGluZyBjb2xsZWN0aW9uIHJhdGhlciB0aGFuIHRoZSBsZWZ0IG9uZS4KICAgICAqIAogICAgICogIEBwYXJhbSB0aGF0ICAgdGhlIHRyYXZlcnNhYmxlIHRvIGFwcGVuZC4KICAgICAqICBAdHBhcmFtIEIgICAgIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIHJldHVybmVkIGNvbGxlY3Rpb24uIAogICAgICogIEB0cGFyYW0gVGhhdCAgJHRoYXRpbmZvCiAgICAgKiAgQHBhcmFtIGJmICAgICAkYmZpbmZvCiAgICAgKiAgQHJldHVybiAgICAgICBhIG5ldyBjb2xsZWN0aW9uIG9mIHR5cGUgYFRoYXRgIHdoaWNoIGNvbnRhaW5zIGFsbCBlbGVtZW50cwogICAgICogICAgICAgICAgICAgICAgb2YgdGhpcyAkY29sbCBmb2xsb3dlZCBieSBhbGwgZWxlbWVudHMgb2YgYHRoYXRgLgogICAgICogCiAgICAgKiAgQHVzZWNhc2UgZGVmICsrOltCXSh0aGF0OiBUcmF2ZXJzYWJsZU9uY2VbQl0pOiAkQ29sbFtCXQogICAgICogIAogICAgICogIEByZXR1cm4gICAgICAgYSBuZXcgJGNvbGwgd2hpY2ggY29udGFpbnMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwKICAgICAqICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IGFsbCBlbGVtZW50cyBvZiBgdGhhdGAuCiAgICAgKi8KICAgIGRlZiArKzpbQiA+OiBBLCBUaGF0XSh0aGF0OiBUcmF2ZXJzYWJsZU9uY2VbQl0pKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgIGlmICh0aGF0LmlzSW5zdGFuY2VPZltJbmRleGVkU2VxTGlrZVtfLCBfXV0pIGIuc2l6ZUhpbnQodGhpcywgdGhhdC5zaXplKQogICAgICBiICsrPSB0aGF0CiAgICAgIGIgKys9IHRoaXNDb2xsZWN0aW9uCiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgLyoqIFRoaXMgb3ZlcmxvYWQgZXhpc3RzIGJlY2F1c2U6IGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YgKys6IHdlIHNob3VsZCByZXVzZQogICAgICogIHRoYXQgb2YgKysgYmVjYXVzZSBtYW55IGNvbGxlY3Rpb25zIG92ZXJyaWRlIGl0IHdpdGggbW9yZSBlZmZpY2llbnQgdmVyc2lvbnMuCiAgICAgKiAgU2luY2UgVHJhdmVyc2FibGVPbmNlIGhhcyBubyAnKysnIG1ldGhvZCwgd2UgaGF2ZSB0byBpbXBsZW1lbnQgdGhhdCBkaXJlY3RseSwKICAgICAqICBidXQgVHJhdmVyc2FibGUgYW5kIGRvd24gY2FuIHVzZSB0aGUgb3ZlcmxvYWQuCiAgICAgKi8KICAgIGRlZiArKzpbQiA+OiBBLCBUaGF0XSh0aGF0OiBUcmF2ZXJzYWJsZVtCXSkoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPQogICAgICAodGhhdCArKyBzZXEpKGJyZWFrT3V0KQoKICAgIGRlZiBtYXBbQiwgVGhhdF0oZjogQSA9PiBCKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICBiLnNpemVIaW50KHRoaXMpIAogICAgICBmb3IgKHggPC0gdGhpcykgYiArPSBmKHgpCiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgZGVmIGZsYXRNYXBbQiwgVGhhdF0oZjogQSA9PiBHZW5UcmF2ZXJzYWJsZU9uY2VbQl0pKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgIGZvciAoeCA8LSB0aGlzKSBiICsrPSBmKHgpLnNlcQogICAgICBiLnJlc3VsdAogICAgfQoKICAgIC8qKiBTZWxlY3RzIGFsbCBlbGVtZW50cyBvZiB0aGlzICRjb2xsIHdoaWNoIHNhdGlzZnkgYSBwcmVkaWNhdGUuCiAgICAgKgogICAgICogIEBwYXJhbSBwICAgICB0aGUgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCBlbGVtZW50cy4KICAgICAqICBAcmV0dXJuICAgICAgYSBuZXcgJGNvbGwgY29uc2lzdGluZyBvZiBhbGwgZWxlbWVudHMgb2YgdGhpcyAkY29sbCB0aGF0IHNhdGlzZnkgdGhlIGdpdmVuCiAgICAgKiAgICAgICAgICAgICAgIHByZWRpY2F0ZSBgcGAuIFRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaXMgcHJlc2VydmVkLgogICAgICovCiAgICBkZWYgZmlsdGVyKHA6IEEgPT4gQm9vbGVhbik6IFJlcHIgPSB7CiAgICAgIHZhbCBiID0gbmV3QnVpbGRlcgogICAgICBmb3IgKHggPC0gdGhpcykgCiAgICAgICAgaWYgKHAoeCkpIGIgKz0geAogICAgICBiLnJlc3VsdAogICAgfQoKICAgIC8qKiBTZWxlY3RzIGFsbCBlbGVtZW50cyBvZiB0aGlzICRjb2xsIHdoaWNoIGRvIG5vdCBzYXRpc2Z5IGEgcHJlZGljYXRlLgogICAgICoKICAgICAqICBAcGFyYW0gcCAgICAgdGhlIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3QgZWxlbWVudHMuCiAgICAgKiAgQHJldHVybiAgICAgIGEgbmV3ICRjb2xsIGNvbnNpc3Rpbmcgb2YgYWxsIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwgdGhhdCBkbyBub3Qgc2F0aXNmeSB0aGUgZ2l2ZW4KICAgICAqICAgICAgICAgICAgICAgcHJlZGljYXRlIGBwYC4gVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpcyBwcmVzZXJ2ZWQuCiAgICAgKi8KICAgIGRlZiBmaWx0ZXJOb3QocDogQSA9PiBCb29sZWFuKTogUmVwciA9IGZpbHRlcighcChfKSkKCiAgICBkZWYgY29sbGVjdFtCLCBUaGF0XShwZjogUGFydGlhbEZ1bmN0aW9uW0EsIEJdKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICBmb3IgKHggPC0gdGhpcykgaWYgKHBmLmlzRGVmaW5lZEF0KHgpKSBiICs9IHBmKHgpCiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgLyoqIEJ1aWxkcyBhIG5ldyBjb2xsZWN0aW9uIGJ5IGFwcGx5aW5nIGFuIG9wdGlvbi12YWx1ZWQgZnVuY3Rpb24gdG8gYWxsCiAgICAgKiAgZWxlbWVudHMgb2YgdGhpcyAkY29sbCBvbiB3aGljaCB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZC4KICAgICAqCiAgICAgKiAgQHBhcmFtIGYgICAgICB0aGUgb3B0aW9uLXZhbHVlZCBmdW5jdGlvbiB3aGljaCBmaWx0ZXJzIGFuZCBtYXBzIHRoZSAkY29sbC4KICAgICAqICBAdHBhcmFtIEIgICAgIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIHJldHVybmVkIGNvbGxlY3Rpb24uCiAgICAgKiAgQHRwYXJhbSBUaGF0ICAkdGhhdGluZm8KICAgICAqICBAcGFyYW0gYmYgICAgICRiZmluZm8KICAgICAqICBAcmV0dXJuICAgICAgIGEgbmV3IGNvbGxlY3Rpb24gb2YgdHlwZSBgVGhhdGAgcmVzdWx0aW5nIGZyb20gYXBwbHlpbmcgdGhlIG9wdGlvbi12YWx1ZWQgZnVuY3Rpb24KICAgICAqICAgICAgICAgICAgICAgIGBmYCB0byBlYWNoIGVsZW1lbnQgYW5kIGNvbGxlY3RpbmcgYWxsIGRlZmluZWQgcmVzdWx0cy4KICAgICAqICAgICAgICAgICAgICAgIFRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaXMgcHJlc2VydmVkLgogICAgICoKICAgICAqICBAdXNlY2FzZSBkZWYgZmlsdGVyTWFwW0JdKGY6IEEgPT4gT3B0aW9uW0JdKTogJENvbGxbQl0KICAgICAqICAKICAgICAqICBAcGFyYW0gcGYgICAgIHRoZSBwYXJ0aWFsIGZ1bmN0aW9uIHdoaWNoIGZpbHRlcnMgYW5kIG1hcHMgdGhlICRjb2xsLgogICAgICogIEByZXR1cm4gICAgICAgYSBuZXcgJGNvbGwgcmVzdWx0aW5nIGZyb20gYXBwbHlpbmcgdGhlIGdpdmVuIG9wdGlvbi12YWx1ZWQgZnVuY3Rpb24KICAgICAqICAgICAgICAgICAgICAgIGBmYCB0byBlYWNoIGVsZW1lbnQgYW5kIGNvbGxlY3RpbmcgYWxsIGRlZmluZWQgcmVzdWx0cy4KICAgICAqICAgICAgICAgICAgICAgIFRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaXMgcHJlc2VydmVkLgogICAgZGVmIGZpbHRlck1hcFtCLCBUaGF0XShmOiBBID0+IE9wdGlvbltCXSkoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgZm9yICh4IDwtIHRoaXMpIAogICAgICAgIGYoeCkgbWF0Y2ggewogICAgICAgICAgY2FzZSBTb21lKHkpID0+IGIgKz0geQogICAgICAgICAgY2FzZSBfID0+CiAgICAgICAgfQogICAgICBiLnJlc3VsdAogICAgfQogICAgICovCgogICAgLyoqIFBhcnRpdGlvbnMgdGhpcyAkY29sbCBpbiB0d28gJHtjb2xsfXMgYWNjb3JkaW5nIHRvIGEgcHJlZGljYXRlLgogICAgICoKICAgICAqICBAcGFyYW0gcCB0aGUgcHJlZGljYXRlIG9uIHdoaWNoIHRvIHBhcnRpdGlvbi4KICAgICAqICBAcmV0dXJuICBhIHBhaXIgb2YgJHtjb2xsfXM6IHRoZSBmaXJzdCAkY29sbCBjb25zaXN0cyBvZiBhbGwgZWxlbWVudHMgdGhhdCAKICAgICAqICAgICAgICAgICBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgYHBgIGFuZCB0aGUgc2Vjb25kICRjb2xsIGNvbnNpc3RzIG9mIGFsbCBlbGVtZW50cwogICAgICogICAgICAgICAgIHRoYXQgZG9uJ3QuIFRoZSByZWxhdGl2ZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyAke2NvbGx9cwogICAgICogICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBvcmlnaW5hbCAkY29sbC4KICAgICAqLwogICAgZGVmIHBhcnRpdGlvbihwOiBBID0+IEJvb2xlYW4pOiAoUmVwciwgUmVwcikgPSB7CiAgICAgIHZhbCBsLCByID0gbmV3QnVpbGRlcgogICAgICBmb3IgKHggPC0gdGhpcykgKGlmIChwKHgpKSBsIGVsc2UgcikgKz0geAogICAgICAobC5yZXN1bHQsIHIucmVzdWx0KQogICAgfQoKICAgIGRlZiBncm91cEJ5W0tdKGY6IEEgPT4gSyk6IGltbXV0YWJsZS5NYXBbSywgUmVwcl0gPSB7CiAgICAgIHZhbCBtID0gbXV0YWJsZS5NYXAuZW1wdHlbSywgQnVpbGRlcltBLCBSZXByXV0KICAgICAgZm9yIChlbGVtIDwtIHRoaXMpIHsKICAgICAgICB2YWwga2V5ID0gZihlbGVtKQogICAgICAgIHZhbCBibGRyID0gbS5nZXRPckVsc2VVcGRhdGUoa2V5LCBuZXdCdWlsZGVyKQogICAgICAgIGJsZHIgKz0gZWxlbQogICAgICB9CiAgICAgIHZhbCBiID0gaW1tdXRhYmxlLk1hcC5uZXdCdWlsZGVyW0ssIFJlcHJdCiAgICAgIGZvciAoKGssIHYpIDwtIG0pCiAgICAgICAgYiArPSAoKGssIHYucmVzdWx0KSkKCiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgLyoqIFRlc3RzIHdoZXRoZXIgYSBwcmVkaWNhdGUgaG9sZHMgZm9yIGFsbCBlbGVtZW50cyBvZiB0aGlzICRjb2xsLgogICAgICoKICAgICAqICAkbWF5Tm90VGVybWluYXRlSW5mCiAgICAgKgogICAgICogIEBwYXJhbSAgIHAgICAgIHRoZSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IGVsZW1lbnRzLgogICAgICogIEByZXR1cm4gICAgICAgIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcHJlZGljYXRlIGBwYCBob2xkcyBmb3IgYWxsIGVsZW1lbnRzCiAgICAgKiAgICAgICAgICAgICAgICAgb2YgdGhpcyAkY29sbCwgb3RoZXJ3aXNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGRlZiBmb3JhbGwocDogQSA9PiBCb29sZWFuKTogQm9vbGVhbiA9IHsKICAgICAgdmFyIHJlc3VsdCA9IHRydWUKICAgICAgYnJlYWthYmxlIHsKICAgICAgICBmb3IgKHggPC0gdGhpcykKICAgICAgICAgIGlmICghcCh4KSkgeyByZXN1bHQgPSBmYWxzZTsgYnJlYWsgfQogICAgICB9CiAgICAgIHJlc3VsdAogICAgfQoKICAgIC8qKiBUZXN0cyB3aGV0aGVyIGEgcHJlZGljYXRlIGhvbGRzIGZvciBzb21lIG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzICRjb2xsLgogICAgICoKICAgICAqICAkbWF5Tm90VGVybWluYXRlSW5mCiAgICAgKgogICAgICogIEBwYXJhbSAgIHAgICAgIHRoZSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IGVsZW1lbnRzLgogICAgICogIEByZXR1cm4gICAgICAgIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcHJlZGljYXRlIGBwYCBob2xkcyBmb3Igc29tZSBvZiB0aGUKICAgICAqICAgICAgICAgICAgICAgICBlbGVtZW50cyBvZiB0aGlzICRjb2xsLCBvdGhlcndpc2UgYGZhbHNlYC4KICAgICAqLwogICAgZGVmIGV4aXN0cyhwOiBBID0+IEJvb2xlYW4pOiBCb29sZWFuID0gewogICAgICB2YXIgcmVzdWx0ID0gZmFsc2UKICAgICAgYnJlYWthYmxlIHsKICAgICAgICBmb3IgKHggPC0gdGhpcykKICAgICAgICAgIGlmIChwKHgpKSB7IHJlc3VsdCA9IHRydWU7IGJyZWFrIH0KICAgICAgfQogICAgICByZXN1bHQKICAgIH0KCiAgICAvKiogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlICRjb2xsIHNhdGlzZnlpbmcgYSBwcmVkaWNhdGUsIGlmIGFueS4KICAgICAqIAogICAgICogICRtYXlOb3RUZXJtaW5hdGVJbmYKICAgICAqICAkb3JkZXJEZXBlbmRlbnQKICAgICAqCiAgICAgKiAgQHBhcmFtIHAgICAgdGhlIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3QgZWxlbWVudHMuCiAgICAgKiAgQHJldHVybiAgICAgYW4gb3B0aW9uIHZhbHVlIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICRjb2xsCiAgICAgKiAgICAgICAgICAgICAgdGhhdCBzYXRpc2ZpZXMgYHBgLCBvciBgTm9uZWAgaWYgbm9uZSBleGlzdHMuCiAgICAgKi8KICAgIGRlZiBmaW5kKHA6IEEgPT4gQm9vbGVhbik6IE9wdGlvbltBXSA9IHsKICAgICAgdmFyIHJlc3VsdDogT3B0aW9uW0FdID0gTm9uZQogICAgICBicmVha2FibGUgewogICAgICAgIGZvciAoeCA8LSB0aGlzKQogICAgICAgICAgaWYgKHAoeCkpIHsgcmVzdWx0ID0gU29tZSh4KTsgYnJlYWsgfQogICAgICB9CiAgICAgIHJlc3VsdAogICAgfQoKICAgIGRlZiBzY2FuW0IgPjogQSwgVGhhdF0oejogQikob3A6IChCLCBCKSA9PiBCKShpbXBsaWNpdCBjYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSBzY2FuTGVmdCh6KShvcCkKCiAgICBkZWYgc2NhbkxlZnRbQiwgVGhhdF0oejogQikob3A6IChCLCBBKSA9PiBCKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICBiLnNpemVIaW50KHRoaXMsIDEpCiAgICAgIHZhciBhY2MgPSB6CiAgICAgIGIgKz0gYWNjCiAgICAgIGZvciAoeCA8LSB0aGlzKSB7IGFjYyA9IG9wKGFjYywgeCk7IGIgKz0gYWNjIH0KICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICBAbWlncmF0aW9uKDIsIDksCiAgICAgICJUaGlzIHNjYW5SaWdodCBkZWZpbml0aW9uIGhhcyBjaGFuZ2VkIGluIDIuOS5cbiIgKwogICAgICAiVGhlIHByZXZpb3VzIGJlaGF2aW9yIGNhbiBiZSByZXByb2R1Y2VkIHdpdGggc2NhblJpZ2h0LnJldmVyc2UuIgogICAgKQogICAgZGVmIHNjYW5SaWdodFtCLCBUaGF0XSh6OiBCKShvcDogKEEsIEIpID0+IEIpKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICB2YXIgc2Nhbm5lZCA9IExpc3QoeikKICAgICAgdmFyIGFjYyA9IHoKICAgICAgZm9yICh4IDwtIHJldmVyc2VkKSB7CiAgICAgICAgYWNjID0gb3AoeCwgYWNjKQogICAgICAgIHNjYW5uZWQgOjo9IGFjYwogICAgICB9CiAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgZm9yIChlbGVtIDwtIHNjYW5uZWQpIGIgKz0gZWxlbQogICAgICBiLnJlc3VsdAogICAgfQoKICAgIC8qKiBTZWxlY3RzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMgJGNvbGwuCiAgICAgKiAgJG9yZGVyRGVwZW5kZW50CiAgICAgKiAgQHJldHVybiAgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyAkY29sbC4KICAgICAqICBAdGhyb3dzIGBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uYCBpZiB0aGUgJGNvbGwgaXMgZW1wdHkuCiAgICAgKi8KICAgIGRlZiBoZWFkOiBBID0gewogICAgICB2YXIgcmVzdWx0OiAoKSA9PiBBID0gKCkgPT4gdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KICAgICAgYnJlYWthYmxlIHsKICAgICAgICBmb3IgKHggPC0gdGhpcykgewogICAgICAgICAgcmVzdWx0ID0gKCkgPT4geAogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdWx0KCkKICAgIH0KCiAgICAvKiogT3B0aW9uYWxseSBzZWxlY3RzIHRoZSBmaXJzdCBlbGVtZW50LgogICAgICogICRvcmRlckRlcGVuZGVudAogICAgICogIEByZXR1cm4gIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMgJGNvbGwgaWYgaXQgaXMgbm9uZW1wdHksIGBOb25lYCBpZiBpdCBpcyBlbXB0eS4KICAgICAqLwogICAgZGVmIGhlYWRPcHRpb246IE9wdGlvbltBXSA9IGlmIChpc0VtcHR5KSBOb25lIGVsc2UgU29tZShoZWFkKQoKICAgIC8qKiBTZWxlY3RzIGFsbCBlbGVtZW50cyBleGNlcHQgdGhlIGZpcnN0LgogICAgICogICRvcmRlckRlcGVuZGVudAogICAgICogIEByZXR1cm4gIGEgJGNvbGwgY29uc2lzdGluZyBvZiBhbGwgZWxlbWVudHMgb2YgdGhpcyAkY29sbAogICAgICogICAgICAgICAgIGV4Y2VwdCB0aGUgZmlyc3Qgb25lLgogICAgICogIEB0aHJvd3MgYFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uYCBpZiB0aGUgJGNvbGwgaXMgZW1wdHkuCiAgICAgKi8gCiAgICBvdmVycmlkZSBkZWYgdGFpbDogUmVwciA9IHsKICAgICAgaWYgKGlzRW1wdHkpIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZW1wdHkudGFpbCIpCiAgICAgIGRyb3AoMSkKICAgIH0KCiAgICAvKiogU2VsZWN0cyB0aGUgbGFzdCBlbGVtZW50LgogICAgICAqICRvcmRlckRlcGVuZGVudAogICAgICAqIEByZXR1cm4gVGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzICRjb2xsLgogICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBJZiB0aGUgJGNvbGwgaXMgZW1wdHkuCiAgICAgICovCiAgICBkZWYgbGFzdDogQSA9IHsKICAgICAgdmFyIGxzdCA9IGhlYWQKICAgICAgZm9yICh4IDwtIHRoaXMpCiAgICAgICAgbHN0ID0geAogICAgICBsc3QKICAgIH0KCiAgICAvKiogT3B0aW9uYWxseSBzZWxlY3RzIHRoZSBsYXN0IGVsZW1lbnQuCiAgICAgKiAgJG9yZGVyRGVwZW5kZW50CiAgICAgKiAgQHJldHVybiAgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzICRjb2xsJCBpZiBpdCBpcyBub25lbXB0eSwgYE5vbmVgIGlmIGl0IGlzIGVtcHR5LgogICAgICovCiAgICBkZWYgbGFzdE9wdGlvbjogT3B0aW9uW0FdID0gaWYgKGlzRW1wdHkpIE5vbmUgZWxzZSBTb21lKGxhc3QpCgogICAgLyoqIFNlbGVjdHMgYWxsIGVsZW1lbnRzIGV4Y2VwdCB0aGUgbGFzdC4KICAgICAqICAkb3JkZXJEZXBlbmRlbnQKICAgICAqICBAcmV0dXJuICBhICRjb2xsIGNvbnNpc3Rpbmcgb2YgYWxsIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwKICAgICAqICAgICAgICAgICBleGNlcHQgdGhlIGxhc3Qgb25lLgogICAgICogIEB0aHJvd3MgYFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uYCBpZiB0aGUgJGNvbGwgaXMgZW1wdHkuCiAgICAgKi8KICAgIGRlZiBpbml0OiBSZXByID0gewogICAgICBpZiAoaXNFbXB0eSkgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJlbXB0eS5pbml0IikKICAgICAgdmFyIGxzdCA9IGhlYWQKICAgICAgdmFyIGZvbGxvdyA9IGZhbHNlCiAgICAgIHZhbCBiID0gbmV3QnVpbGRlcgogICAgICBiLnNpemVIaW50KHRoaXMsIC0xKQogICAgICBmb3IgKHggPC0gdGhpcy5zZXEpIHsKICAgICAgICBpZiAoZm9sbG93KSBiICs9IGxzdAogICAgICAgIGVsc2UgZm9sbG93ID0gdHJ1ZQogICAgICAgIGxzdCA9IHgKICAgICAgfQogICAgICBiLnJlc3VsdAogICAgfQoKICAgIGRlZiB0YWtlKG46IEludCk6IFJlcHIgPSBzbGljZSgwLCBuKQoKICAgIGRlZiBkcm9wKG46IEludCk6IFJlcHIgPSAKICAgICAgaWYgKG4gPD0gMCkgewogICAgICAgIHZhbCBiID0gbmV3QnVpbGRlcgogICAgICAgIGIuc2l6ZUhpbnQodGhpcykKICAgICAgICBiICsrPSB0aGlzQ29sbGVjdGlvbiByZXN1bHQKICAgICAgfQogICAgICBlbHNlIHNsaWNlV2l0aEtub3duRGVsdGEobiwgSW50Lk1heFZhbHVlLCAtbikKCiAgICBkZWYgc2xpY2UoZnJvbTogSW50LCB1bnRpbDogSW50KTogUmVwciA9IHNsaWNlV2l0aEtub3duQm91bmQobWF0aC5tYXgoZnJvbSwgMCksIHVudGlsKQoKICAgIC8vIFByZWNvbmRpdGlvbjogZnJvbSA+PSAwLCB1bnRpbCA+IDAsIGJ1aWxkZXIgYWxyZWFkeSBjb25maWd1cmVkIGZvciBidWlsZGluZy4KICAgIHByaXZhdGVbdGhpc10gZGVmIHNsaWNlSW50ZXJuYWwoZnJvbTogSW50LCB1bnRpbDogSW50LCBiOiBCdWlsZGVyW0EsIFJlcHJdKTogUmVwciA9IHsKICAgICAgdmFyIGkgPSAwCiAgICAgIGJyZWFrYWJsZSB7CiAgICAgICAgZm9yICh4IDwtIHRoaXMuc2VxKSB7CiAgICAgICAgICBpZiAoaSA+PSBmcm9tKSBiICs9IHgKICAgICAgICAgIGkgKz0gMQogICAgICAgICAgaWYgKGkgPj0gdW50aWwpIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICAgIGIucmVzdWx0CiAgICB9CiAgICAvLyBQcmVjb25kaXRpb246IGZyb20gPj0gMAogICAgcHJpdmF0ZVtzY2FsYV0gZGVmIHNsaWNlV2l0aEtub3duRGVsdGEoZnJvbTogSW50LCB1bnRpbDogSW50LCBkZWx0YTogSW50KTogUmVwciA9IHsKICAgICAgdmFsIGIgPSBuZXdCdWlsZGVyCiAgICAgIGlmICh1bnRpbCA8PSBmcm9tKSBiLnJlc3VsdAogICAgICBlbHNlIHsKICAgICAgICBiLnNpemVIaW50KHRoaXMsIGRlbHRhKQogICAgICAgIHNsaWNlSW50ZXJuYWwoZnJvbSwgdW50aWwsIGIpCiAgICAgIH0KICAgIH0KICAgIC8vIFByZWNvbmRpdGlvbjogZnJvbSA+PSAwCiAgICBwcml2YXRlW3NjYWxhXSBkZWYgc2xpY2VXaXRoS25vd25Cb3VuZChmcm9tOiBJbnQsIHVudGlsOiBJbnQpOiBSZXByID0gewogICAgICB2YWwgYiA9IG5ld0J1aWxkZXIKICAgICAgaWYgKHVudGlsIDw9IGZyb20pIGIucmVzdWx0CiAgICAgIGVsc2UgewogICAgICAgIGIuc2l6ZUhpbnRCb3VuZGVkKHVudGlsIC0gZnJvbSwgdGhpcykgICAgICAKICAgICAgICBzbGljZUludGVybmFsKGZyb20sIHVudGlsLCBiKQogICAgICB9CiAgICB9CgogICAgZGVmIHRha2VXaGlsZShwOiBBID0+IEJvb2xlYW4pOiBSZXByID0gewogICAgICB2YWwgYiA9IG5ld0J1aWxkZXIKICAgICAgYnJlYWthYmxlIHsKICAgICAgICBmb3IgKHggPC0gdGhpcykgewogICAgICAgICAgaWYgKCFwKHgpKSBicmVhawogICAgICAgICAgYiArPSB4CiAgICAgICAgfQogICAgICB9CiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgZGVmIGRyb3BXaGlsZShwOiBBID0+IEJvb2xlYW4pOiBSZXByID0gewogICAgICB2YWwgYiA9IG5ld0J1aWxkZXIKICAgICAgdmFyIGdvID0gZmFsc2UKICAgICAgZm9yICh4IDwtIHRoaXMpIHsKICAgICAgICBpZiAoIXAoeCkpIGdvID0gdHJ1ZQogICAgICAgIGlmIChnbykgYiArPSB4CiAgICAgIH0KICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICBkZWYgc3BhbihwOiBBID0+IEJvb2xlYW4pOiAoUmVwciwgUmVwcikgPSB7CiAgICAgIHZhbCBsLCByID0gbmV3QnVpbGRlcgogICAgICB2YXIgdG9MZWZ0ID0gdHJ1ZQogICAgICBmb3IgKHggPC0gdGhpcykgewogICAgICAgIHRvTGVmdCA9IHRvTGVmdCAmJiBwKHgpCiAgICAgICAgKGlmICh0b0xlZnQpIGwgZWxzZSByKSArPSB4CiAgICAgIH0KICAgICAgKGwucmVzdWx0LCByLnJlc3VsdCkKICAgIH0KCiAgICBkZWYgc3BsaXRBdChuOiBJbnQpOiAoUmVwciwgUmVwcikgPSB7CiAgICAgIHZhbCBsLCByID0gbmV3QnVpbGRlcgogICAgICBsLnNpemVIaW50Qm91bmRlZChuLCB0aGlzKQogICAgICBpZiAobiA+PSAwKSByLnNpemVIaW50KHRoaXMsIC1uKQogICAgICB2YXIgaSA9IDAKICAgICAgZm9yICh4IDwtIHRoaXMpIHsKICAgICAgICAoaWYgKGkgPCBuKSBsIGVsc2UgcikgKz0geAogICAgICAgIGkgKz0gMQogICAgICB9CiAgICAgIChsLnJlc3VsdCwgci5yZXN1bHQpCiAgICB9CgogICAgLyoqIEl0ZXJhdGVzIG92ZXIgdGhlIHRhaWxzIG9mIHRoaXMgJGNvbGwuIFRoZSBmaXJzdCB2YWx1ZSB3aWxsIGJlIHRoaXMKICAgICAqICAkY29sbCBhbmQgdGhlIGZpbmFsIG9uZSB3aWxsIGJlIGFuIGVtcHR5ICRjb2xsLCB3aXRoIHRoZSBpbnRlcnZlbmluZwogICAgICogIHZhbHVlcyB0aGUgcmVzdWx0cyBvZiBzdWNjZXNzaXZlIGFwcGxpY2F0aW9ucyBvZiBgdGFpbGAuCiAgICAgKgogICAgICogIEByZXR1cm4gICBhbiBpdGVyYXRvciBvdmVyIGFsbCB0aGUgdGFpbHMgb2YgdGhpcyAkY29sbAogICAgICogIEBleGFtcGxlICBgTGlzdCgxLDIsMykudGFpbHMgPSBJdGVyYXRvcihMaXN0KDEsMiwzKSwgTGlzdCgyLDMpLCBMaXN0KDMpLCBOaWwpYAogICAgICovICAKICAgIGRlZiB0YWlsczogSXRlcmF0b3JbUmVwcl0gPSBpdGVyYXRlVW50aWxFbXB0eShfLnRhaWwpCgogICAgLyoqIEl0ZXJhdGVzIG92ZXIgdGhlIGluaXRzIG9mIHRoaXMgJGNvbGwuIFRoZSBmaXJzdCB2YWx1ZSB3aWxsIGJlIHRoaXMKICAgICAqICAkY29sbCBhbmQgdGhlIGZpbmFsIG9uZSB3aWxsIGJlIGFuIGVtcHR5ICRjb2xsLCB3aXRoIHRoZSBpbnRlcnZlbmluZwogICAgICogIHZhbHVlcyB0aGUgcmVzdWx0cyBvZiBzdWNjZXNzaXZlIGFwcGxpY2F0aW9ucyBvZiBgaW5pdGAuCiAgICAgKgogICAgICogIEByZXR1cm4gIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBpbml0cyBvZiB0aGlzICRjb2xsCiAgICAgKiAgQGV4YW1wbGUgIGBMaXN0KDEsMiwzKS5pbml0cyA9IEl0ZXJhdG9yKExpc3QoMSwyLDMpLCBMaXN0KDEsMiksIExpc3QoMSksIE5pbClgCiAgICAgKi8KICAgIGRlZiBpbml0czogSXRlcmF0b3JbUmVwcl0gPSBpdGVyYXRlVW50aWxFbXB0eShfLmluaXQpCgogICAgLyoqIENvcGllcyBlbGVtZW50cyBvZiB0aGlzICRjb2xsIHRvIGFuIGFycmF5LgogICAgICogIEZpbGxzIHRoZSBnaXZlbiBhcnJheSBgeHNgIHdpdGggYXQgbW9zdCBgbGVuYCBlbGVtZW50cyBvZgogICAgICogIHRoaXMgJGNvbGwsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIGBzdGFydGAuCiAgICAgKiAgQ29weWluZyB3aWxsIHN0b3Agb25jZSBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCAkY29sbCBpcyByZWFjaGVkLAogICAgICogIG9yIHRoZSBlbmQgb2YgdGhlIGFycmF5IGlzIHJlYWNoZWQsIG9yIGBsZW5gIGVsZW1lbnRzIGhhdmUgYmVlbiBjb3BpZWQuCiAgICAgKgogICAgICogICR3aWxsTm90VGVybWluYXRlSW5mCiAgICAgKiAKICAgICAqICBAcGFyYW0gIHhzICAgICB0aGUgYXJyYXkgdG8gZmlsbC4KICAgICAqICBAcGFyYW0gIHN0YXJ0ICB0aGUgc3RhcnRpbmcgaW5kZXguCiAgICAgKiAgQHBhcmFtICBsZW4gICAgdGhlIG1heGltYWwgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkuCiAgICAgKiAgQHRwYXJhbSBCICAgICAgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheS4gCiAgICAgKiAKICAgICAqCiAgICAgKiAgQHVzZWNhc2UgZGVmIGNvcHlUb0FycmF5KHhzOiBBcnJheVtBXSwgc3RhcnQ6IEludCwgbGVuOiBJbnQpOiBVbml0CiAgICAgKi8KICAgIGRlZiBjb3B5VG9BcnJheVtCID46IEFdKHhzOiBBcnJheVtCXSwgc3RhcnQ6IEludCwgbGVuOiBJbnQpIHsKICAgICAgdmFyIGkgPSBzdGFydAogICAgICB2YWwgZW5kID0gKHN0YXJ0ICsgbGVuKSBtaW4geHMubGVuZ3RoCiAgICAgIGJyZWFrYWJsZSB7CiAgICAgICAgZm9yICh4IDwtIHRoaXMpIHsKICAgICAgICAgIGlmIChpID49IGVuZCkgYnJlYWsKICAgICAgICAgIHhzKGkpID0geAogICAgICAgICAgaSArPSAxCiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZGVmIHRvVHJhdmVyc2FibGU6IFRyYXZlcnNhYmxlW0FdID0gdGhpc0NvbGxlY3Rpb24KICAgIGRlZiB0b0l0ZXJhdG9yOiBJdGVyYXRvcltBXSA9IHRvU3RyZWFtLml0ZXJhdG9yCiAgICBkZWYgdG9TdHJlYW06IFN0cmVhbVtBXSA9IHRvQnVmZmVyLnRvU3RyZWFtCgogICAgLyoqIENvbnZlcnRzIHRoaXMgJGNvbGwgdG8gYSBzdHJpbmcuCiAgICAgKgogICAgICogIEByZXR1cm4gICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbGxlY3Rpb24uIEJ5IGRlZmF1bHQgdGhpcwogICAgICogICAgICAgICAgICBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGBzdHJpbmdQcmVmaXhgIG9mIHRoaXMgJGNvbGwsCiAgICAgKiAgICAgICAgICAgIGZvbGxvd2VkIGJ5IGFsbCBlbGVtZW50cyBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcy4KICAgICAqLwogICAgb3ZlcnJpZGUgZGVmIHRvU3RyaW5nID0gbWtTdHJpbmcoc3RyaW5nUHJlZml4ICsgIigiLCAiLCAiLCAiKSIpCgogICAgLyoqIERlZmluZXMgdGhlIHByZWZpeCBvZiB0aGlzIG9iamVjdCdzIGB0b1N0cmluZ2AgcmVwcmVzZW50YXRpb24uCiAgICAgKgogICAgICogIEByZXR1cm4gIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHdoaWNoIHN0YXJ0cyB0aGUgcmVzdWx0IG9mIGB0b1N0cmluZ2AKICAgICAqICAgICAgICAgICBhcHBsaWVkIHRvIHRoaXMgJGNvbGwuIEJ5IGRlZmF1bHQgdGhlIHN0cmluZyBwcmVmaXggaXMgdGhlCiAgICAgKiAgICAgICAgICAgc2ltcGxlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gY2xhc3MgJGNvbGwuCiAgICAgKi8KICAgIGRlZiBzdHJpbmdQcmVmaXggOiBTdHJpbmcgPSB7CiAgICAgIHZhciBzdHJpbmcgPSByZXByLmFzSW5zdGFuY2VPZltBbnlSZWZdLmdldENsYXNzLmdldE5hbWUKICAgICAgdmFsIGlkeDEgPSBzdHJpbmcubGFzdEluZGV4T2YoJy4nIDogSW50KQogICAgICBpZiAoaWR4MSAhPSAtMSkgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhpZHgxICsgMSkKICAgICAgdmFsIGlkeDIgPSBzdHJpbmcuaW5kZXhPZignJCcpCiAgICAgIGlmIChpZHgyICE9IC0xKSBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKDAsIGlkeDIpCiAgICAgIHN0cmluZwogICAgfQoKICAgIC8qKiBDcmVhdGVzIGEgbm9uLXN0cmljdCB2aWV3IG9mIHRoaXMgJGNvbGwuCiAgICAgKiAKICAgICAqICBAcmV0dXJuIGEgbm9uLXN0cmljdCB2aWV3IG9mIHRoaXMgJGNvbGwuCiAgICAgKi8KICAgIGRlZiB2aWV3ID0gbmV3IFRyYXZlcnNhYmxlVmlld1tBLCBSZXByXSB7CiAgICAgIHByb3RlY3RlZCBsYXp5IHZhbCB1bmRlcmx5aW5nID0gc2VsZi5yZXByCiAgICAgIG92ZXJyaWRlIGRlZiBmb3JlYWNoW1VdKGY6IEEgPT4gVSkgPSBzZWxmIGZvcmVhY2ggZgogICAgfQoKICAgIC8qKiBDcmVhdGVzIGEgbm9uLXN0cmljdCB2aWV3IG9mIGEgc2xpY2Ugb2YgdGhpcyAkY29sbC4KICAgICAqCiAgICAgKiAgTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBgdmlld2AgYW5kIGBzbGljZWAgaXMgdGhhdCBgdmlld2AgcHJvZHVjZXMKICAgICAqICAgICAgICBhIHZpZXcgb2YgdGhlIGN1cnJlbnQgJGNvbGwsIHdoZXJlYXMgYHNsaWNlYCBwcm9kdWNlcyBhIG5ldyAkY29sbC4KICAgICAqIAogICAgICogIE5vdGU6IGB2aWV3KGZyb20sIHRvKWAgaXMgZXF1aXZhbGVudCB0byBgdmlldy5zbGljZShmcm9tLCB0bylgCiAgICAgKiAgJG9yZGVyRGVwZW5kZW50CiAgICAgKiAKICAgICAqICBAcGFyYW0gZnJvbSAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgdmlldwogICAgICogIEBwYXJhbSB1bnRpbCAgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGZvbGxvd2luZyB0aGUgdmlldwogICAgICogIEByZXR1cm4gYSBub24tc3RyaWN0IHZpZXcgb2YgYSBzbGljZSBvZiB0aGlzICRjb2xsLCBzdGFydGluZyBhdCBpbmRleCBgZnJvbWAKICAgICAqICBhbmQgZXh0ZW5kaW5nIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgaW5kZXggYHVudGlsYC4KICAgICAqLwogICAgZGVmIHZpZXcoZnJvbTogSW50LCB1bnRpbDogSW50KTogVHJhdmVyc2FibGVWaWV3W0EsIFJlcHJdID0gdmlldy5zbGljZShmcm9tLCB1bnRpbCkKCiAgICAvKiogQ3JlYXRlcyBhIG5vbi1zdHJpY3QgZmlsdGVyIG9mIHRoaXMgJGNvbGwuCiAgICAgKgogICAgICogIE5vdGU6IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYGMgZmlsdGVyIHBgIGFuZCBgYyB3aXRoRmlsdGVyIHBgIGlzIHRoYXQKICAgICAqICAgICAgICB0aGUgZm9ybWVyIGNyZWF0ZXMgYSBuZXcgY29sbGVjdGlvbiwgd2hlcmVhcyB0aGUgbGF0dGVyIG9ubHkKICAgICAqICAgICAgICByZXN0cmljdHMgdGhlIGRvbWFpbiBvZiBzdWJzZXF1ZW50IGBtYXBgLCBgZmxhdE1hcGAsIGBmb3JlYWNoYCwKICAgICAqICAgICAgICBhbmQgYHdpdGhGaWx0ZXJgIG9wZXJhdGlvbnMuCiAgICAgKiAgJG9yZGVyRGVwZW5kZW50CiAgICAgKiAKICAgICAqICBAcGFyYW0gcCAgIHRoZSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IGVsZW1lbnRzLgogICAgICogIEByZXR1cm4gICAgYW4gb2JqZWN0IG9mIGNsYXNzIGBXaXRoRmlsdGVyYCwgd2hpY2ggc3VwcG9ydHMKICAgICAqICAgICAgICAgICAgIGBtYXBgLCBgZmxhdE1hcGAsIGBmb3JlYWNoYCwgYW5kIGB3aXRoRmlsdGVyYCBvcGVyYXRpb25zLgogICAgICogICAgICAgICAgICAgQWxsIHRoZXNlIG9wZXJhdGlvbnMgYXBwbHkgdG8gdGhvc2UgZWxlbWVudHMgb2YgdGhpcyAkY29sbCB3aGljaAogICAgICogICAgICAgICAgICAgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGBwYC4KICAgICAqLwogICAgZGVmIHdpdGhGaWx0ZXIocDogQSA9PiBCb29sZWFuKTogRmlsdGVyTW9uYWRpY1tBLCBSZXByXSA9IG5ldyBXaXRoRmlsdGVyKHApCgogICAgLyoqIEEgY2xhc3Mgc3VwcG9ydGluZyBmaWx0ZXJlZCBvcGVyYXRpb25zLiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUKICAgICAqICByZXR1cm5lZCBieSBtZXRob2QgYHdpdGhGaWx0ZXJgLgogICAgICovCiAgICBjbGFzcyBXaXRoRmlsdGVyKHA6IEEgPT4gQm9vbGVhbikgZXh0ZW5kcyBGaWx0ZXJNb25hZGljW0EsIFJlcHJdIHsKCiAgICAgIC8qKiBCdWlsZHMgYSBuZXcgY29sbGVjdGlvbiBieSBhcHBseWluZyBhIGZ1bmN0aW9uIHRvIGFsbCBlbGVtZW50cyBvZiB0aGUKICAgICAgICogIG91dGVyICRjb2xsIGNvbnRhaW5pbmcgdGhpcyBgV2l0aEZpbHRlcmAgaW5zdGFuY2UgdGhhdCBzYXRpc2Z5IHByZWRpY2F0ZSBgcGAuCiAgICAgICAqCiAgICAgICAqICBAcGFyYW0gZiAgICAgIHRoZSBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGVsZW1lbnQuCiAgICAgICAqICBAdHBhcmFtIEIgICAgIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIHJldHVybmVkIGNvbGxlY3Rpb24uCiAgICAgICAqICBAdHBhcmFtIFRoYXQgICR0aGF0aW5mbwogICAgICAgKiAgQHBhcmFtIGJmICAgICAkYmZpbmZvCiAgICAgICAqICBAcmV0dXJuICAgICAgIGEgbmV3IGNvbGxlY3Rpb24gb2YgdHlwZSBgVGhhdGAgcmVzdWx0aW5nIGZyb20gYXBwbHlpbmcKICAgICAgICogICAgICAgICAgICAgICAgdGhlIGdpdmVuIGZ1bmN0aW9uIGBmYCB0byBlYWNoIGVsZW1lbnQgb2YgdGhlIG91dGVyICRjb2xsCiAgICAgICAqICAgICAgICAgICAgICAgIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSBgcGAgYW5kIGNvbGxlY3RpbmcgdGhlIHJlc3VsdHMuCiAgICAgICAqCiAgICAgICAqICBAdXNlY2FzZSBkZWYgbWFwW0JdKGY6IEEgPT4gQik6ICRDb2xsW0JdIAogICAgICAgKiAgCiAgICAgICAqICBAcmV0dXJuICAgICAgIGEgbmV3ICRjb2xsIHJlc3VsdGluZyBmcm9tIGFwcGx5aW5nIHRoZSBnaXZlbiBmdW5jdGlvbgogICAgICAgKiAgICAgICAgICAgICAgICBgZmAgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBvdXRlciAkY29sbCB0aGF0IHNhdGlzZmllcwogICAgICAgKiAgICAgICAgICAgICAgICBwcmVkaWNhdGUgYHBgIGFuZCBjb2xsZWN0aW5nIHRoZSByZXN1bHRzLgogICAgICAgKi8KICAgICAgZGVmIG1hcFtCLCBUaGF0XShmOiBBID0+IEIpKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgICBmb3IgKHggPC0gc2VsZikgCiAgICAgICAgICBpZiAocCh4KSkgYiArPSBmKHgpCiAgICAgICAgYi5yZXN1bHQKICAgICAgfQoKICAgICAgLyoqIEJ1aWxkcyBhIG5ldyBjb2xsZWN0aW9uIGJ5IGFwcGx5aW5nIGEgZnVuY3Rpb24gdG8gYWxsIGVsZW1lbnRzIG9mIHRoZQogICAgICAgKiAgb3V0ZXIgJGNvbGwgY29udGFpbmluZyB0aGlzIGBXaXRoRmlsdGVyYCBpbnN0YW5jZSB0aGF0IHNhdGlzZnkKICAgICAgICogIHByZWRpY2F0ZSBgcGAgYW5kIGNvbmNhdGVuYXRpbmcgdGhlIHJlc3VsdHMuIAogICAgICAgKgogICAgICAgKiAgQHBhcmFtIGYgICAgICB0aGUgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LgogICAgICAgKiAgQHRwYXJhbSBCICAgICB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uLgogICAgICAgKiAgQHRwYXJhbSBUaGF0ICAkdGhhdGluZm8KICAgICAgICogIEBwYXJhbSBiZiAgICAgJGJmaW5mbwogICAgICAgKiAgQHJldHVybiAgICAgICBhIG5ldyBjb2xsZWN0aW9uIG9mIHR5cGUgYFRoYXRgIHJlc3VsdGluZyBmcm9tIGFwcGx5aW5nCiAgICAgICAqICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBjb2xsZWN0aW9uLXZhbHVlZCBmdW5jdGlvbiBgZmAgdG8gZWFjaCBlbGVtZW50CiAgICAgICAqICAgICAgICAgICAgICAgIG9mIHRoZSBvdXRlciAkY29sbCB0aGF0IHNhdGlzZmllcyBwcmVkaWNhdGUgYHBgIGFuZAogICAgICAgKiAgICAgICAgICAgICAgICBjb25jYXRlbmF0aW5nIHRoZSByZXN1bHRzLgogICAgICAgKgogICAgICAgKiAgQHVzZWNhc2UgZGVmIGZsYXRNYXBbQl0oZjogQSA9PiBUcmF2ZXJzYWJsZU9uY2VbQl0pOiAkQ29sbFtCXQogICAgICAgKiAKICAgICAgICogIEByZXR1cm4gICAgICAgYSBuZXcgJGNvbGwgcmVzdWx0aW5nIGZyb20gYXBwbHlpbmcgdGhlIGdpdmVuIGNvbGxlY3Rpb24tdmFsdWVkIGZ1bmN0aW9uCiAgICAgICAqICAgICAgICAgICAgICAgIGBmYCB0byBlYWNoIGVsZW1lbnQgb2YgdGhlIG91dGVyICRjb2xsIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSBgcGAgYW5kIGNvbmNhdGVuYXRpbmcgdGhlIHJlc3VsdHMuCiAgICAgICAqLwogICAgICBkZWYgZmxhdE1hcFtCLCBUaGF0XShmOiBBID0+IEdlblRyYXZlcnNhYmxlT25jZVtCXSkoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICAgIGZvciAoeCA8LSBzZWxmKSAKICAgICAgICAgIGlmIChwKHgpKSBiICsrPSBmKHgpLnNlcQogICAgICAgIGIucmVzdWx0CiAgICAgIH0KCiAgICAgIC8qKiBBcHBsaWVzIGEgZnVuY3Rpb24gYGZgIHRvIGFsbCBlbGVtZW50cyBvZiB0aGUgb3V0ZXIgJGNvbGwgY29udGFpbmluZwogICAgICAgKiAgdGhpcyBgV2l0aEZpbHRlcmAgaW5zdGFuY2UgdGhhdCBzYXRpc2Z5IHByZWRpY2F0ZSBgcGAuCiAgICAgICAqCiAgICAgICAqICBAcGFyYW0gIGYgICB0aGUgZnVuY3Rpb24gdGhhdCBpcyBhcHBsaWVkIGZvciBpdHMgc2lkZS1lZmZlY3QgdG8gZXZlcnkgZWxlbWVudC4KICAgICAgICogICAgICAgICAgICAgIFRoZSByZXN1bHQgb2YgZnVuY3Rpb24gYGZgIGlzIGRpc2NhcmRlZC4KICAgICAgICogICAgICAgICAgICAgIAogICAgICAgKiAgQHRwYXJhbSAgVSAgdGhlIHR5cGUgcGFyYW1ldGVyIGRlc2NyaWJpbmcgdGhlIHJlc3VsdCBvZiBmdW5jdGlvbiBgZmAuIAogICAgICAgKiAgICAgICAgICAgICAgVGhpcyByZXN1bHQgd2lsbCBhbHdheXMgYmUgaWdub3JlZC4gVHlwaWNhbGx5IGBVYCBpcyBgVW5pdGAsCiAgICAgICAqICAgICAgICAgICAgICBidXQgdGhpcyBpcyBub3QgbmVjZXNzYXJ5LgogICAgICAgKgogICAgICAgKiAgQHVzZWNhc2UgZGVmIGZvcmVhY2goZjogQSA9PiBVbml0KTogVW5pdAogICAgICAgKi8gICAKICAgICAgZGVmIGZvcmVhY2hbVV0oZjogQSA9PiBVKTogVW5pdCA9IAogICAgICAgIGZvciAoeCA8LSBzZWxmKSAKICAgICAgICAgIGlmIChwKHgpKSBmKHgpCgogICAgICAvKiogRnVydGhlciByZWZpbmVzIHRoZSBmaWx0ZXIgZm9yIHRoaXMgJGNvbGwuCiAgICAgICAqCiAgICAgICAqICBAcGFyYW0gcSAgIHRoZSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IGVsZW1lbnRzLgogICAgICAgKiAgQHJldHVybiAgICBhbiBvYmplY3Qgb2YgY2xhc3MgYFdpdGhGaWx0ZXJgLCB3aGljaCBzdXBwb3J0cwogICAgICAgKiAgICAgICAgICAgICBgbWFwYCwgYGZsYXRNYXBgLCBgZm9yZWFjaGAsIGFuZCBgd2l0aEZpbHRlcmAgb3BlcmF0aW9ucy4KICAgICAgICogICAgICAgICAgICAgQWxsIHRoZXNlIG9wZXJhdGlvbnMgYXBwbHkgdG8gdGhvc2UgZWxlbWVudHMgb2YgdGhpcyAkY29sbCB3aGljaAogICAgICAgKiAgICAgICAgICAgICBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgYHFgIGluIGFkZGl0aW9uIHRvIHRoZSBwcmVkaWNhdGUgYHBgLgogICAgICAgKi8KICAgICAgZGVmIHdpdGhGaWx0ZXIocTogQSA9PiBCb29sZWFuKTogV2l0aEZpbHRlciA9IAogICAgICAgIG5ldyBXaXRoRmlsdGVyKHggPT4gcCh4KSAmJiBxKHgpKQogICAgfQoKICAgIC8vIEEgaGVscGVyIGZvciB0YWlscyBhbmQgaW5pdHMuCiAgICBwcml2YXRlIGRlZiBpdGVyYXRlVW50aWxFbXB0eShmOiBUcmF2ZXJzYWJsZVtBIEB1Vl0gPT4gVHJhdmVyc2FibGVbQSBAdVZdKTogSXRlcmF0b3JbUmVwcl0gPSB7CiAgICAgIHZhbCBpdCA9IEl0ZXJhdG9yLml0ZXJhdGUodGhpc0NvbGxlY3Rpb24pKGYpIHRha2VXaGlsZSAoeCA9PiAheC5pc0VtcHR5KQogICAgICBpdCArKyBJdGVyYXRvcihOaWwpIG1hcCAobmV3QnVpbGRlciArKz0gXyByZXN1bHQpCiAgICB9CiAgfQoKCjwvdGV4dGFyZWE+CjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgdGhlbWU6ICJhbWJpYW5jZSIsCiAgICAgICAgbW9kZTogInRleHQveC1zY2FsYSIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/clojure/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/clojure/clojure.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEF1dGhvcjogSGFucyBFbmdlbAogKiBCcmFuY2hlZCBmcm9tIENvZGVNaXJyb3IncyBTY2hlbWUgbW9kZSAoYnkgS29oIFppIEhhbiwgYmFzZWQgb24gaW1wbGVtZW50YXRpb24gYnkgS29oIFppIENodW4pCiAqLwpDb2RlTWlycm9yLmRlZmluZU1vZGUoImNsb2p1cmUiLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgQlVJTFRJTiA9ICJidWlsdGluIiwgQ09NTUVOVCA9ICJjb21tZW50IiwgU1RSSU5HID0gInN0cmluZyIsCiAgICAgICAgQVRPTSA9ICJhdG9tIiwgTlVNQkVSID0gIm51bWJlciIsIEJSQUNLRVQgPSAiYnJhY2tldCIsIEtFWVdPUkQgPSAia2V5d29yZCI7CiAgICB2YXIgSU5ERU5UX1dPUkRfU0tJUCA9IDI7CgogICAgZnVuY3Rpb24gbWFrZUtleXdvcmRzKHN0cikgewogICAgICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHZhciBhdG9tcyA9IG1ha2VLZXl3b3JkcygidHJ1ZSBmYWxzZSBuaWwiKTsKICAgIAogICAgdmFyIGtleXdvcmRzID0gbWFrZUtleXdvcmRzKAogICAgICAiZGVmbiBkZWZuLSBkZWYgZGVmLSBkZWZvbmNlIGRlZm11bHRpIGRlZm1ldGhvZCBkZWZtYWNybyBkZWZzdHJ1Y3QgZGVmdHlwZSBkZWZwcm90b2NvbCBkZWZyZWNvcmQgZGVmcHJvamVjdCBkZWZ0ZXN0IHNsaWNlIGRlZmFsaWFzIGRlZmhpbnRlZCBkZWZtYWNyby0gZGVmbi1tZW1vIGRlZm5rIGRlZm5rIGRlZm9uY2UtIGRlZnVuYm91bmQgZGVmdW5ib3VuZC0gZGVmdmFyIGRlZnZhci0gbGV0IGxldGZuIGRvIGNhc2UgY29uZCBjb25kcCBmb3IgbG9vcCByZWN1ciB3aGVuIHdoZW4tbm90IHdoZW4tbGV0IHdoZW4tZmlyc3QgaWYgaWYtbGV0IGlmLW5vdCAuIC4uIC0+IC0+PiBkb3RvIGFuZCBvciBkb3N5bmMgZG9zZXEgZG90aW1lcyBkb3J1biBkb2FsbCBsb2FkIGltcG9ydCB1bmltcG9ydCBucyBpbi1ucyByZWZlciB0cnkgY2F0Y2ggZmluYWxseSB0aHJvdyB3aXRoLW9wZW4gd2l0aC1sb2NhbC12YXJzIGJpbmRpbmcgZ2VuLWNsYXNzIGdlbi1hbmQtbG9hZC1jbGFzcyBnZW4tYW5kLXNhdmUtY2xhc3MgaGFuZGxlci1jYXNlIGhhbmRsZSIpOwoKICAgIHZhciBidWlsdGlucyA9IG1ha2VLZXl3b3JkcygKICAgICAgICAiKiAqMSAqMiAqMyAqYWdlbnQqICphbGxvdy11bnJlc29sdmVkLXZhcnMqICphc3NlcnQgKmNsb2p1cmUtdmVyc2lvbiogKmNvbW1hbmQtbGluZS1hcmdzKiAqY29tcGlsZS1maWxlcyogKmNvbXBpbGUtcGF0aCogKmUgKmVyciogKmZpbGUqICpmbHVzaC1vbi1uZXdsaW5lKiAqaW4qICptYWNyby1tZXRhKiAqbWF0aC1jb250ZXh0KiAqbnMqICpvdXQqICpwcmludC1kdXAqICpwcmludC1sZW5ndGgqICpwcmludC1sZXZlbCogKnByaW50LW1ldGEqICpwcmludC1yZWFkYWJseSogKnJlYWQtZXZhbCogKnNvdXJjZS1wYXRoKiAqdXNlLWNvbnRleHQtY2xhc3Nsb2FkZXIqICp3YXJuLW9uLXJlZmxlY3Rpb24qICsgLSAvIDwgPD0gPSA9PSA+ID49IGFjY2Vzc29yIGFjbG9uZSBhZ2VudCBhZ2VudC1lcnJvcnMgYWdldCBhbGVuZ3RoIGFsaWFzIGFsbC1ucyBhbHRlciBhbHRlci1tZXRhISBhbHRlci12YXItcm9vdCBhbWFwIGFuY2VzdG9ycyBhbmQgYXBwbHkgYXJlZHVjZSBhcnJheS1tYXAgYXNldCBhc2V0LWJvb2xlYW4gYXNldC1ieXRlIGFzZXQtY2hhciBhc2V0LWRvdWJsZSBhc2V0LWZsb2F0IGFzZXQtaW50IGFzZXQtbG9uZyBhc2V0LXNob3J0IGFzc2VydCBhc3NvYyBhc3NvYyEgYXNzb2MtaW4gYXNzb2NpYXRpdmU/IGF0b20gYXdhaXQgYXdhaXQtZm9yIGF3YWl0MSBiYXNlcyBiZWFuIGJpZ2RlYyBiaWdpbnQgYmluZGluZyBiaXQtYW5kIGJpdC1hbmQtbm90IGJpdC1jbGVhciBiaXQtZmxpcCBiaXQtbm90IGJpdC1vciBiaXQtc2V0IGJpdC1zaGlmdC1sZWZ0IGJpdC1zaGlmdC1yaWdodCBiaXQtdGVzdCBiaXQteG9yIGJvb2xlYW4gYm9vbGVhbi1hcnJheSBib29sZWFucyBib3VuZC1mbiBib3VuZC1mbiogYnV0bGFzdCBieXRlIGJ5dGUtYXJyYXkgYnl0ZXMgY2FzZSBjYXN0IGNoYXIgY2hhci1hcnJheSBjaGFyLWVzY2FwZS1zdHJpbmcgY2hhci1uYW1lLXN0cmluZyBjaGFyPyBjaGFycyBjaHVuayBjaHVuay1hcHBlbmQgY2h1bmstYnVmZmVyIGNodW5rLWNvbnMgY2h1bmstZmlyc3QgY2h1bmstbmV4dCBjaHVuay1yZXN0IGNodW5rZWQtc2VxPyBjbGFzcyBjbGFzcz8gY2xlYXItYWdlbnQtZXJyb3JzIGNsb2p1cmUtdmVyc2lvbiBjb2xsPyBjb21tZW50IGNvbW11dGUgY29tcCBjb21wYXJhdG9yIGNvbXBhcmUgY29tcGFyZS1hbmQtc2V0ISBjb21waWxlIGNvbXBsZW1lbnQgY29uY2F0IGNvbmQgY29uZHAgY29uaiBjb25qISBjb25zIGNvbnN0YW50bHkgY29uc3RydWN0LXByb3h5IGNvbnRhaW5zPyBjb3VudCBjb3VudGVkPyBjcmVhdGUtbnMgY3JlYXRlLXN0cnVjdCBjeWNsZSBkZWMgZGVjaW1hbD8gZGVjbGFyZSBkZWZpbmxpbmUgZGVmbWFjcm8gZGVmbWV0aG9kIGRlZm11bHRpIGRlZm4gZGVmbi0gZGVmb25jZSBkZWZzdHJ1Y3QgZGVsYXkgZGVsYXk/IGRlbGl2ZXIgZGVyZWYgZGVyaXZlIGRlc2NlbmRhbnRzIGRlc3RydWN0dXJlIGRpc2ogZGlzaiEgZGlzc29jIGRpc3NvYyEgZGlzdGluY3QgZGlzdGluY3Q/IGRvYWxsIGRvYyBkb3J1biBkb3NlcSBkb3N5bmMgZG90aW1lcyBkb3RvIGRvdWJsZSBkb3VibGUtYXJyYXkgZG91YmxlcyBkcm9wIGRyb3AtbGFzdCBkcm9wLXdoaWxlIGVtcHR5IGVtcHR5PyBlbnN1cmUgZW51bWVyYXRpb24tc2VxIGV2YWwgZXZlbj8gZXZlcnk/IGV4dGVuZCBleHRlbmQtcHJvdG9jb2wgZXh0ZW5kLXR5cGUgZXh0ZW5kcz8gZXh0ZW5kZXJzIGZhbHNlPyBmZmlyc3QgZmlsZS1zZXEgZmlsdGVyIGZpbmQgZmluZC1kb2MgZmluZC1ucyBmaW5kLXZhciBmaXJzdCBmbG9hdCBmbG9hdC1hcnJheSBmbG9hdD8gZmxvYXRzIGZsdXNoIGZuIGZuPyBmbmV4dCBmb3IgZm9yY2UgZm9ybWF0IGZ1dHVyZSBmdXR1cmUtY2FsbCBmdXR1cmUtY2FuY2VsIGZ1dHVyZS1jYW5jZWxsZWQ/IGZ1dHVyZS1kb25lPyBmdXR1cmU/IGdlbi1jbGFzcyBnZW4taW50ZXJmYWNlIGdlbnN5bSBnZXQgZ2V0LWluIGdldC1tZXRob2QgZ2V0LXByb3h5LWNsYXNzIGdldC10aHJlYWQtYmluZGluZ3MgZ2V0LXZhbGlkYXRvciBoYXNoIGhhc2gtbWFwIGhhc2gtc2V0IGlkZW50aWNhbD8gaWRlbnRpdHkgaWYtbGV0IGlmLW5vdCBpZm4/IGltcG9ydCBpbi1ucyBpbmMgaW5pdC1wcm94eSBpbnN0YW5jZT8gaW50IGludC1hcnJheSBpbnRlZ2VyPyBpbnRlcmxlYXZlIGludGVybiBpbnRlcnBvc2UgaW50byBpbnRvLWFycmF5IGludHMgaW8hIGlzYT8gaXRlcmF0ZSBpdGVyYXRvci1zZXEganV4dCBrZXkga2V5cyBrZXl3b3JkIGtleXdvcmQ/IGxhc3QgbGF6eS1jYXQgbGF6eS1zZXEgbGV0IGxldGZuIGxpbmUtc2VxIGxpc3QgbGlzdCogbGlzdD8gbG9hZCBsb2FkLWZpbGUgbG9hZC1yZWFkZXIgbG9hZC1zdHJpbmcgbG9hZGVkLWxpYnMgbG9ja2luZyBsb25nIGxvbmctYXJyYXkgbG9uZ3MgbG9vcCBtYWNyb2V4cGFuZCBtYWNyb2V4cGFuZC0xIG1ha2UtYXJyYXkgbWFrZS1oaWVyYXJjaHkgbWFwIG1hcD8gbWFwY2F0IG1heCBtYXgta2V5IG1lbWZuIG1lbW9pemUgbWVyZ2UgbWVyZ2Utd2l0aCBtZXRhIG1ldGhvZC1zaWcgbWV0aG9kcyBtaW4gbWluLWtleSBtb2QgbmFtZSBuYW1lc3BhY2UgbmVnPyBuZXdsaW5lIG5leHQgbmZpcnN0IG5pbD8gbm5leHQgbm90IG5vdC1hbnk/IG5vdC1lbXB0eSBub3QtZXZlcnk/IG5vdD0gbnMgbnMtYWxpYXNlcyBucy1pbXBvcnRzIG5zLWludGVybnMgbnMtbWFwIG5zLW5hbWUgbnMtcHVibGljcyBucy1yZWZlcnMgbnMtcmVzb2x2ZSBucy11bmFsaWFzIG5zLXVubWFwIG50aCBudGhuZXh0IG51bSBudW1iZXI/IG9kZD8gb3IgcGFyZW50cyBwYXJ0aWFsIHBhcnRpdGlvbiBwY2FsbHMgcGVlayBwZXJzaXN0ZW50ISBwbWFwIHBvcCBwb3AhIHBvcC10aHJlYWQtYmluZGluZ3MgcG9zPyBwciBwci1zdHIgcHJlZmVyLW1ldGhvZCBwcmVmZXJzIHByaW1pdGl2ZXMtY2xhc3NuYW1lcyBwcmludCBwcmludC1jdG9yIHByaW50LWRvYyBwcmludC1kdXAgcHJpbnQtbWV0aG9kIHByaW50LW5hbWVzcGFjZS1kb2MgcHJpbnQtc2ltcGxlIHByaW50LXNwZWNpYWwtZG9jIHByaW50LXN0ciBwcmludGYgcHJpbnRsbiBwcmludGxuLXN0ciBwcm4gcHJuLXN0ciBwcm9taXNlIHByb3h5IHByb3h5LWNhbGwtd2l0aC1zdXBlciBwcm94eS1tYXBwaW5ncyBwcm94eS1uYW1lIHByb3h5LXN1cGVyIHB1c2gtdGhyZWFkLWJpbmRpbmdzIHB2YWx1ZXMgcXVvdCByYW5kIHJhbmQtaW50IHJhbmdlIHJhdGlvPyByYXRpb25hbD8gcmF0aW9uYWxpemUgcmUtZmluZCByZS1ncm91cHMgcmUtbWF0Y2hlciByZS1tYXRjaGVzIHJlLXBhdHRlcm4gcmUtc2VxIHJlYWQgcmVhZC1saW5lIHJlYWQtc3RyaW5nIHJlaWZ5IHJlZHVjZSByZWYgcmVmLWhpc3RvcnktY291bnQgcmVmLW1heC1oaXN0b3J5IHJlZi1taW4taGlzdG9yeSByZWYtc2V0IHJlZmVyIHJlZmVyLWNsb2p1cmUgcmVsZWFzZS1wZW5kaW5nLXNlbmRzIHJlbSByZW1vdmUgcmVtb3ZlLW1ldGhvZCByZW1vdmUtbnMgcmVwZWF0IHJlcGVhdGVkbHkgcmVwbGFjZSByZXBsaWNhdGUgcmVxdWlyZSByZXNldCEgcmVzZXQtbWV0YSEgcmVzb2x2ZSByZXN0IHJlc3VsdHNldC1zZXEgcmV2ZXJzZSByZXZlcnNpYmxlPyByc2VxIHJzdWJzZXEgc2F0aXNmaWVzPyBzZWNvbmQgc2VsZWN0LWtleXMgc2VuZCBzZW5kLW9mZiBzZXEgc2VxPyBzZXF1ZSBzZXF1ZW5jZSBzZXF1ZW50aWFsPyBzZXQgc2V0LXZhbGlkYXRvciEgc2V0PyBzaG9ydCBzaG9ydC1hcnJheSBzaG9ydHMgc2h1dGRvd24tYWdlbnRzIHNsdXJwIHNvbWUgc29ydCBzb3J0LWJ5IHNvcnRlZC1tYXAgc29ydGVkLW1hcC1ieSBzb3J0ZWQtc2V0IHNvcnRlZC1zZXQtYnkgc29ydGVkPyBzcGVjaWFsLWZvcm0tYW5jaG9yIHNwZWNpYWwtc3ltYm9sPyBzcGxpdC1hdCBzcGxpdC13aXRoIHN0ciBzdHJlYW0/IHN0cmluZz8gc3RydWN0IHN0cnVjdC1tYXAgc3VicyBzdWJzZXEgc3VidmVjIHN1cGVycyBzd2FwISBzeW1ib2wgc3ltYm9sPyBzeW5jIHN5bnRheC1zeW1ib2wtYW5jaG9yIHRha2UgdGFrZS1sYXN0IHRha2UtbnRoIHRha2Utd2hpbGUgdGVzdCB0aGUtbnMgdGltZSB0by1hcnJheSB0by1hcnJheS0yZCB0cmFtcG9saW5lIHRyYW5zaWVudCB0cmVlLXNlcSB0cnVlPyB0eXBlIHVuY2hlY2tlZC1hZGQgdW5jaGVja2VkLWRlYyB1bmNoZWNrZWQtZGl2aWRlIHVuY2hlY2tlZC1pbmMgdW5jaGVja2VkLW11bHRpcGx5IHVuY2hlY2tlZC1uZWdhdGUgdW5jaGVja2VkLXJlbWFpbmRlciB1bmNoZWNrZWQtc3VidHJhY3QgdW5kZXJpdmUgdW5xdW90ZSB1bnF1b3RlLXNwbGljaW5nIHVwZGF0ZS1pbiB1cGRhdGUtcHJveHkgdXNlIHZhbCB2YWxzIHZhci1nZXQgdmFyLXNldCB2YXI/IHZhcnktbWV0YSB2ZWMgdmVjdG9yIHZlY3Rvcj8gd2hlbiB3aGVuLWZpcnN0IHdoZW4tbGV0IHdoZW4tbm90IHdoaWxlIHdpdGgtYmluZGluZ3Mgd2l0aC1iaW5kaW5ncyogd2l0aC1pbi1zdHIgd2l0aC1sb2FkaW5nLWNvbnRleHQgd2l0aC1sb2NhbC12YXJzIHdpdGgtbWV0YSB3aXRoLW9wZW4gd2l0aC1vdXQtc3RyIHdpdGgtcHJlY2lzaW9uIHhtbC1zZXEiKTsKCiAgICB2YXIgaW5kZW50S2V5cyA9IG1ha2VLZXl3b3JkcygKICAgICAgICAvLyBCdWlsdC1pbnMKICAgICAgICAibnMgZm4gZGVmIGRlZm4gZGVmbWV0aG9kIGJvdW5kLWZuIGlmIGlmLW5vdCBjYXNlIGNvbmRwIHdoZW4gd2hpbGUgd2hlbi1ub3Qgd2hlbi1maXJzdCBkbyBmdXR1cmUgY29tbWVudCBkb3RvIGxvY2tpbmcgcHJveHkgd2l0aC1vcGVuIHdpdGgtcHJlY2lzaW9uIHJlaWZ5IGRlZnR5cGUgZGVmcmVjb3JkIGRlZnByb3RvY29sIGV4dGVuZCBleHRlbmQtcHJvdG9jb2wgZXh0ZW5kLXR5cGUgdHJ5IGNhdGNoICIgKwoKICAgICAgICAvLyBCaW5kaW5nIGZvcm1zCiAgICAgICAgImxldCBsZXRmbiBiaW5kaW5nIGxvb3AgZm9yIGRvc2VxIGRvdGltZXMgd2hlbi1sZXQgaWYtbGV0ICIgKwoKICAgICAgICAvLyBEYXRhIHN0cnVjdHVyZXMKICAgICAgICAiZGVmc3RydWN0IHN0cnVjdC1tYXAgYXNzb2MgIiArCgogICAgICAgIC8vIGNsb2p1cmUudGVzdAogICAgICAgICJ0ZXN0aW5nIGRlZnRlc3QgIiArCgogICAgICAgIC8vIGNvbnRyaWIKICAgICAgICAiaGFuZGxlci1jYXNlIGhhbmRsZSBkb3RyYWNlIGRlZnRyYWNlIik7CgogICAgdmFyIHRlc3RzID0gewogICAgICAgIGRpZ2l0OiAvXGQvLAogICAgICAgIGRpZ2l0X29yX2NvbG9uOiAvW1xkOl0vLAogICAgICAgIGhleDogL1swLTlhLWZdL2ksCiAgICAgICAgc2lnbjogL1srLV0vLAogICAgICAgIGV4cG9uZW50OiAvZS9pLAogICAgICAgIGtleXdvcmRfY2hhcjogL1teXHNcKFxbXDtcKVxdXS8sCiAgICAgICAgYmFzaWM6IC9bXHdcJF9cLV0vLAogICAgICAgIGxhbmdfa2V5d29yZDogL1tcdyorIVwtXz86XC9dLwogICAgfTsKCiAgICBmdW5jdGlvbiBzdGF0ZVN0YWNrKGluZGVudCwgdHlwZSwgcHJldikgeyAvLyByZXByZXNlbnRzIGEgc3RhdGUgc3RhY2sgb2JqZWN0CiAgICAgICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7CiAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICB0aGlzLnByZXYgPSBwcmV2OwogICAgfQoKICAgIGZ1bmN0aW9uIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50LCB0eXBlKSB7CiAgICAgICAgc3RhdGUuaW5kZW50U3RhY2sgPSBuZXcgc3RhdGVTdGFjayhpbmRlbnQsIHR5cGUsIHN0YXRlLmluZGVudFN0YWNrKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3BTdGFjayhzdGF0ZSkgewogICAgICAgIHN0YXRlLmluZGVudFN0YWNrID0gc3RhdGUuaW5kZW50U3RhY2sucHJldjsKICAgIH0KCiAgICBmdW5jdGlvbiBpc051bWJlcihjaCwgc3RyZWFtKXsKICAgICAgICAvLyBoZXgKICAgICAgICBpZiAoIGNoID09PSAnMCcgJiYgc3RyZWFtLmVhdCgveC9pKSApIHsKICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHRlc3RzLmhleCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gbGVhZGluZyBzaWduCiAgICAgICAgaWYgKCAoIGNoID09ICcrJyB8fCBjaCA9PSAnLScgKSAmJiAoIHRlc3RzLmRpZ2l0LnRlc3Qoc3RyZWFtLnBlZWsoKSkgKSApIHsKICAgICAgICAgIHN0cmVhbS5lYXQodGVzdHMuc2lnbik7CiAgICAgICAgICBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHRlc3RzLmRpZ2l0LnRlc3QoY2gpICkgewogICAgICAgICAgICBzdHJlYW0uZWF0KGNoKTsKICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHRlc3RzLmRpZ2l0KTsKCiAgICAgICAgICAgIGlmICggJy4nID09IHN0cmVhbS5wZWVrKCkgKSB7CiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KCcuJyk7CiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuZGlnaXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIHN0cmVhbS5lYXQodGVzdHMuZXhwb25lbnQpICkgewogICAgICAgICAgICAgICAgc3RyZWFtLmVhdCh0ZXN0cy5zaWduKTsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0ZXN0cy5kaWdpdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5kZW50U3RhY2s6IG51bGwsCiAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbjogMCwKICAgICAgICAgICAgICAgIG1vZGU6IGZhbHNlCiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5pbmRlbnRTdGFjayA9PSBudWxsICYmIHN0cmVhbS5zb2woKSkgewogICAgICAgICAgICAgICAgLy8gdXBkYXRlIGluZGVudGF0aW9uLCBidXQgb25seSBpZiBpbmRlbnRTdGFjayBpcyBlbXB0eQogICAgICAgICAgICAgICAgc3RhdGUuaW5kZW50YXRpb24gPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2tpcCBzcGFjZXMKICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmV0dXJuVHlwZSA9IG51bGw7CgogICAgICAgICAgICBzd2l0Y2goc3RhdGUubW9kZSl7CiAgICAgICAgICAgICAgICBjYXNlICJzdHJpbmciOiAvLyBtdWx0aS1saW5lIHN0cmluZyBwYXJzaW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCwgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gIlwiIiAmJiAhZXNjYXBlZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBTVFJJTkc7IC8vIGNvbnRpbnVlIG9uIGluIHN0cmluZyBtb2RlCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBkZWZhdWx0IHBhcnNpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAiXCIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IFNUUklORzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICInIiAmJiAhKCB0ZXN0cy5kaWdpdF9vcl9jb2xvbi50ZXN0KHN0cmVhbS5wZWVrKCkpICkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEFUT007CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiOyIpIHsgLy8gY29tbWVudAogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7IC8vIHJlc3Qgb2YgdGhlIGxpbmUgaXMgYSBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBDT01NRU5UOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoY2gsc3RyZWFtKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBOVU1CRVI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiKCIgfHwgY2ggPT0gIlsiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlXb3JkID0gJycsIGluZGVudFRlbXAgPSBzdHJlYW0uY29sdW1uKCksIGxldHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgICAgICAgIEVpdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAoaW5kZW50LXdvcmQgLi4KICAgICAgICAgICAgICAgICAgICAgICAgKG5vbi1pbmRlbnQtd29yZCAuLgogICAgICAgICAgICAgICAgICAgICAgICAoO3NvbWV0aGluZyBlbHNlLCBicmFja2V0LCBldGMuCiAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gIigiKSB3aGlsZSAoKGxldHRlciA9IHN0cmVhbS5lYXQodGVzdHMua2V5d29yZF9jaGFyKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5V29yZCArPSBsZXR0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlXb3JkLmxlbmd0aCA+IDAgJiYgKGluZGVudEtleXMucHJvcGVydHlJc0VudW1lcmFibGUoa2V5V29yZCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL14oPzpkZWZ8d2l0aCkvLnRlc3Qoa2V5V29yZCkpKSB7IC8vIGluZGVudC13b3JkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyBJTkRFTlRfV09SRF9TS0lQLCBjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vbi1pbmRlbnQgd29yZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY29udGludWUgZWF0aW5nIHRoZSBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5lb2woKSB8fCBzdHJlYW0ucGVlaygpID09ICI7IikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgc2lnbmlmaWNhbnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSByZXN0YXJ0IGluZGVudGF0aW9uIDEgc3BhY2UgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyAxLCBjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50VGVtcCArIHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoLCBjaCk7IC8vIGVsc2Ugd2UgbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoIC0gMSk7IC8vIHVuZG8gYWxsIHRoZSBlYXRpbmcKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBCUkFDS0VUOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIikiIHx8IGNoID09ICJdIikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQlJBQ0tFVDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrICE9IG51bGwgJiYgc3RhdGUuaW5kZW50U3RhY2sudHlwZSA9PSAoY2ggPT0gIikiID8gIigiIDogIlsiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wU3RhY2soc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggY2ggPT0gIjoiICkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMubGFuZ19rZXl3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFUT007CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHRlc3RzLmJhc2ljKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3JkcyAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEtFWVdPUkQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVpbHRpbnMgJiYgYnVpbHRpbnMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBCVUlMVElOOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0b21zICYmIGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQVRPTTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHJldHVyblR5cGUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJldHVyblR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgaW5kZW50OiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrID09IG51bGwpIHJldHVybiBzdGF0ZS5pbmRlbnRhdGlvbjsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmluZGVudFN0YWNrLmluZGVudDsKICAgICAgICB9CiAgICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWNsb2p1cmUiLCAiY2xvanVyZSIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/clojure/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IENsb2p1cmUgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImNsb2p1cmUuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBDbG9qdXJlIG1vZGU8L2gxPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KOyBDb253YXkncyBHYW1lIG9mIExpZmUsIGJhc2VkIG9uIHRoZSB3b3JrIG9mOgo7OyBMYXVyZW50IFBldGl0IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzEyMDAzNDMKOzsgQ2hyaXN0b3BoZSBHcmFuZCBodHRwOi8vY2xqLW1lLmNncmFuZC5uZXQvMjAxMS8wOC8xOS9jb253YXlzLWdhbWUtb2YtbGlmZQoKKG5zIF57OmRvYyAiQ29ud2F5J3MgR2FtZSBvZiBMaWZlLiJ9CiBnYW1lLW9mLWxpZmUpCgo7OyBDb3JlIGdhbWUgb2YgbGlmZSdzIGFsZ29yaXRobSBmdW5jdGlvbnMKCihkZWZuIG5laWdoYm91cnMgCiAgIkdpdmVuIGEgY2VsbCdzIGNvb3JkaW5hdGVzLCByZXR1cm5zIHRoZSBjb29yZGluYXRlcyBvZiBpdHMgbmVpZ2hib3Vycy4iCiAgW1t4IHldXQogIChmb3IgW2R4IFstMSAwIDFdIGR5IChpZiAoemVybz8gZHgpIFstMSAxXSBbLTEgMCAxXSldCiAgICBbKCsgZHggeCkgKCsgZHkgeSldKSkKCihkZWZuIHN0ZXAgCiAgIkdpdmVuIGEgc2V0IG9mIGxpdmluZyBjZWxscywgY29tcHV0ZXMgdGhlIG5ldyBzZXQgb2YgbGl2aW5nIGNlbGxzLiIKICBbY2VsbHNdCiAgKHNldCAoZm9yIFtbY2VsbCBuXSAoZnJlcXVlbmNpZXMgKG1hcGNhdCBuZWlnaGJvdXJzIGNlbGxzKSkKICAgICAgICAgICAgIDp3aGVuIChvciAoPSBuIDMpIChhbmQgKD0gbiAyKSAoY2VsbHMgY2VsbCkpKV0KICAgICAgICAgY2VsbCkpKQoKOzsgVXRpbGl0eSBtZXRob2RzIGZvciBkaXNwbGF5aW5nIGdhbWUgb24gYSB0ZXh0IHRlcm1pbmFsCgooZGVmbiBwcmludC1ib2FyZCAKICAiUHJpbnRzIGEgYm9hcmQgb24gKm91dCosIHJlcHJlc2VudGluZyBhIHN0ZXAgaW4gdGhlIGdhbWUuIgogIFtib2FyZCB3IGhdCiAgKGRvc2VxIFt4IChyYW5nZSAoaW5jIHcpKSB5IChyYW5nZSAoaW5jIGgpKV0KICAgIChpZiAoPSB5IDApIChwcmludCAiXG4iKSkgCiAgICAocHJpbnQgKGlmIChib2FyZCBbeCB5XSkgIltYXSIgIiAuICIpKSkpCgooZGVmbiBkaXNwbGF5LWdyaWRzIAogICJQcmludHMgYSBzcXVlbmNlIG9mIGJvYXJkcyBvbiAqb3V0KiwgcmVwcmVzZW50aW5nIHNldmVyYWwgc3RlcHMuIgogIFtncmlkcyB3IGhdCiAgKGRvc2VxIFtib2FyZCBncmlkc10KICAgIChwcmludC1ib2FyZCBib2FyZCB3IGgpCiAgICAocHJpbnQgIlxuIikpKQoKOzsgTGF1bmNoZXMgYW4gZXhhbXBsZSBib2FyZAoKKGRlZiAKICBeezpkb2MgImJvYXJkIHJlcHJlc2VudHMgdGhlIGluaXRpYWwgc2V0IG9mIGxpdmluZyBjZWxscyJ9CiAgIGJvYXJkICN7WzIgMV0gWzIgMl0gWzIgM119KQoKKGRpc3BsYXktZ3JpZHMgKHRha2UgMyAoaXRlcmF0ZSBzdGVwIGJvYXJkKSkgNSA1KSA8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWNsb2p1cmU8L2NvZGU+LjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/coffeescript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/coffeescript/coffeescript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIExpbmsgdG8gdGhlIHByb2plY3QncyBHaXRIdWIgcGFnZToKICogaHR0cHM6Ly9naXRodWIuY29tL3BpY2toYXJkdC9jb2ZmZWVzY3JpcHQtY29kZW1pcnJvci1tb2RlCiAqLwpDb2RlTWlycm9yLmRlZmluZU1vZGUoJ2NvZmZlZXNjcmlwdCcsIGZ1bmN0aW9uKGNvbmYpIHsKICAgIHZhciBFUlJPUkNMQVNTID0gJ2Vycm9yJzsKCiAgICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oKCIgKyB3b3Jkcy5qb2luKCIpfCgiKSArICIpKVxcYiIpOwogICAgfQoKICAgIHZhciBzaW5nbGVPcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeW1xcK1xcLVxcKi8lJnxcXF5+PD4hXD9dIik7CiAgICB2YXIgc2luZ2xlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoJ15bXFwoXFwpXFxbXFxdXFx7XFx9LDpgPTtcXC5dJyk7CiAgICB2YXIgZG91YmxlT3BlcmF0b3JzID0gbmV3IFJlZ0V4cCgiXigoXC0+KXwoXD0+KXwoXFwrXFwrKXwoXFwrXFw9KXwoXFwtXFwtKXwoXFwtXFw9KXwoXFwqXFwqKXwoXFwqXFw9KXwoXFwvXFwvKXwoXFwvXFw9KXwoPT0pfCghPSl8KDw9KXwoPj0pfCg8Pil8KDw8KXwoPj4pfCgvLykpIik7CiAgICB2YXIgZG91YmxlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoIl4oKFxcLlxcLil8KFxcKz0pfChcXC09KXwoXFwqPSl8KCU9KXwoLz0pfCgmPSl8KFxcfD0pfChcXF49KSkiKTsKICAgIHZhciB0cmlwbGVEZWxpbWl0ZXJzID0gbmV3IFJlZ0V4cCgiXigoXFwuXFwuXFwuKXwoLy89KXwoPj49KXwoPDw9KXwoXFwqXFwqPSkpIik7CiAgICB2YXIgaWRlbnRpZmllcnMgPSBuZXcgUmVnRXhwKCJeW19BLVphLXokXVtfQS1aYS16JDAtOV0qIik7CiAgICB2YXIgcHJvcGVydGllcyA9IG5ldyBSZWdFeHAoIl4oQHx0aGlzXC4pW19BLVphLXokXVtfQS1aYS16JDAtOV0qIik7CgogICAgdmFyIHdvcmRPcGVyYXRvcnMgPSB3b3JkUmVnZXhwKFsnYW5kJywgJ29yJywgJ25vdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcycsICdpc250JywgJ2luJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlb2YnLCAndHlwZW9mJ10pOwogICAgdmFyIGluZGVudEtleXdvcmRzID0gWydmb3InLCAnd2hpbGUnLCAnbG9vcCcsICdpZicsICd1bmxlc3MnLCAnZWxzZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N3aXRjaCcsICd0cnknLCAnY2F0Y2gnLCAnZmluYWxseScsICdjbGFzcyddOwogICAgdmFyIGNvbW1vbktleXdvcmRzID0gWydicmVhaycsICdieScsICdjb250aW51ZScsICdkZWJ1Z2dlcicsICdkZWxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdkbycsICdpbicsICdvZicsICduZXcnLCAncmV0dXJuJywgJ3RoZW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICd0aGlzJywgJ3Rocm93JywgJ3doZW4nLCAndW50aWwnXTsKCiAgICB2YXIga2V5d29yZHMgPSB3b3JkUmVnZXhwKGluZGVudEtleXdvcmRzLmNvbmNhdChjb21tb25LZXl3b3JkcykpOwoKICAgIGluZGVudEtleXdvcmRzID0gd29yZFJlZ2V4cChpbmRlbnRLZXl3b3Jkcyk7CgoKICAgIHZhciBzdHJpbmdQcmVmaXhlcyA9IG5ldyBSZWdFeHAoIl4oJ3szfXxcInszfXxbJ1wiXSkiKTsKICAgIHZhciByZWdleFByZWZpeGVzID0gbmV3IFJlZ0V4cCgiXigvezN9fC8pIik7CiAgICB2YXIgY29tbW9uQ29uc3RhbnRzID0gWydJbmZpbml0eScsICdOYU4nLCAndW5kZWZpbmVkJywgJ251bGwnLCAndHJ1ZScsICdmYWxzZScsICdvbicsICdvZmYnLCAneWVzJywgJ25vJ107CiAgICB2YXIgY29uc3RhbnRzID0gd29yZFJlZ2V4cChjb21tb25Db25zdGFudHMpOwoKICAgIC8vIFRva2VuaXplcnMKICAgIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgLy8gSGFuZGxlIHNjb3BlIGNoYW5nZXMKICAgICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgIHZhciBzY29wZU9mZnNldCA9IHN0YXRlLnNjb3Blc1swXS5vZmZzZXQ7CiAgICAgICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgICAgICAgICAgdmFyIGxpbmVPZmZzZXQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0ID4gc2NvcGVPZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2luZGVudCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmVPZmZzZXQgPCBzY29wZU9mZnNldCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGVkZW50JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHNjb3BlT2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgICAgIGRlZGVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwoKICAgICAgICAvLyBIYW5kbGUgZG9jY28gdGl0bGUgY29tbWVudCAoc2luZ2xlIGxpbmUpCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiIyMjIyIpKSB7CiAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgICAgICB9CgogICAgICAgIC8vIEhhbmRsZSBtdWx0aSBsaW5lIGNvbW1lbnRzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiIyMjIikpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBsb25nQ29tbWVudDsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gU2luZ2xlIGxpbmUgY29tbWVudAogICAgICAgIGlmIChjaCA9PT0gJyMnKSB7CiAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgICAgICB9CgogICAgICAgIC8vIEhhbmRsZSBudW1iZXIgbGl0ZXJhbHMKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLT9bMC05XC5dLywgZmFsc2UpKSB7CiAgICAgICAgICAgIHZhciBmbG9hdExpdGVyYWwgPSBmYWxzZTsKICAgICAgICAgICAgLy8gRmxvYXRzCiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14tP1xkKlwuXGQrKGVbXCtcLV0/XGQrKT8vaSkpIHsKICAgICAgICAgICAgICBmbG9hdExpdGVyYWwgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14tP1xkK1wuXGQqLykpIHsKICAgICAgICAgICAgICBmbG9hdExpdGVyYWwgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14tP1wuXGQrLykpIHsKICAgICAgICAgICAgICBmbG9hdExpdGVyYWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmxvYXRMaXRlcmFsKSB7CiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGZyb20gZ2V0dGluZyBleHRyYSAuIG9uIDEuLgogICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIi4iKXsKICAgICAgICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEludGVnZXJzCiAgICAgICAgICAgIHZhciBpbnRMaXRlcmFsID0gZmFsc2U7CiAgICAgICAgICAgIC8vIEhleAogICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLT8weFswLTlhLWZdKy9pKSkgewogICAgICAgICAgICAgIGludExpdGVyYWwgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERlY2ltYWwKICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/WzEtOV1cZCooZVtcK1wtXT9cZCspPy8pKSB7CiAgICAgICAgICAgICAgICBpbnRMaXRlcmFsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBaZXJvIGJ5IGl0c2VsZiB3aXRoIG5vIG90aGVyIHBpZWNlIG9mIG51bWJlci4KICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/MCg/IVtcZHhdKS9pKSkgewogICAgICAgICAgICAgIGludExpdGVyYWwgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbnRMaXRlcmFsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEhhbmRsZSBzdHJpbmdzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChzdHJpbmdQcmVmaXhlcykpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkZhY3Rvcnkoc3RyZWFtLmN1cnJlbnQoKSwgJ3N0cmluZycpOwogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEhhbmRsZSByZWdleCBsaXRlcmFscwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocmVnZXhQcmVmaXhlcykpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5jdXJyZW50KCkgIT0gJy8nIHx8IHN0cmVhbS5tYXRjaCgvXi4qXC8vLCBmYWxzZSkpIHsgLy8gcHJldmVudCBoaWdobGlnaHQgb2YgZGl2aXNpb24KICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5GYWN0b3J5KHN0cmVhbS5jdXJyZW50KCksICdzdHJpbmctMicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSGFuZGxlIG9wZXJhdG9ycyBhbmQgZGVsaW1pdGVycwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2godHJpcGxlRGVsaW1pdGVycykgfHwgc3RyZWFtLm1hdGNoKGRvdWJsZURlbGltaXRlcnMpKSB7CiAgICAgICAgICAgIHJldHVybiAncHVuY3R1YXRpb24nOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvdWJsZU9wZXJhdG9ycykKICAgICAgICAgICAgfHwgc3RyZWFtLm1hdGNoKHNpbmdsZU9wZXJhdG9ycykKICAgICAgICAgICAgfHwgc3RyZWFtLm1hdGNoKHdvcmRPcGVyYXRvcnMpKSB7CiAgICAgICAgICAgIHJldHVybiAnb3BlcmF0b3InOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHNpbmdsZURlbGltaXRlcnMpKSB7CiAgICAgICAgICAgIHJldHVybiAncHVuY3R1YXRpb24nOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChjb25zdGFudHMpKSB7CiAgICAgICAgICAgIHJldHVybiAnYXRvbSc7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGtleXdvcmRzKSkgewogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChpZGVudGlmaWVycykpIHsKICAgICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocHJvcGVydGllcykpIHsKICAgICAgICAgICAgcmV0dXJuICdwcm9wZXJ0eSc7CiAgICAgICAgfQoKICAgICAgICAvLyBIYW5kbGUgbm9uLWRldGVjdGVkIGl0ZW1zCiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbkZhY3RvcnkoZGVsaW1pdGVyLCBvdXRjbGFzcykgewogICAgICAgIHZhciBzaW5nbGVsaW5lID0gZGVsaW1pdGVyLmxlbmd0aCA9PSAxOwogICAgICAgIHJldHVybiBmdW5jdGlvbiB0b2tlblN0cmluZyhzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teJyJcL1xcXS8pOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXQoJ1xcJykpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChzaW5nbGVsaW5lICYmIHN0cmVhbS5lb2woKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0Y2xhc3M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goZGVsaW1pdGVyKSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRjbGFzczsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvWyciXC9dLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNpbmdsZWxpbmUpIHsKICAgICAgICAgICAgICAgIGlmIChjb25mLm1vZGUuc2luZ2xlTGluZVN0cmluZ0Vycm9ycykgewogICAgICAgICAgICAgICAgICAgIG91dGNsYXNzID0gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG91dGNsYXNzOwogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbG9uZ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14jXS8pOwogICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKCIjIyMiKSkgewogICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoIiMiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KCiAgICBmdW5jdGlvbiBpbmRlbnQoc3RyZWFtLCBzdGF0ZSwgdHlwZSkgewogICAgICAgIHR5cGUgPSB0eXBlIHx8ICdjb2ZmZWUnOwogICAgICAgIHZhciBpbmRlbnRVbml0ID0gMDsKICAgICAgICBpZiAodHlwZSA9PT0gJ2NvZmZlZScpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5zY29wZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zY29wZXNbaV0udHlwZSA9PT0gJ2NvZmZlZScpIHsKICAgICAgICAgICAgICAgICAgICBpbmRlbnRVbml0ID0gc3RhdGUuc2NvcGVzW2ldLm9mZnNldCArIGNvbmYuaW5kZW50VW5pdDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGVudFVuaXQgPSBzdHJlYW0uY29sdW1uKCkgKyBzdHJlYW0uY3VycmVudCgpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgc3RhdGUuc2NvcGVzLnVuc2hpZnQoewogICAgICAgICAgICBvZmZzZXQ6IGluZGVudFVuaXQsCiAgICAgICAgICAgIHR5cGU6IHR5cGUKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWRlbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdGF0ZS5zY29wZXMubGVuZ3RoID09IDEpIHJldHVybjsKICAgICAgICBpZiAoc3RhdGUuc2NvcGVzWzBdLnR5cGUgPT09ICdjb2ZmZWUnKSB7CiAgICAgICAgICAgIHZhciBfaW5kZW50ID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgICAgIHZhciBfaW5kZW50X2luZGV4ID0gLTE7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUuc2NvcGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICBpZiAoX2luZGVudCA9PT0gc3RhdGUuc2NvcGVzW2ldLm9mZnNldCkgewogICAgICAgICAgICAgICAgICAgIF9pbmRlbnRfaW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChfaW5kZW50X2luZGV4ID09PSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0YXRlLnNjb3Blc1swXS5vZmZzZXQgIT09IF9pbmRlbnQpIHsKICAgICAgICAgICAgICAgIHN0YXRlLnNjb3Blcy5zaGlmdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS5zY29wZXMuc2hpZnQoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB2YXIgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgICAgIC8vIEhhbmRsZSAnLicgY29ubmVjdGVkIGlkZW50aWZpZXJzCiAgICAgICAgaWYgKGN1cnJlbnQgPT09ICcuJykgewogICAgICAgICAgICBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgICAgICBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgICAgICAgaWYgKHN0eWxlID09PSAndmFyaWFibGUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcy4KICAgICAgICBpZiAoY3VycmVudCA9PT0gJ3JldHVybicpIHsKICAgICAgICAgICAgc3RhdGUuZGVkZW50ICs9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgoKGN1cnJlbnQgPT09ICctPicgfHwgY3VycmVudCA9PT0gJz0+JykgJiYKICAgICAgICAgICAgICAgICAgIXN0YXRlLmxhbWJkYSAmJgogICAgICAgICAgICAgICAgICBzdGF0ZS5zY29wZXNbMF0udHlwZSA9PSAnY29mZmVlJyAmJgogICAgICAgICAgICAgICAgICBzdHJlYW0ucGVlaygpID09PSAnJykKICAgICAgICAgICAgICAgfHwgc3R5bGUgPT09ICdpbmRlbnQnKSB7CiAgICAgICAgICAgIGluZGVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGRlbGltaXRlcl9pbmRleCA9ICdbKHsnLmluZGV4T2YoY3VycmVudCk7CiAgICAgICAgaWYgKGRlbGltaXRlcl9pbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgaW5kZW50KHN0cmVhbSwgc3RhdGUsICddKX0nLnNsaWNlKGRlbGltaXRlcl9pbmRleCwgZGVsaW1pdGVyX2luZGV4KzEpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGluZGVudEtleXdvcmRzLmV4ZWMoY3VycmVudCkpewogICAgICAgICAgICBpbmRlbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChjdXJyZW50ID09ICd0aGVuJyl7CiAgICAgICAgICAgIGRlZGVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CgoKICAgICAgICBpZiAoc3R5bGUgPT09ICdkZWRlbnQnKSB7CiAgICAgICAgICAgIGlmIChkZWRlbnQoc3RyZWFtLCBzdGF0ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRlbGltaXRlcl9pbmRleCA9ICddKX0nLmluZGV4T2YoY3VycmVudCk7CiAgICAgICAgaWYgKGRlbGltaXRlcl9pbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgaWYgKGRlZGVudChzdHJlYW0sIHN0YXRlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlLmRlZGVudCA+IDAgJiYgc3RyZWFtLmVvbCgpICYmIHN0YXRlLnNjb3Blc1swXS50eXBlID09ICdjb2ZmZWUnKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5zY29wZXMubGVuZ3RoID4gMSkgc3RhdGUuc2NvcGVzLnNoaWZ0KCk7CiAgICAgICAgICAgIHN0YXRlLmRlZGVudCAtPSAxOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQoKICAgIHZhciBleHRlcm5hbCA9IHsKICAgICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICBzY29wZXM6IFt7b2Zmc2V0OmJhc2Vjb2x1bW4gfHwgMCwgdHlwZTonY29mZmVlJ31dLAogICAgICAgICAgICAgIGxhc3RUb2tlbjogbnVsbCwKICAgICAgICAgICAgICBsYW1iZGE6IGZhbHNlLAogICAgICAgICAgICAgIGRlZGVudDogMAogICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICB2YXIgc3R5bGUgPSB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpOwoKICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuID0ge3N0eWxlOnN0eWxlLCBjb250ZW50OiBzdHJlYW0uY3VycmVudCgpfTsKCiAgICAgICAgICAgIGlmIChzdHJlYW0uZW9sKCkgJiYgc3RyZWFtLmxhbWJkYSkgewogICAgICAgICAgICAgICAgc3RhdGUubGFtYmRhID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgICB9LAoKICAgICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gc3RhdGUuc2NvcGVzWzBdLm9mZnNldDsKICAgICAgICB9CgogICAgfTsKICAgIHJldHVybiBleHRlcm5hbDsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoJ3RleHQveC1jb2ZmZWVzY3JpcHQnLCAnY29mZmVlc2NyaXB0Jyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/coffeescript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IENvZmZlZVNjcmlwdCBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iY29mZmVlc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIHNpbHZlcjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHNpbHZlcjt9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogQ29mZmVlU2NyaXB0IG1vZGU8L2gxPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyBDb2ZmZWVTY3JpcHQgbW9kZSBmb3IgQ29kZU1pcnJvcgojIENvcHlyaWdodCAoYykgMjAxMSBKZWZmIFBpY2toYXJkdCwgcmVsZWFzZWQgdW5kZXIKIyB0aGUgTUlUIExpY2Vuc2UuCiMKIyBNb2RpZmllZCBmcm9tIHRoZSBQeXRob24gQ29kZU1pcnJvciBtb2RlLCB3aGljaCBhbHNvIGlzIAojIHVuZGVyIHRoZSBNSVQgTGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMTAgVGltb3RoeSBGYXJyZWxsLgojCiMgVGhlIGZvbGxvd2luZyBzY3JpcHQsIFVuZGVyc2NvcmUuY29mZmVlLCBpcyB1c2VkIHRvIAojIGRlbW9uc3RyYXRlIENvZmZlZVNjcmlwdCBtb2RlIGZvciBDb2RlTWlycm9yLgojCiMgVG8gZG93bmxvYWQgQ29mZmVlU2NyaXB0IG1vZGUgZm9yIENvZGVNaXJyb3IsIGdvIHRvOgojIGh0dHBzOi8vZ2l0aHViLmNvbS9waWNraGFyZHQvY29mZmVlc2NyaXB0LWNvZGVtaXJyb3ItbW9kZQoKIyAqKlVuZGVyc2NvcmUuY29mZmVlCiMgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIEluYy4qKgojIFVuZGVyc2NvcmUgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQojIFtNSVQgbGljZW5zZV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSkuCiMgUG9ydGlvbnMgb2YgVW5kZXJzY29yZSBhcmUgaW5zcGlyZWQgYnkgb3IgYm9ycm93ZWQgZnJvbQojIFtQcm90b3R5cGUuanNdKGh0dHA6Ly9wcm90b3R5cGVqcy5vcmcvYXBpKSwgT2xpdmVyIFN0ZWVsZSdzCiMgW0Z1bmN0aW9uYWxdKGh0dHA6Ly9vc3RlZWxlLmNvbSksIGFuZCBKb2huIFJlc2lnJ3MKIyBbTWljcm8tVGVtcGxhdGluZ10oaHR0cDovL2Vqb2huLm9yZykuCiMgRm9yIGFsbCBkZXRhaWxzIGFuZCBkb2N1bWVudGF0aW9uOgojIGh0dHA6Ly9kb2N1bWVudGNsb3VkLmdpdGh1Yi5jb20vdW5kZXJzY29yZS8KCgojIEJhc2VsaW5lIHNldHVwCiMgLS0tLS0tLS0tLS0tLS0KCiMgRXN0YWJsaXNoIHRoZSByb290IG9iamVjdCwgYHdpbmRvd2AgaW4gdGhlIGJyb3dzZXIsIG9yIGBnbG9iYWxgIG9uIHRoZSBzZXJ2ZXIuCnJvb3QgPSB0aGlzCgoKIyBTYXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgYF9gIHZhcmlhYmxlLgpwcmV2aW91c1VuZGVyc2NvcmUgPSByb290Ll8KCiMjIyBNdWx0aWxpbmUKICAgIGNvbW1lbnQKIyMjCgojIEVzdGFibGlzaCB0aGUgb2JqZWN0IHRoYXQgZ2V0cyB0aHJvd24gdG8gYnJlYWsgb3V0IG9mIGEgbG9vcCBpdGVyYXRpb24uCiMgYFN0b3BJdGVyYXRpb25gIGlzIFNPUCBvbiBNb3ppbGxhLgpicmVha2VyID0gaWYgdHlwZW9mKFN0b3BJdGVyYXRpb24pIGlzICd1bmRlZmluZWQnIHRoZW4gJ19fYnJlYWtfXycgZWxzZSBTdG9wSXRlcmF0aW9uCgoKIyMjIyBEb2NjbyBzdHlsZSBzaW5nbGUgbGluZSBjb21tZW50ICh0aXRsZSkKCgojIEhlbHBlciBmdW5jdGlvbiB0byBlc2NhcGUgKipSZWdFeHAqKiBjb250ZW50cywgYmVjYXVzZSBKUyBkb2Vzbid0IGhhdmUgb25lLgplc2NhcGVSZWdFeHAgPSAoc3RyaW5nKSAtPiBzdHJpbmcucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXVwvXFxdKS9nLCAnXFwkMScpCgoKIyBTYXZlIGJ5dGVzIGluIHRoZSBtaW5pZmllZCAoYnV0IG5vdCBnemlwcGVkKSB2ZXJzaW9uOgpBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlCk9ialByb3RvID0gT2JqZWN0LnByb3RvdHlwZQoKCiMgQ3JlYXRlIHF1aWNrIHJlZmVyZW5jZSB2YXJpYWJsZXMgZm9yIHNwZWVkIGFjY2VzcyB0byBjb3JlIHByb3RvdHlwZXMuCnNsaWNlID0gQXJyYXlQcm90by5zbGljZQp1bnNoaWZ0ID0gQXJyYXlQcm90by51bnNoaWZ0CnRvU3RyaW5nID0gT2JqUHJvdG8udG9TdHJpbmcKaGFzT3duUHJvcGVydHkgPSBPYmpQcm90by5oYXNPd25Qcm9wZXJ0eQpwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IE9ialByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlCgoKIyBBbGwgKipFQ01BNSoqIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgd2UgaG9wZSB0byB1c2UgYXJlIGRlY2xhcmVkIGhlcmUuCm5hdGl2ZUZvckVhY2ggPSBBcnJheVByb3RvLmZvckVhY2gKbmF0aXZlTWFwID0gQXJyYXlQcm90by5tYXAKbmF0aXZlUmVkdWNlID0gQXJyYXlQcm90by5yZWR1Y2UKbmF0aXZlUmVkdWNlUmlnaHQgPSBBcnJheVByb3RvLnJlZHVjZVJpZ2h0Cm5hdGl2ZUZpbHRlciA9IEFycmF5UHJvdG8uZmlsdGVyCm5hdGl2ZUV2ZXJ5ID0gQXJyYXlQcm90by5ldmVyeQpuYXRpdmVTb21lID0gQXJyYXlQcm90by5zb21lCm5hdGl2ZUluZGV4T2YgPSBBcnJheVByb3RvLmluZGV4T2YKbmF0aXZlTGFzdEluZGV4T2YgPSBBcnJheVByb3RvLmxhc3RJbmRleE9mCm5hdGl2ZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5Cm5hdGl2ZUtleXMgPSBPYmplY3Qua2V5cwoKCiMgQ3JlYXRlIGEgc2FmZSByZWZlcmVuY2UgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciB1c2UgYmVsb3cuCl8gPSAob2JqKSAtPiBuZXcgd3JhcHBlcihvYmopCgoKIyBFeHBvcnQgdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciAqKkNvbW1vbkpTKiouCmlmIHR5cGVvZihleHBvcnRzKSAhPSAndW5kZWZpbmVkJyB0aGVuIGV4cG9ydHMuXyA9IF8KCgojIEV4cG9ydCBVbmRlcnNjb3JlIHRvIGdsb2JhbCBzY29wZS4Kcm9vdC5fID0gXwoKCiMgQ3VycmVudCB2ZXJzaW9uLgpfLlZFUlNJT04gPSAnMS4xLjAnCgoKIyBDb2xsZWN0aW9uIEZ1bmN0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIFRoZSBjb3JuZXJzdG9uZSwgYW4gKiplYWNoKiogaW1wbGVtZW50YXRpb24uCiMgSGFuZGxlcyBvYmplY3RzIGltcGxlbWVudGluZyAqKmZvckVhY2gqKiwgYXJyYXlzLCBhbmQgcmF3IG9iamVjdHMuCl8uZWFjaCA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIHRyeQogICAgaWYgbmF0aXZlRm9yRWFjaCBhbmQgb2JqLmZvckVhY2ggaXMgbmF0aXZlRm9yRWFjaAogICAgICBvYmouZm9yRWFjaCBpdGVyYXRvciwgY29udGV4dAogICAgZWxzZSBpZiBfLmlzTnVtYmVyIG9iai5sZW5ndGgKICAgICAgaXRlcmF0b3IuY2FsbCBjb250ZXh0LCBvYmpbaV0sIGksIG9iaiBmb3IgaSBpbiBbMC4uLm9iai5sZW5ndGhdCiAgICBlbHNlCiAgICAgIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgdmFsLCBrZXksIG9iaiBmb3Igb3duIGtleSwgdmFsIG9mIG9iagogIGNhdGNoIGUKICAgIHRocm93IGUgaWYgZSBpc250IGJyZWFrZXIKICBvYmoKCgojIFJldHVybiB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUgaXRlcmF0b3IgdG8gZWFjaCBlbGVtZW50LiBVc2UgSmF2YVNjcmlwdAojIDEuNidzIHZlcnNpb24gb2YgKiptYXAqKiwgaWYgcG9zc2libGUuCl8ubWFwID0gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIC0+CiAgcmV0dXJuIG9iai5tYXAoaXRlcmF0b3IsIGNvbnRleHQpIGlmIG5hdGl2ZU1hcCBhbmQgb2JqLm1hcCBpcyBuYXRpdmVNYXAKICByZXN1bHRzID0gW10KICBfLmVhY2ggb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAgcmVzdWx0cy5wdXNoIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0CiAgcmVzdWx0cwoKCiMgKipSZWR1Y2UqKiBidWlsZHMgdXAgYSBzaW5nbGUgcmVzdWx0IGZyb20gYSBsaXN0IG9mIHZhbHVlcy4gQWxzbyBrbm93biBhcwojICoqaW5qZWN0KiosIG9yICoqZm9sZGwqKi4gVXNlcyBKYXZhU2NyaXB0IDEuOCdzIHZlcnNpb24gb2YgKipyZWR1Y2UqKiwgaWYgcG9zc2libGUuCl8ucmVkdWNlID0gKG9iaiwgaXRlcmF0b3IsIG1lbW8sIGNvbnRleHQpIC0+CiAgaWYgbmF0aXZlUmVkdWNlIGFuZCBvYmoucmVkdWNlIGlzIG5hdGl2ZVJlZHVjZQogICAgaXRlcmF0b3IgPSBfLmJpbmQgaXRlcmF0b3IsIGNvbnRleHQgaWYgY29udGV4dAogICAgcmV0dXJuIG9iai5yZWR1Y2UgaXRlcmF0b3IsIG1lbW8KICBfLmVhY2ggb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAgbWVtbyA9IGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgbWVtbywgdmFsdWUsIGluZGV4LCBsaXN0CiAgbWVtbwoKCiMgVGhlIHJpZ2h0LWFzc29jaWF0aXZlIHZlcnNpb24gb2YgKipyZWR1Y2UqKiwgYWxzbyBrbm93biBhcyAqKmZvbGRyKiouIFVzZXMKIyBKYXZhU2NyaXB0IDEuOCdzIHZlcnNpb24gb2YgKipyZWR1Y2VSaWdodCoqLCBpZiBhdmFpbGFibGUuCl8ucmVkdWNlUmlnaHQgPSAob2JqLCBpdGVyYXRvciwgbWVtbywgY29udGV4dCkgLT4KICBpZiBuYXRpdmVSZWR1Y2VSaWdodCBhbmQgb2JqLnJlZHVjZVJpZ2h0IGlzIG5hdGl2ZVJlZHVjZVJpZ2h0CiAgICBpdGVyYXRvciA9IF8uYmluZCBpdGVyYXRvciwgY29udGV4dCBpZiBjb250ZXh0CiAgICByZXR1cm4gb2JqLnJlZHVjZVJpZ2h0IGl0ZXJhdG9yLCBtZW1vCiAgcmV2ZXJzZWQgPSBfLmNsb25lKF8udG9BcnJheShvYmopKS5yZXZlcnNlKCkKICBfLnJlZHVjZSByZXZlcnNlZCwgaXRlcmF0b3IsIG1lbW8sIGNvbnRleHQKCgojIFJldHVybiB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggcGFzc2VzIGEgdHJ1dGggdGVzdC4KXy5kZXRlY3QgPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICByZXN1bHQgPSBudWxsCiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIGlmIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0CiAgICAgIHJlc3VsdCA9IHZhbHVlCiAgICAgIF8uYnJlYWtMb29wKCkKICByZXN1bHQKCgojIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgcGFzcyBhIHRydXRoIHRlc3QuIFVzZSBKYXZhU2NyaXB0IDEuNidzCiMgKipmaWx0ZXIqKiwgaWYgaXQgZXhpc3RzLgpfLmZpbHRlciA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIHJldHVybiBvYmouZmlsdGVyIGl0ZXJhdG9yLCBjb250ZXh0IGlmIG5hdGl2ZUZpbHRlciBhbmQgb2JqLmZpbHRlciBpcyBuYXRpdmVGaWx0ZXIKICByZXN1bHRzID0gW10KICBfLmVhY2ggb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAgcmVzdWx0cy5wdXNoIHZhbHVlIGlmIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0CiAgcmVzdWx0cwoKCiMgUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgZm9yIHdoaWNoIGEgdHJ1dGggdGVzdCBmYWlscy4KXy5yZWplY3QgPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICByZXN1bHRzID0gW10KICBfLmVhY2ggb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAgcmVzdWx0cy5wdXNoIHZhbHVlIGlmIG5vdCBpdGVyYXRvci5jYWxsIGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdAogIHJlc3VsdHMKCgojIERldGVybWluZSB3aGV0aGVyIGFsbCBvZiB0aGUgZWxlbWVudHMgbWF0Y2ggYSB0cnV0aCB0ZXN0LiBEZWxlZ2F0ZSB0bwojIEphdmFTY3JpcHQgMS42J3MgKipldmVyeSoqLCBpZiBpdCBpcyBwcmVzZW50LgpfLmV2ZXJ5ID0gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIC0+CiAgaXRlcmF0b3IgfHw9IF8uaWRlbnRpdHkKICByZXR1cm4gb2JqLmV2ZXJ5IGl0ZXJhdG9yLCBjb250ZXh0IGlmIG5hdGl2ZUV2ZXJ5IGFuZCBvYmouZXZlcnkgaXMgbmF0aXZlRXZlcnkKICByZXN1bHQgPSB0cnVlCiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIF8uYnJlYWtMb29wKCkgdW5sZXNzIChyZXN1bHQgPSByZXN1bHQgYW5kIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0KSkKICByZXN1bHQKCgojIERldGVybWluZSBpZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiB0aGUgb2JqZWN0IG1hdGNoZXMgYSB0cnV0aCB0ZXN0LiBVc2UKIyBKYXZhU2NyaXB0IDEuNidzICoqc29tZSoqLCBpZiBpdCBleGlzdHMuCl8uc29tZSA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIGl0ZXJhdG9yIHx8PSBfLmlkZW50aXR5CiAgcmV0dXJuIG9iai5zb21lIGl0ZXJhdG9yLCBjb250ZXh0IGlmIG5hdGl2ZVNvbWUgYW5kIG9iai5zb21lIGlzIG5hdGl2ZVNvbWUKICByZXN1bHQgPSBmYWxzZQogIF8uZWFjaCBvYmosICh2YWx1ZSwgaW5kZXgsIGxpc3QpIC0+CiAgICBfLmJyZWFrTG9vcCgpIGlmIChyZXN1bHQgPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkpCiAgcmVzdWx0CgoKIyBEZXRlcm1pbmUgaWYgYSBnaXZlbiB2YWx1ZSBpcyBpbmNsdWRlZCBpbiB0aGUgYXJyYXkgb3Igb2JqZWN0LAojIGJhc2VkIG9uIGA9PT1gLgpfLmluY2x1ZGUgPSAob2JqLCB0YXJnZXQpIC0+CiAgcmV0dXJuIF8uaW5kZXhPZihvYmosIHRhcmdldCkgaXNudCAtMSBpZiBuYXRpdmVJbmRleE9mIGFuZCBvYmouaW5kZXhPZiBpcyBuYXRpdmVJbmRleE9mCiAgcmV0dXJuIHRydWUgZm9yIG93biBrZXksIHZhbCBvZiBvYmogd2hlbiB2YWwgaXMgdGFyZ2V0CiAgZmFsc2UKCgojIEludm9rZSBhIG1ldGhvZCB3aXRoIGFyZ3VtZW50cyBvbiBldmVyeSBpdGVtIGluIGEgY29sbGVjdGlvbi4KXy5pbnZva2UgPSAob2JqLCBtZXRob2QpIC0+CiAgYXJncyA9IF8ucmVzdCBhcmd1bWVudHMsIDIKICAoaWYgbWV0aG9kIHRoZW4gdmFsW21ldGhvZF0gZWxzZSB2YWwpLmFwcGx5KHZhbCwgYXJncykgZm9yIHZhbCBpbiBvYmoKCgojIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgKiptYXAqKjogZmV0Y2hpbmcgYSBwcm9wZXJ0eS4KXy5wbHVjayA9IChvYmosIGtleSkgLT4KICBfLm1hcChvYmosICh2YWwpIC0+IHZhbFtrZXldKQoKCiMgUmV0dXJuIHRoZSBtYXhpbXVtIGl0ZW0gb3IgKGl0ZW0tYmFzZWQgY29tcHV0YXRpb24pLgpfLm1heCA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBvYmopIGlmIG5vdCBpdGVyYXRvciBhbmQgXy5pc0FycmF5KG9iaikKICByZXN1bHQgPSBjb21wdXRlZDogLUluZmluaXR5CiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIGNvbXB1dGVkID0gaWYgaXRlcmF0b3IgdGhlbiBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkgZWxzZSB2YWx1ZQogICAgY29tcHV0ZWQgPj0gcmVzdWx0LmNvbXB1dGVkIGFuZCAocmVzdWx0ID0ge3ZhbHVlOiB2YWx1ZSwgY29tcHV0ZWQ6IGNvbXB1dGVkfSkKICByZXN1bHQudmFsdWUKCgojIFJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IChvciBlbGVtZW50LWJhc2VkIGNvbXB1dGF0aW9uKS4KXy5taW4gPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICByZXR1cm4gTWF0aC5taW4uYXBwbHkoTWF0aCwgb2JqKSBpZiBub3QgaXRlcmF0b3IgYW5kIF8uaXNBcnJheShvYmopCiAgcmVzdWx0ID0gY29tcHV0ZWQ6IEluZmluaXR5CiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIGNvbXB1dGVkID0gaWYgaXRlcmF0b3IgdGhlbiBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkgZWxzZSB2YWx1ZQogICAgY29tcHV0ZWQgPCByZXN1bHQuY29tcHV0ZWQgYW5kIChyZXN1bHQgPSB7dmFsdWU6IHZhbHVlLCBjb21wdXRlZDogY29tcHV0ZWR9KQogIHJlc3VsdC52YWx1ZQoKCiMgU29ydCB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uIHByb2R1Y2VkIGJ5IGFuIGl0ZXJhdG9yLgpfLnNvcnRCeSA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIF8ucGx1Y2soKChfLm1hcCBvYmosICh2YWx1ZSwgaW5kZXgsIGxpc3QpIC0+CiAgICB7dmFsdWU6IHZhbHVlLCBjcml0ZXJpYTogaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QpfQogICkuc29ydCgobGVmdCwgcmlnaHQpIC0+CiAgICBhID0gbGVmdC5jcml0ZXJpYTsgYiA9IHJpZ2h0LmNyaXRlcmlhCiAgICBpZiBhIDwgYiB0aGVuIC0xIGVsc2UgaWYgYSA+IGIgdGhlbiAxIGVsc2UgMAogICkpLCAndmFsdWUnKQoKCiMgVXNlIGEgY29tcGFyYXRvciBmdW5jdGlvbiB0byBmaWd1cmUgb3V0IGF0IHdoYXQgaW5kZXggYW4gb2JqZWN0IHNob3VsZAojIGJlIGluc2VydGVkIHNvIGFzIHRvIG1haW50YWluIG9yZGVyLiBVc2VzIGJpbmFyeSBzZWFyY2guCl8uc29ydGVkSW5kZXggPSAoYXJyYXksIG9iaiwgaXRlcmF0b3IpIC0+CiAgaXRlcmF0b3IgfHw9IF8uaWRlbnRpdHkKICBsb3cgPSAwCiAgaGlnaCA9IGFycmF5Lmxlbmd0aAogIHdoaWxlIGxvdyA8IGhpZ2gKICAgIG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxCiAgICBpZiBpdGVyYXRvcihhcnJheVttaWRdKSA8IGl0ZXJhdG9yKG9iaikgdGhlbiBsb3cgPSBtaWQgKyAxIGVsc2UgaGlnaCA9IG1pZAogIGxvdwoKCiMgQ29udmVydCBhbnl0aGluZyBpdGVyYWJsZSBpbnRvIGEgcmVhbCwgbGl2ZSBhcnJheS4KXy50b0FycmF5ID0gKGl0ZXJhYmxlKSAtPgogIHJldHVybiBbXSBpZiAoIWl0ZXJhYmxlKQogIHJldHVybiBpdGVyYWJsZS50b0FycmF5KCkgaWYgKGl0ZXJhYmxlLnRvQXJyYXkpCiAgcmV0dXJuIGl0ZXJhYmxlIGlmIChfLmlzQXJyYXkoaXRlcmFibGUpKQogIHJldHVybiBzbGljZS5jYWxsKGl0ZXJhYmxlKSBpZiAoXy5pc0FyZ3VtZW50cyhpdGVyYWJsZSkpCiAgXy52YWx1ZXMoaXRlcmFibGUpCgoKIyBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBvYmplY3QuCl8uc2l6ZSA9IChvYmopIC0+IF8udG9BcnJheShvYmopLmxlbmd0aAoKCiMgQXJyYXkgRnVuY3Rpb25zCiMgLS0tLS0tLS0tLS0tLS0tCgojIEdldCB0aGUgZmlyc3QgZWxlbWVudCBvZiBhbiBhcnJheS4gUGFzc2luZyBgbmAgd2lsbCByZXR1cm4gdGhlIGZpcnN0IE4KIyB2YWx1ZXMgaW4gdGhlIGFycmF5LiBBbGlhc2VkIGFzICoqaGVhZCoqLiBUaGUgYGd1YXJkYCBjaGVjayBhbGxvd3MgaXQgdG8gd29yawojIHdpdGggKiptYXAqKi4KXy5maXJzdCA9IChhcnJheSwgbiwgZ3VhcmQpIC0+CiAgaWYgbiBhbmQgbm90IGd1YXJkIHRoZW4gc2xpY2UuY2FsbChhcnJheSwgMCwgbikgZWxzZSBhcnJheVswXQoKCiMgUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGFycmF5LiBBbGlhc2VkIGFzICoqdGFpbCoqLgojIEVzcGVjaWFsbHkgdXNlZnVsIG9uIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBQYXNzaW5nIGFuIGBpbmRleGAgd2lsbCByZXR1cm4KIyB0aGUgcmVzdCBvZiB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBmcm9tIHRoYXQgaW5kZXggb253YXJkLiBUaGUgYGd1YXJkYAojIGNoZWNrIGFsbG93cyBpdCB0byB3b3JrIHdpdGggKiptYXAqKi4KXy5yZXN0ID0gKGFycmF5LCBpbmRleCwgZ3VhcmQpIC0+CiAgc2xpY2UuY2FsbChhcnJheSwgaWYgXy5pc1VuZGVmaW5lZChpbmRleCkgb3IgZ3VhcmQgdGhlbiAxIGVsc2UgaW5kZXgpCgoKIyBHZXQgdGhlIGxhc3QgZWxlbWVudCBvZiBhbiBhcnJheS4KXy5sYXN0ID0gKGFycmF5KSAtPiBhcnJheVthcnJheS5sZW5ndGggLSAxXQoKCiMgVHJpbSBvdXQgYWxsIGZhbHN5IHZhbHVlcyBmcm9tIGFuIGFycmF5LgpfLmNvbXBhY3QgPSAoYXJyYXkpIC0+IGl0ZW0gZm9yIGl0ZW0gaW4gYXJyYXkgd2hlbiBpdGVtCgoKIyBSZXR1cm4gYSBjb21wbGV0ZWx5IGZsYXR0ZW5lZCB2ZXJzaW9uIG9mIGFuIGFycmF5LgpfLmZsYXR0ZW4gPSAoYXJyYXkpIC0+CiAgXy5yZWR1Y2UgYXJyYXksIChtZW1vLCB2YWx1ZSkgLT4KICAgIHJldHVybiBtZW1vLmNvbmNhdChfLmZsYXR0ZW4odmFsdWUpKSBpZiBfLmlzQXJyYXkgdmFsdWUKICAgIG1lbW8ucHVzaCB2YWx1ZQogICAgbWVtbwogICwgW10KCgojIFJldHVybiBhIHZlcnNpb24gb2YgdGhlIGFycmF5IHRoYXQgZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIHZhbHVlKHMpLgpfLndpdGhvdXQgPSAoYXJyYXkpIC0+CiAgdmFsdWVzID0gXy5yZXN0IGFyZ3VtZW50cwogIHZhbCBmb3IgdmFsIGluIF8udG9BcnJheShhcnJheSkgd2hlbiBub3QgXy5pbmNsdWRlIHZhbHVlcywgdmFsCgoKIyBQcm9kdWNlIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiB0aGUgYXJyYXkuIElmIHRoZSBhcnJheSBoYXMgYWxyZWFkeQojIGJlZW4gc29ydGVkLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIGEgZmFzdGVyIGFsZ29yaXRobS4KXy51bmlxID0gKGFycmF5LCBpc1NvcnRlZCkgLT4KICBtZW1vID0gW10KICBmb3IgZWwsIGkgaW4gXy50b0FycmF5IGFycmF5CiAgICBtZW1vLnB1c2ggZWwgaWYgaSBpcyAwIHx8IChpZiBpc1NvcnRlZCBpcyB0cnVlIHRoZW4gXy5sYXN0KG1lbW8pIGlzbnQgZWwgZWxzZSBub3QgXy5pbmNsdWRlKG1lbW8sIGVsKSkKICBtZW1vCgoKIyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgZXZlcnkgaXRlbSBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlCiMgcGFzc2VkLWluIGFycmF5cy4KXy5pbnRlcnNlY3QgPSAoYXJyYXkpIC0+CiAgcmVzdCA9IF8ucmVzdCBhcmd1bWVudHMKICBfLnNlbGVjdCBfLnVuaXEoYXJyYXkpLCAoaXRlbSkgLT4KICAgIF8uYWxsIHJlc3QsIChvdGhlcikgLT4KICAgICAgXy5pbmRleE9mKG90aGVyLCBpdGVtKSA+PSAwCgoKIyBaaXAgdG9nZXRoZXIgbXVsdGlwbGUgbGlzdHMgaW50byBhIHNpbmdsZSBhcnJheSAtLSBlbGVtZW50cyB0aGF0IHNoYXJlCiMgYW4gaW5kZXggZ28gdG9nZXRoZXIuCl8uemlwID0gLT4KICBsZW5ndGggPSBfLm1heCBfLnBsdWNrIGFyZ3VtZW50cywgJ2xlbmd0aCcKICByZXN1bHRzID0gbmV3IEFycmF5IGxlbmd0aAogIGZvciBpIGluIFswLi4ubGVuZ3RoXQogICAgcmVzdWx0c1tpXSA9IF8ucGx1Y2sgYXJndW1lbnRzLCBTdHJpbmcgaQogIHJlc3VsdHMKCgojIElmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcGx5IHVzIHdpdGggKippbmRleE9mKiogKEknbSBsb29raW5nIGF0IHlvdSwgTVNJRSksCiMgd2UgbmVlZCB0aGlzIGZ1bmN0aW9uLiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFuCiMgaXRlbSBpbiBhbiBhcnJheSwgb3IgLTEgaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS4KXy5pbmRleE9mID0gKGFycmF5LCBpdGVtKSAtPgogIHJldHVybiBhcnJheS5pbmRleE9mIGl0ZW0gaWYgbmF0aXZlSW5kZXhPZiBhbmQgYXJyYXkuaW5kZXhPZiBpcyBuYXRpdmVJbmRleE9mCiAgaSA9IDA7IGwgPSBhcnJheS5sZW5ndGgKICB3aGlsZSBsIC0gaQogICAgaWYgYXJyYXlbaV0gaXMgaXRlbSB0aGVuIHJldHVybiBpIGVsc2UgaSsrCiAgLTEKCgojIFByb3ZpZGUgSmF2YVNjcmlwdCAxLjYncyAqKmxhc3RJbmRleE9mKiosIGRlbGVnYXRpbmcgdG8gdGhlIG5hdGl2ZSBmdW5jdGlvbiwKIyBpZiBwb3NzaWJsZS4KXy5sYXN0SW5kZXhPZiA9IChhcnJheSwgaXRlbSkgLT4KICByZXR1cm4gYXJyYXkubGFzdEluZGV4T2YoaXRlbSkgaWYgbmF0aXZlTGFzdEluZGV4T2YgYW5kIGFycmF5Lmxhc3RJbmRleE9mIGlzIG5hdGl2ZUxhc3RJbmRleE9mCiAgaSA9IGFycmF5Lmxlbmd0aAogIHdoaWxlIGkKICAgIGlmIGFycmF5W2ldIGlzIGl0ZW0gdGhlbiByZXR1cm4gaSBlbHNlIGktLQogIC0xCgoKIyBHZW5lcmF0ZSBhbiBpbnRlZ2VyIEFycmF5IGNvbnRhaW5pbmcgYW4gYXJpdGhtZXRpYyBwcm9ncmVzc2lvbi4gQSBwb3J0IG9mCiMgW3RoZSBuYXRpdmUgUHl0aG9uICoqcmFuZ2UqKiBmdW5jdGlvbl0oaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2Z1bmN0aW9ucy5odG1sI3JhbmdlKS4KXy5yYW5nZSA9IChzdGFydCwgc3RvcCwgc3RlcCkgLT4KICBhID0gYXJndW1lbnRzCiAgc29sbyA9IGEubGVuZ3RoIDw9IDEKICBpID0gc3RhcnQgPSBpZiBzb2xvIHRoZW4gMCBlbHNlIGFbMF0KICBzdG9wID0gaWYgc29sbyB0aGVuIGFbMF0gZWxzZSBhWzFdCiAgc3RlcCA9IGFbMl0gb3IgMQogIGxlbiA9IE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApCiAgcmV0dXJuIFtdIGlmIGxlbiA8PSAwCiAgcmFuZ2UgPSBuZXcgQXJyYXkgbGVuCiAgaWR4ID0gMAogIGxvb3AKICAgIHJldHVybiByYW5nZSBpZiAoaWYgc3RlcCA+IDAgdGhlbiBpIC0gc3RvcCBlbHNlIHN0b3AgLSBpKSA+PSAwCiAgICByYW5nZVtpZHhdID0gaQogICAgaWR4KysKICAgIGkrPSBzdGVwCgoKIyBGdW5jdGlvbiBGdW5jdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0KCiMgQ3JlYXRlIGEgZnVuY3Rpb24gYm91bmQgdG8gYSBnaXZlbiBvYmplY3QgKGFzc2lnbmluZyBgdGhpc2AsIGFuZCBhcmd1bWVudHMsCiMgb3B0aW9uYWxseSkuIEJpbmRpbmcgd2l0aCBhcmd1bWVudHMgaXMgYWxzbyBrbm93biBhcyAqKmN1cnJ5KiouCl8uYmluZCA9IChmdW5jLCBvYmopIC0+CiAgYXJncyA9IF8ucmVzdCBhcmd1bWVudHMsIDIKICAtPiBmdW5jLmFwcGx5IG9iaiBvciByb290LCBhcmdzLmNvbmNhdCBhcmd1bWVudHMKCgojIEJpbmQgYWxsIG9mIGFuIG9iamVjdCdzIG1ldGhvZHMgdG8gdGhhdCBvYmplY3QuIFVzZWZ1bCBmb3IgZW5zdXJpbmcgdGhhdAojIGFsbCBjYWxsYmFja3MgZGVmaW5lZCBvbiBhbiBvYmplY3QgYmVsb25nIHRvIGl0LgpfLmJpbmRBbGwgPSAob2JqKSAtPgogIGZ1bmNzID0gaWYgYXJndW1lbnRzLmxlbmd0aCA+IDEgdGhlbiBfLnJlc3QoYXJndW1lbnRzKSBlbHNlIF8uZnVuY3Rpb25zKG9iaikKICBfLmVhY2ggZnVuY3MsIChmKSAtPiBvYmpbZl0gPSBfLmJpbmQgb2JqW2ZdLCBvYmoKICBvYmoKCgojIERlbGF5cyBhIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgYW5kIHRoZW4gY2FsbHMKIyBpdCB3aXRoIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQuCl8uZGVsYXkgPSAoZnVuYywgd2FpdCkgLT4KICBhcmdzID0gXy5yZXN0IGFyZ3VtZW50cywgMgogIHNldFRpbWVvdXQoKC0+IGZ1bmMuYXBwbHkoZnVuYywgYXJncykpLCB3YWl0KQoKCiMgTWVtb2l6ZSBhbiBleHBlbnNpdmUgZnVuY3Rpb24gYnkgc3RvcmluZyBpdHMgcmVzdWx0cy4KXy5tZW1vaXplID0gKGZ1bmMsIGhhc2hlcikgLT4KICBtZW1vID0ge30KICBoYXNoZXIgb3I9IF8uaWRlbnRpdHkKICAtPgogICAga2V5ID0gaGFzaGVyLmFwcGx5IHRoaXMsIGFyZ3VtZW50cwogICAgcmV0dXJuIG1lbW9ba2V5XSBpZiBrZXkgb2YgbWVtbwogICAgbWVtb1trZXldID0gZnVuYy5hcHBseSB0aGlzLCBhcmd1bWVudHMKCgojIERlZmVycyBhIGZ1bmN0aW9uLCBzY2hlZHVsaW5nIGl0IHRvIHJ1biBhZnRlciB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcwojIGNsZWFyZWQuCl8uZGVmZXIgPSAoZnVuYykgLT4KICBfLmRlbGF5LmFwcGx5IF8sIFtmdW5jLCAxXS5jb25jYXQgXy5yZXN0IGFyZ3VtZW50cwoKCiMgUmV0dXJucyB0aGUgZmlyc3QgZnVuY3Rpb24gcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBzZWNvbmQsCiMgYWxsb3dpbmcgeW91IHRvIGFkanVzdCBhcmd1bWVudHMsIHJ1biBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIsIGFuZAojIGNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uCl8ud3JhcCA9IChmdW5jLCB3cmFwcGVyKSAtPgogIC0+IHdyYXBwZXIuYXBwbHkgd3JhcHBlciwgW2Z1bmNdLmNvbmNhdCBhcmd1bWVudHMKCgojIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBhIGxpc3Qgb2YgZnVuY3Rpb25zLCBlYWNoCiMgY29uc3VtaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgZm9sbG93cy4KXy5jb21wb3NlID0gLT4KICBmdW5jcyA9IGFyZ3VtZW50cwogIC0+CiAgICBhcmdzID0gYXJndW1lbnRzCiAgICBmb3IgaSBpbiBbZnVuY3MubGVuZ3RoIC0gMS4uMF0gYnkgLTEKICAgICAgYXJncyA9IFtmdW5jc1tpXS5hcHBseSh0aGlzLCBhcmdzKV0KICAgIGFyZ3NbMF0KCgojIE9iamVjdCBGdW5jdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tCgojIFJldHJpZXZlIHRoZSBuYW1lcyBvZiBhbiBvYmplY3QncyBwcm9wZXJ0aWVzLgpfLmtleXMgPSBuYXRpdmVLZXlzIG9yIChvYmopIC0+CiAgcmV0dXJuIF8ucmFuZ2UgMCwgb2JqLmxlbmd0aCBpZiBfLmlzQXJyYXkob2JqKQogIGtleSBmb3Iga2V5LCB2YWwgb2Ygb2JqCgoKIyBSZXRyaWV2ZSB0aGUgdmFsdWVzIG9mIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuCl8udmFsdWVzID0gKG9iaikgLT4KICBfLm1hcCBvYmosIF8uaWRlbnRpdHkKCgojIFJldHVybiBhIHNvcnRlZCBsaXN0IG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBhdmFpbGFibGUgaW4gVW5kZXJzY29yZS4KXy5mdW5jdGlvbnMgPSAob2JqKSAtPgogIF8uZmlsdGVyKF8ua2V5cyhvYmopLCAoa2V5KSAtPiBfLmlzRnVuY3Rpb24ob2JqW2tleV0pKS5zb3J0KCkKCgojIEV4dGVuZCBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBpbiBhIHNvdXJjZSBvYmplY3QuCl8uZXh0ZW5kID0gKG9iaikgLT4KICBmb3Igc291cmNlIGluIF8ucmVzdChhcmd1bWVudHMpCiAgICBvYmpba2V5XSA9IHZhbCBmb3Iga2V5LCB2YWwgb2Ygc291cmNlCiAgb2JqCgoKIyBDcmVhdGUgYSAoc2hhbGxvdy1jbG9uZWQpIGR1cGxpY2F0ZSBvZiBhbiBvYmplY3QuCl8uY2xvbmUgPSAob2JqKSAtPgogIHJldHVybiBvYmouc2xpY2UgMCBpZiBfLmlzQXJyYXkgb2JqCiAgXy5leHRlbmQge30sIG9iagoKCiMgSW52b2tlcyBpbnRlcmNlcHRvciB3aXRoIHRoZSBvYmosIGFuZCB0aGVuIHJldHVybnMgb2JqLgojIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gInRhcCBpbnRvIiBhIG1ldGhvZCBjaGFpbiwKIyBpbiBvcmRlciB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gaW50ZXJtZWRpYXRlIHJlc3VsdHMgd2l0aGluCiB0aGUgY2hhaW4uCl8udGFwID0gKG9iaiwgaW50ZXJjZXB0b3IpIC0+CiAgaW50ZXJjZXB0b3Igb2JqCiAgb2JqCgoKIyBQZXJmb3JtIGEgZGVlcCBjb21wYXJpc29uIHRvIGNoZWNrIGlmIHR3byBvYmplY3RzIGFyZSBlcXVhbC4KXy5pc0VxdWFsID0gKGEsIGIpIC0+CiAgIyBDaGVjayBvYmplY3QgaWRlbnRpdHkuCiAgcmV0dXJuIHRydWUgaWYgYSBpcyBiCiAgIyBEaWZmZXJlbnQgdHlwZXM/CiAgYXR5cGUgPSB0eXBlb2YoYSk7IGJ0eXBlID0gdHlwZW9mKGIpCiAgcmV0dXJuIGZhbHNlIGlmIGF0eXBlIGlzbnQgYnR5cGUKICAjIEJhc2ljIGVxdWFsaXR5IHRlc3QgKHdhdGNoIG91dCBmb3IgY29lcmNpb25zKS4KICByZXR1cm4gdHJ1ZSBpZiBgYSA9PSBiYAogICMgT25lIGlzIGZhbHN5IGFuZCB0aGUgb3RoZXIgdHJ1dGh5LgogIHJldHVybiBmYWxzZSBpZiAoIWEgYW5kIGIpIG9yIChhIGFuZCAhYikKICAjIE9uZSBvZiB0aGVtIGltcGxlbWVudHMgYW4gYGlzRXF1YWwoKWA/CiAgcmV0dXJuIGEuaXNFcXVhbChiKSBpZiBhLmlzRXF1YWwKICAjIENoZWNrIGRhdGVzJyBpbnRlZ2VyIHZhbHVlcy4KICByZXR1cm4gYS5nZXRUaW1lKCkgaXMgYi5nZXRUaW1lKCkgaWYgXy5pc0RhdGUoYSkgYW5kIF8uaXNEYXRlKGIpCiAgIyBCb3RoIGFyZSBOYU4/CiAgcmV0dXJuIGZhbHNlIGlmIF8uaXNOYU4oYSkgYW5kIF8uaXNOYU4oYikKICAjIENvbXBhcmUgcmVndWxhciBleHByZXNzaW9ucy4KICBpZiBfLmlzUmVnRXhwKGEpIGFuZCBfLmlzUmVnRXhwKGIpCiAgICByZXR1cm4gYS5zb3VyY2UgaXMgYi5zb3VyY2UgYW5kCiAgICAgICAgICAgYS5nbG9iYWwgaXMgYi5nbG9iYWwgYW5kCiAgICAgICAgICAgYS5pZ25vcmVDYXNlIGlzIGIuaWdub3JlQ2FzZSBhbmQKICAgICAgICAgICBhLm11bHRpbGluZSBpcyBiLm11bHRpbGluZQogICMgSWYgYSBpcyBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGNhbid0IGhhbmRsZSBpdC4KICByZXR1cm4gZmFsc2UgaWYgYXR5cGUgaXNudCAnb2JqZWN0JwogICMgQ2hlY2sgZm9yIGRpZmZlcmVudCBhcnJheSBsZW5ndGhzIGJlZm9yZSBjb21wYXJpbmcgY29udGVudHMuCiAgcmV0dXJuIGZhbHNlIGlmIGEubGVuZ3RoIGFuZCAoYS5sZW5ndGggaXNudCBiLmxlbmd0aCkKICAjIE5vdGhpbmcgZWxzZSB3b3JrZWQsIGRlZXAgY29tcGFyZSB0aGUgY29udGVudHMuCiAgYUtleXMgPSBfLmtleXMoYSk7IGJLZXlzID0gXy5rZXlzKGIpCiAgIyBEaWZmZXJlbnQgb2JqZWN0IHNpemVzPwogIHJldHVybiBmYWxzZSBpZiBhS2V5cy5sZW5ndGggaXNudCBiS2V5cy5sZW5ndGgKICAjIFJlY3Vyc2l2ZSBjb21wYXJpc29uIG9mIGNvbnRlbnRzLgogIHJldHVybiBmYWxzZSBmb3Iga2V5LCB2YWwgb2YgYSB3aGVuICEoa2V5IG9mIGIpIG9yICFfLmlzRXF1YWwodmFsLCBiW2tleV0pCiAgdHJ1ZQoKCiMgSXMgYSBnaXZlbiBhcnJheSBvciBvYmplY3QgZW1wdHk/Cl8uaXNFbXB0eSA9IChvYmopIC0+CiAgcmV0dXJuIG9iai5sZW5ndGggaXMgMCBpZiBfLmlzQXJyYXkob2JqKSBvciBfLmlzU3RyaW5nKG9iaikKICByZXR1cm4gZmFsc2UgZm9yIG93biBrZXkgb2Ygb2JqCiAgdHJ1ZQoKCiMgSXMgYSBnaXZlbiB2YWx1ZSBhIERPTSBlbGVtZW50PwpfLmlzRWxlbWVudCA9IChvYmopIC0+IG9iaiBhbmQgb2JqLm5vZGVUeXBlIGlzIDEKCgojIElzIGEgZ2l2ZW4gdmFsdWUgYW4gYXJyYXk/Cl8uaXNBcnJheSA9IG5hdGl2ZUlzQXJyYXkgb3IgKG9iaikgLT4gISEob2JqIGFuZCBvYmouY29uY2F0IGFuZCBvYmoudW5zaGlmdCBhbmQgbm90IG9iai5jYWxsZWUpCgoKIyBJcyBhIGdpdmVuIHZhcmlhYmxlIGFuIGFyZ3VtZW50cyBvYmplY3Q/Cl8uaXNBcmd1bWVudHMgPSAob2JqKSAtPiBvYmogYW5kIG9iai5jYWxsZWUKCgojIElzIHRoZSBnaXZlbiB2YWx1ZSBhIGZ1bmN0aW9uPwpfLmlzRnVuY3Rpb24gPSAob2JqKSAtPiAhIShvYmogYW5kIG9iai5jb25zdHJ1Y3RvciBhbmQgb2JqLmNhbGwgYW5kIG9iai5hcHBseSkKCgojIElzIHRoZSBnaXZlbiB2YWx1ZSBhIHN0cmluZz8KXy5pc1N0cmluZyA9IChvYmopIC0+ICEhKG9iaiBpcyAnJyBvciAob2JqIGFuZCBvYmouY2hhckNvZGVBdCBhbmQgb2JqLnN1YnN0cikpCgoKIyBJcyBhIGdpdmVuIHZhbHVlIGEgbnVtYmVyPwpfLmlzTnVtYmVyID0gKG9iaikgLT4gKG9iaiBpcyArb2JqKSBvciB0b1N0cmluZy5jYWxsKG9iaikgaXMgJ1tvYmplY3QgTnVtYmVyXScKCgojIElzIGEgZ2l2ZW4gdmFsdWUgYSBib29sZWFuPwpfLmlzQm9vbGVhbiA9IChvYmopIC0+IG9iaiBpcyB0cnVlIG9yIG9iaiBpcyBmYWxzZQoKCiMgSXMgYSBnaXZlbiB2YWx1ZSBhIERhdGU/Cl8uaXNEYXRlID0gKG9iaikgLT4gISEob2JqIGFuZCBvYmouZ2V0VGltZXpvbmVPZmZzZXQgYW5kIG9iai5zZXRVVENGdWxsWWVhcikKCgojIElzIHRoZSBnaXZlbiB2YWx1ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbj8KXy5pc1JlZ0V4cCA9IChvYmopIC0+ICEhKG9iaiBhbmQgb2JqLmV4ZWMgYW5kIChvYmouaWdub3JlQ2FzZSBvciBvYmouaWdub3JlQ2FzZSBpcyBmYWxzZSkpCgoKIyBJcyB0aGUgZ2l2ZW4gdmFsdWUgTmFOIC0tIHRoaXMgb25lIGlzIGludGVyZXN0aW5nLiBgTmFOICE9IE5hTmAsIGFuZAojIGBpc05hTih1bmRlZmluZWQpID09IHRydWVgLCBzbyB3ZSBtYWtlIHN1cmUgaXQncyBhIG51bWJlciBmaXJzdC4KXy5pc05hTiA9IChvYmopIC0+IF8uaXNOdW1iZXIob2JqKSBhbmQgd2luZG93LmlzTmFOKG9iaikKCgojIElzIGEgZ2l2ZW4gdmFsdWUgZXF1YWwgdG8gbnVsbD8KXy5pc051bGwgPSAob2JqKSAtPiBvYmogaXMgbnVsbAoKCiMgSXMgYSBnaXZlbiB2YXJpYWJsZSB1bmRlZmluZWQ/Cl8uaXNVbmRlZmluZWQgPSAob2JqKSAtPiB0eXBlb2Ygb2JqIGlzICd1bmRlZmluZWQnCgoKIyBVdGlsaXR5IEZ1bmN0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tCgojIFJ1biBVbmRlcnNjb3JlLmpzIGluIG5vQ29uZmxpY3QgbW9kZSwgcmV0dXJuaW5nIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzCiMgcHJldmlvdXMgb3duZXIuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0LgpfLm5vQ29uZmxpY3QgPSAtPgogIHJvb3QuXyA9IHByZXZpb3VzVW5kZXJzY29yZQogIHRoaXMKCgojIEtlZXAgdGhlIGlkZW50aXR5IGZ1bmN0aW9uIGFyb3VuZCBmb3IgZGVmYXVsdCBpdGVyYXRvcnMuCl8uaWRlbnRpdHkgPSAodmFsdWUpIC0+IHZhbHVlCgoKIyBSdW4gYSBmdW5jdGlvbiBgbmAgdGltZXMuCl8udGltZXMgPSAobiwgaXRlcmF0b3IsIGNvbnRleHQpIC0+CiAgaXRlcmF0b3IuY2FsbCBjb250ZXh0LCBpIGZvciBpIGluIFswLi4ubl0KCgojIEJyZWFrIG91dCBvZiB0aGUgbWlkZGxlIG9mIGFuIGl0ZXJhdGlvbi4KXy5icmVha0xvb3AgPSAtPiB0aHJvdyBicmVha2VyCgoKIyBBZGQgeW91ciBvd24gY3VzdG9tIGZ1bmN0aW9ucyB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QsIGVuc3VyaW5nIHRoYXQKIyB0aGV5J3JlIGNvcnJlY3RseSBhZGRlZCB0byB0aGUgT09QIHdyYXBwZXIgYXMgd2VsbC4KXy5taXhpbiA9IChvYmopIC0+CiAgZm9yIG5hbWUgaW4gXy5mdW5jdGlvbnMob2JqKQogICAgYWRkVG9XcmFwcGVyIG5hbWUsIF9bbmFtZV0gPSBvYmpbbmFtZV0KCgojIEdlbmVyYXRlIGEgdW5pcXVlIGludGVnZXIgaWQgKHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSBjbGllbnQgc2Vzc2lvbikuCiMgVXNlZnVsIGZvciB0ZW1wb3JhcnkgRE9NIGlkcy4KaWRDb3VudGVyID0gMApfLnVuaXF1ZUlkID0gKHByZWZpeCkgLT4KICAocHJlZml4IG9yICcnKSArIGlkQ291bnRlcisrCgoKIyBCeSBkZWZhdWx0LCBVbmRlcnNjb3JlIHVzZXMgKipFUkIqKi1zdHlsZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLCBjaGFuZ2UgdGhlCiMgZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLgpfLnRlbXBsYXRlU2V0dGluZ3MgPSB7CiAgc3RhcnQ6ICc8JScKICBlbmQ6ICclPicKICBpbnRlcnBvbGF0ZTogLzwlPSguKz8pJT4vZwp9CgoKIyBKYXZhU2NyaXB0IHRlbXBsYXRpbmcgYS1sYSAqKkVSQioqLCBwaWxmZXJlZCBmcm9tIEpvaG4gUmVzaWcncwojICpTZWNyZXRzIG9mIHRoZSBKYXZhU2NyaXB0IE5pbmphKiwgcGFnZSA4My4KIyBTaW5nbGUtcXVvdGUgZml4IGZyb20gUmljayBTdHJhaGwuCiMgV2l0aCBhbHRlcmF0aW9ucyBmb3IgYXJiaXRyYXJ5IGRlbGltaXRlcnMsIGFuZCB0byBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLgpfLnRlbXBsYXRlID0gKHN0ciwgZGF0YSkgLT4KICBjID0gXy50ZW1wbGF0ZVNldHRpbmdzCiAgZW5kTWF0Y2ggPSBuZXcgUmVnRXhwKCInKD89W14iK2MuZW5kLnN1YnN0cigwLCAxKSsiXSoiK2VzY2FwZVJlZ0V4cChjLmVuZCkrIikiLCJnIikKICBmbiA9IG5ldyBGdW5jdGlvbiAnb2JqJywKICAgICd2YXIgcD1bXSxwcmludD1mdW5jdGlvbigpe3AucHVzaC5hcHBseShwLGFyZ3VtZW50cyk7fTsnICsKICAgICd3aXRoKG9ianx8e30pe3AucHVzaChcJycgKwogICAgc3RyLnJlcGxhY2UoL1xyL2csICdcXHInKQogICAgICAgLnJlcGxhY2UoL1xuL2csICdcXG4nKQogICAgICAgLnJlcGxhY2UoL1x0L2csICdcXHQnKQogICAgICAgLnJlcGxhY2UoZW5kTWF0Y2gsIu+/ve+/ve+/vSIpCiAgICAgICAuc3BsaXQoIiciKS5qb2luKCJcXCciKQogICAgICAgLnNwbGl0KCLvv73vv73vv70iKS5qb2luKCInIikKICAgICAgIC5yZXBsYWNlKGMuaW50ZXJwb2xhdGUsICInLCQxLCciKQogICAgICAgLnNwbGl0KGMuc3RhcnQpLmpvaW4oIicpOyIpCiAgICAgICAuc3BsaXQoYy5lbmQpLmpvaW4oInAucHVzaCgnIikgKwogICAgICAgIicpO31yZXR1cm4gcC5qb2luKCcnKTsiCiAgaWYgZGF0YSB0aGVuIGZuKGRhdGEpIGVsc2UgZm4KCgojIEFsaWFzZXMKIyAtLS0tLS0tCgpfLmZvckVhY2ggPSBfLmVhY2gKXy5mb2xkbCA9IF8uaW5qZWN0ID0gXy5yZWR1Y2UKXy5mb2xkciA9IF8ucmVkdWNlUmlnaHQKXy5zZWxlY3QgPSBfLmZpbHRlcgpfLmFsbCA9IF8uZXZlcnkKXy5hbnkgPSBfLnNvbWUKXy5jb250YWlucyA9IF8uaW5jbHVkZQpfLmhlYWQgPSBfLmZpcnN0Cl8udGFpbCA9IF8ucmVzdApfLm1ldGhvZHMgPSBfLmZ1bmN0aW9ucwoKCiMgU2V0dXAgdGhlIE9PUCBXcmFwcGVyCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIElmIFVuZGVyc2NvcmUgaXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24sIGl0IHJldHVybnMgYSB3cmFwcGVkIG9iamVjdCB0aGF0CiMgY2FuIGJlIHVzZWQgT08tc3R5bGUuIFRoaXMgd3JhcHBlciBob2xkcyBhbHRlcmVkIHZlcnNpb25zIG9mIGFsbCB0aGUKIyB1bmRlcnNjb3JlIGZ1bmN0aW9ucy4gV3JhcHBlZCBvYmplY3RzIG1heSBiZSBjaGFpbmVkLgp3cmFwcGVyID0gKG9iaikgLT4KICB0aGlzLl93cmFwcGVkID0gb2JqCiAgdGhpcwoKCiMgSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnRpbnVlIGNoYWluaW5nIGludGVybWVkaWF0ZSByZXN1bHRzLgpyZXN1bHQgPSAob2JqLCBjaGFpbikgLT4KICBpZiBjaGFpbiB0aGVuIF8ob2JqKS5jaGFpbigpIGVsc2Ugb2JqCgoKIyBBIG1ldGhvZCB0byBlYXNpbHkgYWRkIGZ1bmN0aW9ucyB0byB0aGUgT09QIHdyYXBwZXIuCmFkZFRvV3JhcHBlciA9IChuYW1lLCBmdW5jKSAtPgogIHdyYXBwZXIucHJvdG90eXBlW25hbWVdID0gLT4KICAgIGFyZ3MgPSBfLnRvQXJyYXkgYXJndW1lbnRzCiAgICB1bnNoaWZ0LmNhbGwgYXJncywgdGhpcy5fd3JhcHBlZAogICAgcmVzdWx0IGZ1bmMuYXBwbHkoXywgYXJncyksIHRoaXMuX2NoYWluCgoKIyBBZGQgYWxsIG9mdGhlIFVuZGVyc2NvcmUgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyIG9iamVjdC4KXy5taXhpbiBfCgoKIyBBZGQgYWxsIG11dGF0b3IgQXJyYXkgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyLgpfLmVhY2ggWydwb3AnLCAncHVzaCcsICdyZXZlcnNlJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgKG5hbWUpIC0+CiAgbWV0aG9kID0gQXJyYXkucHJvdG90eXBlW25hbWVdCiAgd3JhcHBlci5wcm90b3R5cGVbbmFtZV0gPSAtPgogICAgbWV0aG9kLmFwcGx5KHRoaXMuX3dyYXBwZWQsIGFyZ3VtZW50cykKICAgIHJlc3VsdCh0aGlzLl93cmFwcGVkLCB0aGlzLl9jaGFpbikKCgojIEFkZCBhbGwgYWNjZXNzb3IgQXJyYXkgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyLgpfLmVhY2ggWydjb25jYXQnLCAnam9pbicsICdzbGljZSddLCAobmFtZSkgLT4KICBtZXRob2QgPSBBcnJheS5wcm90b3R5cGVbbmFtZV0KICB3cmFwcGVyLnByb3RvdHlwZVtuYW1lXSA9IC0+CiAgICByZXN1bHQobWV0aG9kLmFwcGx5KHRoaXMuX3dyYXBwZWQsIGFyZ3VtZW50cyksIHRoaXMuX2NoYWluKQoKCiMgU3RhcnQgY2hhaW5pbmcgYSB3cmFwcGVkIFVuZGVyc2NvcmUgb2JqZWN0Lgp3cmFwcGVyOjpjaGFpbiA9IC0+CiAgdGhpcy5fY2hhaW4gPSB0cnVlCiAgdGhpcwoKCiMgRXh0cmFjdHMgdGhlIHJlc3VsdCBmcm9tIGEgd3JhcHBlZCBhbmQgY2hhaW5lZCBvYmplY3QuCndyYXBwZXI6OnZhbHVlID0gLT4gdGhpcy5fd3JhcHBlZAo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWNvZmZlZXNjcmlwdDwvY29kZT4uPC9wPgoKICAgIDxwPlRoZSBDb2ZmZWVTY3JpcHQgbW9kZSB3YXMgd3JpdHRlbiBieSBKZWZmIFBpY2toYXJkdCAoPGEgaHJlZj0iTElDRU5TRSI+bGljZW5zZTwvYT4pLjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/coffeescript/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[VGhlIE1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTEgSmVmZiBQaWNraGFyZHQKTW9kaWZpZWQgZnJvbSB0aGUgUHl0aG9uIENvZGVNaXJyb3IgbW9kZSwgQ29weXJpZ2h0IChjKSAyMDEwIFRpbW90aHkgRmFycmVsbAoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/commonlisp/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/commonlisp/commonlisp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJjb21tb25saXNwIiwgZnVuY3Rpb24gKGNvbmZpZykgewogIHZhciBhc3N1bWVCb2R5ID0gL153aXRofF5kZWZ8XmRvfF5wcm9nfGNhc2UkfF5jb25kJHxiaW5kJHx3aGVuJHx1bmxlc3MkLzsKICB2YXIgbnVtTGl0ZXJhbCA9IC9eKD86WytcLV0/KD86XGQrfFxkKlwuXGQrKSg/OltlZmRdWytcLV0/XGQrKT98WytcLV0/XGQrKD86XC9bK1wtXT9cZCspP3wjYlsrXC1dP1swMV0rfCNvWytcLV0/WzAtN10rfCN4WytcLV0/W1xkYS1mXSspLzsKICB2YXIgc3ltYm9sID0gL1teXHMnYCxAKClcW1xdIjtdLzsKICB2YXIgdHlwZTsKCiAgZnVuY3Rpb24gcmVhZFN5bShzdHJlYW0pIHsKICAgIHZhciBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICJcXCIpIHN0cmVhbS5uZXh0KCk7CiAgICAgIGVsc2UgaWYgKCFzeW1ib2wudGVzdChjaCkpIHsgc3RyZWFtLmJhY2tVcCgxKTsgYnJlYWs7IH0KICAgIH0KICAgIHJldHVybiBzdHJlYW0uY3VycmVudCgpOwogIH0KCiAgZnVuY3Rpb24gYmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHt0eXBlID0gIndzIjsgcmV0dXJuIG51bGw7fQogICAgaWYgKHN0cmVhbS5tYXRjaChudW1MaXRlcmFsKSkgcmV0dXJuICJudW1iZXIiOwogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiXFwiKSBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgaWYgKGNoID09ICciJykgcmV0dXJuIChzdGF0ZS50b2tlbml6ZSA9IGluU3RyaW5nKShzdHJlYW0sIHN0YXRlKTsKICAgIGVsc2UgaWYgKGNoID09ICIoIikgeyB0eXBlID0gIm9wZW4iOyByZXR1cm4gImJyYWNrZXQiOyB9CiAgICBlbHNlIGlmIChjaCA9PSAiKSIgfHwgY2ggPT0gIl0iKSB7IHR5cGUgPSAiY2xvc2UiOyByZXR1cm4gImJyYWNrZXQiOyB9CiAgICBlbHNlIGlmIChjaCA9PSAiOyIpIHsgc3RyZWFtLnNraXBUb0VuZCgpOyB0eXBlID0gIndzIjsgcmV0dXJuICJjb21tZW50IjsgfQogICAgZWxzZSBpZiAoL1snYCxAXS8udGVzdChjaCkpIHJldHVybiBudWxsOwogICAgZWxzZSBpZiAoY2ggPT0gInwiKSB7CiAgICAgIGlmIChzdHJlYW0uc2tpcFRvKCJ8IikpIHsgc3RyZWFtLm5leHQoKTsgcmV0dXJuICJzeW1ib2wiOyB9CiAgICAgIGVsc2UgeyBzdHJlYW0uc2tpcFRvRW5kKCk7IHJldHVybiAiZXJyb3IiOyB9CiAgICB9IGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIlsiKSB7IHR5cGUgPSAib3BlbiI7IHJldHVybiAiYnJhY2tldCI7IH0KICAgICAgZWxzZSBpZiAoL1srXC09XC4nXS8udGVzdChjaCkpIHJldHVybiBudWxsOwogICAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpICYmIHN0cmVhbS5tYXRjaCgvXlxkKiMvKSkgcmV0dXJuIG51bGw7CiAgICAgIGVsc2UgaWYgKGNoID09ICJ8IikgcmV0dXJuIChzdGF0ZS50b2tlbml6ZSA9IGluQ29tbWVudCkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGNoID09ICI6IikgeyByZWFkU3ltKHN0cmVhbSk7IHJldHVybiAibWV0YSI7IH0KICAgICAgZWxzZSByZXR1cm4gImVycm9yIjsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBuYW1lID0gcmVhZFN5bShzdHJlYW0pOwogICAgICBpZiAobmFtZSA9PSAiLiIpIHJldHVybiBudWxsOwogICAgICB0eXBlID0gInN5bWJvbCI7CiAgICAgIGlmIChuYW1lID09ICJuaWwiIHx8IG5hbWUgPT0gInQiKSByZXR1cm4gImF0b20iOwogICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT0gIjoiKSByZXR1cm4gImtleXdvcmQiOwogICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT0gIiYiKSByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7CiAgICB3aGlsZSAobmV4dCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKG5leHQgPT0gJyInICYmICFlc2NhcGVkKSB7IHN0YXRlLnRva2VuaXplID0gYmFzZTsgYnJlYWs7IH0KICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIGZ1bmN0aW9uIGluQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbmV4dCwgbGFzdDsKICAgIHdoaWxlIChuZXh0ID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAobmV4dCA9PSAiIyIgJiYgbGFzdCA9PSAifCIpIHsgc3RhdGUudG9rZW5pemUgPSBiYXNlOyBicmVhazsgfQogICAgICBsYXN0ID0gbmV4dDsKICAgIH0KICAgIHR5cGUgPSAid3MiOwogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7Y3R4OiB7cHJldjogbnVsbCwgc3RhcnQ6IDAsIGluZGVudFRvOiAwfSwgdG9rZW5pemU6IGJhc2V9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiB0eXBlb2Ygc3RhdGUuY3R4LmluZGVudFRvICE9ICJudW1iZXIiKQogICAgICAgIHN0YXRlLmN0eC5pbmRlbnRUbyA9IHN0YXRlLmN0eC5zdGFydCArIDE7CgogICAgICB0eXBlID0gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmICh0eXBlICE9ICJ3cyIpIHsKICAgICAgICBpZiAoc3RhdGUuY3R4LmluZGVudFRvID09IG51bGwpIHsKICAgICAgICAgIGlmICh0eXBlID09ICJzeW1ib2wiICYmIGFzc3VtZUJvZHkudGVzdChzdHJlYW0uY3VycmVudCgpKSkKICAgICAgICAgICAgc3RhdGUuY3R4LmluZGVudFRvID0gc3RhdGUuY3R4LnN0YXJ0ICsgY29uZmlnLmluZGVudFVuaXQ7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHN0YXRlLmN0eC5pbmRlbnRUbyA9ICJuZXh0IjsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmN0eC5pbmRlbnRUbyA9PSAibmV4dCIpIHsKICAgICAgICAgIHN0YXRlLmN0eC5pbmRlbnRUbyA9IHN0cmVhbS5jb2x1bW4oKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT0gIm9wZW4iKSBzdGF0ZS5jdHggPSB7cHJldjogc3RhdGUuY3R4LCBzdGFydDogc3RyZWFtLmNvbHVtbigpLCBpbmRlbnRUbzogbnVsbH07CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNsb3NlIikgc3RhdGUuY3R4ID0gc3RhdGUuY3R4LnByZXYgfHwgc3RhdGUuY3R4OwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24gKHN0YXRlLCBfdGV4dEFmdGVyKSB7CiAgICAgIHZhciBpID0gc3RhdGUuY3R4LmluZGVudFRvOwogICAgICByZXR1cm4gdHlwZW9mIGkgPT0gIm51bWJlciIgPyBpIDogc3RhdGUuY3R4LnN0YXJ0ICsgMTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWNvbW1vbi1saXNwIiwgImNvbW1vbmxpc3AiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/commonlisp/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IENvbW1vbiBMaXNwIG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJjb21tb25saXNwLmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7YmFja2dyb3VuZDogI2Y4ZjhmODt9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogQ29tbW9uIExpc3AgbW9kZTwvaDE+CiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPihpbi1wYWNrYWdlIDpjbC1wb3N0Z3JlcykKCjs7IFRoZXNlIGFyZSB1c2VkIHRvIHN5bnRoZXNpemUgcmVhZGVyIGFuZCB3cml0ZXIgbmFtZXMgZm9yIGludGVnZXIKOzsgcmVhZGluZy93cml0aW5nIGZ1bmN0aW9ucyB3aGVuIHRoZSBhbW91bnQgb2YgYnl0ZXMgYW5kIHRoZQo7OyBzaWduZWRuZXNzIGlzIGtub3duLiBCb3RoIHRoZSBtYWNybyB0aGF0IGNyZWF0ZXMgdGhlIGZ1bmN0aW9ucyBhbmQKOzsgc29tZSBtYWNyb3MgdGhhdCB1c2UgdGhlbSBjcmVhdGUgbmFtZXMgdGhpcyB3YXkuCihldmFsLXdoZW4gKDpjb21waWxlLXRvcGxldmVsIDpsb2FkLXRvcGxldmVsIDpleGVjdXRlKQogIChkZWZ1biBpbnRlZ2VyLXJlYWRlci1uYW1lIChieXRlcyBzaWduZWQpCiAgICAoaW50ZXJuICh3aXRoLXN0YW5kYXJkLWlvLXN5bnRheAogICAgICAgICAgICAgIChmb3JtYXQgbmlsICJ+YX5hfmF+YSIgJyM6cmVhZC0gKGlmIHNpZ25lZCAiIiAnIzp1KSAnIzppbnQgYnl0ZXMpKSkpCiAgKGRlZnVuIGludGVnZXItd3JpdGVyLW5hbWUgKGJ5dGVzIHNpZ25lZCkKICAgIChpbnRlcm4gKHdpdGgtc3RhbmRhcmQtaW8tc3ludGF4CiAgICAgICAgICAgICAgKGZvcm1hdCBuaWwgIn5hfmF+YX5hIiAnIzp3cml0ZS0gKGlmIHNpZ25lZCAiIiAnIzp1KSAnIzppbnQgYnl0ZXMpKSkpKQoKKGRlZm1hY3JvIGludGVnZXItcmVhZGVyIChieXRlcykKICAiQ3JlYXRlIGEgZnVuY3Rpb24gdG8gcmVhZCBpbnRlZ2VycyBmcm9tIGEgYmluYXJ5IHN0cmVhbS4iCiAgKGxldCAoKGJpdHMgKCogYnl0ZXMgOCkpKQogICAgKGxhYmVscyAoKHJldHVybi1mb3JtIChzaWduZWQpCiAgICAgICAgICAgICAgIChpZiBzaWduZWQKICAgICAgICAgICAgICAgICAgIGAoaWYgKGxvZ2JpdHAgLCgxLSBiaXRzKSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgIChkcGIgcmVzdWx0IChieXRlICwoMS0gYml0cykgMCkgLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkKICAgICAgICAgICAgICAgICAgIGByZXN1bHQpKQogICAgICAgICAgICAgKGdlbmVyYXRlLXJlYWRlciAoc2lnbmVkKQogICAgICAgICAgICAgICBgKGRlZnVuICwoaW50ZWdlci1yZWFkZXItbmFtZSBieXRlcyBzaWduZWQpIChzb2NrZXQpCiAgICAgICAgICAgICAgICAgIChkZWNsYXJlICh0eXBlIHN0cmVhbSBzb2NrZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMuKm9wdGltaXplKikKICAgICAgICAgICAgICAgICAgLChpZiAoPSBieXRlcyAxKQogICAgICAgICAgICAgICAgICAgICAgIGAobGV0ICgocmVzdWx0ICh0aGUgKHVuc2lnbmVkLWJ5dGUgOCkgKHJlYWQtYnl0ZSBzb2NrZXQpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2xhcmUgKHR5cGUgKHVuc2lnbmVkLWJ5dGUgOCkgcmVzdWx0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAsKHJldHVybi1mb3JtIHNpZ25lZCkpCiAgICAgICAgICAgICAgICAgICAgICAgYChsZXQgKChyZXN1bHQgMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2xhcmUgKHR5cGUgKHVuc2lnbmVkLWJ5dGUgLGJpdHMpIHJlc3VsdCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLEAobG9vcCA6Zm9yIGJ5dGUgOmZyb20gKDEtIGJ5dGVzKSA6ZG93bnRvIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y29sbGVjdCBgKHNldGYgKGxkYiAoYnl0ZSA4ICwoKiA4IGJ5dGUpKSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgKHVuc2lnbmVkLWJ5dGUgOCkgKHJlYWQtYnl0ZSBzb2NrZXQpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLChyZXR1cm4tZm9ybSBzaWduZWQpKSkpKSkKICAgICAgYChwcm9nbgo7OyBUaGlzIGNhdXNlcyB3ZWlyZCBlcnJvcnMgb24gU0JDTCBpbiBzb21lIGNpcmN1bXN0YW5jZXMuIERpc2FibGVkIGZvciBub3cuCjs7ICAgICAgICAgKGRlY2xhaW0gKGlubGluZSAsKGludGVnZXItcmVhZGVyLW5hbWUgYnl0ZXMgdCkKOzsgICAgICAgICAgICAgICAgICAgICAgICAgICwoaW50ZWdlci1yZWFkZXItbmFtZSBieXRlcyBuaWwpKSkKICAgICAgICAgKGRlY2xhaW0gKGZ0eXBlIChmdW5jdGlvbiAodCkgKHNpZ25lZC1ieXRlICxiaXRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICwoaW50ZWdlci1yZWFkZXItbmFtZSBieXRlcyB0KSkpCiAgICAgICAgICwoZ2VuZXJhdGUtcmVhZGVyIHQpCiAgICAgICAgIChkZWNsYWltIChmdHlwZSAoZnVuY3Rpb24gKHQpICh1bnNpZ25lZC1ieXRlICxiaXRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICwoaW50ZWdlci1yZWFkZXItbmFtZSBieXRlcyBuaWwpKSkKICAgICAgICAgLChnZW5lcmF0ZS1yZWFkZXIgbmlsKSkpKSkKCihkZWZtYWNybyBpbnRlZ2VyLXdyaXRlciAoYnl0ZXMpCiAgIkNyZWF0ZSBhIGZ1bmN0aW9uIHRvIHdyaXRlIGludGVnZXJzIHRvIGEgYmluYXJ5IHN0cmVhbS4iCiAgKGxldCAoKGJpdHMgKCogOCBieXRlcykpKQogICAgYChwcm9nbgogICAgICAoZGVjbGFpbSAoaW5saW5lICwoaW50ZWdlci13cml0ZXItbmFtZSBieXRlcyB0KQogICAgICAgICAgICAgICAgICAgICAgICwoaW50ZWdlci13cml0ZXItbmFtZSBieXRlcyBuaWwpKSkKICAgICAgKGRlZnVuICwoaW50ZWdlci13cml0ZXItbmFtZSBieXRlcyBuaWwpIChzb2NrZXQgdmFsdWUpCiAgICAgICAgKGRlY2xhcmUgKHR5cGUgc3RyZWFtIHNvY2tldCkKICAgICAgICAgICAgICAgICAodHlwZSAodW5zaWduZWQtYnl0ZSAsYml0cykgdmFsdWUpCiAgICAgICAgICAgICAgICAgIy4qb3B0aW1pemUqKQogICAgICAgICxAKGlmICg9IGJ5dGVzIDEpCiAgICAgICAgICAgICAgYCgod3JpdGUtYnl0ZSB2YWx1ZSBzb2NrZXQpKQogICAgICAgICAgICAgIChsb29wIDpmb3IgYnl0ZSA6ZnJvbSAoMS0gYnl0ZXMpIDpkb3dudG8gMAogICAgICAgICAgICAgICAgICAgIDpjb2xsZWN0IGAod3JpdGUtYnl0ZSAobGRiIChieXRlIDggLCgqIGJ5dGUgOCkpIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0KSkpCiAgICAgICAgKHZhbHVlcykpCiAgICAgIChkZWZ1biAsKGludGVnZXItd3JpdGVyLW5hbWUgYnl0ZXMgdCkgKHNvY2tldCB2YWx1ZSkKICAgICAgICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICAgICAgICh0eXBlIChzaWduZWQtYnl0ZSAsYml0cykgdmFsdWUpCiAgICAgICAgICAgICAgICAgIy4qb3B0aW1pemUqKQogICAgICAgICxAKGlmICg9IGJ5dGVzIDEpCiAgICAgICAgICAgICAgYCgod3JpdGUtYnl0ZSAobGRiIChieXRlIDggMCkgdmFsdWUpIHNvY2tldCkpCiAgICAgICAgICAgICAgKGxvb3AgOmZvciBieXRlIDpmcm9tICgxLSBieXRlcykgOmRvd250byAwCiAgICAgICAgICAgICAgICAgICAgOmNvbGxlY3QgYCh3cml0ZS1ieXRlIChsZGIgKGJ5dGUgOCAsKCogYnl0ZSA4KSkgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQpKSkKICAgICAgICAodmFsdWVzKSkpKSkKCjs7IEFsbCB0aGUgaW5zdGFuY2VzIG9mIHRoZSBhYm92ZSB0aGF0IHdlIG5lZWQuCgooaW50ZWdlci1yZWFkZXIgMSkKKGludGVnZXItcmVhZGVyIDIpCihpbnRlZ2VyLXJlYWRlciA0KQooaW50ZWdlci1yZWFkZXIgOCkKCihpbnRlZ2VyLXdyaXRlciAxKQooaW50ZWdlci13cml0ZXIgMikKKGludGVnZXItd3JpdGVyIDQpCgooZGVmdW4gd3JpdGUtYnl0ZXMgKHNvY2tldCBieXRlcykKICAiV3JpdGUgYSBieXRlLWFycmF5IHRvIGEgc3RyZWFtLiIKICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICh0eXBlIChzaW1wbGUtYXJyYXkgKHVuc2lnbmVkLWJ5dGUgOCkpIGJ5dGVzKQogICAgICAgICAgICMuKm9wdGltaXplKikKICAod3JpdGUtc2VxdWVuY2UgYnl0ZXMgc29ja2V0KSkKCihkZWZ1biB3cml0ZS1zdHIgKHNvY2tldCBzdHJpbmcpCiAgIldyaXRlIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byBhIHN0cmVhbSBcKGVuY29kaW5nIGl0IHdoZW4gVVRGLTgKc3VwcG9ydCBpcyBlbmFibGVkLikuIgogIChkZWNsYXJlICh0eXBlIHN0cmVhbSBzb2NrZXQpCiAgICAgICAgICAgKHR5cGUgc3RyaW5nIHN0cmluZykKICAgICAgICAgICAjLipvcHRpbWl6ZSopCiAgKGVuYy13cml0ZS1zdHJpbmcgc3RyaW5nIHNvY2tldCkKICAod3JpdGUtdWludDEgc29ja2V0IDApKQoKKGRlY2xhaW0gKGZ0eXBlIChmdW5jdGlvbiAodCB1bnNpZ25lZC1ieXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgIChzaW1wbGUtYXJyYXkgKHVuc2lnbmVkLWJ5dGUgOCkgKCopKSkKICAgICAgICAgICAgICAgIHJlYWQtYnl0ZXMpKQooZGVmdW4gcmVhZC1ieXRlcyAoc29ja2V0IGxlbmd0aCkKICAiUmVhZCBhIGJ5dGUgYXJyYXkgb2YgdGhlIGdpdmVuIGxlbmd0aCBmcm9tIGEgc3RyZWFtLiIKICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICh0eXBlIGZpeG51bSBsZW5ndGgpCiAgICAgICAgICAgIy4qb3B0aW1pemUqKQogIChsZXQgKChyZXN1bHQgKG1ha2UtYXJyYXkgbGVuZ3RoIDplbGVtZW50LXR5cGUgJyh1bnNpZ25lZC1ieXRlIDgpKSkpCiAgICAocmVhZC1zZXF1ZW5jZSByZXN1bHQgc29ja2V0KQogICAgcmVzdWx0KSkKCihkZWNsYWltIChmdHlwZSAoZnVuY3Rpb24gKHQpIHN0cmluZykgcmVhZC1zdHIpKQooZGVmdW4gcmVhZC1zdHIgKHNvY2tldCkKICAiUmVhZCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZnJvbSBhIHN0cmVhbS4gVGFrZXMgY2FyZSBvZiBlbmNvZGluZwp3aGVuIFVURi04IHN1cHBvcnQgaXMgZW5hYmxlZC4iCiAgKGRlY2xhcmUgKHR5cGUgc3RyZWFtIHNvY2tldCkKICAgICAgICAgICAjLipvcHRpbWl6ZSopCiAgKGVuYy1yZWFkLXN0cmluZyBzb2NrZXQgOm51bGwtdGVybWluYXRlZCB0KSkKCihkZWZ1biBza2lwLWJ5dGVzIChzb2NrZXQgbGVuZ3RoKQogICJTa2lwIGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIGEgYmluYXJ5IHN0cmVhbS4iCiAgKGRlY2xhcmUgKHR5cGUgc3RyZWFtIHNvY2tldCkKICAgICAgICAgICAodHlwZSAodW5zaWduZWQtYnl0ZSAzMikgbGVuZ3RoKQogICAgICAgICAgICMuKm9wdGltaXplKikKICAoZG90aW1lcyAoaSBsZW5ndGgpCiAgICAocmVhZC1ieXRlIHNvY2tldCkpKQoKKGRlZnVuIHNraXAtc3RyIChzb2NrZXQpCiAgIlNraXAgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiIKICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICMuKm9wdGltaXplKikKICAobG9vcCA6Zm9yIGNoYXIgOm9mLXR5cGUgZml4bnVtID0gKHJlYWQtYnl0ZSBzb2NrZXQpCiAgICAgICAgOnVudGlsICh6ZXJvcCBjaGFyKSkpCgooZGVmdW4gZW5zdXJlLXNvY2tldC1pcy1jbG9zZWQgKHNvY2tldCAmYW1wO2tleSBhYm9ydCkKICAod2hlbiAob3Blbi1zdHJlYW0tcCBzb2NrZXQpCiAgICAoaGFuZGxlci1jYXNlCiAgICAgICAgKGNsb3NlIHNvY2tldCA6YWJvcnQgYWJvcnQpCiAgICAgIChlcnJvciAoZXJyb3IpCiAgICAgICAgKHdhcm4gIklnbm9yaW5nIHRoZSBlcnJvciB3aGljaCBoYXBwZW5lZCB3aGlsZSB0cnlpbmcgdG8gY2xvc2UgUG9zdGdyZVNRTCBzb2NrZXQ6IH5BIiBlcnJvcikpKSkpCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHtsaW5lTnVtYmVyczogdHJ1ZX0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1jb21tb24tbGlzcDwvY29kZT4uPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/css/css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJjc3MiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LCB0eXBlOwogIAogIHZhciBhdE1lZGlhVHlwZXMgPSBrZXlTZXQoWwogICAgImFsbCIsICJhdXJhbCIsICJicmFpbGxlIiwgImhhbmRoZWxkIiwgInByaW50IiwgInByb2plY3Rpb24iLCAic2NyZWVuIiwKICAgICJ0dHkiLCAidHYiLCAiZW1ib3NzZWQiCiAgXSk7CiAgCiAgdmFyIGF0TWVkaWFGZWF0dXJlcyA9IGtleVNldChbCiAgICAid2lkdGgiLCAibWluLXdpZHRoIiwgIm1heC13aWR0aCIsICJoZWlnaHQiLCAibWluLWhlaWdodCIsICJtYXgtaGVpZ2h0IiwKICAgICJkZXZpY2Utd2lkdGgiLCAibWluLWRldmljZS13aWR0aCIsICJtYXgtZGV2aWNlLXdpZHRoIiwgImRldmljZS1oZWlnaHQiLAogICAgIm1pbi1kZXZpY2UtaGVpZ2h0IiwgIm1heC1kZXZpY2UtaGVpZ2h0IiwgImFzcGVjdC1yYXRpbyIsCiAgICAibWluLWFzcGVjdC1yYXRpbyIsICJtYXgtYXNwZWN0LXJhdGlvIiwgImRldmljZS1hc3BlY3QtcmF0aW8iLAogICAgIm1pbi1kZXZpY2UtYXNwZWN0LXJhdGlvIiwgIm1heC1kZXZpY2UtYXNwZWN0LXJhdGlvIiwgImNvbG9yIiwgIm1pbi1jb2xvciIsCiAgICAibWF4LWNvbG9yIiwgImNvbG9yLWluZGV4IiwgIm1pbi1jb2xvci1pbmRleCIsICJtYXgtY29sb3ItaW5kZXgiLAogICAgIm1vbm9jaHJvbWUiLCAibWluLW1vbm9jaHJvbWUiLCAibWF4LW1vbm9jaHJvbWUiLCAicmVzb2x1dGlvbiIsCiAgICAibWluLXJlc29sdXRpb24iLCAibWF4LXJlc29sdXRpb24iLCAic2NhbiIsICJncmlkIgogIF0pOwoKICB2YXIgcHJvcGVydHlLZXl3b3JkcyA9IGtleVNldChbCiAgICAiYWxpZ24tY29udGVudCIsICJhbGlnbi1pdGVtcyIsICJhbGlnbi1zZWxmIiwgImFsaWdubWVudC1hZGp1c3QiLAogICAgImFsaWdubWVudC1iYXNlbGluZSIsICJhbmNob3ItcG9pbnQiLCAiYW5pbWF0aW9uIiwgImFuaW1hdGlvbi1kZWxheSIsCiAgICAiYW5pbWF0aW9uLWRpcmVjdGlvbiIsICJhbmltYXRpb24tZHVyYXRpb24iLCAiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCIsCiAgICAiYW5pbWF0aW9uLW5hbWUiLCAiYW5pbWF0aW9uLXBsYXktc3RhdGUiLCAiYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiIsCiAgICAiYXBwZWFyYW5jZSIsICJhemltdXRoIiwgImJhY2tmYWNlLXZpc2liaWxpdHkiLCAiYmFja2dyb3VuZCIsCiAgICAiYmFja2dyb3VuZC1hdHRhY2htZW50IiwgImJhY2tncm91bmQtY2xpcCIsICJiYWNrZ3JvdW5kLWNvbG9yIiwKICAgICJiYWNrZ3JvdW5kLWltYWdlIiwgImJhY2tncm91bmQtb3JpZ2luIiwgImJhY2tncm91bmQtcG9zaXRpb24iLAogICAgImJhY2tncm91bmQtcmVwZWF0IiwgImJhY2tncm91bmQtc2l6ZSIsICJiYXNlbGluZS1zaGlmdCIsICJiaW5kaW5nIiwKICAgICJibGVlZCIsICJib29rbWFyay1sYWJlbCIsICJib29rbWFyay1sZXZlbCIsICJib29rbWFyay1zdGF0ZSIsCiAgICAiYm9va21hcmstdGFyZ2V0IiwgImJvcmRlciIsICJib3JkZXItYm90dG9tIiwgImJvcmRlci1ib3R0b20tY29sb3IiLAogICAgImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiLCAiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLAogICAgImJvcmRlci1ib3R0b20tc3R5bGUiLCAiYm9yZGVyLWJvdHRvbS13aWR0aCIsICJib3JkZXItY29sbGFwc2UiLAogICAgImJvcmRlci1jb2xvciIsICJib3JkZXItaW1hZ2UiLCAiYm9yZGVyLWltYWdlLW91dHNldCIsCiAgICAiYm9yZGVyLWltYWdlLXJlcGVhdCIsICJib3JkZXItaW1hZ2Utc2xpY2UiLCAiYm9yZGVyLWltYWdlLXNvdXJjZSIsCiAgICAiYm9yZGVyLWltYWdlLXdpZHRoIiwgImJvcmRlci1sZWZ0IiwgImJvcmRlci1sZWZ0LWNvbG9yIiwKICAgICJib3JkZXItbGVmdC1zdHlsZSIsICJib3JkZXItbGVmdC13aWR0aCIsICJib3JkZXItcmFkaXVzIiwgImJvcmRlci1yaWdodCIsCiAgICAiYm9yZGVyLXJpZ2h0LWNvbG9yIiwgImJvcmRlci1yaWdodC1zdHlsZSIsICJib3JkZXItcmlnaHQtd2lkdGgiLAogICAgImJvcmRlci1zcGFjaW5nIiwgImJvcmRlci1zdHlsZSIsICJib3JkZXItdG9wIiwgImJvcmRlci10b3AtY29sb3IiLAogICAgImJvcmRlci10b3AtbGVmdC1yYWRpdXMiLCAiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCAiYm9yZGVyLXRvcC1zdHlsZSIsCiAgICAiYm9yZGVyLXRvcC13aWR0aCIsICJib3JkZXItd2lkdGgiLCAiYm90dG9tIiwgImJveC1kZWNvcmF0aW9uLWJyZWFrIiwKICAgICJib3gtc2hhZG93IiwgImJveC1zaXppbmciLCAiYnJlYWstYWZ0ZXIiLCAiYnJlYWstYmVmb3JlIiwgImJyZWFrLWluc2lkZSIsCiAgICAiY2FwdGlvbi1zaWRlIiwgImNsZWFyIiwgImNsaXAiLCAiY29sb3IiLCAiY29sb3ItcHJvZmlsZSIsICJjb2x1bW4tY291bnQiLAogICAgImNvbHVtbi1maWxsIiwgImNvbHVtbi1nYXAiLCAiY29sdW1uLXJ1bGUiLCAiY29sdW1uLXJ1bGUtY29sb3IiLAogICAgImNvbHVtbi1ydWxlLXN0eWxlIiwgImNvbHVtbi1ydWxlLXdpZHRoIiwgImNvbHVtbi1zcGFuIiwgImNvbHVtbi13aWR0aCIsCiAgICAiY29sdW1ucyIsICJjb250ZW50IiwgImNvdW50ZXItaW5jcmVtZW50IiwgImNvdW50ZXItcmVzZXQiLCAiY3JvcCIsICJjdWUiLAogICAgImN1ZS1hZnRlciIsICJjdWUtYmVmb3JlIiwgImN1cnNvciIsICJkaXJlY3Rpb24iLCAiZGlzcGxheSIsCiAgICAiZG9taW5hbnQtYmFzZWxpbmUiLCAiZHJvcC1pbml0aWFsLWFmdGVyLWFkanVzdCIsCiAgICAiZHJvcC1pbml0aWFsLWFmdGVyLWFsaWduIiwgImRyb3AtaW5pdGlhbC1iZWZvcmUtYWRqdXN0IiwKICAgICJkcm9wLWluaXRpYWwtYmVmb3JlLWFsaWduIiwgImRyb3AtaW5pdGlhbC1zaXplIiwgImRyb3AtaW5pdGlhbC12YWx1ZSIsCiAgICAiZWxldmF0aW9uIiwgImVtcHR5LWNlbGxzIiwgImZpdCIsICJmaXQtcG9zaXRpb24iLCAiZmxleCIsICJmbGV4LWJhc2lzIiwKICAgICJmbGV4LWRpcmVjdGlvbiIsICJmbGV4LWZsb3ciLCAiZmxleC1ncm93IiwgImZsZXgtc2hyaW5rIiwgImZsZXgtd3JhcCIsCiAgICAiZmxvYXQiLCAiZmxvYXQtb2Zmc2V0IiwgImZvbnQiLCAiZm9udC1mZWF0dXJlLXNldHRpbmdzIiwgImZvbnQtZmFtaWx5IiwKICAgICJmb250LWtlcm5pbmciLCAiZm9udC1sYW5ndWFnZS1vdmVycmlkZSIsICJmb250LXNpemUiLCAiZm9udC1zaXplLWFkanVzdCIsCiAgICAiZm9udC1zdHJldGNoIiwgImZvbnQtc3R5bGUiLCAiZm9udC1zeW50aGVzaXMiLCAiZm9udC12YXJpYW50IiwKICAgICJmb250LXZhcmlhbnQtYWx0ZXJuYXRlcyIsICJmb250LXZhcmlhbnQtY2FwcyIsICJmb250LXZhcmlhbnQtZWFzdC1hc2lhbiIsCiAgICAiZm9udC12YXJpYW50LWxpZ2F0dXJlcyIsICJmb250LXZhcmlhbnQtbnVtZXJpYyIsICJmb250LXZhcmlhbnQtcG9zaXRpb24iLAogICAgImZvbnQtd2VpZ2h0IiwgImdyaWQtY2VsbCIsICJncmlkLWNvbHVtbiIsICJncmlkLWNvbHVtbi1hbGlnbiIsCiAgICAiZ3JpZC1jb2x1bW4tc2l6aW5nIiwgImdyaWQtY29sdW1uLXNwYW4iLCAiZ3JpZC1jb2x1bW5zIiwgImdyaWQtZmxvdyIsCiAgICAiZ3JpZC1yb3ciLCAiZ3JpZC1yb3ctYWxpZ24iLCAiZ3JpZC1yb3ctc2l6aW5nIiwgImdyaWQtcm93LXNwYW4iLAogICAgImdyaWQtcm93cyIsICJncmlkLXRlbXBsYXRlIiwgImhhbmdpbmctcHVuY3R1YXRpb24iLCAiaGVpZ2h0IiwgImh5cGhlbnMiLAogICAgImljb24iLCAiaW1hZ2Utb3JpZW50YXRpb24iLCAiaW1hZ2UtcmVuZGVyaW5nIiwgImltYWdlLXJlc29sdXRpb24iLAogICAgImlubGluZS1ib3gtYWxpZ24iLCAianVzdGlmeS1jb250ZW50IiwgImxlZnQiLCAibGV0dGVyLXNwYWNpbmciLAogICAgImxpbmUtYnJlYWsiLCAibGluZS1oZWlnaHQiLCAibGluZS1zdGFja2luZyIsICJsaW5lLXN0YWNraW5nLXJ1YnkiLAogICAgImxpbmUtc3RhY2tpbmctc2hpZnQiLCAibGluZS1zdGFja2luZy1zdHJhdGVneSIsICJsaXN0LXN0eWxlIiwKICAgICJsaXN0LXN0eWxlLWltYWdlIiwgImxpc3Qtc3R5bGUtcG9zaXRpb24iLCAibGlzdC1zdHlsZS10eXBlIiwgIm1hcmdpbiIsCiAgICAibWFyZ2luLWJvdHRvbSIsICJtYXJnaW4tbGVmdCIsICJtYXJnaW4tcmlnaHQiLCAibWFyZ2luLXRvcCIsCiAgICAibWFya2VyLW9mZnNldCIsICJtYXJrcyIsICJtYXJxdWVlLWRpcmVjdGlvbiIsICJtYXJxdWVlLWxvb3AiLAogICAgIm1hcnF1ZWUtcGxheS1jb3VudCIsICJtYXJxdWVlLXNwZWVkIiwgIm1hcnF1ZWUtc3R5bGUiLCAibWF4LWhlaWdodCIsCiAgICAibWF4LXdpZHRoIiwgIm1pbi1oZWlnaHQiLCAibWluLXdpZHRoIiwgIm1vdmUtdG8iLCAibmF2LWRvd24iLCAibmF2LWluZGV4IiwKICAgICJuYXYtbGVmdCIsICJuYXYtcmlnaHQiLCAibmF2LXVwIiwgIm9wYWNpdHkiLCAib3JkZXIiLCAib3JwaGFucyIsICJvdXRsaW5lIiwKICAgICJvdXRsaW5lLWNvbG9yIiwgIm91dGxpbmUtb2Zmc2V0IiwgIm91dGxpbmUtc3R5bGUiLCAib3V0bGluZS13aWR0aCIsCiAgICAib3ZlcmZsb3ciLCAib3ZlcmZsb3ctc3R5bGUiLCAib3ZlcmZsb3ctd3JhcCIsICJvdmVyZmxvdy14IiwgIm92ZXJmbG93LXkiLAogICAgInBhZGRpbmciLCAicGFkZGluZy1ib3R0b20iLCAicGFkZGluZy1sZWZ0IiwgInBhZGRpbmctcmlnaHQiLCAicGFkZGluZy10b3AiLAogICAgInBhZ2UiLCAicGFnZS1icmVhay1hZnRlciIsICJwYWdlLWJyZWFrLWJlZm9yZSIsICJwYWdlLWJyZWFrLWluc2lkZSIsCiAgICAicGFnZS1wb2xpY3kiLCAicGF1c2UiLCAicGF1c2UtYWZ0ZXIiLCAicGF1c2UtYmVmb3JlIiwgInBlcnNwZWN0aXZlIiwKICAgICJwZXJzcGVjdGl2ZS1vcmlnaW4iLCAicGl0Y2giLCAicGl0Y2gtcmFuZ2UiLCAicGxheS1kdXJpbmciLCAicG9zaXRpb24iLAogICAgInByZXNlbnRhdGlvbi1sZXZlbCIsICJwdW5jdHVhdGlvbi10cmltIiwgInF1b3RlcyIsICJyZW5kZXJpbmctaW50ZW50IiwKICAgICJyZXNpemUiLCAicmVzdCIsICJyZXN0LWFmdGVyIiwgInJlc3QtYmVmb3JlIiwgInJpY2huZXNzIiwgInJpZ2h0IiwKICAgICJyb3RhdGlvbiIsICJyb3RhdGlvbi1wb2ludCIsICJydWJ5LWFsaWduIiwgInJ1Ynktb3ZlcmhhbmciLAogICAgInJ1YnktcG9zaXRpb24iLCAicnVieS1zcGFuIiwgInNpemUiLCAic3BlYWsiLCAic3BlYWstYXMiLCAic3BlYWstaGVhZGVyIiwKICAgICJzcGVhay1udW1lcmFsIiwgInNwZWFrLXB1bmN0dWF0aW9uIiwgInNwZWVjaC1yYXRlIiwgInN0cmVzcyIsICJzdHJpbmctc2V0IiwKICAgICJ0YWItc2l6ZSIsICJ0YWJsZS1sYXlvdXQiLCAidGFyZ2V0IiwgInRhcmdldC1uYW1lIiwgInRhcmdldC1uZXciLAogICAgInRhcmdldC1wb3NpdGlvbiIsICJ0ZXh0LWFsaWduIiwgInRleHQtYWxpZ24tbGFzdCIsICJ0ZXh0LWRlY29yYXRpb24iLAogICAgInRleHQtZGVjb3JhdGlvbi1jb2xvciIsICJ0ZXh0LWRlY29yYXRpb24tbGluZSIsICJ0ZXh0LWRlY29yYXRpb24tc2tpcCIsCiAgICAidGV4dC1kZWNvcmF0aW9uLXN0eWxlIiwgInRleHQtZW1waGFzaXMiLCAidGV4dC1lbXBoYXNpcy1jb2xvciIsCiAgICAidGV4dC1lbXBoYXNpcy1wb3NpdGlvbiIsICJ0ZXh0LWVtcGhhc2lzLXN0eWxlIiwgInRleHQtaGVpZ2h0IiwKICAgICJ0ZXh0LWluZGVudCIsICJ0ZXh0LWp1c3RpZnkiLCAidGV4dC1vdXRsaW5lIiwgInRleHQtc2hhZG93IiwKICAgICJ0ZXh0LXNwYWNlLWNvbGxhcHNlIiwgInRleHQtdHJhbnNmb3JtIiwgInRleHQtdW5kZXJsaW5lLXBvc2l0aW9uIiwKICAgICJ0ZXh0LXdyYXAiLCAidG9wIiwgInRyYW5zZm9ybSIsICJ0cmFuc2Zvcm0tb3JpZ2luIiwgInRyYW5zZm9ybS1zdHlsZSIsCiAgICAidHJhbnNpdGlvbiIsICJ0cmFuc2l0aW9uLWRlbGF5IiwgInRyYW5zaXRpb24tZHVyYXRpb24iLAogICAgInRyYW5zaXRpb24tcHJvcGVydHkiLCAidHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24iLCAidW5pY29kZS1iaWRpIiwKICAgICJ2ZXJ0aWNhbC1hbGlnbiIsICJ2aXNpYmlsaXR5IiwgInZvaWNlLWJhbGFuY2UiLCAidm9pY2UtZHVyYXRpb24iLAogICAgInZvaWNlLWZhbWlseSIsICJ2b2ljZS1waXRjaCIsICJ2b2ljZS1yYW5nZSIsICJ2b2ljZS1yYXRlIiwgInZvaWNlLXN0cmVzcyIsCiAgICAidm9pY2Utdm9sdW1lIiwgInZvbHVtZSIsICJ3aGl0ZS1zcGFjZSIsICJ3aWRvd3MiLCAid2lkdGgiLCAid29yZC1icmVhayIsCiAgICAid29yZC1zcGFjaW5nIiwgIndvcmQtd3JhcCIsICJ6LWluZGV4IgogIF0pOwoKICB2YXIgY29sb3JLZXl3b3JkcyA9IGtleVNldChbCiAgICAiYmxhY2siLCAic2lsdmVyIiwgImdyYXkiLCAid2hpdGUiLCAibWFyb29uIiwgInJlZCIsICJwdXJwbGUiLCAiZnVjaHNpYSIsCiAgICAiZ3JlZW4iLCAibGltZSIsICJvbGl2ZSIsICJ5ZWxsb3ciLCAibmF2eSIsICJibHVlIiwgInRlYWwiLCAiYXF1YSIKICBdKTsKICAKICB2YXIgdmFsdWVLZXl3b3JkcyA9IGtleVNldChbCiAgICAiYWJvdmUiLCAiYWJzb2x1dGUiLCAiYWN0aXZlYm9yZGVyIiwgImFjdGl2ZWNhcHRpb24iLCAiYWZhciIsCiAgICAiYWZ0ZXItd2hpdGUtc3BhY2UiLCAiYWhlYWQiLCAiYWxpYXMiLCAiYWxsIiwgImFsbC1zY3JvbGwiLCAiYWx0ZXJuYXRlIiwKICAgICJhbHdheXMiLCAiYW1oYXJpYyIsICJhbWhhcmljLWFiZWdlZGUiLCAiYW50aWFsaWFzZWQiLCAiYXBwd29ya3NwYWNlIiwKICAgICJhcmFiaWMtaW5kaWMiLCAiYXJtZW5pYW4iLCAiYXN0ZXJpc2tzIiwgImF1dG8iLCAiYXZvaWQiLCAiYmFja2dyb3VuZCIsCiAgICAiYmFja3dhcmRzIiwgImJhc2VsaW5lIiwgImJlbG93IiwgImJpZGktb3ZlcnJpZGUiLCAiYmluYXJ5IiwgImJlbmdhbGkiLAogICAgImJsaW5rIiwgImJsb2NrIiwgImJsb2NrLWF4aXMiLCAiYm9sZCIsICJib2xkZXIiLCAiYm9yZGVyIiwgImJvcmRlci1ib3giLAogICAgImJvdGgiLCAiYm90dG9tIiwgImJyZWFrLWFsbCIsICJicmVhay13b3JkIiwgImJ1dHRvbiIsICJidXR0b24tYmV2ZWwiLAogICAgImJ1dHRvbmZhY2UiLCAiYnV0dG9uaGlnaGxpZ2h0IiwgImJ1dHRvbnNoYWRvdyIsICJidXR0b250ZXh0IiwgImNhbWJvZGlhbiIsCiAgICAiY2FwaXRhbGl6ZSIsICJjYXBzLWxvY2staW5kaWNhdG9yIiwgImNhcHRpb24iLCAiY2FwdGlvbnRleHQiLCAiY2FyZXQiLAogICAgImNlbGwiLCAiY2VudGVyIiwgImNoZWNrYm94IiwgImNpcmNsZSIsICJjamstZWFydGhseS1icmFuY2giLAogICAgImNqay1oZWF2ZW5seS1zdGVtIiwgImNqay1pZGVvZ3JhcGhpYyIsICJjbGVhciIsICJjbGlwIiwgImNsb3NlLXF1b3RlIiwKICAgICJjb2wtcmVzaXplIiwgImNvbGxhcHNlIiwgImNvbXBhY3QiLCAiY29uZGVuc2VkIiwgImNvbnRhaW4iLCAiY29udGVudCIsCiAgICAiY29udGVudC1ib3giLCAiY29udGV4dC1tZW51IiwgImNvbnRpbnVvdXMiLCAiY29weSIsICJjb3ZlciIsICJjcm9wIiwKICAgICJjcm9zcyIsICJjcm9zc2hhaXIiLCAiY3VycmVudGNvbG9yIiwgImN1cnNpdmUiLCAiZGFzaGVkIiwgImRlY2ltYWwiLAogICAgImRlY2ltYWwtbGVhZGluZy16ZXJvIiwgImRlZmF1bHQiLCAiZGVmYXVsdC1idXR0b24iLCAiZGVzdGluYXRpb24tYXRvcCIsCiAgICAiZGVzdGluYXRpb24taW4iLCAiZGVzdGluYXRpb24tb3V0IiwgImRlc3RpbmF0aW9uLW92ZXIiLCAiZGV2YW5hZ2FyaSIsCiAgICAiZGlzYyIsICJkaXNjYXJkIiwgImRvY3VtZW50IiwgImRvdC1kYXNoIiwgImRvdC1kb3QtZGFzaCIsICJkb3R0ZWQiLAogICAgImRvdWJsZSIsICJkb3duIiwgImUtcmVzaXplIiwgImVhc2UiLCAiZWFzZS1pbiIsICJlYXNlLWluLW91dCIsICJlYXNlLW91dCIsCiAgICAiZWxlbWVudCIsICJlbGxpcHNpcyIsICJlbWJlZCIsICJlbmQiLCAiZXRoaW9waWMiLCAiZXRoaW9waWMtYWJlZ2VkZSIsCiAgICAiZXRoaW9waWMtYWJlZ2VkZS1hbS1ldCIsICJldGhpb3BpYy1hYmVnZWRlLWdleiIsICJldGhpb3BpYy1hYmVnZWRlLXRpLWVyIiwKICAgICJldGhpb3BpYy1hYmVnZWRlLXRpLWV0IiwgImV0aGlvcGljLWhhbGVoYW1lLWFhLWVyIiwKICAgICJldGhpb3BpYy1oYWxlaGFtZS1hYS1ldCIsICJldGhpb3BpYy1oYWxlaGFtZS1hbS1ldCIsCiAgICAiZXRoaW9waWMtaGFsZWhhbWUtZ2V6IiwgImV0aGlvcGljLWhhbGVoYW1lLW9tLWV0IiwKICAgICJldGhpb3BpYy1oYWxlaGFtZS1zaWQtZXQiLCAiZXRoaW9waWMtaGFsZWhhbWUtc28tZXQiLAogICAgImV0aGlvcGljLWhhbGVoYW1lLXRpLWVyIiwgImV0aGlvcGljLWhhbGVoYW1lLXRpLWV0IiwKICAgICJldGhpb3BpYy1oYWxlaGFtZS10aWciLCAiZXctcmVzaXplIiwgImV4cGFuZGVkIiwgImV4dHJhLWNvbmRlbnNlZCIsCiAgICAiZXh0cmEtZXhwYW5kZWQiLCAiZmFudGFzeSIsICJmYXN0IiwgImZpbGwiLCAiZml4ZWQiLCAiZmxhdCIsICJmb290bm90ZXMiLAogICAgImZvcndhcmRzIiwgImZyb20iLCAiZ2VvbWV0cmljUHJlY2lzaW9uIiwgImdlb3JnaWFuIiwgImdyYXl0ZXh0IiwgImdyb292ZSIsCiAgICAiZ3VqYXJhdGkiLCAiZ3VybXVraGkiLCAiaGFuZCIsICJoYW5ndWwiLCAiaGFuZ3VsLWNvbnNvbmFudCIsICJoZWJyZXciLAogICAgImhlbHAiLCAiaGlkZGVuIiwgImhpZGUiLCAiaGlnaGVyIiwgImhpZ2hsaWdodCIsICJoaWdobGlnaHR0ZXh0IiwKICAgICJoaXJhZ2FuYSIsICJoaXJhZ2FuYS1pcm9oYSIsICJob3Jpem9udGFsIiwgImhzbCIsICJoc2xhIiwgImljb24iLCAiaWdub3JlIiwKICAgICJpbmFjdGl2ZWJvcmRlciIsICJpbmFjdGl2ZWNhcHRpb24iLCAiaW5hY3RpdmVjYXB0aW9udGV4dCIsICJpbmZpbml0ZSIsCiAgICAiaW5mb2JhY2tncm91bmQiLCAiaW5mb3RleHQiLCAiaW5oZXJpdCIsICJpbml0aWFsIiwgImlubGluZSIsICJpbmxpbmUtYXhpcyIsCiAgICAiaW5saW5lLWJsb2NrIiwgImlubGluZS10YWJsZSIsICJpbnNldCIsICJpbnNpZGUiLCAiaW50cmluc2ljIiwgImludmVydCIsCiAgICAiaXRhbGljIiwgImp1c3RpZnkiLCAia2FubmFkYSIsICJrYXRha2FuYSIsICJrYXRha2FuYS1pcm9oYSIsICJraG1lciIsCiAgICAibGFuZHNjYXBlIiwgImxhbyIsICJsYXJnZSIsICJsYXJnZXIiLCAibGVmdCIsICJsZXZlbCIsICJsaWdodGVyIiwKICAgICJsaW5lLXRocm91Z2giLCAibGluZWFyIiwgImxpbmVzIiwgImxpc3QtaXRlbSIsICJsaXN0Ym94IiwgImxpc3RpdGVtIiwKICAgICJsb2NhbCIsICJsb2dpY2FsIiwgImxvdWQiLCAibG93ZXIiLCAibG93ZXItYWxwaGEiLCAibG93ZXItYXJtZW5pYW4iLAogICAgImxvd2VyLWdyZWVrIiwgImxvd2VyLWhleGFkZWNpbWFsIiwgImxvd2VyLWxhdGluIiwgImxvd2VyLW5vcndlZ2lhbiIsCiAgICAibG93ZXItcm9tYW4iLCAibG93ZXJjYXNlIiwgImx0ciIsICJtYWxheWFsYW0iLCAibWF0Y2giLAogICAgIm1lZGlhLWNvbnRyb2xzLWJhY2tncm91bmQiLCAibWVkaWEtY3VycmVudC10aW1lLWRpc3BsYXkiLAogICAgIm1lZGlhLWZ1bGxzY3JlZW4tYnV0dG9uIiwgIm1lZGlhLW11dGUtYnV0dG9uIiwgIm1lZGlhLXBsYXktYnV0dG9uIiwKICAgICJtZWRpYS1yZXR1cm4tdG8tcmVhbHRpbWUtYnV0dG9uIiwgIm1lZGlhLXJld2luZC1idXR0b24iLAogICAgIm1lZGlhLXNlZWstYmFjay1idXR0b24iLCAibWVkaWEtc2Vlay1mb3J3YXJkLWJ1dHRvbiIsICJtZWRpYS1zbGlkZXIiLAogICAgIm1lZGlhLXNsaWRlcnRodW1iIiwgIm1lZGlhLXRpbWUtcmVtYWluaW5nLWRpc3BsYXkiLCAibWVkaWEtdm9sdW1lLXNsaWRlciIsCiAgICAibWVkaWEtdm9sdW1lLXNsaWRlci1jb250YWluZXIiLCAibWVkaWEtdm9sdW1lLXNsaWRlcnRodW1iIiwgIm1lZGl1bSIsCiAgICAibWVudSIsICJtZW51bGlzdCIsICJtZW51bGlzdC1idXR0b24iLCAibWVudWxpc3QtdGV4dCIsCiAgICAibWVudWxpc3QtdGV4dGZpZWxkIiwgIm1lbnV0ZXh0IiwgIm1lc3NhZ2UtYm94IiwgIm1pZGRsZSIsICJtaW4taW50cmluc2ljIiwKICAgICJtaXgiLCAibW9uZ29saWFuIiwgIm1vbm9zcGFjZSIsICJtb3ZlIiwgIm11bHRpcGxlIiwgIm15YW5tYXIiLCAibi1yZXNpemUiLAogICAgIm5hcnJvd2VyIiwgIm5hdnkiLCAibmUtcmVzaXplIiwgIm5lc3ctcmVzaXplIiwgIm5vLWNsb3NlLXF1b3RlIiwgIm5vLWRyb3AiLAogICAgIm5vLW9wZW4tcXVvdGUiLCAibm8tcmVwZWF0IiwgIm5vbmUiLCAibm9ybWFsIiwgIm5vdC1hbGxvd2VkIiwgIm5vd3JhcCIsCiAgICAibnMtcmVzaXplIiwgIm53LXJlc2l6ZSIsICJud3NlLXJlc2l6ZSIsICJvYmxpcXVlIiwgIm9jdGFsIiwgIm9wZW4tcXVvdGUiLAogICAgIm9wdGltaXplTGVnaWJpbGl0eSIsICJvcHRpbWl6ZVNwZWVkIiwgIm9yaXlhIiwgIm9yb21vIiwgIm91dHNldCIsCiAgICAib3V0c2lkZSIsICJvdmVybGF5IiwgIm92ZXJsaW5lIiwgInBhZGRpbmciLCAicGFkZGluZy1ib3giLCAicGFpbnRlZCIsCiAgICAicGF1c2VkIiwgInBlcnNpYW4iLCAicGx1cy1kYXJrZXIiLCAicGx1cy1saWdodGVyIiwgInBvaW50ZXIiLCAicG9ydHJhaXQiLAogICAgInByZSIsICJwcmUtbGluZSIsICJwcmUtd3JhcCIsICJwcmVzZXJ2ZS0zZCIsICJwcm9ncmVzcyIsICJwdXNoLWJ1dHRvbiIsCiAgICAicmFkaW8iLCAicmVhZC1vbmx5IiwgInJlYWQtd3JpdGUiLCAicmVhZC13cml0ZS1wbGFpbnRleHQtb25seSIsICJyZWxhdGl2ZSIsCiAgICAicmVwZWF0IiwgInJlcGVhdC14IiwgInJlcGVhdC15IiwgInJlc2V0IiwgInJldmVyc2UiLCAicmdiIiwgInJnYmEiLAogICAgInJpZGdlIiwgInJpZ2h0IiwgInJvdW5kIiwgInJvdy1yZXNpemUiLCAicnRsIiwgInJ1bi1pbiIsICJydW5uaW5nIiwKICAgICJzLXJlc2l6ZSIsICJzYW5zLXNlcmlmIiwgInNjcm9sbCIsICJzY3JvbGxiYXIiLCAic2UtcmVzaXplIiwgInNlYXJjaGZpZWxkIiwKICAgICJzZWFyY2hmaWVsZC1jYW5jZWwtYnV0dG9uIiwgInNlYXJjaGZpZWxkLWRlY29yYXRpb24iLAogICAgInNlYXJjaGZpZWxkLXJlc3VsdHMtYnV0dG9uIiwgInNlYXJjaGZpZWxkLXJlc3VsdHMtZGVjb3JhdGlvbiIsCiAgICAic2VtaS1jb25kZW5zZWQiLCAic2VtaS1leHBhbmRlZCIsICJzZXBhcmF0ZSIsICJzZXJpZiIsICJzaG93IiwgInNpZGFtYSIsCiAgICAic2luZ2xlIiwgInNraXAtd2hpdGUtc3BhY2UiLCAic2xpZGUiLCAic2xpZGVyLWhvcml6b250YWwiLAogICAgInNsaWRlci12ZXJ0aWNhbCIsICJzbGlkZXJ0aHVtYi1ob3Jpem9udGFsIiwgInNsaWRlcnRodW1iLXZlcnRpY2FsIiwgInNsb3ciLAogICAgInNtYWxsIiwgInNtYWxsLWNhcHMiLCAic21hbGwtY2FwdGlvbiIsICJzbWFsbGVyIiwgInNvbGlkIiwgInNvbWFsaSIsCiAgICAic291cmNlLWF0b3AiLCAic291cmNlLWluIiwgInNvdXJjZS1vdXQiLCAic291cmNlLW92ZXIiLCAic3BhY2UiLCAic3F1YXJlIiwKICAgICJzcXVhcmUtYnV0dG9uIiwgInN0YXJ0IiwgInN0YXRpYyIsICJzdGF0dXMtYmFyIiwgInN0cmV0Y2giLCAic3Ryb2tlIiwKICAgICJzdWIiLCAic3VicGl4ZWwtYW50aWFsaWFzZWQiLCAic3VwZXIiLCAic3ctcmVzaXplIiwgInRhYmxlIiwKICAgICJ0YWJsZS1jYXB0aW9uIiwgInRhYmxlLWNlbGwiLCAidGFibGUtY29sdW1uIiwgInRhYmxlLWNvbHVtbi1ncm91cCIsCiAgICAidGFibGUtZm9vdGVyLWdyb3VwIiwgInRhYmxlLWhlYWRlci1ncm91cCIsICJ0YWJsZS1yb3ciLCAidGFibGUtcm93LWdyb3VwIiwKICAgICJ0ZWx1Z3UiLCAidGV4dCIsICJ0ZXh0LWJvdHRvbSIsICJ0ZXh0LXRvcCIsICJ0ZXh0YXJlYSIsICJ0ZXh0ZmllbGQiLCAidGhhaSIsCiAgICAidGhpY2siLCAidGhpbiIsICJ0aHJlZWRkYXJrc2hhZG93IiwgInRocmVlZGZhY2UiLCAidGhyZWVkaGlnaGxpZ2h0IiwKICAgICJ0aHJlZWRsaWdodHNoYWRvdyIsICJ0aHJlZWRzaGFkb3ciLCAidGliZXRhbiIsICJ0aWdyZSIsICJ0aWdyaW55YS1lciIsCiAgICAidGlncmlueWEtZXItYWJlZ2VkZSIsICJ0aWdyaW55YS1ldCIsICJ0aWdyaW55YS1ldC1hYmVnZWRlIiwgInRvIiwgInRvcCIsCiAgICAidHJhbnNwYXJlbnQiLCAidWx0cmEtY29uZGVuc2VkIiwgInVsdHJhLWV4cGFuZGVkIiwgInVuZGVybGluZSIsICJ1cCIsCiAgICAidXBwZXItYWxwaGEiLCAidXBwZXItYXJtZW5pYW4iLCAidXBwZXItZ3JlZWsiLCAidXBwZXItaGV4YWRlY2ltYWwiLAogICAgInVwcGVyLWxhdGluIiwgInVwcGVyLW5vcndlZ2lhbiIsICJ1cHBlci1yb21hbiIsICJ1cHBlcmNhc2UiLCAidXJkdSIsICJ1cmwiLAogICAgInZlcnRpY2FsIiwgInZlcnRpY2FsLXRleHQiLCAidmlzaWJsZSIsICJ2aXNpYmxlRmlsbCIsICJ2aXNpYmxlUGFpbnRlZCIsCiAgICAidmlzaWJsZVN0cm9rZSIsICJ2aXN1YWwiLCAidy1yZXNpemUiLCAid2FpdCIsICJ3YXZlIiwgIndoaXRlIiwgIndpZGVyIiwKICAgICJ3aW5kb3ciLCAid2luZG93ZnJhbWUiLCAid2luZG93dGV4dCIsICJ4LWxhcmdlIiwgIngtc21hbGwiLCAieG9yIiwKICAgICJ4eC1sYXJnZSIsICJ4eC1zbWFsbCIsICJ5ZWxsb3ciCiAgXSk7CgogIGZ1bmN0aW9uIGtleVNldChhcnJheSkgeyB2YXIga2V5cyA9IHt9OyBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSBrZXlzW2FycmF5W2ldXSA9IHRydWU7IHJldHVybiBrZXlzOyB9CiAgZnVuY3Rpb24gcmV0KHN0eWxlLCB0cCkge3R5cGUgPSB0cDsgcmV0dXJuIHN0eWxlO30KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gIkAiKSB7c3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXS8pOyByZXR1cm4gcmV0KCJkZWYiLCBzdHJlYW0uY3VycmVudCgpKTt9CiAgICBlbHNlIGlmIChjaCA9PSAiLyIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5DQ29tbWVudDsKICAgICAgcmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgc3RyZWFtLmVhdCgiISIpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TR01MQ29tbWVudDsKICAgICAgcmV0dXJuIHRva2VuU0dNTENvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiPSIpIHJldChudWxsLCAiY29tcGFyZSIpOwogICAgZWxzZSBpZiAoKGNoID09ICJ+IiB8fCBjaCA9PSAifCIpICYmIHN0cmVhbS5lYXQoIj0iKSkgcmV0dXJuIHJldChudWxsLCAiY29tcGFyZSIpOwogICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7CiAgICAgIHJldHVybiByZXQoImF0b20iLCAiaGFzaCIpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIiEiKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXlxzKlx3Ki8pOwogICAgICByZXR1cm4gcmV0KCJrZXl3b3JkIiwgImltcG9ydGFudCIpOwogICAgfQogICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy4lXS8pOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAidW5pdCIpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT09ICItIikgewogICAgICBpZiAoL1xkLy50ZXN0KHN0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAidW5pdCIpOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlteLV0rLS8pKSB7CiAgICAgICAgcmV0dXJuIHJldCgibWV0YSIsIHR5cGUpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgvWywrPipcL10vLnRlc3QoY2gpKSB7CiAgICAgIHJldHVybiByZXQobnVsbCwgInNlbGVjdC1vcCIpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIi4iICYmIHN0cmVhbS5tYXRjaCgvXi0/W19hLXpdW19hLXowLTktXSovaSkpIHsKICAgICAgcmV0dXJuIHJldCgicXVhbGlmaWVyIiwgdHlwZSk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgcmV0dXJuIHJldCgib3BlcmF0b3IiLCBjaCk7CiAgICB9CiAgICBlbHNlIGlmICgvWzt7fVxbXF1cKFwpXS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHJldChudWxsLCBjaCk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAidSIgJiYgc3RyZWFtLm1hdGNoKCJybCgiKSkgewogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuUGFyZW50aGVzaXplZDsKICAgICAgcmV0dXJuIHJldCgicHJvcGVydHkiLCAidmFyaWFibGUiKTsKICAgIH0KICAgIGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7CiAgICAgIHJldHVybiByZXQoInByb3BlcnR5IiwgInZhcmlhYmxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSAiLyIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgfQoKICBmdW5jdGlvbiB0b2tlblNHTUxDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBkYXNoZXMgPSAwLCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChkYXNoZXMgPj0gMiAmJiBjaCA9PSAiPiIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkYXNoZXMgPSAoY2ggPT0gIi0iKSA/IGRhc2hlcyArIDEgOiAwOwogICAgfQogICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSwgbm9uSW5jbHVzaXZlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpCiAgICAgICAgICBicmVhazsKICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoIWVzY2FwZWQpIHsKICAgICAgICBpZiAobm9uSW5jbHVzaXZlKSBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICB9CiAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiB0b2tlblBhcmVudGhlc2l6ZWQoc3RyZWFtLCBzdGF0ZSkgewogICAgc3RyZWFtLm5leHQoKTsgLy8gTXVzdCBiZSAnKCcKICAgIGlmICghc3RyZWFtLm1hdGNoKC9ccypbXCJcJ10vLCBmYWxzZSkpCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoIikiLCB0cnVlKTsKICAgIGVsc2UKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICByZXR1cm4gcmV0KG51bGwsICIoIik7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZSkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgYmFzZUluZGVudDogYmFzZSB8fCAwLAogICAgICAgICAgICAgIHN0YWNrOiBbXX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIAogICAgICAvLyBVc2UgdGhlc2UgdGVybXMgd2hlbiBhcHBsaWNhYmxlIChzZWUgaHR0cDovL3d3dy54YW50aGlyLmNvbS9ibG9nL2I0RTUwKQogICAgICAvLyAKICAgICAgLy8gcnVsZSoqIG9yICoqcnVsZXNldDoKICAgICAgLy8gQSBzZWxlY3RvciArIGJyYWNlcyBjb21ibywgb3IgYW4gYXQtcnVsZS4KICAgICAgLy8gCiAgICAgIC8vIGRlY2xhcmF0aW9uIGJsb2NrOgogICAgICAvLyBBIHNlcXVlbmNlIG9mIGRlY2xhcmF0aW9ucy4KICAgICAgLy8gCiAgICAgIC8vIGRlY2xhcmF0aW9uOgogICAgICAvLyBBIHByb3BlcnR5ICsgY29sb24gKyB2YWx1ZSBjb21iby4KICAgICAgLy8gCiAgICAgIC8vIHByb3BlcnR5IHZhbHVlOgogICAgICAvLyBUaGUgZW50aXJlIHZhbHVlIG9mIGEgcHJvcGVydHkuCiAgICAgIC8vIAogICAgICAvLyBjb21wb25lbnQgdmFsdWU6CiAgICAgIC8vIEEgc2luZ2xlIHBpZWNlIG9mIGEgcHJvcGVydHkgdmFsdWUuIExpa2UgdGhlIDVweCBpbgogICAgICAvLyB0ZXh0LXNoYWRvdzogMCAwIDVweCBibHVlOy4gQ2FuIGFsc28gcmVmZXIgdG8gdGhpbmdzIHRoYXQgYXJlCiAgICAgIC8vIG11bHRpcGxlIHRlcm1zLCBsaWtlIHRoZSAxLTQgdGVybXMgdGhhdCBtYWtlIHVwIHRoZSBiYWNrZ3JvdW5kLXNpemUKICAgICAgLy8gcG9ydGlvbiBvZiB0aGUgYmFja2dyb3VuZCBzaG9ydGhhbmQuCiAgICAgIC8vIAogICAgICAvLyB0ZXJtOgogICAgICAvLyBUaGUgYmFzaWMgdW5pdCBvZiBhdXRob3ItZmFjaW5nIENTUywgbGlrZSBhIHNpbmdsZSBudW1iZXIgKDUpLAogICAgICAvLyBkaW1lbnNpb24gKDVweCksIHN0cmluZyAoImZvbyIpLCBvciBmdW5jdGlvbi4gT2ZmaWNpYWxseSBkZWZpbmVkCiAgICAgIC8vICBieSB0aGUgQ1NTIDIuMSBncmFtbWFyIChsb29rIGZvciB0aGUgJ3Rlcm0nIHByb2R1Y3Rpb24pCiAgICAgIC8vIAogICAgICAvLyAKICAgICAgLy8gc2ltcGxlIHNlbGVjdG9yOgogICAgICAvLyBBIHNpbmdsZSBhdG9taWMgc2VsZWN0b3IsIGxpa2UgYSB0eXBlIHNlbGVjdG9yLCBhbiBhdHRyIHNlbGVjdG9yLCBhCiAgICAgIC8vIGNsYXNzIHNlbGVjdG9yLCBldGMuCiAgICAgIC8vIAogICAgICAvLyBjb21wb3VuZCBzZWxlY3RvcjoKICAgICAgLy8gT25lIG9yIG1vcmUgc2ltcGxlIHNlbGVjdG9ycyB3aXRob3V0IGEgY29tYmluYXRvci4gZGl2LmV4YW1wbGUgaXMKICAgICAgLy8gY29tcG91bmQsIGRpdiA+IC5leGFtcGxlIGlzIG5vdC4KICAgICAgLy8gCiAgICAgIC8vIGNvbXBsZXggc2VsZWN0b3I6CiAgICAgIC8vIE9uZSBvciBtb3JlIGNvbXBvdW5kIHNlbGVjdG9ycyBjaGFpbmVkIHdpdGggY29tYmluYXRvcnMuCiAgICAgIC8vIAogICAgICAvLyBjb21iaW5hdG9yOgogICAgICAvLyBUaGUgcGFydHMgb2Ygc2VsZWN0b3JzIHRoYXQgZXhwcmVzcyByZWxhdGlvbnNoaXBzLiBUaGVyZSBhcmUgZm91cgogICAgICAvLyBjdXJyZW50bHkgLSB0aGUgc3BhY2UgKGRlc2NlbmRhbnQgY29tYmluYXRvciksIHRoZSBncmVhdGVyLXRoYW4KICAgICAgLy8gYnJhY2tldCAoY2hpbGQgY29tYmluYXRvciksIHRoZSBwbHVzIHNpZ24gKG5leHQgc2libGluZyBjb21iaW5hdG9yKSwKICAgICAgLy8gYW5kIHRoZSB0aWxkYSAoZm9sbG93aW5nIHNpYmxpbmcgY29tYmluYXRvcikuCiAgICAgIC8vIAogICAgICAvLyBzZXF1ZW5jZSBvZiBzZWxlY3RvcnM6CiAgICAgIC8vIE9uZSBvciBtb3JlIG9mIHRoZSBuYW1lZCB0eXBlIG9mIHNlbGVjdG9yIGNoYWluZWQgd2l0aCBjb21tYXMuCgogICAgICBpZiAoc3RhdGUudG9rZW5pemUgPT0gdG9rZW5CYXNlICYmIHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CgogICAgICAvLyBDaGFuZ2luZyBzdHlsZSByZXR1cm5lZCBiYXNlZCBvbiBjb250ZXh0CiAgICAgIHZhciBjb250ZXh0ID0gc3RhdGUuc3RhY2tbc3RhdGUuc3RhY2subGVuZ3RoLTFdOwogICAgICBpZiAoc3R5bGUgPT0gInByb3BlcnR5IikgewogICAgICAgIGlmIChjb250ZXh0ID09ICJwcm9wZXJ0eVZhbHVlIil7CiAgICAgICAgICBpZiAodmFsdWVLZXl3b3Jkc1tzdHJlYW0uY3VycmVudCgpXSkgewogICAgICAgICAgICBzdHlsZSA9ICJzdHJpbmctMiI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvbG9yS2V5d29yZHNbc3RyZWFtLmN1cnJlbnQoKV0pIHsKICAgICAgICAgICAgc3R5bGUgPSAia2V5d29yZCI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHlsZSA9ICJ2YXJpYWJsZS0yIjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQgPT0gInJ1bGUiKSB7CiAgICAgICAgICBpZiAoIXByb3BlcnR5S2V5d29yZHNbc3RyZWFtLmN1cnJlbnQoKV0pIHsKICAgICAgICAgICAgc3R5bGUgKz0gIiBlcnJvciI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghY29udGV4dCB8fCBjb250ZXh0ID09ICJAbWVkaWF7IikgewogICAgICAgICAgc3R5bGUgPSAidGFnIjsKICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQgPT0gIkBtZWRpYSIpIHsKICAgICAgICAgIGlmIChhdE1lZGlhVHlwZXNbc3RyZWFtLmN1cnJlbnQoKV0pIHsKICAgICAgICAgICAgc3R5bGUgPSAiYXR0cmlidXRlIjsgLy8gS25vd24gYXR0cmlidXRlCiAgICAgICAgICB9IGVsc2UgaWYgKC9eKG9ubHl8bm90KSQvaS50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgICAgICAgIHN0eWxlID0gImtleXdvcmQiOwogICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCkgPT0gImFuZCIpIHsKICAgICAgICAgICAgc3R5bGUgPSAiZXJyb3IiOyAvLyAiYW5kIiBpcyBvbmx5IGFsbG93ZWQgaW4gQG1lZGlhVHlwZQogICAgICAgICAgfSBlbHNlIGlmIChhdE1lZGlhRmVhdHVyZXNbc3RyZWFtLmN1cnJlbnQoKV0pIHsKICAgICAgICAgICAgc3R5bGUgPSAiZXJyb3IiOyAvLyBLbm93biBwcm9wZXJ0eSwgc2hvdWxkIGJlIGluIEBtZWRpYVR5cGUoCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBVbmtub3duLCBleHBlY3Rpbmcga2V5d29yZCBvciBhdHRyaWJ1dGUsIGFzc3VtaW5nIGF0dHJpYnV0ZQogICAgICAgICAgICBzdHlsZSA9ICJhdHRyaWJ1dGUgZXJyb3IiOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PSAiQG1lZGlhVHlwZSIpIHsKICAgICAgICAgIGlmIChhdE1lZGlhVHlwZXNbc3RyZWFtLmN1cnJlbnQoKV0pIHsKICAgICAgICAgICAgc3R5bGUgPSAiYXR0cmlidXRlIjsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpID09ICJhbmQiKSB7CiAgICAgICAgICAgIHN0eWxlID0gIm9wZXJhdG9yIjsKICAgICAgICAgIH0gZWxzZSBpZiAoL14ob25seXxub3QpJC9pLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkpIHsKICAgICAgICAgICAgc3R5bGUgPSAiZXJyb3IiOyAvLyBPbmx5IGFsbG93ZWQgaW4gQG1lZGlhCiAgICAgICAgICB9IGVsc2UgaWYgKGF0TWVkaWFGZWF0dXJlc1tzdHJlYW0uY3VycmVudCgpXSkgewogICAgICAgICAgICBzdHlsZSA9ICJlcnJvciI7IC8vIEtub3duIHByb3BlcnR5LCBzaG91bGQgYmUgaW4gcGFyZW50aGVzZXMKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFVua25vd24gYXR0cmlidXRlIG9yIHByb3BlcnR5LCBidXQgZXhwZWN0aW5nIHByb3BlcnR5IChwcmVjZWRlZAogICAgICAgICAgICAvLyBieSAiYW5kIikuIFNob3VsZCBiZSBpbiBwYXJlbnRoZXNlcwogICAgICAgICAgICBzdHlsZSA9ICJlcnJvciI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0ID09ICJAbWVkaWFUeXBlKCIpIHsKICAgICAgICAgIGlmIChwcm9wZXJ0eUtleXdvcmRzW3N0cmVhbS5jdXJyZW50KCldKSB7CiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIHJlbWFpbnMgInByb3BlcnR5IgogICAgICAgICAgfSBlbHNlIGlmIChhdE1lZGlhVHlwZXNbc3RyZWFtLmN1cnJlbnQoKV0pIHsKICAgICAgICAgICAgc3R5bGUgPSAiZXJyb3IiOyAvLyBLbm93biBwcm9wZXJ0eSwgc2hvdWxkIGJlIGluIHBhcmVudGhlc2VzCiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKSA9PSAiYW5kIikgewogICAgICAgICAgICBzdHlsZSA9ICJvcGVyYXRvciI7CiAgICAgICAgICB9IGVsc2UgaWYgKC9eKG9ubHl8bm90KSQvaS50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgICAgICAgIHN0eWxlID0gImVycm9yIjsgLy8gT25seSBhbGxvd2VkIGluIEBtZWRpYQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3R5bGUgKz0gIiBlcnJvciI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0eWxlID0gImVycm9yIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gImF0b20iKSB7CiAgICAgICAgaWYoIWNvbnRleHQgfHwgY29udGV4dCA9PSAiQG1lZGlheyIpIHsKICAgICAgICAgIHN0eWxlID0gImJ1aWx0aW4iOwogICAgICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PSAicHJvcGVydHlWYWx1ZSIpIHsKICAgICAgICAgIGlmICghL14jKFswLTlhLWZBLWZdezN9fFswLTlhLWZBLWZdezZ9KSQvLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkpIHsKICAgICAgICAgICAgc3R5bGUgKz0gIiBlcnJvciI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0eWxlID0gImVycm9yIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PSAiQG1lZGlhIiAmJiB0eXBlID09ICJ7IikgewogICAgICAgIHN0eWxlID0gImVycm9yIjsKICAgICAgfQoKICAgICAgLy8gUHVzaC9wb3AgY29udGV4dCBzdGFjawogICAgICBpZiAodHlwZSA9PSAieyIpIHsKICAgICAgICBpZiAoY29udGV4dCA9PSAiQG1lZGlhIiB8fCBjb250ZXh0ID09ICJAbWVkaWFUeXBlIikgewogICAgICAgICAgc3RhdGUuc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGgtMV0gPSAiQG1lZGlheyI7CiAgICAgICAgfQogICAgICAgIGVsc2Ugc3RhdGUuc3RhY2sucHVzaCgicnVsZSIpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIn0iKSB7CiAgICAgICAgc3RhdGUuc3RhY2sucG9wKCk7CiAgICAgICAgaWYgKGNvbnRleHQgPT0gInByb3BlcnR5VmFsdWUiKSBzdGF0ZS5zdGFjay5wb3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0eXBlID09ICJAbWVkaWEiKSBzdGF0ZS5zdGFjay5wdXNoKCJAbWVkaWEiKTsKICAgICAgZWxzZSBpZiAoY29udGV4dCA9PSAiQG1lZGlhIiAmJiAvXGIoa2V5d29yZHxhdHRyaWJ1dGUpXGIvLnRlc3Qoc3R5bGUpKQogICAgICAgIHN0YXRlLnN0YWNrLnB1c2goIkBtZWRpYVR5cGUiKTsKICAgICAgZWxzZSBpZiAoY29udGV4dCA9PSAiQG1lZGlhVHlwZSIgJiYgc3RyZWFtLmN1cnJlbnQoKSA9PSAiLCIpIHN0YXRlLnN0YWNrLnBvcCgpOwogICAgICBlbHNlIGlmIChjb250ZXh0ID09ICJAbWVkaWFUeXBlIiAmJiB0eXBlID09ICIoIikgc3RhdGUuc3RhY2sucHVzaCgiQG1lZGlhVHlwZSgiKTsKICAgICAgZWxzZSBpZiAoY29udGV4dCA9PSAiQG1lZGlhVHlwZSgiICYmIHR5cGUgPT0gIikiKSBzdGF0ZS5zdGFjay5wb3AoKTsKICAgICAgZWxzZSBpZiAoY29udGV4dCA9PSAicnVsZSIgJiYgdHlwZSA9PSAiOiIpIHN0YXRlLnN0YWNrLnB1c2goInByb3BlcnR5VmFsdWUiKTsKICAgICAgZWxzZSBpZiAoY29udGV4dCA9PSAicHJvcGVydHlWYWx1ZSIgJiYgdHlwZSA9PSAiOyIpIHN0YXRlLnN0YWNrLnBvcCgpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgbiA9IHN0YXRlLnN0YWNrLmxlbmd0aDsKICAgICAgaWYgKC9eXH0vLnRlc3QodGV4dEFmdGVyKSkKICAgICAgICBuIC09IHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9PSAicHJvcGVydHlWYWx1ZSIgPyAyIDogMTsKICAgICAgcmV0dXJuIHN0YXRlLmJhc2VJbmRlbnQgKyBuICogaW5kZW50VW5pdDsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogIn0iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvY3NzIiwgImNzcyIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/css/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IENTUyBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iY3NzLmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7YmFja2dyb3VuZDogI2Y4ZjhmODt9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogQ1NTIG1vZGU8L2gxPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLyogU29tZSBleGFtcGxlIENTUyAqLwoKQGltcG9ydCB1cmwoInNvbWV0aGluZy5jc3MiKTsKCmJvZHkgewogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAzZW0gNmVtOwogIGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsLCBzYW5zLXNlcmlmOwogIGNvbG9yOiAjMDAwOwp9CgojbmF2aWdhdGlvbiBhIHsKICBmb250LXdlaWdodDogYm9sZDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKfQoKaDEgewogIGZvbnQtc2l6ZTogMi41ZW07Cn0KCmgyIHsKICBmb250LXNpemU6IDEuN2VtOwp9CgpoMTpiZWZvcmUsIGgyOmJlZm9yZSB7CiAgY29udGVudDogIjo6IjsKfQoKY29kZSB7CiAgZm9udC1mYW1pbHk6IGNvdXJpZXIsIG1vbm9zcGFjZTsKICBmb250LXNpemU6IDgwJTsKICBjb2xvcjogIzQxOEE4QTsKfQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC9jc3M8L2NvZGU+LjwvcD4KCiAgICA8cD48c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPiA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjY3NzXyoiPm5vcm1hbDwvYT4sICA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjdmVyYm9zZSxjc3NfKiI+dmVyYm9zZTwvYT4uPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/css/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gSW5pdGlhdGUgTW9kZVRlc3QgYW5kIHNldCBkZWZhdWx0cwp2YXIgTVQgPSBNb2RlVGVzdDsKTVQubW9kZU5hbWUgPSAnY3NzJzsKTVQubW9kZU9wdGlvbnMgPSB7fTsKCi8vIFJlcXVpcmVzIGF0IGxlYXN0IG9uZSBtZWRpYSBxdWVyeQpNVC50ZXN0TW9kZSgKICAnYXRNZWRpYUVtcHR5JywKICAnQG1lZGlhIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2Vycm9yJywgJ3snLAogICAgbnVsbCwgJyB9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdhdE1lZGlhTXVsdGlwbGUnLAogICdAbWVkaWEgbm90IHNjcmVlbiBhbmQgKGNvbG9yKSwgbm90IHByaW50IGFuZCAoY29sb3IpIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2tleXdvcmQnLCAnbm90JywKICAgIG51bGwsICcgJywKICAgICdhdHRyaWJ1dGUnLCAnc2NyZWVuJywKICAgIG51bGwsICcgJywKICAgICdvcGVyYXRvcicsICdhbmQnLAogICAgbnVsbCwgJyAoJywKICAgICdwcm9wZXJ0eScsICdjb2xvcicsCiAgICBudWxsLCAnKSwgJywKICAgICdrZXl3b3JkJywgJ25vdCcsCiAgICBudWxsLCAnICcsCiAgICAnYXR0cmlidXRlJywgJ3ByaW50JywKICAgIG51bGwsICcgJywKICAgICdvcGVyYXRvcicsICdhbmQnLAogICAgbnVsbCwgJyAoJywKICAgICdwcm9wZXJ0eScsICdjb2xvcicsCiAgICBudWxsLCAnKSB7IH0nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ2F0TWVkaWFDaGVja1N0YWNrJywKICAnQG1lZGlhIHNjcmVlbiB7IH0gZm9vIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2F0dHJpYnV0ZScsICdzY3JlZW4nLAogICAgbnVsbCwgJyB7IH0gJywKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyB9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdhdE1lZGlhQ2hlY2tTdGFjaycsCiAgJ0BtZWRpYSBzY3JlZW4gKGNvbG9yKSB7IH0gZm9vIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2F0dHJpYnV0ZScsICdzY3JlZW4nLAogICAgbnVsbCwgJyAoJywKICAgICdwcm9wZXJ0eScsICdjb2xvcicsCiAgICBudWxsLCAnKSB7IH0gJywKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyB9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdhdE1lZGlhQ2hlY2tTdGFja0ludmFsaWRBdHRyaWJ1dGUnLAogICdAbWVkaWEgZm9vYmFyaGVsbG8geyB9IGZvbyB7IH0nLAogIFsKICAgICdkZWYnLCAnQG1lZGlhJywKICAgIG51bGwsICcgJywKICAgICdhdHRyaWJ1dGUgZXJyb3InLCAnZm9vYmFyaGVsbG8nLAogICAgbnVsbCwgJyB7IH0gJywKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyB9JwogIF0KKTsKCi8vIEVycm9yLCBiZWNhdXNlICJhbmQiIGlzIG9ubHkgYWxsb3dlZCBpbW1lZGlhdGVseSBwcmVjZWRpbmcgYSBtZWRpYSBleHByZXNzaW9uCk1ULnRlc3RNb2RlKAogICdhdE1lZGlhSW52YWxpZEF0dHJpYnV0ZScsCiAgJ0BtZWRpYSBmb29iYXJoZWxsbyB7IH0nLAogIFsKICAgICdkZWYnLCAnQG1lZGlhJywKICAgIG51bGwsICcgJywKICAgICdhdHRyaWJ1dGUgZXJyb3InLCAnZm9vYmFyaGVsbG8nLAogICAgbnVsbCwgJyB7IH0nCiAgXQopOwoKLy8gRXJyb3IsIGJlY2F1c2UgImFuZCIgaXMgb25seSBhbGxvd2VkIGltbWVkaWF0ZWx5IHByZWNlZGluZyBhIG1lZGlhIGV4cHJlc3Npb24KTVQudGVzdE1vZGUoCiAgJ2F0TWVkaWFJbnZhbGlkQW5kJywKICAnQG1lZGlhIGFuZCBzY3JlZW4geyB9JywKICBbCiAgICAnZGVmJywgJ0BtZWRpYScsCiAgICBudWxsLCAnICcsCiAgICAnZXJyb3InLCAnYW5kJywKICAgIG51bGwsICcgJywKICAgICdhdHRyaWJ1dGUnLCAnc2NyZWVuJywKICAgIG51bGwsICcgeyB9JwogIF0KKTsKCi8vIEVycm9yLCBiZWNhdXNlICJub3QiIGlzIG9ubHkgYWxsb3dlZCBhcyB0aGUgZmlyc3QgaXRlbSBpbiBlYWNoIG1lZGlhIHF1ZXJ5Ck1ULnRlc3RNb2RlKAogICdhdE1lZGlhSW52YWxpZE5vdCcsCiAgJ0BtZWRpYSBzY3JlZW4gbm90IChub3QpIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2F0dHJpYnV0ZScsICdzY3JlZW4nLAogICAgbnVsbCwgJyAnLAogICAgJ2Vycm9yJywgJ25vdCcsCiAgICBudWxsLCAnICgnLAogICAgJ2Vycm9yJywgJ25vdCcsCiAgICBudWxsLCAnKSB7IH0nCiAgXQopOwoKLy8gRXJyb3IsIGJlY2F1c2UgIm9ubHkiIGlzIG9ubHkgYWxsb3dlZCBhcyB0aGUgZmlyc3QgaXRlbSBpbiBlYWNoIG1lZGlhIHF1ZXJ5Ck1ULnRlc3RNb2RlKAogICdhdE1lZGlhSW52YWxpZE9ubHknLAogICdAbWVkaWEgc2NyZWVuIG9ubHkgKG9ubHkpIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2F0dHJpYnV0ZScsICdzY3JlZW4nLAogICAgbnVsbCwgJyAnLAogICAgJ2Vycm9yJywgJ29ubHknLAogICAgbnVsbCwgJyAoJywKICAgICdlcnJvcicsICdvbmx5JywKICAgIG51bGwsICcpIHsgfScKICBdCik7CgovLyBFcnJvciwgYmVjYXVzZSAiZm9vYmFyaGVsbG8iIGlzIG5laXRoZXIgYSBrbm93biB0eXBlIG9yIHByb3BlcnR5LCBidXQKLy8gcHJvcGVydHkgd2FzIGV4cGVjdGVkIChhZnRlciAiYW5kIiksIGFuZCBpdCBzaG91bGQgYmUgaW4gcGFyZW50aGVzZS4KTVQudGVzdE1vZGUoCiAgJ2F0TWVkaWFVbmtub3duVHlwZScsCiAgJ0BtZWRpYSBzY3JlZW4gYW5kIGZvb2JhcmhlbGxvIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2F0dHJpYnV0ZScsICdzY3JlZW4nLAogICAgbnVsbCwgJyAnLAogICAgJ29wZXJhdG9yJywgJ2FuZCcsCiAgICBudWxsLCAnICcsCiAgICAnZXJyb3InLCAnZm9vYmFyaGVsbG8nLAogICAgbnVsbCwgJyB7IH0nCiAgXQopOwoKLy8gRXJyb3IsIGJlY2F1c2UgImNvbG9yIiBpcyBub3QgYSBrbm93biB0eXBlLCBidXQgaXMgYSBrbm93biBwcm9wZXJ0eSwgYW5kCi8vIHNob3VsZCBiZSBpbiBwYXJlbnRoZXNlcy4KTVQudGVzdE1vZGUoCiAgJ2F0TWVkaWFJbnZhbGlkVHlwZScsCiAgJ0BtZWRpYSBzY3JlZW4gYW5kIGNvbG9yIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2F0dHJpYnV0ZScsICdzY3JlZW4nLAogICAgbnVsbCwgJyAnLAogICAgJ29wZXJhdG9yJywgJ2FuZCcsCiAgICBudWxsLCAnICcsCiAgICAnZXJyb3InLCAnY29sb3InLAogICAgbnVsbCwgJyB7IH0nCiAgXQopOwoKLy8gRXJyb3IsIGJlY2F1c2UgInByaW50IiBpcyBub3QgYSBrbm93biBwcm9wZXJ0eSwgYnV0IGlzIGEga25vd24gdHlwZSwKLy8gYW5kIHNob3VsZCBub3QgYmUgaW4gcGFyZW50aGVzZS4KTVQudGVzdE1vZGUoCiAgJ2F0TWVkaWFJbnZhbGlkUHJvcGVydHknLAogICdAbWVkaWEgc2NyZWVuIGFuZCAocHJpbnQpIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2F0dHJpYnV0ZScsICdzY3JlZW4nLAogICAgbnVsbCwgJyAnLAogICAgJ29wZXJhdG9yJywgJ2FuZCcsCiAgICBudWxsLCAnICgnLAogICAgJ2Vycm9yJywgJ3ByaW50JywKICAgIG51bGwsICcpIHsgfScKICBdCik7CgovLyBTb2Z0IGVycm9yLCBiZWNhdXNlICJmb29iYXJoZWxsbyIgaXMgbm90IGEga25vd24gcHJvcGVydHkgb3IgdHlwZS4KTVQudGVzdE1vZGUoCiAgJ2F0TWVkaWFVbmtub3duUHJvcGVydHknLAogICdAbWVkaWEgc2NyZWVuIGFuZCAoZm9vYmFyaGVsbG8pIHsgfScsCiAgWwogICAgJ2RlZicsICdAbWVkaWEnLAogICAgbnVsbCwgJyAnLAogICAgJ2F0dHJpYnV0ZScsICdzY3JlZW4nLAogICAgbnVsbCwgJyAnLAogICAgJ29wZXJhdG9yJywgJ2FuZCcsCiAgICBudWxsLCAnICgnLAogICAgJ3Byb3BlcnR5IGVycm9yJywgJ2Zvb2JhcmhlbGxvJywKICAgIG51bGwsICcpIHsgfScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGFnU2VsZWN0b3InLAogICdmb28geyB9JywKICBbCiAgICAndGFnJywgJ2ZvbycsCiAgICBudWxsLCAnIHsgfScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAnY2xhc3NTZWxlY3RvcicsCiAgJy5mb28tYmFyX2hlbGxvIHsgfScsCiAgWwogICAgJ3F1YWxpZmllcicsICcuZm9vLWJhcl9oZWxsbycsCiAgICBudWxsLCAnIHsgfScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAnaWRTZWxlY3RvcicsCiAgJyNmb28geyAjZm9vIH0nLAogIFsKICAgICdidWlsdGluJywgJyNmb28nLAogICAgbnVsbCwgJyB7ICcsCiAgICAnZXJyb3InLCAnI2ZvbycsCiAgICBudWxsLCAnIH0nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3RhZ1NlbGVjdG9yVW5jbG9zZWQnLAogICdmb28geyBtYXJnaW46IDAgfSBiYXIgeyB9JywKICBbCiAgICAndGFnJywgJ2ZvbycsCiAgICBudWxsLCAnIHsgJywKICAgICdwcm9wZXJ0eScsICdtYXJnaW4nLAogICAgJ29wZXJhdG9yJywgJzonLAogICAgbnVsbCwgJyAnLAogICAgJ251bWJlcicsICcwJywKICAgIG51bGwsICcgfSAnLAogICAgJ3RhZycsICdiYXInLAogICAgbnVsbCwgJyB7IH0nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3RhZ1N0cmluZ05vUXVvdGVzJywKICAnZm9vIHsgZm9udC1mYW1pbHk6IGhlbGxvIHdvcmxkOyB9JywKICBbCiAgICAndGFnJywgJ2ZvbycsCiAgICBudWxsLCAnIHsgJywKICAgICdwcm9wZXJ0eScsICdmb250LWZhbWlseScsCiAgICAnb3BlcmF0b3InLCAnOicsCiAgICBudWxsLCAnICcsCiAgICAndmFyaWFibGUtMicsICdoZWxsbycsCiAgICBudWxsLCAnICcsCiAgICAndmFyaWFibGUtMicsICd3b3JsZCcsCiAgICBudWxsLCAnOyB9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0YWdTdHJpbmdEb3VibGUnLAogICdmb28geyBmb250LWZhbWlseTogImhlbGxvIHdvcmxkIjsgfScsCiAgWwogICAgJ3RhZycsICdmb28nLAogICAgbnVsbCwgJyB7ICcsCiAgICAncHJvcGVydHknLCAnZm9udC1mYW1pbHknLAogICAgJ29wZXJhdG9yJywgJzonLAogICAgbnVsbCwgJyAnLAogICAgJ3N0cmluZycsICciaGVsbG8gd29ybGQiJywKICAgIG51bGwsICc7IH0nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3RhZ1N0cmluZ1NpbmdsZScsCiAgJ2ZvbyB7IGZvbnQtZmFtaWx5OiBcJ2hlbGxvIHdvcmxkXCc7IH0nLAogIFsKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyAnLAogICAgJ3Byb3BlcnR5JywgJ2ZvbnQtZmFtaWx5JywKICAgICdvcGVyYXRvcicsICc6JywKICAgIG51bGwsICcgJywKICAgICdzdHJpbmcnLCAnXCdoZWxsbyB3b3JsZFwnJywKICAgIG51bGwsICc7IH0nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3RhZ0NvbG9yS2V5d29yZCcsCiAgJ2ZvbyB7IGNvbG9yOiBibGFjazsgfScsCiAgWwogICAgJ3RhZycsICdmb28nLAogICAgbnVsbCwgJyB7ICcsCiAgICAncHJvcGVydHknLCAnY29sb3InLAogICAgJ29wZXJhdG9yJywgJzonLAogICAgbnVsbCwgJyAnLAogICAgJ2tleXdvcmQnLCAnYmxhY2snLAogICAgbnVsbCwgJzsgfScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGFnQ29sb3JIZXgzJywKICAnZm9vIHsgYmFja2dyb3VuZDogI2ZmZjsgfScsCiAgWwogICAgJ3RhZycsICdmb28nLAogICAgbnVsbCwgJyB7ICcsCiAgICAncHJvcGVydHknLCAnYmFja2dyb3VuZCcsCiAgICAnb3BlcmF0b3InLCAnOicsCiAgICBudWxsLCAnICcsCiAgICAnYXRvbScsICcjZmZmJywKICAgIG51bGwsICc7IH0nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3RhZ0NvbG9ySGV4NicsCiAgJ2ZvbyB7IGJhY2tncm91bmQ6ICNmZmZmZmY7IH0nLAogIFsKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyAnLAogICAgJ3Byb3BlcnR5JywgJ2JhY2tncm91bmQnLAogICAgJ29wZXJhdG9yJywgJzonLAogICAgbnVsbCwgJyAnLAogICAgJ2F0b20nLCAnI2ZmZmZmZicsCiAgICBudWxsLCAnOyB9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0YWdDb2xvckhleDQnLAogICdmb28geyBiYWNrZ3JvdW5kOiAjZmZmZjsgfScsCiAgWwogICAgJ3RhZycsICdmb28nLAogICAgbnVsbCwgJyB7ICcsCiAgICAncHJvcGVydHknLCAnYmFja2dyb3VuZCcsCiAgICAnb3BlcmF0b3InLCAnOicsCiAgICBudWxsLCAnICcsCiAgICAnYXRvbSBlcnJvcicsICcjZmZmZicsCiAgICBudWxsLCAnOyB9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0YWdDb2xvckhleEludmFsaWQnLAogICdmb28geyBiYWNrZ3JvdW5kOiAjZmZnOyB9JywKICBbCiAgICAndGFnJywgJ2ZvbycsCiAgICBudWxsLCAnIHsgJywKICAgICdwcm9wZXJ0eScsICdiYWNrZ3JvdW5kJywKICAgICdvcGVyYXRvcicsICc6JywKICAgIG51bGwsICcgJywKICAgICdhdG9tIGVycm9yJywgJyNmZmcnLAogICAgbnVsbCwgJzsgfScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGFnTmVnYXRpdmVOdW1iZXInLAogICdmb28geyBtYXJnaW46IC01cHg7IH0nLAogIFsKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyAnLAogICAgJ3Byb3BlcnR5JywgJ21hcmdpbicsCiAgICAnb3BlcmF0b3InLCAnOicsCiAgICBudWxsLCAnICcsCiAgICAnbnVtYmVyJywgJy01cHgnLAogICAgbnVsbCwgJzsgfScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGFnUG9zaXRpdmVOdW1iZXInLAogICdmb28geyBwYWRkaW5nOiA1cHg7IH0nLAogIFsKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyAnLAogICAgJ3Byb3BlcnR5JywgJ3BhZGRpbmcnLAogICAgJ29wZXJhdG9yJywgJzonLAogICAgbnVsbCwgJyAnLAogICAgJ251bWJlcicsICc1cHgnLAogICAgbnVsbCwgJzsgfScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGFnVmVuZG9yJywKICAnZm9vIHsgLWZvby1ib3gtc2l6aW5nOiAtZm9vLWJvcmRlci1ib3g7IH0nLAogIFsKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyAnLAogICAgJ21ldGEnLCAnLWZvby0nLAogICAgJ3Byb3BlcnR5JywgJ2JveC1zaXppbmcnLAogICAgJ29wZXJhdG9yJywgJzonLAogICAgbnVsbCwgJyAnLAogICAgJ21ldGEnLCAnLWZvby0nLAogICAgJ3N0cmluZy0yJywgJ2JvcmRlci1ib3gnLAogICAgbnVsbCwgJzsgfScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGFnQm9ndXNQcm9wZXJ0eScsCiAgJ2ZvbyB7IGJhcmhlbGxvd29ybGQ6IDA7IH0nLAogIFsKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyAnLAogICAgJ3Byb3BlcnR5IGVycm9yJywgJ2JhcmhlbGxvd29ybGQnLAogICAgJ29wZXJhdG9yJywgJzonLAogICAgbnVsbCwgJyAnLAogICAgJ251bWJlcicsICcwJywKICAgIG51bGwsICc7IH0nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3RhZ1R3b1Byb3BlcnRpZXMnLAogICdmb28geyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IH0nLAogIFsKICAgICd0YWcnLCAnZm9vJywKICAgIG51bGwsICcgeyAnLAogICAgJ3Byb3BlcnR5JywgJ21hcmdpbicsCiAgICAnb3BlcmF0b3InLCAnOicsCiAgICBudWxsLCAnICcsCiAgICAnbnVtYmVyJywgJzAnLAogICAgbnVsbCwgJzsgJywKICAgICdwcm9wZXJ0eScsICdwYWRkaW5nJywKICAgICdvcGVyYXRvcicsICc6JywKICAgIG51bGwsICcgJywKICAgICdudW1iZXInLCAnMCcsCiAgICBudWxsLCAnOyB9JwogIF0KKTsKLy8KLy9NVC50ZXN0TW9kZSgKLy8gICd0YWdDbGFzcycsCi8vICAnQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1MDBweCksIHByaW50IHtmb28uYmFyI2hlbGxvIHsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7IGJhY2tncm91bmQ6ICNmMDA7IG1hcmdpbjogLTVweDsgcGFkZGluZzogNXB4OyAtZm9vLWJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0gLyogd29ybGQgKi99JywKLy8gIFsKLy8gICAgJ2RlZicsICdAbWVkaWEnLAovLyAgICBudWxsLCAnICcsCi8vICAgICdrZXl3b3JkJywgJ29ubHknLAovLyAgICBudWxsLCAnICcsCi8vICAgICdhdHRyaWJ1dGUnLCAnc2NyZWVuJywKLy8gICAgbnVsbCwgJyAnLAovLyAgICAnb3BlcmF0b3InLCAnYW5kJywKLy8gICAgbnVsbCwgJyAnLAovLyAgICAnYnJhY2tldCcsICcoJywKLy8gICAgJ3Byb3BlcnR5JywgJ21pbi13aWR0aCcsCi8vICAgICdvcGVyYXRvcicsICc6JywKLy8gICAgbnVsbCwgJyAnLAovLyAgICAnbnVtYmVyJywgJzUwMHB4JywKLy8gICAgJ2JyYWNrZXQnLCAnKScsCi8vICAgIG51bGwsICcsICcsCi8vICAgICdhdHRyaWJ1dGUnLCAncHJpbnQnLAovLyAgICBudWxsLCAnIHsnLAovLyAgICAndGFnJywgJ2ZvbycsCi8vICAgICdxdWFsaWZpZXInLCAnLmJhcicsCi8vICAgICdoZWFkZXInLCAnI2hlbGxvJywKLy8gICAgbnVsbCwgJyB7ICcsCi8vICAgICdwcm9wZXJ0eScsICdjb2xvcicsCi8vICAgICdvcGVyYXRvcicsICc6JywKLy8gICAgbnVsbCwgJyAnLAovLyAgICAna2V5d29yZCcsICdibGFjaycsCi8vICAgIG51bGwsICcgJywKLy8gICAgJ2tleXdvcmQnLCAnIWltcG9ydGFudCcsCi8vICAgIG51bGwsICc7ICcsCi8vICAgICdwcm9wZXJ0eScsICdiYWNrZ3JvdW5kJywKLy8gICAgJ29wZXJhdG9yJywgJzonLAovLyAgICBudWxsLCAnICcsCi8vICAgICdhdG9tJywgJyNmMDAnLAovLyAgICBudWxsLCAnOyAnLAovLyAgICAncHJvcGVydHknLCAncGFkZGluZycsCi8vICAgICdvcGVyYXRvcicsICc6JywKLy8gICAgbnVsbCwgJyAnLAovLyAgICAnbnVtYmVyJywgJzVweCcsCi8vICAgIG51bGwsICc7ICcsCi8vICAgICdwcm9wZXJ0eScsICdtYXJnaW4nLAovLyAgICAnb3BlcmF0b3InLCAnOicsCi8vICAgIG51bGwsICcgJywKLy8gICAgJ251bWJlcicsICctNXB4JywKLy8gICAgbnVsbCwgJzsgJywKLy8gICAgJ21ldGEnLCAnLWZvby0nLAovLyAgICAncHJvcGVydHknLCAnYm94LXNpemluZycsCi8vICAgICdvcGVyYXRvcicsICc6JywKLy8gICAgbnVsbCwgJyAnLAovLyAgICAnc3RyaW5nLTInLCAnYm9yZGVyLWJveCcsCi8vICAgIG51bGwsICc7IH0gJywKLy8gICAgJ2NvbW1lbnQnLCAnLyogd29ybGQgKi8nLAovLyAgICBudWxsLCAnfScKLy8gIF0KLy8pOw==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/diff/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/diff/diff.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJkaWZmIiwgZnVuY3Rpb24oKSB7CgogIHZhciBUT0tFTl9OQU1FUyA9IHsKICAgICcrJzogJ3Bvc2l0aXZlJywKICAgICctJzogJ25lZ2F0aXZlJywKICAgICdAJzogJ21ldGEnCiAgfTsKCiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgdmFyIHR3X3BvcyA9IHN0cmVhbS5zdHJpbmcuc2VhcmNoKC9bXHQgXSs/JC8pOwoKICAgICAgaWYgKCFzdHJlYW0uc29sKCkgfHwgdHdfcG9zID09PSAwKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAoImVycm9yICIgKyAoCiAgICAgICAgICBUT0tFTl9OQU1FU1tzdHJlYW0uc3RyaW5nLmNoYXJBdCgwKV0gfHwgJycpKS5yZXBsYWNlKC8gJC8sICcnKTsKICAgICAgfQoKICAgICAgdmFyIHRva2VuX25hbWUgPSBUT0tFTl9OQU1FU1tzdHJlYW0ucGVlaygpXSB8fCBzdHJlYW0uc2tpcFRvRW5kKCk7CgogICAgICBpZiAodHdfcG9zID09PSAtMSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ucG9zID0gdHdfcG9zOwogICAgICB9CgogICAgICByZXR1cm4gdG9rZW5fbmFtZTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWRpZmYiLCAiZGlmZiIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/diff/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IERpZmYgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImRpZmYuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO30KICAgICAgc3Bhbi5jbS1tZXRhIHtjb2xvcjogI2EwYiAhaW1wb3J0YW50O30KICAgICAgc3Bhbi5jbS1lcnJvciB7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBvcGFjaXR5OiAwLjQ7fQogICAgICBzcGFuLmNtLWVycm9yLmNtLXN0cmluZyB7IGJhY2tncm91bmQtY29sb3I6IHJlZDsgfQogICAgICBzcGFuLmNtLWVycm9yLmNtLXRhZyB7IGJhY2tncm91bmQtY29sb3I6ICMyYjI7IH0KICAgIDwvc3R5bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IERpZmYgbW9kZTwvaDE+CiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpkaWZmIC0tZ2l0IGEvaW5kZXguaHRtbCBiL2luZGV4Lmh0bWwKaW5kZXggYzFkOTE1Ni4uNzc2NDc0NCAxMDA2NDQKLS0tIGEvaW5kZXguaHRtbAorKysgYi9pbmRleC5odG1sCkBAIC05NSw3ICs5NSw4IEBAIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUgPSB7CiAgICAgPHNjcmlwdD4KICAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAotICAgICAgICBhdXRvTWF0Y2hCcmFja2V0czogdHJ1ZQorICAgICAgICBhdXRvTWF0Y2hCcmFja2V0czogdHJ1ZSwKKyAgICAgIG9uR3V0dGVyQ2xpY2s6IGZ1bmN0aW9uKHgpe2NvbnNvbGUubG9nKHgpO30KICAgICAgIH0pOwogICAgIDwvc2NyaXB0PgogICA8L2JvZHk+CmRpZmYgLS1naXQgYS9saWIvY29kZW1pcnJvci5qcyBiL2xpYi9jb2RlbWlycm9yLmpzCmluZGV4IDA0NjQ2YTkuLjlhMzljYzcgMTAwNjQ0Ci0tLSBhL2xpYi9jb2RlbWlycm9yLmpzCisrKyBiL2xpYi9jb2RlbWlycm9yLmpzCkBAIC0zOTksMTAgKzM5OSwxNiBAQCB2YXIgQ29kZU1pcnJvciA9IChmdW5jdGlvbigpIHsKICAgICB9CiAKICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7Ci0gICAgICB2YXIgc3RhcnQgPSBwb3NGcm9tTW91c2UoZSksIGxhc3QgPSBzdGFydDsgICAgCisgICAgICB2YXIgc3RhcnQgPSBwb3NGcm9tTW91c2UoZSksIGxhc3QgPSBzdGFydCwgdGFyZ2V0ID0gZS50YXJnZXQoKTsKICAgICAgIGlmICghc3RhcnQpIHJldHVybjsKICAgICAgIHNldEN1cnNvcihzdGFydC5saW5lLCBzdGFydC5jaCwgZmFsc2UpOwogICAgICAgaWYgKGUuYnV0dG9uKCkgIT0gMSkgcmV0dXJuOworICAgICAgaWYgKHRhcmdldC5wYXJlbnROb2RlID09IGd1dHRlcikgeyAgICAKKyAgICAgICAgaWYgKG9wdGlvbnMub25HdXR0ZXJDbGljaykKKyAgICAgICAgICBvcHRpb25zLm9uR3V0dGVyQ2xpY2soaW5kZXhPZihndXR0ZXIuY2hpbGROb2RlcywgdGFyZ2V0KSArIHNob3dpbmdGcm9tKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCiAgICAgICBpZiAoIWZvY3VzZWQpIG9uRm9jdXMoKTsKIAogICAgICAgZS5zdG9wKCk7CkBAIC04MDgsNyArODE0LDcgQEAgdmFyIENvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKSB7CiAgICAgICBmb3IgKHZhciBpID0gc2hvd2luZ0Zyb207IGkgPCBzaG93aW5nVG87ICsraSkgewogICAgICAgICB2YXIgbWFya2VyID0gbGluZXNbaV0uZ3V0dGVyTWFya2VyOwogICAgICAgICBpZiAobWFya2VyKSBodG1sLnB1c2goJzxkaXYgY2xhc3M9IicgKyBtYXJrZXIuc3R5bGUgKyAnIj4nICsgaHRtbEVzY2FwZShtYXJrZXIudGV4dCkgKyAnPC9kaXY+Jyk7Ci0gICAgICAgIGVsc2UgaHRtbC5wdXNoKCI8ZGl2PiIgKyAob3B0aW9ucy5saW5lTnVtYmVycyA/IGkgKyAxIDogIlx1MDBhMCIpICsgIjwvZGl2PiIpOworICAgICAgICBlbHNlIGh0bWwucHVzaCgiPGRpdj4iICsgKG9wdGlvbnMubGluZU51bWJlcnMgPyBpICsgb3B0aW9ucy5maXJzdExpbmVOdW1iZXIgOiAiXHUwMGEwIikgKyAiPC9kaXY+Iik7CiAgICAgICB9CiAgICAgICBndXR0ZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsgLy8gVE9ETyB0ZXN0IHdoZXRoZXIgdGhpcyBhY3R1YWxseSBoZWxwcwogICAgICAgZ3V0dGVyLmlubmVySFRNTCA9IGh0bWwuam9pbigiIik7CkBAIC0xMzcxLDEwICsxMzc3LDggQEAgdmFyIENvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgIGlmIChvcHRpb24gPT0gInBhcnNlciIpIHNldFBhcnNlcih2YWx1ZSk7CiAgICAgICAgIGVsc2UgaWYgKG9wdGlvbiA9PT0gImxpbmVOdW1iZXJzIikgc2V0TGluZU51bWJlcnModmFsdWUpOwogICAgICAgICBlbHNlIGlmIChvcHRpb24gPT09ICJndXR0ZXIiKSBzZXRHdXR0ZXIodmFsdWUpOwotICAgICAgICBlbHNlIGlmIChvcHRpb24gPT09ICJyZWFkT25seSIpIG9wdGlvbnMucmVhZE9ubHkgPSB2YWx1ZTsKLSAgICAgICAgZWxzZSBpZiAob3B0aW9uID09PSAiaW5kZW50VW5pdCIpIHtvcHRpb25zLmluZGVudFVuaXQgPSBpbmRlbnRVbml0ID0gdmFsdWU7IHNldFBhcnNlcihvcHRpb25zLnBhcnNlcik7fQotICAgICAgICBlbHNlIGlmICgvXig/OmVudGVyTW9kZXx0YWJNb2RlfGluZGVudFdpdGhUYWJzfHJlYWRPbmx5fGF1dG9NYXRjaEJyYWNrZXRzfHVuZG9EZXB0aCkkLy50ZXN0KG9wdGlvbikpIG9wdGlvbnNbb3B0aW9uXSA9IHZhbHVlOwotICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcigiQ2FuJ3Qgc2V0IG9wdGlvbiAiICsgb3B0aW9uKTsKKyAgICAgICAgZWxzZSBpZiAob3B0aW9uID09PSAiaW5kZW50VW5pdCIpIHtvcHRpb25zLmluZGVudFVuaXQgPSB2YWx1ZTsgc2V0UGFyc2VyKG9wdGlvbnMucGFyc2VyKTt9CisgICAgICAgIGVsc2Ugb3B0aW9uc1tvcHRpb25dID0gdmFsdWU7CiAgICAgICB9LAogICAgICAgY3Vyc29yQ29vcmRzOiBjdXJzb3JDb29yZHMsCiAgICAgICB1bmRvOiBvcGVyYXRpb24odW5kbyksCkBAIC0xNDAyLDcgKzE0MDYsOCBAQCB2YXIgQ29kZU1pcnJvciA9IChmdW5jdGlvbigpIHsKICAgICAgIHJlcGxhY2VSYW5nZTogb3BlcmF0aW9uKHJlcGxhY2VSYW5nZSksCiAKICAgICAgIG9wZXJhdGlvbjogZnVuY3Rpb24oZil7cmV0dXJuIG9wZXJhdGlvbihmKSgpO30sCi0gICAgICByZWZyZXNoOiBmdW5jdGlvbigpe3VwZGF0ZURpc3BsYXkoW3tmcm9tOiAwLCB0bzogbGluZXMubGVuZ3RofV0pO30KKyAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCl7dXBkYXRlRGlzcGxheShbe2Zyb206IDAsIHRvOiBsaW5lcy5sZW5ndGh9XSk7fSwKKyAgICAgIGdldElucHV0RmllbGQ6IGZ1bmN0aW9uKCl7cmV0dXJuIGlucHV0O30KICAgICB9OwogICAgIHJldHVybiBpbnN0YW5jZTsKICAgfQpAQCAtMTQyMCw2ICsxNDI1LDcgQEAgdmFyIENvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKSB7CiAgICAgcmVhZE9ubHk6IGZhbHNlLAogICAgIG9uQ2hhbmdlOiBudWxsLAogICAgIG9uQ3Vyc29yQWN0aXZpdHk6IG51bGwsCisgICAgb25HdXR0ZXJDbGljazogbnVsbCwKICAgICBhdXRvTWF0Y2hCcmFja2V0czogZmFsc2UsCiAgICAgd29ya1RpbWU6IDIwMCwKICAgICB3b3JrRGVsYXk6IDMwMCwKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1kaWZmPC9jb2RlPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/ecl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/ecl/ecl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJlY2wiLCBmdW5jdGlvbihjb25maWcpIHsKCiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICBmdW5jdGlvbiBtZXRhSG9vayhzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoIXN0YXRlLnN0YXJ0T2ZMaW5lKSByZXR1cm4gZmFsc2U7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICByZXR1cm4gIm1ldGEiOwogIH0KCiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKICB2YXIga2V5d29yZCA9IHdvcmRzKCJhYnMgYWNvcyBhbGxub2RlcyBhc2NpaSBhc2luIGFzc3RyaW5nIGF0YW4gYXRhbjIgYXZlIGNhc2UgY2hvb3NlIGNob29zZW4gY2hvb3Nlc2V0cyBjbHVzdGVyc2l6ZSBjb21iaW5lIGNvcnJlbGF0aW9uIGNvcyBjb3NoIGNvdW50IGNvdmFyaWFuY2UgY3JvbiBkYXRhc2V0IGRlZHVwIGRlZmluZSBkZW5vcm1hbGl6ZSBkaXN0cmlidXRlIGRpc3RyaWJ1dGVkIGRpc3RyaWJ1dGlvbiBlYmNkaWMgZW50aCBlcnJvciBldmFsdWF0ZSBldmVudCBldmVudGV4dHJhIGV2ZW50bmFtZSBleGlzdHMgZXhwIGZhaWxjb2RlIGZhaWxtZXNzYWdlIGZldGNoIGZyb211bmljb2RlIGdldGlzdmFsaWQgZ2xvYmFsIGdyYXBoIGdyb3VwIGhhc2ggaGFzaDMyIGhhc2g2NCBoYXNoY3JjIGhhc2htZDUgaGF2aW5nIGlmIGluZGV4IGludGZvcm1hdCBpc3ZhbGlkIGl0ZXJhdGUgam9pbiBrZXl1bmljb2RlIGxlbmd0aCBsaWJyYXJ5IGxpbWl0IGxuIGxvY2FsIGxvZyBsb29wIG1hcCBtYXRjaGVkIG1hdGNobGVuZ3RoIG1hdGNocG9zaXRpb24gbWF0Y2h0ZXh0IG1hdGNodW5pY29kZSBtYXggbWVyZ2UgbWVyZ2Vqb2luIG1pbiBub2xvY2FsIG5vbmVtcHR5IG5vcm1hbGl6ZSBwYXJzZSBwaXBlIHBvd2VyIHByZWxvYWQgcHJvY2VzcyBwcm9qZWN0IHB1bGwgcmFuZG9tIHJhbmdlIHJhbmsgcmFua2VkIHJlYWxmb3JtYXQgcmVjb3Jkb2YgcmVnZXhmaW5kIHJlZ2V4cmVwbGFjZSByZWdyb3VwIHJlamVjdGVkIHJvbGx1cCByb3VuZCByb3VuZHVwIHJvdyByb3dkaWZmIHNhbXBsZSBzZXQgc2luIHNpbmggc2l6ZW9mIHNvYXBjYWxsIHNvcnQgc29ydGVkIHNxcnQgc3RlcHBlZCBzdG9yZWQgc3VtIHRhYmxlIHRhbiB0YW5oIHRoaXNub2RlIHRvcG4gdG91bmljb2RlIHRyYW5zZmVyIHRyaW0gdHJ1bmNhdGUgdHlwZW9mIHVuZ3JvdXAgdW5pY29kZW9yZGVyIHZhcmlhbmNlIHdoaWNoIHdvcmt1bml0IHhtbGRlY29kZSB4bWxlbmNvZGUgeG1sdGV4dCB4bWx1bmljb2RlIik7CiAgdmFyIHZhcmlhYmxlID0gd29yZHMoImFwcGx5IGFzc2VydCBidWlsZCBidWlsZGluZGV4IGV2YWx1YXRlIGZhaWwga2V5ZGlmZiBrZXlwYXRjaCBsb2FkeG1sIG5vdGhvciBub3RpZnkgb3V0cHV0IHBhcmFsbGVsIHNlcXVlbnRpYWwgc29hcGNhbGwgd2FpdCIpOwogIHZhciB2YXJpYWJsZV8yID0gd29yZHMoIl9fY29tcHJlc3NlZF9fIGFsbCBhbmQgYW55IGFzIGF0bW9zdCBiZWZvcmUgYmVnaW5jKysgYmVzdCBiZXR3ZWVuIGNhc2UgY29uc3QgY291bnRlciBjc3YgZGVzY2VuZCBlbmNyeXB0IGVuZCBlbmRjKysgZW5kbWFjcm8gZXhjZXB0IGV4Y2x1c2l2ZSBleHBpcmUgZXhwb3J0IGV4dGVuZCBmYWxzZSBmZXcgZmlyc3QgZmxhdCBmcm9tIGZ1bGwgZnVuY3Rpb24gZ3JvdXAgaGVhZGVyIGhlYWRpbmcgaG9sZSBpZmJsb2NrIGltcG9ydCBpbiBpbnRlcmZhY2Ugam9pbmVkIGtlZXAga2V5ZWQgbGFzdCBsZWZ0IGxpbWl0IGxvYWQgbG9jYWwgbG9jYWxlIGxvb2t1cCBtYWNybyBtYW55IG1heGNvdW50IG1heGxlbmd0aCBtaW4gc2tldyBtb2R1bGUgbmFtZWQgbm9jYXNlIG5vcm9vdCBub3NjYW4gbm9zb3J0IG5vdCBvZiBvbmx5IG9wdCBvciBvdXRlciBvdmVyd3JpdGUgcGFja2VkIHBhcnRpdGlvbiBwZW5hbHR5IHBoeXNpY2FsbGVuZ3RoIHBpcGUgcXVvdGUgcmVjb3JkIHJlbGF0aW9uc2hpcCByZXBlYXQgcmV0dXJuIHJpZ2h0IHNjYW4gc2VsZiBzZXBhcmF0b3Igc2VydmljZSBzaGFyZWQgc2tldyBza2lwIHNxbCBzdG9yZSB0ZXJtaW5hdG9yIHRob3IgdGhyZXNob2xkIHRva2VuIHRyYW5zZm9ybSB0cmltIHRydWUgdHlwZSB1bmljb2Rlb3JkZXIgdW5zb3J0ZWQgdmFsaWRhdGUgdmlydHVhbCB3aG9sZSB3aWxkIHdpdGhpbiB4bWwgeHBhdGgiKTsKICB2YXIgdmFyaWFibGVfMyA9IHdvcmRzKCJhc2NpaSBiaWdfZW5kaWFuIGJvb2xlYW4gZGF0YSBkZWNpbWFsIGViY2RpYyBpbnRlZ2VyIHBhdHRlcm4gcXN0cmluZyByZWFsIHJlY29yZCBydWxlIHNldCBvZiBzdHJpbmcgdG9rZW4gdWRlY2ltYWwgdW5pY29kZSB1bnNpZ25lZCB2YXJzdHJpbmcgdmFydW5pY29kZSIpOwogIHZhciBidWlsdGluID0gd29yZHMoImNoZWNrcG9pbnQgZGVwcmVjYXRlZCBmYWlsY29kZSBmYWlsbWVzc2FnZSBmYWlsdXJlIGdsb2JhbCBpbmRlcGVuZGVudCBvbndhcm5pbmcgcGVyc2lzdCBwcmlvcml0eSByZWNvdmVyeSBzdG9yZWQgc3VjY2VzcyB3YWl0IHdoZW4iKTsKICB2YXIgYmxvY2tLZXl3b3JkcyA9IHdvcmRzKCJjYXRjaCBjbGFzcyBkbyBlbHNlIGZpbmFsbHkgZm9yIGlmIHN3aXRjaCB0cnkgd2hpbGUiKTsKICB2YXIgYXRvbXMgPSB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIik7CiAgdmFyIGhvb2tzID0geyIjIjogbWV0YUhvb2t9OwogIHZhciBtdWx0aUxpbmVTdHJpbmdzOwogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiYlPTw+IT98XC9dLzsKCiAgdmFyIGN1clB1bmM7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGhvb2tzW2NoXSkgewogICAgICB2YXIgcmVzdWx0ID0gaG9va3NbY2hdKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGlmIChjaCA9PSAnIicgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAoa2V5d29yZC5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZV8yLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZV8zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgfSBlbHNlIGlmIChidWlsdGluLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgfSBlbHNlIHsgLy9EYXRhIHR5cGVzIGFyZSBvZiBmcm9tIEtFWVdPUkQjIyAKCQl2YXIgaSA9IGN1ci5sZW5ndGggLSAxOwoJCXdoaWxlKGkgPj0gMCAmJiAoIWlzTmFOKGN1cltpXSkgfHwgY3VyW2ldID09ICdfJykpCgkJCS0taTsKCQkKCQlpZiAoaSA+IDApIHsKCQkJdmFyIGN1cjIgPSBjdXIuc3Vic3RyKDAsIGkgKyAxKTsKCSAgICAJaWYgKHZhcmlhYmxlXzMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyMikpIHsKCSAgICAgIAkJaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyMikpIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKCSAgICAgIAkJcmV0dXJuICJ2YXJpYWJsZS0zIjsKCSAgICAgIAl9CgkgICAgfQogICAgfQogICAgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiYXRvbSI7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgbXVsdGlMaW5lU3RyaW5ncykpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGFsaWduLCBwcmV2KSB7CiAgICB0aGlzLmluZGVudGVkID0gaW5kZW50ZWQ7CiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmFsaWduID0gYWxpZ247CiAgICB0aGlzLnByZXYgPSBwcmV2OwogIH0KICBmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSwgY29sLCB0eXBlKSB7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KHN0YXRlLmluZGVudGVkLCBjb2wsIHR5cGUsIG51bGwsIHN0YXRlLmNvbnRleHQpOwogIH0KICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7CiAgICB2YXIgdCA9IHN0YXRlLmNvbnRleHQudHlwZTsKICAgIGlmICh0ID09ICIpIiB8fCB0ID09ICJdIiB8fCB0ID09ICJ9IikKICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogbnVsbCwKICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dCgoYmFzZWNvbHVtbiB8fCAwKSAtIGluZGVudFVuaXQsIDAsICJ0b3AiLCBmYWxzZSksCiAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgc3RhcnRPZkxpbmU6IHRydWUKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIGN1clB1bmMgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlID09ICJjb21tZW50IiB8fCBzdHlsZSA9PSAibWV0YSIpIHJldHVybiBzdHlsZTsKICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSB0cnVlOwoKICAgICAgaWYgKChjdXJQdW5jID09ICI7IiB8fCBjdXJQdW5jID09ICI6IikgJiYgY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiKSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IikgewogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJ9IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3R4LnR5cGUgPT0gIn0iIHx8IGN0eC50eXBlID09ICJ0b3AiIHx8IChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSkKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAic3RhdGVtZW50Iik7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UgJiYgc3RhdGUudG9rZW5pemUgIT0gbnVsbCkgcmV0dXJuIDA7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0LCBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmIGZpcnN0Q2hhciA9PSAifSIpIGN0eCA9IGN0eC5wcmV2OwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSBjdHgudHlwZTsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSByZXR1cm4gY3R4LmluZGVudGVkICsgKGZpcnN0Q2hhciA9PSAieyIgPyAwIDogaW5kZW50VW5pdCk7CiAgICAgIGVsc2UgaWYgKGN0eC5hbGlnbikgcmV0dXJuIGN0eC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gY3R4LmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICJ7fSIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWVjbCIsICJlY2wiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/ecl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEVDTCBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iZWNsLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IEVDTCBtb2RlPC9oMT4KICAgIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci8qCnNhbXBsZSB1c2VsZXNzIGNvZGUgdG8gZGVtb25zdHJhdGUgZWNsIHN5bnRheCBoaWdobGlnaHRpbmcKdGhpcyBpcyBhIG11bHRpbGluZSBjb21tZW50IQoqLwoKLy8gIHRoaXMgaXMgYSBzaW5nbGVsaW5lIGNvbW1lbnQhCgppbXBvcnQgdXQ7CnIgOj0gCiAgcmVjb3JkCiAgIHN0cmluZzIyIHMxIDo9ICcxMjMnOwogICBpbnRlZ2VyNCBpMSA6PSAxMjM7CiAgZW5kOwojb3B0aW9uKCd0bXAnLCB0cnVlKTsKZCA6PSBkYXRhc2V0KCd0bXA6OnFiJywgciwgdGhvcik7Cm91dHB1dChkKTsKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+QmFzZWQgb24gQ29kZU1pcnJvcidzIGNsaWtlIG1vZGUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iaHR0cDovL2hwY2NzeXN0ZW1zLmNvbSI+SFBDQyBTeXN0ZW1zPC9hPiB3ZWIgc2l0ZS48L3A+CiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWVjbDwvY29kZT4uPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/erlang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/erlang/erlang.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gYmxvY2s7ICJiZWdpbiIsICJjYXNlIiwgImZ1biIsICJpZiIsICJyZWNlaXZlIiwgInRyeSI6IGNsb3NlZCBieSAiZW5kIgovLyBibG9jayBpbnRlcm5hbDsgImFmdGVyIiwgImNhdGNoIiwgIm9mIgovLyBndWFyZDsgIndoZW4iLCBjbG9zZWQgYnkgIi0+IgovLyAiLT4iIG9wZW5zIGEgY2xhdXNlLCBjbG9zZWQgYnkgIjsiIG9yICIuIgovLyAiPDwiIG9wZW5zIGEgYmluYXJ5LCBjbG9zZWQgYnkgIj4+IgovLyAiLCIgYXBwZWFycyBpbiBhcmdsaXN0cywgbGlzdHMsIHR1cGxlcyBhbmQgdGVybWluYXRlcyBsaW5lcyBvZiBjb2RlCi8vICIuIiByZXNldHMgaW5kZW50YXRpb24gdG8gMAovLyBvYnNvbGV0ZTsgImNvbmQiLCAibGV0IiwgInF1ZXJ5IgoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZXJsYW5nIiwgImVybGFuZyIpOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJlcmxhbmciLCBmdW5jdGlvbihjbUNmZykgewoKICBmdW5jdGlvbiBydmFsKHN0YXRlLHN0cmVhbSx0eXBlKSB7CiAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuICIuIiBhcyB0ZXJtaW5hdG9yIGFuZCByZWNvcmQgZmllbGQgb3BlcmF0b3IKICAgIGlmICh0eXBlID09ICJyZWNvcmQiKSB7CiAgICAgIHN0YXRlLmNvbnRleHQgPSAicmVjb3JkIjsKICAgIH1lbHNlewogICAgICBzdGF0ZS5jb250ZXh0ID0gZmFsc2U7CiAgICB9CgogICAgLy8gcmVtZW1iZXIgbGFzdCBzaWduaWZpY2FudCBiaXQgb24gbGFzdCBsaW5lIGZvciBpbmRlbnRpbmcKICAgIGlmICh0eXBlICE9ICJ3aGl0ZXNwYWNlIiAmJiB0eXBlICE9ICJjb21tZW50IikgewogICAgICBzdGF0ZS5sYXN0VG9rZW4gPSBzdHJlYW0uY3VycmVudCgpOwogICAgfQogICAgLy8gICAgIGVybGFuZyAgICAgICAgICAgICAtPiBDb2RlTWlycm9yIHRhZwogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgIGNhc2UgImF0b20iOiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgY2FzZSAiYXR0cmlidXRlIjogICByZXR1cm4gImF0dHJpYnV0ZSI7CiAgICAgIGNhc2UgImJ1aWx0aW4iOiAgICAgcmV0dXJuICJidWlsdGluIjsKICAgICAgY2FzZSAiY29tbWVudCI6ICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICBjYXNlICJmdW4iOiAgICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgIGNhc2UgImZ1bmN0aW9uIjogICAgcmV0dXJuICJ0YWciOwogICAgICBjYXNlICJndWFyZCI6ICAgICAgIHJldHVybiAicHJvcGVydHkiOwogICAgICBjYXNlICJrZXl3b3JkIjogICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIGNhc2UgIm1hY3JvIjogICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgY2FzZSAibnVtYmVyIjogICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgIGNhc2UgIm9wZXJhdG9yIjogICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgIGNhc2UgInJlY29yZCI6ICAgICAgcmV0dXJuICJicmFja2V0IjsKICAgICAgY2FzZSAic3RyaW5nIjogICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIGNhc2UgInR5cGUiOiAgICAgICAgcmV0dXJuICJkZWYiOwogICAgICBjYXNlICJ2YXJpYWJsZSI6ICAgIHJldHVybiAidmFyaWFibGUiOwogICAgICBjYXNlICJlcnJvciI6ICAgICAgIHJldHVybiAiZXJyb3IiOwogICAgICBjYXNlICJzZXBhcmF0b3IiOiAgIHJldHVybiBudWxsOwogICAgICBjYXNlICJvcGVuX3BhcmVuIjogIHJldHVybiBudWxsOwogICAgICBjYXNlICJjbG9zZV9wYXJlbiI6IHJldHVybiBudWxsOwogICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgdmFyIHR5cGVXb3JkcyA9IFsKICAgICItdHlwZSIsICItc3BlYyIsICItZXhwb3J0X3R5cGUiLCAiLW9wYXF1ZSJdOwoKICB2YXIga2V5d29yZFdvcmRzID0gWwogICAgImFmdGVyIiwiYmVnaW4iLCJjYXRjaCIsImNhc2UiLCJjb25kIiwiZW5kIiwiZnVuIiwiaWYiLAogICAgImxldCIsIm9mIiwicXVlcnkiLCJyZWNlaXZlIiwidHJ5Iiwid2hlbiJdOwoKICB2YXIgc2VwYXJhdG9yV29yZHMgPSBbCiAgICAiLT4iLCI7IiwiOiIsIi4iLCIsIl07CgogIHZhciBvcGVyYXRvcldvcmRzID0gWwogICAgImFuZCIsImFuZGFsc28iLCJiYW5kIiwiYm5vdCIsImJvciIsImJzbCIsImJzciIsImJ4b3IiLAogICAgImRpdiIsIm5vdCIsIm9yIiwib3JlbHNlIiwicmVtIiwieG9yIl07CgogIHZhciBzeW1ib2xXb3JkcyA9IFsKICAgICIrIiwiLSIsIioiLCIvIiwiPiIsIj49IiwiPCIsIj08IiwiPTo9IiwiPT0iLCI9Lz0iLCIvPSIsInx8IiwiPC0iXTsKCiAgdmFyIG9wZW5QYXJlbldvcmRzID0gWwogICAgIjw8IiwiKCIsIlsiLCJ7Il07CgogIHZhciBjbG9zZVBhcmVuV29yZHMgPSBbCiAgICAifSIsIl0iLCIpIiwiPj4iXTsKCiAgdmFyIGd1YXJkV29yZHMgPSBbCiAgICAiaXNfYXRvbSIsImlzX2JpbmFyeSIsImlzX2JpdHN0cmluZyIsImlzX2Jvb2xlYW4iLCJpc19mbG9hdCIsCiAgICAiaXNfZnVuY3Rpb24iLCJpc19pbnRlZ2VyIiwiaXNfbGlzdCIsImlzX251bWJlciIsImlzX3BpZCIsCiAgICAiaXNfcG9ydCIsImlzX3JlY29yZCIsImlzX3JlZmVyZW5jZSIsImlzX3R1cGxlIiwKICAgICJhdG9tIiwiYmluYXJ5IiwiYml0c3RyaW5nIiwiYm9vbGVhbiIsImZ1bmN0aW9uIiwiaW50ZWdlciIsImxpc3QiLAogICAgIm51bWJlciIsInBpZCIsInBvcnQiLCJyZWNvcmQiLCJyZWZlcmVuY2UiLCJ0dXBsZSJdOwoKICB2YXIgYmlmV29yZHMgPSBbCiAgICAiYWJzIiwiYWRsZXIzMiIsImFkbGVyMzJfY29tYmluZSIsImFsaXZlIiwiYXBwbHkiLCJhdG9tX3RvX2JpbmFyeSIsCiAgICAiYXRvbV90b19saXN0IiwiYmluYXJ5X3RvX2F0b20iLCJiaW5hcnlfdG9fZXhpc3RpbmdfYXRvbSIsCiAgICAiYmluYXJ5X3RvX2xpc3QiLCJiaW5hcnlfdG9fdGVybSIsImJpdF9zaXplIiwiYml0c3RyaW5nX3RvX2xpc3QiLAogICAgImJ5dGVfc2l6ZSIsImNoZWNrX3Byb2Nlc3NfY29kZSIsImNvbnRhY3RfYmluYXJ5IiwiY3JjMzIiLAogICAgImNyYzMyX2NvbWJpbmUiLCJkYXRlIiwiZGVjb2RlX3BhY2tldCIsImRlbGV0ZV9tb2R1bGUiLAogICAgImRpc2Nvbm5lY3Rfbm9kZSIsImVsZW1lbnQiLCJlcmFzZSIsImV4aXQiLCJmbG9hdCIsImZsb2F0X3RvX2xpc3QiLAogICAgImdhcmJhZ2VfY29sbGVjdCIsImdldCIsImdldF9rZXlzIiwiZ3JvdXBfbGVhZGVyIiwiaGFsdCIsImhkIiwKICAgICJpbnRlZ2VyX3RvX2xpc3QiLCJpbnRlcm5hbF9iaWYiLCJpb2xpc3Rfc2l6ZSIsImlvbGlzdF90b19iaW5hcnkiLAogICAgImlzX2FsaXZlIiwiaXNfYXRvbSIsImlzX2JpbmFyeSIsImlzX2JpdHN0cmluZyIsImlzX2Jvb2xlYW4iLAogICAgImlzX2Zsb2F0IiwiaXNfZnVuY3Rpb24iLCJpc19pbnRlZ2VyIiwiaXNfbGlzdCIsImlzX251bWJlciIsImlzX3BpZCIsCiAgICAiaXNfcG9ydCIsImlzX3Byb2Nlc3NfYWxpdmUiLCJpc19yZWNvcmQiLCJpc19yZWZlcmVuY2UiLCJpc190dXBsZSIsCiAgICAibGVuZ3RoIiwibGluayIsImxpc3RfdG9fYXRvbSIsImxpc3RfdG9fYmluYXJ5IiwibGlzdF90b19iaXRzdHJpbmciLAogICAgImxpc3RfdG9fZXhpc3RpbmdfYXRvbSIsImxpc3RfdG9fZmxvYXQiLCJsaXN0X3RvX2ludGVnZXIiLAogICAgImxpc3RfdG9fcGlkIiwibGlzdF90b190dXBsZSIsImxvYWRfbW9kdWxlIiwibWFrZV9yZWYiLCJtb2R1bGVfbG9hZGVkIiwKICAgICJtb25pdG9yX25vZGUiLCJub2RlIiwibm9kZV9saW5rIiwibm9kZV91bmxpbmsiLCJub2RlcyIsIm5vdGFsaXZlIiwKICAgICJub3ciLCJvcGVuX3BvcnQiLCJwaWRfdG9fbGlzdCIsInBvcnRfY2xvc2UiLCJwb3J0X2NvbW1hbmQiLAogICAgInBvcnRfY29ubmVjdCIsInBvcnRfY29udHJvbCIsInByZV9sb2FkZWQiLCJwcm9jZXNzX2ZsYWciLAogICAgInByb2Nlc3NfaW5mbyIsInByb2Nlc3NlcyIsInB1cmdlX21vZHVsZSIsInB1dCIsInJlZ2lzdGVyIiwKICAgICJyZWdpc3RlcmVkIiwicm91bmQiLCJzZWxmIiwic2V0ZWxlbWVudCIsInNpemUiLCJzcGF3biIsInNwYXduX2xpbmsiLAogICAgInNwYXduX21vbml0b3IiLCJzcGF3bl9vcHQiLCJzcGxpdF9iaW5hcnkiLCJzdGF0aXN0aWNzIiwKICAgICJ0ZXJtX3RvX2JpbmFyeSIsInRpbWUiLCJ0aHJvdyIsInRsIiwidHJ1bmMiLCJ0dXBsZV9zaXplIiwKICAgICJ0dXBsZV90b19saXN0IiwidW5saW5rIiwidW5yZWdpc3RlciIsIndoZXJlaXMiXTsKCiAgLy8gaWdub3JlZCBmb3IgaW5kZW50aW5nIHB1cnBvc2VzCiAgdmFyIGlnbm9yZVdvcmRzID0gWwogICAgIiwiLCAiOiIsICJjYXRjaCIsICJhZnRlciIsICJvZiIsICJjb25kIiwgImxldCIsICJxdWVyeSJdOwoKCiAgdmFyIHNtYWxsUkUgICAgICA9IC9bYS16X10vOwogIHZhciBsYXJnZVJFICAgICAgPSAvW0EtWl9dLzsKICB2YXIgZGlnaXRSRSAgICAgID0gL1swLTldLzsKICB2YXIgb2N0aXRSRSAgICAgID0gL1swLTddLzsKICB2YXIgYW51bVJFICAgICAgID0gL1thLXpfQS1aMC05XS87CiAgdmFyIHN5bWJvbFJFICAgICA9IC9bXCtcLVwqXC88Pj1cfDpdLzsKICB2YXIgb3BlblBhcmVuUkUgID0gL1s8XChcW1x7XS87CiAgdmFyIGNsb3NlUGFyZW5SRSA9IC9bPlwpXF1cfV0vOwogIHZhciBzZXBSRSAgICAgICAgPSAvW1wtPlwuLDo7XS87CgogIGZ1bmN0aW9uIGlzTWVtYmVyKGVsZW1lbnQsbGlzdCkgewogICAgcmV0dXJuICgtMSA8IGxpc3QuaW5kZXhPZihlbGVtZW50KSk7CiAgfQoKICBmdW5jdGlvbiBpc1ByZXYoc3RyZWFtLHN0cmluZykgewogICAgdmFyIHN0YXJ0ID0gc3RyZWFtLnN0YXJ0OwogICAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGg7CiAgICBpZiAobGVuIDw9IHN0YXJ0KSB7CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLnN0cmluZy5zbGljZShzdGFydC1sZW4sc3RhcnQpOwogICAgICByZXR1cm4gd29yZCA9PSBzdHJpbmc7CiAgICB9ZWxzZXsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwid2hpdGVzcGFjZSIpOwogICAgfQoKICAgIC8vIGF0dHJpYnV0ZXMgYW5kIHR5cGUgc3BlY3MKICAgIGlmICgocGVla1Rva2VuKHN0YXRlKS50b2tlbiA9PSAiIiB8fCBwZWVrVG9rZW4oc3RhdGUpLnRva2VuID09ICIuIikgJiYKICAgICAgICBzdHJlYW0ucGVlaygpID09ICctJykgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoc3RyZWFtLmVhdChzbWFsbFJFKSAmJiBzdHJlYW0uZWF0V2hpbGUoYW51bVJFKSkgewogICAgICAgIGlmIChpc01lbWJlcihzdHJlYW0uY3VycmVudCgpLHR5cGVXb3JkcykpIHsKICAgICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwidHlwZSIpOwogICAgICAgIH1lbHNlewogICAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJhdHRyaWJ1dGUiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgIH0KCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIC8vIGNvbW1lbnQKICAgIGlmIChjaCA9PSAnJScpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImNvbW1lbnQiKTsKICAgIH0KCiAgICAvLyBtYWNybwogICAgaWYgKGNoID09ICc/JykgewogICAgICBzdHJlYW0uZWF0V2hpbGUoYW51bVJFKTsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJtYWNybyIpOwogICAgfQoKICAgIC8vIHJlY29yZAogICAgaWYgKCBjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGFudW1SRSk7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwicmVjb3JkIik7CiAgICB9CgogICAgLy8gY2hhcgogICAgaWYgKCBjaCA9PSAiJCIpIHsKICAgICAgaWYgKHN0cmVhbS5uZXh0KCkgPT0gIlxcIikgewogICAgICAgIGlmICghc3RyZWFtLmVhdFdoaWxlKG9jdGl0UkUpKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sInN0cmluZyIpOwogICAgfQoKICAgIC8vIHF1b3RlZCBhdG9tCiAgICBpZiAoY2ggPT0gJ1wnJykgewogICAgICBpZiAoc2luZ2xlUXVvdGUoc3RyZWFtKSkgewogICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiYXRvbSIpOwogICAgICB9ZWxzZXsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImVycm9yIik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBzdHJpbmcKICAgIGlmIChjaCA9PSAnIicpIHsKICAgICAgaWYgKGRvdWJsZVF1b3RlKHN0cmVhbSkpIHsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sInN0cmluZyIpOwogICAgICB9ZWxzZXsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImVycm9yIik7CiAgICAgIH0KICAgIH0KCiAgICAvLyB2YXJpYWJsZQogICAgaWYgKGxhcmdlUkUudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGFudW1SRSk7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwidmFyaWFibGUiKTsKICAgIH0KCiAgICAvLyBhdG9tL2tleXdvcmQvQklGL2Z1bmN0aW9uCiAgICBpZiAoc21hbGxSRS50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoYW51bVJFKTsKCiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICIvIikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgaWYgKHN0cmVhbS5lYXRXaGlsZShkaWdpdFJFKSkgewogICAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJmdW4iKTsgICAgICAvLyBmLzAgc3R5bGUgZnVuCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJhdG9tIik7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgdyA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgICBpZiAoaXNNZW1iZXIodyxrZXl3b3JkV29yZHMpKSB7CiAgICAgICAgcHVzaFRva2VuKHN0YXRlLHN0cmVhbSk7CiAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJrZXl3b3JkIik7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIigiKSB7CiAgICAgICAgLy8gJ3B1dCcgYW5kICdlcmxhbmc6cHV0JyBhcmUgYmlmcywgJ2ZvbzpwdXQnIGlzIG5vdAogICAgICAgIGlmIChpc01lbWJlcih3LGJpZldvcmRzKSAmJgogICAgICAgICAgICAoIWlzUHJldihzdHJlYW0sIjoiKSB8fCBpc1ByZXYoc3RyZWFtLCJlcmxhbmc6IikpKSB7CiAgICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImJ1aWx0aW4iKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiZnVuY3Rpb24iKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzTWVtYmVyKHcsZ3VhcmRXb3JkcykpIHsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImd1YXJkIik7CiAgICAgIH0KICAgICAgaWYgKGlzTWVtYmVyKHcsb3BlcmF0b3JXb3JkcykpIHsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sIm9wZXJhdG9yIik7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIjoiKSB7CiAgICAgICAgaWYgKHcgPT0gImVybGFuZyIpIHsKICAgICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiYnVpbHRpbiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImZ1bmN0aW9uIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiYXRvbSIpOyAgICAgICAgICAgICAgIAogICAgfQoKICAgIC8vIG51bWJlcgogICAgaWYgKGRpZ2l0UkUudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGRpZ2l0UkUpOwogICAgICBpZiAoc3RyZWFtLmVhdCgnIycpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGRpZ2l0UkUpOyAgICAvLyAxNiMxMCAgc3R5bGUgaW50ZWdlcgogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCcuJykpIHsgICAgICAgLy8gZmxvYXQKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShkaWdpdFJFKTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoL1tlRV0vKSkgewogICAgICAgICAgc3RyZWFtLmVhdCgvWy0rXS8pOyAgICAgICAgLy8gZmxvYXQgd2l0aCBleHBvbmVudAogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGRpZ2l0UkUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sIm51bWJlciIpOyAgIC8vIG5vcm1hbCBpbnRlZ2VyCiAgICB9CgogICAgLy8gb3BlbiBwYXJlbnMKICAgIGlmIChub25ncmVlZHkoc3RyZWFtLG9wZW5QYXJlblJFLG9wZW5QYXJlbldvcmRzKSkgewogICAgICBwdXNoVG9rZW4oc3RhdGUsc3RyZWFtKTsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJvcGVuX3BhcmVuIik7CiAgICB9CgogICAgLy8gY2xvc2UgcGFyZW5zCiAgICBpZiAobm9uZ3JlZWR5KHN0cmVhbSxjbG9zZVBhcmVuUkUsY2xvc2VQYXJlbldvcmRzKSkgewogICAgICBwdXNoVG9rZW4oc3RhdGUsc3RyZWFtKTsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJjbG9zZV9wYXJlbiIpOwogICAgfQoKICAgIC8vIHNlcGFyYXRvcnMKICAgIGlmIChncmVlZHkoc3RyZWFtLHNlcFJFLHNlcGFyYXRvcldvcmRzKSkgewogICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuICIuIiBhcyB0ZXJtaW5hdG9yIGFuZCByZWNvcmQgZmllbGQgb3BlcmF0b3IKICAgICAgaWYgKHN0YXRlLmNvbnRleHQgPT0gZmFsc2UpIHsKICAgICAgICBwdXNoVG9rZW4oc3RhdGUsc3RyZWFtKTsKICAgICAgfQogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sInNlcGFyYXRvciIpOwogICAgfQoKICAgIC8vIG9wZXJhdG9ycwogICAgaWYgKGdyZWVkeShzdHJlYW0sc3ltYm9sUkUsc3ltYm9sV29yZHMpKSB7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwib3BlcmF0b3IiKTsKICAgIH0KCiAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sbnVsbCk7CiAgfQoKICBmdW5jdGlvbiBub25ncmVlZHkoc3RyZWFtLHJlLHdvcmRzKSB7CiAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGggPT0gMSAmJiByZS50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIHdoaWxlIChyZS50ZXN0KHN0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBpZiAoaXNNZW1iZXIoc3RyZWFtLmN1cnJlbnQoKSx3b3JkcykpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBzdHJlYW0uYmFja1VwKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoLTEpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZ3JlZWR5KHN0cmVhbSxyZSx3b3JkcykgewogICAgaWYgKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoID09IDEgJiYgcmUudGVzdChzdHJlYW0uY3VycmVudCgpKSkgewogICAgICB3aGlsZSAocmUudGVzdChzdHJlYW0ucGVlaygpKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgd2hpbGUgKDAgPCBzdHJlYW0uY3VycmVudCgpLmxlbmd0aCkgewogICAgICAgIGlmIChpc01lbWJlcihzdHJlYW0uY3VycmVudCgpLHdvcmRzKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgIH0KICAgICAgfQogICAgICBzdHJlYW0ubmV4dCgpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZG91YmxlUXVvdGUoc3RyZWFtKSB7CiAgICByZXR1cm4gcXVvdGUoc3RyZWFtLCAnIicsICdcXCcpOwogIH0KCiAgZnVuY3Rpb24gc2luZ2xlUXVvdGUoc3RyZWFtKSB7CiAgICByZXR1cm4gcXVvdGUoc3RyZWFtLCdcJycsJ1xcJyk7CiAgfQoKICBmdW5jdGlvbiBxdW90ZShzdHJlYW0scXVvdGVDaGFyLGVzY2FwZUNoYXIpIHsKICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSBxdW90ZUNoYXIpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfWVsc2UgaWYgKGNoID09IGVzY2FwZUNoYXIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBUb2tlbihzdHJlYW0pIHsKICAgIHRoaXMudG9rZW4gID0gc3RyZWFtID8gc3RyZWFtLmN1cnJlbnQoKSA6ICIiOwogICAgdGhpcy5jb2x1bW4gPSBzdHJlYW0gPyBzdHJlYW0uY29sdW1uKCkgOiAwOwogICAgdGhpcy5pbmRlbnQgPSBzdHJlYW0gPyBzdHJlYW0uaW5kZW50YXRpb24oKSA6IDA7CiAgfQoKICBmdW5jdGlvbiBteUluZGVudChzdGF0ZSx0ZXh0QWZ0ZXIpIHsKICAgIHZhciBpbmRlbnQgPSBjbUNmZy5pbmRlbnRVbml0OwogICAgdmFyIG91dGRlbnRXb3JkcyA9IFsiYWZ0ZXIiLCJjYXRjaCJdOwogICAgdmFyIHRva2VuID0gKHBlZWtUb2tlbihzdGF0ZSkpLnRva2VuOwogICAgdmFyIHdvcmRBZnRlciA9IHRha2V3aGlsZSh0ZXh0QWZ0ZXIsL1teYS16XS8pOwoKICAgIGlmIChpc01lbWJlcih0b2tlbixvcGVuUGFyZW5Xb3JkcykpIHsKICAgICAgcmV0dXJuIChwZWVrVG9rZW4oc3RhdGUpKS5jb2x1bW4rdG9rZW4ubGVuZ3RoOwogICAgfWVsc2UgaWYgKHRva2VuID09ICIuIiB8fCB0b2tlbiA9PSAiIil7CiAgICAgIHJldHVybiAwOwogICAgfWVsc2UgaWYgKHRva2VuID09ICItPiIpIHsKICAgICAgaWYgKHdvcmRBZnRlciA9PSAiZW5kIikgewogICAgICAgIHJldHVybiBwZWVrVG9rZW4oc3RhdGUsMikuY29sdW1uOwogICAgICB9ZWxzZSBpZiAocGVla1Rva2VuKHN0YXRlLDIpLnRva2VuID09ICJmdW4iKSB7CiAgICAgICAgcmV0dXJuIHBlZWtUb2tlbihzdGF0ZSwyKS5jb2x1bW4raW5kZW50OwogICAgICB9ZWxzZXsKICAgICAgICByZXR1cm4gKHBlZWtUb2tlbihzdGF0ZSkpLmluZGVudCtpbmRlbnQ7CiAgICAgIH0KICAgIH1lbHNlIGlmIChpc01lbWJlcih3b3JkQWZ0ZXIsb3V0ZGVudFdvcmRzKSkgewogICAgICByZXR1cm4gKHBlZWtUb2tlbihzdGF0ZSkpLmluZGVudDsKICAgIH1lbHNlewogICAgICByZXR1cm4gKHBlZWtUb2tlbihzdGF0ZSkpLmNvbHVtbitpbmRlbnQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0YWtld2hpbGUoc3RyLHJlKSB7CiAgICB2YXIgbSA9IHN0ci5tYXRjaChyZSk7CiAgICByZXR1cm4gbSA/IHN0ci5zbGljZSgwLG0uaW5kZXgpIDogc3RyOwogIH0KCiAgZnVuY3Rpb24gcG9wVG9rZW4oc3RhdGUpIHsKICAgIHJldHVybiBzdGF0ZS50b2tlblN0YWNrLnBvcCgpOwogIH0KCiAgZnVuY3Rpb24gcGVla1Rva2VuKHN0YXRlLGRlcHRoKSB7CiAgICB2YXIgbGVuID0gc3RhdGUudG9rZW5TdGFjay5sZW5ndGg7CiAgICB2YXIgZGVwID0gKGRlcHRoID8gZGVwdGggOiAxKTsKICAgIGlmIChsZW4gPCBkZXApIHsKICAgICAgcmV0dXJuIG5ldyBUb2tlbjsKICAgIH1lbHNlewogICAgICByZXR1cm4gc3RhdGUudG9rZW5TdGFja1tsZW4tZGVwXTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHB1c2hUb2tlbihzdGF0ZSxzdHJlYW0pIHsKICAgIHZhciB0b2tlbiA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICB2YXIgcHJldl90b2tlbiA9IHBlZWtUb2tlbihzdGF0ZSkudG9rZW47CiAgICBpZiAoaXNNZW1iZXIodG9rZW4saWdub3JlV29yZHMpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH1lbHNlIGlmIChkcm9wX2JvdGgocHJldl90b2tlbix0b2tlbikpIHsKICAgICAgcG9wVG9rZW4oc3RhdGUpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9ZWxzZSBpZiAoZHJvcF9maXJzdChwcmV2X3Rva2VuLHRva2VuKSkgewogICAgICBwb3BUb2tlbihzdGF0ZSk7CiAgICAgIHJldHVybiBwdXNoVG9rZW4oc3RhdGUsc3RyZWFtKTsKICAgIH1lbHNlewogICAgICBzdGF0ZS50b2tlblN0YWNrLnB1c2gobmV3IFRva2VuKHN0cmVhbSkpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGRyb3BfZmlyc3Qob3BlbiwgY2xvc2UpIHsKICAgIHN3aXRjaCAob3BlbisiICIrY2xvc2UpIHsKICAgICAgY2FzZSAid2hlbiAtPiI6ICAgICAgIHJldHVybiB0cnVlOwogICAgICBjYXNlICItPiBlbmQiOiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgIi0+IC4iOiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgY2FzZSAiLiAuIjogICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZHJvcF9ib3RoKG9wZW4sIGNsb3NlKSB7CiAgICBzd2l0Y2ggKG9wZW4rIiAiK2Nsb3NlKSB7CiAgICAgIGNhc2UgIiggKSI6ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgIlsgXSI6ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgInsgfSI6ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgIjw8ID4+IjogICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgImJlZ2luIGVuZCI6ICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgImNhc2UgZW5kIjogICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgImZ1biBlbmQiOiAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgImlmIGVuZCI6ICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgInJlY2VpdmUgZW5kIjogcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgInRyeSBlbmQiOiAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgIi0+IDsiOiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6CiAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7dG9rZW5TdGFjazogW10sCiAgICAgICAgICAgICAgICBjb250ZXh0OiBmYWxzZSwKICAgICAgICAgICAgICAgIGxhc3RUb2tlbjogbnVsbH07CiAgICAgIH0sCgogICAgdG9rZW46CiAgICAgIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICByZXR1cm4gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0sCgogICAgaW5kZW50OgogICAgICBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7Ci8vICAgICAgICBjb25zb2xlLmxvZyhzdGF0ZS50b2tlblN0YWNrKTsKICAgICAgICByZXR1cm4gbXlJbmRlbnQoc3RhdGUsdGV4dEFmdGVyKTsKICAgICAgfQogIH07Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/erlang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEVybGFuZyBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iZXJsYW5nLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvZXJsYW5nLWRhcmsuY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBFcmxhbmcgbW9kZTwvaDE+Cgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgolJSAtKi0gbW9kZTogZXJsYW5nOyBlcmxhbmctaW5kZW50LWxldmVsOiAyIC0qLQolJSUgQ3JlYXRlZCA6ICA3IE1heSAyMDEyIGJ5IG1hdHMgY3JvbnF2aXN0IDxtYXNzZUBrbGFybmEuY29tPgoKJSUgQGRvYwolJSBEZW1vbnN0cmF0ZXMgaG93IHRvIHByaW50IGEgcmVjb3JkLgolJSBAZW5kCgotbW9kdWxlKCdleCcpLgotYXV0aG9yKCdtYXRzIGNyb25xdmlzdCcpLgotZXhwb3J0KFtkZW1vLzAsCiAgICAgICAgIHJlY19pbmZvLzFdKS4KCi1yZWNvcmQoZGVtbyx7YT0iT25lIixiPSJUd28iLGM9IlRocmVlIixkPSJGb3VyIn0pLgoKcmVjX2luZm8oZGVtbykgLT4gcmVjb3JkX2luZm8oZmllbGRzLGRlbW8pLgoKZGVtbygpIC0+IGV4cGFuZF9yZWNzKD9NT0RVTEUsI2RlbW97YT0iQSIsYj0iQkIifSkuCiAgCmV4cGFuZF9yZWNzKE0sTGlzdCkgd2hlbiBpc19saXN0KExpc3QpIC0+CiAgW2V4cGFuZF9yZWNzKE0sTCl8fEw8LUxpc3RdOwpleHBhbmRfcmVjcyhNLFR1cCkgd2hlbiBpc190dXBsZShUdXApIC0+CiAgY2FzZSB0dXBsZV9zaXplKFR1cCkgb2YKICAgIEwgd2hlbiBMIDwgMSAtPiBUdXA7CiAgICBMIC0+CiAgICAgIHRyeSBGaWVsZHMgPSBNOnJlY19pbmZvKGVsZW1lbnQoMSxUdXApKSwKICAgICAgICAgIEwgPSBsZW5ndGgoRmllbGRzKSsxLAogICAgICAgICAgbGlzdHM6emlwKEZpZWxkcyxleHBhbmRfcmVjcyhNLHRsKHR1cGxlX3RvX2xpc3QoVHVwKSkpKQogICAgICBjYXRjaCBfOl8gLT4KICAgICAgICAgIGxpc3RfdG9fdHVwbGUoZXhwYW5kX3JlY3MoTSx0dXBsZV90b19saXN0KFR1cCkpKQogICAgICBlbmQKICBlbmQ7CmV4cGFuZF9yZWNzKF8sVGVybSkgLT4KICBUZXJtLgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgZXh0cmFLZXlzOiB7IlRhYiI6ICAiaW5kZW50QXV0byJ9LAogICAgICAgIHRoZW1lOiAiZXJsYW5nLWRhcmsiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1lcmxhbmc8L2NvZGU+LjwvcD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/gfm/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/gfm/gfm.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJnZm0iLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgY29kZURlcHRoID0gMDsKICBmdW5jdGlvbiBibGFua0xpbmUoc3RhdGUpIHsKICAgIHN0YXRlLmNvZGUgPSBmYWxzZTsKICAgIHJldHVybiBudWxsOwogIH0KICB2YXIgZ2ZtT3ZlcmxheSA9IHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIGNvZGU6IGZhbHNlLAogICAgICAgIGNvZGVCbG9jazogZmFsc2UsCiAgICAgICAgYXRlU3BhY2U6IGZhbHNlCiAgICAgIH07CiAgICB9LAogICAgY29weVN0YXRlOiBmdW5jdGlvbihzKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgY29kZTogcy5jb2RlLAogICAgICAgIGNvZGVCbG9jazogcy5jb2RlQmxvY2ssCiAgICAgICAgYXRlU3BhY2U6IHMuYXRlU3BhY2UKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAvLyBIYWNrIHRvIHByZXZlbnQgZm9ybWF0dGluZyBvdmVycmlkZSBpbnNpZGUgY29kZSBibG9ja3MgKGJsb2NrIGFuZCBpbmxpbmUpCiAgICAgIGlmIChzdGF0ZS5jb2RlQmxvY2spIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eYGBgLykpIHsKICAgICAgICAgIHN0YXRlLmNvZGVCbG9jayA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgc3RhdGUuY29kZSA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKC9eYGBgLykpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgc3RhdGUuY29kZUJsb2NrID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAvLyBJZiB0aGlzIGJsb2NrIGlzIGNoYW5nZWQsIGl0IG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQgaW4gTWFya2Rvd24gbW9kZQogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ2AnKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICB2YXIgYmVmb3JlID0gc3RyZWFtLnBvczsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoJ2AnKTsKICAgICAgICB2YXIgZGlmZmVyZW5jZSA9IDEgKyBzdHJlYW0ucG9zIC0gYmVmb3JlOwogICAgICAgIGlmICghc3RhdGUuY29kZSkgewogICAgICAgICAgY29kZURlcHRoID0gZGlmZmVyZW5jZTsKICAgICAgICAgIHN0YXRlLmNvZGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoZGlmZmVyZW5jZSA9PT0gY29kZURlcHRoKSB7IC8vIE11c3QgYmUgZXhhY3QKICAgICAgICAgICAgc3RhdGUuY29kZSA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5jb2RlKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAvLyBDaGVjayBpZiBzcGFjZS4gSWYgc28sIGxpbmtzIGNhbiBiZSBmb3JtYXR0ZWQgbGF0ZXIgb24KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgc3RhdGUuYXRlU3BhY2UgPSB0cnVlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uc29sKCkgfHwgc3RhdGUuYXRlU3BhY2UpIHsKICAgICAgICBzdGF0ZS5hdGVTcGFjZSA9IGZhbHNlOwogICAgICAgIGlmKHN0cmVhbS5tYXRjaCgvXig/OlthLXpBLVowLTlcLV9dK1wvKT8oPzpbYS16QS1aMC05XC1fXStAKT8oPzpbYS1mMC05XXs3LDQwfVxiKS8pKSB7CiAgICAgICAgICAvLyBVc2VyL1Byb2plY3RAU0hBCiAgICAgICAgICAvLyBVc2VyQFNIQQogICAgICAgICAgLy8gU0hBCiAgICAgICAgICByZXR1cm4gImxpbmsiOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eKD86W2EtekEtWjAtOVwtX10rXC8pPyg/OlthLXpBLVowLTlcLV9dKyk/I1swLTldK1xiLykpIHsKICAgICAgICAgIC8vIFVzZXIvUHJvamVjdCNOdW0KICAgICAgICAgIC8vIFVzZXIjTnVtCiAgICAgICAgICAvLyAjTnVtCiAgICAgICAgICByZXR1cm4gImxpbmsiOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKCg/OlthLXpdW1x3LV0rOig/OlwvezEsM318W2EtejAtOSVdKXx3d3dcZHswLDN9Wy5dfFthLXowLTkuXC1dK1suXVthLXpdezIsNH1cLykoPzpbXlxzKCk8Pl0rfFwoKFteXHMoKTw+XSt8KFwoW15ccygpPD5dK1wpKSkqXCkpKyg/OlwoKFteXHMoKTw+XSt8KFwoW15ccygpPD5dK1wpKSkqXCl8W15cc2AhKClcW1xde307OiciLiw8Pj/Cq8K74oCc4oCd4oCY4oCZXSkpL2kpKSB7CiAgICAgICAgLy8gVVJMcwogICAgICAgIC8vIFRha2VuIGZyb20gaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC8yMDEwLzA3L2ltcHJvdmVkX3JlZ2V4X2Zvcl9tYXRjaGluZ191cmxzCiAgICAgICAgcmV0dXJuICJsaW5rIjsKICAgICAgfQogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCiAgICBibGFua0xpbmU6IGJsYW5rTGluZQogIH07CiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJnZm1CYXNlIiwgewogICAgbmFtZTogIm1hcmtkb3duIiwKICAgIHVuZGVyc2NvcmVzQnJlYWtXb3JkczogZmFsc2UsCiAgICBmZW5jZWRDb2RlQmxvY2tzOiB0cnVlCiAgfSk7CiAgcmV0dXJuIENvZGVNaXJyb3Iub3ZlcmxheU1vZGUoQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgImdmbUJhc2UiKSwgZ2ZtT3ZlcmxheSk7Cn0sICJtYXJrZG93biIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/gfm/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEdGTSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL3V0aWwvb3ZlcmxheS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbWFya2Rvd24vbWFya2Rvd24uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImdmbS5qcyI+PC9zY3JpcHQ+CiAgICAKICAgIDwhLS0gQ29kZSBibG9jayBoaWdobGlnaHRpbmcgbW9kZXMgLS0+CiAgICA8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9jc3MvY3NzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9jbGlrZS9jbGlrZS5qcyI+PC9zY3JpcHQ+CiAgICAKICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbWFya2Rvd24vbWFya2Rvd24uY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBHRk0gbW9kZTwvaDE+Cgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpHaXRIdWIgRmxhdm9yZWQgTWFya2Rvd24KPT09PT09PT09PT09PT09PT09PT09PT09CgpFdmVyeXRoaW5nIGZyb20gbWFya2Rvd24gcGx1cyBHRk0gZmVhdHVyZXM6CgojIyBVUkwgYXV0b2xpbmtpbmcKClVuZGVyc2NvcmVzX2FyZV9hbGxvd2VkX2JldHdlZW5fd29yZHMuCgojIyBGZW5jZWQgY29kZSBibG9ja3MgKGFuZCBzeW50YXggaGlnaGxpZ2h0aW5nKQoKYGBgamF2YXNjcmlwdApmb3IgKHZhciBpID0gMDsgaSAmbHQ7IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICBjb25zb2xlLmxvZyhpdGVtc1tpXSwgaSk7IC8vIGxvZyB0aGVtCn0KYGBgCgojIyBBIGJpdCBvZiBHaXRIdWIgc3BpY2UKCiogU0hBOiBiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2QyCiogVXNlckBTSEEgcmVmOiBtb2pvbWJvQGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDIKKiBVc2VyL1Byb2plY3RAU0hBOiBtb2pvbWJvL2dvZEBiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2QyCiogXCNOdW06ICMxCiogVXNlci8jTnVtOiBtb2pvbWJvIzEKKiBVc2VyL1Byb2plY3QjTnVtOiBtb2pvbWJvL2dvZCMxCgpTZWUgaHR0cDovL2dpdGh1Yi5naXRodWIuY29tL2dpdGh1Yi1mbGF2b3JlZC1tYXJrZG93bi8uCgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICdnZm0nLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIHRoZW1lOiAiZGVmYXVsdCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5PcHRpb25hbGx5IGRlcGVuZHMgb24gb3RoZXIgbW9kZXMgZm9yIHByb3Blcmx5IGhpZ2hsaWdodGVkIGNvZGUgYmxvY2tzLjwvcD4KCiAgICA8cD48c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPiA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjZ2ZtXyoiPm5vcm1hbDwvYT4sICA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjdmVyYm9zZSxnZm1fKiI+dmVyYm9zZTwvYT4uPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/gfm/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gSW5pdGlhdGUgTW9kZVRlc3QgYW5kIHNldCBkZWZhdWx0cwp2YXIgTVQgPSBNb2RlVGVzdDsKTVQubW9kZU5hbWUgPSAnZ2ZtJzsKTVQubW9kZU9wdGlvbnMgPSB7fTsKCi8vIEVtcGhhc2lzIGNoYXJhY3RlcnMgd2l0aGluIGEgd29yZApNVC50ZXN0TW9kZSgKICAnZW1JbldvcmRBc3RlcmlzaycsCiAgJ2ZvbypiYXIqaGVsbG8nLAogIFsKICAgIG51bGwsICdmb28nLAogICAgJ2VtJywgJypiYXIqJywKICAgIG51bGwsICdoZWxsbycKICBdCik7Ck1ULnRlc3RNb2RlKAogICdlbUluV29yZFVuZGVyc2NvcmUnLAogICdmb29fYmFyX2hlbGxvJywKICBbCiAgICBudWxsLCAnZm9vX2Jhcl9oZWxsbycKICBdCik7Ck1ULnRlc3RNb2RlKAogICdlbVN0cm9uZ1VuZGVyc2NvcmUnLAogICdfX19mb29fX18gYmFyJywKICBbCiAgICAnc3Ryb25nJywgJ19fJywKICAgICdlbXN0cm9uZycsICdfZm9vX18nLAogICAgJ2VtJywgJ18nLAogICAgbnVsbCwgJyBiYXInCiAgXQopOwoKLy8gRmVuY2VkIGNvZGUgYmxvY2tzCk1ULnRlc3RNb2RlKAogICdmZW5jZWRDb2RlQmxvY2tzJywKICAnYGBgXG5mb29cblxuYGBgXG5iYXInLAogIFsKICAgICdjb21tZW50JywgJ2BgYCcsCiAgICAnY29tbWVudCcsICdmb28nLAogICAgJ2NvbW1lbnQnLCAnYGBgJywKICAgIG51bGwsICdiYXInCiAgXQopOwovLyBGZW5jZWQgY29kZSBibG9jayBtb2RlIHN3aXRjaGluZwpNVC50ZXN0TW9kZSgKICAnZmVuY2VkQ29kZUJsb2NrTW9kZVN3aXRjaGluZycsCiAgJ2BgYGphdmFzY3JpcHRcbmZvb1xuXG5gYGBcbmJhcicsCiAgWwogICAgJ2NvbW1lbnQnLCAnYGBgamF2YXNjcmlwdCcsCiAgICAndmFyaWFibGUnLCAnZm9vJywKICAgICdjb21tZW50JywgJ2BgYCcsCiAgICBudWxsLCAnYmFyJwogIF0KKTsKCi8vIFNIQQpNVC50ZXN0TW9kZSgKICAnU0hBJywKICAnZm9vIGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDIgYmFyJywKICBbCiAgICBudWxsLCAnZm9vICcsCiAgICAnbGluaycsICdiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2QyJywKICAgIG51bGwsICcgYmFyJwogIF0KKTsKLy8gR2l0SHViIGhpZ2hsaWdodHMgaGFzaGVzIDctNDAgY2hhcnMgaW4gbGVuZ3RoCk1ULnRlc3RNb2RlKAogICdzaG9ydFNIQScsCiAgJ2ZvbyBiZTZhOGNjIGJhcicsCiAgWwogICAgbnVsbCwgJ2ZvbyAnLAogICAgJ2xpbmsnLCAnYmU2YThjYycsCiAgICBudWxsLCAnIGJhcicKICBdCik7Ci8vIEludmFsaWQgU0hBcwovLyAKLy8gR2l0SHViIGRvZXMgbm90IGhpZ2hsaWdodCBoYXNoZXMgc2hvcnRlciB0aGFuIDcgY2hhcnMKTVQudGVzdE1vZGUoCiAgJ3Rvb1Nob3J0U0hBJywKICAnZm9vIGJlNmE4YyBiYXInLAogIFsKICAgIG51bGwsICdmb28gYmU2YThjIGJhcicKICBdCik7Ci8vIEdpdEh1YiBkb2VzIG5vdCBoaWdobGlnaHQgaGFzaGVzIGxvbmdlciB0aGFuIDQwIGNoYXJzCk1ULnRlc3RNb2RlKAogICdsb25nU0hBJywKICAnZm9vIGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDIyIGJhcicsCiAgWwogICAgbnVsbCwgJ2ZvbyBiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2QyMiBiYXInCiAgXQopOwpNVC50ZXN0TW9kZSgKICAnYmFkU0hBJywKICAnZm9vIGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZzIgYmFyJywKICBbCiAgICBudWxsLCAnZm9vIGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZzIgYmFyJwogIF0KKTsKLy8gVXNlckBTSEEKTVQudGVzdE1vZGUoCiAgJ3VzZXJTSEEnLAogICdmb28gYmFyQGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDIgaGVsbG8nLAogIFsKICAgIG51bGwsICdmb28gJywKICAgICdsaW5rJywgJ2JhckBiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2QyJywKICAgIG51bGwsICcgaGVsbG8nCiAgXQopOwovLyBVc2VyL1Byb2plY3RAU0hBCk1ULnRlc3RNb2RlKAogICd1c2VyUHJvamVjdFNIQScsCiAgJ2ZvbyBiYXIvaGVsbG9AYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMiB3b3JsZCcsCiAgWwogICAgbnVsbCwgJ2ZvbyAnLAogICAgJ2xpbmsnLCAnYmFyL2hlbGxvQGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDInLAogICAgbnVsbCwgJyB3b3JsZCcKICBdCik7CgovLyAjTnVtCk1ULnRlc3RNb2RlKAogICdudW0nLAogICdmb28gIzEgYmFyJywKICBbCiAgICBudWxsLCAnZm9vICcsCiAgICAnbGluaycsICcjMScsCiAgICBudWxsLCAnIGJhcicKICBdCik7Ci8vIGJhZCAjTnVtCk1ULnRlc3RNb2RlKAogICdiYWROdW0nLAogICdmb28gIzFiYXIgaGVsbG8nLAogIFsKICAgIG51bGwsICdmb28gIzFiYXIgaGVsbG8nCiAgXQopOwovLyBVc2VyI051bQpNVC50ZXN0TW9kZSgKICAndXNlck51bScsCiAgJ2ZvbyBiYXIjMSBoZWxsbycsCiAgWwogICAgbnVsbCwgJ2ZvbyAnLAogICAgJ2xpbmsnLCAnYmFyIzEnLAogICAgbnVsbCwgJyBoZWxsbycKICBdCik7Ci8vIFVzZXIvUHJvamVjdCNOdW0KTVQudGVzdE1vZGUoCiAgJ3VzZXJQcm9qZWN0TnVtJywKICAnZm9vIGJhci9oZWxsbyMxIHdvcmxkJywKICBbCiAgICBudWxsLCAnZm9vICcsCiAgICAnbGluaycsICdiYXIvaGVsbG8jMScsCiAgICBudWxsLCAnIHdvcmxkJwogIF0KKTsKCi8vIFZhbmlsbGEgbGlua3MKTVQudGVzdE1vZGUoCiAgJ3ZhbmlsbGFMaW5rJywKICAnZm9vIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIGJhcicsCiAgWwogICAgbnVsbCwgJ2ZvbyAnLAogICAgJ2xpbmsnLCAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS8nLAogICAgbnVsbCwgJyBiYXInCiAgXQopOwpNVC50ZXN0TW9kZSgKICAndmFuaWxsYUxpbmtQdW5jdHVhdGlvbicsCiAgJ2ZvbyBodHRwOi8vd3d3LmV4YW1wbGUuY29tLy4gYmFyJywKICBbCiAgICBudWxsLCAnZm9vICcsCiAgICAnbGluaycsICdodHRwOi8vd3d3LmV4YW1wbGUuY29tLycsCiAgICBudWxsLCAnLiBiYXInCiAgXQopOwpNVC50ZXN0TW9kZSgKICAndmFuaWxsYUxpbmtFeHRlbnNpb24nLAogICdmb28gaHR0cDovL3d3dy5leGFtcGxlLmNvbS9pbmRleC5odG1sIGJhcicsCiAgWwogICAgbnVsbCwgJ2ZvbyAnLAogICAgJ2xpbmsnLCAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS9pbmRleC5odG1sJywKICAgIG51bGwsICcgYmFyJwogIF0KKTsKLy8gTm90IGEgbGluawpNVC50ZXN0TW9kZSgKICAnbm90QUxpbmsnLAogICdgYGBjc3NcbmZvbyB7Y29sb3I6YmxhY2s7fVxuYGBgaHR0cDovL3d3dy5leGFtcGxlLmNvbS8nLAogIFsKICAgICdjb21tZW50JywgJ2BgYGNzcycsCiAgICAndGFnJywgJ2ZvbycsCiAgICBudWxsLCAnIHsnLAogICAgJ3Byb3BlcnR5JywgJ2NvbG9yJywKICAgICdvcGVyYXRvcicsICc6JywKICAgICdrZXl3b3JkJywgJ2JsYWNrJywKICAgIG51bGwsICc7fScsCiAgICAnY29tbWVudCcsICdgYGAnLAogICAgJ2xpbmsnLCAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS8nCiAgXQopOwovLyBOb3QgYSBsaW5rCk1ULnRlc3RNb2RlKAogICdub3RBTGluaycsCiAgJ2BgZm9vIGBiYXJgIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vYGAgaGVsbG8nLAogIFsKICAgICdjb21tZW50JywgJ2BgZm9vIGBiYXJgIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vYGAnLAogICAgbnVsbCwgJyBoZWxsbycKICBdCik7Ci8vIE5vdCBhIGxpbmsKTVQudGVzdE1vZGUoCiAgJ25vdEFMaW5rJywKICAnYGZvb1xuaHR0cDovL3d3dy5leGFtcGxlLmNvbS9cbmBmb29cblxuaHR0cDovL3d3dy5leGFtcGxlLmNvbS8nLAogIFsKICAgICdjb21tZW50JywgJ2Bmb28nLAogICAgJ2xpbmsnLCAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS8nLAogICAgJ2NvbW1lbnQnLCAnYGZvbycsCiAgICAnbGluaycsICdodHRwOi8vd3d3LmV4YW1wbGUuY29tLycKICBdCik7]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/go/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/go/go.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJnbyIsIGZ1bmN0aW9uKGNvbmZpZykgewogIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQ7CgogIHZhciBrZXl3b3JkcyA9IHsKICAgICJicmVhayI6dHJ1ZSwgImNhc2UiOnRydWUsICJjaGFuIjp0cnVlLCAiY29uc3QiOnRydWUsICJjb250aW51ZSI6dHJ1ZSwKICAgICJkZWZhdWx0Ijp0cnVlLCAiZGVmZXIiOnRydWUsICJlbHNlIjp0cnVlLCAiZmFsbHRocm91Z2giOnRydWUsICJmb3IiOnRydWUsCiAgICAiZnVuYyI6dHJ1ZSwgImdvIjp0cnVlLCAiZ290byI6dHJ1ZSwgImlmIjp0cnVlLCAiaW1wb3J0Ijp0cnVlLAogICAgImludGVyZmFjZSI6dHJ1ZSwgIm1hcCI6dHJ1ZSwgInBhY2thZ2UiOnRydWUsICJyYW5nZSI6dHJ1ZSwgInJldHVybiI6dHJ1ZSwKICAgICJzZWxlY3QiOnRydWUsICJzdHJ1Y3QiOnRydWUsICJzd2l0Y2giOnRydWUsICJ0eXBlIjp0cnVlLCAidmFyIjp0cnVlLAogICAgImJvb2wiOnRydWUsICJieXRlIjp0cnVlLCAiY29tcGxleDY0Ijp0cnVlLCAiY29tcGxleDEyOCI6dHJ1ZSwKICAgICJmbG9hdDMyIjp0cnVlLCAiZmxvYXQ2NCI6dHJ1ZSwgImludDgiOnRydWUsICJpbnQxNiI6dHJ1ZSwgImludDMyIjp0cnVlLAogICAgImludDY0Ijp0cnVlLCAic3RyaW5nIjp0cnVlLCAidWludDgiOnRydWUsICJ1aW50MTYiOnRydWUsICJ1aW50MzIiOnRydWUsCiAgICAidWludDY0Ijp0cnVlLCAiaW50Ijp0cnVlLCAidWludCI6dHJ1ZSwgInVpbnRwdHIiOnRydWUKICB9OwoKICB2YXIgYXRvbXMgPSB7CiAgICAidHJ1ZSI6dHJ1ZSwgImZhbHNlIjp0cnVlLCAiaW90YSI6dHJ1ZSwgIm5pbCI6dHJ1ZSwgImFwcGVuZCI6dHJ1ZSwKICAgICJjYXAiOnRydWUsICJjbG9zZSI6dHJ1ZSwgImNvbXBsZXgiOnRydWUsICJjb3B5Ijp0cnVlLCAiaW1hZyI6dHJ1ZSwKICAgICJsZW4iOnRydWUsICJtYWtlIjp0cnVlLCAibmV3Ijp0cnVlLCAicGFuaWMiOnRydWUsICJwcmludCI6dHJ1ZSwKICAgICJwcmludGxuIjp0cnVlLCAicmVhbCI6dHJ1ZSwgInJlY292ZXIiOnRydWUKICB9OwoKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomXiU6PTw+IXxcL10vOwoKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xkXC5dLy50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gIi4iKSB7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAtOV0rKFtlRV1bXC0rXT9bMC05XSspPy8pOwogICAgICB9IGVsc2UgaWYgKGNoID09ICIwIikgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXlt4WF1bMC05YS1mQS1GXSsvKSB8fCBzdHJlYW0ubWF0Y2goL14wWzAtN10rLyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAtOV0qXC4/WzAtOV0qKFtlRV1bXC0rXT9bMC05XSspPy8pOwogICAgICB9CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoY3VyID09ICJjYXNlIiB8fCBjdXIgPT0gImRlZmF1bHQiKSBjdXJQdW5jID0gImNhc2UiOwogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfQogICAgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiYXRvbSI7CiAgICByZXR1cm4gInZhcmlhYmxlIjsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgcXVvdGUgPT0gImAiKSkKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUpIHsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoc3RhdGUuaW5kZW50ZWQsIGNvbCwgdHlwZSwgbnVsbCwgc3RhdGUuY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgaWYgKHQgPT0gIikiIHx8IHQgPT0gIl0iIHx8IHQgPT0gIn0iKQogICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CgogIC8vIEludGVyZmFjZQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBudWxsLAogICAgICAgIGNvbnRleHQ6IG5ldyBDb250ZXh0KChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgInRvcCIsIGZhbHNlKSwKICAgICAgICBpbmRlbnRlZDogMCwKICAgICAgICBzdGFydE9mTGluZTogdHJ1ZQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJjYXNlIikgY3R4LnR5cGUgPSAifSI7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgY3VyUHVuYyA9IG51bGw7CiAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgPT0gImNvbW1lbnQiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTsKCiAgICAgIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiKSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJjYXNlIikgY3R4LnR5cGUgPSAiY2FzZSI7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIn0iICYmIGN0eC50eXBlID09ICJ9IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gY3R4LnR5cGUpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlICYmIHN0YXRlLnRva2VuaXplICE9IG51bGwpIHJldHVybiAwOwogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dCwgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7CiAgICAgIGlmIChjdHgudHlwZSA9PSAiY2FzZSIgJiYgL14oPzpjYXNlfGRlZmF1bHQpXGIvLnRlc3QodGV4dEFmdGVyKSkgewogICAgICAgIHN0YXRlLmNvbnRleHQudHlwZSA9ICJ9IjsKICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkOwogICAgICB9CiAgICAgIHZhciBjbG9zaW5nID0gZmlyc3RDaGFyID09IGN0eC50eXBlOwogICAgICBpZiAoY3R4LmFsaWduKSByZXR1cm4gY3R4LmNvbHVtbiArIChjbG9zaW5nID8gMCA6IDEpOwogICAgICBlbHNlIHJldHVybiBjdHguaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9OiIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWdvIiwgImdvIik7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/go/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEdvIG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9lbGVnYW50LmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi91dGlsL21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImdvLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyOjFweCBzb2xpZCAjOTk5OyBiYWNrZ3JvdW5kOiNmZmN9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogR28gbW9kZTwvaDE+Cgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovLyBQcmltZSBTaWV2ZSBpbiBHby4KLy8gVGFrZW4gZnJvbSB0aGUgR28gc3BlY2lmaWNhdGlvbi4KLy8gQ29weXJpZ2h0IMKpIFRoZSBHbyBBdXRob3JzLgoKcGFja2FnZSBtYWluCgppbXBvcnQgImZtdCIKCi8vIFNlbmQgdGhlIHNlcXVlbmNlIDIsIDMsIDQsIC4uLiB0byBjaGFubmVsICdjaCcuCmZ1bmMgZ2VuZXJhdGUoY2ggY2hhbiZsdDstIGludCkgewoJZm9yIGkgOj0gMjsgOyBpKysgewoJCWNoICZsdDstIGkgIC8vIFNlbmQgJ2knIHRvIGNoYW5uZWwgJ2NoJwoJfQp9CgovLyBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBjaGFubmVsICdzcmMnIHRvIGNoYW5uZWwgJ2RzdCcsCi8vIHJlbW92aW5nIHRob3NlIGRpdmlzaWJsZSBieSAncHJpbWUnLgpmdW5jIGZpbHRlcihzcmMgJmx0Oy1jaGFuIGludCwgZHN0IGNoYW4mbHQ7LSBpbnQsIHByaW1lIGludCkgewoJZm9yIGkgOj0gcmFuZ2Ugc3JjIHsgICAgLy8gTG9vcCBvdmVyIHZhbHVlcyByZWNlaXZlZCBmcm9tICdzcmMnLgoJCWlmIGklcHJpbWUgIT0gMCB7CgkJCWRzdCAmbHQ7LSBpICAvLyBTZW5kICdpJyB0byBjaGFubmVsICdkc3QnLgoJCX0KCX0KfQoKLy8gVGhlIHByaW1lIHNpZXZlOiBEYWlzeS1jaGFpbiBmaWx0ZXIgcHJvY2Vzc2VzIHRvZ2V0aGVyLgpmdW5jIHNpZXZlKCkgewoJY2ggOj0gbWFrZShjaGFuIGludCkgIC8vIENyZWF0ZSBhIG5ldyBjaGFubmVsLgoJZ28gZ2VuZXJhdGUoY2gpICAgICAgIC8vIFN0YXJ0IGdlbmVyYXRlKCkgYXMgYSBzdWJwcm9jZXNzLgoJZm9yIHsKCQlwcmltZSA6PSAmbHQ7LWNoCgkJZm10LlByaW50KHByaW1lLCAiXG4iKQoJCWNoMSA6PSBtYWtlKGNoYW4gaW50KQoJCWdvIGZpbHRlcihjaCwgY2gxLCBwcmltZSkKCQljaCA9IGNoMQoJfQp9CgpmdW5jIG1haW4oKSB7CglzaWV2ZSgpCn0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICB0aGVtZTogImVsZWdhbnQiLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogOCwKICAgICAgICB0YWJTaXplOiA4LAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtZ28iCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGU6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1nbzwvY29kZT48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/groovy/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/groovy/groovy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJncm9vdnkiLCBmdW5jdGlvbihjb25maWcpIHsKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIGtleXdvcmRzID0gd29yZHMoCiAgICAiYWJzdHJhY3QgYXMgYXNzZXJ0IGJvb2xlYW4gYnJlYWsgYnl0ZSBjYXNlIGNhdGNoIGNoYXIgY2xhc3MgY29uc3QgY29udGludWUgZGVmIGRlZmF1bHQgIiArCiAgICAiZG8gZG91YmxlIGVsc2UgZW51bSBleHRlbmRzIGZpbmFsIGZpbmFsbHkgZmxvYXQgZm9yIGdvdG8gaWYgaW1wbGVtZW50cyBpbXBvcnQgaW4gIiArCiAgICAiaW5zdGFuY2VvZiBpbnQgaW50ZXJmYWNlIGxvbmcgbmF0aXZlIG5ldyBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyByZXR1cm4gIiArCiAgICAic2hvcnQgc3RhdGljIHN0cmljdGZwIHN1cGVyIHN3aXRjaCBzeW5jaHJvbml6ZWQgdGhyZWFkc2FmZSB0aHJvdyB0aHJvd3MgdHJhbnNpZW50ICIgKwogICAgInRyeSB2b2lkIHZvbGF0aWxlIHdoaWxlIik7CiAgdmFyIGJsb2NrS2V5d29yZHMgPSB3b3JkcygiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBpZiBzd2l0Y2ggdHJ5IHdoaWxlIGVudW0gaW50ZXJmYWNlIGRlZiIpOwogIHZhciBhdG9tcyA9IHdvcmRzKCJudWxsIHRydWUgZmFsc2UgdGhpcyIpOwoKICB2YXIgY3VyUHVuYzsKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAnIicgfHwgY2ggPT0gIiciKSB7CiAgICAgIHJldHVybiBzdGFydFN0cmluZyhjaCwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIGlmIChzdHJlYW0uZWF0KC9lRS8pKSB7IHN0cmVhbS5lYXQoL1wrXC0vKTsgc3RyZWFtLmVhdFdoaWxlKC9cZC8pOyB9CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplLnB1c2godG9rZW5Db21tZW50KTsKICAgICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICBpZiAoZXhwZWN0RXhwcmVzc2lvbihzdGF0ZS5sYXN0VG9rZW4pKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0U3RyaW5nKGNoLCBzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgfQogICAgaWYgKGNoID09ICItIiAmJiBzdHJlYW0uZWF0KCI+IikpIHsKICAgICAgY3VyUHVuYyA9ICItPiI7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9bK1wtKiYlPTw+IT98XC9+XS8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bK1wtKiYlPTw+fH5dLyk7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICBpZiAoY2ggPT0gIkAiKSB7IHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXC5dLyk7IHJldHVybiAibWV0YSI7IH0KICAgIGlmIChzdGF0ZS5sYXN0VG9rZW4gPT0gIi4iKSByZXR1cm4gInByb3BlcnR5IjsKICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHsgY3VyUHVuYyA9ICJwcm9wbGFiZWwiOyByZXR1cm4gInByb3BlcnR5IjsgfQogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoYXRvbXMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgeyByZXR1cm4gImF0b20iOyB9CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICByZXR1cm4gInZhcmlhYmxlIjsKICB9CiAgdG9rZW5CYXNlLmlzQmFzZSA9IHRydWU7CgogIGZ1bmN0aW9uIHN0YXJ0U3RyaW5nKHF1b3RlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgdHJpcGxlUXVvdGVkID0gZmFsc2U7CiAgICBpZiAocXVvdGUgIT0gIi8iICYmIHN0cmVhbS5lYXQocXVvdGUpKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KHF1b3RlKSkgdHJpcGxlUXVvdGVkID0gdHJ1ZTsKICAgICAgZWxzZSByZXR1cm4gInN0cmluZyI7CiAgICB9CiAgICBmdW5jdGlvbiB0KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gIXRyaXBsZVF1b3RlZDsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBpZiAoIXRyaXBsZVF1b3RlZCkgeyBicmVhazsgfQogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChxdW90ZSArIHF1b3RlKSkgeyBlbmQgPSB0cnVlOyBicmVhazsgfQogICAgICAgIH0KICAgICAgICBpZiAocXVvdGUgPT0gJyInICYmIG5leHQgPT0gIiQiICYmICFlc2NhcGVkICYmIHN0cmVhbS5lYXQoInsiKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucHVzaCh0b2tlbkJhc2VVbnRpbEJyYWNlKCkpOwogICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQpIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CiAgICBzdGF0ZS50b2tlbml6ZS5wdXNoKHQpOwogICAgcmV0dXJuIHQoc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkJhc2VVbnRpbEJyYWNlKCkgewogICAgdmFyIGRlcHRoID0gMTsKICAgIGZ1bmN0aW9uIHQoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PSAifSIpIHsKICAgICAgICBkZXB0aC0tOwogICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGgtMV0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5wZWVrKCkgPT0gInsiKSB7CiAgICAgICAgZGVwdGgrKzsKICAgICAgfQogICAgICByZXR1cm4gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgdC5pc0Jhc2UgPSB0cnVlOwogICAgcmV0dXJuIHQ7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBleHBlY3RFeHByZXNzaW9uKGxhc3QpIHsKICAgIHJldHVybiAhbGFzdCB8fCBsYXN0ID09ICJvcGVyYXRvciIgfHwgbGFzdCA9PSAiLT4iIHx8IC9bXC5cW1x7XCgsOzpdLy50ZXN0KGxhc3QpIHx8CiAgICAgIGxhc3QgPT0gIm5ld3N0YXRlbWVudCIgfHwgbGFzdCA9PSAia2V5d29yZCIgfHwgbGFzdCA9PSAicHJvcGxhYmVsIjsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUpIHsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoc3RhdGUuaW5kZW50ZWQsIGNvbCwgdHlwZSwgbnVsbCwgc3RhdGUuY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgaWYgKHQgPT0gIikiIHx8IHQgPT0gIl0iIHx8IHQgPT0gIn0iKQogICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CgogIC8vIEludGVyZmFjZQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBbdG9rZW5CYXNlXSwKICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dCgoYmFzZWNvbHVtbiB8fCAwKSAtIGNvbmZpZy5pbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlLAogICAgICAgIGxhc3RUb2tlbjogbnVsbAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgICAgLy8gQXV0b21hdGljIHNlbWljb2xvbiBpbnNlcnRpb24KICAgICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgIWV4cGVjdEV4cHJlc3Npb24oc3RhdGUubGFzdFRva2VuKSkgewogICAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7IGN0eCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIGN1clB1bmMgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGgtMV0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIpIHJldHVybiBzdHlsZTsKICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSB0cnVlOwoKICAgICAgaWYgKChjdXJQdW5jID09ICI7IiB8fCBjdXJQdW5jID09ICI6IikgJiYgY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAvLyBIYW5kbGUgaW5kZW50YXRpb24gZm9yIHt4IC0+IFxuIC4uLiB9CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIi0+IiAmJiBjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdHgucHJldi50eXBlID09ICJ9IikgewogICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIHN0YXRlLmNvbnRleHQuYWxpZ24gPSBmYWxzZTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiKSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IikgewogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJ9IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3R4LnR5cGUgPT0gIn0iIHx8IGN0eC50eXBlID09ICJ0b3AiIHx8IChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSkKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAic3RhdGVtZW50Iik7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgIHN0YXRlLmxhc3RUb2tlbiA9IGN1clB1bmMgfHwgc3R5bGU7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmICghc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdLmlzQmFzZSkgcmV0dXJuIDA7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKSwgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmICFleHBlY3RFeHByZXNzaW9uKHN0YXRlLmxhc3RUb2tlbikpIGN0eCA9IGN0eC5wcmV2OwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSBjdHgudHlwZTsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSByZXR1cm4gY3R4LmluZGVudGVkICsgKGZpcnN0Q2hhciA9PSAieyIgPyAwIDogY29uZmlnLmluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGNvbmZpZy5pbmRlbnRVbml0KTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZ3Jvb3Z5IiwgImdyb292eSIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/groovy/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEdyb292eSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iZ3Jvb3Z5LmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICM1MDA7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNTAwO308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBHcm9vdnkgbW9kZTwvaDE+Cgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovL1BhdHRlcm4gZm9yIGdyb292eSBzY3JpcHQKZGVmIHAgPSB+Ly4qXC5ncm9vdnkvCm5ldyBGaWxlKCAnZDpcXHNjcmlwdHMnICkuZWFjaEZpbGVNYXRjaChwKSB7ZiAtPgogIC8vIGltcG9ydHMgbGlzdAogIGRlZiBpbXBvcnRzID0gW10KICBmLmVhY2hMaW5lIHsKICAgIC8vIGNvbmRpdGlvbiB0byBkZXRlY3QgYW4gaW1wb3J0IGluc3RydWN0aW9uCiAgICBsbiAtPiBpZiAoIGxuID1+ICdeaW1wb3J0IC4qJyApIHsKICAgICAgaW1wb3J0cyA8PCAiJHtsbiAtICdpbXBvcnQgJ30iCiAgICB9CiAgfQogIC8vIHByaW50IHRobWVuCiAgaWYgKCAhIGltcG9ydHMuZW1wdHkgKSB7CiAgICBwcmludGxuIGYKICAgIGltcG9ydHMuZWFjaHsgcHJpbnRsbiAiICAgJGl0IiB9CiAgfQp9CgovKiBDb2luIGNoYW5nZXIgZGVtbyBjb2RlIGZyb20gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcgKi8KCmVudW0gVXNDb2luIHsKICBxdWFydGVyKDI1KSwgZGltZSgxMCksIG5pY2tlbCg1KSwgcGVubnkoMSkKICBVc0NvaW4odikgeyB2YWx1ZSA9IHYgfQogIGZpbmFsIHZhbHVlCn0KCmVudW0gT3p6aWVDb2luIHsKICBmaWZ0eSg1MCksIHR3ZW50eSgyMCksIHRlbigxMCksIGZpdmUoNSkKICBPenppZUNvaW4odikgeyB2YWx1ZSA9IHYgfQogIGZpbmFsIHZhbHVlCn0KCmRlZiBwbHVyYWwod29yZCwgY291bnQpIHsKICBpZiAoY291bnQgPT0gMSkgcmV0dXJuIHdvcmQKICB3b3JkWy0xXSA9PSAneScgPyB3b3JkWzAuLi0yXSArICJpZXMiIDogd29yZCArICJzIgp9CgpkZWYgY2hhbmdlKGN1cnJlbmN5LCBhbW91bnQpIHsKICBjdXJyZW5jeS52YWx1ZXMoKS5pbmplY3QoW10peyBsaXN0LCBjb2luIC0+CiAgICAgaW50IGNvdW50ID0gYW1vdW50IC8gY29pbi52YWx1ZQogICAgIGFtb3VudCA9IGFtb3VudCAlIGNvaW4udmFsdWUKICAgICBsaXN0ICs9ICIkY291bnQgJHtwbHVyYWwoY29pbi50b1N0cmluZygpLCBjb3VudCl9IgogIH0KfQo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1ncm9vdnkiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1ncm9vdnk8L2NvZGU+PC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/haskell/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/haskell/haskell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJoYXNrZWxsIiwgZnVuY3Rpb24oKSB7CgogIGZ1bmN0aW9uIHN3aXRjaFN0YXRlKHNvdXJjZSwgc2V0U3RhdGUsIGYpIHsKICAgIHNldFN0YXRlKGYpOwogICAgcmV0dXJuIGYoc291cmNlLCBzZXRTdGF0ZSk7CiAgfQogIAogIC8vIFRoZXNlIHNob3VsZCBhbGwgYmUgVW5pY29kZSBleHRlbmRlZCwgYXMgcGVyIHRoZSBIYXNrZWxsIDIwMTAgcmVwb3J0CiAgdmFyIHNtYWxsUkUgPSAvW2Etel9dLzsKICB2YXIgbGFyZ2VSRSA9IC9bQS1aXS87CiAgdmFyIGRpZ2l0UkUgPSAvWzAtOV0vOwogIHZhciBoZXhpdFJFID0gL1swLTlBLUZhLWZdLzsKICB2YXIgb2N0aXRSRSA9IC9bMC03XS87CiAgdmFyIGlkUkUgPSAvW2Etel9BLVowLTknXS87CiAgdmFyIHN5bWJvbFJFID0gL1stISMkJSYqKy5cLzw9Pj9AXFxefH46XS87CiAgdmFyIHNwZWNpYWxSRSA9IC9bKCksO1tcXWB7fV0vOwogIHZhciB3aGl0ZUNoYXJSRSA9IC9bIFx0XHZcZl0vOyAvLyBuZXdsaW5lcyBhcmUgaGFuZGxlZCBpbiB0b2tlbml6ZXIKICAgIAogIGZ1bmN0aW9uIG5vcm1hbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICBpZiAoc291cmNlLmVhdFdoaWxlKHdoaXRlQ2hhclJFKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgICAgCiAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgaWYgKHNwZWNpYWxSRS50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gJ3snICYmIHNvdXJjZS5lYXQoJy0nKSkgewogICAgICAgIHZhciB0ID0gImNvbW1lbnQiOwogICAgICAgIGlmIChzb3VyY2UuZWF0KCcjJykpIHsKICAgICAgICAgIHQgPSAibWV0YSI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzd2l0Y2hTdGF0ZShzb3VyY2UsIHNldFN0YXRlLCBuY29tbWVudCh0LCAxKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAKICAgIGlmIChjaCA9PSAnXCcnKSB7CiAgICAgIGlmIChzb3VyY2UuZWF0KCdcXCcpKSB7CiAgICAgICAgc291cmNlLm5leHQoKTsgIC8vIHNob3VsZCBoYW5kbGUgb3RoZXIgZXNjYXBlcyBoZXJlCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgfQogICAgICBpZiAoc291cmNlLmVhdCgnXCcnKSkgewogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgICByZXR1cm4gImVycm9yIjsKICAgIH0KICAgIAogICAgaWYgKGNoID09ICciJykgewogICAgICByZXR1cm4gc3dpdGNoU3RhdGUoc291cmNlLCBzZXRTdGF0ZSwgc3RyaW5nTGl0ZXJhbCk7CiAgICB9CiAgICAgIAogICAgaWYgKGxhcmdlUkUudGVzdChjaCkpIHsKICAgICAgc291cmNlLmVhdFdoaWxlKGlkUkUpOwogICAgICBpZiAoc291cmNlLmVhdCgnLicpKSB7CiAgICAgICAgcmV0dXJuICJxdWFsaWZpZXIiOwogICAgICB9CiAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICB9CiAgICAgIAogICAgaWYgKHNtYWxsUkUudGVzdChjaCkpIHsKICAgICAgc291cmNlLmVhdFdoaWxlKGlkUkUpOwogICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgIH0KICAgICAgCiAgICBpZiAoZGlnaXRSRS50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gJzAnKSB7CiAgICAgICAgaWYgKHNvdXJjZS5lYXQoL1t4WF0vKSkgewogICAgICAgICAgc291cmNlLmVhdFdoaWxlKGhleGl0UkUpOyAvLyBzaG91bGQgcmVxdWlyZSBhdCBsZWFzdCAxCiAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0KICAgICAgICBpZiAoc291cmNlLmVhdCgvW29PXS8pKSB7CiAgICAgICAgICBzb3VyY2UuZWF0V2hpbGUob2N0aXRSRSk7IC8vIHNob3VsZCByZXF1aXJlIGF0IGxlYXN0IDEKICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgc291cmNlLmVhdFdoaWxlKGRpZ2l0UkUpOwogICAgICB2YXIgdCA9ICJudW1iZXIiOwogICAgICBpZiAoc291cmNlLmVhdCgnLicpKSB7CiAgICAgICAgdCA9ICJudW1iZXIiOwogICAgICAgIHNvdXJjZS5lYXRXaGlsZShkaWdpdFJFKTsgLy8gc2hvdWxkIHJlcXVpcmUgYXQgbGVhc3QgMQogICAgICB9CiAgICAgIGlmIChzb3VyY2UuZWF0KC9bZUVdLykpIHsKICAgICAgICB0ID0gIm51bWJlciI7CiAgICAgICAgc291cmNlLmVhdCgvWy0rXS8pOwogICAgICAgIHNvdXJjZS5lYXRXaGlsZShkaWdpdFJFKTsgLy8gc2hvdWxkIHJlcXVpcmUgYXQgbGVhc3QgMQogICAgICB9CiAgICAgIHJldHVybiB0OwogICAgfQogICAgICAKICAgIGlmIChzeW1ib2xSRS50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gJy0nICYmIHNvdXJjZS5lYXQoLy0vKSkgewogICAgICAgIHNvdXJjZS5lYXRXaGlsZSgvLS8pOwogICAgICAgIGlmICghc291cmNlLmVhdChzeW1ib2xSRSkpIHsKICAgICAgICAgIHNvdXJjZS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciB0ID0gInZhcmlhYmxlIjsKICAgICAgaWYgKGNoID09ICc6JykgewogICAgICAgIHQgPSAidmFyaWFibGUtMiI7CiAgICAgIH0KICAgICAgc291cmNlLmVhdFdoaWxlKHN5bWJvbFJFKTsKICAgICAgcmV0dXJuIHQ7ICAgIAogICAgfQogICAgICAKICAgIHJldHVybiAiZXJyb3IiOwogIH0KICAgIAogIGZ1bmN0aW9uIG5jb21tZW50KHR5cGUsIG5lc3QpIHsKICAgIGlmIChuZXN0ID09IDApIHsKICAgICAgcmV0dXJuIG5vcm1hbDsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjdXJyTmVzdCA9IG5lc3Q7CiAgICAgIHdoaWxlICghc291cmNlLmVvbCgpKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoY2ggPT0gJ3snICYmIHNvdXJjZS5lYXQoJy0nKSkgewogICAgICAgICAgKytjdXJyTmVzdDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gJy0nICYmIHNvdXJjZS5lYXQoJ30nKSkgewogICAgICAgICAgLS1jdXJyTmVzdDsKICAgICAgICAgIGlmIChjdXJyTmVzdCA9PSAwKSB7CiAgICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBzZXRTdGF0ZShuY29tbWVudCh0eXBlLCBjdXJyTmVzdCkpOwogICAgICByZXR1cm4gdHlwZTsKICAgIH07CiAgfQogICAgCiAgZnVuY3Rpb24gc3RyaW5nTGl0ZXJhbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICB3aGlsZSAoIXNvdXJjZS5lb2woKSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0KICAgICAgaWYgKGNoID09ICdcXCcpIHsKICAgICAgICBpZiAoc291cmNlLmVvbCgpIHx8IHNvdXJjZS5lYXQod2hpdGVDaGFyUkUpKSB7CiAgICAgICAgICBzZXRTdGF0ZShzdHJpbmdHYXApOwogICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0KICAgICAgICBpZiAoc291cmNlLmVhdCgnJicpKSB7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgc291cmNlLm5leHQoKTsgLy8gc2hvdWxkIGhhbmRsZSBvdGhlciBlc2NhcGVzIGhlcmUKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICByZXR1cm4gImVycm9yIjsKICB9CiAgCiAgZnVuY3Rpb24gc3RyaW5nR2FwKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgIGlmIChzb3VyY2UuZWF0KCdcXCcpKSB7CiAgICAgIHJldHVybiBzd2l0Y2hTdGF0ZShzb3VyY2UsIHNldFN0YXRlLCBzdHJpbmdMaXRlcmFsKTsKICAgIH0KICAgIHNvdXJjZS5uZXh0KCk7CiAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgcmV0dXJuICJlcnJvciI7CiAgfQogIAogIAogIHZhciB3ZWxsS25vd25Xb3JkcyA9IChmdW5jdGlvbigpIHsKICAgIHZhciB3a3cgPSB7fTsKICAgIGZ1bmN0aW9uIHNldFR5cGUodCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgd2t3W2FyZ3VtZW50c1tpXV0gPSB0OwogICAgICB9OwogICAgfQogICAgCiAgICBzZXRUeXBlKCJrZXl3b3JkIikoCiAgICAgICJjYXNlIiwgImNsYXNzIiwgImRhdGEiLCAiZGVmYXVsdCIsICJkZXJpdmluZyIsICJkbyIsICJlbHNlIiwgImZvcmVpZ24iLAogICAgICAiaWYiLCAiaW1wb3J0IiwgImluIiwgImluZml4IiwgImluZml4bCIsICJpbmZpeHIiLCAiaW5zdGFuY2UiLCAibGV0IiwKICAgICAgIm1vZHVsZSIsICJuZXd0eXBlIiwgIm9mIiwgInRoZW4iLCAidHlwZSIsICJ3aGVyZSIsICJfIik7CiAgICAgIAogICAgc2V0VHlwZSgia2V5d29yZCIpKAogICAgICAiXC5cLiIsICI6IiwgIjo6IiwgIj0iLCAiXFwiLCAiXCIiLCAiPC0iLCAiLT4iLCAiQCIsICJ+IiwgIj0+Iik7CiAgICAgIAogICAgc2V0VHlwZSgiYnVpbHRpbiIpKAogICAgICAiISEiLCAiJCEiLCAiJCIsICImJiIsICIrIiwgIisrIiwgIi0iLCAiLiIsICIvIiwgIi89IiwgIjwiLCAiPD0iLCAiPTw8IiwKICAgICAgIj09IiwgIj4iLCAiPj0iLCAiPj4iLCAiPj49IiwgIl4iLCAiXl4iLCAifHwiLCAiKiIsICIqKiIpOwogICAgICAKICAgIHNldFR5cGUoImJ1aWx0aW4iKSgKICAgICAgIkJvb2wiLCAiQm91bmRlZCIsICJDaGFyIiwgIkRvdWJsZSIsICJFUSIsICJFaXRoZXIiLCAiRW51bSIsICJFcSIsCiAgICAgICJGYWxzZSIsICJGaWxlUGF0aCIsICJGbG9hdCIsICJGbG9hdGluZyIsICJGcmFjdGlvbmFsIiwgIkZ1bmN0b3IiLCAiR1QiLAogICAgICAiSU8iLCAiSU9FcnJvciIsICJJbnQiLCAiSW50ZWdlciIsICJJbnRlZ3JhbCIsICJKdXN0IiwgIkxUIiwgIkxlZnQiLAogICAgICAiTWF5YmUiLCAiTW9uYWQiLCAiTm90aGluZyIsICJOdW0iLCAiT3JkIiwgIk9yZGVyaW5nIiwgIlJhdGlvbmFsIiwgIlJlYWQiLAogICAgICAiUmVhZFMiLCAiUmVhbCIsICJSZWFsRmxvYXQiLCAiUmVhbEZyYWMiLCAiUmlnaHQiLCAiU2hvdyIsICJTaG93UyIsCiAgICAgICJTdHJpbmciLCAiVHJ1ZSIpOwogICAgICAKICAgIHNldFR5cGUoImJ1aWx0aW4iKSgKICAgICAgImFicyIsICJhY29zIiwgImFjb3NoIiwgImFsbCIsICJhbmQiLCAiYW55IiwgImFwcGVuZEZpbGUiLCAiYXNUeXBlT2YiLAogICAgICAiYXNpbiIsICJhc2luaCIsICJhdGFuIiwgImF0YW4yIiwgImF0YW5oIiwgImJyZWFrIiwgImNhdGNoIiwgImNlaWxpbmciLAogICAgICAiY29tcGFyZSIsICJjb25jYXQiLCAiY29uY2F0TWFwIiwgImNvbnN0IiwgImNvcyIsICJjb3NoIiwgImN1cnJ5IiwKICAgICAgImN5Y2xlIiwgImRlY29kZUZsb2F0IiwgImRpdiIsICJkaXZNb2QiLCAiZHJvcCIsICJkcm9wV2hpbGUiLCAiZWl0aGVyIiwKICAgICAgImVsZW0iLCAiZW5jb2RlRmxvYXQiLCAiZW51bUZyb20iLCAiZW51bUZyb21UaGVuIiwgImVudW1Gcm9tVGhlblRvIiwKICAgICAgImVudW1Gcm9tVG8iLCAiZXJyb3IiLCAiZXZlbiIsICJleHAiLCAiZXhwb25lbnQiLCAiZmFpbCIsICJmaWx0ZXIiLAogICAgICAiZmxpcCIsICJmbG9hdERpZ2l0cyIsICJmbG9hdFJhZGl4IiwgImZsb2F0UmFuZ2UiLCAiZmxvb3IiLCAiZm1hcCIsCiAgICAgICJmb2xkbCIsICJmb2xkbDEiLCAiZm9sZHIiLCAiZm9sZHIxIiwgImZyb21FbnVtIiwgImZyb21JbnRlZ2VyIiwKICAgICAgImZyb21JbnRlZ3JhbCIsICJmcm9tUmF0aW9uYWwiLCAiZnN0IiwgImdjZCIsICJnZXRDaGFyIiwgImdldENvbnRlbnRzIiwKICAgICAgImdldExpbmUiLCAiaGVhZCIsICJpZCIsICJpbml0IiwgImludGVyYWN0IiwgImlvRXJyb3IiLCAiaXNEZW5vcm1hbGl6ZWQiLAogICAgICAiaXNJRUVFIiwgImlzSW5maW5pdGUiLCAiaXNOYU4iLCAiaXNOZWdhdGl2ZVplcm8iLCAiaXRlcmF0ZSIsICJsYXN0IiwKICAgICAgImxjbSIsICJsZW5ndGgiLCAibGV4IiwgImxpbmVzIiwgImxvZyIsICJsb2dCYXNlIiwgImxvb2t1cCIsICJtYXAiLAogICAgICAibWFwTSIsICJtYXBNXyIsICJtYXgiLCAibWF4Qm91bmQiLCAibWF4aW11bSIsICJtYXliZSIsICJtaW4iLCAibWluQm91bmQiLAogICAgICAibWluaW11bSIsICJtb2QiLCAibmVnYXRlIiwgIm5vdCIsICJub3RFbGVtIiwgIm51bGwiLCAib2RkIiwgIm9yIiwKICAgICAgIm90aGVyd2lzZSIsICJwaSIsICJwcmVkIiwgInByaW50IiwgInByb2R1Y3QiLCAicHJvcGVyRnJhY3Rpb24iLAogICAgICAicHV0Q2hhciIsICJwdXRTdHIiLCAicHV0U3RyTG4iLCAicXVvdCIsICJxdW90UmVtIiwgInJlYWQiLCAicmVhZEZpbGUiLAogICAgICAicmVhZElPIiwgInJlYWRMaXN0IiwgInJlYWRMbiIsICJyZWFkUGFyZW4iLCAicmVhZHMiLCAicmVhZHNQcmVjIiwKICAgICAgInJlYWxUb0ZyYWMiLCAicmVjaXAiLCAicmVtIiwgInJlcGVhdCIsICJyZXBsaWNhdGUiLCAicmV0dXJuIiwgInJldmVyc2UiLAogICAgICAicm91bmQiLCAic2NhbGVGbG9hdCIsICJzY2FubCIsICJzY2FubDEiLCAic2NhbnIiLCAic2NhbnIxIiwgInNlcSIsCiAgICAgICJzZXF1ZW5jZSIsICJzZXF1ZW5jZV8iLCAic2hvdyIsICJzaG93Q2hhciIsICJzaG93TGlzdCIsICJzaG93UGFyZW4iLAogICAgICAic2hvd1N0cmluZyIsICJzaG93cyIsICJzaG93c1ByZWMiLCAic2lnbmlmaWNhbmQiLCAic2lnbnVtIiwgInNpbiIsCiAgICAgICJzaW5oIiwgInNuZCIsICJzcGFuIiwgInNwbGl0QXQiLCAic3FydCIsICJzdWJ0cmFjdCIsICJzdWNjIiwgInN1bSIsCiAgICAgICJ0YWlsIiwgInRha2UiLCAidGFrZVdoaWxlIiwgInRhbiIsICJ0YW5oIiwgInRvRW51bSIsICJ0b0ludGVnZXIiLAogICAgICAidG9SYXRpb25hbCIsICJ0cnVuY2F0ZSIsICJ1bmN1cnJ5IiwgInVuZGVmaW5lZCIsICJ1bmxpbmVzIiwgInVudGlsIiwKICAgICAgInVud29yZHMiLCAidW56aXAiLCAidW56aXAzIiwgInVzZXJFcnJvciIsICJ3b3JkcyIsICJ3cml0ZUZpbGUiLCAiemlwIiwKICAgICAgInppcDMiLCAiemlwV2l0aCIsICJ6aXBXaXRoMyIpOwogICAgICAKICAgIHJldHVybiB3a3c7CiAgfSkoKTsKICAgIAogIAogIAogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSAgeyByZXR1cm4geyBmOiBub3JtYWwgfTsgfSwKICAgIGNvcHlTdGF0ZTogIGZ1bmN0aW9uIChzKSB7IHJldHVybiB7IGY6IHMuZiB9OyB9LAogICAgCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgdCA9IHN0YXRlLmYoc3RyZWFtLCBmdW5jdGlvbihzKSB7IHN0YXRlLmYgPSBzOyB9KTsKICAgICAgdmFyIHcgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICByZXR1cm4gKHcgaW4gd2VsbEtub3duV29yZHMpID8gd2VsbEtub3duV29yZHNbd10gOiB0OwogICAgfQogIH07Cgp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWhhc2tlbGwiLCAiaGFza2VsbCIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/haskell/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEhhc2tlbGwgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi91dGlsL21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imhhc2tlbGwuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9lbGVnYW50LmNzcyI+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogSGFza2VsbCBtb2RlPC9oMT4KCjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Cm1vZHVsZSBVbmlxdWVQZXJtcyAoCiAgICB1bmlxdWVQZXJtcwogICAgKQp3aGVyZQoKLS0gfCBGaW5kIGFsbCB1bmlxdWUgcGVybXV0YXRpb25zIG9mIGEgbGlzdCB3aGVyZSB0aGVyZSBtaWdodCBiZSBkdXBsaWNhdGVzLgp1bmlxdWVQZXJtcyA6OiAoRXEgYSkgPT4gW2FdIC0+IFtbYV1dCnVuaXF1ZVBlcm1zID0gcGVybUJhZyAuIG1ha2VCYWcKCi0tIHwgQW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gd2hlcmUgZHVwbGljYXRlIHZhbHVlcyBhcmUgYWxsb3dlZCwKLS0gYnV0IHJlcHJlc2VudGVkIHdpdGggYSBzaW5nbGUgdmFsdWUgYW5kIGEgY291bnQuCnR5cGUgQmFnIGEgPSBbKGEsIEludCldCgptYWtlQmFnIDo6IChFcSBhKSA9PiBbYV0gLT4gQmFnIGEKbWFrZUJhZyBbXSA9IFtdCm1ha2VCYWcgKGE6YXMpID0gbWl4IGEgJCBtYWtlQmFnIGFzCiAgd2hlcmUKICAgIG1peCBhIFtdICAgICAgICAgICAgICAgICAgICAgICAgPSBbKGEsMSldCiAgICBtaXggYSAoYm5AKGIsbik6YnMpIHwgYSA9PSBiICAgID0gKGIsbisxKTpicwogICAgICAgICAgICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IGJuIDogbWl4IGEgYnMKCnBlcm1CYWcgOjogQmFnIGEgLT4gW1thXV0KcGVybUJhZyBbXSA9IFtbXV0KcGVybUJhZyBicyA9IGNvbmNhdE1hcCAoXChmLGNzKSAtPiBtYXAgKGY6KSAkIHBlcm1CYWcgY3MpIC4gb25lT2ZFYWNoICQgYnMKICB3aGVyZQogICAgb25lT2ZFYWNoIFtdID0gW10KICAgIG9uZU9mRWFjaCAoYW5AKGEsbik6YnMpID0KICAgICAgICBsZXQgYnMnID0gaWYgbiA9PSAxIHRoZW4gYnMgZWxzZSAoYSxuLTEpOmJzCiAgICAgICAgaW4gKGEsYnMnKSA6IG1hcFNuZCAoYW46KSAob25lT2ZFYWNoIGJzKQogICAgCiAgICBhcFNuZCBmIChhLGIpID0gKGEsIGYgYikKICAgIG1hcFNuZCA9IG1hcCAuIGFwU25kCjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICB0aGVtZTogImVsZWdhbnQiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1oYXNrZWxsPC9jb2RlPi48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/haxe/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/haxe/haxe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJoYXhlIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwogIAogIC8vIFRva2VuaXplcgoKICB2YXIga2V5d29yZHMgPSBmdW5jdGlvbigpewogICAgZnVuY3Rpb24ga3codHlwZSkge3JldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6ICJrZXl3b3JkIn07fQogICAgdmFyIEEgPSBrdygia2V5d29yZCBhIiksIEIgPSBrdygia2V5d29yZCBiIiksIEMgPSBrdygia2V5d29yZCBjIik7CiAgICB2YXIgb3BlcmF0b3IgPSBrdygib3BlcmF0b3IiKSwgYXRvbSA9IHt0eXBlOiAiYXRvbSIsIHN0eWxlOiAiYXRvbSJ9LCBhdHRyaWJ1dGUgPSB7dHlwZToiYXR0cmlidXRlIiwgc3R5bGU6ICJhdHRyaWJ1dGUifTsKICB2YXIgdHlwZSA9IGt3KCJ0eXBlZGVmIik7CiAgICByZXR1cm4gewogICAgICAiaWYiOiBBLCAid2hpbGUiOiBBLCAiZWxzZSI6IEIsICJkbyI6IEIsICJ0cnkiOiBCLAogICAgICAicmV0dXJuIjogQywgImJyZWFrIjogQywgImNvbnRpbnVlIjogQywgIm5ldyI6IEMsICJ0aHJvdyI6IEMsCiAgICAgICJ2YXIiOiBrdygidmFyIiksICJpbmxpbmUiOmF0dHJpYnV0ZSwgInN0YXRpYyI6IGF0dHJpYnV0ZSwgInVzaW5nIjprdygiaW1wb3J0IiksCiAgICAicHVibGljIjogYXR0cmlidXRlLCAicHJpdmF0ZSI6IGF0dHJpYnV0ZSwgImNhc3QiOiBrdygiY2FzdCIpLCAiaW1wb3J0Ijoga3coImltcG9ydCIpLCAibWFjcm8iOiBrdygibWFjcm8iKSwgCiAgICAgICJmdW5jdGlvbiI6IGt3KCJmdW5jdGlvbiIpLCAiY2F0Y2giOiBrdygiY2F0Y2giKSwgInVudHlwZWQiOiBrdygidW50eXBlZCIpLCAiY2FsbGJhY2siOiBrdygiY2IiKSwKICAgICAgImZvciI6IGt3KCJmb3IiKSwgInN3aXRjaCI6IGt3KCJzd2l0Y2giKSwgImNhc2UiOiBrdygiY2FzZSIpLCAiZGVmYXVsdCI6IGt3KCJkZWZhdWx0IiksCiAgICAgICJpbiI6IG9wZXJhdG9yLCAibmV2ZXIiOiBrdygicHJvcGVydHlfYWNjZXNzIiksICJ0cmFjZSI6a3coInRyYWNlIiksIAogICAgImNsYXNzIjogdHlwZSwgImVudW0iOnR5cGUsICJpbnRlcmZhY2UiOnR5cGUsICJ0eXBlZGVmIjp0eXBlLCAiZXh0ZW5kcyI6dHlwZSwgImltcGxlbWVudHMiOnR5cGUsICJkeW5hbWljIjp0eXBlLAogICAgICAidHJ1ZSI6IGF0b20sICJmYWxzZSI6IGF0b20sICJudWxsIjogYXRvbQogICAgfTsKICB9KCk7CgogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiYlPTw+IT98XS87CgogIGZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIGYpIHsKICAgIHN0YXRlLnRva2VuaXplID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gbmV4dFVudGlsVW5lc2NhcGVkKHN0cmVhbSwgZW5kKSB7CiAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0OwogICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAobmV4dCA9PSBlbmQgJiYgIWVzY2FwZWQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgfQogICAgcmV0dXJuIGVzY2FwZWQ7CiAgfQoKICAvLyBVc2VkIGFzIHNjcmF0Y2ggdmFyaWFibGVzIHRvIGNvbW11bmljYXRlIG11bHRpcGxlIHZhbHVlcyB3aXRob3V0CiAgLy8gY29uc2luZyB1cCB0b25zIG9mIG9iamVjdHMuCiAgdmFyIHR5cGUsIGNvbnRlbnQ7CiAgZnVuY3Rpb24gcmV0KHRwLCBzdHlsZSwgY29udCkgewogICAgdHlwZSA9IHRwOyBjb250ZW50ID0gY29udDsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIGZ1bmN0aW9uIGhheGVUb2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAnIicgfHwgY2ggPT0gIiciKQogICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgaGF4ZVRva2VuU3RyaW5nKGNoKSk7CiAgICBlbHNlIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkKICAgICAgcmV0dXJuIHJldChjaCk7CiAgICBlbHNlIGlmIChjaCA9PSAiMCIgJiYgc3RyZWFtLmVhdCgveC9pKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcZGEtZl0vaSk7CiAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIH0gICAgICAKICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkgfHwgY2ggPT0gIi0iICYmIHN0cmVhbS5lYXQoL1xkLykpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eXGQqKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy8pOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9CiAgICBlbHNlIGlmIChzdGF0ZS5yZUFsbG93ZWQgJiYgKGNoID09ICJ+IiAmJiBzdHJlYW0uZWF0KC9cLy8pKSkgewogICAgICBuZXh0VW50aWxVbmVzY2FwZWQoc3RyZWFtLCAiLyIpOwogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tnaW1zdV0vKTsgCiAgICAgIHJldHVybiByZXQoInJlZ2V4cCIsICJzdHJpbmctMiIpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgaGF4ZVRva2VuQ29tbWVudCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgICAgcmV0dXJuIHJldCgib3BlcmF0b3IiLCBudWxsLCBzdHJlYW0uY3VycmVudCgpKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiByZXQoImNvbmRpdGlvbmFsIiwgIm1ldGEiKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICJAIikgewogICAgICBzdHJlYW0uZWF0KC86Lyk7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3X10vKTsKICAgICAgcmV0dXJuIHJldCAoIm1ldGFkYXRhIiwgIm1ldGEiKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiByZXQoIm9wZXJhdG9yIiwgbnVsbCwgc3RyZWFtLmN1cnJlbnQoKSk7CiAgICB9CiAgICBlbHNlIHsKICAgIHZhciB3b3JkOwogICAgaWYoL1tBLVpdLy50ZXN0KGNoKSkKICAgIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdfPD5dLyk7CiAgICAgIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICByZXR1cm4gcmV0KCJ0eXBlIiwgInZhcmlhYmxlLTMiLCB3b3JkKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd19dLyk7CiAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLCBrbm93biA9IGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIGtleXdvcmRzW3dvcmRdOwogICAgICAgIHJldHVybiAoa25vd24gJiYgc3RhdGUua3dBbGxvd2VkKSA/IHJldChrbm93bi50eXBlLCBrbm93bi5zdHlsZSwgd29yZCkgOgogICAgICAgICAgICAgICAgICAgICAgIHJldCgidmFyaWFibGUiLCAidmFyaWFibGUiLCB3b3JkKTsKICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGhheGVUb2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKCFuZXh0VW50aWxVbmVzY2FwZWQoc3RyZWFtLCBxdW90ZSkpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBoYXhlVG9rZW5CYXNlOwogICAgICByZXR1cm4gcmV0KCJzdHJpbmciLCAic3RyaW5nIik7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaGF4ZVRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGhheGVUb2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KCiAgLy8gUGFyc2VyCgogIHZhciBhdG9taWNUeXBlcyA9IHsiYXRvbSI6IHRydWUsICJudW1iZXIiOiB0cnVlLCAidmFyaWFibGUiOiB0cnVlLCAic3RyaW5nIjogdHJ1ZSwgInJlZ2V4cCI6IHRydWV9OwoKICBmdW5jdGlvbiBIYXhlTGV4aWNhbChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldiwgaW5mbykgewogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgICBpZiAoYWxpZ24gIT0gbnVsbCkgdGhpcy5hbGlnbiA9IGFsaWduOwogIH0KCiAgZnVuY3Rpb24gaW5TY29wZShzdGF0ZSwgdmFybmFtZSkgewogICAgZm9yICh2YXIgdiA9IHN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkKICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTsKICB9CiAgCiAgZnVuY3Rpb24gcGFyc2VIYXhlKHN0YXRlLCBzdHlsZSwgdHlwZSwgY29udGVudCwgc3RyZWFtKSB7CiAgICB2YXIgY2MgPSBzdGF0ZS5jYzsKICAgIC8vIENvbW11bmljYXRlIG91ciBjb250ZXh0IHRvIHRoZSBjb21iaW5hdG9ycy4KICAgIC8vIChMZXNzIHdhc3RlZnVsIHRoYW4gY29uc2luZyB1cCBhIGh1bmRyZWQgY2xvc3VyZXMgb24gZXZlcnkgY2FsbC4pCiAgICBjeC5zdGF0ZSA9IHN0YXRlOyBjeC5zdHJlYW0gPSBzdHJlYW07IGN4Lm1hcmtlZCA9IG51bGwsIGN4LmNjID0gY2M7CiAgCiAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoImFsaWduIikpCiAgICAgIHN0YXRlLmxleGljYWwuYWxpZ24gPSB0cnVlOwoKICAgIHdoaWxlKHRydWUpIHsKICAgICAgdmFyIGNvbWJpbmF0b3IgPSBjYy5sZW5ndGggPyBjYy5wb3AoKSA6IHN0YXRlbWVudDsKICAgICAgaWYgKGNvbWJpbmF0b3IodHlwZSwgY29udGVudCkpIHsKICAgICAgICB3aGlsZShjYy5sZW5ndGggJiYgY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgICAgY2MucG9wKCkoKTsKICAgICAgICBpZiAoY3gubWFya2VkKSByZXR1cm4gY3gubWFya2VkOwogICAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIgJiYgaW5TY29wZShzdGF0ZSwgY29udGVudCkpIHJldHVybiAidmFyaWFibGUtMiI7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiICYmIGltcG9ydGVkKHN0YXRlLCBjb250ZW50KSkgcmV0dXJuICJ2YXJpYWJsZS0zIjsKICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0KICAgIH0KICB9CiAgCiAgZnVuY3Rpb24gaW1wb3J0ZWQoc3RhdGUsIHR5cGVuYW1lKQogIHsKICBpZiAoL1thLXpdLy50ZXN0KHR5cGVuYW1lLmNoYXJBdCgwKSkpCiAgICByZXR1cm4gZmFsc2U7CiAgdmFyIGxlbiA9IHN0YXRlLmltcG9ydGVkdHlwZXMubGVuZ3RoOwogIGZvciAodmFyIGkgPSAwOyBpPGxlbjsgaSsrKQogICAgaWYoc3RhdGUuaW1wb3J0ZWR0eXBlc1tpXT09dHlwZW5hbWUpIHJldHVybiB0cnVlOwogIH0KICAKICAKICBmdW5jdGlvbiByZWdpc3RlcmltcG9ydChpbXBvcnRuYW1lKSB7CiAgdmFyIHN0YXRlID0gY3guc3RhdGU7CiAgZm9yICh2YXIgdCA9IHN0YXRlLmltcG9ydGVkdHlwZXM7IHQ7IHQgPSB0Lm5leHQpCiAgICBpZih0Lm5hbWUgPT0gaW1wb3J0bmFtZSkgcmV0dXJuOwogIHN0YXRlLmltcG9ydGVkdHlwZXMgPSB7IG5hbWU6IGltcG9ydG5hbWUsIG5leHQ6IHN0YXRlLmltcG9ydGVkdHlwZXMgfTsKICB9CiAgLy8gQ29tYmluYXRvciB1dGlscwoKICB2YXIgY3ggPSB7c3RhdGU6IG51bGwsIGNvbHVtbjogbnVsbCwgbWFya2VkOiBudWxsLCBjYzogbnVsbH07CiAgZnVuY3Rpb24gcGFzcygpIHsKICAgIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGN4LmNjLnB1c2goYXJndW1lbnRzW2ldKTsKICB9CiAgZnVuY3Rpb24gY29udCgpIHsKICAgIHBhc3MuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiByZWdpc3Rlcih2YXJuYW1lKSB7CiAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTsKICAgIGlmIChzdGF0ZS5jb250ZXh0KSB7CiAgICAgIGN4Lm1hcmtlZCA9ICJkZWYiOwogICAgICBmb3IgKHZhciB2ID0gc3RhdGUubG9jYWxWYXJzOyB2OyB2ID0gdi5uZXh0KQogICAgICAgIGlmICh2Lm5hbWUgPT0gdmFybmFtZSkgcmV0dXJuOwogICAgICBzdGF0ZS5sb2NhbFZhcnMgPSB7bmFtZTogdmFybmFtZSwgbmV4dDogc3RhdGUubG9jYWxWYXJzfTsKICAgIH0KICB9CgogIC8vIENvbWJpbmF0b3JzCgogIHZhciBkZWZhdWx0VmFycyA9IHtuYW1lOiAidGhpcyIsIG5leHQ6IG51bGx9OwogIGZ1bmN0aW9uIHB1c2hjb250ZXh0KCkgewogICAgaWYgKCFjeC5zdGF0ZS5jb250ZXh0KSBjeC5zdGF0ZS5sb2NhbFZhcnMgPSBkZWZhdWx0VmFyczsKICAgIGN4LnN0YXRlLmNvbnRleHQgPSB7cHJldjogY3guc3RhdGUuY29udGV4dCwgdmFyczogY3guc3RhdGUubG9jYWxWYXJzfTsKICB9CiAgZnVuY3Rpb24gcG9wY29udGV4dCgpIHsKICAgIGN4LnN0YXRlLmxvY2FsVmFycyA9IGN4LnN0YXRlLmNvbnRleHQudmFyczsKICAgIGN4LnN0YXRlLmNvbnRleHQgPSBjeC5zdGF0ZS5jb250ZXh0LnByZXY7CiAgfQogIGZ1bmN0aW9uIHB1c2hsZXgodHlwZSwgaW5mbykgewogICAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTsKICAgICAgc3RhdGUubGV4aWNhbCA9IG5ldyBIYXhlTGV4aWNhbChzdGF0ZS5pbmRlbnRlZCwgY3guc3RyZWFtLmNvbHVtbigpLCB0eXBlLCBudWxsLCBzdGF0ZS5sZXhpY2FsLCBpbmZvKTsKICAgIH07CiAgICByZXN1bHQubGV4ID0gdHJ1ZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHBvcGxleCgpIHsKICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgaWYgKHN0YXRlLmxleGljYWwucHJldikgewogICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09ICIpIikKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7CiAgICAgIHN0YXRlLmxleGljYWwgPSBzdGF0ZS5sZXhpY2FsLnByZXY7CiAgICB9CiAgfQogIHBvcGxleC5sZXggPSB0cnVlOwoKICBmdW5jdGlvbiBleHBlY3Qod2FudGVkKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gZXhwZWN0aW5nKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gd2FudGVkKSByZXR1cm4gY29udCgpOwogICAgICBlbHNlIGlmICh3YW50ZWQgPT0gIjsiKSByZXR1cm4gcGFzcygpOwogICAgICBlbHNlIHJldHVybiBjb250KGFyZ3VtZW50cy5jYWxsZWUpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiQCIpIHJldHVybiBjb250KG1ldGFkZWYpOwogICAgaWYgKHR5cGUgPT0gInZhciIpIHJldHVybiBjb250KHB1c2hsZXgoInZhcmRlZiIpLCB2YXJkZWYxLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJrZXl3b3JkIGEiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJrZXl3b3JkIGIiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLCBwdXNoY29udGV4dCwgYmxvY2ssIHBvcGxleCwgcG9wY29udGV4dCk7CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybiBjb250KCk7CiAgICBpZiAodHlwZSA9PSAiYXR0cmlidXRlIikgcmV0dXJuIGNvbnQobWF5YmVhdHRyaWJ1dGUpOwogICAgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgaWYgKHR5cGUgPT0gImZvciIpIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwZWN0KCIoIiksIHB1c2hsZXgoIikiKSwgZm9yc3BlYzEsIGV4cGVjdCgiKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGxleCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIGNvbnQocHVzaGxleCgic3RhdCIpLCBtYXliZWxhYmVsKTsKICAgIGlmICh0eXBlID09ICJzd2l0Y2giKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIHB1c2hsZXgoIn0iLCAic3dpdGNoIiksIGV4cGVjdCgieyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAiY2FzZSIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiOiIpKTsKICAgIGlmICh0eXBlID09ICJkZWZhdWx0IikgcmV0dXJuIGNvbnQoZXhwZWN0KCI6IikpOwogICAgaWYgKHR5cGUgPT0gImNhdGNoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBwdXNoY29udGV4dCwgZXhwZWN0KCIoIiksIGZ1bmFyZywgZXhwZWN0KCIpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQsIHBvcGxleCwgcG9wY29udGV4dCk7CiAgICBpZiAodHlwZSA9PSAiaW1wb3J0IikgcmV0dXJuIGNvbnQoaW1wb3J0ZGVmLCBleHBlY3QoIjsiKSk7CiAgICBpZiAodHlwZSA9PSAidHlwZWRlZiIpIHJldHVybiBjb250KHR5cGVkZWYpOwogICAgcmV0dXJuIHBhc3MocHVzaGxleCgic3RhdCIpLCBleHByZXNzaW9uLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICB9CiAgZnVuY3Rpb24gZXhwcmVzc2lvbih0eXBlKSB7CiAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIHJldHVybiBjb250KG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgaWYgKHR5cGUgPT0gImtleXdvcmQgYyIpIHJldHVybiBjb250KG1heWJlZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgbWF5YmVleHByZXNzaW9uLCBleHBlY3QoIikiKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIGlmICh0eXBlID09ICJvcGVyYXRvciIpIHJldHVybiBjb250KGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gIlsiKSByZXR1cm4gY29udChwdXNobGV4KCJdIiksIGNvbW1hc2VwKGV4cHJlc3Npb24sICJdIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgY29tbWFzZXAob2JqcHJvcCwgIn0iKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIHJldHVybiBjb250KCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlZXhwcmVzc2lvbih0eXBlKSB7CiAgICBpZiAodHlwZS5tYXRjaCgvWztcfVwpXF0sXS8pKSByZXR1cm4gcGFzcygpOwogICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbik7CiAgfQogICAgCiAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvcih0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIiAmJiAvXCtcK3wtLS8udGVzdCh2YWx1ZSkpIHJldHVybiBjb250KG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIiB8fCB0eXBlID09ICI6IikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybjsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLCBjb21tYXNlcChleHByZXNzaW9uLCAiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gIi4iKSByZXR1cm4gY29udChwcm9wZXJ0eSwgbWF5YmVvcGVyYXRvcik7CiAgICBpZiAodHlwZSA9PSAiWyIpIHJldHVybiBjb250KHB1c2hsZXgoIl0iKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCJdIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgfQoKICBmdW5jdGlvbiBtYXliZWF0dHJpYnV0ZSh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiYXR0cmlidXRlIikgcmV0dXJuIGNvbnQobWF5YmVhdHRyaWJ1dGUpOwogICAgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgaWYgKHR5cGUgPT0gInZhciIpIHJldHVybiBjb250KHZhcmRlZjEpOwogIH0KCiAgZnVuY3Rpb24gbWV0YWRlZih0eXBlKSB7CiAgICBpZih0eXBlID09ICI6IikgcmV0dXJuIGNvbnQobWV0YWRlZik7CiAgICBpZih0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBjb250KG1ldGFkZWYpOwogICAgaWYodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgY29tYXNlcChtZXRhYXJncywgIikiKSwgcG9wbGV4LCBzdGF0ZW1lbnQpOwogIH0KICBmdW5jdGlvbiBtZXRhYXJncyh0eXBlKSB7CiAgICBpZih0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBjb250KCk7CiAgfQogIAogIGZ1bmN0aW9uIGltcG9ydGRlZiAodHlwZSwgdmFsdWUpIHsKICBpZih0eXBlID09ICJ2YXJpYWJsZSIgJiYgL1tBLVpdLy50ZXN0KHZhbHVlLmNoYXJBdCgwKSkpIHsgcmVnaXN0ZXJpbXBvcnQodmFsdWUpOyByZXR1cm4gY29udCgpOyB9CiAgZWxzZSBpZih0eXBlID09ICJ2YXJpYWJsZSIgfHwgdHlwZSA9PSAicHJvcGVydHkiIHx8IHR5cGUgPT0gIi4iKSByZXR1cm4gY29udChpbXBvcnRkZWYpOwogIH0KICAKICBmdW5jdGlvbiB0eXBlZGVmICh0eXBlLCB2YWx1ZSkKICB7CiAgaWYodHlwZSA9PSAidmFyaWFibGUiICYmIC9bQS1aXS8udGVzdCh2YWx1ZS5jaGFyQXQoMCkpKSB7IHJlZ2lzdGVyaW1wb3J0KHZhbHVlKTsgcmV0dXJuIGNvbnQoKTsgfQogIH0KICAKICBmdW5jdGlvbiBtYXliZWxhYmVsKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQocG9wbGV4LCBzdGF0ZW1lbnQpOwogICAgcmV0dXJuIHBhc3MobWF5YmVvcGVyYXRvciwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIHByb3BlcnR5KHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHtjeC5tYXJrZWQgPSAicHJvcGVydHkiOyByZXR1cm4gY29udCgpO30KICB9CiAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjeC5tYXJrZWQgPSAicHJvcGVydHkiOwogICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gY29udChleHBlY3QoIjoiKSwgZXhwcmVzc2lvbik7CiAgfQogIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQsIGVuZCkgewogICAgZnVuY3Rpb24gcHJvY2VlZCh0eXBlKSB7CiAgICAgIGlmICh0eXBlID09ICIsIikgcmV0dXJuIGNvbnQod2hhdCwgcHJvY2VlZCk7CiAgICAgIGlmICh0eXBlID09IGVuZCkgcmV0dXJuIGNvbnQoKTsKICAgICAgcmV0dXJuIGNvbnQoZXhwZWN0KGVuZCkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uIGNvbW1hU2VwYXJhdGVkKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gZW5kKSByZXR1cm4gY29udCgpOwogICAgICBlbHNlIHJldHVybiBwYXNzKHdoYXQsIHByb2NlZWQpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYmxvY2sodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBibG9jayk7CiAgfQogIGZ1bmN0aW9uIHZhcmRlZjEodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQodHlwZXVzZSwgdmFyZGVmMik7fQogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gdmFyZGVmMih0eXBlLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICI9IikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgdmFyZGVmMik7CiAgICBpZiAodHlwZSA9PSAiLCIpIHJldHVybiBjb250KHZhcmRlZjEpOwogIH0KICBmdW5jdGlvbiBmb3JzcGVjMSh0eXBlLCB2YWx1ZSkgewogIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHsKICAgIHJlZ2lzdGVyKHZhbHVlKTsKICB9CiAgcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLCBwdXNoY29udGV4dCwgZm9yaW4sIGV4cHJlc3Npb24sIHBvcGxleCwgc3RhdGVtZW50LCBwb3Bjb250ZXh0KTsKICB9CiAgZnVuY3Rpb24gZm9yaW4oX3R5cGUsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gImluIikgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gZnVuY3Rpb25kZWYodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHtyZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTt9CiAgICBpZiAodmFsdWUgPT0gIm5ldyIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLCBwdXNoY29udGV4dCwgY29tbWFzZXAoZnVuYXJnLCAiKSIpLCBwb3BsZXgsIHR5cGV1c2UsIHN0YXRlbWVudCwgcG9wY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHR5cGV1c2UodHlwZSkgewogICAgaWYodHlwZSA9PSAiOiIpIHJldHVybiBjb250KHR5cGVzdHJpbmcpOwogIH0KICBmdW5jdGlvbiB0eXBlc3RyaW5nKHR5cGUpIHsKICAgIGlmKHR5cGUgPT0gInR5cGUiKSByZXR1cm4gY29udCgpOwogICAgaWYodHlwZSA9PSAidmFyaWFibGUiKSByZXR1cm4gY29udCgpOwogICAgaWYodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgY29tbWFzZXAodHlwZXByb3AsICJ9IiksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIHR5cGVwcm9wKHR5cGUpIHsKICAgIGlmKHR5cGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIGNvbnQodHlwZXVzZSk7CiAgfQogIGZ1bmN0aW9uIGZ1bmFyZyh0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikge3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQodHlwZXVzZSk7fQogIH0KCiAgLy8gSW50ZXJmYWNlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICB2YXIgZGVmYXVsdHR5cGVzID0gWyJJbnQiLCAiRmxvYXQiLCAiU3RyaW5nIiwgIlZvaWQiLCAiU3RkIiwgIkJvb2wiLCAiRHluYW1pYyIsICJBcnJheSJdOwogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBoYXhlVG9rZW5CYXNlLAogICAgICAgIHJlQWxsb3dlZDogdHJ1ZSwKICAgICAgICBrd0FsbG93ZWQ6IHRydWUsCiAgICAgICAgY2M6IFtdLAogICAgICAgIGxleGljYWw6IG5ldyBIYXhlTGV4aWNhbCgoYmFzZWNvbHVtbiB8fCAwKSAtIGluZGVudFVuaXQsIDAsICJibG9jayIsIGZhbHNlKSwKICAgICAgICBsb2NhbFZhcnM6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnMsCiAgICBpbXBvcnRlZHR5cGVzOiBkZWZhdWx0dHlwZXMsIAogICAgICAgIGNvbnRleHQ6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnMgJiYge3ZhcnM6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnN9LAogICAgICAgIGluZGVudGVkOiAwCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoImFsaWduIikpCiAgICAgICAgICBzdGF0ZS5sZXhpY2FsLmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHR5cGUgPT0gImNvbW1lbnQiKSByZXR1cm4gc3R5bGU7CiAgICAgIHN0YXRlLnJlQWxsb3dlZCA9ICEhKHR5cGUgPT0gIm9wZXJhdG9yIiB8fCB0eXBlID09ICJrZXl3b3JkIGMiIHx8IHR5cGUubWF0Y2goL15bXFt7fVwoLDs6XSQvKSk7CiAgICAgIHN0YXRlLmt3QWxsb3dlZCA9IHR5cGUgIT0gJy4nOwogICAgICByZXR1cm4gcGFyc2VIYXhlKHN0YXRlLCBzdHlsZSwgdHlwZSwgY29udGVudCwgc3RyZWFtKTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSBoYXhlVG9rZW5CYXNlKSByZXR1cm4gMDsKICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApLCBsZXhpY2FsID0gc3RhdGUubGV4aWNhbDsKICAgICAgaWYgKGxleGljYWwudHlwZSA9PSAic3RhdCIgJiYgZmlyc3RDaGFyID09ICJ9IikgbGV4aWNhbCA9IGxleGljYWwucHJldjsKICAgICAgdmFyIHR5cGUgPSBsZXhpY2FsLnR5cGUsIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gdHlwZTsKICAgICAgaWYgKHR5cGUgPT0gInZhcmRlZiIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgNDsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZm9ybSIgJiYgZmlyc3RDaGFyID09ICJ7IikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQ7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInN0YXQiIHx8IHR5cGUgPT0gImZvcm0iKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIGluZGVudFVuaXQ7CiAgICAgIGVsc2UgaWYgKGxleGljYWwuaW5mbyA9PSAic3dpdGNoIiAmJiAhY2xvc2luZykKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArICgvXig/OmNhc2V8ZGVmYXVsdClcYi8udGVzdCh0ZXh0QWZ0ZXIpID8gaW5kZW50VW5pdCA6IDIgKiBpbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5hbGlnbikgcmV0dXJuIGxleGljYWwuY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaGF4ZSIsICJoYXhlIik7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/haxe/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEhheGUgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImhheGUuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IEhheGUgbW9kZTwvaDE+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CmltcG9ydCBvbmUudHdvLlRocmVlOwoKQGF0dHIoInRlc3QiKQpjbGFzcyBGb28mbHQ7VCZndDsgZXh0ZW5kcyBUaHJlZQp7CglwdWJsaWMgZnVuY3Rpb24gbmV3KCkKCXsKCQlub0ZvbyA9IDEyOwoJfQoJCglwdWJsaWMgc3RhdGljIGlubGluZSBmdW5jdGlvbiBkb0ZvbyhvYmo6e2s6SW50LCBsOkZsb2F0fSk6SW50Cgl7CgkJZm9yKGkgaW4gMC4uLjEwKQoJCXsKCQkJb2JqLmsrKzsKCQkJdHJhY2UoaSk7CgkJCXZhciB2YXIxID0gbmV3IEFycmF5KCk7CgkJCWlmKHZhcjEubGVuZ3RoID4gMSkKCQkJCXRocm93ICJFcnJvciI7CgkJfQoJCS8vIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgbm90IGJlIGNvbG9yZWQsIHRoZSB2YXJpYWJsZSBpcyBzY29wZWQgb3V0CgkJdmFyMTsKCQkvKiBNdWx0aSBsaW5lCgkJICogQ29tbWVudCB0ZXN0CgkJICovCgkJcmV0dXJuIG9iai5rOwoJfQoJcHJpdmF0ZSBmdW5jdGlvbiBiYXIoKTpWb2lkCgl7CgkJI2lmIGZsYXNoCgkJdmFyIHQxOlN0cmluZyA9ICIxLjIxIjsKCQkjZW5kCgkJdHJ5IHsKCQkJZG9Gb28oe2s6MywgbDoxLjJ9KTsKCQl9CgkJY2F0Y2ggKGUgOiBTdHJpbmcpIHsKCQkJdHJhY2UoZSk7CgkJfQoJCXZhciB0MjpGbG9hdCA9IGNhc3QoMy4yKTsKCQl2YXIgdDM6aGF4ZS5UaW1lciA9IG5ldyBoYXhlLlRpbWVyKCk7CgkJdmFyIHQ0ID0ge2s6U3RkLmludCh0MiksIGw6U3RkLnBhcnNlRmxvYXQodDEpfTsKCQl2YXIgdDUgPSB+LzEyMysuKiQvaTsKCQlkb0Zvbyh0NCk7CgkJdW50eXBlZCB0MSA9IDQ7CgkJYm9iID0gbmV3IEZvbyZsdDtJbnQmZ3Q7Cgl9CglwdWJsaWMgdmFyIG9rRm9vKGRlZmF1bHQsIG5ldmVyKTpGbG9hdDsKCXZhciBub0ZvbyhnZXRGb28sIG51bGwpOkludDsKCWZ1bmN0aW9uIGdldEZvbygpOkludCB7CgkJcmV0dXJuIG5vRm9vOwoJfQoJCglwdWJsaWMgdmFyIHRocmVlOkludDsKfQplbnVtIENvbG9yCnsKCXJlZDsKCWdyZWVuOwoJYmx1ZTsKCWdyZXkoIHYgOiBJbnQgKTsKCXJnYiAocjpJbnQsZzpJbnQsYjpJbnQpOwp9CjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1oYXhlPC9jb2RlPi48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/htmlembedded/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/htmlembedded/htmlembedded.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJodG1sZW1iZWRkZWQiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIAogIC8vY29uZmlnIHNldHRpbmdzCiAgdmFyIHNjcmlwdFN0YXJ0UmVnZXggPSBwYXJzZXJDb25maWcuc2NyaXB0U3RhcnRSZWdleCB8fCAvXjwlL2ksCiAgICAgIHNjcmlwdEVuZFJlZ2V4ID0gcGFyc2VyQ29uZmlnLnNjcmlwdEVuZFJlZ2V4IHx8IC9eJT4vaTsKICAKICAvL2lubmVyIG1vZGVzCiAgdmFyIHNjcmlwdGluZ01vZGUsIGh0bWxNaXhlZE1vZGU7CiAgCiAgLy90b2tlbml6ZXIgd2hlbiBpbiBodG1sIG1vZGUKICBmdW5jdGlvbiBodG1sRGlzcGF0Y2goc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKHNjcmlwdFN0YXJ0UmVnZXgsIGZhbHNlKSkgewogICAgICAgICAgc3RhdGUudG9rZW49c2NyaXB0aW5nRGlzcGF0Y2g7CiAgICAgICAgICByZXR1cm4gc2NyaXB0aW5nTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLnNjcmlwdFN0YXRlKTsKICAgICAgICAgIH0KICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIGh0bWxNaXhlZE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5odG1sU3RhdGUpOwogICAgfQoKICAvL3Rva2VuaXplciB3aGVuIGluIHNjcmlwdGluZyBtb2RlCiAgZnVuY3Rpb24gc2NyaXB0aW5nRGlzcGF0Y2goc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKHNjcmlwdEVuZFJlZ2V4LCBmYWxzZSkpICB7CiAgICAgICAgICBzdGF0ZS50b2tlbj1odG1sRGlzcGF0Y2g7CiAgICAgICAgICByZXR1cm4gaHRtbE1peGVkTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmh0bWxTdGF0ZSk7CiAgICAgICAgIH0KICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIHNjcmlwdGluZ01vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5zY3JpcHRTdGF0ZSk7CiAgICAgICAgIH0KCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgc2NyaXB0aW5nTW9kZSA9IHNjcmlwdGluZ01vZGUgfHwgQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgcGFyc2VyQ29uZmlnLnNjcmlwdGluZ01vZGVTcGVjKTsKICAgICAgaHRtbE1peGVkTW9kZSA9IGh0bWxNaXhlZE1vZGUgfHwgQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgImh0bWxtaXhlZCIpOwogICAgICByZXR1cm4geyAKICAgICAgICAgIHRva2VuIDogIHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBzY3JpcHRpbmdEaXNwYXRjaCA6IGh0bWxEaXNwYXRjaCwKICAgICAgICAgIGh0bWxTdGF0ZSA6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShodG1sTWl4ZWRNb2RlKSwKICAgICAgICAgIHNjcmlwdFN0YXRlIDogQ29kZU1pcnJvci5zdGFydFN0YXRlKHNjcmlwdGluZ01vZGUpCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbiA9PSBodG1sRGlzcGF0Y2gpCiAgICAgICAgcmV0dXJuIGh0bWxNaXhlZE1vZGUuaW5kZW50KHN0YXRlLmh0bWxTdGF0ZSwgdGV4dEFmdGVyKTsKICAgICAgZWxzZSBpZiAoc2NyaXB0aW5nTW9kZS5pbmRlbnQpCiAgICAgICAgcmV0dXJuIHNjcmlwdGluZ01vZGUuaW5kZW50KHN0YXRlLnNjcmlwdFN0YXRlLCB0ZXh0QWZ0ZXIpOwogICAgfSwKICAgIAogICAgY29weVN0YXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICByZXR1cm4gewogICAgICAgdG9rZW4gOiBzdGF0ZS50b2tlbiwKICAgICAgIGh0bWxTdGF0ZSA6IENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNaXhlZE1vZGUsIHN0YXRlLmh0bWxTdGF0ZSksCiAgICAgICBzY3JpcHRTdGF0ZSA6IENvZGVNaXJyb3IuY29weVN0YXRlKHNjcmlwdGluZ01vZGUsIHN0YXRlLnNjcmlwdFN0YXRlKQogICAgICB9OwogICAgfSwKICAgIAogICAgZWxlY3RyaWNDaGFyczogIi97fToiLAoKICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuID09IHNjcmlwdGluZ0Rpc3BhdGNoKSByZXR1cm4ge3N0YXRlOiBzdGF0ZS5zY3JpcHRTdGF0ZSwgbW9kZTogc2NyaXB0aW5nTW9kZX07CiAgICAgIGVsc2UgcmV0dXJuIHtzdGF0ZTogc3RhdGUuaHRtbFN0YXRlLCBtb2RlOiBodG1sTWl4ZWRNb2RlfTsKICAgIH0KICB9Owp9LCAiaHRtbG1peGVkIik7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtZWpzIiwgeyBuYW1lOiAiaHRtbGVtYmVkZGVkIiwgc2NyaXB0aW5nTW9kZVNwZWM6ImphdmFzY3JpcHQifSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1hc3B4IiwgeyBuYW1lOiAiaHRtbGVtYmVkZGVkIiwgc2NyaXB0aW5nTW9kZVNwZWM6InRleHQveC1jc2hhcnAifSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1qc3AiLCB7IG5hbWU6ICJodG1sZW1iZWRkZWQiLCBzY3JpcHRpbmdNb2RlU3BlYzoidGV4dC94LWphdmEifSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1lcmIiLCB7IG5hbWU6ICJodG1sZW1iZWRkZWQiLCBzY3JpcHRpbmdNb2RlU3BlYzoicnVieSJ9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/htmlembedded/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEh0bWwgRW1iZWRkZWQgU2NyaXB0cyBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9jc3MvY3NzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodG1sZW1iZWRkZWQuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IEh0bWwgRW1iZWRkZWQgU2NyaXB0cyBtb2RlPC9oMT4KCjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjwlCmZ1bmN0aW9uIGhlbGxvKHdobykgewoJcmV0dXJuICJIZWxsbyAiICsgd2hvOwp9CiU+ClRoaXMgaXMgYW4gZXhhbXBsZSBvZiBFSlMgKGVtYmVkZGVkIGphdmFzY3JpcHQpCjxwPlRoZSBwcm9ncmFtIHNheXMgPCU9IGhlbGxvKCJ3b3JsZCIpICU+LjwvcD4KPHNjcmlwdD4KCWFsZXJ0KCJBbmQgaGVyZSBpcyBzb21lIG5vcm1hbCBKUyBjb2RlIik7IC8vIGFsc28gY29sb3JlZAo8L3NjcmlwdD4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAiYXBwbGljYXRpb24veC1lanMiLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgaW5kZW50V2l0aFRhYnM6IHRydWUsCiAgICAgICAgZW50ZXJNb2RlOiAia2VlcCIsCiAgICAgICAgdGFiTW9kZTogInNoaWZ0IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPk1vZGUgZm9yIGh0bWwgZW1iZWRkZWQgc2NyaXB0cyBsaWtlIEpTUCBhbmQgQVNQLk5FVC4gRGVwZW5kcyBvbiBIdG1sTWl4ZWQgd2hpY2ggaW4gdHVybiBkZXBlbmRzIG9uCiAgICBKYXZhU2NyaXB0LCBDU1MgYW5kIFhNTC48YnIgLz5PdGhlciBkZXBlbmRhbmNpZXMgaW5jbHVkZSB0aG9zZSBvZiB0aGUgc2NyaXBpbmcgbGFuZ3VhZ2UgY2hvc2VuLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24veC1hc3B4PC9jb2RlPiAoQVNQLk5FVCksIAogICAgPGNvZGU+YXBwbGljYXRpb24veC1lanM8L2NvZGU+IChFbWJlZGRlZCBKYXZhc2NyaXB0KSwgPGNvZGU+YXBwbGljYXRpb24veC1qc3A8L2NvZGU+IChKYXZhU2VydmVyIFBhZ2VzKTwvcD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/htmlmixed/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/htmlmixed/htmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJodG1sbWl4ZWQiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaHRtbE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCB7bmFtZTogInhtbCIsIGh0bWxNb2RlOiB0cnVlfSk7CiAgdmFyIGpzTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJqYXZhc2NyaXB0Iik7CiAgdmFyIGNzc01vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAiY3NzIik7CgogIGZ1bmN0aW9uIGh0bWwoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHN0eWxlID0gaHRtbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5odG1sU3RhdGUpOwogICAgaWYgKC8oPzpefFxzKXRhZyg/OlxzfCQpLy50ZXN0KHN0eWxlKSAmJiBzdHJlYW0uY3VycmVudCgpID09ICI+IiAmJiBzdGF0ZS5odG1sU3RhdGUuY29udGV4dCkgewogICAgICBpZiAoL15zY3JpcHQkL2kudGVzdChzdGF0ZS5odG1sU3RhdGUuY29udGV4dC50YWdOYW1lKSkgewogICAgICAgIHN0YXRlLnRva2VuID0gamF2YXNjcmlwdDsKICAgICAgICBzdGF0ZS5sb2NhbFN0YXRlID0ganNNb2RlLnN0YXJ0U3RhdGUoaHRtbE1vZGUuaW5kZW50KHN0YXRlLmh0bWxTdGF0ZSwgIiIpKTsKICAgICAgfQogICAgICBlbHNlIGlmICgvXnN0eWxlJC9pLnRlc3Qoc3RhdGUuaHRtbFN0YXRlLmNvbnRleHQudGFnTmFtZSkpIHsKICAgICAgICBzdGF0ZS50b2tlbiA9IGNzczsKICAgICAgICBzdGF0ZS5sb2NhbFN0YXRlID0gY3NzTW9kZS5zdGFydFN0YXRlKGh0bWxNb2RlLmluZGVudChzdGF0ZS5odG1sU3RhdGUsICIiKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdHlsZTsKICB9CiAgZnVuY3Rpb24gbWF5YmVCYWNrdXAoc3RyZWFtLCBwYXQsIHN0eWxlKSB7CiAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgIHZhciBjbG9zZSA9IGN1ci5zZWFyY2gocGF0KSwgbTsKICAgIGlmIChjbG9zZSA+IC0xKSBzdHJlYW0uYmFja1VwKGN1ci5sZW5ndGggLSBjbG9zZSk7CiAgICBlbHNlIGlmIChtID0gY3VyLm1hdGNoKC88XC8/JC8pKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoY3VyLmxlbmd0aCk7CiAgICAgIGlmICghc3RyZWFtLm1hdGNoKHBhdCwgZmFsc2UpKSBzdHJlYW0ubWF0Y2goY3VyWzBdKTsKICAgIH0KICAgIHJldHVybiBzdHlsZTsKICB9CiAgZnVuY3Rpb24gamF2YXNjcmlwdChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9ePFwvXHMqc2NyaXB0XHMqPi9pLCBmYWxzZSkpIHsKICAgICAgc3RhdGUudG9rZW4gPSBodG1sOwogICAgICBzdGF0ZS5sb2NhbFN0YXRlID0gbnVsbDsKICAgICAgcmV0dXJuIGh0bWwoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICByZXR1cm4gbWF5YmVCYWNrdXAoc3RyZWFtLCAvPFwvXHMqc2NyaXB0XHMqPi8sCiAgICAgICAgICAgICAgICAgICAgICAganNNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSkpOwogIH0KICBmdW5jdGlvbiBjc3Moc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXjxcL1xzKnN0eWxlXHMqPi9pLCBmYWxzZSkpIHsKICAgICAgc3RhdGUudG9rZW4gPSBodG1sOwogICAgICBzdGF0ZS5sb2NhbFN0YXRlID0gbnVsbDsKICAgICAgcmV0dXJuIGh0bWwoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICByZXR1cm4gbWF5YmVCYWNrdXAoc3RyZWFtLCAvPFwvXHMqc3R5bGVccyo+LywKICAgICAgICAgICAgICAgICAgICAgICBjc3NNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSkpOwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc3RhdGUgPSBodG1sTW9kZS5zdGFydFN0YXRlKCk7CiAgICAgIHJldHVybiB7dG9rZW46IGh0bWwsIGxvY2FsU3RhdGU6IG51bGwsIG1vZGU6ICJodG1sIiwgaHRtbFN0YXRlOiBzdGF0ZX07CiAgICB9LAoKICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLmxvY2FsU3RhdGUpCiAgICAgICAgdmFyIGxvY2FsID0gQ29kZU1pcnJvci5jb3B5U3RhdGUoc3RhdGUudG9rZW4gPT0gY3NzID8gY3NzTW9kZSA6IGpzTW9kZSwgc3RhdGUubG9jYWxTdGF0ZSk7CiAgICAgIHJldHVybiB7dG9rZW46IHN0YXRlLnRva2VuLCBsb2NhbFN0YXRlOiBsb2NhbCwgbW9kZTogc3RhdGUubW9kZSwKICAgICAgICAgICAgICBodG1sU3RhdGU6IENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNb2RlLCBzdGF0ZS5odG1sU3RhdGUpfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuKHN0cmVhbSwgc3RhdGUpOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuID09IGh0bWwgfHwgL15ccyo8XC8vLnRlc3QodGV4dEFmdGVyKSkKICAgICAgICByZXR1cm4gaHRtbE1vZGUuaW5kZW50KHN0YXRlLmh0bWxTdGF0ZSwgdGV4dEFmdGVyKTsKICAgICAgZWxzZSBpZiAoc3RhdGUudG9rZW4gPT0gamF2YXNjcmlwdCkKICAgICAgICByZXR1cm4ganNNb2RlLmluZGVudChzdGF0ZS5sb2NhbFN0YXRlLCB0ZXh0QWZ0ZXIpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGNzc01vZGUuaW5kZW50KHN0YXRlLmxvY2FsU3RhdGUsIHRleHRBZnRlcik7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICIve306IiwKCiAgICBpbm5lck1vZGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIHZhciBtb2RlID0gc3RhdGUudG9rZW4gPT0gaHRtbCA/IGh0bWxNb2RlIDogc3RhdGUudG9rZW4gPT0gamF2YXNjcmlwdCA/IGpzTW9kZSA6IGNzc01vZGU7CiAgICAgIHJldHVybiB7c3RhdGU6IHN0YXRlLmxvY2FsU3RhdGUgfHwgc3RhdGUuaHRtbFN0YXRlLCBtb2RlOiBtb2RlfTsKICAgIH0KICB9Owp9LCAieG1sIiwgImphdmFzY3JpcHQiLCAiY3NzIik7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvaHRtbCIsICJodG1sbWl4ZWQiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/htmlmixed/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEhUTUwgbWl4ZWQgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IEhUTUwgbWl4ZWQgbW9kZTwvaDE+CiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo8aHRtbCBzdHlsZT0iY29sb3I6IGdyZWVuIj4KICA8IS0tIHRoaXMgaXMgYSBjb21tZW50IC0tPgogIDxoZWFkPgogICAgPHRpdGxlPk1peGVkIEhUTUwgRXhhbXBsZTwvdGl0bGU+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICBoMSB7Zm9udC1mYW1pbHk6IGNvbWljIHNhbnM7IGNvbG9yOiAjZjBmO30KICAgICAgZGl2IHtiYWNrZ3JvdW5kOiB5ZWxsb3cgIWltcG9ydGFudDt9CiAgICAgIGJvZHkgewogICAgICAgIG1heC13aWR0aDogNTBlbTsKICAgICAgICBtYXJnaW46IDFlbSAyZW0gMWVtIDVlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+TWl4ZWQgSFRNTCBFeGFtcGxlPC9oMT4KICAgIDxzY3JpcHQ+CiAgICAgIGZ1bmN0aW9uIGpzRnVuYyhhcmcxLCBhcmcyKSB7CiAgICAgICAgaWYgKGFyZzEgJiYgYXJnMikgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAiYWNob28iOwogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge21vZGU6ICJ0ZXh0L2h0bWwiLCB0YWJNb2RlOiAiaW5kZW50In0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+VGhlIEhUTUwgbWl4ZWQgbW9kZSBkZXBlbmRzIG9uIHRoZSBYTUwsIEphdmFTY3JpcHQsIGFuZCBDU1MgbW9kZXMuPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+CiAgICAocmVkZWZpbmVkLCBvbmx5IHRha2VzIGVmZmVjdCBpZiB5b3UgbG9hZCB0aGlzIHBhcnNlciBhZnRlciB0aGUKICAgIFhNTCBwYXJzZXIpLjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/http/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/http/http.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJodHRwIiwgZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gZmFpbEZpcnN0TGluZShzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICBzdGF0ZS5jdXIgPSBoZWFkZXI7CiAgICByZXR1cm4gImVycm9yIjsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15IVFRQXC9cZFwuXGQvKSkgewogICAgICBzdGF0ZS5jdXIgPSByZXNwb25zZVN0YXR1c0NvZGU7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXltBLVpdKy8pICYmIC9bIFx0XS8udGVzdChzdHJlYW0ucGVlaygpKSkgewogICAgICBzdGF0ZS5jdXIgPSByZXF1ZXN0UGF0aDsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWlsRmlyc3RMaW5lKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzcG9uc2VTdGF0dXNDb2RlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjb2RlID0gc3RyZWFtLm1hdGNoKC9eXGQrLyk7CiAgICBpZiAoIWNvZGUpIHJldHVybiBmYWlsRmlyc3RMaW5lKHN0cmVhbSwgc3RhdGUpOwoKICAgIHN0YXRlLmN1ciA9IHJlc3BvbnNlU3RhdHVzVGV4dDsKICAgIHZhciBzdGF0dXMgPSBOdW1iZXIoY29kZVswXSk7CiAgICBpZiAoc3RhdHVzID49IDEwMCAmJiBzdGF0dXMgPCAyMDApIHsKICAgICAgcmV0dXJuICJwb3NpdGl2ZSBpbmZvcm1hdGlvbmFsIjsKICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDApIHsKICAgICAgcmV0dXJuICJwb3NpdGl2ZSBzdWNjZXNzIjsKICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDMwMCAmJiBzdGF0dXMgPCA0MDApIHsKICAgICAgcmV0dXJuICJwb3NpdGl2ZSByZWRpcmVjdCI7CiAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDAgJiYgc3RhdHVzIDwgNTAwKSB7CiAgICAgIHJldHVybiAibmVnYXRpdmUgY2xpZW50LWVycm9yIjsKICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDUwMCAmJiBzdGF0dXMgPCA2MDApIHsKICAgICAgcmV0dXJuICJuZWdhdGl2ZSBzZXJ2ZXItZXJyb3IiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJlcnJvciI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZXNwb25zZVN0YXR1c1RleHQoc3RyZWFtLCBzdGF0ZSkgewogICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgc3RhdGUuY3VyID0gaGVhZGVyOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiByZXF1ZXN0UGF0aChzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0uZWF0V2hpbGUoL1xTLyk7CiAgICBzdGF0ZS5jdXIgPSByZXF1ZXN0UHJvdG9jb2w7CiAgICByZXR1cm4gInN0cmluZy0yIjsKICB9CgogIGZ1bmN0aW9uIHJlcXVlc3RQcm90b2NvbChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eSFRUUFwvXGRcLlxkJC8pKSB7CiAgICAgIHN0YXRlLmN1ciA9IGhlYWRlcjsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWlsRmlyc3RMaW5lKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaGVhZGVyKHN0cmVhbSkgewogICAgaWYgKHN0cmVhbS5zb2woKSAmJiAhc3RyZWFtLmVhdCgvWyBcdF0vKSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLio/Oi8pKSB7CiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJlcnJvciI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYm9keShzdHJlYW0pIHsKICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdXIgPSBzdGF0ZS5jdXI7CiAgICAgIGlmIChjdXIgIT0gaGVhZGVyICYmIGN1ciAhPSBib2R5ICYmIHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIGN1cihzdHJlYW0sIHN0YXRlKTsKICAgIH0sCgogICAgYmxhbmtMaW5lOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICBzdGF0ZS5jdXIgPSBib2R5OwogICAgfSwKCiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHtjdXI6IHN0YXJ0fTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgibWVzc2FnZS9odHRwIiwgImh0dHAiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/http/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEhUVFAgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHAuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IEhUVFAgbW9kZTwvaDE+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+ClBPU1QgL3NvbWV3aGVyZSBIVFRQLzEuMQpIb3N0OiBleGFtcGxlLmNvbQpJZi1Nb2RpZmllZC1TaW5jZTogU2F0LCAyOSBPY3QgMTk5NCAxOTo0MzozMSBHTVQKQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7CgljaGFyc2V0PXV0Zi04ClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM2LjExIChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1LzEyLjA0IENocm9taXVtLzIwLjAuMTEzMi40NyBDaHJvbWUvMjAuMC4xMTMyLjQ3IFNhZmFyaS81MzYuMTEKClRoaXMgaXMgdGhlIHJlcXVlc3QgYm9keSEKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPm1lc3NhZ2UvaHR0cDwvY29kZT4uPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/javascript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/javascript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEphdmFTY3JpcHQgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi91dGlsL21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi91dGlsL2NvbnRpbnVlY29tbWVudC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogSmF2YVNjcmlwdCBtb2RlPC9oMT4KCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLy8gRGVtbyBjb2RlICh0aGUgYWN0dWFsIG5ldyBwYXJzZXIgY2hhcmFjdGVyIHN0cmVhbSBpbXBsZW1lbnRhdGlvbikKCmZ1bmN0aW9uIFN0cmluZ1N0cmVhbShzdHJpbmcpIHsKICB0aGlzLnBvcyA9IDA7CiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cn0KClN0cmluZ1N0cmVhbS5wcm90b3R5cGUgPSB7CiAgZG9uZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID49IHRoaXMuc3RyaW5nLmxlbmd0aDt9LAogIHBlZWs6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpO30sCiAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wb3MgJmx0OyB0aGlzLnN0cmluZy5sZW5ndGgpCiAgICAgIHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MrKyk7CiAgfSwKICBlYXQ6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICB2YXIgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpOwogICAgaWYgKHR5cGVvZiBtYXRjaCA9PSAic3RyaW5nIikgdmFyIG9rID0gY2ggPT0gbWF0Y2g7CiAgICBlbHNlIHZhciBvayA9IGNoICZhbXA7JmFtcDsgbWF0Y2gudGVzdCA/IG1hdGNoLnRlc3QoY2gpIDogbWF0Y2goY2gpOwogICAgaWYgKG9rKSB7dGhpcy5wb3MrKzsgcmV0dXJuIGNoO30KICB9LAogIGVhdFdoaWxlOiBmdW5jdGlvbihtYXRjaCkgewogICAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7CiAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKTsKICAgIGlmICh0aGlzLnBvcyA+IHN0YXJ0KSByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2Uoc3RhcnQsIHRoaXMucG9zKTsKICB9LAogIGJhY2tVcDogZnVuY3Rpb24obikge3RoaXMucG9zIC09IG47fSwKICBjb2x1bW46IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvczt9LAogIGVhdFNwYWNlOiBmdW5jdGlvbigpIHsKICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgd2hpbGUgKC9ccy8udGVzdCh0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpKSkgdGhpcy5wb3MrKzsKICAgIHJldHVybiB0aGlzLnBvcyAtIHN0YXJ0OwogIH0sCiAgbWF0Y2g6IGZ1bmN0aW9uKHBhdHRlcm4sIGNvbnN1bWUsIGNhc2VJbnNlbnNpdGl2ZSkgewogICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09ICJzdHJpbmciKSB7CiAgICAgIGZ1bmN0aW9uIGNhc2VkKHN0cikge3JldHVybiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjt9CiAgICAgIGlmIChjYXNlZCh0aGlzLnN0cmluZykuaW5kZXhPZihjYXNlZChwYXR0ZXJuKSwgdGhpcy5wb3MpID09IHRoaXMucG9zKSB7CiAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKSB0aGlzLnBvcyArPSBzdHIubGVuZ3RoOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgdmFyIG1hdGNoID0gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pOwogICAgICBpZiAobWF0Y2ggJmFtcDsmYW1wOyBjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICByZXR1cm4gbWF0Y2g7CiAgICB9CiAgfQp9Owo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBleHRyYUtleXM6IHsiRW50ZXIiOiAibmV3bGluZUFuZEluZGVudENvbnRpbnVlQ29tbWVudCJ9CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+CiAgICAgIEphdmFTY3JpcHQgbW9kZSBzdXBwb3J0cyBhIHR3byBjb25maWd1cmF0aW9uCiAgICAgIG9wdGlvbnM6CiAgICAgIDx1bD4KICAgICAgICA8bGk+PGNvZGU+anNvbjwvY29kZT4gd2hpY2ggd2lsbCBzZXQgdGhlIG1vZGUgdG8gZXhwZWN0IEpTT04gZGF0YSByYXRoZXIgdGhhbiBhIEphdmFTY3JpcHQgcHJvZ3JhbS48L2xpPgogICAgICAgIDxsaT4KICAgICAgICAgIDxjb2RlPnR5cGVzY3JpcHQ8L2NvZGU+IHdoaWNoIHdpbGwgYWN0aXZhdGUgYWRkaXRpb25hbCBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBzb21lIG90aGVyIHRoaW5ncyBmb3IgVHlwZVNjcmlwdCBjb2RlICg8YSBocmVmPSJ0eXBlc2NyaXB0Lmh0bWwiPmRlbW88L2E+KS4KICAgICAgICA8L2xpPgogICAgICA8L3VsPgogICAgPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L2phdmFzY3JpcHQ8L2NvZGU+LCA8Y29kZT5hcHBsaWNhdGlvbi9qc29uPC9jb2RlPiwgPGNvZGU+dGV4dC90eXBlc2NyaXB0PC9jb2RlPiwgPGNvZGU+YXBwbGljYXRpb24vdHlwZXNjcmlwdDwvY29kZT4uPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/javascript/javascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gVE9ETyBhY3R1YWxseSByZWNvZ25pemUgc3ludGF4IG9mIFR5cGVTY3JpcHQgY29uc3RydWN0cwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwogIHZhciBqc29uTW9kZSA9IHBhcnNlckNvbmZpZy5qc29uOwogIHZhciBpc1RTID0gcGFyc2VyQ29uZmlnLnR5cGVzY3JpcHQ7CgogIC8vIFRva2VuaXplcgoKICB2YXIga2V5d29yZHMgPSBmdW5jdGlvbigpewogICAgZnVuY3Rpb24ga3codHlwZSkge3JldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6ICJrZXl3b3JkIn07fQogICAgdmFyIEEgPSBrdygia2V5d29yZCBhIiksIEIgPSBrdygia2V5d29yZCBiIiksIEMgPSBrdygia2V5d29yZCBjIik7CiAgICB2YXIgb3BlcmF0b3IgPSBrdygib3BlcmF0b3IiKSwgYXRvbSA9IHt0eXBlOiAiYXRvbSIsIHN0eWxlOiAiYXRvbSJ9OwogICAgCiAgICB2YXIganNLZXl3b3JkcyA9IHsKICAgICAgImlmIjogQSwgIndoaWxlIjogQSwgIndpdGgiOiBBLCAiZWxzZSI6IEIsICJkbyI6IEIsICJ0cnkiOiBCLCAiZmluYWxseSI6IEIsCiAgICAgICJyZXR1cm4iOiBDLCAiYnJlYWsiOiBDLCAiY29udGludWUiOiBDLCAibmV3IjogQywgImRlbGV0ZSI6IEMsICJ0aHJvdyI6IEMsCiAgICAgICJ2YXIiOiBrdygidmFyIiksICJjb25zdCI6IGt3KCJ2YXIiKSwgImxldCI6IGt3KCJ2YXIiKSwKICAgICAgImZ1bmN0aW9uIjoga3coImZ1bmN0aW9uIiksICJjYXRjaCI6IGt3KCJjYXRjaCIpLAogICAgICAiZm9yIjoga3coImZvciIpLCAic3dpdGNoIjoga3coInN3aXRjaCIpLCAiY2FzZSI6IGt3KCJjYXNlIiksICJkZWZhdWx0Ijoga3coImRlZmF1bHQiKSwKICAgICAgImluIjogb3BlcmF0b3IsICJ0eXBlb2YiOiBvcGVyYXRvciwgImluc3RhbmNlb2YiOiBvcGVyYXRvciwKICAgICAgInRydWUiOiBhdG9tLCAiZmFsc2UiOiBhdG9tLCAibnVsbCI6IGF0b20sICJ1bmRlZmluZWQiOiBhdG9tLCAiTmFOIjogYXRvbSwgIkluZmluaXR5IjogYXRvbQogICAgfTsKCiAgICAvLyBFeHRlbmQgdGhlICdub3JtYWwnIGtleXdvcmRzIHdpdGggdGhlIFR5cGVTY3JpcHQgbGFuZ3VhZ2UgZXh0ZW5zaW9ucwogICAgaWYgKGlzVFMpIHsKICAgICAgdmFyIHR5cGUgPSB7dHlwZTogInZhcmlhYmxlIiwgc3R5bGU6ICJ2YXJpYWJsZS0zIn07CiAgICAgIHZhciB0c0tleXdvcmRzID0gewogICAgICAgIC8vIG9iamVjdC1saWtlIHRoaW5ncwogICAgICAgICJpbnRlcmZhY2UiOiBrdygiaW50ZXJmYWNlIiksCiAgICAgICAgImNsYXNzIjoga3coImNsYXNzIiksCiAgICAgICAgImV4dGVuZHMiOiBrdygiZXh0ZW5kcyIpLAogICAgICAgICJjb25zdHJ1Y3RvciI6IGt3KCJjb25zdHJ1Y3RvciIpLAoKICAgICAgICAvLyBzY29wZSBtb2RpZmllcnMKICAgICAgICAicHVibGljIjoga3coInB1YmxpYyIpLAogICAgICAgICJwcml2YXRlIjoga3coInByaXZhdGUiKSwKICAgICAgICAicHJvdGVjdGVkIjoga3coInByb3RlY3RlZCIpLAogICAgICAgICJzdGF0aWMiOiBrdygic3RhdGljIiksCgogICAgICAgICJzdXBlciI6IGt3KCJzdXBlciIpLAoKICAgICAgICAvLyB0eXBlcwogICAgICAgICJzdHJpbmciOiB0eXBlLCAibnVtYmVyIjogdHlwZSwgImJvb2wiOiB0eXBlLCAiYW55IjogdHlwZQogICAgICB9OwoKICAgICAgZm9yICh2YXIgYXR0ciBpbiB0c0tleXdvcmRzKSB7CiAgICAgICAganNLZXl3b3Jkc1thdHRyXSA9IHRzS2V5d29yZHNbYXR0cl07CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4ganNLZXl3b3JkczsKICB9KCk7CgogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiYlPTw+IT98XS87CgogIGZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIGYpIHsKICAgIHN0YXRlLnRva2VuaXplID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gbmV4dFVudGlsVW5lc2NhcGVkKHN0cmVhbSwgZW5kKSB7CiAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0OwogICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAobmV4dCA9PSBlbmQgJiYgIWVzY2FwZWQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgfQogICAgcmV0dXJuIGVzY2FwZWQ7CiAgfQoKICAvLyBVc2VkIGFzIHNjcmF0Y2ggdmFyaWFibGVzIHRvIGNvbW11bmljYXRlIG11bHRpcGxlIHZhbHVlcyB3aXRob3V0CiAgLy8gY29uc2luZyB1cCB0b25zIG9mIG9iamVjdHMuCiAgdmFyIHR5cGUsIGNvbnRlbnQ7CiAgZnVuY3Rpb24gcmV0KHRwLCBzdHlsZSwgY29udCkgewogICAgdHlwZSA9IHRwOyBjb250ZW50ID0gY29udDsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIGZ1bmN0aW9uIGpzVG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIGpzVG9rZW5TdHJpbmcoY2gpKTsKICAgIGVsc2UgaWYgKC9bXFtcXXt9XChcKSw7XDpcLl0vLnRlc3QoY2gpKQogICAgICByZXR1cm4gcmV0KGNoKTsKICAgIGVsc2UgaWYgKGNoID09ICIwIiAmJiBzdHJlYW0uZWF0KC94L2kpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xkYS1mXS9pKTsKICAgICAgcmV0dXJuIHJldCgibnVtYmVyIiwgIm51bWJlciIpOwogICAgfSAgICAgIAogICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSB8fCBjaCA9PSAiLSIgJiYgc3RyZWFtLmVhdCgvXGQvKSkgewogICAgICBzdHJlYW0ubWF0Y2goL15cZCooPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/Lyk7CiAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIGpzVG9rZW5Db21tZW50KTsKICAgICAgfQogICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc3RhdGUubGFzdFR5cGUgPT0gIm9wZXJhdG9yIiB8fCBzdGF0ZS5sYXN0VHlwZSA9PSAia2V5d29yZCBjIiB8fAogICAgICAgICAgICAgICAvXltcW3t9XCgsOzpdJC8udGVzdChzdGF0ZS5sYXN0VHlwZSkpIHsKICAgICAgICBuZXh0VW50aWxVbmVzY2FwZWQoc3RyZWFtLCAiLyIpOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW2dpbXldLyk7IC8vICd5JyBpcyAic3RpY2t5IiBvcHRpb24gaW4gTW96aWxsYQogICAgICAgIHJldHVybiByZXQoInJlZ2V4cCIsICJzdHJpbmctMiIpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgICAgcmV0dXJuIHJldCgib3BlcmF0b3IiLCBudWxsLCBzdHJlYW0uY3VycmVudCgpKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiByZXQoImVycm9yIiwgImVycm9yIik7CiAgICB9CiAgICBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gcmV0KCJvcGVyYXRvciIsIG51bGwsIHN0cmVhbS5jdXJyZW50KCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCksIGtub3duID0ga2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkgJiYga2V5d29yZHNbd29yZF07CiAgICAgIHJldHVybiAoa25vd24gJiYgc3RhdGUubGFzdFR5cGUgIT0gIi4iKSA/IHJldChrbm93bi50eXBlLCBrbm93bi5zdHlsZSwgd29yZCkgOgogICAgICAgICAgICAgICAgICAgICByZXQoInZhcmlhYmxlIiwgInZhcmlhYmxlIiwgd29yZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBqc1Rva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoIW5leHRVbnRpbFVuZXNjYXBlZChzdHJlYW0sIHF1b3RlKSkKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGpzVG9rZW5CYXNlOwogICAgICByZXR1cm4gcmV0KCJzdHJpbmciLCAic3RyaW5nIik7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24ganNUb2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBqc1Rva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgfQoKICAvLyBQYXJzZXIKCiAgdmFyIGF0b21pY1R5cGVzID0geyJhdG9tIjogdHJ1ZSwgIm51bWJlciI6IHRydWUsICJ2YXJpYWJsZSI6IHRydWUsICJzdHJpbmciOiB0cnVlLCAicmVnZXhwIjogdHJ1ZX07CgogIGZ1bmN0aW9uIEpTTGV4aWNhbChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldiwgaW5mbykgewogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgICBpZiAoYWxpZ24gIT0gbnVsbCkgdGhpcy5hbGlnbiA9IGFsaWduOwogIH0KCiAgZnVuY3Rpb24gaW5TY29wZShzdGF0ZSwgdmFybmFtZSkgewogICAgZm9yICh2YXIgdiA9IHN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkKICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlSlMoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pIHsKICAgIHZhciBjYyA9IHN0YXRlLmNjOwogICAgLy8gQ29tbXVuaWNhdGUgb3VyIGNvbnRleHQgdG8gdGhlIGNvbWJpbmF0b3JzLgogICAgLy8gKExlc3Mgd2FzdGVmdWwgdGhhbiBjb25zaW5nIHVwIGEgaHVuZHJlZCBjbG9zdXJlcyBvbiBldmVyeSBjYWxsLikKICAgIGN4LnN0YXRlID0gc3RhdGU7IGN4LnN0cmVhbSA9IHN0cmVhbTsgY3gubWFya2VkID0gbnVsbCwgY3guY2MgPSBjYzsKICAKICAgIGlmICghc3RhdGUubGV4aWNhbC5oYXNPd25Qcm9wZXJ0eSgiYWxpZ24iKSkKICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgd2hpbGUodHJ1ZSkgewogICAgICB2YXIgY29tYmluYXRvciA9IGNjLmxlbmd0aCA/IGNjLnBvcCgpIDoganNvbk1vZGUgPyBleHByZXNzaW9uIDogc3RhdGVtZW50OwogICAgICBpZiAoY29tYmluYXRvcih0eXBlLCBjb250ZW50KSkgewogICAgICAgIHdoaWxlKGNjLmxlbmd0aCAmJiBjY1tjYy5sZW5ndGggLSAxXS5sZXgpCiAgICAgICAgICBjYy5wb3AoKSgpOwogICAgICAgIGlmIChjeC5tYXJrZWQpIHJldHVybiBjeC5tYXJrZWQ7CiAgICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIiAmJiBpblNjb3BlKHN0YXRlLCBjb250ZW50KSkgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIENvbWJpbmF0b3IgdXRpbHMKCiAgdmFyIGN4ID0ge3N0YXRlOiBudWxsLCBjb2x1bW46IG51bGwsIG1hcmtlZDogbnVsbCwgY2M6IG51bGx9OwogIGZ1bmN0aW9uIHBhc3MoKSB7CiAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBjeC5jYy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgfQogIGZ1bmN0aW9uIGNvbnQoKSB7CiAgICBwYXNzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gcmVnaXN0ZXIodmFybmFtZSkgewogICAgdmFyIHN0YXRlID0gY3guc3RhdGU7CiAgICBpZiAoc3RhdGUuY29udGV4dCkgewogICAgICBjeC5tYXJrZWQgPSAiZGVmIjsKICAgICAgZm9yICh2YXIgdiA9IHN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkKICAgICAgICBpZiAodi5uYW1lID09IHZhcm5hbWUpIHJldHVybjsKICAgICAgc3RhdGUubG9jYWxWYXJzID0ge25hbWU6IHZhcm5hbWUsIG5leHQ6IHN0YXRlLmxvY2FsVmFyc307CiAgICB9CiAgfQoKICAvLyBDb21iaW5hdG9ycwoKICB2YXIgZGVmYXVsdFZhcnMgPSB7bmFtZTogInRoaXMiLCBuZXh0OiB7bmFtZTogImFyZ3VtZW50cyJ9fTsKICBmdW5jdGlvbiBwdXNoY29udGV4dCgpIHsKICAgIGN4LnN0YXRlLmNvbnRleHQgPSB7cHJldjogY3guc3RhdGUuY29udGV4dCwgdmFyczogY3guc3RhdGUubG9jYWxWYXJzfTsKICAgIGN4LnN0YXRlLmxvY2FsVmFycyA9IGRlZmF1bHRWYXJzOwogIH0KICBmdW5jdGlvbiBwb3Bjb250ZXh0KCkgewogICAgY3guc3RhdGUubG9jYWxWYXJzID0gY3guc3RhdGUuY29udGV4dC52YXJzOwogICAgY3guc3RhdGUuY29udGV4dCA9IGN4LnN0YXRlLmNvbnRleHQucHJldjsKICB9CiAgZnVuY3Rpb24gcHVzaGxleCh0eXBlLCBpbmZvKSB7CiAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgICBzdGF0ZS5sZXhpY2FsID0gbmV3IEpTTGV4aWNhbChzdGF0ZS5pbmRlbnRlZCwgY3guc3RyZWFtLmNvbHVtbigpLCB0eXBlLCBudWxsLCBzdGF0ZS5sZXhpY2FsLCBpbmZvKTsKICAgIH07CiAgICByZXN1bHQubGV4ID0gdHJ1ZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHBvcGxleCgpIHsKICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgaWYgKHN0YXRlLmxleGljYWwucHJldikgewogICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09ICIpIikKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7CiAgICAgIHN0YXRlLmxleGljYWwgPSBzdGF0ZS5sZXhpY2FsLnByZXY7CiAgICB9CiAgfQogIHBvcGxleC5sZXggPSB0cnVlOwoKICBmdW5jdGlvbiBleHBlY3Qod2FudGVkKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gZXhwZWN0aW5nKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gd2FudGVkKSByZXR1cm4gY29udCgpOwogICAgICBlbHNlIGlmICh3YW50ZWQgPT0gIjsiKSByZXR1cm4gcGFzcygpOwogICAgICBlbHNlIHJldHVybiBjb250KGFyZ3VtZW50cy5jYWxsZWUpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyIikgcmV0dXJuIGNvbnQocHVzaGxleCgidmFyZGVmIiksIHZhcmRlZjEsIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gImtleXdvcmQgYSIpIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwcmVzc2lvbiwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gImtleXdvcmQgYiIpIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ9IiksIGJsb2NrLCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udCgpOwogICAgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgaWYgKHR5cGUgPT0gImZvciIpIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwZWN0KCIoIiksIHB1c2hsZXgoIikiKSwgZm9yc3BlYzEsIGV4cGVjdCgiKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGxleCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIGNvbnQocHVzaGxleCgic3RhdCIpLCBtYXliZWxhYmVsKTsKICAgIGlmICh0eXBlID09ICJzd2l0Y2giKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIHB1c2hsZXgoIn0iLCAic3dpdGNoIiksIGV4cGVjdCgieyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAiY2FzZSIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiOiIpKTsKICAgIGlmICh0eXBlID09ICJkZWZhdWx0IikgcmV0dXJuIGNvbnQoZXhwZWN0KCI6IikpOwogICAgaWYgKHR5cGUgPT0gImNhdGNoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBwdXNoY29udGV4dCwgZXhwZWN0KCIoIiksIGZ1bmFyZywgZXhwZWN0KCIpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQsIHBvcGxleCwgcG9wY29udGV4dCk7CiAgICByZXR1cm4gcGFzcyhwdXNobGV4KCJzdGF0IiksIGV4cHJlc3Npb24sIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogIH0KICBmdW5jdGlvbiBleHByZXNzaW9uKHR5cGUpIHsKICAgIGlmIChhdG9taWNUeXBlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgcmV0dXJuIGNvbnQobWF5YmVvcGVyYXRvcik7CiAgICBpZiAodHlwZSA9PSAiZnVuY3Rpb24iKSByZXR1cm4gY29udChmdW5jdGlvbmRlZik7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBjIikgcmV0dXJuIGNvbnQobWF5YmVleHByZXNzaW9uKTsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLCBtYXliZWV4cHJlc3Npb24sIGV4cGVjdCgiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZSA9PSAiWyIpIHJldHVybiBjb250KHB1c2hsZXgoIl0iKSwgY29tbWFzZXAoZXhwcmVzc2lvbiwgIl0iKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLCBjb21tYXNlcChvYmpwcm9wLCAifSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVleHByZXNzaW9uKHR5cGUpIHsKICAgIGlmICh0eXBlLm1hdGNoKC9bO1x9XClcXSxdLykpIHJldHVybiBwYXNzKCk7CiAgICByZXR1cm4gcGFzcyhleHByZXNzaW9uKTsKICB9CiAgICAKICBmdW5jdGlvbiBtYXliZW9wZXJhdG9yKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAib3BlcmF0b3IiICYmIC9cK1wrfC0tLy50ZXN0KHZhbHVlKSkgcmV0dXJuIGNvbnQobWF5YmVvcGVyYXRvcik7CiAgICBpZiAodHlwZSA9PSAib3BlcmF0b3IiICYmIHZhbHVlID09ICI/IikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI6IiksIGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm47CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgY29tbWFzZXAoZXhwcmVzc2lvbiwgIikiKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIGlmICh0eXBlID09ICIuIikgcmV0dXJuIGNvbnQocHJvcGVydHksIG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gIlsiKSByZXR1cm4gY29udChwdXNobGV4KCJdIiksIGV4cHJlc3Npb24sIGV4cGVjdCgiXSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogIH0KICBmdW5jdGlvbiBtYXliZWxhYmVsKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQocG9wbGV4LCBzdGF0ZW1lbnQpOwogICAgcmV0dXJuIHBhc3MobWF5YmVvcGVyYXRvciwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIHByb3BlcnR5KHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHtjeC5tYXJrZWQgPSAicHJvcGVydHkiOyByZXR1cm4gY29udCgpO30KICB9CiAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjeC5tYXJrZWQgPSAicHJvcGVydHkiOwogICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gY29udChleHBlY3QoIjoiKSwgZXhwcmVzc2lvbik7CiAgfQogIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQsIGVuZCkgewogICAgZnVuY3Rpb24gcHJvY2VlZCh0eXBlKSB7CiAgICAgIGlmICh0eXBlID09ICIsIikgcmV0dXJuIGNvbnQod2hhdCwgcHJvY2VlZCk7CiAgICAgIGlmICh0eXBlID09IGVuZCkgcmV0dXJuIGNvbnQoKTsKICAgICAgcmV0dXJuIGNvbnQoZXhwZWN0KGVuZCkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uIGNvbW1hU2VwYXJhdGVkKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gZW5kKSByZXR1cm4gY29udCgpOwogICAgICBlbHNlIHJldHVybiBwYXNzKHdoYXQsIHByb2NlZWQpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYmxvY2sodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBibG9jayk7CiAgfQogIGZ1bmN0aW9uIG1heWJldHlwZSh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiOiIpIHJldHVybiBjb250KHR5cGVkZWYpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gdHlwZWRlZih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKXtjeC5tYXJrZWQgPSAidmFyaWFibGUtMyI7IHJldHVybiBjb250KCk7fQogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gdmFyZGVmMSh0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgewogICAgICByZWdpc3Rlcih2YWx1ZSk7CiAgICAgIHJldHVybiBpc1RTID8gY29udChtYXliZXR5cGUsIHZhcmRlZjIpIDogY29udCh2YXJkZWYyKTsKICAgIH0KICAgIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIHZhcmRlZjIodHlwZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAiPSIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIHZhcmRlZjIpOwogICAgaWYgKHR5cGUgPT0gIiwiKSByZXR1cm4gY29udCh2YXJkZWYxKTsKICB9CiAgZnVuY3Rpb24gZm9yc3BlYzEodHlwZSkgewogICAgaWYgKHR5cGUgPT0gInZhciIpIHJldHVybiBjb250KHZhcmRlZjEsIGV4cGVjdCgiOyIpLCBmb3JzcGVjMik7CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybiBjb250KGZvcnNwZWMyKTsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBjb250KGZvcm1heWJlaW4pOwogICAgcmV0dXJuIGNvbnQoZm9yc3BlYzIpOwogIH0KICBmdW5jdGlvbiBmb3JtYXliZWluKF90eXBlLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICJpbiIpIHJldHVybiBjb250KGV4cHJlc3Npb24pOwogICAgcmV0dXJuIGNvbnQobWF5YmVvcGVyYXRvciwgZm9yc3BlYzIpOwogIH0KICBmdW5jdGlvbiBmb3JzcGVjMih0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udChmb3JzcGVjMyk7CiAgICBpZiAodmFsdWUgPT0gImluIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7CiAgICByZXR1cm4gY29udChleHByZXNzaW9uLCBleHBlY3QoIjsiKSwgZm9yc3BlYzMpOwogIH0KICBmdW5jdGlvbiBmb3JzcGVjMyh0eXBlKSB7CiAgICBpZiAodHlwZSAhPSAiKSIpIGNvbnQoZXhwcmVzc2lvbik7CiAgfQogIGZ1bmN0aW9uIGZ1bmN0aW9uZGVmKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSB7cmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gY29udChmdW5jdGlvbmRlZik7fQogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gY29udChwdXNobGV4KCIpIiksIHB1c2hjb250ZXh0LCBjb21tYXNlcChmdW5hcmcsICIpIiksIHBvcGxleCwgc3RhdGVtZW50LCBwb3Bjb250ZXh0KTsKICB9CiAgZnVuY3Rpb24gZnVuYXJnKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSB7cmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gaXNUUyA/IGNvbnQobWF5YmV0eXBlKSA6IGNvbnQoKTt9CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZToganNUb2tlbkJhc2UsCiAgICAgICAgbGFzdFR5cGU6IG51bGwsCiAgICAgICAgY2M6IFtdLAogICAgICAgIGxleGljYWw6IG5ldyBKU0xleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAiYmxvY2siLCBmYWxzZSksCiAgICAgICAgbG9jYWxWYXJzOiBwYXJzZXJDb25maWcubG9jYWxWYXJzLAogICAgICAgIGNvbnRleHQ6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnMgJiYge3ZhcnM6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnN9LAogICAgICAgIGluZGVudGVkOiAwCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoImFsaWduIikpCiAgICAgICAgICBzdGF0ZS5sZXhpY2FsLmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHR5cGUgPT0gImNvbW1lbnQiKSByZXR1cm4gc3R5bGU7CiAgICAgIHN0YXRlLmxhc3RUeXBlID0gdHlwZTsKICAgICAgcmV0dXJuIHBhcnNlSlMoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplID09IGpzVG9rZW5Db21tZW50KSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0ganNUb2tlbkJhc2UpIHJldHVybiAwOwogICAgICB2YXIgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCksIGxleGljYWwgPSBzdGF0ZS5sZXhpY2FsOwogICAgICBpZiAobGV4aWNhbC50eXBlID09ICJzdGF0IiAmJiBmaXJzdENoYXIgPT0gIn0iKSBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgICB2YXIgdHlwZSA9IGxleGljYWwudHlwZSwgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlOwogICAgICBpZiAodHlwZSA9PSAidmFyZGVmIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoc3RhdGUubGFzdFR5cGUgPT0gIm9wZXJhdG9yIiB8fCBzdGF0ZS5sYXN0VHlwZSA9PSAiLCIgPyA0IDogMCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZvcm0iICYmIGZpcnN0Q2hhciA9PSAieyIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JtIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyBpbmRlbnRVbml0OwogICAgICBlbHNlIGlmICh0eXBlID09ICJzdGF0IikKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChzdGF0ZS5sYXN0VHlwZSA9PSAib3BlcmF0b3IiIHx8IHN0YXRlLmxhc3RUeXBlID09ICIsIiA/IGluZGVudFVuaXQgOiAwKTsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5pbmZvID09ICJzd2l0Y2giICYmICFjbG9zaW5nKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KHRleHRBZnRlcikgPyBpbmRlbnRVbml0IDogMiAqIGluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChsZXhpY2FsLmFsaWduKSByZXR1cm4gbGV4aWNhbC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAiOnt9IiwKCiAgICBqc29uTW9kZToganNvbk1vZGUKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9qYXZhc2NyaXB0IiwgImphdmFzY3JpcHQiKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9qc29uIiwge25hbWU6ICJqYXZhc2NyaXB0IiwganNvbjogdHJ1ZX0pOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdHlwZXNjcmlwdCIsIHsgbmFtZTogImphdmFzY3JpcHQiLCB0eXBlc2NyaXB0OiB0cnVlIH0pOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3R5cGVzY3JpcHQiLCB7IG5hbWU6ICJqYXZhc2NyaXB0IiwgdHlwZXNjcmlwdDogdHJ1ZSB9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/javascript/typescript.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFR5cGVTY3JpcHQgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImphdmFzY3JpcHQuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFR5cGVTY3JpcHQgbW9kZTwvaDE+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CmNsYXNzIEdyZWV0ZXIgewoJZ3JlZXRpbmc6IHN0cmluZzsKCWNvbnN0cnVjdG9yIChtZXNzYWdlOiBzdHJpbmcpIHsKCQl0aGlzLmdyZWV0aW5nID0gbWVzc2FnZTsKCX0KCWdyZWV0KCkgewoJCXJldHVybiAiSGVsbG8sICIgKyB0aGlzLmdyZWV0aW5nOwoJfQp9ICAgCgp2YXIgZ3JlZXRlciA9IG5ldyBHcmVldGVyKCJ3b3JsZCIpOwoKdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpCmJ1dHRvbi5pbm5lclRleHQgPSAiU2F5IEhlbGxvIgpidXR0b24ub25jbGljayA9IGZ1bmN0aW9uKCkgewoJYWxlcnQoZ3JlZXRlci5ncmVldCgpKQp9Cgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJ1dHRvbikKCjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3R5cGVzY3JpcHQiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+VGhpcyBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZSA8YSBocmVmPSJpbmRleC5odG1sIj5KYXZhU2NyaXB0IG1vZGU8L2E+LjwvcD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/jinja2/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/jinja2/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEppbmphMiBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iamluamEyLmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBKaW5qYTIgbW9kZTwvaDE+CiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgombHQ7aHRtbCBzdHlsZT0iY29sb3I6IGdyZWVuIiZndDsKICAmbHQ7IS0tIHRoaXMgaXMgYSBjb21tZW50IC0tJmd0OwogICZsdDtoZWFkJmd0OwogICAgJmx0O3RpdGxlJmd0O0ppbmphMiBFeGFtcGxlJmx0Oy90aXRsZSZndDsKICAmbHQ7L2hlYWQmZ3Q7CiAgJmx0O2JvZHkmZ3Q7CiAgICAmbHQ7dWwmZ3Q7CiAgICB7IyB0aGlzIGlzIGEgY29tbWVudCAjfQogICAgeyUtIGZvciBpdGVtIGluIGxpIC0lfQogICAgICAmbHQ7bGkmZ3Q7CiAgICAgICAge3sgaXRlbS5sYWJlbCB9fQogICAgICAmbHQ7L2xpJmd0OwogICAgeyUgZW5kZm9yIC0lfQogICAgJmx0Oy91bCZndDsKICAmbHQ7L2JvZHkmZ3Q7CiZsdDsvaHRtbCZndDsKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0KICAgICAgQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge21vZGU6CiAgICAgICAge25hbWU6ICJqaW5qYTIiLCBodG1sTW9kZTogdHJ1ZX19KTsKICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/jinja2/jinja2.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJqaW5qYTIiLCBmdW5jdGlvbigpIHsKICAgIHZhciBrZXl3b3JkcyA9IFsiYmxvY2siLCAiZW5kYmxvY2siLCAiZm9yIiwgImVuZGZvciIsICJpbiIsICJ0cnVlIiwgImZhbHNlIiwgCiAgICAgICAgICAgICAgICAgICAgImxvb3AiLCAibm9uZSIsICJzZWxmIiwgInN1cGVyIiwgImlmIiwgImFzIiwgIm5vdCIsICJhbmQiLAogICAgICAgICAgICAgICAgICAgICJlbHNlIiwgImltcG9ydCIsICJ3aXRoIiwgIndpdGhvdXQiLCAiY29udGV4dCJdOwogICAga2V5d29yZHMgPSBuZXcgUmVnRXhwKCJeKCgiICsga2V5d29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKCiAgICBmdW5jdGlvbiB0b2tlbkJhc2UgKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIGlmIChjaCA9PSAieyIpIHsKICAgICAgICAgICAgaWYgKGNoID0gc3RyZWFtLmVhdCgvXHt8JXwjLykpIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoIi0iKTsKICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UYWcoY2gpOwogICAgICAgICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gaW5UYWcgKGNsb3NlKSB7CiAgICAgICAgaWYgKGNsb3NlID09ICJ7IikgewogICAgICAgICAgICBjbG9zZSA9ICJ9IjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIGlmICgoY2ggPT0gY2xvc2UgfHwgKGNoID09ICItIiAmJiBzdHJlYW0uZWF0KGNsb3NlKSkpCiAgICAgICAgICAgICAgICAmJiBzdHJlYW0uZWF0KCJ9IikpIHsKICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjbG9zZSA9PSAiIyIgPyAiY29tbWVudCIgOiAic3RyaW5nIjsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZX07CiAgICAgICAgfSwKICAgICAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgIH07IAp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/less/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/less/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IExFU1MgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi91dGlsL21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imxlc3MuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4OyBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBmb250LXNpemU6MTJweDsgaGVpZ2h0OiA0MDBweH08L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9sZXNzZXItZGFyay5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBMRVNTIG1vZGU8L2gxPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj5AbWVkaWEgc2NyZWVuIGFuZCAoZGV2aWNlLWFzcGVjdC1yYXRpbzogMTYvOSkgeyDigKYgfQpAbWVkaWEgc2NyZWVuIGFuZCAoZGV2aWNlLWFzcGVjdC1yYXRpbzogMzIvMTgpIHsg4oCmIH0KQG1lZGlhIHNjcmVlbiBhbmQgKGRldmljZS1hc3BlY3QtcmF0aW86IDEyODAvNzIwKSB7IOKApiB9CkBtZWRpYSBzY3JlZW4gYW5kIChkZXZpY2UtYXNwZWN0LXJhdGlvOiAyNTYwLzE0NDApIHsg4oCmIH0KCmh0bWw6bGFuZyhmci1iZSkKaHRtbDpsYW5nKGRlKQo6bGFuZyhmci1iZSkgPiBxCjpsYW5nKGRlKSA+IHEKCnRyOm50aC1jaGlsZCgybisxKSAvKiByZXByZXNlbnRzIGV2ZXJ5IG9kZCByb3cgb2YgYW4gSFRNTCB0YWJsZSAqLwp0cjpudGgtY2hpbGQob2RkKSAgLyogc2FtZSAqLwp0cjpudGgtY2hpbGQoMm4rMCkgLyogcmVwcmVzZW50cyBldmVyeSBldmVuIHJvdyBvZiBhbiBIVE1MIHRhYmxlICovCnRyOm50aC1jaGlsZChldmVuKSAvKiBzYW1lICovCgovKiBBbHRlcm5hdGUgcGFyYWdyYXBoIGNvbG91cnMgaW4gQ1NTICovCnA6bnRoLWNoaWxkKDRuKzEpIHsgY29sb3I6IG5hdnk7IH0KcDpudGgtY2hpbGQoNG4rMikgeyBjb2xvcjogZ3JlZW47IH0KcDpudGgtY2hpbGQoNG4rMykgeyBjb2xvcjogbWFyb29uOyB9CnA6bnRoLWNoaWxkKDRuKzQpIHsgY29sb3I6IHB1cnBsZTsgfQoKOm50aC1jaGlsZCgxMG4tMSkgIC8qIHJlcHJlc2VudHMgdGhlIDl0aCwgMTl0aCwgMjl0aCwgZXRjLCBlbGVtZW50ICovCjpudGgtY2hpbGQoMTBuKzkpICAvKiBTYW1lICovCjpudGgtY2hpbGQoMTBuKy0xKSAvKiBTeW50YWN0aWNhbGx5IGludmFsaWQsIGFuZCB3b3VsZCBiZSBpZ25vcmVkICovCgo6bnRoLWNoaWxkKCAzbiArIDEgKQo6bnRoLWNoaWxkKCArM24gLSAyICkKOm50aC1jaGlsZCggLW4rIDYpCjpudGgtY2hpbGQoICs2ICkKCmh0bWx8dHI6bnRoLWNoaWxkKC1uKzYpICAvKiByZXByZXNlbnRzIHRoZSA2IGZpcnN0IHJvd3Mgb2YgWEhUTUwgdGFibGVzICovCgppbWc6bnRoLW9mLXR5cGUoMm4rMSkgeyBmbG9hdDogcmlnaHQ7IH0KaW1nOm50aC1vZi10eXBlKDJuKSB7IGZsb2F0OiBsZWZ0OyB9Cgpib2R5ID4gaDI6bnRoLW9mLXR5cGUobisyKTpudGgtbGFzdC1vZi10eXBlKG4rMikKYm9keSA+IGgyOm5vdCg6Zmlyc3Qtb2YtdHlwZSk6bm90KDpsYXN0LW9mLXR5cGUpCgpodG1sfCo6bm90KDpsaW5rKTpub3QoOnZpc2l0ZWQpCip8Kjpub3QoOmhvdmVyKQpwOjpmaXJzdC1saW5lIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZSB9CgpwIHsgY29sb3I6IHJlZDsgZm9udC1zaXplOiAxMnB0IH0KcDo6Zmlyc3QtbGV0dGVyIHsgY29sb3I6IGdyZWVuOyBmb250LXNpemU6IDIwMCUgfQpwOjpmaXJzdC1saW5lIHsgY29sb3I6IGJsdWUgfQoKcCB7IGxpbmUtaGVpZ2h0OiAxLjEgfQpwOjpmaXJzdC1sZXR0ZXIgeyBmb250LXNpemU6IDNlbTsgZm9udC13ZWlnaHQ6IG5vcm1hbCB9CnNwYW4geyBmb250LXdlaWdodDogYm9sZCB9CgoqICAgICAgICAgICAgICAgLyogYT0wIGI9MCBjPTAgLT4gc3BlY2lmaWNpdHkgPSAgIDAgKi8KTEkgICAgICAgICAgICAgIC8qIGE9MCBiPTAgYz0xIC0+IHNwZWNpZmljaXR5ID0gICAxICovClVMIExJICAgICAgICAgICAvKiBhPTAgYj0wIGM9MiAtPiBzcGVjaWZpY2l0eSA9ICAgMiAqLwpVTCBPTCtMSSAgICAgICAgLyogYT0wIGI9MCBjPTMgLT4gc3BlY2lmaWNpdHkgPSAgIDMgKi8KSDEgKyAqW1JFTD11cF0gIC8qIGE9MCBiPTEgYz0xIC0+IHNwZWNpZmljaXR5ID0gIDExICovClVMIE9MIExJLnJlZCAgICAvKiBhPTAgYj0xIGM9MyAtPiBzcGVjaWZpY2l0eSA9ICAxMyAqLwpMSS5yZWQubGV2ZWwgICAgLyogYT0wIGI9MiBjPTEgLT4gc3BlY2lmaWNpdHkgPSAgMjEgKi8KI3gzNHkgICAgICAgICAgIC8qIGE9MSBiPTAgYz0wIC0+IHNwZWNpZmljaXR5ID0gMTAwICovCiNzMTI6bm90KEZPTykgICAvKiBhPTEgYj0wIGM9MSAtPiBzcGVjaWZpY2l0eSA9IDEwMSAqLwoKQG5hbWVzcGFjZSBmb28gdXJsKGh0dHA6Ly93d3cuZXhhbXBsZS5jb20pOwpmb298aDEgeyBjb2xvcjogYmx1ZSB9ICAvKiBmaXJzdCBydWxlICovCmZvb3wqIHsgY29sb3I6IHllbGxvdyB9IC8qIHNlY29uZCBydWxlICovCnxoMSB7IGNvbG9yOiByZWQgfSAgICAgIC8qIC4uLiovCip8aDEgeyBjb2xvcjogZ3JlZW4gfQpoMSB7IGNvbG9yOiBncmVlbiB9CgpzcGFuW2hlbGxvPSJPY2VhbiJdW2dvb2RieWU9IkxhbmQiXQoKYVtyZWx+PSJjb3B5cmlnaHQiXSB7IC4uLiB9CmFbaHJlZj0iaHR0cDovL3d3dy53My5vcmcvIl0geyAuLi4gfQoKRElBTE9HVUVbY2hhcmFjdGVyPXJvbWVvXQpESUFMT0dVRVtjaGFyYWN0ZXI9anVsaWV0XQoKW2F0dF49dmFsXQpbYXR0JD12YWxdClthdHQqPXZhbF0KCkBuYW1lc3BhY2UgZm9vICJodHRwOi8vd3d3LmV4YW1wbGUuY29tIjsKW2Zvb3xhdHQ9dmFsXSB7IGNvbG9yOiBibHVlIH0KWyp8YXR0XSB7IGNvbG9yOiB5ZWxsb3cgfQpbfGF0dF0geyBjb2xvcjogZ3JlZW4gfQpbYXR0XSB7IGNvbG9yOiBncmVlbiB9CgoKKjp0YXJnZXQgeyBjb2xvciA6IHJlZCB9Cio6dGFyZ2V0OjpiZWZvcmUgeyBjb250ZW50IDogdXJsKHRhcmdldC5wbmcpIH0KCkVbZm9vXXsKICBwYWRkaW5nOjY1cHg7Cn0KRVtmb29dIH4gRnsKICBwYWRkaW5nOjY1cHg7Cn0KRSNteWlkewogIHBhZGRpbmc6NjVweDsKfQppbnB1dFt0eXBlPSJzZWFyY2giXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiwKaW5wdXRbdHlwZT0ic2VhcmNoIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24gewogIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsgLy8gSW5uZXItcGFkZGluZyBpc3N1ZXMgaW4gQ2hyb21lIE9TWCwgU2FmYXJpIDUKfQpidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsCmlucHV0OjotbW96LWZvY3VzLWlubmVyIHsgLy8gSW5uZXIgcGFkZGluZyBhbmQgYm9yZGVyIG9kZGl0aWVzIGluIEZGMy80CiAgcGFkZGluZzogMDsKICBib3JkZXI6IDA7Cn0KLmJ0biB7CiAgLy8gcmVzZXQgaGVyZSBhcyBvZiAyLjAuMyBkdWUgdG8gUmVjZXNzIHByb3BlcnR5IG9yZGVyCiAgYm9yZGVyLWNvbG9yOiAjY2NjOwogIGJvcmRlci1jb2xvcjogcmdiYSgwLDAsMCwuMSkgcmdiYSgwLDAsMCwuMSkgcmdiYSgwLDAsMCwuMjUpOwp9CmZpZWxkc2V0IHNwYW4gYnV0dG9uLCBmaWVsZHNldCBzcGFuIGlucHV0W3R5cGU9ImZpbGUiXSB7CiAgZm9udC1zaXplOjEycHg7Cglmb250LWZhbWlseTpBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwp9Ci5lbCB0cjpudGgtY2hpbGQoZXZlbik6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZHsKCS1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OjNweDsKCS13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHg7Cglib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjNweDsKfQoKLyogU29tZSBMRVNTIGNvZGUgKi8KCmJ1dHRvbiB7CiAgICB3aWR0aDogIDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBib3JkZXI6IDA7CiAgICBtYXJnaW46IDRweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQpidXR0b24uaWNvbi1wbHVzIHsgYmFja2dyb3VuZDogdXJsKGh0dHA6Ly9kYWhsc3Ryw7ZtLm5ldC90bXAvc2hhcnAtaWNvbnMvc3ZnLWljb24tdGFyZ2V0LnN2ZyNwbHVzKSBuby1yZXBlYXQ7IH0KYnV0dG9uLmljb24tY2hhcnQgeyBiYWNrZ3JvdW5kOiB1cmwoaHR0cDovL2RhaGxzdHLDtm0ubmV0L3RtcC9zaGFycC1pY29ucy9zdmctaWNvbi10YXJnZXQuc3ZnI2NoYXJ0KSBuby1yZXBlYXQ7IH0KCmJ1dHRvbjpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICM5OTk7IH0KYnV0dG9uOmFjdGl2ZSB7IGJhY2tncm91bmQtY29sb3I6ICM2NjY7IH0KCkB0ZXN0X2E6ICNlZWVRUVE7Ly90aGlzIGlzIG5vdCBhIHZhbGlkIGhleCB2YWx1ZSBhbmQgdGh1cyBwYXJzZWQgYXMgYW4gZWxlbWVudCBpZApAdGVzdF9iOiAjZWVlRkZGIC8vdGhpcyBpcyBhIHZhbGlkIGhleCB2YWx1ZSBidXQgdGhlIGRlY2xhcmF0aW9uIGRvZXNuJ3QgZW5kIHdpdGggYSBzZW1pY29sb24gYW5kIHRodXMgcGFyc2VkIGFzIGFuIGVsZW1lbnQgaWQKCiNlZWUgYWFhIC5ib3gKewogICN0ZXN0IGJiYiB7CiAgICB3aWR0aDogNTAwcHg7CiAgICBoZWlnaHQ6IDI1MHB4OwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRpci9vdXRwdXQvc2hlZXAucG5nKSwgdXJsKCBiZXR3ZWVuZ3Jhc3NhbmRza3kucG5nICk7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgYm90dG9tLCBsZWZ0IHRvcDsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgfQp9CgpAYmFzZTogI2Y5MzhhYjsKCi5ib3gtc2hhZG93KEBzdHlsZSwgQGMpIHdoZW4gKGlzY29sb3IoQGMpKSB7CiAgYm94LXNoYWRvdzogICAgICAgICBAc3R5bGUgQGM7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBAc3R5bGUgQGM7CiAgLW1vei1ib3gtc2hhZG93OiAgICBAc3R5bGUgQGM7Cn0KLmJveC1zaGFkb3coQHN0eWxlLCBAYWxwaGE6IDUwJSkgd2hlbiAoaXNudW1iZXIoQGFscGhhKSkgewogIC5ib3gtc2hhZG93KEBzdHlsZSwgcmdiYSgwLCAwLCAwLCBAYWxwaGEpKTsKfQoKQGNvbG9yOiAjNEQ5MjZGOwoKI2hlYWRlciB7CiAgY29sb3I6IEBjb2xvcjsKICBjb2xvcjogIzAwMDAwMDsKfQpoMiB7CiAgY29sb3I6IEBjb2xvcjsKfQoKLnJvdW5kZWQtY29ybmVycyAoQHJhZGl1czogNXB4KSB7CiAgYm9yZGVyLXJhZGl1czogQHJhZGl1czsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IEByYWRpdXM7CiAgLW1vei1ib3JkZXItcmFkaXVzOiBAcmFkaXVzOwp9CgojaGVhZGVyIHsKICAucm91bmRlZC1jb3JuZXJzOwp9CiNmb290ZXIgewogIC5yb3VuZGVkLWNvcm5lcnMoMTBweCk7Cn0KCi5ib3gtc2hhZG93IChAeDogMCwgQHk6IDAsIEBibHVyOiAxcHgsIEBhbHBoYSkgewogIEB2YWw6IEB4IEB5IEBibHVyIHJnYmEoMCwgMCwgMCwgQGFscGhhKTsKCiAgYm94LXNoYWRvdzogICAgICAgICBAdmFsOwogIC13ZWJraXQtYm94LXNoYWRvdzogQHZhbDsKICAtbW96LWJveC1zaGFkb3c6ICAgIEB2YWw7Cn0KLmJveCB7IEBiYXNlOiAjZjkzOGFiOwogIGNvbG9yOiAgICAgICAgc2F0dXJhdGUoQGJhc2UsIDUlKTsKICBib3JkZXItY29sb3I6IGxpZ2h0ZW4oQGJhc2UsIDMwJSk7CiAgZGl2IHsgLmJveC1zaGFkb3coMCwgMCwgNXB4LCAwLjQpIH0KfQoKQGltcG9ydCB1cmwoInNvbWV0aGluZy5jc3MiKTsKCkBsaWdodC1ibHVlOiAgIGhzbCgxOTAsIDUwJSwgNjUlKTsKQGxpZ2h0LXllbGxvdzogZGVzYXR1cmF0ZSgjZmVmZWM4LCAxMCUpOwpAZGFyay15ZWxsb3c6ICBkZXNhdHVyYXRlKGRhcmtlbihAbGlnaHQteWVsbG93LCAxMCUpLCA0MCUpOwpAZGFya2VzdDogICAgICBoc2woMjAsIDAlLCAxNSUpOwpAZGFyazogICAgICAgICBoc2woMTkwLCAyMCUsIDMwJSk7CkBtZWRpdW06ICAgICAgIGhzbCgxMCwgNjAlLCAzMCUpOwpAbGlnaHQ6ICAgICAgICBoc2woOTAsIDQwJSwgMjAlKTsKQGxpZ2h0ZXN0OiAgICAgaHNsKDkwLCAyMCUsIDkwJSk7CkBoaWdobGlnaHQ6ICAgIGhzbCg4MCwgNTAlLCA5MCUpOwpAYmx1ZTogICAgICAgICBoc2woMjEwLCA2MCUsIDIwJSk7CkBhbHBoYS1ibHVlOiAgIGhzbGEoMjEwLCA2MCUsIDQwJSwgMC41KTsKCi5ib3gtc2hhZG93IChAeCwgQHksIEBibHVyLCBAYWxwaGEpIHsKICBAdmFsdWU6IEB4IEB5IEBibHVyIHJnYmEoMCwgMCwgMCwgQGFscGhhKTsKICBib3gtc2hhZG93OiAgICAgICAgIEB2YWx1ZTsKICAtbW96LWJveC1zaGFkb3c6ICAgIEB2YWx1ZTsKICAtd2Via2l0LWJveC1zaGFkb3c6IEB2YWx1ZTsKfQouYm9yZGVyLXJhZGl1cyAoQHJhZGl1cykgewogIGJvcmRlci1yYWRpdXM6IEByYWRpdXM7CiAgLW1vei1ib3JkZXItcmFkaXVzOiBAcmFkaXVzOwogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogQHJhZGl1czsKfQoKLmJvcmRlci1yYWRpdXMgKEByYWRpdXMsIGJvdHRvbSkgewogIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwOwogIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7CiAgLW1vei1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsKICAtbW96LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7CiAgLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwOwogIC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7Cn0KLmJvcmRlci1yYWRpdXMgKEByYWRpdXMsIHJpZ2h0KSB7CiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsKICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwOwogIC1tb3otYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsKICAtbW96LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7CiAgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwOwogIC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDsKfQouYm94LXNoYWRvdy1pbnNldCAoQHgsIEB5LCBAYmx1ciwgQGNvbG9yKSB7CiAgYm94LXNoYWRvdzogQHggQHkgQGJsdXIgQGNvbG9yIGluc2V0OwogIC1tb3otYm94LXNoYWRvdzogQHggQHkgQGJsdXIgQGNvbG9yIGluc2V0OwogIC13ZWJraXQtYm94LXNoYWRvdzogQHggQHkgQGJsdXIgQGNvbG9yIGluc2V0Owp9Ci5jb2RlICgpIHsKICBmb250LWZhbWlseTogJ0JpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubycsCiAgICAgICAgICAgICAgICdEZWphVnUgU2FucyBNb25vJywKICAgICAgICAgICAgICAgJ01vbmFjbycsCiAgICAgICAgICAgICAgIENvdXJpZXIsCiAgICAgICAgICAgICAgIG1vbm9zcGFjZSAhaW1wb3J0YW50Owp9Ci53cmFwICgpIHsKICB0ZXh0LXdyYXA6IHdyYXA7CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyAgICAgICAvKiBjc3MtMyAqLwogIHdoaXRlLXNwYWNlOiAtbW96LXByZS13cmFwOyAgLyogTW96aWxsYSwgc2luY2UgMTk5OSAqLwogIHdoaXRlLXNwYWNlOiAtcHJlLXdyYXA7ICAgICAgLyogT3BlcmEgNC02ICovCiAgd2hpdGUtc3BhY2U6IC1vLXByZS13cmFwOyAgICAvKiBPcGVyYSA3ICovCiAgd29yZC13cmFwOiBicmVhay13b3JkOyAgICAgICAvKiBJbnRlcm5ldCBFeHBsb3JlciA1LjUrICovCn0KCmh0bWwgeyBtYXJnaW46IDAgfQpib2R5IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFya2VzdDsKICBtYXJnaW46IDAgYXV0bzsKICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMDAlOwogIG92ZXJmbG93LXg6IGhpZGRlbjsKfQpuYXYsIGhlYWRlciwgZm9vdGVyLCBzZWN0aW9uLCBhcnRpY2xlIHsKICBkaXNwbGF5OiBibG9jazsKfQphIHsKICBjb2xvcjogI2I4MzAwMDsKfQpoMSBhIHsKICBjb2xvcjogYmxhY2s7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CmE6aG92ZXIgewogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CmgxLCBoMiwgaDMsIGg0IHsKICBtYXJnaW46IDA7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKfQp1bCwgbGkgewogIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKfQpjb2RlIHsgLmNvZGU7IH0KY29kZSB7CiAgLnN0cmluZywgLnJlZ2V4cCB7IGNvbG9yOiBAZGFyayB9CiAgLmtleXdvcmQgeyBmb250LXdlaWdodDogYm9sZCB9CiAgLmNvbW1lbnQgeyBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpIH0KICAubnVtYmVyIHsgY29sb3I6IEBibHVlIH0KICAuY2xhc3MsIC5zcGVjaWFsIHsgY29sb3I6IHJnYmEoMCwgNTAsIDEwMCwgMC44KSB9Cn0KcHJlIHsKICBwYWRkaW5nOiAwIDMwcHg7CiAgLndyYXA7Cn0KYmxvY2txdW90ZSB7CiAgZm9udC1zdHlsZTogaXRhbGljOwp9CmJvZHkgPiBmb290ZXIgewogIHRleHQtYWxpZ246IGxlZnQ7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtc2l6ZTogMThweDsKICBjb2xvcjogIzg4ODsKfQoKI2xvZ28gewogIG1hcmdpbi10b3A6IDMwcHg7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICBkaXNwbGF5OiBibG9jazsKICB3aWR0aDogMTk5cHg7CiAgaGVpZ2h0OiA4MXB4OwogIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2xvZ28ucG5nKSBuby1yZXBlYXQ7Cn0KbmF2IHsKICBtYXJnaW4tbGVmdDogMTVweDsKfQpuYXYgYSwgI2Ryb3Bkb3duIGxpIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgY29sb3I6IHdoaXRlOwogIGxpbmUtaGVpZ2h0OiA0MnB4OwogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAwcHggMTVweDsKICB0ZXh0LXNoYWRvdzogLTFweCAtMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogIGJvcmRlci13aWR0aDogMCAycHg7CiAgJjpob3ZlciB7CiAgICAuZGFyay1yZWQ7IAogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIH0KfQouZGFyay1yZWQgewogICAgQHJlZDogQG1lZGl1bTsKICAgIGJvcmRlcjogMnB4IHNvbGlkIGRhcmtlbihAcmVkLCAyNSUpOwogICAgYm9yZGVyLWxlZnQtY29sb3I6IGRhcmtlbihAcmVkLCAxNSUpOwogICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBkYXJrZW4oQHJlZCwgMTUlKTsKICAgIGJvcmRlci1ib3R0b206IDA7CiAgICBib3JkZXItdG9wOiAwOwogICAgYmFja2dyb3VuZC1jb2xvcjogZGFya2VuKEByZWQsIDEwJSk7Cn0KCi5jb250ZW50IHsKICBtYXJnaW46IDAgYXV0bzsKICB3aWR0aDogOTgwcHg7Cn0KCiNtZW51IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgei1pbmRleDogMzsKICBjbGVhcjogYm90aDsKICBkaXNwbGF5OiBibG9jazsKICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTsKICBoZWlnaHQ6IDQycHg7CiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIGxpZ2h0ZW4oQGFscGhhLWJsdWUsIDIwJSk7CiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGRhcmtlbihAYWxwaGEtYmx1ZSwgMjUlKTsKICAuYm94LXNoYWRvdygwLCAxcHgsIDhweCwgMC42KTsKICAtbW96LWJveC1zaGFkb3c6IDAgMCAwICMwMDA7IC8vIEJlY2F1c2UgZmlyZWZveCBzdWNrcy4KCiAgJi5kb2NrZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSgyMTAsIDYwJSwgNDAlLCAwLjQpOwogIH0KICAmOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6IEBibHVlOwogIH0KCiAgI2Ryb3Bkb3duIHsKICAgIG1hcmdpbjogMCAwIDAgMTE3cHg7CiAgICBwYWRkaW5nOiAwOwogICAgcGFkZGluZy10b3A6IDVweDsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICB3aWR0aDogMTkwcHg7CiAgICBib3JkZXItdG9wOiAycHggc29saWQgQG1lZGl1bTsKICAgIGNvbG9yOiBAaGlnaGxpZ2h0OwogICAgYm9yZGVyOiAycHggc29saWQgZGFya2VuKEBtZWRpdW0sIDI1JSk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogZGFya2VuKEBtZWRpdW0sIDE1JSk7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IGRhcmtlbihAbWVkaXVtLCAxNSUpOwogICAgYm9yZGVyLXRvcC13aWR0aDogMDsKICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbihAbWVkaXVtLCAxMCUpOwogICAgdWwgewogICAgICBwYWRkaW5nOiAwcHg7ICAKICAgIH0KICAgIGxpIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgcGFkZGluZzogMDsKICAgICAgYm9yZGVyOiAwOwogICAgICBhIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAwcHggMTVweDsgIAogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBjb2xvcjogd2hpdGU7ICAKICAgICAgICAmOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbihAbWVkaXVtLCAxNSUpOwogICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLmJvcmRlci1yYWRpdXMoNXB4LCBib3R0b20pOwogICAgLmJveC1zaGFkb3coMCwgNnB4LCA4cHgsIDAuNSk7CiAgfQp9CgojbWFpbiB7CiAgbWFyZ2luOiAwIGF1dG87CiAgd2lkdGg6IDEwMCU7CiAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWJsdWU7CiAgYm9yZGVyLXRvcDogOHB4IHNvbGlkIGRhcmtlbihAbGlnaHQtYmx1ZSwgNSUpOwoKICAjaW50cm8gewogICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRlbihAbGlnaHQtYmx1ZSwgMjUlKTsKICAgIGZsb2F0OiBsZWZ0OwogICAgbWFyZ2luLXRvcDogLThweDsKICAgIG1hcmdpbi1yaWdodDogNXB4OwoKICAgIGhlaWdodDogMzgwcHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAyOwogICAgZm9udC1mYW1pbHk6ICdEcm9pZCBTZXJpZicsICdHZW9yZ2lhJzsKICAgIHdpZHRoOiAzOTVweDsKICAgIHBhZGRpbmc6IDQ1cHggMjBweCAyM3B4IDMwcHg7CiAgICBib3JkZXI6IDJweCBkYXNoZWQgZGFya2VuKEBsaWdodC1ibHVlLCAxMCUpOwogICAgLmJveC1zaGFkb3coMXB4LCAwcHgsIDZweCwgMC41KTsKICAgIGJvcmRlci1ib3R0b206IDA7CiAgICBib3JkZXItdG9wOiAwOwogICAgI2Rvd25sb2FkIHsgY29sb3I6IHRyYW5zcGFyZW50OyBib3JkZXI6IDA7IGZsb2F0OiBsZWZ0OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbjogMTVweCAwIDE1cHggLTVweDsgfQogICAgI2Rvd25sb2FkIGltZyB7IGRpc3BsYXk6IGlubGluZS1ibG9ja30KICAgICNkb3dubG9hZC1pbmZvIHsKICAgICAgY29kZSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OyAgCiAgICAgIH0KICAgICAgY29sb3I6IEBibHVlICsgIzMzMzsgZGlzcGxheTogaW5saW5lOyBmbG9hdDogbGVmdDsgbWFyZ2luOiAzNnB4IDAgMCAxNXB4IH0KICB9CiAgaDIgewogICAgc3BhbiB7CiAgICAgIGNvbG9yOiBAbWVkaXVtOyAgCiAgICB9CiAgICBjb2xvcjogQGJsdWU7CiAgICBtYXJnaW46IDIwcHggMDsKICAgIGZvbnQtc2l6ZTogMjRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjJlbTsKICB9CiAgaDMgewogICAgY29sb3I6IEBibHVlOwogICAgbGluZS1oZWlnaHQ6IDEuNGVtOwogICAgbWFyZ2luOiAzMHB4IDAgMTVweCAwOwogICAgZm9udC1zaXplOiAxZW07CiAgICB0ZXh0LXNoYWRvdzogMHB4IDBweCAwcHggQGxpZ2h0ZXN0OwogICAgc3BhbiB7IGNvbG9yOiBAbWVkaXVtIH0KICB9CiAgI2V4YW1wbGUgewogICAgcCB7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgY29sb3I6IEBibHVlOwogICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgdGV4dC1zaGFkb3c6IDBweCAxcHggMXB4IEBsaWdodGVzdDsKICAgIH0KICAgIHByZSB7CiAgICAgIG1hcmdpbjogMDsKICAgICAgdGV4dC1zaGFkb3c6IDAgLTFweCAxcHggQGRhcmtlc3Q7CiAgICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRlc2F0dXJhdGUoQGRhcmtlc3QsIDglKTsKICAgICAgYm9yZGVyOiAwOwogICAgICB3aWR0aDogNDUwcHg7CiAgICAgIGNvbG9yOiBsaWdodGVuKEBsaWdodGVzdCwgMiUpOwogICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0OwogICAgICBwYWRkaW5nOiAxNXB4OwogICAgICBib3JkZXI6IDFweCBkYXNoZWQgQGxpZ2h0ZXN0OwogICAgICBsaW5lLWhlaWdodDogMTVweDsKICAgICAgLmJveC1zaGFkb3coMCwgMHB4LCAxNXB4LCAwLjUpOwogICAgICAuY29kZTsKICAgICAgLmJvcmRlci1yYWRpdXMoMnB4KTsKICAgICAgY29kZSAuYXR0cmlidXRlIHsgY29sb3I6IGhzbCg0MCwgNTAlLCA3MCUpIH0KICAgICAgY29kZSAudmFyaWFibGUgIHsgY29sb3I6IGhzbCgxMjAsIDEwJSwgNTAlKSB9CiAgICAgIGNvZGUgLmVsZW1lbnQgICB7IGNvbG9yOiBoc2woMTcwLCAyMCUsIDUwJSkgfQoKICAgICAgY29kZSAuc3RyaW5nLCAucmVnZXhwIHsgY29sb3I6IGhzbCg3NSwgNTAlLCA2NSUpIH0KICAgICAgY29kZSAuY2xhc3MgeyBjb2xvcjogaHNsKDQwLCA0MCUsIDYwJSk7IGZvbnQtd2VpZ2h0OiBub3JtYWwgfQogICAgICBjb2RlIC5pZCB7IGNvbG9yOiBoc2woNTAsIDQwJSwgNjAlKTsgZm9udC13ZWlnaHQ6IG5vcm1hbCB9CiAgICAgIGNvZGUgLmNvbW1lbnQgeyBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpIH0KICAgICAgY29kZSAubnVtYmVyLCAuY29sb3IgeyBjb2xvcjogaHNsKDEwLCA0MCUsIDUwJSkgfQogICAgICBjb2RlIC5jbGFzcywgY29kZSAubWl4aW4sIC5zcGVjaWFsIHsgY29sb3I6IGhzbCgxOTAsIDIwJSwgNTAlKSB9CiAgICAgICN0aW1lIHsgY29sb3I6ICNhYWEgfQogICAgfQogICAgZmxvYXQ6IHJpZ2h0OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWFyZ2luOiAwOwogICAgbWFyZ2luLXRvcDogMTVweDsKICAgIHBhZGRpbmc6IDA7CiAgICB3aWR0aDogNTAwcHg7CiAgfQp9CgoKLnBhZ2UgewogIC5jb250ZW50IHsKICAgIHdpZHRoOiA4NzBweDsKICAgIHBhZGRpbmc6IDQ1cHg7CiAgfQogIG1hcmdpbjogMCBhdXRvOwogIGZvbnQtZmFtaWx5OiAnR2VvcmdpYScsIHNlcmlmOwogIGZvbnQtc2l6ZTogMThweDsKICBsaW5lLWhlaWdodDogMjZweDsKICBwYWRkaW5nOiAwIDYwcHg7CiAgY29kZSB7CiAgICBmb250LXNpemU6IDE2cHg7ICAKICB9CiAgcHJlIHsKICAgIGJvcmRlci13aWR0aDogMXB4OwogICAgYm9yZGVyLXN0eWxlOiBkYXNoZWQ7CiAgICBwYWRkaW5nOiAxNXB4OwogICAgbWFyZ2luOiAxNXB4IDA7CiAgfQogIGgxIHsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBmb250LXNpemU6IDQwcHg7CiAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgbWFyZ2luLWJvdHRvbTogMzVweDsKICB9CiAgcCArIGgxIHsgbWFyZ2luLXRvcDogNjBweCB9CiAgaDIsIGgzIHsKICAgIG1hcmdpbjogMzBweCAwIDE1cHggMDsKICB9CiAgcCArIGgyLCBwcmUgKyBoMiwgY29kZSArIGgyIHsKICAgIGJvcmRlci10b3A6IDZweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBwYWRkaW5nLXRvcDogMzBweDsKICB9CiAgaDMgewogICAgbWFyZ2luOiAxNXB4IDA7CiAgfQp9CgoKI2RvY3MgewogIEBiZzogbGlnaHRlbihAbGlnaHQtYmx1ZSwgNSUpOwogIGJvcmRlci10b3A6IDJweCBzb2xpZCBsaWdodGVuKEBiZywgNSUpOwogIGNvbG9yOiBAYmx1ZTsKICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtYmx1ZTsKICAuYm94LXNoYWRvdygwLCAtMnB4LCA1cHgsIDAuMik7CgogIGgxIHsKICAgIGZvbnQtZmFtaWx5OiAnRHJvaWQgU2VyaWYnLCAnR2VvcmdpYScsIHNlcmlmOwogICAgcGFkZGluZy10b3A6IDMwcHg7CiAgICBwYWRkaW5nLWxlZnQ6IDQ1cHg7CiAgICBmb250LXNpemU6IDQ0cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgbWFyZ2luOiAzMHB4IDAgIWltcG9ydGFudDsKICAgIHRleHQtc2hhZG93OiAwcHggMXB4IDFweCBAbGlnaHRlc3Q7CiAgICBmb250LXdlaWdodDogYm9sZDsKICB9CiAgLmNvbnRlbnQgewogICAgY2xlYXI6IGJvdGg7CiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRlbihAbGlnaHQtYmx1ZSwgMjUlKTsKICAgIC5ib3gtc2hhZG93KDAsIDVweCwgNXB4LCAwLjQpOwogIH0KICBwcmUgewogICAgQGJhY2tncm91bmQ6IGxpZ2h0ZW4oQGJnLCAzMCUpOwogICAgY29sb3I6IGxpZ2h0ZW4oQGJsdWUsIDEwJSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmFja2dyb3VuZDsKICAgIGJvcmRlci1jb2xvcjogbGlnaHRlbihAbGlnaHQtYmx1ZSwgMjUlKTsKICAgIGJvcmRlci13aWR0aDogMnB4OwogICAgY29kZSAuYXR0cmlidXRlIHsgY29sb3I6IGhzbCg0MCwgNTAlLCAzMCUpIH0KICAgIGNvZGUgLnZhcmlhYmxlICB7IGNvbG9yOiBoc2woMTIwLCAxMCUsIDMwJSkgfQogICAgY29kZSAuZWxlbWVudCAgIHsgY29sb3I6IGhzbCgxNzAsIDIwJSwgMzAlKSB9CgogICAgY29kZSAuc3RyaW5nLCAucmVnZXhwIHsgY29sb3I6IGhzbCg3NSwgNTAlLCAzNSUpIH0KICAgIGNvZGUgLmNsYXNzIHsgY29sb3I6IGhzbCg0MCwgNDAlLCAzMCUpOyBmb250LXdlaWdodDogbm9ybWFsIH0KICAgIGNvZGUgLmlkIHsgY29sb3I6IGhzbCg1MCwgNDAlLCAzMCUpOyBmb250LXdlaWdodDogbm9ybWFsIH0KICAgIGNvZGUgLmNvbW1lbnQgeyBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQpIH0KICAgIGNvZGUgLm51bWJlciwgLmNvbG9yIHsgY29sb3I6IGhzbCgxMCwgNDAlLCAzMCUpIH0KICAgIGNvZGUgLmNsYXNzLCBjb2RlIC5taXhpbiwgLnNwZWNpYWwgeyBjb2xvcjogaHNsKDE5MCwgMjAlLCAzMCUpIH0KICB9CiAgcHJlIGNvZGUgICAgICAgICAgICAgICAgICAgIHsgZm9udC1zaXplOiAxNXB4ICB9CiAgcCArIGgyLCBwcmUgKyBoMiwgY29kZSArIGgyIHsgYm9yZGVyLXRvcC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEpIH0KfQoKdGQgewogIHBhZGRpbmctcmlnaHQ6IDMwcHg7ICAKfQojc3lub3BzaXMgewogIC5ib3gtc2hhZG93KDAsIDVweCwgNXB4LCAwLjIpOwp9CiNzeW5vcHNpcywgI2Fib3V0IHsKICBoMiB7CiAgICBmb250LXNpemU6IDMwcHg7ICAKICAgIHBhZGRpbmc6IDEwcHggMDsKICB9CiAgaDEgKyBoMiB7CiAgICAgIG1hcmdpbi10b3A6IDE1cHg7ICAKICB9CiAgaDMgeyBmb250LXNpemU6IDIycHggfQoKICAuY29kZS1leGFtcGxlIHsKICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgYm9yZGVyLXdpZHRoOiAxcHg7CiAgICBib3JkZXItc3R5bGU6IGRhc2hlZDsKICAgIHBhZGRpbmc6IDA7CiAgICBwcmUgeyBib3JkZXI6IDA7IG1hcmdpbjogMCB9CiAgICB0ZCB7CiAgICAgIGJvcmRlcjogMDsKICAgICAgbWFyZ2luOiAwOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkZXNhdHVyYXRlKGRhcmtlbihAZGFya2VzdCwgNSUpLCAyMCUpOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICBwYWRkaW5nOiAwOwogICAgfQogICAgdHIgeyBwYWRkaW5nOiAwIH0KICB9CiAgLmNzcy1vdXRwdXQgewogICAgdGQgewogICAgICBib3JkZXItbGVmdDogMDsgIAogICAgfQogIH0KICAubGVzcy1leGFtcGxlIHsKICAgIC8vYm9yZGVyLXJpZ2h0OiAxcHggZG90dGVkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSAhaW1wb3J0YW50OwogIH0KICAuY3NzLW91dHB1dCwgLmxlc3MtZXhhbXBsZSB7CiAgICB3aWR0aDogMzkwcHg7CiAgfQogIHByZSB7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICBmb250LXNpemU6IDE0cHg7CiAgfQp9CiNhYm91dCwgI3N5bm9wc2lzLCAjZ3VpZGUgewogIGEgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6IEBsaWdodC15ZWxsb3c7CiAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgICY6aG92ZXIgewogICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQgQGxpZ2h0LXllbGxvdzsKICAgIH0KICB9CiAgQGJnOiBkZXNhdHVyYXRlKGRhcmtlbihAZGFya2VzdCwgNSUpLCAyMCUpOwogIHRleHQtc2hhZG93OiAwIC0xcHggMXB4IGxpZ2h0ZW4oQGJnLCA1JSk7CiAgY29sb3I6IEBoaWdobGlnaHQ7CiAgYmFja2dyb3VuZC1jb2xvcjogQGJnOwogIC5jb250ZW50IHsKICAgIGJhY2tncm91bmQtY29sb3I6IGRlc2F0dXJhdGUoQGRhcmtlc3QsIDIwJSk7CiAgICBjbGVhcjogYm90aDsKICAgIC5ib3gtc2hhZG93KDAsIDVweCwgNXB4LCAwLjQpOwogIH0KICBoMSwgaDIsIGgzIHsKICAgIGNvbG9yOiBAZGFyay15ZWxsb3c7CiAgfQogIHByZSB7CiAgICAgIGNvZGUgLmF0dHJpYnV0ZSB7IGNvbG9yOiBoc2woNDAsIDUwJSwgNzAlKSB9CiAgICAgIGNvZGUgLnZhcmlhYmxlICB7IGNvbG9yOiBoc2woMTIwLCAxMCUsIDUwJSkgfQogICAgICBjb2RlIC5lbGVtZW50ICAgeyBjb2xvcjogaHNsKDE3MCwgMjAlLCA1MCUpIH0KCiAgICAgIGNvZGUgLnN0cmluZywgLnJlZ2V4cCB7IGNvbG9yOiBoc2woNzUsIDUwJSwgNjUlKSB9CiAgICAgIGNvZGUgLmNsYXNzIHsgY29sb3I6IGhzbCg0MCwgNDAlLCA2MCUpOyBmb250LXdlaWdodDogbm9ybWFsIH0KICAgICAgY29kZSAuaWQgeyBjb2xvcjogaHNsKDUwLCA0MCUsIDYwJSk7IGZvbnQtd2VpZ2h0OiBub3JtYWwgfQogICAgICBjb2RlIC5jb21tZW50IHsgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSB9CiAgICAgIGNvZGUgLm51bWJlciwgLmNvbG9yIHsgY29sb3I6IGhzbCgxMCwgNDAlLCA1MCUpIH0KICAgICAgY29kZSAuY2xhc3MsIGNvZGUgLm1peGluLCAuc3BlY2lhbCB7IGNvbG9yOiBoc2woMTkwLCAyMCUsIDUwJSkgfQogICAgYmFja2dyb3VuZC1jb2xvcjogQGJnOwogICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oQGxpZ2h0LXllbGxvdywgNSUpOwogIH0KICBjb2RlIHsKICAgIGNvbG9yOiBkYXJrZW4oQGRhcmsteWVsbG93LCA1JSk7CiAgICAuc3RyaW5nLCAucmVnZXhwIHsgY29sb3I6IGRlc2F0dXJhdGUoQGxpZ2h0LWJsdWUsIDE1JSkgfQogICAgLmtleXdvcmQgeyBjb2xvcjogaHNsKDQwLCA0MCUsIDYwJSk7IGZvbnQtd2VpZ2h0OiBub3JtYWwgfQogICAgLmNvbW1lbnQgeyBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpIH0KICAgIC5udW1iZXIgeyBjb2xvcjogbGlnaHRlbihAYmx1ZSwgMTAlKSB9CiAgICAuY2xhc3MsIC5zcGVjaWFsIHsgY29sb3I6IGhzbCgxOTAsIDIwJSwgNTAlKSB9CiAgfQp9CiNndWlkZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmtlc3Q7CiAgLmNvbnRlbnQgewogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgfQoKfQoKI2Fib3V0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFya2VzdCAhaW1wb3J0YW50OwogIC5jb250ZW50IHsKICAgIGJhY2tncm91bmQtY29sb3I6IGRlc2F0dXJhdGUobGlnaHRlbihAZGFya2VzdCwgMyUpLCA1JSk7CiAgfQp9CiNzeW5vcHNpcyB7CiAgYmFja2dyb3VuZC1jb2xvcjogZGVzYXR1cmF0ZShsaWdodGVuKEBkYXJrZXN0LCAzJSksIDUlKSAhaW1wb3J0YW50OwogIC5jb250ZW50IHsKICAgIGJhY2tncm91bmQtY29sb3I6IGRlc2F0dXJhdGUobGlnaHRlbihAZGFya2VzdCwgMyUpLCA1JSk7CiAgfQogIHByZSB7fQp9CiNzeW5vcHNpcywgI2d1aWRlIHsKICAuY29udGVudCB7CiAgICAuYm94LXNoYWRvdygwLCAwcHgsIDBweCwgMC4wKTsKICB9Cn0KI2Fib3V0IGZvb3RlciB7CiAgbWFyZ2luLXRvcDogMzBweDsKICBwYWRkaW5nLXRvcDogMzBweDsKICBib3JkZXItdG9wOiA2cHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBmb250LXNpemU6IDE2cHg7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7CiAgI2NvcHkgeyBmb250LXNpemU6IDEycHggfQogIHRleHQtc2hhZG93OiAtMXB4IC0xcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wMik7Cn0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIHRoZW1lOiAibGVzc2VyLWRhcmsiLAogICAgICAgIGxpbmVOdW1iZXJzIDogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzIDogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtbGVzczwvY29kZT4sIDxjb2RlPnRleHQvY3NzPC9jb2RlPiAoaWYgbm90IHByZXZpb3VzbHkgZGVmaW5lZCkuPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/less/less.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICBMRVNTIG1vZGUgLSBodHRwOi8vd3d3Lmxlc3Njc3Mub3JnLwogIFBvcnRlZCB0byBDb2RlTWlycm9yIGJ5IFBldGVyIEtyb29uIDxwbGFrcm9vbkBnbWFpbC5jb20+CiAgUmVwb3J0IGJ1Z3MvaXNzdWVzIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvaXNzdWVzICBHaXRIdWI6IEBwZXRlcmtyb29uCiovCgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImxlc3MiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LCB0eXBlOwogIGZ1bmN0aW9uIHJldChzdHlsZSwgdHApIHt0eXBlID0gdHA7IHJldHVybiBzdHlsZTt9CiAgLy9odG1sIHRhZ3MKICB2YXIgdGFncyA9ICJhIGFiYnIgYWNyb255bSBhZGRyZXNzIGFwcGxldCBhcmVhIGFydGljbGUgYXNpZGUgYXVkaW8gYiBiYXNlIGJhc2Vmb250IGJkaSBiZG8gYmlnIGJsb2NrcXVvdGUgYm9keSBiciBidXR0b24gY2FudmFzIGNhcHRpb24gY2l0ZSBjb2RlIGNvbCBjb2xncm91cCBjb21tYW5kIGRhdGFsaXN0IGRkIGRlbCBkZXRhaWxzIGRmbiBkaXIgZGl2IGRsIGR0IGVtIGVtYmVkIGZpZWxkc2V0IGZpZ2NhcHRpb24gZmlndXJlIGZvbnQgZm9vdGVyIGZvcm0gZnJhbWUgZnJhbWVzZXQgaDEgaDIgaDMgaDQgaDUgaDYgaGVhZCBoZWFkZXIgaGdyb3VwIGhyIGh0bWwgaSBpZnJhbWUgaW1nIGlucHV0IGlucyBrZXlnZW4ga2JkIGxhYmVsIGxlZ2VuZCBsaSBsaW5rIG1hcCBtYXJrIG1lbnUgbWV0YSBtZXRlciBuYXYgbm9mcmFtZXMgbm9zY3JpcHQgb2JqZWN0IG9sIG9wdGdyb3VwIG9wdGlvbiBvdXRwdXQgcCBwYXJhbSBwcmUgcHJvZ3Jlc3MgcSBycCBydCBydWJ5IHMgc2FtcCBzY3JpcHQgc2VjdGlvbiBzZWxlY3Qgc21hbGwgc291cmNlIHNwYW4gc3RyaWtlIHN0cm9uZyBzdHlsZSBzdWIgc3VtbWFyeSBzdXAgdGFibGUgdGJvZHkgdGQgdGV4dGFyZWEgdGZvb3QgdGggdGhlYWQgdGltZSB0aXRsZSB0ciB0cmFjayB0dCB1IHVsIHZhciB2aWRlbyB3YnIiLnNwbGl0KCcgJyk7CiAgCiAgZnVuY3Rpb24gaW5UYWdzQXJyYXkodmFsKXsKICAgIGZvcih2YXIgaT0wOyBpPHRhZ3MubGVuZ3RoOyBpKyspaWYodmFsID09PSB0YWdzW2ldKXJldHVybiB0cnVlOwogIH0KICAgCiAgdmFyIHNlbGVjdG9ycyA9IC8oXlw6cm9vdCR8Xlw6bnRoXC1jaGlsZCR8Xlw6bnRoXC1sYXN0XC1jaGlsZCR8Xlw6bnRoXC1vZlwtdHlwZSR8Xlw6bnRoXC1sYXN0XC1vZlwtdHlwZSR8Xlw6Zmlyc3RcLWNoaWxkJHxeXDpsYXN0XC1jaGlsZCR8Xlw6Zmlyc3RcLW9mXC10eXBlJHxeXDpsYXN0XC1vZlwtdHlwZSR8Xlw6b25seVwtY2hpbGQkfF5cOm9ubHlcLW9mXC10eXBlJHxeXDplbXB0eSR8Xlw6bGlua3xeXDp2aXNpdGVkJHxeXDphY3RpdmUkfF5cOmhvdmVyJHxeXDpmb2N1cyR8Xlw6dGFyZ2V0JHxeXDpsYW5nJHxeXDplbmFibGVkXlw6ZGlzYWJsZWQkfF5cOmNoZWNrZWQkfF5cOmZpcnN0XC1saW5lJHxeXDpmaXJzdFwtbGV0dGVyJHxeXDpiZWZvcmUkfF5cOmFmdGVyJHxeXDpub3QkfF5cOnJlcXVpcmVkJHxeXDppbnZhbGlkJCkvOwogIAogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgCiAgICBpZiAoY2ggPT0gIkAiKSB7c3RyZWFtLmVhdFdoaWxlKC9bXHdcLV0vKTsgcmV0dXJuIHJldCgibWV0YSIsIHN0cmVhbS5jdXJyZW50KCkpO30KICAgIGVsc2UgaWYgKGNoID09ICIvIiAmJiBzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNDb21tZW50OwogICAgICByZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICI8IiAmJiBzdHJlYW0uZWF0KCIhIikpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblNHTUxDb21tZW50OwogICAgICByZXR1cm4gdG9rZW5TR01MQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICI9IikgcmV0KG51bGwsICJjb21wYXJlIik7CiAgICBlbHNlIGlmIChjaCA9PSAifCIgJiYgc3RyZWFtLmVhdCgiPSIpKSByZXR1cm4gcmV0KG51bGwsICJjb21wYXJlIik7CiAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nKGNoKTsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIi8iKSB7IC8vIGUuZy46IC5wbmcgd2lsbCBub3QgYmUgcGFyc2VkIGFzIGEgY2xhc3MKICAgICAgaWYoc3RyZWFtLmVhdCgiLyIpKXsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU0NvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuU0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH1lbHNlewogICAgICAgIGlmKHR5cGUgPT0gInN0cmluZyIgfHwgdHlwZSA9PSAiKCIpcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgICAgIGlmKHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSAhPSB1bmRlZmluZWQpcmV0dXJuIHJldChudWxsLCBjaCk7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXGEtekEtWjAtOVwtXy5cc10vKTsJCQogICAgICAgIGlmKCAvXC98XCl8Iy8udGVzdChzdHJlYW0ucGVlaygpIHx8IChzdHJlYW0uZWF0U3BhY2UoKSAmJiBzdHJlYW0ucGVlaygpID09ICIpIikpICB8fCBzdHJlYW0uZW9sKCkgKXJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsgLy8gbGV0IHVybCgvaW1hZ2VzL2xvZ28ucG5nKSB3aXRob3V0IHF1b3RlcyByZXR1cm4gYXMgc3RyaW5nCiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIhIikgewogICAgICBzdHJlYW0ubWF0Y2goL15ccypcdyovKTsKICAgICAgcmV0dXJuIHJldCgia2V5d29yZCIsICJpbXBvcnRhbnQiKTsKICAgIH0KICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgcmV0dXJuIHJldCgibnVtYmVyIiwgInVuaXQiKTsKICAgIH0KICAgIGVsc2UgaWYgKC9bLCs8PipcL10vLnRlc3QoY2gpKSB7CiAgICAgIGlmKHN0cmVhbS5wZWVrKCkgPT0gIj0iIHx8IHR5cGUgPT0gImEiKXJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsKICAgICAgcmV0dXJuIHJldChudWxsLCAic2VsZWN0LW9wIik7CiAgICB9CiAgICBlbHNlIGlmICgvWzt7fTpcW1xdKCl+XHxdLy50ZXN0KGNoKSkgewogICAgICBpZihjaCA9PSAiOiIpewkJCiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bYS16XFxcLV0vKTsKICAgICAgICBpZiggc2VsZWN0b3JzLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkgKXsKICAgICAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgICAgICB9ZWxzZSBpZihzdHJlYW0ucGVlaygpID09ICI6Iil7Ly86Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24KICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1thLXpcXFwtXS8pOwogICAgICAgICAgaWYoc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCgvXDpcOlwtKG98bXN8bW96fHdlYmtpdClcLS8pKXJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsKICAgICAgICAgIGlmKCBzZWxlY3RvcnMudGVzdChzdHJlYW0uY3VycmVudCgpLnN1YnN0cmluZygxKSkgKXJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgICAgICAgIHJldHVybiByZXQobnVsbCwgY2gpOwogICAgICAgIH1lbHNlewogICAgICAgICAgcmV0dXJuIHJldChudWxsLCBjaCk7IAogICAgICAgIH0KICAgICAgfWVsc2UgaWYoY2ggPT0gIn4iKXsKICAgICAgICBpZih0eXBlID09ICJyIilyZXR1cm4gcmV0KCJzdHJpbmciLCAic3RyaW5nIik7CiAgICAgIH1lbHNlewogICAgICAgIHJldHVybiByZXQobnVsbCwgY2gpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiLiIpIHsJCQogICAgICBpZih0eXBlID09ICIoIiB8fCB0eXBlID09ICJzdHJpbmciKXJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsgLy8gYWxsb3cgdXJsKC4uL2ltYWdlLnBuZykKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXGEtekEtWjAtOVwtX10vKTsKICAgICAgaWYoc3RyZWFtLnBlZWsoKSA9PSAiICIpc3RyZWFtLmVhdFNwYWNlKCk7CiAgICAgIGlmKHN0cmVhbS5wZWVrKCkgPT0gIikiKXJldHVybiByZXQoIm51bWJlciIsICJ1bml0Iik7Ly9yZ2JhKDAsMCwwLC4yNSk7CiAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICAvL3dlIGRvbid0IGVhdCB3aGl0ZS1zcGFjZSwgd2Ugd2FudCB0aGUgaGV4IGNvbG9yIGFuZCBvciBpZCBvbmx5CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW0EtWmEtejAtOV0vKTsKICAgICAgLy9jaGVjayBpZiB0aGVyZSBpcyBhIHByb3BlciBoZXggY29sb3IgbGVuZ3RoIGUuZy4gI2VlZSB8fCAjZWVlRUVFCiAgICAgIGlmKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoID09IDQgfHwgc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGggPT0gNyl7CiAgICAgICAgaWYoc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCgvW0EtRmEtZjAtOV17Nn18W0EtRmEtZjAtOV17M30vLGZhbHNlKSAhPSBudWxsKXsvL2lzIHRoZXJlIGEgdmFsaWQgaGV4IGNvbG9yIHZhbHVlIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgc3RyZWFtCiAgICAgICAgICAvL3doZW4gbm90IGEgdmFsaWQgaGV4IHZhbHVlLCBwYXJzZSBhcyBpZAogICAgICAgICAgaWYoc3RyZWFtLmN1cnJlbnQoKS5zdWJzdHJpbmcoMSkgIT0gc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCgvW0EtRmEtZjAtOV17Nn18W0EtRmEtZjAtOV17M30vLGZhbHNlKSlyZXR1cm4gcmV0KCJhdG9tIiwgInRhZyIpOwogICAgICAgICAgLy9lYXQgd2hpdGUtc3BhY2UKICAgICAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICAgICAgLy93aGVuIGhleCB2YWx1ZSBkZWNsYXJhdGlvbiBkb2Vzbid0IGVuZCB3aXRoIFs7LF0gYnV0IGlzIGRvZXMgd2l0aCBhIHNsYXNoL2NjIGNvbW1lbnQgdHJlYXQgaXQgYXMgYW4gaWQsIGp1c3QgbGlrZSB0aGUgb3RoZXIgaGV4IHZhbHVlcyB0aGF0IGRvbid0IGVuZCB3aXRoWzssXQogICAgICAgICAgaWYoIC9bXC88Pi4oKXshJCVeJipfXC1cXD89K1x8Iyd+YF0vLnRlc3Qoc3RyZWFtLnBlZWsoKSkgKXJldHVybiByZXQoImF0b20iLCAidGFnIik7CiAgICAgICAgICAvLyN0aW1lIHsgY29sb3I6ICNhYWEgfQogICAgICAgICAgZWxzZSBpZihzdHJlYW0ucGVlaygpID09ICJ9IiApcmV0dXJuIHJldCgibnVtYmVyIiwgInVuaXQiKTsKICAgICAgICAgIC8vd2UgaGF2ZSBhIHZhbGlkIGhleCBjb2xvciB2YWx1ZSwgcGFyc2UgYXMgaWQgd2hlbmV2ZXIgYW4gZWxlbWVudC9jbGFzcyBpcyBkZWZpbmVkIGFmdGVyIHRoZSBoZXgoaWQpIHZhbHVlIGUuZy4gI2VlZSBhYWEgfHwgI2VlZSAuYWFhCiAgICAgICAgICBlbHNlIGlmKCAvW2EtekEtWlxcXS8udGVzdChzdHJlYW0ucGVlaygpKSApcmV0dXJuIHJldCgiYXRvbSIsICJ0YWciKTsKICAgICAgICAgIC8vd2hlbiBhIGhleCB2YWx1ZSBpcyBvbiB0aGUgZW5kIG9mIGEgbGluZSwgcGFyc2UgYXMgaWQKICAgICAgICAgIGVsc2UgaWYoc3RyZWFtLmVvbCgpKXJldHVybiByZXQoImF0b20iLCAidGFnIik7CiAgICAgICAgICAvL2RlZmF1bHQKICAgICAgICAgIGVsc2UgcmV0dXJuIHJldCgibnVtYmVyIiwgInVuaXQiKTsKICAgICAgICB9ZWxzZXsvL3doZW4gbm90IGEgdmFsaWQgaGV4dmFsdWUgaW4gdGhlIGN1cnJlbnQgc3RyZWFtIGUuZy4gI2Zvb3RlcgogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXS8pOwogICAgICAgICAgcmV0dXJuIHJldCgiYXRvbSIsICJ0YWciKTsgCiAgICAgICAgfQogICAgICB9ZWxzZXsvL3doZW4gbm90IGEgdmFsaWQgaGV4dmFsdWUgbGVuZ3RoCiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXS8pOwogICAgICAgIHJldHVybiByZXQoImF0b20iLCAidGFnIik7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICImIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wtXS8pOwogICAgICByZXR1cm4gcmV0KG51bGwsIGNoKTsKICAgIH0KICAgIGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1fJS57XS8pOwogICAgICBpZih0eXBlID09ICJzdHJpbmciKXsKICAgICAgICByZXR1cm4gcmV0KCJzdHJpbmciLCAic3RyaW5nIik7CiAgICAgIH1lbHNlIGlmKHN0cmVhbS5jdXJyZW50KCkubWF0Y2goLyheaHR0cCR8Xmh0dHBzJCkvKSAhPSBudWxsKXsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1fJS57OlwvXS8pOwogICAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsKICAgICAgfWVsc2UgaWYoc3RyZWFtLnBlZWsoKSA9PSAiPCIgfHwgc3RyZWFtLnBlZWsoKSA9PSAiPiIpewogICAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgICAgfWVsc2UgaWYoIC9cKC8udGVzdChzdHJlYW0ucGVlaygpKSApewkJCQkJCQkJCQkJCQkJCQkJICAKICAgICAgICByZXR1cm4gcmV0KG51bGwsIGNoKTsKICAgICAgfWVsc2UgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIi8iICYmIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSAhPSB1bmRlZmluZWQpeyAvLyB1cmwoZGlyL2NlbnRlci9pbWFnZS5wbmcpCiAgICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgICB9ZWxzZSBpZiggc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCgvXC1cZHxcLS5cZC8pICl7IC8vIG1hdGNoIGUuZy46IC01cHggLTAuNCBldGMuLi4gb25seSBjb2xvcml6ZSB0aGUgbWludXMgc2lnbgogICAgICAgIC8vY29tbW1lbnQgb3V0IHRoZXNlIDIgY29tbWVudCBpZiB5b3Ugd2FudCB0aGUgbWludXMgc2lnbiB0byBiZSBwYXJzZWQgYXMgbnVsbCAtNTAwcHgKICAgICAgICAvL3N0cmVhbS5iYWNrVXAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGgtMSk7CiAgICAgICAgLy9yZXR1cm4gcmV0KG51bGwsIGNoKTsgLy9jb25zb2xlLmxvZyggc3RyZWFtLmN1cnJlbnQoKSApOwkJCiAgICAgICAgcmV0dXJuIHJldCgibnVtYmVyIiwgInVuaXQiKTsKICAgICAgfWVsc2UgaWYoIGluVGFnc0FycmF5KHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKSkgKXsgLy8gbWF0Y2ggaHRtbCB0YWdzCiAgICAgICAgcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOwogICAgICB9ZWxzZSBpZiggL1wvfFtcc1wpXS8udGVzdChzdHJlYW0ucGVlaygpIHx8IHN0cmVhbS5lb2woKSB8fCAoc3RyZWFtLmVhdFNwYWNlKCkgJiYgc3RyZWFtLnBlZWsoKSA9PSAiLyIpKSAmJiBzdHJlYW0uY3VycmVudCgpLmluZGV4T2YoIi4iKSAhPT0gLTEpewogICAgICAgIGlmKHN0cmVhbS5jdXJyZW50KCkuc3Vic3RyaW5nKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoLTEsc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGgpID09ICJ7Iil7CiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgICAgcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOwogICAgICAgIH0vL2VuZCBpZgogICAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICAgIGlmKCAvW3s8Pi5hLXpBLVpcL10vLnRlc3Qoc3RyZWFtLnBlZWsoKSkgIHx8IHN0cmVhbS5lb2woKSApcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOyAvLyBlLmcuIGJ1dHRvbi5pY29uLXBsdXMKICAgICAgICByZXR1cm4gcmV0KCJzdHJpbmciLCAic3RyaW5nIik7IC8vIGxldCB1cmwoL2ltYWdlcy9sb2dvLnBuZykgd2l0aG91dCBxdW90ZXMgcmV0dXJuIGFzIHN0cmluZwogICAgICB9ZWxzZSBpZiggc3RyZWFtLmVvbCgpIHx8IHN0cmVhbS5wZWVrKCkgPT0gIlsiIHx8IHN0cmVhbS5wZWVrKCkgPT0gIiMiIHx8IHR5cGUgPT0gInRhZyIgKXsKICAgICAgICBpZihzdHJlYW0uY3VycmVudCgpLnN1YnN0cmluZyhzdHJlYW0uY3VycmVudCgpLmxlbmd0aC0xLHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoKSA9PSAieyIpc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgICByZXR1cm4gcmV0KCJ0YWciLCAidGFnIik7CiAgICAgIH1lbHNlIGlmKHR5cGUgPT0gImNvbXBhcmUiIHx8IHR5cGUgPT0gImEiIHx8IHR5cGUgPT0gIigiKXsKICAgICAgICByZXR1cm4gcmV0KCJzdHJpbmciLCAic3RyaW5nIik7CiAgICAgIH1lbHNlIGlmKHR5cGUgPT0gInwiIHx8IHN0cmVhbS5jdXJyZW50KCkgPT0gIi0iIHx8IHR5cGUgPT0gIlsiKXsKICAgICAgICByZXR1cm4gcmV0KG51bGwsIGNoKTsKICAgICAgfWVsc2UgaWYoc3RyZWFtLnBlZWsoKSA9PSAiOiIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHZhciB0X3YgPSBzdHJlYW0ucGVlaygpID09ICI6IiA/IHRydWUgOiBmYWxzZTsKICAgICAgICBpZighdF92KXsKICAgICAgCSAgdmFyIG9sZF9wb3MgPSBzdHJlYW0ucG9zOwogICAgICAJICB2YXIgc2MgPSBzdHJlYW0uY3VycmVudCgpLmxlbmd0aDsKICAgICAgCSAgc3RyZWFtLmVhdFdoaWxlKC9bYS16XFxcLV0vKTsKICAgICAgCSAgdmFyIG5ld19wb3MgPSBzdHJlYW0ucG9zOwogICAgICAJICBpZihzdHJlYW0uY3VycmVudCgpLnN1YnN0cmluZyhzYy0xKS5tYXRjaChzZWxlY3RvcnMpICE9IG51bGwpewogICAgICAJICAgIHN0cmVhbS5iYWNrVXAobmV3X3Bvcy0ob2xkX3Bvcy0xKSk7CiAgICAgIAkJcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOwogICAgICAJICB9IGVsc2Ugc3RyZWFtLmJhY2tVcChuZXdfcG9zLShvbGRfcG9zLTEpKTsKICAgICAgCX1lbHNlewogICAgICAJICBzdHJlYW0uYmFja1VwKDEpOwkKICAgICAgCX0KICAgICAgCWlmKHRfdilyZXR1cm4gcmV0KCJ0YWciLCAidGFnIik7IGVsc2UgcmV0dXJuIHJldCgidmFyaWFibGUiLCAidmFyaWFibGUiKTsKICAgICAgfWVsc2V7CQkKICAgICAgICByZXR1cm4gcmV0KCJ2YXJpYWJsZSIsICJ2YXJpYWJsZSIpOwkJCiAgICAgIH0KICAgIH0gICAgCiAgfQogIAogIGZ1bmN0aW9uIHRva2VuU0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgeyAvLyBTQ29tbWVudCA9IFNsYXNoIGNvbW1lbnQKICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgfQogIAogIGZ1bmN0aW9uIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKG1heWJlRW5kICYmIGNoID09ICIvIikgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQiKTsKICB9CiAgCiAgZnVuY3Rpb24gdG9rZW5TR01MQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgZGFzaGVzID0gMCwgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAoZGFzaGVzID49IDIgJiYgY2ggPT0gIj4iKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGFzaGVzID0gKGNoID09ICItIikgPyBkYXNoZXMgKyAxIDogMDsKICAgIH0KICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KICAKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKCFlc2NhcGVkKSBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgfTsKICB9CiAgCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2UpIHsgCiAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICBiYXNlSW5kZW50OiBiYXNlIHx8IDAsCiAgICAgICAgICAgICAgc3RhY2s6IFtdfTsKICAgIH0sCiAgICAKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAKICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGgtMV07CiAgICAgIGlmICh0eXBlID09ICJoYXNoIiAmJiBjb250ZXh0ID09ICJydWxlIikgc3R5bGUgPSAiYXRvbSI7CiAgICAgIGVsc2UgaWYgKHN0eWxlID09ICJ2YXJpYWJsZSIpIHsKICAgICAgICBpZiAoY29udGV4dCA9PSAicnVsZSIpIHN0eWxlID0gbnVsbDsgLy8idGFnIgogICAgICAgIGVsc2UgaWYgKCFjb250ZXh0IHx8IGNvbnRleHQgPT0gIkBtZWRpYXsiKSB7CiAgICAgICAgICBzdHlsZSA9IHN0cmVhbS5jdXJyZW50KCkgPT0gIndoZW4iICA/ICJ2YXJpYWJsZSIgOgogICAgICAgICAgL1tccyx8XHNcKXxcc10vLnRlc3Qoc3RyZWFtLnBlZWsoKSkgPyAidGFnIiAgICAgIDogdHlwZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGlmIChjb250ZXh0ID09ICJydWxlIiAmJiAvXltce1x9O10kLy50ZXN0KHR5cGUpKQogICAgICAgIHN0YXRlLnN0YWNrLnBvcCgpOwogICAgICBpZiAodHlwZSA9PSAieyIpIHsKICAgICAgICBpZiAoY29udGV4dCA9PSAiQG1lZGlhIikgc3RhdGUuc3RhY2tbc3RhdGUuc3RhY2subGVuZ3RoLTFdID0gIkBtZWRpYXsiOwogICAgICAgIGVsc2Ugc3RhdGUuc3RhY2sucHVzaCgieyIpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIn0iKSBzdGF0ZS5zdGFjay5wb3AoKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiQG1lZGlhIikgc3RhdGUuc3RhY2sucHVzaCgiQG1lZGlhIik7CiAgICAgIGVsc2UgaWYgKGNvbnRleHQgPT0gInsiICYmIHR5cGUgIT0gImNvbW1lbnQiKSBzdGF0ZS5zdGFjay5wdXNoKCJydWxlIik7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCiAgICAKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgbiA9IHN0YXRlLnN0YWNrLmxlbmd0aDsKICAgICAgaWYgKC9eXH0vLnRlc3QodGV4dEFmdGVyKSkKICAgICAgICBuIC09IHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9PSAicnVsZSIgPyAyIDogMTsKICAgICAgcmV0dXJuIHN0YXRlLmJhc2VJbmRlbnQgKyBuICogaW5kZW50VW5pdDsKICAgIH0sCiAgICAKICAgIGVsZWN0cmljQ2hhcnM6ICJ9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbGVzcyIsICJsZXNzIik7CmlmICghQ29kZU1pcnJvci5taW1lTW9kZXMuaGFzT3duUHJvcGVydHkoInRleHQvY3NzIikpCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2NzcyIsICJsZXNzIik7]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/lua/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/lua/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEx1YSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvdXRpbC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibHVhLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvbmVhdC5jc3MiPgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogTHVhIG1vZGU8L2gxPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS1bWwpleGFtcGxlIHVzZWxlc3MgY29kZSB0byBzaG93IGx1YSBzeW50YXggaGlnaGxpZ2h0aW5nCnRoaXMgaXMgbXVsdGlsaW5lIGNvbW1lbnQKXV0KCmZ1bmN0aW9uIGJsYWhibGFoYmxhaCh4KQoKICBsb2NhbCB0YWJsZSA9IHsKICAgICJhc2QiID0gMTIzLAogICAgIngiID0gMC4zNCwgIAogIH0KICBpZiB4IH49IDMgdGhlbgogICAgcHJpbnQoIHggKQogIGVsc2VpZiB4ID09ICJzdHJpbmciCiAgICBteV9jdXN0b21fZnVuY3Rpb24oIDB4MzQgKQogIGVsc2UKICAgIHVua25vd25fZnVuY3Rpb24oICJzb21lIHN0cmluZyIgKQogIGVuZAoKICAtLXNpbmdsZSBsaW5lIGNvbW1lbnQKICAKZW5kCgpmdW5jdGlvbiBibGFibGFibGEzKCkKCiAgZm9yIGssdiBpbiBpcGFpcnMoIHRhYmxlICkgZG8KICAgIC0tYWJjZGUuLgogICAgeT1bPVsKICB4PVtbCiAgICAgIHggaXMgYSBtdWx0aSBsaW5lIHN0cmluZwogICBdXQogIGJ1dCBpdHMgZGVmaW5pdGlvbiBpcyBpc2lkZSBhIGhpZ2hlc3QgbGV2ZWwgc3RyaW5nIQogIF09XQogICAgcHJpbnQoIiBcIlwiICIpCgogICAgcyA9IG1hdGguc2luKCB4ICkKICBlbmQKCmVuZAo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgdGFiTW9kZTogImluZGVudCIsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICB0aGVtZTogIm5lYXQiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+TG9vc2VseSBiYXNlZCBvbiBGcmFuY2lzemVrCiAgICBXYXdyemFrJ3MgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0LzEvY29udHJpYi9sdWEiPkNvZGVNaXJyb3IKICAgIDEgbW9kZTwvYT4uIE9uZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpcwogICAgc3VwcG9ydGVkLCA8Y29kZT5zcGVjaWFsczwvY29kZT4sIHRvIHdoaWNoIHlvdSBjYW4gcHJvdmlkZSBhbgogICAgYXJyYXkgb2Ygc3RyaW5ncyB0byBoYXZlIHRob3NlIGlkZW50aWZpZXJzIGhpZ2hsaWdodGVkIHdpdGgKICAgIHRoZSA8Y29kZT5sdWEtc3BlY2lhbDwvY29kZT4gc3R5bGUuPC9wPgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1sdWE8L2NvZGU+LjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/lua/lua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gTFVBIG1vZGUuIFBvcnRlZCB0byBDb2RlTWlycm9yIDIgZnJvbSBGcmFuY2lzemVrIFdhd3J6YWsncwovLyBDb2RlTWlycm9yIDEgbW9kZS4KLy8gaGlnaGxpZ2h0cyBrZXl3b3Jkcywgc3RyaW5ncywgY29tbWVudHMgKG5vIGxldmVsaW5nIHN1cHBvcnRlZCEgKCJbPT1bIikpLCB0b2tlbnMsIGJhc2ljIGluZGVudGluZwogCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgibHVhIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwoKICBmdW5jdGlvbiBwcmVmaXhSRSh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikiLCAiaSIpOwogIH0KICBmdW5jdGlvbiB3b3JkUkUod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpJCIsICJpIik7CiAgfQogIHZhciBzcGVjaWFscyA9IHdvcmRSRShwYXJzZXJDb25maWcuc3BlY2lhbHMgfHwgW10pOwogCiAgLy8gbG9uZyBsaXN0IG9mIHN0YW5kYXJkIGZ1bmN0aW9ucyBmcm9tIGx1YSBtYW51YWwKICB2YXIgYnVpbHRpbnMgPSB3b3JkUkUoWwogICAgIl9HIiwiX1ZFUlNJT04iLCJhc3NlcnQiLCJjb2xsZWN0Z2FyYmFnZSIsImRvZmlsZSIsImVycm9yIiwiZ2V0ZmVudiIsImdldG1ldGF0YWJsZSIsImlwYWlycyIsImxvYWQiLAogICAgImxvYWRmaWxlIiwibG9hZHN0cmluZyIsIm1vZHVsZSIsIm5leHQiLCJwYWlycyIsInBjYWxsIiwicHJpbnQiLCJyYXdlcXVhbCIsInJhd2dldCIsInJhd3NldCIsInJlcXVpcmUiLAogICAgInNlbGVjdCIsInNldGZlbnYiLCJzZXRtZXRhdGFibGUiLCJ0b251bWJlciIsInRvc3RyaW5nIiwidHlwZSIsInVucGFjayIsInhwY2FsbCIsCgogICAgImNvcm91dGluZS5jcmVhdGUiLCJjb3JvdXRpbmUucmVzdW1lIiwiY29yb3V0aW5lLnJ1bm5pbmciLCJjb3JvdXRpbmUuc3RhdHVzIiwiY29yb3V0aW5lLndyYXAiLCJjb3JvdXRpbmUueWllbGQiLAoKICAgICJkZWJ1Zy5kZWJ1ZyIsImRlYnVnLmdldGZlbnYiLCJkZWJ1Zy5nZXRob29rIiwiZGVidWcuZ2V0aW5mbyIsImRlYnVnLmdldGxvY2FsIiwiZGVidWcuZ2V0bWV0YXRhYmxlIiwKICAgICJkZWJ1Zy5nZXRyZWdpc3RyeSIsImRlYnVnLmdldHVwdmFsdWUiLCJkZWJ1Zy5zZXRmZW52IiwiZGVidWcuc2V0aG9vayIsImRlYnVnLnNldGxvY2FsIiwiZGVidWcuc2V0bWV0YXRhYmxlIiwKICAgICJkZWJ1Zy5zZXR1cHZhbHVlIiwiZGVidWcudHJhY2ViYWNrIiwKCiAgICAiY2xvc2UiLCJmbHVzaCIsImxpbmVzIiwicmVhZCIsInNlZWsiLCJzZXR2YnVmIiwid3JpdGUiLAoKICAgICJpby5jbG9zZSIsImlvLmZsdXNoIiwiaW8uaW5wdXQiLCJpby5saW5lcyIsImlvLm9wZW4iLCJpby5vdXRwdXQiLCJpby5wb3BlbiIsImlvLnJlYWQiLCJpby5zdGRlcnIiLCJpby5zdGRpbiIsCiAgICAiaW8uc3Rkb3V0IiwiaW8udG1wZmlsZSIsImlvLnR5cGUiLCJpby53cml0ZSIsCgogICAgIm1hdGguYWJzIiwibWF0aC5hY29zIiwibWF0aC5hc2luIiwibWF0aC5hdGFuIiwibWF0aC5hdGFuMiIsIm1hdGguY2VpbCIsIm1hdGguY29zIiwibWF0aC5jb3NoIiwibWF0aC5kZWciLAogICAgIm1hdGguZXhwIiwibWF0aC5mbG9vciIsIm1hdGguZm1vZCIsIm1hdGguZnJleHAiLCJtYXRoLmh1Z2UiLCJtYXRoLmxkZXhwIiwibWF0aC5sb2ciLCJtYXRoLmxvZzEwIiwibWF0aC5tYXgiLAogICAgIm1hdGgubWluIiwibWF0aC5tb2RmIiwibWF0aC5waSIsIm1hdGgucG93IiwibWF0aC5yYWQiLCJtYXRoLnJhbmRvbSIsIm1hdGgucmFuZG9tc2VlZCIsIm1hdGguc2luIiwibWF0aC5zaW5oIiwKICAgICJtYXRoLnNxcnQiLCJtYXRoLnRhbiIsIm1hdGgudGFuaCIsCgogICAgIm9zLmNsb2NrIiwib3MuZGF0ZSIsIm9zLmRpZmZ0aW1lIiwib3MuZXhlY3V0ZSIsIm9zLmV4aXQiLCJvcy5nZXRlbnYiLCJvcy5yZW1vdmUiLCJvcy5yZW5hbWUiLCJvcy5zZXRsb2NhbGUiLAogICAgIm9zLnRpbWUiLCJvcy50bXBuYW1lIiwKCiAgICAicGFja2FnZS5jcGF0aCIsInBhY2thZ2UubG9hZGVkIiwicGFja2FnZS5sb2FkZXJzIiwicGFja2FnZS5sb2FkbGliIiwicGFja2FnZS5wYXRoIiwicGFja2FnZS5wcmVsb2FkIiwKICAgICJwYWNrYWdlLnNlZWFsbCIsCgogICAgInN0cmluZy5ieXRlIiwic3RyaW5nLmNoYXIiLCJzdHJpbmcuZHVtcCIsInN0cmluZy5maW5kIiwic3RyaW5nLmZvcm1hdCIsInN0cmluZy5nbWF0Y2giLCJzdHJpbmcuZ3N1YiIsCiAgICAic3RyaW5nLmxlbiIsInN0cmluZy5sb3dlciIsInN0cmluZy5tYXRjaCIsInN0cmluZy5yZXAiLCJzdHJpbmcucmV2ZXJzZSIsInN0cmluZy5zdWIiLCJzdHJpbmcudXBwZXIiLAoKICAgICJ0YWJsZS5jb25jYXQiLCJ0YWJsZS5pbnNlcnQiLCJ0YWJsZS5tYXhuIiwidGFibGUucmVtb3ZlIiwidGFibGUuc29ydCIKICBdKTsKICB2YXIga2V5d29yZHMgPSB3b3JkUkUoWyJhbmQiLCJicmVhayIsImVsc2VpZiIsImZhbHNlIiwibmlsIiwibm90Iiwib3IiLCJyZXR1cm4iLAoJCQkgInRydWUiLCJmdW5jdGlvbiIsICJlbmQiLCAiaWYiLCAidGhlbiIsICJlbHNlIiwgImRvIiwgCgkJCSAid2hpbGUiLCAicmVwZWF0IiwgInVudGlsIiwgImZvciIsICJpbiIsICJsb2NhbCIgXSk7CgogIHZhciBpbmRlbnRUb2tlbnMgPSB3b3JkUkUoWyJmdW5jdGlvbiIsICJpZiIsInJlcGVhdCIsImRvIiwgIlxcKCIsICJ7Il0pOwogIHZhciBkZWRlbnRUb2tlbnMgPSB3b3JkUkUoWyJlbmQiLCAidW50aWwiLCAiXFwpIiwgIn0iXSk7CiAgdmFyIGRlZGVudFBhcnRpYWwgPSBwcmVmaXhSRShbImVuZCIsICJ1bnRpbCIsICJcXCkiLCAifSIsICJlbHNlIiwgImVsc2VpZiJdKTsKCiAgZnVuY3Rpb24gcmVhZEJyYWNrZXQoc3RyZWFtKSB7CiAgICB2YXIgbGV2ZWwgPSAwOwogICAgd2hpbGUgKHN0cmVhbS5lYXQoIj0iKSkgKytsZXZlbDsKICAgIHN0cmVhbS5lYXQoIlsiKTsKICAgIHJldHVybiBsZXZlbDsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICItIiAmJiBzdHJlYW0uZWF0KCItIikpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIlsiKSAmJiBzdHJlYW0uZWF0KCJbIikpCiAgICAgICAgcmV0dXJuIChzdGF0ZS5jdXIgPSBicmFja2V0ZWQocmVhZEJyYWNrZXQoc3RyZWFtKSwgImNvbW1lbnQiKSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0gCiAgICBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpCiAgICAgIHJldHVybiAoc3RhdGUuY3VyID0gc3RyaW5nKGNoKSkoc3RyZWFtLCBzdGF0ZSk7CiAgICBpZiAoY2ggPT0gIlsiICYmIC9bXFs9XS8udGVzdChzdHJlYW0ucGVlaygpKSkKICAgICAgcmV0dXJuIChzdGF0ZS5jdXIgPSBicmFja2V0ZWQocmVhZEJyYWNrZXQoc3RyZWFtKSwgInN0cmluZyIpKShzdHJlYW0sIHN0YXRlKTsKICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3LiVdLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmICgvW1x3X10vLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XFxcLV8uXS8pOwogICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gYnJhY2tldGVkKGxldmVsLCBzdHlsZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGN1cmxldiA9IG51bGwsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjdXJsZXYgPT0gbnVsbCkge2lmIChjaCA9PSAiXSIpIGN1cmxldiA9IDA7fQogICAgICAgIGVsc2UgaWYgKGNoID09ICI9IikgKytjdXJsZXY7CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIl0iICYmIGN1cmxldiA9PSBsZXZlbCkgeyBzdGF0ZS5jdXIgPSBub3JtYWw7IGJyZWFrOyB9CiAgICAgICAgZWxzZSBjdXJsZXYgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBzdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgYnJlYWs7CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKCFlc2NhcGVkKSBzdGF0ZS5jdXIgPSBub3JtYWw7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQogICAgCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2wpIHsKICAgICAgcmV0dXJuIHtiYXNlY29sOiBiYXNlY29sIHx8IDAsIGluZGVudERlcHRoOiAwLCBjdXI6IG5vcm1hbH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLmN1cihzdHJlYW0sIHN0YXRlKTsKICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBpZiAoc3R5bGUgPT0gInZhcmlhYmxlIikgewogICAgICAgIGlmIChrZXl3b3Jkcy50ZXN0KHdvcmQpKSBzdHlsZSA9ICJrZXl3b3JkIjsKICAgICAgICBlbHNlIGlmIChidWlsdGlucy50ZXN0KHdvcmQpKSBzdHlsZSA9ICJidWlsdGluIjsKCWVsc2UgaWYgKHNwZWNpYWxzLnRlc3Qod29yZCkpIHN0eWxlID0gInZhcmlhYmxlLTIiOwogICAgICB9CiAgICAgIGlmICgoc3R5bGUgIT0gImNvbW1lbnQiKSAmJiAoc3R5bGUgIT0gInN0cmluZyIpKXsKICAgICAgICBpZiAoaW5kZW50VG9rZW5zLnRlc3Qod29yZCkpICsrc3RhdGUuaW5kZW50RGVwdGg7CiAgICAgICAgZWxzZSBpZiAoZGVkZW50VG9rZW5zLnRlc3Qod29yZCkpIC0tc3RhdGUuaW5kZW50RGVwdGg7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIGNsb3NpbmcgPSBkZWRlbnRQYXJ0aWFsLnRlc3QodGV4dEFmdGVyKTsKICAgICAgcmV0dXJuIHN0YXRlLmJhc2Vjb2wgKyBpbmRlbnRVbml0ICogKHN0YXRlLmluZGVudERlcHRoIC0gKGNsb3NpbmcgPyAxIDogMCkpOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbHVhIiwgImx1YSIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/markdown/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/markdown/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IE1hcmtkb3duIG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvdXRpbC9jb250aW51ZWxpc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Im1hcmtkb3duLmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBNYXJrZG93biBtb2RlPC9oMT4KCjwhLS0gc291cmNlOiBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL2Jhc2ljcy50ZXh0IC0tPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpNYXJrZG93bjogQmFzaWNzCj09PT09PT09PT09PT09PT0KCiZsdDt1bCBpZD0iUHJvamVjdFN1Ym1lbnUiJmd0OwogICAgJmx0O2xpJmd0OyZsdDthIGhyZWY9Ii9wcm9qZWN0cy9tYXJrZG93bi8iIHRpdGxlPSJNYXJrZG93biBQcm9qZWN0IFBhZ2UiJmd0O01haW4mbHQ7L2EmZ3Q7Jmx0Oy9saSZndDsKICAgICZsdDtsaSZndDsmbHQ7YSBjbGFzcz0ic2VsZWN0ZWQiIHRpdGxlPSJNYXJrZG93biBCYXNpY3MiJmd0O0Jhc2ljcyZsdDsvYSZndDsmbHQ7L2xpJmd0OwogICAgJmx0O2xpJmd0OyZsdDthIGhyZWY9Ii9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgiIHRpdGxlPSJNYXJrZG93biBTeW50YXggRG9jdW1lbnRhdGlvbiImZ3Q7U3ludGF4Jmx0Oy9hJmd0OyZsdDsvbGkmZ3Q7CiAgICAmbHQ7bGkmZ3Q7Jmx0O2EgaHJlZj0iL3Byb2plY3RzL21hcmtkb3duL2xpY2Vuc2UiIHRpdGxlPSJQcmljaW5nIGFuZCBMaWNlbnNlIEluZm9ybWF0aW9uIiZndDtMaWNlbnNlJmx0Oy9hJmd0OyZsdDsvbGkmZ3Q7CiAgICAmbHQ7bGkmZ3Q7Jmx0O2EgaHJlZj0iL3Byb2plY3RzL21hcmtkb3duL2Rpbmd1cyIgdGl0bGU9Ik9ubGluZSBNYXJrZG93biBXZWIgRm9ybSImZ3Q7RGluZ3VzJmx0Oy9hJmd0OyZsdDsvbGkmZ3Q7CiZsdDsvdWwmZ3Q7CgoKR2V0dGluZyB0aGUgR2lzdCBvZiBNYXJrZG93bidzIEZvcm1hdHRpbmcgU3ludGF4Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBwYWdlIG9mZmVycyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHdoYXQgaXQncyBsaWtlIHRvIHVzZSBNYXJrZG93bi4KVGhlIFtzeW50YXggcGFnZV0gW3NdIHByb3ZpZGVzIGNvbXBsZXRlLCBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGZvcgpldmVyeSBmZWF0dXJlLCBidXQgTWFya2Rvd24gc2hvdWxkIGJlIHZlcnkgZWFzeSB0byBwaWNrIHVwIHNpbXBseSBieQpsb29raW5nIGF0IGEgZmV3IGV4YW1wbGVzIG9mIGl0IGluIGFjdGlvbi4gVGhlIGV4YW1wbGVzIG9uIHRoaXMgcGFnZQphcmUgd3JpdHRlbiBpbiBhIGJlZm9yZS9hZnRlciBzdHlsZSwgc2hvd2luZyBleGFtcGxlIHN5bnRheCBhbmQgdGhlCkhUTUwgb3V0cHV0IHByb2R1Y2VkIGJ5IE1hcmtkb3duLgoKSXQncyBhbHNvIGhlbHBmdWwgdG8gc2ltcGx5IHRyeSBNYXJrZG93biBvdXQ7IHRoZSBbRGluZ3VzXSBbZF0gaXMgYQp3ZWIgYXBwbGljYXRpb24gdGhhdCBhbGxvd3MgeW91IHR5cGUgeW91ciBvd24gTWFya2Rvd24tZm9ybWF0dGVkIHRleHQKYW5kIHRyYW5zbGF0ZSBpdCB0byBYSFRNTC4KCioqTm90ZToqKiBUaGlzIGRvY3VtZW50IGlzIGl0c2VsZiB3cml0dGVuIHVzaW5nIE1hcmtkb3duOyB5b3UKY2FuIFtzZWUgdGhlIHNvdXJjZSBmb3IgaXQgYnkgYWRkaW5nICcudGV4dCcgdG8gdGhlIFVSTF0gW3NyY10uCgogIFtzXTogL3Byb2plY3RzL21hcmtkb3duL3N5bnRheCAgIk1hcmtkb3duIFN5bnRheCIKICBbZF06IC9wcm9qZWN0cy9tYXJrZG93bi9kaW5ndXMgICJNYXJrZG93biBEaW5ndXMiCiAgW3NyY106IC9wcm9qZWN0cy9tYXJrZG93bi9iYXNpY3MudGV4dAoKCiMjIFBhcmFncmFwaHMsIEhlYWRlcnMsIEJsb2NrcXVvdGVzICMjCgpBIHBhcmFncmFwaCBpcyBzaW1wbHkgb25lIG9yIG1vcmUgY29uc2VjdXRpdmUgbGluZXMgb2YgdGV4dCwgc2VwYXJhdGVkCmJ5IG9uZSBvciBtb3JlIGJsYW5rIGxpbmVzLiAoQSBibGFuayBsaW5lIGlzIGFueSBsaW5lIHRoYXQgbG9va3MgbGlrZQphIGJsYW5rIGxpbmUgLS0gYSBsaW5lIGNvbnRhaW5pbmcgbm90aGluZyBidXQgc3BhY2VzIG9yIHRhYnMgaXMKY29uc2lkZXJlZCBibGFuay4pIE5vcm1hbCBwYXJhZ3JhcGhzIHNob3VsZCBub3QgYmUgaW5kZW50ZWQgd2l0aApzcGFjZXMgb3IgdGFicy4KCk1hcmtkb3duIG9mZmVycyB0d28gc3R5bGVzIG9mIGhlYWRlcnM6ICpTZXRleHQqIGFuZCAqYXR4Ki4KU2V0ZXh0LXN0eWxlIGhlYWRlcnMgZm9yIGAmbHQ7aDEmZ3Q7YCBhbmQgYCZsdDtoMiZndDtgIGFyZSBjcmVhdGVkIGJ5CiJ1bmRlcmxpbmluZyIgd2l0aCBlcXVhbCBzaWducyAoYD1gKSBhbmQgaHlwaGVucyAoYC1gKSwgcmVzcGVjdGl2ZWx5LgpUbyBjcmVhdGUgYW4gYXR4LXN0eWxlIGhlYWRlciwgeW91IHB1dCAxLTYgaGFzaCBtYXJrcyAoYCNgKSBhdCB0aGUKYmVnaW5uaW5nIG9mIHRoZSBsaW5lIC0tIHRoZSBudW1iZXIgb2YgaGFzaGVzIGVxdWFscyB0aGUgcmVzdWx0aW5nCkhUTUwgaGVhZGVyIGxldmVsLgoKQmxvY2txdW90ZXMgYXJlIGluZGljYXRlZCB1c2luZyBlbWFpbC1zdHlsZSAnYCZndDtgJyBhbmdsZSBicmFja2V0cy4KCk1hcmtkb3duOgoKICAgIEEgRmlyc3QgTGV2ZWwgSGVhZGVyCiAgICA9PT09PT09PT09PT09PT09PT09PQogICAgCiAgICBBIFNlY29uZCBMZXZlbCBIZWFkZXIKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIE5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgdG8KICAgIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4gVGhpcyBpcyBqdXN0IGEKICAgIHJlZ3VsYXIgcGFyYWdyYXBoLgoKICAgIFRoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkKICAgIGRvZydzIGJhY2suCiAgICAKICAgICMjIyBIZWFkZXIgMwoKICAgICZndDsgVGhpcyBpcyBhIGJsb2NrcXVvdGUuCiAgICAmZ3Q7IAogICAgJmd0OyBUaGlzIGlzIHRoZSBzZWNvbmQgcGFyYWdyYXBoIGluIHRoZSBibG9ja3F1b3RlLgogICAgJmd0OwogICAgJmd0OyAjIyBUaGlzIGlzIGFuIEgyIGluIGEgYmxvY2txdW90ZQoKCk91dHB1dDoKCiAgICAmbHQ7aDEmZ3Q7QSBGaXJzdCBMZXZlbCBIZWFkZXImbHQ7L2gxJmd0OwogICAgCiAgICAmbHQ7aDImZ3Q7QSBTZWNvbmQgTGV2ZWwgSGVhZGVyJmx0Oy9oMiZndDsKICAgIAogICAgJmx0O3AmZ3Q7Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBtZW4gdG8gY29tZSB0bwogICAgdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiBUaGlzIGlzIGp1c3QgYQogICAgcmVndWxhciBwYXJhZ3JhcGguJmx0Oy9wJmd0OwogICAgCiAgICAmbHQ7cCZndDtUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5CiAgICBkb2cncyBiYWNrLiZsdDsvcCZndDsKICAgIAogICAgJmx0O2gzJmd0O0hlYWRlciAzJmx0Oy9oMyZndDsKICAgIAogICAgJmx0O2Jsb2NrcXVvdGUmZ3Q7CiAgICAgICAgJmx0O3AmZ3Q7VGhpcyBpcyBhIGJsb2NrcXVvdGUuJmx0Oy9wJmd0OwogICAgICAgIAogICAgICAgICZsdDtwJmd0O1RoaXMgaXMgdGhlIHNlY29uZCBwYXJhZ3JhcGggaW4gdGhlIGJsb2NrcXVvdGUuJmx0Oy9wJmd0OwogICAgICAgIAogICAgICAgICZsdDtoMiZndDtUaGlzIGlzIGFuIEgyIGluIGEgYmxvY2txdW90ZSZsdDsvaDImZ3Q7CiAgICAmbHQ7L2Jsb2NrcXVvdGUmZ3Q7CgoKCiMjIyBQaHJhc2UgRW1waGFzaXMgIyMjCgpNYXJrZG93biB1c2VzIGFzdGVyaXNrcyBhbmQgdW5kZXJzY29yZXMgdG8gaW5kaWNhdGUgc3BhbnMgb2YgZW1waGFzaXMuCgpNYXJrZG93bjoKCiAgICBTb21lIG9mIHRoZXNlIHdvcmRzICphcmUgZW1waGFzaXplZCouCiAgICBTb21lIG9mIHRoZXNlIHdvcmRzIF9hcmUgZW1waGFzaXplZCBhbHNvXy4KICAgIAogICAgVXNlIHR3byBhc3Rlcmlza3MgZm9yICoqc3Ryb25nIGVtcGhhc2lzKiouCiAgICBPciwgaWYgeW91IHByZWZlciwgX191c2UgdHdvIHVuZGVyc2NvcmVzIGluc3RlYWRfXy4KCk91dHB1dDoKCiAgICAmbHQ7cCZndDtTb21lIG9mIHRoZXNlIHdvcmRzICZsdDtlbSZndDthcmUgZW1waGFzaXplZCZsdDsvZW0mZ3Q7LgogICAgU29tZSBvZiB0aGVzZSB3b3JkcyAmbHQ7ZW0mZ3Q7YXJlIGVtcGhhc2l6ZWQgYWxzbyZsdDsvZW0mZ3Q7LiZsdDsvcCZndDsKICAgIAogICAgJmx0O3AmZ3Q7VXNlIHR3byBhc3Rlcmlza3MgZm9yICZsdDtzdHJvbmcmZ3Q7c3Ryb25nIGVtcGhhc2lzJmx0Oy9zdHJvbmcmZ3Q7LgogICAgT3IsIGlmIHlvdSBwcmVmZXIsICZsdDtzdHJvbmcmZ3Q7dXNlIHR3byB1bmRlcnNjb3JlcyBpbnN0ZWFkJmx0Oy9zdHJvbmcmZ3Q7LiZsdDsvcCZndDsKICAgCgoKIyMgTGlzdHMgIyMKClVub3JkZXJlZCAoYnVsbGV0ZWQpIGxpc3RzIHVzZSBhc3Rlcmlza3MsIHBsdXNlcywgYW5kIGh5cGhlbnMgKGAqYCwKYCtgLCBhbmQgYC1gKSBhcyBsaXN0IG1hcmtlcnMuIFRoZXNlIHRocmVlIG1hcmtlcnMgYXJlCmludGVyY2hhbmdhYmxlOyB0aGlzOgoKICAgICogICBDYW5keS4KICAgICogICBHdW0uCiAgICAqICAgQm9vemUuCgp0aGlzOgoKICAgICsgICBDYW5keS4KICAgICsgICBHdW0uCiAgICArICAgQm9vemUuCgphbmQgdGhpczoKCiAgICAtICAgQ2FuZHkuCiAgICAtICAgR3VtLgogICAgLSAgIEJvb3plLgoKYWxsIHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0OgoKICAgICZsdDt1bCZndDsKICAgICZsdDtsaSZndDtDYW5keS4mbHQ7L2xpJmd0OwogICAgJmx0O2xpJmd0O0d1bS4mbHQ7L2xpJmd0OwogICAgJmx0O2xpJmd0O0Jvb3plLiZsdDsvbGkmZ3Q7CiAgICAmbHQ7L3VsJmd0OwoKT3JkZXJlZCAobnVtYmVyZWQpIGxpc3RzIHVzZSByZWd1bGFyIG51bWJlcnMsIGZvbGxvd2VkIGJ5IHBlcmlvZHMsIGFzCmxpc3QgbWFya2VyczoKCiAgICAxLiAgUmVkCiAgICAyLiAgR3JlZW4KICAgIDMuICBCbHVlCgpPdXRwdXQ6CgogICAgJmx0O29sJmd0OwogICAgJmx0O2xpJmd0O1JlZCZsdDsvbGkmZ3Q7CiAgICAmbHQ7bGkmZ3Q7R3JlZW4mbHQ7L2xpJmd0OwogICAgJmx0O2xpJmd0O0JsdWUmbHQ7L2xpJmd0OwogICAgJmx0Oy9vbCZndDsKCklmIHlvdSBwdXQgYmxhbmsgbGluZXMgYmV0d2VlbiBpdGVtcywgeW91J2xsIGdldCBgJmx0O3AmZ3Q7YCB0YWdzIGZvciB0aGUKbGlzdCBpdGVtIHRleHQuIFlvdSBjYW4gY3JlYXRlIG11bHRpLXBhcmFncmFwaCBsaXN0IGl0ZW1zIGJ5IGluZGVudGluZwp0aGUgcGFyYWdyYXBocyBieSA0IHNwYWNlcyBvciAxIHRhYjoKCiAgICAqICAgQSBsaXN0IGl0ZW0uCiAgICAKICAgICAgICBXaXRoIG11bHRpcGxlIHBhcmFncmFwaHMuCgogICAgKiAgIEFub3RoZXIgaXRlbSBpbiB0aGUgbGlzdC4KCk91dHB1dDoKCiAgICAmbHQ7dWwmZ3Q7CiAgICAmbHQ7bGkmZ3Q7Jmx0O3AmZ3Q7QSBsaXN0IGl0ZW0uJmx0Oy9wJmd0OwogICAgJmx0O3AmZ3Q7V2l0aCBtdWx0aXBsZSBwYXJhZ3JhcGhzLiZsdDsvcCZndDsmbHQ7L2xpJmd0OwogICAgJmx0O2xpJmd0OyZsdDtwJmd0O0Fub3RoZXIgaXRlbSBpbiB0aGUgbGlzdC4mbHQ7L3AmZ3Q7Jmx0Oy9saSZndDsKICAgICZsdDsvdWwmZ3Q7CiAgICAKCgojIyMgTGlua3MgIyMjCgpNYXJrZG93biBzdXBwb3J0cyB0d28gc3R5bGVzIGZvciBjcmVhdGluZyBsaW5rczogKmlubGluZSogYW5kCipyZWZlcmVuY2UqLiBXaXRoIGJvdGggc3R5bGVzLCB5b3UgdXNlIHNxdWFyZSBicmFja2V0cyB0byBkZWxpbWl0IHRoZQp0ZXh0IHlvdSB3YW50IHRvIHR1cm4gaW50byBhIGxpbmsuCgpJbmxpbmUtc3R5bGUgbGlua3MgdXNlIHBhcmVudGhlc2VzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsaW5rIHRleHQuCkZvciBleGFtcGxlOgoKICAgIFRoaXMgaXMgYW4gW2V4YW1wbGUgbGlua10oaHR0cDovL2V4YW1wbGUuY29tLykuCgpPdXRwdXQ6CgogICAgJmx0O3AmZ3Q7VGhpcyBpcyBhbiAmbHQ7YSBocmVmPSJodHRwOi8vZXhhbXBsZS5jb20vIiZndDsKICAgIGV4YW1wbGUgbGluayZsdDsvYSZndDsuJmx0Oy9wJmd0OwoKT3B0aW9uYWxseSwgeW91IG1heSBpbmNsdWRlIGEgdGl0bGUgYXR0cmlidXRlIGluIHRoZSBwYXJlbnRoZXNlczoKCiAgICBUaGlzIGlzIGFuIFtleGFtcGxlIGxpbmtdKGh0dHA6Ly9leGFtcGxlLmNvbS8gIldpdGggYSBUaXRsZSIpLgoKT3V0cHV0OgoKICAgICZsdDtwJmd0O1RoaXMgaXMgYW4gJmx0O2EgaHJlZj0iaHR0cDovL2V4YW1wbGUuY29tLyIgdGl0bGU9IldpdGggYSBUaXRsZSImZ3Q7CiAgICBleGFtcGxlIGxpbmsmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKClJlZmVyZW5jZS1zdHlsZSBsaW5rcyBhbGxvdyB5b3UgdG8gcmVmZXIgdG8geW91ciBsaW5rcyBieSBuYW1lcywgd2hpY2gKeW91IGRlZmluZSBlbHNld2hlcmUgaW4geW91ciBkb2N1bWVudDoKCiAgICBJIGdldCAxMCB0aW1lcyBtb3JlIHRyYWZmaWMgZnJvbSBbR29vZ2xlXVsxXSB0aGFuIGZyb20KICAgIFtZYWhvb11bMl0gb3IgW01TTl1bM10uCgogICAgWzFdOiBodHRwOi8vZ29vZ2xlLmNvbS8gICAgICAgICJHb29nbGUiCiAgICBbMl06IGh0dHA6Ly9zZWFyY2gueWFob28uY29tLyAgIllhaG9vIFNlYXJjaCIKICAgIFszXTogaHR0cDovL3NlYXJjaC5tc24uY29tLyAgICAiTVNOIFNlYXJjaCIKCk91dHB1dDoKCiAgICAmbHQ7cCZndDtJIGdldCAxMCB0aW1lcyBtb3JlIHRyYWZmaWMgZnJvbSAmbHQ7YSBocmVmPSJodHRwOi8vZ29vZ2xlLmNvbS8iCiAgICB0aXRsZT0iR29vZ2xlIiZndDtHb29nbGUmbHQ7L2EmZ3Q7IHRoYW4gZnJvbSAmbHQ7YSBocmVmPSJodHRwOi8vc2VhcmNoLnlhaG9vLmNvbS8iCiAgICB0aXRsZT0iWWFob28gU2VhcmNoIiZndDtZYWhvbyZsdDsvYSZndDsgb3IgJmx0O2EgaHJlZj0iaHR0cDovL3NlYXJjaC5tc24uY29tLyIKICAgIHRpdGxlPSJNU04gU2VhcmNoIiZndDtNU04mbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKClRoZSB0aXRsZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuIExpbmsgbmFtZXMgbWF5IGNvbnRhaW4gbGV0dGVycywKbnVtYmVycyBhbmQgc3BhY2VzLCBidXQgYXJlICpub3QqIGNhc2Ugc2Vuc2l0aXZlOgoKICAgIEkgc3RhcnQgbXkgbW9ybmluZyB3aXRoIGEgY3VwIG9mIGNvZmZlZSBhbmQKICAgIFtUaGUgTmV3IFlvcmsgVGltZXNdW05ZIFRpbWVzXS4KCiAgICBbbnkgdGltZXNdOiBodHRwOi8vd3d3Lm55dGltZXMuY29tLwoKT3V0cHV0OgoKICAgICZsdDtwJmd0O0kgc3RhcnQgbXkgbW9ybmluZyB3aXRoIGEgY3VwIG9mIGNvZmZlZSBhbmQKICAgICZsdDthIGhyZWY9Imh0dHA6Ly93d3cubnl0aW1lcy5jb20vIiZndDtUaGUgTmV3IFlvcmsgVGltZXMmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKCgojIyMgSW1hZ2VzICMjIwoKSW1hZ2Ugc3ludGF4IGlzIHZlcnkgbXVjaCBsaWtlIGxpbmsgc3ludGF4LgoKSW5saW5lICh0aXRsZXMgYXJlIG9wdGlvbmFsKToKCiAgICAhW2FsdCB0ZXh0XSgvcGF0aC90by9pbWcuanBnICJUaXRsZSIpCgpSZWZlcmVuY2Utc3R5bGU6CgogICAgIVthbHQgdGV4dF1baWRdCgogICAgW2lkXTogL3BhdGgvdG8vaW1nLmpwZyAiVGl0bGUiCgpCb3RoIG9mIHRoZSBhYm92ZSBleGFtcGxlcyBwcm9kdWNlIHRoZSBzYW1lIG91dHB1dDoKCiAgICAmbHQ7aW1nIHNyYz0iL3BhdGgvdG8vaW1nLmpwZyIgYWx0PSJhbHQgdGV4dCIgdGl0bGU9IlRpdGxlIiAvJmd0OwoKCgojIyMgQ29kZSAjIyMKCkluIGEgcmVndWxhciBwYXJhZ3JhcGgsIHlvdSBjYW4gY3JlYXRlIGNvZGUgc3BhbiBieSB3cmFwcGluZyB0ZXh0IGluCmJhY2t0aWNrIHF1b3Rlcy4gQW55IGFtcGVyc2FuZHMgKGAmYW1wO2ApIGFuZCBhbmdsZSBicmFja2V0cyAoYCZsdDtgIG9yCmAmZ3Q7YCkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHRyYW5zbGF0ZWQgaW50byBIVE1MIGVudGl0aWVzLiBUaGlzIG1ha2VzCml0IGVhc3kgdG8gdXNlIE1hcmtkb3duIHRvIHdyaXRlIGFib3V0IEhUTUwgZXhhbXBsZSBjb2RlOgoKICAgIEkgc3Ryb25nbHkgcmVjb21tZW5kIGFnYWluc3QgdXNpbmcgYW55IGAmbHQ7YmxpbmsmZ3Q7YCB0YWdzLgoKICAgIEkgd2lzaCBTbWFydHlQYW50cyB1c2VkIG5hbWVkIGVudGl0aWVzIGxpa2UgYCZhbXA7bWRhc2g7YAogICAgaW5zdGVhZCBvZiBkZWNpbWFsLWVuY29kZWQgZW50aXRlcyBsaWtlIGAmYW1wOyM4MjEyO2AuCgpPdXRwdXQ6CgogICAgJmx0O3AmZ3Q7SSBzdHJvbmdseSByZWNvbW1lbmQgYWdhaW5zdCB1c2luZyBhbnkKICAgICZsdDtjb2RlJmd0OyZhbXA7bHQ7YmxpbmsmYW1wO2d0OyZsdDsvY29kZSZndDsgdGFncy4mbHQ7L3AmZ3Q7CiAgICAKICAgICZsdDtwJmd0O0kgd2lzaCBTbWFydHlQYW50cyB1c2VkIG5hbWVkIGVudGl0aWVzIGxpa2UKICAgICZsdDtjb2RlJmd0OyZhbXA7YW1wO21kYXNoOyZsdDsvY29kZSZndDsgaW5zdGVhZCBvZiBkZWNpbWFsLWVuY29kZWQKICAgIGVudGl0ZXMgbGlrZSAmbHQ7Y29kZSZndDsmYW1wO2FtcDsjODIxMjsmbHQ7L2NvZGUmZ3Q7LiZsdDsvcCZndDsKCgpUbyBzcGVjaWZ5IGFuIGVudGlyZSBibG9jayBvZiBwcmUtZm9ybWF0dGVkIGNvZGUsIGluZGVudCBldmVyeSBsaW5lIG9mCnRoZSBibG9jayBieSA0IHNwYWNlcyBvciAxIHRhYi4gSnVzdCBsaWtlIHdpdGggY29kZSBzcGFucywgYCZhbXA7YCwgYCZsdDtgLAphbmQgYCZndDtgIGNoYXJhY3RlcnMgd2lsbCBiZSBlc2NhcGVkIGF1dG9tYXRpY2FsbHkuCgpNYXJrZG93bjoKCiAgICBJZiB5b3Ugd2FudCB5b3VyIHBhZ2UgdG8gdmFsaWRhdGUgdW5kZXIgWEhUTUwgMS4wIFN0cmljdCwKICAgIHlvdSd2ZSBnb3QgdG8gcHV0IHBhcmFncmFwaCB0YWdzIGluIHlvdXIgYmxvY2txdW90ZXM6CgogICAgICAgICZsdDtibG9ja3F1b3RlJmd0OwogICAgICAgICAgICAmbHQ7cCZndDtGb3IgZXhhbXBsZS4mbHQ7L3AmZ3Q7CiAgICAgICAgJmx0Oy9ibG9ja3F1b3RlJmd0OwoKT3V0cHV0OgoKICAgICZsdDtwJmd0O0lmIHlvdSB3YW50IHlvdXIgcGFnZSB0byB2YWxpZGF0ZSB1bmRlciBYSFRNTCAxLjAgU3RyaWN0LAogICAgeW91J3ZlIGdvdCB0byBwdXQgcGFyYWdyYXBoIHRhZ3MgaW4geW91ciBibG9ja3F1b3RlczombHQ7L3AmZ3Q7CiAgICAKICAgICZsdDtwcmUmZ3Q7Jmx0O2NvZGUmZ3Q7JmFtcDtsdDtibG9ja3F1b3RlJmFtcDtndDsKICAgICAgICAmYW1wO2x0O3AmYW1wO2d0O0ZvciBleGFtcGxlLiZhbXA7bHQ7L3AmYW1wO2d0OwogICAgJmFtcDtsdDsvYmxvY2txdW90ZSZhbXA7Z3Q7CiAgICAmbHQ7L2NvZGUmZ3Q7Jmx0Oy9wcmUmZ3Q7CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogJ21hcmtkb3duJywKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICB0aGVtZTogImRlZmF1bHQiLAogICAgICAgIGV4dHJhS2V5czogeyJFbnRlciI6ICJuZXdsaW5lQW5kSW5kZW50Q29udGludWVNYXJrZG93bkxpc3QifQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPk9wdGlvbmFsbHkgZGVwZW5kcyBvbiB0aGUgWE1MIG1vZGUgZm9yIHByb3Blcmx5IGhpZ2hsaWdodGVkIGlubGluZSBYTUwgYmxvY2tzLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LW1hcmtkb3duPC9jb2RlPi48L3A+CgogICAgPHA+PHN0cm9uZz5QYXJzaW5nL0hpZ2hsaWdodGluZyBUZXN0czo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI21hcmtkb3duXyoiPm5vcm1hbDwvYT4sICA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjdmVyYm9zZSxtYXJrZG93bl8qIj52ZXJib3NlPC9hPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/markdown/markdown.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJtYXJrZG93biIsIGZ1bmN0aW9uKGNtQ2ZnLCBtb2RlQ2ZnKSB7CgogIHZhciBodG1sRm91bmQgPSBDb2RlTWlycm9yLm1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eSgidGV4dC9odG1sIik7CiAgdmFyIGh0bWxNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNtQ2ZnLCBodG1sRm91bmQgPyAidGV4dC9odG1sIiA6ICJ0ZXh0L3BsYWluIik7CiAgdmFyIGFsaWFzZXMgPSB7CiAgICBodG1sOiAiaHRtbG1peGVkIiwKICAgIGpzOiAiamF2YXNjcmlwdCIsCiAgICBqc29uOiAiYXBwbGljYXRpb24vanNvbiIsCiAgICBjOiAidGV4dC94LWNzcmMiLAogICAgImMrKyI6ICJ0ZXh0L3gtYysrc3JjIiwKICAgIGphdmE6ICJ0ZXh0L3gtamF2YSIsCiAgICBjc2hhcnA6ICJ0ZXh0L3gtY3NoYXJwIiwKICAgICJjIyI6ICJ0ZXh0L3gtY3NoYXJwIgogIH07CgogIHZhciBnZXRNb2RlID0gKGZ1bmN0aW9uICgpIHsKICAgIHZhciBpLCBtb2RlcyA9IHt9LCBtaW1lcyA9IHt9LCBtaW1lOwoKICAgIHZhciBsaXN0ID0gW107CiAgICBmb3IgKHZhciBtIGluIENvZGVNaXJyb3IubW9kZXMpCiAgICAgIGlmIChDb2RlTWlycm9yLm1vZGVzLnByb3BlcnR5SXNFbnVtZXJhYmxlKG0pKSBsaXN0LnB1c2gobSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICBtb2Rlc1tsaXN0W2ldXSA9IGxpc3RbaV07CiAgICB9CiAgICB2YXIgbWltZXNMaXN0ID0gW107CiAgICBmb3IgKHZhciBtIGluIENvZGVNaXJyb3IubWltZU1vZGVzKQogICAgICBpZiAoQ29kZU1pcnJvci5taW1lTW9kZXMucHJvcGVydHlJc0VudW1lcmFibGUobSkpCiAgICAgICAgbWltZXNMaXN0LnB1c2goe21pbWU6IG0sIG1vZGU6IENvZGVNaXJyb3IubWltZU1vZGVzW21dfSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbWltZXNMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIG1pbWUgPSBtaW1lc0xpc3RbaV0ubWltZTsKICAgICAgbWltZXNbbWltZV0gPSBtaW1lc0xpc3RbaV0ubWltZTsKICAgIH0KCiAgICBmb3IgKHZhciBhIGluIGFsaWFzZXMpIHsKICAgICAgaWYgKGFsaWFzZXNbYV0gaW4gbW9kZXMgfHwgYWxpYXNlc1thXSBpbiBtaW1lcykKICAgICAgICBtb2Rlc1thXSA9IGFsaWFzZXNbYV07CiAgICB9CiAgICAKICAgIHJldHVybiBmdW5jdGlvbiAobGFuZykgewogICAgICByZXR1cm4gbW9kZXNbbGFuZ10gPyBDb2RlTWlycm9yLmdldE1vZGUoY21DZmcsIG1vZGVzW2xhbmddKSA6IG51bGw7CiAgICB9OwogIH0oKSk7CiAgCiAgLy8gU2hvdWxkIHVuZGVyc2NvcmVzIGluIHdvcmRzIG9wZW4vY2xvc2UgZW0vc3Ryb25nPwogIGlmIChtb2RlQ2ZnLnVuZGVyc2NvcmVzQnJlYWtXb3JkcyA9PT0gdW5kZWZpbmVkKQogICAgbW9kZUNmZy51bmRlcnNjb3Jlc0JyZWFrV29yZHMgPSB0cnVlOwogIAogIC8vIFR1cm4gb24gZmVuY2VkIGNvZGUgYmxvY2tzPyAoImBgYCIgdG8gc3RhcnQvZW5kKQogIGlmIChtb2RlQ2ZnLmZlbmNlZENvZGVCbG9ja3MgPT09IHVuZGVmaW5lZCkgbW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tzID0gZmFsc2U7CiAgCiAgdmFyIGNvZGVEZXB0aCA9IDA7CiAgdmFyIHByZXZMaW5lSGFzQ29udGVudCA9IGZhbHNlCiAgLCAgIHRoaXNMaW5lSGFzQ29udGVudCA9IGZhbHNlOwoKICB2YXIgaGVhZGVyICAgPSAnaGVhZGVyJwogICwgICBjb2RlICAgICA9ICdjb21tZW50JwogICwgICBxdW90ZSAgICA9ICdxdW90ZScKICAsICAgbGlzdCAgICAgPSAnc3RyaW5nJwogICwgICBociAgICAgICA9ICdocicKICAsICAgaW1hZ2UgICAgPSAndGFnJwogICwgICBsaW5raW5saW5lID0gJ2xpbmsnCiAgLCAgIGxpbmtlbWFpbCA9ICdsaW5rJwogICwgICBsaW5rdGV4dCA9ICdsaW5rJwogICwgICBsaW5raHJlZiA9ICdzdHJpbmcnCiAgLCAgIGVtICAgICAgID0gJ2VtJwogICwgICBzdHJvbmcgICA9ICdzdHJvbmcnCiAgLCAgIGVtc3Ryb25nID0gJ2Vtc3Ryb25nJzsKCiAgdmFyIGhyUkUgPSAvXihbKlwtPV9dKSg/OlxzKlwxKXsyLH1ccyokLwogICwgICB1bFJFID0gL15bKlwtK11ccysvCiAgLCAgIG9sUkUgPSAvXlswLTldK1wuXHMrLwogICwgICBoZWFkZXJSRSA9IC9eKD86XD17MSx9fC17MSx9KSQvCiAgLCAgIHRleHRSRSA9IC9eW14hXFtcXSpfXFw8PmAgIicoXSsvOwoKICBmdW5jdGlvbiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGY7CiAgICByZXR1cm4gZihzdHJlYW0sIHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIHN3aXRjaEJsb2NrKHN0cmVhbSwgc3RhdGUsIGYpIHsKICAgIHN0YXRlLmYgPSBzdGF0ZS5ibG9jayA9IGY7CiAgICByZXR1cm4gZihzdHJlYW0sIHN0YXRlKTsKICB9CgoKICAvLyBCbG9ja3MKCiAgZnVuY3Rpb24gYmxhbmtMaW5lKHN0YXRlKSB7CiAgICAvLyBSZXNldCBsaW5rVGl0bGUgc3RhdGUKICAgIHN0YXRlLmxpbmtUaXRsZSA9IGZhbHNlOwogICAgLy8gUmVzZXQgRU0gc3RhdGUKICAgIHN0YXRlLmVtID0gZmFsc2U7CiAgICAvLyBSZXNldCBTVFJPTkcgc3RhdGUKICAgIHN0YXRlLnN0cm9uZyA9IGZhbHNlOwogICAgLy8gUmVzZXQgc3RhdGUucXVvdGUKICAgIHN0YXRlLnF1b3RlID0gZmFsc2U7CiAgICBpZiAoIWh0bWxGb3VuZCAmJiBzdGF0ZS5mID09IGh0bWxCbG9jaykgewogICAgICBzdGF0ZS5mID0gaW5saW5lTm9ybWFsOwogICAgICBzdGF0ZS5ibG9jayA9IGJsb2NrTm9ybWFsOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBibG9ja05vcm1hbChzdHJlYW0sIHN0YXRlKSB7CiAgICAKICAgIGlmIChzdGF0ZS5saXN0ICE9PSBmYWxzZSAmJiBzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPj0gMCkgeyAvLyBDb250aW51ZWQgbGlzdAogICAgICBpZiAoc3RhdGUuaW5kZW50YXRpb25EaWZmIDwgNCkgeyAvLyBPbmx5IGFkanVzdCBpbmRlbnRhdGlvbiBpZiAqbm90KiBhIGNvZGUgYmxvY2sKICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbiAtPSBzdGF0ZS5pbmRlbnRhdGlvbkRpZmY7CiAgICAgIH0KICAgICAgc3RhdGUubGlzdCA9IG51bGw7CiAgICB9IGVsc2UgeyAvLyBObyBsb25nZXIgYSBsaXN0CiAgICAgIHN0YXRlLmxpc3QgPSBmYWxzZTsKICAgIH0KICAgIAogICAgaWYgKHN0YXRlLmluZGVudGF0aW9uRGlmZiA+PSA0KSB7CiAgICAgIHN0YXRlLmluZGVudGF0aW9uIC09IDQ7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAnIycgfHwgKHByZXZMaW5lSGFzQ29udGVudCAmJiBzdHJlYW0ubWF0Y2goaGVhZGVyUkUpKSApIHsKICAgICAgc3RhdGUuaGVhZGVyID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnPicpKSB7CiAgICAgIHN0YXRlLmluZGVudGF0aW9uKys7CiAgICAgIHN0YXRlLnF1b3RlID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ1snKSB7CiAgICAgIHJldHVybiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgZm9vdG5vdGVMaW5rKTsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKGhyUkUsIHRydWUpKSB7CiAgICAgIHJldHVybiBocjsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHVsUkUsIHRydWUpIHx8IHN0cmVhbS5tYXRjaChvbFJFLCB0cnVlKSkgewogICAgICBzdGF0ZS5pbmRlbnRhdGlvbiArPSA0OwogICAgICBzdGF0ZS5saXN0ID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAobW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tzICYmIHN0cmVhbS5tYXRjaCgvXmBgYChbXHcrI10qKS8sIHRydWUpKSB7CiAgICAgIC8vIHRyeSBzd2l0Y2hpbmcgbW9kZQogICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBnZXRNb2RlKFJlZ0V4cC4kMSk7CiAgICAgIGlmIChzdGF0ZS5sb2NhbE1vZGUpIHN0YXRlLmxvY2FsU3RhdGUgPSBzdGF0ZS5sb2NhbE1vZGUuc3RhcnRTdGF0ZSgpOwogICAgICBzd2l0Y2hCbG9jayhzdHJlYW0sIHN0YXRlLCBsb2NhbCk7CiAgICAgIHJldHVybiBjb2RlOwogICAgfQogICAgCiAgICByZXR1cm4gc3dpdGNoSW5saW5lKHN0cmVhbSwgc3RhdGUsIHN0YXRlLmlubGluZSk7CiAgfQoKICBmdW5jdGlvbiBodG1sQmxvY2soc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHN0eWxlID0gaHRtbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5odG1sU3RhdGUpOwogICAgaWYgKGh0bWxGb3VuZCAmJiBzdHlsZSA9PT0gJ3RhZycgJiYgc3RhdGUuaHRtbFN0YXRlLnR5cGUgIT09ICdvcGVuVGFnJyAmJiAhc3RhdGUuaHRtbFN0YXRlLmNvbnRleHQpIHsKICAgICAgc3RhdGUuZiA9IGlubGluZU5vcm1hbDsKICAgICAgc3RhdGUuYmxvY2sgPSBibG9ja05vcm1hbDsKICAgIH0KICAgIGlmIChzdGF0ZS5tZF9pbnNpZGUgJiYgc3RyZWFtLmN1cnJlbnQoKS5pbmRleE9mKCI+IikhPS0xKSB7CiAgICAgIHN0YXRlLmYgPSBpbmxpbmVOb3JtYWw7CiAgICAgIHN0YXRlLmJsb2NrID0gYmxvY2tOb3JtYWw7CiAgICAgIHN0YXRlLmh0bWxTdGF0ZS5jb250ZXh0ID0gdW5kZWZpbmVkOwogICAgfQogICAgcmV0dXJuIHN0eWxlOwogIH0KCiAgZnVuY3Rpb24gbG9jYWwoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2goL15gYGAvLCB0cnVlKSkgewogICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBzdGF0ZS5sb2NhbFN0YXRlID0gbnVsbDsKICAgICAgc3RhdGUuZiA9IGlubGluZU5vcm1hbDsKICAgICAgc3RhdGUuYmxvY2sgPSBibG9ja05vcm1hbDsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9IGVsc2UgaWYgKHN0YXRlLmxvY2FsTW9kZSkgewogICAgICByZXR1cm4gc3RhdGUubG9jYWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSk7CiAgICB9IGVsc2UgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiBjb2RlOwogICAgfQogIH0KCiAgLy8gSW5saW5lCiAgZnVuY3Rpb24gZ2V0VHlwZShzdGF0ZSkgewogICAgdmFyIHN0eWxlcyA9IFtdOwogICAgCiAgICBpZiAoc3RhdGUuc3Ryb25nKSB7IHN0eWxlcy5wdXNoKHN0YXRlLmVtID8gZW1zdHJvbmcgOiBzdHJvbmcpOyB9CiAgICBlbHNlIGlmIChzdGF0ZS5lbSkgeyBzdHlsZXMucHVzaChlbSk7IH0KICAgIAogICAgaWYgKHN0YXRlLmxpbmtUZXh0KSB7IHN0eWxlcy5wdXNoKGxpbmt0ZXh0KTsgfQogICAgCiAgICBpZiAoc3RhdGUuY29kZSkgeyBzdHlsZXMucHVzaChjb2RlKTsgfQogICAgCiAgICBpZiAoc3RhdGUuaGVhZGVyKSB7IHN0eWxlcy5wdXNoKGhlYWRlcik7IH0KICAgIGlmIChzdGF0ZS5xdW90ZSkgeyBzdHlsZXMucHVzaChxdW90ZSk7IH0KICAgIGlmIChzdGF0ZS5saXN0ICE9PSBmYWxzZSkgeyBzdHlsZXMucHVzaChsaXN0KTsgfQoKICAgIHJldHVybiBzdHlsZXMubGVuZ3RoID8gc3R5bGVzLmpvaW4oJyAnKSA6IG51bGw7CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVUZXh0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2godGV4dFJFLCB0cnVlKSkgewogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOyAgICAgICAgCiAgfQoKICBmdW5jdGlvbiBpbmxpbmVOb3JtYWwoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHN0eWxlID0gc3RhdGUudGV4dChzdHJlYW0sIHN0YXRlKTsKICAgIGlmICh0eXBlb2Ygc3R5bGUgIT09ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gc3R5bGU7CiAgICAKICAgIGlmIChzdGF0ZS5saXN0KSB7IC8vIExpc3QgbWFya2VyICgqLCArLCAtLCAxLiwgZXRjKQogICAgICBzdGF0ZS5saXN0ID0gbnVsbDsKICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9CiAgICAKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAKICAgIGlmIChjaCA9PT0gJ1xcJykgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CiAgICAKICAgIC8vIE1hdGNoZXMgbGluayB0aXRsZXMgcHJlc2VudCBvbiBuZXh0IGxpbmUKICAgIGlmIChzdGF0ZS5saW5rVGl0bGUpIHsKICAgICAgc3RhdGUubGlua1RpdGxlID0gZmFsc2U7CiAgICAgIHZhciBtYXRjaENoID0gY2g7CiAgICAgIGlmIChjaCA9PT0gJygnKSB7CiAgICAgICAgbWF0Y2hDaCA9ICcpJzsKICAgICAgfQogICAgICBtYXRjaENoID0gKG1hdGNoQ2grJycpLnJlcGxhY2UoLyhbLj8qK14kW1xdXFwoKXt9fC1dKS9nLCAiXFwkMSIpOwogICAgICB2YXIgcmVnZXggPSAnXlxccyooPzpbXicgKyBtYXRjaENoICsgJ1xcXFxdK3xcXFxcXFxcXHxcXFxcLiknICsgbWF0Y2hDaDsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4KSwgdHJ1ZSkpIHsKICAgICAgICByZXR1cm4gbGlua2hyZWY7CiAgICAgIH0KICAgIH0KICAgIAogICAgLy8gSWYgdGhpcyBibG9jayBpcyBjaGFuZ2VkLCBpdCBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIGluIEdGTSBtb2RlCiAgICBpZiAoY2ggPT09ICdgJykgewogICAgICB2YXIgdCA9IGdldFR5cGUoc3RhdGUpOwogICAgICB2YXIgYmVmb3JlID0gc3RyZWFtLnBvczsKICAgICAgc3RyZWFtLmVhdFdoaWxlKCdgJyk7CiAgICAgIHZhciBkaWZmZXJlbmNlID0gMSArIHN0cmVhbS5wb3MgLSBiZWZvcmU7CiAgICAgIGlmICghc3RhdGUuY29kZSkgewogICAgICAgIGNvZGVEZXB0aCA9IGRpZmZlcmVuY2U7CiAgICAgICAgc3RhdGUuY29kZSA9IHRydWU7CiAgICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChkaWZmZXJlbmNlID09PSBjb2RlRGVwdGgpIHsgLy8gTXVzdCBiZSBleGFjdAogICAgICAgICAgc3RhdGUuY29kZSA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdGF0ZS5jb2RlKSB7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH0KICAgIAogICAgaWYgKGNoID09PSAnIScgJiYgc3RyZWFtLm1hdGNoKC9cWy4qXF0gPyg/OlwofFxbKS8sIGZhbHNlKSkgewogICAgICBzdHJlYW0ubWF0Y2goL1xbLipcXS8pOwogICAgICBzdGF0ZS5pbmxpbmUgPSBzdGF0ZS5mID0gbGlua0hyZWY7CiAgICAgIHJldHVybiBpbWFnZTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICdbJyAmJiBzdHJlYW0ubWF0Y2goLy4qXF0oXCh8ID9cWykvLCBmYWxzZSkpIHsKICAgICAgc3RhdGUubGlua1RleHQgPSB0cnVlOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CgogICAgaWYgKGNoID09PSAnXScgJiYgc3RhdGUubGlua1RleHQpIHsKICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKHN0YXRlKTsKICAgICAgc3RhdGUubGlua1RleHQgPSBmYWxzZTsKICAgICAgc3RhdGUuaW5saW5lID0gc3RhdGUuZiA9IGxpbmtIcmVmOwogICAgICByZXR1cm4gdHlwZTsKICAgIH0KICAgIAogICAgaWYgKGNoID09PSAnPCcgJiYgc3RyZWFtLm1hdGNoKC9eKGh0dHBzP3xmdHBzPyk6XC9cLyg/OlteXFw+XXxcXC4pKz4vLCB0cnVlKSkgewogICAgICByZXR1cm4gc3dpdGNoSW5saW5lKHN0cmVhbSwgc3RhdGUsIGlubGluZUVsZW1lbnQobGlua2lubGluZSwgJz4nKSk7CiAgICB9CiAgICAKICAgIGlmIChjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXltePiBcXF0rQCg/OlteXFw+XXxcXC4pKz4vLCB0cnVlKSkgewogICAgICByZXR1cm4gc3dpdGNoSW5saW5lKHN0cmVhbSwgc3RhdGUsIGlubGluZUVsZW1lbnQobGlua2VtYWlsLCAnPicpKTsKICAgIH0KICAgIAogICAgaWYgKGNoID09PSAnPCcgJiYgc3RyZWFtLm1hdGNoKC9eXHcvLCBmYWxzZSkpIHsKICAgICAgaWYgKHN0cmVhbS5zdHJpbmcuaW5kZXhPZigiPiIpIT0tMSkgewogICAgICAgIHZhciBhdHRzID0gc3RyZWFtLnN0cmluZy5zdWJzdHJpbmcoMSxzdHJlYW0uc3RyaW5nLmluZGV4T2YoIj4iKSk7CiAgICAgICAgaWYgKC9tYXJrZG93blxzKj1ccyooJ3wiKXswLDF9MSgnfCIpezAsMX0vLnRlc3QoYXR0cykpIHsKICAgICAgICAgIHN0YXRlLm1kX2luc2lkZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIHJldHVybiBzd2l0Y2hCbG9jayhzdHJlYW0sIHN0YXRlLCBodG1sQmxvY2spOwogICAgfQogICAgICAKICAgIGlmIChjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXlwvXHcqPz4vKSkgewogICAgICBzdGF0ZS5tZF9pbnNpZGUgPSBmYWxzZTsKICAgICAgcmV0dXJuICJ0YWciOwogICAgfQogICAgICAKICAgIHZhciBpZ25vcmVVbmRlcnNjb3JlID0gZmFsc2U7CiAgICBpZiAoIW1vZGVDZmcudW5kZXJzY29yZXNCcmVha1dvcmRzKSB7CiAgICAgIGlmIChjaCA9PT0gJ18nICYmIHN0cmVhbS5wZWVrKCkgIT09ICdfJyAmJiBzdHJlYW0ubWF0Y2goLyhcdykvLCBmYWxzZSkpIHsKICAgICAgICB2YXIgcHJldlBvcyA9IHN0cmVhbS5wb3MgLSAyOwogICAgICAgIGlmIChwcmV2UG9zID49IDApIHsKICAgICAgICAgIHZhciBwcmV2Q2ggPSBzdHJlYW0uc3RyaW5nLmNoYXJBdChwcmV2UG9zKTsKICAgICAgICAgIGlmIChwcmV2Q2ggIT09ICdfJyAmJiBwcmV2Q2gubWF0Y2goLyhcdykvLCBmYWxzZSkpIHsKICAgICAgICAgICAgaWdub3JlVW5kZXJzY29yZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB2YXIgdCA9IGdldFR5cGUoc3RhdGUpOwogICAgaWYgKGNoID09PSAnKicgfHwgKGNoID09PSAnXycgJiYgIWlnbm9yZVVuZGVyc2NvcmUpKSB7CiAgICAgIGlmIChzdGF0ZS5zdHJvbmcgPT09IGNoICYmIHN0cmVhbS5lYXQoY2gpKSB7IC8vIFJlbW92ZSBTVFJPTkcKICAgICAgICBzdGF0ZS5zdHJvbmcgPSBmYWxzZTsKICAgICAgICByZXR1cm4gdDsKICAgICAgfSBlbHNlIGlmICghc3RhdGUuc3Ryb25nICYmIHN0cmVhbS5lYXQoY2gpKSB7IC8vIEFkZCBTVFJPTkcKICAgICAgICBzdGF0ZS5zdHJvbmcgPSBjaDsKICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZW0gPT09IGNoKSB7IC8vIFJlbW92ZSBFTQogICAgICAgIHN0YXRlLmVtID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIHQ7CiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmVtKSB7IC8vIEFkZCBFTQogICAgICAgIHN0YXRlLmVtID0gY2g7CiAgICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNoID09PSAnICcpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoJyonKSB8fCBzdHJlYW0uZWF0KCdfJykpIHsgLy8gUHJvYmFibHkgc3Vycm91bmRlZCBieSBzcGFjZXMKICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJyAnKSB7IC8vIFN1cnJvdW5kZWQgYnkgc3BhY2VzLCBpZ25vcmUKICAgICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgICAgICB9IGVsc2UgeyAvLyBOb3Qgc3Vycm91bmRlZCBieSBzcGFjZXMsIGJhY2sgdXAgcG9pbnRlcgogICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gbGlua0hyZWYoc3RyZWFtLCBzdGF0ZSkgewogICAgLy8gQ2hlY2sgaWYgc3BhY2UsIGFuZCByZXR1cm4gTlVMTCBpZiBzbyAodG8gYXZvaWQgbWFya2luZyB0aGUgc3BhY2UpCiAgICBpZihzdHJlYW0uZWF0U3BhY2UoKSl7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PT0gJygnIHx8IGNoID09PSAnWycpIHsKICAgICAgcmV0dXJuIHN3aXRjaElubGluZShzdHJlYW0sIHN0YXRlLCBpbmxpbmVFbGVtZW50KGxpbmtocmVmLCBjaCA9PT0gJygnID8gJyknIDogJ10nKSk7CiAgICB9CiAgICByZXR1cm4gJ2Vycm9yJzsKICB9CgogIGZ1bmN0aW9uIGZvb3Rub3RlTGluayhzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW15cXV0qXF06LywgdHJ1ZSkpIHsKICAgICAgc3RhdGUuZiA9IGZvb3Rub3RlVXJsOwogICAgICByZXR1cm4gbGlua3RleHQ7CiAgICB9CiAgICByZXR1cm4gc3dpdGNoSW5saW5lKHN0cmVhbSwgc3RhdGUsIGlubGluZU5vcm1hbCk7CiAgfQoKICBmdW5jdGlvbiBmb290bm90ZVVybChzdHJlYW0sIHN0YXRlKSB7CiAgICAvLyBDaGVjayBpZiBzcGFjZSwgYW5kIHJldHVybiBOVUxMIGlmIHNvICh0byBhdm9pZCBtYXJraW5nIHRoZSBzcGFjZSkKICAgIGlmKHN0cmVhbS5lYXRTcGFjZSgpKXsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvLyBNYXRjaCBVUkwKICAgIHN0cmVhbS5tYXRjaCgvXlteXHNdKy8sIHRydWUpOwogICAgLy8gQ2hlY2sgZm9yIGxpbmsgdGl0bGUKICAgIGlmIChzdHJlYW0ucGVlaygpID09PSB1bmRlZmluZWQpIHsgLy8gRW5kIG9mIGxpbmUsIHNldCBmbGFnIHRvIGNoZWNrIG5leHQgbGluZQogICAgICBzdGF0ZS5saW5rVGl0bGUgPSB0cnVlOwogICAgfSBlbHNlIHsgLy8gTW9yZSBjb250ZW50IG9uIGxpbmUsIGNoZWNrIGlmIGxpbmsgdGl0bGUKICAgICAgc3RyZWFtLm1hdGNoKC9eKD86XHMrKD86Iig/OlteIlxcXXxcXFxcfFxcLikrInwnKD86W14nXFxdfFxcXFx8XFwuKSsnfFwoKD86W14pXFxdfFxcXFx8XFwuKStcKSkpPy8sIHRydWUpOwogICAgfQogICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGlubGluZU5vcm1hbDsKICAgIHJldHVybiBsaW5raHJlZjsKICB9CgogIHZhciBzYXZlZElubGluZVJFID0gW107CiAgZnVuY3Rpb24gaW5saW5lUkUoZW5kQ2hhcikgewogICAgaWYgKCFzYXZlZElubGluZVJFW2VuZENoYXJdKSB7CiAgICAgIC8vIEVzY2FwZSBlbmRDaGFyIGZvciBSZWdFeHAgKHRha2VuIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDk0MTIyLzUyNjc0MSkKICAgICAgZW5kQ2hhciA9IChlbmRDaGFyKycnKS5yZXBsYWNlKC8oWy4/KiteJFtcXVxcKCl7fXwtXSkvZywgIlxcJDEiKTsKICAgICAgLy8gTWF0Y2ggYW55IG5vbi1lbmRDaGFyLCBlc2NhcGVkIGNoYXJhY3RlciwgYXMgd2VsbCBhcyB0aGUgY2xvc2luZyAKICAgICAgLy8gZW5kQ2hhci4KICAgICAgc2F2ZWRJbmxpbmVSRVtlbmRDaGFyXSA9IG5ldyBSZWdFeHAoJ14oPzpbXlxcXFxdfFxcXFwuKSo/KCcgKyBlbmRDaGFyICsgJyknKTsKICAgIH0KICAgIHJldHVybiBzYXZlZElubGluZVJFW2VuZENoYXJdOwogIH0KCiAgZnVuY3Rpb24gaW5saW5lRWxlbWVudCh0eXBlLCBlbmRDaGFyLCBuZXh0KSB7CiAgICBuZXh0ID0gbmV4dCB8fCBpbmxpbmVOb3JtYWw7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdHJlYW0ubWF0Y2goaW5saW5lUkUoZW5kQ2hhcikpOwogICAgICBzdGF0ZS5pbmxpbmUgPSBzdGF0ZS5mID0gbmV4dDsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICBwcmV2TGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKICAgICAgdGhpc0xpbmVIYXNDb250ZW50ID0gZmFsc2U7CiAgICAgIHJldHVybiB7CiAgICAgICAgZjogYmxvY2tOb3JtYWwsCiAgICAgICAgCiAgICAgICAgYmxvY2s6IGJsb2NrTm9ybWFsLAogICAgICAgIGh0bWxTdGF0ZTogQ29kZU1pcnJvci5zdGFydFN0YXRlKGh0bWxNb2RlKSwKICAgICAgICBpbmRlbnRhdGlvbjogMCwKICAgICAgICAKICAgICAgICBpbmxpbmU6IGlubGluZU5vcm1hbCwKICAgICAgICB0ZXh0OiBoYW5kbGVUZXh0LAogICAgICAgIAogICAgICAgIGxpbmtUZXh0OiBmYWxzZSwKICAgICAgICBsaW5rVGl0bGU6IGZhbHNlLAogICAgICAgIGVtOiBmYWxzZSwKICAgICAgICBzdHJvbmc6IGZhbHNlLAogICAgICAgIGhlYWRlcjogZmFsc2UsCiAgICAgICAgbGlzdDogZmFsc2UsCiAgICAgICAgcXVvdGU6IGZhbHNlCiAgICAgIH07CiAgICB9LAoKICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24ocykgewogICAgICByZXR1cm4gewogICAgICAgIGY6IHMuZiwKICAgICAgICAKICAgICAgICBibG9jazogcy5ibG9jaywKICAgICAgICBodG1sU3RhdGU6IENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNb2RlLCBzLmh0bWxTdGF0ZSksCiAgICAgICAgaW5kZW50YXRpb246IHMuaW5kZW50YXRpb24sCiAgICAgICAgCiAgICAgICAgbG9jYWxNb2RlOiBzLmxvY2FsTW9kZSwKICAgICAgICBsb2NhbFN0YXRlOiBzLmxvY2FsTW9kZSA/IENvZGVNaXJyb3IuY29weVN0YXRlKHMubG9jYWxNb2RlLCBzLmxvY2FsU3RhdGUpIDogbnVsbCwKICAgICAgICAgIAogICAgICAgIGlubGluZTogcy5pbmxpbmUsCiAgICAgICAgdGV4dDogcy50ZXh0LAogICAgICAgIGxpbmtUaXRsZTogcy5saW5rVGl0bGUsCiAgICAgICAgZW06IHMuZW0sCiAgICAgICAgc3Ryb25nOiBzLnN0cm9uZywKICAgICAgICBoZWFkZXI6IHMuaGVhZGVyLAogICAgICAgIGxpc3Q6IHMubGlzdCwKICAgICAgICBxdW90ZTogcy5xdW90ZSwKICAgICAgICBtZF9pbnNpZGU6IHMubWRfaW5zaWRlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXHMqJC8sIHRydWUpKSB7CiAgICAgICAgICBwcmV2TGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBibGFua0xpbmUoc3RhdGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZih0aGlzTGluZUhhc0NvbnRlbnQpewogICAgICAgICAgICBwcmV2TGluZUhhc0NvbnRlbnQgPSB0cnVlOwogICAgICAgICAgICB0aGlzTGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXNMaW5lSGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXNldCBzdGF0ZS5oZWFkZXIKICAgICAgICBzdGF0ZS5oZWFkZXIgPSBmYWxzZTsKICAgICAgICAKICAgICAgICAvLyBSZXNldCBzdGF0ZS5jb2RlCiAgICAgICAgc3RhdGUuY29kZSA9IGZhbHNlOwoKICAgICAgICBzdGF0ZS5mID0gc3RhdGUuYmxvY2s7CiAgICAgICAgdmFyIGluZGVudGF0aW9uID0gc3RyZWFtLm1hdGNoKC9eXHMqLywgdHJ1ZSlbMF0ucmVwbGFjZSgvXHQvZywgJyAgICAnKS5sZW5ndGg7CiAgICAgICAgdmFyIGRpZmZlcmVuY2UgPSBNYXRoLmZsb29yKChpbmRlbnRhdGlvbiAtIHN0YXRlLmluZGVudGF0aW9uKSAvIDQpICogNDsKICAgICAgICBpZiAoZGlmZmVyZW5jZSA+IDQpIGRpZmZlcmVuY2UgPSA0OwogICAgICAgIGluZGVudGF0aW9uID0gc3RhdGUuaW5kZW50YXRpb24gKyBkaWZmZXJlbmNlOwogICAgICAgIHN0YXRlLmluZGVudGF0aW9uRGlmZiA9IGluZGVudGF0aW9uIC0gc3RhdGUuaW5kZW50YXRpb247CiAgICAgICAgc3RhdGUuaW5kZW50YXRpb24gPSBpbmRlbnRhdGlvbjsKICAgICAgICBpZiAoaW5kZW50YXRpb24gPiAwKSB7IHJldHVybiBudWxsOyB9CiAgICAgIH0KICAgICAgcmV0dXJuIHN0YXRlLmYoc3RyZWFtLCBzdGF0ZSk7CiAgICB9LAoKICAgIGJsYW5rTGluZTogYmxhbmtMaW5lLAoKICAgIGdldFR5cGU6IGdldFR5cGUKICB9OwoKfSwgInhtbCIpOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbWFya2Rvd24iLCAibWFya2Rvd24iKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/markdown/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gSW5pdGlhdGUgTW9kZVRlc3QgYW5kIHNldCBkZWZhdWx0cwp2YXIgTVQgPSBNb2RlVGVzdDsKTVQubW9kZU5hbWUgPSAnbWFya2Rvd24nOwpNVC5tb2RlT3B0aW9ucyA9IHt9OwoKTVQudGVzdE1vZGUoCiAgJ3BsYWluVGV4dCcsCiAgJ2ZvbycsCiAgWwogICAgbnVsbCwgJ2ZvbycKICBdCik7CgovLyBDb2RlIGJsb2NrcyB1c2luZyA0IHNwYWNlcyAocmVnYXJkbGVzcyBvZiBDb2RlTWlycm9yLnRhYlNpemUgdmFsdWUpCk1ULnRlc3RNb2RlKAogICdjb2RlQmxvY2tzVXNpbmc0U3BhY2VzJywKICAnICAgIGZvbycsCiAgWwogICAgbnVsbCwgJyAgICAnLAogICAgJ2NvbW1lbnQnLCAnZm9vJwogIF0KKTsKLy8gQ29kZSBibG9ja3MgdXNpbmcgNCBzcGFjZXMgd2l0aCBpbnRlcm5hbCBpbmRlbnRhdGlvbgpNVC50ZXN0TW9kZSgKICAnY29kZUJsb2Nrc1VzaW5nNFNwYWNlc0luZGVudGF0aW9uJywKICAnICAgIGJhclxuICAgICAgICBoZWxsb1xuICAgICAgICAgICAgd29ybGRcbiAgICBmb29cbmJhcicsCiAgWwogICAgbnVsbCwgJyAgICAnLAogICAgJ2NvbW1lbnQnLCAnYmFyJywKICAgIG51bGwsICcgICAgICAgICcsCiAgICAnY29tbWVudCcsICdoZWxsbycsCiAgICBudWxsLCAnICAgICAgICAgICAgJywKICAgICdjb21tZW50JywgJ3dvcmxkJywKICAgIG51bGwsICcgICAgJywKICAgICdjb21tZW50JywgJ2ZvbycsCiAgICBudWxsLCAnYmFyJwogIF0KKTsKLy8gQ29kZSBibG9ja3MgdXNpbmcgNCBzcGFjZXMgd2l0aCBpbnRlcm5hbCBpbmRlbnRhdGlvbgpNVC50ZXN0TW9kZSgKICAnY29kZUJsb2Nrc1VzaW5nNFNwYWNlc0luZGVudGF0aW9uJywKICAnIGZvb1xuICAgIGJhclxuICAgICAgICBoZWxsb1xuICAgIHdvcmxkJywKICBbCiAgICBudWxsLCAnIGZvbycsCiAgICBudWxsLCAnICAgICcsCiAgICAnY29tbWVudCcsICdiYXInLAogICAgbnVsbCwgJyAgICAgICAgJywKICAgICdjb21tZW50JywgJ2hlbGxvJywKICAgIG51bGwsICcgICAgJywKICAgICdjb21tZW50JywgJ3dvcmxkJwogIF0KKTsKCi8vIENvZGUgYmxvY2tzIHVzaW5nIDEgdGFiIChyZWdhcmRsZXNzIG9mIENvZGVNaXJyb3IuaW5kZW50V2l0aFRhYnMgdmFsdWUpCk1ULnRlc3RNb2RlKAogICdjb2RlQmxvY2tzVXNpbmcxVGFiJywKICAnXHRmb28nLAogIFsKICAgIG51bGwsICdcdCcsCiAgICAnY29tbWVudCcsICdmb28nCiAgXQopOwoKLy8gSW5saW5lIGNvZGUgdXNpbmcgYmFja3RpY2tzCk1ULnRlc3RNb2RlKAogICdpbmxpbmVDb2RlVXNpbmdCYWNrdGlja3MnLAogICdmb28gYGJhcmAnLAogIFsKICAgIG51bGwsICdmb28gJywKICAgICdjb21tZW50JywgJ2BiYXJgJwogIF0KKTsKCi8vIEJsb2NrIGNvZGUgdXNpbmcgc2luZ2xlIGJhY2t0aWNrIChzaG91bGRuJ3Qgd29yaykKTVQudGVzdE1vZGUoCiAgJ2Jsb2NrQ29kZVNpbmdsZUJhY2t0aWNrJywKICAnYFxuZm9vXG5gJywKICBbCiAgICAnY29tbWVudCcsICdgJywKICAgIG51bGwsICdmb28nLAogICAgJ2NvbW1lbnQnLCAnYCcKICBdCik7CgovLyBVbmNsb3NlZCBiYWNrdGlja3MKLy8gSW5zdGVhZCBvZiBzaW1wbHkgbWFya2luZyBhcyBDT0RFLCBpdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYW4gCi8vIGluY29tcGxldGUgZmxhZyBmb3IgQ09ERSwgdGhhdCBpcyBzdHlsZWQgc2xpZ2h0bHkgZGlmZmVyZW50LgpNVC50ZXN0TW9kZSgKICAndW5jbG9zZWRCYWNrdGlja3MnLAogICdmb28gYGJhcicsCiAgWwogICAgbnVsbCwgJ2ZvbyAnLAogICAgJ2NvbW1lbnQnLCAnYGJhcicKICBdCik7CgovLyBQZXIgZG9jdW1lbnRhdGlvbjogIlRvIGluY2x1ZGUgYSBsaXRlcmFsIGJhY2t0aWNrIGNoYXJhY3RlciB3aXRoaW4gYSAKLy8gY29kZSBzcGFuLCB5b3UgY2FuIHVzZSBtdWx0aXBsZSBiYWNrdGlja3MgYXMgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgCi8vIGRlbGltaXRlcnMiCk1ULnRlc3RNb2RlKAogICdkb3VibGVCYWNrdGlja3MnLAogICdgYGZvbyBgIGJhcmBgJywKICBbCiAgICAnY29tbWVudCcsICdgYGZvbyBgIGJhcmBgJwogIF0KKTsKCi8vIFRlc3RzIGJhc2VkIG9uIERpbmd1cwovLyBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL2Rpbmd1cwovLyAKLy8gTXVsdGlwbGUgYmFja3RpY2tzIHdpdGhpbiBhbiBpbmxpbmUgY29kZSBibG9jawpNVC50ZXN0TW9kZSgKICAnY29uc2VjdXRpdmVCYWNrdGlja3MnLAogICdgZm9vYGBgYmFyYCcsCiAgWwogICAgJ2NvbW1lbnQnLCAnYGZvb2BgYGJhcmAnCiAgXQopOwovLyBNdWx0aXBsZSBiYWNrdGlja3Mgd2l0aGluIGFuIGlubGluZSBjb2RlIGJsb2NrIHdpdGggYSBzZWNvbmQgY29kZSBibG9jawpNVC50ZXN0TW9kZSgKICAnY29uc2VjdXRpdmVCYWNrdGlja3MnLAogICdgZm9vYGBgYmFyYCBoZWxsbyBgd29ybGRgJywKICBbCiAgICAnY29tbWVudCcsICdgZm9vYGBgYmFyYCcsCiAgICBudWxsLCAnIGhlbGxvICcsCiAgICAnY29tbWVudCcsICdgd29ybGRgJwogIF0KKTsKLy8gVW5jbG9zZWQgd2l0aCBzZXZlcmFsIGRpZmZlcmVudCBncm91cHMgb2YgYmFja3RpY2tzCk1ULnRlc3RNb2RlKAogICd1bmNsb3NlZEJhY2t0aWNrcycsCiAgJ2BgZm9vIGBgYCBiYXJgIGhlbGxvJywKICBbCiAgICAnY29tbWVudCcsICdgYGZvbyBgYGAgYmFyYCBoZWxsbycKICBdCik7Ci8vIENsb3NlZCB3aXRoIHNldmVyYWwgZGlmZmVyZW50IGdyb3VwcyBvZiBiYWNrdGlja3MKTVQudGVzdE1vZGUoCiAgJ2Nsb3NlZEJhY2t0aWNrcycsCiAgJ2BgZm9vIGBgYCBiYXJgIGhlbGxvYGAgd29ybGQnLAogIFsKICAgICdjb21tZW50JywgJ2BgZm9vIGBgYCBiYXJgIGhlbGxvYGAnLAogICAgbnVsbCwgJyB3b3JsZCcKICBdCik7CgovLyBhdHggaGVhZGVycwovLyBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNoZWFkZXIKLy8gCi8vIEgxCk1ULnRlc3RNb2RlKAogICdhdHhIMScsCiAgJyMgZm9vJywKICBbCiAgICAnaGVhZGVyJywgJyMgZm9vJwogIF0KKTsKLy8gSDIKTVQudGVzdE1vZGUoCiAgJ2F0eEgyJywKICAnIyMgZm9vJywKICBbCiAgICAnaGVhZGVyJywgJyMjIGZvbycKICBdCik7Ci8vIEgzCk1ULnRlc3RNb2RlKAogICdhdHhIMycsCiAgJyMjIyBmb28nLAogIFsKICAgICdoZWFkZXInLCAnIyMjIGZvbycKICBdCik7Ci8vIEg0Ck1ULnRlc3RNb2RlKAogICdhdHhINCcsCiAgJyMjIyMgZm9vJywKICBbCiAgICAnaGVhZGVyJywgJyMjIyMgZm9vJwogIF0KKTsKLy8gSDUKTVQudGVzdE1vZGUoCiAgJ2F0eEg1JywKICAnIyMjIyMgZm9vJywKICBbCiAgICAnaGVhZGVyJywgJyMjIyMjIGZvbycKICBdCik7Ci8vIEg2Ck1ULnRlc3RNb2RlKAogICdhdHhINicsCiAgJyMjIyMjIyBmb28nLAogIFsKICAgICdoZWFkZXInLCAnIyMjIyMjIGZvbycKICBdCik7Ci8vIEg2IC0gN3ggJyMnIHNob3VsZCBzdGlsbCBiZSBINiwgcGVyIERpbmd1cwovLyBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL2Rpbmd1cwpNVC50ZXN0TW9kZSgKICAnYXR4SDZOb3RINycsCiAgJyMjIyMjIyMgZm9vJywKICBbCiAgICAnaGVhZGVyJywgJyMjIyMjIyMgZm9vJwogIF0KKTsKCi8vIFNldGV4dCBoZWFkZXJzIC0gSDEsIEgyCi8vIFBlciBkb2N1bWVudGF0aW9uLCAiQW55IG51bWJlciBvZiB1bmRlcmxpbmluZyA94oCZcyBvciAt4oCZcyB3aWxsIHdvcmsuIgovLyBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNoZWFkZXIKLy8gSWRlYWxseSwgdGhlIHRleHQgd291bGQgYmUgbWFya2VkIGFzIGBoZWFkZXJgIGFzIHdlbGwsIGJ1dCB0aGlzIGlzIAovLyBub3QgcmVhbGx5IGZlYXNpYmxlIGF0IHRoZSBtb21lbnQuIFNvLCBpbnN0ZWFkLCB3ZSdyZSB0ZXN0aW5nIGFnYWluc3QgCi8vIHdoYXQgd29ya3MgdG9kYXksIHRvIGF2b2lkIGFueSByZWdyZXNzaW9ucy4KLy8gCi8vIENoZWNrIGlmIHNpbmdsZSB1bmRlcmxpbmluZyA9IHdvcmtzCk1ULnRlc3RNb2RlKAogICdzZXRleHRIMScsCiAgJ2Zvb1xuPScsCiAgWwogICAgbnVsbCwgJ2ZvbycsCiAgICAnaGVhZGVyJywgJz0nCiAgXQopOwovLyBDaGVjayBpZiAzKyA9J3Mgd29yawpNVC50ZXN0TW9kZSgKICAnc2V0ZXh0SDEnLAogICdmb29cbj09PScsCiAgWwogICAgbnVsbCwgJ2ZvbycsCiAgICAnaGVhZGVyJywgJz09PScKICBdCik7Ci8vIENoZWNrIGlmIHNpbmdsZSB1bmRlcmxpbmluZyAtIHdvcmtzCk1ULnRlc3RNb2RlKAogICdzZXRleHRIMicsCiAgJ2Zvb1xuLScsCiAgWwogICAgbnVsbCwgJ2ZvbycsCiAgICAnaGVhZGVyJywgJy0nCiAgXQopOwovLyBDaGVjayBpZiAzKyAtJ3Mgd29yawpNVC50ZXN0TW9kZSgKICAnc2V0ZXh0SDInLAogICdmb29cbi0tLScsCiAgWwogICAgbnVsbCwgJ2ZvbycsCiAgICAnaGVhZGVyJywgJy0tLScKICBdCik7CgovLyBTaW5nbGUtbGluZSBibG9ja3F1b3RlIHdpdGggdHJhaWxpbmcgc3BhY2UKTVQudGVzdE1vZGUoCiAgJ2Jsb2NrcXVvdGVTcGFjZScsCiAgJz4gZm9vJywKICBbCiAgICAncXVvdGUnLCAnPiBmb28nCiAgXQopOwoKLy8gU2luZ2xlLWxpbmUgYmxvY2txdW90ZQpNVC50ZXN0TW9kZSgKICAnYmxvY2txdW90ZU5vU3BhY2UnLAogICc+Zm9vJywKICBbCiAgICAncXVvdGUnLCAnPmZvbycKICBdCik7CgovLyBTaW5nbGUtbGluZSBibG9ja3F1b3RlIGZvbGxvd2VkIGJ5IG5vcm1hbCBwYXJhZ3JhcGgKTVQudGVzdE1vZGUoCiAgJ2Jsb2NrcXVvdGVUaGVuUGFyYWdyYXBoJywKICAnPmZvb1xuXG5iYXInLAogIFsKICAgICdxdW90ZScsICc+Zm9vJywKICAgIG51bGwsICdiYXInCiAgXQopOwoKLy8gTXVsdGktbGluZSBibG9ja3F1b3RlIChsYXp5IG1vZGUpCk1ULnRlc3RNb2RlKAogICdtdWx0aUJsb2NrcXVvdGVMYXp5JywKICAnPmZvb1xuYmFyJywKICBbCiAgICAncXVvdGUnLCAnPmZvbycsCiAgICAncXVvdGUnLCAnYmFyJwogIF0KKTsKCi8vIE11bHRpLWxpbmUgYmxvY2txdW90ZSBmb2xsb3dlZCBieSBub3JtYWwgcGFyYWdyYXBoIChsYXp5IG1vZGUpCk1ULnRlc3RNb2RlKAogICdtdWx0aUJsb2NrcXVvdGVMYXp5VGhlblBhcmFncmFwaCcsCiAgJz5mb29cbmJhclxuXG5oZWxsbycsCiAgWwogICAgJ3F1b3RlJywgJz5mb28nLAogICAgJ3F1b3RlJywgJ2JhcicsCiAgICBudWxsLCAnaGVsbG8nCiAgXQopOwoKLy8gTXVsdGktbGluZSBibG9ja3F1b3RlIChub24tbGF6eSBtb2RlKQpNVC50ZXN0TW9kZSgKICAnbXVsdGlCbG9ja3F1b3RlJywKICAnPmZvb1xuPmJhcicsCiAgWwogICAgJ3F1b3RlJywgJz5mb28nLAogICAgJ3F1b3RlJywgJz5iYXInCiAgXQopOwoKLy8gTXVsdGktbGluZSBibG9ja3F1b3RlIGZvbGxvd2VkIGJ5IG5vcm1hbCBwYXJhZ3JhcGggKG5vbi1sYXp5IG1vZGUpCk1ULnRlc3RNb2RlKAogICdtdWx0aUJsb2NrcXVvdGVUaGVuUGFyYWdyYXBoJywKICAnPmZvb1xuPmJhclxuXG5oZWxsbycsCiAgWwogICAgJ3F1b3RlJywgJz5mb28nLAogICAgJ3F1b3RlJywgJz5iYXInLAogICAgbnVsbCwgJ2hlbGxvJwogIF0KKTsKCi8vIENoZWNrIGxpc3QgdHlwZXMKTVQudGVzdE1vZGUoCiAgJ2xpc3RBc3RlcmlzaycsCiAgJyogZm9vXG4qIGJhcicsCiAgWwogICAgJ3N0cmluZycsICcqIGZvbycsCiAgICAnc3RyaW5nJywgJyogYmFyJwogIF0KKTsKTVQudGVzdE1vZGUoCiAgJ2xpc3RQbHVzJywKICAnKyBmb29cbisgYmFyJywKICBbCiAgICAnc3RyaW5nJywgJysgZm9vJywKICAgICdzdHJpbmcnLCAnKyBiYXInCiAgXQopOwpNVC50ZXN0TW9kZSgKICAnbGlzdERhc2gnLAogICctIGZvb1xuLSBiYXInLAogIFsKICAgICdzdHJpbmcnLCAnLSBmb28nLAogICAgJ3N0cmluZycsICctIGJhcicKICBdCik7Ck1ULnRlc3RNb2RlKAogICdsaXN0TnVtYmVyJywKICAnMS4gZm9vXG4yLiBiYXInLAogIFsKICAgICdzdHJpbmcnLCAnMS4gZm9vJywKICAgICdzdHJpbmcnLCAnMi4gYmFyJwogIF0KKTsKCi8vIEZvcm1hdHRpbmcgaW4gbGlzdHMgKCopCk1ULnRlc3RNb2RlKAogICdsaXN0QXN0ZXJpc2tGb3JtYXR0aW5nJywKICAnKiAqZm9vKiBiYXJcblxuKiAqKmZvbyoqIGJhclxuXG4qICoqKmZvbyoqKiBiYXJcblxuKiBgZm9vYCBiYXInLAogIFsKICAgICdzdHJpbmcnLCAnKiAnLAogICAgJ3N0cmluZyBlbScsICcqZm9vKicsCiAgICAnc3RyaW5nJywgJyBiYXInLAogICAgJ3N0cmluZycsICcqICcsCiAgICAnc3RyaW5nIHN0cm9uZycsICcqKmZvbyoqJywKICAgICdzdHJpbmcnLCAnIGJhcicsCiAgICAnc3RyaW5nJywgJyogJywKICAgICdzdHJpbmcgc3Ryb25nJywgJyoqJywKICAgICdzdHJpbmcgZW1zdHJvbmcnLCAnKmZvbyoqJywKICAgICdzdHJpbmcgZW0nLCAnKicsCiAgICAnc3RyaW5nJywgJyBiYXInLAogICAgJ3N0cmluZycsICcqICcsCiAgICAnc3RyaW5nIGNvbW1lbnQnLCAnYGZvb2AnLAogICAgJ3N0cmluZycsICcgYmFyJwogIF0KKTsKLy8gRm9ybWF0dGluZyBpbiBsaXN0cyAoKykKTVQudGVzdE1vZGUoCiAgJ2xpc3RQbHVzRm9ybWF0dGluZycsCiAgJysgKmZvbyogYmFyXG5cbisgKipmb28qKiBiYXJcblxuKyAqKipmb28qKiogYmFyXG5cbisgYGZvb2AgYmFyJywKICBbCiAgICAnc3RyaW5nJywgJysgJywKICAgICdzdHJpbmcgZW0nLCAnKmZvbyonLAogICAgJ3N0cmluZycsICcgYmFyJywKICAgICdzdHJpbmcnLCAnKyAnLAogICAgJ3N0cmluZyBzdHJvbmcnLCAnKipmb28qKicsCiAgICAnc3RyaW5nJywgJyBiYXInLAogICAgJ3N0cmluZycsICcrICcsCiAgICAnc3RyaW5nIHN0cm9uZycsICcqKicsCiAgICAnc3RyaW5nIGVtc3Ryb25nJywgJypmb28qKicsCiAgICAnc3RyaW5nIGVtJywgJyonLAogICAgJ3N0cmluZycsICcgYmFyJywKICAgICdzdHJpbmcnLCAnKyAnLAogICAgJ3N0cmluZyBjb21tZW50JywgJ2Bmb29gJywKICAgICdzdHJpbmcnLCAnIGJhcicKICBdCik7Ci8vIEZvcm1hdHRpbmcgaW4gbGlzdHMgKC0pCk1ULnRlc3RNb2RlKAogICdsaXN0RGFzaEZvcm1hdHRpbmcnLAogICctICpmb28qIGJhclxuXG4tICoqZm9vKiogYmFyXG5cbi0gKioqZm9vKioqIGJhclxuXG4tIGBmb29gIGJhcicsCiAgWwogICAgJ3N0cmluZycsICctICcsCiAgICAnc3RyaW5nIGVtJywgJypmb28qJywKICAgICdzdHJpbmcnLCAnIGJhcicsCiAgICAnc3RyaW5nJywgJy0gJywKICAgICdzdHJpbmcgc3Ryb25nJywgJyoqZm9vKionLAogICAgJ3N0cmluZycsICcgYmFyJywKICAgICdzdHJpbmcnLCAnLSAnLAogICAgJ3N0cmluZyBzdHJvbmcnLCAnKionLAogICAgJ3N0cmluZyBlbXN0cm9uZycsICcqZm9vKionLAogICAgJ3N0cmluZyBlbScsICcqJywKICAgICdzdHJpbmcnLCAnIGJhcicsCiAgICAnc3RyaW5nJywgJy0gJywKICAgICdzdHJpbmcgY29tbWVudCcsICdgZm9vYCcsCiAgICAnc3RyaW5nJywgJyBiYXInCiAgXQopOwovLyBGb3JtYXR0aW5nIGluIGxpc3RzICgxLikKTVQudGVzdE1vZGUoCiAgJ2xpc3ROdW1iZXJGb3JtYXR0aW5nJywKICAnMS4gKmZvbyogYmFyXG5cbjIuICoqZm9vKiogYmFyXG5cbjMuICoqKmZvbyoqKiBiYXJcblxuNC4gYGZvb2AgYmFyJywKICBbCiAgICAnc3RyaW5nJywgJzEuICcsCiAgICAnc3RyaW5nIGVtJywgJypmb28qJywKICAgICdzdHJpbmcnLCAnIGJhcicsCiAgICAnc3RyaW5nJywgJzIuICcsCiAgICAnc3RyaW5nIHN0cm9uZycsICcqKmZvbyoqJywKICAgICdzdHJpbmcnLCAnIGJhcicsCiAgICAnc3RyaW5nJywgJzMuICcsCiAgICAnc3RyaW5nIHN0cm9uZycsICcqKicsCiAgICAnc3RyaW5nIGVtc3Ryb25nJywgJypmb28qKicsCiAgICAnc3RyaW5nIGVtJywgJyonLAogICAgJ3N0cmluZycsICcgYmFyJywKICAgICdzdHJpbmcnLCAnNC4gJywKICAgICdzdHJpbmcgY29tbWVudCcsICdgZm9vYCcsCiAgICAnc3RyaW5nJywgJyBiYXInCiAgXQopOwoKLy8gUGFyYWdyYXBoIGxpc3RzCk1ULnRlc3RNb2RlKAogICdsaXN0UGFyYWdyYXBoJywKICAnKiBmb29cblxuKiBiYXInLAogIFsKICAgICdzdHJpbmcnLCAnKiBmb28nLAogICAgJ3N0cmluZycsICcqIGJhcicKICBdCik7CgovLyBNdWx0aS1wYXJhZ3JhcGggbGlzdHMKLy8KLy8gNCBzcGFjZXMKTVQudGVzdE1vZGUoCiAgJ2xpc3RNdWx0aVBhcmFncmFwaCcsCiAgJyogZm9vXG5cbiogYmFyXG5cbiAgICBoZWxsbycsCiAgWwogICAgJ3N0cmluZycsICcqIGZvbycsCiAgICAnc3RyaW5nJywgJyogYmFyJywKICAgIG51bGwsICcgICAgJywKICAgICdzdHJpbmcnLCAnaGVsbG8nCiAgXQopOwovLyA0IHNwYWNlcywgZXh0cmEgYmxhbmsgbGluZXMgKHNob3VsZCBzdGlsbCBiZSBsaXN0LCBwZXIgRGluZ3VzKQpNVC50ZXN0TW9kZSgKICAnbGlzdE11bHRpUGFyYWdyYXBoRXh0cmEnLAogICcqIGZvb1xuXG4qIGJhclxuXG5cbiAgICBoZWxsbycsCiAgWwogICAgJ3N0cmluZycsICcqIGZvbycsCiAgICAnc3RyaW5nJywgJyogYmFyJywKICAgIG51bGwsICcgICAgJywKICAgICdzdHJpbmcnLCAnaGVsbG8nCiAgXQopOwovLyA0IHNwYWNlcywgcGx1cyAxIHNwYWNlIChzaG91bGQgc3RpbGwgYmUgbGlzdCwgcGVyIERpbmd1cykKTVQudGVzdE1vZGUoCiAgJ2xpc3RNdWx0aVBhcmFncmFwaEV4dHJhU3BhY2UnLAogICcqIGZvb1xuXG4qIGJhclxuXG4gICAgIGhlbGxvXG5cbiAgICB3b3JsZCcsCiAgWwogICAgJ3N0cmluZycsICcqIGZvbycsCiAgICAnc3RyaW5nJywgJyogYmFyJywKICAgIG51bGwsICcgICAgICcsCiAgICAnc3RyaW5nJywgJ2hlbGxvJywKICAgIG51bGwsICcgICAgJywKICAgICdzdHJpbmcnLCAnd29ybGQnCiAgXQopOwovLyAxIHRhYgpNVC50ZXN0TW9kZSgKICAnbGlzdFRhYicsCiAgJyogZm9vXG5cbiogYmFyXG5cblx0aGVsbG8nLAogIFsKICAgICdzdHJpbmcnLCAnKiBmb28nLAogICAgJ3N0cmluZycsICcqIGJhcicsCiAgICBudWxsLCAnXHQnLAogICAgJ3N0cmluZycsICdoZWxsbycKICBdCik7Ci8vIE5vIGluZGVudApNVC50ZXN0TW9kZSgKICAnbGlzdE5vSW5kZW50JywKICAnKiBmb29cblxuKiBiYXJcblxuaGVsbG8nLAogIFsKICAgICdzdHJpbmcnLCAnKiBmb28nLAogICAgJ3N0cmluZycsICcqIGJhcicsCiAgICBudWxsLCAnaGVsbG8nCiAgXQopOwovLyBCbG9ja3F1b3RlCk1ULnRlc3RNb2RlKAogICdibG9ja3F1b3RlJywKICAnKiBmb29cblxuKiBiYXJcblxuICAgID4gaGVsbG8nLAogIFsKICAgICdzdHJpbmcnLCAnKiBmb28nLAogICAgJ3N0cmluZycsICcqIGJhcicsCiAgICBudWxsLCAnICAgICcsCiAgICAnc3RyaW5nIHF1b3RlJywgJz4gaGVsbG8nCiAgXQopOwovLyBDb2RlIGJsb2NrCk1ULnRlc3RNb2RlKAogICdibG9ja3F1b3RlQ29kZScsCiAgJyogZm9vXG5cbiogYmFyXG5cbiAgICAgICAgPiBoZWxsb1xuXG4gICAgd29ybGQnLAogIFsKICAgICdzdHJpbmcnLCAnKiBmb28nLAogICAgJ3N0cmluZycsICcqIGJhcicsCiAgICBudWxsLCAnICAgICAgICAnLAogICAgJ2NvbW1lbnQnLCAnPiBoZWxsbycsCiAgICBudWxsLCAnICAgICcsCiAgICAnc3RyaW5nJywgJ3dvcmxkJwogIF0KKTsKLy8gQ29kZSBibG9jayBmb2xsb3dlZCBieSB0ZXh0Ck1ULnRlc3RNb2RlKAogICdibG9ja3F1b3RlQ29kZVRleHQnLAogICcqIGZvb1xuXG4gICAgYmFyXG5cbiAgICAgICAgaGVsbG9cblxuICAgIHdvcmxkJywKICBbCiAgICAnc3RyaW5nJywgJyogZm9vJywKICAgIG51bGwsICcgICAgJywKICAgICdzdHJpbmcnLCAnYmFyJywKICAgIG51bGwsICcgICAgICAgICcsCiAgICAnY29tbWVudCcsICdoZWxsbycsCiAgICBudWxsLCAnICAgICcsCiAgICAnc3RyaW5nJywgJ3dvcmxkJwogIF0KKTsKCi8vIE5lc3RlZCBsaXN0Ci8vIAovLyAqCk1ULnRlc3RNb2RlKAogICdsaXN0QXN0ZXJpc2tOZXN0ZWQnLAogICcqIGZvb1xuXG4gICAgKiBiYXInLAogIFsKICAgICdzdHJpbmcnLCAnKiBmb28nLAogICAgbnVsbCwgJyAgICAnLAogICAgJ3N0cmluZycsICcqIGJhcicKICBdCik7Ci8vICsKTVQudGVzdE1vZGUoCiAgJ2xpc3RQbHVzTmVzdGVkJywKICAnKyBmb29cblxuICAgICsgYmFyJywKICBbCiAgICAnc3RyaW5nJywgJysgZm9vJywKICAgIG51bGwsICcgICAgJywKICAgICdzdHJpbmcnLCAnKyBiYXInCiAgXQopOwovLyAtCk1ULnRlc3RNb2RlKAogICdsaXN0RGFzaE5lc3RlZCcsCiAgJy0gZm9vXG5cbiAgICAtIGJhcicsCiAgWwogICAgJ3N0cmluZycsICctIGZvbycsCiAgICBudWxsLCAnICAgICcsCiAgICAnc3RyaW5nJywgJy0gYmFyJwogIF0KKTsKLy8gMS4KTVQudGVzdE1vZGUoCiAgJ2xpc3ROdW1iZXJOZXN0ZWQnLAogICcxLiBmb29cblxuICAgIDIuIGJhcicsCiAgWwogICAgJ3N0cmluZycsICcxLiBmb28nLAogICAgbnVsbCwgJyAgICAnLAogICAgJ3N0cmluZycsICcyLiBiYXInCiAgXQopOwovLyBNaXhlZApNVC50ZXN0TW9kZSgKICAnbGlzdE1peGVkJywKICAnKiBmb29cblxuICAgICsgYmFyXG5cbiAgICAgICAgLSBoZWxsb1xuXG4gICAgICAgICAgICAxLiB3b3JsZCcsCiAgWwogICAgJ3N0cmluZycsICcqIGZvbycsCiAgICBudWxsLCAnICAgICcsCiAgICAnc3RyaW5nJywgJysgYmFyJywKICAgIG51bGwsICcgICAgICAgICcsCiAgICAnc3RyaW5nJywgJy0gaGVsbG8nLAogICAgbnVsbCwgJyAgICAgICAgICAgICcsCiAgICAnc3RyaW5nJywgJzEuIHdvcmxkJwogIF0KKTsKLy8gQmxvY2txdW90ZQpNVC50ZXN0TW9kZSgKICAnbGlzdEJsb2NrcXVvdGUnLAogICcqIGZvb1xuXG4gICAgKyBiYXJcblxuICAgICAgICA+IGhlbGxvJywKICBbCiAgICAnc3RyaW5nJywgJyogZm9vJywKICAgIG51bGwsICcgICAgJywKICAgICdzdHJpbmcnLCAnKyBiYXInLAogICAgbnVsbCwgJyAgICAgICAgJywKICAgICdxdW90ZSBzdHJpbmcnLCAnPiBoZWxsbycKICBdCik7Ci8vIENvZGUKTVQudGVzdE1vZGUoCiAgJ2xpc3RDb2RlJywKICAnKiBmb29cblxuICAgICsgYmFyXG5cbiAgICAgICAgICAgIGhlbGxvJywKICBbCiAgICAnc3RyaW5nJywgJyogZm9vJywKICAgIG51bGwsICcgICAgJywKICAgICdzdHJpbmcnLCAnKyBiYXInLAogICAgbnVsbCwgJyAgICAgICAgICAgICcsCiAgICAnY29tbWVudCcsICdoZWxsbycKICBdCik7Ci8vIENvZGUgd2l0aCBpbnRlcm5hbCBpbmRlbnRhdGlvbgpNVC50ZXN0TW9kZSgKICAnbGlzdENvZGVJbmRlbnRhdGlvbicsCiAgJyogZm9vXG5cbiAgICAgICAgYmFyXG4gICAgICAgICAgICBoZWxsb1xuICAgICAgICAgICAgICAgIHdvcmxkXG4gICAgICAgIGZvb1xuICAgIGJhcicsCiAgWwogICAgJ3N0cmluZycsICcqIGZvbycsCiAgICBudWxsLCAnICAgICAgICAnLAogICAgJ2NvbW1lbnQnLCAnYmFyJywKICAgIG51bGwsICcgICAgICAgICAgICAnLAogICAgJ2NvbW1lbnQnLCAnaGVsbG8nLAogICAgbnVsbCwgJyAgICAgICAgICAgICAgICAnLAogICAgJ2NvbW1lbnQnLCAnd29ybGQnLAogICAgbnVsbCwgJyAgICAgICAgJywKICAgICdjb21tZW50JywgJ2ZvbycsCiAgICBudWxsLCAnICAgICcsCiAgICAnc3RyaW5nJywgJ2JhcicKICBdCik7Ci8vIENvZGUgZm9sbG93ZWQgYnkgdGV4dApNVC50ZXN0TW9kZSgKICAnbGlzdENvZGVUZXh0JywKICAnKiBmb29cblxuICAgICAgICBiYXJcblxuaGVsbG8nLAogIFsKICAgICdzdHJpbmcnLCAnKiBmb28nLAogICAgbnVsbCwgJyAgICAgICAgJywKICAgICdjb21tZW50JywgJ2JhcicsCiAgICBudWxsLCAnaGVsbG8nCiAgXQopOwoKLy8gRm9sbG93aW5nIHRlc3RzIGRpcmVjdGx5IGZyb20gb2ZmaWNpYWwgTWFya2Rvd24gZG9jdW1lbnRhdGlvbgovLyBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNocgpNVC50ZXN0TW9kZSgKICAnaHJTcGFjZScsCiAgJyogKiAqJywKICBbCiAgICAnaHInLCAnKiAqIConCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ2hyJywKICAnKioqJywKICBbCiAgICAnaHInLCAnKioqJwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdockxvbmcnLAogICcqKioqKicsCiAgWwogICAgJ2hyJywgJyoqKioqJwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdoclNwYWNlRGFzaCcsCiAgJy0gLSAtJywKICBbCiAgICAnaHInLCAnLSAtIC0nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ2hyRGFzaExvbmcnLAogICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nLAogIFsKICAgICdocicsICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCiAgXQopOwoKLy8gSW5saW5lIGxpbmsgd2l0aCB0aXRsZQpNVC50ZXN0TW9kZSgKICAnbGlua1RpdGxlJywKICAnW2Zvb10oaHR0cDovL2V4YW1wbGUuY29tLyAiYmFyIikgaGVsbG8nLAogIFsKICAgICdsaW5rJywgJ1tmb29dJywKICAgICdzdHJpbmcnLCAnKGh0dHA6Ly9leGFtcGxlLmNvbS8gImJhciIpJywKICAgIG51bGwsICcgaGVsbG8nCiAgXQopOwoKLy8gSW5saW5lIGxpbmsgd2l0aG91dCB0aXRsZQpNVC50ZXN0TW9kZSgKICAnbGlua05vVGl0bGUnLAogICdbZm9vXShodHRwOi8vZXhhbXBsZS5jb20vKSBiYXInLAogIFsKICAgICdsaW5rJywgJ1tmb29dJywKICAgICdzdHJpbmcnLCAnKGh0dHA6Ly9leGFtcGxlLmNvbS8pJywKICAgIG51bGwsICcgYmFyJwogIF0KKTsKCi8vIElubGluZSBsaW5rIHdpdGggRW0KTVQudGVzdE1vZGUoCiAgJ2xpbmtFbScsCiAgJ1sqZm9vKl0oaHR0cDovL2V4YW1wbGUuY29tLykgYmFyJywKICBbCiAgICAnbGluaycsICdbJywKICAgICdsaW5rIGVtJywgJypmb28qJywKICAgICdsaW5rJywgJ10nLAogICAgJ3N0cmluZycsICcoaHR0cDovL2V4YW1wbGUuY29tLyknLAogICAgbnVsbCwgJyBiYXInCiAgXQopOwoKLy8gSW5saW5lIGxpbmsgd2l0aCBTdHJvbmcKTVQudGVzdE1vZGUoCiAgJ2xpbmtTdHJvbmcnLAogICdbKipmb28qKl0oaHR0cDovL2V4YW1wbGUuY29tLykgYmFyJywKICBbCiAgICAnbGluaycsICdbJywKICAgICdsaW5rIHN0cm9uZycsICcqKmZvbyoqJywKICAgICdsaW5rJywgJ10nLAogICAgJ3N0cmluZycsICcoaHR0cDovL2V4YW1wbGUuY29tLyknLAogICAgbnVsbCwgJyBiYXInCiAgXQopOwoKLy8gSW5saW5lIGxpbmsgd2l0aCBFbVN0cm9uZwpNVC50ZXN0TW9kZSgKICAnbGlua0VtU3Ryb25nJywKICAnWyoqKmZvbyoqKl0oaHR0cDovL2V4YW1wbGUuY29tLykgYmFyJywKICBbCiAgICAnbGluaycsICdbJywKICAgICdsaW5rIHN0cm9uZycsICcqKicsCiAgICAnbGluayBlbXN0cm9uZycsICcqZm9vKionLAogICAgJ2xpbmsgZW0nLCAnKicsCiAgICAnbGluaycsICddJywKICAgICdzdHJpbmcnLCAnKGh0dHA6Ly9leGFtcGxlLmNvbS8pJywKICAgIG51bGwsICcgYmFyJwogIF0KKTsKCi8vIEltYWdlIHdpdGggdGl0bGUKTVQudGVzdE1vZGUoCiAgJ2ltYWdlVGl0bGUnLAogICchW2Zvb10oaHR0cDovL2V4YW1wbGUuY29tLyAiYmFyIikgaGVsbG8nLAogIFsKICAgICd0YWcnLCAnIVtmb29dJywKICAgICdzdHJpbmcnLCAnKGh0dHA6Ly9leGFtcGxlLmNvbS8gImJhciIpJywKICAgIG51bGwsICcgaGVsbG8nCiAgXQopOwoKLy8gSW1hZ2Ugd2l0aG91dCB0aXRsZQpNVC50ZXN0TW9kZSgKICAnaW1hZ2VOb1RpdGxlJywKICAnIVtmb29dKGh0dHA6Ly9leGFtcGxlLmNvbS8pIGJhcicsCiAgWwogICAgJ3RhZycsICchW2Zvb10nLAogICAgJ3N0cmluZycsICcoaHR0cDovL2V4YW1wbGUuY29tLyknLAogICAgbnVsbCwgJyBiYXInCiAgXQopOwoKLy8gSW1hZ2Ugd2l0aCBhc3Rlcmlza3MKTVQudGVzdE1vZGUoCiAgJ2ltYWdlQXN0ZXJpc2tzJywKICAnIVsqZm9vKl0oaHR0cDovL2V4YW1wbGUuY29tLykgYmFyJywKICBbCiAgICAndGFnJywgJyFbKmZvbypdJywKICAgICdzdHJpbmcnLCAnKGh0dHA6Ly9leGFtcGxlLmNvbS8pJywKICAgIG51bGwsICcgYmFyJwogIF0KKTsKCi8vIE5vdCBhIGxpbmsuIFNob3VsZCBiZSBub3JtYWwgdGV4dCBkdWUgdG8gc3F1YXJlIGJyYWNrZXRzIGJlaW5nIHVzZWQKLy8gcmVndWxhcmx5IGluIHRleHQsIGVzcGVjaWFsbHkgaW4gcXVvdGVkIG1hdGVyaWFsLCBhbmQgbm8gc3BhY2UgaXMgYWxsb3dlZAovLyBiZXR3ZWVuIHNxdWFyZSBicmFja2V0cyBhbmQgcGFyZW50aGVzZXMgKHBlciBEaW5ndXMpLgpNVC50ZXN0TW9kZSgKICAnbm90QUxpbmsnLAogICdbZm9vXSAoYmFyKScsCiAgWwogICAgbnVsbCwgJ1tmb29dIChiYXIpJwogIF0KKTsKCi8vIFJlZmVyZW5jZS1zdHlsZSBsaW5rcwpNVC50ZXN0TW9kZSgKICAnbGlua1JlZmVyZW5jZScsCiAgJ1tmb29dW2Jhcl0gaGVsbG8nLAogIFsKICAgICdsaW5rJywgJ1tmb29dJywKICAgICdzdHJpbmcnLCAnW2Jhcl0nLAogICAgbnVsbCwgJyBoZWxsbycKICBdCik7Ci8vIFJlZmVyZW5jZS1zdHlsZSBsaW5rcyB3aXRoIEVtCk1ULnRlc3RNb2RlKAogICdsaW5rUmVmZXJlbmNlRW0nLAogICdbKmZvbypdW2Jhcl0gaGVsbG8nLAogIFsKICAgICdsaW5rJywgJ1snLAogICAgJ2xpbmsgZW0nLCAnKmZvbyonLAogICAgJ2xpbmsnLCAnXScsCiAgICAnc3RyaW5nJywgJ1tiYXJdJywKICAgIG51bGwsICcgaGVsbG8nCiAgXQopOwovLyBSZWZlcmVuY2Utc3R5bGUgbGlua3Mgd2l0aCBTdHJvbmcKTVQudGVzdE1vZGUoCiAgJ2xpbmtSZWZlcmVuY2VTdHJvbmcnLAogICdbKipmb28qKl1bYmFyXSBoZWxsbycsCiAgWwogICAgJ2xpbmsnLCAnWycsCiAgICAnbGluayBzdHJvbmcnLCAnKipmb28qKicsCiAgICAnbGluaycsICddJywKICAgICdzdHJpbmcnLCAnW2Jhcl0nLAogICAgbnVsbCwgJyBoZWxsbycKICBdCik7Ci8vIFJlZmVyZW5jZS1zdHlsZSBsaW5rcyB3aXRoIEVtU3Ryb25nCk1ULnRlc3RNb2RlKAogICdsaW5rUmVmZXJlbmNlRW1TdHJvbmcnLAogICdbKioqZm9vKioqXVtiYXJdIGhlbGxvJywKICBbCiAgICAnbGluaycsICdbJywKICAgICdsaW5rIHN0cm9uZycsICcqKicsCiAgICAnbGluayBlbXN0cm9uZycsICcqZm9vKionLAogICAgJ2xpbmsgZW0nLCAnKicsCiAgICAnbGluaycsICddJywKICAgICdzdHJpbmcnLCAnW2Jhcl0nLAogICAgbnVsbCwgJyBoZWxsbycKICBdCik7CgovLyBSZWZlcmVuY2Utc3R5bGUgbGlua3Mgd2l0aCBvcHRpb25hbCBzcGFjZSBzZXBhcmF0b3IgKHBlciBkb2N1ZW50YXRpb24pCi8vICJZb3UgY2FuIG9wdGlvbmFsbHkgdXNlIGEgc3BhY2UgdG8gc2VwYXJhdGUgdGhlIHNldHMgb2YgYnJhY2tldHMiCk1ULnRlc3RNb2RlKAogICdsaW5rUmVmZXJlbmNlU3BhY2UnLAogICdbZm9vXSBbYmFyXSBoZWxsbycsCiAgWwogICAgJ2xpbmsnLCAnW2Zvb10nLAogICAgbnVsbCwgJyAnLAogICAgJ3N0cmluZycsICdbYmFyXScsCiAgICBudWxsLCAnIGhlbGxvJwogIF0KKTsKLy8gU2hvdWxkIG9ubHkgYWxsb3cgYSBzaW5nbGUgc3BhY2UgKCIuLi51c2UgKmEqIHNwYWNlLi4uIikKTVQudGVzdE1vZGUoCiAgJ2xpbmtSZWZlcmVuY2VEb3VibGVTcGFjZScsCiAgJ1tmb29dICBbYmFyXSBoZWxsbycsCiAgWwogICAgbnVsbCwgJ1tmb29dICBbYmFyXSBoZWxsbycKICBdCik7CgovLyBSZWZlcmVuY2Utc3R5bGUgbGlua3Mgd2l0aCBpbXBsaWNpdCBsaW5rIG5hbWUKTVQudGVzdE1vZGUoCiAgJ2xpbmtJbXBsaWNpdCcsCiAgJ1tmb29dW10gaGVsbG8nLAogIFsKICAgICdsaW5rJywgJ1tmb29dJywKICAgICdzdHJpbmcnLCAnW10nLAogICAgbnVsbCwgJyBoZWxsbycKICBdCik7CgovLyBAdG9kbyBJdCB3b3VsZCBiZSBuaWNlIGlmLCBhdCBzb21lIHBvaW50LCB0aGUgZG9jdW1lbnQgd2FzIGFjdHVhbGx5Ci8vIGNoZWNrZWQgdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkIGxpbmsgZXhpc3RzCgovLyBMaW5rIGxhYmVsLCBmb3IgcmVmZXJlbmNlLXN0eWxlIGxpbmtzICh0YWtlbiBmcm9tIGRvY3VtZW50YXRpb24pCi8vCi8vIE5vIHRpdGxlCk1ULnRlc3RNb2RlKAogICdsYWJlbE5vVGl0bGUnLAogICdbZm9vXTogaHR0cDovL2V4YW1wbGUuY29tLycsCiAgWwogICAgJ2xpbmsnLCAnW2Zvb106JywKICAgIG51bGwsICcgJywKICAgICdzdHJpbmcnLCAnaHR0cDovL2V4YW1wbGUuY29tLycKICBdCik7Ci8vIFNwYWNlIGluIElEIGFuZCB0aXRsZQpNVC50ZXN0TW9kZSgKICAnbGFiZWxTcGFjZVRpdGxlJywKICAnW2ZvbyBiYXJdOiBodHRwOi8vZXhhbXBsZS5jb20vICJoZWxsbyInLAogIFsKICAgICdsaW5rJywgJ1tmb28gYmFyXTonLAogICAgbnVsbCwgJyAnLAogICAgJ3N0cmluZycsICdodHRwOi8vZXhhbXBsZS5jb20vICJoZWxsbyInCiAgXQopOwovLyBEb3VibGUgdGl0bGUKTVQudGVzdE1vZGUoCiAgJ2xhYmVsRG91YmxlVGl0bGUnLAogICdbZm9vIGJhcl06IGh0dHA6Ly9leGFtcGxlLmNvbS8gImhlbGxvIiAid29ybGQiJywKICBbCiAgICAnbGluaycsICdbZm9vIGJhcl06JywKICAgIG51bGwsICcgJywKICAgICdzdHJpbmcnLCAnaHR0cDovL2V4YW1wbGUuY29tLyAiaGVsbG8iJywKICAgIG51bGwsICcgIndvcmxkIicKICBdCik7Ci8vIERvdWJsZSBxdW90ZXMgYXJvdW5kIHRpdGxlCk1ULnRlc3RNb2RlKAogICdsYWJlbFRpdGxlRG91YmxlUXVvdGVzJywKICAnW2Zvb106IGh0dHA6Ly9leGFtcGxlLmNvbS8gICJiYXIiJywKICBbCiAgICAnbGluaycsICdbZm9vXTonLAogICAgbnVsbCwgJyAnLAogICAgJ3N0cmluZycsICdodHRwOi8vZXhhbXBsZS5jb20vICAiYmFyIicKICBdCik7Ci8vIFNpbmdsZSBxdW90ZXMgYXJvdW5kIHRpdGxlCk1ULnRlc3RNb2RlKAogICdsYWJlbFRpdGxlU2luZ2xlUXVvdGVzJywKICAnW2Zvb106IGh0dHA6Ly9leGFtcGxlLmNvbS8gIFwnYmFyXCcnLAogIFsKICAgICdsaW5rJywgJ1tmb29dOicsCiAgICBudWxsLCAnICcsCiAgJ3N0cmluZycsICdodHRwOi8vZXhhbXBsZS5jb20vICBcJ2JhclwnJwogIF0KKTsKLy8gUGFyZW50aGVzZXMgYXJvdW5kIHRpdGxlCk1ULnRlc3RNb2RlKAogICdsYWJlbFRpdGxlUGFyZW50aGVzZScsCiAgJ1tmb29dOiBodHRwOi8vZXhhbXBsZS5jb20vICAoYmFyKScsCiAgWwogICAgJ2xpbmsnLCAnW2Zvb106JywKICAgIG51bGwsICcgJywKICAgICdzdHJpbmcnLCAnaHR0cDovL2V4YW1wbGUuY29tLyAgKGJhciknCiAgXQopOwovLyBJbnZhbGlkIHRpdGxlCk1ULnRlc3RNb2RlKAogICdsYWJlbFRpdGxlSW52YWxpZCcsCiAgJ1tmb29dOiBodHRwOi8vZXhhbXBsZS5jb20vIGJhcicsCiAgWwogICAgJ2xpbmsnLCAnW2Zvb106JywKICAgIG51bGwsICcgJywKICAgICdzdHJpbmcnLCAnaHR0cDovL2V4YW1wbGUuY29tLycsCiAgICBudWxsLCAnIGJhcicKICBdCik7Ci8vIEFuZ2xlIGJyYWNrZXRzIGFyb3VuZCBVUkwKTVQudGVzdE1vZGUoCiAgJ2xhYmVsTGlua0FuZ2xlQnJhY2tldHMnLAogICdbZm9vXTogPGh0dHA6Ly9leGFtcGxlLmNvbS8+ICAiYmFyIicsCiAgWwogICAgJ2xpbmsnLCAnW2Zvb106JywKICAgIG51bGwsICcgJywKICAgICdzdHJpbmcnLCAnPGh0dHA6Ly9leGFtcGxlLmNvbS8+ICAiYmFyIicKICBdCik7Ci8vIFRpdGxlIG9uIG5leHQgbGluZSBwZXIgZG9jdW1lbnRhdGlvbiAoZG91YmxlIHF1b3RlcykKTVQudGVzdE1vZGUoCiAgJ2xhYmVsVGl0bGVOZXh0RG91YmxlUXVvdGVzJywKICAnW2Zvb106IGh0dHA6Ly9leGFtcGxlLmNvbS9cbiJiYXIiIGhlbGxvJywKICBbCiAgICAnbGluaycsICdbZm9vXTonLAogICAgbnVsbCwgJyAnLAogICAgJ3N0cmluZycsICdodHRwOi8vZXhhbXBsZS5jb20vJywKICAgICdzdHJpbmcnLCAnImJhciInLAogICAgbnVsbCwgJyBoZWxsbycKICBdCik7Ci8vIFRpdGxlIG9uIG5leHQgbGluZSBwZXIgZG9jdW1lbnRhdGlvbiAoc2luZ2xlIHF1b3RlcykKTVQudGVzdE1vZGUoCiAgJ2xhYmVsVGl0bGVOZXh0U2luZ2xlUXVvdGVzJywKICAnW2Zvb106IGh0dHA6Ly9leGFtcGxlLmNvbS9cblwnYmFyXCcgaGVsbG8nLAogIFsKICAgICdsaW5rJywgJ1tmb29dOicsCiAgICBudWxsLCAnICcsCiAgICAnc3RyaW5nJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLAogICdzdHJpbmcnLCAnXCdiYXJcJycsCiAgbnVsbCwgJyBoZWxsbycKICBdCik7Ci8vIFRpdGxlIG9uIG5leHQgbGluZSBwZXIgZG9jdW1lbnRhdGlvbiAocGFyZW50aGVzZXMpCk1ULnRlc3RNb2RlKAogICdsYWJlbFRpdGxlTmV4dFBhcmVudGhlc2UnLAogICdbZm9vXTogaHR0cDovL2V4YW1wbGUuY29tL1xuKGJhcikgaGVsbG8nLAogIFsKICAgICdsaW5rJywgJ1tmb29dOicsCiAgICBudWxsLCAnICcsCiAgICAnc3RyaW5nJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLAogICAgJ3N0cmluZycsICcoYmFyKScsCiAgICBudWxsLCAnIGhlbGxvJwogIF0KKTsKLy8gVGl0bGUgb24gbmV4dCBsaW5lIHBlciBkb2N1bWVudGF0aW9uIChtaXhlZCkKTVQudGVzdE1vZGUoCiAgJ2xhYmVsVGl0bGVOZXh0TWl4ZWQnLAogICdbZm9vXTogaHR0cDovL2V4YW1wbGUuY29tL1xuKGJhciIgaGVsbG8nLAogIFsKICAgICdsaW5rJywgJ1tmb29dOicsCiAgICBudWxsLCAnICcsCiAgICAnc3RyaW5nJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLAogICAgbnVsbCwgJyhiYXIiIGhlbGxvJwogIF0KKTsKCi8vIEF1dG9tYXRpYyBsaW5rcwpNVC50ZXN0TW9kZSgKICAnbGlua1dlYicsCiAgJzxodHRwOi8vZXhhbXBsZS5jb20vPiBmb28nLAogIFsKICAgICdsaW5rJywgJzxodHRwOi8vZXhhbXBsZS5jb20vPicsCiAgICBudWxsLCAnIGZvbycKICBdCik7CgovLyBBdXRvbWF0aWMgZW1haWwgbGlua3MKTVQudGVzdE1vZGUoCiAgJ2xpbmtFbWFpbCcsCiAgJzx1c2VyQGV4YW1wbGUuY29tPiBmb28nLAogIFsKICAgICdsaW5rJywgJzx1c2VyQGV4YW1wbGUuY29tPicsCiAgICBudWxsLCAnIGZvbycKICBdCik7CgovLyBTaW5nbGUgYXN0ZXJpc2sKTVQudGVzdE1vZGUoCiAgJ2VtQXN0ZXJpc2snLAogICcqZm9vKiBiYXInLAogIFsKICAgICdlbScsICcqZm9vKicsCiAgICBudWxsLCAnIGJhcicKICBdCik7CgovLyBTaW5nbGUgdW5kZXJzY29yZQpNVC50ZXN0TW9kZSgKICAnZW1VbmRlcnNjb3JlJywKICAnX2Zvb18gYmFyJywKICBbCiAgICAnZW0nLCAnX2Zvb18nLAogICAgbnVsbCwgJyBiYXInCiAgXQopOwoKLy8gRW1waGFzaXMgY2hhcmFjdGVycyB3aXRoaW4gYSB3b3JkCk1ULnRlc3RNb2RlKAogICdlbUluV29yZEFzdGVyaXNrJywKICAnZm9vKmJhcipoZWxsbycsCiAgWwogICAgbnVsbCwgJ2ZvbycsCiAgICAnZW0nLCAnKmJhcionLAogICAgbnVsbCwgJ2hlbGxvJwogIF0KKTsKTVQudGVzdE1vZGUoCiAgJ2VtSW5Xb3JkVW5kZXJzY29yZScsCiAgJ2Zvb19iYXJfaGVsbG8nLAogIFsKICAgIG51bGwsICdmb28nLAogICAgJ2VtJywgJ19iYXJfJywKICAgIG51bGwsICdoZWxsbycKICBdCik7Ci8vIFBlciBkb2N1bWVudGF0aW9uOiAiLi4uc3Vycm91bmQgYW4gKiBvciBfIHdpdGggc3BhY2VzLCBpdOKAmWxsIGJlIAovLyB0cmVhdGVkIGFzIGEgbGl0ZXJhbCBhc3RlcmlzayBvciB1bmRlcnNjb3JlLiIKLy8gCi8vIEluc2lkZSBFTQpNVC50ZXN0TW9kZSgKICAnZW1Fc2NhcGVkQnlTcGFjZUluJywKICAnZm9vIF9iYXIgXyBoZWxsb18gd29ybGQnLAogIFsKICAgIG51bGwsICdmb28gJywKICAgICdlbScsICdfYmFyIF8gaGVsbG9fJywKICAgIG51bGwsICcgd29ybGQnCiAgXQopOwovLyBPdXRzaWRlIEVNCk1ULnRlc3RNb2RlKAogICdlbUVzY2FwZWRCeVNwYWNlT3V0JywKICAnZm9vIF8gYmFyX2hlbGxvX3dvcmxkJywKICBbCiAgICBudWxsLCAnZm9vIF8gYmFyJywKICAgICdlbScsICdfaGVsbG9fJywKICAgIG51bGwsICd3b3JsZCcKICBdCik7CgovLyBVbmNsb3NlZCBlbXBoYXNpcyBjaGFyYWN0ZXJzCi8vIEluc3RlYWQgb2Ygc2ltcGx5IG1hcmtpbmcgYXMgRU0gLyBTVFJPTkcsIGl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBhbiAKLy8gaW5jb21wbGV0ZSBmbGFnIGZvciBFTSBhbmQgU1RST05HLCB0aGF0IGlzIHN0eWxlZCBzbGlnaHRseSBkaWZmZXJlbnQuCk1ULnRlc3RNb2RlKAogICdlbUluY29tcGxldGVBc3RlcmlzaycsCiAgJ2ZvbyAqYmFyJywKICBbCiAgICBudWxsLCAnZm9vICcsCiAgICAnZW0nLCAnKmJhcicKICBdCik7Ck1ULnRlc3RNb2RlKAogICdlbUluY29tcGxldGVVbmRlcnNjb3JlJywKICAnZm9vIF9iYXInLAogIFsKICAgIG51bGwsICdmb28gJywKICAgICdlbScsICdfYmFyJwogIF0KKTsKCi8vIERvdWJsZSBhc3RlcmlzawpNVC50ZXN0TW9kZSgKICAnc3Ryb25nQXN0ZXJpc2snLAogICcqKmZvbyoqIGJhcicsCiAgWwogICAgJ3N0cm9uZycsICcqKmZvbyoqJywKICAgIG51bGwsICcgYmFyJwogIF0KKTsKCi8vIERvdWJsZSB1bmRlcnNjb3JlCk1ULnRlc3RNb2RlKAogICdzdHJvbmdVbmRlcnNjb3JlJywKICAnX19mb29fXyBiYXInLAogIFsKICAgICdzdHJvbmcnLCAnX19mb29fXycsCiAgICBudWxsLCAnIGJhcicKICBdCik7CgovLyBUcmlwbGUgYXN0ZXJpc2sKTVQudGVzdE1vZGUoCiAgJ2VtU3Ryb25nQXN0ZXJpc2snLAogICcqZm9vKipiYXIqaGVsbG8qKiB3b3JsZCcsCiAgWwogICAgJ2VtJywgJypmb28nLAogICAgJ2Vtc3Ryb25nJywgJyoqYmFyKicsCiAgICAnc3Ryb25nJywgJ2hlbGxvKionLAogICAgbnVsbCwgJyB3b3JsZCcKICBdCik7CgovLyBUcmlwbGUgdW5kZXJzY29yZQpNVC50ZXN0TW9kZSgKICAnZW1TdHJvbmdVbmRlcnNjb3JlJywKICAnX2Zvb19fYmFyX2hlbGxvX18gd29ybGQnLAogIFsKICAgICdlbScsICdfZm9vJywKICAgICdlbXN0cm9uZycsICdfX2Jhcl8nLAogICAgJ3N0cm9uZycsICdoZWxsb19fJywKICAgIG51bGwsICcgd29ybGQnCiAgXQopOwoKLy8gVHJpcGxlIG1peGVkCi8vICIuLi5zYW1lIGNoYXJhY3RlciBtdXN0IGJlIHVzZWQgdG8gb3BlbiBhbmQgY2xvc2UgYW4gZW1waGFzaXMgc3Bhbi4iIgpNVC50ZXN0TW9kZSgKICAnZW1TdHJvbmdNaXhlZCcsCiAgJ19mb28qKmJhcipoZWxsb19fIHdvcmxkJywKICBbCiAgICAnZW0nLCAnX2ZvbycsCiAgICAnZW1zdHJvbmcnLCAnKipiYXIqaGVsbG9fXyB3b3JsZCcKICBdCik7CgpNVC50ZXN0TW9kZSgKICAnZW1TdHJvbmdNaXhlZCcsCiAgJypmb29fX2Jhcl9oZWxsbyoqIHdvcmxkJywKICBbCiAgICAnZW0nLCAnKmZvbycsCiAgICAnZW1zdHJvbmcnLCAnX19iYXJfaGVsbG8qKiB3b3JsZCcKICBdCik7CgovLyBUaGVzZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBlc2NhcGVkOgovLyBcICAgYmFja3NsYXNoCi8vIGAgICBiYWNrdGljawovLyAqICAgYXN0ZXJpc2sKLy8gXyAgIHVuZGVyc2NvcmUKLy8ge30gIGN1cmx5IGJyYWNlcwovLyBbXSAgc3F1YXJlIGJyYWNrZXRzCi8vICgpICBwYXJlbnRoZXNlcwovLyAjICAgaGFzaCBtYXJrCi8vICsgICBwbHVzIHNpZ24KLy8gLSAgIG1pbnVzIHNpZ24gKGh5cGhlbikKLy8gLiAgIGRvdAovLyAhICAgZXhjbGFtYXRpb24gbWFyawovLyAKLy8gQmFja3RpY2sgKGNvZGUpCk1ULnRlc3RNb2RlKAogICdlc2NhcGVCYWNrdGljaycsCiAgJ2ZvbyBcXGBiYXJcXGAnLAogIFsKICAgIG51bGwsICdmb28gXFxgYmFyXFxgJwogIF0KKTsKTVQudGVzdE1vZGUoCiAgJ2RvdWJsZUVzY2FwZUJhY2t0aWNrJywKICAnZm9vIFxcXFxgYmFyXFxcXGAnLAogIFsKICAgIG51bGwsICdmb28gXFxcXCcsCiAgICAnY29tbWVudCcsICdgYmFyXFxcXGAnCiAgXQopOwovLyBBc3RlcmlzayAoZW0pCk1ULnRlc3RNb2RlKAogICdlc2NhcGVBc3RlcmlzaycsCiAgJ2ZvbyBcXCpiYXJcXConLAogIFsKICAgIG51bGwsICdmb28gXFwqYmFyXFwqJwogIF0KKTsKTVQudGVzdE1vZGUoCiAgJ2RvdWJsZUVzY2FwZUFzdGVyaXNrJywKICAnZm9vIFxcXFwqYmFyXFxcXConLAogIFsKICAgIG51bGwsICdmb28gXFxcXCcsCiAgICAnZW0nLCAnKmJhclxcXFwqJwogIF0KKTsKLy8gVW5kZXJzY29yZSAoZW0pCk1ULnRlc3RNb2RlKAogICdlc2NhcGVVbmRlcnNjb3JlJywKICAnZm9vIFxcX2JhclxcXycsCiAgWwogICAgbnVsbCwgJ2ZvbyBcXF9iYXJcXF8nCiAgXQopOwpNVC50ZXN0TW9kZSgKICAnZG91YmxlRXNjYXBlVW5kZXJzY29yZScsCiAgJ2ZvbyBcXFxcX2JhclxcXFxfJywKICBbCiAgICBudWxsLCAnZm9vIFxcXFwnLAogICAgJ2VtJywgJ19iYXJcXFxcXycKICBdCik7Ci8vIEhhc2ggbWFyayAoaGVhZGVycykKTVQudGVzdE1vZGUoCiAgJ2VzY2FwZUhhc2gnLAogICdcXCMgZm9vJywKICBbCiAgICBudWxsLCAnXFwjIGZvbycKICBdCik7Ck1ULnRlc3RNb2RlKAogICdkb3VibGVFc2NhcGVIYXNoJywKICAnXFxcXCMgZm9vJywKICBbCiAgICBudWxsLCAnXFxcXCMgZm9vJwogIF0KKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/mysql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/mysql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IE15U1FMIG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJteXNxbC5qcyI+PC9zY3JpcHQ+CiAgICA8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBNeVNRTCBtb2RlPC9oMT4KICAgIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci0tIENvbW1lbnQgZm9yIHRoZSBjb2RlCi0tIE15U1FMIE1vZGUgZm9yIENvZGVNaXJyb3IyIGJ5IE15U1FMVG9vbHMgaHR0cDovL2dpdGh1Yi5jb20vcGFydHlkcm9pZC9NeVNRTC1Ub29scwpTRUxFQ1QgIFVOSVFVRSBgdmFyMWAgYXMgYHZhcmlhYmxlYCwKICAgICAgICBNQVgoYHZhcjVgKSBhcyBgbWF4YCwKICAgICAgICBNSU4oYHZhcjVgKSBhcyBgbWluYCwKICAgICAgICBTVERFVihgdmFyNWApIGFzIGBkZXZgCkZST00gYHRhYmxlYAoKTEVGVCBKT0lOIGB0YWJsZTJgIE9OIGB2YXIyYCA9IGB2YXJpYWJsZWAKCk9SREVSIEJZIGB2YXIzYCBERVNDCkdST1VQIEJZIGBncm91cHZhcmAKCkxJTUlUIDAsMzA7Cgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogInRleHQveC1teXNxbCIsCiAgICAgICAgdGFiTW9kZTogImluZGVudCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LW15c3FsPC9jb2RlPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/mysql/mysql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICoJTXlTUUwgTW9kZSBmb3IgQ29kZU1pcnJvciAyIGJ5IE15U1FMLVRvb2xzCiAqCUBhdXRob3IgSmFtZXMgVGhvcm5lIChwYXJ0eWRyb2lkKQogKglAbGluayAJaHR0cDovL2dpdGh1Yi5jb20vcGFydHlkcm9pZC9NeVNRTC1Ub29scwogKiAJQGxpbmsgCWh0dHA6Ly9teXNxbHRvb2xzLm9yZwogKglAdmVyc2lvbiAwMi9KYW4vMjAxMgoqLwpDb2RlTWlycm9yLmRlZmluZU1vZGUoIm15c3FsIiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9CiAgdmFyIG9wcyA9IHdvcmRSZWdleHAoWyJzdHIiLCAibGFuZyIsICJsYW5nbWF0Y2hlcyIsICJkYXRhdHlwZSIsICJib3VuZCIsICJzYW1ldGVybSIsICJpc2lyaSIsICJpc3VyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpc2JsYW5rIiwgImlzbGl0ZXJhbCIsICJ1bmlvbiIsICJhIl0pOwogIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoWwogICgnQUNDRVNTSUJMRScpLCgnQUxURVInKSwoJ0FTJyksKCdCRUZPUkUnKSwoJ0JJTkFSWScpLCgnQlknKSwoJ0NBU0UnKSwoJ0NIQVJBQ1RFUicpLCgnQ09MVU1OJyksKCdDT05USU5VRScpLCgnQ1JPU1MnKSwoJ0NVUlJFTlRfVElNRVNUQU1QJyksKCdEQVRBQkFTRScpLCgnREFZX01JQ1JPU0VDT05EJyksKCdERUMnKSwoJ0RFRkFVTFQnKSwKCSgnREVTQycpLCgnRElTVElOQ1QnKSwoJ0RPVUJMRScpLCgnRUFDSCcpLCgnRU5DTE9TRUQnKSwoJ0VYSVQnKSwoJ0ZFVENIJyksKCdGTE9BVDgnKSwoJ0ZPUkVJR04nKSwoJ0dSQU5UJyksKCdISUdIX1BSSU9SSVRZJyksKCdIT1VSX1NFQ09ORCcpLCgnSU4nKSwoJ0lOTkVSJyksKCdJTlNFUlQnKSwoJ0lOVDInKSwoJ0lOVDgnKSwKCSgnSU5UTycpLCgnSk9JTicpLCgnS0lMTCcpLCgnTEVGVCcpLCgnTElORUFSJyksKCdMT0NBTFRJTUUnKSwoJ0xPTkcnKSwoJ0xPT1AnKSwoJ01BVENIJyksKCdNRURJVU1URVhUJyksKCdNSU5VVEVfU0VDT05EJyksKCdOQVRVUkFMJyksKCdOVUxMJyksKCdPUFRJTUlaRScpLCgnT1InKSwoJ09VVEVSJyksKCdQUklNQVJZJyksCgkoJ1JBTkdFJyksKCdSRUFEX1dSSVRFJyksKCdSRUdFWFAnKSwoJ1JFUEVBVCcpLCgnUkVTVFJJQ1QnKSwoJ1JJR0hUJyksKCdTQ0hFTUFTJyksKCdTRU5TSVRJVkUnKSwoJ1NIT1cnKSwoJ1NQRUNJRklDJyksKCdTUUxTVEFURScpLCgnU1FMX0NBTENfRk9VTkRfUk9XUycpLCgnU1RBUlRJTkcnKSwoJ1RFUk1JTkFURUQnKSwKCSgnVElOWUlOVCcpLCgnVFJBSUxJTkcnKSwoJ1VORE8nKSwoJ1VOTE9DSycpLCgnVVNBR0UnKSwoJ1VUQ19EQVRFJyksKCdWQUxVRVMnKSwoJ1ZBUkNIQVJBQ1RFUicpLCgnV0hFUkUnKSwoJ1dSSVRFJyksKCdaRVJPRklMTCcpLCgnQUxMJyksKCdBTkQnKSwoJ0FTRU5TSVRJVkUnKSwoJ0JJR0lOVCcpLCgnQk9USCcpLCgnQ0FTQ0FERScpLAoJKCdDSEFSJyksKCdDT0xMQVRFJyksKCdDT05TVFJBSU5UJyksKCdDUkVBVEUnKSwoJ0NVUlJFTlRfVElNRScpLCgnQ1VSU09SJyksKCdEQVlfSE9VUicpLCgnREFZX1NFQ09ORCcpLCgnREVDTEFSRScpLCgnREVMRVRFJyksKCdERVRFUk1JTklTVElDJyksKCdESVYnKSwoJ0RVQUwnKSwoJ0VMU0VJRicpLCgnRVhJU1RTJyksKCdGQUxTRScpLAoJKCdGTE9BVDQnKSwoJ0ZPUkNFJyksKCdGVUxMVEVYVCcpLCgnSEFWSU5HJyksKCdIT1VSX01JTlVURScpLCgnSUdOT1JFJyksKCdJTkZJTEUnKSwoJ0lOU0VOU0lUSVZFJyksKCdJTlQxJyksKCdJTlQ0JyksKCdJTlRFUlZBTCcpLCgnSVRFUkFURScpLCgnS0VZUycpLCgnTEVBVkUnKSwoJ0xJTUlUJyksKCdMT0FEJyksKCdMT0NLJyksCgkoJ0xPTkdURVhUJyksKCdNQVNURVJfU1NMX1ZFUklGWV9TRVJWRVJfQ0VSVCcpLCgnTUVESVVNSU5UJyksKCdNSU5VVEVfTUlDUk9TRUNPTkQnKSwoJ01PRElGSUVTJyksKCdOT19XUklURV9UT19CSU5MT0cnKSwoJ09OJyksKCdPUFRJT05BTExZJyksKCdPVVQnKSwoJ1BSRUNJU0lPTicpLCgnUFVSR0UnKSwoJ1JFQURTJyksCgkoJ1JFRkVSRU5DRVMnKSwoJ1JFTkFNRScpLCgnUkVRVUlSRScpLCgnUkVWT0tFJyksKCdTQ0hFTUEnKSwoJ1NFTEVDVCcpLCgnU0VUJyksKCdTUEFUSUFMJyksKCdTUUxFWENFUFRJT04nKSwoJ1NRTF9CSUdfUkVTVUxUJyksKCdTU0wnKSwoJ1RBQkxFJyksKCdUSU5ZQkxPQicpLCgnVE8nKSwoJ1RSVUUnKSwoJ1VOSVFVRScpLAoJKCdVUERBVEUnKSwoJ1VTSU5HJyksKCdVVENfVElNRVNUQU1QJyksKCdWQVJDSEFSJyksKCdXSEVOJyksKCdXSVRIJyksKCdZRUFSX01PTlRIJyksKCdBREQnKSwoJ0FOQUxZWkUnKSwoJ0FTQycpLCgnQkVUV0VFTicpLCgnQkxPQicpLCgnQ0FMTCcpLCgnQ0hBTkdFJyksKCdDSEVDSycpLCgnQ09ORElUSU9OJyksKCdDT05WRVJUJyksCgkoJ0NVUlJFTlRfREFURScpLCgnQ1VSUkVOVF9VU0VSJyksKCdEQVRBQkFTRVMnKSwoJ0RBWV9NSU5VVEUnKSwoJ0RFQ0lNQUwnKSwoJ0RFTEFZRUQnKSwoJ0RFU0NSSUJFJyksKCdESVNUSU5DVFJPVycpLCgnRFJPUCcpLCgnRUxTRScpLCgnRVNDQVBFRCcpLCgnRVhQTEFJTicpLCgnRkxPQVQnKSwoJ0ZPUicpLCgnRlJPTScpLAoJKCdHUk9VUCcpLCgnSE9VUl9NSUNST1NFQ09ORCcpLCgnSUYnKSwoJ0lOREVYJyksKCdJTk9VVCcpLCgnSU5UJyksKCdJTlQzJyksKCdJTlRFR0VSJyksKCdJUycpLCgnS0VZJyksKCdMRUFESU5HJyksKCdMSUtFJyksKCdMSU5FUycpLCgnTE9DQUxUSU1FU1RBTVAnKSwoJ0xPTkdCTE9CJyksKCdMT1dfUFJJT1JJVFknKSwKCSgnTUVESVVNQkxPQicpLCgnTUlERExFSU5UJyksKCdNT0QnKSwoJ05PVCcpLCgnTlVNRVJJQycpLCgnT1BUSU9OJyksKCdPUkRFUicpLCgnT1VURklMRScpLCgnUFJPQ0VEVVJFJyksKCdSRUFEJyksKCdSRUFMJyksKCdSRUxFQVNFJyksKCdSRVBMQUNFJyksKCdSRVRVUk4nKSwoJ1JMSUtFJyksKCdTRUNPTkRfTUlDUk9TRUNPTkQnKSwKCSgnU0VQQVJBVE9SJyksKCdTTUFMTElOVCcpLCgnU1FMJyksKCdTUUxXQVJOSU5HJyksKCdTUUxfU01BTExfUkVTVUxUJyksKCdTVFJBSUdIVF9KT0lOJyksKCdUSEVOJyksKCdUSU5ZVEVYVCcpLCgnVFJJR0dFUicpLCgnVU5JT04nKSwoJ1VOU0lHTkVEJyksKCdVU0UnKSwoJ1VUQ19USU1FJyksKCdWQVJCSU5BUlknKSwoJ1ZBUllJTkcnKSwKCSgnV0hJTEUnKSwoJ1hPUicpLCgnRlVMTCcpLCgnQ09MVU1OUycpLCgnTUlOJyksKCdNQVgnKSwoJ1NUREVWJyksKCdDT1VOVCcpCiAgXSk7CiAgdmFyIG9wZXJhdG9yQ2hhcnMgPSAvWyorXC08Pj0mfF0vOwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGN1clB1bmMgPSBudWxsOwogICAgaWYgKGNoID09ICIkIiB8fCBjaCA9PSAiPyIpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eW1x3XGRdKi8pOwogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIjwiICYmICFzdHJlYW0ubWF0Y2goL15bXHNcdTAwYTA9XS8sIGZhbHNlKSkgewogICAgICBzdHJlYW0ubWF0Y2goL15bXlxzXHUwMGEwPl0qPj8vKTsKICAgICAgcmV0dXJuICJhdG9tIjsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5MaXRlcmFsKGNoKTsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gImAiKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5PcExpdGVyYWwoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmICgvW3t9XChcKSxcLjtcW1xdXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICItIiAmJiBzdHJlYW0uZWF0KCItIikpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIi8iICYmIHN0cmVhbS5lYXQoIioiKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ29tbWVudDsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZWxzZSBpZiAob3BlcmF0b3JDaGFycy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUob3BlcmF0b3JDaGFycyk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIjoiKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XGRcLl9cLV0vKTsKICAgICAgcmV0dXJuICJhdG9tIjsKICAgIH0KICAgIGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tfXHdcZF0vKTsKICAgICAgaWYgKHN0cmVhbS5lYXQoIjoiKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XGRfXC1dLyk7CiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgfQogICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIGlmIChvcHMudGVzdCh3b3JkKSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlbkxpdGVyYWwocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgIH0KICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuT3BMaXRlcmFsKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CiAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIGZvciAoOzspIHsKICAgICAgaWYgKHN0cmVhbS5za2lwVG8oIioiKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCgogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCB0eXBlLCBjb2wpIHsKICAgIHN0YXRlLmNvbnRleHQgPSB7cHJldjogc3RhdGUuY29udGV4dCwgaW5kZW50OiBzdGF0ZS5pbmRlbnQsIGNvbDogY29sLCB0eXBlOiB0eXBlfTsKICB9CiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgc3RhdGUuaW5kZW50ID0gc3RhdGUuY29udGV4dC5pbmRlbnQ7CiAgICBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgY29udGV4dDogbnVsbCwKICAgICAgICAgICAgICBpbmRlbnQ6IDAsCiAgICAgICAgICAgICAgY29sOiAwfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQuYWxpZ24gPT0gbnVsbCkgc3RhdGUuY29udGV4dC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwoKICAgICAgaWYgKHN0eWxlICE9ICJjb21tZW50IiAmJiBzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQuYWxpZ24gPT0gbnVsbCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgIT0gInBhdHRlcm4iKSB7CiAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsICIpIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCAiXSIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gInsiKSBwdXNoQ29udGV4dChzdGF0ZSwgIn0iLCBzdHJlYW0uY29sdW1uKCkpOwogICAgICBlbHNlIGlmICgvW1xdXH1cKV0vLnRlc3QoY3VyUHVuYykpIHsKICAgICAgICB3aGlsZSAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBjdXJQdW5jID09IHN0YXRlLmNvbnRleHQudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiLiIgJiYgc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoL2F0b218c3RyaW5nfHZhcmlhYmxlLy50ZXN0KHN0eWxlKSAmJiBzdGF0ZS5jb250ZXh0KSB7CiAgICAgICAgaWYgKC9bXH1cXV0vLnRlc3Qoc3RhdGUuY29udGV4dC50eXBlKSkKICAgICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCAicGF0dGVybiIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgZWxzZSBpZiAoc3RhdGUuY29udGV4dC50eXBlID09ICJwYXR0ZXJuIiAmJiAhc3RhdGUuY29udGV4dC5hbGlnbikgewogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5jb250ZXh0LmNvbCA9IHN0cmVhbS5jb2x1bW4oKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoL1tcXVx9XS8udGVzdChmaXJzdENoYXIpKQogICAgICAgIHdoaWxlIChjb250ZXh0ICYmIGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CgogICAgICB2YXIgY2xvc2luZyA9IGNvbnRleHQgJiYgZmlyc3RDaGFyID09IGNvbnRleHQudHlwZTsKICAgICAgaWYgKCFjb250ZXh0KQogICAgICAgIHJldHVybiAwOwogICAgICBlbHNlIGlmIChjb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbDsKICAgICAgZWxzZSBpZiAoY29udGV4dC5hbGlnbikKICAgICAgICByZXR1cm4gY29udGV4dC5jb2wgKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBjb250ZXh0LmluZGVudCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbXlzcWwiLCAibXlzcWwiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/ntriples/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/ntriples/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IE5UcmlwbGVzIG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJudHJpcGxlcy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4gICAKICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogTlRyaXBsZXMgbW9kZTwvaDE+Cjxmb3JtPgo8dGV4dGFyZWEgaWQ9Im50cmlwbGVzIiBuYW1lPSJudHJpcGxlcyI+ICAgIAo8aHR0cDovL1N1YjE+ICAgICA8aHR0cDovL3ByZWQxPiAgICAgPGh0dHA6Ly9vYmo+IC4KPGh0dHA6Ly9TdWIyPiAgICAgPGh0dHA6Ly9wcmVkMiNhbjI+ICJsaXRlcmFsIDEiIC4KPGh0dHA6Ly9TdWIzI2FuMz4gPGh0dHA6Ly9wcmVkMz4gICAgIF86Ym5vZGUzIC4KXzpibm9kZTQgICAgICAgICAgPGh0dHA6Ly9wcmVkND4gICAgICJsaXRlcmFsIDIiQGxhbmcgLgpfOmJub2RlNSAgICAgICAgICA8aHR0cDovL3ByZWQ1PiAgICAgImxpdGVyYWwgMyJeXjxodHRwOi8vdHlwZT4gLgo8L3RleHRhcmVhPgo8L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJudHJpcGxlcyIpLCB7fSk7CiAgICA8L3NjcmlwdD4KICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L24tdHJpcGxlczwvY29kZT4uPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/ntriples/ntriples.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBUaGlzIHNjcmlwdCBwcm92aWRlcyBzeW50YXggaGlnaGxpZ2h0aW5nIHN1cHBvcnQgZm9yIAoqIHRoZSBOdHJpcGxlcyBmb3JtYXQuCiogTnRyaXBsZXMgZm9ybWF0IHNwZWNpZmljYXRpb246IAoqICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9yZGYtdGVzdGNhc2VzLyNudHJpcGxlcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIAogICAgVGhlIGZvbGxvd2luZyBleHByZXNzaW9uIGRlZmluZXMgdGhlIGRlZmluZWQgQVNGIGdyYW1tYXIgdHJhbnNpdGlvbnMuCgogICAgcHJlX3N1YmplY3QgLT4KICAgICAgICB7CiAgICAgICAgKCB3cml0aW5nX3N1YmplY3RfdXJpIHwgd3JpdGluZ19ibm9kZV91cmkgKQogICAgICAgICAgICAtPiBwcmVfcHJlZGljYXRlIAogICAgICAgICAgICAgICAgLT4gd3JpdGluZ19wcmVkaWNhdGVfdXJpIAogICAgICAgICAgICAgICAgICAgIC0+IHByZV9vYmplY3QgCiAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdyaXRpbmdfb2JqZWN0X3VyaSB8IHdyaXRpbmdfb2JqZWN0X2Jub2RlIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmdfb2JqZWN0X2xpdGVyYWwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd3JpdGluZ19saXRlcmFsX2xhbmcgfCB3cml0aW5nX2xpdGVyYWxfdHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHBvc3Rfb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gQkVHSU4KICAgICAgICAgfSBvdGhlcndpc2UgewogICAgICAgICAgICAgLT4gRVJST1IKICAgICAgICAgfQoqLwpDb2RlTWlycm9yLmRlZmluZU1vZGUoIm50cmlwbGVzIiwgZnVuY3Rpb24oKSB7ICAKCiAgdmFyIExvY2F0aW9uID0gewogICAgUFJFX1NVQkpFQ1QgICAgICAgICA6IDAsCiAgICBXUklUSU5HX1NVQl9VUkkgICAgIDogMSwKICAgIFdSSVRJTkdfQk5PREVfVVJJICAgOiAyLAogICAgUFJFX1BSRUQgICAgICAgICAgICA6IDMsCiAgICBXUklUSU5HX1BSRURfVVJJICAgIDogNCwKICAgIFBSRV9PQkogICAgICAgICAgICAgOiA1LAogICAgV1JJVElOR19PQkpfVVJJICAgICA6IDYsCiAgICBXUklUSU5HX09CSl9CTk9ERSAgIDogNywKICAgIFdSSVRJTkdfT0JKX0xJVEVSQUwgOiA4LAogICAgV1JJVElOR19MSVRfTEFORyAgICA6IDksCiAgICBXUklUSU5HX0xJVF9UWVBFICAgIDogMTAsCiAgICBQT1NUX09CSiAgICAgICAgICAgIDogMTEsCiAgICBFUlJPUiAgICAgICAgICAgICAgIDogMTIKICB9OwogIGZ1bmN0aW9uIHRyYW5zaXRTdGF0ZShjdXJyU3RhdGUsIGMpIHsKICAgIHZhciBjdXJyTG9jYXRpb24gPSBjdXJyU3RhdGUubG9jYXRpb247CiAgICB2YXIgcmV0OwogICAgCiAgICAvLyBPcGVuaW5nLgogICAgaWYgICAgIChjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uUFJFX1NVQkpFQ1QgJiYgYyA9PSAnPCcpIHJldCA9IExvY2F0aW9uLldSSVRJTkdfU1VCX1VSSTsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9TVUJKRUNUICYmIGMgPT0gJ18nKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX0JOT0RFX1VSSTsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9QUkVEICAgICYmIGMgPT0gJzwnKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX1BSRURfVVJJOwogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uUFJFX09CSiAgICAgJiYgYyA9PSAnPCcpIHJldCA9IExvY2F0aW9uLldSSVRJTkdfT0JKX1VSSTsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9PQkogICAgICYmIGMgPT0gJ18nKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX09CSl9CTk9ERTsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9PQkogICAgICYmIGMgPT0gJyInKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX09CSl9MSVRFUkFMOwogICAgCiAgICAvLyBDbG9zaW5nLgogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uV1JJVElOR19TVUJfVVJJICAgICAmJiBjID09ICc+JykgcmV0ID0gTG9jYXRpb24uUFJFX1BSRUQ7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX0JOT0RFX1VSSSAgICYmIGMgPT0gJyAnKSByZXQgPSBMb2NhdGlvbi5QUkVfUFJFRDsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfUFJFRF9VUkkgICAgJiYgYyA9PSAnPicpIHJldCA9IExvY2F0aW9uLlBSRV9PQko7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX09CSl9VUkkgICAgICYmIGMgPT0gJz4nKSByZXQgPSBMb2NhdGlvbi5QT1NUX09CSjsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfT0JKX0JOT0RFICAgJiYgYyA9PSAnICcpIHJldCA9IExvY2F0aW9uLlBPU1RfT0JKOwogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uV1JJVElOR19PQkpfTElURVJBTCAmJiBjID09ICciJykgcmV0ID0gTG9jYXRpb24uUE9TVF9PQko7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX0xJVF9MQU5HICYmIGMgPT0gJyAnKSByZXQgPSBMb2NhdGlvbi5QT1NUX09CSjsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfTElUX1RZUEUgJiYgYyA9PSAnPicpIHJldCA9IExvY2F0aW9uLlBPU1RfT0JKOwogICAgCiAgICAvLyBDbG9zaW5nIHR5cGVkIGFuZCBsYW5ndWFnZSBsaXRlcmFsLgogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uV1JJVElOR19PQkpfTElURVJBTCAmJiBjID09ICdAJykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19MSVRfTEFORzsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfT0JKX0xJVEVSQUwgJiYgYyA9PSAnXicpIHJldCA9IExvY2F0aW9uLldSSVRJTkdfTElUX1RZUEU7CgogICAgLy8gU3BhY2VzLgogICAgZWxzZSBpZiggYyA9PSAnICcgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgKAogICAgICAgICAgICAgICBjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uUFJFX1NVQkpFQ1QgfHwgCiAgICAgICAgICAgICAgIGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfUFJFRCAgICB8fCAKICAgICAgICAgICAgICAgY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9PQkogICAgIHx8IAogICAgICAgICAgICAgICBjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uUE9TVF9PQkoKICAgICAgICAgICAgICkKICAgICAgICAgICApIHJldCA9IGN1cnJMb2NhdGlvbjsKICAgIAogICAgLy8gUmVzZXQuCiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QT1NUX09CSiAmJiBjID09ICcuJykgcmV0ID0gTG9jYXRpb24uUFJFX1NVQkpFQ1Q7ICAgIAogICAgCiAgICAvLyBFcnJvcgogICAgZWxzZSByZXQgPSBMb2NhdGlvbi5FUlJPUjsKICAgIAogICAgY3VyclN0YXRlLmxvY2F0aW9uPXJldDsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgIHJldHVybiB7IAogICAgICAgICAgIGxvY2F0aW9uIDogTG9jYXRpb24uUFJFX1NVQkpFQ1QsCiAgICAgICAgICAgdXJpcyAgICAgOiBbXSwKICAgICAgICAgICBhbmNob3JzICA6IFtdLAogICAgICAgICAgIGJub2RlcyAgIDogW10sCiAgICAgICAgICAgbGFuZ3MgICAgOiBbXSwKICAgICAgICAgICB0eXBlcyAgICA6IFtdCiAgICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmKGNoID09ICc8JykgewogICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsIGNoKTsKICAgICAgICAgdmFyIHBhcnNlZFVSSSA9ICcnOwogICAgICAgICBzdHJlYW0uZWF0V2hpbGUoIGZ1bmN0aW9uKGMpIHsgaWYoIGMgIT0gJyMnICYmIGMgIT0gJz4nICkgeyBwYXJzZWRVUkkgKz0gYzsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlO30gKTsKICAgICAgICAgc3RhdGUudXJpcy5wdXNoKHBhcnNlZFVSSSk7CiAgICAgICAgIGlmKCBzdHJlYW0ubWF0Y2goJyMnLCBmYWxzZSkgKSByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCAnPicpOwogICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgfQogICAgICBpZihjaCA9PSAnIycpIHsKICAgICAgICB2YXIgcGFyc2VkQW5jaG9yID0gJyc7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGZ1bmN0aW9uKGMpIHsgaWYoYyAhPSAnPicgJiYgYyAhPSAnICcpIHsgcGFyc2VkQW5jaG9yKz0gYzsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlO30pOwogICAgICAgIHN0YXRlLmFuY2hvcnMucHVzaChwYXJzZWRBbmNob3IpOwogICAgICAgIHJldHVybiAndmFyaWFibGUtMic7CiAgICAgIH0KICAgICAgaWYoY2ggPT0gJz4nKSB7CiAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsICc+Jyk7CiAgICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgfQogICAgICBpZihjaCA9PSAnXycpIHsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgY2gpOwogICAgICAgICAgdmFyIHBhcnNlZEJOb2RlID0gJyc7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoZnVuY3Rpb24oYykgeyBpZiggYyAhPSAnICcgKSB7IHBhcnNlZEJOb2RlICs9IGM7IHJldHVybiB0cnVlOyB9IHJldHVybiBmYWxzZTt9KTsKICAgICAgICAgIHN0YXRlLmJub2Rlcy5wdXNoKHBhcnNlZEJOb2RlKTsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsICcgJyk7CiAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgICB9CiAgICAgIGlmKGNoID09ICciJykgewogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCBjaCk7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoIGZ1bmN0aW9uKGMpIHsgcmV0dXJuIGMgIT0gJyInOyB9ICk7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgaWYoIHN0cmVhbS5wZWVrKCkgIT0gJ0AnICYmIHN0cmVhbS5wZWVrKCkgIT0gJ14nICkgewogICAgICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgJyInKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAnc3RyaW5nJzsKICAgICAgfQogICAgICBpZiggY2ggPT0gJ0AnICkgewogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCAnQCcpOwogICAgICAgICAgdmFyIHBhcnNlZExhbmcgPSAnJzsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShmdW5jdGlvbihjKSB7IGlmKCBjICE9ICcgJyApIHsgcGFyc2VkTGFuZyArPSBjOyByZXR1cm4gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7fSk7CiAgICAgICAgICBzdGF0ZS5sYW5ncy5wdXNoKHBhcnNlZExhbmcpOwogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgJyAnKTsKICAgICAgICAgIHJldHVybiAnc3RyaW5nLTInOwogICAgICB9CiAgICAgIGlmKCBjaCA9PSAnXicgKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCAnXicpOwogICAgICAgICAgdmFyIHBhcnNlZFR5cGUgPSAnJzsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShmdW5jdGlvbihjKSB7IGlmKCBjICE9ICc+JyApIHsgcGFyc2VkVHlwZSArPSBjOyByZXR1cm4gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7fSApOwogICAgICAgICAgc3RhdGUudHlwZXMucHVzaChwYXJzZWRUeXBlKTsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsICc+Jyk7CiAgICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgfQogICAgICBpZiggY2ggPT0gJyAnICkgewogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCBjaCk7CiAgICAgIH0KICAgICAgaWYoIGNoID09ICcuJyApIHsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgY2gpOwogICAgICB9CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvbi10cmlwbGVzIiwgIm50cmlwbGVzIik7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/ocaml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/ocaml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxtZXRhIGNoYXJzZXQ9dXRmLTg+Cjx0aXRsZT5Db2RlTWlycm9yOiBPQ2FtbCBtb2RlPC90aXRsZT4KCjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Li4vLi4vbGliL2NvZGVtaXJyb3IuY3NzPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPS4uLy4uL2RvYy9kb2NzLmNzcz4KCjxzdHlsZSB0eXBlPXRleHQvY3NzPgogIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9Cjwvc3R5bGU+Cgo8c2NyaXB0IHNyYz0uLi8uLi9saWIvY29kZW1pcnJvci5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Li4vLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9b2NhbWwuanM+PC9zY3JpcHQ+Cgo8aDE+Q29kZU1pcnJvcjogT0NhbWwgbW9kZTwvaDE+Cgo8dGV4dGFyZWEgaWQ9Y29kZT4KKCogU3VtbWluZyBhIGxpc3Qgb2YgaW50ZWdlcnMgKikKbGV0IHJlYyBzdW0geHMgPQogIG1hdGNoIHhzIHdpdGgKICAgIHwgW10gICAgICAgLSZndDsgMAogICAgfCB4IDo6IHhzJyAtJmd0OyB4ICsgc3VtIHhzJwoKKCogUXVpY2tzb3J0ICopCmxldCByZWMgcXNvcnQgPSBmdW5jdGlvbgogICB8IFtdIC0mZ3Q7IFtdCiAgIHwgcGl2b3QgOjogcmVzdCAtJmd0OwogICAgICAgbGV0IGlzX2xlc3MgeCA9IHggJmx0OyBwaXZvdCBpbgogICAgICAgbGV0IGxlZnQsIHJpZ2h0ID0gTGlzdC5wYXJ0aXRpb24gaXNfbGVzcyByZXN0IGluCiAgICAgICBxc29ydCBsZWZ0IEAgW3Bpdm90XSBAIHFzb3J0IHJpZ2h0CgooKiBGaWJvbmFjY2kgU2VxdWVuY2UgKikKbGV0IHJlYyBmaWJfYXV4IG4gYSBiID0KICBtYXRjaCBuIHdpdGgKICB8IDAgLSZndDsgYQogIHwgXyAtJmd0OyBmaWJfYXV4IChuIC0gMSkgKGEgKyBiKSBhCmxldCBmaWIgbiA9IGZpYl9hdXggbiAwIDEKCigqIEJpcnRoZGF5IHBhcmFkb3ggKikKbGV0IHllYXJfc2l6ZSA9IDM2NS4KCmxldCByZWMgYmlydGhkYXlfcGFyYWRveCBwcm9iIHBlb3BsZSA9CiAgICBsZXQgcHJvYicgPSAoeWVhcl9zaXplIC0uIGZsb2F0IHBlb3BsZSkgLy4geWVhcl9zaXplICouIHByb2IgIGluCiAgICBpZiBwcm9iJyAmbHQ7IDAuNSB0aGVuCiAgICAgICAgUHJpbnRmLnByaW50ZiAiYW5zd2VyID0gJWRcbiIgKHBlb3BsZSsxKQogICAgZWxzZQogICAgICAgIGJpcnRoZGF5X3BhcmFkb3ggcHJvYicgKHBlb3BsZSsxKSA7OwoKYmlydGhkYXlfcGFyYWRveCAxLjAgMQoKKCogQ2h1cmNoIG51bWVyYWxzICopCmxldCB6ZXJvIGYgeCA9IHgKbGV0IHN1Y2MgbiBmIHggPSBmIChuIGYgeCkKbGV0IG9uZSA9IHN1Y2MgemVybwpsZXQgdHdvID0gc3VjYyAoc3VjYyB6ZXJvKQpsZXQgYWRkIG4xIG4yIGYgeCA9IG4xIGYgKG4yIGYgeCkKbGV0IHRvX3N0cmluZyBuID0gbiAoZnVuIGsgLSZndDsgIlMiIF4gaykgIjAiCmxldCBfID0gdG9fc3RyaW5nIChhZGQgKHN1Y2MgdHdvKSB0d28pCgooKiBFbGVtZW50YXJ5IGZ1bmN0aW9ucyAqKQpsZXQgc3F1YXJlIHggPSB4ICogeDs7CmxldCByZWMgZmFjdCB4ID0KICBpZiB4ICZsdDs9IDEgdGhlbiAxIGVsc2UgeCAqIGZhY3QgKHggLSAxKTs7CgooKiBBdXRvbWF0aWMgbWVtb3J5IG1hbmFnZW1lbnQgKikKbGV0IGwgPSAxIDo6IDIgOjogMyA6OiBbXTs7ClsxOyAyOyAzXTs7CjUgOjogbDs7CgooKiBQb2x5bW9ycGhpc206IHNvcnRpbmcgbGlzdHMgKikKbGV0IHJlYyBzb3J0ID0gZnVuY3Rpb24KICB8IFtdIC0mZ3Q7IFtdCiAgfCB4IDo6IGwgLSZndDsgaW5zZXJ0IHggKHNvcnQgbCkKCmFuZCBpbnNlcnQgZWxlbSA9IGZ1bmN0aW9uCiAgfCBbXSAtJmd0OyBbZWxlbV0KICB8IHggOjogbCAtJmd0OyAKICAgICAgaWYgZWxlbSAmbHQ7IHggdGhlbiBlbGVtIDo6IHggOjogbCBlbHNlIHggOjogaW5zZXJ0IGVsZW0gbDs7CgooKiBJbXBlcmF0aXZlIGZlYXR1cmVzICopCmxldCBhZGRfcG9seW5vbSBwMSBwMiA9CiAgbGV0IG4xID0gQXJyYXkubGVuZ3RoIHAxCiAgYW5kIG4yID0gQXJyYXkubGVuZ3RoIHAyIGluCiAgbGV0IHJlc3VsdCA9IEFycmF5LmNyZWF0ZSAobWF4IG4xIG4yKSAwIGluCiAgZm9yIGkgPSAwIHRvIG4xIC0gMSBkbyByZXN1bHQuKGkpICZsdDstIHAxLihpKSBkb25lOwogIGZvciBpID0gMCB0byBuMiAtIDEgZG8gcmVzdWx0LihpKSAmbHQ7LSByZXN1bHQuKGkpICsgcDIuKGkpIGRvbmU7CiAgcmVzdWx0OzsKYWRkX3BvbHlub20gW3wgMTsgMiB8XSBbfCAxOyAyOyAzIHxdOzsKCigqIFdlIG1heSByZWRlZmluZSBmYWN0IHVzaW5nIGEgcmVmZXJlbmNlIGNlbGwgYW5kIGEgZm9yIGxvb3AgKikKbGV0IGZhY3QgbiA9CiAgbGV0IHJlc3VsdCA9IHJlZiAxIGluCiAgZm9yIGkgPSAyIHRvIG4gZG8KICAgIHJlc3VsdCA6PSBpICogIXJlc3VsdAogICBkb25lOwogICAhcmVzdWx0OzsKZmFjdCA1OzsKCigqIFRyaWFuZ2xlIChncmFwaGljcykgKikKbGV0ICgpID0KICBpZ25vcmUoIEdsdXQuaW5pdCBTeXMuYXJndiApOwogIEdsdXQuaW5pdERpc3BsYXlNb2RlIH5kb3VibGVfYnVmZmVyOnRydWUgKCk7CiAgaWdub3JlIChHbHV0LmNyZWF0ZVdpbmRvdyB+dGl0bGU6Ik9wZW5HTCBEZW1vIik7CiAgbGV0IGFuZ2xlIHQgPSAxMC4gKi4gdCAqLiB0IGluCiAgbGV0IHJlbmRlciAoKSA9CiAgICBHbENsZWFyLmNsZWFyIFsgYGNvbG9yIF07CiAgICBHbE1hdC5sb2FkX2lkZW50aXR5ICgpOwogICAgR2xNYXQucm90YXRlIH5hbmdsZTogKGFuZ2xlIChTeXMudGltZSAoKSkpIH56OjEuICgpOwogICAgR2xEcmF3LmJlZ2lucyBgdHJpYW5nbGVzOwogICAgTGlzdC5pdGVyIEdsRHJhdy52ZXJ0ZXgyIFstMS4sIC0xLjsgMC4sIDEuOyAxLiwgLTEuXTsKICAgIEdsRHJhdy5lbmRzICgpOwogICAgR2x1dC5zd2FwQnVmZmVycyAoKSBpbgogIEdsTWF0Lm1vZGUgYG1vZGVsdmlldzsKICBHbHV0LmRpc3BsYXlGdW5jIH5jYjpyZW5kZXI7CiAgR2x1dC5pZGxlRnVuYyB+Y2I6KFNvbWUgR2x1dC5wb3N0UmVkaXNwbGF5KTsKICBHbHV0Lm1haW5Mb29wICgpCgooKiBBIEh1bmRyZWQgTGluZXMgb2YgQ2FtbCAtIGh0dHA6Ly9jYW1sLmlucmlhLmZyL2Fib3V0L3Rhc3RlLmVuLmh0bWwgKikKKCogT0NhbWwgcGFnZSBvbiBXaWtpcGVkaWEgLSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09DYW1sICopCjwvdGV4dGFyZWE+Cgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpLCB7CiAgICBtb2RlOiAnb2NhbWwnLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgfSk7Cjwvc2NyaXB0PgoKPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1vY2FtbDwvY29kZT4uPC9wPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/ocaml/ocaml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCdvY2FtbCcsIGZ1bmN0aW9uKCkgewoKICB2YXIgd29yZHMgPSB7CiAgICAndHJ1ZSc6ICdhdG9tJywKICAgICdmYWxzZSc6ICdhdG9tJywKICAgICdsZXQnOiAna2V5d29yZCcsCiAgICAncmVjJzogJ2tleXdvcmQnLAogICAgJ2luJzogJ2tleXdvcmQnLAogICAgJ29mJzogJ2tleXdvcmQnLAogICAgJ2FuZCc6ICdrZXl3b3JkJywKICAgICdzdWNjJzogJ2tleXdvcmQnLAogICAgJ2lmJzogJ2tleXdvcmQnLAogICAgJ3RoZW4nOiAna2V5d29yZCcsCiAgICAnZWxzZSc6ICdrZXl3b3JkJywKICAgICdmb3InOiAna2V5d29yZCcsCiAgICAndG8nOiAna2V5d29yZCcsCiAgICAnd2hpbGUnOiAna2V5d29yZCcsCiAgICAnZG8nOiAna2V5d29yZCcsCiAgICAnZG9uZSc6ICdrZXl3b3JkJywKICAgICdmdW4nOiAna2V5d29yZCcsCiAgICAnZnVuY3Rpb24nOiAna2V5d29yZCcsCiAgICAndmFsJzogJ2tleXdvcmQnLAogICAgJ3R5cGUnOiAna2V5d29yZCcsCiAgICAnbXV0YWJsZSc6ICdrZXl3b3JkJywKICAgICdtYXRjaCc6ICdrZXl3b3JkJywKICAgICd3aXRoJzogJ2tleXdvcmQnLAogICAgJ3RyeSc6ICdrZXl3b3JkJywKICAgICdyYWlzZSc6ICdrZXl3b3JkJywKICAgICdiZWdpbic6ICdrZXl3b3JkJywKICAgICdlbmQnOiAna2V5d29yZCcsCiAgICAnb3Blbic6ICdidWlsdGluJywKICAgICd0cmFjZSc6ICdidWlsdGluJywKICAgICdpZ25vcmUnOiAnYnVpbHRpbicsCiAgICAnZXhpdCc6ICdidWlsdGluJywKICAgICdwcmludF9zdHJpbmcnOiAnYnVpbHRpbicsCiAgICAncHJpbnRfZW5kbGluZSc6ICdidWlsdGluJwogIH07CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChjaCA9PT0gJyInKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmc7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmIChjaCA9PT0gJygnKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCcqJykpIHsKICAgICAgICBzdGF0ZS5jb21tZW50TGV2ZWwrKzsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ29tbWVudDsKICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjaCA9PT0gJ34nKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgICAgcmV0dXJuICd2YXJpYWJsZS0yJzsKICAgIH0KICAgIGlmIChjaCA9PT0gJ2AnKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgICAgcmV0dXJuICdxdW90ZSc7CiAgICB9CiAgICBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcZF0vKTsKICAgICAgaWYgKHN0cmVhbS5lYXQoJy4nKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xkXS8pOwogICAgICB9CiAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgIH0KICAgIGlmICggL1srXC0qJiU9PD4hP3xdLy50ZXN0KGNoKSkgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgcmV0dXJuIHdvcmRzW2N1cl0gfHwgJ3ZhcmlhYmxlJzsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBuZXh0LCBlbmQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwogICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAobmV4dCA9PT0gJyInICYmICFlc2NhcGVkKSB7CiAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PT0gJ1xcJzsKICAgIH0KICAgIGlmIChlbmQgJiYgIWVzY2FwZWQpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICB9CiAgICByZXR1cm4gJ3N0cmluZyc7CiAgfTsKCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBwcmV2LCBuZXh0OwogICAgd2hpbGUoc3RhdGUuY29tbWVudExldmVsID4gMCAmJiAobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKHByZXYgPT09ICcoJyAmJiBuZXh0ID09PSAnKicpIHN0YXRlLmNvbW1lbnRMZXZlbCsrOwogICAgICBpZiAocHJldiA9PT0gJyonICYmIG5leHQgPT09ICcpJykgc3RhdGUuY29tbWVudExldmVsLS07CiAgICAgIHByZXYgPSBuZXh0OwogICAgfQogICAgaWYgKHN0YXRlLmNvbW1lbnRMZXZlbCA8PSAwKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgfQogICAgcmV0dXJuICdjb21tZW50JzsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHtyZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsIGNvbW1lbnRMZXZlbDogMH07fSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9Owp9KTsKICAKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtb2NhbWwnLCAnb2NhbWwnKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/pascal/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/pascal/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBhc2NhbCBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0icGFzY2FsLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBQYXNjYWwgbW9kZTwvaDE+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CigqIEV4YW1wbGUgUGFzY2FsIGNvZGUgKikKCndoaWxlIGEgPD4gYiBkbyB3cml0ZWxuKCdXYWl0aW5nJyk7CiAKaWYgYSA+IGIgdGhlbiAKICB3cml0ZWxuKCdDb25kaXRpb24gbWV0JykKZWxzZSAKICB3cml0ZWxuKCdDb25kaXRpb24gbm90IG1ldCcpOwogCmZvciBpIDo9IDEgdG8gMTAgZG8gCiAgd3JpdGVsbignSXRlcmF0aW9uOiAnLCBpOjEpOwogCnJlcGVhdAogIGEgOj0gYSArIDEKdW50aWwgYSA9IDEwOwogCmNhc2UgaSBvZgogIDA6IHdyaXRlKCd6ZXJvJyk7CiAgMTogd3JpdGUoJ29uZScpOwogIDI6IHdyaXRlKCd0d28nKQplbmQ7CjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LXBhc2NhbCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXBhc2NhbDwvY29kZT4uPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/pascal/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDExIHNvdWNlTGFpciA8c3VwcG9ydEBzb3VyY2VsYWlyLmNvbT4KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/pascal/pascal.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJwYXNjYWwiLCBmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIGtleXdvcmRzID0gd29yZHMoImFuZCBhcnJheSBiZWdpbiBjYXNlIGNvbnN0IGRpdiBkbyBkb3dudG8gZWxzZSBlbmQgZmlsZSBmb3IgZm9yd2FyZCBpbnRlZ2VyICIgKwogICAgICAgICAgICAgICAgICAgICAgICJib29sZWFuIGNoYXIgZnVuY3Rpb24gZ290byBpZiBpbiBsYWJlbCBtb2QgbmlsIG5vdCBvZiBvciBwYWNrZWQgcHJvY2VkdXJlICIgKwogICAgICAgICAgICAgICAgICAgICAgICJwcm9ncmFtIHJlY29yZCByZXBlYXQgc2V0IHN0cmluZyB0aGVuIHRvIHR5cGUgdW50aWwgdmFyIHdoaWxlIHdpdGgiKTsKICB2YXIgYXRvbXMgPSB7Im51bGwiOiB0cnVlfTsKCiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hP3xcL10vOwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiIyIgJiYgc3RhdGUuc3RhcnRPZkxpbmUpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gIm1ldGEiOwogICAgfQogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmIChjaCA9PSAiKCIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKC9bXFtcXXt9XChcKSw7XDpcLl0vLnRlc3QoY2gpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJrZXl3b3JkIjsKICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImF0b20iOwogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIWVzY2FwZWQpIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiKSIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiBudWxsfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcGFzY2FsIiwgInBhc2NhbCIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/perl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/perl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBlcmwgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InBlcmwuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFBlcmwgbW9kZTwvaDE+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMhL3Vzci9iaW4vcGVybAoKdXNlIFNvbWV0aGluZyBxdyhmdW5jMSBmdW5jMik7CgojIHN0cmluZ3MKbXkgJHMxID0gcXEnc2luZ2xlIGxpbmUnOwpvdXIgJHMyID0gcShtdWx0aS0KICAgICAgICAgICAgICBsaW5lKTsKCj1pdGVtIFNvbWV0aGluZwoJRXhhbXBsZS4KPWN1dAoKbXkgJGh0bWw9PDwnSFRNTCcKPGh0bWw+Cjx0aXRsZT5oaSE8L3RpdGxlPgo8L2h0bWw+CkhUTUwKCnByaW50ICJmaXJzdCwiLmpvaW4oJywnLCAnc2Vjb25kJywgcXF+dGhpcmR+KTsKCmlmKCRzMSA9fiBtWyg/PCFccykobC5uZSlcel1vKSB7CgkkaC0+eyQxfT0kJC4nIHByZWRlZmluZWQgdmFyaWFibGVzJzsKCSRzMiA9fiBzL1wtbGluZS8vb3g7CgkkczEgPX4gc1sKCQkgIGxpbmUgXQoJCVsKCQkgIGJsb2NrCgkJXW94Owp9CgoxOyAjIG51bWJlcnMgYW5kIGNvbW1lbnRzCgpfX0VORF9fCnNvbWV0aGluZy4uLgoKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1wZXJsPC9jb2RlPi48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/perl/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChDKSAyMDExIGJ5IFNhYmFjYSA8bWFpbEBzYWJhY2EuY29tPiB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/perl/perl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvcjIgbW9kZS9wZXJsL3BlcmwuanMgKHRleHQveC1wZXJsKSBiZXRhIDAuMTAgKDIwMTEtMTEtMDgpCi8vIFRoaXMgaXMgYSBwYXJ0IG9mIENvZGVNaXJyb3IgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2FiYWNhL0NvZGVNaXJyb3JfbW9kZV9wZXJsIChtYWlsQHNhYmFjYS5jb20pCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgicGVybCIsZnVuY3Rpb24oKXsKCS8vIGh0dHA6Ly9wZXJsZG9jLnBlcmwub3JnCgl2YXIgUEVSTD17CQkJCSAgICAJLy8gICBudWxsIC0gbWFnaWMgdG91Y2gKCQkJCQkJCS8vICAgMSAtIGtleXdvcmQKCQkJCQkJCS8vICAgMiAtIGRlZgoJCQkJCQkJLy8gICAzIC0gYXRvbQoJCQkJCQkJLy8gICA0IC0gb3BlcmF0b3IKCQkJCQkJCS8vICAgNSAtIHZhcmlhYmxlLTIgKHByZWRlZmluZWQpCgkJCQkJCQkvLyAgIFt4LHldIC0geD0xLDIsMzsgeT1tdXN0IGJlIGRlZmluZWQgaWYgeHsuLi59CgkJCQkJCS8vCVBFUkwgb3BlcmF0b3JzCgkJJy0+JwkJCQk6ICAgNCwKCQknKysnCQkJCTogICA0LAoJCSctLScJCQkJOiAgIDQsCgkJJyoqJwkJCQk6ICAgNCwKCQkJCQkJCS8vICAgISB+IFwgYW5kIHVuYXJ5ICsgYW5kIC0KCQknPX4nCQkJCTogICA0LAoJCSchficJCQkJOiAgIDQsCgkJJyonCQkJCTogICA0LAoJCScvJwkJCQk6ICAgNCwKCQknJScJCQkJOiAgIDQsCgkJJ3gnCQkJCTogICA0LAoJCScrJwkJCQk6ICAgNCwKCQknLScJCQkJOiAgIDQsCgkJJy4nCQkJCTogICA0LAoJCSc8PCcJCQkJOiAgIDQsCgkJJz4+JwkJCQk6ICAgNCwKCQkJCQkJCS8vICAgbmFtZWQgdW5hcnkgb3BlcmF0b3JzCgkJJzwnCQkJCTogICA0LAoJCSc+JwkJCQk6ICAgNCwKCQknPD0nCQkJCTogICA0LAoJCSc+PScJCQkJOiAgIDQsCgkJJ2x0JwkJCQk6ICAgNCwKCQknZ3QnCQkJCTogICA0LAoJCSdsZScJCQkJOiAgIDQsCgkJJ2dlJwkJCQk6ICAgNCwKCQknPT0nCQkJCTogICA0LAoJCSchPScJCQkJOiAgIDQsCgkJJzw9PicJCQkJOiAgIDQsCgkJJ2VxJwkJCQk6ICAgNCwKCQknbmUnCQkJCTogICA0LAoJCSdjbXAnCQkJCTogICA0LAoJCSd+ficJCQkJOiAgIDQsCgkJJyYnCQkJCTogICA0LAoJCSd8JwkJCQk6ICAgNCwKCQknXicJCQkJOiAgIDQsCgkJJyYmJwkJCQk6ICAgNCwKCQknfHwnCQkJCTogICA0LAoJCScvLycJCQkJOiAgIDQsCgkJJy4uJwkJCQk6ICAgNCwKCQknLi4uJwkJCQk6ICAgNCwKCQknPycJCQkJOiAgIDQsCgkJJzonCQkJCTogICA0LAoJCSc9JwkJCQk6ICAgNCwKCQknKz0nCQkJCTogICA0LAoJCSctPScJCQkJOiAgIDQsCgkJJyo9JwkJCQk6ICAgNCwJLy8gICBldGMuID8/PwoJCScsJwkJCQk6ICAgNCwKCQknPT4nCQkJCTogICA0LAoJCSc6OicJCQkJOiAgIDQsCgkJCQkgICAJCQkvLyAgIGxpc3Qgb3BlcmF0b3JzIChyaWdodHdhcmQpCgkJJ25vdCcJCQkJOiAgIDQsCgkJJ2FuZCcJCQkJOiAgIDQsCgkJJ29yJwkJCQk6ICAgNCwKCQkneG9yJwkJCQk6ICAgNCwKCQkJCQkJLy8JUEVSTCBwcmVkZWZpbmVkIHZhcmlhYmxlcyAoSSBrbm93LCB3aGF0IHRoaXMgaXMgYSBwYXJhbm9pZCBpZGVhLCBidXQgbWF5IGJlIG5lZWRlZCBmb3IgcGVvcGxlLCB3aG8gbGVhcm4gUEVSTCwgYW5kIGZvciBtZSBhcyB3ZWxsLCAuLi5hbmQgbWF5IGJlIGZvciB5b3U/OykKCQknQkVHSU4nCQkJCTogICBbNSwxXSwKCQknRU5EJwkJCQk6ICAgWzUsMV0sCgkJJ1BSSU5UJwkJCQk6ICAgWzUsMV0sCgkJJ1BSSU5URicJCQk6ICAgWzUsMV0sCgkJJ0dFVEMnCQkJCTogICBbNSwxXSwKCQknUkVBRCcJCQkJOiAgIFs1LDFdLAoJCSdSRUFETElORScJCQk6ICAgWzUsMV0sCgkJJ0RFU1RST1knCQkJOiAgIFs1LDFdLAoJCSdUSUUnCQkJCTogICBbNSwxXSwKCQknVElFSEFORExFJwkJCTogICBbNSwxXSwKCQknVU5USUUnCQkJCTogICBbNSwxXSwKCQknU1RESU4nCQkJCTogICAgNSwKCQknU1RESU5fVE9QJwkJCTogICAgNSwKCQknU1RET1VUJwkJCTogICAgNSwKCQknU1RET1VUX1RPUCcJCQk6ICAgIDUsCgkJJ1NUREVSUicJCQk6ICAgIDUsCgkJJ1NUREVSUl9UT1AnCQkJOiAgICA1LAoJCSckQVJHJwkJCQk6ICAgIDUsCgkJJyRfJwkJCQk6ICAgIDUsCgkJJ0BBUkcnCQkJCTogICAgNSwKCQknQF8nCQkJCTogICAgNSwKCQknJExJU1RfU0VQQVJBVE9SJwkJOiAgICA1LAoJCSckIicJCQkJOiAgICA1LAoJCSckUFJPQ0VTU19JRCcJCQk6ICAgIDUsCgkJJyRQSUQnCQkJCTogICAgNSwKCQknJCQnCQkJCTogICAgNSwKCQknJFJFQUxfR1JPVVBfSUQnCQk6ICAgIDUsCgkJJyRHSUQnCQkJCTogICAgNSwKCQknJCgnCQkJCTogICAgNSwKCQknJEVGRkVDVElWRV9HUk9VUF9JRCcJCTogICAgNSwKCQknJEVHSUQnCQkJCTogICAgNSwKCQknJCknCQkJCTogICAgNSwKCQknJFBST0dSQU1fTkFNRScJCQk6ICAgIDUsCgkJJyQwJwkJCQk6ICAgIDUsCgkJJyRTVUJTQ1JJUFRfU0VQQVJBVE9SJwkJOiAgICA1LAoJCSckU1VCU0VQJwkJCTogICAgNSwKCQknJDsnCQkJCTogICAgNSwKCQknJFJFQUxfVVNFUl9JRCcJCQk6ICAgIDUsCgkJJyRVSUQnCQkJCTogICAgNSwKCQknJDwnCQkJCTogICAgNSwKCQknJEVGRkVDVElWRV9VU0VSX0lEJwkJOiAgICA1LAoJCSckRVVJRCcJCQkJOiAgICA1LAoJCSckPicJCQkJOiAgICA1LAoJCSckYScJCQkJOiAgICA1LAoJCSckYicJCQkJOiAgICA1LAoJCSckQ09NUElMSU5HJwkJCTogICAgNSwKCQknJF5DJwkJCQk6ICAgIDUsCgkJJyRERUJVR0dJTkcnCQkJOiAgICA1LAoJCSckXkQnCQkJCTogICAgNSwKCQknJHteRU5DT0RJTkd9JwkJCTogICAgNSwKCQknJEVOVicJCQkJOiAgICA1LAoJCSclRU5WJwkJCQk6ICAgIDUsCgkJJyRTWVNURU1fRkRfTUFYJwkJOiAgICA1LAoJCSckXkYnCQkJCTogICAgNSwKCQknQEYnCQkJCTogICAgNSwKCQknJHteR0xPQkFMX1BIQVNFfScJCTogICAgNSwKCQknJF5IJwkJCQk6ICAgIDUsCgkJJyVeSCcJCQkJOiAgICA1LAoJCSdASU5DJwkJCQk6ICAgIDUsCgkJJyVJTkMnCQkJCTogICAgNSwKCQknJElOUExBQ0VfRURJVCcJCQk6ICAgIDUsCgkJJyReSScJCQkJOiAgICA1LAoJCSckXk0nCQkJCTogICAgNSwKCQknJE9TTkFNRScJCQk6ICAgIDUsCgkJJyReTycJCQkJOiAgICA1LAoJCScke15PUEVOfScJCQk6ICAgIDUsCgkJJyRQRVJMREInCQkJOiAgICA1LAoJCSckXlAnCQkJCTogICAgNSwKCQknJFNJRycJCQkJOiAgICA1LAoJCSclU0lHJwkJCQk6ICAgIDUsCgkJJyRCQVNFVElNRScJCQk6ICAgIDUsCgkJJyReVCcJCQkJOiAgICA1LAoJCScke15UQUlOVH0nCQkJOiAgICA1LAoJCScke15VTklDT0RFfScJCQk6ICAgIDUsCgkJJyR7XlVURjhDQUNIRX0nCQkJOiAgICA1LAoJCScke15VVEY4TE9DQUxFfScJCTogICAgNSwKCQknJFBFUkxfVkVSU0lPTicJCQk6ICAgIDUsCgkJJyReVicJCQkJOiAgICA1LAoJCScke15XSU4zMl9TTE9QUFlfU1RBVH0nCQk6ICAgIDUsCgkJJyRFWEVDVVRBQkxFX05BTUUnCQk6ICAgIDUsCgkJJyReWCcJCQkJOiAgICA1LAoJCSckMScJCQkJOiAgICA1LAkvLyAtIHJlZ2V4cCAkMSwgJDIuLi4KCQknJE1BVENIJwkJCTogICAgNSwKCQknJCYnCQkJCTogICAgNSwKCQknJHteTUFUQ0h9JwkJCTogICAgNSwKCQknJFBSRU1BVENIJwkJCTogICAgNSwKCQknJGAnCQkJCTogICAgNSwKCQknJHteUFJFTUFUQ0h9JwkJCTogICAgNSwKCQknJFBPU1RNQVRDSCcJCQk6ICAgIDUsCgkJIiQnIgkJCQk6ICAgIDUsCgkJJyR7XlBPU1RNQVRDSH0nCQkJOiAgICA1LAoJCSckTEFTVF9QQVJFTl9NQVRDSCcJCTogICAgNSwKCQknJCsnCQkJCTogICAgNSwKCQknJExBU1RfU1VCTUFUQ0hfUkVTVUxUJwkJOiAgICA1LAoJCSckXk4nCQkJCTogICAgNSwKCQknQExBU1RfTUFUQ0hfRU5EJwkJOiAgICA1LAoJCSdAKycJCQkJOiAgICA1LAoJCSclTEFTVF9QQVJFTl9NQVRDSCcJCTogICAgNSwKCQknJSsnCQkJCTogICAgNSwKCQknQExBU1RfTUFUQ0hfU1RBUlQnCQk6ICAgIDUsCgkJJ0AtJwkJCQk6ICAgIDUsCgkJJyVMQVNUX01BVENIX1NUQVJUJwkJOiAgICA1LAoJCSclLScJCQkJOiAgICA1LAoJCSckTEFTVF9SRUdFWFBfQ09ERV9SRVNVTFQnCTogICAgNSwKCQknJF5SJwkJCQk6ICAgIDUsCgkJJyR7XlJFX0RFQlVHX0ZMQUdTfScJCTogICAgNSwKCQknJHteUkVfVFJJRV9NQVhCVUZ9JwkJOiAgICA1LAoJCSckQVJHVicJCQkJOiAgICA1LAoJCSdAQVJHVicJCQkJOiAgICA1LAoJCSdBUkdWJwkJCQk6ICAgIDUsCgkJJ0FSR1ZPVVQnCQkJOiAgICA1LAoJCSckT1VUUFVUX0ZJRUxEX1NFUEFSQVRPUicJOiAgICA1LAoJCSckT0ZTJwkJCQk6ICAgIDUsCgkJJyQsJwkJCQk6ICAgIDUsCgkJJyRJTlBVVF9MSU5FX05VTUJFUicJCTogICAgNSwKCQknJE5SJwkJCQk6ICAgIDUsCgkJJyQuJwkJCQk6ICAgIDUsCgkJJyRJTlBVVF9SRUNPUkRfU0VQQVJBVE9SJwk6ICAgIDUsCgkJJyRSUycJCQkJOiAgICA1LAoJCSckLycJCQkJOiAgICA1LAoJCSckT1VUUFVUX1JFQ09SRF9TRVBBUkFUT1InCTogICAgNSwKCQknJE9SUycJCQkJOiAgICA1LAoJCSckXFwnCQkJCTogICAgNSwKCQknJE9VVFBVVF9BVVRPRkxVU0gnCQk6ICAgIDUsCgkJJyR8JwkJCQk6ICAgIDUsCgkJJyRBQ0NVTVVMQVRPUicJCQk6ICAgIDUsCgkJJyReQScJCQkJOiAgICA1LAoJCSckRk9STUFUX0ZPUk1GRUVEJwkJOiAgICA1LAoJCSckXkwnCQkJCTogICAgNSwKCQknJEZPUk1BVF9QQUdFX05VTUJFUicJCTogICAgNSwKCQknJCUnCQkJCTogICAgNSwKCQknJEZPUk1BVF9MSU5FU19MRUZUJwkJOiAgICA1LAoJCSckLScJCQkJOiAgICA1LAoJCSckRk9STUFUX0xJTkVfQlJFQUtfQ0hBUkFDVEVSUycJOiAgICA1LAoJCSckOicJCQkJOiAgICA1LAoJCSckRk9STUFUX0xJTkVTX1BFUl9QQUdFJwk6ICAgIDUsCgkJJyQ9JwkJCQk6ICAgIDUsCgkJJyRGT1JNQVRfVE9QX05BTUUnCQk6ICAgIDUsCgkJJyReJwkJCQk6ICAgIDUsCgkJJyRGT1JNQVRfTkFNRScJCQk6ICAgIDUsCgkJJyR+JwkJCQk6ICAgIDUsCgkJJyR7XkNISUxEX0VSUk9SX05BVElWRX0nCTogICAgNSwKCQknJEVYVEVOREVEX09TX0VSUk9SJwkJOiAgICA1LAoJCSckXkUnCQkJCTogICAgNSwKCQknJEVYQ0VQVElPTlNfQkVJTkdfQ0FVR0hUJwk6ICAgIDUsCgkJJyReUycJCQkJOiAgICA1LAoJCSckV0FSTklORycJCQk6ICAgIDUsCgkJJyReVycJCQkJOiAgICA1LAoJCScke15XQVJOSU5HX0JJVFN9JwkJOiAgICA1LAoJCSckT1NfRVJST1InCQkJOiAgICA1LAoJCSckRVJSTk8nCQkJOiAgICA1LAoJCSckIScJCQkJOiAgICA1LAoJCSclT1NfRVJST1InCQkJOiAgICA1LAoJCSclRVJSTk8nCQkJOiAgICA1LAoJCSclIScJCQkJOiAgICA1LAoJCSckQ0hJTERfRVJST1InCQkJOiAgICA1LAoJCSckPycJCQkJOiAgICA1LAoJCSckRVZBTF9FUlJPUicJCQk6ICAgIDUsCgkJJyRAJwkJCQk6ICAgIDUsCgkJJyRPRk1UJwkJCQk6ICAgIDUsCgkJJyQjJwkJCQk6ICAgIDUsCgkJJyQqJwkJCQk6ICAgIDUsCgkJJyRBUlJBWV9CQVNFJwkJCTogICAgNSwKCQknJFsnCQkJCTogICAgNSwKCQknJE9MRF9QRVJMX1ZFUlNJT04nCQk6ICAgIDUsCgkJJyRdJwkJCQk6ICAgIDUsCgkJCQkJCS8vCVBFUkwgYmxvY2tzCgkJJ2lmJwkJCQk6WzEsMV0sCgkJZWxzaWYJCQkJOlsxLDFdLAoJCSdlbHNlJwkJCQk6WzEsMV0sCgkJJ3doaWxlJwkJCQk6WzEsMV0sCgkJdW5sZXNzCQkJCTpbMSwxXSwKCQknZm9yJwkJCQk6WzEsMV0sCgkJZm9yZWFjaAkJCQk6WzEsMV0sCgkJCQkJCS8vCVBFUkwgZnVuY3Rpb25zCgkJJ2FicycJCQkJOjEsCS8vIC0gYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24KCQlhY2NlcHQJCQkJOjEsCS8vIC0gYWNjZXB0IGFuIGluY29taW5nIHNvY2tldCBjb25uZWN0CgkJYWxhcm0JCQkJOjEsCS8vIC0gc2NoZWR1bGUgYSBTSUdBTFJNCgkJJ2F0YW4yJwkJCQk6MSwJLy8gLSBhcmN0YW5nZW50IG9mIFkvWCBpbiB0aGUgcmFuZ2UgLVBJIHRvIFBJCgkJYmluZAkJCQk6MSwJLy8gLSBiaW5kcyBhbiBhZGRyZXNzIHRvIGEgc29ja2V0CgkJYmlubW9kZQkJCQk6MSwJLy8gLSBwcmVwYXJlIGJpbmFyeSBmaWxlcyBmb3IgSS9PCgkJYmxlc3MJCQkJOjEsCS8vIC0gY3JlYXRlIGFuIG9iamVjdAoJCWJvb3RzdHJhcAkJCToxLAkvLwoJCSdicmVhaycJCQkJOjEsCS8vIC0gYnJlYWsgb3V0IG9mIGEgImdpdmVuIiBibG9jawoJCWNhbGxlcgkJCQk6MSwJLy8gLSBnZXQgY29udGV4dCBvZiB0aGUgY3VycmVudCBzdWJyb3V0aW5lIGNhbGwKCQljaGRpcgkJCQk6MSwJLy8gLSBjaGFuZ2UgeW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CgkJY2htb2QJCQkJOjEsCS8vIC0gY2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb24gYSBsaXN0IG9mIGZpbGVzCgkJY2hvbXAJCQkJOjEsCS8vIC0gcmVtb3ZlIGEgdHJhaWxpbmcgcmVjb3JkIHNlcGFyYXRvciBmcm9tIGEgc3RyaW5nCgkJY2hvcAkJCQk6MSwJLy8gLSByZW1vdmUgdGhlIGxhc3QgY2hhcmFjdGVyIGZyb20gYSBzdHJpbmcKCQljaG93bgkJCQk6MSwJLy8gLSBjaGFuZ2UgdGhlIG93ZXJzaGlwIG9uIGEgbGlzdCBvZiBmaWxlcwoJCWNocgkJCQk6MSwJLy8gLSBnZXQgY2hhcmFjdGVyIHRoaXMgbnVtYmVyIHJlcHJlc2VudHMKCQljaHJvb3QJCQkJOjEsCS8vIC0gbWFrZSBkaXJlY3RvcnkgbmV3IHJvb3QgZm9yIHBhdGggbG9va3VwcwoJCWNsb3NlCQkJCToxLAkvLyAtIGNsb3NlIGZpbGUgKG9yIHBpcGUgb3Igc29ja2V0KSBoYW5kbGUKCQljbG9zZWRpcgkJCToxLAkvLyAtIGNsb3NlIGRpcmVjdG9yeSBoYW5kbGUKCQljb25uZWN0CQkJCToxLAkvLyAtIGNvbm5lY3QgdG8gYSByZW1vdGUgc29ja2V0CgkJJ2NvbnRpbnVlJwkJCTpbMSwxXSwJLy8gLSBvcHRpb25hbCB0cmFpbGluZyBibG9jayBpbiBhIHdoaWxlIG9yIGZvcmVhY2gKCQknY29zJwkJCQk6MSwJLy8gLSBjb3NpbmUgZnVuY3Rpb24KCQljcnlwdAkJCQk6MSwJLy8gLSBvbmUtd2F5IHBhc3N3ZC1zdHlsZSBlbmNyeXB0aW9uCgkJZGJtY2xvc2UJCQk6MSwJLy8gLSBicmVha3MgYmluZGluZyBvbiBhIHRpZWQgZGJtIGZpbGUKCQlkYm1vcGVuCQkJCToxLAkvLyAtIGNyZWF0ZSBiaW5kaW5nIG9uIGEgdGllZCBkYm0gZmlsZQoJCSdkZWZhdWx0JwkJCToxLAkvLwoJCWRlZmluZWQJCQkJOjEsCS8vIC0gdGVzdCB3aGV0aGVyIGEgdmFsdWUsIHZhcmlhYmxlLCBvciBmdW5jdGlvbiBpcyBkZWZpbmVkCgkJJ2RlbGV0ZScJCQk6MSwJLy8gLSBkZWxldGVzIGEgdmFsdWUgZnJvbSBhIGhhc2gKCQlkaWUJCQkJOjEsCS8vIC0gcmFpc2UgYW4gZXhjZXB0aW9uIG9yIGJhaWwgb3V0CgkJJ2RvJwkJCQk6MSwJLy8gLSB0dXJuIGEgQkxPQ0sgaW50byBhIFRFUk0KCQlkdW1wCQkJCToxLAkvLyAtIGNyZWF0ZSBhbiBpbW1lZGlhdGUgY29yZSBkdW1wCgkJZWFjaAkJCQk6MSwJLy8gLSByZXRyaWV2ZSB0aGUgbmV4dCBrZXkvdmFsdWUgcGFpciBmcm9tIGEgaGFzaAoJCWVuZGdyZW50CQkJOjEsCS8vIC0gYmUgZG9uZSB1c2luZyBncm91cCBmaWxlCgkJZW5kaG9zdGVudAkJCToxLAkvLyAtIGJlIGRvbmUgdXNpbmcgaG9zdHMgZmlsZQoJCWVuZG5ldGVudAkJCToxLAkvLyAtIGJlIGRvbmUgdXNpbmcgbmV0d29ya3MgZmlsZQoJCWVuZHByb3RvZW50CQkJOjEsCS8vIC0gYmUgZG9uZSB1c2luZyBwcm90b2NvbHMgZmlsZQoJCWVuZHB3ZW50CQkJOjEsCS8vIC0gYmUgZG9uZSB1c2luZyBwYXNzd2QgZmlsZQoJCWVuZHNlcnZlbnQJCQk6MSwJLy8gLSBiZSBkb25lIHVzaW5nIHNlcnZpY2VzIGZpbGUKCQllb2YJCQkJOjEsCS8vIC0gdGVzdCBhIGZpbGVoYW5kbGUgZm9yIGl0cyBlbmQKCQknZXZhbCcJCQkJOjEsCS8vIC0gY2F0Y2ggZXhjZXB0aW9ucyBvciBjb21waWxlIGFuZCBydW4gY29kZQoJCSdleGVjJwkJCQk6MSwJLy8gLSBhYmFuZG9uIHRoaXMgcHJvZ3JhbSB0byBydW4gYW5vdGhlcgoJCWV4aXN0cwkJCQk6MSwJLy8gLSB0ZXN0IHdoZXRoZXIgYSBoYXNoIGtleSBpcyBwcmVzZW50CgkJZXhpdAkJCQk6MSwJLy8gLSB0ZXJtaW5hdGUgdGhpcyBwcm9ncmFtCgkJJ2V4cCcJCQkJOjEsCS8vIC0gcmFpc2UgSSB0byBhIHBvd2VyCgkJZmNudGwJCQkJOjEsCS8vIC0gZmlsZSBjb250cm9sIHN5c3RlbSBjYWxsCgkJZmlsZW5vCQkJCToxLAkvLyAtIHJldHVybiBmaWxlIGRlc2NyaXB0b3IgZnJvbSBmaWxlaGFuZGxlCgkJZmxvY2sJCQkJOjEsCS8vIC0gbG9jayBhbiBlbnRpcmUgZmlsZSB3aXRoIGFuIGFkdmlzb3J5IGxvY2sKCQlmb3JrCQkJCToxLAkvLyAtIGNyZWF0ZSBhIG5ldyBwcm9jZXNzIGp1c3QgbGlrZSB0aGlzIG9uZQoJCWZvcm1hdAkJCQk6MSwJLy8gLSBkZWNsYXJlIGEgcGljdHVyZSBmb3JtYXQgd2l0aCB1c2UgYnkgdGhlIHdyaXRlKCkgZnVuY3Rpb24KCQlmb3JtbGluZQkJCToxLAkvLyAtIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgZm9yIGZvcm1hdHMKCQlnZXRjCQkJCToxLAkvLyAtIGdldCB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbSB0aGUgZmlsZWhhbmRsZQoJCWdldGdyZW50CQkJOjEsCS8vIC0gZ2V0IG5leHQgZ3JvdXAgcmVjb3JkCgkJZ2V0Z3JnaWQJCQk6MSwJLy8gLSBnZXQgZ3JvdXAgcmVjb3JkIGdpdmVuIGdyb3VwIHVzZXIgSUQKCQlnZXRncm5hbQkJCToxLAkvLyAtIGdldCBncm91cCByZWNvcmQgZ2l2ZW4gZ3JvdXAgbmFtZQoJCWdldGhvc3RieWFkZHIJCQk6MSwJLy8gLSBnZXQgaG9zdCByZWNvcmQgZ2l2ZW4gaXRzIGFkZHJlc3MKCQlnZXRob3N0YnluYW1lCQkJOjEsCS8vIC0gZ2V0IGhvc3QgcmVjb3JkIGdpdmVuIG5hbWUKCQlnZXRob3N0ZW50CQkJOjEsCS8vIC0gZ2V0IG5leHQgaG9zdHMgcmVjb3JkCgkJZ2V0bG9naW4JCQk6MSwJLy8gLSByZXR1cm4gd2hvIGxvZ2dlZCBpbiBhdCB0aGlzIHR0eQoJCWdldG5ldGJ5YWRkcgkJCToxLAkvLyAtIGdldCBuZXR3b3JrIHJlY29yZCBnaXZlbiBpdHMgYWRkcmVzcwoJCWdldG5ldGJ5bmFtZQkJCToxLAkvLyAtIGdldCBuZXR3b3JrcyByZWNvcmQgZ2l2ZW4gbmFtZQoJCWdldG5ldGVudAkJCToxLAkvLyAtIGdldCBuZXh0IG5ldHdvcmtzIHJlY29yZAoJCWdldHBlZXJuYW1lCQkJOjEsCS8vIC0gZmluZCB0aGUgb3RoZXIgZW5kIG9mIGEgc29ja2V0IGNvbm5lY3Rpb24KCQlnZXRwZ3JwCQkJCToxLAkvLyAtIGdldCBwcm9jZXNzIGdyb3VwCgkJZ2V0cHBpZAkJCQk6MSwJLy8gLSBnZXQgcGFyZW50IHByb2Nlc3MgSUQKCQlnZXRwcmlvcml0eQkJCToxLAkvLyAtIGdldCBjdXJyZW50IG5pY2UgdmFsdWUKCQlnZXRwcm90b2J5bmFtZQkJCToxLAkvLyAtIGdldCBwcm90b2NvbCByZWNvcmQgZ2l2ZW4gbmFtZQoJCWdldHByb3RvYnludW1iZXIJCToxLAkvLyAtIGdldCBwcm90b2NvbCByZWNvcmQgbnVtZXJpYyBwcm90b2NvbAoJCWdldHByb3RvZW50CQkJOjEsCS8vIC0gZ2V0IG5leHQgcHJvdG9jb2xzIHJlY29yZAoJCWdldHB3ZW50CQkJOjEsCS8vIC0gZ2V0IG5leHQgcGFzc3dkIHJlY29yZAoJCWdldHB3bmFtCQkJOjEsCS8vIC0gZ2V0IHBhc3N3ZCByZWNvcmQgZ2l2ZW4gdXNlciBsb2dpbiBuYW1lCgkJZ2V0cHd1aWQJCQk6MSwJLy8gLSBnZXQgcGFzc3dkIHJlY29yZCBnaXZlbiB1c2VyIElECgkJZ2V0c2VydmJ5bmFtZQkJCToxLAkvLyAtIGdldCBzZXJ2aWNlcyByZWNvcmQgZ2l2ZW4gaXRzIG5hbWUKCQlnZXRzZXJ2Ynlwb3J0CQkJOjEsCS8vIC0gZ2V0IHNlcnZpY2VzIHJlY29yZCBnaXZlbiBudW1lcmljIHBvcnQKCQlnZXRzZXJ2ZW50CQkJOjEsCS8vIC0gZ2V0IG5leHQgc2VydmljZXMgcmVjb3JkCgkJZ2V0c29ja25hbWUJCQk6MSwJLy8gLSByZXRyaWV2ZSB0aGUgc29ja2FkZHIgZm9yIGEgZ2l2ZW4gc29ja2V0CgkJZ2V0c29ja29wdAkJCToxLAkvLyAtIGdldCBzb2NrZXQgb3B0aW9ucyBvbiBhIGdpdmVuIHNvY2tldAoJCWdpdmVuCQkJCToxLAkvLwoJCWdsb2IJCQkJOjEsCS8vIC0gZXhwYW5kIGZpbGVuYW1lcyB1c2luZyB3aWxkY2FyZHMKCQlnbXRpbWUJCQkJOjEsCS8vIC0gY29udmVydCBVTklYIHRpbWUgaW50byByZWNvcmQgb3Igc3RyaW5nIHVzaW5nIEdyZWVud2ljaCB0aW1lCgkJJ2dvdG8nCQkJCToxLAkvLyAtIGNyZWF0ZSBzcGFnaGV0dGkgY29kZQoJCWdyZXAJCQkJOjEsCS8vIC0gbG9jYXRlIGVsZW1lbnRzIGluIGEgbGlzdCB0ZXN0IHRydWUgYWdhaW5zdCBhIGdpdmVuIGNyaXRlcmlvbgoJCWhleAkJCQk6MSwJLy8gLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGEgaGV4YWRlY2ltYWwgbnVtYmVyCgkJJ2ltcG9ydCcJCQk6MSwJLy8gLSBwYXRjaCBhIG1vZHVsZSdzIG5hbWVzcGFjZSBpbnRvIHlvdXIgb3duCgkJaW5kZXgJCQkJOjEsCS8vIC0gZmluZCBhIHN1YnN0cmluZyB3aXRoaW4gYSBzdHJpbmcKCQknaW50JwkJCQk6MSwJLy8gLSBnZXQgdGhlIGludGVnZXIgcG9ydGlvbiBvZiBhIG51bWJlcgoJCWlvY3RsCQkJCToxLAkvLyAtIHN5c3RlbS1kZXBlbmRlbnQgZGV2aWNlIGNvbnRyb2wgc3lzdGVtIGNhbGwKCQknam9pbicJCQkJOjEsCS8vIC0gam9pbiBhIGxpc3QgaW50byBhIHN0cmluZyB1c2luZyBhIHNlcGFyYXRvcgoJCWtleXMJCQkJOjEsCS8vIC0gcmV0cmlldmUgbGlzdCBvZiBpbmRpY2VzIGZyb20gYSBoYXNoCgkJa2lsbAkJCQk6MSwJLy8gLSBzZW5kIGEgc2lnbmFsIHRvIGEgcHJvY2VzcyBvciBwcm9jZXNzIGdyb3VwCgkJbGFzdAkJCQk6MSwJLy8gLSBleGl0IGEgYmxvY2sgcHJlbWF0dXJlbHkKCQlsYwkJCQk6MSwJLy8gLSByZXR1cm4gbG93ZXItY2FzZSB2ZXJzaW9uIG9mIGEgc3RyaW5nCgkJbGNmaXJzdAkJCQk6MSwJLy8gLSByZXR1cm4gYSBzdHJpbmcgd2l0aCBqdXN0IHRoZSBuZXh0IGxldHRlciBpbiBsb3dlciBjYXNlCgkJbGVuZ3RoCQkJCToxLAkvLyAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgc3RyaW5nCgkJJ2xpbmsnCQkJCToxLAkvLyAtIGNyZWF0ZSBhIGhhcmQgbGluayBpbiB0aGUgZmlsZXN5dGVtCgkJbGlzdGVuCQkJCToxLAkvLyAtIHJlZ2lzdGVyIHlvdXIgc29ja2V0IGFzIGEgc2VydmVyCgkJbG9jYWwJCQkJOiAyLAkvLyAtIGNyZWF0ZSBhIHRlbXBvcmFyeSB2YWx1ZSBmb3IgYSBnbG9iYWwgdmFyaWFibGUgKGR5bmFtaWMgc2NvcGluZykKCQlsb2NhbHRpbWUJCQk6MSwJLy8gLSBjb252ZXJ0IFVOSVggdGltZSBpbnRvIHJlY29yZCBvciBzdHJpbmcgdXNpbmcgbG9jYWwgdGltZQoJCWxvY2sJCQkJOjEsCS8vIC0gZ2V0IGEgdGhyZWFkIGxvY2sgb24gYSB2YXJpYWJsZSwgc3Vicm91dGluZSwgb3IgbWV0aG9kCgkJJ2xvZycJCQkJOjEsCS8vIC0gcmV0cmlldmUgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIGZvciBhIG51bWJlcgoJCWxzdGF0CQkJCToxLAkvLyAtIHN0YXQgYSBzeW1ib2xpYyBsaW5rCgkJbQkJCQk6bnVsbCwJLy8gLSBtYXRjaCBhIHN0cmluZyB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4KCQltYXAJCQkJOjEsCS8vIC0gYXBwbHkgYSBjaGFuZ2UgdG8gYSBsaXN0IHRvIGdldCBiYWNrIGEgbmV3IGxpc3Qgd2l0aCB0aGUgY2hhbmdlcwoJCW1rZGlyCQkJCToxLAkvLyAtIGNyZWF0ZSBhIGRpcmVjdG9yeQoJCW1zZ2N0bAkJCQk6MSwJLy8gLSBTeXNWIElQQyBtZXNzYWdlIGNvbnRyb2wgb3BlcmF0aW9ucwoJCW1zZ2dldAkJCQk6MSwJLy8gLSBnZXQgU3lzViBJUEMgbWVzc2FnZSBxdWV1ZQoJCW1zZ3JjdgkJCQk6MSwJLy8gLSByZWNlaXZlIGEgU3lzViBJUEMgbWVzc2FnZSBmcm9tIGEgbWVzc2FnZSBxdWV1ZQoJCW1zZ3NuZAkJCQk6MSwJLy8gLSBzZW5kIGEgU3lzViBJUEMgbWVzc2FnZSB0byBhIG1lc3NhZ2UgcXVldWUKCQlteQkJCQk6IDIsCS8vIC0gZGVjbGFyZSBhbmQgYXNzaWduIGEgbG9jYWwgdmFyaWFibGUgKGxleGljYWwgc2NvcGluZykKCQknbmV3JwkJCQk6MSwJLy8KCQluZXh0CQkJCToxLAkvLyAtIGl0ZXJhdGUgYSBibG9jayBwcmVtYXR1cmVseQoJCW5vCQkJCToxLAkvLyAtIHVuaW1wb3J0IHNvbWUgbW9kdWxlIHN5bWJvbHMgb3Igc2VtYW50aWNzIGF0IGNvbXBpbGUgdGltZQoJCW9jdAkJCQk6MSwJLy8gLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIG9jdGFsIG51bWJlcgoJCW9wZW4JCQkJOjEsCS8vIC0gb3BlbiBhIGZpbGUsIHBpcGUsIG9yIGRlc2NyaXB0b3IKCQlvcGVuZGlyCQkJCToxLAkvLyAtIG9wZW4gYSBkaXJlY3RvcnkKCQlvcmQJCQkJOjEsCS8vIC0gZmluZCBhIGNoYXJhY3RlcidzIG51bWVyaWMgcmVwcmVzZW50YXRpb24KCQlvdXIJCQkJOiAyLAkvLyAtIGRlY2xhcmUgYW5kIGFzc2lnbiBhIHBhY2thZ2UgdmFyaWFibGUgKGxleGljYWwgc2NvcGluZykKCQlwYWNrCQkJCToxLAkvLyAtIGNvbnZlcnQgYSBsaXN0IGludG8gYSBiaW5hcnkgcmVwcmVzZW50YXRpb24KCQkncGFja2FnZScJCQk6MSwJLy8gLSBkZWNsYXJlIGEgc2VwYXJhdGUgZ2xvYmFsIG5hbWVzcGFjZQoJCXBpcGUJCQkJOjEsCS8vIC0gb3BlbiBhIHBhaXIgb2YgY29ubmVjdGVkIGZpbGVoYW5kbGVzCgkJcG9wCQkJCToxLAkvLyAtIHJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IGZyb20gYW4gYXJyYXkgYW5kIHJldHVybiBpdAoJCXBvcwkJCQk6MSwJLy8gLSBmaW5kIG9yIHNldCB0aGUgb2Zmc2V0IGZvciB0aGUgbGFzdC9uZXh0IG0vL2cgc2VhcmNoCgkJcHJpbnQJCQkJOjEsCS8vIC0gb3V0cHV0IGEgbGlzdCB0byBhIGZpbGVoYW5kbGUKCQlwcmludGYJCQkJOjEsCS8vIC0gb3V0cHV0IGEgZm9ybWF0dGVkIGxpc3QgdG8gYSBmaWxlaGFuZGxlCgkJcHJvdG90eXBlCQkJOjEsCS8vIC0gZ2V0IHRoZSBwcm90b3R5cGUgKGlmIGFueSkgb2YgYSBzdWJyb3V0aW5lCgkJcHVzaAkJCQk6MSwJLy8gLSBhcHBlbmQgb25lIG9yIG1vcmUgZWxlbWVudHMgdG8gYW4gYXJyYXkKCQlxCQkJCTpudWxsLAkvLyAtIHNpbmdseSBxdW90ZSBhIHN0cmluZwoJCXFxCQkJCTpudWxsLAkvLyAtIGRvdWJseSBxdW90ZSBhIHN0cmluZwoJCXFyCQkJCTpudWxsLAkvLyAtIENvbXBpbGUgcGF0dGVybgoJCXF1b3RlbWV0YQkJCTpudWxsLAkvLyAtIHF1b3RlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYWdpYyBjaGFyYWN0ZXJzCgkJcXcJCQkJOm51bGwsCS8vIC0gcXVvdGUgYSBsaXN0IG9mIHdvcmRzCgkJcXgJCQkJOm51bGwsCS8vIC0gYmFja3F1b3RlIHF1b3RlIGEgc3RyaW5nCgkJcmFuZAkJCQk6MSwJLy8gLSByZXRyaWV2ZSB0aGUgbmV4dCBwc2V1ZG9yYW5kb20gbnVtYmVyCgkJcmVhZAkJCQk6MSwJLy8gLSBmaXhlZC1sZW5ndGggYnVmZmVyZWQgaW5wdXQgZnJvbSBhIGZpbGVoYW5kbGUKCQlyZWFkZGlyCQkJCToxLAkvLyAtIGdldCBhIGRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IGhhbmRsZQoJCXJlYWRsaW5lCQkJOjEsCS8vIC0gZmV0Y2ggYSByZWNvcmQgZnJvbSBhIGZpbGUKCQlyZWFkbGluawkJCToxLAkvLyAtIGRldGVybWluZSB3aGVyZSBhIHN5bWJvbGljIGxpbmsgaXMgcG9pbnRpbmcKCQlyZWFkcGlwZQkJCToxLAkvLyAtIGV4ZWN1dGUgYSBzeXN0ZW0gY29tbWFuZCBhbmQgY29sbGVjdCBzdGFuZGFyZCBvdXRwdXQKCQlyZWN2CQkJCToxLAkvLyAtIHJlY2VpdmUgYSBtZXNzYWdlIG92ZXIgYSBTb2NrZXQKCQlyZWRvCQkJCToxLAkvLyAtIHN0YXJ0IHRoaXMgbG9vcCBpdGVyYXRpb24gb3ZlciBhZ2FpbgoJCXJlZgkJCQk6MSwJLy8gLSBmaW5kIG91dCB0aGUgdHlwZSBvZiB0aGluZyBiZWluZyByZWZlcmVuY2VkCgkJcmVuYW1lCQkJCToxLAkvLyAtIGNoYW5nZSBhIGZpbGVuYW1lCgkJcmVxdWlyZQkJCQk6MSwJLy8gLSBsb2FkIGluIGV4dGVybmFsIGZ1bmN0aW9ucyBmcm9tIGEgbGlicmFyeSBhdCBydW50aW1lCgkJcmVzZXQJCQkJOjEsCS8vIC0gY2xlYXIgYWxsIHZhcmlhYmxlcyBvZiBhIGdpdmVuIG5hbWUKCQkncmV0dXJuJwkJCToxLAkvLyAtIGdldCBvdXQgb2YgYSBmdW5jdGlvbiBlYXJseQoJCXJldmVyc2UJCQkJOjEsCS8vIC0gZmxpcCBhIHN0cmluZyBvciBhIGxpc3QKCQlyZXdpbmRkaXIJCQk6MSwJLy8gLSByZXNldCBkaXJlY3RvcnkgaGFuZGxlCgkJcmluZGV4CQkJCToxLAkvLyAtIHJpZ2h0LXRvLWxlZnQgc3Vic3RyaW5nIHNlYXJjaAoJCXJtZGlyCQkJCToxLAkvLyAtIHJlbW92ZSBhIGRpcmVjdG9yeQoJCXMJCQkJOm51bGwsCS8vIC0gcmVwbGFjZSBhIHBhdHRlcm4gd2l0aCBhIHN0cmluZwoJCXNheQkJCQk6MSwJLy8gLSBwcmludCB3aXRoIG5ld2xpbmUKCQlzY2FsYXIJCQkJOjEsCS8vIC0gZm9yY2UgYSBzY2FsYXIgY29udGV4dAoJCXNlZWsJCQkJOjEsCS8vIC0gcmVwb3NpdGlvbiBmaWxlIHBvaW50ZXIgZm9yIHJhbmRvbS1hY2Nlc3MgSS9PCgkJc2Vla2RpcgkJCQk6MSwJLy8gLSByZXBvc2l0aW9uIGRpcmVjdG9yeSBwb2ludGVyCgkJc2VsZWN0CQkJCToxLAkvLyAtIHJlc2V0IGRlZmF1bHQgb3V0cHV0IG9yIGRvIEkvTyBtdWx0aXBsZXhpbmcKCQlzZW1jdGwJCQkJOjEsCS8vIC0gU3lzViBzZW1hcGhvcmUgY29udHJvbCBvcGVyYXRpb25zCgkJc2VtZ2V0CQkJCToxLAkvLyAtIGdldCBzZXQgb2YgU3lzViBzZW1hcGhvcmVzCgkJc2Vtb3AJCQkJOjEsCS8vIC0gU3lzViBzZW1hcGhvcmUgb3BlcmF0aW9ucwoJCXNlbmQJCQkJOjEsCS8vIC0gc2VuZCBhIG1lc3NhZ2Ugb3ZlciBhIHNvY2tldAoJCXNldGdyZW50CQkJOjEsCS8vIC0gcHJlcGFyZSBncm91cCBmaWxlIGZvciB1c2UKCQlzZXRob3N0ZW50CQkJOjEsCS8vIC0gcHJlcGFyZSBob3N0cyBmaWxlIGZvciB1c2UKCQlzZXRuZXRlbnQJCQk6MSwJLy8gLSBwcmVwYXJlIG5ldHdvcmtzIGZpbGUgZm9yIHVzZQoJCXNldHBncnAJCQkJOjEsCS8vIC0gc2V0IHRoZSBwcm9jZXNzIGdyb3VwIG9mIGEgcHJvY2VzcwoJCXNldHByaW9yaXR5CQkJOjEsCS8vIC0gc2V0IGEgcHJvY2VzcydzIG5pY2UgdmFsdWUKCQlzZXRwcm90b2VudAkJCToxLAkvLyAtIHByZXBhcmUgcHJvdG9jb2xzIGZpbGUgZm9yIHVzZQoJCXNldHB3ZW50CQkJOjEsCS8vIC0gcHJlcGFyZSBwYXNzd2QgZmlsZSBmb3IgdXNlCgkJc2V0c2VydmVudAkJCToxLAkvLyAtIHByZXBhcmUgc2VydmljZXMgZmlsZSBmb3IgdXNlCgkJc2V0c29ja29wdAkJCToxLAkvLyAtIHNldCBzb21lIHNvY2tldCBvcHRpb25zCgkJc2hpZnQJCQkJOjEsCS8vIC0gcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFycmF5LCBhbmQgcmV0dXJuIGl0CgkJc2htY3RsCQkJCToxLAkvLyAtIFN5c1Ygc2hhcmVkIG1lbW9yeSBvcGVyYXRpb25zCgkJc2htZ2V0CQkJCToxLAkvLyAtIGdldCBTeXNWIHNoYXJlZCBtZW1vcnkgc2VnbWVudCBpZGVudGlmaWVyCgkJc2htcmVhZAkJCQk6MSwJLy8gLSByZWFkIFN5c1Ygc2hhcmVkIG1lbW9yeQoJCXNobXdyaXRlCQkJOjEsCS8vIC0gd3JpdGUgU3lzViBzaGFyZWQgbWVtb3J5CgkJc2h1dGRvd24JCQk6MSwJLy8gLSBjbG9zZSBkb3duIGp1c3QgaGFsZiBvZiBhIHNvY2tldCBjb25uZWN0aW9uCgkJJ3NpbicJCQkJOjEsCS8vIC0gcmV0dXJuIHRoZSBzaW5lIG9mIGEgbnVtYmVyCgkJc2xlZXAJCQkJOjEsCS8vIC0gYmxvY2sgZm9yIHNvbWUgbnVtYmVyIG9mIHNlY29uZHMKCQlzb2NrZXQJCQkJOjEsCS8vIC0gY3JlYXRlIGEgc29ja2V0CgkJc29ja2V0cGFpcgkJCToxLAkvLyAtIGNyZWF0ZSBhIHBhaXIgb2Ygc29ja2V0cwoJCSdzb3J0JwkJCQk6MSwJLy8gLSBzb3J0IGEgbGlzdCBvZiB2YWx1ZXMKCQlzcGxpY2UJCQkJOjEsCS8vIC0gYWRkIG9yIHJlbW92ZSBlbGVtZW50cyBhbnl3aGVyZSBpbiBhbiBhcnJheQoJCSdzcGxpdCcJCQkJOjEsCS8vIC0gc3BsaXQgdXAgYSBzdHJpbmcgdXNpbmcgYSByZWdleHAgZGVsaW1pdGVyCgkJc3ByaW50ZgkJCQk6MSwJLy8gLSBmb3JtYXR0ZWQgcHJpbnQgaW50byBhIHN0cmluZwoJCSdzcXJ0JwkJCQk6MSwJLy8gLSBzcXVhcmUgcm9vdCBmdW5jdGlvbgoJCXNyYW5kCQkJCToxLAkvLyAtIHNlZWQgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCgkJc3RhdAkJCQk6MSwJLy8gLSBnZXQgYSBmaWxlJ3Mgc3RhdHVzIGluZm9ybWF0aW9uCgkJc3RhdGUJCQkJOjEsCS8vIC0gZGVjbGFyZSBhbmQgYXNzaWduIGEgc3RhdGUgdmFyaWFibGUgKHBlcnNpc3RlbnQgbGV4aWNhbCBzY29waW5nKQoJCXN0dWR5CQkJCToxLAkvLyAtIG9wdGltaXplIGlucHV0IGRhdGEgZm9yIHJlcGVhdGVkIHNlYXJjaGVzCgkJJ3N1YicJCQkJOjEsCS8vIC0gZGVjbGFyZSBhIHN1YnJvdXRpbmUsIHBvc3NpYmx5IGFub255bW91c2x5CgkJJ3N1YnN0cicJCQk6MSwJLy8gLSBnZXQgb3IgYWx0ZXIgYSBwb3J0aW9uIG9mIGEgc3Rpcm5nCgkJc3ltbGluawkJCQk6MSwJLy8gLSBjcmVhdGUgYSBzeW1ib2xpYyBsaW5rIHRvIGEgZmlsZQoJCXN5c2NhbGwJCQkJOjEsCS8vIC0gZXhlY3V0ZSBhbiBhcmJpdHJhcnkgc3lzdGVtIGNhbGwKCQlzeXNvcGVuCQkJCToxLAkvLyAtIG9wZW4gYSBmaWxlLCBwaXBlLCBvciBkZXNjcmlwdG9yCgkJc3lzcmVhZAkJCQk6MSwJLy8gLSBmaXhlZC1sZW5ndGggdW5idWZmZXJlZCBpbnB1dCBmcm9tIGEgZmlsZWhhbmRsZQoJCXN5c3NlZWsJCQkJOjEsCS8vIC0gcG9zaXRpb24gSS9PIHBvaW50ZXIgb24gaGFuZGxlIHVzZWQgd2l0aCBzeXNyZWFkIGFuZCBzeXN3cml0ZQoJCXN5c3RlbQkJCQk6MSwJLy8gLSBydW4gYSBzZXBhcmF0ZSBwcm9ncmFtCgkJc3lzd3JpdGUJCQk6MSwJLy8gLSBmaXhlZC1sZW5ndGggdW5idWZmZXJlZCBvdXRwdXQgdG8gYSBmaWxlaGFuZGxlCgkJdGVsbAkJCQk6MSwJLy8gLSBnZXQgY3VycmVudCBzZWVrcG9pbnRlciBvbiBhIGZpbGVoYW5kbGUKCQl0ZWxsZGlyCQkJCToxLAkvLyAtIGdldCBjdXJyZW50IHNlZWtwb2ludGVyIG9uIGEgZGlyZWN0b3J5IGhhbmRsZQoJCXRpZQkJCQk6MSwJLy8gLSBiaW5kIGEgdmFyaWFibGUgdG8gYW4gb2JqZWN0IGNsYXNzCgkJdGllZAkJCQk6MSwJLy8gLSBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB1bmRlcmx5aW5nIGEgdGllZCB2YXJpYWJsZQoJCXRpbWUJCQkJOjEsCS8vIC0gcmV0dXJuIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIDE5NzAKCQl0aW1lcwkJCQk6MSwJLy8gLSByZXR1cm4gZWxhcHNlZCB0aW1lIGZvciBzZWxmIGFuZCBjaGlsZCBwcm9jZXNzZXMKCQl0cgkJCQk6bnVsbCwJLy8gLSB0cmFuc2xpdGVyYXRlIGEgc3RyaW5nCgkJdHJ1bmNhdGUJCQk6MSwJLy8gLSBzaG9ydGVuIGEgZmlsZQoJCXVjCQkJCToxLAkvLyAtIHJldHVybiB1cHBlci1jYXNlIHZlcnNpb24gb2YgYSBzdHJpbmcKCQl1Y2ZpcnN0CQkJCToxLAkvLyAtIHJldHVybiBhIHN0cmluZyB3aXRoIGp1c3QgdGhlIG5leHQgbGV0dGVyIGluIHVwcGVyIGNhc2UKCQl1bWFzawkJCQk6MSwJLy8gLSBzZXQgZmlsZSBjcmVhdGlvbiBtb2RlIG1hc2sKCQl1bmRlZgkJCQk6MSwJLy8gLSByZW1vdmUgYSB2YXJpYWJsZSBvciBmdW5jdGlvbiBkZWZpbml0aW9uCgkJdW5saW5rCQkJCToxLAkvLyAtIHJlbW92ZSBvbmUgbGluayB0byBhIGZpbGUKCQl1bnBhY2sJCQkJOjEsCS8vIC0gY29udmVydCBiaW5hcnkgc3RydWN0dXJlIGludG8gbm9ybWFsIHBlcmwgdmFyaWFibGVzCgkJdW5zaGlmdAkJCQk6MSwJLy8gLSBwcmVwZW5kIG1vcmUgZWxlbWVudHMgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QKCQl1bnRpZQkJCQk6MSwJLy8gLSBicmVhayBhIHRpZSBiaW5kaW5nIHRvIGEgdmFyaWFibGUKCQl1c2UJCQkJOjEsCS8vIC0gbG9hZCBpbiBhIG1vZHVsZSBhdCBjb21waWxlIHRpbWUKCQl1dGltZQkJCQk6MSwJLy8gLSBzZXQgYSBmaWxlJ3MgbGFzdCBhY2Nlc3MgYW5kIG1vZGlmeSB0aW1lcwoJCXZhbHVlcwkJCQk6MSwJLy8gLSByZXR1cm4gYSBsaXN0IG9mIHRoZSB2YWx1ZXMgaW4gYSBoYXNoCgkJdmVjCQkJCToxLAkvLyAtIHRlc3Qgb3Igc2V0IHBhcnRpY3VsYXIgYml0cyBpbiBhIHN0cmluZwoJCXdhaXQJCQkJOjEsCS8vIC0gd2FpdCBmb3IgYW55IGNoaWxkIHByb2Nlc3MgdG8gZGllCgkJd2FpdHBpZAkJCQk6MSwJLy8gLSB3YWl0IGZvciBhIHBhcnRpY3VsYXIgY2hpbGQgcHJvY2VzcyB0byBkaWUKCQl3YW50YXJyYXkJCQk6MSwJLy8gLSBnZXQgdm9pZCB2cyBzY2FsYXIgdnMgbGlzdCBjb250ZXh0IG9mIGN1cnJlbnQgc3Vicm91dGluZSBjYWxsCgkJd2FybgkJCQk6MSwJLy8gLSBwcmludCBkZWJ1Z2dpbmcgaW5mbwoJCXdoZW4JCQkJOjEsCS8vCgkJd3JpdGUJCQkJOjEsCS8vIC0gcHJpbnQgYSBwaWN0dXJlIHJlY29yZAoJCXkJCQkJOm51bGx9OwkvLyAtIHRyYW5zbGl0ZXJhdGUgYSBzdHJpbmcKCgl2YXIgUlhzdHlsZT0ic3RyaW5nLTIiOwoJdmFyIFJYbW9kaWZpZXJzPS9bZ29zZXhpbWFjcGx1ZF0vOwkJLy8gTk9URTogIm0iLCAicyIsICJ5IiBhbmQgInRyIiBuZWVkIHRvIGNvcnJlY3QgcmVhbCBtb2RpZmllcnMgZm9yIGVhY2ggcmVnZXhwIHR5cGUKCglmdW5jdGlvbiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxjaGFpbixzdHlsZSx0YWlsKXsJLy8gTk9URTogY2hhaW4ubGVuZ3RoID4gMiBpcyBub3Qgd29ya2luZyBub3cgKGl0J3MgZm9yIHNbLi4uXVsuLi5dZ2VvczspCgkJc3RhdGUuY2hhaW49bnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgICAzdGFpbAoJCXN0YXRlLnN0eWxlPW51bGw7CgkJc3RhdGUudGFpbD1udWxsOwoJCXN0YXRlLnRva2VuaXplPWZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7CgkJCXZhciBlPWZhbHNlLGMsaT0wOwoJCQl3aGlsZShjPXN0cmVhbS5uZXh0KCkpewoJCQkJaWYoYz09PWNoYWluW2ldJiYhZSl7CgkJCQkJaWYoY2hhaW5bKytpXSE9PXVuZGVmaW5lZCl7CgkJCQkJCXN0YXRlLmNoYWluPWNoYWluW2ldOwoJCQkJCQlzdGF0ZS5zdHlsZT1zdHlsZTsKCQkJCQkJc3RhdGUudGFpbD10YWlsO30KCQkJCQllbHNlIGlmKHRhaWwpCgkJCQkJCXN0cmVhbS5lYXRXaGlsZSh0YWlsKTsKCQkJCQlzdGF0ZS50b2tlbml6ZT10b2tlblBlcmw7CgkJCQkJcmV0dXJuIHN0eWxlO30KCQkJCWU9IWUmJmM9PSJcXCI7fQoJCQlyZXR1cm4gc3R5bGU7fTsKCQlyZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLHN0YXRlKTt9CgoJZnVuY3Rpb24gdG9rZW5TT01FVEhJTkcoc3RyZWFtLHN0YXRlLHN0cmluZyl7CgkJc3RhdGUudG9rZW5pemU9ZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXsKCQkJaWYoc3RyZWFtLnN0cmluZz09c3RyaW5nKQoJCQkJc3RhdGUudG9rZW5pemU9dG9rZW5QZXJsOwoJCQlzdHJlYW0uc2tpcFRvRW5kKCk7CgkJCXJldHVybiAic3RyaW5nIjt9OwoJCXJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sc3RhdGUpO30KCglmdW5jdGlvbiB0b2tlblBlcmwoc3RyZWFtLHN0YXRlKXsKCQlpZihzdHJlYW0uZWF0U3BhY2UoKSkKCQkJcmV0dXJuIG51bGw7CgkJaWYoc3RhdGUuY2hhaW4pCgkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxzdGF0ZS5jaGFpbixzdGF0ZS5zdHlsZSxzdGF0ZS50YWlsKTsKCQlpZihzdHJlYW0ubWF0Y2goL15cLT9bXGRcLl0vLGZhbHNlKSkKCQkJaWYoc3RyZWFtLm1hdGNoKC9eKFwtPyhcZCpcLlxkKyhlWystXT9cZCspP3xcZCtcLlxkKil8MHhbXGRhLWZBLUZdK3wwYlswMV0rfFxkKyhlWystXT9cZCspPykvKSkKCQkJCXJldHVybiAnbnVtYmVyJzsKCQlpZihzdHJlYW0ubWF0Y2goL148PCg/PVx3KS8pKXsJCQkvLyBOT1RFOiA8PFNPTUVUSElOR1xuLi4uXG5TT01FVEhJTkdcbgoJCQlzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CgkJCXJldHVybiB0b2tlblNPTUVUSElORyhzdHJlYW0sc3RhdGUsc3RyZWFtLmN1cnJlbnQoKS5zdWJzdHIoMikpO30KCQlpZihzdHJlYW0uc29sKCkmJnN0cmVhbS5tYXRjaCgvXlw9aXRlbSg/IVx3KS8pKXsvLyBOT1RFOiBcbj1pdGVtLi4uXG49Y3V0XG4KCQkJcmV0dXJuIHRva2VuU09NRVRISU5HKHN0cmVhbSxzdGF0ZSwnPWN1dCcpO30KCQl2YXIgY2g9c3RyZWFtLm5leHQoKTsKCQlpZihjaD09JyInfHxjaD09IiciKXsJCQkJLy8gTk9URTogJyBvciAiIG9yIDw8J1NPTUVUSElORydcbi4uLlxuU09NRVRISU5HXG4gb3IgPDwiU09NRVRISU5HIlxuLi4uXG5TT01FVEhJTkdcbgoJCQlpZihzdHJlYW0ucHJlZml4KDMpPT0iPDwiK2NoKXsKCQkJCXZhciBwPXN0cmVhbS5wb3M7CgkJCQlzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CgkJCQl2YXIgbj1zdHJlYW0uY3VycmVudCgpLnN1YnN0cigxKTsKCQkJCWlmKG4mJnN0cmVhbS5lYXQoY2gpKQoJCQkJCXJldHVybiB0b2tlblNPTUVUSElORyhzdHJlYW0sc3RhdGUsbik7CgkJCQlzdHJlYW0ucG9zPXA7fQoJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2NoXSwic3RyaW5nIik7fQoJCWlmKGNoPT0icSIpewoJCQl2YXIgYz1zdHJlYW0ubG9vaygtMik7CgkJCWlmKCEoYyYmL1x3Ly50ZXN0KGMpKSl7CgkJCQljPXN0cmVhbS5sb29rKDApOwoJCQkJaWYoYz09IngiKXsKCQkJCQljPXN0cmVhbS5sb29rKDEpOwoJCQkJCWlmKGM9PSIoIil7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMik7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIikiXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CgkJCQkJaWYoYz09IlsiKXsKCQkJCQkJc3RyZWFtLmVhdFN1ZmZpeCgyKTsKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KCQkJCQlpZihjPT0ieyIpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDIpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJ9Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQoJCQkJCWlmKGM9PSI8Iil7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMik7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CgkJCQkJaWYoL1tcXiciIX5cL10vLnRlc3QoYykpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDEpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW3N0cmVhbS5lYXQoYyldLFJYc3R5bGUsUlhtb2RpZmllcnMpO319CgkJCQllbHNlIGlmKGM9PSJxIil7CgkJCQkJYz1zdHJlYW0ubG9vaygxKTsKCQkJCQlpZihjPT0iKCIpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDIpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIl0sInN0cmluZyIpO30KCQkJCQlpZihjPT0iWyIpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDIpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJdIl0sInN0cmluZyIpO30KCQkJCQlpZihjPT0ieyIpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDIpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJ9Il0sInN0cmluZyIpO30KCQkJCQlpZihjPT0iPCIpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDIpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+Il0sInN0cmluZyIpO30KCQkJCQlpZigvW1xeJyIhflwvXS8udGVzdChjKSl7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMSk7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbc3RyZWFtLmVhdChjKV0sInN0cmluZyIpO319CgkJCQllbHNlIGlmKGM9PSJ3Iil7CgkJCQkJYz1zdHJlYW0ubG9vaygxKTsKCQkJCQlpZihjPT0iKCIpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDIpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIl0sImJyYWNrZXQiKTt9CgkJCQkJaWYoYz09IlsiKXsKCQkJCQkJc3RyZWFtLmVhdFN1ZmZpeCgyKTsKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSJdLCJicmFja2V0Iik7fQoJCQkJCWlmKGM9PSJ7Iil7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMik7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIn0iXSwiYnJhY2tldCIpO30KCQkJCQlpZihjPT0iPCIpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDIpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+Il0sImJyYWNrZXQiKTt9CgkJCQkJaWYoL1tcXiciIX5cL10vLnRlc3QoYykpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDEpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW3N0cmVhbS5lYXQoYyldLCJicmFja2V0Iik7fX0KCQkJCWVsc2UgaWYoYz09InIiKXsKCQkJCQljPXN0cmVhbS5sb29rKDEpOwoJCQkJCWlmKGM9PSIoIil7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMik7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIikiXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CgkJCQkJaWYoYz09IlsiKXsKCQkJCQkJc3RyZWFtLmVhdFN1ZmZpeCgyKTsKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KCQkJCQlpZihjPT0ieyIpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDIpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJ9Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQoJCQkJCWlmKGM9PSI8Iil7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMik7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CgkJCQkJaWYoL1tcXiciIX5cL10vLnRlc3QoYykpewoJCQkJCQlzdHJlYW0uZWF0U3VmZml4KDEpOwoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW3N0cmVhbS5lYXQoYyldLFJYc3R5bGUsUlhtb2RpZmllcnMpO319CgkJCQllbHNlIGlmKC9bXF4nIiF+XC8oXFt7PF0vLnRlc3QoYykpewoJCQkJCWlmKGM9PSIoIil7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMSk7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIikiXSwic3RyaW5nIik7fQoJCQkJCWlmKGM9PSJbIil7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMSk7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIl0iXSwic3RyaW5nIik7fQoJCQkJCWlmKGM9PSJ7Iil7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMSk7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIn0iXSwic3RyaW5nIik7fQoJCQkJCWlmKGM9PSI8Iil7CgkJCQkJCXN0cmVhbS5lYXRTdWZmaXgoMSk7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iXSwic3RyaW5nIik7fQoJCQkJCWlmKC9bXF4nIiF+XC9dLy50ZXN0KGMpKXsKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtzdHJlYW0uZWF0KGMpXSwic3RyaW5nIik7fX19fQoJCWlmKGNoPT0ibSIpewoJCQl2YXIgYz1zdHJlYW0ubG9vaygtMik7CgkJCWlmKCEoYyYmL1x3Ly50ZXN0KGMpKSl7CgkJCQljPXN0cmVhbS5lYXQoL1soXFt7PFxeJyIhflwvXS8pOwoJCQkJaWYoYyl7CgkJCQkJaWYoL1tcXiciIX5cL10vLnRlc3QoYykpewoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2NdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KCQkJCQlpZihjPT0iKCIpewoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIl0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQoJCQkJCWlmKGM9PSJbIil7CgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIl0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CgkJCQkJaWYoYz09InsiKXsKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsifSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KCQkJCQlpZihjPT0iPCIpewoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fX19fQoJCWlmKGNoPT0icyIpewoJCQl2YXIgYz0vW1wvPlxdfSlcd10vLnRlc3Qoc3RyZWFtLmxvb2soLTIpKTsKCQkJaWYoIWMpewoJCQkJYz1zdHJlYW0uZWF0KC9bKFxbezxcXiciIX5cL10vKTsKCQkJCWlmKGMpewoJCQkJCWlmKGM9PSJbIikKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSIsIl0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKCQkJCQlpZihjPT0ieyIpCgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIn0iLCJ9Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CgkJCQkJaWYoYz09IjwiKQoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+IiwiPiJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwoJCQkJCWlmKGM9PSIoIikKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiKSIsIikiXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2MsY10sUlhzdHlsZSxSWG1vZGlmaWVycyk7fX19CgkJaWYoY2g9PSJ5Iil7CgkJCXZhciBjPS9bXC8+XF19KVx3XS8udGVzdChzdHJlYW0ubG9vaygtMikpOwoJCQlpZighYyl7CgkJCQljPXN0cmVhbS5lYXQoL1soXFt7PFxeJyIhflwvXS8pOwoJCQkJaWYoYyl7CgkJCQkJaWYoYz09IlsiKQoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJdIiwiXSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwoJCQkJCWlmKGM9PSJ7IikKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsifSIsIn0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKCQkJCQlpZihjPT0iPCIpCgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iLCI+Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CgkJCQkJaWYoYz09IigiKQoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIiwiKSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwoJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbYyxjXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9fX0KCQlpZihjaD09InQiKXsKCQkJdmFyIGM9L1tcLz5cXX0pXHddLy50ZXN0KHN0cmVhbS5sb29rKC0yKSk7CgkJCWlmKCFjKXsKCQkJCWM9c3RyZWFtLmVhdCgiciIpO2lmKGMpewoJCQkJYz1zdHJlYW0uZWF0KC9bKFxbezxcXiciIX5cL10vKTsKCQkJCWlmKGMpewoJCQkJCWlmKGM9PSJbIikKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSIsIl0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKCQkJCQlpZihjPT0ieyIpCgkJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIn0iLCJ9Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CgkJCQkJaWYoYz09IjwiKQoJCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+IiwiPiJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwoJCQkJCWlmKGM9PSIoIikKCQkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiKSIsIikiXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2MsY10sUlhzdHlsZSxSWG1vZGlmaWVycyk7fX19fQoJCWlmKGNoPT0iYCIpewoJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2NoXSwidmFyaWFibGUtMiIpO30KCQlpZihjaD09Ii8iKXsKCQkJaWYoIS9+XHMqJC8udGVzdChzdHJlYW0ucHJlZml4KCkpKQoJCQkJcmV0dXJuICJvcGVyYXRvciI7CgkJCWVsc2UKCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbY2hdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KCQlpZihjaD09IiQiKXsKCQkJdmFyIHA9c3RyZWFtLnBvczsKCQkJaWYoc3RyZWFtLmVhdFdoaWxlKC9cZC8pfHxzdHJlYW0uZWF0KCJ7IikmJnN0cmVhbS5lYXRXaGlsZSgvXGQvKSYmc3RyZWFtLmVhdCgifSIpKQoJCQkJcmV0dXJuICJ2YXJpYWJsZS0yIjsKCQkJZWxzZQoJCQkJc3RyZWFtLnBvcz1wO30KCQlpZigvWyRAJV0vLnRlc3QoY2gpKXsKCQkJdmFyIHA9c3RyZWFtLnBvczsKCQkJaWYoc3RyZWFtLmVhdCgiXiIpJiZzdHJlYW0uZWF0KC9bQS1aXS8pfHwhL1tAJCUmXS8udGVzdChzdHJlYW0ubG9vaygtMikpJiZzdHJlYW0uZWF0KC9bPXxcXFwtIz9AOzomYH5cXiFcW1xdKiciJCsuLFwvPD4oKV0vKSl7CgkJCQl2YXIgYz1zdHJlYW0uY3VycmVudCgpOwoJCQkJaWYoUEVSTFtjXSkKCQkJCQlyZXR1cm4gInZhcmlhYmxlLTIiO30KCQkJc3RyZWFtLnBvcz1wO30KCQlpZigvWyRAJSZdLy50ZXN0KGNoKSl7CgkJCWlmKHN0cmVhbS5lYXRXaGlsZSgvW1x3JFxbXF1dLyl8fHN0cmVhbS5lYXQoInsiKSYmc3RyZWFtLmVhdFdoaWxlKC9bXHckXFtcXV0vKSYmc3RyZWFtLmVhdCgifSIpKXsKCQkJCXZhciBjPXN0cmVhbS5jdXJyZW50KCk7CgkJCQlpZihQRVJMW2NdKQoJCQkJCXJldHVybiAidmFyaWFibGUtMiI7CgkJCQllbHNlCgkJCQkJcmV0dXJuICJ2YXJpYWJsZSI7fX0KCQlpZihjaD09IiMiKXsKCQkJaWYoc3RyZWFtLmxvb2soLTIpIT0iJCIpewoJCQkJc3RyZWFtLnNraXBUb0VuZCgpOwoJCQkJcmV0dXJuICJjb21tZW50Ijt9fQoJCWlmKC9bOitcLVxeKiQmJUA9PD4hP3xcL35cLl0vLnRlc3QoY2gpKXsKCQkJdmFyIHA9c3RyZWFtLnBvczsKCQkJc3RyZWFtLmVhdFdoaWxlKC9bOitcLVxeKiQmJUA9PD4hP3xcL35cLl0vKTsKCQkJaWYoUEVSTFtzdHJlYW0uY3VycmVudCgpXSkKCQkJCXJldHVybiAib3BlcmF0b3IiOwoJCQllbHNlCgkJCQlzdHJlYW0ucG9zPXA7fQoJCWlmKGNoPT0iXyIpewoJCQlpZihzdHJlYW0ucG9zPT0xKXsKCQkJCWlmKHN0cmVhbS5zdWZmaXgoNik9PSJfRU5EX18iKXsKCQkJCQlyZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWydcMCddLCJjb21tZW50Iik7fQoJCQkJZWxzZSBpZihzdHJlYW0uc3VmZml4KDcpPT0iX0RBVEFfXyIpewoJCQkJCXJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbJ1wwJ10sInZhcmlhYmxlLTIiKTt9CgkJCQllbHNlIGlmKHN0cmVhbS5zdWZmaXgoNyk9PSJfQ19fIil7CgkJCQkJcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsnXDAnXSwic3RyaW5nIik7fX19CgkJaWYoL1x3Ly50ZXN0KGNoKSl7CgkJCXZhciBwPXN0cmVhbS5wb3M7CgkJCWlmKHN0cmVhbS5sb29rKC0yKT09InsiJiYoc3RyZWFtLmxvb2soMCk9PSJ9Inx8c3RyZWFtLmVhdFdoaWxlKC9cdy8pJiZzdHJlYW0ubG9vaygwKT09In0iKSkKCQkJCXJldHVybiAic3RyaW5nIjsKCQkJZWxzZQoJCQkJc3RyZWFtLnBvcz1wO30KCQlpZigvW0EtWl0vLnRlc3QoY2gpKXsKCQkJdmFyIGw9c3RyZWFtLmxvb2soLTIpOwoJCQl2YXIgcD1zdHJlYW0ucG9zOwoJCQlzdHJlYW0uZWF0V2hpbGUoL1tBLVpfXS8pOwoJCQlpZigvW1xkYS16XS8udGVzdChzdHJlYW0ubG9vaygwKSkpewoJCQkJc3RyZWFtLnBvcz1wO30KCQkJZWxzZXsKCQkJCXZhciBjPVBFUkxbc3RyZWFtLmN1cnJlbnQoKV07CgkJCQlpZighYykKCQkJCQlyZXR1cm4gIm1ldGEiOwoJCQkJaWYoY1sxXSkKCQkJCQljPWNbMF07CgkJCQlpZihsIT0iOiIpewoJCQkJCWlmKGM9PTEpCgkJCQkJCXJldHVybiAia2V5d29yZCI7CgkJCQkJZWxzZSBpZihjPT0yKQoJCQkJCQlyZXR1cm4gImRlZiI7CgkJCQkJZWxzZSBpZihjPT0zKQoJCQkJCQlyZXR1cm4gImF0b20iOwoJCQkJCWVsc2UgaWYoYz09NCkKCQkJCQkJcmV0dXJuICJvcGVyYXRvciI7CgkJCQkJZWxzZSBpZihjPT01KQoJCQkJCQlyZXR1cm4gInZhcmlhYmxlLTIiOwoJCQkJCWVsc2UKCQkJCQkJcmV0dXJuICJtZXRhIjt9CgkJCQllbHNlCgkJCQkJcmV0dXJuICJtZXRhIjt9fQoJCWlmKC9bYS16QS1aX10vLnRlc3QoY2gpKXsKCQkJdmFyIGw9c3RyZWFtLmxvb2soLTIpOwoJCQlzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CgkJCXZhciBjPVBFUkxbc3RyZWFtLmN1cnJlbnQoKV07CgkJCWlmKCFjKQoJCQkJcmV0dXJuICJtZXRhIjsKCQkJaWYoY1sxXSkKCQkJCWM9Y1swXTsKCQkJaWYobCE9IjoiKXsKCQkJCWlmKGM9PTEpCgkJCQkJcmV0dXJuICJrZXl3b3JkIjsKCQkJCWVsc2UgaWYoYz09MikKCQkJCQlyZXR1cm4gImRlZiI7CgkJCQllbHNlIGlmKGM9PTMpCgkJCQkJcmV0dXJuICJhdG9tIjsKCQkJCWVsc2UgaWYoYz09NCkKCQkJCQlyZXR1cm4gIm9wZXJhdG9yIjsKCQkJCWVsc2UgaWYoYz09NSkKCQkJCQlyZXR1cm4gInZhcmlhYmxlLTIiOwoJCQkJZWxzZQoJCQkJCXJldHVybiAibWV0YSI7fQoJCQllbHNlCgkJCQlyZXR1cm4gIm1ldGEiO30KCQlyZXR1cm4gbnVsbDt9CgoJcmV0dXJuewoJCXN0YXJ0U3RhdGU6ZnVuY3Rpb24oKXsKCQkJcmV0dXJuewoJCQkJdG9rZW5pemU6dG9rZW5QZXJsLAoJCQkJY2hhaW46bnVsbCwKCQkJCXN0eWxlOm51bGwsCgkJCQl0YWlsOm51bGx9O30sCgkJdG9rZW46ZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXsKCQkJcmV0dXJuIChzdGF0ZS50b2tlbml6ZXx8dG9rZW5QZXJsKShzdHJlYW0sc3RhdGUpO30sCgkJZWxlY3RyaWNDaGFyczoie30ifTt9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXBlcmwiLCAicGVybCIpOwoKLy8gaXQncyBsaWtlICJwZWVrIiwgYnV0IG5lZWQgZm9yIGxvb2stYWhlYWQgb3IgbG9vay1iZWhpbmQgaWYgaW5kZXggPCAwCkNvZGVNaXJyb3IuU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5sb29rPWZ1bmN0aW9uKGMpewoJcmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcysoY3x8MCkpO307CgovLyByZXR1cm4gYSBwYXJ0IG9mIHByZWZpeCBvZiBjdXJyZW50IHN0cmVhbSBmcm9tIGN1cnJlbnQgcG9zaXRpb24KQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0ucHJvdG90eXBlLnByZWZpeD1mdW5jdGlvbihjKXsKCWlmKGMpewoJCXZhciB4PXRoaXMucG9zLWM7CgkJcmV0dXJuIHRoaXMuc3RyaW5nLnN1YnN0cigoeD49MD94OjApLGMpO30KCWVsc2V7CgkJcmV0dXJuIHRoaXMuc3RyaW5nLnN1YnN0cigwLHRoaXMucG9zLTEpO319OwoKLy8gcmV0dXJuIGEgcGFydCBvZiBzdWZmaXggb2YgY3VycmVudCBzdHJlYW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uCkNvZGVNaXJyb3IuU3RyaW5nU3RyZWFtLnByb3RvdHlwZS5zdWZmaXg9ZnVuY3Rpb24oYyl7Cgl2YXIgeT10aGlzLnN0cmluZy5sZW5ndGg7Cgl2YXIgeD15LXRoaXMucG9zKzE7CglyZXR1cm4gdGhpcy5zdHJpbmcuc3Vic3RyKHRoaXMucG9zLChjJiZjPHk/Yzp4KSk7fTsKCi8vIHJldHVybiBhIHBhcnQgb2Ygc3VmZml4IG9mIGN1cnJlbnQgc3RyZWFtIGZyb20gY3VycmVudCBwb3NpdGlvbiBhbmQgY2hhbmdlIGN1cnJlbnQgcG9zaXRpb24KQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0ucHJvdG90eXBlLm5zdWZmaXg9ZnVuY3Rpb24oYyl7Cgl2YXIgcD10aGlzLnBvczsKCXZhciBsPWN8fCh0aGlzLnN0cmluZy5sZW5ndGgtdGhpcy5wb3MrMSk7Cgl0aGlzLnBvcys9bDsKCXJldHVybiB0aGlzLnN0cmluZy5zdWJzdHIocCxsKTt9OwoKLy8gZWF0aW5nIGFuZCB2b21pdGluZyBhIHBhcnQgb2Ygc3RyZWFtIGZyb20gY3VycmVudCBwb3NpdGlvbgpDb2RlTWlycm9yLlN0cmluZ1N0cmVhbS5wcm90b3R5cGUuZWF0U3VmZml4PWZ1bmN0aW9uKGMpewoJdmFyIHg9dGhpcy5wb3MrYzsKCXZhciB5OwoJaWYoeDw9MCkKCQl0aGlzLnBvcz0wOwoJZWxzZSBpZih4Pj0oeT10aGlzLnN0cmluZy5sZW5ndGgtMSkpCgkJdGhpcy5wb3M9eTsKCWVsc2UKCQl0aGlzLnBvcz14O307Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/php/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/php/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBIUCBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9jc3MvY3NzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9jbGlrZS9jbGlrZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0icGhwLmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBQSFAgbW9kZTwvaDE+Cgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo8P3BocApmdW5jdGlvbiBoZWxsbygkd2hvKSB7CglyZXR1cm4gIkhlbGxvICIgLiAkd2hvOwp9Cj8+CjxwPlRoZSBwcm9ncmFtIHNheXMgPD89IGhlbGxvKCJXb3JsZCIpID8+LjwvcD4KPHNjcmlwdD4KCWFsZXJ0KCJBbmQgaGVyZSBpcyBzb21lIEpTIGNvZGUiKTsgLy8gYWxzbyBjb2xvcmVkCjwvc2NyaXB0Pgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwIiwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlLAogICAgICAgIGVudGVyTW9kZTogImtlZXAiLAogICAgICAgIHRhYk1vZGU6ICJzaGlmdCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5TaW1wbGUgSFRNTC9QSFAgbW9kZSBiYXNlZCBvbgogICAgdGhlIDxhIGhyZWY9Ii4uL2NsaWtlLyI+Qy1saWtlPC9hPiBtb2RlLiBEZXBlbmRzIG9uIFhNTCwKICAgIEphdmFTY3JpcHQsIENTUywgSFRNTE1peGVkLCBhbmQgQy1saWtlIG1vZGVzLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24veC1odHRwZC1waHA8L2NvZGU+IChIVE1MIHdpdGggUEhQIGNvZGUpLCA8Y29kZT50ZXh0L3gtcGhwPC9jb2RlPiAocGxhaW4sIG5vbi13cmFwcGVkIFBIUCBjb2RlKS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/php/php.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIGZ1bmN0aW9uIGtleXdvcmRzKHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KICBmdW5jdGlvbiBoZXJlZG9jKGRlbGltKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKGRlbGltKSkgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICBlbHNlIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CiAgdmFyIHBocENvbmZpZyA9IHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczoga2V5d29yZHMoImFic3RyYWN0IGFuZCBhcnJheSBhcyBicmVhayBjYXNlIGNhdGNoIGNsYXNzIGNsb25lIGNvbnN0IGNvbnRpbnVlIGRlY2xhcmUgZGVmYXVsdCAiICsKICAgICAgICAgICAgICAgICAgICAgICAiZG8gZWxzZSBlbHNlaWYgZW5kZGVjbGFyZSBlbmRmb3IgZW5kZm9yZWFjaCBlbmRpZiBlbmRzd2l0Y2ggZW5kd2hpbGUgZXh0ZW5kcyBmaW5hbCAiICsKICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGZvcmVhY2ggZnVuY3Rpb24gZ2xvYmFsIGdvdG8gaWYgaW1wbGVtZW50cyBpbnRlcmZhY2UgaW5zdGFuY2VvZiBuYW1lc3BhY2UgIiArCiAgICAgICAgICAgICAgICAgICAgICAgIm5ldyBvciBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgc3RhdGljIHN3aXRjaCB0aHJvdyB0cmFpdCB0cnkgdXNlIHZhciB3aGlsZSB4b3IgIiArCiAgICAgICAgICAgICAgICAgICAgICAgImRpZSBlY2hvIGVtcHR5IGV4aXQgZXZhbCBpbmNsdWRlIGluY2x1ZGVfb25jZSBpc3NldCBsaXN0IHJlcXVpcmUgcmVxdWlyZV9vbmNlIHJldHVybiAiICsKICAgICAgICAgICAgICAgICAgICAgICAicHJpbnQgdW5zZXQgX19oYWx0X2NvbXBpbGVyIHNlbGYgc3RhdGljIHBhcmVudCIpLAogICAgYmxvY2tLZXl3b3Jkczoga2V5d29yZHMoImNhdGNoIGRvIGVsc2UgZWxzZWlmIGZvciBmb3JlYWNoIGlmIHN3aXRjaCB0cnkgd2hpbGUiKSwKICAgIGF0b21zOiBrZXl3b3JkcygidHJ1ZSBmYWxzZSBudWxsIFRSVUUgRkFMU0UgTlVMTCBfX0NMQVNTX18gX19ESVJfXyBfX0ZJTEVfXyBfX0xJTkVfXyBfX01FVEhPRF9fIF9fRlVOQ1RJT05fXyBfX05BTUVTUEFDRV9fIiksCiAgICBidWlsdGluOiBrZXl3b3JkcygiZnVuY19udW1fYXJncyBmdW5jX2dldF9hcmcgZnVuY19nZXRfYXJncyBzdHJsZW4gc3RyY21wIHN0cm5jbXAgc3RyY2FzZWNtcCBzdHJuY2FzZWNtcCBlYWNoIGVycm9yX3JlcG9ydGluZyBkZWZpbmUgZGVmaW5lZCB0cmlnZ2VyX2Vycm9yIHVzZXJfZXJyb3Igc2V0X2Vycm9yX2hhbmRsZXIgcmVzdG9yZV9lcnJvcl9oYW5kbGVyIGdldF9kZWNsYXJlZF9jbGFzc2VzIGdldF9sb2FkZWRfZXh0ZW5zaW9ucyBleHRlbnNpb25fbG9hZGVkIGdldF9leHRlbnNpb25fZnVuY3MgZGVidWdfYmFja3RyYWNlIGNvbnN0YW50IGJpbjJoZXggc2xlZXAgdXNsZWVwIHRpbWUgbWt0aW1lIGdtbWt0aW1lIHN0cmZ0aW1lIGdtc3RyZnRpbWUgc3RydG90aW1lIGRhdGUgZ21kYXRlIGdldGRhdGUgbG9jYWx0aW1lIGNoZWNrZGF0ZSBmbHVzaCB3b3Jkd3JhcCBodG1sc3BlY2lhbGNoYXJzIGh0bWxlbnRpdGllcyBodG1sX2VudGl0eV9kZWNvZGUgbWQ1IG1kNV9maWxlIGNyYzMyIGdldGltYWdlc2l6ZSBpbWFnZV90eXBlX3RvX21pbWVfdHlwZSBwaHBpbmZvIHBocHZlcnNpb24gcGhwY3JlZGl0cyBzdHJuYXRjbXAgc3RybmF0Y2FzZWNtcCBzdWJzdHJfY291bnQgc3Ryc3BuIHN0cmNzcG4gc3RydG9rIHN0cnRvdXBwZXIgc3RydG9sb3dlciBzdHJwb3Mgc3RycnBvcyBzdHJyZXYgaGVicmV2IGhlYnJldmMgbmwyYnIgYmFzZW5hbWUgZGlybmFtZSBwYXRoaW5mbyBzdHJpcHNsYXNoZXMgc3RyaXBjc2xhc2hlcyBzdHJzdHIgc3RyaXN0ciBzdHJyY2hyIHN0cl9zaHVmZmxlIHN0cl93b3JkX2NvdW50IHN0cmNvbGwgc3Vic3RyIHN1YnN0cl9yZXBsYWNlIHF1b3RlbWV0YSB1Y2ZpcnN0IHVjd29yZHMgc3RydHIgYWRkc2xhc2hlcyBhZGRjc2xhc2hlcyBydHJpbSBzdHJfcmVwbGFjZSBzdHJfcmVwZWF0IGNvdW50X2NoYXJzIGNodW5rX3NwbGl0IHRyaW0gbHRyaW0gc3RyaXBfdGFncyBzaW1pbGFyX3RleHQgZXhwbG9kZSBpbXBsb2RlIHNldGxvY2FsZSBsb2NhbGVjb252IHBhcnNlX3N0ciBzdHJfcGFkIGNob3Agc3RyY2hyIHNwcmludGYgcHJpbnRmIHZwcmludGYgdnNwcmludGYgc3NjYW5mIGZzY2FuZiBwYXJzZV91cmwgdXJsZW5jb2RlIHVybGRlY29kZSByYXd1cmxlbmNvZGUgcmF3dXJsZGVjb2RlIHJlYWRsaW5rIGxpbmtpbmZvIGxpbmsgdW5saW5rIGV4ZWMgc3lzdGVtIGVzY2FwZXNoZWxsY21kIGVzY2FwZXNoZWxsYXJnIHBhc3N0aHJ1IHNoZWxsX2V4ZWMgcHJvY19vcGVuIHByb2NfY2xvc2UgcmFuZCBzcmFuZCBnZXRyYW5kbWF4IG10X3JhbmQgbXRfc3JhbmQgbXRfZ2V0cmFuZG1heCBiYXNlNjRfZGVjb2RlIGJhc2U2NF9lbmNvZGUgYWJzIGNlaWwgZmxvb3Igcm91bmQgaXNfZmluaXRlIGlzX25hbiBpc19pbmZpbml0ZSBiaW5kZWMgaGV4ZGVjIG9jdGRlYyBkZWNiaW4gZGVjb2N0IGRlY2hleCBiYXNlX2NvbnZlcnQgbnVtYmVyX2Zvcm1hdCBmbW9kIGlwMmxvbmcgbG9uZzJpcCBnZXRlbnYgcHV0ZW52IGdldG9wdCBtaWNyb3RpbWUgZ2V0dGltZW9mZGF5IGdldHJ1c2FnZSB1bmlxaWQgcXVvdGVkX3ByaW50YWJsZV9kZWNvZGUgc2V0X3RpbWVfbGltaXQgZ2V0X2NmZ192YXIgbWFnaWNfcXVvdGVzX3J1bnRpbWUgc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGdldF9tYWdpY19xdW90ZXNfZ3BjIGdldF9tYWdpY19xdW90ZXNfcnVudGltZSBpbXBvcnRfcmVxdWVzdF92YXJpYWJsZXMgZXJyb3JfbG9nIHNlcmlhbGl6ZSB1bnNlcmlhbGl6ZSBtZW1vcnlfZ2V0X3VzYWdlIHZhcl9kdW1wIHZhcl9leHBvcnQgZGVidWdfenZhbF9kdW1wIHByaW50X3IgaGlnaGxpZ2h0X2ZpbGUgc2hvd19zb3VyY2UgaGlnaGxpZ2h0X3N0cmluZyBpbmlfZ2V0IGluaV9nZXRfYWxsIGluaV9zZXQgaW5pX2FsdGVyIGluaV9yZXN0b3JlIGdldF9pbmNsdWRlX3BhdGggc2V0X2luY2x1ZGVfcGF0aCByZXN0b3JlX2luY2x1ZGVfcGF0aCBzZXRjb29raWUgaGVhZGVyIGhlYWRlcnNfc2VudCBjb25uZWN0aW9uX2Fib3J0ZWQgY29ubmVjdGlvbl9zdGF0dXMgaWdub3JlX3VzZXJfYWJvcnQgcGFyc2VfaW5pX2ZpbGUgaXNfdXBsb2FkZWRfZmlsZSBtb3ZlX3VwbG9hZGVkX2ZpbGUgaW50dmFsIGZsb2F0dmFsIGRvdWJsZXZhbCBzdHJ2YWwgZ2V0dHlwZSBzZXR0eXBlIGlzX251bGwgaXNfcmVzb3VyY2UgaXNfYm9vbCBpc19sb25nIGlzX2Zsb2F0IGlzX2ludCBpc19pbnRlZ2VyIGlzX2RvdWJsZSBpc19yZWFsIGlzX251bWVyaWMgaXNfc3RyaW5nIGlzX2FycmF5IGlzX29iamVjdCBpc19zY2FsYXIgZXJlZyBlcmVnX3JlcGxhY2UgZXJlZ2kgZXJlZ2lfcmVwbGFjZSBzcGxpdCBzcGxpdGkgam9pbiBzcWxfcmVnY2FzZSBkbCBwY2xvc2UgcG9wZW4gcmVhZGZpbGUgcmV3aW5kIHJtZGlyIHVtYXNrIGZjbG9zZSBmZW9mIGZnZXRjIGZnZXRzIGZnZXRzcyBmcmVhZCBmb3BlbiBmcGFzc3RocnUgZnRydW5jYXRlIGZzdGF0IGZzZWVrIGZ0ZWxsIGZmbHVzaCBmd3JpdGUgZnB1dHMgbWtkaXIgcmVuYW1lIGNvcHkgdGVtcG5hbSB0bXBmaWxlIGZpbGUgZmlsZV9nZXRfY29udGVudHMgc3RyZWFtX3NlbGVjdCBzdHJlYW1fY29udGV4dF9jcmVhdGUgc3RyZWFtX2NvbnRleHRfc2V0X3BhcmFtcyBzdHJlYW1fY29udGV4dF9zZXRfb3B0aW9uIHN0cmVhbV9jb250ZXh0X2dldF9vcHRpb25zIHN0cmVhbV9maWx0ZXJfcHJlcGVuZCBzdHJlYW1fZmlsdGVyX2FwcGVuZCBmZ2V0Y3N2IGZsb2NrIGdldF9tZXRhX3RhZ3Mgc3RyZWFtX3NldF93cml0ZV9idWZmZXIgc2V0X2ZpbGVfYnVmZmVyIHNldF9zb2NrZXRfYmxvY2tpbmcgc3RyZWFtX3NldF9ibG9ja2luZyBzb2NrZXRfc2V0X2Jsb2NraW5nIHN0cmVhbV9nZXRfbWV0YV9kYXRhIHN0cmVhbV9yZWdpc3Rlcl93cmFwcGVyIHN0cmVhbV93cmFwcGVyX3JlZ2lzdGVyIHN0cmVhbV9zZXRfdGltZW91dCBzb2NrZXRfc2V0X3RpbWVvdXQgc29ja2V0X2dldF9zdGF0dXMgcmVhbHBhdGggZm5tYXRjaCBmc29ja29wZW4gcGZzb2Nrb3BlbiBwYWNrIHVucGFjayBnZXRfYnJvd3NlciBjcnlwdCBvcGVuZGlyIGNsb3NlZGlyIGNoZGlyIGdldGN3ZCByZXdpbmRkaXIgcmVhZGRpciBkaXIgZ2xvYiBmaWxlYXRpbWUgZmlsZWN0aW1lIGZpbGVncm91cCBmaWxlaW5vZGUgZmlsZW10aW1lIGZpbGVvd25lciBmaWxlcGVybXMgZmlsZXNpemUgZmlsZXR5cGUgZmlsZV9leGlzdHMgaXNfd3JpdGFibGUgaXNfd3JpdGVhYmxlIGlzX3JlYWRhYmxlIGlzX2V4ZWN1dGFibGUgaXNfZmlsZSBpc19kaXIgaXNfbGluayBzdGF0IGxzdGF0IGNob3duIHRvdWNoIGNsZWFyc3RhdGNhY2hlIG1haWwgb2Jfc3RhcnQgb2JfZmx1c2ggb2JfY2xlYW4gb2JfZW5kX2ZsdXNoIG9iX2VuZF9jbGVhbiBvYl9nZXRfZmx1c2ggb2JfZ2V0X2NsZWFuIG9iX2dldF9sZW5ndGggb2JfZ2V0X2xldmVsIG9iX2dldF9zdGF0dXMgb2JfZ2V0X2NvbnRlbnRzIG9iX2ltcGxpY2l0X2ZsdXNoIG9iX2xpc3RfaGFuZGxlcnMga3NvcnQga3Jzb3J0IG5hdHNvcnQgbmF0Y2FzZXNvcnQgYXNvcnQgYXJzb3J0IHNvcnQgcnNvcnQgdXNvcnQgdWFzb3J0IHVrc29ydCBzaHVmZmxlIGFycmF5X3dhbGsgY291bnQgZW5kIHByZXYgbmV4dCByZXNldCBjdXJyZW50IGtleSBtaW4gbWF4IGluX2FycmF5IGFycmF5X3NlYXJjaCBleHRyYWN0IGNvbXBhY3QgYXJyYXlfZmlsbCByYW5nZSBhcnJheV9tdWx0aXNvcnQgYXJyYXlfcHVzaCBhcnJheV9wb3AgYXJyYXlfc2hpZnQgYXJyYXlfdW5zaGlmdCBhcnJheV9zcGxpY2UgYXJyYXlfc2xpY2UgYXJyYXlfbWVyZ2UgYXJyYXlfbWVyZ2VfcmVjdXJzaXZlIGFycmF5X2tleXMgYXJyYXlfdmFsdWVzIGFycmF5X2NvdW50X3ZhbHVlcyBhcnJheV9yZXZlcnNlIGFycmF5X3JlZHVjZSBhcnJheV9wYWQgYXJyYXlfZmxpcCBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UgYXJyYXlfcmFuZCBhcnJheV91bmlxdWUgYXJyYXlfaW50ZXJzZWN0IGFycmF5X2ludGVyc2VjdF9hc3NvYyBhcnJheV9kaWZmIGFycmF5X2RpZmZfYXNzb2MgYXJyYXlfc3VtIGFycmF5X2ZpbHRlciBhcnJheV9tYXAgYXJyYXlfY2h1bmsgYXJyYXlfa2V5X2V4aXN0cyBwb3Mgc2l6ZW9mIGtleV9leGlzdHMgYXNzZXJ0IGFzc2VydF9vcHRpb25zIHZlcnNpb25fY29tcGFyZSBmdG9rIHN0cl9yb3QxMyBhZ2dyZWdhdGUgc2Vzc2lvbl9uYW1lIHNlc3Npb25fbW9kdWxlX25hbWUgc2Vzc2lvbl9zYXZlX3BhdGggc2Vzc2lvbl9pZCBzZXNzaW9uX3JlZ2VuZXJhdGVfaWQgc2Vzc2lvbl9kZWNvZGUgc2Vzc2lvbl9yZWdpc3RlciBzZXNzaW9uX3VucmVnaXN0ZXIgc2Vzc2lvbl9pc19yZWdpc3RlcmVkIHNlc3Npb25fZW5jb2RlIHNlc3Npb25fc3RhcnQgc2Vzc2lvbl9kZXN0cm95IHNlc3Npb25fdW5zZXQgc2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyIHNlc3Npb25fY2FjaGVfbGltaXRlciBzZXNzaW9uX2NhY2hlX2V4cGlyZSBzZXNzaW9uX3NldF9jb29raWVfcGFyYW1zIHNlc3Npb25fZ2V0X2Nvb2tpZV9wYXJhbXMgc2Vzc2lvbl93cml0ZV9jbG9zZSBwcmVnX21hdGNoIHByZWdfbWF0Y2hfYWxsIHByZWdfcmVwbGFjZSBwcmVnX3JlcGxhY2VfY2FsbGJhY2sgcHJlZ19zcGxpdCBwcmVnX3F1b3RlIHByZWdfZ3JlcCBvdmVybG9hZCBjdHlwZV9hbG51bSBjdHlwZV9hbHBoYSBjdHlwZV9jbnRybCBjdHlwZV9kaWdpdCBjdHlwZV9sb3dlciBjdHlwZV9ncmFwaCBjdHlwZV9wcmludCBjdHlwZV9wdW5jdCBjdHlwZV9zcGFjZSBjdHlwZV91cHBlciBjdHlwZV94ZGlnaXQgdmlydHVhbCBhcGFjaGVfcmVxdWVzdF9oZWFkZXJzIGFwYWNoZV9ub3RlIGFwYWNoZV9sb29rdXBfdXJpIGFwYWNoZV9jaGlsZF90ZXJtaW5hdGUgYXBhY2hlX3NldGVudiBhcGFjaGVfcmVzcG9uc2VfaGVhZGVycyBhcGFjaGVfZ2V0X3ZlcnNpb24gZ2V0YWxsaGVhZGVycyBteXNxbF9jb25uZWN0IG15c3FsX3Bjb25uZWN0IG15c3FsX2Nsb3NlIG15c3FsX3NlbGVjdF9kYiBteXNxbF9jcmVhdGVfZGIgbXlzcWxfZHJvcF9kYiBteXNxbF9xdWVyeSBteXNxbF91bmJ1ZmZlcmVkX3F1ZXJ5IG15c3FsX2RiX3F1ZXJ5IG15c3FsX2xpc3RfZGJzIG15c3FsX2xpc3RfdGFibGVzIG15c3FsX2xpc3RfZmllbGRzIG15c3FsX2xpc3RfcHJvY2Vzc2VzIG15c3FsX2Vycm9yIG15c3FsX2Vycm5vIG15c3FsX2FmZmVjdGVkX3Jvd3MgbXlzcWxfaW5zZXJ0X2lkIG15c3FsX3Jlc3VsdCBteXNxbF9udW1fcm93cyBteXNxbF9udW1fZmllbGRzIG15c3FsX2ZldGNoX3JvdyBteXNxbF9mZXRjaF9hcnJheSBteXNxbF9mZXRjaF9hc3NvYyBteXNxbF9mZXRjaF9vYmplY3QgbXlzcWxfZGF0YV9zZWVrIG15c3FsX2ZldGNoX2xlbmd0aHMgbXlzcWxfZmV0Y2hfZmllbGQgbXlzcWxfZmllbGRfc2VlayBteXNxbF9mcmVlX3Jlc3VsdCBteXNxbF9maWVsZF9uYW1lIG15c3FsX2ZpZWxkX3RhYmxlIG15c3FsX2ZpZWxkX2xlbiBteXNxbF9maWVsZF90eXBlIG15c3FsX2ZpZWxkX2ZsYWdzIG15c3FsX2VzY2FwZV9zdHJpbmcgbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nIG15c3FsX3N0YXQgbXlzcWxfdGhyZWFkX2lkIG15c3FsX2NsaWVudF9lbmNvZGluZyBteXNxbF9nZXRfY2xpZW50X2luZm8gbXlzcWxfZ2V0X2hvc3RfaW5mbyBteXNxbF9nZXRfcHJvdG9faW5mbyBteXNxbF9nZXRfc2VydmVyX2luZm8gbXlzcWxfaW5mbyBteXNxbCBteXNxbF9maWVsZG5hbWUgbXlzcWxfZmllbGR0YWJsZSBteXNxbF9maWVsZGxlbiBteXNxbF9maWVsZHR5cGUgbXlzcWxfZmllbGRmbGFncyBteXNxbF9zZWxlY3RkYiBteXNxbF9jcmVhdGVkYiBteXNxbF9kcm9wZGIgbXlzcWxfZnJlZXJlc3VsdCBteXNxbF9udW1maWVsZHMgbXlzcWxfbnVtcm93cyBteXNxbF9saXN0ZGJzIG15c3FsX2xpc3R0YWJsZXMgbXlzcWxfbGlzdGZpZWxkcyBteXNxbF9kYl9uYW1lIG15c3FsX2RibmFtZSBteXNxbF90YWJsZW5hbWUgbXlzcWxfdGFibGVfbmFtZSBwZ19jb25uZWN0IHBnX3Bjb25uZWN0IHBnX2Nsb3NlIHBnX2Nvbm5lY3Rpb25fc3RhdHVzIHBnX2Nvbm5lY3Rpb25fYnVzeSBwZ19jb25uZWN0aW9uX3Jlc2V0IHBnX2hvc3QgcGdfZGJuYW1lIHBnX3BvcnQgcGdfdHR5IHBnX29wdGlvbnMgcGdfcGluZyBwZ19xdWVyeSBwZ19zZW5kX3F1ZXJ5IHBnX2NhbmNlbF9xdWVyeSBwZ19mZXRjaF9yZXN1bHQgcGdfZmV0Y2hfcm93IHBnX2ZldGNoX2Fzc29jIHBnX2ZldGNoX2FycmF5IHBnX2ZldGNoX29iamVjdCBwZ19mZXRjaF9hbGwgcGdfYWZmZWN0ZWRfcm93cyBwZ19nZXRfcmVzdWx0IHBnX3Jlc3VsdF9zZWVrIHBnX3Jlc3VsdF9zdGF0dXMgcGdfZnJlZV9yZXN1bHQgcGdfbGFzdF9vaWQgcGdfbnVtX3Jvd3MgcGdfbnVtX2ZpZWxkcyBwZ19maWVsZF9uYW1lIHBnX2ZpZWxkX251bSBwZ19maWVsZF9zaXplIHBnX2ZpZWxkX3R5cGUgcGdfZmllbGRfcHJ0bGVuIHBnX2ZpZWxkX2lzX251bGwgcGdfZ2V0X25vdGlmeSBwZ19nZXRfcGlkIHBnX3Jlc3VsdF9lcnJvciBwZ19sYXN0X2Vycm9yIHBnX2xhc3Rfbm90aWNlIHBnX3B1dF9saW5lIHBnX2VuZF9jb3B5IHBnX2NvcHlfdG8gcGdfY29weV9mcm9tIHBnX3RyYWNlIHBnX3VudHJhY2UgcGdfbG9fY3JlYXRlIHBnX2xvX3VubGluayBwZ19sb19vcGVuIHBnX2xvX2Nsb3NlIHBnX2xvX3JlYWQgcGdfbG9fd3JpdGUgcGdfbG9fcmVhZF9hbGwgcGdfbG9faW1wb3J0IHBnX2xvX2V4cG9ydCBwZ19sb19zZWVrIHBnX2xvX3RlbGwgcGdfZXNjYXBlX3N0cmluZyBwZ19lc2NhcGVfYnl0ZWEgcGdfdW5lc2NhcGVfYnl0ZWEgcGdfY2xpZW50X2VuY29kaW5nIHBnX3NldF9jbGllbnRfZW5jb2RpbmcgcGdfbWV0YV9kYXRhIHBnX2NvbnZlcnQgcGdfaW5zZXJ0IHBnX3VwZGF0ZSBwZ19kZWxldGUgcGdfc2VsZWN0IHBnX2V4ZWMgcGdfZ2V0bGFzdG9pZCBwZ19jbWR0dXBsZXMgcGdfZXJyb3JtZXNzYWdlIHBnX251bXJvd3MgcGdfbnVtZmllbGRzIHBnX2ZpZWxkbmFtZSBwZ19maWVsZHNpemUgcGdfZmllbGR0eXBlIHBnX2ZpZWxkbnVtIHBnX2ZpZWxkcHJ0bGVuIHBnX2ZpZWxkaXNudWxsIHBnX2ZyZWVyZXN1bHQgcGdfcmVzdWx0IHBnX2xvcmVhZGFsbCBwZ19sb2NyZWF0ZSBwZ19sb3VubGluayBwZ19sb29wZW4gcGdfbG9jbG9zZSBwZ19sb3JlYWQgcGdfbG93cml0ZSBwZ19sb2ltcG9ydCBwZ19sb2V4cG9ydCBlY2hvIHByaW50IGdsb2JhbCBzdGF0aWMgZXhpdCBhcnJheSBlbXB0eSBldmFsIGlzc2V0IHVuc2V0IGRpZSBpbmNsdWRlIHJlcXVpcmUgaW5jbHVkZV9vbmNlIHJlcXVpcmVfb25jZSIpLAogICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSwKICAgIGhvb2tzOiB7CiAgICAgICIkIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgfSwKICAgICAgIjwiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvPDwvKSkgewogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaGVyZWRvYyhzdHJlYW0uY3VycmVudCgpLnNsaWNlKDMpKTsKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAogICAgICAiIyI6IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpICYmICFzdHJlYW0ubWF0Y2goIj8+IiwgZmFsc2UpKSBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0sCiAgICAgICIvIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgIXN0cmVhbS5tYXRjaCgiPz4iLCBmYWxzZSkpIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9OwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoInBocCIsIGZ1bmN0aW9uKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7CiAgICB2YXIgaHRtbE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAidGV4dC9odG1sIik7CiAgICB2YXIgcGhwTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHBocENvbmZpZyk7CgogICAgZnVuY3Rpb24gZGlzcGF0Y2goc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgaXNQSFAgPSBzdGF0ZS5jdXJNb2RlID09IHBocE1vZGU7CiAgICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RhdGUucGVuZGluZyAhPSAnIicpIHN0YXRlLnBlbmRpbmcgPSBudWxsOwogICAgICBpZiAoIWlzUEhQKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjxcP1x3Ki8pKSB7CiAgICAgICAgICBzdGF0ZS5jdXJNb2RlID0gcGhwTW9kZTsKICAgICAgICAgIHN0YXRlLmN1clN0YXRlID0gc3RhdGUucGhwOwogICAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlLnBlbmRpbmcgPT0gJyInKSB7CiAgICAgICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSAmJiBzdHJlYW0ubmV4dCgpICE9ICciJykge30KICAgICAgICAgIHZhciBzdHlsZSA9ICJzdHJpbmciOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUucGVuZGluZyAmJiBzdHJlYW0ucG9zIDwgc3RhdGUucGVuZGluZy5lbmQpIHsKICAgICAgICAgIHN0cmVhbS5wb3MgPSBzdGF0ZS5wZW5kaW5nLmVuZDsKICAgICAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnBlbmRpbmcuc3R5bGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBzdHlsZSA9IGh0bWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuY3VyU3RhdGUpOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5wZW5kaW5nID0gbnVsbDsKICAgICAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKSwgb3BlblBIUCA9IGN1ci5zZWFyY2goLzxcPy8pOwogICAgICAgIGlmIChvcGVuUEhQICE9IC0xKSB7CiAgICAgICAgICBpZiAoc3R5bGUgPT0gInN0cmluZyIgJiYgL1wiJC8udGVzdChjdXIpICYmICEvXD8+Ly50ZXN0KGN1cikpIHN0YXRlLnBlbmRpbmcgPSAnIic7CiAgICAgICAgICBlbHNlIHN0YXRlLnBlbmRpbmcgPSB7ZW5kOiBzdHJlYW0ucG9zLCBzdHlsZTogc3R5bGV9OwogICAgICAgICAgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoIC0gb3BlblBIUCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgfSBlbHNlIGlmIChpc1BIUCAmJiBzdGF0ZS5waHAudG9rZW5pemUgPT0gbnVsbCAmJiBzdHJlYW0ubWF0Y2goIj8+IikpIHsKICAgICAgICBzdGF0ZS5jdXJNb2RlID0gaHRtbE1vZGU7CiAgICAgICAgc3RhdGUuY3VyU3RhdGUgPSBzdGF0ZS5odG1sOwogICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBocE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5jdXJTdGF0ZSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaHRtbCA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShodG1sTW9kZSksIHBocCA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShwaHBNb2RlKTsKICAgICAgICByZXR1cm4ge2h0bWw6IGh0bWwsCiAgICAgICAgICAgICAgICBwaHA6IHBocCwKICAgICAgICAgICAgICAgIGN1ck1vZGU6IHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBwaHBNb2RlIDogaHRtbE1vZGUsCiAgICAgICAgICAgICAgICBjdXJTdGF0ZTogcGFyc2VyQ29uZmlnLnN0YXJ0T3BlbiA/IHBocCA6IGh0bWwsCiAgICAgICAgICAgICAgICBwZW5kaW5nOiBudWxsfTsKICAgICAgfSwKCiAgICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICB2YXIgaHRtbCA9IHN0YXRlLmh0bWwsIGh0bWxOZXcgPSBDb2RlTWlycm9yLmNvcHlTdGF0ZShodG1sTW9kZSwgaHRtbCksCiAgICAgICAgICAgIHBocCA9IHN0YXRlLnBocCwgcGhwTmV3ID0gQ29kZU1pcnJvci5jb3B5U3RhdGUocGhwTW9kZSwgcGhwKSwgY3VyOwogICAgICAgIGlmIChzdGF0ZS5jdXJNb2RlID09IGh0bWxNb2RlKSBjdXIgPSBodG1sTmV3OwogICAgICAgIGVsc2UgY3VyID0gcGhwTmV3OwogICAgICAgIHJldHVybiB7aHRtbDogaHRtbE5ldywgcGhwOiBwaHBOZXcsIGN1ck1vZGU6IHN0YXRlLmN1ck1vZGUsIGN1clN0YXRlOiBjdXIsCiAgICAgICAgICAgICAgICBwZW5kaW5nOiBzdGF0ZS5wZW5kaW5nfTsKICAgICAgfSwKCiAgICAgIHRva2VuOiBkaXNwYXRjaCwKCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICAgIGlmICgoc3RhdGUuY3VyTW9kZSAhPSBwaHBNb2RlICYmIC9eXHMqPFwvLy50ZXN0KHRleHRBZnRlcikpIHx8CiAgICAgICAgICAgIChzdGF0ZS5jdXJNb2RlID09IHBocE1vZGUgJiYgL15cPz4vLnRlc3QodGV4dEFmdGVyKSkpCiAgICAgICAgICByZXR1cm4gaHRtbE1vZGUuaW5kZW50KHN0YXRlLmh0bWwsIHRleHRBZnRlcik7CiAgICAgICAgcmV0dXJuIHN0YXRlLmN1ck1vZGUuaW5kZW50KHN0YXRlLmN1clN0YXRlLCB0ZXh0QWZ0ZXIpOwogICAgICB9LAoKICAgICAgZWxlY3RyaWNDaGFyczogIi97fToiLAoKICAgICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkgeyByZXR1cm4ge3N0YXRlOiBzdGF0ZS5jdXJTdGF0ZSwgbW9kZTogc3RhdGUuY3VyTW9kZX07IH0KICAgIH07CiAgfSwgImh0bWxtaXhlZCIpOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwIiwgInBocCIpOwogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1odHRwZC1waHAtb3BlbiIsIHtuYW1lOiAicGhwIiwgc3RhcnRPcGVuOiB0cnVlfSk7CiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcGhwIiwgcGhwQ29uZmlnKTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/pig/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/pig/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBpZyBMYXRpbiBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0icGlnLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyOiAycHggaW5zZXQgI2RlZTt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogUGlnIExhdGluIG1vZGU8L2gxPgoKPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS0gQXBhY2hlIFBpZyAoUGlnIExhdGluIExhbmd1YWdlKSBEZW1vCi8qIApUaGlzIGlzIGEgbXVsdGlsaW5lIGNvbW1lbnQuCiovCmEgPSBMT0FEICJccGF0aFx0b1xpbnB1dCIgVVNJTkcgUGlnU3RvcmFnZSgnXHQnKSBBUyAoeDpsb25nLCB5OmNoYXJhcnJheSwgejpieXRlYXJyYXkpOwpiID0gR1JPVVAgYSBCWSAoeCx5LDMrNCk7CmMgPSBGT1JFQUNIIGIgR0VORVJBVEUgZmxhdHRlbihncm91cCkgYXMgKHgseSksIFNVTShncm91cC4kMikgYXMgejsKU1RPUkUgYyBJTlRPICJccGF0aFx0b1xvdXRwdXQiOwoKLS0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtcGlnIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPgogICAgICAgIFNpbXBsZSBtb2RlIHRoYXQgaGFuZGxlcyBQaWcgTGF0aW4gbGFuZ3VhZ2UuCiAgICA8L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGUgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXBpZzwvY29kZT4KICAgIChQSUcgY29kZSkKPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/pig/pig.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICoJUGlnIExhdGluIE1vZGUgZm9yIENvZGVNaXJyb3IgMiAKICoJQGF1dGhvciBQcmFzYW50aCBKYXlhY2hhbmRyYW4KICoJQGxpbmsgCWh0dHBzOi8vZ2l0aHViLmNvbS9wcmFzYW50aGovcGlnLWNvZGVtaXJyb3ItMgogKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhZGFwdGVkIGZyb20gUEwvU1FMIG1vZGUgaW4gQ29kZU1pcnJvciAyLgoqLwpDb2RlTWlycm9yLmRlZmluZU1vZGUoInBpZyIsIGZ1bmN0aW9uKF9jb25maWcsIHBhcnNlckNvbmZpZykgewoJdmFyIGtleXdvcmRzID0gcGFyc2VyQ29uZmlnLmtleXdvcmRzLAoJCWJ1aWx0aW5zID0gcGFyc2VyQ29uZmlnLmJ1aWx0aW5zLAoJCXR5cGVzID0gcGFyc2VyQ29uZmlnLnR5cGVzLAoJCW11bHRpTGluZVN0cmluZ3MgPSBwYXJzZXJDb25maWcubXVsdGlMaW5lU3RyaW5nczsKCQoJdmFyIGlzT3BlcmF0b3JDaGFyID0gL1sqK1wtJTw+PSY/OlwvIXxdLzsKCQoJZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewoJCXN0YXRlLnRva2VuaXplID0gZjsKCQlyZXR1cm4gZihzdHJlYW0sIHN0YXRlKTsKCX0KCQoJdmFyIHR5cGU7CglmdW5jdGlvbiByZXQodHAsIHN0eWxlKSB7CgkJdHlwZSA9IHRwOwoJCXJldHVybiBzdHlsZTsKCX0KCQoJZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKCQl2YXIgaXNFbmQgPSBmYWxzZTsKCQl2YXIgY2g7CgkJd2hpbGUoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CgkJCWlmKGNoID09ICIvIiAmJiBpc0VuZCkgewoJCQkJc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CgkJCQlicmVhazsKCQkJfQoJCQlpc0VuZCA9IChjaCA9PSAiKiIpOwoJCX0KCQlyZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQiKTsKCX0KCQoJZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKCQlyZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewoJCQl2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKCQkJd2hpbGUoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CgkJCQlpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewoJCQkJCWVuZCA9IHRydWU7IGJyZWFrOwoJCQkJfQoJCQkJZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKCQkJfQoJCQlpZiAoZW5kIHx8ICEoZXNjYXBlZCB8fCBtdWx0aUxpbmVTdHJpbmdzKSkKCQkJCXN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwoJCQlyZXR1cm4gcmV0KCJzdHJpbmciLCAiZXJyb3IiKTsKCQl9OwoJfQoJCglmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewoJCXZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgkJCgkJLy8gaXMgYSBzdGFydCBvZiBzdHJpbmc/CgkJaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpCgkJCXJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblN0cmluZyhjaCkpOwoJCS8vIGlzIGl0IG9uZSBvZiB0aGUgc3BlY2lhbCBjaGFycwoJCWVsc2UgaWYoL1tcW1xde31cKFwpLDtcLl0vLnRlc3QoY2gpKQoJCQlyZXR1cm4gcmV0KGNoKTsKCQkvLyBpcyBpdCBhIG51bWJlcj8KCQllbHNlIGlmKC9cZC8udGVzdChjaCkpIHsKCQkJc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKCQkJcmV0dXJuIHJldCgibnVtYmVyIiwgIm51bWJlciIpOwoJCX0KCQkvLyBtdWx0aSBsaW5lIGNvbW1lbnQgb3Igb3BlcmF0b3IKCQllbHNlIGlmIChjaCA9PSAiLyIpIHsKCQkJaWYgKHN0cmVhbS5lYXQoIioiKSkgewoJCQkJcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuQ29tbWVudCk7CgkJCX0KCQkJZWxzZSB7CgkJCQlzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwoJCQkJcmV0dXJuIHJldCgib3BlcmF0b3IiLCAib3BlcmF0b3IiKTsKCQkJfQoJCX0KCQkvLyBzaW5nbGUgbGluZSBjb21tZW50IG9yIG9wZXJhdG9yCgkJZWxzZSBpZiAoY2g9PSItIikgewoJCQlpZihzdHJlYW0uZWF0KCItIikpewoJCQkJc3RyZWFtLnNraXBUb0VuZCgpOwoJCQkJcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CgkJCX0KCQkJZWxzZSB7CgkJCQlzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwoJCQkJcmV0dXJuIHJldCgib3BlcmF0b3IiLCAib3BlcmF0b3IiKTsKCQkJfQoJCX0KCQkvLyBpcyBpdCBhbiBvcGVyYXRvcgoJCWVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CgkJCXN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CgkJCXJldHVybiByZXQoIm9wZXJhdG9yIiwgIm9wZXJhdG9yIik7CgkJfQoJCWVsc2UgewoJCQkvLyBnZXQgdGhlIHdoaWxlIHdvcmQKCQkJc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CgkJCS8vIGlzIGl0IG9uZSBvZiB0aGUgbGlzdGVkIGtleXdvcmRzPwoJCQlpZiAoa2V5d29yZHMgJiYga2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKS50b1VwcGVyQ2FzZSgpKSkgewoJCQkJaWYgKHN0cmVhbS5lYXQoIikiKSB8fCBzdHJlYW0uZWF0KCIuIikpIHsKCQkJCQkvL2tleXdvcmRzIGNhbiBiZSB1c2VkIGFzIHZhcmlhYmxlcyBsaWtlIGZsYXR0ZW4oZ3JvdXApLCBncm91cC4kMCBldGMuLgoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuICgia2V5d29yZCIsICJrZXl3b3JkIik7CgkJCQl9CgkJCX0KCQkJLy8gaXMgaXQgb25lIG9mIHRoZSBidWlsdGluIGZ1bmN0aW9ucz8KCQkJaWYgKGJ1aWx0aW5zICYmIGJ1aWx0aW5zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9VcHBlckNhc2UoKSkpCgkJCXsKCQkJCXJldHVybiAoImtleXdvcmQiLCAidmFyaWFibGUtMiIpOwoJCQl9CgkJCS8vIGlzIGl0IG9uZSBvZiB0aGUgbGlzdGVkIHR5cGVzPwoJCQlpZiAodHlwZXMgJiYgdHlwZXMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKS50b1VwcGVyQ2FzZSgpKSkKCQkJCXJldHVybiAoImtleXdvcmQiLCAidmFyaWFibGUtMyIpOwoJCQkvLyBkZWZhdWx0IGlzIGEgJ3ZhcmlhYmxlJwoJCQlyZXR1cm4gcmV0KCJ2YXJpYWJsZSIsICJwaWctd29yZCIpOwoJCX0KCX0KCQoJLy8gSW50ZXJmYWNlCglyZXR1cm4gewoJCXN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gewoJCQkJdG9rZW5pemU6IHRva2VuQmFzZSwKCQkJCXN0YXJ0T2ZMaW5lOiB0cnVlCgkJCX07CgkJfSwKCQkKCQl0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewoJCQlpZihzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CgkJCXZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwoJCQlyZXR1cm4gc3R5bGU7CgkJfQoJfTsKfSk7CgooZnVuY3Rpb24oKSB7CglmdW5jdGlvbiBrZXl3b3JkcyhzdHIpIHsKCQl2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAJCXJldHVybiBvYmo7CiAJfQoKCS8vIGJ1aWx0aW4gZnVuY3MgdGFrZW4gZnJvbSB0cnVuayByZXZpc2lvbiAxMzAzMjM3Cgl2YXIgcEJ1aWx0aW5zID0gIkFCUyBBQ09TIEFSSVRZIEFTSU4gQVRBTiBBVkcgQkFHU0laRSBCSU5TVE9SQUdFIEJMT09NIEJVSUxEQkxPT00gQ0JSVCBDRUlMICIgCgkrICJDT05DQVQgQ09SIENPUyBDT1NIIENPVU5UIENPVU5UX1NUQVIgQ09WIENPTlNUQU5UU0laRSBDVUJFRElNRU5TSU9OUyBESUZGIERJU1RJTkNUIERPVUJMRUFCUyAiCgkrICJET1VCTEVBVkcgRE9VQkxFQkFTRSBET1VCTEVNQVggRE9VQkxFTUlOIERPVUJMRVJPVU5EIERPVUJMRVNVTSBFWFAgRkxPT1IgRkxPQVRBQlMgRkxPQVRBVkcgIgoJKyAiRkxPQVRNQVggRkxPQVRNSU4gRkxPQVRST1VORCBGTE9BVFNVTSBHRU5FUklDSU5WT0tFUiBJTkRFWE9GIElOVEFCUyBJTlRBVkcgSU5UTUFYIElOVE1JTiAiCgkrICJJTlRTVU0gSU5WT0tFRk9SRE9VQkxFIElOVk9LRUZPUkZMT0FUIElOVk9LRUZPUklOVCBJTlZPS0VGT1JMT05HIElOVk9LRUZPUlNUUklORyBJTlZPS0VSICIKCSsgIklTRU1QVFkgSlNPTkxPQURFUiBKU09OTUVUQURBVEEgSlNPTlNUT1JBR0UgTEFTVF9JTkRFWF9PRiBMQ0ZJUlNUIExPRyBMT0cxMCBMT1dFUiBMT05HQUJTICIKCSsgIkxPTkdBVkcgTE9OR01BWCBMT05HTUlOIExPTkdTVU0gTUFYIE1JTiBNQVBTSVpFIE1PTklUT1JFRFVERiBOT05ERVRFUk1JTklTVElDIE9VVFBVVFNDSEVNQSAgIgoJKyAiUElHU1RPUkFHRSBQSUdTVFJFQU1JTkcgUkFORE9NIFJFR0VYX0VYVFJBQ1QgUkVHRVhfRVhUUkFDVF9BTEwgUkVQTEFDRSBST1VORCBTSU4gU0lOSCBTSVpFICIKCSsgIlNRUlQgU1RSU1BMSVQgU1VCU1RSSU5HIFNVTSBTVFJJTkdDT05DQVQgU1RSSU5HTUFYIFNUUklOR01JTiBTVFJJTkdTSVpFIFRBTiBUQU5IIFRPQkFHICIKCSsgIlRPS0VOSVpFIFRPTUFQIFRPUCBUT1RVUExFIFRSSU0gVEVYVExPQURFUiBUVVBMRVNJWkUgVUNGSVJTVCBVUFBFUiBVVEY4U1RPUkFHRUNPTlZFUlRFUiAiOyAKCQoJLy8gdGFrZW4gZnJvbSBRdWVyeUxleGVyLmcKCXZhciBwS2V5d29yZHMgPSAiVk9JRCBJTVBPUlQgUkVUVVJOUyBERUZJTkUgTE9BRCBGSUxURVIgRk9SRUFDSCBPUkRFUiBDVUJFIERJU1RJTkNUIENPR1JPVVAgIgoJKyAiSk9JTiBDUk9TUyBVTklPTiBTUExJVCBJTlRPIElGIE9USEVSV0lTRSBBTEwgQVMgQlkgVVNJTkcgSU5ORVIgT1VURVIgT05TQ0hFTUEgUEFSQUxMRUwgIgoJKyAiUEFSVElUSU9OIEdST1VQIEFORCBPUiBOT1QgR0VORVJBVEUgRkxBVFRFTiBBU0MgREVTQyBJUyBTVFJFQU0gVEhST1VHSCBTVE9SRSBNQVBSRURVQ0UgIgoJKyAiU0hJUCBDQUNIRSBJTlBVVCBPVVRQVVQgU1RERVJST1IgU1RESU4gU1RET1VUIExJTUlUIFNBTVBMRSBMRUZUIFJJR0hUIEZVTEwgRVEgR1QgTFQgR1RFIExURSAiIAoJKyAiTkVRIE1BVENIRVMgVFJVRSBGQUxTRSAiOyAKCQoJLy8gZGF0YSB0eXBlcwoJdmFyIHBUeXBlcyA9ICJCT09MRUFOIElOVCBMT05HIEZMT0FUIERPVUJMRSBDSEFSQVJSQVkgQllURUFSUkFZIEJBRyBUVVBMRSBNQVAgIjsKCQoJQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcGlnIiwgewoJIG5hbWU6ICJwaWciLAoJIGJ1aWx0aW5zOiBrZXl3b3JkcyhwQnVpbHRpbnMpLAoJIGtleXdvcmRzOiBrZXl3b3JkcyhwS2V5d29yZHMpLAoJIHR5cGVzOiBrZXl3b3JkcyhwVHlwZXMpCgkgfSk7Cn0oKSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/plsql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/plsql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IE9yYWNsZSBQTC9TUUwgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InBsc3FsLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyOiAycHggaW5zZXQgI2RlZTt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogT3JhY2xlIFBML1NRTCBtb2RlPC9oMT4KCjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci0tIE9yYWNsZSBQTC9TUUwgQ29kZSBEZW1vCi8qCiAgIGJhc2VkIG9uIGMtbGlrZSBtb2RlLCBhZGFwdGVkIHRvIFBML1NRTCBieSBQZXRlciBSYWdhbml0c2NoICggaHR0cDovL3d3dy5vcmFjbGUtYW5kLWFwZXguY29tLyApCiAgIEFwcmlsIDIwMTEKKi8KREVDTEFSRQogICAgdklkeCAgICBOVU1CRVI7CiAgICB2U3RyaW5nIFZBUkNIQVIyKDEwMCk7CiAgICBjVGV4dCAgIENPTlNUQU5UIFZBUkNIQVIyKDEwMCkgOj0gJ1RoYXQnJ3MgaXQhIEhhdmUgZnVuIHdpdGggQ29kZU1pcnJvciAyJzsKQkVHSU4KICAgIHZJZHggOj0gMDsKICAgIC0tCiAgICBGT1IgckRBVEEgSU4KICAgICAgKCBTRUxFQ1QgKgogICAgICAgICAgRlJPTSBFTVAKICAgICAgICAgT1JERVIgQlkgRU1QTk8KICAgICAgKQogICAgTE9PUAogICAgICAgIHZJZHggICAgOj0gdklkeCArIDE7CiAgICAgICAgdlN0cmluZyA6PSByREFUQS5FTVBOTyB8fCAnIC0gJyB8fCByREFUQS5FTkFNRTsKICAgICAgICAtLQogICAgICAgIFVQREFURSBFTVAKICAgICAgICAgICBTRVQgU0FMICAgPSBTQUwgKiAxMDEvMTAwCiAgICAgICAgIFdIRVJFIEVNUE5PID0gckRBVEEuRU1QTk8KICAgICAgICA7CiAgICBFTkQgTE9PUDsKICAgIC0tCiAgICBTWVMuREJNU19PVVRQVVQuUHV0X0xpbmUgKGNUZXh0KTsKRU5EOwotLQo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgbW9kZTogInRleHQveC1wbHNxbCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD4KICAgICAgICBTaW1wbGUgbW9kZSB0aGF0IGhhbmRsZXMgT3JhY2xlIFBML1NRTCBsYW5ndWFnZSAoYW5kIE9yYWNsZSBTUUwsIG9mIGNvdXJzZSkuCiAgICA8L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGUgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXBsc3FsPC9jb2RlPgogICAgKFBMU1FMIGNvZGUpCjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/plsql/plsql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJwbHNxbCIsIGZ1bmN0aW9uKF9jb25maWcsIHBhcnNlckNvbmZpZykgewogIHZhciBrZXl3b3JkcyAgICAgICAgID0gcGFyc2VyQ29uZmlnLmtleXdvcmRzLAogICAgICBmdW5jdGlvbnMgICAgICAgID0gcGFyc2VyQ29uZmlnLmZ1bmN0aW9ucywKICAgICAgdHlwZXMgICAgICAgICAgICA9IHBhcnNlckNvbmZpZy50eXBlcywKICAgICAgc3FscGx1cyAgICAgICAgICA9IHBhcnNlckNvbmZpZy5zcWxwbHVzLAogICAgICBtdWx0aUxpbmVTdHJpbmdzID0gcGFyc2VyQ29uZmlnLm11bHRpTGluZVN0cmluZ3M7CiAgdmFyIGlzT3BlcmF0b3JDaGFyICAgPSAvWytcLSomJT08PiE/OlwvfF0vOwogIGZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIGYpIHsKICAgIHN0YXRlLnRva2VuaXplID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgdmFyIHR5cGU7CiAgZnVuY3Rpb24gcmV0KHRwLCBzdHlsZSkgewogICAgdHlwZSA9IHRwOwogICAgcmV0dXJuIHN0eWxlOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAvLyBzdGFydCBvZiBzdHJpbmc/CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoKSk7CiAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIHNwZWNpYWwgc2lnbnMgW117fSgpLiw7PyBTZXBlcmF0b3I/CiAgICBlbHNlIGlmICgvW1xbXF17fVwoXCksO1wuXS8udGVzdChjaCkpCiAgICAgIHJldHVybiByZXQoY2gpOwogICAgLy8gc3RhcnQgb2YgYSBudW1iZXIgdmFsdWU/CiAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIH0KICAgIC8vIG11bHRpIGxpbmUgY29tbWVudCBvciBzaW1wbGUgb3BlcmF0b3I/CiAgICBlbHNlIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlbkNvbW1lbnQpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgICAgcmV0dXJuIHJldCgib3BlcmF0b3IiLCAib3BlcmF0b3IiKTsKICAgICAgfQogICAgfQogICAgLy8gc2luZ2xlIGxpbmUgY29tbWVudCBvciBzaW1wbGUgb3BlcmF0b3I/CiAgICBlbHNlIGlmIChjaCA9PSAiLSIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIi0iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQiKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICAgIHJldHVybiByZXQoIm9wZXJhdG9yIiwgIm9wZXJhdG9yIik7CiAgICAgIH0KICAgIH0KICAgIC8vIHBsL3NxbCB2YXJpYWJsZT8KICAgIGVsc2UgaWYgKGNoID09ICJAIiB8fCBjaCA9PSAiJCIpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcZFwkX10vKTsKICAgICAgcmV0dXJuIHJldCgid29yZCIsICJ2YXJpYWJsZSIpOwogICAgfQogICAgLy8gaXMgaXQgYSBvcGVyYXRvcj8KICAgIGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiByZXQoIm9wZXJhdG9yIiwgIm9wZXJhdG9yIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLy8gZ2V0IHRoZSB3aG9sZSB3b3JkCiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIGxpc3RlZCBrZXl3b3Jkcz8KICAgICAgaWYgKGtleXdvcmRzICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKSkpIHJldHVybiByZXQoImtleXdvcmQiLCAia2V5d29yZCIpOwogICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIGxpc3RlZCBmdW5jdGlvbnM/CiAgICAgIGlmIChmdW5jdGlvbnMgJiYgZnVuY3Rpb25zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKSkpIHJldHVybiByZXQoImtleXdvcmQiLCAiYnVpbHRpbiIpOwogICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIGxpc3RlZCB0eXBlcz8KICAgICAgaWYgKHR5cGVzICYmIHR5cGVzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKSkpIHJldHVybiByZXQoImtleXdvcmQiLCAidmFyaWFibGUtMiIpOwogICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIGxpc3RlZCBzcWxwbHVzIGtleXdvcmRzPwogICAgICBpZiAoc3FscGx1cyAmJiBzcWxwbHVzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKSkpIHJldHVybiByZXQoImtleXdvcmQiLCAidmFyaWFibGUtMyIpOwogICAgICAvLyBkZWZhdWx0OiBqdXN0IGEgInZhcmlhYmxlIgogICAgICByZXR1cm4gcmV0KCJ3b3JkIiwgInZhcmlhYmxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIShlc2NhcGVkIHx8IG11bHRpTGluZVN0cmluZ3MpKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gcmV0KCJzdHJpbmciLCAicGxzcWwtc3RyaW5nIik7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgInBsc3FsLWNvbW1lbnQiKTsKICB9CgogIC8vIEludGVyZmFjZQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICBzdGFydE9mTGluZTogdHJ1ZQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQogIH07Cn0pOwoKKGZ1bmN0aW9uKCkgewogIGZ1bmN0aW9uIGtleXdvcmRzKHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KICB2YXIgY0tleXdvcmRzID0gImFib3J0IGFjY2VwdCBhY2Nlc3MgYWRkIGFsbCBhbHRlciBhbmQgYW55IGFycmF5IGFycmF5bGVuIGFzIGFzYyBhc3NlcnQgYXNzaWduIGF0IGF0dHJpYnV0ZXMgYXVkaXQgIiArCiAgICAgICAgImF1dGhvcml6YXRpb24gYXZnICIgKwogICAgICAgICJiYXNlX3RhYmxlIGJlZ2luIGJldHdlZW4gYmluYXJ5X2ludGVnZXIgYm9keSBib29sZWFuIGJ5ICIgKwogICAgICAgICJjYXNlIGNhc3QgY2hhciBjaGFyX2Jhc2UgY2hlY2sgY2xvc2UgY2x1c3RlciBjbHVzdGVycyBjb2xhdXRoIGNvbHVtbiBjb21tZW50IGNvbW1pdCBjb21wcmVzcyBjb25uZWN0ICIgKwogICAgICAgICJjb25uZWN0ZWQgY29uc3RhbnQgY29uc3RyYWludCBjcmFzaCBjcmVhdGUgY3VycmVudCBjdXJydmFsIGN1cnNvciAiICsKICAgICAgICAiZGF0YV9iYXNlIGRhdGFiYXNlIGRhdGUgZGJhIGRlYWxsb2NhdGUgZGVidWdvZmYgZGVidWdvbiBkZWNpbWFsIGRlY2xhcmUgZGVmYXVsdCBkZWZpbml0aW9uIGRlbGF5IGRlbGV0ZSAiICsKICAgICAgICAiZGVzYyBkaWdpdHMgZGlzcG9zZSBkaXN0aW5jdCBkbyBkcm9wICIgKwogICAgICAgICJlbHNlIGVsc2lmIGVuYWJsZSBlbmQgZW50cnkgZXNjYXBlIGV4Y2VwdGlvbiBleGNlcHRpb25faW5pdCBleGNoYW5nZSBleGNsdXNpdmUgZXhpc3RzIGV4aXQgZXh0ZXJuYWwgIiArCiAgICAgICAgImZhc3QgZmV0Y2ggZmlsZSBmb3IgZm9yY2UgZm9ybSBmcm9tIGZ1bmN0aW9uICIgKwogICAgICAgICJnZW5lcmljIGdvdG8gZ3JhbnQgZ3JvdXAgIiArCiAgICAgICAgImhhdmluZyAiICsKICAgICAgICAiaWRlbnRpZmllZCBpZiBpbW1lZGlhdGUgaW4gaW5jcmVtZW50IGluZGV4IGluZGV4ZXMgaW5kaWNhdG9yIGluaXRpYWwgaW5pdHJhbnMgaW5zZXJ0IGludGVyZmFjZSBpbnRlcnNlY3QgIiArCiAgICAgICAgImludG8gaXMgIiArCiAgICAgICAgImtleSAiICsKICAgICAgICAibGV2ZWwgbGlicmFyeSBsaWtlIGxpbWl0ZWQgbG9jYWwgbG9jayBsb2cgbG9nZ2luZyBsb25nIGxvb3AgIiArCiAgICAgICAgIm1hc3RlciBtYXhleHRlbnRzIG1heHRyYW5zIG1lbWJlciBtaW5leHRlbnRzIG1pbnVzIG1pc2xhYmVsIG1vZGUgbW9kaWZ5IG11bHRpc2V0ICIgKwogICAgICAgICJuZXcgbmV4dCBubyBub2F1ZGl0IG5vY29tcHJlc3Mgbm9sb2dnaW5nIG5vcGFyYWxsZWwgbm90IG5vd2FpdCBudW1iZXJfYmFzZSAiICsKICAgICAgICAib2JqZWN0IG9mIG9mZiBvZmZsaW5lIG9uIG9ubGluZSBvbmx5IG9wZW4gb3B0aW9uIG9yIG9yZGVyIG91dCAiICsKICAgICAgICAicGFja2FnZSBwYXJhbGxlbCBwYXJ0aXRpb24gcGN0ZnJlZSBwY3RpbmNyZWFzZSBwY3R1c2VkIHBsc19pbnRlZ2VyIHBvc2l0aXZlIHBvc2l0aXZlbiBwcmFnbWEgcHJpbWFyeSBwcmlvciAiICsKICAgICAgICAicHJpdmF0ZSBwcml2aWxlZ2VzIHByb2NlZHVyZSBwdWJsaWMgIiArCiAgICAgICAgInJhaXNlIHJhbmdlIHJhdyByZWFkIHJlYnVpbGQgcmVjb3JkIHJlZiByZWZlcmVuY2VzIHJlZnJlc2ggcmVsZWFzZSByZW5hbWUgcmVwbGFjZSByZXNvdXJjZSByZXN0cmljdCByZXR1cm4gIiArCiAgICAgICAgInJldHVybmluZyByZXZlcnNlIHJldm9rZSByb2xsYmFjayByb3cgcm93aWQgcm93bGFiZWwgcm93bnVtIHJvd3MgcnVuICIgKwogICAgICAgICJzYXZlcG9pbnQgc2NoZW1hIHNlZ21lbnQgc2VsZWN0IHNlcGFyYXRlIHNlc3Npb24gc2V0IHNoYXJlIHNuYXBzaG90IHNvbWUgc3BhY2Ugc3BsaXQgc3FsIHN0YXJ0IHN0YXRlbWVudCAiICsKICAgICAgICAic3RvcmFnZSBzdWJ0eXBlIHN1Y2Nlc3NmdWwgc3lub255bSAiICsKICAgICAgICAidGFiYXV0aCB0YWJsZSB0YWJsZXMgdGFibGVzcGFjZSB0YXNrIHRlcm1pbmF0ZSB0aGVuIHRvIHRyaWdnZXIgdHJ1bmNhdGUgdHlwZSAiICsKICAgICAgICAidW5pb24gdW5pcXVlIHVubGltaXRlZCB1bnJlY292ZXJhYmxlIHVudXNhYmxlIHVwZGF0ZSB1c2UgdXNpbmcgIiArCiAgICAgICAgInZhbGlkYXRlIHZhbHVlIHZhbHVlcyB2YXJpYWJsZSB2aWV3IHZpZXdzICIgKwogICAgICAgICJ3aGVuIHdoZW5ldmVyIHdoZXJlIHdoaWxlIHdpdGggd29yayI7CgogIHZhciBjRnVuY3Rpb25zID0gImFicyBhY29zIGFkZF9tb250aHMgYXNjaWkgYXNpbiBhdGFuIGF0YW4yIGF2ZXJhZ2UgIiArCiAgICAgICAgImJmaWxlbmFtZSAiICsKICAgICAgICAiY2VpbCBjaGFydG9yb3dpZCBjaHIgY29uY2F0IGNvbnZlcnQgY29zIGNvc2ggY291bnQgIiArCiAgICAgICAgImRlY29kZSBkZXJlZiBkdWFsIGR1bXAgZHVwX3ZhbF9vbl9pbmRleCAiICsKICAgICAgICAiZW1wdHkgZXJyb3IgZXhwICIgKwogICAgICAgICJmYWxzZSBmbG9vciBmb3VuZCAiICsKICAgICAgICAiZ2xiIGdyZWF0ZXN0ICIgKwogICAgICAgICJoZXh0b3JhdyAiICsKICAgICAgICAiaW5pdGNhcCBpbnN0ciBpbnN0cmIgaXNvcGVuICIgKwogICAgICAgICJsYXN0X2RheSBsZWFzdCBsZW5naHQgbGVuZ2h0YiBsbiBsb3dlciBscGFkIGx0cmltIGx1YiAiICsKICAgICAgICAibWFrZV9yZWYgbWF4IG1pbiBtb2QgbW9udGhzX2JldHdlZW4gIiArCiAgICAgICAgIm5ld190aW1lIG5leHRfZGF5IG5leHR2YWwgbmxzX2NoYXJzZXRfZGVjbF9sZW4gbmxzX2NoYXJzZXRfaWQgbmxzX2NoYXJzZXRfbmFtZSBubHNfaW5pdGNhcCBubHNfbG93ZXIgIiArCiAgICAgICAgIm5sc19zb3J0IG5sc191cHBlciBubHNzb3J0IG5vX2RhdGFfZm91bmQgbm90Zm91bmQgbnVsbCBudmwgIiArCiAgICAgICAgIm90aGVycyAiICsKICAgICAgICAicG93ZXIgIiArCiAgICAgICAgInJhd3RvaGV4IHJlZnRvaGV4IHJvdW5kIHJvd2NvdW50IHJvd2lkdG9jaGFyIHJwYWQgcnRyaW0gIiArCiAgICAgICAgInNpZ24gc2luIHNpbmggc291bmRleCBzcWxjb2RlIHNxbGVycm0gc3FydCBzdGRkZXYgc3Vic3RyIHN1YnN0cmIgc3VtIHN5c2RhdGUgIiArCiAgICAgICAgInRhbiB0YW5oIHRvX2NoYXIgdG9fZGF0ZSB0b19sYWJlbCB0b19tdWx0aV9ieXRlIHRvX251bWJlciB0b19zaW5nbGVfYnl0ZSB0cmFuc2xhdGUgdHJ1ZSB0cnVuYyAiICsKICAgICAgICAidWlkIHVwcGVyIHVzZXIgdXNlcmVudiAiICsKICAgICAgICAidmFyaWFuY2UgdnNpemUiOwoKICB2YXIgY1R5cGVzID0gImJmaWxlIGJsb2IgIiArCiAgICAgICAgImNoYXJhY3RlciBjbG9iICIgKwogICAgICAgICJkZWMgIiArCiAgICAgICAgImZsb2F0ICIgKwogICAgICAgICJpbnQgaW50ZWdlciAiICsKICAgICAgICAibWxzbGFiZWwgIiArCiAgICAgICAgIm5hdHVyYWwgbmF0dXJhbG4gbmNoYXIgbmNsb2IgbnVtYmVyIG51bWVyaWMgbnZhcmNoYXIyICIgKwogICAgICAgICJyZWFsIHJvd3R5cGUgIiArCiAgICAgICAgInNpZ250eXBlIHNtYWxsaW50IHN0cmluZyAiICsKICAgICAgICAidmFyY2hhciB2YXJjaGFyMiI7CgogIHZhciBjU3FscGx1cyA9ICJhcHBpbmZvIGFycmF5c2l6ZSBhdXRvY29tbWl0IGF1dG9wcmludCBhdXRvcmVjb3ZlcnkgYXV0b3RyYWNlICIgKwogICAgICAgICJibG9ja3Rlcm1pbmF0b3IgYnJlYWsgYnRpdGxlICIgKwogICAgICAgICJjbWRzZXAgY29sc2VwIGNvbXBhdGliaWxpdHkgY29tcHV0ZSBjb25jYXQgY29weWNvbW1pdCBjb3B5dHlwZWNoZWNrICIgKwogICAgICAgICJkZWZpbmUgZGVzY3JpYmUgIiArCiAgICAgICAgImVjaG8gZWRpdGZpbGUgZW1iZWRkZWQgZXNjYXBlIGV4ZWMgZXhlY3V0ZSAiICsKICAgICAgICAiZmVlZGJhY2sgZmxhZ2dlciBmbHVzaCAiICsKICAgICAgICAiaGVhZGluZyBoZWFkc2VwICIgKwogICAgICAgICJpbnN0YW5jZSAiICsKICAgICAgICAibGluZXNpemUgbG5vIGxvYm9mZnNldCBsb2dzb3VyY2UgbG9uZyBsb25nY2h1bmtzaXplICIgKwogICAgICAgICJtYXJrdXAgIiArCiAgICAgICAgIm5hdGl2ZSBuZXdwYWdlIG51bWZvcm1hdCBudW13aWR0aCAiICsKICAgICAgICAicGFnZXNpemUgcGF1c2UgcG5vICIgKwogICAgICAgICJyZWNzZXAgcmVjc2VwY2hhciByZWxlYXNlIHJlcGZvb3RlciByZXBoZWFkZXIgIiArCiAgICAgICAgInNlcnZlcm91dHB1dCBzaGlmdGlub3V0IHNob3cgc2hvd21vZGUgc2l6ZSBzcG9vbCBzcWxibGFua2xpbmVzIHNxbGNhc2Ugc3FsY29kZSBzcWxjb250aW51ZSBzcWxudW1iZXIgIiArCiAgICAgICAgInNxbHBsdXNjb21wYXRpYmlsaXR5IHNxbHByZWZpeCBzcWxwcm9tcHQgc3FsdGVybWluYXRvciBzdWZmaXggIiArCiAgICAgICAgInRhYiB0ZXJtIHRlcm1vdXQgdGltZSB0aW1pbmcgdHJpbW91dCB0cmltc3Bvb2wgdHRpdGxlICIgKwogICAgICAgICJ1bmRlcmxpbmUgIiArCiAgICAgICAgInZlcmlmeSB2ZXJzaW9uICIgKwogICAgICAgICJ3cmFwIjsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcGxzcWwiLCB7CiAgICBuYW1lOiAicGxzcWwiLAogICAga2V5d29yZHM6IGtleXdvcmRzKGNLZXl3b3JkcyksCiAgICBmdW5jdGlvbnM6IGtleXdvcmRzKGNGdW5jdGlvbnMpLAogICAgdHlwZXM6IGtleXdvcmRzKGNUeXBlcyksCiAgICBzcWxwbHVzOiBrZXl3b3JkcyhjU3FscGx1cykKICB9KTsKfSgpKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/properties/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/properties/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFByb3BlcnRpZXMgZmlsZXMgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InByb3BlcnRpZXMuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7fTwvc3R5bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFByb3BlcnRpZXMgZmlsZXMgbW9kZTwvaDE+CiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojIFRoaXMgaXMgYSBwcm9wZXJ0aWVzIGZpbGUKYS5rZXkgPSBBIHZhbHVlCmFub3RoZXIua2V5ID0gaHR0cDovL2V4YW1wbGUuY29tCiEgRXhjbGFtYXRpb24gbWFyayBhcyBjb21tZW50CmJ1dC5ub3Q9V2l0aGluICEgQSB2YWx1ZSAjIGluZGVlZAogICAjIFNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQogICBzcGFjZXMuYmVmb3JlLmtleT12YWx1ZQpiYWNrc2xhc2g9VXNlZCBmb3IgbXVsdGlcCiAgICAgICAgICBsaW5lIGVudHJpZXMsXAogICAgICAgICAgdGhhdCdzIGNvbnZlbmllbnQuCiMgVW5pY29kZSBzZXF1ZW5jZXMKdW5pY29kZS5rZXk9VGhpcyBpcyBcdTAwMjAgVW5pY29kZQpuby5tdWx0aWxpbmU9aGVyZQojIENvbG9ucwpjb2xvbnMgOiBjYW4gYmUgdXNlZCB0b28KIyBTcGFjZXMKc3BhY2VzXCBpblwga2V5cz1Ob3QgdmVyeSBjb21tb24uLi4KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1wcm9wZXJ0aWVzPC9jb2RlPiwKICAgIDxjb2RlPnRleHQveC1pbmk8L2NvZGU+LjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/properties/properties.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJwcm9wZXJ0aWVzIiwgZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCkgfHwgc3RhdGUuYWZ0ZXJTZWN0aW9uOwogICAgICB2YXIgZW9sID0gc3RyZWFtLmVvbCgpOwoKICAgICAgc3RhdGUuYWZ0ZXJTZWN0aW9uID0gZmFsc2U7CgogICAgICBpZiAoc29sKSB7CiAgICAgICAgaWYgKHN0YXRlLm5leHRNdWx0aWxpbmUpIHsKICAgICAgICAgIHN0YXRlLmluTXVsdGlsaW5lID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLm5leHRNdWx0aWxpbmUgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUucG9zaXRpb24gPSAiZGVmIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChlb2wgJiYgISBzdGF0ZS5uZXh0TXVsdGlsaW5lKSB7CiAgICAgICAgc3RhdGUuaW5NdWx0aWxpbmUgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9ICJkZWYiOwogICAgICB9CgogICAgICBpZiAoc29sKSB7CiAgICAgICAgd2hpbGUoc3RyZWFtLmVhdFNwYWNlKCkpOwogICAgICB9CgogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgaWYgKHNvbCAmJiAoY2ggPT09ICIjIiB8fCBjaCA9PT0gIiEiIHx8IGNoID09PSAiOyIpKSB7CiAgICAgICAgc3RhdGUucG9zaXRpb24gPSAiY29tbWVudCI7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0gZWxzZSBpZiAoc29sICYmIGNoID09PSAiWyIpIHsKICAgICAgICBzdGF0ZS5hZnRlclNlY3Rpb24gPSB0cnVlOwogICAgICAgIHN0cmVhbS5za2lwVG8oIl0iKTsgc3RyZWFtLmVhdCgiXSIpOwogICAgICAgIHJldHVybiAiaGVhZGVyIjsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gIj0iIHx8IGNoID09PSAiOiIpIHsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9ICJxdW90ZSI7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICJcXCIgJiYgc3RhdGUucG9zaXRpb24gPT09ICJxdW90ZSIpIHsKICAgICAgICBpZiAoc3RyZWFtLm5leHQoKSAhPT0gInUiKSB7ICAgIC8vIHUgPSBVbmljb2RlIHNlcXVlbmNlIFx1MTIzNAogICAgICAgICAgLy8gTXVsdGlsaW5lIHZhbHVlCiAgICAgICAgICBzdGF0ZS5uZXh0TXVsdGlsaW5lID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzdGF0ZS5wb3NpdGlvbjsKICAgIH0sCgogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcG9zaXRpb24gOiAiZGVmIiwgICAgICAgLy8gQ3VycmVudCBwb3NpdGlvbiwgImRlZiIsICJxdW90ZSIgb3IgImNvbW1lbnQiCiAgICAgICAgbmV4dE11bHRpbGluZSA6IGZhbHNlLCAgLy8gSXMgdGhlIG5leHQgbGluZSBtdWx0aWxpbmUgdmFsdWUKICAgICAgICBpbk11bHRpbGluZSA6IGZhbHNlLCAgICAvLyBJcyB0aGUgY3VycmVudCBsaW5lIGEgbXVsdGlsaW5lIHZhbHVlCiAgICAgICAgYWZ0ZXJTZWN0aW9uIDogZmFsc2UgICAgLy8gRGlkIHdlIGp1c3Qgb3BlbiBhIHNlY3Rpb24KICAgICAgfTsKICAgIH0KCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1wcm9wZXJ0aWVzIiwgInByb3BlcnRpZXMiKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaW5pIiwgInByb3BlcnRpZXMiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/python/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/python/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFB5dGhvbiBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0icHl0aG9uLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBQeXRob24gbW9kZTwvaDE+CiAgICAKICAgIDxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyBMaXRlcmFscwoxMjM0CjAuMGUxMDEKLjEyMwowYjAxMDEwMDExMTAwCjBvMDEyMzQ1NjcKMHgwOTg3NjU0MzIxYWJjZGVmCjcKMjE0NzQ4MzY0NwozTAo3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNkwKMHgxMDAwMDAwMDBMCjc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2CjB4ZGVhZGJlZWYKMy4xNGoKMTAuagoxMGoKLjAwMWoKMWUxMDBqCjMuMTRlLTEwagoKCiMgU3RyaW5nIExpdGVyYWxzCidGb3JcJycKIkdvZFwiIgoiIiJzbyBsb3ZlZAp0aGUgd29ybGQiIiIKJycndGhhdCBoZSBnYXZlCmhpcyBvbmx5IGJlZ290dGVuXCcgJycnCid0aGF0IHdob3NvZXZlciBiZWxpZXZldGggXAppbiBoaW0nCicnCgojIElkZW50aWZpZXJzCl9fYV9fCmEuYgphLmIuYwoKIyBPcGVyYXRvcnMKKyAtICogLyAlICYgfCBeIH4gPCA+Cj09ICE9IDw9ID49IDw+IDw8ID4+IC8vICoqCmFuZCBvciBub3QgaW4gaXMKCiMgRGVsaW1pdGVycwooKSBbXSB7fSAsIDogYCA9IDsgQCAuICAjIE5vdGUgdGhhdCBAIGFuZCAuIHJlcXVpcmUgdGhlIHByb3BlciBjb250ZXh0LgorPSAtPSAqPSAvPSAlPSAmPSB8PSBePQovLz0gPj49IDw8PSAqKj0KCiMgS2V5d29yZHMKYXMgYXNzZXJ0IGJyZWFrIGNsYXNzIGNvbnRpbnVlIGRlZiBkZWwgZWxpZiBlbHNlIGV4Y2VwdApmaW5hbGx5IGZvciBmcm9tIGdsb2JhbCBpZiBpbXBvcnQgbGFtYmRhIHBhc3MgcmFpc2UKcmV0dXJuIHRyeSB3aGlsZSB3aXRoIHlpZWxkCgojIFB5dGhvbiAyIEtleXdvcmRzIChvdGhlcndpc2UgSWRlbnRpZmllcnMpCmV4ZWMgcHJpbnQKCiMgUHl0aG9uIDMgS2V5d29yZHMgKG90aGVyd2lzZSBJZGVudGlmaWVycykKbm9ubG9jYWwKCiMgVHlwZXMKYm9vbCBjbGFzc21ldGhvZCBjb21wbGV4IGRpY3QgZW51bWVyYXRlIGZsb2F0IGZyb3plbnNldCBpbnQgbGlzdCBvYmplY3QKcHJvcGVydHkgcmV2ZXJzZWQgc2V0IHNsaWNlIHN0YXRpY21ldGhvZCBzdHIgc3VwZXIgdHVwbGUgdHlwZQoKIyBQeXRob24gMiBUeXBlcyAob3RoZXJ3aXNlIElkZW50aWZpZXJzKQpiYXNlc3RyaW5nIGJ1ZmZlciBmaWxlIGxvbmcgdW5pY29kZSB4cmFuZ2UKCiMgUHl0aG9uIDMgVHlwZXMgKG90aGVyd2lzZSBJZGVudGlmaWVycykKYnl0ZWFycmF5IGJ5dGVzIGZpbHRlciBtYXAgbWVtb3J5dmlldyBvcGVuIHJhbmdlIHppcAoKIyBTb21lIEV4YW1wbGUgY29kZQppbXBvcnQgb3MKZnJvbSBwYWNrYWdlIGltcG9ydCBQYXJlbnRDbGFzcwoKQG5vbnNlbnNlRGVjb3JhdG9yCmRlZiBkb2VzTm90aGluZygpOgogICAgcGFzcwoKY2xhc3MgRXhhbXBsZUNsYXNzKFBhcmVudENsYXNzKToKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBleGFtcGxlKGlucHV0U3RyKToKICAgICAgICBhID0gbGlzdChpbnB1dFN0cikKICAgICAgICBhLnJldmVyc2UoKQogICAgICAgIHJldHVybiAnJy5qb2luKGEpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1peGluID0gJ0hlbGxvJyk6CiAgICAgICAgc2VsZi5taXhpbiA9IG1peGluCgo8L3RleHRhcmVhPjwvZGl2PgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiB7bmFtZTogInB5dGhvbiIsCiAgICAgICAgICAgICAgIHZlcnNpb246IDIsCiAgICAgICAgICAgICAgIHNpbmdsZUxpbmVTdHJpbmdFcnJvcnM6IGZhbHNlfSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIHRhYk1vZGU6ICJzaGlmdCIsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgogICAgPGgyPkNvbmZpZ3VyYXRpb24gT3B0aW9uczo8L2gyPgogICAgPHVsPgogICAgICA8bGk+dmVyc2lvbiAtIDIvMyAtIFRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byByZWNvZ25pemUuICBEZWZhdWx0IGlzIDIuPC9saT4KICAgICAgPGxpPnNpbmdsZUxpbmVTdHJpbmdFcnJvcnMgLSB0cnVlL2ZhbHNlIC0gSWYgeW91IGhhdmUgYSBzaW5nbGUtbGluZSBzdHJpbmcgdGhhdCBpcyBub3QgdGVybWluYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCB0aGlzIHdpbGwgc2hvdyBzdWJzZXF1ZW50IGxpbmVzIGFzIGVycm9ycyBpZiB0cnVlLCBvdGhlcndpc2UgaXQgd2lsbCBjb25zaWRlciB0aGUgbmV3bGluZSBhcyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIERlZmF1bHQgaXMgZmFsc2UuPC9saT4KICAgIDwvdWw+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1weXRob248L2NvZGU+LjwvcD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/python/LICENSE.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[VGhlIE1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTAgVGltb3RoeSBGYXJyZWxsCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/python/python.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJweXRob24iLCBmdW5jdGlvbihjb25mLCBwYXJzZXJDb25mKSB7CiAgICB2YXIgRVJST1JDTEFTUyA9ICdlcnJvcic7CiAgICAKICAgIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXigoIiArIHdvcmRzLmpvaW4oIil8KCIpICsgIikpXFxiIik7CiAgICB9CiAgICAKICAgIHZhciBzaW5nbGVPcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeW1xcK1xcLVxcKi8lJnxcXF5+PD4hXSIpOwogICAgdmFyIHNpbmdsZURlbGltaXRlcnMgPSBuZXcgUmVnRXhwKCdeW1xcKFxcKVxcW1xcXVxce1xcfUAsOmA9O1xcLl0nKTsKICAgIHZhciBkb3VibGVPcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeKCg9PSl8KCE9KXwoPD0pfCg+PSl8KDw+KXwoPDwpfCg+Pil8KC8vKXwoXFwqXFwqKSkiKTsKICAgIHZhciBkb3VibGVEZWxpbWl0ZXJzID0gbmV3IFJlZ0V4cCgiXigoXFwrPSl8KFxcLT0pfChcXCo9KXwoJT0pfCgvPSl8KCY9KXwoXFx8PSl8KFxcXj0pKSIpOwogICAgdmFyIHRyaXBsZURlbGltaXRlcnMgPSBuZXcgUmVnRXhwKCJeKCgvLz0pfCg+Pj0pfCg8PD0pfChcXCpcXCo9KSkiKTsKICAgIHZhciBpZGVudGlmaWVycyA9IG5ldyBSZWdFeHAoIl5bX0EtWmEtel1bX0EtWmEtejAtOV0qIik7CgogICAgdmFyIHdvcmRPcGVyYXRvcnMgPSB3b3JkUmVnZXhwKFsnYW5kJywgJ29yJywgJ25vdCcsICdpcycsICdpbiddKTsKICAgIHZhciBjb21tb25rZXl3b3JkcyA9IFsnYXMnLCAnYXNzZXJ0JywgJ2JyZWFrJywgJ2NsYXNzJywgJ2NvbnRpbnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVmJywgJ2RlbCcsICdlbGlmJywgJ2Vsc2UnLCAnZXhjZXB0JywgJ2ZpbmFsbHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICdmb3InLCAnZnJvbScsICdnbG9iYWwnLCAnaWYnLCAnaW1wb3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFtYmRhJywgJ3Bhc3MnLCAncmFpc2UnLCAncmV0dXJuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAndHJ5JywgJ3doaWxlJywgJ3dpdGgnLCAneWllbGQnXTsKICAgIHZhciBjb21tb25CdWlsdGlucyA9IFsnYWJzJywgJ2FsbCcsICdhbnknLCAnYmluJywgJ2Jvb2wnLCAnYnl0ZWFycmF5JywgJ2NhbGxhYmxlJywgJ2NocicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzbWV0aG9kJywgJ2NvbXBpbGUnLCAnY29tcGxleCcsICdkZWxhdHRyJywgJ2RpY3QnLCAnZGlyJywgJ2Rpdm1vZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VudW1lcmF0ZScsICdldmFsJywgJ2ZpbHRlcicsICdmbG9hdCcsICdmb3JtYXQnLCAnZnJvemVuc2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2V0YXR0cicsICdnbG9iYWxzJywgJ2hhc2F0dHInLCAnaGFzaCcsICdoZWxwJywgJ2hleCcsICdpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lucHV0JywgJ2ludCcsICdpc2luc3RhbmNlJywgJ2lzc3ViY2xhc3MnLCAnaXRlcicsICdsZW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICdsaXN0JywgJ2xvY2FscycsICdtYXAnLCAnbWF4JywgJ21lbW9yeXZpZXcnLCAnbWluJywgJ25leHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnLCAnb2N0JywgJ29wZW4nLCAnb3JkJywgJ3BvdycsICdwcm9wZXJ0eScsICdyYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcHInLCAncmV2ZXJzZWQnLCAncm91bmQnLCAnc2V0JywgJ3NldGF0dHInLCAnc2xpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdzb3J0ZWQnLCAnc3RhdGljbWV0aG9kJywgJ3N0cicsICdzdW0nLCAnc3VwZXInLCAndHVwbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJywgJ3ZhcnMnLCAnemlwJywgJ19faW1wb3J0X18nLCAnTm90SW1wbGVtZW50ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdFbGxpcHNpcycsICdfX2RlYnVnX18nXTsKICAgIHZhciBweTIgPSB7J2J1aWx0aW5zJzogWydhcHBseScsICdiYXNlc3RyaW5nJywgJ2J1ZmZlcicsICdjbXAnLCAnY29lcmNlJywgJ2V4ZWNmaWxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlJywgJ2ludGVybicsICdsb25nJywgJ3Jhd19pbnB1dCcsICdyZWR1Y2UnLCAncmVsb2FkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmljaHInLCAndW5pY29kZScsICd4cmFuZ2UnLCAnRmFsc2UnLCAnVHJ1ZScsICdOb25lJ10sCiAgICAgICAgICAgICAgICdrZXl3b3Jkcyc6IFsnZXhlYycsICdwcmludCddfTsKICAgIHZhciBweTMgPSB7J2J1aWx0aW5zJzogWydhc2NpaScsICdieXRlcycsICdleGVjJywgJ3ByaW50J10sCiAgICAgICAgICAgICAgICdrZXl3b3Jkcyc6IFsnbm9ubG9jYWwnLCAnRmFsc2UnLCAnVHJ1ZScsICdOb25lJ119OwoKICAgIGlmICghIXBhcnNlckNvbmYudmVyc2lvbiAmJiBwYXJzZUludChwYXJzZXJDb25mLnZlcnNpb24sIDEwKSA9PT0gMykgewogICAgICAgIGNvbW1vbmtleXdvcmRzID0gY29tbW9ua2V5d29yZHMuY29uY2F0KHB5My5rZXl3b3Jkcyk7CiAgICAgICAgY29tbW9uQnVpbHRpbnMgPSBjb21tb25CdWlsdGlucy5jb25jYXQocHkzLmJ1aWx0aW5zKTsKICAgICAgICB2YXIgc3RyaW5nUHJlZml4ZXMgPSBuZXcgUmVnRXhwKCJeKChbcmJdfChicikpPygnezN9fFwiezN9fFsnXCJdKSkiLCAiaSIpOwogICAgfSBlbHNlIHsKICAgICAgICBjb21tb25rZXl3b3JkcyA9IGNvbW1vbmtleXdvcmRzLmNvbmNhdChweTIua2V5d29yZHMpOwogICAgICAgIGNvbW1vbkJ1aWx0aW5zID0gY29tbW9uQnVpbHRpbnMuY29uY2F0KHB5Mi5idWlsdGlucyk7CiAgICAgICAgdmFyIHN0cmluZ1ByZWZpeGVzID0gbmV3IFJlZ0V4cCgiXigoW3J1Yl18KHVyKXwoYnIpKT8oJ3szfXxcInszfXxbJ1wiXSkpIiwgImkiKTsKICAgIH0KICAgIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoY29tbW9ua2V5d29yZHMpOwogICAgdmFyIGJ1aWx0aW5zID0gd29yZFJlZ2V4cChjb21tb25CdWlsdGlucyk7CgogICAgdmFyIGluZGVudEluZm8gPSBudWxsOwoKICAgIC8vIHRva2VuaXplcnMKICAgIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgLy8gSGFuZGxlIHNjb3BlIGNoYW5nZXMKICAgICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgIHZhciBzY29wZU9mZnNldCA9IHN0YXRlLnNjb3Blc1swXS5vZmZzZXQ7CiAgICAgICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgICAgICAgICAgdmFyIGxpbmVPZmZzZXQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0ID4gc2NvcGVPZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICBpbmRlbnRJbmZvID0gJ2luZGVudCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmVPZmZzZXQgPCBzY29wZU9mZnNldCkgewogICAgICAgICAgICAgICAgICAgIGluZGVudEluZm8gPSAnZGVkZW50JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHNjb3BlT2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgICAgIGRlZGVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CiAgICAgICAgCiAgICAgICAgLy8gSGFuZGxlIENvbW1lbnRzCiAgICAgICAgaWYgKGNoID09PSAnIycpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBIYW5kbGUgTnVtYmVyIExpdGVyYWxzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlswLTlcLl0vLCBmYWxzZSkpIHsKICAgICAgICAgICAgdmFyIGZsb2F0TGl0ZXJhbCA9IGZhbHNlOwogICAgICAgICAgICAvLyBGbG9hdHMKICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxkKlwuXGQrKGVbXCtcLV0/XGQrKT8vaSkpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXGQrXC5cZCovKSkgeyBmbG9hdExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cLlxkKy8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgaWYgKGZsb2F0TGl0ZXJhbCkgewogICAgICAgICAgICAgICAgLy8gRmxvYXQgbGl0ZXJhbHMgbWF5IGJlICJpbWFnaW5hcnkiCiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KC9KL2kpOwogICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEludGVnZXJzCiAgICAgICAgICAgIHZhciBpbnRMaXRlcmFsID0gZmFsc2U7CiAgICAgICAgICAgIC8vIEhleAogICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMHhbMC05YS1mXSsvaSkpIHsgaW50TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgLy8gQmluYXJ5CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14wYlswMV0rL2kpKSB7IGludExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgICAgIC8vIE9jdGFsCiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14wb1swLTddKy9pKSkgeyBpbnRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICAvLyBEZWNpbWFsCiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bMS05XVxkKihlW1wrXC1dP1xkKyk/LykpIHsKICAgICAgICAgICAgICAgIC8vIERlY2ltYWwgbGl0ZXJhbHMgbWF5IGJlICJpbWFnaW5hcnkiCiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KC9KL2kpOwogICAgICAgICAgICAgICAgLy8gVE9ETyAtIENhbiB5b3UgaGF2ZSBpbWFnaW5hcnkgbG9uZ3M/CiAgICAgICAgICAgICAgICBpbnRMaXRlcmFsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBaZXJvIGJ5IGl0c2VsZiB3aXRoIG5vIG90aGVyIHBpZWNlIG9mIG51bWJlci4KICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjAoPyFbXGR4XSkvaSkpIHsgaW50TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgaWYgKGludExpdGVyYWwpIHsKICAgICAgICAgICAgICAgIC8vIEludGVnZXIgbGl0ZXJhbHMgbWF5IGJlICJsb25nIgogICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvTC9pKTsKICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBIYW5kbGUgU3RyaW5ncwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goc3RyaW5nUHJlZml4ZXMpKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmdGYWN0b3J5KHN0cmVhbS5jdXJyZW50KCkpOwogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIEhhbmRsZSBvcGVyYXRvcnMgYW5kIERlbGltaXRlcnMKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHRyaXBsZURlbGltaXRlcnMpIHx8IHN0cmVhbS5tYXRjaChkb3VibGVEZWxpbWl0ZXJzKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChkb3VibGVPcGVyYXRvcnMpCiAgICAgICAgICAgIHx8IHN0cmVhbS5tYXRjaChzaW5nbGVPcGVyYXRvcnMpCiAgICAgICAgICAgIHx8IHN0cmVhbS5tYXRjaCh3b3JkT3BlcmF0b3JzKSkgewogICAgICAgICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChzaW5nbGVEZWxpbWl0ZXJzKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChidWlsdGlucykpIHsKICAgICAgICAgICAgcmV0dXJuICdidWlsdGluJzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChpZGVudGlmaWVycykpIHsKICAgICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIEhhbmRsZSBub24tZGV0ZWN0ZWQgaXRlbXMKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgfQogICAgCiAgICBmdW5jdGlvbiB0b2tlblN0cmluZ0ZhY3RvcnkoZGVsaW1pdGVyKSB7CiAgICAgICAgd2hpbGUgKCdydWInLmluZGV4T2YoZGVsaW1pdGVyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKSA+PSAwKSB7CiAgICAgICAgICAgIGRlbGltaXRlciA9IGRlbGltaXRlci5zdWJzdHIoMSk7CiAgICAgICAgfQogICAgICAgIHZhciBzaW5nbGVsaW5lID0gZGVsaW1pdGVyLmxlbmd0aCA9PSAxOwogICAgICAgIHZhciBPVVRDTEFTUyA9ICdzdHJpbmcnOwogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14nIlxcXS8pOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXQoJ1xcJykpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChzaW5nbGVsaW5lICYmIHN0cmVhbS5lb2woKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1VUQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goZGVsaW1pdGVyKSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvWyciXS8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzaW5nbGVsaW5lKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyc2VyQ29uZi5zaW5nbGVMaW5lU3RyaW5nRXJyb3JzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgICAgICB9CiAgICAgICAgdG9rZW5TdHJpbmcuaXNTdHJpbmcgPSB0cnVlOwogICAgICAgIHJldHVybiB0b2tlblN0cmluZzsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gaW5kZW50KHN0cmVhbSwgc3RhdGUsIHR5cGUpIHsKICAgICAgICB0eXBlID0gdHlwZSB8fCAncHknOwogICAgICAgIHZhciBpbmRlbnRVbml0ID0gMDsKICAgICAgICBpZiAodHlwZSA9PT0gJ3B5JykgewogICAgICAgICAgICBpZiAoc3RhdGUuc2NvcGVzWzBdLnR5cGUgIT09ICdweScpIHsKICAgICAgICAgICAgICAgIHN0YXRlLnNjb3Blc1swXS5vZmZzZXQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLnNjb3Blcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgaWYgKHN0YXRlLnNjb3Blc1tpXS50eXBlID09PSAncHknKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZW50VW5pdCA9IHN0YXRlLnNjb3Blc1tpXS5vZmZzZXQgKyBjb25mLmluZGVudFVuaXQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbmRlbnRVbml0ID0gc3RyZWFtLmNvbHVtbigpICsgc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHN0YXRlLnNjb3Blcy51bnNoaWZ0KHsKICAgICAgICAgICAgb2Zmc2V0OiBpbmRlbnRVbml0LAogICAgICAgICAgICB0eXBlOiB0eXBlCiAgICAgICAgfSk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGRlZGVudChzdHJlYW0sIHN0YXRlLCB0eXBlKSB7CiAgICAgICAgdHlwZSA9IHR5cGUgfHwgJ3B5JzsKICAgICAgICBpZiAoc3RhdGUuc2NvcGVzLmxlbmd0aCA9PSAxKSByZXR1cm47CiAgICAgICAgaWYgKHN0YXRlLnNjb3Blc1swXS50eXBlID09PSAncHknKSB7CiAgICAgICAgICAgIHZhciBfaW5kZW50ID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgICAgIHZhciBfaW5kZW50X2luZGV4ID0gLTE7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUuc2NvcGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICBpZiAoX2luZGVudCA9PT0gc3RhdGUuc2NvcGVzW2ldLm9mZnNldCkgewogICAgICAgICAgICAgICAgICAgIF9pbmRlbnRfaW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChfaW5kZW50X2luZGV4ID09PSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0YXRlLnNjb3Blc1swXS5vZmZzZXQgIT09IF9pbmRlbnQpIHsKICAgICAgICAgICAgICAgIHN0YXRlLnNjb3Blcy5zaGlmdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3B5JykgewogICAgICAgICAgICAgICAgc3RhdGUuc2NvcGVzWzBdLm9mZnNldCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHN0YXRlLnNjb3Blc1swXS50eXBlICE9IHR5cGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLnNjb3Blcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGluZGVudEluZm8gPSBudWxsOwogICAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIHZhciBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAgICAgLy8gSGFuZGxlICcuJyBjb25uZWN0ZWQgaWRlbnRpZmllcnMKICAgICAgICBpZiAoY3VycmVudCA9PT0gJy4nKSB7CiAgICAgICAgICAgIHN0eWxlID0gc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzLCBmYWxzZSkgPyBudWxsIDogRVJST1JDTEFTUzsKICAgICAgICAgICAgaWYgKHN0eWxlID09PSBudWxsICYmIHN0YXRlLmxhc3RUb2tlbiA9PT0gJ21ldGEnKSB7CiAgICAgICAgICAgICAgICAvLyBBcHBseSAnbWV0YScgc3R5bGUgdG8gJy4nIGNvbm5lY3RlZCBpZGVudGlmaWVycyB3aGVuCiAgICAgICAgICAgICAgICAvLyBhcHByb3ByaWF0ZS4KICAgICAgICAgICAgICAgIHN0eWxlID0gJ21ldGEnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gSGFuZGxlIGRlY29yYXRvcnMKICAgICAgICBpZiAoY3VycmVudCA9PT0gJ0AnKSB7CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMsIGZhbHNlKSA/ICdtZXRhJyA6IEVSUk9SQ0xBU1M7CiAgICAgICAgfQoKICAgICAgICBpZiAoKHN0eWxlID09PSAndmFyaWFibGUnIHx8IHN0eWxlID09PSAnYnVpbHRpbicpCiAgICAgICAgICAgICYmIHN0YXRlLmxhc3RUb2tlbiA9PT0gJ21ldGEnKSB7CiAgICAgICAgICAgIHN0eWxlID0gJ21ldGEnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcy4KICAgICAgICBpZiAoY3VycmVudCA9PT0gJ3Bhc3MnIHx8IGN1cnJlbnQgPT09ICdyZXR1cm4nKSB7CiAgICAgICAgICAgIHN0YXRlLmRlZGVudCArPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoY3VycmVudCA9PT0gJ2xhbWJkYScpIHN0YXRlLmxhbWJkYSA9IHRydWU7CiAgICAgICAgaWYgKChjdXJyZW50ID09PSAnOicgJiYgIXN0YXRlLmxhbWJkYSAmJiBzdGF0ZS5zY29wZXNbMF0udHlwZSA9PSAncHknKQogICAgICAgICAgICB8fCBpbmRlbnRJbmZvID09PSAnaW5kZW50JykgewogICAgICAgICAgICBpbmRlbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIHZhciBkZWxpbWl0ZXJfaW5kZXggPSAnWyh7Jy5pbmRleE9mKGN1cnJlbnQpOwogICAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIGluZGVudChzdHJlYW0sIHN0YXRlLCAnXSl9Jy5zbGljZShkZWxpbWl0ZXJfaW5kZXgsIGRlbGltaXRlcl9pbmRleCsxKSk7CiAgICAgICAgfQogICAgICAgIGlmIChpbmRlbnRJbmZvID09PSAnZGVkZW50JykgewogICAgICAgICAgICBpZiAoZGVkZW50KHN0cmVhbSwgc3RhdGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkZWxpbWl0ZXJfaW5kZXggPSAnXSl9Jy5pbmRleE9mKGN1cnJlbnQpOwogICAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIGlmIChkZWRlbnQoc3RyZWFtLCBzdGF0ZSwgY3VycmVudCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5kZWRlbnQgPiAwICYmIHN0cmVhbS5lb2woKSAmJiBzdGF0ZS5zY29wZXNbMF0udHlwZSA9PSAncHknKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5zY29wZXMubGVuZ3RoID4gMSkgc3RhdGUuc2NvcGVzLnNoaWZ0KCk7CiAgICAgICAgICAgIHN0YXRlLmRlZGVudCAtPSAxOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gc3R5bGU7CiAgICB9CgogICAgdmFyIGV4dGVybmFsID0gewogICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgICAgICAgIHNjb3BlczogW3tvZmZzZXQ6YmFzZWNvbHVtbiB8fCAwLCB0eXBlOidweSd9XSwKICAgICAgICAgICAgICBsYXN0VG9rZW46IG51bGwsCiAgICAgICAgICAgICAgbGFtYmRhOiBmYWxzZSwKICAgICAgICAgICAgICBkZWRlbnQ6IDAKICAgICAgICAgIH07CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICB2YXIgc3R5bGUgPSB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpOwogICAgICAgICAgICAKICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuID0gc3R5bGU7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoc3RyZWFtLmVvbCgpICYmIHN0cmVhbS5sYW1iZGEpIHsKICAgICAgICAgICAgICAgIHN0YXRlLmxhbWJkYSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZS5pc1N0cmluZyA/IENvZGVNaXJyb3IuUGFzcyA6IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zY29wZXNbMF0ub2Zmc2V0OwogICAgICAgIH0KICAgICAgICAKICAgIH07CiAgICByZXR1cm4gZXh0ZXJuYWw7Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcHl0aG9uIiwgInB5dGhvbiIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/r/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/r/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFIgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InIuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPgogICAgICAuQ29kZU1pcnJvciB7IGJvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBzaWx2ZXI7IH0KICAgICAgLmNtLXMtZGVmYXVsdCBzcGFuLmNtLXNlbWkgeyBjb2xvcjogYmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KICAgICAgLmNtLXMtZGVmYXVsdCBzcGFuLmNtLWRvbGxhciB7IGNvbG9yOiBvcmFuZ2U7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgICAgIC5jbS1zLWRlZmF1bHQgc3Bhbi5jbS1hcnJvdyB7IGNvbG9yOiBicm93bjsgfQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tYXJnLWlzIHsgY29sb3I6IGJyb3duOyB9CiAgICA8L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBSIG1vZGU8L2gxPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyBDb2RlIGZyb20gaHR0cDovL3d3dy5tYXlpbi5vcmcvYWpheXNoYWgvS0IvUi8KCiMgRklSU1QgTEVBUk4gQUJPVVQgTElTVFMgLS0KWCA9IGxpc3QoaGVpZ2h0PTUuNCwgd2VpZ2h0PTU0KQpwcmludCgiVXNlIGRlZmF1bHQgcHJpbnRpbmcgLS0iKQpwcmludChYKQpwcmludCgiQWNjZXNzaW5nIGluZGl2aWR1YWwgZWxlbWVudHMgLS0iKQpjYXQoIllvdXIgaGVpZ2h0IGlzICIsIFgkaGVpZ2h0LCAiIGFuZCB5b3VyIHdlaWdodCBpcyAiLCBYJHdlaWdodCwgIlxuIikKCiMgRlVOQ1RJT05TIC0tCnNxdWFyZSA8LSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuKHgqeCkKfQpjYXQoIlRoZSBzcXVhcmUgb2YgMyBpcyAiLCBzcXVhcmUoMyksICJcbiIpCgogICAgICAgICAgICAgICAgICMgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYXJnIGlzIHNldCB0byA1LgpjdWJlIDwtIGZ1bmN0aW9uKHg9NSkgewogIHJldHVybih4KngqeCk7Cn0KY2F0KCJDYWxsaW5nIGN1YmUgd2l0aCAyIDogIiwgY3ViZSgyKSwgIlxuIikgICAgIyB3aWxsIGdpdmUgMl4zCmNhdCgiQ2FsbGluZyBjdWJlICAgICAgICA6ICIsIGN1YmUoKSwgIlxuIikgICAgICMgd2lsbCBkZWZhdWx0IHRvIDVeMy4KCiMgTEVBUk4gQUJPVVQgRlVOQ1RJT05TIFRIQVQgUkVUVVJOIE1VTFRJUExFIE9CSkVDVFMgLS0KcG93ZXJzIDwtIGZ1bmN0aW9uKHgpIHsKICBwYXJjZWwgPSBsaXN0KHgyPXgqeCwgeDM9eCp4KngsIHg0PXgqeCp4KngpOwogIHJldHVybihwYXJjZWwpOwp9CgpYID0gcG93ZXJzKDMpOwpwcmludCgiU2hvd2luZyBwb3dlcnMgb2YgMyAtLSIpOyBwcmludChYKTsKCiMgV1JJVElORyBUSElTIENPTVBBQ1RMWSAoNCBsaW5lcyBpbnN0ZWFkIG9mIDcpCgpwb3dlcmZ1bCA8LSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuKGxpc3QoeDI9eCp4LCB4Mz14KngqeCwgeDQ9eCp4KngqeCkpOwp9CnByaW50KCJTaG93aW5nIHBvd2VycyBvZiAzIC0tIik7IHByaW50KHBvd2VyZnVsKDMpKTsKCiMgSW4gUiwgdGhlIGxhc3QgZXhwcmVzc2lvbiBpbiBhIGZ1bmN0aW9uIGlzLCBieSBkZWZhdWx0LCB3aGF0IGlzCiMgcmV0dXJuZWQuIFNvIHlvdSBjb3VsZCBlcXVhbGx5IGp1c3Qgc2F5Ogpwb3dlcmZ1bCA8LSBmdW5jdGlvbih4KSB7bGlzdCh4Mj14KngsIHgzPXgqeCp4LCB4ND14KngqeCp4KX0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1yc3JjPC9jb2RlPi48L3A+CgogICAgPHA+RGV2ZWxvcG1lbnQgb2YgdGhlIENvZGVNaXJyb3IgUiBtb2RlIHdhcyBraW5kbHkgc3BvbnNvcmVkCiAgICBieSA8YSBocmVmPSJodHRwOi8vdWJhbG8uY29tLyI+VWJhbG88L2E+LCB3aG8gaG9sZAogICAgdGhlIDxhIGhyZWY9IkxJQ0VOU0UiPmxpY2Vuc2U8L2E+LjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/r/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDExLCBVYmFsbywgSW5jLgpBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVWJhbG8sIEluYyBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORApBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFVCQUxPLCBJTkMgQkUgTElBQkxFIEZPUiBBTlkKRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwpMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/r/r.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJyIiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgZnVuY3Rpb24gd29yZE9iaihzdHIpIHsKICAgIHZhciB3b3JkcyA9IHN0ci5zcGxpdCgiICIpLCByZXMgPSB7fTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIHJlc1t3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIHJlczsKICB9CiAgdmFyIGF0b21zID0gd29yZE9iaigiTlVMTCBOQSBJbmYgTmFOIE5BX2ludGVnZXJfIE5BX3JlYWxfIE5BX2NvbXBsZXhfIE5BX2NoYXJhY3Rlcl8iKTsKICB2YXIgYnVpbHRpbnMgPSB3b3JkT2JqKCJsaXN0IHF1b3RlIGJxdW90ZSBldmFsIHJldHVybiBjYWxsIHBhcnNlIGRlcGFyc2UiKTsKICB2YXIga2V5d29yZHMgPSB3b3JkT2JqKCJpZiBlbHNlIHJlcGVhdCB3aGlsZSBmdW5jdGlvbiBmb3IgaW4gbmV4dCBicmVhayIpOwogIHZhciBibG9ja2tleXdvcmRzID0gd29yZE9iaigiaWYgZWxzZSByZXBlYXQgd2hpbGUgZnVuY3Rpb24gZm9yIik7CiAgdmFyIG9wQ2hhcnMgPSAvWytcLSpcL148Pj0hJnx+JDpdLzsKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIGN1clB1bmMgPSBudWxsOwogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiMCIgJiYgc3RyZWFtLmVhdCgieCIpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xkYS1mXS9pKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiLiIgJiYgc3RyZWFtLmVhdCgvXGQvKSkgewogICAgICBzdHJlYW0ubWF0Y2goL1xkKig/OmVbK1wtXT9cZCspPy8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9cZCooPzpcLlxkKyk/KD86ZVsrXC1dXGQrKT9MPy8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9IGVsc2UgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iICYmIHN0cmVhbS5tYXRjaCgvLlsuXGRdKy8pKSB7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9IGVsc2UgaWYgKC9bXHdcLl0vLnRlc3QoY2gpICYmIGNoICE9ICJfIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuXS8pOwogICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkgcmV0dXJuICJhdG9tIjsKICAgICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKSB7CiAgICAgICAgaWYgKGJsb2Nra2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkpIGN1clB1bmMgPSAiYmxvY2siOwogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIH0KICAgICAgaWYgKGJ1aWx0aW5zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKSByZXR1cm4gImJ1aWx0aW4iOwogICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIiUiKSB7CiAgICAgIGlmIChzdHJlYW0uc2tpcFRvKCIlIikpIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICB9IGVsc2UgaWYgKGNoID09ICI8IiAmJiBzdHJlYW0uZWF0KCItIikpIHsKICAgICAgcmV0dXJuICJhcnJvdyI7CiAgICB9IGVsc2UgaWYgKGNoID09ICI9IiAmJiBzdGF0ZS5jdHguYXJnTGlzdCkgewogICAgICByZXR1cm4gImFyZy1pcyI7CiAgICB9IGVsc2UgaWYgKG9wQ2hhcnMudGVzdChjaCkpIHsKICAgICAgaWYgKGNoID09ICIkIikgcmV0dXJuICJkb2xsYXIiOwogICAgICBzdHJlYW0uZWF0V2hpbGUob3BDaGFycyk7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIGlmICgvW1woXCl7fVxbXF07XS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICBpZiAoY2ggPT0gIjsiKSByZXR1cm4gInNlbWkiOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCJcXCIpKSB7CiAgICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgICAgICBpZiAoY2ggPT0gIngiKSBzdHJlYW0ubWF0Y2goL15bYS1mMC05XXsyfS9pKTsKICAgICAgICBlbHNlIGlmICgoY2ggPT0gInUiIHx8IGNoID09ICJVIikgJiYgc3RyZWFtLmVhdCgieyIpICYmIHN0cmVhbS5za2lwVG8oIn0iKSkgc3RyZWFtLm5leHQoKTsKICAgICAgICBlbHNlIGlmIChjaCA9PSAidSIpIHN0cmVhbS5tYXRjaCgvXlthLWYwLTldezR9L2kpOwogICAgICAgIGVsc2UgaWYgKGNoID09ICJVIikgc3RyZWFtLm1hdGNoKC9eW2EtZjAtOV17OH0vaSk7CiAgICAgICAgZWxzZSBpZiAoL1swLTddLy50ZXN0KGNoKSkgc3RyZWFtLm1hdGNoKC9eWzAtN117MSwyfS8pOwogICAgICAgIHJldHVybiAic3RyaW5nLTIiOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBuZXh0OwogICAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICAgIGlmIChuZXh0ID09IHF1b3RlKSB7IHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOyBicmVhazsgfQogICAgICAgICAgaWYgKG5leHQgPT0gIlxcIikgeyBzdHJlYW0uYmFja1VwKDEpOyBicmVhazsgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0KICAgIH07CiAgfQoKICBmdW5jdGlvbiBwdXNoKHN0YXRlLCB0eXBlLCBzdHJlYW0pIHsKICAgIHN0YXRlLmN0eCA9IHt0eXBlOiB0eXBlLAogICAgICAgICAgICAgICAgIGluZGVudDogc3RhdGUuaW5kZW50LAogICAgICAgICAgICAgICAgIGFsaWduOiBudWxsLAogICAgICAgICAgICAgICAgIGNvbHVtbjogc3RyZWFtLmNvbHVtbigpLAogICAgICAgICAgICAgICAgIHByZXY6IHN0YXRlLmN0eH07CiAgfQogIGZ1bmN0aW9uIHBvcChzdGF0ZSkgewogICAgc3RhdGUuaW5kZW50ID0gc3RhdGUuY3R4LmluZGVudDsKICAgIHN0YXRlLmN0eCA9IHN0YXRlLmN0eC5wcmV2OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgY3R4OiB7dHlwZTogInRvcCIsCiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAtY29uZmlnLmluZGVudFVuaXQsCiAgICAgICAgICAgICAgICAgICAgYWxpZ246IGZhbHNlfSwKICAgICAgICAgICAgICBpbmRlbnQ6IDAsCiAgICAgICAgICAgICAgYWZ0ZXJJZGVudDogZmFsc2V9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKHN0YXRlLmN0eC5hbGlnbiA9PSBudWxsKSBzdGF0ZS5jdHguYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlICE9ICJjb21tZW50IiAmJiBzdGF0ZS5jdHguYWxpZ24gPT0gbnVsbCkgc3RhdGUuY3R4LmFsaWduID0gdHJ1ZTsKCiAgICAgIHZhciBjdHlwZSA9IHN0YXRlLmN0eC50eXBlOwogICAgICBpZiAoKGN1clB1bmMgPT0gIjsiIHx8IGN1clB1bmMgPT0gInsiIHx8IGN1clB1bmMgPT0gIn0iKSAmJiBjdHlwZSA9PSAiYmxvY2siKSBwb3Aoc3RhdGUpOwogICAgICBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2goc3RhdGUsICJ9Iiwgc3RyZWFtKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiKCIpIHsKICAgICAgICBwdXNoKHN0YXRlLCAiKSIsIHN0cmVhbSk7CiAgICAgICAgaWYgKHN0YXRlLmFmdGVySWRlbnQpIHN0YXRlLmN0eC5hcmdMaXN0ID0gdHJ1ZTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJbIikgcHVzaChzdGF0ZSwgIl0iLCBzdHJlYW0pOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJibG9jayIpIHB1c2goc3RhdGUsICJibG9jayIsIHN0cmVhbSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gY3R5cGUpIHBvcChzdGF0ZSk7CiAgICAgIHN0YXRlLmFmdGVySWRlbnQgPSBzdHlsZSA9PSAidmFyaWFibGUiIHx8IHN0eWxlID09ICJrZXl3b3JkIjsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSkgcmV0dXJuIDA7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKSwgY3R4ID0gc3RhdGUuY3R4LAogICAgICAgICAgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSBjdHgudHlwZTsKICAgICAgaWYgKGN0eC50eXBlID09ICJibG9jayIpIHJldHVybiBjdHguaW5kZW50ICsgKGZpcnN0Q2hhciA9PSAieyIgPyAwIDogY29uZmlnLmluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnQgKyAoY2xvc2luZyA/IDAgOiBjb25maWcuaW5kZW50VW5pdCk7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1yc3JjIiwgInIiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/rpm/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/rpm/changes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/rpm/changes/changes.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJjaGFuZ2VzIiwgZnVuY3Rpb24oKSB7CiAgdmFyIGhlYWRlclNlcGVyYXRvciA9IC9eLSskLzsKICB2YXIgaGVhZGVyTGluZSA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1bikgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAgP1xkezEsMn0gXGR7Mn06XGR7Mn0oOlxkezJ9KT8gW0EtWl17Myw0fSBcZHs0fSAtIC87CiAgdmFyIHNpbXBsZUVtYWlsID0gL15bXHcrLi1dK0BbXHcuLV0rLzsKCiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goaGVhZGVyU2VwZXJhdG9yKSkgeyByZXR1cm4gJ3RhZyc7IH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGhlYWRlckxpbmUpKSB7IHJldHVybiAndGFnJzsgfQogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goc2ltcGxlRW1haWwpKSB7IHJldHVybiAnc3RyaW5nJzsgfQogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXJwbS1jaGFuZ2VzIiwgImNoYW5nZXMiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/rpm/changes/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFJQTSBjaGFuZ2VzIG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJjaGFuZ2VzLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBSUE0gY2hhbmdlcyBtb2RlPC9oMT4KICAgIAogICAgPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClR1ZSBPY3QgMTggMTM6NTg6NDAgVVRDIDIwMTEgLSBtaXN0ZXJ4QGV4YW1wbGUuY29tCgotIFVwZGF0ZSB0byByNjAuMwotIEZpeGVzIGJ1ZyBpbiB0aGUgcmVmbGVjdCBwYWNrYWdlCiAgKiBkaXNhbGxvdyBJbnRlcmZhY2UgbWV0aG9kIG9uIFZhbHVlIG9idGFpbmVkIHZpYSB1bmV4cG9ydGVkIG5hbWUKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVGh1IE9jdCAgNiAwODoxNDoyNCBVVEMgMjAxMSAtIG1pc3RlcnhAZXhhbXBsZS5jb20KCi0gVXBkYXRlIHRvIHI2MC4yCi0gRml4ZXMgbWVtb3J5IGxlYWsgaW4gY2VydGFpbiBtYXAgdHlwZXMKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KV2VkIE9jdCAgNSAxNDozNDoxMCBVVEMgMjAxMSAtIG1pc3RlcnhAZXhhbXBsZS5jb20KCi0gVHdlYWtzIGZvciBnZGIgZGVidWdnaW5nCi0gZ28uc3BlYyBjaGFuZ2VzOgogIC0gbW92ZSAlZ29fYXJjaCBkZWZpbml0aW9uIHRvICVwcmVwIHNlY3Rpb24KICAtIHBhc3MgY29ycmVjdCBsb2NhdGlvbiBvZiBnbyBzcGVjaWZpYyBnZGIgcHJldHR5IHByaW50ZXIgYW5kCiAgICBmdW5jdGlvbnMgdG8gY3BwIGFzIEhPU1RfRVhUUkFfQ0ZMQUdTIG1hY3JvCiAgLSBpbnN0YWxsIGdvIGdkYiBmdW5jdGlvbnMgJiBwcmludGVyCi0gZ2RiLXByaW50ZXIucGF0Y2gKICAtIHBhdGNoIGxpbmtlciAoc3JjL2NtZC9sZC9kd2FyZi5jKSB0byBlbWl0IGNvcnJlY3QgbG9jYXRpb24gb2YgZ28KICAgIGdkYiBmdW5jdGlvbnMgYW5kIHByZXR0eSBwcmludGVyCjwvdGV4dGFyZWE+PC9kaXY+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6IHtuYW1lOiAiY2hhbmdlcyJ9LAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgdGFiTW9kZTogInNoaWZ0IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcnBtLWNoYW5nZXM8L2NvZGU+LjwvcD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/rpm/spec/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/rpm/spec/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFJQTSBzcGVjIG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJzcGVjLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3BlYy5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFJQTSBzcGVjIG1vZGU8L2gxPgogICAgCiAgICA8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMKIyBzcGVjIGZpbGUgZm9yIHBhY2thZ2UgbWluaWRsbmEKIwojIENvcHlyaWdodCAoYykgMjAxMSwgU2FzY2hhIFBlaWxpY2tlIDxzYXNjaHBlQGdteC5kZT4KIwojIEFsbCBtb2RpZmljYXRpb25zIGFuZCBhZGRpdGlvbnMgdG8gdGhlIGZpbGUgY29udHJpYnV0ZWQgYnkgdGhpcmQgcGFydGllcwojIHJlbWFpbiB0aGUgcHJvcGVydHkgb2YgdGhlaXIgY29weXJpZ2h0IG93bmVycywgdW5sZXNzIG90aGVyd2lzZSBhZ3JlZWQKIyB1cG9uLiBUaGUgbGljZW5zZSBmb3IgdGhpcyBmaWxlLCBhbmQgbW9kaWZpY2F0aW9ucyBhbmQgYWRkaXRpb25zIHRvIHRoZQojIGZpbGUsIGlzIHRoZSBzYW1lIGxpY2Vuc2UgYXMgZm9yIHRoZSBwcmlzdGluZSBwYWNrYWdlIGl0c2VsZiAodW5sZXNzIHRoZQojIGxpY2Vuc2UgZm9yIHRoZSBwcmlzdGluZSBwYWNrYWdlIGlzIG5vdCBhbiBPcGVuIFNvdXJjZSBMaWNlbnNlLCBpbiB3aGljaAojIGNhc2UgdGhlIGxpY2Vuc2UgaXMgdGhlIE1JVCBMaWNlbnNlKS4gQW4gIk9wZW4gU291cmNlIExpY2Vuc2UiIGlzIGEKIyBsaWNlbnNlIHRoYXQgY29uZm9ybXMgdG8gdGhlIE9wZW4gU291cmNlIERlZmluaXRpb24gKFZlcnNpb24gMS45KQojIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KCgpOYW1lOiAgICAgICAgICAgbGlidXBucDYKVmVyc2lvbjogICAgICAgIDEuNi4xMwpSZWxlYXNlOiAgICAgICAgMApTdW1tYXJ5OiAgICAgICAgUG9ydGFibGUgVW5pdmVyc2FsIFBsdWcgYW5kIFBsYXkgKFVQblApIFNESwpHcm91cDogICAgICAgICAgU3lzdGVtL0xpYnJhcmllcwpMaWNlbnNlOiAgICAgICAgQlNELTMtQ2xhdXNlClVybDogICAgICAgICAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3B1cG5wLwpTb3VyY2UwOiAgICAgICAgaHR0cDovL2Rvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvcHVwbnAvbGlidXBucC0le3ZlcnNpb259LnRhci5iejIKQnVpbGRSb290OiAgICAgICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS1idWlsZAoKJWRlc2NyaXB0aW9uClRoZSBwb3J0YWJsZSBVbml2ZXJzYWwgUGx1ZyBhbmQgUGxheSAoVVBuUCkgU0RLIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGJ1aWxkaW5nClVQblAtY29tcGxpYW50IGNvbnRyb2wgcG9pbnRzLCBkZXZpY2VzLCBhbmQgYnJpZGdlcyBvbiBzZXZlcmFsIG9wZXJhdGluZwpzeXN0ZW1zLgoKJXBhY2thZ2UgLW4gbGlidXBucC1kZXZlbApTdW1tYXJ5OiAgICAgICAgUG9ydGFibGUgVW5pdmVyc2FsIFBsdWcgYW5kIFBsYXkgKFVQblApIFNESwpHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQvTGlicmFyaWVzL0MgYW5kIEMrKwpQcm92aWRlczogICAgICAgcGtnY29uZmlnKGxpYnVwbnApClJlcXVpcmVzOiAgICAgICAle25hbWV9ID0gJXt2ZXJzaW9ufQoKJWRlc2NyaXB0aW9uIC1uIGxpYnVwbnAtZGV2ZWwKVGhlIHBvcnRhYmxlIFVuaXZlcnNhbCBQbHVnIGFuZCBQbGF5IChVUG5QKSBTREsgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYnVpbGRpbmcKVVBuUC1jb21wbGlhbnQgY29udHJvbCBwb2ludHMsIGRldmljZXMsIGFuZCBicmlkZ2VzIG9uIHNldmVyYWwgb3BlcmF0aW5nCnN5c3RlbXMuCgolcHJlcAolc2V0dXAgLW4gbGlidXBucC0le3ZlcnNpb259CgolYnVpbGQKJWNvbmZpZ3VyZSAtLWRpc2FibGUtc3RhdGljCm1ha2UgJXs/X3NtcF9tZmxhZ3N9CgolaW5zdGFsbAolbWFrZWluc3RhbGwKZmluZCAle2J1aWxkcm9vdH0gLXR5cGUgZiAtbmFtZSAnKi5sYScgLWV4ZWMgcm0gLWYge30gJzsnCgolcG9zdCAtcCAvc2Jpbi9sZGNvbmZpZwoKJXBvc3R1biAtcCAvc2Jpbi9sZGNvbmZpZwoKJWZpbGVzCiVkZWZhdHRyKC0scm9vdCxyb290LC0pCiVkb2MgQ2hhbmdlTG9nIE5FV1MgUkVBRE1FIFRPRE8KJXtfbGliZGlyfS9saWJpeG1sLnNvLioKJXtfbGliZGlyfS9saWJ0aHJlYWR1dGlsLnNvLioKJXtfbGliZGlyfS9saWJ1cG5wLnNvLioKCiVmaWxlcyAtbiBsaWJ1cG5wLWRldmVsCiVkZWZhdHRyKC0scm9vdCxyb290LC0pCiV7X2xpYmRpcn0vcGtnY29uZmlnL2xpYnVwbnAucGMKJXtfbGliZGlyfS9saWJpeG1sLnNvCiV7X2xpYmRpcn0vbGlidGhyZWFkdXRpbC5zbwole19saWJkaXJ9L2xpYnVwbnAuc28KJXtfaW5jbHVkZWRpcn0vdXBucC8KCiVjaGFuZ2Vsb2c8L3RleHRhcmVhPjwvZGl2PgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiB7bmFtZTogInNwZWMifSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1ycG0tc3BlYzwvY29kZT4uPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/rpm/spec/spec.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZGVmYXVsdCBzcGFuLmNtLXByZWFtYmxlIHtjb2xvcjogI2IyNjgxODsgZm9udC13ZWlnaHQ6IGJvbGQ7fQouY20tcy1kZWZhdWx0IHNwYW4uY20tbWFjcm8ge2NvbG9yOiAjYjIxOGIyO30KLmNtLXMtZGVmYXVsdCBzcGFuLmNtLXNlY3Rpb24ge2NvbG9yOiBncmVlbjsgZm9udC13ZWlnaHQ6IGJvbGQ7fQouY20tcy1kZWZhdWx0IHNwYW4uY20tc2NyaXB0IHtjb2xvcjogcmVkO30KLmNtLXMtZGVmYXVsdCBzcGFuLmNtLWlzc3VlIHtjb2xvcjogeWVsbG93O30K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/rpm/spec/spec.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gUXVpY2sgYW5kIGRpcnR5IHNwZWMgZmlsZSBoaWdobGlnaHRpbmcKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgic3BlYyIsIGZ1bmN0aW9uKCkgewogIHZhciBhcmNoID0gL14oaTM4NnxpNTg2fGk2ODZ8eDg2XzY0fHBwYzY0fHBwY3xpYTY0fHMzOTB4fHMzOTB8c3BhcmM2NHxzcGFyY3Y5fHNwYXJjfG5vYXJjaHxhbHBoYWV2NnxhbHBoYXxocHBhfG1pcHNlbCkvOwoKICB2YXIgcHJlYW1ibGUgPSAvXihOYW1lfFZlcnNpb258UmVsZWFzZXxMaWNlbnNlfFN1bW1hcnl8VXJsfEdyb3VwfFNvdXJjZXxCdWlsZEFyY2h8QnVpbGRSZXF1aXJlc3xCdWlsZFJvb3R8QXV0b1JlcVByb3Z8UHJvdmlkZXN8UmVxdWlyZXMoXChcdytcKSk/fE9ic29sZXRlc3xDb25mbGljdHN8UmVjb21tZW5kc3xTb3VyY2VcZCp8UGF0Y2hcZCp8RXhjbHVzaXZlQXJjaHxOb1NvdXJjZXxTdXBwbGVtZW50cyk6LzsKICB2YXIgc2VjdGlvbiA9IC9eJShkZWJ1Z19wYWNrYWdlfHBhY2thZ2V8ZGVzY3JpcHRpb258cHJlcHxidWlsZHxpbnN0YWxsfGZpbGVzfGNsZWFufGNoYW5nZWxvZ3xwcmV1bnxwb3N0dW58cHJlfHBvc3R8dHJpZ2dlcmlufHRyaWdnZXJ1bnxwcmV0cmFuc3xwb3N0dHJhbnN8dmVyaWZ5c2NyaXB0fGNoZWNrfHRyaWdnZXJwb3N0dW58dHJpZ2dlcnByZWlufHRyaWdnZXIpLzsKICB2YXIgY29udHJvbF9mbG93X2NvbXBsZXggPSAvXiUoaWZuYXJjaHxpZmFyY2h8aWYpLzsgLy8gcnBtIGNvbnRyb2wgZmxvdyBtYWNyb3MKICB2YXIgY29udHJvbF9mbG93X3NpbXBsZSA9IC9eJShlbHNlfGVuZGlmKS87IC8vIHJwbSBjb250cm9sIGZsb3cgbWFjcm9zCiAgdmFyIG9wZXJhdG9ycyA9IC9eKFwhfFw/fFw8XD18XDx8XD5cPXxcPnxcPVw9fFwmXCZ8XHxcfCkvOyAvLyBvcGVyYXRvcnMgaW4gY29udHJvbCBmbG93IG1hY3JvcwoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBjb250cm9sRmxvdzogZmFsc2UsCiAgICAgICAgICBtYWNyb1BhcmFtZXRlcnM6IGZhbHNlLAogICAgICAgICAgc2VjdGlvbjogZmFsc2UKICAgICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICBpZiAoY2ggPT0gIiMiKSB7IHN0cmVhbS5za2lwVG9FbmQoKTsgcmV0dXJuICJjb21tZW50IjsgfQoKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocHJlYW1ibGUpKSB7IHJldHVybiAicHJlYW1ibGUiOyB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChzZWN0aW9uKSkgeyByZXR1cm4gInNlY3Rpb24iOyB9CiAgICAgIH0KCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cJFx3Ky8pKSB7IHJldHVybiAiZGVmIjsgfSAvLyBWYXJpYWJsZXMgbGlrZSAnJFJQTV9CVUlMRF9ST09UJwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXCRce1x3K1x9LykpIHsgcmV0dXJuICJkZWYiOyB9IC8vIFZhcmlhYmxlcyBsaWtlICcke1JQTV9CVUlMRF9ST09UfScKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goY29udHJvbF9mbG93X3NpbXBsZSkpIHsgcmV0dXJuICJrZXl3b3JkIjsgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKGNvbnRyb2xfZmxvd19jb21wbGV4KSkgewogICAgICAgIHN0YXRlLmNvbnRyb2xGbG93ID0gdHJ1ZTsKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5jb250cm9sRmxvdykgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gob3BlcmF0b3JzKSkgeyByZXR1cm4gIm9wZXJhdG9yIjsgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oXGQrKS8pKSB7IHJldHVybiAibnVtYmVyIjsgfQogICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHsgc3RhdGUuY29udHJvbEZsb3cgPSBmYWxzZTsgfQogICAgICB9CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKGFyY2gpKSB7IHJldHVybiAibnVtYmVyIjsgfQoKICAgICAgLy8gTWFjcm9zIGxpa2UgJyVtYWtlX2luc3RhbGwnIG9yICclYXR0cigwNzc1LHJvb3Qscm9vdCknCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14lW1x3XSsvKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cKC8pKSB7IHN0YXRlLm1hY3JvUGFyYW1ldGVycyA9IHRydWU7IH0KICAgICAgICByZXR1cm4gIm1hY3JvIjsKICAgICAgfQogICAgICBpZiAoc3RhdGUubWFjcm9QYXJhbWV0ZXJzKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxkKy8pKSB7IHJldHVybiAibnVtYmVyIjt9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlwpLykpIHsKICAgICAgICAgIHN0YXRlLm1hY3JvUGFyYW1ldGVycyA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuICJtYWNybyI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14lXHtcPz9bXHcgXC1dK1x9LykpIHsgcmV0dXJuICJtYWNybyI7IH0gLy8gTWFjcm9zIGxpa2UgJyV7ZGVmaW5lZCBmZWRvcmF9JwoKICAgICAgLy9UT0RPOiBJbmNsdWRlIGJhc2ggc2NyaXB0IHN1Yi1wYXJzZXIgKENvZGVNaXJyb3Igc3VwcG9ydHMgdGhhdCkKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ycG0tc3BlYyIsICJzcGVjIik7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/rst/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/rst/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IHJlU3RydWN0dXJlZFRleHQgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InJzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogcmVTdHJ1Y3R1cmVkVGV4dCBtb2RlPC9oMT4KCjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci4uIFRoaXMgaXMgYW4gZXhjZXJwdCBmcm9tIFNwaGlueCBkb2N1bWVudGF0aW9uOiBodHRwOi8vc3BoaW54LnBvY29vLm9yZy9fc291cmNlcy9yZXN0LnR4dAoKLi4gaGlnaGxpZ2h0bGFuZzo6IHJlc3QKCi4uIF9yc3QtcHJpbWVyOgoKcmVTdHJ1Y3R1cmVkVGV4dCBQcmltZXIKPT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgc2VjdGlvbiBpcyBhIGJyaWVmIGludHJvZHVjdGlvbiB0byByZVN0cnVjdHVyZWRUZXh0IChyZVNUKSBjb25jZXB0cyBhbmQKc3ludGF4LCBpbnRlbmRlZCB0byBwcm92aWRlIGF1dGhvcnMgd2l0aCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYXV0aG9yIGRvY3VtZW50cwpwcm9kdWN0aXZlbHkuICBTaW5jZSByZVNUIHdhcyBkZXNpZ25lZCB0byBiZSBhIHNpbXBsZSwgdW5vYnRydXNpdmUgbWFya3VwCmxhbmd1YWdlLCB0aGlzIHdpbGwgbm90IHRha2UgdG9vIGxvbmcuCgouLiBzZWVhbHNvOjoKCiAgIFRoZSBhdXRob3JpdGF0aXZlIGByZVN0cnVjdHVyZWRUZXh0IFVzZXIgRG9jdW1lbnRhdGlvbgogICAmbHQ7aHR0cDovL2RvY3V0aWxzLnNvdXJjZWZvcmdlLm5ldC9yc3QuaHRtbCZndDtgXy4gIFRoZSAicmVmIiBsaW5rcyBpbiB0aGlzCiAgIGRvY3VtZW50IGxpbmsgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmRpdmlkdWFsIGNvbnN0cnVjdHMgaW4gdGhlIHJlU1QKICAgcmVmZXJlbmNlLgoKClBhcmFncmFwaHMKLS0tLS0tLS0tLQoKVGhlIHBhcmFncmFwaCAoOmR1cmVmOmByZWYgJmx0O3BhcmFncmFwaHMmZ3Q7YCkgaXMgdGhlIG1vc3QgYmFzaWMgYmxvY2sgaW4gYSByZVNUCmRvY3VtZW50LiAgUGFyYWdyYXBocyBhcmUgc2ltcGx5IGNodW5rcyBvZiB0ZXh0IHNlcGFyYXRlZCBieSBvbmUgb3IgbW9yZSBibGFuawpsaW5lcy4gIEFzIGluIFB5dGhvbiwgaW5kZW50YXRpb24gaXMgc2lnbmlmaWNhbnQgaW4gcmVTVCwgc28gYWxsIGxpbmVzIG9mIHRoZQpzYW1lIHBhcmFncmFwaCBtdXN0IGJlIGxlZnQtYWxpZ25lZCB0byB0aGUgc2FtZSBsZXZlbCBvZiBpbmRlbnRhdGlvbi4KCgouLiBfaW5saW5lbWFya3VwOgoKSW5saW5lIG1hcmt1cAotLS0tLS0tLS0tLS0tCgpUaGUgc3RhbmRhcmQgcmVTVCBpbmxpbmUgbWFya3VwIGlzIHF1aXRlIHNpbXBsZTogdXNlCgoqIG9uZSBhc3RlcmlzazogYGAqdGV4dCpgYCBmb3IgZW1waGFzaXMgKGl0YWxpY3MpLAoqIHR3byBhc3Rlcmlza3M6IGBgKip0ZXh0KipgYCBmb3Igc3Ryb25nIGVtcGhhc2lzIChib2xkZmFjZSksIGFuZAoqIGJhY2txdW90ZXM6IGBgYGB0ZXh0YGBgYCBmb3IgY29kZSBzYW1wbGVzLgoKSWYgYXN0ZXJpc2tzIG9yIGJhY2txdW90ZXMgYXBwZWFyIGluIHJ1bm5pbmcgdGV4dCBhbmQgY291bGQgYmUgY29uZnVzZWQgd2l0aAppbmxpbmUgbWFya3VwIGRlbGltaXRlcnMsIHRoZXkgaGF2ZSB0byBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2guCgpCZSBhd2FyZSBvZiBzb21lIHJlc3RyaWN0aW9ucyBvZiB0aGlzIG1hcmt1cDoKCiogaXQgbWF5IG5vdCBiZSBuZXN0ZWQsCiogY29udGVudCBtYXkgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2U6IGBgKiB0ZXh0KmBgIGlzIHdyb25nLAoqIGl0IG11c3QgYmUgc2VwYXJhdGVkIGZyb20gc3Vycm91bmRpbmcgdGV4dCBieSBub24td29yZCBjaGFyYWN0ZXJzLiAgVXNlIGEKICBiYWNrc2xhc2ggZXNjYXBlZCBzcGFjZSB0byB3b3JrIGFyb3VuZCB0aGF0OiBgYHRoaXNpc1wgKm9uZSpcIHdvcmRgYC4KClRoZXNlIHJlc3RyaWN0aW9ucyBtYXkgYmUgbGlmdGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgZG9jdXRpbHMuCgpyZVNUIGFsc28gYWxsb3dzIGZvciBjdXN0b20gImludGVycHJldGVkIHRleHQgcm9sZXMiJywgd2hpY2ggc2lnbmlmeSB0aGF0IHRoZQplbmNsb3NlZCB0ZXh0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBpbiBhIHNwZWNpZmljIHdheS4gIFNwaGlueCB1c2VzIHRoaXMgdG8KcHJvdmlkZSBzZW1hbnRpYyBtYXJrdXAgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIG9mIGlkZW50aWZpZXJzLCBhcyBkZXNjcmliZWQgaW4KdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uICBUaGUgZ2VuZXJhbCBzeW50YXggaXMgYGA6cm9sZW5hbWU6YGNvbnRlbnRgYGAuCgpTdGFuZGFyZCByZVNUIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgcm9sZXM6CgoqIDpkdXJvbGU6YGVtcGhhc2lzYCAtLSBhbHRlcm5hdGUgc3BlbGxpbmcgZm9yIGBgKmVtcGhhc2lzKmBgCiogOmR1cm9sZTpgc3Ryb25nYCAtLSBhbHRlcm5hdGUgc3BlbGxpbmcgZm9yIGBgKipzdHJvbmcqKmBgCiogOmR1cm9sZTpgbGl0ZXJhbGAgLS0gYWx0ZXJuYXRlIHNwZWxsaW5nIGZvciBgYGBgbGl0ZXJhbGBgYGAKKiA6ZHVyb2xlOmBzdWJzY3JpcHRgIC0tIHN1YnNjcmlwdCB0ZXh0CiogOmR1cm9sZTpgc3VwZXJzY3JpcHRgIC0tIHN1cGVyc2NyaXB0IHRleHQKKiA6ZHVyb2xlOmB0aXRsZS1yZWZlcmVuY2VgIC0tIGZvciB0aXRsZXMgb2YgYm9va3MsIHBlcmlvZGljYWxzLCBhbmQgb3RoZXIKICBtYXRlcmlhbHMKClNlZSA6cmVmOmBpbmxpbmUtbWFya3VwYCBmb3Igcm9sZXMgYWRkZWQgYnkgU3BoaW54LgoKCkxpc3RzIGFuZCBRdW90ZS1saWtlIGJsb2NrcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkxpc3QgbWFya3VwICg6ZHVyZWY6YHJlZiAmbHQ7YnVsbGV0LWxpc3RzJmd0O2ApIGlzIG5hdHVyYWw6IGp1c3QgcGxhY2UgYW4gYXN0ZXJpc2sgYXQKdGhlIHN0YXJ0IG9mIGEgcGFyYWdyYXBoIGFuZCBpbmRlbnQgcHJvcGVybHkuICBUaGUgc2FtZSBnb2VzIGZvciBudW1iZXJlZCBsaXN0czsKdGhleSBjYW4gYWxzbyBiZSBhdXRvbnVtYmVyZWQgdXNpbmcgYSBgYCNgYCBzaWduOjoKCiAgICogVGhpcyBpcyBhIGJ1bGxldGVkIGxpc3QuCiAgICogSXQgaGFzIHR3byBpdGVtcywgdGhlIHNlY29uZAogICAgIGl0ZW0gdXNlcyB0d28gbGluZXMuCgogICAxLiBUaGlzIGlzIGEgbnVtYmVyZWQgbGlzdC4KICAgMi4gSXQgaGFzIHR3byBpdGVtcyB0b28uCgogICAjLiBUaGlzIGlzIGEgbnVtYmVyZWQgbGlzdC4KICAgIy4gSXQgaGFzIHR3byBpdGVtcyB0b28uCgoKTmVzdGVkIGxpc3RzIGFyZSBwb3NzaWJsZSwgYnV0IGJlIGF3YXJlIHRoYXQgdGhleSBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZQpwYXJlbnQgbGlzdCBpdGVtcyBieSBibGFuayBsaW5lczo6CgogICAqIHRoaXMgaXMKICAgKiBhIGxpc3QKCiAgICAgKiB3aXRoIGEgbmVzdGVkIGxpc3QKICAgICAqIGFuZCBzb21lIHN1Yml0ZW1zCgogICAqIGFuZCBoZXJlIHRoZSBwYXJlbnQgbGlzdCBjb250aW51ZXMKCkRlZmluaXRpb24gbGlzdHMgKDpkdXJlZjpgcmVmICZsdDtkZWZpbml0aW9uLWxpc3RzJmd0O2ApIGFyZSBjcmVhdGVkIGFzIGZvbGxvd3M6OgoKICAgdGVybSAodXAgdG8gYSBsaW5lIG9mIHRleHQpCiAgICAgIERlZmluaXRpb24gb2YgdGhlIHRlcm0sIHdoaWNoIG11c3QgYmUgaW5kZW50ZWQKCiAgICAgIGFuZCBjYW4gZXZlbiBjb25zaXN0IG9mIG11bHRpcGxlIHBhcmFncmFwaHMKCiAgIG5leHQgdGVybQogICAgICBEZXNjcmlwdGlvbi4KCk5vdGUgdGhhdCB0aGUgdGVybSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGxpbmUgb2YgdGV4dC4KClF1b3RlZCBwYXJhZ3JhcGhzICg6ZHVyZWY6YHJlZiAmbHQ7YmxvY2stcXVvdGVzJmd0O2ApIGFyZSBjcmVhdGVkIGJ5IGp1c3QgaW5kZW50aW5nCnRoZW0gbW9yZSB0aGFuIHRoZSBzdXJyb3VuZGluZyBwYXJhZ3JhcGhzLgoKTGluZSBibG9ja3MgKDpkdXJlZjpgcmVmICZsdDtsaW5lLWJsb2NrcyZndDtgKSBhcmUgYSB3YXkgb2YgcHJlc2VydmluZyBsaW5lIGJyZWFrczo6CgogICB8IFRoZXNlIGxpbmVzIGFyZQogICB8IGJyb2tlbiBleGFjdGx5IGxpa2UgaW4KICAgfCB0aGUgc291cmNlIGZpbGUuCgpUaGVyZSBhcmUgYWxzbyBzZXZlcmFsIG1vcmUgc3BlY2lhbCBibG9ja3MgYXZhaWxhYmxlOgoKKiBmaWVsZCBsaXN0cyAoOmR1cmVmOmByZWYgJmx0O2ZpZWxkLWxpc3RzJmd0O2ApCiogb3B0aW9uIGxpc3RzICg6ZHVyZWY6YHJlZiAmbHQ7b3B0aW9uLWxpc3RzJmd0O2ApCiogcXVvdGVkIGxpdGVyYWwgYmxvY2tzICg6ZHVyZWY6YHJlZiAmbHQ7cXVvdGVkLWxpdGVyYWwtYmxvY2tzJmd0O2ApCiogZG9jdGVzdCBibG9ja3MgKDpkdXJlZjpgcmVmICZsdDtkb2N0ZXN0LWJsb2NrcyZndDtgKQoKClNvdXJjZSBDb2RlCi0tLS0tLS0tLS0tCgpMaXRlcmFsIGNvZGUgYmxvY2tzICg6ZHVyZWY6YHJlZiAmbHQ7bGl0ZXJhbC1ibG9ja3MmZ3Q7YCkgYXJlIGludHJvZHVjZWQgYnkgZW5kaW5nIGEKcGFyYWdyYXBoIHdpdGggdGhlIHNwZWNpYWwgbWFya2VyIGBgOjpgYC4gIFRoZSBsaXRlcmFsIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQKKGFuZCwgbGlrZSBhbGwgcGFyYWdyYXBocywgc2VwYXJhdGVkIGZyb20gdGhlIHN1cnJvdW5kaW5nIG9uZXMgYnkgYmxhbmsgbGluZXMpOjoKCiAgIFRoaXMgaXMgYSBub3JtYWwgdGV4dCBwYXJhZ3JhcGguIFRoZSBuZXh0IHBhcmFncmFwaCBpcyBhIGNvZGUgc2FtcGxlOjoKCiAgICAgIEl0IGlzIG5vdCBwcm9jZXNzZWQgaW4gYW55IHdheSwgZXhjZXB0CiAgICAgIHRoYXQgdGhlIGluZGVudGF0aW9uIGlzIHJlbW92ZWQuCgogICAgICBJdCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy4KCiAgIFRoaXMgaXMgYSBub3JtYWwgdGV4dCBwYXJhZ3JhcGggYWdhaW4uCgpUaGUgaGFuZGxpbmcgb2YgdGhlIGBgOjpgYCBtYXJrZXIgaXMgc21hcnQ6CgoqIElmIGl0IG9jY3VycyBhcyBhIHBhcmFncmFwaCBvZiBpdHMgb3duLCB0aGF0IHBhcmFncmFwaCBpcyBjb21wbGV0ZWx5IGxlZnQKICBvdXQgb2YgdGhlIGRvY3VtZW50LgoqIElmIGl0IGlzIHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UsIHRoZSBtYXJrZXIgaXMgcmVtb3ZlZC4KKiBJZiBpdCBpcyBwcmVjZWRlZCBieSBub24td2hpdGVzcGFjZSwgdGhlIG1hcmtlciBpcyByZXBsYWNlZCBieSBhIHNpbmdsZQogIGNvbG9uLgoKVGhhdCB3YXksIHRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIGFib3ZlIGV4YW1wbGUncyBmaXJzdCBwYXJhZ3JhcGggd291bGQgYmUKcmVuZGVyZWQgYXMgIlRoZSBuZXh0IHBhcmFncmFwaCBpcyBhIGNvZGUgc2FtcGxlOiIuCgoKLi4gX3JzdC10YWJsZXM6CgpUYWJsZXMKLS0tLS0tCgpUd28gZm9ybXMgb2YgdGFibGVzIGFyZSBzdXBwb3J0ZWQuICBGb3IgKmdyaWQgdGFibGVzKiAoOmR1cmVmOmByZWYKJmx0O2dyaWQtdGFibGVzJmd0O2ApLCB5b3UgaGF2ZSB0byAicGFpbnQiIHRoZSBjZWxsIGdyaWQgeW91cnNlbGYuICBUaGV5IGxvb2sgbGlrZQp0aGlzOjoKCiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKICAgfCBIZWFkZXIgcm93LCBjb2x1bW4gMSAgIHwgSGVhZGVyIDIgICB8IEhlYWRlciAzIHwgSGVhZGVyIDQgfAogICB8IChoZWFkZXIgcm93cyBvcHRpb25hbCkgfCAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CiAgICs9PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09Kz09PT09PT09PT0rPT09PT09PT09PSsKICAgfCBib2R5IHJvdyAxLCBjb2x1bW4gMSAgIHwgY29sdW1uIDIgICB8IGNvbHVtbiAzIHwgY29sdW1uIDQgfAogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiAgIHwgYm9keSByb3cgMiAgICAgICAgICAgICB8IC4uLiAgICAgICAgfCAuLi4gICAgICB8ICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKwoKKlNpbXBsZSB0YWJsZXMqICg6ZHVyZWY6YHJlZiAmbHQ7c2ltcGxlLXRhYmxlcyZndDtgKSBhcmUgZWFzaWVyIHRvIHdyaXRlLCBidXQKbGltaXRlZDogdGhleSBtdXN0IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSByb3csIGFuZCB0aGUgZmlyc3QgY29sdW1uIGNhbm5vdApjb250YWluIG11bHRpcGxlIGxpbmVzLiAgVGhleSBsb29rIGxpa2UgdGhpczo6CgogICA9PT09PSAgPT09PT0gID09PT09PT0KICAgQSAgICAgIEIgICAgICBBIGFuZCBCCiAgID09PT09ICA9PT09PSAgPT09PT09PQogICBGYWxzZSAgRmFsc2UgIEZhbHNlCiAgIFRydWUgICBGYWxzZSAgRmFsc2UKICAgRmFsc2UgIFRydWUgICBGYWxzZQogICBUcnVlICAgVHJ1ZSAgIFRydWUKICAgPT09PT0gID09PT09ICA9PT09PT09CgoKSHlwZXJsaW5rcwotLS0tLS0tLS0tCgpFeHRlcm5hbCBsaW5rcwpeXl5eXl5eXl5eXl5eXgoKVXNlIGBgYExpbmsgdGV4dCAmbHQ7aHR0cDovL2V4YW1wbGUuY29tLyZndDtgX2BgIGZvciBpbmxpbmUgd2ViIGxpbmtzLiAgSWYgdGhlIGxpbmsKdGV4dCBzaG91bGQgYmUgdGhlIHdlYiBhZGRyZXNzLCB5b3UgZG9uJ3QgbmVlZCBzcGVjaWFsIG1hcmt1cCBhdCBhbGwsIHRoZSBwYXJzZXIKZmluZHMgbGlua3MgYW5kIG1haWwgYWRkcmVzc2VzIGluIG9yZGluYXJ5IHRleHQuCgpZb3UgY2FuIGFsc28gc2VwYXJhdGUgdGhlIGxpbmsgYW5kIHRoZSB0YXJnZXQgZGVmaW5pdGlvbiAoOmR1cmVmOmByZWYKJmx0O2h5cGVybGluay10YXJnZXRzJmd0O2ApLCBsaWtlIHRoaXM6OgoKICAgVGhpcyBpcyBhIHBhcmFncmFwaCB0aGF0IGNvbnRhaW5zIGBhIGxpbmtgXy4KCiAgIC4uIF9hIGxpbms6IGh0dHA6Ly9leGFtcGxlLmNvbS8KCgpJbnRlcm5hbCBsaW5rcwpeXl5eXl5eXl5eXl5eXgoKSW50ZXJuYWwgbGlua2luZyBpcyBkb25lIHZpYSBhIHNwZWNpYWwgcmVTVCByb2xlIHByb3ZpZGVkIGJ5IFNwaGlueCwgc2VlIHRoZQpzZWN0aW9uIG9uIHNwZWNpZmljIG1hcmt1cCwgOnJlZjpgcmVmLXJvbGVgLgoKClNlY3Rpb25zCi0tLS0tLS0tCgpTZWN0aW9uIGhlYWRlcnMgKDpkdXJlZjpgcmVmICZsdDtzZWN0aW9ucyZndDtgKSBhcmUgY3JlYXRlZCBieSB1bmRlcmxpbmluZyAoYW5kCm9wdGlvbmFsbHkgb3ZlcmxpbmluZykgdGhlIHNlY3Rpb24gdGl0bGUgd2l0aCBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciwgYXQgbGVhc3QKYXMgbG9uZyBhcyB0aGUgdGV4dDo6CgogICA9PT09PT09PT09PT09PT09PQogICBUaGlzIGlzIGEgaGVhZGluZwogICA9PT09PT09PT09PT09PT09PQoKTm9ybWFsbHksIHRoZXJlIGFyZSBubyBoZWFkaW5nIGxldmVscyBhc3NpZ25lZCB0byBjZXJ0YWluIGNoYXJhY3RlcnMgYXMgdGhlCnN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHN1Y2Nlc3Npb24gb2YgaGVhZGluZ3MuICBIb3dldmVyLCBmb3IgdGhlClB5dGhvbiBkb2N1bWVudGF0aW9uLCB0aGlzIGNvbnZlbnRpb24gaXMgdXNlZCB3aGljaCB5b3UgbWF5IGZvbGxvdzoKCiogYGAjYGAgd2l0aCBvdmVybGluZSwgZm9yIHBhcnRzCiogYGAqYGAgd2l0aCBvdmVybGluZSwgZm9yIGNoYXB0ZXJzCiogYGA9YGAsIGZvciBzZWN0aW9ucwoqIGBgLWBgLCBmb3Igc3Vic2VjdGlvbnMKKiBgYF5gYCwgZm9yIHN1YnN1YnNlY3Rpb25zCiogYGAiYGAsIGZvciBwYXJhZ3JhcGhzCgpPZiBjb3Vyc2UsIHlvdSBhcmUgZnJlZSB0byB1c2UgeW91ciBvd24gbWFya2VyIGNoYXJhY3RlcnMgKHNlZSB0aGUgcmVTVApkb2N1bWVudGF0aW9uKSwgYW5kIHVzZSBhIGRlZXBlciBuZXN0aW5nIGxldmVsLCBidXQga2VlcCBpbiBtaW5kIHRoYXQgbW9zdAp0YXJnZXQgZm9ybWF0cyAoSFRNTCwgTGFUZVgpIGhhdmUgYSBsaW1pdGVkIHN1cHBvcnRlZCBuZXN0aW5nIGRlcHRoLgoKCkV4cGxpY2l0IE1hcmt1cAotLS0tLS0tLS0tLS0tLS0KCiJFeHBsaWNpdCBtYXJrdXAiICg6ZHVyZWY6YHJlZiAmbHQ7ZXhwbGljaXQtbWFya3VwLWJsb2NrcyZndDtgKSBpcyB1c2VkIGluIHJlU1QgZm9yCm1vc3QgY29uc3RydWN0cyB0aGF0IG5lZWQgc3BlY2lhbCBoYW5kbGluZywgc3VjaCBhcyBmb290bm90ZXMsCnNwZWNpYWxseS1oaWdobGlnaHRlZCBwYXJhZ3JhcGhzLCBjb21tZW50cywgYW5kIGdlbmVyaWMgZGlyZWN0aXZlcy4KCkFuIGV4cGxpY2l0IG1hcmt1cCBibG9jayBiZWdpbnMgd2l0aCBhIGxpbmUgc3RhcnRpbmcgd2l0aCBgYC4uYGAgZm9sbG93ZWQgYnkKd2hpdGVzcGFjZSBhbmQgaXMgdGVybWluYXRlZCBieSB0aGUgbmV4dCBwYXJhZ3JhcGggYXQgdGhlIHNhbWUgbGV2ZWwgb2YKaW5kZW50YXRpb24uICAoVGhlcmUgbmVlZHMgdG8gYmUgYSBibGFuayBsaW5lIGJldHdlZW4gZXhwbGljaXQgbWFya3VwIGFuZCBub3JtYWwKcGFyYWdyYXBocy4gIFRoaXMgbWF5IGFsbCBzb3VuZCBhIGJpdCBjb21wbGljYXRlZCwgYnV0IGl0IGlzIGludHVpdGl2ZSBlbm91Z2gKd2hlbiB5b3Ugd3JpdGUgaXQuKQoKCi4uIF9kaXJlY3RpdmVzOgoKRGlyZWN0aXZlcwotLS0tLS0tLS0tCgpBIGRpcmVjdGl2ZSAoOmR1cmVmOmByZWYgJmx0O2RpcmVjdGl2ZXMmZ3Q7YCkgaXMgYSBnZW5lcmljIGJsb2NrIG9mIGV4cGxpY2l0IG1hcmt1cC4KQmVzaWRlcyByb2xlcywgaXQgaXMgb25lIG9mIHRoZSBleHRlbnNpb24gbWVjaGFuaXNtcyBvZiByZVNULCBhbmQgU3BoaW54IG1ha2VzCmhlYXZ5IHVzZSBvZiBpdC4KCkRvY3V0aWxzIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlczoKCiogQWRtb25pdGlvbnM6IDpkdWRpcjpgYXR0ZW50aW9uYCwgOmR1ZGlyOmBjYXV0aW9uYCwgOmR1ZGlyOmBkYW5nZXJgLAogIDpkdWRpcjpgZXJyb3JgLCA6ZHVkaXI6YGhpbnRgLCA6ZHVkaXI6YGltcG9ydGFudGAsIDpkdWRpcjpgbm90ZWAsCiAgOmR1ZGlyOmB0aXBgLCA6ZHVkaXI6YHdhcm5pbmdgIGFuZCB0aGUgZ2VuZXJpYyA6ZHVkaXI6YGFkbW9uaXRpb25gLgogIChNb3N0IHRoZW1lcyBzdHlsZSBvbmx5ICJub3RlIiBhbmQgIndhcm5pbmciIHNwZWNpYWxseS4pCgoqIEltYWdlczoKCiAgLSA6ZHVkaXI6YGltYWdlYCAoc2VlIGFsc28gSW1hZ2VzXyBiZWxvdykKICAtIDpkdWRpcjpgZmlndXJlYCAoYW4gaW1hZ2Ugd2l0aCBjYXB0aW9uIGFuZCBvcHRpb25hbCBsZWdlbmQpCgoqIEFkZGl0aW9uYWwgYm9keSBlbGVtZW50czoKCiAgLSA6ZHVkaXI6YGNvbnRlbnRzYCAoYSBsb2NhbCwgaS5lLiBmb3IgdGhlIGN1cnJlbnQgZmlsZSBvbmx5LCB0YWJsZSBvZgogICAgY29udGVudHMpCiAgLSA6ZHVkaXI6YGNvbnRhaW5lcmAgKGEgY29udGFpbmVyIHdpdGggYSBjdXN0b20gY2xhc3MsIHVzZWZ1bCB0byBnZW5lcmF0ZSBhbgogICAgb3V0ZXIgYGAmbHQ7ZGl2Jmd0O2BgIGluIEhUTUwpCiAgLSA6ZHVkaXI6YHJ1YnJpY2AgKGEgaGVhZGluZyB3aXRob3V0IHJlbGF0aW9uIHRvIHRoZSBkb2N1bWVudCBzZWN0aW9uaW5nKQogIC0gOmR1ZGlyOmB0b3BpY2AsIDpkdWRpcjpgc2lkZWJhcmAgKHNwZWNpYWwgaGlnaGxpZ2h0ZWQgYm9keSBlbGVtZW50cykKICAtIDpkdWRpcjpgcGFyc2VkLWxpdGVyYWxgIChsaXRlcmFsIGJsb2NrIHRoYXQgc3VwcG9ydHMgaW5saW5lIG1hcmt1cCkKICAtIDpkdWRpcjpgZXBpZ3JhcGhgIChhIGJsb2NrIHF1b3RlIHdpdGggb3B0aW9uYWwgYXR0cmlidXRpb24gbGluZSkKICAtIDpkdWRpcjpgaGlnaGxpZ2h0c2AsIDpkdWRpcjpgcHVsbC1xdW90ZWAgKGJsb2NrIHF1b3RlcyB3aXRoIHRoZWlyIG93bgogICAgY2xhc3MgYXR0cmlidXRlKQogIC0gOmR1ZGlyOmBjb21wb3VuZGAgKGEgY29tcG91bmQgcGFyYWdyYXBoKQoKKiBTcGVjaWFsIHRhYmxlczoKCiAgLSA6ZHVkaXI6YHRhYmxlYCAoYSB0YWJsZSB3aXRoIHRpdGxlKQogIC0gOmR1ZGlyOmBjc3YtdGFibGVgIChhIHRhYmxlIGdlbmVyYXRlZCBmcm9tIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMpCiAgLSA6ZHVkaXI6YGxpc3QtdGFibGVgIChhIHRhYmxlIGdlbmVyYXRlZCBmcm9tIGEgbGlzdCBvZiBsaXN0cykKCiogU3BlY2lhbCBkaXJlY3RpdmVzOgoKICAtIDpkdWRpcjpgcmF3YCAoaW5jbHVkZSByYXcgdGFyZ2V0LWZvcm1hdCBtYXJrdXApCiAgLSA6ZHVkaXI6YGluY2x1ZGVgIChpbmNsdWRlIHJlU3RydWN0dXJlZFRleHQgZnJvbSBhbm90aGVyIGZpbGUpCiAgICAtLSBpbiBTcGhpbngsIHdoZW4gZ2l2ZW4gYW4gYWJzb2x1dGUgaW5jbHVkZSBmaWxlIHBhdGgsIHRoaXMgZGlyZWN0aXZlIHRha2VzCiAgICBpdCBhcyByZWxhdGl2ZSB0byB0aGUgc291cmNlIGRpcmVjdG9yeQogIC0gOmR1ZGlyOmBjbGFzc2AgKGFzc2lnbiBhIGNsYXNzIGF0dHJpYnV0ZSB0byB0aGUgbmV4dCBlbGVtZW50KSBbMV1fCgoqIEhUTUwgc3BlY2lmaWNzOgoKICAtIDpkdWRpcjpgbWV0YWAgKGdlbmVyYXRpb24gb2YgSFRNTCBgYCZsdDttZXRhJmd0O2BgIHRhZ3MpCiAgLSA6ZHVkaXI6YHRpdGxlYCAob3ZlcnJpZGUgZG9jdW1lbnQgdGl0bGUpCgoqIEluZmx1ZW5jaW5nIG1hcmt1cDoKCiAgLSA6ZHVkaXI6YGRlZmF1bHQtcm9sZWAgKHNldCBhIG5ldyBkZWZhdWx0IHJvbGUpCiAgLSA6ZHVkaXI6YHJvbGVgIChjcmVhdGUgYSBuZXcgcm9sZSkKCiAgU2luY2UgdGhlc2UgYXJlIG9ubHkgcGVyLWZpbGUsIGJldHRlciB1c2UgU3BoaW54JyBmYWNpbGl0aWVzIGZvciBzZXR0aW5nIHRoZQogIDpjb25mdmFsOmBkZWZhdWx0X3JvbGVgLgoKRG8gKm5vdCogdXNlIHRoZSBkaXJlY3RpdmVzIDpkdWRpcjpgc2VjdG51bWAsIDpkdWRpcjpgaGVhZGVyYCBhbmQKOmR1ZGlyOmBmb290ZXJgLgoKRGlyZWN0aXZlcyBhZGRlZCBieSBTcGhpbnggYXJlIGRlc2NyaWJlZCBpbiA6cmVmOmBzcGhpbnhtYXJrdXBgLgoKQmFzaWNhbGx5LCBhIGRpcmVjdGl2ZSBjb25zaXN0cyBvZiBhIG5hbWUsIGFyZ3VtZW50cywgb3B0aW9ucyBhbmQgY29udGVudC4gKEtlZXAKdGhpcyB0ZXJtaW5vbG9neSBpbiBtaW5kLCBpdCBpcyB1c2VkIGluIHRoZSBuZXh0IGNoYXB0ZXIgZGVzY3JpYmluZyBjdXN0b20KZGlyZWN0aXZlcy4pICBMb29raW5nIGF0IHRoaXMgZXhhbXBsZSwgOjoKCiAgIC4uIGZ1bmN0aW9uOjogZm9vKHgpCiAgICAgICAgICAgICAgICAgZm9vKHksIHopCiAgICAgIDptb2R1bGU6IHNvbWUubW9kdWxlLm5hbWUKCiAgICAgIFJldHVybiBhIGxpbmUgb2YgdGV4dCBpbnB1dCBmcm9tIHRoZSB1c2VyLgoKYGBmdW5jdGlvbmBgIGlzIHRoZSBkaXJlY3RpdmUgbmFtZS4gIEl0IGlzIGdpdmVuIHR3byBhcmd1bWVudHMgaGVyZSwgdGhlCnJlbWFpbmRlciBvZiB0aGUgZmlyc3QgbGluZSBhbmQgdGhlIHNlY29uZCBsaW5lLCBhcyB3ZWxsIGFzIG9uZSBvcHRpb24KYGBtb2R1bGVgYCAoYXMgeW91IGNhbiBzZWUsIG9wdGlvbnMgYXJlIGdpdmVuIGluIHRoZSBsaW5lcyBpbW1lZGlhdGVseSBmb2xsb3dpbmcKdGhlIGFyZ3VtZW50cyBhbmQgaW5kaWNhdGVkIGJ5IHRoZSBjb2xvbnMpLiAgT3B0aW9ucyBtdXN0IGJlIGluZGVudGVkIHRvIHRoZQpzYW1lIGxldmVsIGFzIHRoZSBkaXJlY3RpdmUgY29udGVudC4KClRoZSBkaXJlY3RpdmUgY29udGVudCBmb2xsb3dzIGFmdGVyIGEgYmxhbmsgbGluZSBhbmQgaXMgaW5kZW50ZWQgcmVsYXRpdmUgdG8gdGhlCmRpcmVjdGl2ZSBzdGFydC4KCgpJbWFnZXMKLS0tLS0tCgpyZVNUIHN1cHBvcnRzIGFuIGltYWdlIGRpcmVjdGl2ZSAoOmR1ZGlyOmByZWYgJmx0O2ltYWdlJmd0O2ApLCB1c2VkIGxpa2Ugc286OgoKICAgLi4gaW1hZ2U6OiBnbnUucG5nCiAgICAgIChvcHRpb25zKQoKV2hlbiB1c2VkIHdpdGhpbiBTcGhpbngsIHRoZSBmaWxlIG5hbWUgZ2l2ZW4gKGhlcmUgYGBnbnUucG5nYGApIG11c3QgZWl0aGVyIGJlCnJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZmlsZSwgb3IgYWJzb2x1dGUgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IGFyZSByZWxhdGl2ZSB0bwp0aGUgdG9wIHNvdXJjZSBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSwgdGhlIGZpbGUgYGBza2V0Y2gvc3BhbS5yc3RgYCBjb3VsZCByZWZlcgp0byB0aGUgaW1hZ2UgYGBpbWFnZXMvc3BhbS5wbmdgYCBhcyBgYC4uL2ltYWdlcy9zcGFtLnBuZ2BgIG9yCmBgL2ltYWdlcy9zcGFtLnBuZ2BgLgoKU3BoaW54IHdpbGwgYXV0b21hdGljYWxseSBjb3B5IGltYWdlIGZpbGVzIG92ZXIgdG8gYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIG91dHB1dApkaXJlY3Rvcnkgb24gYnVpbGRpbmcgKGUuZy4gdGhlIGBgX3N0YXRpY2BgIGRpcmVjdG9yeSBmb3IgSFRNTCBvdXRwdXQuKQoKSW50ZXJwcmV0YXRpb24gb2YgaW1hZ2Ugc2l6ZSBvcHRpb25zIChgYHdpZHRoYGAgYW5kIGBgaGVpZ2h0YGApIGlzIGFzIGZvbGxvd3M6CmlmIHRoZSBzaXplIGhhcyBubyB1bml0IG9yIHRoZSB1bml0IGlzIHBpeGVscywgdGhlIGdpdmVuIHNpemUgd2lsbCBvbmx5IGJlCnJlc3BlY3RlZCBmb3Igb3V0cHV0IGNoYW5uZWxzIHRoYXQgc3VwcG9ydCBwaXhlbHMgKGkuZS4gbm90IGluIExhVGVYIG91dHB1dCkuCk90aGVyIHVuaXRzIChsaWtlIGBgcHRgYCBmb3IgcG9pbnRzKSB3aWxsIGJlIHVzZWQgZm9yIEhUTUwgYW5kIExhVGVYIG91dHB1dC4KClNwaGlueCBleHRlbmRzIHRoZSBzdGFuZGFyZCBkb2N1dGlscyBiZWhhdmlvciBieSBhbGxvd2luZyBhbiBhc3RlcmlzayBmb3IgdGhlCmV4dGVuc2lvbjo6CgogICAuLiBpbWFnZTo6IGdudS4qCgpTcGhpbnggdGhlbiBzZWFyY2hlcyBmb3IgYWxsIGltYWdlcyBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcGF0dGVybiBhbmQgZGV0ZXJtaW5lcwp0aGVpciB0eXBlLiAgRWFjaCBidWlsZGVyIHRoZW4gY2hvb3NlcyB0aGUgYmVzdCBpbWFnZSBvdXQgb2YgdGhlc2UgY2FuZGlkYXRlcy4KRm9yIGluc3RhbmNlLCBpZiB0aGUgZmlsZSBuYW1lIGBgZ251LipgYCB3YXMgZ2l2ZW4gYW5kIHR3byBmaWxlcyA6ZmlsZTpgZ251LnBkZmAKYW5kIDpmaWxlOmBnbnUucG5nYCBleGlzdGVkIGluIHRoZSBzb3VyY2UgdHJlZSwgdGhlIExhVGVYIGJ1aWxkZXIgd291bGQgY2hvb3NlCnRoZSBmb3JtZXIsIHdoaWxlIHRoZSBIVE1MIGJ1aWxkZXIgd291bGQgcHJlZmVyIHRoZSBsYXR0ZXIuCgouLiB2ZXJzaW9uY2hhbmdlZDo6IDAuNAogICBBZGRlZCB0aGUgc3VwcG9ydCBmb3IgZmlsZSBuYW1lcyBlbmRpbmcgaW4gYW4gYXN0ZXJpc2suCgouLiB2ZXJzaW9uY2hhbmdlZDo6IDAuNgogICBJbWFnZSBwYXRocyBjYW4gbm93IGJlIGFic29sdXRlLgoKCkZvb3Rub3RlcwotLS0tLS0tLS0KCkZvciBmb290bm90ZXMgKDpkdXJlZjpgcmVmICZsdDtmb290bm90ZXMmZ3Q7YCksIHVzZSBgYFsjbmFtZV1fYGAgdG8gbWFyayB0aGUgZm9vdG5vdGUKbG9jYXRpb24sIGFuZCBhZGQgdGhlIGZvb3Rub3RlIGJvZHkgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgYQoiRm9vdG5vdGVzIiBydWJyaWMgaGVhZGluZywgbGlrZSBzbzo6CgogICBMb3JlbSBpcHN1bSBbI2YxXV8gZG9sb3Igc2l0IGFtZXQgLi4uIFsjZjJdXwoKICAgLi4gcnVicmljOjogRm9vdG5vdGVzCgogICAuLiBbI2YxXSBUZXh0IG9mIHRoZSBmaXJzdCBmb290bm90ZS4KICAgLi4gWyNmMl0gVGV4dCBvZiB0aGUgc2Vjb25kIGZvb3Rub3RlLgoKWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgbnVtYmVyIHRoZSBmb290bm90ZXMgKGBgWzFdX2BgKSBvciB1c2UgYXV0by1udW1iZXJlZApmb290bm90ZXMgd2l0aG91dCBuYW1lcyAoYGBbI11fYGApLgoKCkNpdGF0aW9ucwotLS0tLS0tLS0KClN0YW5kYXJkIHJlU1QgY2l0YXRpb25zICg6ZHVyZWY6YHJlZiAmbHQ7Y2l0YXRpb25zJmd0O2ApIGFyZSBzdXBwb3J0ZWQsIHdpdGggdGhlCmFkZGl0aW9uYWwgZmVhdHVyZSB0aGF0IHRoZXkgYXJlICJnbG9iYWwiLCBpLmUuIGFsbCBjaXRhdGlvbnMgY2FuIGJlIHJlZmVyZW5jZWQKZnJvbSBhbGwgZmlsZXMuICBVc2UgdGhlbSBsaWtlIHNvOjoKCiAgIExvcmVtIGlwc3VtIFtSZWZdXyBkb2xvciBzaXQgYW1ldC4KCiAgIC4uIFtSZWZdIEJvb2sgb3IgYXJ0aWNsZSByZWZlcmVuY2UsIFVSTCBvciB3aGF0ZXZlci4KCkNpdGF0aW9uIHVzYWdlIGlzIHNpbWlsYXIgdG8gZm9vdG5vdGUgdXNhZ2UsIGJ1dCB3aXRoIGEgbGFiZWwgdGhhdCBpcyBub3QKbnVtZXJpYyBvciBiZWdpbnMgd2l0aCBgYCNgYC4KCgpTdWJzdGl0dXRpb25zCi0tLS0tLS0tLS0tLS0KCnJlU1Qgc3VwcG9ydHMgInN1YnN0aXR1dGlvbnMiICg6ZHVyZWY6YHJlZiAmbHQ7c3Vic3RpdHV0aW9uLWRlZmluaXRpb25zJmd0O2ApLCB3aGljaAphcmUgcGllY2VzIG9mIHRleHQgYW5kL29yIG1hcmt1cCByZWZlcnJlZCB0byBpbiB0aGUgdGV4dCBieSBgYHxuYW1lfGBgLiAgVGhleQphcmUgZGVmaW5lZCBsaWtlIGZvb3Rub3RlcyB3aXRoIGV4cGxpY2l0IG1hcmt1cCBibG9ja3MsIGxpa2UgdGhpczo6CgogICAuLiB8bmFtZXwgcmVwbGFjZTo6IHJlcGxhY2VtZW50ICp0ZXh0KgoKb3IgdGhpczo6CgogICAuLiB8Y2F1dGlvbnwgaW1hZ2U6OiB3YXJuaW5nLnBuZwogICAgICAgICAgICAgICAgOmFsdDogV2FybmluZyEKClNlZSB0aGUgOmR1cmVmOmByZVNUIHJlZmVyZW5jZSBmb3Igc3Vic3RpdHV0aW9ucyAmbHQ7c3Vic3RpdHV0aW9uLWRlZmluaXRpb25zJmd0O2AKZm9yIGRldGFpbHMuCgpJZiB5b3Ugd2FudCB0byB1c2Ugc29tZSBzdWJzdGl0dXRpb25zIGZvciBhbGwgZG9jdW1lbnRzLCBwdXQgdGhlbSBpbnRvCjpjb25mdmFsOmByc3RfcHJvbG9nYCBvciBwdXQgdGhlbSBpbnRvIGEgc2VwYXJhdGUgZmlsZSBhbmQgaW5jbHVkZSBpdCBpbnRvIGFsbApkb2N1bWVudHMgeW91IHdhbnQgdG8gdXNlIHRoZW0gaW4sIHVzaW5nIHRoZSA6cnN0OmRpcjpgaW5jbHVkZWAgZGlyZWN0aXZlLiAgKEJlCnN1cmUgdG8gZ2l2ZSB0aGUgaW5jbHVkZSBmaWxlIGEgZmlsZSBuYW1lIGV4dGVuc2lvbiBkaWZmZXJpbmcgZnJvbSB0aGF0IG9mIG90aGVyCnNvdXJjZSBmaWxlcywgdG8gYXZvaWQgU3BoaW54IGZpbmRpbmcgaXQgYXMgYSBzdGFuZGFsb25lIGRvY3VtZW50LikKClNwaGlueCBkZWZpbmVzIHNvbWUgZGVmYXVsdCBzdWJzdGl0dXRpb25zLCBzZWUgOnJlZjpgZGVmYXVsdC1zdWJzdGl0dXRpb25zYC4KCgpDb21tZW50cwotLS0tLS0tLQoKRXZlcnkgZXhwbGljaXQgbWFya3VwIGJsb2NrIHdoaWNoIGlzbid0IGEgdmFsaWQgbWFya3VwIGNvbnN0cnVjdCAobGlrZSB0aGUKZm9vdG5vdGVzIGFib3ZlKSBpcyByZWdhcmRlZCBhcyBhIGNvbW1lbnQgKDpkdXJlZjpgcmVmICZsdDtjb21tZW50cyZndDtgKS4gIEZvcgpleGFtcGxlOjoKCiAgIC4uIFRoaXMgaXMgYSBjb21tZW50LgoKWW91IGNhbiBpbmRlbnQgdGV4dCBhZnRlciBhIGNvbW1lbnQgc3RhcnQgdG8gZm9ybSBtdWx0aWxpbmUgY29tbWVudHM6OgoKICAgLi4KICAgICAgVGhpcyB3aG9sZSBpbmRlbnRlZCBibG9jawogICAgICBpcyBhIGNvbW1lbnQuCgogICAgICBTdGlsbCBpbiB0aGUgY29tbWVudC4KCgpTb3VyY2UgZW5jb2RpbmcKLS0tLS0tLS0tLS0tLS0tCgpTaW5jZSB0aGUgZWFzaWVzdCB3YXkgdG8gaW5jbHVkZSBzcGVjaWFsIGNoYXJhY3RlcnMgbGlrZSBlbSBkYXNoZXMgb3IgY29weXJpZ2h0CnNpZ25zIGluIHJlU1QgaXMgdG8gZGlyZWN0bHkgd3JpdGUgdGhlbSBhcyBVbmljb2RlIGNoYXJhY3RlcnMsIG9uZSBoYXMgdG8Kc3BlY2lmeSBhbiBlbmNvZGluZy4gIFNwaGlueCBhc3N1bWVzIHNvdXJjZSBmaWxlcyB0byBiZSBlbmNvZGVkIGluIFVURi04IGJ5CmRlZmF1bHQ7IHlvdSBjYW4gY2hhbmdlIHRoaXMgd2l0aCB0aGUgOmNvbmZ2YWw6YHNvdXJjZV9lbmNvZGluZ2AgY29uZmlnIHZhbHVlLgoKCkdvdGNoYXMKLS0tLS0tLQoKVGhlcmUgYXJlIHNvbWUgcHJvYmxlbXMgb25lIGNvbW1vbmx5IHJ1bnMgaW50byB3aGlsZSBhdXRob3JpbmcgcmVTVCBkb2N1bWVudHM6CgoqICoqU2VwYXJhdGlvbiBvZiBpbmxpbmUgbWFya3VwOioqIEFzIHNhaWQgYWJvdmUsIGlubGluZSBtYXJrdXAgc3BhbnMgbXVzdCBiZQogIHNlcGFyYXRlZCBmcm9tIHRoZSBzdXJyb3VuZGluZyB0ZXh0IGJ5IG5vbi13b3JkIGNoYXJhY3RlcnMsIHlvdSBoYXZlIHRvIHVzZSBhCiAgYmFja3NsYXNoLWVzY2FwZWQgc3BhY2UgdG8gZ2V0IGFyb3VuZCB0aGF0LiAgU2VlIGB0aGUgcmVmZXJlbmNlCiAgJmx0O2h0dHA6Ly9kb2N1dGlscy5zZi5uZXQvZG9jcy9yZWYvcnN0L3Jlc3RydWN0dXJlZHRleHQuaHRtbCNpbmxpbmUtbWFya3VwJmd0O2BfCiAgZm9yIHRoZSBkZXRhaWxzLgoKKiAqKk5vIG5lc3RlZCBpbmxpbmUgbWFya3VwOioqIFNvbWV0aGluZyBsaWtlIGBgKnNlZSA6ZnVuYzpgZm9vYCpgYCBpcyBub3QKICBwb3NzaWJsZS4KCgouLiBydWJyaWM6OiBGb290bm90ZXMKCi4uIFsxXSBXaGVuIHRoZSBkZWZhdWx0IGRvbWFpbiBjb250YWlucyBhIDpyc3Q6ZGlyOmBjbGFzc2AgZGlyZWN0aXZlLCB0aGlzIGRpcmVjdGl2ZQogICAgICAgd2lsbCBiZSBzaGFkb3dlZC4gIFRoZXJlZm9yZSwgU3BoaW54IHJlLWV4cG9ydHMgaXQgYXMgOnJzdDpkaXI6YHJzdC1jbGFzc2AuCjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgICA8cD5UaGUgcmVTdHJ1Y3R1cmVkVGV4dCBtb2RlIHN1cHBvcnRzIG9uZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcjo8L3A+CiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT52ZXJiYXRpbSAoc3RyaW5nKTwvY29kZT48L2R0PgogICAgICA8ZGQ+QSBuYW1lIG9yIE1JTUUgdHlwZSBvZiBhIG1vZGUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGhpZ2hsaWdodGluZwogICAgICB2ZXJiYXRpbSBibG9ja3MuIEJ5IGRlZmF1bHQsIHJlU3RydWN0dXJlZFRleHQgbW9kZSB1c2VzIHVuaWZvcm0gY29sb3IKICAgICAgZm9yIHdob2xlIGJsb2NrIG9mIHZlcmJhdGltIHRleHQgaWYgbm8gbW9kZSBpcyBnaXZlbi48L2RkPgogICAgPC9kbD4KICAgIDxwPklmIDxjb2RlPnB5dGhvbjwvY29kZT4gbW9kZSBpcyBhdmFpbGFibGUsCiAgICBpdCB3aWxsIGJlIHVzZWQgZm9yIGhpZ2hsaWdodGluZyBibG9ja3MgY29udGFpbmluZyBQeXRob24vSVB5dGhvbiB0ZXJtaW5hbAogICAgc2Vzc2lvbnMgKGJsb2NrcyBzdGFydGluZyB3aXRoIDxjb2RlPiZndDsmZ3Q7Jmd0OzwvY29kZT4gKGZvciBQeXRob24pIG9yCiAgICA8Y29kZT5JbiBbbnVtXTo8L2NvZGU+IChmb3IgSVB5dGhvbikuCgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1yc3Q8L2NvZGU+LjwvcD4KICA8L2JvZHk+CjwvaHRtbD4KCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/rst/rst.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCdyc3QnLCBmdW5jdGlvbihjb25maWcsIG9wdGlvbnMpIHsKICAgIGZ1bmN0aW9uIHNldFN0YXRlKHN0YXRlLCBmbiwgY3R4KSB7CiAgICAgICAgc3RhdGUuZm4gPSBmbjsKICAgICAgICBzZXRDdHgoc3RhdGUsIGN0eCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0Q3R4KHN0YXRlLCBjdHgpIHsKICAgICAgICBzdGF0ZS5jdHggPSBjdHggfHwge307CiAgICB9CgogICAgZnVuY3Rpb24gc2V0Tm9ybWFsKHN0YXRlLCBjaCkgewogICAgICAgIGlmIChjaCAmJiAodHlwZW9mIGNoICE9PSAnc3RyaW5nJykpIHsKICAgICAgICAgICAgdmFyIHN0ciA9IGNoLmN1cnJlbnQoKTsKICAgICAgICAgICAgY2ggPSBzdHJbc3RyLmxlbmd0aC0xXTsKICAgICAgICB9CgogICAgICAgIHNldFN0YXRlKHN0YXRlLCBub3JtYWwsIHtiYWNrOiBjaH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhc01vZGUobW9kZSkgewogICAgICAgIHJldHVybiBtb2RlICYmIENvZGVNaXJyb3IubW9kZXMuaGFzT3duUHJvcGVydHkobW9kZSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0TW9kZShtb2RlKSB7CiAgICAgICAgaWYgKGhhc01vZGUobW9kZSkpIHsKICAgICAgICAgICAgcmV0dXJuIENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIG1vZGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICB2YXIgdmVyYmF0aW1Nb2RlID0gZ2V0TW9kZShvcHRpb25zLnZlcmJhdGltKTsKICAgIHZhciBweXRob25Nb2RlID0gZ2V0TW9kZSgncHl0aG9uJyk7CgogICAgdmFyIHJlU2VjdGlvbiA9IC9eWyEiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXV5fYHt8fX5dLzsKICAgIHZhciByZURpcmVjdGl2ZSA9IC9eXHMqXHcoWy06Llx3XSpcdyk/OjooXHN8JCkvOwogICAgdmFyIHJlSHlwZXJsaW5rID0gL15ccypfW1x3LV0rOihcc3wkKS87CiAgICB2YXIgcmVGb290bm90ZSA9IC9eXHMqXFsoXGQrfCMpXF0oXHN8JCkvOwogICAgdmFyIHJlQ2l0YXRpb24gPSAvXlxzKlxbW0EtWmEtel1bXHctXSpcXShcc3wkKS87CiAgICB2YXIgcmVGb290bm90ZVJlZiA9IC9eXFsoXGQrfCMpXF1fLzsKICAgIHZhciByZUNpdGF0aW9uUmVmID0gL15cW1tBLVphLXpdW1x3LV0qXF1fLzsKICAgIHZhciByZURpcmVjdGl2ZU1hcmtlciA9IC9eXC5cLihcc3wkKS87CiAgICB2YXIgcmVWZXJiYXRpbU1hcmtlciA9IC9eOjpccyokLzsKICAgIHZhciByZVByZUlubGluZSA9IC9eWy1ccyIoW3s8LzpdLzsKICAgIHZhciByZVBvc3RJbmxpbmUgPSAvXlstXHNgJyIpXF19Pi86Liw7IT9cXF9dLzsKICAgIHZhciByZUV4YW1wbGVzID0gL15ccysoPj4+fEluIFxbXGQrXF06KVxzLzsKCiAgICBmdW5jdGlvbiBub3JtYWwoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBjaCwgc29sLCBpOwoKICAgICAgICBpZiAoc3RyZWFtLmVhdCgvXFwvKSkgewogICAgICAgICAgICBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIHNldE5vcm1hbChzdGF0ZSwgY2gpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHNvbCA9IHN0cmVhbS5zb2woKTsKCiAgICAgICAgaWYgKHNvbCAmJiAoY2ggPSBzdHJlYW0uZWF0KHJlU2VjdGlvbikpKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IHN0cmVhbS5lYXQoY2gpOyBpKyspOwoKICAgICAgICAgICAgaWYgKGkgPj0gMyAmJiBzdHJlYW0ubWF0Y2goL15ccyokLykpIHsKICAgICAgICAgICAgICAgIHNldE5vcm1hbChzdGF0ZSwgbnVsbCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2hlYWRlcic7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKGkgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHNvbCAmJiBzdHJlYW0ubWF0Y2gocmVEaXJlY3RpdmVNYXJrZXIpKSB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgZGlyZWN0aXZlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJ21ldGEnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChyZVZlcmJhdGltTWFya2VyKSkgewogICAgICAgICAgICBpZiAoIXZlcmJhdGltTW9kZSkgewogICAgICAgICAgICAgICAgc2V0U3RhdGUoc3RhdGUsIHZlcmJhdGltKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBtb2RlID0gdmVyYmF0aW1Nb2RlOwoKICAgICAgICAgICAgICAgIHNldFN0YXRlKHN0YXRlLCB2ZXJiYXRpbSwgewogICAgICAgICAgICAgICAgICAgIG1vZGU6IG1vZGUsCiAgICAgICAgICAgICAgICAgICAgbG9jYWw6IG1vZGUuc3RhcnRTdGF0ZSgpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJ21ldGEnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNvbCAmJiBzdHJlYW0ubWF0Y2gocmVFeGFtcGxlcywgZmFsc2UpKSB7CiAgICAgICAgICAgIGlmICghcHl0aG9uTW9kZSkgewogICAgICAgICAgICAgICAgc2V0U3RhdGUoc3RhdGUsIHZlcmJhdGltKTsKICAgICAgICAgICAgICAgIHJldHVybiAnbWV0YSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IHB5dGhvbk1vZGU7CgogICAgICAgICAgICAgICAgc2V0U3RhdGUoc3RhdGUsIHZlcmJhdGltLCB7CiAgICAgICAgICAgICAgICAgICAgbW9kZTogbW9kZSwKICAgICAgICAgICAgICAgICAgICBsb2NhbDogbW9kZS5zdGFydFN0YXRlKCkKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB0ZXN0QmFja3dhcmQocmUpIHsKICAgICAgICAgICAgcmV0dXJuIHNvbCB8fCAhc3RhdGUuY3R4LmJhY2sgfHwgcmUudGVzdChzdGF0ZS5jdHguYmFjayk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB0ZXN0Rm9yd2FyZChyZSkgewogICAgICAgICAgICByZXR1cm4gc3RyZWFtLmVvbCgpIHx8IHN0cmVhbS5tYXRjaChyZSwgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdGVzdElubGluZShyZSkgewogICAgICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKHJlKSAmJiB0ZXN0QmFja3dhcmQoL1xXLykgJiYgdGVzdEZvcndhcmQoL1xXLyk7CiAgICAgICAgfQoKICAgICAgICBpZiAodGVzdElubGluZShyZUZvb3Rub3RlUmVmKSkgewogICAgICAgICAgICBzZXROb3JtYWwoc3RhdGUsIHN0cmVhbSk7CiAgICAgICAgICAgIHJldHVybiAnZm9vdG5vdGUnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRlc3RJbmxpbmUocmVDaXRhdGlvblJlZikpIHsKICAgICAgICAgICAgc2V0Tm9ybWFsKHN0YXRlLCBzdHJlYW0pOwogICAgICAgICAgICByZXR1cm4gJ2NpdGF0aW9uJzsKICAgICAgICB9CgogICAgICAgIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAgICAgaWYgKHRlc3RCYWNrd2FyZChyZVByZUlubGluZSkpIHsKICAgICAgICAgICAgaWYgKChjaCA9PT0gJzonIHx8IGNoID09PSAnfCcpICYmIHN0cmVhbS5lYXQoL1xTLykpIHsKICAgICAgICAgICAgICAgIHZhciB0b2tlbjsKCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICc6JykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gJ2J1aWx0aW4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA9ICdhdG9tJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgaW5saW5lLCB7CiAgICAgICAgICAgICAgICAgICAgY2g6IGNoLAogICAgICAgICAgICAgICAgICAgIHdpZGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHByZXY6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgdG9rZW46IHRva2VuCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChjaCA9PT0gJyonIHx8IGNoID09PSAnYCcpIHsKICAgICAgICAgICAgICAgIHZhciBvcmlnID0gY2gsCiAgICAgICAgICAgICAgICAgICAgd2lkZSA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAgICAgICAgICAgICBpZiAoY2ggPT0gb3JpZykgewogICAgICAgICAgICAgICAgICAgIHdpZGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNoID0gc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoY2ggJiYgIS9ccy8udGVzdChjaCkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnID09PSAnKicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB3aWRlID8gJ3N0cm9uZycgOiAnZW0nOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gd2lkZSA/ICdzdHJpbmcnIDogJ3N0cmluZy0yJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKHN0YXRlLCBpbmxpbmUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2g6IG9yaWcsICAgICAgICAgICAgICAgLy8gaW5saW5lKCkgaGFzIHRvIGtub3cgd2hhdCB0byBzZWFyY2ggZm9yCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZGU6IHdpZGUsICAgICAgICAgICAgIC8vIGFyZSB3ZSBsb29raW5nIGZvciBgY2hgIG9yIGBjaGNoYAogICAgICAgICAgICAgICAgICAgICAgICBwcmV2OiBudWxsLCAgICAgICAgICAgICAvLyB0ZXJtaW5hdG9yIG11c3Qgbm90IGJlIHByZWNlZWRlZCB3aXRoIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IHRva2VuICAgICAgICAgICAgLy8gSSBkb24ndCB3YW50IHRvIHJlY29tcHV0ZSB0aGlzIGFsbCB0aGUgdGltZQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHNldE5vcm1hbChzdGF0ZSwgY2gpOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIGlubGluZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKSwKICAgICAgICAgICAgdG9rZW4gPSBzdGF0ZS5jdHgudG9rZW47CgogICAgICAgIGZ1bmN0aW9uIGZpbmlzaChjaCkgewogICAgICAgICAgICBzdGF0ZS5jdHgucHJldiA9IGNoOwogICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQoKICAgICAgICBpZiAoY2ggIT0gc3RhdGUuY3R4LmNoKSB7CiAgICAgICAgICAgIHJldHVybiBmaW5pc2goY2gpOwogICAgICAgIH0KCiAgICAgICAgaWYgKC9ccy8udGVzdChzdGF0ZS5jdHgucHJldikpIHsKICAgICAgICAgICAgcmV0dXJuIGZpbmlzaChjaCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RhdGUuY3R4LndpZGUpIHsKICAgICAgICAgICAgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgICAgICAgaWYgKGNoICE9IHN0YXRlLmN0eC5jaCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaChjaCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghc3RyZWFtLmVvbCgpICYmICFyZVBvc3RJbmxpbmUudGVzdChzdHJlYW0ucGVlaygpKSkgewogICAgICAgICAgICBpZiAoc3RhdGUuY3R4LndpZGUpIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmaW5pc2goY2gpOwogICAgICAgIH0KCiAgICAgICAgc2V0U3RhdGUoc3RhdGUsIG5vcm1hbCk7CiAgICAgICAgc2V0Tm9ybWFsKHN0YXRlLCBjaCk7CgogICAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3RpdmUoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciB0b2tlbiA9IG51bGw7CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocmVEaXJlY3RpdmUpKSB7CiAgICAgICAgICAgIHRva2VuID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2gocmVIeXBlcmxpbmspKSB7CiAgICAgICAgICAgIHRva2VuID0gJ2xpbmsnOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHJlRm9vdG5vdGUpKSB7CiAgICAgICAgICAgIHRva2VuID0gJ3F1b3RlJzsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaChyZUNpdGF0aW9uKSkgewogICAgICAgICAgICB0b2tlbiA9ICdxdW90ZSc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CgogICAgICAgICAgICBpZiAoc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgICAgICBzZXROb3JtYWwoc3RhdGUsIHN0cmVhbSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgICAgIHNldFN0YXRlKHN0YXRlLCBjb21tZW50KTsKICAgICAgICAgICAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgdW5yZWFjaGFibGUKICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgYm9keSwge3N0YXJ0OiB0cnVlfSk7CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgfQoKICAgIGZ1bmN0aW9uIGJvZHkoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciB0b2tlbiA9ICdib2R5JzsKCiAgICAgICAgaWYgKCFzdGF0ZS5jdHguc3RhcnQgfHwgc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgIHJldHVybiBibG9jayhzdHJlYW0sIHN0YXRlLCB0b2tlbik7CiAgICAgICAgfQoKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgc2V0Q3R4KHN0YXRlKTsKCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHJldHVybiBibG9jayhzdHJlYW0sIHN0YXRlLCAnY29tbWVudCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIHZlcmJhdGltKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoIXZlcmJhdGltTW9kZSkgewogICAgICAgICAgICByZXR1cm4gYmxvY2soc3RyZWFtLCBzdGF0ZSwgJ21ldGEnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0Tm9ybWFsKHN0YXRlLCBzdHJlYW0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmVyYmF0aW1Nb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuY3R4LmxvY2FsKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYmxvY2soc3RyZWFtLCBzdGF0ZSwgdG9rZW4pIHsKICAgICAgICBpZiAoc3RyZWFtLmVvbCgpIHx8IHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldE5vcm1hbChzdGF0ZSwgc3RyZWFtKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7Zm46IG5vcm1hbCwgY3R4OiB7fX07CiAgICAgICAgfSwKCiAgICAgICAgY29weVN0YXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgICAgICByZXR1cm4ge2ZuOiBzdGF0ZS5mbiwgY3R4OiBzdGF0ZS5jdHh9OwogICAgICAgIH0sCgogICAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICAgIHZhciB0b2tlbiA9IHN0YXRlLmZuKHN0cmVhbSwgc3RhdGUpOwogICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgfTsKfSwgInB5dGhvbiIpOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcnN0IiwgInJzdCIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/ruby/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/ruby/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFJ1YnkgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi91dGlsL21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InJ1YnkuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tYXJyb3cgeyBjb2xvcjogcmVkOyB9CiAgICA8L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBSdWJ5IG1vZGU8L2gxPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyBDb2RlIGZyb20gaHR0cDovL3NhbmRib3gubWMuZWR1L35iZW5uZXQvcnVieS9jb2RlL3BvbHlfcmIuaHRtbAojCiMgVGhpcyBwcm9ncmFtIGV2YWx1YXRlcyBwb2x5bm9taWFscy4gIEl0IGZpcnN0IGFza3MgZm9yIHRoZSBjb2VmZmljaWVudHMKIyBvZiBhIHBvbHlub21pYWwsIHdoaWNoIG11c3QgYmUgZW50ZXJlZCBvbiBvbmUgbGluZSwgaGlnaGVzdC1vcmRlciBmaXJzdC4KIyBJdCB0aGVuIHJlcXVlc3RzIHZhbHVlcyBvZiB4IGFuZCB3aWxsIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBwb2x5IGZvcgojIGVhY2ggeC4gIEl0IHdpbGwgcmVwZWF0bHkgYXNrIGZvciB4IHZhbHVlcywgdW5sZXNzIHlvdSB0aGUgdXNlciBlbnRlcnMKIyBhIGJsYW5rIGxpbmUuICBJdCB0aGF0IGNhc2UsIGl0IHdpbGwgYXNrIGZvciBhbm90aGVyIHBvbHlub21pYWwuICBJZiB0aGUKIyB1c2VyIHR5cGVzIHF1aXQgZm9yIGVpdGhlciBpbnB1dCwgdGhlIHByb2dyYW0gaW1tZWRpYXRlbHkgZXhpdHMuCiMKCiMKIyBGdW5jdGlvbiB0byBldmFsdWF0ZSBhIHBvbHlub21pYWwgYXQgeC4gIFRoZSBwb2x5bm9taWFsIGlzIGdpdmVuCiMgYXMgYSBsaXN0IG9mIGNvZWZmaWNpZW50cywgZnJvbSB0aGUgZ3JlYXRlc3QgdG8gdGhlIGxlYXN0LgpkZWYgcG9seXZhbCh4LCBjb2VmKQogICAgc3VtID0gMAogICAgY29lZiA9IGNvZWYuY2xvbmUgICAgICAgICAgICMgRG9uJ3Qgd2FudCB0byBkZXN0cm95IHRoZSBvcmlnaW5hbAogICAgd2hpbGUgdHJ1ZQogICAgICAgIHN1bSArPSBjb2VmLnNoaWZ0ICAgICAgICMgQWRkIGFuZCByZW1vdmUgdGhlIG5leHQgY29lZgogICAgICAgIGJyZWFrIGlmIGNvZWYuZW1wdHk/ICAgICMgSWYgbm8gbW9yZSwgZG9uZSBlbnRpcmVseS4KICAgICAgICBzdW0gKj0geCAgICAgICAgICAgICAgICAjIFRoaXMgaGFwcGVucyB0aGUgcmlnaHQgbnVtYmVyIG9mIHRpbWVzLgogICAgZW5kCiAgICByZXR1cm4gc3VtCmVuZAoKIwojIEZ1bmN0aW9uIHRvIHJlYWQgYSBsaW5lIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGludGVnZXJzIGFuZCByZXR1cm4KIyB0aGVtIGFzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgSWYgdGhlIHN0cmluZyBjb252ZXJzaW9uIGZhaWxzLCBpdAojIHRocm93cyBUeXBlRXJyb3IuICBJZiB0aGUgaW5wdXQgbGluZSBpcyB0aGUgd29yZCAncXVpdCcsIHRoZW4gaXQKIyBjb252ZXJ0cyBpdCB0byBhbiBlbmQtb2YtZmlsZSBleGNlcHRpb24KZGVmIHJlYWRpbnRzKHByb21wdCkKICAgICMgUmVhZCBhIGxpbmUKICAgIHByaW50IHByb21wdAogICAgbGluZSA9IHJlYWRsaW5lLmNob21wCiAgICByYWlzZSBFT0ZFcnJvci5uZXcgaWYgbGluZSA9PSAncXVpdCcgIyBZb3UgY2FuIGFsc28gdXNlIGEgcmVhbCBFT0YuCiAgICAgICAgICAgIAogICAgIyBHbyB0aHJvdWdoIGVhY2ggaXRlbSBvbiB0aGUgbGluZSwgY29udmVydGluZyBlYWNoIG9uZSBhbmQgYWRkaW5nIGl0CiAgICAjIHRvIHJldHZhbC4KICAgIHJldHZhbCA9IFsgXQogICAgZm9yIHN0ciBpbiBsaW5lLnNwbGl0KC9ccysvKQogICAgICAgIGlmIHN0ciA9fiAvXlwtP1xkKyQvCiAgICAgICAgICAgIHJldHZhbC5wdXNoKHN0ci50b19pKQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLm5ldwogICAgICAgIGVuZAogICAgZW5kCgogICAgcmV0dXJuIHJldHZhbAplbmQKCiMKIyBUYWtlIGEgY29lZmYgYW5kIGFuIGV4cG9uZW50IGFuZCByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgaWdub3JpbmcKIyB0aGUgc2lnbiBvZiB0aGUgY29lZmZpY2llbnQuCmRlZiB0ZXJtX3RvX3N0cihjb2VmLCBleHApCiAgICByZXQgPSAiIgoKICAgICMgU2hvdyBjb2VmZiwgdW5sZXNzIGl0J3MgMSBvciBhdCB0aGUgcmlnaHQKICAgIGNvZWYgPSBjb2VmLmFicwogICAgcmV0ID0gY29lZi50b19zICAgICB1bmxlc3MgY29lZiA9PSAxICYmIGV4cCA+IDAKICAgIHJldCArPSAieCIgaWYgZXhwID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHggaWYgZXhwb25lbnQgbm90IDAKICAgIHJldCArPSAiXiIgKyBleHAudG9fcyBpZiBleHAgPiAxICAgICAgICAgICAgICAgICAgICAjIF5leHBvbmVudCwgaWYgPiAxLgoKICAgIHJldHVybiByZXQKZW5kCgojCiMgQ3JlYXRlIGEgc3RyaW5nIG9mIHRoZSBwb2x5bm9taWFsIGluIHNvcnQtb2YtcmVhZGFibGUgZm9ybS4KZGVmIHBvbHlzdHIocCkKICAgICMgR2V0IHRoZSBleHBvbmVudCBvZiBmaXJzdCBjb2VmZmljaWVudCwgcGx1cyAxLgogICAgZXhwID0gcC5sZW5ndGgKCiAgICAjIEFzc2lnbiBleHBvbmVudHMgdG8gZWFjaCB0ZXJtLCBtYWtpbmcgcGFpcnMgb2YgY29lZmYgYW5kIGV4cG9uZW50LAogICAgIyBUaGVuIGdldCByaWQgb2YgdGhlIHplcm8gdGVybXMuCiAgICBwID0gKHAubWFwIHsgfGN8IGV4cCAtPSAxOyBbIGMsIGV4cCBdIH0pLnNlbGVjdCB7IHxwfCBwWzBdICE9IDAgfQoKICAgICMgSWYgdGhlcmUncyBub3RoaW5nIGxlZnQsIGl0J3MgYSB6ZXJvCiAgICByZXR1cm4gIjAiIGlmIHAuZW1wdHk/CgogICAgIyAqKiogTm93IHAgaXMgYSBub24tZW1wdHkgbGlzdCBvZiBbIGNvZWYsIGV4cG9uZW50IF0gcGFpcnMuICoqKgoKICAgICMgQ29udmVydCB0aGUgZmlyc3QgdGVybSwgcHJlY2VkZWQgYnkgYSAiLSIgaWYgaXQncyBuZWdhdGl2ZS4KICAgIHJlc3VsdCA9IChpZiBwWzBdWzBdIDwgMCB0aGVuICItIiBlbHNlICIiIGVuZCkgKyB0ZXJtX3RvX3N0cigqcFswXSkKCiAgICAjIENvbnZlcnQgdGhlIHJlc3Qgb2YgdGhlIHRlcm1zLCBpbiBlYWNoIGNhc2UgYWRkaW5nIHRoZSBhcHByb3ByaWF0ZQogICAgIyArIG9yIC0gc2VwYXJhdGluZyB0aGVtLiAgCiAgICBmb3IgdGVybSBpbiBwWzEuLi5wLmxlbmd0aF0KICAgICAgICAjIEFkZCB0aGUgc2VwYXJhdG9yIHRoZW4gdGhlIHJlcC4gb2YgdGhlIHRlcm0uCiAgICAgICAgcmVzdWx0ICs9IChpZiB0ZXJtWzBdIDwgMCB0aGVuICIgLSAiIGVsc2UgIiArICIgZW5kKSArIAogICAgICAgICAgICAgICAgdGVybV90b19zdHIoKnRlcm0pCiAgICBlbmQKCiAgICByZXR1cm4gcmVzdWx0CmVuZAogICAgICAgIAojCiMgUnVuIHVudGlsIHNvbWUga2luZCBvZiBlbmRmaWxlLgpiZWdpbgogICAgIyBSZXBlYXQgdW50aWwgYW4gZXhjZXB0aW9uIG9yIHF1aXQgZ2V0cyB1cyBvdXQuCiAgICB3aGlsZSB0cnVlCiAgICAgICAgIyBSZWFkIGEgcG9seSB1bnRpbCBpdCB3b3Jrcy4gIEFuIEVPRiB3aWxsIGV4Y2VwdCBvdXQgb2YgdGhlCiAgICAgICAgIyBwcm9ncmFtLgogICAgICAgIHByaW50ICJcbiIKICAgICAgICBiZWdpbgogICAgICAgICAgICBwb2x5ID0gcmVhZGludHMoIkVudGVyIGEgcG9seW5vbWlhbCBjb2VmZmljaWVudHM6ICIpCiAgICAgICAgcmVzY3VlIFR5cGVFcnJvcgogICAgICAgICAgICBwcmludCAiVHJ5IGFnYWluLlxuIgogICAgICAgICAgICByZXRyeQogICAgICAgIGVuZAogICAgICAgIGJyZWFrIGlmIHBvbHkuZW1wdHk/CgogICAgICAgICMgUmVhZCBhbmQgZXZhbHVhdGUgeCB2YWx1ZXMgdW50aWwgdGhlIHVzZXIgdHlwZXMgYSBibGFuayBsaW5lLgogICAgICAgICMgQWdhaW4sIGFuIEVPRiB3aWxsIGV4Y2VwdCBvdXQgb2YgdGhlIHBnbS4KICAgICAgICB3aGlsZSB0cnVlCiAgICAgICAgICAgICMgUmVxdWVzdCBhbiBpbnRlZ2VyLgogICAgICAgICAgICBwcmludCAiRW50ZXIgeCB2YWx1ZSBvciBibGFuayBsaW5lOiAiCiAgICAgICAgICAgIHggPSByZWFkbGluZS5jaG9tcAogICAgICAgICAgICBicmVhayBpZiB4ID09ICcnCiAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yLm5ldyBpZiB4ID09ICdxdWl0JwoKICAgICAgICAgICAgIyBJZiBpdCBsb29rcyBiYWQsIGxldCdzIHRyeSBhZ2Fpbi4KICAgICAgICAgICAgaWYgeCAhfiAvXlwtP1xkKyQvCiAgICAgICAgICAgICAgICBwcmludCAiVGhhdCBkb2Vzbid0IGxvb2sgbGlrZSBhbiBpbnRlZ2VyLiAgUGxlYXNlIHRyeSBhZ2Fpbi5cbiIKICAgICAgICAgICAgICAgIG5leHQKICAgICAgICAgICAgZW5kCgogICAgICAgICAgICAjIENvbnZlcnQgdG8gYW4gaW50ZWdlciBhbmQgcHJpbnQgdGhlIHJlc3VsdC4KICAgICAgICAgICAgeCA9IHgudG9faQogICAgICAgICAgICBwcmludCAicCh4KSA9ICIsIHBvbHlzdHIocG9seSksICJcbiIKICAgICAgICAgICAgcHJpbnQgInAoIiwgeCwgIikgPSAiLCBwb2x5dmFsKHgsIHBvbHkpLCAiXG4iCiAgICAgICAgZW5kCiAgICBlbmQKcmVzY3VlIEVPRkVycm9yCiAgICBwcmludCAiXG49PT0gRU9GID09PVxuIgpyZXNjdWUgSW50ZXJydXB0LCBTaWduYWxFeGNlcHRpb24KICAgIHByaW50ICJcbj09PSBJbnRlcnJ1cHRlZCA9PT1cbiIKZWxzZQogICAgcHJpbnQgIi0tLSBCeWUgLS0tXG4iCmVuZAo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogInRleHQveC1ydWJ5IiwKICAgICAgICB0YWJNb2RlOiAiaW5kZW50IiwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXJ1Ynk8L2NvZGU+LjwvcD4KCiAgICA8cD5EZXZlbG9wbWVudCBvZiB0aGUgQ29kZU1pcnJvciBSdWJ5IG1vZGUgd2FzIGtpbmRseSBzcG9uc29yZWQKICAgIGJ5IDxhIGhyZWY9Imh0dHA6Ly91YmFsby5jb20vIj5VYmFsbzwvYT4sIHdobyBob2xkCiAgICB0aGUgPGEgaHJlZj0iTElDRU5TRSI+bGljZW5zZTwvYT4uPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/ruby/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDExLCBVYmFsbywgSW5jLgpBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVWJhbG8sIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQpESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBVQkFMTywgSU5DIEJFIExJQUJMRSBGT1IgQU5ZCkRJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECk9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTClNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/ruby/ruby.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJydWJ5IiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgZnVuY3Rpb24gd29yZE9iaih3b3JkcykgewogICAgdmFyIG8gPSB7fTsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gd29yZHMubGVuZ3RoOyBpIDwgZTsgKytpKSBvW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gbzsKICB9CiAgdmFyIGtleXdvcmRzID0gd29yZE9iaihbCiAgICAiYWxpYXMiLCAiYW5kIiwgIkJFR0lOIiwgImJlZ2luIiwgImJyZWFrIiwgImNhc2UiLCAiY2xhc3MiLCAiZGVmIiwgImRlZmluZWQ/IiwgImRvIiwgImVsc2UiLAogICAgImVsc2lmIiwgIkVORCIsICJlbmQiLCAiZW5zdXJlIiwgImZhbHNlIiwgImZvciIsICJpZiIsICJpbiIsICJtb2R1bGUiLCAibmV4dCIsICJub3QiLCAib3IiLAogICAgInJlZG8iLCAicmVzY3VlIiwgInJldHJ5IiwgInJldHVybiIsICJzZWxmIiwgInN1cGVyIiwgInRoZW4iLCAidHJ1ZSIsICJ1bmRlZiIsICJ1bmxlc3MiLAogICAgInVudGlsIiwgIndoZW4iLCAid2hpbGUiLCAieWllbGQiLCAibmlsIiwgInJhaXNlIiwgInRocm93IiwgImNhdGNoIiwgImZhaWwiLCAibG9vcCIsICJjYWxsY2MiLAogICAgImNhbGxlciIsICJsYW1iZGEiLCAicHJvYyIsICJwdWJsaWMiLCAicHJvdGVjdGVkIiwgInByaXZhdGUiLCAicmVxdWlyZSIsICJsb2FkIiwKICAgICJyZXF1aXJlX3JlbGF0aXZlIiwgImV4dGVuZCIsICJhdXRvbG9hZCIKICBdKTsKICB2YXIgaW5kZW50V29yZHMgPSB3b3JkT2JqKFsiZGVmIiwgImNsYXNzIiwgImNhc2UiLCAiZm9yIiwgIndoaWxlIiwgImRvIiwgIm1vZHVsZSIsICJ0aGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2F0Y2giLCAibG9vcCIsICJwcm9jIiwgImJlZ2luIl0pOwogIHZhciBkZWRlbnRXb3JkcyA9IHdvcmRPYmooWyJlbmQiLCAidW50aWwiXSk7CiAgdmFyIG1hdGNoaW5nID0geyJbIjogIl0iLCAieyI6ICJ9IiwgIigiOiAiKSJ9OwogIHZhciBjdXJQdW5jOwoKICBmdW5jdGlvbiBjaGFpbihuZXd0b2ssIHN0cmVhbSwgc3RhdGUpIHsKICAgIHN0YXRlLnRva2VuaXplLnB1c2gobmV3dG9rKTsKICAgIHJldHVybiBuZXd0b2soc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgY3VyUHVuYyA9IG51bGw7CiAgICBpZiAoc3RyZWFtLnNvbCgpICYmIHN0cmVhbS5tYXRjaCgiPWJlZ2luIikgJiYgc3RyZWFtLmVvbCgpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplLnB1c2gocmVhZEJsb2NrQ29tbWVudCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKSwgbTsKICAgIGlmIChjaCA9PSAiYCIgfHwgY2ggPT0gIiciIHx8IGNoID09ICciJyB8fAogICAgICAgIChjaCA9PSAiLyIgJiYgIXN0cmVhbS5lb2woKSAmJiBzdHJlYW0ucGVlaygpICE9ICIgIikpIHsKICAgICAgcmV0dXJuIGNoYWluKHJlYWRRdW90ZWQoY2gsICJzdHJpbmciLCBjaCA9PSAnIicgfHwgY2ggPT0gImAiKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKGNoID09ICIlIikgewogICAgICB2YXIgc3R5bGUsIGVtYmVkID0gZmFsc2U7CiAgICAgIGlmIChzdHJlYW0uZWF0KCJzIikpIHN0eWxlID0gImF0b20iOwogICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KC9bV1FdLykpIHsgc3R5bGUgPSAic3RyaW5nIjsgZW1iZWQgPSB0cnVlOyB9CiAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoL1t3eHFyXS8pKSBzdHlsZSA9ICJzdHJpbmciOwogICAgICB2YXIgZGVsaW0gPSBzdHJlYW0uZWF0KC9bXlx3XHNdLyk7CiAgICAgIGlmICghZGVsaW0pIHJldHVybiAib3BlcmF0b3IiOwogICAgICBpZiAobWF0Y2hpbmcucHJvcGVydHlJc0VudW1lcmFibGUoZGVsaW0pKSBkZWxpbSA9IG1hdGNoaW5nW2RlbGltXTsKICAgICAgcmV0dXJuIGNoYWluKHJlYWRRdW90ZWQoZGVsaW0sIHN0eWxlLCBlbWJlZCwgdHJ1ZSksIHN0cmVhbSwgc3RhdGUpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiPCIgJiYgKG0gPSBzdHJlYW0ubWF0Y2goL148LT9bXGBcIlwnXT8oW2EtekEtWl8/XVx3KilbXGBcIlwnXT8oPzo7fCQpLykpKSB7CiAgICAgIHJldHVybiBjaGFpbihyZWFkSGVyZURvYyhtWzFdKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKGNoID09ICIwIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgieCIpKSBzdHJlYW0uZWF0V2hpbGUoL1tcZGEtZkEtRl0vKTsKICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdCgiYiIpKSBzdHJlYW0uZWF0V2hpbGUoL1swMV0vKTsKICAgICAgZWxzZSBzdHJlYW0uZWF0V2hpbGUoL1swLTddLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0gZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0ubWF0Y2goL15bXGRfXSooPzpcLltcZF9dKyk/KD86W2VFXVsrXC1dP1tcZF9dKyk/Lyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIj8iKSB7CiAgICAgIHdoaWxlIChzdHJlYW0ubWF0Y2goL15cXFtDTV0tLykpIHt9CiAgICAgIGlmIChzdHJlYW0uZWF0KCJcXCIpKSBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgIGVsc2Ugc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfSBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIiciKSkgcmV0dXJuIGNoYWluKHJlYWRRdW90ZWQoIiciLCAiYXRvbSIsIGZhbHNlKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCciJykpIHJldHVybiBjaGFpbihyZWFkUXVvdGVkKCciJywgImF0b20iLCB0cnVlKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XD9dLyk7CiAgICAgIHJldHVybiAiYXRvbSI7CiAgICB9IGVsc2UgaWYgKGNoID09ICJAIikgewogICAgICBzdHJlYW0uZWF0KCJAIik7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XD9dLyk7CiAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICB9IGVsc2UgaWYgKGNoID09ICIkIikgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1w/XS8pOwogICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgfSBlbHNlIGlmICgvXHcvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XD9dLyk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHJldHVybiAiYXRvbSI7CiAgICAgIHJldHVybiAiaWRlbnQiOwogICAgfSBlbHNlIGlmIChjaCA9PSAifCIgJiYgKHN0YXRlLnZhckxpc3QgfHwgc3RhdGUubGFzdFRvayA9PSAieyIgfHwgc3RhdGUubGFzdFRvayA9PSAiZG8iKSkgewogICAgICBjdXJQdW5jID0gInwiOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoL1tcKFwpXFtcXXt9XFw7XS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi0iICYmIHN0cmVhbS5lYXQoIj4iKSkgewogICAgICByZXR1cm4gImFycm93IjsKICAgIH0gZWxzZSBpZiAoL1s9K1wtXC8qOlwuXiU8Pn58XS8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bPStcLVwvKjpcLl4lPD5+fF0vKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuQmFzZVVudGlsQnJhY2UoKSB7CiAgICB2YXIgZGVwdGggPSAxOwogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIn0iKSB7CiAgICAgICAgZGVwdGgtLTsKICAgICAgICBpZiAoZGVwdGggPT0gMCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09ICJ7IikgewogICAgICAgIGRlcHRoKys7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHJlYWRRdW90ZWQocXVvdGUsIHN0eWxlLCBlbWJlZCwgdW5lc2NhcGVkKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgKHVuZXNjYXBlZCB8fCAhZXNjYXBlZCkpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChlbWJlZCAmJiBjaCA9PSAiIyIgJiYgIWVzY2FwZWQgJiYgc3RyZWFtLmVhdCgieyIpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZS5wdXNoKHRva2VuQmFzZVVudGlsQnJhY2UoYXJndW1lbnRzLmNhbGxlZSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHJlYWRIZXJlRG9jKHBocmFzZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChwaHJhc2UpKSBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgZWxzZSBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHJlYWRCbG9ja0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2goIj1lbmQiKSAmJiBzdHJlYW0uZW9sKCkpCiAgICAgIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHt0b2tlbml6ZTogW3Rva2VuQmFzZV0sCiAgICAgICAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgICAgICAgY29udGV4dDoge3R5cGU6ICJ0b3AiLCBpbmRlbnRlZDogLWNvbmZpZy5pbmRlbnRVbml0fSwKICAgICAgICAgICAgICBjb250aW51ZWRMaW5lOiBmYWxzZSwKICAgICAgICAgICAgICBsYXN0VG9rOiBudWxsLAogICAgICAgICAgICAgIHZhckxpc3Q6IGZhbHNlfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdKHN0cmVhbSwgc3RhdGUpLCBrd3R5cGU7CiAgICAgIGlmIChzdHlsZSA9PSAiaWRlbnQiKSB7CiAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIHN0eWxlID0ga2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKSkgPyAia2V5d29yZCIKICAgICAgICAgIDogL15bQS1aXS8udGVzdCh3b3JkKSA/ICJ0YWciCiAgICAgICAgICA6IChzdGF0ZS5sYXN0VG9rID09ICJkZWYiIHx8IHN0YXRlLmxhc3RUb2sgPT0gImNsYXNzIiB8fCBzdGF0ZS52YXJMaXN0KSA/ICJkZWYiCiAgICAgICAgICA6ICJ2YXJpYWJsZSI7CiAgICAgICAgaWYgKGluZGVudFdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKSBrd3R5cGUgPSAiaW5kZW50IjsKICAgICAgICBlbHNlIGlmIChkZWRlbnRXb3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkga3d0eXBlID0gImRlZGVudCI7CiAgICAgICAgZWxzZSBpZiAoKHdvcmQgPT0gImlmIiB8fCB3b3JkID09ICJ1bmxlc3MiKSAmJiBzdHJlYW0uY29sdW1uKCkgPT0gc3RyZWFtLmluZGVudGF0aW9uKCkpCiAgICAgICAgICBrd3R5cGUgPSAiaW5kZW50IjsKICAgICAgfQogICAgICBpZiAoY3VyUHVuYyB8fCAoc3R5bGUgJiYgc3R5bGUgIT0gImNvbW1lbnQiKSkgc3RhdGUubGFzdFRvayA9IHdvcmQgfHwgY3VyUHVuYyB8fCBzdHlsZTsKICAgICAgaWYgKGN1clB1bmMgPT0gInwiKSBzdGF0ZS52YXJMaXN0ID0gIXN0YXRlLnZhckxpc3Q7CgogICAgICBpZiAoa3d0eXBlID09ICJpbmRlbnQiIHx8IC9bXChcW1x7XS8udGVzdChjdXJQdW5jKSkKICAgICAgICBzdGF0ZS5jb250ZXh0ID0ge3ByZXY6IHN0YXRlLmNvbnRleHQsIHR5cGU6IGN1clB1bmMgfHwgc3R5bGUsIGluZGVudGVkOiBzdGF0ZS5pbmRlbnRlZH07CiAgICAgIGVsc2UgaWYgKChrd3R5cGUgPT0gImRlZGVudCIgfHwgL1tcKVxdXH1dLy50ZXN0KGN1clB1bmMpKSAmJiBzdGF0ZS5jb250ZXh0LnByZXYpCiAgICAgICAgc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKCiAgICAgIGlmIChzdHJlYW0uZW9sKCkpCiAgICAgICAgc3RhdGUuY29udGludWVkTGluZSA9IChjdXJQdW5jID09ICJcXCIgfHwgc3R5bGUgPT0gIm9wZXJhdG9yIik7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGgtMV0gIT0gdG9rZW5CYXNlKSByZXR1cm4gMDsKICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICB2YXIgY3QgPSBzdGF0ZS5jb250ZXh0OwogICAgICB2YXIgY2xvc2luZyA9IGN0LnR5cGUgPT0gbWF0Y2hpbmdbZmlyc3RDaGFyXSB8fAogICAgICAgIGN0LnR5cGUgPT0gImtleXdvcmQiICYmIC9eKD86ZW5kfHVudGlsfGVsc2V8ZWxzaWZ8d2hlbnxyZXNjdWUpXGIvLnRlc3QodGV4dEFmdGVyKTsKICAgICAgcmV0dXJuIGN0LmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogY29uZmlnLmluZGVudFVuaXQpICsKICAgICAgICAoc3RhdGUuY29udGludWVkTGluZSA/IGNvbmZpZy5pbmRlbnRVbml0IDogMCk7CiAgICB9LAogICAgIGVsZWN0cmljQ2hhcnM6ICJ9ZGUiIC8vIGVuRCBhbmQgcmVzY3VFCgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcnVieSIsICJydWJ5Iik7Cgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/rust/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/rust/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFJ1c3QgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InJ1c3QuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFJ1c3QgbW9kZTwvaDE+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci8vIERlbW8gY29kZS4KCnR5cGUgZm9vPFQ+ID0gaW50OwplbnVtIGJhciB7CiAgICBzb21lKGludCwgZm9vPGZsb2F0PiksCiAgICBub25lCn0KCmZuIGNoZWNrX2NyYXRlKHg6IGludCkgewogICAgbGV0IHYgPSAxMDsKICAgIGFsdCBmb28gewogICAgICAxIHRvIDMgewogICAgICAgIHByaW50X2ZvbygpOwogICAgICAgIGlmIHggewogICAgICAgICAgICBibGFoKCkgKyAxMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgKHgsIHkpIHsgImJ5ZSIgfQogICAgICBfIHsgImhpIiB9CiAgICB9Cn0KPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIHRhYk1vZGU6ICJpbmRlbnQiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1ydXN0c3JjPC9jb2RlPi48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/rust/rust.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJydXN0IiwgZnVuY3Rpb24oKSB7CiAgdmFyIGluZGVudFVuaXQgPSA0LCBhbHRJbmRlbnRVbml0ID0gMjsKICB2YXIgdmFsS2V5d29yZHMgPSB7CiAgICAiaWYiOiAiaWYtc3R5bGUiLCAid2hpbGUiOiAiaWYtc3R5bGUiLCAiZWxzZSI6ICJlbHNlLXN0eWxlIiwKICAgICJkbyI6ICJlbHNlLXN0eWxlIiwgInJldCI6ICJlbHNlLXN0eWxlIiwgImZhaWwiOiAiZWxzZS1zdHlsZSIsCiAgICAiYnJlYWsiOiAiYXRvbSIsICJjb250IjogImF0b20iLCAiY29uc3QiOiAibGV0IiwgInJlc291cmNlIjogImZuIiwKICAgICJsZXQiOiAibGV0IiwgImZuIjogImZuIiwgImZvciI6ICJmb3IiLCAiYWx0IjogImFsdCIsICJpZmFjZSI6ICJpZmFjZSIsCiAgICAiaW1wbCI6ICJpbXBsIiwgInR5cGUiOiAidHlwZSIsICJlbnVtIjogImVudW0iLCAibW9kIjogIm1vZCIsCiAgICAiYXMiOiAib3AiLCAidHJ1ZSI6ICJhdG9tIiwgImZhbHNlIjogImF0b20iLCAiYXNzZXJ0IjogIm9wIiwgImNoZWNrIjogIm9wIiwKICAgICJjbGFpbSI6ICJvcCIsICJuYXRpdmUiOiAiaWdub3JlIiwgInVuc2FmZSI6ICJpZ25vcmUiLCAiaW1wb3J0IjogImVsc2Utc3R5bGUiLAogICAgImV4cG9ydCI6ICJlbHNlLXN0eWxlIiwgImNvcHkiOiAib3AiLCAibG9nIjogIm9wIiwgImxvZ19lcnIiOiAib3AiLAogICAgInVzZSI6ICJvcCIsICJiaW5kIjogIm9wIiwgInNlbGYiOiAiYXRvbSIKICB9OwogIHZhciB0eXBlS2V5d29yZHMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBrZXl3b3JkcyA9IHsiZm4iOiAiZm4iLCAiYmxvY2siOiAiZm4iLCAib2JqIjogIm9iaiJ9OwogICAgdmFyIGF0b21zID0gImJvb2wgdWludCBpbnQgaTggaTE2IGkzMiBpNjQgdTggdTE2IHUzMiB1NjQgZmxvYXQgZjMyIGY2NCBzdHIgY2hhciIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gYXRvbXMubGVuZ3RoOyBpIDwgZTsgKytpKSBrZXl3b3Jkc1thdG9tc1tpXV0gPSAiYXRvbSI7CiAgICByZXR1cm4ga2V5d29yZHM7CiAgfSgpOwogIHZhciBvcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/fFwuQF0vOwoKICAvLyBUb2tlbml6ZXIKCiAgLy8gVXNlZCBhcyBzY3JhdGNoIHZhcmlhYmxlIHRvIGNvbW11bmljYXRlIG11bHRpcGxlIHZhbHVlcyB3aXRob3V0CiAgLy8gY29uc2luZyB1cCB0b25zIG9mIG9iamVjdHMuCiAgdmFyIHRjYXQsIGNvbnRlbnQ7CiAgZnVuY3Rpb24gcih0Yywgc3R5bGUpIHsKICAgIHRjYXQgPSB0YzsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICciJykgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoY2ggPT0gIiciKSB7CiAgICAgIHRjYXQgPSAiYXRvbSI7CiAgICAgIGlmIChzdHJlYW0uZWF0KCJcXCIpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5za2lwVG8oIiciKSkgeyBzdHJlYW0ubmV4dCgpOyByZXR1cm4gInN0cmluZyI7IH0KICAgICAgICBlbHNlIHsgcmV0dXJuICJlcnJvciI7IH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiBzdHJlYW0uZWF0KCInIikgPyAic3RyaW5nIiA6ICJlcnJvciI7CiAgICAgIH0KICAgIH0KICAgIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgeyBzdHJlYW0uc2tpcFRvRW5kKCk7IHJldHVybiAiY29tbWVudCI7IH0KICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50KDEpOwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgfQogICAgaWYgKGNoID09ICIjIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiWyIpKSB7IHRjYXQgPSAib3Blbi1hdHRyIjsgcmV0dXJuIG51bGw7IH0KICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICByZXR1cm4gcigibWFjcm8iLCAibWV0YSIpOwogICAgfQogICAgaWYgKGNoID09ICI6IiAmJiBzdHJlYW0ubWF0Y2goIjo8IikpIHsKICAgICAgcmV0dXJuIHIoIm9wIiwgbnVsbCk7CiAgICB9CiAgICBpZiAoY2gubWF0Y2goL1xkLykgfHwgKGNoID09ICIuIiAmJiBzdHJlYW0uZWF0KC9cZC8pKSkgewogICAgICB2YXIgZmxwID0gZmFsc2U7CiAgICAgIGlmICghc3RyZWFtLm1hdGNoKC9eeFtcZGEtZl0rL2kpICYmICFzdHJlYW0ubWF0Y2goL15iWzAxXSsvKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXGQvKTsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgiLiIpKSB7IGZscCA9IHRydWU7IHN0cmVhbS5lYXRXaGlsZSgvXGQvKTsgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15lWytcLV0/XGQrL2kpKSB7IGZscCA9IHRydWU7IH0KICAgICAgfQogICAgICBpZiAoZmxwKSBzdHJlYW0ubWF0Y2goL15mKD86MzJ8NjQpLyk7CiAgICAgIGVsc2Ugc3RyZWFtLm1hdGNoKC9eW3VpXSg/Ojh8MTZ8MzJ8NjQpLyk7CiAgICAgIHJldHVybiByKCJhdG9tIiwgIm51bWJlciIpOwogICAgfQogICAgaWYgKGNoLm1hdGNoKC9bKClcW1xde306OyxdLykpIHJldHVybiByKGNoLCBudWxsKTsKICAgIGlmIChjaCA9PSAiLSIgJiYgc3RyZWFtLmVhdCgiPiIpKSByZXR1cm4gcigiLT4iLCBudWxsKTsKICAgIGlmIChjaC5tYXRjaChvcGVyYXRvckNoYXIpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShvcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gcigib3AiLCBudWxsKTsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgIGNvbnRlbnQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgaWYgKHN0cmVhbS5tYXRjaCgvXjo6XHcvKSkgewogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICByZXR1cm4gcigicHJlZml4IiwgInZhcmlhYmxlLTIiKTsKICAgIH0KICAgIGlmIChzdGF0ZS5rZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjb250ZW50KSkKICAgICAgcmV0dXJuIHIoc3RhdGUua2V5d29yZHNbY29udGVudF0sIGNvbnRlbnQubWF0Y2goL3RydWV8ZmFsc2UvKSA/ICJhdG9tIiA6ICJrZXl3b3JkIik7CiAgICByZXR1cm4gcigibmFtZSIsICJ2YXJpYWJsZSIpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoLCBlc2NhcGVkID0gZmFsc2U7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAnIicgJiYgIWVzY2FwZWQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICByZXR1cm4gcigiYXRvbSIsICJzdHJpbmciKTsKICAgICAgfQogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgIH0KICAgIC8vIEhhY2sgdG8gbm90IGNvbmZ1c2UgdGhlIHBhcnNlciB3aGVuIGEgc3RyaW5nIGlzIHNwbGl0IGluCiAgICAvLyBwaWVjZXMuCiAgICByZXR1cm4gcigib3AiLCAic3RyaW5nIik7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoZGVwdGgpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBsYXN0Q2ggPSBudWxsLCBjaDsKICAgICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICAgIGlmIChjaCA9PSAiLyIgJiYgbGFzdENoID09ICIqIikgewogICAgICAgICAgaWYgKGRlcHRoID09IDEpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQoZGVwdGggLSAxKTsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY2ggPT0gIioiICYmIGxhc3RDaCA9PSAiLyIpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50KGRlcHRoICsgMSk7CiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGxhc3RDaCA9IGNoOwogICAgICB9CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9OwogIH0KCiAgLy8gUGFyc2VyCgogIHZhciBjeCA9IHtzdGF0ZTogbnVsbCwgc3RyZWFtOiBudWxsLCBtYXJrZWQ6IG51bGwsIGNjOiBudWxsfTsKICBmdW5jdGlvbiBwYXNzKCkgewogICAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgY3guY2MucHVzaChhcmd1bWVudHNbaV0pOwogIH0KICBmdW5jdGlvbiBjb250KCkgewogICAgcGFzcy5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBwdXNobGV4KHR5cGUsIGluZm8pIHsKICAgIHZhciByZXN1bHQgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHN0YXRlID0gY3guc3RhdGU7CiAgICAgIHN0YXRlLmxleGljYWwgPSB7aW5kZW50ZWQ6IHN0YXRlLmluZGVudGVkLCBjb2x1bW46IGN4LnN0cmVhbS5jb2x1bW4oKSwKICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLCBwcmV2OiBzdGF0ZS5sZXhpY2FsLCBpbmZvOiBpbmZvfTsKICAgIH07CiAgICByZXN1bHQubGV4ID0gdHJ1ZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHBvcGxleCgpIHsKICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgaWYgKHN0YXRlLmxleGljYWwucHJldikgewogICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09ICIpIikKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7CiAgICAgIHN0YXRlLmxleGljYWwgPSBzdGF0ZS5sZXhpY2FsLnByZXY7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHR5cGVjeCgpIHsgY3guc3RhdGUua2V5d29yZHMgPSB0eXBlS2V5d29yZHM7IH0KICBmdW5jdGlvbiB2YWxjeCgpIHsgY3guc3RhdGUua2V5d29yZHMgPSB2YWxLZXl3b3JkczsgfQogIHBvcGxleC5sZXggPSB0eXBlY3gubGV4ID0gdmFsY3gubGV4ID0gdHJ1ZTsKCiAgZnVuY3Rpb24gY29tbWFzZXAoY29tYiwgZW5kKSB7CiAgICBmdW5jdGlvbiBtb3JlKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gIiwiKSByZXR1cm4gY29udChjb21iLCBtb3JlKTsKICAgICAgaWYgKHR5cGUgPT0gZW5kKSByZXR1cm4gY29udCgpOwogICAgICByZXR1cm4gY29udChtb3JlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbih0eXBlKSB7CiAgICAgIGlmICh0eXBlID09IGVuZCkgcmV0dXJuIGNvbnQoKTsKICAgICAgcmV0dXJuIHBhc3MoY29tYiwgbW9yZSk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gc3RhdF9vZihjb21iLCB0YWcpIHsKICAgIHJldHVybiBjb250KHB1c2hsZXgoInN0YXQiLCB0YWcpLCBjb21iLCBwb3BsZXgsIGJsb2NrKTsKICB9CiAgZnVuY3Rpb24gYmxvY2sodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gY29udCgpOwogICAgaWYgKHR5cGUgPT0gImxldCIpIHJldHVybiBzdGF0X29mKGxldGRlZjEsICJsZXQiKTsKICAgIGlmICh0eXBlID09ICJmbiIpIHJldHVybiBzdGF0X29mKGZuZGVmKTsKICAgIGlmICh0eXBlID09ICJ0eXBlIikgcmV0dXJuIGNvbnQocHVzaGxleCgic3RhdCIpLCB0eWRlZiwgZW5kc3RhdGVtZW50LCBwb3BsZXgsIGJsb2NrKTsKICAgIGlmICh0eXBlID09ICJlbnVtIikgcmV0dXJuIHN0YXRfb2YoZW51bWRlZik7CiAgICBpZiAodHlwZSA9PSAibW9kIikgcmV0dXJuIHN0YXRfb2YobW9kKTsKICAgIGlmICh0eXBlID09ICJpZmFjZSIpIHJldHVybiBzdGF0X29mKGlmYWNlKTsKICAgIGlmICh0eXBlID09ICJpbXBsIikgcmV0dXJuIHN0YXRfb2YoaW1wbCk7CiAgICBpZiAodHlwZSA9PSAib3Blbi1hdHRyIikgcmV0dXJuIGNvbnQocHVzaGxleCgiXSIpLCBjb21tYXNlcChleHByZXNzaW9uLCAiXSIpLCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gImlnbm9yZSIgfHwgdHlwZS5tYXRjaCgvW1xdXCk7LF0vKSkgcmV0dXJuIGNvbnQoYmxvY2spOwogICAgcmV0dXJuIHBhc3MocHVzaGxleCgic3RhdCIpLCBleHByZXNzaW9uLCBwb3BsZXgsIGVuZHN0YXRlbWVudCwgYmxvY2spOwogIH0KICBmdW5jdGlvbiBlbmRzdGF0ZW1lbnQodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gZXhwcmVzc2lvbih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiYXRvbSIgfHwgdHlwZSA9PSAibmFtZSIpIHJldHVybiBjb250KG1heWJlb3ApOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ9IiksIGV4cHJicmFjZSwgcG9wbGV4KTsKICAgIGlmICh0eXBlLm1hdGNoKC9bXFtcKF0vKSkgcmV0dXJuIG1hdGNoQnJhY2tldHModHlwZSwgZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZS5tYXRjaCgvW1xdXClcfTssXS8pKSByZXR1cm4gcGFzcygpOwogICAgaWYgKHR5cGUgPT0gImlmLXN0eWxlIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZSA9PSAiZWxzZS1zdHlsZSIgfHwgdHlwZSA9PSAib3AiKSByZXR1cm4gY29udChleHByZXNzaW9uKTsKICAgIGlmICh0eXBlID09ICJmb3IiKSByZXR1cm4gY29udChwYXR0ZXJuLCBtYXliZXR5cGUsIGlub3AsIGV4cHJlc3Npb24sIGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gImFsdCIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGFsdGJvZHkpOwogICAgaWYgKHR5cGUgPT0gImZuIikgcmV0dXJuIGNvbnQoZm5kZWYpOwogICAgaWYgKHR5cGUgPT0gIm1hY3JvIikgcmV0dXJuIGNvbnQobWFjcm8pOwogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVvcCh0eXBlKSB7CiAgICBpZiAoY29udGVudCA9PSAiLiIpIHJldHVybiBjb250KG1heWJlcHJvcCk7CiAgICBpZiAoY29udGVudCA9PSAiOjo8Iil7cmV0dXJuIGNvbnQodHlwYXJhbXMsIG1heWJlb3ApO30KICAgIGlmICh0eXBlID09ICJvcCIgfHwgY29udGVudCA9PSAiOiIpIHJldHVybiBjb250KGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gIigiIHx8IHR5cGUgPT0gIlsiKSByZXR1cm4gbWF0Y2hCcmFja2V0cyh0eXBlLCBleHByZXNzaW9uKTsKICAgIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlcHJvcCgpIHsKICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXHcrJC8pKSB7Y3gubWFya2VkID0gInZhcmlhYmxlIjsgcmV0dXJuIGNvbnQobWF5YmVvcCk7fQogICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbik7CiAgfQogIGZ1bmN0aW9uIGV4cHJicmFjZSh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAib3AiKSB7CiAgICAgIGlmIChjb250ZW50ID09ICJ8IikgcmV0dXJuIGNvbnQoYmxvY2t2YXJzLCBwb3BsZXgsIHB1c2hsZXgoIn0iLCAiYmxvY2siKSwgYmxvY2spOwogICAgICBpZiAoY29udGVudCA9PSAifHwiKSByZXR1cm4gY29udChwb3BsZXgsIHB1c2hsZXgoIn0iLCAiYmxvY2siKSwgYmxvY2spOwogICAgfQogICAgaWYgKGNvbnRlbnQgPT0gIm11dGFibGUiIHx8IChjb250ZW50Lm1hdGNoKC9eXHcrJC8pICYmIGN4LnN0cmVhbS5wZWVrKCkgPT0gIjoiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFjeC5zdHJlYW0ubWF0Y2goIjo6IiwgZmFsc2UpKSkKICAgICAgcmV0dXJuIHBhc3MocmVjb3JkX29mKGV4cHJlc3Npb24pKTsKICAgIHJldHVybiBwYXNzKGJsb2NrKTsKICB9CiAgZnVuY3Rpb24gcmVjb3JkX29mKGNvbWIpIHsKICAgIGZ1bmN0aW9uIHJvKHR5cGUpIHsKICAgICAgaWYgKGNvbnRlbnQgPT0gIm11dGFibGUiIHx8IGNvbnRlbnQgPT0gIndpdGgiKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChybyk7fQogICAgICBpZiAoY29udGVudC5tYXRjaCgvXlx3KiQvKSkge2N4Lm1hcmtlZCA9ICJ2YXJpYWJsZSI7IHJldHVybiBjb250KHJvKTt9CiAgICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQoY29tYiwgcm8pOwogICAgICBpZiAodHlwZSA9PSAifSIpIHJldHVybiBjb250KCk7CiAgICAgIHJldHVybiBjb250KHJvKTsKICAgIH0KICAgIHJldHVybiBybzsKICB9CiAgZnVuY3Rpb24gYmxvY2t2YXJzKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJuYW1lIikge2N4Lm1hcmtlZCA9ICJkZWYiOyByZXR1cm4gY29udChibG9ja3ZhcnMpO30KICAgIGlmICh0eXBlID09ICJvcCIgJiYgY29udGVudCA9PSAifCIpIHJldHVybiBjb250KCk7CiAgICByZXR1cm4gY29udChibG9ja3ZhcnMpOwogIH0KCiAgZnVuY3Rpb24gbGV0ZGVmMSh0eXBlKSB7CiAgICBpZiAodHlwZS5tYXRjaCgvW1xdXClcfTtdLykpIHJldHVybiBjb250KCk7CiAgICBpZiAoY29udGVudCA9PSAiPSIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGxldGRlZjIpOwogICAgaWYgKHR5cGUgPT0gIiwiKSByZXR1cm4gY29udChsZXRkZWYxKTsKICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJldHlwZSwgbGV0ZGVmMSk7CiAgfQogIGZ1bmN0aW9uIGxldGRlZjIodHlwZSkgewogICAgaWYgKHR5cGUubWF0Y2goL1tcXVwpXH07LF0vKSkgcmV0dXJuIHBhc3MobGV0ZGVmMSk7CiAgICBlbHNlIHJldHVybiBwYXNzKGV4cHJlc3Npb24sIGxldGRlZjIpOwogIH0KICBmdW5jdGlvbiBtYXliZXR5cGUodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIjoiKSByZXR1cm4gY29udCh0eXBlY3gsIHJ0eXBlLCB2YWxjeCk7CiAgICByZXR1cm4gcGFzcygpOwogIH0KICBmdW5jdGlvbiBpbm9wKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJuYW1lIiAmJiBjb250ZW50ID09ICJpbiIpIHtjeC5tYXJrZWQgPSAia2V5d29yZCI7IHJldHVybiBjb250KCk7fQogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gZm5kZWYodHlwZSkgewogICAgaWYgKGNvbnRlbnQgPT0gIkAiIHx8IGNvbnRlbnQgPT0gIn4iKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChmbmRlZik7fQogICAgaWYgKHR5cGUgPT0gIm5hbWUiKSB7Y3gubWFya2VkID0gImRlZiI7IHJldHVybiBjb250KGZuZGVmKTt9CiAgICBpZiAoY29udGVudCA9PSAiPCIpIHJldHVybiBjb250KHR5cGFyYW1zLCBmbmRlZik7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBwYXNzKGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gY29udChwdXNobGV4KCIpIiksIGNvbW1hc2VwKGFyZ2RlZiwgIikiKSwgcG9wbGV4LCBmbmRlZik7CiAgICBpZiAodHlwZSA9PSAiLT4iKSByZXR1cm4gY29udCh0eXBlY3gsIHJ0eXBlLCB2YWxjeCwgZm5kZWYpOwogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIGNvbnQoZm5kZWYpOwogIH0KICBmdW5jdGlvbiB0eWRlZih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQodHlkZWYpO30KICAgIGlmIChjb250ZW50ID09ICI8IikgcmV0dXJuIGNvbnQodHlwYXJhbXMsIHR5ZGVmKTsKICAgIGlmIChjb250ZW50ID09ICI9IikgcmV0dXJuIGNvbnQodHlwZWN4LCBydHlwZSwgdmFsY3gpOwogICAgcmV0dXJuIGNvbnQodHlkZWYpOwogIH0KICBmdW5jdGlvbiBlbnVtZGVmKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJuYW1lIikge2N4Lm1hcmtlZCA9ICJkZWYiOyByZXR1cm4gY29udChlbnVtZGVmKTt9CiAgICBpZiAoY29udGVudCA9PSAiPCIpIHJldHVybiBjb250KHR5cGFyYW1zLCBlbnVtZGVmKTsKICAgIGlmIChjb250ZW50ID09ICI9IikgcmV0dXJuIGNvbnQodHlwZWN4LCBydHlwZSwgdmFsY3gsIGVuZHN0YXRlbWVudCk7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgdHlwZWN4LCBlbnVtYmxvY2ssIHZhbGN4LCBwb3BsZXgpOwogICAgcmV0dXJuIGNvbnQoZW51bWRlZik7CiAgfQogIGZ1bmN0aW9uIGVudW1ibG9jayh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAifSIpIHJldHVybiBjb250KCk7CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgY29tbWFzZXAocnR5cGUsICIpIiksIHBvcGxleCwgZW51bWJsb2NrKTsKICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXHcrJC8pKSBjeC5tYXJrZWQgPSAiZGVmIjsKICAgIHJldHVybiBjb250KGVudW1ibG9jayk7CiAgfQogIGZ1bmN0aW9uIG1vZCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQobW9kKTt9CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgYmxvY2ssIHBvcGxleCk7CiAgICByZXR1cm4gcGFzcygpOwogIH0KICBmdW5jdGlvbiBpZmFjZSh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQoaWZhY2UpO30KICAgIGlmIChjb250ZW50ID09ICI8IikgcmV0dXJuIGNvbnQodHlwYXJhbXMsIGlmYWNlKTsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLCBibG9jaywgcG9wbGV4KTsKICAgIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIGltcGwodHlwZSkgewogICAgaWYgKGNvbnRlbnQgPT0gIjwiKSByZXR1cm4gY29udCh0eXBhcmFtcywgaW1wbCk7CiAgICBpZiAoY29udGVudCA9PSAib2YiIHx8IGNvbnRlbnQgPT0gImZvciIpIHtjeC5tYXJrZWQgPSAia2V5d29yZCI7IHJldHVybiBjb250KHJ0eXBlLCBpbXBsKTt9CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQoaW1wbCk7fQogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ9IiksIGJsb2NrLCBwb3BsZXgpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gdHlwYXJhbXMoKSB7CiAgICBpZiAoY29udGVudCA9PSAiPiIpIHJldHVybiBjb250KCk7CiAgICBpZiAoY29udGVudCA9PSAiLCIpIHJldHVybiBjb250KHR5cGFyYW1zKTsKICAgIGlmIChjb250ZW50ID09ICI6IikgcmV0dXJuIGNvbnQocnR5cGUsIHR5cGFyYW1zKTsKICAgIHJldHVybiBwYXNzKHJ0eXBlLCB0eXBhcmFtcyk7CiAgfQogIGZ1bmN0aW9uIGFyZ2RlZih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQoYXJnZGVmKTt9CiAgICBpZiAodHlwZSA9PSAiOiIpIHJldHVybiBjb250KHR5cGVjeCwgcnR5cGUsIHZhbGN4KTsKICAgIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIHJ0eXBlKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJuYW1lIikge2N4Lm1hcmtlZCA9ICJ2YXJpYWJsZS0zIjsgcmV0dXJuIGNvbnQocnR5cGVtYXliZXBhcmFtKTsgfQogICAgaWYgKGNvbnRlbnQgPT0gIm11dGFibGUiKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChydHlwZSk7fQogICAgaWYgKHR5cGUgPT0gImF0b20iKSByZXR1cm4gY29udChydHlwZW1heWJlcGFyYW0pOwogICAgaWYgKHR5cGUgPT0gIm9wIiB8fCB0eXBlID09ICJvYmoiKSByZXR1cm4gY29udChydHlwZSk7CiAgICBpZiAodHlwZSA9PSAiZm4iKSByZXR1cm4gY29udChmbnR5cGUpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ7IiksIHJlY29yZF9vZihydHlwZSksIHBvcGxleCk7CiAgICByZXR1cm4gbWF0Y2hCcmFja2V0cyh0eXBlLCBydHlwZSk7CiAgfQogIGZ1bmN0aW9uIHJ0eXBlbWF5YmVwYXJhbSgpIHsKICAgIGlmIChjb250ZW50ID09ICI8IikgcmV0dXJuIGNvbnQodHlwYXJhbXMpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gZm50eXBlKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiKCIpLCBjb21tYXNlcChydHlwZSwgIikiKSwgcG9wbGV4LCBmbnR5cGUpOwogICAgaWYgKHR5cGUgPT0gIi0+IikgcmV0dXJuIGNvbnQocnR5cGUpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gcGF0dGVybih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQocGF0dGVybm1heWJlb3ApO30KICAgIGlmICh0eXBlID09ICJhdG9tIikgcmV0dXJuIGNvbnQocGF0dGVybm1heWJlb3ApOwogICAgaWYgKHR5cGUgPT0gIm9wIikgcmV0dXJuIGNvbnQocGF0dGVybik7CiAgICBpZiAodHlwZS5tYXRjaCgvW1xdXClcfTssXS8pKSByZXR1cm4gcGFzcygpOwogICAgcmV0dXJuIG1hdGNoQnJhY2tldHModHlwZSwgcGF0dGVybik7CiAgfQogIGZ1bmN0aW9uIHBhdHRlcm5tYXliZW9wKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJvcCIgJiYgY29udGVudCA9PSAiLiIpIHJldHVybiBjb250KCk7CiAgICBpZiAoY29udGVudCA9PSAidG8iKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChwYXR0ZXJuKTt9CiAgICBlbHNlIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIGFsdGJvZHkodHlwZSkgewogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ9IiwgImFsdCIpLCBhbHRibG9jazEsIHBvcGxleCk7CiAgICByZXR1cm4gcGFzcygpOwogIH0KICBmdW5jdGlvbiBhbHRibG9jazEodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gY29udCgpOwogICAgaWYgKHR5cGUgPT0gInwiKSByZXR1cm4gY29udChhbHRibG9jazEpOwogICAgaWYgKGNvbnRlbnQgPT0gIndoZW4iKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChleHByZXNzaW9uLCBhbHRibG9jazIpO30KICAgIGlmICh0eXBlLm1hdGNoKC9bXF1cKTssXS8pKSByZXR1cm4gY29udChhbHRibG9jazEpOwogICAgcmV0dXJuIHBhc3MocGF0dGVybiwgYWx0YmxvY2syKTsKICB9CiAgZnVuY3Rpb24gYWx0YmxvY2syKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIsICJhbHQiKSwgYmxvY2ssIHBvcGxleCwgYWx0YmxvY2sxKTsKICAgIGVsc2UgcmV0dXJuIHBhc3MoYWx0YmxvY2sxKTsKICB9CgogIGZ1bmN0aW9uIG1hY3JvKHR5cGUpIHsKICAgIGlmICh0eXBlLm1hdGNoKC9bXFtcKFx7XS8pKSByZXR1cm4gbWF0Y2hCcmFja2V0cyh0eXBlLCBleHByZXNzaW9uKTsKICAgIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIG1hdGNoQnJhY2tldHModHlwZSwgY29tYikgewogICAgaWYgKHR5cGUgPT0gIlsiKSByZXR1cm4gY29udChwdXNobGV4KCJdIiksIGNvbW1hc2VwKGNvbWIsICJdIiksIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgY29tbWFzZXAoY29tYiwgIikiKSwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLCBjb21tYXNlcChjb21iLCAifSIpLCBwb3BsZXgpOwogICAgcmV0dXJuIGNvbnQoKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlKHN0YXRlLCBzdHJlYW0sIHN0eWxlKSB7CiAgICB2YXIgY2MgPSBzdGF0ZS5jYzsKICAgIC8vIENvbW11bmljYXRlIG91ciBjb250ZXh0IHRvIHRoZSBjb21iaW5hdG9ycy4KICAgIC8vIChMZXNzIHdhc3RlZnVsIHRoYW4gY29uc2luZyB1cCBhIGh1bmRyZWQgY2xvc3VyZXMgb24gZXZlcnkgY2FsbC4pCiAgICBjeC5zdGF0ZSA9IHN0YXRlOyBjeC5zdHJlYW0gPSBzdHJlYW07IGN4Lm1hcmtlZCA9IG51bGwsIGN4LmNjID0gY2M7CgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdmFyIGNvbWJpbmF0b3IgPSBjYy5sZW5ndGggPyBjYy5wb3AoKSA6IGJsb2NrOwogICAgICBpZiAoY29tYmluYXRvcih0Y2F0KSkgewogICAgICAgIHdoaWxlKGNjLmxlbmd0aCAmJiBjY1tjYy5sZW5ndGggLSAxXS5sZXgpCiAgICAgICAgICBjYy5wb3AoKSgpOwogICAgICAgIHJldHVybiBjeC5tYXJrZWQgfHwgc3R5bGU7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgIGNjOiBbXSwKICAgICAgICBsZXhpY2FsOiB7aW5kZW50ZWQ6IC1pbmRlbnRVbml0LCBjb2x1bW46IDAsIHR5cGU6ICJ0b3AiLCBhbGlnbjogZmFsc2V9LAogICAgICAgIGtleXdvcmRzOiB2YWxLZXl3b3JkcywKICAgICAgICBpbmRlbnRlZDogMAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKCFzdGF0ZS5sZXhpY2FsLmhhc093blByb3BlcnR5KCJhbGlnbiIpKQogICAgICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdGNhdCA9IGNvbnRlbnQgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlID09ICJjb21tZW50IikgcmV0dXJuIHN0eWxlOwogICAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoImFsaWduIikpCiAgICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IHRydWU7CiAgICAgIGlmICh0Y2F0ID09ICJwcmVmaXgiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmICghY29udGVudCkgY29udGVudCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIHJldHVybiBwYXJzZShzdGF0ZSwgc3RyZWFtLCBzdHlsZSk7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlKSByZXR1cm4gMDsKICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApLCBsZXhpY2FsID0gc3RhdGUubGV4aWNhbCwKICAgICAgICAgIHR5cGUgPSBsZXhpY2FsLnR5cGUsIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gdHlwZTsKICAgICAgaWYgKHR5cGUgPT0gInN0YXQiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIGluZGVudFVuaXQ7CiAgICAgIGlmIChsZXhpY2FsLmFsaWduKSByZXR1cm4gbGV4aWNhbC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiAobGV4aWNhbC5pbmZvID09ICJhbHQiID8gYWx0SW5kZW50VW5pdCA6IGluZGVudFVuaXQpKTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcnVzdHNyYyIsICJydXN0Iik7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/scheme/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/scheme/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFNjaGVtZSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ic2NoZW1lLmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7YmFja2dyb3VuZDogI2Y4ZjhmODt9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogU2NoZW1lIG1vZGU8L2gxPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KOyBTZWUgaWYgdGhlIGlucHV0IHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gc3ltYm9sLgooZGVmaW5lIChtYXRjaC1zeW1ib2wgaW5wdXQgcGF0dGVybikKICAoY29uZCAoKG51bGw/IChyZW1haW4gaW5wdXQpKSAjZikKCSgoZXF2PyAoY2FyIChyZW1haW4gaW5wdXQpKSBwYXR0ZXJuKSAoci1jZHIgaW5wdXQpKQoJKGVsc2UgI2YpKSkKCjsgQWxsb3cgdGhlIGlucHV0IHRvIHN0YXJ0IHdpdGggb25lIG9mIGEgbGlzdCBvZiBwYXR0ZXJucy4KKGRlZmluZSAobWF0Y2gtb3IgaW5wdXQgcGF0dGVybikKICAoY29uZCAoKG51bGw/IHBhdHRlcm4pICNmKQoJKChtYXRjaC1wYXR0ZXJuIGlucHV0IChjYXIgcGF0dGVybikpKQoJKGVsc2UgKG1hdGNoLW9yIGlucHV0IChjZHIgcGF0dGVybikpKSkpCgo7IEFsbG93IGEgc2VxdWVuY2Ugb2YgcGF0dGVybnMuCihkZWZpbmUgKG1hdGNoLXNlcSBpbnB1dCBwYXR0ZXJuKQogIChpZiAobnVsbD8gcGF0dGVybikKICAgICAgaW5wdXQKICAgICAgKGxldCAoKG1hdGNoIChtYXRjaC1wYXR0ZXJuIGlucHV0IChjYXIgcGF0dGVybikpKSkKCShpZiBtYXRjaCAobWF0Y2gtc2VxIG1hdGNoIChjZHIgcGF0dGVybikpICNmKSkpKQoKOyBNYXRjaCB3aXRoIHRoZSBwYXR0ZXJuIGJ1dCBubyBwcm9ibGVtIGlmIGl0IGRvZXMgbm90IG1hdGNoLgooZGVmaW5lIChtYXRjaC1vcHQgaW5wdXQgcGF0dGVybikKICAobGV0ICgobWF0Y2ggKG1hdGNoLXBhdHRlcm4gaW5wdXQgKGNhciBwYXR0ZXJuKSkpKQogICAgKGlmIG1hdGNoIG1hdGNoIGlucHV0KSkpCgo7IE1hdGNoIGFueXRoaW5nIChvdGhlciB0aGFuICcoKSksIHVudGlsIHBhdHRlcm4gaXMgZm91bmQuIFRoZSByYXRoZXIKOyBjbHVtc3kgZm9ybSBvZiByZXF1aXJpbmcgYW4gZW5kaW5nIHBhdHRlcm4gaXMgbmVlZGVkIHRvIGRlY2lkZSB3aGVyZQo7IHRoZSBlbmQgb2YgdGhlIG1hdGNoIGlzLiBJZiBub25lIGlzIGdpdmVuLCB0aGlzIHdpbGwgbWF0Y2ggdGhlIHJlc3QKOyBvZiB0aGUgc2VudGVuY2UuCihkZWZpbmUgKG1hdGNoLWFueSBpbnB1dCBwYXR0ZXJuKQogIChjb25kICgobnVsbD8gKHJlbWFpbiBpbnB1dCkpICNmKQoJKChudWxsPyBwYXR0ZXJuKSAoZi1jb25zIChyZW1haW4gaW5wdXQpIChjbGVhci1yZW1haW4gaW5wdXQpKSkKCShlbHNlCgkgKGxldCAoKGFjY3VtLWFueSAoY29sbGVjdG9yKSkpCgkgICAoZGVmaW5lIChtYXRjaC1wYXR0ZXJuLWFueSBpbnB1dCBwYXR0ZXJuKQoJICAgICAoY29uZCAoKG51bGw/IChyZW1haW4gaW5wdXQpKSAjZikKCQkgICAoZWxzZSAoYWNjdW0tYW55IChjYXIgKHJlbWFpbiBpbnB1dCkpKQoJCQkgKGNvbmQgKChtYXRjaC1wYXR0ZXJuIChyLWNkciBpbnB1dCkgcGF0dGVybikpCgkJCSAgICAgICAoZWxzZSAobWF0Y2gtcGF0dGVybi1hbnkgKHItY2RyIGlucHV0KSBwYXR0ZXJuKSkpKSkpCgkgICAobGV0ICgocmV0dmFsIChtYXRjaC1wYXR0ZXJuLWFueSBpbnB1dCAoY2FyIHBhdHRlcm4pKSkpCgkgICAgIChpZiByZXR2YWwKCQkgKGYtY29ucyAoYWNjdW0tYW55KSByZXR2YWwpCgkJICNmKSkpKSkpCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtc2NoZW1lPC9jb2RlPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/scheme/scheme.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEF1dGhvcjogS29oIFppIEhhbiwgYmFzZWQgb24gaW1wbGVtZW50YXRpb24gYnkgS29oIFppIENodW4KICovCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgic2NoZW1lIiwgZnVuY3Rpb24gKCkgewogICAgdmFyIEJVSUxUSU4gPSAiYnVpbHRpbiIsIENPTU1FTlQgPSAiY29tbWVudCIsIFNUUklORyA9ICJzdHJpbmciLAogICAgICAgIEFUT00gPSAiYXRvbSIsIE5VTUJFUiA9ICJudW1iZXIiLCBCUkFDS0VUID0gImJyYWNrZXQiOwogICAgdmFyIElOREVOVF9XT1JEX1NLSVAgPSAyOwoKICAgIGZ1bmN0aW9uIG1ha2VLZXl3b3JkcyhzdHIpIHsKICAgICAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0KCiAgICB2YXIga2V5d29yZHMgPSBtYWtlS2V5d29yZHMoIs67IGNhc2UtbGFtYmRhIGNhbGwvY2MgY2xhc3MgZGVmaW5lLWNsYXNzIGV4aXQtaGFuZGxlciBmaWVsZCBpbXBvcnQgaW5oZXJpdCBpbml0LWZpZWxkIGludGVyZmFjZSBsZXQqLXZhbHVlcyBsZXQtdmFsdWVzIGxldC9lYyBtaXhpbiBvcHQtbGFtYmRhIG92ZXJyaWRlIHByb3RlY3QgcHJvdmlkZSBwdWJsaWMgcmVuYW1lIHJlcXVpcmUgcmVxdWlyZS1mb3Itc3ludGF4IHN5bnRheCBzeW50YXgtY2FzZSBzeW50YXgtZXJyb3IgdW5pdC9zaWcgdW5sZXNzIHdoZW4gd2l0aC1zeW50YXggYW5kIGJlZ2luIGNhbGwtd2l0aC1jdXJyZW50LWNvbnRpbnVhdGlvbiBjYWxsLXdpdGgtaW5wdXQtZmlsZSBjYWxsLXdpdGgtb3V0cHV0LWZpbGUgY2FzZSBjb25kIGRlZmluZSBkZWZpbmUtc3ludGF4IGRlbGF5IGRvIGR5bmFtaWMtd2luZCBlbHNlIGZvci1lYWNoIGlmIGxhbWJkYSBsZXQgbGV0KiBsZXQtc3ludGF4IGxldHJlYyBsZXRyZWMtc3ludGF4IG1hcCBvciBzeW50YXgtcnVsZXMgYWJzIGFjb3MgYW5nbGUgYXBwZW5kIGFwcGx5IGFzaW4gYXNzb2MgYXNzcSBhc3N2IGF0YW4gYm9vbGVhbj8gY2FhciBjYWRyIGNhbGwtd2l0aC1pbnB1dC1maWxlIGNhbGwtd2l0aC1vdXRwdXQtZmlsZSBjYWxsLXdpdGgtdmFsdWVzIGNhciBjZGRkYXIgY2RkZGRyIGNkciBjZWlsaW5nIGNoYXItPmludGVnZXIgY2hhci1hbHBoYWJldGljPyBjaGFyLWNpPD0/IGNoYXItY2k8PyBjaGFyLWNpPT8gY2hhci1jaT49PyBjaGFyLWNpPj8gY2hhci1kb3duY2FzZSBjaGFyLWxvd2VyLWNhc2U/IGNoYXItbnVtZXJpYz8gY2hhci1yZWFkeT8gY2hhci11cGNhc2UgY2hhci11cHBlci1jYXNlPyBjaGFyLXdoaXRlc3BhY2U/IGNoYXI8PT8gY2hhcjw/IGNoYXI9PyBjaGFyPj0/IGNoYXI+PyBjaGFyPyBjbG9zZS1pbnB1dC1wb3J0IGNsb3NlLW91dHB1dC1wb3J0IGNvbXBsZXg/IGNvbnMgY29zIGN1cnJlbnQtaW5wdXQtcG9ydCBjdXJyZW50LW91dHB1dC1wb3J0IGRlbm9taW5hdG9yIGRpc3BsYXkgZW9mLW9iamVjdD8gZXE/IGVxdWFsPyBlcXY/IGV2YWwgZXZlbj8gZXhhY3QtPmluZXhhY3QgZXhhY3Q/IGV4cCBleHB0ICNmIGZsb29yIGZvcmNlIGdjZCBpbWFnLXBhcnQgaW5leGFjdC0+ZXhhY3QgaW5leGFjdD8gaW5wdXQtcG9ydD8gaW50ZWdlci0+Y2hhciBpbnRlZ2VyPyBpbnRlcmFjdGlvbi1lbnZpcm9ubWVudCBsY20gbGVuZ3RoIGxpc3QgbGlzdC0+c3RyaW5nIGxpc3QtPnZlY3RvciBsaXN0LXJlZiBsaXN0LXRhaWwgbGlzdD8gbG9hZCBsb2cgbWFnbml0dWRlIG1ha2UtcG9sYXIgbWFrZS1yZWN0YW5ndWxhciBtYWtlLXN0cmluZyBtYWtlLXZlY3RvciBtYXggbWVtYmVyIG1lbXEgbWVtdiBtaW4gbW9kdWxvIG5lZ2F0aXZlPyBuZXdsaW5lIG5vdCBudWxsLWVudmlyb25tZW50IG51bGw/IG51bWJlci0+c3RyaW5nIG51bWJlcj8gbnVtZXJhdG9yIG9kZD8gb3Blbi1pbnB1dC1maWxlIG9wZW4tb3V0cHV0LWZpbGUgb3V0cHV0LXBvcnQ/IHBhaXI/IHBlZWstY2hhciBwb3J0PyBwb3NpdGl2ZT8gcHJvY2VkdXJlPyBxdWFzaXF1b3RlIHF1b3RlIHF1b3RpZW50IHJhdGlvbmFsPyByYXRpb25hbGl6ZSByZWFkIHJlYWQtY2hhciByZWFsLXBhcnQgcmVhbD8gcmVtYWluZGVyIHJldmVyc2Ugcm91bmQgc2NoZW1lLXJlcG9ydC1lbnZpcm9ubWVudCBzZXQhIHNldC1jYXIhIHNldC1jZHIhIHNpbiBzcXJ0IHN0cmluZyBzdHJpbmctPmxpc3Qgc3RyaW5nLT5udW1iZXIgc3RyaW5nLT5zeW1ib2wgc3RyaW5nLWFwcGVuZCBzdHJpbmctY2k8PT8gc3RyaW5nLWNpPD8gc3RyaW5nLWNpPT8gc3RyaW5nLWNpPj0/IHN0cmluZy1jaT4/IHN0cmluZy1jb3B5IHN0cmluZy1maWxsISBzdHJpbmctbGVuZ3RoIHN0cmluZy1yZWYgc3RyaW5nLXNldCEgc3RyaW5nPD0/IHN0cmluZzw/IHN0cmluZz0/IHN0cmluZz49PyBzdHJpbmc+PyBzdHJpbmc/IHN1YnN0cmluZyBzeW1ib2wtPnN0cmluZyBzeW1ib2w/ICN0IHRhbiB0cmFuc2NyaXB0LW9mZiB0cmFuc2NyaXB0LW9uIHRydW5jYXRlIHZhbHVlcyB2ZWN0b3IgdmVjdG9yLT5saXN0IHZlY3Rvci1maWxsISB2ZWN0b3ItbGVuZ3RoIHZlY3Rvci1yZWYgdmVjdG9yLXNldCEgd2l0aC1pbnB1dC1mcm9tLWZpbGUgd2l0aC1vdXRwdXQtdG8tZmlsZSB3cml0ZSB3cml0ZS1jaGFyIHplcm8/Iik7CiAgICB2YXIgaW5kZW50S2V5cyA9IG1ha2VLZXl3b3JkcygiZGVmaW5lIGxldCBsZXRyZWMgbGV0KiBsYW1iZGEiKTsKCiAgICBmdW5jdGlvbiBzdGF0ZVN0YWNrKGluZGVudCwgdHlwZSwgcHJldikgeyAvLyByZXByZXNlbnRzIGEgc3RhdGUgc3RhY2sgb2JqZWN0CiAgICAgICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7CiAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICB0aGlzLnByZXYgPSBwcmV2OwogICAgfQoKICAgIGZ1bmN0aW9uIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50LCB0eXBlKSB7CiAgICAgICAgc3RhdGUuaW5kZW50U3RhY2sgPSBuZXcgc3RhdGVTdGFjayhpbmRlbnQsIHR5cGUsIHN0YXRlLmluZGVudFN0YWNrKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3BTdGFjayhzdGF0ZSkgewogICAgICAgIHN0YXRlLmluZGVudFN0YWNrID0gc3RhdGUuaW5kZW50U3RhY2sucHJldjsKICAgIH0KCiAgICB2YXIgYmluYXJ5TWF0Y2hlciA9IG5ldyBSZWdFeHAoL14oPzpbLStdaXxbLStdWzAxXSsjKig/OlwvWzAxXSsjKik/aXxbLStdP1swMV0rIyooPzpcL1swMV0rIyopP0BbLStdP1swMV0rIyooPzpcL1swMV0rIyopP3xbLStdP1swMV0rIyooPzpcL1swMV0rIyopP1stK10oPzpbMDFdKyMqKD86XC9bMDFdKyMqKT8pP2l8Wy0rXT9bMDFdKyMqKD86XC9bMDFdKyMqKT8pKD89WygpXHM7Il18JCkvaSk7CiAgICB2YXIgb2N0YWxNYXRjaGVyID0gbmV3IFJlZ0V4cCgvXig/OlstK11pfFstK11bMC03XSsjKig/OlwvWzAtN10rIyopP2l8Wy0rXT9bMC03XSsjKig/OlwvWzAtN10rIyopP0BbLStdP1swLTddKyMqKD86XC9bMC03XSsjKik/fFstK10/WzAtN10rIyooPzpcL1swLTddKyMqKT9bLStdKD86WzAtN10rIyooPzpcL1swLTddKyMqKT8pP2l8Wy0rXT9bMC03XSsjKig/OlwvWzAtN10rIyopPykoPz1bKClcczsiXXwkKS9pKTsKICAgIHZhciBoZXhNYXRjaGVyID0gbmV3IFJlZ0V4cCgvXig/OlstK11pfFstK11bXGRhLWZdKyMqKD86XC9bXGRhLWZdKyMqKT9pfFstK10/W1xkYS1mXSsjKig/OlwvW1xkYS1mXSsjKik/QFstK10/W1xkYS1mXSsjKig/OlwvW1xkYS1mXSsjKik/fFstK10/W1xkYS1mXSsjKig/OlwvW1xkYS1mXSsjKik/Wy0rXSg/OltcZGEtZl0rIyooPzpcL1tcZGEtZl0rIyopPyk/aXxbLStdP1tcZGEtZl0rIyooPzpcL1tcZGEtZl0rIyopPykoPz1bKClcczsiXXwkKS9pKTsKICAgIHZhciBkZWNpbWFsTWF0Y2hlciA9IG5ldyBSZWdFeHAoL14oPzpbLStdaXxbLStdKD86KD86KD86XGQrIytcLj8jKnxcZCtcLlxkKiMqfFwuXGQrIyp8XGQrKSg/Oltlc2ZkbF1bLStdP1xkKyk/KXxcZCsjKlwvXGQrIyopaXxbLStdPyg/Oig/Oig/OlxkKyMrXC4/Iyp8XGQrXC5cZCojKnxcLlxkKyMqfFxkKykoPzpbZXNmZGxdWy0rXT9cZCspPyl8XGQrIypcL1xkKyMqKUBbLStdPyg/Oig/Oig/OlxkKyMrXC4/Iyp8XGQrXC5cZCojKnxcLlxkKyMqfFxkKykoPzpbZXNmZGxdWy0rXT9cZCspPyl8XGQrIypcL1xkKyMqKXxbLStdPyg/Oig/Oig/OlxkKyMrXC4/Iyp8XGQrXC5cZCojKnxcLlxkKyMqfFxkKykoPzpbZXNmZGxdWy0rXT9cZCspPyl8XGQrIypcL1xkKyMqKVstK10oPzooPzooPzpcZCsjK1wuPyMqfFxkK1wuXGQqIyp8XC5cZCsjKnxcZCspKD86W2VzZmRsXVstK10/XGQrKT8pfFxkKyMqXC9cZCsjKik/aXwoPzooPzooPzpcZCsjK1wuPyMqfFxkK1wuXGQqIyp8XC5cZCsjKnxcZCspKD86W2VzZmRsXVstK10/XGQrKT8pfFxkKyMqXC9cZCsjKikpKD89WygpXHM7Il18JCkvaSk7CgogICAgZnVuY3Rpb24gaXNCaW5hcnlOdW1iZXIgKHN0cmVhbSkgewogICAgICAgIHJldHVybiBzdHJlYW0ubWF0Y2goYmluYXJ5TWF0Y2hlcik7CiAgICB9CgogICAgZnVuY3Rpb24gaXNPY3RhbE51bWJlciAoc3RyZWFtKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS5tYXRjaChvY3RhbE1hdGNoZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzRGVjaW1hbE51bWJlciAoc3RyZWFtLCBiYWNrdXApIHsKICAgICAgICBpZiAoYmFja3VwID09PSB0cnVlKSB7CiAgICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHJlYW0ubWF0Y2goZGVjaW1hbE1hdGNoZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzSGV4TnVtYmVyIChzdHJlYW0pIHsKICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKGhleE1hdGNoZXIpOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5kZW50U3RhY2s6IG51bGwsCiAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbjogMCwKICAgICAgICAgICAgICAgIG1vZGU6IGZhbHNlLAogICAgICAgICAgICAgICAgc0V4cHJDb21tZW50OiBmYWxzZQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICBpZiAoc3RhdGUuaW5kZW50U3RhY2sgPT0gbnVsbCAmJiBzdHJlYW0uc29sKCkpIHsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBpbmRlbnRhdGlvbiwgYnV0IG9ubHkgaWYgaW5kZW50U3RhY2sgaXMgZW1wdHkKICAgICAgICAgICAgICAgIHN0YXRlLmluZGVudGF0aW9uID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNraXAgc3BhY2VzCiAgICAgICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJldHVyblR5cGUgPSBudWxsOwoKICAgICAgICAgICAgc3dpdGNoKHN0YXRlLm1vZGUpewogICAgICAgICAgICAgICAgY2FzZSAic3RyaW5nIjogLy8gbXVsdGktbGluZSBzdHJpbmcgcGFyc2luZyBtb2RlCiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQsIGVzY2FwZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICJcIiIgJiYgIWVzY2FwZWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gU1RSSU5HOyAvLyBjb250aW51ZSBvbiBpbiBzY2hlbWUtc3RyaW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImNvbW1lbnQiOiAvLyBjb21tZW50IHBhcnNpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0LCBtYXliZUVuZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gIiMiICYmIG1heWJlRW5kKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVFbmQgPSAobmV4dCA9PSAifCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQ09NTUVOVDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInMtZXhwci1jb21tZW50IjogLy8gcy1leHByIGNvbW1lbnRpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZihzdHJlYW0ucGVlaygpID09ICIoIiB8fCBzdHJlYW0ucGVlaygpID09ICJbIil7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHN0YXJ0IHNjaGVtZSBzLWV4cHIgY29tbWVudGluZyBtb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnNFeHByQ29tbWVudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCB3ZSBqdXN0IGNvbW1lbnQgdGhlIGVudGlyZSBvZiB0aGUgbmV4dCB0b2tlbgogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teL3NdLyk7IC8vIGVhdCBub24gc3BhY2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBDT01NRU5UOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBkZWZhdWx0IHBhcnNpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAiXCIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IFNUUklORzsKCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiJyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEFUT007CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXQoInwiKSkgeyAgICAgICAgICAgICAgICAgICAgLy8gTXVsdGktbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gImNvbW1lbnQiOyAvLyB0b2dnbGUgdG8gY29tbWVudCBtb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQ09NTUVOVDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KC9bdGZdL2kpKSB7ICAgICAgICAgICAgLy8gI3QvI2YgKGF0b20pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQVRPTTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCc7JykpIHsgICAgICAgICAgICAgICAgLy8gUy1FeHByIGNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSAicy1leHByLWNvbW1lbnQiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtVGVzdCA9IG51bGwsIGhhc0V4YWN0bmVzcyA9IGZhbHNlLCBoYXNSYWRpeCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLmVhdCgvW2VpXS9pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0V4YWN0bmVzcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7ICAgICAgIC8vIG11c3QgYmUgcmFkaXggc3BlY2lmaWVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eI2IvaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UZXN0ID0gaXNCaW5hcnlOdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXiNvL2kpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGVzdCA9IGlzT2N0YWxOdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXiN4L2kpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGVzdCA9IGlzSGV4TnVtYmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14jZC9pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRlc3QgPSBpc0RlY2ltYWxOdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlstKzAtOS5dLywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUmFkaXggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UZXN0ID0gaXNEZWNpbWFsTnVtYmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtY29uc3VtZSB0aGUgaW50aWFsICMgaWYgYWxsIG1hdGNoZXMgZmFpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNFeGFjdG5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KCcjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtVGVzdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JhZGl4ICYmICFoYXNFeGFjdG5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VtZSBvcHRpb25hbCBleGFjdG5lc3MgYWZ0ZXIgcmFkaXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1hdGNoKC9eI1tlaV0vaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1UZXN0KHN0cmVhbSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBOVU1CRVI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9eWy0rMC05Ll0vLnRlc3QoY2gpICYmIGlzRGVjaW1hbE51bWJlcihzdHJlYW0sIHRydWUpKSB7IC8vIG1hdGNoIG5vbi1wcmVmaXhlZCBudW1iZXIsIG11c3QgYmUgZGVjaW1hbAogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gTlVNQkVSOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIjsiKSB7IC8vIGNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOyAvLyByZXN0IG9mIHRoZSBsaW5lIGlzIGEgY29tbWVudAogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQ09NTUVOVDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIoIiB8fCBjaCA9PSAiWyIpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlXb3JkID0gJyc7IHZhciBpbmRlbnRUZW1wID0gc3RyZWFtLmNvbHVtbigpLCBsZXR0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAgICBFaXRoZXIKICAgICAgICAgICAgICAgICAgICAgICAgKGluZGVudC13b3JkIC4uCiAgICAgICAgICAgICAgICAgICAgICAgIChub24taW5kZW50LXdvcmQgLi4KICAgICAgICAgICAgICAgICAgICAgICAgKDtzb21ldGhpbmcgZWxzZSwgYnJhY2tldCwgZXRjLgogICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChsZXR0ZXIgPSBzdHJlYW0uZWF0KC9bXlxzXChcW1w7XClcXV0vKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5V29yZCArPSBsZXR0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlXb3JkLmxlbmd0aCA+IDAgJiYgaW5kZW50S2V5cy5wcm9wZXJ0eUlzRW51bWVyYWJsZShrZXlXb3JkKSkgeyAvLyBpbmRlbnQtd29yZAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50VGVtcCArIElOREVOVF9XT1JEX1NLSVAsIGNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbm9uLWluZGVudCB3b3JkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb250aW51ZSBlYXRpbmcgdGhlIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLmVvbCgpIHx8IHN0cmVhbS5wZWVrKCkgPT0gIjsiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBzaWduaWZpY2FudCBhZnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlc3RhcnQgaW5kZW50YXRpb24gMSBzcGFjZSBhZnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50VGVtcCArIDEsIGNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaFN0YWNrKHN0YXRlLCBpbmRlbnRUZW1wICsgc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGgsIGNoKTsgLy8gZWxzZSB3ZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5iYWNrVXAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGggLSAxKTsgLy8gdW5kbyBhbGwgdGhlIGVhdGluZwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHN0YXRlLnNFeHByQ29tbWVudCA9PSAibnVtYmVyIikgc3RhdGUuc0V4cHJDb21tZW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQlJBQ0tFVDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIpIiB8fCBjaCA9PSAiXSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEJSQUNLRVQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5pbmRlbnRTdGFjayAhPSBudWxsICYmIHN0YXRlLmluZGVudFN0YWNrLnR5cGUgPT0gKGNoID09ICIpIiA/ICIoIiA6ICJbIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcFN0YWNrKHN0YXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2Ygc3RhdGUuc0V4cHJDb21tZW50ID09ICJudW1iZXIiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigtLXN0YXRlLnNFeHByQ29tbWVudCA9PSAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7IC8vIGZpbmFsIGNsb3NpbmcgYnJhY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zRXhwckNvbW1lbnQgPSBmYWxzZTsgLy8gdHVybiBvZmYgcy1leHByIGNvbW1lbnRpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXC0hJCUmKitcLlwvOjw9Pj9AXF5+XS8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQlVJTFRJTjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHJldHVyblR5cGUgPSAidmFyaWFibGUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBzdGF0ZS5zRXhwckNvbW1lbnQgPT0gIm51bWJlciIpID8gQ09NTUVOVCA6IHJldHVyblR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgaW5kZW50OiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrID09IG51bGwpIHJldHVybiBzdGF0ZS5pbmRlbnRhdGlvbjsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmluZGVudFN0YWNrLmluZGVudDsKICAgICAgICB9CiAgICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXNjaGVtZSIsICJzY2hlbWUiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/shell/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/shell/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxtZXRhIGNoYXJzZXQ9dXRmLTg+Cjx0aXRsZT5Db2RlTWlycm9yOiBTaGVsbCBtb2RlPC90aXRsZT4KCjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Li4vLi4vbGliL2NvZGVtaXJyb3IuY3NzPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPS4uLy4uL2RvYy9kb2NzLmNzcz4KCjxzdHlsZSB0eXBlPXRleHQvY3NzPgogIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9Cjwvc3R5bGU+Cgo8c2NyaXB0IHNyYz0uLi8uLi9saWIvY29kZW1pcnJvci5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi91dGlsL21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz1zaGVsbC5qcz48L3NjcmlwdD4KCjxoMT5Db2RlTWlycm9yOiBTaGVsbCBtb2RlPC9oMT4KCjx0ZXh0YXJlYSBpZD1jb2RlPgojIS9iaW4vYmFzaAoKIyBjbG9uZSB0aGUgcmVwb3NpdG9yeQpnaXQgY2xvbmUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyZGVuL3RyZWUKCiMgZ2VuZXJhdGUgSFRUUFMgY3JlZGVudGlhbHMKY2QgdHJlZQpvcGVuc3NsIGdlbnJzYSAtYWVzMjU2IC1vdXQgaHR0cHMua2V5IDEwMjQKb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLWtleSBodHRwcy5rZXkgLW91dCBodHRwcy5jc3IKb3BlbnNzbCB4NTA5IC1yZXEgLWRheXMgMzY1IC1pbiBodHRwcy5jc3IgLXNpZ25rZXkgaHR0cHMua2V5IC1vdXQgaHR0cHMuY3J0CmNwIGh0dHBzLmtleXssLm9yaWd9Cm9wZW5zc2wgcnNhIC1pbiBodHRwcy5rZXkub3JpZyAtb3V0IGh0dHBzLmtleQoKIyBzdGFydCB0aGUgc2VydmVyIGluIEhUVFBTIG1vZGUKY2Qgd2ViCnN1ZG8gbm9kZSAuLi9zZXJ2ZXIuanMgNDQzICd5ZXMnICZndDsmZ3Q7IC4uL25vZGUubG9nICZhbXA7CgojIGhlcmUgaXMgaG93IHRvIHN0b3AgdGhlIHNlcnZlcgpmb3IgcGlkIGluIGBwcyBhdXggfCBncmVwICdub2RlIC4uL3NlcnZlci5qcycgfCBhd2sgJ3twcmludCAkMn0nYCA7IGRvCiAgc3VkbyBraWxsIC05ICRwaWQgMiZndDsgL2Rldi9udWxsCmRvbmUKCmV4aXQgMDwvdGV4dGFyZWE+Cgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpLCB7CiAgICBtb2RlOiAnc2hlbGwnLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgfSk7Cjwvc2NyaXB0PgoKPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zaDwvY29kZT4uPC9wPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/shell/shell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCdzaGVsbCcsIGZ1bmN0aW9uKCkgewoKICB2YXIgd29yZHMgPSB7fTsKICBmdW5jdGlvbiBkZWZpbmUoc3R5bGUsIHN0cmluZykgewogICAgdmFyIHNwbGl0ID0gc3RyaW5nLnNwbGl0KCcgJyk7CiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKICAgICAgd29yZHNbc3BsaXRbaV1dID0gc3R5bGU7CiAgICB9CiAgfTsKCiAgLy8gQXRvbXMKICBkZWZpbmUoJ2F0b20nLCAndHJ1ZSBmYWxzZScpOwoKICAvLyBLZXl3b3JkcwogIGRlZmluZSgna2V5d29yZCcsICdpZiB0aGVuIGRvIGVsc2UgZWxpZiB3aGlsZSB1bnRpbCBmb3IgaW4gZXNhYyBmaSBmaW4gJyArCiAgICAnZmlsIGRvbmUgZXhpdCBzZXQgdW5zZXQgZXhwb3J0IGZ1bmN0aW9uJyk7CgogIC8vIENvbW1hbmRzCiAgZGVmaW5lKCdidWlsdGluJywgJ2FiIGF3ayBiYXNoIGJlZXAgY2F0IGNjIGNkIGNob3duIGNobW9kIGNocm9vdCBjbGVhciBjcCAnICsKICAgICdjdXJsIGN1dCBkaWZmIGVjaG8gZmluZCBnYXdrIGdjYyBnZXQgZ2l0IGdyZXAga2lsbCBraWxsYWxsIGxuIGxzIG1ha2UgJyArCiAgICAnbWtkaXIgb3BlbnNzbCBtdiBuYyBub2RlIG5wbSBwaW5nIHBzIHJlc3RhcnQgcm0gcm1kaXIgc2VkIHNlcnZpY2Ugc2ggJyArCiAgICAnc2hvcHQgc2hyZWQgc291cmNlIHNvcnQgc2xlZXAgc3NoIHN0YXJ0IHN0b3Agc3Ugc3VkbyB0ZWUgdGVsbmV0IHRvcCAnICsKICAgICd0b3VjaCB2aSB2aW0gd2FsbCB3YyB3Z2V0IHdobyB3cml0ZSB5ZXMgenNoJyk7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CgogICAgdmFyIHNvbCA9IHN0cmVhbS5zb2woKTsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgaWYgKGNoID09PSAnXCcnIHx8IGNoID09PSAnIicgfHwgY2ggPT09ICdgJykgewogICAgICBzdGF0ZS50b2tlbnMudW5zaGlmdCh0b2tlblN0cmluZyhjaCkpOwogICAgICByZXR1cm4gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoY2ggPT09ICcjJykgewogICAgICBpZiAoc29sICYmIHN0cmVhbS5lYXQoJyEnKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gJ21ldGEnOyAvLyAnY29tbWVudCc/CiAgICAgIH0KICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgfQogICAgaWYgKGNoID09PSAnJCcpIHsKICAgICAgc3RhdGUudG9rZW5zLnVuc2hpZnQodG9rZW5Eb2xsYXIpOwogICAgICByZXR1cm4gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoY2ggPT09ICcrJyB8fCBjaCA9PT0gJz0nKSB7CiAgICAgIHJldHVybiAnb3BlcmF0b3InOwogICAgfQogICAgaWYgKGNoID09PSAnLScpIHsKICAgICAgc3RyZWFtLmVhdCgnLScpOwogICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgIHJldHVybiAnYXR0cmlidXRlJzsKICAgIH0KICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXGQvKTsKICAgICAgaWYoIS9cdy8udGVzdChzdHJlYW0ucGVlaygpKSkgewogICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgfQogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJz0nICYmIC9cdysvLnRlc3QoY3VyKSkgcmV0dXJuICdkZWYnOwogICAgcmV0dXJuIHdvcmRzLmhhc093blByb3BlcnR5KGN1cikgPyB3b3Jkc1tjdXJdIDogbnVsbDsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgbmV4dCwgZW5kID0gZmFsc2UsIGVzY2FwZWQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAobmV4dCA9PT0gJyQnICYmICFlc2NhcGVkICYmIHF1b3RlICE9PSAnXCcnKSB7CiAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTsKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgICBzdGF0ZS50b2tlbnMudW5zaGlmdCh0b2tlbkRvbGxhcik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT09ICdcXCc7CiAgICAgIH0KICAgICAgaWYgKGVuZCB8fCAhZXNjYXBlZCkgewogICAgICAgIHN0YXRlLnRva2Vucy5zaGlmdCgpOwogICAgICB9CiAgICAgIHJldHVybiAocXVvdGUgPT09ICdgJyB8fCBxdW90ZSA9PT0gJyknID8gJ3F1b3RlJyA6ICdzdHJpbmcnKTsKICAgIH07CiAgfTsKCiAgdmFyIHRva2VuRG9sbGFyID0gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0YXRlLnRva2Vucy5sZW5ndGggPiAxKSBzdHJlYW0uZWF0KCckJyk7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpLCBodW5ncnkgPSAvXHcvOwogICAgaWYgKGNoID09PSAneycpIGh1bmdyeSA9IC9bXn1dLzsKICAgIGlmIChjaCA9PT0gJygnKSB7CiAgICAgIHN0YXRlLnRva2Vuc1swXSA9IHRva2VuU3RyaW5nKCcpJyk7CiAgICAgIHJldHVybiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICghL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaHVuZ3J5KTsKICAgICAgc3RyZWFtLmVhdCgnfScpOwogICAgfQogICAgc3RhdGUudG9rZW5zLnNoaWZ0KCk7CiAgICByZXR1cm4gJ2RlZic7CiAgfTsKCiAgZnVuY3Rpb24gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSkgewogICAgcmV0dXJuIChzdGF0ZS50b2tlbnNbMF0gfHwgdG9rZW5CYXNlKSAoc3RyZWFtLCBzdGF0ZSk7CiAgfTsKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkge3JldHVybiB7dG9rZW5zOltdfTt9LAogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH07Cn0pOwogIApDb2RlTWlycm9yLmRlZmluZU1JTUUoJ3RleHQveC1zaCcsICdzaGVsbCcpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/sieve/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/sieve/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFNpZXZlIChSRkM1MjI4KSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ic2lldmUuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBTaWV2ZSAoUkZDNTIyOCkgbW9kZTwvaDE+CiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojCiMgRXhhbXBsZSBTaWV2ZSBGaWx0ZXIKIyBEZWNsYXJlIGFueSBvcHRpb25hbCBmZWF0dXJlcyBvciBleHRlbnNpb24gdXNlZCBieSB0aGUgc2NyaXB0CiMKCnJlcXVpcmUgWyJmaWxlaW50byIsICJyZWplY3QiXTsKCiMKIyBSZWplY3QgYW55IGxhcmdlIG1lc3NhZ2VzIChub3RlIHRoYXQgdGhlIGZvdXIgbGVhZGluZyBkb3RzIGdldAojICJzdHVmZmVkIiB0byB0aHJlZSkKIwppZiBzaXplIDpvdmVyIDFNCnsKICByZWplY3QgdGV4dDoKUGxlYXNlIGRvIG5vdCBzZW5kIG1lIGxhcmdlIGF0dGFjaG1lbnRzLgpQdXQgeW91ciBmaWxlIG9uIGEgc2VydmVyIGFuZCBzZW5kIG1lIHRoZSBVUkwuClRoYW5rIHlvdS4KLi4uLiBGcmVkCi4KOwogIHN0b3A7Cn0KCiMKIyBIYW5kbGUgbWVzc2FnZXMgZnJvbSBrbm93biBtYWlsaW5nIGxpc3RzCiMgTW92ZSBtZXNzYWdlcyBmcm9tIElFVEYgZmlsdGVyIGRpc2N1c3Npb24gbGlzdCB0byBmaWx0ZXIgZm9sZGVyCiMKaWYgaGVhZGVyIDppcyAiU2VuZGVyIiAib3duZXItaWV0Zi1tdGEtZmlsdGVyc0BpbWMub3JnIgp7CiAgZmlsZWludG8gImZpbHRlciI7ICAjIG1vdmUgdG8gImZpbHRlciIgZm9sZGVyCn0KIwojIEtlZXAgYWxsIG1lc3NhZ2VzIHRvIG9yIGZyb20gcGVvcGxlIGluIG15IGNvbXBhbnkKIwplbHNpZiBhZGRyZXNzIDpkb21haW4gOmlzIFsiRnJvbSIsICJUbyJdICJleGFtcGxlLmNvbSIKewogIGtlZXA7ICAgICAgICAgICAgICAgIyBrZWVwIGluICJJbiIgZm9sZGVyCn0KCiMKIyBUcnkgYW5kIGNhdGNoIHVuc29saWNpdGVkIGVtYWlsLiAgSWYgYSBtZXNzYWdlIGlzIG5vdCB0byBtZSwKIyBvciBpdCBjb250YWlucyBhIHN1YmplY3Qga25vd24gdG8gYmUgc3BhbSwgZmlsZSBpdCBhd2F5LgojCmVsc2lmIGFueW9mIChub3QgYWRkcmVzcyA6YWxsIDpjb250YWlucwogICAgICAgICAgICAgICBbIlRvIiwgIkNjIiwgIkJjYyJdICJtZUBleGFtcGxlLmNvbSIsCiAgICAgICAgICAgICBoZWFkZXIgOm1hdGNoZXMgInN1YmplY3QiCiAgICAgICAgICAgICAgIFsiKm1ha2UqbW9uZXkqZmFzdCoiLCAiKnVuaXZlcnNpdHkqZGlwbCptYXMqIl0pCnsKICAjIElmIG1lc3NhZ2UgaGVhZGVyIGRvZXMgbm90IGNvbnRhaW4gbXkgYWRkcmVzcywKICAjIGl0J3MgZnJvbSBhIGxpc3QuCiAgZmlsZWludG8gInNwYW0iOyAgICMgbW92ZSB0byAic3BhbSIgZm9sZGVyCn0KZWxzZQp7CiAgIyBNb3ZlIGFsbCBvdGhlciAobm9uLWNvbXBhbnkpIG1haWwgdG8gInBlcnNvbmFsIgogICMgZm9sZGVyLgogIGZpbGVpbnRvICJwZXJzb25hbCI7Cn0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPmFwcGxpY2F0aW9uL3NpZXZlPC9jb2RlPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/sieve/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChDKSAyMDEyIFRob21hcyBTY2htaWQgPHNjaG1pZC10aG9tYXNAZ214Lm5ldD4KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgpQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgc3ViZGlyZWN0b3JpZXMgb2YgdGhlIENvZGVNaXJyb3IgZGlzdHJpYnV0aW9uCmluY2x1ZGUgdGhlaXIgb3duIExJQ0VOU0UgZmlsZXMsIGFuZCBhcmUgcmVsZWFzZWQgdW5kZXIgZGlmZmVyZW50CmxpY2VuY2VzLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/sieve/sieve.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogU2VlIExJQ0VOU0UgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIHRoZSBsaWNlbnNlIHVuZGVyIHdoaWNoIHRoaXMgY29kZQogKiBpcyByZWxlYXNlZC4KICovCgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInNpZXZlIiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICB2YXIga2V5d29yZHMgPSB3b3JkcygiaWYgZWxzaWYgZWxzZSBzdG9wIHJlcXVpcmUiKTsKICB2YXIgYXRvbXMgPSB3b3JkcygidHJ1ZSBmYWxzZSBub3QiKTsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewoKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gIi8iICYmIHN0cmVhbS5lYXQoIioiKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7CiAgICAgIHJldHVybiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIGlmIChjaCA9PT0gJyMnKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KCiAgICBpZiAoY2ggPT0gIlwiIikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nKGNoKTsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIGlmIChjaCA9PT0gInsiKQogICAgewogICAgICBzdGF0ZS5faW5kZW50Kys7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChjaCA9PT0gIn0iKQogICAgewogICAgICBzdGF0ZS5faW5kZW50LS07CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmICgvW3t9XChcKSw7XS8udGVzdChjaCkpCiAgICAgIHJldHVybiBudWxsOwoKICAgIC8vIDEqRElHSVQgIksiIC8gIk0iIC8gIkciCiAgICBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcZF0vKTsKICAgICAgc3RyZWFtLmVhdCgvW0trTW1HZ10vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQoKICAgIC8vICI6IiAoQUxQSEEgLyAiXyIpICooQUxQSEEgLyBESUdJVCAvICJfIikKICAgIGlmIChjaCA9PSAiOiIpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bYS16QS1aX10vKTsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bYS16QS1aMC05X10vKTsKCiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQoKICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgLy8gInRleHQ6IiAqKFNQIC8gSFRBQikgKGhhc2gtY29tbWVudCAvIENSTEYpCiAgICAvLyAqKG11bHRpbGluZS1saXRlcmFsIC8gbXVsdGlsaW5lLWRvdHN0YXJ0KQogICAgLy8gIi4iIENSTEYKICAgIGlmICgoY3VyID09ICJ0ZXh0IikgJiYgc3RyZWFtLmVhdCgiOiIpKQogICAgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuTXVsdGlMaW5lU3RyaW5nOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CgogICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpCiAgICAgIHJldHVybiAia2V5d29yZCI7CgogICAgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpCiAgICAgIHJldHVybiAiYXRvbSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlbk11bHRpTGluZVN0cmluZyhzdHJlYW0sIHN0YXRlKQogIHsKICAgIHN0YXRlLl9tdWx0aUxpbmVTdHJpbmcgPSB0cnVlOwogICAgLy8gdGhlIGZpcnN0IGxpbmUgaXMgc3BlY2lhbCBpdCBtYXkgY29udGFpbiBhIGNvbW1lbnQKICAgIGlmICghc3RyZWFtLnNvbCgpKSB7CiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwoKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KCiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQoKICAgIGlmICgoc3RyZWFtLm5leHQoKSA9PSAiLiIpICAmJiAoc3RyZWFtLmVvbCgpKSkKICAgIHsKICAgICAgc3RhdGUuX211bHRpTGluZVN0cmluZyA9IGZhbHNlOwogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgIH0KCiAgICByZXR1cm4gInN0cmluZyI7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSAiLyIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpCiAgICAgICAgICBicmVhazsKICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoIWVzY2FwZWQpIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2UpIHsKICAgICAgcmV0dXJuIHt0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgICAgICAgIGJhc2VJbmRlbnQ6IGJhc2UgfHwgMCwKICAgICAgICAgICAgICBfaW5kZW50OiAwfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKQogICAgICAgIHJldHVybiBudWxsOwoKICAgICAgcmV0dXJuIChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpOzsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgX3RleHRBZnRlcikgewogICAgICByZXR1cm4gc3RhdGUuYmFzZUluZGVudCArIHN0YXRlLl9pbmRlbnQgKiBpbmRlbnRVbml0OwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAifSIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vc2lldmUiLCAic2lldmUiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/smalltalk/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/smalltalk/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFNtYWxsdGFsayBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ic21hbGx0YWxrLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMnB4IHNvbGlkICNkZWU7IGJvcmRlci1yaWdodC13aWR0aDogMTBweDt9CiAgICAgIC5Db2RlTWlycm9yLWd1dHRlciB7Ym9yZGVyOiBub25lOyBiYWNrZ3JvdW5kOiAjZGVlO30KICAgICAgLkNvZGVNaXJyb3ItZ3V0dGVyIHByZSB7Y29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogYm9sZDt9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBTbWFsbHRhbGsgbW9kZTwvaDE+Cgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgoiIAogICAgVGhpcyBpcyBhIHRlc3Qgb2YgdGhlIFNtYWxsdGFsayBjb2RlCiIKU2Vhc2lkZS5XQUNvbXBvbmVudCBzdWJjbGFzczogI015Q291bnRlciBbCiAgICB8IGNvdW50IHwKICAgIE15Q291bnRlciBjbGFzcyAmZ3Q7Jmd0OyBjYW5CZVJvb3QgWyBedHJ1ZSBdCgogICAgaW5pdGlhbGl6ZSBbCiAgICAgICAgc3VwZXIgaW5pdGlhbGl6ZS4KICAgICAgICBjb3VudCA6PSAwLgogICAgXQogICAgc3RhdGVzIFsgXnsgc2VsZiB9IF0KICAgIHJlbmRlckNvbnRlbnRPbjogaHRtbCBbCiAgICAgICAgaHRtbCBoZWFkaW5nOiBjb3VudC4KICAgICAgICBodG1sIGFuY2hvciBjYWxsYmFjazogWyBjb3VudCA6PSBjb3VudCArIDEgXTsgd2l0aDogJysrJy4KICAgICAgICBodG1sIHNwYWNlLgogICAgICAgIGh0bWwgYW5jaG9yIGNhbGxiYWNrOiBbIGNvdW50IDo9IGNvdW50IC0gMSBdOyB3aXRoOiAnLS0nLgogICAgXQpdCgpNeUNvdW50ZXIgcmVnaXN0ZXJBc0FwcGxpY2F0aW9uOiAnbXljb3VudGVyJwo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1zdHNyYyIsCiAgICAgICAgaW5kZW50VW5pdDogNAogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPlNpbXBsZSBTbWFsbHRhbGsgbW9kZS48L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zdHNyYzwvY29kZT4uPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/smalltalk/smalltalk.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCdzbWFsbHRhbGsnLCBmdW5jdGlvbihjb25maWcpIHsKCgl2YXIgc3BlY2lhbENoYXJzID0gL1srXC0vXFwqfjw+PUAlfCY/IS46O15dLzsKCXZhciBrZXl3b3JkcyA9IC90cnVlfGZhbHNlfG5pbHxzZWxmfHN1cGVyfHRoaXNDb250ZXh0LzsKCgl2YXIgQ29udGV4dCA9IGZ1bmN0aW9uKHRva2VuaXplciwgcGFyZW50KSB7CgkJdGhpcy5uZXh0ID0gdG9rZW5pemVyOwoJCXRoaXMucGFyZW50ID0gcGFyZW50OwoJfTsKCgl2YXIgVG9rZW4gPSBmdW5jdGlvbihuYW1lLCBjb250ZXh0LCBlb3MpIHsKCQl0aGlzLm5hbWUgPSBuYW1lOwoJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CgkJdGhpcy5lb3MgPSBlb3M7Cgl9OwoKCXZhciBTdGF0ZSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KG5leHQsIG51bGwpOwoJCXRoaXMuZXhwZWN0VmFyaWFibGUgPSB0cnVlOwoJCXRoaXMuaW5kZW50YXRpb24gPSAwOwoJCXRoaXMudXNlckluZGVudGF0aW9uRGVsdGEgPSAwOwoJfTsKCglTdGF0ZS5wcm90b3R5cGUudXNlckluZGVudCA9IGZ1bmN0aW9uKGluZGVudGF0aW9uKSB7CgkJdGhpcy51c2VySW5kZW50YXRpb25EZWx0YSA9IGluZGVudGF0aW9uID4gMCA/IChpbmRlbnRhdGlvbiAvIGNvbmZpZy5pbmRlbnRVbml0IC0gdGhpcy5pbmRlbnRhdGlvbikgOiAwOwoJfTsKCgl2YXIgbmV4dCA9IGZ1bmN0aW9uKHN0cmVhbSwgY29udGV4dCwgc3RhdGUpIHsKCQl2YXIgdG9rZW4gPSBuZXcgVG9rZW4obnVsbCwgY29udGV4dCwgZmFsc2UpOwoJCXZhciBhQ2hhciA9IHN0cmVhbS5uZXh0KCk7CgoJCWlmIChhQ2hhciA9PT0gJyInKSB7CgkJCXRva2VuID0gbmV4dENvbW1lbnQoc3RyZWFtLCBuZXcgQ29udGV4dChuZXh0Q29tbWVudCwgY29udGV4dCkpOwoKCQl9IGVsc2UgaWYgKGFDaGFyID09PSAnXCcnKSB7CgkJCXRva2VuID0gbmV4dFN0cmluZyhzdHJlYW0sIG5ldyBDb250ZXh0KG5leHRTdHJpbmcsIGNvbnRleHQpKTsKCgkJfSBlbHNlIGlmIChhQ2hhciA9PT0gJyMnKSB7CgkJCXN0cmVhbS5lYXRXaGlsZSgvW14gLl0vKTsKCQkJdG9rZW4ubmFtZSA9ICdzdHJpbmctMic7CgoJCX0gZWxzZSBpZiAoYUNoYXIgPT09ICckJykgewoJCQlzdHJlYW0uZWF0V2hpbGUoL1teIF0vKTsKCQkJdG9rZW4ubmFtZSA9ICdzdHJpbmctMic7CgoJCX0gZWxzZSBpZiAoYUNoYXIgPT09ICd8JyAmJiBzdGF0ZS5leHBlY3RWYXJpYWJsZSkgewoJCQl0b2tlbi5jb250ZXh0ID0gbmV3IENvbnRleHQobmV4dFRlbXBvcmFyaWVzLCBjb250ZXh0KTsKCgkJfSBlbHNlIGlmICgvW1xbXF17fSgpXS8udGVzdChhQ2hhcikpIHsKCQkJdG9rZW4ubmFtZSA9ICdicmFja2V0JzsKCQkJdG9rZW4uZW9zID0gL1tcW3soXS8udGVzdChhQ2hhcik7CgoJCQlpZiAoYUNoYXIgPT09ICdbJykgewoJCQkJc3RhdGUuaW5kZW50YXRpb24rKzsKCQkJfSBlbHNlIGlmIChhQ2hhciA9PT0gJ10nKSB7CgkJCQlzdGF0ZS5pbmRlbnRhdGlvbiA9IE1hdGgubWF4KDAsIHN0YXRlLmluZGVudGF0aW9uIC0gMSk7CgkJCX0KCgkJfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnMudGVzdChhQ2hhcikpIHsKCQkJc3RyZWFtLmVhdFdoaWxlKHNwZWNpYWxDaGFycyk7CgkJCXRva2VuLm5hbWUgPSAnb3BlcmF0b3InOwoJCQl0b2tlbi5lb3MgPSBhQ2hhciAhPT0gJzsnOyAvLyA7IGNhc2NhZGVkIG1lc3NhZ2UgZXhwcmVzc2lvbgoKCQl9IGVsc2UgaWYgKC9cZC8udGVzdChhQ2hhcikpIHsKCQkJc3RyZWFtLmVhdFdoaWxlKC9bXHdcZF0vKTsKCQkJdG9rZW4ubmFtZSA9ICdudW1iZXInOwoKCQl9IGVsc2UgaWYgKC9bXHdfXS8udGVzdChhQ2hhcikpIHsKCQkJc3RyZWFtLmVhdFdoaWxlKC9bXHdcZF9dLyk7CgkJCXRva2VuLm5hbWUgPSBzdGF0ZS5leHBlY3RWYXJpYWJsZSA/IChrZXl3b3Jkcy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpID8gJ2tleXdvcmQnIDogJ3ZhcmlhYmxlJykgOiBudWxsOwoKCQl9IGVsc2UgewoJCQl0b2tlbi5lb3MgPSBzdGF0ZS5leHBlY3RWYXJpYWJsZTsKCQl9CgoJCXJldHVybiB0b2tlbjsKCX07CgoJdmFyIG5leHRDb21tZW50ID0gZnVuY3Rpb24oc3RyZWFtLCBjb250ZXh0KSB7CgkJc3RyZWFtLmVhdFdoaWxlKC9bXiJdLyk7CgkJcmV0dXJuIG5ldyBUb2tlbignY29tbWVudCcsIHN0cmVhbS5lYXQoJyInKSA/IGNvbnRleHQucGFyZW50IDogY29udGV4dCwgdHJ1ZSk7Cgl9OwoKCXZhciBuZXh0U3RyaW5nID0gZnVuY3Rpb24oc3RyZWFtLCBjb250ZXh0KSB7CgkJc3RyZWFtLmVhdFdoaWxlKC9bXiddLyk7CgkJcmV0dXJuIG5ldyBUb2tlbignc3RyaW5nJywgc3RyZWFtLmVhdCgnXCcnKSA/IGNvbnRleHQucGFyZW50IDogY29udGV4dCwgZmFsc2UpOwoJfTsKCgl2YXIgbmV4dFRlbXBvcmFyaWVzID0gZnVuY3Rpb24oc3RyZWFtLCBjb250ZXh0KSB7CgkJdmFyIHRva2VuID0gbmV3IFRva2VuKG51bGwsIGNvbnRleHQsIGZhbHNlKTsKCQl2YXIgYUNoYXIgPSBzdHJlYW0ubmV4dCgpOwoKCQlpZiAoYUNoYXIgPT09ICd8JykgewoJCQl0b2tlbi5jb250ZXh0ID0gY29udGV4dC5wYXJlbnQ7CgkJCXRva2VuLmVvcyA9IHRydWU7CgoJCX0gZWxzZSB7CgkJCXN0cmVhbS5lYXRXaGlsZSgvW158XS8pOwoJCQl0b2tlbi5uYW1lID0gJ3ZhcmlhYmxlJzsKCQl9CgoJCXJldHVybiB0b2tlbjsKCX07CgoJcmV0dXJuIHsKCQlzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIG5ldyBTdGF0ZTsKCQl9LAoKCQl0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewoJCQlzdGF0ZS51c2VySW5kZW50KHN0cmVhbS5pbmRlbnRhdGlvbigpKTsKCgkJCWlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewoJCQkJcmV0dXJuIG51bGw7CgkJCX0KCgkJCXZhciB0b2tlbiA9IHN0YXRlLmNvbnRleHQubmV4dChzdHJlYW0sIHN0YXRlLmNvbnRleHQsIHN0YXRlKTsKCQkJc3RhdGUuY29udGV4dCA9IHRva2VuLmNvbnRleHQ7CgkJCXN0YXRlLmV4cGVjdFZhcmlhYmxlID0gdG9rZW4uZW9zOwoKCQkJc3RhdGUubGFzdFRva2VuID0gdG9rZW47CgkJCXJldHVybiB0b2tlbi5uYW1lOwoJCX0sCgoJCWJsYW5rTGluZTogZnVuY3Rpb24oc3RhdGUpIHsKCQkJc3RhdGUudXNlckluZGVudCgwKTsKCQl9LAoKCQlpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKCQkJdmFyIGkgPSBzdGF0ZS5jb250ZXh0Lm5leHQgPT09IG5leHQgJiYgdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCkgPT09ICddJyA/IC0xIDogc3RhdGUudXNlckluZGVudGF0aW9uRGVsdGE7CgkJCXJldHVybiAoc3RhdGUuaW5kZW50YXRpb24gKyBpKSAqIGNvbmZpZy5pbmRlbnRVbml0OwoJCX0sCgoJCWVsZWN0cmljQ2hhcnM6ICddJwoJfTsKCn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtc3RzcmMnLCB7bmFtZTogJ3NtYWxsdGFsayd9KTs=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/smarty/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/smarty/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFNtYXJ0eSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ic21hcnR5LmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBTbWFydHkgbW9kZTwvaDE+CgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4Ke2V4dGVuZHMgZmlsZT0icGFyZW50LnRwbCJ9CntpbmNsdWRlIGZpbGU9InRlbXBsYXRlLnRwbCJ9Cgp7KiBzb21lIGV4YW1wbGUgU21hcnR5IGNvbnRlbnQgKn0Ke2lmIGlzc2V0KCRuYW1lKSAmJiAkbmFtZSA9PSAnQmxvZyd9CiAgVGhpcyBpcyBhIHskdmFyfS4KICB7JGludGVnZXIgPSA0NTF9LCB7JGFycmF5W10gPSAiYSJ9LCB7JHN0cmluZ3ZhciA9ICJzdHJpbmcifQogIHthc3NpZ24gdmFyPSdib2InIHZhbHVlPSR2YXIucHJvcH0Ke2Vsc2VpZiAkbmFtZSA9PSAkZm9vfQogIHtmdW5jdGlvbiBuYW1lPW1lbnUgbGV2ZWw9MH0KICAgIHtmb3JlYWNoICRkYXRhIGFzICRlbnRyeX0KICAgICAge2lmIGlzX2FycmF5KCRlbnRyeSl9CiAgICAgICAgLSB7JGVudHJ5QGtleX0KICAgICAgICB7bWVudSBkYXRhPSRlbnRyeSBsZXZlbD0kbGV2ZWwrMX0KICAgICAge2Vsc2V9CiAgICAgICAgeyRlbnRyeX0KICAgICAgey9pZn0KICAgIHsvZm9yZWFjaH0KICB7L2Z1bmN0aW9ufQp7L2lmfTwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbW9kZTogInNtYXJ0eSIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8YnIgLz4KCiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUyIiBuYW1lPSJjb2RlMiI+CnstLWV4dGVuZHMgZmlsZT0icGFyZW50LnRwbCItLX0Key0taW5jbHVkZSBmaWxlPSJ0ZW1wbGF0ZS50cGwiLS19Cgp7LS0qIHNvbWUgZXhhbXBsZSBTbWFydHkgY29udGVudCAqLS19CnstLWlmIGlzc2V0KCRuYW1lKSAmJiAkbmFtZSA9PSAnQmxvZyctLX0KICBUaGlzIGlzIGEgey0tJHZhci0tfS4KICB7LS0kaW50ZWdlciA9IDQ1MS0tfSwgey0tJGFycmF5W10gPSAiYSItLX0sIHstLSRzdHJpbmd2YXIgPSAic3RyaW5nIi0tfQogIHstLWFzc2lnbiB2YXI9J2JvYicgdmFsdWU9JHZhci5wcm9wLS19CnstLWVsc2VpZiAkbmFtZSA9PSAkZm9vLS19CiAgey0tZnVuY3Rpb24gbmFtZT1tZW51IGxldmVsPTAtLX0KICAgIHstLWZvcmVhY2ggJGRhdGEgYXMgJGVudHJ5LS19CiAgICAgIHstLWlmIGlzX2FycmF5KCRlbnRyeSktLX0KICAgICAgICAtIHstLSRlbnRyeUBrZXktLX0KICAgICAgICB7LS1tZW51IGRhdGE9JGVudHJ5IGxldmVsPSRsZXZlbCsxLS19CiAgICAgIHstLWVsc2UtLX0KICAgICAgICB7LS0kZW50cnktLX0KICAgICAgey0tL2lmLS19CiAgICB7LS0vZm9yZWFjaC0tfQogIHstLS9mdW5jdGlvbi0tfQp7LS0vaWYtLX08L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUyIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiB7CiAgICAgICAgICBuYW1lOiAic21hcnR5IiwKICAgICAgICAgIGxlZnREZWxpbWl0ZXI6ICJ7LS0iLAogICAgICAgICAgcmlnaHREZWxpbWl0ZXI6ICItLX0iCiAgICAgICAgfQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPkEgcGxhaW4gdGV4dC9TbWFydHkgbW9kZSB3aGljaCBhbGxvd3MgZm9yIGN1c3RvbSBkZWxpbWl0ZXIgdGFncyAoZGVmYXVsdHMgdG8gPGI+ezwvYj4gYW5kIDxiPn08L2I+KS48L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zbWFydHk8L2NvZGU+PC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/smarty/smarty.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJzbWFydHkiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIga2V5RnVuY3MgPSBbImRlYnVnIiwgImV4dGVuZHMiLCAiZnVuY3Rpb24iLCAiaW5jbHVkZSIsICJsaXRlcmFsIl07CiAgdmFyIGxhc3Q7CiAgdmFyIHJlZ3MgPSB7CiAgICBvcGVyYXRvckNoYXJzOiAvWytcLSomJT08PiE/XS8sCiAgICB2YWxpZElkZW50aWZpZXI6IC9bYS16QS1aMC05XF9dLywKICAgIHN0cmluZ0NoYXI6IC9bXCdcIl0vCiAgfTsKICB2YXIgbGVmdERlbGltID0gKHR5cGVvZiBjb25maWcubW9kZS5sZWZ0RGVsaW1pdGVyICE9ICd1bmRlZmluZWQnKSA/IGNvbmZpZy5tb2RlLmxlZnREZWxpbWl0ZXIgOiAieyI7CiAgdmFyIHJpZ2h0RGVsaW0gPSAodHlwZW9mIGNvbmZpZy5tb2RlLnJpZ2h0RGVsaW1pdGVyICE9ICd1bmRlZmluZWQnKSA/IGNvbmZpZy5tb2RlLnJpZ2h0RGVsaW1pdGVyIDogIn0iOwogIGZ1bmN0aW9uIHJldChzdHlsZSwgbHN0KSB7IGxhc3QgPSBsc3Q7IHJldHVybiBzdHlsZTsgfQoKCiAgZnVuY3Rpb24gdG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpIHsKICAgIGZ1bmN0aW9uIGNoYWluKHBhcnNlcikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcjsKICAgICAgcmV0dXJuIHBhcnNlcihzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKGxlZnREZWxpbSwgdHJ1ZSkpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJjb21tZW50IiwgIioiICsgcmlnaHREZWxpbSkpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5TbWFydHk7CiAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgLy8gSSdkIGxpa2UgdG8gZG8gYW4gZWF0V2hpbGUoKSBoZXJlLCBidXQgSSBjYW4ndCBnZXQgaXQgdG8gZWF0IG9ubHkgdXAgdG8gdGhlIHJpZ2h0RGVsaW0gc3RyaW5nL2NoYXIKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpblNtYXJ0eShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKHJpZ2h0RGVsaW0sIHRydWUpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5pemVyOwogICAgICByZXR1cm4gcmV0KCJ0YWciLCBudWxsKTsKICAgIH0KCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICIkIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy52YWxpZElkZW50aWZpZXIpOwogICAgICByZXR1cm4gcmV0KCJ2YXJpYWJsZS0yIiwgInZhcmlhYmxlIik7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiLiIpIHsKICAgICAgcmV0dXJuIHJldCgib3BlcmF0b3IiLCAicHJvcGVydHkiKTsKICAgIH0KICAgIGVsc2UgaWYgKHJlZ3Muc3RyaW5nQ2hhci50ZXN0KGNoKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGluQXR0cmlidXRlKGNoKTsKICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgfQogICAgZWxzZSBpZiAocmVncy5vcGVyYXRvckNoYXJzLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShyZWdzLm9wZXJhdG9yQ2hhcnMpOwogICAgICByZXR1cm4gcmV0KCJvcGVyYXRvciIsICJvcGVyYXRvciIpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIlsiIHx8IGNoID09ICJdIikgewogICAgICByZXR1cm4gcmV0KCJicmFja2V0IiwgImJyYWNrZXQiKTsKICAgIH0KICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cZC8pOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKHN0YXRlLmxhc3QgPT0gInZhcmlhYmxlIikgewogICAgICAgIGlmIChjaCA9PSAiQCIpIHsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShyZWdzLnZhbGlkSWRlbnRpZmllcik7CiAgICAgICAgICByZXR1cm4gcmV0KCJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjaCA9PSAifCIpIHsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShyZWdzLnZhbGlkSWRlbnRpZmllcik7CiAgICAgICAgICByZXR1cm4gcmV0KCJxdWFsaWZpZXIiLCAibW9kaWZpZXIiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc3RhdGUubGFzdCA9PSAid2hpdGVzcGFjZSIpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy52YWxpZElkZW50aWZpZXIpOwogICAgICAgIHJldHVybiByZXQoImF0dHJpYnV0ZSIsICJtb2RpZmllciIpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHN0YXRlLmxhc3QgPT0gInByb3BlcnR5IikgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZShyZWdzLnZhbGlkSWRlbnRpZmllcik7CiAgICAgICAgcmV0dXJuIHJldCgicHJvcGVydHkiLCBudWxsKTsKICAgICAgfQogICAgICBlbHNlIGlmICgvXHMvLnRlc3QoY2gpKSB7CiAgICAgICAgbGFzdCA9ICJ3aGl0ZXNwYWNlIjsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgdmFyIHN0ciA9ICIiOwogICAgICBpZiAoY2ggIT0gIi8iKSB7CiAgICAJc3RyICs9IGNoOwogICAgICB9CiAgICAgIHZhciBjID0gIiI7CiAgICAgIHdoaWxlICgoYyA9IHN0cmVhbS5lYXQocmVncy52YWxpZElkZW50aWZpZXIpKSkgewogICAgICAgIHN0ciArPSBjOwogICAgICB9CiAgICAgIHZhciBpLCBqOwogICAgICBmb3IgKGk9MCwgaj1rZXlGdW5jcy5sZW5ndGg7IGk8ajsgaSsrKSB7CiAgICAgICAgaWYgKGtleUZ1bmNzW2ldID09IHN0cikgewogICAgICAgICAgcmV0dXJuIHJldCgia2V5d29yZCIsICJrZXl3b3JkIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICgvXHMvLnRlc3QoY2gpKSB7CiAgICAJcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5BdHRyaWJ1dGUocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5uZXh0KCkgPT0gcXVvdGUpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5TbWFydHk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGluQmxvY2soc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCh0ZXJtaW5hdG9yKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbml6ZXI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4geyB0b2tlbml6ZTogdG9rZW5pemVyLCBtb2RlOiAic21hcnR5IiwgbGFzdDogbnVsbCB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBzdGF0ZS5sYXN0ID0gbGFzdDsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKICAgIGVsZWN0cmljQ2hhcnM6ICIiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zbWFydHkiLCAic21hcnR5Iik7]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/sparql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/sparql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFNQQVJRTCBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL3V0aWwvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ic3BhcnFsLmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPkNvZGVNaXJyb3I6IFNQQVJRTCBtb2RlPC9oMT4KICAgIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+ClBSRUZJWCBhOiAmbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9hbm5vdGF0aW9uLW5zIz4KUFJFRklYIGRjOiAmbHQ7aHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8+ClBSRUZJWCBmb2FmOiAmbHQ7aHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8+CgojIENvbW1lbnQhCgpTRUxFQ1QgP2dpdmVuID9mYW1pbHkKV0hFUkUgewogID9hbm5vdCBhOmFubm90YXRlcyAmbHQ7aHR0cDovL3d3dy53My5vcmcvVFIvcmRmLXNwYXJxbC1xdWVyeS8+IC4KICA/YW5ub3QgZGM6Y3JlYXRvciA/YyAuCiAgT1BUSU9OQUwgez9jIGZvYWY6Z2l2ZW4gP2dpdmVuIDsKICAgICAgICAgICAgICAgZm9hZjpmYW1pbHkgP2ZhbWlseSB9IC4KICBGSUxURVIgaXNCbGFuayg/YykKfQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogImFwcGxpY2F0aW9uL3gtc3BhcnFsLXF1ZXJ5IiwKICAgICAgICB0YWJNb2RlOiAiaW5kZW50IiwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPmFwcGxpY2F0aW9uL3gtc3BhcnFsLXF1ZXJ5PC9jb2RlPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/sparql/sparql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJzcGFycWwiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwogIHZhciBjdXJQdW5jOwoKICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIgKyB3b3Jkcy5qb2luKCJ8IikgKyAiKSQiLCAiaSIpOwogIH0KICB2YXIgb3BzID0gd29yZFJlZ2V4cChbInN0ciIsICJsYW5nIiwgImxhbmdtYXRjaGVzIiwgImRhdGF0eXBlIiwgImJvdW5kIiwgInNhbWV0ZXJtIiwgImlzaXJpIiwgImlzdXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgImlzYmxhbmsiLCAiaXNsaXRlcmFsIiwgInVuaW9uIiwgImEiXSk7CiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChbImJhc2UiLCAicHJlZml4IiwgInNlbGVjdCIsICJkaXN0aW5jdCIsICJyZWR1Y2VkIiwgImNvbnN0cnVjdCIsICJkZXNjcmliZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzayIsICJmcm9tIiwgIm5hbWVkIiwgIndoZXJlIiwgIm9yZGVyIiwgImxpbWl0IiwgIm9mZnNldCIsICJmaWx0ZXIiLCAib3B0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFwaCIsICJieSIsICJhc2MiLCAiZGVzYyJdKTsKICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8XS87CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgY3VyUHVuYyA9IG51bGw7CiAgICBpZiAoY2ggPT0gIiQiIHx8IGNoID09ICI/IikgewogICAgICBzdHJlYW0ubWF0Y2goL15bXHdcZF0qLyk7CiAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgIXN0cmVhbS5tYXRjaCgvXltcc1x1MDBhMD1dLywgZmFsc2UpKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXlteXHNcdTAwYTA+XSo+Py8pOwogICAgICByZXR1cm4gImF0b20iOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkxpdGVyYWwoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmICgvW3t9XChcKSxcLjtcW1xdXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CiAgICBlbHNlIGlmIChvcGVyYXRvckNoYXJzLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShvcGVyYXRvckNoYXJzKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcZFwuX1wtXS8pOwogICAgICByZXR1cm4gImF0b20iOwogICAgfQogICAgZWxzZSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW19cd1xkXS8pOwogICAgICBpZiAoc3RyZWFtLmVhdCgiOiIpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcZF9cLV0vKTsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYgKG9wcy50ZXN0KHdvcmQpKQogICAgICAgIHJldHVybiBudWxsOwogICAgICBlbHNlIGlmIChrZXl3b3Jkcy50ZXN0KHdvcmQpKQogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuTGl0ZXJhbChxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIHR5cGUsIGNvbCkgewogICAgc3RhdGUuY29udGV4dCA9IHtwcmV2OiBzdGF0ZS5jb250ZXh0LCBpbmRlbnQ6IHN0YXRlLmluZGVudCwgY29sOiBjb2wsIHR5cGU6IHR5cGV9OwogIH0KICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7CiAgICBzdGF0ZS5pbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudDsKICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICBjb250ZXh0OiBudWxsLAogICAgICAgICAgICAgIGluZGVudDogMCwKICAgICAgICAgICAgICBjb2w6IDB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC5hbGlnbiA9PSBudWxsKSBzdGF0ZS5jb250ZXh0LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CgogICAgICBpZiAoc3R5bGUgIT0gImNvbW1lbnQiICYmIHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC5hbGlnbiA9PSBudWxsICYmIHN0YXRlLmNvbnRleHQudHlwZSAhPSAicGF0dGVybiIpIHsKICAgICAgICBzdGF0ZS5jb250ZXh0LmFsaWduID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgIikiLCBzdHJlYW0uY29sdW1uKCkpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJbIikgcHVzaENvbnRleHQoc3RhdGUsICJdIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2hDb250ZXh0KHN0YXRlLCAifSIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgIGVsc2UgaWYgKC9bXF1cfVwpXS8udGVzdChjdXJQdW5jKSkgewogICAgICAgIHdoaWxlIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIGN1clB1bmMgPT0gc3RhdGUuY29udGV4dC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIuIiAmJiBzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICBlbHNlIGlmICgvYXRvbXxzdHJpbmd8dmFyaWFibGUvLnRlc3Qoc3R5bGUpICYmIHN0YXRlLmNvbnRleHQpIHsKICAgICAgICBpZiAoL1tcfVxdXS8udGVzdChzdGF0ZS5jb250ZXh0LnR5cGUpKQogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsICJwYXR0ZXJuIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgICBlbHNlIGlmIChzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iICYmICFzdGF0ZS5jb250ZXh0LmFsaWduKSB7CiAgICAgICAgICBzdGF0ZS5jb250ZXh0LmFsaWduID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLmNvbnRleHQuY29sID0gc3RyZWFtLmNvbHVtbigpOwogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICB2YXIgY29udGV4dCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgIGlmICgvW1xdXH1dLy50ZXN0KGZpcnN0Q2hhcikpCiAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgY29udGV4dC50eXBlID09ICJwYXR0ZXJuIikgY29udGV4dCA9IGNvbnRleHQucHJldjsKCiAgICAgIHZhciBjbG9zaW5nID0gY29udGV4dCAmJiBmaXJzdENoYXIgPT0gY29udGV4dC50eXBlOwogICAgICBpZiAoIWNvbnRleHQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGVsc2UgaWYgKGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sOwogICAgICBlbHNlIGlmIChjb250ZXh0LmFsaWduKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbCArIChjbG9zaW5nID8gMCA6IDEpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtc3BhcnFsLXF1ZXJ5IiwgInNwYXJxbCIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/stex/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/stex/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IHNUZVggbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InN0ZXguanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBzVGVYIG1vZGU8L2gxPgogICAgIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+ClxiZWdpbnttb2R1bGV9W2lkPWJidC1zaXplXQpcaW1wb3J0bW9kdWxlW2JhbGFuY2VkLWJpbmFyeS10cmVlc117YmFsYW5jZWQtYmluYXJ5LXRyZWVzfQpcaW1wb3J0bW9kdWxlW1xLV0FSQ3NsaWRlc3tkbWF0aC9lbi9jYXJkaW5hbGl0eX1de2NhcmRpbmFsaXR5fQoKXGJlZ2lue2ZyYW1lfQogIFxmcmFtZXRpdGxle1NpemUgTGVtbWEgZm9yIEJhbGFuY2VkIFRyZWVzfQogIFxiZWdpbntpdGVtaXplfQogIFxpdGVtCiAgICBcYmVnaW57YXNzZXJ0aW9ufVtpZD1zaXplLWxlbW1hLHR5cGU9bGVtbWFdIAogICAgTGV0ICRHPVx0dXB7VixFfSQgYmUgYSBcdGVybXJlZltjZD1iaW5hcnktdHJlZXNde2JhbGFuY2VkIGJpbmFyeSB0cmVlfSAKICAgIG9mIFx0ZXJtcmVmW2NkPWdyYXBoLWRlcHRoLG5hbWU9dmVydGV4LWRlcHRoXXtkZXB0aH0kbj5pJCwgdGhlbiB0aGUgc2V0CiAgICAgJFxkZWZlcXtcbGl2YXJ7Vn1pfXtcc2V0c3R7XGluc2V0e3Z9e1Z9fXtcZ2RlcHRoe3Z9ID0gaX19JCBvZgogICAgXHRlcm1yZWZbY2Q9Z3JhcGhzLWludHJvLG5hbWU9bm9kZV17bm9kZXN9IGF0IAogICAgXHRlcm1yZWZbY2Q9Z3JhcGgtZGVwdGgsbmFtZT12ZXJ0ZXgtZGVwdGhde2RlcHRofSAkaSQgaGFzCiAgICBcdGVybXJlZltjZD1jYXJkaW5hbGl0eSxuYW1lPWNhcmRpbmFsaXR5XXtjYXJkaW5hbGl0eX0gJFxwb3dlcjJpJC4KICAgXGVuZHthc3NlcnRpb259CiAgXGl0ZW0KICAgIFxiZWdpbntzcHJvb2Z9W2lkPXNpemUtbGVtbWEtcGYscHJvb2ZlbmQ9LGZvcj1zaXplLWxlbW1hXXt2aWEgaW5kdWN0aW9uIG92ZXIgdGhlIGRlcHRoICRpJC59CiAgICAgIFxiZWdpbntzcGZjYXNlc317V2UgaGF2ZSB0byBjb25zaWRlciB0d28gY2FzZXN9CiAgICAgICAgXGJlZ2lue3NwZmNhc2V9eyRpPTAkfQogICAgICAgICAgXGJlZ2lue3NwZnN0ZXB9W2Rpc3BsYXk9Zmxvd10KICAgICAgICAgICAgdGhlbiAkXGxpdmFye1Z9aT1cc2V0e1xsaXZhcnt2fXJ9JCwgd2hlcmUgJFxsaXZhcnt2fXIkIGlzIHRoZSByb290LCBzbwogICAgICAgICAgICAkXGVxe1xjYXJke1xsaXZhcntWfTB9LFxjYXJke1xzZXR7XGxpdmFye3Z9cn19LDEsXHBvd2VyMjB9JC4KICAgICAgICAgIFxlbmR7c3Bmc3RlcH0KICAgICAgICBcZW5ke3NwZmNhc2V9CiAgICAgICAgXGJlZ2lue3NwZmNhc2V9eyRpPjAkfQogICAgICAgICAgXGJlZ2lue3NwZnN0ZXB9W2Rpc3BsYXk9Zmxvd10KICAgICAgICAgICB0aGVuICRcbGl2YXJ7Vn17aS0xfSQgY29udGFpbnMgJFxwb3dlcjJ7aS0xfSQgdmVydGV4ZXMgCiAgICAgICAgICAgXGJlZ2lue2p1c3RpZmljYXRpb259W21ldGhvZD1ieUlIXShJSClcZW5ke2p1c3RpZmljYXRpb259CiAgICAgICAgICBcZW5ke3NwZnN0ZXB9CiAgICAgICAgICBcYmVnaW57c3Bmc3RlcH0KICAgICAgICAgICBCeSB0aGUgXGJlZ2lue2p1c3RpZmljYXRpb259W21ldGhvZD1ieURlZl1kZWZpbml0aW9uIG9mIGEgYmluYXJ5CiAgICAgICAgICAgICAgdHJlZVxlbmR7anVzdGlmaWNhdGlvbn0sIGVhY2ggJFxpbnNldHt2fXtcbGl2YXJ7Vn17aS0xfX0kIGlzIGEgbGVhZiBvciBoYXMKICAgICAgICAgICAgdHdvIGNoaWxkcmVuIHRoYXQgYXJlIGF0IGRlcHRoICRpJC4KICAgICAgICAgIFxlbmR7c3Bmc3RlcH0KICAgICAgICAgIFxiZWdpbntzcGZzdGVwfQogICAgICAgICAgIEFzICRHJCBpcyBcdGVybXJlZltjZD1iYWxhbmNlZC1iaW5hcnktdHJlZXMsbmFtZT1iYWxhbmNlZC1iaW5hcnktdHJlZV17YmFsYW5jZWR9IGFuZCAkXGdkZXB0aHtHfT1uPmkkLCAkXGxpdmFye1Z9e2ktMX0kIGNhbm5vdCBjb250YWluCiAgICAgICAgICAgIGxlYXZlcy4KICAgICAgICAgIFxlbmR7c3Bmc3RlcH0KICAgICAgICAgIFxiZWdpbntzcGZzdGVwfVt0eXBlPWNvbmNsdXNpb25dCiAgICAgICAgICAgVGh1cyAkXGVxe1xjYXJke1xsaXZhcntWfWl9LHtcYXRpbWVzW2Nkb3RdezIsXGNhcmR7XGxpdmFye1Z9e2ktMX19fX0se1xhdGltZXNbY2RvdF17MixccG93ZXIye2ktMX19fSxccG93ZXIyaX0kLgogICAgICAgICAgXGVuZHtzcGZzdGVwfQogICAgICAgIFxlbmR7c3BmY2FzZX0KICAgICAgXGVuZHtzcGZjYXNlc30KICAgIFxlbmR7c3Byb29mfQogIFxpdGVtIAogICAgXGJlZ2lue2Fzc2VydGlvbn1baWQ9ZmJidCx0eXBlPWNvcm9sbGFyeV0JCiAgICAgIEEgZnVsbHkgYmFsYW5jZWQgdHJlZSBvZiBkZXB0aCAkZCQgaGFzICRccG93ZXIye2QrMX0tMSQgbm9kZXMuCiAgICBcZW5ke2Fzc2VydGlvbn0KICBcaXRlbQogICAgICBcYmVnaW57c3Byb29mfVtmb3I9ZmJidCxpZD1mYmJ0LXBmXXt9CiAgICAgICAgXGJlZ2lue3NwZnN0ZXB9CiAgICAgICAgICBMZXQgJFxkZWZlcXtHfXtcdHVwe1YsRX19JCBiZSBhIGZ1bGx5IGJhbGFuY2VkIHRyZWUKICAgICAgICBcZW5ke3NwZnN0ZXB9CiAgICAgICAgXGJlZ2lue3NwZnN0ZXB9CiAgICAgICAgICBUaGVuICRcY2FyZHtWfT1cU3VtZnJvbXRve2l9MWR7XHBvd2VyMml9PSBccG93ZXIye2QrMX0tMSQuCiAgICAgICAgXGVuZHtzcGZzdGVwfQogICAgICBcZW5ke3Nwcm9vZn0KICAgIFxlbmR7aXRlbWl6ZX0KICBcZW5ke2ZyYW1lfQpcYmVnaW57bm90ZX0KICBcYmVnaW57b210ZXh0fVt0eXBlPWNvbmNsdXNpb24sZm9yPWJpbmFyeS10cmVlXQogICAgVGhpcyBzaG93cyB0aGF0IGJhbGFuY2VkIGJpbmFyeSB0cmVlcyBncm93IGluIGJyZWFkdGggdmVyeSBxdWlja2x5LCBhIGNvbnNlcXVlbmNlIG9mCiAgICB0aGlzIGlzIHRoYXQgdGhleSBhcmUgdmVyeSBzaGFsbG93IChhbmQgdGhpcyBjb21wdXRlIHZlcnkgZmFzdCksIHdoaWNoIGlzIHRoZSBlc3NlbmNlIG9mCiAgICB0aGUgbmV4dCByZXN1bHQuCiAgXGVuZHtvbXRleHR9ClxlbmR7bm90ZX0KXGVuZHttb2R1bGV9CgolJSUgTG9jYWwgVmFyaWFibGVzOiAKJSUlIG1vZGU6IExhVGVYCiUlJSBUZVgtbWFzdGVyOiAiYWxsIgolJSUgRW5kOiBcZW5ke2RvY3VtZW50fQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXN0ZXg8L2NvZGU+LjwvcD4KCiAgICA8cD48c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPiA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjc3RleF8qIj5ub3JtYWw8L2E+LCAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2Usc3RleF8qIj52ZXJib3NlPC9hPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/stex/stex.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogQXV0aG9yOiBDb25zdGFudGluIEp1Y292c2NoaSAoYy5qdWNvdnNjaGlAamFjb2JzLXVuaXZlcnNpdHkuZGUpCiAqIExpY2VuY2U6IE1JVAogKi8KCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgic3RleCIsIGZ1bmN0aW9uKCkgCnsgICAgCiAgICBmdW5jdGlvbiBwdXNoQ29tbWFuZChzdGF0ZSwgY29tbWFuZCkgewoJc3RhdGUuY21kU3RhdGUucHVzaChjb21tYW5kKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwZWVrQ29tbWFuZChzdGF0ZSkgeyAKCWlmIChzdGF0ZS5jbWRTdGF0ZS5sZW5ndGg+MCkKCSAgICByZXR1cm4gc3RhdGUuY21kU3RhdGVbc3RhdGUuY21kU3RhdGUubGVuZ3RoLTFdOwoJZWxzZQoJICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcENvbW1hbmQoc3RhdGUpIHsKCWlmIChzdGF0ZS5jbWRTdGF0ZS5sZW5ndGg+MCkgewoJICAgIHZhciBwbHVnID0gc3RhdGUuY21kU3RhdGUucG9wKCk7CgkgICAgcGx1Zy5jbG9zZUJyYWNrZXQoKTsKCX0JICAgIAogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5TW9zdFBvd2VyZnVsKHN0YXRlKSB7CiAgICAgIHZhciBjb250ZXh0ID0gc3RhdGUuY21kU3RhdGU7CiAgICAgIGZvciAodmFyIGkgPSBjb250ZXh0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkgIHZhciBwbHVnID0gY29udGV4dFtpXTsKCSAgaWYgKHBsdWcubmFtZT09IkRFRkFVTFQiKQoJICAgICAgY29udGludWU7CgkgIHJldHVybiBwbHVnLnN0eWxlSWRlbnRpZmllcigpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFBsdWdpblBhdHRlcm4ocGx1Z2luTmFtZSwgY21kU3R5bGUsIGJyYWNrZXRzLCBzdHlsZXMpIHsKCXJldHVybiBmdW5jdGlvbiAoKSB7CgkgICAgdGhpcy5uYW1lPXBsdWdpbk5hbWU7CgkgICAgdGhpcy5icmFja2V0Tm8gPSAwOwoJICAgIHRoaXMuc3R5bGU9Y21kU3R5bGU7CgkgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7CgkgICAgdGhpcy5icmFja2V0cyA9IGJyYWNrZXRzOwoKCSAgICB0aGlzLnN0eWxlSWRlbnRpZmllciA9IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmJyYWNrZXRObzw9dGhpcy5zdHlsZXMubGVuZ3RoKQoJCSAgICByZXR1cm4gdGhpcy5zdHlsZXNbdGhpcy5icmFja2V0Tm8tMV07CgkJZWxzZQoJCSAgICByZXR1cm4gbnVsbDsKCSAgICB9OwoJICAgIHRoaXMub3BlbkJyYWNrZXQgPSBmdW5jdGlvbigpIHsKCQl0aGlzLmJyYWNrZXRObysrOwoJCXJldHVybiAiYnJhY2tldCI7CgkgICAgfTsKCSAgICB0aGlzLmNsb3NlQnJhY2tldCA9IGZ1bmN0aW9uKCkge307Cgl9OwogICAgfQoKICAgIHZhciBwbHVnaW5zID0gbmV3IEFycmF5KCk7CiAgIAogICAgcGx1Z2luc1siaW1wb3J0bW9kdWxlIl0gPSBhZGRQbHVnaW5QYXR0ZXJuKCJpbXBvcnRtb2R1bGUiLCAidGFnIiwgIntbIiwgWyJzdHJpbmciLCAiYnVpbHRpbiJdKTsKICAgIHBsdWdpbnNbImRvY3VtZW50Y2xhc3MiXSA9IGFkZFBsdWdpblBhdHRlcm4oImRvY3VtZW50Y2xhc3MiLCAidGFnIiwgIntbIiwgWyIiLCAiYXRvbSJdKTsKICAgIHBsdWdpbnNbInVzZXBhY2thZ2UiXSA9IGFkZFBsdWdpblBhdHRlcm4oImRvY3VtZW50Y2xhc3MiLCAidGFnIiwgIlsiLCBbImF0b20iXSk7CiAgICBwbHVnaW5zWyJiZWdpbiJdID0gYWRkUGx1Z2luUGF0dGVybigiZG9jdW1lbnRjbGFzcyIsICJ0YWciLCAiWyIsIFsiYXRvbSJdKTsKICAgIHBsdWdpbnNbImVuZCJdID0gYWRkUGx1Z2luUGF0dGVybigiZG9jdW1lbnRjbGFzcyIsICJ0YWciLCAiWyIsIFsiYXRvbSJdKTsKCiAgICBwbHVnaW5zWyJERUZBVUxUIl0gPSBmdW5jdGlvbiAoKSB7Cgl0aGlzLm5hbWU9IkRFRkFVTFQiOwoJdGhpcy5zdHlsZT0idGFnIjsKCgl0aGlzLnN0eWxlSWRlbnRpZmllciA9IHRoaXMub3BlbkJyYWNrZXQgPSB0aGlzLmNsb3NlQnJhY2tldCA9IGZ1bmN0aW9uKCkge307CiAgICB9OwoKICAgIGZ1bmN0aW9uIHNldFN0YXRlKHN0YXRlLCBmKSB7CglzdGF0ZS5mID0gZjsKICAgIH0KCiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzdGF0ZSkgewoJaWYgKHNvdXJjZS5tYXRjaCgvXlxcW2EtekEtWkBdKy8pKSB7CgkgICAgdmFyIGNtZE5hbWUgPSBzb3VyY2UuY3VycmVudCgpOwoJICAgIGNtZE5hbWUgPSBjbWROYW1lLnN1YnN0cigxLCBjbWROYW1lLmxlbmd0aC0xKTsKICAgICAgICAgICAgdmFyIHBsdWc7CiAgICAgICAgICAgIGlmIChwbHVnaW5zLmhhc093blByb3BlcnR5KGNtZE5hbWUpKSB7CgkgICAgICBwbHVnID0gcGx1Z2luc1tjbWROYW1lXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBwbHVnID0gcGx1Z2luc1siREVGQVVMVCJdOwogICAgICAgICAgICB9CgkgICAgcGx1ZyA9IG5ldyBwbHVnKCk7CgkgICAgcHVzaENvbW1hbmQoc3RhdGUsIHBsdWcpOwoJICAgIHNldFN0YXRlKHN0YXRlLCBiZWdpblBhcmFtcyk7CgkgICAgcmV0dXJuIHBsdWcuc3R5bGU7Cgl9CgogICAgICAgIC8vIGVzY2FwZSBjaGFyYWN0ZXJzIAogICAgICAgIGlmIChzb3VyY2UubWF0Y2goL15cXFskJiUje31fXS8pKSB7CiAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgfQoKICAgICAgICAvLyB3aGl0ZSBzcGFjZSBjb250cm9sIGNoYXJhY3RlcnMKICAgICAgICBpZiAoc291cmNlLm1hdGNoKC9eXFxbLDshXC9dLykpIHsKICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9CgoJdmFyIGNoID0gc291cmNlLm5leHQoKTsKCWlmIChjaCA9PSAiJSIpIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiAlIGF0IGVuZCBvZiBpdHMgb3duIGxpbmU7IHN0YXkgaW4gc2FtZSBzdGF0ZQogICAgICAgICAgICBpZiAoIXNvdXJjZS5lb2woKSkgewogICAgICAgICAgICAgIHNldFN0YXRlKHN0YXRlLCBpbkNDb21tZW50KTsKICAgICAgICAgICAgfQoJICAgIHJldHVybiAiY29tbWVudCI7Cgl9IAoJZWxzZSBpZiAoY2g9PSd9JyB8fCBjaD09J10nKSB7CgkgICAgcGx1ZyA9IHBlZWtDb21tYW5kKHN0YXRlKTsKCSAgICBpZiAocGx1ZykgewoJCXBsdWcuY2xvc2VCcmFja2V0KGNoKTsKCQlzZXRTdGF0ZShzdGF0ZSwgYmVnaW5QYXJhbXMpOwoJICAgIH0gZWxzZQoJCXJldHVybiAiZXJyb3IiOwoJICAgIHJldHVybiAiYnJhY2tldCI7Cgl9IGVsc2UgaWYgKGNoPT0neycgfHwgY2g9PSdbJykgewoJICAgIHBsdWcgPSBwbHVnaW5zWyJERUZBVUxUIl07CSAgICAKCSAgICBwbHVnID0gbmV3IHBsdWcoKTsKCSAgICBwdXNoQ29tbWFuZChzdGF0ZSwgcGx1Zyk7CgkgICAgcmV0dXJuICJicmFja2V0IjsJICAgIAoJfQoJZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewoJICAgIHNvdXJjZS5lYXRXaGlsZSgvW1x3LiVdLyk7CgkgICAgcmV0dXJuICJhdG9tIjsKCX0KCWVsc2UgewoJICAgIHNvdXJjZS5lYXRXaGlsZSgvW1x3LV9dLyk7CgkgICAgcmV0dXJuIGFwcGx5TW9zdFBvd2VyZnVsKHN0YXRlKTsKCX0KICAgIH0KCiAgICBmdW5jdGlvbiBpbkNDb21tZW50KHNvdXJjZSwgc3RhdGUpIHsKCXNvdXJjZS5za2lwVG9FbmQoKTsKCXNldFN0YXRlKHN0YXRlLCBub3JtYWwpOwoJcmV0dXJuICJjb21tZW50IjsKICAgIH0KCiAgICBmdW5jdGlvbiBiZWdpblBhcmFtcyhzb3VyY2UsIHN0YXRlKSB7Cgl2YXIgY2ggPSBzb3VyY2UucGVlaygpOwoJaWYgKGNoID09ICd7JyB8fCBjaCA9PSAnWycpIHsKCSAgIHZhciBsYXN0UGx1ZyA9IHBlZWtDb21tYW5kKHN0YXRlKTsKCSAgIGxhc3RQbHVnLm9wZW5CcmFja2V0KGNoKTsKCSAgIHNvdXJjZS5lYXQoY2gpOwoJICAgc2V0U3RhdGUoc3RhdGUsIG5vcm1hbCk7CgkgICByZXR1cm4gImJyYWNrZXQiOwoJfQoJaWYgKC9bIFx0XHJdLy50ZXN0KGNoKSkgewoJICAgIHNvdXJjZS5lYXQoY2gpOwoJICAgIHJldHVybiBudWxsOwoJfQoJc2V0U3RhdGUoc3RhdGUsIG5vcm1hbCk7CglsYXN0UGx1ZyA9IHBlZWtDb21tYW5kKHN0YXRlKTsKCWlmIChsYXN0UGx1ZykgewoJICAgIHBvcENvbW1hbmQoc3RhdGUpOwoJfQogICAgICAgIHJldHVybiBub3JtYWwoc291cmNlLCBzdGF0ZSk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHsgZjpub3JtYWwsIGNtZFN0YXRlOltdIH07IH0sCgkgY29weVN0YXRlOiBmdW5jdGlvbihzKSB7IHJldHVybiB7IGY6IHMuZiwgY21kU3RhdGU6IHMuY21kU3RhdGUuc2xpY2UoMCwgcy5jbWRTdGF0ZS5sZW5ndGgpIH07IH0sCgkgCgkgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKCSB2YXIgdCA9IHN0YXRlLmYoc3RyZWFtLCBzdGF0ZSk7CgkgcmV0dXJuIHQ7CiAgICAgfQogfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zdGV4IiwgInN0ZXgiKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbGF0ZXgiLCAic3RleCIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/stex/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIE1UID0gTW9kZVRlc3Q7Ck1ULm1vZGVOYW1lID0gJ3N0ZXgnOwpNVC5tb2RlT3B0aW9ucyA9IHt9OwoKTVQudGVzdE1vZGUoCiAgJ3dvcmQnLAogICdmb28nLAogIFsKICAgIG51bGwsICdmb28nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3R3b1dvcmRzJywKICAnZm9vIGJhcicsCiAgWwogICAgbnVsbCwgJ2ZvbyBiYXInCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ2JlZ2luRW5kRG9jdW1lbnQnLAogICdcXGJlZ2lue2RvY3VtZW50fVxuXFxlbmR7ZG9jdW1lbnR9JywKICBbCiAgICAndGFnJywgJ1xcYmVnaW4nLAogICAgJ2JyYWNrZXQnLCAneycsCiAgICAnYXRvbScsICdkb2N1bWVudCcsCiAgICAnYnJhY2tldCcsICd9JywKICAgICd0YWcnLCAnXFxlbmQnLAogICAgJ2JyYWNrZXQnLCAneycsCiAgICAnYXRvbScsICdkb2N1bWVudCcsCiAgICAnYnJhY2tldCcsICd9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdiZWdpbkVuZEVxdWF0aW9uJywKICAnXFxiZWdpbntlcXVhdGlvbn1cbiAgRT1tY14yXG5cXGVuZHtlcXVhdGlvbn0nLAogIFsKICAgICd0YWcnLCAnXFxiZWdpbicsCiAgICAnYnJhY2tldCcsICd7JywKICAgICdhdG9tJywgJ2VxdWF0aW9uJywKICAgICdicmFja2V0JywgJ30nLAogICAgbnVsbCwgJyAgRT1tY14yJywKICAgICd0YWcnLCAnXFxlbmQnLAogICAgJ2JyYWNrZXQnLCAneycsCiAgICAnYXRvbScsICdlcXVhdGlvbicsCiAgICAnYnJhY2tldCcsICd9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdiZWdpbk1vZHVsZScsCiAgJ1xcYmVnaW57bW9kdWxlfVtdJywKICBbCiAgICAndGFnJywgJ1xcYmVnaW4nLAogICAgJ2JyYWNrZXQnLCAneycsCiAgICAnYXRvbScsICdtb2R1bGUnLAogICAgJ2JyYWNrZXQnLCAnfVtdJwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdiZWdpbk1vZHVsZUlkJywKICAnXFxiZWdpbnttb2R1bGV9W2lkPWJidC1zaXplXScsCiAgWwogICAgJ3RhZycsICdcXGJlZ2luJywKICAgICdicmFja2V0JywgJ3snLAogICAgJ2F0b20nLCAnbW9kdWxlJywKICAgICdicmFja2V0JywgJ31bJywKICAgIG51bGwsICdpZD1iYnQtc2l6ZScsCiAgICAnYnJhY2tldCcsICddJwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdpbXBvcnRNb2R1bGUnLAogICdcXGltcG9ydG1vZHVsZVtiLWItdF17Yi1iLXR9JywKICBbCiAgICAndGFnJywgJ1xcaW1wb3J0bW9kdWxlJywKICAgICdicmFja2V0JywgJ1snLAogICAgJ3N0cmluZycsICdiLWItdCcsCiAgICAnYnJhY2tldCcsICddeycsCiAgICAnYnVpbHRpbicsICdiLWItdCcsCiAgICAnYnJhY2tldCcsICd9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdpbXBvcnRNb2R1bGVQYXRoJywKICAnXFxpbXBvcnRtb2R1bGVbXFxLV0FSQ3NsaWRlc3tkbWF0aC9lbi9jYXJkaW5hbGl0eX1de2NhcmR9JywKICBbCiAgICAndGFnJywgJ1xcaW1wb3J0bW9kdWxlJywKICAgICdicmFja2V0JywgJ1snLAogICAgJ3RhZycsICdcXEtXQVJDc2xpZGVzJywKICAgICdicmFja2V0JywgJ3snLAogICAgJ3N0cmluZycsICdkbWF0aC9lbi9jYXJkaW5hbGl0eScsCiAgICAnYnJhY2tldCcsICd9XXsnLAogICAgJ2J1aWx0aW4nLCAnY2FyZCcsCiAgICAnYnJhY2tldCcsICd9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICdwc0ZvclBERicsCiAgJ1xcUFNmb3JQREZbMV17IzF9JywgLy8gY291bGQgdHJlYXQgIzEgc3BlY2lhbGx5CiAgWwogICAgJ3RhZycsICdcXFBTZm9yUERGJywKICAgICdicmFja2V0JywgJ1snLAogICAgJ2F0b20nLCAnMScsCiAgICAnYnJhY2tldCcsICddeycsCiAgICBudWxsLCAnIzEnLAogICAgJ2JyYWNrZXQnLCAnfScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAnY29tbWVudCcsCiAgJyUgZm9vJywKICBbCiAgICAnY29tbWVudCcsICclIGZvbycKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGFnQ29tbWVudCcsCiAgJ1xcaXRlbSUgYmFyJywKICBbCiAgICAndGFnJywgJ1xcaXRlbScsCiAgICAnY29tbWVudCcsICclIGJhcicKICBdCik7CgpNVC50ZXN0TW9kZSgKICAnY29tbWVudFRhZycsCiAgJyAlIFxcaXRlbScsCiAgWwogICAgbnVsbCwgJyAnLAogICAgJ2NvbW1lbnQnLCAnJSBcXGl0ZW0nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ2NvbW1lbnRMaW5lQnJlYWsnLAogICclXG5mb28nLAogIFsKICAgICdjb21tZW50JywgJyUnLAogICAgbnVsbCwgJ2ZvbycKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGFnRXJyb3JDdXJseScsCiAgJ1xcYmVnaW59eycsCiAgWwogICAgJ3RhZycsICdcXGJlZ2luJywKICAgICdlcnJvcicsICd9JywKICAgICdicmFja2V0JywgJ3snCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3RhZ0Vycm9yU3F1YXJlJywKICAnXFxpdGVtXXsnLAogIFsKICAgICd0YWcnLCAnXFxpdGVtJywKICAgICdlcnJvcicsICddJywKICAgICdicmFja2V0JywgJ3snCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ2NvbW1lbnRDdXJseScsCiAgJyUgfScsCiAgWwogICAgJ2NvbW1lbnQnLCAnJSB9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0YWdIYXNoJywKICAndGhlIFxcIyBrZXknLAogIFsKICAgIG51bGwsICd0aGUgJywKICAgICd0YWcnLCAnXFwjJywKICAgIG51bGwsICcga2V5JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0YWdOdW1iZXInLAogICdhIFxcJDUgc3RldHNvbicsCiAgWwogICAgbnVsbCwgJ2EgJywKICAgICd0YWcnLCAnXFwkJywKICAnYXRvbScsIDUsCiAgbnVsbCwgJyBzdGV0c29uJwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0YWdQZXJjZW50JywKICAnMTAwXFwlIGJlZWYnLAogIFsKICAgICdhdG9tJywgJzEwMCcsCiAgICAndGFnJywgJ1xcJScsCiAgICBudWxsLCAnIGJlZWYnCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3RhZ0FtcGVyc2FuZCcsCiAgJ0wgXFwmIE4nLAogIFsKICAgIG51bGwsICdMICcsCiAgICAndGFnJywgJ1xcJicsCiAgICBudWxsLCAnIE4nCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3RhZ1VuZGVyc2NvcmUnLAogICdmb29cXF9iYXInLAogIFsKICAgIG51bGwsICdmb28nLAogICAgJ3RhZycsICdcXF8nLAogICAgbnVsbCwgJ2JhcicKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGFnQnJhY2tldE9wZW4nLAogICdcXGVtcGh7XFx7fScsCiAgWwogICAgJ3RhZycsICdcXGVtcGgnLAogICAgJ2JyYWNrZXQnLCAneycsCiAgICAndGFnJywgJ1xceycsCiAgICAnYnJhY2tldCcsICd9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0YWdCcmFja2V0Q2xvc2UnLAogICdcXGVtcGh7XFx9fScsCiAgWwogICAgJ3RhZycsICdcXGVtcGgnLAogICAgJ2JyYWNrZXQnLCAneycsCiAgICAndGFnJywgJ1xcfScsCiAgICAnYnJhY2tldCcsICd9JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0YWdMZXR0ZXJOdW1iZXInLAogICdzZWN0aW9uIFxcUzEnLAogIFsKICAgIG51bGwsICdzZWN0aW9uICcsCiAgICAndGFnJywgJ1xcUycsCiAgICAnYXRvbScsICcxJwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0ZXh0VGFnTnVtYmVyJywKICAncGFyYSBcXFAyJywKICBbCiAgICBudWxsLCAncGFyYSAnLAogICAgJ3RhZycsICdcXFAnLAogICAgJ2F0b20nLCAnMicKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGhpbnNwYWNlJywKICAneFxcLHknLCAvLyB0aGluc3BhY2UKICBbCiAgICBudWxsLCAneCcsCiAgICAndGFnJywgJ1xcLCcsCiAgICBudWxsLCAneScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAndGhpY2tzcGFjZScsCiAgJ3hcXDt5JywgLy8gdGhpY2tzcGFjZQogIFsKICAgIG51bGwsICd4JywKICAgICd0YWcnLCAnXFw7JywKICAgIG51bGwsICd5JwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICduZWdhdGl2ZVRoaW5zcGFjZScsCiAgJ3hcXCF5JywgLy8gbmVnYXRpdmUgdGhpbnNwYWNlCiAgWwogICAgbnVsbCwgJ3gnLAogICAgJ3RhZycsICdcXCEnLAogICAgbnVsbCwgJ3knCiAgXQopOwoKTVQudGVzdE1vZGUoCiAgJ3BlcmlvZE5vdFNlbnRlbmNlJywKICAnSi5cXCBMLlxcIGlzJywgLy8gcGVyaW9kIG5vdCBlbmRpbmcgYSBzZW50ZW5jZQogIFsKICAgIG51bGwsICdKLlxcIEwuXFwgaXMnCiAgXQopOyAvLyBtYXliZSBjb3VsZCBiZSBiZXR0ZXIKCk1ULnRlc3RNb2RlKAogICdwZXJpb2RTZW50ZW5jZScsCiAgJ1hcXEAuIFRoZScsIC8vIHBlcmlvZCBlbmRpbmcgYSBzZW50ZW5jZQogIFsKICAgIG51bGwsICdYJywKICAgICd0YWcnLCAnXFxAJywKICAgIG51bGwsICcuIFRoZScKICBdCik7CgpNVC50ZXN0TW9kZSgKICAnaXRhbGljQ29ycmVjdGlvbicsCiAgJ3tcXGVtIElmXFwvfSBJJywgLy8gaXRhbGljIGNvcnJlY3Rpb24KICBbCiAgICAnYnJhY2tldCcsICd7JywKICAgICd0YWcnLCAnXFxlbScsCiAgICBudWxsLCAnIElmJywKICAgICd0YWcnLCAnXFwvJywKICAgICdicmFja2V0JywgJ30nLAogICAgbnVsbCwgJyBJJwogIF0KKTsKCk1ULnRlc3RNb2RlKAogICd0YWdCcmFja2V0JywKICAnXFxuZXdjb21tYW5ke1xccG9wfScsCiAgWwogICAgJ3RhZycsICdcXG5ld2NvbW1hbmQnLAogICAgJ2JyYWNrZXQnLCAneycsCiAgICAndGFnJywgJ1xccG9wJywKICAgICdicmFja2V0JywgJ30nCiAgXQopOw==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/tiddlywiki/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/tiddlywiki/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFRpZGRseVdpa2kgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi91dGlsL21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InRpZGRseXdpa2kuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ0aWRkbHl3aWtpLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogVGlkZGx5V2lraSBtb2RlPC9oMT4KCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIVRpZGRseVdpa2kgRm9ybWF0dGluZwoqIFJlbmRlcmVkIHZlcnNpb25zIGNhbiBiZSBmb3VuZCBhdDogaHR0cDovL3d3dy50aWRkbHl3aWtpLmNvbS8jUmVmZXJlbmNlCgp8IU9wdGlvbiAgICAgICAgICAgIHwgIVN5bnRheCAgICAgICAgICAgIHwKfGJvbGQgZm9udCAgICAgICAgICB8ICcnYm9sZCcnICAgICAgICAgICB8CnxpdGFsaWMgdHlwZSAgICAgICAgfCAvL2l0YWxpYy8vICAgICAgICAgfAp8dW5kZXJsaW5lZCB0ZXh0ICAgIHwgX191bmRlcmxpbmVkX18gICAgIHwKfHN0cmlrZXRocm91Z2ggdGV4dCB8IC0tc3RyaWtldGhyb3VnaC0tICB8CnxzdXBlcnNjcmlwdCB0ZXh0ICAgfCBzdXBlcl5ec2NyaXB0Xl4gICAgfAp8c3Vic2NyaXB0IHRleHQgICAgIHwgc3Vifn5zY3JpcHR+fiAgICAgIHwKfGhpZ2hsaWdodGVkIHRleHQgICB8IEBAaGlnaGxpZ2h0ZWRAQCAgICB8CnxwcmVmb3JtYXR0ZWQgdGV4dCAgfCB7e3twcmVmb3JtYXR0ZWR9fX0gfAoKIUJsb2NrIEVsZW1lbnRzCjw8PAohSGVhZGluZyAxCgohIUhlYWRpbmcgMgoKISEhSGVhZGluZyAzCgohISEhSGVhZGluZyA0CgohISEhIUhlYWRpbmcgNQo8PDwKCiEhTGlzdHMKPDw8CiogdW5vcmRlcmVkIGxpc3QsIGxldmVsIDEKKiogdW5vcmRlcmVkIGxpc3QsIGxldmVsIDIKKioqIHVub3JkZXJlZCBsaXN0LCBsZXZlbCAzCgojIG9yZGVyZWQgbGlzdCwgbGV2ZWwgMQojIyBvcmRlcmVkIGxpc3QsIGxldmVsIDIKIyMjIHVub3JkZXJlZCBsaXN0LCBsZXZlbCAzCgo7IGRlZmluaXRpb24gbGlzdCwgdGVybQo6IGRlZmluaXRpb24gbGlzdCwgZGVzY3JpcHRpb24KPDw8CgohIUJsb2NrcXVvdGVzCjw8PAo+IGJsb2NrcXVvdGUsIGxldmVsIDEKPj4gYmxvY2txdW90ZSwgbGV2ZWwgMgo+Pj4gYmxvY2txdW90ZSwgbGV2ZWwgMwoKPiBibG9ja3F1b3RlCjw8PAoKISFQcmVmb3JtYXR0ZWQgVGV4dAo8PDwKe3t7CnByZWZvcm1hdHRlZCAoZS5nLiBjb2RlKQp9fX0KPDw8CgohIUNvZGUgU2VjdGlvbnMKPDw8Cnt7ewpUZXh0IHN0eWxlIGNvZGUKfX19CgovL3t7ewpKUyBzdHlsZWQgY29kZS4gVGlkZGx5V2lraSBtaXhlZCBtb2RlIHNob3VsZCBzdXBwb3J0IGhpZ2hsaWdodGVyIHN3aXRjaGluZyBpbiB0aGUgZnV0dXJlLgovL319fQoKPCEtLXt7ey0tPgpYTUwgc3R5bGVkIGNvZGUuIFRpZGRseVdpa2kgbWl4ZWQgbW9kZSBzaG91bGQgc3VwcG9ydCBoaWdobGlnaHRlciBzd2l0Y2hpbmcgaW4gdGhlIGZ1dHVyZS4KPCEtLX19fS0tPgo8PDwKCiEhVGFibGVzCjw8PAp8Q3NzQ2xhc3N8awp8IWhlYWRpbmcgY29sdW1uIDF8IWhlYWRpbmcgY29sdW1uIDJ8Cnxyb3cgMSwgY29sdW1uIDF8cm93IDEsIGNvbHVtbiAyfAp8cm93IDIsIGNvbHVtbiAxfHJvdyAyLCBjb2x1bW4gMnwKfD58Q09MU1BBTnwKfFJPV1NQQU58IC4uLiB8Cnx+fCAuLi4gfAp8Q3NzUHJvcGVydHk6dmFsdWU7Li4ufCAuLi4gfAp8Y2FwdGlvbnxjCgonJ0Fubm90YXRpb246JycKKiBUaGUge3t7Pn19fSBtYXJrZXIgY3JlYXRlcyBhICJjb2xzcGFuIiwgY2F1c2luZyB0aGUgY3VycmVudCBjZWxsIHRvIG1lcmdlIHdpdGggdGhlIG9uZSB0byB0aGUgcmlnaHQuCiogVGhlIHt7e359fX0gbWFya2VyIGNyZWF0ZXMgYSAicm93c3BhbiIsIGNhdXNpbmcgdGhlIGN1cnJlbnQgY2VsbCB0byBtZXJnZSB3aXRoIHRoZSBvbmUgYWJvdmUuCjw8PAohIUltYWdlcyAvJSBUT0RPICUvCmNmLiBbW1RpZGRseVdpa2kuY29tfGh0dHA6Ly93d3cudGlkZGx5d2lraS5jb20vI0VtYmVkZGVkSW1hZ2VzXV0KCiFIeXBlcmxpbmtzCiogW1tXaWtpV29yZHN8V2lraVdvcmRdXSBhcmUgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCB0byBoeXBlcmxpbmtzIHRvIHRoZSByZXNwZWN0aXZlIHRpZGRsZXIKKiogdGhlIGF1dG9tYXRpYyB0cmFuc2Zvcm1hdGlvbiBjYW4gYmUgc3VwcHJlc3NlZCBieSBwcmVjZWRpbmcgdGhlIHJlc3BlY3RpdmUgV2lraVdvcmQgd2l0aCBhIHRpbGRlICh7e3t+fX19KToge3t7fldpa2lXb3JkfX19CiogW1tQcmV0dHlMaW5rc11dIGFyZSBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgYW5kIGNvbnRhaW4gdGhlIGRlc2lyZWQgdGlkZGxlciBuYW1lOiB7e3tbW3RpZGRsZXIgbmFtZV1dfX19CioqIG9wdGlvbmFsbHksIGEgY3VzdG9tIHRpdGxlIG9yIGRlc2NyaXB0aW9uIGNhbiBiZSBhZGRlZCwgc2VwYXJhdGVkIGJ5IGEgcGlwZSBjaGFyYWN0ZXIgKHt7e3x9fX0pOiB7e3tbW3RpdGxlfHRhcmdldF1dfX19PGJyPicnJ04uQi46JycnIEluIHRoaXMgY2FzZSwgdGhlIHRhcmdldCBjYW4gYWxzbyBiZSBhbnkgd2Vic2l0ZSAoaS5lLiBVUkwpLgoKIUN1c3RvbSBTdHlsaW5nCioge3t7QEBDc3NQcm9wZXJ0eTp2YWx1ZTtDc3NQcm9wZXJ0eTp2YWx1ZTsuLi5AQH19fTxicj4nJ04uQi46JycgQ1NTIGNvbG9yIGRlZmluaXRpb25zIHNob3VsZCB1c2UgbG93ZXJjYXNlIGxldHRlcnMgdG8gcHJldmVudCB0aGUgaW5hZHZlcnRlbnQgY3JlYXRpb24gb2YgV2lraVdvcmRzLgoqIDxodG1sPjxjb2RlPnt7Y3VzdG9tQ3NzQ2xhc3N7Li4ufX19PC9jb2RlPjwvaHRtbD4KKiByYXcgSFRNTCBjYW4gYmUgaW5zZXJ0ZWQgYnkgZW5jbG9zaW5nIHRoZSByZXNwZWN0aXZlIGNvZGUgaW4gSFRNTCB0YWdzOiB7e3s8aHRtbD4gLi4uIDwvaHRtbD59fX0KCiFTcGVjaWFsIE1hcmtlcnMKKiB7e3s8YnI+fX19IGZvcmNlcyBhIG1hbnVhbCBsaW5lIGJyZWFrCioge3t7LS0tLX19fSBjcmVhdGVzIGEgaG9yaXpvbnRhbCBydWxlcgoqIFtbSFRNTCBlbnRpdGllc3xodHRwOi8vd3d3LnRpZGRseXdpa2kuY29tLyNIdG1sRW50aXRpZXNdXQoqIFtbSFRNTCBlbnRpdGllcyBsb2NhbHxIdG1sRW50aXRpZXNdXQoqIHt7ezw8bWFjcm9OYW1lPj59fX0gY2FsbHMgdGhlIHJlc3BlY3RpdmUgW1ttYWNyb3xNYWNyb3NdXQoqIFRvIGhpZGUgdGV4dCB3aXRoaW4gYSB0aWRkbGVyIHNvIHRoYXQgaXQgaXMgbm90IGRpc3BsYXllZCwgaXQgY2FuIGJlIHdyYXBwZWQgaW4ge3t7LyV9fX0gYW5kIHt7eyUvfX19Ljxici8+VGhpcyBjYW4gYmUgYSB1c2VmdWwgdHJpY2sgZm9yIGhpZGluZyBkcmFmdHMgb3IgYW5ub3RhdGluZyBjb21wbGV4IG1hcmt1cC4KKiBUbyBwcmV2ZW50IHdpa2kgbWFya3VwIGZyb20gdGFraW5nIGVmZmVjdCBmb3IgYSBwYXJ0aWN1bGFyIHNlY3Rpb24sIHRoYXQgc2VjdGlvbiBjYW4gYmUgZW5jbG9zZWQgaW4gdGhyZWUgZG91YmxlIHF1b3RlczogZS5nLiB7e3siIiJXaWtpV29yZCIiIn19fS4KPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICd0aWRkbHl3aWtpJywgICAgICAKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBlbnRlck1vZGU6ICdrZWVwJywKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+VGlkZGx5V2lraSBtb2RlIHN1cHBvcnRzIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24uPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtdGlkZGx5d2lraTwvY29kZT4uPC9wPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/tiddlywiki/tiddlywiki.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[c3Bhbi5jbS11bmRlcmxpbmVkIHsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQpzcGFuLmNtLXN0cmlrZXRocm91Z2ggewogIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwp9CnNwYW4uY20tYnJhY2UgewogIGNvbG9yOiAjMTcwOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CnNwYW4uY20tdGFibGUgewogIGNvbG9yOiBibHVlOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/tiddlywiki/tiddlywiki.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqKgp8JydOYW1lJyd8dGlkZGx5d2lraS5qc3wKfCcnRGVzY3JpcHRpb24nJ3xFbmFibGVzIFRpZGRseVdpa2l5IHN5bnRheCBoaWdobGlnaHRpbmcgdXNpbmcgQ29kZU1pcnJvcnwKfCcnQXV0aG9yJyd8UE1hcmlvfAp8JydWZXJzaW9uJyd8MC4xLjd8CnwnJ1N0YXR1cycnfCcnc3RhYmxlJyd8CnwnJ1NvdXJjZScnfFtbR2l0SHVifGh0dHBzOi8vZ2l0aHViLmNvbS9wbWFyaW8vQ29kZU1pcnJvcjIvYmxvYi90dy1zeW50YXgvbW9kZS90aWRkbHl3aWtpXV18CnwnJ0RvY3VtZW50YXRpb24nJ3xodHRwOi8vY29kZW1pcnJvci50aWRkbHlzcGFjZS5jb20vfAp8JydMaWNlbnNlJyd8W1tNSVQgTGljZW5zZXxodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocF1dfAp8JydDb3JlVmVyc2lvbicnfDIuNS4wfAp8JydSZXF1aXJlcycnfGNvZGVtaXJyb3IuanN8CnwnJ0tleXdvcmRzJyd8c3ludGF4IGhpZ2hsaWdodGluZyBjb2xvciBjb2RlIG1pcnJvciBjb2RlbWlycm9yfAohIEluZm8KQ29yZVZlcnNpb24gcGFyYW1ldGVyIGlzIG5lZWRlZCBmb3IgVGlkZGx5V2lraSBvbmx5IQoqKiovCi8ve3t7CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgidGlkZGx5d2lraSIsIGZ1bmN0aW9uICgpIHsKCS8vIFRva2VuaXplcgoJdmFyIHRleHR3b3JkcyA9IHt9OwoKCXZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uICgpIHsKCQlmdW5jdGlvbiBrdyh0eXBlKSB7CgkJCXJldHVybiB7IHR5cGU6IHR5cGUsIHN0eWxlOiAibWFjcm8ifTsKCQl9CgkJcmV0dXJuIHsKCQkJImFsbFRhZ3MiOiBrdygnYWxsVGFncycpLCAiY2xvc2VBbGwiOiBrdygnY2xvc2VBbGwnKSwgImxpc3QiOiBrdygnbGlzdCcpLAoJCQkibmV3Sm91cm5hbCI6IGt3KCduZXdKb3VybmFsJyksICJuZXdUaWRkbGVyIjoga3coJ25ld1RpZGRsZXInKSwKCQkJInBlcm1hdmlldyI6IGt3KCdwZXJtYXZpZXcnKSwgInNhdmVDaGFuZ2VzIjoga3coJ3NhdmVDaGFuZ2VzJyksCgkJCSJzZWFyY2giOiBrdygnc2VhcmNoJyksICJzbGlkZXIiOiBrdygnc2xpZGVyJyksCSJ0YWJzIjoga3coJ3RhYnMnKSwKCQkJInRhZyI6IGt3KCd0YWcnKSwgInRhZ2dpbmciOiBrdygndGFnZ2luZycpLAkidGFncyI6IGt3KCd0YWdzJyksCgkJCSJ0aWRkbGVyIjoga3coJ3RpZGRsZXInKSwgInRpbWVsaW5lIjoga3coJ3RpbWVsaW5lJyksCgkJCSJ0b2RheSI6IGt3KCd0b2RheScpLCAidmVyc2lvbiI6IGt3KCd2ZXJzaW9uJyksCSJvcHRpb24iOiBrdygnb3B0aW9uJyksCgoJCQkid2l0aCI6IGt3KCd3aXRoJyksCgkJCSJmaWx0ZXIiOiBrdygnZmlsdGVyJykKCQl9OwoJfSgpOwoKCXZhciBpc1NwYWNlTmFtZSA9IC9bXHdfXC1dL2ksCgkJcmVIUiA9IC9eXC1cLVwtXC0rJC8sCQkJCQkvLyA8aHI+CgkJcmVXaWtpQ29tbWVudFN0YXJ0ID0gL15cL1wqXCpcKiQvLAkJLy8gLyoqKgoJCXJlV2lraUNvbW1lbnRTdG9wID0gL15cKlwqXCpcLyQvLAkJLy8gKioqLwoJCXJlQmxvY2tRdW90ZSA9IC9ePDw8JC8sCgoJCXJlSnNDb2RlU3RhcnQgPSAvXlwvXC9ce1x7XHskLywJCQkvLyAvL3t7eyBqcyBibG9jayBzdGFydAoJCXJlSnNDb2RlU3RvcCA9IC9eXC9cL1x9XH1cfSQvLAkJCS8vIC8vfX19IGpzIHN0b3AKCQlyZVhtbENvZGVTdGFydCA9IC9ePCEtLVx7XHtcey0tPiQvLAkJLy8geG1sIGJsb2NrIHN0YXJ0CgkJcmVYbWxDb2RlU3RvcCA9IC9ePCEtLVx9XH1cfS0tPiQvLAkJLy8geG1sIHN0b3AKCgkJcmVDb2RlQmxvY2tTdGFydCA9IC9eXHtce1x7JC8sCQkJLy8ge3t7IFRXIHRleHQgZGl2IGJsb2NrIHN0YXJ0CgkJcmVDb2RlQmxvY2tTdG9wID0gL15cfVx9XH0kLywJCQkvLyB9fX0gVFcgdGV4dCBzdG9wCgoJCXJlVW50aWxDb2RlU3RvcCA9IC8uKj9cfVx9XH0vOwoKCWZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIGYpIHsKCQlzdGF0ZS50b2tlbml6ZSA9IGY7CgkJcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7Cgl9CgoJLy8gVXNlZCBhcyBzY3JhdGNoIHZhcmlhYmxlcyB0byBjb21tdW5pY2F0ZSBtdWx0aXBsZSB2YWx1ZXMgd2l0aG91dAoJLy8gY29uc2luZyB1cCB0b25zIG9mIG9iamVjdHMuCgl2YXIgdHlwZSwgY29udGVudDsKCglmdW5jdGlvbiByZXQodHAsIHN0eWxlLCBjb250KSB7CgkJdHlwZSA9IHRwOwoJCWNvbnRlbnQgPSBjb250OwoJCXJldHVybiBzdHlsZTsKCX0KCglmdW5jdGlvbiBqc1Rva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CgkJdmFyIHNvbCA9IHN0cmVhbS5zb2woKSwgY2g7CgkJCQoJCXN0YXRlLmJsb2NrID0gZmFsc2U7CS8vIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgYSBjb2RlIGJsb2NrLgoKCQljaCA9IHN0cmVhbS5wZWVrKCk7IAkvLyBkb24ndCBlYXQsIHRvIG1ha2UgbWF0Y2hpbmcgc2ltcGxlcgoJCQoJCS8vIGNoZWNrIHN0YXJ0IG9mICBibG9ja3MKCQlpZiAoc29sICYmIC9bPFwvXCp7fVwtXS8udGVzdChjaCkpIHsKCQkJaWYgKHN0cmVhbS5tYXRjaChyZUNvZGVCbG9ja1N0YXJ0KSkgewoJCQkJc3RhdGUuYmxvY2sgPSB0cnVlOwoJCQkJcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5Db2RlKTsKCQkJfQoJCQlpZiAoc3RyZWFtLm1hdGNoKHJlQmxvY2tRdW90ZSkpIHsKCQkJCXJldHVybiByZXQoJ3F1b3RlJywgJ3F1b3RlJyk7CgkJCX0KCQkJaWYgKHN0cmVhbS5tYXRjaChyZVdpa2lDb21tZW50U3RhcnQpIHx8IHN0cmVhbS5tYXRjaChyZVdpa2lDb21tZW50U3RvcCkpIHsKCQkJCXJldHVybiByZXQoJ2NvZGUnLCAnY29tbWVudCcpOwoJCQl9CgkJCWlmIChzdHJlYW0ubWF0Y2gocmVKc0NvZGVTdGFydCkgfHwgc3RyZWFtLm1hdGNoKHJlSnNDb2RlU3RvcCkgfHwgc3RyZWFtLm1hdGNoKHJlWG1sQ29kZVN0YXJ0KSB8fCBzdHJlYW0ubWF0Y2gocmVYbWxDb2RlU3RvcCkpIHsKCQkJCXJldHVybiByZXQoJ2NvZGUnLCAnY29tbWVudCcpOwoJCQl9CgkJCWlmIChzdHJlYW0ubWF0Y2gocmVIUikpIHsKCQkJCXJldHVybiByZXQoJ2hyJywgJ2hyJyk7CgkJCX0KCQl9IC8vIHNvbAoJCWNoID0gc3RyZWFtLm5leHQoKTsKCgkJaWYgKHNvbCAmJiAvW1wvXCohIzs6PnxdLy50ZXN0KGNoKSkgewoJCQlpZiAoY2ggPT0gIiEiKSB7IC8vIHR3IGhlYWRlcgoJCQkJc3RyZWFtLnNraXBUb0VuZCgpOwoJCQkJcmV0dXJuIHJldCgiaGVhZGVyIiwgImhlYWRlciIpOwoJCQl9CgkJCWlmIChjaCA9PSAiKiIpIHsgLy8gdHcgbGlzdAoJCQkJc3RyZWFtLmVhdFdoaWxlKCcqJyk7CgkJCQlyZXR1cm4gcmV0KCJsaXN0IiwgImNvbW1lbnQiKTsKCQkJfQoJCQlpZiAoY2ggPT0gIiMiKSB7IC8vIHR3IG51bWJlcmVkIGxpc3QKCQkJCXN0cmVhbS5lYXRXaGlsZSgnIycpOwoJCQkJcmV0dXJuIHJldCgibGlzdCIsICJjb21tZW50Iik7CgkJCX0KCQkJaWYgKGNoID09ICI7IikgeyAvLyBkZWZpbml0aW9uIGxpc3QsIHRlcm0KCQkJCXN0cmVhbS5lYXRXaGlsZSgnOycpOwoJCQkJcmV0dXJuIHJldCgibGlzdCIsICJjb21tZW50Iik7CgkJCX0KCQkJaWYgKGNoID09ICI6IikgeyAvLyBkZWZpbml0aW9uIGxpc3QsIGRlc2NyaXB0aW9uCgkJCQlzdHJlYW0uZWF0V2hpbGUoJzonKTsKCQkJCXJldHVybiByZXQoImxpc3QiLCAiY29tbWVudCIpOwoJCQl9CgkJCWlmIChjaCA9PSAiPiIpIHsgLy8gc2luZ2xlIGxpbmUgcXVvdGUKCQkJCXN0cmVhbS5lYXRXaGlsZSgiPiIpOwoJCQkJcmV0dXJuIHJldCgicXVvdGUiLCAicXVvdGUiKTsKCQkJfQoJCQlpZiAoY2ggPT0gJ3wnKSB7CgkJCQlyZXR1cm4gcmV0KCd0YWJsZScsICdoZWFkZXInKTsKCQkJfQoJCX0KCgkJaWYgKGNoID09ICd7JyAmJiBzdHJlYW0ubWF0Y2goL1x7XHsvKSkgewoJCQlyZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdHdUb2tlbkNvZGUpOwoJCX0KCgkJLy8gcnVkaW1lbnRhcnkgaHRtbDovLyBmaWxlOi8vIGxpbmsgbWF0Y2hpbmcuIFRXIGtub3dzIG11Y2ggbW9yZSAuLi4KCQlpZiAoL1toZl0vaS50ZXN0KGNoKSkgewoJCQlpZiAoL1t0aV0vaS50ZXN0KHN0cmVhbS5wZWVrKCkpICYmIHN0cmVhbS5tYXRjaCgvXGIodHRwcz98dHB8aWxlKTpcL1wvW1wtQS1aMC05KyZAI1wvJT89fl98JCE6LC47XSpbQS1aMC05KyZAI1wvJT1+X3wkXS9pKSkgewoJCQkJcmV0dXJuIHJldCgibGluayIsICJsaW5rIik7CgkJCX0KCQl9CgkJLy8ganVzdCBhIGxpdHRsZSBzdHJpbmcgaW5kaWNhdG9yLCBkb24ndCB3YW50IHRvIGhhdmUgdGhlIHdob2xlIHN0cmluZyBjb3ZlcmVkCgkJaWYgKGNoID09ICciJykgewoJCQlyZXR1cm4gcmV0KCdzdHJpbmcnLCAnc3RyaW5nJyk7CgkJfQoJCWlmIChjaCA9PSAnficpIHsJLy8gX25vXyBDYW1lbENhc2UgaW5kaWNhdG9yIHNob3VsZCBiZSBib2xkCgkJCXJldHVybiByZXQoJ3RleHQnLCAnYnJhY2UnKTsKCQl9CgkJaWYgKC9bXFtcXV0vLnRlc3QoY2gpKSB7IC8vIGNoZWNrIGZvciBbWy4uXV0KCQkJaWYgKHN0cmVhbS5wZWVrKCkgPT0gY2gpIHsKCQkJCXN0cmVhbS5uZXh0KCk7CgkJCQlyZXR1cm4gcmV0KCdicmFjZScsICdicmFjZScpOwoJCQl9CgkJfQoJCWlmIChjaCA9PSAiQCIpIHsJLy8gY2hlY2sgZm9yIHNwYWNlIGxpbmsuIFRPRE8gZml4IEBALi4uQEAgaGlnaGxpZ2h0aW5nCgkJCXN0cmVhbS5lYXRXaGlsZShpc1NwYWNlTmFtZSk7CgkJCXJldHVybiByZXQoImxpbmsiLCAibGluayIpOwoJCX0KCQlpZiAoL1xkLy50ZXN0KGNoKSkgewkvLyBudW1iZXJzCgkJCXN0cmVhbS5lYXRXaGlsZSgvXGQvKTsKCQkJcmV0dXJuIHJldCgibnVtYmVyIiwgIm51bWJlciIpOwoJCX0KCQlpZiAoY2ggPT0gIi8iKSB7IC8vIHR3IGludmlzaWJsZSBjb21tZW50CgkJCWlmIChzdHJlYW0uZWF0KCIlIikpIHsKCQkJCXJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0d1Rva2VuQ29tbWVudCk7CgkJCX0KCQkJZWxzZSBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7IC8vIAoJCQkJcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5FbSk7CgkJCX0KCQl9CgkJaWYgKGNoID09ICJfIikgeyAvLyB0dyB1bmRlcmxpbmUKCQkJaWYgKHN0cmVhbS5lYXQoIl8iKSkgewoJCQkJcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5VbmRlcmxpbmUpOwoJCQl9CgkJfQoJCS8vIHN0cmlrZXRocm91Z2ggYW5kIG1kYXNoIGhhbmRsaW5nCgkJaWYgKGNoID09ICItIikgewoJCQlpZiAoc3RyZWFtLmVhdCgiLSIpKSB7CgkJCQkvLyBpZiBzdHJpa2V0aHJvdWdoIGxvb2tzIHVnbHksIGNoYW5nZSBDU1MuCgkJCQlpZiAoc3RyZWFtLnBlZWsoKSAhPSAnICcpCgkJCQkJcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5TdHJpa2UpOwoJCQkJLy8gbWRhc2gKCQkJCWlmIChzdHJlYW0ucGVlaygpID09ICcgJykKCQkJCQlyZXR1cm4gcmV0KCd0ZXh0JywgJ2JyYWNlJyk7CgkJCX0KCQl9CgkJaWYgKGNoID09ICInIikgeyAvLyB0dyBib2xkCgkJCWlmIChzdHJlYW0uZWF0KCInIikpIHsKCQkJCXJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0d1Rva2VuU3Ryb25nKTsKCQkJfQoJCX0KCQlpZiAoY2ggPT0gIjwiKSB7IC8vIHR3IG1hY3JvCgkJCWlmIChzdHJlYW0uZWF0KCI8IikpIHsKCQkJCXJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0d1Rva2VuTWFjcm8pOwoJCQl9CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gcmV0KGNoKTsKCQl9CgoJCS8vIGNvcmUgbWFjcm8gaGFuZGxpbmcKCQlzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKCQl2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCksCgkJCWtub3duID0gdGV4dHdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIHRleHR3b3Jkc1t3b3JkXTsKCgkJcmV0dXJuIGtub3duID8gcmV0KGtub3duLnR5cGUsIGtub3duLnN0eWxlLCB3b3JkKSA6IHJldCgidGV4dCIsIG51bGwsIHdvcmQpOwoKCX0gLy8ganNUb2tlbkJhc2UoKQoKCS8vIHR3IGludmlzaWJsZSBjb21tZW50CglmdW5jdGlvbiB0d1Rva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CgkJdmFyIG1heWJlRW5kID0gZmFsc2UsCgkJCWNoOwoJCXdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKCQkJaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewoJCQkJc3RhdGUudG9rZW5pemUgPSBqc1Rva2VuQmFzZTsKCQkJCWJyZWFrOwoJCQl9CgkJCW1heWJlRW5kID0gKGNoID09ICIlIik7CgkJfQoJCXJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwoJfQoKCS8vIHR3IHN0cm9uZyAvIGJvbGQKCWZ1bmN0aW9uIHR3VG9rZW5TdHJvbmcoc3RyZWFtLCBzdGF0ZSkgewoJCXZhciBtYXliZUVuZCA9IGZhbHNlLAoJCQljaDsKCQl3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CgkJCWlmIChjaCA9PSAiJyIgJiYgbWF5YmVFbmQpIHsKCQkJCXN0YXRlLnRva2VuaXplID0ganNUb2tlbkJhc2U7CgkJCQlicmVhazsKCQkJfQoJCQltYXliZUVuZCA9IChjaCA9PSAiJyIpOwoJCX0KCQlyZXR1cm4gcmV0KCJ0ZXh0IiwgInN0cm9uZyIpOwoJfQoKCS8vIHR3IGNvZGUKCWZ1bmN0aW9uIHR3VG9rZW5Db2RlKHN0cmVhbSwgc3RhdGUpIHsKCQl2YXIgY2gsIHNiID0gc3RhdGUuYmxvY2s7CgkJCgkJaWYgKHNiICYmIHN0cmVhbS5jdXJyZW50KCkpIHsKCQkJcmV0dXJuIHJldCgiY29kZSIsICJjb21tZW50Iik7CgkJfQoKCQlpZiAoIXNiICYmIHN0cmVhbS5tYXRjaChyZVVudGlsQ29kZVN0b3ApKSB7CgkJCXN0YXRlLnRva2VuaXplID0ganNUb2tlbkJhc2U7CgkJCXJldHVybiByZXQoImNvZGUiLCAiY29tbWVudCIpOwoJCX0KCgkJaWYgKHNiICYmIHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2gocmVDb2RlQmxvY2tTdG9wKSkgewoJCQlzdGF0ZS50b2tlbml6ZSA9IGpzVG9rZW5CYXNlOwoJCQlyZXR1cm4gcmV0KCJjb2RlIiwgImNvbW1lbnQiKTsKCQl9CgoJCWNoID0gc3RyZWFtLm5leHQoKTsKCQlyZXR1cm4gKHNiKSA/IHJldCgiY29kZSIsICJjb21tZW50IikgOiByZXQoImNvZGUiLCAiY29tbWVudCIpOwoJfQoKCS8vIHR3IGVtIC8gaXRhbGljCglmdW5jdGlvbiB0d1Rva2VuRW0oc3RyZWFtLCBzdGF0ZSkgewoJCXZhciBtYXliZUVuZCA9IGZhbHNlLAoJCQljaDsKCQl3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CgkJCWlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKCQkJCXN0YXRlLnRva2VuaXplID0ganNUb2tlbkJhc2U7CgkJCQlicmVhazsKCQkJfQoJCQltYXliZUVuZCA9IChjaCA9PSAiLyIpOwoJCX0KCQlyZXR1cm4gcmV0KCJ0ZXh0IiwgImVtIik7Cgl9CgoJLy8gdHcgdW5kZXJsaW5lZCB0ZXh0CglmdW5jdGlvbiB0d1Rva2VuVW5kZXJsaW5lKHN0cmVhbSwgc3RhdGUpIHsKCQl2YXIgbWF5YmVFbmQgPSBmYWxzZSwKCQkJY2g7CgkJd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewoJCQlpZiAoY2ggPT0gIl8iICYmIG1heWJlRW5kKSB7CgkJCQlzdGF0ZS50b2tlbml6ZSA9IGpzVG9rZW5CYXNlOwoJCQkJYnJlYWs7CgkJCX0KCQkJbWF5YmVFbmQgPSAoY2ggPT0gIl8iKTsKCQl9CgkJcmV0dXJuIHJldCgidGV4dCIsICJ1bmRlcmxpbmVkIik7Cgl9CgoJLy8gdHcgc3RyaWtlIHRocm91Z2ggdGV4dCBsb29rcyB1Z2x5CgkvLyBjaGFuZ2UgQ1NTIGlmIG5lZWRlZAoJZnVuY3Rpb24gdHdUb2tlblN0cmlrZShzdHJlYW0sIHN0YXRlKSB7CgkJdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwoJCQkKCQl3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CgkJCWlmIChjaCA9PSAiLSIgJiYgbWF5YmVFbmQpIHsKCQkJCXN0YXRlLnRva2VuaXplID0ganNUb2tlbkJhc2U7CgkJCQlicmVhazsKCQkJfQoJCQltYXliZUVuZCA9IChjaCA9PSAiLSIpOwoJCX0KCQlyZXR1cm4gcmV0KCJ0ZXh0IiwgInN0cmlrZXRocm91Z2giKTsKCX0KCgkvLyBtYWNybwoJZnVuY3Rpb24gdHdUb2tlbk1hY3JvKHN0cmVhbSwgc3RhdGUpIHsKCQl2YXIgY2gsIHdvcmQsIGtub3duOwoKCQlpZiAoc3RyZWFtLmN1cnJlbnQoKSA9PSAnPDwnKSB7CgkJCXJldHVybiByZXQoJ2JyYWNlJywgJ21hY3JvJyk7CgkJfQoKCQljaCA9IHN0cmVhbS5uZXh0KCk7CgkJaWYgKCFjaCkgewoJCQlzdGF0ZS50b2tlbml6ZSA9IGpzVG9rZW5CYXNlOwoJCQlyZXR1cm4gcmV0KGNoKTsKCQl9CgkJaWYgKGNoID09ICI+IikgewoJCQlpZiAoc3RyZWFtLnBlZWsoKSA9PSAnPicpIHsKCQkJCXN0cmVhbS5uZXh0KCk7CgkJCQlzdGF0ZS50b2tlbml6ZSA9IGpzVG9rZW5CYXNlOwoJCQkJcmV0dXJuIHJldCgiYnJhY2UiLCAibWFjcm8iKTsKCQkJfQoJCX0KCgkJc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CgkJd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CgkJa25vd24gPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJiBrZXl3b3Jkc1t3b3JkXTsKCgkJaWYgKGtub3duKSB7CgkJCXJldHVybiByZXQoa25vd24udHlwZSwga25vd24uc3R5bGUsIHdvcmQpOwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuIHJldCgibWFjcm8iLCBudWxsLCB3b3JkKTsKCQl9Cgl9CgoJLy8gSW50ZXJmYWNlCglyZXR1cm4gewoJCXN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIHsKCQkJCXRva2VuaXplOiBqc1Rva2VuQmFzZSwKCQkJCWluZGVudGVkOiAwLAoJCQkJbGV2ZWw6IDAKCQkJfTsKCQl9LAoKCQl0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKCQkJaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKCQkJdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CgkJCXJldHVybiBzdHlsZTsKCQl9LAoKCQllbGVjdHJpY0NoYXJzOiAiIgoJfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC10aWRkbHl3aWtpIiwgInRpZGRseXdpa2kiKTsKLy99fX0K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/tiki/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/tiki/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFRpa2kgd2lraSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idGlraS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRpa2kuY3NzIj4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgogICAgPGgxPkNvZGVNaXJyb3I6IFRpa2kgd2lraSBtb2RlPC9oMT4KCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KSGVhZGluZ3MKIUhlYWRlciAxCiEhSGVhZGVyIDIKISEhSGVhZGVyIDMKISEhIUhlYWRlciA0CiEhISEhSGVhZGVyIDUKISEhISEhSGVhZGVyIDYKClN0eWxpbmcKLT10aXRsZWJhcj0tCl5eIEJveCBvbiBtdWx0aQpsaW5lcwpvZiBjb250ZW50Xl4KX19ib2xkX18KJydpdGFsaWMnJwo9PT11bmRlcmxpbmU9PT0KOjpjZW50ZXI6OgotLUxpbmUgVGhyb3VnaC0tCgpPcGVyYXRvcnMKfm5wfk5vIHBhcnNlfi9ucH4KCkxpbmsKW2xpbmt8ZGVzY3xub2NhY2hlXQoKV2lraQooKFdpa2kpKQooKFdpa2l8ZGVzYykpCigoV2lraXxkZXNjfHRpbWVvdXQpKQoKVGFibGUKfHxyb3cxIGNvbDF8cm93MSBjb2wyfHJvdzEgY29sMwpyb3cyIGNvbDF8cm93MiBjb2wyfHJvdzIgY29sMwpyb3czIGNvbDF8cm93MyBjb2wyfHJvdzMgY29sM3x8CgpMaXN0czoKKmJsYQoqKmJsYS0xCisrY29udGludWUtYmxhLTEKKioqYmxhLTIKKytjb250aW51ZS1ibGEtMQoqYmxhCitjb250aW51ZS1ibGEKI2JsYQoqKiB0cmEtbGEtbGEKK2NvbnRpbnVlLWJsYQojYmxhCgpQbHVnaW4gKHN0YW5kYXJkKToKe1BMVUdJTihhdHRyPSJteSBhdHRyIil9ClBsdWdpbiBCb2R5CntQTFVHSU59CgpQbHVnaW4gKGlubGluZSk6CntwbHVnaW4gYXR0cj0ibXkgYXR0ciJ9CjwvdGV4dGFyZWE+PC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cgl2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICd0aWtpJywgICAgICAKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgfSk7Cjwvc2NyaXB0PgoKPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/tiki/tiki.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXR3LXN5bnRheGVycm9yIHsKCWNvbG9yOiAjRkZGRkZGOwoJYmFja2dyb3VuZC1jb2xvcjogIzk5MDAwMDsKfQoKLmNtLXR3LWRlbGV0ZWQgewoJdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Cn0KCi5jbS10dy1oZWFkZXI1IHsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5jbS10dy1saXN0aXRlbTpmaXJzdC1jaGlsZCB7IC8qQWRkZWQgZmlyc3QgY2hpbGQgdG8gZml4IGR1cGxpY2F0ZSBwYWRkaW5nIHdoZW4gaGlnaGxpZ2h0aW5nKi8KCXBhZGRpbmctbGVmdDogMTBweDsKfQoKLmNtLXR3LWJveCB7Cglib3JkZXItdG9wLXdpZHRoOiAwcHggISBpbXBvcnRhbnQ7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHg7Cglib3JkZXItY29sb3I6IGluaGVyaXQ7Cn0KCi5jbS10dy11bmRlcmxpbmUgewoJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/tiki/tiki.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCd0aWtpJywgZnVuY3Rpb24oY29uZmlnKSB7CglmdW5jdGlvbiBpbkJsb2NrKHN0eWxlLCB0ZXJtaW5hdG9yLCByZXR1cm5Ub2tlbml6ZXIpIHsKCQlyZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewoJCQl3aGlsZSAoIXN0cmVhbS5lb2woKSkgewoJCQkJaWYgKHN0cmVhbS5tYXRjaCh0ZXJtaW5hdG9yKSkgewoJCQkJCXN0YXRlLnRva2VuaXplID0gaW5UZXh0OwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJc3RyZWFtLm5leHQoKTsKCQkJfQoJCQkKCQkJaWYgKHJldHVyblRva2VuaXplcikgc3RhdGUudG9rZW5pemUgPSByZXR1cm5Ub2tlbml6ZXI7CgkJCQoJCQlyZXR1cm4gc3R5bGU7CgkJfTsKCX0KCQoJZnVuY3Rpb24gaW5MaW5lKHN0eWxlKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKCQkJd2hpbGUoIXN0cmVhbS5lb2woKSkgewoJCQkJc3RyZWFtLm5leHQoKTsKCQkJfQoJCQlzdGF0ZS50b2tlbml6ZSA9IGluVGV4dDsKCQkJcmV0dXJuIHN0eWxlOwoJCX07Cgl9CgkKCWZ1bmN0aW9uIGluVGV4dChzdHJlYW0sIHN0YXRlKSB7CgkJZnVuY3Rpb24gY2hhaW4ocGFyc2VyKSB7CgkJCXN0YXRlLnRva2VuaXplID0gcGFyc2VyOwoJCQlyZXR1cm4gcGFyc2VyKHN0cmVhbSwgc3RhdGUpOwoJCX0KCQkKCQl2YXIgc29sID0gc3RyZWFtLnNvbCgpOwoJCXZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgkJCgkJLy9ub24gc3RhcnQgb2YgbGluZQoJCXN3aXRjaCAoY2gpIHsgLy9zd2l0Y2ggaXMgZ2VuZXJhbGx5IG11Y2ggZmFzdGVyIHRoYW4gaWYsIHNvIGl0IGlzIHVzZWQgaGVyZQoJCQljYXNlICJ7IjogLy9wbHVnaW4KCQkJCXN0cmVhbS5lYXQoIi8iKTsKCQkJCXN0cmVhbS5lYXRTcGFjZSgpOwoJCQkJdmFyIHRhZ05hbWUgPSAiIjsKCQkJCXZhciBjOwoJCQkJd2hpbGUgKChjID0gc3RyZWFtLmVhdCgvW15cc1x1MDBhMD1cIlwnXC8/KH1dLykpKSB0YWdOYW1lICs9IGM7CgkJCQlzdGF0ZS50b2tlbml6ZSA9IGluUGx1Z2luOwoJCQkJcmV0dXJuICJ0YWciOwoJCQkJYnJlYWs7CgkJCWNhc2UgIl8iOiAvL2JvbGQKCQkJCWlmIChzdHJlYW0uZWF0KCJfIikpIHsKCQkJCQlyZXR1cm4gY2hhaW4oaW5CbG9jaygic3Ryb25nIiwgIl9fIiwgaW5UZXh0KSk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAiJyI6IC8vaXRhbGljcwoJCQkJaWYgKHN0cmVhbS5lYXQoIiciKSkgewoJCQkJCS8vIEl0YWxpYyB0ZXh0CgkJCQkJcmV0dXJuIGNoYWluKGluQmxvY2soImVtIiwgIicnIiwgaW5UZXh0KSk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAiKCI6Ly8gV2lraSBMaW5rCgkJCQlpZiAoc3RyZWFtLmVhdCgiKCIpKSB7CgkJCQkJcmV0dXJuIGNoYWluKGluQmxvY2soInZhcmlhYmxlLTIiLCAiKSkiLCBpblRleHQpKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlICJbIjovLyBXZWJsaW5rCgkJCQlyZXR1cm4gY2hhaW4oaW5CbG9jaygidmFyaWFibGUtMyIsICJdIiwgaW5UZXh0KSk7CgkJCQlicmVhazsKCQkJY2FzZSAifCI6IC8vdGFibGUKCQkJCWlmIChzdHJlYW0uZWF0KCJ8IikpIHsKCQkJCQlyZXR1cm4gY2hhaW4oaW5CbG9jaygiY29tbWVudCIsICJ8fCIpKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlICItIjogCgkJCQlpZiAoc3RyZWFtLmVhdCgiPSIpKSB7Ly90aXRsZUJhcgoJCQkJCXJldHVybiBjaGFpbihpbkJsb2NrKCJoZWFkZXIgc3RyaW5nIiwgIj0tIiwgaW5UZXh0KSk7CgkJCQl9IGVsc2UgaWYgKHN0cmVhbS5lYXQoIi0iKSkgey8vZGVsZXRlZAoJCQkJCXJldHVybiBjaGFpbihpbkJsb2NrKCJlcnJvciB0dy1kZWxldGVkIiwgIi0tIiwgaW5UZXh0KSk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAiPSI6IC8vdW5kZXJsaW5lCgkJCQlpZiAoc3RyZWFtLm1hdGNoKCI9PSIpKSB7CgkJCQkJcmV0dXJuIGNoYWluKGluQmxvY2soInR3LXVuZGVybGluZSIsICI9PT0iLCBpblRleHQpKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlICI6IjoKCQkJCWlmIChzdHJlYW0uZWF0KCI6IikpIHsKCQkJCQlyZXR1cm4gY2hhaW4oaW5CbG9jaygiY29tbWVudCIsICI6OiIpKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlICJeIjogLy9ib3gKCQkJCXJldHVybiBjaGFpbihpbkJsb2NrKCJ0dy1ib3giLCAiXiIpKTsKCQkJCWJyZWFrOwoJCQljYXNlICJ+IjogLy9ucAoJCQkJaWYgKHN0cmVhbS5tYXRjaCgibnB+IikpIHsKCQkJCQlyZXR1cm4gY2hhaW4oaW5CbG9jaygibWV0YSIsICJ+L25wfiIpKTsKCQkJCX0KCQkJCWJyZWFrOwoJCX0KCQkKCQkvL3N0YXJ0IG9mIGxpbmUgdHlwZXMKCQlpZiAoc29sKSB7CgkJCXN3aXRjaCAoY2gpIHsKCQkJCWNhc2UgIiEiOiAvL2hlYWRlciBhdCBzdGFydCBvZiBsaW5lCgkJCQkJaWYgKHN0cmVhbS5tYXRjaCgnISEhISEnKSkgewoJCQkJCQlyZXR1cm4gY2hhaW4oaW5MaW5lKCJoZWFkZXIgc3RyaW5nIikpOwoJCQkJCX0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKCchISEhJykpIHsKCQkJCQkJcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKCQkJCQl9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgnISEhJykpIHsKCQkJCQkJcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKCQkJCQl9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgnISEnKSkgewoJCQkJCQlyZXR1cm4gY2hhaW4oaW5MaW5lKCJoZWFkZXIgc3RyaW5nIikpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiBjaGFpbihpbkxpbmUoImhlYWRlciBzdHJpbmciKSk7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAiKiI6IC8vdW5vcmRlcmVkIGxpc3QgbGluZSBpdGVtLCBvciA8bGkgLz4gYXQgc3RhcnQgb2YgbGluZQoJCQkJY2FzZSAiIyI6IC8vb3JkZXJlZCBsaXN0IGxpbmUgaXRlbSwgb3IgPGxpIC8+IGF0IHN0YXJ0IG9mIGxpbmUKCQkJCWNhc2UgIisiOiAvL29yZGVyZWQgbGlzdCBsaW5lIGl0ZW0sIG9yIDxsaSAvPiBhdCBzdGFydCBvZiBsaW5lCgkJCQkJcmV0dXJuIGNoYWluKGluTGluZSgidHctbGlzdGl0ZW0gYnJhY2tldCIpKTsKCQkJCQlicmVhazsKCQkJfQoJCX0KCQkKCQkvL3N0cmVhbS5lYXRXaGlsZSgvWyZ7XS8pOyB3YXMgZWF0aW5nIHVwIHBsdWdpbnMsIHR1cm5lZCBvZmYgdG8gYWN0IGxlc3MgbGlrZSBodG1sIGFuZCBtb3JlIGxpa2UgdGlraQoJCXJldHVybiBudWxsOwoJfQoJCgl2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwoKCS8vIFJldHVybiB2YXJpYWJsZXMgZm9yIHRva2VuaXplcnMKCXZhciBwbHVnaW5OYW1lLCB0eXBlOwoJZnVuY3Rpb24gaW5QbHVnaW4oc3RyZWFtLCBzdGF0ZSkgewoJCXZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgkJdmFyIHBlZWsgPSBzdHJlYW0ucGVlaygpOwoJCQoJCWlmIChjaCA9PSAifSIpIHsKCQkJc3RhdGUudG9rZW5pemUgPSBpblRleHQ7CgkJCS8vdHlwZSA9IGNoID09ICIpIiA/ICJlbmRQbHVnaW4iIDogInNlbGZjbG9zZVBsdWdpbiI7IGluUGx1Z2luCgkJCXJldHVybiAidGFnIjsKCQl9IGVsc2UgaWYgKGNoID09ICIoIiB8fCBjaCA9PSAiKSIpIHsKCQkJcmV0dXJuICJicmFja2V0IjsKCQl9IGVsc2UgaWYgKGNoID09ICI9IikgewoJCQl0eXBlID0gImVxdWFscyI7CgkJCQoJCQlpZiAocGVlayA9PSAiPiIpIHsKCQkJCWNoID0gc3RyZWFtLm5leHQoKTsKCQkJCXBlZWsgPSBzdHJlYW0ucGVlaygpOwoJCQl9CgkJCQoJCQkvL2hlcmUgd2UgZGV0ZWN0IHZhbHVlcyBkaXJlY3RseSBhZnRlciBlcXVhbCBjaGFyYWN0ZXIgd2l0aCBubyBxdW90ZXMKCQkJaWYgKCEvW1wnXCJdLy50ZXN0KHBlZWspKSB7CgkJCQlzdGF0ZS50b2tlbml6ZSA9IGluQXR0cmlidXRlTm9RdW90ZSgpOwoJCQl9CgkJCS8vZW5kIGRldGVjdCB2YWx1ZXMKCQkJCgkJCXJldHVybiAib3BlcmF0b3IiOwoJCX0gZWxzZSBpZiAoL1tcJ1wiXS8udGVzdChjaCkpIHsKCQkJc3RhdGUudG9rZW5pemUgPSBpbkF0dHJpYnV0ZShjaCk7CgkJCXJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKCQl9IGVsc2UgewoJCQlzdHJlYW0uZWF0V2hpbGUoL1teXHNcdTAwYTA9XCJcJ1wvP10vKTsKCQkJcmV0dXJuICJrZXl3b3JkIjsKCQl9Cgl9CgoJZnVuY3Rpb24gaW5BdHRyaWJ1dGUocXVvdGUpIHsKCQlyZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewoJCQl3aGlsZSAoIXN0cmVhbS5lb2woKSkgewoJCQkJaWYgKHN0cmVhbS5uZXh0KCkgPT0gcXVvdGUpIHsKCQkJCQlzdGF0ZS50b2tlbml6ZSA9IGluUGx1Z2luOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCXJldHVybiAic3RyaW5nIjsKCQl9OwoJfQoJCglmdW5jdGlvbiBpbkF0dHJpYnV0ZU5vUXVvdGUoKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKCQkJd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKCQkJCXZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgkJCQl2YXIgcGVlayA9IHN0cmVhbS5wZWVrKCk7CgkJCQlpZiAoY2ggPT0gIiAiIHx8IGNoID09ICIsIiB8fCAvWyApfV0vLnRlc3QocGVlaykpIHsKCQkJCQlzdGF0ZS50b2tlbml6ZSA9IGluUGx1Z2luOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCXJldHVybiAic3RyaW5nIjsKCQl9OwoJfQoKCXZhciBjdXJTdGF0ZSwgc2V0U3R5bGU7CglmdW5jdGlvbiBwYXNzKCkgewoJCWZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGN1clN0YXRlLmNjLnB1c2goYXJndW1lbnRzW2ldKTsKCX0KCQoJZnVuY3Rpb24gY29udCgpIHsKCQlwYXNzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CgkJcmV0dXJuIHRydWU7Cgl9CgoJZnVuY3Rpb24gcHVzaENvbnRleHQocGx1Z2luTmFtZSwgc3RhcnRPZkxpbmUpIHsKCQl2YXIgbm9JbmRlbnQgPSBjdXJTdGF0ZS5jb250ZXh0ICYmIGN1clN0YXRlLmNvbnRleHQubm9JbmRlbnQ7CgkJY3VyU3RhdGUuY29udGV4dCA9IHsKCQkJcHJldjogY3VyU3RhdGUuY29udGV4dCwKCQkJcGx1Z2luTmFtZTogcGx1Z2luTmFtZSwKCQkJaW5kZW50OiBjdXJTdGF0ZS5pbmRlbnRlZCwKCQkJc3RhcnRPZkxpbmU6IHN0YXJ0T2ZMaW5lLAoJCQlub0luZGVudDogbm9JbmRlbnQKCQl9OwoJfQoJCglmdW5jdGlvbiBwb3BDb250ZXh0KCkgewoJCWlmIChjdXJTdGF0ZS5jb250ZXh0KSBjdXJTdGF0ZS5jb250ZXh0ID0gY3VyU3RhdGUuY29udGV4dC5wcmV2OwoJfQoKCWZ1bmN0aW9uIGVsZW1lbnQodHlwZSkgewoJCWlmICh0eXBlID09ICJvcGVuUGx1Z2luIikge2N1clN0YXRlLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lOyByZXR1cm4gY29udChhdHRyaWJ1dGVzLCBlbmRwbHVnaW4oY3VyU3RhdGUuc3RhcnRPZkxpbmUpKTt9CgkJZWxzZSBpZiAodHlwZSA9PSAiY2xvc2VQbHVnaW4iKSB7CgkJCXZhciBlcnIgPSBmYWxzZTsKCQkJaWYgKGN1clN0YXRlLmNvbnRleHQpIHsKCQkJCWVyciA9IGN1clN0YXRlLmNvbnRleHQucGx1Z2luTmFtZSAhPSBwbHVnaW5OYW1lOwoJCQkJcG9wQ29udGV4dCgpOwoJCQl9IGVsc2UgewoJCQkJZXJyID0gdHJ1ZTsKCQkJfQoJCQlpZiAoZXJyKSBzZXRTdHlsZSA9ICJlcnJvciI7CgkJCXJldHVybiBjb250KGVuZGNsb3NlcGx1Z2luKGVycikpOwoJCX0KCQllbHNlIGlmICh0eXBlID09ICJzdHJpbmciKSB7CgkJCWlmICghY3VyU3RhdGUuY29udGV4dCB8fCBjdXJTdGF0ZS5jb250ZXh0Lm5hbWUgIT0gIiFjZGF0YSIpIHB1c2hDb250ZXh0KCIhY2RhdGEiKTsKCQkJaWYgKGN1clN0YXRlLnRva2VuaXplID09IGluVGV4dCkgcG9wQ29udGV4dCgpOwoJCQlyZXR1cm4gY29udCgpOwoJCX0KCQllbHNlIHJldHVybiBjb250KCk7Cgl9CgkKCWZ1bmN0aW9uIGVuZHBsdWdpbihzdGFydE9mTGluZSkgewoJCXJldHVybiBmdW5jdGlvbih0eXBlKSB7CgkJCWlmICgKCQkJdHlwZSA9PSAic2VsZmNsb3NlUGx1Z2luIiB8fAoJCQl0eXBlID09ICJlbmRQbHVnaW4iCgkJKQoJCQkJcmV0dXJuIGNvbnQoKTsKCQkJaWYgKHR5cGUgPT0gImVuZFBsdWdpbiIpIHtwdXNoQ29udGV4dChjdXJTdGF0ZS5wbHVnaW5OYW1lLCBzdGFydE9mTGluZSk7IHJldHVybiBjb250KCk7fQoJCQlyZXR1cm4gY29udCgpOwoJCX07Cgl9CgkKCWZ1bmN0aW9uIGVuZGNsb3NlcGx1Z2luKGVycikgewoJCXJldHVybiBmdW5jdGlvbih0eXBlKSB7CgkJCWlmIChlcnIpIHNldFN0eWxlID0gImVycm9yIjsKCQkJaWYgKHR5cGUgPT0gImVuZFBsdWdpbiIpIHJldHVybiBjb250KCk7CgkJCXJldHVybiBwYXNzKCk7CgkJfTsKCX0KCglmdW5jdGlvbiBhdHRyaWJ1dGVzKHR5cGUpIHsKCQlpZiAodHlwZSA9PSAia2V5d29yZCIpIHtzZXRTdHlsZSA9ICJhdHRyaWJ1dGUiOyByZXR1cm4gY29udChhdHRyaWJ1dGVzKTt9CgkJaWYgKHR5cGUgPT0gImVxdWFscyIpIHJldHVybiBjb250KGF0dHZhbHVlLCBhdHRyaWJ1dGVzKTsKCQlyZXR1cm4gcGFzcygpOwoJfQoJZnVuY3Rpb24gYXR0dmFsdWUodHlwZSkgewoJCWlmICh0eXBlID09ICJrZXl3b3JkIikge3NldFN0eWxlID0gInN0cmluZyI7IHJldHVybiBjb250KCk7fQoJCWlmICh0eXBlID09ICJzdHJpbmciKSByZXR1cm4gY29udChhdHR2YWx1ZW1heWJlKTsKCQkJcmV0dXJuIHBhc3MoKTsKCX0KCWZ1bmN0aW9uIGF0dHZhbHVlbWF5YmUodHlwZSkgewoJCWlmICh0eXBlID09ICJzdHJpbmciKSByZXR1cm4gY29udChhdHR2YWx1ZW1heWJlKTsKCQllbHNlIHJldHVybiBwYXNzKCk7Cgl9CglyZXR1cm4gewoJCXN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4ge3Rva2VuaXplOiBpblRleHQsIGNjOiBbXSwgaW5kZW50ZWQ6IDAsIHN0YXJ0T2ZMaW5lOiB0cnVlLCBwbHVnaW5OYW1lOiBudWxsLCBjb250ZXh0OiBudWxsfTsKCQl9LAoJCXRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CgkJCWlmIChzdHJlYW0uc29sKCkpIHsKCQkJCXN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKCQkJCXN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CgkJCX0KCQkJaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKCgkJCXNldFN0eWxlID0gdHlwZSA9IHBsdWdpbk5hbWUgPSBudWxsOwoJCQl2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKCQkJCWlmICgoc3R5bGUgfHwgdHlwZSkgJiYgc3R5bGUgIT0gImNvbW1lbnQiKSB7CgkJCQljdXJTdGF0ZSA9IHN0YXRlOwoJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQl2YXIgY29tYiA9IHN0YXRlLmNjLnBvcCgpIHx8IGVsZW1lbnQ7CgkJCQkJaWYgKGNvbWIodHlwZSB8fCBzdHlsZSkpIGJyZWFrOwoJCQkJfQoJCQl9CgkJCXN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CgkJCXJldHVybiBzZXRTdHlsZSB8fCBzdHlsZTsKCQkJCX0sCgkJaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CgkJCXZhciBjb250ZXh0ID0gc3RhdGUuY29udGV4dDsKCQkJaWYgKGNvbnRleHQgJiYgY29udGV4dC5ub0luZGVudCkgcmV0dXJuIDA7CgkJCWlmIChjb250ZXh0ICYmIC9ee1wvLy50ZXN0KHRleHRBZnRlcikpCgkJCQljb250ZXh0ID0gY29udGV4dC5wcmV2OwoJCQl3aGlsZSAoY29udGV4dCAmJiAhY29udGV4dC5zdGFydE9mTGluZSkKCQkJCWNvbnRleHQgPSBjb250ZXh0LnByZXY7CgkJCWlmIChjb250ZXh0KSByZXR1cm4gY29udGV4dC5pbmRlbnQgKyBpbmRlbnRVbml0OwoJCQllbHNlIHJldHVybiAwOwoJCX0sCgkJZWxlY3RyaWNDaGFyczogIi8iCgl9Owp9KTsKCi8vSSBmaWd1cmUsIHdoeSBub3QKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3Rpa2kiLCAidGlraSIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/vb/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/vb/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWw+CiAgPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogVkIuTkVUIG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJ2Yi5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgICA8bGluayBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1JbmNvbnNvbGF0YSIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+CiAgICA8c3R5bGU+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCAjYWFhOyBoZWlnaHQ6MjEwcHg7IGhlaWdodDogYXV0bzt9CiAgICAgIC5Db2RlTWlycm9yLXNjcm9sbCB7IG92ZXJmbG93LXg6IGF1dG87IG92ZXJmbG93LXk6IGhpZGRlbjt9CiAgICAgIC5Db2RlTWlycm9yIHByZSB7IGZvbnQtZmFtaWx5OiBJbmNvbnNvbGF0YTsgZm9udC1zaXplOiAxNHB4fQogICAgPC9zdHlsZT4gCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvdXRpbC9ydW5tb2RlLmpzIj48L3NjcmlwdD4KICA8L2hlYWQ+CiAgPGJvZHkgb25sb2FkPSJpbml0KCkiPgogICAgPGgxPkNvZGVNaXJyb3I6IFZCLk5FVCBtb2RlPC9oMT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiB0ZXN0KGdvbGRlbiwgdGV4dCkgewogIHZhciBvayA9IHRydWU7CiAgdmFyIGkgPSAwOwogIGZ1bmN0aW9uIGNhbGxiYWNrKHRva2VuLCBzdHlsZSwgbGluZU5vLCBwb3MpewoJCS8vY29uc29sZS5sb2coU3RyaW5nKHRva2VuKSArICIgIiArIFN0cmluZyhzdHlsZSkgKyAiICIgKyBTdHJpbmcobGluZU5vKSArICIgIiArIFN0cmluZyhwb3MpKTsKICAgIHZhciByZXN1bHQgPSBbU3RyaW5nKHRva2VuKSwgU3RyaW5nKHN0eWxlKV07CiAgICBpZiAoZ29sZGVuW2ldWzBdICE9IHJlc3VsdFswXSB8fCBnb2xkZW5baV1bMV0gIT0gcmVzdWx0WzFdKXsKICAgICAgcmV0dXJuICJFcnJvciwgZXhwZWN0ZWQ6ICIgKyBTdHJpbmcoZ29sZGVuW2ldKSArICIsIGdvdDogIiArIFN0cmluZyhyZXN1bHQpOwogICAgICBvayA9IGZhbHNlOwogICAgfQogICAgaSsrOwogIH0KICBDb2RlTWlycm9yLnJ1bk1vZGUodGV4dCwgInRleHQveC12YiIsY2FsbGJhY2spOyAKCiAgaWYgKG9rKSByZXR1cm4gIlRlc3RzIE9LIjsKfQpmdW5jdGlvbiB0ZXN0VHlwZXMoKSB7CiAgdmFyIGdvbGRlbiA9IFtbJ0ludGVnZXInLCdrZXl3b3JkJ10sWycgJywnbnVsbCddLFsnRmxvYXQnLCdrZXl3b3JkJ11dCiAgdmFyIHRleHQgPSAgIkludGVnZXIgRmxvYXQiOwogIHJldHVybiB0ZXN0KGdvbGRlbix0ZXh0KTsKfQpmdW5jdGlvbiB0ZXN0SWYoKXsKICB2YXIgZ29sZGVuID0gW1snSWYnLCdrZXl3b3JkJ10sWycgJywnbnVsbCddLFsnVHJ1ZScsJ2tleXdvcmQnXSxbJyAnLCdudWxsJ10sWydFbmQnLCdrZXl3b3JkJ10sWycgJywnbnVsbCddLFsnSWYnLCdrZXl3b3JkJ11dOwogIHZhciB0ZXh0ID0gJ0lmIFRydWUgRW5kIElmJzsKICByZXR1cm4gdGVzdChnb2xkZW4sIHRleHQpOwp9CmZ1bmN0aW9uIHRlc3REZWNsKCl7CiAgIHZhciBnb2xkZW4gPSBbWydEaW0nLCdrZXl3b3JkJ10sWycgJywnbnVsbCddLFsneCcsJ3ZhcmlhYmxlJ10sWycgJywnbnVsbCddLFsnYXMnLCdrZXl3b3JkJ10sWycgJywnbnVsbCddLFsnSW50ZWdlcicsJ2tleXdvcmQnXV07CiAgIHZhciB0ZXh0ID0gJ0RpbSB4IGFzIEludGVnZXInOwogICByZXR1cm4gdGVzdChnb2xkZW4sIHRleHQpOwp9CmZ1bmN0aW9uIHRlc3RBbGwoKXsKICB2YXIgcmVzdWx0ID0gIiI7CgogIHJlc3VsdCArPSB0ZXN0VHlwZXMoKSArICJcbiI7CiAgcmVzdWx0ICs9IHRlc3RJZigpICsgIlxuIjsKICByZXN1bHQgKz0gdGVzdERlY2woKSArICJcbiI7CiAgcmV0dXJuIHJlc3VsdDsKCn0KZnVuY3Rpb24gaW5pdFRleHQoZWRpdG9yKSB7CiAgdmFyIGNvbnRlbnQgPSAnQ2xhc3Mgcm9ja2V0XG5Qcml2YXRlIHF1YWxpdHkgYXMgRG91YmxlXG5QdWJsaWMgU3ViIGxhdW5jaCgpIGFzIFN0cmluZ1xuaWYgcXVhbGl0eSA+IDAuOFxubGF1bmNoID0gIlN1Y2Nlc3NmdWwiXG5FbHNlXG5sYXVuY2ggPSAiRmFpbGVkIlxuRW5kIElmXG5FbmQgc3ViXG5FbmQgY2xhc3Ncbic7CiAgZWRpdG9yLnNldFZhbHVlKGNvbnRlbnQpOwogIGZvciAodmFyIGkgPTA7IGk8IGVkaXRvci5saW5lQ291bnQoKTsgaSsrKSBlZGl0b3IuaW5kZW50TGluZShpKTsKfQpmdW5jdGlvbiBpbml0KCkgewogICAgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNvbHV0aW9uIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LXZiIiwKICAgICAgICByZWFkT25seTogZmFsc2UsCiAgICAgICAgdGFiTW9kZTogInNoaWZ0IgogICAgfSk7CiAgICBydW5UZXN0KCk7Cn0KZnVuY3Rpb24gcnVuVGVzdCgpIHsKCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0cmVzdWx0JykuaW5uZXJIVE1MID0gdGVzdEFsbCgpOwogIGluaXRUZXh0KGVkaXRvcik7CgkKfQo8L3NjcmlwdD4KCgogIDxkaXYgaWQ9ImVkaXQiPgogIDx0ZXh0YXJlYSBzdHlsZT0id2lkdGg6OTUlO2hlaWdodDoyMDBweDtwYWRkaW5nOjVweDsiIG5hbWU9InNvbHV0aW9uIiBpZD0ic29sdXRpb24iID48L3RleHRhcmVhPgogIDwvZGl2PgogIDxwcmUgaWQ9InRlc3RyZXN1bHQiPjwvcHJlPgogIDxwPk1JTUUgdHlwZSBkZWZpbmVkOiA8Y29kZT50ZXh0L3gtdmI8L2NvZGU+LjwvcD4KCjwvYm9keT48L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/vb/LICENSE.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[VGhlIE1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTIgQ29kaWxpdHkgTGltaXRlZCwgMTA3IENoZWFwc2lkZSwgTG9uZG9uIEVDMlYgNkROLCBVSwoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/vb/vb.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2YiIsIGZ1bmN0aW9uKGNvbmYsIHBhcnNlckNvbmYpIHsKICAgIHZhciBFUlJPUkNMQVNTID0gJ2Vycm9yJzsKICAgIAogICAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3JkcykgewogICAgICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiLCAiaSIpOwogICAgfQogICAgCiAgICB2YXIgc2luZ2xlT3BlcmF0b3JzID0gbmV3IFJlZ0V4cCgiXltcXCtcXC1cXCovJSZcXFxcfFxcXn48PiFdIik7CiAgICB2YXIgc2luZ2xlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoJ15bXFwoXFwpXFxbXFxdXFx7XFx9QCw6YD07XFwuXScpOwogICAgdmFyIGRvdWJsZU9wZXJhdG9ycyA9IG5ldyBSZWdFeHAoIl4oKD09KXwoPD4pfCg8PSl8KD49KXwoPD4pfCg8PCl8KD4+KXwoLy8pfChcXCpcXCopKSIpOwogICAgdmFyIGRvdWJsZURlbGltaXRlcnMgPSBuZXcgUmVnRXhwKCJeKChcXCs9KXwoXFwtPSl8KFxcKj0pfCglPSl8KC89KXwoJj0pfChcXHw9KXwoXFxePSkpIik7CiAgICB2YXIgdHJpcGxlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoIl4oKC8vPSl8KD4+PSl8KDw8PSl8KFxcKlxcKj0pKSIpOwogICAgdmFyIGlkZW50aWZpZXJzID0gbmV3IFJlZ0V4cCgiXltfQS1aYS16XVtfQS1aYS16MC05XSoiKTsKCiAgICB2YXIgb3BlbmluZ0tleXdvcmRzID0gWydjbGFzcycsJ21vZHVsZScsICdzdWInLCdlbnVtJywnc2VsZWN0Jywnd2hpbGUnLCdpZicsJ2Z1bmN0aW9uJywgICdnZXQnLCdzZXQnLCdwcm9wZXJ0eScsICd0cnknXTsKICAgIHZhciBtaWRkbGVLZXl3b3JkcyA9IFsnZWxzZScsJ2Vsc2VpZicsJ2Nhc2UnLCAnY2F0Y2gnXTsKICAgIHZhciBlbmRLZXl3b3JkcyA9IFsnbmV4dCcsJ2xvb3AnXTsKICAgCiAgICB2YXIgd29yZE9wZXJhdG9ycyA9IHdvcmRSZWdleHAoWydhbmQnLCAnb3InLCAnbm90JywgJ3hvcicsICdpbiddKTsKICAgIHZhciBjb21tb25rZXl3b3JkcyA9IFsnYXMnLCAnZGltJywgJ2JyZWFrJywgICdjb250aW51ZScsJ29wdGlvbmFsJywgJ3RoZW4nLCAgJ3VudGlsJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvdG8nLCAnYnl2YWwnLCdieXJlZicsJ25ldycsJ2hhbmRsZXMnLCdwcm9wZXJ0eScsICdyZXR1cm4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICdjb25zdCcsJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ2ZyaWVuZCcsICdwdWJsaWMnLCAnc2hhcmVkJywgJ3N0YXRpYycsICd0cnVlJywnZmFsc2UnXTsKICAgIHZhciBjb21tb250eXBlcyA9IFsnaW50ZWdlcicsJ3N0cmluZycsJ2RvdWJsZScsJ2RlY2ltYWwnLCdib29sZWFuJywnc2hvcnQnLCdjaGFyJywgJ2Zsb2F0Jywnc2luZ2xlJ107CgogICAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChjb21tb25rZXl3b3Jkcyk7CiAgICB2YXIgdHlwZXMgPSB3b3JkUmVnZXhwKGNvbW1vbnR5cGVzKTsKICAgIHZhciBzdHJpbmdQcmVmaXhlcyA9ICciJzsKCiAgICB2YXIgb3BlbmluZyA9IHdvcmRSZWdleHAob3BlbmluZ0tleXdvcmRzKTsKICAgIHZhciBtaWRkbGUgPSB3b3JkUmVnZXhwKG1pZGRsZUtleXdvcmRzKTsKICAgIHZhciBjbG9zaW5nID0gd29yZFJlZ2V4cChlbmRLZXl3b3Jkcyk7CiAgICB2YXIgZG91YmxlQ2xvc2luZyA9IHdvcmRSZWdleHAoWydlbmQnXSk7CiAgICB2YXIgZG9PcGVuaW5nID0gd29yZFJlZ2V4cChbJ2RvJ10pOwoKICAgIHZhciBpbmRlbnRJbmZvID0gbnVsbDsKCiAgIAoKCiAgICBmdW5jdGlvbiBpbmRlbnQoX3N0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RhdGUuY3VycmVudEluZGVudCsrOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBkZWRlbnQoX3N0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RhdGUuY3VycmVudEluZGVudC0tOwogICAgfQogICAgLy8gdG9rZW5pemVycwogICAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CiAgICAgICAgCiAgICAgICAgLy8gSGFuZGxlIENvbW1lbnRzCiAgICAgICAgaWYgKGNoID09PSAiJyIpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICAvLyBIYW5kbGUgTnVtYmVyIExpdGVyYWxzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXigoJkgpfCgmTykpP1swLTlcLmEtZl0vaSwgZmFsc2UpKSB7CiAgICAgICAgICAgIHZhciBmbG9hdExpdGVyYWwgPSBmYWxzZTsKICAgICAgICAgICAgLy8gRmxvYXRzCiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cZCpcLlxkK0Y/L2kpKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eXGQrXC5cZCpGPy8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eXC5cZCtGPy8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChmbG9hdExpdGVyYWwpIHsKICAgICAgICAgICAgICAgIC8vIEZsb2F0IGxpdGVyYWxzIG1heSBiZSAiaW1hZ2luYXJ5IgogICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvSi9pKTsKICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJbnRlZ2VycwogICAgICAgICAgICB2YXIgaW50TGl0ZXJhbCA9IGZhbHNlOwogICAgICAgICAgICAvLyBIZXgKICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXiZIWzAtOWEtZl0rL2kpKSB7IGludExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgICAgIC8vIE9jdGFsCiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXiZPWzAtN10rL2kpKSB7IGludExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgICAgIC8vIERlY2ltYWwKICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eWzEtOV1cZCpGPy8pKSB7CiAgICAgICAgICAgICAgICAvLyBEZWNpbWFsIGxpdGVyYWxzIG1heSBiZSAiaW1hZ2luYXJ5IgogICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvSi9pKTsKICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBDYW4geW91IGhhdmUgaW1hZ2luYXJ5IGxvbmdzPwogICAgICAgICAgICAgICAgaW50TGl0ZXJhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gWmVybyBieSBpdHNlbGYgd2l0aCBubyBvdGhlciBwaWVjZSBvZiBudW1iZXIuCiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXjAoPyFbXGR4XSkvaSkpIHsgaW50TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgaWYgKGludExpdGVyYWwpIHsKICAgICAgICAgICAgICAgIC8vIEludGVnZXIgbGl0ZXJhbHMgbWF5IGJlICJsb25nIgogICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvTC9pKTsKICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBIYW5kbGUgU3RyaW5ncwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goc3RyaW5nUHJlZml4ZXMpKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmdGYWN0b3J5KHN0cmVhbS5jdXJyZW50KCkpOwogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIEhhbmRsZSBvcGVyYXRvcnMgYW5kIERlbGltaXRlcnMKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHRyaXBsZURlbGltaXRlcnMpIHx8IHN0cmVhbS5tYXRjaChkb3VibGVEZWxpbWl0ZXJzKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChkb3VibGVPcGVyYXRvcnMpCiAgICAgICAgICAgIHx8IHN0cmVhbS5tYXRjaChzaW5nbGVPcGVyYXRvcnMpCiAgICAgICAgICAgIHx8IHN0cmVhbS5tYXRjaCh3b3JkT3BlcmF0b3JzKSkgewogICAgICAgICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChzaW5nbGVEZWxpbWl0ZXJzKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChkb09wZW5pbmcpKSB7CiAgICAgICAgICAgIGluZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICBzdGF0ZS5kb0luQ3VycmVudExpbmUgPSB0cnVlOwogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKG9wZW5pbmcpKSB7CiAgICAgICAgICAgIGlmICghIHN0YXRlLmRvSW5DdXJyZW50TGluZSkKICAgICAgICAgICAgICBpbmRlbnQoc3RyZWFtLHN0YXRlKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHN0YXRlLmRvSW5DdXJyZW50TGluZSA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKG1pZGRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goZG91YmxlQ2xvc2luZykpIHsKICAgICAgICAgICAgZGVkZW50KHN0cmVhbSxzdGF0ZSk7CiAgICAgICAgICAgIGRlZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGNsb3NpbmcpKSB7CiAgICAgICAgICAgIGRlZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHR5cGVzKSkgewogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGtleXdvcmRzKSkgewogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzKSkgewogICAgICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gSGFuZGxlIG5vbi1kZXRlY3RlZCBpdGVtcwogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nRmFjdG9yeShkZWxpbWl0ZXIpIHsKICAgICAgICB2YXIgc2luZ2xlbGluZSA9IGRlbGltaXRlci5sZW5ndGggPT0gMTsKICAgICAgICB2YXIgT1VUQ0xBU1MgPSAnc3RyaW5nJzsKICAgICAgICAKICAgICAgICByZXR1cm4gZnVuY3Rpb24gdG9rZW5TdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXiciXS8pOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChkZWxpbWl0ZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9VVENMQVNTOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KC9bJyJdLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNpbmdsZWxpbmUpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJzZXJDb25mLnNpbmdsZUxpbmVTdHJpbmdFcnJvcnMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE9VVENMQVNTOwogICAgICAgIH07CiAgICB9CiAgICAKCiAgICBmdW5jdGlvbiB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB2YXIgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgICAgIC8vIEhhbmRsZSAnLicgY29ubmVjdGVkIGlkZW50aWZpZXJzCiAgICAgICAgaWYgKGN1cnJlbnQgPT09ICcuJykgewogICAgICAgICAgICBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgICAgICBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgICAgICAgaWYgKHN0eWxlID09PSAndmFyaWFibGUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIHZhciBkZWxpbWl0ZXJfaW5kZXggPSAnWyh7Jy5pbmRleE9mKGN1cnJlbnQpOwogICAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIGluZGVudChzdHJlYW0sIHN0YXRlICk7CiAgICAgICAgfQogICAgICAgIGlmIChpbmRlbnRJbmZvID09PSAnZGVkZW50JykgewogICAgICAgICAgICBpZiAoZGVkZW50KHN0cmVhbSwgc3RhdGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkZWxpbWl0ZXJfaW5kZXggPSAnXSl9Jy5pbmRleE9mKGN1cnJlbnQpOwogICAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIGlmIChkZWRlbnQoc3RyZWFtLCBzdGF0ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KCiAgICB2YXIgZXh0ZXJuYWwgPSB7CiAgICAgICAgZWxlY3RyaWNDaGFyczoiZERwUHRUZkZlRSAiLAogICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgbGFzdFRva2VuOiBudWxsLAogICAgICAgICAgICAgIGN1cnJlbnRJbmRlbnQ6IDAsCiAgICAgICAgICAgICAgbmV4dExpbmVJbmRlbnQ6IDAsCiAgICAgICAgICAgICAgZG9JbkN1cnJlbnRMaW5lOiBmYWxzZQoKCiAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnQgKz0gc3RhdGUubmV4dExpbmVJbmRlbnQ7CiAgICAgICAgICAgICAgc3RhdGUubmV4dExpbmVJbmRlbnQgPSAwOwogICAgICAgICAgICAgIHN0YXRlLmRvSW5DdXJyZW50TGluZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN0eWxlID0gdG9rZW5MZXhlcihzdHJlYW0sIHN0YXRlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbiA9IHtzdHlsZTpzdHlsZSwgY29udGVudDogc3RyZWFtLmN1cnJlbnQoKX07CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICAgICAgICB2YXIgdHJ1ZVRleHQgPSB0ZXh0QWZ0ZXIucmVwbGFjZSgvXlxzK3xccyskL2csICcnKSA7CiAgICAgICAgICAgIGlmICh0cnVlVGV4dC5tYXRjaChjbG9zaW5nKSB8fCB0cnVlVGV4dC5tYXRjaChkb3VibGVDbG9zaW5nKSB8fCB0cnVlVGV4dC5tYXRjaChtaWRkbGUpKSByZXR1cm4gY29uZi5pbmRlbnRVbml0KihzdGF0ZS5jdXJyZW50SW5kZW50LTEpOwogICAgICAgICAgICBpZihzdGF0ZS5jdXJyZW50SW5kZW50IDwgMCkgcmV0dXJuIDA7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5jdXJyZW50SW5kZW50ICogY29uZi5pbmRlbnRVbml0OwogICAgICAgIH0KICAgICAgICAKICAgIH07CiAgICByZXR1cm4gZXh0ZXJuYWw7Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtdmIiLCAidmIiKTsKCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/vbscript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/vbscript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFZCU2NyaXB0IG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJ2YnNjcmlwdC5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogVkJTY3JpcHQgbW9kZTwvaDE+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CicgUGV0ZSBHdWhsCicgMDMtMDQtMjAxMgonCicgQmFzaWMgVkJTY3JpcHQgc3VwcG9ydCBmb3IgY29kZW1pcnJvcjIKCkNvbnN0IEZvclJlYWRpbmcgPSAxLCBGb3JXcml0aW5nID0gMiwgRm9yQXBwZW5kaW5nID0gOAoKQ2FsbCBTdWIwMjBfUG9zdEJyb2FkY2FzdFRvVXJiYW5BaXJzaGlwKHN0clVzZXJOYW1lLCBzdHJQYXNzd29yZCwgaW50VHJhbnNtaXRJRCwgc3RyUmVzcG9uc2UpCgpJZiBOb3QgSXNOdWxsKHN0clJlc3BvbnNlKSBBTkQgTGVuKHN0clJlc3BvbnNlKSA9IDAgVGhlbgoJYm9vbFRyYW5zbWl0T2tZTiA9IEZhbHNlCkVsc2UKCScgV1NjcmlwdC5FY2hvICJPaCBIYXBweSBEYXkhIE9oIEhhcHB5IERBWSEiCglib29sVHJhbnNtaXRPa1lOID0gVHJ1ZQpFbmQgSWYKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQvdmJzY3JpcHQ8L2NvZGU+LjwvcD4KICA8L2JvZHk+CjwvaHRtbD4KCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/vbscript/vbscript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2YnNjcmlwdCIsIGZ1bmN0aW9uKCkgewogIHZhciByZWdleFZCU2NyaXB0S2V5d29yZCA9IC9eKD86Q2FsbHxDYXNlfENEYXRlfENsZWFyfENJbnR8Q0xuZ3xDb25zdHxDU3RyfERlc2NyaXB0aW9ufERpbXxEb3xFYWNofEVsc2V8RWxzZUlmfEVuZHxFcnJ8RXJyb3J8RXhpdHxGYWxzZXxGb3J8RnVuY3Rpb258SWZ8TENhc2V8TG9vcHxMVHJpbXxOZXh0fE5vdGhpbmd8Tm93fE51bWJlcnxPbnxQcmVzZXJ2ZXxRdWl0fFJlRGltfFJlc3VtZXxSVHJpbXxTZWxlY3R8U2V0fFN1YnxUaGVufFRvfFRyaW18VHJ1ZXxVQm91bmR8VUNhc2V8VW50aWx8VmJDcnxWYkNyTGZ8VmJMZnxWYlRhYikkL2ltOwoKICByZXR1cm4gewogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIiciKSB7CiAgICAgIAlzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIAlyZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAnIicpIHsKICAgICAgCXN0cmVhbS5za2lwVG8oJyInKTsKICAgICAgCXJldHVybiAic3RyaW5nIjsKICAgICAgfQoKICAgICAgaWYgKC9cdy8udGVzdChjaCkpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgICAgaWYgKHJlZ2V4VkJTY3JpcHRLZXl3b3JkLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkpIHJldHVybiAia2V5d29yZCI7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdmJzY3JpcHQiLCAidmJzY3JpcHQiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/velocity/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/velocity/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFZlbG9jaXR5IG1vZGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJ2ZWxvY2l0eS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL25pZ2h0LmNzcyI+CiAgICA8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBWZWxvY2l0eSBtb2RlPC9oMT4KICAgIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMjIFZlbG9jaXR5IENvZGUgRGVtbwojKgogICBiYXNlZCBvbiBQTC9TUUwgbW9kZSBieSBQZXRlciBSYWdhbml0c2NoLCBhZGFwdGVkIHRvIFZlbG9jaXR5IGJ5IFN0ZXZlIE8nSGFyYSAoIGh0dHA6Ly93d3cucGl2b3RhbC1zb2x1dGlvbnMuY28udWsgKQogICBBdWd1c3QgMjAxMQoqIwoKIyoKICAgVGhpcyBpcyBhIG11bHRpbGluZSBjb21tZW50LgogICBUaGlzIGlzIHRoZSBzZWNvbmQgbGluZQoqIwoKI1tbIGhlbGxvIHN0ZXZlCiAgIFRoaXMgaGFzIGludmFsaWQgc3ludGF4IHRoYXQgd291bGQgbm9ybWFsbHkgbmVlZCAicG9vciBtYW4ncyBlc2NhcGluZyIgbGlrZToKCiAgICNkZWZpbmUoKQoKICAgJHtibGFoCl1dIwoKI2luY2x1ZGUoICJkaXNjbGFpbWVyLnR4dCIgIm9waW5pb24udHh0IiApCiNpbmNsdWRlKCAkZm9vICRiYXIgKQoKI3BhcnNlKCAibGVjb3JidXNpZXIudm0iICkKI3BhcnNlKCAkZm9vICkKCiNldmFsdWF0ZSggJ3N0cmluZyB3aXRoIFZUTCAjaWYodHJ1ZSl3aWxsIGJlIGRpc3BsYXllZCNlbmQnICkKCiNkZWZpbmUoICRoZWxsbyApIEhlbGxvICR3aG8gI2VuZCAjc2V0KCAkd2hvID0gIldvcmxkISIpICRoZWxsbyAjIyBkaXNwbGF5cyBIZWxsbyBXb3JsZCEKCiNmb3JlYWNoKCAkY3VzdG9tZXIgaW4gJGN1c3RvbWVyTGlzdCApCgogICAgJGZvcmVhY2guY291bnQgJGN1c3RvbWVyLk5hbWUKCiAgICAjaWYoICRmb28gPT0gJHtiYXJ9KQogICAgICAgIGl0J3MgdHJ1ZSEKICAgICAgICAjYnJlYWsKICAgICN7ZWxzZX0KICAgICAgICBpdCdzIG5vdCEKICAgICAgICAjc3RvcAogICAgI2VuZAoKICAgICNpZiAoJGZvcmVhY2gucGFyZW50Lmhhc05leHQpCiAgICAgICAgJHZlbG9jaXR5Q291bnQKICAgICNlbmQKI2VuZAoKJHNvbWVPYmplY3QuZ2V0VmFsdWVzKCJ0aGlzIGlzIGEgc3RyaW5nIHNwbGl0CiAgICAgICAgYWNyb3NzIGxpbmVzIikKCiNtYWNybyggdGFibGVyb3dzICRjb2xvciAkc29tZWxpc3QgKQogICAgI2ZvcmVhY2goICRzb21ldGhpbmcgaW4gJHNvbWVsaXN0ICkKICAgICAgICA8dHI+PHRkIGJnY29sb3I9JGNvbG9yPiRzb21ldGhpbmc8L3RkPjwvdHI+CiAgICAjZW5kCiNlbmQKCiN0YWJsZXJvd3MoInJlZCIgWyJkYWRzZGYiLCJkc2EiXSkKCiAgIFZhcmlhYmxlIHJlZmVyZW5jZTogI3NldCggJG1vbmtleSA9ICRiaWxsICkKICAgU3RyaW5nIGxpdGVyYWw6ICNzZXQoICRtb25rZXkuRnJpZW5kID0gJ21vbmljYScgKQogICBQcm9wZXJ0eSByZWZlcmVuY2U6ICNzZXQoICRtb25rZXkuQmxhbWUgPSAkd2hpdGVob3VzZS5MZWFrICkKICAgTWV0aG9kIHJlZmVyZW5jZTogI3NldCggJG1vbmtleS5QbGFuID0gJHNwaW5kb2N0b3Iud2VhdmUoJHdlYikgKQogICBOdW1iZXIgbGl0ZXJhbDogI3NldCggJG1vbmtleS5OdW1iZXIgPSAxMjMgKQogICBSYW5nZSBvcGVyYXRvcjogI3NldCggJG1vbmtleS5OdW1iZXJzID0gWzEuLjNdICkKICAgT2JqZWN0IGxpc3Q6ICNzZXQoICRtb25rZXkuU2F5ID0gWyJOb3QiLCAkbXksICJmYXVsdCJdICkKICAgT2JqZWN0IG1hcDogI3NldCggJG1vbmtleS5NYXAgPSB7ImJhbmFuYSIgOiAiZ29vZCIsICJyb2FzdCBiZWVmIiA6ICJiYWQifSkKClRoZSBSSFMgY2FuIGFsc28gYmUgYSBzaW1wbGUgYXJpdGhtZXRpYyBleHByZXNzaW9uLCBzdWNoIGFzOgpBZGRpdGlvbjogI3NldCggJHZhbHVlID0gJGZvbyArIDEgKQogICBTdWJ0cmFjdGlvbjogI3NldCggJHZhbHVlID0gJGJhciAtIDEgKQogICBNdWx0aXBsaWNhdGlvbjogI3NldCggJHZhbHVlID0gJGZvbyAqICRiYXIgKQogICBEaXZpc2lvbjogI3NldCggJHZhbHVlID0gJGZvbyAvICRiYXIgKQogICBSZW1haW5kZXI6ICNzZXQoICR2YWx1ZSA9ICRmb28gJSAkYmFyICkKCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICB0YWJNb2RlOiAiaW5kZW50IiwKICAgICAgICB0aGVtZTogIm5pZ2h0IiwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1vZGU6ICJ0ZXh0L3ZlbG9jaXR5IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3ZlbG9jaXR5PC9jb2RlPi48L3A+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/velocity/velocity.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2ZWxvY2l0eSIsIGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gcGFyc2VXb3JkcyhzdHIpIHsKICAgICAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0KCiAgICB2YXIga2V5d29yZHMgPSBwYXJzZVdvcmRzKCIjZW5kICNlbHNlICNicmVhayAjc3RvcCAjW1sgI11dICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI3tlbmR9ICN7ZWxzZX0gI3ticmVha30gI3tzdG9wfSIpOwogICAgdmFyIGZ1bmN0aW9ucyA9IHBhcnNlV29yZHMoIiNpZiAjZWxzZWlmICNmb3JlYWNoICNzZXQgI2luY2x1ZGUgI3BhcnNlICNtYWNybyAjZGVmaW5lICNldmFsdWF0ZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIje2lmfSAje2Vsc2VpZn0gI3tmb3JlYWNofSAje3NldH0gI3tpbmNsdWRlfSAje3BhcnNlfSAje21hY3JvfSAje2RlZmluZX0gI3tldmFsdWF0ZX0iKTsKICAgIHZhciBzcGVjaWFscyA9IHBhcnNlV29yZHMoIiRmb3JlYWNoLmNvdW50ICRmb3JlYWNoLmhhc05leHQgJGZvcmVhY2guZmlyc3QgJGZvcmVhY2gubGFzdCAkZm9yZWFjaC50b3Btb3N0ICRmb3JlYWNoLnBhcmVudCAkdmVsb2NpdHlDb3VudCIpOwogICAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hPzpcL3xdLzsKCiAgICBmdW5jdGlvbiBjaGFpbihzdHJlYW0sIHN0YXRlLCBmKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBmOwogICAgICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgYmVmb3JlUGFyYW1zID0gc3RhdGUuYmVmb3JlUGFyYW1zOwogICAgICAgIHN0YXRlLmJlZm9yZVBhcmFtcyA9IGZhbHNlOwogICAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgLy8gc3RhcnQgb2Ygc3RyaW5nPwogICAgICAgIGlmICgoY2ggPT0gJyInIHx8IGNoID09ICInIikgJiYgc3RhdGUuaW5QYXJhbXMpCiAgICAgICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblN0cmluZyhjaCkpOwogICAgICAgIC8vIGlzIGl0IG9uZSBvZiB0aGUgc3BlY2lhbCBzaWducyBbXXt9KCkuLDs/IFNlcGVyYXRvcj8KICAgICAgICBlbHNlIGlmICgvW1xbXF17fVwoXCksO1wuXS8udGVzdChjaCkpIHsKICAgICAgICAgICAgaWYgKGNoID09ICIoIiAmJiBiZWZvcmVQYXJhbXMpIHN0YXRlLmluUGFyYW1zID0gdHJ1ZTsKICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gIikiKSBzdGF0ZS5pblBhcmFtcyA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gc3RhcnQgb2YgYSBudW1iZXIgdmFsdWU/CiAgICAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuXS8pOwogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfQogICAgICAgIC8vIG11bHRpIGxpbmUgY29tbWVudD8KICAgICAgICBlbHNlIGlmIChjaCA9PSAiIyIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlbkNvbW1lbnQpOwogICAgICAgIH0KICAgICAgICAvLyB1bnBhcnNlZCBjb250ZW50PwogICAgICAgIGVsc2UgaWYgKGNoID09ICIjIiAmJiBzdHJlYW0ubWF0Y2goLyAqXFsgKlxbLykpIHsKICAgICAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuVW5wYXJzZWQpOwogICAgICAgIH0KICAgICAgICAvLyBzaW5nbGUgbGluZSBjb21tZW50PwogICAgICAgIGVsc2UgaWYgKGNoID09ICIjIiAmJiBzdHJlYW0uZWF0KCIjIikpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICAgIH0KICAgICAgICAvLyB2YXJpYWJsZT8KICAgICAgICBlbHNlIGlmIChjaCA9PSAiJCIpIHsKICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcZFwkX1wue31dLyk7CiAgICAgICAgICAgIC8vIGlzIGl0IG9uZSBvZiB0aGUgc3BlY2lhbHM/CiAgICAgICAgICAgIGlmIChzcGVjaWFscyAmJiBzcGVjaWFscy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiAiYnVpbHRpbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gaXMgaXQgYSBvcGVyYXRvcj8KICAgICAgICBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIGdldCB0aGUgd2hvbGUgd29yZAogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX3t9XS8pOwogICAgICAgICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgLy8gaXMgaXQgb25lIG9mIHRoZSBsaXN0ZWQga2V5d29yZHM/CiAgICAgICAgICAgIGlmIChrZXl3b3JkcyAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkKICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgIC8vIGlzIGl0IG9uZSBvZiB0aGUgbGlzdGVkIGZ1bmN0aW9ucz8KICAgICAgICAgICAgaWYgKGZ1bmN0aW9ucyAmJiBmdW5jdGlvbnMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkgfHwKICAgICAgICAgICAgICAgIHN0cmVhbS5jdXJyZW50KCkubWF0Y2goL14jW2EtejAtOV9dKyAqJC9pKSAmJiBzdHJlYW0ucGVlaygpPT0iKCIpIHsKICAgICAgICAgICAgICAgIHN0YXRlLmJlZm9yZVBhcmFtcyA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGRlZmF1bHQ6IGp1c3QgYSAid29yZCIKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgICAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVuZCkgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgICAgICAgaWYgKGNoID09ICIjIiAmJiBtYXliZUVuZCkgewogICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuVW5wYXJzZWQoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBtYXliZUVuZCA9IDAsIGNoOwogICAgICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgICAgICAgaWYgKGNoID09ICIjIiAmJiBtYXliZUVuZCA9PSAyKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaCA9PSAiXSIpCiAgICAgICAgICAgICAgICBtYXliZUVuZCsrOwogICAgICAgICAgICBlbHNlIGlmIChjaCAhPSAiICIpCiAgICAgICAgICAgICAgICBtYXliZUVuZCA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAibWV0YSI7CiAgICB9CiAgICAvLyBJbnRlcmZhY2UKCiAgICByZXR1cm4gewogICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICAgIGJlZm9yZVBhcmFtczogZmFsc2UsCiAgICAgICAgICAgICAgICBpblBhcmFtczogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdmVsb2NpdHkiLCAidmVsb2NpdHkiKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/verilog/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/verilog/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFZlcmlsb2cgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InZlcmlsb2cuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDJweCBpbnNldCAjZGVlO308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBWZXJpbG9nIG1vZGU8L2gxPgoKPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLyogVmVyaWxvZyBkZW1vIGNvZGUgKi8KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICB3Yl9tYXN0ZXJfbW9kZWwudiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNQSSBJUCBjb3JlIHByb2plY3QgICAgICAgICAgICAgICAgLy8vLwovLy8vICBodHRwOi8vd3d3Lm9wZW5jb3Jlcy5vcmcvcHJvamVjdHMvc3BpLyAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgQXV0aG9yKHMpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgLSBTaW1vbiBTcm90IChzaW1vbnNAb3BlbmNvcmVzLm9yZykgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgQmFzZWQgb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgLSBpMmMvYmVuY2gvdmVyaWxvZy93Yl9tYXN0ZXJfbW9kZWwudiAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgIENvcHlyaWdodCAoQykgMjAwMSBSaWNoYXJkIEhlcnZlaWxsZSAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBBbGwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBhdmFsaWFibGUgaW4gdGhlIFJlYWRtZS50eHQgICAvLy8vCi8vLy8gIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyBDb3B5cmlnaHQgKEMpIDIwMDIgQXV0aG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gVGhpcyBzb3VyY2UgZmlsZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgd2l0aG91dCAgICAgICAgIC8vLy8KLy8vLyByZXN0cmljdGlvbiBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0IHN0YXRlbWVudCBpcyBub3QgICAgLy8vLwovLy8vIHJlbW92ZWQgZnJvbSB0aGUgZmlsZSBhbmQgdGhhdCBhbnkgZGVyaXZhdGl2ZSB3b3JrIGNvbnRhaW5zICAvLy8vCi8vLy8gdGhlIG9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBhc3NvY2lhdGVkIGRpc2NsYWltZXIuIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vIFRoaXMgc291cmNlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgICAvLy8vCi8vLy8gYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCAgIC8vLy8KLy8vLyBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgLy8vLwovLy8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgICAvLy8vCi8vLy8gbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSAgICAgICAvLy8vCi8vLy8gdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCAgIC8vLy8KLy8vLyB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSICAgICAgLy8vLwovLy8vIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSAvLy8vCi8vLy8gZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCAgICAvLy8vCi8vLy8gUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHNvdXJjZTsgaWYgbm90LCBkb3dubG9hZCBpdCAgIC8vLy8KLy8vLyBmcm9tIGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9sZ3BsLnNodG1sICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmBpbmNsdWRlICJ0aW1lc2NhbGUudiIKCm1vZHVsZSB3Yl9tYXN0ZXJfbW9kZWwoY2xrLCByc3QsIGFkciwgZGluLCBkb3V0LCBjeWMsIHN0Yiwgd2UsIHNlbCwgYWNrLCBlcnIsIHJ0eSk7CgogIHBhcmFtZXRlciBkd2lkdGggPSAzMjsKICBwYXJhbWV0ZXIgYXdpZHRoID0gMzI7CiAgCiAgaW5wdXQgICAgICAgICAgICAgICAgICBjbGssIHJzdDsKICBvdXRwdXQgW2F3aWR0aCAgIC0xOjBdIGFkcjsKICBpbnB1dCAgW2R3aWR0aCAgIC0xOjBdIGRpbjsKICBvdXRwdXQgW2R3aWR0aCAgIC0xOjBdIGRvdXQ7CiAgb3V0cHV0ICAgICAgICAgICAgICAgICBjeWMsIHN0YjsKICBvdXRwdXQgICAgICAgICAgICAgICAgIHdlOwogIG91dHB1dCBbZHdpZHRoLzggLTE6MF0gc2VsOwogIGlucHV0ICAgICAgICAgICAgICAgICAgYWNrLCBlcnIsIHJ0eTsKICAKICAvLyBJbnRlcm5hbCBzaWduYWxzCiAgcmVnICAgIFthd2lkdGggICAtMTowXSBhZHI7CiAgcmVnICAgIFtkd2lkdGggICAtMTowXSBkb3V0OwogIHJlZyAgICAgICAgICAgICAgICAgICAgY3ljLCBzdGI7CiAgcmVnICAgICAgICAgICAgICAgICAgICB3ZTsKICByZWcgICAgW2R3aWR0aC84IC0xOjBdIHNlbDsKICAgICAgICAgCiAgcmVnICAgIFtkd2lkdGggICAtMTowXSBxOwogIAogIC8vIE1lbW9yeSBMb2dpYwogIGluaXRpYWwKICAgIGJlZ2luCiAgICAgIGFkciAgPSB7YXdpZHRoezEnYnh9fTsKICAgICAgZG91dCA9IHtkd2lkdGh7MSdieH19OwogICAgICBjeWMgID0gMSdiMDsKICAgICAgc3RiICA9IDEnYng7CiAgICAgIHdlICAgPSAxJ2h4OwogICAgICBzZWwgID0ge2R3aWR0aC84ezEnYnh9fTsKICAgICAgIzE7CiAgICBlbmQKICAKICAvLyBXaXNoYm9uZSB3cml0ZSBjeWNsZQogIHRhc2sgd2Jfd3JpdGU7CiAgICBpbnB1dCAgIGRlbGF5OwogICAgaW50ZWdlciBkZWxheTsKICAKICAgIGlucHV0IFthd2lkdGggLTE6MF0gYTsKICAgIGlucHV0IFtkd2lkdGggLTE6MF0gZDsKICAKICAgIGJlZ2luCiAgCiAgICAgIC8vIHdhaXQgaW5pdGlhbCBkZWxheQogICAgICByZXBlYXQoZGVsYXkpIEAocG9zZWRnZSBjbGspOwogIAogICAgICAvLyBhc3NlcnQgd2lzaGJvbmUgc2lnbmFsCiAgICAgICMxOwogICAgICBhZHIgID0gYTsKICAgICAgZG91dCA9IGQ7CiAgICAgIGN5YyAgPSAxJ2IxOwogICAgICBzdGIgID0gMSdiMTsKICAgICAgd2UgICA9IDEnYjE7CiAgICAgIHNlbCAgPSB7ZHdpZHRoLzh7MSdiMX19OwogICAgICBAKHBvc2VkZ2UgY2xrKTsKICAKICAgICAgLy8gd2FpdCBmb3IgYWNrbm93bGVkZ2UgZnJvbSBzbGF2ZQogICAgICB3aGlsZSh+YWNrKSBAKHBvc2VkZ2UgY2xrKTsKICAKICAgICAgLy8gbmVnYXRlIHdpc2hib25lIHNpZ25hbHMKICAgICAgIzE7CiAgICAgIGN5YyAgPSAxJ2IwOwogICAgICBzdGIgID0gMSdieDsKICAgICAgYWRyICA9IHthd2lkdGh7MSdieH19OwogICAgICBkb3V0ID0ge2R3aWR0aHsxJ2J4fX07CiAgICAgIHdlICAgPSAxJ2h4OwogICAgICBzZWwgID0ge2R3aWR0aC84ezEnYnh9fTsKICAKICAgIGVuZAogIGVuZHRhc2sKICAKICAvLyBXaXNoYm9uZSByZWFkIGN5Y2xlCiAgdGFzayB3Yl9yZWFkOwogICAgaW5wdXQgICBkZWxheTsKICAgIGludGVnZXIgZGVsYXk7CiAgCiAgICBpbnB1dCAgW2F3aWR0aCAtMTowXSAgYTsKICAgIG91dHB1dCAgW2R3aWR0aCAtMTowXSBkOwogIAogICAgYmVnaW4KICAKICAgICAgLy8gd2FpdCBpbml0aWFsIGRlbGF5CiAgICAgIHJlcGVhdChkZWxheSkgQChwb3NlZGdlIGNsayk7CiAgCiAgICAgIC8vIGFzc2VydCB3aXNoYm9uZSBzaWduYWxzCiAgICAgICMxOwogICAgICBhZHIgID0gYTsKICAgICAgZG91dCA9IHtkd2lkdGh7MSdieH19OwogICAgICBjeWMgID0gMSdiMTsKICAgICAgc3RiICA9IDEnYjE7CiAgICAgIHdlICAgPSAxJ2IwOwogICAgICBzZWwgID0ge2R3aWR0aC84ezEnYjF9fTsKICAgICAgQChwb3NlZGdlIGNsayk7CiAgCiAgICAgIC8vIHdhaXQgZm9yIGFja25vd2xlZGdlIGZyb20gc2xhdmUKICAgICAgd2hpbGUofmFjaykgQChwb3NlZGdlIGNsayk7CiAgCiAgICAgIC8vIG5lZ2F0ZSB3aXNoYm9uZSBzaWduYWxzCiAgICAgICMxOwogICAgICBjeWMgID0gMSdiMDsKICAgICAgc3RiICA9IDEnYng7CiAgICAgIGFkciAgPSB7YXdpZHRoezEnYnh9fTsKICAgICAgZG91dCA9IHtkd2lkdGh7MSdieH19OwogICAgICB3ZSAgID0gMSdoeDsKICAgICAgc2VsICA9IHtkd2lkdGgvOHsxJ2J4fX07CiAgICAgIGQgICAgPSBkaW47CiAgCiAgICBlbmQKICBlbmR0YXNrCiAgCiAgLy8gV2lzaGJvbmUgY29tcGFyZSBjeWNsZSAocmVhZCBkYXRhIGZyb20gbG9jYXRpb24gYW5kIGNvbXBhcmUgd2l0aCBleHBlY3RlZCBkYXRhKQogIHRhc2sgd2JfY21wOwogICAgaW5wdXQgICBkZWxheTsKICAgIGludGVnZXIgZGVsYXk7CiAgCiAgICBpbnB1dCBbYXdpZHRoIC0xOjBdIGE7CiAgICBpbnB1dCBbZHdpZHRoIC0xOjBdIGRfZXhwOwogIAogICAgYmVnaW4KICAgICAgd2JfcmVhZCAoZGVsYXksIGEsIHEpOwoKICAgICAgaWYgKGRfZXhwICE9PSBxKSBiZWdpbgogICAgICAgICRkaXNwbGF5KCJcbi0tLSBFUlJPUjogQXQgYWRkcmVzcyAweCUweCwgZ290IDB4JTB4LCBleHBlY3RlZCAweCUweCBhdCB0aW1lICV0IiwgYSwgcSwgZF9leHAsICR0aW1lKTsKICAgICAgICAkc3RvcDsKICAgICAgZW5kCiAgICBlbmQKICBlbmR0YXNrCiAgCmVuZG1vZHVsZQo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtdmVyaWxvZyIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5TaW1wbGUgbW9kZSB0aGF0IHRyaWVzIHRvIGhhbmRsZSBWZXJpbG9nLWxpa2UgbGFuZ3VhZ2VzIGFzIHdlbGwgYXMgaXQKICAgIGNhbi4gVGFrZXMgb25lIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczogPGNvZGU+a2V5d29yZHM8L2NvZGU+LCBhbgogICAgb2JqZWN0IHdob3NlIHByb3BlcnR5IG5hbWVzIGFyZSB0aGUga2V5d29yZHMgaW4gdGhlIGxhbmd1YWdlLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXZlcmlsb2c8L2NvZGU+IChWZXJpbG9nIGNvZGUpLjwvcD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/verilog/verilog.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2ZXJpbG9nIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LAogICAgICBrZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5rZXl3b3JkcyB8fCB7fSwKICAgICAgYmxvY2tLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5ibG9ja0tleXdvcmRzIHx8IHt9LAogICAgICBhdG9tcyA9IHBhcnNlckNvbmZpZy5hdG9tcyB8fCB7fSwKICAgICAgaG9va3MgPSBwYXJzZXJDb25maWcuaG9va3MgfHwge30sCiAgICAgIG11bHRpTGluZVN0cmluZ3MgPSBwYXJzZXJDb25maWcubXVsdGlMaW5lU3RyaW5nczsKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWyZ8fj48IVwpXCgqIyVAK1wvPT9cOjt9eyxcLlxeXC1cW1xdXS87CgogIHZhciBjdXJQdW5jOwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChob29rc1tjaF0pIHsKICAgICAgdmFyIHJlc3VsdCA9IGhvb2tzW2NoXShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICgvW1xkJ10vLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC4nXS8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9CiAgICBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ29tbWVudDsKICAgICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgfQogICAgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgIGlmIChrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0KICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImF0b20iOwogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIShlc2NhcGVkIHx8IG11bHRpTGluZVN0cmluZ3MpKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgZnVuY3Rpb24gQ29udGV4dChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldikgewogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5hbGlnbiA9IGFsaWduOwogICAgdGhpcy5wcmV2ID0gcHJldjsKICB9CiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIGNvbCwgdHlwZSkgewogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChzdGF0ZS5pbmRlbnRlZCwgY29sLCB0eXBlLCBudWxsLCBzdGF0ZS5jb250ZXh0KTsKICB9CiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgdmFyIHQgPSBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICBpZiAodCA9PSAiKSIgfHwgdCA9PSAiXSIgfHwgdCA9PSAifSIpCiAgICAgIHN0YXRlLmluZGVudGVkID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgLy8gSW50ZXJmYWNlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IG51bGwsCiAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICBjdXJQdW5jID0gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTsKCiAgICAgIGlmICgoY3VyUHVuYyA9PSAiOyIgfHwgY3VyUHVuYyA9PSAiOiIpICYmIGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJ9Iik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiXSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIikiKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAifSIpIHsKICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGlmIChjdHgudHlwZSA9PSAifSIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBjdHgudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGN0eC50eXBlID09ICJ9IiB8fCBjdHgudHlwZSA9PSAidG9wIiB8fCAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgY3VyUHVuYyA9PSAibmV3c3RhdGVtZW50IikpCiAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgInN0YXRlbWVudCIpOwogICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlICYmIHN0YXRlLnRva2VuaXplICE9IG51bGwpIHJldHVybiAwOwogICAgICB2YXIgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCksIGN0eCA9IHN0YXRlLmNvbnRleHQsIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gY3R4LnR5cGU7CiAgICAgIGlmIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChmaXJzdENoYXIgPT0gInsiID8gMCA6IGluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAie30iCiAgfTsKfSk7CgooZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICB2YXIgdmVyaWxvZ0tleXdvcmRzID0gImFsd2F5cyBhbmQgYXNzaWduIGF1dG9tYXRpYyBiZWdpbiBidWYgYnVmaWYwIGJ1ZmlmMSBjYXNlIGNhc2V4IGNhc2V6IGNlbGwgY21vcyBjb25maWcgIiArCiAgICAiZGVhc3NpZ24gZGVmYXVsdCBkZWZwYXJhbSBkZXNpZ24gZGlzYWJsZSBlZGdlIGVsc2UgZW5kIGVuZGNhc2UgZW5kY29uZmlnIGVuZGZ1bmN0aW9uIGVuZGdlbmVyYXRlIGVuZG1vZHVsZSAiICsKICAgICJlbmRwcmltaXRpdmUgZW5kc3BlY2lmeSBlbmR0YWJsZSBlbmR0YXNrIGV2ZW50IGZvciBmb3JjZSBmb3JldmVyIGZvcmsgZnVuY3Rpb24gZ2VuZXJhdGUgZ2VudmFyIGhpZ2h6MCAiICsKICAgICJoaWdoejEgaWYgaWZub25lIGluY2RpciBpbmNsdWRlIGluaXRpYWwgaW5vdXQgaW5wdXQgaW5zdGFuY2UgaW50ZWdlciBqb2luIGxhcmdlIGxpYmxpc3QgbGlicmFyeSBsb2NhbHBhcmFtICIgKwogICAgIm1hY3JvbW9kdWxlIG1lZGl1bSBtb2R1bGUgbmFuZCBuZWdlZGdlIG5tb3Mgbm9yIG5vc2hvd2NhbmNlbGxlZCBub3Qgbm90aWYwIG5vdGlmMSBvciBvdXRwdXQgcGFyYW1ldGVyIHBtb3MgIiArCiAgICAicG9zZWRnZSBwcmltaXRpdmUgcHVsbDAgcHVsbDEgcHVsbGRvd24gcHVsbHVwIHB1bHNlc3R5bGVfb25ldmVudCBwdWxzZXN0eWxlX29uZGV0ZWN0IHJjbW9zIHJlYWwgcmVhbHRpbWUgIiArCiAgICAicmVnIHJlbGVhc2UgcmVwZWF0IHJubW9zIHJwbW9zIHJ0cmFuIHJ0cmFuaWYwIHJ0cmFuaWYxIHNjYWxhcmVkIHNob3djYW5jZWxsZWQgc2lnbmVkIHNtYWxsIHNwZWNpZnkgc3BlY3BhcmFtICIgKwogICAgInN0cm9uZzAgc3Ryb25nMSBzdXBwbHkwIHN1cHBseTEgdGFibGUgdGFzayB0aW1lIHRyYW4gdHJhbmlmMCB0cmFuaWYxIHRyaSB0cmkwIHRyaTEgdHJpYW5kIHRyaW9yIHRyaXJlZyAiICsKICAgICJ1bnNpZ25lZCB1c2UgdmVjdG9yZWQgd2FpdCB3YW5kIHdlYWswIHdlYWsxIHdoaWxlIHdpcmUgd29yIHhub3IgeG9yIjsKCiAgdmFyIHZlcmlsb2dCbG9ja0tleXdvcmRzID0gImJlZ2luIGJ1ZmlmMCBidWZpZjEgY2FzZSBjYXNleCBjYXNleiBjb25maWcgZWxzZSBlbmQgZW5kY2FzZSBlbmRjb25maWcgZW5kZnVuY3Rpb24gIiArCiAgICAiZW5kZ2VuZXJhdGUgZW5kbW9kdWxlIGVuZHByaW1pdGl2ZSBlbmRzcGVjaWZ5IGVuZHRhYmxlIGVuZHRhc2sgZm9yIGZvcmV2ZXIgZnVuY3Rpb24gZ2VuZXJhdGUgaWYgaWZub25lICIgKwogICAgIm1hY3JvbW9kdWxlIG1vZHVsZSBwcmltaXRpdmUgcmVwZWF0IHNwZWNpZnkgdGFibGUgdGFzayB3aGlsZSI7CgogIGZ1bmN0aW9uIG1ldGFIb29rKHN0cmVhbSkgewogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICByZXR1cm4gIm1ldGEiOwogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtdmVyaWxvZyIsIHsKICAgIG5hbWU6ICJ2ZXJpbG9nIiwKICAgIGtleXdvcmRzOiB3b3Jkcyh2ZXJpbG9nS2V5d29yZHMpLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHModmVyaWxvZ0Jsb2NrS2V5d29yZHMpLAogICAgYXRvbXM6IHdvcmRzKCJudWxsIiksCiAgICBob29rczogeyJgIjogbWV0YUhvb2ssICIkIjogbWV0YUhvb2t9CiAgfSk7Cn0oKSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/xml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/xml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFhNTCBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ieG1sLmpzIj48L3NjcmlwdD4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBYTUwgbW9kZTwvaDE+CiAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgombHQ7aHRtbCBzdHlsZT0iY29sb3I6IGdyZWVuIiZndDsKICAmbHQ7IS0tIHRoaXMgaXMgYSBjb21tZW50IC0tJmd0OwogICZsdDtoZWFkJmd0OwogICAgJmx0O3RpdGxlJmd0O0hUTUwgRXhhbXBsZSZsdDsvdGl0bGUmZ3Q7CiAgJmx0Oy9oZWFkJmd0OwogICZsdDtib2R5Jmd0OwogICAgVGhlIGluZGVudGF0aW9uIHRyaWVzIHRvIGJlICZsdDtlbSZndDtzb21ld2hhdCAmYW1wO3F1b3Q7ZG8gd2hhdAogICAgSSBtZWFuJmFtcDtxdW90OyZsdDsvZW0mZ3Q7Li4uIGJ1dCBtaWdodCBub3QgbWF0Y2ggeW91ciBzdHlsZS4KICAmbHQ7L2JvZHkmZ3Q7CiZsdDsvaHRtbCZndDsKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6IHtuYW1lOiAieG1sIiwgYWxpZ25DREFUQTogdHJ1ZX0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICAgIDxwPlRoZSBYTUwgbW9kZSBzdXBwb3J0cyB0d28gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOjwvcD4KICAgIDxkbD4KICAgICAgPGR0Pjxjb2RlPmh0bWxNb2RlIChib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhpcyBzd2l0Y2hlcyB0aGUgbW9kZSB0byBwYXJzZSBIVE1MIGluc3RlYWQgb2YgWE1MLiBUaGlzCiAgICAgIG1lYW5zIGF0dHJpYnV0ZXMgZG8gbm90IGhhdmUgdG8gYmUgcXVvdGVkLCBhbmQgc29tZSBlbGVtZW50cwogICAgICAoc3VjaCBhcyA8Y29kZT5icjwvY29kZT4pIGRvIG5vdCByZXF1aXJlIGEgY2xvc2luZyB0YWcuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmFsaWduQ0RBVEEgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TZXR0aW5nIHRoaXMgdG8gdHJ1ZSB3aWxsIGZvcmNlIHRoZSBvcGVuaW5nIHRhZyBvZiBDREFUQQogICAgICBibG9ja3MgdG8gbm90IGJlIGluZGVudGVkLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT5hcHBsaWNhdGlvbi94bWw8L2NvZGU+LCA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+LjwvcD4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/xml/xml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJ4bWwiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQ7CiAgdmFyIEtsdWRnZXMgPSBwYXJzZXJDb25maWcuaHRtbE1vZGUgPyB7CiAgICBhdXRvU2VsZkNsb3NlcnM6IHsnYXJlYSc6IHRydWUsICdiYXNlJzogdHJ1ZSwgJ2JyJzogdHJ1ZSwgJ2NvbCc6IHRydWUsICdjb21tYW5kJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICdlbWJlZCc6IHRydWUsICdmcmFtZSc6IHRydWUsICdocic6IHRydWUsICdpbWcnOiB0cnVlLCAnaW5wdXQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgJ2tleWdlbic6IHRydWUsICdsaW5rJzogdHJ1ZSwgJ21ldGEnOiB0cnVlLCAncGFyYW0nOiB0cnVlLCAnc291cmNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICd0cmFjayc6IHRydWUsICd3YnInOiB0cnVlfSwKICAgIGltcGxpY2l0bHlDbG9zZWQ6IHsnZGQnOiB0cnVlLCAnbGknOiB0cnVlLCAnb3B0Z3JvdXAnOiB0cnVlLCAnb3B0aW9uJzogdHJ1ZSwgJ3AnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICdycCc6IHRydWUsICdydCc6IHRydWUsICd0Ym9keSc6IHRydWUsICd0ZCc6IHRydWUsICd0Zm9vdCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgJ3RoJzogdHJ1ZSwgJ3RyJzogdHJ1ZX0sCiAgICBjb250ZXh0R3JhYmJlcnM6IHsKICAgICAgJ2RkJzogeydkZCc6IHRydWUsICdkdCc6IHRydWV9LAogICAgICAnZHQnOiB7J2RkJzogdHJ1ZSwgJ2R0JzogdHJ1ZX0sCiAgICAgICdsaSc6IHsnbGknOiB0cnVlfSwKICAgICAgJ29wdGlvbic6IHsnb3B0aW9uJzogdHJ1ZSwgJ29wdGdyb3VwJzogdHJ1ZX0sCiAgICAgICdvcHRncm91cCc6IHsnb3B0Z3JvdXAnOiB0cnVlfSwKICAgICAgJ3AnOiB7J2FkZHJlc3MnOiB0cnVlLCAnYXJ0aWNsZSc6IHRydWUsICdhc2lkZSc6IHRydWUsICdibG9ja3F1b3RlJzogdHJ1ZSwgJ2Rpcic6IHRydWUsCiAgICAgICAgICAgICdkaXYnOiB0cnVlLCAnZGwnOiB0cnVlLCAnZmllbGRzZXQnOiB0cnVlLCAnZm9vdGVyJzogdHJ1ZSwgJ2Zvcm0nOiB0cnVlLAogICAgICAgICAgICAnaDEnOiB0cnVlLCAnaDInOiB0cnVlLCAnaDMnOiB0cnVlLCAnaDQnOiB0cnVlLCAnaDUnOiB0cnVlLCAnaDYnOiB0cnVlLAogICAgICAgICAgICAnaGVhZGVyJzogdHJ1ZSwgJ2hncm91cCc6IHRydWUsICdocic6IHRydWUsICdtZW51JzogdHJ1ZSwgJ25hdic6IHRydWUsICdvbCc6IHRydWUsCiAgICAgICAgICAgICdwJzogdHJ1ZSwgJ3ByZSc6IHRydWUsICdzZWN0aW9uJzogdHJ1ZSwgJ3RhYmxlJzogdHJ1ZSwgJ3VsJzogdHJ1ZX0sCiAgICAgICdycCc6IHsncnAnOiB0cnVlLCAncnQnOiB0cnVlfSwKICAgICAgJ3J0JzogeydycCc6IHRydWUsICdydCc6IHRydWV9LAogICAgICAndGJvZHknOiB7J3Rib2R5JzogdHJ1ZSwgJ3Rmb290JzogdHJ1ZX0sCiAgICAgICd0ZCc6IHsndGQnOiB0cnVlLCAndGgnOiB0cnVlfSwKICAgICAgJ3Rmb290Jzogeyd0Ym9keSc6IHRydWV9LAogICAgICAndGgnOiB7J3RkJzogdHJ1ZSwgJ3RoJzogdHJ1ZX0sCiAgICAgICd0aGVhZCc6IHsndGJvZHknOiB0cnVlLCAndGZvb3QnOiB0cnVlfSwKICAgICAgJ3RyJzogeyd0cic6IHRydWV9CiAgICB9LAogICAgZG9Ob3RJbmRlbnQ6IHsicHJlIjogdHJ1ZX0sCiAgICBhbGxvd1VucXVvdGVkOiB0cnVlLAogICAgYWxsb3dNaXNzaW5nOiB0cnVlCiAgfSA6IHsKICAgIGF1dG9TZWxmQ2xvc2Vyczoge30sCiAgICBpbXBsaWNpdGx5Q2xvc2VkOiB7fSwKICAgIGNvbnRleHRHcmFiYmVyczoge30sCiAgICBkb05vdEluZGVudDoge30sCiAgICBhbGxvd1VucXVvdGVkOiBmYWxzZSwKICAgIGFsbG93TWlzc2luZzogZmFsc2UKICB9OwogIHZhciBhbGlnbkNEQVRBID0gcGFyc2VyQ29uZmlnLmFsaWduQ0RBVEE7CgogIC8vIFJldHVybiB2YXJpYWJsZXMgZm9yIHRva2VuaXplcnMKICB2YXIgdGFnTmFtZSwgdHlwZTsKCiAgZnVuY3Rpb24gaW5UZXh0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGZ1bmN0aW9uIGNoYWluKHBhcnNlcikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcjsKICAgICAgcmV0dXJuIHBhcnNlcihzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICI8IikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiISIpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIlsiKSkgewogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiQ0RBVEFbIikpIHJldHVybiBjaGFpbihpbkJsb2NrKCJhdG9tIiwgIl1dPiIpKTsKICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgiLS0iKSkgcmV0dXJuIGNoYWluKGluQmxvY2soImNvbW1lbnQiLCAiLS0+IikpOwogICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgiRE9DVFlQRSIsIHRydWUsIHRydWUpKSB7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuX1wtXS8pOwogICAgICAgICAgcmV0dXJuIGNoYWluKGRvY3R5cGUoMSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoIj8iKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5fXC1dLyk7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpbkJsb2NrKCJtZXRhIiwgIj8+Iik7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICB2YXIgaXNDbG9zZSA9IHN0cmVhbS5lYXQoIi8iKTsKICAgICAgICB0YWdOYW1lID0gIiI7CiAgICAgICAgdmFyIGM7CiAgICAgICAgd2hpbGUgKChjID0gc3RyZWFtLmVhdCgvW15cc1x1MDBhMD08PlwiXCdcLz9dLykpKSB0YWdOYW1lICs9IGM7CiAgICAgICAgaWYgKCF0YWdOYW1lKSByZXR1cm4gImVycm9yIjsKICAgICAgICB0eXBlID0gaXNDbG9zZSA/ICJjbG9zZVRhZyIgOiAib3BlblRhZyI7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRhZzsKICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICImIikgewogICAgICB2YXIgb2s7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIjIikpIHsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgieCIpKSB7CiAgICAgICAgICBvayA9IHN0cmVhbS5lYXRXaGlsZSgvW2EtZkEtRlxkXS8pICYmIHN0cmVhbS5lYXQoIjsiKTsgICAgICAgICAgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9rID0gc3RyZWFtLmVhdFdoaWxlKC9bXGRdLykgJiYgc3RyZWFtLmVhdCgiOyIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBvayA9IHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5cLTpdLykgJiYgc3RyZWFtLmVhdCgiOyIpOwogICAgICB9CiAgICAgIHJldHVybiBvayA/ICJhdG9tIiA6ICJlcnJvciI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXiY8XS8pOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluVGFnKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gIj4iIHx8IChjaCA9PSAiLyIgJiYgc3RyZWFtLmVhdCgiPiIpKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGluVGV4dDsKICAgICAgdHlwZSA9IGNoID09ICI+IiA/ICJlbmRUYWciIDogInNlbGZjbG9zZVRhZyI7CiAgICAgIHJldHVybiAidGFnIjsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICI9IikgewogICAgICB0eXBlID0gImVxdWFscyI7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZWxzZSBpZiAoL1tcJ1wiXS8udGVzdChjaCkpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBpbkF0dHJpYnV0ZShjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1teXHNcdTAwYTA9PD5cIlwnXS8pOwogICAgICByZXR1cm4gIndvcmQiOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5BdHRyaWJ1dGUocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5uZXh0KCkgPT0gcXVvdGUpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UYWc7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGluQmxvY2soc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCh0ZXJtaW5hdG9yKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRleHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkb2N0eXBlKGRlcHRoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09ICI8IikgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBkb2N0eXBlKGRlcHRoICsgMSk7CiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiPiIpIHsKICAgICAgICAgIGlmIChkZXB0aCA9PSAxKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gZG9jdHlwZShkZXB0aCAtIDEpOwogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAibWV0YSI7CiAgICB9OwogIH0KCiAgdmFyIGN1clN0YXRlLCBzZXRTdHlsZTsKICBmdW5jdGlvbiBwYXNzKCkgewogICAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgY3VyU3RhdGUuY2MucHVzaChhcmd1bWVudHNbaV0pOwogIH0KICBmdW5jdGlvbiBjb250KCkgewogICAgcGFzcy5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBwdXNoQ29udGV4dCh0YWdOYW1lLCBzdGFydE9mTGluZSkgewogICAgdmFyIG5vSW5kZW50ID0gS2x1ZGdlcy5kb05vdEluZGVudC5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSB8fCAoY3VyU3RhdGUuY29udGV4dCAmJiBjdXJTdGF0ZS5jb250ZXh0Lm5vSW5kZW50KTsKICAgIGN1clN0YXRlLmNvbnRleHQgPSB7CiAgICAgIHByZXY6IGN1clN0YXRlLmNvbnRleHQsCiAgICAgIHRhZ05hbWU6IHRhZ05hbWUsCiAgICAgIGluZGVudDogY3VyU3RhdGUuaW5kZW50ZWQsCiAgICAgIHN0YXJ0T2ZMaW5lOiBzdGFydE9mTGluZSwKICAgICAgbm9JbmRlbnQ6IG5vSW5kZW50CiAgICB9OwogIH0KICBmdW5jdGlvbiBwb3BDb250ZXh0KCkgewogICAgaWYgKGN1clN0YXRlLmNvbnRleHQpIGN1clN0YXRlLmNvbnRleHQgPSBjdXJTdGF0ZS5jb250ZXh0LnByZXY7CiAgfQoKICBmdW5jdGlvbiBlbGVtZW50KHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJvcGVuVGFnIikgewogICAgICBjdXJTdGF0ZS50YWdOYW1lID0gdGFnTmFtZTsKICAgICAgcmV0dXJuIGNvbnQoYXR0cmlidXRlcywgZW5kdGFnKGN1clN0YXRlLnN0YXJ0T2ZMaW5lKSk7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImNsb3NlVGFnIikgewogICAgICB2YXIgZXJyID0gZmFsc2U7CiAgICAgIGlmIChjdXJTdGF0ZS5jb250ZXh0KSB7CiAgICAgICAgaWYgKGN1clN0YXRlLmNvbnRleHQudGFnTmFtZSAhPSB0YWdOYW1lKSB7CiAgICAgICAgICBpZiAoS2x1ZGdlcy5pbXBsaWNpdGx5Q2xvc2VkLmhhc093blByb3BlcnR5KGN1clN0YXRlLmNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBlcnIgPSAhY3VyU3RhdGUuY29udGV4dCB8fCBjdXJTdGF0ZS5jb250ZXh0LnRhZ05hbWUgIT0gdGFnTmFtZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXJyID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoZXJyKSBzZXRTdHlsZSA9ICJlcnJvciI7CiAgICAgIHJldHVybiBjb250KGVuZGNsb3NldGFnKGVycikpOwogICAgfQogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gZW5kdGFnKHN0YXJ0T2ZMaW5lKSB7CiAgICByZXR1cm4gZnVuY3Rpb24odHlwZSkgewogICAgICB2YXIgdGFnTmFtZSA9IGN1clN0YXRlLnRhZ05hbWU7CiAgICAgIGN1clN0YXRlLnRhZ05hbWUgPSBudWxsOwogICAgICBpZiAodHlwZSA9PSAic2VsZmNsb3NlVGFnIiB8fAogICAgICAgICAgKHR5cGUgPT0gImVuZFRhZyIgJiYgS2x1ZGdlcy5hdXRvU2VsZkNsb3NlcnMuaGFzT3duUHJvcGVydHkodGFnTmFtZS50b0xvd2VyQ2FzZSgpKSkpIHsKICAgICAgICBtYXliZVBvcENvbnRleHQodGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgICAgICByZXR1cm4gY29udCgpOwogICAgICB9CiAgICAgIGlmICh0eXBlID09ICJlbmRUYWciKSB7CiAgICAgICAgbWF5YmVQb3BDb250ZXh0KHRhZ05hbWUudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgcHVzaENvbnRleHQodGFnTmFtZSwgc3RhcnRPZkxpbmUpOwogICAgICAgIHJldHVybiBjb250KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnQoKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGVuZGNsb3NldGFnKGVycikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgaWYgKGVycikgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgICBpZiAodHlwZSA9PSAiZW5kVGFnIikgeyBwb3BDb250ZXh0KCk7IHJldHVybiBjb250KCk7IH0KICAgICAgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgICByZXR1cm4gY29udChhcmd1bWVudHMuY2FsbGVlKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIG1heWJlUG9wQ29udGV4dChuZXh0VGFnTmFtZSkgewogICAgdmFyIHBhcmVudFRhZ05hbWU7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoIWN1clN0YXRlLmNvbnRleHQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgcGFyZW50VGFnTmFtZSA9IGN1clN0YXRlLmNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAoIUtsdWRnZXMuY29udGV4dEdyYWJiZXJzLmhhc093blByb3BlcnR5KHBhcmVudFRhZ05hbWUpIHx8CiAgICAgICAgICAhS2x1ZGdlcy5jb250ZXh0R3JhYmJlcnNbcGFyZW50VGFnTmFtZV0uaGFzT3duUHJvcGVydHkobmV4dFRhZ05hbWUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHBvcENvbnRleHQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGF0dHJpYnV0ZXModHlwZSkgewogICAgaWYgKHR5cGUgPT0gIndvcmQiKSB7c2V0U3R5bGUgPSAiYXR0cmlidXRlIjsgcmV0dXJuIGNvbnQoYXR0cmlidXRlLCBhdHRyaWJ1dGVzKTt9CiAgICBpZiAodHlwZSA9PSAiZW5kVGFnIiB8fCB0eXBlID09ICJzZWxmY2xvc2VUYWciKSByZXR1cm4gcGFzcygpOwogICAgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgcmV0dXJuIGNvbnQoYXR0cmlidXRlcyk7CiAgfQogIGZ1bmN0aW9uIGF0dHJpYnV0ZSh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiZXF1YWxzIikgcmV0dXJuIGNvbnQoYXR0dmFsdWUsIGF0dHJpYnV0ZXMpOwogICAgaWYgKCFLbHVkZ2VzLmFsbG93TWlzc2luZykgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgZWxzZSBpZiAodHlwZSA9PSAid29yZCIpIHNldFN0eWxlID0gImF0dHJpYnV0ZSI7CiAgICByZXR1cm4gKHR5cGUgPT0gImVuZFRhZyIgfHwgdHlwZSA9PSAic2VsZmNsb3NlVGFnIikgPyBwYXNzKCkgOiBjb250KCk7CiAgfQogIGZ1bmN0aW9uIGF0dHZhbHVlKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJzdHJpbmciKSByZXR1cm4gY29udChhdHR2YWx1ZW1heWJlKTsKICAgIGlmICh0eXBlID09ICJ3b3JkIiAmJiBLbHVkZ2VzLmFsbG93VW5xdW90ZWQpIHtzZXRTdHlsZSA9ICJzdHJpbmciOyByZXR1cm4gY29udCgpO30KICAgIHNldFN0eWxlID0gImVycm9yIjsKICAgIHJldHVybiAodHlwZSA9PSAiZW5kVGFnIiB8fCB0eXBlID09ICJzZWxmQ2xvc2VUYWciKSA/IHBhc3MoKSA6IGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gYXR0dmFsdWVtYXliZSh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAic3RyaW5nIikgcmV0dXJuIGNvbnQoYXR0dmFsdWVtYXliZSk7CiAgICBlbHNlIHJldHVybiBwYXNzKCk7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IGluVGV4dCwgY2M6IFtdLCBpbmRlbnRlZDogMCwgc3RhcnRPZkxpbmU6IHRydWUsIHRhZ05hbWU6IG51bGwsIGNvbnRleHQ6IG51bGx9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSB0cnVlOwogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKCiAgICAgIHNldFN0eWxlID0gdHlwZSA9IHRhZ05hbWUgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgc3RhdGUudHlwZSA9IHR5cGU7CiAgICAgIGlmICgoc3R5bGUgfHwgdHlwZSkgJiYgc3R5bGUgIT0gImNvbW1lbnQiKSB7CiAgICAgICAgY3VyU3RhdGUgPSBzdGF0ZTsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgdmFyIGNvbWIgPSBzdGF0ZS5jYy5wb3AoKSB8fCBlbGVtZW50OwogICAgICAgICAgaWYgKGNvbWIodHlwZSB8fCBzdHlsZSkpIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlOwogICAgICByZXR1cm4gc2V0U3R5bGUgfHwgc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlciwgZnVsbExpbmUpIHsKICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoKHN0YXRlLnRva2VuaXplICE9IGluVGFnICYmIHN0YXRlLnRva2VuaXplICE9IGluVGV4dCkgfHwKICAgICAgICAgIGNvbnRleHQgJiYgY29udGV4dC5ub0luZGVudCkKICAgICAgICByZXR1cm4gZnVsbExpbmUgPyBmdWxsTGluZS5tYXRjaCgvXihccyopLylbMF0ubGVuZ3RoIDogMDsKICAgICAgaWYgKGFsaWduQ0RBVEEgJiYgLzwhXFtDREFUQVxbLy50ZXN0KHRleHRBZnRlcikpIHJldHVybiAwOwogICAgICBpZiAoY29udGV4dCAmJiAvXjxcLy8udGVzdCh0ZXh0QWZ0ZXIpKQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgIHdoaWxlIChjb250ZXh0ICYmICFjb250ZXh0LnN0YXJ0T2ZMaW5lKQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgIGlmIChjb250ZXh0KSByZXR1cm4gY29udGV4dC5pbmRlbnQgKyBpbmRlbnRVbml0OwogICAgICBlbHNlIHJldHVybiAwOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAiLyIsCgogICAgY29uZmlndXJhdGlvbjogcGFyc2VyQ29uZmlnLmh0bWxNb2RlID8gImh0bWwiIDogInhtbCIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94bWwiLCAieG1sIik7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veG1sIiwgInhtbCIpOwppZiAoIUNvZGVNaXJyb3IubWltZU1vZGVzLmhhc093blByb3BlcnR5KCJ0ZXh0L2h0bWwiKSkKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvaHRtbCIsIHtuYW1lOiAieG1sIiwgaHRtbE1vZGU6IHRydWV9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/xquery/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/xquery/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+IAo8aHRtbD4gCjwhLS0KLyoKQ29weXJpZ2h0IChDKSAyMDExIGJ5IE1hcmtMb2dpYyBDb3Jwb3JhdGlvbgpBdXRob3I6IE1pa2UgQnJldm9vcnQgPG1pa2VAYnJldm9vcnQuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KKi8KLS0+CiAgPGhlYWQ+IAogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFhRdWVyeSBtb2RlPC90aXRsZT4gCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+IAogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4gCiAgICA8c2NyaXB0IHNyYz0ieHF1ZXJ5LmpzIj48L3NjcmlwdD4gCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+IAogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS94cS1kYXJrLmNzcyI+IAogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5Db2RlTWlycm9yIHsKCSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7CgkgIGhlaWdodDo0MDBweDsKCX0KICAgIDwvc3R5bGU+IAogIDwvaGVhZD4gCiAgPGJvZHk+IAogICAgPGgxPkNvZGVNaXJyb3I6IFhRdWVyeSBtb2RlPC9oMT4gCiAKPGRpdiBjbGFzcz0iY20tcy1kZWZhdWx0Ij4gCgk8dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPiAKeHF1ZXJ5IHZlcnNpb24gJnF1b3Q7MS4wLW1sJnF1b3Q7OwooOiB0aGlzIGlzCiA6IGEgCiAgICJjb21tZW50IiA6KQpsZXQgJGxldCA6PSAmbHQ7eCBhdHRyPSZxdW90O3ZhbHVlJnF1b3Q7Jmd0OyZxdW90O3Rlc3QmcXVvdDsmbHQ7ZnVuYyZndDtmdW5jdGlvbigpICR2YXIge2Z1bmN0aW9uKCl9IHskdmFyfSZsdDsvZnVuYyZndDsmbHQ7L3gmZ3Q7CmxldCAkam9lOj0xCnJldHVybiBlbGVtZW50IGVsZW1lbnQgewoJYXR0cmlidXRlIGF0dHJpYnV0ZSB7IDEgfSwKCWVsZW1lbnQgdGVzdCB7ICYjMzk7YSYjMzk7IH0sIAoJYXR0cmlidXRlIGZvbyB7ICZxdW90O2JhciZxdW90OyB9LAoJZm46ZG9jKClbIGZvby9AYmFyIGVxICRsZXQgXSwKCS8veCB9ICAgIAogCig6IGEgbW9yZSAnZXZpbCcgdGVzdCA6KQooOiBNb2RpZmllZCBCbGFrZWxleSBleGFtcGxlICg6IHdpdGggbmVzdGVkIGNvbW1lbnQgOikgLi4uIDopCmRlY2xhcmUgcHJpdmF0ZSBmdW5jdGlvbiBsb2NhbDpkZWNsYXJlKCkgeygpfTsKZGVjbGFyZSBwcml2YXRlIGZ1bmN0aW9uIGxvY2FsOnByaXZhdGUoKSB7KCl9OwpkZWNsYXJlIHByaXZhdGUgZnVuY3Rpb24gbG9jYWw6ZnVuY3Rpb24oKSB7KCl9OwpkZWNsYXJlIHByaXZhdGUgZnVuY3Rpb24gbG9jYWw6bG9jYWwoKSB7KCl9OwpsZXQgJGxldCA6PSAmbHQ7bGV0Jmd0O2xldCAkbGV0IDo9ICZxdW90O2xldCZxdW90OyZsdDsvbGV0Jmd0OwpyZXR1cm4gZWxlbWVudCBlbGVtZW50IHsKCWF0dHJpYnV0ZSBhdHRyaWJ1dGUgeyB0cnkgeyB4ZG1wOnZlcnNpb24oKSB9IGNhdGNoKCRlKSB7IHhkbXA6bG9nKCRlKSB9IH0sCglhdHRyaWJ1dGUgZm46ZG9jIHsgJnF1b3Q7YmFyJnF1b3Q7IGNhc3RhYmxlIGFzIHhzOnN0cmluZyB9LAoJZWxlbWVudCB0ZXh0IHsgdGV4dCB7ICZxdW90O3RleHQmcXVvdDsgfSB9LAoJZm46ZG9jKClbIGNoaWxkOjplcS8oQGJhciB8IGF0dHJpYnV0ZTo6YXR0cmlidXRlKSBlcSAkbGV0IF0sCgkvL2ZuOmRvYwp9CgoKCnhxdWVyeSB2ZXJzaW9uICZxdW90OzEuMC1tbCZxdW90OzsKCig6IENvcHlyaWdodCAyMDA2LTIwMTAgTWFyayBMb2dpYyBDb3Jwb3JhdGlvbi4gOikKCig6CiA6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAmcXVvdDtMaWNlbnNlJnF1b3Q7KTsKIDogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogOiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIDoKIDogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogOgogOiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiA6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLAogOiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIDogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogOiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIDopCgptb2R1bGUgbmFtZXNwYWNlIGpzb24gPSAmcXVvdDtodHRwOi8vbWFya2xvZ2ljLmNvbS9qc29uJnF1b3Q7OwpkZWNsYXJlIGRlZmF1bHQgZnVuY3Rpb24gbmFtZXNwYWNlICZxdW90O2h0dHA6Ly93d3cudzMub3JnLzIwMDUveHBhdGgtZnVuY3Rpb25zJnF1b3Q7OwoKKDogTmVlZCB0byBiYWNrc2xhc2ggZXNjYXBlIGFueSBkb3VibGUgcXVvdGVzLCBiYWNrc2xhc2hlcywgYW5kIG5ld2xpbmVzIDopCmRlY2xhcmUgZnVuY3Rpb24ganNvbjplc2NhcGUoJHMgYXMgeHM6c3RyaW5nKSBhcyB4czpzdHJpbmcgewogIGxldCAkcyA6PSByZXBsYWNlKCRzLCAmcXVvdDtcXCZxdW90OywgJnF1b3Q7XFxcXCZxdW90OykKICBsZXQgJHMgOj0gcmVwbGFjZSgkcywgJnF1b3Q7JnF1b3Q7JnF1b3Q7JnF1b3Q7LCAmcXVvdDtcXCZxdW90OyZxdW90OyZxdW90OykKICBsZXQgJHMgOj0gcmVwbGFjZSgkcywgY29kZXBvaW50cy10by1zdHJpbmcoKDEzLCAxMCkpLCAmcXVvdDtcXG4mcXVvdDspCiAgbGV0ICRzIDo9IHJlcGxhY2UoJHMsIGNvZGVwb2ludHMtdG8tc3RyaW5nKDEzKSwgJnF1b3Q7XFxuJnF1b3Q7KQogIGxldCAkcyA6PSByZXBsYWNlKCRzLCBjb2RlcG9pbnRzLXRvLXN0cmluZygxMCksICZxdW90O1xcbiZxdW90OykKICByZXR1cm4gJHMKfTsKCmRlY2xhcmUgZnVuY3Rpb24ganNvbjphdG9taXplKCR4IGFzIGVsZW1lbnQoKSkgYXMgeHM6c3RyaW5nIHsKICBpZiAoY291bnQoJHgvbm9kZSgpKSA9IDApIHRoZW4gJ251bGwnCiAgZWxzZSBpZiAoJHgvQHR5cGUgPSAmcXVvdDtudW1iZXImcXVvdDspIHRoZW4KICAgIGxldCAkY2FzdGFibGUgOj0gJHggY2FzdGFibGUgYXMgeHM6ZmxvYXQgb3IKICAgICAgICAgICAgICAgICAgICAgJHggY2FzdGFibGUgYXMgeHM6ZG91YmxlIG9yCiAgICAgICAgICAgICAgICAgICAgICR4IGNhc3RhYmxlIGFzIHhzOmRlY2ltYWwKICAgIHJldHVybgogICAgaWYgKCRjYXN0YWJsZSkgdGhlbiB4czpzdHJpbmcoJHgpCiAgICBlbHNlIGVycm9yKGNvbmNhdCgmcXVvdDtOb3QgYSBudW1iZXI6ICZxdW90OywgeGRtcDpkZXNjcmliZSgkeCkpKQogIGVsc2UgaWYgKCR4L0B0eXBlID0gJnF1b3Q7Ym9vbGVhbiZxdW90OykgdGhlbgogICAgbGV0ICRjYXN0YWJsZSA6PSAkeCBjYXN0YWJsZSBhcyB4czpib29sZWFuCiAgICByZXR1cm4KICAgIGlmICgkY2FzdGFibGUpIHRoZW4geHM6c3RyaW5nKHhzOmJvb2xlYW4oJHgpKQogICAgZWxzZSBlcnJvcihjb25jYXQoJnF1b3Q7Tm90IGEgYm9vbGVhbjogJnF1b3Q7LCB4ZG1wOmRlc2NyaWJlKCR4KSkpCiAgZWxzZSBjb25jYXQoJyZxdW90OycsIGpzb246ZXNjYXBlKCR4KSwgJyZxdW90OycpCn07CgooOiBQcmludCB0aGUgdGhpbmcgdGhhdCBjb21lcyBhZnRlciB0aGUgY29sb24gOikKZGVjbGFyZSBmdW5jdGlvbiBqc29uOnByaW50LXZhbHVlKCR4IGFzIGVsZW1lbnQoKSkgYXMgeHM6c3RyaW5nIHsKICBpZiAoY291bnQoJHgvKikgPSAwKSB0aGVuCiAgICBqc29uOmF0b21pemUoJHgpCiAgZWxzZSBpZiAoJHgvQHF1b3RlID0gJnF1b3Q7dHJ1ZSZxdW90OykgdGhlbgogICAgY29uY2F0KCcmcXVvdDsnLCBqc29uOmVzY2FwZSh4ZG1wOnF1b3RlKCR4L25vZGUoKSkpLCAnJnF1b3Q7JykKICBlbHNlCiAgICBzdHJpbmctam9pbigoJ3snLAogICAgICBzdHJpbmctam9pbihmb3IgJGkgaW4gJHgvKiByZXR1cm4ganNvbjpwcmludC1uYW1lLXZhbHVlKCRpKSwgJnF1b3Q7LCZxdW90OyksCiAgICAnfScpLCAmcXVvdDsmcXVvdDspCn07CgooOiBQcmludCB0aGUgbmFtZSBhbmQgdmFsdWUgYm90aCA6KQpkZWNsYXJlIGZ1bmN0aW9uIGpzb246cHJpbnQtbmFtZS12YWx1ZSgkeCBhcyBlbGVtZW50KCkpIGFzIHhzOnN0cmluZz8gewogIGxldCAkbmFtZSA6PSBuYW1lKCR4KQogIGxldCAkZmlyc3QtaW4tYXJyYXkgOj0KICAgIGNvdW50KCR4L3ByZWNlZGluZy1zaWJsaW5nOjoqW25hbWUoLikgPSAkbmFtZV0pID0gMCBhbmQKICAgIChjb3VudCgkeC9mb2xsb3dpbmctc2libGluZzo6KltuYW1lKC4pID0gJG5hbWVdKSAmZ3Q7IDAgb3IgJHgvQGFycmF5ID0gJnF1b3Q7dHJ1ZSZxdW90OykKICBsZXQgJGxhdGVyLWluLWFycmF5IDo9IGNvdW50KCR4L3ByZWNlZGluZy1zaWJsaW5nOjoqW25hbWUoLikgPSAkbmFtZV0pICZndDsgMAogIHJldHVybgoKICBpZiAoJGxhdGVyLWluLWFycmF5KSB0aGVuCiAgICAoKSAgKDogSSB3YXMgaGFuZGxlZCBwcmV2aW91c2x5IDopCiAgZWxzZSBpZiAoJGZpcnN0LWluLWFycmF5KSB0aGVuCiAgICBzdHJpbmctam9pbigoJyZxdW90OycsIGpzb246ZXNjYXBlKCRuYW1lKSwgJyZxdW90OzpbJywKICAgICAgc3RyaW5nLWpvaW4oKGZvciAkaSBpbiAoJHgsICR4L2ZvbGxvd2luZy1zaWJsaW5nOjoqW25hbWUoLikgPSAkbmFtZV0pIHJldHVybiBqc29uOnByaW50LXZhbHVlKCRpKSksICZxdW90OywmcXVvdDspLAogICAgJ10nKSwgJnF1b3Q7JnF1b3Q7KQogICBlbHNlCiAgICAgc3RyaW5nLWpvaW4oKCcmcXVvdDsnLCBqc29uOmVzY2FwZSgkbmFtZSksICcmcXVvdDs6JywganNvbjpwcmludC12YWx1ZSgkeCkpLCAmcXVvdDsmcXVvdDspCn07CgooOn4KICBUcmFuc2Zvcm1zIGFuIFhNTCBlbGVtZW50IGludG8gYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbi4gIFNlZSBodHRwOi8vanNvbi5vcmcuCiAgJmx0O3AvJmd0OwogIFNhbXBsZSB1c2FnZToKICAmbHQ7cHJlJmd0OwogICAgeHF1ZXJ5IHZlcnNpb24gJnF1b3Q7MS4wLW1sJnF1b3Q7OwogICAgaW1wb3J0IG1vZHVsZSBuYW1lc3BhY2UganNvbj0mcXVvdDtodHRwOi8vbWFya2xvZ2ljLmNvbS9qc29uJnF1b3Q7IGF0ICZxdW90O2pzb24ueHF5JnF1b3Q7OwogICAganNvbjpzZXJpYWxpemUoJmFtcDtsdDtmb28mYW1wO2d0OyZhbXA7bHQ7YmFyJmFtcDtndDtraWQmYW1wO2x0Oy9iYXImYW1wO2d0OyZhbXA7bHQ7L2ZvbyZhbXA7Z3Q7KQogICZsdDsvcHJlJmd0OwogIFNhbXBsZSB0cmFuc2Zvcm1hdGlvbnM6CiAgJmx0O3ByZSZndDsKICAmYW1wO2x0O2UvJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90OzpudWxsfQogICZhbXA7bHQ7ZSZhbXA7Z3Q7dGV4dCZhbXA7bHQ7L2UmYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7OiZxdW90O3RleHQmcXVvdDt9CiAgJmFtcDtsdDtlJmFtcDtndDtxdW90ZSAmcXVvdDsgZXNjYXBpbmcmYW1wO2x0Oy9lJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90OzomcXVvdDtxdW90ZSBcJnF1b3Q7IGVzY2FwaW5nJnF1b3Q7fQogICZhbXA7bHQ7ZSZhbXA7Z3Q7YmFja3NsYXNoIFwgZXNjYXBpbmcmYW1wO2x0Oy9lJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90OzomcXVvdDtiYWNrc2xhc2ggXFwgZXNjYXBpbmcmcXVvdDt9CiAgJmFtcDtsdDtlJmFtcDtndDsmYW1wO2x0O2EmYW1wO2d0O3RleHQxJmFtcDtsdDsvYSZhbXA7Z3Q7JmFtcDtsdDtiJmFtcDtndDt0ZXh0MiZhbXA7bHQ7L2ImYW1wO2d0OyZhbXA7bHQ7L2UmYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7OnsmcXVvdDthJnF1b3Q7OiZxdW90O3RleHQxJnF1b3Q7LCZxdW90O2ImcXVvdDs6JnF1b3Q7dGV4dDImcXVvdDt9fQogICZhbXA7bHQ7ZSZhbXA7Z3Q7JmFtcDtsdDthJmFtcDtndDt0ZXh0MSZhbXA7bHQ7L2EmYW1wO2d0OyZhbXA7bHQ7YSZhbXA7Z3Q7dGV4dDImYW1wO2x0Oy9hJmFtcDtndDsmYW1wO2x0Oy9lJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90Ozp7JnF1b3Q7YSZxdW90OzpbJnF1b3Q7dGV4dDEmcXVvdDssJnF1b3Q7dGV4dDImcXVvdDtdfX0KICAmYW1wO2x0O2UmYW1wO2d0OyZhbXA7bHQ7YSBhcnJheT0mcXVvdDt0cnVlJnF1b3Q7JmFtcDtndDt0ZXh0MSZhbXA7bHQ7L2EmYW1wO2d0OyZhbXA7bHQ7L2UmYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7OnsmcXVvdDthJnF1b3Q7OlsmcXVvdDt0ZXh0MSZxdW90O119fQogICZhbXA7bHQ7ZSZhbXA7Z3Q7JmFtcDtsdDthIHR5cGU9JnF1b3Q7Ym9vbGVhbiZxdW90OyZhbXA7Z3Q7ZmFsc2UmYW1wO2x0Oy9hJmFtcDtndDsmYW1wO2x0Oy9lJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90Ozp7JnF1b3Q7YSZxdW90OzpmYWxzZX19CiAgJmFtcDtsdDtlJmFtcDtndDsmYW1wO2x0O2EgdHlwZT0mcXVvdDtudW1iZXImcXVvdDsmYW1wO2d0OzEyMy41JmFtcDtsdDsvYSZhbXA7Z3Q7JmFtcDtsdDsvZSZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6eyZxdW90O2EmcXVvdDs6MTIzLjV9fQogICZhbXA7bHQ7ZSBxdW90ZT0mcXVvdDt0cnVlJnF1b3Q7JmFtcDtndDsmYW1wO2x0O2RpdiBhdHRyaWI9JnF1b3Q7dmFsdWUmcXVvdDsvJmFtcDtndDsmYW1wO2x0Oy9lJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90OzomcXVvdDsmYW1wO2x0O2RpdiBhdHRyaWI9XCZxdW90O3ZhbHVlXCZxdW90Oy8mYW1wO2d0OyZxdW90O30KICAmbHQ7L3ByZSZndDsKICAmbHQ7cC8mZ3Q7CiAgTmFtZXNwYWNlIFVSSXMgYXJlIGlnbm9yZWQuICBOYW1lc3BhY2UgcHJlZml4ZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBKU09OIG5hbWUuCiAgJmx0O3AvJmd0OwogIEF0dHJpYnV0ZXMgYXJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgdGhlIHNwZWNpYWwgYXR0cmlidXRlIEBhcnJheT0mcXVvdDt0cnVlJnF1b3Q7IHRoYXQKICBpbmRpY2F0ZXMgdGhlIEpTT04gc2VyaWFsaXphdGlvbiBzaG91bGQgd3JpdGUgdGhlIG5vZGUsIGV2ZW4gaWYgc2luZ2xlLCBhcyBhbgogIGFycmF5LCBhbmQgdGhlIGF0dHJpYnV0ZSBAdHlwZSB0aGF0IGNhbiBiZSBzZXQgdG8gJnF1b3Q7Ym9vbGVhbiZxdW90OyBvciAmcXVvdDtudW1iZXImcXVvdDsgdG8KICBkaWN0YXRlIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiBhcyB0aGF0IHR5cGUgKHVucXVvdGVkKS4gIFRoZXJlJ3MgYWxzbwogIGFuIEBxdW90ZSBhdHRyaWJ1dGUgdGhhdCB3aGVuIHNldCB0byB0cnVlIHdyaXRlcyB0aGUgaW5uZXIgY29udGVudCBhcyB0ZXh0CiAgcmF0aGVyIHRoYW4gYXMgc3RydWN0dXJlZCBKU09OLCB1c2VmdWwgZm9yIHNlbmRpbmcgc29tZSBYSFRNTCBvdmVyIHRoZQogIHdpcmUuCiAgJmx0O3AvJmd0OwogIFRleHQgbm9kZXMgd2l0aGluIG1peGVkIGNvbnRlbnQgYXJlIGlnbm9yZWQuCgogIEBwYXJhbSAkeCBFbGVtZW50IG5vZGUgdG8gY29udmVydAogIEByZXR1cm4gU3RyaW5nIGhvbGRpbmcgSlNPTiBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIG9mICR4CgogIEBhdXRob3IgSmFzb24gSHVudGVyCiAgQHZlcnNpb24gMS4wLjEKICAKICBQb3J0ZWQgdG8geHF1ZXJ5IDEuMC1tbDsgZG91YmxlIGVzY2FwZWQgYmFja3NsYXNoZXMgaW4ganNvbjplc2NhcGUKOikKZGVjbGFyZSBmdW5jdGlvbiBqc29uOnNlcmlhbGl6ZSgkeCBhcyBlbGVtZW50KCkpICBhcyB4czpzdHJpbmcgewogIHN0cmluZy1qb2luKCgneycsIGpzb246cHJpbnQtbmFtZS12YWx1ZSgkeCksICd9JyksICZxdW90OyZxdW90OykKfTsKICA8L3RleHRhcmVhPiAKPC9kaXY+IAogCiAgICA8c2NyaXB0PiAKICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIHRoZW1lOiAieHEtZGFyayIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4gCiAKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT5hcHBsaWNhdGlvbi94cXVlcnk8L2NvZGU+LjwvcD4gCiAKICAgIDxwPkRldmVsb3BtZW50IG9mIHRoZSBDb2RlTWlycm9yIFhRdWVyeSBtb2RlIHdhcyBzcG9uc29yZWQgYnkgCiAgICAgIDxhIGhyZWY9Imh0dHA6Ly9tYXJrbG9naWMuY29tIj5NYXJrTG9naWM8L2E+IGFuZCBkZXZlbG9wZWQgYnkgCiAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vbWJyZXZvb3J0Ij5NaWtlIEJyZXZvb3J0PC9hPi4KICAgIDwvcD4KIAogIDwvYm9keT4gCjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/xquery/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChDKSAyMDExIGJ5IE1hcmtMb2dpYyBDb3Jwb3JhdGlvbgpBdXRob3I6IE1pa2UgQnJldm9vcnQgPG1pa2VAYnJldm9vcnQuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/xquery/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gSW5pdGlhdGUgTW9kZVRlc3QgYW5kIHNldCBkZWZhdWx0cwp2YXIgTVQgPSBNb2RlVGVzdDsKTVQubW9kZU5hbWUgPSAieHF1ZXJ5IjsKTVQubW9kZU9wdGlvbnMgPSB7fTsKCk1ULnRlc3RNb2RlKCJldmlsdGVzdCIsCiAgICAgICAgICAgICd4cXVlcnkgdmVyc2lvbiAmcXVvdDsxLjAtbWwmcXVvdDs7XAogICAgICAoOiB0aGlzIGlzXAogICAgICAgOiBhIFwKICAgICAgICAgImNvbW1lbnQiIDopXAogICAgICBsZXQgJGxldCA6PSAmbHQ7eCBhdHRyPSZxdW90O3ZhbHVlJnF1b3Q7Jmd0OyZxdW90O3Rlc3QmcXVvdDsmbHQ7ZnVuYyZndDtmdW5jdGlvbigpICR2YXIge2Z1bmN0aW9uKCl9IHskdmFyfSZsdDsvZnVuYyZndDsmbHQ7L3gmZ3Q7XAogICAgICBsZXQgJGpvZTo9MVwKICAgICAgcmV0dXJuIGVsZW1lbnQgZWxlbWVudCB7XAogICAgICAgICAgYXR0cmlidXRlIGF0dHJpYnV0ZSB7IDEgfSxcCiAgICAgICAgICBlbGVtZW50IHRlc3QgeyAmIzM5O2EmIzM5OyB9LCBcCiAgICAgICAgICBhdHRyaWJ1dGUgZm9vIHsgJnF1b3Q7YmFyJnF1b3Q7IH0sXAogICAgICAgICAgZm46ZG9jKClbIGZvby9AYmFyIGVxICRsZXQgXSxcCiAgICAgICAgICAvL3ggfSAgICBcCiAgICAgICBcCiAgICAgICg6IGEgbW9yZSBcJ2V2aWxcJyB0ZXN0IDopXAogICAgICAoOiBNb2RpZmllZCBCbGFrZWxleSBleGFtcGxlICg6IHdpdGggbmVzdGVkIGNvbW1lbnQgOikgLi4uIDopXAogICAgICBkZWNsYXJlIHByaXZhdGUgZnVuY3Rpb24gbG9jYWw6ZGVjbGFyZSgpIHsoKX07XAogICAgICBkZWNsYXJlIHByaXZhdGUgZnVuY3Rpb24gbG9jYWw6cHJpdmF0ZSgpIHsoKX07XAogICAgICBkZWNsYXJlIHByaXZhdGUgZnVuY3Rpb24gbG9jYWw6ZnVuY3Rpb24oKSB7KCl9O1wKICAgICAgZGVjbGFyZSBwcml2YXRlIGZ1bmN0aW9uIGxvY2FsOmxvY2FsKCkgeygpfTtcCiAgICAgIGxldCAkbGV0IDo9ICZsdDtsZXQmZ3Q7bGV0ICRsZXQgOj0gJnF1b3Q7bGV0JnF1b3Q7Jmx0Oy9sZXQmZ3Q7XAogICAgICByZXR1cm4gZWxlbWVudCBlbGVtZW50IHtcCiAgICAgICAgICBhdHRyaWJ1dGUgYXR0cmlidXRlIHsgdHJ5IHsgeGRtcDp2ZXJzaW9uKCkgfSBjYXRjaCgkZSkgeyB4ZG1wOmxvZygkZSkgfSB9LFwKICAgICAgICAgIGF0dHJpYnV0ZSBmbjpkb2MgeyAmcXVvdDtiYXImcXVvdDsgY2FzdGFibGUgYXMgeHM6c3RyaW5nIH0sXAogICAgICAgICAgZWxlbWVudCB0ZXh0IHsgdGV4dCB7ICZxdW90O3RleHQmcXVvdDsgfSB9LFwKICAgICAgICAgIGZuOmRvYygpWyBjaGlsZDo6ZXEvKEBiYXIgfCBhdHRyaWJ1dGU6OmF0dHJpYnV0ZSkgZXEgJGxldCBdLFwKICAgICAgICAgIC8vZm46ZG9jXAogICAgICB9JywgWyJrZXl3b3JkIiwieHF1ZXJ5IixudWxsLCIgIiwia2V5d29yZCIsInZlcnNpb24iLG51bGwsIiAiLCJ2YXJpYWJsZSIsIiZxdW90OzEiLCJrZXl3b3JkIiwiLiIsImF0b20iLCIwIiwia2V5d29yZCIsIi0iLCJ2YXJpYWJsZSIsIm1sJnF1b3Q7IiwiZGVmIHZhcmlhYmxlIiwiOyIsbnVsbCwiICAgICAgIiwiY29tbWVudCIsIig6IHRoaXMgaXMgICAgICAgOiBhICAgICAgICAgIFwiY29tbWVudFwiIDopIixudWxsLCIgICAgICAiLCJrZXl3b3JkIiwibGV0IixudWxsLCIgIiwidmFyaWFibGUiLCIkbGV0IixudWxsLCIgIiwia2V5d29yZCIsIjo9IixudWxsLCIgIiwidmFyaWFibGUiLCImbHQ7eCIsbnVsbCwiICIsInZhcmlhYmxlIiwiYXR0ciIsImtleXdvcmQiLCI9IiwidmFyaWFibGUiLCImcXVvdDt2YWx1ZSZxdW90OyZndDsmcXVvdDt0ZXN0JnF1b3Q7Jmx0O2Z1bmMmZ3QiLCJkZWYgdmFyaWFibGUiLCI7ZnVuY3Rpb24iLCIiLCIoKSIsbnVsbCwiICIsInZhcmlhYmxlIiwiJHZhciIsbnVsbCwiICIsIiIsInsiLCJrZXl3b3JkIiwiZnVuY3Rpb24iLCIiLCIoKX0iLG51bGwsIiAiLCIiLCJ7IiwidmFyaWFibGUiLCIkdmFyIiwiIiwifSIsInZhcmlhYmxlIiwiJmx0OyIsImtleXdvcmQiLCIvIiwidmFyaWFibGUiLCJmdW5jJmd0OyZsdDsiLCJrZXl3b3JkIiwiLyIsInZhcmlhYmxlIiwieCZndDsiLG51bGwsIiAgICAgICIsImtleXdvcmQiLCJsZXQiLG51bGwsIiAiLCJ2YXJpYWJsZSIsIiRqb2UiLCJrZXl3b3JkIiwiOj0iLCJhdG9tIiwiMSIsbnVsbCwiICAgICAgIiwia2V5d29yZCIsInJldHVybiIsbnVsbCwiICIsImtleXdvcmQiLCJlbGVtZW50IixudWxsLCIgIiwidmFyaWFibGUiLCJlbGVtZW50IixudWxsLCIgIiwiIiwieyIsbnVsbCwiICAgICAgICAgICIsImtleXdvcmQiLCJhdHRyaWJ1dGUiLG51bGwsIiAiLCJ2YXJpYWJsZSIsImF0dHJpYnV0ZSIsbnVsbCwiICIsIiIsInsiLG51bGwsIiAiLCJhdG9tIiwiMSIsbnVsbCwiICIsIiIsIn0sIixudWxsLCIgICAgICAgICAgIiwia2V5d29yZCIsImVsZW1lbnQiLG51bGwsIiAiLCJ2YXJpYWJsZSIsInRlc3QiLG51bGwsIiAiLCIiLCJ7IixudWxsLCIgIiwidmFyaWFibGUiLCImIzM5O2EmIzM5OyIsbnVsbCwiICIsIiIsIn0sIixudWxsLCIgICAgICAgICAgICIsImtleXdvcmQiLCJhdHRyaWJ1dGUiLG51bGwsIiAiLCJ2YXJpYWJsZSIsImZvbyIsbnVsbCwiICIsIiIsInsiLG51bGwsIiAiLCJ2YXJpYWJsZSIsIiZxdW90O2JhciZxdW90OyIsbnVsbCwiICIsIiIsIn0sIixudWxsLCIgICAgICAgICAgIiwiZGVmIHZhcmlhYmxlIiwiZm46ZG9jIiwiIiwiKClbIixudWxsLCIgIiwidmFyaWFibGUiLCJmb28iLCJrZXl3b3JkIiwiLyIsInZhcmlhYmxlIiwiQGJhciIsbnVsbCwiICIsImtleXdvcmQiLCJlcSIsbnVsbCwiICIsInZhcmlhYmxlIiwiJGxldCIsbnVsbCwiICIsIiIsIl0sIixudWxsLCIgICAgICAgICAgIiwia2V5d29yZCIsIi8vIiwidmFyaWFibGUiLCJ4IixudWxsLCIgIiwiIiwifSIsbnVsbCwiICAgICAgICAgICAgICAgICAiLCJjb21tZW50IiwiKDogYSBtb3JlICdldmlsJyB0ZXN0IDopIixudWxsLCIgICAgICAiLCJjb21tZW50IiwiKDogTW9kaWZpZWQgQmxha2VsZXkgZXhhbXBsZSAoOiB3aXRoIG5lc3RlZCBjb21tZW50IDopIC4uLiA6KSIsbnVsbCwiICAgICAgIiwia2V5d29yZCIsImRlY2xhcmUiLG51bGwsIiAiLCJrZXl3b3JkIiwicHJpdmF0ZSIsbnVsbCwiICIsImtleXdvcmQiLCJmdW5jdGlvbiIsbnVsbCwiICIsImRlZiB2YXJpYWJsZSIsImxvY2FsOmRlY2xhcmUiLCIiLCIoKSIsbnVsbCwiICIsIiIsInsoKX0iLCJ2YXJpYWJsZSIsIjsiLG51bGwsIiAgICAgICIsImtleXdvcmQiLCJkZWNsYXJlIixudWxsLCIgIiwia2V5d29yZCIsInByaXZhdGUiLG51bGwsIiAiLCJrZXl3b3JkIiwiZnVuY3Rpb24iLG51bGwsIiAiLCJkZWYgdmFyaWFibGUiLCJsb2NhbDpwcml2YXRlIiwiIiwiKCkiLG51bGwsIiAiLCIiLCJ7KCl9IiwidmFyaWFibGUiLCI7IixudWxsLCIgICAgICAiLCJrZXl3b3JkIiwiZGVjbGFyZSIsbnVsbCwiICIsImtleXdvcmQiLCJwcml2YXRlIixudWxsLCIgIiwia2V5d29yZCIsImZ1bmN0aW9uIixudWxsLCIgIiwiZGVmIHZhcmlhYmxlIiwibG9jYWw6ZnVuY3Rpb24iLCIiLCIoKSIsbnVsbCwiICIsIiIsInsoKX0iLCJ2YXJpYWJsZSIsIjsiLG51bGwsIiAgICAgICIsImtleXdvcmQiLCJkZWNsYXJlIixudWxsLCIgIiwia2V5d29yZCIsInByaXZhdGUiLG51bGwsIiAiLCJrZXl3b3JkIiwiZnVuY3Rpb24iLG51bGwsIiAiLCJkZWYgdmFyaWFibGUiLCJsb2NhbDpsb2NhbCIsIiIsIigpIixudWxsLCIgIiwiIiwieygpfSIsInZhcmlhYmxlIiwiOyIsbnVsbCwiICAgICAgIiwia2V5d29yZCIsImxldCIsbnVsbCwiICIsInZhcmlhYmxlIiwiJGxldCIsbnVsbCwiICIsImtleXdvcmQiLCI6PSIsbnVsbCwiICIsInZhcmlhYmxlIiwiJmx0O2xldCZndDtsZXQiLG51bGwsIiAiLCJ2YXJpYWJsZSIsIiRsZXQiLG51bGwsIiAiLCJrZXl3b3JkIiwiOj0iLG51bGwsIiAiLCJ2YXJpYWJsZSIsIiZxdW90O2xldCZxdW90OyZsdDsiLCJrZXl3b3JkIiwiL2xldCIsInZhcmlhYmxlIiwiJmd0OyIsbnVsbCwiICAgICAgIiwia2V5d29yZCIsInJldHVybiIsbnVsbCwiICIsImtleXdvcmQiLCJlbGVtZW50IixudWxsLCIgIiwidmFyaWFibGUiLCJlbGVtZW50IixudWxsLCIgIiwiIiwieyIsbnVsbCwiICAgICAgICAgICIsImtleXdvcmQiLCJhdHRyaWJ1dGUiLG51bGwsIiAiLCJ2YXJpYWJsZSIsImF0dHJpYnV0ZSIsbnVsbCwiICIsIiIsInsiLG51bGwsIiAiLCJrZXl3b3JkIiwidHJ5IixudWxsLCIgIiwiIiwieyIsbnVsbCwiICIsImRlZiB2YXJpYWJsZSIsInhkbXA6dmVyc2lvbiIsIiIsIigpIixudWxsLCIgIiwiIiwifSIsbnVsbCwiICIsImtleXdvcmQiLCJjYXRjaCIsIiIsIigiLCJ2YXJpYWJsZSIsIiRlIiwiIiwiKSIsbnVsbCwiICIsIiIsInsiLG51bGwsIiAiLCJkZWYgdmFyaWFibGUiLCJ4ZG1wOmxvZyIsIiIsIigiLCJ2YXJpYWJsZSIsIiRlIiwiIiwiKSIsbnVsbCwiICIsIiIsIn0iLG51bGwsIiAiLCIiLCJ9LCIsbnVsbCwiICAgICAgICAgICIsImtleXdvcmQiLCJhdHRyaWJ1dGUiLG51bGwsIiAiLCJ2YXJpYWJsZSIsImZuOmRvYyIsbnVsbCwiICIsIiIsInsiLG51bGwsIiAiLCJ2YXJpYWJsZSIsIiZxdW90O2JhciZxdW90OyIsbnVsbCwiICIsInZhcmlhYmxlIiwiY2FzdGFibGUiLG51bGwsIiAiLCJrZXl3b3JkIiwiYXMiLG51bGwsIiAiLCJhdG9tIiwieHM6c3RyaW5nIixudWxsLCIgIiwiIiwifSwiLG51bGwsIiAgICAgICAgICAiLCJrZXl3b3JkIiwiZWxlbWVudCIsbnVsbCwiICIsInZhcmlhYmxlIiwidGV4dCIsbnVsbCwiICIsIiIsInsiLG51bGwsIiAiLCJrZXl3b3JkIiwidGV4dCIsbnVsbCwiICIsIiIsInsiLG51bGwsIiAiLCJ2YXJpYWJsZSIsIiZxdW90O3RleHQmcXVvdDsiLG51bGwsIiAiLCIiLCJ9IixudWxsLCIgIiwiIiwifSwiLG51bGwsIiAgICAgICAgICAiLCJkZWYgdmFyaWFibGUiLCJmbjpkb2MiLCIiLCIoKVsiLG51bGwsIiAiLCJxdWFsaWZpZXIiLCJjaGlsZDo6IiwidmFyaWFibGUiLCJlcSIsImtleXdvcmQiLCIvIiwiIiwiKCIsInZhcmlhYmxlIiwiQGJhciIsbnVsbCwiICIsImtleXdvcmQiLCJ8IixudWxsLCIgIiwicXVhbGlmaWVyIiwiYXR0cmlidXRlOjoiLCJ2YXJpYWJsZSIsImF0dHJpYnV0ZSIsIiIsIikiLG51bGwsIiAiLCJrZXl3b3JkIiwiZXEiLG51bGwsIiAiLCJ2YXJpYWJsZSIsIiRsZXQiLG51bGwsIiAiLCIiLCJdLCIsbnVsbCwiICAgICAgICAgICIsImtleXdvcmQiLCIvLyIsInZhcmlhYmxlIiwiZm46ZG9jIixudWxsLCIgICAgICAiLCIiLCJ9Il0pOwoKTVQudGVzdE1vZGUoInRlc3RFbXB0eVNlcXVlbmNlS2V5d29yZCIsCiAgICAgICAgICAgICciZm9vIiBpbnN0YW5jZSBvZiBlbXB0eS1zZXF1ZW5jZSgpJywKICAgICAgICAgICAgWyJzdHJpbmciLCJcImZvb1wiIixudWxsLCIgIiwia2V5d29yZCIsImluc3RhbmNlIixudWxsLCIgIiwia2V5d29yZCIsIm9mIixudWxsLCIgIiwia2V5d29yZCIsImVtcHR5LXNlcXVlbmNlIiwiIiwiKCkiXSk7CgoKTVQudGVzdE1vZGUoInRlc3RNdWx0aUF0dHIiLAogICAgICAgICAgICAnPHAgYTE9ImZvbyIgYTI9ImJhciI+aGVsbG8gd29ybGQ8L3A+JywKICAgICAgICAgICAgWyJ0YWciLCI8cCAiLCJhdHRyaWJ1dGUiLCJhMSIsIiIsIj0iLCJzdHJpbmciLCJcImZvb1wiIixudWxsLCIgIiwiYXR0cmlidXRlIiwiYTIiLCIiLCI9Iiwic3RyaW5nIiwiXCJiYXJcIiIsInRhZyIsIj4iLCJ2YXJpYWJsZSIsImhlbGxvIixudWxsLCIgIiwidmFyaWFibGUiLCJ3b3JsZCIsInRhZyIsIjwvcD4iXSk7CgpNVC50ZXN0TW9kZSgidGVzdCBuYW1lc3BhY2VkIHZhcmlhYmxlIiwKICAgICAgICAgICAgJ2RlY2xhcmUgbmFtZXNwYWNlIGUgPSAiaHR0cDovL2V4YW1wbGUuY29tL0FOYW1lc3BhY2UiO1wKZGVjbGFyZSB2YXJpYWJsZSAkZTpleGFtcGxlQ29tVGhpc1ZhcklzTm90UmVjb2duaXplZCBhcyBlbGVtZW50KCopIGV4dGVybmFsOycsCiAgICAgICAgICAgIFsia2V5d29yZCIsImRlY2xhcmUiLG51bGwsIiAiLCJrZXl3b3JkIiwibmFtZXNwYWNlIixudWxsLCIgIiwidmFyaWFibGUiLCJlIixudWxsLCIgIiwia2V5d29yZCIsIj0iLG51bGwsIiAiLCJzdHJpbmciLCJcImh0dHA6Ly9leGFtcGxlLmNvbS9BTmFtZXNwYWNlXCIiLCJ2YXJpYWJsZSIsIjtkZWNsYXJlIixudWxsLCIgIiwia2V5d29yZCIsInZhcmlhYmxlIixudWxsLCIgIiwidmFyaWFibGUiLCIkZTpleGFtcGxlQ29tVGhpc1ZhcklzTm90UmVjb2duaXplZCIsbnVsbCwiICIsImtleXdvcmQiLCJhcyIsbnVsbCwiICIsImtleXdvcmQiLCJlbGVtZW50IiwiIiwiKCIsImtleXdvcmQiLCIqIiwiIiwiKSIsbnVsbCwiICIsInZhcmlhYmxlIiwiZXh0ZXJuYWw7Il0pOwoKTVQudGVzdE1vZGUoInRlc3QgRVFOYW1lIHZhcmlhYmxlIiwKICAgICAgICAgICAgJ2RlY2xhcmUgdmFyaWFibGUgJCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL25zL215Ijp2YXIgOj0gMTI7XAo8b3V0PnskImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbnMvbXkiOnZhcn08L291dD4nLAogICAgICAgICAgICBbImtleXdvcmQiLCJkZWNsYXJlIixudWxsLCIgIiwia2V5d29yZCIsInZhcmlhYmxlIixudWxsLCIgIiwidmFyaWFibGUiLCIkXCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL25zL215XCI6dmFyIixudWxsLCIgIiwia2V5d29yZCIsIjo9IixudWxsLCIgIiwiYXRvbSIsIjEyIiwidmFyaWFibGUiLCI7IiwidGFnIiwiPG91dD4iLCIiLCJ7IiwidmFyaWFibGUiLCIkXCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL25zL215XCI6dmFyIiwiIiwifSIsInRhZyIsIjwvb3V0PiJdKTsKCk1ULnRlc3RNb2RlKCJ0ZXN0IEVRTmFtZSBmdW5jdGlvbiIsCiAgICAgICAgICAgICdkZWNsYXJlIGZ1bmN0aW9uICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL25zL215IjpmbiAoJGEgYXMgeHM6aW50ZWdlcikgYXMgeHM6aW50ZWdlciB7XAogICAkYSArIDJcCn07XAo8b3V0PnsiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ucy9teSI6Zm4oMTIpfTwvb3V0PicsCiAgICAgICAgICAgIFsia2V5d29yZCIsImRlY2xhcmUiLG51bGwsIiAiLCJrZXl3b3JkIiwiZnVuY3Rpb24iLG51bGwsIiAiLCJkZWYgdmFyaWFibGUiLCJcImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbnMvbXlcIjpmbiIsbnVsbCwiICIsIiIsIigiLCJ2YXJpYWJsZSIsIiRhIixudWxsLCIgIiwia2V5d29yZCIsImFzIixudWxsLCIgIiwiYXRvbSIsInhzOmludGVnZXIiLCIiLCIpIixudWxsLCIgIiwia2V5d29yZCIsImFzIixudWxsLCIgIiwiYXRvbSIsInhzOmludGVnZXIiLG51bGwsIiAiLCIiLCJ7IixudWxsLCIgICAiLCJ2YXJpYWJsZSIsIiRhIixudWxsLCIgIiwia2V5d29yZCIsIisiLG51bGwsIiAiLCJhdG9tIiwiMiIsIiIsIn0iLCJ2YXJpYWJsZSIsIjsiLCJ0YWciLCI8b3V0PiIsIiIsInsiLCJkZWYgdmFyaWFibGUiLCJcImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbnMvbXlcIjpmbiIsIiIsIigiLCJhdG9tIiwiMTIiLCIiLCIpfSIsInRhZyIsIjwvb3V0PiJdKTsKCk1ULnRlc3RNb2RlKCJ0ZXN0IEVRTmFtZSBmdW5jdGlvbiB3aXRoIHNpbmdsZSBxdW90ZXMiLAogICAgICAgICAgICAnZGVjbGFyZSBmdW5jdGlvbiBcJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vbnMvbXlcJzpmbiAoJGEgYXMgeHM6aW50ZWdlcikgYXMgeHM6aW50ZWdlciB7XAogICAkYSArIDJcCn07XAo8b3V0PntcJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vbnMvbXlcJzpmbigxMil9PC9vdXQ+JywKICAgICAgICAgICAgWyJrZXl3b3JkIiwiZGVjbGFyZSIsbnVsbCwiICIsImtleXdvcmQiLCJmdW5jdGlvbiIsbnVsbCwiICIsImRlZiB2YXJpYWJsZSIsIidodHRwOi8vd3d3LmV4YW1wbGUuY29tL25zL215JzpmbiIsbnVsbCwiICIsIiIsIigiLCJ2YXJpYWJsZSIsIiRhIixudWxsLCIgIiwia2V5d29yZCIsImFzIixudWxsLCIgIiwiYXRvbSIsInhzOmludGVnZXIiLCIiLCIpIixudWxsLCIgIiwia2V5d29yZCIsImFzIixudWxsLCIgIiwiYXRvbSIsInhzOmludGVnZXIiLG51bGwsIiAiLCIiLCJ7IixudWxsLCIgICAiLCJ2YXJpYWJsZSIsIiRhIixudWxsLCIgIiwia2V5d29yZCIsIisiLG51bGwsIiAiLCJhdG9tIiwiMiIsIiIsIn0iLCJ2YXJpYWJsZSIsIjsiLCJ0YWciLCI8b3V0PiIsIiIsInsiLCJkZWYgdmFyaWFibGUiLCInaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ucy9teSc6Zm4iLCIiLCIoIiwiYXRvbSIsIjEyIiwiIiwiKX0iLCJ0YWciLCI8L291dD4iXSk7CgpNVC50ZXN0TW9kZSgidGVzdFByb2Nlc3NpbmdJbnN0cnVjdGlvbnMiLAogICAgICAgICAgICAnZGF0YSg8P3RhcmdldCBjb250ZW50Pz4pIGluc3RhbmNlIG9mIHhzOnN0cmluZycsCiAgICAgICAgICAgIFsiZGVmIHZhcmlhYmxlIiwiZGF0YSIsIiIsIigiLCJjb21tZW50IG1ldGEiLCI8P3RhcmdldCBjb250ZW50Pz4iLCIiLCIpIixudWxsLCIgIiwia2V5d29yZCIsImluc3RhbmNlIixudWxsLCIgIiwia2V5d29yZCIsIm9mIixudWxsLCIgIiwiYXRvbSIsInhzOnN0cmluZyJdKTsKCk1ULnRlc3RNb2RlKCJ0ZXN0UXVvdGVFc2NhcGVEb3VibGUiLAogICAgICAgICAgICAnbGV0ICRyb290Zm9sZGVyIDo9ICJjOlxcYnVpbGRzXFx3aW5udFxcSEVBRFxccWFcXHNjcmlwdHNcXCJcCmxldCAka2V5c2ZvbGRlciA6PSBjb25jYXQoJHJvb3Rmb2xkZXIsICJrZXlzXFwiKVwKcmV0dXJuXAoka2V5c2ZvbGRlcicsCiAgICAgICAgICAgIFsia2V5d29yZCIsImxldCIsbnVsbCwiICIsInZhcmlhYmxlIiwiJHJvb3Rmb2xkZXIiLG51bGwsIiAiLCJrZXl3b3JkIiwiOj0iLG51bGwsIiAiLCJzdHJpbmciLCJcImM6XFxidWlsZHNcXHdpbm50XFxIRUFEXFxxYVxcc2NyaXB0c1xcXCIiLCJrZXl3b3JkIiwibGV0IixudWxsLCIgIiwidmFyaWFibGUiLCIka2V5c2ZvbGRlciIsbnVsbCwiICIsImtleXdvcmQiLCI6PSIsbnVsbCwiICIsImRlZiB2YXJpYWJsZSIsImNvbmNhdCIsIiIsIigiLCJ2YXJpYWJsZSIsIiRyb290Zm9sZGVyIiwiIiwiLCIsbnVsbCwiICIsInN0cmluZyIsIlwia2V5c1xcXCIiLCIiLCIpIiwidmFyaWFibGUiLCJyZXR1cm4ka2V5c2ZvbGRlciJdKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/xquery/xquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChDKSAyMDExIGJ5IE1hcmtMb2dpYyBDb3Jwb3JhdGlvbgpBdXRob3I6IE1pa2UgQnJldm9vcnQgPG1pa2VAYnJldm9vcnQuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KKi8KQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ4cXVlcnkiLCBmdW5jdGlvbigpIHsKCiAgLy8gVGhlIGtleXdvcmRzIG9iamVjdCBpcyBzZXQgdG8gdGhlIHJlc3VsdCBvZiB0aGlzIHNlbGYgZXhlY3V0aW5nCiAgLy8gZnVuY3Rpb24uIEVhY2gga2V5d29yZCBpcyBhIHByb3BlcnR5IG9mIHRoZSBrZXl3b3JkcyBvYmplY3Qgd2hvc2UKICAvLyB2YWx1ZSBpcyB7dHlwZTogYXR5cGUsIHN0eWxlOiBhc3R5bGV9CiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXsKICAgIC8vIGNvbnZlaW5lbmNlIGZ1bmN0aW9ucyB1c2VkIHRvIGJ1aWxkIGtleXdvcmRzIG9iamVjdAogICAgZnVuY3Rpb24ga3codHlwZSkge3JldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6ICJrZXl3b3JkIn07fQogICAgdmFyIEEgPSBrdygia2V5d29yZCBhIikKICAgICAgLCBCID0ga3coImtleXdvcmQgYiIpCiAgICAgICwgQyA9IGt3KCJrZXl3b3JkIGMiKQogICAgICAsIG9wZXJhdG9yID0ga3coIm9wZXJhdG9yIikKICAgICAgLCBhdG9tID0ge3R5cGU6ICJhdG9tIiwgc3R5bGU6ICJhdG9tIn0KICAgICAgLCBwdW5jdHVhdGlvbiA9IHt0eXBlOiAicHVuY3R1YXRpb24iLCBzdHlsZTogIiJ9CiAgICAgICwgcXVhbGlmaWVyID0ge3R5cGU6ICJheGlzX3NwZWNpZmllciIsIHN0eWxlOiAicXVhbGlmaWVyIn07CiAgICAKICAgIC8vIGt3T2JqIGlzIHdoYXQgaXMgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbiBhdCB0aGUgZW5kCiAgICB2YXIga3dPYmogPSB7CiAgICAgICdpZic6IEEsICdzd2l0Y2gnOiBBLCAnd2hpbGUnOiBBLCAnZm9yJzogQSwKICAgICAgJ2Vsc2UnOiBCLCAndGhlbic6IEIsICd0cnknOiBCLCAnZmluYWxseSc6IEIsICdjYXRjaCc6IEIsCiAgICAgICdlbGVtZW50JzogQywgJ2F0dHJpYnV0ZSc6IEMsICdsZXQnOiBDLCAnaW1wbGVtZW50cyc6IEMsICdpbXBvcnQnOiBDLCAnbW9kdWxlJzogQywgJ25hbWVzcGFjZSc6IEMsIAogICAgICAncmV0dXJuJzogQywgJ3N1cGVyJzogQywgJ3RoaXMnOiBDLCAndGhyb3dzJzogQywgJ3doZXJlJzogQywgJ3ByaXZhdGUnOiBDLCAgICAgIAogICAgICAnLCc6IHB1bmN0dWF0aW9uLAogICAgICAnbnVsbCc6IGF0b20sICdmbjpmYWxzZSgpJzogYXRvbSwgJ2ZuOnRydWUoKSc6IGF0b20KICAgIH07CiAgICAKICAgIC8vIGEgbGlzdCBvZiAnYmFzaWMnIGtleXdvcmRzLiBGb3IgZWFjaCBhZGQgYSBwcm9wZXJ0eSB0byBrd09iaiB3aXRoIHRoZSB2YWx1ZSBvZiAKICAgIC8vIHt0eXBlOiBiYXNpY1tpXSwgc3R5bGU6ICJrZXl3b3JkIn0gZS5nLiAnYWZ0ZXInIC0tPiB7dHlwZTogImFmdGVyIiwgc3R5bGU6ICJrZXl3b3JkIn0KICAgIHZhciBiYXNpYyA9IFsnYWZ0ZXInLCdhbmNlc3RvcicsJ2FuY2VzdG9yLW9yLXNlbGYnLCdhbmQnLCdhcycsJ2FzY2VuZGluZycsJ2Fzc2VydCcsJ2F0dHJpYnV0ZScsJ2JlZm9yZScsCiAgICAnYnknLCdjYXNlJywnY2FzdCcsJ2NoaWxkJywnY29tbWVudCcsJ2RlY2xhcmUnLCdkZWZhdWx0JywnZGVmaW5lJywnZGVzY2VuZGFudCcsJ2Rlc2NlbmRhbnQtb3Itc2VsZicsCiAgICAnZGVzY2VuZGluZycsJ2RvY3VtZW50JywnZG9jdW1lbnQtbm9kZScsJ2VsZW1lbnQnLCdlbHNlJywnZXEnLCdldmVyeScsJ2V4Y2VwdCcsJ2V4dGVybmFsJywnZm9sbG93aW5nJywKICAgICdmb2xsb3dpbmctc2libGluZycsJ2ZvbGxvd3MnLCdmb3InLCdmdW5jdGlvbicsJ2lmJywnaW1wb3J0JywnaW4nLCdpbnN0YW5jZScsJ2ludGVyc2VjdCcsJ2l0ZW0nLAogICAgJ2xldCcsJ21vZHVsZScsJ25hbWVzcGFjZScsJ25vZGUnLCdub2RlJywnb2YnLCdvbmx5Jywnb3InLCdvcmRlcicsJ3BhcmVudCcsJ3ByZWNlZGVzJywncHJlY2VkaW5nJywKICAgICdwcmVjZWRpbmctc2libGluZycsJ3Byb2Nlc3NpbmctaW5zdHJ1Y3Rpb24nLCdyZWYnLCdyZXR1cm4nLCdyZXR1cm5zJywnc2F0aXNmaWVzJywnc2NoZW1hJywnc2NoZW1hLWVsZW1lbnQnLAogICAgJ3NlbGYnLCdzb21lJywnc29ydGJ5Jywnc3RhYmxlJywndGV4dCcsJ3RoZW4nLCd0bycsJ3RyZWF0JywndHlwZXN3aXRjaCcsJ3VuaW9uJywndmFyaWFibGUnLCd2ZXJzaW9uJywnd2hlcmUnLAogICAgJ3hxdWVyeScsICdlbXB0eS1zZXF1ZW5jZSddOwogICAgZm9yKHZhciBpPTAsIGw9YmFzaWMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGt3T2JqW2Jhc2ljW2ldXSA9IGt3KGJhc2ljW2ldKTt9OwogICAgCiAgICAvLyBhIGxpc3Qgb2YgdHlwZXMuIEZvciBlYWNoIGFkZCBhIHByb3BlcnR5IHRvIGt3T2JqIHdpdGggdGhlIHZhbHVlIG9mIAogICAgLy8ge3R5cGU6ICJhdG9tIiwgc3R5bGU6ICJhdG9tIn0KICAgIHZhciB0eXBlcyA9IFsneHM6c3RyaW5nJywgJ3hzOmZsb2F0JywgJ3hzOmRlY2ltYWwnLCAneHM6ZG91YmxlJywgJ3hzOmludGVnZXInLCAneHM6Ym9vbGVhbicsICd4czpkYXRlJywgJ3hzOmRhdGVUaW1lJywgCiAgICAneHM6dGltZScsICd4czpkdXJhdGlvbicsICd4czpkYXlUaW1lRHVyYXRpb24nLCAneHM6dGltZScsICd4czp5ZWFyTW9udGhEdXJhdGlvbicsICdudW1lcmljJywgJ3hzOmhleEJpbmFyeScsIAogICAgJ3hzOmJhc2U2NEJpbmFyeScsICd4czphbnlVUkknLCAneHM6UU5hbWUnLCAneHM6Ynl0ZScsJ3hzOmJvb2xlYW4nLCd4czphbnlVUkknLCd4Zjp5ZWFyTW9udGhEdXJhdGlvbiddOwogICAgZm9yKHZhciBpPTAsIGw9dHlwZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGt3T2JqW3R5cGVzW2ldXSA9IGF0b207fTsKICAgIAogICAgLy8gZWFjaCBvcGVyYXRvciB3aWxsIGFkZCBhIHByb3BlcnR5IHRvIGt3T2JqIHdpdGggdmFsdWUgb2Yge3R5cGU6ICJvcGVyYXRvciIsIHN0eWxlOiAia2V5d29yZCJ9CiAgICB2YXIgb3BlcmF0b3JzID0gWydlcScsICduZScsICdsdCcsICdsZScsICdndCcsICdnZScsICc6PScsICc9JywgJz4nLCAnPj0nLCAnPCcsICc8PScsICcuJywgJ3wnLCAnPycsICdhbmQnLCAnb3InLCAnZGl2JywgJ2lkaXYnLCAnbW9kJywgJyonLCAnLycsICcrJywgJy0nXTsKICAgIGZvcih2YXIgaT0wLCBsPW9wZXJhdG9ycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsga3dPYmpbb3BlcmF0b3JzW2ldXSA9IG9wZXJhdG9yO307CiAgICAKICAgIC8vIGVhY2ggYXhpc19zcGVjaWZpZXJzIHdpbGwgYWRkIGEgcHJvcGVydHkgdG8ga3dPYmogd2l0aCB2YWx1ZSBvZiB7dHlwZTogImF4aXNfc3BlY2lmaWVyIiwgc3R5bGU6ICJxdWFsaWZpZXIifQogICAgdmFyIGF4aXNfc3BlY2lmaWVycyA9IFsic2VsZjo6IiwgImF0dHJpYnV0ZTo6IiwgImNoaWxkOjoiLCAiZGVzY2VuZGFudDo6IiwgImRlc2NlbmRhbnQtb3Itc2VsZjo6IiwgInBhcmVudDo6IiwgCiAgICAiYW5jZXN0b3I6OiIsICJhbmNlc3Rvci1vci1zZWxmOjoiLCAiZm9sbG93aW5nOjoiLCAicHJlY2VkaW5nOjoiLCAiZm9sbG93aW5nLXNpYmxpbmc6OiIsICJwcmVjZWRpbmctc2libGluZzo6Il07CiAgICBmb3IodmFyIGk9MCwgbD1heGlzX3NwZWNpZmllcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGt3T2JqW2F4aXNfc3BlY2lmaWVyc1tpXV0gPSBxdWFsaWZpZXI7IH07CgogICAgcmV0dXJuIGt3T2JqOwogIH0oKTsKCiAgLy8gVXNlZCBhcyBzY3JhdGNoIHZhcmlhYmxlcyB0byBjb21tdW5pY2F0ZSBtdWx0aXBsZSB2YWx1ZXMgd2l0aG91dAogIC8vIGNvbnNpbmcgdXAgdG9ucyBvZiBvYmplY3RzLgogIHZhciB0eXBlLCBjb250ZW50OwogIAogIGZ1bmN0aW9uIHJldCh0cCwgc3R5bGUsIGNvbnQpIHsKICAgIHR5cGUgPSB0cDsgY29udGVudCA9IGNvbnQ7CiAgICByZXR1cm4gc3R5bGU7CiAgfQogIAogIGZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIGYpIHsKICAgIHN0YXRlLnRva2VuaXplID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KICAKICAvLyB0aGUgcHJpbWFyeSBtb2RlIHRva2VuaXplcgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpLCAKICAgICAgICBtaWdodEJlRnVuY3Rpb24gPSBmYWxzZSwKICAgICAgICBpc0VRTmFtZSA9IGlzRVFOYW1lQWhlYWQoc3RyZWFtKTsKICAgIAogICAgLy8gYW4gWE1MIHRhZyAoaWYgbm90IGluIHNvbWUgc3ViLCBjaGFpbmVkIHRva2VuaXplcikKICAgIGlmIChjaCA9PSAiPCIpIHsKICAgICAgaWYoc3RyZWFtLm1hdGNoKCIhLS0iLCB0cnVlKSkKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5YTUxDb21tZW50KTsKICAgICAgICAKICAgICAgaWYoc3RyZWFtLm1hdGNoKCIhW0NEQVRBIiwgZmFsc2UpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNEQVRBOwogICAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgICAgfQogICAgICAKICAgICAgaWYoc3RyZWFtLm1hdGNoKCI/IiwgZmFsc2UpKSB7CiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuUHJlUHJvY2Vzc2luZyk7CiAgICAgIH0KICAgICAgCiAgICAgIHZhciBpc2Nsb3NlID0gc3RyZWFtLmVhdCgiLyIpOwogICAgICBzdHJlYW0uZWF0U3BhY2UoKTsKICAgICAgdmFyIHRhZ05hbWUgPSAiIiwgYzsKICAgICAgd2hpbGUgKChjID0gc3RyZWFtLmVhdCgvW15cc1x1MDBhMD08PlwiXCdcLz9dLykpKSB0YWdOYW1lICs9IGM7CiAgICAgIAogICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5UYWcodGFnTmFtZSwgaXNjbG9zZSkpOwogICAgfQogICAgLy8gc3RhcnQgY29kZSBibG9jawogICAgZWxzZSBpZihjaCA9PSAieyIpIHsKICAgICAgcHVzaFN0YXRlU3RhY2soc3RhdGUseyB0eXBlOiAiY29kZWJsb2NrIn0pOwogICAgICByZXR1cm4gcmV0KCIiLCAiIik7CiAgICB9CiAgICAvLyBlbmQgY29kZSBibG9jawogICAgZWxzZSBpZihjaCA9PSAifSIpIHsKICAgICAgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgIHJldHVybiByZXQoIiIsICIiKTsKICAgIH0KICAgIC8vIGlmIHdlJ3JlIGluIGFuIFhNTCBibG9jawogICAgZWxzZSBpZihpc0luWG1sQmxvY2soc3RhdGUpKSB7CiAgICAgIGlmKGNoID09ICI+IikKICAgICAgICByZXR1cm4gcmV0KCJ0YWciLCAidGFnIik7CiAgICAgIGVsc2UgaWYoY2ggPT0gIi8iICYmIHN0cmVhbS5lYXQoIj4iKSkgewogICAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgICAgfQogICAgICBlbHNlICAKICAgICAgICByZXR1cm4gcmV0KCJ3b3JkIiwgInZhcmlhYmxlIik7CiAgICB9CiAgICAvLyBpZiBhIG51bWJlcgogICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0ubWF0Y2goL15cZCooPzpcLlxkKik/KD86RVsrXC1dP1xkKyk/Lyk7CiAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJhdG9tIik7CiAgICB9CiAgICAvLyBjb21tZW50IHN0YXJ0CiAgICBlbHNlIGlmIChjaCA9PT0gIigiICYmIHN0cmVhbS5lYXQoIjoiKSkgewogICAgICBwdXNoU3RhdGVTdGFjayhzdGF0ZSwgeyB0eXBlOiAiY29tbWVudCJ9KTsKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuQ29tbWVudCk7CiAgICB9CiAgICAvLyBxdW90ZWQgc3RyaW5nCiAgICBlbHNlIGlmICggICFpc0VRTmFtZSAmJiAoY2ggPT09ICciJyB8fCBjaCA9PT0gIiciKSkKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoKSk7CiAgICAvLyB2YXJpYWJsZQogICAgZWxzZSBpZihjaCA9PT0gIiQiKSB7CiAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblZhcmlhYmxlKTsKICAgIH0KICAgIC8vIGFzc2lnbm1lbnQKICAgIGVsc2UgaWYoY2ggPT09IjoiICYmIHN0cmVhbS5lYXQoIj0iKSkgewogICAgICByZXR1cm4gcmV0KCJvcGVyYXRvciIsICJrZXl3b3JkIik7CiAgICB9CiAgICAvLyBvcGVuIHBhcmVuCiAgICBlbHNlIGlmKGNoID09PSAiKCIpIHsKICAgICAgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHsgdHlwZTogInBhcmVuIn0pOwogICAgICByZXR1cm4gcmV0KCIiLCAiIik7CiAgICB9CiAgICAvLyBjbG9zZSBwYXJlbgogICAgZWxzZSBpZihjaCA9PT0gIikiKSB7CiAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICByZXR1cm4gcmV0KCIiLCAiIik7CiAgICB9CiAgICAvLyBvcGVuIHBhcmVuCiAgICBlbHNlIGlmKGNoID09PSAiWyIpIHsKICAgICAgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHsgdHlwZTogImJyYWNrZXQifSk7CiAgICAgIHJldHVybiByZXQoIiIsICIiKTsKICAgIH0KICAgIC8vIGNsb3NlIHBhcmVuCiAgICBlbHNlIGlmKGNoID09PSAiXSIpIHsKICAgICAgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgIHJldHVybiByZXQoIiIsICIiKTsKICAgIH0KICAgIGVsc2UgewogICAgICB2YXIga25vd24gPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjaCkgJiYga2V5d29yZHNbY2hdOwoKICAgICAgLy8gaWYgdGhlcmUncyBhIEVRTmFtZSBhaGVhZCwgY29uc3VtZSB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHBvcnRpb24sIGl0J3MgbGlrZWx5IGEgZnVuY3Rpb24KICAgICAgaWYoaXNFUU5hbWUgJiYgY2ggPT09ICdcIicpIHdoaWxlKHN0cmVhbS5uZXh0KCkgIT09ICciJyl7fQogICAgICBpZihpc0VRTmFtZSAmJiBjaCA9PT0gJ1wnJykgd2hpbGUoc3RyZWFtLm5leHQoKSAhPT0gJ1wnJyl7fQogICAgICAKICAgICAgLy8gZ29iYmxlIHVwIGEgd29yZCBpZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBrbm93bgogICAgICBpZigha25vd24pIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfLV0vKTsKICAgICAgCiAgICAgIC8vIGdvYmJsZSBhIGNvbG9uIGluIHRoZSBjYXNlIHRoYXQgaXMgYSBsaWIgZnVuYyB0eXBlIGNhbGwgZm46ZG9jCiAgICAgIHZhciBmb3VuZENvbG9uID0gc3RyZWFtLmVhdCgiOiIpOwogICAgICAKICAgICAgLy8gaWYgdGhlcmUncyBub3QgYSBzZWNvbmQgY29sb24sIGdvYmJsZSBhbm90aGVyIHdvcmQuIE90aGVyd2lzZSwgaXQncyBwcm9iYWJseSBhbiBheGlzIHNwZWNpZmllcgogICAgICAvLyB3aGljaCBzaG91bGQgZ2V0IG1hdGNoZWQgYXMgYSBrZXl3b3JkCiAgICAgIGlmKCFzdHJlYW0uZWF0KCI6IikgJiYgZm91bmRDb2xvbikgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfLV0vKTsKICAgICAgfQogICAgICAvLyBpZiB0aGUgbmV4dCBub24gd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgYW4gb3BlbiBwYXJlbiwgdGhpcyBpcyBwcm9iYWJseSBhIGZ1bmN0aW9uIChpZiBub3QgYSBrZXl3b3JkIG9mIG90aGVyIHNvcnQpCiAgICAgIGlmKHN0cmVhbS5tYXRjaCgvXlsgXHRdKlwoLywgZmFsc2UpKSB7CiAgICAgICAgbWlnaHRCZUZ1bmN0aW9uID0gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpcyB0aGUgd29yZCBhIGtleXdvcmQ/CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAga25vd24gPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJiBrZXl3b3Jkc1t3b3JkXTsKICAgICAgCiAgICAgIC8vIGlmIHdlIHRoaW5rIGl0J3MgYSBmdW5jdGlvbiBjYWxsIGJ1dCBub3QgeWV0IGtub3duLCAKICAgICAgLy8gc2V0IHN0eWxlIHRvIHZhcmlhYmxlIGZvciBub3cgZm9yIGxhY2sgb2Ygc29tZXRoaW5nIGJldHRlcgogICAgICBpZihtaWdodEJlRnVuY3Rpb24gJiYgIWtub3duKSBrbm93biA9IHt0eXBlOiAiZnVuY3Rpb25fY2FsbCIsIHN0eWxlOiAidmFyaWFibGUgZGVmIn07CiAgICAgIAogICAgICAvLyBpZiB0aGUgcHJldmlvdXMgd29yZCB3YXMgZWxlbWVudCwgYXR0cmlidXRlLCBheGlzIHNwZWNpZmllciwgdGhpcyB3b3JkIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGF0CiAgICAgIGlmKGlzSW5YbWxDb25zdHJ1Y3RvcihzdGF0ZSkpIHsKICAgICAgICBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgICByZXR1cm4gcmV0KCJ3b3JkIiwgInZhcmlhYmxlIiwgd29yZCk7CiAgICAgIH0KICAgICAgLy8gYXMgcHJldmlvdXNseSBjaGVja2VkLCBpZiB0aGUgd29yZCBpcyBlbGVtZW50LGF0dHJpYnV0ZSwgYXhpcyBzcGVjaWZpZXIsIGNhbGwgaXQgYW4gInhtbGNvbnN0cnVjdG9yIiBhbmQgCiAgICAgIC8vIHB1c2ggdGhlIHN0YWNrIHNvIHdlIGtub3cgdG8gbG9vayBmb3IgaXQgb24gdGhlIG5leHQgd29yZAogICAgICBpZih3b3JkID09ICJlbGVtZW50IiB8fCB3b3JkID09ICJhdHRyaWJ1dGUiIHx8IGtub3duLnR5cGUgPT0gImF4aXNfc3BlY2lmaWVyIikgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHt0eXBlOiAieG1sY29uc3RydWN0b3IifSk7CiAgICAgIAogICAgICAvLyBpZiB0aGUgd29yZCBpcyBrbm93biwgcmV0dXJuIHRoZSBkZXRhaWxzIG9mIHRoYXQgZWxzZSBqdXN0IGNhbGwgdGhpcyBhIGdlbmVyaWMgJ3dvcmQnCiAgICAgIHJldHVybiBrbm93biA/IHJldChrbm93bi50eXBlLCBrbm93bi5zdHlsZSwgd29yZCkgOgogICAgICAgICAgICAgICAgICAgICByZXQoIndvcmQiLCAidmFyaWFibGUiLCB3b3JkKTsKICAgIH0KICB9CgogIC8vIGhhbmRsZSBjb21tZW50cywgaW5jbHVkaW5nIG5lc3RlZCAKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIG1heWJlTmVzdGVkID0gZmFsc2UsIG5lc3RlZENvdW50ID0gMCwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiKSIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBpZihuZXN0ZWRDb3VudCA+IDApCiAgICAgICAgICBuZXN0ZWRDb3VudC0tOwogICAgICAgIGVsc2UgewogICAgICAgICAgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSBpZihjaCA9PSAiOiIgJiYgbWF5YmVOZXN0ZWQpIHsKICAgICAgICBuZXN0ZWRDb3VudCsrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICI6Iik7CiAgICAgIG1heWJlTmVzdGVkID0gKGNoID09ICIoIik7CiAgICB9CiAgICAKICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KCiAgLy8gdG9rZW5pemVyIGZvciBzdHJpbmcgbGl0ZXJhbHMKICAvLyBvcHRpb25hbGx5IHBhc3MgYSB0b2tlbml6ZXIgZnVuY3Rpb24gdG8gc2V0IHN0YXRlLnRva2VuaXplIGJhY2sgdG8gd2hlbiBmaW5pc2hlZAogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlLCBmKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2g7CgogICAgICBpZihpc0luU3RyaW5nKHN0YXRlKSAmJiBzdHJlYW0uY3VycmVudCgpID09IHF1b3RlKSB7CiAgICAgICAgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgICAgaWYoZikgc3RhdGUudG9rZW5pemUgPSBmOwogICAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsKICAgICAgfQoKICAgICAgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHsgdHlwZTogInN0cmluZyIsIG5hbWU6IHF1b3RlLCB0b2tlbml6ZTogdG9rZW5TdHJpbmcocXVvdGUsIGYpIH0pOwoKICAgICAgLy8gaWYgd2UncmUgaW4gYSBzdHJpbmcgYW5kIGluIGFuIFhNTCBibG9jaywgYWxsb3cgYW4gZW1iZWRkZWQgY29kZSBibG9jawogICAgICBpZihzdHJlYW0ubWF0Y2goInsiLCBmYWxzZSkgJiYgaXNJblhtbEF0dHJpYnV0ZUJsb2NrKHN0YXRlKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsgCiAgICAgIH0KCiAgICAgIAogICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgaWYgKGNoID09ICBxdW90ZSkgewogICAgICAgICAgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgICAgICBpZihmKSBzdGF0ZS50b2tlbml6ZSA9IGY7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBhIHN0cmluZyBhbmQgaW4gYW4gWE1MIGJsb2NrLCBhbGxvdyBhbiBlbWJlZGRlZCBjb2RlIGJsb2NrIGluIGFuIGF0dHJpYnV0ZQogICAgICAgICAgaWYoc3RyZWFtLm1hdGNoKCJ7IiwgZmFsc2UpICYmIGlzSW5YbWxBdHRyaWJ1dGVCbG9jayhzdGF0ZSkpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsgCiAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgfTsKICB9CiAgCiAgLy8gdG9rZW5pemVyIGZvciB2YXJpYWJsZXMKICBmdW5jdGlvbiB0b2tlblZhcmlhYmxlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBpc1ZhcmlhYmxlQ2hhciA9IC9bXHdcJF8tXS87CgogICAgLy8gYSB2YXJpYWJsZSBtYXkgc3RhcnQgd2l0aCBhIHF1b3RlZCBFUU5hbWUgc28gaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIHF1b3RlLCBjb25zdW1lIHRvIHRoZSBuZXh0IHF1b3RlCiAgICBpZihzdHJlYW0uZWF0KCJcIiIpKSB7CiAgICAgIHdoaWxlKHN0cmVhbS5uZXh0KCkgIT09ICdcIicpe307CiAgICAgIHN0cmVhbS5lYXQoIjoiKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc1ZhcmlhYmxlQ2hhcik7CiAgICAgIGlmKCFzdHJlYW0ubWF0Y2goIjo9IiwgZmFsc2UpKSBzdHJlYW0uZWF0KCI6Iik7CiAgICB9CiAgICBzdHJlYW0uZWF0V2hpbGUoaXNWYXJpYWJsZUNoYXIpOwogICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICByZXR1cm4gcmV0KCJ2YXJpYWJsZSIsICJ2YXJpYWJsZSIpOwogIH0KICAKICAvLyB0b2tlbml6ZXIgZm9yIFhNTCB0YWdzCiAgZnVuY3Rpb24gdG9rZW5UYWcobmFtZSwgaXNjbG9zZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CiAgICAgIGlmKGlzY2xvc2UgJiYgc3RyZWFtLmVhdCgiPiIpKSB7CiAgICAgICAgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOwogICAgICB9CiAgICAgIC8vIHNlbGYgY2xvc2luZyB0YWcgd2l0aG91dCBhdHRyaWJ1dGVzPwogICAgICBpZighc3RyZWFtLmVhdCgiLyIpKQogICAgICAgIHB1c2hTdGF0ZVN0YWNrKHN0YXRlLCB7IHR5cGU6ICJ0YWciLCBuYW1lOiBuYW1lLCB0b2tlbml6ZTogdG9rZW5CYXNlfSk7CiAgICAgIGlmKCFzdHJlYW0uZWF0KCI+IikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQXR0cmlidXRlOwogICAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsgICAgICAgIAogICAgICB9CiAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgIH07CiAgfQoKICAvLyB0b2tlbml6ZXIgZm9yIFhNTCBhdHRyaWJ1dGVzCiAgZnVuY3Rpb24gdG9rZW5BdHRyaWJ1dGUoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIAogICAgaWYoY2ggPT0gIi8iICYmIHN0cmVhbS5lYXQoIj4iKSkgewogICAgICBpZihpc0luWG1sQXR0cmlidXRlQmxvY2soc3RhdGUpKSBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgaWYoaXNJblhtbEJsb2NrKHN0YXRlKSkgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgIH0KICAgIGlmKGNoID09ICI+IikgewogICAgICBpZihpc0luWG1sQXR0cmlidXRlQmxvY2soc3RhdGUpKSBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOwogICAgfQogICAgaWYoY2ggPT0gIj0iKQogICAgICByZXR1cm4gcmV0KCIiLCAiIik7CiAgICAvLyBxdW90ZWQgc3RyaW5nCiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoLCB0b2tlbkF0dHJpYnV0ZSkpOwoKICAgIGlmKCFpc0luWG1sQXR0cmlidXRlQmxvY2soc3RhdGUpKSAKICAgICAgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHsgdHlwZTogImF0dHJpYnV0ZSIsIG5hbWU6IG5hbWUsIHRva2VuaXplOiB0b2tlbkF0dHJpYnV0ZX0pOwoKICAgIHN0cmVhbS5lYXQoL1thLXpBLVpfOl0vKTsKICAgIHN0cmVhbS5lYXRXaGlsZSgvWy1hLXpBLVowLTlfOi5dLyk7CiAgICBzdHJlYW0uZWF0U3BhY2UoKTsKCiAgICAvLyB0aGUgY2FzZSB3aGVyZSB0aGUgYXR0cmlidXRlIGhhcyBub3QgdmFsdWUgYW5kIHRoZSB0YWcgd2FzIGNsb3NlZAogICAgaWYoc3RyZWFtLm1hdGNoKCI+IiwgZmFsc2UpIHx8IHN0cmVhbS5tYXRjaCgiLyIsIGZhbHNlKSkgewogICAgICBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7ICAgICAgCiAgICB9CgogICAgcmV0dXJuIHJldCgiYXR0cmlidXRlIiwgImF0dHJpYnV0ZSIpOwogIH0KICAKICAvLyBoYW5kbGUgY29tbWVudHMsIGluY2x1ZGluZyBuZXN0ZWQgCiAgZnVuY3Rpb24gdG9rZW5YTUxDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICItIiAmJiBzdHJlYW0ubWF0Y2goIi0+IiwgdHJ1ZSkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsgICAgICAgIAogICAgICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogICAgICB9CiAgICB9CiAgfQoKCiAgLy8gaGFuZGxlIENEQVRBCiAgZnVuY3Rpb24gdG9rZW5DREFUQShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiXSIgJiYgc3RyZWFtLm1hdGNoKCJdIiwgdHJ1ZSkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsgICAgICAgIAogICAgICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBoYW5kbGUgcHJlcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKICBmdW5jdGlvbiB0b2tlblByZVByb2Nlc3Npbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIj8iICYmIHN0cmVhbS5tYXRjaCgiPiIsIHRydWUpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7ICAgICAgICAKICAgICAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQgbWV0YSIpOwogICAgICB9CiAgICB9CiAgfQogIAogIAogIC8vIGZ1bmN0aW9ucyB0byB0ZXN0IHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIHN0YXRlCiAgZnVuY3Rpb24gaXNJblhtbEJsb2NrKHN0YXRlKSB7IHJldHVybiBpc0luKHN0YXRlLCAidGFnIik7IH0KICBmdW5jdGlvbiBpc0luWG1sQXR0cmlidXRlQmxvY2soc3RhdGUpIHsgcmV0dXJuIGlzSW4oc3RhdGUsICJhdHRyaWJ1dGUiKTsgfQogIGZ1bmN0aW9uIGlzSW5YbWxDb25zdHJ1Y3RvcihzdGF0ZSkgeyByZXR1cm4gaXNJbihzdGF0ZSwgInhtbGNvbnN0cnVjdG9yIik7IH0KICBmdW5jdGlvbiBpc0luU3RyaW5nKHN0YXRlKSB7IHJldHVybiBpc0luKHN0YXRlLCAic3RyaW5nIik7IH0KCiAgZnVuY3Rpb24gaXNFUU5hbWVBaGVhZChzdHJlYW0pIHsgCiAgICAvLyBhc3N1bWUgd2UndmUgYWxyZWFkeSBlYXRlbiBhIHF1b3RlICgiKQogICAgaWYoc3RyZWFtLmN1cnJlbnQoKSA9PT0gJyInKQogICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKC9eW15cIl0rXCJcOi8sIGZhbHNlKTsKICAgIGVsc2UgaWYoc3RyZWFtLmN1cnJlbnQoKSA9PT0gJ1wnJykKICAgICAgcmV0dXJuIHN0cmVhbS5tYXRjaCgvXlteXCJdK1wnXDovLCBmYWxzZSk7CiAgICBlbHNlCiAgICAgIHJldHVybiBmYWxzZTsKICB9CiAgCiAgZnVuY3Rpb24gaXNJbihzdGF0ZSwgdHlwZSkgewogICAgcmV0dXJuIChzdGF0ZS5zdGFjay5sZW5ndGggJiYgc3RhdGUuc3RhY2tbc3RhdGUuc3RhY2subGVuZ3RoIC0gMV0udHlwZSA9PSB0eXBlKTsgICAgCiAgfQogIAogIGZ1bmN0aW9uIHB1c2hTdGF0ZVN0YWNrKHN0YXRlLCBuZXdTdGF0ZSkgewogICAgc3RhdGUuc3RhY2sucHVzaChuZXdTdGF0ZSk7CiAgfQogIAogIGZ1bmN0aW9uIHBvcFN0YXRlU3RhY2soc3RhdGUpIHsKICAgIHN0YXRlLnN0YWNrLnBvcCgpOwogICAgdmFyIHJlaW5zdGF0ZVRva2VuaXplID0gc3RhdGUuc3RhY2subGVuZ3RoICYmIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXS50b2tlbml6ZTsKICAgIHN0YXRlLnRva2VuaXplID0gcmVpbnN0YXRlVG9rZW5pemUgfHwgdG9rZW5CYXNlOwogIH0KICAKICAvLyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgbW9kZSBBUEkKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICBjYzogW10sCiAgICAgICAgc3RhY2s6IFtdCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9CiAgfTsKCn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94cXVlcnkiLCAieHF1ZXJ5Iik7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/yaml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/yaml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFlBTUwgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InlhbWwuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkOyB9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+Q29kZU1pcnJvcjogWUFNTCBtb2RlPC9oMT4KICAgIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci0tLSAjIEZhdm9yaXRlIG1vdmllcwotIENhc2FibGFuY2EKLSBOb3J0aCBieSBOb3J0aHdlc3QKLSBUaGUgTWFuIFdobyBXYXNuJ3QgVGhlcmUKLS0tICMgU2hvcHBpbmcgbGlzdApbbWlsaywgcHVtcGtpbiBwaWUsIGVnZ3MsIGp1aWNlXQotLS0gIyBJbmRlbnRlZCBCbG9ja3MsIGNvbW1vbiBpbiBZQU1MIGRhdGEgZmlsZXMsIHVzZSBpbmRlbnRhdGlvbiBhbmQgbmV3IGxpbmVzIHRvIHNlcGFyYXRlIHRoZSBrZXk6IHZhbHVlIHBhaXJzCiAgbmFtZTogSm9obiBTbWl0aAogIGFnZTogMzMKLS0tICMgSW5saW5lIEJsb2NrcywgY29tbW9uIGluIFlBTUwgZGF0YSBzdHJlYW1zLCB1c2UgY29tbWFzIHRvIHNlcGFyYXRlIHRoZSBrZXk6IHZhbHVlIHBhaXJzIGJldHdlZW4gYnJhY2VzCntuYW1lOiBKb2huIFNtaXRoLCBhZ2U6IDMzfQotLS0KcmVjZWlwdDogICAgIE96LVdhcmUgUHVyY2hhc2UgSW52b2ljZQpkYXRlOiAgICAgICAgMjAwNy0wOC0wNgpjdXN0b21lcjoKICAgIGdpdmVuOiAgIERvcm90aHkKICAgIGZhbWlseTogIEdhbGUKCml0ZW1zOgogICAgLSBwYXJ0X25vOiAgIEE0Nzg2CiAgICAgIGRlc2NyaXA6ICAgV2F0ZXIgQnVja2V0IChGaWxsZWQpCiAgICAgIHByaWNlOiAgICAgMS40NwogICAgICBxdWFudGl0eTogIDQKCiAgICAtIHBhcnRfbm86ICAgRTE2MjgKICAgICAgZGVzY3JpcDogICBIaWdoIEhlZWxlZCAiUnVieSIgU2xpcHBlcnMKICAgICAgc2l6ZTogICAgICAgOAogICAgICBwcmljZTogICAgIDEwMC4yNwogICAgICBxdWFudGl0eTogIDEKCmJpbGwtdG86ICAmaWQwMDEKICAgIHN0cmVldDogfAogICAgICAgICAgICAxMjMgVG9ybmFkbyBBbGxleQogICAgICAgICAgICBTdWl0ZSAxNgogICAgY2l0eTogICBFYXN0IENlbnRlcnZpbGxlCiAgICBzdGF0ZTogIEtTCgpzaGlwLXRvOiAgKmlkMDAxCgpzcGVjaWFsRGVsaXZlcnk6ICA+CiAgICBGb2xsb3cgdGhlIFllbGxvdyBCcmljawogICAgUm9hZCB0byB0aGUgRW1lcmFsZCBDaXR5LgogICAgUGF5IG5vIGF0dGVudGlvbiB0byB0aGUKICAgIG1hbiBiZWhpbmQgdGhlIGN1cnRhaW4uCi4uLgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXlhbWw8L2NvZGU+LjwvcD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/yaml/yaml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCJ5YW1sIiwgZnVuY3Rpb24oKSB7CgkKCXZhciBjb25zID0gWyd0cnVlJywgJ2ZhbHNlJywgJ29uJywgJ29mZicsICd5ZXMnLCAnbm8nXTsKCXZhciBrZXl3b3JkUmVnZXggPSBuZXcgUmVnRXhwKCJcXGIoKCIrY29ucy5qb2luKCIpfCgiKSsiKSkkIiwgJ2knKTsKCQoJcmV0dXJuIHsKCQl0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewoJCQl2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwoJCQl2YXIgZXNjID0gc3RhdGUuZXNjYXBlZDsKCQkJc3RhdGUuZXNjYXBlZCA9IGZhbHNlOwoJCQkvKiBjb21tZW50cyAqLwoJCQlpZiAoY2ggPT0gIiMiKSB7IHN0cmVhbS5za2lwVG9FbmQoKTsgcmV0dXJuICJjb21tZW50IjsgfQoJCQlpZiAoc3RhdGUubGl0ZXJhbCAmJiBzdHJlYW0uaW5kZW50YXRpb24oKSA+IHN0YXRlLmtleUNvbCkgewoJCQkJc3RyZWFtLnNraXBUb0VuZCgpOyByZXR1cm4gInN0cmluZyI7CgkJCX0gZWxzZSBpZiAoc3RhdGUubGl0ZXJhbCkgeyBzdGF0ZS5saXRlcmFsID0gZmFsc2U7IH0KCQkJaWYgKHN0cmVhbS5zb2woKSkgewoJCQkJc3RhdGUua2V5Q29sID0gMDsKCQkJCXN0YXRlLnBhaXIgPSBmYWxzZTsKCQkJCXN0YXRlLnBhaXJTdGFydCA9IGZhbHNlOwoJCQkJLyogZG9jdW1lbnQgc3RhcnQgKi8KCQkJCWlmKHN0cmVhbS5tYXRjaCgvLS0tLykpIHsgcmV0dXJuICJkZWYiOyB9CgkJCQkvKiBkb2N1bWVudCBlbmQgKi8KCQkJCWlmIChzdHJlYW0ubWF0Y2goL1wuXC5cLi8pKSB7IHJldHVybiAiZGVmIjsgfQoJCQkJLyogYXJyYXkgbGlzdCBpdGVtICovCgkJCQlpZiAoc3RyZWFtLm1hdGNoKC9ccyotXHMrLykpIHsgcmV0dXJuICdtZXRhJzsgfQoJCQl9CgkJCS8qIHBhaXJzIChhc3NvY2lhdGl2ZSBhcnJheXMpIC0+IGtleSAqLwoJCQlpZiAoIXN0YXRlLnBhaXIgJiYgc3RyZWFtLm1hdGNoKC9eXHMqKFthLXowLTlcLl8tXSkrKD89XHMqOikvaSkpIHsKCQkJCXN0YXRlLnBhaXIgPSB0cnVlOwoJCQkJc3RhdGUua2V5Q29sID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CgkJCQlyZXR1cm4gImF0b20iOwoJCQl9CgkJCWlmIChzdGF0ZS5wYWlyICYmIHN0cmVhbS5tYXRjaCgvXjpccyovKSkgeyBzdGF0ZS5wYWlyU3RhcnQgPSB0cnVlOyByZXR1cm4gJ21ldGEnOyB9CgkJCQoJCQkvKiBpbmxpbmUgcGFpcnMvbGlzdHMgKi8KCQkJaWYgKHN0cmVhbS5tYXRjaCgvXihce3xcfXxcW3xcXSkvKSkgewoJCQkJaWYgKGNoID09ICd7JykKCQkJCQlzdGF0ZS5pbmxpbmVQYWlycysrOwoJCQkJZWxzZSBpZiAoY2ggPT0gJ30nKQoJCQkJCXN0YXRlLmlubGluZVBhaXJzLS07CgkJCQllbHNlIGlmIChjaCA9PSAnWycpCgkJCQkJc3RhdGUuaW5saW5lTGlzdCsrOwoJCQkJZWxzZQoJCQkJCXN0YXRlLmlubGluZUxpc3QtLTsKCQkJCXJldHVybiAnbWV0YSc7CgkJCX0KCQkJCgkJCS8qIGxpc3Qgc2VwZXJhdG9yICovCgkJCWlmIChzdGF0ZS5pbmxpbmVMaXN0ID4gMCAmJiAhZXNjICYmIGNoID09ICcsJykgewoJCQkJc3RyZWFtLm5leHQoKTsKCQkJCXJldHVybiAnbWV0YSc7CgkJCX0KCQkJLyogcGFpcnMgc2VwZXJhdG9yICovCgkJCWlmIChzdGF0ZS5pbmxpbmVQYWlycyA+IDAgJiYgIWVzYyAmJiBjaCA9PSAnLCcpIHsKCQkJCXN0YXRlLmtleUNvbCA9IDA7CgkJCQlzdGF0ZS5wYWlyID0gZmFsc2U7CgkJCQlzdGF0ZS5wYWlyU3RhcnQgPSBmYWxzZTsKCQkJCXN0cmVhbS5uZXh0KCk7CgkJCQlyZXR1cm4gJ21ldGEnOwoJCQl9CgkJCQoJCQkvKiBzdGFydCBvZiB2YWx1ZSBvZiBhIHBhaXIgKi8KCQkJaWYgKHN0YXRlLnBhaXJTdGFydCkgewoJCQkJLyogYmxvY2sgbGl0ZXJhbHMgKi8KCQkJCWlmIChzdHJlYW0ubWF0Y2goL15ccyooXHx8XD4pXHMqLykpIHsgc3RhdGUubGl0ZXJhbCA9IHRydWU7IHJldHVybiAnbWV0YSc7IH07CgkJCQkvKiByZWZlcmVuY2VzICovCgkJCQlpZiAoc3RyZWFtLm1hdGNoKC9eXHMqKFwmfFwqKVthLXowLTlcLl8tXStcYi9pKSkgeyByZXR1cm4gJ3ZhcmlhYmxlLTInOyB9CgkJCQkvKiBudW1iZXJzICovCgkJCQlpZiAoc3RhdGUuaW5saW5lUGFpcnMgPT0gMCAmJiBzdHJlYW0ubWF0Y2goL15ccyotP1swLTlcLlwsXStccz8kLykpIHsgcmV0dXJuICdudW1iZXInOyB9CgkJCQlpZiAoc3RhdGUuaW5saW5lUGFpcnMgPiAwICYmIHN0cmVhbS5tYXRjaCgvXlxzKi0/WzAtOVwuXCxdK1xzPyg/PSgsfH0pKS8pKSB7IHJldHVybiAnbnVtYmVyJzsgfQoJCQkJLyoga2V5d29yZHMgKi8KCQkJCWlmIChzdHJlYW0ubWF0Y2goa2V5d29yZFJlZ2V4KSkgeyByZXR1cm4gJ2tleXdvcmQnOyB9CgkJCX0KCgkJCS8qIG5vdGhpbmcgZm91bmQsIGNvbnRpbnVlICovCgkJCXN0YXRlLnBhaXJTdGFydCA9IGZhbHNlOwoJCQlzdGF0ZS5lc2NhcGVkID0gKGNoID09ICdcXCcpOwoJCQlzdHJlYW0ubmV4dCgpOwoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gewoJCQkJcGFpcjogZmFsc2UsCgkJCQlwYWlyU3RhcnQ6IGZhbHNlLAoJCQkJa2V5Q29sOiAwLAoJCQkJaW5saW5lUGFpcnM6IDAsCgkJCQlpbmxpbmVMaXN0OiAwLAoJCQkJbGl0ZXJhbDogZmFsc2UsCgkJCQllc2NhcGVkOiBmYWxzZQoJCQl9OwoJCX0KCX07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gteWFtbCIsICJ5YW1sIik7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/z80/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/mode/z80/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFo4MCBhc3NlbWJseSBtb2RlPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iejgwLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBaODAgYXNzZW1ibHkgbW9kZTwvaDE+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiNpbmNsdWRlICAgICJ0aTgzcGx1cy5pbmMiCiNkZWZpbmUgICAgIHByb2dTdGFydCAgICQ5RDk1Ci5vcmcgICAgICAgIHByb2dTdGFydC0yCi5kYiAgICAgICAgICRCQiwkNkQKICAgIGJjYWxsKF9DbHJMQ0RGdWxsKQogICAgbGQgIEhMLCAwCiAgICBsZCAgKFBlbkNvbCksICAgSEwKICAgIGxkICBITCwgTWVzc2FnZQogICAgYmNhbGwoX1B1dFMpIDsgRGlzcGxheXMgdGhlIHN0cmluZwogICAgYmNhbGwoX05ld0xpbmUpCiAgICByZXQKTWVzc2FnZToKLmRiICAgICAgICAgIkhlbGxvIHdvcmxkISIsMAo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZSBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtejgwPC9jb2RlPi48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/mode/z80/z80.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5kZWZpbmVNb2RlKCd6ODAnLCBmdW5jdGlvbigpCnsKCXZhciBrZXl3b3JkczEgPSAvXihleHg/fChsZHxjcHxpbikoW2RpXXI/KT98cG9wfHB1c2h8YWRbY2RdfGNwbHxkYWF8ZGVjfGluY3xuZWd8c2JjfHN1YnxhbmR8Yml0fFtjc11jZnx4P29yfHJlc3xzZXR8cltscl1jP2E/fHJbbHJdZHxzW2xyXWF8c3JsfGRqbnp8bm9wfHJzdHxbZGVdaXxoYWx0fGltfG90W2RpXXJ8b3V0W2RpXT8pXGIvaTsKCXZhciBrZXl3b3JkczIgPSAvXihjYWxsfGpbcHJdfHJldFtpbl0/KVxiL2k7Cgl2YXIga2V5d29yZHMzID0gL15iXz8oY2FsbHxqdW1wKVxiL2k7Cgl2YXIgdmFyaWFibGVzMSA9IC9eKGFmP3xiYz98Y3xkZT98ZXxobD98bHxpW3h5XT98cnxzcClcYi9pOwoJdmFyIHZhcmlhYmxlczIgPSAvXihuP1t6Y118cFtvZV0/fG0pXGIvaTsKCXZhciBlcnJvcnMgPSAvXihbaGxdW3h5XXxpW3h5XVtobF18c2xpYXxzbGwpXGIvaTsKCXZhciBudW1iZXJzID0gL14oW1xkYS1mXStofFswLTddK298WzAxXStifFxkKylcYi9pOwoJCglyZXR1cm4ge3N0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkKCXsKCQlyZXR1cm4ge2NvbnRleHQ6IDB9OwoJfSwgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpCgl7CgkJaWYgKCFzdHJlYW0uY29sdW1uKCkpCgkJCXN0YXRlLmNvbnRleHQgPSAwOwoJCQoJCWlmIChzdHJlYW0uZWF0U3BhY2UoKSkKCQkJcmV0dXJuIG51bGw7CgkJCgkJdmFyIHc7CgkJCgkJaWYgKHN0cmVhbS5lYXRXaGlsZSgvXHcvKSkKCQl7CgkJCXcgPSBzdHJlYW0uY3VycmVudCgpOwoJCQkKCQkJaWYgKHN0cmVhbS5pbmRlbnRhdGlvbigpKQoJCQl7CgkJCQlpZiAoc3RhdGUuY29udGV4dCA9PSAxICYmIHZhcmlhYmxlczEudGVzdCh3KSkKCQkJCQlyZXR1cm4gJ3ZhcmlhYmxlLTInOwoJCQkJCgkJCQlpZiAoc3RhdGUuY29udGV4dCA9PSAyICYmIHZhcmlhYmxlczIudGVzdCh3KSkKCQkJCQlyZXR1cm4gJ3ZhcmlhYmxlLTMnOwoJCQkJCgkJCQlpZiAoa2V5d29yZHMxLnRlc3QodykpCgkJCQl7CgkJCQkJc3RhdGUuY29udGV4dCA9IDE7CgkJCQkJcmV0dXJuICdrZXl3b3JkJzsKCQkJCX0KCQkJCWVsc2UgaWYgKGtleXdvcmRzMi50ZXN0KHcpKQoJCQkJewoJCQkJCXN0YXRlLmNvbnRleHQgPSAyOwoJCQkJCXJldHVybiAna2V5d29yZCc7CgkJCQl9CgkJCQllbHNlIGlmIChrZXl3b3JkczMudGVzdCh3KSkKCQkJCXsKCQkJCQlzdGF0ZS5jb250ZXh0ID0gMzsKCQkJCQlyZXR1cm4gJ2tleXdvcmQnOwoJCQkJfQoJCQkJCgkJCQlpZiAoZXJyb3JzLnRlc3QodykpCgkJCQkJcmV0dXJuICdlcnJvcic7CgkJCX0KCQkJZWxzZSBpZiAobnVtYmVycy50ZXN0KHcpKQoJCQl7CgkJCQlyZXR1cm4gJ251bWJlcic7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoJCX0KCQllbHNlIGlmIChzdHJlYW0uZWF0KCc7JykpCgkJewoJCQlzdHJlYW0uc2tpcFRvRW5kKCk7CgkJCXJldHVybiAnY29tbWVudCc7CgkJfQoJCWVsc2UgaWYgKHN0cmVhbS5lYXQoJyInKSkKCQl7CgkJCXdoaWxlICh3ID0gc3RyZWFtLm5leHQoKSkKCQkJewoJCQkJaWYgKHcgPT0gJyInKQoJCQkJCWJyZWFrOwoJCQkJCgkJCQlpZiAodyA9PSAnXFwnKQoJCQkJCXN0cmVhbS5uZXh0KCk7CgkJCX0KCQkJCgkJCXJldHVybiAnc3RyaW5nJzsKCQl9CgkJZWxzZSBpZiAoc3RyZWFtLmVhdCgnXCcnKSkKCQl7CgkJCWlmIChzdHJlYW0ubWF0Y2goL1xcPy4nLykpCgkJCQlyZXR1cm4gJ251bWJlcic7CgkJfQoJCWVsc2UgaWYgKHN0cmVhbS5lYXQoJy4nKSB8fCBzdHJlYW0uc29sKCkgJiYgc3RyZWFtLmVhdCgnIycpKQoJCXsKCQkJc3RhdGUuY29udGV4dCA9IDQ7CgkJCQoJCQlpZiAoc3RyZWFtLmVhdFdoaWxlKC9cdy8pKQoJCQkJcmV0dXJuICdkZWYnOwoJCX0KCQllbHNlIGlmIChzdHJlYW0uZWF0KCckJykpCgkJewoJCQlpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXGRhLWZdL2kpKQoJCQkJcmV0dXJuICdudW1iZXInOwoJCX0KCQllbHNlIGlmIChzdHJlYW0uZWF0KCclJykpCgkJewoJCQlpZiAoc3RyZWFtLmVhdFdoaWxlKC9bMDFdLykpCgkJCQlyZXR1cm4gJ251bWJlcic7CgkJfQoJCWVsc2UKCQl7CgkJCXN0cmVhbS5uZXh0KCk7CgkJfQoJCQoJCXJldHVybiBudWxsOwoJfX07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtejgwIiwgIno4MCIpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/package.json</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ewogICAgIm5hbWUiOiAiY29kZW1pcnJvciIsCiAgICAidmVyc2lvbiI6IjMuMC4yIiwKICAgICJtYWluIjogImNvZGVtaXJyb3IuanMiLAogICAgImRlc2NyaXB0aW9uIjogIkluLWJyb3dzZXIgY29kZSBlZGl0aW5nIG1hZGUgYmVhcmFibGUiLAogICAgImxpY2Vuc2VzIjogW3sidHlwZSI6ICJNSVQiLAogICAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFIn1dLAogICAgImRpcmVjdG9yaWVzIjogeyJsaWIiOiAiLi9saWIifSwKICAgICJzY3JpcHRzIjogeyJ0ZXN0IjogIm5vZGUgLi90ZXN0L3J1bi5qcyJ9LAogICAgImRldkRlcGVuZGVuY2llcyI6IHsibm9kZS1zdGF0aWMiOiAiMC42LjAifSwKICAgICJidWdzIjogImh0dHA6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9pc3N1ZXMiLAogICAgImtleXdvcmRzIjogWyJKYXZhU2NyaXB0IiwgIkNvZGVNaXJyb3IiLCAiRWRpdG9yIl0sCiAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL2NvZGVtaXJyb3IubmV0IiwKICAgICJtYWludGFpbmVycyI6W3sibmFtZSI6ICJNYXJpam4gSGF2ZXJiZWtlIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAibWFyaWpuaEBnbWFpbC5jb20iLAogICAgICAgICAgICAgICAgICAgICJ3ZWIiOiAiaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubCJ9XSwKICAgICJyZXBvc2l0b3JpZXMiOiBbeyJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3IifSwKICAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IuZ2l0In1dCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/README.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBDb2RlTWlycm9yIFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly9zZWN1cmUudHJhdmlzLWNpLm9yZy9tYXJpam5oL0NvZGVNaXJyb3IucG5nP2JyYW5jaD1tYXN0ZXIpXShodHRwOi8vdHJhdmlzLWNpLm9yZy9tYXJpam5oL0NvZGVNaXJyb3IpCgpDb2RlTWlycm9yIGlzIGEgSmF2YVNjcmlwdCBjb21wb25lbnQgdGhhdCBwcm92aWRlcyBhIGNvZGUgZWRpdG9yIGluCnRoZSBicm93c2VyLiBXaGVuIGEgbW9kZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBsYW5ndWFnZSB5b3UgYXJlIGNvZGluZwppbiwgaXQgd2lsbCBjb2xvciB5b3VyIGNvZGUsIGFuZCBvcHRpb25hbGx5IGhlbHAgd2l0aCBpbmRlbnRhdGlvbi4KClRoZSBwcm9qZWN0IHBhZ2UgaXMgaHR0cDovL2NvZGVtaXJyb3IubmV0ICAKVGhlIG1hbnVhbCBpcyBhdCBodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sICAKVGhlIGNvbnRyaWJ1dGluZyBndWlkZWxpbmVzIGFyZSBpbiB0aGUgQ09OVFJJQlVUSU5HLm1kIGZpbGUK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/test/driver.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIHRlc3RzID0gW10sIGRlYnVnID0gbnVsbCwgZGVidWdVc2VkID0gbmV3IEFycmF5KCksIGFsbE5hbWVzID0gW107CgpmdW5jdGlvbiBGYWlsdXJlKHdoeSkge3RoaXMubWVzc2FnZSA9IHdoeTt9CkZhaWx1cmUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLm1lc3NhZ2U7IH07CgpmdW5jdGlvbiBpbmRleE9mKGNvbGxlY3Rpb24sIGVsdCkgewogIGlmIChjb2xsZWN0aW9uLmluZGV4T2YpIHJldHVybiBjb2xsZWN0aW9uLmluZGV4T2YoZWx0KTsKICBmb3IgKHZhciBpID0gMCwgZSA9IGNvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgZTsgKytpKQogICAgaWYgKGNvbGxlY3Rpb25baV0gPT0gZWx0KSByZXR1cm4gaTsKICByZXR1cm4gLTE7Cn0KCmZ1bmN0aW9uIHRlc3QobmFtZSwgcnVuLCBleHBlY3RlZEZhaWwpIHsKICAvLyBGb3JjZSB1bmlxdWUgbmFtZXMKICB2YXIgb3JpZ2luYWxOYW1lID0gbmFtZTsKICB2YXIgaSA9IDI7IC8vIFNlY29uZCBmdW5jdGlvbiB3b3VsZCBiZSBOQU1FXzIKICB3aGlsZSAoaW5kZXhPZihhbGxOYW1lcywgbmFtZSkgIT09IC0xKXsKICAgIG5hbWUgPSBvcmlnaW5hbE5hbWUgKyAiXyIgKyBpOwogICAgaSsrOwogIH0KICBhbGxOYW1lcy5wdXNoKG5hbWUpOwogIC8vIEFkZCB0ZXN0CiAgdGVzdHMucHVzaCh7bmFtZTogbmFtZSwgZnVuYzogcnVuLCBleHBlY3RlZEZhaWw6IGV4cGVjdGVkRmFpbH0pOwogIHJldHVybiBuYW1lOwp9CmZ1bmN0aW9uIHRlc3RDTShuYW1lLCBydW4sIG9wdHMsIGV4cGVjdGVkRmFpbCkgewogIHJldHVybiB0ZXN0KCJjb3JlXyIgKyBuYW1lLCBmdW5jdGlvbigpIHsKICAgIHZhciBwbGFjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0Z3JvdW5kIiksIGNtID0gQ29kZU1pcnJvcihwbGFjZSwgb3B0cyk7CiAgICB2YXIgc3VjY2Vzc2Z1bCA9IGZhbHNlOwogICAgdHJ5IHsKICAgICAgcnVuKGNtKTsKICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7CiAgICB9IGZpbmFsbHkgewogICAgICBpZiAoKGRlYnVnICYmICFzdWNjZXNzZnVsKSB8fCB2ZXJib3NlKSB7CiAgICAgICAgcGxhY2Uuc3R5bGUudmlzaWJpbGl0eSA9ICIiOwogICAgICB9IGVsc2UgewogICAgICAgIHBsYWNlLnJlbW92ZUNoaWxkKGNtLmdldFdyYXBwZXJFbGVtZW50KCkpOwogICAgICB9CiAgICB9CiAgfSwgZXhwZWN0ZWRGYWlsKTsKfQoKZnVuY3Rpb24gcnVuVGVzdHMoY2FsbGJhY2spIHsKICBpZiAoZGVidWcpIHsKICAgIGlmIChpbmRleE9mKGRlYnVnLCAidmVyYm9zZSIpID09PSAwKSB7CiAgICAgIHZlcmJvc2UgPSB0cnVlOwogICAgICBkZWJ1Zy5zcGxpY2UoMCwgMSk7CiAgICB9CiAgICBpZiAoZGVidWcubGVuZ3RoIDwgMSkgewogICAgICBkZWJ1ZyA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICBpZiAodG90YWxUZXN0cyA+IGRlYnVnLmxlbmd0aCkgewogICAgICAgIHRvdGFsVGVzdHMgPSBkZWJ1Zy5sZW5ndGg7CiAgICAgIH0KICAgIH0KICB9CiAgdmFyIHRvdGFsVGltZSA9IDA7CiAgZnVuY3Rpb24gc3RlcChpKSB7CiAgICBpZiAoaSA9PT0gdGVzdHMubGVuZ3RoKXsKICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgICByZXR1cm4gY2FsbGJhY2soImRvbmUiKTsKICAgIH0KICAgIHZhciB0ZXN0ID0gdGVzdHNbaV0sIGV4cEZhaWwgPSB0ZXN0LmV4cGVjdGVkRmFpbCwgc3RhcnRUaW1lID0gK25ldyBEYXRlOwogICAgaWYgKGRlYnVnICE9PSBudWxsKSB7CiAgICAgIHZhciBkZWJ1Z0luZGV4ID0gaW5kZXhPZihkZWJ1ZywgdGVzdC5uYW1lKTsKICAgICAgaWYgKGRlYnVnSW5kZXggIT09IC0xKSB7CiAgICAgICAgLy8gUmVtb3ZlIGZyb20gYXJyYXkgZm9yIHJlcG9ydGluZyBpbmNvcnJlY3QgdGVzdHMgbGF0ZXIKICAgICAgICBkZWJ1Zy5zcGxpY2UoZGVidWdJbmRleCwgMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHdpbGRjYXJkTmFtZSA9IHRlc3QubmFtZS5zcGxpdCgiXyIpLnNoaWZ0KCkgKyAiXyoiOwogICAgICAgIGRlYnVnSW5kZXggPSBpbmRleE9mKGRlYnVnLCB3aWxkY2FyZE5hbWUpOwogICAgICAgIGlmIChkZWJ1Z0luZGV4ICE9PSAtMSkgewogICAgICAgICAgLy8gUmVtb3ZlIGZyb20gYXJyYXkgZm9yIHJlcG9ydGluZyBpbmNvcnJlY3QgdGVzdHMgbGF0ZXIKICAgICAgICAgIGRlYnVnLnNwbGljZShkZWJ1Z0luZGV4LCAxKTsKICAgICAgICAgIGRlYnVnVXNlZC5wdXNoKHdpbGRjYXJkTmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRlYnVnSW5kZXggPSBpbmRleE9mKGRlYnVnVXNlZCwgd2lsZGNhcmROYW1lKTsKICAgICAgICAgIGlmIChkZWJ1Z0luZGV4ICE9PSAtMSkgewogICAgICAgICAgICB0b3RhbFRlc3RzKys7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gc3RlcChpICsgMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB2YXIgdGhyZXcgPSBmYWxzZTsKICAgIHRyeSB7CiAgICAgIHZhciBtZXNzYWdlID0gdGVzdC5mdW5jKCk7CiAgICB9IGNhdGNoKGUpIHsKICAgICAgdGhyZXcgPSB0cnVlOwogICAgICBpZiAoZXhwRmFpbCkgY2FsbGJhY2soImV4cGVjdGVkIiwgdGVzdC5uYW1lKTsKICAgICAgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEZhaWx1cmUpIGNhbGxiYWNrKCJmYWlsIiwgdGVzdC5uYW1lLCBlLm1lc3NhZ2UpOwogICAgICBlbHNlIHsKICAgICAgICB2YXIgcG9zID0gL1xiYXQgLio/KFteXC86XSspOihcZCspOi8uZXhlYyhlLnN0YWNrKTsKICAgICAgICBjYWxsYmFjaygiZXJyb3IiLCB0ZXN0Lm5hbWUsIGUudG9TdHJpbmcoKSArIChwb3MgPyAiICgiICsgcG9zWzFdICsgIjoiICsgcG9zWzJdICsgIikiIDogIiIpKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aHJldykgewogICAgICBpZiAoZXhwRmFpbCkgY2FsbGJhY2soImZhaWwiLCB0ZXN0Lm5hbWUsIG1lc3NhZ2UgfHwgImV4cGVjdGVkIGZhaWx1cmUsIGJ1dCBzdWNjZWVkZWQiKTsKICAgICAgZWxzZSBjYWxsYmFjaygib2siLCB0ZXN0Lm5hbWUsIG1lc3NhZ2UpOwogICAgfQogICAgaWYgKCFxdWl0KSB7IC8vIFJ1biBuZXh0IHRlc3QKICAgICAgdmFyIGRlbGF5ID0gMDsKICAgICAgdG90YWxUaW1lICs9ICgrbmV3IERhdGUpIC0gc3RhcnRUaW1lOwogICAgICBpZiAodG90YWxUaW1lID4gNTAwKXsKICAgICAgICB0b3RhbFRpbWUgPSAwOwogICAgICAgIGRlbGF5ID0gNTA7CiAgICAgIH0KICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe3N0ZXAoaSArIDEpO30sIGRlbGF5KTsKICAgIH0gZWxzZSB7IC8vIFF1aXQgdGVzdHMKICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgc3RlcCgwKTsKfQoKZnVuY3Rpb24gbGFiZWwoc3RyLCBtc2cpIHsKICBpZiAobXNnKSByZXR1cm4gc3RyICsgIiAoIiArIG1zZyArICIpIjsKICByZXR1cm4gc3RyOwp9CmZ1bmN0aW9uIGVxKGEsIGIsIG1zZykgewogIGlmIChhICE9IGIpIHRocm93IG5ldyBGYWlsdXJlKGxhYmVsKGEgKyAiICE9ICIgKyBiLCBtc2cpKTsKfQpmdW5jdGlvbiBlcVBvcyhhLCBiLCBtc2cpIHsKICBmdW5jdGlvbiBzdHIocCkgeyByZXR1cm4gIntsaW5lOiIgKyBwLmxpbmUgKyAiLGNoOiIgKyBwLmNoICsgIn0iOyB9CiAgaWYgKGEgPT0gYikgcmV0dXJuOwogIGlmIChhID09IG51bGwpIHRocm93IG5ldyBGYWlsdXJlKGxhYmVsKCJjb21wYXJpbmcgbnVsbCB0byAiICsgc3RyKGIpKSk7CiAgaWYgKGIgPT0gbnVsbCkgdGhyb3cgbmV3IEZhaWx1cmUobGFiZWwoImNvbXBhcmluZyAiICsgc3RyKGEpICsgIiB0byBudWxsIikpOwogIGlmIChhLmxpbmUgIT0gYi5saW5lIHx8IGEuY2ggIT0gYi5jaCkgdGhyb3cgbmV3IEZhaWx1cmUobGFiZWwoc3RyKGEpICsgIiAhPSAiICsgc3RyKGIpLCBtc2cpKTsKfQpmdW5jdGlvbiBpcyhhLCBtc2cpIHsKICBpZiAoIWEpIHRocm93IG5ldyBGYWlsdXJlKGxhYmVsKCJhc3NlcnRpb24gZmFpbGVkIiwgbXNnKSk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFRlc3QgU3VpdGU8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJtb2RlX3Rlc3QuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL3V0aWwvb3ZlcmxheS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbGliL3V0aWwvc2VhcmNoY3Vyc29yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9rZXltYXAvdmltLmpzIj48L3NjcmlwdD4KCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAub2sge2NvbG9yOiAjMDkwO30KICAgICAgLmZhaWwge2NvbG9yOiAjZTAwO30KICAgICAgLmVycm9yIHtjb2xvcjogI2M5MDt9CiAgICAgIC5kb25lIHtmb250LXdlaWdodDogYm9sZDt9CiAgICAgICNwcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ1ZDsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMCAxcHggIzQ1ZCwgMCAwIDJweCAjNDVkLCAwIDAgM3B4ICM0NWQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgfQogICAgICAuQ29kZU1pcnJvciB7IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMT5Db2RlTWlycm9yOiBUZXN0IFN1aXRlPC9oMT4KCiAgICA8cD5BIGxpbWl0ZWQgc2V0IG9mIHByb2dyYW1tYXRpYyBzYW5pdHkgdGVzdHMgZm9yIENvZGVNaXJyb3IuPC9wPgoKICAgIDxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAxcHg7IG1heC13aWR0aDogNzAwcHg7Ij4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDBweDsiIGlkPXByb2dyZXNzPjxkaXYgc3R5bGU9InBhZGRpbmc6IDNweDsiPlJhbiA8c3BhbiBpZD0icHJvZ3Jlc3NfcmFuIj4wPC9zcGFuPjxzcGFuIGlkPSJwcm9ncmVzc190b3RhbCI+IG9mIDA8L3NwYW4+IHRlc3RzPC9kaXY+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxwIGlkPXN0YXR1cz5QbGVhc2UgZW5hYmxlIEphdmFTY3JpcHQuLi48L3A+CiAgICA8ZGl2IGlkPW91dHB1dD48L2Rpdj4KCiAgICA8ZGl2IHN0eWxlPSJ2aXNpYmlsaXR5OiBoaWRkZW4iIGlkPXRlc3Rncm91bmQ+PC9kaXY+CgogICAgPHNjcmlwdCBzcmM9ImRyaXZlci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ibW9kZV90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2Nzcy9jc3MuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvbWFya2Rvd24vbWFya2Rvd24uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvbWFya2Rvd24vdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9nZm0vZ2ZtLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2dmbS90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3N0ZXgvc3RleC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9zdGV4L3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUveHF1ZXJ5L3hxdWVyeS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94cXVlcnkvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idmltX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJ1bkhhcm5lc3MoKTsKICAgICAgfTsKICAgICAgQ29kZU1pcnJvci5vbih3aW5kb3csICdoYXNoY2hhbmdlJywgZnVuY3Rpb24oKXsKICAgICAgICBydW5IYXJuZXNzKCk7CiAgICAgIH0pOwoKICAgICAgZnVuY3Rpb24gZXNjKHN0cikgewogICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWzwmXS8sIGZ1bmN0aW9uKGNoKSB7IHJldHVybiBjaCA9PSAiPCIgPyAiJmx0OyIgOiAiJmFtcDsiOyB9KTsKICAgICAgfQoKICAgICAgdmFyIG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKSwKICAgICAgICAgIHByb2dyZXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzIiksCiAgICAgICAgICBwcm9ncmVzc1JhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9ncmVzc19yYW4iKS5jaGlsZE5vZGVzWzBdLAogICAgICAgICAgcHJvZ3Jlc3NUb3RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9ncmVzc190b3RhbCIpLmNoaWxkTm9kZXNbMF07CiAgICAgIHZhciBjb3VudCA9IDAsCiAgICAgICAgICBmYWlsZWQgPSAwLAogICAgICAgICAgYmFkID0gIiIsCiAgICAgICAgICBydW5uaW5nID0gZmFsc2UsIC8vIEZsYWcgdGhhdCBzdGF0ZXMgdGVzdHMgYXJlIHJ1bm5pbmcKICAgICAgICAgcXVpdCA9IGZhbHNlLCAvLyBGbGFnIHRvIHF1aXQgdGVzdHMgQVNBUAogICAgICAgICB2ZXJib3NlID0gZmFsc2U7IC8vIEFkZHMgbWVzc2FnZSBmb3IgKmV2ZXJ5KiB0ZXN0IHRvIG91dHB1dAogICAgICAKICAgICAgZnVuY3Rpb24gcnVuSGFybmVzcygpewogICAgICAgIGlmIChydW5uaW5nKSB7CiAgICAgICAgICBxdWl0ID0gdHJ1ZTsKICAgICAgICAgIHNldFN0YXR1cygiUmVzdGFydGluZyB0ZXN0cy4uLiIsICcnLCB0cnVlKTsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtydW5IYXJuZXNzKCk7fSwgNTAwKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cigxKSl7CiAgICAgICAgICBkZWJ1ZyA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cigxKS5zcGxpdCgiLCIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZWJ1ZyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHF1aXQgPSBmYWxzZTsKICAgICAgICBydW5uaW5nID0gdHJ1ZTsKICAgICAgICBzZXRTdGF0dXMoIkxvYWRpbmcgdGVzdHMuLi4iKTsKICAgICAgICBjb3VudCA9IDA7CiAgICAgICAgZmFpbGVkID0gMDsKICAgICAgICBiYWQgPSAiIjsKICAgICAgICB2ZXJib3NlID0gZmFsc2U7CiAgICAgICAgZGVidWdVc2VkID0gQXJyYXkoKTsKICAgICAgICB0b3RhbFRlc3RzID0gdGVzdHMubGVuZ3RoOwogICAgICAgIHByb2dyZXNzVG90YWwubm9kZVZhbHVlID0gIiBvZiAiICsgdG90YWxUZXN0czsKICAgICAgICBwcm9ncmVzc1Jhbi5ub2RlVmFsdWUgPSBjb3VudDsKICAgICAgICBvdXRwdXQuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Rncm91bmQiKS5pbm5lckhUTUwgPSAiPGZvcm0+IiArCiAgICAgICAgICAiPHRleHRhcmVhIGlkPVwiY29kZVwiIG5hbWU9XCJjb2RlXCI+PC90ZXh0YXJlYT4iICsKICAgICAgICAgICI8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9b2sgbmFtZT1zdWJtaXQ+IiArCiAgICAgICAgICAiPC9mb3JtPiI7CiAgICAgICAgcnVuVGVzdHMoZGlzcGxheVRlc3QpOwogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXRTdGF0dXMobWVzc2FnZSwgY2xhc3NOYW1lLCBmb3JjZSl7CiAgICAgICAgaWYgKHF1aXQgJiYgIWZvcmNlKSByZXR1cm47CiAgICAgICAgaWYgKCFtZXNzYWdlKSB0aHJvdygibXVzdCBwcm92aWRlIG1lc3NhZ2UiKTsKICAgICAgICB2YXIgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YXR1cyIpLmNoaWxkTm9kZXNbMF07CiAgICAgICAgc3RhdHVzLm5vZGVWYWx1ZSA9IG1lc3NhZ2U7CiAgICAgICAgc3RhdHVzLnBhcmVudE5vZGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGFkZE91dHB1dChuYW1lLCBjbGFzc05hbWUsIGNvZGUpewogICAgICAgIHZhciBuZXdPdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkbCIpOwogICAgICAgIHZhciBuZXdUaXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImR0Iik7CiAgICAgICAgbmV3VGl0bGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgICAgIG5ld1RpdGxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5hbWUpKTsKICAgICAgICBuZXdPdXRwdXQuYXBwZW5kQ2hpbGQobmV3VGl0bGUpOwogICAgICAgIHZhciBuZXdNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGQiKTsKICAgICAgICBuZXdNZXNzYWdlLmlubmVySFRNTCA9IGNvZGU7CiAgICAgICAgbmV3T3V0cHV0LmFwcGVuZENoaWxkKG5ld1RpdGxlKTsKICAgICAgICBuZXdPdXRwdXQuYXBwZW5kQ2hpbGQobmV3TWVzc2FnZSk7CiAgICAgICAgb3V0cHV0LmFwcGVuZENoaWxkKG5ld091dHB1dCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZGlzcGxheVRlc3QodHlwZSwgbmFtZSwgY3VzdG9tTWVzc2FnZSkgewogICAgICAgIHZhciBtZXNzYWdlID0gIj8/PyI7CiAgICAgICAgaWYgKHR5cGUgIT0gImRvbmUiKSArK2NvdW50OwogICAgICAgIHByb2dyZXNzLnN0eWxlLndpZHRoID0gKGNvdW50ICogKHByb2dyZXNzLnBhcmVudE5vZGUuY2xpZW50V2lkdGggLSAyKSAvIHRvdGFsVGVzdHMpICsgInB4IjsKICAgICAgICBwcm9ncmVzc1RvdGFsLm5vZGVWYWx1ZSA9ICIgb2YgIiArIHRvdGFsVGVzdHMgKwogICAgICAgICAgKGRlYnVnVXNlZC5sZW5ndGggJiYgdHlwZSAhPSAiZG9uZSIgPyAiKyIgOiAiIik7CiAgICAgICAgcHJvZ3Jlc3NSYW4ubm9kZVZhbHVlID0gY291bnQ7CiAgICAgICAgaWYgKHR5cGUgPT0gIm9rIikgewogICAgICAgICAgbWVzc2FnZSA9ICJUZXN0ICciICsgbmFtZSArICInIHN1Y2NlZWRlZCI7CiAgICAgICAgICBpZiAoIXZlcmJvc2UpIGN1c3RvbU1lc3NhZ2UgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImV4cGVjdGVkIikgewogICAgICAgICAgbWVzc2FnZSA9ICJUZXN0ICciICsgbmFtZSArICInIGZhaWxlZCBhcyBleHBlY3RlZCI7CiAgICAgICAgICBpZiAoIXZlcmJvc2UpIGN1c3RvbU1lc3NhZ2UgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImVycm9yIiB8fCB0eXBlID09ICJmYWlsIikgewogICAgICAgICAgKytmYWlsZWQ7CiAgICAgICAgICBtZXNzYWdlID0gIlRlc3QgJyIgKyBuYW1lICsgIicgZmFpbGVkIjsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImRvbmUiKSB7CiAgICAgICAgICBpZiAoZmFpbGVkKSB7CiAgICAgICAgICAgIHR5cGUgKz0gIiBmYWlsIjsKICAgICAgICAgICAgbWVzc2FnZSA9IGZhaWxlZCArICIgZmFpbHVyZSIgKyAoZmFpbGVkID4gMSA/ICJzIiA6ICIiKTsKICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCB0b3RhbFRlc3RzKSB7CiAgICAgICAgICAgIGZhaWxlZCA9IHRvdGFsVGVzdHMgLSBjb3VudDsKICAgICAgICAgICAgdHlwZSArPSAiIGZhaWwiOwogICAgICAgICAgICBtZXNzYWdlID0gZmFpbGVkICsgIiBmYWlsdXJlIiArIChmYWlsZWQgPiAxID8gInMiIDogIiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdHlwZSArPSAiIG9rIjsKICAgICAgICAgICAgbWVzc2FnZSA9ICJBbGwgcGFzc2VkIjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChkZWJ1ZyAmJiBkZWJ1Zy5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGJvZ3VzVGVzdHMgPSB0b3RhbFRlc3RzIC0gY291bnQ7CiAgICAgICAgICAgIG1lc3NhZ2UgKz0gIiDigJQgIiArIGJvZ3VzVGVzdHMgKyAiIG5vbmV4aXN0ZW50IHRlc3QiICsKICAgICAgICAgICAgICAoYm9ndXNUZXN0cyA+IDEgPyAicyIgOiAiIikgKyAiIHJlcXVlc3RlZCBieSBsb2NhdGlvbi5oYXNoOiAiICsKICAgICAgICAgICAgICAiYCIgKyBkZWJ1Zy5qb2luKCJgLCBgIikgKyAiYCI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcm9ncmVzc1RvdGFsLm5vZGVWYWx1ZSA9ICcnOwogICAgICAgICAgfQogICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRydWU7IC8vIEhhY2sgdG8gYXZvaWQgYWRkaW5nIHRvIG91dHB1dAogICAgICAgIH0KICAgICAgICBpZiAodmVyYm9zZSAmJiAhY3VzdG9tTWVzc2FnZSkgIGN1c3RvbU1lc3NhZ2UgPSBtZXNzYWdlOwogICAgICAgIHNldFN0YXR1cyhtZXNzYWdlLCB0eXBlKTsKICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAmJiBjdXN0b21NZXNzYWdlLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGFkZE91dHB1dChuYW1lLCB0eXBlLCBjdXN0b21NZXNzYWdlKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/lint/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/test/lint/acorn.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQWNvcm4gaXMgYSB0aW55LCBmYXN0IEphdmFTY3JpcHQgcGFyc2VyIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdC4KLy8KLy8gQWNvcm4gd2FzIHdyaXR0ZW4gYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgcmVsZWFzZWQgdW5kZXIgYW4gTUlUCi8vIGxpY2Vuc2UuIFRoZSBVbmljb2RlIHJlZ2V4cHMgKGZvciBpZGVudGlmaWVycyBhbmQgd2hpdGVzcGFjZSkgd2VyZQovLyB0YWtlbiBmcm9tIFtFc3ByaW1hXShodHRwOi8vZXNwcmltYS5vcmcpIGJ5IEFyaXlhIEhpZGF5YXQuCi8vCi8vIEdpdCByZXBvc2l0b3JpZXMgZm9yIEFjb3JuIGFyZSBhdmFpbGFibGUgYXQKLy8KLy8gICAgIGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2Fjb3JuCi8vICAgICBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9hY29ybi5naXQKLy8KLy8gUGxlYXNlIHVzZSB0aGUgW2dpdGh1YiBidWcgdHJhY2tlcl1bZ2hidF0gdG8gcmVwb3J0IGlzc3Vlcy4KLy8KLy8gW2doYnRdOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9hY29ybi9pc3N1ZXMKCihmdW5jdGlvbihleHBvcnRzKSB7CiAgInVzZSBzdHJpY3QiOwoKICBleHBvcnRzLnZlcnNpb24gPSAiMC4wLjEiOwoKICAvLyBUaGUgbWFpbiBleHBvcnRlZCBpbnRlcmZhY2UgKHVuZGVyIGB3aW5kb3cuYWNvcm5gIHdoZW4gaW4gdGhlCiAgLy8gYnJvd3NlcikgaXMgYSBgcGFyc2VgIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjb2RlIHN0cmluZyBhbmQKICAvLyByZXR1cm5zIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIGFzIHNwZWNpZmllZCBieSBbTW96aWxsYSBwYXJzZXIKICAvLyBBUEldW2FwaV0sIHdpdGggdGhlIGNhdmVhdCB0aGF0IHRoZSBTcGlkZXJNb25rZXktc3BlY2lmaWMgc3ludGF4CiAgLy8gKGBsZXRgLCBgeWllbGRgLCBpbmxpbmUgWE1MLCBldGMpIGlzIG5vdCByZWNvZ25pemVkLgogIC8vCiAgLy8gW2FwaV06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvU3BpZGVyTW9ua2V5L1BhcnNlcl9BUEkKCiAgdmFyIG9wdGlvbnMsIGlucHV0LCBpbnB1dExlbiwgc291cmNlRmlsZTsKCiAgZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uKGlucHQsIG9wdHMpIHsKICAgIGlucHV0ID0gU3RyaW5nKGlucHQpOyBpbnB1dExlbiA9IGlucHV0Lmxlbmd0aDsKICAgIG9wdGlvbnMgPSBvcHRzIHx8IHt9OwogICAgZm9yICh2YXIgb3B0IGluIGRlZmF1bHRPcHRpb25zKSBpZiAoIW9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0KSkKICAgICAgb3B0aW9uc1tvcHRdID0gZGVmYXVsdE9wdGlvbnNbb3B0XTsKICAgIHNvdXJjZUZpbGUgPSBvcHRpb25zLnNvdXJjZUZpbGUgfHwgbnVsbDsKICAgIHJldHVybiBwYXJzZVRvcExldmVsKG9wdGlvbnMucHJvZ3JhbSk7CiAgfTsKCiAgLy8gQSBzZWNvbmQgb3B0aW9uYWwgYXJndW1lbnQgY2FuIGJlIGdpdmVuIHRvIGZ1cnRoZXIgY29uZmlndXJlCiAgLy8gdGhlIHBhcnNlciBwcm9jZXNzLiBUaGVzZSBvcHRpb25zIGFyZSByZWNvZ25pemVkOgoKICB2YXIgZGVmYXVsdE9wdGlvbnMgPSBleHBvcnRzLmRlZmF1bHRPcHRpb25zID0gewogICAgLy8gYGVjbWFWZXJzaW9uYCBpbmRpY2F0ZXMgdGhlIEVDTUFTY3JpcHQgdmVyc2lvbiB0byBwYXJzZS4gTXVzdAogICAgLy8gYmUgZWl0aGVyIDMgb3IgNS4gVGhpcwogICAgLy8gaW5mbHVlbmNlcyBzdXBwb3J0IGZvciBzdHJpY3QgbW9kZSwgdGhlIHNldCBvZiByZXNlcnZlZCB3b3JkcywgYW5kCiAgICAvLyBzdXBwb3J0IGZvciBnZXR0ZXJzIGFuZCBzZXR0ZXIuCiAgICBlY21hVmVyc2lvbjogNSwKICAgIC8vIFR1cm4gb24gYHN0cmljdFNlbWljb2xvbnNgIHRvIHByZXZlbnQgdGhlIHBhcnNlciBmcm9tIGRvaW5nCiAgICAvLyBhdXRvbWF0aWMgc2VtaWNvbG9uIGluc2VydGlvbi4KICAgIHN0cmljdFNlbWljb2xvbnM6IGZhbHNlLAogICAgLy8gV2hlbiBgYWxsb3dUcmFpbGluZ0NvbW1hc2AgaXMgZmFsc2UsIHRoZSBwYXJzZXIgd2lsbCBub3QgYWxsb3cKICAgIC8vIHRyYWlsaW5nIGNvbW1hcyBpbiBhcnJheSBhbmQgb2JqZWN0IGxpdGVyYWxzLgogICAgYWxsb3dUcmFpbGluZ0NvbW1hczogdHJ1ZSwKICAgIC8vIEJ5IGRlZmF1bHQsIHJlc2VydmVkIHdvcmRzIGFyZSBub3QgZW5mb3JjZWQuIEVuYWJsZQogICAgLy8gYGZvcmJpZFJlc2VydmVkYCB0byBlbmZvcmNlIHRoZW0uCiAgICBmb3JiaWRSZXNlcnZlZDogZmFsc2UsCiAgICAvLyBXaGVuIGB0cmFja0NvbW1lbnRzYCBpcyB0dXJuZWQgb24sIHRoZSBwYXJzZXIgd2lsbCBhdHRhY2gKICAgIC8vIGBjb21tZW50c0JlZm9yZWAgYW5kIGBjb21tZW50c0FmdGVyYCBwcm9wZXJ0aWVzIHRvIEFTVCBub2RlcwogICAgLy8gaG9sZGluZyBhcnJheXMgb2Ygc3RyaW5ncy4gQSBzaW5nbGUgY29tbWVudCBtYXkgYXBwZWFyIGluIGJvdGgKICAgIC8vIGEgYGNvbW1lbnRzQmVmb3JlYCBhbmQgYGNvbW1lbnRzQWZ0ZXJgIGFycmF5IChvZiB0aGUgbm9kZXMKICAgIC8vIGFmdGVyIGFuZCBiZWZvcmUgaXQpLCBidXQgbmV2ZXIgdHdpY2UgaW4gdGhlIGJlZm9yZSAob3IgYWZ0ZXIpCiAgICAvLyBhcnJheSBvZiBkaWZmZXJlbnQgbm9kZXMuCiAgICB0cmFja0NvbW1lbnRzOiBmYWxzZSwKICAgIC8vIFdoZW4gYGxvY2F0aW9uc2AgaXMgb24sIGBsb2NgIHByb3BlcnRpZXMgaG9sZGluZyBvYmplY3RzIHdpdGgKICAgIC8vIGBzdGFydGAgYW5kIGBlbmRgIHByb3BlcnRpZXMgaW4gYHtsaW5lLCBjb2x1bW59YCBmb3JtICh3aXRoCiAgICAvLyBsaW5lIGJlaW5nIDEtYmFzZWQgYW5kIGNvbHVtbiAwLWJhc2VkKSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZQogICAgLy8gbm9kZXMuCiAgICBsb2NhdGlvbnM6IGZhbHNlLAogICAgLy8gTm9kZXMgaGF2ZSB0aGVpciBzdGFydCBhbmQgZW5kIGNoYXJhY3RlcnMgb2Zmc2V0cyByZWNvcmRlZCBpbgogICAgLy8gYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyAoZGlyZWN0bHkgb24gdGhlIG5vZGUsIHJhdGhlciB0aGFuCiAgICAvLyB0aGUgYGxvY2Agb2JqZWN0LCB3aGljaCBob2xkcyBsaW5lL2NvbHVtbiBkYXRhLiBUbyBhbHNvIGFkZCBhCiAgICAvLyBbc2VtaS1zdGFuZGFyZGl6ZWRdW3JhbmdlXSBgcmFuZ2VgIHByb3BlcnR5IGhvbGRpbmcgYSBgW3N0YXJ0LAogICAgLy8gZW5kXWAgYXJyYXkgd2l0aCB0aGUgc2FtZSBudW1iZXJzLCBzZXQgdGhlIGByYW5nZXNgIG9wdGlvbiB0bwogICAgLy8gYHRydWVgLgogICAgLy8KICAgIC8vIFtyYW5nZV06IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTY3OAogICAgcmFuZ2VzOiBmYWxzZSwKICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRvIHBhcnNlIG11bHRpcGxlIGZpbGVzIGludG8gYSBzaW5nbGUgQVNUIGJ5CiAgICAvLyBwYXNzaW5nIHRoZSB0cmVlIHByb2R1Y2VkIGJ5IHBhcnNpbmcgdGhlIGZpcnN0IGZpbGUgYXMKICAgIC8vIGBwcm9ncmFtYCBvcHRpb24gaW4gc3Vic2VxdWVudCBwYXJzZXMuIFRoaXMgd2lsbCBhZGQgdGhlCiAgICAvLyB0b3BsZXZlbCBmb3JtcyBvZiB0aGUgcGFyc2VkIGZpbGUgdG8gdGhlIGBQcm9ncmFtYCAodG9wKSBub2RlCiAgICAvLyBvZiBhbiBleGlzdGluZyBwYXJzZSB0cmVlLgogICAgcHJvZ3JhbTogbnVsbCwKICAgIC8vIFdoZW4gYGxvY2F0aW9uYCBpcyBvbiwgeW91IGNhbiBwYXNzIHRoaXMgdG8gcmVjb3JkIHRoZSBzb3VyY2UKICAgIC8vIGZpbGUgaW4gZXZlcnkgbm9kZSdzIGBsb2NgIG9iamVjdC4KICAgIHNvdXJjZUZpbGU6IG51bGwKICB9OwoKICAvLyBUaGUgYGdldExpbmVJbmZvYCBmdW5jdGlvbiBpcyBtb3N0bHkgdXNlZnVsIHdoZW4gdGhlCiAgLy8gYGxvY2F0aW9uc2Agb3B0aW9uIGlzIG9mZiAoZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMpIGFuZCB5b3UKICAvLyB3YW50IHRvIGZpbmQgdGhlIGxpbmUvY29sdW1uIHBvc2l0aW9uIGZvciBhIGdpdmVuIGNoYXJhY3RlcgogIC8vIG9mZnNldC4gYGlucHV0YCBzaG91bGQgYmUgdGhlIGNvZGUgc3RyaW5nIHRoYXQgdGhlIG9mZnNldCByZWZlcnMKICAvLyBpbnRvLgoKICB2YXIgZ2V0TGluZUluZm8gPSBleHBvcnRzLmdldExpbmVJbmZvID0gZnVuY3Rpb24oaW5wdXQsIG9mZnNldCkgewogICAgZm9yICh2YXIgbGluZSA9IDEsIGN1ciA9IDA7OykgewogICAgICBsaW5lQnJlYWsubGFzdEluZGV4ID0gY3VyOwogICAgICB2YXIgbWF0Y2ggPSBsaW5lQnJlYWsuZXhlYyhpbnB1dCk7CiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pbmRleCA8IG9mZnNldCkgewogICAgICAgICsrbGluZTsKICAgICAgICBjdXIgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKICAgICAgfSBlbHNlIGJyZWFrOwogICAgfQogICAgcmV0dXJuIHtsaW5lOiBsaW5lLCBjb2x1bW46IG9mZnNldCAtIGN1cn07CiAgfTsKCiAgLy8gQWNvcm4gaXMgb3JnYW5pemVkIGFzIGEgdG9rZW5pemVyIGFuZCBhIHJlY3Vyc2l2ZS1kZXNjZW50IHBhcnNlci4KICAvLyBCb3RoIHVzZSAoY2xvc3VyZS0pZ2xvYmFsIHZhcmlhYmxlcyB0byBrZWVwIHRoZWlyIHN0YXRlIGFuZAogIC8vIGNvbW11bmljYXRlLiBXZSBhbHJlYWR5IHNhdyB0aGUgYG9wdGlvbnNgLCBgaW5wdXRgLCBhbmQKICAvLyBgaW5wdXRMZW5gIHZhcmlhYmxlcyBhYm92ZSAoc2V0IGluIGBwYXJzZWApLgoKICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgdG9rZW5pemVyIGluIHRoZSBpbnB1dC4KCiAgdmFyIHRva1BvczsKCiAgLy8gVGhlIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0cyBvZiB0aGUgY3VycmVudCB0b2tlbi4KCiAgdmFyIHRva1N0YXJ0LCB0b2tFbmQ7CgogIC8vIFdoZW4gYG9wdGlvbnMubG9jYXRpb25zYCBpcyB0cnVlLCB0aGVzZSBob2xkIG9iamVjdHMKICAvLyBjb250YWluaW5nIHRoZSB0b2tlbnMgc3RhcnQgYW5kIGVuZCBsaW5lL2NvbHVtbiBwYWlycy4KCiAgdmFyIHRva1N0YXJ0TG9jLCB0b2tFbmRMb2M7CgogIC8vIFRoZSB0eXBlIGFuZCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0b2tlbi4gVG9rZW4gdHlwZXMgYXJlIG9iamVjdHMsCiAgLy8gbmFtZWQgYnkgdmFyaWFibGVzIGFnYWluc3Qgd2hpY2ggdGhleSBjYW4gYmUgY29tcGFyZWQsIGFuZAogIC8vIGhvbGRpbmcgcHJvcGVydGllcyB0aGF0IGRlc2NyaWJlIHRoZW0gKGluZGljYXRpbmcsIGZvciBleGFtcGxlLAogIC8vIHRoZSBwcmVjZWRlbmNlIG9mIGFuIGluZml4IG9wZXJhdG9yLCBhbmQgdGhlIG9yaWdpbmFsIG5hbWUgb2YgYQogIC8vIGtleXdvcmQgdG9rZW4pLiBUaGUga2luZCBvZiB2YWx1ZSB0aGF0J3MgaGVsZCBpbiBgdG9rVmFsYCBkZXBlbmRzCiAgLy8gb24gdGhlIHR5cGUgb2YgdGhlIHRva2VuLiBGb3IgbGl0ZXJhbHMsIGl0IGlzIHRoZSBsaXRlcmFsIHZhbHVlLAogIC8vIGZvciBvcGVyYXRvcnMsIHRoZSBvcGVyYXRvciBuYW1lLCBhbmQgc28gb24uCgogIHZhciB0b2tUeXBlLCB0b2tWYWw7CgogIC8vIFRoZXNlIGFyZSB1c2VkIHRvIGhvbGQgYXJyYXlzIG9mIGNvbW1lbnRzIHdoZW4KICAvLyBgb3B0aW9ucy50cmFja0NvbW1lbnRzYCBpcyB0cnVlLgoKICB2YXIgdG9rQ29tbWVudHNCZWZvcmUsIHRva0NvbW1lbnRzQWZ0ZXI7CgogIC8vIEludGVyYWwgc3RhdGUgZm9yIHRoZSB0b2tlbml6ZXIuIFRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGl2aXNpb24KICAvLyBvcGVyYXRvcnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGl0IHJlbWVtYmVycyB3aGV0aGVyIHRoZSBsYXN0CiAgLy8gdG9rZW4gd2FzIG9uZSB0aGF0IGlzIGFsbG93ZWQgdG8gYmUgZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbi4KICAvLyAoSWYgaXQgaXMsIGEgc2xhc2ggaXMgcHJvYmFibHkgYSByZWdleHAsIGlmIGl0IGlzbid0IGl0J3MgYQogIC8vIGRpdmlzaW9uIG9wZXJhdG9yLiBTZWUgdGhlIGBwYXJzZVN0YXRlbWVudGAgZnVuY3Rpb24gZm9yIGEKICAvLyBjYXZlYXQuKQoKICB2YXIgdG9rUmVnZXhwQWxsb3dlZCwgdG9rQ29tbWVudHM7CgogIC8vIFdoZW4gYG9wdGlvbnMubG9jYXRpb25zYCBpcyB0cnVlLCB0aGVzZSBhcmUgdXNlZCB0byBrZWVwCiAgLy8gdHJhY2sgb2YgdGhlIGN1cnJlbnQgbGluZSwgYW5kIGtub3cgd2hlbiBhIG5ldyBsaW5lIGhhcyBiZWVuCiAgLy8gZW50ZXJlZC4gU2VlIHRoZSBgY3VyTGluZUxvY2AgZnVuY3Rpb24uCgogIHZhciB0b2tDdXJMaW5lLCB0b2tMaW5lU3RhcnQsIHRva0xpbmVTdGFydE5leHQ7CgogIC8vIFRoZXNlIHN0b3JlIHRoZSBwb3NpdGlvbiBvZiB0aGUgcHJldmlvdXMgdG9rZW4sIHdoaWNoIGlzIHVzZWZ1bAogIC8vIHdoZW4gZmluaXNoaW5nIGEgbm9kZSBhbmQgYXNzaWduaW5nIGl0cyBgZW5kYCBwb3NpdGlvbi4KCiAgdmFyIGxhc3RTdGFydCwgbGFzdEVuZCwgbGFzdEVuZExvYzsKCiAgLy8gVGhpcyBpcyB0aGUgcGFyc2VyJ3Mgc3RhdGUuIGBpbkZ1bmN0aW9uYCBpcyB1c2VkIHRvIHJlamVjdAogIC8vIGByZXR1cm5gIHN0YXRlbWVudHMgb3V0c2lkZSBvZiBmdW5jdGlvbnMsIGBsYWJlbHNgIHRvIHZlcmlmeSB0aGF0CiAgLy8gYGJyZWFrYCBhbmQgYGNvbnRpbnVlYCBoYXZlIHNvbWV3aGVyZSB0byBqdW1wIHRvLCBhbmQgYHN0cmljdGAKICAvLyBpbmRpY2F0ZXMgd2hldGhlciBzdHJpY3QgbW9kZSBpcyBvbi4KCiAgdmFyIGluRnVuY3Rpb24sIGxhYmVscywgc3RyaWN0OwoKICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmFpc2UgZXhjZXB0aW9ucyBvbiBwYXJzZSBlcnJvcnMuIEl0CiAgLy8gdGFrZXMgZWl0aGVyIGEgYHtsaW5lLCBjb2x1bW59YCBvYmplY3Qgb3IgYW4gb2Zmc2V0IGludGVnZXIgKGludG8KICAvLyB0aGUgY3VycmVudCBgaW5wdXRgKSBhcyBgcG9zYCBhcmd1bWVudC4gSXQgYXR0YWNoZXMgdGhlIHBvc2l0aW9uCiAgLy8gdG8gdGhlIGVuZCBvZiB0aGUgZXJyb3IgbWVzc2FnZSwgYW5kIHRoZW4gcmFpc2VzIGEgYFN5bnRheEVycm9yYAogIC8vIHdpdGggdGhhdCBtZXNzYWdlLgoKICBmdW5jdGlvbiByYWlzZShwb3MsIG1lc3NhZ2UpIHsKICAgIGlmICh0eXBlb2YgcG9zID09ICJudW1iZXIiKSBwb3MgPSBnZXRMaW5lSW5mbyhpbnB1dCwgcG9zKTsKICAgIG1lc3NhZ2UgKz0gIiAoIiArIHBvcy5saW5lICsgIjoiICsgcG9zLmNvbHVtbiArICIpIjsKICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihtZXNzYWdlKTsKICB9CgogIC8vICMjIFRva2VuIHR5cGVzCgogIC8vIFRoZSBhc3NpZ25tZW50IG9mIGZpbmUtZ3JhaW5lZCwgaW5mb3JtYXRpb24tY2FycnlpbmcgdHlwZSBvYmplY3RzCiAgLy8gYWxsb3dzIHRoZSB0b2tlbml6ZXIgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGl0IGhhcyBhYm91dCBhCiAgLy8gdG9rZW4gaW4gYSB3YXkgdGhhdCBpcyB2ZXJ5IGNoZWFwIGZvciB0aGUgcGFyc2VyIHRvIGxvb2sgdXAuCgogIC8vIEFsbCB0b2tlbiB0eXBlIHZhcmlhYmxlcyBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUsIHRvIG1ha2UgdGhlbQogIC8vIGVhc3kgdG8gcmVjb2duaXplLgoKICAvLyBUaGVzZSBhcmUgdGhlIGdlbmVyYWwgdHlwZXMuIFRoZSBgdHlwZWAgcHJvcGVydHkgaXMgb25seSB1c2VkIHRvCiAgLy8gbWFrZSB0aGVtIHJlY29nbml6ZWFibGUgd2hlbiBkZWJ1Z2dpbmcuCgogIHZhciBfbnVtID0ge3R5cGU6ICJudW0ifSwgX3JlZ2V4cCA9IHt0eXBlOiAicmVnZXhwIn0sIF9zdHJpbmcgPSB7dHlwZTogInN0cmluZyJ9OwogIHZhciBfbmFtZSA9IHt0eXBlOiAibmFtZSJ9LCBfZW9mID0ge3R5cGU6ICJlb2YifTsKCiAgLy8gS2V5d29yZCB0b2tlbnMuIFRoZSBga2V5d29yZGAgcHJvcGVydHkgKGFsc28gdXNlZCBpbiBrZXl3b3JkLWxpa2UKICAvLyBvcGVyYXRvcnMpIGluZGljYXRlcyB0aGF0IHRoZSB0b2tlbiBvcmlnaW5hdGVkIGZyb20gYW4KICAvLyBpZGVudGlmaWVyLWxpa2Ugd29yZCwgd2hpY2ggaXMgdXNlZCB3aGVuIHBhcnNpbmcgcHJvcGVydHkgbmFtZXMuCiAgLy8KICAvLyBUaGUgYGJlZm9yZUV4cHJgIHByb3BlcnR5IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gcmVndWxhcgogIC8vIGV4cHJlc3Npb25zIGFuZCBkaXZpc2lvbnMuIEl0IGlzIHNldCBvbiBhbGwgdG9rZW4gdHlwZXMgdGhhdCBjYW4KICAvLyBiZSBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uICh0aHVzLCBhIHNsYXNoIGFmdGVyIHRoZW0gd291bGQgYmUgYQogIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbikuCiAgLy8KICAvLyBgaXNMb29wYCBtYXJrcyBhIGtleXdvcmQgYXMgc3RhcnRpbmcgYSBsb29wLCB3aGljaCBpcyBpbXBvcnRhbnQKICAvLyB0byBrbm93IHdoZW4gcGFyc2luZyBhIGxhYmVsLCBpbiBvcmRlciB0byBhbGxvdyBvciBkaXNhbGxvdwogIC8vIGNvbnRpbnVlIGp1bXBzIHRvIHRoYXQgbGFiZWwuCgogIHZhciBfYnJlYWsgPSB7a2V5d29yZDogImJyZWFrIn0sIF9jYXNlID0ge2tleXdvcmQ6ICJjYXNlIiwgYmVmb3JlRXhwcjogdHJ1ZX0sIF9jYXRjaCA9IHtrZXl3b3JkOiAiY2F0Y2gifTsKICB2YXIgX2NvbnRpbnVlID0ge2tleXdvcmQ6ICJjb250aW51ZSJ9LCBfZGVidWdnZXIgPSB7a2V5d29yZDogImRlYnVnZ2VyIn0sIF9kZWZhdWx0ID0ge2tleXdvcmQ6ICJkZWZhdWx0In07CiAgdmFyIF9kbyA9IHtrZXl3b3JkOiAiZG8iLCBpc0xvb3A6IHRydWV9LCBfZWxzZSA9IHtrZXl3b3JkOiAiZWxzZSIsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfZmluYWxseSA9IHtrZXl3b3JkOiAiZmluYWxseSJ9LCBfZm9yID0ge2tleXdvcmQ6ICJmb3IiLCBpc0xvb3A6IHRydWV9LCBfZnVuY3Rpb24gPSB7a2V5d29yZDogImZ1bmN0aW9uIn07CiAgdmFyIF9pZiA9IHtrZXl3b3JkOiAiaWYifSwgX3JldHVybiA9IHtrZXl3b3JkOiAicmV0dXJuIiwgYmVmb3JlRXhwcjogdHJ1ZX0sIF9zd2l0Y2ggPSB7a2V5d29yZDogInN3aXRjaCJ9OwogIHZhciBfdGhyb3cgPSB7a2V5d29yZDogInRocm93IiwgYmVmb3JlRXhwcjogdHJ1ZX0sIF90cnkgPSB7a2V5d29yZDogInRyeSJ9LCBfdmFyID0ge2tleXdvcmQ6ICJ2YXIifTsKICB2YXIgX3doaWxlID0ge2tleXdvcmQ6ICJ3aGlsZSIsIGlzTG9vcDogdHJ1ZX0sIF93aXRoID0ge2tleXdvcmQ6ICJ3aXRoIn0sIF9uZXcgPSB7a2V5d29yZDogIm5ldyIsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfdGhpcyA9IHtrZXl3b3JkOiAidGhpcyJ9OwoKICAvLyBUaGUga2V5d29yZHMgdGhhdCBkZW5vdGUgdmFsdWVzLgoKICB2YXIgX251bGwgPSB7a2V5d29yZDogIm51bGwiLCBhdG9tVmFsdWU6IG51bGx9LCBfdHJ1ZSA9IHtrZXl3b3JkOiAidHJ1ZSIsIGF0b21WYWx1ZTogdHJ1ZX07CiAgdmFyIF9mYWxzZSA9IHtrZXl3b3JkOiAiZmFsc2UiLCBhdG9tVmFsdWU6IGZhbHNlfTsKCiAgLy8gU29tZSBrZXl3b3JkcyBhcmUgdHJlYXRlZCBhcyByZWd1bGFyIG9wZXJhdG9ycy4gYGluYCBzb21ldGltZXMKICAvLyAod2hlbiBwYXJzaW5nIGBmb3JgKSBuZWVkcyB0byBiZSB0ZXN0ZWQgYWdhaW5zdCBzcGVjaWZpY2FsbHksIHNvCiAgLy8gd2UgYXNzaWduIGEgdmFyaWFibGUgbmFtZSB0byBpdCBmb3IgcXVpY2sgY29tcGFyaW5nLgoKICB2YXIgX2luID0ge2tleXdvcmQ6ICJpbiIsIGJpbm9wOiA3LCBiZWZvcmVFeHByOiB0cnVlfTsKCiAgLy8gTWFwIGtleXdvcmQgbmFtZXMgdG8gdG9rZW4gdHlwZXMuCgogIHZhciBrZXl3b3JkVHlwZXMgPSB7ImJyZWFrIjogX2JyZWFrLCAiY2FzZSI6IF9jYXNlLCAiY2F0Y2giOiBfY2F0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAiY29udGludWUiOiBfY29udGludWUsICJkZWJ1Z2dlciI6IF9kZWJ1Z2dlciwgImRlZmF1bHQiOiBfZGVmYXVsdCwKICAgICAgICAgICAgICAgICAgICAgICJkbyI6IF9kbywgImVsc2UiOiBfZWxzZSwgImZpbmFsbHkiOiBfZmluYWxseSwgImZvciI6IF9mb3IsCiAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24iOiBfZnVuY3Rpb24sICJpZiI6IF9pZiwgInJldHVybiI6IF9yZXR1cm4sICJzd2l0Y2giOiBfc3dpdGNoLAogICAgICAgICAgICAgICAgICAgICAgInRocm93IjogX3Rocm93LCAidHJ5IjogX3RyeSwgInZhciI6IF92YXIsICJ3aGlsZSI6IF93aGlsZSwgIndpdGgiOiBfd2l0aCwKICAgICAgICAgICAgICAgICAgICAgICJudWxsIjogX251bGwsICJ0cnVlIjogX3RydWUsICJmYWxzZSI6IF9mYWxzZSwgIm5ldyI6IF9uZXcsICJpbiI6IF9pbiwKICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZW9mIjoge2tleXdvcmQ6ICJpbnN0YW5jZW9mIiwgYmlub3A6IDd9LCAidGhpcyI6IF90aGlzLAogICAgICAgICAgICAgICAgICAgICAgInR5cGVvZiI6IHtrZXl3b3JkOiAidHlwZW9mIiwgcHJlZml4OiB0cnVlfSwKICAgICAgICAgICAgICAgICAgICAgICJ2b2lkIjoge2tleXdvcmQ6ICJ2b2lkIiwgcHJlZml4OiB0cnVlfSwKICAgICAgICAgICAgICAgICAgICAgICJkZWxldGUiOiB7a2V5d29yZDogImRlbGV0ZSIsIHByZWZpeDogdHJ1ZX19OwoKICAvLyBQdW5jdHVhdGlvbiB0b2tlbiB0eXBlcy4gQWdhaW4sIHRoZSBgdHlwZWAgcHJvcGVydHkgaXMgcHVyZWx5IGZvciBkZWJ1Z2dpbmcuCgogIHZhciBfYnJhY2tldEwgPSB7dHlwZTogIlsiLCBiZWZvcmVFeHByOiB0cnVlfSwgX2JyYWNrZXRSID0ge3R5cGU6ICJdIn0sIF9icmFjZUwgPSB7dHlwZTogInsiLCBiZWZvcmVFeHByOiB0cnVlfTsKICB2YXIgX2JyYWNlUiA9IHt0eXBlOiAifSJ9LCBfcGFyZW5MID0ge3R5cGU6ICIoIiwgYmVmb3JlRXhwcjogdHJ1ZX0sIF9wYXJlblIgPSB7dHlwZTogIikifTsKICB2YXIgX2NvbW1hID0ge3R5cGU6ICIsIiwgYmVmb3JlRXhwcjogdHJ1ZX0sIF9zZW1pID0ge3R5cGU6ICI7IiwgYmVmb3JlRXhwcjogdHJ1ZX07CiAgdmFyIF9jb2xvbiA9IHt0eXBlOiAiOiIsIGJlZm9yZUV4cHI6IHRydWV9LCBfZG90ID0ge3R5cGU6ICIuIn0sIF9xdWVzdGlvbiA9IHt0eXBlOiAiPyIsIGJlZm9yZUV4cHI6IHRydWV9OwoKICAvLyBPcGVyYXRvcnMuIFRoZXNlIGNhcnJ5IHNldmVyYWwga2luZHMgb2YgcHJvcGVydGllcyB0byBoZWxwIHRoZQogIC8vIHBhcnNlciB1c2UgdGhlbSBwcm9wZXJseSAodGhlIHByZXNlbmNlIG9mIHRoZXNlIHByb3BlcnRpZXMgaXMKICAvLyB3aGF0IGNhdGVnb3JpemVzIHRoZW0gYXMgb3BlcmF0b3JzKS4KICAvLwogIC8vIGBiaW5vcGAsIHdoZW4gcHJlc2VudCwgc3BlY2lmaWVzIHRoYXQgdGhpcyBvcGVyYXRvciBpcyBhIGJpbmFyeQogIC8vIG9wZXJhdG9yLCBhbmQgd2lsbCByZWZlciB0byBpdHMgcHJlY2VkZW5jZS4KICAvLwogIC8vIGBwcmVmaXhgIGFuZCBgcG9zdGZpeGAgbWFyayB0aGUgb3BlcmF0b3IgYXMgYSBwcmVmaXggb3IgcG9zdGZpeAogIC8vIHVuYXJ5IG9wZXJhdG9yLiBgaXNVcGRhdGVgIHNwZWNpZmllcyB0aGF0IHRoZSBub2RlIHByb2R1Y2VkIGJ5CiAgLy8gdGhlIG9wZXJhdG9yIHNob3VsZCBiZSBvZiB0eXBlIFVwZGF0ZUV4cHJlc3Npb24gcmF0aGVyIHRoYW4KICAvLyBzaW1wbHkgVW5hcnlFeHByZXNzaW9uIChgKytgIGFuZCBgLS1gKS4KICAvLwogIC8vIGBpc0Fzc2lnbmAgbWFya3MgYWxsIG9mIGA9YCwgYCs9YCwgYC09YCBldGNldGVyYSwgd2hpY2ggYWN0IGFzCiAgLy8gYmluYXJ5IG9wZXJhdG9ycyB3aXRoIGEgdmVyeSBsb3cgcHJlY2VkZW5jZSwgdGhhdCBzaG91bGQgcmVzdWx0CiAgLy8gaW4gQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZXMuCgogIHZhciBfc2xhc2ggPSB7Ymlub3A6IDEwLCBiZWZvcmVFeHByOiB0cnVlfSwgX2VxID0ge2lzQXNzaWduOiB0cnVlLCBiZWZvcmVFeHByOiB0cnVlfTsKICB2YXIgX2Fzc2lnbiA9IHtpc0Fzc2lnbjogdHJ1ZSwgYmVmb3JlRXhwcjogdHJ1ZX0sIF9wbHVzbWluID0ge2Jpbm9wOiA5LCBwcmVmaXg6IHRydWUsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfaW5jZGVjID0ge3Bvc3RmaXg6IHRydWUsIHByZWZpeDogdHJ1ZSwgaXNVcGRhdGU6IHRydWV9LCBfcHJlZml4ID0ge3ByZWZpeDogdHJ1ZSwgYmVmb3JlRXhwcjogdHJ1ZX07CiAgdmFyIF9iaW4xID0ge2Jpbm9wOiAxLCBiZWZvcmVFeHByOiB0cnVlfSwgX2JpbjIgPSB7Ymlub3A6IDIsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfYmluMyA9IHtiaW5vcDogMywgYmVmb3JlRXhwcjogdHJ1ZX0sIF9iaW40ID0ge2Jpbm9wOiA0LCBiZWZvcmVFeHByOiB0cnVlfTsKICB2YXIgX2JpbjUgPSB7Ymlub3A6IDUsIGJlZm9yZUV4cHI6IHRydWV9LCBfYmluNiA9IHtiaW5vcDogNiwgYmVmb3JlRXhwcjogdHJ1ZX07CiAgdmFyIF9iaW43ID0ge2Jpbm9wOiA3LCBiZWZvcmVFeHByOiB0cnVlfSwgX2JpbjggPSB7Ymlub3A6IDgsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfYmluMTAgPSB7Ymlub3A6IDEwLCBiZWZvcmVFeHByOiB0cnVlfTsKCiAgLy8gVGhpcyBpcyBhIHRyaWNrIHRha2VuIGZyb20gRXNwcmltYS4gSXQgdHVybnMgb3V0IHRoYXQsIG9uCiAgLy8gbm9uLUNocm9tZSBicm93c2VycywgdG8gY2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBpbiBhIHNldCwgYQogIC8vIHByZWRpY2F0ZSBjb250YWluaW5nIGEgYmlnIHVnbHkgYHN3aXRjaGAgc3RhdGVtZW50IGlzIGZhc3RlciB0aGFuCiAgLy8gYSByZWd1bGFyIGV4cHJlc3Npb24sIGFuZCBvbiBDaHJvbWUgdGhlIHR3byBhcmUgYWJvdXQgb24gcGFyLgogIC8vIFRoaXMgZnVuY3Rpb24gdXNlcyBgZXZhbGAgKG5vbi1sZXhpY2FsKSB0byBwcm9kdWNlIHN1Y2ggYQogIC8vIHByZWRpY2F0ZSBmcm9tIGEgc3BhY2Utc2VwYXJhdGVkIHN0cmluZyBvZiB3b3Jkcy4KICAvLwogIC8vIEl0IHN0YXJ0cyBieSBzb3J0aW5nIHRoZSB3b3JkcyBieSBsZW5ndGguCgogIGZ1bmN0aW9uIG1ha2VQcmVkaWNhdGUod29yZHMpIHsKICAgIHdvcmRzID0gd29yZHMuc3BsaXQoIiAiKTsKICAgIHZhciBmID0gIiIsIGNhdHMgPSBbXTsKICAgIG91dDogZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgewogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNhdHMubGVuZ3RoOyArK2opCiAgICAgICAgaWYgKGNhdHNbal1bMF0ubGVuZ3RoID09IHdvcmRzW2ldLmxlbmd0aCkgewogICAgICAgICAgY2F0c1tqXS5wdXNoKHdvcmRzW2ldKTsKICAgICAgICAgIGNvbnRpbnVlIG91dDsKICAgICAgICB9CiAgICAgIGNhdHMucHVzaChbd29yZHNbaV1dKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmVUbyhhcnIpIHsKICAgICAgaWYgKGFyci5sZW5ndGggPT0gMSkgcmV0dXJuIGYgKz0gInJldHVybiBzdHIgPT09ICIgKyBKU09OLnN0cmluZ2lmeShhcnJbMF0pICsgIjsiOwogICAgICBmICs9ICJzd2l0Y2goc3RyKXsiOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkgZiArPSAiY2FzZSAiICsgSlNPTi5zdHJpbmdpZnkoYXJyW2ldKSArICI6IjsKICAgICAgZiArPSAicmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlOyI7CiAgICB9CgogICAgLy8gV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIHRocmVlIGxlbmd0aCBjYXRlZ29yaWVzLCBhbiBvdXRlcgogICAgLy8gc3dpdGNoIGZpcnN0IGRpc3BhdGNoZXMgb24gdGhlIGxlbmd0aHMsIHRvIHNhdmUgb24gY29tcGFyaXNvbnMuCgogICAgaWYgKGNhdHMubGVuZ3RoID4gMykgewogICAgICBjYXRzLnNvcnQoZnVuY3Rpb24oYSwgYikge3JldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO30pOwogICAgICBmICs9ICJzd2l0Y2goc3RyLmxlbmd0aCl7IjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYXRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGNhdCA9IGNhdHNbaV07CiAgICAgICAgZiArPSAiY2FzZSAiICsgY2F0WzBdLmxlbmd0aCArICI6IjsKICAgICAgICBjb21wYXJlVG8oY2F0KTsKICAgICAgfQogICAgICBmICs9ICJ9IjsKCiAgICAvLyBPdGhlcndpc2UsIHNpbXBseSBnZW5lcmF0ZSBhIGZsYXQgYHN3aXRjaGAgc3RhdGVtZW50LgoKICAgIH0gZWxzZSB7CiAgICAgIGNvbXBhcmVUbyh3b3Jkcyk7CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJzdHIiLCBmKTsKICB9CgogIC8vIFRoZSBFQ01BU2NyaXB0IDMgcmVzZXJ2ZWQgd29yZCBsaXN0LgoKICB2YXIgaXNSZXNlcnZlZFdvcmQzID0gbWFrZVByZWRpY2F0ZSgiYWJzdHJhY3QgYm9vbGVhbiBieXRlIGNoYXIgY2xhc3MgZG91YmxlIGVudW0gZXhwb3J0IGV4dGVuZHMgZmluYWwgZmxvYXQgZ290byBpbXBsZW1lbnRzIGltcG9ydCBpbnQgaW50ZXJmYWNlIGxvbmcgbmF0aXZlIHBhY2thZ2UgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHNob3J0IHN0YXRpYyBzdXBlciBzeW5jaHJvbml6ZWQgdGhyb3dzIHRyYW5zaWVudCB2b2xhdGlsZSIpOwoKICAvLyBFQ01BU2NyaXB0IDUgcmVzZXJ2ZWQgd29yZHMuCgogIHZhciBpc1Jlc2VydmVkV29yZDUgPSBtYWtlUHJlZGljYXRlKCJjbGFzcyBlbnVtIGV4dGVuZHMgc3VwZXIgY29uc3QgZXhwb3J0IGltcG9ydCIpOwoKICAvLyBUaGUgYWRkaXRpb25hbCByZXNlcnZlZCB3b3JkcyBpbiBzdHJpY3QgbW9kZS4KCiAgdmFyIGlzU3RyaWN0UmVzZXJ2ZWRXb3JkID0gbWFrZVByZWRpY2F0ZSgiaW1wbGVtZW50cyBpbnRlcmZhY2UgbGV0IHBhY2thZ2UgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHN0YXRpYyB5aWVsZCIpOwoKICAvLyBUaGUgZm9yYmlkZGVuIHZhcmlhYmxlIG5hbWVzIGluIHN0cmljdCBtb2RlLgoKICB2YXIgaXNTdHJpY3RCYWRJZFdvcmQgPSBtYWtlUHJlZGljYXRlKCJldmFsIGFyZ3VtZW50cyIpOwoKICAvLyBBbmQgdGhlIGtleXdvcmRzLgoKICB2YXIgaXNLZXl3b3JkID0gbWFrZVByZWRpY2F0ZSgiYnJlYWsgY2FzZSBjYXRjaCBjb250aW51ZSBkZWJ1Z2dlciBkZWZhdWx0IGRvIGVsc2UgZmluYWxseSBmb3IgZnVuY3Rpb24gaWYgcmV0dXJuIHN3aXRjaCB0aHJvdyB0cnkgdmFyIHdoaWxlIHdpdGggbnVsbCB0cnVlIGZhbHNlIGluc3RhbmNlb2YgdHlwZW9mIHZvaWQgZGVsZXRlIG5ldyBpbiB0aGlzIik7CgogIC8vICMjIENoYXJhY3RlciBjYXRlZ29yaWVzCgogIC8vIEJpZyB1Z2x5IHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBtYXRjaCBjaGFyYWN0ZXJzIGluIHRoZQogIC8vIHdoaXRlc3BhY2UsIGlkZW50aWZpZXIsIGFuZCBpZGVudGlmaWVyLXN0YXJ0IGNhdGVnb3JpZXMuIFRoZXNlCiAgLy8gYXJlIG9ubHkgYXBwbGllZCB3aGVuIGEgY2hhcmFjdGVyIGlzIGZvdW5kIHRvIGFjdHVhbGx5IGhhdmUgYQogIC8vIGNvZGUgcG9pbnQgYWJvdmUgMTI4LgoKICB2YXIgbm9uQVNDSUl3aGl0ZXNwYWNlID0gL1tcdTE2ODBcdTE4MGVcdTIwMDAtXHUyMDBhXHUyMDI4XHUyMDI5XHUyMDJmXHUyMDVmXHUzMDAwXHVmZWZmXS87CiAgdmFyIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgPSAiXHhhYVx4YjVceGJhXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1cdTAyYzFcdTAyYzYtXHUwMmQxXHUwMmUwLVx1MDJlNFx1MDJlY1x1MDJlZVx1MDM3MC1cdTAzNzRcdTAzNzZcdTAzNzdcdTAzN2EtXHUwMzdkXHUwMzg2XHUwMzg4LVx1MDM4YVx1MDM4Y1x1MDM4ZS1cdTAzYTFcdTAzYTMtXHUwM2Y1XHUwM2Y3LVx1MDQ4MVx1MDQ4YS1cdTA1MjdcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4N1x1MDVkMC1cdTA1ZWFcdTA1ZjAtXHUwNWYyXHUwNjIwLVx1MDY0YVx1MDY2ZVx1MDY2Zlx1MDY3MS1cdTA2ZDNcdTA2ZDVcdTA2ZTVcdTA2ZTZcdTA2ZWVcdTA2ZWZcdTA2ZmEtXHUwNmZjXHUwNmZmXHUwNzEwXHUwNzEyLVx1MDcyZlx1MDc0ZC1cdTA3YTVcdTA3YjFcdTA3Y2EtXHUwN2VhXHUwN2Y0XHUwN2Y1XHUwN2ZhXHUwODAwLVx1MDgxNVx1MDgxYVx1MDgyNFx1MDgyOFx1MDg0MC1cdTA4NThcdTA4YTBcdTA4YTItXHUwOGFjXHUwOTA0LVx1MDkzOVx1MDkzZFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTc3XHUwOTc5LVx1MDk3Zlx1MDk4NS1cdTA5OGNcdTA5OGZcdTA5OTBcdTA5OTMtXHUwOWE4XHUwOWFhLVx1MDliMFx1MDliMlx1MDliNi1cdTA5YjlcdTA5YmRcdTA5Y2VcdTA5ZGNcdTA5ZGRcdTA5ZGYtXHUwOWUxXHUwOWYwXHUwOWYxXHUwYTA1LVx1MGEwYVx1MGEwZlx1MGExMFx1MGExMy1cdTBhMjhcdTBhMmEtXHUwYTMwXHUwYTMyXHUwYTMzXHUwYTM1XHUwYTM2XHUwYTM4XHUwYTM5XHUwYTU5LVx1MGE1Y1x1MGE1ZVx1MGE3Mi1cdTBhNzRcdTBhODUtXHUwYThkXHUwYThmLVx1MGE5MVx1MGE5My1cdTBhYThcdTBhYWEtXHUwYWIwXHUwYWIyXHUwYWIzXHUwYWI1LVx1MGFiOVx1MGFiZFx1MGFkMFx1MGFlMFx1MGFlMVx1MGIwNS1cdTBiMGNcdTBiMGZcdTBiMTBcdTBiMTMtXHUwYjI4XHUwYjJhLVx1MGIzMFx1MGIzMlx1MGIzM1x1MGIzNS1cdTBiMzlcdTBiM2RcdTBiNWNcdTBiNWRcdTBiNWYtXHUwYjYxXHUwYjcxXHUwYjgzXHUwYjg1LVx1MGI4YVx1MGI4ZS1cdTBiOTBcdTBiOTItXHUwYjk1XHUwYjk5XHUwYjlhXHUwYjljXHUwYjllXHUwYjlmXHUwYmEzXHUwYmE0XHUwYmE4LVx1MGJhYVx1MGJhZS1cdTBiYjlcdTBiZDBcdTBjMDUtXHUwYzBjXHUwYzBlLVx1MGMxMFx1MGMxMi1cdTBjMjhcdTBjMmEtXHUwYzMzXHUwYzM1LVx1MGMzOVx1MGMzZFx1MGM1OFx1MGM1OVx1MGM2MFx1MGM2MVx1MGM4NS1cdTBjOGNcdTBjOGUtXHUwYzkwXHUwYzkyLVx1MGNhOFx1MGNhYS1cdTBjYjNcdTBjYjUtXHUwY2I5XHUwY2JkXHUwY2RlXHUwY2UwXHUwY2UxXHUwY2YxXHUwY2YyXHUwZDA1LVx1MGQwY1x1MGQwZS1cdTBkMTBcdTBkMTItXHUwZDNhXHUwZDNkXHUwZDRlXHUwZDYwXHUwZDYxXHUwZDdhLVx1MGQ3Zlx1MGQ4NS1cdTBkOTZcdTBkOWEtXHUwZGIxXHUwZGIzLVx1MGRiYlx1MGRiZFx1MGRjMC1cdTBkYzZcdTBlMDEtXHUwZTMwXHUwZTMyXHUwZTMzXHUwZTQwLVx1MGU0Nlx1MGU4MVx1MGU4Mlx1MGU4NFx1MGU4N1x1MGU4OFx1MGU4YVx1MGU4ZFx1MGU5NC1cdTBlOTdcdTBlOTktXHUwZTlmXHUwZWExLVx1MGVhM1x1MGVhNVx1MGVhN1x1MGVhYVx1MGVhYlx1MGVhZC1cdTBlYjBcdTBlYjJcdTBlYjNcdTBlYmRcdTBlYzAtXHUwZWM0XHUwZWM2XHUwZWRjLVx1MGVkZlx1MGYwMFx1MGY0MC1cdTBmNDdcdTBmNDktXHUwZjZjXHUwZjg4LVx1MGY4Y1x1MTAwMC1cdTEwMmFcdTEwM2ZcdTEwNTAtXHUxMDU1XHUxMDVhLVx1MTA1ZFx1MTA2MVx1MTA2NVx1MTA2Nlx1MTA2ZS1cdTEwNzBcdTEwNzUtXHUxMDgxXHUxMDhlXHUxMGEwLVx1MTBjNVx1MTBjN1x1MTBjZFx1MTBkMC1cdTEwZmFcdTEwZmMtXHUxMjQ4XHUxMjRhLVx1MTI0ZFx1MTI1MC1cdTEyNTZcdTEyNThcdTEyNWEtXHUxMjVkXHUxMjYwLVx1MTI4OFx1MTI4YS1cdTEyOGRcdTEyOTAtXHUxMmIwXHUxMmIyLVx1MTJiNVx1MTJiOC1cdTEyYmVcdTEyYzBcdTEyYzItXHUxMmM1XHUxMmM4LVx1MTJkNlx1MTJkOC1cdTEzMTBcdTEzMTItXHUxMzE1XHUxMzE4LVx1MTM1YVx1MTM4MC1cdTEzOGZcdTEzYTAtXHUxM2Y0XHUxNDAxLVx1MTY2Y1x1MTY2Zi1cdTE2N2ZcdTE2ODEtXHUxNjlhXHUxNmEwLVx1MTZlYVx1MTZlZS1cdTE2ZjBcdTE3MDAtXHUxNzBjXHUxNzBlLVx1MTcxMVx1MTcyMC1cdTE3MzFcdTE3NDAtXHUxNzUxXHUxNzYwLVx1MTc2Y1x1MTc2ZS1cdTE3NzBcdTE3ODAtXHUxN2IzXHUxN2Q3XHUxN2RjXHUxODIwLVx1MTg3N1x1MTg4MC1cdTE4YThcdTE4YWFcdTE4YjAtXHUxOGY1XHUxOTAwLVx1MTkxY1x1MTk1MC1cdTE5NmRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlhYlx1MTljMS1cdTE5YzdcdTFhMDAtXHUxYTE2XHUxYTIwLVx1MWE1NFx1MWFhN1x1MWIwNS1cdTFiMzNcdTFiNDUtXHUxYjRiXHUxYjgzLVx1MWJhMFx1MWJhZVx1MWJhZlx1MWJiYS1cdTFiZTVcdTFjMDAtXHUxYzIzXHUxYzRkLVx1MWM0Zlx1MWM1YS1cdTFjN2RcdTFjZTktXHUxY2VjXHUxY2VlLVx1MWNmMVx1MWNmNVx1MWNmNlx1MWQwMC1cdTFkYmZcdTFlMDAtXHUxZjE1XHUxZjE4LVx1MWYxZFx1MWYyMC1cdTFmNDVcdTFmNDgtXHUxZjRkXHUxZjUwLVx1MWY1N1x1MWY1OVx1MWY1Ylx1MWY1ZFx1MWY1Zi1cdTFmN2RcdTFmODAtXHUxZmI0XHUxZmI2LVx1MWZiY1x1MWZiZVx1MWZjMi1cdTFmYzRcdTFmYzYtXHUxZmNjXHUxZmQwLVx1MWZkM1x1MWZkNi1cdTFmZGJcdTFmZTAtXHUxZmVjXHUxZmYyLVx1MWZmNFx1MWZmNi1cdTFmZmNcdTIwNzFcdTIwN2ZcdTIwOTAtXHUyMDljXHUyMTAyXHUyMTA3XHUyMTBhLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMWRcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMmEtXHUyMTJkXHUyMTJmLVx1MjEzOVx1MjEzYy1cdTIxM2ZcdTIxNDUtXHUyMTQ5XHUyMTRlXHUyMTYwLVx1MjE4OFx1MmMwMC1cdTJjMmVcdTJjMzAtXHUyYzVlXHUyYzYwLVx1MmNlNFx1MmNlYi1cdTJjZWVcdTJjZjJcdTJjZjNcdTJkMDAtXHUyZDI1XHUyZDI3XHUyZDJkXHUyZDMwLVx1MmQ2N1x1MmQ2Zlx1MmQ4MC1cdTJkOTZcdTJkYTAtXHUyZGE2XHUyZGE4LVx1MmRhZVx1MmRiMC1cdTJkYjZcdTJkYjgtXHUyZGJlXHUyZGMwLVx1MmRjNlx1MmRjOC1cdTJkY2VcdTJkZDAtXHUyZGQ2XHUyZGQ4LVx1MmRkZVx1MmUyZlx1MzAwNS1cdTMwMDdcdTMwMjEtXHUzMDI5XHUzMDMxLVx1MzAzNVx1MzAzOC1cdTMwM2NcdTMwNDEtXHUzMDk2XHUzMDlkLVx1MzA5Zlx1MzBhMS1cdTMwZmFcdTMwZmMtXHUzMGZmXHUzMTA1LVx1MzEyZFx1MzEzMS1cdTMxOGVcdTMxYTAtXHUzMWJhXHUzMWYwLVx1MzFmZlx1MzQwMC1cdTRkYjVcdTRlMDAtXHU5ZmNjXHVhMDAwLVx1YTQ4Y1x1YTRkMC1cdWE0ZmRcdWE1MDAtXHVhNjBjXHVhNjEwLVx1YTYxZlx1YTYyYVx1YTYyYlx1YTY0MC1cdWE2NmVcdWE2N2YtXHVhNjk3XHVhNmEwLVx1YTZlZlx1YTcxNy1cdWE3MWZcdWE3MjItXHVhNzg4XHVhNzhiLVx1YTc4ZVx1YTc5MC1cdWE3OTNcdWE3YTAtXHVhN2FhXHVhN2Y4LVx1YTgwMVx1YTgwMy1cdWE4MDVcdWE4MDctXHVhODBhXHVhODBjLVx1YTgyMlx1YTg0MC1cdWE4NzNcdWE4ODItXHVhOGIzXHVhOGYyLVx1YThmN1x1YThmYlx1YTkwYS1cdWE5MjVcdWE5MzAtXHVhOTQ2XHVhOTYwLVx1YTk3Y1x1YTk4NC1cdWE5YjJcdWE5Y2ZcdWFhMDAtXHVhYTI4XHVhYTQwLVx1YWE0Mlx1YWE0NC1cdWFhNGJcdWFhNjAtXHVhYTc2XHVhYTdhXHVhYTgwLVx1YWFhZlx1YWFiMVx1YWFiNVx1YWFiNlx1YWFiOS1cdWFhYmRcdWFhYzBcdWFhYzJcdWFhZGItXHVhYWRkXHVhYWUwLVx1YWFlYVx1YWFmMi1cdWFhZjRcdWFiMDEtXHVhYjA2XHVhYjA5LVx1YWIwZVx1YWIxMS1cdWFiMTZcdWFiMjAtXHVhYjI2XHVhYjI4LVx1YWIyZVx1YWJjMC1cdWFiZTJcdWFjMDAtXHVkN2EzXHVkN2IwLVx1ZDdjNlx1ZDdjYi1cdWQ3ZmJcdWY5MDAtXHVmYTZkXHVmYTcwLVx1ZmFkOVx1ZmIwMC1cdWZiMDZcdWZiMTMtXHVmYjE3XHVmYjFkXHVmYjFmLVx1ZmIyOFx1ZmIyYS1cdWZiMzZcdWZiMzgtXHVmYjNjXHVmYjNlXHVmYjQwXHVmYjQxXHVmYjQzXHVmYjQ0XHVmYjQ2LVx1ZmJiMVx1ZmJkMy1cdWZkM2RcdWZkNTAtXHVmZDhmXHVmZDkyLVx1ZmRjN1x1ZmRmMC1cdWZkZmJcdWZlNzAtXHVmZTc0XHVmZTc2LVx1ZmVmY1x1ZmYyMS1cdWZmM2FcdWZmNDEtXHVmZjVhXHVmZjY2LVx1ZmZiZVx1ZmZjMi1cdWZmYzdcdWZmY2EtXHVmZmNmXHVmZmQyLVx1ZmZkN1x1ZmZkYS1cdWZmZGMiOwogIHZhciBub25BU0NJSWlkZW50aWZpZXJDaGFycyA9ICJcdTAzNzEtXHUwMzc0XHUwNDgzLVx1MDQ4N1x1MDU5MS1cdTA1YmRcdTA1YmZcdTA1YzFcdTA1YzJcdTA1YzRcdTA1YzVcdTA1YzdcdTA2MTAtXHUwNjFhXHUwNjIwLVx1MDY0OVx1MDY3Mi1cdTA2ZDNcdTA2ZTctXHUwNmU4XHUwNmZiLVx1MDZmY1x1MDczMC1cdTA3NGFcdTA4MDAtXHUwODE0XHUwODFiLVx1MDgyM1x1MDgyNS1cdTA4MjdcdTA4MjktXHUwODJkXHUwODQwLVx1MDg1N1x1MDhlNC1cdTA4ZmVcdTA5MDAtXHUwOTAzXHUwOTNhLVx1MDkzY1x1MDkzZS1cdTA5NGZcdTA5NTEtXHUwOTU3XHUwOTYyLVx1MDk2M1x1MDk2Ni1cdTA5NmZcdTA5ODEtXHUwOTgzXHUwOWJjXHUwOWJlLVx1MDljNFx1MDljN1x1MDljOFx1MDlkN1x1MDlkZi1cdTA5ZTBcdTBhMDEtXHUwYTAzXHUwYTNjXHUwYTNlLVx1MGE0Mlx1MGE0N1x1MGE0OFx1MGE0Yi1cdTBhNGRcdTBhNTFcdTBhNjYtXHUwYTcxXHUwYTc1XHUwYTgxLVx1MGE4M1x1MGFiY1x1MGFiZS1cdTBhYzVcdTBhYzctXHUwYWM5XHUwYWNiLVx1MGFjZFx1MGFlMi1cdTBhZTNcdTBhZTYtXHUwYWVmXHUwYjAxLVx1MGIwM1x1MGIzY1x1MGIzZS1cdTBiNDRcdTBiNDdcdTBiNDhcdTBiNGItXHUwYjRkXHUwYjU2XHUwYjU3XHUwYjVmLVx1MGI2MFx1MGI2Ni1cdTBiNmZcdTBiODJcdTBiYmUtXHUwYmMyXHUwYmM2LVx1MGJjOFx1MGJjYS1cdTBiY2RcdTBiZDdcdTBiZTYtXHUwYmVmXHUwYzAxLVx1MGMwM1x1MGM0Ni1cdTBjNDhcdTBjNGEtXHUwYzRkXHUwYzU1XHUwYzU2XHUwYzYyLVx1MGM2M1x1MGM2Ni1cdTBjNmZcdTBjODJcdTBjODNcdTBjYmNcdTBjYmUtXHUwY2M0XHUwY2M2LVx1MGNjOFx1MGNjYS1cdTBjY2RcdTBjZDVcdTBjZDZcdTBjZTItXHUwY2UzXHUwY2U2LVx1MGNlZlx1MGQwMlx1MGQwM1x1MGQ0Ni1cdTBkNDhcdTBkNTdcdTBkNjItXHUwZDYzXHUwZDY2LVx1MGQ2Zlx1MGQ4Mlx1MGQ4M1x1MGRjYVx1MGRjZi1cdTBkZDRcdTBkZDZcdTBkZDgtXHUwZGRmXHUwZGYyXHUwZGYzXHUwZTM0LVx1MGUzYVx1MGU0MC1cdTBlNDVcdTBlNTAtXHUwZTU5XHUwZWI0LVx1MGViOVx1MGVjOC1cdTBlY2RcdTBlZDAtXHUwZWQ5XHUwZjE4XHUwZjE5XHUwZjIwLVx1MGYyOVx1MGYzNVx1MGYzN1x1MGYzOVx1MGY0MS1cdTBmNDdcdTBmNzEtXHUwZjg0XHUwZjg2LVx1MGY4N1x1MGY4ZC1cdTBmOTdcdTBmOTktXHUwZmJjXHUwZmM2XHUxMDAwLVx1MTAyOVx1MTA0MC1cdTEwNDlcdTEwNjctXHUxMDZkXHUxMDcxLVx1MTA3NFx1MTA4Mi1cdTEwOGRcdTEwOGYtXHUxMDlkXHUxMzVkLVx1MTM1Zlx1MTcwZS1cdTE3MTBcdTE3MjAtXHUxNzMwXHUxNzQwLVx1MTc1MFx1MTc3Mlx1MTc3M1x1MTc4MC1cdTE3YjJcdTE3ZGRcdTE3ZTAtXHUxN2U5XHUxODBiLVx1MTgwZFx1MTgxMC1cdTE4MTlcdTE5MjAtXHUxOTJiXHUxOTMwLVx1MTkzYlx1MTk1MS1cdTE5NmRcdTE5YjAtXHUxOWMwXHUxOWM4LVx1MTljOVx1MTlkMC1cdTE5ZDlcdTFhMDAtXHUxYTE1XHUxYTIwLVx1MWE1M1x1MWE2MC1cdTFhN2NcdTFhN2YtXHUxYTg5XHUxYTkwLVx1MWE5OVx1MWI0Ni1cdTFiNGJcdTFiNTAtXHUxYjU5XHUxYjZiLVx1MWI3M1x1MWJiMC1cdTFiYjlcdTFiZTYtXHUxYmYzXHUxYzAwLVx1MWMyMlx1MWM0MC1cdTFjNDlcdTFjNWItXHUxYzdkXHUxY2QwLVx1MWNkMlx1MWQwMC1cdTFkYmVcdTFlMDEtXHUxZjE1XHUyMDBjXHUyMDBkXHUyMDNmXHUyMDQwXHUyMDU0XHUyMGQwLVx1MjBkY1x1MjBlMVx1MjBlNS1cdTIwZjBcdTJkODEtXHUyZDk2XHUyZGUwLVx1MmRmZlx1MzAyMS1cdTMwMjhcdTMwOTlcdTMwOWFcdWE2NDAtXHVhNjZkXHVhNjc0LVx1YTY3ZFx1YTY5Zlx1YTZmMC1cdWE2ZjFcdWE3ZjgtXHVhODAwXHVhODA2XHVhODBiXHVhODIzLVx1YTgyN1x1YTg4MC1cdWE4ODFcdWE4YjQtXHVhOGM0XHVhOGQwLVx1YThkOVx1YThmMy1cdWE4ZjdcdWE5MDAtXHVhOTA5XHVhOTI2LVx1YTkyZFx1YTkzMC1cdWE5NDVcdWE5ODAtXHVhOTgzXHVhOWIzLVx1YTljMFx1YWEwMC1cdWFhMjdcdWFhNDAtXHVhYTQxXHVhYTRjLVx1YWE0ZFx1YWE1MC1cdWFhNTlcdWFhN2JcdWFhZTAtXHVhYWU5XHVhYWYyLVx1YWFmM1x1YWJjMC1cdWFiZTFcdWFiZWNcdWFiZWRcdWFiZjAtXHVhYmY5XHVmYjIwLVx1ZmIyOFx1ZmUwMC1cdWZlMGZcdWZlMjAtXHVmZTI2XHVmZTMzXHVmZTM0XHVmZTRkLVx1ZmU0Zlx1ZmYxMC1cdWZmMTlcdWZmM2YiOwogIHZhciBub25BU0NJSWlkZW50aWZpZXJTdGFydCA9IG5ldyBSZWdFeHAoIlsiICsgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyArICJdIik7CiAgdmFyIG5vbkFTQ0lJaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIlsiICsgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyArIG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzICsgIl0iKTsKCiAgLy8gV2hldGhlciBhIHNpbmdsZSBjaGFyYWN0ZXIgZGVub3RlcyBhIG5ld2xpbmUuCgogIHZhciBuZXdsaW5lID0gL1tcblxyXHUyMDI4XHUyMDI5XS87CgogIC8vIE1hdGNoZXMgYSB3aG9sZSBsaW5lIGJyZWFrICh3aGVyZSBDUkxGIGlzIGNvbnNpZGVyZWQgYSBzaW5nbGUKICAvLyBsaW5lIGJyZWFrKS4gVXNlZCB0byBjb3VudCBsaW5lcy4KCiAgdmFyIGxpbmVCcmVhayA9IC9cclxufFtcblxyXHUyMDI4XHUyMDI5XS9nOwoKICAvLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSBzdGFydHMgYW4gaWRlbnRpZmllci4KCiAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnQoY29kZSkgewogICAgaWYgKGNvZGUgPCA2NSkgcmV0dXJuIGNvZGUgPT09IDM2OwogICAgaWYgKGNvZGUgPCA5MSkgcmV0dXJuIHRydWU7CiAgICBpZiAoY29kZSA8IDk3KSByZXR1cm4gY29kZSA9PT0gOTU7CiAgICBpZiAoY29kZSA8IDEyMylyZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBjb2RlID49IDB4YWEgJiYgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnQudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTsKICB9CgogIC8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBpcyBwYXJ0IG9mIGFuIGlkZW50aWZpZXIuCgogIGZ1bmN0aW9uIGlzSWRlbnRpZmllckNoYXIoY29kZSkgewogICAgaWYgKGNvZGUgPCA0OCkgcmV0dXJuIGNvZGUgPT09IDM2OwogICAgaWYgKGNvZGUgPCA1OCkgcmV0dXJuIHRydWU7CiAgICBpZiAoY29kZSA8IDY1KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoY29kZSA8IDkxKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChjb2RlIDwgOTcpIHJldHVybiBjb2RlID09PSA5NTsKICAgIGlmIChjb2RlIDwgMTIzKXJldHVybiB0cnVlOwogICAgcmV0dXJuIGNvZGUgPj0gMHhhYSAmJiBub25BU0NJSWlkZW50aWZpZXIudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTsKICB9CgogIC8vICMjIFRva2VuaXplcgoKICAvLyBUaGVzZSBhcmUgdXNlZCB3aGVuIGBvcHRpb25zLmxvY2F0aW9uc2AgaXMgb24sIGluIG9yZGVyIHRvIHRyYWNrCiAgLy8gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgYW5kIHN0YXJ0IG9mIGxpbmUgb2Zmc2V0LCBpbiBvcmRlciB0byBzZXQKICAvLyBgdG9rU3RhcnRMb2NgIGFuZCBgdG9rRW5kTG9jYC4KCiAgZnVuY3Rpb24gbmV4dExpbmVTdGFydCgpIHsKICAgIGxpbmVCcmVhay5sYXN0SW5kZXggPSB0b2tMaW5lU3RhcnQ7CiAgICB2YXIgbWF0Y2ggPSBsaW5lQnJlYWsuZXhlYyhpbnB1dCk7CiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCA6IGlucHV0Lmxlbmd0aCArIDE7CiAgfQoKICBmdW5jdGlvbiBjdXJMaW5lTG9jKCkgewogICAgd2hpbGUgKHRva0xpbmVTdGFydE5leHQgPD0gdG9rUG9zKSB7CiAgICAgICsrdG9rQ3VyTGluZTsKICAgICAgdG9rTGluZVN0YXJ0ID0gdG9rTGluZVN0YXJ0TmV4dDsKICAgICAgdG9rTGluZVN0YXJ0TmV4dCA9IG5leHRMaW5lU3RhcnQoKTsKICAgIH0KICAgIHJldHVybiB7bGluZTogdG9rQ3VyTGluZSwgY29sdW1uOiB0b2tQb3MgLSB0b2tMaW5lU3RhcnR9OwogIH0KCiAgLy8gUmVzZXQgdGhlIHRva2VuIHN0YXRlLiBVc2VkIGF0IHRoZSBzdGFydCBvZiBhIHBhcnNlLgoKICBmdW5jdGlvbiBpbml0VG9rZW5TdGF0ZSgpIHsKICAgIHRva0N1ckxpbmUgPSAxOwogICAgdG9rUG9zID0gdG9rTGluZVN0YXJ0ID0gMDsKICAgIHRva0xpbmVTdGFydE5leHQgPSBuZXh0TGluZVN0YXJ0KCk7CiAgICB0b2tSZWdleHBBbGxvd2VkID0gdHJ1ZTsKICAgIHRva0NvbW1lbnRzID0gbnVsbDsKICAgIHNraXBTcGFjZSgpOwogIH0KCiAgLy8gQ2FsbGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgdG9rZW4uIFNldHMgYHRva0VuZGAsIGB0b2tWYWxgLAogIC8vIGB0b2tDb21tZW50c0FmdGVyYCwgYW5kIGB0b2tSZWdleHBBbGxvd2VkYCwgYW5kIHNraXBzIHRoZSBzcGFjZQogIC8vIGFmdGVyIHRoZSB0b2tlbiwgc28gdGhhdCB0aGUgbmV4dCBvbmUncyBgdG9rU3RhcnRgIHdpbGwgcG9pbnQgYXQKICAvLyB0aGUgcmlnaHQgcG9zaXRpb24uCgogIGZ1bmN0aW9uIGZpbmlzaFRva2VuKHR5cGUsIHZhbCkgewogICAgdG9rRW5kID0gdG9rUG9zOwogICAgaWYgKG9wdGlvbnMubG9jYXRpb25zKSB0b2tFbmRMb2MgPSBjdXJMaW5lTG9jKCk7CiAgICB0b2tUeXBlID0gdHlwZTsKICAgIHNraXBTcGFjZSgpOwogICAgdG9rVmFsID0gdmFsOwogICAgdG9rQ29tbWVudHNBZnRlciA9IHRva0NvbW1lbnRzOwogICAgdG9rUmVnZXhwQWxsb3dlZCA9IHR5cGUuYmVmb3JlRXhwcjsKICB9CgogIGZ1bmN0aW9uIHNraXBCbG9ja0NvbW1lbnQoKSB7CiAgICB2YXIgZW5kID0gaW5wdXQuaW5kZXhPZigiKi8iLCB0b2tQb3MgKz0gMik7CiAgICBpZiAoZW5kID09PSAtMSkgcmFpc2UodG9rUG9zIC0gMiwgIlVudGVybWluYXRlZCBjb21tZW50Iik7CiAgICBpZiAob3B0aW9ucy50cmFja0NvbW1lbnRzKQogICAgICAodG9rQ29tbWVudHMgfHwgKHRva0NvbW1lbnRzID0gW10pKS5wdXNoKGlucHV0LnNsaWNlKHRva1BvcywgZW5kKSk7CiAgICB0b2tQb3MgPSBlbmQgKyAyOwogIH0KCiAgZnVuY3Rpb24gc2tpcExpbmVDb21tZW50KCkgewogICAgdmFyIHN0YXJ0ID0gdG9rUG9zOwogICAgdmFyIGNoID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MrPTIpOwogICAgd2hpbGUgKHRva1BvcyA8IGlucHV0TGVuICYmIGNoICE9PSAxMCAmJiBjaCAhPT0gMTMgJiYgY2ggIT09IDgyMzIgJiYgY2ggIT09IDgzMjkpIHsKICAgICAgKyt0b2tQb3M7CiAgICAgIGNoID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpOwogICAgfQogICAgKHRva0NvbW1lbnRzIHx8ICh0b2tDb21tZW50cyA9IFtdKSkucHVzaChpbnB1dC5zbGljZShzdGFydCwgdG9rUG9zKSk7CiAgfQoKICAvLyBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJzZSBhbmQgYWZ0ZXIgZXZlcnkgdG9rZW4uIFNraXBzCiAgLy8gd2hpdGVzcGFjZSBhbmQgY29tbWVudHMsIGFuZCwgaWYgYG9wdGlvbnMudHJhY2tDb21tZW50c2AgaXMgb24sCiAgLy8gd2lsbCBzdG9yZSBhbGwgc2tpcHBlZCBjb21tZW50cyBpbiBgdG9rQ29tbWVudHNgLgoKICBmdW5jdGlvbiBza2lwU3BhY2UoKSB7CiAgICB0b2tDb21tZW50cyA9IG51bGw7CiAgICB3aGlsZSAodG9rUG9zIDwgaW5wdXRMZW4pIHsKICAgICAgdmFyIGNoID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpOwogICAgICBpZiAoY2ggPT09IDQ3KSB7IC8vICcvJwogICAgICAgIHZhciBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MrMSk7CiAgICAgICAgaWYgKG5leHQgPT09IDQyKSB7IC8vICcqJwogICAgICAgICAgc2tpcEJsb2NrQ29tbWVudCgpOwogICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PT0gNDcpIHsgLy8gJy8nCiAgICAgICAgICBza2lwTGluZUNvbW1lbnQoKTsKICAgICAgICB9IGVsc2UgYnJlYWs7CiAgICAgIH0gZWxzZSBpZiAoY2ggPCAxNCAmJiBjaCA+IDgpIHsKICAgICAgICArK3Rva1BvczsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMzIgfHwgY2ggPT09IDE2MCkgeyAvLyAnICcsICdceGEwJwogICAgICAgICsrdG9rUG9zOwogICAgICB9IGVsc2UgaWYgKGNoID49IDU3NjAgJiYgbm9uQVNDSUl3aGl0ZXNwYWNlLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpKSB7CiAgICAgICAgKyt0b2tQb3M7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CgogIC8vICMjIyBUb2tlbiByZWFkaW5nCgogIC8vIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIGZldGNoIHRoZSBuZXh0IHRva2VuLiBJdAogIC8vIGlzIHNvbWV3aGF0IG9ic2N1cmUsIGJlY2F1c2UgaXQgd29ya3MgaW4gY2hhcmFjdGVyIGNvZGVzIHJhdGhlcgogIC8vIHRoYW4gY2hhcmFjdGVycywgYW5kIGJlY2F1c2Ugb3BlcmF0b3IgcGFyc2luZyBoYXMgYmVlbiBpbmxpbmVkCiAgLy8gaW50byBpdC4KICAvLwogIC8vIEFsbCBpbiB0aGUgbmFtZSBvZiBzcGVlZC4KICAvLwogIC8vIFRoZSBgZm9yY2VSZWdleHBgIHBhcmFtZXRlciBpcyB1c2VkIGluIHRoZSBvbmUgY2FzZSB3aGVyZSB0aGUKICAvLyBgdG9rUmVnZXhwQWxsb3dlZGAgdHJpY2sgZG9lcyBub3Qgd29yay4gU2VlIGBwYXJzZVN0YXRlbWVudGAuCgogIGZ1bmN0aW9uIHJlYWRUb2tlbihmb3JjZVJlZ2V4cCkgewogICAgdG9rU3RhcnQgPSB0b2tQb3M7CiAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpIHRva1N0YXJ0TG9jID0gY3VyTGluZUxvYygpOwogICAgdG9rQ29tbWVudHNCZWZvcmUgPSB0b2tDb21tZW50czsKICAgIGlmIChmb3JjZVJlZ2V4cCkgcmV0dXJuIHJlYWRSZWdleHAoKTsKICAgIGlmICh0b2tQb3MgPj0gaW5wdXRMZW4pIHJldHVybiBmaW5pc2hUb2tlbihfZW9mKTsKCiAgICB2YXIgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zKTsKICAgIC8vIElkZW50aWZpZXIgb3Iga2V5d29yZC4gJ1x1WFhYWCcgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIGluCiAgICAvLyBpZGVudGlmaWVycywgc28gJ1wnIGFsc28gZGlzcGF0Y2hlcyB0byB0aGF0LgogICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KGNvZGUpIHx8IGNvZGUgPT09IDkyIC8qICdcJyAqLykgcmV0dXJuIHJlYWRXb3JkKCk7CiAgICB2YXIgbmV4dCA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zKzEpOwoKICAgIHN3aXRjaChjb2RlKSB7CiAgICAgIC8vIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBhIGRvdCBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaXMgZm9sbG93ZWQKICAgICAgLy8gYnkgYSBkaWdpdC4KICAgIGNhc2UgNDY6IC8vICcuJwogICAgICBpZiAobmV4dCA+PSA0OCAmJiBuZXh0IDw9IDU3KSByZXR1cm4gcmVhZE51bWJlcihTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTsKICAgICAgKyt0b2tQb3M7CiAgICAgIHJldHVybiBmaW5pc2hUb2tlbihfZG90KTsKCiAgICAgIC8vIFB1bmN0dWF0aW9uIHRva2Vucy4KICAgIGNhc2UgNDA6ICsrdG9rUG9zOyByZXR1cm4gZmluaXNoVG9rZW4oX3BhcmVuTCk7CiAgICBjYXNlIDQxOiArK3Rva1BvczsgcmV0dXJuIGZpbmlzaFRva2VuKF9wYXJlblIpOwogICAgY2FzZSA1OTogKyt0b2tQb3M7IHJldHVybiBmaW5pc2hUb2tlbihfc2VtaSk7CiAgICBjYXNlIDQ0OiArK3Rva1BvczsgcmV0dXJuIGZpbmlzaFRva2VuKF9jb21tYSk7CiAgICBjYXNlIDkxOiArK3Rva1BvczsgcmV0dXJuIGZpbmlzaFRva2VuKF9icmFja2V0TCk7CiAgICBjYXNlIDkzOiArK3Rva1BvczsgcmV0dXJuIGZpbmlzaFRva2VuKF9icmFja2V0Uik7CiAgICBjYXNlIDEyMzogKyt0b2tQb3M7IHJldHVybiBmaW5pc2hUb2tlbihfYnJhY2VMKTsKICAgIGNhc2UgMTI1OiArK3Rva1BvczsgcmV0dXJuIGZpbmlzaFRva2VuKF9icmFjZVIpOwogICAgY2FzZSA1ODogKyt0b2tQb3M7IHJldHVybiBmaW5pc2hUb2tlbihfY29sb24pOwogICAgY2FzZSA2MzogKyt0b2tQb3M7IHJldHVybiBmaW5pc2hUb2tlbihfcXVlc3Rpb24pOwoKICAgICAgLy8gJzB4JyBpcyBhIGhleGFkZWNpbWFsIG51bWJlci4KICAgIGNhc2UgNDg6IC8vICcwJwogICAgICBpZiAobmV4dCA9PT0gMTIwIHx8IG5leHQgPT09IDg4KSByZXR1cm4gcmVhZEhleE51bWJlcigpOwogICAgICAvLyBBbnl0aGluZyBlbHNlIGJlZ2lubmluZyB3aXRoIGEgZGlnaXQgaXMgYW4gaW50ZWdlciwgb2N0YWwKICAgICAgLy8gbnVtYmVyLCBvciBmbG9hdC4KICAgIGNhc2UgNDk6IGNhc2UgNTA6IGNhc2UgNTE6IGNhc2UgNTI6IGNhc2UgNTM6IGNhc2UgNTQ6IGNhc2UgNTU6IGNhc2UgNTY6IGNhc2UgNTc6IC8vIDEtOQogICAgICByZXR1cm4gcmVhZE51bWJlcihTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTsKCiAgICAgIC8vIFF1b3RlcyBwcm9kdWNlIHN0cmluZ3MuCiAgICBjYXNlIDM0OiBjYXNlIDM5OiAvLyAnIicsICInIgogICAgICByZXR1cm4gcmVhZFN0cmluZyhjb2RlKTsKCiAgICAvLyBPcGVyYXRvcnMgYXJlIHBhcnNlZCBpbmxpbmUgaW4gdGlueSBzdGF0ZSBtYWNoaW5lcy4gJz0nICg2MSkgaXMKICAgIC8vIG9mdGVuIHJlZmVycmVkIHRvLiBgZmluaXNoT3BgIHNpbXBseSBza2lwcyB0aGUgYW1vdW50IG9mCiAgICAvLyBjaGFyYWN0ZXJzIGl0IGlzIGdpdmVuIGFzIHNlY29uZCBhcmd1bWVudCwgYW5kIHJldHVybnMgYSB0b2tlbgogICAgLy8gb2YgdGhlIHR5cGUgZ2l2ZW4gYnkgaXRzIGZpcnN0IGFyZ3VtZW50LgoKICAgIGNhc2UgNDc6IC8vICcvJwogICAgICBpZiAodG9rUmVnZXhwQWxsb3dlZCkgeysrdG9rUG9zOyByZXR1cm4gcmVhZFJlZ2V4cCgpO30KICAgICAgaWYgKG5leHQgPT09IDYxKSByZXR1cm4gZmluaXNoT3AoX2Fzc2lnbiwgMik7CiAgICAgIHJldHVybiBmaW5pc2hPcChfc2xhc2gsIDEpOwoKICAgIGNhc2UgMzc6IGNhc2UgNDI6IC8vICclKicKICAgICAgaWYgKG5leHQgPT09IDYxKSByZXR1cm4gZmluaXNoT3AoX2Fzc2lnbiwgMik7CiAgICAgIHJldHVybiBmaW5pc2hPcChfYmluMTAsIDEpOwoKICAgIGNhc2UgMTI0OiBjYXNlIDM4OiAvLyAnfCYnCiAgICAgIGlmIChuZXh0ID09PSBjb2RlKSByZXR1cm4gZmluaXNoT3AoY29kZSA9PT0gMTI0ID8gX2JpbjEgOiBfYmluMiwgMik7CiAgICAgIGlmIChuZXh0ID09PSA2MSkgcmV0dXJuIGZpbmlzaE9wKF9hc3NpZ24sIDIpOwogICAgICByZXR1cm4gZmluaXNoT3AoY29kZSA9PT0gMTI0ID8gX2JpbjMgOiBfYmluNSwgMSk7CgogICAgY2FzZSA5NDogLy8gJ14nCiAgICAgIGlmIChuZXh0ID09PSA2MSkgcmV0dXJuIGZpbmlzaE9wKF9hc3NpZ24sIDIpOwogICAgICByZXR1cm4gZmluaXNoT3AoX2JpbjQsIDEpOwoKICAgIGNhc2UgNDM6IGNhc2UgNDU6IC8vICcrLScKICAgICAgaWYgKG5leHQgPT09IGNvZGUpIHJldHVybiBmaW5pc2hPcChfaW5jZGVjLCAyKTsKICAgICAgaWYgKG5leHQgPT09IDYxKSByZXR1cm4gZmluaXNoT3AoX2Fzc2lnbiwgMik7CiAgICAgIHJldHVybiBmaW5pc2hPcChfcGx1c21pbiwgMSk7CgogICAgY2FzZSA2MDogY2FzZSA2MjogLy8gJzw+JwogICAgICB2YXIgc2l6ZSA9IDE7CiAgICAgIGlmIChuZXh0ID09PSBjb2RlKSB7CiAgICAgICAgc2l6ZSA9IGNvZGUgPT09IDYyICYmIGlucHV0LmNoYXJDb2RlQXQodG9rUG9zKzIpID09PSA2MiA/IDMgOiAyOwogICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHRva1BvcyArIHNpemUpID09PSA2MSkgcmV0dXJuIGZpbmlzaE9wKF9hc3NpZ24sIHNpemUgKyAxKTsKICAgICAgICByZXR1cm4gZmluaXNoT3AoX2JpbjgsIHNpemUpOwogICAgICB9CiAgICAgIGlmIChuZXh0ID09PSA2MSkKICAgICAgICBzaXplID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MrMikgPT09IDYxID8gMyA6IDI7CiAgICAgIHJldHVybiBmaW5pc2hPcChfYmluNywgc2l6ZSk7CgogICAgY2FzZSA2MTogY2FzZSAzMzogLy8gJz0hJwogICAgICBpZiAobmV4dCA9PT0gNjEpIHJldHVybiBmaW5pc2hPcChfYmluNiwgaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MrMikgPT09IDYxID8gMyA6IDIpOwogICAgICByZXR1cm4gZmluaXNoT3AoY29kZSA9PT0gNjEgPyBfZXEgOiBfcHJlZml4LCAxKTsKCiAgICBjYXNlIDEyNjogLy8gJ34nCiAgICAgIHJldHVybiBmaW5pc2hPcChfcHJlZml4LCAxKTsKICAgIH0KCiAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgd2UgZWl0aGVyIGZvdW5kIGEgbm9uLUFTQ0lJIGlkZW50aWZpZXIKICAgIC8vIGNoYXJhY3Rlciwgb3Igc29tZXRoaW5nIHRoYXQncyBlbnRpcmVseSBkaXNhbGxvd2VkLgogICAgdmFyIGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsKICAgIGlmIChjaCA9PT0gIlxcIiB8fCBub25BU0NJSWlkZW50aWZpZXJTdGFydC50ZXN0KGNoKSkgcmV0dXJuIHJlYWRXb3JkKCk7CiAgICByYWlzZSh0b2tQb3MsICJVbmV4cGVjdGVkIGNoYXJhY3RlciAnIiArIGNoICsgIiciKTsKICB9CgogIGZ1bmN0aW9uIGZpbmlzaE9wKHR5cGUsIHNpemUpIHsKICAgIHZhciBzdHIgPSBpbnB1dC5zbGljZSh0b2tQb3MsIHRva1BvcyArIHNpemUpOwogICAgdG9rUG9zICs9IHNpemU7CiAgICBmaW5pc2hUb2tlbih0eXBlLCBzdHIpOwogIH0KCiAgLy8gUGFyc2UgYSByZWd1bGFyIGV4cHJlc3Npb24uIFNvbWUgY29udGV4dC1hd2FyZW5lc3MgaXMgbmVjZXNzYXJ5LAogIC8vIHNpbmNlIGEgJy8nIGluc2lkZSBhICdbXScgc2V0IGRvZXMgbm90IGVuZCB0aGUgZXhwcmVzc2lvbi4KCiAgZnVuY3Rpb24gcmVhZFJlZ2V4cCgpIHsKICAgIHZhciBjb250ZW50ID0gIiIsIGVzY2FwZWQsIGluQ2xhc3MsIHN0YXJ0ID0gdG9rUG9zOwogICAgZm9yICg7OykgewogICAgICBpZiAodG9rUG9zID49IGlucHV0TGVuKSByYWlzZShzdGFydCwgIlVudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKICAgICAgdmFyIGNoID0gaW5wdXQuY2hhckF0KHRva1Bvcyk7CiAgICAgIGlmIChuZXdsaW5lLnRlc3QoY2gpKSByYWlzZShzdGFydCwgIlVudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKICAgICAgaWYgKCFlc2NhcGVkKSB7CiAgICAgICAgaWYgKGNoID09PSAiWyIpIGluQ2xhc3MgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGNoID09PSAiXSIgJiYgaW5DbGFzcykgaW5DbGFzcyA9IGZhbHNlOwogICAgICAgIGVsc2UgaWYgKGNoID09PSAiLyIgJiYgIWluQ2xhc3MpIGJyZWFrOwogICAgICAgIGVzY2FwZWQgPSBjaCA9PT0gIlxcIjsKICAgICAgfSBlbHNlIGVzY2FwZWQgPSBmYWxzZTsKICAgICAgKyt0b2tQb3M7CiAgICB9CiAgICB2YXIgY29udGVudCA9IGlucHV0LnNsaWNlKHN0YXJ0LCB0b2tQb3MpOwogICAgKyt0b2tQb3M7CiAgICAvLyBOZWVkIHRvIHVzZSBgcmVhZFdvcmQxYCBiZWNhdXNlICdcdVhYWFgnIHNlcXVlbmNlcyBhcmUgYWxsb3dlZAogICAgLy8gaGVyZSAoZG9uJ3QgYXNrKS4KICAgIHZhciBtb2RzID0gcmVhZFdvcmQxKCk7CiAgICBpZiAobW9kcyAmJiAhL15bZ21zaXldKiQvLnRlc3QobW9kcykpIHJhaXNlKHN0YXJ0LCAiSW52YWxpZCByZWdleHAgZmxhZyIpOwogICAgcmV0dXJuIGZpbmlzaFRva2VuKF9yZWdleHAsIG5ldyBSZWdFeHAoY29udGVudCwgbW9kcykpOwogIH0KCiAgLy8gUmVhZCBhbiBpbnRlZ2VyIGluIHRoZSBnaXZlbiByYWRpeC4gUmV0dXJuIG51bGwgaWYgemVybyBkaWdpdHMKICAvLyB3ZXJlIHJlYWQsIHRoZSBpbnRlZ2VyIHZhbHVlIG90aGVyd2lzZS4gV2hlbiBgbGVuYCBpcyBnaXZlbiwgdGhpcwogIC8vIHdpbGwgcmV0dXJuIGBudWxsYCB1bmxlc3MgdGhlIGludGVnZXIgaGFzIGV4YWN0bHkgYGxlbmAgZGlnaXRzLgoKICBmdW5jdGlvbiByZWFkSW50KHJhZGl4LCBsZW4pIHsKICAgIHZhciBzdGFydCA9IHRva1BvcywgdG90YWwgPSAwOwogICAgZm9yICg7OykgewogICAgICB2YXIgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zKSwgdmFsOwogICAgICBpZiAoY29kZSA+PSA5NykgdmFsID0gY29kZSAtIDk3ICsgMTA7IC8vIGEKICAgICAgZWxzZSBpZiAoY29kZSA+PSA2NSkgdmFsID0gY29kZSAtIDY1ICsgMTA7IC8vIEEKICAgICAgZWxzZSBpZiAoY29kZSA+PSA0OCAmJiBjb2RlIDw9IDU3KSB2YWwgPSBjb2RlIC0gNDg7IC8vIDAtOQogICAgICBlbHNlIHZhbCA9IEluZmluaXR5OwogICAgICBpZiAodmFsID49IHJhZGl4KSBicmVhazsKICAgICAgKyt0b2tQb3M7CiAgICAgIHRvdGFsID0gdG90YWwgKiByYWRpeCArIHZhbDsKICAgIH0KICAgIGlmICh0b2tQb3MgPT09IHN0YXJ0IHx8IGxlbiAhPSBudWxsICYmIHRva1BvcyAtIHN0YXJ0ICE9PSBsZW4pIHJldHVybiBudWxsOwoKICAgIHJldHVybiB0b3RhbDsKICB9CgogIGZ1bmN0aW9uIHJlYWRIZXhOdW1iZXIoKSB7CiAgICB0b2tQb3MgKz0gMjsgLy8gMHgKICAgIHZhciB2YWwgPSByZWFkSW50KDE2KTsKICAgIGlmICh2YWwgPT0gbnVsbCkgcmFpc2UodG9rU3RhcnQgKyAyLCAiRXhwZWN0ZWQgaGV4YWRlY2ltYWwgbnVtYmVyIik7CiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpKSkgcmFpc2UodG9rUG9zLCAiSWRlbnRpZmllciBkaXJlY3RseSBhZnRlciBudW1iZXIiKTsKICAgIHJldHVybiBmaW5pc2hUb2tlbihfbnVtLCB2YWwpOwogIH0KCiAgLy8gUmVhZCBhbiBpbnRlZ2VyLCBvY3RhbCBpbnRlZ2VyLCBvciBmbG9hdGluZy1wb2ludCBudW1iZXIuCiAgCiAgZnVuY3Rpb24gcmVhZE51bWJlcihjaCkgewogICAgdmFyIHN0YXJ0ID0gdG9rUG9zLCBpc0Zsb2F0ID0gY2ggPT09ICIuIjsKICAgIGlmICghaXNGbG9hdCAmJiByZWFkSW50KDEwKSA9PSBudWxsKSByYWlzZShzdGFydCwgIkludmFsaWQgbnVtYmVyIik7CiAgICBpZiAoaXNGbG9hdCB8fCBpbnB1dC5jaGFyQXQodG9rUG9zKSA9PT0gIi4iKSB7CiAgICAgIHZhciBuZXh0ID0gaW5wdXQuY2hhckF0KCsrdG9rUG9zKTsKICAgICAgaWYgKG5leHQgPT09ICItIiB8fCBuZXh0ID09PSAiKyIpICsrdG9rUG9zOwogICAgICBpZiAocmVhZEludCgxMCkgPT09IG51bGwgJiYgY2ggPT09ICIuIikgcmFpc2Uoc3RhcnQsICJJbnZhbGlkIG51bWJlciIpOwogICAgICBpc0Zsb2F0ID0gdHJ1ZTsKICAgIH0KICAgIGlmICgvZS9pLnRlc3QoaW5wdXQuY2hhckF0KHRva1BvcykpKSB7CiAgICAgIHZhciBuZXh0ID0gaW5wdXQuY2hhckF0KCsrdG9rUG9zKTsKICAgICAgaWYgKG5leHQgPT09ICItIiB8fCBuZXh0ID09PSAiKyIpICsrdG9rUG9zOwogICAgICBpZiAocmVhZEludCgxMCkgPT09IG51bGwpIHJhaXNlKHN0YXJ0LCAiSW52YWxpZCBudW1iZXIiKQogICAgICBpc0Zsb2F0ID0gdHJ1ZTsKICAgIH0KICAgIGlmIChpc0lkZW50aWZpZXJTdGFydChpbnB1dC5jaGFyQ29kZUF0KHRva1BvcykpKSByYWlzZSh0b2tQb3MsICJJZGVudGlmaWVyIGRpcmVjdGx5IGFmdGVyIG51bWJlciIpOwoKICAgIHZhciBzdHIgPSBpbnB1dC5zbGljZShzdGFydCwgdG9rUG9zKSwgdmFsOwogICAgaWYgKGlzRmxvYXQpIHZhbCA9IHBhcnNlRmxvYXQoc3RyKTsKICAgIGVsc2UgaWYgKGNoICE9PSAiMCIgfHwgc3RyLmxlbmd0aCA9PT0gMSkgdmFsID0gcGFyc2VJbnQoc3RyLCAxMCk7CiAgICBlbHNlIGlmICgvWzg5XS8udGVzdChzdHIpIHx8IHN0cmljdCkgcmFpc2Uoc3RhcnQsICJJbnZhbGlkIG51bWJlciIpOwogICAgZWxzZSB2YWwgPSBwYXJzZUludChzdHIsIDgpOwogICAgcmV0dXJuIGZpbmlzaFRva2VuKF9udW0sIHZhbCk7CiAgfQoKICAvLyBSZWFkIGEgc3RyaW5nIHZhbHVlLCBpbnRlcnByZXRpbmcgYmFja3NsYXNoLWVzY2FwZXMuCgogIGZ1bmN0aW9uIHJlYWRTdHJpbmcocXVvdGUpIHsKICAgIHRva1BvcysrOwogICAgdmFyIHN0ciA9IFtdOwogICAgZm9yICg7OykgewogICAgICBpZiAodG9rUG9zID49IGlucHV0TGVuKSByYWlzZSh0b2tTdGFydCwgIlVudGVybWluYXRlZCBzdHJpbmcgY29uc3RhbnQiKTsKICAgICAgdmFyIGNoID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpOwogICAgICBpZiAoY2ggPT09IHF1b3RlKSB7CiAgICAgICAgKyt0b2tQb3M7CiAgICAgICAgcmV0dXJuIGZpbmlzaFRva2VuKF9zdHJpbmcsIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgc3RyKSk7CiAgICAgIH0KICAgICAgaWYgKGNoID09PSA5MikgeyAvLyAnXCcKICAgICAgICBjaCA9IGlucHV0LmNoYXJDb2RlQXQoKyt0b2tQb3MpOwogICAgICAgIHZhciBvY3RhbCA9IC9eWzAtN10rLy5leGVjKGlucHV0LnNsaWNlKHRva1BvcywgdG9rUG9zICsgMykpOwogICAgICAgIGlmIChvY3RhbCkgb2N0YWwgPSBvY3RhbFswXTsKICAgICAgICB3aGlsZSAob2N0YWwgJiYgcGFyc2VJbnQob2N0YWwsIDgpID4gMjU1KSBvY3RhbCA9IG9jdGFsLnNsaWNlKDAsIG9jdGFsLmxlbmd0aCAtIDEpOwogICAgICAgIGlmIChvY3RhbCA9PT0gIjAiKSBvY3RhbCA9IG51bGw7CiAgICAgICAgKyt0b2tQb3M7CiAgICAgICAgaWYgKG9jdGFsKSB7CiAgICAgICAgICBpZiAoc3RyaWN0KSByYWlzZSh0b2tQb3MgLSAyLCAiT2N0YWwgbGl0ZXJhbCBpbiBzdHJpY3QgbW9kZSIpOwogICAgICAgICAgc3RyLnB1c2gocGFyc2VJbnQob2N0YWwsIDgpKTsKICAgICAgICAgIHRva1BvcyArPSBvY3RhbC5sZW5ndGggLSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICBjYXNlIDExMDogc3RyLnB1c2goMTApOyBicmVhazsgLy8gJ24nIC0+ICdcbicKICAgICAgICAgIGNhc2UgMTE0OiBzdHIucHVzaCgxMyk7IGJyZWFrOyAvLyAncicgLT4gJ1xyJwogICAgICAgICAgY2FzZSAxMjA6IHN0ci5wdXNoKHJlYWRIZXhDaGFyKDIpKTsgYnJlYWs7IC8vICd4JwogICAgICAgICAgY2FzZSAxMTc6IHN0ci5wdXNoKHJlYWRIZXhDaGFyKDQpKTsgYnJlYWs7IC8vICd1JwogICAgICAgICAgY2FzZSA4NTogc3RyLnB1c2gocmVhZEhleENoYXIoOCkpOyBicmVhazsgLy8gJ1UnCiAgICAgICAgICBjYXNlIDExNjogc3RyLnB1c2goOSk7IGJyZWFrOyAvLyAndCcgLT4gJ1x0JwogICAgICAgICAgY2FzZSA5ODogc3RyLnB1c2goOCk7IGJyZWFrOyAvLyAnYicgLT4gJ1xiJwogICAgICAgICAgY2FzZSAxMTg6IHN0ci5wdXNoKDExKTsgYnJlYWs7IC8vICd2JyAtPiAnXHUwMDBiJwogICAgICAgICAgY2FzZSAxMDI6IHN0ci5wdXNoKDEyKTsgYnJlYWs7IC8vICdmJyAtPiAnXGYnCiAgICAgICAgICBjYXNlIDQ4OiBzdHIucHVzaCgwKTsgYnJlYWs7IC8vIDAgLT4gJ1wwJwogICAgICAgICAgY2FzZSAxMzogaWYgKGlucHV0LmNoYXJDb2RlQXQodG9rUG9zKSA9PT0gMTApICsrdG9rUG9zOyAvLyAnXHJcbicKICAgICAgICAgIGNhc2UgMTA6IGJyZWFrOyAvLyAnIFxuJwogICAgICAgICAgZGVmYXVsdDogc3RyLnB1c2goY2gpOyBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNoID09PSAxMyB8fCBjaCA9PT0gMTAgfHwgY2ggPT09IDgyMzIgfHwgY2ggPT09IDgzMjkpIHJhaXNlKHRva1N0YXJ0LCAiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudCIpOwogICAgICAgIGlmIChjaCAhPT0gOTIpIHN0ci5wdXNoKGNoKTsgLy8gJ1wnCiAgICAgICAgKyt0b2tQb3M7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFVzZWQgdG8gcmVhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyAoJ1x4JywgJ1x1JywgJ1xVJykuCgogIGZ1bmN0aW9uIHJlYWRIZXhDaGFyKGxlbikgewogICAgdmFyIG4gPSByZWFkSW50KDE2LCBsZW4pOwogICAgaWYgKG4gPT09IG51bGwpIHJhaXNlKHRva1N0YXJ0LCAiQmFkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2UiKTsKICAgIHJldHVybiBuOwogIH0KCiAgLy8gVXNlZCB0byBzaWduYWwgdG8gY2FsbGVycyBvZiBgcmVhZFdvcmQxYCB3aGV0aGVyIHRoZSB3b3JkCiAgLy8gY29udGFpbmVkIGFueSBlc2NhcGUgc2VxdWVuY2VzLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdvcmRzIHdpdGgKICAvLyBlc2NhcGUgc2VxdWVuY2VzIG11c3Qgbm90IGJlIGludGVycHJldGVkIGFzIGtleXdvcmRzLgoKICB2YXIgY29udGFpbnNFc2M7CgogIC8vIFJlYWQgYW4gaWRlbnRpZmllciwgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZy4gU2V0cyBgY29udGFpbnNFc2NgCiAgLy8gdG8gd2hldGhlciB0aGUgd29yZCBjb250YWluZWQgYSAnXHUnIGVzY2FwZS4KICAvLwogIC8vIE9ubHkgYnVpbGRzIHVwIHRoZSB3b3JkIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgd2hlbiBpdCBhY3R1YWxseQogIC8vIGNvbnRhaW5lZHMgYW4gZXNjYXBlLCBhcyBhIG1pY3JvLW9wdGltaXphdGlvbi4KCiAgZnVuY3Rpb24gcmVhZFdvcmQxKCkgewogICAgY29udGFpbnNFc2MgPSBmYWxzZTsKICAgIHZhciB3b3JkLCBmaXJzdCA9IHRydWUsIHN0YXJ0ID0gdG9rUG9zOwogICAgZm9yICg7OykgewogICAgICB2YXIgY2ggPSBpbnB1dC5jaGFyQ29kZUF0KHRva1Bvcyk7CiAgICAgIGlmIChpc0lkZW50aWZpZXJDaGFyKGNoKSkgewogICAgICAgIGlmIChjb250YWluc0VzYykgd29yZCArPSBpbnB1dC5jaGFyQXQodG9rUG9zKTsKICAgICAgICArK3Rva1BvczsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gOTIpIHsgLy8gIlwiCiAgICAgICAgaWYgKCFjb250YWluc0VzYykgd29yZCA9IGlucHV0LnNsaWNlKHN0YXJ0LCB0b2tQb3MpOwogICAgICAgIGNvbnRhaW5zRXNjID0gdHJ1ZTsKICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdCgrK3Rva1BvcykgIT0gMTE3KSAvLyAidSIKICAgICAgICAgIHJhaXNlKHRva1BvcywgIkV4cGVjdGluZyBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZSBcXHVYWFhYIik7CiAgICAgICAgKyt0b2tQb3M7CiAgICAgICAgdmFyIGVzYyA9IHJlYWRIZXhDaGFyKDQpOwogICAgICAgIHZhciBlc2NTdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGVzYyk7CiAgICAgICAgaWYgKCFlc2NTdHIpIHJhaXNlKHRva1BvcyAtIDEsICJJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIik7CiAgICAgICAgaWYgKCEoZmlyc3QgPyBpc0lkZW50aWZpZXJTdGFydChlc2MpIDogaXNJZGVudGlmaWVyQ2hhcihlc2MpKSkKICAgICAgICAgIHJhaXNlKHRva1BvcyAtIDQsICJJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIik7CiAgICAgICAgd29yZCArPSBlc2NTdHI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIHJldHVybiBjb250YWluc0VzYyA/IHdvcmQgOiBpbnB1dC5zbGljZShzdGFydCwgdG9rUG9zKTsKICB9CgogIC8vIFJlYWQgYW4gaWRlbnRpZmllciBvciBrZXl3b3JkIHRva2VuLiBXaWxsIGNoZWNrIGZvciByZXNlcnZlZAogIC8vIHdvcmRzIHdoZW4gbmVjZXNzYXJ5LgoKICBmdW5jdGlvbiByZWFkV29yZCgpIHsKICAgIHZhciB3b3JkID0gcmVhZFdvcmQxKCk7CiAgICB2YXIgdHlwZSA9IF9uYW1lOwogICAgaWYgKCFjb250YWluc0VzYykgewogICAgICBpZiAoaXNLZXl3b3JkKHdvcmQpKSB0eXBlID0ga2V5d29yZFR5cGVzW3dvcmRdOwogICAgICBlbHNlIGlmIChvcHRpb25zLmZvcmJpZFJlc2VydmVkICYmCiAgICAgICAgICAgICAgIChvcHRpb25zLmVjbWFWZXJzaW9uID09PSAzID8gaXNSZXNlcnZlZFdvcmQzIDogaXNSZXNlcnZlZFdvcmQ1KSh3b3JkKSB8fAogICAgICAgICAgICAgICBzdHJpY3QgJiYgaXNTdHJpY3RSZXNlcnZlZFdvcmQod29yZCkpCiAgICAgICAgcmFpc2UodG9rU3RhcnQsICJUaGUga2V5d29yZCAnIiArIHdvcmQgKyAiJyBpcyByZXNlcnZlZCIpOwogICAgfQogICAgcmV0dXJuIGZpbmlzaFRva2VuKHR5cGUsIHdvcmQpOwogIH0KCiAgLy8gIyMgUGFyc2VyCgogIC8vIEEgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyIG9wZXJhdGVzIGJ5IGRlZmluaW5nIGZ1bmN0aW9ucyBmb3IgYWxsCiAgLy8gc3ludGFjdGljIGVsZW1lbnRzLCBhbmQgcmVjdXJzaXZlbHkgY2FsbGluZyB0aG9zZSwgZWFjaCBmdW5jdGlvbgogIC8vIGFkdmFuY2luZyB0aGUgaW5wdXQgc3RyZWFtIGFuZCByZXR1cm5pbmcgYW4gQVNUIG5vZGUuIFByZWNlZGVuY2UKICAvLyBvZiBjb25zdHJ1Y3RzIChmb3IgZXhhbXBsZSwgdGhlIGZhY3QgdGhhdCBgIXhbMV1gIG1lYW5zIGAhKHhbMV0pYAogIC8vIGluc3RlYWQgb2YgYCgheClbMV1gIGlzIGhhbmRsZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcGFyc2VyCiAgLy8gZnVuY3Rpb24gdGhhdCBwYXJzZXMgdW5hcnkgcHJlZml4IG9wZXJhdG9ycyBpcyBjYWxsZWQgZmlyc3QsIGFuZAogIC8vIGluIHR1cm4gY2FsbHMgdGhlIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGBbXWAgc3Vic2NyaXB0cyDigJQgdGhhdAogIC8vIHdheSwgaXQnbGwgcmVjZWl2ZSB0aGUgbm9kZSBmb3IgYHhbMV1gIGFscmVhZHkgcGFyc2VkLCBhbmQgd3JhcHMKICAvLyAqdGhhdCogaW4gdGhlIHVuYXJ5IG9wZXJhdG9yIG5vZGUuCiAgLy8KICAvLyBBY29ybiB1c2VzIGFuIFtvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNlcl1bb3BwXSB0byBoYW5kbGUgYmluYXJ5CiAgLy8gb3BlcmF0b3IgcHJlY2VkZW5jZSwgYmVjYXVzZSBpdCBpcyBtdWNoIG1vcmUgY29tcGFjdCB0aGFuIHVzaW5nCiAgLy8gdGhlIHRlY2huaXF1ZSBvdXRsaW5lZCBhYm92ZSwgd2hpY2ggdXNlcyBkaWZmZXJlbnQsIG5lc3RpbmcKICAvLyBmdW5jdGlvbnMgdG8gc3BlY2lmeSBwcmVjZWRlbmNlLCBmb3IgYWxsIG9mIHRoZSB0ZW4gYmluYXJ5CiAgLy8gcHJlY2VkZW5jZSBsZXZlbHMgdGhhdCBKYXZhU2NyaXB0IGRlZmluZXMuCiAgLy8KICAvLyBbb3BwXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGVyYXRvci1wcmVjZWRlbmNlX3BhcnNlcgoKICAvLyAjIyMgUGFyc2VyIHV0aWxpdGllcwoKICAvLyBDb250aW51ZSB0byB0aGUgbmV4dCB0b2tlbi4KICAKICBmdW5jdGlvbiBuZXh0KCkgewogICAgbGFzdFN0YXJ0ID0gdG9rU3RhcnQ7CiAgICBsYXN0RW5kID0gdG9rRW5kOwogICAgbGFzdEVuZExvYyA9IHRva0VuZExvYzsKICAgIHJlYWRUb2tlbigpOwogIH0KCiAgLy8gRW50ZXIgc3RyaWN0IG1vZGUuIFJlLXJlYWRzIHRoZSBuZXh0IHRva2VuIHRvIHBsZWFzZSBwZWRhbnRpYwogIC8vIHRlc3RzICgidXNlIHN0cmljdCI7IDAxMDsgLS0gc2hvdWxkIGZhaWwpLgoKICBmdW5jdGlvbiBzZXRTdHJpY3Qoc3RyY3QpIHsKICAgIHN0cmljdCA9IHN0cmN0OwogICAgdG9rUG9zID0gbGFzdEVuZDsKICAgIHNraXBTcGFjZSgpOwogICAgcmVhZFRva2VuKCk7CiAgfQoKICAvLyBTdGFydCBhbiBBU1Qgbm9kZSwgYXR0YWNoaW5nIGEgc3RhcnQgb2Zmc2V0IGFuZCBvcHRpb25hbGx5IGEKICAvLyBgY29tbWVudHNCZWZvcmVgIHByb3BlcnR5IHRvIGl0LgoKICBmdW5jdGlvbiBzdGFydE5vZGUoKSB7CiAgICB2YXIgbm9kZSA9IHt0eXBlOiBudWxsLCBzdGFydDogdG9rU3RhcnQsIGVuZDogbnVsbH07CiAgICBpZiAob3B0aW9ucy50cmFja0NvbW1lbnRzICYmIHRva0NvbW1lbnRzQmVmb3JlKSB7CiAgICAgIG5vZGUuY29tbWVudHNCZWZvcmUgPSB0b2tDb21tZW50c0JlZm9yZTsKICAgICAgdG9rQ29tbWVudHNCZWZvcmUgPSBudWxsOwogICAgfQogICAgaWYgKG9wdGlvbnMubG9jYXRpb25zKQogICAgICBub2RlLmxvYyA9IHtzdGFydDogdG9rU3RhcnRMb2MsIGVuZDogbnVsbCwgc291cmNlOiBzb3VyY2VGaWxlfTsKICAgIGlmIChvcHRpb25zLnJhbmdlcykKICAgICAgbm9kZS5yYW5nZSA9IFt0b2tTdGFydCwgMF07CiAgICByZXR1cm4gbm9kZTsKICB9CgogIC8vIFN0YXJ0IGEgbm9kZSB3aG9zZSBzdGFydCBvZmZzZXQvY29tbWVudHMgaW5mb3JtYXRpb24gc2hvdWxkIGJlCiAgLy8gYmFzZWQgb24gdGhlIHN0YXJ0IG9mIGFub3RoZXIgbm9kZS4gRm9yIGV4YW1wbGUsIGEgYmluYXJ5CiAgLy8gb3BlcmF0b3Igbm9kZSBpcyBvbmx5IHN0YXJ0ZWQgYWZ0ZXIgaXRzIGxlZnQtaGFuZCBzaWRlIGhhcwogIC8vIGFscmVhZHkgYmVlbiBwYXJzZWQuCgogIGZ1bmN0aW9uIHN0YXJ0Tm9kZUZyb20ob3RoZXIpIHsKICAgIHZhciBub2RlID0ge3R5cGU6IG51bGwsIHN0YXJ0OiBvdGhlci5zdGFydH07CiAgICBpZiAob3RoZXIuY29tbWVudHNCZWZvcmUpIHsKICAgICAgbm9kZS5jb21tZW50c0JlZm9yZSA9IG90aGVyLmNvbW1lbnRzQmVmb3JlOwogICAgICBvdGhlci5jb21tZW50c0JlZm9yZSA9IG51bGw7CiAgICB9CiAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpCiAgICAgIG5vZGUubG9jID0ge3N0YXJ0OiBvdGhlci5sb2Muc3RhcnQsIGVuZDogbnVsbCwgc291cmNlOiBvdGhlci5sb2Muc291cmNlfTsKICAgIGlmIChvcHRpb25zLnJhbmdlcykKICAgICAgbm9kZS5yYW5nZSA9IFtvdGhlci5yYW5nZVswXSwgMF07CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICAvLyBGaW5pc2ggYW4gQVNUIG5vZGUsIGFkZGluZyBgdHlwZWAsIGBlbmRgLCBhbmQgYGNvbW1lbnRzQWZ0ZXJgCiAgLy8gcHJvcGVydGllcy4KICAvLwogIC8vIFdlIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgbm9kZSB0aGF0IHdlIGZpbmlzaGVkLCBpbiBvcmRlcgogIC8vICdidWJibGUnIGBjb21tZW50c0FmdGVyYCBwcm9wZXJ0aWVzIHVwIHRvIHRoZSBiaWdnZXN0IG5vZGUuIEkuZS4KICAvLyBpbiAnYDEgKyAxIC8vIGZvbycsIHRoZSBjb21tZW50IHNob3VsZCBiZSBhdHRhY2hlZCB0byB0aGUgYmluYXJ5CiAgLy8gb3BlcmF0b3Igbm9kZSwgbm90IHRoZSBzZWNvbmQgbGl0ZXJhbCBub2RlLgoKICB2YXIgbGFzdEZpbmlzaGVkTm9kZTsKCiAgZnVuY3Rpb24gZmluaXNoTm9kZShub2RlLCB0eXBlKSB7CiAgICBub2RlLnR5cGUgPSB0eXBlOwogICAgbm9kZS5lbmQgPSBsYXN0RW5kOwogICAgaWYgKG9wdGlvbnMudHJhY2tDb21tZW50cykgewogICAgICBpZiAodG9rQ29tbWVudHNBZnRlcikgewogICAgICAgIG5vZGUuY29tbWVudHNBZnRlciA9IHRva0NvbW1lbnRzQWZ0ZXI7CiAgICAgICAgdG9rQ29tbWVudHNBZnRlciA9IG51bGw7CiAgICAgIH0gZWxzZSBpZiAobGFzdEZpbmlzaGVkTm9kZSAmJiBsYXN0RmluaXNoZWROb2RlLmVuZCA9PT0gbGFzdEVuZCkgewogICAgICAgIG5vZGUuY29tbWVudHNBZnRlciA9IGxhc3RGaW5pc2hlZE5vZGUuY29tbWVudHNBZnRlcjsKICAgICAgICBsYXN0RmluaXNoZWROb2RlLmNvbW1lbnRzQWZ0ZXIgPSBudWxsOwogICAgICB9CiAgICAgIGxhc3RGaW5pc2hlZE5vZGUgPSBub2RlOwogICAgfQogICAgaWYgKG9wdGlvbnMubG9jYXRpb25zKQogICAgICBub2RlLmxvYy5lbmQgPSBsYXN0RW5kTG9jOwogICAgaWYgKG9wdGlvbnMucmFuZ2VzKQogICAgICBub2RlLnJhbmdlWzFdID0gbGFzdEVuZDsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gVGVzdCB3aGV0aGVyIGEgc3RhdGVtZW50IG5vZGUgaXMgdGhlIHN0cmluZyBsaXRlcmFsIGAidXNlIHN0cmljdCJgLgoKICBmdW5jdGlvbiBpc1VzZVN0cmljdChzdG10KSB7CiAgICByZXR1cm4gb3B0aW9ucy5lY21hVmVyc2lvbiA+PSA1ICYmIHN0bXQudHlwZSA9PT0gIkV4cHJlc3Npb25TdGF0ZW1lbnQiICYmCiAgICAgIHN0bXQuZXhwcmVzc2lvbi50eXBlID09PSAiTGl0ZXJhbCIgJiYgc3RtdC5leHByZXNzaW9uLnZhbHVlID09PSAidXNlIHN0cmljdCI7CiAgfQoKICAvLyBQcmVkaWNhdGUgdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGlzIG9mIHRoZSBnaXZlbgogIC8vIHR5cGUsIGFuZCBpZiB5ZXMsIGNvbnN1bWVzIGl0IGFzIGEgc2lkZSBlZmZlY3QuCgogIGZ1bmN0aW9uIGVhdCh0eXBlKSB7CiAgICBpZiAodG9rVHlwZSA9PT0gdHlwZSkgewogICAgICBuZXh0KCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLy8gVGVzdCB3aGV0aGVyIGEgc2VtaWNvbG9uIGNhbiBiZSBpbnNlcnRlZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KCiAgZnVuY3Rpb24gY2FuSW5zZXJ0U2VtaWNvbG9uKCkgewogICAgcmV0dXJuICFvcHRpb25zLnN0cmljdFNlbWljb2xvbnMgJiYKICAgICAgKHRva1R5cGUgPT09IF9lb2YgfHwgdG9rVHlwZSA9PT0gX2JyYWNlUiB8fCBuZXdsaW5lLnRlc3QoaW5wdXQuc2xpY2UobGFzdEVuZCwgdG9rU3RhcnQpKSk7CiAgfQoKICAvLyBDb25zdW1lIGEgc2VtaWNvbG9uLCBvciwgZmFpbGluZyB0aGF0LCBzZWUgaWYgd2UgYXJlIGFsbG93ZWQgdG8KICAvLyBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYSBzZW1pY29sb24gYXQgdGhpcyBwb3NpdGlvbi4KCiAgZnVuY3Rpb24gc2VtaWNvbG9uKCkgewogICAgaWYgKCFlYXQoX3NlbWkpICYmICFjYW5JbnNlcnRTZW1pY29sb24oKSkgdW5leHBlY3RlZCgpOwogIH0KCiAgLy8gRXhwZWN0IGEgdG9rZW4gb2YgYSBnaXZlbiB0eXBlLiBJZiBmb3VuZCwgY29uc3VtZSBpdCwgb3RoZXJ3aXNlLAogIC8vIHJhaXNlIGFuIHVuZXhwZWN0ZWQgdG9rZW4gZXJyb3IuCgogIGZ1bmN0aW9uIGV4cGVjdCh0eXBlKSB7CiAgICBpZiAodG9rVHlwZSA9PT0gdHlwZSkgbmV4dCgpOwogICAgZWxzZSB1bmV4cGVjdGVkKCk7CiAgfQoKICAvLyBSYWlzZSBhbiB1bmV4cGVjdGVkIHRva2VuIGVycm9yLgoKICBmdW5jdGlvbiB1bmV4cGVjdGVkKCkgewogICAgcmFpc2UodG9rU3RhcnQsICJVbmV4cGVjdGVkIHRva2VuIik7CiAgfQoKICAvLyBWZXJpZnkgdGhhdCBhIG5vZGUgaXMgYW4gbHZhbCDigJQgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGFzc2lnbmVkCiAgLy8gdG8uCgogIGZ1bmN0aW9uIGNoZWNrTFZhbChleHByKSB7CiAgICBpZiAoZXhwci50eXBlICE9PSAiSWRlbnRpZmllciIgJiYgZXhwci50eXBlICE9PSAiTWVtYmVyRXhwcmVzc2lvbiIpCiAgICAgIHJhaXNlKGV4cHIuc3RhcnQsICJBc3NpZ25pbmcgdG8gcnZhbHVlIik7CiAgICBpZiAoc3RyaWN0ICYmIGV4cHIudHlwZSA9PT0gIklkZW50aWZpZXIiICYmIGlzU3RyaWN0QmFkSWRXb3JkKGV4cHIubmFtZSkpCiAgICAgIHJhaXNlKGV4cHIuc3RhcnQsICJBc3NpZ25pbmcgdG8gIiArIGV4cHIubmFtZSArICIgaW4gc3RyaWN0IG1vZGUiKTsKICB9CgogIC8vICMjIyBTdGF0ZW1lbnQgcGFyc2luZwoKICAvLyBQYXJzZSBhIHByb2dyYW0uIEluaXRpYWxpemVzIHRoZSBwYXJzZXIsIHJlYWRzIGFueSBudW1iZXIgb2YKICAvLyBzdGF0ZW1lbnRzLCBhbmQgd3JhcHMgdGhlbSBpbiBhIFByb2dyYW0gbm9kZS4gIE9wdGlvbmFsbHkgdGFrZXMgYQogIC8vIGBwcm9ncmFtYCBhcmd1bWVudC4gIElmIHByZXNlbnQsIHRoZSBzdGF0ZW1lbnRzIHdpbGwgYmUgYXBwZW5kZWQKICAvLyB0byBpdHMgYm9keSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG5vZGUuCgogIGZ1bmN0aW9uIHBhcnNlVG9wTGV2ZWwocHJvZ3JhbSkgewogICAgaW5pdFRva2VuU3RhdGUoKTsKICAgIGxhc3RTdGFydCA9IGxhc3RFbmQgPSB0b2tQb3M7CiAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpIGxhc3RFbmRMb2MgPSBjdXJMaW5lTG9jKCk7CiAgICBpbkZ1bmN0aW9uID0gc3RyaWN0ID0gbnVsbDsKICAgIGxhYmVscyA9IFtdOwogICAgcmVhZFRva2VuKCk7CgogICAgdmFyIG5vZGUgPSBwcm9ncmFtIHx8IHN0YXJ0Tm9kZSgpLCBmaXJzdCA9IHRydWU7CiAgICBpZiAoIXByb2dyYW0pIG5vZGUuYm9keSA9IFtdOwogICAgd2hpbGUgKHRva1R5cGUgIT09IF9lb2YpIHsKICAgICAgdmFyIHN0bXQgPSBwYXJzZVN0YXRlbWVudCgpOwogICAgICBub2RlLmJvZHkucHVzaChzdG10KTsKICAgICAgaWYgKGZpcnN0ICYmIGlzVXNlU3RyaWN0KHN0bXQpKSBzZXRTdHJpY3QodHJ1ZSk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiUHJvZ3JhbSIpOwogIH07CgogIHZhciBsb29wTGFiZWwgPSB7a2luZDogImxvb3AifSwgc3dpdGNoTGFiZWwgPSB7a2luZDogInN3aXRjaCJ9OwoKICAvLyBQYXJzZSBhIHNpbmdsZSBzdGF0ZW1lbnQuCiAgLy8KICAvLyBJZiBleHBlY3RpbmcgYSBzdGF0ZW1lbnQgYW5kIGZpbmRpbmcgYSBzbGFzaCBvcGVyYXRvciwgcGFyc2UgYQogIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsLiBUaGlzIGlzIHRvIGhhbmRsZSBjYXNlcyBsaWtlCiAgLy8gYGlmIChmb28pIC9ibGFoLy5leGVjKGZvbyk7YCwgd2hlcmUgbG9va2luZyBhdCB0aGUgcHJldmlvdXMgdG9rZW4KICAvLyBkb2VzIG5vdCBoZWxwLgoKICBmdW5jdGlvbiBwYXJzZVN0YXRlbWVudCgpIHsKICAgIGlmICh0b2tUeXBlID09PSBfc2xhc2gpCiAgICAgIHJlYWRUb2tlbih0cnVlKTsKCiAgICB2YXIgc3RhcnR0eXBlID0gdG9rVHlwZSwgbm9kZSA9IHN0YXJ0Tm9kZSgpOwoKICAgIC8vIE1vc3QgdHlwZXMgb2Ygc3RhdGVtZW50cyBhcmUgcmVjb2duaXplZCBieSB0aGUga2V5d29yZCB0aGV5CiAgICAvLyBzdGFydCB3aXRoLiBNYW55IGFyZSB0cml2aWFsIHRvIHBhcnNlLCBzb21lIHJlcXVpcmUgYSBiaXQgb2YKICAgIC8vIGNvbXBsZXhpdHkuCgogICAgc3dpdGNoIChzdGFydHR5cGUpIHsKICAgIGNhc2UgX2JyZWFrOiBjYXNlIF9jb250aW51ZToKICAgICAgbmV4dCgpOwogICAgICB2YXIgaXNCcmVhayA9IHN0YXJ0dHlwZSA9PT0gX2JyZWFrOwogICAgICBpZiAoZWF0KF9zZW1pKSB8fCBjYW5JbnNlcnRTZW1pY29sb24oKSkgbm9kZS5sYWJlbCA9IG51bGw7CiAgICAgIGVsc2UgaWYgKHRva1R5cGUgIT09IF9uYW1lKSB1bmV4cGVjdGVkKCk7CiAgICAgIGVsc2UgewogICAgICAgIG5vZGUubGFiZWwgPSBwYXJzZUlkZW50KCk7CiAgICAgICAgc2VtaWNvbG9uKCk7CiAgICAgIH0KCiAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGFuIGFjdHVhbCBkZXN0aW5hdGlvbiB0byBicmVhayBvcgogICAgICAvLyBjb250aW51ZSB0by4KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgbGFiID0gbGFiZWxzW2ldOwogICAgICAgIGlmIChub2RlLmxhYmVsID09IG51bGwgfHwgbGFiLm5hbWUgPT09IG5vZGUubGFiZWwubmFtZSkgewogICAgICAgICAgaWYgKGxhYi5raW5kICE9IG51bGwgJiYgKGlzQnJlYWsgfHwgbGFiLmtpbmQgPT09ICJsb29wIikpIGJyZWFrOwogICAgICAgICAgaWYgKG5vZGUubGFiZWwgJiYgaXNCcmVhaykgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpID09PSBsYWJlbHMubGVuZ3RoKSByYWlzZShub2RlLnN0YXJ0LCAiVW5zeW50YWN0aWMgIiArIHN0YXJ0dHlwZS5rZXl3b3JkKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgaXNCcmVhayA/ICJCcmVha1N0YXRlbWVudCIgOiAiQ29udGludWVTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF9kZWJ1Z2dlcjoKICAgICAgbmV4dCgpOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiRGVidWdnZXJTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF9kbzoKICAgICAgbmV4dCgpOwogICAgICBsYWJlbHMucHVzaChsb29wTGFiZWwpOwogICAgICBub2RlLmJvZHkgPSBwYXJzZVN0YXRlbWVudCgpOwogICAgICBsYWJlbHMucG9wKCk7CiAgICAgIGV4cGVjdChfd2hpbGUpOwogICAgICBub2RlLnRlc3QgPSBwYXJzZVBhcmVuRXhwcmVzc2lvbigpOwogICAgICBzZW1pY29sb24oKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIkRvV2hpbGVTdGF0ZW1lbnQiKTsKCiAgICAgIC8vIERpc2FtYmlndWF0aW5nIGJldHdlZW4gYSBgZm9yYCBhbmQgYSBgZm9yYC9gaW5gIGxvb3AgaXMKICAgICAgLy8gbm9uLXRyaXZpYWwuIEJhc2ljYWxseSwgd2UgaGF2ZSB0byBwYXJzZSB0aGUgaW5pdCBgdmFyYAogICAgICAvLyBzdGF0ZW1lbnQgb3IgZXhwcmVzc2lvbiwgZGlzYWxsb3dpbmcgdGhlIGBpbmAgb3BlcmF0b3IgKHNlZQogICAgICAvLyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBgcGFyc2VFeHByZXNzaW9uYCksIGFuZCB0aGVuIGNoZWNrCiAgICAgIC8vIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gaXMgYGluYC4gV2hlbiB0aGVyZSBpcyBubyBpbml0IHBhcnQKICAgICAgLy8gKHNlbWljb2xvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgb3BlbmluZyBwYXJlbnRoZXNpcyksIGl0IGlzCiAgICAgIC8vIGEgcmVndWxhciBgZm9yYCBsb29wLgoKICAgIGNhc2UgX2ZvcjoKICAgICAgbmV4dCgpOwogICAgICBsYWJlbHMucHVzaChsb29wTGFiZWwpOwogICAgICBleHBlY3QoX3BhcmVuTCk7CiAgICAgIGlmICh0b2tUeXBlID09PSBfc2VtaSkgcmV0dXJuIHBhcnNlRm9yKG5vZGUsIG51bGwpOwogICAgICBpZiAodG9rVHlwZSA9PT0gX3ZhcikgewogICAgICAgIHZhciBpbml0ID0gc3RhcnROb2RlKCk7CiAgICAgICAgbmV4dCgpOwogICAgICAgIHBhcnNlVmFyKGluaXQsIHRydWUpOwogICAgICAgIGlmIChpbml0LmRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDEgJiYgZWF0KF9pbikpCiAgICAgICAgICByZXR1cm4gcGFyc2VGb3JJbihub2RlLCBpbml0KTsKICAgICAgICByZXR1cm4gcGFyc2VGb3Iobm9kZSwgaW5pdCk7CiAgICAgIH0KICAgICAgdmFyIGluaXQgPSBwYXJzZUV4cHJlc3Npb24oZmFsc2UsIHRydWUpOwogICAgICBpZiAoZWF0KF9pbikpIHtjaGVja0xWYWwoaW5pdCk7IHJldHVybiBwYXJzZUZvckluKG5vZGUsIGluaXQpO30KICAgICAgcmV0dXJuIHBhcnNlRm9yKG5vZGUsIGluaXQpOwoKICAgIGNhc2UgX2Z1bmN0aW9uOgogICAgICBuZXh0KCk7CiAgICAgIHJldHVybiBwYXJzZUZ1bmN0aW9uKG5vZGUsIHRydWUpOwoKICAgIGNhc2UgX2lmOgogICAgICBuZXh0KCk7CiAgICAgIG5vZGUudGVzdCA9IHBhcnNlUGFyZW5FeHByZXNzaW9uKCk7CiAgICAgIG5vZGUuY29uc2VxdWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICAgIG5vZGUuYWx0ZXJuYXRlID0gZWF0KF9lbHNlKSA/IHBhcnNlU3RhdGVtZW50KCkgOiBudWxsOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiSWZTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF9yZXR1cm46CiAgICAgIGlmICghaW5GdW5jdGlvbikgcmFpc2UodG9rU3RhcnQsICIncmV0dXJuJyBvdXRzaWRlIG9mIGZ1bmN0aW9uIik7CiAgICAgIG5leHQoKTsKCiAgICAgIC8vIEluIGByZXR1cm5gIChhbmQgYGJyZWFrYC9gY29udGludWVgKSwgdGhlIGtleXdvcmRzIHdpdGgKICAgICAgLy8gb3B0aW9uYWwgYXJndW1lbnRzLCB3ZSBlYWdlcmx5IGxvb2sgZm9yIGEgc2VtaWNvbG9uIG9yIHRoZQogICAgICAvLyBwb3NzaWJpbGl0eSB0byBpbnNlcnQgb25lLgogICAgICAKICAgICAgaWYgKGVhdChfc2VtaSkgfHwgY2FuSW5zZXJ0U2VtaWNvbG9uKCkpIG5vZGUuYXJndW1lbnQgPSBudWxsOwogICAgICBlbHNlIHsgbm9kZS5hcmd1bWVudCA9IHBhcnNlRXhwcmVzc2lvbigpOyBzZW1pY29sb24oKTsgfQogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiUmV0dXJuU3RhdGVtZW50Iik7CgogICAgY2FzZSBfc3dpdGNoOgogICAgICBuZXh0KCk7CiAgICAgIG5vZGUuZGlzY3JpbWluYW50ID0gcGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKICAgICAgbm9kZS5jYXNlcyA9IFtdOwogICAgICBleHBlY3QoX2JyYWNlTCk7CiAgICAgIGxhYmVscy5wdXNoKHN3aXRjaExhYmVsKTsKCiAgICAgIC8vIFN0YXRlbWVudHMgdW5kZXIgbXVzdCBiZSBncm91cGVkIChieSBsYWJlbCkgaW4gU3dpdGNoQ2FzZQogICAgICAvLyBub2Rlcy4gYGN1cmAgaXMgdXNlZCB0byBrZWVwIHRoZSBub2RlIHRoYXQgd2UgYXJlIGN1cnJlbnRseQogICAgICAvLyBhZGRpbmcgc3RhdGVtZW50cyB0by4KICAgICAgCiAgICAgIGZvciAodmFyIGN1ciwgc2F3RGVmYXVsdDsgdG9rVHlwZSAhPSBfYnJhY2VSOykgewogICAgICAgIGlmICh0b2tUeXBlID09PSBfY2FzZSB8fCB0b2tUeXBlID09PSBfZGVmYXVsdCkgewogICAgICAgICAgdmFyIGlzQ2FzZSA9IHRva1R5cGUgPT09IF9jYXNlOwogICAgICAgICAgaWYgKGN1cikgZmluaXNoTm9kZShjdXIsICJTd2l0Y2hDYXNlIik7CiAgICAgICAgICBub2RlLmNhc2VzLnB1c2goY3VyID0gc3RhcnROb2RlKCkpOwogICAgICAgICAgY3VyLmNvbnNlcXVlbnQgPSBbXTsKICAgICAgICAgIG5leHQoKTsKICAgICAgICAgIGlmIChpc0Nhc2UpIGN1ci50ZXN0ID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKHNhd0RlZmF1bHQpIHJhaXNlKGxhc3RTdGFydCwgIk11bHRpcGxlIGRlZmF1bHQgY2xhdXNlcyIpOyBzYXdEZWZhdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgY3VyLnRlc3QgPSBudWxsOwogICAgICAgICAgfQogICAgICAgICAgZXhwZWN0KF9jb2xvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghY3VyKSB1bmV4cGVjdGVkKCk7CiAgICAgICAgICBjdXIuY29uc2VxdWVudC5wdXNoKHBhcnNlU3RhdGVtZW50KCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY3VyKSBmaW5pc2hOb2RlKGN1ciwgIlN3aXRjaENhc2UiKTsKICAgICAgbmV4dCgpOyAvLyBDbG9zaW5nIGJyYWNlCiAgICAgIGxhYmVscy5wb3AoKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIlN3aXRjaFN0YXRlbWVudCIpOwoKICAgIGNhc2UgX3Rocm93OgogICAgICBuZXh0KCk7CiAgICAgIGlmIChuZXdsaW5lLnRlc3QoaW5wdXQuc2xpY2UobGFzdEVuZCwgdG9rU3RhcnQpKSkKICAgICAgICByYWlzZShsYXN0RW5kLCAiSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93Iik7CiAgICAgIG5vZGUuYXJndW1lbnQgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIlRocm93U3RhdGVtZW50Iik7CgogICAgY2FzZSBfdHJ5OgogICAgICBuZXh0KCk7CiAgICAgIG5vZGUuYmxvY2sgPSBwYXJzZUJsb2NrKCk7CiAgICAgIG5vZGUuaGFuZGxlcnMgPSBbXTsKICAgICAgd2hpbGUgKHRva1R5cGUgPT09IF9jYXRjaCkgewogICAgICAgIHZhciBjbGF1c2UgPSBzdGFydE5vZGUoKTsKICAgICAgICBuZXh0KCk7CiAgICAgICAgZXhwZWN0KF9wYXJlbkwpOwogICAgICAgIGNsYXVzZS5wYXJhbSA9IHBhcnNlSWRlbnQoKTsKICAgICAgICBpZiAoc3RyaWN0ICYmIGlzU3RyaWN0QmFkSWRXb3JkKGNsYXVzZS5wYXJhbS5uYW1lKSkKICAgICAgICAgIHJhaXNlKGNsYXVzZS5wYXJhbS5zdGFydCwgIkJpbmRpbmcgIiArIGNsYXVzZS5wYXJhbS5uYW1lICsgIiBpbiBzdHJpY3QgbW9kZSIpOwogICAgICAgIGV4cGVjdChfcGFyZW5SKTsKICAgICAgICBjbGF1c2UuZ3VhcmQgPSBudWxsOwogICAgICAgIGNsYXVzZS5ib2R5ID0gcGFyc2VCbG9jaygpOwogICAgICAgIG5vZGUuaGFuZGxlcnMucHVzaChmaW5pc2hOb2RlKGNsYXVzZSwgIkNhdGNoQ2xhdXNlIikpOwogICAgICB9CiAgICAgIG5vZGUuZmluYWxpemVyID0gZWF0KF9maW5hbGx5KSA/IHBhcnNlQmxvY2soKSA6IG51bGw7CiAgICAgIGlmICghbm9kZS5oYW5kbGVycy5sZW5ndGggJiYgIW5vZGUuZmluYWxpemVyKQogICAgICAgIHJhaXNlKG5vZGUuc3RhcnQsICJNaXNzaW5nIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlIik7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJUcnlTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF92YXI6CiAgICAgIG5leHQoKTsKICAgICAgbm9kZSA9IHBhcnNlVmFyKG5vZGUpOwogICAgICBzZW1pY29sb24oKTsKICAgICAgcmV0dXJuIG5vZGU7CgogICAgY2FzZSBfd2hpbGU6CiAgICAgIG5leHQoKTsKICAgICAgbm9kZS50ZXN0ID0gcGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKICAgICAgbGFiZWxzLnB1c2gobG9vcExhYmVsKTsKICAgICAgbm9kZS5ib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgbGFiZWxzLnBvcCgpOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiV2hpbGVTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF93aXRoOgogICAgICBpZiAoc3RyaWN0KSByYWlzZSh0b2tTdGFydCwgIid3aXRoJyBpbiBzdHJpY3QgbW9kZSIpOwogICAgICBuZXh0KCk7CiAgICAgIG5vZGUub2JqZWN0ID0gcGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKICAgICAgbm9kZS5ib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIldpdGhTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF9icmFjZUw6CiAgICAgIHJldHVybiBwYXJzZUJsb2NrKCk7CgogICAgY2FzZSBfc2VtaToKICAgICAgbmV4dCgpOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiRW1wdHlTdGF0ZW1lbnQiKTsKCiAgICAgIC8vIElmIHRoZSBzdGF0ZW1lbnQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIHN0YXRlbWVudCBrZXl3b3JkIG9yIGEKICAgICAgLy8gYnJhY2UsIGl0J3MgYW4gRXhwcmVzc2lvblN0YXRlbWVudCBvciBMYWJlbGVkU3RhdGVtZW50LiBXZQogICAgICAvLyBzaW1wbHkgc3RhcnQgcGFyc2luZyBhbiBleHByZXNzaW9uLCBhbmQgYWZ0ZXJ3YXJkcywgaWYgdGhlCiAgICAgIC8vIG5leHQgdG9rZW4gaXMgYSBjb2xvbiBhbmQgdGhlIGV4cHJlc3Npb24gd2FzIGEgc2ltcGxlCiAgICAgIC8vIElkZW50aWZpZXIgbm9kZSwgd2Ugc3dpdGNoIHRvIGludGVycHJldGluZyBpdCBhcyBhIGxhYmVsLgoKICAgIGRlZmF1bHQ6CiAgICAgIHZhciBtYXliZU5hbWUgPSB0b2tWYWwsIGV4cHIgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgICAgaWYgKHN0YXJ0dHlwZSA9PT0gX25hbWUgJiYgZXhwci50eXBlID09PSAiSWRlbnRpZmllciIgJiYgZWF0KF9jb2xvbikpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7ICsraSkKICAgICAgICAgIGlmIChsYWJlbHNbaV0ubmFtZSA9PT0gbWF5YmVOYW1lKSByYWlzZShleHByLnN0YXJ0LCAiTGFiZWwgJyIgKyBtYXliZU5hbWUgKyAiJyBpcyBhbHJlYWR5IGRlY2xhcmVkIik7CiAgICAgICAgdmFyIGtpbmQgPSB0b2tUeXBlLmlzTG9vcCA/ICJsb29wIiA6IHRva1R5cGUgPT09IF9zd2l0Y2ggPyAic3dpdGNoIiA6IG51bGw7CiAgICAgICAgbGFiZWxzLnB1c2goe25hbWU6IG1heWJlTmFtZSwga2luZDoga2luZH0pOwogICAgICAgIG5vZGUuYm9keSA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICAgICAgbm9kZS5sYWJlbCA9IGV4cHI7CiAgICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIkxhYmVsZWRTdGF0ZW1lbnQiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBub2RlLmV4cHJlc3Npb24gPSBleHByOwogICAgICAgIHNlbWljb2xvbigpOwogICAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJFeHByZXNzaW9uU3RhdGVtZW50Iik7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFVzZWQgZm9yIGNvbnN0cnVjdHMgbGlrZSBgc3dpdGNoYCBhbmQgYGlmYCB0aGF0IGluc2lzdCBvbgogIC8vIHBhcmVudGhlc2VzIGFyb3VuZCB0aGVpciBleHByZXNzaW9uLgoKICBmdW5jdGlvbiBwYXJzZVBhcmVuRXhwcmVzc2lvbigpIHsKICAgIGV4cGVjdChfcGFyZW5MKTsKICAgIHZhciB2YWwgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgIGV4cGVjdChfcGFyZW5SKTsKICAgIHJldHVybiB2YWw7CiAgfQoKICAvLyBQYXJzZSBhIHNlbWljb2xvbi1lbmNsb3NlZCBibG9jayBvZiBzdGF0ZW1lbnRzLCBoYW5kbGluZyBgInVzZQogIC8vIHN0cmljdCJgIGRlY2xhcmF0aW9ucyB3aGVuIGBhbGxvd1N0cmljdGAgaXMgdHJ1ZSAodXNlZCBmb3IKICAvLyBmdW5jdGlvbiBib2RpZXMpLgoKICBmdW5jdGlvbiBwYXJzZUJsb2NrKGFsbG93U3RyaWN0KSB7CiAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZSgpLCBmaXJzdCA9IHRydWUsIHN0cmljdCA9IGZhbHNlLCBvbGRTdHJpY3Q7CiAgICBub2RlLmJvZHkgPSBbXTsKICAgIGV4cGVjdChfYnJhY2VMKTsKICAgIHdoaWxlICghZWF0KF9icmFjZVIpKSB7CiAgICAgIHZhciBzdG10ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgbm9kZS5ib2R5LnB1c2goc3RtdCk7CiAgICAgIGlmIChmaXJzdCAmJiBpc1VzZVN0cmljdChzdG10KSkgewogICAgICAgIG9sZFN0cmljdCA9IHN0cmljdDsKICAgICAgICBzZXRTdHJpY3Qoc3RyaWN0ID0gdHJ1ZSk7CiAgICAgIH0KICAgICAgZmlyc3QgPSBmYWxzZQogICAgfQogICAgaWYgKHN0cmljdCAmJiAhb2xkU3RyaWN0KSBzZXRTdHJpY3QoZmFsc2UpOwogICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIkJsb2NrU3RhdGVtZW50Iik7CiAgfQoKICAvLyBQYXJzZSBhIHJlZ3VsYXIgYGZvcmAgbG9vcC4gVGhlIGRpc2FtYmlndWF0aW9uIGNvZGUgaW4KICAvLyBgcGFyc2VTdGF0ZW1lbnRgIHdpbGwgYWxyZWFkeSBoYXZlIHBhcnNlZCB0aGUgaW5pdCBzdGF0ZW1lbnQgb3IKICAvLyBleHByZXNzaW9uLgoKICBmdW5jdGlvbiBwYXJzZUZvcihub2RlLCBpbml0KSB7CiAgICBub2RlLmluaXQgPSBpbml0OwogICAgZXhwZWN0KF9zZW1pKTsKICAgIG5vZGUudGVzdCA9IHRva1R5cGUgPT09IF9zZW1pID8gbnVsbCA6IHBhcnNlRXhwcmVzc2lvbigpOwogICAgZXhwZWN0KF9zZW1pKTsKICAgIG5vZGUudXBkYXRlID0gdG9rVHlwZSA9PT0gX3BhcmVuUiA/IG51bGwgOiBwYXJzZUV4cHJlc3Npb24oKTsKICAgIGV4cGVjdChfcGFyZW5SKTsKICAgIG5vZGUuYm9keSA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICBsYWJlbHMucG9wKCk7CiAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiRm9yU3RhdGVtZW50Iik7CiAgfQoKICAvLyBQYXJzZSBhIGBmb3JgL2BpbmAgbG9vcC4KCiAgZnVuY3Rpb24gcGFyc2VGb3JJbihub2RlLCBpbml0KSB7CiAgICBub2RlLmxlZnQgPSBpbml0OwogICAgbm9kZS5yaWdodCA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgZXhwZWN0KF9wYXJlblIpOwogICAgbm9kZS5ib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgIGxhYmVscy5wb3AoKTsKICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJGb3JJblN0YXRlbWVudCIpOwogIH0KCiAgLy8gUGFyc2UgYSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KCiAgZnVuY3Rpb24gcGFyc2VWYXIobm9kZSwgbm9JbikgewogICAgbm9kZS5kZWNsYXJhdGlvbnMgPSBbXTsKICAgIG5vZGUua2luZCA9ICJ2YXIiOwogICAgZm9yICg7OykgewogICAgICB2YXIgZGVjbCA9IHN0YXJ0Tm9kZSgpOwogICAgICBkZWNsLmlkID0gcGFyc2VJZGVudCgpOwogICAgICBpZiAoc3RyaWN0ICYmIGlzU3RyaWN0QmFkSWRXb3JkKGRlY2wuaWQubmFtZSkpCiAgICAgICAgcmFpc2UoZGVjbC5pZC5zdGFydCwgIkJpbmRpbmcgIiArIGRlY2wuaWQubmFtZSArICIgaW4gc3RyaWN0IG1vZGUiKTsKICAgICAgZGVjbC5pbml0ID0gZWF0KF9lcSkgPyBwYXJzZUV4cHJlc3Npb24odHJ1ZSwgbm9JbikgOiBudWxsOwogICAgICBub2RlLmRlY2xhcmF0aW9ucy5wdXNoKGZpbmlzaE5vZGUoZGVjbCwgIlZhcmlhYmxlRGVjbGFyYXRvciIpKTsKICAgICAgaWYgKCFlYXQoX2NvbW1hKSkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiVmFyaWFibGVEZWNsYXJhdGlvbiIpOwogIH0KCiAgLy8gIyMjIEV4cHJlc3Npb24gcGFyc2luZwoKICAvLyBUaGVzZSBuZXN0LCBmcm9tIHRoZSBtb3N0IGdlbmVyYWwgZXhwcmVzc2lvbiB0eXBlIGF0IHRoZSB0b3AgdG8KICAvLyAnYXRvbWljJywgbm9uZGl2aXNpYmxlIGV4cHJlc3Npb24gdHlwZXMgYXQgdGhlIGJvdHRvbS4gTW9zdCBvZgogIC8vIHRoZSBmdW5jdGlvbnMgd2lsbCBzaW1wbHkgbGV0IHRoZSBmdW5jdGlvbihzKSBiZWxvdyB0aGVtIHBhcnNlLAogIC8vIGFuZCwgKmlmKiB0aGUgc3ludGFjdGljIGNvbnN0cnVjdCB0aGV5IGhhbmRsZSBpcyBwcmVzZW50LCB3cmFwCiAgLy8gdGhlIEFTVCBub2RlIHRoYXQgdGhlIGlubmVyIHBhcnNlciBnYXZlIHRoZW0gaW4gYW5vdGhlciBub2RlLgoKICAvLyBQYXJzZSBhIGZ1bGwgZXhwcmVzc2lvbi4gVGhlIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBmb3JiaWQgY29tbWEKICAvLyBzZXF1ZW5jZXMgKGluIGFyZ3VtZW50IGxpc3RzLCBhcnJheSBsaXRlcmFscywgb3Igb2JqZWN0IGxpdGVyYWxzKQogIC8vIG9yIHRoZSBgaW5gIG9wZXJhdG9yIChpbiBmb3IgbG9vcHMgaW5pdGFsaXphdGlvbiBleHByZXNzaW9ucykuCgogIGZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihub0NvbW1hLCBub0luKSB7CiAgICB2YXIgZXhwciA9IHBhcnNlTWF5YmVBc3NpZ24obm9Jbik7CiAgICBpZiAoIW5vQ29tbWEgJiYgdG9rVHlwZSA9PT0gX2NvbW1hKSB7CiAgICAgIHZhciBub2RlID0gc3RhcnROb2RlRnJvbShleHByKTsKICAgICAgbm9kZS5leHByZXNzaW9ucyA9IFtleHByXTsKICAgICAgd2hpbGUgKGVhdChfY29tbWEpKSBub2RlLmV4cHJlc3Npb25zLnB1c2gocGFyc2VNYXliZUFzc2lnbihub0luKSk7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJTZXF1ZW5jZUV4cHJlc3Npb24iKTsKICAgIH0KICAgIHJldHVybiBleHByOwogIH0KCiAgLy8gUGFyc2UgYW4gYXNzaWdubWVudCBleHByZXNzaW9uLiBUaGlzIGluY2x1ZGVzIGFwcGxpY2F0aW9ucyBvZgogIC8vIG9wZXJhdG9ycyBsaWtlIGArPWAuCgogIGZ1bmN0aW9uIHBhcnNlTWF5YmVBc3NpZ24obm9JbikgewogICAgdmFyIGxlZnQgPSBwYXJzZU1heWJlQ29uZGl0aW9uYWwobm9Jbik7CiAgICBpZiAodG9rVHlwZS5pc0Fzc2lnbikgewogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZUZyb20obGVmdCk7CiAgICAgIG5vZGUub3BlcmF0b3IgPSB0b2tWYWw7CiAgICAgIG5vZGUubGVmdCA9IGxlZnQ7CiAgICAgIG5leHQoKTsKICAgICAgbm9kZS5yaWdodCA9IHBhcnNlTWF5YmVBc3NpZ24obm9Jbik7CiAgICAgIGNoZWNrTFZhbChsZWZ0KTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIkFzc2lnbm1lbnRFeHByZXNzaW9uIik7CiAgICB9CiAgICByZXR1cm4gbGVmdDsKICB9CgogIC8vIFBhcnNlIGEgdGVybmFyeSBjb25kaXRpb25hbCAoYD86YCkgb3BlcmF0b3IuCgogIGZ1bmN0aW9uIHBhcnNlTWF5YmVDb25kaXRpb25hbChub0luKSB7CiAgICB2YXIgZXhwciA9IHBhcnNlRXhwck9wcyhub0luKTsKICAgIGlmIChlYXQoX3F1ZXN0aW9uKSkgewogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZUZyb20oZXhwcik7CiAgICAgIG5vZGUudGVzdCA9IGV4cHI7CiAgICAgIG5vZGUuY29uc2VxdWVudCA9IHBhcnNlRXhwcmVzc2lvbih0cnVlKTsKICAgICAgZXhwZWN0KF9jb2xvbik7CiAgICAgIG5vZGUuYWx0ZXJuYXRlID0gcGFyc2VFeHByZXNzaW9uKHRydWUsIG5vSW4pOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiQ29uZGl0aW9uYWxFeHByZXNzaW9uIik7CiAgICB9CiAgICByZXR1cm4gZXhwcjsKICB9CgogIC8vIFN0YXJ0IHRoZSBwcmVjZWRlbmNlIHBhcnNlci4KCiAgZnVuY3Rpb24gcGFyc2VFeHByT3BzKG5vSW4pIHsKICAgIHJldHVybiBwYXJzZUV4cHJPcChwYXJzZU1heWJlVW5hcnkobm9JbiksIC0xLCBub0luKTsKICB9CgogIC8vIFBhcnNlIGJpbmFyeSBvcGVyYXRvcnMgd2l0aCB0aGUgb3BlcmF0b3IgcHJlY2VkZW5jZSBwYXJzaW5nCiAgLy8gYWxnb3JpdGhtLiBgbGVmdGAgaXMgdGhlIGxlZnQtaGFuZCBzaWRlIG9mIHRoZSBvcGVyYXRvci4KICAvLyBgbWluUHJlY2AgcHJvdmlkZXMgY29udGV4dCB0aGF0IGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gc3RvcCBhbmQKICAvLyBkZWZlciBmdXJ0aGVyIHBhcnNlciB0byBvbmUgb2YgaXRzIGNhbGxlcnMgd2hlbiBpdCBlbmNvdW50ZXJzIGFuCiAgLy8gb3BlcmF0b3IgdGhhdCBoYXMgYSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gdGhlIHNldCBpdCBpcyBwYXJzaW5nLgoKICBmdW5jdGlvbiBwYXJzZUV4cHJPcChsZWZ0LCBtaW5QcmVjLCBub0luKSB7CiAgICB2YXIgcHJlYyA9IHRva1R5cGUuYmlub3A7CiAgICBpZiAocHJlYyAhPSBudWxsICYmICghbm9JbiB8fCB0b2tUeXBlICE9PSBfaW4pKSB7CiAgICAgIGlmIChwcmVjID4gbWluUHJlYykgewogICAgICAgIHZhciBub2RlID0gc3RhcnROb2RlRnJvbShsZWZ0KTsKICAgICAgICBub2RlLmxlZnQgPSBsZWZ0OwogICAgICAgIG5vZGUub3BlcmF0b3IgPSB0b2tWYWw7CiAgICAgICAgbmV4dCgpOwogICAgICAgIG5vZGUucmlnaHQgPSBwYXJzZUV4cHJPcChwYXJzZU1heWJlVW5hcnkobm9JbiksIHByZWMsIG5vSW4pOwogICAgICAgIHZhciBub2RlID0gZmluaXNoTm9kZShub2RlLCAvJiZ8XHxcfC8udGVzdChub2RlLm9wZXJhdG9yKSA/ICJMb2dpY2FsRXhwcmVzc2lvbiIgOiAiQmluYXJ5RXhwcmVzc2lvbiIpOwogICAgICAgIHJldHVybiBwYXJzZUV4cHJPcChub2RlLCBtaW5QcmVjLCBub0luKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGxlZnQ7CiAgfQoKICAvLyBQYXJzZSB1bmFyeSBvcGVyYXRvcnMsIGJvdGggcHJlZml4IGFuZCBwb3N0Zml4LgoKICBmdW5jdGlvbiBwYXJzZU1heWJlVW5hcnkobm9JbikgewogICAgaWYgKHRva1R5cGUucHJlZml4KSB7CiAgICAgIHZhciBub2RlID0gc3RhcnROb2RlKCksIHVwZGF0ZSA9IHRva1R5cGUuaXNVcGRhdGU7CiAgICAgIG5vZGUub3BlcmF0b3IgPSB0b2tWYWw7CiAgICAgIG5vZGUucHJlZml4ID0gdHJ1ZTsKICAgICAgbmV4dCgpOwogICAgICBub2RlLmFyZ3VtZW50ID0gcGFyc2VNYXliZVVuYXJ5KG5vSW4pOwogICAgICBpZiAodXBkYXRlKSBjaGVja0xWYWwobm9kZS5hcmd1bWVudCk7CiAgICAgIGVsc2UgaWYgKHN0cmljdCAmJiBub2RlLm9wZXJhdG9yID09PSAiZGVsZXRlIiAmJgogICAgICAgICAgICAgICBub2RlLmFyZ3VtZW50LnR5cGUgPT09ICJJZGVudGlmaWVyIikKICAgICAgICByYWlzZShub2RlLnN0YXJ0LCAiRGVsZXRpbmcgbG9jYWwgdmFyaWFibGUgaW4gc3RyaWN0IG1vZGUiKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgdXBkYXRlID8gIlVwZGF0ZUV4cHJlc3Npb24iIDogIlVuYXJ5RXhwcmVzc2lvbiIpOwogICAgfQogICAgdmFyIGV4cHIgPSBwYXJzZUV4cHJTdWJzY3JpcHRzKCk7CiAgICB3aGlsZSAodG9rVHlwZS5wb3N0Zml4ICYmICFjYW5JbnNlcnRTZW1pY29sb24oKSkgewogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZUZyb20oZXhwcik7CiAgICAgIG5vZGUub3BlcmF0b3IgPSB0b2tWYWw7CiAgICAgIG5vZGUucHJlZml4ID0gZmFsc2U7CiAgICAgIG5vZGUuYXJndW1lbnQgPSBleHByOwogICAgICBjaGVja0xWYWwoZXhwcik7CiAgICAgIG5leHQoKTsKICAgICAgZXhwciA9IGZpbmlzaE5vZGUobm9kZSwgIlVwZGF0ZUV4cHJlc3Npb24iKTsKICAgIH0KICAgIHJldHVybiBleHByOwogIH0KCiAgLy8gUGFyc2UgY2FsbCwgZG90LCBhbmQgYFtdYC1zdWJzY3JpcHQgZXhwcmVzc2lvbnMuCgogIGZ1bmN0aW9uIHBhcnNlRXhwclN1YnNjcmlwdHMoKSB7CiAgICByZXR1cm4gcGFyc2VTdWJzY3JpcHRzKHBhcnNlRXhwckF0b20oKSk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZVN1YnNjcmlwdHMoYmFzZSwgbm9DYWxscykgewogICAgaWYgKGVhdChfZG90KSkgewogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZUZyb20oYmFzZSk7CiAgICAgIG5vZGUub2JqZWN0ID0gYmFzZTsKICAgICAgbm9kZS5wcm9wZXJ0eSA9IHBhcnNlSWRlbnQodHJ1ZSk7CiAgICAgIG5vZGUuY29tcHV0ZWQgPSBmYWxzZTsKICAgICAgcmV0dXJuIHBhcnNlU3Vic2NyaXB0cyhmaW5pc2hOb2RlKG5vZGUsICJNZW1iZXJFeHByZXNzaW9uIiksIG5vQ2FsbHMpOwogICAgfSBlbHNlIGlmIChlYXQoX2JyYWNrZXRMKSkgewogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZUZyb20oYmFzZSk7CiAgICAgIG5vZGUub2JqZWN0ID0gYmFzZTsKICAgICAgbm9kZS5wcm9wZXJ0eSA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICBub2RlLmNvbXB1dGVkID0gdHJ1ZTsKICAgICAgZXhwZWN0KF9icmFja2V0Uik7CiAgICAgIHJldHVybiBwYXJzZVN1YnNjcmlwdHMoZmluaXNoTm9kZShub2RlLCAiTWVtYmVyRXhwcmVzc2lvbiIpLCBub0NhbGxzKTsKICAgIH0gZWxzZSBpZiAoIW5vQ2FsbHMgJiYgZWF0KF9wYXJlbkwpKSB7CiAgICAgIHZhciBub2RlID0gc3RhcnROb2RlRnJvbShiYXNlKTsKICAgICAgbm9kZS5jYWxsZWUgPSBiYXNlOwogICAgICBub2RlLmFyZ3VtZW50cyA9IHBhcnNlRXhwckxpc3QoX3BhcmVuUiwgZmFsc2UpOwogICAgICByZXR1cm4gcGFyc2VTdWJzY3JpcHRzKGZpbmlzaE5vZGUobm9kZSwgIkNhbGxFeHByZXNzaW9uIiksIG5vQ2FsbHMpOwogICAgfSBlbHNlIHJldHVybiBiYXNlOwogIH0KCiAgLy8gUGFyc2UgYW4gYXRvbWljIGV4cHJlc3Npb24g4oCUIGVpdGhlciBhIHNpbmdsZSB0b2tlbiB0aGF0IGlzIGFuCiAgLy8gZXhwcmVzc2lvbiwgYW4gZXhwcmVzc2lvbiBzdGFydGVkIGJ5IGEga2V5d29yZCBsaWtlIGBmdW5jdGlvbmAgb3IKICAvLyBgbmV3YCwgb3IgYW4gZXhwcmVzc2lvbiB3cmFwcGVkIGluIHB1bmN0dWF0aW9uIGxpa2UgYCgpYCwgYFtdYCwKICAvLyBvciBge31gLgoKICBmdW5jdGlvbiBwYXJzZUV4cHJBdG9tKCkgewogICAgc3dpdGNoICh0b2tUeXBlKSB7CiAgICBjYXNlIF90aGlzOgogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZSgpOwogICAgICBuZXh0KCk7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJUaGlzRXhwcmVzc2lvbiIpOwogICAgY2FzZSBfbmFtZToKICAgICAgcmV0dXJuIHBhcnNlSWRlbnQoKTsKICAgIGNhc2UgX251bTogY2FzZSBfc3RyaW5nOiBjYXNlIF9yZWdleHA6CiAgICAgIHZhciBub2RlID0gc3RhcnROb2RlKCk7CiAgICAgIG5vZGUudmFsdWUgPSB0b2tWYWw7CiAgICAgIG5vZGUucmF3ID0gaW5wdXQuc2xpY2UodG9rU3RhcnQsIHRva0VuZCk7CiAgICAgIG5leHQoKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIkxpdGVyYWwiKTsKCiAgICBjYXNlIF9udWxsOiBjYXNlIF90cnVlOiBjYXNlIF9mYWxzZToKICAgICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKTsKICAgICAgbm9kZS52YWx1ZSA9IHRva1R5cGUuYXRvbVZhbHVlOwogICAgICBuZXh0KCk7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJMaXRlcmFsIik7CgogICAgY2FzZSBfcGFyZW5MOgogICAgICBuZXh0KCk7CiAgICAgIHZhciB2YWwgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgICAgZXhwZWN0KF9wYXJlblIpOwogICAgICByZXR1cm4gdmFsOwoKICAgIGNhc2UgX2JyYWNrZXRMOgogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZSgpOwogICAgICBuZXh0KCk7CiAgICAgIG5vZGUuZWxlbWVudHMgPSBwYXJzZUV4cHJMaXN0KF9icmFja2V0UiwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJBcnJheUV4cHJlc3Npb24iKTsKCiAgICBjYXNlIF9icmFjZUw6CiAgICAgIHJldHVybiBwYXJzZU9iaigpOwoKICAgIGNhc2UgX2Z1bmN0aW9uOgogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZSgpOwogICAgICBuZXh0KCk7CiAgICAgIHJldHVybiBwYXJzZUZ1bmN0aW9uKG5vZGUsIGZhbHNlKTsKCiAgICBjYXNlIF9uZXc6CiAgICAgIHJldHVybiBwYXJzZU5ldygpOwoKICAgIGRlZmF1bHQ6CiAgICAgIHVuZXhwZWN0ZWQoKTsKICAgIH0KICB9CgogIC8vIE5ldydzIHByZWNlZGVuY2UgaXMgc2xpZ2h0bHkgdHJpY2t5LiBJdCBtdXN0IGFsbG93IGl0cyBhcmd1bWVudAogIC8vIHRvIGJlIGEgYFtdYCBvciBkb3Qgc3Vic2NyaXB0IGV4cHJlc3Npb24sIGJ1dCBub3QgYSBjYWxsIOKAlCBhdAogIC8vIGxlYXN0LCBub3Qgd2l0aG91dCB3cmFwcGluZyBpdCBpbiBwYXJlbnRoZXNlcy4gVGh1cywgaXQgdXNlcyB0aGUgCgogIGZ1bmN0aW9uIHBhcnNlTmV3KCkgewogICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKTsKICAgIG5leHQoKTsKICAgIG5vZGUuY2FsbGVlID0gcGFyc2VTdWJzY3JpcHRzKHBhcnNlRXhwckF0b20oZmFsc2UpLCB0cnVlKTsKICAgIGlmIChlYXQoX3BhcmVuTCkpIG5vZGUuYXJndW1lbnRzID0gcGFyc2VFeHByTGlzdChfcGFyZW5SLCBmYWxzZSk7CiAgICBlbHNlIG5vZGUuYXJndW1lbnRzID0gW107CiAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiTmV3RXhwcmVzc2lvbiIpOwogIH0KCiAgLy8gUGFyc2UgYW4gb2JqZWN0IGxpdGVyYWwuCgogIGZ1bmN0aW9uIHBhcnNlT2JqKCkgewogICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKSwgZmlyc3QgPSB0cnVlLCBzYXdHZXRTZXQgPSBmYWxzZTsKICAgIG5vZGUucHJvcGVydGllcyA9IFtdOwogICAgbmV4dCgpOwogICAgd2hpbGUgKCFlYXQoX2JyYWNlUikpIHsKICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgIGV4cGVjdChfY29tbWEpOwogICAgICAgIGlmIChvcHRpb25zLmFsbG93VHJhaWxpbmdDb21tYXMgJiYgZWF0KF9icmFjZVIpKSBicmVhazsKICAgICAgfSBlbHNlIGZpcnN0ID0gZmFsc2U7CgogICAgICB2YXIgcHJvcCA9IHtrZXk6IHBhcnNlUHJvcGVydHlOYW1lKCl9LCBpc0dldFNldCA9IGZhbHNlLCBraW5kOwogICAgICBpZiAoZWF0KF9jb2xvbikpIHsKICAgICAgICBwcm9wLnZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHRydWUpOwogICAgICAgIGtpbmQgPSBwcm9wLmtpbmQgPSAiaW5pdCI7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lY21hVmVyc2lvbiA+PSA1ICYmIHByb3Aua2V5LnR5cGUgPT09ICJJZGVudGlmaWVyIiAmJgogICAgICAgICAgICAgICAgIChwcm9wLmtleS5uYW1lID09PSAiZ2V0IiB8fCBwcm9wLmtleS5uYW1lID09PSAic2V0IikpIHsKICAgICAgICBpc0dldFNldCA9IHNhd0dldFNldCA9IHRydWU7CiAgICAgICAga2luZCA9IHByb3Aua2luZCA9IHByb3Aua2V5Lm5hbWU7CiAgICAgICAgcHJvcC5rZXkgPSBwYXJzZVByb3BlcnR5TmFtZSgpOwogICAgICAgIGlmICghdG9rVHlwZSA9PT0gX3BhcmVuTCkgdW5leHBlY3RlZCgpOwogICAgICAgIHByb3AudmFsdWUgPSBwYXJzZUZ1bmN0aW9uKHN0YXJ0Tm9kZSgpLCBmYWxzZSk7CiAgICAgIH0gZWxzZSB1bmV4cGVjdGVkKCk7CgogICAgICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFyZSBub3QgYWxsb3dlZCB0byBjbGFzaCDigJQgZWl0aGVyIHdpdGgKICAgICAgLy8gZWFjaCBvdGhlciBvciB3aXRoIGFuIGluaXQgcHJvcGVydHkg4oCUIGFuZCBpbiBzdHJpY3QgbW9kZSwKICAgICAgLy8gaW5pdCBwcm9wZXJ0aWVzIGFyZSBhbHNvIG5vdCBhbGxvd2VkIHRvIGJlIHJlcGVhdGVkLgoKICAgICAgaWYgKHByb3Aua2V5LnR5cGUgPT09ICJJZGVudGlmaWVyIiAmJiAoc3RyaWN0IHx8IHNhd0dldFNldCkpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucHJvcGVydGllcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgdmFyIG90aGVyID0gbm9kZS5wcm9wZXJ0aWVzW2ldOwogICAgICAgICAgaWYgKG90aGVyLmtleS5uYW1lID09PSBwcm9wLmtleS5uYW1lKSB7CiAgICAgICAgICAgIHZhciBjb25mbGljdCA9IGtpbmQgPT0gb3RoZXIua2luZCB8fCBpc0dldFNldCAmJiBvdGhlci5raW5kID09PSAiaW5pdCIgfHwKICAgICAgICAgICAgICBraW5kID09PSAiaW5pdCIgJiYgKG90aGVyLmtpbmQgPT09ICJnZXQiIHx8IG90aGVyLmtpbmQgPT09ICJzZXQiKTsKICAgICAgICAgICAgaWYgKGNvbmZsaWN0ICYmICFzdHJpY3QgJiYga2luZCA9PT0gImluaXQiICYmIG90aGVyLmtpbmQgPT09ICJpbml0IikgY29uZmxpY3QgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKGNvbmZsaWN0KSByYWlzZShwcm9wLmtleS5zdGFydCwgIlJlZGVmaW5pdGlvbiBvZiBwcm9wZXJ0eSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBub2RlLnByb3BlcnRpZXMucHVzaChwcm9wKTsKICAgIH0KICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJPYmplY3RFeHByZXNzaW9uIik7CiAgfQoKICBmdW5jdGlvbiBwYXJzZVByb3BlcnR5TmFtZSgpIHsKICAgIGlmICh0b2tUeXBlID09PSBfbnVtIHx8IHRva1R5cGUgPT09IF9zdHJpbmcpIHJldHVybiBwYXJzZUV4cHJBdG9tKCk7CiAgICByZXR1cm4gcGFyc2VJZGVudCh0cnVlKTsKICB9CgogIC8vIFBhcnNlIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb3IgbGl0ZXJhbCAoZGVwZW5kaW5nIG9uIHRoZQogIC8vIGBpc1N0YXRlbWVudGAgcGFyYW1ldGVyKS4KCiAgZnVuY3Rpb24gcGFyc2VGdW5jdGlvbihub2RlLCBpc1N0YXRlbWVudCkgewogICAgaWYgKHRva1R5cGUgPT09IF9uYW1lKSBub2RlLmlkID0gcGFyc2VJZGVudCgpOwogICAgZWxzZSBpZiAoaXNTdGF0ZW1lbnQpIHVuZXhwZWN0ZWQoKTsKICAgIGVsc2Ugbm9kZS5pZCA9IG51bGw7CiAgICBub2RlLnBhcmFtcyA9IFtdOwogICAgdmFyIGZpcnN0ID0gdHJ1ZTsKICAgIGV4cGVjdChfcGFyZW5MKTsKICAgIHdoaWxlICghZWF0KF9wYXJlblIpKSB7CiAgICAgIGlmICghZmlyc3QpIGV4cGVjdChfY29tbWEpOyBlbHNlIGZpcnN0ID0gZmFsc2U7CiAgICAgIG5vZGUucGFyYW1zLnB1c2gocGFyc2VJZGVudCgpKTsKICAgIH0KCiAgICAvLyBTdGFydCBhIG5ldyBzY29wZSB3aXRoIHJlZ2FyZCB0byBsYWJlbHMgYW5kIHRoZSBgaW5GdW5jdGlvbmAKICAgIC8vIGZsYWcgKHJlc3RvcmUgdGhlbSB0byB0aGVpciBvbGQgdmFsdWUgYWZ0ZXJ3YXJkcykuCiAgICB2YXIgb2xkSW5GdW5jID0gaW5GdW5jdGlvbiwgb2xkTGFiZWxzID0gbGFiZWxzOwogICAgaW5GdW5jdGlvbiA9IHRydWU7IGxhYmVscyA9IFtdOwogICAgbm9kZS5ib2R5ID0gcGFyc2VCbG9jayh0cnVlKTsKICAgIGluRnVuY3Rpb24gPSBvbGRJbkZ1bmM7IGxhYmVscyA9IG9sZExhYmVsczsKCiAgICAvLyBJZiB0aGlzIGlzIGEgc3RyaWN0IG1vZGUgZnVuY3Rpb24sIHZlcmlmeSB0aGF0IGFyZ3VtZW50IG5hbWVzCiAgICAvLyBhcmUgbm90IHJlcGVhdGVkLCBhbmQgaXQgZG9lcyBub3QgdHJ5IHRvIGJpbmQgdGhlIHdvcmRzIGBldmFsYAogICAgLy8gb3IgYGFyZ3VtZW50c2AuCiAgICBpZiAoc3RyaWN0IHx8IG5vZGUuYm9keS5ib2R5Lmxlbmd0aCAmJiBpc1VzZVN0cmljdChub2RlLmJvZHkuYm9keVswXSkpIHsKICAgICAgZm9yICh2YXIgaSA9IG5vZGUuaWQgPyAtMSA6IDA7IGkgPCBub2RlLnBhcmFtcy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBpZCA9IGkgPCAwID8gbm9kZS5pZCA6IG5vZGUucGFyYW1zW2ldOwogICAgICAgIGlmIChpc1N0cmljdFJlc2VydmVkV29yZChpZC5uYW1lKSB8fCBpc1N0cmljdEJhZElkV29yZChpZC5uYW1lKSkKICAgICAgICAgIHJhaXNlKGlkLnN0YXJ0LCAiRGVmaW5pbmcgJyIgKyBpZC5uYW1lICsgIicgaW4gc3RyaWN0IG1vZGUiKTsKICAgICAgICBpZiAoaSA+PSAwKSBmb3IgKHZhciBqID0gMDsgaiA8IGk7ICsraikgaWYgKGlkLm5hbWUgPT09IG5vZGUucGFyYW1zW2pdLm5hbWUpCiAgICAgICAgICByYWlzZShpZC5zdGFydCwgIkFyZ3VtZW50IG5hbWUgY2xhc2ggaW4gc3RyaWN0IG1vZGUiKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsIGlzU3RhdGVtZW50ID8gIkZ1bmN0aW9uRGVjbGFyYXRpb24iIDogIkZ1bmN0aW9uRXhwcmVzc2lvbiIpOwogIH0KCiAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMsIGFuZCByZXR1cm5zIHRoZW0gYXMKICAvLyBhbiBhcnJheS4gYGNsb3NlYCBpcyB0aGUgdG9rZW4gdHlwZSB0aGF0IGVuZHMgdGhlIGxpc3QsIGFuZAogIC8vIGBhbGxvd0VtcHR5YCBjYW4gYmUgdHVybmVkIG9uIHRvIGFsbG93IHN1YnNlcXVlbnQgY29tbWFzIHdpdGgKICAvLyBub3RoaW5nIGluIGJldHdlZW4gdGhlbSB0byBiZSBwYXJzZWQgYXMgYG51bGxgICh3aGljaCBpcyBuZWVkZWQKICAvLyBmb3IgYXJyYXkgbGl0ZXJhbHMpLgoKICBmdW5jdGlvbiBwYXJzZUV4cHJMaXN0KGNsb3NlLCBhbGxvd1RyYWlsaW5nQ29tbWEsIGFsbG93RW1wdHkpIHsKICAgIHZhciBlbHRzID0gW10sIGZpcnN0ID0gdHJ1ZTsKICAgIHdoaWxlICghZWF0KGNsb3NlKSkgewogICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgZXhwZWN0KF9jb21tYSk7CiAgICAgICAgaWYgKGFsbG93VHJhaWxpbmdDb21tYSAmJiBvcHRpb25zLmFsbG93VHJhaWxpbmdDb21tYXMgJiYgZWF0KGNsb3NlKSkgYnJlYWs7CiAgICAgIH0gZWxzZSBmaXJzdCA9IGZhbHNlOwoKICAgICAgaWYgKGFsbG93RW1wdHkgJiYgdG9rVHlwZSA9PT0gX2NvbW1hKSBlbHRzLnB1c2gobnVsbCk7CiAgICAgIGVsc2UgZWx0cy5wdXNoKHBhcnNlRXhwcmVzc2lvbih0cnVlKSk7CiAgICB9CiAgICByZXR1cm4gZWx0czsKICB9CgogIC8vIFBhcnNlIHRoZSBuZXh0IHRva2VuIGFzIGFuIGlkZW50aWZpZXIuIElmIGBsaWJlcmFsYCBpcyB0cnVlICh1c2VkCiAgLy8gd2hlbiBwYXJzaW5nIHByb3BlcnRpZXMpLCBpdCB3aWxsIGFsc28gY29udmVydCBrZXl3b3JkcyBpbnRvCiAgLy8gaWRlbnRpZmllcnMuCgogIGZ1bmN0aW9uIHBhcnNlSWRlbnQobGliZXJhbCkgewogICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKTsKICAgIG5vZGUubmFtZSA9IHRva1R5cGUgPT09IF9uYW1lID8gdG9rVmFsIDogKGxpYmVyYWwgJiYgIW9wdGlvbnMuZm9yYmlkUmVzZXJ2ZWQgJiYgdG9rVHlwZS5rZXl3b3JkKSB8fCB1bmV4cGVjdGVkKCk7CiAgICBuZXh0KCk7CiAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiSWRlbnRpZmllciIpOwogIH0KCn0pKHR5cGVvZiBleHBvcnRzID09PSAidW5kZWZpbmVkIiA/ICh3aW5kb3cuYWNvcm4gPSB7fSkgOiBleHBvcnRzKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/lint/lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIFNpbXBsZSBsaW50ZXIsIGJhc2VkIG9uIHRoZSBBY29ybiBbMV0gcGFyc2VyIG1vZHVsZQoKIEFsbCBvZiB0aGUgZXhpc3RpbmcgbGludGVycyBlaXRoZXIgY3JhbXAgbXkgc3R5bGUgb3IgaGF2ZSBodWdlCiBkZXBlbmRlbmNpZXMgKENsb3N1cmUpLiBTbyBoZXJlJ3MgYSB2ZXJ5IHNpbXBsZSwgbm9uLWludmFzaXZlIG9uZQogdGhhdCBvbmx5IHNwb3RzCgogIC0gbWlzc2luZyBzZW1pY29sb25zIGFuZCB0cmFpbGluZyBjb21tYXMKICAtIHZhcmlhYmxlcyBvciBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlc2VydmVkIHdvcmRzCiAgLSBhc3NpZ25pbmcgdG8gYSB2YXJpYWJsZSB5b3UgZGlkbid0IGRlY2xhcmUKCiBbMV06IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2Fjb3JuLwoqLwoKdmFyIGZzID0gcmVxdWlyZSgiZnMiKSwgYWNvcm4gPSByZXF1aXJlKCIuL2Fjb3JuLmpzIiksIHdhbGsgPSByZXF1aXJlKCIuL3dhbGsuanMiKTsKCnZhciBzY29wZVBhc3NlciA9IHdhbGsubWFrZSh7CiAgU2NvcGVCb2R5OiBmdW5jdGlvbihub2RlLCBwcmV2LCBjKSB7IGMobm9kZSwgbm9kZS5zY29wZSk7IH0KfSk7CgpmdW5jdGlvbiBjaGVja0ZpbGUoZmlsZU5hbWUpIHsKICB2YXIgZmlsZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlTmFtZSwgInV0ZjgiKTsKICB2YXIgYmFkQ2hhciA9IGZpbGUubWF0Y2goL1tceDAwLVx4MDhceDBiXHgwY1x4MGUtXHgxOVx1RkVGRl0vKTsKICBpZiAoYmFkQ2hhcikKICAgIGZhaWwoIlVuZGVzaXJhYmxlIGNoYXJhY3RlciAiICsgYmFkQ2hhclswXS5jaGFyQ29kZUF0KDApICsgIiBhdCBwb3NpdGlvbiAiICsgYmFkQ2hhci5pbmRleCwKICAgICAgICAge3NvdXJjZTogZmlsZU5hbWV9KTsKCiAgdHJ5IHsKICAgIHZhciBwYXJzZWQgPSBhY29ybi5wYXJzZShmaWxlLCB7CiAgICAgIGxvY2F0aW9uczogdHJ1ZSwKICAgICAgZWNtYVZlcnNpb246IDMsCiAgICAgIHN0cmljdFNlbWljb2xvbnM6IHRydWUsCiAgICAgIGZvcmJpZFJlc2VydmVkOiB0cnVlLAogICAgICBzb3VyY2VGaWxlOiBmaWxlTmFtZQogICAgfSk7CiAgfSBjYXRjaCAoZSkgewogICAgZmFpbChlLm1lc3NhZ2UsIHtzb3VyY2U6IGZpbGVOYW1lfSk7CiAgICByZXR1cm47CiAgfQoKICB2YXIgc2NvcGVzID0gW107CgogIHdhbGsuc2ltcGxlKHBhcnNlZCwgewogICAgU2NvcGVCb2R5OiBmdW5jdGlvbihub2RlLCBzY29wZSkgewogICAgICBub2RlLnNjb3BlID0gc2NvcGU7CiAgICAgIHNjb3Blcy5wdXNoKHNjb3BlKTsKICAgIH0KICB9LCB3YWxrLnNjb3BlVmlzaXRvciwge3ZhcnM6IE9iamVjdC5jcmVhdGUobnVsbCl9KTsKCiAgdmFyIGlnbm9yZWRHbG9iYWxzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgZnVuY3Rpb24gaW5TY29wZShuYW1lLCBzY29wZSkgewogICAgZm9yICh2YXIgY3VyID0gc2NvcGU7IGN1cjsgY3VyID0gY3VyLnByZXYpCiAgICAgIGlmIChuYW1lIGluIGN1ci52YXJzKSByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gY2hlY2tMSFMobm9kZSwgc2NvcGUpIHsKICAgIGlmIChub2RlLnR5cGUgPT0gIklkZW50aWZpZXIiICYmICEobm9kZS5uYW1lIGluIGlnbm9yZWRHbG9iYWxzKSAmJgogICAgICAgICFpblNjb3BlKG5vZGUubmFtZSwgc2NvcGUpKSB7CiAgICAgIGlnbm9yZWRHbG9iYWxzW25vZGUubmFtZV0gPSB0cnVlOwogICAgICBmYWlsKCJBc3NpZ25tZW50IHRvIGdsb2JhbCB2YXJpYWJsZSIsIG5vZGUubG9jKTsKICAgIH0KICB9CgogIHdhbGsuc2ltcGxlKHBhcnNlZCwgewogICAgVXBkYXRlRXhwcmVzc2lvbjogZnVuY3Rpb24obm9kZSwgc2NvcGUpIHtjaGVja0xIUyhub2RlLmFyZ3VtZW50LCBzY29wZSk7fSwKICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiBmdW5jdGlvbihub2RlLCBzY29wZSkge2NoZWNrTEhTKG5vZGUubGVmdCwgc2NvcGUpO30sCiAgICBJZGVudGlmaWVyOiBmdW5jdGlvbihub2RlLCBzY29wZSkgewogICAgICAvLyBNYXJrIHVzZWQgaWRlbnRpZmllcnMKICAgICAgZm9yICh2YXIgY3VyID0gc2NvcGU7IGN1cjsgY3VyID0gY3VyLnByZXYpCiAgICAgICAgaWYgKG5vZGUubmFtZSBpbiBjdXIudmFycykgewogICAgICAgICAgY3VyLnZhcnNbbm9kZS5uYW1lXS51c2VkID0gdHJ1ZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgfSwgc2NvcGVQYXNzZXIpOwoKICBmb3IgKHZhciBpID0gMDsgaSA8IHNjb3Blcy5sZW5ndGg7ICsraSkgewogICAgdmFyIHNjb3BlID0gc2NvcGVzW2ldOwogICAgZm9yICh2YXIgbmFtZSBpbiBzY29wZS52YXJzKSB7CiAgICAgIHZhciBpbmZvID0gc2NvcGUudmFyc1tuYW1lXTsKICAgICAgaWYgKCFpbmZvLnVzZWQgJiYgaW5mby50eXBlICE9ICJjYXRjaCBjbGF1c2UiICYmIGluZm8udHlwZSAhPSAiZnVuY3Rpb24gbmFtZSIgJiYgbmFtZS5jaGFyQXQoMCkgIT0gIl8iKQogICAgICAgIGZhaWwoIlVudXNlZCAiICsgaW5mby50eXBlICsgIiAiICsgbmFtZSwgaW5mby5ub2RlLmxvYyk7CiAgICB9CiAgfQp9Cgp2YXIgZmFpbGVkID0gZmFsc2U7CmZ1bmN0aW9uIGZhaWwobXNnLCBwb3MpIHsKICBpZiAocG9zLnN0YXJ0KSBtc2cgKz0gIiAoIiArIHBvcy5zdGFydC5saW5lICsgIjoiICsgcG9zLnN0YXJ0LmNvbHVtbiArICIpIjsKICBjb25zb2xlLmxvZyhwb3Muc291cmNlLm1hdGNoKC9bXlwvXSskLylbMF0gKyAiOiAiICsgbXNnKTsKICBmYWlsZWQgPSB0cnVlOwp9CgpmdW5jdGlvbiBjaGVja0RpcihkaXIpIHsKICBmcy5yZWFkZGlyU3luYyhkaXIpLmZvckVhY2goZnVuY3Rpb24oZmlsZSkgewogICAgdmFyIGZuYW1lID0gZGlyICsgIi8iICsgZmlsZTsKICAgIGlmICgvXC5qcyQvLnRlc3QoZmlsZSkpIGNoZWNrRmlsZShmbmFtZSk7CiAgICBlbHNlIGlmIChmcy5sc3RhdFN5bmMoZm5hbWUpLmlzRGlyZWN0b3J5KCkpIGNoZWNrRGlyKGZuYW1lKTsKICB9KTsKfQoKZXhwb3J0cy5jaGVja0RpciA9IGNoZWNrRGlyOwpleHBvcnRzLmNoZWNrRmlsZSA9IGNoZWNrRmlsZTsKZXhwb3J0cy5zdWNjZXNzID0gZnVuY3Rpb24oKSB7IHJldHVybiAhZmFpbGVkOyB9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/lint/parse-js.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIEEgSmF2YVNjcmlwdCB0b2tlbml6ZXIgLyBwYXJzZXIgLyBiZWF1dGlmaWVyIC8gY29tcHJlc3Nvci4KCiAgVGhpcyB2ZXJzaW9uIGlzIHN1aXRhYmxlIGZvciBOb2RlLmpzLiAgV2l0aCBtaW5pbWFsIGNoYW5nZXMgKHRoZQogIGV4cG9ydHMgc3R1ZmYpIGl0IHNob3VsZCB3b3JrIG9uIGFueSBKUyBwbGF0Zm9ybS4KCiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSB0b2tlbml6ZXIvcGFyc2VyLiAgSXQgaXMgYSBwb3J0IHRvIEphdmFTY3JpcHQKICBvZiBwYXJzZS1qcyBbMV0sIGEgSmF2YVNjcmlwdCBwYXJzZXIgbGlicmFyeSB3cml0dGVuIGluIENvbW1vbiBMaXNwCiAgYnkgTWFyaWpuIEhhdmVyYmVrZS4gIFRoYW5rIHlvdSBNYXJpam4hCgogIFsxXSBodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9wYXJzZS1qcy8KCiAgRXhwb3J0ZWQgZnVuY3Rpb25zOgoKICAgIC0gdG9rZW5pemVyKGNvZGUpIC0tIHJldHVybnMgYSBmdW5jdGlvbi4gIENhbGwgdGhlIHJldHVybmVkCiAgICAgIGZ1bmN0aW9uIHRvIGZldGNoIHRoZSBuZXh0IHRva2VuLgoKICAgIC0gcGFyc2UoY29kZSkgLS0gcmV0dXJucyBhbiBBU1Qgb2YgdGhlIGdpdmVuIEphdmFTY3JpcHQgY29kZS4KCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKEMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yOiBNaWhhaSBCYXpvbgogICAgICAgICAgICAgICAgICAgICAgICAgPG1paGFpLmJhem9uQGdtYWlsLmNvbT4KICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vbWloYWkuYmF6b24ubmV0L2Jsb2cKCiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlOgoKICAgIENvcHlyaWdodCAyMDEwIChjKSBNaWhhaSBCYXpvbiA8bWloYWkuYmF6b25AZ21haWwuY29tPgogICAgQmFzZWQgb24gcGFyc2UtanMgKGh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL3BhcnNlLWpzLykuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICAgIGFyZSBtZXQ6CgogICAgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQogICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKICAgICAgICAgIGRpc2NsYWltZXIuCgogICAgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKICAgICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwogICAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVIg4oCcQVMgSVPigJ0gQU5EIEFOWQogICAgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICAgIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICAgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgQkUKICAgIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCiAgICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKICAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogICAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKICAgIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRgogICAgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAgICBTVUNIIERBTUFHRS4KCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIC0tLS0tWyBUb2tlbml6ZXIgKGNvbnN0YW50cykgXS0tLS0tICovCgp2YXIgS0VZV09SRFMgPSBhcnJheV90b19oYXNoKFsKICAgICAgICAiYnJlYWsiLAogICAgICAgICJjYXNlIiwKICAgICAgICAiY2F0Y2giLAogICAgICAgICJjb25zdCIsCiAgICAgICAgImNvbnRpbnVlIiwKICAgICAgICAiZGVidWdnZXIiLAogICAgICAgICJkZWZhdWx0IiwKICAgICAgICAiZGVsZXRlIiwKICAgICAgICAiZG8iLAogICAgICAgICJlbHNlIiwKICAgICAgICAiZmluYWxseSIsCiAgICAgICAgImZvciIsCiAgICAgICAgImZ1bmN0aW9uIiwKICAgICAgICAiaWYiLAogICAgICAgICJpbiIsCiAgICAgICAgImluc3RhbmNlb2YiLAogICAgICAgICJuZXciLAogICAgICAgICJyZXR1cm4iLAogICAgICAgICJzd2l0Y2giLAogICAgICAgICJ0aHJvdyIsCiAgICAgICAgInRyeSIsCiAgICAgICAgInR5cGVvZiIsCiAgICAgICAgInZhciIsCiAgICAgICAgInZvaWQiLAogICAgICAgICJ3aGlsZSIsCiAgICAgICAgIndpdGgiCl0pOwoKdmFyIFJFU0VSVkVEX1dPUkRTID0gYXJyYXlfdG9faGFzaChbCiAgICAgICAgImFic3RyYWN0IiwKICAgICAgICAiYm9vbGVhbiIsCiAgICAgICAgImJ5dGUiLAogICAgICAgICJjaGFyIiwKICAgICAgICAiY2xhc3MiLAogICAgICAgICJkb3VibGUiLAogICAgICAgICJlbnVtIiwKICAgICAgICAiZXhwb3J0IiwKICAgICAgICAiZXh0ZW5kcyIsCiAgICAgICAgImZpbmFsIiwKICAgICAgICAiZmxvYXQiLAogICAgICAgICJnb3RvIiwKICAgICAgICAiaW1wbGVtZW50cyIsCiAgICAgICAgImltcG9ydCIsCiAgICAgICAgImludCIsCiAgICAgICAgImludGVyZmFjZSIsCiAgICAgICAgImxvbmciLAogICAgICAgICJuYXRpdmUiLAogICAgICAgICJwYWNrYWdlIiwKICAgICAgICAicHJpdmF0ZSIsCiAgICAgICAgInByb3RlY3RlZCIsCiAgICAgICAgInB1YmxpYyIsCiAgICAgICAgInNob3J0IiwKICAgICAgICAic3RhdGljIiwKICAgICAgICAic3VwZXIiLAogICAgICAgICJzeW5jaHJvbml6ZWQiLAogICAgICAgICJ0aHJvd3MiLAogICAgICAgICJ0cmFuc2llbnQiLAogICAgICAgICJ2b2xhdGlsZSIKXSk7Cgp2YXIgS0VZV09SRFNfQkVGT1JFX0VYUFJFU1NJT04gPSBhcnJheV90b19oYXNoKFsKICAgICAgICAicmV0dXJuIiwKICAgICAgICAibmV3IiwKICAgICAgICAiZGVsZXRlIiwKICAgICAgICAidGhyb3ciLAogICAgICAgICJlbHNlIiwKICAgICAgICAiY2FzZSIKXSk7Cgp2YXIgS0VZV09SRFNfQVRPTSA9IGFycmF5X3RvX2hhc2goWwogICAgICAgICJmYWxzZSIsCiAgICAgICAgIm51bGwiLAogICAgICAgICJ0cnVlIiwKICAgICAgICAidW5kZWZpbmVkIgpdKTsKCnZhciBPUEVSQVRPUl9DSEFSUyA9IGFycmF5X3RvX2hhc2goY2hhcmFjdGVycygiKy0qJiU9PD4hP3x+XiIpKTsKCnZhciBSRV9IRVhfTlVNQkVSID0gL14weFswLTlhLWZdKyQvaTsKdmFyIFJFX09DVF9OVU1CRVIgPSAvXjBbMC03XSskLzsKdmFyIFJFX0RFQ19OVU1CRVIgPSAvXlxkKlwuP1xkKig/OmVbKy1dP1xkKig/OlxkXC4/fFwuP1xkKVxkKik/JC9pOwoKdmFyIE9QRVJBVE9SUyA9IGFycmF5X3RvX2hhc2goWwogICAgICAgICJpbiIsCiAgICAgICAgImluc3RhbmNlb2YiLAogICAgICAgICJ0eXBlb2YiLAogICAgICAgICJuZXciLAogICAgICAgICJ2b2lkIiwKICAgICAgICAiZGVsZXRlIiwKICAgICAgICAiKysiLAogICAgICAgICItLSIsCiAgICAgICAgIisiLAogICAgICAgICItIiwKICAgICAgICAiISIsCiAgICAgICAgIn4iLAogICAgICAgICImIiwKICAgICAgICAifCIsCiAgICAgICAgIl4iLAogICAgICAgICIqIiwKICAgICAgICAiLyIsCiAgICAgICAgIiUiLAogICAgICAgICI+PiIsCiAgICAgICAgIjw8IiwKICAgICAgICAiPj4+IiwKICAgICAgICAiPCIsCiAgICAgICAgIj4iLAogICAgICAgICI8PSIsCiAgICAgICAgIj49IiwKICAgICAgICAiPT0iLAogICAgICAgICI9PT0iLAogICAgICAgICIhPSIsCiAgICAgICAgIiE9PSIsCiAgICAgICAgIj8iLAogICAgICAgICI9IiwKICAgICAgICAiKz0iLAogICAgICAgICItPSIsCiAgICAgICAgIi89IiwKICAgICAgICAiKj0iLAogICAgICAgICIlPSIsCiAgICAgICAgIj4+PSIsCiAgICAgICAgIjw8PSIsCiAgICAgICAgIj4+Pj0iLAogICAgICAgICJ8PSIsCiAgICAgICAgIl49IiwKICAgICAgICAiJj0iLAogICAgICAgICImJiIsCiAgICAgICAgInx8IgpdKTsKCnZhciBXSElURVNQQUNFX0NIQVJTID0gYXJyYXlfdG9faGFzaChjaGFyYWN0ZXJzKCIgXHUwMGEwXG5cclx0XGZcdTAwMGJcdTIwMGJcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDAiKSk7Cgp2YXIgUFVOQ19CRUZPUkVfRVhQUkVTU0lPTiA9IGFycmF5X3RvX2hhc2goY2hhcmFjdGVycygiW3soLC47OiIpKTsKCnZhciBQVU5DX0NIQVJTID0gYXJyYXlfdG9faGFzaChjaGFyYWN0ZXJzKCJbXXt9KCksOzoiKSk7Cgp2YXIgUkVHRVhQX01PRElGSUVSUyA9IGFycmF5X3RvX2hhc2goY2hhcmFjdGVycygiZ21zaXkiKSk7CgovKiAtLS0tLVsgVG9rZW5pemVyIF0tLS0tLSAqLwoKdmFyIFVOSUNPREUgPSB7ICAvLyBVbmljb2RlIDYuMQogICAgICAgIGxldHRlcjogbmV3IFJlZ0V4cCgiW1xcdTAwNDEtXFx1MDA1QVxcdTAwNjEtXFx1MDA3QVxcdTAwQUFcXHUwMEI1XFx1MDBCQVxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0OEEtXFx1MDUyN1xcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjIwLVxcdTA2NEFcXHUwNjZFXFx1MDY2RlxcdTA2NzEtXFx1MDZEM1xcdTA2RDVcXHUwNkU1XFx1MDZFNlxcdTA2RUVcXHUwNkVGXFx1MDZGQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTBcXHUwNzEyLVxcdTA3MkZcXHUwNzRELVxcdTA3QTVcXHUwN0IxXFx1MDdDQS1cXHUwN0VBXFx1MDdGNFxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODE1XFx1MDgxQVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhBMFxcdTA4QTItXFx1MDhBQ1xcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTc3XFx1MDk3OS1cXHUwOTdGXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzNcXHUwQzM1LVxcdTBDMzlcXHUwQzNEXFx1MEM1OFxcdTBDNTlcXHUwQzYwXFx1MEM2MVxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ2MFxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y0XFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkYwXFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFDXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlDMS1cXHUxOUM3XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkNDXFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OTdcXHVBNkEwLVxcdUE2RUZcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3OEVcXHVBNzkwLVxcdUE3OTNcXHVBN0EwLVxcdUE3QUFcXHVBN0Y4LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QTkwQS1cXHVBOTI1XFx1QTkzMC1cXHVBOTQ2XFx1QTk2MC1cXHVBOTdDXFx1QTk4NC1cXHVBOUIyXFx1QTlDRlxcdUFBMDAtXFx1QUEyOFxcdUFBNDAtXFx1QUE0MlxcdUFBNDQtXFx1QUE0QlxcdUFBNjAtXFx1QUE3NlxcdUFBN0FcXHVBQTgwLVxcdUFBQUZcXHVBQUIxXFx1QUFCNVxcdUFBQjZcXHVBQUI5LVxcdUFBQkRcXHVBQUMwXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFQVxcdUFBRjItXFx1QUFGNFxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCQzAtXFx1QUJFMlxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMURcXHVGQjFGLVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMjEtXFx1RkYzQVxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ10iKSwKICAgICAgICBjb21iaW5pbmdfbWFyazogbmV3IFJlZ0V4cCgiW1xcdTAzMDAtXFx1MDM2RlxcdTA0ODMtXFx1MDQ4N1xcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA2MTAtXFx1MDYxQVxcdTA2NEItXFx1MDY1RlxcdTA2NzBcXHUwNkQ2LVxcdTA2RENcXHUwNkRGLVxcdTA2RTRcXHUwNkU3XFx1MDZFOFxcdTA2RUEtXFx1MDZFRFxcdTA3MTFcXHUwNzMwLVxcdTA3NEFcXHUwN0E2LVxcdTA3QjBcXHUwN0VCLVxcdTA3RjNcXHUwODE2LVxcdTA4MTlcXHUwODFCLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MkRcXHUwODU5LVxcdTA4NUJcXHUwOEU0LVxcdTA4RkVcXHUwOTAwLVxcdTA5MDNcXHUwOTNBLVxcdTA5M0NcXHUwOTNFLVxcdTA5NEZcXHUwOTUxLVxcdTA5NTdcXHUwOTYyXFx1MDk2M1xcdTA5ODEtXFx1MDk4M1xcdTA5QkNcXHUwOUJFLVxcdTA5QzRcXHUwOUM3XFx1MDlDOFxcdTA5Q0ItXFx1MDlDRFxcdTA5RDdcXHUwOUUyXFx1MDlFM1xcdTBBMDEtXFx1MEEwM1xcdTBBM0NcXHUwQTNFLVxcdTBBNDJcXHUwQTQ3XFx1MEE0OFxcdTBBNEItXFx1MEE0RFxcdTBBNTFcXHUwQTcwXFx1MEE3MVxcdTBBNzVcXHUwQTgxLVxcdTBBODNcXHUwQUJDXFx1MEFCRS1cXHUwQUM1XFx1MEFDNy1cXHUwQUM5XFx1MEFDQi1cXHUwQUNEXFx1MEFFMlxcdTBBRTNcXHUwQjAxLVxcdTBCMDNcXHUwQjNDXFx1MEIzRS1cXHUwQjQ0XFx1MEI0N1xcdTBCNDhcXHUwQjRCLVxcdTBCNERcXHUwQjU2XFx1MEI1N1xcdTBCNjJcXHUwQjYzXFx1MEI4MlxcdTBCQkUtXFx1MEJDMlxcdTBCQzYtXFx1MEJDOFxcdTBCQ0EtXFx1MEJDRFxcdTBCRDdcXHUwQzAxLVxcdTBDMDNcXHUwQzNFLVxcdTBDNDRcXHUwQzQ2LVxcdTBDNDhcXHUwQzRBLVxcdTBDNERcXHUwQzU1XFx1MEM1NlxcdTBDNjJcXHUwQzYzXFx1MEM4MlxcdTBDODNcXHUwQ0JDXFx1MENCRS1cXHUwQ0M0XFx1MENDNi1cXHUwQ0M4XFx1MENDQS1cXHUwQ0NEXFx1MENENVxcdTBDRDZcXHUwQ0UyXFx1MENFM1xcdTBEMDJcXHUwRDAzXFx1MEQzRS1cXHUwRDQ0XFx1MEQ0Ni1cXHUwRDQ4XFx1MEQ0QS1cXHUwRDREXFx1MEQ1N1xcdTBENjJcXHUwRDYzXFx1MEQ4MlxcdTBEODNcXHUwRENBXFx1MERDRi1cXHUwREQ0XFx1MERENlxcdTBERDgtXFx1MERERlxcdTBERjJcXHUwREYzXFx1MEUzMVxcdTBFMzQtXFx1MEUzQVxcdTBFNDctXFx1MEU0RVxcdTBFQjFcXHUwRUI0LVxcdTBFQjlcXHUwRUJCXFx1MEVCQ1xcdTBFQzgtXFx1MEVDRFxcdTBGMThcXHUwRjE5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEYzRVxcdTBGM0ZcXHUwRjcxLVxcdTBGODRcXHUwRjg2XFx1MEY4N1xcdTBGOEQtXFx1MEY5N1xcdTBGOTktXFx1MEZCQ1xcdTBGQzZcXHUxMDJCLVxcdTEwM0VcXHUxMDU2LVxcdTEwNTlcXHUxMDVFLVxcdTEwNjBcXHUxMDYyLVxcdTEwNjRcXHUxMDY3LVxcdTEwNkRcXHUxMDcxLVxcdTEwNzRcXHUxMDgyLVxcdTEwOERcXHUxMDhGXFx1MTA5QS1cXHUxMDlEXFx1MTM1RC1cXHUxMzVGXFx1MTcxMi1cXHUxNzE0XFx1MTczMi1cXHUxNzM0XFx1MTc1MlxcdTE3NTNcXHUxNzcyXFx1MTc3M1xcdTE3QjQtXFx1MTdEM1xcdTE3RERcXHUxODBCLVxcdTE4MERcXHUxOEE5XFx1MTkyMC1cXHUxOTJCXFx1MTkzMC1cXHUxOTNCXFx1MTlCMC1cXHUxOUMwXFx1MTlDOFxcdTE5QzlcXHUxQTE3LVxcdTFBMUJcXHUxQTU1LVxcdTFBNUVcXHUxQTYwLVxcdTFBN0NcXHUxQTdGXFx1MUIwMC1cXHUxQjA0XFx1MUIzNC1cXHUxQjQ0XFx1MUI2Qi1cXHUxQjczXFx1MUI4MC1cXHUxQjgyXFx1MUJBMS1cXHUxQkFEXFx1MUJFNi1cXHUxQkYzXFx1MUMyNC1cXHUxQzM3XFx1MUNEMC1cXHUxQ0QyXFx1MUNENC1cXHUxQ0U4XFx1MUNFRFxcdTFDRjItXFx1MUNGNFxcdTFEQzAtXFx1MURFNlxcdTFERkMtXFx1MURGRlxcdTIwRDAtXFx1MjBEQ1xcdTIwRTFcXHUyMEU1LVxcdTIwRjBcXHUyQ0VGLVxcdTJDRjFcXHUyRDdGXFx1MkRFMC1cXHUyREZGXFx1MzAyQS1cXHUzMDJGXFx1MzA5OVxcdTMwOUFcXHVBNjZGXFx1QTY3NC1cXHVBNjdEXFx1QTY5RlxcdUE2RjBcXHVBNkYxXFx1QTgwMlxcdUE4MDZcXHVBODBCXFx1QTgyMy1cXHVBODI3XFx1QTg4MFxcdUE4ODFcXHVBOEI0LVxcdUE4QzRcXHVBOEUwLVxcdUE4RjFcXHVBOTI2LVxcdUE5MkRcXHVBOTQ3LVxcdUE5NTNcXHVBOTgwLVxcdUE5ODNcXHVBOUIzLVxcdUE5QzBcXHVBQTI5LVxcdUFBMzZcXHVBQTQzXFx1QUE0Q1xcdUFBNERcXHVBQTdCXFx1QUFCMFxcdUFBQjItXFx1QUFCNFxcdUFBQjdcXHVBQUI4XFx1QUFCRVxcdUFBQkZcXHVBQUMxXFx1QUFFQi1cXHVBQUVGXFx1QUFGNVxcdUFBRjZcXHVBQkUzLVxcdUFCRUFcXHVBQkVDXFx1QUJFRFxcdUZCMUVcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMjZdIiksCiAgICAgICAgY29ubmVjdG9yX3B1bmN0dWF0aW9uOiBuZXcgUmVnRXhwKCJbXFx1MDA1RlxcdTIwM0ZcXHUyMDQwXFx1MjA1NFxcdUZFMzNcXHVGRTM0XFx1RkU0RC1cXHVGRTRGXFx1RkYzRl0iKSwKICAgICAgICBkaWdpdDogbmV3IFJlZ0V4cCgiW1xcdTAwMzAtXFx1MDAzOVxcdTA2NjAtXFx1MDY2OVxcdTA2RjAtXFx1MDZGOVxcdTA3QzAtXFx1MDdDOVxcdTA5NjYtXFx1MDk2RlxcdTA5RTYtXFx1MDlFRlxcdTBBNjYtXFx1MEE2RlxcdTBBRTYtXFx1MEFFRlxcdTBCNjYtXFx1MEI2RlxcdTBCRTYtXFx1MEJFRlxcdTBDNjYtXFx1MEM2RlxcdTBDRTYtXFx1MENFRlxcdTBENjYtXFx1MEQ2RlxcdTBFNTAtXFx1MEU1OVxcdTBFRDAtXFx1MEVEOVxcdTBGMjAtXFx1MEYyOVxcdTEwNDAtXFx1MTA0OVxcdTEwOTAtXFx1MTA5OVxcdTE3RTAtXFx1MTdFOVxcdTE4MTAtXFx1MTgxOVxcdTE5NDYtXFx1MTk0RlxcdTE5RDAtXFx1MTlEOVxcdTFBODAtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFCNTAtXFx1MUI1OVxcdTFCQjAtXFx1MUJCOVxcdTFDNDAtXFx1MUM0OVxcdTFDNTAtXFx1MUM1OVxcdUE2MjAtXFx1QTYyOVxcdUE4RDAtXFx1QThEOVxcdUE5MDAtXFx1QTkwOVxcdUE5RDAtXFx1QTlEOVxcdUFBNTAtXFx1QUE1OVxcdUFCRjAtXFx1QUJGOVxcdUZGMTAtXFx1RkYxOV0iKQp9OwoKZnVuY3Rpb24gaXNfbGV0dGVyKGNoKSB7CiAgICAgICAgcmV0dXJuIFVOSUNPREUubGV0dGVyLnRlc3QoY2gpOwp9OwoKZnVuY3Rpb24gaXNfZGlnaXQoY2gpIHsKICAgICAgICBjaCA9IGNoLmNoYXJDb2RlQXQoMCk7CiAgICAgICAgcmV0dXJuIGNoID49IDQ4ICYmIGNoIDw9IDU3Owp9OwoKZnVuY3Rpb24gaXNfdW5pY29kZV9kaWdpdChjaCkgewogICAgICAgIHJldHVybiBVTklDT0RFLmRpZ2l0LnRlc3QoY2gpOwp9CgpmdW5jdGlvbiBpc19hbHBoYW51bWVyaWNfY2hhcihjaCkgewogICAgICAgIHJldHVybiBpc19kaWdpdChjaCkgfHwgaXNfbGV0dGVyKGNoKTsKfTsKCmZ1bmN0aW9uIGlzX3VuaWNvZGVfY29tYmluaW5nX21hcmsoY2gpIHsKICAgICAgICByZXR1cm4gVU5JQ09ERS5jb21iaW5pbmdfbWFyay50ZXN0KGNoKTsKfTsKCmZ1bmN0aW9uIGlzX3VuaWNvZGVfY29ubmVjdG9yX3B1bmN0dWF0aW9uKGNoKSB7CiAgICAgICAgcmV0dXJuIFVOSUNPREUuY29ubmVjdG9yX3B1bmN0dWF0aW9uLnRlc3QoY2gpOwp9OwoKZnVuY3Rpb24gaXNfaWRlbnRpZmllcl9zdGFydChjaCkgewogICAgICAgIHJldHVybiBjaCA9PSAiJCIgfHwgY2ggPT0gIl8iIHx8IGlzX2xldHRlcihjaCk7Cn07CgpmdW5jdGlvbiBpc19pZGVudGlmaWVyX2NoYXIoY2gpIHsKICAgICAgICByZXR1cm4gaXNfaWRlbnRpZmllcl9zdGFydChjaCkKICAgICAgICAgICAgICAgIHx8IGlzX3VuaWNvZGVfY29tYmluaW5nX21hcmsoY2gpCiAgICAgICAgICAgICAgICB8fCBpc191bmljb2RlX2RpZ2l0KGNoKQogICAgICAgICAgICAgICAgfHwgaXNfdW5pY29kZV9jb25uZWN0b3JfcHVuY3R1YXRpb24oY2gpCiAgICAgICAgICAgICAgICB8fCBjaCA9PSAiXHUyMDBjIiAvLyB6ZXJvLXdpZHRoIG5vbi1qb2luZXIgPFpXTko+CiAgICAgICAgICAgICAgICB8fCBjaCA9PSAiXHUyMDBkIiAvLyB6ZXJvLXdpZHRoIGpvaW5lciA8WldKPiAoaW4gbXkgRUNNQS0yNjIgUERGLCB0aGlzIGlzIGFsc28gMjAwYykKICAgICAgICA7Cn07CgpmdW5jdGlvbiBwYXJzZV9qc19udW1iZXIobnVtKSB7CiAgICAgICAgaWYgKFJFX0hFWF9OVU1CRVIudGVzdChudW0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQobnVtLnN1YnN0cigyKSwgMTYpOwogICAgICAgIH0gZWxzZSBpZiAoUkVfT0NUX05VTUJFUi50ZXN0KG51bSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChudW0uc3Vic3RyKDEpLCA4KTsKICAgICAgICB9IGVsc2UgaWYgKFJFX0RFQ19OVU1CRVIudGVzdChudW0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChudW0pOwogICAgICAgIH0KfTsKCmZ1bmN0aW9uIEpTX1BhcnNlX0Vycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbCwgcG9zKSB7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgICAgICB0aGlzLmxpbmUgPSBsaW5lICsgMTsKICAgICAgICB0aGlzLmNvbCA9IGNvbCArIDE7CiAgICAgICAgdGhpcy5wb3MgPSBwb3MgKyAxOwogICAgICAgIHRoaXMuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjazsKfTsKCkpTX1BhcnNlX0Vycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2UgKyAiIChsaW5lOiAiICsgdGhpcy5saW5lICsgIiwgY29sOiAiICsgdGhpcy5jb2wgKyAiLCBwb3M6ICIgKyB0aGlzLnBvcyArICIpIiArICJcblxuIiArIHRoaXMuc3RhY2s7Cn07CgpmdW5jdGlvbiBqc19lcnJvcihtZXNzYWdlLCBsaW5lLCBjb2wsIHBvcykgewogICAgICAgIHRocm93IG5ldyBKU19QYXJzZV9FcnJvcihtZXNzYWdlLCBsaW5lLCBjb2wsIHBvcyk7Cn07CgpmdW5jdGlvbiBpc190b2tlbih0b2tlbiwgdHlwZSwgdmFsKSB7CiAgICAgICAgcmV0dXJuIHRva2VuLnR5cGUgPT0gdHlwZSAmJiAodmFsID09IG51bGwgfHwgdG9rZW4udmFsdWUgPT0gdmFsKTsKfTsKCnZhciBFWF9FT0YgPSB7fTsKCmZ1bmN0aW9uIHRva2VuaXplcigkVEVYVCkgewoKICAgICAgICB2YXIgUyA9IHsKICAgICAgICAgICAgICAgIHRleHQgICAgICAgICAgICA6ICRURVhULnJlcGxhY2UoL1xyXG4/fFtcblx1MjAyOFx1MjAyOV0vZywgIlxuIikucmVwbGFjZSgvXlx1RkVGRi8sICcnKSwKICAgICAgICAgICAgICAgIHBvcyAgICAgICAgICAgICA6IDAsCiAgICAgICAgICAgICAgICB0b2twb3MgICAgICAgICAgOiAwLAogICAgICAgICAgICAgICAgbGluZSAgICAgICAgICAgIDogMCwKICAgICAgICAgICAgICAgIHRva2xpbmUgICAgICAgICA6IDAsCiAgICAgICAgICAgICAgICBjb2wgICAgICAgICAgICAgOiAwLAogICAgICAgICAgICAgICAgdG9rY29sICAgICAgICAgIDogMCwKICAgICAgICAgICAgICAgIG5ld2xpbmVfYmVmb3JlICA6IGZhbHNlLAogICAgICAgICAgICAgICAgcmVnZXhfYWxsb3dlZCAgIDogZmFsc2UsCiAgICAgICAgICAgICAgICBjb21tZW50c19iZWZvcmUgOiBbXQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHBlZWsoKSB7IHJldHVybiBTLnRleHQuY2hhckF0KFMucG9zKTsgfTsKCiAgICAgICAgZnVuY3Rpb24gbmV4dChzaWduYWxfZW9mLCBpbl9zdHJpbmcpIHsKICAgICAgICAgICAgICAgIHZhciBjaCA9IFMudGV4dC5jaGFyQXQoUy5wb3MrKyk7CiAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX2VvZiAmJiAhY2gpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVYX0VPRjsKICAgICAgICAgICAgICAgIGlmIChjaCA9PSAiXG4iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFMubmV3bGluZV9iZWZvcmUgPSBTLm5ld2xpbmVfYmVmb3JlIHx8ICFpbl9zdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICsrUy5saW5lOwogICAgICAgICAgICAgICAgICAgICAgICBTLmNvbCA9IDA7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICArK1MuY29sOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGNoOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGVvZigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhUy5wZWVrKCk7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gZmluZCh3aGF0LCBzaWduYWxfZW9mKSB7CiAgICAgICAgICAgICAgICB2YXIgcG9zID0gUy50ZXh0LmluZGV4T2Yod2hhdCwgUy5wb3MpOwogICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9lb2YgJiYgcG9zID09IC0xKSB0aHJvdyBFWF9FT0Y7CiAgICAgICAgICAgICAgICByZXR1cm4gcG9zOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHN0YXJ0X3Rva2VuKCkgewogICAgICAgICAgICAgICAgUy50b2tsaW5lID0gUy5saW5lOwogICAgICAgICAgICAgICAgUy50b2tjb2wgPSBTLmNvbDsKICAgICAgICAgICAgICAgIFMudG9rcG9zID0gUy5wb3M7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gdG9rZW4odHlwZSwgdmFsdWUsIGlzX2NvbW1lbnQpIHsKICAgICAgICAgICAgICAgIFMucmVnZXhfYWxsb3dlZCA9ICgodHlwZSA9PSAib3BlcmF0b3IiICYmICFIT1AoVU5BUllfUE9TVEZJWCwgdmFsdWUpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09ICJrZXl3b3JkIiAmJiBIT1AoS0VZV09SRFNfQkVGT1JFX0VYUFJFU1NJT04sIHZhbHVlKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSAicHVuYyIgJiYgSE9QKFBVTkNfQkVGT1JFX0VYUFJFU1NJT04sIHZhbHVlKSkpOwogICAgICAgICAgICAgICAgdmFyIHJldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAgIDogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgIDogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgICA6IFMudG9rbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sICAgIDogUy50b2tjb2wsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAgICA6IFMudG9rcG9zLAogICAgICAgICAgICAgICAgICAgICAgICBlbmRwb3MgOiBTLnBvcywKICAgICAgICAgICAgICAgICAgICAgICAgbmxiICAgIDogUy5uZXdsaW5lX2JlZm9yZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICghaXNfY29tbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXQuY29tbWVudHNfYmVmb3JlID0gUy5jb21tZW50c19iZWZvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgIFMuY29tbWVudHNfYmVmb3JlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugbm90ZSBvZiBhbnkgbmV3bGluZXMgaW4gdGhlIGNvbW1lbnRzIHRoYXQgY2FtZSBiZWZvcmUKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJldC5jb21tZW50c19iZWZvcmUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQubmxiID0gcmV0Lm5sYiB8fCByZXQuY29tbWVudHNfYmVmb3JlW2ldLm5sYjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgUy5uZXdsaW5lX2JlZm9yZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBza2lwX3doaXRlc3BhY2UoKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoSE9QKFdISVRFU1BBQ0VfQ0hBUlMsIHBlZWsoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiByZWFkX3doaWxlKHByZWQpIHsKICAgICAgICAgICAgICAgIHZhciByZXQgPSAiIiwgY2ggPSBwZWVrKCksIGkgPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKGNoICYmIHByZWQoY2gsIGkrKykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBwZWVrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHBhcnNlX2Vycm9yKGVycikgewogICAgICAgICAgICAgICAganNfZXJyb3IoZXJyLCBTLnRva2xpbmUsIFMudG9rY29sLCBTLnRva3Bvcyk7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gcmVhZF9udW0ocHJlZml4KSB7CiAgICAgICAgICAgICAgICB2YXIgaGFzX2UgPSBmYWxzZSwgYWZ0ZXJfZSA9IGZhbHNlLCBoYXNfeCA9IGZhbHNlLCBoYXNfZG90ID0gcHJlZml4ID09ICIuIjsKICAgICAgICAgICAgICAgIHZhciBudW0gPSByZWFkX3doaWxlKGZ1bmN0aW9uKGNoLCBpKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICJ4IiB8fCBjaCA9PSAiWCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzX3gpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzX3ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzX3ggJiYgKGNoID09ICJFIiB8fCBjaCA9PSAiZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc19lKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc19lID0gYWZ0ZXJfZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlcl9lIHx8IChpID09IDAgJiYgIXByZWZpeCkpIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gIisiKSByZXR1cm4gYWZ0ZXJfZTsKICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJfZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gIi4iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNfZG90ICYmICFoYXNfeCAmJiAhaGFzX2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzX2RvdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc19hbHBoYW51bWVyaWNfY2hhcihjaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChwcmVmaXgpCiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHByZWZpeCArIG51bTsKICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHBhcnNlX2pzX251bWJlcihudW0pOwogICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWxpZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuKCJudW0iLCB2YWxpZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9lcnJvcigiSW52YWxpZCBzeW50YXg6ICIgKyBudW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHJlYWRfZXNjYXBlZF9jaGFyKGluX3N0cmluZykgewogICAgICAgICAgICAgICAgdmFyIGNoID0gbmV4dCh0cnVlLCBpbl9zdHJpbmcpOwogICAgICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgIm4iIDogcmV0dXJuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiciIgOiByZXR1cm4gIlxyIjsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ0IiA6IHJldHVybiAiXHQiOwogICAgICAgICAgICAgICAgICAgIGNhc2UgImIiIDogcmV0dXJuICJcYiI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAidiIgOiByZXR1cm4gIlx1MDAwYiI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZiIgOiByZXR1cm4gIlxmIjsKICAgICAgICAgICAgICAgICAgICBjYXNlICIwIiA6IHJldHVybiAiXDAiOwogICAgICAgICAgICAgICAgICAgIGNhc2UgIngiIDogcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoaGV4X2J5dGVzKDIpKTsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ1IiA6IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleF9ieXRlcyg0KSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiXG4iOiByZXR1cm4gIiI7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCAgOiByZXR1cm4gY2g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gaGV4X2J5dGVzKG4pIHsKICAgICAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICAgICAgZm9yICg7IG4gPiAwOyAtLW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpZ2l0ID0gcGFyc2VJbnQobmV4dCh0cnVlKSwgMTYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZGlnaXQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCJJbnZhbGlkIGhleC1jaGFyYWN0ZXIgcGF0dGVybiBpbiBzdHJpbmciKTsKICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gKG51bSA8PCA0KSB8IGRpZ2l0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiByZWFkX3N0cmluZygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aXRoX2VvZl9lcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdW90ZSA9IG5leHQoKSwgcmV0ID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBuZXh0KHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAiXFwiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkIE9jdGFsRXNjYXBlU2VxdWVuY2UgKFhYWDogZGVwcmVjYXRlZCBpZiAic3RyaWN0IG1vZGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pc2hvby9VZ2xpZnlKUy9pc3N1ZXMvMTc4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2N0YWxfbGVuID0gMCwgZmlyc3QgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSByZWFkX3doaWxlKGZ1bmN0aW9uKGNoKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49ICIwIiAmJiBjaCA8PSAiNyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICsrb2N0YWxfbGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaXJzdCA8PSAiMyIgJiYgb2N0YWxfbGVuIDw9IDIpIHJldHVybiArK29jdGFsX2xlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaXJzdCA+PSAiNCIgJiYgb2N0YWxfbGVuIDw9IDEpIHJldHVybiArK29jdGFsX2xlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvY3RhbF9sZW4gPiAwKSBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoY2gsIDgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgY2ggPSByZWFkX2VzY2FwZWRfY2hhcih0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gcXVvdGUpIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBjaDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4oInN0cmluZyIsIHJldCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiByZWFkX2xpbmVfY29tbWVudCgpIHsKICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgIHZhciBpID0gZmluZCgiXG4iKSwgcmV0OwogICAgICAgICAgICAgICAgaWYgKGkgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gUy50ZXh0LnN1YnN0cihTLnBvcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIFMucG9zID0gUy50ZXh0Lmxlbmd0aDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IFMudGV4dC5zdWJzdHJpbmcoUy5wb3MsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICBTLnBvcyA9IGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4oImNvbW1lbnQxIiwgcmV0LCB0cnVlKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiByZWFkX211bHRpbGluZV9jb21tZW50KCkgewogICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhfZW9mX2Vycm9yKCJVbnRlcm1pbmF0ZWQgbXVsdGlsaW5lIGNvbW1lbnQiLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGZpbmQoIiovIiwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gUy50ZXh0LnN1YnN0cmluZyhTLnBvcywgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFMucG9zID0gaSArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIFMubGluZSArPSB0ZXh0LnNwbGl0KCJcbiIpLmxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIFMubmV3bGluZV9iZWZvcmUgPSBTLm5ld2xpbmVfYmVmb3JlIHx8IHRleHQuaW5kZXhPZigiXG4iKSA+PSAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pc2hvby9VZ2xpZnlKUy9pc3N1ZXMvI2lzc3VlLzEwMAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoL15AY2Nfb24vaS50ZXN0KHRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybigiV0FSTklORzogYXQgbGluZSAiICsgUy5saW5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCIqKiogRm91bmQgXCJjb25kaXRpb25hbCBjb21tZW50XCI6ICIgKyB0ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuKCIqKiogVWdsaWZ5SlMgRElTQ0FSRFMgQUxMIENPTU1FTlRTLiAgVGhpcyBtZWFucyB5b3VyIGNvZGUgbWlnaHQgbm8gbG9uZ2VyIHdvcmsgcHJvcGVybHkgaW4gSW50ZXJuZXQgRXhwbG9yZXIuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbigiY29tbWVudDIiLCB0ZXh0LCB0cnVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHJlYWRfbmFtZSgpIHsKICAgICAgICAgICAgICAgIHZhciBiYWNrc2xhc2ggPSBmYWxzZSwgbmFtZSA9ICIiLCBjaCwgZXNjYXBlZCA9IGZhbHNlLCBoZXg7CiAgICAgICAgICAgICAgICB3aGlsZSAoKGNoID0gcGVlaygpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmFja3NsYXNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICJcXCIpIGVzY2FwZWQgPSBiYWNrc2xhc2ggPSB0cnVlLCBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNfaWRlbnRpZmllcl9jaGFyKGNoKSkgbmFtZSArPSBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gInUiKSBwYXJzZV9lcnJvcigiRXhwZWN0aW5nIFVuaWNvZGVFc2NhcGVTZXF1ZW5jZSAtLSB1WFhYWCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gcmVhZF9lc2NhcGVkX2NoYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2lkZW50aWZpZXJfY2hhcihjaCkpIHBhcnNlX2Vycm9yKCJVbmljb2RlIGNoYXI6ICIgKyBjaC5jaGFyQ29kZUF0KDApICsgIiBpcyBub3QgdmFsaWQgaW4gaWRlbnRpZmllciIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gY2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3NsYXNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChIT1AoS0VZV09SRFMsIG5hbWUpICYmIGVzY2FwZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGV4ID0gbmFtZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlxcdSIgKyAiMDAwMCIuc3Vic3RyKGhleC5sZW5ndGgpICsgaGV4ICsgbmFtZS5zbGljZSgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHJlYWRfcmVnZXhwKHJlZ2V4cCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhfZW9mX2Vycm9yKCJVbnRlcm1pbmF0ZWQgcmVndWxhciBleHByZXNzaW9uIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZfYmFja3NsYXNoID0gZmFsc2UsIGNoLCBpbl9jbGFzcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNoID0gbmV4dCh0cnVlKSkpIGlmIChwcmV2X2JhY2tzbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cCArPSAiXFwiICsgY2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9iYWNrc2xhc2ggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiWyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9jbGFzcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwICs9IGNoOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICJdIiAmJiBpbl9jbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2NsYXNzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwICs9IGNoOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIvIiAmJiAhaW5fY2xhc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiXFwiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9iYWNrc2xhc2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cCArPSBjaDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kcyA9IHJlYWRfbmFtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4oInJlZ2V4cCIsIFsgcmVnZXhwLCBtb2RzIF0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gcmVhZF9vcGVyYXRvcihwcmVmaXgpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdyb3cob3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZWVrKCkpIHJldHVybiBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJpZ2dlciA9IG9wICsgcGVlaygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoSE9QKE9QRVJBVE9SUywgYmlnZ2VyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdyhiaWdnZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbigib3BlcmF0b3IiLCBncm93KHByZWZpeCB8fCBuZXh0KCkpKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBoYW5kbGVfc2xhc2goKSB7CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB2YXIgcmVnZXhfYWxsb3dlZCA9IFMucmVnZXhfYWxsb3dlZDsKICAgICAgICAgICAgICAgIHN3aXRjaCAocGVlaygpKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiLyI6CiAgICAgICAgICAgICAgICAgICAgICAgIFMuY29tbWVudHNfYmVmb3JlLnB1c2gocmVhZF9saW5lX2NvbW1lbnQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFMucmVnZXhfYWxsb3dlZCA9IHJlZ2V4X2FsbG93ZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0X3Rva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiKiI6CiAgICAgICAgICAgICAgICAgICAgICAgIFMuY29tbWVudHNfYmVmb3JlLnB1c2gocmVhZF9tdWx0aWxpbmVfY29tbWVudCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgUy5yZWdleF9hbGxvd2VkID0gcmVnZXhfYWxsb3dlZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRfdG9rZW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBTLnJlZ2V4X2FsbG93ZWQgPyByZWFkX3JlZ2V4cCgiIikgOiByZWFkX29wZXJhdG9yKCIvIik7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gaGFuZGxlX2RvdCgpIHsKICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgIHJldHVybiBpc19kaWdpdChwZWVrKCkpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVhZF9udW0oIi4iKQogICAgICAgICAgICAgICAgICAgICAgICA6IHRva2VuKCJwdW5jIiwgIi4iKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiByZWFkX3dvcmQoKSB7CiAgICAgICAgICAgICAgICB2YXIgd29yZCA9IHJlYWRfbmFtZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICFIT1AoS0VZV09SRFMsIHdvcmQpCiAgICAgICAgICAgICAgICAgICAgICAgID8gdG9rZW4oIm5hbWUiLCB3b3JkKQogICAgICAgICAgICAgICAgICAgICAgICA6IEhPUChPUEVSQVRPUlMsIHdvcmQpCiAgICAgICAgICAgICAgICAgICAgICAgID8gdG9rZW4oIm9wZXJhdG9yIiwgd29yZCkKICAgICAgICAgICAgICAgICAgICAgICAgOiBIT1AoS0VZV09SRFNfQVRPTSwgd29yZCkKICAgICAgICAgICAgICAgICAgICAgICAgPyB0b2tlbigiYXRvbSIsIHdvcmQpCiAgICAgICAgICAgICAgICAgICAgICAgIDogdG9rZW4oImtleXdvcmQiLCB3b3JkKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiB3aXRoX2VvZl9lcnJvcihlb2ZfZXJyb3IsIGNvbnQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250KCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleCA9PT0gRVhfRU9GKSBwYXJzZV9lcnJvcihlb2ZfZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRocm93IGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG5leHRfdG9rZW4oZm9yY2VfcmVnZXhwKSB7CiAgICAgICAgICAgICAgICBpZiAoZm9yY2VfcmVnZXhwICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkX3JlZ2V4cChmb3JjZV9yZWdleHApOwogICAgICAgICAgICAgICAgc2tpcF93aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICBzdGFydF90b2tlbigpOwogICAgICAgICAgICAgICAgdmFyIGNoID0gcGVlaygpOwogICAgICAgICAgICAgICAgaWYgKCFjaCkgcmV0dXJuIHRva2VuKCJlb2YiKTsKICAgICAgICAgICAgICAgIGlmIChpc19kaWdpdChjaCkpIHJldHVybiByZWFkX251bSgpOwogICAgICAgICAgICAgICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHJldHVybiByZWFkX3N0cmluZygpOwogICAgICAgICAgICAgICAgaWYgKEhPUChQVU5DX0NIQVJTLCBjaCkpIHJldHVybiB0b2tlbigicHVuYyIsIG5leHQoKSk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPT0gIi4iKSByZXR1cm4gaGFuZGxlX2RvdCgpOwogICAgICAgICAgICAgICAgaWYgKGNoID09ICIvIikgcmV0dXJuIGhhbmRsZV9zbGFzaCgpOwogICAgICAgICAgICAgICAgaWYgKEhPUChPUEVSQVRPUl9DSEFSUywgY2gpKSByZXR1cm4gcmVhZF9vcGVyYXRvcigpOwogICAgICAgICAgICAgICAgaWYgKGNoID09ICJcXCIgfHwgaXNfaWRlbnRpZmllcl9zdGFydChjaCkpIHJldHVybiByZWFkX3dvcmQoKTsKICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCJVbmV4cGVjdGVkIGNoYXJhY3RlciAnIiArIGNoICsgIiciKTsKICAgICAgICB9OwoKICAgICAgICBuZXh0X3Rva2VuLmNvbnRleHQgPSBmdW5jdGlvbihuYykgewogICAgICAgICAgICAgICAgaWYgKG5jKSBTID0gbmM7CiAgICAgICAgICAgICAgICByZXR1cm4gUzsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gbmV4dF90b2tlbjsKCn07CgovKiAtLS0tLVsgUGFyc2VyIChjb25zdGFudHMpIF0tLS0tLSAqLwoKdmFyIFVOQVJZX1BSRUZJWCA9IGFycmF5X3RvX2hhc2goWwogICAgICAgICJ0eXBlb2YiLAogICAgICAgICJ2b2lkIiwKICAgICAgICAiZGVsZXRlIiwKICAgICAgICAiLS0iLAogICAgICAgICIrKyIsCiAgICAgICAgIiEiLAogICAgICAgICJ+IiwKICAgICAgICAiLSIsCiAgICAgICAgIisiCl0pOwoKdmFyIFVOQVJZX1BPU1RGSVggPSBhcnJheV90b19oYXNoKFsgIi0tIiwgIisrIiBdKTsKCnZhciBBU1NJR05NRU5UID0gKGZ1bmN0aW9uKGEsIHJldCwgaSl7CiAgICAgICAgd2hpbGUgKGkgPCBhLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0W2FbaV1dID0gYVtpXS5zdWJzdHIoMCwgYVtpXS5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKfSkoCiAgICAgICAgWyIrPSIsICItPSIsICIvPSIsICIqPSIsICIlPSIsICI+Pj0iLCAiPDw9IiwgIj4+Pj0iLCAifD0iLCAiXj0iLCAiJj0iXSwKICAgICAgICB7ICI9IjogdHJ1ZSB9LAogICAgICAgIDAKKTsKCnZhciBQUkVDRURFTkNFID0gKGZ1bmN0aW9uKGEsIHJldCl7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSAxOyBpIDwgYS5sZW5ndGg7ICsraSwgKytuKSB7CiAgICAgICAgICAgICAgICB2YXIgYiA9IGFbaV07CiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGIubGVuZ3RoOyArK2opIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0W2Jbal1dID0gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKfSkoCiAgICAgICAgWwogICAgICAgICAgICAgICAgWyJ8fCJdLAogICAgICAgICAgICAgICAgWyImJiJdLAogICAgICAgICAgICAgICAgWyJ8Il0sCiAgICAgICAgICAgICAgICBbIl4iXSwKICAgICAgICAgICAgICAgIFsiJiJdLAogICAgICAgICAgICAgICAgWyI9PSIsICI9PT0iLCAiIT0iLCAiIT09Il0sCiAgICAgICAgICAgICAgICBbIjwiLCAiPiIsICI8PSIsICI+PSIsICJpbiIsICJpbnN0YW5jZW9mIl0sCiAgICAgICAgICAgICAgICBbIj4+IiwgIjw8IiwgIj4+PiJdLAogICAgICAgICAgICAgICAgWyIrIiwgIi0iXSwKICAgICAgICAgICAgICAgIFsiKiIsICIvIiwgIiUiXQogICAgICAgIF0sCiAgICAgICAge30KKTsKCnZhciBTVEFURU1FTlRTX1dJVEhfTEFCRUxTID0gYXJyYXlfdG9faGFzaChbICJmb3IiLCAiZG8iLCAid2hpbGUiLCAic3dpdGNoIiBdKTsKCnZhciBBVE9NSUNfU1RBUlRfVE9LRU4gPSBhcnJheV90b19oYXNoKFsgImF0b20iLCAibnVtIiwgInN0cmluZyIsICJyZWdleHAiLCAibmFtZSIgXSk7CgovKiAtLS0tLVsgUGFyc2VyIF0tLS0tLSAqLwoKZnVuY3Rpb24gTm9kZVdpdGhUb2tlbihzdHIsIHN0YXJ0LCBlbmQpIHsKICAgICAgICB0aGlzLm5hbWUgPSBzdHI7CiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OwogICAgICAgIHRoaXMuZW5kID0gZW5kOwp9OwoKTm9kZVdpdGhUb2tlbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubmFtZTsgfTsKCmZ1bmN0aW9uIHBhcnNlKCRURVhULCBleGlnZW50X21vZGUsIGVtYmVkX3Rva2VucykgewoKICAgICAgICB2YXIgUyA9IHsKICAgICAgICAgICAgICAgIGlucHV0ICAgICAgICAgOiB0eXBlb2YgJFRFWFQgPT0gInN0cmluZyIgPyB0b2tlbml6ZXIoJFRFWFQsIHRydWUpIDogJFRFWFQsCiAgICAgICAgICAgICAgICB0b2tlbiAgICAgICAgIDogbnVsbCwKICAgICAgICAgICAgICAgIHByZXYgICAgICAgICAgOiBudWxsLAogICAgICAgICAgICAgICAgcGVla2VkICAgICAgICA6IG51bGwsCiAgICAgICAgICAgICAgICBpbl9mdW5jdGlvbiAgIDogMCwKICAgICAgICAgICAgICAgIGluX2RpcmVjdGl2ZXMgOiB0cnVlLAogICAgICAgICAgICAgICAgaW5fbG9vcCAgICAgICA6IDAsCiAgICAgICAgICAgICAgICBsYWJlbHMgICAgICAgIDogW10KICAgICAgICB9OwoKICAgICAgICBTLnRva2VuID0gbmV4dCgpOwoKICAgICAgICBmdW5jdGlvbiBpcyh0eXBlLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlzX3Rva2VuKFMudG9rZW4sIHR5cGUsIHZhbHVlKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBwZWVrKCkgeyByZXR1cm4gUy5wZWVrZWQgfHwgKFMucGVla2VkID0gUy5pbnB1dCgpKTsgfTsKCiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICAgICAgICAgIFMucHJldiA9IFMudG9rZW47CiAgICAgICAgICAgICAgICBpZiAoUy5wZWVrZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgUy50b2tlbiA9IFMucGVla2VkOwogICAgICAgICAgICAgICAgICAgICAgICBTLnBlZWtlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBTLnRva2VuID0gUy5pbnB1dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgUy5pbl9kaXJlY3RpdmVzID0gUy5pbl9kaXJlY3RpdmVzICYmICgKICAgICAgICAgICAgICAgICAgICAgICAgUy50b2tlbi50eXBlID09ICJzdHJpbmciIHx8IGlzKCJwdW5jIiwgIjsiKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiBTLnRva2VuOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHByZXYoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUy5wcmV2OwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGNyb2FrKG1zZywgbGluZSwgY29sLCBwb3MpIHsKICAgICAgICAgICAgICAgIHZhciBjdHggPSBTLmlucHV0LmNvbnRleHQoKTsKICAgICAgICAgICAgICAgIGpzX2Vycm9yKG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgIT0gbnVsbCA/IGxpbmUgOiBjdHgudG9rbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCAhPSBudWxsID8gY29sIDogY3R4LnRva2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAhPSBudWxsID8gcG9zIDogY3R4LnRva3Bvcyk7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gdG9rZW5fZXJyb3IodG9rZW4sIG1zZykgewogICAgICAgICAgICAgICAgY3JvYWsobXNnLCB0b2tlbi5saW5lLCB0b2tlbi5jb2wpOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHVuZXhwZWN0ZWQodG9rZW4pIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IFMudG9rZW47CiAgICAgICAgICAgICAgICB0b2tlbl9lcnJvcih0b2tlbiwgIlVuZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tlbi50eXBlICsgIiAoIiArIHRva2VuLnZhbHVlICsgIikiKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBleHBlY3RfdG9rZW4odHlwZSwgdmFsKSB7CiAgICAgICAgICAgICAgICBpZiAoaXModHlwZSwgdmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdG9rZW5fZXJyb3IoUy50b2tlbiwgIlVuZXhwZWN0ZWQgdG9rZW4gIiArIFMudG9rZW4udHlwZSArICIsIGV4cGVjdGVkICIgKyB0eXBlKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBleHBlY3QocHVuYykgeyByZXR1cm4gZXhwZWN0X3Rva2VuKCJwdW5jIiwgcHVuYyk7IH07CgogICAgICAgIGZ1bmN0aW9uIGNhbl9pbnNlcnRfc2VtaWNvbG9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICFleGlnZW50X21vZGUgJiYgKAogICAgICAgICAgICAgICAgICAgICAgICBTLnRva2VuLm5sYiB8fCBpcygiZW9mIikgfHwgaXMoInB1bmMiLCAifSIpCiAgICAgICAgICAgICAgICApOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHNlbWljb2xvbigpIHsKICAgICAgICAgICAgICAgIGlmIChpcygicHVuYyIsICI7IikpIG5leHQoKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjYW5faW5zZXJ0X3NlbWljb2xvbigpKSB1bmV4cGVjdGVkKCk7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gYXMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2xpY2UoYXJndW1lbnRzKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBwYXJlbnRoZXNpc2VkKCkgewogICAgICAgICAgICAgICAgZXhwZWN0KCIoIik7CiAgICAgICAgICAgICAgICB2YXIgZXggPSBleHByZXNzaW9uKCk7CiAgICAgICAgICAgICAgICBleHBlY3QoIikiKTsKICAgICAgICAgICAgICAgIHJldHVybiBleDsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBhZGRfdG9rZW5zKHN0ciwgc3RhcnQsIGVuZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0ciBpbnN0YW5jZW9mIE5vZGVXaXRoVG9rZW4gPyBzdHIgOiBuZXcgTm9kZVdpdGhUb2tlbihzdHIsIHN0YXJ0LCBlbmQpOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG1heWJlX2VtYmVkX3Rva2VucyhwYXJzZXIpIHsKICAgICAgICAgICAgICAgIGlmIChlbWJlZF90b2tlbnMpIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gUy50b2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzdCA9IHBhcnNlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICBhc3RbMF0gPSBhZGRfdG9rZW5zKGFzdFswXSwgc3RhcnQsIHByZXYoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhc3Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gcGFyc2VyOwogICAgICAgIH07CgogICAgICAgIHZhciBzdGF0ZW1lbnQgPSBtYXliZV9lbWJlZF90b2tlbnMoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoaXMoIm9wZXJhdG9yIiwgIi8iKSB8fCBpcygib3BlcmF0b3IiLCAiLz0iKSkgewogICAgICAgICAgICAgICAgICAgICAgICBTLnBlZWtlZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIFMudG9rZW4gPSBTLmlucHV0KFMudG9rZW4udmFsdWUuc3Vic3RyKDEpKTsgLy8gZm9yY2UgcmVnZXhwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKFMudG9rZW4udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXIgPSBTLmluX2RpcmVjdGl2ZXMsIHN0YXQgPSBzaW1wbGVfc3RhdGVtZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgJiYgc3RhdFsxXVswXSA9PSAic3RyaW5nIiAmJiAhaXMoInB1bmMiLCAiLCIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzKCJkaXJlY3RpdmUiLCBzdGF0WzFdWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAibnVtIjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJyZWdleHAiOgogICAgICAgICAgICAgICAgICAgIGNhc2UgIm9wZXJhdG9yIjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJhdG9tIjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbXBsZV9zdGF0ZW1lbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAibmFtZSI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc190b2tlbihwZWVrKCksICJwdW5jIiwgIjoiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbGFiZWxlZF9zdGF0ZW1lbnQocHJvZzEoUy50b2tlbi52YWx1ZSwgbmV4dCwgbmV4dCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzaW1wbGVfc3RhdGVtZW50KCk7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgInB1bmMiOgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKFMudG9rZW4udmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInsiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcygiYmxvY2siLCBibG9ja18oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJbIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIigiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1wbGVfc3RhdGVtZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICI7IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzKCJibG9jayIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2FzZSAia2V5d29yZCI6CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvZzEoUy50b2tlbi52YWx1ZSwgbmV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImJyZWFrIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJlYWtfY29udCgiYnJlYWsiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjb250aW51ZSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyZWFrX2NvbnQoImNvbnRpbnVlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZGVidWdnZXIiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWljb2xvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcygiZGVidWdnZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJkbyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmdW5jdGlvbihib2R5KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF90b2tlbigia2V5d29yZCIsICJ3aGlsZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzKCJkbyIsIHByb2cxKHBhcmVudGhlc2lzZWQsIHNlbWljb2xvbiksIGJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKGluX2xvb3Aoc3RhdGVtZW50KSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZm9yIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9yXygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25fKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImlmIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWZfKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicmV0dXJuIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUy5pbl9mdW5jdGlvbiA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIidyZXR1cm4nIG91dHNpZGUgb2YgZnVuY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXMoInJldHVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzKCJwdW5jIiwgIjsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChuZXh0KCksIG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuX2luc2VydF9zZW1pY29sb24oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwcm9nMShleHByZXNzaW9uLCBzZW1pY29sb24pKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJzd2l0Y2giOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcygic3dpdGNoIiwgcGFyZW50aGVzaXNlZCgpLCBzd2l0Y2hfYmxvY2tfKCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInRocm93IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUy50b2tlbi5ubGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiSWxsZWdhbCBuZXdsaW5lIGFmdGVyICd0aHJvdyciKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXMoInRocm93IiwgcHJvZzEoZXhwcmVzc2lvbiwgc2VtaWNvbG9uKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAidHJ5IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ5XygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInZhciI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2cxKHZhcl8sIHNlbWljb2xvbik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiY29uc3QiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9nMShjb25zdF8sIHNlbWljb2xvbik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAid2hpbGUiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcygid2hpbGUiLCBwYXJlbnRoZXNpc2VkKCksIGluX2xvb3Aoc3RhdGVtZW50KSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAid2l0aCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzKCJ3aXRoIiwgcGFyZW50aGVzaXNlZCgpLCBzdGF0ZW1lbnQoKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gbGFiZWxlZF9zdGF0ZW1lbnQobGFiZWwpIHsKICAgICAgICAgICAgICAgIFMubGFiZWxzLnB1c2gobGFiZWwpOwogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gUy50b2tlbiwgc3RhdCA9IHN0YXRlbWVudCgpOwogICAgICAgICAgICAgICAgaWYgKGV4aWdlbnRfbW9kZSAmJiAhSE9QKFNUQVRFTUVOVFNfV0lUSF9MQUJFTFMsIHN0YXRbMF0pKQogICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkKHN0YXJ0KTsKICAgICAgICAgICAgICAgIFMubGFiZWxzLnBvcCgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGFzKCJsYWJlbCIsIGxhYmVsLCBzdGF0KTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBzaW1wbGVfc3RhdGVtZW50KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFzKCJzdGF0IiwgcHJvZzEoZXhwcmVzc2lvbiwgc2VtaWNvbG9uKSk7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gYnJlYWtfY29udCh0eXBlKSB7CiAgICAgICAgICAgICAgICB2YXIgbmFtZTsKICAgICAgICAgICAgICAgIGlmICghY2FuX2luc2VydF9zZW1pY29sb24oKSkgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaXMoIm5hbWUiKSA/IFMudG9rZW4udmFsdWUgOiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWVtYmVyKG5hbWUsIFMubGFiZWxzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiTGFiZWwgIiArIG5hbWUgKyAiIHdpdGhvdXQgbWF0Y2hpbmcgbG9vcCBvciBzdGF0ZW1lbnQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKFMuaW5fbG9vcCA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICBjcm9hayh0eXBlICsgIiBub3QgaW5zaWRlIGEgbG9vcCBvciBzd2l0Y2giKTsKICAgICAgICAgICAgICAgIHNlbWljb2xvbigpOwogICAgICAgICAgICAgICAgcmV0dXJuIGFzKHR5cGUsIG5hbWUpOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGZvcl8oKSB7CiAgICAgICAgICAgICAgICBleHBlY3QoIigiKTsKICAgICAgICAgICAgICAgIHZhciBpbml0ID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmICghaXMoInB1bmMiLCAiOyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBpcygia2V5d29yZCIsICJ2YXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG5leHQoKSwgdmFyXyh0cnVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGV4cHJlc3Npb24odHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcygib3BlcmF0b3IiLCAiaW4iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbml0WzBdID09ICJ2YXIiICYmIGluaXRbMV0ubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb2FrKCJPbmx5IG9uZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhbGxvd2VkIGluIGZvci4uaW4gbG9vcCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JfaW4oaW5pdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWd1bGFyX2Zvcihpbml0KTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiByZWd1bGFyX2Zvcihpbml0KSB7CiAgICAgICAgICAgICAgICBleHBlY3QoIjsiKTsKICAgICAgICAgICAgICAgIHZhciB0ZXN0ID0gaXMoInB1bmMiLCAiOyIpID8gbnVsbCA6IGV4cHJlc3Npb24oKTsKICAgICAgICAgICAgICAgIGV4cGVjdCgiOyIpOwogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBpcygicHVuYyIsICIpIikgPyBudWxsIDogZXhwcmVzc2lvbigpOwogICAgICAgICAgICAgICAgZXhwZWN0KCIpIik7CiAgICAgICAgICAgICAgICByZXR1cm4gYXMoImZvciIsIGluaXQsIHRlc3QsIHN0ZXAsIGluX2xvb3Aoc3RhdGVtZW50KSk7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gZm9yX2luKGluaXQpIHsKICAgICAgICAgICAgICAgIHZhciBsaHMgPSBpbml0WzBdID09ICJ2YXIiID8gYXMoIm5hbWUiLCBpbml0WzFdWzBdKSA6IGluaXQ7CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB2YXIgb2JqID0gZXhwcmVzc2lvbigpOwogICAgICAgICAgICAgICAgZXhwZWN0KCIpIik7CiAgICAgICAgICAgICAgICByZXR1cm4gYXMoImZvci1pbiIsIGluaXQsIGxocywgb2JqLCBpbl9sb29wKHN0YXRlbWVudCkpOwogICAgICAgIH07CgogICAgICAgIHZhciBmdW5jdGlvbl8gPSBmdW5jdGlvbihpbl9zdGF0ZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuYW1lID0gaXMoIm5hbWUiKSA/IHByb2cxKFMudG9rZW4udmFsdWUsIG5leHQpIDogbnVsbDsKICAgICAgICAgICAgICAgIGlmIChpbl9zdGF0ZW1lbnQgJiYgIW5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQoKTsKICAgICAgICAgICAgICAgIGV4cGVjdCgiKCIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGFzKGluX3N0YXRlbWVudCA/ICJkZWZ1biIgOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJndW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKGZpcnN0LCBhKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghaXMoInB1bmMiLCAiKSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgZmlyc3QgPSBmYWxzZTsgZWxzZSBleHBlY3QoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpcygibmFtZSIpKSB1bmV4cGVjdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaChTLnRva2VuLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkodHJ1ZSwgW10pLAogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvZHkKICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrUy5pbl9mdW5jdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb29wID0gUy5pbl9sb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5pbl9kaXJlY3RpdmVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuaW5fbG9vcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGJsb2NrXygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1TLmluX2Z1bmN0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5pbl9sb29wID0gbG9vcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCkpOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGlmXygpIHsKICAgICAgICAgICAgICAgIHZhciBjb25kID0gcGFyZW50aGVzaXNlZCgpLCBib2R5ID0gc3RhdGVtZW50KCksIGJlbHNlOwogICAgICAgICAgICAgICAgaWYgKGlzKCJrZXl3b3JkIiwgImVsc2UiKSkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlbHNlID0gc3RhdGVtZW50KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gYXMoImlmIiwgY29uZCwgYm9keSwgYmVsc2UpOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGJsb2NrXygpIHsKICAgICAgICAgICAgICAgIGV4cGVjdCgieyIpOwogICAgICAgICAgICAgICAgdmFyIGEgPSBbXTsKICAgICAgICAgICAgICAgIHdoaWxlICghaXMoInB1bmMiLCAifSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcygiZW9mIikpIHVuZXhwZWN0ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHN0YXRlbWVudCgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH07CgogICAgICAgIHZhciBzd2l0Y2hfYmxvY2tfID0gY3VycnkoaW5fbG9vcCwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGV4cGVjdCgieyIpOwogICAgICAgICAgICAgICAgdmFyIGEgPSBbXSwgY3VyID0gbnVsbDsKICAgICAgICAgICAgICAgIHdoaWxlICghaXMoInB1bmMiLCAifSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcygiZW9mIikpIHVuZXhwZWN0ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzKCJrZXl3b3JkIiwgImNhc2UiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goWyBleHByZXNzaW9uKCksIGN1ciBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoIjoiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpcygia2V5d29yZCIsICJkZWZhdWx0IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCI6Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKFsgbnVsbCwgY3VyIF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyKSB1bmV4cGVjdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2goc3RhdGVtZW50KCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gdHJ5XygpIHsKICAgICAgICAgICAgICAgIHZhciBib2R5ID0gYmxvY2tfKCksIGJjYXRjaCwgYmZpbmFsbHk7CiAgICAgICAgICAgICAgICBpZiAoaXMoImtleXdvcmQiLCAiY2F0Y2giKSkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdCgiKCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzKCJuYW1lIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIk5hbWUgZXhwZWN0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBTLnRva2VuLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdCgiKSIpOwogICAgICAgICAgICAgICAgICAgICAgICBiY2F0Y2ggPSBbIG5hbWUsIGJsb2NrXygpIF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXMoImtleXdvcmQiLCAiZmluYWxseSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYmZpbmFsbHkgPSBibG9ja18oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghYmNhdGNoICYmICFiZmluYWxseSkKICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIk1pc3NpbmcgY2F0Y2gvZmluYWxseSBibG9ja3MiKTsKICAgICAgICAgICAgICAgIHJldHVybiBhcygidHJ5IiwgYm9keSwgYmNhdGNoLCBiZmluYWxseSk7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gdmFyZGVmcyhub19pbikgewogICAgICAgICAgICAgICAgdmFyIGEgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpcygibmFtZSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBTLnRva2VuLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcygib3BlcmF0b3IiLCAiPSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaChbIG5hbWUsIGV4cHJlc3Npb24oZmFsc2UsIG5vX2luKSBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goWyBuYW1lIF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXMoInB1bmMiLCAiLCIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiB2YXJfKG5vX2luKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXMoInZhciIsIHZhcmRlZnMobm9faW4pKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjb25zdF8oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXMoImNvbnN0IiwgdmFyZGVmcygpKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBuZXdfKCkgewogICAgICAgICAgICAgICAgdmFyIG5ld2V4cCA9IGV4cHJfYXRvbShmYWxzZSksIGFyZ3M7CiAgICAgICAgICAgICAgICBpZiAoaXMoInB1bmMiLCAiKCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGV4cHJfbGlzdCgiKSIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdHMoYXMoIm5ldyIsIG5ld2V4cCwgYXJncyksIHRydWUpOwogICAgICAgIH07CgogICAgICAgIHZhciBleHByX2F0b20gPSBtYXliZV9lbWJlZF90b2tlbnMoZnVuY3Rpb24oYWxsb3dfY2FsbHMpIHsKICAgICAgICAgICAgICAgIGlmIChpcygib3BlcmF0b3IiLCAibmV3IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3XygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlzKCJwdW5jIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChTLnRva2VuLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIoIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdHMocHJvZzEoZXhwcmVzc2lvbiwgY3VycnkoZXhwZWN0LCAiKSIpKSwgYWxsb3dfY2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiWyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzY3JpcHRzKGFycmF5XygpLCBhbGxvd19jYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ7IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdHMob2JqZWN0XygpLCBhbGxvd19jYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlzKCJrZXl3b3JkIiwgImZ1bmN0aW9uIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0cyhmdW5jdGlvbl8oZmFsc2UpLCBhbGxvd19jYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoSE9QKEFUT01JQ19TVEFSVF9UT0tFTiwgUy50b2tlbi50eXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXRvbSA9IFMudG9rZW4udHlwZSA9PSAicmVnZXhwIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXMoInJlZ2V4cCIsIFMudG9rZW4udmFsdWVbMF0sIFMudG9rZW4udmFsdWVbMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhcyhTLnRva2VuLnR5cGUsIFMudG9rZW4udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0cyhwcm9nMShhdG9tLCBuZXh0KSwgYWxsb3dfY2FsbHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdW5leHBlY3RlZCgpOwogICAgICAgIH0pOwoKICAgICAgICBmdW5jdGlvbiBleHByX2xpc3QoY2xvc2luZywgYWxsb3dfdHJhaWxpbmdfY29tbWEsIGFsbG93X2VtcHR5KSB7CiAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlLCBhID0gW107CiAgICAgICAgICAgICAgICB3aGlsZSAoIWlzKCJwdW5jIiwgY2xvc2luZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSBmaXJzdCA9IGZhbHNlOyBlbHNlIGV4cGVjdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dfdHJhaWxpbmdfY29tbWEgJiYgaXMoInB1bmMiLCBjbG9zaW5nKSkgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcygicHVuYyIsICIsIikgJiYgYWxsb3dfZW1wdHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goWyAiYXRvbSIsICJ1bmRlZmluZWQiIF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaChleHByZXNzaW9uKGZhbHNlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGFycmF5XygpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcygiYXJyYXkiLCBleHByX2xpc3QoIl0iLCAhZXhpZ2VudF9tb2RlLCB0cnVlKSk7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gb2JqZWN0XygpIHsKICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWUsIGEgPSBbXTsKICAgICAgICAgICAgICAgIHdoaWxlICghaXMoInB1bmMiLCAifSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgZmlyc3QgPSBmYWxzZTsgZWxzZSBleHBlY3QoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlnZW50X21vZGUgJiYgaXMoInB1bmMiLCAifSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IHRyYWlsaW5nIGNvbW1hCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gUy50b2tlbi50eXBlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGFzX3Byb3BlcnR5X25hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gIm5hbWUiICYmIChuYW1lID09ICJnZXQiIHx8IG5hbWUgPT0gInNldCIpICYmICFpcygicHVuYyIsICI6IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goWyBhc19uYW1lKCksIGZ1bmN0aW9uXyhmYWxzZSksIG5hbWUgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCI6Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKFsgbmFtZSwgZXhwcmVzc2lvbihmYWxzZSkgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgWyEhXSBMaW5lIG5vdCBpbiBvcmlnaW5hbCBwYXJzZS1qcywKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkZWQgdG8gYmUgYWJsZSB0byB3YXJuIGFib3V0IHVucXVvdGVkCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleXdvcmQgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICBhW2EubGVuZ3RoIC0gMV0udHlwZSA9IHR5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gYXMoIm9iamVjdCIsIGEpOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGFzX3Byb3BlcnR5X25hbWUoKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKFMudG9rZW4udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgIm51bSI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2cxKFMudG9rZW4udmFsdWUsIG5leHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGFzX25hbWUoKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBhc19uYW1lKCkgewogICAgICAgICAgICAgICAgc3dpdGNoIChTLnRva2VuLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJuYW1lIjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJvcGVyYXRvciI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAia2V5d29yZCI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXRvbSI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9nMShTLnRva2VuLnZhbHVlLCBuZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gc3Vic2NyaXB0cyhleHByLCBhbGxvd19jYWxscykgewogICAgICAgICAgICAgICAgaWYgKGlzKCJwdW5jIiwgIi4iKSkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzY3JpcHRzKGFzKCJkb3QiLCBleHByLCBhc19uYW1lKCkpLCBhbGxvd19jYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXMoInB1bmMiLCAiWyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdHMoYXMoInN1YiIsIGV4cHIsIHByb2cxKGV4cHJlc3Npb24sIGN1cnJ5KGV4cGVjdCwgIl0iKSkpLCBhbGxvd19jYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYWxsb3dfY2FsbHMgJiYgaXMoInB1bmMiLCAiKCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdHMoYXMoImNhbGwiLCBleHByLCBleHByX2xpc3QoIikiKSksIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGV4cHI7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gbWF5YmVfdW5hcnkoYWxsb3dfY2FsbHMpIHsKICAgICAgICAgICAgICAgIGlmIChpcygib3BlcmF0b3IiKSAmJiBIT1AoVU5BUllfUFJFRklYLCBTLnRva2VuLnZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZV91bmFyeSgidW5hcnktcHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZzEoUy50b2tlbi52YWx1ZSwgbmV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlX3VuYXJ5KGFsbG93X2NhbGxzKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gZXhwcl9hdG9tKGFsbG93X2NhbGxzKTsKICAgICAgICAgICAgICAgIHdoaWxlIChpcygib3BlcmF0b3IiKSAmJiBIT1AoVU5BUllfUE9TVEZJWCwgUy50b2tlbi52YWx1ZSkgJiYgIVMudG9rZW4ubmxiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IG1ha2VfdW5hcnkoInVuYXJ5LXBvc3RmaXgiLCBTLnRva2VuLnZhbHVlLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG1ha2VfdW5hcnkodGFnLCBvcCwgZXhwcikgewogICAgICAgICAgICAgICAgaWYgKChvcCA9PSAiKysiIHx8IG9wID09ICItLSIpICYmICFpc19hc3NpZ25hYmxlKGV4cHIpKQogICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiSW52YWxpZCB1c2Ugb2YgIiArIG9wICsgIiBvcGVyYXRvciIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGFzKHRhZywgb3AsIGV4cHIpOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGV4cHJfb3AobGVmdCwgbWluX3ByZWMsIG5vX2luKSB7CiAgICAgICAgICAgICAgICB2YXIgb3AgPSBpcygib3BlcmF0b3IiKSA/IFMudG9rZW4udmFsdWUgOiBudWxsOwogICAgICAgICAgICAgICAgaWYgKG9wICYmIG9wID09ICJpbiIgJiYgbm9faW4pIG9wID0gbnVsbDsKICAgICAgICAgICAgICAgIHZhciBwcmVjID0gb3AgIT0gbnVsbCA/IFBSRUNFREVOQ0Vbb3BdIDogbnVsbDsKICAgICAgICAgICAgICAgIGlmIChwcmVjICE9IG51bGwgJiYgcHJlYyA+IG1pbl9wcmVjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gZXhwcl9vcChtYXliZV91bmFyeSh0cnVlKSwgcHJlYywgbm9faW4pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwcl9vcChhcygiYmluYXJ5Iiwgb3AsIGxlZnQsIHJpZ2h0KSwgbWluX3ByZWMsIG5vX2luKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0OwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGV4cHJfb3BzKG5vX2luKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZXhwcl9vcChtYXliZV91bmFyeSh0cnVlKSwgMCwgbm9faW4pOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG1heWJlX2NvbmRpdGlvbmFsKG5vX2luKSB7CiAgICAgICAgICAgICAgICB2YXIgZXhwciA9IGV4cHJfb3BzKG5vX2luKTsKICAgICAgICAgICAgICAgIGlmIChpcygib3BlcmF0b3IiLCAiPyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHllcyA9IGV4cHJlc3Npb24oZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoIjoiKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzKCJjb25kaXRpb25hbCIsIGV4cHIsIHllcywgZXhwcmVzc2lvbihmYWxzZSwgbm9faW4pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBleHByOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGlzX2Fzc2lnbmFibGUoZXhwcikgewogICAgICAgICAgICAgICAgaWYgKCFleGlnZW50X21vZGUpIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgc3dpdGNoIChleHByWzBdKyIiKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZG90IjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJzdWIiOgogICAgICAgICAgICAgICAgICAgIGNhc2UgIm5ldyI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2FsbCI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgIm5hbWUiOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwclsxXSAhPSAidGhpcyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gbWF5YmVfYXNzaWduKG5vX2luKSB7CiAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IG1heWJlX2NvbmRpdGlvbmFsKG5vX2luKSwgdmFsID0gUy50b2tlbi52YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChpcygib3BlcmF0b3IiKSAmJiBIT1AoQVNTSUdOTUVOVCwgdmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXNzaWduYWJsZShsZWZ0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXMoImFzc2lnbiIsIEFTU0lHTk1FTlRbdmFsXSwgbGVmdCwgbWF5YmVfYXNzaWduKG5vX2luKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIkludmFsaWQgYXNzaWdubWVudCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQ7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBtYXliZV9lbWJlZF90b2tlbnMoZnVuY3Rpb24oY29tbWFzLCBub19pbikgewogICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHZhciBleHByID0gbWF5YmVfYXNzaWduKG5vX2luKTsKICAgICAgICAgICAgICAgIGlmIChjb21tYXMgJiYgaXMoInB1bmMiLCAiLCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzKCJzZXEiLCBleHByLCBleHByZXNzaW9uKHRydWUsIG5vX2luKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZXhwcjsKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gaW5fbG9vcChjb250KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICArK1MuaW5fbG9vcDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnQoKTsKICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC0tUy5pbl9sb29wOwogICAgICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHJldHVybiBhcygidG9wbGV2ZWwiLCAoZnVuY3Rpb24oYSl7CiAgICAgICAgICAgICAgICB3aGlsZSAoIWlzKCJlb2YiKSkKICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHN0YXRlbWVudCgpKTsKICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH0pKFtdKSk7Cgp9OwoKLyogLS0tLS1bIFV0aWxpdGllcyBdLS0tLS0gKi8KCmZ1bmN0aW9uIGN1cnJ5KGYpIHsKICAgICAgICB2YXIgYXJncyA9IHNsaWNlKGFyZ3VtZW50cywgMSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdChzbGljZShhcmd1bWVudHMpKSk7IH07Cn07CgpmdW5jdGlvbiBwcm9nMShyZXQpIHsKICAgICAgICBpZiAocmV0IGluc3RhbmNlb2YgRnVuY3Rpb24pCiAgICAgICAgICAgICAgICByZXQgPSByZXQoKTsKICAgICAgICBmb3IgKHZhciBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IC0tbiA+IDA7ICsraSkKICAgICAgICAgICAgICAgIGFyZ3VtZW50c1tpXSgpOwogICAgICAgIHJldHVybiByZXQ7Cn07CgpmdW5jdGlvbiBhcnJheV90b19oYXNoKGEpIHsKICAgICAgICB2YXIgcmV0ID0ge307CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKQogICAgICAgICAgICAgICAgcmV0W2FbaV1dID0gdHJ1ZTsKICAgICAgICByZXR1cm4gcmV0Owp9OwoKZnVuY3Rpb24gc2xpY2UoYSwgc3RhcnQpIHsKICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwgc3RhcnQgfHwgMCk7Cn07CgpmdW5jdGlvbiBjaGFyYWN0ZXJzKHN0cikgewogICAgICAgIHJldHVybiBzdHIuc3BsaXQoIiIpOwp9OwoKZnVuY3Rpb24gbWVtYmVyKG5hbWUsIGFycmF5KSB7CiAgICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aDsgLS1pID49IDA7KQogICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09IG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKfTsKCmZ1bmN0aW9uIEhPUChvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7Cn07Cgp2YXIgd2FybiA9IGZ1bmN0aW9uKCkge307CgovKiAtLS0tLVsgRXhwb3J0cyBdLS0tLS0gKi8KCmV4cG9ydHMudG9rZW5pemVyID0gdG9rZW5pemVyOwpleHBvcnRzLnBhcnNlID0gcGFyc2U7CmV4cG9ydHMuc2xpY2UgPSBzbGljZTsKZXhwb3J0cy5jdXJyeSA9IGN1cnJ5OwpleHBvcnRzLm1lbWJlciA9IG1lbWJlcjsKZXhwb3J0cy5hcnJheV90b19oYXNoID0gYXJyYXlfdG9faGFzaDsKZXhwb3J0cy5QUkVDRURFTkNFID0gUFJFQ0VERU5DRTsKZXhwb3J0cy5LRVlXT1JEU19BVE9NID0gS0VZV09SRFNfQVRPTTsKZXhwb3J0cy5SRVNFUlZFRF9XT1JEUyA9IFJFU0VSVkVEX1dPUkRTOwpleHBvcnRzLktFWVdPUkRTID0gS0VZV09SRFM7CmV4cG9ydHMuQVRPTUlDX1NUQVJUX1RPS0VOID0gQVRPTUlDX1NUQVJUX1RPS0VOOwpleHBvcnRzLk9QRVJBVE9SUyA9IE9QRVJBVE9SUzsKZXhwb3J0cy5pc19hbHBoYW51bWVyaWNfY2hhciA9IGlzX2FscGhhbnVtZXJpY19jaGFyOwpleHBvcnRzLmlzX2lkZW50aWZpZXJfc3RhcnQgPSBpc19pZGVudGlmaWVyX3N0YXJ0OwpleHBvcnRzLmlzX2lkZW50aWZpZXJfY2hhciA9IGlzX2lkZW50aWZpZXJfY2hhcjsKZXhwb3J0cy5zZXRfbG9nZ2VyID0gZnVuY3Rpb24obG9nZ2VyKSB7CiAgICAgICAgd2FybiA9IGxvZ2dlcjsKfTsKCi8vIExvY2FsIHZhcmlhYmxlczoKLy8ganMtaW5kZW50LWxldmVsOiA4Ci8vIEVuZDoK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/lint/walk.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQVNUIHdhbGtlciBtb2R1bGUgZm9yIE1vemlsbGEgUGFyc2VyIEFQSSBjb21wYXRpYmxlIHRyZWVzCgooZnVuY3Rpb24oZXhwb3J0cykgewogICJ1c2Ugc3RyaWN0IjsKCiAgLy8gQSBzaW1wbGUgd2FsayBpcyBvbmUgd2hlcmUgeW91IHNpbXBseSBzcGVjaWZ5IGNhbGxiYWNrcyB0byBiZQogIC8vIGNhbGxlZCBvbiBzcGVjaWZpYyBub2Rlcy4gVGhlIGxhc3QgdHdvIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuIEEKICAvLyBzaW1wbGUgdXNlIHdvdWxkIGJlCiAgLy8KICAvLyAgICAgd2Fsay5zaW1wbGUobXlUcmVlLCB7CiAgLy8gICAgICAgICBFeHByZXNzaW9uOiBmdW5jdGlvbihub2RlKSB7IC4uLiB9CiAgLy8gICAgIH0pOwogIC8vCiAgLy8gdG8gZG8gc29tZXRoaW5nIHdpdGggYWxsIGV4cHJlc3Npb25zLiBBbGwgUGFyc2VyIEFQSSBub2RlIHR5cGVzCiAgLy8gY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgbm9kZSB0eXBlcywgYXMgd2VsbCBhcyBFeHByZXNzaW9uLAogIC8vIFN0YXRlbWVudCwgYW5kIFNjb3BlQm9keSwgd2hpY2ggZGVub3RlIGNhdGVnb3JpZXMgb2Ygbm9kZXMuCiAgLy8KICAvLyBUaGUgYmFzZSBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBwYXNzIGEgY3VzdG9tIChyZWN1cnNpdmUpCiAgLy8gd2Fsa2VyLCBhbmQgc3RhdGUgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGlzIHdhbGtlZCBhbiBpbml0aWFsCiAgLy8gc3RhdGUuCiAgZXhwb3J0cy5zaW1wbGUgPSBmdW5jdGlvbihub2RlLCB2aXNpdG9ycywgYmFzZSwgc3RhdGUpIHsKICAgIGlmICghYmFzZSkgYmFzZSA9IGV4cG9ydHM7CiAgICBmdW5jdGlvbiBjKG5vZGUsIHN0LCBvdmVycmlkZSkgewogICAgICB2YXIgdHlwZSA9IG92ZXJyaWRlIHx8IG5vZGUudHlwZSwgZm91bmQgPSB2aXNpdG9yc1t0eXBlXTsKICAgICAgaWYgKGZvdW5kKSBmb3VuZChub2RlLCBzdCk7CiAgICAgIGJhc2VbdHlwZV0obm9kZSwgc3QsIGMpOwogICAgfQogICAgYyhub2RlLCBzdGF0ZSk7CiAgfTsKCiAgLy8gQSByZWN1cnNpdmUgd2FsayBpcyBvbmUgd2hlcmUgeW91ciBmdW5jdGlvbnMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQKICAvLyB3YWxrZXJzLiBUaGV5IGNhbiBtb2RpZnkgYW5kIHJlcGxhY2UgdGhlIHN0YXRlIHBhcmFtZXRlciB0aGF0J3MKICAvLyB0aHJlYWRlZCB0aHJvdWdoIHRoZSB3YWxrLCBhbmQgY2FuIG9wdCBob3cgYW5kIHdoZXRoZXIgdG8gd2FsawogIC8vIHRoZWlyIGNoaWxkIG5vZGVzIChieSBjYWxsaW5nIHRoZWlyIHRoaXJkIGFyZ3VtZW50IG9uIHRoZXNlCiAgLy8gbm9kZXMpLgogIGV4cG9ydHMucmVjdXJzaXZlID0gZnVuY3Rpb24obm9kZSwgc3RhdGUsIGZ1bmNzLCBiYXNlKSB7CiAgICB2YXIgdmlzaXRvciA9IGV4cG9ydHMubWFrZShmdW5jcywgYmFzZSk7CiAgICBmdW5jdGlvbiBjKG5vZGUsIHN0LCBvdmVycmlkZSkgewogICAgICB2aXNpdG9yW292ZXJyaWRlIHx8IG5vZGUudHlwZV0obm9kZSwgc3QsIGMpOwogICAgfQogICAgYyhub2RlLCBzdGF0ZSk7CiAgfTsKCiAgLy8gVXNlZCB0byBjcmVhdGUgYSBjdXN0b20gd2Fsa2VyLiBXaWxsIGZpbGwgaW4gYWxsIG1pc3Npbmcgbm9kZQogIC8vIHR5cGUgcHJvcGVydGllcyB3aXRoIHRoZSBkZWZhdWx0cy4KICBleHBvcnRzLm1ha2UgPSBmdW5jdGlvbihmdW5jcywgYmFzZSkgewogICAgaWYgKCFiYXNlKSBiYXNlID0gZXhwb3J0czsKICAgIHZhciB2aXNpdG9yID0ge307CiAgICBmb3IgKHZhciB0eXBlIGluIGJhc2UpCiAgICAgIHZpc2l0b3JbdHlwZV0gPSBmdW5jcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSA/IGZ1bmNzW3R5cGVdIDogYmFzZVt0eXBlXTsKICAgIHJldHVybiB2aXNpdG9yOwogIH07CgogIGZ1bmN0aW9uIHNraXBUaHJvdWdoKG5vZGUsIHN0LCBjKSB7IGMobm9kZSwgc3QpOyB9CiAgZnVuY3Rpb24gaWdub3JlKG5vZGUsIHN0LCBjKSB7fQoKICAvLyBOb2RlIHdhbGtlcnMuCgogIGV4cG9ydHMuUHJvZ3JhbSA9IGV4cG9ydHMuQmxvY2tTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmJvZHkubGVuZ3RoOyArK2kpCiAgICAgIGMobm9kZS5ib2R5W2ldLCBzdCwgIlN0YXRlbWVudCIpOwogIH07CiAgZXhwb3J0cy5TdGF0ZW1lbnQgPSBza2lwVGhyb3VnaDsKICBleHBvcnRzLkVtcHR5U3RhdGVtZW50ID0gaWdub3JlOwogIGV4cG9ydHMuRXhwcmVzc2lvblN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUuZXhwcmVzc2lvbiwgc3QsICJFeHByZXNzaW9uIik7CiAgfTsKICBleHBvcnRzLklmU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS50ZXN0LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGMobm9kZS5jb25zZXF1ZW50LCBzdCwgIlN0YXRlbWVudCIpOwogICAgaWYgKG5vZGUuYWx0ZXJuYXRlKSBjKG5vZGUuYWx0ZXJuYXRlLCBzdCwgIlN0YXRlbWVudCIpOwogIH07CiAgZXhwb3J0cy5MYWJlbGVkU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS5ib2R5LCBzdCwgIlN0YXRlbWVudCIpOwogIH07CiAgZXhwb3J0cy5CcmVha1N0YXRlbWVudCA9IGV4cG9ydHMuQ29udGludWVTdGF0ZW1lbnQgPSBpZ25vcmU7CiAgZXhwb3J0cy5XaXRoU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS5vYmplY3QsIHN0LCAiRXhwcmVzc2lvbiIpOwogICAgYyhub2RlLmJvZHksIHN0LCAiU3RhdGVtZW50Iik7CiAgfTsKICBleHBvcnRzLlN3aXRjaFN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUuZGlzY3JpbWluYW50LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jYXNlcy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgY3MgPSBub2RlLmNhc2VzW2ldOwogICAgICBpZiAoY3MudGVzdCkgYyhjcy50ZXN0LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjcy5jb25zZXF1ZW50Lmxlbmd0aDsgKytqKQogICAgICAgIGMoY3MuY29uc2VxdWVudFtqXSwgc3QsICJTdGF0ZW1lbnQiKTsKICAgIH0KICB9OwogIGV4cG9ydHMuUmV0dXJuU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGlmIChub2RlLmFyZ3VtZW50KSBjKG5vZGUuYXJndW1lbnQsIHN0LCAiRXhwcmVzc2lvbiIpOwogIH07CiAgZXhwb3J0cy5UaHJvd1N0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUuYXJndW1lbnQsIHN0LCAiRXhwcmVzc2lvbiIpOwogIH07CiAgZXhwb3J0cy5UcnlTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLmJsb2NrLCBzdCwgIlN0YXRlbWVudCIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmhhbmRsZXJzLmxlbmd0aDsgKytpKQogICAgICBjKG5vZGUuaGFuZGxlcnNbaV0uYm9keSwgc3QsICJTY29wZUJvZHkiKTsKICAgIGlmIChub2RlLmZpbmFsaXplcikgYyhub2RlLmZpbmFsaXplciwgc3QsICJTdGF0ZW1lbnQiKTsKICB9OwogIGV4cG9ydHMuV2hpbGVTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLnRlc3QsIHN0LCAiRXhwcmVzc2lvbiIpOwogICAgYyhub2RlLmJvZHksIHN0LCAiU3RhdGVtZW50Iik7CiAgfTsKICBleHBvcnRzLkRvV2hpbGVTdGF0ZW1lbnQgPSBleHBvcnRzLldoaWxlU3RhdGVtZW50OwogIGV4cG9ydHMuRm9yU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGlmIChub2RlLmluaXQpIGMobm9kZS5pbml0LCBzdCwgIkZvckluaXQiKTsKICAgIGlmIChub2RlLnRlc3QpIGMobm9kZS50ZXN0LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGlmIChub2RlLnVwZGF0ZSkgYyhub2RlLnVwZGF0ZSwgc3QsICJFeHByZXNzaW9uIik7CiAgICBjKG5vZGUuYm9keSwgc3QsICJTdGF0ZW1lbnQiKTsKICB9OwogIGV4cG9ydHMuRm9ySW5TdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLmxlZnQsIHN0LCAiRm9ySW5pdCIpOwogICAgYyhub2RlLnJpZ2h0LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGMobm9kZS5ib2R5LCBzdCwgIlN0YXRlbWVudCIpOwogIH07CiAgZXhwb3J0cy5Gb3JJbml0ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGlmIChub2RlLnR5cGUgPT0gIlZhcmlhYmxlRGVjbGFyYXRpb24iKSBjKG5vZGUsIHN0KTsKICAgIGVsc2UgYyhub2RlLCBzdCwgIkV4cHJlc3Npb24iKTsKICB9OwogIGV4cG9ydHMuRGVidWdnZXJTdGF0ZW1lbnQgPSBpZ25vcmU7CgogIGV4cG9ydHMuRnVuY3Rpb25EZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUsIHN0LCAiRnVuY3Rpb24iKTsKICB9OwogIGV4cG9ydHMuVmFyaWFibGVEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuZGVjbGFyYXRpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBkZWNsID0gbm9kZS5kZWNsYXJhdGlvbnNbaV07CiAgICAgIGlmIChkZWNsLmluaXQpIGMoZGVjbC5pbml0LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIH0KICB9OwoKICBleHBvcnRzLkZ1bmN0aW9uID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS5ib2R5LCBzdCwgIlNjb3BlQm9keSIpOwogIH07CiAgZXhwb3J0cy5TY29wZUJvZHkgPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLCBzdCwgIlN0YXRlbWVudCIpOwogIH07CgogIGV4cG9ydHMuRXhwcmVzc2lvbiA9IHNraXBUaHJvdWdoOwogIGV4cG9ydHMuVGhpc0V4cHJlc3Npb24gPSBpZ25vcmU7CiAgZXhwb3J0cy5BcnJheUV4cHJlc3Npb24gPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmVsZW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBlbHQgPSBub2RlLmVsZW1lbnRzW2ldOwogICAgICBpZiAoZWx0KSBjKGVsdCwgc3QsICJFeHByZXNzaW9uIik7CiAgICB9CiAgfTsKICBleHBvcnRzLk9iamVjdEV4cHJlc3Npb24gPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLnByb3BlcnRpZXMubGVuZ3RoOyArK2kpCiAgICAgIGMobm9kZS5wcm9wZXJ0aWVzW2ldLnZhbHVlLCBzdCwgIkV4cHJlc3Npb24iKTsKICB9OwogIGV4cG9ydHMuRnVuY3Rpb25FeHByZXNzaW9uID0gZXhwb3J0cy5GdW5jdGlvbkRlY2xhcmF0aW9uOwogIGV4cG9ydHMuU2VxdWVuY2VFeHByZXNzaW9uID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5leHByZXNzaW9ucy5sZW5ndGg7ICsraSkKICAgICAgYyhub2RlLmV4cHJlc3Npb25zW2ldLCBzdCwgIkV4cHJlc3Npb24iKTsKICB9OwogIGV4cG9ydHMuVW5hcnlFeHByZXNzaW9uID0gZXhwb3J0cy5VcGRhdGVFeHByZXNzaW9uID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS5hcmd1bWVudCwgc3QsICJFeHByZXNzaW9uIik7CiAgfTsKICBleHBvcnRzLkJpbmFyeUV4cHJlc3Npb24gPSBleHBvcnRzLkFzc2lnbm1lbnRFeHByZXNzaW9uID0gZXhwb3J0cy5Mb2dpY2FsRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUubGVmdCwgc3QsICJFeHByZXNzaW9uIik7CiAgICBjKG5vZGUucmlnaHQsIHN0LCAiRXhwcmVzc2lvbiIpOwogIH07CiAgZXhwb3J0cy5Db25kaXRpb25hbEV4cHJlc3Npb24gPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLnRlc3QsIHN0LCAiRXhwcmVzc2lvbiIpOwogICAgYyhub2RlLmNvbnNlcXVlbnQsIHN0LCAiRXhwcmVzc2lvbiIpOwogICAgYyhub2RlLmFsdGVybmF0ZSwgc3QsICJFeHByZXNzaW9uIik7CiAgfTsKICBleHBvcnRzLk5ld0V4cHJlc3Npb24gPSBleHBvcnRzLkNhbGxFeHByZXNzaW9uID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS5jYWxsZWUsIHN0LCAiRXhwcmVzc2lvbiIpOwogICAgaWYgKG5vZGUuYXJndW1lbnRzKSBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuYXJndW1lbnRzLmxlbmd0aDsgKytpKQogICAgICBjKG5vZGUuYXJndW1lbnRzW2ldLCBzdCwgIkV4cHJlc3Npb24iKTsKICB9OwogIGV4cG9ydHMuTWVtYmVyRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUub2JqZWN0LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGlmIChub2RlLmNvbXB1dGVkKSBjKG5vZGUucHJvcGVydHksIHN0LCAiRXhwcmVzc2lvbiIpOwogIH07CiAgZXhwb3J0cy5JZGVudGlmaWVyID0gZXhwb3J0cy5MaXRlcmFsID0gaWdub3JlOwoKICAvLyBBIGN1c3RvbSB3YWxrZXIgdGhhdCBrZWVwcyB0cmFjayBvZiB0aGUgc2NvcGUgY2hhaW4gYW5kIHRoZQogIC8vIHZhcmlhYmxlcyBkZWZpbmVkIGluIGl0LgogIGZ1bmN0aW9uIG1ha2VTY29wZShwcmV2KSB7CiAgICByZXR1cm4ge3ZhcnM6IE9iamVjdC5jcmVhdGUobnVsbCksIHByZXY6IHByZXZ9OwogIH0KICBleHBvcnRzLnNjb3BlVmlzaXRvciA9IGV4cG9ydHMubWFrZSh7CiAgICBGdW5jdGlvbjogZnVuY3Rpb24obm9kZSwgc2NvcGUsIGMpIHsKICAgICAgdmFyIGlubmVyID0gbWFrZVNjb3BlKHNjb3BlKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLnBhcmFtcy5sZW5ndGg7ICsraSkKICAgICAgICBpbm5lci52YXJzW25vZGUucGFyYW1zW2ldLm5hbWVdID0ge3R5cGU6ICJhcmd1bWVudCIsIG5vZGU6IG5vZGUucGFyYW1zW2ldfTsKICAgICAgaWYgKG5vZGUuaWQpIHsKICAgICAgICB2YXIgZGVjbCA9IG5vZGUudHlwZSA9PSAiRnVuY3Rpb25EZWNsYXJhdGlvbiI7CiAgICAgICAgKGRlY2wgPyBzY29wZSA6IGlubmVyKS52YXJzW25vZGUuaWQubmFtZV0gPQogICAgICAgICAge3R5cGU6IGRlY2wgPyAiZnVuY3Rpb24iIDogImZ1bmN0aW9uIG5hbWUiLCBub2RlOiBub2RlLmlkfTsKICAgICAgfQogICAgICBjKG5vZGUuYm9keSwgaW5uZXIsICJTY29wZUJvZHkiKTsKICAgIH0sCiAgICBUcnlTdGF0ZW1lbnQ6IGZ1bmN0aW9uKG5vZGUsIHNjb3BlLCBjKSB7CiAgICAgIGMobm9kZS5ibG9jaywgc2NvcGUsICJTdGF0ZW1lbnQiKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmhhbmRsZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGhhbmRsZXIgPSBub2RlLmhhbmRsZXJzW2ldLCBpbm5lciA9IG1ha2VTY29wZShzY29wZSk7CiAgICAgICAgaW5uZXIudmFyc1toYW5kbGVyLnBhcmFtLm5hbWVdID0ge3R5cGU6ICJjYXRjaCBjbGF1c2UiLCBub2RlOiBoYW5kbGVyLnBhcmFtfTsKICAgICAgICBjKGhhbmRsZXIuYm9keSwgaW5uZXIsICJTY29wZUJvZHkiKTsKICAgICAgfQogICAgICBpZiAobm9kZS5maW5hbGl6ZXIpIGMobm9kZS5maW5hbGl6ZXIsIHNjb3BlLCAiU3RhdGVtZW50Iik7CiAgICB9LAogICAgVmFyaWFibGVEZWNsYXJhdGlvbjogZnVuY3Rpb24obm9kZSwgc2NvcGUsIGMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmRlY2xhcmF0aW9ucy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBkZWNsID0gbm9kZS5kZWNsYXJhdGlvbnNbaV07CiAgICAgICAgc2NvcGUudmFyc1tkZWNsLmlkLm5hbWVdID0ge3R5cGU6ICJ2YXIiLCBub2RlOiBkZWNsLmlkfTsKICAgICAgICBpZiAoZGVjbC5pbml0KSBjKGRlY2wuaW5pdCwgc2NvcGUsICJFeHByZXNzaW9uIik7CiAgICAgIH0KICAgIH0KICB9KTsKCn0pKHR5cGVvZiBleHBvcnRzID09ICJ1bmRlZmluZWQiID8gYWNvcm4ud2FsayA9IHt9IDogZXhwb3J0cyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/mode_test.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Lm10LW91dHB1dCAubXQtdG9rZW4gewogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CiAgd2hpdGUtc3BhY2U6IHByZTsKICBmb250LWZhbWlseTogIkNvbnNvbGFzIiwgbW9ub3NwYWNlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm10LW91dHB1dCAubXQtc3R5bGUgewogIGZvbnQtc2l6ZTogeC1zbWFsbDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/mode_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEhlbHBlciB0byB0ZXN0IENvZGVNaXJyb3IgaGlnaGxpZ2h0aW5nIG1vZGVzLiBJdCBwcmV0dHkgcHJpbnRzIG91dHB1dCBvZiB0aGUKICogaGlnaGxpZ2h0ZXIgYW5kIGNhbiBjaGVjayBhZ2FpbnN0IGV4cGVjdGVkIHN0eWxlcy4KICoKICogU2VlIHRlc3QuaHRtbCBpbiB0aGUgc3RleCBtb2RlIGZvciBleGFtcGxlcy4KICovCk1vZGVUZXN0ID0ge307CgpNb2RlVGVzdC5tb2RlT3B0aW9ucyA9IHt9OwpNb2RlVGVzdC5tb2RlTmFtZSA9IENvZGVNaXJyb3IuZGVmYXVsdHMubW9kZTsKCi8qIGtlZXAgdHJhY2sgb2YgcmVzdWx0cyBmb3IgcHJpbnRTdW1tYXJ5ICovCk1vZGVUZXN0LnRlc3RDb3VudCA9IDA7Ck1vZGVUZXN0LnBhc3NlcyA9IDA7CgovKioKICogUnVuIGEgdGVzdDsgcHJldHR5cHJpbnRzIHRoZSByZXN1bHRzIHVzaW5nIGRvY3VtZW50LndyaXRlKCkuCiAqIAogKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRlc3QKICogQHBhcmFtIHRleHQgU3RyaW5nIHRvIGhpZ2hsaWdodC4KICogQHBhcmFtIGV4cGVjdGVkIEV4cGVjdGVkIHN0eWxlcyBhbmQgdG9rZW5zOiBBcnJheShzdHlsZSwgdG9rZW4sIFtzdHlsZSwgdG9rZW4sLi4uXSkKICogQHBhcmFtIG1vZGVOYW1lCiAqIEBwYXJhbSBtb2RlT3B0aW9ucwogKiBAcGFyYW0gZXhwZWN0ZWRGYWlsCiAqLwpNb2RlVGVzdC50ZXN0TW9kZSA9IGZ1bmN0aW9uKG5hbWUsIHRleHQsIGV4cGVjdGVkLCBtb2RlTmFtZSwgbW9kZU9wdGlvbnMsIGV4cGVjdGVkRmFpbCkgewogIE1vZGVUZXN0LnRlc3RDb3VudCArPSAxOwogIAogIGlmICghbW9kZU5hbWUpIG1vZGVOYW1lID0gTW9kZVRlc3QubW9kZU5hbWU7CiAgCiAgaWYgKCFtb2RlT3B0aW9ucykgbW9kZU9wdGlvbnMgPSBNb2RlVGVzdC5tb2RlT3B0aW9uczsKCiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUobW9kZU9wdGlvbnMsIG1vZGVOYW1lKTsKCiAgaWYgKGV4cGVjdGVkLmxlbmd0aCA8IDApIHsKICAgIHRocm93ICJtdXN0IGhhdmUgdGV4dCBmb3IgdGVzdCAoIiArIG5hbWUgKyAiKSI7CiAgfQogIGlmIChleHBlY3RlZC5sZW5ndGggJSAyICE9IDApIHsKICAgIHRocm93ICJtdXN0IGhhdmUgdGV4dCBmb3IgdGVzdCAoIiArIG5hbWUgKyAiKSBwbHVzIGV4cGVjdGVkIChzdHlsZSwgdG9rZW4pIHBhaXJzIjsKICB9CiAgcmV0dXJuIHRlc3QoCiAgICBtb2RlTmFtZSArICJfIiArIG5hbWUsCiAgICBmdW5jdGlvbigpewogICAgICByZXR1cm4gTW9kZVRlc3QuY29tcGFyZSh0ZXh0LCBleHBlY3RlZCwgbW9kZSk7CiAgICB9LAogICAgZXhwZWN0ZWRGYWlsCiAgKTsKICAKfQoKTW9kZVRlc3QuY29tcGFyZSA9IGZ1bmN0aW9uICh0ZXh0LCBleHBlY3RlZCwgbW9kZSkgewoKICB2YXIgZXhwZWN0ZWRPdXRwdXQgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSArPSAyKSB7CiAgICB2YXIgc3R5ID0gZXhwZWN0ZWRbaV07CiAgICBpZiAoc3R5ICYmIHN0eS5pbmRleE9mKCIgIikpIHN0eSA9IHN0eS5zcGxpdCgnICcpLnNvcnQoKS5qb2luKCcgJyk7CiAgICBleHBlY3RlZE91dHB1dC5wdXNoKHN0eSwgZXhwZWN0ZWRbaSArIDFdKTsKICB9CgogIHZhciBvYnNlcnZlZE91dHB1dCA9IE1vZGVUZXN0LmhpZ2hsaWdodCh0ZXh0LCBtb2RlKTsKCiAgdmFyIHBhc3MsIHBhc3NTdHlsZSA9ICIiOwogIHBhc3MgPSBNb2RlVGVzdC5oaWdobGlnaHRPdXRwdXRzRXF1YWwoZXhwZWN0ZWRPdXRwdXQsIG9ic2VydmVkT3V0cHV0KTsKICBwYXNzU3R5bGUgPSBwYXNzID8gJ210LXBhc3MnIDogJ210LWZhaWwnOwogIE1vZGVUZXN0LnBhc3NlcyArPSBwYXNzID8gMSA6IDA7CgogIHZhciBzID0gJyc7CiAgaWYgKHBhc3MpIHsKICAgIHMgKz0gJzxkaXYgY2xhc3M9Im10LXRlc3QgJyArIHBhc3NTdHlsZSArICciPic7CiAgICBzICs9ICAgJzxwcmU+JyArIE1vZGVUZXN0Lmh0bWxFc2NhcGUodGV4dCkgKyAnPC9wcmU+JzsKICAgIHMgKz0gICAnPGRpdiBjbGFzcz0iY20tcy1kZWZhdWx0Ij4nOwogICAgcyArPSAgIE1vZGVUZXN0LnByZXR0eVByaW50T3V0cHV0VGFibGUob2JzZXJ2ZWRPdXRwdXQpOwogICAgcyArPSAgICc8L2Rpdj4nOwogICAgcyArPSAnPC9kaXY+JzsKICAgIHJldHVybiBzOwogIH0gZWxzZSB7CiAgICBzICs9ICc8ZGl2IGNsYXNzPSJtdC10ZXN0ICcgKyBwYXNzU3R5bGUgKyAnIj4nOwogICAgcyArPSAgICc8cHJlPicgKyBNb2RlVGVzdC5odG1sRXNjYXBlKHRleHQpICsgJzwvcHJlPic7CiAgICBzICs9ICAgJzxkaXYgY2xhc3M9ImNtLXMtZGVmYXVsdCI+JzsKICAgIHMgKz0gJ2V4cGVjdGVkOic7CiAgICBzICs9ICAgTW9kZVRlc3QucHJldHR5UHJpbnRPdXRwdXRUYWJsZShleHBlY3RlZE91dHB1dCk7CiAgICBzICs9ICdvYnNlcnZlZDonOwogICAgcyArPSAgIE1vZGVUZXN0LnByZXR0eVByaW50T3V0cHV0VGFibGUob2JzZXJ2ZWRPdXRwdXQpOwogICAgcyArPSAgICc8L2Rpdj4nOwogICAgcyArPSAnPC9kaXY+JzsKICAgIHRocm93IHM7CiAgfQp9CgovKioKICogRW11bGF0aW9uIG9mIENvZGVNaXJyb3IncyBpbnRlcm5hbCBoaWdobGlnaHQgcm91dGluZSBmb3IgdGVzdGluZy4gTXVsdGktbGluZQogKiBpbnB1dCBpcyBzdXBwb3J0ZWQuCiAqCiAqIEBwYXJhbSBzdHJpbmcgdG8gaGlnaGxpZ2h0CiAqCiAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIHRoYXQgd2lsbCBkbyB0aGUgYWN0dWFsIGhpZ2hsaWdodGluZwogKgogKiBAcmV0dXJuIGFycmF5IG9mIFtzdHlsZSwgdG9rZW5dIHBhaXJzCiAqLwpNb2RlVGVzdC5oaWdobGlnaHQgPSBmdW5jdGlvbihzdHJpbmcsIG1vZGUpIHsKICB2YXIgc3RhdGUgPSBtb2RlLnN0YXJ0U3RhdGUoKQoKICB2YXIgbGluZXMgPSBzdHJpbmcucmVwbGFjZSgvXHJcbi9nLCdcbicpLnNwbGl0KCdcbicpOwogIHZhciBzdCA9IFtdLCBwb3MgPSAwOwogIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKICAgIHZhciBsaW5lID0gbGluZXNbaV0sIG5ld0xpbmUgPSB0cnVlOwogICAgdmFyIHN0cmVhbSA9IG5ldyBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbShsaW5lKTsKICAgIGlmIChsaW5lID09ICIiICYmIG1vZGUuYmxhbmtMaW5lKSBtb2RlLmJsYW5rTGluZShzdGF0ZSk7CiAgICAvKiBTdGFydCBjb3BpZWQgY29kZSBmcm9tIENvZGVNaXJyb3IuaGlnaGxpZ2h0ICovCiAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICB2YXIgc3R5bGUgPSBtb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUpLCBzdWJzdHIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBpZiAoc3R5bGUgJiYgc3R5bGUuaW5kZXhPZigiICIpID4gLTEpIHN0eWxlID0gc3R5bGUuc3BsaXQoJyAnKS5zb3J0KCkuam9pbignICcpOwoKICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgICAgaWYgKHBvcyAmJiBzdFtwb3MtMl0gPT0gc3R5bGUgJiYgIW5ld0xpbmUpIHsKICAgICAgICBzdFtwb3MtMV0gKz0gc3Vic3RyOwogICAgICB9IGVsc2UgaWYgKHN1YnN0cikgewogICAgICAgIHN0W3BvcysrXSA9IHN0eWxlOyBzdFtwb3MrK10gPSBzdWJzdHI7CiAgICAgIH0KICAgICAgLy8gR2l2ZSB1cCB3aGVuIGxpbmUgaXMgcmlkaWN1bG91c2x5IGxvbmcKICAgICAgaWYgKHN0cmVhbS5wb3MgPiA1MDAwKSB7CiAgICAgICAgc3RbcG9zKytdID0gbnVsbDsgc3RbcG9zKytdID0gdGhpcy50ZXh0LnNsaWNlKHN0cmVhbS5wb3MpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG5ld0xpbmUgPSBmYWxzZTsKICAgIH0KICB9CgogIHJldHVybiBzdDsKfQoKLyoqCiAqIENvbXBhcmUgdHdvIGFycmF5cyBvZiBvdXRwdXQgZnJvbSBNb2RlVGVzdC5oaWdobGlnaHQuCiAqCiAqIEBwYXJhbSBvMSBhcnJheSBvZiBbc3R5bGUsIHRva2VuXSBwYWlycwogKgogKiBAcGFyYW0gbzIgYXJyYXkgb2YgW3N0eWxlLCB0b2tlbl0gcGFpcnMKICoKICogQHJldHVybiBib29sZWFuOyB0cnVlIGlmZiBvdXRwdXRzIGVxdWFsCiAqLwpNb2RlVGVzdC5oaWdobGlnaHRPdXRwdXRzRXF1YWwgPSBmdW5jdGlvbihvMSwgbzIpIHsKICBpZiAobzEubGVuZ3RoICE9IG8yLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogIGZvciAodmFyIGkgPSAwOyBpIDwgbzEubGVuZ3RoOyArK2kpCiAgICBpZiAobzFbaV0gIT0gbzJbaV0pIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFByaW50IHRva2VucyBhbmQgY29ycmVzcG9uZGluZyBzdHlsZXMgaW4gYSB0YWJsZS4gU3BhY2VzIGluIHRoZSB0b2tlbiBhcmUKICogcmVwbGFjZWQgd2l0aCAnaW50ZXJwdW5jdCcgZG90cyAoJm1pZGRvdDspLgogKgogKiBAcGFyYW0gb3V0cHV0IGFycmF5IG9mIFtzdHlsZSwgdG9rZW5dIHBhaXJzCiAqCiAqIEByZXR1cm4gaHRtbCBzdHJpbmcKICovCk1vZGVUZXN0LnByZXR0eVByaW50T3V0cHV0VGFibGUgPSBmdW5jdGlvbihvdXRwdXQpIHsKICB2YXIgcyA9ICc8dGFibGUgY2xhc3M9Im10LW91dHB1dCI+JzsKICBzICs9ICc8dHI+JzsKICBmb3IgKHZhciBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkgKz0gMikgewogICAgdmFyIHN0eWxlID0gb3V0cHV0W2ldLCB2YWwgPSBvdXRwdXRbaSsxXTsKICAgIHMgKz0KICAgICAgJzx0ZCBjbGFzcz0ibXQtdG9rZW4iPicgKwogICAgICAgICc8c3BhbiBjbGFzcz0iY20tJyArIFN0cmluZyhzdHlsZSkucmVwbGFjZSgvICsvZywgIiBjbS0iKSArICciPicgKwogICAgICAgICAgTW9kZVRlc3QuaHRtbEVzY2FwZSh2YWwpLnJlcGxhY2UoLyAvZywnJm1pZGRvdDsnKSArCiAgICAgICAgJzwvc3Bhbj4nICsKICAgICAgJzwvdGQ+JzsKICB9CiAgcyArPSAnPC90cj48dHI+JzsKICBmb3IgKHZhciBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkgKz0gMikgewogICAgcyArPSAnPHRkIGNsYXNzPSJtdC1zdHlsZSI+PHNwYW4+JyArIG91dHB1dFtpXSArICc8L3NwYW4+PC90ZD4nOwogIH0KICBzICs9ICc8L3RhYmxlPic7CiAgcmV0dXJuIHM7Cn0KCi8qKgogKiBQcmludCBob3cgbWFueSB0ZXN0cyBoYXZlIHJ1biBzbyBmYXIgYW5kIGhvdyBtYW55IG9mIHRob3NlIHBhc3NlZC4KICovCk1vZGVUZXN0LnByaW50U3VtbWFyeSA9IGZ1bmN0aW9uKCkgewogIE1vZGVUZXN0LnJ1blRlc3RzKE1vZGVUZXN0LmRpc3BsYXlUZXN0KTsKICBkb2N1bWVudC53cml0ZShNb2RlVGVzdC5wYXNzZXMgKyAnIHBhc3NlcyBmb3IgJyArIE1vZGVUZXN0LnRlc3RDb3VudCArICcgdGVzdHMnKTsKfQoKLyoqCiAqIEJhc2ljIEhUTUwgZXNjYXBpbmcuCiAqLwpNb2RlVGVzdC5odG1sRXNjYXBlID0gZnVuY3Rpb24oc3RyKSB7CiAgc3RyID0gc3RyLnRvU3RyaW5nKCk7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bPCZdL2csCiAgICAgIGZ1bmN0aW9uKHN0cikge3JldHVybiBzdHIgPT0gIiYiID8gIiZhbXA7IiA6ICImbHQ7Ijt9KTsKfQoK]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/phantom_driver.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIHBhZ2UgPSByZXF1aXJlKCd3ZWJwYWdlJykuY3JlYXRlKCk7CgpwYWdlLm9wZW4oImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC90ZXN0L2luZGV4Lmh0bWwiLCBmdW5jdGlvbiAoc3RhdHVzKSB7CiAgaWYgKHN0YXR1cyAhPSAic3VjY2VzcyIpIHsKICAgIGNvbnNvbGUubG9nKCJwYWdlIGNvdWxkbid0IGJlIGxvYWRlZCBzdWNjZXNzZnVsbHkiKTsKICAgIHBoYW50b20uZXhpdCgxKTsKICB9CiAgd2FpdEZvcihmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBvdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzJyk7CiAgICAgIGlmICghb3V0cHV0KSB7IHJldHVybiBmYWxzZTsgfQogICAgICByZXR1cm4gKC9eKFxkKyBmYWlsdXJlcz98YWxsIHBhc3NlZCkvaSkudGVzdChvdXRwdXQuaW5uZXJUZXh0KTsKICAgIH0pOwogIH0sIGZ1bmN0aW9uICgpIHsKICAgIHZhciBmYWlsZWQgPSBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdpbmRvdy5mYWlsZWQ7IH0pOwogICAgdmFyIG91dHB1dCA9IHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ291dHB1dCcpLmlubmVyVGV4dCArICJcbiIgKwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMnKS5pbm5lclRleHQ7CiAgICB9KTsKICAgIGNvbnNvbGUubG9nKG91dHB1dCk7CiAgICBwaGFudG9tLmV4aXQoZmFpbGVkID4gMCA/IDEgOiAwKTsKICB9KTsKfSk7CgpmdW5jdGlvbiB3YWl0Rm9yICh0ZXN0LCBjYikgewogIGlmICh0ZXN0KCkpIHsKICAgIGNiKCk7CiAgfSBlbHNlIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB3YWl0Rm9yKHRlc3QsIGNiKTsgfSwgMjUwKTsKICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/run.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKdmFyIGxpbnQgPSByZXF1aXJlKCIuL2xpbnQvbGludCIpOwoKbGludC5jaGVja0RpcigibW9kZSIpOwpsaW50LmNoZWNrRGlyKCJsaWIiKTsKCnZhciBvayA9IGxpbnQuc3VjY2VzcygpOwoKdmFyIGZpbGVzID0gbmV3IChyZXF1aXJlKCdub2RlLXN0YXRpYycpLlNlcnZlcikoJy4nKTsKCnZhciBzZXJ2ZXIgPSByZXF1aXJlKCdodHRwJykuY3JlYXRlU2VydmVyKGZ1bmN0aW9uIChyZXEsIHJlcykgewogIHJlcS5hZGRMaXN0ZW5lcignZW5kJywgZnVuY3Rpb24gKCkgewogICAgZmlsZXMuc2VydmUocmVxLCByZXMpOwogIH0pOwp9KS5hZGRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7CiAgdGhyb3cgZXJyOwp9KS5saXN0ZW4oMzAwMCwgZnVuY3Rpb24gKCkgewogIHZhciBjaGlsZF9wcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpOwogIGNoaWxkX3Byb2Nlc3MuZXhlYygid2hpY2ggcGhhbnRvbWpzIiwgZnVuY3Rpb24gKGVycikgewogICAgaWYgKGVycikgewogICAgICBjb25zb2xlLmVycm9yKCJQaGFudG9tSlMgaXMgbm90IGluc3RhbGxlZC4gRG93bmxvYWQgZnJvbSBodHRwOi8vcGhhbnRvbWpzLm9yZyIpOwogICAgICBwcm9jZXNzLmV4aXQoMSk7CiAgICB9CiAgICB2YXIgY21kID0gJ3BoYW50b21qcyB0ZXN0L3BoYW50b21fZHJpdmVyLmpzJzsKICAgIGNoaWxkX3Byb2Nlc3MuZXhlYyhjbWQsIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCkgewogICAgICBzZXJ2ZXIuY2xvc2UoKTsKICAgICAgY29uc29sZS5sb2coc3Rkb3V0KTsKICAgICAgcHJvY2Vzcy5leGl0KGVyciB8fCAhb2sgPyAxIDogMCk7CiAgICB9KTsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZnVuY3Rpb24gZm9yRWFjaChhcnIsIGYpIHsKICBmb3IgKHZhciBpID0gMCwgZSA9IGFyci5sZW5ndGg7IGkgPCBlOyArK2kpIGYoYXJyW2ldKTsKfQoKZnVuY3Rpb24gYWRkRG9jKGNtLCB3aWR0aCwgaGVpZ2h0KSB7CiAgdmFyIGNvbnRlbnQgPSBbXSwgbGluZSA9ICIiOwogIGZvciAodmFyIGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgbGluZSArPSAieCI7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgY29udGVudC5wdXNoKGxpbmUpOwogIGNtLnNldFZhbHVlKGNvbnRlbnQuam9pbigiXG4iKSk7Cn0KCmZ1bmN0aW9uIGJ5Q2xhc3NOYW1lKGVsdCwgY2xzKSB7CiAgaWYgKGVsdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSByZXR1cm4gZWx0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xzKTsKICB2YXIgZm91bmQgPSBbXSwgcmUgPSBuZXcgUmVnRXhwKCJcXGIiICsgY2xzICsgIlxcYiIpOwogIGZ1bmN0aW9uIHNlYXJjaChlbHQpIHsKICAgIGlmIChlbHQubm9kZVR5cGUgPT0gMykgcmV0dXJuOwogICAgaWYgKHJlLnRlc3QoZWx0LmNsYXNzTmFtZSkpIGZvdW5kLnB1c2goZWx0KTsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gZWx0LmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgZTsgKytpKQogICAgICBzZWFyY2goZWx0LmNoaWxkTm9kZXNbaV0pOwogIH0KICBzZWFyY2goZWx0KTsKICByZXR1cm4gZm91bmQ7Cn0KCnZhciBpZV9sdDggPSAvTVNJRSBbMS03XVxiLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwp2YXIgbWFjID0gL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pOwp2YXIgcGhhbnRvbSA9IC9QaGFudG9tSlMvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CnZhciBvcGVyYV9sdDEwID0gL09wZXJhXC9bMS05XVwuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwoKdGVzdCgiY29yZV9mcm9tVGV4dEFyZWEiLCBmdW5jdGlvbigpIHsKICB2YXIgdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpOwogIHRlLnZhbHVlID0gIkNPTlRFTlQiOwogIHZhciBjbSA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKHRlKTsKICBpcyghdGUub2Zmc2V0SGVpZ2h0KTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiQ09OVEVOVCIpOwogIGNtLnNldFZhbHVlKCJmb29cbmJhciIpOwogIGVxKGNtLmdldFZhbHVlKCksICJmb29cbmJhciIpOwogIGNtLnNhdmUoKTsKICBpcygvXmZvb1xyP1xuYmFyJC8udGVzdCh0ZS52YWx1ZSkpOwogIGNtLnNldFZhbHVlKCJ4eHgiKTsKICBjbS50b1RleHRBcmVhKCk7CiAgaXModGUub2Zmc2V0SGVpZ2h0KTsKICBlcSh0ZS52YWx1ZSwgInh4eCIpOwp9KTsKCnRlc3RDTSgiZ2V0UmFuZ2UiLCBmdW5jdGlvbihjbSkgewogIGVxKGNtLmdldExpbmUoMCksICIxMjM0Iik7CiAgZXEoY20uZ2V0TGluZSgxKSwgIjU2NzgiKTsKICBlcShjbS5nZXRMaW5lKDIpLCBudWxsKTsKICBlcShjbS5nZXRMaW5lKC0xKSwgbnVsbCk7CiAgZXEoY20uZ2V0UmFuZ2Uoe2xpbmU6IDAsIGNoOiAwfSwge2xpbmU6IDAsIGNoOiAzfSksICIxMjMiKTsKICBlcShjbS5nZXRSYW5nZSh7bGluZTogMCwgY2g6IC0xfSwge2xpbmU6IDAsIGNoOiAyMDB9KSwgIjEyMzQiKTsKICBlcShjbS5nZXRSYW5nZSh7bGluZTogMCwgY2g6IDJ9LCB7bGluZTogMSwgY2g6IDJ9KSwgIjM0XG41NiIpOwogIGVxKGNtLmdldFJhbmdlKHtsaW5lOiAxLCBjaDogMn0sIHtsaW5lOiAxMDAsIGNoOiAwfSksICI3OCIpOwp9LCB7dmFsdWU6ICIxMjM0XG41Njc4In0pOwoKdGVzdENNKCJyZXBsYWNlUmFuZ2UiLCBmdW5jdGlvbihjbSkgewogIGVxKGNtLmdldFZhbHVlKCksICIiKTsKICBjbS5yZXBsYWNlUmFuZ2UoImZvb1xuIiwge2xpbmU6IDAsIGNoOiAwfSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImZvb1xuIik7CiAgY20ucmVwbGFjZVJhbmdlKCJhXG5iIiwge2xpbmU6IDAsIGNoOiAxfSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImZhXG5ib29cbiIpOwogIGVxKGNtLmxpbmVDb3VudCgpLCAzKTsKICBjbS5yZXBsYWNlUmFuZ2UoInh5enp5Iiwge2xpbmU6IDAsIGNoOiAwfSwge2xpbmU6IDEsIGNoOiAxfSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgInh5enp5b29cbiIpOwogIGNtLnJlcGxhY2VSYW5nZSgiYWJjIiwge2xpbmU6IDAsIGNoOiAwfSwge2xpbmU6IDEwLCBjaDogMH0pOwogIGVxKGNtLmdldFZhbHVlKCksICJhYmMiKTsKICBlcShjbS5saW5lQ291bnQoKSwgMSk7Cn0pOwoKdGVzdENNKCJzZWxlY3Rpb24iLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFNlbGVjdGlvbih7bGluZTogMCwgY2g6IDR9LCB7bGluZTogMiwgY2g6IDJ9KTsKICBpcyhjbS5zb21ldGhpbmdTZWxlY3RlZCgpKTsKICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIjExXG4yMjIyMjJcbjMzIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKGZhbHNlKSwge2xpbmU6IDIsIGNoOiAyfSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCB7bGluZTogMCwgY2g6IDR9KTsKICBjbS5zZXRTZWxlY3Rpb24oe2xpbmU6IDEsIGNoOiAwfSk7CiAgaXMoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCB7bGluZTogMSwgY2g6IDB9KTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJhYmMiKTsKICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgImFiYyIpOwogIGVxKGNtLmdldFZhbHVlKCksICIxMTExMTFcbmFiYzIyMjIyMlxuMzMzMzMzIik7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiZGVmIiwgImVuZCIpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCB7bGluZTogMSwgY2g6IDN9KTsKICBjbS5zZXRDdXJzb3Ioe2xpbmU6IDIsIGNoOiAxfSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCB7bGluZTogMiwgY2g6IDF9KTsKICBjbS5zZXRDdXJzb3IoMSwgMik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCB7bGluZTogMSwgY2g6IDJ9KTsKfSwge3ZhbHVlOiAiMTExMTExXG4yMjIyMjJcbjMzMzMzMyJ9KTsKCnRlc3RDTSgiZXh0ZW5kU2VsZWN0aW9uIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRFeHRlbmRpbmcodHJ1ZSk7CiAgYWRkRG9jKGNtLCAxMCwgMTApOwogIGNtLnNldFNlbGVjdGlvbih7bGluZTogMywgY2g6IDV9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwge2xpbmU6IDMsIGNoOiA1fSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwge2xpbmU6IDMsIGNoOiA1fSk7CiAgY20uc2V0U2VsZWN0aW9uKHtsaW5lOiAyLCBjaDogNX0sIHtsaW5lOiA1LCBjaDogNX0pOwogIGVxUG9zKGNtLmdldEN1cnNvcigiaGVhZCIpLCB7bGluZTogNSwgY2g6IDV9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCB7bGluZTogMiwgY2g6IDV9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoInN0YXJ0IiksIHtsaW5lOiAyLCBjaDogNX0pOwogIGVxUG9zKGNtLmdldEN1cnNvcigiZW5kIiksIHtsaW5lOiA1LCBjaDogNX0pOwogIGNtLnNldFNlbGVjdGlvbih7bGluZTogNSwgY2g6IDV9LCB7bGluZTogMiwgY2g6IDV9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwge2xpbmU6IDIsIGNoOiA1fSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwge2xpbmU6IDUsIGNoOiA1fSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJzdGFydCIpLCB7bGluZTogMiwgY2g6IDV9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImVuZCIpLCB7bGluZTogNSwgY2g6IDV9KTsKICBjbS5leHRlbmRTZWxlY3Rpb24oe2xpbmU6IDMsIGNoOiAyfSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIHtsaW5lOiAzLCBjaDogMn0pOwogIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIHtsaW5lOiA1LCBjaDogNX0pOwogIGNtLmV4dGVuZFNlbGVjdGlvbih7bGluZTogNiwgY2g6IDJ9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwge2xpbmU6IDYsIGNoOiAyfSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwge2xpbmU6IDUsIGNoOiA1fSk7CiAgY20uZXh0ZW5kU2VsZWN0aW9uKHtsaW5lOiA2LCBjaDogM30sIHtsaW5lOiA2LCBjaDogNH0pOwogIGVxUG9zKGNtLmdldEN1cnNvcigiaGVhZCIpLCB7bGluZTogNiwgY2g6IDR9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCB7bGluZTogNSwgY2g6IDV9KTsKICBjbS5leHRlbmRTZWxlY3Rpb24oe2xpbmU6IDAsIGNoOiAzfSwge2xpbmU6IDAsIGNoOiA0fSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIHtsaW5lOiAwLCBjaDogM30pOwogIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIHtsaW5lOiA1LCBjaDogNX0pOwogIGNtLmV4dGVuZFNlbGVjdGlvbih7bGluZTogNCwgY2g6IDV9LCB7bGluZTogNiwgY2g6IDV9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwge2xpbmU6IDYsIGNoOiA1fSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwge2xpbmU6IDQsIGNoOiA1fSk7CiAgY20uc2V0RXh0ZW5kaW5nKGZhbHNlKTsKICBjbS5leHRlbmRTZWxlY3Rpb24oe2xpbmU6IDAsIGNoOiAzfSwge2xpbmU6IDAsIGNoOiA0fSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIHtsaW5lOiAwLCBjaDogNH0pOwogIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIHtsaW5lOiAwLCBjaDogM30pOwp9KTsKCnRlc3RDTSgibGluZXMiLCBmdW5jdGlvbihjbSkgewogIGVxKGNtLmdldExpbmUoMCksICIxMTExMTEiKTsKICBlcShjbS5nZXRMaW5lKDEpLCAiMjIyMjIyIik7CiAgZXEoY20uZ2V0TGluZSgtMSksIG51bGwpOwogIGNtLnJlbW92ZUxpbmUoMSk7CiAgY20uc2V0TGluZSgxLCAiYWJjIik7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIjExMTExMVxuYWJjIik7Cn0sIHt2YWx1ZTogIjExMTExMVxuMjIyMjIyXG4zMzMzMzMifSk7Cgp0ZXN0Q00oImluZGVudCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uaW5kZW50TGluZSgxKTsKICBlcShjbS5nZXRMaW5lKDEpLCAiICAgYmxhaCgpOyIpOwogIGNtLnNldE9wdGlvbigiaW5kZW50VW5pdCIsIDgpOwogIGNtLmluZGVudExpbmUoMSk7CiAgZXEoY20uZ2V0TGluZSgxKSwgIlx0YmxhaCgpOyIpOwogIGNtLnNldE9wdGlvbigiaW5kZW50VW5pdCIsIDEwKTsKICBjbS5zZXRPcHRpb24oInRhYlNpemUiLCA0KTsKICBjbS5pbmRlbnRMaW5lKDEpOwogIGVxKGNtLmdldExpbmUoMSksICJcdFx0ICBibGFoKCk7Iik7Cn0sIHt2YWx1ZTogImlmICh4KSB7XG5ibGFoKCk7XG59IiwgaW5kZW50VW5pdDogMywgaW5kZW50V2l0aFRhYnM6IHRydWUsIHRhYlNpemU6IDh9KTsKCnRlc3QoImNvcmVfZGVmYXVsdHMiLCBmdW5jdGlvbigpIHsKICB2YXIgZGVmc0NvcHkgPSB7fSwgZGVmcyA9IENvZGVNaXJyb3IuZGVmYXVsdHM7CiAgZm9yICh2YXIgb3B0IGluIGRlZnMpIGRlZnNDb3B5W29wdF0gPSBkZWZzW29wdF07CiAgZGVmcy5pbmRlbnRVbml0ID0gNTsKICBkZWZzLnZhbHVlID0gInV1IjsKICBkZWZzLmVudGVyTW9kZSA9ICJrZWVwIjsKICBkZWZzLnRhYmluZGV4ID0gNTU7CiAgdmFyIHBsYWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Rncm91bmQiKSwgY20gPSBDb2RlTWlycm9yKHBsYWNlKTsKICB0cnkgewogICAgZXEoY20uZ2V0T3B0aW9uKCJpbmRlbnRVbml0IiksIDUpOwogICAgY20uc2V0T3B0aW9uKCJpbmRlbnRVbml0IiwgMTApOwogICAgZXEoZGVmcy5pbmRlbnRVbml0LCA1KTsKICAgIGVxKGNtLmdldFZhbHVlKCksICJ1dSIpOwogICAgZXEoY20uZ2V0T3B0aW9uKCJlbnRlck1vZGUiKSwgImtlZXAiKTsKICAgIGVxKGNtLmdldElucHV0RmllbGQoKS50YWJJbmRleCwgNTUpOwogIH0KICBmaW5hbGx5IHsKICAgIGZvciAodmFyIG9wdCBpbiBkZWZzQ29weSkgZGVmc1tvcHRdID0gZGVmc0NvcHlbb3B0XTsKICAgIHBsYWNlLnJlbW92ZUNoaWxkKGNtLmdldFdyYXBwZXJFbGVtZW50KCkpOwogIH0KfSk7Cgp0ZXN0Q00oImxpbmVJbmZvIiwgZnVuY3Rpb24oY20pIHsKICBlcShjbS5saW5lSW5mbygtMSksIG51bGwpOwogIHZhciBtYXJrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogIHZhciBsaCA9IGNtLnNldEd1dHRlck1hcmtlcigxLCAiRk9PIiwgbWFyayk7CiAgdmFyIGluZm8gPSBjbS5saW5lSW5mbygxKTsKICBlcShpbmZvLnRleHQsICIyMjIyMjIiKTsKICBlcShpbmZvLmd1dHRlck1hcmtlcnMuRk9PLCBtYXJrKTsKICBlcShpbmZvLmxpbmUsIDEpOwogIGVxKGNtLmxpbmVJbmZvKDIpLmd1dHRlck1hcmtlcnMsIG51bGwpOwogIGNtLnNldEd1dHRlck1hcmtlcihsaCwgIkZPTyIsIG51bGwpOwogIGVxKGNtLmxpbmVJbmZvKDEpLmd1dHRlck1hcmtlcnMsIG51bGwpOwogIGNtLnNldEd1dHRlck1hcmtlcigxLCAiRk9PIiwgbWFyayk7CiAgY20uc2V0R3V0dGVyTWFya2VyKDAsICJGT08iLCBtYXJrKTsKICBjbS5jbGVhckd1dHRlcigiRk9PIik7CiAgZXEoY20ubGluZUluZm8oMCkuZ3V0dGVyTWFya2VycywgbnVsbCk7CiAgZXEoY20ubGluZUluZm8oMSkuZ3V0dGVyTWFya2VycywgbnVsbCk7Cn0sIHt2YWx1ZTogIjExMTExMVxuMjIyMjIyXG4zMzMzMzMifSk7Cgp0ZXN0Q00oImNvb3JkcyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZShudWxsLCAxMDApOwogIGFkZERvYyhjbSwgMzIsIDIwMCk7CiAgdmFyIHRvcCA9IGNtLmNoYXJDb29yZHMoe2xpbmU6IDAsIGNoOiAwfSk7CiAgdmFyIGJvdCA9IGNtLmNoYXJDb29yZHMoe2xpbmU6IDIwMCwgY2g6IDMwfSk7CiAgaXModG9wLmxlZnQgPCBib3QubGVmdCk7CiAgaXModG9wLnRvcCA8IGJvdC50b3ApOwogIGlzKHRvcC50b3AgPCB0b3AuYm90dG9tKTsKICBjbS5zY3JvbGxUbyhudWxsLCAxMDApOwogIHZhciB0b3AyID0gY20uY2hhckNvb3Jkcyh7bGluZTogMCwgY2g6IDB9KTsKICBpcyh0b3AudG9wID4gdG9wMi50b3ApOwogIGVxKHRvcC5sZWZ0LCB0b3AyLmxlZnQpOwp9KTsKCnRlc3RDTSgiY29vcmRzQ2hhciIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAzNSwgNzApOwogIGZvciAodmFyIGNoID0gMDsgY2ggPD0gMzU7IGNoICs9IDUpIHsKICAgIGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgNzA7IGxpbmUgKz0gNSkgewogICAgICBjbS5zZXRDdXJzb3IobGluZSwgY2gpOwogICAgICB2YXIgY29vcmRzID0gY20uY2hhckNvb3Jkcyh7bGluZTogbGluZSwgY2g6IGNofSk7CiAgICAgIHZhciBwb3MgPSBjbS5jb29yZHNDaGFyKHtsZWZ0OiBjb29yZHMubGVmdCwgdG9wOiBjb29yZHMudG9wICsgNX0pOwogICAgICBlcVBvcyhwb3MsIHtsaW5lOiBsaW5lLCBjaDogY2h9KTsKICAgIH0KICB9Cn0pOwoKdGVzdENNKCJwb3NGcm9tSW5kZXgiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFZhbHVlKAogICAgIlRoaXMgZnVuY3Rpb24gc2hvdWxkXG4iICsKICAgICJjb252ZXJ0IGEgemVybyBiYXNlZCBpbmRleFxuIiArCiAgICAidG8gbGluZSBhbmQgY2guIgogICk7CgogIHZhciBleGFtcGxlcyA9IFsKICAgIHsgaW5kZXg6IC0xLCBsaW5lOiAwLCBjaDogMCAgfSwgLy8gPC0gVGVzdHMgY2xpcHBpbmcKICAgIHsgaW5kZXg6IDAsICBsaW5lOiAwLCBjaDogMCAgfSwKICAgIHsgaW5kZXg6IDEwLCBsaW5lOiAwLCBjaDogMTAgfSwKICAgIHsgaW5kZXg6IDM5LCBsaW5lOiAxLCBjaDogMTggfSwKICAgIHsgaW5kZXg6IDU1LCBsaW5lOiAyLCBjaDogNyAgfSwKICAgIHsgaW5kZXg6IDYzLCBsaW5lOiAyLCBjaDogMTUgfSwKICAgIHsgaW5kZXg6IDY0LCBsaW5lOiAyLCBjaDogMTUgfSAgLy8gPC0gVGVzdHMgY2xpcHBpbmcKICBdOwoKICBmb3IgKHZhciBpID0gMDsgaSA8IGV4YW1wbGVzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZXhhbXBsZSA9IGV4YW1wbGVzW2ldOwogICAgdmFyIHBvcyA9IGNtLnBvc0Zyb21JbmRleChleGFtcGxlLmluZGV4KTsKICAgIGVxKHBvcy5saW5lLCBleGFtcGxlLmxpbmUpOwogICAgZXEocG9zLmNoLCBleGFtcGxlLmNoKTsKICAgIGlmIChleGFtcGxlLmluZGV4ID49IDAgJiYgZXhhbXBsZS5pbmRleCA8IDY0KQogICAgICBlcShjbS5pbmRleEZyb21Qb3MocG9zKSwgZXhhbXBsZS5pbmRleCk7CiAgfQp9KTsKCnRlc3RDTSgidW5kbyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0TGluZSgwLCAiZGVmIik7CiAgZXEoY20uaGlzdG9yeVNpemUoKS51bmRvLCAxKTsKICBjbS51bmRvKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImFiYyIpOwogIGVxKGNtLmhpc3RvcnlTaXplKCkudW5kbywgMCk7CiAgZXEoY20uaGlzdG9yeVNpemUoKS5yZWRvLCAxKTsKICBjbS5yZWRvKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImRlZiIpOwogIGVxKGNtLmhpc3RvcnlTaXplKCkudW5kbywgMSk7CiAgZXEoY20uaGlzdG9yeVNpemUoKS5yZWRvLCAwKTsKICBjbS5zZXRWYWx1ZSgiMVxuXG5cbjIiKTsKICBjbS5jbGVhckhpc3RvcnkoKTsKICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDApOwogIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7ICsraSkgewogICAgY20ucmVwbGFjZVJhbmdlKCJhIiwge2xpbmU6IDAsIGNoOiAwfSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoImIiLCB7bGluZTogMywgY2g6IDB9KTsKICB9CiAgZXEoY20uaGlzdG9yeVNpemUoKS51bmRvLCA0MCk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0MDsgKytpKQogICAgY20udW5kbygpOwogIGVxKGNtLmhpc3RvcnlTaXplKCkucmVkbywgNDApOwogIGVxKGNtLmdldFZhbHVlKCksICIxXG5cblxuMiIpOwp9LCB7dmFsdWU6ICJhYmMifSk7Cgp0ZXN0Q00oInVuZG9NdWx0aUxpbmUiLCBmdW5jdGlvbihjbSkgewogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieCIsIHtsaW5lOjAsIGNoOiAwfSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoInkiLCB7bGluZToxLCBjaDogMH0pOwogIH0pOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYWJjXG5kZWZcbmdoaSIpOwogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieSIsIHtsaW5lOjEsIGNoOiAwfSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIngiLCB7bGluZTowLCBjaDogMH0pOwogIH0pOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYWJjXG5kZWZcbmdoaSIpOwogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieSIsIHtsaW5lOjIsIGNoOiAwfSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIngiLCB7bGluZToxLCBjaDogMH0pOwogICAgY20ucmVwbGFjZVJhbmdlKCJ6Iiwge2xpbmU6MiwgY2g6IDB9KTsKICB9KTsKICBjbS51bmRvKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImFiY1xuZGVmXG5naGkiLCAzKTsKfSwge3ZhbHVlOiAiYWJjXG5kZWZcbmdoaSJ9KTsKCnRlc3RDTSgidW5kb1NlbGVjdGlvbiIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2VsZWN0aW9uKHtsaW5lOiAwLCBjaDogMn0sIHtsaW5lOiAwLCBjaDogNH0pOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oIiIpOwogIGNtLnNldEN1cnNvcih7bGluZTogMSwgY2g6IDB9KTsKICBjbS51bmRvKCk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCB7bGluZTogMCwgY2g6IDJ9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoZmFsc2UpLCB7bGluZTogMCwgY2g6IDR9KTsKICBjbS5zZXRDdXJzb3Ioe2xpbmU6IDEsIGNoOiAwfSk7CiAgY20ucmVkbygpOwogIGVxUG9zKGNtLmdldEN1cnNvcih0cnVlKSwge2xpbmU6IDAsIGNoOiAyfSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKGZhbHNlKSwge2xpbmU6IDAsIGNoOiAyfSk7Cn0sIHt2YWx1ZTogImFiY2RlZmdoXG4ifSk7Cgp0ZXN0Q00oIm1hcmtUZXh0U2luZ2xlTGluZSIsIGZ1bmN0aW9uKGNtKSB7CiAgZm9yRWFjaChbe2E6IDAsIGI6IDEsIGM6ICIiLCBmOiAyLCB0OiA1fSwKICAgICAgICAgICB7YTogMCwgYjogNCwgYzogIiIsIGY6IDAsIHQ6IDJ9LAogICAgICAgICAgIHthOiAxLCBiOiAyLCBjOiAieCIsIGY6IDMsIHQ6IDZ9LAogICAgICAgICAgIHthOiA0LCBiOiA1LCBjOiAiIiwgZjogMywgdDogNX0sCiAgICAgICAgICAge2E6IDQsIGI6IDUsIGM6ICJ4eCIsIGY6IDMsIHQ6IDd9LAogICAgICAgICAgIHthOiAyLCBiOiA1LCBjOiAiIiwgZjogMiwgdDogM30sCiAgICAgICAgICAge2E6IDIsIGI6IDUsIGM6ICJhYmNkIiwgZjogNiwgdDogN30sCiAgICAgICAgICAge2E6IDIsIGI6IDYsIGM6ICJ4IiwgZjogbnVsbCwgdDogbnVsbH0sCiAgICAgICAgICAge2E6IDMsIGI6IDYsIGM6ICIiLCBmOiBudWxsLCB0OiBudWxsfSwKICAgICAgICAgICB7YTogMCwgYjogOSwgYzogImhhbGxvIiwgZjogbnVsbCwgdDogbnVsbH0sCiAgICAgICAgICAge2E6IDQsIGI6IDYsIGM6ICJ4IiwgZjogMywgdDogNH0sCiAgICAgICAgICAge2E6IDQsIGI6IDgsIGM6ICIiLCBmOiAzLCB0OiA0fSwKICAgICAgICAgICB7YTogNiwgYjogNiwgYzogImEiLCBmOiAzLCB0OiA2fSwKICAgICAgICAgICB7YTogOCwgYjogOSwgYzogIiIsIGY6IDMsIHQ6IDZ9XSwgZnVuY3Rpb24odGVzdCkgewogICAgY20uc2V0VmFsdWUoIjEyMzQ1Njc4OTAiKTsKICAgIHZhciByID0gY20ubWFya1RleHQoe2xpbmU6IDAsIGNoOiAzfSwge2xpbmU6IDAsIGNoOiA2fSwge2NsYXNzTmFtZTogImZvbyJ9KTsKICAgIGNtLnJlcGxhY2VSYW5nZSh0ZXN0LmMsIHtsaW5lOiAwLCBjaDogdGVzdC5hfSwge2xpbmU6IDAsIGNoOiB0ZXN0LmJ9KTsKICAgIHZhciBmID0gci5maW5kKCk7CiAgICBlcShmICYmIGYuZnJvbS5jaCwgdGVzdC5mKTsgZXEoZiAmJiBmLnRvLmNoLCB0ZXN0LnQpOwogIH0pOwp9KTsKCnRlc3RDTSgibWFya1RleHRNdWx0aUxpbmUiLCBmdW5jdGlvbihjbSkgewogIGZ1bmN0aW9uIHAodikgeyByZXR1cm4gdiAmJiB7bGluZTogdlswXSwgY2g6IHZbMV19OyB9CiAgZm9yRWFjaChbe2E6IFswLCAwXSwgYjogWzAsIDVdLCBjOiAiIiwgZjogWzAsIDBdLCB0OiBbMiwgNV19LAogICAgICAgICAgIHthOiBbMCwgMF0sIGI6IFswLCA1XSwgYzogImZvb1xuIiwgZjogWzEsIDBdLCB0OiBbMywgNV19LAogICAgICAgICAgIHthOiBbMCwgMV0sIGI6IFswLCAxMF0sIGM6ICIiLCBmOiBbMCwgMV0sIHQ6IFsyLCA1XX0sCiAgICAgICAgICAge2E6IFswLCA1XSwgYjogWzAsIDZdLCBjOiAieCIsIGY6IFswLCA2XSwgdDogWzIsIDVdfSwKICAgICAgICAgICB7YTogWzAsIDBdLCBiOiBbMSwgMF0sIGM6ICIiLCBmOiBbMCwgMF0sIHQ6IFsxLCA1XX0sCiAgICAgICAgICAge2E6IFswLCA2XSwgYjogWzIsIDRdLCBjOiAiIiwgZjogWzAsIDVdLCB0OiBbMCwgN119LAogICAgICAgICAgIHthOiBbMCwgNl0sIGI6IFsyLCA0XSwgYzogImFhIiwgZjogWzAsIDVdLCB0OiBbMCwgOV19LAogICAgICAgICAgIHthOiBbMSwgMl0sIGI6IFsxLCA4XSwgYzogIiIsIGY6IFswLCA1XSwgdDogWzIsIDVdfSwKICAgICAgICAgICB7YTogWzAsIDVdLCBiOiBbMiwgNV0sIGM6ICJ4eCIsIGY6IG51bGwsIHQ6IG51bGx9LAogICAgICAgICAgIHthOiBbMCwgMF0sIGI6IFsyLCAxMF0sIGM6ICJ4IiwgZjogbnVsbCwgdDogbnVsbH0sCiAgICAgICAgICAge2E6IFsxLCA1XSwgYjogWzIsIDVdLCBjOiAiIiwgZjogWzAsIDVdLCB0OiBbMSwgNV19LAogICAgICAgICAgIHthOiBbMiwgMF0sIGI6IFsyLCAzXSwgYzogIiIsIGY6IFswLCA1XSwgdDogWzIsIDJdfSwKICAgICAgICAgICB7YTogWzIsIDVdLCBiOiBbMywgMF0sIGM6ICJhXG5iIiwgZjogWzAsIDVdLCB0OiBbMiwgNV19LAogICAgICAgICAgIHthOiBbMiwgM10sIGI6IFszLCAwXSwgYzogIngiLCBmOiBbMCwgNV0sIHQ6IFsyLCAzXX0sCiAgICAgICAgICAge2E6IFsxLCAxXSwgYjogWzEsIDldLCBjOiAiMVxuMlxuMyIsIGY6IFswLCA1XSwgdDogWzQsIDVdfV0sIGZ1bmN0aW9uKHRlc3QpIHsKICAgIGNtLnNldFZhbHVlKCJhYWFhYWFhYWFhXG5iYmJiYmJiYmJiXG5jY2NjY2NjY2NjXG5kZGRkZGRkZFxuIik7CiAgICB2YXIgciA9IGNtLm1hcmtUZXh0KHtsaW5lOiAwLCBjaDogNX0sIHtsaW5lOiAyLCBjaDogNX0sCiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6ICJDb2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCJ9KTsKICAgIGNtLnJlcGxhY2VSYW5nZSh0ZXN0LmMsIHAodGVzdC5hKSwgcCh0ZXN0LmIpKTsKICAgIHZhciBmID0gci5maW5kKCk7CiAgICBlcVBvcyhmICYmIGYuZnJvbSwgcCh0ZXN0LmYpKTsgZXFQb3MoZiAmJiBmLnRvLCBwKHRlc3QudCkpOwogIH0pOwp9KTsKCnRlc3RDTSgibWFya1RleHRVbmRvIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgbWFya2VyMSwgbWFya2VyMiwgYm9va21hcms7CiAgbWFya2VyMSA9IGNtLm1hcmtUZXh0KHtsaW5lOiAwLCBjaDogMX0sIHtsaW5lOiAwLCBjaDogM30sCiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6ICJDb2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCJ9KTsKICBtYXJrZXIyID0gY20ubWFya1RleHQoe2xpbmU6IDAsIGNoOiAwfSwge2xpbmU6IDIsIGNoOiAxfSwKICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogIkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0In0pOwogIGJvb2ttYXJrID0gY20uc2V0Qm9va21hcmsoe2xpbmU6IDEsIGNoOiA1fSk7CiAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCl7CiAgICBjbS5yZXBsYWNlUmFuZ2UoImZvbyIsIHtsaW5lOiAwLCBjaDogMn0pOwogICAgY20ucmVwbGFjZVJhbmdlKCJiYXJcYmF6XGJ1Z1xuIiwge2xpbmU6IDIsIGNoOiAwfSwge2xpbmU6IDMsIGNoOiAwfSk7CiAgfSk7CiAgY20uc2V0VmFsdWUoIiIpOwogIGVxKG1hcmtlcjEuZmluZCgpLCBudWxsKTsgZXEobWFya2VyMi5maW5kKCksIG51bGwpOyBlcShib29rbWFyay5maW5kKCksIG51bGwpOwogIGNtLnVuZG8oKTsKICBlcVBvcyhib29rbWFyay5maW5kKCksIHtsaW5lOiAxLCBjaDogNX0pOwogIGNtLnVuZG8oKTsKICB2YXIgbTFQb3MgPSBtYXJrZXIxLmZpbmQoKSwgbTJQb3MgPSBtYXJrZXIyLmZpbmQoKTsKICBlcVBvcyhtMVBvcy5mcm9tLCB7bGluZTogMCwgY2g6IDF9KTsgZXFQb3MobTFQb3MudG8sIHtsaW5lOiAwLCBjaDogM30pOwogIGVxUG9zKG0yUG9zLmZyb20sIHtsaW5lOiAwLCBjaDogMH0pOyBlcVBvcyhtMlBvcy50bywge2xpbmU6IDIsIGNoOiAxfSk7CiAgZXFQb3MoYm9va21hcmsuZmluZCgpLCB7bGluZTogMSwgY2g6IDV9KTsKfSwge3ZhbHVlOiAiMTIzNFxuNTY3ODlcbjAwXG4ifSk7Cgp0ZXN0Q00oIm1hcmtUZXh0U3RheUdvbmUiLCBmdW5jdGlvbihjbSkgewogIHZhciBtMSA9IGNtLm1hcmtUZXh0KHtsaW5lOiAwLCBjaDogMH0sIHtsaW5lOiAwLCBjaDogMX0pOwogIGNtLnJlcGxhY2VSYW5nZSgiaGkiLCB7bGluZTogMCwgY2g6IDJ9KTsKICBtMS5jbGVhcigpOwogIGNtLnVuZG8oKTsKICBlcShtMS5maW5kKCksIG51bGwpOwp9LCB7dmFsdWU6ICJoZWxsbyJ9KTsKCnRlc3RDTSgibWFya0NsZWFyQmV0d2VlbiIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0VmFsdWUoImFhYVxuYmJiXG5jY2NcbmRkZFxuIik7CiAgY20ubWFya1RleHQoe2xpbmU6IDAsIGNoOiAwfSwge2xpbmU6IDJ9KTsKICBjbS5yZXBsYWNlUmFuZ2UoImFhYVxuYmJiXG5jY2MiLCB7bGluZTogMCwgY2g6IDB9LCB7bGluZTogMn0pOwogIGVxKGNtLmZpbmRNYXJrc0F0KHtsaW5lOiAxLCBjaDogMX0pLmxlbmd0aCwgMCk7Cn0pOwoKdGVzdENNKCJib29rbWFyayIsIGZ1bmN0aW9uKGNtKSB7CiAgZnVuY3Rpb24gcCh2KSB7IHJldHVybiB2ICYmIHtsaW5lOiB2WzBdLCBjaDogdlsxXX07IH0KICBmb3JFYWNoKFt7YTogWzEsIDBdLCBiOiBbMSwgMV0sIGM6ICIiLCBkOiBbMSwgNF19LAogICAgICAgICAgIHthOiBbMSwgMV0sIGI6IFsxLCAxXSwgYzogInh4IiwgZDogWzEsIDddfSwKICAgICAgICAgICB7YTogWzEsIDRdLCBiOiBbMSwgNV0sIGM6ICJhYiIsIGQ6IFsxLCA2XX0sCiAgICAgICAgICAge2E6IFsxLCA0XSwgYjogWzEsIDZdLCBjOiAiIiwgZDogbnVsbH0sCiAgICAgICAgICAge2E6IFsxLCA1XSwgYjogWzEsIDZdLCBjOiAiYWJjIiwgZDogWzEsIDVdfSwKICAgICAgICAgICB7YTogWzEsIDZdLCBiOiBbMSwgOF0sIGM6ICIiLCBkOiBbMSwgNV19LAogICAgICAgICAgIHthOiBbMSwgNF0sIGI6IFsxLCA0XSwgYzogIlxuXG4iLCBkOiBbMywgMV19LAogICAgICAgICAgIHtibTogWzEsIDldLCBhOiBbMSwgMV0sIGI6IFsxLCAxXSwgYzogIlxuIiwgZDogWzIsIDhdfV0sIGZ1bmN0aW9uKHRlc3QpIHsKICAgIGNtLnNldFZhbHVlKCIxMjM0NTY3ODkwXG4xMjM0NTY3ODkwXG4xMjM0NTY3ODkwIik7CiAgICB2YXIgYiA9IGNtLnNldEJvb2ttYXJrKHAodGVzdC5ibSkgfHwge2xpbmU6IDEsIGNoOiA1fSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UodGVzdC5jLCBwKHRlc3QuYSksIHAodGVzdC5iKSk7CiAgICBlcVBvcyhiLmZpbmQoKSwgcCh0ZXN0LmQpKTsKICB9KTsKfSk7Cgp0ZXN0Q00oImJ1ZzU3NyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0VmFsdWUoImFcbmIiKTsKICBjbS5jbGVhckhpc3RvcnkoKTsKICBjbS5zZXRWYWx1ZSgiZm9vb29vIik7CiAgY20udW5kbygpOwp9KTsKCnRlc3RDTSgic2Nyb2xsU25hcCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZSgxMDAsIDEwMCk7CiAgYWRkRG9jKGNtLCAyMDAsIDIwMCk7CiAgY20uc2V0Q3Vyc29yKHtsaW5lOiAxMDAsIGNoOiAxODB9KTsKICB2YXIgaW5mbyA9IGNtLmdldFNjcm9sbEluZm8oKTsKICBpcyhpbmZvLmxlZnQgPiAwICYmIGluZm8udG9wID4gMCk7CiAgY20uc2V0Q3Vyc29yKHtsaW5lOiAwLCBjaDogMH0pOwogIGluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgaXMoaW5mby5sZWZ0ID09IDAgJiYgaW5mby50b3AgPT0gMCwgInNjcm9sbGVkIGNsZWFuIHRvIHRvcCIpOwogIGNtLnNldEN1cnNvcih7bGluZTogMTAwLCBjaDogMTgwfSk7CiAgY20uc2V0Q3Vyc29yKHtsaW5lOiAxOTksIGNoOiAwfSk7CiAgaW5mbyA9IGNtLmdldFNjcm9sbEluZm8oKTsKICBpcyhpbmZvLmxlZnQgPT0gMCAmJiBpbmZvLnRvcCArIDIgPiBpbmZvLmhlaWdodCAtIGNtLmdldFNjcm9sbGVyRWxlbWVudCgpLmNsaWVudEhlaWdodCwgInNjcm9sbGVkIGNsZWFuIHRvIGJvdHRvbSIpOwp9KTsKCnRlc3RDTSgic2VsZWN0aW9uUG9zIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKDEwMCwgMTAwKTsKICBhZGREb2MoY20sIDIwMCwgMTAwKTsKICBjbS5zZXRTZWxlY3Rpb24oe2xpbmU6IDEsIGNoOiAxMDB9LCB7bGluZTogOTgsIGNoOiAxMDB9KTsKICB2YXIgbGluZVdpZHRoID0gY20uY2hhckNvb3Jkcyh7bGluZTogMCwgY2g6IDIwMH0sICJsb2NhbCIpLmxlZnQ7CiAgdmFyIGxpbmVIZWlnaHQgPSAoY20uY2hhckNvb3Jkcyh7bGluZTogOTl9KS50b3AgLSBjbS5jaGFyQ29vcmRzKHtsaW5lOiAwfSkudG9wKSAvIDEwMDsKICBjbS5zY3JvbGxUbygwLCAwKTsKICB2YXIgc2VsRWx0ID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIkNvZGVNaXJyb3Itc2VsZWN0ZWQiKTsKICB2YXIgb3V0ZXIgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIHZhciBzYXdNaWRkbGUsIHNhd1RvcCwgc2F3Qm90dG9tOwogIGZvciAodmFyIGkgPSAwLCBlID0gc2VsRWx0Lmxlbmd0aDsgaSA8IGU7ICsraSkgewogICAgdmFyIGJveCA9IHNlbEVsdFtpXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHZhciBhdExlZnQgPSBib3gubGVmdCAtIG91dGVyLmxlZnQgPCAzMDsKICAgIHZhciB3aWR0aCA9IGJveC5yaWdodCAtIGJveC5sZWZ0OwogICAgdmFyIGF0UmlnaHQgPSBib3gucmlnaHQgLSBvdXRlci5sZWZ0ID4gLjggKiBsaW5lV2lkdGg7CiAgICBpZiAoYXRMZWZ0ICYmIGF0UmlnaHQpIHsKICAgICAgc2F3TWlkZGxlID0gdHJ1ZTsKICAgICAgaXMoYm94LmJvdHRvbSAtIGJveC50b3AgPiA5MCAqIGxpbmVIZWlnaHQsICJtaWRkbGUgaGlnaCIpOwogICAgICBpcyh3aWR0aCA+IC45ICogbGluZVdpZHRoLCAibWlkZGxlIHdpZGUiKTsKICAgIH0gZWxzZSB7CiAgICAgIGlzKHdpZHRoID4gLjQgKiBsaW5lV2lkdGgsICJ0b3AvYm90IHdpZGUgZW5vdWdoIik7CiAgICAgIGlzKHdpZHRoIDwgLjYgKiBsaW5lV2lkdGgsICJ0b3AvYm90IHNsaW0gZW5vdWdoIik7CiAgICAgIGlmIChhdExlZnQpIHsKICAgICAgICBzYXdCb3R0b20gPSB0cnVlOwogICAgICAgIGlzKGJveC50b3AgLSBvdXRlci50b3AgPiA5NiAqIGxpbmVIZWlnaHQsICJib3QgYmVsb3ciKTsKICAgICAgfSBlbHNlIGlmIChhdFJpZ2h0KSB7CiAgICAgICAgc2F3VG9wID0gdHJ1ZTsKICAgICAgICBpcyhib3gudG9wIC0gb3V0ZXIudG9wIDwgMi4xICogbGluZUhlaWdodCwgInRvcCBhYm92ZSIpOwogICAgICB9CiAgICB9CiAgfQogIGlzKHNhd1RvcCAmJiBzYXdCb3R0b20gJiYgc2F3TWlkZGxlLCAiYWxsIHBhcnRzIik7Cn0sIG51bGwpOwoKdGVzdENNKCJyZXN0b3JlSGlzdG9yeSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0VmFsdWUoImFiY1xuZGVmIik7CiAgY20uc2V0TGluZSgxLCAiaGVsbG8iKTsKICBjbS5zZXRMaW5lKDAsICJnb29wIik7CiAgY20udW5kbygpOwogIHZhciBzdG9yZWRWYWwgPSBjbS5nZXRWYWx1ZSgpLCBzdG9yZWRIaXN0ID0gY20uZ2V0SGlzdG9yeSgpOwogIGlmICh3aW5kb3cuSlNPTikgc3RvcmVkSGlzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc3RvcmVkSGlzdCkpOwogIGVxKHN0b3JlZFZhbCwgImFiY1xuaGVsbG8iKTsKICBjbS5zZXRWYWx1ZSgiIik7CiAgY20uY2xlYXJIaXN0b3J5KCk7CiAgZXEoY20uaGlzdG9yeVNpemUoKS51bmRvLCAwKTsKICBjbS5zZXRWYWx1ZShzdG9yZWRWYWwpOwogIGNtLnNldEhpc3Rvcnkoc3RvcmVkSGlzdCk7CiAgY20ucmVkbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJnb29wXG5oZWxsbyIpOwogIGNtLnVuZG8oKTsgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhYmNcbmRlZiIpOwp9KTsKCnRlc3RDTSgiZG91YmxlU2Nyb2xsYmFyIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgZHVtbXkgPSBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKSk7CiAgZHVtbXkuc3R5bGUuY3NzVGV4dCA9ICJoZWlnaHQ6IDUwcHg7IG92ZXJmbG93OiBzY3JvbGw7IHdpZHRoOiA1MHB4IjsKICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBkdW1teS5vZmZzZXRXaWR0aCArIDEgLSBkdW1teS5jbGllbnRXaWR0aDsKICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGR1bW15KTsKICBjbS5zZXRTaXplKG51bGwsIDEwMCk7CiAgYWRkRG9jKGNtLCAxLCAzMDApOwogIHZhciB3cmFwID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKTsKICBpcyh3cmFwLm9mZnNldFdpZHRoIC0gYnlDbGFzc05hbWUod3JhcCwgIkNvZGVNaXJyb3ItbGluZXMiKVswXS5vZmZzZXRXaWR0aCA8PSBzY3JvbGxiYXJXaWR0aCAqIDEuNSk7Cn0pOwoKdGVzdENNKCJ3ZWlyZExpbmVicmVha3MiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFZhbHVlKCJmb29cbmJhclxyYmF6XHJcbnF1dXhcblxycGxvcCIpOwogIGlzKGNtLmdldFZhbHVlKCksICJmb29cbmJhclxuYmF6XG5xdXV4XG5cbnBsb3AiKTsKICBpcyhjbS5saW5lQ291bnQoKSwgNik7CiAgY20uc2V0VmFsdWUoIlxuXG4iKTsKICBpcyhjbS5saW5lQ291bnQoKSwgMyk7Cn0pOwoKdGVzdENNKCJzZXRTaXplIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKDEwMCwgMTAwKTsKICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCk7CiAgaXMod3JhcC5vZmZzZXRXaWR0aCwgMTAwKTsKICBpcyh3cmFwLm9mZnNldEhlaWdodCwgMTAwKTsKICBjbS5zZXRTaXplKCIxMDAlIiwgIjNlbSIpOwogIGlzKHdyYXAuc3R5bGUud2lkdGgsICIxMDAlIik7CiAgaXMod3JhcC5zdHlsZS5oZWlnaHQsICIzZW0iKTsKICBjbS5zZXRTaXplKG51bGwsIDQwKTsKICBpcyh3cmFwLnN0eWxlLndpZHRoLCAiMTAwJSIpOwogIGlzKHdyYXAuc3R5bGUuaGVpZ2h0LCAiNDBweCIpOwp9KTsKCmZ1bmN0aW9uIGZvbGRMaW5lcyhjbSwgc3RhcnQsIGVuZCwgYXV0b0NsZWFyKSB7CiAgcmV0dXJuIGNtLm1hcmtUZXh0KHtsaW5lOiBzdGFydCwgY2g6IDB9LCB7bGluZTogZW5kIC0gMX0sIHsKICAgIGluY2x1c2l2ZUxlZnQ6IHRydWUsCiAgICBpbmNsdXNpdmVSaWdodDogdHJ1ZSwKICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgIGNsZWFyT25FbnRlcjogYXV0b0NsZWFyCiAgfSk7Cn0KCnRlc3RDTSgiY29sbGFwc2VkTGluZXMiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgNCwgMTApOwogIHZhciByYW5nZSA9IGZvbGRMaW5lcyhjbSwgNCwgNSksIGNsZWFyZWQgPSAwOwogIENvZGVNaXJyb3Iub24ocmFuZ2UsICJjbGVhciIsIGZ1bmN0aW9uKCkge2NsZWFyZWQrKzt9KTsKICBjbS5zZXRDdXJzb3Ioe2xpbmU6IDMsIGNoOiAwfSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0xpbmVEb3duKGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDUsIGNoOiAwfSk7CiAgY20uc2V0TGluZSgzLCAiYWJjZGVmZyIpOwogIGNtLnNldEN1cnNvcih7bGluZTogMywgY2g6IDZ9KTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTGluZURvd24oY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogNSwgY2g6IDR9KTsKICBjbS5zZXRMaW5lKDMsICJhYiIpOwogIGNtLnNldEN1cnNvcih7bGluZTogMywgY2g6IDJ9KTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTGluZURvd24oY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogNSwgY2g6IDJ9KTsKICByYW5nZS5jbGVhcigpOyByYW5nZS5jbGVhcigpOwogIGVxKGNsZWFyZWQsIDEpOwp9KTsKCnRlc3RDTSgiaGlkZGVuTGluZXNBdXRvVW5mb2xkIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgcmFuZ2UgPSBmb2xkTGluZXMoY20sIDEsIDMsIHRydWUpLCBjbGVhcmVkID0gMDsKICBDb2RlTWlycm9yLm9uKHJhbmdlLCAiY2xlYXIiLCBmdW5jdGlvbigpIHtjbGVhcmVkKys7fSk7CiAgY20uc2V0Q3Vyc29yKHtsaW5lOiAzLCBjaDogMH0pOwogIGVxKGNsZWFyZWQsIDApOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXEoY2xlYXJlZCwgMSk7CiAgcmFuZ2UgPSBmb2xkTGluZXMoY20sIDEsIDMsIHRydWUpOwogIENvZGVNaXJyb3Iub24ocmFuZ2UsICJjbGVhciIsIGZ1bmN0aW9uKCkge2NsZWFyZWQrKzt9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDMsIGNoOiAwfSk7CiAgY20uc2V0Q3Vyc29yKHtsaW5lOiAwLCBjaDogM30pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxKGNsZWFyZWQsIDIpOwp9LCB7dmFsdWU6ICJhYmNcbmRlZlxuZ2hpXG5qa2wifSk7Cgp0ZXN0Q00oImhpZGRlbkxpbmVzU2VsZWN0QWxsIiwgZnVuY3Rpb24oY20pIHsgIC8vIElzc3VlICM0ODQKICBhZGREb2MoY20sIDQsIDIwKTsKICBmb2xkTGluZXMoY20sIDAsIDEwKTsKICBmb2xkTGluZXMoY20sIDExLCAyMCk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5zZWxlY3RBbGwoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcih0cnVlKSwge2xpbmU6IDEwLCBjaDogMH0pOwogIGVxUG9zKGNtLmdldEN1cnNvcihmYWxzZSksIHtsaW5lOiAxMCwgY2g6IDR9KTsKfSk7CgoKdGVzdENNKCJldmVyeXRoaW5nRm9sZGVkIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDIsIDIpOwogIGZ1bmN0aW9uIGVudGVyUHJlc3MoKSB7CiAgICBjbS50cmlnZ2VyT25LZXlEb3duKHt0eXBlOiAia2V5ZG93biIsIGtleUNvZGU6IDEzLCBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKXt9LCBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCl7fX0pOwogIH0KICB2YXIgZm9sZCA9IGZvbGRMaW5lcyhjbSwgMCwgMik7CiAgZW50ZXJQcmVzcygpOwogIGVxKGNtLmdldFZhbHVlKCksICJ4eFxueHgiKTsKICBmb2xkLmNsZWFyKCk7CiAgZm9sZCA9IGZvbGRMaW5lcyhjbSwgMCwgMiwgdHJ1ZSk7CiAgZXEoZm9sZC5maW5kKCksIG51bGwpOwogIGVudGVyUHJlc3MoKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiXG54eFxueHgiKTsKfSk7Cgp0ZXN0Q00oInN0cnVjdHVyZWRGb2xkIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDQsIDgpOwogIHZhciByYW5nZSA9IGNtLm1hcmtUZXh0KHtsaW5lOiAxLCBjaDogMn0sIHtsaW5lOiA2LCBjaDogMn0sIHsKICAgIHJlcGxhY2VkV2l0aDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIlEiKQogIH0pOwogIGNtLnNldEN1cnNvcigwLCAzKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTGluZURvd24oY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogNiwgY2g6IDJ9KTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvQ2hhckxlZnQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMSwgY2g6IDJ9KTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmRlbENoYXJBZnRlcihjbSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgInh4eHhcbnh4eHhcbnh4eHgiKTsKICBhZGREb2MoY20sIDQsIDgpOwogIHJhbmdlID0gY20ubWFya1RleHQoe2xpbmU6IDEsIGNoOiAyfSwge2xpbmU6IDYsIGNoOiAyfSwgewogICAgcmVwbGFjZWRXaXRoOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgieCIpLAogICAgY2xlYXJPbkVudGVyOiB0cnVlCiAgfSk7CiAgdmFyIGNsZWFyZWQgPSAwOwogIENvZGVNaXJyb3Iub24ocmFuZ2UsICJjbGVhciIsIGZ1bmN0aW9uKCl7KytjbGVhcmVkO30pOwogIGNtLnNldEN1cnNvcigwLCAzKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTGluZURvd24oY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogNiwgY2g6IDJ9KTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvQ2hhckxlZnQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogNiwgY2g6IDF9KTsKICBlcShjbGVhcmVkLCAxKTsKICByYW5nZS5jbGVhcigpOwogIGVxKGNsZWFyZWQsIDEpOwogIHJhbmdlID0gY20ubWFya1RleHQoe2xpbmU6IDEsIGNoOiAyfSwge2xpbmU6IDYsIGNoOiAyfSwgewogICAgcmVwbGFjZWRXaXRoOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiUSIpLAogICAgY2xlYXJPbkVudGVyOiB0cnVlCiAgfSk7CiAgcmFuZ2UuY2xlYXIoKTsKICBjbS5zZXRDdXJzb3IoMSwgMik7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJSaWdodChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogM30pOwp9LCBudWxsKTsKCnRlc3RDTSgibmVzdGVkRm9sZCIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAxMCwgMyk7CiAgZnVuY3Rpb24gZm9sZChsbCwgY2wsIGxyLCBjcikgewogICAgcmV0dXJuIGNtLm1hcmtUZXh0KHtsaW5lOiBsbCwgY2g6IGNsfSwge2xpbmU6IGxyLCBjaDogY3J9LCB7Y29sbGFwc2VkOiB0cnVlfSk7CiAgfQogIHZhciBpbm5lcjEgPSBmb2xkKDAsIDYsIDEsIDMpLCBpbm5lcjIgPSBmb2xkKDAsIDIsIDEsIDgpLCBvdXRlciA9IGZvbGQoMCwgMSwgMiwgMyksIGlubmVyMCA9IGZvbGQoMCwgNSwgMCwgNik7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyUmlnaHQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMiwgY2g6IDN9KTsKICBpbm5lcjAuY2xlYXIoKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvQ2hhckxlZnQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDF9KTsKICBvdXRlci5jbGVhcigpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyUmlnaHQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDJ9KTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvQ2hhclJpZ2h0KGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDEsIGNoOiA4fSk7CiAgaW5uZXIyLmNsZWFyKCk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJMZWZ0KGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDEsIGNoOiA3fSk7CiAgY20uc2V0Q3Vyc29yKDAsIDUpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyUmlnaHQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDZ9KTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvQ2hhclJpZ2h0KGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDEsIGNoOiAzfSk7Cn0pOwoKdGVzdENNKCJiYWROZXN0ZWRGb2xkIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDQsIDQpOwogIGNtLm1hcmtUZXh0KHtsaW5lOiAwLCBjaDogMn0sIHtsaW5lOiAzLCBjaDogMn0sIHtjb2xsYXBzZWQ6IHRydWV9KTsKICB2YXIgY2F1Z2h0OwogIHRyeSB7Y20ubWFya1RleHQoe2xpbmU6IDAsIGNoOiAxfSwge2xpbmU6IDAsIGNoOiAzfSwge2NvbGxhcHNlZDogdHJ1ZX0pO30KICBjYXRjaChlKSB7Y2F1Z2h0ID0gZTt9CiAgaXMoY2F1Z2h0IGluc3RhbmNlb2YgRXJyb3IsICJubyBlcnJvciIpOwogIGlzKC9vdmVybGFwL2kudGVzdChjYXVnaHQubWVzc2FnZSksICJ3cm9uZyBlcnJvciIpOwp9KTsKCnRlc3RDTSgiaW5saW5lV2lkZ2V0IiwgZnVuY3Rpb24oY20pIHsKICB2YXIgdyA9IGNtLnNldEJvb2ttYXJrKHtsaW5lOiAwLCBjaDogMn0sIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ1dSIpKTsKICBjbS5zZXRDdXJzb3IoMCwgMik7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0xpbmVEb3duKGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDEsIGNoOiA0fSk7CiAgY20uc2V0Q3Vyc29yKDAsIDIpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImhpIik7CiAgZXFQb3Mody5maW5kKCksIHtsaW5lOiAwLCBjaDogMn0pOwogIGNtLnNldEN1cnNvcigwLCAxKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJheSIpOwogIGVxUG9zKHcuZmluZCgpLCB7bGluZTogMCwgY2g6IDR9KTsKICBlcShjbS5nZXRMaW5lKDApLCAidWF5dWhpdXUiKTsKfSwge3ZhbHVlOiAidXV1dVxudXV1dXV1In0pOwoKdGVzdENNKCJ3cmFwcGluZ0FuZFJlc2l6aW5nIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKG51bGwsICJhdXRvIik7CiAgY20uc2V0T3B0aW9uKCJsaW5lV3JhcHBpbmciLCB0cnVlKTsKICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCksIGgwID0gd3JhcC5vZmZzZXRIZWlnaHQ7CiAgdmFyIGRvYyA9ICJ4eHggeHh4IHh4eCB4eHggeHh4IjsKICBjbS5zZXRWYWx1ZShkb2MpOwogIGZvciAodmFyIHN0ZXAgPSAxMCwgdyA9IGNtLmNoYXJDb29yZHMoe2xpbmU6IDAsIGNoOiAxOH0sICJkaXYiKS5yaWdodDs7IHcgKz0gc3RlcCkgewogICAgY20uc2V0U2l6ZSh3KTsKICAgIGlmICh3cmFwLm9mZnNldEhlaWdodCA8PSBoMCAqIChvcGVyYV9sdDEwID8gMS4yIDogMS41KSkgewogICAgICBpZiAoc3RlcCA9PSAxMCkgeyB3IC09IDEwOyBzdGVwID0gMTsgfQogICAgICBlbHNlIGJyZWFrOwogICAgfQogIH0KICAvLyBFbnN1cmUgdGhhdCBwdXR0aW5nIHRoZSBjdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgbWF4aW1hbGx5IGxvbmcKICAvLyBsaW5lIGRvZXNuJ3QgY2F1c2Ugd3JhcHBpbmcgdG8gaGFwcGVuLgogIGNtLnNldEN1cnNvcih7bGluZTogMCwgY2g6IGRvYy5sZW5ndGh9KTsKICBlcSh3cmFwLm9mZnNldEhlaWdodCwgaDApOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oIngiKTsKICBpcyh3cmFwLm9mZnNldEhlaWdodCA+IGgwLCAid3JhcHBpbmcgaGFwcGVucyIpOwogIC8vIE5vdyBhZGQgYSBtYXgtaGVpZ2h0IGFuZCwgaW4gYSBkb2N1bWVudCBjb25zaXN0aW5nIG9mCiAgLy8gYWxtb3N0LXdyYXBwZWQgbGluZXMsIGdvIG92ZXIgaXQgc28gdGhhdCBhIHNjcm9sbGJhciBhcHBlYXJzLgogIGNtLnNldFZhbHVlKGRvYyArICJcbiIgKyBkb2MgKyAiXG4iKTsKICBjbS5nZXRTY3JvbGxlckVsZW1lbnQoKS5zdHlsZS5tYXhIZWlnaHQgPSAiMTAwcHgiOwogIGNtLnJlcGxhY2VSYW5nZSgiXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4hXG4iLCB7bGluZTogMiwgY2g6IDB9KTsKICBmb3JFYWNoKFt7bGluZTogMCwgY2g6IGRvYy5sZW5ndGh9LCB7bGluZTogMCwgY2g6IGRvYy5sZW5ndGggLSAxfSwKICAgICAgICAgICB7bGluZTogMCwgY2g6IDB9LCB7bGluZTogMSwgY2g6IGRvYy5sZW5ndGh9LCB7bGluZTogMSwgY2g6IGRvYy5sZW5ndGggLSAxfV0sCiAgICAgICAgICBmdW5jdGlvbihwb3MpIHsKICAgIHZhciBjb29yZHMgPSBjbS5jaGFyQ29vcmRzKHBvcyk7CiAgICBlcVBvcyhwb3MsIGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IGNvb3Jkcy5sZWZ0ICsgMiwgdG9wOiBjb29yZHMudG9wICsgNX0pKTsKICB9KTsKfSwgbnVsbCwgaWVfbHQ4KTsKCnRlc3RDTSgibWVhc3VyZUVuZE9mTGluZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZShudWxsLCAiYXV0byIpOwogIHZhciBpbm5lciA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJDb2RlTWlycm9yLWxpbmVzIilbMF0uZmlyc3RDaGlsZDsKICB2YXIgbGggPSBpbm5lci5vZmZzZXRIZWlnaHQ7CiAgZm9yICh2YXIgc3RlcCA9IDEwLCB3ID0gY20uY2hhckNvb3Jkcyh7bGluZTogMCwgY2g6IDd9LCAiZGl2IikucmlnaHQ7OyB3ICs9IHN0ZXApIHsKICAgIGNtLnNldFNpemUodyk7CiAgICBpZiAoaW5uZXIub2Zmc2V0SGVpZ2h0IDwgMi41ICogbGgpIHsKICAgICAgaWYgKHN0ZXAgPT0gMTApIHsgdyAtPSAxMDsgc3RlcCA9IDE7IH0KICAgICAgZWxzZSBicmVhazsKICAgIH0KICB9CiAgY20uc2V0VmFsdWUoY20uZ2V0VmFsdWUoKSArICJcblxuIik7CiAgdmFyIGVuZFBvcyA9IGNtLmNoYXJDb29yZHMoe2xpbmU6IDAsIGNoOiAxOH0sICJsb2NhbCIpOwogIGlzKGVuZFBvcy50b3AgPiBsaCAqIC44LCAibm90IGF0IHRvcCIpOwogIGlzKGVuZFBvcy5sZWZ0ID4gdyAtIDIwLCAibm90IGF0IHJpZ2h0Iik7CiAgZW5kUG9zID0gY20uY2hhckNvb3Jkcyh7bGluZTogMCwgY2g6IDE4fSk7CiAgZXFQb3MoY20uY29vcmRzQ2hhcih7bGVmdDogZW5kUG9zLmxlZnQsIHRvcDogZW5kUG9zLnRvcCArIDV9KSwge2xpbmU6IDAsIGNoOiAxOH0pOwp9LCB7bW9kZTogInRleHQvaHRtbCIsIHZhbHVlOiAiPCEtLSBmb28gYmFycnIgLS0+IiwgbGluZVdyYXBwaW5nOiB0cnVlfSwgaWVfbHQ4IHx8IG9wZXJhX2x0MTApOwoKdGVzdENNKCJzY3JvbGxWZXJ0aWNhbGx5QW5kSG9yaXpvbnRhbGx5IiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKDEwMCwgMTAwKTsKICBhZGREb2MoY20sIDQwLCA0MCk7CiAgY20uc2V0Q3Vyc29yKDM5KTsKICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCksIGJhciA9IGJ5Q2xhc3NOYW1lKHdyYXAsICJDb2RlTWlycm9yLXZzY3JvbGxiYXIiKVswXTsKICBpcyhiYXIub2Zmc2V0SGVpZ2h0IDwgd3JhcC5vZmZzZXRIZWlnaHQsICJ2ZXJ0aWNhbCBzY3JvbGxiYXIgbGltaXRlZCBieSBob3Jpem9udGFsIG9uZSIpOwogIHZhciBjdXJzb3JCb3ggPSBieUNsYXNzTmFtZSh3cmFwLCAiQ29kZU1pcnJvci1jdXJzb3IiKVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICB2YXIgZWRpdG9yQm94ID0gd3JhcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBpcyhjdXJzb3JCb3guYm90dG9tIDwgZWRpdG9yQm94LnRvcCArIGNtLmdldFNjcm9sbGVyRWxlbWVudCgpLmNsaWVudEhlaWdodCwKICAgICAiYm90dG9tIGxpbmUgdmlzaWJsZSIpOwp9LCB7bGluZU51bWJlcnM6IHRydWV9KTsKCnRlc3RDTSgibW92ZVZzdHVjayIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIGxpbmVzID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIkNvZGVNaXJyb3ItbGluZXMiKVswXS5maXJzdENoaWxkLCBoMCA9IGxpbmVzLm9mZnNldEhlaWdodDsKICB2YXIgdmFsID0gImZvb29vb29vb29vb29vb29vb29vb29vb29vIGJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFyXG4iOwogIGNtLnNldFZhbHVlKHZhbCk7CiAgZm9yICh2YXIgdyA9IGNtLmNoYXJDb29yZHMoe2xpbmU6IDAsIGNoOiAyNn0sICJkaXYiKS5yaWdodCAqIDIuODs7IHcgKz0gNSkgewogICAgY20uc2V0U2l6ZSh3KTsKICAgIGlmIChsaW5lcy5vZmZzZXRIZWlnaHQgPD0gMy41ICogaDApIGJyZWFrOwogIH0KICBjbS5zZXRDdXJzb3Ioe2xpbmU6IDAsIGNoOiB2YWwubGVuZ3RoIC0gMX0pOwogIGNtLm1vdmVWKC0xLCAibGluZSIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDI2fSk7Cn0sIHtsaW5lV3JhcHBpbmc6IHRydWV9LCBpZV9sdDggfHwgb3BlcmFfbHQxMCk7Cgp0ZXN0Q00oImNsaWNrVGFiIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgcDAgPSBjbS5jaGFyQ29vcmRzKHtsaW5lOiAwLCBjaDogMH0pOwogIGVxUG9zKGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IHAwLmxlZnQgKyA1LCB0b3A6IHAwLnRvcCArIDV9KSwge2xpbmU6IDAsIGNoOiAwfSk7CiAgZXFQb3MoY20uY29vcmRzQ2hhcih7bGVmdDogcDAucmlnaHQgLSA1LCB0b3A6IHAwLnRvcCArIDV9KSwge2xpbmU6IDAsIGNoOiAxfSk7Cn0sIHt2YWx1ZTogIlx0XG5cbiIsIGxpbmVXcmFwcGluZzogdHJ1ZSwgdGFiU2l6ZTogOH0pOwoKdGVzdENNKCJ2ZXJ0aWNhbFNjcm9sbCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZSgxMDAsIDIwMCk7CiAgY20uc2V0VmFsdWUoImZvb1xuYmFyXG5iYXpcbiIpOwogIHZhciBzYyA9IGNtLmdldFNjcm9sbGVyRWxlbWVudCgpLCBiYXNlV2lkdGggPSBzYy5zY3JvbGxXaWR0aDsKICBjbS5zZXRMaW5lKDAsICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFoIik7CiAgaXMoc2Muc2Nyb2xsV2lkdGggPiBiYXNlV2lkdGgsICJzY3JvbGxiYXIgcHJlc2VudCIpOwogIGNtLnNldExpbmUoMCwgImZvbyIpOwogIGVxKHNjLnNjcm9sbFdpZHRoLCBiYXNlV2lkdGgsICJzY3JvbGxiYXIgZ29uZSIpOwogIGNtLnNldExpbmUoMCwgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWgiKTsKICBjbS5zZXRMaW5lKDEsICJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmgiKTsKICBpcyhzYy5zY3JvbGxXaWR0aCA+IGJhc2VXaWR0aCwgInByZXNlbnQgYWdhaW4iKTsKICB2YXIgY3VyV2lkdGggPSBzYy5zY3JvbGxXaWR0aDsKICBjbS5zZXRMaW5lKDAsICJmb28iKTsKICBpcyhzYy5zY3JvbGxXaWR0aCA8IGN1cldpZHRoLCAic2Nyb2xsYmFyIHNtYWxsZXIiKTsKICBpcyhzYy5zY3JvbGxXaWR0aCA+IGJhc2VXaWR0aCwgImJ1dCBzdGlsbCBwcmVzZW50Iik7Cn0pOwoKdGVzdENNKCJleHRyYUtleXMiLCBmdW5jdGlvbihjbSkgewogIHZhciBvdXRjb21lOwogIGZ1bmN0aW9uIGZha2VLZXkoZXhwZWN0ZWQsIGNvZGUsIHByb3BzKSB7CiAgICBpZiAodHlwZW9mIGNvZGUgPT0gInN0cmluZyIpIGNvZGUgPSBjb2RlLmNoYXJDb2RlQXQoMCk7CiAgICB2YXIgZSA9IHt0eXBlOiAia2V5ZG93biIsIGtleUNvZGU6IGNvZGUsIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpe30sIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKXt9fTsKICAgIGlmIChwcm9wcykgZm9yICh2YXIgbiBpbiBwcm9wcykgZVtuXSA9IHByb3BzW25dOwogICAgb3V0Y29tZSA9IG51bGw7CiAgICBjbS50cmlnZ2VyT25LZXlEb3duKGUpOwogICAgZXEob3V0Y29tZSwgZXhwZWN0ZWQpOwogIH0KICBDb2RlTWlycm9yLmNvbW1hbmRzLnRlc3RDb21tYW5kID0gZnVuY3Rpb24oKSB7b3V0Y29tZSA9ICJ0YyI7fTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvVGVzdENvbW1hbmQgPSBmdW5jdGlvbigpIHtvdXRjb21lID0gImd0YyI7fTsKICBjbS5zZXRPcHRpb24oImV4dHJhS2V5cyIsIHsiU2hpZnQtWCI6IGZ1bmN0aW9uKCkge291dGNvbWUgPSAic3giO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgiOiBmdW5jdGlvbigpIHtvdXRjb21lID0gIngiO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkN0cmwtQWx0LVUiOiBmdW5jdGlvbigpIHtvdXRjb21lID0gImNhdSI7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5kIjogInRlc3RDb21tYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9tZSI6ICJnb1Rlc3RDb21tYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFiIjogZmFsc2V9KTsKICBmYWtlS2V5KG51bGwsICJVIik7CiAgZmFrZUtleSgiY2F1IiwgIlUiLCB7Y3RybEtleTogdHJ1ZSwgYWx0S2V5OiB0cnVlfSk7CiAgZmFrZUtleShudWxsLCAiVSIsIHtzaGlmdEtleTogdHJ1ZSwgY3RybEtleTogdHJ1ZSwgYWx0S2V5OiB0cnVlfSk7CiAgZmFrZUtleSgieCIsICJYIik7CiAgZmFrZUtleSgic3giLCAiWCIsIHtzaGlmdEtleTogdHJ1ZX0pOwogIGZha2VLZXkoInRjIiwgMzUpOwogIGZha2VLZXkobnVsbCwgMzUsIHtzaGlmdEtleTogdHJ1ZX0pOwogIGZha2VLZXkoImd0YyIsIDM2KTsKICBmYWtlS2V5KCJndGMiLCAzNiwge3NoaWZ0S2V5OiB0cnVlfSk7CiAgZmFrZUtleShudWxsLCA5KTsKfSwgbnVsbCwgd2luZG93Lm9wZXJhICYmIG1hYyk7Cgp0ZXN0Q00oIndvcmRNb3ZlbWVudENvbW1hbmRzIiwgZnVuY3Rpb24oY20pIHsKICBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDB9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogN30pOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogNX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDAsIGNoOiAxMn0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogOX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogMX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMSwgY2g6IDl9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDEsIGNoOiAxM30pOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDIsIGNoOiAwfSk7Cn0sIHt2YWx1ZTogInRoaXMgaXMgKHRoZSkgZmlyc3RsaW5lLlxuYSBmb28xMlx1MDBlOVx1MDBmOFx1MDBkN2JhclxuIn0pOwoKdGVzdENNKCJjaGFyTW92ZW1lbnRDb21tYW5kcyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsgY20uZXhlY0NvbW1hbmQoImdvQ29sdW1uTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDB9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogMn0pOwogIGNtLnNldEN1cnNvcih7bGluZTogMSwgY2g6IDB9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29Db2x1bW5MZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogMH0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogNX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NvbHVtblJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogNX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMSwgY2g6IDB9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRW5kIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogNX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVTdGFydFNtYXJ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogMX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVTdGFydFNtYXJ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogMH0pOwogIGNtLnNldEN1cnNvcih7bGluZTogMiwgY2g6IDB9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvQ29sdW1uUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDIsIGNoOiAwfSk7Cn0sIHt2YWx1ZTogImxpbmUxXG4gaW5lMlxuIn0pOwoKdGVzdENNKCJ2ZXJ0aWNhbE1vdmVtZW50Q29tbWFuZHMiLCBmdW5jdGlvbihjbSkgewogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDB9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGlmICghcGhhbnRvbSkgLy8gVGhpcyBmYWlscyBpbiBQaGFudG9tSlMsIHRob3VnaCBub3QgaW4gYSByZWFsIFdlYmtpdAogICAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogMH0pOwogIGNtLnNldEN1cnNvcih7bGluZTogMSwgY2g6IDEyfSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDIsIGNoOiA1fSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDMsIGNoOiAwfSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAyLCBjaDogNX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMSwgY2g6IDEyfSk7CiAgY20uZXhlY0NvbW1hbmQoImdvUGFnZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDUsIGNoOiAwfSk7CiAgY20uZXhlY0NvbW1hbmQoImdvUGFnZURvd24iKTsgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDUsIGNoOiAwfSk7CiAgY20uZXhlY0NvbW1hbmQoImdvUGFnZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogMH0pOwp9LCB7dmFsdWU6ICJsaW5lMVxubG9uZyBsb25nIGxpbmUyXG5saW5lM1xuXG5saW5lNVxuIn0pOwoKdGVzdENNKCJ2ZXJ0aWNhbE1vdmVtZW50Q29tbWFuZHNXcmFwcGluZyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZSgxMjApOwogIGNtLnNldEN1cnNvcih7bGluZTogMCwgY2g6IDV9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxKGNtLmdldEN1cnNvcigpLmxpbmUsIDApOwogIGlzKGNtLmdldEN1cnNvcigpLmNoID4gNSwgIm1vdmVkIGJleW9uZCB3cmFwIik7CiAgZm9yICh2YXIgaSA9IDA7IDsgKytpKSB7CiAgICBpcyhpIDwgMjAsICJubyBlbmRsZXNzIGxvb3AiKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICBpZiAoY3VyLmxpbmUgPT0gMSkgZXEoY3VyLmNoLCA1KTsKICAgIGlmIChjdXIubGluZSA9PSAyKSB7IGVxKGN1ci5jaCwgMSk7IGJyZWFrOyB9CiAgfQp9LCB7dmFsdWU6ICJhIHZlcnkgbG9uZyBsaW5lIHRoYXQgd3JhcHMgYXJvdW5kIHNvbWVob3cgc28gdGhhdCB3ZSBjYW4gdGVzdCBjdXJzb3IgbW92ZW1lbnRcbnNob3J0b25lXG5rIiwKICAgIGxpbmVXcmFwcGluZzogdHJ1ZX0pOwoKdGVzdENNKCJydGxNb3ZlbWVudCIsIGZ1bmN0aW9uKGNtKSB7CiAgZm9yRWFjaChbItiu2K3YrCIsICLYrtitYWJj2K7YrdisIiwgImFi2K7Yrdiu2K3YrGNkIiwgImFi2K5kZSIsICJhYtiu2K0yMzQy2K4x2K3YrCIsICLYrjHYrTLYrtitM9iteNisIiwgItiu2K1jZCIsICIx2K7YrWNkIiwgImFiY2Rl2K0x2KwiXSwgZnVuY3Rpb24obGluZSkgewogICAgdmFyIGludiA9IGxpbmUuY2hhckF0KDApID09ICLYriI7CiAgICBjbS5zZXRWYWx1ZShsaW5lICsgIlxuIik7IGNtLmV4ZWNDb21tYW5kKGludiA/ICJnb0xpbmVFbmQiIDogImdvTGluZVN0YXJ0Iik7CiAgICB2YXIgY3Vyc29yID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIkNvZGVNaXJyb3ItY3Vyc29yIilbMF07CiAgICB2YXIgcHJldlggPSBjdXJzb3Iub2Zmc2V0TGVmdCwgcHJldlkgPSBjdXJzb3Iub2Zmc2V0VG9wOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbGluZS5sZW5ndGg7ICsraSkgewogICAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICAgICAgaWYgKGkgPT0gbGluZS5sZW5ndGgpIGlzKGN1cnNvci5vZmZzZXRUb3AgPiBwcmV2WSwgIm5leHQgbGluZSIpOwogICAgICBlbHNlIGlzKGN1cnNvci5vZmZzZXRMZWZ0ID4gcHJldlgsICJtb3ZlZCByaWdodCIpOwogICAgICBwcmV2WCA9IGN1cnNvci5vZmZzZXRMZWZ0OyBwcmV2WSA9IGN1cnNvci5vZmZzZXRUb3A7CiAgICB9CiAgICBjbS5zZXRDdXJzb3IoMCwgMCk7IGNtLmV4ZWNDb21tYW5kKGludiA/ICJnb0xpbmVTdGFydCIgOiAiZ29MaW5lRW5kIik7CiAgICBwcmV2WCA9IGN1cnNvci5vZmZzZXRMZWZ0OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgKytpKSB7CiAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgICAgIGlzKGN1cnNvci5vZmZzZXRMZWZ0IDwgcHJldlgsICJtb3ZlZCBsZWZ0Iik7CiAgICAgIHByZXZYID0gY3Vyc29yLm9mZnNldExlZnQ7CiAgICB9CiAgfSk7Cn0pOwoKLy8gVmVyaWZ5IHRoYXQgdXBkYXRpbmcgYSBsaW5lIGNsZWFycyBpdHMgYmlkaSBvcmRlcmluZwp0ZXN0Q00oImJpZGlVcGRhdGUiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldEN1cnNvcih7bGluZTogMCwgY2g6IDJ9KTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCLYrtit2KwiLCAic3RhcnQiKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDAsIGNoOiA0fSk7Cn0sIHt2YWx1ZTogImFiY2RcbiJ9KTsKCnRlc3RDTSgibW92ZWJ5VGV4dFVuaXQiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFZhbHVlKCLXkdaw1rzXqNa115DXqda0XG7MgWXMgWXMgWVcbiIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVFbmQiKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogMH0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMSwgY2g6IDB9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDEsIGNoOiAzfSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogNn0pOwp9KTsKCnRlc3RDTSgibGluZUNoYW5nZUV2ZW50cyIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAzLCA1KTsKICB2YXIgbG9nID0gW10sIHdhbnQgPSBbImNoIDAiLCAiY2ggMSIsICJkZWwgMiIsICJjaCAwIiwgImNoIDAiLCAiZGVsIDEiLCAiZGVsIDMiLCAiZGVsIDQiXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkgewogICAgQ29kZU1pcnJvci5vbihjbS5nZXRMaW5lSGFuZGxlKGkpLCAiZGVsZXRlIiwgZnVuY3Rpb24oaSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7bG9nLnB1c2goImRlbCAiICsgaSk7fTsKICAgIH0oaSkpOwogICAgQ29kZU1pcnJvci5vbihjbS5nZXRMaW5lSGFuZGxlKGkpLCAiY2hhbmdlIiwgZnVuY3Rpb24oaSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7bG9nLnB1c2goImNoICIgKyBpKTt9OwogICAgfShpKSk7CiAgfQogIGNtLnJlcGxhY2VSYW5nZSgieCIsIHtsaW5lOiAwLCBjaDogMX0pOwogIGNtLnJlcGxhY2VSYW5nZSgieHkiLCB7bGluZTogMSwgY2g6IDF9LCB7bGluZTogMn0pOwogIGNtLnJlcGxhY2VSYW5nZSgiZm9vXG5iYXIiLCB7bGluZTogMCwgY2g6IDF9KTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIHtsaW5lOiAwLCBjaDogMH0sIHtsaW5lOiBjbS5saW5lQ291bnQoKX0pOwogIGVxKGxvZy5sZW5ndGgsIHdhbnQubGVuZ3RoLCAic2FtZSBsZW5ndGgiKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZy5sZW5ndGg7ICsraSkKICAgIGVxKGxvZ1tpXSwgd2FudFtpXSk7Cn0pOwoKdGVzdENNKCJzY3JvbGxFbnRpcmVseVRvUmlnaHQiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgNTAwLCAyKTsKICBjbS5zZXRDdXJzb3Ioe2xpbmU6IDAsIGNoOiA1MDB9KTsKICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCksIGN1ciA9IGJ5Q2xhc3NOYW1lKHdyYXAsICJDb2RlTWlycm9yLWN1cnNvciIpWzBdOwogIGlzKHdyYXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgPiBjdXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCk7Cn0pOwoKdGVzdENNKCJsaW5lV2lkZ2V0cyIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCA1MDAsIDMpOwogIHZhciBsYXN0ID0gY20uY2hhckNvb3Jkcyh7bGluZTogMiwgY2g6IDB9KTsKICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogIG5vZGUuaW5uZXJIVE1MID0gImhpIjsKICB2YXIgd2lkZ2V0ID0gY20uYWRkTGluZVdpZGdldCgxLCBub2RlKTsKICBpcyhsYXN0LnRvcCA8IGNtLmNoYXJDb29yZHMoe2xpbmU6IDIsIGNoOiAwfSkudG9wLCAidG9vayB1cCBzcGFjZSIpOwogIGNtLnNldEN1cnNvcih7bGluZTogMSwgY2g6IDF9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMiwgY2g6IDF9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDEsIGNoOiAxfSk7Cn0pOwoKdGVzdENNKCJnZXRMaW5lTnVtYmVyIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDIsIDIwKTsKICB2YXIgaDEgPSBjbS5nZXRMaW5lSGFuZGxlKDEpOwogIGVxKGNtLmdldExpbmVOdW1iZXIoaDEpLCAxKTsKICBjbS5yZXBsYWNlUmFuZ2UoImhpXG5ieWVcbiIsIHtsaW5lOiAwLCBjaDogMH0pOwogIGVxKGNtLmdldExpbmVOdW1iZXIoaDEpLCAzKTsKICBjbS5zZXRWYWx1ZSgiIik7CiAgZXEoY20uZ2V0TGluZU51bWJlcihoMSksIG51bGwpOwp9KTsKCnRlc3RDTSgianVtcFRoZUdhcCIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIGxvbmdMaW5lID0gImFiY2RlZiBnaGlrbG1ub3AgcXJzdHV2dyB4eXogIjsKICBsb25nTGluZSArPSBsb25nTGluZTsgbG9uZ0xpbmUgKz0gbG9uZ0xpbmU7IGxvbmdMaW5lICs9IGxvbmdMaW5lOwogIGNtLnNldExpbmUoMiwgbG9uZ0xpbmUpOwogIGNtLnNldFNpemUoIjIwMHB4IiwgbnVsbCk7CiAgY20uZ2V0V3JhcHBlckVsZW1lbnQoKS5zdHlsZS5saW5lSGVpZ2h0ID0gMjsKICBjbS5yZWZyZXNoKCk7CiAgY20uc2V0Q3Vyc29yKHtsaW5lOiAwLCBjaDogMX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogMX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAyLCBjaDogMX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXEoY20uZ2V0Q3Vyc29yKCkubGluZSwgMik7CiAgaXMoY20uZ2V0Q3Vyc29yKCkuY2ggPiAxKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDIsIGNoOiAxfSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogMX0pOwogIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgbm9kZS5pbm5lckhUTUwgPSAiaGkiOyBub2RlLnN0eWxlLmhlaWdodCA9ICIzMHB4IjsKICBjbS5hZGRMaW5lV2lkZ2V0KDAsIG5vZGUpOwogIGNtLmFkZExpbmVXaWRnZXQoMSwgbm9kZS5jbG9uZU5vZGUodHJ1ZSksIHthYm92ZTogdHJ1ZX0pOwogIGNtLnNldEN1cnNvcih7bGluZTogMCwgY2g6IDJ9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMSwgY2g6IDJ9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDAsIGNoOiAyfSk7Cn0sIHtsaW5lV3JhcHBpbmc6IHRydWUsIHZhbHVlOiAiYWJjXG5kZWZcbmdoaVxuamtsXG4ifSk7Cgp0ZXN0Q00oImFkZExpbmVDbGFzcyIsIGZ1bmN0aW9uKGNtKSB7CiAgZnVuY3Rpb24gY2xzKGxpbmUsIHRleHQsIGJnLCB3cmFwKSB7CiAgICB2YXIgaSA9IGNtLmxpbmVJbmZvKGxpbmUpOwogICAgZXEoaS50ZXh0Q2xhc3MsIHRleHQpOwogICAgZXEoaS5iZ0NsYXNzLCBiZyk7CiAgICBlcShpLndyYXBDbGFzcywgd3JhcCk7CiAgfQogIGNtLmFkZExpbmVDbGFzcygwLCAidGV4dCIsICJmb28iKTsKICBjbS5hZGRMaW5lQ2xhc3MoMCwgInRleHQiLCAiYmFyIik7CiAgY20uYWRkTGluZUNsYXNzKDEsICJiYWNrZ3JvdW5kIiwgImJheiIpOwogIGNtLmFkZExpbmVDbGFzcygxLCAid3JhcCIsICJmb28iKTsKICBjbHMoMCwgImZvbyBiYXIiLCBudWxsLCBudWxsKTsKICBjbHMoMSwgbnVsbCwgImJheiIsICJmb28iKTsKICBlcShieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiZm9vIikubGVuZ3RoLCAyKTsKICBlcShieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiYmFyIikubGVuZ3RoLCAxKTsKICBlcShieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiYmF6IikubGVuZ3RoLCAxKTsKICBjbS5yZW1vdmVMaW5lQ2xhc3MoMCwgInRleHQiLCAiZm9vIik7CiAgY2xzKDAsICJiYXIiLCBudWxsLCBudWxsKTsKICBjbS5yZW1vdmVMaW5lQ2xhc3MoMCwgInRleHQiLCAiZm9vIik7CiAgY2xzKDAsICJiYXIiLCBudWxsLCBudWxsKTsKICBjbS5yZW1vdmVMaW5lQ2xhc3MoMCwgInRleHQiLCAiYmFyIik7CiAgY2xzKDAsIG51bGwsIG51bGwsIG51bGwpOwogIGNtLmFkZExpbmVDbGFzcygxLCAid3JhcCIsICJxdXV4Iik7CiAgY2xzKDEsIG51bGwsICJiYXoiLCAiZm9vIHF1dXgiKTsKICBjbS5yZW1vdmVMaW5lQ2xhc3MoMSwgIndyYXAiKTsKICBjbHMoMSwgbnVsbCwgImJheiIsIG51bGwpOwp9LCB7dmFsdWU6ICJob2hvaG9cbiJ9KTsKCnRlc3RDTSgiYXRvbWljTWFya2VyIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDEwLCAxMCk7CiAgZnVuY3Rpb24gYXRvbShsbCwgY2wsIGxyLCBjciwgbGksIHJpKSB7CiAgICByZXR1cm4gY20ubWFya1RleHQoe2xpbmU6IGxsLCBjaDogY2x9LCB7bGluZTogbHIsIGNoOiBjcn0sCiAgICAgICAgICAgICAgICAgICAgICAge2F0b21pYzogdHJ1ZSwgaW5jbHVzaXZlTGVmdDogbGksIGluY2x1c2l2ZVJpZ2h0OiByaX0pOwogIH0KICB2YXIgbSA9IGF0b20oMCwgMSwgMCwgNSk7CiAgY20uc2V0Q3Vyc29yKHtsaW5lOiAwLCBjaDogMX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDV9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDF9KTsKICBtLmNsZWFyKCk7CiAgbSA9IGF0b20oMCwgMCwgMCwgNSwgdHJ1ZSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogNX0sICJwdXNoZWQgb3V0Iik7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDAsIGNoOiA1fSk7CiAgbS5jbGVhcigpOwogIG0gPSBhdG9tKDgsIDQsIDksIDEwLCBmYWxzZSwgdHJ1ZSk7CiAgY20uc2V0Q3Vyc29yKHtsaW5lOiA5LCBjaDogOH0pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogOCwgY2g6IDR9LCAic2V0Iik7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiA4LCBjaDogNH0sICJjaGFyIHJpZ2h0Iik7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDgsIGNoOiA0fSwgImxpbmUgZG93biIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiA4LCBjaDogM30pOwogIG0uY2xlYXIoKTsKICBtID0gYXRvbSgxLCAxLCAzLCA4KTsKICBjbS5zZXRDdXJzb3Ioe2xpbmU6IDIsIGNoOiAwfSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAzLCBjaDogOH0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAxLCBjaDogMX0pOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMywgY2g6IDh9KTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDEsIGNoOiAxfSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDMsIGNoOiA4fSk7CiAgY20uZXhlY0NvbW1hbmQoImRlbENoYXJCZWZvcmUiKTsKICBlcShjbS5nZXRWYWx1ZSgpLmxlbmd0aCwgODAsICJkZWwgY2h1bmsiKTsKICBtID0gYXRvbSgzLCAwLCA1LCA1KTsKICBjbS5zZXRDdXJzb3Ioe2xpbmU6IDMsIGNoOiAwfSk7CiAgY20uZXhlY0NvbW1hbmQoImRlbFdvcmRBZnRlciIpOwogIGVxKGNtLmdldFZhbHVlKCkubGVuZ3RoLCA1MywgImRlbCBjaHVuayIpOwp9KTsKCnRlc3RDTSgicmVhZE9ubHlNYXJrZXIiLCBmdW5jdGlvbihjbSkgewogIGZ1bmN0aW9uIG1hcmsobGwsIGNsLCBsciwgY3IsIGF0KSB7CiAgICByZXR1cm4gY20ubWFya1RleHQoe2xpbmU6IGxsLCBjaDogY2x9LCB7bGluZTogbHIsIGNoOiBjcn0sCiAgICAgICAgICAgICAgICAgICAgICAge3JlYWRPbmx5OiB0cnVlLCBhdG9taWM6IGF0fSk7CiAgfQogIHZhciBtID0gbWFyaygwLCAxLCAwLCA0KTsKICBjbS5zZXRDdXJzb3Ioe2xpbmU6IDAsIGNoOiAyfSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiaGkiLCAiZW5kIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogMn0pOwogIGVxKGNtLmdldExpbmUoMCksICJhYmNkZSIpOwogIGNtLmV4ZWNDb21tYW5kKCJzZWxlY3RBbGwiKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJvb3BzIik7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIm9vcHNiY2QiKTsKICBjbS51bmRvKCk7CiAgZXFQb3MobS5maW5kKCkuZnJvbSwge2xpbmU6IDAsIGNoOiAxfSk7CiAgZXFQb3MobS5maW5kKCkudG8sIHtsaW5lOiAwLCBjaDogNH0pOwogIG0uY2xlYXIoKTsKICBjbS5zZXRDdXJzb3Ioe2xpbmU6IDAsIGNoOiAyfSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiaGkiKTsKICBlcShjbS5nZXRMaW5lKDApLCAiYWJoaWNkZSIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDR9KTsKICBtID0gbWFyaygwLCAyLCAyLCAyLCB0cnVlKTsKICBjbS5zZXRTZWxlY3Rpb24oe2xpbmU6IDEsIGNoOiAxfSwge2xpbmU6IDIsIGNoOiA0fSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigidCIsICJlbmQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwge2xpbmU6IDIsIGNoOiAzfSk7CiAgZXEoY20uZ2V0TGluZSgyKSwgImtsdG8iKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogMn0pOwogIGNtLnNldFNlbGVjdGlvbih7bGluZTogMCwgY2g6IDF9LCB7bGluZTogMCwgY2g6IDN9KTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJ4eCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDN9KTsKICBlcShjbS5nZXRMaW5lKDApLCAiYXh4aGljZGUiKTsKfSwge3ZhbHVlOiAiYWJjZGVcbmZnaGlqXG5rbG1ub1xuIn0pOwoKdGVzdENNKCJkaXJ0eUJpdCIsIGZ1bmN0aW9uKGNtKSB7CiAgZXEoY20uaXNDbGVhbigpLCB0cnVlKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJib28iKTsKICBlcShjbS5pc0NsZWFuKCksIGZhbHNlKTsKICBjbS51bmRvKCk7CiAgZXEoY20uaXNDbGVhbigpLCB0cnVlKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJib28iKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJiYXoiKTsKICBjbS51bmRvKCk7CiAgZXEoY20uaXNDbGVhbigpLCBmYWxzZSk7CiAgY20ubWFya0NsZWFuKCk7CiAgZXEoY20uaXNDbGVhbigpLCB0cnVlKTsKICBjbS51bmRvKCk7CiAgZXEoY20uaXNDbGVhbigpLCBmYWxzZSk7CiAgY20ucmVkbygpOwogIGVxKGNtLmlzQ2xlYW4oKSwgdHJ1ZSk7Cn0pOwoKdGVzdENNKCJhZGRLZXlNYXAiLCBmdW5jdGlvbihjbSkgewogIGZ1bmN0aW9uIHNlbmRLZXkoY29kZSkgewogICAgY20udHJpZ2dlck9uS2V5RG93bih7dHlwZTogImtleWRvd24iLCBrZXlDb2RlOiBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCl7fSwgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpe319KTsKICB9CgogIHNlbmRLZXkoMzkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDF9KTsKICB2YXIgdGVzdCA9IDA7CiAgdmFyIG1hcDEgPSB7UmlnaHQ6IGZ1bmN0aW9uKCkgeyArK3Rlc3Q7IH19LCBtYXAyID0ge1JpZ2h0OiBmdW5jdGlvbigpIHsgdGVzdCArPSAxMDsgfX0KICBjbS5hZGRLZXlNYXAobWFwMSk7CiAgc2VuZEtleSgzOSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogMX0pOwogIGVxKHRlc3QsIDEpOwogIGNtLmFkZEtleU1hcChtYXAyKTsKICBzZW5kS2V5KDM5KTsKICBlcSh0ZXN0LCAyKTsKICBjbS5yZW1vdmVLZXlNYXAobWFwMSk7CiAgc2VuZEtleSgzOSk7CiAgZXEodGVzdCwgMTIpOwogIGNtLnJlbW92ZUtleU1hcChtYXAyKTsKICBzZW5kS2V5KDM5KTsKICBlcSh0ZXN0LCAxMik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHtsaW5lOiAwLCBjaDogMn0pOwogIGNtLmFkZEtleU1hcCh7UmlnaHQ6IGZ1bmN0aW9uKCkgeyB0ZXN0ID0gNTU7IH0sIG5hbWU6ICJteW1hcCJ9KTsKICBzZW5kS2V5KDM5KTsKICBlcSh0ZXN0LCA1NSk7CiAgY20ucmVtb3ZlS2V5TWFwKCJteW1hcCIpOwogIHNlbmRLZXkoMzkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCB7bGluZTogMCwgY2g6IDN9KTsKfSwge3ZhbHVlOiAiYWJjIn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/test/vim_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIGNvZGUgPSAnJyArCicgd09yZDEgKCMlXG4nICsKJyB3b3JkM10gXG4nICsKJ2FvcG9wIHBvcCAwIDEgMiAzIDRcbicgKwonIChhKSBbYl0ge2N9IFxuJyArCidpbnQgZ2V0Y2hhcih2b2lkKSB7XG4nICsKJyAgc3RhdGljIGNoYXIgYnVmW0JVRlNJWl07XG4nICsKJyAgc3RhdGljIGNoYXIgKmJ1ZnAgPSBidWY7XG4nICsKJyAgaWYgKG4gPT0gMCkgeyAgLyogYnVmZmVyIGlzIGVtcHR5ICovXG4nICsKJyAgICBuID0gcmVhZCgwLCBidWYsIHNpemVvZiBidWYpO1xuJyArCicgICAgYnVmcCA9IGJ1ZjtcbicgKwonICB9XG4nICsKJyAgcmV0dXJuICgtLW4gPj0gMCkgPyAodW5zaWduZWQgY2hhcikgKmJ1ZnArKyA6IEVPRjtcbicgKwonfVxuJzsKCnZhciBsaW5lcyA9IChmdW5jdGlvbigpIHsKICBsaW5lVGV4dCA9IGNvZGUuc3BsaXQoJ1xuJyk7CiAgdmFyIHJldCA9IFtdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVRleHQubGVuZ3RoOyBpKyspIHsKICAgIHJldFtpXSA9IHsKICAgICAgbGluZTogaSwKICAgICAgbGVuZ3RoOiBsaW5lVGV4dFtpXS5sZW5ndGgsCiAgICAgIGxpbmVUZXh0OiBsaW5lVGV4dFtpXSwKICAgICAgdGV4dFN0YXJ0OiAvXlxzKi8uZXhlYyhsaW5lVGV4dFtpXSlbMF0ubGVuZ3RoCiAgICB9OwogIH0KICByZXR1cm4gcmV0Owp9KSgpOwp2YXIgZW5kT2ZEb2N1bWVudCA9IG1ha2VDdXJzb3IobGluZXMubGVuZ3RoIC0gMSwKICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aCk7CnZhciB3b3JkTGluZSA9IGxpbmVzWzBdOwp2YXIgYmlnV29yZExpbmUgPSBsaW5lc1sxXTsKdmFyIGNoYXJMaW5lID0gbGluZXNbMl07CnZhciBicmFjZXNMaW5lID0gbGluZXNbM107Cgp2YXIgd29yZDEgPSB7CiAgc3RhcnQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IDEgfSwKICBlbmQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IDUgfQp9Owp2YXIgd29yZDIgPSB7CiAgc3RhcnQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IHdvcmQxLmVuZC5jaCArIDIgfSwKICBlbmQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IHdvcmQxLmVuZC5jaCArIDQgfQp9Owp2YXIgd29yZDMgPSB7CiAgc3RhcnQ6IHsgbGluZTogYmlnV29yZExpbmUubGluZSwgY2g6IDEgfSwKICBlbmQ6IHsgbGluZTogYmlnV29yZExpbmUubGluZSwgY2g6IDUgfQp9Owp2YXIgYmlnV29yZDEgPSB3b3JkMTsKdmFyIGJpZ1dvcmQyID0gd29yZDI7CnZhciBiaWdXb3JkMyA9IHsKICBzdGFydDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogMSB9LAogIGVuZDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogNyB9Cn07CnZhciBiaWdXb3JkNCA9IHsKICBzdGFydDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogYmlnV29yZDEuZW5kLmNoICsgMyB9LAogIGVuZDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogYmlnV29yZDEuZW5kLmNoICsgNyB9Cn0KdmFyIG9DaGFycyA9IFsgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogMSB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogMyB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogNyB9IF07CnZhciBwQ2hhcnMgPSBbIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDIgfSwKICAgIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDQgfSwKICAgIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDYgfSwKICAgIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDggfSBdOwp2YXIgbnVtQ2hhcnMgPSBbIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDEwIH0sCiAgICB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiAxMiB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogMTQgfSwKICAgIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDE2IH0sCiAgICB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiAxOCB9XTsKdmFyIHBhcmVuczEgPSB7CiAgc3RhcnQ6IHsgbGluZTogYnJhY2VzTGluZS5saW5lLCBjaDogMSB9LAogIGVuZDogeyBsaW5lOiBicmFjZXNMaW5lLmxpbmUsIGNoOiAzIH0KfTsKdmFyIHNxdWFyZXMxID0gewogIHN0YXJ0OiB7IGxpbmU6IGJyYWNlc0xpbmUubGluZSwgY2g6IDUgfSwKICBlbmQ6IHsgbGluZTogYnJhY2VzTGluZS5saW5lLCBjaDogNyB9Cn07CnZhciBjdXJseXMxID0gewogIHN0YXJ0OiB7IGxpbmU6IGJyYWNlc0xpbmUubGluZSwgY2g6IDkgfSwKICBlbmQ6IHsgbGluZTogYnJhY2VzTGluZS5saW5lLCBjaDogMTEgfQp9OwoKZnVuY3Rpb24gY29weUN1cnNvcihjdXIpIHsKICByZXR1cm4geyBjaDogY3VyLmNoLCBsaW5lOiBjdXIubGluZSB9Owp9CgpmdW5jdGlvbiB0ZXN0VmltKG5hbWUsIHJ1biwgb3B0cywgZXhwZWN0ZWRGYWlsKSB7CiAgdmFyIHZpbU9wdHMgPSB7CiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1vZGU6ICd0ZXh0L3gtY3NyYycsCiAgICBrZXlNYXA6ICd2aW0nLAogICAgc2hvd0N1cnNvcldoZW5TZWxlY3Rpbmc6IHRydWUsCiAgICB2YWx1ZTogY29kZQogIH07CiAgZm9yICh2YXIgcHJvcCBpbiBvcHRzKSB7CiAgICBpZiAob3B0cy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICB2aW1PcHRzW3Byb3BdID0gb3B0c1twcm9wXTsKICAgIH0KICB9CiAgcmV0dXJuIHRlc3QoJ3ZpbV8nICsgbmFtZSwgZnVuY3Rpb24oKSB7CiAgICB2YXIgcGxhY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdGdyb3VuZCIpOwogICAgdmFyIGNtID0gQ29kZU1pcnJvcihwbGFjZSwgdmltT3B0cyk7CiAgICBDb2RlTWlycm9yLlZpbS5tYXliZUluaXRTdGF0ZShjbSk7CiAgICB2YXIgdmltID0gY20udmltU3RhdGU7CgogICAgZnVuY3Rpb24gZG9LZXlzRm4oY20pIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgICBpZiAoYXJncyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICBhcmd1bWVudHMgPSBhcmdzOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgQ29kZU1pcnJvci5WaW0uaGFuZGxlS2V5KGNtLCBhcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYXNzZXJ0Q3Vyc29yQXRGbihjbSkgewogICAgICByZXR1cm4gZnVuY3Rpb24obGluZSwgY2gpIHsKICAgICAgICB2YXIgcG9zOwogICAgICAgIGlmIChjaCA9PSBudWxsICYmIHR5cGVvZiBsaW5lLmxpbmUgPT0gJ251bWJlcicpIHsKICAgICAgICAgIHBvcyA9IGxpbmU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBvcyA9IG1ha2VDdXJzb3IobGluZSwgY2gpOwogICAgICAgIH0KICAgICAgICBlcVBvcyhwb3MsIGNtLmdldEN1cnNvcigpKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZmFrZU9wZW5EaWFsb2cocmVzdWx0KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0ZXh0LCBjYWxsYmFjaykgewogICAgICAgIHJldHVybiBjYWxsYmFjayhyZXN1bHQpOwogICAgICB9CiAgICB9CiAgICB2YXIgaGVscGVycyA9IHsKICAgICAgZG9LZXlzOiBkb0tleXNGbihjbSksCiAgICAgIGFzc2VydEN1cnNvckF0OiBhc3NlcnRDdXJzb3JBdEZuKGNtKSwKICAgICAgZmFrZU9wZW5EaWFsb2c6IGZha2VPcGVuRGlhbG9nLAogICAgICBnZXRSZWdpc3RlckNvbnRyb2xsZXI6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBDb2RlTWlycm9yLlZpbS5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKTsKICAgICAgfQogICAgfQogICAgQ29kZU1pcnJvci5WaW0uY2xlYXJWaW1HbG9iYWxTdGF0ZV8oKTsKICAgIHZhciBzdWNjZXNzZnVsID0gZmFsc2U7CiAgICB0cnkgewogICAgICBydW4oY20sIHZpbSwgaGVscGVycyk7CiAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwogICAgfSBmaW5hbGx5IHsKICAgICAgaWYgKChkZWJ1ZyAmJiAhc3VjY2Vzc2Z1bCkgfHwgdmVyYm9zZSkgewogICAgICAgIHBsYWNlLnN0eWxlLnZpc2liaWxpdHkgPSAiIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbGFjZS5yZW1vdmVDaGlsZChjbS5nZXRXcmFwcGVyRWxlbWVudCgpKTsKICAgICAgfQogICAgfQogIH0sIGV4cGVjdGVkRmFpbCk7Cn07CgovKioKICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdAogKiBAcGFyYW0ga2V5cyBBbiBhcnJheSBvZiBrZXlzIG9yIGEgc3RyaW5nIHdpdGggYSBzaW5nbGUga2V5IHRvIHNpbXVsYXRlLgogKiBAcGFyYW0gZW5kUG9zIFRoZSBleHBlY3RlZCBlbmQgcG9zaXRpb24gb2YgdGhlIGN1cnNvci4KICogQHBhcmFtIHN0YXJ0UG9zIFRoZSBwb3NpdGlvbiB0aGUgY3Vyc29yIHNob3VsZCBzdGFydCBhdCwgZGVmYXVsdHMgdG8gMCwgMC4KICovCmZ1bmN0aW9uIHRlc3RNb3Rpb24obmFtZSwga2V5cywgZW5kUG9zLCBzdGFydFBvcykgewogIHRlc3RWaW0obmFtZSwgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogICAgaWYgKCFzdGFydFBvcykgewogICAgICBzdGFydFBvcyA9IHsgbGluZTogMCwgY2g6IDAgfTsKICAgIH0KICAgIGNtLnNldEN1cnNvcihzdGFydFBvcyk7CiAgICBoZWxwZXJzLmRvS2V5cyhrZXlzKTsKICAgIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoZW5kUG9zKTsKICB9KTsKfTsKCmZ1bmN0aW9uIG1ha2VDdXJzb3IobGluZSwgY2gpIHsKICByZXR1cm4geyBsaW5lOiBsaW5lLCBjaDogY2ggfTsKfTsKCmZ1bmN0aW9uIG9mZnNldEN1cnNvcihjdXIsIG9mZnNldExpbmUsIG9mZnNldENoKSB7CiAgcmV0dXJuIHsgbGluZTogY3VyLmxpbmUgKyBvZmZzZXRMaW5lLCBjaDogY3VyLmNoICsgb2Zmc2V0Q2ggfTsKfTsKCi8vIE1vdGlvbiB0ZXN0cwp0ZXN0TW90aW9uKCd8JywgJ3wnLCBtYWtlQ3Vyc29yKDAsIDApLCBtYWtlQ3Vyc29yKDAsNCkpOwp0ZXN0TW90aW9uKCd8X3JlcGVhdCcsIFsnMycsICd8J10sIG1ha2VDdXJzb3IoMCwgMiksIG1ha2VDdXJzb3IoMCw0KSk7CnRlc3RNb3Rpb24oJ2gnLCAnaCcsIG1ha2VDdXJzb3IoMCwgMCksIHdvcmQxLnN0YXJ0KTsKdGVzdE1vdGlvbignaF9yZXBlYXQnLCBbJzMnLCAnaCddLCBvZmZzZXRDdXJzb3Iod29yZDEuZW5kLCAwLCAtMyksIHdvcmQxLmVuZCk7CnRlc3RNb3Rpb24oJ2wnLCAnbCcsIG1ha2VDdXJzb3IoMCwgMSkpOwp0ZXN0TW90aW9uKCdsX3JlcGVhdCcsIFsnMicsICdsJ10sIG1ha2VDdXJzb3IoMCwgMikpOwp0ZXN0TW90aW9uKCdqJywgJ2onLCBvZmZzZXRDdXJzb3Iod29yZDEuZW5kLCAxLCAwKSwgd29yZDEuZW5kKTsKdGVzdE1vdGlvbignal9yZXBlYXQnLCBbJzInLCAnaiddLCBvZmZzZXRDdXJzb3Iod29yZDEuZW5kLCAyLCAwKSwgd29yZDEuZW5kKTsKdGVzdE1vdGlvbignaycsICdrJywgb2Zmc2V0Q3Vyc29yKHdvcmQzLmVuZCwgLTEsIDApLCB3b3JkMy5lbmQpOwp0ZXN0TW90aW9uKCdrX3JlcGVhdCcsIFsnMicsICdrJ10sIG1ha2VDdXJzb3IoMCwgNCksIG1ha2VDdXJzb3IoMiwgNCkpOwp0ZXN0TW90aW9uKCd3JywgJ3cnLCB3b3JkMS5zdGFydCk7CnRlc3RNb3Rpb24oJ3dfcmVwZWF0JywgWycyJywgJ3cnXSwgd29yZDIuc3RhcnQpOwp0ZXN0TW90aW9uKCd3X3dyYXAnLCBbJ3cnXSwgd29yZDMuc3RhcnQsIHdvcmQyLnN0YXJ0KTsKdGVzdE1vdGlvbignd19lbmRPZkRvY3VtZW50JywgJ3cnLCBlbmRPZkRvY3VtZW50LCBlbmRPZkRvY3VtZW50KTsKdGVzdE1vdGlvbignVycsICdXJywgYmlnV29yZDEuc3RhcnQpOwp0ZXN0TW90aW9uKCdXX3JlcGVhdCcsIFsnMicsICdXJ10sIGJpZ1dvcmQzLnN0YXJ0LCBiaWdXb3JkMS5zdGFydCk7CnRlc3RNb3Rpb24oJ2UnLCAnZScsIHdvcmQxLmVuZCk7CnRlc3RNb3Rpb24oJ2VfcmVwZWF0JywgWycyJywgJ2UnXSwgd29yZDIuZW5kKTsKdGVzdE1vdGlvbignZV93cmFwJywgJ2UnLCB3b3JkMy5lbmQsIHdvcmQyLmVuZCk7CnRlc3RNb3Rpb24oJ2VfZW5kT2ZEb2N1bWVudCcsICdlJywgZW5kT2ZEb2N1bWVudCwgZW5kT2ZEb2N1bWVudCk7CnRlc3RNb3Rpb24oJ2InLCAnYicsIHdvcmQzLnN0YXJ0LCB3b3JkMy5lbmQpOwp0ZXN0TW90aW9uKCdiX3JlcGVhdCcsIFsnMicsICdiJ10sIHdvcmQyLnN0YXJ0LCB3b3JkMy5lbmQpOwp0ZXN0TW90aW9uKCdiX3dyYXAnLCAnYicsIHdvcmQyLnN0YXJ0LCB3b3JkMy5zdGFydCk7CnRlc3RNb3Rpb24oJ2Jfc3RhcnRPZkRvY3VtZW50JywgJ2InLCBtYWtlQ3Vyc29yKDAsIDApLCBtYWtlQ3Vyc29yKDAsIDApKTsKdGVzdE1vdGlvbignZ2UnLCBbJ2cnLCAnZSddLCB3b3JkMi5lbmQsIHdvcmQzLmVuZCk7CnRlc3RNb3Rpb24oJ2dlX3JlcGVhdCcsIFsnMicsICdnJywgJ2UnXSwgd29yZDEuZW5kLCB3b3JkMy5zdGFydCk7CnRlc3RNb3Rpb24oJ2dlX3dyYXAnLCBbJ2cnLCAnZSddLCB3b3JkMi5lbmQsIHdvcmQzLnN0YXJ0KTsKdGVzdE1vdGlvbignZ2Vfc3RhcnRPZkRvY3VtZW50JywgWydnJywgJ2UnXSwgbWFrZUN1cnNvcigwLCAwKSwKICAgIG1ha2VDdXJzb3IoMCwgMCkpOwp0ZXN0TW90aW9uKCdnZycsIFsnZycsICdnJ10sIG1ha2VDdXJzb3IobGluZXNbMF0ubGluZSwgbGluZXNbMF0udGV4dFN0YXJ0KSwKICAgIG1ha2VDdXJzb3IoMywgMSkpOwp0ZXN0TW90aW9uKCdnZ19yZXBlYXQnLCBbJzMnLCAnZycsICdnJ10sCiAgICBtYWtlQ3Vyc29yKGxpbmVzWzJdLmxpbmUsIGxpbmVzWzJdLnRleHRTdGFydCkpOwp0ZXN0TW90aW9uKCdHJywgJ0cnLAogICAgbWFrZUN1cnNvcihsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5saW5lLCBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS50ZXh0U3RhcnQpLAogICAgbWFrZUN1cnNvcigzLCAxKSk7CnRlc3RNb3Rpb24oJ0dfcmVwZWF0JywgWyczJywgJ0cnXSwgbWFrZUN1cnNvcihsaW5lc1syXS5saW5lLAogICAgbGluZXNbMl0udGV4dFN0YXJ0KSk7Ci8vIFRPRE86IE1ha2UgdGhlIHRlc3QgY29kZSBsb25nIGVub3VnaCB0byB0ZXN0IEN0cmwtRiBhbmQgQ3RybC1CLgp0ZXN0TW90aW9uKCcwJywgJzAnLCBtYWtlQ3Vyc29yKDAsIDApLCBtYWtlQ3Vyc29yKDAsIDgpKTsKdGVzdE1vdGlvbignXicsICdeJywgbWFrZUN1cnNvcigwLCBsaW5lc1swXS50ZXh0U3RhcnQpLCBtYWtlQ3Vyc29yKDAsIDgpKTsKdGVzdE1vdGlvbignJCcsICckJywgbWFrZUN1cnNvcigwLCBsaW5lc1swXS5sZW5ndGggLSAxKSwgbWFrZUN1cnNvcigwLCAxKSk7CnRlc3RNb3Rpb24oJyRfcmVwZWF0JywgWycyJywgJyQnXSwgbWFrZUN1cnNvcigxLCBsaW5lc1sxXS5sZW5ndGggLSAxKSwKICAgIG1ha2VDdXJzb3IoMCwgMykpOwp0ZXN0TW90aW9uKCdmJywgWydmJywgJ3AnXSwgcENoYXJzWzBdLCBtYWtlQ3Vyc29yKGNoYXJMaW5lLmxpbmUsIDApKTsKdGVzdE1vdGlvbignZl9yZXBlYXQnLCBbJzInLCAnZicsICdwJ10sIHBDaGFyc1syXSwgcENoYXJzWzBdKTsKdGVzdE1vdGlvbignZl9udW0nLCBbJ2YnLCAnMiddLCBudW1DaGFyc1syXSwgbWFrZUN1cnNvcihjaGFyTGluZS5saW5lLCAwKSk7CnRlc3RNb3Rpb24oJ3QnLCBbJ3QnLCdwJ10sIG9mZnNldEN1cnNvcihwQ2hhcnNbMF0sIDAsIC0xKSwKICAgIG1ha2VDdXJzb3IoY2hhckxpbmUubGluZSwgMCkpOwp0ZXN0TW90aW9uKCd0X3JlcGVhdCcsIFsnMicsICd0JywgJ3AnXSwgb2Zmc2V0Q3Vyc29yKHBDaGFyc1syXSwgMCwgLTEpLAogICAgcENoYXJzWzBdKTsKdGVzdE1vdGlvbignRicsIFsnRicsICdwJ10sIHBDaGFyc1swXSwgcENoYXJzWzFdKTsKdGVzdE1vdGlvbignRl9yZXBlYXQnLCBbJzInLCAnRicsICdwJ10sIHBDaGFyc1swXSwgcENoYXJzWzJdKTsKdGVzdE1vdGlvbignVCcsIFsnVCcsICdwJ10sIG9mZnNldEN1cnNvcihwQ2hhcnNbMF0sIDAsIDEpLCBwQ2hhcnNbMV0pOwp0ZXN0TW90aW9uKCdUX3JlcGVhdCcsIFsnMicsICdUJywgJ3AnXSwgb2Zmc2V0Q3Vyc29yKHBDaGFyc1swXSwgMCwgMSksIHBDaGFyc1syXSk7CnRlc3RNb3Rpb24oJyVfcGFyZW5zJywgWyclJ10sIHBhcmVuczEuZW5kLCBwYXJlbnMxLnN0YXJ0KTsKdGVzdE1vdGlvbignJV9zcXVhcmVzJywgWyclJ10sIHNxdWFyZXMxLmVuZCwgc3F1YXJlczEuc3RhcnQpOwp0ZXN0TW90aW9uKCclX2JyYWNlcycsIFsnJSddLCBjdXJseXMxLmVuZCwgY3VybHlzMS5zdGFydCk7Ci8vIE1ha2Ugc3VyZSB0aGF0IG1vdmluZyBkb3duIGFmdGVyIGdvaW5nIHRvIHRoZSBlbmQgb2YgYSBsaW5lIGFsd2F5cyBsZWF2ZXMgeW91Ci8vIGF0IHRoZSBlbmQgb2YgYSBsaW5lLCBidXQgcHJlc2VydmVzIHRoZSBvZmZzZXQgaW4gb3RoZXIgY2FzZXMKdGVzdFZpbSgnQ2hhbmdpbmcgbGluZXMgYWZ0ZXIgRW9sIG9wZXJhdGlvbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgc3RhcnRQb3MgPSB7IGxpbmU6IDAsIGNoOiAwIH07CiAgY20uc2V0Q3Vyc29yKHN0YXJ0UG9zKTsKICBoZWxwZXJzLmRvS2V5cyhbJyQnXSk7CiAgaGVscGVycy5kb0tleXMoWydqJ10pOwogIC8vIEFmdGVyIG1vdmluZyB0byBFb2wgYW5kIHRoZW4gZG93biwgd2Ugc2hvdWxkIGJlIGF0IEVvbCBvZiBsaW5lIDIKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KHsgbGluZTogMSwgY2g6IGxpbmVzWzFdLmxlbmd0aCAtIDEgfSk7CiAgaGVscGVycy5kb0tleXMoWydqJ10pOwogIC8vIEFmdGVyIG1vdmluZyBkb3duLCB3ZSBzaG91bGQgYmUgYXQgRW9sIG9mIGxpbmUgMwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoeyBsaW5lOiAyLCBjaDogbGluZXNbMl0ubGVuZ3RoIC0gMSB9KTsKICBoZWxwZXJzLmRvS2V5cyhbJ2gnXSk7CiAgaGVscGVycy5kb0tleXMoWydqJ10pOwogIC8vIEFmdGVyIG1vdmluZyBiYWNrIG9uZSBzcGFjZSBhbmQgdGhlbiBkb3duLCBzaW5jZSBsaW5lIDQgaXMgc2hvcnRlciB0aGFuIGxpbmUgMiwgd2Ugc2hvdWxkCiAgLy8gYmUgYXQgRW9sIG9mIGxpbmUgMiAtIDEKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KHsgbGluZTogMywgY2g6IGxpbmVzWzNdLmxlbmd0aCAtIDEgfSk7CiAgaGVscGVycy5kb0tleXMoWydqJ10pOwogIGhlbHBlcnMuZG9LZXlzKFsnaiddKTsKICAvLyBBZnRlciBtb3ZpbmcgZG93biBhZ2Fpbiwgc2luY2UgbGluZSAzIGhhcyBlbm91Z2ggY2hhcmFjdGVycywgd2Ugc2hvdWxkIGJlIGJhY2sgdG8gdGhlCiAgLy8gc2FtZSBwbGFjZSB3ZSB3ZXJlIGF0IG9uIGxpbmUgMQogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoeyBsaW5lOiA1LCBjaDogbGluZXNbMl0ubGVuZ3RoIC0gMiB9KTsKfSk7CgovLyBPcGVyYXRvciB0ZXN0cwp0ZXN0VmltKCdkbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDApOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnbCcpOwogIGVxKCd3b3JkMSAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyAnLCByZWdpc3Rlci50ZXh0KTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZGxfZW9sJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgNik7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdsJyk7CiAgZXEoJyB3b3JkMScsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnICcsIHJlZ2lzdGVyLnRleHQpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdChtYWtlQ3Vyc29yKDAsIDYpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMSAnIH0pOwp0ZXN0VmltKCdkbF9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAwKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2QnLCAnbCcpOwogIGVxKCdvcmQxICcsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnIHcnLCByZWdpc3Rlci50ZXh0KTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZGgnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAzKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2gnKTsKICBlcSgnIHdyZDEgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCdvJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhvZmZzZXRDdXJzb3IoY3VyU3RhcnQsIDAgLCAtMSksIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMSAnIH0pOwp0ZXN0VmltKCdkaicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDMpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnaicpOwogIGVxKCcgd29yZDMnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyB3b3JkMVxud29yZDJcbicsIHJlZ2lzdGVyLnRleHQpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIDEpLCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG4gd29yZDMnIH0pOwp0ZXN0VmltKCdkal9lbmRfb2ZfZG9jdW1lbnQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAzKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2onKTsKICBlcSgnIHdvcmQxICcsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDMpOwp9LCB7IHZhbHVlOiAnIHdvcmQxICcgfSk7CnRlc3RWaW0oJ2RrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMSwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdrJyk7CiAgZXEoJyB3b3JkMycsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnIHdvcmQxXG53b3JkMlxuJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMocmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKG1ha2VDdXJzb3IoMCwgMSksIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDJcbiB3b3JkMycgfSk7CnRlc3RWaW0oJ2RrX3N0YXJ0X29mX2RvY3VtZW50JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdrJyk7CiAgZXEoJyB3b3JkMSAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJycsIHJlZ2lzdGVyLnRleHQpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAzKTsKfSwgeyB2YWx1ZTogJyB3b3JkMSAnIH0pOwp0ZXN0VmltKCdkd19zcGFjZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDApOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCd3b3JkMSAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyAnLCByZWdpc3Rlci50ZXh0KTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZHdfd29yZCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDEpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCcgd29yZDInLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3dvcmQxICcsIHJlZ2lzdGVyLnRleHQpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMSB3b3JkMicgfSk7CnRlc3RWaW0oJ2R3X29ubHlfd29yZCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBUZXN0IHRoYXQgaWYgdGhlcmUgaXMgb25seSAxIHdvcmQgbGVmdCwgZHcgZGVsZXRlcyB0aWxsIHRoZSBlbmQgb2YgdGhlCiAgLy8gbGluZS4KICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDEpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCcgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMSAnLCByZWdpc3Rlci50ZXh0KTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZHdfZW9sJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIEFzc2VydCB0aGF0IGR3IGRvZXMgbm90IGRlbGV0ZSB0aGUgbmV3bGluZSBpZiBsYXN0IHdvcmQgdG8gZGVsZXRlIGlzIGF0IGVuZAogIC8vIG9mIGxpbmUuCiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAxKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcSgnIFxud29yZDInLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3dvcmQxJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMicgfSk7CnRlc3RWaW0oJ2R3X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBBc3NlcnQgdGhhdCBkdyBkb2VzIGRlbGV0ZSBuZXdsaW5lIGlmIGl0IHNob3VsZCBnbyB0byB0aGUgbmV4dCBsaW5lLCBhbmQKICAvLyB0aGF0IHJlcGVhdCB3b3JrcyBwcm9wZXJseS4KICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDEpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnMicsICd3Jyk7CiAgZXEoJyAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3dvcmQxXG53b3JkMicsIHJlZ2lzdGVyLnRleHQpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDInIH0pOwp0ZXN0VmltKCdkX2luY2x1c2l2ZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBBc3NlcnQgdGhhdCB3aGVuIGluY2x1c2l2ZSBpcyBzZXQsIHRoZSBjaGFyYWN0ZXIgdGhlIGN1cnNvciBpcyBvbiBnZXRzCiAgLy8gZGVsZXRlZCB0b28uCiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAxKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2UnKTsKICBlcSgnICAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3dvcmQxJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxICcgfSk7CnRlc3RWaW0oJ2RfcmV2ZXJzZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBUZXN0IHRoYXQgZGVsZXRpbmcgaW4gcmV2ZXJzZSB3b3Jrcy4KICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnYicpOwogIGVxKCcgd29yZDIgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMVxuJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIDEpLCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyICcgfSk7CnRlc3RWaW0oJ2RkJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICB2YXIgZXhwZWN0ZWRCdWZmZXIgPSBjbS5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sCiAgICB7IGxpbmU6IDEsIGNoOiAwIH0pOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpIC0gMTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdkJyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoZXhwZWN0ZWRCdWZmZXIsIHJlZ2lzdGVyLnRleHQpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIGxpbmVzWzFdLnRleHRTdGFydCksIGNtLmdldEN1cnNvcigpKTsKfSk7CnRlc3RWaW0oJ2RkX3ByZWZpeF9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIHZhciBleHBlY3RlZEJ1ZmZlciA9IGNtLmdldFJhbmdlKHsgbGluZTogMCwgY2g6IDAgfSwKICAgIHsgbGluZTogMiwgY2g6IDAgfSk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCkgLSAyOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2QnLCAnZCcpOwogIGVxKGV4cGVjdGVkTGluZUNvdW50LCBjbS5saW5lQ291bnQoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKGV4cGVjdGVkQnVmZmVyLCByZWdpc3Rlci50ZXh0KTsKICBpcyhyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCBsaW5lc1syXS50ZXh0U3RhcnQpLCBjbS5nZXRDdXJzb3IoKSk7Cn0pOwp0ZXN0VmltKCdkZF9tb3Rpb25fcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICB2YXIgZXhwZWN0ZWRCdWZmZXIgPSBjbS5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sCiAgICB7IGxpbmU6IDIsIGNoOiAwIH0pOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpIC0gMjsKICBoZWxwZXJzLmRvS2V5cygnZCcsICcyJywgJ2QnKTsKICBlcShleHBlY3RlZExpbmVDb3VudCwgY20ubGluZUNvdW50KCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcShleHBlY3RlZEJ1ZmZlciwgcmVnaXN0ZXIudGV4dCk7CiAgaXMocmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKG1ha2VDdXJzb3IoMCwgbGluZXNbMl0udGV4dFN0YXJ0KSwgY20uZ2V0Q3Vyc29yKCkpOwp9KTsKdGVzdFZpbSgnZGRfbXVsdGlwbHlfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICB2YXIgZXhwZWN0ZWRCdWZmZXIgPSBjbS5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sCiAgICB7IGxpbmU6IDYsIGNoOiAwIH0pOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpIC0gNjsKICBoZWxwZXJzLmRvS2V5cygnMicsICdkJywgJzMnLCAnZCcpOwogIGVxKGV4cGVjdGVkTGluZUNvdW50LCBjbS5saW5lQ291bnQoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKGV4cGVjdGVkQnVmZmVyLCByZWdpc3Rlci50ZXh0KTsKICBpcyhyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCBsaW5lc1s2XS50ZXh0U3RhcnQpLCBjbS5nZXRDdXJzb3IoKSk7Cn0pOwovLyBZYW5rIGNvbW1hbmRzIHNob3VsZCBiZWhhdmUgdGhlIGV4YWN0IHNhbWUgYXMgZCBjb21tYW5kcywgZXhwZWN0IHRoYXQgbm90aGluZwovLyBnZXRzIGRlbGV0ZWQuCnRlc3RWaW0oJ3l3X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBBc3NlcnQgdGhhdCB5dyBkb2VzIHlhbmsgbmV3bGluZSBpZiBpdCBzaG91bGQgZ28gdG8gdGhlIG5leHQgbGluZSwgYW5kCiAgLy8gdGhhdCByZXBlYXQgd29ya3MgcHJvcGVybHkuCiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAxKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCd5JywgJzInLCAndycpOwogIGVxKCcgd29yZDFcbndvcmQyJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMVxud29yZDInLCByZWdpc3Rlci50ZXh0KTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyJyB9KTsKdGVzdFZpbSgneXlfbXVsdGlwbHlfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICB2YXIgZXhwZWN0ZWRCdWZmZXIgPSBjbS5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sCiAgICB7IGxpbmU6IDYsIGNoOiAwIH0pOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ3knLCAnMycsICd5Jyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoZXhwZWN0ZWRCdWZmZXIsIHJlZ2lzdGVyLnRleHQpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9KTsKLy8gQ2hhbmdlIGNvbW1hbmRzIGJlaGF2ZSBsaWtlIGQgY29tbWFuZHMgZXhjZXB0IHRoYXQgaXQgYWxzbyBlbnRlcnMgaW5zZXJ0Ci8vIG1vZGUuIEluIGFkZGl0aW9uLCB3aGVuIHRoZSBjaGFuZ2UgaXMgbGluZXdpc2UsIGFuIGFkZGl0aW9uYWwgbmV3bGluZSBpcwovLyBpbnNlcnRlZCBzbyB0aGF0IGluc2VydCBtb2RlIHN0YXJ0cyBvbiB0aGF0IGxpbmUuCnRlc3RWaW0oJ2N3X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBBc3NlcnQgdGhhdCBjdyBkb2VzIGRlbGV0ZSBuZXdsaW5lIGlmIGl0IHNob3VsZCBnbyB0byB0aGUgbmV4dCBsaW5lLCBhbmQKICAvLyB0aGF0IHJlcGVhdCB3b3JrcyBwcm9wZXJseS4KICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDEpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2MnLCAnMicsICd3Jyk7CiAgZXEoJyAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3dvcmQxXG53b3JkMicsIHJlZ2lzdGVyLnRleHQpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMicgfSk7CnRlc3RWaW0oJ2NjX211bHRpcGx5X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgdmFyIGV4cGVjdGVkQnVmZmVyID0gY20uZ2V0UmFuZ2UoeyBsaW5lOiAwLCBjaDogMCB9LAogICAgeyBsaW5lOiA2LCBjaDogMCB9KTsKICB2YXIgZXhwZWN0ZWRMaW5lQ291bnQgPSBjbS5saW5lQ291bnQoKSAtIDU7CiAgaGVscGVycy5kb0tleXMoJzInLCAnYycsICczJywgJ2MnKTsKICBlcShleHBlY3RlZExpbmVDb3VudCwgY20ubGluZUNvdW50KCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcShleHBlY3RlZEJ1ZmZlciwgcmVnaXN0ZXIudGV4dCk7CiAgaXMocmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKG1ha2VDdXJzb3IoMCwgbGluZXNbMF0udGV4dFN0YXJ0KSwgY20uZ2V0Q3Vyc29yKCkpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0pOwovLyBTd2FwY2FzZSBjb21tYW5kcyBlZGl0IGluIHBsYWNlIGFuZCBkbyBub3QgbW9kaWZ5IHJlZ2lzdGVycy4KdGVzdFZpbSgnZ353X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBBc3NlcnQgdGhhdCBkdyBkb2VzIGRlbGV0ZSBuZXdsaW5lIGlmIGl0IHNob3VsZCBnbyB0byB0aGUgbmV4dCBsaW5lLCBhbmQKICAvLyB0aGF0IHJlcGVhdCB3b3JrcyBwcm9wZXJseS4KICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDEpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2cnLCAnficsICcyJywgJ3cnKTsKICBlcSgnIFdPUkQxXG5XT1JEMicsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMicgfSk7CnRlc3RWaW0oJ2d+Z34nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAzKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIHZhciBleHBlY3RlZFZhbHVlID0gY20uZ2V0VmFsdWUoKS50b1VwcGVyQ2FzZSgpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2cnLCAnficsICczJywgJ2cnLCAnficpOwogIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMlxud29yZDNcbndvcmQ0XG53b3JkNVxud29yZDYnIH0pOwp0ZXN0VmltKCc+e21vdGlvbn0nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDMpOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIHZhciBleHBlY3RlZFZhbHVlID0gJyAgIHdvcmQxXG4gIHdvcmQyXG53b3JkMyAnOwogIGhlbHBlcnMuZG9LZXlzKCc+JywgJ2snKTsKICBlcShleHBlY3RlZFZhbHVlLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJycsIHJlZ2lzdGVyLnRleHQpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAzKSwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMlxud29yZDMgJywgaW5kZW50VW5pdDogMiB9KTsKdGVzdFZpbSgnPj4nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIHZhciBleHBlY3RlZFZhbHVlID0gJyAgIHdvcmQxXG4gIHdvcmQyXG53b3JkMyAnOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJz4nLCAnPicpOwogIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIDMpLCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG53b3JkMyAnLCBpbmRlbnRVbml0OiAyIH0pOwp0ZXN0VmltKCc8e21vdGlvbn0nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDMpOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIHZhciBleHBlY3RlZFZhbHVlID0gJyB3b3JkMVxud29yZDJcbndvcmQzICc7CiAgaGVscGVycy5kb0tleXMoJzwnLCAnaycpOwogIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIDEpLCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgICB3b3JkMVxuICB3b3JkMlxud29yZDMgJywgaW5kZW50VW5pdDogMiB9KTsKdGVzdFZpbSgnPDwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIHZhciBleHBlY3RlZFZhbHVlID0gJyB3b3JkMVxud29yZDJcbndvcmQzICc7CiAgaGVscGVycy5kb0tleXMoJzInLCAnPCcsICc8Jyk7CiAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcnLCByZWdpc3Rlci50ZXh0KTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKG1ha2VDdXJzb3IoMCwgMSksIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyAgIHdvcmQxXG4gIHdvcmQyXG53b3JkMyAnLCBpbmRlbnRVbml0OiAyIH0pOwoKLy8gT3BlcmF0b3ItbW90aW9uIHRlc3RzCnRlc3RWaW0oJ0QnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAzKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdEJyk7CiAgZXEoJyB3b1xud29yZDJcbiB3b3JkMycsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgncmQxJywgcmVnaXN0ZXIudGV4dCk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIDMpLCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG4gd29yZDMnIH0pOwp0ZXN0VmltKCdDJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnQycpOwogIGVxKCcgd29cbndvcmQyXG4gd29yZDMnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3JkMScsIHJlZ2lzdGVyLnRleHQpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAzKSwgY20uZ2V0Q3Vyc29yKCkpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG4gd29yZDMnIH0pOwp0ZXN0VmltKCdZJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnWScpOwogIGVxKCcgd29yZDFcbndvcmQyXG4gd29yZDMnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3JkMScsIHJlZ2lzdGVyLnRleHQpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAzKSwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMlxuIHdvcmQzJyB9KTsKCi8vIEFjdGlvbiB0ZXN0cwp0ZXN0VmltKCdhJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnYScpOwogIGVxUG9zKG1ha2VDdXJzb3IoMCwgMiksIGNtLmdldEN1cnNvcigpKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9KTsKdGVzdFZpbSgnYV9lb2wnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIGxpbmVzWzBdLmxlbmd0aCAtIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdChtYWtlQ3Vyc29yKDAsIGxpbmVzWzBdLmxlbmd0aCkpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0pOwp0ZXN0VmltKCdpJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnaScpOwogIGVxUG9zKG1ha2VDdXJzb3IoMCwgMSksIGNtLmdldEN1cnNvcigpKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9KTsKdGVzdFZpbSgnQScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ0EnKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIGxpbmVzWzBdLmxlbmd0aCksIGNtLmdldEN1cnNvcigpKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9KTsKdGVzdFZpbSgnSScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ0knKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIGxpbmVzWzBdLnRleHRTdGFydCksIGNtLmdldEN1cnNvcigpKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9KTsKdGVzdFZpbSgnbycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ28nKTsKICBlcSgnd29yZDFcblxud29yZDInLCBjbS5nZXRWYWx1ZSgpKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDEsIDApLCBjbS5nZXRDdXJzb3IoKSk7CiAgZXEoJ3ZpbS1pbnNlcnQnLCBjbS5nZXRPcHRpb24oJ2tleU1hcCcpKTsKfSwgeyB2YWx1ZTogJ3dvcmQxXG53b3JkMicgfSk7CnRlc3RWaW0oJ08nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdPJyk7CiAgZXEoJ1xud29yZDFcbndvcmQyJywgY20uZ2V0VmFsdWUoKSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAwKSwgY20uZ2V0Q3Vyc29yKCkpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0sIHsgdmFsdWU6ICd3b3JkMVxud29yZDInIH0pOwp0ZXN0VmltKCdKJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnSicpOwogIHZhciBleHBlY3RlZFZhbHVlID0gJ3dvcmQxICB3b3JkMlxud29yZDNcbiB3b3JkNCc7CiAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCBleHBlY3RlZFZhbHVlLmluZGV4T2YoJ3dvcmQyJykgLSAxKSwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnd29yZDEgXG4gICAgd29yZDJcbndvcmQzXG4gd29yZDQnIH0pOwp0ZXN0VmltKCdKX3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJzMnLCAnSicpOwogIHZhciBleHBlY3RlZFZhbHVlID0gJ3dvcmQxICB3b3JkMiB3b3JkM1xuIHdvcmQ0JzsKICBlcShleHBlY3RlZFZhbHVlLCBjbS5nZXRWYWx1ZSgpKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIGV4cGVjdGVkVmFsdWUuaW5kZXhPZignd29yZDMnKSAtIDEpLCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICd3b3JkMSBcbiAgICB3b3JkMlxud29yZDNcbiB3b3JkNCcgfSk7CnRlc3RWaW0oJ3AnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkucHVzaFRleHQoJyInLCAneWFuaycsICdhYmNcbmRlZicsIGZhbHNlKTsKICBoZWxwZXJzLmRvS2V5cygncCcpOwogIGVxKCdfX2FiY1xuZGVmXycsIGNtLmdldFZhbHVlKCkpOwogIGVxUG9zKG1ha2VDdXJzb3IoMSwgMiksIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJ19fXycgfSk7CnRlc3RWaW0oJ3BfcmVnaXN0ZXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoJ2EnKS5zZXQoJ2FiY1xuZGVmJywgZmFsc2UpOwogIGhlbHBlcnMuZG9LZXlzKCciJywgJ2EnLCAncCcpOwogIGVxKCdfX2FiY1xuZGVmXycsIGNtLmdldFZhbHVlKCkpOwogIGVxUG9zKG1ha2VDdXJzb3IoMSwgMiksIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJ19fXycgfSk7CnRlc3RWaW0oJ3Bfd3JvbmdfcmVnaXN0ZXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoJ2EnKS5zZXQoJ2FiY1xuZGVmJywgZmFsc2UpOwogIGhlbHBlcnMuZG9LZXlzKCdwJyk7CiAgZXEoJ19fXycsIGNtLmdldFZhbHVlKCkpOwogIGVxUG9zKG1ha2VDdXJzb3IoMCwgMSksIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJ19fXycgfSk7CnRlc3RWaW0oJ3BfbGluZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJyAgYVxuZFxuJywgdHJ1ZSk7CiAgaGVscGVycy5kb0tleXMoJzInLCAncCcpOwogIGVxKCdfX19cbiAgYVxuZFxuICBhXG5kJywgY20uZ2V0VmFsdWUoKSk7CiAgZXFQb3MobWFrZUN1cnNvcigxLCAyKSwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnX19fJyB9KTsKdGVzdFZpbSgnUCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJ2FiY1xuZGVmJywgZmFsc2UpOwogIGhlbHBlcnMuZG9LZXlzKCdQJyk7CiAgZXEoJ19hYmNcbmRlZl9fJywgY20uZ2V0VmFsdWUoKSk7CiAgZXFQb3MobWFrZUN1cnNvcigxLCAzKSwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnX19fJyB9KTsKdGVzdFZpbSgnUF9saW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLnB1c2hUZXh0KCciJywgJ3lhbmsnLCAnICBhXG5kXG4nLCB0cnVlKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdQJyk7CiAgZXEoJyAgYVxuZFxuICBhXG5kXG5fX18nLCBjbS5nZXRWYWx1ZSgpKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIDIpLCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICdfX18nIH0pOwp0ZXN0VmltKCdyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnMycsICdyJywgJ3UnKTsKICBlcSgnd3V1dWV0JywgY20uZ2V0VmFsdWUoKSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAzKSwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnd29yZGV0JyB9KTsKdGVzdFZpbSgnLyBhbmQgbi9OJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdtYXRjaCcpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdChtYWtlQ3Vyc29yKDAsIDExKSk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KG1ha2VDdXJzb3IoMSwgNikpOwogIGhlbHBlcnMuZG9LZXlzKCdOJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdChtYWtlQ3Vyc29yKDAsIDExKSk7CgogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcvJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdChtYWtlQ3Vyc29yKDEsIDYpKTsKfSwgeyB2YWx1ZTogJ21hdGNoIG5vcGUgbWF0Y2ggXG4gbm9wZSBNYXRjaCcgfSk7CnRlc3RWaW0oJy9fY2FzZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnTWF0Y2gnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQobWFrZUN1cnNvcigxLCA2KSk7Cn0sIHsgdmFsdWU6ICdtYXRjaCBub3BlIG1hdGNoIFxuIG5vcGUgTWF0Y2gnIH0pOwp0ZXN0VmltKCc/IGFuZCBuL04nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ21hdGNoJyk7CiAgaGVscGVycy5kb0tleXMoJz8nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KG1ha2VDdXJzb3IoMSwgNikpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdChtYWtlQ3Vyc29yKDAsIDExKSk7CiAgaGVscGVycy5kb0tleXMoJ04nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KG1ha2VDdXJzb3IoMSwgNikpOwoKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnPycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQobWFrZUN1cnNvcigwLCAxMSkpOwp9LCB7IHZhbHVlOiAnbWF0Y2ggbm9wZSBtYXRjaCBcbiBub3BlIE1hdGNoJyB9KTsKdGVzdFZpbSgnLC8gY2xlYXJTZWFyY2hIaWdobGlnaHQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ21hdGNoJyk7CiAgaGVscGVycy5kb0tleXMoJz8nKTsKICBoZWxwZXJzLmRvS2V5cygnLCcsICcvJywgJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDExKTsKfSwgeyB2YWx1ZTogJ21hdGNoIG5vcGUgbWF0Y2ggXG4gbm9wZSBNYXRjaCcgfSk7CnRlc3RWaW0oJyonLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCcqJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdChtYWtlQ3Vyc29yKDAsIDIyKSk7CgogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcqJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdChtYWtlQ3Vyc29yKDEsIDgpKTsKfSwgeyB2YWx1ZTogJ25vbWF0Y2ggbWF0Y2ggbm9tYXRjaCBtYXRjaCBcbm5vbWF0Y2ggTWF0Y2gnIH0pOwp0ZXN0VmltKCcqX25vX3dvcmQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCcqJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJyBcbiBtYXRjaCBcbicgfSk7CnRlc3RWaW0oJypfc3ltYm9sJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnKicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMCk7Cn0sIHsgdmFsdWU6ICcgL31cbi99IG1hdGNoIFxuJyB9KTsKdGVzdFZpbSgnIycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJyMnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KG1ha2VDdXJzb3IoMSwgOCkpOwoKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnIycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQobWFrZUN1cnNvcigwLCAyMikpOwp9LCB7IHZhbHVlOiAnbm9tYXRjaCBtYXRjaCBub21hdGNoIG1hdGNoIFxubm9tYXRjaCBNYXRjaCcgfSk7CnRlc3RWaW0oJypfc2VlaycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBTaG91bGQgc2tpcCBvdmVyIHNwYWNlIGFuZCBzeW1ib2xzLgogIGNtLnNldEN1cnNvcigwLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnKicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQobWFrZUN1cnNvcigwLCAyMikpOwp9LCB7IHZhbHVlOiAnICAgIDo9ICBtYXRjaCBub21hdGNoIG1hdGNoIFxubm9tYXRjaCBNYXRjaCcgfSk7CnRlc3RWaW0oJyMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gU2hvdWxkIHNraXAgb3ZlciBzcGFjZSBhbmQgc3ltYm9scy4KICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJyMnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KG1ha2VDdXJzb3IoMSwgOCkpOwp9LCB7IHZhbHVlOiAnICAgIDo9ICBtYXRjaCBub21hdGNoIG1hdGNoIFxubm9tYXRjaCBNYXRjaCcgfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror3/theme/ambiance-mobile.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtYW1iaWFuY2UuQ29kZU1pcnJvciB7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOwogIC1tb3otYm94LXNoYWRvdzogbm9uZTsKICAtby1ib3gtc2hhZG93OiBub25lOwogIGJveC1zaGFkb3c6IG5vbmU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/ambiance.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogYW1iaWFuY2UgdGhlbWUgZm9yIGNvZGVtaXJyb3IgKi8KCi8qIENvbG9yIHNjaGVtZSAqLwoKLmNtLXMtYW1iaWFuY2UgLmNtLWtleXdvcmQgeyBjb2xvcjogI2NkYTg2OTsgfQouY20tcy1hbWJpYW5jZSAuY20tYXRvbSB7IGNvbG9yOiAjQ0Y3RUE5OyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1udW1iZXIgeyBjb2xvcjogIzc4Q0Y4QTsgfQouY20tcy1hbWJpYW5jZSAuY20tZGVmIHsgY29sb3I6ICNhYWM2ZTM7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXZhcmlhYmxlIHsgY29sb3I6ICNmZmI3OTU7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogI2VlZDFiMzsgfQouY20tcy1hbWJpYW5jZSAuY20tdmFyaWFibGUtMyB7IGNvbG9yOiAjZmFkZWQzOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjZWVkMWIzOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1vcGVyYXRvciB7Y29sb3I6ICNmYThkNmE7fQouY20tcy1hbWJpYW5jZSAuY20tY29tbWVudCB7IGNvbG9yOiAjNTU1OyBmb250LXN0eWxlOml0YWxpYzsgfQouY20tcy1hbWJpYW5jZSAuY20tc3RyaW5nIHsgY29sb3I6ICM4ZjlkNmE7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXN0cmluZy0yIHsgY29sb3I6ICM5ZDkzN2M7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLW1ldGEgeyBjb2xvcjogI0QyQThBMTsgfQouY20tcy1hbWJpYW5jZSAuY20tZXJyb3IgeyBjb2xvcjogI0FGMjAxODsgfQouY20tcy1hbWJpYW5jZSAuY20tcXVhbGlmaWVyIHsgY29sb3I6IHllbGxvdzsgfQouY20tcy1hbWJpYW5jZSAuY20tYnVpbHRpbiB7IGNvbG9yOiAjOTk5OWNjOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1icmFja2V0IHsgY29sb3I6ICMyNEMyQzc7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXRhZyB7IGNvbG9yOiAjZmVlNGZmIH0KLmNtLXMtYW1iaWFuY2UgLmNtLWF0dHJpYnV0ZSB7ICBjb2xvcjogIzlCODU5RDsgfQouY20tcy1hbWJpYW5jZSAuY20taGVhZGVyIHtjb2xvcjogYmx1ZTt9Ci5jbS1zLWFtYmlhbmNlIC5jbS1xdW90ZSB7IGNvbG9yOiAjMjRDMkM3OyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1ociB7IGNvbG9yOiBwaW5rOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1saW5rIHsgY29sb3I6ICNGNEMyMEI7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXNwZWNpYWwgeyBjb2xvcjogI0ZGOUQwMDsgfQoKLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICMwZjA7IH0KLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3Itbm9ubWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICNmMjI7IH0KCi5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLXNlbGVjdGVkIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwp9Ci5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWZvY3VzZWQgLkNvZGVNaXJyb3Itc2VsZWN0ZWQgewogIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7Cn0KCi8qIEVkaXRvciBzdHlsaW5nICovCgouY20tcy1hbWJpYW5jZS5Db2RlTWlycm9yIHsKICBsaW5lLWhlaWdodDogMS40MGVtOwogIGZvbnQtZmFtaWx5OiBNb25hY28sIE1lbmxvLCJBbmRhbGUgTW9ubyIsImx1Y2lkYSBjb25zb2xlIiwiQ291cmllciBOZXciLG1vbm9zcGFjZSAhaW1wb3J0YW50OwogIGNvbG9yOiAjRTZFMURDOwogIGJhY2tncm91bmQtY29sb3I6ICMyMDIwMjA7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgMTBweCBibGFjazsKICAtbW96LWJveC1zaGFkb3c6IGluc2V0IDAgMCAxMHB4IGJsYWNrOwogIC1vLWJveC1zaGFkb3c6IGluc2V0IDAgMCAxMHB4IGJsYWNrOwogIGJveC1zaGFkb3c6IGluc2V0IDAgMCAxMHB4IGJsYWNrOwp9CgouY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsKICBiYWNrZ3JvdW5kOiAjM0QzRDNEOwogIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICM0RDRENEQ7CiAgYm94LXNoYWRvdzogMCAxMHB4IDIwcHggYmxhY2s7Cn0KCi5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgewogIHRleHQtc2hhZG93OiAwcHggMXB4IDFweCAjNGQ0ZDRkOwogIGNvbG9yOiAjMjIyOwogIHBhZGRpbmc6IDAgNXB4Owp9CgouY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1saW5lcyAuQ29kZU1pcnJvci1jdXJzb3IgewogIGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc5OTFFODsKfQoKLmNtLXMtYW1iaWFuY2UgLmFjdGl2ZWxpbmUgewogIGJhY2tncm91bmQ6IG5vbmUgcmVwZWF0IHNjcm9sbCAwJSAwJSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMxKTsKfQoKLmNtLXMtYW1iaWFuY2UuQ29kZU1pcnJvciwKLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1nQUFBRElDQVFBQUFBSFVXWVZBQUJGRlVsRVFWUVlHYnpCQ2VEVlUvNzQvNmZqOUhJY3gvRlJIeDlKQ0Ztek15R1JVUmhMWklrVXNvZVJmVWpTMkZORHRyNldrTWhPOXNtK1M4bWFKZnUrSmNzZysvby9jK1o0ei90OTcvdmV6eTN6K3o4ZWtHbG5ZSUNHL283Z2RrK3dtU0haMXo0cEpJdHFhcGpvS1hXYWhtOE5tVjZlT1RiV1VPcDYvNmEvWElnNkdRcW1lbkoybERIeXZDRloyY0JEYm10SEEwNDNWRmhId1h4Q2xXbWVZQWRMaFYwMEJkODVnbzhWbWFGQ2tiVmt6bFFFTnpmQkRaNWd0TjdId0YwS0RyVHdKMGR5cFNPenBhS0NNd1FIS1RJcmVZSXhsbWhYVHpUV2tWbStMVHluWmhpU0JUM1JaUTdhR2ZqR0VkM3F5WFExRkR5bXFiS3hwc3BFUlFOMk1pUmpOWmxGRlFYZkNORm05bk0xenBBc29Zam10UlRjNWFqd3VhWGM1eHJXc2tUOTdSYUt6QUdlNUFSSGhWVXNEYmpLa2x6aWlYNVdST2NKd1NOQ05JKzl3MUp3djRaYjJyN2xDTVo0b3E1QzBFZFR4KzJHek51S3BKK2lGZjM4SkVXa0hKbjlETkY3bW1CRElUcldFZzBWV0wzcEhVMjB0U1pudXFXdStSM0J0WWE4WHhWMUhPN0d5RDMyVWtPcEwveURsb0lORlRtdnRJZCtubUFqeFJ3NDBWTXdWS2l3cktMRTRiSzVVT1ZudFl3aE9jU1NYS3JKSEtQSmVkb2NwR2pWei9aTUlibllVUEIxMC9lS0NyczVhcHFwZ1ZtV3pCWVdwbXRLSGVjSlBqYVV1RWdSRERhVTBvWmdoQ0o2ek5NUTVaaERZeDA1cjV2Mm11UWRNMEVJTHRYVXNhS2lRWDlXTUVVb3RhZ1F6RmJVTk42TlVQQzJubTVweEVXR0NqTWMzR2RKSGpTVTJrT1JMSy9KR1Nya2ZHRUlqbmNVL0NZVW5PaXBvWWVtd2o4dFNUOU5zSm1CN1RVVlh0YlV0WEFUSlZaWEJNdlllVFhKZm9iZ0pVUG1HTVAveUZhV29uYWE2QmNGTzNucWNJcUNvelNab1pvU3IxZzR6Sk96dXlHbnhURVgzbFVFSjdXY1pnbWU4ZGRhV3ZXSm8yQUpSOURaVTNDVUliaENTRzZ5YlN3TjZxdEpWbkNVMnN2RFRQMlpJbk93MmNCVHJxdFFhaHROWm45TmNKNGwyTmFTbVNra1Axbm9aV25Wd2tMbWRVUE93TFpFd3kyWjNTM1IrNHJJRzloY2JwUFhIRlZXY1FkWmtuMkZPdGEzY0tXUW5OUkM1ZzFMc0phaDRHQ3pTVnNLbkNPWTVPQUZSVEJla3l5cnlleWlsaEZLdmE3NXI0TWMwYVdhbkdFYVRoY3kzMXM0MzlLS3hUekpZWTVXVEhQVTFGdElIalFVM09pcDR4bE56ai9sQncyM2RZWlZsaVFhN1dBWGY0c2hldGNRZmF0SStqV1JEQlBteU5lVzZBMVA1a2REZ3lZSmxiYTBCSU04Qlp1MUpmckZ3SXR5amNBTVIzSzBCV09JcnRNRVh5aHlybFZFeDN1aTVkVUJqbUIvUTNDWFc4NVI0bUJEMHM3Qis0cTV0S1VqT2xiOXFxbWhpNUFaNkdGSUM1SFh0T29iZFlHbFZkTVZiTko4dG9OVEZjSHhub0wrbXVCYWdjY3RqV25iTk11UjAwdUk3blFFU3dnNXEycXFyS1dJZnJOVW1lUW9jWTZIdXl4SlYwMndqMzZ3MDB5aHBtVUZlbnY0cDZmVWtaWXFMeXVpbngyUkdPamhDWFl5SkY4NG9pVTAwWU1PT2hocXVOZGZiT0I3Z1U4OHBZNHhKTzhMVmRwNi9xMnZvZUI0UjA0dklkaFNFNDB4Wk9ieDFIR0dKL2phMExCdGhGSW5LYUxQUEZ6dUNhWWFvajhKalBNRTh5b3l4bzZ6bEJxa2lVWllncTAwT1lNc3diV081TkdtcSt4aGlweEhMUlcyOUFSak5LWE8wd1JuZWFyOFhTZzRYRlBMS0VQVVMxR3F2eUx3aXVCVW9hN3pwWjBsNXh4RndXbVdaQzFINWg1RndVOGVRN0srZzhVY1ZZNlRNUXJlVlFULzh1UThaK0FMSVhuU0VhMnBZWlFuZUU5UlpiU0JOWVhmV1lKelcvaC80ajREcDF0WVZjRklDNTAxOVZ5aTRUaFBxU0ZDempHV2FIUVRCVThxNnZyVndneFA5TGttODQwaW1XS3BjTENqWVR0ckt1d3ZzS1NucnZIQ1hHa1NNazlwNmxoY2tmUnBJZWlzK04yUGlzelQrbUZMc3B5R2xlVWhEd2NMclpxbXlleWx4d2pCY0tIRWFwcWtteWFuZ3lMWlJWT2lqd090Q1k1U3NHNXpMME93bENKNHk1S3puRjNFVU5ERHJpbndpeUxaUnpPWHRsQmJLNUlUSEZHTHA4UTBSNmFiNm1TN2VuSTJjRnJ4T3lIdk9DRmFUMUhUaFMxa3JqQ3dxV2V1ckNrayt3aWxsaENDK1JTWm5SWEJpWmFDNVJYUklaWUtwMmx5ZnJId2lLUEtSMEpEenJkVTJFRmdwaWRhd2xGRFI2RmdYVU1OYStnMUZZM2JVUWgyY0xDd29zUmRudVFUUy9TK0pWckdMZVdJdnRRVXZPTkp4bHFTUVlZS3B3b04ya2FvY0xqZFZzaXM0TWs4MEVTRjJZcFNrendsZGpIa2pGQ1V1dEkvcitFSERVOG9DczZ5ekwzUGhXaUVvb1pkRk1reW1sYXM0QWNJM0ttb01NTlNRM3RIempHV0NyY0pKZFl5WkM3UUZHd2pSTDlwK01yUmtBR1d6SWFXQ245VzBGM1RzSzAxYzJadlF3MGJ5dnh1UVUwcjFsTTBxSk83d1cwa1JJTWREVHRYRWR6aTRWSWgrRW9JSG0wbVd0QXRwQ2l4bGFiZ244M2ZLVEk3YW5KZTlTVDdXSUsxRE1HcFFtWWVBNThJbVY2ZXpPR096SzJLZ3EwMXBkNjBjS1dpVWk5TGlldmIvMHZJRFBIUTA1S3p0NGRkUGNrUUJRdG9hdXJqeUhuZWsvbkt6cFFMclZnS1BqSWtoMnY0dXllenB2K1hvbzdmUEZYYUdGcDF2YUxLeFE0dVVwUVFTNVZ1UXM3QkNxNHhSSnY3ZndwVnZ2RkVCM2orNjIwaGFPdW9jcU1oV2Q2VFRQQUV4K21kRk5HSGRyYW5GZTk1V3JXbUl2bFk0RjFEbGUyRUNnYzZjdG83U3J5dXFHR0doYTB0RlE1VjUzbWlnVUttZzZYS0FvNHFTM21payswT1pwQWhPTGVaS2ljYWNnYVljeXg1aHlwWVFFMDJaQTR4aS9wTmhPUXhSNGtsTkt5cWFjaittcHhuTFRubkdTbzg1KyszWkNacTZsclprWGxHRVgzbytDOUZpZWNjSmJaV1ZGakMwWW8xRlpuSmhvWU1Gb0kxaEVaOXI2aHdnNzVId3pCTmhiWkNkSkVmSndUUEd6SnZhS0ltdzF5WVgxSERBbXBYUitaSlEvU21ncU1OVlFiNXZnYW1Hd0x0dDdWd3ZQN1FrMXhwaU01eDVDeXY5M0UwNk1abWdzME55YTJheklLT1lLQ0dCUVFXOTdSbWhLTktGMDJKWnFIRUo0bzU4cXA3WDVFY1ptYzU2dHJYRXF6akNCWjFNRkdSODdRbDJ0U1RzNkNHeFMwNVBUelJRb3JrYnc3YUtvS1hGRFhzWVc0MlZKaWgvcStGUDJCZFR6RFR3VnFPWUIxM2xpTTUwdkc3d3kyOHFhZ3l1SVhNZVFJL09xcThiY241d0pJNTB4SDAwQ1JudHlmcEwxVDRoeWRZcG9YZ05pRnpvSVVURFpuTE5Semg0VEJId2JZR0R2Wmt4bWx5SmxveXI2dFJpaHBlVUc5NEduS3RJem5SRUYwdHpKRy9PT3I3M0pCY3JTaDFrNld1VHByZ0xVK21uU0dudjZaZ2UwTk56K2tURGRIOG51QXVUZEpEQ05iMjFMQ2lJdXFsWWJxR3pUM1JBb1pvZlFmakZhemtxZU5XZFlhR3ZZVE0wMDFFVzJvS1B2VmsxbGRVR1NnVXRIRndqS00xaDlqbkZjbXk1bENob0xOYVFNR0dEc1liS2l4bGFNQm1tc3gxUWpDZmZsd1RmTy9nY2tXMHJ1WjNqdWdLUjNSNVc5aEdVV3FDZ3h1RmdzdWFDSG9yb3RHS3pHYWVaQjlETXNhVG5LQ3BNdHdUdk96aFlrMHJkckFyS0NxY2FXbVZrMStGMzcydXIxWWtLeGdhdEk4UWZlMWdJWDl3RTlGZ1M4RVNtdUFCSVhuUlViQ2FwY0tlK25PN3NsQ2xTWkZ6cFYvTGtMbmNFYjFxaU80MmZTM1I4NTVTdTJtQ0xoNjJ0MVNZWlpZVm1Ld0lIalJFRjJ1aWhUekIyMEpPa3o3ZGt4ellRbkswVU9VNDk0d2grVldSYzZVbjJrcFRhVmdMREZFa0ovdWh6UmNJMFlLR2dwR1dPbG9jQlUvYTRmS29KL3BFYU5WNmppcDMrRXM5VlhZMDc4ckdubUFkZjd0OXlsUFhTMzRSQlN1WVBzMVVlY1pUVTc4V2FuaEJDSHBaNXNBb1R6MExHWktqUGY5VFJ5cHFXRWlUdk9GZ2xMMWZDRVkzd1kvKytyYms3QzhiV2ViQTZwNm9tNlBnT0wya3A0NFRGSmxWTkJYYWUycnFxZFp6dE9KcFQ4N0dRc0U5anFDUEllOVZSZVp1US9DSWdhY3N5WmRDcElTY1NZcWNaazhyK25zeUN6aHlmaE9xSEdPSXZyTGtuQzh3VHBGY2FZaUdDL1JVMU5SYlVlVXBvY1FPbmtScEdPcklPY05SeCsxdUEwVXJ6aFNTdCtWeVMzU0pwbkZXa3pORHFPRkdJV2NmUjg2RG5tQVJUUTFIS0lMMzNFeFBpZW1lT2hZU1NqemxTVVpadUU0VHZlb0pMbkJVT0ZvZjZLaXlzQ2JuQUVjWmdjVU5URE93a3FXdTNSV3RtR3Bad2xIaEpFTmRaM21pR3owbEpsc0tuamJ3cVNIUWpweG5GRGxUTEx3cUpQTVpNamQ3S3J6a1NHN1ZzeFhCWkUrRjhZWmtiMDFPZTAweXlSSzlwc2g1U1loMjl5U1BLQm8yeWxOaHQ3WmtabnNLZW5qS05KdTlQTkV5WnBhQ0h2NEt0NlJRc0x2QVZwN005a0lpbW1DVXdHZVdxTE1tR3VJb3RZTW1XTnBTYWhraFp3OUZxWnNWbktKaHNqQUh2dEhNc1RNOWZDSTA2RHgvdTN2ZlVYQ3Fmc0tSYzRvRlkyak1zb28vN0RKRHdaMUNzSUtuSnUrSjlsZGtwbWlDeFF4MXJXakkrVDlGd2NXV3pPdWFZSDBIajdrbE5SVldFUXBtYXFvc2FraUdOVEZIZGpTL3FuVWRtZjBOSlc1eHNMMEhoaW1DQ1paU1J6bVNQVFhKUTRhYXp0QXd0Wm5vYWJlYkoraHRDYVo3Q201MzVCeW9xWEtiWDFXUmM0RWgyTWtSWFd6SW1WYzk2Q2o0VmRPS1Z4Ujg0VmRRc0lVTThQc29vdTJieVZIeVpGdXE3TzhvdGJTUTJVQW9lRVdUdWRBVExHU3BaelZMbFhWa1BVMkpjKzI3bHN3MmptZzVUNVZoYmVFM0JUMDgzSzlXc1RUa0ZVL09zaTByQzVsUmxwd1JIVWllc05TMHNPdm1xR01MMWFSYlBBeFRKRDlaS3R4dW9iK2hobDhjd1lHV3BKOG51Yjd0NXA2Y29ZYk1vdloxQlRkYUtuMWpZRDZoNEdGRE5GeVQvS3FlMVhDWHBoWEhPS0xabXVSU1JkQlBFZlZVWFF6Sm01WUdQR0dKZHZBRXI3aEhOZEdabnVCdnJwY2lHbW9wT0xmNU4wdVZNeTBGZllUb0prOTB1VUNiSnVwYVZwTzUzVUpYUjJiVnBvVTAwVjJLT280ek1GckJkMEp0ejJwYTBjbFQ1UTVMOElwUTE3N21XUWVqUE1FSmh1UWpTMTByZWY2SEhqZEVoeTFQMUVZUjdHdE8wdVNzS0pRWUxpVG5HMXJWU2NqNWx5YXpwcVdHbDV1QmJSV2w3bTZpeEdPT25Fc01KUjd6OEowbjZLTW5DZHhoaU5ZUUNvWjZDbVlMbk84b21DM01rVzNia3RsUG1FdC9WUVFIZWpMMytkT0U1RmxQZEsvTXE4aFp4eEp0THlScmVwTFRoWUtiTFp4a1NiNVc1MnZZeE5PYU94VUYweXhNVVB3QlRZcUN6eTAxWGF5WUswc0p5V0JMcVgwTXdVNUN6b3ltUnpWMEVqamVVZUxnRHBUbzZpajQyWkF6dkQwMWRIVVVUUExVOTZNZExiQk1FOG5GQm43ekpDTXRKY1pva244WW9xVTBGUzVXRkt5bmlIb2JndU1jbVc4TjBYa1daamt5TjNocU9NdFMwOHIrL3hUQndwWlNaM3FpVlJYOFN6TUhIamZVTkZqZ0hFUG1ZOVBMM3lrRXp4a1NyZS8xWkQ2ei9OdXpudUIwUmNFMVRXVG05elJnZlVXVkppRzZ5cnpnbVdQWEM4RUFSNFd4aGxhZDBaYmdReUV6M3BHNVJWRXd3REpIMm1nS3BqY1RpQ096bjFsZlVXQU5GYloyQkE4YmFsbkV3ZUpDOUowaXVhZVpvSStpcHBGQ3p0RUtWdmNrUjJpaWNlMUp2aFZ5dHJRd1VBWnBnc3ViQ1BhVTd4VWU5dlduYU9wYVNCRXNwYWx5a2hDOWJVbE9NcFQ0MlpIY2E2aHlycUttdy93TVI4SDVabWRGb0JWSmIwM080VUwwdFNObnZJZVJta3JMV3Fyczc4Z2NyRW4ydHBjYm9oMFVQT1czVVVSOVBNazRUNG5uTktXbUNqbHJlZmhDd3hSTnp0Zm1JUVZkREVsdlM0bTEvV3VPdWpvWkNzNVhWT2p0S1BHb2tKenNZQ3RGWW9Xb25TUFQyMURoZVUvd1doTTE5RmNFbHdxTkdPc3A5UThOL2N3WGFpTkQxTW1lTDFRNVhST3RZWWdHZUZxMWFUTXNvTW1jcktqUXJPRlFUUTFmbUJZaG1XNm84SmtqYzdpREpSVEJJbzVrZ0pENXlNRVlBM3NyQ2c3VkZLd2lWSmttUkNjNW9oR09LaHNZTW4vWEJMZG81dGFaamxiOVlBbEdXUmltcWJDc29ZN0hGQVhMYTVJMUhQUnhNTXNRREhGa1d0Uk5uaXFUOVVFZU5qY0U3UlVsckNKNFIyQ1NKdXFsS0hXdkpYakFVTmNJVFlrZW51QlJCODRUYmVlcGNxVGozelp5Rkp6Z1lRZEhucWZnSTBkZFV3UzZHcVdwc0tXaGpxOWNWMHZCQUVNTjJ6bnErRUJmSVdUK3BDbFl3NXhzVGxKVTZHZUlCc2pHbW1BTlR6SlppSVlwZ3JNME9hOFpNamQ3TlA4N2p4aHFHT2hKbG5RdGp1UXBCKzhhRUUwMHdaRnpuU0pQeUh4Z0gzSGtQT3NKRnZZazh6cUNIelRzMUJZT2E0SjNQRlUrVVZSWnhsSERNNFlhdmxOVXVNb1J2ZWlaQTJkN2dyTU5jMmcrUmJTQ0VLem1nWXNVbVdtYXpGSnlvaU9aNEtueWhLT0dSeldKYTArbW95VjRUVkhEem41MUF3dHFhcGhmay9sUlEwOEZYMWlpcXhUQi9rTHdkMFZ5bktmRXZJNmNkNFhNVjViTWhaN2daVVdWellRNk5tMkJZenhKYnczYkd0aEVVVU1mZ2JHZW9yYWU2RHhIdEpvWjZhbGhaMCt5dGlWb0sxUjR6NVBUck9FQ1QvU3Vnc2VFT2xiMU1NTlI0VlJOY0p5K1YxSGc5T05DbFNaRlpqZEhsYzZXNkZCTGRKamEyTUM1aGhwdTBEQllFWTFURkd3aUZBeFJSQ3NZa2lNOUpSYjBKTk1Wa1c2Q1pZVC8yRWlUR1dtbzhrK2g0RmhETkU3QnZwcG9UU0ZubUNWNXhaS3p2Y0NkRG83VlZQbklVK0krUmM2OGp1QXBDOTBNd2NGQ3NKNWhEcXhnU2NZS3JlcnV5UXdUcXJ6b3FEQ21oV2k0SWJoQjBZcnQzUkdhNkdmRHY1MnJLWFdoaDI4ZHlaYVdVdmNaZU1UQmFab1NHeWlDdFJVNUo4aXZpaW9IYUVyczdKa2o2MXN5VnpUVGdPY1VPUThidUZCVFlXZEw1ZzNUNHFscGUwK3d2RDYzaGVBWFJmQ0NJZWQ5UmJDc3AyQ2lJN3JhVU9ZT1RVMTNOOFBOSHZwYUd2YXlvNGEzTExUMWxEclZFUFQyekxVbGhlQjFSK1pUUmZLV0orZGNvY0xKZmkxMXZ5SjUxbExxSjBXRDd0UndyeWV6amlWNVcyOHVKTzlxeWt6WDhKRGUybEhsLzlveUJ3YTJVTWZPbmdwWENpeHZLZFhUazN3cnNLbWlWWWRaSXFzb1dFRVJqYmNVTkR1aWFRb21Hb0liRmRFSG1zeVdudVIrSWVyaUtEVkxubGF3bHlOSEt3S2xTVTYzMVBLZXA4SjRRK2F5amtTTEtZTGhhbE5IbFl2dHRiNmZIbTBwNk9BcHNaNGwyVmZkcVpranV5c3k2eXNLTGxja2YxS1V1dENUczM5Ym1DZ0V5eW9hc0lXbFZhTUY3bWdtV3RCVDhLb2w1eHBIOUlHbGxvOGNKZG9wY3ZaMnNJbWxEbU1JYnREazNLSXBlTmlTMDhsUXcxMU5GUFR3VkZsUFA2cEoyZ3ZSZkk3Z1FVZm1OQXRmNkdzMHdReERzS0dsVkJkRjhyQ2Ezanpkd01hR0hPc0l0clprN2hBeU96cEs5VlMwNmo1RjQ5YjBWTkdPT2ZLczNsRFRvTXNNQmU5Wld0SEZFZ3hUSkxzN3FyeWdLWmpVbm1DWW9lQXFlVTZqcVd1TEp1cDRXZ2hPZHZDWUpuclNrU3pveVJrbTVNMlN0UXdWbHRQa2ZDQWs1OHRFVC9DU2crOE1VZWNtb3RNRW5oQktmV0JJWnNnMmlocnVNSlFhb0ltK3RrVExLRXFzcE1oMDB3OTVndkZDUVJ0RHdUVDFnVkREU0VWZGx3cVpmeG9RUmJLMGcrdGJpQlp4ektscG5weXBlamREd1RhZU92b3JNay9JSkUxMGg5Q3FSZTI4aGhMYmUwcE1zZFN3djRaYmhLaXZvMkJqRFdmTDhVS0pnZWF2d2x3YjVLbHdoeUU0dTRYa0dFMnl0WkN6bktMQ0RaWnE0MlZ6VDhITENycHJ1RmJJZk9JSU5taC9xQ2RaMVpCYzY1a0xIUjFCa3lmNXpuNnBOM1N2R0tJbEZOR3BsaHJPOVFTWGFuTE9NUVRMQ2EwWUpDUnJDWm0vQ1ptckxUbTdXekNLNEdKRGlXVWRGZVl4MUxDRmczTk1kMFhtQ3VGM1k1cklUTERVc1lTOXpvSFZ6d25Kb1lwU1RRb09ieUV6cjRjRkJOcVlUb3BvYVUvd2t5TFoybFBoWC81WTk1dWx4R1RWN0tqaFdyT1pnbDhNeVVVYWZqWXJhTmpOVTFOM0lXY2pUNVd6V3Fqd3RvYXJIU1VPYkdZTzNHQ0pacHNCbG5KR1BkNlpZTHlsMUdkQ0EyNjI1SXd3SkRQOEdVS3ltYnp1eVBsWmx2VFVzYVVoNXpGRGhSV0Z6UEtLWkxBbFdkY1FiT2JnRjl0T3FPc21CMWRxY3FZSm1Xc3RGYlpSUkk5cG9vbG1xaUxuVTBQT3Z4U2NwYWgyaVNMNVVKTnpnU2NZNStBdUlicE8wWUQzTkNXK2RMTXN6RlNkRkNXR3FHNmVWcTJ1WVZORGRJQ0dENlc3RVBSV1pFWTVncHNFOXJVa1MzbWlqenpKbm02VXBVRlhHMWhDVWVWb1M1V2ZOY0ZwYmxFTEwycXFyQ3ZNdlJmZDQ1b2FsdktVMnRpUTZlUEpPVk1SWGFzZTlpVHRMSnp0UHhKS0xXcG8yQ1JEY0p3bjJzV1NMS0lPMVdRV05UQ3ZwVlV2T1poZ1NDNDBKRDBkT2N0YVNxemtDUmJYc0tsYjExT2lwNlBDSjBJd1NKTTMxajNha1J4bFA3UnduNmFHYVVMMHFpTG5Ka3ZCM3hXWjIrUTFUZkN3cFFIM0cwbzkyVXptWDRvL29KTlFNTVNRYzU0N3dWSGhkaytWQ3cwMURGWUVuVHh6WktBbTc0UW1lTk5SMXc2V3pFaE5LMTVWSnp1Q2R4UTUzZFJVRHdzNUt2d2dCTU9FZ3BjVk5lMGhaSTZSWFQxSmQwY3lqNW5zYUVBSGdWbUdhSklsV2RzYzVVaTJFbHJSUjZqclJBdHROTUVBSVdyVERGdWJrWmFvazcvQWt6Zkl3ZnVXVnEwakh6dUNLNFFhYnRMVU1WUEIza0owb3lIVFNWRmxxTUFMaWxKZjJSZjhrNWFhSHRNZmF5b2NMQlM4TDg5b0tveHBKdm5Ba0RQYTBxcDVEQVVUSEtXbUNjbnRobG91OGlDS2FGRkxIV2NJTmQxbnlJd1hxclN4TU5tU3M2S21vTDJRckt1V3RsUTVWMDEyMHhRNXZSeVpTMXJnRmtXd2hpT3dpdVFiUjBPT1ZoUU05aVMzdGlYcDRSYXdSUE1wNXREbGV0T09CTDk1TXBNMDFkWlRCTTlwa241cUYwMTBySWVIRmNGWmhtU0dwWXBUc0k2bndocWU1Qzl5bmhscHA1b3BodVJiNldjSkZsZGtWblZFd3d4VmZyVmt2bldVdU5MQ2c1Ymdib0ZIUERsRFBEbW5LN2hVcldpSWJqYWREY2x1amxaY2Fva09GdXA0Umkxa2FjVjZqbXJySzFoTjliR3dwS0VCUTRRNkR2SVVYT21vNlU1THFRTTZFUHlpS05qVmtQbkprRFBORWF4aGlGYXk1RXhXMU5YVlVHcWNwWVlkUGNHaUNxN3ovVFNsYmhMNHBwbFdYS2Q3TlpPNVFRRnJlZmhSUVcvTkhPc3FjSWdsYzRVaFdrbFI4SzBRemJBdzA4Q0JEbnBiZ3FYZGVEL1FVc000UlpYREZCVzZXSktlL21GUGRIMEx0QmdpcTU3d0ZMemx5UXp6ODJxWXg1RDVXSlA1eVZKRFcwMUJmeUhuUzZIS08vcmVacUlkMVdHYTRIa2gya1dvZEo4aTZLb0lQbEFqMmhQdDc2Q3pYc1ZSNmtvUFJ6V1RmS3FJZW50YXRZcFF3Mm1lNEFBM3kxS2luZDNTd29PS1pEY0ZYVHdsOXRXVTZtZmdSazlkNzFzS3RsTndyam5ZdzV0QzVuNUxkS2lHcnkzSktObEhFZDNvYU1DRkhyYXpCUE1wL3VOSitWN0l1ZGNTYmVPSWRqVUVkd2wwVkhDT1pvNXQ2WWx1RXVhQzltUWVNZ1NmT3lLbllHRkhjSWVRODR5UVdidUpZSnBadzVDemdsREg3Z0tuV3FxTTlaVGFYY04wVGVZaFI4NGVRdEpUNzZKSjFsUkVlN1dubnZzTW1SYzlGUTdTQkJNOW1WM2xDVWRtSGsvUzJSQU10MFFqRk5GcVFwV2pEUFEwMURYV1VkREJrWHppS1BqR0VQM1ZQK3pJV1UydDdpbTQxRk9sb3lXem4vTDZka1V5M1ZMRGFaNmFwcGdETEhQakpFc3l2Sm5nV0VQVXlWQmlBYUhDVEVYd3JMdlNFYlYxZTFnS0puaWljV29yQzFNVXJWakIzdURoSkUvd2dTT3prMURYcGswazczcUNNOHh3MlV2RDVrSm1EVWZPb21xTXBXQ2tKUmx2S1hHbW9lQm0xOFVTalZJazA0U0NseFRCNllyZ0xBUExXWUs5SExVdDVjbWMwdllFUzhHblRlUmM2c2taYlFrV2R4UnNJY3lCUnp4MURiVGs5RmJVMGNhVFBPZ0pIaEpLbk9HSVZoUXF2S21vMGxsUnc5c2FiclprRHRkZzNQcWFLaTlvYXRqWThCK0czNzFwYU1nNittWkZOTnRRMDRtV0JxM3JZTE9tdFdXUXA4S0pucHk5RGRGZW5zeWpkcVoreVk0MFZKbEg4d2NkTHpDOFBabnZITUZVVFpVckRUa0x5UWFHdXM1WDVMenBZQWYzaStlL1psaHFHcVdoaDZPdTZ4VFI5WjZvaTVBWlp0cDdNajJFRW04b1NweGlZWkNIVS8xZmJHZE5OTlJSb1pNaG1pbEViMmdxSE9FSkR0WGtISy9Kbkc2SXJ2YlBDd1YzTmhPTlZkUzF0aEJNczFUNFFPQmNUV2EySXpoTWsyblc1S3luOXRYVXRwdjlSc0cybXN4aytac1F6UlFhY0puY3Bna2UwK1Q4eTVGemo4QmlHbzdYbEpqYVRJbHBRczdLRmpwcUduS3VveUVQZUlLbkZNa1pIdm9wZ2g4MXlTeE5GV3ZKV2NLUnM3MGoyRk9UMDEySWxsRUVPMW40cEQxNTEzWWcyc3NRUE9UaE9rdnlycUhVZEVYT1NFc2lobUJiVGJLWDFrTEJQV3FXa0xPcUpiakIzR0JJWm1vYThxV2w0Q0cvaVo3b2lBNzJaTDdUSk5lWlVZN2tGUWZ0RGNISGx1QnpSYkNlZ3pNdHJSalZRcFgybGdvUEtLTEpBa2NiTWwwMVhLMnA3eWhMOHBDQmJRM0JOMmF2SmdLdnR0Y3JXREszQ2lVT1Z4UThaUCtwcVhLeUl4bm1CeW1DZzV2SmpOZmtQSzQrYzhjSWZLOG9jVnQ3a21mZC9JNVNSMWhLdkN6VXRiK2xoZ2MwMFphTzZDeWhJUVAxVXY0eUlaamxvYWQ3MlBYWDBPSUp2bkZVKzBaZjZNaHNKd1RmVzByMFV3UWZXNExOTFpsNUhLMjYxSkNaNHFuQmFBcmVWQVMzV3JqVjBMQm5ORFVOTkRUb0NFZUZmd2djYjRnT0VxTFJoaXJXa2V4ckNFWUtWVjcxMURMWUVFMVhCRXNwNXRwVEdqb3Jrb21LWUY5RkRYdjdmUjNCR3diZXR0U3hueUw1M01CUGpzeERaak1oK1ZVVzlOUnhxMURoVmsrRlN4UWNhR2pWOVBhd3Y2ZUdCeXc1cXpveTd4azRSc09TaHFqSndXS2UvMXBFRWZ6a29iZUQvZFFKbXBxZWRjeUJUeTJzcjRuR05SSDBjMFNQV1RMcnFBYzBPUWNiL2dlbUtncXVjUVQ3eVNXS0NuMkVVb3RvQ3ZwWmN0N1JPMnN5L1FXMElXY1hkN3BRUlF5WlZ3VDJVU1JPODd1aGppb1RMS1YyYnJwTVVjTVFSYktIL04yVCtVbFRwYU1sczZjbWM2Q0NOeTNKZFlZU1V6ekpRNG9TRDNvS0xuY1VMT2lKdmpCRUMyb3FuQ0prSmx1Q1l5MlpRNXNvOVlZbFoxVkxsUVUxbVhFVzFqWkVSd2ovTVVTUmMyNFRkZXhscUxLZlFCdERUU2NKVVY4RnN6WEJFWTVrdHBENVVyOWhZQjROYjFpaWt3M0pvWXBrS1grUm9kUktGdDUzTU11Um5LU3BZMzFQd1lhR2FJTGgzd3hKR3o5VGtUUEVFVHhvQ1dacmd2T2xteU16eEZFd1ZKRTV4Wkt6dnlKNFd4RWMxNkdkNFhlM1dlcTRYSDJqS1Jpa3FPa0dRODdoUW5DN3dCbUdZTEFuZXNYM00rUzg3ZUZBVGF1dU4rUWNyaDd4SXhYSmJVSWRNdzNKR0UzeWxDV3pyaWVhcUNuNHpoR00xOVRRM3oxb0gxQVgrcFdFcUljN3dOR0FrVUxCby9aeFJhVjlOTnloNEJyM3JDSFp6YnptU2Zhd0JMMGROUndwVzFrSzlteFBYUjlwb3ZjZHJHU1pLOWMyazB4d0ZHemp1bmlDdFJTWkNaNmNjWjdnYWt0bWdBT3RLYkcvSm5Pa0pyamNRVGRGTXN4UlEyY0xZM1dUSXJsQ3cxZVdLbjhSNnB2dDRHRkRzbzNRb0w0YTNuTGszRzZKcnRNRTNkU2VucHg3UE5GVG1nYTBFYUpUTFEwNjFzRWVRb1dYaFNvOUxUWHNhU2pvSlFSWGVaTHREY2xiQ3JZemZ6SEhlYUtqSENWT1VrUUhPM0plRWVwcjU2bWhpeWFZWUtqak5VK0ZlZDF3UzVWbGhXU3FJL2hZVWRET2theGlLZWhveU9uckNWNXlCSHRiV0ZxVEhDQ3d0cERjWW9sZXNWUjV5VXpUWkJiM1JOTWQwZDZXUCtTdmh1Qm1SY0d4bnVRelQ5NUlDMjg1Y3I0MWNMR1E2YUpKaG1pNFRNR2VtcHhlaW1CUlF3MXRGS1YrOGpkNkt1em9TVHFxRHh6UnRwWmt1cnZLRUh4bHFYS1JJampmVU5OWFFzTk9zUlNjb1dGTFQrWWVSWlZEM0dSTjBNZFFjS3FRakhETXJkR0dWdTNpWUpwUXgzV0dVdmZibXh3RmZSMjBXQnEwb1lZN0xNRmhoZ1l0cjhqcGFFbmFPemphd1dXYVRQOG1NcjB0L0VQRFBvcWNueFRCSTVvNThMN3VvV25NcnBvcVB3Z1ZybEFVV0UrVitUUWw5cmF3b3lQNlFHQWxRdzJUUFJYK1lTa3h5QkM4WjZqaEhrWEJnUUw3V0lJM0RWRm5SZkNyQmZ4ZXd2OUQ2eHN5anlzNFZraFdiOXBVVTYyN0psbFYwWUROSE1rdS9sZE5NTVhERW80YUZuQWtrNFU2ZnJORVU0WGdaVVBtRUtIVWw0NEtyem1ZYW1qQWJoMEpGdkduYVRMUHUxczlqUEN3akZwWWlON3oxRFRPay9uYzA3Q2ZERnptQ2Y3aStiZk5IWGhEdExlQlh6VEJUNXJrTXZXT0l4cGw0RU1oMkxHSkJ1MnN5RG5BRXgybmFFaEhEV01NelBaRWh5Z3lTMW1TNVJUSnI1WmtvS2JFVW9ZcXIya3FkRFVFOHp0SzdPYUludEprRnJJRUN3djhMSlRhVng1WEpFODZnbzhkRmVaM0ZOM3JqYWJDQVlwb1lFZUM5enpKVlVMQmJtWmhEeWQ3a28wOXlkcE5aM25tMktlZTRGUFBYSG5ZRUYxbnFPRkVDMDhMVVZjRHZZWGtKSFc4Z1RhS0NrOVlHT2VJSmhxaUU0VG9QRWVwZHA3SVdGamR3bldhdWZHTXdKSkNNdFVUVEJCSzlCR0NPeTJ0R0dySlRISXd5RU96cDZhUHpOTU90bFprRHZjRVdwUDVTVk5oZmt2RHhobVNhelRKWFlyTTlVMUUweHdGVndxWlF3ekp4dzYra0dHR1VqMkZnbEdHbW5iMS9HNTF1ZFJTTU5sVHc2R0duQ2NVd1ZjT3Btc3FUSGEwNm83MnN3MVJMMDJwOXowVmJuTUxPYUlYM1FLYVlLU0NGUXpCS0VVTkhUU2M0OGs1M1JIOXd4R010cFFhNUtqalcwVzBuNlhDQ0NHNHl4Tk5kaFE0UjRsMUZmKzJzU2Q2VUZIaUlFT3lxcUZnVDAxbUVVTUQram95NzVqUGhPQStvVlZMbTMwOUZSNHlWT2xwNFJoTGlTY05tU21hWUY1UHcwU1RyT0lvV01TUjJVa1JYT01wK000U0hXOG84Wm9pNk9aZ2pLT2FGYXI4elpEemtXenZLT2prS0JqbUNYYnk4SmFoaGpYVUxZNEtsemdLTHZBd3hWR2h2eWQ0enhCMWQ5VDBwaWF6bUtMQ1ZaWTVzS2lEMHkyWlNZcmtVRVBVYklrK2RsUTRTSkhUUjUwazFEUGFVV0lkVFpXOU5Kd25KTU9FQ2dkN291L01ucHBNSjAyTzFWVDRXc2g4NU1uWnpjRlRuZ3BYR0tvODRxbXdnS2JDTC9vclIvU3pKMmNyQSt0Nk1wOTRLdnhKVWVJYlQzQ1F1MXVJZGxRRU96bEtmUzNVTWNyVGlGbU91cm9vY3JaclQyQWNtYW1PS2c4WW9tZUVLbS9ybFQyc29jaU1heWJhVWxGaHVxSENNMnFJSityZzRFY0RGeW1pRFN4emFIZFBjcEU2MnBENWt5TTVTQk1vQTFQYVV0Zkl0aFM4NWlnMVZQaVBQWVhnWUVNTms0UXE3VFhCZ283b1Q1N2dQVWR3Z0NIemhJVkZQRlU2T1lKekhBWDltNW9OclZqZUU2MW1pRHJxUTRWU2Exb2lVUlRzS0hDMElmak53VTJXeks2ZXFLOGpXbG40ZzE1VFZCbnFtRHRlQ0o1MDFQR0FvY0poaHFqWmR0QkVCNmxuaExyZUZKS3htbEtiZUdycUxpU1RoVkliQ2RHemxvYXNhNmxwTVFYSENNRTJib0xwSmdUN3lXYWVtdTZ3Qk9OYnFHTlZSUzBQS0lMN0xja2JqbVF0UjdLOEk1cXRxZWwrVC9DaEpUTklLTGpkVU1OSVJ5dk9Fa285WVlsMmN3UXZlQmlrQ05hd0pLY0xCYmM3K0pNOTJteXNOdmQvRnFwOGEwazZDTkVlN2NuWnJ4bFcwd1FYYVhqYWt0blJ3Tk9HWktZaU9Od1M3YTFKVmhlcTNXZ0pIbFFVR0tIS21wNEtBeFhSL1VMVVJjTmdvYTR6aEtTTHBaUjNreFJSYjBObUQwT0ZuK1VDUzdDekkxbmJQNitvNHg0N1FaRTV4UkN0M1phZ25ZY3ZtcFlRa3RYZGs1WUtYVHpCQzU3a0tFZTBWVnVpU1lxYXBzc01TM0M5cDJDS2tIT2c4QjhQYThwNWF0ckl3M3FleklXYW5NR2E1SFJETkY2Uk05d2NhY2wwTitROFo4aHNJa1NuYUlJZEhSVU9FZWJBUHkxemJDa2hNMDYyRkNKdGlmN1BVK1V0b1ZYeldLcU0xUHhYTzhjZmRydWhGUS9hNngzSktZYWd2VkRoUUV0Tml5aWlTUTdPc3VSc1pVa3UwQ1JORHM0U29nNktLanNaZ2syYllKcWlqZ3NFZW5vS2VuaWluUlhCbi9VM2xncFBkeURaeW5ReDhJaWlvTW5DZXA1S3k4bWpHczZXdHkwbDFoVVFUY05Xc3dTM1dScDJrQ05ad0pHOG9tRzhKcGhQVWFGYkM4bEVmYWJ3UDdWdE05eW9hTkNBanBSNDFWTmhyRDlMa2JONzIydjBDb1pNQnlGemhhVytNeXpSWUVXRkRRd04yTTQvSmlUNzZQdWxqVDNWVS9BMzZlYUlUaGIrUjlvWkdPQUo5dGV3a2dHdnFPTU5SV1lqVC9Dd3U5OVE4THFERTRUZ2JMV3hKMWphRERBRVJzRk9Gcm9iZ2pVc0JTY2FndVhVOGtLbTJSTDE5dFJ5cFNIbkhObEhpSVpxZ3VmczRvcGdRZFZkd3hCTk5GQlI2a1ZGcWI4b2dpbU96QjZhNkhUenJsREhFcFlheGppaUE0VE1Rb2JrRGcydmVqamZ3SkdXbW5iVkZBdzNIM2hxMk55UWZHN2h6NGFDK3czQmJ3YmVzRzBzd1lheXZwQXM2KytSaTFWZnp4OTNtRkNodnlONXhWSFRTKzBwOWFxQ0F4eVo2WmFjWnl3NSs3dXVRa0ZQUjlERGs5Tk9pRTdYMVBDWUpWalZVcXE3SmxySHdXQUxGNW5mSE5HakFwZHBxZ3p4NU93aWxEaENpRFlUZ25jOXdhR1c0QmRMTk5VUXZPdHB6RE9XSERIOEQ3VFIvQS84NUtsakVRdTNOUkVjNFBsLzZCMUhoYzhVbWI1Q3NLTW1HQzlFUGN4b1QyYW13SE5DbWVPRW5PUGJrbG5Na2JPZ0l2TzVVTU9wUXJTOVVHVmR0NmlIL2ZVUmpoSS9XT3BhVzlPS0xZUm9kNkhDVUVkT1gwMDB3cERaUTZod2c2TGdaZk9xbzFSZlQvQ3JKempla1hPR2hwYzFWVzcxWkxiWHl5cCs5M0lMYkMxa1B0SUVZeDBGSXgxVkRyTG9WelhSS1JZV2s4MDl5WWxDOUltY3Jpbnh0YWJLbnpSSmszbEFVMU9MRU4xajJ6cll6cjJteUhSWEpGZjRoNFFLVDFxU1R6VEI1K1pOVHpUUmtBeFg4RmNMVjJ1Uzhlb1FRMmFBa0Z6dkNNNzJzSkljSkVUM1dQalJrNXdpMzJ1U1M5cmZaYWpwV0V2ajloVzQyRjRvNU55dFNYWXk4SUtIYXkxMFZZZHJjbDRTa3FzY3JYcE13eUdPZ3RrYWpoZVN4ZFFxbXB4UDFMM3Q0UjVQcWFzRm5yUUVqeXRxNnFncDlZMDlReDlvNFMxRnpoVUNuMWt5SFN6QldMZW1vU0d2T3FMTmhaeUJqbUNhQVVZcE1ndDRDazd3QkJNTXdXS1dnanNVd1RhR1ZzeFdDMW1Zb0tpeXFxZUdLWXFvblNJUlEzS0lrSE8wcG1BeFRkQkhrYk92ZmxsZnIrQUErN2duYzUwaHVWS1lLMzkzRk95ZzdyYlBPL2l6STdoRTRDbkhISG5KMG9nTlBSVUdlVXBzclpaVEJKY3JvdlVjSmU1MUJQc3I2R2tKZGhDQ3NaNmFUdE1FYjJwcVdrcWVWdERYRS9RVmdnc1UvTmw4NmQ5Uk1GM0R4dlpUQTU4YWd1ODEwUldhd0NpU3p6WEJlVTNNTVc5b3lKVWVkdk5FdlF5TnUxZjEwQlNNZGRSMXZhTENZcFlhL21Hb2NMU2lZRGNMYlF6OGFNbjVpeUY0eEJOTXMxUDBRRU9WN281Z2FXR3V6U2VMdWU0dHQzcm83eTRUZ200Ry9tb3BkWmdsNnEwbzZLekpXRTNtTWtzTnIzcithNkNiVDhnNXdaTnpUOU83ZmkvenBhT21uejNCUm9xb3MrdHY5ek1iZHB4c3FEQk9FZXd0Skx0N2NnNXd0S0tidmxkcFN6UlJDRDQzVkZoZUNJN3laTHBwZ2dNVkJTL0tNQWRIT0RKdk93cTJOUVNiS0tLUExkRldRczdGcW8rbXBsMDFKWFlSZ3E4ZG5HTGhUaUZ6cW1Xc1VNZHBsbFpkYktseXZTZFl4aEk5WWdoT3R4UjhMZ1NMV0hLNjJtR0dWb3h6QkU4TE5XenFIOUNVZXNRekZ5NVJRelRjNTZtaGk2ZmdYRVd3cEtmRTVaN00wNVpnWlVQbW82YXVpdjhZS3pEWXdXQkxNRXJJYktISnZPd0lydkVkaE9CY1E5SmRVMU5IUTdDWG4yWElERkJLVTJXQWdjWDlVQVV6RFhXZDVhbHd1eUo0MVo5cmpLTENMNGFDcDRXYXJoUG0yckgrU2FIVVlFMDAxSkRaMlpBelhQamRNcFpXdkM5d21xSUIybExoUTAxRDVqTzA2aGdoV01uZGJNN3lSSk1zb0NqMXZZYm5GUVZyVzlqYWszT2xFSjNzLzk2K3AzM2RFUFJWNUd4aXFhR2pJdGhVVTZGRkVaeXFDYTVxSnJwQmR6U3c5NUlVbk9QSXJDVVVqUlpRRnJidzVQUjBSMXFpWXgzY2I2bnJXVU1yQm1taUJReFZIdFRldzVJQ1AvaXA2ZzRoZWQvQWtvYi8zMnd2QkhzSU9YODNjSThoR2VOZU5QQ0lrUG1YZThmUEt4ODRPTVNSTTFNVGRYU3dqQ1o0UzMwalZHaHZxVFJhay9PVmhnR2F6SHVPQ3VkNW9uRU8xbEpyNmVjVnlhT0s2SDd6cWxCbElhSEUwb3JvQ2dmdkdKSWRQY21mTE5HTGpwejdoWndaUXBVYkZNRTBBMWNJSmE3Vk5PUmtnZnNNQmF0Yktnd3dKTTliU3ZRWGVOT3ZiSWplbGc2V1d2bzVrdmJLYUpKTkhleGtLTkhMOXhSeUZsSDhUaTJyaUI1d1ZQaFVrN25Ha0pub0NlNDI4TFIvd1JHZFlJbG1XZWJDeXhvdTFyQ2s0Zy9TaHVnQkRYMFYwWlFXa2gwZE9Wc2Fna00weVY2T29MZDV5ZStwUmxzQ3IwbitLaVFyR3VxNXlKRHpyVEFYSHRMVU1kdVREQlZLclNtM2VITCs2aWp4aEZEWDlaNWdWVS93bGlIWVRNaU1GcEtMTk1FeXd1ODB3ZDNtZW9GbXQ2VmJSTVBlbmhyT2M2RFZlNHBnWFU4RG5uSGFrTE9JSXJsRjRGWlBJdzZSK3p4QlAwZHlxNk9PWjRRNXNMS0NjejA4NG9rK1ZzTU15UWhOWm1tQmdYNXhJWE9FSlRtaTdWc0dUdk1UTmRISGhwemRiRThEdTJvS3hndkJxUUtkRERuVEZPeWxDRmF4UjFzeXoyaXFyT0kvRkVwTmMzQzZmMTEvNytBU1M2bDJpbnEyY2lUckNDemd5ZW1yQ0w1U1ZQalFrZFBaVW1HeTJjOVN3OUZ0UjFzUzMwUm1zS1BDUzRya0lDLzJVME1kdXd1Y1lvbEdhUGpLRXloem1pUFlYYWd5V2JZejhMV0JEZHpSaW1BWHp4eDR6OEs5aHB6bGhMcStOaVE5N0h1S29yTVVmSy9PVnZDMkpmaUhVUENRSS9xN0oyZ2pLK3RURE54a0NjNFRNc3NxQ3M0VEd0TFZ3UWloeW9BV2dqOWJvc1U4MFhHVzZBYzlUSkd6aWFVaDUraG5GY0hPbmxhTTFpUm4yOU5hcUdFTlRUVFNVSENIMnRXVGVWMG9zVWhINnBzdVZMalJVbUdXaG02T1pFc2hHZU5vd0FCSGNKMkJweTJac3pSY0trUlhkMlF1S1ZFZVhuYmZhRXE4MjVGZ3VxZmdmRTJ3aGxDaFNSTWRyb24rTEFUVFBRMlozNjl0NEI5QzVncy95bHp2K0NNbWVwSURQY2xGUWwxM1cwcnNwUGQxSk9jYmdoR09FdXRxQ3Y1cWFjVVJRbDNkREt5dnlKbHFLWEdQZ2NNOUZmYXdKQU1WbWRjc3BjWUtPWmM0R2pEWWtGbEswNW9sTk1IeUhuNHpGTnlreU94dDk5UmtIbGZ3bWlIbzYwbDJFS0krbWhyZUVLcDA4MFRidWcwOEJWUGNnb3FDNXpXdCtOTERUWjdvTlNGNTFOMXFpZTdWYTN1Q0N3eVpia0lOZi9ORUQ2anpPc0JkWmpGTjhvcUczd3hWdW5xQ1NZWUtmM0VkaEp5ZjlZV0dmN3RSVTJvSDNWSGdQcjFmZTVKOWhPZ0hkN3hRMHk3cUJ3WHIyM2FHRXJQMGNtNjRKVmpad3NPR3FMK21oTmdabWhKTFcyb1k0VWhlZHN5Qmd6ckNLcnE3Qm1jcE5WaFI2akJQcTY0VmdpK2tuNlhFNjhwcDhKNS8rMHdSSEdPcHNLZW5RbjlEWm50UHpqUkxacERBZEQyZm5TZ2tHOXRtSVhuVXdRNldWaWdoczdZaTJNeFEwTjNDcVlhQ1hrSjBveU96dE1ESmptU1NwY3B2bHJrMFJNTU9qbUFyUTA0UFJWMURPMUZ3aENWYVVWUHBLVU0wM0pLNVN4UHNJV1J1OC9DR0hpOFVIQ2hpcUdGRFRiU1JKV2VZVUREY0g2dkpXVXhSNGsxRlhiTVV3VjZlNEFKRlhTOG9NcXNaS3F6dllROUREUWRaY2tZNGFHc0lodGx1YmJkMnIzajRRQk1vVGFtZFBaazdPL0JmNjJsYWNad25lTmpRb0djZFZVN3pKT2Q3Z2hzVUhPa29zYWdpYzZjbldjOCs0Z2cyODVSNnpaUDVzMS9MVWJDS0l6blR3SzM2UGtkd2xPcmw0VTFMd2ZkQ0NhK0lydkZrbWd3MVBDQVVYS1dvMHNVUlhXY0kybXVLSmxneUZ6aHluQ1k0UkJPc3FDam9JMVI1elJFY28wbjJWdDA5QlF0WVNpemdLTkhmVW1VclE1VU9DaDUxQkZjTG1ZN3VtaFlxWEtRb21Pb3A4YlVuV05OUWNJaUJjWWFDNnh6TU5PUzhKUVFmZXFLQm1tZ2xCKzk3b2svbGZrM3lnYUhTeVphQ1JUelJ4UW82R3pMZmEyaldCUGVwdytVbVQ3U1FFSnlpeVJraEJMTVZPZmNvTWpjSzBlWkNoZlVOekZBVXpDc0VONXZQL1gxdVAvbi9hb01YK0srbncvSGpyLzl4T283ajdQanU2MXRMY2d2SnBUV1hOYmZONWpMcGk2VmZDT3ZpVGt0S2xGdXNRaXhkRUtXbUVCVUtOYUlwalpSU1NPWFNnemFhS0xkYWJybTEvOW5aKy9mK3ZkL3Z6L3Y5K1h5K3paN1BSb3JZb1pxeUxyQ3dRZEVBaXh4Vk9FWE5ObmpYMm5VU1Jsa3FHbVdvd2s4bHhSNTBKUHk5Qm82cUpYYVh3TnZSRUJ2blRoUEVQcmV3cnlMaGNBbmo1V0UxNUZxaThXN1Ixc0F1RXU4NlM0RU5pa0l0Rk40eGt2OUFmNG5YU25VVmNMaUE5eHplc0ZwaXZSUlZlRkt0c01SYUtCaHVTYmpPRUxuQVV0bFNRVXBYZ2RmQjRaMW9TYm5GRWV0YlEwSXJBZStZK3BxbkRjRUpGajZTOExEWnpaSHdZNGUzWE9OTmxBUnJhb21ORXQyYmt2R3Nvc0EzaW95SG0rNmpDTWJJNTl3cXQ0ZWVhcmEyOEl6RW15UGdvUmFVT0VEaFRWZEVKaG1Db1RXZkMwcDhhTmtDcDBvWXFpaDJpcUdpNHlYZU1rT3NuNExkTExubUtmaC9Zb2dqTnNQZWJlRkdSNG05QkpITHpCNjFYUTNCdHBJU2ZTMkZ1Z3NLOUZBdExXWDFkQ1JjckNuVXA0NENOenVDb3dVWm14U1JnWWFFNlphMFcydS9FN0NWWENpSS9VT1I4YUFtMStPU3lFM21PVWN3eWMxekJCZW9YMWtpS3kwWmZ4Y2sxR3N5dWx0aTExaTgzUVRCRjVLZzNwRFFUaEZNVkhpUFNsSyswY1NlZG5nL1ZhUzhiT1pidHNCY1RjWkFSOEpQNUtlcVExT1lLQWkyMG5qZE5OUnBnbnNVLy9LK0puYVhKYUdUb21yN2FZSXBob1JuOWFlU2hKV0tFcTlMY296U0Y3UWxlRWZESTVMWW01YmdWa0ZrUndWREJDVnUwRERJa0d1cG84VFpCcSsvcE1RVVJZRXJKUW1QS0dLak5Ea1dPTHg3SmQ1UWl6ZFV3ZUlhS3JsUDdTd0pEaFp2T05qTGtPc0JCWDlVcEd4bnlkaFhrZkJMUThJeGdvalFiTEZuSmY4MUp5dFNsamNsWVl5RUZ5eDBrVkJ2S1dPRkptT05wc2hHQWNzZHVRWTVnaVZOQ1Y1MWVPZEpZby9wTGhidk0wdURIU2V2TktSY3JLWklxbkN0SmVFc085NVJvcWNnR0s0b2NaY2hvMXRUWXRjWnZINDFwTlE3dkEwV3JoSWZPU3JhSUludElBaStOWFdDRXJkYmt2cld3alJMcnQwTktVZEw2S1NPc2NUT2RNU09VdEJId0w2T0xBMHZOU2R5bmFXUUVuQ3BJdkthSXJKSkVidkhrbXVOaG42T2pNOFZrU0dTcW4xdVlKQ0dIbnE5STNhTGhOTUUzdDZHaklrTzd4ck5GdW1weVROWC9OcndYN0NySVJpcXFXaWpJOUpPNGQxaWlleWt5Zmlwb3NRSVE4WWpqc2psQmg2b0hXYndSamdZSlFuMk5nU25OeWNtSkFrM05pWGh4NDRTeHlraWh4bTh5YlV3VDFPVkt5U2M3dmkzT1hWa2RCSjRBeVhCZWtzRFhHMEloZ3RZWTBsWTVhaENEMGVoYm9ySWs1YVVXUkp2aU1BN1h0NWt5UmpvbnJYRU5rbTh5WXFnczhWemdySm1DbEsyMHVNTTNqUkowRmlRSUNRRjloZEVUbExRV1JJYjVraTZXRGZXUlBvYnZPNmE0R1A1bWNPck56REZFTHRUa09OTGg5ZFhFOHh5cEVnN3o4QTlqa2hyUTZGaGpsZy9RVmt0Slh4dDRXWHpULzAzUThJYVFXU3FJdUV2bG9RMm1xQzlKZmk3d1J1bDRSWDNwU1BsenBvVmxtQ3RJMmp2S0hDRmhqY00zc042bHFGNkh4bktlbExqWFdid3JwUjR4enVDclRVWngycXE5b0FoOHA2aXhDVUdyNzhnOG95alJBdEI1Q1pGd2k4MFZlclZwSTBoK0llQnhhNlpnNmtXdnBESGFpb1lZdUVzUmJEQzNlT21DMkp2R1lMZWlveEdrbkwyVUFUTkpONmhtdGoxRGxwTHZEVm1vY1lickdDVkpLT3JnNFg2RGdkZExBMjAzQktNRm5nZEpKRnRGZDd2SkxtNktFcGM1eWpRcmtrN004MFNHZTM0WDI0blNleDFSYTVPbWdiNzFKS3lnOFNyVTNpL2tBUkt3V3BIMGtPR2hLa09ieWZkMFpHanZ5WGxBa1ZaNHhSYllKMmlyRk1rRlkxU3d5V3hyMm9vNHpsTmlWKzd6bWF3ZUZwVDRrUjNrYURBRlc2eHBTcXpKYXkwNUZ0WVI0SG1aaGM5VXhLYmJmRjJWOFJHMU1CbVNhRStrbUM2Sm5hUlhLOWdzaVhoSkhsL1UwcU0wV1RjYnlod2tZSXZGR3dqU2JqZndoaUp0OFpTUVUrQmQ1K21hclBNT2tWa0QwbXV4WUxJZkV1aGg2MHgvSjkyaXRndWloSlNFTXlTVlBRblRld25FbSs2MjByVFFFTXNPZm80L2tQLzBBUnZXaml0bHBTWDdHeEJnY01Fc2QzRUVlWVd2ZHl0ZCtTYWF3aTZhQ0lqMUNrR2I2QWo5cndoeDE2Q2YzdkF3Rnk1cHlMaFZvblh6eTUxRkRwZEVibGJrZEpiVWNFUERFRnpROHFObWh6ekxUbW1LV0tiRkNYZUV1UmFicDZyeGJ2QXRMRjQ0MlFqUSt3RUE5ZUwxeFNSN1EwSlh6bFNIako0ZXhxODl5UjBsYVNjSi9GVzZ6NGE3M3BGTUVmRGlSWnZ1dmlqSXQ4NlJhU0ZPbDAxcmlWMm1EMVVFdnhHay9HZWc1YVd3R2tpMXpnS1BHOUoyVThQRWc4cVl2TXNaZXl0aVRSWEJNc2xDVThKU2x4aThFYWJqd1VsZGxETkxmelRVbUNneFdzanFXQ09IYXZZQXFza25LRklPMHlRNjFWTDVBVkZ4azZXaEVhQ0FrZEpndDlhU2t6WGxLTlgyakVhNzl3YVl1YzdncTBOM0dESkdDQmhvaVRYVUVQc2RrbkNVRTFDSzBmd3NpYXlsU0YydWlEeU80WFgzcEZoTmQ3UjRpdEZHYzBrL0VsQlp3V3ZxK0dDNnN6VmVFb1MvTVorcXlsd3BLTkt2OVo0NjlVT2pxQ2p3bHVzaWN5VHhHNlZwTnhjUThJbmNvUjRSaExiUitOZHBHR21KV09jSXpKR1V1S1BHcFFnOHJyRzIxZE9NcVFzc0pRNFJ4SDVqYVVxblp1UTBGNFErY2p4THdQdHBaYklBazNRVEpIUVdCRTVTMUJva29WdERkNmxocXI5VXBIU1V4TWNJWWw5cG9qc2I4aDRTQk9zTVFjcXZPV0MyRThFVmVocWlKMWhyckFFYlF4ZUswTkdaMEdrcStndVNSZ25pTTIzYklIVmtxd3g0aGlIZDdzbWFPeWdseUl5UXVNOTc4ajRWUzA4Si9BMkcxS2VNQlJvNGZCYVNOaEtVRVpmUWV3VlEvQzFJK01nZmJFbGVFekNVdzdtS1hJME0zaGQxRUVTVmppOHg1dVE0MW54czFxNFJNSkNDWHM3SXE5YWNweG4yMm9TRG5RL3NKVHhzQ2JISVlaaUx5aFkwNVRZMFpMSU9RckdhU0pERE40dDhwVmFJcnNxcUZkRWVndGl6YzFpVGV3NVE0YXlCRE1Vc1FNa1hvY2FZa2MwaFp1YTQxMnNpWjFyU1hsUjQ2MHpSSjVTbEhHZTVqODAxUkxNbEpUeHRhT00zUTFwdnhKNDV6VWxXRkQ3cnNBYnBmRW0xSkh4RzBlaDh3MlI3UVFWekJVdzI4RmhGcDVRWnpxOHQycngyam9xdWxZVFdTdUpkVFlmV3dxTUZNY292Rm1TeUpQTnlMaEU0RTEwcEh6WWpPQzNodUFyUmE1NzFac0dhalFwUXgzOFNCUDVweVpCNmxNVTNraERucDBNQlY1MUJFOW8yRStUWTVNbDJFOFM3QzBvNncxeHZDWmpmMEhrVkVIQ3pGb3lObXFDKzl3ZGNxTitUcDdqU0RoZUU5d3M4WTVWME5KQ24yYmsydHFTWTRva2RyRWh4MWlETjhjU3Vkd2VwV21BR1hLY0pYSzY1SDl0bzhqWVFSSDdTQkYwMUVTVUpkZDBUYXlWSW5hV2hMa09qbFhFNWlyS0dPbkk2R1NXR0NKYTQ4MnpCSTlyQ3IwanlUVmNFdXpyaUMxdmNyNm13RkdTaXF5NXpNd3hCSC9USkh3alNQaEw4KzAxa2FhU1V1TUZLVGNMRXZhVWVQY3JTbXduOERacmdpa1diN0NHUHhrU2poUXdyUms1N3RjdG14THNiOXNadkw5TFNseXVTTGxXa3FPandkdW84YjZVdjFEa211ZEllRkYyZEhDZ3hWdGs4ZHBJdkhwQnhoRU9kaEtrN09MSVVTZEorY1NSWTU3QiswRGdHVVVsTmZwdGhUZkdrYXV6eHJ2VHNVVWFDVmhsS2V0ZVRYQ29KRENhMk5PS2hPbUM0RzFIOEpCZDRPQlpSZVNSR2txY2IvQ08xUHlMSlRMQjRqMXE4SllhSXV0RWpTTFg4WUtNK2E2cGhkTXNkTEZVb1Y1UlRtOUpTa3VETjhXY0lvbjBOWk1OWldoMXE4QzdTSkV3VjVIeHJtbm5UcmYzS29KQmxtQ1lJMmlsU0xsZkV2bEU0MDExTk5namd0aHpFdWEwb0tLN0pMRTdIWkhsRWw2MEJMTVZGZXdnNEVXTnQwVGhyVk5FVmtraVR3cEtYU1dKemRSRU5ndktHcTRJaGpzaWV6Z1NGdHNmQ1VxOHFraTVTMUxSUWVZUVE0bmVtbUNrSW1XTXczdEZVb1VCWms0Tk9lWllFcDRYUktUR2E2d0pqcldOSEJWSlI0bTNGQ25idUQ2YWFrMldzTVRoM1NaSW1HQ0lQS05nc0RwVnduc2E3MEszMWxDRkpaWWN3d1NNRmNRdWxHVHNadUVhU2RCWGtQR1podTBGc2RVTzczUkhqcThNUEdHSWZhR0liVlRrNml1STNHRmd1Y0hySVFrbVdTSmRCZDdCQnUrdU9yeVdBaFk3K0xraTlySzV3dEVReld3dnRicUdoSU1Gd1dSSnNFbHNZNG05SUlnOUw2bENYMFZrbGFQQVlrZmtaRUdEbk9Xb3dsQkpqdE1Va2NHSzRMZzZFdG9aSW5NVUJWWUxnbjBVc2RtQ3lDejdnSUdIRmZrK2sxUXdUaDVXZTdBOXgrSWRKNkN2SWtFYWdtczBoUjUwZUg5VW5UUUorMm9pS3lWbExGVUUrOGdCR3U4TVEzQ3BwVUhlc25qVEhONFFCL1VHUGhDVEhMRlBITUZyQ3FhNzNncU9iVUpHYTAzd2diaEhrckNmcEVwek5MRTdKRFMyNUZNS2hsaEtLV0tmQ2dxc3RMQ1B1MXpCWHkwSjJ6dHdqdGl4QnU4VVRSbjlMVnRrbUNOMml5Rmh0TUU3MEpIUlExS1ZaWHFLSS9LTklLWU1DWXMxR1VNRUtiTTFiS09JOUxEWEM3emJIUytidCsxTVRXUzlvZEE5RHRyWXRwYkltUUoyVkhoL2xpc0V3YUhxVWsxa2pLVEFLa25rQkVYa2JrZE1Hd3EwZG5oekxKRjNOSkgzSlZ3cnFPQjRTY2EyaHRpNzVubUpOMFd6eFM2VXhEWW9FcHhwYTRodFZsUmprWUU3RFpHekpWVTcydUM5SXloUUw0aThZZkdXU1lMTE5jSFhsb3l6N1FoTmlmbUtTRTlKZ2ZHbXV5TGhjNDAzWG05dnFjcDZnWGUzeHV1djhGNlZKTnhreVRIRWtIRzJnMGFLWEwwTXNYYzFiR2ZnYXMyLy9kQ09OWGlOTENYKzVtQjdlWklsMWtIaDdhandwaWt5emxVVVdPVk9zalNRbHNTK00wUitwUGplL2R6QlhSWkdPMHJNdGdRckxMRzlWU3U5bjZDTVhTM0Jod1ltU29JQmhzak5CbVpiZ3VzRTlCQ1BDUDV0cmlVNFZoTmJKZkUrc3dTUDI3YWF5RTh0dVRwWVlqdHJZak1WR1pkcDJOcFMxczZhQm5LU0hEc2JLdXBsS2JITTRhMHdNRmQvNS9EbUd5S3JKU1VhVzRJQnJxVWh4MHZ5ZnpUQkJMUElVY25aZHJBa05zS1Iwc1dSc3B1bVNuczZDaDB2L3FxSWJCWVVXS3ZQVS9DRm95ckRKR3dTTkZoYkEvTWx6S3Fqck84MGhSYnBLeDBKZXdzaS9TVGZ0d0dTbEtjMUpaeUF6eDA1ZGhMRWRuZlF2aFpPcWlIV1dFQUhDNyszMEZ1UmNaVWdhTzVncGFJSyt4c2lIUlVzcWFQRWxUVjQweFFaUTEwN1E5QlpFMW5yeURWR1U5WlNRNDdibWhCcExjWXBVdDdTK3h1Sy9GaVQ4cUtqd1hZdzV5cFMyaXVDdjdxMWd0Z2podUJ1QjhMQ0ZZNWNVdUNOdHNRT0ZjVCs0SWg5SlgrazhFYTZ2MGlDSVJaT3RDVDBFdDAwSlc1VWVDODVDZzBTY0swazQxMUhjRzF6S3RyZTNTZUlUQlJrN1dmd0RoRXZhWUxUSFA5bGUwbThCeTBKRHduNFRsTFcvYUpPdkdIeGRqWVVlcytTY1ppZ0NrWVFkTmRFT2hraWV6Z1NocWt4OHVlS2pJOGxEZksyb05pT0Z2clpIMWhTK3RrN05WN25PbUxIaWNHV0VndWJrWEtkd2R0WmtuQ0xKWGFDcGtyalpCdExaRnNEUDlDZHhXc1NyMDVTeGw2Q01tb0ZiQ09ncnlYNDB1RHRhbUI3U1ZtWFc0SWhsZ3BtcSswMHRCS1VVYTgzV2JqTFVOa3pEbVk3Y293MUpEeWd5UEdsaGdHS1lLejR2Y1Y3UUJOYkpJZ00xMVRVcVphTWR3VGVTZ3VINnJPYXcxSlJLemFhR3l4Vm0yRUovdUNJclZXVWNaVWtjcDJnck1zRWpLK0RNd1M1OWpRazNLZDZTRXExZDBTNnVWbU80QmMxbERYVFVjSGpsdUNYRXErMU9sQkRqMXBpOXpnaVh4bkt1RTBTcVRYd2hxYkVUVzZSZ2dNRW5HbC9xNDlVVDJpQ3pnSnZSd1ZYUzJLL2Q2K1preVVsN2phd1NWTGl0NDZFd3hWbGpEWndvU1EyMHNEQmloenRIZmsyeUE4TlZaZ2hpWHdyWUhRZGZLQU90enNheWpoWTliWTB5RTJDV0VlSjl4ZnpPNDIzeGhMNXN5UzJURkpvZk8ycGJvSG9iMG5ZNEdpQWdScnZHUUVEYS9GV1Nzb2FhWWwwc3lSc0V0M2tXb0gzQjAxc2hDWGhUVVdlOXczQnQ0NFNDOVFDaDNlU2hRY3R3YmFLMkFwTHJvR0NNbFpyWXF2bFkzcVloTTBhWHBGa1BPdW9xSjNEbTZmeFhyR3dWRjlnQ1daYWdqUHF6bmZrdU1LUThEUFRRUk84WnFHMWhQR0tFbTlJZ3BHVzREWkRnVE5yaVR4dkZpcStMeiswY0tmcDR3ajZPQ0s5SlNuek5TbjlMRlU3VWhLWlpNbll3Y0o4czh5UnNFQ1NjSzRqNVVPQjk1SEZPMEN6aFk0eEp4dUNpeDBsRGxFVWVNZFM2RVpCa1RzVWtaNEs3NGR1Z3lUWFM3YU5nTDhhcWpEZmtDRTBaYndrQ1hwYVdDS2hsOFA3VkQ1anh5a2l2U3l4eVpyWUVSYmUxNjhMWXU5WlloODZJa3NjZ1ZMRTd0V1BLbUp2MTFDZ295Smx0TUVicm9odFZBUWZPNEltbHRpSEVyb1lFczdSeEFhclZwWThBd1hNY01SZUZPVFlXZTVpaUxSUXhKNVE4RHRKOExRaFdPaEllRkVTUEdzSUxoYk5EUmxqTmJIek5SbFRGYmsyUzNMME5PUzZWMUtGSllLVWJTVGNJSWhNMHdRL3MyVE0wU1JNTmNRbVNhcDNqQ0g0eWhKWktTa3d5UkhwWVlnc0ZlUTRVN3hvQ0I3VlZPRXhoWGVwbzlBQkJzWWJ2R1dLWFBNRTNseUg5NVlpb1owZ3NzUVJXV2JJK0ZhU01rWGlqWlh3Z2lUbFlkUGRrTkxhRVR4bHlEVkl3cWVhRXVzMGFUY1ljZzBSVk9rcFIzQ1NKcUlkZEsrOTBKQ3h6c0RWbG95ckZkNVpBcjRUQktmYVdhNmJvRUE3QzdzNkVwWWFlRlBqdmVvb1k3Mm1qSWNjTEhKOUhVd1ZsRGhLa211dEpESkJ3bnAxcnZ1bEpaZ2dLRFJmYlhBa3ZDLzRsM296UU9HOWE4bHhqeDBpN25WNGpTWGM3dmhlM093SXhqZ1NIamRFaGhzaWY5WWtQR2x1czNpTEZEbldPRmh0Q1piSmcwVWJRY0lhUjY3Smp0aG9DeU1FWlJ3aGlYV3l4TzVReEk2dzVOaFQ0VTFXc0p2RE82MEozNGZXOWh3endsS2lqNlpBVzluZTRMMHM4QzZYZUJNRWtkL0xReTFWdWNCUm90NlFNbGJpdmFCaG9CZ2pxR2lDSk5oc3FWcC9TMlNzRzZESU9OQ1IwZFhodldiSitNUlJaSmtrdUVqZ0RYSmpGUVc2U1NMN0dYSzhaMkNaZzdjVnNiV0dvS21FcHpRNWVscGl5OFJ5ZzdkTWtMTFVFYXV6ZU84NkN1d2xTT2xnWUxvalpXZUo5eE0zUzFQV2ZFZktsNUlTTFEwTUVLUjhZT0IyUWZDeEpCanJLUENONGY5TWthU3Nxb1ZYSkJtUDdFcEZaOVVRZk9vT0Z3U3pCTjRNUThMc0dyeW1saXBjSlFobXkwR2FRalBxQ0hhWFJ3dUNad1JicUsyRmc5d2xDbFpxWWljcklnTWRaZnhUUTBjN1RCSWJyQ2h4bXV6b0tHOFhSYVNySWhoaXlORkprckM3b0lBV01FT1FhNWFCZWtQQ1JrbkNvNElLUHJZa3ZDREk4YVltWTdXRnRwcmdla2NKWjNvTElxc3NDU010RmJRVEpLd1hZeTNCWTVvQ2gyaUtQQ3BKT0UrelJkcFlnaTZPMkttT0FndlZDWWFVNHlTUmVrMXNneUZoSjQwM1FGSGlWRW1KSHd0eWJPMWdzOEhyNStCRVRRWDNXYXIwcVpuZ1lHZ3RWWnRvcWQ2dkZTay9Vd2RaRWxZcXlqckY0SFhVZUZzcElpOUlHS2Y0ajkycEtHQWRDWU1Wc2JjVjNrUkYwTitSOExVZDVQQ3NJR1dveER0QmtDSTBuS29mZEpReFQrTHRaZmx2dWM4UTNDandXa3E4S3dVcEh6a0svTm1Tc2NsQ0wwbnNlUWRqNUZSSDVDTkhTZ3RMaVc4ME9mNUhVOUhobHNnYTlibkJxM2ZFVmx0S2ZPNUlhU1RtR2pqYzRKMG90Y1A3UXNKVVNRTThwRWo1L3dDdVV1QzJEV3o4QUFBQUFFbEZUa1N1UW1DQyIpOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/blackboard.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUG9ydCBvZiBUZXh0TWF0ZSdzIEJsYWNrYm9hcmQgdGhlbWUgKi8KCi5jbS1zLWJsYWNrYm9hcmQuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMwQzEwMjE7IGNvbG9yOiAjRjhGOEY4OyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMjUzQjc2ICFpbXBvcnRhbnQ7IH0KLmNtLXMtYmxhY2tib2FyZCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzBDMTAyMTsgYm9yZGVyLXJpZ2h0OiAwOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjODg4OyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjQTdBN0E3ICFpbXBvcnRhbnQ7IH0KCi5jbS1zLWJsYWNrYm9hcmQgLmNtLWtleXdvcmQgeyBjb2xvcjogI0ZCREUyRDsgfQouY20tcy1ibGFja2JvYXJkIC5jbS1hdG9tIHsgY29sb3I6ICNEOEZBM0M7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tbnVtYmVyIHsgY29sb3I6ICNEOEZBM0M7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tZGVmIHsgY29sb3I6ICM4REE2Q0U7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tdmFyaWFibGUgeyBjb2xvcjogI0ZGNjQwMDsgfQouY20tcy1ibGFja2JvYXJkIC5jbS1vcGVyYXRvciB7IGNvbG9yOiAjRkJERTJEO30KLmNtLXMtYmxhY2tib2FyZCAuY20tY29tbWVudCB7IGNvbG9yOiAjQUVBRUFFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLXN0cmluZyB7IGNvbG9yOiAjNjFDRTNDOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLXN0cmluZy0yIHsgY29sb3I6ICM2MUNFM0M7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tbWV0YSB7IGNvbG9yOiAjRDhGQTNDOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWVycm9yIHsgYmFja2dyb3VuZDogIzlEMUUxNTsgY29sb3I6ICNGOEY4Rjg7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tYnVpbHRpbiB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLXRhZyB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWhlYWRlciB7IGNvbG9yOiAjRkY2NDAwOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWhyIHsgY29sb3I6ICNBRUFFQUU7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tbGluayB7IGNvbG9yOiAjOERBNkNFOyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/cobalt.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtY29iYWx0LkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMDAyMjQwOyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtY29iYWx0IGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2IzNjUzOSAhaW1wb3J0YW50OyB9Ci5jbS1zLWNvYmFsdCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzAwMjI0MDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjZDBkMGQwOyB9Ci5jbS1zLWNvYmFsdCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlICFpbXBvcnRhbnQ7IH0KCi5jbS1zLWNvYmFsdCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzA4ZjsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICM4NDVkYzQ7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tbnVtYmVyLCAuY20tcy1jb2JhbHQgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI2ZmODBlMTsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNmZmVlODA7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICMzYWQ5MDA7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tbWV0YSB7IGNvbG9yOiAjZmY5ZDAwOyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLXZhcmlhYmxlLTIsIC5jbS1zLWNvYmFsdCBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjOWVmZmZmOyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLXZhcmlhYmxlLTMsIC5jbS1zLWNvYmFsdCBzcGFuLmNtLWRlZiB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS1lcnJvciB7IGNvbG9yOiAjOWQxZTE1OyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI2Q4ZDhkODsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS1idWlsdGluLCAuY20tcy1jb2JhbHQgc3Bhbi5jbS1zcGVjaWFsIHsgY29sb3I6ICNmZjllNTk7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tbGluayB7IGNvbG9yOiAjODQ1ZGM0OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/eclipse.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZWNsaXBzZSBzcGFuLmNtLW1ldGEge2NvbG9yOiAjRkYxNzE3O30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLWtleXdvcmQgeyBsaW5lLWhlaWdodDogMWVtOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICM3RjAwNTU7IH0KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLWF0b20ge2NvbG9yOiAjMjE5O30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICMxNjQ7fQouY20tcy1lY2xpcHNlIHNwYW4uY20tZGVmIHtjb2xvcjogIzAwZjt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6IGJsYWNrO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjMDAwMEMwO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXZhcmlhYmxlLTMge2NvbG9yOiAjMDAwMEMwO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXByb3BlcnR5IHtjb2xvcjogYmxhY2s7fQouY20tcy1lY2xpcHNlIHNwYW4uY20tb3BlcmF0b3Ige2NvbG9yOiBibGFjazt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogIzNGN0Y1Rjt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1zdHJpbmcge2NvbG9yOiAjMkEwMEZGO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXN0cmluZy0yIHtjb2xvcjogI2Y1MDt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1lcnJvciB7Y29sb3I6ICNmMDA7fQouY20tcy1lY2xpcHNlIHNwYW4uY20tcXVhbGlmaWVyIHtjb2xvcjogIzU1NTt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1idWlsdGluIHtjb2xvcjogIzMwYTt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1icmFja2V0IHtjb2xvcjogI2NjNzt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS10YWcge2NvbG9yOiAjMTcwO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLWF0dHJpYnV0ZSB7Y29sb3I6ICMwMGM7fQouY20tcy1lY2xpcHNlIHNwYW4uY20tbGluayB7Y29sb3I6ICMyMTk7fQoKLmNtLXMtZWNsaXBzZSAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgewoJYm9yZGVyOjFweCBzb2xpZCBncmV5OwoJY29sb3I6YmxhY2sgIWltcG9ydGFudDs7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/elegant.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZWxlZ2FudCBzcGFuLmNtLW51bWJlciwgLmNtLXMtZWxlZ2FudCBzcGFuLmNtLXN0cmluZywgLmNtLXMtZWxlZ2FudCBzcGFuLmNtLWF0b20ge2NvbG9yOiAjNzYyO30KLmNtLXMtZWxlZ2FudCBzcGFuLmNtLWNvbW1lbnQge2NvbG9yOiAjMjYyOyBmb250LXN0eWxlOiBpdGFsaWM7IGxpbmUtaGVpZ2h0OiAxZW07fQouY20tcy1lbGVnYW50IHNwYW4uY20tbWV0YSB7Y29sb3I6ICM1NTU7IGZvbnQtc3R5bGU6IGl0YWxpYzsgbGluZS1oZWlnaHQ6IDFlbTt9Ci5jbS1zLWVsZWdhbnQgc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6IGJsYWNrO30KLmNtLXMtZWxlZ2FudCBzcGFuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjYjExO30KLmNtLXMtZWxlZ2FudCBzcGFuLmNtLXF1YWxpZmllciB7Y29sb3I6ICM1NTU7fQouY20tcy1lbGVnYW50IHNwYW4uY20ta2V5d29yZCB7Y29sb3I6ICM3MzA7fQouY20tcy1lbGVnYW50IHNwYW4uY20tYnVpbHRpbiB7Y29sb3I6ICMzMGE7fQouY20tcy1lbGVnYW50IHNwYW4uY20tZXJyb3Ige2JhY2tncm91bmQtY29sb3I6ICNmZGQ7fQouY20tcy1lbGVnYW50IHNwYW4uY20tbGluayB7Y29sb3I6ICM3NjI7fQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/erlang-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZXJsYW5nLWRhcmsuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMwMDIyNDA7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1lcmxhbmctZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICNiMzY1MzkgIWltcG9ydGFudDsgfQouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzAwMjI0MDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICNkMGQwZDA7IH0KLmNtLXMtZXJsYW5nLWRhcmsgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZSAhaW1wb3J0YW50OyB9CgouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWF0b20gICAgICAgeyBjb2xvcjogIzg0NWRjNDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWF0dHJpYnV0ZSAgeyBjb2xvcjogI2ZmODBlMTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWJyYWNrZXQgICAgeyBjb2xvcjogI2ZmOWQwMDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWJ1aWx0aW4gICAgeyBjb2xvcjogI2VlYWFhYTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWNvbW1lbnQgICAgeyBjb2xvcjogIzc3NzdmZjsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWRlZiAgICAgICAgeyBjb2xvcjogI2VlNzdhYTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWVycm9yICAgICAgeyBjb2xvcjogIzlkMWUxNTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWtleXdvcmQgICAgeyBjb2xvcjogI2ZmZWU4MDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLW1ldGEgICAgICAgeyBjb2xvcjogIzUwZmVmZTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLW51bWJlciAgICAgeyBjb2xvcjogI2ZmZDBkMDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLW9wZXJhdG9yICAgeyBjb2xvcjogI2RkMTExMTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXN0cmluZyAgICAgeyBjb2xvcjogIzNhZDkwMDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXRhZyAgICAgICAgeyBjb2xvcjogIzllZmZmZjsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXZhcmlhYmxlICAgeyBjb2xvcjogIzUwZmU1MDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogI2VlMDBlZTsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/lesser-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKaHR0cDovL2xlc3Njc3Mub3JnLyBkYXJrIHRoZW1lClBvcnRlZCB0byBDb2RlTWlycm9yIGJ5IFBldGVyIEtyb29uCiovCi5jbS1zLWxlc3Nlci1kYXJrIHsKICBsaW5lLWhlaWdodDogMS4zZW07Cn0KLmNtLXMtbGVzc2VyLWRhcmsgewogIGZvbnQtZmFtaWx5OiAnQml0c3RyZWFtIFZlcmEgU2FucyBNb25vJywgJ0RlamFWdSBTYW5zIE1vbm8nLCAnTW9uYWNvJywgQ291cmllciwgbW9ub3NwYWNlICFpbXBvcnRhbnQ7Cn0KCi5jbS1zLWxlc3Nlci1kYXJrLkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMjYyNjI2OyBjb2xvcjogI0VCRUZFNzsgdGV4dC1zaGFkb3c6IDAgLTFweCAxcHggIzI2MjYyNjsgfQouY20tcy1sZXNzZXItZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7YmFja2dyb3VuZDogIzQ1NDQzQiAhaW1wb3J0YW50O30gLyogMzMzMjJCKi8KLmNtLXMtbGVzc2VyLWRhcmsgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZSAhaW1wb3J0YW50OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHByZSB7IHBhZGRpbmc6IDAgOHB4OyB9LyplZGl0YWJsZSBjb2RlIGhvbGRlciovCgpkaXYuQ29kZU1pcnJvciBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICM3RUZDN0U7IH0vKjY1RkM2NSovCgouY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzI2MjYyNjsgYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjYWFhOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogIzc3NzsgfQoKLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICM1OTllZmY7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNDMkI0NzA7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogI0IzNUU0RDsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWRlZiB7Y29sb3I6IHdoaXRlO30KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS12YXJpYWJsZSB7IGNvbG9yOiNEOUJGOEM7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICM2NjkxOTk7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS12YXJpYWJsZS0zIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tcHJvcGVydHkge2NvbG9yOiAjOTJBNzVDO30KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1vcGVyYXRvciB7Y29sb3I6ICM5MkE3NUM7fQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzY2NjsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjQkNEMjc5OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tc3RyaW5nLTIge2NvbG9yOiAjZjUwO30KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1tZXRhIHsgY29sb3I6ICM3MzhDNzM7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1lcnJvciB7IGNvbG9yOiAjOWQxZTE1OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tcXVhbGlmaWVyIHtjb2xvcjogIzU1NTt9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tYnVpbHRpbiB7IGNvbG9yOiAjZmY5ZTU5OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tYnJhY2tldCB7IGNvbG9yOiAjRUJFRkU3OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tdGFnIHsgY29sb3I6ICM2NjkxOTk7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjMDBjO30KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1oZWFkZXIge2NvbG9yOiAjYTBhO30KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1xdW90ZSB7Y29sb3I6ICMwOTA7fQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWhyIHtjb2xvcjogIzk5OTt9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tbGluayB7Y29sb3I6ICMwMGM7fQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/monokai.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQmFzZWQgb24gU3VibGltZSBUZXh0J3MgTW9ub2thaSB0aGVtZSAqLwoKLmNtLXMtbW9ub2thaS5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjMjcyODIyOyBjb2xvcjogI2Y4ZjhmMjt9Ci5jbS1zLW1vbm9rYWkgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQge2JhY2tncm91bmQ6ICM0OTQ4M0UgIWltcG9ydGFudDt9Ci5jbS1zLW1vbm9rYWkgLkNvZGVNaXJyb3ItZ3V0dGVycyB7YmFja2dyb3VuZDogIzI3MjgyMjsgYm9yZGVyLXJpZ2h0OiAwcHg7fQouY20tcy1tb25va2FpIC5Db2RlTWlycm9yLWxpbmVudW1iZXIge2NvbG9yOiAjZDBkMGQwO30KLmNtLXMtbW9ub2thaSAuQ29kZU1pcnJvci1jdXJzb3Ige2JvcmRlci1sZWZ0OiAxcHggc29saWQgI2Y4ZjhmMCAhaW1wb3J0YW50O30KCi5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogIzc1NzE1ZTt9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1hdG9tIHtjb2xvcjogI2FlODFmZjt9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1udW1iZXIge2NvbG9yOiAjYWU4MWZmO30KCi5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtbW9ub2thaSBzcGFuLmNtLWF0dHJpYnV0ZSB7Y29sb3I6ICNhNmUyMmU7fQouY20tcy1tb25va2FpIHNwYW4uY20ta2V5d29yZCB7Y29sb3I6ICNmOTI2NzI7fQouY20tcy1tb25va2FpIHNwYW4uY20tc3RyaW5nIHtjb2xvcjogI2U2ZGI3NDt9CgouY20tcy1tb25va2FpIHNwYW4uY20tdmFyaWFibGUge2NvbG9yOiAjYTZlMjJlO30KLmNtLXMtbW9ub2thaSBzcGFuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjOWVmZmZmO30KLmNtLXMtbW9ub2thaSBzcGFuLmNtLWRlZiB7Y29sb3I6ICNmZDk3MWY7fQouY20tcy1tb25va2FpIHNwYW4uY20tZXJyb3Ige2JhY2tncm91bmQ6ICNmOTI2NzI7IGNvbG9yOiAjZjhmOGYwO30KLmNtLXMtbW9ub2thaSBzcGFuLmNtLWJyYWNrZXQge2NvbG9yOiAjZjhmOGYyO30KLmNtLXMtbW9ub2thaSBzcGFuLmNtLXRhZyB7Y29sb3I6ICNmOTI2NzI7fQouY20tcy1tb25va2FpIHNwYW4uY20tbGluayB7Y29sb3I6ICNhZTgxZmY7fQoKLmNtLXMtbW9ub2thaSAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgewogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Owp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/neat.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtbmVhdCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogI2E4NjsgfQouY20tcy1uZWF0IHNwYW4uY20ta2V5d29yZCB7IGxpbmUtaGVpZ2h0OiAxZW07IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogYmx1ZTsgfQouY20tcy1uZWF0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNhMjI7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLWJ1aWx0aW4geyBsaW5lLWhlaWdodDogMWVtOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMwNzc7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLXNwZWNpYWwgeyBsaW5lLWhlaWdodDogMWVtOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMwYWE7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6IGJsYWNrOyB9Ci5jbS1zLW5lYXQgc3Bhbi5jbS1udW1iZXIsIC5jbS1zLW5lYXQgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICMzYTM7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLW1ldGEge2NvbG9yOiAjNTU1O30KLmNtLXMtbmVhdCBzcGFuLmNtLWxpbmsgeyBjb2xvcjogIzNhMzsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/night.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogTG9vc2VseSBiYXNlZCBvbiB0aGUgTWlkbmlnaHQgVGV4dG1hdGUgdGhlbWUgKi8KCi5jbS1zLW5pZ2h0LkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMGEwMDFmOyBjb2xvcjogI2Y4ZjhmODsgfQouY20tcy1uaWdodCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICM0NDcgIWltcG9ydGFudDsgfQouY20tcy1uaWdodCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzBhMDAxZjsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy1uaWdodCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICNmOGY4Zjg7IH0KLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZSAhaW1wb3J0YW50OyB9CgouY20tcy1uaWdodCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzY5MDBhMTsgfQouY20tcy1uaWdodCBzcGFuLmNtLWF0b20geyBjb2xvcjogIzg0NWRjNDsgfQouY20tcy1uaWdodCBzcGFuLmNtLW51bWJlciwgLmNtLXMtbmlnaHQgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI2ZmZDUwMDsgfQouY20tcy1uaWdodCBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogIzU5OWVmZjsgfQouY20tcy1uaWdodCBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjMzdmMTRhOyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tbWV0YSB7IGNvbG9yOiAjNzY3OGUyOyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tdmFyaWFibGUtMiwgLmNtLXMtbmlnaHQgc3Bhbi5jbS10YWcgeyBjb2xvcjogIzk5YjJmZjsgfQouY20tcy1uaWdodCBzcGFuLmNtLXZhcmlhYmxlLTMsIC5jbS1zLW5pZ2h0IHNwYW4uY20tZGVmIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tZXJyb3IgeyBjb2xvcjogIzlkMWUxNTsgfQouY20tcy1uaWdodCBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogIzhkYTZjZTsgfQouY20tcy1uaWdodCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzY5MDBhMTsgfQouY20tcy1uaWdodCBzcGFuLmNtLWJ1aWx0aW4sIC5jbS1zLW5pZ2h0IHNwYW4uY20tc3BlY2lhbCB7IGNvbG9yOiAjZmY5ZTU5OyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tbGluayB7IGNvbG9yOiAjODQ1ZGM0OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/rubyblue.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtcnVieWJsdWUgeyBmb250OjEzcHgvMS40ZW0gVHJlYnVjaGV0LCBWZXJkYW5hLCBzYW5zLXNlcmlmOyB9CS8qIC0gY3VzdG9taXplZCBlZGl0b3IgZm9udCAtICovCgouY20tcy1ydWJ5Ymx1ZS5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzExMjQzNTsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLXJ1YnlibHVlIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogIzM4NTY2RiAhaW1wb3J0YW50OyB9Ci5jbS1zLXJ1YnlibHVlIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMUY0NjYxOyBib3JkZXItcmlnaHQ6IDdweCBzb2xpZCAjM0U3MDg3OyB9Ci5jbS1zLXJ1YnlibHVlIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtcnVieWJsdWUgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZSAhaW1wb3J0YW50OyB9CgouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzk5OTsgZm9udC1zdHlsZTppdGFsaWM7IGxpbmUtaGVpZ2h0OiAxZW07IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNGNEMyMEI7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1udW1iZXIsIC5jbS1zLXJ1YnlibHVlIHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICM4MkM2RTA7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNGMEY7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1zdHJpbmcgeyBjb2xvcjogI0YwODA0NzsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLW1ldGEgeyBjb2xvcjogI0YwRjsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLXZhcmlhYmxlLTIsIC5jbS1zLXJ1YnlibHVlIHNwYW4uY20tdGFnIHsgY29sb3I6ICM3QkQ4Mjc7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS12YXJpYWJsZS0zLCAuY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWRlZiB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWVycm9yIHsgY29sb3I6ICNBRjIwMTg7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICNGMEY7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICNGNEMyMEI7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IGNvbG9yOiNGMEYgIWltcG9ydGFudDsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWJ1aWx0aW4sIC5jbS1zLXJ1YnlibHVlIHNwYW4uY20tc3BlY2lhbCB7IGNvbG9yOiAjRkY5RDAwOyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/solarized.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKU29sYXJpemVkIHRoZW1lIGZvciBjb2RlLW1pcnJvcgpodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQKKi8KCi8qClNvbGFyaXplZCBjb2xvciBwYWxsZXQKaHR0cDovL2V0aGFuc2Nob29ub3Zlci5jb20vc29sYXJpemVkL2ltZy9zb2xhcml6ZWQtcGFsZXR0ZS5wbmcKKi8KCi5zb2xhcml6ZWQuYmFzZTAzIHsgY29sb3I6ICMwMDJiMzY7IH0KLnNvbGFyaXplZC5iYXNlMDIgeyBjb2xvcjogIzA3MzY0MjsgfQouc29sYXJpemVkLmJhc2UwMSB7IGNvbG9yOiAjNTg2ZTc1OyB9Ci5zb2xhcml6ZWQuYmFzZTAwIHsgY29sb3I6ICM2NTdiODM7IH0KLnNvbGFyaXplZC5iYXNlMCB7IGNvbG9yOiAjODM5NDk2OyB9Ci5zb2xhcml6ZWQuYmFzZTEgeyBjb2xvcjogIzkzYTFhMTsgfQouc29sYXJpemVkLmJhc2UyIHsgY29sb3I6ICNlZWU4ZDU7IH0KLnNvbGFyaXplZC5iYXNlMyAgeyBjb2xvcjogI2ZkZjZlMzsgfQouc29sYXJpemVkLnNvbGFyLXllbGxvdyAgeyBjb2xvcjogI2I1ODkwMDsgfQouc29sYXJpemVkLnNvbGFyLW9yYW5nZSAgeyBjb2xvcjogI2NiNGIxNjsgfQouc29sYXJpemVkLnNvbGFyLXJlZCB7IGNvbG9yOiAjZGMzMjJmOyB9Ci5zb2xhcml6ZWQuc29sYXItbWFnZW50YSB7IGNvbG9yOiAjZDMzNjgyOyB9Ci5zb2xhcml6ZWQuc29sYXItdmlvbGV0ICB7IGNvbG9yOiAjNmM3MWM0OyB9Ci5zb2xhcml6ZWQuc29sYXItYmx1ZSB7IGNvbG9yOiAjMjY4YmQyOyB9Ci5zb2xhcml6ZWQuc29sYXItY3lhbiB7IGNvbG9yOiAjMmFhMTk4OyB9Ci5zb2xhcml6ZWQuc29sYXItZ3JlZW4geyBjb2xvcjogIzg1OTkwMDsgfQoKLyogQ29sb3Igc2NoZW1lIGZvciBjb2RlLW1pcnJvciAqLwoKLmNtLXMtc29sYXJpemVkIHsKICBsaW5lLWhlaWdodDogMS40NWVtOwogIGZvbnQtZmFtaWx5OiBNZW5sbyxNb25hY28sIkFuZGFsZSBNb25vIiwibHVjaWRhIGNvbnNvbGUiLCJDb3VyaWVyIE5ldyIsbW9ub3NwYWNlICFpbXBvcnRhbnQ7CiAgY29sb3ItcHJvZmlsZTogc1JHQjsKICByZW5kZXJpbmctaW50ZW50OiBhdXRvOwp9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsgewogIGNvbG9yOiAjODM5NDk2OwogIGJhY2tncm91bmQtY29sb3I6ICAjMDAyYjM2OwogIHRleHQtc2hhZG93OiAjMDAyYjM2IDAgMXB4Owp9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWxpZ2h0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmNmUzOwogIGNvbG9yOiAjNjU3YjgzOwogIHRleHQtc2hhZG93OiAjZWVlOGQ1IDAgMXB4Owp9CgouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3Itd2lkZ2V0IHsKICB0ZXh0LXNoYWRvdzogbm9uZTsKfQoKCi5jbS1zLXNvbGFyaXplZCAuY20ta2V5d29yZCB7IGNvbG9yOiAjY2I0YjE2IH0KLmNtLXMtc29sYXJpemVkIC5jbS1hdG9tIHsgY29sb3I6ICNkMzM2ODI7IH0KLmNtLXMtc29sYXJpemVkIC5jbS1udW1iZXIgeyBjb2xvcjogI2QzMzY4MjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWRlZiB7IGNvbG9yOiAjMmFhMTk4OyB9CgouY20tcy1zb2xhcml6ZWQgLmNtLXZhcmlhYmxlIHsgY29sb3I6ICMyNjhiZDI7IH0KLmNtLXMtc29sYXJpemVkIC5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICNiNTg5MDA7IH0KLmNtLXMtc29sYXJpemVkIC5jbS12YXJpYWJsZS0zIHsgY29sb3I6ICM2YzcxYzQ7IH0KCi5jbS1zLXNvbGFyaXplZCAuY20tcHJvcGVydHkgeyBjb2xvcjogIzJhYTE5ODsgfQouY20tcy1zb2xhcml6ZWQgLmNtLW9wZXJhdG9yIHtjb2xvcjogIzZjNzFjNDt9CgouY20tcy1zb2xhcml6ZWQgLmNtLWNvbW1lbnQgeyBjb2xvcjogIzU4NmU3NTsgZm9udC1zdHlsZTppdGFsaWM7IH0KCi5jbS1zLXNvbGFyaXplZCAuY20tc3RyaW5nIHsgY29sb3I6ICM4NTk5MDA7IH0KLmNtLXMtc29sYXJpemVkIC5jbS1zdHJpbmctMiB7IGNvbG9yOiAjYjU4OTAwOyB9CgouY20tcy1zb2xhcml6ZWQgLmNtLW1ldGEgeyBjb2xvcjogIzg1OTkwMDsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWVycm9yLAouY20tcy1zb2xhcml6ZWQgLmNtLWludmFsaWRjaGFyIHsKICBjb2xvcjogIzU4NmU3NTsKICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNkYzMyMmY7Cn0KLmNtLXMtc29sYXJpemVkIC5jbS1xdWFsaWZpZXIgeyBjb2xvcjogI2I1ODkwMDsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWJ1aWx0aW4geyBjb2xvcjogI2QzMzY4MjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWJyYWNrZXQgeyBjb2xvcjogI2NiNGIxNjsgfQouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICM4NTk5MDA7IH0KLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLW5vbm1hdGNoaW5nYnJhY2tldCB7IGNvbG9yOiAjZGMzMjJmOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tdGFnIHsgY29sb3I6ICM5M2ExYTEgfQouY20tcy1zb2xhcml6ZWQgLmNtLWF0dHJpYnV0ZSB7ICBjb2xvcjogIzJhYTE5ODsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWhlYWRlciB7IGNvbG9yOiAjNTg2ZTc1OyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tcXVvdGUgeyBjb2xvcjogIzkzYTFhMTsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWhyIHsKICBjb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM1ODZlNzU7CiAgZGlzcGxheTogYmxvY2s7Cn0KLmNtLXMtc29sYXJpemVkIC5jbS1saW5rIHsgY29sb3I6ICM5M2ExYTE7IGN1cnNvcjogcG9pbnRlcjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLXNwZWNpYWwgeyBjb2xvcjogIzZjNzFjNDsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWVtIHsKICBjb2xvcjogIzk5OTsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRvdHRlZDsKfQouY20tcy1zb2xhcml6ZWQgLmNtLXN0cm9uZyB7IGNvbG9yOiAjZWVlOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tdGFiOmJlZm9yZSB7CiAgY29udGVudDogIuKepCI7ICAgLyp2aXN1YWxpemUgdGFiIGNoYXJhY3RlciovCiAgY29sb3I6ICM1ODZlNzU7Cn0KCi5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsgLkNvZGVNaXJyb3ItZm9jdXNlZCAuQ29kZU1pcnJvci1zZWxlY3RlZCB7CiAgYmFja2dyb3VuZDogIzM4Njc3NDsKICBjb2xvcjogaW5oZXJpdDsKfQoKLmNtLXMtc29sYXJpemVkLmNtLXMtZGFyayA6OnNlbGVjdGlvbiB7CiAgYmFja2dyb3VuZDogIzM4Njc3NDsKICBjb2xvcjogaW5oZXJpdDsKfQoKLmNtLXMtc29sYXJpemVkLmNtLXMtZGFyayAuQ29kZU1pcnJvci1zZWxlY3RlZCB7CiAgYmFja2dyb3VuZDogIzU4NmU3NTsKfQoKLmNtLXMtc29sYXJpemVkLmNtLXMtbGlnaHQgLkNvZGVNaXJyb3ItZm9jdXNlZCAuQ29kZU1pcnJvci1zZWxlY3RlZCB7CiAgYmFja2dyb3VuZDogI2VlZThkNTsKICBjb2xvcjogaW5oZXJpdDsKfQoKLmNtLXMtc29sYXJpemVkLmNtLXMtbGlnaHQgOjpzZWxlY3Rpb24gewogIGJhY2tncm91bmQ6ICNlZWU4ZDU7CiAgY29sb3I6IGluaGVyaXQ7Cn0KCi5jbS1zLXNvbGFyaXplZC5jbS1zLWxpZ2h0IC5Db2RlTWlycm9yLXNlbGVjdGVkIHsKICBiYWNrZ3JvdW5kOiAjOTNhMWExOwp9CgoKCi8qIEVkaXRvciBzdHlsaW5nICovCgoKCi8qIExpdHRsZSBzaGFkb3cgb24gdGhlIHZpZXctcG9ydCBvZiB0aGUgYnVmZmVyIHZpZXcgKi8KLmNtLXMtc29sYXJpemVkLkNvZGVNaXJyb3IgewogIC1tb3otYm94LXNoYWRvdzogaW5zZXQgN3B4IDAgMTJweCAtNnB4ICMwMDA7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCA3cHggMCAxMnB4IC02cHggIzAwMDsKICBib3gtc2hhZG93OiBpbnNldCA3cHggMCAxMnB4IC02cHggIzAwMDsKfQoKLyogR3V0dGVyIGJvcmRlciBhbmQgc29tZSBzaGFkb3cgZnJvbSBpdCAgKi8KLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLWd1dHRlcnMgewogIHBhZGRpbmc6IDAgMTVweCAwIDEwcHg7CiAgYm94LXNoYWRvdzogMCAxMHB4IDIwcHggYmxhY2s7CiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7Cn0KCi8qIEd1dHRlciBjb2xvcnMgYW5kIGxpbmUgbnVtYmVyIHN0eWxpbmcgYmFzZWQgb2YgY29sb3Igc2NoZW1lIChkYXJrIC8gbGlnaHQpICovCgovKiBEYXJrICovCi5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA3MzY0MjsKICBib3JkZXItY29sb3I6ICMwMDIzMmM7Cn0KCi5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7CiAgdGV4dC1zaGFkb3c6ICMwMjEwMTQgMCAtMXB4Owp9CgovKiBMaWdodCAqLwouY20tcy1zb2xhcml6ZWQuY20tcy1saWdodCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOGQ1OwogIGJvcmRlci1jb2xvcjogI2VlZThkNTsKfQoKLyogQ29tbW9uICovCi5jbS1zLXNvbGFyaXplZCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsKICBjb2xvcjogIzU4NmU3NTsKfQoKLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLWd1dHRlciAuQ29kZU1pcnJvci1ndXR0ZXItdGV4dCB7CiAgY29sb3I6ICM1ODZlNzU7Cn0KCi5jbS1zLXNvbGFyaXplZCAuQ29kZU1pcnJvci1saW5lcyB7CiAgcGFkZGluZy1sZWZ0OiA1cHg7Cn0KCi5jbS1zLXNvbGFyaXplZCAuQ29kZU1pcnJvci1saW5lcyAuQ29kZU1pcnJvci1jdXJzb3IgewogIGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzgxOTA5MDsKfQoKLyoKQWN0aXZlIGxpbmUuIE5lZ2F0aXZlIG1hcmdpbiBjb21wZW5zYXRlcyBsZWZ0IHBhZGRpbmcgb2YgdGhlIHRleHQgaW4gdGhlCnZpZXctcG9ydAoqLwouY20tcy1zb2xhcml6ZWQgLmFjdGl2ZWxpbmUgewogIG1hcmdpbi1sZWZ0OiAtMjBweDsKfQoKLmNtLXMtc29sYXJpemVkLmNtLXMtZGFyayAuYWN0aXZlbGluZSB7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKCn0KLmNtLXMtc29sYXJpemVkLmNtLXMtbGlnaHQgLmFjdGl2ZWxpbmUgewogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNSk7Cn0KCi8qClZpZXctcG9ydCBhbmQgZ3V0dGVyIGJvdGggZ2V0IGxpdHRsZSBub2lzZSBiYWNrZ3JvdW5kIHRvIGdpdmUgaXQgYSByZWFsIGZlZWwuCiovCi5jbS1zLXNvbGFyaXplZC5Db2RlTWlycm9yLAouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1nQUFBRElDQVFBQUFBSFVXWVZBQUJGRlVsRVFWUVlHYnpCQ2VEVlUvNzQvNmZqOUhJY3gvRlJIeDlKQ0Ztek15R1JVUmhMWklrVXNvZVJmVWpTMkZORHRyNldrTWhPOXNtK1M4bWFKZnUrSmNzZysvby9jK1o0ei90OTcvdmV6eTN6K3o4ZWtHbG5ZSUNHL283Z2RrK3dtU0haMXo0cEpJdHFhcGpvS1hXYWhtOE5tVjZlT1RiV1VPcDYvNmEvWElnNkdRcW1lbkoybERIeXZDRloyY0JEYm10SEEwNDNWRmhId1h4Q2xXbWVZQWRMaFYwMEJkODVnbzhWbWFGQ2tiVmt6bFFFTnpmQkRaNWd0TjdId0YwS0RyVHdKMGR5cFNPenBhS0NNd1FIS1RJcmVZSXhsbWhYVHpUV2tWbStMVHluWmhpU0JUM1JaUTdhR2ZqR0VkM3F5WFExRkR5bXFiS3hwc3BFUlFOMk1pUmpOWmxGRlFYZkNORm05bk0xenBBc29Zam10UlRjNWFqd3VhWGM1eHJXc2tUOTdSYUt6QUdlNUFSSGhWVXNEYmpLa2x6aWlYNVdST2NKd1NOQ05JKzl3MUp3djRaYjJyN2xDTVo0b3E1QzBFZFR4KzJHek51S3BKK2lGZjM4SkVXa0hKbjlETkY3bW1CRElUcldFZzBWV0wzcEhVMjB0U1pudXFXdStSM0J0WWE4WHhWMUhPN0d5RDMyVWtPcEwveURsb0lORlRtdnRJZCtubUFqeFJ3NDBWTXdWS2l3cktMRTRiSzVVT1ZudFl3aE9jU1NYS3JKSEtQSmVkb2NwR2pWei9aTUlibllVUEIxMC9lS0NyczVhcHFwZ1ZtV3pCWVdwbXRLSGVjSlBqYVV1RWdSRERhVTBvWmdoQ0o2ek5NUTVaaERZeDA1cjV2Mm11UWRNMEVJTHRYVXNhS2lRWDlXTUVVb3RhZ1F6RmJVTk42TlVQQzJubTVweEVXR0NqTWMzR2RKSGpTVTJrT1JMSy9KR1Nya2ZHRUlqbmNVL0NZVW5PaXBvWWVtd2o4dFNUOU5zSm1CN1RVVlh0YlV0WEFUSlZaWEJNdlllVFhKZm9iZ0pVUG1HTVAveUZhV29uYWE2QmNGTzNucWNJcUNvelNab1pvU3IxZzR6Sk96dXlHbnhURVgzbFVFSjdXY1pnbWU4ZGRhV3ZXSm8yQUpSOURaVTNDVUliaENTRzZ5YlN3TjZxdEpWbkNVMnN2RFRQMlpJbk93MmNCVHJxdFFhaHROWm45TmNKNGwyTmFTbVNra1Axbm9aV25Wd2tMbWRVUE93TFpFd3kyWjNTM1IrNHJJRzloY2JwUFhIRlZXY1FkWmtuMkZPdGEzY0tXUW5OUkM1ZzFMc0phaDRHQ3pTVnNLbkNPWTVPQUZSVEJla3l5cnlleWlsaEZLdmE3NXI0TWMwYVdhbkdFYVRoY3kzMXM0MzlLS3hUekpZWTVXVEhQVTFGdElIalFVM09pcDR4bE56ai9sQncyM2RZWlZsaVFhN1dBWGY0c2hldGNRZmF0SStqV1JEQlBteU5lVzZBMVA1a2REZ3lZSmxiYTBCSU04Qlp1MUpmckZ3SXR5amNBTVIzSzBCV09JcnRNRVh5aHlybFZFeDN1aTVkVUJqbUIvUTNDWFc4NVI0bUJEMHM3Qis0cTV0S1VqT2xiOXFxbWhpNUFaNkdGSUM1SFh0T29iZFlHbFZkTVZiTko4dG9OVEZjSHhub0wrbXVCYWdjY3RqV25iTk11UjAwdUk3blFFU3dnNXEycXFyS1dJZnJOVW1lUW9jWTZIdXl4SlYwMndqMzZ3MDB5aHBtVUZlbnY0cDZmVWtaWXFMeXVpbngyUkdPamhDWFl5SkY4NG9pVTAwWU1PT2hocXVOZGZiT0I3Z1U4OHBZNHhKTzhMVmRwNi9xMnZvZUI0UjA0dklkaFNFNDB4Wk9ieDFIR0dKL2phMExCdGhGSW5LYUxQUEZ6dUNhWWFvajhKalBNRTh5b3l4bzZ6bEJxa2lVWllncTAwT1lNc3diV081TkdtcSt4aGlweEhMUlcyOUFSak5LWE8wd1JuZWFyOFhTZzRYRlBMS0VQVVMxR3F2eUx3aXVCVW9hN3pwWjBsNXh4RndXbVdaQzFINWg1RndVOGVRN0srZzhVY1ZZNlRNUXJlVlFULzh1UThaK0FMSVhuU0VhMnBZWlFuZUU5UlpiU0JOWVhmV1lKelcvaC80ajREcDF0WVZjRklDNTAxOVZ5aTRUaFBxU0ZDempHV2FIUVRCVThxNnZyVndneFA5TGttODQwaW1XS3BjTENqWVR0ckt1d3ZzS1NucnZIQ1hHa1NNazlwNmxoY2tmUnBJZWlzK04yUGlzelQrbUZMc3B5R2xlVWhEd2NMclpxbXlleWx4d2pCY0tIRWFwcWtteWFuZ3lMWlJWT2lqd090Q1k1U3NHNXpMME93bENKNHk1S3puRjNFVU5ERHJpbndpeUxaUnpPWHRsQmJLNUlUSEZHTHA4UTBSNmFiNm1TN2VuSTJjRnJ4T3lIdk9DRmFUMUhUaFMxa3JqQ3dxV2V1ckNrayt3aWxsaENDK1JTWm5SWEJpWmFDNVJYUklaWUtwMmx5ZnJId2lLUEtSMEpEenJkVTJFRmdwaWRhd2xGRFI2RmdYVU1OYStnMUZZM2JVUWgyY0xDd29zUmRudVFUUy9TK0pWckdMZVdJdnRRVXZPTkp4bHFTUVlZS3B3b04ya2FvY0xqZFZzaXM0TWs4MEVTRjJZcFNrendsZGpIa2pGQ1V1dEkvcitFSERVOG9DczZ5ekwzUGhXaUVvb1pkRk1reW1sYXM0QWNJM0ttb01NTlNRM3RIempHV0NyY0pKZFl5WkM3UUZHd2pSTDlwK01yUmtBR1d6SWFXQ245VzBGM1RzSzAxYzJadlF3MGJ5dnh1UVUwcjFsTTBxSk83d1cwa1JJTWREVHRYRWR6aTRWSWgrRW9JSG0wbVd0QXRwQ2l4bGFiZ244M2ZLVEk3YW5KZTlTVDdXSUsxRE1HcFFtWWVBNThJbVY2ZXpPR096SzJLZ3EwMXBkNjBjS1dpVWk5TGlldmIvMHZJRFBIUTA1S3p0NGRkUGNrUUJRdG9hdXJqeUhuZWsvbkt6cFFMclZnS1BqSWtoMnY0dXllenB2K1hvbzdmUEZYYUdGcDF2YUxLeFE0dVVwUVFTNVZ1UXM3QkNxNHhSSnY3ZndwVnZ2RkVCM2orNjIwaGFPdW9jcU1oV2Q2VFRQQUV4K21kRk5HSGRyYW5GZTk1V3JXbUl2bFk0RjFEbGUyRUNnYzZjdG83U3J5dXFHR0doYTB0RlE1VjUzbWlnVUttZzZYS0FvNHFTM21payswT1pwQWhPTGVaS2ljYWNnYVljeXg1aHlwWVFFMDJaQTR4aS9wTmhPUXhSNGtsTkt5cWFjaittcHhuTFRubkdTbzg1KyszWkNacTZsclprWGxHRVgzbytDOUZpZWNjSmJaV1ZGakMwWW8xRlpuSmhvWU1Gb0kxaEVaOXI2aHdnNzVId3pCTmhiWkNkSkVmSndUUEd6SnZhS0ltdzF5WVgxSERBbXBYUitaSlEvU21ncU1OVlFiNXZnYW1Hd0x0dDdWd3ZQN1FrMXhwaU01eDVDeXY5M0UwNk1abWdzME55YTJheklLT1lLQ0dCUVFXOTdSbWhLTktGMDJKWnFIRUo0bzU4cXA3WDVFY1ptYzU2dHJYRXF6akNCWjFNRkdSODdRbDJ0U1RzNkNHeFMwNVBUelJRb3JrYnc3YUtvS1hGRFhzWVc0MlZKaWgvcStGUDJCZFR6RFR3VnFPWUIxM2xpTTUwdkc3d3kyOHFhZ3l1SVhNZVFJL09xcThiY241d0pJNTB4SDAwQ1JudHlmcEwxVDRoeWRZcG9YZ05pRnpvSVVURFpuTE5Semg0VEJId2JZR0R2Wmt4bWx5SmxveXI2dFJpaHBlVUc5NEduS3RJem5SRUYwdHpKRy9PT3I3M0pCY3JTaDFrNld1VHByZ0xVK21uU0dudjZaZ2UwTk56K2tURGRIOG51QXVUZEpEQ05iMjFMQ2lJdXFsWWJxR3pUM1JBb1pvZlFmakZhemtxZU5XZFlhR3ZZVE0wMDFFVzJvS1B2VmsxbGRVR1NnVXRIRndqS00xaDlqbkZjbXk1bENob0xOYVFNR0dEc1liS2l4bGFNQm1tc3gxUWpDZmZsd1RmTy9nY2tXMHJ1WjNqdWdLUjNSNVc5aEdVV3FDZ3h1RmdzdWFDSG9yb3RHS3pHYWVaQjlETXNhVG5LQ3BNdHdUdk96aFlrMHJkckFyS0NxY2FXbVZrMStGMzcydXIxWWtLeGdhdEk4UWZlMWdJWDl3RTlGZ1M4RVNtdUFCSVhuUlViQ2FwY0tlK25PN3NsQ2xTWkZ6cFYvTGtMbmNFYjFxaU80MmZTM1I4NTVTdTJtQ0xoNjJ0MVNZWlpZVm1Ld0lIalJFRjJ1aWhUekIyMEpPa3o3ZGt4ellRbkswVU9VNDk0d2grVldSYzZVbjJrcFRhVmdMREZFa0ovdWh6UmNJMFlLR2dwR1dPbG9jQlUvYTRmS29KL3BFYU5WNmppcDMrRXM5VlhZMDc4ckdubUFkZjd0OXlsUFhTMzRSQlN1WVBzMVVlY1pUVTc4V2FuaEJDSHBaNXNBb1R6MExHWktqUGY5VFJ5cHFXRWlUdk9GZ2xMMWZDRVkzd1kvKytyYms3QzhiV2ViQTZwNm9tNlBnT0wya3A0NFRGSmxWTkJYYWUycnFxZFp6dE9KcFQ4N0dRc0U5anFDUEllOVZSZVp1US9DSWdhY3N5WmRDcElTY1NZcWNaazhyK25zeUN6aHlmaE9xSEdPSXZyTGtuQzh3VHBGY2FZaUdDL1JVMU5SYlVlVXBvY1FPbmtScEdPcklPY05SeCsxdUEwVXJ6aFNTdCtWeVMzU0pwbkZXa3pORHFPRkdJV2NmUjg2RG5tQVJUUTFIS0lMMzNFeFBpZW1lT2hZU1NqemxTVVpadUU0VHZlb0pMbkJVT0ZvZjZLaXlzQ2JuQUVjWmdjVU5URE93a3FXdTNSV3RtR3Bad2xIaEpFTmRaM21pR3owbEpsc0tuamJ3cVNIUWpweG5GRGxUTEx3cUpQTVpNamQ3S3J6a1NHN1ZzeFhCWkUrRjhZWmtiMDFPZTAweXlSSzlwc2g1U1loMjl5U1BLQm8yeWxOaHQ3WmtabnNLZW5qS05KdTlQTkV5WnBhQ0h2NEt0NlJRc0x2QVZwN005a0lpbW1DVXdHZVdxTE1tR3VJb3RZTW1XTnBTYWhraFp3OUZxWnNWbktKaHNqQUh2dEhNc1RNOWZDSTA2RHgvdTN2ZlVYQ3Fmc0tSYzRvRlkyak1zb28vN0RKRHdaMUNzSUtuSnUrSjlsZGtwbWlDeFF4MXJXakkrVDlGd2NXV3pPdWFZSDBIajdrbE5SVldFUXBtYXFvc2FraUdOVEZIZGpTL3FuVWRtZjBOSlc1eHNMMEhoaW1DQ1paU1J6bVNQVFhKUTRhYXp0QXd0Wm5vYWJlYkoraHRDYVo3Q201MzVCeW9xWEtiWDFXUmM0RWgyTWtSWFd6SW1WYzk2Q2o0VmRPS1Z4Ujg0VmRRc0lVTThQc29vdTJieVZIeVpGdXE3TzhvdGJTUTJVQW9lRVdUdWRBVExHU3BaelZMbFhWa1BVMkpjKzI3bHN3MmptZzVUNVZoYmVFM0JUMDgzSzlXc1RUa0ZVL09zaTByQzVsUmxwd1JIVWllc05TMHNPdm1xR01MMWFSYlBBeFRKRDlaS3R4dW9iK2hobDhjd1lHV3BKOG51Yjd0NXA2Y29ZYk1vdloxQlRkYUtuMWpZRDZoNEdGRE5GeVQvS3FlMVhDWHBoWEhPS0xabXVSU1JkQlBFZlZVWFF6Sm01WUdQR0dKZHZBRXI3aEhOZEdabnVCdnJwY2lHbW9wT0xmNU4wdVZNeTBGZllUb0prOTB1VUNiSnVwYVZwTzUzVUpYUjJiVnBvVTAwVjJLT280ek1GckJkMEp0ejJwYTBjbFQ1UTVMOElwUTE3N21XUWVqUE1FSmh1UWpTMTByZWY2SEhqZEVoeTFQMUVZUjdHdE8wdVNzS0pRWUxpVG5HMXJWU2NqNWx5YXpwcVdHbDV1QmJSV2w3bTZpeEdPT25Fc01KUjd6OEowbjZLTW5DZHhoaU5ZUUNvWjZDbVlMbk84b21DM01rVzNia3RsUG1FdC9WUVFIZWpMMytkT0U1RmxQZEsvTXE4aFp4eEp0THlScmVwTFRoWUtiTFp4a1NiNVc1MnZZeE5PYU94VUYweXhNVVB3QlRZcUN6eTAxWGF5WUswc0p5V0JMcVgwTXdVNUN6b3ltUnpWMEVqamVVZUxnRHBUbzZpajQyWkF6dkQwMWRIVVVUUExVOTZNZExiQk1FOG5GQm43ekpDTXRKY1pva244WW9xVTBGUzVXRkt5bmlIb2JndU1jbVc4TjBYa1daamt5TjNocU9NdFMwOHIrL3hUQndwWlNaM3FpVlJYOFN6TUhIamZVTkZqZ0hFUG1ZOVBMM3lrRXp4a1NyZS8xWkQ2ei9OdXpudUIwUmNFMVRXVG05elJnZlVXVkppRzZ5cnpnbVdQWEM4RUFSNFd4aGxhZDBaYmdReUV6M3BHNVJWRXd3REpIMm1nS3BqY1RpQ096bjFsZlVXQU5GYloyQkE4YmFsbkV3ZUpDOUowaXVhZVpvSStpcHBGQ3p0RUtWdmNrUjJpaWNlMUp2aFZ5dHJRd1VBWnBnc3ViQ1BhVTd4VWU5dlduYU9wYVNCRXNwYWx5a2hDOWJVbE9NcFQ0MlpIY2E2aHlycUttdy93TVI4SDVabWRGb0JWSmIwM080VUwwdFNObnZJZVJta3JMV3Fyczc4Z2NyRW4ydHBjYm9oMFVQT1czVVVSOVBNazRUNG5uTktXbUNqbHJlZmhDd3hSTnp0Zm1JUVZkREVsdlM0bTEvV3VPdWpvWkNzNVhWT2p0S1BHb2tKenNZQ3RGWW9Xb25TUFQyMURoZVUvd1doTTE5RmNFbHdxTkdPc3A5UThOL2N3WGFpTkQxTW1lTDFRNVhST3RZWWdHZUZxMWFUTXNvTW1jcktqUXJPRlFUUTFmbUJZaG1XNm84SmtqYzdpREpSVEJJbzVrZ0pENXlNRVlBM3NyQ2c3VkZLd2lWSmttUkNjNW9oR09LaHNZTW4vWEJMZG81dGFaamxiOVlBbEdXUmltcWJDc29ZN0hGQVhMYTVJMUhQUnhNTXNRREhGa1d0Uk5uaXFUOVVFZU5qY0U3UlVsckNKNFIyQ1NKdXFsS0hXdkpYakFVTmNJVFlrZW51QlJCODRUYmVlcGNxVGozelp5Rkp6Z1lRZEhucWZnSTBkZFV3UzZHcVdwc0tXaGpxOWNWMHZCQUVNTjJ6bnErRUJmSVdUK3BDbFl3NXhzVGxKVTZHZUlCc2pHbW1BTlR6SlppSVlwZ3JNME9hOFpNamQ3TlA4N2p4aHFHT2hKbG5RdGp1UXBCKzhhRUUwMHdaRnpuU0pQeUh4Z0gzSGtQT3NKRnZZazh6cUNIelRzMUJZT2E0SjNQRlUrVVZSWnhsSERNNFlhdmxOVXVNb1J2ZWlaQTJkN2dyTU5jMmcrUmJTQ0VLem1nWXNVbVdtYXpGSnlvaU9aNEtueWhLT0dSeldKYTArbW95VjRUVkhEem41MUF3dHFhcGhmay9sUlEwOEZYMWlpcXhUQi9rTHdkMFZ5bktmRXZJNmNkNFhNVjViTWhaN2daVVdWellRNk5tMkJZenhKYnczYkd0aEVVVU1mZ2JHZW9yYWU2RHhIdEpvWjZhbGhaMCt5dGlWb0sxUjR6NVBUck9FQ1QvU3Vnc2VFT2xiMU1NTlI0VlJOY0p5K1YxSGc5T05DbFNaRlpqZEhsYzZXNkZCTGRKamEyTUM1aGhwdTBEQllFWTFURkd3aUZBeFJSQ3NZa2lNOUpSYjBKTk1Wa1c2Q1pZVC8yRWlUR1dtbzhrK2g0RmhETkU3QnZwcG9UU0ZubUNWNXhaS3p2Y0NkRG83VlZQbklVK0krUmM2OGp1QXBDOTBNd2NGQ3NKNWhEcXhnU2NZS3JlcnV5UXdUcXJ6b3FEQ21oV2k0SWJoQjBZcnQzUkdhNkdmRHY1MnJLWFdoaDI4ZHlaYVdVdmNaZU1UQmFab1NHeWlDdFJVNUo4aXZpaW9IYUVyczdKa2o2MXN5VnpUVGdPY1VPUThidUZCVFlXZEw1ZzNUNHFscGUwK3d2RDYzaGVBWFJmQ0NJZWQ5UmJDc3AyQ2lJN3JhVU9ZT1RVMTNOOFBOSHZwYUd2YXlvNGEzTExUMWxEclZFUFQyekxVbGhlQjFSK1pUUmZLV0orZGNvY0xKZmkxMXZ5SjUxbExxSjBXRDd0UndyeWV6amlWNVcyOHVKTzlxeWt6WDhKRGUybEhsLzlveUJ3YTJVTWZPbmdwWENpeHZLZFhUazN3cnNLbWlWWWRaSXFzb1dFRVJqYmNVTkR1aWFRb21Hb0liRmRFSG1zeVdudVIrSWVyaUtEVkxubGF3bHlOSEt3S2xTVTYzMVBLZXA4SjRRK2F5amtTTEtZTGhhbE5IbFl2dHRiNmZIbTBwNk9BcHNaNGwyVmZkcVpranV5c3k2eXNLTGxja2YxS1V1dENUczM5Ym1DZ0V5eW9hc0lXbFZhTUY3bWdtV3RCVDhLb2w1eHBIOUlHbGxvOGNKZG9wY3ZaMnNJbWxEbU1JYnREazNLSXBlTmlTMDhsUXcxMU5GUFR3VkZsUFA2cEoyZ3ZSZkk3Z1FVZm1OQXRmNkdzMHdReERzS0dsVkJkRjhyQ2Ezanpkd01hR0hPc0l0clprN2hBeU96cEs5VlMwNmo1RjQ5YjBWTkdPT2ZLczNsRFRvTXNNQmU5Wld0SEZFZ3hUSkxzN3FyeWdLWmpVbm1DWW9lQXFlVTZqcVd1TEp1cDRXZ2hPZHZDWUpuclNrU3pveVJrbTVNMlN0UXdWbHRQa2ZDQWs1OHRFVC9DU2crOE1VZWNtb3RNRW5oQktmV0JJWnNnMmlocnVNSlFhb0ltK3RrVExLRXFzcE1oMDB3OTVndkZDUVJ0RHdUVDFnVkREU0VWZGx3cVpmeG9RUmJLMGcrdGJpQlp4ektscG5weXBlamREd1RhZU92b3JNay9JSkUxMGg5Q3FSZTI4aGhMYmUwcE1zZFN3djRaYmhLaXZvMkJqRFdmTDhVS0pnZWF2d2x3YjVLbHdoeUU0dTRYa0dFMnl0WkN6bktMQ0RaWnE0MlZ6VDhITENycHJ1RmJJZk9JSU5taC9xQ2RaMVpCYzY1a0xIUjFCa3lmNXpuNnBOM1N2R0tJbEZOR3BsaHJPOVFTWGFuTE9NUVRMQ2EwWUpDUnJDWm0vQ1ptckxUbTdXekNLNEdKRGlXVWRGZVl4MUxDRmczTk1kMFhtQ3VGM1k1cklUTERVc1lTOXpvSFZ6d25Kb1lwU1RRb09ieUV6cjRjRkJOcVlUb3BvYVUvd2t5TFoybFBoWC81WTk1dWx4R1RWN0tqaFdyT1pnbDhNeVVVYWZqWXJhTmpOVTFOM0lXY2pUNVd6V3Fqd3RvYXJIU1VPYkdZTzNHQ0pacHNCbG5KR1BkNlpZTHlsMUdkQ0EyNjI1SXd3SkRQOEdVS3ltYnp1eVBsWmx2VFVzYVVoNXpGRGhSV0Z6UEtLWkxBbFdkY1FiT2JnRjl0T3FPc21CMWRxY3FZSm1Xc3RGYlpSUkk5cG9vbG1xaUxuVTBQT3Z4U2NwYWgyaVNMNVVKTnpnU2NZNStBdUlicE8wWUQzTkNXK2RMTXN6RlNkRkNXR3FHNmVWcTJ1WVZORGRJQ0dENlc3RVBSV1pFWTVncHNFOXJVa1MzbWlqenpKbm02VXBVRlhHMWhDVWVWb1M1V2ZOY0ZwYmxFTEwycXFyQ3ZNdlJmZDQ1b2FsdktVMnRpUTZlUEpPVk1SWGFzZTlpVHRMSnp0UHhKS0xXcG8yQ1JEY0p3bjJzV1NMS0lPMVdRV05UQ3ZwVlV2T1poZ1NDNDBKRDBkT2N0YVNxemtDUmJYc0tsYjExT2lwNlBDSjBJd1NKTTMxajNha1J4bFA3UnduNmFHYVVMMHFpTG5Ka3ZCM3hXWjIrUTFUZkN3cFFIM0cwbzkyVXptWDRvL29KTlFNTVNRYzU0N3dWSGhkaytWQ3cwMURGWUVuVHh6WktBbTc0UW1lTk5SMXc2V3pFaE5LMTVWSnp1Q2R4UTUzZFJVRHdzNUt2d2dCTU9FZ3BjVk5lMGhaSTZSWFQxSmQwY3lqNW5zYUVBSGdWbUdhSklsV2RzYzVVaTJFbHJSUjZqclJBdHROTUVBSVdyVERGdWJrWmFvazcvQWt6Zkl3ZnVXVnEwakh6dUNLNFFhYnRMVU1WUEIza0owb3lIVFNWRmxxTUFMaWxKZjJSZjhrNWFhSHRNZmF5b2NMQlM4TDg5b0tveHBKdm5Ba0RQYTBxcDVEQVVUSEtXbUNjbnRobG91OGlDS2FGRkxIV2NJTmQxbnlJd1hxclN4TU5tU3M2S21vTDJRckt1V3RsUTVWMDEyMHhRNXZSeVpTMXJnRmtXd2hpT3dpdVFiUjBPT1ZoUU05aVMzdGlYcDRSYXdSUE1wNXREbGV0T09CTDk1TXBNMDFkWlRCTTlwa241cUYwMTBySWVIRmNGWmhtU0dwWXBUc0k2bndocWU1Qzl5bmhscHA1b3BodVJiNldjSkZsZGtWblZFd3d4VmZyVmt2bldVdU5MQ2c1Ymdib0ZIUERsRFBEbW5LN2hVcldpSWJqYWREY2x1amxaY2Fva09GdXA0Umkxa2FjVjZqbXJySzFoTjliR3dwS0VCUTRRNkR2SVVYT21vNlU1THFRTTZFUHlpS05qVmtQbkprRFBORWF4aGlGYXk1RXhXMU5YVlVHcWNwWVlkUGNHaUNxN3ovVFNsYmhMNHBwbFdYS2Q3TlpPNVFRRnJlZmhSUVcvTkhPc3FjSWdsYzRVaFdrbFI4SzBRemJBdzA4Q0JEbnBiZ3FYZGVEL1FVc000UlpYREZCVzZXSktlL21GUGRIMEx0QmdpcTU3d0ZMemx5UXp6ODJxWXg1RDVXSlA1eVZKRFcwMUJmeUhuUzZIS08vcmVacUlkMVdHYTRIa2gya1dvZEo4aTZLb0lQbEFqMmhQdDc2Q3pYc1ZSNmtvUFJ6V1RmS3FJZW50YXRZcFF3Mm1lNEFBM3kxS2luZDNTd29PS1pEY0ZYVHdsOXRXVTZtZmdSazlkNzFzS3RsTndyam5ZdzV0QzVuNUxkS2lHcnkzSktObEhFZDNvYU1DRkhyYXpCUE1wL3VOSitWN0l1ZGNTYmVPSWRqVUVkd2wwVkhDT1pvNXQ2WWx1RXVhQzltUWVNZ1NmT3lLbllHRkhjSWVRODR5UVdidUpZSnBadzVDemdsREg3Z0tuV3FxTTlaVGFYY04wVGVZaFI4NGVRdEpUNzZKSjFsUkVlN1dubnZzTW1SYzlGUTdTQkJNOW1WM2xDVWRtSGsvUzJSQU10MFFqRk5GcVFwV2pEUFEwMURYV1VkREJrWHppS1BqR0VQM1ZQK3pJV1UydDdpbTQxRk9sb3lXem4vTDZka1V5M1ZMRGFaNmFwcGdETEhQakpFc3l2Sm5nV0VQVXlWQmlBYUhDVEVYd3JMdlNFYlYxZTFnS0puaWljV29yQzFNVXJWakIzdURoSkUvd2dTT3prMURYcGswazczcUNNOHh3MlV2RDVrSm1EVWZPb21xTXBXQ2tKUmx2S1hHbW9lQm0xOFVTalZJazA0U0NseFRCNllyZ0xBUExXWUs5SExVdDVjbWMwdllFUzhHblRlUmM2c2taYlFrV2R4UnNJY3lCUnp4MURiVGs5RmJVMGNhVFBPZ0pIaEpLbk9HSVZoUXF2S21vMGxsUnc5c2FiclprRHRkZzNQcWFLaTlvYXRqWThCK0czNzFwYU1nNittWkZOTnRRMDRtV0JxM3JZTE9tdFdXUXA4S0pucHk5RGRGZW5zeWpkcVoreVk0MFZKbEg4d2NkTHpDOFBabnZITUZVVFpVckRUa0x5UWFHdXM1WDVMenBZQWYzaStlL1psaHFHcVdoaDZPdTZ4VFI5WjZvaTVBWlp0cDdNajJFRW04b1NweGlZWkNIVS8xZmJHZE5OTlJSb1pNaG1pbEViMmdxSE9FSkR0WGtISy9Kbkc2SXJ2YlBDd1YzTmhPTlZkUzF0aEJNczFUNFFPQmNUV2EySXpoTWsyblc1S3luOXRYVXRwdjlSc0cybXN4aytac1F6UlFhY0puY3Bna2UwK1Q4eTVGemo4QmlHbzdYbEpqYVRJbHBRczdLRmpwcUduS3VveUVQZUlLbkZNa1pIdm9wZ2g4MXlTeE5GV3ZKV2NLUnM3MGoyRk9UMDEySWxsRUVPMW40cEQxNTEzWWcyc3NRUE9UaE9rdnlycUhVZEVYT1NFc2lobUJiVGJLWDFrTEJQV3FXa0xPcUpiakIzR0JJWm1vYThxV2w0Q0cvaVo3b2lBNzJaTDdUSk5lWlVZN2tGUWZ0RGNISGx1QnpSYkNlZ3pNdHJSalZRcFgybGdvUEtLTEpBa2NiTWwwMVhLMnA3eWhMOHBDQmJRM0JOMmF2SmdLdnR0Y3JXREszQ2lVT1Z4UThaUCtwcVhLeUl4bm1CeW1DZzV2SmpOZmtQSzQrYzhjSWZLOG9jVnQ3a21mZC9JNVNSMWhLdkN6VXRiK2xoZ2MwMFphTzZDeWhJUVAxVXY0eUlaamxvYWQ3MlBYWDBPSUp2bkZVKzBaZjZNaHNKd1RmVzByMFV3UWZXNExOTFpsNUhLMjYxSkNaNHFuQmFBcmVWQVMzV3JqVjBMQm5ORFVOTkRUb0NFZUZmd2djYjRnT0VxTFJoaXJXa2V4ckNFWUtWVjcxMURMWUVFMVhCRXNwNXRwVEdqb3Jrb21LWUY5RkRYdjdmUjNCR3diZXR0U3hueUw1M01CUGpzeERaak1oK1ZVVzlOUnhxMURoVmsrRlN4UWNhR2pWOVBhd3Y2ZUdCeXc1cXpveTd4azRSc09TaHFqSndXS2UvMXBFRWZ6a29iZUQvZFFKbXBxZWRjeUJUeTJzcjRuR05SSDBjMFNQV1RMcnFBYzBPUWNiL2dlbUtncXVjUVQ3eVNXS0NuMkVVb3RvQ3ZwWmN0N1JPMnN5L1FXMElXY1hkN3BRUlF5WlZ3VDJVU1JPODd1aGppb1RMS1YyYnJwTVVjTVFSYktIL04yVCtVbFRwYU1sczZjbWM2Q0NOeTNKZFlZU1V6ekpRNG9TRDNvS0xuY1VMT2lKdmpCRUMyb3FuQ0prSmx1Q1l5MlpRNXNvOVlZbFoxVkxsUVUxbVhFVzFqWkVSd2ovTVVTUmMyNFRkZXhscUxLZlFCdERUU2NKVVY4RnN6WEJFWTVrdHBENVVyOWhZQjROYjFpaWt3M0pvWXBrS1grUm9kUktGdDUzTU11Um5LU3BZMzFQd1lhR2FJTGgzd3hKR3o5VGtUUEVFVHhvQ1dacmd2T2xteU16eEZFd1ZKRTV4Wkt6dnlKNFd4RWMxNkdkNFhlM1dlcTRYSDJqS1Jpa3FPa0dRODdoUW5DN3dCbUdZTEFuZXNYM00rUzg3ZUZBVGF1dU4rUWNyaDd4SXhYSmJVSWRNdzNKR0UzeWxDV3pyaWVhcUNuNHpoR00xOVRRM3oxb0gxQVgrcFdFcUljN3dOR0FrVUxCby9aeFJhVjlOTnloNEJyM3JDSFp6YnptU2Zhd0JMMGROUndwVzFrSzlteFBYUjlwb3ZjZHJHU1pLOWMyazB4d0ZHemp1bmlDdFJTWkNaNmNjWjdnYWt0bWdBT3RLYkcvSm5Pa0pyamNRVGRGTXN4UlEyY0xZM1dUSXJsQ3cxZVdLbjhSNnB2dDRHRkRzbzNRb0w0YTNuTGszRzZKcnRNRTNkU2VucHg3UE5GVG1nYTBFYUpUTFEwNjFzRWVRb1dYaFNvOUxUWHNhU2pvSlFSWGVaTHREY2xiQ3JZemZ6SEhlYUtqSENWT1VrUUhPM0plRWVwcjU2bWhpeWFZWUtqak5VK0ZlZDF3UzVWbGhXU3FJL2hZVWRET2theGlLZWhveU9uckNWNXlCSHRiV0ZxVEhDQ3d0cERjWW9sZXNWUjV5VXpUWkJiM1JOTWQwZDZXUCtTdmh1Qm1SY0d4bnVRelQ5NUlDMjg1Y3I0MWNMR1E2YUpKaG1pNFRNR2VtcHhlaW1CUlF3MXRGS1YrOGpkNkt1em9TVHFxRHh6UnRwWmt1cnZLRUh4bHFYS1JJampmVU5OWFFzTk9zUlNjb1dGTFQrWWVSWlZEM0dSTjBNZFFjS3FRakhETXJkR0dWdTNpWUpwUXgzV0dVdmZibXh3RmZSMjBXQnEwb1lZN0xNRmhoZ1l0cjhqcGFFbmFPemphd1dXYVRQOG1NcjB0L0VQRFBvcWNueFRCSTVvNThMN3VvV25NcnBvcVB3Z1ZybEFVV0UrVitUUWw5cmF3b3lQNlFHQWxRdzJUUFJYK1lTa3h5QkM4WjZqaEhrWEJnUUw3V0lJM0RWRm5SZkNyQmZ4ZXd2OUQ2eHN5anlzNFZraFdiOXBVVTYyN0psbFYwWUROSE1rdS9sZE5NTVhERW80YUZuQWtrNFU2ZnJORVU0WGdaVVBtRUtIVWw0NEtyem1ZYW1qQWJoMEpGdkduYVRMUHUxczlqUEN3akZwWWlON3oxRFRPay9uYzA3Q2ZERnptQ2Y3aStiZk5IWGhEdExlQlh6VEJUNXJrTXZXT0l4cGw0RU1oMkxHSkJ1MnN5RG5BRXgybmFFaEhEV01NelBaRWh5Z3lTMW1TNVJUSnI1WmtvS2JFVW9ZcXIya3FkRFVFOHp0SzdPYUludEprRnJJRUN3djhMSlRhVng1WEpFODZnbzhkRmVaM0ZOM3JqYWJDQVlwb1lFZUM5enpKVlVMQmJtWmhEeWQ3a28wOXlkcE5aM25tMktlZTRGUFBYSG5ZRUYxbnFPRkVDMDhMVVZjRHZZWGtKSFc4Z1RhS0NrOVlHT2VJSmhxaUU0VG9QRWVwZHA3SVdGamR3bldhdWZHTXdKSkNNdFVUVEJCSzlCR0NPeTJ0R0dySlRISXd5RU96cDZhUHpOTU90bFprRHZjRVdwUDVTVk5oZmt2RHhobVNhelRKWFlyTTlVMUUweHdGVndxWlF3ekp4dzYra0dHR1VqMkZnbEdHbW5iMS9HNTF1ZFJTTU5sVHc2R0duQ2NVd1ZjT3Btc3FUSGEwNm83MnN3MVJMMDJwOXowVmJuTUxPYUlYM1FLYVlLU0NGUXpCS0VVTkhUU2M0OGs1M1JIOXd4R010cFFhNUtqalcwVzBuNlhDQ0NHNHl4Tk5kaFE0UjRsMUZmKzJzU2Q2VUZIaUlFT3lxcUZnVDAxbUVVTUQram95NzVqUGhPQStvVlZMbTMwOUZSNHlWT2xwNFJoTGlTY05tU21hWUY1UHcwU1RyT0lvV01TUjJVa1JYT01wK000U0hXOG84Wm9pNk9aZ2pLT2FGYXI4elpEemtXenZLT2prS0JqbUNYYnk4SmFoaGpYVUxZNEtsemdLTHZBd3hWR2h2eWQ0enhCMWQ5VDBwaWF6bUtMQ1ZaWTVzS2lEMHkyWlNZcmtVRVBVYklrK2RsUTRTSkhUUjUwazFEUGFVV0lkVFpXOU5Kd25KTU9FQ2dkN291L01ucHBNSjAyTzFWVDRXc2g4NU1uWnpjRlRuZ3BYR0tvODRxbXdnS2JDTC9vclIvU3pKMmNyQSt0Nk1wOTRLdnhKVWVJYlQzQ1F1MXVJZGxRRU96bEtmUzNVTWNyVGlGbU91cm9vY3JaclQyQWNtYW1PS2c4WW9tZUVLbS9ybFQyc29jaU1heWJhVWxGaHVxSENNMnFJSityZzRFY0RGeW1pRFN4emFIZFBjcEU2MnBENWt5TTVTQk1vQTFQYVV0Zkl0aFM4NWlnMVZQaVBQWVhnWUVNTms0UXE3VFhCZ283b1Q1N2dQVWR3Z0NIemhJVkZQRlU2T1lKekhBWDltNW9OclZqZUU2MW1pRHJxUTRWU2Exb2lVUlRzS0hDMElmak53VTJXeks2ZXFLOGpXbG40ZzE1VFZCbnFtRHRlQ0o1MDFQR0FvY0poaHFqWmR0QkVCNmxuaExyZUZKS3htbEtiZUdycUxpU1RoVkliQ2RHemxvYXNhNmxwTVFYSENNRTJib0xwSmdUN3lXYWVtdTZ3Qk9OYnFHTlZSUzBQS0lMN0xja2JqbVF0UjdLOEk1cXRxZWwrVC9DaEpUTklLTGpkVU1OSVJ5dk9Fa285WVlsMmN3UXZlQmlrQ05hd0pLY0xCYmM3K0pNOTJteXNOdmQvRnFwOGEwazZDTkVlN2NuWnJ4bFcwd1FYYVhqYWt0blJ3Tk9HWktZaU9Od1M3YTFKVmhlcTNXZ0pIbFFVR0tIS21wNEtBeFhSL1VMVVJjTmdvYTR6aEtTTHBaUjNreFJSYjBObUQwT0ZuK1VDUzdDekkxbmJQNitvNHg0N1FaRTV4UkN0M1phZ25ZY3ZtcFlRa3RYZGs1WUtYVHpCQzU3a0tFZTBWVnVpU1lxYXBzc01TM0M5cDJDS2tIT2c4QjhQYThwNWF0ckl3M3FleklXYW5NR2E1SFJETkY2Uk05d2NhY2wwTitROFo4aHNJa1NuYUlJZEhSVU9FZWJBUHkxemJDa2hNMDYyRkNKdGlmN1BVK1V0b1ZYeldLcU0xUHhYTzhjZmRydWhGUS9hNngzSktZYWd2VkRoUUV0Tml5aWlTUTdPc3VSc1pVa3UwQ1JORHM0U29nNktLanNaZ2syYllKcWlqZ3NFZW5vS2VuaWluUlhCbi9VM2xncFBkeURaeW5ReDhJaWlvTW5DZXA1S3k4bWpHczZXdHkwbDFoVVFUY05Xc3dTM1dScDJrQ05ad0pHOG9tRzhKcGhQVWFGYkM4bEVmYWJ3UDdWdE05eW9hTkNBanBSNDFWTmhyRDlMa2JONzIydjBDb1pNQnlGemhhVytNeXpSWUVXRkRRd04yTTQvSmlUNzZQdWxqVDNWVS9BMzZlYUlUaGIrUjlvWkdPQUo5dGV3a2dHdnFPTU5SV1lqVC9Dd3U5OVE4THFERTRUZ2JMV3hKMWphRERBRVJzRk9Gcm9iZ2pVc0JTY2FndVhVOGtLbTJSTDE5dFJ5cFNIbkhObEhpSVpxZ3VmczRvcGdRZFZkd3hCTk5GQlI2a1ZGcWI4b2dpbU96QjZhNkhUenJsREhFcFlheGppaUE0VE1Rb2JrRGcydmVqamZ3SkdXbW5iVkZBdzNIM2hxMk55UWZHN2h6NGFDK3czQmJ3YmVzRzBzd1lheXZwQXM2KytSaTFWZnp4OTNtRkNodnlONXhWSFRTKzBwOWFxQ0F4eVo2WmFjWnl3NSs3dXVRa0ZQUjlERGs5Tk9pRTdYMVBDWUpWalZVcXE3SmxySHdXQUxGNW5mSE5HakFwZHBxZ3p4NU93aWxEaENpRFlUZ25jOXdhR1c0QmRMTk5VUXZPdHB6RE9XSERIOEQ3VFIvQS84NUtsakVRdTNOUkVjNFBsLzZCMUhoYzhVbWI1Q3NLTW1HQzlFUGN4b1QyYW13SE5DbWVPRW5PUGJrbG5Na2JPZ0l2TzVVTU9wUXJTOVVHVmR0NmlIL2ZVUmpoSS9XT3BhVzlPS0xZUm9kNkhDVUVkT1gwMDB3cERaUTZod2c2TGdaZk9xbzFSZlQvQ3JKempla1hPR2hwYzFWVzcxWkxiWHl5cCs5M0lMYkMxa1B0SUVZeDBGSXgxVkRyTG9WelhSS1JZV2s4MDl5WWxDOUltY3Jpbnh0YWJLbnpSSmszbEFVMU9MRU4xajJ6cll6cjJteUhSWEpGZjRoNFFLVDFxU1R6VEI1K1pOVHpUUmtBeFg4RmNMVjJ1Uzhlb1FRMmFBa0Z6dkNNNzJzSkljSkVUM1dQalJrNXdpMzJ1U1M5cmZaYWpwV0V2ajloVzQyRjRvNU55dFNYWXk4SUtIYXkxMFZZZHJjbDRTa3FzY3JYcE13eUdPZ3RrYWpoZVN4ZFFxbXB4UDFMM3Q0UjVQcWFzRm5yUUVqeXRxNnFncDlZMDlReDlvNFMxRnpoVUNuMWt5SFN6QldMZW1vU0d2T3FMTmhaeUJqbUNhQVVZcE1ndDRDazd3QkJNTXdXS1dnanNVd1RhR1ZzeFdDMW1Zb0tpeXFxZUdLWXFvblNJUlEzS0lrSE8wcG1BeFRkQkhrYk92ZmxsZnIrQUErN2duYzUwaHVWS1lLMzkzRk95ZzdyYlBPL2l6STdoRTRDbkhISG5KMG9nTlBSVUdlVXBzclpaVEJKY3JvdlVjSmU1MUJQc3I2R2tKZGhDQ3NaNmFUdE1FYjJwcVdrcWVWdERYRS9RVmdnc1UvTmw4NmQ5Uk1GM0R4dlpUQTU4YWd1ODEwUldhd0NpU3p6WEJlVTNNTVc5b3lKVWVkdk5FdlF5TnUxZjEwQlNNZGRSMXZhTENZcFlhL21Hb2NMU2lZRGNMYlF6OGFNbjVpeUY0eEJOTXMxUDBRRU9WN281Z2FXR3V6U2VMdWU0dHQzcm83eTRUZ200Ry9tb3BkWmdsNnEwbzZLekpXRTNtTWtzTnIzcithNkNiVDhnNXdaTnpUOU83ZmkvenBhT21uejNCUm9xb3MrdHY5ek1iZHB4c3FEQk9FZXd0Skx0N2NnNXd0S0tidmxkcFN6UlJDRDQzVkZoZUNJN3laTHBwZ2dNVkJTL0tNQWRIT0RKdk93cTJOUVNiS0tLUExkRldRczdGcW8rbXBsMDFKWFlSZ3E4ZG5HTGhUaUZ6cW1Xc1VNZHBsbFpkYktseXZTZFl4aEk5WWdoT3R4UjhMZ1NMV0hLNjJtR0dWb3h6QkU4TE5XenFIOUNVZXNRekZ5NVJRelRjNTZtaGk2ZmdYRVd3cEtmRTVaN00wNVpnWlVQbW82YXVpdjhZS3pEWXdXQkxNRXJJYktISnZPd0lydkVkaE9CY1E5SmRVMU5IUTdDWG4yWElERkJLVTJXQWdjWDlVQVV6RFhXZDVhbHd1eUo0MVo5cmpLTENMNGFDcDRXYXJoUG0yckgrU2FIVVlFMDAxSkRaMlpBelhQamRNcFpXdkM5d21xSUIybExoUTAxRDVqTzA2aGdoV01uZGJNN3lSSk1zb0NqMXZZYm5GUVZyVzlqYWszT2xFSjNzLzk2K3AzM2RFUFJWNUd4aXFhR2pJdGhVVTZGRkVaeXFDYTVxSnJwQmR6U3c5NUlVbk9QSXJDVVVqUlpRRnJidzVQUjBSMXFpWXgzY2I2bnJXVU1yQm1taUJReFZIdFRldzVJQ1AvaXA2ZzRoZWQvQWtvYi8zMnd2QkhzSU9YODNjSThoR2VOZU5QQ0lrUG1YZThmUEt4ODRPTVNSTTFNVGRYU3dqQ1o0UzMwalZHaHZxVFJhay9PVmhnR2F6SHVPQ3VkNW9uRU8xbEpyNmVjVnlhT0s2SDd6cWxCbElhSEUwb3JvQ2dmdkdKSWRQY21mTE5HTGpwejdoWndaUXBVYkZNRTBBMWNJSmE3Vk5PUmtnZnNNQmF0Yktnd3dKTTliU3ZRWGVOT3ZiSWplbGc2V1d2bzVrdmJLYUpKTkhleGtLTkhMOXhSeUZsSDhUaTJyaUI1d1ZQaFVrN25Ha0pub0NlNDI4TFIvd1JHZFlJbG1XZWJDeXhvdTFyQ2s0Zy9TaHVnQkRYMFYwWlFXa2gwZE9Wc2Fna00weVY2T29MZDV5ZStwUmxzQ3IwbitLaVFyR3VxNXlKRHpyVEFYSHRMVU1kdVREQlZLclNtM2VITCs2aWp4aEZEWDlaNWdWVS93bGlIWVRNaU1GcEtMTk1FeXd1ODB3ZDNtZW9GbXQ2VmJSTVBlbmhyT2M2RFZlNHBnWFU4RG5uSGFrTE9JSXJsRjRGWlBJdzZSK3p4QlAwZHlxNk9PWjRRNXNMS0NjejA4NG9rK1ZzTU15UWhOWm1tQmdYNXhJWE9FSlRtaTdWc0dUdk1UTmRISGhwemRiRThEdTJvS3hndkJxUUtkRERuVEZPeWxDRmF4UjFzeXoyaXFyT0kvRkVwTmMzQzZmMTEvNytBU1M2bDJpbnEyY2lUckNDemd5ZW1yQ0w1U1ZQalFrZFBaVW1HeTJjOVN3OUZ0UjFzUzMwUm1zS1BDUzRya0lDLzJVME1kdXd1Y1lvbEdhUGpLRXloem1pUFlYYWd5V2JZejhMV0JEZHpSaW1BWHp4eDR6OEs5aHB6bGhMcStOaVE5N0h1S29yTVVmSy9PVnZDMkpmaUhVUENRSS9xN0oyZ2pLK3RURE54a0NjNFRNc3NxQ3M0VEd0TFZ3UWloeW9BV2dqOWJvc1U4MFhHVzZBYzlUSkd6aWFVaDUraG5GY0hPbmxhTTFpUm4yOU5hcUdFTlRUVFNVSENIMnRXVGVWMG9zVWhINnBzdVZMalJVbUdXaG02T1pFc2hHZU5vd0FCSGNKMkJweTJac3pSY0trUlhkMlF1S1ZFZVhuYmZhRXE4MjVGZ3VxZmdmRTJ3aGxDaFNSTWRyb24rTEFUVFBRMlozNjl0NEI5QzVncy95bHp2K0NNbWVwSURQY2xGUWwxM1cwcnNwUGQxSk9jYmdoR09FdXRxQ3Y1cWFjVVJRbDNkREt5dnlKbHFLWEdQZ2NNOUZmYXdKQU1WbWRjc3BjWUtPWmM0R2pEWWtGbEswNW9sTk1IeUhuNHpGTnlreU94dDk5UmtIbGZ3bWlIbzYwbDJFS0krbWhyZUVLcDA4MFRidWcwOEJWUGNnb3FDNXpXdCtOTERUWjdvTlNGNTFOMXFpZTdWYTN1Q0N3eVpia0lOZi9ORUQ2anpPc0JkWmpGTjhvcUczd3hWdW5xQ1NZWUtmM0VkaEp5ZjlZV0dmN3RSVTJvSDNWSGdQcjFmZTVKOWhPZ0hkN3hRMHk3cUJ3WHIyM2FHRXJQMGNtNjRKVmpad3NPR3FMK21oTmdabWhKTFcyb1k0VWhlZHN5Qmd6ckNLcnE3Qm1jcE5WaFI2akJQcTY0VmdpK2tuNlhFNjhwcDhKNS8rMHdSSEdPcHNLZW5RbjlEWm50UHpqUkxacERBZEQyZm5TZ2tHOXRtSVhuVXdRNldWaWdoczdZaTJNeFEwTjNDcVlhQ1hrSjBveU96dE1ESmptU1NwY3B2bHJrMFJNTU9qbUFyUTA0UFJWMURPMUZ3aENWYVVWUHBLVU0wM0pLNVN4UHNJV1J1OC9DR0hpOFVIQ2hpcUdGRFRiU1JKV2VZVUREY0g2dkpXVXhSNGsxRlhiTVV3VjZlNEFKRlhTOG9NcXNaS3F6dllROUREUWRaY2tZNGFHc0lodGx1YmJkMnIzajRRQk1vVGFtZFBaazdPL0JmNjJsYWNad25lTmpRb0djZFZVN3pKT2Q3Z2hzVUhPa29zYWdpYzZjbldjOCs0Z2cyODVSNnpaUDVzMS9MVWJDS0l6blR3SzM2UGtkd2xPcmw0VTFMd2ZkQ0NhK0lydkZrbWd3MVBDQVVYS1dvMHNVUlhXY0kybXVLSmxneUZ6aHluQ1k0UkJPc3FDam9JMVI1elJFY28wbjJWdDA5QlF0WVNpemdLTkhmVW1VclE1VU9DaDUxQkZjTG1ZN3VtaFlxWEtRb21Pb3A4YlVuV05OUWNJaUJjWWFDNnh6TU5PUzhKUVFmZXFLQm1tZ2xCKzk3b2svbGZrM3lnYUhTeVphQ1JUelJ4UW82R3pMZmEyaldCUGVwdytVbVQ3U1FFSnlpeVJraEJMTVZPZmNvTWpjSzBlWkNoZlVOekZBVXpDc0VONXZQL1gxdVAvbi9hb01YK0srbncvSGpyLzl4T283ajdQanU2MXRMY2d2SnBUV1hOYmZONWpMcGk2VmZDT3ZpVGt0S2xGdXNRaXhkRUtXbUVCVUtOYUlwalpSU1NPWFNnemFhS0xkYWJybTEvOW5aKy9mK3ZkL3Z6L3Y5K1h5K3paN1BSb3JZb1pxeUxyQ3dRZEVBaXh4Vk9FWE5ObmpYMm5VU1Jsa3FHbVdvd2s4bHhSNTBKUHk5Qm82cUpYYVh3TnZSRUJ2blRoUEVQcmV3cnlMaGNBbmo1V0UxNUZxaThXN1Ixc0F1RXU4NlM0RU5pa0l0Rk40eGt2OUFmNG5YU25VVmNMaUE5eHplc0ZwaXZSUlZlRkt0c01SYUtCaHVTYmpPRUxuQVV0bFNRVXBYZ2RmQjRaMW9TYm5GRWV0YlEwSXJBZStZK3BxbkRjRUpGajZTOExEWnpaSHdZNGUzWE9OTmxBUnJhb21ORXQyYmt2R3Nvc0EzaW95SG0rNmpDTWJJNTl3cXQ0ZWVhcmEyOEl6RW15UGdvUmFVT0VEaFRWZEVKaG1Db1RXZkMwcDhhTmtDcDBvWXFpaDJpcUdpNHlYZU1rT3NuNExkTExubUtmaC9Zb2dqTnNQZWJlRkdSNG05QkpITHpCNjFYUTNCdHBJU2ZTMkZ1Z3NLOUZBdExXWDFkQ1JjckNuVXA0NENOenVDb3dVWm14U1JnWWFFNlphMFcydS9FN0NWWENpSS9VT1I4YUFtMStPU3lFM21PVWN3eWMxekJCZW9YMWtpS3kwWmZ4Y2sxR3N5dWx0aTExaTgzUVRCRjVLZzNwRFFUaEZNVkhpUFNsSyswY1NlZG5nL1ZhUzhiT1pidHNCY1RjWkFSOEpQNUtlcVExT1lLQWkyMG5qZE5OUnBnbnNVLy9LK0puYVhKYUdUb21yN2FZSXBob1JuOWFlU2hKV0tFcTlMY296U0Y3UWxlRWZESTVMWW01YmdWa0ZrUndWREJDVnUwRERJa0d1cG84VFpCcSsvcE1RVVJZRXJKUW1QS0dLak5Ea1dPTHg3SmQ1UWl6ZFV3ZUlhS3JsUDdTd0pEaFp2T05qTGtPc0JCWDlVcEd4bnlkaFhrZkJMUThJeGdvalFiTEZuSmY4MUp5dFNsamNsWVl5RUZ5eDBrVkJ2S1dPRkptT05wc2hHQWNzZHVRWTVnaVZOQ1Y1MWVPZEpZby9wTGhidk0wdURIU2V2TktSY3JLWklxbkN0SmVFc085NVJvcWNnR0s0b2NaY2hvMXRUWXRjWnZINDFwTlE3dkEwV3JoSWZPU3JhSUludElBaStOWFdDRXJkYmt2cld3alJMcnQwTktVZEw2S1NPc2NUT2RNU09VdEJId0w2T0xBMHZOU2R5bmFXUUVuQ3BJdkthSXJKSkVidkhrbXVOaG42T2pNOFZrU0dTcW4xdVlKQ0dIbnE5STNhTGhOTUUzdDZHaklrTzd4ck5GdW1weVROWC9OcndYN0NySVJpcXFXaWpJOUpPNGQxaWlleWt5Zmlwb3NRSVE4WWpqc2psQmg2b0hXYndSamdZSlFuMk5nU25OeWNtSkFrM05pWGh4NDRTeHlraWh4bTh5YlV3VDFPVkt5U2M3dmkzT1hWa2RCSjRBeVhCZWtzRFhHMEloZ3RZWTBsWTVhaENEMGVoYm9ySWs1YVVXUkp2aU1BN1h0NWt5UmpvbnJYRU5rbTh5WXFnczhWemdySm1DbEsyMHVNTTNqUkowRmlRSUNRRjloZEVUbExRV1JJYjVraTZXRGZXUlBvYnZPNmE0R1A1bWNPck56REZFTHRUa09OTGg5ZFhFOHh5cEVnN3o4QTlqa2hyUTZGaGpsZy9RVmt0Slh4dDRXWHpULzAzUThJYVFXU3FJdUV2bG9RMm1xQzlKZmk3d1J1bDRSWDNwU1BsenBvVmxtQ3RJMmp2S0hDRmhqY00zc042bHFGNkh4bktlbExqWFdid3JwUjR4enVDclRVWngycXE5b0FoOHA2aXhDVUdyNzhnOG95alJBdEI1Q1pGd2k4MFZlclZwSTBoK0llQnhhNlpnNmtXdnBESGFpb1lZdUVzUmJEQzNlT21DMkp2R1lMZWlveEdrbkwyVUFUTkpONmhtdGoxRGxwTHZEVm1vY1lickdDVkpLT3JnNFg2RGdkZExBMjAzQktNRm5nZEpKRnRGZDd2SkxtNktFcGM1eWpRcmtrN004MFNHZTM0WDI0blNleDFSYTVPbWdiNzFKS3lnOFNyVTNpL2tBUkt3V3BIMGtPR2hLa09ieWZkMFpHanZ5WGxBa1ZaNHhSYllKMmlyRk1rRlkxU3d5V3hyMm9vNHpsTmlWKzd6bWF3ZUZwVDRrUjNrYURBRlc2eHBTcXpKYXkwNUZ0WVI0SG1aaGM5VXhLYmJmRjJWOFJHMU1CbVNhRStrbUM2Sm5hUlhLOWdzaVhoSkhsL1UwcU0wV1RjYnlod2tZSXZGR3dqU2JqZndoaUp0OFpTUVUrQmQ1K21hclBNT2tWa0QwbXV4WUxJZkV1aGg2MHgvSjkyaXRndWloSlNFTXlTVlBRblRld25FbSs2MjByVFFFTXNPZm80L2tQLzBBUnZXaml0bHBTWDdHeEJnY01Fc2QzRUVlWVd2ZHl0ZCtTYWF3aTZhQ0lqMUNrR2I2QWo5cndoeDE2Q2YzdkF3Rnk1cHlMaFZvblh6eTUxRkRwZEVibGJrZEpiVWNFUERFRnpROHFObWh6ekxUbW1LV0tiRkNYZUV1UmFicDZyeGJ2QXRMRjQ0MlFqUSt3RUE5ZUwxeFNSN1EwSlh6bFNIako0ZXhxODl5UjBsYVNjSi9GVzZ6NGE3M3BGTUVmRGlSWnZ1dmlqSXQ4NlJhU0ZPbDAxcmlWMm1EMVVFdnhHay9HZWc1YVd3R2tpMXpnS1BHOUoyVThQRWc4cVl2TXNaZXl0aVRSWEJNc2xDVThKU2x4aThFYWJqd1VsZGxETkxmelRVbUNneFdzanFXQ09IYXZZQXFza25LRklPMHlRNjFWTDVBVkZ4azZXaEVhQ0FrZEpndDlhU2t6WGxLTlgyakVhNzl3YVl1YzdncTBOM0dESkdDQmhvaVRYVUVQc2RrbkNVRTFDSzBmd3NpYXlsU0YydWlEeU80WFgzcEZoTmQ3UjRpdEZHYzBrL0VsQlp3V3ZxK0dDNnN6VmVFb1MvTVorcXlsd3BLTkt2OVo0NjlVT2pxQ2p3bHVzaWN5VHhHNlZwTnhjUThJbmNvUjRSaExiUitOZHBHR21KV09jSXpKR1V1S1BHcFFnOHJyRzIxZE9NcVFzc0pRNFJ4SDVqYVVxblp1UTBGNFErY2p4THdQdHBaYklBazNRVEpIUVdCRTVTMUJva29WdERkNmxocXI5VXBIU1V4TWNJWWw5cG9qc2I4aDRTQk9zTVFjcXZPV0MyRThFVmVocWlKMWhyckFFYlF4ZUswTkdaMEdrcStndVNSZ25pTTIzYklIVmtxd3g0aGlIZDdzbWFPeWdseUl5UXVNOTc4ajRWUzA4Si9BMkcxS2VNQlJvNGZCYVNOaEtVRVpmUWV3VlEvQzFJK01nZmJFbGVFekNVdzdtS1hJME0zaGQxRUVTVmppOHg1dVE0MW54czFxNFJNSkNDWHM3SXE5YWNweG4yMm9TRG5RL3NKVHhzQ2JISVlaaUx5aFkwNVRZMFpMSU9RckdhU0pERE40dDhwVmFJcnNxcUZkRWVndGl6YzFpVGV3NVE0YXlCRE1Vc1FNa1hvY2FZa2MwaFp1YTQxMnNpWjFyU1hsUjQ2MHpSSjVTbEhHZTVqODAxUkxNbEpUeHRhT00zUTFwdnhKNDV6VWxXRkQ3cnNBYnBmRW0xSkh4RzBlaDh3MlI3UVFWekJVdzI4RmhGcDVRWnpxOHQycngyam9xdWxZVFdTdUpkVFlmV3dxTUZNY292Rm1TeUpQTnlMaEU0RTEwcEh6WWpPQzNodUFyUmE1NzFac0dhalFwUXgzOFNCUDVweVpCNmxNVTNraERucDBNQlY1MUJFOW8yRStUWTVNbDJFOFM3QzBvNncxeHZDWmpmMEhrVkVIQ3pGb3lObXFDKzl3ZGNxTitUcDdqU0RoZUU5d3M4WTVWME5KQ24yYmsydHFTWTRva2RyRWh4MWlETjhjU3Vkd2VwV21BR1hLY0pYSzY1SDl0bzhqWVFSSDdTQkYwMUVTVUpkZDBUYXlWSW5hV2hMa09qbFhFNWlyS0dPbkk2R1NXR0NKYTQ4MnpCSTlyQ3IwanlUVmNFdXpyaUMxdmNyNm13RkdTaXF5NXpNd3hCSC9USkh3alNQaEw4KzAxa2FhU1V1TUZLVGNMRXZhVWVQY3JTbXduOERacmdpa1diN0NHUHhrU2poUXdyUms1N3RjdG14THNiOXNadkw5TFNseXVTTGxXa3FPandkdW84YjZVdjFEa211ZEllRkYyZEhDZ3hWdGs4ZHBJdkhwQnhoRU9kaEtrN09MSVVTZEorY1NSWTU3QiswRGdHVVVsTmZwdGhUZkdrYXV6eHJ2VHNVVWFDVmhsS2V0ZVRYQ29KRENhMk5PS2hPbUM0RzFIOEpCZDRPQlpSZVNSR2txY2IvQ08xUHlMSlRMQjRqMXE4SllhSXV0RWpTTFg4WUtNK2E2cGhkTXNkTEZVb1Y1UlRtOUpTa3VETjhXY0lvbjBOWk1OWldoMXE4QzdTSkV3VjVIeHJtbm5UcmYzS29KQmxtQ1lJMmlsU0xsZkV2bEU0MDExTk5namd0aHpFdWEwb0tLN0pMRTdIWkhsRWw2MEJMTVZGZXdnNEVXTnQwVGhyVk5FVmtraVR3cEtYU1dKemRSRU5ndktHcTRJaGpzaWV6Z1NGdHNmQ1VxOHFraTVTMUxSUWVZUVE0bmVtbUNrSW1XTXczdEZVb1VCWms0Tk9lWllFcDRYUktUR2E2d0pqcldOSEJWSlI0bTNGQ25idUQ2YWFrMldzTVRoM1NaSW1HQ0lQS05nc0RwVnduc2E3MEszMWxDRkpaWWN3d1NNRmNRdWxHVHNadUVhU2RCWGtQR1podTBGc2RVTzczUkhqcThNUEdHSWZhR0liVlRrNml1STNHRmd1Y0hySVFrbVdTSmRCZDdCQnUrdU9yeVdBaFk3K0xraTlySzV3dEVReld3dnRicUdoSU1Gd1dSSnNFbHNZNG05SUlnOUw2bENYMFZrbGFQQVlrZmtaRUdEbk9Xb3dsQkpqdE1Va2NHSzRMZzZFdG9aSW5NVUJWWUxnbjBVc2RtQ3lDejdnSUdIRmZrK2sxUXdUaDVXZTdBOXgrSWRKNkN2SWtFYWdtczBoUjUwZUg5VW5UUUorMm9pS3lWbExGVUUrOGdCR3U4TVEzQ3BwVUhlc25qVEhONFFCL1VHUGhDVEhMRlBITUZyQ3FhNzNncU9iVUpHYTAzd2diaEhrckNmcEVwek5MRTdKRFMyNUZNS2hsaEtLV0tmQ2dxc3RMQ1B1MXpCWHkwSjJ6dHdqdGl4QnU4VVRSbjlMVnRrbUNOMml5Rmh0TUU3MEpIUlExS1ZaWHFLSS9LTklLWU1DWXMxR1VNRUtiTTFiS09JOUxEWEM3emJIUytidCsxTVRXUzlvZEE5RHRyWXRwYkltUUoyVkhoL2xpc0V3YUhxVWsxa2pLVEFLa25rQkVYa2JrZE1Hd3EwZG5oekxKRjNOSkgzSlZ3cnFPQjRTY2EyaHRpNzVubUpOMFd6eFM2VXhEWW9FcHhwYTRodFZsUmprWUU3RFpHekpWVTcydUM5SXloUUw0aThZZkdXU1lMTE5jSFhsb3l6N1FoTmlmbUtTRTlKZ2ZHbXV5TGhjNDAzWG05dnFjcDZnWGUzeHV1djhGNlZKTnhreVRIRWtIRzJnMGFLWEwwTXNYYzFiR2ZnYXMyLy9kQ09OWGlOTENYKzVtQjdlWklsMWtIaDdhandwaWt5emxVVVdPVk9zalNRbHNTK00wUitwUGplL2R6QlhSWkdPMHJNdGdRckxMRzlWU3U5bjZDTVhTM0Jod1ltU29JQmhzak5CbVpiZ3VzRTlCQ1BDUDV0cmlVNFZoTmJKZkUrc3dTUDI3YWF5RTh0dVRwWVlqdHJZak1WR1pkcDJOcFMxczZhQm5LU0hEc2JLdXBsS2JITTRhMHdNRmQvNS9EbUd5S3JKU1VhVzRJQnJxVWh4MHZ5ZnpUQkJMUElVY25aZHJBa05zS1Iwc1dSc3B1bVNuczZDaDB2L3FxSWJCWVVXS3ZQVS9DRm95ckRKR3dTTkZoYkEvTWx6S3Fqck84MGhSYnBLeDBKZXdzaS9TVGZ0d0dTbEtjMUpaeUF6eDA1ZGhMRWRuZlF2aFpPcWlIV1dFQUhDNyszMEZ1UmNaVWdhTzVncGFJSyt4c2lIUlVzcWFQRWxUVjQweFFaUTEwN1E5QlpFMW5yeURWR1U5WlNRNDdibWhCcExjWXBVdDdTK3h1Sy9GaVQ4cUtqd1hZdzV5cFMyaXVDdjdxMWd0Z2podUJ1QjhMQ0ZZNWNVdUNOdHNRT0ZjVCs0SWg5SlgrazhFYTZ2MGlDSVJaT3RDVDBFdDAwSlc1VWVDODVDZzBTY0swazQxMUhjRzF6S3RyZTNTZUlUQlJrN1dmd0RoRXZhWUxUSFA5bGUwbThCeTBKRHduNFRsTFcvYUpPdkdIeGRqWVVlcytTY1ppZ0NrWVFkTmRFT2hraWV6Z1NocWt4OHVlS2pJOGxEZksyb05pT0Z2clpIMWhTK3RrN05WN25PbUxIaWNHV0VndWJrWEtkd2R0WmtuQ0xKWGFDcGtyalpCdExaRnNEUDlDZHhXc1NyMDVTeGw2Q01tb0ZiQ09ncnlYNDB1RHRhbUI3U1ZtWFc0SWhsZ3BtcSswMHRCS1VVYTgzV2JqTFVOa3pEbVk3Y293MUpEeWd5UEdsaGdHS1lLejR2Y1Y3UUJOYkpJZ00xMVRVcVphTWR3VGVTZ3VINnJPYXcxSlJLemFhR3l4Vm0yRUovdUNJclZXVWNaVWtjcDJnck1zRWpLK0RNd1M1OWpRazNLZDZTRXExZDBTNnVWbU80QmMxbERYVFVjSGpsdUNYRXErMU9sQkRqMXBpOXpnaVh4bkt1RTBTcVRYd2hxYkVUVzZSZ2dNRW5HbC9xNDlVVDJpQ3pnSnZSd1ZYUzJLL2Q2K1preVVsN2phd1NWTGl0NDZFd3hWbGpEWndvU1EyMHNEQmloenRIZmsyeUE4TlZaZ2hpWHdyWUhRZGZLQU90enNheWpoWTliWTB5RTJDV0VlSjl4ZnpPNDIzeGhMNXN5UzJURkpvZk8ycGJvSG9iMG5ZNEdpQWdScnZHUUVEYS9GV1Nzb2FhWWwwc3lSc0V0M2tXb0gzQjAxc2hDWGhUVVdlOXczQnQ0NFNDOVFDaDNlU2hRY3R3YmFLMkFwTHJvR0NNbFpyWXF2bFkzcVloTTBhWHBGa1BPdW9xSjNEbTZmeFhyR3dWRjlnQ1daYWdqUHF6bmZrdU1LUThEUFRRUk84WnFHMWhQR0tFbTlJZ3BHVzREWkRnVE5yaVR4dkZpcStMeiswY0tmcDR3ajZPQ0s5SlNuek5TbjlMRlU3VWhLWlpNbll3Y0o4czh5UnNFQ1NjSzRqNVVPQjk1SEZPMEN6aFk0eEp4dUNpeDBsRGxFVWVNZFM2RVpCa1RzVWtaNEs3NGR1Z3lUWFM3YU5nTDhhcWpEZmtDRTBaYndrQ1hwYVdDS2hsOFA3VkQ1anh5a2l2U3l4eVpyWUVSYmUxNjhMWXU5WlloODZJa3NjZ1ZMRTd0V1BLbUp2MTFDZ295Smx0TUVicm9odFZBUWZPNEltbHRpSEVyb1lFczdSeEFhclZwWThBd1hNY01SZUZPVFlXZTVpaUxSUXhKNVE4RHRKOExRaFdPaEllRkVTUEdzSUxoYk5EUmxqTmJIek5SbFRGYmsyUzNMME5PUzZWMUtGSllLVWJTVGNJSWhNMHdRL3MyVE0wU1JNTmNRbVNhcDNqQ0g0eWhKWktTa3d5UkhwWVlnc0ZlUTRVN3hvQ0I3VlZPRXhoWGVwbzlBQkJzWWJ2R1dLWFBNRTNseUg5NVlpb1owZ3NzUVJXV2JJK0ZhU01rWGlqWlh3Z2lUbFlkUGRrTkxhRVR4bHlEVkl3cWVhRXVzMGFUY1ljZzBSVk9rcFIzQ1NKcUlkZEsrOTBKQ3h6c0RWbG95ckZkNVpBcjRUQktmYVdhNmJvRUE3QzdzNkVwWWFlRlBqdmVvb1k3Mm1qSWNjTEhKOUhVd1ZsRGhLa211dEpESkJ3bnAxcnZ1bEpaZ2dLRFJmYlhBa3ZDLzRsM296UU9HOWE4bHhqeDBpN25WNGpTWGM3dmhlM093SXhqZ1NIamRFaGhzaWY5WWtQR2x1czNpTEZEbldPRmh0Q1piSmcwVWJRY0lhUjY3Smp0aG9DeU1FWlJ3aGlYV3l4TzVReEk2dzVOaFQ0VTFXc0p2RE82MEozNGZXOWh3endsS2lqNlpBVzluZTRMMHM4QzZYZUJNRWtkL0xReTFWdWNCUm90NlFNbGJpdmFCaG9CZ2pxR2lDSk5oc3FWcC9TMlNzRzZESU9OQ1IwZFhodldiSitNUlJaSmtrdUVqZ0RYSmpGUVc2U1NMN0dYSzhaMkNaZzdjVnNiV0dvS21FcHpRNWVscGl5OFJ5ZzdkTWtMTFVFYXV6ZU84NkN1d2xTT2xnWUxvalpXZUo5eE0zUzFQV2ZFZktsNUlTTFEwTUVLUjhZT0IyUWZDeEpCanJLUENONGY5TWthU3Nxb1ZYSkJtUDdFcEZaOVVRZk9vT0Z3U3pCTjRNUThMc0dyeW1saXBjSlFobXkwR2FRalBxQ0hhWFJ3dUNad1JicUsyRmc5d2xDbFpxWWljcklnTWRaZnhUUTBjN1RCSWJyQ2h4bXV6b0tHOFhSYVNySWhoaXlORkprckM3b0lBV01FT1FhNWFCZWtQQ1JrbkNvNElLUHJZa3ZDREk4YVltWTdXRnRwcmdla2NKWjNvTElxc3NDU010RmJRVEpLd1hZeTNCWTVvQ2gyaUtQQ3BKT0UrelJkcFlnaTZPMkttT0FndlZDWWFVNHlTUmVrMXNneUZoSjQwM1FGSGlWRW1KSHd0eWJPMWdzOEhyNStCRVRRWDNXYXIwcVpuZ1lHZ3RWWnRvcWQ2dkZTay9Vd2RaRWxZcXlqckY0SFhVZUZzcElpOUlHS2Y0ajkycEtHQWRDWU1Wc2JjVjNrUkYwTitSOExVZDVQQ3NJR1dveER0QmtDSTBuS29mZEpReFQrTHRaZmx2dWM4UTNDandXa3E4S3dVcEh6a0svTm1Tc2NsQ0wwbnNlUWRqNUZSSDVDTkhTZ3RMaVc4ME9mNUhVOUhobHNnYTlibkJxM2ZFVmx0S2ZPNUlhU1RtR2pqYzRKMG90Y1A3UXNKVVNRTThwRWo1L3dDdVV1QzJEV3o4QUFBQUFFbEZUa1N1UW1DQyIpOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/twilight.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtdHdpbGlnaHQuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMxNDE0MTQ7IGNvbG9yOiAjZjdmN2Y3OyB9IC8qKi8KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMzIzMjMyICFpbXBvcnRhbnQ7IH0gLyoqLwoKLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVycyB7IGJhY2tncm91bmQ6ICMyMjI7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNhYWE7IH0KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjYWFhOyB9Ci5jbS1zLXR3aWxpZ2h0IC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgd2hpdGUgIWltcG9ydGFudDsgfQoKLmNtLXMtdHdpbGlnaHQgLmNtLWtleXdvcmQgeyAgY29sb3I6ICNmOWVlOTg7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tYXRvbSB7IGNvbG9yOiAjRkMwOyB9Ci5jbS1zLXR3aWxpZ2h0IC5jbS1udW1iZXIgeyBjb2xvcjogICNjYTc4NDE7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tZGVmIHsgY29sb3I6ICM4REE2Q0U7IH0KLmNtLXMtdHdpbGlnaHQgc3Bhbi5jbS12YXJpYWJsZS0yLCAuY20tcy10d2lsaWdodCBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjNjA3MzkyOyB9IC8qKi8KLmNtLXMtdHdpbGlnaHQgc3Bhbi5jbS12YXJpYWJsZS0zLCAuY20tcy10d2lsaWdodCBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjNjA3MzkyOyB9IC8qKi8KLmNtLXMtdHdpbGlnaHQgLmNtLW9wZXJhdG9yIHsgY29sb3I6ICNjZGE4Njk7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tY29tbWVudCB7IGNvbG9yOiM3Nzc7IGZvbnQtc3R5bGU6aXRhbGljOyBmb250LXdlaWdodDpub3JtYWw7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tc3RyaW5nIHsgY29sb3I6IzhmOWQ2YTsgZm9udC1zdHlsZTppdGFsaWM7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tc3RyaW5nLTIgeyBjb2xvcjojYmQ2YjE4IH0gLyo/Ki8KLmNtLXMtdHdpbGlnaHQgLmNtLW1ldGEgeyBiYWNrZ3JvdW5kLWNvbG9yOiMxNDE0MTQ7IGNvbG9yOiNmN2Y3Zjc7IH0gLyo/Ki8KLmNtLXMtdHdpbGlnaHQgLmNtLWVycm9yIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJlZDsgfQouY20tcy10d2lsaWdodCAuY20tYnVpbHRpbiB7IGNvbG9yOiAjY2RhODY5OyB9IC8qPyovCi5jbS1zLXR3aWxpZ2h0IC5jbS10YWcgeyBjb2xvcjogIzk5NzY0MzsgfSAvKiovCi5jbS1zLXR3aWxpZ2h0IC5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI2Q2YmI2ZDsgfSAvKj8qLwouY20tcy10d2lsaWdodCAuY20taGVhZGVyIHsgY29sb3I6ICNGRjY0MDA7IH0KLmNtLXMtdHdpbGlnaHQgLmNtLWhyIHsgY29sb3I6ICNBRUFFQUU7IH0KLmNtLXMtdHdpbGlnaHQgLmNtLWxpbmsgeyAgIGNvbG9yOiNhZDkzNjE7IGZvbnQtc3R5bGU6aXRhbGljOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgfSAvKiovCgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/vibrant-ink.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGFrZW4gZnJvbSB0aGUgcG9wdWxhciBWaXN1YWwgU3R1ZGlvIFZpYnJhbnQgSW5rIFNjaGVtYSAqLwoKLmNtLXMtdmlicmFudC1pbmsuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6IGJsYWNrOyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtdmlicmFudC1pbmsgLkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMzU0OTNjICFpbXBvcnRhbnQ7IH0KCi5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMDAyMjQwOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYWFhOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogI2QwZDBkMDsgfQouY20tcy12aWJyYW50LWluayAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlICFpbXBvcnRhbnQ7IH0KCi5jbS1zLXZpYnJhbnQtaW5rIC5jbS1rZXl3b3JkIHsgIGNvbG9yOiAjQ0M3ODMyOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1hdG9tIHsgY29sb3I6ICNGQzA7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLW51bWJlciB7IGNvbG9yOiAgI0ZGRUU5ODsgfQouY20tcy12aWJyYW50LWluayAuY20tZGVmIHsgY29sb3I6ICM4REE2Q0U7IH0KLmNtLXMtdmlicmFudC1pbmsgc3Bhbi5jbS12YXJpYWJsZS0yLCAuY20tcy1jb2JhbHQgc3Bhbi5jbS10YWcgeyBjb2xvcjogI0ZGQzY2RCB9Ci5jbS1zLXZpYnJhbnQtaW5rIHNwYW4uY20tdmFyaWFibGUtMywgLmNtLXMtY29iYWx0IHNwYW4uY20tZGVmIHsgY29sb3I6ICNGRkM2NkQgfQouY20tcy12aWJyYW50LWluayAuY20tb3BlcmF0b3IgeyBjb2xvcjogIzg4ODsgfQouY20tcy12aWJyYW50LWluayAuY20tY29tbWVudCB7IGNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsgfQouY20tcy12aWJyYW50LWluayAuY20tc3RyaW5nIHsgY29sb3I6ICAjQTVDMjVDIH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLXN0cmluZy0yIHsgY29sb3I6IHJlZCB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1tZXRhIHsgY29sb3I6ICNEOEZBM0M7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLWVycm9yIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJlZDsgfQouY20tcy12aWJyYW50LWluayAuY20tYnVpbHRpbiB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS10YWcgeyBjb2xvcjogIzhEQTZDRTsgfQouY20tcy12aWJyYW50LWluayAuY20tYXR0cmlidXRlIHsgY29sb3I6ICM4REE2Q0U7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLWhlYWRlciB7IGNvbG9yOiAjRkY2NDAwOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1ociB7IGNvbG9yOiAjQUVBRUFFOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1saW5rIHsgY29sb3I6IGJsdWU7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror3/theme/xq-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChDKSAyMDExIGJ5IE1hcmtMb2dpYyBDb3Jwb3JhdGlvbgpBdXRob3I6IE1pa2UgQnJldm9vcnQgPG1pa2VAYnJldm9vcnQuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KKi8KLmNtLXMteHEtZGFyay5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzBhMDAxZjsgY29sb3I6ICNmOGY4Zjg7IH0KLmNtLXMteHEtZGFyayBzcGFuLkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjYThmICFpbXBvcnRhbnQ7IH0KLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzBhMDAxZjsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy14cS1kYXJrIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogI2Y4ZjhmODsgfQouY20tcy14cS1kYXJrIC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgd2hpdGUgIWltcG9ydGFudDsgfQoKLmNtLXMteHEtZGFyayBzcGFuLmNtLWtleXdvcmQge2NvbG9yOiAjRkZCRDQwO30KLmNtLXMteHEtZGFyayBzcGFuLmNtLWF0b20ge2NvbG9yOiAjNkM4Q0Q1O30KLmNtLXMteHEtZGFyayBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICMxNjQ7fQouY20tcy14cS1kYXJrIHNwYW4uY20tZGVmIHtjb2xvcjogI0ZGRjsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6ICNGRkY7fQouY20tcy14cS1kYXJrIHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICNFRUU7fQouY20tcy14cS1kYXJrIHNwYW4uY20tdmFyaWFibGUtMyB7Y29sb3I6ICNEREQ7fQouY20tcy14cS1kYXJrIHNwYW4uY20tcHJvcGVydHkge30KLmNtLXMteHEtZGFyayBzcGFuLmNtLW9wZXJhdG9yIHt9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogZ3JheTt9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1zdHJpbmcge2NvbG9yOiAjOUZFRTAwO30KLmNtLXMteHEtZGFyayBzcGFuLmNtLW1ldGEge2NvbG9yOiB5ZWxsb3c7fQouY20tcy14cS1kYXJrIHNwYW4uY20tZXJyb3Ige2NvbG9yOiAjZjAwO30KLmNtLXMteHEtZGFyayBzcGFuLmNtLXF1YWxpZmllciB7Y29sb3I6ICNGRkY3MDA7fQouY20tcy14cS1kYXJrIHNwYW4uY20tYnVpbHRpbiB7Y29sb3I6ICMzMGE7fQouY20tcy14cS1kYXJrIHNwYW4uY20tYnJhY2tldCB7Y29sb3I6ICNjYzc7fQouY20tcy14cS1kYXJrIHNwYW4uY20tdGFnIHtjb2xvcjogI0ZGQkQ0MDt9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjRkZGNzAwO30K]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbImZyaWVuZGx5bmFtZSJdPSJDb2RlTWlycm9yIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IiOwoKJGxhbmdbInBvc3RpbnN0YWxsIl09IlRoZSBDb2RlTWlycm9yIG1vZHVsZSB3YXMgc3VjZXNzZnVsbHkgaW5zdGFsbGVkIjsKJGxhbmdbIm5lZWRwZXJtaXNzaW9uIl09IidZb3UgbmVlZCB0aGUgJyVzJyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4iOwoKJGxhbmdbInNldHRpbmdzdGFiIl09IlNldHRpbmdzIjsKJGxhbmdbInNhdmVzZXR0aW5ncyJdPSJTYXZlIHNldHRpbmdzIjsKJGxhbmdbInNldHRpbmdzc2F2ZWQiXT0iU2V0dGluZ3Mgc2F2ZWQiOwoKJGxhbmdbImh0bWx0ZXN0Il09IkhUTUwgc3ludGF4IHRlc3QiOwokbGFuZ1siY3NzdGVzdCJdPSJDU1Mgc3ludGF4IHRlc3QiOwokbGFuZ1sicGhwdGVzdCJdPSJQSFAgc3ludGF4IHRlc3QiOwokbGFuZ1sianN0ZXN0Il09IkphdmFTY3JpcHQgc3ludGF4IHRlc3QiOwovLyRsYW5nWyJleGFtcGxlc3ludGF4Il09IlN5bnRheCB0byB0ZXN0IHdpdGgiOwovLyRsYW5nWyJjaGFuZ2UiXT0iQ2hhbmdlLi4uIjsKCiRsYW5nWyJzaG93bGluZW51bWJlcnMiXT0iU2hvdyBsaW5lbnVtYmVycyI7CiRsYW5nWyJhbGxvd2Z1bGxzY3JlZW4iXT0iQWxsb3cgZnVsbHNjcmVlbiBtb2RlIChGMTEpIjsKCi8vJGxhbmdbInRleHR3cmFwcGluZyJdPSJXcmFwIGxvbmcgbGluZXMiOwokbGFuZ1siYXV0b21hdGNocGFyZW5zIl09IkF1dG9tYXRjaCBwYXJlbnRoZXNpcyI7CiRsYW5nWyJ0YWJoYW5kbGluZyJdPSJIb3cgdG8gaGFuZGxlIHByZXNzaW5nIHRoZSBUQUIga2V5IjsKJGxhbmdbInRhYmRlZmF1bHQiXT0iTGV0IHRoZSBicm93c2VyIGRlY2lkZSI7CiRsYW5nWyJ0YWJpbmRlbnQiXT0iRG8gaW5kZW50YXRpb24iOwokbGFuZ1sidGFic3BhY2VzIl09Ikluc2VydCBzcGFjZXMiOwokbGFuZ1sidGFic2hpZnQiXT0iU2hpZnQgdG8gdGhlIHJpZ2h0LCBzaGlmdC1UQUIgc2hpZnRzIHRvIGxlZnQiOwokbGFuZ1sidGFic2l6ZSJdPSJTaXplIG9mIHRhYnMiOwoKJGxhbmdbImNzc2FkZGl0aW9ucyJdPSJBZGRpdGlvbnMgdG8gdGhlIENvZGVNaXJyb3ItY3NzLiI7CgokbGFuZ1sidGhlbWUiXT0iVGhlbWUiOwoKCgokbGFuZ1siaGVscCJdPSI8c3Ryb25nPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L3N0cm9uZz4KPGJyLz4KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLgpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQo8YnIvPjxici8+CjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPgpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4Kc2VsZWN0IENvZGVNaXJyb3IgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuIjsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/da_DK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgLSBlbiBzeW50YWtzLWZyZW1oJmFlbGlnO3ZlbmRlIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3IgbW9kdWxldCBibGV2IGtvcnJla3QgaW5zdGFsbGVyZXQnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtZb3UgbmVlZCB0aGUgJiMwMzk7JXMmIzAzOTsgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoYXQgZnVuY3Rpb24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnSW5kc3RpbGxpbmdlcic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdHZW0gaW5kc3RpbGxpbmdlcic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5kc3RpbGxpbmdlcm5lIGJsZXYgZ2VtdCc7CiRsYW5nWydodG1sdGVzdCddID0gJ0hUTUwgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ3BocHRlc3QnXSA9ICdQSFAgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2pzdGVzdCddID0gJ0phdmFTY3JpcHQgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YWtzIGRlciBza2FsIHRlc3RlcyBtZWQnOwokbGFuZ1snY2hhbmdlJ10gPSAnU2tpZnQuLi4nOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnVmlzIGxpbmllbnVtcmUnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnT21icnlkIGxhbmdlIGxpbmllcic7CiRsYW5nWydhdXRvbWF0Y2hwYXJlbnMnXSA9ICdWaXMgbWF0Y2hlbmRlIHBhcmVudGVzZXInOwokbGFuZ1sndGFiaGFuZGxpbmcnXSA9ICdIb3cgdG8gaGFuZGxlIHByZXNzaW5nIHRoZSBUQUIga2V5JzsKJGxhbmdbJ3RhYmRlZmF1bHQnXSA9ICdMZXQgdGhlIGJyb3dzZXIgZGVjaWRlJzsKJGxhbmdbJ3RhYmluZGVudCddID0gJ0RvIGluZGVudGF0aW9uJzsKJGxhbmdbJ3RhYnNwYWNlcyddID0gJ0luc2VydCBzcGFjZXMnOwokbGFuZ1sndGFic2hpZnQnXSA9ICdTaGlmdCB0byB0aGUgcmlnaHQsIHNoaWZ0LVRBQiBzaGlmdHMgdG8gbGVmdCc7CiRsYW5nWydjc3NhZGRpdGlvbnMnXSA9ICdUaWxmJm9zbGFzaDtqZWxzZXIgdGlsIENvZGVNaXJyb3ItY3NzLic7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5IdmFkIGcmb3NsYXNoO3IgZGV0dGUgbW9kdWw/PC9zdHJvbmc+DQo8YnIvPg0KQ29kZU1pcnJvci1tb2R1bGVzIGdpdmVyIGRpZyBtdWxpZ2hlZCBmb3IgYXQgcmVkaWdlcmUgaW5kaG9sZCwgc2thYmVsb25lciBvZyBzdHlsZXNoZWV0cyB2ZWQgaGomYWVsaWc7bHAgYWYgc3ludGFrcy1mcmVtaCZhZWxpZzt2ZW5kZSByZWRpZ2VyaW5nIGkgZGluIGJyb3dzZXIuDQo8YnIvPjxici8+DQo8c3Ryb25nPkh2b3JkYW4gYnJ1Z2VyIGplZyBkZXR0ZSBtb2R1bD88L3N0cm9uZz4NCkR1IGluc3RhbGxlcmVyIGRldCBvZyB2JmFlbGlnO2xnZXIgZGV0IGkgZGluZSBicnVnZXIgaW5kc3RpbGxpbmdlciBmb3IgYWRtaW5zaXRyYXRpb25lbi4gQmVtJmFlbGlnO3JrIGF0IGR1IGthbiB2JmFlbGlnO2xnZSBhdCBiZW55dHRlIGRldCBiJmFyaW5nO2RlIHNvbSBzeW50YWtzIGZyZW1oJmFlbGlnO3ZlciBvZyBXWVNJV1lHLic7CiRsYW5nWydxY2EnXSA9ICcxMjI5NjAxNzkwLTg1MjQzMTk3LTQzMjYwNzEzJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMzg5Njg0Mzk0LjEzMDExNDIxNDAuMTMwMTI1NDY5Ny4xMzAxNDM1MjU2LjMnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzAxMTQyMTQwLjEuMS51dG1jc3I9KGRpcmVjdCl8dXRtY2NuPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgLSBFZGl0b3IgbWl0IFN5bnRheGhlcnZvcmhlYnVuZyc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0RhcyBDb2RlTWlycm9yLU1vZHVsIHd1cmRlIGluc3RhbGxpZXJ0Lic7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ1NpZSBiZW4mb3VtbDt0aWdlbiBkaWUgJiMwMzk7JXMmIzAzOTstQmVyZWNodGlndW5nLCB1bSBkaWVzZSBGdW5rdGlvbiBhdXN6dWYmdXVtbDtocmVuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0VpbnN0ZWxsdW5nZW4nOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnRWluc3RlbGx1bmdlbiBzcGVpY2hlcm4nOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0VpbnN0ZWxsdW5nZW4gZ2VzcGVpY2hlcnQnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MLVN5bnRheC1UZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MtU3ludGF4LVRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUC1TeW50YXgtVGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0LVN5bnRheC1UZXN0JzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1plaWxlbm51bW1lcm4gYW56ZWlnZW4nOwokbGFuZ1snYWxsb3dmdWxsc2NyZWVuJ10gPSAnVm9sbGJpbGRtb2R1cyBlcmxhdWJlbiAoRjExKSc7CiRsYW5nWydhdXRvbWF0Y2hwYXJlbnMnXSA9ICdBdXRvbWF0aXNjaGUgS2xhbW1lci1Fcmtlbm51bmcnOwokbGFuZ1sndGFiaGFuZGxpbmcnXSA9ICdXYXMgc29sbCBiZWltIERyJnV1bWw7Y2tlbiBkZXIgVEFCLVRhc3RlIHBhc3NpZXJlbic7CiRsYW5nWyd0YWJkZWZhdWx0J10gPSAnQnJvd3NlciBlbnRzY2hlaWRlbiBsYXNzZW4nOwokbGFuZ1sndGFiaW5kZW50J10gPSAnRWluciZ1dW1sO2NrZW4nOwokbGFuZ1sndGFic3BhY2VzJ10gPSAnTGVlcnplaWNoZW4gZWluZiZ1dW1sO2dlbic7CiRsYW5nWyd0YWJzaGlmdCddID0gJ1NoaWZ0IG5hY2ggcmVjaHRzLCBTaGlmdC1UQUIgdmVyc2NoaWVidCBzaWNoIG5hY2ggbGlua3MnOwokbGFuZ1sndGFic2l6ZSddID0gJ0dyJm91bWw7JnN6bGlnO2UgZGVyIFJlZ2lzdGVya2FydGVuJzsKJGxhbmdbJ2Nzc2FkZGl0aW9ucyddID0gJ1p1cyZhdW1sO3R6ZSB6dXIgQ29kZU1pcnJvci1DU1MuJzsKJGxhbmdbJ3RoZW1lJ10gPSAnVGhlbWUgJzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2FzIG1hY2h0IGRpZXNlcyBNb2R1bD88L2gzPg0KPHA+RGFzIENvZGVNaXJyb3ItTW9kdWwgaXN0IGVpbiBFZGl0b3IgbWl0IFN5bnRheGhlcnZvcmhlYnVuZywgbWl0IGRlbSBTaWUgZGllIEluaGFsdGUsIGRpZSBUZW1wbGF0ZXMgdW5kIGRpZSBTdHlsZXNoZWV0cyBiZWFyYmVpdGVuIGsmb3VtbDtubmVuLiBEYXMgTW9kdWwga2FubiBzb3dvaGwgZGllIFdZU0lXWUctRWRpdG9yZW4gZXJzZXR6ZW4gYWxzIGF1Y2ggc2VwYXJhdCB6dW0gQmVhcmJlaXRlbiB2b24gVGVtcGxhdGVzIHVuZCBTdHlsZXNoZWV0cyB2ZXJ3ZW5kZXQgd2VyZGVuICh1bnRlcnN0JnV1bWw7dHp0IGFiIENNU01TLVZlcnNpb24gMS4xKS48L3A+DQo8aDM+V2llIHdpcmQgZXMgZWluZ2VzZXR6dD88L2gzPg0KPHA+SW5zdGFsbGllcmVuIFNpZSBkYXMgTW9kdWwgdW5kIGFrdGl2aWVyZW4gU2llIGVzIGFuc2NobGllJnN6bGlnO2VuZCBpbiBkZW4gYmVudXR6ZXJzcGV6aWZpc2NoZW4gRWluc3RlbGx1bmdlbi48L3A+DQo8cD5CZWFjaHRlbiBTaWUsIGRhc3MgU2llIGFiIENNU01TLVZlcnNpb24gMS4xIHVuZCBoJm91bWw7aGVyIENvZGVNaXJyb3Igc293b2hsIGFscyBXWVNJV1lHLUVkaXRvciBhbHMgYXVjaCBhbHMgRWRpdG9yIG1pdCBTeW50YXhoZXJ2b3JoZWJ1bmcgYXVzdyZhdW1sO2hsZW4gayZvdW1sO25uZW4uPC9wPic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjEyNDQyMzIzODEuMTMyNjgzMjc5NS4xMzI2ODMyNzk1LjEzMjY4MzI3OTUuMSc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMjY4MzI3OTUuMS4xLnV0bWNjbj0oZGlyZWN0KXx1dG1jc3I9KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/es_ES.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvciBkZSByZXNhbHRhZG8gZGUgc2ludGF4aXMgQ29kZU1pcnJvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0VsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgZnVlIHNhdGlzZmFjdG9yaWFtZW50ZSBpbnN0YWxhZG8nOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtTZSBuZWNlc2l0YSBlbCBwZXJtaXNvIGRlICYjMDM5OyVzJiMwMzk7IHBhcmEgcmVhbGl6YXIgZXN0YSBmdW5jaSZhbXA7b2FjdXRlO24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnQWp1c3Rlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXIgYWp1c3Rlcyc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnQWp1c3RlcyBndWFyZGFkb3MnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdQcnVlYmEgZGUgc2ludGF4aXMgSFRNTCc7CiRsYW5nWydjc3N0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIENTUyc7CiRsYW5nWydwaHB0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIFBIUCc7CiRsYW5nWydleGFtcGxlc3ludGF4J10gPSAnU3ludGF4aXMgdXNhZGEgcGFyYSBwcm9iYXInOwokbGFuZ1snY2hhbmdlJ10gPSAnQ2FtYmlhci4uLic7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdNb3N0YXIgZWwgbiZhbXA7dWFjdXRlO21lcm8gZGUgbCZhbXA7aWFjdXRlO25lYXMnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnQXV0by1hanVzdGFyIGxpbmVhcyBsYXJnYXMnOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+UXUmYW1wO2VhY3V0ZTsgaGFjZSBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KPGJyLz4NCkVsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgbGUgcGVybWl0ZSBlZGl0YXIgY29udGVuaWRvLCBwbGFudGlsbGFzIHkgaG9qYXMgZGUgZXN0aWxvIHVzYW5kbyB1biBlZGl0b3IgZGUgcmVzYWx0YWRvIGRlIHNpbnRheGlzIGRlbnRybyBkZSBzdSBuYXZlZ2Fkb3IuDQpFc3RlIHRhbWJpdSZhbXA7ZWFjdXRlO24gcHVlZGUgIHJlZW1wbGF6YXIgZWwgbSZhbXA7b2FjdXRlO2R1bG8gZGUgd3lzaXd5ZywgeSBhY3R1YXIgc29sbyBwYXJhIGVkaWNpJmFtcDtvYWN1dGU7biBkZSBwbGFudGlsbGFzL2hvamFzIGRlIGVzdGlsbyB0ZW1wbGF0ZS9zdHlsZXNoZWV0ICAoc29sbyBzb3BvcnRhZG8gZW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+QyZhbXA7b2FjdXRlO21vIHVzbyBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KVXN0ZWQgc2ltcGxlbWVudGUgbG8gaW5zdGFsYSwgeSBsbyBzZWxlY2Npb25hIGVuIGxhcyBwcmVmZXJlY2lhcyBkZSBsYSBhZG1pbmlzdHJhY2kmYW1wO29hY3V0ZTtuLiBOb3RlIHF1ZSwgc2kgdXN0ZWQgdXNhIENNU21zIDEuMSBvIHN1cGVyaW9yIGEgZXN0ZSB1c3RlZCBwdWVkZSBzZWxlY2Npb25hciBDb2RlTWlycm9yIGp1bnRvIGNvbiBXWVNJV1lHIHBhcmEgZWwgcmVzYWx0YWRvIGRlIHNpbnRheGlzLic7CiRsYW5nWydxY2EnXSA9ICdQMC0yMDk2MDU0MzcwLTEyNTk4MDM2MTU5MzknOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4yMzg2MDY4NTQuMTI1OTgwNDM2OC4xMjY3NjUyNDU5LjEyNjc2NTk3NzMuNTcnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjY3NjUyNDU5LjU2LjI4LnV0bWNjbj0ocmVmZXJyYWwpfHV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY3Q9L2luZGV4LnBocC90b3BpYywxOTkyOS4wLmh0bWx8dXRtY21kPXJlZmVycmFsJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRldXIgZGUgc3ludGF4ZSBjb2xvciZlYWN1dGU7IENvZGVNaXJyb3InOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdMZSBtb2R1bGUgQ29kZU1pcnJvciBhICZlYWN1dGU7dCZlYWN1dGU7IGluc3RhbGwmZWFjdXRlOyBhdmVjIHN1Y2MmZWdyYXZlO3MnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtWb3VzIGF2ZXogYmVzb2luIGRlIGwmIzAzOTthdXRvcmlzYXRpb24gJiMwMzk7JXMmIzAzOTsgIHBvdXIgY2V0dGUgZm9uY3Rpb24nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdQYXJhbSZlZ3JhdmU7dHJlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYXV2ZWdhcmRlciBsZXMgcGFyYW0mZWdyYXZlO3RyZXMnOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ1BhcmFtJmVncmF2ZTt0cmVzIHNhdXZlZ2FyZCZlYWN1dGU7cyc7CiRsYW5nWydodG1sdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBIVE1MICc7CiRsYW5nWydjc3N0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIENTUyAnOwokbGFuZ1sncGhwdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBQSFAnOwokbGFuZ1snanN0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIEphdmFTY3JpcHQnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnQWZmaWNoZXIgbGUgbm9tYnJlIGRlIGxpZ25lcyc7CiRsYW5nWydhbGxvd2Z1bGxzY3JlZW4nXSA9ICdBdXRvcmlzZXIgbGUgbW9kZSBwbGVpbiAmZWFjdXRlO2NyYW4gKEYxMSknOwokbGFuZ1snYXV0b21hdGNocGFyZW5zJ10gPSAnQWZmaWNoZXIgbGVzIGNvcnJlc3BvbmRhbmNlcyBkZSBwYXJlbnRoJmVncmF2ZTtzZXMnOwokbGFuZ1sndGFiaGFuZGxpbmcnXSA9ICdDb21tZW50IGcmZWFjdXRlO3JlciBsZSBjbGljIHN1ciBsYSB0b3VjaGUgVEFCJzsKJGxhbmdbJ3RhYmRlZmF1bHQnXSA9ICdMYWlzc2VyIGxlIG5hdmlnYXRldXIgZCZlYWN1dGU7Y2lkZXInOwokbGFuZ1sndGFiaW5kZW50J10gPSAnSW5kZW50ZXInOwokbGFuZ1sndGFic3BhY2VzJ10gPSAnSW5zJmVhY3V0ZTtyZXIgZGVzIGVzcGFjZXMnOwokbGFuZ1sndGFic2hpZnQnXSA9ICdTaGlmdCB2ZXJzIGxhIGRyb2l0ZSwgc2hpZnQtVEFCIHNoaWZ0cyB2ZXJzIGxhIGdhdWNoZSc7CiRsYW5nWyd0YWJzaXplJ10gPSAnVGFpbGxlIGRlcyBvbmdsZXRzJzsKJGxhbmdbJ2Nzc2FkZGl0aW9ucyddID0gJ0Fqb3V0cyAmYWdyYXZlOyBsYSBmZXVpbGxlIGRlIHN0eWxlIGRlIENvZGVNaXJyb3IuJzsKJGxhbmdbJ3RoZW1lJ10gPSAnVGgmZWdyYXZlO21lJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPlF1ZSBmYWl0IGNlIG1vZHVsZSZuYnNwOz88L3N0cm9uZz4NCjxici8+DQpMZSBtb2R1bGUgQ29kZU1pcnJvciB2b3VzIHBlcm1ldCBkZSBtb2RpZmllciBsZSBjb250ZW51LCBsZXMgZ2FiYXJpdHMgZXQgbGVzIGZldWlsbGVzIGRlIHN0eWxlIGVuIHV0aWxpc2FudCB1biAmZWFjdXRlO2RpdGV1ciBkZSBzeW50YXhlIGNvbG9yJmVhY3V0ZTsgbCYjMDM5O2ludCZlYWN1dGU7cmlldXIgZGUgdm90cmUgbmF2aWdhdGV1ci4gDQpJbCBwZXV0IGF1c3NpIGJpZW4gcmVtcGxhY2VyIGwmIzAzOTsmZWFjdXRlO2RpdGV1ciBXWVNJV1lHLCBldCBwZXJtZXR0cmUgZGUgdmlzdWFsaXNlci0mZWFjdXRlO2RpdGVyIGxlcyBnYWJhcml0cywgZmV1aWxsZXMgZGUgc3R5bGUuIChVbmlxdWVtZW50IHBvdXIgdmVyc2lvbiBDTVNNUyAxLjEgb3UgcGx1cykNCjxici8+PGJyLz4NCjxzdHJvbmc+Q29tbWVudCBsJiMwMzk7dXRpbGlzZXImbmJzcDs/PC9zdHJvbmc+PGJyLz4NCklsIHZvdXMgc3VmZml0IGRlIGwmIzAzOTtpbnN0YWxsZXIsIGV0IGRhbnMgJnF1b3Q7TWVzIHByJmVhY3V0ZTtmJmVhY3V0ZTtyZW5jZXMgLyBQciZlYWN1dGU7ZiZlYWN1dGU7cmVuY2VzIGRlIGwmIzAzOTt1dGlsaXNhdGV1ciZxdW90OyBjaG9pc2lyIGF2ZWMgbGUgbWVudSBkJmVhY3V0ZTtyb3VsYW50IENvZGVNaXJyb3IgZGFucyAmcXVvdDtTJmVhY3V0ZTtsZWN0aW9ubmVyIGxhIHN5bnRheGUgc3VybGlnbiZlYWN1dGU7ZSZxdW90OyBldC9vdSAmZWFjdXRlO3ZlbnR1ZWxsZW1lbnQgZGFucyAmcXVvdDtTJmVhY3V0ZTtsZWN0aW9uIGR1IFdZU0lXWUcgJmFncmF2ZTsgdXRpbGlzZXImcXVvdDsuDQonOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGFrc2ZyZW1oZXZpbmdzcmVkaWdlcmVyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQ29kZU1pcnJvciBtb2R1bGVuIGJsZSBpbnN0YWxsZXJ0JzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnRHUgdHJlbmdlciAmIzAzOTslcyYjMDM5OyB0aWxsYXRlbHNlIGZvciAmYXJpbmc7IHV0ZiZvc2xhc2g7cmUgZGVubmUgZnVua3Nqb25lbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbm5zdGlsbGluZ2VyJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ0xhZ3JlIGlubnN0aWxsaW5nZXInOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0lubnN0aWxsaW5nZXIgbGFncmV0JzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAnSFRNTCBzeW50YWtzIHRlc3QnOwokbGFuZ1snY3NzdGVzdCddID0gJ0NTUyBzeW50YWtzIHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YWtzIHRlc3QnOwokbGFuZ1snanN0ZXN0J10gPSAnSmF2YVNjcmlwdCBzeW50YWtzdGVzdCc7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdWaXMgbGluamVudW1tZXInOwokbGFuZ1snYWxsb3dmdWxsc2NyZWVuJ10gPSAnVGlsbGF0IGZ1bGxza2plcm1zbW9kdXMgKEYxMSknOwokbGFuZ1snYXV0b21hdGNocGFyZW5zJ10gPSAnQXV0b21hdGlza2UgcGFyYW50ZXNlcic7CiRsYW5nWyd0YWJoYW5kbGluZyddID0gJ0h2b3JkYW4gc2thbCB0cnlrayBhdiBUQUItdGFzdGVuIGgmYXJpbmc7bnRlcmVzJzsKJGxhbmdbJ3RhYmRlZmF1bHQnXSA9ICdMYSBuZXR0bGVzZXJlbiBhdmdqJm9zbGFzaDtyZSc7CiRsYW5nWyd0YWJpbmRlbnQnXSA9ICdMYWcgaW5ucnlrayc7CiRsYW5nWyd0YWJzcGFjZXMnXSA9ICdTZXR0IGlubiBtZWxsb21yb20nOwokbGFuZ1sndGFic2hpZnQnXSA9ICdTaGlmdCB0aWwgaCZvc2xhc2g7eXJlLCBzaGlmdC1UQUIgc2VuZGVyIHRpbCB2ZW5zdHJlJzsKJGxhbmdbJ3RhYnNpemUnXSA9ICdTdCZvc2xhc2g7cnJlbHNlIHAmYXJpbmc7IGZhbmVyJzsKJGxhbmdbJ2Nzc2FkZGl0aW9ucyddID0gJ0NvZGVNaXJyb3ItY3NzIHRpbGxlZ2cuJzsKJGxhbmdbJ3RoZW1lJ10gPSAnVGVtYSc7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZUFyZWEgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3FjYSddID0gJ1AwLTUzNjg0OTExNS0xMzA3OTgzNDk1MjEwJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuNDU2NjkwNzEzLjEzNDc2MzY1MTUuMTM0Nzc0Nzk4MC4xMzQ3NzkyNjg1LjQnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzQ3NjM2NTE1LjEuMS51dG1jc3I9KGRpcmVjdCl8dXRtY2NuPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEzNDc3OTI2ODUnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgU3ludGF4aGlnaGxpZ2h0aW5nIEVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0RlIENvZGVNaXJyb3IgTW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ1UgaGVlZnQgJiMwMzk7JXMmIzAzOTsgcmVjaHRlbiBub2RpZyBvbSBkZXplIGZ1bmN0aWUgdGUgZ2VicnVpa2VuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0luc3RlbGxpbmdlbic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdJbnN0ZWxsaW5nZW4gb3BzbGFhbic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5zdGVsbGluZ2VuIG9wZ2VzbGFnZW4nOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIFN5bnRheCBUZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MgU3ludGF4IFRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBTeW50YXggVGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0IFN5bnRheCBUZXN0JzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1JlZ2VsbnVtbWVycyB0b25lbic7CiRsYW5nWydhbGxvd2Z1bGxzY3JlZW4nXSA9ICdTdGEgZnVsbHNjcmVlbiBtb2R1cyB0b2UgKEYxMSknOwokbGFuZ1snYXV0b21hdGNocGFyZW5zJ10gPSAnQXV0b21hdGlzY2ggYmlqIGVsa2FhciBob3JlbmRlIHRhZ3Mga2xldXJlbic7CiRsYW5nWyd0YWJoYW5kbGluZyddID0gJ1dhdCB0ZSBkb2VuIGJpaiBoZXQgaW5kcnVra2VuIHZhbiBUQUIgdG9ldHMnOwokbGFuZ1sndGFiZGVmYXVsdCddID0gJ0xhYXQgZGUgYnJvd3NlciBoZXQgYmVwYWxlbic7CiRsYW5nWyd0YWJpbmRlbnQnXSA9ICdNYWFrIHJlZ2VsIGluc3ByaW5naW5nJzsKJGxhbmdbJ3RhYnNwYWNlcyddID0gJ1ZvZWcgc3BhdGllcyB0b2UnOwokbGFuZ1sndGFic2hpZnQnXSA9ICdWZXJwbGFhdHN0IG5hYXIgcmVjaHRzLCBzaGlmdC1UQUIgdmVycGxhYXRzdCBuYWFyIGxpbmtzJzsKJGxhbmdbJ3RhYnNpemUnXSA9ICdBZm1ldGluZ2VuIHZhbiBkZSB0YWJzJzsKJGxhbmdbJ2Nzc2FkZGl0aW9ucyddID0gJ0FhbnBhc3NpbmdlbiBhYW4gZGUgQ29kZU1pcnJvci1jc3MuJzsKJGxhbmdbJ3RoZW1lJ10gPSAnVGhlbWUgJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz8gPC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZUFyZWEgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3FjYSddID0gJ1AwLTIzNTc2ODgzOC0xMzE4ODU5OTM1NzY1JzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuNjc0Mjg5OTc4LjEzMjcyNTgyMTcuMTMyNzI1ODIxNy4xMzI3MjU4MjE3LjEnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzI3MjU4MjE3LjEuMS51dG1jY249KGRpcmVjdCl8dXRtY3NyPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ro_RO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvcnVsIENvZGVNaXJyb3IgY3UgZXZpZGVudGlhdG9yIGRlIHNpbnRheGEnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdNb2R1bHVsIENvZGVNaXJyb3IgYSBmb3N0IGluc3RhbGF0IGN1IHN1Y2Nlcyc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ0F2ZXRpIG5ldm9pZSBkZSBwZXJtaXNpdW5lYSAmIzAzOTslcyYjMDM5OyBwZW50cnUgYWNlYXN0YSBmdW5jdGllLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ1NldGFyaSc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXJlIHNldGFyaSc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnU2V0YXJpbGUgYXUgZm9zdCBzYWx2YXRlJzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAndGVzdCBzaW50YXhhIEhUTUwnOwokbGFuZ1snY3NzdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBDU1MnOwokbGFuZ1sncGhwdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBQSFAnOwokbGFuZ1snanN0ZXN0J10gPSAndGVzdCBzaW50YXhhIEphdmFTY3JpcHQnOwokbGFuZ1snZXhhbXBsZXN5bnRheCddID0gJ1N5bnRheCB0byB0ZXN0IGN1JzsKJGxhbmdbJ2NoYW5nZSddID0gJ1NjaGltYmEnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnQWZpc2FyZSBudW1lcmUgZGUgbGluaWUnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnU3RyYW5nZSBsaW5paWxlIGx1bmdpJzsKJGxhbmdbJ2F1dG9tYXRjaHBhcmVucyddID0gJ0F1dG9wb3RyaXZpcmUgcGFyYW50ZXplJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPkNlIGZhY2UgYWNlc3QgbW9kdWw/PC9zdHJvbmc+DQo8YnIvPg0KTW9kdWx1bCBDb2RlTWlycm9yIHZhIHBlcm1pdGUgc2EgZWRpdGF0aSBjb250aW51dCwgdGVtcGxhdGUtdXJpIHNpIHN0eWxlc2hlZXQtdXJpIGZvbG9zaW5kIHVuIGVkaXRvciBjdSBldmlkZW50aWF0b3IgZGUgc2ludGF4YSBkaW4gYnJvd3Nlci4NClBvYXRlIGlubG9jdWkgYXRhdCB1biBtb2R1bCB3eXNpd3lnLCBzaSBzYSBmdW5jdGlvbmV6ZSBkZSBzaW5lIHN0YXRhdG9yIHBlbnRydSBlZGl0YXJlIGRlIHRlbXBsYXRlL3N0eWxlc2hlZXQuDQo8YnIvPjxici8+DQo8c3Ryb25nPkN1bSBzZSBmb2xvc2VzZSBhY2VzdCBtb2R1bD88L3N0cm9uZz4NCkluc3RhbGF0aS1sLCBzaSBhbGVnZXRpLWwgaW4gcHJlZmVyaW50ZWxlIGRlIHV0aWxpemF0b3IgZGluIGFkbWluLic7CiRsYW5nWydxY2EnXSA9ICdQMC0xODM4MjE1MDQzLTEyODI4MDc1MzM5MzQnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjgyODA3OTcyLjEuMi51dG1jc3I9Z29vZ2xlfHV0bWNjbj0ob3JnYW5pYyl8dXRtY21kPW9yZ2FuaWN8dXRtY3RyPWNtc21zJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMTE5MTg3MzgxNy4xMjgyODA3NTM0LjEyODI4MDc1MzQuMTI4MjgwNzUzNC4xJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xMi45LjEyODI4MDc2MTUzNjgnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sv_SE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3ItbW9kdWxlbiBpbnN0YWxsZXJhZGVzIHV0YW4gbiZhcmluZztncmEgcHJvYmxlbSc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJyYjMDM5O1lvdSBuZWVkIHRoZSAmIzAzOTslcyYjMDM5OyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXInOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnU3BhcmEgaW5zdCZhdW1sO2xsbmluZ2FyJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXIgc3BhcmFkZXMnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGF4IHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YXggdGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0IHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YXggYXR0IHRlc3RhIG1lZCc7CiRsYW5nWydjaGFuZ2UnXSA9ICcmQXVtbDtuZHJhLi4uJzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1Zpc2EgcmFkbnVtbWVyJzsKJGxhbmdbJ3RleHR3cmFwcGluZyddID0gJ1dyYXAgbG9uZyBsaW5lcyc7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZUFyZWEgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3FjYSddID0gJ1AwLTEyMzE4NzIzMjUtMTI2OTM1OTMyMTE5NSc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjEyNjk3Nzc2MDMuMTI2OTM1OTM0Mi4xMjY5MzU5MzQyLjEyNjkzNTkzNDIuMSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjEuMTAuMTI2OTM1OTM0Mic7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI2OTM1OTM0Mi4xLjEudXRtY3NyPWdvb2dsZXx1dG1jY249KG9yZ2FuaWMpfHV0bWNtZD1vcmdhbmljfHV0bWN0cj1jbXNtcyc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGV4aXQ7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsMSk7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInVzZWF1dG9jb21wbGV0ZSIsMSk7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoImF1dG9tYXRjaHBhcmVucyIsMCkKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiY21zbXMiKSkgZXhpdDsKICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiY21zbXMiKSkgZXhpdDsKICAvL1JlbW92ZSBvbGQgc3BlY2lmaWsgcGVybWlzc2lvbgogICR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCJtb2RpZnllZGl0YXJlYXNldHRpbmdzIik7Cj8+]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIDxsaT4zLjAuMCAtIFVwZGF0ZWQgdG8gQ01TIDMuMC1maW5hbC4gUG9zc2libGUgZml4IHRvIGFkbWlucyBvbiBodHRwcy4gRml4ZWQgc28gdGhhdCBlZGl0aW5nIFVEVCdzIGFyZSBnZXR0aW5nIGhpZ2hsaWdodGVkPC9saT4KICA8bGk+Mi4zLjIgLSBVcGRhdGVkIHRvIENNIDIuMzEoPC9saT4KICA8bGk+Mi4zLjEgLSBBcHBseS1idXR0b24gaW4gZWRpdCBjc3MgYXJlIGZpeGVkLCB0ZW1wbGF0ZXMgc3RpbGwgaGF2ZSBjb3JlIGJ1ZyA6KDwvbGk+CiAgPGxpPjIuMy4wIC0gUmVpbXBsZW1lbnRlZCBsaW5ld3JhcHBpbmcsIGF1dG9tYXRlZCB0aGVtZSBkZXRlY3Rpb248L2xpPgogIDxsaT4yLjIuMyAtIFVwZGF0ZWQgdG8gQ00gMi4yLjM8L2xpPgogIDxsaT4yLjIuMiAtIFVwZGF0ZWQgdG8gQ00gMi4yLjE8L2xpPgogIDxsaT4yLjIuMSAtIFVwZGF0ZWQgdG8gQ00gMi4yLjAsIGFkZGVkIHRhYi13aWR0aCBzZXR0aW5nPC9saT4KICA8bGk+Mi4yLjAgLSBVcGRhdGVkIHRvIENNIDIuMTUsIGFkZGVkIG9wdGlvbmFsIGZ1bGxzY3JlZW4gbW9kZTwvbGk+CiAgPGxpPjIuMS4yIC0gVXBkYXRlZCB0byBDTSAyLjEyLCBjbGVhbmVyIHdheSBvZiBzYXZpbmcgZWRpdG9yIGNvbnRlbnQgdG8gdGV4dGFyZWE8L2xpPgogIDxsaT4yLjEuMCAtIFVwZGF0ZWQgdG8gQ00gMi4xLjEsIG9uY2UgYWdhaW4gY2hhbmdlIHRlc3Rtb2RlLi4uIDwvbGk+CiAgPGxpPjIuMC4xIC0gVXBkYXRlZCB0byBDTSAyLjAuMTwvbGk+CiAgPGxpPjIuMCAtIFVwZGF0ZWQgdG8gQ00gMi4wIGFuZCByZXdvcmtlZCBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcgdG8gbWFrZSB0aGlzIHdvcms8L2xpPgogIDxsaT4wLjEuOSAtIFVwZGF0ZWQgdG8gQ00gMC45MzwvbGk+CiAgPGxpPjAuMS44IC0gVXBkYXRlZCB0byBDTSAwLjksIGFkZGVkIG9wdGlvbiBvbiBob3cgdG8gaGFuZGxlIFRBQjwvbGk+CiAgPGxpPjAuMS43IC0gVXBkYXRlZCB0byBDTSAwLjgwPC9saT4KICA8bGk+MC4xLjYgLSBVcGRhdGVkIHRvIENNIDAuNzAsIEFkZGVkIG9wdGlvbiB0byBtYXRjaCBwYXJlbnRoZXNpczwvbGk+CiAgPGxpPjAuMS41IC0gVXBkYXRlZCB0byBDTSAwLjY2LCByZW1vdmVkIGEgc3RyYW5nZSBcbiBjaGFyIGZyb20gaGVhZGVyb3V0cHV0LCBtYWRlIHRhYmJpbmcgd29yazwvbGk+CiAgPGxpPjAuMS40IC0gRml4ZWQgQ1BVIGhvZ2dpbmcgcHJvYmxlbXMgYnkgcmV3cml0aW5nIHRlc3RhcmVhLWNvZGU8L2xpPgogIDxsaT4wLjEuMyAtIFVwZGF0ZWQgdG8gQ00gMC42NSwgYWRkZWQgb3B0aW9uIHRvIHRvZ2dsZSB3b3Jkd3JhcDwvbGk+CiAgPGxpPjAuMS4yIC0gVXBkYXRlZCB0byBDTSAwLjYzPC9saT4KICA8bGk+MC4xLjEgLSBVcGRhdGVkIHRvIENNIDAuNjIsIGZpeGVkIGV4YW1wbGVzIGFuZCBwcm9iYWJseSBmdW5jdGlvbmFsaXR5IGFzIHdlbGw8L2xpPgogIDxsaT4wLjEuMCAtIEluaXRpYWwgcmVsZWFzZSA8L2xpPgo8L3VsPg==]]></data>
	</file>
	<file>
	  <filename>/templates/codemirror2area.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjazsiID4KPHRleHRhcmVhIGlkPSJ7JHRleHRhcmVhaWR9IiBuYW1lPSJ7JHRleHRhcmVhbmFtZX0iPnskY29udGVudH08L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCiAgdmFyIHskdGV4dGFyZWFpZH0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneyR0ZXh0YXJlYWlkfScpOwogIHZhciBjb2RlbWlycm9yZWRpdG9yeyRpZH0gPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSh7JHRleHRhcmVhaWR9LCB7bGl0ZXJhbH17ey9saXRlcmFsfQoKICAgIG1vZGUgOiAneyRtb2RlfScsCiAgICBpbmRlbnRVbml0IDogeyR0YWJzaXplfSwKICAgIGxpbmVOdW1iZXJzOiB7JGxpbmVudW1iZXJzfSwKICAgIGxpbmVXcmFwcGluZzogeyR0ZXh0d3JhcHBpbmd9LAoKICAgIHRhYk1vZGUgOiAneyR0YWJoYW5kbGluZ30nLAogICAgdGhlbWUgOiAneyR0aGVtZX0nLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogIHtpZiAkYWxsb3dmdWxsc2NyZWVuPT0nMSd9CiAge2xpdGVyYWx9CiAgLG9uS2V5RXZlbnQ6IGZ1bmN0aW9uKGksIGUpIHsKCiAgICAgICAgICAgIGlmICgoZS5rZXlDb2RlID09IDEyMiB8fCBlLmtleUNvZGUgPT0gMjcpICYmIGUudHlwZSA9PSAna2V5ZG93bicpIHsKICAgICAgICAgICAgICBlLnN0b3AoKTsKICAgICAgICAgICAgICByZXR1cm4gdG9nZ2xlRnVsbHNjcmVlbkVkaXRpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogIHsvbGl0ZXJhbH0KICB7L2lmfQoKICB7bGl0ZXJhbH19KTt7L2xpdGVyYWx9Cjwvc2NyaXB0PgoK]]></data>
	</file>
	<file>
	  <filename>/templates/codemirror3area.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjazsiID4NCiAgICA8dGV4dGFyZWEgaWQ9InskdGV4dGFyZWFpZH0iIG5hbWU9InskdGV4dGFyZWFuYW1lfSI+eyRjb250ZW50fTwvdGV4dGFyZWE+DQo8L2Rpdj4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KDQogICAgdmFyIHskdGV4dGFyZWFpZH0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneyR0ZXh0YXJlYWlkfScpOw0KICAgIHZhciBjb2RlbWlycm9yZWRpdG9yeyRpZH0gPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSh7JHRleHRhcmVhaWR9LCB7bGl0ZXJhbH17ey9saXRlcmFsfQ0KDQogICAgICAgIG1vZGUgOiAneyRtb2RlfScsDQogICAgICAgIGluZGVudFVuaXQgOiB7JHRhYnNpemV9LA0KICAgICAgICBsaW5lTnVtYmVyczogeyRsaW5lbnVtYmVyc30sDQogICAgICAgIGxpbmVXcmFwcGluZzogeyR0ZXh0d3JhcHBpbmd9LA0KDQogICAgICAgIHRhYk1vZGUgOiAneyR0YWJoYW5kbGluZ30nLA0KICAgICAgICB0aGVtZSA6ICd7JHRoZW1lfScsDQogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUNCiAgICB7KmlmICRhbGxvd2Z1bGxzY3JlZW49PScxJ30NCiAgICAgICAge2xpdGVyYWx9DQogICAgICAgICAgICAsb25LZXlFdmVudDogZnVuY3Rpb24oaSwgZSkgew0KDQogICAgICAgICAgICBpZiAoKGUua2V5Q29kZSA9PSAxMjIgfHwgZS5rZXlDb2RlID09IDI3KSAmJiBlLnR5cGUgPT0gJ2tleWRvd24nKSB7DQogICAgICAgICAgICAgICAgZS5zdG9wKCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRvZ2dsZUZ1bGxzY3JlZW5FZGl0aW5nKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgey9saXRlcmFsfQ0KICAgIHsvaWYqfQ0KDQogICAge2xpdGVyYWx9fSk7ey9saXRlcmFsfQ0KPC9zY3JpcHQ+DQoNCg==]]></data>
	</file>
	<file>
	  <filename>/templates/settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHNob3dsaW5lbnVtYmVyc3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc2hvd2xpbmVudW1iZXJzaW5wdXR9PC9wPgoJPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRhbGxvd2Z1bGxzY3JlZW50ZXh0fTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGFsbG93ZnVsbHNjcmVlbmlucHV0fTwvcD4KCTwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0ZXh0d3JhcHBpbmd0ZXh0fTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JHRleHR3cmFwcGluZ2lucHV0fTwvcD4KCTwvZGl2Pgp7KgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGF1dG9tYXRjaHBhcmVuc3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskYXV0b21hdGNocGFyZW5zaW5wdXR9PC9wPgoJPC9kaXY+Cip9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskdGFiaGFuZGxpbmd0ZXh0fTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JHRhYmhhbmRsaW5naW5wdXR9PC9wPgoJPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskdGFic2l6ZXRleHR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0YWJzaXplaW5wdXR9PC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGNzc2FkZGl0aW9uc3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskY3NzYWRkaXRpb25zaW5wdXR9PC9wPgoJPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aGVtZXRleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGhlbWVpbnB1dH08L3A+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc3VibWl0fTwvcD4KCTwvZGl2Pgp7JGVuZGZvcm19Cg==]]></data>
	</file>
</module>
